<?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>99314</bug_id>
          
          <creation_ts>2012-10-15 05:53:23 -0700</creation_ts>
          <short_desc>[Qt] Separate Qt WebKit into Qt WebKit and Qt WebKit Widgets</short_desc>
          <delta_ts>2012-11-30 07:32:30 -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>WebKit Qt</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>88162</dependson>
    
    <dependson>102800</dependson>
          <blocked>76773</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Simon Hausmann">hausmann</reporter>
          <assigned_to name="Simon Hausmann">hausmann</assigned_to>
          <cc>abarth</cc>
    
    <cc>abecsi</cc>
    
    <cc>benjamin</cc>
    
    <cc>cmarcelo</cc>
    
    <cc>dpranke</cc>
    
    <cc>eric.carlson</cc>
    
    <cc>feature-media-reviews</cc>
    
    <cc>levin</cc>
    
    <cc>menard</cc>
    
    <cc>ojan</cc>
    
    <cc>ossy</cc>
    
    <cc>vestbo</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>741977</commentid>
    <comment_count>0</comment_count>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2012-10-15 05:53:23 -0700</bug_when>
    <thetext>This bug tracks the remainder of bug #88162 to complete the separation of QtWebKit into QtWebKit and QtWebKitWidgets shared libraries.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>778935</commentid>
    <comment_count>1</comment_count>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2012-11-29 05:17:47 -0800</bug_when>
    <thetext>*** Bug 76775 has been marked as a duplicate of this bug. ***</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>779043</commentid>
    <comment_count>2</comment_count>
      <attachid>176743</attachid>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2012-11-29 08:50:43 -0800</bug_when>
    <thetext>Created attachment 176743
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>779051</commentid>
    <comment_count>3</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-11-29 08:56:45 -0800</bug_when>
    <thetext>Attachment 176743 did not pass style-queue:

Source/WebKit/qt/WidgetApi/qwebpage.h:21:  #ifndef header guard has wrong style, please use: qwebpage_h  [build/header_guard] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:24:  Alphabetical sorting problem.  [build/include_order] [4]
Source/WebKit/qt/WidgetApi/qwebpage.h:56:  Code inside a namespace should not be indented.  [whitespace/indent] [4]
Source/WebKit/qt/WidgetApi/qwebpage.h:258:  The parameter name &quot;view&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:266:  The parameter name &quot;manager&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:269:  The parameter name &quot;factory&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:280:  The parameter name &quot;action&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:282:  The parameter name &quot;action&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:285:  The parameter name &quot;size&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:289:  The parameter name &quot;size&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:290:  The parameter name &quot;rect&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:299:  The parameter name &quot;forward&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:302:  The parameter name &quot;policy&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:305:  The parameter name &quot;palette&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:308:  The parameter name &quot;editable&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:312:  The parameter name &quot;event&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:318:  The parameter name &quot;frame&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:318:  The parameter name &quot;feature&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:318:  The parameter name &quot;policy&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:328:  Missing space inside { }.  [whitespace/braces] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:330:  Missing space inside { }.  [whitespace/braces] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:355:  Missing space inside { }.  [whitespace/braces] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:363:  The parameter name &quot;extension&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:363:  The parameter name &quot;option&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:364:  The parameter name &quot;extension&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:378:  The parameter name &quot;frame&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:383:  The parameter name &quot;frame&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:384:  The parameter name &quot;url&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:390:  The parameter name &quot;reply&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:391:  The parameter name &quot;request&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:395:  The parameter name &quot;frame&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:396:  The parameter name &quot;origin&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:398:  The parameter name &quot;frame&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:398:  The parameter name &quot;item&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:399:  The parameter name &quot;frame&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:403:  The parameter name &quot;frame&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:403:  The parameter name &quot;feature&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:404:  The parameter name &quot;frame&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:404:  The parameter name &quot;feature&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:407:  The parameter name &quot;type&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:408:  The parameter name &quot;url&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:410:  The parameter name &quot;frame&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:410:  The parameter name &quot;request&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:410:  The parameter name &quot;type&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:417:  The parameter name &quot;url&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebview.h:21:  #ifndef header guard has wrong style, please use: qwebview_h  [build/header_guard] [5]
Source/WebKit/qt/WidgetApi/qwebview.h:26:  Alphabetical sorting problem.  [build/include_order] [4]
Source/WebKit/qt/WidgetApi/qwebview.h:28:  Alphabetical sorting problem.  [build/include_order] [4]
Source/WebKit/qt/WidgetApi/qwebview.h:50:  Should have a space between // and comment  [whitespace/comments] [4]
Source/WebKit/qt/WidgetApi/qwebview.h:61:  The parameter name &quot;page&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebview.h:63:  The parameter name &quot;url&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebview.h:64:  The parameter name &quot;request&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebview.h:64:  The parameter name &quot;operation&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebview.h:72:  The parameter name &quot;url&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebview.h:81:  The parameter name &quot;action&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebview.h:83:  The parameter name &quot;action&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebview.h:98:  The parameter name &quot;factor&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebview.h:104:  The parameter name &quot;hints&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebview.h:105:  The parameter name &quot;hint&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebview.h:134:  The parameter name &quot;type&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WebCoreSupport/QtPrintContext.cpp:43:  More than one command on the same line  [whitespace/newline] [4]
Source/WebKit/qt/WidgetApi/qwebframe_p.h:21:  #ifndef header guard has wrong style, please use: qwebframe_p_h  [build/header_guard] [5]
Source/WebKit/qt/WidgetApi/qwebframe_p.h:31:  Code inside a namespace should not be indented.  [whitespace/indent] [4]
Source/WebKit/qt/WidgetApi/qwebframe_p.h:44:  Missing space inside { }.  [whitespace/braces] [5]
Source/WebKit/qt/WidgetApi/qwebinspector.h:20:  #ifndef header guard has wrong style, please use: qwebinspector_h  [build/header_guard] [5]
Source/WebKit/qt/WidgetApi/qwebinspector.h:36:  The parameter name &quot;page&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebinspector.h:43:  The parameter name &quot;event&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebinspector.h:44:  The parameter name &quot;event&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebinspector.h:45:  The parameter name &quot;event&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebinspector.h:46:  The parameter name &quot;event&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qgraphicswebview.h:20:  #ifndef header guard has wrong style, please use: qgraphicswebview_h  [build/header_guard] [5]
Source/WebKit/qt/WidgetApi/qgraphicswebview.h:26:  Alphabetical sorting problem.  [build/include_order] [4]
Source/WebKit/qt/WidgetApi/qgraphicswebview.h:74:  The parameter name &quot;url&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qgraphicswebview.h:75:  The parameter name &quot;request&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qgraphicswebview.h:75:  The parameter name &quot;operation&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qgraphicswebview.h:84:  The parameter name &quot;action&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qgraphicswebview.h:85:  The parameter name &quot;action&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qgraphicswebview.h:93:  The parameter name &quot;frozen&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qgraphicswebview.h:95:  The parameter name &quot;rect&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qgraphicswebview.h:97:  The parameter name &quot;widget&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qgraphicswebview.h:98:  The parameter name &quot;change&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qgraphicswebview.h:103:  The parameter name &quot;query&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WebCoreSupport/QWebFrameAdapter.cpp:33:  Alphabetical sorting problem.  [build/include_order] [4]
Source/WebKit/qt/WebCoreSupport/QWebFrameAdapter.cpp:40:  Alphabetical sorting problem.  [build/include_order] [4]
Source/WebKit/qt/WebCoreSupport/QWebFrameAdapter.cpp:44:  Alphabetical sorting problem.  [build/include_order] [4]
Source/WebKit/qt/WebCoreSupport/QWebFrameAdapter.cpp:53:  Alphabetical sorting problem.  [build/include_order] [4]
Source/WebKit/qt/WebCoreSupport/QWebFrameAdapter.cpp:197:  Declaration has space between type name and * in ScriptController *proxy  [whitespace/declaration] [3]
Source/WebKit/qt/WebCoreSupport/QWebFrameAdapter.cpp:234:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebKit/qt/WebCoreSupport/QWebFrameAdapter.cpp:252:  Declaration has space between type name and * in Element *documentElement  [whitespace/declaration] [3]
Source/WebKit/qt/WebCoreSupport/QWebFrameAdapter.cpp:288:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebKit/qt/WebCoreSupport/QWebFrameAdapter.cpp:318:  Declaration has space between type name and * in FrameView *view  [whitespace/declaration] [3]
Source/WebKit/qt/WebCoreSupport/QWebFrameAdapter.cpp:379:  Declaration has space between type name and * in QWebHitTestResultPrivate *QWebFrameAdapter  [whitespace/declaration] [3]
Source/WebKit/qt/WebCoreSupport/QWebFrameAdapter.cpp:393:  Declaration has space between type name and * in Document *doc  [whitespace/declaration] [3]
Source/WebKit/qt/WebCoreSupport/QWebFrameAdapter.cpp:462:  Omit int when using unsigned  [runtime/unsigned] [1]
Source/WebKit/qt/WebCoreSupport/QWebFrameAdapter.cpp:682:  Declaration has space between type name and * in FrameTree *tree  [whitespace/declaration] [3]
Source/WebKit/qt/WebCoreSupport/QWebFrameAdapter.cpp:684:  Declaration has space between type name and * in FrameLoader *loader  [whitespace/declaration] [3]
Source/WebKit/qt/WebCoreSupport/QWebFrameAdapter.cpp:725:  Declaration has space between type name and * in FrameView *view  [whitespace/declaration] [3]
Source/WebKit/qt/WebCoreSupport/QWebFrameAdapter.cpp:739:  Declaration has space between type name and * in Scrollbar *sb  [whitespace/declaration] [3]
Source/WebKit/qt/WebCoreSupport/QWebFrameAdapter.cpp:752:  Declaration has space between type name and * in Scrollbar *sb  [whitespace/declaration] [3]
Source/WebKit/qt/WebCoreSupport/QWebFrameAdapter.cpp:761:  Declaration has space between type name and * in Scrollbar *sb  [whitespace/declaration] [3]
Source/WebKit/qt/WebCoreSupport/QWebFrameAdapter.cpp:770:  Declaration has space between type name and * in Scrollbar *sb  [whitespace/declaration] [3]
Source/WebKit/qt/WebCoreSupport/QWebFrameAdapter.cpp:795:  Missing space after ,  [whitespace/comma] [3]
Source/WebKit/qt/WebCoreSupport/QWebFrameAdapter.cpp:828:  Declaration has space between type name and * in QPixmap *pix  [whitespace/declaration] [3]
Source/WebKit/qt/WebCoreSupport/QWebFrameAdapter.cpp:911:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebKit/qt/WebCoreSupport/QWebFrameAdapter.cpp:912:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebKit/qt/WebCoreSupport/QWebFrameAdapter.cpp:913:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebKit/qt/WebCoreSupport/TextureMapperLayerClientQt.h:29:  wtf includes should be &lt;wtf/file.h&gt; instead of &quot;wtf/file.h&quot;.  [build/include] [4]
Source/WebKit/qt/WebCoreSupport/TextureMapperLayerClientQt.h:45:  The parameter name &quot;layer&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qgraphicswebview.cpp:29:  Alphabetical sorting problem.  [build/include_order] [4]
Source/WebKit/qt/WidgetApi/qgraphicswebview.cpp:36:  Alphabetical sorting problem.  [build/include_order] [4]
Source/WebKit/qt/WidgetApi/qgraphicswebview.cpp:54:  Missing space inside { }.  [whitespace/braces] [5]
Source/WebKit/qt/WidgetApi/qgraphicswebview.cpp:119:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebKit/qt/WidgetApi/qgraphicswebview.cpp:290:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebKit/qt/WidgetApi/qgraphicswebview.cpp:293:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebKit/qt/WidgetApi/qgraphicswebview.cpp:317:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebKit/qt/WidgetApi/qgraphicswebview.cpp:498:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebKit/qt/WidgetApi/qgraphicswebview.cpp:500:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebKit/qt/WidgetApi/qgraphicswebview.cpp:502:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebKit/qt/WidgetApi/qgraphicswebview.cpp:504:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebKit/qt/WidgetApi/qgraphicswebview.cpp:506:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebKit/qt/WidgetApi/qgraphicswebview.cpp:508:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebKit/qt/WidgetApi/qgraphicswebview.cpp:510:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebKit/qt/WidgetApi/qgraphicswebview.cpp:512:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebKit/qt/WidgetApi/qgraphicswebview.cpp:514:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebKit/qt/WidgetApi/qgraphicswebview.cpp:517:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebKit/qt/WidgetApi/qgraphicswebview.cpp:700:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebKit/qt/WidgetApi/qgraphicswebview.cpp:793:  Declaration has space between type name and * in QAction *QGraphicsWebView  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qgraphicswebview.cpp:909:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:34:  Alphabetical sorting problem.  [build/include_order] [4]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:138:  Should have a space between // and comment  [whitespace/comments] [4]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:271:  Declaration has space between type name and * in QWebPageAdapter *QWebPagePrivate  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:273:  Declaration has space between type name and * in QWebPage *newPage  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:340:  Declaration has space between type name and * in QWebFullScreenVideoHandler *QWebPagePrivate  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:346:  Declaration has space between type name and * in QWebFrameAdapter *QWebPagePrivate  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:376:  Declaration has space between type name and * in QWebFrame *frame  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:428:  Declaration has space between type name and * in QtPluginWidgetAdapter *QWebPagePrivate  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:430:  Declaration has space between type name and * in QObject *widget  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:434:  Declaration has space between type name and * in QtPluginWidgetAdapter *QWebPagePrivate  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:457:  Non-label code inside switch statements should be indented.  [whitespace/indent] [4]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:474:  Non-label code inside switch statements should be indented.  [whitespace/indent] [4]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:487:  Declaration has space between type name and * in QMenu *createContextMenu  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:498:  Declaration has space between type name and * in QAction *a  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:513:  Declaration has space between type name and * in QMenu *subMenu  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:553:  Declaration has space between type name and * in QAction *a  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:566:  Declaration has space between type name and * in QAction *a  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:590:  A case label should not be indented, but line up with its switch statement.  [whitespace/indent] [4]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:622:  Declaration has space between type name and * in QObject *QWebPagePrivate  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:752:  Declaration has space between type name and * in QMenu *menu  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:767:  Declaration has space between type name and * in QMenu *QWebPage  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:1379:  Declaration has space between type name and * in QWebFrame *QWebPage  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:1390:  Declaration has space between type name and * in QWebFrame *QWebPage  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:1417:  Declaration has space between type name and * in QWebHistory *QWebPage  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:1457:  Declaration has space between type name and * in QWidget *QWebPage  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:1623:  Declaration has space between type name and * in QWebPage *QWebPage  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:1625:  Declaration has space between type name and * in QWebView *webView  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:1627:  Declaration has space between type name and * in QWebView *newView  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:1639:  Declaration has space between type name and * in QObject *QWebPage  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:1670:  One line control clauses should not use braces.  [whitespace/braces] [4]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:1758:  Declaration has space between type name and * in QWebSelectMethod *QWebPagePrivate  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:1983:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:2153:  Declaration has space between type name and * in QAction *QWebPage  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:2155:  More than one command on the same line in if  [whitespace/parens] [4]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:2161:  Declaration has space between type name and * in QStyle *style  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:2214:  A case label should not be indented, but line up with its switch statement.  [whitespace/indent] [4]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:2215:  Declaration has space between type name and * in QAction *a  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:2220:  Declaration has space between type name and * in QAction *a  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:2368:  Declaration has space between type name and * in QAction *a  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:2375:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:2408:  Declaration has space between type name and * in QUndoStack *QWebPage  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:2439:  Declaration has space between type name and * in QGraphicsSceneMouseEvent *gsEv  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:2446:  Declaration has space between type name and * in QGraphicsSceneMouseEvent *gsEv  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:2454:  Declaration has space between type name and * in QGraphicsSceneMouseEvent *gsEv  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:2462:  Declaration has space between type name and * in QGraphicsSceneMouseEvent *gsEv  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:2486:  Declaration has space between type name and * in QGraphicsSceneWheelEvent *gsEv  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:2670:  An else if statement should be written as an if statement when the prior &quot;if&quot; concludes with a return, break, continue or goto statement.  [readability/control_flow] [4]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:2988:  Declaration has space between type name and * in QWebPageAdapter *QWebPage  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:3017:  Declaration has space between type name and * in QWebSettings *QWebPage  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:3061:  Declaration has space between type name and * in QNetworkAccessManager *QWebPage  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebpage.cpp:3085:  Declaration has space between type name and * in QWebPluginFactory *QWebPage  [whitespace/declaration] [3]
Source/WebKit/qt/WebCoreSupport/TextureMapperLayerClientQt.cpp:28:  Alphabetical sorting problem.  [build/include_order] [4]
Source/WebKit/qt/WebCoreSupport/TextureMapperLayerClientQt.cpp:80:  One line control clauses should not use braces.  [whitespace/braces] [4]
Source/WebKit/qt/WebCoreSupport/TextureMapperLayerClientQt.cpp:110:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebKit/qt/WebCoreSupport/QWebFrameAdapter.h:32:  Alphabetical sorting problem.  [build/include_order] [4]
Source/WebKit/qt/WebCoreSupport/QWebFrameAdapter.h:64:  Missing space inside { }.  [whitespace/braces] [5]
Source/WebKit/qt/WebCoreSupport/QWebFrameAdapter.h:65:  The parameter name &quot;hitTest&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WebCoreSupport/QWebFrameAdapter.h:155:  The parameter name &quot;ownership&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WebCoreSupport/QWebFrameAdapter.h:183:  The parameter name &quot;scale&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebview.cpp:27:  Alphabetical sorting problem.  [build/include_order] [4]
Source/WebKit/qt/WidgetApi/qwebview.cpp:55:  Declaration has space between type name and * in QWebView *view  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebview.cpp:56:  Declaration has space between type name and * in QWebPage *page  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebview.cpp:207:  Declaration has space between type name and * in QWebPage *QWebView  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebview.cpp:210:  Declaration has space between type name and * in QWebView *that  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebview.cpp:264:  Declaration has space between type name and * in QWebFrame *mainFrame  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebview.cpp:266:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebKit/qt/WidgetApi/qwebview.cpp:268:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebKit/qt/WidgetApi/qwebview.cpp:270:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebKit/qt/WidgetApi/qwebview.cpp:273:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebKit/qt/WidgetApi/qwebview.cpp:275:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebKit/qt/WidgetApi/qwebview.cpp:277:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebKit/qt/WidgetApi/qwebview.cpp:279:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebKit/qt/WidgetApi/qwebview.cpp:281:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebKit/qt/WidgetApi/qwebview.cpp:283:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebKit/qt/WidgetApi/qwebview.cpp:286:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebKit/qt/WidgetApi/qwebview.cpp:288:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebKit/qt/WidgetApi/qwebview.cpp:319:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebKit/qt/WidgetApi/qwebview.cpp:374:  Declaration has space between type name and * in QWebHistory *QWebView  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebview.cpp:388:  Declaration has space between type name and * in QWebSettings *QWebView  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebview.cpp:496:  Declaration has space between type name and * in QAction *QWebView  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebview.cpp:700:  Declaration has space between type name and * in QContextMenuEvent *event  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebview.cpp:724:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebKit/qt/WidgetApi/qwebview.cpp:725:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebKit/qt/WidgetApi/qwebview.cpp:726:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebKit/qt/WidgetApi/qwebview.cpp:727:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebKit/qt/WidgetApi/qwebview.cpp:828:  Declaration has space between type name and * in QWebFrame *frame  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebview.cpp:854:  Declaration has space between type name and * in QWebView *QWebView  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebview.cpp:1033:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebKit/qt/WidgetApi/qwebinspector_p.h:20:  #ifndef header guard has wrong style, please use: qwebinspector_p_h  [build/header_guard] [5]
Source/WebKit/qt/WidgetApi/qwebinspector_p.h:36:  Missing space inside { }.  [whitespace/braces] [5]
Source/WebKit/qt/WidgetApi/qwebinspector_p.h:39:  The parameter name &quot;size&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.h:95:  Extra space before last semicolon. If this should be an empty statement, use { } instead.  [whitespace/semicolon] [5]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.h:217:  This { should be at the end of the previous line  [whitespace/braces] [4]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.h:218:  Missing space inside { }.  [whitespace/braces] [5]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.h:286:  The parameter name &quot;ev&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:29:  Alphabetical sorting problem.  [build/include_order] [4]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:51:  Alphabetical sorting problem.  [build/include_order] [4]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:61:  Alphabetical sorting problem.  [build/include_order] [4]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:230:  Should have a space between // and comment  [whitespace/comments] [4]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:305:  Should have a space between // and comment  [whitespace/comments] [4]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:317:  An else statement can be removed when the prior &quot;if&quot; concludes with a return, break, continue or goto statement.  [readability/control_flow] [4]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:380:  The parameter type should use PassRefPtr instead of RefPtr.  [readability/pass_ptr] [5]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:471:  Local variables should never be PassRefPtr (see http://webkit.org/coding/RefPtr.html).  [readability/pass_ptr] [5]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:505:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:661:  Should have a space between // and comment  [whitespace/comments] [4]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:684:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:732:  A case label should not be indented, but line up with its switch statement.  [whitespace/indent] [4]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:837:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:839:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:841:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:843:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:848:  An else should appear on the same line as the preceding }  [whitespace/newline] [4]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:870:  Non-label code inside switch statements should be indented.  [whitespace/indent] [4]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:869:  Missing space before ( in switch(  [whitespace/parens] [5]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:963:  Omit int when using unsigned  [runtime/unsigned] [1]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:964:  map_it is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:965:  map_end is incorrectly named. Don&apos;t use underscores in your identifier names.  [readability/naming/underscores] [4]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:1033:  A case label should not be indented, but line up with its switch statement.  [whitespace/indent] [4]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:1069:  Declaration has space between type name and * in Frame *frame  [whitespace/declaration] [3]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:1072:  Declaration has space between type name and * in Editor *editor  [whitespace/declaration] [3]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:1080:  A case label should not be indented, but line up with its switch statement.  [whitespace/indent] [4]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:1083:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:1084:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:1085:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:1093:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:1094:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:1253:  Should have a space between // and comment  [whitespace/comments] [4]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:1258:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:1273:  Declaration has space between type name and * in QObject *QWebPageAdapter  [whitespace/declaration] [3]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:1275:  Declaration has space between type name and * in Frame *frame  [whitespace/declaration] [3]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:1282:  Declaration has space between type name and * in Frame *frame  [whitespace/declaration] [3]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:1284:  Declaration has space between type name and * in Document *document  [whitespace/declaration] [3]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:1332:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:1338:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:1342:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:1347:  A case label should not be indented, but line up with its switch statement.  [whitespace/indent] [4]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:1373:  Declaration has space between type name and * in FocusController *focusController  [whitespace/declaration] [3]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:1385:  Declaration has space between type name and * in FocusController *focusController  [whitespace/declaration] [3]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:1398:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:1402:  One line control clauses should not use braces.  [whitespace/braces] [4]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.cpp:1478:  Declaration has space between type name and * in ContextMenu *menu  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebframe.cpp:29:  Alphabetical sorting problem.  [build/include_order] [4]
Source/WebKit/qt/WidgetApi/qwebframe.cpp:40:  Alphabetical sorting problem.  [build/include_order] [4]
Source/WebKit/qt/WidgetApi/qwebframe.cpp:84:  Declaration has space between type name and * in QWidget *view  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebframe.cpp:121:  Declaration has space between type name and * in QWebFrame *QWebFramePrivate  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebframe.cpp:126:  Declaration has space between type name and * in QObject *QWebFramePrivate  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebframe.cpp:403:  Declaration has space between type name and * in QWebPage *QWebFrame  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebframe.cpp:432:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebKit/qt/WidgetApi/qwebframe.cpp:433:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebKit/qt/WidgetApi/qwebframe.cpp:493:  Declaration has space between type name and * in QWebFrame *QWebFrame  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebframe.cpp:854:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
Source/WebKit/qt/WidgetApi/qwebframe.cpp:900:  Extra space after ( in if  [whitespace/parens] [5]
Source/WebKit/qt/WidgetApi/qwebframe.cpp:928:  Declaration has space between type name and * in QWebFrame *QWebFramePrivate  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebframe.cpp:1066:  Declaration has space between type name and &amp; in QWebHitTestResult &amp;QWebHitTestResult  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebframe.cpp:1193:  Declaration has space between type name and * in QWebFrame *QWebHitTestResult  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebframe.cpp:1266:  Declaration has space between type name and * in QWebFrame *QWebHitTestResult  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebframe.cpp:1276:  Declaration has space between type name and * in QWebFrameAdapter *QWebFrame  [whitespace/declaration] [3]
Source/WebKit/qt/WidgetApi/qwebframe.h:21:  #ifndef header guard has wrong style, please use: qwebframe_h  [build/header_guard] [5]
Source/WebKit/qt/WidgetApi/qwebframe.h:28:  Alphabetical sorting problem.  [build/include_order] [4]
Source/WebKit/qt/WidgetApi/qwebframe.h:57:  Code inside a namespace should not be indented.  [whitespace/indent] [4]
Source/WebKit/qt/WidgetApi/qwebframe.h:99:  The parameter name &quot;priv&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WeFailed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/QtWebKit.pro&apos;, u&apos;Source/WTF/wtf/tex...&quot; exit_code: 1
bKit/qt/WidgetApi/qwebframe.h:133:  The parameter name &quot;url&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebframe.h:134:  The parameter name &quot;request&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebframe.h:134:  The parameter name &quot;operation&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebframe.h:138:  The parameter name &quot;object&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebframe.h:138:  The parameter name &quot;ownership&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebframe.h:143:  The parameter name &quot;url&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebframe.h:155:  The parameter name &quot;orientation&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebframe.h:156:  The parameter name &quot;orientation&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebframe.h:156:  The parameter name &quot;policy&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebframe.h:158:  The parameter name &quot;orientation&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebframe.h:159:  The parameter name &quot;orientation&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebframe.h:160:  The parameter name &quot;orientation&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebframe.h:161:  The parameter name &quot;orientation&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebframe.h:162:  The parameter name &quot;orientation&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebframe.h:166:  The parameter name &quot;pos&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebframe.h:180:  The parameter name &quot;layer&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebframe.h:186:  The parameter name &quot;factor&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebframe.h:209:  The parameter name &quot;printer&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebframe.h:217:  The parameter name &quot;url&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebframe.h:223:  The parameter name &quot;size&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage_p.h:21:  #ifndef header guard has wrong style, please use: qwebpage_p_h  [build/header_guard] [5]
Source/WebKit/qt/WidgetApi/qwebpage_p.h:38:  Code inside a namespace should not be indented.  [whitespace/indent] [4]
Source/WebKit/qt/WidgetApi/qwebpage_p.h:146:  The parameter name &quot;action&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage_p.h:171:  The parameter name &quot;event&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage_p.h:173:  The parameter name &quot;action&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Total errors found: 314 in 83 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>780075</commentid>
    <comment_count>4</comment_count>
      <attachid>176959</attachid>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2012-11-30 06:47:04 -0800</bug_when>
    <thetext>Created attachment 176959
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>780077</commentid>
    <comment_count>5</comment_count>
      <attachid>176959</attachid>
    <who name="Kenneth Rohde Christiansen">kenneth</who>
    <bug_when>2012-11-30 06:48:27 -0800</bug_when>
    <thetext>Comment on attachment 176959
Patch

Wow!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>780079</commentid>
    <comment_count>6</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-11-30 06:54:05 -0800</bug_when>
    <thetext>Attachment 176959 did not pass style-queue:

Source/WebKit/qt/WidgetApi/qwebview.h:21:  #ifndef header guard has wrong style, please use: qwebview_h  [build/header_guard] [5]
Source/WebKit/qt/WidgetApi/qwebview.h:25:  Alphabetical sorting problem.  [build/include_order] [4]
Source/WebKit/qt/WidgetApi/qwebview.h:50:  Should have a space between // and comment  [whitespace/comments] [4]
Source/WebKit/qt/WidgetApi/qwebview.h:61:  The parameter name &quot;page&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebview.h:63:  The parameter name &quot;url&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebview.h:64:  The parameter name &quot;request&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebview.h:64:  The parameter name &quot;operation&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebview.h:72:  The parameter name &quot;url&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebview.h:81:  The parameter name &quot;action&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebview.h:83:  The parameter name &quot;action&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebview.h:98:  The parameter name &quot;factor&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebview.h:104:  The parameter name &quot;hints&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebview.h:105:  The parameter name &quot;hint&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebview.h:134:  The parameter name &quot;type&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebinspector.h:20:  #ifndef header guard has wrong style, please use: qwebinspector_h  [build/header_guard] [5]
Source/WebKit/qt/WidgetApi/qwebinspector.h:36:  The parameter name &quot;page&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebinspector.h:43:  The parameter name &quot;event&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebinspector.h:44:  The parameter name &quot;event&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebinspector.h:45:  The parameter name &quot;event&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebinspector.h:46:  The parameter name &quot;event&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qgraphicswebview.h:20:  #ifndef header guard has wrong style, please use: qgraphicswebview_h  [build/header_guard] [5]
Source/WebKit/qt/WidgetApi/qgraphicswebview.h:24:  Alphabetical sorting problem.  [build/include_order] [4]
Source/WebKit/qt/WidgetApi/qgraphicswebview.h:74:  The parameter name &quot;url&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qgraphicswebview.h:75:  The parameter name &quot;request&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qgraphicswebview.h:75:  The parameter name &quot;operation&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qgraphicswebview.h:84:  The parameter name &quot;action&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qgraphicswebview.h:85:  The parameter name &quot;action&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qgraphicswebview.h:93:  The parameter name &quot;frozen&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qgraphicswebview.h:95:  The parameter name &quot;rect&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qgraphicswebview.h:97:  The parameter name &quot;widget&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qgraphicswebview.h:98:  The parameter name &quot;change&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qgraphicswebview.h:103:  The parameter name &quot;query&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:21:  #ifndef header guard has wrong style, please use: qwebpage_h  [build/header_guard] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:26:  Alphabetical sorting problem.  [build/include_order] [4]
Source/WebKit/qt/WidgetApi/qwebpage.h:56:  Code inside a namespace should not be indented.  [whitespace/indent] [4]
Source/WebKit/qt/WidgetApi/qwebpage.h:258:  The parameter name &quot;view&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:266:  The parameter name &quot;manager&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:269:  The parameter name &quot;factory&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:280:  The parameter name &quot;action&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:282:  The parameter name &quot;action&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:285:  The parameter name &quot;size&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:289:  The parameter name &quot;size&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:290:  The parameter name &quot;rect&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:299:  The parameter name &quot;forward&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:302:  The parameter name &quot;policy&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:305:  The parameter name &quot;palette&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:308:  The parameter name &quot;editable&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:312:  The parameter name &quot;event&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:318:  The parameter name &quot;frame&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:318:  The parameter name &quot;feature&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:318:  The parameter name &quot;policy&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:328:  Missing space inside { }.  [whitespace/braces] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:330:  Missing space inside { }.  [whitespace/braces] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:355:  Missing space inside { }.  [whitespace/braces] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:363:  The parameter name &quot;extension&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:363:  The parameter name &quot;option&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:364:  The parameter name &quot;extension&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:378:  The parameter name &quot;frame&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:383:  The parameter name &quot;frame&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:384:  The parameter name &quot;url&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:390:  The parameter name &quot;reply&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:391:  The parameter name &quot;request&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:395:  The parameter name &quot;frame&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:396:  The parameter name &quot;origin&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:398:  The parameter name &quot;frame&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:398:  The parameter name &quot;item&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:399:  The parameter name &quot;frame&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:403:  The parameter name &quot;frame&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:403:  The parameter name &quot;feature&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:404:  The parameter name &quot;frame&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:404:  The parameter name &quot;feature&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:407:  The parameter name &quot;type&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:408:  The parameter name &quot;url&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:410:  The parameter name &quot;frame&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:410:  The parameter name &quot;request&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:410:  The parameter name &quot;type&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebpage.h:417:  The parameter name &quot;url&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WebCoreSupport/QWebPageAdapter.h:95:  Extra space before last semicolon. If this should be an empty statement, use { } instead.  [whitespace/semicolon] [5]
Source/WebKit/qt/WidgetApi/qwebframe.h:21:  #ifndef header guard has wrong style, please use: qwebframe_h  [build/header_guard] [5]
Source/WebKit/qt/WidgetApi/qwebframe.h:57:  Code inside a namespace should not be indented.  [whitespace/indent] [4]
Source/WebKit/qt/WidgetApi/qwebframe.h:99:  The parameter name &quot;priv&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebframe.h:133:  The parameter name &quot;url&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebframe.h:134:  The parameter name &quot;request&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebframe.h:134:  The parameter name &quot;operation&quot; adds no information, so it should be reFailed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/QtWebKit.pro&apos;, u&apos;Source/WTF/wtf/tex...&quot; exit_code: 1
moved.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebframe.h:138:  The parameter name &quot;object&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebframe.h:138:  The parameter name &quot;ownership&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebframe.h:143:  The parameter name &quot;url&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebframe.h:155:  The parameter name &quot;orientation&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebframe.h:156:  The parameter name &quot;orientation&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebframe.h:156:  The parameter name &quot;policy&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebframe.h:158:  The parameter name &quot;orientation&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebframe.h:159:  The parameter name &quot;orientation&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebframe.h:160:  The parameter name &quot;orientation&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebframe.h:161:  The parameter name &quot;orientation&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebframe.h:162:  The parameter name &quot;orientation&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebframe.h:166:  The parameter name &quot;pos&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebframe.h:180:  The parameter name &quot;layer&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebframe.h:186:  The parameter name &quot;factor&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebframe.h:209:  The parameter name &quot;printer&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebframe.h:217:  The parameter name &quot;url&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebKit/qt/WidgetApi/qwebframe.h:223:  The parameter name &quot;size&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Total errors found: 101 in 84 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>780082</commentid>
    <comment_count>7</comment_count>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2012-11-30 06:59:25 -0800</bug_when>
    <thetext>There will be some failing tests after landing, but we&apos;ll take care of these separately.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>780103</commentid>
    <comment_count>8</comment_count>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2012-11-30 07:32:30 -0800</bug_when>
    <thetext>Committed r136235: &lt;http://trac.webkit.org/changeset/136235&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>176743</attachid>
            <date>2012-11-29 08:50:43 -0800</date>
            <delta_ts>2012-11-30 06:46:58 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-99314-20121129174936.patch</filename>
            <type>text/plain</type>
            <size>943116</size>
            <attacher name="Simon Hausmann">hausmann</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTM2MTMzCmRpZmYgLS1naXQgYS9Tb3VyY2UvUXRXZWJLaXQu
cHJvIGIvU291cmNlL1F0V2ViS2l0LnBybwppbmRleCA1OWY5YTBkODEzYzIwNWU4MmFmMDIxZTQ3
ZmY0MDg1MjYzMjUwZDNmLi5jZDI2NGNmZWIxNjBlYmZmNGZlMjY4OTU0NmIwN2M0Y2JhODYzOGU1
IDEwMDY0NAotLS0gYS9Tb3VyY2UvUXRXZWJLaXQucHJvCisrKyBiL1NvdXJjZS9RdFdlYktpdC5w
cm8KQEAgLTEwLDYgKzEwLDEyIEBAIENPTkZJRyArPSBvcmRlcmVkCiBhcGkuZmlsZSA9IGFwaS5w
cmkKIFNVQkRJUlMgKz0gYXBpCiAKK2J1aWxkPyh3ZWJraXQxKSB7CisgICAgd2Via2l0d2lkZ2V0
cy5maWxlID0gV2ViS2l0L1dlYktpdFdpZGdldHMucHJvCisgICAgd2Via2l0d2lkZ2V0cy5tYWtl
ZmlsZSA9IE1ha2VmaWxlLldlYktpdFdpZGdldHMKKyAgICBTVUJESVJTICs9IHdlYmtpdHdpZGdl
dHMKK30KKwogYnVpbGQ/KHdlYmtpdDIpIHsKICAgICB3ZWJwcm9jZXNzLmZpbGUgPSBXZWJLaXQy
L1dlYlByb2Nlc3MucHJvCiAgICAgU1VCRElSUyArPSB3ZWJwcm9jZXNzCmRpZmYgLS1naXQgYS9T
b3VyY2UvV1RGL3d0Zi90ZXh0L1dURlN0cmluZy5oIGIvU291cmNlL1dURi93dGYvdGV4dC9XVEZT
dHJpbmcuaAppbmRleCAwMDY2MjU3YzYzNWE0NTM0ZGQ0YTllNThjYmM3YmQ0NWZkYWRmYmRkLi4z
YTkxNWIxM2EyYjJiZmJkZTYxOTI2ZmJiYjU2ZjQwNTBhZTM2ZmZjIDEwMDY0NAotLS0gYS9Tb3Vy
Y2UvV1RGL3d0Zi90ZXh0L1dURlN0cmluZy5oCisrKyBiL1NvdXJjZS9XVEYvd3RmL3RleHQvV1RG
U3RyaW5nLmgKQEAgLTQxNiw5ICs0MTYsOSBAQCBwdWJsaWM6CiAjZW5kaWYKIAogI2lmIFBMQVRG
T1JNKFFUKQotICAgIFN0cmluZyhjb25zdCBRU3RyaW5nJik7Ci0gICAgU3RyaW5nKGNvbnN0IFFT
dHJpbmdSZWYmKTsKLSAgICBvcGVyYXRvciBRU3RyaW5nKCkgY29uc3Q7CisgICAgV1RGX0VYUE9S
VF9TVFJJTkdfQVBJIFN0cmluZyhjb25zdCBRU3RyaW5nJik7CisgICAgV1RGX0VYUE9SVF9TVFJJ
TkdfQVBJIFN0cmluZyhjb25zdCBRU3RyaW5nUmVmJik7CisgICAgV1RGX0VYUE9SVF9TVFJJTkdf
QVBJIG9wZXJhdG9yIFFTdHJpbmcoKSBjb25zdDsKICNlbmRpZgogCiAjaWYgUExBVEZPUk0oV1gp
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9UYXJnZXQucHJpIGIvU291cmNlL1dlYkNvcmUv
VGFyZ2V0LnByaQppbmRleCBjNTdkNThiMjBjYzVmNWU3MmVjODk1MWFiNjE2MmIzMTcwYWZmYTVl
Li44NTNjYTQ4ODM1YTM2ZDZjYTQwODYzZGM0N2RmOTQ3M2E2Mjc4Mzg0IDEwMDY0NAotLS0gYS9T
b3VyY2UvV2ViQ29yZS9UYXJnZXQucHJpCisrKyBiL1NvdXJjZS9XZWJDb3JlL1RhcmdldC5wcmkK
QEAgLTI4NTQsNyArMjg1NCw2IEBAIFNPVVJDRVMgKz0gXAogICAgIHBsYXRmb3JtL3F0L1Bhc3Rl
Ym9hcmRRdC5jcHAgXAogICAgIHBsYXRmb3JtL3F0L1BsYXRmb3JtS2V5Ym9hcmRFdmVudFF0LmNw
cCBcCiAgICAgcGxhdGZvcm0vcXQvUGxhdGZvcm1TY3JlZW5RdC5jcHAgXAotICAgIHBsYXRmb3Jt
L3F0L1FTdHlsZUZhY2FkZS5jcHAgXAogICAgIHBsYXRmb3JtL3F0L1JlbmRlclRoZW1lUVN0eWxl
LmNwcCBcCiAgICAgcGxhdGZvcm0vcXQvUmVuZGVyVGhlbWVRdC5jcHAgXAogICAgIHBsYXRmb3Jt
L3F0L1JlbmRlclRoZW1lUXRNb2JpbGUuY3BwIFwKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL25ldHdvcmsvSFRUUFBhcnNlcnMuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L25ldHdvcmsvSFRUUFBhcnNlcnMuaAppbmRleCA2MTFhYmFlODBmZTgxNTQyMTQ3MzgwMmEyMjA3
OWFmMmU1MmVlMDU3Li5iMjQxZjBmZGI2MmRhOTVmYWJiMjU0NmY4NmQ4NGRhOGU1OWExNTgzIDEw
MDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL0hUVFBQYXJzZXJzLmgK
KysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9IVFRQUGFyc2Vycy5oCkBAIC01
OSw3ICs1OSw3IEBAIGJvb2wgcGFyc2VIVFRQUmVmcmVzaChjb25zdCBTdHJpbmcmIHJlZnJlc2gs
IGJvb2wgZnJvbUh0dHBFcXVpdk1ldGEsIGRvdWJsZSYgZGVsCiBkb3VibGUgcGFyc2VEYXRlKGNv
bnN0IFN0cmluZyYpOwogU3RyaW5nIGZpbGVuYW1lRnJvbUhUVFBDb250ZW50RGlzcG9zaXRpb24o
Y29uc3QgU3RyaW5nJik7IAogU3RyaW5nIGV4dHJhY3RNSU1FVHlwZUZyb21NZWRpYVR5cGUoY29u
c3QgU3RyaW5nJik7Ci1TdHJpbmcgZXh0cmFjdENoYXJzZXRGcm9tTWVkaWFUeXBlKGNvbnN0IFN0
cmluZyYpOyAKK1N0cmluZyBleHRyYWN0Q2hhcnNldEZyb21NZWRpYVR5cGUoY29uc3QgU3RyaW5n
Jik7CiB2b2lkIGZpbmRDaGFyc2V0SW5NZWRpYVR5cGUoY29uc3QgU3RyaW5nJiBtZWRpYVR5cGUs
IHVuc2lnbmVkIGludCYgY2hhcnNldFBvcywgdW5zaWduZWQgaW50JiBjaGFyc2V0TGVuLCB1bnNp
Z25lZCBpbnQgc3RhcnQgPSAwKTsKIFhTU1Byb3RlY3Rpb25EaXNwb3NpdGlvbiBwYXJzZVhTU1By
b3RlY3Rpb25IZWFkZXIoY29uc3QgU3RyaW5nJiBoZWFkZXIsIFN0cmluZyYgZmFpbHVyZVJlYXNv
biwgdW5zaWduZWQmIGZhaWx1cmVQb3NpdGlvbiwgU3RyaW5nJiByZXBvcnRVUkwpOwogU3RyaW5n
IGV4dHJhY3RSZWFzb25QaHJhc2VGcm9tSFRUUFN0YXR1c0xpbmUoY29uc3QgU3RyaW5nJik7CmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9xdC9RU3R5bGVGYWNhZGUuY3BwIGIv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vcXQvUVN0eWxlRmFjYWRlLmNwcApkZWxldGVkIGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggNDcwN2EyZmMxNTJmZjE2ZDI3YmRlNmQ3NmE0YjVmZGFmZGY0MTBk
NC4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9xdC9RU3R5bGVGYWNhZGUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEs
NDYgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSB0aGVtZSBpbXBsZW1l
bnRhdGlvbiBmb3IgZm9ybSBjb250cm9scyBpbiBXZWJDb3JlLgotICoKLSAqIENvcHlyaWdodCAo
QykgMjAxMiBEaWdpYSBQbGMgYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpLgotICogQ29weXJp
Z2h0IChDKSAyMDExLTIwMTIgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5
KC1pZXMpLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJl
ZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhl
IEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0
aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMiBvZiB0aGUg
TGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBU
aGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVz
ZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBs
aWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBM
aWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVk
IGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxv
bmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwg
d3JpdGUgdG8KLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5r
bGluIFN0cmVldCwgRmlmdGggRmxvb3IsCi0gKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4K
LSAqCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIlFTdHlsZUZhY2FkZS5o
IgotCi0jaW5jbHVkZSAiUVdlYlBhZ2VDbGllbnQuaCIKLSNpbmNsdWRlIDxDaHJvbWUuaD4KLSNp
bmNsdWRlIDxDaHJvbWVDbGllbnQuaD4KLSNpbmNsdWRlIDxQYWdlLmg+Ci0KLW5hbWVzcGFjZSBX
ZWJDb3JlIHsKLQotUVN0eWxlKiBRU3R5bGVGYWNhZGU6OnN0eWxlRm9yUGFnZShQYWdlKiBwYWdl
KQotewotICAgIGlmICghcGFnZSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgUVdlYlBhZ2VDbGll
bnQqIHBhZ2VDbGllbnQgPSBwYWdlLT5jaHJvbWUoKS0+Y2xpZW50KCktPnBsYXRmb3JtUGFnZUNs
aWVudCgpOwotCi0gICAgaWYgKCFwYWdlQ2xpZW50KQotICAgICAgICByZXR1cm4gMDsKLQotICAg
IHJldHVybiBwYWdlQ2xpZW50LT5zdHlsZSgpOwotfQotCi19CmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9xdC9RU3R5bGVGYWNhZGUuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL3F0L1FTdHlsZUZhY2FkZS5oCmluZGV4IDczZTgzNjJiMTJlZDU5ZjBmNDFkMDEyZDE5ZWM0
MTZkNjI0YjE4YmIuLmQzY2I0MzE2NmU1YmE1MTJkYjkzNzc5NmI4MjI2M2VmOTExZGZiNDIgMTAw
NjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3F0L1FTdHlsZUZhY2FkZS5oCisrKyBi
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3F0L1FTdHlsZUZhY2FkZS5oCkBAIC0xNTUsOCArMTU1
LDYgQEAgcHVibGljOgogICAgIHZpcnR1YWwgUU9iamVjdCogd2lkZ2V0Rm9yUGFpbnRlcihRUGFp
bnRlciopID0gMDsKIAogICAgIHZpcnR1YWwgYm9vbCBpc1ZhbGlkKCkgY29uc3QgPSAwOwotCi0g
ICAgc3RhdGljIFFTdHlsZSogc3R5bGVGb3JQYWdlKFBhZ2UqKTsKIH07CiAKIFFfREVDTEFSRV9P
UEVSQVRPUlNfRk9SX0ZMQUdTKFFTdHlsZUZhY2FkZTo6U3RhdGUpCmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9xdC9RV2ViUGFnZUNsaWVudC5oIGIvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vcXQvUVdlYlBhZ2VDbGllbnQuaAppbmRleCBhZTNmYjRlMmZhMGRiMjRiZDNlNGJl
YWMyMThhMjE5NjAyYmRlNzFjLi4xNTI2ZTlkMjBhN2M5YWNiNGViMGMzMzM3YTc0Y2JhOWFhMjIz
NWRlIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9xdC9RV2ViUGFnZUNsaWVu
dC5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3F0L1FXZWJQYWdlQ2xpZW50LmgKQEAg
LTU4LDE3ICs1OCwxMCBAQCBwdWJsaWM6CiAKICAgICB2aXJ0dWFsIHZvaWQgc2Nyb2xsKGludCBk
eCwgaW50IGR5LCBjb25zdCBRUmVjdCYpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlKGNv
bnN0IFFSZWN0JikgPSAwOworICAgIHZpcnR1YWwgdm9pZCByZXBhaW50Vmlld3BvcnQoKSA9IDA7
CiAgICAgdmlydHVhbCB2b2lkIHNldElucHV0TWV0aG9kRW5hYmxlZChib29sIGVuYWJsZSkgPSAw
OwogICAgIHZpcnR1YWwgYm9vbCBpbnB1dE1ldGhvZEVuYWJsZWQoKSBjb25zdCA9IDA7Ci0jaWYg
VVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQotICAgIHZpcnR1YWwgdm9pZCBzZXRSb290R3Jh
cGhpY3NMYXllcihXZWJDb3JlOjpHcmFwaGljc0xheWVyKiBsYXllcikgeyB9Ci0KLSAgICAvLyB0
aGlzIGdldHMgY2FsbGVkIHdoZW4gdGhlIGNvbXBvc2l0b3Igd2FudHMgdXMgdG8gc3luYyB0aGUg
bGF5ZXJzCi0gICAgLy8gaWYgc2NoZWR1bGVTeW5jIGlzIHRydWUsIHdlIHNjaGVkdWxlIGEgc3lu
YyBvdXJzZWx2ZXMuIG90aGVyd2lzZSwKLSAgICAvLyB3ZSB3YWl0IGZvciB0aGUgbmV4dCB1cGRh
dGUgYW5kIHN5bmMgdGhlIGxheWVycyB0aGVuLgotICAgIHZpcnR1YWwgdm9pZCBtYXJrRm9yU3lu
Yyhib29sIHNjaGVkdWxlU3luYyA9IGZhbHNlKSB7fQotICAgIHZpcnR1YWwgYm9vbCBhbGxvd3NB
Y2NlbGVyYXRlZENvbXBvc2l0aW5nKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSNlbmRpZgor
ICAgIHZpcnR1YWwgYm9vbCBtYWtlT3BlbkdMQ29udGV4dEN1cnJlbnRJZkF2YWlsYWJsZSgpIHsg
cmV0dXJuIGZhbHNlOyB9CiAKICAgICB2aXJ0dWFsIHZvaWQgc2V0SW5wdXRNZXRob2RIaW50cyhR
dDo6SW5wdXRNZXRob2RIaW50cyBoaW50KSA9IDA7CiAKQEAgLTEwNiwxMSArOTksNiBAQCBwdWJs
aWM6CiAKICAgICB2aXJ0dWFsIHZvaWQgc2V0V2lkZ2V0VmlzaWJsZShXZWJDb3JlOjpXaWRnZXQq
LCBib29sIHZpc2libGUpID0gMDsKIAotI2lmIFVTRSgzRF9HUkFQSElDUykKLSAgICB2aXJ0dWFs
IHZvaWQgY3JlYXRlUGxhdGZvcm1HcmFwaGljc0NvbnRleHQzRChQbGF0Zm9ybUdyYXBoaWNzQ29u
dGV4dDNEKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBQbGF0Zm9ybUdyYXBoaWNzU3VyZmFjZTNEKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBRT2JqZWN0KiogPSAwKSA9IDA7Ci0jZW5kaWYKICAgICB2
aXJ0dWFsIFFXaW5kb3cqIG93bmVyV2luZG93KCkgY29uc3Q7CiAKIHByb3RlY3RlZDoKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJLaXQvV2ViS2l0MS5wcm8gYi9Tb3VyY2UvV2ViS2l0L1dlYktpdDEu
cHJvCmluZGV4IGZlZTk5ZTg4NTFiZmZkNjExOGNmNGNhYTBmMjI2YjEyZGI0Yjc0NzcuLjdkMmVi
M2Q2MDA1Nzk2YmM1MzM2YmY4NjhmZmZjMTA3NzFkMmFmZTMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9X
ZWJLaXQvV2ViS2l0MS5wcm8KKysrIGIvU291cmNlL1dlYktpdC9XZWJLaXQxLnBybwpAQCAtMjAs
NiArMjAsOCBAQCBTT1VSQ0VTICs9IFwKICAgICAkJFBXRC9xdC9BcGkvcXdlYmVsZW1lbnQuY3Bw
IFwKICAgICAkJFBXRC9xdC9BcGkvcXdlYmhpc3RvcnkuY3BwIFwKICAgICAkJFBXRC9xdC9BcGkv
cXdlYmhpc3RvcnlpbnRlcmZhY2UuY3BwIFwKKyAgICAkJFBXRC9xdC9BcGkvcXdlYmtpdHZlcnNp
b24uY3BwIFwKKyAgICAkJFBXRC9xdC9BcGkvcXdlYnBsdWdpbmRhdGFiYXNlLmNwcCBcCiAgICAg
JCRQV0QvcXQvQXBpL3F3ZWJwbHVnaW5mYWN0b3J5LmNwcCBcCiAgICAgJCRQV0QvcXQvQXBpL3F3
ZWJzZWN1cml0eW9yaWdpbi5jcHAgXAogICAgICQkUFdEL3F0L0FwaS9xd2Vic2V0dGluZ3MuY3Bw
IFwKQEAgLTM5LDEwICs0MSwxMyBAQCBTT1VSQ0VTICs9IFwKICAgICAkJFBXRC9xdC9XZWJDb3Jl
U3VwcG9ydC9QbGF0Zm9ybVN0cmF0ZWdpZXNRdC5jcHAgXAogICAgICQkUFdEL3F0L1dlYkNvcmVT
dXBwb3J0L1BvcHVwTWVudVF0LmNwcCBcCiAgICAgJCRQV0QvcXQvV2ViQ29yZVN1cHBvcnQvUXRQ
bGF0Zm9ybVBsdWdpbi5jcHAgXAorICAgICQkUFdEL3F0L1dlYkNvcmVTdXBwb3J0L1F0UGx1Z2lu
V2lkZ2V0QWRhcHRlci5jcHAgXAorICAgICQkUFdEL3F0L1dlYkNvcmVTdXBwb3J0L1F0UHJpbnRD
b250ZXh0LmNwcCBcCiAgICAgJCRQV0QvcXQvV2ViQ29yZVN1cHBvcnQvUVdlYkZyYW1lQWRhcHRl
ci5jcHAgXAogICAgICQkUFdEL3F0L1dlYkNvcmVTdXBwb3J0L1FXZWJQYWdlQWRhcHRlci5jcHAg
XAogICAgICQkUFdEL3F0L1dlYkNvcmVTdXBwb3J0L1NlYXJjaFBvcHVwTWVudVF0LmNwcCBcCiAg
ICAgJCRQV0QvcXQvV2ViQ29yZVN1cHBvcnQvVGV4dENoZWNrZXJDbGllbnRRdC5jcHAgXAorICAg
ICQkUFdEL3F0L1dlYkNvcmVTdXBwb3J0L1RleHR1cmVNYXBwZXJMYXllckNsaWVudFF0LmNwcCBc
CiAgICAgJCRQV0QvcXQvV2ViQ29yZVN1cHBvcnQvVW5kb1N0ZXBRdC5jcHAgXAogICAgICQkUFdE
L3F0L1dlYkNvcmVTdXBwb3J0L1dlYkV2ZW50Q29udmVyc2lvbi5jcHAKIApAQCAtNTQsMTAgKzU5
LDEzIEBAIEhFQURFUlMgKz0gXAogICAgICQkUFdEL3F0L0FwaS9xd2ViaGlzdG9yeS5oIFwKICAg
ICAkJFBXRC9xdC9BcGkvcXdlYmhpc3RvcnlfcC5oIFwKICAgICAkJFBXRC9xdC9BcGkvcXdlYmhp
c3RvcnlpbnRlcmZhY2UuaCBcCisgICAgJCRQV0QvcXQvQXBpL3F3ZWJraXR2ZXJzaW9uLmggXAor
ICAgICQkUFdEL3F0L0FwaS9xd2VicGx1Z2luZGF0YWJhc2VfcC5oIFwKICAgICAkJFBXRC9xdC9B
cGkvcXdlYnBsdWdpbmZhY3RvcnkuaCBcCiAgICAgJCRQV0QvcXQvQXBpL3F3ZWJzZWN1cml0eW9y
aWdpbi5oIFwKICAgICAkJFBXRC9xdC9BcGkvcXdlYnNldHRpbmdzLmggXAogICAgICQkUFdEL3F0
L0FwaS9xd2Vic2NyaXB0d29ybGRfcC5oIFwKKyAgICAkJFBXRC9xdC9BcGkvcXdlYmtpdHBsYXRm
b3JtcGx1Z2luLmggXAogICAgICQkUFdEL3F0L1dlYkNvcmVTdXBwb3J0L0Nocm9tZUNsaWVudFF0
LmggXAogICAgICQkUFdEL3F0L1dlYkNvcmVTdXBwb3J0L0NvbnRleHRNZW51Q2xpZW50UXQuaCBc
CiAgICAgJCRQV0QvcXQvV2ViQ29yZVN1cHBvcnQvRHJhZ0NsaWVudFF0LmggXApAQCAtNzMsMTAg
KzgxLDEyIEBAIEhFQURFUlMgKz0gXAogICAgICQkUFdEL3F0L1dlYkNvcmVTdXBwb3J0L1BvcHVw
TWVudVF0LmggXAogICAgICQkUFdEL3F0L1dlYkNvcmVTdXBwb3J0L1F0UGxhdGZvcm1QbHVnaW4u
aCBcCiAgICAgJCRQV0QvcXQvV2ViQ29yZVN1cHBvcnQvUXRQbHVnaW5XaWRnZXRBZGFwdGVyLmgg
XAorICAgICQkUFdEL3F0L1dlYkNvcmVTdXBwb3J0L1F0UHJpbnRDb250ZXh0LmggXAogICAgICQk
UFdEL3F0L1dlYkNvcmVTdXBwb3J0L1FXZWJGcmFtZUFkYXB0ZXIuaCBcCiAgICAgJCRQV0QvcXQv
V2ViQ29yZVN1cHBvcnQvUVdlYlBhZ2VBZGFwdGVyLmggXAogICAgICQkUFdEL3F0L1dlYkNvcmVT
dXBwb3J0L1NlYXJjaFBvcHVwTWVudVF0LmggXAogICAgICQkUFdEL3F0L1dlYkNvcmVTdXBwb3J0
L1RleHRDaGVja2VyQ2xpZW50UXQuaCBcCisgICAgJCRQV0QvcXQvV2ViQ29yZVN1cHBvcnQvVGV4
dHVyZU1hcHBlckxheWVyQ2xpZW50UXQuaCBcCiAgICAgJCRQV0QvcXQvV2ViQ29yZVN1cHBvcnQv
VW5kb1N0ZXBRdC5oIFwKICAgICAkJFBXRC9xdC9XZWJDb3JlU3VwcG9ydC9XZWJFdmVudENvbnZl
cnNpb24uaAogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1dlYktpdFdpZGdldHMucHJpIGIv
U291cmNlL1dlYktpdC9XZWJLaXRXaWRnZXRzLnByaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggNTRjNjE0ODVmMjc4ODRlYWI0MjQ2YmY0ZDIyNjNhNzA0YmFhZTA3Yy4uMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L1dlYktp
dFdpZGdldHMucHJpCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotIyAtLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
Ci0jIFRoaXMgZmlsZSBjb250YWlucyBzaGFyZWQgcnVsZXMgdXNlZCBib3RoIHdoZW4gYnVpbGRp
bmcgV2ViS2l0V2lkZ2V0cwotIyBpdHNlbGYsIGFuZCBieSB0YXJnZXRzIHRoYXQgdXNlIFdlYktp
dFdpZGdldHMuCi0jCi0jIFNlZSAnVG9vbHMvcW1ha2UvUkVBRE1FJyBmb3IgYW4gb3ZlcnZpZXcg
b2YgdGhlIGJ1aWxkIHN5c3RlbQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVNPVVJDRV9ESVIgPSAkJHtST09U
X1dFQktJVF9ESVJ9L1NvdXJjZS9XZWJLaXQKLQotSU5DTFVERVBBVEggKz0gXAotICAgICQkU09V
UkNFX0RJUi9xdC9BcGkgXAotICAgICQkU09VUkNFX0RJUi9xdC9XZWJDb3JlU3VwcG9ydCBcCi0g
ICAgJCRST09UX1dFQktJVF9ESVIvU291cmNlL1dURi93dGYvcXQKLQotZW5hYmxlPyhERVZJQ0Vf
T1JJRU5UQVRJT04pfGVuYWJsZT8oT1JJRU5UQVRJT05fRVZFTlRTKSB7Ci0gICAgUVQgKz0gc2Vu
c29ycwotfQotCi1lbmFibGU/KEdFT0xPQ0FUSU9OKTogUVQgKz0gbG9jYXRpb24KLQotdXNlPyhR
VF9NVUxUSU1FRElBKTogUVQgKj0gbXVsdGltZWRpYXdpZGdldHMKLQotY29udGFpbnMoQ09ORklH
LCB0ZXhtYXApOiBERUZJTkVTICs9IFdURl9VU0VfVEVYVFVSRV9NQVBQRVI9MQotCi11c2U/KFBM
VUdJTl9CQUNLRU5EX1hMSUIpOiBQS0dDT05GSUcgKz0geDExCi0KLVFUICs9IG5ldHdvcmsgd2lk
Z2V0cwotaGF2ZT8oUVRRVUlDSyk6IFFUICs9IHF1aWNrCi1oYXZlPyhRVFBSSU5UU1VQUE9SVCk6
IFFUICs9IHByaW50c3VwcG9ydAotCi11c2U/KFRFWFRVUkVfTUFQUEVSX0dMKXxlbmFibGU/KFdF
QkdMKSB7Ci0gICAgUVQgKj0gb3BlbmdsCi19CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1dl
YktpdFdpZGdldHMucHJvIGIvU291cmNlL1dlYktpdC9XZWJLaXRXaWRnZXRzLnBybwppbmRleCA1
Y2E3NTQxOTJiNzQyMGY5OGZjZWIyZGI5ZGFlNTE1OTUzY2NjNWRkLi42ZWQ4ZmQ3YjgwMGViMzM2
ZDNkN2ZmODQwNTk3Zjg2N2U2OTIzYzU1IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L1dlYktp
dFdpZGdldHMucHJvCisrKyBiL1NvdXJjZS9XZWJLaXQvV2ViS2l0V2lkZ2V0cy5wcm8KQEAgLTEs
NjQgKzEsMTE5IEBACiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgVGFyZ2V0IGZpbGUgZm9yIHRoZSBXZWJLaXRX
aWRnZXRzIHN0YXRpYyBsaWJyYXJ5CisjIFRhcmdldCBmaWxlIGZvciB0aGUgUXRXZWJLaXRXaWRn
ZXRzIGR5bmFtaWMgbGlicmFyeQogIwogIyBTZWUgJ1Rvb2xzL3FtYWtlL1JFQURNRScgZm9yIGFu
IG92ZXJ2aWV3IG9mIHRoZSBidWlsZCBzeXN0ZW0KICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCisjIFVzZSBRdDUn
cyBtb2R1bGUgc3lzdGVtCitsb2FkKHF0X2J1aWxkX2NvbmZpZykKKwogVEVNUExBVEUgPSBsaWIK
LVRBUkdFVCA9IFdlYktpdFdpZGdldHMKK1RBUkdFVCA9IFF0V2ViS2l0V2lkZ2V0cworCitXRUJL
SVRfREVTVERJUiA9ICQke1JPT1RfQlVJTERfRElSfS9saWIKKworU09VUkNFX0RJUiA9ICQke1JP
T1RfV0VCS0lUX0RJUn0vU291cmNlL1dlYktpdAorCitJTkNMVURFUEFUSCArPSBcCisgICAgJCRT
T1VSQ0VfRElSL3F0L0FwaSBcCisgICAgJCRTT1VSQ0VfRElSL3F0L1dpZGdldEFwaSBcCisgICAg
JCRTT1VSQ0VfRElSL3F0L1dlYkNvcmVTdXBwb3J0IFwKKyAgICAkJFNPVVJDRV9ESVIvcXQvV2lk
Z2V0U3VwcG9ydCBcCisgICAgJCRST09UX1dFQktJVF9ESVIvU291cmNlL1dURi93dGYvcXQKKwor
ZW5hYmxlPyhERVZJQ0VfT1JJRU5UQVRJT04pfGVuYWJsZT8oT1JJRU5UQVRJT05fRVZFTlRTKSB7
CisgICAgUVQgKz0gc2Vuc29ycworfQorCitlbmFibGU/KEdFT0xPQ0FUSU9OKTogUVQgKz0gbG9j
YXRpb24KKwordXNlPyhRVF9NVUxUSU1FRElBKTogUVQgKj0gbXVsdGltZWRpYXdpZGdldHMKKwor
Y29udGFpbnMoQ09ORklHLCB0ZXhtYXApOiBERUZJTkVTICs9IFdURl9VU0VfVEVYVFVSRV9NQVBQ
RVI9MQorCit1c2U/KFBMVUdJTl9CQUNLRU5EX1hMSUIpOiBQS0dDT05GSUcgKz0geDExCisKK1FU
ICs9IG5ldHdvcmsgd2lkZ2V0cworaGF2ZT8oUVRRVUlDSyk6IFFUICs9IHF1aWNrCitoYXZlPyhR
VFBSSU5UU1VQUE9SVCk6IFFUICs9IHByaW50c3VwcG9ydAorCit1c2U/KFRFWFRVUkVfTUFQUEVS
X0dMKXxlbmFibGU/KFdFQkdMKSB7CisgICAgUVQgKj0gb3BlbmdsCit9CitRVCArPSB3ZWJraXQK
IAotaW5jbHVkZShXZWJLaXRXaWRnZXRzLnByaSkKK3VzZT8oM0RfR1JBUEhJQ1MpOiBXRUJLSVQg
Kz0gQU5HTEUKIAotV0VCS0lUICs9IHd0ZiBqYXZhc2NyaXB0Y29yZSB3ZWJjb3JlIHdlYmtpdDEK
LVFUICs9IGd1aQorV0VCS0lUICs9IGphdmFzY3JpcHRjb3JlIHd0ZiB3ZWJjb3JlCiAKLUNPTkZJ
RyArPSBzdGF0aWNsaWIKK01PRFVMRSA9IHdlYmtpdHdpZGdldHMKKworIyBXZSB3YW50IHRoZSBR
dFdlYktpdCBBUEkgZm9yd2FyZGluZyBpbmNsdWRlcyB0byBsaXZlIGluIHRoZSByb290IGJ1aWxk
IGRpci4KK01PRFVMRV9CQVNFX0RJUiA9ICQkX1BST19GSUxFX1BXRF8KK01PRFVMRV9CQVNFX09V
VERJUiA9ICQkUk9PVF9CVUlMRF9ESVIKKworIyBUaGlzIGlzIHRoZSBjYW5vbmljYWwgbGlzdCBv
ZiBkZXBlbmRlbmNpZXMgZm9yIHRoZSBwdWJsaWMgQVBJIG9mCisjIHRoZSBRdFdlYktpdFdpZGdl
dHMgbGlicmFyeSwgYW5kIHdpbGwgZW5kIHVwIGluIHRoZSBsaWJyYXJ5J3MgcHJsIGZpbGUuCitR
VF9BUElfREVQRU5EUyA9IGNvcmUgZ3VpIHdpZGdldHMgbmV0d29yayB3ZWJraXQKKworIyAtLS0t
LS0tLS0tLS0tLS0tIEN1c3RvbSBkZXZlbG9wZXItYnVpbGQgaGFuZGxpbmcgLS0tLS0tLS0tLS0t
LS0tLS0tLQorIworIyBUaGUgYXNzdW1wdGlvbiBmb3IgUXQgZGV2ZWxvcGVyIGJ1aWxkcyBpcyB0
aGF0IHRoZSBtb2R1bGUgZmlsZQorIyB3aWxsIGJlIHB1dCBpbnRvIHF0YmFzZS9ta3NwZWNzL21v
ZHVsZXMsIGFuZCB0aGUgbGlicmFyaWVzIGludG8KKyMgcXRiYXNlL2xpYiwgd2l0aCBycGF0aC9p
bnN0YWxsX25hbWUgc2V0IHRvIHRoZSBRdCBsaWIgZGlyLgorIworIyBGb3IgV2ViS2l0IHdlIGRv
bid0IHdhbnQgdGhhdCBiZWhhdmlvciBmb3IgdGhlIGxpYnJhcmllcywgYXMgd2Ugd2FudAorIyB0
aGVtIHRvIGJlIHNlbGYtY29udGFpbmVkIGluIHRoZSBXZWJLaXQgYnVpbGQgZGlyLgorIworQ09O
RklHICs9IGZvcmNlX2luZGVwZW5kZW50CisKK0JBU0VfVEFSR0VUID0gJCRUQVJHRVQKKworbG9h
ZChxdF9tb2R1bGUpCisKKyMgQWxsb3cgZG9pbmcgYSBkZWJ1Zy1vbmx5IGJ1aWxkIG9mIFdlYktp
dCAobm90IHN1cHBvcnRlZCBieSBRdCkKK21hY3g6IWRlYnVnX2FuZF9yZWxlYXNlOmRlYnVnOiBU
QVJHRVQgPSAkJEJBU0VfVEFSR0VUCiAKIFNPVVJDRVMgKz0gXAotICAgICQkUFdEL3F0L0FwaS9x
Z3JhcGhpY3N3ZWJ2aWV3LmNwcCBcCi0gICAgJCRQV0QvcXQvQXBpL3F3ZWJmcmFtZS5jcHAgXAot
ICAgICQkUFdEL3F0L0FwaS9xd2VicGFnZS5jcHAgXAotICAgICQkUFdEL3F0L0FwaS9xd2Vidmll
dy5jcHAgXAotICAgICQkUFdEL3F0L0FwaS9xd2VicGx1Z2luZGF0YWJhc2UuY3BwIFwKLSAgICAk
JFBXRC9xdC9BcGkvcXdlYmluc3BlY3Rvci5jcHAgXAotICAgICQkUFdEL3F0L0FwaS9xd2Via2l0
dmVyc2lvbi5jcHAgXAotICAgICQkUFdEL3F0L1dlYkNvcmVTdXBwb3J0L1F0RmFsbGJhY2tXZWJQ
b3B1cC5jcHAgXAotICAgICQkUFdEL3F0L1dlYkNvcmVTdXBwb3J0L1F0V2ViQ29tYm9Cb3guY3Bw
IFwKLSAgICAkJFBXRC9xdC9XZWJDb3JlU3VwcG9ydC9RV2ViVW5kb0NvbW1hbmQuY3BwIFwKLSAg
ICAkJFBXRC9xdC9XZWJDb3JlU3VwcG9ydC9EZWZhdWx0RnVsbFNjcmVlblZpZGVvSGFuZGxlci5j
cHAgXAotICAgICQkUFdEL3F0L1dlYkNvcmVTdXBwb3J0L0luaXRXZWJLaXRRdC5jcHAgXAotICAg
ICQkUFdEL3F0L1dlYkNvcmVTdXBwb3J0L0luc3BlY3RvckNsaWVudFdlYlBhZ2UuY3BwIFwKLSAg
ICAkJFBXRC9xdC9XZWJDb3JlU3VwcG9ydC9QYWdlQ2xpZW50UXQuY3BwIFwKLSAgICAkJFBXRC9x
dC9XZWJDb3JlU3VwcG9ydC9RU3R5bGVGYWNhZGVJbXAuY3BwIFwKLSAgICAkJFBXRC9xdC9XZWJD
b3JlU3VwcG9ydC9RR3JhcGhpY3NXaWRnZXRQbHVnaW5JbXBsLmNwcCBcCi0gICAgJCRQV0QvcXQv
V2ViQ29yZVN1cHBvcnQvUVdpZGdldFBsdWdpbkltcGwuY3BwCisgICAgJCRQV0QvcXQvV2lkZ2V0
QXBpL3FncmFwaGljc3dlYnZpZXcuY3BwIFwKKyAgICAkJFBXRC9xdC9XaWRnZXRBcGkvcXdlYmZy
YW1lLmNwcCBcCisgICAgJCRQV0QvcXQvV2lkZ2V0QXBpL3F3ZWJwYWdlLmNwcCBcCisgICAgJCRQ
V0QvcXQvV2lkZ2V0QXBpL3F3ZWJ2aWV3LmNwcCBcCisgICAgJCRQV0QvcXQvV2lkZ2V0QXBpL3F3
ZWJpbnNwZWN0b3IuY3BwIFwKKyAgICAkJFBXRC9xdC9XaWRnZXRTdXBwb3J0L1F0RmFsbGJhY2tX
ZWJQb3B1cC5jcHAgXAorICAgICQkUFdEL3F0L1dpZGdldFN1cHBvcnQvUXRXZWJDb21ib0JveC5j
cHAgXAorICAgICQkUFdEL3F0L1dpZGdldFN1cHBvcnQvUVdlYlVuZG9Db21tYW5kLmNwcCBcCisg
ICAgJCRQV0QvcXQvV2lkZ2V0U3VwcG9ydC9EZWZhdWx0RnVsbFNjcmVlblZpZGVvSGFuZGxlci5j
cHAgXAorICAgICQkUFdEL3F0L1dpZGdldFN1cHBvcnQvSW5pdFdlYktpdFF0LmNwcCBcCisgICAg
JCRQV0QvcXQvV2lkZ2V0U3VwcG9ydC9JbnNwZWN0b3JDbGllbnRXZWJQYWdlLmNwcCBcCisgICAg
JCRQV0QvcXQvV2lkZ2V0U3VwcG9ydC9QYWdlQ2xpZW50UXQuY3BwIFwKKyAgICAkJFBXRC9xdC9X
aWRnZXRTdXBwb3J0L1FTdHlsZUZhY2FkZUltcC5jcHAgXAorICAgICQkUFdEL3F0L1dpZGdldFN1
cHBvcnQvUUdyYXBoaWNzV2lkZ2V0UGx1Z2luSW1wbC5jcHAgXAorICAgICQkUFdEL3F0L1dpZGdl
dFN1cHBvcnQvUVdpZGdldFBsdWdpbkltcGwuY3BwCiAKIEhFQURFUlMgKz0gXAotICAgICQkUFdE
L3F0L0FwaS9xZ3JhcGhpY3N3ZWJ2aWV3LmggXAotICAgICQkUFdEL3F0L0FwaS9xd2ViZnJhbWUu
aCBcCi0gICAgJCRQV0QvcXQvQXBpL3F3ZWJmcmFtZV9wLmggXAotICAgICQkUFdEL3F0L0FwaS9x
d2Via2l0Z2xvYmFsLmggXAorICAgICQkUFdEL3F0L1dpZGdldEFwaS9xZ3JhcGhpY3N3ZWJ2aWV3
LmggXAorICAgICQkUFdEL3F0L1dpZGdldEFwaS9xd2ViZnJhbWUuaCBcCisgICAgJCRQV0QvcXQv
V2lkZ2V0QXBpL3F3ZWJmcmFtZV9wLmggXAorICAgICQkUFdEL3F0L1dpZGdldEFwaS9xd2VicGFn
ZS5oIFwKKyAgICAkJFBXRC9xdC9XaWRnZXRBcGkvcXdlYnBhZ2VfcC5oIFwKKyAgICAkJFBXRC9x
dC9XaWRnZXRBcGkvcXdlYnZpZXcuaCBcCisgICAgJCRQV0QvcXQvV2lkZ2V0QXBpL3F3ZWJpbnNw
ZWN0b3IuaCBcCiAgICAgJCRQV0QvcXQvQXBpL3F3ZWJraXRwbGF0Zm9ybXBsdWdpbi5oIFwKLSAg
ICAkJFBXRC9xdC9BcGkvcXdlYnBhZ2UuaCBcCi0gICAgJCRQV0QvcXQvQXBpL3F3ZWJwYWdlX3Au
aCBcCi0gICAgJCRQV0QvcXQvQXBpL3F3ZWJ2aWV3LmggXAotICAgICQkUFdEL3F0L0FwaS9xd2Vi
aW5zcGVjdG9yLmggXAotICAgICQkUFdEL3F0L0FwaS9xd2Via2l0dmVyc2lvbi5oIFwKLSAgICAk
JFBXRC9xdC9BcGkvcXdlYnBsdWdpbmRhdGFiYXNlX3AuaCBcCi0gICAgJCRQV0QvcXQvV2ViQ29y
ZVN1cHBvcnQvSW5pdFdlYktpdFF0LmggXAotICAgICQkUFdEL3F0L1dlYkNvcmVTdXBwb3J0L0lu
c3BlY3RvckNsaWVudFdlYlBhZ2UuaCBcCi0gICAgJCRQV0QvcXQvV2ViQ29yZVN1cHBvcnQvRGVm
YXVsdEZ1bGxTY3JlZW5WaWRlb0hhbmRsZXIuaCBcCi0gICAgJCRQV0QvcXQvV2ViQ29yZVN1cHBv
cnQvUXRGYWxsYmFja1dlYlBvcHVwLmggXAotICAgICQkUFdEL3F0L1dlYkNvcmVTdXBwb3J0L1F0
V2ViQ29tYm9Cb3guaCBcCi0gICAgJCRQV0QvcXQvV2ViQ29yZVN1cHBvcnQvUVdlYlVuZG9Db21t
YW5kLmggXAotICAgICQkUFdEL3F0L1dlYkNvcmVTdXBwb3J0L1BhZ2VDbGllbnRRdC5oIFwKLSAg
ICAkJFBXRC9xdC9XZWJDb3JlU3VwcG9ydC9RR3JhcGhpY3NXaWRnZXRQbHVnaW5JbXBsLmggXAot
ICAgICQkUFdEL3F0L1dlYkNvcmVTdXBwb3J0L1FTdHlsZUZhY2FkZUltcC5oIFwKLSAgICAkJFBX
RC9xdC9XZWJDb3JlU3VwcG9ydC9RV2lkZ2V0UGx1Z2luSW1wbC5oCisgICAgJCRQV0QvcXQvV2lk
Z2V0U3VwcG9ydC9Jbml0V2ViS2l0UXQuaCBcCisgICAgJCRQV0QvcXQvV2lkZ2V0U3VwcG9ydC9J
bnNwZWN0b3JDbGllbnRXZWJQYWdlLmggXAorICAgICQkUFdEL3F0L1dpZGdldFN1cHBvcnQvRGVm
YXVsdEZ1bGxTY3JlZW5WaWRlb0hhbmRsZXIuaCBcCisgICAgJCRQV0QvcXQvV2lkZ2V0U3VwcG9y
dC9RdEZhbGxiYWNrV2ViUG9wdXAuaCBcCisgICAgJCRQV0QvcXQvV2lkZ2V0U3VwcG9ydC9RdFdl
YkNvbWJvQm94LmggXAorICAgICQkUFdEL3F0L1dpZGdldFN1cHBvcnQvUVdlYlVuZG9Db21tYW5k
LmggXAorICAgICQkUFdEL3F0L1dpZGdldFN1cHBvcnQvUGFnZUNsaWVudFF0LmggXAorICAgICQk
UFdEL3F0L1dpZGdldFN1cHBvcnQvUUdyYXBoaWNzV2lkZ2V0UGx1Z2luSW1wbC5oIFwKKyAgICAk
JFBXRC9xdC9XaWRnZXRTdXBwb3J0L1FTdHlsZUZhY2FkZUltcC5oIFwKKyAgICAkJFBXRC9xdC9X
aWRnZXRTdXBwb3J0L1FXaWRnZXRQbHVnaW5JbXBsLmggXAogCiBjb250YWlucyhRVF9DT05GSUcs
IGFjY2Vzc2liaWxpdHkpIHsKLSAgICBTT1VSQ0VTICs9ICQkUFdEL3F0L0FwaS9xd2Vidmlld2Fj
Y2Vzc2libGUuY3BwCi0gICAgSEVBREVSUyArPSAkJFBXRC9xdC9BcGkvcXdlYnZpZXdhY2Nlc3Np
YmxlX3AuaCAKKyAgICBTT1VSQ0VTICs9ICQkUFdEL3F0L1dpZGdldEFwaS9xd2Vidmlld2FjY2Vz
c2libGUuY3BwCisgICAgSEVBREVSUyArPSAkJFBXRC9xdC9XaWRnZXRBcGkvcXdlYnZpZXdhY2Nl
c3NpYmxlX3AuaCAKIH0KIAogSU5DTFVERVBBVEggKz0gXApAQCAtNjcsOSArMTIyLDIyIEBAIElO
Q0xVREVQQVRIICs9IFwKIAogZW5hYmxlPyhWSURFTykgewogICAgICF1c2U/KFFUS0lUKTohdXNl
PyhHU1RSRUFNRVIpOnVzZT8oUVRfTVVMVElNRURJQSkgewotICAgICAgICBIRUFERVJTICs9ICQk
UFdEL3F0L1dlYkNvcmVTdXBwb3J0L0Z1bGxTY3JlZW5WaWRlb1dpZGdldC5oCi0gICAgICAgIFNP
VVJDRVMgKz0gJCRQV0QvcXQvV2ViQ29yZVN1cHBvcnQvRnVsbFNjcmVlblZpZGVvV2lkZ2V0LmNw
cAorICAgICAgICBIRUFERVJTICs9ICQkUFdEL3F0L1dpZGdldFN1cHBvcnQvRnVsbFNjcmVlblZp
ZGVvV2lkZ2V0LmgKKyAgICAgICAgU09VUkNFUyArPSAkJFBXRC9xdC9XaWRnZXRTdXBwb3J0L0Z1
bGxTY3JlZW5WaWRlb1dpZGdldC5jcHAKKyAgICB9Cit9CisKKyMjIyBMSUJTUExJVDogRklYTUUs
IHRoaXMgc2hvdWxkIGJlIHJlbW92ZWQgYWdhaW4uCittYWMgeworICAgICMgTWFjIE9TIGRvZXMg
c2hpcCBsaWJpY3UgYnV0IG5vdCB0aGUgYXNzb2NpYXRlZCBoZWFkZXIgZmlsZXMuCisgICAgIyBU
aGVyZWZvcmUgV2ViS2l0IHByb3ZpZGVzIGFkZXF1YXRlIGhlYWRlciBmaWxlcy4KKyAgICBJTkNM
VURFUEFUSCArPSAkJHtST09UX1dFQktJVF9ESVJ9L1NvdXJjZS9XVEYvaWN1CisgICAgTElCUyAr
PSAtbGljdWNvcmUKK30gZWxzZSB7CisgICAgY29udGFpbnMoUVRfQ09ORklHLGljdSkgeworICAg
ICAgICB3aW4zMjogTElCUyArPSAtbGljdWluIC1saWN1dWMgLWxpY3VkdAorICAgICAgICBlbHNl
OiBMSUJTICs9IC1saWN1aTE4biAtbGljdXVjIC1saWN1ZGF0YQogICAgIH0KIH0KIAotdXNlPygz
RF9HUkFQSElDUyk6IFdFQktJVCArPSBhbmdsZQorCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0
L3F0L0FwaS9xZ3JhcGhpY3N3ZWJ2aWV3LmNwcCBiL1NvdXJjZS9XZWJLaXQvcXQvQXBpL3FncmFw
aGljc3dlYnZpZXcuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGI0ZTgwMWJk
MWFjZGY2ZmZiZjczMjk2NGM5OGVjYWUzM2E0MTc1Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvcXQvQXBpL3FncmFwaGljc3dlYnZp
ZXcuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTE5NyArMCwwIEBACi0vKgotICAgIENvcHlyaWdo
dCAoQykgMjAwOSBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykK
LSAgICBDb3B5cmlnaHQgKEMpIDIwMDkgR2lyaXNoIFJhbWFrcmlzaG5hbiA8Z2lyaXNoQGZvcndh
cmRiaWFzLmluPgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4g
cmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2Yg
dGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQg
YnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9m
IHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0g
ICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBi
ZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl
IGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJl
Y2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQot
ICAgIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJ
ZiBub3QsIHdyaXRlIHRvCi0gICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwg
NTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKLSAgICBCb3N0b24sIE1BIDAyMTEwLTEz
MDEsIFVTQS4KLSovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJxZ3JhcGhpY3N3
ZWJ2aWV3LmgiCi0KLSNpZiAhZGVmaW5lZChRVF9OT19HUkFQSElDU1ZJRVcpCi0KLSNpbmNsdWRl
ICJxd2ViZnJhbWUuaCIKLSNpbmNsdWRlICJxd2ViZnJhbWVfcC5oIgotI2luY2x1ZGUgInF3ZWJw
YWdlLmgiCi0jaW5jbHVkZSAicXdlYnBhZ2VfcC5oIgotI2luY2x1ZGUgIlBhZ2UuaCIKLSNpbmNs
dWRlICJQYWdlQ2xpZW50UXQuaCIKLSNpbmNsdWRlICJGcmFtZS5oIgotI2luY2x1ZGUgIkZyYW1l
Vmlldy5oIgotI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgotI2luY2x1ZGUgIkludFJlY3Qu
aCIKLSNpbmNsdWRlICJUaWxlZEJhY2tpbmdTdG9yZS5oIgotI2luY2x1ZGUgPHFhcHBsaWNhdGlv
bi5oPgotI2luY2x1ZGUgPHFncmFwaGljc3NjZW5lLmg+Ci0jaW5jbHVkZSA8cWdyYXBoaWNzc2Nl
bmVldmVudC5oPgotI2luY2x1ZGUgPHFncmFwaGljc3ZpZXcuaD4KLSNpbmNsdWRlIDxxc2Nyb2xs
YmFyLmg+Ci0jaW5jbHVkZSA8cXN0eWxlb3B0aW9uLmg+Ci0jaW5jbHVkZSA8UXRDb3JlL3FtZXRh
b2JqZWN0Lmg+Ci0jaW5jbHVkZSA8UXRDb3JlL3FzaGFyZWRwb2ludGVyLmg+Ci0jaW5jbHVkZSA8
UXRDb3JlL3F0aW1lci5oPgotI2luY2x1ZGUgPFF0R3VpL3FwaXhtYXBjYWNoZS5oPgotCi0jaWYg
ZGVmaW5lZChRX1dTX1gxMSkKLSNpbmNsdWRlIDxRWDExSW5mbz4KLSNlbmRpZgotI2luY2x1ZGUg
PFNldHRpbmdzLmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwotCi1jbGFzcyBRR3JhcGhp
Y3NXZWJWaWV3UHJpdmF0ZSB7Ci1wdWJsaWM6Ci0gICAgUUdyYXBoaWNzV2ViVmlld1ByaXZhdGUo
UUdyYXBoaWNzV2ViVmlldyogcGFyZW50KQotICAgICAgICA6IHEocGFyZW50KQotICAgICAgICAs
IHBhZ2UoMCkKLSAgICAgICAgLCByZXNpemVzVG9Db250ZW50cyhmYWxzZSkKLSAgICAgICAgLCBy
ZW5kZXJIaW50cyhRUGFpbnRlcjo6VGV4dEFudGlhbGlhc2luZyB8IFFQYWludGVyOjpTbW9vdGhQ
aXhtYXBUcmFuc2Zvcm0pIHt9Ci0KLSAgICB2aXJ0dWFsIH5RR3JhcGhpY3NXZWJWaWV3UHJpdmF0
ZSgpOwotCi0gICAgdm9pZCBzeW5jTGF5ZXJzKCk7Ci0KLSAgICB2b2lkIHVwZGF0ZVJlc2l6ZXNU
b0NvbnRlbnRzRm9yUGFnZSgpOwotCi0gICAgdm9pZCBkZXRhY2hDdXJyZW50UGFnZSgpOwotCi0g
ICAgdm9pZCBfcV9kb0xvYWRGaW5pc2hlZChib29sIHN1Y2Nlc3MpOwotICAgIHZvaWQgX3FfY29u
dGVudHNTaXplQ2hhbmdlZChjb25zdCBRU2l6ZSYpOwotICAgIHZvaWQgX3Ffc2NhbGVDaGFuZ2Vk
KCk7Ci0KLSAgICB2b2lkIF9xX3BhZ2VEZXN0cm95ZWQoKTsKLQotICAgIFFHcmFwaGljc1dlYlZp
ZXcqIHE7Ci0gICAgUVdlYlBhZ2UqIHBhZ2U7Ci0gICAgYm9vbCByZXNpemVzVG9Db250ZW50czsK
LSAgICBRUGFpbnRlcjo6UmVuZGVySGludHMgcmVuZGVySGludHM7Ci0KLSAgICBRR3JhcGhpY3NJ
dGVtT3ZlcmxheSogb3ZlcmxheSgpIGNvbnN0Ci0gICAgewotICAgICAgICBpZiAoIXBhZ2UgfHwg
IXBhZ2UtPmQtPmNsaWVudCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICByZXR1cm4g
cGFnZUNsaWVudCgpLT5vdmVybGF5OwotICAgIH0KLQotICAgIFBhZ2VDbGllbnRRR3JhcGhpY3NX
aWRnZXQqIHBhZ2VDbGllbnQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19j
YXN0PFdlYkNvcmU6OlBhZ2VDbGllbnRRR3JhcGhpY3NXaWRnZXQqPiAocGFnZS0+ZC0+Y2xpZW50
LmRhdGEoKSk7Ci0gICAgfSAKLX07Ci0KLVFHcmFwaGljc1dlYlZpZXdQcml2YXRlOjp+UUdyYXBo
aWNzV2ViVmlld1ByaXZhdGUoKQotewotICAgIGRldGFjaEN1cnJlbnRQYWdlKCk7Ci19Ci0KLXZv
aWQgUUdyYXBoaWNzV2ViVmlld1ByaXZhdGU6OnN5bmNMYXllcnMoKQotewotI2lmIFVTRShBQ0NF
TEVSQVRFRF9DT01QT1NJVElORykKLSAgICBwYWdlQ2xpZW50KCktPnN5bmNMYXllcnMoKTsKLSNl
bmRpZgotfQotCi12b2lkIFFHcmFwaGljc1dlYlZpZXdQcml2YXRlOjpfcV9kb0xvYWRGaW5pc2hl
ZChib29sIHN1Y2Nlc3MpCi17Ci0gICAgLy8gSWYgdGhlIHBhZ2UgaGFkIG5vIHRpdGxlLCBzdGls
bCBtYWtlIHN1cmUgaXQgZ2V0cyB0aGUgc2lnbmFsCi0gICAgaWYgKHEtPnRpdGxlKCkuaXNFbXB0
eSgpKQotICAgICAgICBlbWl0IHEtPnVybENoYW5nZWQocS0+dXJsKCkpOwotCi0gICAgZW1pdCBx
LT5sb2FkRmluaXNoZWQoc3VjY2Vzcyk7Ci19Ci0KLXZvaWQgUUdyYXBoaWNzV2ViVmlld1ByaXZh
dGU6Ol9xX3BhZ2VEZXN0cm95ZWQoKQotewotICAgIHBhZ2UgPSAwOwotICAgIHEtPnNldFBhZ2Uo
MCk7Ci19Ci0KLXZvaWQgUUdyYXBoaWNzV2ViVmlld1ByaXZhdGU6OnVwZGF0ZVJlc2l6ZXNUb0Nv
bnRlbnRzRm9yUGFnZSgpCi17Ci0gICAgQVNTRVJUKHBhZ2UpOwotICAgIHBhZ2VDbGllbnQoKS0+
dmlld1Jlc2l6ZXNUb0NvbnRlbnRzID0gcmVzaXplc1RvQ29udGVudHM7Ci0gICAgaWYgKHJlc2l6
ZXNUb0NvbnRlbnRzKSB7Ci0gICAgICAgIC8vIHJlc2l6ZXMgdG8gY29udGVudHMgbW9kZSByZXF1
aXJlcyBwcmVmZXJyZWQgY29udGVudHMgc2l6ZSB0byBiZSBzZXQKLSAgICAgICAgaWYgKCFwYWdl
LT5wcmVmZXJyZWRDb250ZW50c1NpemUoKS5pc1ZhbGlkKCkpCi0gICAgICAgICAgICBwYWdlLT5z
ZXRQcmVmZXJyZWRDb250ZW50c1NpemUoUVNpemUoOTYwLCA4MDApKTsKLQotICAgICAgICBRT2Jq
ZWN0Ojpjb25uZWN0KHBhZ2UtPm1haW5GcmFtZSgpLCBTSUdOQUwoY29udGVudHNTaXplQ2hhbmdl
ZChRU2l6ZSkpLAotICAgICAgICAgICAgcSwgU0xPVChfcV9jb250ZW50c1NpemVDaGFuZ2VkKGNv
bnN0IFFTaXplJikpLCBRdDo6VW5pcXVlQ29ubmVjdGlvbik7Ci0gICAgfSBlbHNlIHsKLSAgICAg
ICAgUU9iamVjdDo6ZGlzY29ubmVjdChwYWdlLT5tYWluRnJhbWUoKSwgU0lHTkFMKGNvbnRlbnRz
U2l6ZUNoYW5nZWQoUVNpemUpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBxLCBTTE9UKF9x
X2NvbnRlbnRzU2l6ZUNoYW5nZWQoY29uc3QgUVNpemUmKSkpOwotICAgIH0KLSAgICBwYWdlLT5k
LT5wYWdlLT5tYWluRnJhbWUoKS0+dmlldygpLT5zZXRQYWludHNFbnRpcmVDb250ZW50cyhyZXNp
emVzVG9Db250ZW50cyk7Ci0gICAgcGFnZS0+ZC0+cGFnZS0+bWFpbkZyYW1lKCktPnZpZXcoKS0+
c2V0RGVsZWdhdGVzU2Nyb2xsaW5nKHJlc2l6ZXNUb0NvbnRlbnRzKTsKLX0KLQotdm9pZCBRR3Jh
cGhpY3NXZWJWaWV3UHJpdmF0ZTo6X3FfY29udGVudHNTaXplQ2hhbmdlZChjb25zdCBRU2l6ZSYg
c2l6ZSkKLXsKLSAgICBpZiAoIXJlc2l6ZXNUb0NvbnRlbnRzKQotICAgICAgICByZXR1cm47Ci0g
ICAgcS0+c2V0R2VvbWV0cnkoUVJlY3RGKHEtPmdlb21ldHJ5KCkudG9wTGVmdCgpLCBzaXplKSk7
Ci19Ci0KLXZvaWQgUUdyYXBoaWNzV2ViVmlld1ByaXZhdGU6Ol9xX3NjYWxlQ2hhbmdlZCgpCi17
Ci0jaWYgVVNFKFRJTEVEX0JBQ0tJTkdfU1RPUkUpCi0gICAgaWYgKCFwYWdlKQotICAgICAgICBy
ZXR1cm47Ci0gICAgcGFnZUNsaWVudCgpLT51cGRhdGVUaWxlZEJhY2tpbmdTdG9yZVNjYWxlKCk7
Ci0jZW5kaWYKLX0KLQotLyohCi0gICAgXGNsYXNzIFFHcmFwaGljc1dlYlZpZXcKLSAgICBcYnJp
ZWYgVGhlIFFHcmFwaGljc1dlYlZpZXcgY2xhc3MgYWxsb3dzIFdlYiBjb250ZW50IHRvIGJlIGFk
ZGVkIHRvIGEgR3JhcGhpY3NWaWV3LgotICAgIFxzaW5jZSA0LjYKLQotICAgIEFuIGluc3RhbmNl
IG9mIHRoaXMgY2xhc3MgcmVuZGVycyBXZWIgY29udGVudCBmcm9tIGEgVVJMIG9yIHN1cHBsaWVk
IGFzIGRhdGEsIHVzaW5nCi0gICAgZmVhdHVyZXMgb2YgdGhlIFF0V2ViS2l0IG1vZHVsZS4KLQot
ICAgIElmIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBpdGVtIGFyZSBub3Qgc2V0LCB0aGV5
IHdpbGwgZGVmYXVsdCB0byA4MDAgYW5kIDYwMCwKLSAgICByZXNwZWN0aXZlbHkuIElmIHRoZSBX
ZWIgcGFnZSBjb250ZW50cyBpcyBsYXJnZXIgdGhhbiB0aGF0LCBzY3JvbGxiYXJzIHdpbGwgYmUg
c2hvd24KLSAgICBpZiBub3QgZGlzYWJsZWQgZXhwbGljaXRseS4KLQotICAgIFxzZWN0aW9uMSBC
cm93c2VyIEZlYXR1cmVzCi0KLSAgICBNYW55IG9mIHRoZSBmdW5jdGlvbnMsIHNpZ25hbHMgYW5k
IHByb3BlcnRpZXMgcHJvdmlkZWQgYnkgUVdlYlZpZXcgYXJlIGFsc28gYXZhaWxhYmxlCi0gICAg
Zm9yIHRoaXMgaXRlbSwgbWFraW5nIGl0IHNpbXBsZSB0byBhZGFwdCBleGlzdGluZyBjb2RlIHRv
IHVzZSBRR3JhcGhpY3NXZWJWaWV3IGluc3RlYWQKLSAgICBvZiBRV2ViVmlldy4KLQotICAgIFRo
ZSBpdGVtIHVzZXMgYSBRV2ViUGFnZSBvYmplY3QgdG8gcGVyZm9ybSB0aGUgcmVuZGVyaW5nIG9m
IFdlYiBjb250ZW50LCBhbmQgdGhpcyBjYW4KLSAgICBiZSBvYnRhaW5lZCB3aXRoIHRoZSBwYWdl
KCkgZnVuY3Rpb24sIGVuYWJsaW5nIHRoZSBkb2N1bWVudCBpdHNlbGYgdG8gYmUgYWNjZXNzZWQg
YW5kCi0gICAgbW9kaWZpZWQuCi0KLSAgICBBcyB3aXRoIFFXZWJWaWV3LCB0aGUgaXRlbSByZWNv
cmRzIHRoZSBicm93c2luZyBoaXN0b3J5IHVzaW5nIGEgUVdlYkhpc3Rvcnkgb2JqZWN0LAotICAg
IGFjY2Vzc2libGUgdXNpbmcgdGhlIGhpc3RvcnkoKSBmdW5jdGlvbi4gVGhlIFFXZWJTZXR0aW5n
cyBvYmplY3QgdGhhdCBkZWZpbmVzIHRoZQotICAgIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGJyb3dz
ZXIgY2FuIGJlIG9idGFpbmVkIHdpdGggdGhlIHNldHRpbmdzKCkgZnVuY3Rpb24sIGVuYWJsaW5n
Ci0gICAgZmVhdHVyZXMgbGlrZSBwbHVnaW4gc3VwcG9ydCB0byBiZSBjdXN0b21pemVkIGZvciBl
YWNoIGl0ZW0uCi0KLSAgICBcc2EgUVdlYlZpZXcsIFFHcmFwaGljc1RleHRJdGVtCi0qLwotCi0v
KiEKLSAgICBcZm4gdm9pZCBRR3JhcGhpY3NXZWJWaWV3Ojp0aXRsZUNoYW5nZWQoY29uc3QgUVN0
cmluZyAmdGl0bGUpCi0KLSAgICBUaGlzIHNpZ25hbCBpcyBlbWl0dGVkIHdoZW5ldmVyIHRoZSBc
YSB0aXRsZSBvZiB0aGUgbWFpbiBmcmFtZSBjaGFuZ2VzLgotCi0gICAgXHNhIHRpdGxlKCkKLSov
Ci0KLS8qIQotICAgIFxmbiB2b2lkIFFHcmFwaGljc1dlYlZpZXc6OnVybENoYW5nZWQoY29uc3Qg
UVVybCAmdXJsKQotCi0gICAgVGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuIHRoZSBcYSB1cmwg
b2YgdGhlIHZpZXcgY2hhbmdlcy4KLQotICAgIFxzYSB1cmwoKSwgbG9hZCgpCi0qLwotCi0vKiEK
LSAgICBcZm4gdm9pZCBRR3JhcGhpY3NXZWJWaWV3OjppY29uQ2hhbmdlZCgpCi0KLSAgICBUaGlz
IHNpZ25hbCBpcyBlbWl0dGVkIHdoZW5ldmVyIHRoZSBpY29uIG9mIHRoZSBwYWdlIGlzIGxvYWRl
ZCBvciBjaGFuZ2VzLgotCi0gICAgSW4gb3JkZXIgZm9yIGljb25zIHRvIGJlIGxvYWRlZCwgeW91
IHdpbGwgbmVlZCB0byBzZXQgYW4gaWNvbiBkYXRhYmFzZSBwYXRoCi0gICAgdXNpbmcgUVdlYlNl
dHRpbmdzOjpzZXRJY29uRGF0YWJhc2VQYXRoKCkuCi0KLSAgICBcc2EgaWNvbigpLCBRV2ViU2V0
dGluZ3M6OnNldEljb25EYXRhYmFzZVBhdGgoKQotKi8KLQotLyohCi0gICAgXGZuIHZvaWQgUUdy
YXBoaWNzV2ViVmlldzo6bG9hZFN0YXJ0ZWQoKQotCi0gICAgVGhpcyBzaWduYWwgaXMgZW1pdHRl
ZCB3aGVuIGEgbmV3IGxvYWQgb2YgdGhlIHBhZ2UgaXMgc3RhcnRlZC4KLQotICAgIFxzYSBsb2Fk
UHJvZ3Jlc3MoKSwgbG9hZEZpbmlzaGVkKCkKLSovCi0KLS8qIQotICAgIFxmbiB2b2lkIFFHcmFw
aGljc1dlYlZpZXc6OmxvYWRGaW5pc2hlZChib29sIG9rKQotCi0gICAgVGhpcyBzaWduYWwgaXMg
ZW1pdHRlZCB3aGVuIGEgbG9hZCBvZiB0aGUgcGFnZSBpcyBmaW5pc2hlZC4KLSAgICBcYSBvayB3
aWxsIGluZGljYXRlIHdoZXRoZXIgdGhlIGxvYWQgd2FzIHN1Y2Nlc3NmdWwgb3IgYW55IGVycm9y
IG9jY3VycmVkLgotCi0gICAgXHNhIGxvYWRTdGFydGVkKCkKLSovCi0KLS8qIQotICAgIENvbnN0
cnVjdHMgYW4gZW1wdHkgUUdyYXBoaWNzV2ViVmlldyB3aXRoIHBhcmVudCBcYSBwYXJlbnQuCi0K
LSAgICBcc2EgbG9hZCgpCi0qLwotUUdyYXBoaWNzV2ViVmlldzo6UUdyYXBoaWNzV2ViVmlldyhR
R3JhcGhpY3NJdGVtKiBwYXJlbnQpCi0gICAgOiBRR3JhcGhpY3NXaWRnZXQocGFyZW50KQotICAg
ICwgZChuZXcgUUdyYXBoaWNzV2ViVmlld1ByaXZhdGUodGhpcykpCi17Ci0gICAgc2V0RmxhZyhR
R3JhcGhpY3NJdGVtOjpJdGVtVXNlc0V4dGVuZGVkU3R5bGVPcHRpb24sIHRydWUpOwotICAgIHNl
dEFjY2VwdERyb3BzKHRydWUpOwotICAgIHNldEFjY2VwdEhvdmVyRXZlbnRzKHRydWUpOwotICAg
IHNldEFjY2VwdFRvdWNoRXZlbnRzKHRydWUpOwotICAgIHNldEZvY3VzUG9saWN5KFF0OjpTdHJv
bmdGb2N1cyk7Ci0gICAgc2V0RmxhZyhRR3JhcGhpY3NJdGVtOjpJdGVtQ2xpcHNDaGlsZHJlblRv
U2hhcGUsIHRydWUpOwotI2lmIFVTRShUSUxFRF9CQUNLSU5HX1NUT1JFKQotICAgIFFPYmplY3Q6
OmNvbm5lY3QodGhpcywgU0lHTkFMKHNjYWxlQ2hhbmdlZCgpKSwgdGhpcywgU0xPVChfcV9zY2Fs
ZUNoYW5nZWQoKSkpOwotI2VuZGlmCi19Ci0KLS8qIQotICAgIERlc3Ryb3lzIHRoZSBpdGVtLgot
Ki8KLVFHcmFwaGljc1dlYlZpZXc6On5RR3JhcGhpY3NXZWJWaWV3KCkKLXsKLSAgICBkZWxldGUg
ZDsKLX0KLQotLyohCi0gICAgUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHVuZGVybHlpbmcgd2Vi
IHBhZ2UuCi0KLSAgICBcc2Egc2V0UGFnZSgpCi0qLwotUVdlYlBhZ2UqIFFHcmFwaGljc1dlYlZp
ZXc6OnBhZ2UoKSBjb25zdAotewotICAgIGlmICghZC0+cGFnZSkgewotICAgICAgICBRR3JhcGhp
Y3NXZWJWaWV3KiB0aGF0ID0gY29uc3RfY2FzdDxRR3JhcGhpY3NXZWJWaWV3Kj4odGhpcyk7Ci0g
ICAgICAgIFFXZWJQYWdlKiBwYWdlID0gbmV3IFFXZWJQYWdlKHRoYXQpOwotCi0gICAgICAgIC8v
IERlZmF1bHQgdG8gbm90IGhhdmluZyBhIGJhY2tncm91bmQsIGluIHRoZSBjYXNlCi0gICAgICAg
IC8vIHRoZSBwYWdlIGRvZXNuJ3QgcHJvdmlkZSBvbmUuCi0gICAgICAgIFFQYWxldHRlIHBhbGV0
dGUgPSBRQXBwbGljYXRpb246OnBhbGV0dGUoKTsKLSAgICAgICAgcGFsZXR0ZS5zZXRCcnVzaChR
UGFsZXR0ZTo6QmFzZSwgUUNvbG9yOjpmcm9tUmdiRigwLCAwLCAwLCAwKSk7Ci0gICAgICAgIHBh
Z2UtPnNldFBhbGV0dGUocGFsZXR0ZSk7Ci0KLSAgICAgICAgdGhhdC0+c2V0UGFnZShwYWdlKTsK
LSAgICB9Ci0KLSAgICByZXR1cm4gZC0+cGFnZTsKLX0KLQotLyohIFxyZWltcAotKi8KLXZvaWQg
UUdyYXBoaWNzV2ViVmlldzo6cGFpbnQoUVBhaW50ZXIqIHBhaW50ZXIsIGNvbnN0IFFTdHlsZU9w
dGlvbkdyYXBoaWNzSXRlbSogb3B0aW9uLCBRV2lkZ2V0KikKLXsKLSAgICBRUGFpbnRlcjo6UmVu
ZGVySGludHMgb2xkSGludHMgPSBwYWludGVyLT5yZW5kZXJIaW50cygpOwotICAgIHBhaW50ZXIt
PnNldFJlbmRlckhpbnRzKG9sZEhpbnRzIHwgZC0+cmVuZGVySGludHMpOwotI2lmIFVTRShUSUxF
RF9CQUNLSU5HX1NUT1JFKQotICAgIGlmIChXZWJDb3JlOjpUaWxlZEJhY2tpbmdTdG9yZSogYmFj
a2luZ1N0b3JlID0gUVdlYkZyYW1lUHJpdmF0ZTo6Y29yZShwYWdlKCktPm1haW5GcmFtZSgpKS0+
dGlsZWRCYWNraW5nU3RvcmUoKSkgewotICAgICAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIHNldCB0
aGUgYmFja2luZyBzdG9yZSB2aWV3cG9ydCBlYXJsaWVyIHRoYW4gaW4gcGFpbnQKLSAgICAgICAg
YmFja2luZ1N0b3JlLT5jb3ZlcldpdGhUaWxlc0lmTmVlZGVkKCk7Ci0gICAgICAgIC8vIFFXZWJG
cmFtZTo6cmVuZGVyIGlzIGEgcHVibGljIEFQSSwgYnlwYXNzIGl0IGZvciB0aWxlZCByZW5kZXJp
bmcgc28gYmVoYXZpb3IgZG9lcyBub3QgbmVlZCB0byBjaGFuZ2UuCi0gICAgICAgIFdlYkNvcmU6
OkdyYXBoaWNzQ29udGV4dCBjb250ZXh0KHBhaW50ZXIpOwotICAgICAgICBwYWdlKCktPm1haW5G
cmFtZSgpLT5kLT5yZW5kZXJGcm9tVGlsZWRCYWNraW5nU3RvcmUoJmNvbnRleHQsIG9wdGlvbi0+
ZXhwb3NlZFJlY3QudG9BbGlnbmVkUmVjdCgpKTsKLSAgICAgICAgcGFpbnRlci0+c2V0UmVuZGVy
SGludHMob2xkSGludHMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotI2VuZGlmCi0gICAgcGFn
ZSgpLT5tYWluRnJhbWUoKS0+cmVuZGVyKHBhaW50ZXIsIFFXZWJGcmFtZTo6QWxsTGF5ZXJzLCBv
cHRpb24tPmV4cG9zZWRSZWN0LnRvUmVjdCgpKTsKLSAgICBwYWludGVyLT5zZXRSZW5kZXJIaW50
cyhvbGRIaW50cyk7Ci19Ci0KLS8qISBccmVpbXAKLSovCi1ib29sIFFHcmFwaGljc1dlYlZpZXc6
OnNjZW5lRXZlbnQoUUV2ZW50KiBldmVudCkKLXsKLSAgICAvLyBSZS1pbXBsZW1lbnRlZCBpbiBv
cmRlciB0byBhbGxvd3MgZml4aW5nIGV2ZW50LXJlbGF0ZWQgYnVncyBpbiBwYXRjaCByZWxlYXNl
cy4KLQotICAgIGlmIChkLT5wYWdlICYmIChldmVudC0+dHlwZSgpID09IFFFdmVudDo6VG91Y2hC
ZWdpbgotICAgICAgICAgICAgICAgIHx8IGV2ZW50LT50eXBlKCkgPT0gUUV2ZW50OjpUb3VjaEVu
ZAotICAgICAgICAgICAgICAgIHx8IGV2ZW50LT50eXBlKCkgPT0gUUV2ZW50OjpUb3VjaFVwZGF0
ZQotICAgICAgICAgICAgICAgIHx8IGV2ZW50LT50eXBlKCkgPT0gUUV2ZW50OjpUb3VjaENhbmNl
bAotICAgICAgICkpIHsKLSAgICAgICAgZC0+cGFnZS0+ZXZlbnQoZXZlbnQpOwotCi0gICAgICAg
IC8vIEFsd2F5cyByZXR1cm4gdHJ1ZSBzbyB0aGF0IHdlJ2xsIHJlY2VpdmUgYWxzbyBUb3VjaFVw
ZGF0ZSBhbmQgVG91Y2hFbmQgZXZlbnRzCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQot
ICAgIHJldHVybiBRR3JhcGhpY3NXaWRnZXQ6OnNjZW5lRXZlbnQoZXZlbnQpOwotfQotCi0vKiEg
XHJlaW1wCi0qLwotUVZhcmlhbnQgUUdyYXBoaWNzV2ViVmlldzo6aXRlbUNoYW5nZShHcmFwaGlj
c0l0ZW1DaGFuZ2UgY2hhbmdlLCBjb25zdCBRVmFyaWFudCYgdmFsdWUpCi17Ci0gICAgc3dpdGNo
IChjaGFuZ2UpIHsKLSAgICAvLyBEaWZmZXJlbnRseSBmcm9tIFFXZWJWaWV3LCBpdCBpcyBpbnRl
cmVzdGluZyB0byBRR3JhcGhpY3NXZWJWaWV3IHRvIGhhbmRsZQotICAgIC8vIHBvc3QgbW91c2Ug
Y3Vyc29yIGNoYW5nZSBub3RpZmljYXRpb25zLiBSZWFzb246ICdJdGVtQ3Vyc29yQ2hhbmdlJyBp
cyBzZW50Ci0gICAgLy8gYXMgdGhlIGZpcnN0IGFjdGlvbiBpbiBRR3JhcGhpY3NJdGVtOjpzZXRD
dXJzb3IgaW1wbGVtZW50YXRpb24sIGFuZCBhdCB0aGF0Ci0gICAgLy8gaXRlbSB3aWRnZXQncyBj
dXJzb3IgaGFzIG5vdCBiZWVuIGVmZmVjdGl2ZWx5IGNoYW5nZWQgeWV0LgotICAgIC8vIEFmdGVy
IGN1cnNvciBpcyBwcm9wZXJseSBzZXQgKGF0ICdJdGVtQ3Vyc29ySGFzQ2hhbmdlZCcgZW1pc3Np
b24gdGltZSksIHdlCi0gICAgLy8gZmlyZSAnQ3Vyc29yQ2hhbmdlJy4KLSAgICBjYXNlIEl0ZW1D
dXJzb3JDaGFuZ2U6Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICBjYXNlIEl0ZW1DdXJzb3JI
YXNDaGFuZ2VkOiB7Ci0gICAgICAgICAgICBRRXZlbnQgZXZlbnQoUUV2ZW50OjpDdXJzb3JDaGFu
Z2UpOwotICAgICAgICAgICAgUUFwcGxpY2F0aW9uOjpzZW5kRXZlbnQodGhpcywgJmV2ZW50KTsK
LSAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgfQotICAgIGRlZmF1bHQ6Ci0gICAg
ICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiBRR3JhcGhpY3NXaWRnZXQ6Oml0ZW1DaGFu
Z2UoY2hhbmdlLCB2YWx1ZSk7Ci19Ci0KLS8qISBccmVpbXAKLSovCi1RU2l6ZUYgUUdyYXBoaWNz
V2ViVmlldzo6c2l6ZUhpbnQoUXQ6OlNpemVIaW50IHdoaWNoLCBjb25zdCBRU2l6ZUYmIGNvbnN0
cmFpbnQpIGNvbnN0Ci17Ci0gICAgaWYgKHdoaWNoID09IFF0OjpQcmVmZXJyZWRTaXplKQotICAg
ICAgICByZXR1cm4gUVNpemVGKDgwMCwgNjAwKTsgLy8gIyMjCi0gICAgcmV0dXJuIFFHcmFwaGlj
c1dpZGdldDo6c2l6ZUhpbnQod2hpY2gsIGNvbnN0cmFpbnQpOwotfQotCi0vKiEgXHJlaW1wCi0q
LwotUVZhcmlhbnQgUUdyYXBoaWNzV2ViVmlldzo6aW5wdXRNZXRob2RRdWVyeShRdDo6SW5wdXRN
ZXRob2RRdWVyeSBxdWVyeSkgY29uc3QKLXsKLSAgICBpZiAoZC0+cGFnZSkKLSAgICAgICAgcmV0
dXJuIGQtPnBhZ2UtPmlucHV0TWV0aG9kUXVlcnkocXVlcnkpOwotICAgIHJldHVybiBRVmFyaWFu
dCgpOwotfQotCi0vKiEKLSAgICBccHJvcGVydHkgUUdyYXBoaWNzV2ViVmlldzo6cmVuZGVySGlu
dHMKLSAgICBcc2luY2UgNC44Ci0gICAgXGJyaWVmIHRoZSBkZWZhdWx0IHJlbmRlciBoaW50cyBm
b3IgdGhlIHZpZXcKLQotICAgIFRoZXNlIGhpbnRzIGFyZSB1c2VkIHRvIGluaXRpYWxpemUgUVBh
aW50ZXIgYmVmb3JlIHBhaW50aW5nIHRoZSBXZWIgcGFnZS4KLQotICAgIFFQYWludGVyOjpUZXh0
QW50aWFsaWFzaW5nIGFuZCBRUGFpbnRlcjo6U21vb3RoUGl4bWFwVHJhbnNmb3JtIGFyZSBlbmFi
bGVkIGJ5IGRlZmF1bHQgYW5kIHdpbGwgYmUKLSAgICB1c2VkIHRvIHJlbmRlciB0aGUgaXRlbSBp
biBhZGRpdGlvbiBvZiB3aGF0IGhhcyBiZWVuIHNldCBvbiB0aGUgcGFpbnRlciBnaXZlbiBieSBR
R3JhcGhpY3NTY2VuZS4KLQotICAgIFxzYSBRUGFpbnRlcjo6cmVuZGVySGludHMoKQotKi8KLQot
LyohCi0gICAgXHNpbmNlIDQuOAotICAgIFJldHVybnMgdGhlIHJlbmRlciBoaW50cyB1c2VkIGJ5
IHRoZSB2aWV3IHRvIHJlbmRlciBjb250ZW50LgotCi0gICAgXHNhIFFQYWludGVyOjpyZW5kZXJI
aW50cygpCi0qLwotUVBhaW50ZXI6OlJlbmRlckhpbnRzIFFHcmFwaGljc1dlYlZpZXc6OnJlbmRl
ckhpbnRzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZC0+cmVuZGVySGludHM7Ci19Ci0KLS8qIQot
ICAgIFxzaW5jZSA0LjgKLSAgICBTZXRzIHRoZSByZW5kZXIgaGludHMgdXNlZCBieSB0aGUgdmll
dyB0byB0aGUgc3BlY2lmaWVkIFxhIGhpbnRzLgotCi0gICAgXHNhIFFQYWludGVyOjpzZXRSZW5k
ZXJIaW50cygpCi0qLwotdm9pZCBRR3JhcGhpY3NXZWJWaWV3OjpzZXRSZW5kZXJIaW50cyhRUGFp
bnRlcjo6UmVuZGVySGludHMgaGludHMpCi17Ci0gICAgaWYgKGhpbnRzID09IGQtPnJlbmRlckhp
bnRzKQotICAgICAgICByZXR1cm47Ci0gICAgZC0+cmVuZGVySGludHMgPSBoaW50czsKLSAgICB1
cGRhdGUoKTsKLX0KLQotLyohCi0gICAgXHNpbmNlIDQuOAotICAgIElmIFxhIGVuYWJsZWQgaXMg
dHJ1ZSwgZW5hYmxlcyB0aGUgc3BlY2lmaWVkIHJlbmRlciBcYSBoaW50OyBvdGhlcndpc2UKLSAg
ICBkaXNhYmxlcyBpdC4KLQotICAgIFxzYSByZW5kZXJIaW50cywgUVBhaW50ZXI6OnJlbmRlckhp
bnRzKCkKLSovCi12b2lkIFFHcmFwaGljc1dlYlZpZXc6OnNldFJlbmRlckhpbnQoUVBhaW50ZXI6
OlJlbmRlckhpbnQgaGludCwgYm9vbCBlbmFibGVkKQotewotICAgIFFQYWludGVyOjpSZW5kZXJI
aW50cyBvbGRIaW50cyA9IGQtPnJlbmRlckhpbnRzOwotICAgIGlmIChlbmFibGVkKQotICAgICAg
ICBkLT5yZW5kZXJIaW50cyB8PSBoaW50OwotICAgIGVsc2UKLSAgICAgICAgZC0+cmVuZGVySGlu
dHMgJj0gfmhpbnQ7Ci0gICAgaWYgKG9sZEhpbnRzICE9IGQtPnJlbmRlckhpbnRzKQotICAgICAg
ICB1cGRhdGUoKTsKLX0KLQotLyohIFxyZWltcAotKi8KLWJvb2wgUUdyYXBoaWNzV2ViVmlldzo6
ZXZlbnQoUUV2ZW50KiBldmVudCkKLXsKLSAgICAvLyBSZS1pbXBsZW1lbnRlZCBpbiBvcmRlciB0
byBhbGxvd3MgZml4aW5nIGV2ZW50LXJlbGF0ZWQgYnVncyBpbiBwYXRjaCByZWxlYXNlcy4KLQot
ICAgIGlmIChkLT5wYWdlKSB7Ci0gICAgICAgIGlmIChldmVudC0+dHlwZSgpID09IFFFdmVudDo6
UGFsZXR0ZUNoYW5nZSkKLSAgICAgICAgICAgIGQtPnBhZ2UtPnNldFBhbGV0dGUocGFsZXR0ZSgp
KTsKLSNpZm5kZWYgUVRfTk9fQ09OVEVYVE1FTlUKLSAgICAgICAgaWYgKGV2ZW50LT50eXBlKCkg
PT0gUUV2ZW50OjpHcmFwaGljc1NjZW5lQ29udGV4dE1lbnUpIHsKLSAgICAgICAgICAgIGlmICgh
aXNFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAg
ICBRR3JhcGhpY3NTY2VuZUNvbnRleHRNZW51RXZlbnQqIGV2ID0gc3RhdGljX2Nhc3Q8UUdyYXBo
aWNzU2NlbmVDb250ZXh0TWVudUV2ZW50Kj4oZXZlbnQpOwotICAgICAgICAgICAgUUNvbnRleHRN
ZW51RXZlbnQgZmFrZUV2ZW50KFFDb250ZXh0TWVudUV2ZW50OjpSZWFzb24oZXYtPnJlYXNvbigp
KSwgZXYtPnBvcygpLnRvUG9pbnQoKSk7Ci0gICAgICAgICAgICBpZiAoZC0+cGFnZS0+c3dhbGxv
d0NvbnRleHRNZW51RXZlbnQoJmZha2VFdmVudCkpIHsKLSAgICAgICAgICAgICAgICBldmVudC0+
YWNjZXB0KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0g
ICAgICAgICAgICBkLT5wYWdlLT51cGRhdGVQb3NpdGlvbkRlcGVuZGVudEFjdGlvbnMoZmFrZUV2
ZW50LnBvcygpKTsKLSAgICAgICAgfSBlbHNlCi0jZW5kaWYgLy8gUVRfTk9fQ09OVEVYVE1FTlUK
LSAgICAgICAgewotI2lmbmRlZiBRVF9OT19DVVJTT1IKLSAgICAgICAgICAgIGlmIChldmVudC0+
dHlwZSgpID09IFFFdmVudDo6Q3Vyc29yQ2hhbmdlKSB7Ci0gICAgICAgICAgICAgICAgLy8gQW4g
dW5zZXRDdXJzb3Igd2lsbCBzZXQgdGhlIGN1cnNvciB0byBRdDo6QXJyb3dDdXJzb3IuCi0gICAg
ICAgICAgICAgICAgLy8gVGh1cyB0aGlzIGN1cnNvciBjaGFuZ2UgbWlnaHQgYmUgYSBRV2lkZ2V0
Ojp1bnNldEN1cnNvcigpCi0gICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBub3QgdGhlIGNh
c2UgYW5kIGl0IGNhbWUgZnJvbSBXZWJDb3JlLCB0aGUKLSAgICAgICAgICAgICAgICAvLyBRV2Vi
UGFnZUNsaWVudCBhbHJlYWR5IGhhcyBzZXQgaXRzIGN1cnNvciBpbnRlcm5hbGx5Ci0gICAgICAg
ICAgICAgICAgLy8gdG8gUXQ6OkFycm93Q3Vyc29yLCBzbyB1cGRhdGluZyB0aGUgY3Vyc29yIGlz
IGFsd2F5cwotICAgICAgICAgICAgICAgIC8vIHJpZ2h0LCBhcyBpdCBmYWxscyBiYWNrIHRvIHRo
ZSBsYXN0IGN1cnNvciBzZXQgYnkKLSAgICAgICAgICAgICAgICAvLyBXZWJDb3JlLgotICAgICAg
ICAgICAgICAgIC8vIEZJWE1FOiBBZGQgYSBRRXZlbnQ6OkN1cnNvclVuc2V0IG9yIHNpbWlsYXIg
dG8gUXQuCi0gICAgICAgICAgICAgICAgaWYgKGN1cnNvcigpLnNoYXBlKCkgPT0gUXQ6OkFycm93
Q3Vyc29yKQotICAgICAgICAgICAgICAgICAgICBkLT5wYWdlLT5kLT5jbGllbnQtPnJlc2V0Q3Vy
c29yKCk7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1
cm4gUUdyYXBoaWNzV2lkZ2V0OjpldmVudChldmVudCk7Ci19Ci0KLXZvaWQgUUdyYXBoaWNzV2Vi
Vmlld1ByaXZhdGU6OmRldGFjaEN1cnJlbnRQYWdlKCkKLXsKLSAgICBpZiAoIXBhZ2UpCi0gICAg
ICAgIHJldHVybjsKLQotICAgIHBhZ2UtPmQtPnZpZXcgPSAwOwotICAgIHBhZ2UtPmQtPmNsaWVu
dC5yZXNldCgpOwotCi0gICAgLy8gaWYgdGhlIHBhZ2Ugd2FzIGNyZWF0ZWQgYnkgdXMsIHdlIG93
biBpdCBhbmQgbmVlZCB0bwotICAgIC8vIGRlc3Ryb3kgaXQgYXMgd2VsbC4KLQotICAgIGlmIChw
YWdlLT5wYXJlbnQoKSA9PSBxKQotICAgICAgICBkZWxldGUgcGFnZTsKLSAgICBlbHNlCi0gICAg
ICAgIHBhZ2UtPmRpc2Nvbm5lY3QocSk7Ci0KLSAgICBwYWdlID0gMDsKLX0KLQotLyohCi0gICAg
TWFrZXMgXGEgcGFnZSB0aGUgbmV3IHdlYiBwYWdlIG9mIHRoZSB3ZWIgZ3JhcGhpY3NpdGVtLgot
Ci0gICAgVGhlIHBhcmVudCBRT2JqZWN0IG9mIHRoZSBwcm92aWRlZCBwYWdlIHJlbWFpbnMgdGhl
IG93bmVyCi0gICAgb2YgdGhlIG9iamVjdC4gSWYgdGhlIGN1cnJlbnQgZG9jdW1lbnQgaXMgYSBj
aGlsZCBvZiB0aGUgd2ViCi0gICAgdmlldywgaXQgd2lsbCBiZSBkZWxldGVkLgotCi0gICAgXHNh
IHBhZ2UoKQotKi8KLXZvaWQgUUdyYXBoaWNzV2ViVmlldzo6c2V0UGFnZShRV2ViUGFnZSogcGFn
ZSkKLXsKLSAgICBpZiAoZC0+cGFnZSA9PSBwYWdlKQotICAgICAgICByZXR1cm47Ci0KLSAgICBk
LT5kZXRhY2hDdXJyZW50UGFnZSgpOwotICAgIGQtPnBhZ2UgPSBwYWdlOwotCi0gICAgaWYgKCFk
LT5wYWdlKQotICAgICAgICByZXR1cm47Ci0KLSAgICBkLT5wYWdlLT5kLT5jbGllbnQucmVzZXQo
bmV3IFBhZ2VDbGllbnRRR3JhcGhpY3NXaWRnZXQodGhpcywgcGFnZSkpOwotCi0gICAgaWYgKGQt
Pm92ZXJsYXkoKSkKLSAgICAgICAgZC0+b3ZlcmxheSgpLT5wcmVwYXJlR3JhcGhpY3NJdGVtR2Vv
bWV0cnlDaGFuZ2UoKTsKLQotICAgIFFTaXplIHNpemUgPSBnZW9tZXRyeSgpLnNpemUoKS50b1Np
emUoKTsKLSAgICBwYWdlLT5zZXRWaWV3cG9ydFNpemUoc2l6ZSk7Ci0KLSAgICBpZiAoZC0+cmVz
aXplc1RvQ29udGVudHMpCi0gICAgICAgIGQtPnVwZGF0ZVJlc2l6ZXNUb0NvbnRlbnRzRm9yUGFn
ZSgpOwotCi0gICAgUVdlYkZyYW1lKiBtYWluRnJhbWUgPSBkLT5wYWdlLT5tYWluRnJhbWUoKTsK
LQotICAgIGNvbm5lY3QobWFpbkZyYW1lLCBTSUdOQUwodGl0bGVDaGFuZ2VkKFFTdHJpbmcpKSwK
LSAgICAgICAgICAgIHRoaXMsIFNJR05BTCh0aXRsZUNoYW5nZWQoUVN0cmluZykpKTsKLSAgICBj
b25uZWN0KG1haW5GcmFtZSwgU0lHTkFMKGljb25DaGFuZ2VkKCkpLAotICAgICAgICAgICAgdGhp
cywgU0lHTkFMKGljb25DaGFuZ2VkKCkpKTsKLSAgICBjb25uZWN0KG1haW5GcmFtZSwgU0lHTkFM
KHVybENoYW5nZWQoUVVybCkpLAotICAgICAgICAgICAgdGhpcywgU0lHTkFMKHVybENoYW5nZWQo
UVVybCkpKTsKLSAgICBjb25uZWN0KGQtPnBhZ2UsIFNJR05BTChsb2FkU3RhcnRlZCgpKSwKLSAg
ICAgICAgICAgIHRoaXMsIFNJR05BTChsb2FkU3RhcnRlZCgpKSk7Ci0gICAgY29ubmVjdChkLT5w
YWdlLCBTSUdOQUwobG9hZFByb2dyZXNzKGludCkpLAotICAgICAgICAgICAgdGhpcywgU0lHTkFM
KGxvYWRQcm9ncmVzcyhpbnQpKSk7Ci0gICAgY29ubmVjdChkLT5wYWdlLCBTSUdOQUwobG9hZEZp
bmlzaGVkKGJvb2wpKSwKLSAgICAgICAgICAgIHRoaXMsIFNMT1QoX3FfZG9Mb2FkRmluaXNoZWQo
Ym9vbCkpKTsKLSAgICBjb25uZWN0KGQtPnBhZ2UsIFNJR05BTChzdGF0dXNCYXJNZXNzYWdlKFFT
dHJpbmcpKSwKLSAgICAgICAgICAgIHRoaXMsIFNJR05BTChzdGF0dXNCYXJNZXNzYWdlKFFTdHJp
bmcpKSk7Ci0gICAgY29ubmVjdChkLT5wYWdlLCBTSUdOQUwobGlua0NsaWNrZWQoUVVybCkpLAot
ICAgICAgICAgICAgdGhpcywgU0lHTkFMKGxpbmtDbGlja2VkKFFVcmwpKSk7Ci0gICAgY29ubmVj
dChkLT5wYWdlLCBTSUdOQUwoZGVzdHJveWVkKCkpLAotICAgICAgICAgICAgdGhpcywgU0xPVChf
cV9wYWdlRGVzdHJveWVkKCkpKTsKLSNpZiAhZGVmaW5lZChRVF9OT19JTSkgJiYgKGRlZmluZWQo
UV9XU19YMTEpIHx8IGRlZmluZWQoUV9XU19RV1MpKQotICAgIGNvbm5lY3QoZC0+cGFnZSwgU0lH
TkFMKG1pY3JvRm9jdXNDaGFuZ2VkKCkpLAotICAgICAgICAgICAgdGhpcywgU0xPVCh1cGRhdGVN
aWNyb0ZvY3VzKCkpKTsKLSNlbmRpZgotfQotCi0vKiEKLSAgICBccHJvcGVydHkgUUdyYXBoaWNz
V2ViVmlldzo6dXJsCi0gICAgXGJyaWVmIHRoZSB1cmwgb2YgdGhlIHdlYiBwYWdlIGN1cnJlbnRs
eSB2aWV3ZWQKLQotICAgIFNldHRpbmcgdGhpcyBwcm9wZXJ0eSBjbGVhcnMgdGhlIHZpZXcgYW5k
IGxvYWRzIHRoZSBVUkwuCi0KLSAgICBCeSBkZWZhdWx0LCB0aGlzIHByb3BlcnR5IGNvbnRhaW5z
IGFuIGVtcHR5LCBpbnZhbGlkIFVSTC4KLQotICAgIFxzYSBsb2FkKCksIHVybENoYW5nZWQoKQot
Ki8KLQotdm9pZCBRR3JhcGhpY3NXZWJWaWV3OjpzZXRVcmwoY29uc3QgUVVybCAmdXJsKQotewot
ICAgIHBhZ2UoKS0+bWFpbkZyYW1lKCktPnNldFVybCh1cmwpOwotfQotCi1RVXJsIFFHcmFwaGlj
c1dlYlZpZXc6OnVybCgpIGNvbnN0Ci17Ci0gICAgaWYgKGQtPnBhZ2UpCi0gICAgICAgIHJldHVy
biBkLT5wYWdlLT5tYWluRnJhbWUoKS0+dXJsKCk7Ci0KLSAgICByZXR1cm4gUVVybCgpOwotfQot
Ci0vKiEKLSAgICBccHJvcGVydHkgUUdyYXBoaWNzV2ViVmlldzo6dGl0bGUKLSAgICBcYnJpZWYg
dGhlIHRpdGxlIG9mIHRoZSB3ZWIgcGFnZSBjdXJyZW50bHkgdmlld2VkCi0KLSAgICBCeSBkZWZh
dWx0LCB0aGlzIHByb3BlcnR5IGNvbnRhaW5zIGFuIGVtcHR5IHN0cmluZy4KLQotICAgIFxzYSB0
aXRsZUNoYW5nZWQoKQotKi8KLVFTdHJpbmcgUUdyYXBoaWNzV2ViVmlldzo6dGl0bGUoKSBjb25z
dAotewotICAgIGlmIChkLT5wYWdlKQotICAgICAgICByZXR1cm4gZC0+cGFnZS0+bWFpbkZyYW1l
KCktPnRpdGxlKCk7Ci0KLSAgICByZXR1cm4gUVN0cmluZygpOwotfQotCi0vKiEKLSAgICBccHJv
cGVydHkgUUdyYXBoaWNzV2ViVmlldzo6aWNvbgotICAgIFxicmllZiB0aGUgaWNvbiBhc3NvY2lh
dGVkIHdpdGggdGhlIHdlYiBwYWdlIGN1cnJlbnRseSB2aWV3ZWQKLQotICAgIEJ5IGRlZmF1bHQs
IHRoaXMgcHJvcGVydHkgY29udGFpbnMgYSBudWxsIGljb24uCi0KLSAgICBcc2EgaWNvbkNoYW5n
ZWQoKSwgUVdlYlNldHRpbmdzOjppY29uRm9yVXJsKCkKLSovCi1RSWNvbiBRR3JhcGhpY3NXZWJW
aWV3OjppY29uKCkgY29uc3QKLXsKLSAgICBpZiAoZC0+cGFnZSkKLSAgICAgICAgcmV0dXJuIGQt
PnBhZ2UtPm1haW5GcmFtZSgpLT5pY29uKCk7Ci0KLSAgICByZXR1cm4gUUljb24oKTsKLX0KLQot
LyohCi0gICAgXHByb3BlcnR5IFFHcmFwaGljc1dlYlZpZXc6Onpvb21GYWN0b3IKLSAgICBcYnJp
ZWYgdGhlIHpvb20gZmFjdG9yIGZvciB0aGUgdmlldwotKi8KLQotdm9pZCBRR3JhcGhpY3NXZWJW
aWV3OjpzZXRab29tRmFjdG9yKHFyZWFsIGZhY3RvcikKLXsKLSAgICBpZiAoZmFjdG9yID09IHBh
Z2UoKS0+bWFpbkZyYW1lKCktPnpvb21GYWN0b3IoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAg
cGFnZSgpLT5tYWluRnJhbWUoKS0+c2V0Wm9vbUZhY3RvcihmYWN0b3IpOwotfQotCi1xcmVhbCBR
R3JhcGhpY3NXZWJWaWV3Ojp6b29tRmFjdG9yKCkgY29uc3QKLXsKLSAgICByZXR1cm4gcGFnZSgp
LT5tYWluRnJhbWUoKS0+em9vbUZhY3RvcigpOwotfQotCi0vKiEgXHJlaW1wCi0qLwotdm9pZCBR
R3JhcGhpY3NXZWJWaWV3Ojp1cGRhdGVHZW9tZXRyeSgpCi17Ci0gICAgaWYgKGQtPm92ZXJsYXko
KSkKLSAgICAgICAgZC0+b3ZlcmxheSgpLT5wcmVwYXJlR3JhcGhpY3NJdGVtR2VvbWV0cnlDaGFu
Z2UoKTsKLQotICAgIFFHcmFwaGljc1dpZGdldDo6dXBkYXRlR2VvbWV0cnkoKTsKLQotICAgIGlm
ICghZC0+cGFnZSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgUVNpemUgc2l6ZSA9IGdlb21ldHJ5
KCkuc2l6ZSgpLnRvU2l6ZSgpOwotICAgIGQtPnBhZ2UtPnNldFZpZXdwb3J0U2l6ZShzaXplKTsK
LX0KLQotLyohIFxyZWltcAotKi8KLXZvaWQgUUdyYXBoaWNzV2ViVmlldzo6c2V0R2VvbWV0cnko
Y29uc3QgUVJlY3RGJiByZWN0KQotewotICAgIFFHcmFwaGljc1dpZGdldDo6c2V0R2VvbWV0cnko
cmVjdCk7Ci0KLSAgICBpZiAoZC0+b3ZlcmxheSgpKQotICAgICAgICBkLT5vdmVybGF5KCktPnBy
ZXBhcmVHcmFwaGljc0l0ZW1HZW9tZXRyeUNoYW5nZSgpOwotCi0gICAgaWYgKCFkLT5wYWdlKQot
ICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBOT1RFOiBjYWxsIGdlb21ldHJ5KCkgYXMgc2V0R2Vv
bWV0cnkgZW5zdXJlcyB0aGF0Ci0gICAgLy8gdGhlIGdlb21ldHJ5IGlzIHdpdGhpbiBsZWdhbCBi
b3VuZHMgKG1pbmltdW1TaXplLCBtYXhpbXVtU2l6ZSkKLSAgICBRU2l6ZSBzaXplID0gZ2VvbWV0
cnkoKS5zaXplKCkudG9TaXplKCk7Ci0gICAgZC0+cGFnZS0+c2V0Vmlld3BvcnRTaXplKHNpemUp
OwotfQotCi0vKiEKLSAgICBDb252ZW5pZW5jZSBzbG90IHRoYXQgc3RvcHMgbG9hZGluZyB0aGUg
ZG9jdW1lbnQuCi0KLSAgICBcc2EgcmVsb2FkKCksIGxvYWRGaW5pc2hlZCgpCi0qLwotdm9pZCBR
R3JhcGhpY3NXZWJWaWV3OjpzdG9wKCkKLXsKLSAgICBpZiAoZC0+cGFnZSkKLSAgICAgICAgZC0+
cGFnZS0+dHJpZ2dlckFjdGlvbihRV2ViUGFnZTo6U3RvcCk7Ci19Ci0KLS8qIQotICAgIENvbnZl
bmllbmNlIHNsb3QgdGhhdCBsb2FkcyB0aGUgcHJldmlvdXMgZG9jdW1lbnQgaW4gdGhlIGxpc3Qg
b2YgZG9jdW1lbnRzCi0gICAgYnVpbHQgYnkgbmF2aWdhdGluZyBsaW5rcy4gRG9lcyBub3RoaW5n
IGlmIHRoZXJlIGlzIG5vIHByZXZpb3VzIGRvY3VtZW50LgotCi0gICAgXHNhIGZvcndhcmQoKQot
Ki8KLXZvaWQgUUdyYXBoaWNzV2ViVmlldzo6YmFjaygpCi17Ci0gICAgaWYgKGQtPnBhZ2UpCi0g
ICAgICAgIGQtPnBhZ2UtPnRyaWdnZXJBY3Rpb24oUVdlYlBhZ2U6OkJhY2spOwotfQotCi0vKiEK
LSAgICBDb252ZW5pZW5jZSBzbG90IHRoYXQgbG9hZHMgdGhlIG5leHQgZG9jdW1lbnQgaW4gdGhl
IGxpc3Qgb2YgZG9jdW1lbnRzCi0gICAgYnVpbHQgYnkgbmF2aWdhdGluZyBsaW5rcy4gRG9lcyBu
b3RoaW5nIGlmIHRoZXJlIGlzIG5vIG5leHQgZG9jdW1lbnQuCi0KLSAgICBcc2EgYmFjaygpCi0q
Lwotdm9pZCBRR3JhcGhpY3NXZWJWaWV3Ojpmb3J3YXJkKCkKLXsKLSAgICBpZiAoZC0+cGFnZSkK
LSAgICAgICAgZC0+cGFnZS0+dHJpZ2dlckFjdGlvbihRV2ViUGFnZTo6Rm9yd2FyZCk7Ci19Ci0K
LS8qIQotICAgIFJlbG9hZHMgdGhlIGN1cnJlbnQgZG9jdW1lbnQuCi0KLSAgICBcc2Egc3RvcCgp
LCBsb2FkU3RhcnRlZCgpCi0qLwotdm9pZCBRR3JhcGhpY3NXZWJWaWV3OjpyZWxvYWQoKQotewot
ICAgIGlmIChkLT5wYWdlKQotICAgICAgICBkLT5wYWdlLT50cmlnZ2VyQWN0aW9uKFFXZWJQYWdl
OjpSZWxvYWQpOwotfQotCi0vKiEKLSAgICBMb2FkcyB0aGUgc3BlY2lmaWVkIFxhIHVybCBhbmQg
ZGlzcGxheXMgaXQuCi0KLSAgICBcbm90ZSBUaGUgdmlldyByZW1haW5zIHRoZSBzYW1lIHVudGls
IGVub3VnaCBkYXRhIGhhcyBhcnJpdmVkIHRvIGRpc3BsYXkgdGhlIG5ldyBcYSB1cmwuCi0KLSAg
ICBcc2Egc2V0VXJsKCksIHVybCgpLCB1cmxDaGFuZ2VkKCkKLSovCi12b2lkIFFHcmFwaGljc1dl
YlZpZXc6OmxvYWQoY29uc3QgUVVybCYgdXJsKQotewotICAgIHBhZ2UoKS0+bWFpbkZyYW1lKCkt
PmxvYWQodXJsKTsKLX0KLQotLyohCi0gICAgXGZuIHZvaWQgUUdyYXBoaWNzV2ViVmlldzo6bG9h
ZChjb25zdCBRTmV0d29ya1JlcXVlc3QgJnJlcXVlc3QsIFFOZXR3b3JrQWNjZXNzTWFuYWdlcjo6
T3BlcmF0aW9uIG9wZXJhdGlvbiwgY29uc3QgUUJ5dGVBcnJheSAmYm9keSkKLQotICAgIExvYWRz
IGEgbmV0d29yayByZXF1ZXN0LCBcYSByZXF1ZXN0LCB1c2luZyB0aGUgbWV0aG9kIHNwZWNpZmll
ZCBpbiBcYSBvcGVyYXRpb24uCi0KLSAgICBcYSBib2R5IGlzIG9wdGlvbmFsIGFuZCBpcyBvbmx5
IHVzZWQgZm9yIFBPU1Qgb3BlcmF0aW9ucy4KLQotICAgIFxub3RlIFRoZSB2aWV3IHJlbWFpbnMg
dGhlIHNhbWUgdW50aWwgZW5vdWdoIGRhdGEgaGFzIGFycml2ZWQgdG8gZGlzcGxheSB0aGUgbmV3
IHVybC4KLQotICAgIFxzYSB1cmwoKSwgdXJsQ2hhbmdlZCgpCi0qLwotCi12b2lkIFFHcmFwaGlj
c1dlYlZpZXc6OmxvYWQoY29uc3QgUU5ldHdvcmtSZXF1ZXN0JiByZXF1ZXN0LAotICAgICAgICAg
ICAgICAgICAgICBRTmV0d29ya0FjY2Vzc01hbmFnZXI6Ok9wZXJhdGlvbiBvcGVyYXRpb24sCi0g
ICAgICAgICAgICAgICAgICAgIGNvbnN0IFFCeXRlQXJyYXkmIGJvZHkpCi17Ci0gICAgcGFnZSgp
LT5tYWluRnJhbWUoKS0+bG9hZChyZXF1ZXN0LCBvcGVyYXRpb24sIGJvZHkpOwotfQotCi0vKiEK
LSAgICBTZXRzIHRoZSBjb250ZW50IG9mIHRoZSB3ZWIgdmlldyB0byB0aGUgc3BlY2lmaWVkIFxh
IGh0bWwuCi0KLSAgICBFeHRlcm5hbCBvYmplY3RzIHN1Y2ggYXMgc3R5bGVzaGVldHMgb3IgaW1h
Z2VzIHJlZmVyZW5jZWQgaW4gdGhlIEhUTUwKLSAgICBkb2N1bWVudCBhcmUgbG9jYXRlZCByZWxh
dGl2ZSB0byBcYSBiYXNlVXJsLgotCi0gICAgVGhlIFxhIGh0bWwgaXMgbG9hZGVkIGltbWVkaWF0
ZWx5OyBleHRlcm5hbCBvYmplY3RzIGFyZSBsb2FkZWQgYXN5bmNocm9ub3VzbHkuCi0KLSAgICBX
aGVuIHVzaW5nIHRoaXMgbWV0aG9kLCBXZWJLaXQgYXNzdW1lcyB0aGF0IGV4dGVybmFsIHJlc291
cmNlcyBzdWNoIGFzCi0gICAgSmF2YVNjcmlwdCBwcm9ncmFtcyBvciBzdHlsZSBzaGVldHMgYXJl
IGVuY29kZWQgaW4gVVRGLTggdW5sZXNzIG90aGVyd2lzZQotICAgIHNwZWNpZmllZC4gRm9yIGV4
YW1wbGUsIHRoZSBlbmNvZGluZyBvZiBhbiBleHRlcm5hbCBzY3JpcHQgY2FuIGJlIHNwZWNpZmll
ZAotICAgIHRocm91Z2ggdGhlIGNoYXJzZXQgYXR0cmlidXRlIG9mIHRoZSBIVE1MIHNjcmlwdCB0
YWcuIEFsdGVybmF0aXZlbHksIHRoZQotICAgIGVuY29kaW5nIGNhbiBhbHNvIGJlIHNwZWNpZmll
ZCBieSB0aGUgd2ViIHNlcnZlci4KLQotICAgIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBmdW5jdGlv
biBlcXVpdmFsZW50IHRvIHNldENvbnRlbnQoaHRtbCwgInRleHQvaHRtbCIsIGJhc2VVcmwpLgot
Ci0gICAgXHdhcm5pbmcgVGhpcyBmdW5jdGlvbiB3b3JrcyBvbmx5IGZvciBIVE1MLCBmb3Igb3Ro
ZXIgbWltZSB0eXBlcyAoaS5lLiBYSFRNTCwgU1ZHKQotICAgIHNldENvbnRlbnQoKSBzaG91bGQg
YmUgdXNlZCBpbnN0ZWFkLgotCi0gICAgXHNhIGxvYWQoKSwgc2V0Q29udGVudCgpLCBRV2ViRnJh
bWU6OnRvSHRtbCgpLCBRV2ViRnJhbWU6OnNldENvbnRlbnQoKQotKi8KLXZvaWQgUUdyYXBoaWNz
V2ViVmlldzo6c2V0SHRtbChjb25zdCBRU3RyaW5nJiBodG1sLCBjb25zdCBRVXJsJiBiYXNlVXJs
KQotewotICAgIHBhZ2UoKS0+bWFpbkZyYW1lKCktPnNldEh0bWwoaHRtbCwgYmFzZVVybCk7Ci19
Ci0KLS8qIQotICAgIFNldHMgdGhlIGNvbnRlbnQgb2YgdGhlIHdlYiBncmFwaGljc2l0ZW0gdG8g
dGhlIHNwZWNpZmllZCBjb250ZW50IFxhIGRhdGEuIElmIHRoZSBcYSBtaW1lVHlwZSBhcmd1bWVu
dAotICAgIGlzIGVtcHR5IGl0IGlzIGN1cnJlbnRseSBhc3N1bWVkIHRoYXQgdGhlIGNvbnRlbnQg
aXMgSFRNTCBidXQgaW4gZnV0dXJlIHZlcnNpb25zIHdlIG1heSBpbnRyb2R1Y2UKLSAgICBhdXRv
LWRldGVjdGlvbi4KLQotICAgIEV4dGVybmFsIG9iamVjdHMgcmVmZXJlbmNlZCBpbiB0aGUgY29u
dGVudCBhcmUgbG9jYXRlZCByZWxhdGl2ZSB0byBcYSBiYXNlVXJsLgotCi0gICAgVGhlIFxhIGRh
dGEgaXMgbG9hZGVkIGltbWVkaWF0ZWx5OyBleHRlcm5hbCBvYmplY3RzIGFyZSBsb2FkZWQgYXN5
bmNocm9ub3VzbHkuCi0KLSAgICBcc2EgbG9hZCgpLCBzZXRIdG1sKCksIFFXZWJGcmFtZTo6dG9I
dG1sKCkKLSovCi12b2lkIFFHcmFwaGljc1dlYlZpZXc6OnNldENvbnRlbnQoY29uc3QgUUJ5dGVB
cnJheSYgZGF0YSwgY29uc3QgUVN0cmluZyYgbWltZVR5cGUsIGNvbnN0IFFVcmwmIGJhc2VVcmwp
Ci17Ci0gICAgcGFnZSgpLT5tYWluRnJhbWUoKS0+c2V0Q29udGVudChkYXRhLCBtaW1lVHlwZSwg
YmFzZVVybCk7Ci19Ci0KLS8qIQotICAgIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSB2aWV3J3Mg
aGlzdG9yeSBvZiBuYXZpZ2F0ZWQgd2ViIHBhZ2VzLgotCi0gICAgSXQgaXMgZXF1aXZhbGVudCB0
bwotCi0gICAgXHNuaXBwZXQgd2Via2l0c25pcHBldHMvcXR3ZWJraXRfcXdlYnZpZXdfc25pcHBl
dC5jcHAgMAotKi8KLVFXZWJIaXN0b3J5KiBRR3JhcGhpY3NXZWJWaWV3OjpoaXN0b3J5KCkgY29u
c3QKLXsKLSAgICByZXR1cm4gcGFnZSgpLT5oaXN0b3J5KCk7Ci19Ci0KLS8qIQotICAgIFxwcm9w
ZXJ0eSBRR3JhcGhpY3NXZWJWaWV3Ojptb2RpZmllZAotICAgIFxicmllZiB3aGV0aGVyIHRoZSBk
b2N1bWVudCB3YXMgbW9kaWZpZWQgYnkgdGhlIHVzZXIKLQotICAgIFBhcnRzIG9mIEhUTUwgZG9j
dW1lbnRzIGNhbiBiZSBlZGl0YWJsZSBmb3IgZXhhbXBsZSB0aHJvdWdoIHRoZQotICAgIFxje2Nv
bnRlbnRlZGl0YWJsZX0gYXR0cmlidXRlIG9uIEhUTUwgZWxlbWVudHMuCi0KLSAgICBCeSBkZWZh
dWx0LCB0aGlzIHByb3BlcnR5IGlzIGZhbHNlLgotKi8KLWJvb2wgUUdyYXBoaWNzV2ViVmlldzo6
aXNNb2RpZmllZCgpIGNvbnN0Ci17Ci0gICAgaWYgKGQtPnBhZ2UpCi0gICAgICAgIHJldHVybiBk
LT5wYWdlLT5pc01vZGlmaWVkKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiEKLSAgICBS
ZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgdmlldy9wYWdlIHNwZWNpZmljIHNldHRpbmdzIG9iamVj
dC4KLQotICAgIEl0IGlzIGVxdWl2YWxlbnQgdG8KLQotICAgIFxzbmlwcGV0IHdlYmtpdHNuaXBw
ZXRzL3F0d2Via2l0X3F3ZWJ2aWV3X3NuaXBwZXQuY3BwIDEKLQotICAgIFxzYSBRV2ViU2V0dGlu
Z3M6Omdsb2JhbFNldHRpbmdzKCkKLSovCi1RV2ViU2V0dGluZ3MqIFFHcmFwaGljc1dlYlZpZXc6
OnNldHRpbmdzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gcGFnZSgpLT5zZXR0aW5ncygpOwotfQot
Ci0vKiEKLSAgICBSZXR1cm5zIGEgcG9pbnRlciB0byBhIFFBY3Rpb24gdGhhdCBlbmNhcHN1bGF0
ZXMgdGhlIHNwZWNpZmllZCB3ZWIgYWN0aW9uIFxhIGFjdGlvbi4KLSovCi1RQWN0aW9uICpRR3Jh
cGhpY3NXZWJWaWV3OjpwYWdlQWN0aW9uKFFXZWJQYWdlOjpXZWJBY3Rpb24gYWN0aW9uKSBjb25z
dAotewotI2lmZGVmIFFUX05PX0FDVElPTgotICAgIFFfVU5VU0VEKGFjdGlvbikKLSAgICByZXR1
cm4gMDsKLSNlbHNlCi0gICAgcmV0dXJuIHBhZ2UoKS0+YWN0aW9uKGFjdGlvbik7Ci0jZW5kaWYK
LX0KLQotLyohCi0gICAgVHJpZ2dlcnMgdGhlIHNwZWNpZmllZCBcYSBhY3Rpb24uIElmIGl0IGlz
IGEgY2hlY2thYmxlIGFjdGlvbiB0aGUgc3BlY2lmaWVkCi0gICAgXGEgY2hlY2tlZCBzdGF0ZSBp
cyBhc3N1bWVkLgotCi0gICAgXHNhIHBhZ2VBY3Rpb24oKQotKi8KLXZvaWQgUUdyYXBoaWNzV2Vi
Vmlldzo6dHJpZ2dlclBhZ2VBY3Rpb24oUVdlYlBhZ2U6OldlYkFjdGlvbiBhY3Rpb24sIGJvb2wg
Y2hlY2tlZCkKLXsKLSAgICBwYWdlKCktPnRyaWdnZXJBY3Rpb24oYWN0aW9uLCBjaGVja2VkKTsK
LX0KLQotLyohCi0gICAgRmluZHMgdGhlIHNwZWNpZmllZCBzdHJpbmcsIFxhIHN1YlN0cmluZywg
aW4gdGhlIHBhZ2UsIHVzaW5nIHRoZSBnaXZlbiBcYSBvcHRpb25zLgotCi0gICAgSWYgdGhlIEhp
Z2hsaWdodEFsbE9jY3VycmVuY2VzIGZsYWcgaXMgcGFzc2VkLCB0aGUgZnVuY3Rpb24gd2lsbCBo
aWdobGlnaHQgYWxsIG9jY3VycmVuY2VzCi0gICAgdGhhdCBleGlzdCBpbiB0aGUgcGFnZS4gQWxs
IHN1YnNlcXVlbnQgY2FsbHMgd2lsbCBleHRlbmQgdGhlIGhpZ2hsaWdodCwgcmF0aGVyIHRoYW4K
LSAgICByZXBsYWNlIGl0LCB3aXRoIG9jY3VycmVuY2VzIG9mIHRoZSBuZXcgc3RyaW5nLgotCi0g
ICAgSWYgdGhlIEhpZ2hsaWdodEFsbE9jY3VycmVuY2VzIGZsYWcgaXMgbm90IHBhc3NlZCwgdGhl
IGZ1bmN0aW9uIHdpbGwgc2VsZWN0IGFuIG9jY3VycmVuY2UKLSAgICBhbmQgYWxsIHN1YnNlcXVl
bnQgY2FsbHMgd2lsbCByZXBsYWNlIHRoZSBjdXJyZW50IG9jY3VycmVuY2Ugd2l0aCB0aGUgbmV4
dCBvbmUuCi0KLSAgICBUbyBjbGVhciB0aGUgc2VsZWN0aW9uLCBqdXN0IHBhc3MgYW4gZW1wdHkg
c3RyaW5nLgotCi0gICAgUmV0dXJucyB0cnVlIGlmIFxhIHN1YlN0cmluZyB3YXMgZm91bmQ7IG90
aGVyd2lzZSByZXR1cm5zIGZhbHNlLgotCi0gICAgXHNhIFFXZWJQYWdlOjpzZWxlY3RlZFRleHQo
KSwgUVdlYlBhZ2U6OnNlbGVjdGlvbkNoYW5nZWQoKQotKi8KLWJvb2wgUUdyYXBoaWNzV2ViVmll
dzo6ZmluZFRleHQoY29uc3QgUVN0cmluZyAmc3ViU3RyaW5nLCBRV2ViUGFnZTo6RmluZEZsYWdz
IG9wdGlvbnMpCi17Ci0gICAgaWYgKGQtPnBhZ2UpCi0gICAgICAgIHJldHVybiBkLT5wYWdlLT5m
aW5kVGV4dChzdWJTdHJpbmcsIG9wdGlvbnMpOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoh
Ci0gICAgXHByb3BlcnR5IFFHcmFwaGljc1dlYlZpZXc6OnJlc2l6ZXNUb0NvbnRlbnRzCi0gICAg
XGJyaWVmIHdoZXRoZXIgdGhlIHNpemUgb2YgdGhlIFFHcmFwaGljc1dlYlZpZXcgYW5kIGl0cyB2
aWV3cG9ydCBjaGFuZ2VzIHRvIG1hdGNoIHRoZSBjb250ZW50cyBzaXplCi0gICAgXHNpbmNlIDQu
NyAKLQotICAgIElmIHRoaXMgcHJvcGVydHkgaXMgc2V0LCB0aGUgUUdyYXBoaWNzV2ViVmlldyB3
aWxsIGF1dG9tYXRpY2FsbHkgY2hhbmdlIGl0cwotICAgIHNpemUgdG8gbWF0Y2ggdGhlIHNpemUg
b2YgdGhlIG1haW4gZnJhbWUgY29udGVudHMuIEFzIGEgcmVzdWx0IHRoZSB0b3AgbGV2ZWwgZnJh
bWUKLSAgICB3aWxsIG5ldmVyIGhhdmUgc2Nyb2xsYmFycy4gSXQgd2lsbCBhbHNvIG1ha2UgQ1NT
IGZpeGVkIHBvc2l0aW9uaW5nIHRvIGJlaGF2ZSBsaWtlIGFic29sdXRlIHBvc2l0aW9uaW5nCi0g
ICAgd2l0aCBlbGVtZW50cyBwb3NpdGlvbmVkIHJlbGF0aXZlIHRvIHRoZSBkb2N1bWVudCBpbnN0
ZWFkIG9mIHRoZSB2aWV3cG9ydC4KLQotICAgIFRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIHVzZWQg
aW4gY29uanVuY3Rpb24gd2l0aCB0aGUgUVdlYlBhZ2U6OnByZWZlcnJlZENvbnRlbnRzU2l6ZSBw
cm9wZXJ0eS4KLSAgICBJZiBub3QgZXhwbGljaXRseSBzZXQsIHRoZSBwcmVmZXJyZWRDb250ZW50
c1NpemUgaXMgYXV0b21hdGljYWxseSBzZXQgdG8gYSByZWFzb25hYmxlIHZhbHVlLgotCi0gICAg
XHNhIFFXZWJQYWdlOjpzZXRQcmVmZXJyZWRDb250ZW50c1NpemUoKQotKi8KLXZvaWQgUUdyYXBo
aWNzV2ViVmlldzo6c2V0UmVzaXplc1RvQ29udGVudHMoYm9vbCBlbmFibGVkKQotewotICAgIGlm
IChkLT5yZXNpemVzVG9Db250ZW50cyA9PSBlbmFibGVkKQotICAgICAgICByZXR1cm47Ci0gICAg
ZC0+cmVzaXplc1RvQ29udGVudHMgPSBlbmFibGVkOwotICAgIGlmIChkLT5wYWdlKQotICAgICAg
ICBkLT51cGRhdGVSZXNpemVzVG9Db250ZW50c0ZvclBhZ2UoKTsKLX0KLQotYm9vbCBRR3JhcGhp
Y3NXZWJWaWV3OjpyZXNpemVzVG9Db250ZW50cygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGQtPnJl
c2l6ZXNUb0NvbnRlbnRzOwotfQotCi0vKiEKLSAgICBccHJvcGVydHkgUUdyYXBoaWNzV2ViVmll
dzo6dGlsZWRCYWNraW5nU3RvcmVGcm96ZW4KLSAgICBcYnJpZWYgd2hldGhlciB0aGUgdGlsZWQg
YmFja2luZyBzdG9yZSB1cGRhdGVzIGl0cyBjb250ZW50cwotICAgIFxzaW5jZSA0LjcgCi0KLSAg
ICBJZiB0aGUgdGlsZWQgYmFja2luZyBzdG9yZSBpcyBlbmFibGVkIHVzaW5nIFFXZWJTZXR0aW5n
czo6VGlsZWRCYWNraW5nU3RvcmVFbmFibGVkIGF0dHJpYnV0ZSwgdGhpcyBwcm9wZXJ0eQotICAg
IGNhbiBiZSB1c2VkIHRvIGRpc2FibGUgYmFja2luZyBzdG9yZSB1cGRhdGVzIHRlbXBvcmFyaWx5
LiBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIGV4YW1wbGUgZm9yIHJ1bm5pbmcKLSAgICBhIHNtb290
aCBhbmltYXRpb24gdGhhdCBjaGFuZ2VzIHRoZSBzY2FsZSBvZiB0aGUgUUdyYXBoaWNzV2ViVmll
dy4KLSAKLSAgICBXaGVuIHRoZSBiYWNraW5nIHN0b3JlIGlzIHVuZnJvemVuLCBpdHMgY29udGVu
dHMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgdG8gbWF0Y2ggdGhlIGN1cnJlbnQKLSAg
ICBzdGF0ZSBvZiB0aGUgZG9jdW1lbnQuIElmIHRoZSBRR3JhcGhpY3NXZWJWaWV3IHNjYWxlIHdh
cyBjaGFuZ2VkLCB0aGUgYmFja2luZyBzdG9yZSBpcyBhbHNvCi0gICAgcmUtcmVuZGVyZWQgdXNp
bmcgdGhlIG5ldyBzY2FsZS4KLSAKLSAgICBJZiB0aGUgdGlsZWQgYmFja2luZyBzdG9yZSBpcyBu
b3QgZW5hYmxlZCwgdGhpcyBwcm9wZXJ0eSBkb2VzIG5vdGhpbmcuCi0KLSAgICBcc2EgUVdlYlNl
dHRpbmdzOjpUaWxlZEJhY2tpbmdTdG9yZUVuYWJsZWQKLSAgICBcc2EgUUdyYXBoaWNzT2JqZWN0
OjpzY2FsZQotKi8KLWJvb2wgUUdyYXBoaWNzV2ViVmlldzo6aXNUaWxlZEJhY2tpbmdTdG9yZUZy
b3plbigpIGNvbnN0Ci17Ci0jaWYgVVNFKFRJTEVEX0JBQ0tJTkdfU1RPUkUpCi0gICAgV2ViQ29y
ZTo6VGlsZWRCYWNraW5nU3RvcmUqIGJhY2tpbmdTdG9yZSA9IFFXZWJGcmFtZVByaXZhdGU6OmNv
cmUocGFnZSgpLT5tYWluRnJhbWUoKSktPnRpbGVkQmFja2luZ1N0b3JlKCk7Ci0gICAgaWYgKCFi
YWNraW5nU3RvcmUpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gYmFja2luZ1N0
b3JlLT5jb250ZW50c0Zyb3plbigpOwotI2Vsc2UKLSAgICByZXR1cm4gZmFsc2U7Ci0jZW5kaWYK
LX0KLQotdm9pZCBRR3JhcGhpY3NXZWJWaWV3OjpzZXRUaWxlZEJhY2tpbmdTdG9yZUZyb3plbihi
b29sIGZyb3plbikKLXsKLSNpZiBVU0UoVElMRURfQkFDS0lOR19TVE9SRSkKLSAgICBXZWJDb3Jl
OjpUaWxlZEJhY2tpbmdTdG9yZSogYmFja2luZ1N0b3JlID0gUVdlYkZyYW1lUHJpdmF0ZTo6Y29y
ZShwYWdlKCktPm1haW5GcmFtZSgpKS0+dGlsZWRCYWNraW5nU3RvcmUoKTsKLSAgICBpZiAoIWJh
Y2tpbmdTdG9yZSkKLSAgICAgICAgcmV0dXJuOwotICAgIGJhY2tpbmdTdG9yZS0+c2V0Q29udGVu
dHNGcm96ZW4oZnJvemVuKTsKLSNlbHNlCi0gICAgVU5VU0VEX1BBUkFNKGZyb3plbik7Ci0jZW5k
aWYKLX0KLQotLyohIFxyZWltcAotKi8KLXZvaWQgUUdyYXBoaWNzV2ViVmlldzo6aG92ZXJNb3Zl
RXZlbnQoUUdyYXBoaWNzU2NlbmVIb3ZlckV2ZW50KiBldikKLXsKLSAgICBpZiAoZC0+cGFnZSkg
ewotICAgICAgICBjb25zdCBib29sIGFjY2VwdGVkID0gZXYtPmlzQWNjZXB0ZWQoKTsKLSAgICAg
ICAgUU1vdXNlRXZlbnQgbWUgPSBRTW91c2VFdmVudChRRXZlbnQ6Ok1vdXNlTW92ZSwKLSAgICAg
ICAgICAgICAgICBldi0+cG9zKCkudG9Qb2ludCgpLCBRdDo6Tm9CdXR0b24sCi0gICAgICAgICAg
ICAgICAgUXQ6Ok5vQnV0dG9uLCBRdDo6Tm9Nb2RpZmllcik7Ci0gICAgICAgIGQtPnBhZ2UtPmV2
ZW50KCZtZSk7Ci0gICAgICAgIGV2LT5zZXRBY2NlcHRlZChhY2NlcHRlZCk7Ci0gICAgfQotCi0g
ICAgaWYgKCFldi0+aXNBY2NlcHRlZCgpKQotICAgICAgICBRR3JhcGhpY3NJdGVtOjpob3Zlck1v
dmVFdmVudChldik7Ci19Ci0KLS8qISBccmVpbXAKLSovCi12b2lkIFFHcmFwaGljc1dlYlZpZXc6
OmhvdmVyTGVhdmVFdmVudChRR3JhcGhpY3NTY2VuZUhvdmVyRXZlbnQqIGV2KQotewotICAgIFFf
VU5VU0VEKGV2KTsKLX0KLQotLyohIFxyZWltcAotKi8KLXZvaWQgUUdyYXBoaWNzV2ViVmlldzo6
bW91c2VNb3ZlRXZlbnQoUUdyYXBoaWNzU2NlbmVNb3VzZUV2ZW50KiBldikKLXsKLSAgICBpZiAo
ZC0+cGFnZSkgewotICAgICAgICBjb25zdCBib29sIGFjY2VwdGVkID0gZXYtPmlzQWNjZXB0ZWQo
KTsKLSAgICAgICAgZC0+cGFnZS0+ZXZlbnQoZXYpOwotICAgICAgICBldi0+c2V0QWNjZXB0ZWQo
YWNjZXB0ZWQpOwotICAgIH0KLQotICAgIGlmICghZXYtPmlzQWNjZXB0ZWQoKSkKLSAgICAgICAg
UUdyYXBoaWNzSXRlbTo6bW91c2VNb3ZlRXZlbnQoZXYpOwotfQotCi0vKiEgXHJlaW1wCi0qLwot
dm9pZCBRR3JhcGhpY3NXZWJWaWV3Ojptb3VzZVByZXNzRXZlbnQoUUdyYXBoaWNzU2NlbmVNb3Vz
ZUV2ZW50KiBldikKLXsKLSAgICBpZiAoZC0+cGFnZSkgewotICAgICAgICBjb25zdCBib29sIGFj
Y2VwdGVkID0gZXYtPmlzQWNjZXB0ZWQoKTsKLSAgICAgICAgZC0+cGFnZS0+ZXZlbnQoZXYpOwot
ICAgICAgICBldi0+c2V0QWNjZXB0ZWQoYWNjZXB0ZWQpOwotICAgIH0KLQotICAgIGlmICghZXYt
PmlzQWNjZXB0ZWQoKSkKLSAgICAgICAgUUdyYXBoaWNzSXRlbTo6bW91c2VQcmVzc0V2ZW50KGV2
KTsKLX0KLQotLyohIFxyZWltcAotKi8KLXZvaWQgUUdyYXBoaWNzV2ViVmlldzo6bW91c2VSZWxl
YXNlRXZlbnQoUUdyYXBoaWNzU2NlbmVNb3VzZUV2ZW50KiBldikKLXsKLSAgICBpZiAoZC0+cGFn
ZSkgewotICAgICAgICBjb25zdCBib29sIGFjY2VwdGVkID0gZXYtPmlzQWNjZXB0ZWQoKTsKLSAg
ICAgICAgZC0+cGFnZS0+ZXZlbnQoZXYpOwotICAgICAgICBldi0+c2V0QWNjZXB0ZWQoYWNjZXB0
ZWQpOwotICAgIH0KLQotICAgIGlmICghZXYtPmlzQWNjZXB0ZWQoKSkKLSAgICAgICAgUUdyYXBo
aWNzSXRlbTo6bW91c2VSZWxlYXNlRXZlbnQoZXYpOwotfQotCi0vKiEgXHJlaW1wCi0qLwotdm9p
ZCBRR3JhcGhpY3NXZWJWaWV3Ojptb3VzZURvdWJsZUNsaWNrRXZlbnQoUUdyYXBoaWNzU2NlbmVN
b3VzZUV2ZW50KiBldikKLXsKLSAgICBpZiAoZC0+cGFnZSkgewotICAgICAgICBjb25zdCBib29s
IGFjY2VwdGVkID0gZXYtPmlzQWNjZXB0ZWQoKTsKLSAgICAgICAgZC0+cGFnZS0+ZXZlbnQoZXYp
OwotICAgICAgICBldi0+c2V0QWNjZXB0ZWQoYWNjZXB0ZWQpOwotICAgIH0KLQotICAgIGlmICgh
ZXYtPmlzQWNjZXB0ZWQoKSkKLSAgICAgICAgUUdyYXBoaWNzSXRlbTo6bW91c2VEb3VibGVDbGlj
a0V2ZW50KGV2KTsKLX0KLQotLyohIFxyZWltcAotKi8KLXZvaWQgUUdyYXBoaWNzV2ViVmlldzo6
a2V5UHJlc3NFdmVudChRS2V5RXZlbnQqIGV2KQotewotICAgIGlmIChkLT5wYWdlKQotICAgICAg
ICBkLT5wYWdlLT5ldmVudChldik7Ci0KLSAgICBpZiAoIWV2LT5pc0FjY2VwdGVkKCkpCi0gICAg
ICAgIFFHcmFwaGljc0l0ZW06OmtleVByZXNzRXZlbnQoZXYpOwotfQotCi0vKiEgXHJlaW1wCi0q
Lwotdm9pZCBRR3JhcGhpY3NXZWJWaWV3OjprZXlSZWxlYXNlRXZlbnQoUUtleUV2ZW50KiBldikK
LXsKLSAgICBpZiAoZC0+cGFnZSkKLSAgICAgICAgZC0+cGFnZS0+ZXZlbnQoZXYpOwotCi0gICAg
aWYgKCFldi0+aXNBY2NlcHRlZCgpKQotICAgICAgICBRR3JhcGhpY3NJdGVtOjprZXlSZWxlYXNl
RXZlbnQoZXYpOwotfQotCi0vKiEgXHJlaW1wCi0qLwotdm9pZCBRR3JhcGhpY3NXZWJWaWV3Ojpm
b2N1c0luRXZlbnQoUUZvY3VzRXZlbnQqIGV2KQotewotICAgIGlmIChkLT5wYWdlKQotICAgICAg
ICBkLT5wYWdlLT5ldmVudChldik7Ci0gICAgZWxzZQotICAgICAgICBRR3JhcGhpY3NJdGVtOjpm
b2N1c0luRXZlbnQoZXYpOwotfQotCi0vKiEgXHJlaW1wCi0qLwotdm9pZCBRR3JhcGhpY3NXZWJW
aWV3Ojpmb2N1c091dEV2ZW50KFFGb2N1c0V2ZW50KiBldikKLXsKLSAgICBpZiAoZC0+cGFnZSkK
LSAgICAgICAgZC0+cGFnZS0+ZXZlbnQoZXYpOwotICAgIGVsc2UKLSAgICAgICAgUUdyYXBoaWNz
SXRlbTo6Zm9jdXNPdXRFdmVudChldik7Ci19Ci0KLS8qISBccmVpbXAKLSovCi1ib29sIFFHcmFw
aGljc1dlYlZpZXc6OmZvY3VzTmV4dFByZXZDaGlsZChib29sIG5leHQpCi17Ci0gICAgaWYgKGQt
PnBhZ2UpCi0gICAgICAgIHJldHVybiBkLT5wYWdlLT5mb2N1c05leHRQcmV2Q2hpbGQobmV4dCk7
Ci0KLSAgICByZXR1cm4gUUdyYXBoaWNzV2lkZ2V0Ojpmb2N1c05leHRQcmV2Q2hpbGQobmV4dCk7
Ci19Ci0KLS8qISBccmVpbXAKLSovCi12b2lkIFFHcmFwaGljc1dlYlZpZXc6OmRyYWdFbnRlckV2
ZW50KFFHcmFwaGljc1NjZW5lRHJhZ0Ryb3BFdmVudCogZXYpCi17Ci0jaWZuZGVmIFFUX05PX0RS
QUdBTkREUk9QCi0gICAgaWYgKGQtPnBhZ2UpCi0gICAgICAgIGQtPnBhZ2UtPmV2ZW50KGV2KTsK
LSNlbHNlCi0gICAgUV9VTlVTRUQoZXYpOwotI2VuZGlmCi19Ci0KLS8qISBccmVpbXAKLSovCi12
b2lkIFFHcmFwaGljc1dlYlZpZXc6OmRyYWdMZWF2ZUV2ZW50KFFHcmFwaGljc1NjZW5lRHJhZ0Ry
b3BFdmVudCogZXYpCi17Ci0jaWZuZGVmIFFUX05PX0RSQUdBTkREUk9QCi0gICAgaWYgKGQtPnBh
Z2UpIHsKLSAgICAgICAgY29uc3QgYm9vbCBhY2NlcHRlZCA9IGV2LT5pc0FjY2VwdGVkKCk7Ci0g
ICAgICAgIGQtPnBhZ2UtPmV2ZW50KGV2KTsKLSAgICAgICAgZXYtPnNldEFjY2VwdGVkKGFjY2Vw
dGVkKTsKLSAgICB9Ci0KLSAgICBpZiAoIWV2LT5pc0FjY2VwdGVkKCkpCi0gICAgICAgIFFHcmFw
aGljc1dpZGdldDo6ZHJhZ0xlYXZlRXZlbnQoZXYpOwotI2Vsc2UKLSAgICBRX1VOVVNFRChldik7
Ci0jZW5kaWYKLX0KLQotLyohIFxyZWltcAotKi8KLXZvaWQgUUdyYXBoaWNzV2ViVmlldzo6ZHJh
Z01vdmVFdmVudChRR3JhcGhpY3NTY2VuZURyYWdEcm9wRXZlbnQqIGV2KQotewotI2lmbmRlZiBR
VF9OT19EUkFHQU5ERFJPUAotICAgIGlmIChkLT5wYWdlKSB7Ci0gICAgICAgIGNvbnN0IGJvb2wg
YWNjZXB0ZWQgPSBldi0+aXNBY2NlcHRlZCgpOwotICAgICAgICBkLT5wYWdlLT5ldmVudChldik7
Ci0gICAgICAgIGV2LT5zZXRBY2NlcHRlZChhY2NlcHRlZCk7Ci0gICAgfQotCi0gICAgaWYgKCFl
di0+aXNBY2NlcHRlZCgpKQotICAgICAgICBRR3JhcGhpY3NXaWRnZXQ6OmRyYWdNb3ZlRXZlbnQo
ZXYpOwotI2Vsc2UKLSAgICBRX1VOVVNFRChldik7Ci0jZW5kaWYKLX0KLQotLyohIFxyZWltcAot
Ki8KLXZvaWQgUUdyYXBoaWNzV2ViVmlldzo6ZHJvcEV2ZW50KFFHcmFwaGljc1NjZW5lRHJhZ0Ry
b3BFdmVudCogZXYpCi17Ci0jaWZuZGVmIFFUX05PX0RSQUdBTkREUk9QCi0gICAgaWYgKGQtPnBh
Z2UpIHsKLSAgICAgICAgY29uc3QgYm9vbCBhY2NlcHRlZCA9IGV2LT5pc0FjY2VwdGVkKCk7Ci0g
ICAgICAgIGQtPnBhZ2UtPmV2ZW50KGV2KTsKLSAgICAgICAgZXYtPnNldEFjY2VwdGVkKGFjY2Vw
dGVkKTsKLSAgICB9Ci0KLSAgICBpZiAoIWV2LT5pc0FjY2VwdGVkKCkpCi0gICAgICAgIFFHcmFw
aGljc1dpZGdldDo6ZHJvcEV2ZW50KGV2KTsKLSNlbHNlCi0gICAgUV9VTlVTRUQoZXYpOwotI2Vu
ZGlmCi19Ci0KLSNpZm5kZWYgUVRfTk9fQ09OVEVYVE1FTlUKLS8qISBccmVpbXAKLSovCi12b2lk
IFFHcmFwaGljc1dlYlZpZXc6OmNvbnRleHRNZW51RXZlbnQoUUdyYXBoaWNzU2NlbmVDb250ZXh0
TWVudUV2ZW50KiBldikKLXsKLSAgICBpZiAoZC0+cGFnZSkgewotICAgICAgICBjb25zdCBib29s
IGFjY2VwdGVkID0gZXYtPmlzQWNjZXB0ZWQoKTsKLSAgICAgICAgZC0+cGFnZS0+ZXZlbnQoZXYp
OwotICAgICAgICBldi0+c2V0QWNjZXB0ZWQoYWNjZXB0ZWQpOwotICAgIH0KLX0KLSNlbmRpZiAv
LyBRVF9OT19DT05URVhUTUVOVQotCi0jaWZuZGVmIFFUX05PX1dIRUVMRVZFTlQKLS8qISBccmVp
bXAKLSovCi12b2lkIFFHcmFwaGljc1dlYlZpZXc6OndoZWVsRXZlbnQoUUdyYXBoaWNzU2NlbmVX
aGVlbEV2ZW50KiBldikKLXsKLSAgICBpZiAoZC0+cGFnZSkgewotICAgICAgICBjb25zdCBib29s
IGFjY2VwdGVkID0gZXYtPmlzQWNjZXB0ZWQoKTsKLSAgICAgICAgZC0+cGFnZS0+ZXZlbnQoZXYp
OwotICAgICAgICBldi0+c2V0QWNjZXB0ZWQoYWNjZXB0ZWQpOwotICAgIH0KLQotICAgIGlmICgh
ZXYtPmlzQWNjZXB0ZWQoKSkKLSAgICAgICAgUUdyYXBoaWNzSXRlbTo6d2hlZWxFdmVudChldik7
Ci19Ci0jZW5kaWYgLy8gUVRfTk9fV0hFRUxFVkVOVAotCi0vKiEgXHJlaW1wCi0qLwotdm9pZCBR
R3JhcGhpY3NXZWJWaWV3OjppbnB1dE1ldGhvZEV2ZW50KFFJbnB1dE1ldGhvZEV2ZW50KiBldikK
LXsKLSAgICBpZiAoZC0+cGFnZSkKLSAgICAgICAgZC0+cGFnZS0+ZXZlbnQoZXYpOwotCi0gICAg
aWYgKCFldi0+aXNBY2NlcHRlZCgpKQotICAgICAgICBRR3JhcGhpY3NJdGVtOjppbnB1dE1ldGhv
ZEV2ZW50KGV2KTsKLX0KLQotLyohCi0gICAgXGZuIHZvaWQgUUdyYXBoaWNzV2ViVmlldzo6c3Rh
dHVzQmFyTWVzc2FnZShjb25zdCBRU3RyaW5nJiB0ZXh0KQotCi0gICAgVGhpcyBzaWduYWwgaXMg
ZW1pdHRlZCB3aGVuIHRoZSBzdGF0dXNiYXIgXGEgdGV4dCBpcyBjaGFuZ2VkIGJ5IHRoZSBwYWdl
LgotKi8KLQotLyohCi0gICAgXGZuIHZvaWQgUUdyYXBoaWNzV2ViVmlldzo6bG9hZFByb2dyZXNz
KGludCBwcm9ncmVzcykKLQotICAgIFRoaXMgc2lnbmFsIGlzIGVtaXR0ZWQgZXZlcnkgdGltZSBh
biBlbGVtZW50IGluIHRoZSB3ZWIgcGFnZQotICAgIGNvbXBsZXRlcyBsb2FkaW5nIGFuZCB0aGUg
b3ZlcmFsbCBsb2FkaW5nIHByb2dyZXNzIGFkdmFuY2VzLgotCi0gICAgVGhpcyBzaWduYWwgdHJh
Y2tzIHRoZSBwcm9ncmVzcyBvZiBhbGwgY2hpbGQgZnJhbWVzLgotCi0gICAgVGhlIGN1cnJlbnQg
dmFsdWUgaXMgcHJvdmlkZWQgYnkgXGEgcHJvZ3Jlc3MgYW5kIHNjYWxlcyBmcm9tIDAgdG8gMTAw
LAotICAgIHdoaWNoIGlzIHRoZSBkZWZhdWx0IHJhbmdlIG9mIFFQcm9ncmVzc0Jhci4KLQotICAg
IFxzYSBsb2FkU3RhcnRlZCgpLCBsb2FkRmluaXNoZWQoKQotKi8KLQotLyohCi0gICAgXGZuIHZv
aWQgUUdyYXBoaWNzV2ViVmlldzo6bGlua0NsaWNrZWQoY29uc3QgUVVybCAmdXJsKQotCi0gICAg
VGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuZXZlciB0aGUgdXNlciBjbGlja3Mgb24gYSBsaW5r
IGFuZCB0aGUgcGFnZSdzIGxpbmtEZWxlZ2F0aW9uUG9saWN5Ci0gICAgcHJvcGVydHkgaXMgc2V0
IHRvIGRlbGVnYXRlIHRoZSBsaW5rIGhhbmRsaW5nIGZvciB0aGUgc3BlY2lmaWVkIFxhIHVybC4K
LQotICAgIFxzYSBRV2ViUGFnZTo6bGlua0RlbGVnYXRpb25Qb2xpY3koKQotKi8KLQotI2VuZGlm
IC8vIFFUX05PX0dSQVBISUNTVklFVwotCi0jaW5jbHVkZSAibW9jX3FncmFwaGljc3dlYnZpZXcu
Y3BwIgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9BcGkvcWdyYXBoaWNzd2Vidmlldy5o
IGIvU291cmNlL1dlYktpdC9xdC9BcGkvcWdyYXBoaWNzd2Vidmlldy5oCmRlbGV0ZWQgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwZjlmMTdiNDgzODQ1OGIyMjAyMjIwN2RiNDI0NTYwYzgwYWI3NjFl
Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9X
ZWJLaXQvcXQvQXBpL3FncmFwaGljc3dlYnZpZXcuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2NyAr
MCwwIEBACi0vKgotICAgIENvcHlyaWdodCAoQykgMjAwOSBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQv
b3IgaXRzIHN1YnNpZGlhcnkoLWllcykKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3
YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIg
dGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2Ug
YXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAg
IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg
dmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0
aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0
aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9y
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBz
aG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENP
UFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k
YXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCi0gICAgQm9zdG9u
LCBNQSAwMjExMC0xMzAxLCBVU0EuCi0qLwotCi0jaWZuZGVmIFFHcmFwaGljc1dlYlZpZXdfaAot
I2RlZmluZSBRR3JhcGhpY3NXZWJWaWV3X2gKLQotI2luY2x1ZGUgInF3ZWJraXRnbG9iYWwuaCIK
LSNpbmNsdWRlICJxd2VicGFnZS5oIgotI2luY2x1ZGUgPFF0Q29yZS9xdXJsLmg+Ci0jaW5jbHVk
ZSA8UXRXaWRnZXRzL3FncmFwaGljc3dpZGdldC5oPgotI2luY2x1ZGUgPFF0R3VpL3FldmVudC5o
PgotI2luY2x1ZGUgPFF0R3VpL3FpY29uLmg+Ci0jaW5jbHVkZSA8UXRHdWkvcXBhaW50ZXIuaD4K
LSNpbmNsdWRlIDxRdE5ldHdvcmsvcW5ldHdvcmthY2Nlc3NtYW5hZ2VyLmg+Ci0KLSNpZiAhZGVm
aW5lZChRVF9OT19HUkFQSElDU1ZJRVcpCi0KLWNsYXNzIFFXZWJQYWdlOwotY2xhc3MgUVdlYkhp
c3Rvcnk7Ci1jbGFzcyBRV2ViU2V0dGluZ3M7Ci0KLWNsYXNzIFFHcmFwaGljc1dlYlZpZXdQcml2
YXRlOwotCi1jbGFzcyBRV0VCS0lUX0VYUE9SVCBRR3JhcGhpY3NXZWJWaWV3IDogcHVibGljIFFH
cmFwaGljc1dpZGdldCB7Ci0gICAgUV9PQkpFQ1QKLQotICAgIFFfUFJPUEVSVFkoUVN0cmluZyB0
aXRsZSBSRUFEIHRpdGxlIE5PVElGWSB0aXRsZUNoYW5nZWQpCi0gICAgUV9QUk9QRVJUWShRSWNv
biBpY29uIFJFQUQgaWNvbiBOT1RJRlkgaWNvbkNoYW5nZWQpCi0gICAgUV9QUk9QRVJUWShxcmVh
bCB6b29tRmFjdG9yIFJFQUQgem9vbUZhY3RvciBXUklURSBzZXRab29tRmFjdG9yKQotCi0gICAg
UV9QUk9QRVJUWShRVXJsIHVybCBSRUFEIHVybCBXUklURSBzZXRVcmwgTk9USUZZIHVybENoYW5n
ZWQpCi0KLSAgICBRX1BST1BFUlRZKGJvb2wgbW9kaWZpZWQgUkVBRCBpc01vZGlmaWVkKQotICAg
IFFfUFJPUEVSVFkoYm9vbCByZXNpemVzVG9Db250ZW50cyBSRUFEIHJlc2l6ZXNUb0NvbnRlbnRz
IFdSSVRFIHNldFJlc2l6ZXNUb0NvbnRlbnRzKQotICAgIFFfUFJPUEVSVFkoYm9vbCB0aWxlZEJh
Y2tpbmdTdG9yZUZyb3plbiBSRUFEIGlzVGlsZWRCYWNraW5nU3RvcmVGcm96ZW4gV1JJVEUgc2V0
VGlsZWRCYWNraW5nU3RvcmVGcm96ZW4pCi0KLSAgICBRX1BST1BFUlRZKFFQYWludGVyOjpSZW5k
ZXJIaW50cyByZW5kZXJIaW50cyBSRUFEIHJlbmRlckhpbnRzIFdSSVRFIHNldFJlbmRlckhpbnRz
KQotICAgIFFfRkxBR1MoUVBhaW50ZXI6OlJlbmRlckhpbnRzKQotCi1wdWJsaWM6Ci0gICAgZXhw
bGljaXQgUUdyYXBoaWNzV2ViVmlldyhRR3JhcGhpY3NJdGVtKiBwYXJlbnQgPSAwKTsKLSAgICB+
UUdyYXBoaWNzV2ViVmlldygpOwotCi0gICAgUVdlYlBhZ2UqIHBhZ2UoKSBjb25zdDsKLSAgICB2
b2lkIHNldFBhZ2UoUVdlYlBhZ2UqKTsKLQotICAgIFFVcmwgdXJsKCkgY29uc3Q7Ci0gICAgdm9p
ZCBzZXRVcmwoY29uc3QgUVVybCYpOwotCi0gICAgUVN0cmluZyB0aXRsZSgpIGNvbnN0OwotICAg
IFFJY29uIGljb24oKSBjb25zdDsKLQotICAgIHFyZWFsIHpvb21GYWN0b3IoKSBjb25zdDsKLSAg
ICB2b2lkIHNldFpvb21GYWN0b3IocXJlYWwpOwotCi0gICAgYm9vbCBpc01vZGlmaWVkKCkgY29u
c3Q7Ci0KLSAgICB2b2lkIGxvYWQoY29uc3QgUVVybCYgdXJsKTsKLSAgICB2b2lkIGxvYWQoY29u
c3QgUU5ldHdvcmtSZXF1ZXN0JiByZXF1ZXN0LCBRTmV0d29ya0FjY2Vzc01hbmFnZXI6Ok9wZXJh
dGlvbiBvcGVyYXRpb24gPSBRTmV0d29ya0FjY2Vzc01hbmFnZXI6OkdldE9wZXJhdGlvbiwgY29u
c3QgUUJ5dGVBcnJheSYgYm9keSA9IFFCeXRlQXJyYXkoKSk7Ci0KLSAgICB2b2lkIHNldEh0bWwo
Y29uc3QgUVN0cmluZyYgaHRtbCwgY29uc3QgUVVybCYgYmFzZVVybCA9IFFVcmwoKSk7Ci0gICAg
Ly8gRklYTUU6IENvbnNpZGVyIHJlbmFtZSB0byBzZXRIdG1sPwotICAgIHZvaWQgc2V0Q29udGVu
dChjb25zdCBRQnl0ZUFycmF5JiBkYXRhLCBjb25zdCBRU3RyaW5nJiBtaW1lVHlwZSA9IFFTdHJp
bmcoKSwgY29uc3QgUVVybCYgYmFzZVVybCA9IFFVcmwoKSk7Ci0KLSAgICBRV2ViSGlzdG9yeSog
aGlzdG9yeSgpIGNvbnN0OwotICAgIFFXZWJTZXR0aW5ncyogc2V0dGluZ3MoKSBjb25zdDsKLQot
ICAgIFFBY3Rpb24qIHBhZ2VBY3Rpb24oUVdlYlBhZ2U6OldlYkFjdGlvbiBhY3Rpb24pIGNvbnN0
OwotICAgIHZvaWQgdHJpZ2dlclBhZ2VBY3Rpb24oUVdlYlBhZ2U6OldlYkFjdGlvbiBhY3Rpb24s
IGJvb2wgY2hlY2tlZCA9IGZhbHNlKTsKLQotICAgIGJvb2wgZmluZFRleHQoY29uc3QgUVN0cmlu
ZyYgc3ViU3RyaW5nLCBRV2ViUGFnZTo6RmluZEZsYWdzIG9wdGlvbnMgPSAwKTsKLQotICAgIGJv
b2wgcmVzaXplc1RvQ29udGVudHMoKSBjb25zdDsKLSAgICB2b2lkIHNldFJlc2l6ZXNUb0NvbnRl
bnRzKGJvb2wgZW5hYmxlZCk7Ci0gICAgCi0gICAgYm9vbCBpc1RpbGVkQmFja2luZ1N0b3JlRnJv
emVuKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRUaWxlZEJhY2tpbmdTdG9yZUZyb3plbihib29sIGZy
b3plbik7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0R2VvbWV0cnkoY29uc3QgUVJlY3RGJiByZWN0
KTsKLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlR2VvbWV0cnkoKTsKLSAgICB2aXJ0dWFsIHZvaWQg
cGFpbnQoUVBhaW50ZXIqLCBjb25zdCBRU3R5bGVPcHRpb25HcmFwaGljc0l0ZW0qIG9wdGlvbnMs
IFFXaWRnZXQqIHdpZGdldCA9IDApOwotICAgIHZpcnR1YWwgUVZhcmlhbnQgaXRlbUNoYW5nZShH
cmFwaGljc0l0ZW1DaGFuZ2UgY2hhbmdlLCBjb25zdCBRVmFyaWFudCYgdmFsdWUpOwotICAgIHZp
cnR1YWwgYm9vbCBldmVudChRRXZlbnQqKTsKLQotICAgIHZpcnR1YWwgUVNpemVGIHNpemVIaW50
KFF0OjpTaXplSGludCB3aGljaCwgY29uc3QgUVNpemVGJiBjb25zdHJhaW50KSBjb25zdDsKLQot
ICAgIHZpcnR1YWwgUVZhcmlhbnQgaW5wdXRNZXRob2RRdWVyeShRdDo6SW5wdXRNZXRob2RRdWVy
eSBxdWVyeSkgY29uc3Q7Ci0KLSAgICBRUGFpbnRlcjo6UmVuZGVySGludHMgcmVuZGVySGludHMo
KSBjb25zdDsKLSAgICB2b2lkIHNldFJlbmRlckhpbnRzKFFQYWludGVyOjpSZW5kZXJIaW50cyk7
Ci0gICAgdm9pZCBzZXRSZW5kZXJIaW50KFFQYWludGVyOjpSZW5kZXJIaW50LCBib29sIGVuYWJs
ZWQgPSB0cnVlKTsKLQotcHVibGljIFFfU0xPVFM6Ci0gICAgdm9pZCBzdG9wKCk7Ci0gICAgdm9p
ZCBiYWNrKCk7Ci0gICAgdm9pZCBmb3J3YXJkKCk7Ci0gICAgdm9pZCByZWxvYWQoKTsKLQotUV9T
SUdOQUxTOgotICAgIHZvaWQgbG9hZFN0YXJ0ZWQoKTsKLSAgICB2b2lkIGxvYWRGaW5pc2hlZChi
b29sKTsKLQotICAgIHZvaWQgbG9hZFByb2dyZXNzKGludCBwcm9ncmVzcyk7Ci0gICAgdm9pZCB1
cmxDaGFuZ2VkKGNvbnN0IFFVcmwmKTsKLSAgICB2b2lkIHRpdGxlQ2hhbmdlZChjb25zdCBRU3Ry
aW5nJik7Ci0gICAgdm9pZCBpY29uQ2hhbmdlZCgpOwotICAgIHZvaWQgc3RhdHVzQmFyTWVzc2Fn
ZShjb25zdCBRU3RyaW5nJiBtZXNzYWdlKTsKLSAgICB2b2lkIGxpbmtDbGlja2VkKGNvbnN0IFFV
cmwmKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgdm9pZCBtb3VzZVByZXNzRXZlbnQoUUdy
YXBoaWNzU2NlbmVNb3VzZUV2ZW50Kik7Ci0gICAgdmlydHVhbCB2b2lkIG1vdXNlRG91YmxlQ2xp
Y2tFdmVudChRR3JhcGhpY3NTY2VuZU1vdXNlRXZlbnQqKTsKLSAgICB2aXJ0dWFsIHZvaWQgbW91
c2VSZWxlYXNlRXZlbnQoUUdyYXBoaWNzU2NlbmVNb3VzZUV2ZW50Kik7Ci0gICAgdmlydHVhbCB2
b2lkIG1vdXNlTW92ZUV2ZW50KFFHcmFwaGljc1NjZW5lTW91c2VFdmVudCopOwotICAgIHZpcnR1
YWwgdm9pZCBob3Zlck1vdmVFdmVudChRR3JhcGhpY3NTY2VuZUhvdmVyRXZlbnQqKTsKLSAgICB2
aXJ0dWFsIHZvaWQgaG92ZXJMZWF2ZUV2ZW50KFFHcmFwaGljc1NjZW5lSG92ZXJFdmVudCopOwot
I2lmbmRlZiBRVF9OT19XSEVFTEVWRU5UCi0gICAgdmlydHVhbCB2b2lkIHdoZWVsRXZlbnQoUUdy
YXBoaWNzU2NlbmVXaGVlbEV2ZW50Kik7Ci0jZW5kaWYKLSAgICB2aXJ0dWFsIHZvaWQga2V5UHJl
c3NFdmVudChRS2V5RXZlbnQqKTsKLSAgICB2aXJ0dWFsIHZvaWQga2V5UmVsZWFzZUV2ZW50KFFL
ZXlFdmVudCopOwotI2lmbmRlZiBRVF9OT19DT05URVhUTUVOVQotICAgIHZpcnR1YWwgdm9pZCBj
b250ZXh0TWVudUV2ZW50KFFHcmFwaGljc1NjZW5lQ29udGV4dE1lbnVFdmVudCopOwotI2VuZGlm
Ci0gICAgdmlydHVhbCB2b2lkIGRyYWdFbnRlckV2ZW50KFFHcmFwaGljc1NjZW5lRHJhZ0Ryb3BF
dmVudCopOwotICAgIHZpcnR1YWwgdm9pZCBkcmFnTGVhdmVFdmVudChRR3JhcGhpY3NTY2VuZURy
YWdEcm9wRXZlbnQqKTsKLSAgICB2aXJ0dWFsIHZvaWQgZHJhZ01vdmVFdmVudChRR3JhcGhpY3NT
Y2VuZURyYWdEcm9wRXZlbnQqKTsKLSAgICB2aXJ0dWFsIHZvaWQgZHJvcEV2ZW50KFFHcmFwaGlj
c1NjZW5lRHJhZ0Ryb3BFdmVudCopOwotICAgIHZpcnR1YWwgdm9pZCBmb2N1c0luRXZlbnQoUUZv
Y3VzRXZlbnQqKTsKLSAgICB2aXJ0dWFsIHZvaWQgZm9jdXNPdXRFdmVudChRRm9jdXNFdmVudCop
OwotICAgIHZpcnR1YWwgdm9pZCBpbnB1dE1ldGhvZEV2ZW50KFFJbnB1dE1ldGhvZEV2ZW50Kik7
Ci0gICAgdmlydHVhbCBib29sIGZvY3VzTmV4dFByZXZDaGlsZChib29sIG5leHQpOwotCi0gICAg
dmlydHVhbCBib29sIHNjZW5lRXZlbnQoUUV2ZW50Kik7Ci0KLXByaXZhdGU6Ci0gICAgUV9QUklW
QVRFX1NMT1QoZCwgdm9pZCBfcV9kb0xvYWRGaW5pc2hlZChib29sIHN1Y2Nlc3MpKQotICAgIFFf
UFJJVkFURV9TTE9UKGQsIHZvaWQgX3FfcGFnZURlc3Ryb3llZCgpKQotICAgIC8vIHdlIGRvbid0
IHdhbnQgdG8gY2hhbmdlIHRoZSBtb2MgYmFzZWQgb24gVVNFKCkgbWFjcm8sIHNvIHRoaXMgZnVu
Y3Rpb24gaXMgaGVyZQotICAgIC8vIGJ1dCB3aWxsIGJlIGVtcHR5IGlmIEFDQ0xFUkFURURfQ09N
UE9TSVRJTkcgaXMgZGlzYWJsZWQKLSAgICBRX1BSSVZBVEVfU0xPVChkLCB2b2lkIHN5bmNMYXll
cnMoKSkKLSAgICBRX1BSSVZBVEVfU0xPVChkLCB2b2lkIF9xX2NvbnRlbnRzU2l6ZUNoYW5nZWQo
Y29uc3QgUVNpemUmKSkKLSAgICBRX1BSSVZBVEVfU0xPVChkLCB2b2lkIF9xX3NjYWxlQ2hhbmdl
ZCgpKQotCi0gICAgUUdyYXBoaWNzV2ViVmlld1ByaXZhdGUqIGNvbnN0IGQ7Ci0gICAgZnJpZW5k
IGNsYXNzIFFHcmFwaGljc1dlYlZpZXdQcml2YXRlOwotfTsKLQotI2VuZGlmIC8vIFFUX05PX0dS
QVBISUNTVklFVwotCi0jZW5kaWYgLy8gUUdyYXBoaWNzV2ViVmlld19oCmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViS2l0L3F0L0FwaS9xd2ViZWxlbWVudC5oIGIvU291cmNlL1dlYktpdC9xdC9BcGkv
cXdlYmVsZW1lbnQuaAppbmRleCBlZmVjNWViN2M4ZDg4M2E0M2M3MGRhNTc2NWYzNjJjMWJhMjIx
NGZmLi5lOTA3YTY5YTFjYmMzZjBjZjllOWI4NzU4NWIwNjRkODYzYTg5ZWViIDEwMDY0NAotLS0g
YS9Tb3VyY2UvV2ViS2l0L3F0L0FwaS9xd2ViZWxlbWVudC5oCisrKyBiL1NvdXJjZS9XZWJLaXQv
cXQvQXBpL3F3ZWJlbGVtZW50LmgKQEAgLTE1MCw3ICsxNTAsNyBAQCBwcml2YXRlOgogICAgIHN0
YXRpYyBRV2ViRWxlbWVudCBlbmNsb3NpbmdFbGVtZW50KFdlYkNvcmU6Ok5vZGUqKTsKIAogICAg
IGZyaWVuZCBjbGFzcyBEdW1wUmVuZGVyVHJlZVN1cHBvcnRRdDsKLSAgICBmcmllbmQgY2xhc3Mg
UVdlYkZyYW1lOworICAgIGZyaWVuZCBjbGFzcyBRV2ViRnJhbWVBZGFwdGVyOwogICAgIGZyaWVu
ZCBjbGFzcyBRV2ViRWxlbWVudENvbGxlY3Rpb247CiAgICAgZnJpZW5kIGNsYXNzIFFXZWJIaXRU
ZXN0UmVzdWx0OwogICAgIGZyaWVuZCBjbGFzcyBRV2ViSGl0VGVzdFJlc3VsdFByaXZhdGU7CmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0L0FwaS9xd2ViZnJhbWUuY3BwIGIvU291cmNlL1dl
YktpdC9xdC9BcGkvcXdlYmZyYW1lLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
M2ZhMGU4YjcxN2NiMzJhYzgzYWRjZjVmZmM3YzJkYzgyZDgxYjBhMS4uMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L3F0L0FwaS9xd2Vi
ZnJhbWUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTgxNiArMCwwIEBACi0vKgotICAgIENvcHly
aWdodCAoQykgMjAwOCwyMDA5IE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFy
eSgtaWVzKQotICAgIENvcHlyaWdodCAoQykgMjAwNyBTdGFpa29zIENvbXB1dGluZyBTZXJ2aWNl
cyBJbmMuCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRp
c3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg
R05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0
aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIgb2YgdGhl
IExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBU
aGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVz
ZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1w
bGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGlicmFyeSBHZW5lcmFsIFB1Ymxp
YyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2
ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAg
YWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5v
dCwgd3JpdGUgdG8KLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBG
cmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAotICAgIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwg
VVNBLgotKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgInF3ZWJmcmFtZS5oIgot
Ci0jaW5jbHVkZSAiQVBJQ2FzdC5oIgotI2luY2x1ZGUgIkJyaWRnZUpTQy5oIgotI2luY2x1ZGUg
IkNhbGxGcmFtZS5oIgotI2luY2x1ZGUgIkRvY3VtZW50LmgiCi0jaW5jbHVkZSAiRG9jdW1lbnRM
b2FkZXIuaCIKLSNpbmNsdWRlICJEcmFnRGF0YS5oIgotI2luY2x1ZGUgIkVsZW1lbnQuaCIKLSNp
bmNsdWRlICJGb2N1c0NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJGcmFtZS5oIgotI2luY2x1ZGUg
IkZyYW1lTG9hZFJlcXVlc3QuaCIKLSNpbmNsdWRlICJGcmFtZUxvYWRlckNsaWVudFF0LmgiCi0j
aW5jbHVkZSAiRnJhbWVTZWxlY3Rpb24uaCIKLSNpbmNsdWRlICJGcmFtZVRyZWUuaCIKLSNpbmNs
dWRlICJGcmFtZVZpZXcuaCIKLSNpbmNsdWRlICJHQ0NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJH
cmFwaGljc0NvbnRleHQuaCIKLSNpbmNsdWRlICJIVE1MRm9ybUVsZW1lbnQuaCIKLSNpbmNsdWRl
ICJIVE1MTWV0YUVsZW1lbnQuaCIKLSNpbmNsdWRlICJIaXRUZXN0UmVzdWx0LmgiCi0jaW5jbHVk
ZSAiSFRUUFBhcnNlcnMuaCIKLSNpbmNsdWRlICJJY29uRGF0YWJhc2UuaCIKLSNpbmNsdWRlICJJ
bnNwZWN0b3JDb250cm9sbGVyLmgiCi0jaW5jbHVkZSAiSmF2YVNjcmlwdC5oIgotI2luY2x1ZGUg
IkpTRE9NQmluZGluZy5oIgotI2luY2x1ZGUgIkpTRE9NV2luZG93QmFzZS5oIgotI2luY2x1ZGUg
IkpTTG9jay5oIgotI2luY2x1ZGUgIkpTT2JqZWN0LmgiCi0jaW5jbHVkZSAiSlNSZXRhaW5QdHIu
aCIKLSNpbmNsdWRlICJPcGFxdWVKU1N0cmluZy5oIgotI2luY2x1ZGUgIk5ldHdvcmtpbmdDb250
ZXh0LmgiCi0jaW5jbHVkZSAiTm9kZUxpc3QuaCIKLSNpbmNsdWRlICJQYWdlLmgiCi0jaW5jbHVk
ZSAiUGxhdGZvcm1Nb3VzZUV2ZW50LmgiCi0jaW5jbHVkZSAiUGxhdGZvcm1XaGVlbEV2ZW50Lmgi
Ci0jaW5jbHVkZSAiUHJpbnRDb250ZXh0LmgiCi0jaW5jbHVkZSAiUHJvcGVydHlEZXNjcmlwdG9y
LmgiCi0jaW5jbHVkZSAiUHV0UHJvcGVydHlTbG90LmgiCi0jaW5jbHVkZSAiUmVuZGVyTGF5ZXIu
aCIKLSNpbmNsdWRlICJSZW5kZXJUcmVlQXNUZXh0LmgiCi0jaW5jbHVkZSAiUmVuZGVyVmlldy5o
IgotI2luY2x1ZGUgIlJlc291cmNlUmVxdWVzdC5oIgotI2luY2x1ZGUgIlNjcmlwdENvbnRyb2xs
ZXIuaCIKLSNpbmNsdWRlICJTY3JpcHRTb3VyY2VDb2RlLmgiCi0jaW5jbHVkZSAiU2NyaXB0VmFs
dWUuaCIKLSNpbmNsdWRlICJTY3JvbGxiYXIuaCIKLSNpbmNsdWRlICJTZXR0aW5ncy5oIgotI2lu
Y2x1ZGUgIlN1YnN0aXR1dGVEYXRhLmgiCi0jaW5jbHVkZSAiU1ZHU01JTEVsZW1lbnQuaCIKLSNp
bmNsdWRlICJUaWxlZEJhY2tpbmdTdG9yZS5oIgotI2luY2x1ZGUgImh0bWxlZGl0aW5nLmgiCi0j
aW5jbHVkZSAibWFya3VwLmgiCi0jaW5jbHVkZSAicXRfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJx
dF9ydW50aW1lLmgiCi0jaW5jbHVkZSAicXdlYmVsZW1lbnQuaCIKLSNpbmNsdWRlICJxd2ViZnJh
bWVfcC5oIgotI2luY2x1ZGUgInF3ZWJwYWdlLmgiCi0jaW5jbHVkZSAicXdlYnBhZ2VfcC5oIgot
I2luY2x1ZGUgInF3ZWJzZWN1cml0eW9yaWdpbi5oIgotI2luY2x1ZGUgInF3ZWJzZWN1cml0eW9y
aWdpbl9wLmgiCi0jaW5jbHVkZSAicXdlYnNjcmlwdHdvcmxkLmgiCi0jaW5jbHVkZSAicXdlYnNj
cmlwdHdvcmxkX3AuaCIKLSNpbmNsdWRlICJydW50aW1lX29iamVjdC5oIgotI2luY2x1ZGUgInJ1
bnRpbWVfcm9vdC5oIgotI2lmIFVTRShURVhUVVJFX01BUFBFUikKLSNpbmNsdWRlICJ0ZXhtYXAv
VGV4dHVyZU1hcHBlci5oIgotI2luY2x1ZGUgInRleG1hcC9UZXh0dXJlTWFwcGVyTGF5ZXIuaCIK
LSNlbmRpZgotI2luY2x1ZGUgInd0Zi9IYXNoTWFwLmgiCi0jaW5jbHVkZSA8UU11bHRpTWFwPgot
I2luY2x1ZGUgPHFkZWJ1Zy5oPgotI2luY2x1ZGUgPHFldmVudC5oPgotI2luY2x1ZGUgPHFmaWxl
aW5mby5oPgotI2luY2x1ZGUgPHFwYWludGVyLmg+Ci0jaWYgSEFWRShRVFBSSU5UU1VQUE9SVCkK
LSNpbmNsdWRlIDxxcHJpbnRlci5oPgotI2VuZGlmCi0jaW5jbHVkZSA8cXJlZ2lvbi5oPgotI2lu
Y2x1ZGUgPHFuZXR3b3JrcmVxdWVzdC5oPgotCi11c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKLQot
Ly8gZnJvbSB0ZXh0L3Fmb250LmNwcAotUVRfQkVHSU5fTkFNRVNQQUNFCi1leHRlcm4gUV9HVUlf
RVhQT1JUIGludCBxdF9kZWZhdWx0RHBpKCk7Ci1RVF9FTkRfTkFNRVNQQUNFCi0KLXZvaWQgUVdl
YkZyYW1lUHJpdmF0ZTo6c2V0UGFnZShRV2ViUGFnZSogbmV3UGFnZSkKLXsKLSAgICBpZiAocGFn
ZSA9PSBuZXdQYWdlKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBUaGUgUVdlYkZyYW1lIGlz
IGNyZWF0ZWQgYXMgYSBjaGlsZCBvZiBRV2ViUGFnZSBvciBhIHBhcmVudCBRV2ViRnJhbWUuCi0g
ICAgLy8gVGhhdCBhZGRzIGl0IHRvIFFPYmplY3QncyBpbnRlcm5hbCBjaGlsZHJlbiBsaXN0IGFu
ZCBlbnN1cmVzIGl0IHdpbGwgYmUKLSAgICAvLyBkZWxldGVkIHdoZW4gcGFyZW50IFFXZWJQYWdl
IGlzIGRlbGV0ZWQuIFJlcGFyZW50IGlmIG5lZWRlZC4KLSAgICBpZiAocS0+cGFyZW50KCkgPT0g
cW9iamVjdF9jYXN0PFFPYmplY3QqPihwYWdlKSkKLSAgICAgICAgcS0+c2V0UGFyZW50KG5ld1Bh
Z2UpOwotCi0gICAgcGFnZSA9IG5ld1BhZ2U7Ci0gICAgcGFnZUFkYXB0ZXIgPSBuZXdQYWdlLT5o
YW5kbGUoKTsKLSAgICBlbWl0IHEtPnBhZ2VDaGFuZ2VkKCk7Ci19Ci0KLVdlYkNvcmU6OlNjcm9s
bGJhciogUVdlYkZyYW1lUHJpdmF0ZTo6aG9yaXpvbnRhbFNjcm9sbEJhcigpIGNvbnN0Ci17Ci0g
ICAgaWYgKCFmcmFtZS0+dmlldygpKQotICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gZnJh
bWUtPnZpZXcoKS0+aG9yaXpvbnRhbFNjcm9sbGJhcigpOwotfQotCi1XZWJDb3JlOjpTY3JvbGxi
YXIqIFFXZWJGcmFtZVByaXZhdGU6OnZlcnRpY2FsU2Nyb2xsQmFyKCkgY29uc3QKLXsKLSAgICBp
ZiAoIWZyYW1lLT52aWV3KCkpCi0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiBmcmFtZS0+
dmlldygpLT52ZXJ0aWNhbFNjcm9sbGJhcigpOwotfQotCi0jaWYgVVNFKFRJTEVEX0JBQ0tJTkdf
U1RPUkUpCi12b2lkIFFXZWJGcmFtZVByaXZhdGU6OnJlbmRlckZyb21UaWxlZEJhY2tpbmdTdG9y
ZShHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IFFSZWdpb24mIGNsaXApCi17Ci0gICAg
QVNTRVJUKGZyYW1lLT50aWxlZEJhY2tpbmdTdG9yZSgpKTsKLQotICAgIGlmICghZnJhbWUtPnZp
ZXcoKSB8fCAhZnJhbWUtPmNvbnRlbnRSZW5kZXJlcigpKQotICAgICAgICByZXR1cm47Ci0KLSAg
ICBRVmVjdG9yPFFSZWN0PiB2ZWN0b3IgPSBjbGlwLnJlY3RzKCk7Ci0gICAgaWYgKHZlY3Rvci5p
c0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIFFQYWludGVyKiBwYWludGVyID0gY29u
dGV4dC0+cGxhdGZvcm1Db250ZXh0KCk7Ci0KLSAgICBXZWJDb3JlOjpGcmFtZVZpZXcqIHZpZXcg
PSBmcmFtZS0+dmlldygpOwotICAgIAotICAgIGludCBzY3JvbGxYID0gdmlldy0+c2Nyb2xsWCgp
OwotICAgIGludCBzY3JvbGxZID0gdmlldy0+c2Nyb2xsWSgpOwotICAgIGNvbnRleHQtPnRyYW5z
bGF0ZSgtc2Nyb2xsWCwgLXNjcm9sbFkpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2ZWN0
b3Iuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgY29uc3QgUVJlY3QmIGNsaXBSZWN0ID0gdmVjdG9y
LmF0KGkpOwotCi0gICAgICAgIHBhaW50ZXItPnNhdmUoKTsKLSAgICAgICAgCi0gICAgICAgIFFS
ZWN0IHJlY3QgPSBjbGlwUmVjdC50cmFuc2xhdGVkKHNjcm9sbFgsIHNjcm9sbFkpOwotICAgICAg
ICBwYWludGVyLT5zZXRDbGlwUmVjdChyZWN0LCBRdDo6SW50ZXJzZWN0Q2xpcCk7Ci0KLSAgICAg
ICAgZnJhbWUtPnRpbGVkQmFja2luZ1N0b3JlKCktPnBhaW50KGNvbnRleHQsIHJlY3QpOwotCi0g
ICAgICAgIHBhaW50ZXItPnJlc3RvcmUoKTsKLSAgICB9Ci0KLSNpZiBVU0UoQUNDRUxFUkFURURf
Q09NUE9TSVRJTkcpCi0gICAgcmVuZGVyQ29tcG9zaXRlZExheWVycyhjb250ZXh0LCBJbnRSZWN0
KGNsaXAuYm91bmRpbmdSZWN0KCkpKTsKLSAgICByZW5kZXJGcmFtZUV4dHJhcyhjb250ZXh0LCBR
RmxhZ3M8UVdlYkZyYW1lOjpSZW5kZXJMYXllcj4oUVdlYkZyYW1lOjpTY3JvbGxCYXJMYXllcikg
fCBRV2ViRnJhbWU6OlBhbkljb25MYXllciwgY2xpcCk7Ci0jZW5kaWYKLX0KLSNlbmRpZgotCi0j
aWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQotdm9pZCBRV2ViRnJhbWVQcml2YXRlOjpy
ZW5kZXJDb21wb3NpdGVkTGF5ZXJzKEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgY29uc3QgSW50
UmVjdCYgY2xpcCkKLXsKLSAgICBpZiAoIXJvb3RUZXh0dXJlTWFwcGVyTGF5ZXIgfHwgIXRleHR1
cmVNYXBwZXIpCi0gICAgICAgIHJldHVybjsKLQotICAgIHRleHR1cmVNYXBwZXItPnNldEdyYXBo
aWNzQ29udGV4dChjb250ZXh0KTsKLSAgICB0ZXh0dXJlTWFwcGVyLT5zZXRJbWFnZUludGVycG9s
YXRpb25RdWFsaXR5KGNvbnRleHQtPmltYWdlSW50ZXJwb2xhdGlvblF1YWxpdHkoKSk7Ci0gICAg
dGV4dHVyZU1hcHBlci0+c2V0VGV4dERyYXdpbmdNb2RlKGNvbnRleHQtPnRleHREcmF3aW5nTW9k
ZSgpKTsKLSAgICBRUGFpbnRlciogcGFpbnRlciA9IGNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgp
OwotICAgIGNvbnN0IFFUcmFuc2Zvcm0gdHJhbnNmb3JtID0gcGFpbnRlci0+d29ybGRUcmFuc2Zv
cm0oKTsKLSAgICBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBtYXRyaXgoCi0gICAgICAgICAg
ICAgICAgdHJhbnNmb3JtLm0xMSgpLCB0cmFuc2Zvcm0ubTEyKCksIDAsIHRyYW5zZm9ybS5tMTMo
KSwKLSAgICAgICAgICAgICAgICB0cmFuc2Zvcm0ubTIxKCksIHRyYW5zZm9ybS5tMjIoKSwgMCwg
dHJhbnNmb3JtLm0yMygpLAotICAgICAgICAgICAgICAgIDAsIDAsIDEsIDAsCi0gICAgICAgICAg
ICAgICAgdHJhbnNmb3JtLm0zMSgpLCB0cmFuc2Zvcm0ubTMyKCksIDAsIHRyYW5zZm9ybS5tMzMo
KQotICAgICAgICAgICAgICAgICk7Ci0gICAgcm9vdFRleHR1cmVNYXBwZXJMYXllci0+c2V0VHJh
bnNmb3JtKG1hdHJpeCk7Ci0gICAgcm9vdFRleHR1cmVNYXBwZXJMYXllci0+c2V0T3BhY2l0eShw
YWludGVyLT5vcGFjaXR5KCkpOwotICAgIHRleHR1cmVNYXBwZXItPmJlZ2luUGFpbnRpbmcoKTsK
LSAgICB0ZXh0dXJlTWFwcGVyLT5iZWdpbkNsaXAobWF0cml4LCBjbGlwKTsKLSAgICByb290VGV4
dHVyZU1hcHBlckxheWVyLT5wYWludCgpOwotICAgIHRleHR1cmVNYXBwZXItPmVuZENsaXAoKTsK
LSAgICB0ZXh0dXJlTWFwcGVyLT5lbmRQYWludGluZygpOwotfQotI2VuZGlmCi0KLS8vIFRoaXMg
Y29kZSBpcyBjb3BpZWQgZnJvbSBDaHJvbWVDbGllbnRHdGsuY3BwLgotc3RhdGljIHZvaWQgY29h
bGVzY2VSZWN0c0lmUG9zc2libGUoY29uc3QgUVJlY3QmIGNsaXBSZWN0LCBRVmVjdG9yPFFSZWN0
PiYgcmVjdHMpCi17Ci0gICAgY29uc3QgdW5zaWduZWQgaW50IHJlY3RUaHJlc2hvbGQgPSAxMDsK
LSAgICBjb25zdCBmbG9hdCB3YXN0ZWRTcGFjZVRocmVzaG9sZCA9IDAuNzVmOwotICAgIGJvb2wg
dXNlVW5pb25lZFJlY3QgPSAocmVjdHMuc2l6ZSgpIDw9IDEpIHx8IChyZWN0cy5zaXplKCkgPiBy
ZWN0VGhyZXNob2xkKTsKLSAgICBpZiAoIXVzZVVuaW9uZWRSZWN0KSB7Ci0gICAgICAgIC8vIEF0
dGVtcHQgdG8gZ3Vlc3Mgd2hldGhlciBvciBub3Qgd2Ugc2hvdWxkIHVzZSB0aGUgdW5pb25lZCBy
ZWN0IG9yIHRoZSBpbmRpdmlkdWFsIHJlY3RzLgotICAgICAgICAvLyBXZSBkbyB0aGlzIGJ5IGNv
bXB1dGluZyB0aGUgcGVyY2VudGFnZSBvZiAid2FzdGVkIHNwYWNlIiBpbiB0aGUgdW5pb24uIElm
IHRoYXQgd2FzdGVkIHNwYWNlCi0gICAgICAgIC8vIGlzIHRvbyBsYXJnZSwgdGhlbiB3ZSB3aWxs
IGRvIGluZGl2aWR1YWwgcmVjdCBwYWludGluZyBpbnN0ZWFkLgotICAgICAgICBmbG9hdCB1bmlv
blBpeGVscyA9IChjbGlwUmVjdC53aWR0aCgpICogY2xpcFJlY3QuaGVpZ2h0KCkpOwotICAgICAg
ICBmbG9hdCBzaW5nbGVQaXhlbHMgPSAwOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8
IHJlY3RzLnNpemUoKTsgKytpKQotICAgICAgICAgICAgc2luZ2xlUGl4ZWxzICs9IHJlY3RzW2ld
LndpZHRoKCkgKiByZWN0c1tpXS5oZWlnaHQoKTsKLSAgICAgICAgZmxvYXQgd2FzdGVkU3BhY2Ug
PSAxIC0gKHNpbmdsZVBpeGVscyAvIHVuaW9uUGl4ZWxzKTsKLSAgICAgICAgaWYgKHdhc3RlZFNw
YWNlIDw9IHdhc3RlZFNwYWNlVGhyZXNob2xkKQotICAgICAgICAgICAgdXNlVW5pb25lZFJlY3Qg
PSB0cnVlOwotICAgIH0KLQotICAgIGlmICghdXNlVW5pb25lZFJlY3QpCi0gICAgICAgIHJldHVy
bjsKLQotICAgIHJlY3RzLmNsZWFyKCk7Ci0gICAgcmVjdHMuYXBwZW5kKGNsaXBSZWN0KTsKLX0K
LQotdm9pZCBRV2ViRnJhbWVQcml2YXRlOjpyZW5kZXJSZWxhdGl2ZUNvb3JkcyhHcmFwaGljc0Nv
bnRleHQqIGNvbnRleHQsIFFGbGFnczxRV2ViRnJhbWU6OlJlbmRlckxheWVyPiBsYXllcnMsIGNv
bnN0IFFSZWdpb24mIGNsaXApCi17Ci0gICAgaWYgKCFmcmFtZS0+dmlldygpIHx8ICFmcmFtZS0+
Y29udGVudFJlbmRlcmVyKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIFFWZWN0b3I8UVJlY3Q+
IHZlY3RvciA9IGNsaXAucmVjdHMoKTsKLSAgICBpZiAodmVjdG9yLmlzRW1wdHkoKSkKLSAgICAg
ICAgcmV0dXJuOwotCi0gICAgUVBhaW50ZXIqIHBhaW50ZXIgPSBjb250ZXh0LT5wbGF0Zm9ybUNv
bnRleHQoKTsKLQotICAgIFdlYkNvcmU6OkZyYW1lVmlldyogdmlldyA9IGZyYW1lLT52aWV3KCk7
Ci0gICAgdmlldy0+dXBkYXRlTGF5b3V0QW5kU3R5bGVJZk5lZWRlZFJlY3Vyc2l2ZSgpOwotCi0g
ICAgaWYgKGxheWVycyAmIFFXZWJGcmFtZTo6Q29udGVudHNMYXllcikgewotICAgICAgICBRUmVj
dCBjbGlwQm91bmRpbmdSZWN0ID0gY2xpcC5ib3VuZGluZ1JlY3QoKTsKLSAgICAgICAgY29hbGVz
Y2VSZWN0c0lmUG9zc2libGUoY2xpcEJvdW5kaW5nUmVjdCwgdmVjdG9yKTsKLSAgICAgICAgZm9y
IChpbnQgaSA9IDA7IGkgPCB2ZWN0b3Iuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIGNvbnN0
IFFSZWN0JiBjbGlwUmVjdCA9IHZlY3Rvci5hdChpKTsKLQotICAgICAgICAgICAgUVJlY3QgcmVj
dCA9IGNsaXBSZWN0LmludGVyc2VjdGVkKHZpZXctPmZyYW1lUmVjdCgpKTsKLQotICAgICAgICAg
ICAgY29udGV4dC0+c2F2ZSgpOwotICAgICAgICAgICAgcGFpbnRlci0+c2V0Q2xpcFJlY3QoY2xp
cFJlY3QsIFF0OjpJbnRlcnNlY3RDbGlwKTsKLQotICAgICAgICAgICAgaW50IHggPSB2aWV3LT54
KCk7Ci0gICAgICAgICAgICBpbnQgeSA9IHZpZXctPnkoKTsKLQotICAgICAgICAgICAgaW50IHNj
cm9sbFggPSB2aWV3LT5zY3JvbGxYKCk7Ci0gICAgICAgICAgICBpbnQgc2Nyb2xsWSA9IHZpZXct
PnNjcm9sbFkoKTsKLQotICAgICAgICAgICAgY29udGV4dC0+dHJhbnNsYXRlKHgsIHkpOwotICAg
ICAgICAgICAgcmVjdC50cmFuc2xhdGUoLXgsIC15KTsKLSAgICAgICAgICAgIGNvbnRleHQtPnRy
YW5zbGF0ZSgtc2Nyb2xsWCwgLXNjcm9sbFkpOwotICAgICAgICAgICAgcmVjdC50cmFuc2xhdGUo
c2Nyb2xsWCwgc2Nyb2xsWSk7Ci0gICAgICAgICAgICBjb250ZXh0LT5jbGlwKHZpZXctPnZpc2li
bGVDb250ZW50UmVjdCgpKTsKLQotICAgICAgICAgICAgdmlldy0+cGFpbnRDb250ZW50cyhjb250
ZXh0LCByZWN0KTsKLQotICAgICAgICAgICAgY29udGV4dC0+cmVzdG9yZSgpOwotICAgICAgICB9
Ci0jaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQotICAgICAgICByZW5kZXJDb21wb3Np
dGVkTGF5ZXJzKGNvbnRleHQsIEludFJlY3QoY2xpcEJvdW5kaW5nUmVjdCkpOwotI2VuZGlmCi0g
ICAgfQotICAgIHJlbmRlckZyYW1lRXh0cmFzKGNvbnRleHQsIGxheWVycywgY2xpcCk7Ci0jaWYg
RU5BQkxFKElOU1BFQ1RPUikKLSAgICBpZiAoZnJhbWUtPnBhZ2UoKS0+aW5zcGVjdG9yQ29udHJv
bGxlcigpLT5oaWdobGlnaHRlZE5vZGUoKSkgewotICAgICAgICBjb250ZXh0LT5zYXZlKCk7Ci0g
ICAgICAgIGZyYW1lLT5wYWdlKCktPmluc3BlY3RvckNvbnRyb2xsZXIoKS0+ZHJhd0hpZ2hsaWdo
dCgqY29udGV4dCk7Ci0gICAgICAgIGNvbnRleHQtPnJlc3RvcmUoKTsKLSAgICB9Ci0jZW5kaWYK
LX0KLQotdm9pZCBRV2ViRnJhbWVQcml2YXRlOjpyZW5kZXJGcmFtZUV4dHJhcyhHcmFwaGljc0Nv
bnRleHQqIGNvbnRleHQsIFFGbGFnczxRV2ViRnJhbWU6OlJlbmRlckxheWVyPiBsYXllcnMsIGNv
bnN0IFFSZWdpb24mIGNsaXApCi17Ci0gICAgaWYgKCEobGF5ZXJzICYgKFFXZWJGcmFtZTo6UGFu
SWNvbkxheWVyIHwgUVdlYkZyYW1lOjpTY3JvbGxCYXJMYXllcikpKQotICAgICAgICByZXR1cm47
Ci0gICAgUVBhaW50ZXIqIHBhaW50ZXIgPSBjb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKTsKLSAg
ICBXZWJDb3JlOjpGcmFtZVZpZXcqIHZpZXcgPSBmcmFtZS0+dmlldygpOwotICAgIFFWZWN0b3I8
UVJlY3Q+IHZlY3RvciA9IGNsaXAucmVjdHMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHZl
Y3Rvci5zaXplKCk7ICsraSkgewotICAgICAgICBjb25zdCBRUmVjdCYgY2xpcFJlY3QgPSB2ZWN0
b3IuYXQoaSk7Ci0KLSAgICAgICAgUVJlY3QgaW50ZXJzZWN0ZWRSZWN0ID0gY2xpcFJlY3QuaW50
ZXJzZWN0ZWQodmlldy0+ZnJhbWVSZWN0KCkpOwotCi0gICAgICAgIHBhaW50ZXItPnNhdmUoKTsK
LSAgICAgICAgcGFpbnRlci0+c2V0Q2xpcFJlY3QoY2xpcFJlY3QsIFF0OjpJbnRlcnNlY3RDbGlw
KTsKLQotICAgICAgICBpbnQgeCA9IHZpZXctPngoKTsKLSAgICAgICAgaW50IHkgPSB2aWV3LT55
KCk7Ci0KLSAgICAgICAgaWYgKGxheWVycyAmIFFXZWJGcmFtZTo6U2Nyb2xsQmFyTGF5ZXIKLSAg
ICAgICAgICAgICYmICF2aWV3LT5zY3JvbGxiYXJzU3VwcHJlc3NlZCgpCi0gICAgICAgICAgICAm
JiAodmlldy0+aG9yaXpvbnRhbFNjcm9sbGJhcigpIHx8IHZpZXctPnZlcnRpY2FsU2Nyb2xsYmFy
KCkpKSB7Ci0KLSAgICAgICAgICAgIFFSZWN0IHJlY3QgPSBpbnRlcnNlY3RlZFJlY3Q7Ci0gICAg
ICAgICAgICBjb250ZXh0LT50cmFuc2xhdGUoeCwgeSk7Ci0gICAgICAgICAgICByZWN0LnRyYW5z
bGF0ZSgteCwgLXkpOwotICAgICAgICAgICAgdmlldy0+cGFpbnRTY3JvbGxiYXJzKGNvbnRleHQs
IHJlY3QpOwotICAgICAgICAgICAgY29udGV4dC0+dHJhbnNsYXRlKC14LCAteSk7Ci0gICAgICAg
IH0KLQotI2lmIEVOQUJMRShQQU5fU0NST0xMSU5HKQotICAgICAgICBpZiAobGF5ZXJzICYgUVdl
YkZyYW1lOjpQYW5JY29uTGF5ZXIpCi0gICAgICAgICAgICB2aWV3LT5wYWludFBhblNjcm9sbElj
b24oY29udGV4dCk7Ci0jZW5kaWYKLQotICAgICAgICBwYWludGVyLT5yZXN0b3JlKCk7Ci0gICAg
fQotfQotCi12b2lkIFFXZWJGcmFtZVByaXZhdGU6OmVtaXRVcmxDaGFuZ2VkKCkKLXsKLSAgICB1
cmwgPSBmcmFtZS0+ZG9jdW1lbnQoKS0+dXJsKCk7Ci0gICAgZW1pdCBxLT51cmxDaGFuZ2VkKHVy
bCk7Ci19Ci0KLXZvaWQgUVdlYkZyYW1lUHJpdmF0ZTo6ZGlkU3RhcnRQcm92aXNpb25hbExvYWQo
KQotewotICAgIGVtaXQgcS0+cHJvdmlzaW9uYWxMb2FkKCk7Ci19Ci0KLXZvaWQgUVdlYkZyYW1l
UHJpdmF0ZTo6X3Ffb3JpZW50YXRpb25DaGFuZ2VkKCkKLXsKLSNpZiBFTkFCTEUoT1JJRU5UQVRJ
T05fRVZFTlRTKQotICAgIGludCBvcmllbnRhdGlvbjsKLSAgICBXZWJDb3JlOjpGcmFtZSogZnJh
bWUgPSBjb3JlKHEpOwotCi0gICAgc3dpdGNoIChtX29yaWVudGF0aW9uLnJlYWRpbmcoKS0+b3Jp
ZW50YXRpb24oKSkgewotICAgIGNhc2UgUU9yaWVudGF0aW9uUmVhZGluZzo6VG9wVXA6Ci0gICAg
ICAgIG9yaWVudGF0aW9uID0gMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBRT3JpZW50YXRp
b25SZWFkaW5nOjpUb3BEb3duOgotICAgICAgICBvcmllbnRhdGlvbiA9IDE4MDsKLSAgICAgICAg
YnJlYWs7Ci0gICAgY2FzZSBRT3JpZW50YXRpb25SZWFkaW5nOjpMZWZ0VXA6Ci0gICAgICAgIG9y
aWVudGF0aW9uID0gLTkwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFFPcmllbnRhdGlvblJl
YWRpbmc6OlJpZ2h0VXA6Ci0gICAgICAgIG9yaWVudGF0aW9uID0gOTA7Ci0gICAgICAgIGJyZWFr
OwotICAgIGNhc2UgUU9yaWVudGF0aW9uUmVhZGluZzo6RmFjZVVwOgotICAgIGNhc2UgUU9yaWVu
dGF0aW9uUmVhZGluZzo6RmFjZURvd246Ci0gICAgICAgIC8vIFdlYkNvcmUgdW5hYmxlIHRvIGhh
bmRsZSBpdAotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZnJhbWUt
PnNlbmRPcmllbnRhdGlvbkNoYW5nZUV2ZW50KG9yaWVudGF0aW9uKTsKLSNlbmRpZgotfQotCi12
b2lkIFFXZWJGcmFtZVByaXZhdGU6OmRpZENsZWFyV2luZG93T2JqZWN0KCkKLXsKLSAgICBlbWl0
IHEtPmphdmFTY3JpcHRXaW5kb3dPYmplY3RDbGVhcmVkKCk7Ci19Ci0KLWJvb2wgUVdlYkZyYW1l
UHJpdmF0ZTo6aGFuZGxlUHJvZ3Jlc3NGaW5pc2hlZChRUG9pbnQgKmxvY2FsUG9zKQotewotICAg
IFFXaWRnZXQgKnZpZXcgPSBxLT5wYWdlKCktPnZpZXcoKTsKLSAgICBpZiAoIXZpZXcgfHwgIWxv
Y2FsUG9zKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgKmxvY2FsUG9zID0gdmlldy0+bWFw
RnJvbUdsb2JhbChRQ3Vyc29yOjpwb3MoKSk7Ci0gICAgcmV0dXJuIHZpZXctPmhhc0ZvY3VzKCkg
JiYgdmlldy0+cmVjdCgpLmNvbnRhaW5zKCpsb2NhbFBvcyk7Ci19Ci0KLXZvaWQgUVdlYkZyYW1l
UHJpdmF0ZTo6ZW1pdEluaXRpYWxMYXlvdXRDb21wbGV0ZWQoKQotewotICAgIGVtaXQgcS0+aW5p
dGlhbExheW91dENvbXBsZXRlZCgpOwotfQotCi12b2lkIFFXZWJGcmFtZVByaXZhdGU6OmVtaXRJ
Y29uQ2hhbmdlZCgpCi17Ci0gICAgZW1pdCBxLT5pY29uQ2hhbmdlZCgpOwotfQotCi12b2lkIFFX
ZWJGcmFtZVByaXZhdGU6OmVtaXRMb2FkU3RhcnRlZChib29sIG9yaWdpbmF0aW5nTG9hZCkKLXsK
LSAgICBpZiAocGFnZSAmJiBvcmlnaW5hdGluZ0xvYWQpCi0gICAgICAgIGVtaXQgcGFnZS0+bG9h
ZFN0YXJ0ZWQoKTsKLSAgICBlbWl0IHEtPmxvYWRTdGFydGVkKCk7Ci19Ci0KLXZvaWQgUVdlYkZy
YW1lUHJpdmF0ZTo6ZW1pdExvYWRGaW5pc2hlZChib29sIG9yaWdpbmF0aW5nTG9hZCwgYm9vbCBv
aykKLXsKLSAgICBpZiAocGFnZSAmJiBvcmlnaW5hdGluZ0xvYWQpCi0gICAgICAgIGVtaXQgcGFn
ZS0+bG9hZEZpbmlzaGVkKG9rKTsKLSAgICBlbWl0IHEtPmxvYWRGaW5pc2hlZChvayk7Ci19Ci0K
LVFXZWJGcmFtZUFkYXB0ZXIqIFFXZWJGcmFtZVByaXZhdGU6OmNyZWF0ZUNoaWxkRnJhbWUoUVdl
YkZyYW1lRGF0YSogZnJhbWVEYXRhKQotewotICAgIFFXZWJGcmFtZSogbmV3RnJhbWUgPSBuZXcg
UVdlYkZyYW1lKC8qcGFyZW50IGZyYW1lKi9xLCBmcmFtZURhdGEpOwotICAgIHJldHVybiBuZXdG
cmFtZS0+ZDsKLX0KLQotUVdlYkZyYW1lICpRV2ViRnJhbWVQcml2YXRlOjphcGlIYW5kbGUoKQot
ewotICAgIHJldHVybiBxOwotfQotCi1RT2JqZWN0ICpRV2ViRnJhbWVQcml2YXRlOjpoYW5kbGUo
KQotewotICAgIHJldHVybiBxOwotfQotCi12b2lkIFFXZWJGcmFtZVByaXZhdGU6OmNvbnRlbnRz
U2l6ZURpZENoYW5nZShjb25zdCBRU2l6ZSAmc2l6ZSkKLXsKLSAgICBlbWl0IHEtPmNvbnRlbnRz
U2l6ZUNoYW5nZWQoc2l6ZSk7Ci19Ci0KLWludCBRV2ViRnJhbWVQcml2YXRlOjpzY3JvbGxCYXJQ
b2xpY3koUXQ6Ok9yaWVudGF0aW9uIG9yaWVudGF0aW9uKSBjb25zdAotewotICAgIHJldHVybiAo
aW50KSBxLT5zY3JvbGxCYXJQb2xpY3kob3JpZW50YXRpb24pOwotfQotCi0vKiEKLSAgICBcY2xh
c3MgUVdlYkZyYW1lCi0gICAgXHNpbmNlIDQuNAotICAgIFxicmllZiBUaGUgUVdlYkZyYW1lIGNs
YXNzIHJlcHJlc2VudHMgYSBmcmFtZSBpbiBhIHdlYiBwYWdlLgotCi0gICAgXGlubW9kdWxlIFF0
V2ViS2l0Ci0KLSAgICBRV2ViRnJhbWUgcmVwcmVzZW50cyBhIGZyYW1lIGluc2lkZSBhIHdlYiBw
YWdlLiBFYWNoIFFXZWJQYWdlCi0gICAgb2JqZWN0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBmcmFt
ZSwgdGhlIG1haW4gZnJhbWUsIG9idGFpbmVkIHVzaW5nCi0gICAgUVdlYlBhZ2U6Om1haW5GcmFt
ZSgpLiBBZGRpdGlvbmFsIGZyYW1lcyB3aWxsIGJlIGNyZWF0ZWQgZm9yIEhUTUwKLSAgICBcY3s8
ZnJhbWU+fSBvciBcY3s8aWZyYW1lPn0gZWxlbWVudHMuCi0KLSAgICBBIGZyYW1lIGNhbiBiZSBs
b2FkZWQgdXNpbmcgbG9hZCgpIG9yIHNldFVybCgpLiBBbHRlcm5hdGl2ZWx5LCBpZiB5b3UgaGF2
ZQotICAgIHRoZSBIVE1MIGNvbnRlbnQgcmVhZGlseSBhdmFpbGFibGUsIHlvdSBjYW4gdXNlIHNl
dEh0bWwoKSBpbnN0ZWFkLgotCi0gICAgVGhlIHBhZ2UoKSBmdW5jdGlvbiByZXR1cm5zIGEgcG9p
bnRlciB0byB0aGUgd2ViIHBhZ2Ugb2JqZWN0LiBTZWUKLSAgICBcbHtRV2ViVmlld317RWxlbWVu
dHMgb2YgUVdlYlZpZXd9IGZvciBhbiBleHBsYW5hdGlvbiBvZiBob3cgd2ViCi0gICAgZnJhbWVz
IGFyZSByZWxhdGVkIHRvIGEgd2ViIHBhZ2UgYW5kIHdlYiB2aWV3LgotCi0gICAgVGhlIFFXZWJG
cmFtZSBjbGFzcyBhbHNvIG9mZmVycyBtZXRob2RzIHRvIHJldHJpZXZlIGJvdGggdGhlIFVSTCBj
dXJyZW50bHkKLSAgICBsb2FkZWQgYnkgdGhlIGZyYW1lIChzZWUgdXJsKCkpIGFzIHdlbGwgYXMg
dGhlIFVSTCBvcmlnaW5hbGx5IHJlcXVlc3RlZAotICAgIHRvIGJlIGxvYWRlZCAoc2VlIHJlcXVl
c3RlZFVybCgpKS4gVGhlc2UgbWV0aG9kcyBtYWtlIHBvc3NpYmxlIHRoZSByZXRyaWV2YWwKLSAg
ICBvZiB0aGUgVVJMIGJlZm9yZSBhbmQgYWZ0ZXIgYSBETlMgcmVzb2x1dGlvbiBvciBhIHJlZGly
ZWN0aW9uIG9jY3VycyBkdXJpbmcKLSAgICB0aGUgbG9hZCBwcm9jZXNzLiBUaGUgcmVxdWVzdGVk
VXJsKCkgYWxzbyBtYXRjaGVzIHRvIHRoZSBVUkwgYWRkZWQgdG8gdGhlCi0gICAgZnJhbWUgaGlz
dG9yeSAoXGx7UVdlYkhpc3Rvcnl9KSBpZiBsb2FkIGlzIHN1Y2Nlc3NmdWwuCi0KLSAgICBUaGUg
dGl0bGUgb2YgYW4gSFRNTCBmcmFtZSBjYW4gYmUgYWNjZXNzZWQgd2l0aCB0aGUgdGl0bGUoKSBw
cm9wZXJ0eS4KLSAgICBBZGRpdGlvbmFsbHksIGEgZnJhbWUgbWF5IGFsc28gc3BlY2lmeSBhbiBp
Y29uLCB3aGljaCBjYW4gYmUgYWNjZXNzZWQKLSAgICB1c2luZyB0aGUgaWNvbigpIHByb3BlcnR5
LiBJZiB0aGUgdGl0bGUgb3IgdGhlIGljb24gY2hhbmdlcywgdGhlCi0gICAgY29ycmVzcG9uZGlu
ZyB0aXRsZUNoYW5nZWQoKSBhbmQgaWNvbkNoYW5nZWQoKSBzaWduYWxzIHdpbGwgYmUgZW1pdHRl
ZC4KLSAgICBUaGUgem9vbUZhY3RvcigpIHByb3BlcnR5IGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0
aGUgb3ZlcmFsbCBzaXplCi0gICAgb2YgdGhlIGNvbnRlbnQgZGlzcGxheWVkIGluIHRoZSBmcmFt
ZS4KLQotICAgIFFXZWJGcmFtZSBvYmplY3RzIGFyZSBjcmVhdGVkIGFuZCBjb250cm9sbGVkIGJ5
IHRoZSB3ZWIgcGFnZS4gWW91Ci0gICAgY2FuIGNvbm5lY3QgdG8gdGhlIHdlYiBwYWdlJ3MgXGx7
UVdlYlBhZ2U6On17ZnJhbWVDcmVhdGVkKCl9IHNpZ25hbAotICAgIHRvIGJlIG5vdGlmaWVkIHdo
ZW4gYSBuZXcgZnJhbWUgaXMgY3JlYXRlZC4KLQotICAgIFRoZXJlIGFyZSBtdWx0aXBsZSB3YXlz
IHRvIHByb2dyYW1tYXRpY2FsbHkgZXhhbWluZSB0aGUgY29udGVudHMgb2YgYSBmcmFtZS4KLSAg
ICBUaGUgaGl0VGVzdENvbnRlbnQoKSBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBmaW5kIGVsZW1l
bnRzIGJ5IGNvb3JkaW5hdGUuCi0gICAgRm9yIGFjY2VzcyB0byB0aGUgdW5kZXJseWluZyBET00g
dHJlZSwgdGhlcmUgaXMgZG9jdW1lbnRFbGVtZW50KCksCi0gICAgZmluZEFsbEVsZW1lbnRzKCkg
YW5kIGZpbmRGaXJzdEVsZW1lbnQoKS4KLQotICAgIEEgUVdlYkZyYW1lIGNhbiBiZSBwcmludGVk
IG9udG8gYSBRUHJpbnRlciB1c2luZyB0aGUgcHJpbnQoKSBmdW5jdGlvbi4KLSAgICBUaGlzIGZ1
bmN0aW9uIGlzIG1hcmtlZCBhcyBhIHNsb3QgYW5kIGNhbiBiZSBjb252ZW5pZW50bHkgY29ubmVj
dGVkIHRvCi0gICAgXGx7UVByaW50UHJldmlld0RpYWxvZ30ncyBcbHtRUHJpbnRQcmV2aWV3RGlh
bG9nOjp9e3BhaW50UmVxdWVzdGVkKCl9Ci0gICAgc2lnbmFsLgotCi0gICAgXHNhIFFXZWJQYWdl
Ci0qLwotCi0vKiEKLSAgICBcZW51bSBRV2ViRnJhbWU6OlJlbmRlckxheWVyCi0KLSAgICBUaGlz
IGVudW0gZGVzY3JpYmVzIHRoZSBsYXllcnMgYXZhaWxhYmxlIGZvciByZW5kZXJpbmcgdXNpbmcg
XGx7UVdlYkZyYW1lOjp9e3JlbmRlcigpfS4KLSAgICBUaGUgbGF5ZXJzIGNhbiBiZSBPUi1lZCB0
b2dldGhlciBmcm9tIHRoZSBmb2xsb3dpbmcgbGlzdDoKLQotICAgIFx2YWx1ZSBDb250ZW50c0xh
eWVyIFRoZSB3ZWIgY29udGVudCBvZiB0aGUgZnJhbWUKLSAgICBcdmFsdWUgU2Nyb2xsQmFyTGF5
ZXIgVGhlIHNjcm9sbGJhcnMgb2YgdGhlIGZyYW1lCi0gICAgXHZhbHVlIFBhbkljb25MYXllciBU
aGUgaWNvbiB1c2VkIHdoZW4gcGFubmluZyB0aGUgZnJhbWUKLQotICAgIFx2YWx1ZSBBbGxMYXll
cnMgSW5jbHVkZXMgYWxsIHRoZSBhYm92ZSBsYXllcnMKLSovCi0KLVFXZWJGcmFtZTo6UVdlYkZy
YW1lKFFXZWJQYWdlICpwYXJlbnRQYWdlKQotICAgIDogUU9iamVjdChwYXJlbnRQYWdlKQotICAg
ICwgZChuZXcgUVdlYkZyYW1lUHJpdmF0ZSkKLXsKLSAgICBkLT5wYWdlID0gcGFyZW50UGFnZTsK
LSAgICBkLT5xID0gdGhpczsKLSAgICBkLT5pbml0KC8qcGFnZSBhZGFwdGVyKi8gcGFyZW50UGFn
ZS0+aGFuZGxlKCkpOwotCi0jaWYgRU5BQkxFKE9SSUVOVEFUSU9OX0VWRU5UUykKLSAgICBjb25u
ZWN0KCZkLT5tX29yaWVudGF0aW9uLCBTSUdOQUwocmVhZGluZ0NoYW5nZWQoKSksIHRoaXMsIFNM
T1QoX3Ffb3JpZW50YXRpb25DaGFuZ2VkKCkpKTsKLSAgICBkLT5tX29yaWVudGF0aW9uLnN0YXJ0
KCk7Ci0jZW5kaWYKLX0KLQotUVdlYkZyYW1lOjpRV2ViRnJhbWUoUVdlYkZyYW1lKiBwYXJlbnQs
IFFXZWJGcmFtZURhdGEqIGZyYW1lRGF0YSkKLSAgICA6IFFPYmplY3QocGFyZW50KQotICAgICwg
ZChuZXcgUVdlYkZyYW1lUHJpdmF0ZSkKLXsKLSAgICBkLT5wYWdlID0gcGFyZW50LT5kLT5wYWdl
OwotICAgIGQtPnEgPSB0aGlzOwotICAgIGQtPmluaXQocGFyZW50LT5kLT5wYWdlQWRhcHRlciwg
ZnJhbWVEYXRhKTsKLSNpZiBFTkFCTEUoT1JJRU5UQVRJT05fRVZFTlRTKQotICAgIGNvbm5lY3Qo
JmQtPm1fb3JpZW50YXRpb24sIFNJR05BTChyZWFkaW5nQ2hhbmdlZCgpKSwgdGhpcywgU0xPVChf
cV9vcmllbnRhdGlvbkNoYW5nZWQoKSkpOwotICAgIGQtPm1fb3JpZW50YXRpb24uc3RhcnQoKTsK
LSNlbmRpZgotfQotCi1RV2ViRnJhbWU6On5RV2ViRnJhbWUoKQotewotICAgIGRlbGV0ZSBkOwot
fQotCi0vKiEKLSAgICBcZm4gdm9pZCBRV2ViRnJhbWU6OmFkZFRvSmF2YVNjcmlwdFdpbmRvd09i
amVjdChjb25zdCBRU3RyaW5nICZuYW1lLCBRT2JqZWN0ICpvYmplY3QsIFZhbHVlT3duZXJzaGlw
IG93bikKLQotICAgIE1ha2UgXGEgb2JqZWN0IGF2YWlsYWJsZSB1bmRlciBcYSBuYW1lIGZyb20g
d2l0aGluIHRoZSBmcmFtZSdzIEphdmFTY3JpcHQKLSAgICBjb250ZXh0LiBUaGUgXGEgb2JqZWN0
IHdpbGwgYmUgaW5zZXJ0ZWQgYXMgYSBjaGlsZCBvZiB0aGUgZnJhbWUncyB3aW5kb3cKLSAgICBv
YmplY3QuCi0KLSAgICBRdCBwcm9wZXJ0aWVzIHdpbGwgYmUgZXhwb3NlZCBhcyBKYXZhU2NyaXB0
IHByb3BlcnRpZXMgYW5kIHNsb3RzIGFzCi0gICAgSmF2YVNjcmlwdCBtZXRob2RzLgotICAgIFRo
ZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIEMrKyBhbmQgSmF2YVNjcmlwdCBpcyBleHBsYWluZWQgaW4g
dGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIFxse1RoZSBRdFdlYktpdCBCcmlkZ2V9e1F0V2ViS2l0
IGJyaWRnZX0uCi0KLSAgICBJZiB5b3Ugd2FudCB0byBlbnN1cmUgdGhhdCB5b3VyIFFPYmplY3Rz
IHJlbWFpbiBhY2Nlc3NpYmxlIGFmdGVyIGxvYWRpbmcgYQotICAgIG5ldyBVUkwsIHlvdSBzaG91
bGQgYWRkIHRoZW0gaW4gYSBzbG90IGNvbm5lY3RlZCB0byB0aGUKLSAgICBqYXZhU2NyaXB0V2lu
ZG93T2JqZWN0Q2xlYXJlZCgpIHNpZ25hbC4KLQotICAgIElmIEphdmFzY3JpcHQgaXMgbm90IGVu
YWJsZWQgZm9yIHRoaXMgcGFnZSwgdGhlbiB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuCi0KLSAg
ICBUaGUgb3duZXJzaGlwIG9mIFxhIG9iamVjdCBpcyBzcGVjaWZpZWQgdXNpbmcgXGEgb3duLgot
Ki8KLXZvaWQgUVdlYkZyYW1lOjphZGRUb0phdmFTY3JpcHRXaW5kb3dPYmplY3QoY29uc3QgUVN0
cmluZyAmbmFtZSwgUU9iamVjdCAqb2JqZWN0LCBWYWx1ZU93bmVyc2hpcCBvd25lcnNoaXApCi17
Ci0gICAgaWYgKCFwYWdlKCktPnNldHRpbmdzKCktPnRlc3RBdHRyaWJ1dGUoUVdlYlNldHRpbmdz
OjpKYXZhc2NyaXB0RW5hYmxlZCkpCi0gICAgICAgIHJldHVybjsKLSAgICBKU0M6OkJpbmRpbmdz
OjpRdEluc3RhbmNlOjpWYWx1ZU93bmVyc2hpcCB2YWx1ZU93bmVyc2hpcCA9IHN0YXRpY19jYXN0
PEpTQzo6QmluZGluZ3M6OlF0SW5zdGFuY2U6OlZhbHVlT3duZXJzaGlwPihvd25lcnNoaXApOwot
ICAgIEpTRE9NV2luZG93KiB3aW5kb3cgPSB0b0pTRE9NV2luZG93KGQtPmZyYW1lLCBtYWluVGhy
ZWFkTm9ybWFsV29ybGQoKSk7Ci0gICAgSlNDOjpCaW5kaW5nczo6Um9vdE9iamVjdCogcm9vdDsK
LSAgICBpZiAodmFsdWVPd25lcnNoaXAgPT0gSlNDOjpCaW5kaW5nczo6UXRJbnN0YW5jZTo6UXRP
d25lcnNoaXApCi0gICAgICAgIHJvb3QgPSBkLT5mcmFtZS0+c2NyaXB0KCktPmNhY2hlYWJsZUJp
bmRpbmdSb290T2JqZWN0KCk7Ci0gICAgZWxzZQotICAgICAgICByb290ID0gZC0+ZnJhbWUtPnNj
cmlwdCgpLT5iaW5kaW5nUm9vdE9iamVjdCgpOwotCi0gICAgaWYgKCF3aW5kb3cpIHsKLSAgICAg
ICAgcURlYnVnKCkgPDwgIldhcm5pbmc6IGNvdWxkbid0IGdldCB3aW5kb3cgb2JqZWN0IjsKLSAg
ICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoIXJvb3QpIHsKLSAgICAgICAgcURlYnVnKCkg
PDwgIldhcm5pbmc6IGNvdWxkbid0IGdldCByb290IG9iamVjdCI7Ci0gICAgICAgIHJldHVybjsK
LSAgICB9Ci0KLSAgICBKU0M6OkV4ZWNTdGF0ZSogZXhlYyA9IHdpbmRvdy0+Z2xvYmFsRXhlYygp
OwotICAgIEpTQzo6SlNMb2NrSG9sZGVyIGxvY2soZXhlYyk7Ci0KLSAgICBKU0M6OkpTT2JqZWN0
KiBydW50aW1lT2JqZWN0ID0KLSAgICAgICAgICAgIEpTQzo6QmluZGluZ3M6OlF0SW5zdGFuY2U6
OmdldFF0SW5zdGFuY2Uob2JqZWN0LCByb290LCB2YWx1ZU93bmVyc2hpcCktPmNyZWF0ZVJ1bnRp
bWVPYmplY3QoZXhlYyk7Ci0KLSAgICBKU0M6OlB1dFByb3BlcnR5U2xvdCBzbG90OwotICAgIHdp
bmRvdy0+bWV0aG9kVGFibGUoKS0+cHV0KHdpbmRvdywgZXhlYywgSlNDOjpJZGVudGlmaWVyKCZl
eGVjLT5nbG9iYWxEYXRhKCksIHJlaW50ZXJwcmV0X2Nhc3RfcHRyPGNvbnN0IFVDaGFyKj4obmFt
ZS5jb25zdERhdGEoKSksIG5hbWUubGVuZ3RoKCkpLCBydW50aW1lT2JqZWN0LCBzbG90KTsKLX0K
LQotLyohCi0gICAgUmV0dXJucyB0aGUgZnJhbWUncyBjb250ZW50IGFzIEhUTUwsIGVuY2xvc2Vk
IGluIEhUTUwgYW5kIEJPRFkgdGFncy4KLQotICAgIFxzYSBzZXRIdG1sKCksIHRvUGxhaW5UZXh0
KCkKLSovCi1RU3RyaW5nIFFXZWJGcmFtZTo6dG9IdG1sKCkgY29uc3QKLXsKLSAgICBpZiAoIWQt
PmZyYW1lLT5kb2N1bWVudCgpKQotICAgICAgICByZXR1cm4gUVN0cmluZygpOwotICAgIHJldHVy
biBjcmVhdGVNYXJrdXAoZC0+ZnJhbWUtPmRvY3VtZW50KCkpOwotfQotCi0vKiEKLSAgICBSZXR1
cm5zIHRoZSBjb250ZW50IG9mIHRoaXMgZnJhbWUgY29udmVydGVkIHRvIHBsYWluIHRleHQsIGNv
bXBsZXRlbHkKLSAgICBzdHJpcHBlZCBvZiBhbGwgSFRNTCBmb3JtYXR0aW5nLgotCi0gICAgXHNh
IHRvSHRtbCgpCi0qLwotUVN0cmluZyBRV2ViRnJhbWU6OnRvUGxhaW5UZXh0KCkgY29uc3QKLXsK
LSAgICBpZiAoZC0+ZnJhbWUtPnZpZXcoKSAmJiBkLT5mcmFtZS0+dmlldygpLT5sYXlvdXRQZW5k
aW5nKCkpCi0gICAgICAgIGQtPmZyYW1lLT52aWV3KCktPmxheW91dCgpOwotCi0gICAgRWxlbWVu
dCAqZG9jdW1lbnRFbGVtZW50ID0gZC0+ZnJhbWUtPmRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVu
dCgpOwotICAgIGlmIChkb2N1bWVudEVsZW1lbnQpCi0gICAgICAgIHJldHVybiBkb2N1bWVudEVs
ZW1lbnQtPmlubmVyVGV4dCgpOwotICAgIHJldHVybiBRU3RyaW5nKCk7Ci19Ci0KLS8qIQotICAg
IFJldHVybnMgYSBkdW1wIG9mIHRoZSByZW5kZXJpbmcgdHJlZS4gVGhpcyBpcyBtYWlubHkgdXNl
ZnVsIGZvciBkZWJ1Z2dpbmcKLSAgICBodG1sLgotKi8KLVFTdHJpbmcgUVdlYkZyYW1lOjpyZW5k
ZXJUcmVlRHVtcCgpIGNvbnN0Ci17Ci0gICAgaWYgKGQtPmZyYW1lLT52aWV3KCkgJiYgZC0+ZnJh
bWUtPnZpZXcoKS0+bGF5b3V0UGVuZGluZygpKQotICAgICAgICBkLT5mcmFtZS0+dmlldygpLT5s
YXlvdXQoKTsKLQotICAgIHJldHVybiBleHRlcm5hbFJlcHJlc2VudGF0aW9uKGQtPmZyYW1lKTsK
LX0KLQotLyohCi0gICAgXHByb3BlcnR5IFFXZWJGcmFtZTo6dGl0bGUKLSAgICBcYnJpZWYgdGhl
IHRpdGxlIG9mIHRoZSBmcmFtZSBhcyBkZWZpbmVkIGJ5IHRoZSBIVE1MICZsdDt0aXRsZSZndDsg
ZWxlbWVudAotCi0gICAgXHNhIHRpdGxlQ2hhbmdlZCgpCi0qLwotCi1RU3RyaW5nIFFXZWJGcmFt
ZTo6dGl0bGUoKSBjb25zdAotewotICAgIGlmIChkLT5mcmFtZS0+ZG9jdW1lbnQoKSkKLSAgICAg
ICAgcmV0dXJuIGQtPmZyYW1lLT5sb2FkZXIoKS0+ZG9jdW1lbnRMb2FkZXIoKS0+dGl0bGUoKS5z
dHJpbmcoKTsKLSAgICByZXR1cm4gUVN0cmluZygpOwotfQotCi0vKiEKLSAgICBcc2luY2UgNC41
Ci0gICAgXGJyaWVmIFJldHVybnMgdGhlIG1ldGEgZGF0YSBpbiB0aGlzIGZyYW1lIGFzIGEgUU11
bHRpTWFwCi0KLSAgICBUaGUgbWV0YSBkYXRhIGNvbnNpc3RzIG9mIHRoZSBuYW1lIGFuZCBjb250
ZW50IGF0dHJpYnV0ZXMgb2YgdGhlCi0gICAgb2YgdGhlIFxjezxtZXRhPn0gdGFncyBpbiB0aGUg
SFRNTCBkb2N1bWVudC4KLQotICAgIEZvciBleGFtcGxlOgotCi0gICAgXGNvZGUKLSAgICA8aHRt
bD4KLSAgICAgICAgPGhlYWQ+Ci0gICAgICAgICAgICA8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIg
Y29udGVudD0iVGhpcyBkb2N1bWVudCBpcyBhIHR1dG9yaWFsIGFib3V0IFF0IGRldmVsb3BtZW50
Ij4KLSAgICAgICAgICAgIDxtZXRhIG5hbWU9ImtleXdvcmRzIiBjb250ZW50PSJRdCwgV2ViS2l0
LCBQcm9ncmFtbWluZyI+Ci0gICAgICAgIDwvaGVhZD4KLSAgICAgICAgLi4uCi0gICAgPC9odG1s
PgotICAgIFxlbmRjb2RlCi0KLSAgICBHaXZlbiB0aGUgYWJvdmUgSFRNTCBjb2RlIHRoZSBtZXRh
RGF0YSgpIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGEgbWFwIHdpdGggdHdvIGVudHJpZXM6Ci0gICAg
XHRhYmxlCi0gICAgXGhlYWRlciBcbGkgS2V5Ci0gICAgICAgICAgICBcbGkgVmFsdWUKLSAgICBc
cm93ICAgIFxsaSAiZGVzY3JpcHRpb24iCi0gICAgICAgICAgICBcbGkgIlRoaXMgZG9jdW1lbnQg
aXMgYSB0dXRvcmlhbCBhYm91dCBRdCBkZXZlbG9wbWVudCIKLSAgICBccm93ICAgIFxsaSAia2V5
d29yZHMiCi0gICAgICAgICAgICBcbGkgIlF0LCBXZWJLaXQsIFByb2dyYW1taW5nIgotICAgIFxl
bmR0YWJsZQotCi0gICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgbXVsdGkgbWFwIHRvIHN1cHBv
cnQgbXVsdGlwbGUgbWV0YSB0YWdzIHdpdGggdGhlIHNhbWUgYXR0cmlidXRlIG5hbWUuCi0qLwot
UU11bHRpTWFwPFFTdHJpbmcsIFFTdHJpbmc+IFFXZWJGcmFtZTo6bWV0YURhdGEoKSBjb25zdAot
ewotICAgIGlmICghZC0+ZnJhbWUtPmRvY3VtZW50KCkpCi0gICAgICAgcmV0dXJuIFFNYXA8UVN0
cmluZywgUVN0cmluZz4oKTsKLQotICAgIFFNdWx0aU1hcDxRU3RyaW5nLCBRU3RyaW5nPiBtYXA7
Ci0gICAgRG9jdW1lbnQqIGRvYyA9IGQtPmZyYW1lLT5kb2N1bWVudCgpOwotICAgIFJlZlB0cjxO
b2RlTGlzdD4gbGlzdCA9IGRvYy0+Z2V0RWxlbWVudHNCeVRhZ05hbWUoIm1ldGEiKTsKLSAgICB1
bnNpZ25lZCBsZW4gPSBsaXN0LT5sZW5ndGgoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBp
IDwgbGVuOyBpKyspIHsKLSAgICAgICAgSFRNTE1ldGFFbGVtZW50KiBtZXRhID0gc3RhdGljX2Nh
c3Q8SFRNTE1ldGFFbGVtZW50Kj4obGlzdC0+aXRlbShpKSk7Ci0gICAgICAgIG1hcC5pbnNlcnQo
bWV0YS0+bmFtZSgpLCBtZXRhLT5jb250ZW50KCkpOwotICAgIH0KLSAgICByZXR1cm4gbWFwOwot
fQotCi1zdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJDb3JlRnJhbWUoV2ViQ29yZTo6RnJhbWUqIGZy
YW1lKQotewotICAgIFdlYkNvcmU6OkRvY3VtZW50TG9hZGVyKiBkb2N1bWVudExvYWRlciA9IGZy
YW1lLT5sb2FkZXIoKS0+YWN0aXZlRG9jdW1lbnRMb2FkZXIoKTsKLSAgICBRX0FTU0VSVChkb2N1
bWVudExvYWRlcik7Ci0gICAgZG9jdW1lbnRMb2FkZXItPndyaXRlcigpLT5iZWdpbigpOwotICAg
IGRvY3VtZW50TG9hZGVyLT53cml0ZXIoKS0+ZW5kKCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9v
bCBpc0NvcmVGcmFtZUNsZWFyKFdlYkNvcmU6OkZyYW1lKiBmcmFtZSkKLXsKLSAgICByZXR1cm4g
ZnJhbWUtPmRvY3VtZW50KCktPnVybCgpLmlzRW1wdHkoKTsKLX0KLQotLyohCi0gICAgXHByb3Bl
cnR5IFFXZWJGcmFtZTo6dXJsCi0gICAgXGJyaWVmIHRoZSB1cmwgb2YgdGhlIGZyYW1lIGN1cnJl
bnRseSB2aWV3ZWQKLQotICAgIFNldHRpbmcgdGhpcyBwcm9wZXJ0eSBjbGVhcnMgdGhlIHZpZXcg
YW5kIGxvYWRzIHRoZSBVUkwuCi0KLSAgICBCeSBkZWZhdWx0LCB0aGlzIHByb3BlcnR5IGNvbnRh
aW5zIGFuIGVtcHR5LCBpbnZhbGlkIFVSTC4KLQotICAgIFxzYSB1cmxDaGFuZ2VkKCkKLSovCi0K
LXZvaWQgUVdlYkZyYW1lOjpzZXRVcmwoY29uc3QgUVVybCAmdXJsKQotewotICAgIGNsZWFyQ29y
ZUZyYW1lKGQtPmZyYW1lKTsKLSAgICBjb25zdCBRVXJsIGFic29sdXRlID0gUVdlYkZyYW1lQWRh
cHRlcjo6ZW5zdXJlQWJzb2x1dGVVcmwodXJsKTsKLSAgICBkLT51cmwgPSBhYnNvbHV0ZTsKLSAg
ICBsb2FkKGFic29sdXRlKTsKLX0KLQotUVVybCBRV2ViRnJhbWU6OnVybCgpIGNvbnN0Ci17Ci0g
ICAgcmV0dXJuIGQtPnVybDsKLX0KLQotLyohCi0gICAgXHNpbmNlIDQuNgotICAgIFxwcm9wZXJ0
eSBRV2ViRnJhbWU6OnJlcXVlc3RlZFVybAotCi0gICAgVGhlIFVSTCByZXF1ZXN0ZWQgdG8gbG9h
ZGVkIGJ5IHRoZSBmcmFtZSBjdXJyZW50bHkgdmlld2VkLiBUaGUgVVJMIG1heSBkaWZmZXIgZnJv
bQotICAgIHRoZSBvbmUgcmV0dXJuZWQgYnkgdXJsKCkgaWYgYSBETlMgcmVzb2x1dGlvbiBvciBh
IHJlZGlyZWN0aW9uIG9jY3Vycy4KLQotICAgIFxzYSB1cmwoKSwgc2V0VXJsKCkKLSovCi1RVXJs
IFFXZWJGcmFtZTo6cmVxdWVzdGVkVXJsKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZC0+ZnJhbWVM
b2FkZXJDbGllbnQtPmxhc3RSZXF1ZXN0ZWRVcmwoKTsKLX0KLS8qIQotICAgIFxzaW5jZSA0LjYK
LSAgICBccHJvcGVydHkgUVdlYkZyYW1lOjpiYXNlVXJsCi0gICAgXGJyaWVmIHRoZSBiYXNlIFVS
TCBvZiB0aGUgZnJhbWUsIGNhbiBiZSB1c2VkIHRvIHJlc29sdmUgcmVsYXRpdmUgVVJMcwotICAg
IFxzaW5jZSA0LjYKLSovCi0KLVFVcmwgUVdlYkZyYW1lOjpiYXNlVXJsKCkgY29uc3QKLXsKLSAg
ICBpZiAoaXNDb3JlRnJhbWVDbGVhcihkLT5mcmFtZSkpCi0gICAgICAgIHJldHVybiBRVXJsKGQt
PnVybCkucmVzb2x2ZWQoUVVybCgpKTsKLSAgICByZXR1cm4gZC0+ZnJhbWUtPmRvY3VtZW50KCkt
PmJhc2VVUkwoKTsKLX0KLQotLyohCi0gICAgXHByb3BlcnR5IFFXZWJGcmFtZTo6aWNvbgotICAg
IFxicmllZiB0aGUgaWNvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBmcmFtZQotCi0gICAgXHNhIGlj
b25DaGFuZ2VkKCksIFFXZWJTZXR0aW5nczo6aWNvbkZvclVybCgpCi0qLwotCi1RSWNvbiBRV2Vi
RnJhbWU6Omljb24oKSBjb25zdAotewotICAgIHJldHVybiBRV2ViU2V0dGluZ3M6Omljb25Gb3JV
cmwoZC0+ZnJhbWUtPmRvY3VtZW50KCktPnVybCgpKTsKLX0KLQotLyohCi0gIFRoZSBuYW1lIG9m
IHRoaXMgZnJhbWUgYXMgZGVmaW5lZCBieSB0aGUgcGFyZW50IGZyYW1lLgotKi8KLVFTdHJpbmcg
UVdlYkZyYW1lOjpmcmFtZU5hbWUoKSBjb25zdAotewotICAgIHJldHVybiBkLT5mcmFtZS0+dHJl
ZSgpLT51bmlxdWVOYW1lKCk7Ci19Ci0KLS8qIQotICBUaGUgd2ViIHBhZ2UgdGhhdCBjb250YWlu
cyB0aGlzIGZyYW1lLgotCi0gIFxzYSBwYWdlQ2hhbmdlZCgpCi0qLwotUVdlYlBhZ2UgKlFXZWJG
cmFtZTo6cGFnZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGQtPnBhZ2U7Ci19Ci0KLS8qIQotICBM
b2FkcyBcYSB1cmwgaW50byB0aGlzIGZyYW1lLgotCi0gIFxub3RlIFRoZSB2aWV3IHJlbWFpbnMg
dGhlIHNhbWUgdW50aWwgZW5vdWdoIGRhdGEgaGFzIGFycml2ZWQgdG8gZGlzcGxheSB0aGUgbmV3
IFxhIHVybC4KLQotICBcc2Egc2V0VXJsKCksIHNldEh0bWwoKSwgc2V0Q29udGVudCgpCi0qLwot
dm9pZCBRV2ViRnJhbWU6OmxvYWQoY29uc3QgUVVybCAmdXJsKQotewotICAgIC8vIFRoZSBsb2Fk
KCkgb3ZlcmxvYWQgZW5zdXJlcyB0aGF0IHRoZSB1cmwgaXMgYWJzb2x1dGUuCi0gICAgbG9hZChR
TmV0d29ya1JlcXVlc3QodXJsKSk7Ci19Ci0KLS8qIQotICBMb2FkcyBhIG5ldHdvcmsgcmVxdWVz
dCwgXGEgcmVxLCBpbnRvIHRoaXMgZnJhbWUsIHVzaW5nIHRoZSBtZXRob2Qgc3BlY2lmaWVkIGlu
IFxhCi0gIG9wZXJhdGlvbi4KLQotICBcYSBib2R5IGlzIG9wdGlvbmFsIGFuZCBpcyBvbmx5IHVz
ZWQgZm9yIFBPU1Qgb3BlcmF0aW9ucy4KLQotICBcbm90ZSBUaGUgdmlldyByZW1haW5zIHRoZSBz
YW1lIHVudGlsIGVub3VnaCBkYXRhIGhhcyBhcnJpdmVkIHRvIGRpc3BsYXkgdGhlIG5ldyBjb250
ZW50LgotCi0gIFxzYSBzZXRVcmwoKQotKi8KLXZvaWQgUVdlYkZyYW1lOjpsb2FkKGNvbnN0IFFO
ZXR3b3JrUmVxdWVzdCAmcmVxLAotICAgICAgICAgICAgICAgICAgICAgUU5ldHdvcmtBY2Nlc3NN
YW5hZ2VyOjpPcGVyYXRpb24gb3BlcmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgY29uc3Qg
UUJ5dGVBcnJheSAmYm9keSkKLXsKLSAgICBkLT5sb2FkKHJlcSwgb3BlcmF0aW9uLCBib2R5KTsK
LX0KLQotLyohCi0gIFNldHMgdGhlIGNvbnRlbnQgb2YgdGhpcyBmcmFtZSB0byBcYSBodG1sLiBc
YSBiYXNlVXJsIGlzIG9wdGlvbmFsIGFuZCB1c2VkIHRvIHJlc29sdmUgcmVsYXRpdmUKLSAgVVJM
cyBpbiB0aGUgZG9jdW1lbnQsIHN1Y2ggYXMgcmVmZXJlbmNlZCBpbWFnZXMgb3Igc3R5bGVzaGVl
dHMuCi0KLSAgVGhlIFxhIGh0bWwgaXMgbG9hZGVkIGltbWVkaWF0ZWx5OyBleHRlcm5hbCBvYmpl
Y3RzIGFyZSBsb2FkZWQgYXN5bmNocm9ub3VzbHkuCi0KLSAgSWYgYSBzY3JpcHQgaW4gdGhlIFxh
IGh0bWwgcnVucyBsb25nZXIgdGhhbiB0aGUgZGVmYXVsdCBzY3JpcHQgdGltZW91dCAoY3VycmVu
dGx5IDEwIHNlY29uZHMpLAotICBmb3IgZXhhbXBsZSBkdWUgdG8gYmVpbmcgYmxvY2tlZCBieSBh
IG1vZGFsIEphdmFTY3JpcHQgYWxlcnQgZGlhbG9nLCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybgot
ICBhcyBzb29uIGFzIHBvc3NpYmxlIGFmdGVyIHRoZSB0aW1lb3V0IGFuZCBhbnkgc3Vic2VxdWVu
dCBcYSBodG1sIHdpbGwgYmUgbG9hZGVkIGFzeW5jaHJvbm91c2x5LgotCi0gIFdoZW4gdXNpbmcg
dGhpcyBtZXRob2QgV2ViS2l0IGFzc3VtZXMgdGhhdCBleHRlcm5hbCByZXNvdXJjZXMgc3VjaCBh
cyBKYXZhU2NyaXB0IHByb2dyYW1zIG9yIHN0eWxlCi0gIHNoZWV0cyBhcmUgZW5jb2RlZCBpbiBV
VEYtOCB1bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZC4gRm9yIGV4YW1wbGUsIHRoZSBlbmNvZGlu
ZyBvZiBhbiBleHRlcm5hbAotICBzY3JpcHQgY2FuIGJlIHNwZWNpZmllZCB0aHJvdWdoIHRoZSBj
aGFyc2V0IGF0dHJpYnV0ZSBvZiB0aGUgSFRNTCBzY3JpcHQgdGFnLiBJdCBpcyBhbHNvIHBvc3Np
YmxlCi0gIGZvciB0aGUgZW5jb2RpbmcgdG8gYmUgc3BlY2lmaWVkIGJ5IHdlYiBzZXJ2ZXIuCi0K
LSAgVGhpcyBpcyBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIGVxdWl2YWxlbnQgdG8gc2V0Q29udGVu
dChodG1sLCAidGV4dC9odG1sIiwgYmFzZVVybCkuCi0KLSAgXG5vdGUgVGhpcyBtZXRob2Qgd2ls
bCBub3QgYWZmZWN0IHNlc3Npb24gb3IgZ2xvYmFsIGhpc3RvcnkgZm9yIHRoZSBmcmFtZS4KLQot
ICBcd2FybmluZyBUaGlzIGZ1bmN0aW9uIHdvcmtzIG9ubHkgZm9yIEhUTUwsIGZvciBvdGhlciBt
aW1lIHR5cGVzIChpLmUuIFhIVE1MLCBTVkcpCi0gIHNldENvbnRlbnQoKSBzaG91bGQgYmUgdXNl
ZCBpbnN0ZWFkLgotCi0gIFxzYSB0b0h0bWwoKSwgc2V0Q29udGVudCgpLCBsb2FkKCkKLSovCi12
b2lkIFFXZWJGcmFtZTo6c2V0SHRtbChjb25zdCBRU3RyaW5nICZodG1sLCBjb25zdCBRVXJsICZi
YXNlVXJsKQotewotICAgIEtVUkwga3VybChiYXNlVXJsKTsKLSAgICBXZWJDb3JlOjpSZXNvdXJj
ZVJlcXVlc3QgcmVxdWVzdChrdXJsKTsKLSAgICBjb25zdCBRQnl0ZUFycmF5IHV0ZjggPSBodG1s
LnRvVXRmOCgpOwotICAgIFdURjo6UmVmUHRyPFdlYkNvcmU6OlNoYXJlZEJ1ZmZlcj4gZGF0YSA9
IFdlYkNvcmU6OlNoYXJlZEJ1ZmZlcjo6Y3JlYXRlKHV0ZjguY29uc3REYXRhKCksIHV0ZjgubGVu
Z3RoKCkpOwotICAgIFdlYkNvcmU6OlN1YnN0aXR1dGVEYXRhIHN1YnN0aXR1dGVEYXRhKGRhdGEs
IFdURjo6U3RyaW5nKCJ0ZXh0L2h0bWwiKSwgV1RGOjpTdHJpbmcoInV0Zi04IiksIEtVUkwoKSk7
Ci0gICAgZC0+ZnJhbWUtPmxvYWRlcigpLT5sb2FkKFdlYkNvcmU6OkZyYW1lTG9hZFJlcXVlc3Qo
ZC0+ZnJhbWUsIHJlcXVlc3QsIHN1YnN0aXR1dGVEYXRhKSk7Ci19Ci0KLS8qIQotICBTZXRzIHRo
ZSBjb250ZW50IG9mIHRoaXMgZnJhbWUgdG8gdGhlIHNwZWNpZmllZCBjb250ZW50IFxhIGRhdGEu
IElmIHRoZSBcYSBtaW1lVHlwZSBhcmd1bWVudAotICBpcyBlbXB0eSBpdCBpcyBjdXJyZW50bHkg
YXNzdW1lZCB0aGF0IHRoZSBjb250ZW50IGlzIEhUTUwgYnV0IGluIGZ1dHVyZSB2ZXJzaW9ucyB3
ZSBtYXkgaW50cm9kdWNlCi0gIGF1dG8tZGV0ZWN0aW9uLgotCi0gIEV4dGVybmFsIG9iamVjdHMg
cmVmZXJlbmNlZCBpbiB0aGUgY29udGVudCBhcmUgbG9jYXRlZCByZWxhdGl2ZSB0byBcYSBiYXNl
VXJsLgotCi0gIFRoZSBcYSBkYXRhIGlzIGxvYWRlZCBpbW1lZGlhdGVseTsgZXh0ZXJuYWwgb2Jq
ZWN0cyBhcmUgbG9hZGVkIGFzeW5jaHJvbm91c2x5LgotCi0gIFxub3RlIFRoaXMgbWV0aG9kIHdp
bGwgbm90IGFmZmVjdCBzZXNzaW9uIG9yIGdsb2JhbCBoaXN0b3J5IGZvciB0aGUgZnJhbWUuCi0K
LSAgXHNhIHRvSHRtbCgpLCBzZXRIdG1sKCkKLSovCi12b2lkIFFXZWJGcmFtZTo6c2V0Q29udGVu
dChjb25zdCBRQnl0ZUFycmF5ICZkYXRhLCBjb25zdCBRU3RyaW5nICZtaW1lVHlwZSwgY29uc3Qg
UVVybCAmYmFzZVVybCkKLXsKLSAgICBLVVJMIGt1cmwoYmFzZVVybCk7Ci0gICAgV2ViQ29yZTo6
UmVzb3VyY2VSZXF1ZXN0IHJlcXVlc3Qoa3VybCk7Ci0gICAgV1RGOjpSZWZQdHI8V2ViQ29yZTo6
U2hhcmVkQnVmZmVyPiBidWZmZXIgPSBXZWJDb3JlOjpTaGFyZWRCdWZmZXI6OmNyZWF0ZShkYXRh
LmNvbnN0RGF0YSgpLCBkYXRhLmxlbmd0aCgpKTsKLSAgICBRU3RyaW5nIGFjdHVhbE1pbWVUeXBl
OwotICAgIFdURjo6U3RyaW5nIGVuY29kaW5nOwotICAgIGlmIChtaW1lVHlwZS5pc0VtcHR5KCkp
Ci0gICAgICAgIGFjdHVhbE1pbWVUeXBlID0gUUxhdGluMVN0cmluZygidGV4dC9odG1sIik7Ci0g
ICAgZWxzZSB7Ci0gICAgICAgIGFjdHVhbE1pbWVUeXBlID0gZXh0cmFjdE1JTUVUeXBlRnJvbU1l
ZGlhVHlwZShtaW1lVHlwZSk7Ci0gICAgICAgIGVuY29kaW5nID0gZXh0cmFjdENoYXJzZXRGcm9t
TWVkaWFUeXBlKG1pbWVUeXBlKTsKLSAgICB9Ci0gICAgV2ViQ29yZTo6U3Vic3RpdHV0ZURhdGEg
c3Vic3RpdHV0ZURhdGEoYnVmZmVyLCBXVEY6OlN0cmluZyhhY3R1YWxNaW1lVHlwZSksIGVuY29k
aW5nLCBLVVJMKCkpOwotICAgIGQtPmZyYW1lLT5sb2FkZXIoKS0+bG9hZChXZWJDb3JlOjpGcmFt
ZUxvYWRSZXF1ZXN0KGQtPmZyYW1lLCByZXF1ZXN0LCBzdWJzdGl0dXRlRGF0YSkpOwotfQotCi0v
KiEKLSAgUmV0dXJucyB0aGUgcGFyZW50IGZyYW1lIG9mIHRoaXMgZnJhbWUsIG9yIDAgaWYgdGhl
IGZyYW1lIGlzIHRoZSB3ZWIgcGFnZXMKLSAgbWFpbiBmcmFtZS4KLQotICBUaGlzIGlzIGVxdWl2
YWxlbnQgdG8gcW9iamVjdF9jYXN0PFFXZWJGcmFtZSo+KGZyYW1lLT5wYXJlbnQoKSkuCi0KLSAg
XHNhIGNoaWxkRnJhbWVzKCkKLSovCi1RV2ViRnJhbWUgKlFXZWJGcmFtZTo6cGFyZW50RnJhbWUo
KSBjb25zdAotewotICAgIHJldHVybiBkLT5wYXJlbnRGcmFtZSgpOwotfQotCi0vKiEKLSAgUmV0
dXJucyBhIGxpc3Qgb2YgYWxsIGZyYW1lcyB0aGF0IGFyZSBkaXJlY3QgY2hpbGRyZW4gb2YgdGhp
cyBmcmFtZS4KLQotICBcc2EgcGFyZW50RnJhbWUoKQotKi8KLVFMaXN0PFFXZWJGcmFtZSo+IFFX
ZWJGcmFtZTo6Y2hpbGRGcmFtZXMoKSBjb25zdAotewotICAgIFFMaXN0PFFXZWJGcmFtZSo+IHJj
OwotICAgIGlmIChkLT5mcmFtZSkgewotICAgICAgICBGcmFtZVRyZWUgKnRyZWUgPSBkLT5mcmFt
ZS0+dHJlZSgpOwotICAgICAgICBmb3IgKEZyYW1lICpjaGlsZCA9IHRyZWUtPmZpcnN0Q2hpbGQo
KTsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPnRyZWUoKS0+bmV4dFNpYmxpbmcoKSkgewotICAgICAg
ICAgICAgRnJhbWVMb2FkZXIgKmxvYWRlciA9IGNoaWxkLT5sb2FkZXIoKTsKLSAgICAgICAgICAg
IFFXZWJGcmFtZSogd2ViRnJhbWUgPSBxb2JqZWN0X2Nhc3Q8UVdlYkZyYW1lKj4obG9hZGVyLT5u
ZXR3b3JraW5nQ29udGV4dCgpLT5vcmlnaW5hdGluZ09iamVjdCgpKTsKLSAgICAgICAgICAgIGlm
ICh3ZWJGcmFtZSkKLSAgICAgICAgICAgICAgICByYy5hcHBlbmQod2ViRnJhbWUpOwotICAgICAg
ICB9Ci0KLSAgICB9Ci0gICAgcmV0dXJuIHJjOwotfQotCi0vKiEKLSAgICBSZXR1cm5zIHRoZSBz
Y3JvbGxiYXIgcG9saWN5IGZvciB0aGUgc2Nyb2xsYmFyIGRlZmluZWQgYnkgXGEgb3JpZW50YXRp
b24uCi0qLwotUXQ6OlNjcm9sbEJhclBvbGljeSBRV2ViRnJhbWU6OnNjcm9sbEJhclBvbGljeShR
dDo6T3JpZW50YXRpb24gb3JpZW50YXRpb24pIGNvbnN0Ci17Ci0gICAgaWYgKG9yaWVudGF0aW9u
ID09IFF0OjpIb3Jpem9udGFsKQotICAgICAgICByZXR1cm4gZC0+aG9yaXpvbnRhbFNjcm9sbEJh
clBvbGljeTsKLSAgICByZXR1cm4gZC0+dmVydGljYWxTY3JvbGxCYXJQb2xpY3k7Ci19Ci0KLS8q
IQotICAgIFNldHMgdGhlIHNjcm9sbGJhciBwb2xpY3kgZm9yIHRoZSBzY3JvbGxiYXIgZGVmaW5l
ZCBieSBcYSBvcmllbnRhdGlvbiB0byBcYSBwb2xpY3kuCi0qLwotdm9pZCBRV2ViRnJhbWU6OnNl
dFNjcm9sbEJhclBvbGljeShRdDo6T3JpZW50YXRpb24gb3JpZW50YXRpb24sIFF0OjpTY3JvbGxC
YXJQb2xpY3kgcG9saWN5KQotewotICAgIFFfQVNTRVJUKChpbnQpU2Nyb2xsYmFyQXV0byA9PSAo
aW50KVF0OjpTY3JvbGxCYXJBc05lZWRlZCk7Ci0gICAgUV9BU1NFUlQoKGludClTY3JvbGxiYXJB
bHdheXNPZmYgPT0gKGludClRdDo6U2Nyb2xsQmFyQWx3YXlzT2ZmKTsKLSAgICBRX0FTU0VSVCgo
aW50KVNjcm9sbGJhckFsd2F5c09uID09IChpbnQpUXQ6OlNjcm9sbEJhckFsd2F5c09uKTsKLQot
ICAgIGlmIChvcmllbnRhdGlvbiA9PSBRdDo6SG9yaXpvbnRhbCkgewotICAgICAgICBkLT5ob3Jp
em9udGFsU2Nyb2xsQmFyUG9saWN5ID0gcG9saWN5OwotICAgICAgICBpZiAoZC0+ZnJhbWUtPnZp
ZXcoKSkgewotICAgICAgICAgICAgZC0+ZnJhbWUtPnZpZXcoKS0+c2V0SG9yaXpvbnRhbFNjcm9s
bGJhck1vZGUoKFNjcm9sbGJhck1vZGUpcG9saWN5LCBwb2xpY3kgIT0gUXQ6OlNjcm9sbEJhckFz
TmVlZGVkIC8qIGxvY2sgKi8pOwotICAgICAgICAgICAgZC0+ZnJhbWUtPnZpZXcoKS0+dXBkYXRl
Q2FuSGF2ZVNjcm9sbGJhcnMoKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGQt
PnZlcnRpY2FsU2Nyb2xsQmFyUG9saWN5ID0gcG9saWN5OwotICAgICAgICBpZiAoZC0+ZnJhbWUt
PnZpZXcoKSkgewotICAgICAgICAgICAgZC0+ZnJhbWUtPnZpZXcoKS0+c2V0VmVydGljYWxTY3Jv
bGxiYXJNb2RlKChTY3JvbGxiYXJNb2RlKXBvbGljeSwgcG9saWN5ICE9IFF0OjpTY3JvbGxCYXJB
c05lZWRlZCAvKiBsb2NrICovKTsKLSAgICAgICAgICAgIGQtPmZyYW1lLT52aWV3KCktPnVwZGF0
ZUNhbkhhdmVTY3JvbGxiYXJzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8qIQotICBTZXRz
IHRoZSBjdXJyZW50IFxhIHZhbHVlIGZvciB0aGUgc2Nyb2xsYmFyIHdpdGggb3JpZW50YXRpb24g
XGEgb3JpZW50YXRpb24uCi0KLSAgVGhlIHNjcm9sbGJhciBmb3JjZXMgdGhlIFxhIHZhbHVlIHRv
IGJlIHdpdGhpbiB0aGUgbGVnYWwgcmFuZ2U6IG1pbmltdW0gPD0gdmFsdWUgPD0gbWF4aW11bS4K
LQotICBDaGFuZ2luZyB0aGUgdmFsdWUgYWxzbyB1cGRhdGVzIHRoZSB0aHVtYiBwb3NpdGlvbi4K
LQotICBcc2Egc2Nyb2xsQmFyTWluaW11bSgpLCBzY3JvbGxCYXJNYXhpbXVtKCkKLSovCi12b2lk
IFFXZWJGcmFtZTo6c2V0U2Nyb2xsQmFyVmFsdWUoUXQ6Ok9yaWVudGF0aW9uIG9yaWVudGF0aW9u
LCBpbnQgdmFsdWUpCi17Ci0gICAgU2Nyb2xsYmFyICpzYjsKLSAgICBzYiA9IChvcmllbnRhdGlv
biA9PSBRdDo6SG9yaXpvbnRhbCkgPyBkLT5ob3Jpem9udGFsU2Nyb2xsQmFyKCkgOiBkLT52ZXJ0
aWNhbFNjcm9sbEJhcigpOwotICAgIGlmIChzYikgewotICAgICAgICBpZiAodmFsdWUgPCAwKQot
ICAgICAgICAgICAgdmFsdWUgPSAwOwotICAgICAgICBlbHNlIGlmICh2YWx1ZSA+IHNjcm9sbEJh
ck1heGltdW0ob3JpZW50YXRpb24pKQotICAgICAgICAgICAgdmFsdWUgPSBzY3JvbGxCYXJNYXhp
bXVtKG9yaWVudGF0aW9uKTsKLSAgICAgICAgc2ItPnNjcm9sbGFibGVBcmVhKCktPnNjcm9sbFRv
T2Zmc2V0V2l0aG91dEFuaW1hdGlvbihvcmllbnRhdGlvbiA9PSBRdDo6SG9yaXpvbnRhbCA/IEhv
cml6b250YWxTY3JvbGxiYXIgOiBWZXJ0aWNhbFNjcm9sbGJhciwgdmFsdWUpOwotICAgIH0KLX0K
LQotLyohCi0gIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgZm9yIHRoZSBzY3JvbGxiYXIgd2l0
aCBvcmllbnRhdGlvbiBcYSBvcmllbnRhdGlvbiwgb3IgMAotICBpZiBubyBzY3JvbGxiYXIgaXMg
Zm91bmQgZm9yIFxhIG9yaWVudGF0aW9uLgotCi0gIFxzYSBzY3JvbGxCYXJNaW5pbXVtKCksIHNj
cm9sbEJhck1heGltdW0oKQotKi8KLWludCBRV2ViRnJhbWU6OnNjcm9sbEJhclZhbHVlKFF0OjpP
cmllbnRhdGlvbiBvcmllbnRhdGlvbikgY29uc3QKLXsKLSAgICBTY3JvbGxiYXIgKnNiOwotICAg
IHNiID0gKG9yaWVudGF0aW9uID09IFF0OjpIb3Jpem9udGFsKSA/IGQtPmhvcml6b250YWxTY3Jv
bGxCYXIoKSA6IGQtPnZlcnRpY2FsU2Nyb2xsQmFyKCk7Ci0gICAgaWYgKHNiKQotICAgICAgICBy
ZXR1cm4gc2ItPnZhbHVlKCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIQotICBSZXR1cm5zIHRo
ZSBtYXhpbXVtIHZhbHVlIGZvciB0aGUgc2Nyb2xsYmFyIHdpdGggb3JpZW50YXRpb24gXGEgb3Jp
ZW50YXRpb24sIG9yIDAKLSAgaWYgbm8gc2Nyb2xsYmFyIGlzIGZvdW5kIGZvciBcYSBvcmllbnRh
dGlvbi4KLQotICBcc2Egc2Nyb2xsQmFyTWluaW11bSgpCi0qLwotaW50IFFXZWJGcmFtZTo6c2Ny
b2xsQmFyTWF4aW11bShRdDo6T3JpZW50YXRpb24gb3JpZW50YXRpb24pIGNvbnN0Ci17Ci0gICAg
U2Nyb2xsYmFyICpzYjsKLSAgICBzYiA9IChvcmllbnRhdGlvbiA9PSBRdDo6SG9yaXpvbnRhbCkg
PyBkLT5ob3Jpem9udGFsU2Nyb2xsQmFyKCkgOiBkLT52ZXJ0aWNhbFNjcm9sbEJhcigpOwotICAg
IGlmIChzYikKLSAgICAgICAgcmV0dXJuIHNiLT5tYXhpbXVtKCk7Ci0gICAgcmV0dXJuIDA7Ci19
Ci0KLS8qIQotICBSZXR1cm5zIHRoZSBtaW5pbXVtIHZhbHVlIGZvciB0aGUgc2Nyb2xsYmFyIHdp
dGggb3JpZW50YXRpb24gXGEgb3JpZW50YXRpb24uCi0KLSAgVGhlIG1pbmltdW0gdmFsdWUgaXMg
YWx3YXlzIDAuCi0KLSAgXHNhIHNjcm9sbEJhck1heGltdW0oKQotKi8KLWludCBRV2ViRnJhbWU6
OnNjcm9sbEJhck1pbmltdW0oUXQ6Ok9yaWVudGF0aW9uIG9yaWVudGF0aW9uKSBjb25zdAotewot
ICAgIFFfVU5VU0VEKG9yaWVudGF0aW9uKQotICAgIHJldHVybiAwOwotfQotCi0vKiEKLSAgXHNp
bmNlIDQuNgotICBSZXR1cm5zIHRoZSBnZW9tZXRyeSBmb3IgdGhlIHNjcm9sbGJhciB3aXRoIG9y
aWVudGF0aW9uIFxhIG9yaWVudGF0aW9uLgotCi0gIElmIHRoZSBzY3JvbGxiYXIgZG9lcyBub3Qg
ZXhpc3QgYW4gZW1wdHkgcmVjdCBpcyByZXR1cm5lZC4KLSovCi1RUmVjdCBRV2ViRnJhbWU6OnNj
cm9sbEJhckdlb21ldHJ5KFF0OjpPcmllbnRhdGlvbiBvcmllbnRhdGlvbikgY29uc3QKLXsKLSAg
ICBTY3JvbGxiYXIgKnNiOwotICAgIHNiID0gKG9yaWVudGF0aW9uID09IFF0OjpIb3Jpem9udGFs
KSA/IGQtPmhvcml6b250YWxTY3JvbGxCYXIoKSA6IGQtPnZlcnRpY2FsU2Nyb2xsQmFyKCk7Ci0g
ICAgaWYgKHNiKQotICAgICAgICByZXR1cm4gc2ItPmZyYW1lUmVjdCgpOwotICAgIHJldHVybiBR
UmVjdCgpOwotfQotCi0vKiEKLSAgXHNpbmNlIDQuNQotICBTY3JvbGxzIHRoZSBmcmFtZSBcYSBk
eCBwaXhlbHMgdG8gdGhlIHJpZ2h0IGFuZCBcYSBkeSBwaXhlbHMgZG93bndhcmQuIEJvdGgKLSAg
XGEgZHggYW5kIFxhIGR5IG1heSBiZSBuZWdhdGl2ZS4KLQotICBcc2EgUVdlYkZyYW1lOjpzY3Jv
bGxQb3NpdGlvbgotKi8KLQotdm9pZCBRV2ViRnJhbWU6OnNjcm9sbChpbnQgZHgsIGludCBkeSkK
LXsKLSAgICBpZiAoIWQtPmZyYW1lLT52aWV3KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGQt
PmZyYW1lLT52aWV3KCktPnNjcm9sbEJ5KEludFNpemUoZHgsIGR5KSk7Ci19Ci0KLS8qIQotICBc
cHJvcGVydHkgUVdlYkZyYW1lOjpzY3JvbGxQb3NpdGlvbgotICBcc2luY2UgNC41Ci0gIFxicmll
ZiB0aGUgcG9zaXRpb24gdGhlIGZyYW1lIGlzIGN1cnJlbnRseSBzY3JvbGxlZCB0by4KLSovCi0K
LVFQb2ludCBRV2ViRnJhbWU6OnNjcm9sbFBvc2l0aW9uKCkgY29uc3QKLXsKLSAgICBJbnRTaXpl
IG9mcyA9IGQtPnNjcm9sbFBvc2l0aW9uKCk7Ci0gICAgcmV0dXJuIFFQb2ludChvZnMud2lkdGgo
KSwgb2ZzLmhlaWdodCgpKTsKLX0KLQotdm9pZCBRV2ViRnJhbWU6OnNldFNjcm9sbFBvc2l0aW9u
KGNvbnN0IFFQb2ludCAmcG9zKQotewotICAgIFFQb2ludCBjdXJyZW50ID0gc2Nyb2xsUG9zaXRp
b24oKTsKLSAgICBpbnQgZHggPSBwb3MueCgpIC0gY3VycmVudC54KCk7Ci0gICAgaW50IGR5ID0g
cG9zLnkoKSAtIGN1cnJlbnQueSgpOwotICAgIHNjcm9sbChkeCwgZHkpOwotfQotCi0vKiEKLSAg
XHNpbmNlIDQuNwotICBTY3JvbGxzIHRoZSBmcmFtZSB0byB0aGUgZ2l2ZW4gXGEgYW5jaG9yIG5h
bWUuCi0qLwotdm9pZCBRV2ViRnJhbWU6OnNjcm9sbFRvQW5jaG9yKGNvbnN0IFFTdHJpbmcmIGFu
Y2hvcikKLXsKLSAgICBGcmFtZVZpZXcgKnZpZXcgPSBkLT5mcmFtZS0+dmlldygpOwotICAgIGlm
ICh2aWV3KQotICAgICAgICB2aWV3LT5zY3JvbGxUb0FuY2hvcihhbmNob3IpOwotfQotCi0vKiEK
LSAgXHNpbmNlIDQuNgotICBSZW5kZXIgdGhlIFxhIGxheWVyIG9mIHRoZSBmcmFtZSB1c2luZyBc
YSBwYWludGVyIGNsaXBwaW5nIHRvIFxhIGNsaXAuCi0KLSAgXHNhIHByaW50KCkKLSovCi0KLXZv
aWQgUVdlYkZyYW1lOjpyZW5kZXIoUVBhaW50ZXIqIHBhaW50ZXIsIFJlbmRlckxheWVyIGxheWVy
LCBjb25zdCBRUmVnaW9uJiBjbGlwKQotewotICAgIEdyYXBoaWNzQ29udGV4dCBjb250ZXh0KHBh
aW50ZXIpOwotICAgIGlmIChjb250ZXh0LnBhaW50aW5nRGlzYWJsZWQoKSAmJiAhY29udGV4dC51
cGRhdGluZ0NvbnRyb2xUaW50cygpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAoIWNsaXAu
aXNFbXB0eSgpKQotICAgICAgICBkLT5yZW5kZXJSZWxhdGl2ZUNvb3JkcygmY29udGV4dCwgbGF5
ZXIsIGNsaXApOwotICAgIGVsc2UgaWYgKGQtPmZyYW1lLT52aWV3KCkpCi0gICAgICAgIGQtPnJl
bmRlclJlbGF0aXZlQ29vcmRzKCZjb250ZXh0LCBsYXllciwgUVJlZ2lvbihkLT5mcmFtZS0+dmll
dygpLT5mcmFtZVJlY3QoKSkpOwotfQotCi0vKiEKLSAgUmVuZGVyIHRoZSBmcmFtZSBpbnRvIFxh
IHBhaW50ZXIgY2xpcHBpbmcgdG8gXGEgY2xpcC4KLSovCi12b2lkIFFXZWJGcmFtZTo6cmVuZGVy
KFFQYWludGVyKiBwYWludGVyLCBjb25zdCBRUmVnaW9uJiBjbGlwKQotewotICAgIEdyYXBoaWNz
Q29udGV4dCBjb250ZXh0KHBhaW50ZXIpOwotICAgIGlmIChjb250ZXh0LnBhaW50aW5nRGlzYWJs
ZWQoKSAmJiAhY29udGV4dC51cGRhdGluZ0NvbnRyb2xUaW50cygpKQotICAgICAgICByZXR1cm47
Ci0KLSAgICBkLT5yZW5kZXJSZWxhdGl2ZUNvb3JkcygmY29udGV4dCwgQWxsTGF5ZXJzLCBjbGlw
KTsKLX0KLQotLyohCi0gIFJlbmRlciB0aGUgZnJhbWUgaW50byBcYSBwYWludGVyLgotKi8KLXZv
aWQgUVdlYkZyYW1lOjpyZW5kZXIoUVBhaW50ZXIqIHBhaW50ZXIpCi17Ci0gICAgaWYgKCFkLT5m
cmFtZS0+dmlldygpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBHcmFwaGljc0NvbnRleHQgY29u
dGV4dChwYWludGVyKTsKLSAgICBpZiAoY29udGV4dC5wYWludGluZ0Rpc2FibGVkKCkgJiYgIWNv
bnRleHQudXBkYXRpbmdDb250cm9sVGludHMoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgZC0+
cmVuZGVyUmVsYXRpdmVDb29yZHMoJmNvbnRleHQsIEFsbExheWVycywgUVJlZ2lvbihkLT5mcmFt
ZS0+dmlldygpLT5mcmFtZVJlY3QoKSkpOwotfQotCi0vKiEKLSAgICBccHJvcGVydHkgUVdlYkZy
YW1lOjp0ZXh0U2l6ZU11bHRpcGxpZXIKLSAgICBcYnJpZWYgdGhlIHNjYWxpbmcgZmFjdG9yIGZv
ciBhbGwgdGV4dCBpbiB0aGUgZnJhbWUKLSAgICBcb2Jzb2xldGUKLQotICAgIFVzZSBzZXRab29t
RmFjdG9yIGluc3RlYWQsIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlIFpvb21UZXh0T25seSBhdHRy
aWJ1dGUgaW4KLSAgICBRV2ViU2V0dGluZ3MuCi0KLSAgICBcbm90ZSBTZXR0aW5nIHRoaXMgcHJv
cGVydHkgYWxzbyBlbmFibGVzIHRoZSBab29tVGV4dE9ubHkgYXR0cmlidXRlIGluCi0gICAgUVdl
YlNldHRpbmdzLgotKi8KLQotLyohCi0gICAgU2V0cyB0aGUgdmFsdWUgb2YgdGhlIG11bHRpcGxp
ZXIgdXNlZCB0byBzY2FsZSB0aGUgdGV4dCBpbiBhIFdlYiBmcmFtZSB0bwotICAgIHRoZSBcYSBm
YWN0b3Igc3BlY2lmaWVkLgotKi8KLXZvaWQgUVdlYkZyYW1lOjpzZXRUZXh0U2l6ZU11bHRpcGxp
ZXIocXJlYWwgZmFjdG9yKQotewotICAgIHBhZ2UoKS0+c2V0dGluZ3MoKS0+c2V0QXR0cmlidXRl
KFFXZWJTZXR0aW5nczo6Wm9vbVRleHRPbmx5LCB0cnVlKTsKLQotICAgIGQtPmZyYW1lLT5zZXRQ
YWdlQW5kVGV4dFpvb21GYWN0b3JzKDEsIGZhY3Rvcik7Ci19Ci0KLS8qIQotICAgIFJldHVybnMg
dGhlIHZhbHVlIG9mIHRoZSBtdWx0aXBsaWVyIHVzZWQgdG8gc2NhbGUgdGhlIHRleHQgaW4gYSBX
ZWIgZnJhbWUuCi0qLwotcXJlYWwgUVdlYkZyYW1lOjp0ZXh0U2l6ZU11bHRpcGxpZXIoKSBjb25z
dAotewotICAgIHJldHVybiBwYWdlKCktPnNldHRpbmdzKCktPnRlc3RBdHRyaWJ1dGUoUVdlYlNl
dHRpbmdzOjpab29tVGV4dE9ubHkpID8gZC0+ZnJhbWUtPnRleHRab29tRmFjdG9yKCkgOiBkLT5m
cmFtZS0+cGFnZVpvb21GYWN0b3IoKTsKLX0KLQotLyohCi0gICAgXHByb3BlcnR5IFFXZWJGcmFt
ZTo6em9vbUZhY3RvcgotICAgIFxzaW5jZSA0LjUKLSAgICBcYnJpZWYgdGhlIHpvb20gZmFjdG9y
IGZvciB0aGUgZnJhbWUKLSovCi0KLXZvaWQgUVdlYkZyYW1lOjpzZXRab29tRmFjdG9yKHFyZWFs
IGZhY3RvcikKLXsKLSAgICBpZiAocGFnZSgpLT5zZXR0aW5ncygpLT50ZXN0QXR0cmlidXRlKFFX
ZWJTZXR0aW5nczo6Wm9vbVRleHRPbmx5KSkKLSAgICAgICAgZC0+ZnJhbWUtPnNldFRleHRab29t
RmFjdG9yKGZhY3Rvcik7Ci0gICAgZWxzZQotICAgICAgICBkLT5mcmFtZS0+c2V0UGFnZVpvb21G
YWN0b3IoZmFjdG9yKTsKLX0KLQotcXJlYWwgUVdlYkZyYW1lOjp6b29tRmFjdG9yKCkgY29uc3QK
LXsKLSAgICByZXR1cm4gcGFnZSgpLT5zZXR0aW5ncygpLT50ZXN0QXR0cmlidXRlKFFXZWJTZXR0
aW5nczo6Wm9vbVRleHRPbmx5KSA/IGQtPmZyYW1lLT50ZXh0Wm9vbUZhY3RvcigpIDogZC0+ZnJh
bWUtPnBhZ2Vab29tRmFjdG9yKCk7Ci19Ci0KLS8qIQotICAgIFxwcm9wZXJ0eSBRV2ViRnJhbWU6
OmZvY3VzCi0gICAgXHNpbmNlIDQuNgotCi0gICAgUmV0dXJucyB0cnVlIGlmIHRoaXMgZnJhbWUg
aGFzIGtleWJvYXJkIGlucHV0IGZvY3VzOyBvdGhlcndpc2UsIHJldHVybnMgZmFsc2UuCi0qLwot
Ym9vbCBRV2ViRnJhbWU6Omhhc0ZvY3VzKCkgY29uc3QKLXsKLSAgICBXZWJDb3JlOjpGcmFtZSog
ZmYgPSBkLT5mcmFtZS0+cGFnZSgpLT5mb2N1c0NvbnRyb2xsZXIoKS0+Zm9jdXNlZEZyYW1lKCk7
Ci0gICAgcmV0dXJuIGZmICYmIFFXZWJGcmFtZVByaXZhdGU6OmtpdChmZikgPT0gdGhpczsKLX0K
LQotLyohCi0gICAgXHNpbmNlIDQuNgotCi0gICAgR2l2ZXMga2V5Ym9hcmQgaW5wdXQgZm9jdXMg
dG8gdGhpcyBmcmFtZS4KLSovCi12b2lkIFFXZWJGcmFtZTo6c2V0Rm9jdXMoKQotewotICAgIFFX
ZWJGcmFtZVByaXZhdGU6OmNvcmUodGhpcyktPnBhZ2UoKS0+Zm9jdXNDb250cm9sbGVyKCktPnNl
dEZvY3VzZWRGcmFtZShRV2ViRnJhbWVQcml2YXRlOjpjb3JlKHRoaXMpKTsKLX0KLQotLyohCi0g
ICAgUmV0dXJucyB0aGUgcG9zaXRpb24gb2YgdGhlIGZyYW1lIHJlbGF0aXZlIHRvIGl0J3MgcGFy
ZW50IGZyYW1lLgotKi8KLVFQb2ludCBRV2ViRnJhbWU6OnBvcygpIGNvbnN0Ci17Ci0gICAgaWYg
KCFkLT5mcmFtZS0+dmlldygpKQotICAgICAgICByZXR1cm4gUVBvaW50KCk7Ci0KLSAgICByZXR1
cm4gZC0+ZnJhbWUtPnZpZXcoKS0+ZnJhbWVSZWN0KCkubG9jYXRpb24oKTsKLX0KLQotLyohCi0g
ICAgUmV0dXJuIHRoZSBnZW9tZXRyeSBvZiB0aGUgZnJhbWUgcmVsYXRpdmUgdG8gaXQncyBwYXJl
bnQgZnJhbWUuCi0qLwotUVJlY3QgUVdlYkZyYW1lOjpnZW9tZXRyeSgpIGNvbnN0Ci17Ci0gICAg
cmV0dXJuIGQtPmZyYW1lUmVjdCgpOwotfQotCi0vKiEKLSAgICBccHJvcGVydHkgUVdlYkZyYW1l
Ojpjb250ZW50c1NpemUKLSAgICBcYnJpZWYgdGhlIHNpemUgb2YgdGhlIGNvbnRlbnRzIGluIHRo
aXMgZnJhbWUKLQotICAgIFxzYSBjb250ZW50c1NpemVDaGFuZ2VkKCkKLSovCi1RU2l6ZSBRV2Vi
RnJhbWU6OmNvbnRlbnRzU2l6ZSgpIGNvbnN0Ci17Ci0gICAgRnJhbWVWaWV3ICp2aWV3ID0gZC0+
ZnJhbWUtPnZpZXcoKTsKLSAgICBpZiAoIXZpZXcpCi0gICAgICAgIHJldHVybiBRU2l6ZSgpOwot
ICAgIHJldHVybiBRU2l6ZSh2aWV3LT5jb250ZW50c1dpZHRoKCksIHZpZXctPmNvbnRlbnRzSGVp
Z2h0KCkpOwotfQotCi0vKiEKLSAgICBcc2luY2UgNC42Ci0KLSAgICBSZXR1cm5zIHRoZSBkb2N1
bWVudCBlbGVtZW50IG9mIHRoaXMgZnJhbWUuCi0KLSAgICBUaGUgZG9jdW1lbnQgZWxlbWVudCBw
cm92aWRlcyBhY2Nlc3MgdG8gdGhlIGVudGlyZSBzdHJ1Y3R1cmVkCi0gICAgY29udGVudCBvZiB0
aGUgZnJhbWUuCi0qLwotUVdlYkVsZW1lbnQgUVdlYkZyYW1lOjpkb2N1bWVudEVsZW1lbnQoKSBj
b25zdAotewotICAgIFdlYkNvcmU6OkRvY3VtZW50ICpkb2MgPSBkLT5mcmFtZS0+ZG9jdW1lbnQo
KTsKLSAgICBpZiAoIWRvYykKLSAgICAgICAgcmV0dXJuIFFXZWJFbGVtZW50KCk7Ci0gICAgcmV0
dXJuIFFXZWJFbGVtZW50KGRvYy0+ZG9jdW1lbnRFbGVtZW50KCkpOwotfQotCi0vKiEKLSAgICBc
c2luY2UgNC42Ci0gICAgUmV0dXJucyBhIG5ldyBsaXN0IG9mIGVsZW1lbnRzIG1hdGNoaW5nIHRo
ZSBnaXZlbiBDU1Mgc2VsZWN0b3IgXGEgc2VsZWN0b3JRdWVyeS4KLSAgICBJZiB0aGVyZSBhcmUg
bm8gbWF0Y2hpbmcgZWxlbWVudHMsIGFuIGVtcHR5IGxpc3QgaXMgcmV0dXJuZWQuCi0KLSAgICBc
bHtodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtQ1NTMi9zZWxlY3Rvci5odG1sI3ExfXtTdGFuZGFy
ZCBDU1MyIHNlbGVjdG9yfSBzeW50YXggaXMKLSAgICB1c2VkIGZvciB0aGUgcXVlcnkuCi0KLSAg
ICBcc2EgUVdlYkVsZW1lbnQ6OmZpbmRBbGwoKQotKi8KLVFXZWJFbGVtZW50Q29sbGVjdGlvbiBR
V2ViRnJhbWU6OmZpbmRBbGxFbGVtZW50cyhjb25zdCBRU3RyaW5nICZzZWxlY3RvclF1ZXJ5KSBj
b25zdAotewotICAgIHJldHVybiBkb2N1bWVudEVsZW1lbnQoKS5maW5kQWxsKHNlbGVjdG9yUXVl
cnkpOwotfQotCi0vKiEKLSAgICBcc2luY2UgNC42Ci0gICAgUmV0dXJucyB0aGUgZmlyc3QgZWxl
bWVudCBpbiB0aGUgZnJhbWUncyBkb2N1bWVudCB0aGF0IG1hdGNoZXMgdGhlCi0gICAgZ2l2ZW4g
Q1NTIHNlbGVjdG9yIFxhIHNlbGVjdG9yUXVlcnkuIElmIHRoZXJlIGlzIG5vIG1hdGNoaW5nIGVs
ZW1lbnQsIGEKLSAgICBudWxsIGVsZW1lbnQgaXMgcmV0dXJuZWQuCi0KLSAgICBcbHtodHRwOi8v
d3d3LnczLm9yZy9UUi9SRUMtQ1NTMi9zZWxlY3Rvci5odG1sI3ExfXtTdGFuZGFyZCBDU1MyIHNl
bGVjdG9yfSBzeW50YXggaXMKLSAgICB1c2VkIGZvciB0aGUgcXVlcnkuCi0KLSAgICBcc2EgUVdl
YkVsZW1lbnQ6OmZpbmRGaXJzdCgpCi0qLwotUVdlYkVsZW1lbnQgUVdlYkZyYW1lOjpmaW5kRmly
c3RFbGVtZW50KGNvbnN0IFFTdHJpbmcgJnNlbGVjdG9yUXVlcnkpIGNvbnN0Ci17Ci0gICAgcmV0
dXJuIGRvY3VtZW50RWxlbWVudCgpLmZpbmRGaXJzdChzZWxlY3RvclF1ZXJ5KTsKLX0KLQotLyoh
Ci0gICAgUGVyZm9ybXMgYSBoaXQgdGVzdCBvbiB0aGUgZnJhbWUgY29udGVudHMgYXQgdGhlIGdp
dmVuIHBvc2l0aW9uIFxhIHBvcyBhbmQgcmV0dXJucyB0aGUgaGl0IHRlc3QgcmVzdWx0LgotKi8K
LVFXZWJIaXRUZXN0UmVzdWx0IFFXZWJGcmFtZTo6aGl0VGVzdENvbnRlbnQoY29uc3QgUVBvaW50
ICZwb3MpIGNvbnN0Ci17Ci0gICAgaWYgKCFkLT5mcmFtZS0+dmlldygpIHx8ICFkLT5mcmFtZS0+
Y29udGVudFJlbmRlcmVyKCkpCi0gICAgICAgIHJldHVybiBRV2ViSGl0VGVzdFJlc3VsdCgpOwot
Ci0gICAgSGl0VGVzdFJlc3VsdCByZXN1bHQgPSBkLT5mcmFtZS0+ZXZlbnRIYW5kbGVyKCktPmhp
dFRlc3RSZXN1bHRBdFBvaW50KGQtPmZyYW1lLT52aWV3KCktPndpbmRvd1RvQ29udGVudHMocG9z
KSwgLyphbGxvd1NoYWRvd0NvbnRlbnQqLyBmYWxzZSwgLyppZ25vcmVDbGlwcGluZyovIHRydWUp
OwotCi0gICAgaWYgKHJlc3VsdC5zY3JvbGxiYXIoKSkKLSAgICAgICAgcmV0dXJuIFFXZWJIaXRU
ZXN0UmVzdWx0KCk7Ci0KLSAgICByZXR1cm4gUVdlYkhpdFRlc3RSZXN1bHQobmV3IFFXZWJIaXRU
ZXN0UmVzdWx0UHJpdmF0ZShyZXN1bHQpKTsKLX0KLQotLyohIFxyZWltcAotKi8KLWJvb2wgUVdl
YkZyYW1lOjpldmVudChRRXZlbnQgKmUpCi17Ci0gICAgcmV0dXJuIFFPYmplY3Q6OmV2ZW50KGUp
OwotfQotCi0jaWZuZGVmIFFUX05PX1BSSU5URVIKLS8qIQotICAgIFByaW50cyB0aGUgZnJhbWUg
dG8gdGhlIGdpdmVuIFxhIHByaW50ZXIuCi0KLSAgICBcc2EgcmVuZGVyKCkKLSovCi12b2lkIFFX
ZWJGcmFtZTo6cHJpbnQoUVByaW50ZXIgKnByaW50ZXIpIGNvbnN0Ci17Ci0jaWYgSEFWRShRVFBS
SU5UU1VQUE9SVCkKLSAgICBRUGFpbnRlciBwYWludGVyOwotICAgIGlmICghcGFpbnRlci5iZWdp
bihwcmludGVyKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgY29uc3QgcXJlYWwgem9vbUZhY3Rv
clggPSAocXJlYWwpcHJpbnRlci0+bG9naWNhbERwaVgoKSAvIHF0X2RlZmF1bHREcGkoKTsKLSAg
ICBjb25zdCBxcmVhbCB6b29tRmFjdG9yWSA9IChxcmVhbClwcmludGVyLT5sb2dpY2FsRHBpWSgp
IC8gcXRfZGVmYXVsdERwaSgpOwotCi0gICAgUHJpbnRDb250ZXh0IHByaW50Q29udGV4dChkLT5m
cmFtZSk7Ci0gICAgZmxvYXQgcGFnZUhlaWdodCA9IDA7Ci0KLSAgICBRUmVjdCBxcHJpbnRlclJl
Y3QgPSBwcmludGVyLT5wYWdlUmVjdCgpOwotCi0gICAgSW50UmVjdCBwYWdlUmVjdCgwLCAwLAot
ICAgICAgICAgICAgICAgICAgICAgaW50KHFwcmludGVyUmVjdC53aWR0aCgpIC8gem9vbUZhY3Rv
clgpLAotICAgICAgICAgICAgICAgICAgICAgaW50KHFwcmludGVyUmVjdC5oZWlnaHQoKSAvIHpv
b21GYWN0b3JZKSk7Ci0KLSAgICBwcmludENvbnRleHQuYmVnaW4ocGFnZVJlY3Qud2lkdGgoKSwg
cGFnZVJlY3QuaGVpZ2h0KCkpOwotCi0gICAgcHJpbnRDb250ZXh0LmNvbXB1dGVQYWdlUmVjdHMo
cGFnZVJlY3QsIC8qIGhlYWRlckhlaWdodCAqLyAwLCAvKiBmb290ZXJIZWlnaHQgKi8gMCwgLyog
dXNlclNjYWxlRmFjdG9yICovIDEuMCwgcGFnZUhlaWdodCk7Ci0KLSAgICBpbnQgZG9jQ29waWVz
OwotICAgIGludCBwYWdlQ29waWVzOwotICAgIGlmIChwcmludGVyLT5jb2xsYXRlQ29waWVzKCkp
IHsKLSAgICAgICAgZG9jQ29waWVzID0gMTsKLSAgICAgICAgcGFnZUNvcGllcyA9IHByaW50ZXIt
Pm51bUNvcGllcygpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRvY0NvcGllcyA9IHByaW50ZXIt
Pm51bUNvcGllcygpOwotICAgICAgICBwYWdlQ29waWVzID0gMTsKLSAgICB9Ci0KLSAgICBpbnQg
ZnJvbVBhZ2UgPSBwcmludGVyLT5mcm9tUGFnZSgpOwotICAgIGludCB0b1BhZ2UgPSBwcmludGVy
LT50b1BhZ2UoKTsKLSAgICBib29sIGFzY2VuZGluZyA9IHRydWU7Ci0KLSAgICBpZiAoZnJvbVBh
Z2UgPT0gMCAmJiB0b1BhZ2UgPT0gMCkgewotICAgICAgICBmcm9tUGFnZSA9IDE7Ci0gICAgICAg
IHRvUGFnZSA9IHByaW50Q29udGV4dC5wYWdlQ291bnQoKTsKLSAgICB9Ci0gICAgLy8gcGFyYW5v
aWEgY2hlY2sKLSAgICBmcm9tUGFnZSA9IHFNYXgoMSwgZnJvbVBhZ2UpOwotICAgIHRvUGFnZSA9
IHFNaW4oc3RhdGljX2Nhc3Q8aW50PihwcmludENvbnRleHQucGFnZUNvdW50KCkpLCB0b1BhZ2Up
OwotICAgIGlmICh0b1BhZ2UgPCBmcm9tUGFnZSkgewotICAgICAgICAvLyBpZiB0aGUgdXNlciBl
bnRlcmVkIGEgcGFnZSByYW5nZSBvdXRzaWRlIHRoZSBhY3R1YWwgbnVtYmVyCi0gICAgICAgIC8v
IG9mIHByaW50YWJsZSBwYWdlcywganVzdCByZXR1cm4KLSAgICAgICAgcmV0dXJuOwotICAgIH0K
LQotICAgIGlmIChwcmludGVyLT5wYWdlT3JkZXIoKSA9PSBRUHJpbnRlcjo6TGFzdFBhZ2VGaXJz
dCkgewotICAgICAgICBpbnQgdG1wID0gZnJvbVBhZ2U7Ci0gICAgICAgIGZyb21QYWdlID0gdG9Q
YWdlOwotICAgICAgICB0b1BhZ2UgPSB0bXA7Ci0gICAgICAgIGFzY2VuZGluZyA9IGZhbHNlOwot
ICAgIH0KLQotICAgIHBhaW50ZXIuc2NhbGUoem9vbUZhY3RvclgsIHpvb21GYWN0b3JZKTsKLSAg
ICBHcmFwaGljc0NvbnRleHQgY3R4KCZwYWludGVyKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBp
IDwgZG9jQ29waWVzOyArK2kpIHsKLSAgICAgICAgaW50IHBhZ2UgPSBmcm9tUGFnZTsKLSAgICAg
ICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcGFnZUNv
cGllczsgKytqKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHByaW50ZXItPnByaW50ZXJTdGF0ZSgp
ID09IFFQcmludGVyOjpBYm9ydGVkCi0gICAgICAgICAgICAgICAgICAgIHx8IHByaW50ZXItPnBy
aW50ZXJTdGF0ZSgpID09IFFQcmludGVyOjpFcnJvcikgewotICAgICAgICAgICAgICAgICAgICBw
cmludENvbnRleHQuZW5kKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHJpbnRDb250ZXh0LnNwb29sUGFnZShjdHgsIHBh
Z2UgLSAxLCBwYWdlUmVjdC53aWR0aCgpKTsKLSAgICAgICAgICAgICAgICBpZiAoaiA8IHBhZ2VD
b3BpZXMgLSAxKQotICAgICAgICAgICAgICAgICAgICBwcmludGVyLT5uZXdQYWdlKCk7Ci0gICAg
ICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwYWdlID09IHRvUGFnZSkKLSAgICAgICAgICAg
ICAgICBicmVhazsKLQotICAgICAgICAgICAgaWYgKGFzY2VuZGluZykKLSAgICAgICAgICAgICAg
ICArK3BhZ2U7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgLS1wYWdlOwotCi0g
ICAgICAgICAgICBwcmludGVyLT5uZXdQYWdlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAo
IGkgPCBkb2NDb3BpZXMgLSAxKQotICAgICAgICAgICAgcHJpbnRlci0+bmV3UGFnZSgpOwotICAg
IH0KLQotICAgIHByaW50Q29udGV4dC5lbmQoKTsKLSNlbmRpZiAvLyBIQVZFKFBSSU5UU1VQUE9S
VCkKLX0KLSNlbmRpZiAvLyBRVF9OT19QUklOVEVSCi0KLS8qIQotICAgIEV2YWx1YXRlcyB0aGUg
SmF2YVNjcmlwdCBkZWZpbmVkIGJ5IFxhIHNjcmlwdFNvdXJjZSB1c2luZyB0aGlzIGZyYW1lIGFz
IGNvbnRleHQKLSAgICBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGV4ZWN1dGVk
IHN0YXRlbWVudC4KLQotICAgIFxzYSBhZGRUb0phdmFTY3JpcHRXaW5kb3dPYmplY3QoKSwgamF2
YVNjcmlwdFdpbmRvd09iamVjdENsZWFyZWQoKQotKi8KLVFWYXJpYW50IFFXZWJGcmFtZTo6ZXZh
bHVhdGVKYXZhU2NyaXB0KGNvbnN0IFFTdHJpbmcmIHNjcmlwdFNvdXJjZSkKLXsKLSAgICBTY3Jp
cHRDb250cm9sbGVyICpwcm94eSA9IGQtPmZyYW1lLT5zY3JpcHQoKTsKLSAgICBRVmFyaWFudCBy
YzsKLSAgICBpZiAocHJveHkpIHsKLSAgICAgICAgaW50IGRpc3RhbmNlID0gMDsKLSAgICAgICAg
SlNDOjpKU1ZhbHVlIHYgPSBkLT5mcmFtZS0+c2NyaXB0KCktPmV4ZWN1dGVTY3JpcHQoU2NyaXB0
U291cmNlQ29kZShzY3JpcHRTb3VyY2UpKS5qc1ZhbHVlKCk7Ci0gICAgICAgIEpTQzo6RXhlY1N0
YXRlKiBleGVjID0gcHJveHktPmdsb2JhbE9iamVjdChtYWluVGhyZWFkTm9ybWFsV29ybGQoKSkt
Pmdsb2JhbEV4ZWMoKTsKLSAgICAgICAgSlNWYWx1ZVJlZiogaWdub3JlZEV4Y2VwdGlvbiA9IDA7
Ci0gICAgICAgIHJjID0gSlNDOjpCaW5kaW5nczo6Y29udmVydFZhbHVlVG9RVmFyaWFudCh0b1Jl
ZihleGVjKSwgdG9SZWYoZXhlYywgdiksIFFNZXRhVHlwZTo6Vm9pZCwgJmRpc3RhbmNlLCBpZ25v
cmVkRXhjZXB0aW9uKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJjOwotfQotCi0vKiEKLSAgICBcc2lu
Y2UgNC41Ci0KLSAgICBSZXR1cm5zIHRoZSBmcmFtZSdzIHNlY3VyaXR5IG9yaWdpbi4KLSovCi1R
V2ViU2VjdXJpdHlPcmlnaW4gUVdlYkZyYW1lOjpzZWN1cml0eU9yaWdpbigpIGNvbnN0Ci17Ci0g
ICAgUVdlYkZyYW1lKiB0aGF0ID0gY29uc3RfY2FzdDxRV2ViRnJhbWUqPih0aGlzKTsKLSAgICBR
V2ViU2VjdXJpdHlPcmlnaW5Qcml2YXRlKiBwcml2ID0gbmV3IFFXZWJTZWN1cml0eU9yaWdpblBy
aXZhdGUoUVdlYkZyYW1lUHJpdmF0ZTo6Y29yZSh0aGF0KS0+ZG9jdW1lbnQoKS0+c2VjdXJpdHlP
cmlnaW4oKSk7Ci0gICAgcmV0dXJuIFFXZWJTZWN1cml0eU9yaWdpbihwcml2KTsKLX0KLQotV2Vi
Q29yZTo6RnJhbWUqIFFXZWJGcmFtZVByaXZhdGU6OmNvcmUoY29uc3QgUVdlYkZyYW1lKiB3ZWJG
cmFtZSkKLXsKLSAgICByZXR1cm4gd2ViRnJhbWUtPmQtPmZyYW1lOwotfQotCi1RV2ViRnJhbWUq
IFFXZWJGcmFtZVByaXZhdGU6OmtpdChjb25zdCBXZWJDb3JlOjpGcmFtZSogY29yZUZyYW1lKQot
ewotICAgIHJldHVybiBxb2JqZWN0X2Nhc3Q8UVdlYkZyYW1lKj4oY29yZUZyYW1lLT5sb2FkZXIo
KS0+bmV0d29ya2luZ0NvbnRleHQoKS0+b3JpZ2luYXRpbmdPYmplY3QoKSk7Ci19Ci0KLVFXZWJG
cmFtZSAqUVdlYkZyYW1lUHJpdmF0ZTo6a2l0KGNvbnN0IFFXZWJGcmFtZUFkYXB0ZXIqIGZyYW1l
QWRhcHRlcikKLXsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgUVdlYkZyYW1lUHJpdmF0
ZSo+KGZyYW1lQWRhcHRlciktPnE7Ci19Ci0KLQotLyohCi0gICAgXGZuIHZvaWQgUVdlYkZyYW1l
OjpqYXZhU2NyaXB0V2luZG93T2JqZWN0Q2xlYXJlZCgpCi0KLSAgICBUaGlzIHNpZ25hbCBpcyBl
bWl0dGVkIHdoZW5ldmVyIHRoZSBnbG9iYWwgd2luZG93IG9iamVjdCBvZiB0aGUgSmF2YVNjcmlw
dAotICAgIGVudmlyb25tZW50IGlzIGNsZWFyZWQsIGUuZy4sIGJlZm9yZSBzdGFydGluZyBhIG5l
dyBsb2FkLgotCi0gICAgSWYgeW91IGludGVuZCB0byBhZGQgUU9iamVjdHMgdG8gYSBRV2ViRnJh
bWUgdXNpbmcKLSAgICBhZGRUb0phdmFTY3JpcHRXaW5kb3dPYmplY3QoKSwgeW91IHNob3VsZCBh
ZGQgdGhlbSBpbiBhIHNsb3QgY29ubmVjdGVkCi0gICAgdG8gdGhpcyBzaWduYWwuIFRoaXMgZW5z
dXJlcyB0aGF0IHlvdXIgb2JqZWN0cyByZW1haW4gYWNjZXNzaWJsZSB3aGVuCi0gICAgbG9hZGlu
ZyBuZXcgVVJMcy4KLSovCi0KLS8qIQotICAgIFxmbiB2b2lkIFFXZWJGcmFtZTo6cHJvdmlzaW9u
YWxMb2FkKCkKLSAgICBcaW50ZXJuYWwKLSovCi0KLS8qIQotICAgIFxmbiB2b2lkIFFXZWJGcmFt
ZTo6dGl0bGVDaGFuZ2VkKGNvbnN0IFFTdHJpbmcgJnRpdGxlKQotCi0gICAgVGhpcyBzaWduYWwg
aXMgZW1pdHRlZCB3aGVuZXZlciB0aGUgdGl0bGUgb2YgdGhlIGZyYW1lIGNoYW5nZXMuCi0gICAg
VGhlIFxhIHRpdGxlIHN0cmluZyBzcGVjaWZpZXMgdGhlIG5ldyB0aXRsZS4KLQotICAgIFxzYSB0
aXRsZSgpCi0qLwotCi0vKiEKLSAgICBcZm4gdm9pZCBRV2ViRnJhbWU6OnVybENoYW5nZWQoY29u
c3QgUVVybCAmdXJsKQotCi0gICAgVGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aXRoIHRoZSBVUkwg
b2YgdGhlIGZyYW1lIHdoZW4gdGhlIGZyYW1lJ3MgdGl0bGUgaXMKLSAgICByZWNlaXZlZC4gVGhl
IG5ldyBVUkwgaXMgc3BlY2lmaWVkIGJ5IFxhIHVybC4KLQotICAgIFxzYSB1cmwoKQotKi8KLQot
LyohCi0gICAgXGZuIHZvaWQgUVdlYkZyYW1lOjppbml0aWFsTGF5b3V0Q29tcGxldGVkKCkKLQot
ICAgIFRoaXMgc2lnbmFsIGlzIGVtaXR0ZWQgd2hlbiB0aGUgZnJhbWUgaXMgbGFpZCBvdXQgdGhl
IGZpcnN0IHRpbWUuCi0gICAgVGhpcyBpcyB0aGUgZmlyc3QgdGltZSB5b3Ugd2lsbCBzZWUgY29u
dGVudHMgZGlzcGxheWVkIG9uIHRoZSBmcmFtZS4KLQotICAgIFxub3RlIEEgZnJhbWUgY2FuIGJl
IGxhaWQgb3V0IG11bHRpcGxlIHRpbWVzLgotKi8KLQotLyohCi0gIFxmbiB2b2lkIFFXZWJGcmFt
ZTo6aWNvbkNoYW5nZWQoKQotCi0gIFRoaXMgc2lnbmFsIGlzIGVtaXR0ZWQgd2hlbiB0aGUgaWNv
biAoImZhdmljb24iKSBhc3NvY2lhdGVkIHdpdGggdGhlIGZyYW1lCi0gIGhhcyBiZWVuIGxvYWRl
ZC4KLQotICBcc2EgaWNvbigpCi0qLwotCi0vKiEKLSAgXGZuIHZvaWQgUVdlYkZyYW1lOjpjb250
ZW50c1NpemVDaGFuZ2VkKGNvbnN0IFFTaXplICZzaXplKQotICBcc2luY2UgNC42Ci0KLSAgVGhp
cyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuIHRoZSBmcmFtZSdzIGNvbnRlbnRzIHNpemUgY2hhbmdl
cwotICB0byBcYSBzaXplLgotCi0gIFxzYSBjb250ZW50c1NpemUoKQotKi8KLQotLyohCi0gICAg
XGZuIHZvaWQgUVdlYkZyYW1lOjpsb2FkU3RhcnRlZCgpCi0gICAgXHNpbmNlIDQuNgotCi0gICAg
VGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuIGEgbmV3IGxvYWQgb2YgdGhpcyBmcmFtZSBpcyBz
dGFydGVkLgotCi0gICAgXHNhIGxvYWRGaW5pc2hlZCgpCi0qLwotCi0vKiEKLSAgICBcZm4gdm9p
ZCBRV2ViRnJhbWU6OmxvYWRGaW5pc2hlZChib29sIG9rKQotICAgIFxzaW5jZSA0LjYKLQotICAg
IFRoaXMgc2lnbmFsIGlzIGVtaXR0ZWQgd2hlbiBhIGxvYWQgb2YgdGhpcyBmcmFtZSBpcyBmaW5p
c2hlZC4KLSAgICBcYSBvayB3aWxsIGluZGljYXRlIHdoZXRoZXIgdGhlIGxvYWQgd2FzIHN1Y2Nl
c3NmdWwgb3IgYW55IGVycm9yIG9jY3VycmVkLgotCi0gICAgXHNhIGxvYWRTdGFydGVkKCkKLSov
Ci0KLS8qIQotICAgIFxmbiB2b2lkIFFXZWJGcmFtZTo6cGFnZUNoYW5nZWQoKQotICAgIFxzaW5j
ZSA0LjcKLQotICAgIFRoaXMgc2lnbmFsIGlzIGVtaXR0ZWQgd2hlbiB0aGlzIGZyYW1lIGhhcyBi
ZWVuIG1vdmVkIHRvIGEgZGlmZmVyZW50IFFXZWJQYWdlLgotCi0gICAgXHNhIHBhZ2UoKQotKi8K
LQotLyohCi0gICAgXGNsYXNzIFFXZWJIaXRUZXN0UmVzdWx0Ci0gICAgXHNpbmNlIDQuNAotICAg
IFxicmllZiBUaGUgUVdlYkhpdFRlc3RSZXN1bHQgY2xhc3MgcHJvdmlkZXMgaW5mb3JtYXRpb24g
YWJvdXQgdGhlIHdlYgotICAgIHBhZ2UgY29udGVudCBhZnRlciBhIGhpdCB0ZXN0LgotCi0gICAg
XGlubW9kdWxlIFF0V2ViS2l0Ci0KLSAgICBRV2ViSGl0VGVzdFJlc3VsdCBpcyByZXR1cm5lZCBi
eSBRV2ViRnJhbWU6OmhpdFRlc3RDb250ZW50KCkgdG8gcHJvdmlkZQotICAgIGluZm9ybWF0aW9u
IGFib3V0IHRoZSBjb250ZW50IG9mIHRoZSB3ZWIgcGFnZSBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0
aW9uLgotKi8KLQotLyohCi0gICAgXGludGVybmFsCi0qLwotUVdlYkhpdFRlc3RSZXN1bHQ6OlFX
ZWJIaXRUZXN0UmVzdWx0KFFXZWJIaXRUZXN0UmVzdWx0UHJpdmF0ZSAqcHJpdikKLSAgICA6IGQo
cHJpdikKLXsKLX0KLQotUVdlYkhpdFRlc3RSZXN1bHRQcml2YXRlOjpRV2ViSGl0VGVzdFJlc3Vs
dFByaXZhdGUoY29uc3QgV2ViQ29yZTo6SGl0VGVzdFJlc3VsdCAmaGl0VGVzdCkKLSAgICA6IGlz
Q29udGVudEVkaXRhYmxlKGZhbHNlKQotICAgICwgaXNDb250ZW50U2VsZWN0ZWQoZmFsc2UpCi0g
ICAgLCBpc1Njcm9sbEJhcihmYWxzZSkKLXsKLSAgICBpZiAoIWhpdFRlc3QuaW5uZXJOb2RlKCkp
Ci0gICAgICAgIHJldHVybjsKLSAgICBwb3MgPSBoaXRUZXN0LnJvdW5kZWRQb2ludEluSW5uZXJO
b2RlRnJhbWUoKTsKLSAgICBXZWJDb3JlOjpUZXh0RGlyZWN0aW9uIGRpcjsKLSAgICB0aXRsZSA9
IGhpdFRlc3QudGl0bGUoZGlyKTsKLSAgICBsaW5rVGV4dCA9IGhpdFRlc3QudGV4dENvbnRlbnQo
KTsKLSAgICBsaW5rVXJsID0gaGl0VGVzdC5hYnNvbHV0ZUxpbmtVUkwoKTsKLSAgICBsaW5rVGl0
bGUgPSBoaXRUZXN0LnRpdGxlRGlzcGxheVN0cmluZygpOwotICAgIGFsdGVybmF0ZVRleHQgPSBo
aXRUZXN0LmFsdERpc3BsYXlTdHJpbmcoKTsKLSAgICBpbWFnZVVybCA9IGhpdFRlc3QuYWJzb2x1
dGVJbWFnZVVSTCgpOwotICAgIGlubmVyTm9kZSA9IGhpdFRlc3QuaW5uZXJOb2RlKCk7Ci0gICAg
aW5uZXJOb25TaGFyZWROb2RlID0gaGl0VGVzdC5pbm5lck5vblNoYXJlZE5vZGUoKTsKLSAgICBi
b3VuZGluZ1JlY3QgPSBpbm5lck5vblNoYXJlZE5vZGUgPyBpbm5lck5vblNoYXJlZE5vZGUtPnJl
bmRlcmVyKCktPmFic29sdXRlQm91bmRpbmdCb3hSZWN0KCkgOiBJbnRSZWN0KCk7Ci0gICAgV2Vi
Q29yZTo6SW1hZ2UgKmltZyA9IGhpdFRlc3QuaW1hZ2UoKTsKLSAgICBpZiAoaW1nKSB7Ci0gICAg
ICAgIFFQaXhtYXAgKnBpeCA9IGltZy0+bmF0aXZlSW1hZ2VGb3JDdXJyZW50RnJhbWUoKTsKLSAg
ICAgICAgaWYgKHBpeCkKLSAgICAgICAgICAgIHBpeG1hcCA9ICpwaXg7Ci0gICAgfQotICAgIFdl
YkNvcmU6OkZyYW1lICp3ZnJhbWUgPSBoaXRUZXN0LnRhcmdldEZyYW1lKCk7Ci0gICAgaWYgKHdm
cmFtZSkKLSAgICAgICAgbGlua1RhcmdldEZyYW1lID0gUVdlYkZyYW1lUHJpdmF0ZTo6a2l0KHdm
cmFtZSk7Ci0gICAgbGlua0VsZW1lbnQgPSBRV2ViRWxlbWVudChoaXRUZXN0LlVSTEVsZW1lbnQo
KSk7Ci0KLSAgICBpc0NvbnRlbnRFZGl0YWJsZSA9IGhpdFRlc3QuaXNDb250ZW50RWRpdGFibGUo
KTsKLSAgICBpc0NvbnRlbnRTZWxlY3RlZCA9IGhpdFRlc3QuaXNTZWxlY3RlZCgpOwotICAgIGlz
U2Nyb2xsQmFyID0gaGl0VGVzdC5zY3JvbGxiYXIoKTsKLQotICAgIFdlYkNvcmU6OkZyYW1lICpp
bm5lck5vZGVGcmFtZSA9IGhpdFRlc3QuaW5uZXJOb2RlRnJhbWUoKTsKLSAgICBpZiAoaW5uZXJO
b2RlRnJhbWUpCi0gICAgICAgIGZyYW1lID0gUVdlYkZyYW1lUHJpdmF0ZTo6a2l0KGlubmVyTm9k
ZUZyYW1lKTsKLQotICAgIGVuY2xvc2luZ0Jsb2NrID0gUVdlYkVsZW1lbnQoV2ViQ29yZTo6ZW5j
bG9zaW5nQmxvY2soaW5uZXJOb2RlLmdldCgpKSk7Ci19Ci0KLS8qIQotICAgIENvbnN0cnVjdHMg
YSBudWxsIGhpdCB0ZXN0IHJlc3VsdC4KLSovCi1RV2ViSGl0VGVzdFJlc3VsdDo6UVdlYkhpdFRl
c3RSZXN1bHQoKQotICAgIDogZCgwKQotewotfQotCi0vKiEKLSAgICBDb25zdHJ1Y3RzIGEgaGl0
IHRlc3QgcmVzdWx0IGZyb20gXGEgb3RoZXIuCi0qLwotUVdlYkhpdFRlc3RSZXN1bHQ6OlFXZWJI
aXRUZXN0UmVzdWx0KGNvbnN0IFFXZWJIaXRUZXN0UmVzdWx0ICZvdGhlcikKLSAgICA6IGQoMCkK
LXsKLSAgICBpZiAob3RoZXIuZCkKLSAgICAgICAgZCA9IG5ldyBRV2ViSGl0VGVzdFJlc3VsdFBy
aXZhdGUoKm90aGVyLmQpOwotfQotCi0vKiEKLSAgICBBc3NpZ25zIHRoZSBcYSBvdGhlciBoaXQg
dGVzdCByZXN1bHQgdG8gdGhpcy4KLSovCi1RV2ViSGl0VGVzdFJlc3VsdCAmUVdlYkhpdFRlc3RS
ZXN1bHQ6Om9wZXJhdG9yPShjb25zdCBRV2ViSGl0VGVzdFJlc3VsdCAmb3RoZXIpCi17Ci0gICAg
aWYgKHRoaXMgIT0gJm90aGVyKSB7Ci0gICAgICAgIGlmIChvdGhlci5kKSB7Ci0gICAgICAgICAg
ICBpZiAoIWQpCi0gICAgICAgICAgICAgICAgZCA9IG5ldyBRV2ViSGl0VGVzdFJlc3VsdFByaXZh
dGU7Ci0gICAgICAgICAgICAqZCA9ICpvdGhlci5kOwotICAgICAgICB9IGVsc2UgewotICAgICAg
ICAgICAgZGVsZXRlIGQ7Ci0gICAgICAgICAgICBkID0gMDsKLSAgICAgICAgfQotICAgIH0KLSAg
ICByZXR1cm4gKnRoaXM7Ci19Ci0KLS8qIQotICAgIERlc3RydWN0b3IuCi0qLwotUVdlYkhpdFRl
c3RSZXN1bHQ6On5RV2ViSGl0VGVzdFJlc3VsdCgpCi17Ci0gICAgZGVsZXRlIGQ7Ci19Ci0KLS8q
IQotICAgIFJldHVybnMgdHJ1ZSBpZiB0aGUgaGl0IHRlc3QgcmVzdWx0IGlzIG51bGw7IG90aGVy
d2lzZSByZXR1cm5zIGZhbHNlLgotKi8KLWJvb2wgUVdlYkhpdFRlc3RSZXN1bHQ6OmlzTnVsbCgp
IGNvbnN0Ci17Ci0gICAgcmV0dXJuICFkOwotfQotCi0vKiEKLSAgICBSZXR1cm5zIHRoZSBwb3Np
dGlvbiB3aGVyZSB0aGUgaGl0IHRlc3Qgb2NjdXJlZCBpbiB0aGUgY29vcmRpbmF0ZXMgb2YgZnJh
bWUgY29udGFpbmluZyB0aGUgZWxlbWVudCBoaXQuCi0KLSAgICBcc2EgZnJhbWUoKQotKi8KLVFQ
b2ludCBRV2ViSGl0VGVzdFJlc3VsdDo6cG9zKCkgY29uc3QKLXsKLSAgICBpZiAoIWQpCi0gICAg
ICAgIHJldHVybiBRUG9pbnQoKTsKLSAgICByZXR1cm4gZC0+cG9zOwotfQotCi0vKiEKLSAgICBc
c2luY2UgNC41Ci0gICAgUmV0dXJucyB0aGUgYm91bmRpbmcgcmVjdCBvZiB0aGUgZWxlbWVudC4K
LSovCi1RUmVjdCBRV2ViSGl0VGVzdFJlc3VsdDo6Ym91bmRpbmdSZWN0KCkgY29uc3QKLXsKLSAg
ICBpZiAoIWQpCi0gICAgICAgIHJldHVybiBRUmVjdCgpOwotICAgIHJldHVybiBkLT5ib3VuZGlu
Z1JlY3Q7Ci19Ci0KLS8qIQotICAgIFxzaW5jZSA0LjYKLSAgICBSZXR1cm5zIHRoZSBibG9jayBl
bGVtZW50IHRoYXQgZW5jbG9zZXMgdGhlIGVsZW1lbnQgaGl0LgotCi0gICAgQSBibG9jayBlbGVt
ZW50IGlzIGFuIGVsZW1lbnQgdGhhdCBpcyByZW5kZXJlZCB1c2luZyB0aGUKLSAgICBDU1MgImJs
b2NrIiBzdHlsZS4gVGhpcyBpbmNsdWRlcyBmb3IgZXhhbXBsZSB0ZXh0Ci0gICAgcGFyYWdyYXBo
cy4KLSovCi1RV2ViRWxlbWVudCBRV2ViSGl0VGVzdFJlc3VsdDo6ZW5jbG9zaW5nQmxvY2tFbGVt
ZW50KCkgY29uc3QKLXsKLSAgICBpZiAoIWQpCi0gICAgICAgIHJldHVybiBRV2ViRWxlbWVudCgp
OwotICAgIHJldHVybiBkLT5lbmNsb3NpbmdCbG9jazsKLX0KLQotLyohCi0gICAgUmV0dXJucyB0
aGUgdGl0bGUgb2YgdGhlIG5lYXJlc3QgZW5jbG9zaW5nIEhUTUwgZWxlbWVudC4KLSovCi1RU3Ry
aW5nIFFXZWJIaXRUZXN0UmVzdWx0Ojp0aXRsZSgpIGNvbnN0Ci17Ci0gICAgaWYgKCFkKQotICAg
ICAgICByZXR1cm4gUVN0cmluZygpOwotICAgIHJldHVybiBkLT50aXRsZTsKLX0KLQotLyohCi0g
ICAgUmV0dXJucyB0aGUgdGV4dCBvZiB0aGUgbGluay4KLSovCi1RU3RyaW5nIFFXZWJIaXRUZXN0
UmVzdWx0OjpsaW5rVGV4dCgpIGNvbnN0Ci17Ci0gICAgaWYgKCFkKQotICAgICAgICByZXR1cm4g
UVN0cmluZygpOwotICAgIHJldHVybiBkLT5saW5rVGV4dDsKLX0KLQotLyohCi0gICAgUmV0dXJu
cyB0aGUgdXJsIHRvIHdoaWNoIHRoZSBsaW5rIHBvaW50cyB0by4KLSovCi1RVXJsIFFXZWJIaXRU
ZXN0UmVzdWx0OjpsaW5rVXJsKCkgY29uc3QKLXsKLSAgICBpZiAoIWQpCi0gICAgICAgIHJldHVy
biBRVXJsKCk7Ci0gICAgcmV0dXJuIGQtPmxpbmtVcmw7Ci19Ci0KLS8qIQotICAgIFJldHVybnMg
dGhlIHRpdGxlIG9mIHRoZSBsaW5rLgotKi8KLVFVcmwgUVdlYkhpdFRlc3RSZXN1bHQ6OmxpbmtU
aXRsZSgpIGNvbnN0Ci17Ci0gICAgaWYgKCFkKQotICAgICAgICByZXR1cm4gUVVybCgpOwotICAg
IHJldHVybiBkLT5saW5rVGl0bGU7Ci19Ci0KLS8qIQotICBcc2luY2UgNC42Ci0gIFJldHVybnMg
dGhlIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHRoZSBsaW5rLgotCi0gIFxzYSBsaW5rVGFyZ2V0
RnJhbWUoKQotKi8KLVFXZWJFbGVtZW50IFFXZWJIaXRUZXN0UmVzdWx0OjpsaW5rRWxlbWVudCgp
IGNvbnN0Ci17Ci0gICAgaWYgKCFkKQotICAgICAgICByZXR1cm4gUVdlYkVsZW1lbnQoKTsKLSAg
ICByZXR1cm4gZC0+bGlua0VsZW1lbnQ7Ci19Ci0KLS8qIQotICAgIFJldHVybnMgdGhlIGZyYW1l
IHRoYXQgd2lsbCBsb2FkIHRoZSBsaW5rIGlmIGl0IGlzIGFjdGl2YXRlZC4KLQotICAgIFxzYSBs
aW5rRWxlbWVudCgpCi0qLwotUVdlYkZyYW1lICpRV2ViSGl0VGVzdFJlc3VsdDo6bGlua1Rhcmdl
dEZyYW1lKCkgY29uc3QKLXsKLSAgICBpZiAoIWQpCi0gICAgICAgIHJldHVybiAwOwotICAgIHJl
dHVybiBkLT5saW5rVGFyZ2V0RnJhbWUuZGF0YSgpOwotfQotCi0vKiEKLSAgICBSZXR1cm5zIHRo
ZSBhbHRlcm5hdGUgdGV4dCBvZiB0aGUgZWxlbWVudC4gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUg
SFRNTCBhbHQgYXR0cmlidXRlLgotKi8KLVFTdHJpbmcgUVdlYkhpdFRlc3RSZXN1bHQ6OmFsdGVy
bmF0ZVRleHQoKSBjb25zdAotewotICAgIGlmICghZCkKLSAgICAgICAgcmV0dXJuIFFTdHJpbmco
KTsKLSAgICByZXR1cm4gZC0+YWx0ZXJuYXRlVGV4dDsKLX0KLQotLyohCi0gICAgUmV0dXJucyB0
aGUgdXJsIG9mIHRoZSBpbWFnZS4KLSovCi1RVXJsIFFXZWJIaXRUZXN0UmVzdWx0OjppbWFnZVVy
bCgpIGNvbnN0Ci17Ci0gICAgaWYgKCFkKQotICAgICAgICByZXR1cm4gUVVybCgpOwotICAgIHJl
dHVybiBkLT5pbWFnZVVybDsKLX0KLQotLyohCi0gICAgUmV0dXJucyBhIFFQaXhtYXAgY29udGFp
bmluZyB0aGUgaW1hZ2UuIEEgbnVsbCBwaXhtYXAgaXMgcmV0dXJuZWQgaWYgdGhlCi0gICAgZWxl
bWVudCBiZWluZyB0ZXN0ZWQgaXMgbm90IGFuIGltYWdlLgotKi8KLVFQaXhtYXAgUVdlYkhpdFRl
c3RSZXN1bHQ6OnBpeG1hcCgpIGNvbnN0Ci17Ci0gICAgaWYgKCFkKQotICAgICAgICByZXR1cm4g
UVBpeG1hcCgpOwotICAgIHJldHVybiBkLT5waXhtYXA7Ci19Ci0KLS8qIQotICAgIFJldHVybnMg
dHJ1ZSBpZiB0aGUgY29udGVudCBpcyBlZGl0YWJsZSBieSB0aGUgdXNlcjsgb3RoZXJ3aXNlIHJl
dHVybnMgZmFsc2UuCi0qLwotYm9vbCBRV2ViSGl0VGVzdFJlc3VsdDo6aXNDb250ZW50RWRpdGFi
bGUoKSBjb25zdAotewotICAgIGlmICghZCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJl
dHVybiBkLT5pc0NvbnRlbnRFZGl0YWJsZTsKLX0KLQotLyohCi0gICAgUmV0dXJucyB0cnVlIGlm
IHRoZSBjb250ZW50IHRlc3RlZCBpcyBwYXJ0IG9mIHRoZSBzZWxlY3Rpb247IG90aGVyd2lzZSBy
ZXR1cm5zIGZhbHNlLgotKi8KLWJvb2wgUVdlYkhpdFRlc3RSZXN1bHQ6OmlzQ29udGVudFNlbGVj
dGVkKCkgY29uc3QKLXsKLSAgICBpZiAoIWQpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBy
ZXR1cm4gZC0+aXNDb250ZW50U2VsZWN0ZWQ7Ci19Ci0KLS8qIQotICAgIFxzaW5jZSA0LjYKLSAg
ICBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIERPTSBlbGVtZW50IGFzIFFXZWJFbGVtZW50LgotKi8K
LVFXZWJFbGVtZW50IFFXZWJIaXRUZXN0UmVzdWx0OjplbGVtZW50KCkgY29uc3QKLXsKLSAgICBp
ZiAoIWQgfHwgIWQtPmlubmVyTm9uU2hhcmVkTm9kZSB8fCAhZC0+aW5uZXJOb25TaGFyZWROb2Rl
LT5pc0VsZW1lbnROb2RlKCkpCi0gICAgICAgIHJldHVybiBRV2ViRWxlbWVudCgpOwotCi0gICAg
cmV0dXJuIFFXZWJFbGVtZW50KHN0YXRpY19jYXN0PFdlYkNvcmU6OkVsZW1lbnQqPihkLT5pbm5l
ck5vblNoYXJlZE5vZGUuZ2V0KCkpKTsKLX0KLQotLyohCi0gICAgUmV0dXJucyB0aGUgZnJhbWUg
b2YgdGhlIGVsZW1lbnQgaGl0LgotKi8KLVFXZWJGcmFtZSAqUVdlYkhpdFRlc3RSZXN1bHQ6OmZy
YW1lKCkgY29uc3QKLXsKLSAgICBpZiAoIWQpCi0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVy
biBkLT5mcmFtZS5kYXRhKCk7Ci19Ci0KLS8qIQotICogXGludGVybmFsCi0gKi8KLVFXZWJGcmFt
ZUFkYXB0ZXIgKlFXZWJGcmFtZTo6aGFuZGxlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZDsKLX0K
LQotI2luY2x1ZGUgIm1vY19xd2ViZnJhbWUuY3BwIgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktp
dC9xdC9BcGkvcXdlYmZyYW1lLmggYi9Tb3VyY2UvV2ViS2l0L3F0L0FwaS9xd2ViZnJhbWUuaApk
ZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUwMGQ4MWY1YTA0NTJhZDI0ODE4OTk2NjM5
NDE5OGRjY2Q3ZmJmNy4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAot
LS0gYS9Tb3VyY2UvV2ViS2l0L3F0L0FwaS9xd2ViZnJhbWUuaAorKysgL2Rldi9udWxsCkBAIC0x
LDI0NSArMCwwIEBACi0vKgotICAgIENvcHlyaWdodCAoQykgMjAwOCwyMDA5IE5va2lhIENvcnBv
cmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQotICAgIENvcHlyaWdodCAoQykgMjAw
NyBTdGFpa29zIENvbXB1dGluZyBTZXJ2aWNlcyBJbmMuCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMg
ZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5
IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAg
ICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBl
aXRoZXIKLSAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikg
YW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4g
dGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FS
UkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5U
QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05V
Ci0gICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0K
LSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0
aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KLSAgICB0aGUgRnJlZSBTb2Z0
d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAot
ICAgIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgotKi8KLQotI2lmbmRlZiBRV0VCRlJBTUVf
SAotI2RlZmluZSBRV0VCRlJBTUVfSAotCi0jaW5jbHVkZSA8UXRDb3JlL3FvYmplY3QuaD4KLSNp
bmNsdWRlIDxRdENvcmUvcXVybC5oPgotI2luY2x1ZGUgPFF0Q29yZS9xdmFyaWFudC5oPgotI2lu
Y2x1ZGUgPFF0R3VpL3FpY29uLmg+Ci0jaW5jbHVkZSA8UXROZXR3b3JrL3FuZXR3b3JrYWNjZXNz
bWFuYWdlci5oPgotI2luY2x1ZGUgInF3ZWJraXRnbG9iYWwuaCIKLQotUVRfQkVHSU5fTkFNRVNQ
QUNFCi1jbGFzcyBRUmVjdDsKLWNsYXNzIFFQb2ludDsKLWNsYXNzIFFQYWludGVyOwotY2xhc3Mg
UVBpeG1hcDsKLWNsYXNzIFFNb3VzZUV2ZW50OwotY2xhc3MgUVdoZWVsRXZlbnQ7Ci1jbGFzcyBR
TmV0d29ya1JlcXVlc3Q7Ci1jbGFzcyBRUmVnaW9uOwotY2xhc3MgUVByaW50ZXI7Ci1RVF9FTkRf
TkFNRVNQQUNFCi0KLWNsYXNzIFFXZWJOZXR3b3JrUmVxdWVzdDsKLWNsYXNzIFFXZWJGcmFtZUFk
YXB0ZXI7Ci1jbGFzcyBRV2ViRnJhbWVQcml2YXRlOwotY2xhc3MgUVdlYlBhZ2U7Ci1jbGFzcyBR
V2ViUGFnZUFkYXB0ZXI7Ci1jbGFzcyBRV2ViSGl0VGVzdFJlc3VsdDsKLWNsYXNzIFFXZWJIaXN0
b3J5SXRlbTsKLWNsYXNzIFFXZWJTZWN1cml0eU9yaWdpbjsKLWNsYXNzIFFXZWJFbGVtZW50Owot
Y2xhc3MgUVdlYkVsZW1lbnRDb2xsZWN0aW9uOwotY2xhc3MgUVdlYlNjcmlwdFdvcmxkOwotCi1j
bGFzcyBEdW1wUmVuZGVyVHJlZVN1cHBvcnRRdDsKLW5hbWVzcGFjZSBXZWJDb3JlIHsKLSAgICBj
bGFzcyBXaWRnZXRQcml2YXRlOwotICAgIGNsYXNzIEZyYW1lTG9hZGVyQ2xpZW50UXQ7Ci0gICAg
Y2xhc3MgQ2hyb21lQ2xpZW50UXQ7Ci0gICAgY2xhc3MgVGV4dHVyZU1hcHBlckxheWVyQ2xpZW50
UXQ7Ci19Ci1jbGFzcyBRV2ViRnJhbWVEYXRhOwotY2xhc3MgUVdlYkhpdFRlc3RSZXN1bHRQcml2
YXRlOwotY2xhc3MgUVdlYkZyYW1lOwotCi1jbGFzcyBRV0VCS0lUX0VYUE9SVCBRV2ViSGl0VGVz
dFJlc3VsdCB7Ci1wdWJsaWM6Ci0gICAgUVdlYkhpdFRlc3RSZXN1bHQoKTsKLSAgICBRV2ViSGl0
VGVzdFJlc3VsdChjb25zdCBRV2ViSGl0VGVzdFJlc3VsdCAmb3RoZXIpOwotICAgIFFXZWJIaXRU
ZXN0UmVzdWx0ICZvcGVyYXRvcj0oY29uc3QgUVdlYkhpdFRlc3RSZXN1bHQgJm90aGVyKTsKLSAg
ICB+UVdlYkhpdFRlc3RSZXN1bHQoKTsKLQotICAgIGJvb2wgaXNOdWxsKCkgY29uc3Q7Ci0KLSAg
ICBRUG9pbnQgcG9zKCkgY29uc3Q7Ci0gICAgUVJlY3QgYm91bmRpbmdSZWN0KCkgY29uc3Q7Ci0g
ICAgUVdlYkVsZW1lbnQgZW5jbG9zaW5nQmxvY2tFbGVtZW50KCkgY29uc3Q7Ci0gICAgUVN0cmlu
ZyB0aXRsZSgpIGNvbnN0OwotCi0gICAgUVN0cmluZyBsaW5rVGV4dCgpIGNvbnN0OwotICAgIFFV
cmwgbGlua1VybCgpIGNvbnN0OwotICAgIFFVcmwgbGlua1RpdGxlKCkgY29uc3Q7Ci0gICAgUVdl
YkZyYW1lICpsaW5rVGFyZ2V0RnJhbWUoKSBjb25zdDsKLSAgICBRV2ViRWxlbWVudCBsaW5rRWxl
bWVudCgpIGNvbnN0OwotCi0gICAgUVN0cmluZyBhbHRlcm5hdGVUZXh0KCkgY29uc3Q7IC8vIGZv
ciBpbWcsIGFyZWEsIGlucHV0IGFuZCBhcHBsZXQKLQotICAgIFFVcmwgaW1hZ2VVcmwoKSBjb25z
dDsKLSAgICBRUGl4bWFwIHBpeG1hcCgpIGNvbnN0OwotCi0gICAgYm9vbCBpc0NvbnRlbnRFZGl0
YWJsZSgpIGNvbnN0OwotICAgIGJvb2wgaXNDb250ZW50U2VsZWN0ZWQoKSBjb25zdDsKLQotICAg
IFFXZWJFbGVtZW50IGVsZW1lbnQoKSBjb25zdDsKLQotICAgIFFXZWJGcmFtZSAqZnJhbWUoKSBj
b25zdDsKLQotcHJpdmF0ZToKLSAgICBRV2ViSGl0VGVzdFJlc3VsdChRV2ViSGl0VGVzdFJlc3Vs
dFByaXZhdGUgKnByaXYpOwotICAgIFFXZWJIaXRUZXN0UmVzdWx0UHJpdmF0ZSAqZDsKLQotICAg
IGZyaWVuZCBjbGFzcyBRV2ViRnJhbWU7Ci0gICAgZnJpZW5kIGNsYXNzIFFXZWJQYWdlUHJpdmF0
ZTsKLSAgICBmcmllbmQgY2xhc3MgUVdlYlBhZ2U7Ci19OwotCi1jbGFzcyBRV0VCS0lUX0VYUE9S
VCBRV2ViRnJhbWUgOiBwdWJsaWMgUU9iamVjdCB7Ci0gICAgUV9PQkpFQ1QKLSAgICBRX1BST1BF
UlRZKHFyZWFsIHRleHRTaXplTXVsdGlwbGllciBSRUFEIHRleHRTaXplTXVsdGlwbGllciBXUklU
RSBzZXRUZXh0U2l6ZU11bHRpcGxpZXIgREVTSUdOQUJMRSBmYWxzZSkKLSAgICBRX1BST1BFUlRZ
KHFyZWFsIHpvb21GYWN0b3IgUkVBRCB6b29tRmFjdG9yIFdSSVRFIHNldFpvb21GYWN0b3IpCi0g
ICAgUV9QUk9QRVJUWShRU3RyaW5nIHRpdGxlIFJFQUQgdGl0bGUpCi0gICAgUV9QUk9QRVJUWShR
VXJsIHVybCBSRUFEIHVybCBXUklURSBzZXRVcmwpCi0gICAgUV9QUk9QRVJUWShRVXJsIHJlcXVl
c3RlZFVybCBSRUFEIHJlcXVlc3RlZFVybCkKLSAgICBRX1BST1BFUlRZKFFVcmwgYmFzZVVybCBS
RUFEIGJhc2VVcmwpCi0gICAgUV9QUk9QRVJUWShRSWNvbiBpY29uIFJFQUQgaWNvbikKLSAgICBR
X1BST1BFUlRZKFFTaXplIGNvbnRlbnRzU2l6ZSBSRUFEIGNvbnRlbnRzU2l6ZSkKLSAgICBRX1BS
T1BFUlRZKFFQb2ludCBzY3JvbGxQb3NpdGlvbiBSRUFEIHNjcm9sbFBvc2l0aW9uIFdSSVRFIHNl
dFNjcm9sbFBvc2l0aW9uKQotICAgIFFfUFJPUEVSVFkoYm9vbCBmb2N1cyBSRUFEIGhhc0ZvY3Vz
KQotcHJpdmF0ZToKLSAgICBRV2ViRnJhbWUoUVdlYlBhZ2UgKnBhcmVudFBhZ2UpOwotICAgIFFX
ZWJGcmFtZShRV2ViRnJhbWUqIHBhcmVudCwgUVdlYkZyYW1lRGF0YSopOwotICAgIH5RV2ViRnJh
bWUoKTsKLQotcHVibGljOgotICAgIGVudW0gVmFsdWVPd25lcnNoaXAgewotICAgICAgICBRdE93
bmVyc2hpcCwKLSAgICAgICAgU2NyaXB0T3duZXJzaGlwLAotICAgICAgICBBdXRvT3duZXJzaGlw
Ci0gICAgfTsKLQotICAgIFFXZWJQYWdlICpwYWdlKCkgY29uc3Q7Ci0KLSAgICB2b2lkIGxvYWQo
Y29uc3QgUVVybCAmdXJsKTsKLSAgICB2b2lkIGxvYWQoY29uc3QgUU5ldHdvcmtSZXF1ZXN0ICZy
ZXF1ZXN0LCBRTmV0d29ya0FjY2Vzc01hbmFnZXI6Ok9wZXJhdGlvbiBvcGVyYXRpb24gPSBRTmV0
d29ya0FjY2Vzc01hbmFnZXI6OkdldE9wZXJhdGlvbiwgY29uc3QgUUJ5dGVBcnJheSAmYm9keSA9
IFFCeXRlQXJyYXkoKSk7Ci0gICAgdm9pZCBzZXRIdG1sKGNvbnN0IFFTdHJpbmcgJmh0bWwsIGNv
bnN0IFFVcmwgJmJhc2VVcmwgPSBRVXJsKCkpOwotICAgIHZvaWQgc2V0Q29udGVudChjb25zdCBR
Qnl0ZUFycmF5ICZkYXRhLCBjb25zdCBRU3RyaW5nICZtaW1lVHlwZSA9IFFTdHJpbmcoKSwgY29u
c3QgUVVybCAmYmFzZVVybCA9IFFVcmwoKSk7Ci0KLSAgICB2b2lkIGFkZFRvSmF2YVNjcmlwdFdp
bmRvd09iamVjdChjb25zdCBRU3RyaW5nICZuYW1lLCBRT2JqZWN0ICpvYmplY3QsIFZhbHVlT3du
ZXJzaGlwIG93bmVyc2hpcCA9IFF0T3duZXJzaGlwKTsKLSAgICBRU3RyaW5nIHRvSHRtbCgpIGNv
bnN0OwotICAgIFFTdHJpbmcgdG9QbGFpblRleHQoKSBjb25zdDsKLSAgICBRU3RyaW5nIHJlbmRl
clRyZWVEdW1wKCkgY29uc3Q7Ci0KLSAgICBRU3RyaW5nIHRpdGxlKCkgY29uc3Q7Ci0gICAgdm9p
ZCBzZXRVcmwoY29uc3QgUVVybCAmdXJsKTsKLSAgICBRVXJsIHVybCgpIGNvbnN0OwotICAgIFFV
cmwgcmVxdWVzdGVkVXJsKCkgY29uc3Q7Ci0gICAgUVVybCBiYXNlVXJsKCkgY29uc3Q7Ci0gICAg
UUljb24gaWNvbigpIGNvbnN0OwotICAgIFFNdWx0aU1hcDxRU3RyaW5nLCBRU3RyaW5nPiBtZXRh
RGF0YSgpIGNvbnN0OwotCi0gICAgUVN0cmluZyBmcmFtZU5hbWUoKSBjb25zdDsKLQotICAgIFFX
ZWJGcmFtZSAqcGFyZW50RnJhbWUoKSBjb25zdDsKLSAgICBRTGlzdDxRV2ViRnJhbWUqPiBjaGls
ZEZyYW1lcygpIGNvbnN0OwotCi0gICAgUXQ6OlNjcm9sbEJhclBvbGljeSBzY3JvbGxCYXJQb2xp
Y3koUXQ6Ok9yaWVudGF0aW9uIG9yaWVudGF0aW9uKSBjb25zdDsKLSAgICB2b2lkIHNldFNjcm9s
bEJhclBvbGljeShRdDo6T3JpZW50YXRpb24gb3JpZW50YXRpb24sIFF0OjpTY3JvbGxCYXJQb2xp
Y3kgcG9saWN5KTsKLQotICAgIHZvaWQgc2V0U2Nyb2xsQmFyVmFsdWUoUXQ6Ok9yaWVudGF0aW9u
IG9yaWVudGF0aW9uLCBpbnQgdmFsdWUpOwotICAgIGludCBzY3JvbGxCYXJWYWx1ZShRdDo6T3Jp
ZW50YXRpb24gb3JpZW50YXRpb24pIGNvbnN0OwotICAgIGludCBzY3JvbGxCYXJNaW5pbXVtKFF0
OjpPcmllbnRhdGlvbiBvcmllbnRhdGlvbikgY29uc3Q7Ci0gICAgaW50IHNjcm9sbEJhck1heGlt
dW0oUXQ6Ok9yaWVudGF0aW9uIG9yaWVudGF0aW9uKSBjb25zdDsKLSAgICBRUmVjdCBzY3JvbGxC
YXJHZW9tZXRyeShRdDo6T3JpZW50YXRpb24gb3JpZW50YXRpb24pIGNvbnN0OwotCi0gICAgdm9p
ZCBzY3JvbGwoaW50LCBpbnQpOwotICAgIFFQb2ludCBzY3JvbGxQb3NpdGlvbigpIGNvbnN0Owot
ICAgIHZvaWQgc2V0U2Nyb2xsUG9zaXRpb24oY29uc3QgUVBvaW50ICZwb3MpOwotCi0gICAgdm9p
ZCBzY3JvbGxUb0FuY2hvcihjb25zdCBRU3RyaW5nJiBhbmNob3IpOwotCi0gICAgZW51bSBSZW5k
ZXJMYXllciB7Ci0gICAgICAgIENvbnRlbnRzTGF5ZXIgPSAweDEwLAotICAgICAgICBTY3JvbGxC
YXJMYXllciA9IDB4MjAsCi0gICAgICAgIFBhbkljb25MYXllciA9IDB4NDAsCi0KLSAgICAgICAg
QWxsTGF5ZXJzID0gMHhmZgotICAgIH07Ci0KLSAgICB2b2lkIHJlbmRlcihRUGFpbnRlciopOwot
ICAgIHZvaWQgcmVuZGVyKFFQYWludGVyKiwgY29uc3QgUVJlZ2lvbiYgY2xpcCk7Ci0gICAgdm9p
ZCByZW5kZXIoUVBhaW50ZXIqLCBSZW5kZXJMYXllciBsYXllciwgY29uc3QgUVJlZ2lvbiYgY2xp
cCA9IFFSZWdpb24oKSk7Ci0KLSAgICB2b2lkIHNldFRleHRTaXplTXVsdGlwbGllcihxcmVhbCBm
YWN0b3IpOwotICAgIHFyZWFsIHRleHRTaXplTXVsdGlwbGllcigpIGNvbnN0OwotCi0gICAgcXJl
YWwgem9vbUZhY3RvcigpIGNvbnN0OwotICAgIHZvaWQgc2V0Wm9vbUZhY3RvcihxcmVhbCBmYWN0
b3IpOwotCi0gICAgYm9vbCBoYXNGb2N1cygpIGNvbnN0OwotICAgIHZvaWQgc2V0Rm9jdXMoKTsK
LQotICAgIFFQb2ludCBwb3MoKSBjb25zdDsKLSAgICBRUmVjdCBnZW9tZXRyeSgpIGNvbnN0Owot
ICAgIFFTaXplIGNvbnRlbnRzU2l6ZSgpIGNvbnN0OwotCi0gICAgUVdlYkVsZW1lbnQgZG9jdW1l
bnRFbGVtZW50KCkgY29uc3Q7Ci0gICAgUVdlYkVsZW1lbnRDb2xsZWN0aW9uIGZpbmRBbGxFbGVt
ZW50cyhjb25zdCBRU3RyaW5nICZzZWxlY3RvclF1ZXJ5KSBjb25zdDsKLSAgICBRV2ViRWxlbWVu
dCBmaW5kRmlyc3RFbGVtZW50KGNvbnN0IFFTdHJpbmcgJnNlbGVjdG9yUXVlcnkpIGNvbnN0Owot
Ci0gICAgUVdlYkhpdFRlc3RSZXN1bHQgaGl0VGVzdENvbnRlbnQoY29uc3QgUVBvaW50ICZwb3Mp
IGNvbnN0OwotCi0gICAgdmlydHVhbCBib29sIGV2ZW50KFFFdmVudCAqKTsKLQotICAgIFFXZWJT
ZWN1cml0eU9yaWdpbiBzZWN1cml0eU9yaWdpbigpIGNvbnN0OwotICAgIFFXZWJGcmFtZUFkYXB0
ZXIqIGhhbmRsZSgpIGNvbnN0OwotCi1wdWJsaWMgUV9TTE9UUzoKLSAgICBRVmFyaWFudCBldmFs
dWF0ZUphdmFTY3JpcHQoY29uc3QgUVN0cmluZyYgc2NyaXB0U291cmNlKTsKLSNpZm5kZWYgUVRf
Tk9fUFJJTlRFUgotICAgIHZvaWQgcHJpbnQoUVByaW50ZXIgKnByaW50ZXIpIGNvbnN0OwotI2Vu
ZGlmCi0KLVFfU0lHTkFMUzoKLSAgICB2b2lkIGphdmFTY3JpcHRXaW5kb3dPYmplY3RDbGVhcmVk
KCk7Ci0KLSAgICB2b2lkIHByb3Zpc2lvbmFsTG9hZCgpOwotICAgIHZvaWQgdGl0bGVDaGFuZ2Vk
KGNvbnN0IFFTdHJpbmcgJnRpdGxlKTsKLSAgICB2b2lkIHVybENoYW5nZWQoY29uc3QgUVVybCAm
dXJsKTsKLQotICAgIHZvaWQgaW5pdGlhbExheW91dENvbXBsZXRlZCgpOwotCi0gICAgdm9pZCBp
Y29uQ2hhbmdlZCgpOwotCi0gICAgdm9pZCBjb250ZW50c1NpemVDaGFuZ2VkKGNvbnN0IFFTaXpl
ICZzaXplKTsKLQotICAgIHZvaWQgbG9hZFN0YXJ0ZWQoKTsKLSAgICB2b2lkIGxvYWRGaW5pc2hl
ZChib29sIG9rKTsKLQotICAgIHZvaWQgcGFnZUNoYW5nZWQoKTsKLQotcHJpdmF0ZToKLSAgICBm
cmllbmQgY2xhc3MgUUdyYXBoaWNzV2ViVmlldzsKLSAgICBmcmllbmQgY2xhc3MgUVdlYlBhZ2U7
Ci0gICAgZnJpZW5kIGNsYXNzIFFXZWJQYWdlUHJpdmF0ZTsKLSAgICBmcmllbmQgY2xhc3MgUVdl
YkZyYW1lUHJpdmF0ZTsKLSAgICBmcmllbmQgY2xhc3MgRHVtcFJlbmRlclRyZWVTdXBwb3J0UXQ7
Ci0gICAgZnJpZW5kIGNsYXNzIFdlYkNvcmU6OldpZGdldFByaXZhdGU7Ci0gICAgZnJpZW5kIGNs
YXNzIFdlYkNvcmU6OkZyYW1lTG9hZGVyQ2xpZW50UXQ7Ci0gICAgZnJpZW5kIGNsYXNzIFdlYkNv
cmU6OkNocm9tZUNsaWVudFF0OwotICAgIGZyaWVuZCBjbGFzcyBXZWJDb3JlOjpUZXh0dXJlTWFw
cGVyTGF5ZXJDbGllbnRRdDsKLSAgICBRV2ViRnJhbWVQcml2YXRlICpkOwotICAgIFFfUFJJVkFU
RV9TTE9UKGQsIHZvaWQgX3Ffb3JpZW50YXRpb25DaGFuZ2VkKCkpCi19OwotCi0jZW5kaWYKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvcXQvQXBpL3F3ZWJmcmFtZV9wLmggYi9Tb3VyY2UvV2Vi
S2l0L3F0L0FwaS9xd2ViZnJhbWVfcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBk
YmRjYmM4NWE0NThiOGU5OTQ3OWE2MDk2OGE0OGE4OGM4YmU3MDE4Li4wMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvcXQvQXBpL3F3ZWJm
cmFtZV9wLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoKLSAgICBDb3B5cmln
aHQgKEMpIDIwMDggTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMp
Ci0gICAgQ29weXJpZ2h0IChDKSAyMDA3IFN0YWlrb3MgQ29tcHV0aW5nIFNlcnZpY2VzIEluYy4K
LQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGli
cmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVl
IFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5z
ZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGli
cmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAot
ICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdh
cnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vu
c2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNv
cHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3
aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0
ZSB0bwotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGlu
IFN0cmVldCwgRmlmdGggRmxvb3IsCi0gICAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCi0q
LwotCi0jaWZuZGVmIFFXRUJGUkFNRV9QX0gKLSNkZWZpbmUgUVdFQkZSQU1FX1BfSAotCi0jaW5j
bHVkZSAiUVdlYkZyYW1lQWRhcHRlci5oIgotCi0jaW5jbHVkZSAicXdlYmZyYW1lLmgiCi0jaW5j
bHVkZSAicXdlYnBhZ2VfcC5oIgotCi0jaW5jbHVkZSAiRXZlbnRIYW5kbGVyLmgiCi0jaW5jbHVk
ZSAiRnJhbWUuaCIKLSNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKLSNpbmNsdWRlICJLVVJM
LmgiCi0jaWYgRU5BQkxFKE9SSUVOVEFUSU9OX0VWRU5UUykKLSNpbmNsdWRlICJxb3JpZW50YXRp
b25zZW5zb3IuaCIKLSNlbmRpZiAvLyBFTkFCTEUoT1JJRU5UQVRJT05fRVZFTlRTKS4KLSNpbmNs
dWRlICJxd2ViZWxlbWVudC5oIgotI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKLSNp
bmNsdWRlICJ0ZXhtYXAvVGV4dHVyZU1hcHBlci5oIgotI2VuZGlmCi0jaW5jbHVkZSAiVmlld3Bv
cnRBcmd1bWVudHMuaCIKLSNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+Ci0jaW5jbHVkZSA8d3RmL3Rl
eHQvV1RGU3RyaW5nLmg+Ci0KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotICAgIGNsYXNzIEZyYW1l
TG9hZGVyQ2xpZW50UXQ7Ci0gICAgY2xhc3MgRnJhbWVWaWV3OwotICAgIGNsYXNzIEhUTUxGcmFt
ZU93bmVyRWxlbWVudDsKLSAgICBjbGFzcyBTY3JvbGxiYXI7Ci0gICAgY2xhc3MgVGV4dHVyZU1h
cHBlckxheWVyOwotfQotY2xhc3MgUVdlYlBhZ2U7Ci0KLWNsYXNzIFFXZWJGcmFtZVByaXZhdGUg
OiBwdWJsaWMgUVdlYkZyYW1lQWRhcHRlciB7Ci1wdWJsaWM6Ci0gICAgUVdlYkZyYW1lUHJpdmF0
ZSgpCi0gICAgICAgIDogcSgwKQotICAgICAgICAsIGhvcml6b250YWxTY3JvbGxCYXJQb2xpY3ko
UXQ6OlNjcm9sbEJhckFzTmVlZGVkKQotICAgICAgICAsIHZlcnRpY2FsU2Nyb2xsQmFyUG9saWN5
KFF0OjpTY3JvbGxCYXJBc05lZWRlZCkKLSAgICAgICAgLCBwYWdlKDApCi0jaWYgVVNFKEFDQ0VM
RVJBVEVEX0NPTVBPU0lUSU5HKQotICAgICAgICAsIHJvb3RUZXh0dXJlTWFwcGVyTGF5ZXIoMCkK
LSNlbmRpZgotICAgICAgICB7fQotICAgIHZvaWQgc2V0UGFnZShRV2ViUGFnZSopOwotCi0gICAg
aW5saW5lIFFXZWJGcmFtZSAqcGFyZW50RnJhbWUoKSB7IHJldHVybiBxb2JqZWN0X2Nhc3Q8UVdl
YkZyYW1lKj4ocS0+cGFyZW50KCkpOyB9Ci0KLSAgICBXZWJDb3JlOjpTY3JvbGxiYXIqIGhvcml6
b250YWxTY3JvbGxCYXIoKSBjb25zdDsKLSAgICBXZWJDb3JlOjpTY3JvbGxiYXIqIHZlcnRpY2Fs
U2Nyb2xsQmFyKCkgY29uc3Q7Ci0KLSAgICBzdGF0aWMgV2ViQ29yZTo6RnJhbWUqIGNvcmUoY29u
c3QgUVdlYkZyYW1lKik7Ci0gICAgc3RhdGljIFFXZWJGcmFtZSoga2l0KGNvbnN0IFdlYkNvcmU6
OkZyYW1lKik7Ci0gICAgc3RhdGljIFFXZWJGcmFtZSoga2l0KGNvbnN0IFFXZWJGcmFtZUFkYXB0
ZXIqKTsKLQotICAgIHZvaWQgcmVuZGVyUmVsYXRpdmVDb29yZHMoV2ViQ29yZTo6R3JhcGhpY3ND
b250ZXh0KiwgUUZsYWdzPFFXZWJGcmFtZTo6UmVuZGVyTGF5ZXI+LCBjb25zdCBRUmVnaW9uJiBj
bGlwKTsKLSNpZiBVU0UoVElMRURfQkFDS0lOR19TVE9SRSkKLSAgICB2b2lkIHJlbmRlckZyb21U
aWxlZEJhY2tpbmdTdG9yZShXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQqLCBjb25zdCBRUmVnaW9u
JiBjbGlwKTsKLSNlbmRpZgotCi0jaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQotICAg
IHZvaWQgcmVuZGVyQ29tcG9zaXRlZExheWVycyhXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQqLCBj
b25zdCBXZWJDb3JlOjpJbnRSZWN0JiBjbGlwKTsKLSNlbmRpZgotICAgIHZvaWQgcmVuZGVyRnJh
bWVFeHRyYXMoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0KiwgUUZsYWdzPFFXZWJGcmFtZTo6UmVu
ZGVyTGF5ZXI+LCBjb25zdCBRUmVnaW9uJiBjbGlwKTsKLSAgICB2b2lkIF9xX29yaWVudGF0aW9u
Q2hhbmdlZCgpOwotCi0KLSAgICAvLyBBZGFwdGVyIGltcGxlbWVudGF0aW9uCi0gICAgdmlydHVh
bCBRV2ViRnJhbWUqIGFwaUhhbmRsZSgpIE9WRVJSSURFOwotICAgIHZpcnR1YWwgUU9iamVjdCog
aGFuZGxlKCkgT1ZFUlJJREU7Ci0gICAgdmlydHVhbCB2b2lkIGNvbnRlbnRzU2l6ZURpZENoYW5n
ZShjb25zdCBRU2l6ZSAmKSBPVkVSUklERTsKLSAgICB2aXJ0dWFsIGludCBzY3JvbGxCYXJQb2xp
Y3koUXQ6Ok9yaWVudGF0aW9uKSBjb25zdCBPVkVSUklERTsKLSAgICB2aXJ0dWFsIHZvaWQgZW1p
dFVybENoYW5nZWQoKSBPVkVSUklERTsKLSAgICB2aXJ0dWFsIHZvaWQgZGlkU3RhcnRQcm92aXNp
b25hbExvYWQoKSBPVkVSUklERTsKLSAgICB2aXJ0dWFsIHZvaWQgZGlkQ2xlYXJXaW5kb3dPYmpl
Y3QoKSBPVkVSUklERTsKLSAgICB2aXJ0dWFsIGJvb2wgaGFuZGxlUHJvZ3Jlc3NGaW5pc2hlZChR
UG9pbnQqKSBPVkVSUklERTsKLSAgICB2aXJ0dWFsIHZvaWQgZW1pdEluaXRpYWxMYXlvdXRDb21w
bGV0ZWQoKSBPVkVSUklERTsKLSAgICB2aXJ0dWFsIHZvaWQgZW1pdEljb25DaGFuZ2VkKCkgT1ZF
UlJJREU7Ci0gICAgdmlydHVhbCB2b2lkIGVtaXRMb2FkU3RhcnRlZChib29sIG9yaWdpbmF0aW5n
TG9hZCkgT1ZFUlJJREU7Ci0gICAgdmlydHVhbCB2b2lkIGVtaXRMb2FkRmluaXNoZWQoYm9vbCBv
cmlnaW5hdGluZ0xvYWQsIGJvb2wgb2spIE9WRVJSSURFOwotICAgIHZpcnR1YWwgUVdlYkZyYW1l
QWRhcHRlciogY3JlYXRlQ2hpbGRGcmFtZShRV2ViRnJhbWVEYXRhKikgT1ZFUlJJREU7Ci0KLSAg
ICBRV2ViRnJhbWUgKnE7Ci0gICAgUXQ6OlNjcm9sbEJhclBvbGljeSBob3Jpem9udGFsU2Nyb2xs
QmFyUG9saWN5OwotICAgIFF0OjpTY3JvbGxCYXJQb2xpY3kgdmVydGljYWxTY3JvbGxCYXJQb2xp
Y3k7Ci0gICAgUVdlYlBhZ2UgKnBhZ2U7Ci0KLSNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJ
TkcpCi0gICAgV2ViQ29yZTo6VGV4dHVyZU1hcHBlckxheWVyKiByb290VGV4dHVyZU1hcHBlckxh
eWVyOwotICAgIE93blB0cjxXZWJDb3JlOjpUZXh0dXJlTWFwcGVyPiB0ZXh0dXJlTWFwcGVyOwot
I2VuZGlmCi0KLSNpZiBFTkFCTEUoT1JJRU5UQVRJT05fRVZFTlRTKQotICAgIFFPcmllbnRhdGlv
blNlbnNvciBtX29yaWVudGF0aW9uOwotI2VuZGlmIC8vIEVOQUJMRShPUklFTlRBVElPTl9FVkVO
VFMpLgotfTsKLQotY2xhc3MgUVdlYkhpdFRlc3RSZXN1bHRQcml2YXRlIHsKLXB1YmxpYzoKLSAg
ICBRV2ViSGl0VGVzdFJlc3VsdFByaXZhdGUoKSA6IGlzQ29udGVudEVkaXRhYmxlKGZhbHNlKSwg
aXNDb250ZW50U2VsZWN0ZWQoZmFsc2UpLCBpc1Njcm9sbEJhcihmYWxzZSkge30KLSAgICBRV2Vi
SGl0VGVzdFJlc3VsdFByaXZhdGUoY29uc3QgV2ViQ29yZTo6SGl0VGVzdFJlc3VsdCAmaGl0VGVz
dCk7Ci0KLSAgICBRUG9pbnQgcG9zOwotICAgIFFSZWN0IGJvdW5kaW5nUmVjdDsKLSAgICBRV2Vi
RWxlbWVudCBlbmNsb3NpbmdCbG9jazsKLSAgICBRU3RyaW5nIHRpdGxlOwotICAgIFFTdHJpbmcg
bGlua1RleHQ7Ci0gICAgUVVybCBsaW5rVXJsOwotICAgIFFTdHJpbmcgbGlua1RpdGxlOwotICAg
IFFQb2ludGVyPFFXZWJGcmFtZT4gbGlua1RhcmdldEZyYW1lOwotICAgIFFXZWJFbGVtZW50IGxp
bmtFbGVtZW50OwotICAgIFFTdHJpbmcgYWx0ZXJuYXRlVGV4dDsKLSAgICBRVXJsIGltYWdlVXJs
OwotICAgIFFQaXhtYXAgcGl4bWFwOwotICAgIGJvb2wgaXNDb250ZW50RWRpdGFibGU7Ci0gICAg
Ym9vbCBpc0NvbnRlbnRTZWxlY3RlZDsKLSAgICBib29sIGlzU2Nyb2xsQmFyOwotICAgIFFQb2lu
dGVyPFFXZWJGcmFtZT4gZnJhbWU7Ci0gICAgUmVmUHRyPFdlYkNvcmU6Ok5vZGU+IGlubmVyTm9k
ZTsKLSAgICBSZWZQdHI8V2ViQ29yZTo6Tm9kZT4gaW5uZXJOb25TaGFyZWROb2RlOwotfTsKLQot
I2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0L0FwaS9xd2ViaGlzdG9yeS5oIGIv
U291cmNlL1dlYktpdC9xdC9BcGkvcXdlYmhpc3RvcnkuaAppbmRleCA3NTNlYjYzNzZkZDViZGFm
MGZjNzI2MWUxNzU0MzU2NzBlMjdjOWUyLi4wOTJmNDI1ZWU2YTZmZjMwYTk3MDA4YjdlMTIwMDc3
YjJlODA1NWE2IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L3F0L0FwaS9xd2ViaGlzdG9yeS5o
CisrKyBiL1NvdXJjZS9XZWJLaXQvcXQvQXBpL3F3ZWJoaXN0b3J5LmgKQEAgLTEwMSw3ICsxMDEs
NyBAQCBwcml2YXRlOgogICAgIH5RV2ViSGlzdG9yeSgpOwogCiAgICAgZnJpZW5kIGNsYXNzIFFX
ZWJQYWdlOwotICAgIGZyaWVuZCBjbGFzcyBRV2ViUGFnZVByaXZhdGU7CisgICAgZnJpZW5kIGNs
YXNzIFFXZWJQYWdlQWRhcHRlcjsKICAgICBmcmllbmQgUVdFQktJVF9FWFBPUlQgUURhdGFTdHJl
YW0mIG9wZXJhdG9yPj4oUURhdGFTdHJlYW0mLCBRV2ViSGlzdG9yeSYpOwogICAgIGZyaWVuZCBR
V0VCS0lUX0VYUE9SVCBRRGF0YVN0cmVhbSYgb3BlcmF0b3I8PChRRGF0YVN0cmVhbSYsIGNvbnN0
IFFXZWJIaXN0b3J5Jik7CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvcXQvQXBpL3F3ZWJp
bnNwZWN0b3IuY3BwIGIvU291cmNlL1dlYktpdC9xdC9BcGkvcXdlYmluc3BlY3Rvci5jcHAKZGVs
ZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MDg5ZTFhMWZjZWU4Y2RlOTQzOWJkOTUyY2Ni
YzViMzMxNmVmOTAuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0t
IGEvU291cmNlL1dlYktpdC9xdC9BcGkvcXdlYmluc3BlY3Rvci5jcHAKKysrIC9kZXYvbnVsbApA
QCAtMSwyMDYgKzAsMCBAQAotLyoKLSAgICBDb3B5cmlnaHQgKEMpIDIwMDkgTm9raWEgQ29ycG9y
YXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMg
ZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5
IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAg
ICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBl
aXRoZXIKLSAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikg
YW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4g
dGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FS
UkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5U
QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05V
Ci0gICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0K
LSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0
aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KLSAgICB0aGUgRnJlZSBTb2Z0
d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAot
ICAgIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgotKi8KLQotI2luY2x1ZGUgImNvbmZpZy5o
IgotI2luY2x1ZGUgInF3ZWJpbnNwZWN0b3IuaCIKLQotI2luY2x1ZGUgIkVsZW1lbnQuaCIKLSNp
bmNsdWRlICJJbnNwZWN0b3JDb250cm9sbGVyLmgiCi0jaW5jbHVkZSAicXdlYmVsZW1lbnQuaCIK
LSNpbmNsdWRlICJxd2ViaW5zcGVjdG9yX3AuaCIKLSNpbmNsdWRlICJxd2VicGFnZV9wLmgiCi0K
LSNpbmNsdWRlIDxRUmVzaXplRXZlbnQ+Ci0KLS8qIQotICAgIFxjbGFzcyBRV2ViSW5zcGVjdG9y
Ci0gICAgXHNpbmNlIDQuNgotICAgIFxpbm1vZHVsZSBRdFdlYktpdAotICAgIFxicmllZiBUaGUg
UVdlYkluc3BlY3RvciBjbGFzcyBhbGxvd3MgdGhlIHBsYWNlbWVudCBhbmQgY29udHJvbCBvZiBh
Ci0gICAgUVdlYlBhZ2UncyBpbnNwZWN0b3IuCi0gICAgVGhlIGluc3BlY3RvciBjYW4gZGlzcGxh
eSBhIHBhZ2UncyBoaWVyYXJjaHksIGl0cyBsb2FkaW5nIHN0YXRpc3RpY3MgYW5kCi0gICAgdGhl
IGN1cnJlbnQgc3RhdGUgb2YgaXRzIGluZGl2aWR1YWwgZWxlbWVudHMuIEl0IGlzIG1vc3RseSB1
c2VkIGJ5IHdlYgotICAgIGRldmVsb3BlcnMuCi0KLSAgICBUaGUgUVdlYlBhZ2UgdG8gYmUgaW5z
cGVjdGVkIG11c3QgYmUgc3BlY2lmaWVkIHVzaW5nIHRoZSBzZXRQYWdlKCkgbWV0aG9kLgotCi0g
ICAgQSB0eXBpY2FsIHVzZSBvZiBRV2ViSW5zcGVjdG9yIGZvbGxvd3M6Ci0KLSAgICBcc25pcHBl
dCB3ZWJraXRzbmlwcGV0cy9xdHdlYmtpdF9xd2ViaW5zcGVjdG9yX3NuaXBwZXQuY3BwIDAKLQot
ICAgIEEgUVdlYkluc3BlY3RvciBjYW4gYmUgbWFkZSB2aXNpYmxlIGVpdGhlciBwcm9ncmFtbWF0
aWNhbGx5IHVzaW5nCi0gICAgc2V0VmlzaWJsZSgpLCBvciBieSB0aGUgdXNlciB0aHJvdWdoIHRo
ZSBhdHRhY2hlZCBRV2ViUGFnZSdzIGNvbnRleHQKLSAgICBtZW51LgotCi0gICAgXG5vdGUgQSBR
V2ViSW5zcGVjdG9yIHdpbGwgZGlzcGxheSBhIGJsYW5rIHdpZGdldCBpZiBlaXRoZXI6Ci0gICAg
XGxpc3QKLSAgICAgICAgXGxpIHBhZ2UoKSBpcyBudWxsCi0gICAgICAgIFxsaSBRV2ViU2V0dGlu
Z3M6OkRldmVsb3BlckV4dHJhc0VuYWJsZWQgaXMgZmFsc2UKLSAgICBcZW5kbGlzdAotCi0gICAg
XHNlY3Rpb24xIFJlc291cmNlcwotCi0gICAgVGhpcyBjbGFzcyBhY3RzIG1vc3RseSBhcyBhIGNv
bnRhaW5lciBhbmQgYSBjb250cm9sbGVyIGZvciB0aGUgaW5zcGVjdG9yLgotICAgIE1vc3Qgb2Yg
dGhlIHJlc291cmNlcyBuZWVkZWQgYnkgdGhlIGluc3BlY3RvciBhcmUgb3duZWQgYnkgdGhlIGFz
c29jaWF0ZWQKLSAgICBRV2ViUGFnZSBhbmQgYXJlIGFsbG9jYXRlZCB0aGUgZmlyc3QgdGltZSB0
aGF0OgotICAgIFxsaXN0Ci0gICAgICAgIFxsaSBhbiBlbGVtZW50IGlzIGluc3BlY3RlZAotICAg
ICAgICBcbGkgdGhlIFFXZWJJbnNwZWN0b3IgaXMgc2hvd24uCi0gICAgXGVuZGxpc3QKLQotICAg
IFxzZWN0aW9uMSBJbnNwZWN0b3IgY29uZmlndXJhdGlvbiBwZXJzaXN0ZW5jZQotCi0gICAgVGhl
IGluc3BlY3RvciBhbGxvd3MgdGhlIHVzZXIgdG8gY29uZmlndXJlIHNvbWUgb3B0aW9ucyB0aHJv
dWdoIGl0cwotICAgIHVzZXIgaW50ZXJmYWNlIChlLmcuIHRoZSByZXNvdXJjZSB0cmFja2luZyAi
QWx3YXlzIGVuYWJsZSIgb3B0aW9uKS4KLSAgICBUaGVzZSBzZXR0aW5ncyB3aWxsIGJlIHBlcnNp
c3RlZCBhdXRvbWF0aWNhbGx5IGJ5IFF0V2ViS2l0IG9ubHkgaWYKLSAgICB5b3VyIGFwcGxpY2F0
aW9uIHByZXZpb3VzbHkgY2FsbGVkIFFDb3JlQXBwbGljYXRpb246OnNldE9yZ2FuaXphdGlvbk5h
bWUoKQotICAgIGFuZCBRQ29yZUFwcGxpY2F0aW9uOjpzZXRBcHBsaWNhdGlvbk5hbWUoKS4KLSAg
ICBTZWUgUVNldHRpbmdzJ3MgZGVmYXVsdCBjb25zdHJ1Y3RvciBkb2N1bWVudGF0aW9uIGZvciBh
biBleHBsYW5hdGlvbgotICAgIG9mIHdoeSB0aGlzIGlzIG5lY2Vzc2FyeS4KLSovCi0KLS8qIQot
ICAgIENvbnN0cnVjdHMgYW4gdW5ib3VuZCBRV2ViSW5zcGVjdG9yIHdpdGggXGEgcGFyZW50IGFz
IGl0cyBwYXJlbnQuCi0qLwotUVdlYkluc3BlY3Rvcjo6UVdlYkluc3BlY3RvcihRV2lkZ2V0KiBw
YXJlbnQpCi0gICAgOiBRV2lkZ2V0KHBhcmVudCkKLSAgICAsIGQobmV3IFFXZWJJbnNwZWN0b3JQ
cml2YXRlKHRoaXMpKQotewotfQotCi0vKiEKLSAgICBEZXN0cm95cyB0aGUgaW5zcGVjdG9yLgot
Ki8KLVFXZWJJbnNwZWN0b3I6On5RV2ViSW5zcGVjdG9yKCkKLXsKLSAgICAvLyBSZW1vdmUgYXNz
b2NpYXRpb24gcHJpbmNpcGFsbHkgdG8gcHJldmVudCBkZWxldGluZyBhIGNoaWxkIGZyb250ZW5k
Ci0gICAgc2V0UGFnZSgwKTsKLSAgICBkZWxldGUgZDsKLSAgICBkID0gMDsKLX0KLQotLyohCi0g
ICAgQmluZCB0aGlzIGluc3BlY3RvciB0byB0aGUgUVdlYlBhZ2UgdG8gYmUgaW5zcGVjdGVkLgot
Ci0gICAgXGIge05vdGVzOn0KLSAgICBcbGlzdAotICAgICAgICBcbGkgVGhlcmUgY2FuIG9ubHkg
YmUgb25lIFFXZWJJbnNwZWN0b3IgYXNzb2NpYXRlZCB3aXRoIGEgUVdlYlBhZ2UKLSAgICAgICAg
ICAgYW5kIHZpY2UgdmVyc2EuCi0gICAgICAgIFxsaSBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpdGgg
YSBudWxsIFxhIHBhZ2Ugd2lsbCBicmVhayB0aGUgY3VycmVudCBhc3NvY2lhdGlvbiwgaWYgYW55
LgotICAgICAgICBcbGkgSWYgXGEgcGFnZSBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgdG8gYW5vdGhl
ciBRV2ViSW5zcGVjdG9yLCB0aGUgYXNzb2NpYXRpb24KLSAgICAgICAgICAgd2lsbCBiZSByZXBs
YWNlZCBhbmQgdGhlIHByZXZpb3VzIFFXZWJJbnNwZWN0b3Igd2lsbCBiZWNvbWUgdW5ib3VuZAot
ICAgIFxlbmRsaXN0Ci0KLSAgICBcc2EgcGFnZSgpCi0qLwotdm9pZCBRV2ViSW5zcGVjdG9yOjpz
ZXRQYWdlKFFXZWJQYWdlKiBwYWdlKQotewotICAgIGlmIChkLT5wYWdlKSB7Ci0gICAgICAgIC8v
IEJyZWFrIGN1cnJlbnRQYWdlLS0+dGhpcwotICAgICAgICBkLT5wYWdlLT5kLT5zZXRJbnNwZWN0
b3IoMCk7Ci0gICAgfQotICAgIGlmIChwYWdlICYmIHBhZ2UtPmQtPmluc3BlY3RvciAmJiBwYWdl
LT5kLT5pbnNwZWN0b3IgIT0gdGhpcykgewotICAgICAgICAvLyBCcmVhayBuZXdQYWdlPC0+bmV3
UGFnZUN1cnJlbnRJbnNwZWN0b3IKLSAgICAgICAgcGFnZS0+ZC0+aW5zcGVjdG9yLT5zZXRQYWdl
KDApOwotICAgIH0KLQotICAgIGQtPnBhZ2UgPSBwYWdlOwotCi0gICAgaWYgKHBhZ2UpIHsKLSAg
ICAgICAgLy8gU2V0dXAgdGhlIHJlY2lwcm9jYWwgYXNzb2NpYXRpb24KLSAgICAgICAgcGFnZS0+
ZC0+c2V0SW5zcGVjdG9yKHRoaXMpOwotICAgIH0KLX0KLQotLyohCi0gICAgUmV0dXJucyB0aGUg
aW5zcGVjdGVkIFFXZWJQYWdlLgotICAgIElmIG5vIHdlYiBwYWdlIGlzIGN1cnJlbnRseSBhc3Nv
Y2lhdGVkLCBhIG51bGwgcG9pbnRlciBpcyByZXR1cm5lZC4KLSovCi1RV2ViUGFnZSogUVdlYklu
c3BlY3Rvcjo6cGFnZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGQtPnBhZ2U7Ci19Ci0KLS8qISBc
cmVpbXAgKi8KLVFTaXplIFFXZWJJbnNwZWN0b3I6OnNpemVIaW50KCkgY29uc3QKLXsKLSAgICBy
ZXR1cm4gUVNpemUoNDUwLCAzMDApOwotfQotCi0vKiEgXHJlaW1wICovCi1ib29sIFFXZWJJbnNw
ZWN0b3I6OmV2ZW50KFFFdmVudCogZXYpCi17Ci0gICAgcmV0dXJuIFFXaWRnZXQ6OmV2ZW50KGV2
KTsKLX0KLQotLyohIFxyZWltcCAqLwotdm9pZCBRV2ViSW5zcGVjdG9yOjpyZXNpemVFdmVudChR
UmVzaXplRXZlbnQqIGV2ZW50KQotewotICAgIGQtPmFkanVzdEZyb250ZW5kU2l6ZShldmVudC0+
c2l6ZSgpKTsKLX0KLQotLyohIFxyZWltcCAqLwotdm9pZCBRV2ViSW5zcGVjdG9yOjpzaG93RXZl
bnQoUVNob3dFdmVudCogZXZlbnQpCi17Ci0jaWYgRU5BQkxFKElOU1BFQ1RPUikKLSAgICAvLyBB
bGxvd3MgUVdlYkluc3BlY3Rvcjo6c2hvdygpIHRvIGluaXQgdGhlIGluc3BlY3Rvci4KLSAgICBp
ZiAoZC0+cGFnZSkKLSAgICAgICAgZC0+cGFnZS0+ZC0+aW5zcGVjdG9yQ29udHJvbGxlcigpLT5z
aG93KCk7Ci0jZW5kaWYKLX0KLQotLyohIFxyZWltcCAqLwotdm9pZCBRV2ViSW5zcGVjdG9yOjpo
aWRlRXZlbnQoUUhpZGVFdmVudCogZXZlbnQpCi17Ci0jaWYgRU5BQkxFKElOU1BFQ1RPUikKLSAg
ICBpZiAoZC0+cGFnZSkKLSAgICAgICAgZC0+cGFnZS0+ZC0+aW5zcGVjdG9yQ29udHJvbGxlcigp
LT5jbG9zZSgpOwotI2VuZGlmCi19Ci0KLS8qISBccmVpbXAgKi8KLXZvaWQgUVdlYkluc3BlY3Rv
cjo6Y2xvc2VFdmVudChRQ2xvc2VFdmVudCogZXZlbnQpCi17Ci0jaWYgRU5BQkxFKElOU1BFQ1RP
UikKLSAgICBpZiAoZC0+cGFnZSkKLSAgICAgICAgZC0+cGFnZS0+ZC0+aW5zcGVjdG9yQ29udHJv
bGxlcigpLT5jbG9zZSgpOwotI2VuZGlmCi19Ci0KLS8qISBcaW50ZXJuYWwgKi8KLXZvaWQgUVdl
Ykluc3BlY3RvclByaXZhdGU6OnNldEZyb250ZW5kKFFPYmplY3QqIG5ld0Zyb250ZW5kKQotewot
ICAgIGlmIChmcm9udGVuZCkKLSAgICAgICAgZnJvbnRlbmQtPnNldFBhcmVudCgwKTsKLQotICAg
IGZyb250ZW5kID0gcW9iamVjdF9jYXN0PFFXaWRnZXQqPihuZXdGcm9udGVuZCk7Ci0KLSAgICBp
ZiAoZnJvbnRlbmQpIHsKLSAgICAgICAgZnJvbnRlbmQtPnNldFBhcmVudChxKTsKLSAgICAgICAg
ZnJvbnRlbmQtPnNob3coKTsKLSAgICAgICAgYWRqdXN0RnJvbnRlbmRTaXplKHEtPnNpemUoKSk7
Ci0gICAgfQotfQotCi12b2lkIFFXZWJJbnNwZWN0b3JQcml2YXRlOjphZGp1c3RGcm9udGVuZFNp
emUoY29uc3QgUVNpemUmIHNpemUpCi17Ci0gICAgaWYgKGZyb250ZW5kKQotICAgICAgICBmcm9u
dGVuZC0+cmVzaXplKHNpemUpOwotfQotCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0L0Fw
aS9xd2ViaW5zcGVjdG9yLmggYi9Tb3VyY2UvV2ViS2l0L3F0L0FwaS9xd2ViaW5zcGVjdG9yLmgK
ZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxOTJlOTIxYjYzOWM4YzdmY2I1ZmJkMTZi
OGViNTYzYWExNzM0ZWQuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAK
LS0tIGEvU291cmNlL1dlYktpdC9xdC9BcGkvcXdlYmluc3BlY3Rvci5oCisrKyAvZGV2L251bGwK
QEAgLTEsNTcgKzAsMCBAQAotLyoKLSAgICBDb3B5cmlnaHQgKEMpIDIwMDkgTm9raWEgQ29ycG9y
YXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMg
ZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5
IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAg
ICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBl
aXRoZXIKLSAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikg
YW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4g
dGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FS
UkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5U
QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05V
Ci0gICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0K
LSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0
aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KLSAgICB0aGUgRnJlZSBTb2Z0
d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAot
ICAgIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgotKi8KLQotI2lmbmRlZiBRV0VCSU5TUEVD
VE9SX0gKLSNkZWZpbmUgUVdFQklOU1BFQ1RPUl9ICi0KLSNpbmNsdWRlICJxd2Via2l0Z2xvYmFs
LmgiCi0jaW5jbHVkZSAicXdlYnBhZ2UuaCIKLQotI2luY2x1ZGUgInF3ZWJ2aWV3LmgiCi0KLWNs
YXNzIFFXZWJJbnNwZWN0b3JQcml2YXRlOwotCi1jbGFzcyBRV0VCS0lUX0VYUE9SVCBRV2ViSW5z
cGVjdG9yIDogcHVibGljIFFXaWRnZXQgewotICAgIFFfT0JKRUNUCi1wdWJsaWM6Ci0gICAgUVdl
Ykluc3BlY3RvcihRV2lkZ2V0KiBwYXJlbnQgPSAwKTsKLSAgICB+UVdlYkluc3BlY3RvcigpOwot
Ci0gICAgdm9pZCBzZXRQYWdlKFFXZWJQYWdlKiBwYWdlKTsKLSAgICBRV2ViUGFnZSogcGFnZSgp
IGNvbnN0OwotCi0gICAgUVNpemUgc2l6ZUhpbnQoKSBjb25zdDsKLSAgICBib29sIGV2ZW50KFFF
dmVudCopOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdm9pZCByZXNpemVFdmVudChRUmVzaXplRXZlbnQq
IGV2ZW50KTsKLSAgICB2b2lkIHNob3dFdmVudChRU2hvd0V2ZW50KiBldmVudCk7Ci0gICAgdm9p
ZCBoaWRlRXZlbnQoUUhpZGVFdmVudCogZXZlbnQpOwotICAgIHZvaWQgY2xvc2VFdmVudChRQ2xv
c2VFdmVudCogZXZlbnQpOwotCi1wcml2YXRlOgotICAgIFFXZWJJbnNwZWN0b3JQcml2YXRlKiBk
OwotCi0gICAgZnJpZW5kIGNsYXNzIFFXZWJJbnNwZWN0b3JQcml2YXRlOwotICAgIGZyaWVuZCBj
bGFzcyBRV2ViUGFnZTsKLSAgICBmcmllbmQgY2xhc3MgUVdlYlBhZ2VQcml2YXRlOwotICAgIGZy
aWVuZCBjbGFzcyBXZWJDb3JlOjpJbnNwZWN0b3JDbGllbnRRdDsKLSAgICBmcmllbmQgY2xhc3Mg
V2ViQ29yZTo6SW5zcGVjdG9yRnJvbnRlbmRDbGllbnRRdDsKLX07Ci0jZW5kaWYKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJLaXQvcXQvQXBpL3F3ZWJpbnNwZWN0b3JfcC5oIGIvU291cmNlL1dlYktp
dC9xdC9BcGkvcXdlYmluc3BlY3Rvcl9wLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDkwOGRlODRlZGMxZDlhYjdhMDcxMThkZGRiNTkyZjRhZTFiZjI2ZDYuLjAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYktpdC9xdC9BcGkvcXdl
Ymluc3BlY3Rvcl9wLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICAgIENv
cHlyaWdodCAoQykgMjAwOCwgMjAwOSBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNp
ZGlhcnkoLWllcykKLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2Fu
IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9m
IHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVk
IGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBv
ZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQot
ICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwg
YmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRo
ZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwg
UHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSBy
ZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UK
LSAgICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAg
SWYgbm90LCB3cml0ZSB0bwotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4s
IDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCi0gICAgQm9zdG9uLCBNQSAwMjExMC0x
MzAxLCBVU0EuCi0qLwotCi0jaWZuZGVmIFFXRUJJTlNQRUNUT1JfUF9ICi0jZGVmaW5lIFFXRUJJ
TlNQRUNUT1JfUF9ICi0KLVFUX0JFR0lOX05BTUVTUEFDRQotY2xhc3MgUVNpemU7Ci1jbGFzcyBR
V2lkZ2V0OwotUVRfRU5EX05BTUVTUEFDRQotY2xhc3MgUVdlYkluc3BlY3RvcjsKLWNsYXNzIFFX
ZWJQYWdlOwotCi1jbGFzcyBRV2ViSW5zcGVjdG9yUHJpdmF0ZSB7Ci1wdWJsaWM6Ci0gICAgUVdl
Ykluc3BlY3RvclByaXZhdGUoUVdlYkluc3BlY3RvciogcXEpCi0gICAgOiBxKHFxKQotICAgICwg
cGFnZSgwKQotICAgICwgZnJvbnRlbmQoMCkKLSAgICB7fQotCi0gICAgdm9pZCBzZXRGcm9udGVu
ZChRT2JqZWN0KiBuZXdGcm9udGVuZCk7Ci0gICAgdm9pZCBhZGp1c3RGcm9udGVuZFNpemUoY29u
c3QgUVNpemUmIHNpemUpOwotCi0gICAgUVdlYkluc3BlY3RvciogcTsKLSAgICBRV2ViUGFnZSog
cGFnZTsKLSAgICBRV2lkZ2V0KiBmcm9udGVuZDsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYktpdC9xdC9BcGkvcXdlYnBhZ2UuY3BwIGIvU291cmNlL1dlYktpdC9xdC9BcGkv
cXdlYnBhZ2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTYyNGQxOTBjNmRk
YzJhNDgwZTg2YzE2NTUyOTllY2EzYmQ0YTM0Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvcXQvQXBpL3F3ZWJwYWdlLmNwcAorKysg
L2Rldi9udWxsCkBAIC0xLDQ0NzYgKzAsMCBAQAotLyoKLSAgICBDb3B5cmlnaHQgKEMpIDIwMDgs
IDIwMDksIDIwMTIgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMp
Ci0gICAgQ29weXJpZ2h0IChDKSAyMDA3IFN0YWlrb3MgQ29tcHV0aW5nIFNlcnZpY2VzIEluYy4K
LSAgICBDb3B5cmlnaHQgKEMpIDIwMDcgQXBwbGUgSW5jLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlz
IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlm
eSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0g
ICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsg
ZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24p
IGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGlu
IHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdB
UlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFO
VEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdO
VQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgot
Ci0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUg
dGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCi0gICAgdGhlIEZyZWUgU29m
dHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwK
LSAgICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KLSovCi0KLSNpbmNsdWRlICJjb25maWcu
aCIKLSNpbmNsdWRlICJxd2VicGFnZS5oIgotCi0jaW5jbHVkZSAiQ1NTQ29tcHV0ZWRTdHlsZURl
Y2xhcmF0aW9uLmgiCi0jaW5jbHVkZSAiQ1NTUGFyc2VyLmgiCi0jaW5jbHVkZSAiQXBwbGljYXRp
b25DYWNoZVN0b3JhZ2UuaCIKLSNpbmNsdWRlICJCYWNrRm9yd2FyZExpc3RJbXBsLmgiCi0jaW5j
bHVkZSAiTWVtb3J5Q2FjaGUuaCIKLSNpbmNsdWRlICJDaHJvbWUuaCIKLSNpbmNsdWRlICJDaHJv
bWVDbGllbnRRdC5oIgotI2luY2x1ZGUgIkNsaWVudFJlY3QuaCIKLSNpbmNsdWRlICJDb250ZXh0
TWVudS5oIgotI2luY2x1ZGUgIkNvbnRleHRNZW51Q2xpZW50UXQuaCIKLSNpbmNsdWRlICJDb250
ZXh0TWVudUNvbnRyb2xsZXIuaCIKLSNpZiBVU0UoUVRfTVVMVElNRURJQSkKLSNpbmNsdWRlICJE
ZWZhdWx0RnVsbFNjcmVlblZpZGVvSGFuZGxlci5oIgotI2VuZGlmCi0jaWYgRU5BQkxFKERFVklD
RV9PUklFTlRBVElPTikKLSNpbmNsdWRlICJEZXZpY2VNb3Rpb25DbGllbnRRdC5oIgotI2luY2x1
ZGUgIkRldmljZU9yaWVudGF0aW9uQ2xpZW50TW9jay5oIgotI2luY2x1ZGUgIkRldmljZU9yaWVu
dGF0aW9uQ2xpZW50UXQuaCIKLSNlbmRpZgotI2luY2x1ZGUgIkRvY3VtZW50TG9hZGVyLmgiCi0j
aW5jbHVkZSAiRHJhZ0NsaWVudFF0LmgiCi0jaW5jbHVkZSAiRHJhZ0NvbnRyb2xsZXIuaCIKLSNp
bmNsdWRlICJEcmFnRGF0YS5oIgotI2luY2x1ZGUgIkRyYWdTZXNzaW9uLmgiCi0jaW5jbHVkZSAi
RWRpdG9yLmgiCi0jaW5jbHVkZSAiRWRpdG9yQ2xpZW50UXQuaCIKLSNpbmNsdWRlICJGb2N1c0Nv
bnRyb2xsZXIuaCIKLSNpbmNsdWRlICJGb3JtU3RhdGUuaCIKLSNpbmNsdWRlICJGcmFtZS5oIgot
I2luY2x1ZGUgIkZyYW1lTG9hZFJlcXVlc3QuaCIKLSNpbmNsdWRlICJGcmFtZUxvYWRlci5oIgot
I2luY2x1ZGUgIkZyYW1lTG9hZGVyQ2xpZW50UXQuaCIKLSNpbmNsdWRlICJGcmFtZVRyZWUuaCIK
LSNpbmNsdWRlICJGcmFtZVZpZXcuaCIKLSNpZiBFTkFCTEUoR0VPTE9DQVRJT04pCi0jaW5jbHVk
ZSAiR2VvbG9jYXRpb25DbGllbnRNb2NrLmgiCi0jaW5jbHVkZSAiR2VvbG9jYXRpb25DbGllbnRR
dC5oIgotI2luY2x1ZGUgIkdlb2xvY2F0aW9uQ29udHJvbGxlci5oIgotI2VuZGlmCi0jaW5jbHVk
ZSAiR2VvbG9jYXRpb25QZXJtaXNzaW9uQ2xpZW50UXQuaCIKLSNpbmNsdWRlICJIVE1MRm9ybUVs
ZW1lbnQuaCIKLSNpbmNsdWRlICJIVE1MRnJhbWVPd25lckVsZW1lbnQuaCIKLSNpbmNsdWRlICJI
VE1MSW5wdXRFbGVtZW50LmgiCi0jaW5jbHVkZSAiSFRNTE5hbWVzLmgiCi0jaW5jbHVkZSAiSGl0
VGVzdFJlc3VsdC5oIgotI2luY2x1ZGUgIkltYWdlLmgiCi0jaW5jbHVkZSAiSW5pdFdlYkNvcmVR
dC5oIgotI2luY2x1ZGUgIkluaXRXZWJLaXRRdC5oIgotI2luY2x1ZGUgIkluc3BlY3RvckNsaWVu
dFF0LmgiCi0jaW5jbHVkZSAiSW5zcGVjdG9yQ2xpZW50V2ViUGFnZS5oIgotI2luY2x1ZGUgIklu
c3BlY3RvckNvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJJbnNwZWN0b3JTZXJ2ZXJRdC5oIgotI2lu
Y2x1ZGUgIktVUkwuaCIKLSNpbmNsdWRlICJMb2NhbGl6ZWRTdHJpbmdzLmgiCi0jaW5jbHVkZSAi
TUlNRVR5cGVSZWdpc3RyeS5oIgotI2luY2x1ZGUgIk5hdmlnYXRpb25BY3Rpb24uaCIKLSNpbmNs
dWRlICJOZXR3b3JraW5nQ29udGV4dC5oIgotI2luY2x1ZGUgIk5vZGVMaXN0LmgiCi0jaW5jbHVk
ZSAiTm90SW1wbGVtZW50ZWQuaCIKLSNpbmNsdWRlICJOb3RpZmljYXRpb25QcmVzZW50ZXJDbGll
bnRRdC5oIgotI2luY2x1ZGUgIlBhZ2UuaCIKLSNpbmNsdWRlICJQYWdlQ2xpZW50UXQuaCIKLSNp
bmNsdWRlICJQYWdlR3JvdXAuaCIKLSNpbmNsdWRlICJQYXN0ZWJvYXJkLmgiCi0jaW5jbHVkZSAi
UGxhdGZvcm1LZXlib2FyZEV2ZW50LmgiCi0jaW5jbHVkZSAiUGxhdGZvcm1Ub3VjaEV2ZW50Lmgi
Ci0jaW5jbHVkZSAiUGxhdGZvcm1XaGVlbEV2ZW50LmgiCi0jaW5jbHVkZSAiUGx1Z2luRGF0YWJh
c2UuaCIKLSNpbmNsdWRlICJQbHVnaW5QYWNrYWdlLmgiCi0jaW5jbHVkZSAiUHJvZ3Jlc3NUcmFj
a2VyLmgiCi0jaW5jbHVkZSAiUUdyYXBoaWNzV2lkZ2V0UGx1Z2luSW1wbC5oIgotI2luY2x1ZGUg
IlFXZWJVbmRvQ29tbWFuZC5oIgotI2luY2x1ZGUgIlFXaWRnZXRQbHVnaW5JbXBsLmgiCi0jaW5j
bHVkZSAiUXRGYWxsYmFja1dlYlBvcHVwLmgiCi0jaW5jbHVkZSAiUXRQbGF0Zm9ybVBsdWdpbi5o
IgotI2luY2x1ZGUgIlJlbmRlclRleHRDb250cm9sLmgiCi0jaW5jbHVkZSAiUmVuZGVyVGhlbWVR
dC5oIgotI2luY2x1ZGUgIlNjaGVtZVJlZ2lzdHJ5LmgiCi0jaW5jbHVkZSAiU2Nyb2xsYmFyLmgi
Ci0jaW5jbHVkZSAiU2Nyb2xsYmFyVGhlbWUuaCIKLSNpbmNsdWRlICJTZWN1cml0eU9yaWdpbi5o
IgotI2luY2x1ZGUgIlNldHRpbmdzLmgiCi0jaWYgZGVmaW5lZCBRX09TX1dJTjMyCi0jaW5jbHVk
ZSAiU3lzdGVtSW5mby5oIgotI2VuZGlmIC8vIFFfT1NfV0lOMzIKLSNpbmNsdWRlICJUZXh0SXRl
cmF0b3IuaCIKLSNpbmNsdWRlICJVbmRvU3RlcFF0LmgiCi0jaW5jbHVkZSAiVXNlckFnZW50UXQu
aCIKLSNpbmNsdWRlICJXZWJFdmVudENvbnZlcnNpb24uaCIKLSNpbmNsdWRlICJXZWJLaXRWZXJz
aW9uLmgiCi0jaW5jbHVkZSAiV2luZG93RmVhdHVyZXMuaCIKLSNpbmNsdWRlICJXb3JrZXJUaHJl
YWQuaCIKLQotI2luY2x1ZGUgInF3ZWJmcmFtZS5oIgotI2luY2x1ZGUgInF3ZWJmcmFtZV9wLmgi
Ci0jaW5jbHVkZSAicXdlYmhpc3RvcnkuaCIKLSNpbmNsdWRlICJxd2ViaGlzdG9yeV9wLmgiCi0j
aW5jbHVkZSAicXdlYmluc3BlY3Rvci5oIgotI2luY2x1ZGUgInF3ZWJpbnNwZWN0b3JfcC5oIgot
I2luY2x1ZGUgInF3ZWJraXRwbGF0Zm9ybXBsdWdpbi5oIgotI2luY2x1ZGUgInF3ZWJraXR2ZXJz
aW9uLmgiCi0jaW5jbHVkZSAicXdlYnBhZ2VfcC5oIgotI2luY2x1ZGUgInF3ZWJzZXR0aW5ncy5o
IgotI2luY2x1ZGUgInF3ZWJ2aWV3LmgiCi0KLSNpbmNsdWRlIDxRQWN0aW9uPgotI2luY2x1ZGUg
PFFBcHBsaWNhdGlvbj4KLSNpbmNsdWRlIDxRQmFzaWNUaW1lcj4KLSNpbmNsdWRlIDxRQml0QXJy
YXk+Ci0jaW5jbHVkZSA8UUNsaXBib2FyZD4KLSNpbmNsdWRlIDxRQ29sb3JEaWFsb2c+Ci0jaW5j
bHVkZSA8UURlYnVnPgotI2luY2x1ZGUgPFFEZXNrdG9wV2lkZ2V0PgotI2luY2x1ZGUgPFFEcmFn
RW50ZXJFdmVudD4KLSNpbmNsdWRlIDxRRHJhZ0xlYXZlRXZlbnQ+Ci0jaW5jbHVkZSA8UURyYWdN
b3ZlRXZlbnQ+Ci0jaW5jbHVkZSA8UURyb3BFdmVudD4KLSNpbmNsdWRlIDxRRmlsZURpYWxvZz4K
LSNpbmNsdWRlIDxRR2VzdHVyZUV2ZW50PgotI2luY2x1ZGUgPFFJbnB1dERpYWxvZz4KLSNpbmNs
dWRlIDxRTGFiZWw+Ci0jaW5jbHVkZSA8UU1lbnU+Ci0jaW5jbHVkZSA8UU1lc3NhZ2VCb3g+Ci0j
aW5jbHVkZSA8UU5ldHdvcmtBY2Nlc3NNYW5hZ2VyPgotI2luY2x1ZGUgPFFOZXR3b3JrUHJveHk+
Ci0jaW5jbHVkZSA8UU5ldHdvcmtSZXF1ZXN0PgotI2luY2x1ZGUgPFFQYWludGVyPgotI2luY2x1
ZGUgPFFTc2xTb2NrZXQ+Ci0jaW5jbHVkZSA8UVN0eWxlPgotI2luY2x1ZGUgPFFTeXNJbmZvPgot
I2lmIFVTRShRVF9NT0JJTElUWV9TWVNURU1JTkZPKQotI2luY2x1ZGUgPHFzeXN0ZW1pbmZvLmg+
Ci0jZW5kaWYKLSNpbmNsdWRlIDxRU3lzdGVtVHJheUljb24+Ci0jaW5jbHVkZSA8UVRleHRDaGFy
Rm9ybWF0PgotI2luY2x1ZGUgPFFUb29sVGlwPgotI2luY2x1ZGUgPFFUb3VjaEV2ZW50PgotI2lu
Y2x1ZGUgPFFVbmRvU3RhY2s+Ci0jaW5jbHVkZSA8UVVybD4KLSNpZiBkZWZpbmVkKFFfV1NfWDEx
KQotI2luY2x1ZGUgPFFYMTFJbmZvPgotI2VuZGlmCi0KLXVzaW5nIG5hbWVzcGFjZSBXZWJDb3Jl
OwotCi0vLyBmcm9tIHRleHQvcWZvbnQuY3BwCi1RVF9CRUdJTl9OQU1FU1BBQ0UKLWV4dGVybiBR
X0dVSV9FWFBPUlQgaW50IHF0X2RlZmF1bHREcGkoKTsKLVFUX0VORF9OQU1FU1BBQ0UKLQotLy8g
TG9va3VwIHRhYmxlIG1hcHBpbmcgUVdlYlBhZ2U6OldlYkFjdGlvbnMgdG8gdGhlIGFzc29jaWF0
ZWQgRWRpdG9yIGNvbW1hbmRzCi1zdGF0aWMgY29uc3QgY2hhciogZWRpdG9yQ29tbWFuZFdlYkFj
dGlvbnNbXSA9Ci17Ci0gICAgMCwgLy8gT3BlbkxpbmssCi0KLSAgICAwLCAvLyBPcGVuTGlua0lu
TmV3V2luZG93LAotICAgIDAsIC8vIE9wZW5GcmFtZUluTmV3V2luZG93LAotCi0gICAgMCwgLy8g
RG93bmxvYWRMaW5rVG9EaXNrLAotICAgIDAsIC8vIENvcHlMaW5rVG9DbGlwYm9hcmQsCi0KLSAg
ICAwLCAvLyBPcGVuSW1hZ2VJbk5ld1dpbmRvdywKLSAgICAwLCAvLyBEb3dubG9hZEltYWdlVG9E
aXNrLAotICAgIDAsIC8vIENvcHlJbWFnZVRvQ2xpcGJvYXJkLAotCi0gICAgMCwgLy8gQmFjaywK
LSAgICAwLCAvLyBGb3J3YXJkLAotICAgIDAsIC8vIFN0b3AsCi0gICAgMCwgLy8gUmVsb2FkLAot
Ci0gICAgIkN1dCIsIC8vIEN1dCwKLSAgICAiQ29weSIsIC8vIENvcHksCi0gICAgIlBhc3RlIiwg
Ly8gUGFzdGUsCi0KLSAgICAiVW5kbyIsIC8vIFVuZG8sCi0gICAgIlJlZG8iLCAvLyBSZWRvLAot
ICAgICJNb3ZlRm9yd2FyZCIsIC8vIE1vdmVUb05leHRDaGFyLAotICAgICJNb3ZlQmFja3dhcmQi
LCAvLyBNb3ZlVG9QcmV2aW91c0NoYXIsCi0gICAgIk1vdmVXb3JkRm9yd2FyZCIsIC8vIE1vdmVU
b05leHRXb3JkLAotICAgICJNb3ZlV29yZEJhY2t3YXJkIiwgLy8gTW92ZVRvUHJldmlvdXNXb3Jk
LAotICAgICJNb3ZlRG93biIsIC8vIE1vdmVUb05leHRMaW5lLAotICAgICJNb3ZlVXAiLCAvLyBN
b3ZlVG9QcmV2aW91c0xpbmUsCi0gICAgIk1vdmVUb0JlZ2lubmluZ09mTGluZSIsIC8vIE1vdmVU
b1N0YXJ0T2ZMaW5lLAotICAgICJNb3ZlVG9FbmRPZkxpbmUiLCAvLyBNb3ZlVG9FbmRPZkxpbmUs
Ci0gICAgIk1vdmVUb0JlZ2lubmluZ09mUGFyYWdyYXBoIiwgLy8gTW92ZVRvU3RhcnRPZkJsb2Nr
LAotICAgICJNb3ZlVG9FbmRPZlBhcmFncmFwaCIsIC8vIE1vdmVUb0VuZE9mQmxvY2ssCi0gICAg
Ik1vdmVUb0JlZ2lubmluZ09mRG9jdW1lbnQiLCAvLyBNb3ZlVG9TdGFydE9mRG9jdW1lbnQsCi0g
ICAgIk1vdmVUb0VuZE9mRG9jdW1lbnQiLCAvLyBNb3ZlVG9FbmRPZkRvY3VtZW50LAotICAgICJN
b3ZlRm9yd2FyZEFuZE1vZGlmeVNlbGVjdGlvbiIsIC8vIFNlbGVjdE5leHRDaGFyLAotICAgICJN
b3ZlQmFja3dhcmRBbmRNb2RpZnlTZWxlY3Rpb24iLCAvLyBTZWxlY3RQcmV2aW91c0NoYXIsCi0g
ICAgIk1vdmVXb3JkRm9yd2FyZEFuZE1vZGlmeVNlbGVjdGlvbiIsIC8vIFNlbGVjdE5leHRXb3Jk
LAotICAgICJNb3ZlV29yZEJhY2t3YXJkQW5kTW9kaWZ5U2VsZWN0aW9uIiwgLy8gU2VsZWN0UHJl
dmlvdXNXb3JkLAotICAgICJNb3ZlRG93bkFuZE1vZGlmeVNlbGVjdGlvbiIsIC8vIFNlbGVjdE5l
eHRMaW5lLAotICAgICJNb3ZlVXBBbmRNb2RpZnlTZWxlY3Rpb24iLCAvLyBTZWxlY3RQcmV2aW91
c0xpbmUsCi0gICAgIk1vdmVUb0JlZ2lubmluZ09mTGluZUFuZE1vZGlmeVNlbGVjdGlvbiIsIC8v
IFNlbGVjdFN0YXJ0T2ZMaW5lLAotICAgICJNb3ZlVG9FbmRPZkxpbmVBbmRNb2RpZnlTZWxlY3Rp
b24iLCAvLyBTZWxlY3RFbmRPZkxpbmUsCi0gICAgIk1vdmVUb0JlZ2lubmluZ09mUGFyYWdyYXBo
QW5kTW9kaWZ5U2VsZWN0aW9uIiwgLy8gU2VsZWN0U3RhcnRPZkJsb2NrLAotICAgICJNb3ZlVG9F
bmRPZlBhcmFncmFwaEFuZE1vZGlmeVNlbGVjdGlvbiIsIC8vIFNlbGVjdEVuZE9mQmxvY2ssCi0g
ICAgIk1vdmVUb0JlZ2lubmluZ09mRG9jdW1lbnRBbmRNb2RpZnlTZWxlY3Rpb24iLCAvL1NlbGVj
dFN0YXJ0T2ZEb2N1bWVudCwKLSAgICAiTW92ZVRvRW5kT2ZEb2N1bWVudEFuZE1vZGlmeVNlbGVj
dGlvbiIsIC8vIFNlbGVjdEVuZE9mRG9jdW1lbnQsCi0gICAgIkRlbGV0ZVdvcmRCYWNrd2FyZCIs
IC8vIERlbGV0ZVN0YXJ0T2ZXb3JkLAotICAgICJEZWxldGVXb3JkRm9yd2FyZCIsIC8vIERlbGV0
ZUVuZE9mV29yZCwKLQotICAgIDAsIC8vIFNldFRleHREaXJlY3Rpb25EZWZhdWx0LAotICAgIDAs
IC8vIFNldFRleHREaXJlY3Rpb25MZWZ0VG9SaWdodCwKLSAgICAwLCAvLyBTZXRUZXh0RGlyZWN0
aW9uUmlnaHRUb0xlZnQsCi0KLSAgICAiVG9nZ2xlQm9sZCIsIC8vIFRvZ2dsZUJvbGQsCi0gICAg
IlRvZ2dsZUl0YWxpYyIsIC8vIFRvZ2dsZUl0YWxpYywKLSAgICAiVG9nZ2xlVW5kZXJsaW5lIiwg
Ly8gVG9nZ2xlVW5kZXJsaW5lLAotCi0gICAgMCwgLy8gSW5zcGVjdEVsZW1lbnQsCi0KLSAgICAi
SW5zZXJ0TmV3bGluZSIsIC8vIEluc2VydFBhcmFncmFwaFNlcGFyYXRvcgotICAgICJJbnNlcnRM
aW5lQnJlYWsiLCAvLyBJbnNlcnRMaW5lU2VwYXJhdG9yCi0KLSAgICAiU2VsZWN0QWxsIiwgLy8g
U2VsZWN0QWxsCi0gICAgMCwgLy8gUmVsb2FkQW5kQnlwYXNzQ2FjaGUsCi0KLSAgICAiUGFzdGVB
bmRNYXRjaFN0eWxlIiwgLy8gUGFzdGVBbmRNYXRjaFN0eWxlCi0gICAgIlJlbW92ZUZvcm1hdCIs
IC8vIFJlbW92ZUZvcm1hdAotICAgICJTdHJpa2V0aHJvdWdoIiwgLy8gVG9nZ2xlU3RyaWtldGhy
b3VnaCwKLSAgICAiU3Vic2NyaXB0IiwgLy8gVG9nZ2xlU3Vic2NyaXB0Ci0gICAgIlN1cGVyc2Ny
aXB0IiwgLy8gVG9nZ2xlU3VwZXJzY3JpcHQKLSAgICAiSW5zZXJ0VW5vcmRlcmVkTGlzdCIsIC8v
IEluc2VydFVub3JkZXJlZExpc3QKLSAgICAiSW5zZXJ0T3JkZXJlZExpc3QiLCAvLyBJbnNlcnRP
cmRlcmVkTGlzdAotICAgICJJbmRlbnQiLCAvLyBJbmRlbnQKLSAgICAiT3V0ZGVudCIsIC8vIE91
dGRlbnQsCi0KLSAgICAiQWxpZ25DZW50ZXIiLCAvLyBBbGlnbkNlbnRlciwKLSAgICAiQWxpZ25K
dXN0aWZpZWQiLCAvLyBBbGlnbkp1c3RpZmllZCwKLSAgICAiQWxpZ25MZWZ0IiwgLy8gQWxpZ25M
ZWZ0LAotICAgICJBbGlnblJpZ2h0IiwgLy8gQWxpZ25SaWdodCwKLQotICAgIDAsIC8vIFN0b3BT
Y2hlZHVsZWRQYWdlUmVmcmVzaCwKLQotICAgIDAsIC8vIENvcHlJbWFnZVVybFRvQ2xpcGJvYXJk
LAotCi0gICAgMCwgLy8gT3BlbkxpbmtJblRoaXNXaW5kb3csCi0KLSAgICAwIC8vIFdlYkFjdGlv
bkNvdW50Ci19OwotCi0vLyBMb29rdXAgdGhlIGFwcHJvcHJpYXRlIGVkaXRvciBjb21tYW5kIHRv
IHVzZSBmb3IgV2ViQWN0aW9uIFxhIGFjdGlvbgotY29uc3QgY2hhciogUVdlYlBhZ2VQcml2YXRl
OjplZGl0b3JDb21tYW5kRm9yV2ViQWN0aW9ucyhRV2ViUGFnZTo6V2ViQWN0aW9uIGFjdGlvbikK
LXsKLSAgICBpZiAoKGFjdGlvbiA+IFFXZWJQYWdlOjpOb1dlYkFjdGlvbikgJiYgKGFjdGlvbiA8
IGludChzaXplb2YoZWRpdG9yQ29tbWFuZFdlYkFjdGlvbnMpIC8gc2l6ZW9mKGNvbnN0IGNoYXIq
KSkpKQotICAgICAgICByZXR1cm4gZWRpdG9yQ29tbWFuZFdlYkFjdGlvbnNbYWN0aW9uXTsKLSAg
ICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSBEcmFnT3BlcmF0aW9uIGRyb3BBY3Rpb25U
b0RyYWdPcChRdDo6RHJvcEFjdGlvbnMgYWN0aW9ucykKLXsKLSAgICB1bnNpZ25lZCByZXN1bHQg
PSAwOwotICAgIGlmIChhY3Rpb25zICYgUXQ6OkNvcHlBY3Rpb24pCi0gICAgICAgIHJlc3VsdCB8
PSBEcmFnT3BlcmF0aW9uQ29weTsKLSAgICAvLyBEcmFnT3BlcmF0aW9uZ2VuZXJpYyByZXByZXNl
bnRzIEludGVybmV0RXhwbG9yZXIncyBlcXVpdmFsZW50IG9mIE1vdmUgb3BlcmF0aW9uLAotICAg
IC8vIGhlbmNlIGl0IHNob3VsZCBiZSBjb25zaWRlcmVkIGFzICJtb3ZlIgotICAgIGlmIChhY3Rp
b25zICYgUXQ6Ok1vdmVBY3Rpb24pCi0gICAgICAgIHJlc3VsdCB8PSAoRHJhZ09wZXJhdGlvbk1v
dmUgfCBEcmFnT3BlcmF0aW9uR2VuZXJpYyk7Ci0gICAgaWYgKGFjdGlvbnMgJiBRdDo6TGlua0Fj
dGlvbikKLSAgICAgICAgcmVzdWx0IHw9IERyYWdPcGVyYXRpb25MaW5rOwotICAgIGlmIChyZXN1
bHQgPT0gKERyYWdPcGVyYXRpb25Db3B5IHwgRHJhZ09wZXJhdGlvbk1vdmUgfCBEcmFnT3BlcmF0
aW9uR2VuZXJpYyB8IERyYWdPcGVyYXRpb25MaW5rKSkKLSAgICAgICAgcmVzdWx0ID0gRHJhZ09w
ZXJhdGlvbkV2ZXJ5OwotICAgIHJldHVybiAoRHJhZ09wZXJhdGlvbilyZXN1bHQ7Ci19Ci0KLXN0
YXRpYyBpbmxpbmUgUXQ6OkRyb3BBY3Rpb24gZHJhZ09wVG9Ecm9wQWN0aW9uKHVuc2lnbmVkIGFj
dGlvbnMpCi17Ci0gICAgUXQ6OkRyb3BBY3Rpb24gcmVzdWx0ID0gUXQ6Oklnbm9yZUFjdGlvbjsK
LSAgICBpZiAoYWN0aW9ucyAmIERyYWdPcGVyYXRpb25Db3B5KQotICAgICAgICByZXN1bHQgPSBR
dDo6Q29weUFjdGlvbjsKLSAgICBlbHNlIGlmIChhY3Rpb25zICYgRHJhZ09wZXJhdGlvbk1vdmUp
Ci0gICAgICAgIHJlc3VsdCA9IFF0OjpNb3ZlQWN0aW9uOwotICAgIC8vIERyYWdPcGVyYXRpb25n
ZW5lcmljIHJlcHJlc2VudHMgSW50ZXJuZXRFeHBsb3JlcidzIGVxdWl2YWxlbnQgb2YgTW92ZSBv
cGVyYXRpb24sCi0gICAgLy8gaGVuY2UgaXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYXMgIm1vdmUi
Ci0gICAgZWxzZSBpZiAoYWN0aW9ucyAmIERyYWdPcGVyYXRpb25HZW5lcmljKQotICAgICAgICBy
ZXN1bHQgPSBRdDo6TW92ZUFjdGlvbjsKLSAgICBlbHNlIGlmIChhY3Rpb25zICYgRHJhZ09wZXJh
dGlvbkxpbmspCi0gICAgICAgIHJlc3VsdCA9IFF0OjpMaW5rQWN0aW9uOwotICAgIHJldHVybiBy
ZXN1bHQ7Ci19Ci0KLVFXZWJQYWdlUHJpdmF0ZTo6UVdlYlBhZ2VQcml2YXRlKFFXZWJQYWdlICpx
cSkKLSAgICA6IHEocXEpCi0jaWZuZGVmIFFUX05PX1VORE9TVEFDSwotICAgICwgdW5kb1N0YWNr
KDApCi0jZW5kaWYKLSAgICAsIG1fdG90YWxCeXRlcygwKQotICAgICwgbV9ieXRlc1JlY2VpdmVk
KCkKLSAgICAsIGNsaWNrQ2F1c2VkRm9jdXMoZmFsc2UpCi0gICAgLCBsaW5rUG9saWN5KFFXZWJQ
YWdlOjpEb250RGVsZWdhdGVMaW5rcykKLSAgICAsIG1fdmlld3BvcnRTaXplKFFTaXplKDAsIDAp
KQotICAgICwgdXNlRml4ZWRMYXlvdXQoZmFsc2UpCi0gICAgLCBpbnNwZWN0b3JGcm9udGVuZCgw
KQotICAgICwgaW5zcGVjdG9yKDApCi0gICAgLCBpbnNwZWN0b3JJc0ludGVybmFsT25seShmYWxz
ZSkKLSAgICAsIG1fbGFzdERyb3BBY3Rpb24oUXQ6Oklnbm9yZUFjdGlvbikKLXsKLSNpZiBFTkFC
TEUoR0VPTE9DQVRJT04pIHx8IEVOQUJMRShERVZJQ0VfT1JJRU5UQVRJT04pCi0gICAgYm9vbCB1
c2VNb2NrID0gUVdlYlBhZ2VBZGFwdGVyOjpkcnRSdW47Ci0jZW5kaWYKLQotICAgIFdlYktpdDo6
aW5pdGlhbGl6ZVdlYktpdFdpZGdldHMoKTsKLSAgICBXZWJDb3JlOjppbml0aWFsaXplV2ViQ29y
ZVF0KCk7Ci0KLSAgICBQYWdlOjpQYWdlQ2xpZW50cyBwYWdlQ2xpZW50czsKLSAgICBwYWdlQ2xp
ZW50cy5jaHJvbWVDbGllbnQgPSBuZXcgQ2hyb21lQ2xpZW50UXQodGhpcyk7Ci0gICAgcGFnZUNs
aWVudHMuY29udGV4dE1lbnVDbGllbnQgPSBuZXcgQ29udGV4dE1lbnVDbGllbnRRdCgpOwotICAg
IHBhZ2VDbGllbnRzLmVkaXRvckNsaWVudCA9IG5ldyBFZGl0b3JDbGllbnRRdCh0aGlzKTsKLSAg
ICBwYWdlQ2xpZW50cy5kcmFnQ2xpZW50ID0gbmV3IERyYWdDbGllbnRRdChwYWdlQ2xpZW50cy5j
aHJvbWVDbGllbnQpOwotICAgIHBhZ2VDbGllbnRzLmluc3BlY3RvckNsaWVudCA9IG5ldyBJbnNw
ZWN0b3JDbGllbnRRdCh0aGlzKTsKLSAgICBwYWdlID0gbmV3IFBhZ2UocGFnZUNsaWVudHMpOwot
I2lmIEVOQUJMRShHRU9MT0NBVElPTikKLSAgICBpZiAodXNlTW9jaykgewotICAgICAgICAvLyBJ
biBjYXNlIHJ1bm5pbmcgaW4gRHVtcFJlbmRlclRyZWUgbW9kZSBzZXQgdGhlIGNvbnRyb2xsZXIg
dG8gbW9jayBwcm92aWRlci4KLSAgICAgICAgR2VvbG9jYXRpb25DbGllbnRNb2NrKiBtb2NrID0g
bmV3IEdlb2xvY2F0aW9uQ2xpZW50TW9jazsKLSAgICAgICAgV2ViQ29yZTo6cHJvdmlkZUdlb2xv
Y2F0aW9uVG8ocGFnZSwgbW9jayk7Ci0gICAgICAgIG1vY2stPnNldENvbnRyb2xsZXIoV2ViQ29y
ZTo6R2VvbG9jYXRpb25Db250cm9sbGVyOjpmcm9tKHBhZ2UpKTsKLSAgICB9IGVsc2UKLSAgICAg
ICAgV2ViQ29yZTo6cHJvdmlkZUdlb2xvY2F0aW9uVG8ocGFnZSwgbmV3IEdlb2xvY2F0aW9uQ2xp
ZW50UXQodGhpcykpOwotI2VuZGlmCi0jaWYgRU5BQkxFKERFVklDRV9PUklFTlRBVElPTikKLSAg
ICBpZiAodXNlTW9jaykKLSAgICAgICAgV2ViQ29yZTo6cHJvdmlkZURldmljZU9yaWVudGF0aW9u
VG8ocGFnZSwgbmV3IERldmljZU9yaWVudGF0aW9uQ2xpZW50TW9jayk7Ci0gICAgZWxzZQotICAg
ICAgICBXZWJDb3JlOjpwcm92aWRlRGV2aWNlT3JpZW50YXRpb25UbyhwYWdlLCBuZXcgRGV2aWNl
T3JpZW50YXRpb25DbGllbnRRdCk7Ci0gICAgV2ViQ29yZTo6cHJvdmlkZURldmljZU1vdGlvblRv
KHBhZ2UsIG5ldyBEZXZpY2VNb3Rpb25DbGllbnRRdCk7Ci0jZW5kaWYKLQotICAgIC8vIEJ5IGRl
ZmF1bHQgZWFjaCBwYWdlIGlzIHB1dCBpbnRvIHRoZWlyIG93biB1bmlxdWUgcGFnZSBncm91cCwg
d2hpY2ggYWZmZWN0cyBwb3B1cCB3aW5kb3dzCi0gICAgLy8gYW5kIHZpc2l0ZWQgbGlua3MuIFBh
Z2UgZ3JvdXBzIChwZXIgcHJvY2VzcyBvbmx5KSBpcyBhIGZlYXR1cmUgbWFraW5nIGl0IHBvc3Np
YmxlIHRvIHVzZQotICAgIC8vIHNlcGFyYXRlIHNldHRpbmdzIGZvciBlYWNoIGdyb3VwLCBzbyB0
aGF0IGZvciBpbnN0YW5jZSBhbiBpbnRlZ3JhdGVkIGJyb3dzZXIvZW1haWwgcmVhZGVyCi0gICAg
Ly8gY2FuIHVzZSBkaWZmZXJlbnQgc2V0dGluZ3MgZm9yIGRpc3BsYXlpbmcgSFRNTCBwYWdlcyBh
bmQgSFRNTCBlbWFpbC4gVG8gbWFrZSBRdFdlYktpdCB3b3JrCi0gICAgLy8gYXMgZXhwZWN0ZWQg
b3V0IG9mIHRoZSBib3gsIHdlIHVzZSBhIGRlZmF1bHQgZ3JvdXAgc2ltaWxhciB0byB3aGF0IG90
aGVyIHBvcnRzIGFyZSBkb2luZy4KLSAgICBwYWdlLT5zZXRHcm91cE5hbWUoIkRlZmF1bHQgR3Jv
dXAiKTsKLQotICAgIHBhZ2UtPmFkZExheW91dE1pbGVzdG9uZXMoRGlkRmlyc3RWaXN1YWxseU5v
bkVtcHR5TGF5b3V0KTsKLQotICAgIFFXZWJQYWdlQWRhcHRlcjo6aW5pdChwYWdlKTsKLQotICAg
IGhpc3RvcnkuZCA9IG5ldyBRV2ViSGlzdG9yeVByaXZhdGUoc3RhdGljX2Nhc3Q8V2ViQ29yZTo6
QmFja0ZvcndhcmRMaXN0SW1wbCo+KHBhZ2UtPmJhY2tGb3J3YXJkTGlzdCgpKSk7Ci0gICAgbWVt
c2V0KGFjdGlvbnMsIDAsIHNpemVvZihhY3Rpb25zKSk7Ci0KLSAgICBQYWdlR3JvdXA6OnNldFNo
b3VsZFRyYWNrVmlzaXRlZExpbmtzKHRydWUpOwotICAgIAotI2lmIEVOQUJMRShOT1RJRklDQVRJ
T05TKSB8fCBFTkFCTEUoTEVHQUNZX05PVElGSUNBVElPTlMpCi0gICAgTm90aWZpY2F0aW9uUHJl
c2VudGVyQ2xpZW50UXQqIHByZXNlbnRlciA9IE5vdGlmaWNhdGlvblByZXNlbnRlckNsaWVudFF0
Ojpub3RpZmljYXRpb25QcmVzZW50ZXIoKTsKLSAgICBwcmVzZW50ZXItPmFkZENsaWVudCgpOwot
I2lmbmRlZiBRVF9OT19TWVNURU1UUkFZSUNPTgotICAgIGlmICghcHJlc2VudGVyLT5oYXNTeXN0
ZW1UcmF5SWNvbigpKQotICAgICAgICBwcmVzZW50ZXItPnNldFN5c3RlbVRyYXlJY29uKG5ldyBR
U3lzdGVtVHJheUljb24pOwotI2VuZGlmIC8vIFFUX05PX1NZU1RFTVRSQVlJQ09OCi0jZW5kaWYg
Ly8gRU5BQkxFKE5PVElGSUNBVElPTlMpIHx8IEVOQUJMRShMRUdBQ1lfTk9USUZJQ0FUSU9OUykK
LX0KLQotUVdlYlBhZ2VQcml2YXRlOjp+UVdlYlBhZ2VQcml2YXRlKCkKLXsKLSNpZm5kZWYgUVRf
Tk9fQ09OVEVYVE1FTlUKLSAgICBkZWxldGUgY3VycmVudENvbnRleHRNZW51LmRhdGEoKTsKLSNl
bmRpZgotI2lmbmRlZiBRVF9OT19VTkRPU1RBQ0sKLSAgICBkZWxldGUgdW5kb1N0YWNrOwotI2Vu
ZGlmCi0gICAgCi0gICAgaWYgKGluc3BlY3RvcikgewotICAgICAgICAvLyBJZiB0aGUgaW5zcGVj
dG9yIGlzIG91cnMsIGRlbGV0ZSBpdCwgb3RoZXJ3aXNlIGp1c3QgZGV0YWNoIGZyb20gaXQuCi0g
ICAgICAgIGlmIChpbnNwZWN0b3JJc0ludGVybmFsT25seSkKLSAgICAgICAgICAgIGRlbGV0ZSBp
bnNwZWN0b3I7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGluc3BlY3Rvci0+c2V0UGFnZSgw
KTsKLSAgICB9Ci0gICAgLy8gRXhwbGljaXRseSBkZXN0cnVjdCB0aGUgV2ViQ29yZSBwYWdlIGF0
IHRoaXMgcG9pbnQgd2hlbiB0aGUKLSAgICAvLyBRV2ViUGFnZVByaXZhdGUgLyBRV2ViUGFnZUFk
YXBhdGVyIHZ0YWJsZXMgYXJlIHN0aWxsIGludGFjdCwKLSAgICAvLyBpbiBvcmRlciBmb3IgdmFy
aW91cyBkZXN0cnVjdGlvbiBjYWxsYmFja3Mgb3V0IG9mIFdlYkNvcmUgdG8KLSAgICAvLyB3b3Jr
LgotICAgIGRlbGV0ZVBhZ2UoKTsKLX0KLQotV2ViQ29yZTo6UGFnZSogUVdlYlBhZ2VQcml2YXRl
Ojpjb3JlKGNvbnN0IFFXZWJQYWdlKiBwYWdlKQotewotICAgIHJldHVybiBwYWdlLT5kLT5wYWdl
OwotfQotCi12b2lkIFFXZWJQYWdlUHJpdmF0ZTo6c2hvdygpCi17Ci0gICAgaWYgKCF2aWV3KQot
ICAgICAgICByZXR1cm47Ci0gICAgdmlldy0+d2luZG93KCktPnNob3coKTsKLX0KLQotdm9pZCBR
V2ViUGFnZVByaXZhdGU6OnNldEZvY3VzKCkKLXsKLSAgICBpZiAoIXZpZXcpCi0gICAgICAgIHJl
dHVybjsKLSAgICB2aWV3LT5zZXRGb2N1cygpOwotfQotCi12b2lkIFFXZWJQYWdlUHJpdmF0ZTo6
dW5mb2N1cygpCi17Ci0gICAgaWYgKCF2aWV3KQotICAgICAgICByZXR1cm47Ci0gICAgdmlldy0+
Y2xlYXJGb2N1cygpOwotfQotCi12b2lkIFFXZWJQYWdlUHJpdmF0ZTo6c2V0V2luZG93UmVjdChj
b25zdCBRUmVjdCAmcmVjdCkKLXsKLSAgICBlbWl0IHEtPmdlb21ldHJ5Q2hhbmdlUmVxdWVzdGVk
KHJlY3QpOwotfQotCi1RU2l6ZSBRV2ViUGFnZVByaXZhdGU6OnZpZXdwb3J0U2l6ZSgpIGNvbnN0
Ci17Ci0gICAgcmV0dXJuIHEtPnZpZXdwb3J0U2l6ZSgpOwotfQotCi1RV2ViUGFnZUFkYXB0ZXIg
KlFXZWJQYWdlUHJpdmF0ZTo6Y3JlYXRlV2luZG93KGJvb2wgZGlhbG9nKQotewotICAgIFFXZWJQ
YWdlICpuZXdQYWdlID0gcS0+Y3JlYXRlV2luZG93KGRpYWxvZyA/IFFXZWJQYWdlOjpXZWJNb2Rh
bERpYWxvZyA6IFFXZWJQYWdlOjpXZWJCcm93c2VyV2luZG93KTsKLSAgICBpZiAoIW5ld1BhZ2Up
Ci0gICAgICAgIHJldHVybiAwOwotICAgIC8vIE1ha2Ugc3VyZSB0aGUgbWFpbiBmcmFtZSBleGlz
dHMsIGFzIFdlYkNvcmUgZXhwZWN0cyBpdCB3aGVuIHJldHVybmluZyBmcm9tIHRoaXMgQ2hyb21l
Q2xpZW50OjpjcmVhdGVXaW5kb3coKQotICAgIG5ld1BhZ2UtPmQtPmNyZWF0ZU1haW5GcmFtZSgp
OwotICAgIHJldHVybiBuZXdQYWdlLT5kOwotfQotCi12b2lkIFFXZWJQYWdlUHJpdmF0ZTo6amF2
YVNjcmlwdENvbnNvbGVNZXNzYWdlKGNvbnN0IFFTdHJpbmcgJm1lc3NhZ2UsIGludCBsaW5lTnVt
YmVyLCBjb25zdCBRU3RyaW5nICZzb3VyY2VJRCkKLXsKLSAgICBxLT5qYXZhU2NyaXB0Q29uc29s
ZU1lc3NhZ2UobWVzc2FnZSwgbGluZU51bWJlciwgc291cmNlSUQpOwotfQotCi12b2lkIFFXZWJQ
YWdlUHJpdmF0ZTo6amF2YVNjcmlwdEFsZXJ0KFFXZWJGcmFtZUFkYXB0ZXIqIGZyYW1lLCBjb25z
dCBRU3RyaW5nJiBtc2cpCi17Ci0gICAgcS0+amF2YVNjcmlwdEFsZXJ0KFFXZWJGcmFtZVByaXZh
dGU6OmtpdChmcmFtZSksIG1zZyk7Ci19Ci0KLWJvb2wgUVdlYlBhZ2VQcml2YXRlOjpqYXZhU2Ny
aXB0Q29uZmlybShRV2ViRnJhbWVBZGFwdGVyKiBmcmFtZSwgY29uc3QgUVN0cmluZyYgbXNnKQot
ewotICAgIHJldHVybiBxLT5qYXZhU2NyaXB0Q29uZmlybShRV2ViRnJhbWVQcml2YXRlOjpraXQo
ZnJhbWUpLCBtc2cpOwotfQotCi1ib29sIFFXZWJQYWdlUHJpdmF0ZTo6amF2YVNjcmlwdFByb21w
dChRV2ViRnJhbWVBZGFwdGVyICpmcmFtZSwgY29uc3QgUVN0cmluZyAmbXNnLCBjb25zdCBRU3Ry
aW5nICZkZWZhdWx0VmFsdWUsIFFTdHJpbmcgKnJlc3VsdCkKLXsKLSAgICByZXR1cm4gcS0+amF2
YVNjcmlwdFByb21wdChRV2ViRnJhbWVQcml2YXRlOjpraXQoZnJhbWUpLCBtc2csIGRlZmF1bHRW
YWx1ZSwgcmVzdWx0KTsKLX0KLQotYm9vbCBRV2ViUGFnZVByaXZhdGU6OnNob3VsZEludGVycnVw
dEphdmFTY3JpcHQoKQotewotICAgIHJldHVybiBxLT5zaG91bGRJbnRlcnJ1cHRKYXZhU2NyaXB0
KCk7Ci19Ci0KLXZvaWQgUVdlYlBhZ2VQcml2YXRlOjpwcmludFJlcXVlc3RlZChRV2ViRnJhbWVB
ZGFwdGVyICpmcmFtZSkKLXsKLSAgICBlbWl0IHEtPnByaW50UmVxdWVzdGVkKFFXZWJGcmFtZVBy
aXZhdGU6OmtpdChmcmFtZSkpOwotfQotCi12b2lkIFFXZWJQYWdlUHJpdmF0ZTo6ZGF0YWJhc2VR
dW90YUV4Y2VlZGVkKFFXZWJGcmFtZUFkYXB0ZXIqIGZyYW1lLCBjb25zdCBRU3RyaW5nJiBkYXRh
YmFzZU5hbWUpCi17Ci0gICAgZW1pdCBxLT5kYXRhYmFzZVF1b3RhRXhjZWVkZWQoUVdlYkZyYW1l
UHJpdmF0ZTo6a2l0KGZyYW1lKSwgZGF0YWJhc2VOYW1lKTsKLX0KLQotdm9pZCBRV2ViUGFnZVBy
aXZhdGU6OmFwcGxpY2F0aW9uQ2FjaGVRdW90YUV4Y2VlZGVkKFFXZWJTZWN1cml0eU9yaWdpbiAq
b3JpZ2luLCBxdWludDY0IGRlZmF1bHRPcmlnaW5RdW90YSwgcXVpbnQ2NCBjKQotewotICAgIGVt
aXQgcS0+YXBwbGljYXRpb25DYWNoZVF1b3RhRXhjZWVkZWQob3JpZ2luLCBkZWZhdWx0T3JpZ2lu
UXVvdGEsIGMpOwotfQotCi12b2lkIFFXZWJQYWdlUHJpdmF0ZTo6c2V0VG9vbFRpcChjb25zdCBR
U3RyaW5nICZ0aXApCi17Ci0jaWZuZGVmIFFUX05PX1RPT0xUSVAKLSAgICBpZiAoIXZpZXcpCi0g
ICAgICAgIHJldHVybjsKLQotICAgIGlmICh0aXAuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHZpZXct
PnNldFRvb2xUaXAoUVN0cmluZygpKTsKLSAgICAgICAgUVRvb2xUaXA6OmhpZGVUZXh0KCk7Ci0g
ICAgfSBlbHNlIHsKLSAgICAgICAgUVN0cmluZyBkdGlwID0gUUxhdGluMVN0cmluZygiPHA+Iikg
KyBRU3RyaW5nKHRpcCkudG9IdG1sRXNjYXBlZCgpICsgUUxhdGluMVN0cmluZygiPC9wPiIpOwot
ICAgICAgICB2aWV3LT5zZXRUb29sVGlwKGR0aXApOwotICAgIH0KLSNlbHNlCi0gICAgUV9VTlVT
RUQodGlwKTsKLSNlbmRpZgotfQotCi0jaWYgVVNFKFFUX01VTFRJTUVESUEpCi1RV2ViRnVsbFNj
cmVlblZpZGVvSGFuZGxlciAqUVdlYlBhZ2VQcml2YXRlOjpjcmVhdGVGdWxsU2NyZWVuVmlkZW9I
YW5kbGVyKCkKLXsKLSAgICByZXR1cm4gbmV3IFdlYktpdDo6RGVmYXVsdEZ1bGxTY3JlZW5WaWRl
b0hhbmRsZXI7Ci19Ci0jZW5kaWYKLQotUVdlYkZyYW1lQWRhcHRlciAqUVdlYlBhZ2VQcml2YXRl
OjptYWluRnJhbWVBZGFwdGVyKCkKLXsKLSAgICByZXR1cm4gcS0+bWFpbkZyYW1lKCktPmQ7Ci19
Ci0KLVFTdHJpbmdMaXN0IFFXZWJQYWdlUHJpdmF0ZTo6Y2hvb3NlRmlsZXMoUVdlYkZyYW1lQWRh
cHRlciAqZnJhbWUsIGJvb2wgYWxsb3dNdWx0aXBsZSwgY29uc3QgUVN0cmluZ0xpc3QgJnN1Z2dl
c3RlZEZpbGVOYW1lcykKLXsKLSAgICBpZiAoYWxsb3dNdWx0aXBsZSAmJiBxLT5zdXBwb3J0c0V4
dGVuc2lvbihRV2ViUGFnZTo6Q2hvb3NlTXVsdGlwbGVGaWxlc0V4dGVuc2lvbikpIHsKLSAgICAg
ICAgUVdlYlBhZ2U6OkNob29zZU11bHRpcGxlRmlsZXNFeHRlbnNpb25PcHRpb24gb3B0aW9uOwot
ICAgICAgICBvcHRpb24ucGFyZW50RnJhbWUgPSBRV2ViRnJhbWVQcml2YXRlOjpraXQoZnJhbWUp
OwotICAgICAgICBvcHRpb24uc3VnZ2VzdGVkRmlsZU5hbWVzID0gc3VnZ2VzdGVkRmlsZU5hbWVz
OwotCi0gICAgICAgIFFXZWJQYWdlOjpDaG9vc2VNdWx0aXBsZUZpbGVzRXh0ZW5zaW9uUmV0dXJu
IG91dHB1dDsKLSAgICAgICAgcS0+ZXh0ZW5zaW9uKFFXZWJQYWdlOjpDaG9vc2VNdWx0aXBsZUZp
bGVzRXh0ZW5zaW9uLCAmb3B0aW9uLCAmb3V0cHV0KTsKLQotICAgICAgICByZXR1cm4gb3V0cHV0
LmZpbGVOYW1lczsKLSAgICB9Ci0gICAgLy8gU2luZ2xlIGZpbGUKLSAgICBRU3RyaW5nTGlzdCBy
ZXN1bHQ7Ci0gICAgUVN0cmluZyBzdWdnZXN0ZWRGaWxlOwotICAgIGlmICghc3VnZ2VzdGVkRmls
ZU5hbWVzLmlzRW1wdHkoKSkKLSAgICAgICAgc3VnZ2VzdGVkRmlsZSA9IHN1Z2dlc3RlZEZpbGVO
YW1lcy5maXJzdCgpOwotICAgIFFTdHJpbmcgZmlsZSA9IHEtPmNob29zZUZpbGUoUVdlYkZyYW1l
UHJpdmF0ZTo6a2l0KGZyYW1lKSwgc3VnZ2VzdGVkRmlsZSk7Ci0gICAgaWYgKCFmaWxlLmlzRW1w
dHkoKSkKLSAgICAgICAgcmVzdWx0IDw8IGZpbGU7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQot
Ym9vbCBRV2ViUGFnZVByaXZhdGU6OmFjY2VwdE5hdmlnYXRpb25SZXF1ZXN0KFFXZWJGcmFtZUFk
YXB0ZXIgKmZyYW1lQWRhcHRlciwgY29uc3QgUU5ldHdvcmtSZXF1ZXN0ICZyZXF1ZXN0LCBpbnQg
dHlwZSkKLXsKLSAgICBRV2ViRnJhbWUgKmZyYW1lID0gZnJhbWVBZGFwdGVyID8gUVdlYkZyYW1l
UHJpdmF0ZTo6a2l0KGZyYW1lQWRhcHRlcik6IDA7Ci0gICAgaWYgKGluc2lkZU9wZW5DYWxsCi0g
ICAgICAgICYmIGZyYW1lID09IG1haW5GcmFtZS5kYXRhKCkpCi0gICAgICAgIHJldHVybiB0cnVl
OwotICAgIHJldHVybiBxLT5hY2NlcHROYXZpZ2F0aW9uUmVxdWVzdChmcmFtZSwgcmVxdWVzdCwg
UVdlYlBhZ2U6Ok5hdmlnYXRpb25UeXBlKHR5cGUpKTsKLX0KLQotdm9pZCBRV2ViUGFnZVByaXZh
dGU6OmVtaXRSZXN0b3JlRnJhbWVTdGF0ZVJlcXVlc3RlZChRV2ViRnJhbWVBZGFwdGVyICpmcmFt
ZSkKLXsKLSAgICBlbWl0IHEtPnJlc3RvcmVGcmFtZVN0YXRlUmVxdWVzdGVkKFFXZWJGcmFtZVBy
aXZhdGU6OmtpdChmcmFtZSkpOwotfQotCi12b2lkIFFXZWJQYWdlUHJpdmF0ZTo6ZW1pdFNhdmVG
cmFtZVN0YXRlUmVxdWVzdGVkKFFXZWJGcmFtZUFkYXB0ZXIgKmZyYW1lLCBRV2ViSGlzdG9yeUl0
ZW0gKml0ZW0pCi17Ci0gICAgZW1pdCBxLT5zYXZlRnJhbWVTdGF0ZVJlcXVlc3RlZChRV2ViRnJh
bWVQcml2YXRlOjpraXQoZnJhbWUpLCBpdGVtKTsKLX0KLQotdm9pZCBRV2ViUGFnZVByaXZhdGU6
OmVtaXREb3dubG9hZFJlcXVlc3RlZChjb25zdCBRTmV0d29ya1JlcXVlc3QgJnJlcXVlc3QpCi17
Ci0gICAgZW1pdCBxLT5kb3dubG9hZFJlcXVlc3RlZChyZXF1ZXN0KTsKLX0KLQotdm9pZCBRV2Vi
UGFnZVByaXZhdGU6OmVtaXRGcmFtZUNyZWF0ZWQoUVdlYkZyYW1lQWRhcHRlciAqZnJhbWUpCi17
Ci0gICAgZW1pdCBxLT5mcmFtZUNyZWF0ZWQoUVdlYkZyYW1lUHJpdmF0ZTo6a2l0KGZyYW1lKSk7
Ci19Ci0KLWJvb2wgUVdlYlBhZ2VQcml2YXRlOjplcnJvclBhZ2VFeHRlbnNpb24oUVdlYlBhZ2VB
ZGFwdGVyOjpFcnJvclBhZ2VPcHRpb24gKm9wdCwgUVdlYlBhZ2VBZGFwdGVyOjpFcnJvclBhZ2VS
ZXR1cm4gKm91dCkKLXsKLSAgICBRV2ViUGFnZTo6RXJyb3JQYWdlRXh0ZW5zaW9uT3B0aW9uIG9w
dGlvbjsKLSAgICBpZiAob3B0LT5kb21haW4gPT0gUUxhdGluMVN0cmluZygiUXROZXR3b3JrIikp
Ci0gICAgICAgIG9wdGlvbi5kb21haW4gPSBRV2ViUGFnZTo6UXROZXR3b3JrOwotICAgIGVsc2Ug
aWYgKG9wdC0+ZG9tYWluID09IFFMYXRpbjFTdHJpbmcoIkhUVFAiKSkKLSAgICAgICAgb3B0aW9u
LmRvbWFpbiA9IFFXZWJQYWdlOjpIdHRwOwotICAgIGVsc2UgaWYgKG9wdC0+ZG9tYWluID09IFFM
YXRpbjFTdHJpbmcoIldlYktpdCIpKQotICAgICAgICBvcHRpb24uZG9tYWluID0gUVdlYlBhZ2U6
OldlYktpdDsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBvcHRpb24udXJs
ID0gb3B0LT51cmw7Ci0gICAgb3B0aW9uLmZyYW1lID0gUVdlYkZyYW1lUHJpdmF0ZTo6a2l0KG9w
dC0+ZnJhbWUpOwotICAgIG9wdGlvbi5lcnJvciA9IG9wdC0+ZXJyb3I7Ci0gICAgb3B0aW9uLmVy
cm9yU3RyaW5nID0gb3B0LT5lcnJvclN0cmluZzsKLSAgICBRV2ViUGFnZTo6RXJyb3JQYWdlRXh0
ZW5zaW9uUmV0dXJuIG91dHB1dDsKLSAgICBpZiAoIXEtPmV4dGVuc2lvbihRV2ViUGFnZTo6RXJy
b3JQYWdlRXh0ZW5zaW9uLCAmb3B0aW9uLCAmb3V0cHV0KSkKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgIG91dC0+YmFzZVVybCA9IG91dHB1dC5iYXNlVXJsOwotICAgIG91dC0+Y29udGVudCA9
IG91dHB1dC5jb250ZW50OwotICAgIG91dC0+Y29udGVudFR5cGUgPSBvdXRwdXQuY29udGVudFR5
cGU7Ci0gICAgb3V0LT5lbmNvZGluZyA9IG91dHB1dC5lbmNvZGluZzsKLSAgICByZXR1cm4gdHJ1
ZTsKLX0KLQotUXRQbHVnaW5XaWRnZXRBZGFwdGVyICpRV2ViUGFnZVByaXZhdGU6OmNyZWF0ZVBs
dWdpbihjb25zdCBRU3RyaW5nICZjbGFzc2lkLCBjb25zdCBRVXJsICZ1cmwsIGNvbnN0IFFTdHJp
bmdMaXN0ICZwYXJhbU5hbWVzLCBjb25zdCBRU3RyaW5nTGlzdCAmcGFyYW1WYWx1ZXMpCi17Ci0g
ICAgUU9iamVjdCAqd2lkZ2V0ID0gcS0+Y3JlYXRlUGx1Z2luKGNsYXNzaWQsIHVybCwgcGFyYW1O
YW1lcywgcGFyYW1WYWx1ZXMpOwotICAgIHJldHVybiBhZGFwdGVyRm9yV2lkZ2V0KHdpZGdldCk7
Ci19Ci0KLVF0UGx1Z2luV2lkZ2V0QWRhcHRlciAqUVdlYlBhZ2VQcml2YXRlOjphZGFwdGVyRm9y
V2lkZ2V0KFFPYmplY3QgKm9iamVjdCkgY29uc3QKLXsKLSAgICBpZiAoUVdpZGdldCAqd2lkZ2V0
ID0gcW9iamVjdF9jYXN0PFFXaWRnZXQqPihvYmplY3QpKQotICAgICAgICByZXR1cm4gbmV3IFFX
aWRnZXRQbHVnaW5JbXBsKHdpZGdldCk7Ci0gICAgaWYgKFFHcmFwaGljc1dpZGdldCAqd2lkZ2V0
ID0gcW9iamVjdF9jYXN0PFFHcmFwaGljc1dpZGdldCo+KG9iamVjdCkpCi0gICAgICAgIHJldHVy
biBuZXcgUUdyYXBoaWNzV2lkZ2V0UGx1Z2luSW1wbCh3aWRnZXQpOwotICAgIHJldHVybiAwOwot
fQotCi12b2lkIFFXZWJQYWdlUHJpdmF0ZTo6Y3JlYXRlTWFpbkZyYW1lKCkKLXsKLSAgICBpZiAo
IW1haW5GcmFtZSkgewotICAgICAgICBtYWluRnJhbWUgPSBuZXcgUVdlYkZyYW1lKHEpOwotICAg
ICAgICBlbWl0IHEtPmZyYW1lQ3JlYXRlZChtYWluRnJhbWUuZGF0YSgpKTsKLSAgICB9Ci19Ci0K
LXN0YXRpYyBRV2ViUGFnZTo6V2ViQWN0aW9uIHdlYkFjdGlvbkZvckNvbnRleHRNZW51QWN0aW9u
KFdlYkNvcmU6OkNvbnRleHRNZW51QWN0aW9uIGFjdGlvbikKLXsKLSAgICBzd2l0Y2ggKGFjdGlv
bikgewotICAgICAgICBjYXNlIFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbVRhZ09wZW5MaW5rOiBy
ZXR1cm4gUVdlYlBhZ2U6Ok9wZW5MaW5rOwotICAgICAgICBjYXNlIFdlYkNvcmU6OkNvbnRleHRN
ZW51SXRlbVRhZ09wZW5MaW5rSW5OZXdXaW5kb3c6IHJldHVybiBRV2ViUGFnZTo6T3BlbkxpbmtJ
bk5ld1dpbmRvdzsKLSAgICAgICAgY2FzZSBXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW1UYWdPcGVu
TGlua0luVGhpc1dpbmRvdzogcmV0dXJuIFFXZWJQYWdlOjpPcGVuTGlua0luVGhpc1dpbmRvdzsK
LSAgICAgICAgY2FzZSBXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW1UYWdEb3dubG9hZExpbmtUb0Rp
c2s6IHJldHVybiBRV2ViUGFnZTo6RG93bmxvYWRMaW5rVG9EaXNrOwotICAgICAgICBjYXNlIFdl
YkNvcmU6OkNvbnRleHRNZW51SXRlbVRhZ0NvcHlMaW5rVG9DbGlwYm9hcmQ6IHJldHVybiBRV2Vi
UGFnZTo6Q29weUxpbmtUb0NsaXBib2FyZDsKLSAgICAgICAgY2FzZSBXZWJDb3JlOjpDb250ZXh0
TWVudUl0ZW1UYWdPcGVuSW1hZ2VJbk5ld1dpbmRvdzogcmV0dXJuIFFXZWJQYWdlOjpPcGVuSW1h
Z2VJbk5ld1dpbmRvdzsKLSAgICAgICAgY2FzZSBXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW1UYWdE
b3dubG9hZEltYWdlVG9EaXNrOiByZXR1cm4gUVdlYlBhZ2U6OkRvd25sb2FkSW1hZ2VUb0Rpc2s7
Ci0gICAgICAgIGNhc2UgV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtVGFnQ29weUltYWdlVG9DbGlw
Ym9hcmQ6IHJldHVybiBRV2ViUGFnZTo6Q29weUltYWdlVG9DbGlwYm9hcmQ7Ci0gICAgICAgIGNh
c2UgV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtVGFnQ29weUltYWdlVXJsVG9DbGlwYm9hcmQ6IHJl
dHVybiBRV2ViUGFnZTo6Q29weUltYWdlVXJsVG9DbGlwYm9hcmQ7Ci0gICAgICAgIGNhc2UgV2Vi
Q29yZTo6Q29udGV4dE1lbnVJdGVtVGFnT3BlbkZyYW1lSW5OZXdXaW5kb3c6IHJldHVybiBRV2Vi
UGFnZTo6T3BlbkZyYW1lSW5OZXdXaW5kb3c7Ci0gICAgICAgIGNhc2UgV2ViQ29yZTo6Q29udGV4
dE1lbnVJdGVtVGFnQ29weTogcmV0dXJuIFFXZWJQYWdlOjpDb3B5OwotICAgICAgICBjYXNlIFdl
YkNvcmU6OkNvbnRleHRNZW51SXRlbVRhZ0dvQmFjazogcmV0dXJuIFFXZWJQYWdlOjpCYWNrOwot
ICAgICAgICBjYXNlIFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbVRhZ0dvRm9yd2FyZDogcmV0dXJu
IFFXZWJQYWdlOjpGb3J3YXJkOwotICAgICAgICBjYXNlIFdlYkNvcmU6OkNvbnRleHRNZW51SXRl
bVRhZ1N0b3A6IHJldHVybiBRV2ViUGFnZTo6U3RvcDsKLSAgICAgICAgY2FzZSBXZWJDb3JlOjpD
b250ZXh0TWVudUl0ZW1UYWdSZWxvYWQ6IHJldHVybiBRV2ViUGFnZTo6UmVsb2FkOwotICAgICAg
ICBjYXNlIFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbVRhZ0N1dDogcmV0dXJuIFFXZWJQYWdlOjpD
dXQ7Ci0gICAgICAgIGNhc2UgV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtVGFnUGFzdGU6IHJldHVy
biBRV2ViUGFnZTo6UGFzdGU7Ci0gICAgICAgIGNhc2UgV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVt
VGFnRGVmYXVsdERpcmVjdGlvbjogcmV0dXJuIFFXZWJQYWdlOjpTZXRUZXh0RGlyZWN0aW9uRGVm
YXVsdDsKLSAgICAgICAgY2FzZSBXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW1UYWdMZWZ0VG9SaWdo
dDogcmV0dXJuIFFXZWJQYWdlOjpTZXRUZXh0RGlyZWN0aW9uTGVmdFRvUmlnaHQ7Ci0gICAgICAg
IGNhc2UgV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtVGFnUmlnaHRUb0xlZnQ6IHJldHVybiBRV2Vi
UGFnZTo6U2V0VGV4dERpcmVjdGlvblJpZ2h0VG9MZWZ0OwotICAgICAgICBjYXNlIFdlYkNvcmU6
OkNvbnRleHRNZW51SXRlbVRhZ0JvbGQ6IHJldHVybiBRV2ViUGFnZTo6VG9nZ2xlQm9sZDsKLSAg
ICAgICAgY2FzZSBXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW1UYWdJdGFsaWM6IHJldHVybiBRV2Vi
UGFnZTo6VG9nZ2xlSXRhbGljOwotICAgICAgICBjYXNlIFdlYkNvcmU6OkNvbnRleHRNZW51SXRl
bVRhZ1VuZGVybGluZTogcmV0dXJuIFFXZWJQYWdlOjpUb2dnbGVVbmRlcmxpbmU7Ci0gICAgICAg
IGNhc2UgV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtVGFnU2VsZWN0QWxsOiByZXR1cm4gUVdlYlBh
Z2U6OlNlbGVjdEFsbDsKLSNpZiBFTkFCTEUoSU5TUEVDVE9SKQotICAgICAgICBjYXNlIFdlYkNv
cmU6OkNvbnRleHRNZW51SXRlbVRhZ0luc3BlY3RFbGVtZW50OiByZXR1cm4gUVdlYlBhZ2U6Oklu
c3BlY3RFbGVtZW50OwotI2VuZGlmCi0gICAgICAgIGRlZmF1bHQ6IGJyZWFrOwotICAgIH0KLSAg
ICByZXR1cm4gUVdlYlBhZ2U6Ok5vV2ViQWN0aW9uOwotfQotCi0jaWZuZGVmIFFUX05PX0NPTlRF
WFRNRU5VCi1RTWVudSAqUVdlYlBhZ2VQcml2YXRlOjpjcmVhdGVDb250ZXh0TWVudShjb25zdCBX
ZWJDb3JlOjpDb250ZXh0TWVudSAqd2ViY29yZU1lbnUsCi0gICAgICAgIGNvbnN0IFFMaXN0PFdl
YkNvcmU6OkNvbnRleHRNZW51SXRlbT4gKml0ZW1zLCBRQml0QXJyYXkgKnZpc2l0ZWRXZWJBY3Rp
b25zKQotewotICAgIGlmICghY2xpZW50IHx8ICF3ZWJjb3JlTWVudSkKLSAgICAgICAgcmV0dXJu
IDA7Ci0KLSAgICBRTWVudSogbWVudSA9IG5ldyBRTWVudShxLT52aWV3KCkpOwotICAgIGZvciAo
aW50IGkgPSAwOyBpIDwgaXRlbXMtPmNvdW50KCk7ICsraSkgewotICAgICAgICBjb25zdCBDb250
ZXh0TWVudUl0ZW0gJml0ZW0gPSBpdGVtcy0+YXQoaSk7Ci0gICAgICAgIHN3aXRjaCAoaXRlbS50
eXBlKCkpIHsKLSAgICAgICAgY2FzZSBXZWJDb3JlOjpDaGVja2FibGVBY3Rpb25UeXBlOiAvKiBm
YWxsIHRocm91Z2ggKi8KLSAgICAgICAgY2FzZSBXZWJDb3JlOjpBY3Rpb25UeXBlOiB7Ci0gICAg
ICAgICAgICBRV2ViUGFnZTo6V2ViQWN0aW9uIGFjdGlvbiA9IHdlYkFjdGlvbkZvckNvbnRleHRN
ZW51QWN0aW9uKGl0ZW0uYWN0aW9uKCkpOwotICAgICAgICAgICAgUUFjdGlvbiAqYSA9IHEtPmFj
dGlvbihhY3Rpb24pOwotICAgICAgICAgICAgaWYgKGEpIHsKLSAgICAgICAgICAgICAgICBDb250
ZXh0TWVudUl0ZW0gaXQoaXRlbSk7Ci0gICAgICAgICAgICAgICAgcGFnZS0+Y29udGV4dE1lbnVD
b250cm9sbGVyKCktPmNoZWNrT3JFbmFibGVJZk5lZWRlZChpdCk7Ci0gICAgICAgICAgICAgICAg
UGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uIGRlc2MgPSBpdC5yZWxlYXNlUGxhdGZvcm1EZXNj
cmlwdGlvbigpOwotICAgICAgICAgICAgICAgIGEtPnNldEVuYWJsZWQoZGVzYy5lbmFibGVkKTsK
LSAgICAgICAgICAgICAgICBhLT5zZXRDaGVja2VkKGRlc2MuY2hlY2tlZCk7Ci0gICAgICAgICAg
ICAgICAgYS0+c2V0Q2hlY2thYmxlKGl0ZW0udHlwZSgpID09IFdlYkNvcmU6OkNoZWNrYWJsZUFj
dGlvblR5cGUpOwotCi0gICAgICAgICAgICAgICAgbWVudS0+YWRkQWN0aW9uKGEpOwotICAgICAg
ICAgICAgICAgIHZpc2l0ZWRXZWJBY3Rpb25zLT5zZXRCaXQoYWN0aW9uKTsKLSAgICAgICAgICAg
IH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgV2ViQ29yZTo6
U2VwYXJhdG9yVHlwZToKLSAgICAgICAgICAgIG1lbnUtPmFkZFNlcGFyYXRvcigpOwotICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgV2ViQ29yZTo6U3VibWVudVR5cGU6IHsKLSAgICAg
ICAgICAgIFFNZW51ICpzdWJNZW51ID0gY3JlYXRlQ29udGV4dE1lbnUod2ViY29yZU1lbnUsIGl0
ZW0ucGxhdGZvcm1TdWJNZW51KCksIHZpc2l0ZWRXZWJBY3Rpb25zKTsKLQotICAgICAgICAgICAg
Ym9vbCBhbnlFbmFibGVkQWN0aW9uID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIFFMaXN0PFFBY3Rp
b24gKj4gYWN0aW9ucyA9IHN1Yk1lbnUtPmFjdGlvbnMoKTsKLSAgICAgICAgICAgIGZvciAoaW50
IGkgPSAwOyBpIDwgYWN0aW9ucy5jb3VudCgpOyArK2kpIHsKLSAgICAgICAgICAgICAgICBpZiAo
YWN0aW9ucy5hdChpKS0+aXNWaXNpYmxlKCkpCi0gICAgICAgICAgICAgICAgICAgIGFueUVuYWJs
ZWRBY3Rpb24gfD0gYWN0aW9ucy5hdChpKS0+aXNFbmFibGVkKCk7Ci0gICAgICAgICAgICB9Ci0K
LSAgICAgICAgICAgIC8vIGRvbid0IHNob3cgc3ViLW1lbnVzIHdpdGgganVzdCBkaXNhYmxlZCBh
Y3Rpb25zCi0gICAgICAgICAgICBpZiAoYW55RW5hYmxlZEFjdGlvbikgewotICAgICAgICAgICAg
ICAgIHN1Yk1lbnUtPnNldFRpdGxlKGl0ZW0udGl0bGUoKSk7Ci0gICAgICAgICAgICAgICAgbWVu
dS0+YWRkQWN0aW9uKHN1Yk1lbnUtPm1lbnVBY3Rpb24oKSk7Ci0gICAgICAgICAgICB9IGVsc2UK
LSAgICAgICAgICAgICAgICBkZWxldGUgc3ViTWVudTsKLSAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG1lbnU7Ci19Ci0jZW5kaWYgLy8g
UVRfTk9fQ09OVEVYVE1FTlUKLQotI2lmbmRlZiBRVF9OT19BQ1RJT04KLXZvaWQgUVdlYlBhZ2VQ
cml2YXRlOjpfcV93ZWJBY3Rpb25UcmlnZ2VyZWQoYm9vbCBjaGVja2VkKQotewotICAgIFFBY3Rp
b24gKmEgPSBxb2JqZWN0X2Nhc3Q8UUFjdGlvbiAqPihxLT5zZW5kZXIoKSk7Ci0gICAgaWYgKCFh
KQotICAgICAgICByZXR1cm47Ci0gICAgUVdlYlBhZ2U6OldlYkFjdGlvbiBhY3Rpb24gPSBzdGF0
aWNfY2FzdDxRV2ViUGFnZTo6V2ViQWN0aW9uPihhLT5kYXRhKCkudG9JbnQoKSk7Ci0gICAgcS0+
dHJpZ2dlckFjdGlvbihhY3Rpb24sIGNoZWNrZWQpOwotfQotI2VuZGlmIC8vIFFUX05PX0FDVElP
TgotCi12b2lkIFFXZWJQYWdlUHJpdmF0ZTo6X3FfY2xlYW51cExlYWtNZXNzYWdlcygpCi17Ci0j
aWZuZGVmIE5ERUJVRwotICAgIC8vIE5lZWQgdGhpcyB0byBtYWtlIGxlYWsgbWVzc2FnZXMgYWNj
dXJhdGUuCi0gICAgbWVtb3J5Q2FjaGUoKS0+c2V0Q2FwYWNpdGllcygwLCAwLCAwKTsKLSNlbmRp
ZgotfQotCi12b2lkIFFXZWJQYWdlUHJpdmF0ZTo6dXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpXZWJB
Y3Rpb24gYWN0aW9uKQotewotI2lmZGVmIFFUX05PX0FDVElPTgotICAgIFFfVU5VU0VEKGFjdGlv
bikKLSNlbHNlCi0gICAgUUFjdGlvbiAqYSA9IGFjdGlvbnNbYWN0aW9uXTsKLSAgICBpZiAoIWEg
fHwgIW1haW5GcmFtZSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgV2ViQ29yZTo6RnJhbWVMb2Fk
ZXIgKmxvYWRlciA9IG1haW5GcmFtZS5kYXRhKCktPmQtPmZyYW1lLT5sb2FkZXIoKTsKLSAgICBX
ZWJDb3JlOjpFZGl0b3IgKmVkaXRvciA9IHBhZ2UtPmZvY3VzQ29udHJvbGxlcigpLT5mb2N1c2Vk
T3JNYWluRnJhbWUoKS0+ZWRpdG9yKCk7Ci0KLSAgICBib29sIGVuYWJsZWQgPSBhLT5pc0VuYWJs
ZWQoKTsKLSAgICBib29sIGNoZWNrZWQgPSBhLT5pc0NoZWNrZWQoKTsKLQotICAgIHN3aXRjaCAo
YWN0aW9uKSB7Ci0gICAgICAgIGNhc2UgUVdlYlBhZ2U6OkJhY2s6Ci0gICAgICAgICAgICBlbmFi
bGVkID0gcGFnZS0+Y2FuR29CYWNrT3JGb3J3YXJkKC0xKTsKLSAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICBjYXNlIFFXZWJQYWdlOjpGb3J3YXJkOgotICAgICAgICAgICAgZW5hYmxlZCA9IHBh
Z2UtPmNhbkdvQmFja09yRm9yd2FyZCgxKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBj
YXNlIFFXZWJQYWdlOjpTdG9wOgotICAgICAgICAgICAgZW5hYmxlZCA9IGxvYWRlci0+aXNMb2Fk
aW5nKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBRV2ViUGFnZTo6UmVsb2Fk
OgotICAgICAgICBjYXNlIFFXZWJQYWdlOjpSZWxvYWRBbmRCeXBhc3NDYWNoZToKLSAgICAgICAg
ICAgIGVuYWJsZWQgPSAhbG9hZGVyLT5pc0xvYWRpbmcoKTsKLSAgICAgICAgICAgIGJyZWFrOwot
I2lmbmRlZiBRVF9OT19VTkRPU1RBQ0sKLSAgICAgICAgY2FzZSBRV2ViUGFnZTo6VW5kbzoKLSAg
ICAgICAgY2FzZSBRV2ViUGFnZTo6UmVkbzoKLSAgICAgICAgICAgIC8vIHRob3NlIHR3byBhcmUg
aGFuZGxlZCBieSBRVW5kb1N0YWNrCi0gICAgICAgICAgICBicmVhazsKLSNlbmRpZiAvLyBRVF9O
T19VTkRPU1RBQ0sKLSAgICAgICAgY2FzZSBRV2ViUGFnZTo6U2VsZWN0QWxsOiAvLyBlZGl0b3Ig
Y29tbWFuZCBpcyBhbHdheXMgZW5hYmxlZAotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNh
c2UgUVdlYlBhZ2U6OlNldFRleHREaXJlY3Rpb25EZWZhdWx0OgotICAgICAgICBjYXNlIFFXZWJQ
YWdlOjpTZXRUZXh0RGlyZWN0aW9uTGVmdFRvUmlnaHQ6Ci0gICAgICAgIGNhc2UgUVdlYlBhZ2U6
OlNldFRleHREaXJlY3Rpb25SaWdodFRvTGVmdDoKLSAgICAgICAgICAgIGVuYWJsZWQgPSBlZGl0
b3ItPmNhbkVkaXQoKTsKLSAgICAgICAgICAgIGNoZWNrZWQgPSBmYWxzZTsKLSAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgICAvLyBzZWUgaWYgaXQncyBh
biBlZGl0b3IgY29tbWFuZAotICAgICAgICAgICAgY29uc3QgY2hhciogY29tbWFuZE5hbWUgPSBl
ZGl0b3JDb21tYW5kRm9yV2ViQWN0aW9ucyhhY3Rpb24pOwotCi0gICAgICAgICAgICAvLyBpZiBp
dCdzIGFuIGVkaXRvciBjb21tYW5kLCBsZXQgaXQncyBsb2dpYyBkZXRlcm1pbmUgc3RhdGUKLSAg
ICAgICAgICAgIGlmIChjb21tYW5kTmFtZSkgewotICAgICAgICAgICAgICAgIEVkaXRvcjo6Q29t
bWFuZCBjb21tYW5kID0gZWRpdG9yLT5jb21tYW5kKGNvbW1hbmROYW1lKTsKLSAgICAgICAgICAg
ICAgICBlbmFibGVkID0gY29tbWFuZC5pc0VuYWJsZWQoKTsKLSAgICAgICAgICAgICAgICBpZiAo
ZW5hYmxlZCkKLSAgICAgICAgICAgICAgICAgICAgY2hlY2tlZCA9IGNvbW1hbmQuc3RhdGUoKSAh
PSBGYWxzZVRyaVN0YXRlOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAg
ICAgY2hlY2tlZCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgIH0KLSAgICB9Ci0KLSAgICBhLT5zZXRFbmFibGVkKGVuYWJsZWQpOwotCi0gICAgaWYg
KGEtPmlzQ2hlY2thYmxlKCkpCi0gICAgICAgIGEtPnNldENoZWNrZWQoY2hlY2tlZCk7Ci0jZW5k
aWYgLy8gUVRfTk9fQUNUSU9OCi19Ci0KLXZvaWQgUVdlYlBhZ2VQcml2YXRlOjp1cGRhdGVOYXZp
Z2F0aW9uQWN0aW9ucygpCi17Ci0gICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpCYWNrKTsKLSAg
ICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6OkZvcndhcmQpOwotICAgIHVwZGF0ZUFjdGlvbihRV2Vi
UGFnZTo6U3RvcCk7Ci0gICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpSZWxvYWQpOwotICAgIHVw
ZGF0ZUFjdGlvbihRV2ViUGFnZTo6UmVsb2FkQW5kQnlwYXNzQ2FjaGUpOwotfQotCi1RT2JqZWN0
ICpRV2ViUGFnZVByaXZhdGU6Omluc3BlY3RvckhhbmRsZSgpCi17Ci0gICAgcmV0dXJuIGdldE9y
Q3JlYXRlSW5zcGVjdG9yKCk7Ci19Ci0KLXZvaWQgUVdlYlBhZ2VQcml2YXRlOjpzZXRJbnNwZWN0
b3JGcm9udGVuZChRT2JqZWN0KiBmcm9udGVuZCkKLXsKLSAgICBpbnNwZWN0b3JGcm9udGVuZCA9
IHFvYmplY3RfY2FzdDxRV2lkZ2V0Kj4oZnJvbnRlbmQpOwotICAgIGlmIChpbnNwZWN0b3IpCi0g
ICAgICAgIGluc3BlY3Rvci0+ZC0+c2V0RnJvbnRlbmQoZnJvbnRlbmQpOwotfQotCi12b2lkIFFX
ZWJQYWdlUHJpdmF0ZTo6c2V0SW5zcGVjdG9yV2luZG93VGl0bGUoY29uc3QgUVN0cmluZyYgdGl0
bGUpCi17Ci0gICAgaWYgKGluc3BlY3RvcikKLSAgICAgICAgaW5zcGVjdG9yLT5zZXRXaW5kb3dU
aXRsZSh0aXRsZSk7Ci19Ci0KLXZvaWQgUVdlYlBhZ2VQcml2YXRlOjpjcmVhdGVXZWJJbnNwZWN0
b3IoUU9iamVjdCoqIGluc3BlY3RvclZpZXcsIFFXZWJQYWdlQWRhcHRlcioqIGluc3BlY3RvclBh
Z2UpCi17Ci0gICAgUVdlYlBhZ2UqIHBhZ2UgPSBuZXcgV2ViS2l0OjpJbnNwZWN0b3JDbGllbnRX
ZWJQYWdlOwotICAgICppbnNwZWN0b3JWaWV3ID0gcGFnZS0+dmlldygpOwotICAgICppbnNwZWN0
b3JQYWdlID0gcGFnZS0+ZDsKLX0KLQotI2lmbmRlZiBRVF9OT19NRU5VCi1zdGF0aWMgUVN0cmlu
Z0xpc3QgaXRlcmF0ZUNvbnRleHRNZW51KFFNZW51KiBtZW51KQotewotICAgIGlmICghbWVudSkK
LSAgICAgICAgcmV0dXJuIFFTdHJpbmdMaXN0KCk7Ci0KLSAgICBRU3RyaW5nTGlzdCBpdGVtczsK
LSAgICBRTGlzdDxRQWN0aW9uICo+IGFjdGlvbnMgPSBtZW51LT5hY3Rpb25zKCk7Ci0gICAgZm9y
IChpbnQgaSA9IDA7IGkgPCBhY3Rpb25zLmNvdW50KCk7ICsraSkgewotICAgICAgICBpZiAoYWN0
aW9ucy5hdChpKS0+aXNTZXBhcmF0b3IoKSkKLSAgICAgICAgICAgIGl0ZW1zIDw8IFFMYXRpbjFT
dHJpbmcoIjxzZXBhcmF0b3I+Iik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGl0ZW1zIDw8
IGFjdGlvbnMuYXQoaSktPnRleHQoKTsKLSAgICAgICAgaWYgKGFjdGlvbnMuYXQoaSktPm1lbnUo
KSkKLSAgICAgICAgICAgIGl0ZW1zIDw8IGl0ZXJhdGVDb250ZXh0TWVudShhY3Rpb25zLmF0KGkp
LT5tZW51KCkpOwotICAgIH0KLSAgICByZXR1cm4gaXRlbXM7Ci19Ci0jZW5kaWYKLQotUVN0cmlu
Z0xpc3QgUVdlYlBhZ2VQcml2YXRlOjptZW51QWN0aW9uc0FzVGV4dCgpCi17Ci0jaWZuZGVmIFFU
X05PX01FTlUKLSAgICByZXR1cm4gaXRlcmF0ZUNvbnRleHRNZW51KGN1cnJlbnRDb250ZXh0TWVu
dS5kYXRhKCkpOwotI2Vsc2UKLSAgICByZXR1cm4gUVN0cmluZ0xpc3QoKTsKLSNlbmRpZgotfQot
Ci12b2lkIFFXZWJQYWdlUHJpdmF0ZTo6ZW1pdFZpZXdwb3J0Q2hhbmdlUmVxdWVzdGVkKCkKLXsK
LSAgICBlbWl0IHEtPnZpZXdwb3J0Q2hhbmdlUmVxdWVzdGVkKCk7Ci19Ci0KLXZvaWQgUVdlYlBh
Z2VQcml2YXRlOjp1cGRhdGVFZGl0b3JBY3Rpb25zKCkKLXsKLSAgICB1cGRhdGVBY3Rpb24oUVdl
YlBhZ2U6OkN1dCk7Ci0gICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpDb3B5KTsKLSAgICB1cGRh
dGVBY3Rpb24oUVdlYlBhZ2U6OlBhc3RlKTsKLSAgICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6Ok1v
dmVUb05leHRDaGFyKTsKLSAgICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6Ok1vdmVUb1ByZXZpb3Vz
Q2hhcik7Ci0gICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpNb3ZlVG9OZXh0V29yZCk7Ci0gICAg
dXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpNb3ZlVG9QcmV2aW91c1dvcmQpOwotICAgIHVwZGF0ZUFj
dGlvbihRV2ViUGFnZTo6TW92ZVRvTmV4dExpbmUpOwotICAgIHVwZGF0ZUFjdGlvbihRV2ViUGFn
ZTo6TW92ZVRvUHJldmlvdXNMaW5lKTsKLSAgICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6Ok1vdmVU
b1N0YXJ0T2ZMaW5lKTsKLSAgICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6Ok1vdmVUb0VuZE9mTGlu
ZSk7Ci0gICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpNb3ZlVG9TdGFydE9mQmxvY2spOwotICAg
IHVwZGF0ZUFjdGlvbihRV2ViUGFnZTo6TW92ZVRvRW5kT2ZCbG9jayk7Ci0gICAgdXBkYXRlQWN0
aW9uKFFXZWJQYWdlOjpNb3ZlVG9TdGFydE9mRG9jdW1lbnQpOwotICAgIHVwZGF0ZUFjdGlvbihR
V2ViUGFnZTo6TW92ZVRvRW5kT2ZEb2N1bWVudCk7Ci0gICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdl
OjpTZWxlY3ROZXh0Q2hhcik7Ci0gICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpTZWxlY3RQcmV2
aW91c0NoYXIpOwotICAgIHVwZGF0ZUFjdGlvbihRV2ViUGFnZTo6U2VsZWN0TmV4dFdvcmQpOwot
ICAgIHVwZGF0ZUFjdGlvbihRV2ViUGFnZTo6U2VsZWN0UHJldmlvdXNXb3JkKTsKLSAgICB1cGRh
dGVBY3Rpb24oUVdlYlBhZ2U6OlNlbGVjdE5leHRMaW5lKTsKLSAgICB1cGRhdGVBY3Rpb24oUVdl
YlBhZ2U6OlNlbGVjdFByZXZpb3VzTGluZSk7Ci0gICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpT
ZWxlY3RTdGFydE9mTGluZSk7Ci0gICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpTZWxlY3RFbmRP
ZkxpbmUpOwotICAgIHVwZGF0ZUFjdGlvbihRV2ViUGFnZTo6U2VsZWN0U3RhcnRPZkJsb2NrKTsK
LSAgICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6OlNlbGVjdEVuZE9mQmxvY2spOwotICAgIHVwZGF0
ZUFjdGlvbihRV2ViUGFnZTo6U2VsZWN0U3RhcnRPZkRvY3VtZW50KTsKLSAgICB1cGRhdGVBY3Rp
b24oUVdlYlBhZ2U6OlNlbGVjdEVuZE9mRG9jdW1lbnQpOwotICAgIHVwZGF0ZUFjdGlvbihRV2Vi
UGFnZTo6RGVsZXRlU3RhcnRPZldvcmQpOwotICAgIHVwZGF0ZUFjdGlvbihRV2ViUGFnZTo6RGVs
ZXRlRW5kT2ZXb3JkKTsKLSAgICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6OlNldFRleHREaXJlY3Rp
b25EZWZhdWx0KTsKLSAgICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6OlNldFRleHREaXJlY3Rpb25M
ZWZ0VG9SaWdodCk7Ci0gICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpTZXRUZXh0RGlyZWN0aW9u
UmlnaHRUb0xlZnQpOwotICAgIHVwZGF0ZUFjdGlvbihRV2ViUGFnZTo6VG9nZ2xlQm9sZCk7Ci0g
ICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpUb2dnbGVJdGFsaWMpOwotICAgIHVwZGF0ZUFjdGlv
bihRV2ViUGFnZTo6VG9nZ2xlVW5kZXJsaW5lKTsKLSAgICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6
Okluc2VydFBhcmFncmFwaFNlcGFyYXRvcik7Ci0gICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpJ
bnNlcnRMaW5lU2VwYXJhdG9yKTsKLSAgICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6OlBhc3RlQW5k
TWF0Y2hTdHlsZSk7Ci0gICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpSZW1vdmVGb3JtYXQpOwot
ICAgIHVwZGF0ZUFjdGlvbihRV2ViUGFnZTo6VG9nZ2xlU3RyaWtldGhyb3VnaCk7Ci0gICAgdXBk
YXRlQWN0aW9uKFFXZWJQYWdlOjpUb2dnbGVTdWJzY3JpcHQpOwotICAgIHVwZGF0ZUFjdGlvbihR
V2ViUGFnZTo6VG9nZ2xlU3VwZXJzY3JpcHQpOwotICAgIHVwZGF0ZUFjdGlvbihRV2ViUGFnZTo6
SW5zZXJ0VW5vcmRlcmVkTGlzdCk7Ci0gICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpJbnNlcnRP
cmRlcmVkTGlzdCk7Ci0gICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpJbmRlbnQpOwotICAgIHVw
ZGF0ZUFjdGlvbihRV2ViUGFnZTo6T3V0ZGVudCk7Ci0gICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdl
OjpBbGlnbkNlbnRlcik7Ci0gICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpBbGlnbkp1c3RpZmll
ZCk7Ci0gICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpBbGlnbkxlZnQpOwotICAgIHVwZGF0ZUFj
dGlvbihRV2ViUGFnZTo6QWxpZ25SaWdodCk7Ci19Ci0KLXZvaWQgUVdlYlBhZ2VQcml2YXRlOjp0
aW1lckV2ZW50KFFUaW1lckV2ZW50ICpldikKLXsKLSAgICBpbnQgdGltZXJJZCA9IGV2LT50aW1l
cklkKCk7Ci0gICAgaWYgKHRpbWVySWQgPT0gdHJpcGxlQ2xpY2tUaW1lci50aW1lcklkKCkpCi0g
ICAgICAgIHRyaXBsZUNsaWNrVGltZXIuc3RvcCgpOwotICAgIGVsc2UKLSAgICAgICAgcS0+dGlt
ZXJFdmVudChldik7Ci19Ci0KLXZvaWQgUVdlYlBhZ2VQcml2YXRlOjptb3VzZU1vdmVFdmVudChR
TW91c2VFdmVudCogZXYpCi17Ci0gICAgV2ViQ29yZTo6RnJhbWUqIGZyYW1lID0gUVdlYkZyYW1l
UHJpdmF0ZTo6Y29yZShtYWluRnJhbWUuZGF0YSgpKTsKLSAgICBpZiAoIWZyYW1lLT52aWV3KCkp
Ci0gICAgICAgIHJldHVybjsKLQotICAgIGJvb2wgYWNjZXB0ZWQgPSBmcmFtZS0+ZXZlbnRIYW5k
bGVyKCktPm1vdXNlTW92ZWQoY29udmVydE1vdXNlRXZlbnQoZXYsIDApKTsKLSAgICBldi0+c2V0
QWNjZXB0ZWQoYWNjZXB0ZWQpOwotfQotCi12b2lkIFFXZWJQYWdlUHJpdmF0ZTo6bW91c2VQcmVz
c0V2ZW50KFFNb3VzZUV2ZW50KiBldikKLXsKLSAgICBXZWJDb3JlOjpGcmFtZSogZnJhbWUgPSBR
V2ViRnJhbWVQcml2YXRlOjpjb3JlKG1haW5GcmFtZS5kYXRhKCkpOwotICAgIGlmICghZnJhbWUt
PnZpZXcoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgUmVmUHRyPFdlYkNvcmU6Ok5vZGU+IG9s
ZE5vZGU7Ci0gICAgRnJhbWUqIGZvY3VzZWRGcmFtZSA9IHBhZ2UtPmZvY3VzQ29udHJvbGxlcigp
LT5mb2N1c2VkRnJhbWUoKTsKLSAgICBpZiAoRG9jdW1lbnQqIGZvY3VzZWREb2N1bWVudCA9IGZv
Y3VzZWRGcmFtZSA/IGZvY3VzZWRGcmFtZS0+ZG9jdW1lbnQoKSA6IDApCi0gICAgICAgIG9sZE5v
ZGUgPSBmb2N1c2VkRG9jdW1lbnQtPmZvY3VzZWROb2RlKCk7Ci0KLSAgICBpZiAodHJpcGxlQ2xp
Y2tUaW1lci5pc0FjdGl2ZSgpCi0gICAgICAgICAgICAmJiAoZXYtPnBvcygpIC0gdHJpcGxlQ2xp
Y2spLm1hbmhhdHRhbkxlbmd0aCgpCi0gICAgICAgICAgICAgICAgPCBRQXBwbGljYXRpb246OnN0
YXJ0RHJhZ0Rpc3RhbmNlKCkpIHsKLSAgICAgICAgbW91c2VUcmlwbGVDbGlja0V2ZW50KGV2KTsK
LSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGJvb2wgYWNjZXB0ZWQgPSBmYWxzZTsKLSAg
ICBhZGp1c3RQb2ludEZvckNsaWNraW5nKGV2KTsKLSAgICBQbGF0Zm9ybU1vdXNlRXZlbnQgbWV2
ID0gY29udmVydE1vdXNlRXZlbnQoZXYsIDEpOwotICAgIC8vIGlnbm9yZSB0aGUgZXZlbnQgaWYg
d2UgY2FuJ3QgbWFwIFF0J3MgbW91c2UgYnV0dG9ucyB0byBXZWJDb3JlOjpNb3VzZUJ1dHRvbgot
ICAgIGlmIChtZXYuYnV0dG9uKCkgIT0gTm9CdXR0b24pCi0gICAgICAgIGFjY2VwdGVkID0gZnJh
bWUtPmV2ZW50SGFuZGxlcigpLT5oYW5kbGVNb3VzZVByZXNzRXZlbnQobWV2KTsKLSAgICBldi0+
c2V0QWNjZXB0ZWQoYWNjZXB0ZWQpOwotCi0gICAgUmVmUHRyPFdlYkNvcmU6Ok5vZGU+IG5ld05v
ZGU7Ci0gICAgZm9jdXNlZEZyYW1lID0gcGFnZS0+Zm9jdXNDb250cm9sbGVyKCktPmZvY3VzZWRG
cmFtZSgpOwotICAgIGlmIChEb2N1bWVudCogZm9jdXNlZERvY3VtZW50ID0gZm9jdXNlZEZyYW1l
ID8gZm9jdXNlZEZyYW1lLT5kb2N1bWVudCgpIDogMCkKLSAgICAgICAgbmV3Tm9kZSA9IGZvY3Vz
ZWREb2N1bWVudC0+Zm9jdXNlZE5vZGUoKTsKLQotICAgIGlmIChuZXdOb2RlICYmIG9sZE5vZGUg
IT0gbmV3Tm9kZSkKLSAgICAgICAgY2xpY2tDYXVzZWRGb2N1cyA9IHRydWU7Ci19Ci0KLXZvaWQg
UVdlYlBhZ2VQcml2YXRlOjptb3VzZURvdWJsZUNsaWNrRXZlbnQoUU1vdXNlRXZlbnQgKmV2KQot
ewotICAgIFdlYkNvcmU6OkZyYW1lKiBmcmFtZSA9IFFXZWJGcmFtZVByaXZhdGU6OmNvcmUobWFp
bkZyYW1lLmRhdGEoKSk7Ci0gICAgaWYgKCFmcmFtZS0+dmlldygpKQotICAgICAgICByZXR1cm47
Ci0KLSAgICBib29sIGFjY2VwdGVkID0gZmFsc2U7Ci0gICAgUGxhdGZvcm1Nb3VzZUV2ZW50IG1l
diA9IGNvbnZlcnRNb3VzZUV2ZW50KGV2LCAyKTsKLSAgICAvLyBpZ25vcmUgdGhlIGV2ZW50IGlm
IHdlIGNhbid0IG1hcCBRdCdzIG1vdXNlIGJ1dHRvbnMgdG8gV2ViQ29yZTo6TW91c2VCdXR0b24K
LSAgICBpZiAobWV2LmJ1dHRvbigpICE9IE5vQnV0dG9uKQotICAgICAgICBhY2NlcHRlZCA9IGZy
YW1lLT5ldmVudEhhbmRsZXIoKS0+aGFuZGxlTW91c2VQcmVzc0V2ZW50KG1ldik7Ci0gICAgZXYt
PnNldEFjY2VwdGVkKGFjY2VwdGVkKTsKLQotICAgIHRyaXBsZUNsaWNrVGltZXIuc3RhcnQoUUFw
cGxpY2F0aW9uOjpkb3VibGVDbGlja0ludGVydmFsKCksIHEpOwotICAgIHRyaXBsZUNsaWNrID0g
UVBvaW50Rihldi0+cG9zKCkpLnRvUG9pbnQoKTsKLX0KLQotdm9pZCBRV2ViUGFnZVByaXZhdGU6
Om1vdXNlVHJpcGxlQ2xpY2tFdmVudChRTW91c2VFdmVudCAqZXYpCi17Ci0gICAgV2ViQ29yZTo6
RnJhbWUqIGZyYW1lID0gUVdlYkZyYW1lUHJpdmF0ZTo6Y29yZShtYWluRnJhbWUuZGF0YSgpKTsK
LSAgICBpZiAoIWZyYW1lLT52aWV3KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGJvb2wgYWNj
ZXB0ZWQgPSBmYWxzZTsKLSAgICBQbGF0Zm9ybU1vdXNlRXZlbnQgbWV2ID0gY29udmVydE1vdXNl
RXZlbnQoZXYsIDMpOwotICAgIC8vIGlnbm9yZSB0aGUgZXZlbnQgaWYgd2UgY2FuJ3QgbWFwIFF0
J3MgbW91c2UgYnV0dG9ucyB0byBXZWJDb3JlOjpNb3VzZUJ1dHRvbgotICAgIGlmIChtZXYuYnV0
dG9uKCkgIT0gTm9CdXR0b24pCi0gICAgICAgIGFjY2VwdGVkID0gZnJhbWUtPmV2ZW50SGFuZGxl
cigpLT5oYW5kbGVNb3VzZVByZXNzRXZlbnQobWV2KTsKLSAgICBldi0+c2V0QWNjZXB0ZWQoYWNj
ZXB0ZWQpOwotfQotCi12b2lkIFFXZWJQYWdlUHJpdmF0ZTo6bW91c2VSZWxlYXNlRXZlbnQoUU1v
dXNlRXZlbnQgKmV2KQotewotICAgIFdlYkNvcmU6OkZyYW1lKiBmcmFtZSA9IFFXZWJGcmFtZVBy
aXZhdGU6OmNvcmUobWFpbkZyYW1lLmRhdGEoKSk7Ci0gICAgaWYgKCFmcmFtZS0+dmlldygpKQot
ICAgICAgICByZXR1cm47Ci0KLSAgICBib29sIGFjY2VwdGVkID0gZmFsc2U7Ci0gICAgYWRqdXN0
UG9pbnRGb3JDbGlja2luZyhldik7Ci0gICAgUGxhdGZvcm1Nb3VzZUV2ZW50IG1ldiA9IGNvbnZl
cnRNb3VzZUV2ZW50KGV2LCAwKTsKLSAgICAvLyBpZ25vcmUgdGhlIGV2ZW50IGlmIHdlIGNhbid0
IG1hcCBRdCdzIG1vdXNlIGJ1dHRvbnMgdG8gV2ViQ29yZTo6TW91c2VCdXR0b24KLSAgICBpZiAo
bWV2LmJ1dHRvbigpICE9IE5vQnV0dG9uKQotICAgICAgICBhY2NlcHRlZCA9IGZyYW1lLT5ldmVu
dEhhbmRsZXIoKS0+aGFuZGxlTW91c2VSZWxlYXNlRXZlbnQobWV2KTsKLSAgICBldi0+c2V0QWNj
ZXB0ZWQoYWNjZXB0ZWQpOwotCi0gICAgaGFuZGxlU29mdHdhcmVJbnB1dFBhbmVsKGV2LT5idXR0
b24oKSwgUVBvaW50Rihldi0+cG9zKCkpLnRvUG9pbnQoKSk7Ci19Ci0KLXZvaWQgUVdlYlBhZ2VQ
cml2YXRlOjpoYW5kbGVTb2Z0d2FyZUlucHV0UGFuZWwoUXQ6Ok1vdXNlQnV0dG9uIGJ1dHRvbiwg
Y29uc3QgUVBvaW50JiBwb3MpCi17Ci0gICAgRnJhbWUqIGZyYW1lID0gcGFnZS0+Zm9jdXNDb250
cm9sbGVyKCktPmZvY3VzZWRGcmFtZSgpOwotICAgIGlmICghZnJhbWUpCi0gICAgICAgIHJldHVy
bjsKLQotICAgIGlmIChjbGllbnQgJiYgY2xpZW50LT5pbnB1dE1ldGhvZEVuYWJsZWQoKQotICAg
ICAgICAmJiBmcmFtZS0+ZG9jdW1lbnQoKS0+Zm9jdXNlZE5vZGUoKQotICAgICAgICAmJiBidXR0
b24gPT0gUXQ6OkxlZnRCdXR0b24gJiYgcUFwcC0+YXV0b1NpcEVuYWJsZWQoKSkgewotICAgICAg
ICBRU3R5bGU6OlJlcXVlc3RTb2Z0d2FyZUlucHV0UGFuZWwgYmVoYXZpb3IgPSBRU3R5bGU6OlJl
cXVlc3RTb2Z0d2FyZUlucHV0UGFuZWwoCi0gICAgICAgICAgICBjbGllbnQtPnN0eWxlKCktPnN0
eWxlSGludChRU3R5bGU6OlNIX1JlcXVlc3RTb2Z0d2FyZUlucHV0UGFuZWwpKTsKLSAgICAgICAg
aWYgKCFjbGlja0NhdXNlZEZvY3VzIHx8IGJlaGF2aW9yID09IFFTdHlsZTo6UlNJUF9Pbk1vdXNl
Q2xpY2spIHsKLSAgICAgICAgICAgIEhpdFRlc3RSZXN1bHQgcmVzdWx0ID0gZnJhbWUtPmV2ZW50
SGFuZGxlcigpLT5oaXRUZXN0UmVzdWx0QXRQb2ludChmcmFtZS0+dmlldygpLT53aW5kb3dUb0Nv
bnRlbnRzKHBvcyksIGZhbHNlKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQuaXNDb250ZW50RWRp
dGFibGUoKSkgewotICAgICAgICAgICAgICAgIFFFdmVudCBldmVudChRRXZlbnQ6OlJlcXVlc3RT
b2Z0d2FyZUlucHV0UGFuZWwpOwotICAgICAgICAgICAgICAgIFFBcHBsaWNhdGlvbjo6c2VuZEV2
ZW50KGNsaWVudC0+b3duZXJXaWRnZXQoKSwgJmV2ZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgfQotICAgIH0KLQotICAgIGNsaWNrQ2F1c2VkRm9jdXMgPSBmYWxzZTsKLX0KLQotI2lmbmRl
ZiBRVF9OT19DT05URVhUTUVOVQotdm9pZCBRV2ViUGFnZVByaXZhdGU6OmNvbnRleHRNZW51RXZl
bnQoY29uc3QgUVBvaW50JiBnbG9iYWxQb3MpCi17Ci0gICAgUU1lbnUgKm1lbnUgPSBxLT5jcmVh
dGVTdGFuZGFyZENvbnRleHRNZW51KCk7Ci0gICAgaWYgKG1lbnUpIHsKLSAgICAgICAgbWVudS0+
ZXhlYyhnbG9iYWxQb3MpOwotICAgICAgICBkZWxldGUgbWVudTsKLSAgICB9Ci19Ci0jZW5kaWYg
Ly8gUVRfTk9fQ09OVEVYVE1FTlUKLQotLyohCi0gICAgXHNpbmNlIDQuNQotICAgIFRoaXMgZnVu
Y3Rpb24gY3JlYXRlcyB0aGUgc3RhbmRhcmQgY29udGV4dCBtZW51IHdoaWNoIGlzIHNob3duIHdo
ZW4KLSAgICB0aGUgdXNlciBjbGlja3Mgb24gdGhlIHdlYiBwYWdlIHdpdGggdGhlIHJpZ2h0IG1v
dXNlIGJ1dHRvbi4gSXQgaXMKLSAgICBjYWxsZWQgZnJvbSB0aGUgZGVmYXVsdCBjb250ZXh0TWVu
dUV2ZW50KCkgaGFuZGxlci4gVGhlIHBvcHVwIG1lbnUncwotICAgIG93bmVyc2hpcCBpcyB0cmFu
c2ZlcnJlZCB0byB0aGUgY2FsbGVyLgotICovCi1RTWVudSAqUVdlYlBhZ2U6OmNyZWF0ZVN0YW5k
YXJkQ29udGV4dE1lbnUoKQotewotI2lmbmRlZiBRVF9OT19DT05URVhUTUVOVQotICAgIFFNZW51
KiBtZW51ID0gZC0+Y3VycmVudENvbnRleHRNZW51LmRhdGEoKTsKLSAgICBkLT5jdXJyZW50Q29u
dGV4dE1lbnUgPSAwOwotICAgIHJldHVybiBtZW51OwotI2Vsc2UKLSAgICByZXR1cm4gMDsKLSNl
bmRpZgotfQotCi0jaWZuZGVmIFFUX05PX1dIRUVMRVZFTlQKLXZvaWQgUVdlYlBhZ2VQcml2YXRl
Ojp3aGVlbEV2ZW50KFFXaGVlbEV2ZW50ICpldikKLXsKLSAgICBXZWJDb3JlOjpGcmFtZSogZnJh
bWUgPSBRV2ViRnJhbWVQcml2YXRlOjpjb3JlKG1haW5GcmFtZS5kYXRhKCkpOwotICAgIGlmICgh
ZnJhbWUtPnZpZXcoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgUGxhdGZvcm1XaGVlbEV2ZW50
IHBldiA9IGNvbnZlcnRXaGVlbEV2ZW50KGV2LCBRQXBwbGljYXRpb246OndoZWVsU2Nyb2xsTGlu
ZXMoKSk7Ci0gICAgYm9vbCBhY2NlcHRlZCA9IGZyYW1lLT5ldmVudEhhbmRsZXIoKS0+aGFuZGxl
V2hlZWxFdmVudChwZXYpOwotICAgIGV2LT5zZXRBY2NlcHRlZChhY2NlcHRlZCk7Ci19Ci0jZW5k
aWYgLy8gUVRfTk9fV0hFRUxFVkVOVAotCi0jaWZuZGVmIFFUX05PX1NIT1JUQ1VUCi1RV2ViUGFn
ZTo6V2ViQWN0aW9uIFFXZWJQYWdlUHJpdmF0ZTo6ZWRpdG9yQWN0aW9uRm9yS2V5RXZlbnQoUUtl
eUV2ZW50KiBldmVudCkKLXsKLSAgICBzdGF0aWMgc3RydWN0IHsKLSAgICAgICAgUUtleVNlcXVl
bmNlOjpTdGFuZGFyZEtleSBzdGFuZGFyZEtleTsKLSAgICAgICAgUVdlYlBhZ2U6OldlYkFjdGlv
biBhY3Rpb247Ci0gICAgfSBlZGl0b3JBY3Rpb25zW10gPSB7Ci0gICAgICAgIHsgUUtleVNlcXVl
bmNlOjpDdXQsIFFXZWJQYWdlOjpDdXQgfSwKLSAgICAgICAgeyBRS2V5U2VxdWVuY2U6OkNvcHks
IFFXZWJQYWdlOjpDb3B5IH0sCi0gICAgICAgIHsgUUtleVNlcXVlbmNlOjpQYXN0ZSwgUVdlYlBh
Z2U6OlBhc3RlIH0sCi0gICAgICAgIHsgUUtleVNlcXVlbmNlOjpVbmRvLCBRV2ViUGFnZTo6VW5k
byB9LAotICAgICAgICB7IFFLZXlTZXF1ZW5jZTo6UmVkbywgUVdlYlBhZ2U6OlJlZG8gfSwKLSAg
ICAgICAgeyBRS2V5U2VxdWVuY2U6Ok1vdmVUb05leHRDaGFyLCBRV2ViUGFnZTo6TW92ZVRvTmV4
dENoYXIgfSwKLSAgICAgICAgeyBRS2V5U2VxdWVuY2U6Ok1vdmVUb1ByZXZpb3VzQ2hhciwgUVdl
YlBhZ2U6Ok1vdmVUb1ByZXZpb3VzQ2hhciB9LAotICAgICAgICB7IFFLZXlTZXF1ZW5jZTo6TW92
ZVRvTmV4dFdvcmQsIFFXZWJQYWdlOjpNb3ZlVG9OZXh0V29yZCB9LAotICAgICAgICB7IFFLZXlT
ZXF1ZW5jZTo6TW92ZVRvUHJldmlvdXNXb3JkLCBRV2ViUGFnZTo6TW92ZVRvUHJldmlvdXNXb3Jk
IH0sCi0gICAgICAgIHsgUUtleVNlcXVlbmNlOjpNb3ZlVG9OZXh0TGluZSwgUVdlYlBhZ2U6Ok1v
dmVUb05leHRMaW5lIH0sCi0gICAgICAgIHsgUUtleVNlcXVlbmNlOjpNb3ZlVG9QcmV2aW91c0xp
bmUsIFFXZWJQYWdlOjpNb3ZlVG9QcmV2aW91c0xpbmUgfSwKLSAgICAgICAgeyBRS2V5U2VxdWVu
Y2U6Ok1vdmVUb1N0YXJ0T2ZMaW5lLCBRV2ViUGFnZTo6TW92ZVRvU3RhcnRPZkxpbmUgfSwKLSAg
ICAgICAgeyBRS2V5U2VxdWVuY2U6Ok1vdmVUb0VuZE9mTGluZSwgUVdlYlBhZ2U6Ok1vdmVUb0Vu
ZE9mTGluZSB9LAotICAgICAgICB7IFFLZXlTZXF1ZW5jZTo6TW92ZVRvU3RhcnRPZkJsb2NrLCBR
V2ViUGFnZTo6TW92ZVRvU3RhcnRPZkJsb2NrIH0sCi0gICAgICAgIHsgUUtleVNlcXVlbmNlOjpN
b3ZlVG9FbmRPZkJsb2NrLCBRV2ViUGFnZTo6TW92ZVRvRW5kT2ZCbG9jayB9LAotICAgICAgICB7
IFFLZXlTZXF1ZW5jZTo6TW92ZVRvU3RhcnRPZkRvY3VtZW50LCBRV2ViUGFnZTo6TW92ZVRvU3Rh
cnRPZkRvY3VtZW50IH0sCi0gICAgICAgIHsgUUtleVNlcXVlbmNlOjpNb3ZlVG9FbmRPZkRvY3Vt
ZW50LCBRV2ViUGFnZTo6TW92ZVRvRW5kT2ZEb2N1bWVudCB9LAotICAgICAgICB7IFFLZXlTZXF1
ZW5jZTo6U2VsZWN0TmV4dENoYXIsIFFXZWJQYWdlOjpTZWxlY3ROZXh0Q2hhciB9LAotICAgICAg
ICB7IFFLZXlTZXF1ZW5jZTo6U2VsZWN0UHJldmlvdXNDaGFyLCBRV2ViUGFnZTo6U2VsZWN0UHJl
dmlvdXNDaGFyIH0sCi0gICAgICAgIHsgUUtleVNlcXVlbmNlOjpTZWxlY3ROZXh0V29yZCwgUVdl
YlBhZ2U6OlNlbGVjdE5leHRXb3JkIH0sCi0gICAgICAgIHsgUUtleVNlcXVlbmNlOjpTZWxlY3RQ
cmV2aW91c1dvcmQsIFFXZWJQYWdlOjpTZWxlY3RQcmV2aW91c1dvcmQgfSwKLSAgICAgICAgeyBR
S2V5U2VxdWVuY2U6OlNlbGVjdE5leHRMaW5lLCBRV2ViUGFnZTo6U2VsZWN0TmV4dExpbmUgfSwK
LSAgICAgICAgeyBRS2V5U2VxdWVuY2U6OlNlbGVjdFByZXZpb3VzTGluZSwgUVdlYlBhZ2U6OlNl
bGVjdFByZXZpb3VzTGluZSB9LAotICAgICAgICB7IFFLZXlTZXF1ZW5jZTo6U2VsZWN0U3RhcnRP
ZkxpbmUsIFFXZWJQYWdlOjpTZWxlY3RTdGFydE9mTGluZSB9LAotICAgICAgICB7IFFLZXlTZXF1
ZW5jZTo6U2VsZWN0RW5kT2ZMaW5lLCBRV2ViUGFnZTo6U2VsZWN0RW5kT2ZMaW5lIH0sCi0gICAg
ICAgIHsgUUtleVNlcXVlbmNlOjpTZWxlY3RTdGFydE9mQmxvY2ssIFFXZWJQYWdlOjpTZWxlY3RT
dGFydE9mQmxvY2sgfSwKLSAgICAgICAgeyBRS2V5U2VxdWVuY2U6OlNlbGVjdEVuZE9mQmxvY2ss
ICBRV2ViUGFnZTo6U2VsZWN0RW5kT2ZCbG9jayB9LAotICAgICAgICB7IFFLZXlTZXF1ZW5jZTo6
U2VsZWN0U3RhcnRPZkRvY3VtZW50LCBRV2ViUGFnZTo6U2VsZWN0U3RhcnRPZkRvY3VtZW50IH0s
Ci0gICAgICAgIHsgUUtleVNlcXVlbmNlOjpTZWxlY3RFbmRPZkRvY3VtZW50LCBRV2ViUGFnZTo6
U2VsZWN0RW5kT2ZEb2N1bWVudCB9LAotICAgICAgICB7IFFLZXlTZXF1ZW5jZTo6RGVsZXRlU3Rh
cnRPZldvcmQsIFFXZWJQYWdlOjpEZWxldGVTdGFydE9mV29yZCB9LAotICAgICAgICB7IFFLZXlT
ZXF1ZW5jZTo6RGVsZXRlRW5kT2ZXb3JkLCBRV2ViUGFnZTo6RGVsZXRlRW5kT2ZXb3JkIH0sCi0g
ICAgICAgIHsgUUtleVNlcXVlbmNlOjpJbnNlcnRQYXJhZ3JhcGhTZXBhcmF0b3IsIFFXZWJQYWdl
OjpJbnNlcnRQYXJhZ3JhcGhTZXBhcmF0b3IgfSwKLSAgICAgICAgeyBRS2V5U2VxdWVuY2U6Oklu
c2VydExpbmVTZXBhcmF0b3IsIFFXZWJQYWdlOjpJbnNlcnRMaW5lU2VwYXJhdG9yIH0sCi0gICAg
ICAgIHsgUUtleVNlcXVlbmNlOjpTZWxlY3RBbGwsIFFXZWJQYWdlOjpTZWxlY3RBbGwgfSwKLSAg
ICAgICAgeyBRS2V5U2VxdWVuY2U6OlVua25vd25LZXksIFFXZWJQYWdlOjpOb1dlYkFjdGlvbiB9
Ci0gICAgfTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBlZGl0b3JBY3Rpb25zW2ldLnN0YW5kYXJk
S2V5ICE9IFFLZXlTZXF1ZW5jZTo6VW5rbm93bktleTsgKytpKQotICAgICAgICBpZiAoZXZlbnQg
PT0gZWRpdG9yQWN0aW9uc1tpXS5zdGFuZGFyZEtleSkKLSAgICAgICAgICAgIHJldHVybiBlZGl0
b3JBY3Rpb25zW2ldLmFjdGlvbjsKLQotICAgIHJldHVybiBRV2ViUGFnZTo6Tm9XZWJBY3Rpb247
Ci19Ci0jZW5kaWYgLy8gUVRfTk9fU0hPUlRDVVQKLQotdm9pZCBRV2ViUGFnZVByaXZhdGU6Omtl
eVByZXNzRXZlbnQoUUtleUV2ZW50ICpldikKLXsKLSAgICBib29sIGhhbmRsZWQgPSBmYWxzZTsK
LSAgICBXZWJDb3JlOjpGcmFtZSogZnJhbWUgPSBwYWdlLT5mb2N1c0NvbnRyb2xsZXIoKS0+Zm9j
dXNlZE9yTWFpbkZyYW1lKCk7Ci0gICAgLy8gd2UgZm9yd2FyZCB0aGUga2V5IGV2ZW50IHRvIFdl
YkNvcmUgZmlyc3QgdG8gaGFuZGxlIHBvdGVudGlhbCBET00KLSAgICAvLyBkZWZpbmVkIGV2ZW50
IGhhbmRsZXJzIGFuZCBsYXRlciBvbiBlbmQgdXAgaW4gRWRpdG9yQ2xpZW50UXQ6OmhhbmRsZUtl
eWJvYXJkRXZlbnQKLSAgICAvLyB0byB0cmlnZ2VyIGVkaXRvciBjb21tYW5kcyB2aWEgdHJpZ2dl
ckFjdGlvbigpLgotICAgIGlmICghaGFuZGxlZCkKLSAgICAgICAgaGFuZGxlZCA9IGZyYW1lLT5l
dmVudEhhbmRsZXIoKS0+a2V5RXZlbnQoZXYpOwotICAgIGlmICghaGFuZGxlZCkgewotICAgICAg
ICBoYW5kbGVkID0gdHJ1ZTsKLSAgICAgICAgaWYgKCFoYW5kbGVTY3JvbGxpbmcoZXYsIGZyYW1l
KSkgewotICAgICAgICAgICAgc3dpdGNoIChldi0+a2V5KCkpIHsKLSAgICAgICAgICAgIGNhc2Ug
UXQ6OktleV9CYWNrOgotICAgICAgICAgICAgICAgIHEtPnRyaWdnZXJBY3Rpb24oUVdlYlBhZ2U6
OkJhY2spOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBRdDo6S2V5
X0ZvcndhcmQ6Ci0gICAgICAgICAgICAgICAgcS0+dHJpZ2dlckFjdGlvbihRV2ViUGFnZTo6Rm9y
d2FyZCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFF0OjpLZXlf
U3RvcDoKLSAgICAgICAgICAgICAgICBxLT50cmlnZ2VyQWN0aW9uKFFXZWJQYWdlOjpTdG9wKTsK
LSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUXQ6OktleV9SZWZyZXNo
OgotICAgICAgICAgICAgICAgIHEtPnRyaWdnZXJBY3Rpb24oUVdlYlBhZ2U6OlJlbG9hZCk7Ci0g
ICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFF0OjpLZXlfQmFja3NwYWNl
OgotICAgICAgICAgICAgICAgIGlmIChldi0+bW9kaWZpZXJzKCkgPT0gUXQ6OlNoaWZ0TW9kaWZp
ZXIpCi0gICAgICAgICAgICAgICAgICAgIHEtPnRyaWdnZXJBY3Rpb24oUVdlYlBhZ2U6OkZvcndh
cmQpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcS0+dHJpZ2dl
ckFjdGlvbihRV2ViUGFnZTo6QmFjayk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
ICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGhhbmRsZWQgPSBmYWxzZTsKLSAgICAgICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGV2
LT5zZXRBY2NlcHRlZChoYW5kbGVkKTsKLX0KLQotdm9pZCBRV2ViUGFnZVByaXZhdGU6OmtleVJl
bGVhc2VFdmVudChRS2V5RXZlbnQgKmV2KQotewotICAgIGlmIChldi0+aXNBdXRvUmVwZWF0KCkp
IHsKLSAgICAgICAgZXYtPnNldEFjY2VwdGVkKHRydWUpOwotICAgICAgICByZXR1cm47Ci0gICAg
fQotCi0gICAgV2ViQ29yZTo6RnJhbWUqIGZyYW1lID0gcGFnZS0+Zm9jdXNDb250cm9sbGVyKCkt
PmZvY3VzZWRPck1haW5GcmFtZSgpOwotICAgIGJvb2wgaGFuZGxlZCA9IGZyYW1lLT5ldmVudEhh
bmRsZXIoKS0+a2V5RXZlbnQoZXYpOwotICAgIGV2LT5zZXRBY2NlcHRlZChoYW5kbGVkKTsKLX0K
LQotdm9pZCBRV2ViUGFnZVByaXZhdGU6OmZvY3VzSW5FdmVudChRRm9jdXNFdmVudCopCi17Ci0g
ICAgRm9jdXNDb250cm9sbGVyICpmb2N1c0NvbnRyb2xsZXIgPSBwYWdlLT5mb2N1c0NvbnRyb2xs
ZXIoKTsKLSAgICBmb2N1c0NvbnRyb2xsZXItPnNldEFjdGl2ZSh0cnVlKTsKLSAgICBmb2N1c0Nv
bnRyb2xsZXItPnNldEZvY3VzZWQodHJ1ZSk7Ci0gICAgaWYgKCFmb2N1c0NvbnRyb2xsZXItPmZv
Y3VzZWRGcmFtZSgpKQotICAgICAgICBmb2N1c0NvbnRyb2xsZXItPnNldEZvY3VzZWRGcmFtZShR
V2ViRnJhbWVQcml2YXRlOjpjb3JlKG1haW5GcmFtZS5kYXRhKCkpKTsKLX0KLQotdm9pZCBRV2Vi
UGFnZVByaXZhdGU6OmZvY3VzT3V0RXZlbnQoUUZvY3VzRXZlbnQqKQotewotICAgIC8vIG9ubHkg
c2V0IHRoZSBmb2N1c2VkIGZyYW1lIGluYWN0aXZlIHNvIHRoYXQgd2Ugc3RvcCBwYWludGluZyB0
aGUgY2FyZXQKLSAgICAvLyBhbmQgdGhlIGZvY3VzIGZyYW1lLiBCdXQgZG9uJ3QgdGVsbCB0aGUg
Zm9jdXMgY29udHJvbGxlciBzbyB0aGF0IHVwb24KLSAgICAvLyBmb2N1c0luRXZlbnQoKSB3ZSBj
YW4gcmUtYWN0aXZhdGUgdGhlIGZyYW1lLgotICAgIEZvY3VzQ29udHJvbGxlciAqZm9jdXNDb250
cm9sbGVyID0gcGFnZS0+Zm9jdXNDb250cm9sbGVyKCk7Ci0gICAgLy8gQ2FsbCBzZXRGb2N1c2Vk
IGZpcnN0IHNvIHRoYXQgd2luZG93Lm9uYmx1ciBkb2Vzbid0IGdldCBjYWxsZWQgdHdpY2UKLSAg
ICBmb2N1c0NvbnRyb2xsZXItPnNldEZvY3VzZWQoZmFsc2UpOwotICAgIGZvY3VzQ29udHJvbGxl
ci0+c2V0QWN0aXZlKGZhbHNlKTsKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVD4KLXZvaWQgUVdlYlBh
Z2VQcml2YXRlOjpkcmFnRW50ZXJFdmVudChUKiBldikKLXsKLSNpZm5kZWYgUVRfTk9fRFJBR0FO
RERST1AKLSAgICBEcmFnRGF0YSBkcmFnRGF0YShldi0+bWltZURhdGEoKSwgUVBvaW50Rihldi0+
cG9zKCkpLnRvUG9pbnQoKSwKLSAgICAgICAgICAgIFFDdXJzb3I6OnBvcygpLCBkcm9wQWN0aW9u
VG9EcmFnT3AoZXYtPnBvc3NpYmxlQWN0aW9ucygpKSk7Ci0gICAgUXQ6OkRyb3BBY3Rpb24gYWN0
aW9uID0gZHJhZ09wVG9Ecm9wQWN0aW9uKHBhZ2UtPmRyYWdDb250cm9sbGVyKCktPmRyYWdFbnRl
cmVkKCZkcmFnRGF0YSkub3BlcmF0aW9uKTsKLSAgICBldi0+c2V0RHJvcEFjdGlvbihhY3Rpb24p
OwotICAgIGV2LT5hY2NlcHRQcm9wb3NlZEFjdGlvbigpOwotI2VuZGlmCi19Ci0KLXRlbXBsYXRl
PGNsYXNzIFQ+Ci12b2lkIFFXZWJQYWdlUHJpdmF0ZTo6ZHJhZ0xlYXZlRXZlbnQoVCAqZXYpCi17
Ci0jaWZuZGVmIFFUX05PX0RSQUdBTkREUk9QCi0gICAgRHJhZ0RhdGEgZHJhZ0RhdGEoMCwgSW50
UG9pbnQoKSwgUUN1cnNvcjo6cG9zKCksIERyYWdPcGVyYXRpb25Ob25lKTsKLSAgICBwYWdlLT5k
cmFnQ29udHJvbGxlcigpLT5kcmFnRXhpdGVkKCZkcmFnRGF0YSk7Ci0gICAgZXYtPmFjY2VwdCgp
OwotI2VuZGlmCi19Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+Ci12b2lkIFFXZWJQYWdlUHJpdmF0ZTo6
ZHJhZ01vdmVFdmVudChUICpldikKLXsKLSNpZm5kZWYgUVRfTk9fRFJBR0FORERST1AKLSAgICBE
cmFnRGF0YSBkcmFnRGF0YShldi0+bWltZURhdGEoKSwgUVBvaW50Rihldi0+cG9zKCkpLnRvUG9p
bnQoKSwKLSAgICAgICAgICAgIFFDdXJzb3I6OnBvcygpLCBkcm9wQWN0aW9uVG9EcmFnT3AoZXYt
PnBvc3NpYmxlQWN0aW9ucygpKSk7Ci0gICAgbV9sYXN0RHJvcEFjdGlvbiA9IGRyYWdPcFRvRHJv
cEFjdGlvbihwYWdlLT5kcmFnQ29udHJvbGxlcigpLT5kcmFnVXBkYXRlZCgmZHJhZ0RhdGEpLm9w
ZXJhdGlvbik7Ci0gICAgZXYtPnNldERyb3BBY3Rpb24obV9sYXN0RHJvcEFjdGlvbik7Ci0gICAg
aWYgKG1fbGFzdERyb3BBY3Rpb24gIT0gUXQ6Oklnbm9yZUFjdGlvbikKLSAgICAgICAgZXYtPmFj
Y2VwdCgpOwotI2VuZGlmCi19Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+Ci12b2lkIFFXZWJQYWdlUHJp
dmF0ZTo6ZHJvcEV2ZW50KFQgKmV2KQotewotI2lmbmRlZiBRVF9OT19EUkFHQU5ERFJPUAotICAg
IERyYWdEYXRhIGRyYWdEYXRhKGV2LT5taW1lRGF0YSgpLCBRUG9pbnRGKGV2LT5wb3MoKSkudG9Q
b2ludCgpLAotICAgICAgICAgICAgUUN1cnNvcjo6cG9zKCksIGRyb3BBY3Rpb25Ub0RyYWdPcChl
di0+cG9zc2libGVBY3Rpb25zKCkpKTsKLSAgICBpZiAocGFnZS0+ZHJhZ0NvbnRyb2xsZXIoKS0+
cGVyZm9ybURyYWcoJmRyYWdEYXRhKSkgewotICAgICAgICBldi0+c2V0RHJvcEFjdGlvbihtX2xh
c3REcm9wQWN0aW9uKTsKLSAgICAgICAgZXYtPmFjY2VwdCgpOwotICAgIH0KLSNlbmRpZgotfQot
Ci12b2lkIFFXZWJQYWdlUHJpdmF0ZTo6bGVhdmVFdmVudChRRXZlbnQqKQotewotICAgIC8vIEZh
a2UgYSBtb3VzZSBtb3ZlIGV2ZW50IGp1c3Qgb3V0c2lkZSBvZiB0aGUgd2lkZ2V0LCBzaW5jZSBh
bGwKLSAgICAvLyB0aGUgaW50ZXJlc3RpbmcgbW91c2Utb3V0IGJlaGF2aW9yIGxpa2UgaW52YWxp
ZGF0aW5nIHNjcm9sbGJhcnMKLSAgICAvLyBpcyBoYW5kbGVkIGJ5IHRoZSBXZWJLaXQgZXZlbnQg
aGFuZGxlcidzIG1vdXNlTW92ZWQgZnVuY3Rpb24uCi0gICAgUU1vdXNlRXZlbnQgZmFrZUV2ZW50
KFFFdmVudDo6TW91c2VNb3ZlLCBRQ3Vyc29yOjpwb3MoKSwgUXQ6Ok5vQnV0dG9uLCBRdDo6Tm9C
dXR0b24sIFF0OjpOb01vZGlmaWVyKTsKLSAgICBtb3VzZU1vdmVFdmVudCgmZmFrZUV2ZW50KTsK
LX0KLQotLyohCi0gICAgXHByb3BlcnR5IFFXZWJQYWdlOjpwYWxldHRlCi0gICAgXGJyaWVmIHRo
ZSBwYWdlJ3MgcGFsZXR0ZQotCi0gICAgVGhlIGJhc2UgYnJ1c2ggb2YgdGhlIHBhbGV0dGUgaXMg
dXNlZCB0byBkcmF3IHRoZSBiYWNrZ3JvdW5kIG9mIHRoZSBtYWluIGZyYW1lLgotCi0gICAgQnkg
ZGVmYXVsdCwgdGhpcyBwcm9wZXJ0eSBjb250YWlucyB0aGUgYXBwbGljYXRpb24ncyBkZWZhdWx0
IHBhbGV0dGUuCi0qLwotdm9pZCBRV2ViUGFnZTo6c2V0UGFsZXR0ZShjb25zdCBRUGFsZXR0ZSAm
cGFsKQotewotICAgIGQtPnBhbGV0dGUgPSBwYWw7Ci0gICAgaWYgKCFkLT5tYWluRnJhbWUgfHwg
IWQtPm1haW5GcmFtZS5kYXRhKCktPmQtPmZyYW1lLT52aWV3KCkpCi0gICAgICAgIHJldHVybjsK
LQotICAgIFFCcnVzaCBicnVzaCA9IHBhbC5icnVzaChRUGFsZXR0ZTo6QmFzZSk7Ci0gICAgUUNv
bG9yIGJhY2tncm91bmRDb2xvciA9IGJydXNoLnN0eWxlKCkgPT0gUXQ6OlNvbGlkUGF0dGVybiA/
IGJydXNoLmNvbG9yKCkgOiBRQ29sb3IoKTsKLSAgICBRV2ViRnJhbWVQcml2YXRlOjpjb3JlKGQt
Pm1haW5GcmFtZS5kYXRhKCkpLT52aWV3KCktPnVwZGF0ZUJhY2tncm91bmRSZWN1cnNpdmVseShi
YWNrZ3JvdW5kQ29sb3IsICFiYWNrZ3JvdW5kQ29sb3IuYWxwaGEoKSk7Ci19Ci0KLVFQYWxldHRl
IFFXZWJQYWdlOjpwYWxldHRlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZC0+cGFsZXR0ZTsKLX0K
LQotdm9pZCBRV2ViUGFnZVByaXZhdGU6OmlucHV0TWV0aG9kRXZlbnQoUUlucHV0TWV0aG9kRXZl
bnQgKmV2KQotewotICAgIFdlYkNvcmU6OkZyYW1lICpmcmFtZSA9IHBhZ2UtPmZvY3VzQ29udHJv
bGxlcigpLT5mb2N1c2VkT3JNYWluRnJhbWUoKTsKLSAgICBXZWJDb3JlOjpFZGl0b3IgKmVkaXRv
ciA9IGZyYW1lLT5lZGl0b3IoKTsKLQotICAgIGlmICghZWRpdG9yLT5jYW5FZGl0KCkpIHsKLSAg
ICAgICAgZXYtPmlnbm9yZSgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgTm9kZSog
bm9kZSA9IDA7Ci0gICAgaWYgKGZyYW1lLT5zZWxlY3Rpb24oKS0+cm9vdEVkaXRhYmxlRWxlbWVu
dCgpKQotICAgICAgICBub2RlID0gZnJhbWUtPnNlbGVjdGlvbigpLT5yb290RWRpdGFibGVFbGVt
ZW50KCktPnNoYWRvd0FuY2VzdG9yTm9kZSgpOwotCi0gICAgVmVjdG9yPENvbXBvc2l0aW9uVW5k
ZXJsaW5lPiB1bmRlcmxpbmVzOwotICAgIGJvb2wgaGFzU2VsZWN0aW9uID0gZmFsc2U7Ci0KLSAg
ICBmb3IgKGludCBpID0gMDsgaSA8IGV2LT5hdHRyaWJ1dGVzKCkuc2l6ZSgpOyArK2kpIHsKLSAg
ICAgICAgY29uc3QgUUlucHV0TWV0aG9kRXZlbnQ6OkF0dHJpYnV0ZSYgYSA9IGV2LT5hdHRyaWJ1
dGVzKCkuYXQoaSk7Ci0gICAgICAgIHN3aXRjaCAoYS50eXBlKSB7Ci0gICAgICAgIGNhc2UgUUlu
cHV0TWV0aG9kRXZlbnQ6OlRleHRGb3JtYXQ6IHsKLSAgICAgICAgICAgIFFUZXh0Q2hhckZvcm1h
dCB0ZXh0Q2hhckZvcm1hdCA9IGEudmFsdWUudmFsdWU8UVRleHRGb3JtYXQ+KCkudG9DaGFyRm9y
bWF0KCk7Ci0gICAgICAgICAgICBRQ29sb3IgcWNvbG9yID0gdGV4dENoYXJGb3JtYXQudW5kZXJs
aW5lQ29sb3IoKTsKLSAgICAgICAgICAgIHVuZGVybGluZXMuYXBwZW5kKENvbXBvc2l0aW9uVW5k
ZXJsaW5lKHFNaW4oYS5zdGFydCwgKGEuc3RhcnQgKyBhLmxlbmd0aCkpLCBxTWF4KGEuc3RhcnQs
IChhLnN0YXJ0ICsgYS5sZW5ndGgpKSwgQ29sb3IobWFrZVJHQkEocWNvbG9yLnJlZCgpLCBxY29s
b3IuZ3JlZW4oKSwgcWNvbG9yLmJsdWUoKSwgcWNvbG9yLmFscGhhKCkpKSwgZmFsc2UpKTsKLSAg
ICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgUUlucHV0TWV0aG9kRXZl
bnQ6OkN1cnNvcjogewotICAgICAgICAgICAgZnJhbWUtPnNlbGVjdGlvbigpLT5zZXRDYXJldFZp
c2libGUoYS5sZW5ndGgpOyAvL2lmIGxlbmd0aCBpcyAwIGN1cnNvciBpcyBpbnZpc2libGUKLSAg
ICAgICAgICAgIGlmIChhLmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgICAgICBSZW5kZXJPYmpl
Y3QqIGNhcmV0UmVuZGVyZXIgPSBmcmFtZS0+c2VsZWN0aW9uKCktPmNhcmV0UmVuZGVyZXIoKTsK
LSAgICAgICAgICAgICAgICBpZiAoY2FyZXRSZW5kZXJlcikgewotICAgICAgICAgICAgICAgICAg
ICBRQ29sb3IgcWNvbG9yID0gYS52YWx1ZS52YWx1ZTxRQ29sb3I+KCk7Ci0gICAgICAgICAgICAg
ICAgICAgIGNhcmV0UmVuZGVyZXItPnN0eWxlKCktPnNldENvbG9yKENvbG9yKG1ha2VSR0JBKHFj
b2xvci5yZWQoKSwgcWNvbG9yLmdyZWVuKCksIHFjb2xvci5ibHVlKCksIHFjb2xvci5hbHBoYSgp
KSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgUUlucHV0TWV0aG9kRXZlbnQ6OlNlbGVjdGlvbjog
ewotICAgICAgICAgICAgaGFzU2VsZWN0aW9uID0gdHJ1ZTsKLSAgICAgICAgICAgIC8vIEEgc2Vs
ZWN0aW9uIGluIHRoZSBpbnB1dE1ldGhvZEV2ZW50IGlzIGFsd2F5cyByZWZsZWN0ZWQgaW4gdGhl
IHZpc2libGUgdGV4dAotICAgICAgICAgICAgaWYgKG5vZGUpIHsKLSAgICAgICAgICAgICAgICBp
ZiAoSFRNTFRleHRGb3JtQ29udHJvbEVsZW1lbnQqIHRleHRDb250cm9sID0gdG9UZXh0Rm9ybUNv
bnRyb2wobm9kZSkpCi0gICAgICAgICAgICAgICAgICAgIHRleHRDb250cm9sLT5zZXRTZWxlY3Rp
b25SYW5nZShxTWluKGEuc3RhcnQsIChhLnN0YXJ0ICsgYS5sZW5ndGgpKSwgcU1heChhLnN0YXJ0
LCAoYS5zdGFydCArIGEubGVuZ3RoKSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBp
ZiAoIWV2LT5wcmVlZGl0U3RyaW5nKCkuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIGVkaXRv
ci0+c2V0Q29tcG9zaXRpb24oZXYtPnByZWVkaXRTdHJpbmcoKSwgdW5kZXJsaW5lcywgcU1pbihh
LnN0YXJ0LCAoYS5zdGFydCArIGEubGVuZ3RoKSksIHFNYXgoYS5zdGFydCwgKGEuc3RhcnQgKyBh
Lmxlbmd0aCkpKTsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8vIElmIHdl
IGFyZSBpbiB0aGUgbWlkZGxlIG9mIGEgY29tcG9zaXRpb24sIGFuIGVtcHR5IHByZS1lZGl0IHN0
cmluZyBhbmQgYSBzZWxlY3Rpb24gb2YgemVybwotICAgICAgICAgICAgICAgIC8vIGNhbmNlbHMg
dGhlIGN1cnJlbnQgY29tcG9zaXRpb24KLSAgICAgICAgICAgICAgICBpZiAoZWRpdG9yLT5oYXND
b21wb3NpdGlvbigpICYmIChhLnN0YXJ0ICsgYS5sZW5ndGggPT0gMCkpCi0gICAgICAgICAgICAg
ICAgICAgIGVkaXRvci0+c2V0Q29tcG9zaXRpb24oUVN0cmluZygpLCB1bmRlcmxpbmVzLCAwLCAw
KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAg
IGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlm
IChub2RlICYmIGV2LT5yZXBsYWNlbWVudExlbmd0aCgpID4gMCkgewotICAgICAgICBpbnQgY3Vy
c29yUG9zID0gZnJhbWUtPnNlbGVjdGlvbigpLT5leHRlbnQoKS5vZmZzZXRJbkNvbnRhaW5lck5v
ZGUoKTsKLSAgICAgICAgaW50IHN0YXJ0ID0gY3Vyc29yUG9zICsgZXYtPnJlcGxhY2VtZW50U3Rh
cnQoKTsKLSAgICAgICAgaWYgKEhUTUxUZXh0Rm9ybUNvbnRyb2xFbGVtZW50KiB0ZXh0Q29udHJv
bCA9IHRvVGV4dEZvcm1Db250cm9sKG5vZGUpKQotICAgICAgICAgICAgdGV4dENvbnRyb2wtPnNl
dFNlbGVjdGlvblJhbmdlKHN0YXJ0LCBzdGFydCArIGV2LT5yZXBsYWNlbWVudExlbmd0aCgpKTsK
LSAgICAgICAgLy8gQ29tbWl0IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBjb21taXRTdHJpbmcgaXMg
ZW1wdHksIHRvIGdldCByaWQgb2Ygc2VsZWN0aW9uLgotICAgICAgICBlZGl0b3ItPmNvbmZpcm1D
b21wb3NpdGlvbihldi0+Y29tbWl0U3RyaW5nKCkpOwotICAgIH0gZWxzZSBpZiAoIWV2LT5jb21t
aXRTdHJpbmcoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgaWYgKGVkaXRvci0+aGFzQ29tcG9zaXRp
b24oKSkKLSAgICAgICAgICAgIGVkaXRvci0+Y29uZmlybUNvbXBvc2l0aW9uKGV2LT5jb21taXRT
dHJpbmcoKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGVkaXRvci0+aW5zZXJ0VGV4dChl
di0+Y29tbWl0U3RyaW5nKCksIDApOwotICAgIH0gZWxzZSBpZiAoIWhhc1NlbGVjdGlvbiAmJiAh
ZXYtPnByZWVkaXRTdHJpbmcoKS5pc0VtcHR5KCkpCi0gICAgICAgIGVkaXRvci0+c2V0Q29tcG9z
aXRpb24oZXYtPnByZWVkaXRTdHJpbmcoKSwgdW5kZXJsaW5lcywgMCwgMCk7Ci0gICAgZWxzZSBp
ZiAoZXYtPnByZWVkaXRTdHJpbmcoKS5pc0VtcHR5KCkgJiYgZWRpdG9yLT5oYXNDb21wb3NpdGlv
bigpKQotICAgICAgICBlZGl0b3ItPmNvbmZpcm1Db21wb3NpdGlvbihTdHJpbmcoKSk7Ci0KLSAg
ICBldi0+YWNjZXB0KCk7Ci19Ci0KLSNpZm5kZWYgUVRfTk9fUFJPUEVSVElFUwotdHlwZWRlZiBz
dHJ1Y3QgewotICAgIGNvbnN0IGNoYXIqIG5hbWU7Ci0gICAgZG91YmxlIGRlZmVycmVkUmVwYWlu
dERlbGF5OwotICAgIGRvdWJsZSBpbml0aWFsRGVmZXJyZWRSZXBhaW50RGVsYXlEdXJpbmdMb2Fk
aW5nOwotICAgIGRvdWJsZSBtYXhEZWZlcnJlZFJlcGFpbnREZWxheUR1cmluZ0xvYWRpbmc7Ci0g
ICAgZG91YmxlIGRlZmVycmVkUmVwYWludERlbGF5SW5jcmVtZW50RHVyaW5nTG9hZGluZzsKLX0g
UVJlcGFpbnRUaHJvdHRsaW5nUHJlc2V0OwotCi12b2lkIFFXZWJQYWdlUHJpdmF0ZTo6ZHluYW1p
Y1Byb3BlcnR5Q2hhbmdlRXZlbnQoUUR5bmFtaWNQcm9wZXJ0eUNoYW5nZUV2ZW50KiBldmVudCkK
LXsKLSAgICBpZiAoZXZlbnQtPnByb3BlcnR5TmFtZSgpID09ICJfcV92aWV3TW9kZSIpIHsKLSAg
ICAgICAgcGFnZS0+c2V0Vmlld01vZGUoUGFnZTo6c3RyaW5nVG9WaWV3TW9kZShxLT5wcm9wZXJ0
eSgiX3Ffdmlld01vZGUiKS50b1N0cmluZygpKSk7Ci0gICAgfSBlbHNlIGlmIChldmVudC0+cHJv
cGVydHlOYW1lKCkgPT0gIl9xX0hUTUxUb2tlbml6ZXJDaHVua1NpemUiKSB7Ci0gICAgICAgIGlu
dCBjaHVua1NpemUgPSBxLT5wcm9wZXJ0eSgiX3FfSFRNTFRva2VuaXplckNodW5rU2l6ZSIpLnRv
SW50KCk7Ci0gICAgICAgIHEtPmhhbmRsZSgpLT5wYWdlLT5zZXRDdXN0b21IVE1MVG9rZW5pemVy
Q2h1bmtTaXplKGNodW5rU2l6ZSk7Ci0gICAgfSBlbHNlIGlmIChldmVudC0+cHJvcGVydHlOYW1l
KCkgPT0gIl9xX0hUTUxUb2tlbml6ZXJUaW1lRGVsYXkiKSB7Ci0gICAgICAgIGRvdWJsZSB0aW1l
RGVsYXkgPSBxLT5wcm9wZXJ0eSgiX3FfSFRNTFRva2VuaXplclRpbWVEZWxheSIpLnRvRG91Ymxl
KCk7Ci0gICAgICAgIHEtPmhhbmRsZSgpLT5wYWdlLT5zZXRDdXN0b21IVE1MVG9rZW5pemVyVGlt
ZURlbGF5KHRpbWVEZWxheSk7Ci0gICAgfSBlbHNlIGlmIChldmVudC0+cHJvcGVydHlOYW1lKCkg
PT0gIl9xX1JlcGFpbnRUaHJvdHRsaW5nRGVmZXJyZWRSZXBhaW50RGVsYXkiKSB7Ci0gICAgICAg
IGRvdWJsZSBwID0gcS0+cHJvcGVydHkoIl9xX1JlcGFpbnRUaHJvdHRsaW5nRGVmZXJyZWRSZXBh
aW50RGVsYXkiKS50b0RvdWJsZSgpOwotICAgICAgICBGcmFtZVZpZXc6OnNldFJlcGFpbnRUaHJv
dHRsaW5nRGVmZXJyZWRSZXBhaW50RGVsYXkocCk7Ci0gICAgfSBlbHNlIGlmIChldmVudC0+cHJv
cGVydHlOYW1lKCkgPT0gIl9xX1JlcGFpbnRUaHJvdHRsaW5nbkluaXRpYWxEZWZlcnJlZFJlcGFp
bnREZWxheUR1cmluZ0xvYWRpbmciKSB7Ci0gICAgICAgIGRvdWJsZSBwID0gcS0+cHJvcGVydHko
Il9xX1JlcGFpbnRUaHJvdHRsaW5nbkluaXRpYWxEZWZlcnJlZFJlcGFpbnREZWxheUR1cmluZ0xv
YWRpbmciKS50b0RvdWJsZSgpOwotICAgICAgICBGcmFtZVZpZXc6OnNldFJlcGFpbnRUaHJvdHRs
aW5nbkluaXRpYWxEZWZlcnJlZFJlcGFpbnREZWxheUR1cmluZ0xvYWRpbmcocCk7Ci0gICAgfSBl
bHNlIGlmIChldmVudC0+cHJvcGVydHlOYW1lKCkgPT0gIl9xX1JlcGFpbnRUaHJvdHRsaW5nTWF4
RGVmZXJyZWRSZXBhaW50RGVsYXlEdXJpbmdMb2FkaW5nIikgewotICAgICAgICBkb3VibGUgcCA9
IHEtPnByb3BlcnR5KCJfcV9SZXBhaW50VGhyb3R0bGluZ01heERlZmVycmVkUmVwYWludERlbGF5
RHVyaW5nTG9hZGluZyIpLnRvRG91YmxlKCk7Ci0gICAgICAgIEZyYW1lVmlldzo6c2V0UmVwYWlu
dFRocm90dGxpbmdNYXhEZWZlcnJlZFJlcGFpbnREZWxheUR1cmluZ0xvYWRpbmcocCk7Ci0gICAg
fSBlbHNlIGlmIChldmVudC0+cHJvcGVydHlOYW1lKCkgPT0gIl9xX1JlcGFpbnRUaHJvdHRsaW5n
RGVmZXJyZWRSZXBhaW50RGVsYXlJbmNyZW1lbnREdXJpbmdMb2FkaW5nIikgewotICAgICAgICBk
b3VibGUgcCA9IHEtPnByb3BlcnR5KCJfcV9SZXBhaW50VGhyb3R0bGluZ0RlZmVycmVkUmVwYWlu
dERlbGF5SW5jcmVtZW50RHVyaW5nTG9hZGluZyIpLnRvRG91YmxlKCk7Ci0gICAgICAgIEZyYW1l
Vmlldzo6c2V0UmVwYWludFRocm90dGxpbmdEZWZlcnJlZFJlcGFpbnREZWxheUluY3JlbWVudER1
cmluZ0xvYWRpbmcocCk7Ci0gICAgfSBlbHNlIGlmIChldmVudC0+cHJvcGVydHlOYW1lKCkgPT0g
Il9xX1JlcGFpbnRUaHJvdHRsaW5nUHJlc2V0IikgewotICAgICAgICBzdGF0aWMgY29uc3QgUVJl
cGFpbnRUaHJvdHRsaW5nUHJlc2V0IHByZXNldHNbXSA9IHsKLSAgICAgICAgICAgIHsgICAiTm9U
aHJvdHRsaW5nIiwgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAgfSwKLSAgICAgICAgICAg
IHsgICAiTGVnYWN5IiwgICAgICAgMC4wMjUsICAgICAgMCwgICAgMi41LCAgICAwLjUgfSwKLSAg
ICAgICAgICAgIHsgICAiTWluaW1hbCIsICAgICAgIDAuMDEsICAgICAgMCwgICAgICAxLCAgICAw
LjIgfSwKLSAgICAgICAgICAgIHsgICAiTWVkaXVtIiwgICAgICAgMC4wMjUsICAgICAgMSwgICAg
ICA1LCAgICAwLjUgfSwKLSAgICAgICAgICAgIHsgICAiSGVhdnkiLCAgICAgICAgICAwLjEsICAg
ICAgMiwgICAgIDEwLCAgICAgIDEgfQotICAgICAgICB9OwotCi0gICAgICAgIFFTdHJpbmcgcCA9
IHEtPnByb3BlcnR5KCJfcV9SZXBhaW50VGhyb3R0bGluZ1ByZXNldCIpLnRvU3RyaW5nKCk7Ci0g
ICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKHByZXNldHMpIC8gc2l6ZW9mKHBy
ZXNldHNbMF0pOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChwID09IFFMYXRpbjFTdHJpbmcocHJl
c2V0c1tpXS5uYW1lKSkgewotICAgICAgICAgICAgICAgIEZyYW1lVmlldzo6c2V0UmVwYWludFRo
cm90dGxpbmdEZWZlcnJlZFJlcGFpbnREZWxheSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHBy
ZXNldHNbaV0uZGVmZXJyZWRSZXBhaW50RGVsYXkpOwotICAgICAgICAgICAgICAgIEZyYW1lVmll
dzo6c2V0UmVwYWludFRocm90dGxpbmduSW5pdGlhbERlZmVycmVkUmVwYWludERlbGF5RHVyaW5n
TG9hZGluZygKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZXNldHNbaV0uaW5pdGlhbERlZmVy
cmVkUmVwYWludERlbGF5RHVyaW5nTG9hZGluZyk7Ci0gICAgICAgICAgICAgICAgRnJhbWVWaWV3
OjpzZXRSZXBhaW50VGhyb3R0bGluZ01heERlZmVycmVkUmVwYWludERlbGF5RHVyaW5nTG9hZGlu
ZygKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZXNldHNbaV0ubWF4RGVmZXJyZWRSZXBhaW50
RGVsYXlEdXJpbmdMb2FkaW5nKTsKLSAgICAgICAgICAgICAgICBGcmFtZVZpZXc6OnNldFJlcGFp
bnRUaHJvdHRsaW5nRGVmZXJyZWRSZXBhaW50RGVsYXlJbmNyZW1lbnREdXJpbmdMb2FkaW5nKAot
ICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2V0c1tpXS5kZWZlcnJlZFJlcGFpbnREZWxheUlu
Y3JlbWVudER1cmluZ0xvYWRpbmcpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAg
ICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGV2ZW50LT5wcm9wZXJ0eU5hbWUo
KSA9PSAiX3Ffd2ViSW5zcGVjdG9yU2VydmVyUG9ydCIpIHsKLSAgICAgICAgSW5zcGVjdG9yU2Vy
dmVyUXQqIGluc3BlY3RvclNlcnZlciA9IEluc3BlY3RvclNlcnZlclF0OjpzZXJ2ZXIoKTsKLSAg
ICAgICAgaW5zcGVjdG9yU2VydmVyLT5saXN0ZW4oaW5zcGVjdG9yU2VydmVyUG9ydCgpKTsKLSAg
ICB9IGVsc2UgaWYgKGV2ZW50LT5wcm9wZXJ0eU5hbWUoKSA9PSAiX3FfZGVhZERlY29kZWREYXRh
RGVsZXRpb25JbnRlcnZhbCIpIHsKLSAgICAgICAgZG91YmxlIGludGVydmFsID0gcS0+cHJvcGVy
dHkoIl9xX2RlYWREZWNvZGVkRGF0YURlbGV0aW9uSW50ZXJ2YWwiKS50b0RvdWJsZSgpOwotICAg
ICAgICBtZW1vcnlDYWNoZSgpLT5zZXREZWFkRGVjb2RlZERhdGFEZWxldGlvbkludGVydmFsKGlu
dGVydmFsKTsKLSAgICB9Ci19Ci0jZW5kaWYKLQotdm9pZCBRV2ViUGFnZVByaXZhdGU6OnNob3J0
Y3V0T3ZlcnJpZGVFdmVudChRS2V5RXZlbnQqIGV2ZW50KQotewotICAgIFdlYkNvcmU6OkZyYW1l
KiBmcmFtZSA9IHBhZ2UtPmZvY3VzQ29udHJvbGxlcigpLT5mb2N1c2VkT3JNYWluRnJhbWUoKTsK
LSAgICBXZWJDb3JlOjpFZGl0b3IqIGVkaXRvciA9IGZyYW1lLT5lZGl0b3IoKTsKLSAgICBpZiAo
ZWRpdG9yLT5jYW5FZGl0KCkpIHsKLSAgICAgICAgaWYgKGV2ZW50LT5tb2RpZmllcnMoKSA9PSBR
dDo6Tm9Nb2RpZmllcgotICAgICAgICAgICAgfHwgZXZlbnQtPm1vZGlmaWVycygpID09IFF0OjpT
aGlmdE1vZGlmaWVyCi0gICAgICAgICAgICB8fCBldmVudC0+bW9kaWZpZXJzKCkgPT0gUXQ6Oktl
eXBhZE1vZGlmaWVyKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW50LT5rZXkoKSA8IFF0OjpL
ZXlfRXNjYXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGV2ZW50LT5hY2NlcHQoKTsKLSAgICAg
ICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LT5r
ZXkoKSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFF0OjpLZXlfUmV0dXJuOgotICAgICAg
ICAgICAgICAgICAgICBjYXNlIFF0OjpLZXlfRW50ZXI6Ci0gICAgICAgICAgICAgICAgICAgIGNh
c2UgUXQ6OktleV9EZWxldGU6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgUXQ6OktleV9Ib21l
OgotICAgICAgICAgICAgICAgICAgICBjYXNlIFF0OjpLZXlfRW5kOgotICAgICAgICAgICAgICAg
ICAgICBjYXNlIFF0OjpLZXlfQmFja3NwYWNlOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFF0
OjpLZXlfTGVmdDoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBRdDo6S2V5X1JpZ2h0OgotICAg
ICAgICAgICAgICAgICAgICBjYXNlIFF0OjpLZXlfVXA6Ci0gICAgICAgICAgICAgICAgICAgIGNh
c2UgUXQ6OktleV9Eb3duOgotICAgICAgICAgICAgICAgICAgICBjYXNlIFF0OjpLZXlfVGFiOgot
ICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQtPmFjY2VwdCgpOwotICAgICAgICAgICAgICAg
ICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAg
ICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSNpZm5kZWYgUVRfTk9f
U0hPUlRDVVQKLSAgICAgICAgZWxzZSBpZiAoZWRpdG9yQWN0aW9uRm9yS2V5RXZlbnQoZXZlbnQp
ICE9IFFXZWJQYWdlOjpOb1dlYkFjdGlvbikKLSAgICAgICAgICAgIGV2ZW50LT5hY2NlcHQoKTsK
LSNlbmRpZgotICAgIH0KLX0KLQotYm9vbCBRV2ViUGFnZVByaXZhdGU6OmhhbmRsZVNjcm9sbGlu
ZyhRS2V5RXZlbnQgKmV2LCBGcmFtZSAqZnJhbWUpCi17Ci0gICAgU2Nyb2xsRGlyZWN0aW9uIGRp
cmVjdGlvbjsKLSAgICBTY3JvbGxHcmFudWxhcml0eSBncmFudWxhcml0eTsKLQotI2lmbmRlZiBR
VF9OT19TSE9SVENVVAotICAgIGlmIChldiA9PSBRS2V5U2VxdWVuY2U6Ok1vdmVUb05leHRQYWdl
Ci0gICAgICAgIHx8IChldi0+a2V5KCkgPT0gUXQ6OktleV9TcGFjZSAmJiAhKGV2LT5tb2RpZmll
cnMoKSAmIFF0OjpTaGlmdE1vZGlmaWVyKSkpIHsKLSAgICAgICAgZ3JhbnVsYXJpdHkgPSBTY3Jv
bGxCeVBhZ2U7Ci0gICAgICAgIGRpcmVjdGlvbiA9IFNjcm9sbERvd247Ci0gICAgfSBlbHNlIGlm
IChldiA9PSBRS2V5U2VxdWVuY2U6Ok1vdmVUb1ByZXZpb3VzUGFnZQotICAgICAgICAgICAgICAg
fHwgKChldi0+a2V5KCkgPT0gUXQ6OktleV9TcGFjZSkgJiYgKGV2LT5tb2RpZmllcnMoKSAmIFF0
OjpTaGlmdE1vZGlmaWVyKSkpIHsKLSAgICAgICAgZ3JhbnVsYXJpdHkgPSBTY3JvbGxCeVBhZ2U7
Ci0gICAgICAgIGRpcmVjdGlvbiA9IFNjcm9sbFVwOwotICAgIH0gZWxzZQotI2VuZGlmIC8vIFFU
X05PX1NIT1JUQ1VUCi0gICAgaWYgKChldi0+a2V5KCkgPT0gUXQ6OktleV9VcCAmJiBldi0+bW9k
aWZpZXJzKCkgJiBRdDo6Q29udHJvbE1vZGlmaWVyKQotICAgICAgICAgICAgICAgfHwgZXYtPmtl
eSgpID09IFF0OjpLZXlfSG9tZSkgewotICAgICAgICBncmFudWxhcml0eSA9IFNjcm9sbEJ5RG9j
dW1lbnQ7Ci0gICAgICAgIGRpcmVjdGlvbiA9IFNjcm9sbFVwOwotICAgIH0gZWxzZSBpZiAoKGV2
LT5rZXkoKSA9PSBRdDo6S2V5X0Rvd24gJiYgZXYtPm1vZGlmaWVycygpICYgUXQ6OkNvbnRyb2xN
b2RpZmllcikKLSAgICAgICAgICAgICAgIHx8IGV2LT5rZXkoKSA9PSBRdDo6S2V5X0VuZCkgewot
ICAgICAgICBncmFudWxhcml0eSA9IFNjcm9sbEJ5RG9jdW1lbnQ7Ci0gICAgICAgIGRpcmVjdGlv
biA9IFNjcm9sbERvd247Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoIChldi0+a2V5KCkp
IHsKLSAgICAgICAgICAgIGNhc2UgUXQ6OktleV9VcDoKLSAgICAgICAgICAgICAgICBncmFudWxh
cml0eSA9IFNjcm9sbEJ5TGluZTsKLSAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSBTY3JvbGxV
cDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUXQ6OktleV9Eb3du
OgotICAgICAgICAgICAgICAgIGdyYW51bGFyaXR5ID0gU2Nyb2xsQnlMaW5lOwotICAgICAgICAg
ICAgICAgIGRpcmVjdGlvbiA9IFNjcm9sbERvd247Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgICAgICBjYXNlIFF0OjpLZXlfTGVmdDoKLSAgICAgICAgICAgICAgICBncmFudWxhcml0
eSA9IFNjcm9sbEJ5TGluZTsKLSAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSBTY3JvbGxMZWZ0
OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBRdDo6S2V5X1JpZ2h0
OgotICAgICAgICAgICAgICAgIGdyYW51bGFyaXR5ID0gU2Nyb2xsQnlMaW5lOwotICAgICAgICAg
ICAgICAgIGRpcmVjdGlvbiA9IFNjcm9sbFJpZ2h0OwotICAgICAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
ICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZnJhbWUtPmV2ZW50SGFuZGxlcigpLT5zY3JvbGxS
ZWN1cnNpdmVseShkaXJlY3Rpb24sIGdyYW51bGFyaXR5KTsKLX0KLQotdm9pZCBRV2ViUGFnZVBy
aXZhdGU6OmFkanVzdFBvaW50Rm9yQ2xpY2tpbmcoUU1vdXNlRXZlbnQqKQotewotICAgIG5vdElt
cGxlbWVudGVkKCk7Ci19Ci0KLSNpZiAhZGVmaW5lZChRVF9OT19HUkFQSElDU1ZJRVcpCi12b2lk
IFFXZWJQYWdlUHJpdmF0ZTo6YWRqdXN0UG9pbnRGb3JDbGlja2luZyhRR3JhcGhpY3NTY2VuZU1v
dXNlRXZlbnQqIGV2KQotewotICAgIFF0UGxhdGZvcm1QbHVnaW4gcGxhdGZvcm1QbHVnaW47Ci0g
ICAgT3duUHRyPFFXZWJUb3VjaE1vZGlmaWVyPiB0b3VjaE1vZGlmaWVyID0gcGxhdGZvcm1QbHVn
aW4uY3JlYXRlVG91Y2hNb2RpZmllcigpOwotICAgIGlmICghdG91Y2hNb2RpZmllcikKLSAgICAg
ICAgcmV0dXJuOwotCi0gICAgdW5zaWduZWQgdG9wUGFkZGluZyA9IHRvdWNoTW9kaWZpZXItPmhp
dFRlc3RQYWRkaW5nRm9yVG91Y2goUVdlYlRvdWNoTW9kaWZpZXI6OlVwKTsKLSAgICB1bnNpZ25l
ZCByaWdodFBhZGRpbmcgPSB0b3VjaE1vZGlmaWVyLT5oaXRUZXN0UGFkZGluZ0ZvclRvdWNoKFFX
ZWJUb3VjaE1vZGlmaWVyOjpSaWdodCk7Ci0gICAgdW5zaWduZWQgYm90dG9tUGFkZGluZyA9IHRv
dWNoTW9kaWZpZXItPmhpdFRlc3RQYWRkaW5nRm9yVG91Y2goUVdlYlRvdWNoTW9kaWZpZXI6OkRv
d24pOwotICAgIHVuc2lnbmVkIGxlZnRQYWRkaW5nID0gdG91Y2hNb2RpZmllci0+aGl0VGVzdFBh
ZGRpbmdGb3JUb3VjaChRV2ViVG91Y2hNb2RpZmllcjo6TGVmdCk7Ci0KLSAgICB0b3VjaE1vZGlm
aWVyID0gbnVsbHB0cjsKLQotICAgIGlmICghdG9wUGFkZGluZyAmJiAhcmlnaHRQYWRkaW5nICYm
ICFib3R0b21QYWRkaW5nICYmICFsZWZ0UGFkZGluZykKLSAgICAgICAgcmV0dXJuOwotCi0gICAg
RG9jdW1lbnQqIHN0YXJ0aW5nRG9jdW1lbnQgPSBwYWdlLT5tYWluRnJhbWUoKS0+ZG9jdW1lbnQo
KTsKLSAgICBpZiAoIXN0YXJ0aW5nRG9jdW1lbnQpCi0gICAgICAgIHJldHVybjsKLQotICAgIElu
dFBvaW50IG9yaWdpbmFsUG9pbnQoUVBvaW50Rihldi0+cG9zKCkpLnRvUG9pbnQoKSk7Ci0gICAg
VG91Y2hBZGp1c3RlciB0b3VjaEFkanVzdGVyKHRvcFBhZGRpbmcsIHJpZ2h0UGFkZGluZywgYm90
dG9tUGFkZGluZywgbGVmdFBhZGRpbmcpOwotICAgIEludFBvaW50IGFkanVzdGVkUG9pbnQgPSB0
b3VjaEFkanVzdGVyLmZpbmRDYW5kaWRhdGVQb2ludEZvclRvdWNoKG9yaWdpbmFsUG9pbnQsIHN0
YXJ0aW5nRG9jdW1lbnQpOwotICAgIGlmIChhZGp1c3RlZFBvaW50ID09IEludFBvaW50Ojp6ZXJv
KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGV2LT5zZXRQb3MoUVBvaW50RihhZGp1c3RlZFBv
aW50KSk7Ci19Ci0jZW5kaWYKLQotYm9vbCBRV2ViUGFnZVByaXZhdGU6OnRvdWNoRXZlbnQoUVRv
dWNoRXZlbnQqIGV2ZW50KQotewotI2lmIEVOQUJMRShUT1VDSF9FVkVOVFMpCi0gICAgV2ViQ29y
ZTo6RnJhbWUqIGZyYW1lID0gUVdlYkZyYW1lUHJpdmF0ZTo6Y29yZShtYWluRnJhbWUuZGF0YSgp
KTsKLSAgICBpZiAoIWZyYW1lLT52aWV3KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAg
IC8vIEFsd2F5cyBhY2NlcHQgdGhlIFFUb3VjaEV2ZW50IHNvIHRoYXQgd2UnbGwgcmVjZWl2ZSBh
bHNvIFRvdWNoVXBkYXRlIGFuZCBUb3VjaEVuZCBldmVudHMKLSAgICBldmVudC0+c2V0QWNjZXB0
ZWQodHJ1ZSk7Ci0KLSAgICAvLyBSZXR1cm4gd2hldGhlciB0aGUgZGVmYXVsdCBhY3Rpb24gd2Fz
IGNhbmNlbGxlZCBpbiB0aGUgSlMgZXZlbnQgaGFuZGxlcgotICAgIHJldHVybiBmcmFtZS0+ZXZl
bnRIYW5kbGVyKCktPmhhbmRsZVRvdWNoRXZlbnQoY29udmVydFRvdWNoRXZlbnQoZXZlbnQpKTsK
LSNlbHNlCi0gICAgZXZlbnQtPmlnbm9yZSgpOwotICAgIHJldHVybiBmYWxzZTsKLSNlbmRpZgot
fQotCi1ib29sIFFXZWJQYWdlUHJpdmF0ZTo6Z2VzdHVyZUV2ZW50KFFHZXN0dXJlRXZlbnQqIGV2
ZW50KQotewotICAgIFFXZWJGcmFtZUFkYXB0ZXIqIGZyYW1lID0gbWFpbkZyYW1lLmRhdGEoKS0+
ZDsKLSAgICBpZiAoIWZyYW1lLT5oYXNWaWV3KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAg
ICAvLyBRR2VzdHVyZUV2ZW50cyBjYW4gY29udGFpbiB1cGRhdGVzIGZvciBtdWx0aXBsZSBnZXN0
dXJlcy4KLSAgICBib29sIGhhbmRsZWQgPSBmYWxzZTsKLSNpZiBFTkFCTEUoR0VTVFVSRV9FVkVO
VFMpCi0gICAgLy8gUUdlc3R1cmVFdmVudCBsaXZlcyBpbiBXaWRnZXRzLCB3ZSdsbCBuZWVkIGEg
ZHVtbXkgc3RydWN0IHRvIG11bGUgdGhlIGluZm8gaXQgY29udGFpbnMgdG8gdGhlICJvdGhlciBz
aWRlIgotICAgIFFHZXN0dXJlRXZlbnRGYWNhZGUgZ2VzdHVyZUZhY2FkZTsKLQotICAgIFFHZXN0
dXJlKiBnZXN0dXJlID0gZXZlbnQtPmdlc3R1cmUoUXQ6OlRhcEdlc3R1cmUpOwotICAgIC8vIEJl
d2FyZSB0aGF0IGdlc3R1cmVzIHNlbmQgYnkgRHVtcFJlbmRlclRyZWUgd2lsbCBoYXZlIHN0YXRl
IFF0OjpOb0dlc3R1cmUsCi0gICAgLy8gZHVlIHRvIG5vdCBvcmlnaW5hdGluZyBmcm9tIGEgR2Vz
dHVyZVJlY29nbml6ZXIuCi0gICAgaWYgKGdlc3R1cmUgJiYgKGdlc3R1cmUtPnN0YXRlKCkgPT0g
UXQ6Okdlc3R1cmVTdGFydGVkIHx8IGdlc3R1cmUtPnN0YXRlKCkgPT0gUXQ6Ok5vR2VzdHVyZSkp
IHsKLSAgICAgICAgZ2VzdHVyZUZhY2FkZS50eXBlID0gUXQ6OlRhcEdlc3R1cmU7Ci0gICAgICAg
IFFQb2ludEYgZ2xvYmFsUG9zID0gc3RhdGljX2Nhc3Q8Y29uc3QgUVRhcEdlc3R1cmUqPihnZXN0
dXJlKS0+cG9zaXRpb24oKTsKLSAgICAgICAgZ2VzdHVyZUZhY2FkZS5nbG9iYWxQb3MgPSBnbG9i
YWxQb3MudG9Qb2ludCgpOwotICAgICAgICBnZXN0dXJlRmFjYWRlLnBvcyA9IGV2ZW50LT53aWRn
ZXQoKS0+bWFwRnJvbUdsb2JhbChnbG9iYWxQb3MudG9Qb2ludCgpKTsKLSAgICAgICAgZnJhbWUt
PmhhbmRsZUdlc3R1cmVFdmVudCgmZ2VzdHVyZUZhY2FkZSk7Ci0gICAgICAgIGhhbmRsZWQgPSB0
cnVlOwotICAgIH0KLSAgICBnZXN0dXJlID0gZXZlbnQtPmdlc3R1cmUoUXQ6OlRhcEFuZEhvbGRH
ZXN0dXJlKTsKLSAgICBpZiAoZ2VzdHVyZSAmJiAoZ2VzdHVyZS0+c3RhdGUoKSA9PSBRdDo6R2Vz
dHVyZVN0YXJ0ZWQgfHwgZ2VzdHVyZS0+c3RhdGUoKSA9PSBRdDo6Tm9HZXN0dXJlKSkgewotICAg
ICAgICBnZXN0dXJlRmFjYWRlLnR5cGUgPSBRdDo6VGFwQW5kSG9sZEdlc3R1cmU7Ci0gICAgICAg
IFFQb2ludEYgZ2xvYmFsUG9zID0gc3RhdGljX2Nhc3Q8Y29uc3QgUVRhcEFuZEhvbGRHZXN0dXJl
Kj4oZ2VzdHVyZSktPnBvc2l0aW9uKCk7Ci0gICAgICAgIGdlc3R1cmVGYWNhZGUuZ2xvYmFsUG9z
ID0gZ2xvYmFsUG9zLnRvUG9pbnQoKTsKLSAgICAgICAgZ2VzdHVyZUZhY2FkZS5wb3MgPSBldmVu
dC0+d2lkZ2V0KCktPm1hcEZyb21HbG9iYWwoZ2xvYmFsUG9zLnRvUG9pbnQoKSk7Ci0gICAgICAg
IGZyYW1lLT5oYW5kbGVHZXN0dXJlRXZlbnQoJmdlc3R1cmVGYWNhZGUpOwotICAgICAgICBoYW5k
bGVkID0gdHJ1ZTsKLSAgICB9Ci0jZW5kaWYgLy8gRU5BQkxFKEdFU1RVUkVfRVZFTlRTKQotCi0g
ICAgZXZlbnQtPnNldEFjY2VwdGVkKGhhbmRsZWQpOwotICAgIHJldHVybiBoYW5kbGVkOwotfQot
Ci0vKiEKLSAgVGhpcyBtZXRob2QgaXMgdXNlZCBieSB0aGUgaW5wdXQgbWV0aG9kIHRvIHF1ZXJ5
IGEgc2V0IG9mIHByb3BlcnRpZXMgb2YgdGhlIHBhZ2UKLSAgdG8gYmUgYWJsZSB0byBzdXBwb3J0
IGNvbXBsZXggaW5wdXQgbWV0aG9kIG9wZXJhdGlvbnMgYXMgc3VwcG9ydCBmb3Igc3Vycm91bmRp
bmcKLSAgdGV4dCBhbmQgcmVjb252ZXJzaW9ucy4KLQotICBcYSBwcm9wZXJ0eSBzcGVjaWZpZXMg
d2hpY2ggcHJvcGVydHkgaXMgcXVlcmllZC4KLQotICBcc2EgUVdpZGdldDo6aW5wdXRNZXRob2RF
dmVudCgpLCBRSW5wdXRNZXRob2RFdmVudCwgUUlucHV0Q29udGV4dAotKi8KLVFWYXJpYW50IFFX
ZWJQYWdlOjppbnB1dE1ldGhvZFF1ZXJ5KFF0OjpJbnB1dE1ldGhvZFF1ZXJ5IHByb3BlcnR5KSBj
b25zdAotewotICAgIEZyYW1lKiBmcmFtZSA9IGQtPnBhZ2UtPmZvY3VzQ29udHJvbGxlcigpLT5m
b2N1c2VkRnJhbWUoKTsKLSAgICBpZiAoIWZyYW1lKQotICAgICAgICByZXR1cm4gUVZhcmlhbnQo
KTsKLQotICAgIFdlYkNvcmU6OkVkaXRvciogZWRpdG9yID0gZnJhbWUtPmVkaXRvcigpOwotCi0g
ICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IDA7Ci0gICAgUmVuZGVyVGV4dENvbnRyb2wqIHJl
bmRlclRleHRDb250cm9sID0gMDsKLQotICAgIGlmIChmcmFtZS0+c2VsZWN0aW9uKCktPnJvb3RF
ZGl0YWJsZUVsZW1lbnQoKSkKLSAgICAgICAgcmVuZGVyZXIgPSBmcmFtZS0+c2VsZWN0aW9uKCkt
PnJvb3RFZGl0YWJsZUVsZW1lbnQoKS0+c2hhZG93QW5jZXN0b3JOb2RlKCktPnJlbmRlcmVyKCk7
Ci0KLSAgICBpZiAocmVuZGVyZXIgJiYgcmVuZGVyZXItPmlzVGV4dENvbnRyb2woKSkKLSAgICAg
ICAgcmVuZGVyVGV4dENvbnRyb2wgPSB0b1JlbmRlclRleHRDb250cm9sKHJlbmRlcmVyKTsKLQot
ICAgIHN3aXRjaCAocHJvcGVydHkpIHsKLSAgICAgICAgY2FzZSBRdDo6SW1NaWNyb0ZvY3VzOiB7
Ci0gICAgICAgICAgICBXZWJDb3JlOjpGcmFtZVZpZXcqIHZpZXcgPSBmcmFtZS0+dmlldygpOwot
ICAgICAgICAgICAgaWYgKHZpZXcgJiYgdmlldy0+bmVlZHNMYXlvdXQoKSkgewotICAgICAgICAg
ICAgICAgIC8vIFdlIGNhbid0IGFjY2VzcyBhYnNvbHV0ZUNhcmV0Qm91bmRzKCkgd2hpbGUgdGhl
IHZpZXcgbmVlZHMgdG8gbGF5b3V0LgotICAgICAgICAgICAgICAgIHJldHVybiBRVmFyaWFudCgp
OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFFWYXJpYW50KHZpZXctPmNvbnRl
bnRzVG9XaW5kb3coZnJhbWUtPnNlbGVjdGlvbigpLT5hYnNvbHV0ZUNhcmV0Qm91bmRzKCkpKTsK
LSAgICAgICAgfQotICAgICAgICBjYXNlIFF0OjpJbUZvbnQ6IHsKLSAgICAgICAgICAgIGlmIChy
ZW5kZXJUZXh0Q29udHJvbCkgewotICAgICAgICAgICAgICAgIFJlbmRlclN0eWxlKiByZW5kZXJT
dHlsZSA9IHJlbmRlclRleHRDb250cm9sLT5zdHlsZSgpOwotICAgICAgICAgICAgICAgIHJldHVy
biBRVmFyaWFudChRRm9udChyZW5kZXJTdHlsZS0+Zm9udCgpLnN5bnRoZXRpY0ZvbnQoKSkpOwot
ICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFFWYXJpYW50KFFGb250KCkpOwotICAg
ICAgICB9Ci0gICAgICAgIGNhc2UgUXQ6OkltQ3Vyc29yUG9zaXRpb246IHsKLSAgICAgICAgICAg
IGlmIChlZGl0b3ItPmhhc0NvbXBvc2l0aW9uKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIFFW
YXJpYW50KGZyYW1lLT5zZWxlY3Rpb24oKS0+ZW5kKCkub2Zmc2V0SW5Db250YWluZXJOb2RlKCkp
OwotICAgICAgICAgICAgcmV0dXJuIFFWYXJpYW50KGZyYW1lLT5zZWxlY3Rpb24oKS0+ZXh0ZW50
KCkub2Zmc2V0SW5Db250YWluZXJOb2RlKCkpOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgUXQ6
OkltU3Vycm91bmRpbmdUZXh0OiB7Ci0gICAgICAgICAgICBpZiAocmVuZGVyVGV4dENvbnRyb2wg
JiYgcmVuZGVyVGV4dENvbnRyb2wtPnRleHRGb3JtQ29udHJvbEVsZW1lbnQoKSkgewotICAgICAg
ICAgICAgICAgIFFTdHJpbmcgdGV4dCA9IHJlbmRlclRleHRDb250cm9sLT50ZXh0Rm9ybUNvbnRy
b2xFbGVtZW50KCktPnZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgUmVmUHRyPFJhbmdlPiByYW5n
ZSA9IGVkaXRvci0+Y29tcG9zaXRpb25SYW5nZSgpOwotICAgICAgICAgICAgICAgIGlmIChyYW5n
ZSkKLSAgICAgICAgICAgICAgICAgICAgdGV4dC5yZW1vdmUocmFuZ2UtPnN0YXJ0UG9zaXRpb24o
KS5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSwgVGV4dEl0ZXJhdG9yOjpyYW5nZUxlbmd0aChyYW5n
ZS5nZXQoKSkpOwotICAgICAgICAgICAgICAgIHJldHVybiBRVmFyaWFudCh0ZXh0KTsKLSAgICAg
ICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBRVmFyaWFudCgpOwotICAgICAgICB9Ci0gICAg
ICAgIGNhc2UgUXQ6OkltQ3VycmVudFNlbGVjdGlvbjogewotICAgICAgICAgICAgaWYgKCFlZGl0
b3ItPmhhc0NvbXBvc2l0aW9uKCkgJiYgcmVuZGVyVGV4dENvbnRyb2wgJiYgcmVuZGVyVGV4dENv
bnRyb2wtPnRleHRGb3JtQ29udHJvbEVsZW1lbnQoKSkgewotICAgICAgICAgICAgICAgIGludCBz
dGFydCA9IGZyYW1lLT5zZWxlY3Rpb24oKS0+c3RhcnQoKS5vZmZzZXRJbkNvbnRhaW5lck5vZGUo
KTsKLSAgICAgICAgICAgICAgICBpbnQgZW5kID0gZnJhbWUtPnNlbGVjdGlvbigpLT5lbmQoKS5v
ZmZzZXRJbkNvbnRhaW5lck5vZGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoZW5kID4gc3RhcnQp
Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBRVmFyaWFudChRU3RyaW5nKHJlbmRlclRleHRD
b250cm9sLT50ZXh0Rm9ybUNvbnRyb2xFbGVtZW50KCktPnZhbHVlKCkpLm1pZChzdGFydCwgZW5k
IC0gc3RhcnQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBRVmFyaWFudCgp
OwotCi0gICAgICAgIH0KLSAgICAgICAgY2FzZSBRdDo6SW1BbmNob3JQb3NpdGlvbjogewotICAg
ICAgICAgICAgaWYgKGVkaXRvci0+aGFzQ29tcG9zaXRpb24oKSkKLSAgICAgICAgICAgICAgICBy
ZXR1cm4gUVZhcmlhbnQoZnJhbWUtPnNlbGVjdGlvbigpLT5zdGFydCgpLm9mZnNldEluQ29udGFp
bmVyTm9kZSgpKTsKLSAgICAgICAgICAgIHJldHVybiBRVmFyaWFudChmcmFtZS0+c2VsZWN0aW9u
KCktPmJhc2UoKS5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAg
Y2FzZSBRdDo6SW1NYXhpbXVtVGV4dExlbmd0aDogewotICAgICAgICAgICAgaWYgKGZyYW1lLT5z
ZWxlY3Rpb24oKS0+aXNDb250ZW50RWRpdGFibGUoKSkgewotICAgICAgICAgICAgICAgIGlmIChm
cmFtZS0+ZG9jdW1lbnQoKSAmJiBmcmFtZS0+ZG9jdW1lbnQoKS0+Zm9jdXNlZE5vZGUoKSkgewot
ICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWUtPmRvY3VtZW50KCktPmZvY3VzZWROb2RlKCkt
Pmhhc1RhZ05hbWUoSFRNTE5hbWVzOjppbnB1dFRhZykpIHsKLSAgICAgICAgICAgICAgICAgICAg
ICAgIEhUTUxJbnB1dEVsZW1lbnQqIGlucHV0RWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxJbnB1
dEVsZW1lbnQqPihmcmFtZS0+ZG9jdW1lbnQoKS0+Zm9jdXNlZE5vZGUoKSk7Ci0gICAgICAgICAg
ICAgICAgICAgICAgICByZXR1cm4gUVZhcmlhbnQoaW5wdXRFbGVtZW50LT5tYXhMZW5ndGgoKSk7
Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAg
ICAgcmV0dXJuIFFWYXJpYW50KEhUTUxJbnB1dEVsZW1lbnQ6Om1heGltdW1MZW5ndGgpOwotICAg
ICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFFWYXJpYW50KDApOwotICAgICAgICB9Ci0g
ICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gUVZhcmlhbnQoKTsKLSAgICB9Ci19
Ci0KLS8qIQotICAgIFxpbnRlcm5hbAotKi8KLXZvaWQgUVdlYlBhZ2VQcml2YXRlOjpzZXRJbnNw
ZWN0b3IoUVdlYkluc3BlY3RvciogaW5zcCkKLXsKLSAgICBpZiAoaW5zcGVjdG9yKQotICAgICAg
ICBpbnNwZWN0b3ItPmQtPnNldEZyb250ZW5kKDApOwotCi0gICAgaW5zcGVjdG9yID0gaW5zcDsK
LQotICAgIC8vIEdpdmUgaW5zcGVjdG9yIGZyb250ZW5kIHdlYiB2aWV3IGlmIHByZXZpb3VzbHkg
Y3JlYXRlZAotICAgIGlmIChpbnNwZWN0b3IgJiYgaW5zcGVjdG9yRnJvbnRlbmQpCi0gICAgICAg
IGluc3BlY3Rvci0+ZC0+c2V0RnJvbnRlbmQoaW5zcGVjdG9yRnJvbnRlbmQpOwotfQotCi0vKiEK
LSAgICBcaW50ZXJuYWwKLSAgICBSZXR1cm5zIHRoZSBpbnNwZWN0b3IgYW5kIGNyZWF0ZXMgaXQg
aWYgaXQgd2Fzbid0IGNyZWF0ZWQgeWV0LgotICAgIFRoZSBpbnN0YW5jZSBjcmVhdGVkIGhlcmUg
d2lsbCBub3QgYmUgYXZhaWxhYmxlIHRocm91Z2ggUVdlYlBhZ2UncyBBUEkuCi0qLwotUVdlYklu
c3BlY3RvciogUVdlYlBhZ2VQcml2YXRlOjpnZXRPckNyZWF0ZUluc3BlY3RvcigpCi17Ci0jaWYg
RU5BQkxFKElOU1BFQ1RPUikKLSAgICBpZiAoIWluc3BlY3RvcikgewotICAgICAgICBRV2ViSW5z
cGVjdG9yKiBpbnNwID0gbmV3IFFXZWJJbnNwZWN0b3I7Ci0gICAgICAgIGluc3AtPnNldFBhZ2Uo
cSk7Ci0gICAgICAgIGluc3BlY3RvcklzSW50ZXJuYWxPbmx5ID0gdHJ1ZTsKLQotICAgICAgICBR
X0FTU0VSVChpbnNwZWN0b3IpOyAvLyBBc3NvY2lhdGVkIHRocm91Z2ggUVdlYkluc3BlY3Rvcjo6
c2V0UGFnZShxKQotICAgIH0KLSNlbmRpZgotICAgIHJldHVybiBpbnNwZWN0b3I7Ci19Ci0KLS8q
ISBcaW50ZXJuYWwgKi8KLUluc3BlY3RvckNvbnRyb2xsZXIqIFFXZWJQYWdlUHJpdmF0ZTo6aW5z
cGVjdG9yQ29udHJvbGxlcigpCi17Ci0jaWYgRU5BQkxFKElOU1BFQ1RPUikKLSAgICByZXR1cm4g
cGFnZS0+aW5zcGVjdG9yQ29udHJvbGxlcigpOwotI2Vsc2UKLSAgICByZXR1cm4gMDsKLSNlbmRp
ZgotfQotCi1xdWludDE2IFFXZWJQYWdlUHJpdmF0ZTo6aW5zcGVjdG9yU2VydmVyUG9ydCgpCi17
Ci0jaWYgRU5BQkxFKElOU1BFQ1RPUikgJiYgIWRlZmluZWQoUVRfTk9fUFJPUEVSVElFUykKLSAg
ICBpZiAocSAmJiBxLT5wcm9wZXJ0eSgiX3Ffd2ViSW5zcGVjdG9yU2VydmVyUG9ydCIpLmlzVmFs
aWQoKSkKLSAgICAgICAgcmV0dXJuIHEtPnByb3BlcnR5KCJfcV93ZWJJbnNwZWN0b3JTZXJ2ZXJQ
b3J0IikudG9JbnQoKTsKLSNlbmRpZgotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgYm9vbCBo
YXNNb3VzZUxpc3RlbmVyKEVsZW1lbnQqIGVsZW1lbnQpCi17Ci0gICAgQVNTRVJUKGVsZW1lbnQp
OwotICAgIHJldHVybiBlbGVtZW50LT5oYXNFdmVudExpc3RlbmVycyhldmVudE5hbWVzKCkuY2xp
Y2tFdmVudCkKLSAgICAgICAgfHwgZWxlbWVudC0+aGFzRXZlbnRMaXN0ZW5lcnMoZXZlbnROYW1l
cygpLm1vdXNlZG93bkV2ZW50KQotICAgICAgICB8fCBlbGVtZW50LT5oYXNFdmVudExpc3RlbmVy
cyhldmVudE5hbWVzKCkubW91c2V1cEV2ZW50KTsKLX0KLQotc3RhdGljIGJvb2wgaXNDbGlja2Fi
bGVFbGVtZW50KEVsZW1lbnQqIGVsZW1lbnQsIFJlZlB0cjxOb2RlTGlzdD4gbGlzdCkKLXsKLSAg
ICBBU1NFUlQoZWxlbWVudCk7Ci0gICAgYm9vbCBpc0NsaWNrYWJsZSA9IGhhc01vdXNlTGlzdGVu
ZXIoZWxlbWVudCk7Ci0gICAgaWYgKCFpc0NsaWNrYWJsZSAmJiBsaXN0KSB7Ci0gICAgICAgIEVs
ZW1lbnQqIHBhcmVudCA9IGVsZW1lbnQtPnBhcmVudEVsZW1lbnQoKTsKLSAgICAgICAgdW5zaWdu
ZWQgY291bnQgPSBsaXN0LT5sZW5ndGgoKTsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSA8IGNvdW50ICYmIHBhcmVudDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAobGlzdC0+aXRlbShp
KSAhPSBwYXJlbnQpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIGlz
Q2xpY2thYmxlID0gaGFzTW91c2VMaXN0ZW5lcihwYXJlbnQpOwotICAgICAgICAgICAgaWYgKGlz
Q2xpY2thYmxlKQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBwYXJlbnQg
PSBwYXJlbnQtPnBhcmVudEVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEV4Y2Vw
dGlvbkNvZGUgZWMgPSAwOwotICAgIHJldHVybiBpc0NsaWNrYWJsZQotICAgICAgICB8fCBlbGVt
ZW50LT53ZWJraXRNYXRjaGVzU2VsZWN0b3IoImEsKjpsaW5rLCo6dmlzaXRlZCwqW3JvbGU9YnV0
dG9uXSxidXR0b24saW5wdXQsc2VsZWN0LGxhYmVsIiwgZWMpCi0gICAgICAgIHx8IENTU0NvbXB1
dGVkU3R5bGVEZWNsYXJhdGlvbjo6Y3JlYXRlKGVsZW1lbnQpLT5nZXRQcm9wZXJ0eVZhbHVlKGNz
c1Byb3BlcnR5SUQoImN1cnNvciIpKSA9PSAicG9pbnRlciI7Ci19Ci0KLXN0YXRpYyBib29sIGlz
VmFsaWRGcmFtZU93bmVyKEVsZW1lbnQqIGVsZW1lbnQpCi17Ci0gICAgQVNTRVJUKGVsZW1lbnQp
OwotICAgIHJldHVybiBlbGVtZW50LT5pc0ZyYW1lT3duZXJFbGVtZW50KCkgJiYgc3RhdGljX2Nh
c3Q8SFRNTEZyYW1lT3duZXJFbGVtZW50Kj4oZWxlbWVudCktPmNvbnRlbnRGcmFtZSgpOwotfQot
Ci1zdGF0aWMgRWxlbWVudCogbm9kZVRvRWxlbWVudChOb2RlKiBub2RlKQotewotICAgIGlmIChu
b2RlICYmIG5vZGUtPmlzRWxlbWVudE5vZGUoKSkKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0
PEVsZW1lbnQqPihub2RlKTsKLSAgICByZXR1cm4gMDsKLX0KLQotUVdlYlBhZ2VQcml2YXRlOjpU
b3VjaEFkanVzdGVyOjpUb3VjaEFkanVzdGVyKHVuc2lnbmVkIHRvcFBhZGRpbmcsIHVuc2lnbmVk
IHJpZ2h0UGFkZGluZywgdW5zaWduZWQgYm90dG9tUGFkZGluZywgdW5zaWduZWQgbGVmdFBhZGRp
bmcpCi0gICAgOiBtX3RvcFBhZGRpbmcodG9wUGFkZGluZykKLSAgICAsIG1fcmlnaHRQYWRkaW5n
KHJpZ2h0UGFkZGluZykKLSAgICAsIG1fYm90dG9tUGFkZGluZyhib3R0b21QYWRkaW5nKQotICAg
ICwgbV9sZWZ0UGFkZGluZyhsZWZ0UGFkZGluZykKLXsKLX0KLQotSW50UG9pbnQgUVdlYlBhZ2VQ
cml2YXRlOjpUb3VjaEFkanVzdGVyOjpmaW5kQ2FuZGlkYXRlUG9pbnRGb3JUb3VjaChjb25zdCBJ
bnRQb2ludCYgdG91Y2hQb2ludCwgRG9jdW1lbnQqIGRvY3VtZW50KSBjb25zdAotewotICAgIGlm
ICghZG9jdW1lbnQpCi0gICAgICAgIHJldHVybiBJbnRQb2ludCgpOwotCi0gICAgaW50IHggPSB0
b3VjaFBvaW50LngoKTsKLSAgICBpbnQgeSA9IHRvdWNoUG9pbnQueSgpOwotCi0gICAgUmVmUHRy
PE5vZGVMaXN0PiBpbnRlcnNlY3RlZE5vZGVzID0gZG9jdW1lbnQtPm5vZGVzRnJvbVJlY3QoeCwg
eSwgbV90b3BQYWRkaW5nLCBtX3JpZ2h0UGFkZGluZywgbV9ib3R0b21QYWRkaW5nLCBtX2xlZnRQ
YWRkaW5nLCBmYWxzZSAvKmlnbm9yZUNsaXBwaW5nKi8sIGZhbHNlIC8qYWxsb3dTaGFkb3dDb250
ZW50Ki8pOwotICAgIGlmICghaW50ZXJzZWN0ZWROb2RlcykKLSAgICAgICAgcmV0dXJuIEludFBv
aW50KCk7Ci0KLSAgICBFbGVtZW50KiBjbG9zZXN0Q2xpY2thYmxlRWxlbWVudCA9IDA7Ci0gICAg
SW50UmVjdCBsYXJnZXN0SW50ZXJzZWN0aW9uUmVjdDsKLSAgICBGcmFtZVZpZXcqIHZpZXcgPSBk
b2N1bWVudC0+ZnJhbWUoKS0+dmlldygpOwotCi0gICAgLy8gVG91Y2ggcmVjdCBpbiBjb250ZW50
cyBjb29yZGluYXRlcy4KLSAgICBJbnRSZWN0IHRvdWNoUmVjdChIaXRUZXN0TG9jYXRpb246OnJl
Y3RGb3JQb2ludCh2aWV3LT53aW5kb3dUb0NvbnRlbnRzKEludFBvaW50KHgsIHkpKSwgbV90b3BQ
YWRkaW5nLCBtX3JpZ2h0UGFkZGluZywgbV9ib3R0b21QYWRkaW5nLCBtX2xlZnRQYWRkaW5nKSk7
Ci0KLSAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIGxpc3Qgb2Ygbm9kZXMgaGl0IGxvb2tpbmcgZm9y
IHRoZSBvbmUgd2hvc2UgYm91bmRpbmcgYXJlYQotICAgIC8vIGhhcyBsYXJnZXN0IGludGVyc2Vj
dGlvbiB3aXRoIHRoZSB0b3VjaCBhcmVhIChwb2ludCArIHBhZGRpbmcpLgotICAgIGZvciAodW5z
aWduZWQgaSA9IDA7IGkgPCBpbnRlcnNlY3RlZE5vZGVzLT5sZW5ndGgoKTsgaSsrKSB7Ci0gICAg
ICAgIE5vZGUqIGN1cnJlbnROb2RlID0gaW50ZXJzZWN0ZWROb2Rlcy0+aXRlbShpKTsKLQotICAg
ICAgICBFbGVtZW50KiBjdXJyZW50RWxlbWVudCA9IG5vZGVUb0VsZW1lbnQoY3VycmVudE5vZGUp
OwotICAgICAgICBpZiAoIWN1cnJlbnRFbGVtZW50IHx8ICghaXNDbGlja2FibGVFbGVtZW50KGN1
cnJlbnRFbGVtZW50LCAwKSAmJiAhaXNWYWxpZEZyYW1lT3duZXIoY3VycmVudEVsZW1lbnQpKSkK
LSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIEludFJlY3QgY3VycmVudEVsZW1lbnRC
b3VuZGluZ1JlY3QgPSBjdXJyZW50RWxlbWVudC0+cGl4ZWxTbmFwcGVkQm91bmRpbmdCb3goKTsK
LSAgICAgICAgY3VycmVudEVsZW1lbnRCb3VuZGluZ1JlY3QuaW50ZXJzZWN0KHRvdWNoUmVjdCk7
Ci0KLSAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50Qm91bmRpbmdSZWN0LmlzRW1wdHkoKSkKLSAg
ICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGludCBjdXJyZW50SW50ZXJzZWN0aW9uUmVj
dEFyZWEgPSBjdXJyZW50RWxlbWVudEJvdW5kaW5nUmVjdC53aWR0aCgpICogY3VycmVudEVsZW1l
bnRCb3VuZGluZ1JlY3QuaGVpZ2h0KCk7Ci0gICAgICAgIGludCBsYXJnZXN0SW50ZXJzZWN0aW9u
UmVjdEFyZWEgPSBsYXJnZXN0SW50ZXJzZWN0aW9uUmVjdC53aWR0aCgpICogbGFyZ2VzdEludGVy
c2VjdGlvblJlY3QuaGVpZ2h0KCk7Ci0gICAgICAgIGlmIChjdXJyZW50SW50ZXJzZWN0aW9uUmVj
dEFyZWEgPiBsYXJnZXN0SW50ZXJzZWN0aW9uUmVjdEFyZWEpIHsKLSAgICAgICAgICAgIGNsb3Nl
c3RDbGlja2FibGVFbGVtZW50ID0gY3VycmVudEVsZW1lbnQ7Ci0gICAgICAgICAgICBsYXJnZXN0
SW50ZXJzZWN0aW9uUmVjdCA9IGN1cnJlbnRFbGVtZW50Qm91bmRpbmdSZWN0OwotICAgICAgICB9
Ci0gICAgfQotCi0gICAgaWYgKGxhcmdlc3RJbnRlcnNlY3Rpb25SZWN0LmlzRW1wdHkoKSkKLSAg
ICAgICAgcmV0dXJuIEludFBvaW50KCk7Ci0KLSAgICAvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlbiB1
c2VyIHRhcHMgYSBpbm5lciBmcmFtZS4gSXQgaXMgZG9uZSBpbiB0aHJlZSBzdGVwczoKLSAgICAv
LyAxKSBUcmFuc2Zvcm0gdGhlIG9yaWdpbmFsIHRvdWNoIHBvaW50IHRvIHRoZSBpbm5lciBkb2N1
bWVudCBjb29yZGluYXRlczsKLSAgICAvLyAxKSBDYWxsIG5vZGVzRnJvbVJlY3QgZm9yIHRoZSBp
bm5lciBkb2N1bWVudCBpbiBjYXNlOwotICAgIC8vIDMpIFJlLWFkZCB0aGUgaW5uZXIgZnJhbWUg
b2Zmc2V0IChsb2NhdGlvbikgYmVmb3JlIHBhc3NpbmcgdGhlIG5ldyBjbGlja2luZwotICAgIC8v
ICAgIHBvc2l0aW9uIHRvIFdlYkNvcmUuCi0gICAgaWYgKGNsb3Nlc3RDbGlja2FibGVFbGVtZW50
LT5pc0ZyYW1lT3duZXJFbGVtZW50KCkpIHsKLSAgICAgICAgLy8gQWRqdXN0IGNsaWVudCBjb29y
ZGluYXRlcycgb3JpZ2luIHRvIGJlIHRvcCBsZWZ0IG9mIGlubmVyIGZyYW1lIHZpZXdwb3J0Lgot
ICAgICAgICBQYXNzUmVmUHRyPENsaWVudFJlY3Q+IHJlY3QgPSBjbG9zZXN0Q2xpY2thYmxlRWxl
bWVudC0+Z2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7Ci0gICAgICAgIEludFBvaW50IG5ld1RvdWNo
UG9pbnQgPSB0b3VjaFBvaW50OwotICAgICAgICBJbnRTaXplIG9mZnNldCA9ICBJbnRTaXplKHJl
Y3QtPmxlZnQoKSwgcmVjdC0+dG9wKCkpOwotICAgICAgICBuZXdUb3VjaFBvaW50IC09IG9mZnNl
dDsKLQotICAgICAgICBIVE1MRnJhbWVPd25lckVsZW1lbnQqIG93bmVyID0gc3RhdGljX2Nhc3Q8
SFRNTEZyYW1lT3duZXJFbGVtZW50Kj4oY2xvc2VzdENsaWNrYWJsZUVsZW1lbnQpOwotICAgICAg
ICBEb2N1bWVudCogY2hpbGREb2N1bWVudCA9IG93bmVyLT5jb250ZW50RnJhbWUoKS0+ZG9jdW1l
bnQoKTsKLSAgICAgICAgcmV0dXJuIGZpbmRDYW5kaWRhdGVQb2ludEZvclRvdWNoKG5ld1RvdWNo
UG9pbnQsIGNoaWxkRG9jdW1lbnQpOwotICAgIH0KLSAgICByZXR1cm4gdmlldy0+Y29udGVudHNU
b1dpbmRvdyhsYXJnZXN0SW50ZXJzZWN0aW9uUmVjdCkuY2VudGVyKCk7Ci19Ci0KLS8qIQotICAg
XGVudW0gUVdlYlBhZ2U6OkZpbmRGbGFnCi0KLSAgIFRoaXMgZW51bSBkZXNjcmliZXMgdGhlIG9w
dGlvbnMgYXZhaWxhYmxlIHRvIHRoZSBmaW5kVGV4dCgpIGZ1bmN0aW9uLiBUaGUgb3B0aW9ucwot
ICAgY2FuIGJlIE9SLWVkIHRvZ2V0aGVyIGZyb20gdGhlIGZvbGxvd2luZyBsaXN0OgotCi0gICBc
dmFsdWUgRmluZEJhY2t3YXJkIFNlYXJjaGVzIGJhY2t3YXJkcyBpbnN0ZWFkIG9mIGZvcndhcmRz
LgotICAgXHZhbHVlIEZpbmRDYXNlU2Vuc2l0aXZlbHkgQnkgZGVmYXVsdCBmaW5kVGV4dCgpIHdv
cmtzIGNhc2UgaW5zZW5zaXRpdmUuIFNwZWNpZnlpbmcgdGhpcyBvcHRpb24KLSAgIGNoYW5nZXMg
dGhlIGJlaGF2aW91ciB0byBhIGNhc2Ugc2Vuc2l0aXZlIGZpbmQgb3BlcmF0aW9uLgotICAgXHZh
bHVlIEZpbmRXcmFwc0Fyb3VuZERvY3VtZW50IE1ha2VzIGZpbmRUZXh0KCkgcmVzdGFydCBmcm9t
IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRvY3VtZW50IGlmIHRoZSBlbmQKLSAgIHdhcyByZWFjaGVk
IGFuZCB0aGUgdGV4dCB3YXMgbm90IGZvdW5kLgotICAgXHZhbHVlIEhpZ2hsaWdodEFsbE9jY3Vy
cmVuY2VzIEhpZ2hsaWdodHMgYWxsIGV4aXN0aW5nIG9jY3VycmVuY2VzIG9mIGEgc3BlY2lmaWMg
c3RyaW5nLgotICAgICAgIChUaGlzIHZhbHVlIHdhcyBpbnRyb2R1Y2VkIGluIDQuNi4pCi0qLwot
Ci0vKiEKLSAgICBcZW51bSBRV2ViUGFnZTo6TGlua0RlbGVnYXRpb25Qb2xpY3kKLQotICAgIFRo
aXMgZW51bSBkZWZpbmVzIHRoZSBkZWxlZ2F0aW9uIHBvbGljaWVzIGEgd2VicGFnZSBjYW4gaGF2
ZSB3aGVuIGFjdGl2YXRpbmcgbGlua3MgYW5kIGVtaXR0aW5nCi0gICAgdGhlIGxpbmtDbGlja2Vk
KCkgc2lnbmFsLgotCi0gICAgXHZhbHVlIERvbnREZWxlZ2F0ZUxpbmtzIE5vIGxpbmtzIGFyZSBk
ZWxlZ2F0ZWQuIEluc3RlYWQsIFFXZWJQYWdlIHRyaWVzIHRvIGhhbmRsZSB0aGVtIGFsbC4KLSAg
ICBcdmFsdWUgRGVsZWdhdGVFeHRlcm5hbExpbmtzIFdoZW4gYWN0aXZhdGluZyBsaW5rcyB0aGF0
IHBvaW50IHRvIGRvY3VtZW50cyBub3Qgc3RvcmVkIG9uIHRoZQotICAgIGxvY2FsIGZpbGVzeXN0
ZW0gb3IgYW4gZXF1aXZhbGVudCAtIHN1Y2ggYXMgdGhlIFF0IHJlc291cmNlIHN5c3RlbSAtIHRo
ZW4gbGlua0NsaWNrZWQoKSBpcyBlbWl0dGVkLgotICAgIFx2YWx1ZSBEZWxlZ2F0ZUFsbExpbmtz
IFdoZW5ldmVyIGEgbGluayBpcyBhY3RpdmF0ZWQgdGhlIGxpbmtDbGlja2VkKCkgc2lnbmFsIGlz
IGVtaXR0ZWQuCi0KLSAgICBcc2EgUVdlYlBhZ2U6OmxpbmtEZWxlZ2F0aW9uUG9saWN5Ci0qLwot
Ci0vKiEKLSAgICBcZW51bSBRV2ViUGFnZTo6TmF2aWdhdGlvblR5cGUKLQotICAgIFRoaXMgZW51
bSBkZXNjcmliZXMgdGhlIHR5cGVzIG9mIG5hdmlnYXRpb24gYXZhaWxhYmxlIHdoZW4gYnJvd3Np
bmcgdGhyb3VnaCBoeXBlcmxpbmtlZAotICAgIGRvY3VtZW50cy4KLQotICAgIFx2YWx1ZSBOYXZp
Z2F0aW9uVHlwZUxpbmtDbGlja2VkIFRoZSB1c2VyIGNsaWNrZWQgb24gYSBsaW5rIG9yIHByZXNz
ZWQgcmV0dXJuIG9uIGEgZm9jdXNlZCBsaW5rLgotICAgIFx2YWx1ZSBOYXZpZ2F0aW9uVHlwZUZv
cm1TdWJtaXR0ZWQgVGhlIHVzZXIgYWN0aXZhdGVkIGEgc3VibWl0IGJ1dHRvbiBmb3IgYW4gSFRN
TCBmb3JtLgotICAgIFx2YWx1ZSBOYXZpZ2F0aW9uVHlwZUJhY2tPckZvcndhcmQgTmF2aWdhdGlv
biB0byBhIHByZXZpb3VzbHkgc2hvd24gZG9jdW1lbnQgaW4gdGhlIGJhY2sgb3IgZm9yd2FyZCBo
aXN0b3J5IGlzIHJlcXVlc3RlZC4KLSAgICBcdmFsdWUgTmF2aWdhdGlvblR5cGVSZWxvYWQgVGhl
IHVzZXIgYWN0aXZhdGVkIHRoZSByZWxvYWQgYWN0aW9uLgotICAgIFx2YWx1ZSBOYXZpZ2F0aW9u
VHlwZUZvcm1SZXN1Ym1pdHRlZCBBbiBIVE1MIGZvcm0gd2FzIHN1Ym1pdHRlZCBhIHNlY29uZCB0
aW1lLgotICAgIFx2YWx1ZSBOYXZpZ2F0aW9uVHlwZU90aGVyIEEgbmF2aWdhdGlvbiB0byBhbm90
aGVyIGRvY3VtZW50IHVzaW5nIGEgbWV0aG9kIG5vdCBsaXN0ZWQgYWJvdmUuCi0KLSAgICBcc2Eg
YWNjZXB0TmF2aWdhdGlvblJlcXVlc3QoKQotKi8KLQotLyohCi0gICAgXGVudW0gUVdlYlBhZ2U6
OldlYkFjdGlvbgotCi0gICAgVGhpcyBlbnVtIGRlc2NyaWJlcyB0aGUgdHlwZXMgb2YgYWN0aW9u
IHdoaWNoIGNhbiBiZSBwZXJmb3JtZWQgb24gdGhlIHdlYiBwYWdlLgotCi0gICAgQWN0aW9ucyBv
bmx5IGhhdmUgYW4gZWZmZWN0IHdoZW4gdGhleSBhcmUgYXBwbGljYWJsZS4gVGhlIGF2YWlsYWJp
bGl0eSBvZgotICAgIGFjdGlvbnMgY2FuIGJlIGJlIGRldGVybWluZWQgYnkgY2hlY2tpbmcgXGx7
UUFjdGlvbjo6fXtpc0VuYWJsZWQoKX0gb24gdGhlCi0gICAgYWN0aW9uIHJldHVybmVkIGJ5IGFj
dGlvbigpLgotCi0gICAgT25lIG1ldGhvZCBvZiBlbmFibGluZyB0aGUgdGV4dCBlZGl0aW5nLCBj
dXJzb3IgbW92ZW1lbnQsIGFuZCB0ZXh0IHNlbGVjdGlvbiBhY3Rpb25zCi0gICAgaXMgYnkgc2V0
dGluZyBcbCBjb250ZW50RWRpdGFibGUgdG8gdHJ1ZS4KLQotICAgIFx2YWx1ZSBOb1dlYkFjdGlv
biBObyBhY3Rpb24gaXMgdHJpZ2dlcmVkLgotICAgIFx2YWx1ZSBPcGVuTGluayBPcGVuIHRoZSBj
dXJyZW50IGxpbmsuCi0gICAgXHZhbHVlIE9wZW5MaW5rSW5OZXdXaW5kb3cgT3BlbiB0aGUgY3Vy
cmVudCBsaW5rIGluIGEgbmV3IHdpbmRvdy4KLSAgICBcdmFsdWUgT3BlbkxpbmtJblRoaXNXaW5k
b3cgT3BlbiB0aGUgY3VycmVudCBsaW5rIHdpdGhvdXQgb3BlbmluZyBhIG5ldyB3aW5kb3cuIFVz
ZWQgb24gbGlua3MgdGhhdCB3b3VsZCBkZWZhdWx0IHRvIG9wZW5pbmcgaW4gYW5vdGhlciBmcmFt
ZSBvciBhIG5ldyB3aW5kb3cuIChBZGRlZCBpbiBRdCA1LjApCi0gICAgXHZhbHVlIE9wZW5GcmFt
ZUluTmV3V2luZG93IFJlcGxpY2F0ZSB0aGUgY3VycmVudCBmcmFtZSBpbiBhIG5ldyB3aW5kb3cu
Ci0gICAgXHZhbHVlIERvd25sb2FkTGlua1RvRGlzayBEb3dubG9hZCB0aGUgY3VycmVudCBsaW5r
IHRvIHRoZSBkaXNrLgotICAgIFx2YWx1ZSBDb3B5TGlua1RvQ2xpcGJvYXJkIENvcHkgdGhlIGN1
cnJlbnQgbGluayB0byB0aGUgY2xpcGJvYXJkLgotICAgIFx2YWx1ZSBPcGVuSW1hZ2VJbk5ld1dp
bmRvdyBPcGVuIHRoZSBoaWdobGlnaHRlZCBpbWFnZSBpbiBhIG5ldyB3aW5kb3cuCi0gICAgXHZh
bHVlIERvd25sb2FkSW1hZ2VUb0Rpc2sgRG93bmxvYWQgdGhlIGhpZ2hsaWdodGVkIGltYWdlIHRv
IHRoZSBkaXNrLgotICAgIFx2YWx1ZSBDb3B5SW1hZ2VUb0NsaXBib2FyZCBDb3B5IHRoZSBoaWdo
bGlnaHRlZCBpbWFnZSB0byB0aGUgY2xpcGJvYXJkLiAgKEFkZGVkIGluIFF0IDQuOCkKLSAgICBc
dmFsdWUgQ29weUltYWdlVXJsVG9DbGlwYm9hcmQgQ29weSB0aGUgaGlnaGxpZ2h0ZWQgaW1hZ2Un
cyBVUkwgdG8gdGhlIGNsaXBib2FyZC4KLSAgICBcdmFsdWUgQmFjayBOYXZpZ2F0ZSBiYWNrIGlu
IHRoZSBoaXN0b3J5IG9mIG5hdmlnYXRlZCBsaW5rcy4KLSAgICBcdmFsdWUgRm9yd2FyZCBOYXZp
Z2F0ZSBmb3J3YXJkIGluIHRoZSBoaXN0b3J5IG9mIG5hdmlnYXRlZCBsaW5rcy4KLSAgICBcdmFs
dWUgU3RvcCBTdG9wIGxvYWRpbmcgdGhlIGN1cnJlbnQgcGFnZS4KLSAgICBcdmFsdWUgU3RvcFNj
aGVkdWxlZFBhZ2VSZWZyZXNoIFN0b3AgYWxsIHBlbmRpbmcgcGFnZSByZWZyZXNoL3JlZGlyZWN0
IHJlcXVlc3RzLiAgKEFkZGVkIGluIFF0IDQuNykKLSAgICBcdmFsdWUgUmVsb2FkIFJlbG9hZCB0
aGUgY3VycmVudCBwYWdlLgotICAgIFx2YWx1ZSBSZWxvYWRBbmRCeXBhc3NDYWNoZSBSZWxvYWQg
dGhlIGN1cnJlbnQgcGFnZSwgYnV0IGRvIG5vdCB1c2UgYW55IGxvY2FsIGNhY2hlLiAoQWRkZWQg
aW4gUXQgNC42KQotICAgIFx2YWx1ZSBDdXQgQ3V0IHRoZSBjb250ZW50IGN1cnJlbnRseSBzZWxl
Y3RlZCBpbnRvIHRoZSBjbGlwYm9hcmQuCi0gICAgXHZhbHVlIENvcHkgQ29weSB0aGUgY29udGVu
dCBjdXJyZW50bHkgc2VsZWN0ZWQgaW50byB0aGUgY2xpcGJvYXJkLgotICAgIFx2YWx1ZSBQYXN0
ZSBQYXN0ZSBjb250ZW50IGZyb20gdGhlIGNsaXBib2FyZC4KLSAgICBcdmFsdWUgVW5kbyBVbmRv
IHRoZSBsYXN0IGVkaXRpbmcgYWN0aW9uLgotICAgIFx2YWx1ZSBSZWRvIFJlZG8gdGhlIGxhc3Qg
ZWRpdGluZyBhY3Rpb24uCi0gICAgXHZhbHVlIE1vdmVUb05leHRDaGFyIE1vdmUgdGhlIGN1cnNv
ciB0byB0aGUgbmV4dCBjaGFyYWN0ZXIuCi0gICAgXHZhbHVlIE1vdmVUb1ByZXZpb3VzQ2hhciBN
b3ZlIHRoZSBjdXJzb3IgdG8gdGhlIHByZXZpb3VzIGNoYXJhY3Rlci4KLSAgICBcdmFsdWUgTW92
ZVRvTmV4dFdvcmQgTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBuZXh0IHdvcmQuCi0gICAgXHZhbHVl
IE1vdmVUb1ByZXZpb3VzV29yZCBNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIHByZXZpb3VzIHdvcmQu
Ci0gICAgXHZhbHVlIE1vdmVUb05leHRMaW5lIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgbmV4dCBs
aW5lLgotICAgIFx2YWx1ZSBNb3ZlVG9QcmV2aW91c0xpbmUgTW92ZSB0aGUgY3Vyc29yIHRvIHRo
ZSBwcmV2aW91cyBsaW5lLgotICAgIFx2YWx1ZSBNb3ZlVG9TdGFydE9mTGluZSBNb3ZlIHRoZSBj
dXJzb3IgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLgotICAgIFx2YWx1ZSBNb3ZlVG9FbmRPZkxp
bmUgTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUuCi0gICAgXHZhbHVlIE1v
dmVUb1N0YXJ0T2ZCbG9jayBNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIHN0YXJ0IG9mIHRoZSBibG9j
ay4KLSAgICBcdmFsdWUgTW92ZVRvRW5kT2ZCbG9jayBNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIGVu
ZCBvZiB0aGUgYmxvY2suCi0gICAgXHZhbHVlIE1vdmVUb1N0YXJ0T2ZEb2N1bWVudCBNb3ZlIHRo
ZSBjdXJzb3IgdG8gdGhlIHN0YXJ0IG9mIHRoZSBkb2N1bWVudC4KLSAgICBcdmFsdWUgTW92ZVRv
RW5kT2ZEb2N1bWVudCBNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQu
Ci0gICAgXHZhbHVlIFNlbGVjdE5leHRDaGFyIFNlbGVjdCB0byB0aGUgbmV4dCBjaGFyYWN0ZXIu
Ci0gICAgXHZhbHVlIFNlbGVjdFByZXZpb3VzQ2hhciBTZWxlY3QgdG8gdGhlIHByZXZpb3VzIGNo
YXJhY3Rlci4KLSAgICBcdmFsdWUgU2VsZWN0TmV4dFdvcmQgU2VsZWN0IHRvIHRoZSBuZXh0IHdv
cmQuCi0gICAgXHZhbHVlIFNlbGVjdFByZXZpb3VzV29yZCBTZWxlY3QgdG8gdGhlIHByZXZpb3Vz
IHdvcmQuCi0gICAgXHZhbHVlIFNlbGVjdE5leHRMaW5lIFNlbGVjdCB0byB0aGUgbmV4dCBsaW5l
LgotICAgIFx2YWx1ZSBTZWxlY3RQcmV2aW91c0xpbmUgU2VsZWN0IHRvIHRoZSBwcmV2aW91cyBs
aW5lLgotICAgIFx2YWx1ZSBTZWxlY3RTdGFydE9mTGluZSBTZWxlY3QgdG8gdGhlIHN0YXJ0IG9m
IHRoZSBsaW5lLgotICAgIFx2YWx1ZSBTZWxlY3RFbmRPZkxpbmUgU2VsZWN0IHRvIHRoZSBlbmQg
b2YgdGhlIGxpbmUuCi0gICAgXHZhbHVlIFNlbGVjdFN0YXJ0T2ZCbG9jayBTZWxlY3QgdG8gdGhl
IHN0YXJ0IG9mIHRoZSBibG9jay4KLSAgICBcdmFsdWUgU2VsZWN0RW5kT2ZCbG9jayBTZWxlY3Qg
dG8gdGhlIGVuZCBvZiB0aGUgYmxvY2suCi0gICAgXHZhbHVlIFNlbGVjdFN0YXJ0T2ZEb2N1bWVu
dCBTZWxlY3QgdG8gdGhlIHN0YXJ0IG9mIHRoZSBkb2N1bWVudC4KLSAgICBcdmFsdWUgU2VsZWN0
RW5kT2ZEb2N1bWVudCBTZWxlY3QgdG8gdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQuCi0gICAgXHZh
bHVlIERlbGV0ZVN0YXJ0T2ZXb3JkIERlbGV0ZSB0byB0aGUgc3RhcnQgb2YgdGhlIHdvcmQuCi0g
ICAgXHZhbHVlIERlbGV0ZUVuZE9mV29yZCBEZWxldGUgdG8gdGhlIGVuZCBvZiB0aGUgd29yZC4K
LSAgICBcdmFsdWUgU2V0VGV4dERpcmVjdGlvbkRlZmF1bHQgU2V0IHRoZSB0ZXh0IGRpcmVjdGlv
biB0byB0aGUgZGVmYXVsdCBkaXJlY3Rpb24uCi0gICAgXHZhbHVlIFNldFRleHREaXJlY3Rpb25M
ZWZ0VG9SaWdodCBTZXQgdGhlIHRleHQgZGlyZWN0aW9uIHRvIGxlZnQtdG8tcmlnaHQuCi0gICAg
XHZhbHVlIFNldFRleHREaXJlY3Rpb25SaWdodFRvTGVmdCBTZXQgdGhlIHRleHQgZGlyZWN0aW9u
IHRvIHJpZ2h0LXRvLWxlZnQuCi0gICAgXHZhbHVlIFRvZ2dsZUJvbGQgVG9nZ2xlIHRoZSBmb3Jt
YXR0aW5nIGJldHdlZW4gYm9sZCBhbmQgbm9ybWFsIHdlaWdodC4KLSAgICBcdmFsdWUgVG9nZ2xl
SXRhbGljIFRvZ2dsZSB0aGUgZm9ybWF0dGluZyBiZXR3ZWVuIGl0YWxpYyBhbmQgbm9ybWFsIHN0
eWxlLgotICAgIFx2YWx1ZSBUb2dnbGVVbmRlcmxpbmUgVG9nZ2xlIHVuZGVybGluaW5nLgotICAg
IFx2YWx1ZSBJbnNwZWN0RWxlbWVudCBTaG93IHRoZSBXZWIgSW5zcGVjdG9yIHdpdGggdGhlIGN1
cnJlbnRseSBoaWdobGlnaHRlZCBIVE1MIGVsZW1lbnQuCi0gICAgXHZhbHVlIEluc2VydFBhcmFn
cmFwaFNlcGFyYXRvciBJbnNlcnQgYSBuZXcgcGFyYWdyYXBoLgotICAgIFx2YWx1ZSBJbnNlcnRM
aW5lU2VwYXJhdG9yIEluc2VydCBhIG5ldyBsaW5lLgotICAgIFx2YWx1ZSBTZWxlY3RBbGwgU2Vs
ZWN0cyBhbGwgY29udGVudC4KLSAgICBcdmFsdWUgUGFzdGVBbmRNYXRjaFN0eWxlIFBhc3RlIGNv
bnRlbnQgZnJvbSB0aGUgY2xpcGJvYXJkIHdpdGggY3VycmVudCBzdHlsZS4gKEFkZGVkIGluIFF0
IDQuNikKLSAgICBcdmFsdWUgUmVtb3ZlRm9ybWF0IFJlbW92ZXMgZm9ybWF0dGluZyBhbmQgc3R5
bGUuIChBZGRlZCBpbiBRdCA0LjYpCi0gICAgXHZhbHVlIFRvZ2dsZVN0cmlrZXRocm91Z2ggVG9n
Z2xlIHRoZSBmb3JtYXR0aW5nIGJldHdlZW4gc3RyaWtldGhyb3VnaCBhbmQgbm9ybWFsIHN0eWxl
LiAoQWRkZWQgaW4gUXQgNC42KQotICAgIFx2YWx1ZSBUb2dnbGVTdWJzY3JpcHQgVG9nZ2xlIHRo
ZSBmb3JtYXR0aW5nIGJldHdlZW4gc3Vic2NyaXB0IGFuZCBiYXNlbGluZS4gKEFkZGVkIGluIFF0
IDQuNikKLSAgICBcdmFsdWUgVG9nZ2xlU3VwZXJzY3JpcHQgVG9nZ2xlIHRoZSBmb3JtYXR0aW5n
IGJldHdlZW4gc3VwZXJjcmlwdCBhbmQgYmFzZWxpbmUuIChBZGRlZCBpbiBRdCA0LjYpCi0gICAg
XHZhbHVlIEluc2VydFVub3JkZXJlZExpc3QgVG9nZ2xlcyB0aGUgc2VsZWN0aW9uIGJldHdlZW4g
YW4gb3JkZXJlZCBsaXN0IGFuZCBhIG5vcm1hbCBibG9jay4gKEFkZGVkIGluIFF0IDQuNikKLSAg
ICBcdmFsdWUgSW5zZXJ0T3JkZXJlZExpc3QgVG9nZ2xlcyB0aGUgc2VsZWN0aW9uIGJldHdlZW4g
YW4gb3JkZXJlZCBsaXN0IGFuZCBhIG5vcm1hbCBibG9jay4gKEFkZGVkIGluIFF0IDQuNikKLSAg
ICBcdmFsdWUgSW5kZW50IEluY3JlYXNlcyB0aGUgaW5kZW50YXRpb24gb2YgdGhlIGN1cnJlbnRs
eSBzZWxlY3RlZCBmb3JtYXQgYmxvY2sgYnkgb25lIGluY3JlbWVudC4gKEFkZGVkIGluIFF0IDQu
NikKLSAgICBcdmFsdWUgT3V0ZGVudCBEZWNyZWFzZXMgdGhlIGluZGVudGF0aW9uIG9mIHRoZSBj
dXJyZW50bHkgc2VsZWN0ZWQgZm9ybWF0IGJsb2NrIGJ5IG9uZSBpbmNyZW1lbnQuIChBZGRlZCBp
biBRdCA0LjYpCi0gICAgXHZhbHVlIEFsaWduQ2VudGVyIEFwcGxpZXMgY2VudGVyIGFsaWdubWVu
dCB0byBjb250ZW50LiAoQWRkZWQgaW4gUXQgNC42KQotICAgIFx2YWx1ZSBBbGlnbkp1c3RpZmll
ZCBBcHBsaWVzIGZ1bGwganVzdGlmaWNhdGlvbiB0byBjb250ZW50LiAoQWRkZWQgaW4gUXQgNC42
KQotICAgIFx2YWx1ZSBBbGlnbkxlZnQgQXBwbGllcyBsZWZ0IGp1c3RpZmljYXRpb24gdG8gY29u
dGVudC4gKEFkZGVkIGluIFF0IDQuNikKLSAgICBcdmFsdWUgQWxpZ25SaWdodCBBcHBsaWVzIHJp
Z2h0IGp1c3RpZmljYXRpb24gdG8gY29udGVudC4gKEFkZGVkIGluIFF0IDQuNikKLQotCi0gICAg
XG9taXR2YWx1ZSBXZWJBY3Rpb25Db3VudAotCi0qLwotCi0vKiEKLSAgICBcZW51bSBRV2ViUGFn
ZTo6V2ViV2luZG93VHlwZQotCi0gICAgVGhpcyBlbnVtIGRlc2NyaWJlcyB0aGUgdHlwZXMgb2Yg
d2luZG93IHRoYXQgY2FuIGJlIGNyZWF0ZWQgYnkgdGhlIGNyZWF0ZVdpbmRvdygpIGZ1bmN0aW9u
LgotCi0gICAgXHZhbHVlIFdlYkJyb3dzZXJXaW5kb3cgVGhlIHdpbmRvdyBpcyBhIHJlZ3VsYXIg
d2ViIGJyb3dzZXIgd2luZG93LgotICAgIFx2YWx1ZSBXZWJNb2RhbERpYWxvZyBUaGUgd2luZG93
IGFjdHMgYXMgbW9kYWwgZGlhbG9nLgotKi8KLQotCi0vKiEKLSAgICBcY2xhc3MgUVdlYlBhZ2U6
OlZpZXdwb3J0QXR0cmlidXRlcwotICAgIFxzaW5jZSA0LjcKLSAgICBcYnJpZWYgVGhlIFFXZWJQ
YWdlOjpWaWV3cG9ydEF0dHJpYnV0ZXMgY2xhc3MgZGVzY3JpYmVzIGhpbnRzIHRoYXQgY2FuIGJl
IGFwcGxpZWQgdG8gYSB2aWV3cG9ydC4KLQotICAgIFFXZWJQYWdlOjpWaWV3cG9ydEF0dHJpYnV0
ZXMgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBvZiBhIHZpZXdwb3J0LCBzdWNoIGFzIHZpZXdwb3J0
IGdlb21ldHJ5LAotICAgIGluaXRpYWwgc2NhbGUgZmFjdG9yIHdpdGggbGltaXRzLCBwbHVzIGlu
Zm9ybWF0aW9uIGFib3V0IHdoZXRoZXIgYSB1c2VyIHNob3VsZCBiZSBhYmxlCi0gICAgdG8gc2Nh
bGUgdGhlIGNvbnRlbnRzIGluIHRoZSB2aWV3cG9ydCBvciBub3QsIGllLiBieSB6b29taW5nLgot
Ci0gICAgVmlld3BvcnRBdHRyaWJ1dGVzIGNhbiBiZSBzZXQgYnkgYSB3ZWIgYXV0aG9yIHVzaW5n
IHRoZSB2aWV3cG9ydCBtZXRhIHRhZyBleHRlbnNpb24sIGRvY3VtZW50ZWQKLSAgICBhdCBcbHto
dHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9zYWZhcmkvbGlicmFyeS9kb2N1bWVudGF0aW9uL2Fw
cGxlYXBwbGljYXRpb25zL3JlZmVyZW5jZS9zYWZhcml3ZWJjb250ZW50L3VzaW5ndGhldmlld3Bv
cnQvdXNpbmd0aGV2aWV3cG9ydC5odG1sfXtTYWZhcmkgUmVmZXJlbmNlIExpYnJhcnk6IFVzaW5n
IHRoZSBWaWV3cG9ydCBNZXRhIFRhZ30uCi0KLSAgICBBbGwgdmFsdWVzIG1pZ2h0IG5vdCBiZSBz
ZXQsIGFzIHN1Y2ggd2hlbiBkZWFsaW5nIHdpdGggdGhlIGhpbnRzLCB0aGUgZGV2ZWxvcGVyIG5l
ZWRzIHRvCi0gICAgY2hlY2sgd2hldGhlciB0aGUgdmFsdWVzIGFyZSB2YWxpZC4gTmVnYXRpdmUg
dmFsdWVzIGRlbm90ZSBhbiBpbnZhbGlkIHFyZWFsIHZhbHVlLgotCi0gICAgXGlubW9kdWxlIFF0
V2ViS2l0Ci0qLwotCi0vKiEKLSAgICBDb25zdHJ1Y3RzIGFuIGVtcHR5IFFXZWJQYWdlOjpWaWV3
cG9ydEF0dHJpYnV0ZXMuCi0qLwotUVdlYlBhZ2U6OlZpZXdwb3J0QXR0cmlidXRlczo6Vmlld3Bv
cnRBdHRyaWJ1dGVzKCkKLSAgICA6IGQoMCkKLSAgICAsIG1faW5pdGlhbFNjYWxlRmFjdG9yKC0x
LjApCi0gICAgLCBtX21pbmltdW1TY2FsZUZhY3RvcigtMS4wKQotICAgICwgbV9tYXhpbXVtU2Nh
bGVGYWN0b3IoLTEuMCkKLSAgICAsIG1fZGV2aWNlUGl4ZWxSYXRpbygtMS4wKQotICAgICwgbV9p
c1VzZXJTY2FsYWJsZSh0cnVlKQotICAgICwgbV9pc1ZhbGlkKGZhbHNlKQotewotCi19Ci0KLS8q
IQotICAgIENvbnN0cnVjdHMgYSBRV2ViUGFnZTo6Vmlld3BvcnRBdHRyaWJ1dGVzIHdoaWNoIGlz
IGEgY29weSBmcm9tIFxhIG90aGVyIC4KLSovCi1RV2ViUGFnZTo6Vmlld3BvcnRBdHRyaWJ1dGVz
OjpWaWV3cG9ydEF0dHJpYnV0ZXMoY29uc3QgUVdlYlBhZ2U6OlZpZXdwb3J0QXR0cmlidXRlcyYg
b3RoZXIpCi0gICAgOiBkKG90aGVyLmQpCi0gICAgLCBtX2luaXRpYWxTY2FsZUZhY3RvcihvdGhl
ci5tX2luaXRpYWxTY2FsZUZhY3RvcikKLSAgICAsIG1fbWluaW11bVNjYWxlRmFjdG9yKG90aGVy
Lm1fbWluaW11bVNjYWxlRmFjdG9yKQotICAgICwgbV9tYXhpbXVtU2NhbGVGYWN0b3Iob3RoZXIu
bV9tYXhpbXVtU2NhbGVGYWN0b3IpCi0gICAgLCBtX2RldmljZVBpeGVsUmF0aW8ob3RoZXIubV9k
ZXZpY2VQaXhlbFJhdGlvKQotICAgICwgbV9pc1VzZXJTY2FsYWJsZShvdGhlci5tX2lzVXNlclNj
YWxhYmxlKQotICAgICwgbV9pc1ZhbGlkKG90aGVyLm1faXNWYWxpZCkKLSAgICAsIG1fc2l6ZShv
dGhlci5tX3NpemUpCi17Ci0KLX0KLQotLyohCi0gICAgRGVzdHJveXMgdGhlIFFXZWJQYWdlOjpW
aWV3cG9ydEF0dHJpYnV0ZXMuCi0qLwotUVdlYlBhZ2U6OlZpZXdwb3J0QXR0cmlidXRlczo6flZp
ZXdwb3J0QXR0cmlidXRlcygpCi17Ci0KLX0KLQotLyohCi0gICAgQXNzaWducyB0aGUgZ2l2ZW4g
UVdlYlBhZ2U6OlZpZXdwb3J0QXR0cmlidXRlcyB0byB0aGlzIHZpZXdwb3J0IGhpbnRzIGFuZCBy
ZXR1cm5zIGEKLSAgICByZWZlcmVuY2UgdG8gdGhpcy4KLSovCi1RV2ViUGFnZTo6Vmlld3BvcnRB
dHRyaWJ1dGVzJiBRV2ViUGFnZTo6Vmlld3BvcnRBdHRyaWJ1dGVzOjpvcGVyYXRvcj0oY29uc3Qg
UVdlYlBhZ2U6OlZpZXdwb3J0QXR0cmlidXRlcyYgb3RoZXIpCi17Ci0gICAgaWYgKHRoaXMgIT0g
Jm90aGVyKSB7Ci0gICAgICAgIGQgPSBvdGhlci5kOwotICAgICAgICBtX2luaXRpYWxTY2FsZUZh
Y3RvciA9IG90aGVyLm1faW5pdGlhbFNjYWxlRmFjdG9yOwotICAgICAgICBtX21pbmltdW1TY2Fs
ZUZhY3RvciA9IG90aGVyLm1fbWluaW11bVNjYWxlRmFjdG9yOwotICAgICAgICBtX21heGltdW1T
Y2FsZUZhY3RvciA9IG90aGVyLm1fbWF4aW11bVNjYWxlRmFjdG9yOwotICAgICAgICBtX2lzVXNl
clNjYWxhYmxlID0gb3RoZXIubV9pc1VzZXJTY2FsYWJsZTsKLSAgICAgICAgbV9pc1ZhbGlkID0g
b3RoZXIubV9pc1ZhbGlkOwotICAgICAgICBtX3NpemUgPSBvdGhlci5tX3NpemU7Ci0gICAgfQot
Ci0gICAgcmV0dXJuICp0aGlzOwotfQotCi0vKiEgXGZuIGlubGluZSBib29sIFFXZWJQYWdlOjpW
aWV3cG9ydEF0dHJpYnV0ZXM6OmlzVmFsaWQoKSBjb25zdAotICAgIFJldHVybnMgd2hldGhlciB0
aGlzIGlzIGEgdmFsaWQgVmlld3BvcnRBdHRyaWJ1dGVzIG9yIG5vdC4KLQotICAgIEFuIGludmFs
aWQgVmlld3BvcnRBdHRyaWJ1dGVzIHdpbGwgaGF2ZSBhbiBlbXB0eSBRU2l6ZSwgbmVnYXRpdmUg
dmFsdWVzIGZvciBzY2FsZSBmYWN0b3JzIGFuZAotICAgIHRydWUgZm9yIHRoZSBib29sZWFuIGlz
VXNlclNjYWxhYmxlLgotKi8KLQotLyohIFxmbiBpbmxpbmUgUVNpemUgUVdlYlBhZ2U6OlZpZXdw
b3J0QXR0cmlidXRlczo6c2l6ZSgpIGNvbnN0Ci0gICAgUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUg
dmlld3BvcnQuCi0qLwotCi0vKiEgXGZuIGlubGluZSBxcmVhbCBRV2ViUGFnZTo6Vmlld3BvcnRB
dHRyaWJ1dGVzOjppbml0aWFsU2NhbGVGYWN0b3IoKSBjb25zdAotICAgIFJldHVybnMgdGhlIGlu
aXRpYWwgc2NhbGUgb2YgdGhlIHZpZXdwb3J0IGFzIGEgbXVsdGlwbGllci4KLSovCi0KLS8qISBc
Zm4gaW5saW5lIHFyZWFsIFFXZWJQYWdlOjpWaWV3cG9ydEF0dHJpYnV0ZXM6Om1pbmltdW1TY2Fs
ZUZhY3RvcigpIGNvbnN0Ci0gICAgUmV0dXJucyB0aGUgbWluaW11bSBzY2FsZSB2YWx1ZSBvZiB0
aGUgdmlld3BvcnQgYXMgYSBtdWx0aXBsaWVyLgotKi8KLQotLyohIFxmbiBpbmxpbmUgcXJlYWwg
UVdlYlBhZ2U6OlZpZXdwb3J0QXR0cmlidXRlczo6bWF4aW11bVNjYWxlRmFjdG9yKCkgY29uc3QK
LSAgICBSZXR1cm5zIHRoZSBtYXhpbXVtIHNjYWxlIHZhbHVlIG9mIHRoZSB2aWV3cG9ydCBhcyBh
IG11bHRpcGxpZXIuCi0qLwotCi0vKiEgXGZuIGlubGluZSBib29sIFFXZWJQYWdlOjpWaWV3cG9y
dEF0dHJpYnV0ZXM6OmlzVXNlclNjYWxhYmxlKCkgY29uc3QKLSAgICBEZXRlcm1pbmVzIHdoZXRo
ZXIgb3Igbm90IHRoZSBzY2FsZSBjYW4gYmUgbW9kaWZpZWQgYnkgdGhlIHVzZXIuCi0qLwotCi0K
LS8qIQotICAgIFxjbGFzcyBRV2ViUGFnZQotICAgIFxzaW5jZSA0LjQKLSAgICBcYnJpZWYgVGhl
IFFXZWJQYWdlIGNsYXNzIHByb3ZpZGVzIGFuIG9iamVjdCB0byB2aWV3IGFuZCBlZGl0IHdlYiBk
b2N1bWVudHMuCi0KLSAgICBcaW5tb2R1bGUgUXRXZWJLaXQKLQotICAgIFFXZWJQYWdlIGhvbGRz
IGEgbWFpbiBmcmFtZSByZXNwb25zaWJsZSBmb3Igd2ViIGNvbnRlbnQsIHNldHRpbmdzLCB0aGUg
aGlzdG9yeQotICAgIG9mIG5hdmlnYXRlZCBsaW5rcyBhbmQgYWN0aW9ucy4gVGhpcyBjbGFzcyBj
YW4gYmUgdXNlZCwgdG9nZXRoZXIgd2l0aCBRV2ViRnJhbWUsCi0gICAgdG8gcHJvdmlkZSBmdW5j
dGlvbmFsaXR5IGxpa2UgUVdlYlZpZXcgaW4gYSB3aWRnZXQtbGVzcyBlbnZpcm9ubWVudC4KLQot
ICAgIFFXZWJQYWdlJ3MgQVBJIGlzIHZlcnkgc2ltaWxhciB0byBRV2ViVmlldywgYXMgeW91IGFy
ZSBzdGlsbCBwcm92aWRlZCB3aXRoCi0gICAgY29tbW9uIGZ1bmN0aW9ucyBsaWtlIGFjdGlvbigp
IChrbm93biBhcwotICAgIFxse1FXZWJWaWV3OjpwYWdlQWN0aW9uKCl9e3BhZ2VBY3Rpb259KCkg
aW4gUVdlYlZpZXcpLCB0cmlnZ2VyQWN0aW9uKCksCi0gICAgZmluZFRleHQoKSBhbmQgc2V0dGlu
Z3MoKS4gTW9yZSBRV2ViVmlldy1saWtlIGZ1bmN0aW9ucyBjYW4gYmUgZm91bmQgaW4gdGhlCi0g
ICAgbWFpbiBmcmFtZSBvZiBRV2ViUGFnZSwgb2J0YWluZWQgdmlhIHRoZSBtYWluRnJhbWUoKSBm
dW5jdGlvbi4gRm9yIGV4YW1wbGUsCi0gICAgdGhlIFxse1FXZWJGcmFtZTo6bG9hZCgpfXtsb2Fk
fSgpLCBcbHtRV2ViRnJhbWU6OnNldFVybCgpfXtzZXRVcmx9KCkgYW5kCi0gICAgXGx7UVdlYkZy
YW1lOjpzZXRIdG1sKCl9e3NldEh0bWx9KCkgZnVuY3Rpb25zIGZvciBRV2ViUGFnZSBjYW4gYmUg
YWNjZXNzZWQKLSAgICB1c2luZyBRV2ViRnJhbWUuCi0KLSAgICBUaGUgbG9hZFN0YXJ0ZWQoKSBz
aWduYWwgaXMgZW1pdHRlZCB3aGVuIHRoZSBwYWdlIGJlZ2lucyB0byBsb2FkLlRoZQotICAgIGxv
YWRQcm9ncmVzcygpIHNpZ25hbCwgb24gdGhlIG90aGVyIGhhbmQsIGlzIGVtaXR0ZWQgd2hlbmV2
ZXIgYW4gZWxlbWVudAotICAgIG9mIHRoZSB3ZWIgcGFnZSBjb21wbGV0ZXMgbG9hZGluZywgc3Vj
aCBhcyBhbiBlbWJlZGRlZCBpbWFnZSwgYSBzY3JpcHQsCi0gICAgZXRjLiBGaW5hbGx5LCB0aGUg
bG9hZEZpbmlzaGVkKCkgc2lnbmFsIGlzIGVtaXR0ZWQgd2hlbiB0aGUgcGFnZSBjb250ZW50cwot
ICAgIGFyZSBsb2FkZWQgY29tcGxldGVseSwgaW5kZXBlbmRlbnQgb2Ygc2NyaXB0IGV4ZWN1dGlv
biBvciBwYWdlIHJlbmRlcmluZy4KLSAgICBJdHMgYXJndW1lbnQsIGVpdGhlciB0cnVlIG9yIGZh
bHNlLCBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIGxvYWQKLSAgICBvcGVyYXRpb24gc3Vj
Y2VlZGVkLgotCi0gICAgXHNlY3Rpb24xIFVzaW5nIFFXZWJQYWdlIGluIGEgV2lkZ2V0LWxlc3Mg
RW52aXJvbm1lbnQKLQotICAgIEJlZm9yZSB5b3UgYmVnaW4gcGFpbnRpbmcgYSBRV2ViUGFnZSBv
YmplY3QsIHlvdSBuZWVkIHRvIHNldCB0aGUgc2l6ZSBvZgotICAgIHRoZSB2aWV3cG9ydCBieSBj
YWxsaW5nIHNldFZpZXdwb3J0U2l6ZSgpLiBUaGVuLCB5b3UgaW52b2tlIHRoZSBtYWluCi0gICAg
ZnJhbWUncyByZW5kZXIgZnVuY3Rpb24gKFFXZWJGcmFtZTo6cmVuZGVyKCkpLiBBbiBleGFtcGxl
IG9mIHRoaXMKLSAgICBpcyBzaG93biBpbiB0aGUgY29kZSBzbmlwcGV0IGJlbG93LgotCi0gICAg
U3VwcG9zZSB3ZSBoYXZlIGEgXGMgVGh1bWJuYWlsIGNsYXNzIGFzIGZvbGxvd3M6Ci0KLSAgICBc
c25pcHBldCB3ZWJraXRzbmlwcGV0cy93ZWJwYWdlL21haW4uY3BwIDAKLQotICAgIFRoZSBcYyBU
aHVtYm5haWwncyBjb25zdHJ1Y3RvciB0YWtlcyBpbiBhIFxhIHVybC4gV2UgY29ubmVjdCBvdXIg
UVdlYlBhZ2UKLSAgICBvYmplY3QncyBcbHtRV2ViUGFnZTo6fXtsb2FkRmluaXNoZWQoKX0gc2ln
bmFsIHRvIG91ciBwcml2YXRlIHNsb3QsCi0gICAgXGMgcmVuZGVyKCkuCi0KLSAgICBcc25pcHBl
dCB3ZWJraXRzbmlwcGV0cy93ZWJwYWdlL21haW4uY3BwIDEKLQotICAgIFRoZSBcYyByZW5kZXIo
KSBmdW5jdGlvbiBzaG93cyBob3cgd2UgY2FuIHBhaW50IGEgdGh1bWJuYWlsIHVzaW5nIGEKLSAg
ICBRV2ViUGFnZSBvYmplY3QuCi0KLSAgICBcc25pcHBldCB3ZWJraXRzbmlwcGV0cy93ZWJwYWdl
L21haW4uY3BwIDIKLQotICAgIFdlIGJlZ2luIGJ5IHNldHRpbmcgdGhlIFxse1FXZWJQYWdlOjp2
aWV3cG9ydFNpemUoKX17dmlld3BvcnRTaXplfSBhbmQKLSAgICB0aGVuIHdlIGluc3RhbnRpYXRl
IGEgUUltYWdlIG9iamVjdCwgXGMgaW1hZ2UsIHdpdGggdGhlIHNhbWUgc2l6ZSBhcyBvdXIKLSAg
ICBcbHtRV2ViUGFnZTo6dmlld3BvcnRTaXplKCl9e3ZpZXdwb3J0U2l6ZX0uIFRoaXMgaW1hZ2Ug
aXMgdGhlbiBzZW50Ci0gICAgYXMgYSBwYXJhbWV0ZXIgdG8gXGMgcGFpbnRlci4gTmV4dCwgd2Ug
cmVuZGVyIHRoZSBjb250ZW50cyBvZiB0aGUgbWFpbgotICAgIGZyYW1lIGFuZCBpdHMgc3ViZnJh
bWVzIGludG8gXGMgcGFpbnRlci4gRmluYWxseSwgd2Ugc2F2ZSB0aGUgc2NhbGVkIGltYWdlLgot
Ci0gICAgXHNhIFFXZWJGcmFtZQotKi8KLQotLyohCi0gICAgQ29uc3RydWN0cyBhbiBlbXB0eSBR
V2ViUGFnZSB3aXRoIHBhcmVudCBcYSBwYXJlbnQuCi0qLwotUVdlYlBhZ2U6OlFXZWJQYWdlKFFP
YmplY3QgKnBhcmVudCkKLSAgICA6IFFPYmplY3QocGFyZW50KQotICAgICwgZChuZXcgUVdlYlBh
Z2VQcml2YXRlKHRoaXMpKQotewotICAgIHNldFZpZXcocW9iamVjdF9jYXN0PFFXaWRnZXQqPihw
YXJlbnQpKTsKLQotICAgIGNvbm5lY3QodGhpcywgU0lHTkFMKGxvYWRQcm9ncmVzcyhpbnQpKSwg
dGhpcywgU0xPVChfcV9vbkxvYWRQcm9ncmVzc0NoYW5nZWQoaW50KSkpOwotI2lmbmRlZiBOREVC
VUcKLSAgICBjb25uZWN0KFFDb3JlQXBwbGljYXRpb246Omluc3RhbmNlKCksIFNJR05BTChhYm91
dFRvUXVpdCgpKSwgdGhpcywgU0xPVChfcV9jbGVhbnVwTGVha01lc3NhZ2VzKCkpKTsKLSNlbmRp
ZgotfQotCi0vKiEKLSAgICBEZXN0cm95cyB0aGUgd2ViIHBhZ2UuCi0qLwotUVdlYlBhZ2U6On5R
V2ViUGFnZSgpCi17Ci0gICAgZC0+Y3JlYXRlTWFpbkZyYW1lKCk7Ci0gICAgRnJhbWVMb2FkZXIq
IGxvYWRlciA9IGQtPm1haW5GcmFtZS5kYXRhKCktPmQtPmZyYW1lLT5sb2FkZXIoKTsKLSAgICBp
ZiAobG9hZGVyKQotICAgICAgICBsb2FkZXItPmRldGFjaEZyb21QYXJlbnQoKTsKLSAgICBkZWxl
dGUgZDsKLX0KLQotLyohCi0gICAgUmV0dXJucyB0aGUgbWFpbiBmcmFtZSBvZiB0aGUgcGFnZS4K
LQotICAgIFRoZSBtYWluIGZyYW1lIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgaGllcmFyY2h5IG9m
IHN1Yi1mcmFtZXMgYW5kIGlzIGFsc28gbmVlZGVkIGlmIHlvdQotICAgIHdhbnQgdG8gZXhwbGlj
aXRseSByZW5kZXIgYSB3ZWIgcGFnZSBpbnRvIGEgZ2l2ZW4gcGFpbnRlci4KLQotICAgIFxzYSBj
dXJyZW50RnJhbWUoKQotKi8KLVFXZWJGcmFtZSAqUVdlYlBhZ2U6Om1haW5GcmFtZSgpIGNvbnN0
Ci17Ci0gICAgZC0+Y3JlYXRlTWFpbkZyYW1lKCk7Ci0gICAgcmV0dXJuIGQtPm1haW5GcmFtZS5k
YXRhKCk7Ci19Ci0KLS8qIQotICAgIFJldHVybnMgdGhlIGZyYW1lIGN1cnJlbnRseSBhY3RpdmUu
Ci0KLSAgICBcc2EgbWFpbkZyYW1lKCksIGZyYW1lQ3JlYXRlZCgpCi0qLwotUVdlYkZyYW1lICpR
V2ViUGFnZTo6Y3VycmVudEZyYW1lKCkgY29uc3QKLXsKLSAgICBkLT5jcmVhdGVNYWluRnJhbWUo
KTsKLSAgICBXZWJDb3JlOjpGcmFtZSAqZnJhbWUgPSBkLT5wYWdlLT5mb2N1c0NvbnRyb2xsZXIo
KS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCk7Ci0gICAgcmV0dXJuIHFvYmplY3RfY2FzdDxRV2ViRnJh
bWUqPihmcmFtZS0+bG9hZGVyKCktPm5ldHdvcmtpbmdDb250ZXh0KCktPm9yaWdpbmF0aW5nT2Jq
ZWN0KCkpOwotfQotCi0KLS8qIQotICAgIFxzaW5jZSA0LjYKLQotICAgIFJldHVybnMgdGhlIGZy
YW1lIGF0IHRoZSBnaXZlbiBwb2ludCBcYSBwb3MsIG9yIDAgaWYgdGhlcmUgaXMgbm8gZnJhbWUg
YXQKLSAgICB0aGF0IHBvc2l0aW9uLgotCi0gICAgXHNhIG1haW5GcmFtZSgpLCBjdXJyZW50RnJh
bWUoKQotKi8KLVFXZWJGcmFtZSogUVdlYlBhZ2U6OmZyYW1lQXQoY29uc3QgUVBvaW50JiBwb3Mp
IGNvbnN0Ci17Ci0gICAgUVdlYkZyYW1lKiB3ZWJGcmFtZSA9IG1haW5GcmFtZSgpOwotICAgIGlm
ICghd2ViRnJhbWUtPmdlb21ldHJ5KCkuY29udGFpbnMocG9zKSkKLSAgICAgICAgcmV0dXJuIDA7
Ci0gICAgUVdlYkhpdFRlc3RSZXN1bHQgaGl0VGVzdFJlc3VsdCA9IHdlYkZyYW1lLT5oaXRUZXN0
Q29udGVudChwb3MpOwotICAgIHJldHVybiBoaXRUZXN0UmVzdWx0LmZyYW1lKCk7Ci19Ci0KLS8q
IQotICAgIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSB2aWV3J3MgaGlzdG9yeSBvZiBuYXZpZ2F0
ZWQgd2ViIHBhZ2VzLgotKi8KLVFXZWJIaXN0b3J5ICpRV2ViUGFnZTo6aGlzdG9yeSgpIGNvbnN0
Ci17Ci0gICAgZC0+Y3JlYXRlTWFpbkZyYW1lKCk7Ci0gICAgcmV0dXJuICZkLT5oaXN0b3J5Owot
fQotCi0vKiEKLSAgICBTZXRzIHRoZSBcYSB2aWV3IHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRo
ZSB3ZWIgcGFnZS4KLQotICAgIFxzYSB2aWV3KCkKLSovCi12b2lkIFFXZWJQYWdlOjpzZXRWaWV3
KFFXaWRnZXQqIHZpZXcpCi17Ci0gICAgaWYgKHRoaXMtPnZpZXcoKSA9PSB2aWV3KQotICAgICAg
ICByZXR1cm47Ci0KLSAgICBkLT52aWV3ID0gdmlldzsKLSAgICBzZXRWaWV3cG9ydFNpemUodmll
dyA/IHZpZXctPnNpemUoKSA6IFFTaXplKDAsIDApKTsKLQotICAgIC8vIElmIHdlIGhhdmUgbm8g
Y2xpZW50LCB3ZSBpbnN0YWxsIGEgc3BlY2lhbCBjbGllbnQgZGVsZWdhdGluZwotICAgIC8vIHRo
ZSByZXNwb25zaWJpbGl0eSB0byB0aGUgUVdpZGdldC4gVGhpcyBpcyB0aGUgY29kZSBwYXRoCi0g
ICAgLy8gaGFuZGxpbmcgYS5vLiB0aGUgImxlZ2FjeSIgUVdlYlZpZXcuCi0gICAgLy8KLSAgICAv
LyBJZiBzdWNoIGEgc3BlY2lhbCBkZWxlZ2F0ZSBhbHJlYWR5IGV4aXN0LCB3ZSBzdWJzdGl0dXRl
IHRoZSB2aWV3LgotCi0gICAgaWYgKGQtPmNsaWVudCkgewotICAgICAgICBpZiAoZC0+Y2xpZW50
LT5pc1FXaWRnZXRDbGllbnQoKSkKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PFBhZ2VDbGllbnRR
V2lkZ2V0Kj4oZC0+Y2xpZW50LmRhdGEoKSktPnZpZXcgPSB2aWV3OwotICAgICAgICByZXR1cm47
Ci0gICAgfQotCi0gICAgaWYgKHZpZXcpCi0gICAgICAgIGQtPmNsaWVudC5yZXNldChuZXcgUGFn
ZUNsaWVudFFXaWRnZXQodmlldywgdGhpcykpOwotfQotCi0vKiEKLSAgICBSZXR1cm5zIHRoZSB2
aWV3IHdpZGdldCB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2ViIHBhZ2UuCi0KLSAgICBc
c2Egc2V0VmlldygpCi0qLwotUVdpZGdldCAqUVdlYlBhZ2U6OnZpZXcoKSBjb25zdAotewotICAg
IHJldHVybiBkLT52aWV3LmRhdGEoKTsKLX0KLQotLyohCi0gICAgVGhpcyBmdW5jdGlvbiBpcyBj
YWxsZWQgd2hlbmV2ZXIgYSBKYXZhU2NyaXB0IHByb2dyYW0gdHJpZXMgdG8gcHJpbnQgYSBcYSBt
ZXNzYWdlIHRvIHRoZSB3ZWIgYnJvd3NlcidzIGNvbnNvbGUuCi0KLSAgICBGb3IgZXhhbXBsZSBp
biBjYXNlIG9mIGV2YWx1YXRpb24gZXJyb3JzIHRoZSBzb3VyY2UgVVJMIG1heSBiZSBwcm92aWRl
ZCBpbiBcYSBzb3VyY2VJRCBhcyB3ZWxsIGFzIHRoZSBcYSBsaW5lTnVtYmVyLgotCi0gICAgVGhl
IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcHJpbnRzIG5vdGhpbmcuCi0qLwotdm9pZCBRV2ViUGFn
ZTo6amF2YVNjcmlwdENvbnNvbGVNZXNzYWdlKGNvbnN0IFFTdHJpbmcmIG1lc3NhZ2UsIGludCBs
aW5lTnVtYmVyLCBjb25zdCBRU3RyaW5nJiBzb3VyY2VJRCkKLXsKLSAgICBRX1VOVVNFRChzb3Vy
Y2VJRCkKLQotICAgIC8vIENhdGNoIHBsdWdpbiBsb2dEZXN0cm95IG1lc3NhZ2UgZm9yIExheW91
dFRlc3RzL3BsdWdpbnMvb3Blbi1hbmQtY2xvc2Utd2luZG93LXdpdGgtcGx1Z2luLmh0bWwKLSAg
ICAvLyBBdCB0aGlzIHBvaW50IERSVCdzIFdlYlBhZ2UgaGFzIGFscmVhZHkgYmVlbiBkZXN0cm95
ZWQKLSAgICBpZiAoUVdlYlBhZ2VBZGFwdGVyOjpkcnRSdW4pIHsKLSAgICAgICAgaWYgKG1lc3Nh
Z2UgPT0gUUxhdGluMVN0cmluZygiUExVR0lOOiBOUFBfRGVzdHJveSIpKSB7Ci0gICAgICAgICAg
ICBmcHJpbnRmKHN0ZG91dCwgIkNPTlNPTEUgTUVTU0FHRTogIik7Ci0gICAgICAgICAgICBpZiAo
bGluZU51bWJlcikKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgImxpbmUgJWQ6ICIs
IGxpbmVOdW1iZXIpOwotICAgICAgICAgICAgZnByaW50ZihzdGRvdXQsICIlc1xuIiwgbWVzc2Fn
ZS50b1V0ZjgoKS5jb25zdERhdGEoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8qIQotICAg
IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW5ldmVyIGEgSmF2YVNjcmlwdCBwcm9ncmFtIHJ1
bm5pbmcgaW5zaWRlIFxhIGZyYW1lIGNhbGxzIHRoZSBhbGVydCgpIGZ1bmN0aW9uIHdpdGgKLSAg
ICB0aGUgbWVzc2FnZSBcYSBtc2cuCi0KLSAgICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBz
aG93cyB0aGUgbWVzc2FnZSwgXGEgbXNnLCB3aXRoIFFNZXNzYWdlQm94OjppbmZvcm1hdGlvbi4K
LSovCi12b2lkIFFXZWJQYWdlOjpqYXZhU2NyaXB0QWxlcnQoUVdlYkZyYW1lICpmcmFtZSwgY29u
c3QgUVN0cmluZyYgbXNnKQotewotICAgIFFfVU5VU0VEKGZyYW1lKQotI2lmbmRlZiBRVF9OT19N
RVNTQUdFQk9YCi0gICAgUU1lc3NhZ2VCb3ggYm94KHZpZXcoKSk7Ci0gICAgYm94LnNldFdpbmRv
d1RpdGxlKHRyKCJKYXZhU2NyaXB0IEFsZXJ0IC0gJTEiKS5hcmcobWFpbkZyYW1lKCktPnVybCgp
Lmhvc3QoKSkpOwotICAgIGJveC5zZXRUZXh0Rm9ybWF0KFF0OjpQbGFpblRleHQpOwotICAgIGJv
eC5zZXRUZXh0KG1zZyk7Ci0gICAgYm94LnNldFN0YW5kYXJkQnV0dG9ucyhRTWVzc2FnZUJveDo6
T2spOwotICAgIGJveC5leGVjKCk7Ci0jZW5kaWYKLX0KLQotLyohCi0gICAgVGhpcyBmdW5jdGlv
biBpcyBjYWxsZWQgd2hlbmV2ZXIgYSBKYXZhU2NyaXB0IHByb2dyYW0gcnVubmluZyBpbnNpZGUg
XGEgZnJhbWUgY2FsbHMgdGhlIGNvbmZpcm0oKSBmdW5jdGlvbgotICAgIHdpdGggdGhlIG1lc3Nh
Z2UsIFxhIG1zZy4gUmV0dXJucyB0cnVlIGlmIHRoZSB1c2VyIGNvbmZpcm1zIHRoZSBtZXNzYWdl
OyBvdGhlcndpc2UgcmV0dXJucyBmYWxzZS4KLQotICAgIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0
aW9uIGV4ZWN1dGVzIHRoZSBxdWVyeSB1c2luZyBRTWVzc2FnZUJveDo6aW5mb3JtYXRpb24gd2l0
aCBRTWVzc2FnZUJveDo6T2sgYW5kIFFNZXNzYWdlQm94OjpDYW5jZWwgYnV0dG9ucy4KLSovCi1i
b29sIFFXZWJQYWdlOjpqYXZhU2NyaXB0Q29uZmlybShRV2ViRnJhbWUgKmZyYW1lLCBjb25zdCBR
U3RyaW5nJiBtc2cpCi17Ci0gICAgUV9VTlVTRUQoZnJhbWUpCi0jaWZkZWYgUVRfTk9fTUVTU0FH
RUJPWAotICAgIHJldHVybiB0cnVlOwotI2Vsc2UKLSAgICBRTWVzc2FnZUJveCBib3godmlldygp
KTsKLSAgICBib3guc2V0V2luZG93VGl0bGUodHIoIkphdmFTY3JpcHQgQ29uZmlybSAtICUxIiku
YXJnKG1haW5GcmFtZSgpLT51cmwoKS5ob3N0KCkpKTsKLSAgICBib3guc2V0VGV4dEZvcm1hdChR
dDo6UGxhaW5UZXh0KTsKLSAgICBib3guc2V0VGV4dChtc2cpOwotICAgIGJveC5zZXRTdGFuZGFy
ZEJ1dHRvbnMoUU1lc3NhZ2VCb3g6Ok9rIHwgUU1lc3NhZ2VCb3g6OkNhbmNlbCk7Ci0gICAgcmV0
dXJuIFFNZXNzYWdlQm94OjpPayA9PSBib3guZXhlYygpOwotI2VuZGlmCi19Ci0KLS8qIQotICAg
IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW5ldmVyIGEgSmF2YVNjcmlwdCBwcm9ncmFtIHJ1
bm5pbmcgaW5zaWRlIFxhIGZyYW1lIHRyaWVzIHRvIHByb21wdCB0aGUgdXNlciBmb3IgaW5wdXQu
Ci0gICAgVGhlIHByb2dyYW0gbWF5IHByb3ZpZGUgYW4gb3B0aW9uYWwgbWVzc2FnZSwgXGEgbXNn
LCBhcyB3ZWxsIGFzIGEgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGlucHV0IGluIFxhIGRlZmF1bHRW
YWx1ZS4KLQotICAgIElmIHRoZSBwcm9tcHQgd2FzIGNhbmNlbGxlZCBieSB0aGUgdXNlciB0aGUg
aW1wbGVtZW50YXRpb24gc2hvdWxkIHJldHVybiBmYWxzZTsgb3RoZXJ3aXNlIHRoZQotICAgIHJl
c3VsdCBzaG91bGQgYmUgd3JpdHRlbiB0byBcYSByZXN1bHQgYW5kIHRydWUgc2hvdWxkIGJlIHJl
dHVybmVkLiBJZiB0aGUgcHJvbXB0IHdhcyBub3QgY2FuY2VsbGVkIGJ5IHRoZQotICAgIHVzZXIs
IHRoZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgcmV0dXJuIHRydWUgYW5kIHRoZSByZXN1bHQgc3Ry
aW5nIG11c3Qgbm90IGJlIG51bGwuCi0KLSAgICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB1
c2VzIFFJbnB1dERpYWxvZzo6Z2V0VGV4dCgpLgotKi8KLWJvb2wgUVdlYlBhZ2U6OmphdmFTY3Jp
cHRQcm9tcHQoUVdlYkZyYW1lICpmcmFtZSwgY29uc3QgUVN0cmluZyYgbXNnLCBjb25zdCBRU3Ry
aW5nJiBkZWZhdWx0VmFsdWUsIFFTdHJpbmcqIHJlc3VsdCkKLXsKLSAgICBRX1VOVVNFRChmcmFt
ZSkKLSAgICBib29sIG9rID0gZmFsc2U7Ci0jaWZuZGVmIFFUX05PX0lOUFVURElBTE9HCi0KLSAg
ICBRSW5wdXREaWFsb2cgZGxnKHZpZXcoKSk7Ci0gICAgZGxnLnNldFdpbmRvd1RpdGxlKHRyKCJK
YXZhU2NyaXB0IFByb21wdCAtICUxIikuYXJnKG1haW5GcmFtZSgpLT51cmwoKS5ob3N0KCkpKTsK
LQotICAgIC8vIEhhY2sgdG8gZm9yY2UgdGhlIGRpYWxvZydzIFFMYWJlbCBpbnRvIHBsYWluIHRl
eHQgbW9kZQotICAgIC8vIHByZXZlbnRzIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD0zNDQyOQotICAgIFFMYWJlbCogbGFiZWwgPSBkbGcuZmluZENoaWxkPFFMYWJlbCo+
KCk7Ci0gICAgaWYgKGxhYmVsKQotICAgICAgICBsYWJlbC0+c2V0VGV4dEZvcm1hdChRdDo6UGxh
aW5UZXh0KTsKLQotICAgIC8vIGRvdWJsZSB0aGUgJidzIGJlY2F1c2Ugc2luZ2xlICYgd2lsbCB1
bmRlcmxpbmUgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXIKLSAgICAvLyAoQWNjZWxlcmF0b3IgbW5l
bW9uaWNzKQotICAgIFFTdHJpbmcgZXNjTXNnKG1zZyk7Ci0gICAgZXNjTXNnLnJlcGxhY2UoUUNo
YXI6OmZyb21MYXRpbjEoJyYnKSwgUUxhdGluMVN0cmluZygiJiYiKSk7Ci0gICAgZGxnLnNldExh
YmVsVGV4dChlc2NNc2cpOwotCi0gICAgZGxnLnNldFRleHRFY2hvTW9kZShRTGluZUVkaXQ6Ok5v
cm1hbCk7Ci0gICAgZGxnLnNldFRleHRWYWx1ZShkZWZhdWx0VmFsdWUpOwotCi0gICAgb2sgPSAh
IWRsZy5leGVjKCk7Ci0KLSAgICBpZiAob2sgJiYgcmVzdWx0KQotICAgICAgICAqcmVzdWx0ID0g
ZGxnLnRleHRWYWx1ZSgpOwotI2VuZGlmCi0gICAgcmV0dXJuIG9rOwotfQotCi0vKiEKLSAgICBc
Zm4gYm9vbCBRV2ViUGFnZTo6c2hvdWxkSW50ZXJydXB0SmF2YVNjcmlwdCgpCi0gICAgXHNpbmNl
IDQuNgotICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSBKYXZhU2NyaXB0IHByb2dy
YW0gaXMgcnVubmluZyBmb3IgYSBsb25nIHBlcmlvZCBvZiB0aW1lLgotCi0gICAgSWYgdGhlIHVz
ZXIgd2FudGVkIHRvIHN0b3AgdGhlIEphdmFTY3JpcHQgdGhlIGltcGxlbWVudGF0aW9uIHNob3Vs
ZCByZXR1cm4gdHJ1ZTsgb3RoZXJ3aXNlIGZhbHNlLgotCi0gICAgVGhlIGRlZmF1bHQgaW1wbGVt
ZW50YXRpb24gZXhlY3V0ZXMgdGhlIHF1ZXJ5IHVzaW5nIFFNZXNzYWdlQm94OjppbmZvcm1hdGlv
biB3aXRoIFFNZXNzYWdlQm94OjpZZXMgYW5kIFFNZXNzYWdlQm94OjpObyBidXR0b25zLgotKi8K
LWJvb2wgUVdlYlBhZ2U6OnNob3VsZEludGVycnVwdEphdmFTY3JpcHQoKQotewotI2lmZGVmIFFU
X05PX01FU1NBR0VCT1gKLSAgICByZXR1cm4gZmFsc2U7Ci0jZWxzZQotICAgIHJldHVybiBRTWVz
c2FnZUJveDo6WWVzID09IFFNZXNzYWdlQm94OjppbmZvcm1hdGlvbih2aWV3KCksIHRyKCJKYXZh
U2NyaXB0IFByb2JsZW0gLSAlMSIpLmFyZyhtYWluRnJhbWUoKS0+dXJsKCkuaG9zdCgpKSwgdHIo
IlRoZSBzY3JpcHQgb24gdGhpcyBwYWdlIGFwcGVhcnMgdG8gaGF2ZSBhIHByb2JsZW0uIERvIHlv
dSB3YW50IHRvIHN0b3AgdGhlIHNjcmlwdD8iKSwgUU1lc3NhZ2VCb3g6OlllcywgUU1lc3NhZ2VC
b3g6Ok5vKTsKLSNlbmRpZgotfQotCi12b2lkIFFXZWJQYWdlOjpzZXRGZWF0dXJlUGVybWlzc2lv
bihRV2ViRnJhbWUqIGZyYW1lLCBGZWF0dXJlIGZlYXR1cmUsIFBlcm1pc3Npb25Qb2xpY3kgcG9s
aWN5KQotewotICAgIHN3aXRjaCAoZmVhdHVyZSkgewotICAgIGNhc2UgTm90aWZpY2F0aW9uczoK
LSNpZiBFTkFCTEUoTk9USUZJQ0FUSU9OUykgfHwgRU5BQkxFKExFR0FDWV9OT1RJRklDQVRJT05T
KQotICAgICAgICBpZiAocG9saWN5ID09IFBlcm1pc3Npb25HcmFudGVkQnlVc2VyKQotICAgICAg
ICAgICAgTm90aWZpY2F0aW9uUHJlc2VudGVyQ2xpZW50UXQ6Om5vdGlmaWNhdGlvblByZXNlbnRl
cigpLT5hbGxvd05vdGlmaWNhdGlvbkZvckZyYW1lKGZyYW1lLT5kLT5mcmFtZSk7Ci0jZW5kaWYK
LSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHZW9sb2NhdGlvbjoKLSNpZiBFTkFCTEUoR0VPTE9D
QVRJT04pCi0gICAgICAgIGlmIChwb2xpY3kgIT0gUGVybWlzc2lvblVua25vd24pCi0gICAgICAg
ICAgICBHZW9sb2NhdGlvblBlcm1pc3Npb25DbGllbnRRdDo6Z2VvbG9jYXRpb25QZXJtaXNzaW9u
Q2xpZW50KCktPnNldFBlcm1pc3Npb24oZnJhbWUtPmQsIChwb2xpY3kgPT0gUGVybWlzc2lvbkdy
YW50ZWRCeVVzZXIpKTsKLSNlbmRpZgotICAgICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0g
ICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotLyohCi0gICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxs
ZWQgd2hlbmV2ZXIgV2ViS2l0IHdhbnRzIHRvIGNyZWF0ZSBhIG5ldyB3aW5kb3cgb2YgdGhlIGdp
dmVuIFxhIHR5cGUsIGZvcgotICAgIGV4YW1wbGUgd2hlbiBhIEphdmFTY3JpcHQgcHJvZ3JhbSBy
ZXF1ZXN0cyB0byBvcGVuIGEgZG9jdW1lbnQgaW4gYSBuZXcgd2luZG93LgotCi0gICAgSWYgdGhl
IG5ldyB3aW5kb3cgY2FuIGJlIGNyZWF0ZWQsIHRoZSBuZXcgd2luZG93J3MgUVdlYlBhZ2UgaXMg
cmV0dXJuZWQ7IG90aGVyd2lzZSBhIG51bGwgcG9pbnRlciBpcyByZXR1cm5lZC4KLQotICAgIElm
IHRoZSB2aWV3IGFzc29jaWF0ZWQgd2l0aCB0aGUgd2ViIHBhZ2UgaXMgYSBRV2ViVmlldyBvYmpl
Y3QsIHRoZW4gdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yd2FyZHMKLSAgICB0aGUgcmVx
dWVzdCB0byBRV2ViVmlldydzIGNyZWF0ZVdpbmRvdygpIGZ1bmN0aW9uOyBvdGhlcndpc2UgaXQg
cmV0dXJucyBhIG51bGwgcG9pbnRlci4KLQotICAgIElmIFxhIHR5cGUgaXMgV2ViTW9kYWxEaWFs
b2csIHRoZSBhcHBsaWNhdGlvbiBtdXN0IGNhbGwgc2V0V2luZG93TW9kYWxpdHkoUXQ6OkFwcGxp
Y2F0aW9uTW9kYWwpIG9uIHRoZSBuZXcgd2luZG93LgotCi0gICAgXG5vdGUgSW4gdGhlIGNhc2Vz
IHdoZW4gdGhlIHdpbmRvdyBjcmVhdGlvbiBpcyBiZWluZyB0cmlnZ2VyZWQgYnkgSmF2YVNjcmlw
dCwgYXBhcnQgZnJvbQotICAgIHJlaW1wbGVtZW50aW5nIHRoaXMgbWV0aG9kIGFwcGxpY2F0aW9u
IG11c3QgYWxzbyBzZXQgdGhlIEphdmFTY3JpcHRDYW5PcGVuV2luZG93cyBhdHRyaWJ1dGUKLSAg
ICBvZiBRV2ViU2V0dGluZ3MgdG8gdHJ1ZSBpbiBvcmRlciBmb3IgaXQgdG8gZ2V0IGNhbGxlZC4K
LQotICAgIFxzYSBhY2NlcHROYXZpZ2F0aW9uUmVxdWVzdCgpLCBRV2ViVmlldzo6Y3JlYXRlV2lu
ZG93KCkKLSovCi1RV2ViUGFnZSAqUVdlYlBhZ2U6OmNyZWF0ZVdpbmRvdyhXZWJXaW5kb3dUeXBl
IHR5cGUpCi17Ci0gICAgUVdlYlZpZXcgKndlYlZpZXcgPSBxb2JqZWN0X2Nhc3Q8UVdlYlZpZXcq
Pih2aWV3KCkpOwotICAgIGlmICh3ZWJWaWV3KSB7Ci0gICAgICAgIFFXZWJWaWV3ICpuZXdWaWV3
ID0gd2ViVmlldy0+Y3JlYXRlV2luZG93KHR5cGUpOwotICAgICAgICBpZiAobmV3VmlldykKLSAg
ICAgICAgICAgIHJldHVybiBuZXdWaWV3LT5wYWdlKCk7Ci0gICAgfQotICAgIHJldHVybiAwOwot
fQotCi0vKiEKLSAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuZXZlciBXZWJLaXQgZW5j
b3VudGVycyBhIEhUTUwgb2JqZWN0IGVsZW1lbnQgd2l0aCB0eXBlICJhcHBsaWNhdGlvbi94LXF0
LXBsdWdpbiIuIEl0IGlzCi0gICAgY2FsbGVkIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlIG9mIFFX
ZWJTZXR0aW5nczo6UGx1Z2luc0VuYWJsZWQuIFRoZSBcYSBjbGFzc2lkLCBcYSB1cmwsIFxhIHBh
cmFtTmFtZXMgYW5kIFxhIHBhcmFtVmFsdWVzCi0gICAgY29ycmVzcG9uZCB0byB0aGUgSFRNTCBv
YmplY3QgZWxlbWVudCBhdHRyaWJ1dGVzIGFuZCBjaGlsZCBlbGVtZW50cyB0byBjb25maWd1cmUg
dGhlIGVtYmVkZGFibGUgb2JqZWN0LgotKi8KLVFPYmplY3QgKlFXZWJQYWdlOjpjcmVhdGVQbHVn
aW4oY29uc3QgUVN0cmluZyAmY2xhc3NpZCwgY29uc3QgUVVybCAmdXJsLCBjb25zdCBRU3RyaW5n
TGlzdCAmcGFyYW1OYW1lcywgY29uc3QgUVN0cmluZ0xpc3QgJnBhcmFtVmFsdWVzKQotewotICAg
IFFfVU5VU0VEKGNsYXNzaWQpCi0gICAgUV9VTlVTRUQodXJsKQotICAgIFFfVU5VU0VEKHBhcmFt
TmFtZXMpCi0gICAgUV9VTlVTRUQocGFyYW1WYWx1ZXMpCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0
YXRpYyB2b2lkIGV4dHJhY3RDb250ZW50VHlwZUZyb21IYXNoKGNvbnN0IEhhc2hTZXQ8U3RyaW5n
PiYgdHlwZXMsIFFTdHJpbmdMaXN0KiBsaXN0KQotewotICAgIGlmICghbGlzdCkKLSAgICAgICAg
cmV0dXJuOwotCi0gICAgSGFzaFNldDxTdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBlbmRJdCA9IHR5
cGVzLmVuZCgpOwotICAgIGZvciAoSGFzaFNldDxTdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdCA9
IHR5cGVzLmJlZ2luKCk7IGl0ICE9IGVuZEl0OyArK2l0KQotICAgICAgICAqbGlzdCA8PCAqaXQ7
Ci19Ci0KLXN0YXRpYyB2b2lkIGV4dHJhY3RDb250ZW50VHlwZUZyb21QbHVnaW5WZWN0b3IoY29u
c3QgVmVjdG9yPFBsdWdpblBhY2thZ2UqPiYgcGx1Z2lucywgUVN0cmluZ0xpc3QqIGxpc3QpCi17
Ci0gICAgaWYgKCFsaXN0KQotICAgICAgICByZXR1cm47Ci0KLSAgICBmb3IgKHVuc2lnbmVkIGlu
dCBpID0gMDsgaSA8IHBsdWdpbnMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgTUlNRVRvRGVzY3Jp
cHRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBtYXBfaXQgPSBwbHVnaW5zW2ldLT5taW1lVG9EZXNj
cmlwdGlvbnMoKS5iZWdpbigpOwotICAgICAgICBNSU1FVG9EZXNjcmlwdGlvbnNNYXA6OmNvbnN0
X2l0ZXJhdG9yIG1hcF9lbmQgPSBwbHVnaW5zW2ldLT5taW1lVG9EZXNjcmlwdGlvbnMoKS5lbmQo
KTsKLSAgICAgICAgZm9yICg7IG1hcF9pdCAhPSBtYXBfZW5kOyArK21hcF9pdCkKLSAgICAgICAg
ICAgICpsaXN0IDw8IG1hcF9pdC0+a2V5OwotICAgIH0KLX0KLQotLyohCi0gKiAgUmV0dXJucyB0
aGUgbGlzdCBvZiBhbGwgY29udGVudCB0eXBlcyBzdXBwb3J0ZWQgYnkgUVdlYlBhZ2UuCi0gKi8K
LVFTdHJpbmdMaXN0IFFXZWJQYWdlOjpzdXBwb3J0ZWRDb250ZW50VHlwZXMoKSBjb25zdAotewot
ICAgIFFTdHJpbmdMaXN0IG1pbWVUeXBlczsKLQotICAgIGV4dHJhY3RDb250ZW50VHlwZUZyb21I
YXNoKE1JTUVUeXBlUmVnaXN0cnk6OmdldFN1cHBvcnRlZEltYWdlTUlNRVR5cGVzKCksICZtaW1l
VHlwZXMpOwotICAgIGV4dHJhY3RDb250ZW50VHlwZUZyb21IYXNoKE1JTUVUeXBlUmVnaXN0cnk6
OmdldFN1cHBvcnRlZE5vbkltYWdlTUlNRVR5cGVzKCksICZtaW1lVHlwZXMpOwotICAgIGlmIChk
LT5wYWdlLT5zZXR0aW5ncygpICYmIGQtPnBhZ2UtPnNldHRpbmdzKCktPmFyZVBsdWdpbnNFbmFi
bGVkKCkpCi0gICAgICAgIGV4dHJhY3RDb250ZW50VHlwZUZyb21QbHVnaW5WZWN0b3IoUGx1Z2lu
RGF0YWJhc2U6Omluc3RhbGxlZFBsdWdpbnMoKS0+cGx1Z2lucygpLCAmbWltZVR5cGVzKTsKLQot
ICAgIHJldHVybiBtaW1lVHlwZXM7Ci19Ci0KLS8qIQotICogIFJldHVybnMgdHJ1ZSBpZiBRV2Vi
UGFnZSBjYW4gaGFuZGxlIHRoZSBnaXZlbiBcYSBtaW1lVHlwZTsgb3RoZXJ3aXNlLCByZXR1cm5z
IGZhbHNlLgotICovCi1ib29sIFFXZWJQYWdlOjpzdXBwb3J0c0NvbnRlbnRUeXBlKGNvbnN0IFFT
dHJpbmcmIG1pbWVUeXBlKSBjb25zdAotewotICAgIGNvbnN0IFN0cmluZyB0eXBlID0gbWltZVR5
cGUudG9Mb3dlcigpOwotICAgIGlmIChNSU1FVHlwZVJlZ2lzdHJ5Ojppc1N1cHBvcnRlZEltYWdl
TUlNRVR5cGUodHlwZSkpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgaWYgKE1JTUVUeXBl
UmVnaXN0cnk6OmlzU3VwcG9ydGVkTm9uSW1hZ2VNSU1FVHlwZSh0eXBlKSkKLSAgICAgICAgcmV0
dXJuIHRydWU7Ci0KLSAgICBpZiAoZC0+cGFnZS0+c2V0dGluZ3MoKSAmJiBkLT5wYWdlLT5zZXR0
aW5ncygpLT5hcmVQbHVnaW5zRW5hYmxlZCgpCi0gICAgICAgICYmIFBsdWdpbkRhdGFiYXNlOjpp
bnN0YWxsZWRQbHVnaW5zKCktPmlzTUlNRVR5cGVSZWdpc3RlcmVkKHR5cGUpKQotICAgICAgICBy
ZXR1cm4gdHJ1ZTsKLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIFdlYkNvcmU6OkZy
YW1lTG9hZFJlcXVlc3QgZnJhbWVMb2FkUmVxdWVzdChjb25zdCBRVXJsICZ1cmwsIFdlYkNvcmU6
OkZyYW1lICpmcmFtZSkKLXsKLSAgICByZXR1cm4gV2ViQ29yZTo6RnJhbWVMb2FkUmVxdWVzdChm
cmFtZS0+ZG9jdW1lbnQoKS0+c2VjdXJpdHlPcmlnaW4oKSwKLSAgICAgICAgV2ViQ29yZTo6UmVz
b3VyY2VSZXF1ZXN0KHVybCwgZnJhbWUtPmxvYWRlcigpLT5vdXRnb2luZ1JlZmVycmVyKCkpKTsK
LX0KLQotc3RhdGljIHZvaWQgb3Blbk5ld1dpbmRvdyhjb25zdCBRVXJsJiB1cmwsIFdlYkNvcmU6
OkZyYW1lKiBmcmFtZSkKLXsKLSAgICBpZiAoUGFnZSogb2xkUGFnZSA9IGZyYW1lLT5wYWdlKCkp
IHsKLSAgICAgICAgV2luZG93RmVhdHVyZXMgZmVhdHVyZXM7Ci0gICAgICAgIE5hdmlnYXRpb25B
Y3Rpb24gYWN0aW9uOwotICAgICAgICBGcmFtZUxvYWRSZXF1ZXN0IHJlcXVlc3QgPSBmcmFtZUxv
YWRSZXF1ZXN0KHVybCwgZnJhbWUpOwotICAgICAgICBpZiAoUGFnZSogbmV3UGFnZSA9IG9sZFBh
Z2UtPmNocm9tZSgpLT5jcmVhdGVXaW5kb3coZnJhbWUsIHJlcXVlc3QsIGZlYXR1cmVzLCBhY3Rp
b24pKSB7Ci0gICAgICAgICAgICBuZXdQYWdlLT5tYWluRnJhbWUoKS0+bG9hZGVyKCktPmxvYWRG
cmFtZVJlcXVlc3QocmVxdWVzdCwgZmFsc2UsIGZhbHNlLCAwLCAwLCBNYXliZVNlbmRSZWZlcnJl
cik7Ci0gICAgICAgICAgICBuZXdQYWdlLT5jaHJvbWUoKS0+c2hvdygpOwotICAgICAgICB9Ci0g
ICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb2xsZWN0Q2hpbGRGcmFtZXMoUVdlYkZyYW1lKiBmcmFt
ZSwgUUxpc3Q8UVdlYkZyYW1lKj4mIGxpc3QpCi17Ci0gICAgbGlzdCA8PCBmcmFtZS0+Y2hpbGRG
cmFtZXMoKTsKLSAgICBRTGlzdEl0ZXJhdG9yPFFXZWJGcmFtZSo+IGl0KGZyYW1lLT5jaGlsZEZy
YW1lcygpKTsKLSAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgIGNvbGxlY3RDaGls
ZEZyYW1lcyhpdC5uZXh0KCksIGxpc3QpOwotICAgIH0KLX0KLQotLyohCi0gICAgVGhpcyBmdW5j
dGlvbiBjYW4gYmUgY2FsbGVkIHRvIHRyaWdnZXIgdGhlIHNwZWNpZmllZCBcYSBhY3Rpb24uCi0g
ICAgSXQgaXMgYWxzbyBjYWxsZWQgYnkgUXRXZWJLaXQgaWYgdGhlIHVzZXIgdHJpZ2dlcnMgdGhl
IGFjdGlvbiwgZm9yIGV4YW1wbGUKLSAgICB0aHJvdWdoIGEgY29udGV4dCBtZW51IGl0ZW0uCi0K
LSAgICBJZiBcYSBhY3Rpb24gaXMgYSBjaGVja2FibGUgYWN0aW9uIHRoZW4gXGEgY2hlY2tlZCBz
cGVjaWZpZWQgd2hldGhlciB0aGUgYWN0aW9uCi0gICAgaXMgdG9nZ2xlZCBvciBub3QuCi0KLSAg
ICBcc2EgYWN0aW9uKCkKLSovCi12b2lkIFFXZWJQYWdlOjp0cmlnZ2VyQWN0aW9uKFdlYkFjdGlv
biBhY3Rpb24sIGJvb2wpCi17Ci0gICAgV2ViQ29yZTo6RnJhbWUgKmZyYW1lID0gZC0+cGFnZS0+
Zm9jdXNDb250cm9sbGVyKCktPmZvY3VzZWRPck1haW5GcmFtZSgpOwotICAgIGlmICghZnJhbWUp
Ci0gICAgICAgIHJldHVybjsKLSAgICBXZWJDb3JlOjpFZGl0b3IgKmVkaXRvciA9IGZyYW1lLT5l
ZGl0b3IoKTsKLSAgICBjb25zdCBjaGFyICpjb21tYW5kID0gMDsKLQotICAgIHN3aXRjaCAoYWN0
aW9uKSB7Ci0gICAgICAgIGNhc2UgT3Blbkxpbms6Ci0gICAgICAgICAgICBpZiAoUVdlYkZyYW1l
ICp0YXJnZXRGcmFtZSA9IGQtPmhpdFRlc3RSZXN1bHQubGlua1RhcmdldEZyYW1lKCkpIHsKLSAg
ICAgICAgICAgICAgICBXVEY6OlJlZlB0cjxXZWJDb3JlOjpGcmFtZT4gd2NGcmFtZSA9IHRhcmdl
dEZyYW1lLT5kLT5mcmFtZTsKLSAgICAgICAgICAgICAgICB0YXJnZXRGcmFtZS0+ZC0+ZnJhbWUt
PmxvYWRlcigpLT5sb2FkRnJhbWVSZXF1ZXN0KGZyYW1lTG9hZFJlcXVlc3QoZC0+aGl0VGVzdFJl
c3VsdC5saW5rVXJsKCksIHdjRnJhbWUuZ2V0KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypsb2NrSGlzdG9yeSov
IGZhbHNlLCAvKmxvY2tCYWNrRm9yd2FyZExpc3QqLyBmYWxzZSwgLypldmVudCovIDAsCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAvKkZvcm1TdGF0ZSovIDAsIE1heWJlU2VuZFJlZmVycmVyKTsKLSAgICAgICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAotICAg
ICAgICBjYXNlIE9wZW5MaW5rSW5OZXdXaW5kb3c6Ci0gICAgICAgICAgICBvcGVuTmV3V2luZG93
KGQtPmhpdFRlc3RSZXN1bHQubGlua1VybCgpLCBmcmFtZSk7Ci0gICAgICAgICAgICBicmVhazsK
LSAgICAgICAgY2FzZSBPcGVuTGlua0luVGhpc1dpbmRvdzoKLSAgICAgICAgICAgIGZyYW1lLT5s
b2FkZXIoKS0+bG9hZEZyYW1lUmVxdWVzdChmcmFtZUxvYWRSZXF1ZXN0KGQtPmhpdFRlc3RSZXN1
bHQubGlua1VybCgpLCBmcmFtZSksCi0gICAgICAgICAgICAgICAgLypsb2NrSGlzdG9yeSovIGZh
bHNlLCAvKmxvY2tCYWNrRm9yd2FyZExpc3QqLyBmYWxzZSwgLypldmVudCovIDAsIC8qRm9ybVN0
YXRlKi8gMCwgTWF5YmVTZW5kUmVmZXJyZXIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
IGNhc2UgT3BlbkZyYW1lSW5OZXdXaW5kb3c6IHsKLSAgICAgICAgICAgIEtVUkwgdXJsID0gZnJh
bWUtPmxvYWRlcigpLT5kb2N1bWVudExvYWRlcigpLT51bnJlYWNoYWJsZVVSTCgpOwotICAgICAg
ICAgICAgaWYgKHVybC5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgdXJsID0gZnJhbWUtPmxv
YWRlcigpLT5kb2N1bWVudExvYWRlcigpLT51cmwoKTsKLSAgICAgICAgICAgIG9wZW5OZXdXaW5k
b3codXJsLCBmcmFtZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBj
YXNlIENvcHlMaW5rVG9DbGlwYm9hcmQ6IHsKLSNpZiBkZWZpbmVkKFFfV1NfWDExKQotICAgICAg
ICAgICAgYm9vbCBvbGRTZWxlY3Rpb25Nb2RlID0gUGFzdGVib2FyZDo6Z2VuZXJhbFBhc3RlYm9h
cmQoKS0+aXNTZWxlY3Rpb25Nb2RlKCk7Ci0gICAgICAgICAgICBQYXN0ZWJvYXJkOjpnZW5lcmFs
UGFzdGVib2FyZCgpLT5zZXRTZWxlY3Rpb25Nb2RlKHRydWUpOwotICAgICAgICAgICAgZWRpdG9y
LT5jb3B5VVJMKGQtPmhpdFRlc3RSZXN1bHQubGlua1VybCgpLCBkLT5oaXRUZXN0UmVzdWx0Lmxp
bmtUZXh0KCkpOwotICAgICAgICAgICAgUGFzdGVib2FyZDo6Z2VuZXJhbFBhc3RlYm9hcmQoKS0+
c2V0U2VsZWN0aW9uTW9kZShvbGRTZWxlY3Rpb25Nb2RlKTsKLSNlbmRpZgotICAgICAgICAgICAg
ZWRpdG9yLT5jb3B5VVJMKGQtPmhpdFRlc3RSZXN1bHQubGlua1VybCgpLCBkLT5oaXRUZXN0UmVz
dWx0LmxpbmtUZXh0KCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAg
Y2FzZSBPcGVuSW1hZ2VJbk5ld1dpbmRvdzoKLSAgICAgICAgICAgIG9wZW5OZXdXaW5kb3coZC0+
aGl0VGVzdFJlc3VsdC5pbWFnZVVybCgpLCBmcmFtZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgY2FzZSBEb3dubG9hZEltYWdlVG9EaXNrOgotICAgICAgICAgICAgZnJhbWUtPmxvYWRl
cigpLT5jbGllbnQoKS0+c3RhcnREb3dubG9hZChXZWJDb3JlOjpSZXNvdXJjZVJlcXVlc3QoZC0+
aGl0VGVzdFJlc3VsdC5pbWFnZVVybCgpLCBmcmFtZS0+bG9hZGVyKCktPm91dGdvaW5nUmVmZXJy
ZXIoKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRG93bmxvYWRMaW5rVG9E
aXNrOgotICAgICAgICAgICAgZnJhbWUtPmxvYWRlcigpLT5jbGllbnQoKS0+c3RhcnREb3dubG9h
ZChXZWJDb3JlOjpSZXNvdXJjZVJlcXVlc3QoZC0+aGl0VGVzdFJlc3VsdC5saW5rVXJsKCksIGZy
YW1lLT5sb2FkZXIoKS0+b3V0Z29pbmdSZWZlcnJlcigpKSk7Ci0gICAgICAgICAgICBicmVhazsK
LSNpZm5kZWYgUVRfTk9fQ0xJUEJPQVJECi0gICAgICAgIGNhc2UgQ29weUltYWdlVG9DbGlwYm9h
cmQ6Ci0gICAgICAgICAgICBRQXBwbGljYXRpb246OmNsaXBib2FyZCgpLT5zZXRQaXhtYXAoZC0+
aGl0VGVzdFJlc3VsdC5waXhtYXAoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2Fz
ZSBDb3B5SW1hZ2VVcmxUb0NsaXBib2FyZDoKLSAgICAgICAgICAgIFFBcHBsaWNhdGlvbjo6Y2xp
cGJvYXJkKCktPnNldFRleHQoZC0+aGl0VGVzdFJlc3VsdC5pbWFnZVVybCgpLnRvU3RyaW5nKCkp
OwotICAgICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICAgICAgY2FzZSBCYWNrOgotICAgICAg
ICAgICAgZC0+cGFnZS0+Z29CYWNrKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2Fz
ZSBGb3J3YXJkOgotICAgICAgICAgICAgZC0+cGFnZS0+Z29Gb3J3YXJkKCk7Ci0gICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgY2FzZSBTdG9wOgotICAgICAgICAgICAgbWFpbkZyYW1lKCktPmQt
PmZyYW1lLT5sb2FkZXIoKS0+c3RvcEZvclVzZXJDYW5jZWwoKTsKLSAgICAgICAgICAgIGQtPnVw
ZGF0ZU5hdmlnYXRpb25BY3Rpb25zKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2Fz
ZSBSZWxvYWQ6Ci0gICAgICAgICAgICBtYWluRnJhbWUoKS0+ZC0+ZnJhbWUtPmxvYWRlcigpLT5y
ZWxvYWQoLyplbmR0b2VuZHJlbG9hZCovZmFsc2UpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgIGNhc2UgUmVsb2FkQW5kQnlwYXNzQ2FjaGU6Ci0gICAgICAgICAgICBtYWluRnJhbWUoKS0+
ZC0+ZnJhbWUtPmxvYWRlcigpLT5yZWxvYWQoLyplbmR0b2VuZHJlbG9hZCovdHJ1ZSk7Ci0gICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTZXRUZXh0RGlyZWN0aW9uRGVmYXVsdDoKLSAg
ICAgICAgICAgIGVkaXRvci0+c2V0QmFzZVdyaXRpbmdEaXJlY3Rpb24oTmF0dXJhbFdyaXRpbmdE
aXJlY3Rpb24pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU2V0VGV4dERpcmVj
dGlvbkxlZnRUb1JpZ2h0OgotICAgICAgICAgICAgZWRpdG9yLT5zZXRCYXNlV3JpdGluZ0RpcmVj
dGlvbihMZWZ0VG9SaWdodFdyaXRpbmdEaXJlY3Rpb24pOwotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgIGNhc2UgU2V0VGV4dERpcmVjdGlvblJpZ2h0VG9MZWZ0OgotICAgICAgICAgICAgZWRp
dG9yLT5zZXRCYXNlV3JpdGluZ0RpcmVjdGlvbihSaWdodFRvTGVmdFdyaXRpbmdEaXJlY3Rpb24p
OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSW5zcGVjdEVsZW1lbnQ6IHsKLSNp
ZiBFTkFCTEUoSU5TUEVDVE9SKQotICAgICAgICAgICAgaWYgKCFkLT5oaXRUZXN0UmVzdWx0Lmlz
TnVsbCgpKSB7Ci0gICAgICAgICAgICAgICAgZC0+Z2V0T3JDcmVhdGVJbnNwZWN0b3IoKTsgLy8g
TWFrZSBzdXJlIHRoZSBpbnNwZWN0b3IgaXMgY3JlYXRlZAotICAgICAgICAgICAgICAgIGQtPmlu
c3BlY3Rvci0+c2hvdygpOyAvLyBUaGUgaW5zcGVjdG9yIGlzIGV4cGVjdGVkIHRvIGJlIHNob3du
IG9uIGluc3BlY3Rpb24KLSAgICAgICAgICAgICAgICBkLT5wYWdlLT5pbnNwZWN0b3JDb250cm9s
bGVyKCktPmluc3BlY3QoZC0+aGl0VGVzdFJlc3VsdC5kLT5pbm5lck5vblNoYXJlZE5vZGUuZ2V0
KCkpOwotICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAg
fQotICAgICAgICBjYXNlIFN0b3BTY2hlZHVsZWRQYWdlUmVmcmVzaDogewotICAgICAgICAgICAg
UVdlYkZyYW1lKiB0b3BGcmFtZSA9IG1haW5GcmFtZSgpOwotICAgICAgICAgICAgdG9wRnJhbWUt
PmQtPmZyYW1lLT5uYXZpZ2F0aW9uU2NoZWR1bGVyKCktPmNhbmNlbCgpOwotICAgICAgICAgICAg
UUxpc3Q8UVdlYkZyYW1lKj4gY2hpbGRGcmFtZXM7Ci0gICAgICAgICAgICBjb2xsZWN0Q2hpbGRG
cmFtZXModG9wRnJhbWUsIGNoaWxkRnJhbWVzKTsKLSAgICAgICAgICAgIFFMaXN0SXRlcmF0b3I8
UVdlYkZyYW1lKj4gaXQoY2hpbGRGcmFtZXMpOwotICAgICAgICAgICAgd2hpbGUgKGl0Lmhhc05l
eHQoKSkKLSAgICAgICAgICAgICAgICBpdC5uZXh0KCktPmQtPmZyYW1lLT5uYXZpZ2F0aW9uU2No
ZWR1bGVyKCktPmNhbmNlbCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAg
ICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGNvbW1hbmQgPSBRV2ViUGFnZVByaXZhdGU6OmVkaXRv
ckNvbW1hbmRGb3JXZWJBY3Rpb25zKGFjdGlvbik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9
Ci0KLSAgICBpZiAoY29tbWFuZCkKLSAgICAgICAgZWRpdG9yLT5jb21tYW5kKGNvbW1hbmQpLmV4
ZWN1dGUoKTsKLX0KLQotCi1RQ29sb3IgUVdlYlBhZ2VQcml2YXRlOjpjb2xvclNlbGVjdGlvblJl
cXVlc3RlZChjb25zdCBRQ29sb3IgJnNlbGVjdGVkQ29sb3IpCi17Ci0gICAgUUNvbG9yIHJldCA9
IHNlbGVjdGVkQ29sb3I7Ci0jaWZuZGVmIFFUX05PX0NPTE9SRElBTE9HCi0gICAgcmV0ID0gUUNv
bG9yRGlhbG9nOjpnZXRDb2xvcihzZWxlY3RlZENvbG9yLCBxLT52aWV3KCkpOwotICAgIGlmICgh
cmV0LmlzVmFsaWQoKSkKLSAgICAgICAgcmV0ID0gc2VsZWN0ZWRDb2xvcjsKLSNlbmRpZgotICAg
IHJldHVybiByZXQ7Ci19Ci0KLVFXZWJTZWxlY3RNZXRob2QgKlFXZWJQYWdlUHJpdmF0ZTo6Y3Jl
YXRlU2VsZWN0UG9wdXAoKQotewotICAgIHJldHVybiBuZXcgUXRGYWxsYmFja1dlYlBvcHVwKHRo
aXMpOwotfQotCi1RUmVjdCBRV2ViUGFnZVByaXZhdGU6OnZpZXdSZWN0UmVsYXRpdmVUb1dpbmRv
dygpCi17Ci0KLSAgICBRV2lkZ2V0KiBvd25lcldpZGdldD0gY2xpZW50LmlzTnVsbCgpID8gMCA6
IHFvYmplY3RfY2FzdDxRV2lkZ2V0Kj4oY2xpZW50LT5vd25lcldpZGdldCgpKTsKLSAgICBpZiAo
IW93bmVyV2lkZ2V0KQotICAgICAgICByZXR1cm4gUVJlY3QoKTsKLSAgICBRV2lkZ2V0KiB0b3BM
ZXZlbFdpZGdldCA9IG93bmVyV2lkZ2V0LT53aW5kb3coKTsKLQotICAgIFFQb2ludCB0b3BMZWZ0
Q29ybmVyID0gb3duZXJXaWRnZXQtPm1hcEZyb20odG9wTGV2ZWxXaWRnZXQsIFFQb2ludCgwLCAw
KSk7Ci0gICAgcmV0dXJuIFFSZWN0KHRvcExlZnRDb3JuZXIsIG93bmVyV2lkZ2V0LT5zaXplKCkp
OwotfQotCi12b2lkIFFXZWJQYWdlUHJpdmF0ZTo6Z2VvbG9jYXRpb25QZXJtaXNzaW9uUmVxdWVz
dGVkKFFXZWJGcmFtZUFkYXB0ZXIqIGZyYW1lKQotewotICAgIGVtaXQgcS0+ZmVhdHVyZVBlcm1p
c3Npb25SZXF1ZXN0ZWQoUVdlYkZyYW1lUHJpdmF0ZTo6a2l0KGZyYW1lKSwgUVdlYlBhZ2U6Okdl
b2xvY2F0aW9uKTsKLX0KLQotdm9pZCBRV2ViUGFnZVByaXZhdGU6Omdlb2xvY2F0aW9uUGVybWlz
c2lvblJlcXVlc3RDYW5jZWxsZWQoUVdlYkZyYW1lQWRhcHRlciogZnJhbWUpCi17Ci0gICAgZW1p
dCBxLT5mZWF0dXJlUGVybWlzc2lvblJlcXVlc3RDYW5jZWxlZChRV2ViRnJhbWVQcml2YXRlOjpr
aXQoZnJhbWUpLCBRV2ViUGFnZTo6R2VvbG9jYXRpb24pOwotfQotCi12b2lkIFFXZWJQYWdlUHJp
dmF0ZTo6bm90aWZpY2F0aW9uc1Blcm1pc3Npb25SZXF1ZXN0ZWQoUVdlYkZyYW1lQWRhcHRlciog
ZnJhbWUpCi17Ci0gICAgZW1pdCBxLT5mZWF0dXJlUGVybWlzc2lvblJlcXVlc3RlZChRV2ViRnJh
bWVQcml2YXRlOjpraXQoZnJhbWUpLCBRV2ViUGFnZTo6Tm90aWZpY2F0aW9ucyk7Ci19Ci0KLXZv
aWQgUVdlYlBhZ2VQcml2YXRlOjpub3RpZmljYXRpb25zUGVybWlzc2lvblJlcXVlc3RDYW5jZWxs
ZWQoUVdlYkZyYW1lQWRhcHRlciogZnJhbWUpCi17Ci0gICAgZW1pdCBxLT5mZWF0dXJlUGVybWlz
c2lvblJlcXVlc3RDYW5jZWxlZChRV2ViRnJhbWVQcml2YXRlOjpraXQoZnJhbWUpLCBRV2ViUGFn
ZTo6Tm90aWZpY2F0aW9ucyk7Ci19Ci0KLXZvaWQgUVdlYlBhZ2VQcml2YXRlOjpyZXNwb25kVG9D
aGFuZ2VkQ29udGVudHMoKQotewotICAgIHVwZGF0ZUVkaXRvckFjdGlvbnMoKTsKLQotICAgIGVt
aXQgcS0+Y29udGVudHNDaGFuZ2VkKCk7Ci19Ci0KLXZvaWQgUVdlYlBhZ2VQcml2YXRlOjpyZXNw
b25kVG9DaGFuZ2VkU2VsZWN0aW9uKCkKLXsKLSAgICB1cGRhdGVFZGl0b3JBY3Rpb25zKCk7Ci0g
ICAgZW1pdCBxLT5zZWxlY3Rpb25DaGFuZ2VkKCk7Ci19Ci0KLXZvaWQgUVdlYlBhZ2VQcml2YXRl
OjptaWNyb0ZvY3VzQ2hhbmdlZCgpCi17Ci0gICAgZW1pdCBxLT5taWNyb0ZvY3VzQ2hhbmdlZCgp
OwotfQotCi12b2lkIFFXZWJQYWdlUHJpdmF0ZTo6dHJpZ2dlckNvcHlBY3Rpb24oKQotewotICAg
IHEtPnRyaWdnZXJBY3Rpb24oUVdlYlBhZ2U6OkNvcHkpOwotfQotCi12b2lkIFFXZWJQYWdlUHJp
dmF0ZTo6dHJpZ2dlckFjdGlvbkZvcktleUV2ZW50KFFLZXlFdmVudCogZXZlbnQpCi17Ci0gICAg
UVdlYlBhZ2U6OldlYkFjdGlvbiBhY3Rpb24gPSBlZGl0b3JBY3Rpb25Gb3JLZXlFdmVudChldmVu
dCk7Ci0gICAgcS0+dHJpZ2dlckFjdGlvbihhY3Rpb24pOwotfQotCi12b2lkIFFXZWJQYWdlUHJp
dmF0ZTo6Y2xlYXJVbmRvU3RhY2soKQotewotI2lmbmRlZiBRVF9OT19VTkRPU1RBQ0sKLSAgICBp
ZiAodW5kb1N0YWNrKQotICAgICAgICB1bmRvU3RhY2stPmNsZWFyKCk7Ci0jZW5kaWYKLX0KLQot
Ym9vbCBRV2ViUGFnZVByaXZhdGU6OmNhblVuZG8oKSBjb25zdAotewotI2lmbmRlZiBRVF9OT19V
TkRPU1RBQ0sKLSAgICBpZiAoIXVuZG9TdGFjaykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
IHJldHVybiB1bmRvU3RhY2stPmNhblVuZG8oKTsKLSNlbHNlCi0gICAgcmV0dXJuIGZhbHNlOwot
I2VuZGlmCi19Ci0KLWJvb2wgUVdlYlBhZ2VQcml2YXRlOjpjYW5SZWRvKCkgY29uc3QKLXsKLSNp
Zm5kZWYgUVRfTk9fVU5ET1NUQUNLCi0gICAgaWYgKCF1bmRvU3RhY2spCi0gICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICByZXR1cm4gdW5kb1N0YWNrLT5jYW5SZWRvKCk7Ci0jZWxzZQotICAgIHJl
dHVybiBmYWxzZTsKLSNlbmRpZgotfQotCi12b2lkIFFXZWJQYWdlUHJpdmF0ZTo6dW5kbygpCi17
Ci0jaWZuZGVmIFFUX05PX1VORE9TVEFDSwotICAgIGlmICh1bmRvU3RhY2spCi0gICAgICAgIHVu
ZG9TdGFjay0+dW5kbygpOwotI2VuZGlmCi19Ci0KLXZvaWQgUVdlYlBhZ2VQcml2YXRlOjpyZWRv
KCkKLXsKLSNpZm5kZWYgUVRfTk9fVU5ET1NUQUNLCi0gICAgaWYgKHVuZG9TdGFjaykKLSAgICAg
ICAgdW5kb1N0YWNrLT5yZWRvKCk7Ci0jZW5kaWYKLX0KLQotdm9pZCBRV2ViUGFnZVByaXZhdGU6
OmNyZWF0ZVVuZG9TdGVwKFFTaGFyZWRQb2ludGVyPFVuZG9TdGVwUXQ+IHN0ZXApCi17Ci0jaWZu
ZGVmIFFUX05PX1VORE9TVEFDSwotICAgIC8vIENhbGwgdW5kb1N0YWNrKCkgZ2V0dGVyIGZpcnN0
IHRvIGVuc3VyZSBzdGFjayBpcyBjcmVhdGVkCi0gICAgLy8gaWYgaXQgZG9lc24ndCBleGlzdCB5
ZXQuCi0gICAgcS0+dW5kb1N0YWNrKCktPnB1c2gobmV3IFFXZWJVbmRvQ29tbWFuZChzdGVwKSk7
Ci0jZW5kaWYKLX0KLQotY29uc3QgY2hhciAqUVdlYlBhZ2VQcml2YXRlOjplZGl0b3JDb21tYW5k
Rm9yS2V5RXZlbnQoUUtleUV2ZW50KiBldmVudCkKLXsKLSAgICBRV2ViUGFnZTo6V2ViQWN0aW9u
IGFjdGlvbiA9IGVkaXRvckFjdGlvbkZvcktleUV2ZW50KGV2ZW50KTsKLSAgICByZXR1cm4gZWRp
dG9yQ29tbWFuZEZvcldlYkFjdGlvbnMoYWN0aW9uKTsKLX0KLQotUVNpemUgUVdlYlBhZ2U6OnZp
ZXdwb3J0U2l6ZSgpIGNvbnN0Ci17Ci0gICAgaWYgKGQtPm1haW5GcmFtZSAmJiBkLT5tYWluRnJh
bWUuZGF0YSgpLT5kLT5mcmFtZS0+dmlldygpKQotICAgICAgICByZXR1cm4gZC0+bWFpbkZyYW1l
LmRhdGEoKS0+ZC0+ZnJhbWUtPnZpZXcoKS0+ZnJhbWVSZWN0KCkuc2l6ZSgpOwotCi0gICAgcmV0
dXJuIGQtPm1fdmlld3BvcnRTaXplOwotfQotCi0vKiEKLSAgICBccHJvcGVydHkgUVdlYlBhZ2U6
OnZpZXdwb3J0U2l6ZQotICAgIFxicmllZiB0aGUgc2l6ZSBvZiB0aGUgdmlld3BvcnQKLQotICAg
IFRoZSBzaXplIGFmZmVjdHMgZm9yIGV4YW1wbGUgdGhlIHZpc2liaWxpdHkgb2Ygc2Nyb2xsYmFy
cwotICAgIGlmIHRoZSBkb2N1bWVudCBpcyBsYXJnZXIgdGhhbiB0aGUgdmlld3BvcnQuCi0KLSAg
ICBCeSBkZWZhdWx0LCBmb3IgYSBuZXdseS1jcmVhdGVkIFdlYiBwYWdlLCB0aGlzIHByb3BlcnR5
IGNvbnRhaW5zIGEgc2l6ZSB3aXRoCi0gICAgemVybyB3aWR0aCBhbmQgaGVpZ2h0LgotCi0gICAg
XHNhIFFXZWJGcmFtZTo6cmVuZGVyKCksIHByZWZlcnJlZENvbnRlbnRzU2l6ZQotKi8KLXZvaWQg
UVdlYlBhZ2U6OnNldFZpZXdwb3J0U2l6ZShjb25zdCBRU2l6ZSAmc2l6ZSkgY29uc3QKLXsKLSAg
ICBkLT5tX3ZpZXdwb3J0U2l6ZSA9IHNpemU7Ci0KLSAgICBRV2ViRnJhbWUgKmZyYW1lID0gbWFp
bkZyYW1lKCk7Ci0gICAgaWYgKGZyYW1lLT5kLT5mcmFtZSAmJiBmcmFtZS0+ZC0+ZnJhbWUtPnZp
ZXcoKSkgewotICAgICAgICBXZWJDb3JlOjpGcmFtZVZpZXcqIHZpZXcgPSBmcmFtZS0+ZC0+ZnJh
bWUtPnZpZXcoKTsKLSAgICAgICAgdmlldy0+cmVzaXplKHNpemUpOwotICAgICAgICB2aWV3LT5h
ZGp1c3RWaWV3U2l6ZSgpOwotICAgIH0KLX0KLQotc3RhdGljIGludCBnZXRpbnRlbnYoY29uc3Qg
Y2hhciogdmFyaWFibGUpCi17Ci0gICAgYm9vbCBvazsKLSAgICBpbnQgdmFsdWUgPSBxZ2V0ZW52
KHZhcmlhYmxlKS50b0ludCgmb2spOwotICAgIHJldHVybiAob2spID8gdmFsdWUgOiAtMTsKLX0K
LQotc3RhdGljIFFTaXplIHF1ZXJ5RGV2aWNlU2l6ZUZvclNjcmVlbkNvbnRhaW5pbmdXaWRnZXQo
Y29uc3QgUVdpZGdldCogd2lkZ2V0KQotewotICAgIFFEZXNrdG9wV2lkZ2V0KiBkZXNrdG9wID0g
UUFwcGxpY2F0aW9uOjpkZXNrdG9wKCk7Ci0gICAgaWYgKCFkZXNrdG9wKQotICAgICAgICByZXR1
cm4gUVNpemUoKTsKLQotICAgIFFTaXplIHNpemU7Ci0KLSAgICBpZiAod2lkZ2V0KSB7Ci0gICAg
ICAgIC8vIFJldHVybnMgdGhlIGF2YWlsYWJsZSBnZW9tZXRyeSBvZiB0aGUgc2NyZWVuIHdoaWNo
IGNvbnRhaW5zIHdpZGdldC4KLSAgICAgICAgLy8gTk9URTogdGhpcyBtdXN0IGJlIHRoZSB0aGUg
ZnVsbCBzY3JlZW4gc2l6ZSBpbmNsdWRpbmcgYW55IGZpeGVkIHN0YXR1cyBhcmVhcyBldGMuCi0g
ICAgICAgIHNpemUgPSBkZXNrdG9wLT5hdmFpbGFibGVHZW9tZXRyeSh3aWRnZXQpLnNpemUoKTsK
LSAgICB9IGVsc2UKLSAgICAgICAgc2l6ZSA9IGRlc2t0b3AtPmF2YWlsYWJsZUdlb21ldHJ5KCku
c2l6ZSgpOwotCi0gICAgLy8gVGhpcyBtdXN0IGJlIGluIHBvcnRyYWl0IG1vZGUsIGFkanVzdCBp
ZiBub3QuCi0gICAgaWYgKHNpemUud2lkdGgoKSA+IHNpemUuaGVpZ2h0KCkpIHsKLSAgICAgICAg
aW50IHdpZHRoID0gc2l6ZS53aWR0aCgpOwotICAgICAgICBzaXplLnNldFdpZHRoKHNpemUuaGVp
Z2h0KCkpOwotICAgICAgICBzaXplLnNldEhlaWdodCh3aWR0aCk7Ci0gICAgfQotCi0gICAgcmV0
dXJuIHNpemU7Ci19Ci0KLS8qIQotICAgIENvbXB1dGVzIHRoZSBvcHRpbWFsIHZpZXdwb3J0IGNv
bmZpZ3VyYXRpb24gZ2l2ZW4gdGhlIFxhIGF2YWlsYWJsZVNpemUsIHdoZW4KLSAgICB1c2VyIGlu
dGVyZmFjZSBjb21wb25lbnRzIGFyZSBkaXNyZWdhcmRlZC4KLQotICAgIFRoZSBjb25maWd1cmF0
aW9uIGlzIGFsc28gZGVwZW5kZW50IG9uIHRoZSBkZXZpY2Ugc2NyZWVuIHNpemUgd2hpY2ggaXMg
b2J0YWluZWQKLSAgICBhdXRvbWF0aWNhbGx5LiBGb3IgdGVzdGluZyBwdXJwb3NlcyB0aGUgc2l6
ZSBjYW4gYmUgb3ZlcnJpZGRlbiBieSBzZXR0aW5nIHR3bwotICAgIGVudmlyb25tZW50IHZhcmlh
YmxlcyBRVFdFQktJVF9ERVZJQ0VfV0lEVEggYW5kIFFUV0VCS0lUX0RFVklDRV9IRUlHSFQsIHdo
aWNoCi0gICAgYm90aCBuZWVkcyB0byBiZSBzZXQuCi0KLSAgICBUaGUgVmlld3BvcnRBdHRyaWJ1
dGVzIGluY2x1ZGVzIGEgcGl4ZWwgZGVuc2l0eSByYXRpbywgd2hpY2ggd2lsbCBhbHNvIGJlIGV4
cG9zZWQgdG8KLSAgICB0aGUgd2ViIGF1dGhvciB0aG91Z2ggdGhlIC13ZWJraXQtcGl4ZWwtcmF0
aW8gbWVkaWEgZmVhdHVyZS4gVGhpcyBpcyB0aGUgcmF0aW8KLSAgICBiZXR3ZWVuIDEgZGVuc2l0
eS1pbmRlcGVuZGVudCBwaXhlbCAoRFBJKSBhbmQgcGh5c2ljYWwgcGl4ZWxzLgotCi0gICAgQSBk
ZW5zaXR5LWluZGVwZW5kZW50IHBpeGVsIGlzIGVxdWl2YWxlbnQgdG8gb25lIHBoeXNpY2FsIHBp
eGVsIG9uIGEgMTYwIERQSSBzY3JlZW4sCi0gICAgc28gb24gb3VyIHBsYXRmb3JtIGFzc3VtZXMg
dGhhdCBhcyB0aGUgYmFzZWxpbmUgZGVuc2l0eS4KLQotICAgIFRoZSBjb252ZXJzaW9uIG9mIERJ
UCB1bml0cyB0byBzY3JlZW4gcGl4ZWxzIGlzIHF1aXRlIHNpbXBsZToKLQotICAgIHBpeGVscyA9
IERJUHMgKiAoZGVuc2l0eSAvIDE2MCkuCi0KLSAgICBUaHVzLCBvbiBhIDI0MCBEUEkgc2NyZWVu
LCAxIERJUHMgd291bGQgZXF1YWwgMS41IHBoeXNpY2FsIHBpeGVscy4KLQotICAgIEFuIGludmFs
aWQgaW5zdGFuY2Ugd2lsbCBiZSByZXR1cm5lZCBpbiB0aGUgY2FzZSBhbiBlbXB0eSBzaXplIGlz
IHBhc3NlZCB0byB0aGUKLSAgICBtZXRob2QuCi0KLSAgICBcbm90ZSBUaGUgZGVuc2l0eSBpcyBh
dXRvbWF0aWNhbGx5IG9idGFpbmVkIGZyb20gdGhlIERQSSBvZiB0aGUgc2NyZWVuIHdoZXJlIHRo
ZSBwYWdlCi0gICAgaXMgYmVpbmcgc2hvd24sIGJ1dCBhcyBtYW55IFgxMSBzZXJ2ZXJzIGFyZSBy
ZXBvcnRpbmcgd3JvbmcgRFBJLCBpdCBpcyBwb3NzaWJsZSB0bwotICAgIG92ZXJyaWRlIGl0IHVz
aW5nIFFYMTFJbmZvOjpzZXRBcHBEcGlZKCkuCi0qLwotCi1RV2ViUGFnZTo6Vmlld3BvcnRBdHRy
aWJ1dGVzIFFXZWJQYWdlOjp2aWV3cG9ydEF0dHJpYnV0ZXNGb3JTaXplKGNvbnN0IFFTaXplJiBh
dmFpbGFibGVTaXplKSBjb25zdAotewotICAgIHN0YXRpYyBpbnQgZGVza3RvcFdpZHRoID0gOTgw
OwotCi0gICAgVmlld3BvcnRBdHRyaWJ1dGVzIHJlc3VsdDsKLQotICAgICBpZiAoYXZhaWxhYmxl
U2l6ZS5pc0VtcHR5KCkpCi0gICAgICAgICByZXR1cm4gcmVzdWx0OyAvLyBSZXR1cm5zIGFuIGlu
dmFsaWQgaW5zdGFuY2UuCi0KLSAgICBpbnQgZGV2aWNlV2lkdGggPSBnZXRpbnRlbnYoIlFUV0VC
S0lUX0RFVklDRV9XSURUSCIpOwotICAgIGludCBkZXZpY2VIZWlnaHQgPSBnZXRpbnRlbnYoIlFU
V0VCS0lUX0RFVklDRV9IRUlHSFQiKTsKLQotICAgIC8vIEJvdGggZW52aXJvbm1lbnQgdmFyaWFi
bGVzIG5lZWQgdG8gYmUgc2V0IC0gb3IgdGhleSB3aWxsIGJlIGlnbm9yZWQuCi0gICAgaWYgKGRl
dmljZVdpZHRoIDwgMCAmJiBkZXZpY2VIZWlnaHQgPCAwKSB7Ci0gICAgICAgIFFTaXplIHNpemUg
PSBxdWVyeURldmljZVNpemVGb3JTY3JlZW5Db250YWluaW5nV2lkZ2V0KHZpZXcoKSk7Ci0gICAg
ICAgIGRldmljZVdpZHRoID0gc2l6ZS53aWR0aCgpOwotICAgICAgICBkZXZpY2VIZWlnaHQgPSBz
aXplLmhlaWdodCgpOwotICAgIH0KLQotICAgIGZsb2F0IGRldmljZVBpeGVsUmF0aW8gPSBxdF9k
ZWZhdWx0RHBpKCkgLyBXZWJDb3JlOjpWaWV3cG9ydEFyZ3VtZW50czo6ZGVwcmVjYXRlZFRhcmdl
dERQSTsKLQotICAgIFdlYkNvcmU6OlZpZXdwb3J0QXR0cmlidXRlcyBjb25mID0gV2ViQ29yZTo6
Y29tcHV0ZVZpZXdwb3J0QXR0cmlidXRlcyhkLT52aWV3cG9ydEFyZ3VtZW50cygpLCBkZXNrdG9w
V2lkdGgsIGRldmljZVdpZHRoLCBkZXZpY2VIZWlnaHQsIGRldmljZVBpeGVsUmF0aW8sIGF2YWls
YWJsZVNpemUpOwotICAgIFdlYkNvcmU6OnJlc3RyaWN0TWluaW11bVNjYWxlRmFjdG9yVG9WaWV3
cG9ydFNpemUoY29uZiwgYXZhaWxhYmxlU2l6ZSwgZGV2aWNlUGl4ZWxSYXRpbyk7Ci0gICAgV2Vi
Q29yZTo6cmVzdHJpY3RTY2FsZUZhY3RvclRvSW5pdGlhbFNjYWxlSWZOb3RVc2VyU2NhbGFibGUo
Y29uZik7Ci0KLSAgICByZXN1bHQubV9pc1ZhbGlkID0gdHJ1ZTsKLSAgICByZXN1bHQubV9zaXpl
ID0gUVNpemVGKGNvbmYubGF5b3V0U2l6ZS53aWR0aCgpLCBjb25mLmxheW91dFNpemUuaGVpZ2h0
KCkpOwotICAgIHJlc3VsdC5tX2luaXRpYWxTY2FsZUZhY3RvciA9IGNvbmYuaW5pdGlhbFNjYWxl
OwotICAgIHJlc3VsdC5tX21pbmltdW1TY2FsZUZhY3RvciA9IGNvbmYubWluaW11bVNjYWxlOwot
ICAgIHJlc3VsdC5tX21heGltdW1TY2FsZUZhY3RvciA9IGNvbmYubWF4aW11bVNjYWxlOwotICAg
IHJlc3VsdC5tX2RldmljZVBpeGVsUmF0aW8gPSBkZXZpY2VQaXhlbFJhdGlvOwotICAgIHJlc3Vs
dC5tX2lzVXNlclNjYWxhYmxlID0gc3RhdGljX2Nhc3Q8Ym9vbD4oY29uZi51c2VyU2NhbGFibGUp
OwotCi0gICAgZC0+cGFnZS0+c2V0RGV2aWNlU2NhbGVGYWN0b3IoZGV2aWNlUGl4ZWxSYXRpbyk7
Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1RU2l6ZSBRV2ViUGFnZTo6cHJlZmVycmVkQ29u
dGVudHNTaXplKCkgY29uc3QKLXsKLSAgICBRV2ViRnJhbWUqIGZyYW1lID0gZC0+bWFpbkZyYW1l
LmRhdGEoKTsKLSAgICBpZiAoZnJhbWUpIHsKLSAgICAgICAgV2ViQ29yZTo6RnJhbWVWaWV3KiB2
aWV3ID0gZnJhbWUtPmQtPmZyYW1lLT52aWV3KCk7Ci0gICAgICAgIGlmICh2aWV3ICYmIHZpZXct
PnVzZUZpeGVkTGF5b3V0KCkpCi0gICAgICAgICAgICByZXR1cm4gZC0+bWFpbkZyYW1lLmRhdGEo
KS0+ZC0+ZnJhbWUtPnZpZXcoKS0+Zml4ZWRMYXlvdXRTaXplKCk7Ci0gICAgfQotCi0gICAgcmV0
dXJuIGQtPmZpeGVkTGF5b3V0U2l6ZTsKLX0KLQotLyohCi0gICAgXHByb3BlcnR5IFFXZWJQYWdl
OjpwcmVmZXJyZWRDb250ZW50c1NpemUKLSAgICBcc2luY2UgNC42Ci0gICAgXGJyaWVmIGEgY3Vz
dG9tIHNpemUgdXNlZCBmb3IgbGF5aW5nIG91dCB0aGUgcGFnZSBjb250ZW50cy4KLQotICAgIEJ5
IGRlZmF1bHQgYWxsIHBhZ2VzIGFyZSBsYWlkIG91dCB1c2luZyB0aGUgdmlld3BvcnQgb2YgdGhl
IHBhZ2UgYXMgdGhlIGJhc2UuCi0KLSAgICBBcyBwYWdlcyBtb3N0bHkgYXJlIGRlc2lnbmVkIGZv
ciBkZXNrdG9wIHVzYWdlLCB0aGV5IG9mdGVuIGRvIG5vdCBsYXlvdXQgcHJvcGVybHkKLSAgICBv
biBzbWFsbCBkZXZpY2VzIGFzIHRoZSBjb250ZW50cyByZXF1aXJlIGEgY2VydGFpbiB2aWV3IHdp
ZHRoLiBGb3IgdGhpcyByZWFzb24KLSAgICBpdCBpcyBjb21tb24gdG8gdXNlIGEgZGlmZmVyZW50
IGxheW91dCBzaXplIGFuZCB0aGVuIHNjYWxlIHRoZSBjb250ZW50cyB0byBmaXQKLSAgICB3aXRo
aW4gdGhlIGFjdHVhbCB2aWV3LgotCi0gICAgSWYgdGhpcyBwcm9wZXJ0eSBpcyBzZXQgdG8gYSB2
YWxpZCBzaXplLCB0aGlzIHNpemUgaXMgdXNlZCBmb3IgYWxsIGxheW91dCBuZWVkcwotICAgIGlu
c3RlYWQgb2YgdGhlIHNpemUgb2YgdGhlIHZpZXdwb3J0LgotCi0gICAgU2V0dGluZyBhbiBpbnZh
bGlkIHNpemUsIG1ha2VzIHRoZSBwYWdlIGZhbGwgYmFjayB0byB1c2luZyB0aGUgdmlld3BvcnQg
c2l6ZSBmb3IgbGF5b3V0LgotCi0gICAgXHNhIHZpZXdwb3J0U2l6ZQotKi8KLXZvaWQgUVdlYlBh
Z2U6OnNldFByZWZlcnJlZENvbnRlbnRzU2l6ZShjb25zdCBRU2l6ZSYgc2l6ZSkgY29uc3QKLXsK
LSAgICAvLyBGSVhNRTogUmVuYW1lIHRoaXMgbWV0aG9kIHRvIHNldEN1c3RvbUxheW91dFNpemUK
LQotICAgIGQtPmZpeGVkTGF5b3V0U2l6ZSA9IHNpemU7Ci0KLSAgICBRV2ViRnJhbWUqIGZyYW1l
ID0gbWFpbkZyYW1lKCk7Ci0gICAgaWYgKCFmcmFtZS0+ZC0+ZnJhbWUgfHwgIWZyYW1lLT5kLT5m
cmFtZS0+dmlldygpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBXZWJDb3JlOjpGcmFtZVZpZXcq
IHZpZXcgPSBmcmFtZS0+ZC0+ZnJhbWUtPnZpZXcoKTsKLQotICAgIGlmIChzaXplLmlzVmFsaWQo
KSkgewotICAgICAgICB2aWV3LT5zZXRVc2VGaXhlZExheW91dCh0cnVlKTsKLSAgICAgICAgdmll
dy0+c2V0Rml4ZWRMYXlvdXRTaXplKHNpemUpOwotICAgIH0gZWxzZSBpZiAodmlldy0+dXNlRml4
ZWRMYXlvdXQoKSkKLSAgICAgICAgdmlldy0+c2V0VXNlRml4ZWRMYXlvdXQoZmFsc2UpOwotCi0g
ICAgdmlldy0+bGF5b3V0KCk7Ci19Ci0KLS8qCi0gICAgVGhpcyBmdW5jdGlvbiBpcyB0byBiZSBj
YWxsZWQgYWZ0ZXIgYW55IChhbmltYXRlZCkgc2Nyb2xsL3BhbiBoYXMgZW5kZWQsIGluIHRoZSBj
YXNlIHRoZSBhcHBsaWNhdGlvbiBoYW5kbGVzIHRoZQotICAgIHNjcm9sbGluZy9wYW5uaW5nIG9m
IHRoZSB3ZWIgY29udGVudHMuIFRoaXMgaXMgY29tbW9ubHkgdXNlZCBpbiBjb21iaW5hdGlvbiB3
aXRoIHRpbGluZyB3aGVyZSBpcyBpdCBjb21tb24gZm9yCi0gICAgdGhlIGFwcGxpY2F0aW9uIHRv
IHBhbiB0aGUgYWN0dWFsIHZpZXcsIHdoaWNoIHRoZW4gcmVzaXplcyBpdHNlbGYgdG8gdGhlIHNp
emUgb2YgdGhlIGNvbnRlbnRzLgotCi0gICAgXG5vdGUgQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIG1h
a2VzIFdlYktpdCBzdG9wIHRyeWluZyB0byBjYWxjdWxhdGUgdGhlIHZpc2libGVDb250ZW50UmVj
dC4gVG8gdHVybiB0aGF0IG9uCi0gICAgYWdhaW4sIGNhbGwgdGhpcyBtZXRob2Qgd2l0aCBhbiBl
bXB0eSByZWN0LgotCi0gICAgXHNhIFFHcmFwaGljc1dlYlZpZXc6OnJlc2l6ZXNUb0NvbnRlbnRz
LCBRV2ViU2V0dGluZ3M6OlRpbGVkQmFja2luZ1N0b3JlRW5hYmxlZAotKi8KLXZvaWQgUVdlYlBh
Z2U6OnNldEFjdHVhbFZpc2libGVDb250ZW50UmVjdChjb25zdCBRUmVjdCYgcmVjdCkgY29uc3QK
LXsKLSAgICBRV2ViRnJhbWUqIGZyYW1lID0gbWFpbkZyYW1lKCk7Ci0gICAgaWYgKCFmcmFtZS0+
ZC0+ZnJhbWUgfHwgIWZyYW1lLT5kLT5mcmFtZS0+dmlldygpKQotICAgICAgICByZXR1cm47Ci0K
LSAgICBXZWJDb3JlOjpGcmFtZVZpZXcqIHZpZXcgPSBmcmFtZS0+ZC0+ZnJhbWUtPnZpZXcoKTsK
LSAgICB2aWV3LT5zZXRGaXhlZFZpc2libGVDb250ZW50UmVjdChyZWN0KTsKLX0KLQotLyohCi0g
ICAgXGZuIGJvb2wgUVdlYlBhZ2U6OmFjY2VwdE5hdmlnYXRpb25SZXF1ZXN0KFFXZWJGcmFtZSAq
ZnJhbWUsIGNvbnN0IFFOZXR3b3JrUmVxdWVzdCAmcmVxdWVzdCwgUVdlYlBhZ2U6Ok5hdmlnYXRp
b25UeXBlIHR5cGUpCi0KLSAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuZXZlciBXZWJL
aXQgcmVxdWVzdHMgdG8gbmF2aWdhdGUgXGEgZnJhbWUgdG8gdGhlIHJlc291cmNlIHNwZWNpZmll
ZCBieSBcYSByZXF1ZXN0IGJ5IG1lYW5zIG9mCi0gICAgdGhlIHNwZWNpZmllZCBuYXZpZ2F0aW9u
IHR5cGUgXGEgdHlwZS4KLQotICAgIElmIFxhIGZyYW1lIGlzIGEgbnVsbCBwb2ludGVyIHRoZW4g
bmF2aWdhdGlvbiB0byBhIG5ldyB3aW5kb3cgaXMgcmVxdWVzdGVkLiBJZiB0aGUgcmVxdWVzdCBp
cwotICAgIGFjY2VwdGVkIGNyZWF0ZVdpbmRvdygpIHdpbGwgYmUgY2FsbGVkLgotCi0gICAgVGhl
IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaW50ZXJwcmV0cyB0aGUgcGFnZSdzIGxpbmtEZWxlZ2F0
aW9uUG9saWN5IGFuZCBlbWl0cyBsaW5rQ2xpY2tlZCBhY2NvcmRpbmdseSBvciByZXR1cm5zIHRy
dWUKLSAgICB0byBsZXQgUVdlYlBhZ2UgaGFuZGxlIHRoZSBuYXZpZ2F0aW9uIGl0c2VsZi4KLQot
ICAgIFxzYSBjcmVhdGVXaW5kb3coKQotKi8KLWJvb2wgUVdlYlBhZ2U6OmFjY2VwdE5hdmlnYXRp
b25SZXF1ZXN0KFFXZWJGcmFtZSAqZnJhbWUsIGNvbnN0IFFOZXR3b3JrUmVxdWVzdCAmcmVxdWVz
dCwgUVdlYlBhZ2U6Ok5hdmlnYXRpb25UeXBlIHR5cGUpCi17Ci0gICAgUV9VTlVTRUQoZnJhbWUp
Ci0gICAgaWYgKHR5cGUgPT0gTmF2aWdhdGlvblR5cGVMaW5rQ2xpY2tlZCkgewotICAgICAgICBz
d2l0Y2ggKGQtPmxpbmtQb2xpY3kpIHsKLSAgICAgICAgICAgIGNhc2UgRG9udERlbGVnYXRlTGlu
a3M6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgICAgIGNhc2UgRGVs
ZWdhdGVFeHRlcm5hbExpbmtzOgotICAgICAgICAgICAgICAgIGlmIChXZWJDb3JlOjpTY2hlbWVS
ZWdpc3RyeTo6c2hvdWxkVHJlYXRVUkxTY2hlbWVBc0xvY2FsKHJlcXVlc3QudXJsKCkuc2NoZW1l
KCkpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICBl
bWl0IGxpbmtDbGlja2VkKHJlcXVlc3QudXJsKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKLQotICAgICAgICAgICAgY2FzZSBEZWxlZ2F0ZUFsbExpbmtzOgotICAgICAgICAgICAg
ICAgIGVtaXQgbGlua0NsaWNrZWQocmVxdWVzdC51cmwoKSk7Ci0gICAgICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi0vKiEK
LSAgICBccHJvcGVydHkgUVdlYlBhZ2U6Omhhc1NlbGVjdGlvbgotICAgIFxicmllZiB3aGV0aGVy
IHRoaXMgcGFnZSBjb250YWlucyBzZWxlY3RlZCBjb250ZW50IG9yIG5vdC4KLQotICAgIFxzYSBz
ZWxlY3Rpb25DaGFuZ2VkKCkKLSovCi1ib29sIFFXZWJQYWdlOjpoYXNTZWxlY3Rpb24oKSBjb25z
dAotewotICAgIGQtPmNyZWF0ZU1haW5GcmFtZSgpOwotICAgIFdlYkNvcmU6OkZyYW1lKiBmcmFt
ZSA9IGQtPnBhZ2UtPmZvY3VzQ29udHJvbGxlcigpLT5mb2N1c2VkT3JNYWluRnJhbWUoKTsKLSAg
ICBpZiAoZnJhbWUpCi0gICAgICAgIHJldHVybiAoZnJhbWUtPnNlbGVjdGlvbigpLT5zZWxlY3Rp
b24oKS5zZWxlY3Rpb25UeXBlKCkgIT0gVmlzaWJsZVNlbGVjdGlvbjo6Tm9TZWxlY3Rpb24pOwot
ICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyohCi0gICAgXHByb3BlcnR5IFFXZWJQYWdlOjpzZWxl
Y3RlZFRleHQKLSAgICBcYnJpZWYgdGhlIHRleHQgY3VycmVudGx5IHNlbGVjdGVkCi0KLSAgICBC
eSBkZWZhdWx0LCB0aGlzIHByb3BlcnR5IGNvbnRhaW5zIGFuIGVtcHR5IHN0cmluZy4KLQotICAg
IFxzYSBzZWxlY3Rpb25DaGFuZ2VkKCksIHNlbGVjdGVkSHRtbCgpCi0qLwotUVN0cmluZyBRV2Vi
UGFnZTo6c2VsZWN0ZWRUZXh0KCkgY29uc3QKLXsKLSAgICBkLT5jcmVhdGVNYWluRnJhbWUoKTsK
LSAgICBXZWJDb3JlOjpGcmFtZSogZnJhbWUgPSBkLT5wYWdlLT5mb2N1c0NvbnRyb2xsZXIoKS0+
Zm9jdXNlZE9yTWFpbkZyYW1lKCk7Ci0gICAgaWYgKGZyYW1lLT5zZWxlY3Rpb24oKS0+c2VsZWN0
aW9uKCkuc2VsZWN0aW9uVHlwZSgpID09IFZpc2libGVTZWxlY3Rpb246Ok5vU2VsZWN0aW9uKQot
ICAgICAgICByZXR1cm4gUVN0cmluZygpOwotICAgIHJldHVybiBmcmFtZS0+ZWRpdG9yKCktPnNl
bGVjdGVkVGV4dCgpOwotfQotCi0vKiEKLSAgICBcc2luY2UgNC44Ci0gICAgXHByb3BlcnR5IFFX
ZWJQYWdlOjpzZWxlY3RlZEh0bWwKLSAgICBcYnJpZWYgdGhlIEhUTUwgY3VycmVudGx5IHNlbGVj
dGVkCi0KLSAgICBCeSBkZWZhdWx0LCB0aGlzIHByb3BlcnR5IGNvbnRhaW5zIGFuIGVtcHR5IHN0
cmluZy4KLQotICAgIFxzYSBzZWxlY3Rpb25DaGFuZ2VkKCksIHNlbGVjdGVkVGV4dCgpCi0qLwot
UVN0cmluZyBRV2ViUGFnZTo6c2VsZWN0ZWRIdG1sKCkgY29uc3QKLXsKLSAgICBkLT5jcmVhdGVN
YWluRnJhbWUoKTsKLSAgICByZXR1cm4gZC0+cGFnZS0+Zm9jdXNDb250cm9sbGVyKCktPmZvY3Vz
ZWRPck1haW5GcmFtZSgpLT5lZGl0b3IoKS0+c2VsZWN0ZWRSYW5nZSgpLT50b0hUTUwoKTsKLX0K
LQotI2lmbmRlZiBRVF9OT19BQ1RJT04KLS8qIQotICAgUmV0dXJucyBhIFFBY3Rpb24gZm9yIHRo
ZSBzcGVjaWZpZWQgV2ViQWN0aW9uIFxhIGFjdGlvbi4KLQotICAgVGhlIGFjdGlvbiBpcyBvd25l
ZCBieSB0aGUgUVdlYlBhZ2UgYnV0IHlvdSBjYW4gY3VzdG9taXplIHRoZSBsb29rIGJ5Ci0gICBj
aGFuZ2luZyBpdHMgcHJvcGVydGllcy4KLQotICAgUVdlYlBhZ2UgYWxzbyB0YWtlcyBjYXJlIG9m
IGltcGxlbWVudGluZyB0aGUgYWN0aW9uLCBzbyB0aGF0IHVwb24KLSAgIHRyaWdnZXJpbmcgdGhl
IGNvcnJlc3BvbmRpbmcgYWN0aW9uIGlzIHBlcmZvcm1lZCBvbiB0aGUgcGFnZS4KLQotICAgXHNh
IHRyaWdnZXJBY3Rpb24oKQotKi8KLVFBY3Rpb24gKlFXZWJQYWdlOjphY3Rpb24oV2ViQWN0aW9u
IGFjdGlvbikgY29uc3QKLXsKLSAgICBpZiAoYWN0aW9uID09IFFXZWJQYWdlOjpOb1dlYkFjdGlv
bikgcmV0dXJuIDA7Ci0gICAgaWYgKGQtPmFjdGlvbnNbYWN0aW9uXSkKLSAgICAgICAgcmV0dXJu
IGQtPmFjdGlvbnNbYWN0aW9uXTsKLQotICAgIFFTdHJpbmcgdGV4dDsKLSAgICBRSWNvbiBpY29u
OwotICAgIFFTdHlsZSAqc3R5bGUgPSBkLT5jbGllbnQgPyBkLT5jbGllbnQtPnN0eWxlKCkgOiBx
QXBwLT5zdHlsZSgpOwotICAgIGJvb2wgY2hlY2thYmxlID0gZmFsc2U7Ci0KLSAgICBzd2l0Y2gg
KGFjdGlvbikgewotICAgICAgICBjYXNlIE9wZW5MaW5rOgotICAgICAgICAgICAgdGV4dCA9IGNv
bnRleHRNZW51SXRlbVRhZ09wZW5MaW5rKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAg
Y2FzZSBPcGVuTGlua0luTmV3V2luZG93OgotICAgICAgICAgICAgdGV4dCA9IGNvbnRleHRNZW51
SXRlbVRhZ09wZW5MaW5rSW5OZXdXaW5kb3coKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICBjYXNlIE9wZW5GcmFtZUluTmV3V2luZG93OgotICAgICAgICAgICAgdGV4dCA9IGNvbnRleHRN
ZW51SXRlbVRhZ09wZW5GcmFtZUluTmV3V2luZG93KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgY2FzZSBPcGVuTGlua0luVGhpc1dpbmRvdzoKLSAgICAgICAgICAgIHRleHQgPSBjb250
ZXh0TWVudUl0ZW1UYWdPcGVuTGlua0luVGhpc1dpbmRvdygpOwotICAgICAgICAgICAgYnJlYWs7
Ci0KLSAgICAgICAgY2FzZSBEb3dubG9hZExpbmtUb0Rpc2s6Ci0gICAgICAgICAgICB0ZXh0ID0g
Y29udGV4dE1lbnVJdGVtVGFnRG93bmxvYWRMaW5rVG9EaXNrKCk7Ci0gICAgICAgICAgICBicmVh
azsKLSAgICAgICAgY2FzZSBDb3B5TGlua1RvQ2xpcGJvYXJkOgotICAgICAgICAgICAgdGV4dCA9
IGNvbnRleHRNZW51SXRlbVRhZ0NvcHlMaW5rVG9DbGlwYm9hcmQoKTsKLSAgICAgICAgICAgIGJy
ZWFrOwotCi0gICAgICAgIGNhc2UgT3BlbkltYWdlSW5OZXdXaW5kb3c6Ci0gICAgICAgICAgICB0
ZXh0ID0gY29udGV4dE1lbnVJdGVtVGFnT3BlbkltYWdlSW5OZXdXaW5kb3coKTsKLSAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICBjYXNlIERvd25sb2FkSW1hZ2VUb0Rpc2s6Ci0gICAgICAgICAg
ICB0ZXh0ID0gY29udGV4dE1lbnVJdGVtVGFnRG93bmxvYWRJbWFnZVRvRGlzaygpOwotICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ29weUltYWdlVG9DbGlwYm9hcmQ6Ci0gICAgICAg
ICAgICB0ZXh0ID0gY29udGV4dE1lbnVJdGVtVGFnQ29weUltYWdlVG9DbGlwYm9hcmQoKTsKLSAg
ICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENvcHlJbWFnZVVybFRvQ2xpcGJvYXJkOgot
ICAgICAgICAgICAgdGV4dCA9IGNvbnRleHRNZW51SXRlbVRhZ0NvcHlJbWFnZVVybFRvQ2xpcGJv
YXJkKCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEJhY2s6Ci0gICAgICAg
ICAgICB0ZXh0ID0gY29udGV4dE1lbnVJdGVtVGFnR29CYWNrKCk7Ci0gICAgICAgICAgICBpY29u
ID0gc3R5bGUtPnN0YW5kYXJkSWNvbihRU3R5bGU6OlNQX0Fycm93QmFjayk7Ci0gICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgY2FzZSBGb3J3YXJkOgotICAgICAgICAgICAgdGV4dCA9IGNvbnRl
eHRNZW51SXRlbVRhZ0dvRm9yd2FyZCgpOwotICAgICAgICAgICAgaWNvbiA9IHN0eWxlLT5zdGFu
ZGFyZEljb24oUVN0eWxlOjpTUF9BcnJvd0ZvcndhcmQpOwotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgIGNhc2UgU3RvcDoKLSAgICAgICAgICAgIHRleHQgPSBjb250ZXh0TWVudUl0ZW1UYWdT
dG9wKCk7Ci0gICAgICAgICAgICBpY29uID0gc3R5bGUtPnN0YW5kYXJkSWNvbihRU3R5bGU6OlNQ
X0Jyb3dzZXJTdG9wKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJlbG9hZDoK
LSAgICAgICAgICAgIHRleHQgPSBjb250ZXh0TWVudUl0ZW1UYWdSZWxvYWQoKTsKLSAgICAgICAg
ICAgIGljb24gPSBzdHlsZS0+c3RhbmRhcmRJY29uKFFTdHlsZTo6U1BfQnJvd3NlclJlbG9hZCk7
Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEN1dDoKLSAgICAgICAgICAgIHRl
eHQgPSBjb250ZXh0TWVudUl0ZW1UYWdDdXQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICBjYXNlIENvcHk6Ci0gICAgICAgICAgICB0ZXh0ID0gY29udGV4dE1lbnVJdGVtVGFnQ29weSgp
OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUGFzdGU6Ci0gICAgICAgICAgICB0
ZXh0ID0gY29udGV4dE1lbnVJdGVtVGFnUGFzdGUoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICBjYXNlIFNlbGVjdEFsbDoKLSAgICAgICAgICAgIHRleHQgPSBjb250ZXh0TWVudUl0ZW1U
YWdTZWxlY3RBbGwoKTsKLSAgICAgICAgICAgIGJyZWFrOwotI2lmbmRlZiBRVF9OT19VTkRPU1RB
Q0sKLSAgICAgICAgY2FzZSBVbmRvOiB7Ci0gICAgICAgICAgICBRQWN0aW9uICphID0gdW5kb1N0
YWNrKCktPmNyZWF0ZVVuZG9BY3Rpb24oZC0+cSk7Ci0gICAgICAgICAgICBkLT5hY3Rpb25zW2Fj
dGlvbl0gPSBhOwotICAgICAgICAgICAgcmV0dXJuIGE7Ci0gICAgICAgIH0KLSAgICAgICAgY2Fz
ZSBSZWRvOiB7Ci0gICAgICAgICAgICBRQWN0aW9uICphID0gdW5kb1N0YWNrKCktPmNyZWF0ZVJl
ZG9BY3Rpb24oZC0+cSk7Ci0gICAgICAgICAgICBkLT5hY3Rpb25zW2FjdGlvbl0gPSBhOwotICAg
ICAgICAgICAgcmV0dXJuIGE7Ci0gICAgICAgIH0KLSNlbmRpZiAvLyBRVF9OT19VTkRPU1RBQ0sK
LSAgICAgICAgY2FzZSBNb3ZlVG9OZXh0Q2hhcjoKLSAgICAgICAgICAgIHRleHQgPSB0cigiTW92
ZSB0aGUgY3Vyc29yIHRvIHRoZSBuZXh0IGNoYXJhY3RlciIpOwotICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgIGNhc2UgTW92ZVRvUHJldmlvdXNDaGFyOgotICAgICAgICAgICAgdGV4dCA9IHRy
KCJNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIHByZXZpb3VzIGNoYXJhY3RlciIpOwotICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTW92ZVRvTmV4dFdvcmQ6Ci0gICAgICAgICAgICB0ZXh0
ID0gdHIoIk1vdmUgdGhlIGN1cnNvciB0byB0aGUgbmV4dCB3b3JkIik7Ci0gICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgY2FzZSBNb3ZlVG9QcmV2aW91c1dvcmQ6Ci0gICAgICAgICAgICB0ZXh0
ID0gdHIoIk1vdmUgdGhlIGN1cnNvciB0byB0aGUgcHJldmlvdXMgd29yZCIpOwotICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTW92ZVRvTmV4dExpbmU6Ci0gICAgICAgICAgICB0ZXh0
ID0gdHIoIk1vdmUgdGhlIGN1cnNvciB0byB0aGUgbmV4dCBsaW5lIik7Ci0gICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgY2FzZSBNb3ZlVG9QcmV2aW91c0xpbmU6Ci0gICAgICAgICAgICB0ZXh0
ID0gdHIoIk1vdmUgdGhlIGN1cnNvciB0byB0aGUgcHJldmlvdXMgbGluZSIpOwotICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTW92ZVRvU3RhcnRPZkxpbmU6Ci0gICAgICAgICAgICB0
ZXh0ID0gdHIoIk1vdmUgdGhlIGN1cnNvciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmUiKTsKLSAg
ICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE1vdmVUb0VuZE9mTGluZToKLSAgICAgICAg
ICAgIHRleHQgPSB0cigiTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUiKTsK
LSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE1vdmVUb1N0YXJ0T2ZCbG9jazoKLSAg
ICAgICAgICAgIHRleHQgPSB0cigiTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBzdGFydCBvZiB0aGUg
YmxvY2siKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE1vdmVUb0VuZE9mQmxv
Y2s6Ci0gICAgICAgICAgICB0ZXh0ID0gdHIoIk1vdmUgdGhlIGN1cnNvciB0byB0aGUgZW5kIG9m
IHRoZSBibG9jayIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTW92ZVRvU3Rh
cnRPZkRvY3VtZW50OgotICAgICAgICAgICAgdGV4dCA9IHRyKCJNb3ZlIHRoZSBjdXJzb3IgdG8g
dGhlIHN0YXJ0IG9mIHRoZSBkb2N1bWVudCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
IGNhc2UgTW92ZVRvRW5kT2ZEb2N1bWVudDoKLSAgICAgICAgICAgIHRleHQgPSB0cigiTW92ZSB0
aGUgY3Vyc29yIHRvIHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50Iik7Ci0gICAgICAgICAgICBicmVh
azsKLSAgICAgICAgY2FzZSBTZWxlY3ROZXh0Q2hhcjoKLSAgICAgICAgICAgIHRleHQgPSB0cigi
U2VsZWN0IHRvIHRoZSBuZXh0IGNoYXJhY3RlciIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgIGNhc2UgU2VsZWN0UHJldmlvdXNDaGFyOgotICAgICAgICAgICAgdGV4dCA9IHRyKCJTZWxl
Y3QgdG8gdGhlIHByZXZpb3VzIGNoYXJhY3RlciIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgIGNhc2UgU2VsZWN0TmV4dFdvcmQ6Ci0gICAgICAgICAgICB0ZXh0ID0gdHIoIlNlbGVjdCB0
byB0aGUgbmV4dCB3b3JkIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTZWxl
Y3RQcmV2aW91c1dvcmQ6Ci0gICAgICAgICAgICB0ZXh0ID0gdHIoIlNlbGVjdCB0byB0aGUgcHJl
dmlvdXMgd29yZCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU2VsZWN0TmV4
dExpbmU6Ci0gICAgICAgICAgICB0ZXh0ID0gdHIoIlNlbGVjdCB0byB0aGUgbmV4dCBsaW5lIik7
Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTZWxlY3RQcmV2aW91c0xpbmU6Ci0g
ICAgICAgICAgICB0ZXh0ID0gdHIoIlNlbGVjdCB0byB0aGUgcHJldmlvdXMgbGluZSIpOwotICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU2VsZWN0U3RhcnRPZkxpbmU6Ci0gICAgICAg
ICAgICB0ZXh0ID0gdHIoIlNlbGVjdCB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmUiKTsKLSAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNlbGVjdEVuZE9mTGluZToKLSAgICAgICAgICAg
IHRleHQgPSB0cigiU2VsZWN0IHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUiKTsKLSAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICBjYXNlIFNlbGVjdFN0YXJ0T2ZCbG9jazoKLSAgICAgICAgICAgIHRl
eHQgPSB0cigiU2VsZWN0IHRvIHRoZSBzdGFydCBvZiB0aGUgYmxvY2siKTsKLSAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICBjYXNlIFNlbGVjdEVuZE9mQmxvY2s6Ci0gICAgICAgICAgICB0ZXh0
ID0gdHIoIlNlbGVjdCB0byB0aGUgZW5kIG9mIHRoZSBibG9jayIpOwotICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgIGNhc2UgU2VsZWN0U3RhcnRPZkRvY3VtZW50OgotICAgICAgICAgICAgdGV4
dCA9IHRyKCJTZWxlY3QgdG8gdGhlIHN0YXJ0IG9mIHRoZSBkb2N1bWVudCIpOwotICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU2VsZWN0RW5kT2ZEb2N1bWVudDoKLSAgICAgICAgICAg
IHRleHQgPSB0cigiU2VsZWN0IHRvIHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50Iik7Ci0gICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgY2FzZSBEZWxldGVTdGFydE9mV29yZDoKLSAgICAgICAgICAg
IHRleHQgPSB0cigiRGVsZXRlIHRvIHRoZSBzdGFydCBvZiB0aGUgd29yZCIpOwotICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRGVsZXRlRW5kT2ZXb3JkOgotICAgICAgICAgICAgdGV4
dCA9IHRyKCJEZWxldGUgdG8gdGhlIGVuZCBvZiB0aGUgd29yZCIpOwotICAgICAgICAgICAgYnJl
YWs7Ci0KLSAgICAgICAgY2FzZSBTZXRUZXh0RGlyZWN0aW9uRGVmYXVsdDoKLSAgICAgICAgICAg
IHRleHQgPSBjb250ZXh0TWVudUl0ZW1UYWdEZWZhdWx0RGlyZWN0aW9uKCk7Ci0gICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgY2FzZSBTZXRUZXh0RGlyZWN0aW9uTGVmdFRvUmlnaHQ6Ci0gICAg
ICAgICAgICB0ZXh0ID0gY29udGV4dE1lbnVJdGVtVGFnTGVmdFRvUmlnaHQoKTsKLSAgICAgICAg
ICAgIGNoZWNrYWJsZSA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBT
ZXRUZXh0RGlyZWN0aW9uUmlnaHRUb0xlZnQ6Ci0gICAgICAgICAgICB0ZXh0ID0gY29udGV4dE1l
bnVJdGVtVGFnUmlnaHRUb0xlZnQoKTsKLSAgICAgICAgICAgIGNoZWNrYWJsZSA9IHRydWU7Ci0g
ICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFRvZ2dsZUJvbGQ6Ci0gICAgICAgICAg
ICB0ZXh0ID0gY29udGV4dE1lbnVJdGVtVGFnQm9sZCgpOwotICAgICAgICAgICAgY2hlY2thYmxl
ID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRvZ2dsZUl0YWxpYzoK
LSAgICAgICAgICAgIHRleHQgPSBjb250ZXh0TWVudUl0ZW1UYWdJdGFsaWMoKTsKLSAgICAgICAg
ICAgIGNoZWNrYWJsZSA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBU
b2dnbGVVbmRlcmxpbmU6Ci0gICAgICAgICAgICB0ZXh0ID0gY29udGV4dE1lbnVJdGVtVGFnVW5k
ZXJsaW5lKCk7Ci0gICAgICAgICAgICBjaGVja2FibGUgPSB0cnVlOwotICAgICAgICAgICAgYnJl
YWs7Ci0KLSAgICAgICAgY2FzZSBJbnNwZWN0RWxlbWVudDoKLSAgICAgICAgICAgIHRleHQgPSBj
b250ZXh0TWVudUl0ZW1UYWdJbnNwZWN0RWxlbWVudCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0K
LSAgICAgICAgY2FzZSBJbnNlcnRQYXJhZ3JhcGhTZXBhcmF0b3I6Ci0gICAgICAgICAgICB0ZXh0
ID0gdHIoIkluc2VydCBhIG5ldyBwYXJhZ3JhcGgiKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICBjYXNlIEluc2VydExpbmVTZXBhcmF0b3I6Ci0gICAgICAgICAgICB0ZXh0ID0gdHIoIklu
c2VydCBhIG5ldyBsaW5lIik7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFBh
c3RlQW5kTWF0Y2hTdHlsZToKLSAgICAgICAgICAgIHRleHQgPSB0cigiUGFzdGUgYW5kIE1hdGNo
IFN0eWxlIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSZW1vdmVGb3JtYXQ6
Ci0gICAgICAgICAgICB0ZXh0ID0gdHIoIlJlbW92ZSBmb3JtYXR0aW5nIik7Ci0gICAgICAgICAg
ICBicmVhazsKLQotICAgICAgICBjYXNlIFRvZ2dsZVN0cmlrZXRocm91Z2g6Ci0gICAgICAgICAg
ICB0ZXh0ID0gdHIoIlN0cmlrZXRocm91Z2giKTsKLSAgICAgICAgICAgIGNoZWNrYWJsZSA9IHRy
dWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUb2dnbGVTdWJzY3JpcHQ6Ci0g
ICAgICAgICAgICB0ZXh0ID0gdHIoIlN1YnNjcmlwdCIpOwotICAgICAgICAgICAgY2hlY2thYmxl
ID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRvZ2dsZVN1cGVyc2Ny
aXB0OgotICAgICAgICAgICAgdGV4dCA9IHRyKCJTdXBlcnNjcmlwdCIpOwotICAgICAgICAgICAg
Y2hlY2thYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEluc2Vy
dFVub3JkZXJlZExpc3Q6Ci0gICAgICAgICAgICB0ZXh0ID0gdHIoIkluc2VydCBCdWxsZXRlZCBM
aXN0Iik7Ci0gICAgICAgICAgICBjaGVja2FibGUgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgIGNhc2UgSW5zZXJ0T3JkZXJlZExpc3Q6Ci0gICAgICAgICAgICB0ZXh0ID0gdHIo
Ikluc2VydCBOdW1iZXJlZCBMaXN0Iik7Ci0gICAgICAgICAgICBjaGVja2FibGUgPSB0cnVlOwot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSW5kZW50OgotICAgICAgICAgICAgdGV4
dCA9IHRyKCJJbmRlbnQiKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE91dGRl
bnQ6Ci0gICAgICAgICAgICB0ZXh0ID0gdHIoIk91dGRlbnQiKTsKLSAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICBjYXNlIEFsaWduQ2VudGVyOgotICAgICAgICAgICAgdGV4dCA9IHRyKCJDZW50
ZXIiKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFsaWduSnVzdGlmaWVkOgot
ICAgICAgICAgICAgdGV4dCA9IHRyKCJKdXN0aWZ5Iik7Ci0gICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgY2FzZSBBbGlnbkxlZnQ6Ci0gICAgICAgICAgICB0ZXh0ID0gdHIoIkFsaWduIExlZnQi
KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFsaWduUmlnaHQ6Ci0gICAgICAg
ICAgICB0ZXh0ID0gdHIoIkFsaWduIFJpZ2h0Iik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAg
ICAgY2FzZSBOb1dlYkFjdGlvbjoKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBkZWZh
dWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKHRleHQuaXNFbXB0eSgp
KQotICAgICAgICByZXR1cm4gMDsKLQotICAgIFFBY3Rpb24gKmEgPSBuZXcgUUFjdGlvbihkLT5x
KTsKLSAgICBhLT5zZXRUZXh0KHRleHQpOwotICAgIGEtPnNldERhdGEoYWN0aW9uKTsKLSAgICBh
LT5zZXRDaGVja2FibGUoY2hlY2thYmxlKTsKLSAgICBhLT5zZXRJY29uKGljb24pOwotCi0gICAg
Y29ubmVjdChhLCBTSUdOQUwodHJpZ2dlcmVkKGJvb2wpKSwKLSAgICAgICAgICAgIHRoaXMsIFNM
T1QoX3Ffd2ViQWN0aW9uVHJpZ2dlcmVkKGJvb2wpKSk7Ci0KLSAgICBkLT5hY3Rpb25zW2FjdGlv
bl0gPSBhOwotICAgIGQtPnVwZGF0ZUFjdGlvbihhY3Rpb24pOwotICAgIHJldHVybiBhOwotfQot
I2VuZGlmIC8vIFFUX05PX0FDVElPTgotCi0vKiEKLSAgICBccHJvcGVydHkgUVdlYlBhZ2U6Om1v
ZGlmaWVkCi0gICAgXGJyaWVmIHdoZXRoZXIgdGhlIHBhZ2UgY29udGFpbnMgdW5zdWJtaXR0ZWQg
Zm9ybSBkYXRhLCBvciB0aGUgY29udGVudHMgaGF2ZSBiZWVuIGNoYW5nZWQuCi0KLSAgICBCeSBk
ZWZhdWx0LCB0aGlzIHByb3BlcnR5IGlzIGZhbHNlLgotCi0gICAgXHNhIGNvbnRlbnRzQ2hhbmdl
ZCgpLCBjb250ZW50RWRpdGFibGUsIHVuZG9TdGFjaygpCi0qLwotYm9vbCBRV2ViUGFnZTo6aXNN
b2RpZmllZCgpIGNvbnN0Ci17Ci0jaWZkZWYgUVRfTk9fVU5ET1NUQUNLCi0gICAgcmV0dXJuIGZh
bHNlOwotI2Vsc2UKLSAgICBpZiAoIWQtPnVuZG9TdGFjaykKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgIHJldHVybiBkLT51bmRvU3RhY2stPmNhblVuZG8oKTsKLSNlbmRpZiAvLyBRVF9OT19V
TkRPU1RBQ0sKLX0KLQotI2lmbmRlZiBRVF9OT19VTkRPU1RBQ0sKLS8qIQotICAgIFJldHVybnMg
YSBwb2ludGVyIHRvIHRoZSB1bmRvIHN0YWNrIHVzZWQgZm9yIGVkaXRhYmxlIGNvbnRlbnQuCi0K
LSAgICBcc2EgbW9kaWZpZWQKLSovCi1RVW5kb1N0YWNrICpRV2ViUGFnZTo6dW5kb1N0YWNrKCkg
Y29uc3QKLXsKLSAgICBpZiAoIWQtPnVuZG9TdGFjaykKLSAgICAgICAgZC0+dW5kb1N0YWNrID0g
bmV3IFFVbmRvU3RhY2soY29uc3RfY2FzdDxRV2ViUGFnZSAqPih0aGlzKSk7Ci0KLSAgICByZXR1
cm4gZC0+dW5kb1N0YWNrOwotfQotI2VuZGlmIC8vIFFUX05PX1VORE9TVEFDSwotCi0vKiEgXHJl
aW1wCi0qLwotYm9vbCBRV2ViUGFnZTo6ZXZlbnQoUUV2ZW50ICpldikKLXsKLSAgICBzd2l0Y2gg
KGV2LT50eXBlKCkpIHsKLSAgICBjYXNlIFFFdmVudDo6VGltZXI6Ci0gICAgICAgIGQtPnRpbWVy
RXZlbnQoc3RhdGljX2Nhc3Q8UVRpbWVyRXZlbnQqPihldikpOwotICAgICAgICBicmVhazsKLSAg
ICBjYXNlIFFFdmVudDo6TW91c2VNb3ZlOgotICAgICAgICBkLT5tb3VzZU1vdmVFdmVudChzdGF0
aWNfY2FzdDxRTW91c2VFdmVudCo+KGV2KSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUUV2
ZW50OjpNb3VzZUJ1dHRvblByZXNzOgotICAgICAgICBkLT5tb3VzZVByZXNzRXZlbnQoc3RhdGlj
X2Nhc3Q8UU1vdXNlRXZlbnQqPihldikpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFFFdmVu
dDo6TW91c2VCdXR0b25EYmxDbGljazoKLSAgICAgICAgZC0+bW91c2VEb3VibGVDbGlja0V2ZW50
KHN0YXRpY19jYXN0PFFNb3VzZUV2ZW50Kj4oZXYpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2Fz
ZSBRRXZlbnQ6Ok1vdXNlQnV0dG9uUmVsZWFzZToKLSAgICAgICAgZC0+bW91c2VSZWxlYXNlRXZl
bnQoc3RhdGljX2Nhc3Q8UU1vdXNlRXZlbnQqPihldikpOwotICAgICAgICBicmVhazsKLSNpZiAh
ZGVmaW5lZChRVF9OT19HUkFQSElDU1ZJRVcpCi0gICAgY2FzZSBRRXZlbnQ6OkdyYXBoaWNzU2Nl
bmVNb3VzZU1vdmU6IHsKLSAgICAgICAgUUdyYXBoaWNzU2NlbmVNb3VzZUV2ZW50ICpnc0V2ID0g
c3RhdGljX2Nhc3Q8UUdyYXBoaWNzU2NlbmVNb3VzZUV2ZW50Kj4oZXYpOwotICAgICAgICBRTW91
c2VFdmVudCBkdW1teUV2ZW50KFFFdmVudDo6TW91c2VNb3ZlLCBnc0V2LT5wb3MoKSwgZ3NFdi0+
c2NyZWVuUG9zKCksIGdzRXYtPmJ1dHRvbigpLCBnc0V2LT5idXR0b25zKCksIGdzRXYtPm1vZGlm
aWVycygpKTsKLSAgICAgICAgZC0+bW91c2VNb3ZlRXZlbnQoJmR1bW15RXZlbnQpOwotICAgICAg
ICBldi0+c2V0QWNjZXB0ZWQoZHVtbXlFdmVudC5pc0FjY2VwdGVkKCkpOwotICAgICAgICBicmVh
azsKLSAgICB9Ci0gICAgY2FzZSBRRXZlbnQ6OkdyYXBoaWNzU2NlbmVNb3VzZVJlbGVhc2U6IHsK
LSAgICAgICAgUUdyYXBoaWNzU2NlbmVNb3VzZUV2ZW50ICpnc0V2ID0gc3RhdGljX2Nhc3Q8UUdy
YXBoaWNzU2NlbmVNb3VzZUV2ZW50Kj4oZXYpOwotICAgICAgICBRTW91c2VFdmVudCBkdW1teUV2
ZW50KFFFdmVudDo6TW91c2VCdXR0b25SZWxlYXNlLCBnc0V2LT5wb3MoKSwgZ3NFdi0+c2NyZWVu
UG9zKCksIGdzRXYtPmJ1dHRvbigpLCBnc0V2LT5idXR0b25zKCksIGdzRXYtPm1vZGlmaWVycygp
KTsKLSAgICAgICAgZC0+bW91c2VSZWxlYXNlRXZlbnQoJmR1bW15RXZlbnQpOwotICAgICAgICBl
di0+c2V0QWNjZXB0ZWQoZHVtbXlFdmVudC5pc0FjY2VwdGVkKCkpOwotICAgICAgICBicmVhazsK
LSAgICB9Ci0gICAgY2FzZSBRRXZlbnQ6OkdyYXBoaWNzU2NlbmVNb3VzZVByZXNzOiB7Ci0gICAg
ICAgIFFHcmFwaGljc1NjZW5lTW91c2VFdmVudCAqZ3NFdiA9IHN0YXRpY19jYXN0PFFHcmFwaGlj
c1NjZW5lTW91c2VFdmVudCo+KGV2KTsKLSAgICAgICAgUU1vdXNlRXZlbnQgZHVtbXlFdmVudChR
RXZlbnQ6Ok1vdXNlQnV0dG9uUHJlc3MsIGdzRXYtPnBvcygpLCBnc0V2LT5zY3JlZW5Qb3MoKSwg
Z3NFdi0+YnV0dG9uKCksIGdzRXYtPmJ1dHRvbnMoKSwgZ3NFdi0+bW9kaWZpZXJzKCkpOwotICAg
ICAgICBkLT5tb3VzZVByZXNzRXZlbnQoJmR1bW15RXZlbnQpOwotICAgICAgICBldi0+c2V0QWNj
ZXB0ZWQoZHVtbXlFdmVudC5pc0FjY2VwdGVkKCkpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0g
ICAgY2FzZSBRRXZlbnQ6OkdyYXBoaWNzU2NlbmVNb3VzZURvdWJsZUNsaWNrOiB7Ci0gICAgICAg
IFFHcmFwaGljc1NjZW5lTW91c2VFdmVudCAqZ3NFdiA9IHN0YXRpY19jYXN0PFFHcmFwaGljc1Nj
ZW5lTW91c2VFdmVudCo+KGV2KTsKLSAgICAgICAgUU1vdXNlRXZlbnQgZHVtbXlFdmVudChRRXZl
bnQ6Ok1vdXNlQnV0dG9uRGJsQ2xpY2ssIGdzRXYtPnBvcygpLCBnc0V2LT5zY3JlZW5Qb3MoKSwg
Z3NFdi0+YnV0dG9uKCksIGdzRXYtPmJ1dHRvbnMoKSwgZ3NFdi0+bW9kaWZpZXJzKCkpOwotICAg
ICAgICBkLT5tb3VzZURvdWJsZUNsaWNrRXZlbnQoJmR1bW15RXZlbnQpOwotICAgICAgICBldi0+
c2V0QWNjZXB0ZWQoZHVtbXlFdmVudC5pc0FjY2VwdGVkKCkpOwotICAgICAgICBicmVhazsKLSAg
ICB9Ci0jZW5kaWYKLSNpZm5kZWYgUVRfTk9fQ09OVEVYVE1FTlUKLSAgICBjYXNlIFFFdmVudDo6
Q29udGV4dE1lbnU6Ci0gICAgICAgIGQtPmNvbnRleHRNZW51RXZlbnQoc3RhdGljX2Nhc3Q8UUNv
bnRleHRNZW51RXZlbnQqPihldiktPmdsb2JhbFBvcygpKTsKLSAgICAgICAgYnJlYWs7Ci0jaWYg
IWRlZmluZWQoUVRfTk9fR1JBUEhJQ1NWSUVXKQotICAgIGNhc2UgUUV2ZW50OjpHcmFwaGljc1Nj
ZW5lQ29udGV4dE1lbnU6Ci0gICAgICAgIGQtPmNvbnRleHRNZW51RXZlbnQoc3RhdGljX2Nhc3Q8
UUdyYXBoaWNzU2NlbmVDb250ZXh0TWVudUV2ZW50Kj4oZXYpLT5zY3JlZW5Qb3MoKSk7Ci0gICAg
ICAgIGJyZWFrOwotI2VuZGlmCi0jZW5kaWYKLSNpZm5kZWYgUVRfTk9fV0hFRUxFVkVOVAotICAg
IGNhc2UgUUV2ZW50OjpXaGVlbDoKLSAgICAgICAgZC0+d2hlZWxFdmVudChzdGF0aWNfY2FzdDxR
V2hlZWxFdmVudCo+KGV2KSk7Ci0gICAgICAgIGJyZWFrOwotI2lmICFkZWZpbmVkKFFUX05PX0dS
QVBISUNTVklFVykKLSAgICBjYXNlIFFFdmVudDo6R3JhcGhpY3NTY2VuZVdoZWVsOiB7Ci0gICAg
ICAgIFFHcmFwaGljc1NjZW5lV2hlZWxFdmVudCAqZ3NFdiA9IHN0YXRpY19jYXN0PFFHcmFwaGlj
c1NjZW5lV2hlZWxFdmVudCo+KGV2KTsKLSAgICAgICAgUVdoZWVsRXZlbnQgZHVtbXlFdmVudChn
c0V2LT5wb3MoKSwgZ3NFdi0+c2NyZWVuUG9zKCksIGdzRXYtPmRlbHRhKCksIGdzRXYtPmJ1dHRv
bnMoKSwgZ3NFdi0+bW9kaWZpZXJzKCksIGdzRXYtPm9yaWVudGF0aW9uKCkpOwotICAgICAgICBk
LT53aGVlbEV2ZW50KCZkdW1teUV2ZW50KTsKLSAgICAgICAgZXYtPnNldEFjY2VwdGVkKGR1bW15
RXZlbnQuaXNBY2NlcHRlZCgpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotI2VuZGlmCi0jZW5k
aWYKLSAgICBjYXNlIFFFdmVudDo6S2V5UHJlc3M6Ci0gICAgICAgIGQtPmtleVByZXNzRXZlbnQo
c3RhdGljX2Nhc3Q8UUtleUV2ZW50Kj4oZXYpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBR
RXZlbnQ6OktleVJlbGVhc2U6Ci0gICAgICAgIGQtPmtleVJlbGVhc2VFdmVudChzdGF0aWNfY2Fz
dDxRS2V5RXZlbnQqPihldikpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFFFdmVudDo6Rm9j
dXNJbjoKLSAgICAgICAgZC0+Zm9jdXNJbkV2ZW50KHN0YXRpY19jYXN0PFFGb2N1c0V2ZW50Kj4o
ZXYpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBRRXZlbnQ6OkZvY3VzT3V0OgotICAgICAg
ICBkLT5mb2N1c091dEV2ZW50KHN0YXRpY19jYXN0PFFGb2N1c0V2ZW50Kj4oZXYpKTsKLSAgICAg
ICAgYnJlYWs7Ci0jaWZuZGVmIFFUX05PX0RSQUdBTkREUk9QCi0gICAgY2FzZSBRRXZlbnQ6OkRy
YWdFbnRlcjoKLSAgICAgICAgZC0+ZHJhZ0VudGVyRXZlbnQoc3RhdGljX2Nhc3Q8UURyYWdFbnRl
ckV2ZW50Kj4oZXYpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBRRXZlbnQ6OkRyYWdMZWF2
ZToKLSAgICAgICAgZC0+ZHJhZ0xlYXZlRXZlbnQoc3RhdGljX2Nhc3Q8UURyYWdMZWF2ZUV2ZW50
Kj4oZXYpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBRRXZlbnQ6OkRyYWdNb3ZlOgotICAg
ICAgICBkLT5kcmFnTW92ZUV2ZW50KHN0YXRpY19jYXN0PFFEcmFnTW92ZUV2ZW50Kj4oZXYpKTsK
LSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBRRXZlbnQ6OkRyb3A6Ci0gICAgICAgIGQtPmRyb3BF
dmVudChzdGF0aWNfY2FzdDxRRHJvcEV2ZW50Kj4oZXYpKTsKLSAgICAgICAgYnJlYWs7Ci0jaWYg
IWRlZmluZWQoUVRfTk9fR1JBUEhJQ1NWSUVXKQotICAgIGNhc2UgUUV2ZW50OjpHcmFwaGljc1Nj
ZW5lRHJhZ0VudGVyOgotICAgICAgICBkLT5kcmFnRW50ZXJFdmVudChzdGF0aWNfY2FzdDxRR3Jh
cGhpY3NTY2VuZURyYWdEcm9wRXZlbnQqPihldikpOwotICAgICAgICBicmVhazsKLSAgICBjYXNl
IFFFdmVudDo6R3JhcGhpY3NTY2VuZURyYWdNb3ZlOgotICAgICAgICBkLT5kcmFnTW92ZUV2ZW50
KHN0YXRpY19jYXN0PFFHcmFwaGljc1NjZW5lRHJhZ0Ryb3BFdmVudCo+KGV2KSk7Ci0gICAgICAg
IGJyZWFrOwotICAgIGNhc2UgUUV2ZW50OjpHcmFwaGljc1NjZW5lRHJhZ0xlYXZlOgotICAgICAg
ICBkLT5kcmFnTGVhdmVFdmVudChzdGF0aWNfY2FzdDxRR3JhcGhpY3NTY2VuZURyYWdEcm9wRXZl
bnQqPihldikpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFFFdmVudDo6R3JhcGhpY3NTY2Vu
ZURyb3A6Ci0gICAgICAgIGQtPmRyb3BFdmVudChzdGF0aWNfY2FzdDxRR3JhcGhpY3NTY2VuZURy
YWdEcm9wRXZlbnQqPihldikpOwotICAgICAgICBicmVhazsKLSNlbmRpZgotCi0jZW5kaWYKLSAg
ICBjYXNlIFFFdmVudDo6SW5wdXRNZXRob2Q6Ci0gICAgICAgIGQtPmlucHV0TWV0aG9kRXZlbnQo
c3RhdGljX2Nhc3Q8UUlucHV0TWV0aG9kRXZlbnQqPihldikpOwotICAgICAgICBicmVhazsKLSAg
ICBjYXNlIFFFdmVudDo6U2hvcnRjdXRPdmVycmlkZToKLSAgICAgICAgZC0+c2hvcnRjdXRPdmVy
cmlkZUV2ZW50KHN0YXRpY19jYXN0PFFLZXlFdmVudCo+KGV2KSk7Ci0gICAgICAgIGJyZWFrOwot
ICAgIGNhc2UgUUV2ZW50OjpMZWF2ZToKLSAgICAgICAgZC0+bGVhdmVFdmVudChldik7Ci0gICAg
ICAgIGJyZWFrOwotICAgIGNhc2UgUUV2ZW50OjpUb3VjaEJlZ2luOgotICAgIGNhc2UgUUV2ZW50
OjpUb3VjaFVwZGF0ZToKLSAgICBjYXNlIFFFdmVudDo6VG91Y2hFbmQ6Ci0gICAgY2FzZSBRRXZl
bnQ6OlRvdWNoQ2FuY2VsOgotICAgICAgICAvLyBSZXR1cm4gd2hldGhlciB0aGUgZGVmYXVsdCBh
Y3Rpb24gd2FzIGNhbmNlbGxlZCBpbiB0aGUgSlMgZXZlbnQgaGFuZGxlcgotICAgICAgICByZXR1
cm4gZC0+dG91Y2hFdmVudChzdGF0aWNfY2FzdDxRVG91Y2hFdmVudCo+KGV2KSk7Ci0jaWZuZGVm
IFFUX05PX0dFU1RVUkVTCi0gICAgY2FzZSBRRXZlbnQ6Okdlc3R1cmU6Ci0gICAgICAgIGQtPmdl
c3R1cmVFdmVudChzdGF0aWNfY2FzdDxRR2VzdHVyZUV2ZW50Kj4oZXYpKTsKLSAgICAgICAgYnJl
YWs7Ci0jZW5kaWYKLSNpZm5kZWYgUVRfTk9fUFJPUEVSVElFUwotICAgIGNhc2UgUUV2ZW50OjpE
eW5hbWljUHJvcGVydHlDaGFuZ2U6Ci0gICAgICAgIGQtPmR5bmFtaWNQcm9wZXJ0eUNoYW5nZUV2
ZW50KHN0YXRpY19jYXN0PFFEeW5hbWljUHJvcGVydHlDaGFuZ2VFdmVudCo+KGV2KSk7Ci0gICAg
ICAgIGJyZWFrOwotI2VuZGlmCi0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIFFPYmplY3Q6
OmV2ZW50KGV2KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyohCi0gICAgU2lt
aWxhciB0byBRV2lkZ2V0Ojpmb2N1c05leHRQcmV2Q2hpbGQoKSBpdCBmb2N1c2VzIHRoZSBuZXh0
IGZvY3VzYWJsZSB3ZWIgZWxlbWVudAotICAgIGlmIFxhIG5leHQgaXMgdHJ1ZTsgb3RoZXJ3aXNl
IHRoZSBwcmV2aW91cyBlbGVtZW50IGlzIGZvY3VzZWQuCi0KLSAgICBSZXR1cm5zIHRydWUgaWYg
aXQgY2FuIGZpbmQgYSBuZXcgZm9jdXNhYmxlIGVsZW1lbnQsIG9yIGZhbHNlIGlmIGl0IGNhbid0
LgotKi8KLWJvb2wgUVdlYlBhZ2U6OmZvY3VzTmV4dFByZXZDaGlsZChib29sIG5leHQpCi17Ci0g
ICAgUUtleUV2ZW50IGV2KFFFdmVudDo6S2V5UHJlc3MsIFF0OjpLZXlfVGFiLCBRdDo6S2V5Ym9h
cmRNb2RpZmllcnMobmV4dCA/IFF0OjpOb01vZGlmaWVyIDogUXQ6OlNoaWZ0TW9kaWZpZXIpKTsK
LSAgICBkLT5rZXlQcmVzc0V2ZW50KCZldik7Ci0gICAgYm9vbCBoYXNGb2N1c2VkTm9kZSA9IGZh
bHNlOwotICAgIEZyYW1lICpmcmFtZSA9IGQtPnBhZ2UtPmZvY3VzQ29udHJvbGxlcigpLT5mb2N1
c2VkRnJhbWUoKTsKLSAgICBpZiAoZnJhbWUpIHsKLSAgICAgICAgRG9jdW1lbnQgKmRvY3VtZW50
ID0gZnJhbWUtPmRvY3VtZW50KCk7Ci0gICAgICAgIGhhc0ZvY3VzZWROb2RlID0gZG9jdW1lbnQg
JiYgZG9jdW1lbnQtPmZvY3VzZWROb2RlKCk7Ci0gICAgfQotICAgIC8vcURlYnVnKCkgPDwgImZv
Y3VzTmV4dFByZXZDaGlsZCgiIDw8IG5leHQgPDwgIikgPSIgPDwgZXYuaXNBY2NlcHRlZCgpIDw8
ICJmb2N1c2VkTm9kZT8iIDw8IGhhc0ZvY3VzZWROb2RlOwotICAgIHJldHVybiBoYXNGb2N1c2Vk
Tm9kZTsKLX0KLQotLyohCi0gICAgXHByb3BlcnR5IFFXZWJQYWdlOjpjb250ZW50RWRpdGFibGUK
LSAgICBcYnJpZWYgd2hldGhlciB0aGUgY29udGVudCBpbiB0aGlzIFFXZWJQYWdlIGlzIGVkaXRh
YmxlIG9yIG5vdAotICAgIFxzaW5jZSA0LjUKLQotICAgIElmIHRoaXMgcHJvcGVydHkgaXMgZW5h
YmxlZCB0aGUgY29udGVudHMgb2YgdGhlIHBhZ2UgY2FuIGJlIGVkaXRlZCBieSB0aGUgdXNlciB0
aHJvdWdoIGEgdmlzaWJsZQotICAgIGN1cnNvci4gSWYgZGlzYWJsZWQgKHRoZSBkZWZhdWx0KSBv
bmx5IEhUTUwgZWxlbWVudHMgaW4gdGhlIHdlYiBwYWdlIHdpdGggdGhlaXIKLSAgICBcY3tjb250
ZW50ZWRpdGFibGV9IGF0dHJpYnV0ZSBzZXQgYXJlIGVkaXRhYmxlLgotCi0gICAgXHNhIG1vZGlm
aWVkLCBjb250ZW50c0NoYW5nZWQoKSwgV2ViQWN0aW9uCi0qLwotdm9pZCBRV2ViUGFnZTo6c2V0
Q29udGVudEVkaXRhYmxlKGJvb2wgZWRpdGFibGUpCi17Ci0gICAgaWYgKGlzQ29udGVudEVkaXRh
YmxlKCkgIT0gZWRpdGFibGUpIHsKLSAgICAgICAgZC0+cGFnZS0+c2V0RWRpdGFibGUoZWRpdGFi
bGUpOwotICAgICAgICBkLT5wYWdlLT5zZXRUYWJLZXlDeWNsZXNUaHJvdWdoRWxlbWVudHMoIWVk
aXRhYmxlKTsKLSAgICAgICAgaWYgKGQtPm1haW5GcmFtZSkgewotICAgICAgICAgICAgV2ViQ29y
ZTo6RnJhbWUqIGZyYW1lID0gZC0+bWFpbkZyYW1lLmRhdGEoKS0+ZC0+ZnJhbWU7Ci0gICAgICAg
ICAgICBpZiAoZWRpdGFibGUpIHsKLSAgICAgICAgICAgICAgICBmcmFtZS0+ZWRpdG9yKCktPmFw
cGx5RWRpdGluZ1N0eWxlVG9Cb2R5RWxlbWVudCgpOwotICAgICAgICAgICAgICAgIC8vIEZJWE1F
OiBtYWMgcG9ydCBjYWxscyB0aGlzIGlmIHRoZXJlIGlzIG5vIHNlbGVjdGVkRE9NUmFuZ2UKLSAg
ICAgICAgICAgICAgICAvL2ZyYW1lLT5zZXRTZWxlY3Rpb25Gcm9tTm9uZSgpOwotICAgICAgICAg
ICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZC0+dXBkYXRlRWRpdG9yQWN0aW9ucygpOwotICAg
IH0KLX0KLQotYm9vbCBRV2ViUGFnZTo6aXNDb250ZW50RWRpdGFibGUoKSBjb25zdAotewotICAg
IHJldHVybiBkLT5wYWdlLT5pc0VkaXRhYmxlKCk7Ci19Ci0KLS8qIQotICAgIFxwcm9wZXJ0eSBR
V2ViUGFnZTo6Zm9yd2FyZFVuc3VwcG9ydGVkQ29udGVudAotICAgIFxicmllZiB3aGV0aGVyIFFX
ZWJQYWdlIHNob3VsZCBmb3J3YXJkIHVuc3VwcG9ydGVkIGNvbnRlbnQKLQotICAgIElmIGVuYWJs
ZWQsIHRoZSB1bnN1cHBvcnRlZENvbnRlbnQoKSBzaWduYWwgaXMgZW1pdHRlZCB3aXRoIGEgbmV0
d29yayByZXBseSB0aGF0Ci0gICAgY2FuIGJlIHVzZWQgdG8gcmVhZCB0aGUgY29udGVudC4KLQot
ICAgIElmIGRpc2FibGVkLCB0aGUgZG93bmxvYWQgb2Ygc3VjaCBjb250ZW50IGlzIGFib3J0ZWQg
aW1tZWRpYXRlbHkuCi0KLSAgICBCeSBkZWZhdWx0IHVuc3VwcG9ydGVkIGNvbnRlbnQgaXMgbm90
IGZvcndhcmRlZC4KLSovCi0KLXZvaWQgUVdlYlBhZ2U6OnNldEZvcndhcmRVbnN1cHBvcnRlZENv
bnRlbnQoYm9vbCBmb3J3YXJkKQotewotICAgIGQtPmZvcndhcmRVbnN1cHBvcnRlZENvbnRlbnQg
PSBmb3J3YXJkOwotfQotCi1ib29sIFFXZWJQYWdlOjpmb3J3YXJkVW5zdXBwb3J0ZWRDb250ZW50
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZC0+Zm9yd2FyZFVuc3VwcG9ydGVkQ29udGVudDsKLX0K
LQotLyohCi0gICAgXHByb3BlcnR5IFFXZWJQYWdlOjpsaW5rRGVsZWdhdGlvblBvbGljeQotICAg
IFxicmllZiBob3cgUVdlYlBhZ2Ugc2hvdWxkIGRlbGVnYXRlIHRoZSBoYW5kbGluZyBvZiBsaW5r
cyB0aHJvdWdoIHRoZQotICAgIGxpbmtDbGlja2VkKCkgc2lnbmFsCi0KLSAgICBUaGUgZGVmYXVs
dCBpcyB0byBkZWxlZ2F0ZSBubyBsaW5rcy4KLSovCi0KLXZvaWQgUVdlYlBhZ2U6OnNldExpbmtE
ZWxlZ2F0aW9uUG9saWN5KExpbmtEZWxlZ2F0aW9uUG9saWN5IHBvbGljeSkKLXsKLSAgICBkLT5s
aW5rUG9saWN5ID0gcG9saWN5OwotfQotCi1RV2ViUGFnZTo6TGlua0RlbGVnYXRpb25Qb2xpY3kg
UVdlYlBhZ2U6OmxpbmtEZWxlZ2F0aW9uUG9saWN5KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZC0+
bGlua1BvbGljeTsKLX0KLQotI2lmbmRlZiBRVF9OT19DT05URVhUTUVOVQotCi1zdGF0aWMgYm9v
bCBoYW5kbGVTY3JvbGxiYXJDb250ZXh0TWVudUV2ZW50KFNjcm9sbGJhciogc2Nyb2xsQmFyLCBR
Q29udGV4dE1lbnVFdmVudCogZXZlbnQpCi17Ci0gICAgaWYgKCFRQXBwbGljYXRpb246OnN0eWxl
KCktPnN0eWxlSGludChRU3R5bGU6OlNIX1Njcm9sbEJhcl9Db250ZXh0TWVudSkpCi0gICAgICAg
IHJldHVybiB0cnVlOwotCi0gICAgYm9vbCBob3Jpem9udGFsID0gKHNjcm9sbEJhci0+b3JpZW50
YXRpb24oKSA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKTsKLQotICAgIFFNZW51IG1lbnU7Ci0gICAg
UUFjdGlvbiogYWN0U2Nyb2xsSGVyZSA9IG1lbnUuYWRkQWN0aW9uKFFDb3JlQXBwbGljYXRpb246
OnRyYW5zbGF0ZSgiUVdlYlBhZ2UiLCAiU2Nyb2xsIGhlcmUiKSk7Ci0gICAgbWVudS5hZGRTZXBh
cmF0b3IoKTsKLQotICAgIFFBY3Rpb24qIGFjdFNjcm9sbFRvcCA9IG1lbnUuYWRkQWN0aW9uKGhv
cml6b250YWwgPyBRQ29yZUFwcGxpY2F0aW9uOjp0cmFuc2xhdGUoIlFXZWJQYWdlIiwgIkxlZnQg
ZWRnZSIpIDogUUNvcmVBcHBsaWNhdGlvbjo6dHJhbnNsYXRlKCJRV2ViUGFnZSIsICJUb3AiKSk7
Ci0gICAgUUFjdGlvbiogYWN0U2Nyb2xsQm90dG9tID0gbWVudS5hZGRBY3Rpb24oaG9yaXpvbnRh
bCA/IFFDb3JlQXBwbGljYXRpb246OnRyYW5zbGF0ZSgiUVdlYlBhZ2UiLCAiUmlnaHQgZWRnZSIp
IDogUUNvcmVBcHBsaWNhdGlvbjo6dHJhbnNsYXRlKCJRV2ViUGFnZSIsICJCb3R0b20iKSk7Ci0g
ICAgbWVudS5hZGRTZXBhcmF0b3IoKTsKLQotICAgIFFBY3Rpb24qIGFjdFBhZ2VVcCA9IG1lbnUu
YWRkQWN0aW9uKGhvcml6b250YWwgPyBRQ29yZUFwcGxpY2F0aW9uOjp0cmFuc2xhdGUoIlFXZWJQ
YWdlIiwgIlBhZ2UgbGVmdCIpIDogUUNvcmVBcHBsaWNhdGlvbjo6dHJhbnNsYXRlKCJRV2ViUGFn
ZSIsICJQYWdlIHVwIikpOwotICAgIFFBY3Rpb24qIGFjdFBhZ2VEb3duID0gbWVudS5hZGRBY3Rp
b24oaG9yaXpvbnRhbCA/IFFDb3JlQXBwbGljYXRpb246OnRyYW5zbGF0ZSgiUVdlYlBhZ2UiLCAi
UGFnZSByaWdodCIpIDogUUNvcmVBcHBsaWNhdGlvbjo6dHJhbnNsYXRlKCJRV2ViUGFnZSIsICJQ
YWdlIGRvd24iKSk7Ci0gICAgbWVudS5hZGRTZXBhcmF0b3IoKTsKLQotICAgIFFBY3Rpb24qIGFj
dFNjcm9sbFVwID0gbWVudS5hZGRBY3Rpb24oaG9yaXpvbnRhbCA/IFFDb3JlQXBwbGljYXRpb246
OnRyYW5zbGF0ZSgiUVdlYlBhZ2UiLCAiU2Nyb2xsIGxlZnQiKSA6IFFDb3JlQXBwbGljYXRpb246
OnRyYW5zbGF0ZSgiUVdlYlBhZ2UiLCAiU2Nyb2xsIHVwIikpOwotICAgIFFBY3Rpb24qIGFjdFNj
cm9sbERvd24gPSBtZW51LmFkZEFjdGlvbihob3Jpem9udGFsID8gUUNvcmVBcHBsaWNhdGlvbjo6
dHJhbnNsYXRlKCJRV2ViUGFnZSIsICJTY3JvbGwgcmlnaHQiKSA6IFFDb3JlQXBwbGljYXRpb246
OnRyYW5zbGF0ZSgiUVdlYlBhZ2UiLCAiU2Nyb2xsIGRvd24iKSk7Ci0KLSAgICBRQWN0aW9uKiBh
Y3Rpb25TZWxlY3RlZCA9IG1lbnUuZXhlYyhldmVudC0+Z2xvYmFsUG9zKCkpOwotCi0gICAgaWYg
KGFjdGlvblNlbGVjdGVkID09IGFjdFNjcm9sbEhlcmUpIHsKLSAgICAgICAgU2Nyb2xsYmFyVGhl
bWUqIHRoZW1lID0gc2Nyb2xsQmFyLT50aGVtZSgpOwotICAgICAgICAvLyBTZXQgdGhlIHByZXNz
ZWQgcG9zaXRpb24gdG8gdGhlIG1pZGRsZSBvZiB0aGUgdGh1bWIgc28gdGhhdCB3aGVuIHdlCi0g
ICAgICAgIC8vIGRvIG1vdmUsIHRoZSBkZWx0YSB3aWxsIGJlIGZyb20gdGhlIGN1cnJlbnQgcGl4
ZWwgcG9zaXRpb24gb2YgdGhlCi0gICAgICAgIC8vIHRodW1iIHRvIHRoZSBuZXcgcG9zaXRpb24K
LSAgICAgICAgaW50IHBvc2l0aW9uID0gdGhlbWUtPnRyYWNrUG9zaXRpb24oc2Nyb2xsQmFyKSAr
IHRoZW1lLT50aHVtYlBvc2l0aW9uKHNjcm9sbEJhcikgKyB0aGVtZS0+dGh1bWJMZW5ndGgoc2Ny
b2xsQmFyKSAvIDI7Ci0gICAgICAgIHNjcm9sbEJhci0+c2V0UHJlc3NlZFBvcyhwb3NpdGlvbik7
Ci0gICAgICAgIGNvbnN0IFFQb2ludCBwb3MgPSBzY3JvbGxCYXItPmNvbnZlcnRGcm9tQ29udGFp
bmluZ1dpbmRvdyhldmVudC0+cG9zKCkpOwotICAgICAgICBzY3JvbGxCYXItPm1vdmVUaHVtYiho
b3Jpem9udGFsID8gcG9zLngoKSA6IHBvcy55KCkpOwotICAgIH0gZWxzZSBpZiAoYWN0aW9uU2Vs
ZWN0ZWQgPT0gYWN0U2Nyb2xsVG9wKQotICAgICAgICBzY3JvbGxCYXItPnNjcm9sbGFibGVBcmVh
KCktPnNjcm9sbChob3Jpem9udGFsID8gU2Nyb2xsTGVmdCA6IFNjcm9sbFVwLCBTY3JvbGxCeURv
Y3VtZW50KTsKLSAgICBlbHNlIGlmIChhY3Rpb25TZWxlY3RlZCA9PSBhY3RTY3JvbGxCb3R0b20p
Ci0gICAgICAgIHNjcm9sbEJhci0+c2Nyb2xsYWJsZUFyZWEoKS0+c2Nyb2xsKGhvcml6b250YWwg
PyBTY3JvbGxSaWdodCA6IFNjcm9sbERvd24sIFNjcm9sbEJ5RG9jdW1lbnQpOwotICAgIGVsc2Ug
aWYgKGFjdGlvblNlbGVjdGVkID09IGFjdFBhZ2VVcCkKLSAgICAgICAgc2Nyb2xsQmFyLT5zY3Jv
bGxhYmxlQXJlYSgpLT5zY3JvbGwoaG9yaXpvbnRhbCA/IFNjcm9sbExlZnQgOiBTY3JvbGxVcCwg
U2Nyb2xsQnlQYWdlKTsKLSAgICBlbHNlIGlmIChhY3Rpb25TZWxlY3RlZCA9PSBhY3RQYWdlRG93
bikKLSAgICAgICAgc2Nyb2xsQmFyLT5zY3JvbGxhYmxlQXJlYSgpLT5zY3JvbGwoaG9yaXpvbnRh
bCA/IFNjcm9sbFJpZ2h0IDogU2Nyb2xsRG93biwgU2Nyb2xsQnlQYWdlKTsKLSAgICBlbHNlIGlm
IChhY3Rpb25TZWxlY3RlZCA9PSBhY3RTY3JvbGxVcCkKLSAgICAgICAgc2Nyb2xsQmFyLT5zY3Jv
bGxhYmxlQXJlYSgpLT5zY3JvbGwoaG9yaXpvbnRhbCA/IFNjcm9sbExlZnQgOiBTY3JvbGxVcCwg
U2Nyb2xsQnlMaW5lKTsKLSAgICBlbHNlIGlmIChhY3Rpb25TZWxlY3RlZCA9PSBhY3RTY3JvbGxE
b3duKQotICAgICAgICBzY3JvbGxCYXItPnNjcm9sbGFibGVBcmVhKCktPnNjcm9sbChob3Jpem9u
dGFsID8gU2Nyb2xsUmlnaHQgOiBTY3JvbGxEb3duLCBTY3JvbGxCeUxpbmUpOwotICAgIHJldHVy
biB0cnVlOwotfQotCi0vKiEKLSAgICBGaWx0ZXJzIHRoZSBjb250ZXh0IG1lbnUgZXZlbnQsIFxh
IGV2ZW50LCB0aHJvdWdoIGhhbmRsZXJzIGZvciBzY3JvbGxiYXJzIGFuZAotICAgIGN1c3RvbSBl
dmVudCBoYW5kbGVycyBpbiB0aGUgd2ViIHBhZ2UuIFJldHVybnMgdHJ1ZSBpZiB0aGUgZXZlbnQg
d2FzIGhhbmRsZWQ7Ci0gICAgb3RoZXJ3aXNlIGZhbHNlLgotCi0gICAgQSB3ZWIgcGFnZSBtYXkg
c3dhbGxvdyBhIGNvbnRleHQgbWVudSBldmVudCB0aHJvdWdoIGEgY3VzdG9tIGV2ZW50IGhhbmRs
ZXIsIGFsbG93aW5nIGZvciBjb250ZXh0Ci0gICAgbWVudXMgdG8gYmUgaW1wbGVtZW50ZWQgaW4g
SFRNTC9KYXZhU2NyaXB0LiBUaGlzIGlzIHVzZWQgYnkgXGx7aHR0cDovL21hcHMuZ29vZ2xlLmNv
bS99e0dvb2dsZQotICAgIE1hcHN9LCBmb3IgZXhhbXBsZS4KLSovCi1ib29sIFFXZWJQYWdlOjpz
d2FsbG93Q29udGV4dE1lbnVFdmVudChRQ29udGV4dE1lbnVFdmVudCAqZXZlbnQpCi17Ci0gICAg
ZC0+cGFnZS0+Y29udGV4dE1lbnVDb250cm9sbGVyKCktPmNsZWFyQ29udGV4dE1lbnUoKTsKLQot
ICAgIGlmIChRV2ViRnJhbWUqIHdlYkZyYW1lID0gZnJhbWVBdChldmVudC0+cG9zKCkpKSB7Ci0g
ICAgICAgIEZyYW1lKiBmcmFtZSA9IFFXZWJGcmFtZVByaXZhdGU6OmNvcmUod2ViRnJhbWUpOwot
ICAgICAgICBpZiAoU2Nyb2xsYmFyKiBzY3JvbGxiYXIgPSBmcmFtZS0+dmlldygpLT5zY3JvbGxi
YXJBdFBvaW50KGNvbnZlcnRNb3VzZUV2ZW50KGV2ZW50LCAxKS5wb3NpdGlvbigpKSkKLSAgICAg
ICAgICAgIHJldHVybiBoYW5kbGVTY3JvbGxiYXJDb250ZXh0TWVudUV2ZW50KHNjcm9sbGJhciwg
ZXZlbnQpOwotICAgIH0KLQotICAgIFdlYkNvcmU6OkZyYW1lKiBmb2N1c2VkRnJhbWUgPSBkLT5w
YWdlLT5mb2N1c0NvbnRyb2xsZXIoKS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCk7Ci0gICAgZm9jdXNl
ZEZyYW1lLT5ldmVudEhhbmRsZXIoKS0+c2VuZENvbnRleHRNZW51RXZlbnQoY29udmVydE1vdXNl
RXZlbnQoZXZlbnQsIDEpKTsKLSAgICBDb250ZXh0TWVudSAqbWVudSA9IGQtPnBhZ2UtPmNvbnRl
eHRNZW51Q29udHJvbGxlcigpLT5jb250ZXh0TWVudSgpOwotICAgIC8vIElmIHRoZSB3ZWJzaXRl
IGRlZmluZXMgaXRzIG93biBoYW5kbGVyIHRoZW4gc2VuZENvbnRleHRNZW51RXZlbnQgdGFrZXMg
Y2FyZSBvZgotICAgIC8vIGNhbGxpbmcvc2hvd2luZyBpdCBhbmQgdGhlIGNvbnRleHQgbWVudSBw
b2ludGVyIHdpbGwgYmUgemVyby4gVGhpcyBpcyB0aGUgY2FzZQotICAgIC8vIG9uIG1hcHMuZ29v
Z2xlLmNvbSBmb3IgZXhhbXBsZS4KLQotICAgIHJldHVybiAhbWVudTsKLX0KLSNlbmRpZiAvLyBR
VF9OT19DT05URVhUTUVOVQotCi0vKiEKLSAgICBVcGRhdGVzIHRoZSBwYWdlJ3MgYWN0aW9ucyBk
ZXBlbmRpbmcgb24gdGhlIHBvc2l0aW9uIFxhIHBvcy4gRm9yIGV4YW1wbGUgaWYgXGEgcG9zIGlz
IG92ZXIgYW4gaW1hZ2UKLSAgICBlbGVtZW50IHRoZSBDb3B5SW1hZ2VUb0NsaXBib2FyZCBhY3Rp
b24gaXMgZW5hYmxlZC4KLSovCi12b2lkIFFXZWJQYWdlOjp1cGRhdGVQb3NpdGlvbkRlcGVuZGVu
dEFjdGlvbnMoY29uc3QgUVBvaW50ICZwb3MpCi17Ci0jaWZuZGVmIFFUX05PX0FDVElPTgotICAg
IC8vIEZpcnN0IHdlIGRpc2FibGUgYWxsIGFjdGlvbnMsIGJ1dCBrZWVwIHRyYWNrIG9mIHdoaWNo
IG9uZXMgd2VyZSBvcmlnaW5hbGx5IGVuYWJsZWQuCi0gICAgUUJpdEFycmF5IG9yaWdpbmFsbHlF
bmFibGVkV2ViQWN0aW9ucyhRV2ViUGFnZTo6V2ViQWN0aW9uQ291bnQpOwotICAgIGZvciAoaW50
IGkgPSBDb250ZXh0TWVudUl0ZW1UYWdOb0FjdGlvbjsgaSA8IENvbnRleHRNZW51SXRlbUJhc2VB
cHBsaWNhdGlvblRhZzsgKytpKSB7Ci0gICAgICAgIFFXZWJQYWdlOjpXZWJBY3Rpb24gYWN0aW9u
ID0gd2ViQWN0aW9uRm9yQ29udGV4dE1lbnVBY3Rpb24oV2ViQ29yZTo6Q29udGV4dE1lbnVBY3Rp
b24oaSkpOwotICAgICAgICBpZiAoUUFjdGlvbiAqYSA9IHRoaXMtPmFjdGlvbihhY3Rpb24pKSB7
Ci0gICAgICAgICAgICBvcmlnaW5hbGx5RW5hYmxlZFdlYkFjdGlvbnMuc2V0Qml0KGFjdGlvbiwg
YS0+aXNFbmFibGVkKCkpOwotICAgICAgICAgICAgYS0+c2V0RW5hYmxlZChmYWxzZSk7Ci0gICAg
ICAgIH0KLSAgICB9Ci0jZW5kaWYgLy8gUVRfTk9fQUNUSU9OCi0KLSAgICBkLT5jcmVhdGVNYWlu
RnJhbWUoKTsKLSAgICBXZWJDb3JlOjpGcmFtZSogZm9jdXNlZEZyYW1lID0gZC0+cGFnZS0+Zm9j
dXNDb250cm9sbGVyKCktPmZvY3VzZWRPck1haW5GcmFtZSgpOwotCi0gICAgSGl0VGVzdFJlc3Vs
dCByZXN1bHQgPSBmb2N1c2VkRnJhbWUtPmV2ZW50SGFuZGxlcigpLT5oaXRUZXN0UmVzdWx0QXRQ
b2ludChmb2N1c2VkRnJhbWUtPnZpZXcoKS0+d2luZG93VG9Db250ZW50cyhwb3MpLCAvKmFsbG93
U2hhZG93Q29udGVudCovIGZhbHNlKTsKLSAgICBpZiAocmVzdWx0LnNjcm9sbGJhcigpKQotICAg
ICAgICBkLT5oaXRUZXN0UmVzdWx0ID0gUVdlYkhpdFRlc3RSZXN1bHQoKTsKLSAgICBlbHNlCi0g
ICAgICAgIGQtPmhpdFRlc3RSZXN1bHQgPSBRV2ViSGl0VGVzdFJlc3VsdChuZXcgUVdlYkhpdFRl
c3RSZXN1bHRQcml2YXRlKHJlc3VsdCkpOwotICAgIGQtPnBhZ2UtPmNvbnRleHRNZW51Q29udHJv
bGxlcigpLT5zZXRIaXRUZXN0UmVzdWx0KHJlc3VsdCk7Ci0KLSNpZiBFTkFCTEUoSU5TUEVDVE9S
KQotICAgIGlmIChkLT5wYWdlLT5pbnNwZWN0b3JDb250cm9sbGVyKCktPmVuYWJsZWQoKSkKLSAg
ICAgICAgZC0+cGFnZS0+Y29udGV4dE1lbnVDb250cm9sbGVyKCktPmFkZEluc3BlY3RFbGVtZW50
SXRlbSgpOwotI2VuZGlmCi0KLSAgICBRQml0QXJyYXkgdmlzaXRlZFdlYkFjdGlvbnMoUVdlYlBh
Z2U6OldlYkFjdGlvbkNvdW50KTsKLQotI2lmbmRlZiBRVF9OT19DT05URVhUTUVOVQotICAgIGRl
bGV0ZSBkLT5jdXJyZW50Q29udGV4dE1lbnUuZGF0YSgpOwotCi0gICAgLy8gVGhlbiB3ZSBsZXQg
Y3JlYXRlQ29udGV4dE1lbnUoKSBlbmFibGUgdGhlIGFjdGlvbnMgdGhhdCBhcmUgcHV0IGludG8g
dGhlIG1lbnUKLSAgICBkLT5jdXJyZW50Q29udGV4dE1lbnUgPSBkLT5jcmVhdGVDb250ZXh0TWVu
dShkLT5wYWdlLT5jb250ZXh0TWVudUNvbnRyb2xsZXIoKS0+Y29udGV4dE1lbnUoKSwgZC0+cGFn
ZS0+Y29udGV4dE1lbnVDb250cm9sbGVyKCktPmNvbnRleHRNZW51KCktPnBsYXRmb3JtRGVzY3Jp
cHRpb24oKSwgJnZpc2l0ZWRXZWJBY3Rpb25zKTsKLSNlbmRpZiAvLyBRVF9OT19DT05URVhUTUVO
VQotCi0jaWZuZGVmIFFUX05PX0FDVElPTgotICAgIC8vIEZpbmFsbHksIHdlIHJlc3RvcmUgdGhl
IG9yaWdpbmFsIGVuYWJsZW1lbnQgZm9yIHRoZSBhY3Rpb25zIHRoYXQgd2VyZSBub3QgcHV0IGlu
dG8gdGhlIG1lbnUuCi0gICAgb3JpZ2luYWxseUVuYWJsZWRXZWJBY3Rpb25zICY9IH52aXNpdGVk
V2ViQWN0aW9uczsgLy8gTWFzayBvdXQgdmlzaXRlZCBhY3Rpb25zICh0aGV5J3JlIHBhcnQgb2Yg
dGhlIG1lbnUpCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBRV2ViUGFnZTo6V2ViQWN0aW9uQ291
bnQ7ICsraSkgewotICAgICAgICBpZiAob3JpZ2luYWxseUVuYWJsZWRXZWJBY3Rpb25zLmF0KGkp
KSB7Ci0gICAgICAgICAgICBpZiAoUUFjdGlvbiAqYSA9IHRoaXMtPmFjdGlvbihRV2ViUGFnZTo6
V2ViQWN0aW9uKGkpKSkKLSAgICAgICAgICAgICAgICBhLT5zZXRFbmFibGVkKHRydWUpOwotICAg
ICAgICB9Ci0gICAgfQotI2VuZGlmIC8vIFFUX05PX0FDVElPTgotCi0gICAgLy8gVGhpcyB3aG9s
ZSBwcm9jZXNzIGVuc3VyZXMgdGhhdCBhbnkgYWN0aW9ucyBwdXQgaW50byB0byB0aGUgY29udGV4
dCBtZW51IGhhcyB0aGUgcmlnaHQKLSAgICAvLyBlbmFibGVtZW50LCB3aGlsZSBhbHNvIGtlZXBp
bmcgdGhlIGNvcnJlY3QgZW5hYmxlbWVudCBmb3IgYWN0aW9ucyB0aGF0IHdlcmUgbGVmdCBvdXQg
b2YKLSAgICAvLyB0aGUgbWVudS4KLQotfQotCi0KLQotLyohCi0gICAgXGVudW0gUVdlYlBhZ2U6
OkV4dGVuc2lvbgotCi0gICAgVGhpcyBlbnVtIGRlc2NyaWJlcyB0aGUgdHlwZXMgb2YgZXh0ZW5z
aW9ucyB0aGF0IHRoZSBwYWdlIGNhbiBzdXBwb3J0LiBCZWZvcmUgdXNpbmcgdGhlc2UgZXh0ZW5z
aW9ucywgeW91Ci0gICAgc2hvdWxkIHZlcmlmeSB0aGF0IHRoZSBleHRlbnNpb24gaXMgc3VwcG9y
dGVkIGJ5IGNhbGxpbmcgc3VwcG9ydHNFeHRlbnNpb24oKS4KLQotICAgIFx2YWx1ZSBDaG9vc2VN
dWx0aXBsZUZpbGVzRXh0ZW5zaW9uIFdoZXRoZXIgdGhlIHdlYiBwYWdlIHN1cHBvcnRzIG11bHRp
cGxlIGZpbGUgc2VsZWN0aW9uLgotICAgIFRoaXMgZXh0ZW5zaW9uIGlzIGludm9rZWQgd2hlbiB0
aGUgd2ViIGNvbnRlbnQgcmVxdWVzdHMgb25lIG9yIG1vcmUgZmlsZSBuYW1lcywgZm9yIGV4YW1w
bGUKLSAgICBhcyBhIHJlc3VsdCBvZiB0aGUgdXNlciBjbGlja2luZyBvbiBhICJmaWxlIHVwbG9h
ZCIgYnV0dG9uIGluIGEgSFRNTCBmb3JtIHdoZXJlIG11bHRpcGxlCi0gICAgZmlsZSBzZWxlY3Rp
b24gaXMgYWxsb3dlZC4KLQotICAgIFx2YWx1ZSBFcnJvclBhZ2VFeHRlbnNpb24gV2hldGhlciB0
aGUgd2ViIHBhZ2UgY2FuIHByb3ZpZGUgYW4gZXJyb3IgcGFnZSB3aGVuIGxvYWRpbmcgZmFpbHMu
Ci0gICAgKGludHJvZHVjZWQgaW4gUXQgNC42KQotCi0gICAgXHNhIENob29zZU11bHRpcGxlRmls
ZXNFeHRlbnNpb25PcHRpb24sIENob29zZU11bHRpcGxlRmlsZXNFeHRlbnNpb25SZXR1cm4sIEVy
cm9yUGFnZUV4dGVuc2lvbk9wdGlvbiwgRXJyb3JQYWdlRXh0ZW5zaW9uUmV0dXJuCi0qLwotCi0v
KiEKLSAgICBcZW51bSBRV2ViUGFnZTo6RXJyb3JEb21haW4KLSAgICBcc2luY2UgNC42Ci0KLSAg
ICBUaGlzIGVudW0gZGVzY3JpYmVzIHRoZSBkb21haW4gb2YgYW4gRXJyb3JQYWdlRXh0ZW5zaW9u
T3B0aW9uIG9iamVjdCAoaS5lLiB0aGUgbGF5ZXIgaW4gd2hpY2ggdGhlIGVycm9yIG9jY3VycmVk
KS4KLQotICAgIFx2YWx1ZSBRdE5ldHdvcmsgVGhlIGVycm9yIG9jY3VycmVkIGluIHRoZSBRdE5l
dHdvcmsgbGF5ZXI7IHRoZSBlcnJvciBjb2RlIGlzIG9mIHR5cGUgUU5ldHdvcmtSZXBseTo6TmV0
d29ya0Vycm9yLgotICAgIFx2YWx1ZSBIdHRwIFRoZSBlcnJvciBvY2N1cnJlZCBpbiB0aGUgSFRU
UCBsYXllcjsgdGhlIGVycm9yIGNvZGUgaXMgYSBIVFRQIHN0YXR1cyBjb2RlIChzZWUgUU5ldHdv
cmtSZXF1ZXN0OjpIdHRwU3RhdHVzQ29kZUF0dHJpYnV0ZSkuCi0gICAgXHZhbHVlIFdlYktpdCBU
aGUgZXJyb3IgaXMgYW4gaW50ZXJuYWwgV2ViS2l0IGVycm9yLgotKi8KLQotLyohCi0gICAgXGNs
YXNzIFFXZWJQYWdlOjpFeHRlbnNpb25PcHRpb24KLSAgICBcc2luY2UgNC40Ci0gICAgXGJyaWVm
IFRoZSBFeHRlbnNpb25PcHRpb24gY2xhc3MgcHJvdmlkZXMgYW4gZXh0ZW5kZWQgaW5wdXQgYXJn
dW1lbnQgdG8gUVdlYlBhZ2UncyBleHRlbnNpb24gc3VwcG9ydC4KLQotICAgIFxpbm1vZHVsZSBR
dFdlYktpdAotCi0gICAgXHNhIFFXZWJQYWdlOjpleHRlbnNpb24oKSwgUVdlYlBhZ2U6OkV4dGVu
c2lvblJldHVybgotKi8KLQotCi0vKiEKLSAgICBcY2xhc3MgUVdlYlBhZ2U6OkV4dGVuc2lvblJl
dHVybgotICAgIFxzaW5jZSA0LjQKLSAgICBcYnJpZWYgVGhlIEV4dGVuc2lvblJldHVybiBjbGFz
cyBwcm92aWRlcyBhbiBvdXRwdXQgcmVzdWx0IGZyb20gYSBRV2ViUGFnZSdzIGV4dGVuc2lvbi4K
LQotICAgIFxpbm1vZHVsZSBRdFdlYktpdAotCi0gICAgXHNhIFFXZWJQYWdlOjpleHRlbnNpb24o
KSwgUVdlYlBhZ2U6OkV4dGVuc2lvbk9wdGlvbgotKi8KLQotLyohCi0gICAgXGNsYXNzIFFXZWJQ
YWdlOjpFcnJvclBhZ2VFeHRlbnNpb25PcHRpb24KLSAgICBcc2luY2UgNC42Ci0gICAgXGJyaWVm
IFRoZSBFcnJvclBhZ2VFeHRlbnNpb25PcHRpb24gY2xhc3MgZGVzY3JpYmVzIHRoZSBvcHRpb24K
LSAgICBmb3IgdGhlIGVycm9yIHBhZ2UgZXh0ZW5zaW9uLgotCi0gICAgXGlubW9kdWxlIFF0V2Vi
S2l0Ci0KLSAgICBUaGUgRXJyb3JQYWdlRXh0ZW5zaW9uT3B0aW9uIGNsYXNzIGhvbGRzIHRoZSBc
YSB1cmwgZm9yIHdoaWNoIGFuIGVycm9yIG9jY3VycmVkIGFzIHdlbGwgYXMKLSAgICB0aGUgYXNz
b2NpYXRlZCBcYSBmcmFtZS4KLQotICAgIFRoZSBlcnJvciBpdHNlbGYgaXMgcmVwb3J0ZWQgYnkg
YW4gZXJyb3IgXGEgZG9tYWluLCB0aGUgXGEgZXJyb3IgY29kZSBhcyB3ZWxsIGFzIFxhIGVycm9y
U3RyaW5nLgotCi0gICAgXHNhIFFXZWJQYWdlOjpleHRlbnNpb24oKSwgUVdlYlBhZ2U6OkVycm9y
UGFnZUV4dGVuc2lvblJldHVybgotKi8KLQotLyohCi0gICAgXHZhcmlhYmxlIFFXZWJQYWdlOjpF
cnJvclBhZ2VFeHRlbnNpb25PcHRpb246OnVybAotICAgIFxicmllZiB0aGUgdXJsIGZvciB3aGlj
aCBhbiBlcnJvciBvY2N1cnJlZAotKi8KLQotLyohCi0gICAgXHZhcmlhYmxlIFFXZWJQYWdlOjpF
cnJvclBhZ2VFeHRlbnNpb25PcHRpb246OmZyYW1lCi0gICAgXGJyaWVmIHRoZSBmcmFtZSBhc3Nv
Y2lhdGVkIHdpdGggdGhlIGVycm9yCi0qLwotCi0vKiEKLSAgICBcdmFyaWFibGUgUVdlYlBhZ2U6
OkVycm9yUGFnZUV4dGVuc2lvbk9wdGlvbjo6ZG9tYWluCi0gICAgXGJyaWVmIHRoZSBkb21haW4g
dGhhdCByZXBvcnRlZCB0aGUgZXJyb3IKLSovCi0KLS8qIQotICAgIFx2YXJpYWJsZSBRV2ViUGFn
ZTo6RXJyb3JQYWdlRXh0ZW5zaW9uT3B0aW9uOjplcnJvcgotICAgIFxicmllZiB0aGUgZXJyb3Ig
Y29kZS4gSW50ZXJwcmV0YXRpb24gb2YgdGhlIHZhbHVlIGRlcGVuZHMgb24gdGhlIFxhIGRvbWFp
bgotICAgIFxzYSBRV2ViUGFnZTo6RXJyb3JEb21haW4KLSovCi0KLS8qIQotICAgIFx2YXJpYWJs
ZSBRV2ViUGFnZTo6RXJyb3JQYWdlRXh0ZW5zaW9uT3B0aW9uOjplcnJvclN0cmluZwotICAgIFxi
cmllZiBhIHN0cmluZyB0aGF0IGRlc2NyaWJlcyB0aGUgZXJyb3IKLSovCi0KLS8qIQotICAgIFxj
bGFzcyBRV2ViUGFnZTo6RXJyb3JQYWdlRXh0ZW5zaW9uUmV0dXJuCi0gICAgXHNpbmNlIDQuNgot
ICAgIFxicmllZiBUaGUgRXJyb3JQYWdlRXh0ZW5zaW9uUmV0dXJuIGRlc2NyaWJlcyB0aGUgZXJy
b3IgcGFnZSwgd2hpY2ggd2lsbCBiZSBzaG93biBmb3IgdGhlCi0gICAgZnJhbWUgZm9yIHdoaWNo
IHRoZSBlcnJvciBvY2N1cmVkLgotCi0gICAgXGlubW9kdWxlIFF0V2ViS2l0Ci0KLSAgICBUaGUg
RXJyb3JQYWdlRXh0ZW5zaW9uUmV0dXJuIGNsYXNzIGhvbGRzIHRoZSBkYXRhIG5lZWRlZCBmb3Ig
Y3JlYXRpbmcgYW4gZXJyb3IgcGFnZS4gU29tZSBhcmUKLSAgICBvcHRpb25hbCBzdWNoIGFzIFxh
IGNvbnRlbnRUeXBlLCB3aGljaCBkZWZhdWx0cyB0byAidGV4dC9odG1sIiwgYXMgd2VsbCBhcyB0
aGUgXGEgZW5jb2RpbmcsIHdoaWNoCi0gICAgaXMgYXNzdW1lZCB0byBiZSBVVEYtOCBpZiBub3Qg
aW5kaWNhdGVkIG90aGVyd2lzZS4KLQotICAgIFRoZSBlcnJvciBwYWdlIGlzIHN0b3JlZCBpbiB0
aGUgXGEgY29udGVudCBieXRlIGFycmF5LCBhcyBIVE1MIGNvbnRlbnQuIEluIG9yZGVyIHRvIGNv
bnZlcnQgYQotICAgIFFTdHJpbmcgdG8gYSBieXRlIGFycmF5LCB0aGUgUVN0cmluZzo6dG9VdGY4
KCkgbWV0aG9kIGNhbiBiZSB1c2VkLgotCi0gICAgRXh0ZXJuYWwgb2JqZWN0cyBzdWNoIGFzIHN0
eWxlc2hlZXRzIG9yIGltYWdlcyByZWZlcmVuY2VkIGluIHRoZSBIVE1MIGFyZSBsb2NhdGVkIHJl
bGF0aXZlIHRvCi0gICAgXGEgYmFzZVVybC4KLQotICAgIFxzYSBRV2ViUGFnZTo6ZXh0ZW5zaW9u
KCksIFFXZWJQYWdlOjpFcnJvclBhZ2VFeHRlbnNpb25PcHRpb24sIFFTdHJpbmc6OnRvVXRmOCgp
Ci0qLwotCi0vKiEKLSAgICBcZm4gUVdlYlBhZ2U6OkVycm9yUGFnZUV4dGVuc2lvblJldHVybjo6
RXJyb3JQYWdlRXh0ZW5zaW9uUmV0dXJuKCkKLQotICAgIENvbnN0cnVjdHMgYSBuZXcgZXJyb3Ig
cGFnZSBvYmplY3QuCi0qLwotCi0KLS8qIQotICAgIFx2YXJpYWJsZSBRV2ViUGFnZTo6RXJyb3JQ
YWdlRXh0ZW5zaW9uUmV0dXJuOjpjb250ZW50VHlwZQotICAgIFxicmllZiB0aGUgZXJyb3IgcGFn
ZSdzIGNvbnRlbnQgdHlwZQotKi8KLQotLyohCi0gICAgXHZhcmlhYmxlIFFXZWJQYWdlOjpFcnJv
clBhZ2VFeHRlbnNpb25SZXR1cm46OmVuY29kaW5nCi0gICAgXGJyaWVmIHRoZSBlcnJvciBwYWdl
IGVuY29kaW5nCi0qLwotCi0vKiEKLSAgICBcdmFyaWFibGUgUVdlYlBhZ2U6OkVycm9yUGFnZUV4
dGVuc2lvblJldHVybjo6YmFzZVVybAotICAgIFxicmllZiB0aGUgYmFzZSB1cmwKLQotICAgIEV4
dGVybmFsIG9iamVjdHMgc3VjaCBhcyBzdHlsZXNoZWV0cyBvciBpbWFnZXMgcmVmZXJlbmNlZCBp
biB0aGUgSFRNTCBhcmUgbG9jYXRlZCByZWxhdGl2ZSB0byB0aGlzIHVybC4KLSovCi0KLS8qIQot
ICAgIFx2YXJpYWJsZSBRV2ViUGFnZTo6RXJyb3JQYWdlRXh0ZW5zaW9uUmV0dXJuOjpjb250ZW50
Ci0gICAgXGJyaWVmIHRoZSBIVE1MIGNvbnRlbnQgb2YgdGhlIGVycm9yIHBhZ2UKLSovCi0KLS8q
IQotICAgIFxjbGFzcyBRV2ViUGFnZTo6Q2hvb3NlTXVsdGlwbGVGaWxlc0V4dGVuc2lvbk9wdGlv
bgotICAgIFxzaW5jZSA0LjUKLSAgICBcYnJpZWYgVGhlIENob29zZU11bHRpcGxlRmlsZXNFeHRl
bnNpb25PcHRpb24gY2xhc3MgZGVzY3JpYmVzIHRoZSBvcHRpb24KLSAgICBmb3IgdGhlIG11bHRp
cGxlIGZpbGVzIHNlbGVjdGlvbiBleHRlbnNpb24uCi0KLSAgICBcaW5tb2R1bGUgUXRXZWJLaXQK
LQotICAgIFRoZSBDaG9vc2VNdWx0aXBsZUZpbGVzRXh0ZW5zaW9uT3B0aW9uIGNsYXNzIGhvbGRz
IHRoZSBmcmFtZSBvcmlnaW5hdGluZyB0aGUgcmVxdWVzdAotICAgIGFuZCB0aGUgc3VnZ2VzdGVk
IGZpbGVuYW1lcyB3aGljaCBtaWdodCBiZSBwcm92aWRlZC4KLQotICAgIFxzYSBRV2ViUGFnZTo6
ZXh0ZW5zaW9uKCksIFFXZWJQYWdlOjpjaG9vc2VGaWxlKCksIFFXZWJQYWdlOjpDaG9vc2VNdWx0
aXBsZUZpbGVzRXh0ZW5zaW9uUmV0dXJuCi0qLwotCi0vKiEKLSAgICBcdmFyaWFibGUgUVdlYlBh
Z2U6OkNob29zZU11bHRpcGxlRmlsZXNFeHRlbnNpb25PcHRpb246OnBhcmVudEZyYW1lCi0gICAg
XGJyaWVmIFRoZSBmcmFtZSBpbiB3aGljaCB0aGUgcmVxdWVzdCBvcmlnaW5hdGVkCi0qLwotCi0v
KiEKLSAgICBcdmFyaWFibGUgUVdlYlBhZ2U6OkNob29zZU11bHRpcGxlRmlsZXNFeHRlbnNpb25P
cHRpb246OnN1Z2dlc3RlZEZpbGVOYW1lcwotICAgIFxicmllZiBUaGUgc3VnZ2VzdGVkIGZpbGVu
YW1lcwotKi8KLQotLyohCi0gICAgXHZhcmlhYmxlIFFXZWJQYWdlOjpDaG9vc2VNdWx0aXBsZUZp
bGVzRXh0ZW5zaW9uUmV0dXJuOjpmaWxlTmFtZXMKLSAgICBcYnJpZWYgVGhlIHNlbGVjdGVkIGZp
bGVuYW1lcwotKi8KLQotLyohCi0gICAgXGNsYXNzIFFXZWJQYWdlOjpDaG9vc2VNdWx0aXBsZUZp
bGVzRXh0ZW5zaW9uUmV0dXJuCi0gICAgXHNpbmNlIDQuNQotICAgIFxicmllZiBUaGUgQ2hvb3Nl
TXVsdGlwbGVGaWxlc0V4dGVuc2lvblJldHVybiBkZXNjcmliZXMgdGhlIHJldHVybiB2YWx1ZQot
ICAgIGZvciB0aGUgbXVsdGlwbGUgZmlsZXMgc2VsZWN0aW9uIGV4dGVuc2lvbi4KLQotICAgIFxp
bm1vZHVsZSBRdFdlYktpdAotCi0gICAgVGhlIENob29zZU11bHRpcGxlRmlsZXNFeHRlbnNpb25S
ZXR1cm4gY2xhc3MgaG9sZHMgdGhlIGZpbGVuYW1lcyBzZWxlY3RlZCBieSB0aGUgdXNlcgotICAg
IHdoZW4gdGhlIGV4dGVuc2lvbiBpcyBpbnZva2VkLgotCi0gICAgXHNhIFFXZWJQYWdlOjpleHRl
bnNpb24oKSwgUVdlYlBhZ2U6OkNob29zZU11bHRpcGxlRmlsZXNFeHRlbnNpb25PcHRpb24KLSov
Ci0KLS8qIQotICAgIFRoaXMgdmlydHVhbCBmdW5jdGlvbiBjYW4gYmUgcmVpbXBsZW1lbnRlZCBp
biBhIFFXZWJQYWdlIHN1YmNsYXNzIHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgZXh0ZW5zaW9ucy4g
VGhlIFxhIG9wdGlvbgotICAgIGFyZ3VtZW50IGlzIHByb3ZpZGVkIGFzIGlucHV0IHRvIHRoZSBl
eHRlbnNpb247IHRoZSBvdXRwdXQgcmVzdWx0cyBjYW4gYmUgc3RvcmVkIGluIFxhIG91dHB1dC4K
LQotICAgIFRoZSBiZWhhdmlvciBvZiB0aGlzIGZ1bmN0aW9uIGlzIGRldGVybWluZWQgYnkgXGEg
ZXh0ZW5zaW9uLiBUaGUgXGEgb3B0aW9uCi0gICAgYW5kIFxhIG91dHB1dCB2YWx1ZXMgYXJlIHR5
cGljYWxseSBjYXN0ZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdHlwZXMgKGZvcgotICAgIGV4YW1w
bGUsIENob29zZU11bHRpcGxlRmlsZXNFeHRlbnNpb25PcHRpb24gYW5kCi0gICAgQ2hvb3NlTXVs
dGlwbGVGaWxlc0V4dGVuc2lvblJldHVybiBmb3IgQ2hvb3NlTXVsdGlwbGVGaWxlc0V4dGVuc2lv
bikuCi0KLSAgICBZb3UgY2FuIGNhbGwgc3VwcG9ydHNFeHRlbnNpb24oKSB0byBjaGVjayBpZiBh
biBleHRlbnNpb24gaXMgc3VwcG9ydGVkIGJ5IHRoZSBwYWdlLgotCi0gICAgUmV0dXJucyB0cnVl
IGlmIHRoZSBleHRlbnNpb24gd2FzIGNhbGxlZCBzdWNjZXNzZnVsbHk7IG90aGVyd2lzZSByZXR1
cm5zIGZhbHNlLgotCi0gICAgXHNhIHN1cHBvcnRzRXh0ZW5zaW9uKCksIEV4dGVuc2lvbgotKi8K
LWJvb2wgUVdlYlBhZ2U6OmV4dGVuc2lvbihFeHRlbnNpb24gZXh0ZW5zaW9uLCBjb25zdCBFeHRl
bnNpb25PcHRpb24gKm9wdGlvbiwgRXh0ZW5zaW9uUmV0dXJuICpvdXRwdXQpCi17Ci0jaWZuZGVm
IFFUX05PX0ZJTEVESUFMT0cKLSAgICBpZiAoZXh0ZW5zaW9uID09IENob29zZU11bHRpcGxlRmls
ZXNFeHRlbnNpb24pIHsKLSAgICAgICAgLy8gRklYTUU6IGRvIG5vdCBpZ25vcmUgc3VnZ2VzdGVk
RmlsZXMKLSAgICAgICAgUVN0cmluZ0xpc3Qgc3VnZ2VzdGVkRmlsZXMgPSBzdGF0aWNfY2FzdDxj
b25zdCBDaG9vc2VNdWx0aXBsZUZpbGVzRXh0ZW5zaW9uT3B0aW9uKj4ob3B0aW9uKS0+c3VnZ2Vz
dGVkRmlsZU5hbWVzOwotICAgICAgICBRU3RyaW5nTGlzdCBuYW1lcyA9IFFGaWxlRGlhbG9nOjpn
ZXRPcGVuRmlsZU5hbWVzKHZpZXcoKSwgUVN0cmluZzo6bnVsbCk7Ci0gICAgICAgIHN0YXRpY19j
YXN0PENob29zZU11bHRpcGxlRmlsZXNFeHRlbnNpb25SZXR1cm4qPihvdXRwdXQpLT5maWxlTmFt
ZXMgPSBuYW1lczsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBy
ZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIQotICAgIFRoaXMgdmlydHVhbCBmdW5jdGlvbiByZXR1cm5z
IHRydWUgaWYgdGhlIHdlYiBwYWdlIHN1cHBvcnRzIFxhIGV4dGVuc2lvbjsgb3RoZXJ3aXNlIGZh
bHNlIGlzIHJldHVybmVkLgotCi0gICAgXHNhIGV4dGVuc2lvbigpCi0qLwotYm9vbCBRV2ViUGFn
ZTo6c3VwcG9ydHNFeHRlbnNpb24oRXh0ZW5zaW9uIGV4dGVuc2lvbikgY29uc3QKLXsKLSNpZm5k
ZWYgUVRfTk9fRklMRURJQUxPRwotICAgIHJldHVybiBleHRlbnNpb24gPT0gQ2hvb3NlTXVsdGlw
bGVGaWxlc0V4dGVuc2lvbjsKLSNlbHNlCi0gICAgUV9VTlVTRUQoZXh0ZW5zaW9uKTsKLSAgICBy
ZXR1cm4gZmFsc2U7Ci0jZW5kaWYKLX0KLQotLyohCi0gKiBcaW50ZXJuYWwKLSAqLwotUVdlYlBh
Z2VBZGFwdGVyICpRV2ViUGFnZTo6aGFuZGxlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZDsKLX0K
LQotLyohCi0gICAgRmluZHMgdGhlIHNwZWNpZmllZCBzdHJpbmcsIFxhIHN1YlN0cmluZywgaW4g
dGhlIHBhZ2UsIHVzaW5nIHRoZSBnaXZlbiBcYSBvcHRpb25zLgotCi0gICAgSWYgdGhlIEhpZ2hs
aWdodEFsbE9jY3VycmVuY2VzIGZsYWcgaXMgcGFzc2VkLCB0aGUgZnVuY3Rpb24gd2lsbCBoaWdo
bGlnaHQgYWxsIG9jY3VycmVuY2VzCi0gICAgdGhhdCBleGlzdCBpbiB0aGUgcGFnZS4gQWxsIHN1
YnNlcXVlbnQgY2FsbHMgd2lsbCBleHRlbmQgdGhlIGhpZ2hsaWdodCwgcmF0aGVyIHRoYW4KLSAg
ICByZXBsYWNlIGl0LCB3aXRoIG9jY3VycmVuY2VzIG9mIHRoZSBuZXcgc3RyaW5nLgotCi0gICAg
SWYgdGhlIEhpZ2hsaWdodEFsbE9jY3VycmVuY2VzIGZsYWcgaXMgbm90IHBhc3NlZCwgdGhlIGZ1
bmN0aW9uIHdpbGwgc2VsZWN0IGFuIG9jY3VycmVuY2UKLSAgICBhbmQgYWxsIHN1YnNlcXVlbnQg
Y2FsbHMgd2lsbCByZXBsYWNlIHRoZSBjdXJyZW50IG9jY3VycmVuY2Ugd2l0aCB0aGUgbmV4dCBv
bmUuCi0KLSAgICBUbyBjbGVhciB0aGUgc2VsZWN0aW9uLCBqdXN0IHBhc3MgYW4gZW1wdHkgc3Ry
aW5nLgotCi0gICAgUmV0dXJucyB0cnVlIGlmIFxhIHN1YlN0cmluZyB3YXMgZm91bmQ7IG90aGVy
d2lzZSByZXR1cm5zIGZhbHNlLgotKi8KLWJvb2wgUVdlYlBhZ2U6OmZpbmRUZXh0KGNvbnN0IFFT
dHJpbmcgJnN1YlN0cmluZywgRmluZEZsYWdzIG9wdGlvbnMpCi17Ci0gICAgOjpUZXh0Q2FzZVNl
bnNpdGl2aXR5IGNhc2VTZW5zaXRpdml0eSA9IDo6VGV4dENhc2VJbnNlbnNpdGl2ZTsKLSAgICBp
ZiAob3B0aW9ucyAmIEZpbmRDYXNlU2Vuc2l0aXZlbHkpCi0gICAgICAgIGNhc2VTZW5zaXRpdml0
eSA9IDo6VGV4dENhc2VTZW5zaXRpdmU7Ci0KLSAgICBpZiAob3B0aW9ucyAmIEhpZ2hsaWdodEFs
bE9jY3VycmVuY2VzKSB7Ci0gICAgICAgIGlmIChzdWJTdHJpbmcuaXNFbXB0eSgpKSB7Ci0gICAg
ICAgICAgICBkLT5wYWdlLT51bm1hcmtBbGxUZXh0TWF0Y2hlcygpOwotICAgICAgICAgICAgcmV0
dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgcmV0dXJuIGQtPnBhZ2UtPm1h
cmtBbGxNYXRjaGVzRm9yVGV4dChzdWJTdHJpbmcsIGNhc2VTZW5zaXRpdml0eSwgdHJ1ZSwgMCk7
Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKHN1YlN0cmluZy5pc0VtcHR5KCkpIHsKLSAgICAg
ICAgICAgIGQtPnBhZ2UtPm1haW5GcmFtZSgpLT5zZWxlY3Rpb24oKS0+Y2xlYXIoKTsKLSAgICAg
ICAgICAgIEZyYW1lKiBmcmFtZSA9IGQtPnBhZ2UtPm1haW5GcmFtZSgpLT50cmVlKCktPmZpcnN0
Q2hpbGQoKTsKLSAgICAgICAgICAgIHdoaWxlIChmcmFtZSkgewotICAgICAgICAgICAgICAgIGZy
YW1lLT5zZWxlY3Rpb24oKS0+Y2xlYXIoKTsKLSAgICAgICAgICAgICAgICBmcmFtZSA9IGZyYW1l
LT50cmVlKCktPnRyYXZlcnNlTmV4dFdpdGhXcmFwKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAg
ICAgICAgfQotICAgICAgICA6OkZpbmREaXJlY3Rpb24gZGlyZWN0aW9uID0gOjpGaW5kRGlyZWN0
aW9uRm9yd2FyZDsKLSAgICAgICAgaWYgKG9wdGlvbnMgJiBGaW5kQmFja3dhcmQpCi0gICAgICAg
ICAgICBkaXJlY3Rpb24gPSA6OkZpbmREaXJlY3Rpb25CYWNrd2FyZDsKLQotICAgICAgICBjb25z
dCBib29sIHNob3VsZFdyYXAgPSBvcHRpb25zICYgRmluZFdyYXBzQXJvdW5kRG9jdW1lbnQ7Ci0K
LSAgICAgICAgcmV0dXJuIGQtPnBhZ2UtPmZpbmRTdHJpbmcoc3ViU3RyaW5nLCBjYXNlU2Vuc2l0
aXZpdHksIGRpcmVjdGlvbiwgc2hvdWxkV3JhcCk7Ci0gICAgfQotfQotCi0vKiEKLSAgICBSZXR1
cm5zIGEgcG9pbnRlciB0byB0aGUgcGFnZSdzIHNldHRpbmdzIG9iamVjdC4KLQotICAgIFxzYSBR
V2ViU2V0dGluZ3M6Omdsb2JhbFNldHRpbmdzKCkKLSovCi1RV2ViU2V0dGluZ3MgKlFXZWJQYWdl
OjpzZXR0aW5ncygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGQtPnNldHRpbmdzOwotfQotCi0vKiEK
LSAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSB3ZWIgY29udGVudCByZXF1ZXN0
cyBhIGZpbGUgbmFtZSwgZm9yIGV4YW1wbGUKLSAgICBhcyBhIHJlc3VsdCBvZiB0aGUgdXNlciBj
bGlja2luZyBvbiBhICJmaWxlIHVwbG9hZCIgYnV0dG9uIGluIGEgSFRNTCBmb3JtLgotCi0gICAg
QSBzdWdnZXN0ZWQgZmlsZW5hbWUgbWF5IGJlIHByb3ZpZGVkIGluIFxhIHN1Z2dlc3RlZEZpbGUu
IFRoZSBmcmFtZSBvcmlnaW5hdGluZyB0aGUKLSAgICByZXF1ZXN0IGlzIHByb3ZpZGVkIGFzIFxh
IHBhcmVudEZyYW1lLgotCi0gICAgXHNhIENob29zZU11bHRpcGxlRmlsZXNFeHRlbnNpb24KLSov
Ci1RU3RyaW5nIFFXZWJQYWdlOjpjaG9vc2VGaWxlKFFXZWJGcmFtZSAqcGFyZW50RnJhbWUsIGNv
bnN0IFFTdHJpbmcmIHN1Z2dlc3RlZEZpbGUpCi17Ci0gICAgUV9VTlVTRUQocGFyZW50RnJhbWUp
Ci0jaWZuZGVmIFFUX05PX0ZJTEVESUFMT0cKLSAgICByZXR1cm4gUUZpbGVEaWFsb2c6OmdldE9w
ZW5GaWxlTmFtZSh2aWV3KCksIFFTdHJpbmc6Om51bGwsIHN1Z2dlc3RlZEZpbGUpOwotI2Vsc2UK
LSAgICByZXR1cm4gUVN0cmluZzo6bnVsbDsKLSNlbmRpZgotfQotCi0vKiEKLSAgICBTZXRzIHRo
ZSBRTmV0d29ya0FjY2Vzc01hbmFnZXIgXGEgbWFuYWdlciByZXNwb25zaWJsZSBmb3Igc2Vydmlu
ZyBuZXR3b3JrIHJlcXVlc3RzIGZvciB0aGlzCi0gICAgUVdlYlBhZ2UuCi0KLSAgICBcbm90ZSBJ
dCBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCB0byBjaGFuZ2UgdGhlIG5ldHdvcmsgYWNjZXNz
IG1hbmFnZXIgYWZ0ZXIgdGhlCi0gICAgUVdlYlBhZ2UgaGFzIHVzZWQgaXQuIFRoZSByZXN1bHRz
IG9mIGRvaW5nIHRoaXMgYXJlIHVuZGVmaW5lZC4KLQotICAgIFxzYSBuZXR3b3JrQWNjZXNzTWFu
YWdlcigpCi0qLwotdm9pZCBRV2ViUGFnZTo6c2V0TmV0d29ya0FjY2Vzc01hbmFnZXIoUU5ldHdv
cmtBY2Nlc3NNYW5hZ2VyICptYW5hZ2VyKQotewotICAgIGQtPnNldE5ldHdvcmtBY2Nlc3NNYW5h
Z2VyKG1hbmFnZXIpOwotfQotCi0vKiEKLSAgICBSZXR1cm5zIHRoZSBRTmV0d29ya0FjY2Vzc01h
bmFnZXIgdGhhdCBpcyByZXNwb25zaWJsZSBmb3Igc2VydmluZyBuZXR3b3JrCi0gICAgcmVxdWVz
dHMgZm9yIHRoaXMgUVdlYlBhZ2UuCi0KLSAgICBcc2Egc2V0TmV0d29ya0FjY2Vzc01hbmFnZXIo
KQotKi8KLVFOZXR3b3JrQWNjZXNzTWFuYWdlciAqUVdlYlBhZ2U6Om5ldHdvcmtBY2Nlc3NNYW5h
Z2VyKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZC0+bmV0d29ya0FjY2Vzc01hbmFnZXIoKTsKLX0K
LQotLyohCi0gICAgU2V0cyB0aGUgUVdlYlBsdWdpbkZhY3RvcnkgXGEgZmFjdG9yeSByZXNwb25z
aWJsZSBmb3IgY3JlYXRpbmcgcGx1Z2lucyBlbWJlZGRlZCBpbnRvIHRoaXMKLSAgICBRV2ViUGFn
ZS4KLQotICAgIE5vdGU6IFRoZSBwbHVnaW4gZmFjdG9yeSBpcyBvbmx5IHVzZWQgaWYgdGhlIFFX
ZWJTZXR0aW5nczo6UGx1Z2luc0VuYWJsZWQgYXR0cmlidXRlIGlzIGVuYWJsZWQuCi0KLSAgICBc
c2EgcGx1Z2luRmFjdG9yeSgpCi0qLwotdm9pZCBRV2ViUGFnZTo6c2V0UGx1Z2luRmFjdG9yeShR
V2ViUGx1Z2luRmFjdG9yeSAqZmFjdG9yeSkKLXsKLSAgICBkLT5wbHVnaW5GYWN0b3J5ID0gZmFj
dG9yeTsKLX0KLQotLyohCi0gICAgUmV0dXJucyB0aGUgUVdlYlBsdWdpbkZhY3RvcnkgdGhhdCBp
cyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgcGx1Z2lucyBlbWJlZGRlZCBpbnRvCi0gICAgdGhp
cyBRV2ViUGFnZS4gSWYgbm8gcGx1Z2luIGZhY3RvcnkgaXMgaW5zdGFsbGVkIGEgbnVsbCBwb2lu
dGVyIGlzIHJldHVybmVkLgotCi0gICAgXHNhIHNldFBsdWdpbkZhY3RvcnkoKQotKi8KLVFXZWJQ
bHVnaW5GYWN0b3J5ICpRV2ViUGFnZTo6cGx1Z2luRmFjdG9yeSgpIGNvbnN0Ci17Ci0gICAgcmV0
dXJuIGQtPnBsdWdpbkZhY3Rvcnk7Ci19Ci0KLS8qIQotICAgIFRoaXMgZnVuY3Rpb24gaXMgY2Fs
bGVkIHdoZW4gYSB1c2VyIGFnZW50IGZvciBIVFRQIHJlcXVlc3RzIGlzIG5lZWRlZC4gWW91IGNh
biByZWltcGxlbWVudCB0aGlzCi0gICAgZnVuY3Rpb24gdG8gZHluYW1pY2FsbHkgcmV0dXJuIGRp
ZmZlcmVudCB1c2VyIGFnZW50cyBmb3IgZGlmZmVyZW50IFVSTHMsIGJhc2VkIG9uIHRoZSBcYSB1
cmwgcGFyYW1ldGVyLgotCi0gICAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyB0
aGUgZm9sbG93aW5nIHZhbHVlOgotCi0gICAgIk1vemlsbGEvNS4wICglUGxhdGZvcm0lJVNlY3Vy
aXR5JSVTdWJwbGF0Zm9ybSUpIEFwcGxlV2ViS2l0LyVXZWJLaXRWZXJzaW9uJSAoS0hUTUwsIGxp
a2UgR2Vja28pICVBcHBWZXJzaW9uIFNhZmFyaS8lV2ViS2l0VmVyc2lvbiUiCi0KLSAgICBJbiB0
aGlzIHN0cmluZyB0aGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgcmVwbGFjZWQgYXQgcnVuLXRpbWU6
Ci0gICAgXGxpc3QKLSAgICBcbGkgJVBsYXRmb3JtJSBleHBhbmRzIHRvIHRoZSB3aW5kb3dpbmcg
c3lzdGVtIGZvbGxvd2VkIGJ5ICI7ICIgaWYgaXQgaXMgbm90IFdpbmRvd3MgKGUuZy4gIlgxMTsg
IikuCi0gICAgXGxpICVTZWN1cml0eSUgZXhwYW5kcyB0byAiTjsgIiBpZiBTU0wgaXMgZGlzYWJs
ZWQuCi0gICAgXGxpICVTdWJwbGF0Zm9ybSUgZXhwYW5kcyB0byB0aGUgb3BlcmF0aW5nIHN5c3Rl
bSB2ZXJzaW9uIChlLmcuICJXaW5kb3dzIE5UIDYuMSIgb3IgIkludGVsIE1hYyBPUyBYIDEwLjUi
KS4KLSAgICBcbGkgJVdlYktpdFZlcnNpb24lIGlzIHRoZSB2ZXJzaW9uIG9mIFdlYktpdCB0aGUg
YXBwbGljYXRpb24gd2FzIGNvbXBpbGVkIGFnYWluc3QuCi0gICAgXGxpICVBcHBWZXJzaW9uJSBl
eHBhbmRzIHRvIFFDb3JlQXBwbGljYXRpb246OmFwcGxpY2F0aW9uTmFtZSgpL1FDb3JlQXBwbGlj
YXRpb246OmFwcGxpY2F0aW9uVmVyc2lvbigpIGlmIHRoZXkncmUgc2V0OyBvdGhlcndpc2UgZGVm
YXVsdGluZyB0byBRdCBhbmQgdGhlIGN1cnJlbnQgUXQgdmVyc2lvbi4KLSAgICBcZW5kbGlzdAot
Ki8KLVFTdHJpbmcgUVdlYlBhZ2U6OnVzZXJBZ2VudEZvclVybChjb25zdCBRVXJsJikgY29uc3QK
LXsKLSAgICByZXR1cm4gVXNlckFnZW50UXQ6OnN0YW5kYXJkVXNlckFnZW50KCIiLCBXRUJLSVRf
TUFKT1JfVkVSU0lPTiwgV0VCS0lUX01JTk9SX1ZFUlNJT04pOwotfQotCi0KLXZvaWQgUVdlYlBh
Z2VQcml2YXRlOjpfcV9vbkxvYWRQcm9ncmVzc0NoYW5nZWQoaW50KQotewotICAgIG1fdG90YWxC
eXRlcyA9IHBhZ2UtPnByb2dyZXNzKCktPnRvdGFsUGFnZUFuZFJlc291cmNlQnl0ZXNUb0xvYWQo
KTsKLSAgICBtX2J5dGVzUmVjZWl2ZWQgPSBwYWdlLT5wcm9ncmVzcygpLT50b3RhbEJ5dGVzUmVj
ZWl2ZWQoKTsKLX0KLQotCi0vKiEKLSAgICBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0
ZXMgdGhhdCB3ZXJlIHJlY2VpdmVkIGZyb20gdGhlIG5ldHdvcmsgdG8gcmVuZGVyIHRoZSBjdXJy
ZW50IHBhZ2UsCi0gICAgaW5jbHVkaW5nIGV4dHJhIGNvbnRlbnQgc3VjaCBhcyBlbWJlZGRlZCBp
bWFnZXMuCi0KLSAgICBcc2EgYnl0ZXNSZWNlaXZlZCgpCi0qLwotcXVpbnQ2NCBRV2ViUGFnZTo6
dG90YWxCeXRlcygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGQtPm1fdG90YWxCeXRlczsKLX0KLQot
Ci0vKiEKLSAgICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3ZXJlIHJlY2VpdmVk
IGZyb20gdGhlIG5ldHdvcmsgdG8gcmVuZGVyIHRoZSBjdXJyZW50IHBhZ2UuCi0KLSAgICBcc2Eg
dG90YWxCeXRlcygpLCBsb2FkUHJvZ3Jlc3MoKQotKi8KLXF1aW50NjQgUVdlYlBhZ2U6OmJ5dGVz
UmVjZWl2ZWQoKSBjb25zdAotewotICAgIHJldHVybiBkLT5tX2J5dGVzUmVjZWl2ZWQ7Ci19Ci0K
LS8qIQotICAgIFxzaW5jZSA0LjgKLSAgICBcZm4gdm9pZCBRV2ViUGFnZTo6dmlld3BvcnRDaGFu
Z2VSZXF1ZXN0ZWQoKQotCi0gICAgUGFnZSBhdXRob3JzIGNhbiBwcm92aWRlIHRoZSBzdXBwbGll
ZCB2YWx1ZXMgYnkgdXNpbmcgdGhlIHZpZXdwb3J0IG1ldGEgdGFnLiBNb3JlIGluZm9ybWF0aW9u
Ci0gICAgYWJvdXQgdGhpcyBjYW4gYmUgZm91bmQgYXQgXGx7aHR0cDovL2RldmVsb3Blci5hcHBs
ZS5jb20vc2FmYXJpL2xpYnJhcnkvZG9jdW1lbnRhdGlvbi9hcHBsZWFwcGxpY2F0aW9ucy9yZWZl
cmVuY2Uvc2FmYXJpd2ViY29udGVudC91c2luZ3RoZXZpZXdwb3J0L3VzaW5ndGhldmlld3BvcnQu
aHRtbH17U2FmYXJpIFJlZmVyZW5jZSBMaWJyYXJ5OiBVc2luZyB0aGUgVmlld3BvcnQgTWV0YSBU
YWd9LgotCi0gICAgXHNhIFFXZWJQYWdlOjpWaWV3cG9ydEF0dHJpYnV0ZXMsIHNldFByZWZlcnJl
ZENvbnRlbnRzU2l6ZSgpLCBRR3JhcGhpY3NXZWJWaWV3OjpzZXRTY2FsZSgpCi0qLwotCi0vKiEK
LSAgICBcZm4gdm9pZCBRV2ViUGFnZTo6bG9hZFN0YXJ0ZWQoKQotCi0gICAgVGhpcyBzaWduYWwg
aXMgZW1pdHRlZCB3aGVuIGEgcGFnZSBzdGFydHMgbG9hZGluZyBjb250ZW50LgotCi0gICAgXHNh
IGxvYWRGaW5pc2hlZCgpCi0qLwotCi0vKiEKLSAgICBcZm4gdm9pZCBRV2ViUGFnZTo6bG9hZFBy
b2dyZXNzKGludCBwcm9ncmVzcykKLQotICAgIFRoaXMgc2lnbmFsIGlzIGVtaXR0ZWQgd2hlbiB0
aGUgZ2xvYmFsIHByb2dyZXNzIHN0YXR1cyBjaGFuZ2VzLgotICAgIFRoZSBjdXJyZW50IHZhbHVl
IGlzIHByb3ZpZGVkIGJ5IFxhIHByb2dyZXNzIGFuZCBzY2FsZXMgZnJvbSAwIHRvIDEwMCwKLSAg
ICB3aGljaCBpcyB0aGUgZGVmYXVsdCByYW5nZSBvZiBRUHJvZ3Jlc3NCYXIuCi0gICAgSXQgYWNj
dW11bGF0ZXMgY2hhbmdlcyBmcm9tIGFsbCB0aGUgY2hpbGQgZnJhbWVzLgotCi0gICAgXHNhIGJ5
dGVzUmVjZWl2ZWQoKQotKi8KLQotLyohCi0gICAgXGZuIHZvaWQgUVdlYlBhZ2U6OmxvYWRGaW5p
c2hlZChib29sIG9rKQotCi0gICAgVGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuIHRoZSBwYWdl
IGZpbmlzaGVzIGxvYWRpbmcgY29udGVudC4gVGhpcyBzaWduYWwKLSAgICBpcyBpbmRlcGVuZGFu
dCBvZiBzY3JpcHQgZXhlY3V0aW9uIG9yIHBhZ2UgcmVuZGVyaW5nLgotICAgIFxhIG9rIHdpbGwg
aW5kaWNhdGUgd2hldGhlciB0aGUgbG9hZCB3YXMgc3VjY2Vzc2Z1bCBvciBhbnkgZXJyb3Igb2Nj
dXJyZWQuCi0KLSAgICBcc2EgbG9hZFN0YXJ0ZWQoKSwgRXJyb3JQYWdlRXh0ZW5zaW9uCi0qLwot
Ci0vKiEKLSAgICBcZm4gdm9pZCBRV2ViUGFnZTo6bGlua0hvdmVyZWQoY29uc3QgUVN0cmluZyAm
bGluaywgY29uc3QgUVN0cmluZyAmdGl0bGUsIGNvbnN0IFFTdHJpbmcgJnRleHRDb250ZW50KQot
Ci0gICAgVGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuIHRoZSBtb3VzZSBob3ZlcnMgb3ZlciBh
IGxpbmsuCi0KLSAgICBcYSBsaW5rIGNvbnRhaW5zIHRoZSBsaW5rIHVybC4KLSAgICBcYSB0aXRs
ZSBpcyB0aGUgbGluayBlbGVtZW50J3MgdGl0bGUsIGlmIGl0IGlzIHNwZWNpZmllZCBpbiB0aGUg
bWFya3VwLgotICAgIFxhIHRleHRDb250ZW50IHByb3ZpZGVzIHRleHQgd2l0aGluIHRoZSBsaW5r
IGVsZW1lbnQsIGUuZy4sIHRleHQgaW5zaWRlIGFuIEhUTUwgYW5jaG9yIHRhZy4KLQotICAgIFdo
ZW4gdGhlIG1vdXNlIGxlYXZlcyB0aGUgbGluayBlbGVtZW50IHRoZSBzaWduYWwgaXMgZW1pdHRl
ZCB3aXRoIGVtcHR5IHBhcmFtZXRlcnMuCi0KLSAgICBcc2EgbGlua0NsaWNrZWQoKQotKi8KLQot
LyohCi0gICAgXGZuIHZvaWQgUVdlYlBhZ2U6OnN0YXR1c0Jhck1lc3NhZ2UoY29uc3QgUVN0cmlu
ZyYgdGV4dCkKLQotICAgIFRoaXMgc2lnbmFsIGlzIGVtaXR0ZWQgd2hlbiB0aGUgc3RhdHVzYmFy
IFxhIHRleHQgaXMgY2hhbmdlZCBieSB0aGUgcGFnZS4KLSovCi0KLS8qIQotICAgIFxmbiB2b2lk
IFFXZWJQYWdlOjpmcmFtZUNyZWF0ZWQoUVdlYkZyYW1lICpmcmFtZSkKLQotICAgIFRoaXMgc2ln
bmFsIGlzIGVtaXR0ZWQgd2hlbmV2ZXIgdGhlIHBhZ2UgY3JlYXRlcyBhIG5ldyBcYSBmcmFtZS4K
LQotICAgIFxzYSBjdXJyZW50RnJhbWUoKQotKi8KLQotLyohCi0gICAgXGZuIHZvaWQgUVdlYlBh
Z2U6OnNlbGVjdGlvbkNoYW5nZWQoKQotCi0gICAgVGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVu
ZXZlciB0aGUgc2VsZWN0aW9uIGNoYW5nZXMsIGVpdGhlciBpbnRlcmFjdGl2ZWx5Ci0gICAgb3Ig
cHJvZ3JhbW1hdGljYWxseSAoZS5nLiBieSBjYWxsaW5nIHRyaWdnZXJBY3Rpb24oKSB3aXRoIGEg
c2VsZWN0aW9uIGFjdGlvbikuCi0KLSAgICBcc2Egc2VsZWN0ZWRUZXh0KCkKLSovCi0KLS8qIQot
ICAgIFxmbiB2b2lkIFFXZWJQYWdlOjpjb250ZW50c0NoYW5nZWQoKQotICAgIFxzaW5jZSA0LjUK
LQotICAgIFRoaXMgc2lnbmFsIGlzIGVtaXR0ZWQgd2hlbmV2ZXIgdGhlIHRleHQgaW4gZm9ybSBl
bGVtZW50cyBjaGFuZ2VzCi0gICAgYXMgd2VsbCBhcyBvdGhlciBlZGl0YWJsZSBjb250ZW50Lgot
Ci0gICAgXHNhIGNvbnRlbnRFZGl0YWJsZSwgbW9kaWZpZWQsIFFXZWJGcmFtZTo6dG9IdG1sKCks
IFFXZWJGcmFtZTo6dG9QbGFpblRleHQoKQotKi8KLQotLyohCi0gICAgXGZuIHZvaWQgUVdlYlBh
Z2U6Omdlb21ldHJ5Q2hhbmdlUmVxdWVzdGVkKGNvbnN0IFFSZWN0JiBnZW9tKQotCi0gICAgVGhp
cyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuZXZlciB0aGUgZG9jdW1lbnQgd2FudHMgdG8gY2hhbmdl
IHRoZSBwb3NpdGlvbiBhbmQgc2l6ZSBvZiB0aGUKLSAgICBwYWdlIHRvIFxhIGdlb20uIFRoaXMg
Y2FuIGhhcHBlbiBmb3IgZXhhbXBsZSB0aHJvdWdoIEphdmFTY3JpcHQuCi0qLwotCi0vKiEKLSAg
ICBcZm4gdm9pZCBRV2ViUGFnZTo6cmVwYWludFJlcXVlc3RlZChjb25zdCBRUmVjdCYgZGlydHlS
ZWN0KQotCi0gICAgVGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuZXZlciB0aGlzIFFXZWJQYWdl
IHNob3VsZCBiZSB1cGRhdGVkLiBJdCdzIHVzZWZ1bAotICAgIHdoZW4gcmVuZGVyaW5nIGEgUVdl
YlBhZ2Ugd2l0aG91dCBhIFFXZWJWaWV3IG9yIFFHcmFwaGljc1dlYlZpZXcuCi0gICAgXGEgZGly
dHlSZWN0IGNvbnRhaW5zIHRoZSBhcmVhIHRoYXQgbmVlZHMgdG8gYmUgdXBkYXRlZC4gVG8gcGFp
bnQgdGhlIFFXZWJQYWdlIGdldAotICAgIHRoZSBtYWluRnJhbWUoKSBhbmQgY2FsbCB0aGUgcmVu
ZGVyKFFQYWludGVyKiwgY29uc3QgUVJlZ2lvbiYpIG1ldGhvZCB3aXRoIHRoZQotICAgIFxhIGRp
cnR5UmVjdCBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlci4KLQotICAgIFxzYSBtYWluRnJhbWUoKQot
ICAgIFxzYSB2aWV3KCkKLSovCi0KLS8qIQotICAgIFxmbiB2b2lkIFFXZWJQYWdlOjpzY3JvbGxS
ZXF1ZXN0ZWQoaW50IGR4LCBpbnQgZHksIGNvbnN0IFFSZWN0JiByZWN0VG9TY3JvbGwpCi0KLSAg
ICBUaGlzIHNpZ25hbCBpcyBlbWl0dGVkIHdoZW5ldmVyIHRoZSBjb250ZW50IGdpdmVuIGJ5IFxh
IHJlY3RUb1Njcm9sbCBuZWVkcwotICAgIHRvIGJlIHNjcm9sbGVkIFxhIGR4IGFuZCBcYSBkeSBk
b3dud2FyZHMgYW5kIG5vIHZpZXcgd2FzIHNldC4KLQotICAgIFxzYSB2aWV3KCkKLSovCi0KLS8q
IQotICAgIFxmbiB2b2lkIFFXZWJQYWdlOjp3aW5kb3dDbG9zZVJlcXVlc3RlZCgpCi0KLSAgICBU
aGlzIHNpZ25hbCBpcyBlbWl0dGVkIHdoZW5ldmVyIHRoZSBwYWdlIHJlcXVlc3RzIHRoZSB3ZWIg
YnJvd3NlciB3aW5kb3cgdG8gYmUgY2xvc2VkLAotICAgIGZvciBleGFtcGxlIHRocm91Z2ggdGhl
IEphdmFTY3JpcHQgXGN7d2luZG93LmNsb3NlKCl9IGNhbGwuCi0qLwotCi0vKiEKLSAgICBcZm4g
dm9pZCBRV2ViUGFnZTo6cHJpbnRSZXF1ZXN0ZWQoUVdlYkZyYW1lICpmcmFtZSkKLQotICAgIFRo
aXMgc2lnbmFsIGlzIGVtaXR0ZWQgd2hlbmV2ZXIgdGhlIHBhZ2UgcmVxdWVzdHMgdGhlIHdlYiBi
cm93c2VyIHRvIHByaW50IFxhIGZyYW1lLAotICAgIGZvciBleGFtcGxlIHRocm91Z2ggdGhlIEph
dmFTY3JpcHQgXGN7d2luZG93LnByaW50KCl9IGNhbGwuCi0KLSAgICBcc2EgUVdlYkZyYW1lOjpw
cmludCgpLCBRUHJpbnRQcmV2aWV3RGlhbG9nCi0qLwotCi0vKiEKLSAgICBcZm4gdm9pZCBRV2Vi
UGFnZTo6dW5zdXBwb3J0ZWRDb250ZW50KFFOZXR3b3JrUmVwbHkgKnJlcGx5KQotCi0gICAgVGhp
cyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuIFdlYktpdCBjYW5ub3QgaGFuZGxlIGEgbGluayB0aGUg
dXNlciBuYXZpZ2F0ZWQgdG8gb3IgYQotICAgIHdlYiBzZXJ2ZXIncyByZXNwb25zZSBpbmNsdWRl
cyBhICJDb250ZW50LURpc3Bvc2l0aW9uIiBoZWFkZXIgd2l0aCB0aGUgJ2F0dGFjaG1lbnQnIAot
ICAgIGRpcmVjdGl2ZS4gSWYgIkNvbnRlbnQtRGlzcG9zaXRpb24iIGlzIHByZXNlbnQgaW4gXGEg
cmVwbHksIHRoZSB3ZWIgc2VydmVyIGlzIGluZGljYXRpbmcKLSAgICB0aGF0IHRoZSBjbGllbnQg
c2hvdWxkIHByb21wdCB0aGUgdXNlciB0byBzYXZlIHRoZSBjb250ZW50IHJlZ2FyZGxlc3Mgb2Yg
Y29udGVudC10eXBlLiAKLSAgICBTZWUgUkZDIDI2MTYgc2VjdGlvbnMgMTkuNS4xIGZvciBkZXRh
aWxzIGFib3V0IENvbnRlbnQtRGlzcG9zaXRpb24uCi0KLSAgICBBdCBzaWduYWwgZW1pc3Npb24g
dGltZSB0aGUgbWV0YS1kYXRhIG9mIHRoZSBRTmV0d29ya1JlcGx5IFxhIHJlcGx5IGlzIGF2YWls
YWJsZS4KLQotICAgIFxub3RlIFRoZSByZWNlaXZpbmcgc2xvdCBpcyByZXNwb25zaWJsZSBmb3Ig
ZGVsZXRpbmcgdGhlIFFOZXR3b3JrUmVwbHkgXGEgcmVwbHkuCi0KLSAgICBcbm90ZSBUaGlzIHNp
Z25hbCBpcyBvbmx5IGVtaXR0ZWQgaWYgdGhlIGZvcndhcmRVbnN1cHBvcnRlZENvbnRlbnQgcHJv
cGVydHkgaXMgc2V0IHRvIHRydWUuCi0KLSAgICBcc2EgZG93bmxvYWRSZXF1ZXN0ZWQoKQotKi8K
LQotLyohCi0gICAgXGZuIHZvaWQgUVdlYlBhZ2U6OmRvd25sb2FkUmVxdWVzdGVkKGNvbnN0IFFO
ZXR3b3JrUmVxdWVzdCAmcmVxdWVzdCkKLQotICAgIFRoaXMgc2lnbmFsIGlzIGVtaXR0ZWQgd2hl
biB0aGUgdXNlciBkZWNpZGVzIHRvIGRvd25sb2FkIGEgbGluay4gVGhlIHVybCBvZgotICAgIHRo
ZSBsaW5rIGFzIHdlbGwgYXMgYWRkaXRpb25hbCBtZXRhLWluZm9ybWF0aW9uIGlzIGNvbnRhaW5l
ZCBpbiBcYSByZXF1ZXN0LgotCi0gICAgXHNhIHVuc3VwcG9ydGVkQ29udGVudCgpCi0qLwotCi0v
KiEKLSAgICBcZm4gdm9pZCBRV2ViUGFnZTo6bWljcm9Gb2N1c0NoYW5nZWQoKQotCi0gICAgVGhp
cyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuIGZvciBleGFtcGxlIHRoZSBwb3NpdGlvbiBvZiB0aGUg
Y3Vyc29yIGluIGFuIGVkaXRhYmxlIGZvcm0KLSAgICBlbGVtZW50IGNoYW5nZXMuIEl0IGlzIHVz
ZWQgdG8gaW5mb3JtIGlucHV0IG1ldGhvZHMgYWJvdXQgdGhlIG5ldyBvbi1zY3JlZW4gcG9zaXRp
b24gd2hlcmUKLSAgICB0aGUgdXNlciBpcyBhYmxlIHRvIGVudGVyIHRleHQuIFRoaXMgc2lnbmFs
IGlzIHVzdWFsbHkgY29ubmVjdGVkIHRvIHRoZQotICAgIFFXaWRnZXQ6OnVwZGF0ZU1pY3JvRm9j
dXMoKSBzbG90LgotKi8KLQotLyohCi0gICAgXGZuIHZvaWQgUVdlYlBhZ2U6OmxpbmtDbGlja2Vk
KGNvbnN0IFFVcmwgJnVybCkKLQotICAgIFRoaXMgc2lnbmFsIGlzIGVtaXR0ZWQgd2hlbmV2ZXIg
dGhlIHVzZXIgY2xpY2tzIG9uIGEgbGluayBhbmQgdGhlIHBhZ2UncyBsaW5rRGVsZWdhdGlvblBv
bGljeQotICAgIHByb3BlcnR5IGlzIHNldCB0byBkZWxlZ2F0ZSB0aGUgbGluayBoYW5kbGluZyBm
b3IgdGhlIHNwZWNpZmllZCBcYSB1cmwuCi0KLSAgICBCeSBkZWZhdWx0IG5vIGxpbmtzIGFyZSBk
ZWxlZ2F0ZWQgYW5kIGFyZSBoYW5kbGVkIGJ5IFFXZWJQYWdlIGluc3RlYWQuCi0KLSAgICBcbm90
ZSBUaGlzIHNpZ25hbCBwb3NzaWJseSB3b24ndCBiZSBlbWl0dGVkIGZvciBjbGlja2VkIGxpbmtz
IHdoaWNoIHVzZQotICAgIEphdmFTY3JpcHQgdG8gdHJpZ2dlciBuYXZpZ2F0aW9uLgotCi0gICAg
XHNhIGxpbmtIb3ZlcmVkKCkKLSovCi0KLS8qIQotICAgIFxmbiB2b2lkIFFXZWJQYWdlOjp0b29s
QmFyVmlzaWJpbGl0eUNoYW5nZVJlcXVlc3RlZChib29sIHZpc2libGUpCi0KLSAgICBUaGlzIHNp
Z25hbCBpcyBlbWl0dGVkIHdoZW5ldmVyIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSB0b29sYmFyIGlu
IGEgd2ViIGJyb3dzZXIKLSAgICB3aW5kb3cgdGhhdCBob3N0cyBRV2ViUGFnZSBzaG91bGQgYmUg
Y2hhbmdlZCB0byBcYSB2aXNpYmxlLgotKi8KLQotLyohCi0gICAgXGZuIHZvaWQgUVdlYlBhZ2U6
OnN0YXR1c0JhclZpc2liaWxpdHlDaGFuZ2VSZXF1ZXN0ZWQoYm9vbCB2aXNpYmxlKQotCi0gICAg
VGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuZXZlciB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgc3Rh
dHVzYmFyIGluIGEgd2ViIGJyb3dzZXIKLSAgICB3aW5kb3cgdGhhdCBob3N0cyBRV2ViUGFnZSBz
aG91bGQgYmUgY2hhbmdlZCB0byBcYSB2aXNpYmxlLgotKi8KLQotLyohCi0gICAgXGZuIHZvaWQg
UVdlYlBhZ2U6Om1lbnVCYXJWaXNpYmlsaXR5Q2hhbmdlUmVxdWVzdGVkKGJvb2wgdmlzaWJsZSkK
LQotICAgIFRoaXMgc2lnbmFsIGlzIGVtaXR0ZWQgd2hlbmV2ZXIgdGhlIHZpc2liaWxpdHkgb2Yg
dGhlIG1lbnViYXIgaW4gYSB3ZWIgYnJvd3NlcgotICAgIHdpbmRvdyB0aGF0IGhvc3RzIFFXZWJQ
YWdlIHNob3VsZCBiZSBjaGFuZ2VkIHRvIFxhIHZpc2libGUuCi0qLwotCi0vKiEKLSAgICBcZm4g
dm9pZCBRV2ViUGFnZTo6ZGF0YWJhc2VRdW90YUV4Y2VlZGVkKFFXZWJGcmFtZSogZnJhbWUsIFFT
dHJpbmcgZGF0YWJhc2VOYW1lKTsKLSAgICBcc2luY2UgNC41Ci0KLSAgICBUaGlzIHNpZ25hbCBp
cyBlbWl0dGVkIHdoZW5ldmVyIHRoZSB3ZWIgc2l0ZSBzaG93biBpbiBcYSBmcmFtZSBpcyBhc2tp
bmcgdG8gc3RvcmUgZGF0YQotICAgIHRvIHRoZSBkYXRhYmFzZSBcYSBkYXRhYmFzZU5hbWUgYW5k
IHRoZSBxdW90YSBhbGxvY2F0ZWQgdG8gdGhhdCB3ZWIgc2l0ZSBpcyBleGNlZWRlZC4KLQotICAg
IFxzYSBRV2ViRGF0YWJhc2UKLSovCi0vKiEKLSAgICBcZm4gdm9pZCBRV2ViUGFnZTo6YXBwbGlj
YXRpb25DYWNoZVF1b3RhRXhjZWVkZWQoUVdlYlNlY3VyaXR5T3JpZ2luKiBvcmlnaW4sIHF1aW50
NjQgZGVmYXVsdE9yaWdpblF1b3RhLCBxdWludDY0IHRvdGFsU3BhY2VOZWVkZWQpOwotCi0gICAg
VGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuZXZlciB0aGUgd2ViIHNpdGUgaXMgYXNraW5nIHRv
IHN0b3JlIGRhdGEgdG8gdGhlIGFwcGxpY2F0aW9uIGNhY2hlCi0gICAgZGF0YWJhc2UgZGF0YWJh
c2VOYW1lIGFuZCB0aGUgcXVvdGEgYWxsb2NhdGVkIHRvIHRoYXQgd2ViIHNpdGUgaXMgZXhjZWVk
ZWQuCi0KLSovCi0KLS8qIQotICBcc2luY2UgNC41Ci0gIFxmbiB2b2lkIFFXZWJQYWdlOjpzYXZl
RnJhbWVTdGF0ZVJlcXVlc3RlZChRV2ViRnJhbWUqIGZyYW1lLCBRV2ViSGlzdG9yeUl0ZW0qIGl0
ZW0pOwotCi0gIFRoaXMgc2lnbmFsIGlzIGVtaXR0ZWQgc2hvcnRseSBiZWZvcmUgdGhlIGhpc3Rv
cnkgb2YgbmF2aWdhdGVkIHBhZ2VzCi0gIGluIFxhIGZyYW1lIGlzIGNoYW5nZWQsIGZvciBleGFt
cGxlIHdoZW4gbmF2aWdhdGluZyBiYWNrIGluIHRoZSBoaXN0b3J5LgotCi0gIFRoZSBwcm92aWRl
ZCBRV2ViSGlzdG9yeUl0ZW0sIFxhIGl0ZW0sIGhvbGRzIHRoZSBoaXN0b3J5IGVudHJ5IG9mIHRo
ZSBmcmFtZSBiZWZvcmUKLSAgdGhlIGNoYW5nZS4KLQotICBBIHBvdGVudGlhbCB1c2UtY2FzZSBm
b3IgdGhpcyBzaWduYWwgaXMgdG8gc3RvcmUgY3VzdG9tIGRhdGEgaW4KLSAgdGhlIFFXZWJIaXN0
b3J5SXRlbSBhc3NvY2lhdGVkIHRvIHRoZSBmcmFtZSwgdXNpbmcgUVdlYkhpc3RvcnlJdGVtOjpz
ZXRVc2VyRGF0YSgpLgotKi8KLQotLyohCi0gIFxzaW5jZSA0LjUKLSAgXGZuIHZvaWQgUVdlYlBh
Z2U6OnJlc3RvcmVGcmFtZVN0YXRlUmVxdWVzdGVkKFFXZWJGcmFtZSogZnJhbWUpOwotCi0gIFRo
aXMgc2lnbmFsIGlzIGVtaXR0ZWQgd2hlbiB0aGUgbG9hZCBvZiBcYSBmcmFtZSBpcyBmaW5pc2hl
ZCBhbmQgdGhlIGFwcGxpY2F0aW9uIG1heSBub3cgdXBkYXRlIGl0cyBzdGF0ZSBhY2NvcmRpbmds
eS4KLSovCi0KLS8qIQotICBcZm4gUVdlYlBhZ2VQcml2YXRlKiBRV2ViUGFnZTo6aGFuZGxlKCkg
Y29uc3QKLSAgXGludGVybmFsCi0qLwotCi0jaW5jbHVkZSAibW9jX3F3ZWJwYWdlLmNwcCIKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvcXQvQXBpL3F3ZWJwYWdlLmggYi9Tb3VyY2UvV2ViS2l0
L3F0L0FwaS9xd2VicGFnZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjU0MjFm
Y2M5ZmYyNzQxMjFjYzc4YzcwZWI3YzY4YzVhMDgwZTBjLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvcXQvQXBpL3F3ZWJwYWdlLmgK
KysrIC9kZXYvbnVsbApAQCAtMSw0NTMgKzAsMCBAQAotLyoKLSAgICBDb3B5cmlnaHQgKEMpIDIw
MDggTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCi0gICAgQ29w
eXJpZ2h0IChDKSAyMDA3IFN0YWlrb3MgQ29tcHV0aW5nIFNlcnZpY2VzIEluYy4KLQotICAgIFRo
aXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQv
b3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5l
cmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJl
IEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0
IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBk
aXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBX
SVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9m
Ci0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF
LiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1v
cmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhl
IEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMg
bGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwotICAg
IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwg
RmlmdGggRmxvb3IsCi0gICAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCi0qLwotCi0jaWZu
ZGVmIFFXRUJQQUdFX0gKLSNkZWZpbmUgUVdFQlBBR0VfSAotCi0jaW5jbHVkZSAicXdlYnNldHRp
bmdzLmgiCi0jaW5jbHVkZSAicXdlYmtpdGdsb2JhbC5oIgotCi0jaW5jbHVkZSA8UXRDb3JlL3Fv
YmplY3QuaD4KLSNpbmNsdWRlIDxRdENvcmUvcXVybC5oPgotI2luY2x1ZGUgPFF0V2lkZ2V0cy9x
d2lkZ2V0Lmg+Ci0KLVFUX0JFR0lOX05BTUVTUEFDRQotY2xhc3MgUU5ldHdvcmtQcm94eTsKLWNs
YXNzIFFVbmRvU3RhY2s7Ci1jbGFzcyBRTWVudTsKLWNsYXNzIFFOZXR3b3JrUmVxdWVzdDsKLWNs
YXNzIFFOZXR3b3JrUmVwbHk7Ci1jbGFzcyBRTmV0d29ya0FjY2Vzc01hbmFnZXI7Ci1RVF9FTkRf
TkFNRVNQQUNFCi0KLWNsYXNzIFFXZWJFbGVtZW50OwotY2xhc3MgUVdlYkZyYW1lOwotY2xhc3Mg
UVdlYk5ldHdvcmtSZXF1ZXN0OwotY2xhc3MgUVdlYkhpc3Rvcnk7Ci0KLWNsYXNzIFFXZWJGcmFt
ZURhdGE7Ci1jbGFzcyBRV2ViSGlzdG9yeUl0ZW07Ci1jbGFzcyBRV2ViSGl0VGVzdFJlc3VsdDsK
LWNsYXNzIFFXZWJOZXR3b3JrSW50ZXJmYWNlOwotY2xhc3MgUVdlYlBhZ2VBZGFwdGVyOwotY2xh
c3MgUVdlYlBhZ2VQcml2YXRlOwotY2xhc3MgUVdlYlBsdWdpbkZhY3Rvcnk7Ci1jbGFzcyBRV2Vi
U2VjdXJpdHlPcmlnaW47Ci1jbGFzcyBRdFZpZXdwb3J0QXR0cmlidXRlc1ByaXZhdGU7Ci0KLW5h
bWVzcGFjZSBXZWJDb3JlIHsKLSAgICBjbGFzcyBDaHJvbWVDbGllbnRRdDsKLSAgICBjbGFzcyBF
ZGl0b3JDbGllbnRRdDsKLSAgICBjbGFzcyBGcmFtZUxvYWRlckNsaWVudFF0OwotICAgIGNsYXNz
IEluc3BlY3RvckNsaWVudFF0OwotICAgIGNsYXNzIEluc3BlY3RvclNlcnZlclJlcXVlc3RIYW5k
bGVyUXQ7Ci0gICAgY2xhc3MgSW5zcGVjdG9yRnJvbnRlbmRDbGllbnRRdDsKLSAgICBjbGFzcyBO
b3RpZmljYXRpb25QcmVzZW50ZXJDbGllbnRRdDsKLSAgICBjbGFzcyBHZW9sb2NhdGlvblBlcm1p
c3Npb25DbGllbnRRdDsKLSAgICBjbGFzcyBSZXNvdXJjZUhhbmRsZTsKLSAgICBjbGFzcyBIaXRU
ZXN0UmVzdWx0OwotICAgIGNsYXNzIFFOZXR3b3JrUmVwbHlIYW5kbGVyOwotCi0gICAgc3RydWN0
IEZyYW1lTG9hZFJlcXVlc3Q7Ci19Ci0KLWNsYXNzIFFXRUJLSVRfRVhQT1JUIFFXZWJQYWdlIDog
cHVibGljIFFPYmplY3QgewotICAgIFFfT0JKRUNUCi0KLSAgICBRX1BST1BFUlRZKGJvb2wgbW9k
aWZpZWQgUkVBRCBpc01vZGlmaWVkKQotICAgIFFfUFJPUEVSVFkoUVN0cmluZyBzZWxlY3RlZFRl
eHQgUkVBRCBzZWxlY3RlZFRleHQpCi0gICAgUV9QUk9QRVJUWShRU3RyaW5nIHNlbGVjdGVkSHRt
bCBSRUFEIHNlbGVjdGVkSHRtbCkKLSAgICBRX1BST1BFUlRZKGJvb2wgaGFzU2VsZWN0aW9uIFJF
QUQgaGFzU2VsZWN0aW9uKQotICAgIFFfUFJPUEVSVFkoUVNpemUgdmlld3BvcnRTaXplIFJFQUQg
dmlld3BvcnRTaXplIFdSSVRFIHNldFZpZXdwb3J0U2l6ZSkKLSAgICBRX1BST1BFUlRZKFFTaXpl
IHByZWZlcnJlZENvbnRlbnRzU2l6ZSBSRUFEIHByZWZlcnJlZENvbnRlbnRzU2l6ZSBXUklURSBz
ZXRQcmVmZXJyZWRDb250ZW50c1NpemUpCi0gICAgUV9QUk9QRVJUWShib29sIGZvcndhcmRVbnN1
cHBvcnRlZENvbnRlbnQgUkVBRCBmb3J3YXJkVW5zdXBwb3J0ZWRDb250ZW50IFdSSVRFIHNldEZv
cndhcmRVbnN1cHBvcnRlZENvbnRlbnQpCi0gICAgUV9QUk9QRVJUWShMaW5rRGVsZWdhdGlvblBv
bGljeSBsaW5rRGVsZWdhdGlvblBvbGljeSBSRUFEIGxpbmtEZWxlZ2F0aW9uUG9saWN5IFdSSVRF
IHNldExpbmtEZWxlZ2F0aW9uUG9saWN5KQotICAgIFFfUFJPUEVSVFkoUVBhbGV0dGUgcGFsZXR0
ZSBSRUFEIHBhbGV0dGUgV1JJVEUgc2V0UGFsZXR0ZSkKLSAgICBRX1BST1BFUlRZKGJvb2wgY29u
dGVudEVkaXRhYmxlIFJFQUQgaXNDb250ZW50RWRpdGFibGUgV1JJVEUgc2V0Q29udGVudEVkaXRh
YmxlKQotICAgIFFfRU5VTVMoTGlua0RlbGVnYXRpb25Qb2xpY3kgTmF2aWdhdGlvblR5cGUgV2Vi
QWN0aW9uKQotcHVibGljOgotICAgIGVudW0gTmF2aWdhdGlvblR5cGUgewotICAgICAgICBOYXZp
Z2F0aW9uVHlwZUxpbmtDbGlja2VkLAotICAgICAgICBOYXZpZ2F0aW9uVHlwZUZvcm1TdWJtaXR0
ZWQsCi0gICAgICAgIE5hdmlnYXRpb25UeXBlQmFja09yRm9yd2FyZCwKLSAgICAgICAgTmF2aWdh
dGlvblR5cGVSZWxvYWQsCi0gICAgICAgIE5hdmlnYXRpb25UeXBlRm9ybVJlc3VibWl0dGVkLAot
ICAgICAgICBOYXZpZ2F0aW9uVHlwZU90aGVyCi0gICAgfTsKLQotICAgIGVudW0gV2ViQWN0aW9u
IHsKLSAgICAgICAgTm9XZWJBY3Rpb24gPSAtIDEsCi0KLSAgICAgICAgT3BlbkxpbmssCi0KLSAg
ICAgICAgT3BlbkxpbmtJbk5ld1dpbmRvdywKLSAgICAgICAgT3BlbkZyYW1lSW5OZXdXaW5kb3cs
Ci0KLSAgICAgICAgRG93bmxvYWRMaW5rVG9EaXNrLAotICAgICAgICBDb3B5TGlua1RvQ2xpcGJv
YXJkLAotCi0gICAgICAgIE9wZW5JbWFnZUluTmV3V2luZG93LAotICAgICAgICBEb3dubG9hZElt
YWdlVG9EaXNrLAotICAgICAgICBDb3B5SW1hZ2VUb0NsaXBib2FyZCwKLQotICAgICAgICBCYWNr
LAotICAgICAgICBGb3J3YXJkLAotICAgICAgICBTdG9wLAotICAgICAgICBSZWxvYWQsCi0KLSAg
ICAgICAgQ3V0LAotICAgICAgICBDb3B5LAotICAgICAgICBQYXN0ZSwKLQotICAgICAgICBVbmRv
LAotICAgICAgICBSZWRvLAotICAgICAgICBNb3ZlVG9OZXh0Q2hhciwKLSAgICAgICAgTW92ZVRv
UHJldmlvdXNDaGFyLAotICAgICAgICBNb3ZlVG9OZXh0V29yZCwKLSAgICAgICAgTW92ZVRvUHJl
dmlvdXNXb3JkLAotICAgICAgICBNb3ZlVG9OZXh0TGluZSwKLSAgICAgICAgTW92ZVRvUHJldmlv
dXNMaW5lLAotICAgICAgICBNb3ZlVG9TdGFydE9mTGluZSwKLSAgICAgICAgTW92ZVRvRW5kT2ZM
aW5lLAotICAgICAgICBNb3ZlVG9TdGFydE9mQmxvY2ssCi0gICAgICAgIE1vdmVUb0VuZE9mQmxv
Y2ssCi0gICAgICAgIE1vdmVUb1N0YXJ0T2ZEb2N1bWVudCwKLSAgICAgICAgTW92ZVRvRW5kT2ZE
b2N1bWVudCwKLSAgICAgICAgU2VsZWN0TmV4dENoYXIsCi0gICAgICAgIFNlbGVjdFByZXZpb3Vz
Q2hhciwKLSAgICAgICAgU2VsZWN0TmV4dFdvcmQsCi0gICAgICAgIFNlbGVjdFByZXZpb3VzV29y
ZCwKLSAgICAgICAgU2VsZWN0TmV4dExpbmUsCi0gICAgICAgIFNlbGVjdFByZXZpb3VzTGluZSwK
LSAgICAgICAgU2VsZWN0U3RhcnRPZkxpbmUsCi0gICAgICAgIFNlbGVjdEVuZE9mTGluZSwKLSAg
ICAgICAgU2VsZWN0U3RhcnRPZkJsb2NrLAotICAgICAgICBTZWxlY3RFbmRPZkJsb2NrLAotICAg
ICAgICBTZWxlY3RTdGFydE9mRG9jdW1lbnQsCi0gICAgICAgIFNlbGVjdEVuZE9mRG9jdW1lbnQs
Ci0gICAgICAgIERlbGV0ZVN0YXJ0T2ZXb3JkLAotICAgICAgICBEZWxldGVFbmRPZldvcmQsCi0K
LSAgICAgICAgU2V0VGV4dERpcmVjdGlvbkRlZmF1bHQsCi0gICAgICAgIFNldFRleHREaXJlY3Rp
b25MZWZ0VG9SaWdodCwKLSAgICAgICAgU2V0VGV4dERpcmVjdGlvblJpZ2h0VG9MZWZ0LAotCi0g
ICAgICAgIFRvZ2dsZUJvbGQsCi0gICAgICAgIFRvZ2dsZUl0YWxpYywKLSAgICAgICAgVG9nZ2xl
VW5kZXJsaW5lLAotCi0gICAgICAgIEluc3BlY3RFbGVtZW50LAotCi0gICAgICAgIEluc2VydFBh
cmFncmFwaFNlcGFyYXRvciwKLSAgICAgICAgSW5zZXJ0TGluZVNlcGFyYXRvciwKLQotICAgICAg
ICBTZWxlY3RBbGwsCi0gICAgICAgIFJlbG9hZEFuZEJ5cGFzc0NhY2hlLAotCi0gICAgICAgIFBh
c3RlQW5kTWF0Y2hTdHlsZSwKLSAgICAgICAgUmVtb3ZlRm9ybWF0LAotCi0gICAgICAgIFRvZ2ds
ZVN0cmlrZXRocm91Z2gsCi0gICAgICAgIFRvZ2dsZVN1YnNjcmlwdCwKLSAgICAgICAgVG9nZ2xl
U3VwZXJzY3JpcHQsCi0gICAgICAgIEluc2VydFVub3JkZXJlZExpc3QsCi0gICAgICAgIEluc2Vy
dE9yZGVyZWRMaXN0LAotICAgICAgICBJbmRlbnQsCi0gICAgICAgIE91dGRlbnQsCi0KLSAgICAg
ICAgQWxpZ25DZW50ZXIsCi0gICAgICAgIEFsaWduSnVzdGlmaWVkLAotICAgICAgICBBbGlnbkxl
ZnQsCi0gICAgICAgIEFsaWduUmlnaHQsCi0KLSAgICAgICAgU3RvcFNjaGVkdWxlZFBhZ2VSZWZy
ZXNoLAotCi0gICAgICAgIENvcHlJbWFnZVVybFRvQ2xpcGJvYXJkLAotCi0gICAgICAgIE9wZW5M
aW5rSW5UaGlzV2luZG93LAotCi0gICAgICAgIFdlYkFjdGlvbkNvdW50Ci0gICAgfTsKLQotICAg
IGVudW0gRmluZEZsYWcgewotICAgICAgICBGaW5kQmFja3dhcmQgPSAxLAotICAgICAgICBGaW5k
Q2FzZVNlbnNpdGl2ZWx5ID0gMiwKLSAgICAgICAgRmluZFdyYXBzQXJvdW5kRG9jdW1lbnQgPSA0
LAotICAgICAgICBIaWdobGlnaHRBbGxPY2N1cnJlbmNlcyA9IDgKLSAgICB9OwotICAgIFFfREVD
TEFSRV9GTEFHUyhGaW5kRmxhZ3MsIEZpbmRGbGFnKQotCi0gICAgZW51bSBMaW5rRGVsZWdhdGlv
blBvbGljeSB7Ci0gICAgICAgIERvbnREZWxlZ2F0ZUxpbmtzLAotICAgICAgICBEZWxlZ2F0ZUV4
dGVybmFsTGlua3MsCi0gICAgICAgIERlbGVnYXRlQWxsTGlua3MKLSAgICB9OwotCi0gICAgZW51
bSBXZWJXaW5kb3dUeXBlIHsKLSAgICAgICAgV2ViQnJvd3NlcldpbmRvdywKLSAgICAgICAgV2Vi
TW9kYWxEaWFsb2cKLSAgICB9OwotCi0gICAgZW51bSBQZXJtaXNzaW9uUG9saWN5IHsKLSAgICAg
ICAgUGVybWlzc2lvblVua25vd24sCi0gICAgICAgIFBlcm1pc3Npb25HcmFudGVkQnlVc2VyLAot
ICAgICAgICBQZXJtaXNzaW9uRGVuaWVkQnlVc2VyCi0gICAgfTsKLQotICAgIGVudW0gRmVhdHVy
ZSB7Ci0gICAgICAgIE5vdGlmaWNhdGlvbnMsCi0gICAgICAgIEdlb2xvY2F0aW9uCi0gICAgfTsK
LQotICAgIGNsYXNzIFFXRUJLSVRfRVhQT1JUIFZpZXdwb3J0QXR0cmlidXRlcyB7Ci0gICAgcHVi
bGljOgotICAgICAgICBWaWV3cG9ydEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgVmlld3BvcnRBdHRy
aWJ1dGVzKGNvbnN0IFFXZWJQYWdlOjpWaWV3cG9ydEF0dHJpYnV0ZXMmIG90aGVyKTsKLQotICAg
ICAgICB+Vmlld3BvcnRBdHRyaWJ1dGVzKCk7Ci0KLSAgICAgICAgUVdlYlBhZ2U6OlZpZXdwb3J0
QXR0cmlidXRlcyYgb3BlcmF0b3I9KGNvbnN0IFFXZWJQYWdlOjpWaWV3cG9ydEF0dHJpYnV0ZXMm
IG90aGVyKTsKLQotICAgICAgICBpbmxpbmUgcXJlYWwgaW5pdGlhbFNjYWxlRmFjdG9yKCkgY29u
c3QgeyByZXR1cm4gbV9pbml0aWFsU2NhbGVGYWN0b3I7IH0KLSAgICAgICAgaW5saW5lIHFyZWFs
IG1pbmltdW1TY2FsZUZhY3RvcigpIGNvbnN0IHsgcmV0dXJuIG1fbWluaW11bVNjYWxlRmFjdG9y
OyB9Ci0gICAgICAgIGlubGluZSBxcmVhbCBtYXhpbXVtU2NhbGVGYWN0b3IoKSBjb25zdCB7IHJl
dHVybiBtX21heGltdW1TY2FsZUZhY3RvcjsgfQotICAgICAgICBpbmxpbmUgcXJlYWwgZGV2aWNl
UGl4ZWxSYXRpbygpIGNvbnN0IHsgcmV0dXJuIG1fZGV2aWNlUGl4ZWxSYXRpbzsgfQotICAgICAg
ICBpbmxpbmUgYm9vbCBpc1VzZXJTY2FsYWJsZSgpIGNvbnN0IHsgcmV0dXJuIG1faXNVc2VyU2Nh
bGFibGU7IH0KLSAgICAgICAgaW5saW5lIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIG1f
aXNWYWxpZDsgfQotICAgICAgICBpbmxpbmUgUVNpemVGIHNpemUoKSBjb25zdCB7IHJldHVybiBt
X3NpemU7IH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIFFTaGFyZWREYXRhUG9pbnRlcjxRdFZp
ZXdwb3J0QXR0cmlidXRlc1ByaXZhdGU+IGQ7Ci0gICAgICAgIHFyZWFsIG1faW5pdGlhbFNjYWxl
RmFjdG9yOwotICAgICAgICBxcmVhbCBtX21pbmltdW1TY2FsZUZhY3RvcjsKLSAgICAgICAgcXJl
YWwgbV9tYXhpbXVtU2NhbGVGYWN0b3I7Ci0gICAgICAgIHFyZWFsIG1fZGV2aWNlUGl4ZWxSYXRp
bzsKLSAgICAgICAgYm9vbCBtX2lzVXNlclNjYWxhYmxlOwotICAgICAgICBib29sIG1faXNWYWxp
ZDsKLSAgICAgICAgUVNpemVGIG1fc2l6ZTsKLQotICAgICAgICBmcmllbmQgY2xhc3MgV2ViQ29y
ZTo6Q2hyb21lQ2xpZW50UXQ7Ci0gICAgICAgIGZyaWVuZCBjbGFzcyBRV2ViUGFnZTsKLSAgICB9
OwotCi0KLSAgICBleHBsaWNpdCBRV2ViUGFnZShRT2JqZWN0ICpwYXJlbnQgPSAwKTsKLSAgICB+
UVdlYlBhZ2UoKTsKLQotICAgIFFXZWJGcmFtZSAqbWFpbkZyYW1lKCkgY29uc3Q7Ci0gICAgUVdl
YkZyYW1lICpjdXJyZW50RnJhbWUoKSBjb25zdDsKLSAgICBRV2ViRnJhbWUqIGZyYW1lQXQoY29u
c3QgUVBvaW50JiBwb3MpIGNvbnN0OwotCi0gICAgUVdlYkhpc3RvcnkgKmhpc3RvcnkoKSBjb25z
dDsKLSAgICBRV2ViU2V0dGluZ3MgKnNldHRpbmdzKCkgY29uc3Q7Ci0KLSAgICB2b2lkIHNldFZp
ZXcoUVdpZGdldCAqdmlldyk7Ci0gICAgUVdpZGdldCAqdmlldygpIGNvbnN0OwotCi0gICAgYm9v
bCBpc01vZGlmaWVkKCkgY29uc3Q7Ci0jaWZuZGVmIFFUX05PX1VORE9TVEFDSwotICAgIFFVbmRv
U3RhY2sgKnVuZG9TdGFjaygpIGNvbnN0OwotI2VuZGlmCi0KLSAgICB2b2lkIHNldE5ldHdvcmtB
Y2Nlc3NNYW5hZ2VyKFFOZXR3b3JrQWNjZXNzTWFuYWdlciAqbWFuYWdlcik7Ci0gICAgUU5ldHdv
cmtBY2Nlc3NNYW5hZ2VyICpuZXR3b3JrQWNjZXNzTWFuYWdlcigpIGNvbnN0OwotCi0gICAgdm9p
ZCBzZXRQbHVnaW5GYWN0b3J5KFFXZWJQbHVnaW5GYWN0b3J5ICpmYWN0b3J5KTsKLSAgICBRV2Vi
UGx1Z2luRmFjdG9yeSAqcGx1Z2luRmFjdG9yeSgpIGNvbnN0OwotCi0gICAgcXVpbnQ2NCB0b3Rh
bEJ5dGVzKCkgY29uc3Q7Ci0gICAgcXVpbnQ2NCBieXRlc1JlY2VpdmVkKCkgY29uc3Q7Ci0KLSAg
ICBib29sIGhhc1NlbGVjdGlvbigpIGNvbnN0OwotICAgIFFTdHJpbmcgc2VsZWN0ZWRUZXh0KCkg
Y29uc3Q7Ci0gICAgUVN0cmluZyBzZWxlY3RlZEh0bWwoKSBjb25zdDsKLQotI2lmbmRlZiBRVF9O
T19BQ1RJT04KLSAgICBRQWN0aW9uICphY3Rpb24oV2ViQWN0aW9uIGFjdGlvbikgY29uc3Q7Ci0j
ZW5kaWYKLSAgICB2aXJ0dWFsIHZvaWQgdHJpZ2dlckFjdGlvbihXZWJBY3Rpb24gYWN0aW9uLCBi
b29sIGNoZWNrZWQgPSBmYWxzZSk7Ci0KLSAgICBRU2l6ZSB2aWV3cG9ydFNpemUoKSBjb25zdDsK
LSAgICB2b2lkIHNldFZpZXdwb3J0U2l6ZShjb25zdCBRU2l6ZSAmc2l6ZSkgY29uc3Q7Ci0gICAg
Vmlld3BvcnRBdHRyaWJ1dGVzIHZpZXdwb3J0QXR0cmlidXRlc0ZvclNpemUoY29uc3QgUVNpemUm
IGF2YWlsYWJsZVNpemUpIGNvbnN0OwotCi0gICAgUVNpemUgcHJlZmVycmVkQ29udGVudHNTaXpl
KCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRQcmVmZXJyZWRDb250ZW50c1NpemUoY29uc3QgUVNpemUg
JnNpemUpIGNvbnN0OwotICAgIHZvaWQgc2V0QWN0dWFsVmlzaWJsZUNvbnRlbnRSZWN0KGNvbnN0
IFFSZWN0JiByZWN0KSBjb25zdDsKLQotICAgIHZpcnR1YWwgYm9vbCBldmVudChRRXZlbnQqKTsK
LSAgICBib29sIGZvY3VzTmV4dFByZXZDaGlsZChib29sIG5leHQpOwotCi0gICAgUVZhcmlhbnQg
aW5wdXRNZXRob2RRdWVyeShRdDo6SW5wdXRNZXRob2RRdWVyeSBwcm9wZXJ0eSkgY29uc3Q7Ci0K
LSAgICBib29sIGZpbmRUZXh0KGNvbnN0IFFTdHJpbmcgJnN1YlN0cmluZywgRmluZEZsYWdzIG9w
dGlvbnMgPSAwKTsKLQotICAgIHZvaWQgc2V0Rm9yd2FyZFVuc3VwcG9ydGVkQ29udGVudChib29s
IGZvcndhcmQpOwotICAgIGJvb2wgZm9yd2FyZFVuc3VwcG9ydGVkQ29udGVudCgpIGNvbnN0Owot
Ci0gICAgdm9pZCBzZXRMaW5rRGVsZWdhdGlvblBvbGljeShMaW5rRGVsZWdhdGlvblBvbGljeSBw
b2xpY3kpOwotICAgIExpbmtEZWxlZ2F0aW9uUG9saWN5IGxpbmtEZWxlZ2F0aW9uUG9saWN5KCkg
Y29uc3Q7Ci0KLSAgICB2b2lkIHNldFBhbGV0dGUoY29uc3QgUVBhbGV0dGUgJnBhbGV0dGUpOwot
ICAgIFFQYWxldHRlIHBhbGV0dGUoKSBjb25zdDsKLQotICAgIHZvaWQgc2V0Q29udGVudEVkaXRh
YmxlKGJvb2wgZWRpdGFibGUpOwotICAgIGJvb2wgaXNDb250ZW50RWRpdGFibGUoKSBjb25zdDsK
LQotI2lmbmRlZiBRVF9OT19DT05URVhUTUVOVQotICAgIGJvb2wgc3dhbGxvd0NvbnRleHRNZW51
RXZlbnQoUUNvbnRleHRNZW51RXZlbnQgKmV2ZW50KTsKLSNlbmRpZgotICAgIHZvaWQgdXBkYXRl
UG9zaXRpb25EZXBlbmRlbnRBY3Rpb25zKGNvbnN0IFFQb2ludCAmcG9zKTsKLQotICAgIFFNZW51
ICpjcmVhdGVTdGFuZGFyZENvbnRleHRNZW51KCk7Ci0KLSAgICB2b2lkIHNldEZlYXR1cmVQZXJt
aXNzaW9uKFFXZWJGcmFtZSogZnJhbWUsIEZlYXR1cmUgZmVhdHVyZSwgUGVybWlzc2lvblBvbGlj
eSBwb2xpY3kpOwotCi0gICAgUVN0cmluZ0xpc3Qgc3VwcG9ydGVkQ29udGVudFR5cGVzKCkgY29u
c3Q7Ci0gICAgYm9vbCBzdXBwb3J0c0NvbnRlbnRUeXBlKGNvbnN0IFFTdHJpbmcmIG1pbWVUeXBl
KSBjb25zdDsKLQotICAgIGVudW0gRXh0ZW5zaW9uIHsKLSAgICAgICAgQ2hvb3NlTXVsdGlwbGVG
aWxlc0V4dGVuc2lvbiwKLSAgICAgICAgRXJyb3JQYWdlRXh0ZW5zaW9uCi0gICAgfTsKLSAgICBj
bGFzcyBFeHRlbnNpb25PcHRpb24KLSAgICB7fTsKLSAgICBjbGFzcyBFeHRlbnNpb25SZXR1cm4K
LSAgICB7fTsKLQotICAgIGNsYXNzIENob29zZU11bHRpcGxlRmlsZXNFeHRlbnNpb25PcHRpb24g
OiBwdWJsaWMgRXh0ZW5zaW9uT3B0aW9uIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIFFXZWJGcmFt
ZSAqcGFyZW50RnJhbWU7Ci0gICAgICAgIFFTdHJpbmdMaXN0IHN1Z2dlc3RlZEZpbGVOYW1lczsK
LSAgICB9OwotCi0gICAgY2xhc3MgQ2hvb3NlTXVsdGlwbGVGaWxlc0V4dGVuc2lvblJldHVybiA6
IHB1YmxpYyBFeHRlbnNpb25SZXR1cm4gewotICAgIHB1YmxpYzoKLSAgICAgICAgUVN0cmluZ0xp
c3QgZmlsZU5hbWVzOwotICAgIH07Ci0KLSAgICBlbnVtIEVycm9yRG9tYWluIHsgUXROZXR3b3Jr
LCBIdHRwLCBXZWJLaXQgfTsKLSAgICBjbGFzcyBFcnJvclBhZ2VFeHRlbnNpb25PcHRpb24gOiBw
dWJsaWMgRXh0ZW5zaW9uT3B0aW9uIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIFFVcmwgdXJsOwot
ICAgICAgICBRV2ViRnJhbWUqIGZyYW1lOwotICAgICAgICBFcnJvckRvbWFpbiBkb21haW47Ci0g
ICAgICAgIGludCBlcnJvcjsKLSAgICAgICAgUVN0cmluZyBlcnJvclN0cmluZzsKLSAgICB9Owot
Ci0gICAgY2xhc3MgRXJyb3JQYWdlRXh0ZW5zaW9uUmV0dXJuIDogcHVibGljIEV4dGVuc2lvblJl
dHVybiB7Ci0gICAgcHVibGljOgotICAgICAgICBFcnJvclBhZ2VFeHRlbnNpb25SZXR1cm4oKSA6
IGNvbnRlbnRUeXBlKFFMYXRpbjFTdHJpbmcoInRleHQvaHRtbCIpKSwgZW5jb2RpbmcoUUxhdGlu
MVN0cmluZygidXRmLTgiKSkge307Ci0gICAgICAgIFFTdHJpbmcgY29udGVudFR5cGU7Ci0gICAg
ICAgIFFTdHJpbmcgZW5jb2Rpbmc7Ci0gICAgICAgIFFVcmwgYmFzZVVybDsKLSAgICAgICAgUUJ5
dGVBcnJheSBjb250ZW50OwotICAgIH07Ci0KLQotICAgIHZpcnR1YWwgYm9vbCBleHRlbnNpb24o
RXh0ZW5zaW9uIGV4dGVuc2lvbiwgY29uc3QgRXh0ZW5zaW9uT3B0aW9uICpvcHRpb24gPSAwLCBF
eHRlbnNpb25SZXR1cm4gKm91dHB1dCA9IDApOwotICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c0V4
dGVuc2lvbihFeHRlbnNpb24gZXh0ZW5zaW9uKSBjb25zdDsKLQotICAgIFFXZWJQYWdlQWRhcHRl
ciogaGFuZGxlKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgc2hvdWxkSW50ZXJydXB0SmF2
YVNjcmlwdCgpOwotCi1RX1NJR05BTFM6Ci0gICAgdm9pZCBsb2FkU3RhcnRlZCgpOwotICAgIHZv
aWQgbG9hZFByb2dyZXNzKGludCBwcm9ncmVzcyk7Ci0gICAgdm9pZCBsb2FkRmluaXNoZWQoYm9v
bCBvayk7Ci0KLSAgICB2b2lkIGxpbmtIb3ZlcmVkKGNvbnN0IFFTdHJpbmcgJmxpbmssIGNvbnN0
IFFTdHJpbmcgJnRpdGxlLCBjb25zdCBRU3RyaW5nICZ0ZXh0Q29udGVudCk7Ci0gICAgdm9pZCBz
dGF0dXNCYXJNZXNzYWdlKGNvbnN0IFFTdHJpbmcmIHRleHQpOwotICAgIHZvaWQgc2VsZWN0aW9u
Q2hhbmdlZCgpOwotICAgIHZvaWQgZnJhbWVDcmVhdGVkKFFXZWJGcmFtZSAqZnJhbWUpOwotICAg
IHZvaWQgZ2VvbWV0cnlDaGFuZ2VSZXF1ZXN0ZWQoY29uc3QgUVJlY3QmIGdlb20pOwotICAgIHZv
aWQgcmVwYWludFJlcXVlc3RlZChjb25zdCBRUmVjdCYgZGlydHlSZWN0KTsKLSAgICB2b2lkIHNj
cm9sbFJlcXVlc3RlZChpbnQgZHgsIGludCBkeSwgY29uc3QgUVJlY3QmIHNjcm9sbFZpZXdSZWN0
KTsKLSAgICB2b2lkIHdpbmRvd0Nsb3NlUmVxdWVzdGVkKCk7Ci0gICAgdm9pZCBwcmludFJlcXVl
c3RlZChRV2ViRnJhbWUgKmZyYW1lKTsKLSAgICB2b2lkIGxpbmtDbGlja2VkKGNvbnN0IFFVcmwg
JnVybCk7Ci0KLSAgICB2b2lkIHRvb2xCYXJWaXNpYmlsaXR5Q2hhbmdlUmVxdWVzdGVkKGJvb2wg
dmlzaWJsZSk7Ci0gICAgdm9pZCBzdGF0dXNCYXJWaXNpYmlsaXR5Q2hhbmdlUmVxdWVzdGVkKGJv
b2wgdmlzaWJsZSk7Ci0gICAgdm9pZCBtZW51QmFyVmlzaWJpbGl0eUNoYW5nZVJlcXVlc3RlZChi
b29sIHZpc2libGUpOwotCi0gICAgdm9pZCB1bnN1cHBvcnRlZENvbnRlbnQoUU5ldHdvcmtSZXBs
eSAqcmVwbHkpOwotICAgIHZvaWQgZG93bmxvYWRSZXF1ZXN0ZWQoY29uc3QgUU5ldHdvcmtSZXF1
ZXN0ICZyZXF1ZXN0KTsKLQotICAgIHZvaWQgbWljcm9Gb2N1c0NoYW5nZWQoKTsKLSAgICB2b2lk
IGNvbnRlbnRzQ2hhbmdlZCgpOwotICAgIHZvaWQgZGF0YWJhc2VRdW90YUV4Y2VlZGVkKFFXZWJG
cmFtZSogZnJhbWUsIFFTdHJpbmcgZGF0YWJhc2VOYW1lKTsKLSAgICB2b2lkIGFwcGxpY2F0aW9u
Q2FjaGVRdW90YUV4Y2VlZGVkKFFXZWJTZWN1cml0eU9yaWdpbiogb3JpZ2luLCBxdWludDY0IGRl
ZmF1bHRPcmlnaW5RdW90YSwgcXVpbnQ2NCB0b3RhbFNwYWNlTmVlZGVkKTsKLQotICAgIHZvaWQg
c2F2ZUZyYW1lU3RhdGVSZXF1ZXN0ZWQoUVdlYkZyYW1lKiBmcmFtZSwgUVdlYkhpc3RvcnlJdGVt
KiBpdGVtKTsKLSAgICB2b2lkIHJlc3RvcmVGcmFtZVN0YXRlUmVxdWVzdGVkKFFXZWJGcmFtZSog
ZnJhbWUpOwotCi0gICAgdm9pZCB2aWV3cG9ydENoYW5nZVJlcXVlc3RlZCgpOwotCi0gICAgdm9p
ZCBmZWF0dXJlUGVybWlzc2lvblJlcXVlc3RlZChRV2ViRnJhbWUqIGZyYW1lLCBRV2ViUGFnZTo6
RmVhdHVyZSBmZWF0dXJlKTsKLSAgICB2b2lkIGZlYXR1cmVQZXJtaXNzaW9uUmVxdWVzdENhbmNl
bGVkKFFXZWJGcmFtZSogZnJhbWUsIFFXZWJQYWdlOjpGZWF0dXJlIGZlYXR1cmUpOwotCi1wcm90
ZWN0ZWQ6Ci0gICAgdmlydHVhbCBRV2ViUGFnZSAqY3JlYXRlV2luZG93KFdlYldpbmRvd1R5cGUg
dHlwZSk7Ci0gICAgdmlydHVhbCBRT2JqZWN0ICpjcmVhdGVQbHVnaW4oY29uc3QgUVN0cmluZyAm
Y2xhc3NpZCwgY29uc3QgUVVybCAmdXJsLCBjb25zdCBRU3RyaW5nTGlzdCAmcGFyYW1OYW1lcywg
Y29uc3QgUVN0cmluZ0xpc3QgJnBhcmFtVmFsdWVzKTsKLQotICAgIHZpcnR1YWwgYm9vbCBhY2Nl
cHROYXZpZ2F0aW9uUmVxdWVzdChRV2ViRnJhbWUgKmZyYW1lLCBjb25zdCBRTmV0d29ya1JlcXVl
c3QgJnJlcXVlc3QsIE5hdmlnYXRpb25UeXBlIHR5cGUpOwotICAgIHZpcnR1YWwgUVN0cmluZyBj
aG9vc2VGaWxlKFFXZWJGcmFtZSAqb3JpZ2luYXRpbmdGcmFtZSwgY29uc3QgUVN0cmluZyYgb2xk
RmlsZSk7Ci0gICAgdmlydHVhbCB2b2lkIGphdmFTY3JpcHRBbGVydChRV2ViRnJhbWUgKm9yaWdp
bmF0aW5nRnJhbWUsIGNvbnN0IFFTdHJpbmcmIG1zZyk7Ci0gICAgdmlydHVhbCBib29sIGphdmFT
Y3JpcHRDb25maXJtKFFXZWJGcmFtZSAqb3JpZ2luYXRpbmdGcmFtZSwgY29uc3QgUVN0cmluZyYg
bXNnKTsKLSAgICB2aXJ0dWFsIGJvb2wgamF2YVNjcmlwdFByb21wdChRV2ViRnJhbWUgKm9yaWdp
bmF0aW5nRnJhbWUsIGNvbnN0IFFTdHJpbmcmIG1zZywgY29uc3QgUVN0cmluZyYgZGVmYXVsdFZh
bHVlLCBRU3RyaW5nKiByZXN1bHQpOwotICAgIHZpcnR1YWwgdm9pZCBqYXZhU2NyaXB0Q29uc29s
ZU1lc3NhZ2UoY29uc3QgUVN0cmluZyYgbWVzc2FnZSwgaW50IGxpbmVOdW1iZXIsIGNvbnN0IFFT
dHJpbmcmIHNvdXJjZUlEKTsKLQotICAgIHZpcnR1YWwgUVN0cmluZyB1c2VyQWdlbnRGb3JVcmwo
Y29uc3QgUVVybCYgdXJsKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICBRX1BSSVZBVEVfU0xPVChk
LCB2b2lkIF9xX29uTG9hZFByb2dyZXNzQ2hhbmdlZChpbnQpKQotI2lmbmRlZiBRVF9OT19BQ1RJ
T04KLSAgICBRX1BSSVZBVEVfU0xPVChkLCB2b2lkIF9xX3dlYkFjdGlvblRyaWdnZXJlZChib29s
IGNoZWNrZWQpKQotI2VuZGlmCi0gICAgUV9QUklWQVRFX1NMT1QoZCwgdm9pZCBfcV9jbGVhbnVw
TGVha01lc3NhZ2VzKCkpCi0KLSAgICBRV2ViUGFnZVByaXZhdGUgKmQ7Ci0KLSAgICBmcmllbmQg
Y2xhc3MgUVdlYkZyYW1lOwotICAgIGZyaWVuZCBjbGFzcyBRV2ViUGFnZVByaXZhdGU7Ci0gICAg
ZnJpZW5kIGNsYXNzIFFXZWJWaWV3OwotICAgIGZyaWVuZCBjbGFzcyBRV2ViVmlld1ByaXZhdGU7
Ci0gICAgZnJpZW5kIGNsYXNzIFFHcmFwaGljc1dlYlZpZXc7Ci0gICAgZnJpZW5kIGNsYXNzIFFH
cmFwaGljc1dlYlZpZXdQcml2YXRlOwotICAgIGZyaWVuZCBjbGFzcyBRV2ViSW5zcGVjdG9yOwot
ICAgIGZyaWVuZCBjbGFzcyBXZWJDb3JlOjpDaHJvbWVDbGllbnRRdDsKLSAgICBmcmllbmQgY2xh
c3MgV2ViQ29yZTo6RWRpdG9yQ2xpZW50UXQ7Ci0gICAgZnJpZW5kIGNsYXNzIFdlYkNvcmU6OkZy
YW1lTG9hZGVyQ2xpZW50UXQ7Ci0gICAgZnJpZW5kIGNsYXNzIFdlYkNvcmU6Okluc3BlY3RvckNs
aWVudFF0OwotICAgIGZyaWVuZCBjbGFzcyBXZWJDb3JlOjpJbnNwZWN0b3JTZXJ2ZXJSZXF1ZXN0
SGFuZGxlclF0OwotICAgIGZyaWVuZCBjbGFzcyBXZWJDb3JlOjpJbnNwZWN0b3JGcm9udGVuZENs
aWVudFF0OwotICAgIGZyaWVuZCBjbGFzcyBXZWJDb3JlOjpOb3RpZmljYXRpb25QcmVzZW50ZXJD
bGllbnRRdDsKLSAgICBmcmllbmQgY2xhc3MgV2ViQ29yZTo6R2VvbG9jYXRpb25QZXJtaXNzaW9u
Q2xpZW50UXQ7Ci0gICAgZnJpZW5kIGNsYXNzIFdlYkNvcmU6OlJlc291cmNlSGFuZGxlOwotICAg
IGZyaWVuZCBjbGFzcyBXZWJDb3JlOjpRTmV0d29ya1JlcGx5SGFuZGxlcjsKLSAgICBmcmllbmQg
Y2xhc3MgRHVtcFJlbmRlclRyZWVTdXBwb3J0UXQ7Ci19OwotCi1RX0RFQ0xBUkVfT1BFUkFUT1JT
X0ZPUl9GTEFHUyhRV2ViUGFnZTo6RmluZEZsYWdzKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJLaXQvcXQvQXBpL3F3ZWJwYWdlX3AuaCBiL1NvdXJjZS9XZWJLaXQvcXQvQXBpL3F3
ZWJwYWdlX3AuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQzNGRkNjUzYzc3ZjZk
ZDBhMTFmNTJjMDIwYWQ1NWU5OWU5ODBiNy4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L3F0L0FwaS9xd2VicGFnZV9wLmgKKysrIC9k
ZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotLyoKLSAgICBDb3B5cmlnaHQgKEMpIDIwMDgsIDIw
MDkgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCi0gICAgQ29w
eXJpZ2h0IChDKSAyMDA4IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyCi0KLSAgICBUaGlzIGxp
YnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0g
ICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu
ZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3Vy
IG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJp
YnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9V
VCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAg
IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNl
ZSB0aGUgR05VCi0gICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRl
dGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUg
TGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJh
cnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KLSAgICB0aGUg
RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRo
IEZsb29yLAotICAgIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgotKi8KLQotI2lmbmRlZiBR
V0VCUEFHRV9QX0gKLSNkZWZpbmUgUVdFQlBBR0VfUF9ICi0KLSNpbmNsdWRlICJRV2ViUGFnZUFk
YXB0ZXIuaCIKLQotI2luY2x1ZGUgInF3ZWJmcmFtZS5oIgotI2luY2x1ZGUgInF3ZWJoaXN0b3J5
LmgiCi0jaW5jbHVkZSAicXdlYnBhZ2UuaCIKLQotI2luY2x1ZGUgPFFQb2ludGVyPgotI2luY2x1
ZGUgPHFiYXNpY3RpbWVyLmg+Ci0jaW5jbHVkZSA8cWV2ZW50Lmg+Ci0jaW5jbHVkZSA8cWdlc3R1
cmUuaD4KLSNpbmNsdWRlIDxxZ3JhcGhpY3NzY2VuZWV2ZW50Lmg+Ci0jaW5jbHVkZSA8cWdyYXBo
aWNzd2lkZ2V0Lmg+Ci0jaW5jbHVkZSA8cW5ldHdvcmtwcm94eS5oPgotCi0KLW5hbWVzcGFjZSBX
ZWJDb3JlIHsKLSAgICBjbGFzcyBDb250ZXh0TWVudUNsaWVudFF0OwotICAgIGNsYXNzIENvbnRl
eHRNZW51SXRlbTsKLSAgICBjbGFzcyBDb250ZXh0TWVudTsKLSAgICBjbGFzcyBEb2N1bWVudDsK
LSAgICBjbGFzcyBFZGl0b3JDbGllbnRRdDsKLSAgICBjbGFzcyBFbGVtZW50OwotICAgIGNsYXNz
IEluc3BlY3RvckNvbnRyb2xsZXI7Ci0gICAgY2xhc3MgSW50UmVjdDsKLSAgICBjbGFzcyBOb2Rl
OwotICAgIGNsYXNzIE5vZGVMaXN0OwotICAgIGNsYXNzIEZyYW1lOwotfQotCi1RVF9CRUdJTl9O
QU1FU1BBQ0UKLWNsYXNzIFFVbmRvU3RhY2s7Ci1jbGFzcyBRTWVudTsKLWNsYXNzIFFCaXRBcnJh
eTsKLVFUX0VORF9OQU1FU1BBQ0UKLQotY2xhc3MgUXRQbHVnaW5XaWRnZXRBZGFwdGVyOwotY2xh
c3MgUVdlYkluc3BlY3RvcjsKLWNsYXNzIFFXZWJGcmFtZUFkYXB0ZXI7Ci1jbGFzcyBVbmRvU3Rl
cFF0OwotCi1jbGFzcyBRdFZpZXdwb3J0QXR0cmlidXRlc1ByaXZhdGUgOiBwdWJsaWMgUVNoYXJl
ZERhdGEgewotcHVibGljOgotICAgIFF0Vmlld3BvcnRBdHRyaWJ1dGVzUHJpdmF0ZShRV2ViUGFn
ZTo6Vmlld3BvcnRBdHRyaWJ1dGVzKiBxcSkKLSAgICAgICAgOiBxKHFxKQotICAgIHsgfQotCi0g
ICAgUVdlYlBhZ2U6OlZpZXdwb3J0QXR0cmlidXRlcyogcTsKLX07Ci0KLWNsYXNzIFFXZWJQYWdl
UHJpdmF0ZSA6IHB1YmxpYyBRV2ViUGFnZUFkYXB0ZXIgewotcHVibGljOgotICAgIFFXZWJQYWdl
UHJpdmF0ZShRV2ViUGFnZSopOwotICAgIH5RV2ViUGFnZVByaXZhdGUoKTsKLQotICAgIHN0YXRp
YyBXZWJDb3JlOjpQYWdlKiBjb3JlKGNvbnN0IFFXZWJQYWdlKik7Ci0KLSAgICAvLyBBZGFwdGVy
IGltcGxlbWVudGF0aW9uCi0gICAgdmlydHVhbCB2b2lkIHNob3coKSBPVkVSUklERTsKLSAgICB2
aXJ0dWFsIHZvaWQgc2V0Rm9jdXMoKSBPVkVSUklERTsKLSAgICB2aXJ0dWFsIHZvaWQgdW5mb2N1
cygpIE9WRVJSSURFOwotICAgIHZpcnR1YWwgdm9pZCBzZXRXaW5kb3dSZWN0KGNvbnN0IFFSZWN0
ICYpIE9WRVJSSURFOwotICAgIHZpcnR1YWwgUVNpemUgdmlld3BvcnRTaXplKCkgY29uc3QgT1ZF
UlJJREU7Ci0gICAgdmlydHVhbCBRV2ViUGFnZUFkYXB0ZXIqIGNyZWF0ZVdpbmRvdyhib29sIC8q
ZGlhbG9nKi8pIE9WRVJSSURFOwotICAgIHZpcnR1YWwgUU9iamVjdCogaGFuZGxlKCkgT1ZFUlJJ
REUgeyByZXR1cm4gcTsgfQotICAgIHZpcnR1YWwgdm9pZCBqYXZhU2NyaXB0Q29uc29sZU1lc3Nh
Z2UoY29uc3QgUVN0cmluZyYgbWVzc2FnZSwgaW50IGxpbmVOdW1iZXIsIGNvbnN0IFFTdHJpbmcm
IHNvdXJjZUlEKSBPVkVSUklERTsKLSAgICB2aXJ0dWFsIHZvaWQgamF2YVNjcmlwdEFsZXJ0KFFX
ZWJGcmFtZUFkYXB0ZXIqLCBjb25zdCBRU3RyaW5nJiBtc2cpIE9WRVJSSURFOwotICAgIHZpcnR1
YWwgYm9vbCBqYXZhU2NyaXB0Q29uZmlybShRV2ViRnJhbWVBZGFwdGVyKiwgY29uc3QgUVN0cmlu
ZyYgbXNnKSBPVkVSUklERTsKLSAgICB2aXJ0dWFsIGJvb2wgamF2YVNjcmlwdFByb21wdChRV2Vi
RnJhbWVBZGFwdGVyKiwgY29uc3QgUVN0cmluZyYgbXNnLCBjb25zdCBRU3RyaW5nJiBkZWZhdWx0
VmFsdWUsIFFTdHJpbmcqIHJlc3VsdCkgT1ZFUlJJREU7Ci0gICAgdmlydHVhbCBib29sIHNob3Vs
ZEludGVycnVwdEphdmFTY3JpcHQoKSBPVkVSUklERTsKLSAgICB2aXJ0dWFsIHZvaWQgcHJpbnRS
ZXF1ZXN0ZWQoUVdlYkZyYW1lQWRhcHRlciopIE9WRVJSSURFOwotICAgIHZpcnR1YWwgdm9pZCBk
YXRhYmFzZVF1b3RhRXhjZWVkZWQoUVdlYkZyYW1lQWRhcHRlciosIGNvbnN0IFFTdHJpbmcmIGRh
dGFiYXNlTmFtZSkgT1ZFUlJJREU7Ci0gICAgdmlydHVhbCB2b2lkIGFwcGxpY2F0aW9uQ2FjaGVR
dW90YUV4Y2VlZGVkKFFXZWJTZWN1cml0eU9yaWdpbiosIHF1aW50NjQgZGVmYXVsdE9yaWdpblF1
b3RhLCBxdWludDY0IHRvdGFsU3BhY2VOZWVkZWQpIE9WRVJSSURFOwotICAgIHZpcnR1YWwgdm9p
ZCBzZXRUb29sVGlwKGNvbnN0IFFTdHJpbmcmKSBPVkVSUklERTsKLSNpZiBVU0UoUVRfTVVMVElN
RURJQSkKLSAgICB2aXJ0dWFsIFFXZWJGdWxsU2NyZWVuVmlkZW9IYW5kbGVyKiBjcmVhdGVGdWxs
U2NyZWVuVmlkZW9IYW5kbGVyKCkgT1ZFUlJJREU7Ci0jZW5kaWYKLSAgICB2aXJ0dWFsIFFXZWJG
cmFtZUFkYXB0ZXIqIG1haW5GcmFtZUFkYXB0ZXIoKSBPVkVSUklERTsKLSAgICB2aXJ0dWFsIFFT
dHJpbmdMaXN0IGNob29zZUZpbGVzKFFXZWJGcmFtZUFkYXB0ZXIqLCBib29sIGFsbG93TXVsdGlw
bGUsIGNvbnN0IFFTdHJpbmdMaXN0JiBzdWdnZXN0ZWRGaWxlTmFtZXMpIE9WRVJSSURFOwotICAg
IHZpcnR1YWwgUUNvbG9yIGNvbG9yU2VsZWN0aW9uUmVxdWVzdGVkKGNvbnN0IFFDb2xvciYgc2Vs
ZWN0ZWRDb2xvcikgT1ZFUlJJREU7Ci0gICAgdmlydHVhbCBRV2ViU2VsZWN0TWV0aG9kKiBjcmVh
dGVTZWxlY3RQb3B1cCgpIE9WRVJSSURFOwotICAgIHZpcnR1YWwgUVJlY3Qgdmlld1JlY3RSZWxh
dGl2ZVRvV2luZG93KCkgT1ZFUlJJREU7Ci0gICAgdmlydHVhbCB2b2lkIGdlb2xvY2F0aW9uUGVy
bWlzc2lvblJlcXVlc3RlZChRV2ViRnJhbWVBZGFwdGVyKikgT1ZFUlJJREU7Ci0gICAgdmlydHVh
bCB2b2lkIGdlb2xvY2F0aW9uUGVybWlzc2lvblJlcXVlc3RDYW5jZWxsZWQoUVdlYkZyYW1lQWRh
cHRlciopIE9WRVJSSURFOwotICAgIHZpcnR1YWwgdm9pZCBub3RpZmljYXRpb25zUGVybWlzc2lv
blJlcXVlc3RlZChRV2ViRnJhbWVBZGFwdGVyKikgT1ZFUlJJREU7Ci0gICAgdmlydHVhbCB2b2lk
IG5vdGlmaWNhdGlvbnNQZXJtaXNzaW9uUmVxdWVzdENhbmNlbGxlZChRV2ViRnJhbWVBZGFwdGVy
KikgT1ZFUlJJREU7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcmVzcG9uZFRvQ2hhbmdlZENvbnRlbnRz
KCkgT1ZFUlJJREU7Ci0gICAgdmlydHVhbCB2b2lkIHJlc3BvbmRUb0NoYW5nZWRTZWxlY3Rpb24o
KSBPVkVSUklERTsKLSAgICB2aXJ0dWFsIHZvaWQgbWljcm9Gb2N1c0NoYW5nZWQoKSBPVkVSUklE
RTsKLSAgICB2aXJ0dWFsIHZvaWQgdHJpZ2dlckNvcHlBY3Rpb24oKSBPVkVSUklERTsKLSAgICB2
aXJ0dWFsIHZvaWQgdHJpZ2dlckFjdGlvbkZvcktleUV2ZW50KFFLZXlFdmVudCopIE9WRVJSSURF
OwotICAgIHZpcnR1YWwgdm9pZCBjbGVhclVuZG9TdGFjaygpIE9WRVJSSURFOwotICAgIHZpcnR1
YWwgYm9vbCBjYW5VbmRvKCkgY29uc3QgT1ZFUlJJREU7Ci0gICAgdmlydHVhbCBib29sIGNhblJl
ZG8oKSBjb25zdCBPVkVSUklERTsKLSAgICB2aXJ0dWFsIHZvaWQgdW5kbygpIE9WRVJSSURFOwot
ICAgIHZpcnR1YWwgdm9pZCByZWRvKCkgT1ZFUlJJREU7Ci0gICAgdmlydHVhbCB2b2lkIGNyZWF0
ZVVuZG9TdGVwKFFTaGFyZWRQb2ludGVyPFVuZG9TdGVwUXQ+KSBPVkVSUklERTsKLSAgICB2aXJ0
dWFsIGNvbnN0IGNoYXIqIGVkaXRvckNvbW1hbmRGb3JLZXlFdmVudChRS2V5RXZlbnQqKSBPVkVS
UklERTsKLQotICAgIHZvaWQgdXBkYXRlTmF2aWdhdGlvbkFjdGlvbnMoKSBPVkVSUklERTsKLQot
ICAgIHZpcnR1YWwgUU9iamVjdCogaW5zcGVjdG9ySGFuZGxlKCkgT1ZFUlJJREU7Ci0gICAgdmly
dHVhbCB2b2lkIHNldEluc3BlY3RvckZyb250ZW5kKFFPYmplY3QqKSBPVkVSUklERTsKLSAgICB2
aXJ0dWFsIHZvaWQgc2V0SW5zcGVjdG9yV2luZG93VGl0bGUoY29uc3QgUVN0cmluZyYpIE9WRVJS
SURFOwotICAgIHZpcnR1YWwgdm9pZCBjcmVhdGVXZWJJbnNwZWN0b3IoUU9iamVjdCoqIGluc3Bl
Y3RvclZpZXcsIFFXZWJQYWdlQWRhcHRlcioqIGluc3BlY3RvclBhZ2UpIE9WRVJSSURFOwotICAg
IHZpcnR1YWwgUVN0cmluZ0xpc3QgbWVudUFjdGlvbnNBc1RleHQoKSBPVkVSUklERTsKLSAgICB2
aXJ0dWFsIHZvaWQgZW1pdFZpZXdwb3J0Q2hhbmdlUmVxdWVzdGVkKCkgT1ZFUlJJREU7Ci0gICAg
dmlydHVhbCBib29sIGFjY2VwdE5hdmlnYXRpb25SZXF1ZXN0KFFXZWJGcmFtZUFkYXB0ZXIqLCBj
b25zdCBRTmV0d29ya1JlcXVlc3QmLCBpbnQgdHlwZSkgT1ZFUlJJREU7Ci0gICAgdmlydHVhbCB2
b2lkIGVtaXRSZXN0b3JlRnJhbWVTdGF0ZVJlcXVlc3RlZChRV2ViRnJhbWVBZGFwdGVyKikgT1ZF
UlJJREU7Ci0gICAgdmlydHVhbCB2b2lkIGVtaXRTYXZlRnJhbWVTdGF0ZVJlcXVlc3RlZChRV2Vi
RnJhbWVBZGFwdGVyKiwgUVdlYkhpc3RvcnlJdGVtKikgT1ZFUlJJREU7Ci0gICAgdmlydHVhbCB2
b2lkIGVtaXREb3dubG9hZFJlcXVlc3RlZChjb25zdCBRTmV0d29ya1JlcXVlc3QmKSBPVkVSUklE
RTsKLSAgICB2aXJ0dWFsIHZvaWQgZW1pdEZyYW1lQ3JlYXRlZChRV2ViRnJhbWVBZGFwdGVyKikg
T1ZFUlJJREU7Ci0gICAgdmlydHVhbCBRU3RyaW5nIHVzZXJBZ2VudEZvclVybChjb25zdCBRVXJs
ICZ1cmwpIGNvbnN0IE9WRVJSSURFIHsgcmV0dXJuIHEtPnVzZXJBZ2VudEZvclVybCh1cmwpOyB9
Ci0gICAgdmlydHVhbCBib29sIHN1cHBvcnRzRXJyb3JQYWdlRXh0ZW5zaW9uKCkgY29uc3QgT1ZF
UlJJREUgeyByZXR1cm4gcS0+c3VwcG9ydHNFeHRlbnNpb24oUVdlYlBhZ2U6OkVycm9yUGFnZUV4
dGVuc2lvbik7IH0KLSAgICB2aXJ0dWFsIGJvb2wgZXJyb3JQYWdlRXh0ZW5zaW9uKEVycm9yUGFn
ZU9wdGlvbiAqLCBFcnJvclBhZ2VSZXR1cm4gKikgT1ZFUlJJREU7Ci0gICAgdmlydHVhbCBRdFBs
dWdpbldpZGdldEFkYXB0ZXIqIGNyZWF0ZVBsdWdpbihjb25zdCBRU3RyaW5nICYsIGNvbnN0IFFV
cmwgJiwgY29uc3QgUVN0cmluZ0xpc3QgJiwgY29uc3QgUVN0cmluZ0xpc3QgJikgT1ZFUlJJREU7
Ci0gICAgdmlydHVhbCBRdFBsdWdpbldpZGdldEFkYXB0ZXIqIGFkYXB0ZXJGb3JXaWRnZXQoUU9i
amVjdCAqKSBjb25zdCBPVkVSUklERTsKLQotICAgIHZvaWQgY3JlYXRlTWFpbkZyYW1lKCk7Ci0j
aWZuZGVmIFFUX05PX0NPTlRFWFRNRU5VCi0gICAgUU1lbnUqIGNyZWF0ZUNvbnRleHRNZW51KGNv
bnN0IFdlYkNvcmU6OkNvbnRleHRNZW51KiB3ZWJjb3JlTWVudSwgY29uc3QgUUxpc3Q8V2ViQ29y
ZTo6Q29udGV4dE1lbnVJdGVtPiogaXRlbXMsIFFCaXRBcnJheSogdmlzaXRlZFdlYkFjdGlvbnMp
OwotI2VuZGlmCi0gICAgdm9pZCBfcV9vbkxvYWRQcm9ncmVzc0NoYW5nZWQoaW50KTsKLSAgICB2
b2lkIF9xX3dlYkFjdGlvblRyaWdnZXJlZChib29sIGNoZWNrZWQpOwotICAgIHZvaWQgX3FfY2xl
YW51cExlYWtNZXNzYWdlcygpOwotICAgIHZvaWQgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpXZWJB
Y3Rpb24gYWN0aW9uKTsKLSAgICB2b2lkIHVwZGF0ZUVkaXRvckFjdGlvbnMoKTsKLQotICAgIHZv
aWQgdGltZXJFdmVudChRVGltZXJFdmVudCopOwotCi0gICAgdm9pZCBtb3VzZU1vdmVFdmVudChR
TW91c2VFdmVudCopOwotICAgIHZvaWQgbW91c2VQcmVzc0V2ZW50KFFNb3VzZUV2ZW50Kik7Ci0g
ICAgdm9pZCBtb3VzZURvdWJsZUNsaWNrRXZlbnQoUU1vdXNlRXZlbnQqKTsKLSAgICB2b2lkIG1v
dXNlVHJpcGxlQ2xpY2tFdmVudChRTW91c2VFdmVudCopOwotICAgIHZvaWQgbW91c2VSZWxlYXNl
RXZlbnQoUU1vdXNlRXZlbnQqKTsKLSNpZm5kZWYgUVRfTk9fQ09OVEVYVE1FTlUKLSAgICB2b2lk
IGNvbnRleHRNZW51RXZlbnQoY29uc3QgUVBvaW50JiBnbG9iYWxQb3MpOwotI2VuZGlmCi0jaWZu
ZGVmIFFUX05PX1dIRUVMRVZFTlQKLSAgICB2b2lkIHdoZWVsRXZlbnQoUVdoZWVsRXZlbnQqKTsK
LSNlbmRpZgotICAgIHZvaWQga2V5UHJlc3NFdmVudChRS2V5RXZlbnQqKTsKLSAgICB2b2lkIGtl
eVJlbGVhc2VFdmVudChRS2V5RXZlbnQqKTsKLSAgICB2b2lkIGZvY3VzSW5FdmVudChRRm9jdXNF
dmVudCopOwotICAgIHZvaWQgZm9jdXNPdXRFdmVudChRRm9jdXNFdmVudCopOwotCi0gICAgdGVt
cGxhdGU8Y2xhc3MgVD4gdm9pZCBkcmFnRW50ZXJFdmVudChUKik7Ci0gICAgdGVtcGxhdGU8Y2xh
c3MgVD4gdm9pZCBkcmFnTGVhdmVFdmVudChUKik7Ci0gICAgdGVtcGxhdGU8Y2xhc3MgVD4gdm9p
ZCBkcmFnTW92ZUV2ZW50KFQqKTsKLSAgICB0ZW1wbGF0ZTxjbGFzcyBUPiB2b2lkIGRyb3BFdmVu
dChUKik7Ci0KLSAgICB2b2lkIGlucHV0TWV0aG9kRXZlbnQoUUlucHV0TWV0aG9kRXZlbnQqKTsK
LQotI2lmbmRlZiBRVF9OT19QUk9QRVJUSUVTCi0gICAgdm9pZCBkeW5hbWljUHJvcGVydHlDaGFu
Z2VFdmVudChRRHluYW1pY1Byb3BlcnR5Q2hhbmdlRXZlbnQqKTsKLSNlbmRpZgotCi0gICAgdm9p
ZCBzaG9ydGN1dE92ZXJyaWRlRXZlbnQoUUtleUV2ZW50Kik7Ci0gICAgdm9pZCBsZWF2ZUV2ZW50
KFFFdmVudCopOwotICAgIHZvaWQgaGFuZGxlU29mdHdhcmVJbnB1dFBhbmVsKFF0OjpNb3VzZUJ1
dHRvbiwgY29uc3QgUVBvaW50Jik7Ci0gICAgYm9vbCBoYW5kbGVTY3JvbGxpbmcoUUtleUV2ZW50
KiwgV2ViQ29yZTo6RnJhbWUqKTsKLQotICAgIC8vIFJldHVybnMgd2hldGhlciB0aGUgZGVmYXVs
dCBhY3Rpb24gd2FzIGNhbmNlbGxlZCBpbiB0aGUgSlMgZXZlbnQgaGFuZGxlcgotICAgIGJvb2wg
dG91Y2hFdmVudChRVG91Y2hFdmVudCopOwotCi0gICAgYm9vbCBnZXN0dXJlRXZlbnQoUUdlc3R1
cmVFdmVudCopOwotCi0gICAgY2xhc3MgVG91Y2hBZGp1c3RlciB7Ci0gICAgcHVibGljOgotICAg
ICAgICBUb3VjaEFkanVzdGVyKHVuc2lnbmVkIHRvcFBhZGRpbmcsIHVuc2lnbmVkIHJpZ2h0UGFk
ZGluZywgdW5zaWduZWQgYm90dG9tUGFkZGluZywgdW5zaWduZWQgbGVmdFBhZGRpbmcpOwotCi0g
ICAgICAgIFdlYkNvcmU6OkludFBvaW50IGZpbmRDYW5kaWRhdGVQb2ludEZvclRvdWNoKGNvbnN0
IFdlYkNvcmU6OkludFBvaW50JiwgV2ViQ29yZTo6RG9jdW1lbnQqKSBjb25zdDsKLQotICAgIHBy
aXZhdGU6Ci0gICAgICAgIHVuc2lnbmVkIG1fdG9wUGFkZGluZzsKLSAgICAgICAgdW5zaWduZWQg
bV9yaWdodFBhZGRpbmc7Ci0gICAgICAgIHVuc2lnbmVkIG1fYm90dG9tUGFkZGluZzsKLSAgICAg
ICAgdW5zaWduZWQgbV9sZWZ0UGFkZGluZzsKLSAgICB9OwotCi0gICAgdm9pZCBhZGp1c3RQb2lu
dEZvckNsaWNraW5nKFFNb3VzZUV2ZW50Kik7Ci0jaWYgIWRlZmluZWQoUVRfTk9fR1JBUEhJQ1NW
SUVXKQotICAgIHZvaWQgYWRqdXN0UG9pbnRGb3JDbGlja2luZyhRR3JhcGhpY3NTY2VuZU1vdXNl
RXZlbnQqKTsKLSNlbmRpZgotCi0gICAgdm9pZCBzZXRJbnNwZWN0b3IoUVdlYkluc3BlY3Rvciop
OwotICAgIFFXZWJJbnNwZWN0b3IqIGdldE9yQ3JlYXRlSW5zcGVjdG9yKCk7Ci0gICAgV2ViQ29y
ZTo6SW5zcGVjdG9yQ29udHJvbGxlciogaW5zcGVjdG9yQ29udHJvbGxlcigpOwotICAgIHF1aW50
MTYgaW5zcGVjdG9yU2VydmVyUG9ydCgpOwotCi0jaWZuZGVmIFFUX05PX1NIT1JUQ1VUCi0gICAg
c3RhdGljIFFXZWJQYWdlOjpXZWJBY3Rpb24gZWRpdG9yQWN0aW9uRm9yS2V5RXZlbnQoUUtleUV2
ZW50KiBldmVudCk7Ci0jZW5kaWYKLSAgICBzdGF0aWMgY29uc3QgY2hhciogZWRpdG9yQ29tbWFu
ZEZvcldlYkFjdGlvbnMoUVdlYlBhZ2U6OldlYkFjdGlvbiBhY3Rpb24pOwotCi0gICAgUVdlYlBh
Z2UgKnE7Ci0gICAgUVBvaW50ZXI8UVdlYkZyYW1lPiBtYWluRnJhbWU7Ci0KLSNpZm5kZWYgUVRf
Tk9fVU5ET1NUQUNLCi0gICAgUVVuZG9TdGFjayAqdW5kb1N0YWNrOwotI2VuZGlmCi0KLSAgICBR
UG9pbnRlcjxRV2lkZ2V0PiB2aWV3OwotCi0gICAgcXVpbnQ2NCBtX3RvdGFsQnl0ZXM7Ci0gICAg
cXVpbnQ2NCBtX2J5dGVzUmVjZWl2ZWQ7Ci0KLSAgICBRUG9pbnQgdHJpcGxlQ2xpY2s7Ci0gICAg
UUJhc2ljVGltZXIgdHJpcGxlQ2xpY2tUaW1lcjsKLQotICAgIGJvb2wgY2xpY2tDYXVzZWRGb2N1
czsKLQotICAgIFFXZWJQYWdlOjpMaW5rRGVsZWdhdGlvblBvbGljeSBsaW5rUG9saWN5OwotCi0g
ICAgUVNpemUgbV92aWV3cG9ydFNpemU7Ci0gICAgUVNpemUgZml4ZWRMYXlvdXRTaXplOwotCi0g
ICAgUVdlYkhpc3RvcnkgaGlzdG9yeTsKLSAgICBRV2ViSGl0VGVzdFJlc3VsdCBoaXRUZXN0UmVz
dWx0OwotI2lmbmRlZiBRVF9OT19DT05URVhUTUVOVQotICAgIFFQb2ludGVyPFFNZW51PiBjdXJy
ZW50Q29udGV4dE1lbnU7Ci0jZW5kaWYKLSAgICBRUGFsZXR0ZSBwYWxldHRlOwotICAgIGJvb2wg
dXNlRml4ZWRMYXlvdXQ7Ci0KLSAgICBRQWN0aW9uICphY3Rpb25zW1FXZWJQYWdlOjpXZWJBY3Rp
b25Db3VudF07Ci0KLSAgICBRV2lkZ2V0KiBpbnNwZWN0b3JGcm9udGVuZDsKLSAgICBRV2ViSW5z
cGVjdG9yKiBpbnNwZWN0b3I7Ci0gICAgYm9vbCBpbnNwZWN0b3JJc0ludGVybmFsT25seTsgLy8g
VHJ1ZSBpZiBjcmVhdGVkIHRocm91Z2ggdGhlIEluc3BlY3QgY29udGV4dCBtZW51IGFjdGlvbgot
ICAgIFF0OjpEcm9wQWN0aW9uIG1fbGFzdERyb3BBY3Rpb247Ci19OwotCi0jZW5kaWYKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJLaXQvcXQvQXBpL3F3ZWJzZWN1cml0eW9yaWdpbi5oIGIvU291cmNl
L1dlYktpdC9xdC9BcGkvcXdlYnNlY3VyaXR5b3JpZ2luLmgKaW5kZXggNzMyODY4MGYzMWM2MmJh
MjMzYmM0OTNhM2M4MDM0N2NmZTcxMDgxZC4uNjFjNDVmMWQ2ZjhkMDBhNjdmN2FjODgzYmI1MzYw
YmIwMDY1YTlhZCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9xdC9BcGkvcXdlYnNlY3VyaXR5
b3JpZ2luLmgKKysrIGIvU291cmNlL1dlYktpdC9xdC9BcGkvcXdlYnNlY3VyaXR5b3JpZ2luLmgK
QEAgLTU5LDcgKzU5LDcgQEAgcHVibGljOgogICAgIFFXZWJTZWN1cml0eU9yaWdpbiAmb3BlcmF0
b3I9KGNvbnN0IFFXZWJTZWN1cml0eU9yaWdpbiYgb3RoZXIpOwogcHJpdmF0ZToKICAgICBmcmll
bmQgY2xhc3MgUVdlYkRhdGFiYXNlOwotICAgIGZyaWVuZCBjbGFzcyBRV2ViRnJhbWU7CisgICAg
ZnJpZW5kIGNsYXNzIFFXZWJGcmFtZUFkYXB0ZXI7CiAgICAgZnJpZW5kIGNsYXNzIFdlYkNvcmU6
OkNocm9tZUNsaWVudFF0OwogICAgIFFXZWJTZWN1cml0eU9yaWdpbihRV2ViU2VjdXJpdHlPcmln
aW5Qcml2YXRlKiBwcml2KTsKIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9BcGkvcXdl
YnZpZXcuY3BwIGIvU291cmNlL1dlYktpdC9xdC9BcGkvcXdlYnZpZXcuY3BwCmRlbGV0ZWQgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAyZWRhNmExOGVmZDE3ODI1ODQ2MmYxNWNiOTI5NTE0ZDhkMDA5
MzIzLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJj
ZS9XZWJLaXQvcXQvQXBpL3F3ZWJ2aWV3LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExMjkgKzAs
MCBAQAotLyoKLSAgICBDb3B5cmlnaHQgKEMpIDIwMDggTm9raWEgQ29ycG9yYXRpb24gYW5kL29y
IGl0cyBzdWJzaWRpYXJ5KC1pZXMpCi0gICAgQ29weXJpZ2h0IChDKSAyMDA4IEhvbGdlciBIYW5z
IFBldGVyIEZyZXl0aGVyCi0gICAgQ29weXJpZ2h0IChDKSAyMDA5IEdpcmlzaCBSYW1ha3Jpc2hu
YW4gPGdpcmlzaEBmb3J3YXJkYmlhcy5pbj4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNv
ZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5k
ZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vu
c2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgot
ICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0
ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9w
ZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsg
d2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZ
IG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBM
aWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlv
dSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwg
UHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxl
IENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZv
dW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCi0gICAgQm9z
dG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCi0qLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5j
bHVkZSAicXdlYnZpZXcuaCIKLQotI2luY2x1ZGUgIlBhZ2UuaCIKLSNpbmNsdWRlICJRV2ViUGFn
ZUNsaWVudC5oIgotI2luY2x1ZGUgIlNldHRpbmdzLmgiCi0jaW5jbHVkZSAicXdlYmZyYW1lLmgi
Ci0jaW5jbHVkZSAicXdlYnBhZ2VfcC5oIgotI2luY2x1ZGUgInFiaXRtYXAuaCIKLSNpbmNsdWRl
ICJxZXZlbnQuaCIKLSNpbmNsdWRlICJxcGFpbnRlci5oIgotI2lmIEhBVkUoUVRQUklOVFNVUFBP
UlQpCi0jaW5jbHVkZSAicXByaW50ZXIuaCIKLSNlbmRpZgotI2luY2x1ZGUgInFkaXIuaCIKLSNp
bmNsdWRlICJxZmlsZS5oIgotI2lmbmRlZiBRVF9OT19BQ0NFU1NJQklMSVRZCi0jaW5jbHVkZSAi
cXdlYnZpZXdhY2Nlc3NpYmxlX3AuaCIKLSNlbmRpZgotCi1jbGFzcyBRV2ViVmlld1ByaXZhdGUg
ewotcHVibGljOgotICAgIFFXZWJWaWV3UHJpdmF0ZShRV2ViVmlldyAqdmlldykKLSAgICAgICAg
OiB2aWV3KHZpZXcpCi0gICAgICAgICwgcGFnZSgwKQotICAgICAgICAsIHJlbmRlckhpbnRzKFFQ
YWludGVyOjpUZXh0QW50aWFsaWFzaW5nIHwgUVBhaW50ZXI6OlNtb290aFBpeG1hcFRyYW5zZm9y
bSkKLSAgICB7Ci0gICAgICAgIFFfQVNTRVJUKHZpZXcpOwotICAgIH0KLQotICAgIHZpcnR1YWwg
flFXZWJWaWV3UHJpdmF0ZSgpOwotCi0gICAgdm9pZCBfcV9wYWdlRGVzdHJveWVkKCk7Ci0gICAg
dm9pZCBkZXRhY2hDdXJyZW50UGFnZSgpOwotCi0gICAgUVdlYlZpZXcgKnZpZXc7Ci0gICAgUVdl
YlBhZ2UgKnBhZ2U7Ci0KLSAgICBRUGFpbnRlcjo6UmVuZGVySGludHMgcmVuZGVySGludHM7Ci19
OwotCi1RV2ViVmlld1ByaXZhdGU6On5RV2ViVmlld1ByaXZhdGUoKQotewotICAgIGRldGFjaEN1
cnJlbnRQYWdlKCk7Ci19Ci0KLXZvaWQgUVdlYlZpZXdQcml2YXRlOjpfcV9wYWdlRGVzdHJveWVk
KCkKLXsKLSAgICBwYWdlID0gMDsKLSAgICB2aWV3LT5zZXRQYWdlKDApOwotfQotCi0vKiEKLSAg
ICBcY2xhc3MgUVdlYlZpZXcKLSAgICBcc2luY2UgNC40Ci0gICAgXGJyaWVmIFRoZSBRV2ViVmll
dyBjbGFzcyBwcm92aWRlcyBhIHdpZGdldCB0aGF0IGlzIHVzZWQgdG8gdmlldyBhbmQgZWRpdAot
ICAgIHdlYiBkb2N1bWVudHMuCi0gICAgXGluZ3JvdXAgYWR2YW5jZWQKLQotICAgIFxpbm1vZHVs
ZSBRdFdlYktpdAotCi0gICAgUVdlYlZpZXcgaXMgdGhlIG1haW4gd2lkZ2V0IGNvbXBvbmVudCBv
ZiB0aGUgUXRXZWJLaXQgd2ViIGJyb3dzaW5nIG1vZHVsZS4KLSAgICBJdCBjYW4gYmUgdXNlZCBp
biB2YXJpb3VzIGFwcGxpY2F0aW9ucyB0byBkaXNwbGF5IHdlYiBjb250ZW50IGxpdmUgZnJvbSB0
aGUKLSAgICBJbnRlcm5ldC4KLQotICAgIFRoZSBpbWFnZSBiZWxvdyBzaG93cyBRV2ViVmlldyBw
cmV2aWV3ZWQgaW4gXFFEIHdpdGggYSBOb2tpYSB3ZWJzaXRlLgotCi0gICAgXGltYWdlIHF3ZWJ2
aWV3LXVybC5wbmcKLQotICAgIEEgd2ViIHNpdGUgY2FuIGJlIGxvYWRlZCBvbnRvIFFXZWJWaWV3
IHdpdGggdGhlIGxvYWQoKSBmdW5jdGlvbi4gTGlrZSBhbGwKLSAgICBRdCB3aWRnZXRzLCB0aGUg
c2hvdygpIGZ1bmN0aW9uIG11c3QgYmUgaW52b2tlZCBpbiBvcmRlciB0byBkaXNwbGF5Ci0gICAg
UVdlYlZpZXcuIFRoZSBzbmlwcGV0IGJlbG93IGlsbHVzdHJhdGVzIHRoaXM6Ci0KLSAgICBcc25p
cHBldCB3ZWJraXRzbmlwcGV0cy9zaW1wbGUvbWFpbi5jcHAgVXNpbmcgUVdlYlZpZXcKLQotICAg
IEFsdGVybmF0aXZlbHksIHNldFVybCgpIGNhbiBhbHNvIGJlIHVzZWQgdG8gbG9hZCBhIHdlYiBz
aXRlLiBJZiB5b3UgaGF2ZQotICAgIHRoZSBIVE1MIGNvbnRlbnQgcmVhZGlseSBhdmFpbGFibGUs
IHlvdSBjYW4gdXNlIHNldEh0bWwoKSBpbnN0ZWFkLgotCi0gICAgVGhlIGxvYWRTdGFydGVkKCkg
c2lnbmFsIGlzIGVtaXR0ZWQgd2hlbiB0aGUgdmlldyBiZWdpbnMgbG9hZGluZy4gVGhlCi0gICAg
bG9hZFByb2dyZXNzKCkgc2lnbmFsLCBvbiB0aGUgb3RoZXIgaGFuZCwgaXMgZW1pdHRlZCB3aGVu
ZXZlciBhbiBlbGVtZW50IG9mCi0gICAgdGhlIHdlYiB2aWV3IGNvbXBsZXRlcyBsb2FkaW5nLCBz
dWNoIGFzIGFuIGVtYmVkZGVkIGltYWdlLCBhIHNjcmlwdCwgZXRjLgotICAgIEZpbmFsbHksIHRo
ZSBsb2FkRmluaXNoZWQoKSBzaWduYWwgaXMgZW1pdHRlZCB3aGVuIHRoZSB2aWV3IGhhcyBsb2Fk
ZWQKLSAgICBjb21wbGV0ZWx5LiBJdCdzIGFyZ3VtZW50IC0gZWl0aGVyIFxjIHRydWUgb3IgXGMg
ZmFsc2UgLSBpbmRpY2F0ZXMKLSAgICBsb2FkIHN1Y2Nlc3Mgb3IgZmFpbHVyZS4KLQotICAgIFRo
ZSBwYWdlKCkgZnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHdlYiBwYWdlIG9iamVj
dC4gU2VlCi0gICAgXGx7RWxlbWVudHMgb2YgUVdlYlZpZXd9IGZvciBhbiBleHBsYW5hdGlvbiBv
ZiBob3cgdGhlIHdlYiBwYWdlCi0gICAgaXMgcmVsYXRlZCB0byB0aGUgdmlldy4gVG8gbW9kaWZ5
IHlvdXIgd2ViIHZpZXcncyBzZXR0aW5ncywgeW91IGNhbiBhY2Nlc3MKLSAgICB0aGUgUVdlYlNl
dHRpbmdzIG9iamVjdCB3aXRoIHRoZSBzZXR0aW5ncygpIGZ1bmN0aW9uLiBXaXRoIFFXZWJTZXR0
aW5ncywKLSAgICB5b3UgY2FuIGNoYW5nZSB0aGUgZGVmYXVsdCBmb250cywgZW5hYmxlIG9yIGRp
c2FibGUgZmVhdHVyZXMgc3VjaCBhcwotICAgIEphdmFTY3JpcHQgYW5kIHBsdWdpbnMuCi0KLSAg
ICBUaGUgdGl0bGUgb2YgYW4gSFRNTCBkb2N1bWVudCBjYW4gYmUgYWNjZXNzZWQgd2l0aCB0aGUg
dGl0bGUoKSBwcm9wZXJ0eS4KLSAgICBBZGRpdGlvbmFsbHksIGEgd2ViIHNpdGUgbWF5IGFsc28g
c3BlY2lmeSBhbiBpY29uLCB3aGljaCBjYW4gYmUgYWNjZXNzZWQKLSAgICB1c2luZyB0aGUgaWNv
bigpIHByb3BlcnR5LiBJZiB0aGUgdGl0bGUgb3IgdGhlIGljb24gY2hhbmdlcywgdGhlIGNvcnJl
c3BvbmRpbmcKLSAgICB0aXRsZUNoYW5nZWQoKSBhbmQgaWNvbkNoYW5nZWQoKSBzaWduYWxzIHdp
bGwgYmUgZW1pdHRlZC4gVGhlCi0gICAgdGV4dFNpemVNdWx0aXBsaWVyKCkgcHJvcGVydHkgY2Fu
IGJlIHVzZWQgdG8gY2hhbmdlIHRoZSBvdmVyYWxsIHNpemUgb2YKLSAgICB0aGUgdGV4dCBkaXNw
bGF5ZWQgaW4gdGhlIHdlYiB2aWV3LgotCi0gICAgSWYgeW91IHJlcXVpcmUgYSBjdXN0b20gY29u
dGV4dCBtZW51LCB5b3UgY2FuIGltcGxlbWVudCBpdCBieSByZWltcGxlbWVudGluZwotICAgIFxs
e1FXaWRnZXQ6On17Y29udGV4dE1lbnVFdmVudCgpfSBhbmQgcG9wdWxhdGluZyB5b3VyIFFNZW51
IHdpdGggdGhlIGFjdGlvbnMKLSAgICBvYnRhaW5lZCBmcm9tIHBhZ2VBY3Rpb24oKS4gTW9yZSBm
dW5jdGlvbmFsaXR5IHN1Y2ggYXMgcmVsb2FkaW5nIHRoZSB2aWV3LAotICAgIGNvcHlpbmcgc2Vs
ZWN0ZWQgdGV4dCB0byB0aGUgY2xpcGJvYXJkLCBvciBwYXN0aW5nIGludG8gdGhlIHZpZXcsIGlz
IGFsc28KLSAgICBlbmNhcHN1bGF0ZWQgd2l0aGluIHRoZSBRQWN0aW9uIG9iamVjdHMgcmV0dXJu
ZWQgYnkgcGFnZUFjdGlvbigpLiBUaGVzZQotICAgIGFjdGlvbnMgY2FuIGJlIHByb2dyYW1tYXRp
Y2FsbHkgdHJpZ2dlcmVkIHVzaW5nIHRyaWdnZXJQYWdlQWN0aW9uKCkuCi0gICAgQWx0ZXJuYXRp
dmVseSwgdGhlIGFjdGlvbnMgY2FuIGJlIGFkZGVkIHRvIGEgdG9vbGJhciBvciBhIG1lbnUgZGly
ZWN0bHkuCi0gICAgUVdlYlZpZXcgbWFpbnRhaW5zIHRoZSBzdGF0ZSBvZiB0aGUgcmV0dXJuZWQg
YWN0aW9ucyBidXQgYWxsb3dzCi0gICAgbW9kaWZpY2F0aW9uIG9mIGFjdGlvbiBwcm9wZXJ0aWVz
IHN1Y2ggYXMgXGx7UUFjdGlvbjo6fXt0ZXh0fSBvcgotICAgIFxse1FBY3Rpb246On17aWNvbn0u
Ci0KLSAgICBBIFFXZWJWaWV3IGNhbiBiZSBwcmludGVkIG9udG8gYSBRUHJpbnRlciB1c2luZyB0
aGUgcHJpbnQoKSBmdW5jdGlvbi4KLSAgICBUaGlzIGZ1bmN0aW9uIGlzIG1hcmtlZCBhcyBhIHNs
b3QgYW5kIGNhbiBiZSBjb252ZW5pZW50bHkgY29ubmVjdGVkIHRvCi0gICAgXGx7UVByaW50UHJl
dmlld0RpYWxvZ30ncyBcbHtRUHJpbnRQcmV2aWV3RGlhbG9nOjp9e3BhaW50UmVxdWVzdGVkKCl9
Ci0gICAgc2lnbmFsLgotCi0gICAgSWYgeW91IHdhbnQgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB3
ZWIgc2l0ZXMgdGhhdCBhbGxvdyB0aGUgdXNlciB0byBvcGVuCi0gICAgbmV3IHdpbmRvd3MsIHN1
Y2ggYXMgcG9wLXVwIHdpbmRvd3MsIHlvdSBjYW4gc3ViY2xhc3MgUVdlYlZpZXcgYW5kCi0gICAg
cmVpbXBsZW1lbnQgdGhlIGNyZWF0ZVdpbmRvdygpIGZ1bmN0aW9uLgotCi0gICAgXHNlY3Rpb24x
IEVsZW1lbnRzIG9mIFFXZWJWaWV3Ci0KLSAgICBRV2ViVmlldyBjb25zaXN0cyBvZiBvdGhlciBv
YmplY3RzIHN1Y2ggYXMgUVdlYkZyYW1lIGFuZCBRV2ViUGFnZS4gVGhlCi0gICAgZmxvd2NoYXJ0
IGJlbG93IHNob3dzIHRoZXNlIGVsZW1lbnRzIGFyZSByZWxhdGVkLgotCi0gICAgXGltYWdlIHF3
ZWJ2aWV3LWRpYWdyYW0ucG5nCi0KLSAgICBcbm90ZSBJdCBpcyBwb3NzaWJsZSB0byB1c2UgUVdl
YlBhZ2UgYW5kIFFXZWJGcmFtZSwgd2l0aG91dCB1c2luZyBRV2ViVmlldywKLSAgICBpZiB5b3Ug
ZG8gbm90IHJlcXVpcmUgUVdpZGdldCBhdHRyaWJ1dGVzLiBOZXZlcnRoZWxlc3MsIFF0V2ViS2l0
IGRlcGVuZHMKLSAgICBvbiBRdEd1aSwgc28geW91IHNob3VsZCB1c2UgYSBRQXBwbGljYXRpb24g
aW5zdGVhZCBvZiBRQ29yZUFwcGxpY2F0aW9uLgotCi0gICAgXHNhIHtQcmV2aWV3ZXIgRXhhbXBs
ZX0sIHtXZWIgQnJvd3Nlcn0sIHtGb3JtIEV4dHJhY3RvciBFeGFtcGxlfSwKLSAgICB7R29vZ2xl
IENoYXQgRXhhbXBsZX0sIHtGYW5jeSBCcm93c2VyIEV4YW1wbGV9Ci0qLwotCi0jaWZuZGVmIFFU
X05PX0FDQ0VTU0lCSUxJVFkKLXN0YXRpYyBRQWNjZXNzaWJsZUludGVyZmFjZSogYWNjZXNzaWJs
ZUludGVyZmFjZUZhY3RvcnkoY29uc3QgUVN0cmluZyYga2V5LCBRT2JqZWN0KiBvYmplY3QpCi17
Ci0gICAgUV9VTlVTRUQoa2V5KQotCi0gICAgaWYgKFFXZWJQYWdlKiBwYWdlID0gcW9iamVjdF9j
YXN0PFFXZWJQYWdlKj4ob2JqZWN0KSkKLSAgICAgICAgcmV0dXJuIG5ldyBRV2ViUGFnZUFjY2Vz
c2libGUocGFnZSk7Ci0gICAgaWYgKFFXZWJWaWV3KiB2aWV3ID0gcW9iamVjdF9jYXN0PFFXZWJW
aWV3Kj4ob2JqZWN0KSkKLSAgICAgICAgcmV0dXJuIG5ldyBRV2ViVmlld0FjY2Vzc2libGUodmll
dyk7Ci0gICAgaWYgKFFXZWJGcmFtZSogZnJhbWUgPSBxb2JqZWN0X2Nhc3Q8UVdlYkZyYW1lKj4o
b2JqZWN0KSkKLSAgICAgICAgcmV0dXJuIG5ldyBRV2ViRnJhbWVBY2Nlc3NpYmxlKGZyYW1lKTsK
LSAgICByZXR1cm4gMDsKLX0KLSNlbmRpZgotCi0vKiEKLSAgICBDb25zdHJ1Y3RzIGFuIGVtcHR5
IFFXZWJWaWV3IHdpdGggcGFyZW50IFxhIHBhcmVudC4KLQotICAgIFxzYSBsb2FkKCkKLSovCi1R
V2ViVmlldzo6UVdlYlZpZXcoUVdpZGdldCAqcGFyZW50KQotICAgIDogUVdpZGdldChwYXJlbnQp
Ci17Ci0gICAgZCA9IG5ldyBRV2ViVmlld1ByaXZhdGUodGhpcyk7Ci0KLSNpZiAhZGVmaW5lZChR
X1dTX1FXUykKLSAgICBzZXRBdHRyaWJ1dGUoUXQ6OldBX0lucHV0TWV0aG9kRW5hYmxlZCk7Ci0j
ZW5kaWYKLQotICAgIHNldEF0dHJpYnV0ZShRdDo6V0FfQWNjZXB0VG91Y2hFdmVudHMpOwotICAg
IHNldEFjY2VwdERyb3BzKHRydWUpOwotCi0gICAgc2V0TW91c2VUcmFja2luZyh0cnVlKTsKLSAg
ICBzZXRGb2N1c1BvbGljeShRdDo6V2hlZWxGb2N1cyk7Ci0KLSNpZm5kZWYgUVRfTk9fQUNDRVNT
SUJJTElUWQotICAgIFFBY2Nlc3NpYmxlOjppbnN0YWxsRmFjdG9yeShhY2Nlc3NpYmxlSW50ZXJm
YWNlRmFjdG9yeSk7Ci0jZW5kaWYKLX0KLQotLyohCi0gICAgRGVzdHJveXMgdGhlIHdlYiB2aWV3
LgotKi8KLVFXZWJWaWV3Ojp+UVdlYlZpZXcoKQotewotICAgIGRlbGV0ZSBkOwotfQotCi0vKiEK
LSAgICBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgdW5kZXJseWluZyB3ZWIgcGFnZS4KLQotICAg
IFxzYSBzZXRQYWdlKCkKLSovCi1RV2ViUGFnZSAqUVdlYlZpZXc6OnBhZ2UoKSBjb25zdAotewot
ICAgIGlmICghZC0+cGFnZSkgewotICAgICAgICBRV2ViVmlldyAqdGhhdCA9IGNvbnN0X2Nhc3Q8
UVdlYlZpZXcgKj4odGhpcyk7Ci0gICAgICAgIHRoYXQtPnNldFBhZ2UobmV3IFFXZWJQYWdlKHRo
YXQpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGQtPnBhZ2U7Ci19Ci0KLXZvaWQgUVdlYlZpZXdQcml2
YXRlOjpkZXRhY2hDdXJyZW50UGFnZSgpCi17Ci0gICAgaWYgKCFwYWdlKQotICAgICAgICByZXR1
cm47Ci0KLSAgICBwYWdlLT5kLT52aWV3ID0gMDsKLQotICAgIC8vIGlmIHRoZSBwYWdlIGNsaWVu
dCBpcyB0aGUgc3BlY2lhbCBjbGllbnQgY29uc3RydWN0ZWQgZm9yCi0gICAgLy8gZGVsZWdhdGlu
ZyB0aGUgcmVzcG9uc2liaWxpdGllcyB0byBhIFFXaWRnZXQsIHdlIG5lZWQKLSAgICAvLyB0byBk
ZXN0cm95IGl0LgotCi0gICAgaWYgKHBhZ2UtPmQtPmNsaWVudCAmJiBwYWdlLT5kLT5jbGllbnQt
PmlzUVdpZGdldENsaWVudCgpKQotICAgICAgICBwYWdlLT5kLT5jbGllbnQucmVzZXQoKTsKLQot
ICAgIHBhZ2UtPmQtPmNsaWVudC50YWtlKCk7Ci0KLSAgICAvLyBpZiB0aGUgcGFnZSB3YXMgY3Jl
YXRlZCBieSB1cywgd2Ugb3duIGl0IGFuZCBuZWVkIHRvCi0gICAgLy8gZGVzdHJveSBpdCBhcyB3
ZWxsLgotCi0gICAgaWYgKHBhZ2UtPnBhcmVudCgpID09IHZpZXcpCi0gICAgICAgIGRlbGV0ZSBw
YWdlOwotICAgIGVsc2UKLSAgICAgICAgcGFnZS0+ZGlzY29ubmVjdCh2aWV3KTsKLQotICAgIHBh
Z2UgPSAwOwotfQotCi0vKiEKLSAgICBNYWtlcyBcYSBwYWdlIHRoZSBuZXcgd2ViIHBhZ2Ugb2Yg
dGhlIHdlYiB2aWV3LgotCi0gICAgVGhlIHBhcmVudCBRT2JqZWN0IG9mIHRoZSBwcm92aWRlZCBw
YWdlIHJlbWFpbnMgdGhlIG93bmVyCi0gICAgb2YgdGhlIG9iamVjdC4gSWYgdGhlIGN1cnJlbnQg
cGFnZSBpcyBhIGNoaWxkIG9mIHRoZSB3ZWIKLSAgICB2aWV3LCBpdCB3aWxsIGJlIGRlbGV0ZWQu
Ci0KLSAgICBcc2EgcGFnZSgpCi0qLwotdm9pZCBRV2ViVmlldzo6c2V0UGFnZShRV2ViUGFnZSog
cGFnZSkKLXsKLSAgICBpZiAoZC0+cGFnZSA9PSBwYWdlKQotICAgICAgICByZXR1cm47Ci0KLSAg
ICBkLT5kZXRhY2hDdXJyZW50UGFnZSgpOwotICAgIGQtPnBhZ2UgPSBwYWdlOwotCi0gICAgaWYg
KGQtPnBhZ2UpIHsKLSAgICAgICAgZC0+cGFnZS0+c2V0Vmlldyh0aGlzKTsKLSAgICAgICAgZC0+
cGFnZS0+c2V0UGFsZXR0ZShwYWxldHRlKCkpOwotICAgICAgICAvLyAjIyMjIGNvbm5lY3Qgc2ln
bmFscwotICAgICAgICBRV2ViRnJhbWUgKm1haW5GcmFtZSA9IGQtPnBhZ2UtPm1haW5GcmFtZSgp
OwotICAgICAgICBjb25uZWN0KG1haW5GcmFtZSwgU0lHTkFMKHRpdGxlQ2hhbmdlZChRU3RyaW5n
KSksCi0gICAgICAgICAgICAgICAgdGhpcywgU0lHTkFMKHRpdGxlQ2hhbmdlZChRU3RyaW5nKSkp
OwotICAgICAgICBjb25uZWN0KG1haW5GcmFtZSwgU0lHTkFMKGljb25DaGFuZ2VkKCkpLAotICAg
ICAgICAgICAgICAgIHRoaXMsIFNJR05BTChpY29uQ2hhbmdlZCgpKSk7Ci0gICAgICAgIGNvbm5l
Y3QobWFpbkZyYW1lLCBTSUdOQUwodXJsQ2hhbmdlZChRVXJsKSksCi0gICAgICAgICAgICAgICAg
dGhpcywgU0lHTkFMKHVybENoYW5nZWQoUVVybCkpKTsKLQotICAgICAgICBjb25uZWN0KGQtPnBh
Z2UsIFNJR05BTChsb2FkU3RhcnRlZCgpKSwKLSAgICAgICAgICAgICAgICB0aGlzLCBTSUdOQUwo
bG9hZFN0YXJ0ZWQoKSkpOwotICAgICAgICBjb25uZWN0KGQtPnBhZ2UsIFNJR05BTChsb2FkUHJv
Z3Jlc3MoaW50KSksCi0gICAgICAgICAgICAgICAgdGhpcywgU0lHTkFMKGxvYWRQcm9ncmVzcyhp
bnQpKSk7Ci0gICAgICAgIGNvbm5lY3QoZC0+cGFnZSwgU0lHTkFMKGxvYWRGaW5pc2hlZChib29s
KSksCi0gICAgICAgICAgICAgICAgdGhpcywgU0lHTkFMKGxvYWRGaW5pc2hlZChib29sKSkpOwot
ICAgICAgICBjb25uZWN0KGQtPnBhZ2UsIFNJR05BTChzdGF0dXNCYXJNZXNzYWdlKFFTdHJpbmcp
KSwKLSAgICAgICAgICAgICAgICB0aGlzLCBTSUdOQUwoc3RhdHVzQmFyTWVzc2FnZShRU3RyaW5n
KSkpOwotICAgICAgICBjb25uZWN0KGQtPnBhZ2UsIFNJR05BTChsaW5rQ2xpY2tlZChRVXJsKSks
Ci0gICAgICAgICAgICAgICAgdGhpcywgU0lHTkFMKGxpbmtDbGlja2VkKFFVcmwpKSk7Ci0gICAg
ICAgIGNvbm5lY3QoZC0+cGFnZSwgU0lHTkFMKHNlbGVjdGlvbkNoYW5nZWQoKSksCi0gICAgICAg
ICAgICAgICAgdGhpcywgU0lHTkFMKHNlbGVjdGlvbkNoYW5nZWQoKSkpOwotCi0gICAgICAgIGNv
bm5lY3QoZC0+cGFnZSwgU0lHTkFMKG1pY3JvRm9jdXNDaGFuZ2VkKCkpLAotICAgICAgICAgICAg
ICAgIHRoaXMsIFNMT1QodXBkYXRlTWljcm9Gb2N1cygpKSk7Ci0gICAgICAgIGNvbm5lY3QoZC0+
cGFnZSwgU0lHTkFMKGRlc3Ryb3llZCgpKSwKLSAgICAgICAgICAgICAgICB0aGlzLCBTTE9UKF9x
X3BhZ2VEZXN0cm95ZWQoKSkpOwotICAgIH0KLSAgICBzZXRBdHRyaWJ1dGUoUXQ6OldBX09wYXF1
ZVBhaW50RXZlbnQsIGQtPnBhZ2UpOwotICAgIHVwZGF0ZSgpOwotfQotCi0vKiEKLSAgICBMb2Fk
cyB0aGUgc3BlY2lmaWVkIFxhIHVybCBhbmQgZGlzcGxheXMgaXQuCi0KLSAgICBcbm90ZSBUaGUg
dmlldyByZW1haW5zIHRoZSBzYW1lIHVudGlsIGVub3VnaCBkYXRhIGhhcyBhcnJpdmVkIHRvIGRp
c3BsYXkgdGhlIG5ldyBcYSB1cmwuCi0KLSAgICBcc2Egc2V0VXJsKCksIHVybCgpLCB1cmxDaGFu
Z2VkKCksIFFVcmw6OmZyb21Vc2VySW5wdXQoKQotKi8KLXZvaWQgUVdlYlZpZXc6OmxvYWQoY29u
c3QgUVVybCAmdXJsKQotewotICAgIHBhZ2UoKS0+bWFpbkZyYW1lKCktPmxvYWQodXJsKTsKLX0K
LQotLyohCi0gICAgXGZuIHZvaWQgUVdlYlZpZXc6OmxvYWQoY29uc3QgUU5ldHdvcmtSZXF1ZXN0
ICZyZXF1ZXN0LCBRTmV0d29ya0FjY2Vzc01hbmFnZXI6Ok9wZXJhdGlvbiBvcGVyYXRpb24sIGNv
bnN0IFFCeXRlQXJyYXkgJmJvZHkpCi0KLSAgICBMb2FkcyBhIG5ldHdvcmsgcmVxdWVzdCwgXGEg
cmVxdWVzdCwgdXNpbmcgdGhlIG1ldGhvZCBzcGVjaWZpZWQgaW4gXGEgb3BlcmF0aW9uLgotCi0g
ICAgXGEgYm9keSBpcyBvcHRpb25hbCBhbmQgaXMgb25seSB1c2VkIGZvciBQT1NUIG9wZXJhdGlv
bnMuCi0KLSAgICBcbm90ZSBUaGUgdmlldyByZW1haW5zIHRoZSBzYW1lIHVudGlsIGVub3VnaCBk
YXRhIGhhcyBhcnJpdmVkIHRvIGRpc3BsYXkgdGhlIG5ldyB1cmwuCi0KLSAgICBcc2EgdXJsKCks
IHVybENoYW5nZWQoKQotKi8KLQotdm9pZCBRV2ViVmlldzo6bG9hZChjb25zdCBRTmV0d29ya1Jl
cXVlc3QgJnJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgIFFOZXR3b3JrQWNjZXNzTWFuYWdl
cjo6T3BlcmF0aW9uIG9wZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgUUJ5dGVB
cnJheSAmYm9keSkKLXsKLSAgICBwYWdlKCktPm1haW5GcmFtZSgpLT5sb2FkKHJlcXVlc3QsIG9w
ZXJhdGlvbiwgYm9keSk7Ci19Ci0KLS8qIQotICAgIFNldHMgdGhlIGNvbnRlbnQgb2YgdGhlIHdl
YiB2aWV3IHRvIHRoZSBzcGVjaWZpZWQgXGEgaHRtbC4KLQotICAgIEV4dGVybmFsIG9iamVjdHMg
c3VjaCBhcyBzdHlsZXNoZWV0cyBvciBpbWFnZXMgcmVmZXJlbmNlZCBpbiB0aGUgSFRNTAotICAg
IGRvY3VtZW50IGFyZSBsb2NhdGVkIHJlbGF0aXZlIHRvIFxhIGJhc2VVcmwuCi0KLSAgICBUaGUg
XGEgaHRtbCBpcyBsb2FkZWQgaW1tZWRpYXRlbHk7IGV4dGVybmFsIG9iamVjdHMgYXJlIGxvYWRl
ZCBhc3luY2hyb25vdXNseS4KLQotICAgIFdoZW4gdXNpbmcgdGhpcyBtZXRob2QsIFdlYktpdCBh
c3N1bWVzIHRoYXQgZXh0ZXJuYWwgcmVzb3VyY2VzIHN1Y2ggYXMKLSAgICBKYXZhU2NyaXB0IHBy
b2dyYW1zIG9yIHN0eWxlIHNoZWV0cyBhcmUgZW5jb2RlZCBpbiBVVEYtOCB1bmxlc3Mgb3RoZXJ3
aXNlCi0gICAgc3BlY2lmaWVkLiBGb3IgZXhhbXBsZSwgdGhlIGVuY29kaW5nIG9mIGFuIGV4dGVy
bmFsIHNjcmlwdCBjYW4gYmUgc3BlY2lmaWVkCi0gICAgdGhyb3VnaCB0aGUgY2hhcnNldCBhdHRy
aWJ1dGUgb2YgdGhlIEhUTUwgc2NyaXB0IHRhZy4gQWx0ZXJuYXRpdmVseSwgdGhlCi0gICAgZW5j
b2RpbmcgY2FuIGFsc28gYmUgc3BlY2lmaWVkIGJ5IHRoZSB3ZWIgc2VydmVyLgotCi0gICAgVGhp
cyBpcyBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIGVxdWl2YWxlbnQgdG8gc2V0Q29udGVudChodG1s
LCAidGV4dC9odG1sIiwgYmFzZVVybCkuCi0KLSAgICBcd2FybmluZyBUaGlzIGZ1bmN0aW9uIHdv
cmtzIG9ubHkgZm9yIEhUTUwsIGZvciBvdGhlciBtaW1lIHR5cGVzIChpLmUuIFhIVE1MLCBTVkcp
Ci0gICAgc2V0Q29udGVudCgpIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCi0KLSAgICBcc2EgbG9h
ZCgpLCBzZXRDb250ZW50KCksIFFXZWJGcmFtZTo6dG9IdG1sKCksIFFXZWJGcmFtZTo6c2V0Q29u
dGVudCgpCi0qLwotdm9pZCBRV2ViVmlldzo6c2V0SHRtbChjb25zdCBRU3RyaW5nICZodG1sLCBj
b25zdCBRVXJsICZiYXNlVXJsKQotewotICAgIHBhZ2UoKS0+bWFpbkZyYW1lKCktPnNldEh0bWwo
aHRtbCwgYmFzZVVybCk7Ci19Ci0KLS8qIQotICAgIFNldHMgdGhlIGNvbnRlbnQgb2YgdGhlIHdl
YiB2aWV3IHRvIHRoZSBzcGVjaWZpZWQgY29udGVudCBcYSBkYXRhLiBJZiB0aGUgXGEgbWltZVR5
cGUgYXJndW1lbnQKLSAgICBpcyBlbXB0eSBpdCBpcyBjdXJyZW50bHkgYXNzdW1lZCB0aGF0IHRo
ZSBjb250ZW50IGlzIEhUTUwgYnV0IGluIGZ1dHVyZSB2ZXJzaW9ucyB3ZSBtYXkgaW50cm9kdWNl
Ci0gICAgYXV0by1kZXRlY3Rpb24uCi0KLSAgICBFeHRlcm5hbCBvYmplY3RzIHJlZmVyZW5jZWQg
aW4gdGhlIGNvbnRlbnQgYXJlIGxvY2F0ZWQgcmVsYXRpdmUgdG8gXGEgYmFzZVVybC4KLQotICAg
IFRoZSBcYSBkYXRhIGlzIGxvYWRlZCBpbW1lZGlhdGVseTsgZXh0ZXJuYWwgb2JqZWN0cyBhcmUg
bG9hZGVkIGFzeW5jaHJvbm91c2x5LgotCi0gICAgXHNhIGxvYWQoKSwgc2V0SHRtbCgpLCBRV2Vi
RnJhbWU6OnRvSHRtbCgpCi0qLwotdm9pZCBRV2ViVmlldzo6c2V0Q29udGVudChjb25zdCBRQnl0
ZUFycmF5ICZkYXRhLCBjb25zdCBRU3RyaW5nICZtaW1lVHlwZSwgY29uc3QgUVVybCAmYmFzZVVy
bCkKLXsKLSAgICBwYWdlKCktPm1haW5GcmFtZSgpLT5zZXRDb250ZW50KGRhdGEsIG1pbWVUeXBl
LCBiYXNlVXJsKTsKLX0KLQotLyohCi0gICAgUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHZpZXcn
cyBoaXN0b3J5IG9mIG5hdmlnYXRlZCB3ZWIgcGFnZXMuCi0KLSAgICBJdCBpcyBlcXVpdmFsZW50
IHRvCi0KLSAgICBcc25pcHBldCB3ZWJraXRzbmlwcGV0cy9xdHdlYmtpdF9xd2Vidmlld19zbmlw
cGV0LmNwcCAwCi0qLwotUVdlYkhpc3RvcnkgKlFXZWJWaWV3OjpoaXN0b3J5KCkgY29uc3QKLXsK
LSAgICByZXR1cm4gcGFnZSgpLT5oaXN0b3J5KCk7Ci19Ci0KLS8qIQotICAgIFJldHVybnMgYSBw
b2ludGVyIHRvIHRoZSB2aWV3L3BhZ2Ugc3BlY2lmaWMgc2V0dGluZ3Mgb2JqZWN0LgotCi0gICAg
SXQgaXMgZXF1aXZhbGVudCB0bwotCi0gICAgXHNuaXBwZXQgd2Via2l0c25pcHBldHMvcXR3ZWJr
aXRfcXdlYnZpZXdfc25pcHBldC5jcHAgMQotCi0gICAgXHNhIFFXZWJTZXR0aW5nczo6Z2xvYmFs
U2V0dGluZ3MoKQotKi8KLVFXZWJTZXR0aW5ncyAqUVdlYlZpZXc6OnNldHRpbmdzKCkgY29uc3QK
LXsKLSAgICByZXR1cm4gcGFnZSgpLT5zZXR0aW5ncygpOwotfQotCi0vKiEKLSAgICBccHJvcGVy
dHkgUVdlYlZpZXc6OnRpdGxlCi0gICAgXGJyaWVmIHRoZSB0aXRsZSBvZiB0aGUgd2ViIHBhZ2Ug
Y3VycmVudGx5IHZpZXdlZAotCi0gICAgQnkgZGVmYXVsdCwgdGhpcyBwcm9wZXJ0eSBjb250YWlu
cyBhbiBlbXB0eSBzdHJpbmcuCi0KLSAgICBcc2EgdGl0bGVDaGFuZ2VkKCkKLSovCi1RU3RyaW5n
IFFXZWJWaWV3Ojp0aXRsZSgpIGNvbnN0Ci17Ci0gICAgaWYgKGQtPnBhZ2UpCi0gICAgICAgIHJl
dHVybiBkLT5wYWdlLT5tYWluRnJhbWUoKS0+dGl0bGUoKTsKLSAgICByZXR1cm4gUVN0cmluZygp
OwotfQotCi0vKiEKLSAgICBccHJvcGVydHkgUVdlYlZpZXc6OnVybAotICAgIFxicmllZiB0aGUg
dXJsIG9mIHRoZSB3ZWIgcGFnZSBjdXJyZW50bHkgdmlld2VkCi0KLSAgICBTZXR0aW5nIHRoaXMg
cHJvcGVydHkgY2xlYXJzIHRoZSB2aWV3IGFuZCBsb2FkcyB0aGUgVVJMLgotCi0gICAgQnkgZGVm
YXVsdCwgdGhpcyBwcm9wZXJ0eSBjb250YWlucyBhbiBlbXB0eSwgaW52YWxpZCBVUkwuCi0KLSAg
ICBcc2EgbG9hZCgpLCB1cmxDaGFuZ2VkKCkKLSovCi0KLXZvaWQgUVdlYlZpZXc6OnNldFVybChj
b25zdCBRVXJsICZ1cmwpCi17Ci0gICAgcGFnZSgpLT5tYWluRnJhbWUoKS0+c2V0VXJsKHVybCk7
Ci19Ci0KLVFVcmwgUVdlYlZpZXc6OnVybCgpIGNvbnN0Ci17Ci0gICAgaWYgKGQtPnBhZ2UpCi0g
ICAgICAgIHJldHVybiBkLT5wYWdlLT5tYWluRnJhbWUoKS0+dXJsKCk7Ci0gICAgcmV0dXJuIFFV
cmwoKTsKLX0KLQotLyohCi0gICAgXHByb3BlcnR5IFFXZWJWaWV3OjppY29uCi0gICAgXGJyaWVm
IHRoZSBpY29uIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2ViIHBhZ2UgY3VycmVudGx5IHZpZXdlZAot
Ci0gICAgQnkgZGVmYXVsdCwgdGhpcyBwcm9wZXJ0eSBjb250YWlucyBhIG51bGwgaWNvbi4KLQot
ICAgIFxzYSBpY29uQ2hhbmdlZCgpLCBRV2ViU2V0dGluZ3M6Omljb25Gb3JVcmwoKQotKi8KLVFJ
Y29uIFFXZWJWaWV3OjppY29uKCkgY29uc3QKLXsKLSAgICBpZiAoZC0+cGFnZSkKLSAgICAgICAg
cmV0dXJuIGQtPnBhZ2UtPm1haW5GcmFtZSgpLT5pY29uKCk7Ci0gICAgcmV0dXJuIFFJY29uKCk7
Ci19Ci0KLS8qIQotICAgIFxwcm9wZXJ0eSBRV2ViVmlldzo6aGFzU2VsZWN0aW9uCi0gICAgXGJy
aWVmIHdoZXRoZXIgdGhpcyBwYWdlIGNvbnRhaW5zIHNlbGVjdGVkIGNvbnRlbnQgb3Igbm90Lgot
Ci0gICAgQnkgZGVmYXVsdCwgdGhpcyBwcm9wZXJ0eSBpcyBmYWxzZS4KLQotICAgIFxzYSBzZWxl
Y3Rpb25DaGFuZ2VkKCkKLSovCi1ib29sIFFXZWJWaWV3OjpoYXNTZWxlY3Rpb24oKSBjb25zdAot
ewotICAgIGlmIChkLT5wYWdlKQotICAgICAgICByZXR1cm4gZC0+cGFnZS0+aGFzU2VsZWN0aW9u
KCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiEKLSAgICBccHJvcGVydHkgUVdlYlZpZXc6
OnNlbGVjdGVkVGV4dAotICAgIFxicmllZiB0aGUgdGV4dCBjdXJyZW50bHkgc2VsZWN0ZWQKLQot
ICAgIEJ5IGRlZmF1bHQsIHRoaXMgcHJvcGVydHkgY29udGFpbnMgYW4gZW1wdHkgc3RyaW5nLgot
Ci0gICAgXHNhIGZpbmRUZXh0KCksIHNlbGVjdGlvbkNoYW5nZWQoKSwgc2VsZWN0ZWRIdG1sKCkK
LSovCi1RU3RyaW5nIFFXZWJWaWV3OjpzZWxlY3RlZFRleHQoKSBjb25zdAotewotICAgIGlmIChk
LT5wYWdlKQotICAgICAgICByZXR1cm4gZC0+cGFnZS0+c2VsZWN0ZWRUZXh0KCk7Ci0gICAgcmV0
dXJuIFFTdHJpbmcoKTsKLX0KLQotLyohCi0gICAgXHNpbmNlIDQuOAotICAgIFxwcm9wZXJ0eSBR
V2ViVmlldzo6c2VsZWN0ZWRIdG1sCi0gICAgXGJyaWVmIHRoZSBIVE1MIGN1cnJlbnRseSBzZWxl
Y3RlZAotCi0gICAgQnkgZGVmYXVsdCwgdGhpcyBwcm9wZXJ0eSBjb250YWlucyBhbiBlbXB0eSBz
dHJpbmcuCi0KLSAgICBcc2EgZmluZFRleHQoKSwgc2VsZWN0aW9uQ2hhbmdlZCgpLCBzZWxlY3Rl
ZFRleHQoKQotKi8KLVFTdHJpbmcgUVdlYlZpZXc6OnNlbGVjdGVkSHRtbCgpIGNvbnN0Ci17Ci0g
ICAgaWYgKGQtPnBhZ2UpCi0gICAgICAgIHJldHVybiBkLT5wYWdlLT5zZWxlY3RlZEh0bWwoKTsK
LSAgICByZXR1cm4gUVN0cmluZygpOwotfQotCi0jaWZuZGVmIFFUX05PX0FDVElPTgotLyohCi0g
ICAgUmV0dXJucyBhIHBvaW50ZXIgdG8gYSBRQWN0aW9uIHRoYXQgZW5jYXBzdWxhdGVzIHRoZSBz
cGVjaWZpZWQgd2ViIGFjdGlvbiBcYSBhY3Rpb24uCi0qLwotUUFjdGlvbiAqUVdlYlZpZXc6OnBh
Z2VBY3Rpb24oUVdlYlBhZ2U6OldlYkFjdGlvbiBhY3Rpb24pIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IHBhZ2UoKS0+YWN0aW9uKGFjdGlvbik7Ci19Ci0jZW5kaWYKLQotLyohCi0gICAgVHJpZ2dlcnMg
dGhlIHNwZWNpZmllZCBcYSBhY3Rpb24uIElmIGl0IGlzIGEgY2hlY2thYmxlIGFjdGlvbiB0aGUg
c3BlY2lmaWVkCi0gICAgXGEgY2hlY2tlZCBzdGF0ZSBpcyBhc3N1bWVkLgotCi0gICAgVGhlIGZv
bGxvd2luZyBleGFtcGxlIHRyaWdnZXJzIHRoZSBjb3B5IGFjdGlvbiBhbmQgdGhlcmVmb3JlIGNv
cGllcyBhbnkKLSAgICBzZWxlY3RlZCB0ZXh0IHRvIHRoZSBjbGlwYm9hcmQuCi0KLSAgICBcc25p
cHBldCB3ZWJraXRzbmlwcGV0cy9xdHdlYmtpdF9xd2Vidmlld19zbmlwcGV0LmNwcCAyCi0KLSAg
ICBcc2EgcGFnZUFjdGlvbigpCi0qLwotdm9pZCBRV2ViVmlldzo6dHJpZ2dlclBhZ2VBY3Rpb24o
UVdlYlBhZ2U6OldlYkFjdGlvbiBhY3Rpb24sIGJvb2wgY2hlY2tlZCkKLXsKLSAgICBwYWdlKCkt
PnRyaWdnZXJBY3Rpb24oYWN0aW9uLCBjaGVja2VkKTsKLX0KLQotLyohCi0gICAgXHByb3BlcnR5
IFFXZWJWaWV3Ojptb2RpZmllZAotICAgIFxicmllZiB3aGV0aGVyIHRoZSBkb2N1bWVudCB3YXMg
bW9kaWZpZWQgYnkgdGhlIHVzZXIKLQotICAgIFBhcnRzIG9mIEhUTUwgZG9jdW1lbnRzIGNhbiBi
ZSBlZGl0YWJsZSBmb3IgZXhhbXBsZSB0aHJvdWdoIHRoZQotICAgIFxje2NvbnRlbnRlZGl0YWJs
ZX0gYXR0cmlidXRlIG9uIEhUTUwgZWxlbWVudHMuCi0KLSAgICBCeSBkZWZhdWx0LCB0aGlzIHBy
b3BlcnR5IGlzIGZhbHNlLgotKi8KLWJvb2wgUVdlYlZpZXc6OmlzTW9kaWZpZWQoKSBjb25zdAot
ewotICAgIGlmIChkLT5wYWdlKQotICAgICAgICByZXR1cm4gZC0+cGFnZS0+aXNNb2RpZmllZCgp
OwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyoKLVF0OjpUZXh0SW50ZXJhY3Rpb25GbGFncyBR
V2ViVmlldzo6dGV4dEludGVyYWN0aW9uRmxhZ3MoKSBjb25zdAotewotICAgIC8vICMjIyBGSVhN
RSAoYWRkIHRvIHBhZ2UpCi0gICAgcmV0dXJuIFF0OjpUZXh0SW50ZXJhY3Rpb25GbGFncygpOwot
fQotKi8KLQotLyoKLSAgICBccHJvcGVydHkgUVdlYlZpZXc6OnRleHRJbnRlcmFjdGlvbkZsYWdz
Ci0gICAgXGJyaWVmIGhvdyB0aGUgdmlldyBzaG91bGQgaGFuZGxlIHVzZXIgaW5wdXQKLQotICAg
IFNwZWNpZmllcyBob3cgdGhlIHVzZXIgY2FuIGludGVyYWN0IHdpdGggdGhlIHRleHQgb24gdGhl
IHBhZ2UuCi0qLwotCi0vKgotdm9pZCBRV2ViVmlldzo6c2V0VGV4dEludGVyYWN0aW9uRmxhZ3Mo
UXQ6OlRleHRJbnRlcmFjdGlvbkZsYWdzIGZsYWdzKQotewotICAgIFFfVU5VU0VEKGZsYWdzKQot
ICAgIC8vICMjIyBGSVhNRSAoYWRkIHRvIHBhZ2UpCi19Ci0qLwotCi0vKiEKLSAgICBccmVpbXAK
LSovCi1RU2l6ZSBRV2ViVmlldzo6c2l6ZUhpbnQoKSBjb25zdAotewotICAgIHJldHVybiBRU2l6
ZSg4MDAsIDYwMCk7IC8vICMjIyMuLi4KLX0KLQotLyohCi0gICAgXHByb3BlcnR5IFFXZWJWaWV3
Ojp6b29tRmFjdG9yCi0gICAgXHNpbmNlIDQuNQotICAgIFxicmllZiB0aGUgem9vbSBmYWN0b3Ig
Zm9yIHRoZSB2aWV3Ci0qLwotCi12b2lkIFFXZWJWaWV3OjpzZXRab29tRmFjdG9yKHFyZWFsIGZh
Y3RvcikKLXsKLSAgICBwYWdlKCktPm1haW5GcmFtZSgpLT5zZXRab29tRmFjdG9yKGZhY3Rvcik7
Ci19Ci0KLXFyZWFsIFFXZWJWaWV3Ojp6b29tRmFjdG9yKCkgY29uc3QKLXsKLSAgICByZXR1cm4g
cGFnZSgpLT5tYWluRnJhbWUoKS0+em9vbUZhY3RvcigpOwotfQotCi0vKiEKLSAgXHByb3BlcnR5
IFFXZWJWaWV3Ojp0ZXh0U2l6ZU11bHRpcGxpZXIKLSAgXGJyaWVmIHRoZSBzY2FsaW5nIGZhY3Rv
ciBmb3IgYWxsIHRleHQgaW4gdGhlIGZyYW1lCi0gIFxvYnNvbGV0ZQotCi0gIFVzZSBzZXRab29t
RmFjdG9yIGluc3RlYWQsIGluIGNvbWJpbmF0aW9uIHdpdGggdGhlCi0gIFpvb21UZXh0T25seSBh
dHRyaWJ1dGUgaW4gUVdlYlNldHRpbmdzLgotCi0gIFxub3RlIFNldHRpbmcgdGhpcyBwcm9wZXJ0
eSBhbHNvIGVuYWJsZXMgdGhlCi0gIFpvb21UZXh0T25seSBhdHRyaWJ1dGUgaW4gUVdlYlNldHRp
bmdzLgotCi0gIEJ5IGRlZmF1bHQsIHRoaXMgcHJvcGVydHkgY29udGFpbnMgYSB2YWx1ZSBvZiAx
LjAuCi0qLwotCi0vKiEKLSAgICBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbXVsdGlwbGllciB1c2Vk
IHRvIHNjYWxlIHRoZSB0ZXh0IGluIGEgV2ViIHBhZ2UgdG8KLSAgICB0aGUgXGEgZmFjdG9yIHNw
ZWNpZmllZC4KLSovCi12b2lkIFFXZWJWaWV3OjpzZXRUZXh0U2l6ZU11bHRpcGxpZXIocXJlYWwg
ZmFjdG9yKQotewotICAgIHBhZ2UoKS0+bWFpbkZyYW1lKCktPnNldFRleHRTaXplTXVsdGlwbGll
cihmYWN0b3IpOwotfQotCi0vKiEKLSAgICBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgbXVsdGlw
bGllciB1c2VkIHRvIHNjYWxlIHRoZSB0ZXh0IGluIGEgV2ViIHBhZ2UuCi0qLwotcXJlYWwgUVdl
YlZpZXc6OnRleHRTaXplTXVsdGlwbGllcigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHBhZ2UoKS0+
bWFpbkZyYW1lKCktPnRleHRTaXplTXVsdGlwbGllcigpOwotfQotCi0vKiEKLSAgICBccHJvcGVy
dHkgUVdlYlZpZXc6OnJlbmRlckhpbnRzCi0gICAgXHNpbmNlIDQuNgotICAgIFxicmllZiB0aGUg
ZGVmYXVsdCByZW5kZXIgaGludHMgZm9yIHRoZSB2aWV3Ci0KLSAgICBUaGVzZSBoaW50cyBhcmUg
dXNlZCB0byBpbml0aWFsaXplIFFQYWludGVyIGJlZm9yZSBwYWludGluZyB0aGUgV2ViIHBhZ2Uu
Ci0KLSAgICBRUGFpbnRlcjo6VGV4dEFudGlhbGlhc2luZyBhbmQgUVBhaW50ZXI6OlNtb290aFBp
eG1hcFRyYW5zZm9ybSBhcmUgZW5hYmxlZCBieSBkZWZhdWx0LgotCi0gICAgXHNhIFFQYWludGVy
OjpyZW5kZXJIaW50cygpCi0qLwotCi0vKiEKLSAgICBcc2luY2UgNC42Ci0gICAgUmV0dXJucyB0
aGUgcmVuZGVyIGhpbnRzIHVzZWQgYnkgdGhlIHZpZXcgdG8gcmVuZGVyIGNvbnRlbnQuCi0KLSAg
ICBcc2EgUVBhaW50ZXI6OnJlbmRlckhpbnRzKCkKLSovCi1RUGFpbnRlcjo6UmVuZGVySGludHMg
UVdlYlZpZXc6OnJlbmRlckhpbnRzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZC0+cmVuZGVySGlu
dHM7Ci19Ci0KLS8qIQotICAgIFxzaW5jZSA0LjYKLSAgICBTZXRzIHRoZSByZW5kZXIgaGludHMg
dXNlZCBieSB0aGUgdmlldyB0byB0aGUgc3BlY2lmaWVkIFxhIGhpbnRzLgotCi0gICAgXHNhIFFQ
YWludGVyOjpzZXRSZW5kZXJIaW50cygpCi0qLwotdm9pZCBRV2ViVmlldzo6c2V0UmVuZGVySGlu
dHMoUVBhaW50ZXI6OlJlbmRlckhpbnRzIGhpbnRzKQotewotICAgIGlmIChoaW50cyA9PSBkLT5y
ZW5kZXJIaW50cykKLSAgICAgICAgcmV0dXJuOwotICAgIGQtPnJlbmRlckhpbnRzID0gaGludHM7
Ci0gICAgdXBkYXRlKCk7Ci19Ci0KLS8qIQotICAgIFxzaW5jZSA0LjYKLSAgICBJZiBcYSBlbmFi
bGVkIGlzIHRydWUsIGVuYWJsZXMgdGhlIHNwZWNpZmllZCByZW5kZXIgXGEgaGludDsgb3RoZXJ3
aXNlCi0gICAgZGlzYWJsZXMgaXQuCi0KLSAgICBcc2EgcmVuZGVySGludHMsIFFQYWludGVyOjpy
ZW5kZXJIaW50cygpCi0qLwotdm9pZCBRV2ViVmlldzo6c2V0UmVuZGVySGludChRUGFpbnRlcjo6
UmVuZGVySGludCBoaW50LCBib29sIGVuYWJsZWQpCi17Ci0gICAgUVBhaW50ZXI6OlJlbmRlckhp
bnRzIG9sZEhpbnRzID0gZC0+cmVuZGVySGludHM7Ci0gICAgaWYgKGVuYWJsZWQpCi0gICAgICAg
IGQtPnJlbmRlckhpbnRzIHw9IGhpbnQ7Ci0gICAgZWxzZQotICAgICAgICBkLT5yZW5kZXJIaW50
cyAmPSB+aGludDsKLSAgICBpZiAob2xkSGludHMgIT0gZC0+cmVuZGVySGludHMpCi0gICAgICAg
IHVwZGF0ZSgpOwotfQotCi0KLS8qIQotICAgIEZpbmRzIHRoZSBzcGVjaWZpZWQgc3RyaW5nLCBc
YSBzdWJTdHJpbmcsIGluIHRoZSBwYWdlLCB1c2luZyB0aGUgZ2l2ZW4gXGEgb3B0aW9ucy4KLQot
ICAgIElmIHRoZSBIaWdobGlnaHRBbGxPY2N1cnJlbmNlcyBmbGFnIGlzIHBhc3NlZCwgdGhlIGZ1
bmN0aW9uIHdpbGwgaGlnaGxpZ2h0IGFsbCBvY2N1cnJlbmNlcwotICAgIHRoYXQgZXhpc3QgaW4g
dGhlIHBhZ2UuIEFsbCBzdWJzZXF1ZW50IGNhbGxzIHdpbGwgZXh0ZW5kIHRoZSBoaWdobGlnaHQs
IHJhdGhlciB0aGFuCi0gICAgcmVwbGFjZSBpdCwgd2l0aCBvY2N1cnJlbmNlcyBvZiB0aGUgbmV3
IHN0cmluZy4KLQotICAgIElmIHRoZSBIaWdobGlnaHRBbGxPY2N1cnJlbmNlcyBmbGFnIGlzIG5v
dCBwYXNzZWQsIHRoZSBmdW5jdGlvbiB3aWxsIHNlbGVjdCBhbiBvY2N1cnJlbmNlCi0gICAgYW5k
IGFsbCBzdWJzZXF1ZW50IGNhbGxzIHdpbGwgcmVwbGFjZSB0aGUgY3VycmVudCBvY2N1cnJlbmNl
IHdpdGggdGhlIG5leHQgb25lLgotCi0gICAgVG8gY2xlYXIgdGhlIHNlbGVjdGlvbiwganVzdCBw
YXNzIGFuIGVtcHR5IHN0cmluZy4KLQotICAgIFJldHVybnMgdHJ1ZSBpZiBcYSBzdWJTdHJpbmcg
d2FzIGZvdW5kOyBvdGhlcndpc2UgcmV0dXJucyBmYWxzZS4KLQotICAgIFxzYSBzZWxlY3RlZFRl
eHQoKSwgc2VsZWN0aW9uQ2hhbmdlZCgpCi0qLwotYm9vbCBRV2ViVmlldzo6ZmluZFRleHQoY29u
c3QgUVN0cmluZyAmc3ViU3RyaW5nLCBRV2ViUGFnZTo6RmluZEZsYWdzIG9wdGlvbnMpCi17Ci0g
ICAgaWYgKGQtPnBhZ2UpCi0gICAgICAgIHJldHVybiBkLT5wYWdlLT5maW5kVGV4dChzdWJTdHJp
bmcsIG9wdGlvbnMpOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyohIFxyZWltcAotKi8KLWJv
b2wgUVdlYlZpZXc6OmV2ZW50KFFFdmVudCAqZSkKLXsKLSAgICBpZiAoZC0+cGFnZSkgewotI2lm
bmRlZiBRVF9OT19DT05URVhUTUVOVQotICAgICAgICBpZiAoZS0+dHlwZSgpID09IFFFdmVudDo6
Q29udGV4dE1lbnUpIHsKLSAgICAgICAgICAgIGlmICghaXNFbmFibGVkKCkpCi0gICAgICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgUUNvbnRleHRNZW51RXZlbnQgKmV2ZW50
ID0gc3RhdGljX2Nhc3Q8UUNvbnRleHRNZW51RXZlbnQgKj4oZSk7Ci0gICAgICAgICAgICBpZiAo
ZC0+cGFnZS0+c3dhbGxvd0NvbnRleHRNZW51RXZlbnQoZXZlbnQpKSB7Ci0gICAgICAgICAgICAg
ICAgZS0+YWNjZXB0KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgICAgICBkLT5wYWdlLT51cGRhdGVQb3NpdGlvbkRlcGVuZGVudEFjdGlvbnMo
ZXZlbnQtPnBvcygpKTsKLSAgICAgICAgfSBlbHNlCi0jZW5kaWYgLy8gUVRfTk9fQ09OVEVYVE1F
TlUKLSAgICAgICAgaWYgKGUtPnR5cGUoKSA9PSBRRXZlbnQ6OlNob3J0Y3V0T3ZlcnJpZGUpIHsK
LSAgICAgICAgICAgIGQtPnBhZ2UtPmV2ZW50KGUpOwotI2lmbmRlZiBRVF9OT19DVVJTT1IKLSAg
ICAgICAgfSBlbHNlIGlmIChlLT50eXBlKCkgPT0gUUV2ZW50OjpDdXJzb3JDaGFuZ2UpIHsKLSAg
ICAgICAgICAgIC8vIEFuIHVuc2V0Q3Vyc29yIHdpbGwgc2V0IHRoZSBjdXJzb3IgdG8gUXQ6OkFy
cm93Q3Vyc29yLgotICAgICAgICAgICAgLy8gVGh1cyB0aGlzIGN1cnNvciBjaGFuZ2UgbWlnaHQg
YmUgYSBRV2lkZ2V0Ojp1bnNldEN1cnNvcigpCi0gICAgICAgICAgICAvLyBJZiB0aGlzIGlzIG5v
dCB0aGUgY2FzZSBhbmQgaXQgY2FtZSBmcm9tIFdlYkNvcmUsIHRoZQotICAgICAgICAgICAgLy8g
UVdlYlBhZ2VDbGllbnQgYWxyZWFkeSBoYXMgc2V0IGl0cyBjdXJzb3IgaW50ZXJuYWxseQotICAg
ICAgICAgICAgLy8gdG8gUXQ6OkFycm93Q3Vyc29yLCBzbyB1cGRhdGluZyB0aGUgY3Vyc29yIGlz
IGFsd2F5cwotICAgICAgICAgICAgLy8gcmlnaHQsIGFzIGl0IGZhbGxzIGJhY2sgdG8gdGhlIGxh
c3QgY3Vyc29yIHNldCBieQotICAgICAgICAgICAgLy8gV2ViQ29yZS4KLSAgICAgICAgICAgIC8v
IEZJWE1FOiBBZGQgYSBRRXZlbnQ6OkN1cnNvclVuc2V0IG9yIHNpbWlsYXIgdG8gUXQuCi0gICAg
ICAgICAgICBpZiAoY3Vyc29yKCkuc2hhcGUoKSA9PSBRdDo6QXJyb3dDdXJzb3IpCi0gICAgICAg
ICAgICAgICAgZC0+cGFnZS0+ZC0+Y2xpZW50LT5yZXNldEN1cnNvcigpOwotI2VuZGlmCi0gICAg
ICAgIH0gZWxzZSBpZiAoZS0+dHlwZSgpID09IFFFdmVudDo6VG91Y2hCZWdpbiAKLSAgICAgICAg
ICAgICAgICAgICB8fCBlLT50eXBlKCkgPT0gUUV2ZW50OjpUb3VjaEVuZCAKLSAgICAgICAgICAg
ICAgICAgICB8fCBlLT50eXBlKCkgPT0gUUV2ZW50OjpUb3VjaFVwZGF0ZQotICAgICAgICAgICAg
ICAgICAgIHx8IGUtPnR5cGUoKSA9PSBRRXZlbnQ6OlRvdWNoQ2FuY2VsCi0gICAgICAgICAgICAg
ICAgICApIHsKLSAgICAgICAgICAgIGQtPnBhZ2UtPmV2ZW50KGUpOwotCi0gICAgICAgICAgICAv
LyBBbHdheXMgcmV0dXJuIHRydWUgc28gdGhhdCB3ZSdsbCByZWNlaXZlIGFsc28gVG91Y2hVcGRh
dGUgYW5kIFRvdWNoRW5kIGV2ZW50cwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAg
IH0gZWxzZSBpZiAoZS0+dHlwZSgpID09IFFFdmVudDo6TGVhdmUpCi0gICAgICAgICAgICBkLT5w
YWdlLT5ldmVudChlKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gUVdpZGdldDo6ZXZlbnQoZSk7Ci19
Ci0KLS8qIQotICAgIFByaW50cyB0aGUgbWFpbiBmcmFtZSB0byB0aGUgZ2l2ZW4gXGEgcHJpbnRl
ci4KLQotICAgIFxzYSBRV2ViRnJhbWU6OnByaW50KCksIFFQcmludFByZXZpZXdEaWFsb2cKLSov
Ci12b2lkIFFXZWJWaWV3OjpwcmludChRUHJpbnRlciAqcHJpbnRlcikgY29uc3QKLXsKLSNpZiAh
ZGVmaW5lZChRVF9OT19QUklOVEVSKSAmJiBIQVZFKFFUUFJJTlRTVVBQT1JUKQotICAgIHBhZ2Uo
KS0+bWFpbkZyYW1lKCktPnByaW50KHByaW50ZXIpOwotI2VuZGlmCi19Ci0KLS8qIQotICAgIENv
bnZlbmllbmNlIHNsb3QgdGhhdCBzdG9wcyBsb2FkaW5nIHRoZSBkb2N1bWVudC4KLQotICAgIEl0
IGlzIGVxdWl2YWxlbnQgdG8KLQotICAgIFxzbmlwcGV0IHdlYmtpdHNuaXBwZXRzL3F0d2Via2l0
X3F3ZWJ2aWV3X3NuaXBwZXQuY3BwIDMKLQotICAgIFxzYSByZWxvYWQoKSwgcGFnZUFjdGlvbigp
LCBsb2FkRmluaXNoZWQoKQotKi8KLXZvaWQgUVdlYlZpZXc6OnN0b3AoKQotewotICAgIGlmIChk
LT5wYWdlKQotICAgICAgICBkLT5wYWdlLT50cmlnZ2VyQWN0aW9uKFFXZWJQYWdlOjpTdG9wKTsK
LX0KLQotLyohCi0gICAgQ29udmVuaWVuY2Ugc2xvdCB0aGF0IGxvYWRzIHRoZSBwcmV2aW91cyBk
b2N1bWVudCBpbiB0aGUgbGlzdCBvZiBkb2N1bWVudHMKLSAgICBidWlsdCBieSBuYXZpZ2F0aW5n
IGxpbmtzLiBEb2VzIG5vdGhpbmcgaWYgdGhlcmUgaXMgbm8gcHJldmlvdXMgZG9jdW1lbnQuCi0K
LSAgICBJdCBpcyBlcXVpdmFsZW50IHRvCi0KLSAgICBcc25pcHBldCB3ZWJraXRzbmlwcGV0cy9x
dHdlYmtpdF9xd2Vidmlld19zbmlwcGV0LmNwcCA0Ci0KLSAgICBcc2EgZm9yd2FyZCgpLCBwYWdl
QWN0aW9uKCkKLSovCi12b2lkIFFXZWJWaWV3OjpiYWNrKCkKLXsKLSAgICBpZiAoZC0+cGFnZSkK
LSAgICAgICAgZC0+cGFnZS0+dHJpZ2dlckFjdGlvbihRV2ViUGFnZTo6QmFjayk7Ci19Ci0KLS8q
IQotICAgIENvbnZlbmllbmNlIHNsb3QgdGhhdCBsb2FkcyB0aGUgbmV4dCBkb2N1bWVudCBpbiB0
aGUgbGlzdCBvZiBkb2N1bWVudHMKLSAgICBidWlsdCBieSBuYXZpZ2F0aW5nIGxpbmtzLiBEb2Vz
IG5vdGhpbmcgaWYgdGhlcmUgaXMgbm8gbmV4dCBkb2N1bWVudC4KLQotICAgIEl0IGlzIGVxdWl2
YWxlbnQgdG8KLQotICAgIFxzbmlwcGV0IHdlYmtpdHNuaXBwZXRzL3F0d2Via2l0X3F3ZWJ2aWV3
X3NuaXBwZXQuY3BwIDUKLQotICAgIFxzYSBiYWNrKCksIHBhZ2VBY3Rpb24oKQotKi8KLXZvaWQg
UVdlYlZpZXc6OmZvcndhcmQoKQotewotICAgIGlmIChkLT5wYWdlKQotICAgICAgICBkLT5wYWdl
LT50cmlnZ2VyQWN0aW9uKFFXZWJQYWdlOjpGb3J3YXJkKTsKLX0KLQotLyohCi0gICAgUmVsb2Fk
cyB0aGUgY3VycmVudCBkb2N1bWVudC4KLQotICAgIFxzYSBzdG9wKCksIHBhZ2VBY3Rpb24oKSwg
bG9hZFN0YXJ0ZWQoKQotKi8KLXZvaWQgUVdlYlZpZXc6OnJlbG9hZCgpCi17Ci0gICAgaWYgKGQt
PnBhZ2UpCi0gICAgICAgIGQtPnBhZ2UtPnRyaWdnZXJBY3Rpb24oUVdlYlBhZ2U6OlJlbG9hZCk7
Ci19Ci0KLS8qISBccmVpbXAKLSovCi12b2lkIFFXZWJWaWV3OjpyZXNpemVFdmVudChRUmVzaXpl
RXZlbnQgKmUpCi17Ci0gICAgaWYgKGQtPnBhZ2UpCi0gICAgICAgIGQtPnBhZ2UtPnNldFZpZXdw
b3J0U2l6ZShlLT5zaXplKCkpOwotfQotCi0vKiEgXHJlaW1wCi0qLwotdm9pZCBRV2ViVmlldzo6
cGFpbnRFdmVudChRUGFpbnRFdmVudCAqZXYpCi17Ci0gICAgaWYgKCFkLT5wYWdlKQotICAgICAg
ICByZXR1cm47Ci0jaWZkZWYgUVdFQktJVF9USU1FX1JFTkRFUklORwotICAgIFFUaW1lIHRpbWU7
Ci0gICAgdGltZS5zdGFydCgpOwotI2VuZGlmCi0KLSAgICBRV2ViRnJhbWUgKmZyYW1lID0gZC0+
cGFnZS0+bWFpbkZyYW1lKCk7Ci0gICAgUVBhaW50ZXIgcCh0aGlzKTsKLSAgICBwLnNldFJlbmRl
ckhpbnRzKGQtPnJlbmRlckhpbnRzKTsKLQotICAgIGZyYW1lLT5yZW5kZXIoJnAsIGV2LT5yZWdp
b24oKSk7Ci0KLSNpZmRlZiAgICBRV0VCS0lUX1RJTUVfUkVOREVSSU5HCi0gICAgaW50IGVsYXBz
ZWQgPSB0aW1lLmVsYXBzZWQoKTsKLSAgICBxRGVidWcoKSA8PCAicGFpbnQgZXZlbnQgb24gIiA8
PCBldi0+cmVnaW9uKCkgPDwgIiwgdG9vayB0byByZW5kZXIgPSAgIiA8PCBlbGFwc2VkOwotI2Vu
ZGlmCi19Ci0KLS8qIQotICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdGhlIGNyZWF0
ZVdpbmRvdygpIG1ldGhvZCBvZiB0aGUgYXNzb2NpYXRlZCBRV2ViUGFnZSwKLSAgICBlYWNoIHRp
bWUgdGhlIHBhZ2Ugd2FudHMgdG8gY3JlYXRlIGEgbmV3IHdpbmRvdyBvZiB0aGUgZ2l2ZW4gXGEg
dHlwZS4gVGhpcyBtaWdodAotICAgIGJlIHRoZSByZXN1bHQsIGZvciBleGFtcGxlLCBvZiBhIEph
dmFTY3JpcHQgcmVxdWVzdCB0byBvcGVuIGEgZG9jdW1lbnQgaW4gYSBuZXcgd2luZG93LgotCi0g
ICAgXG5vdGUgSWYgdGhlIGNyZWF0ZVdpbmRvdygpIG1ldGhvZCBvZiB0aGUgYXNzb2NpYXRlZCBw
YWdlIGlzIHJlaW1wbGVtZW50ZWQsIHRoaXMKLSAgICBtZXRob2QgaXMgbm90IGNhbGxlZCwgdW5s
ZXNzIGV4cGxpY2l0bHkgZG9uZSBzbyBpbiB0aGUgcmVpbXBsZW1lbnRhdGlvbi4KLQotICAgIFxu
b3RlIEluIHRoZSBjYXNlcyB3aGVuIHRoZSB3aW5kb3cgY3JlYXRpb24gaXMgYmVpbmcgdHJpZ2dl
cmVkIGJ5IEphdmFTY3JpcHQsIGFwYXJ0IGZyb20KLSAgICByZWltcGxlbWVudGluZyB0aGlzIG1l
dGhvZCBhcHBsaWNhdGlvbiBtdXN0IGFsc28gc2V0IHRoZSBKYXZhU2NyaXB0Q2FuT3BlbldpbmRv
d3MgYXR0cmlidXRlCi0gICAgb2YgUVdlYlNldHRpbmdzIHRvIHRydWUgaW4gb3JkZXIgZm9yIGl0
IHRvIGdldCBjYWxsZWQuCi0KLSAgICBcc2EgUVdlYlBhZ2U6OmNyZWF0ZVdpbmRvdygpLCBRV2Vi
UGFnZTo6YWNjZXB0TmF2aWdhdGlvblJlcXVlc3QoKQotKi8KLVFXZWJWaWV3ICpRV2ViVmlldzo6
Y3JlYXRlV2luZG93KFFXZWJQYWdlOjpXZWJXaW5kb3dUeXBlIHR5cGUpCi17Ci0gICAgUV9VTlVT
RUQodHlwZSkKLSAgICByZXR1cm4gMDsKLX0KLQotLyohIFxyZWltcAotKi8KLXZvaWQgUVdlYlZp
ZXc6Om1vdXNlTW92ZUV2ZW50KFFNb3VzZUV2ZW50KiBldikKLXsKLSAgICBpZiAoZC0+cGFnZSkg
ewotICAgICAgICBjb25zdCBib29sIGFjY2VwdGVkID0gZXYtPmlzQWNjZXB0ZWQoKTsKLSAgICAg
ICAgZC0+cGFnZS0+ZXZlbnQoZXYpOwotICAgICAgICBldi0+c2V0QWNjZXB0ZWQoYWNjZXB0ZWQp
OwotICAgIH0KLX0KLQotLyohIFxyZWltcAotKi8KLXZvaWQgUVdlYlZpZXc6Om1vdXNlUHJlc3NF
dmVudChRTW91c2VFdmVudCogZXYpCi17Ci0gICAgaWYgKGQtPnBhZ2UpIHsKLSAgICAgICAgY29u
c3QgYm9vbCBhY2NlcHRlZCA9IGV2LT5pc0FjY2VwdGVkKCk7Ci0gICAgICAgIGQtPnBhZ2UtPmV2
ZW50KGV2KTsKLSAgICAgICAgZXYtPnNldEFjY2VwdGVkKGFjY2VwdGVkKTsKLSAgICB9Ci19Ci0K
LS8qISBccmVpbXAKLSovCi12b2lkIFFXZWJWaWV3Ojptb3VzZURvdWJsZUNsaWNrRXZlbnQoUU1v
dXNlRXZlbnQqIGV2KQotewotICAgIGlmIChkLT5wYWdlKSB7Ci0gICAgICAgIGNvbnN0IGJvb2wg
YWNjZXB0ZWQgPSBldi0+aXNBY2NlcHRlZCgpOwotICAgICAgICBkLT5wYWdlLT5ldmVudChldik7
Ci0gICAgICAgIGV2LT5zZXRBY2NlcHRlZChhY2NlcHRlZCk7Ci0gICAgfQotfQotCi0vKiEgXHJl
aW1wCi0qLwotdm9pZCBRV2ViVmlldzo6bW91c2VSZWxlYXNlRXZlbnQoUU1vdXNlRXZlbnQqIGV2
KQotewotICAgIGlmIChkLT5wYWdlKSB7Ci0gICAgICAgIGNvbnN0IGJvb2wgYWNjZXB0ZWQgPSBl
di0+aXNBY2NlcHRlZCgpOwotICAgICAgICBkLT5wYWdlLT5ldmVudChldik7Ci0gICAgICAgIGV2
LT5zZXRBY2NlcHRlZChhY2NlcHRlZCk7Ci0gICAgfQotfQotCi0jaWZuZGVmIFFUX05PX0NPTlRF
WFRNRU5VCi0vKiEgXHJlaW1wCi0qLwotdm9pZCBRV2ViVmlldzo6Y29udGV4dE1lbnVFdmVudChR
Q29udGV4dE1lbnVFdmVudCogZXYpCi17Ci0gICAgaWYgKGQtPnBhZ2UpIHsKLSAgICAgICAgY29u
c3QgYm9vbCBhY2NlcHRlZCA9IGV2LT5pc0FjY2VwdGVkKCk7Ci0gICAgICAgIGQtPnBhZ2UtPmV2
ZW50KGV2KTsKLSAgICAgICAgZXYtPnNldEFjY2VwdGVkKGFjY2VwdGVkKTsKLSAgICB9Ci19Ci0j
ZW5kaWYgLy8gUVRfTk9fQ09OVEVYVE1FTlUKLQotI2lmbmRlZiBRVF9OT19XSEVFTEVWRU5UCi0v
KiEgXHJlaW1wCi0qLwotdm9pZCBRV2ViVmlldzo6d2hlZWxFdmVudChRV2hlZWxFdmVudCogZXYp
Ci17Ci0gICAgaWYgKGQtPnBhZ2UpIHsKLSAgICAgICAgY29uc3QgYm9vbCBhY2NlcHRlZCA9IGV2
LT5pc0FjY2VwdGVkKCk7Ci0gICAgICAgIGQtPnBhZ2UtPmV2ZW50KGV2KTsKLSAgICAgICAgZXYt
PnNldEFjY2VwdGVkKGFjY2VwdGVkKTsKLSAgICB9Ci19Ci0jZW5kaWYgLy8gUVRfTk9fV0hFRUxF
VkVOVAotCi0vKiEgXHJlaW1wCi0qLwotdm9pZCBRV2ViVmlldzo6a2V5UHJlc3NFdmVudChRS2V5
RXZlbnQqIGV2KQotewotICAgIGlmIChkLT5wYWdlKQotICAgICAgICBkLT5wYWdlLT5ldmVudChl
dik7Ci0gICAgaWYgKCFldi0+aXNBY2NlcHRlZCgpKQotICAgICAgICBRV2lkZ2V0OjprZXlQcmVz
c0V2ZW50KGV2KTsKLX0KLQotLyohIFxyZWltcAotKi8KLXZvaWQgUVdlYlZpZXc6OmtleVJlbGVh
c2VFdmVudChRS2V5RXZlbnQqIGV2KQotewotICAgIGlmIChkLT5wYWdlKQotICAgICAgICBkLT5w
YWdlLT5ldmVudChldik7Ci0gICAgaWYgKCFldi0+aXNBY2NlcHRlZCgpKQotICAgICAgICBRV2lk
Z2V0OjprZXlSZWxlYXNlRXZlbnQoZXYpOwotfQotCi0vKiEgXHJlaW1wCi0qLwotdm9pZCBRV2Vi
Vmlldzo6Zm9jdXNJbkV2ZW50KFFGb2N1c0V2ZW50KiBldikKLXsKLSAgICBpZiAoZC0+cGFnZSkK
LSAgICAgICAgZC0+cGFnZS0+ZXZlbnQoZXYpOwotICAgIGVsc2UKLSAgICAgICAgUVdpZGdldDo6
Zm9jdXNJbkV2ZW50KGV2KTsKLX0KLQotLyohIFxyZWltcAotKi8KLXZvaWQgUVdlYlZpZXc6OmZv
Y3VzT3V0RXZlbnQoUUZvY3VzRXZlbnQqIGV2KQotewotICAgIGlmIChkLT5wYWdlKQotICAgICAg
ICBkLT5wYWdlLT5ldmVudChldik7Ci0gICAgZWxzZQotICAgICAgICBRV2lkZ2V0Ojpmb2N1c091
dEV2ZW50KGV2KTsKLX0KLQotLyohIFxyZWltcAotKi8KLXZvaWQgUVdlYlZpZXc6OmRyYWdFbnRl
ckV2ZW50KFFEcmFnRW50ZXJFdmVudCogZXYpCi17Ci0jaWZuZGVmIFFUX05PX0RSQUdBTkREUk9Q
Ci0gICAgaWYgKGQtPnBhZ2UpCi0gICAgICAgIGQtPnBhZ2UtPmV2ZW50KGV2KTsKLSNlbmRpZgot
fQotCi0vKiEgXHJlaW1wCi0qLwotdm9pZCBRV2ViVmlldzo6ZHJhZ0xlYXZlRXZlbnQoUURyYWdM
ZWF2ZUV2ZW50KiBldikKLXsKLSNpZm5kZWYgUVRfTk9fRFJBR0FORERST1AKLSAgICBpZiAoZC0+
cGFnZSkKLSAgICAgICAgZC0+cGFnZS0+ZXZlbnQoZXYpOwotI2VuZGlmCi19Ci0KLS8qISBccmVp
bXAKLSovCi12b2lkIFFXZWJWaWV3OjpkcmFnTW92ZUV2ZW50KFFEcmFnTW92ZUV2ZW50KiBldikK
LXsKLSNpZm5kZWYgUVRfTk9fRFJBR0FORERST1AKLSAgICBpZiAoZC0+cGFnZSkKLSAgICAgICAg
ZC0+cGFnZS0+ZXZlbnQoZXYpOwotI2VuZGlmCi19Ci0KLS8qISBccmVpbXAKLSovCi12b2lkIFFX
ZWJWaWV3Ojpkcm9wRXZlbnQoUURyb3BFdmVudCogZXYpCi17Ci0jaWZuZGVmIFFUX05PX0RSQUdB
TkREUk9QCi0gICAgaWYgKGQtPnBhZ2UpCi0gICAgICAgIGQtPnBhZ2UtPmV2ZW50KGV2KTsKLSNl
bmRpZgotfQotCi0vKiEgXHJlaW1wCi0qLwotYm9vbCBRV2ViVmlldzo6Zm9jdXNOZXh0UHJldkNo
aWxkKGJvb2wgbmV4dCkKLXsKLSAgICBpZiAoZC0+cGFnZSAmJiBkLT5wYWdlLT5mb2N1c05leHRQ
cmV2Q2hpbGQobmV4dCkpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIHJldHVybiBRV2lkZ2V0
Ojpmb2N1c05leHRQcmV2Q2hpbGQobmV4dCk7Ci19Ci0KLS8qIVxyZWltcAotKi8KLVFWYXJpYW50
IFFXZWJWaWV3OjppbnB1dE1ldGhvZFF1ZXJ5KFF0OjpJbnB1dE1ldGhvZFF1ZXJ5IHByb3BlcnR5
KSBjb25zdAotewotICAgIGlmIChkLT5wYWdlKQotICAgICAgICByZXR1cm4gZC0+cGFnZS0+aW5w
dXRNZXRob2RRdWVyeShwcm9wZXJ0eSk7Ci0gICAgcmV0dXJuIFFWYXJpYW50KCk7Ci19Ci0KLS8q
IVxyZWltcAotKi8KLXZvaWQgUVdlYlZpZXc6OmlucHV0TWV0aG9kRXZlbnQoUUlucHV0TWV0aG9k
RXZlbnQgKmUpCi17Ci0gICAgaWYgKGQtPnBhZ2UpCi0gICAgICAgZC0+cGFnZS0+ZXZlbnQoZSk7
Ci19Ci0KLS8qIVxyZWltcAotKi8KLXZvaWQgUVdlYlZpZXc6OmNoYW5nZUV2ZW50KFFFdmVudCAq
ZSkKLXsKLSAgICBpZiAoZC0+cGFnZSAmJiBlLT50eXBlKCkgPT0gUUV2ZW50OjpQYWxldHRlQ2hh
bmdlKQotICAgICAgICBkLT5wYWdlLT5zZXRQYWxldHRlKHBhbGV0dGUoKSk7Ci0gICAgUVdpZGdl
dDo6Y2hhbmdlRXZlbnQoZSk7Ci19Ci0KLS8qIQotICAgIFxmbiB2b2lkIFFXZWJWaWV3Ojp0aXRs
ZUNoYW5nZWQoY29uc3QgUVN0cmluZyAmdGl0bGUpCi0KLSAgICBUaGlzIHNpZ25hbCBpcyBlbWl0
dGVkIHdoZW5ldmVyIHRoZSBcYSB0aXRsZSBvZiB0aGUgbWFpbiBmcmFtZSBjaGFuZ2VzLgotCi0g
ICAgXHNhIHRpdGxlKCkKLSovCi0KLS8qIQotICAgIFxmbiB2b2lkIFFXZWJWaWV3Ojp1cmxDaGFu
Z2VkKGNvbnN0IFFVcmwgJnVybCkKLQotICAgIFRoaXMgc2lnbmFsIGlzIGVtaXR0ZWQgd2hlbiB0
aGUgXGEgdXJsIG9mIHRoZSB2aWV3IGNoYW5nZXMuCi0KLSAgICBcc2EgdXJsKCksIGxvYWQoKQot
Ki8KLQotLyohCi0gICAgXGZuIHZvaWQgUVdlYlZpZXc6OnN0YXR1c0Jhck1lc3NhZ2UoY29uc3Qg
UVN0cmluZyYgdGV4dCkKLQotICAgIFRoaXMgc2lnbmFsIGlzIGVtaXR0ZWQgd2hlbiB0aGUgc3Rh
dHVzIGJhciBcYSB0ZXh0IGlzIGNoYW5nZWQgYnkgdGhlIHBhZ2UuCi0qLwotCi0vKiEKLSAgICBc
Zm4gdm9pZCBRV2ViVmlldzo6aWNvbkNoYW5nZWQoKQotCi0gICAgVGhpcyBzaWduYWwgaXMgZW1p
dHRlZCB3aGVuZXZlciB0aGUgaWNvbiBvZiB0aGUgcGFnZSBpcyBsb2FkZWQgb3IgY2hhbmdlcy4K
LQotICAgIEluIG9yZGVyIGZvciBpY29ucyB0byBiZSBsb2FkZWQsIHlvdSB3aWxsIG5lZWQgdG8g
c2V0IGFuIGljb24gZGF0YWJhc2UgcGF0aAotICAgIHVzaW5nIFFXZWJTZXR0aW5nczo6c2V0SWNv
bkRhdGFiYXNlUGF0aCgpLgotCi0gICAgXHNhIGljb24oKSwgUVdlYlNldHRpbmdzOjpzZXRJY29u
RGF0YWJhc2VQYXRoKCkKLSovCi0KLS8qIQotICAgIFxmbiB2b2lkIFFXZWJWaWV3Ojpsb2FkU3Rh
cnRlZCgpCi0KLSAgICBUaGlzIHNpZ25hbCBpcyBlbWl0dGVkIHdoZW4gYSBuZXcgbG9hZCBvZiB0
aGUgcGFnZSBpcyBzdGFydGVkLgotCi0gICAgXHNhIGxvYWRQcm9ncmVzcygpLCBsb2FkRmluaXNo
ZWQoKQotKi8KLQotLyohCi0gICAgXGZuIHZvaWQgUVdlYlZpZXc6OmxvYWRGaW5pc2hlZChib29s
IG9rKQotCi0gICAgVGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuIGEgbG9hZCBvZiB0aGUgcGFn
ZSBpcyBmaW5pc2hlZC4KLSAgICBcYSBvayB3aWxsIGluZGljYXRlIHdoZXRoZXIgdGhlIGxvYWQg
d2FzIHN1Y2Nlc3NmdWwgb3IgYW55IGVycm9yIG9jY3VycmVkLgotCi0gICAgXHNhIGxvYWRTdGFy
dGVkKCkKLSovCi0KLS8qIQotICAgIFxmbiB2b2lkIFFXZWJWaWV3OjpzZWxlY3Rpb25DaGFuZ2Vk
KCkKLQotICAgIFRoaXMgc2lnbmFsIGlzIGVtaXR0ZWQgd2hlbmV2ZXIgdGhlIHNlbGVjdGlvbiBj
aGFuZ2VzLgotCi0gICAgXHNhIHNlbGVjdGVkVGV4dCgpCi0qLwotCi0vKiEKLSAgICBcZm4gdm9p
ZCBRV2ViVmlldzo6bG9hZFByb2dyZXNzKGludCBwcm9ncmVzcykKLQotICAgIFRoaXMgc2lnbmFs
IGlzIGVtaXR0ZWQgZXZlcnkgdGltZSBhbiBlbGVtZW50IGluIHRoZSB3ZWIgcGFnZQotICAgIGNv
bXBsZXRlcyBsb2FkaW5nIGFuZCB0aGUgb3ZlcmFsbCBsb2FkaW5nIHByb2dyZXNzIGFkdmFuY2Vz
LgotCi0gICAgVGhpcyBzaWduYWwgdHJhY2tzIHRoZSBwcm9ncmVzcyBvZiBhbGwgY2hpbGQgZnJh
bWVzLgotCi0gICAgVGhlIGN1cnJlbnQgdmFsdWUgaXMgcHJvdmlkZWQgYnkgXGEgcHJvZ3Jlc3Mg
YW5kIHNjYWxlcyBmcm9tIDAgdG8gMTAwLAotICAgIHdoaWNoIGlzIHRoZSBkZWZhdWx0IHJhbmdl
IG9mIFFQcm9ncmVzc0Jhci4KLQotICAgIFxzYSBsb2FkU3RhcnRlZCgpLCBsb2FkRmluaXNoZWQo
KQotKi8KLQotLyohCi0gICAgXGZuIHZvaWQgUVdlYlZpZXc6OmxpbmtDbGlja2VkKGNvbnN0IFFV
cmwgJnVybCkKLQotICAgIFRoaXMgc2lnbmFsIGlzIGVtaXR0ZWQgd2hlbmV2ZXIgdGhlIHVzZXIg
Y2xpY2tzIG9uIGEgbGluayBhbmQgdGhlIHBhZ2UncyBsaW5rRGVsZWdhdGlvblBvbGljeQotICAg
IHByb3BlcnR5IGlzIHNldCB0byBkZWxlZ2F0ZSB0aGUgbGluayBoYW5kbGluZyBmb3IgdGhlIHNw
ZWNpZmllZCBcYSB1cmwuCi0KLSAgICBcc2EgUVdlYlBhZ2U6OmxpbmtEZWxlZ2F0aW9uUG9saWN5
KCkKLSovCi0KLSNpbmNsdWRlICJtb2NfcXdlYnZpZXcuY3BwIgotCmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViS2l0L3F0L0FwaS9xd2Vidmlldy5oIGIvU291cmNlL1dlYktpdC9xdC9BcGkvcXdlYnZp
ZXcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRiNGRkOTE3NWYwZDE4MWNmMmJk
OGI1Y2RhMTgxOThhNTEyN2YxMy4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L3F0L0FwaS9xd2Vidmlldy5oCisrKyAvZGV2L251bGwK
QEAgLTEsMTY1ICswLDAgQEAKLS8qCi0gICAgQ29weXJpZ2h0IChDKSAyMDA4IE5va2lhIENvcnBv
cmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQotICAgIENvcHlyaWdodCAoQykgMjAw
NyBTdGFpa29zIENvbXB1dGluZyBTZXJ2aWNlcyBJbmMuCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMg
ZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5
IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAg
ICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBl
aXRoZXIKLSAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikg
YW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4g
dGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FS
UkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5U
QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05V
Ci0gICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0K
LSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0
aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KLSAgICB0aGUgRnJlZSBTb2Z0
d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAot
ICAgIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgotKi8KLQotI2lmbmRlZiBRV0VCVklFV19I
Ci0jZGVmaW5lIFFXRUJWSUVXX0gKLQotI2luY2x1ZGUgInF3ZWJraXRnbG9iYWwuaCIKLSNpbmNs
dWRlICJxd2VicGFnZS5oIgotI2luY2x1ZGUgPFF0V2lkZ2V0cy9xd2lkZ2V0Lmg+Ci0jaW5jbHVk
ZSA8UXRHdWkvcWljb24uaD4KLSNpbmNsdWRlIDxRdEd1aS9xcGFpbnRlci5oPgotI2luY2x1ZGUg
PFF0Q29yZS9xdXJsLmg+Ci0jaW5jbHVkZSA8UXROZXR3b3JrL3FuZXR3b3JrYWNjZXNzbWFuYWdl
ci5oPgotCi1RVF9CRUdJTl9OQU1FU1BBQ0UKLWNsYXNzIFFOZXR3b3JrUmVxdWVzdDsKLWNsYXNz
IFFQcmludGVyOwotUVRfRU5EX05BTUVTUEFDRQotCi1jbGFzcyBRV2ViUGFnZTsKLWNsYXNzIFFX
ZWJWaWV3UHJpdmF0ZTsKLWNsYXNzIFFXZWJOZXR3b3JrUmVxdWVzdDsKLQotY2xhc3MgUVdFQktJ
VF9FWFBPUlQgUVdlYlZpZXcgOiBwdWJsaWMgUVdpZGdldCB7Ci0gICAgUV9PQkpFQ1QKLSAgICBR
X1BST1BFUlRZKFFTdHJpbmcgdGl0bGUgUkVBRCB0aXRsZSkKLSAgICBRX1BST1BFUlRZKFFVcmwg
dXJsIFJFQUQgdXJsIFdSSVRFIHNldFVybCkKLSAgICBRX1BST1BFUlRZKFFJY29uIGljb24gUkVB
RCBpY29uKQotICAgIFFfUFJPUEVSVFkoUVN0cmluZyBzZWxlY3RlZFRleHQgUkVBRCBzZWxlY3Rl
ZFRleHQpCi0gICAgUV9QUk9QRVJUWShRU3RyaW5nIHNlbGVjdGVkSHRtbCBSRUFEIHNlbGVjdGVk
SHRtbCkKLSAgICBRX1BST1BFUlRZKGJvb2wgaGFzU2VsZWN0aW9uIFJFQUQgaGFzU2VsZWN0aW9u
KQotICAgIFFfUFJPUEVSVFkoYm9vbCBtb2RpZmllZCBSRUFEIGlzTW9kaWZpZWQpCi0gICAgLy9R
X1BST1BFUlRZKFF0OjpUZXh0SW50ZXJhY3Rpb25GbGFncyB0ZXh0SW50ZXJhY3Rpb25GbGFncyBS
RUFEIHRleHRJbnRlcmFjdGlvbkZsYWdzIFdSSVRFIHNldFRleHRJbnRlcmFjdGlvbkZsYWdzKQot
ICAgIFFfUFJPUEVSVFkocXJlYWwgdGV4dFNpemVNdWx0aXBsaWVyIFJFQUQgdGV4dFNpemVNdWx0
aXBsaWVyIFdSSVRFIHNldFRleHRTaXplTXVsdGlwbGllciBERVNJR05BQkxFIGZhbHNlKQotICAg
IFFfUFJPUEVSVFkocXJlYWwgem9vbUZhY3RvciBSRUFEIHpvb21GYWN0b3IgV1JJVEUgc2V0Wm9v
bUZhY3RvcikKLQotICAgIFFfUFJPUEVSVFkoUVBhaW50ZXI6OlJlbmRlckhpbnRzIHJlbmRlckhp
bnRzIFJFQUQgcmVuZGVySGludHMgV1JJVEUgc2V0UmVuZGVySGludHMpCi0gICAgUV9GTEFHUyhR
UGFpbnRlcjo6UmVuZGVySGludHMpCi1wdWJsaWM6Ci0gICAgZXhwbGljaXQgUVdlYlZpZXcoUVdp
ZGdldCogcGFyZW50ID0gMCk7Ci0gICAgdmlydHVhbCB+UVdlYlZpZXcoKTsKLQotICAgIFFXZWJQ
YWdlKiBwYWdlKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRQYWdlKFFXZWJQYWdlKiBwYWdlKTsKLQot
ICAgIHZvaWQgbG9hZChjb25zdCBRVXJsJiB1cmwpOwotICAgIHZvaWQgbG9hZChjb25zdCBRTmV0
d29ya1JlcXVlc3QmIHJlcXVlc3QsIFFOZXR3b3JrQWNjZXNzTWFuYWdlcjo6T3BlcmF0aW9uIG9w
ZXJhdGlvbiA9IFFOZXR3b3JrQWNjZXNzTWFuYWdlcjo6R2V0T3BlcmF0aW9uLCBjb25zdCBRQnl0
ZUFycmF5ICZib2R5ID0gUUJ5dGVBcnJheSgpKTsKLSAgICB2b2lkIHNldEh0bWwoY29uc3QgUVN0
cmluZyYgaHRtbCwgY29uc3QgUVVybCYgYmFzZVVybCA9IFFVcmwoKSk7Ci0gICAgdm9pZCBzZXRD
b250ZW50KGNvbnN0IFFCeXRlQXJyYXkmIGRhdGEsIGNvbnN0IFFTdHJpbmcmIG1pbWVUeXBlID0g
UVN0cmluZygpLCBjb25zdCBRVXJsJiBiYXNlVXJsID0gUVVybCgpKTsKLQotICAgIFFXZWJIaXN0
b3J5KiBoaXN0b3J5KCkgY29uc3Q7Ci0gICAgUVdlYlNldHRpbmdzKiBzZXR0aW5ncygpIGNvbnN0
OwotCi0gICAgUVN0cmluZyB0aXRsZSgpIGNvbnN0OwotICAgIHZvaWQgc2V0VXJsKGNvbnN0IFFV
cmwgJnVybCk7Ci0gICAgUVVybCB1cmwoKSBjb25zdDsKLSAgICBRSWNvbiBpY29uKCkgY29uc3Q7
Ci0KLSAgICBib29sIGhhc1NlbGVjdGlvbigpIGNvbnN0OwotICAgIFFTdHJpbmcgc2VsZWN0ZWRU
ZXh0KCkgY29uc3Q7Ci0gICAgUVN0cmluZyBzZWxlY3RlZEh0bWwoKSBjb25zdDsKLQotI2lmbmRl
ZiBRVF9OT19BQ1RJT04KLSAgICBRQWN0aW9uKiBwYWdlQWN0aW9uKFFXZWJQYWdlOjpXZWJBY3Rp
b24gYWN0aW9uKSBjb25zdDsKLSNlbmRpZgotICAgIHZvaWQgdHJpZ2dlclBhZ2VBY3Rpb24oUVdl
YlBhZ2U6OldlYkFjdGlvbiBhY3Rpb24sIGJvb2wgY2hlY2tlZCA9IGZhbHNlKTsKLQotICAgIGJv
b2wgaXNNb2RpZmllZCgpIGNvbnN0OwotCi0gICAgLyoKLSAgICBRdDo6VGV4dEludGVyYWN0aW9u
RmxhZ3MgdGV4dEludGVyYWN0aW9uRmxhZ3MoKSBjb25zdDsKLSAgICB2b2lkIHNldFRleHRJbnRl
cmFjdGlvbkZsYWdzKFF0OjpUZXh0SW50ZXJhY3Rpb25GbGFncyBmbGFncyk7Ci0gICAgdm9pZCBz
ZXRUZXh0SW50ZXJhY3Rpb25GbGFnKFF0OjpUZXh0SW50ZXJhY3Rpb25GbGFnIGZsYWcpOwotICAg
ICovCi0KLSAgICBRVmFyaWFudCBpbnB1dE1ldGhvZFF1ZXJ5KFF0OjpJbnB1dE1ldGhvZFF1ZXJ5
IHByb3BlcnR5KSBjb25zdDsKLQotICAgIFFTaXplIHNpemVIaW50KCkgY29uc3Q7Ci0KLSAgICBx
cmVhbCB6b29tRmFjdG9yKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRab29tRmFjdG9yKHFyZWFsIGZh
Y3Rvcik7Ci0KLSAgICB2b2lkIHNldFRleHRTaXplTXVsdGlwbGllcihxcmVhbCBmYWN0b3IpOwot
ICAgIHFyZWFsIHRleHRTaXplTXVsdGlwbGllcigpIGNvbnN0OwotCi0gICAgUVBhaW50ZXI6OlJl
bmRlckhpbnRzIHJlbmRlckhpbnRzKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRSZW5kZXJIaW50cyhR
UGFpbnRlcjo6UmVuZGVySGludHMgaGludHMpOwotICAgIHZvaWQgc2V0UmVuZGVySGludChRUGFp
bnRlcjo6UmVuZGVySGludCBoaW50LCBib29sIGVuYWJsZWQgPSB0cnVlKTsKLQotICAgIGJvb2wg
ZmluZFRleHQoY29uc3QgUVN0cmluZyYgc3ViU3RyaW5nLCBRV2ViUGFnZTo6RmluZEZsYWdzIG9w
dGlvbnMgPSAwKTsKLQotICAgIHZpcnR1YWwgYm9vbCBldmVudChRRXZlbnQqKTsKLQotcHVibGlj
IFFfU0xPVFM6Ci0gICAgdm9pZCBzdG9wKCk7Ci0gICAgdm9pZCBiYWNrKCk7Ci0gICAgdm9pZCBm
b3J3YXJkKCk7Ci0gICAgdm9pZCByZWxvYWQoKTsKLQotICAgIHZvaWQgcHJpbnQoUVByaW50ZXIq
KSBjb25zdDsKLQotUV9TSUdOQUxTOgotICAgIHZvaWQgbG9hZFN0YXJ0ZWQoKTsKLSAgICB2b2lk
IGxvYWRQcm9ncmVzcyhpbnQgcHJvZ3Jlc3MpOwotICAgIHZvaWQgbG9hZEZpbmlzaGVkKGJvb2wp
OwotICAgIHZvaWQgdGl0bGVDaGFuZ2VkKGNvbnN0IFFTdHJpbmcmIHRpdGxlKTsKLSAgICB2b2lk
IHN0YXR1c0Jhck1lc3NhZ2UoY29uc3QgUVN0cmluZyYgdGV4dCk7Ci0gICAgdm9pZCBsaW5rQ2xp
Y2tlZChjb25zdCBRVXJsJik7Ci0gICAgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKCk7Ci0gICAgdm9p
ZCBpY29uQ2hhbmdlZCgpOwotICAgIHZvaWQgdXJsQ2hhbmdlZChjb25zdCBRVXJsJik7Ci0KLXBy
b3RlY3RlZDoKLSAgICB2b2lkIHJlc2l6ZUV2ZW50KFFSZXNpemVFdmVudCopOwotICAgIHZvaWQg
cGFpbnRFdmVudChRUGFpbnRFdmVudCopOwotCi0gICAgdmlydHVhbCBRV2ViVmlldyAqY3JlYXRl
V2luZG93KFFXZWJQYWdlOjpXZWJXaW5kb3dUeXBlIHR5cGUpOwotCi0gICAgdmlydHVhbCB2b2lk
IGNoYW5nZUV2ZW50KFFFdmVudCopOwotICAgIHZpcnR1YWwgdm9pZCBtb3VzZU1vdmVFdmVudChR
TW91c2VFdmVudCopOwotICAgIHZpcnR1YWwgdm9pZCBtb3VzZVByZXNzRXZlbnQoUU1vdXNlRXZl
bnQqKTsKLSAgICB2aXJ0dWFsIHZvaWQgbW91c2VEb3VibGVDbGlja0V2ZW50KFFNb3VzZUV2ZW50
Kik7Ci0gICAgdmlydHVhbCB2b2lkIG1vdXNlUmVsZWFzZUV2ZW50KFFNb3VzZUV2ZW50Kik7Ci0j
aWZuZGVmIFFUX05PX0NPTlRFWFRNRU5VCi0gICAgdmlydHVhbCB2b2lkIGNvbnRleHRNZW51RXZl
bnQoUUNvbnRleHRNZW51RXZlbnQqKTsKLSNlbmRpZgotI2lmbmRlZiBRVF9OT19XSEVFTEVWRU5U
Ci0gICAgdmlydHVhbCB2b2lkIHdoZWVsRXZlbnQoUVdoZWVsRXZlbnQqKTsKLSNlbmRpZgotICAg
IHZpcnR1YWwgdm9pZCBrZXlQcmVzc0V2ZW50KFFLZXlFdmVudCopOwotICAgIHZpcnR1YWwgdm9p
ZCBrZXlSZWxlYXNlRXZlbnQoUUtleUV2ZW50Kik7Ci0gICAgdmlydHVhbCB2b2lkIGRyYWdFbnRl
ckV2ZW50KFFEcmFnRW50ZXJFdmVudCopOwotICAgIHZpcnR1YWwgdm9pZCBkcmFnTGVhdmVFdmVu
dChRRHJhZ0xlYXZlRXZlbnQqKTsKLSAgICB2aXJ0dWFsIHZvaWQgZHJhZ01vdmVFdmVudChRRHJh
Z01vdmVFdmVudCopOwotICAgIHZpcnR1YWwgdm9pZCBkcm9wRXZlbnQoUURyb3BFdmVudCopOwot
ICAgIHZpcnR1YWwgdm9pZCBmb2N1c0luRXZlbnQoUUZvY3VzRXZlbnQqKTsKLSAgICB2aXJ0dWFs
IHZvaWQgZm9jdXNPdXRFdmVudChRRm9jdXNFdmVudCopOwotICAgIHZpcnR1YWwgdm9pZCBpbnB1
dE1ldGhvZEV2ZW50KFFJbnB1dE1ldGhvZEV2ZW50Kik7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgZm9j
dXNOZXh0UHJldkNoaWxkKGJvb2wgbmV4dCk7Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNz
IFFXZWJQYWdlOwotICAgIFFXZWJWaWV3UHJpdmF0ZSogZDsKLSAgICBRX1BSSVZBVEVfU0xPVChk
LCB2b2lkIF9xX3BhZ2VEZXN0cm95ZWQoKSkKLX07Ci0KLSNlbmRpZiAvLyBRV0VCVklFV19ICmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0L0FwaS9xd2Vidmlld2FjY2Vzc2libGUuY3BwIGIv
U291cmNlL1dlYktpdC9xdC9BcGkvcXdlYnZpZXdhY2Nlc3NpYmxlLmNwcApkZWxldGVkIGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggN2NhZTE5YTFhNDIyMTRiZGE0MjkxZTg3YWIxMTQ2YjdiNTM3ZGEy
MC4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2Uv
V2ViS2l0L3F0L0FwaS9xd2Vidmlld2FjY2Vzc2libGUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEs
MTUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgTm9raWEgQ29ycG9yYXRpb24g
YW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCi0KLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNv
ZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRl
ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNl
IGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAq
IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg
dmVyc2lvbi4KLQotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRo
YXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhv
dXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gKiBZb3Ugc2hvdWxk
IGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBM
aWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcu
TElCLiAgSWYgbm90LCB3cml0ZSB0bwotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwg
SW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKLSAqIEJvc3RvbiwgTUEgMDIx
MTAtMTMwMSwgVVNBLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJxd2Vi
dmlld2FjY2Vzc2libGVfcC5oIgotCi0jaW5jbHVkZSAicXdlYmZyYW1lLmgiCi0jaW5jbHVkZSAi
cXdlYmZyYW1lX3AuaCIKLSNpbmNsdWRlICJxd2VicGFnZS5oIgotI2luY2x1ZGUgInF3ZWJ2aWV3
LmgiCi0KLVFXZWJGcmFtZUFjY2Vzc2libGU6OlFXZWJGcmFtZUFjY2Vzc2libGUoUVdlYkZyYW1l
KiBmcmFtZSkKLSAgICA6IFFBY2Nlc3NpYmxlT2JqZWN0KGZyYW1lKQotewotfQotCi1RV2ViRnJh
bWUqIFFXZWJGcmFtZUFjY2Vzc2libGU6OmZyYW1lKCkgY29uc3QKLXsKLSAgICByZXR1cm4gcW9i
amVjdF9jYXN0PFFXZWJGcmFtZSo+KG9iamVjdCgpKTsKLX0KLQotUUFjY2Vzc2libGVJbnRlcmZh
Y2UqIFFXZWJGcmFtZUFjY2Vzc2libGU6OnBhcmVudCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIFFB
Y2Nlc3NpYmxlOjpxdWVyeUFjY2Vzc2libGVJbnRlcmZhY2Uob2JqZWN0KCktPnBhcmVudCgpKTsK
LX0KLQotUVN0cmluZyBRV2ViRnJhbWVBY2Nlc3NpYmxlOjp0ZXh0KFFBY2Nlc3NpYmxlOjpUZXh0
KSBjb25zdAotewotICAgIHJldHVybiBRU3RyaW5nKCk7Ci19Ci0KLWludCBRV2ViRnJhbWVBY2Nl
c3NpYmxlOjpjaGlsZENvdW50KCkgY29uc3QKLXsKLSAgICByZXR1cm4gMDsKLX0KLQotUUFjY2Vz
c2libGVJbnRlcmZhY2UqIFFXZWJGcmFtZUFjY2Vzc2libGU6OmNoaWxkKGludCBpbmRleCkgY29u
c3QKLXsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IFFXZWJGcmFtZUFjY2Vzc2libGU6OmluZGV4
T2ZDaGlsZChjb25zdCBRQWNjZXNzaWJsZUludGVyZmFjZSopIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IDA7Ci19Ci0KLVFBY2Nlc3NpYmxlOjpTdGF0ZSBRV2ViRnJhbWVBY2Nlc3NpYmxlOjpzdGF0ZSgp
IGNvbnN0Ci17Ci0gICAgcmV0dXJuIFFBY2Nlc3NpYmxlOjpTdGF0ZSgpOwotfQotCi1RQWNjZXNz
aWJsZTo6Um9sZSBRV2ViRnJhbWVBY2Nlc3NpYmxlOjpyb2xlKCkgY29uc3QKLXsKLSAgICByZXR1
cm4gUUFjY2Vzc2libGU6OkNsaWVudDsKLX0KLQotaW50IFFXZWJGcmFtZUFjY2Vzc2libGU6Om5h
dmlnYXRlKFFBY2Nlc3NpYmxlOjpSZWxhdGlvbkZsYWcsIGludCwgUUFjY2Vzc2libGVJbnRlcmZh
Y2UqKiB0YXJnZXQpIGNvbnN0Ci17Ci0gICAgKnRhcmdldCA9IDA7Ci0gICAgcmV0dXJuIC0xOwot
fQotCi1RV2ViUGFnZUFjY2Vzc2libGU6OlFXZWJQYWdlQWNjZXNzaWJsZShRV2ViUGFnZSogcGFn
ZSkKLSAgICA6IFFBY2Nlc3NpYmxlT2JqZWN0KHBhZ2UpCi17Ci19Ci0KLVFXZWJQYWdlKiBRV2Vi
UGFnZUFjY2Vzc2libGU6OnBhZ2UoKSBjb25zdAotewotICAgIHJldHVybiBxb2JqZWN0X2Nhc3Q8
UVdlYlBhZ2UqPihvYmplY3QoKSk7Ci19Ci0KLVFTdHJpbmcgUVdlYlBhZ2VBY2Nlc3NpYmxlOjp0
ZXh0KFFBY2Nlc3NpYmxlOjpUZXh0IHQpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIFFTdHJpbmcoKTsK
LX0KLQotUUFjY2Vzc2libGVJbnRlcmZhY2UqIFFXZWJQYWdlQWNjZXNzaWJsZTo6cGFyZW50KCkg
Y29uc3QKLXsKLSAgICByZXR1cm4gUUFjY2Vzc2libGU6OnF1ZXJ5QWNjZXNzaWJsZUludGVyZmFj
ZShvYmplY3QoKS0+cGFyZW50KCkpOwotfQotCi1RQWNjZXNzaWJsZUludGVyZmFjZSogUVdlYlBh
Z2VBY2Nlc3NpYmxlOjpjaGlsZChpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgaWYgKCFpbmRleCAm
JiBwYWdlKCktPm1haW5GcmFtZSgpKQotICAgICAgICByZXR1cm4gbmV3IFFXZWJGcmFtZUFjY2Vz
c2libGUocGFnZSgpLT5tYWluRnJhbWUoKSk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBRV2Vi
UGFnZUFjY2Vzc2libGU6OmNoaWxkQ291bnQoKSBjb25zdAotewotICAgIHJldHVybiBwYWdlKCkt
Pm1haW5GcmFtZSgpID8gMSA6IDA7Ci19Ci0KLWludCBRV2ViUGFnZUFjY2Vzc2libGU6OmluZGV4
T2ZDaGlsZChjb25zdCBRQWNjZXNzaWJsZUludGVyZmFjZSopIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IDA7Ci19Ci0KLWludCBRV2ViUGFnZUFjY2Vzc2libGU6Om5hdmlnYXRlKFFBY2Nlc3NpYmxlOjpS
ZWxhdGlvbkZsYWcsIGludCwgUUFjY2Vzc2libGVJbnRlcmZhY2UqKiB0YXJnZXQpIGNvbnN0Ci17
Ci0gICAgKnRhcmdldCA9IDA7Ci0gICAgcmV0dXJuIC0xOwotfQotCi1RQWNjZXNzaWJsZTo6Um9s
ZSBRV2ViUGFnZUFjY2Vzc2libGU6OnJvbGUoKSBjb25zdAotewotICAgIHJldHVybiBRQWNjZXNz
aWJsZTo6Q2xpZW50OwotfQotCi1RQWNjZXNzaWJsZTo6U3RhdGUgUVdlYlBhZ2VBY2Nlc3NpYmxl
OjpzdGF0ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIFFBY2Nlc3NpYmxlOjpTdGF0ZSgpOwotfQot
Ci1RV2ViVmlld0FjY2Vzc2libGU6OlFXZWJWaWV3QWNjZXNzaWJsZShRV2ViVmlldyogdmlldykK
LSAgICA6IFFBY2Nlc3NpYmxlV2lkZ2V0KHZpZXcsIFFBY2Nlc3NpYmxlOjpEb2N1bWVudCkKLXsK
LX0KLQotUVdlYlZpZXcqIFFXZWJWaWV3QWNjZXNzaWJsZTo6dmlldygpIGNvbnN0Ci17Ci0gICAg
cmV0dXJuIHFvYmplY3RfY2FzdDxRV2ViVmlldyo+KG9iamVjdCgpKTsKLX0KLQotaW50IFFXZWJW
aWV3QWNjZXNzaWJsZTo6Y2hpbGRDb3VudCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHZpZXcoKS0+
cGFnZSgpID8gMSA6IDA7Ci19Ci0KLVFBY2Nlc3NpYmxlSW50ZXJmYWNlKiBRV2ViVmlld0FjY2Vz
c2libGU6OmNoaWxkKGludCBpbmRleCkgY29uc3QKLXsKLSAgICBpZiAoIWluZGV4ICYmIHZpZXco
KS0+cGFnZSgpKQotICAgICAgICByZXR1cm4gbmV3IFFXZWJQYWdlQWNjZXNzaWJsZSh2aWV3KCkt
PnBhZ2UoKSk7Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0
L0FwaS9xd2Vidmlld2FjY2Vzc2libGVfcC5oIGIvU291cmNlL1dlYktpdC9xdC9BcGkvcXdlYnZp
ZXdhY2Nlc3NpYmxlX3AuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NiZjQ0ODcw
NzNmNjZiZWRmODFiNTU0YTRhZWVkMTlmYjRkYjM2My4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L3F0L0FwaS9xd2Vidmlld2FjY2Vz
c2libGVfcC5oCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdo
dCAoQykgMjAxMiBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykK
LQotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRl
IGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJh
cnkgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBv
ciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gKiBUaGlzIGxpYnJhcnkg
aXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1
dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5
IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP
U0UuICBTZWUgdGhlIEdOVQotICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBt
b3JlIGRldGFpbHMuCi0KLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhl
IEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBs
aWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCi0gKiB0
aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZp
ZnRoIEZsb29yLAotICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCi0gKi8KLQotI2lmbmRl
ZiBxd2Vidmlld2FjY2Vzc2libGVfcF9oCi0jZGVmaW5lIHF3ZWJ2aWV3YWNjZXNzaWJsZV9wX2gK
LQotI2luY2x1ZGUgPHFhY2Nlc3NpYmxlLmg+Ci0jaW5jbHVkZSA8cWFjY2Vzc2libGVvYmplY3Qu
aD4KLSNpbmNsdWRlIDxxYWNjZXNzaWJsZXdpZGdldC5oPgotCi1jbGFzcyBRV2ViRnJhbWU7Ci1j
bGFzcyBRV2ViUGFnZTsKLWNsYXNzIFFXZWJWaWV3OwotCi0vKgotICogQ2xhc3NlcyByZXByZXNl
bnRpbmcgYWNjZXNzaWJsZSBvYmplY3RzIGZvciBWaWV3LCBGcmFtZSBhbmQgUGFnZS4KLSAqCi0g
KiBFYWNoIG9mIHRoZXNlIGp1c3QgcmV0dXJucyBvbmUgY2hpbGQgd2hpY2ggbGV0cyB0aGUgYWNj
ZXNzaWJpbGl0eQotICogZnJhbXdvcmsgbmF2aWdhdGUgdG93YXJkcyB0aGUgYWN0dWFsIGNvbnRl
bnRzIGluIHRoZSBmcmFtZS4KLSAqLwotCi1jbGFzcyBRV2ViRnJhbWVBY2Nlc3NpYmxlIDogcHVi
bGljIFFBY2Nlc3NpYmxlT2JqZWN0IHsKLXB1YmxpYzoKLSAgICBRV2ViRnJhbWVBY2Nlc3NpYmxl
KFFXZWJGcmFtZSopOwotCi0gICAgUVdlYkZyYW1lKiBmcmFtZSgpIGNvbnN0OwotCi0gICAgUUFj
Y2Vzc2libGVJbnRlcmZhY2UqIHBhcmVudCgpIGNvbnN0OwotICAgIGludCBjaGlsZENvdW50KCkg
Y29uc3Q7Ci0gICAgUUFjY2Vzc2libGVJbnRlcmZhY2UqIGNoaWxkKGludCBpbmRleCkgY29uc3Q7
Ci0gICAgaW50IGluZGV4T2ZDaGlsZChjb25zdCBRQWNjZXNzaWJsZUludGVyZmFjZSopIGNvbnN0
OwotICAgIGludCBuYXZpZ2F0ZShRQWNjZXNzaWJsZTo6UmVsYXRpb25GbGFnLCBpbnQsIFFBY2Nl
c3NpYmxlSW50ZXJmYWNlKiogdGFyZ2V0KSBjb25zdDsKLQotICAgIFFTdHJpbmcgdGV4dChRQWNj
ZXNzaWJsZTo6VGV4dCkgY29uc3Q7Ci0gICAgUUFjY2Vzc2libGU6OlJvbGUgcm9sZSgpIGNvbnN0
OwotICAgIFFBY2Nlc3NpYmxlOjpTdGF0ZSBzdGF0ZSgpIGNvbnN0OwotfTsKLQotY2xhc3MgUVdl
YlBhZ2VBY2Nlc3NpYmxlIDogcHVibGljIFFBY2Nlc3NpYmxlT2JqZWN0IHsKLXB1YmxpYzoKLSAg
ICBRV2ViUGFnZUFjY2Vzc2libGUoUVdlYlBhZ2UqKTsKLQotICAgIFFXZWJQYWdlKiBwYWdlKCkg
Y29uc3Q7Ci0KLSAgICBRQWNjZXNzaWJsZUludGVyZmFjZSogcGFyZW50KCkgY29uc3Q7Ci0gICAg
aW50IGNoaWxkQ291bnQoKSBjb25zdDsKLSAgICBRQWNjZXNzaWJsZUludGVyZmFjZSogY2hpbGQo
aW50IGluZGV4KSBjb25zdDsKLSAgICBpbnQgaW5kZXhPZkNoaWxkKGNvbnN0IFFBY2Nlc3NpYmxl
SW50ZXJmYWNlKikgY29uc3Q7Ci0gICAgaW50IG5hdmlnYXRlKFFBY2Nlc3NpYmxlOjpSZWxhdGlv
bkZsYWcsIGludCwgUUFjY2Vzc2libGVJbnRlcmZhY2UqKiB0YXJnZXQpIGNvbnN0OwotCi0gICAg
UVN0cmluZyB0ZXh0KFFBY2Nlc3NpYmxlOjpUZXh0KSBjb25zdDsKLSAgICBRQWNjZXNzaWJsZTo6
Um9sZSByb2xlKCkgY29uc3Q7Ci0gICAgUUFjY2Vzc2libGU6OlN0YXRlIHN0YXRlKCkgY29uc3Q7
Ci19OwotCi1jbGFzcyBRV2ViVmlld0FjY2Vzc2libGUgOiBwdWJsaWMgUUFjY2Vzc2libGVXaWRn
ZXQgewotcHVibGljOgotICAgIFFXZWJWaWV3QWNjZXNzaWJsZShRV2ViVmlldyopOwotCi0gICAg
UVdlYlZpZXcqIHZpZXcoKSBjb25zdDsKLQotICAgIGludCBjaGlsZENvdW50KCkgY29uc3Q7Ci0g
ICAgUUFjY2Vzc2libGVJbnRlcmZhY2UqIGNoaWxkKGludCBpbmRleCkgY29uc3Q7Ci19OwotCi0j
ZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvQ2hyb21l
Q2xpZW50UXQuY3BwIGIvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9DaHJvbWVDbGll
bnRRdC5jcHAKaW5kZXggMDVmN2I5NDlkY2NjZDIyOTBhYzk3MDFmOGE2NmJmMDIzNDhjNzM2MS4u
NzFiNDVkNmRkZDcyZTEzYWU0NDk5MWM1ZmNjZjU5OWI1ZDIyYWQzNiAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9DaHJvbWVDbGllbnRRdC5jcHAKKysrIGIvU291
cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9DaHJvbWVDbGllbnRRdC5jcHAKQEAgLTYwLDYg
KzYwLDcgQEAKICNpbmNsdWRlICJTY3JvbGxiYXJUaGVtZS5oIgogI2luY2x1ZGUgIlNlYXJjaFBv
cHVwTWVudVF0LmgiCiAjaW5jbHVkZSAiU2VjdXJpdHlPcmlnaW4uaCIKKyNpbmNsdWRlICJUZXh0
dXJlTWFwcGVyTGF5ZXJDbGllbnRRdC5oIgogI2luY2x1ZGUgIlRpbGVkQmFja2luZ1N0b3JlLmgi
CiAjaW5jbHVkZSAiVmlld3BvcnRBcmd1bWVudHMuaCIKICNpbmNsdWRlICJXaW5kb3dGZWF0dXJl
cy5oIgpAQCAtMTY1LDcgKzE2NiwxMSBAQCBib29sIENocm9tZUNsaWVudFF0OjphbGxvd3NBY2Nl
bGVyYXRlZENvbXBvc2l0aW5nKCkgY29uc3QKIHsKICAgICBpZiAoIXBsYXRmb3JtUGFnZUNsaWVu
dCgpKQogICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgcmV0dXJuIHBsYXRmb3JtUGFnZUNsaWVu
dCgpLT5hbGxvd3NBY2NlbGVyYXRlZENvbXBvc2l0aW5nKCk7CisjaWYgVVNFKEFDQ0VMRVJBVEVE
X0NPTVBPU0lUSU5HKQorICAgIHJldHVybiB0cnVlOworI2Vsc2UKKyAgICByZXR1cm4gZmFsc2U7
CisjZW5kaWYKIH0KIAogRmxvYXRSZWN0IENocm9tZUNsaWVudFF0OjpwYWdlUmVjdCgpCkBAIC00
NTYsNyArNDYxLDggQEAgdm9pZCBDaHJvbWVDbGllbnRRdDo6c2Nyb2xsKGNvbnN0IEludFNpemUm
IGRlbHRhLCBjb25zdCBJbnRSZWN0JiBzY3JvbGxWaWV3UmVjdCwKIHZvaWQgQ2hyb21lQ2xpZW50
UXQ6OmRlbGVnYXRlZFNjcm9sbFJlcXVlc3RlZChjb25zdCBJbnRQb2ludCYgcG9pbnQpCiB7CiAK
LSAgICBJbnRTaXplIGN1cnJlbnRQb3NpdGlvbiA9IG1fd2ViUGFnZS0+bWFpbkZyYW1lQWRhcHRl
cigpLT5zY3JvbGxQb3NpdGlvbigpOworICAgIGNvbnN0IFFQb2ludCBvZnMgPSBtX3dlYlBhZ2Ut
Pm1haW5GcmFtZUFkYXB0ZXIoKS0+c2Nyb2xsUG9zaXRpb24oKTsKKyAgICBJbnRTaXplIGN1cnJl
bnRQb3NpdGlvbihvZnMueCgpLCBvZnMueSgpKTsKICAgICBpbnQgeCA9IHBvaW50LngoKSAtIGN1
cnJlbnRQb3NpdGlvbi53aWR0aCgpOwogICAgIGludCB5ID0gcG9pbnQueSgpIC0gY3VycmVudFBv
c2l0aW9uLmhlaWdodCgpOwogICAgIGNvbnN0IFFSZWN0IHJlY3QoUVBvaW50KDAsIDApLCBtX3dl
YlBhZ2UtPnZpZXdwb3J0U2l6ZSgpKTsKQEAgLTYyNiwyNyArNjMyLDI4IEBAIHZvaWQgQ2hyb21l
Q2xpZW50UXQ6OnNlcnZpY2VTY3JpcHRlZEFuaW1hdGlvbnMoKQogI2lmIFVTRShBQ0NFTEVSQVRF
RF9DT01QT1NJVElORykKIHZvaWQgQ2hyb21lQ2xpZW50UXQ6OmF0dGFjaFJvb3RHcmFwaGljc0xh
eWVyKEZyYW1lKiBmcmFtZSwgR3JhcGhpY3NMYXllciogZ3JhcGhpY3NMYXllcikKIHsKLSAgICBp
ZiAocGxhdGZvcm1QYWdlQ2xpZW50KCkpCi0gICAgICAgIHBsYXRmb3JtUGFnZUNsaWVudCgpLT5z
ZXRSb290R3JhcGhpY3NMYXllcihncmFwaGljc0xheWVyKTsKKyAgICBpZiAoIW1fdGV4dHVyZU1h
cHBlckxheWVyQ2xpZW50KQorICAgICAgICBtX3RleHR1cmVNYXBwZXJMYXllckNsaWVudCA9IGFk
b3B0UHRyKG5ldyBUZXh0dXJlTWFwcGVyTGF5ZXJDbGllbnRRdChtX3dlYlBhZ2UtPm1haW5GcmFt
ZUFkYXB0ZXIoKSkpOworICAgIG1fdGV4dHVyZU1hcHBlckxheWVyQ2xpZW50LT5zZXRSb290R3Jh
cGhpY3NMYXllcihncmFwaGljc0xheWVyKTsKIH0KIAogdm9pZCBDaHJvbWVDbGllbnRRdDo6c2V0
TmVlZHNPbmVTaG90RHJhd2luZ1N5bmNocm9uaXphdGlvbigpCiB7CiAgICAgLy8gd2Ugd2FudCB0
aGUgbGF5ZXJzIHRvIHN5bmNocm9uaXplIG5leHQgdGltZSB3ZSB1cGRhdGUgdGhlIHNjcmVlbiBh
bnl3YXkKLSAgICBpZiAocGxhdGZvcm1QYWdlQ2xpZW50KCkpCi0gICAgICAgIHBsYXRmb3JtUGFn
ZUNsaWVudCgpLT5tYXJrRm9yU3luYyhmYWxzZSk7CisgICAgaWYgKG1fdGV4dHVyZU1hcHBlckxh
eWVyQ2xpZW50KQorICAgICAgICBtX3RleHR1cmVNYXBwZXJMYXllckNsaWVudC0+bWFya0ZvclN5
bmMoZmFsc2UpOwogfQogCiB2b2lkIENocm9tZUNsaWVudFF0OjpzY2hlZHVsZUNvbXBvc2l0aW5n
TGF5ZXJGbHVzaCgpCiB7CiAgICAgLy8gd2Ugd2FudCB0aGUgbGF5ZXJzIHRvIHN5bmNocm9uaXpl
IEFTQVAKLSAgICBpZiAocGxhdGZvcm1QYWdlQ2xpZW50KCkpCi0gICAgICAgIHBsYXRmb3JtUGFn
ZUNsaWVudCgpLT5tYXJrRm9yU3luYyh0cnVlKTsKKyAgICBpZiAobV90ZXh0dXJlTWFwcGVyTGF5
ZXJDbGllbnQpCisgICAgICAgIG1fdGV4dHVyZU1hcHBlckxheWVyQ2xpZW50LT5tYXJrRm9yU3lu
Yyh0cnVlKTsKIH0KIAogQ2hyb21lQ2xpZW50OjpDb21wb3NpdGluZ1RyaWdnZXJGbGFncyBDaHJv
bWVDbGllbnRRdDo6YWxsb3dlZENvbXBvc2l0aW5nVHJpZ2dlcnMoKSBjb25zdAogewotICAgIGlm
IChwbGF0Zm9ybVBhZ2VDbGllbnQoKSAmJiBwbGF0Zm9ybVBhZ2VDbGllbnQoKS0+YWxsb3dzQWNj
ZWxlcmF0ZWRDb21wb3NpdGluZygpKQorICAgIGlmIChhbGxvd3NBY2NlbGVyYXRlZENvbXBvc2l0
aW5nKCkpCiAgICAgICAgIHJldHVybiBUaHJlZURUcmFuc2Zvcm1UcmlnZ2VyIHwgVmlkZW9Ucmln
Z2VyIHwgQ2FudmFzVHJpZ2dlciB8IEFuaW1hdGlvblRyaWdnZXI7CiAKICAgICByZXR1cm4gMDsK
QEAgLTY2MSw3ICs2NjgsOCBAQCBJbnRSZWN0IENocm9tZUNsaWVudFF0Ojp2aXNpYmxlUmVjdEZv
clRpbGVkQmFja2luZ1N0b3JlKCkgY29uc3QKICAgICAgICAgcmV0dXJuIEludFJlY3QoKTsKIAog
ICAgIGlmICghcGxhdGZvcm1QYWdlQ2xpZW50KCktPnZpZXdSZXNpemVzVG9Db250ZW50c0VuYWJs
ZWQoKSkgewotICAgICAgICBJbnRTaXplIG9mZnNldCA9IG1fd2ViUGFnZS0+bWFpbkZyYW1lQWRh
cHRlcigpLT5zY3JvbGxQb3NpdGlvbigpOworICAgICAgICBjb25zdCBRUG9pbnQgb2ZzID0gbV93
ZWJQYWdlLT5tYWluRnJhbWVBZGFwdGVyKCktPnNjcm9sbFBvc2l0aW9uKCk7CisgICAgICAgIElu
dFNpemUgb2Zmc2V0KG9mcy54KCksIG9mcy55KCkpOwogICAgICAgICByZXR1cm4gUVJlY3QoUVBv
aW50KG9mZnNldC53aWR0aCgpLCBvZmZzZXQuaGVpZ2h0KCkpLCBtX3dlYlBhZ2UtPm1haW5GcmFt
ZUFkYXB0ZXIoKS0+ZnJhbWVSZWN0KCkuc2l6ZSgpKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvQ2hyb21lQ2xpZW50UXQuaCBiL1NvdXJjZS9X
ZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvQ2hyb21lQ2xpZW50UXQuaAppbmRleCA5NmQ4NjI1YzA1
MDEzZjI3ZWFiMjk3NDIzNGZlZWI3YThkM2FmZmEyLi4xMjJiNDA4ZmI1NzQ4YmNiOWMwNzQ4NGQ2
NmY3NDVjOWQ0YTMxNGVlIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBw
b3J0L0Nocm9tZUNsaWVudFF0LmgKKysrIGIvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9y
dC9DaHJvbWVDbGllbnRRdC5oCkBAIC01OCw2ICs1OCw3IEBAIHN0cnVjdCBWaWV3cG9ydEFyZ3Vt
ZW50czsKICNpZiBFTkFCTEUoVklERU8pCiBjbGFzcyBGdWxsU2NyZWVuVmlkZW9RdDsKICNlbmRp
ZgorY2xhc3MgVGV4dHVyZU1hcHBlckxheWVyQ2xpZW50UXQ7CiAKIGNsYXNzIENocm9tZUNsaWVu
dFF0IDogcHVibGljIENocm9tZUNsaWVudCB7CiBwdWJsaWM6CkBAIC0yMjIsNiArMjIzLDEwIEBA
IHB1YmxpYzoKICAgICBzdGF0aWMgYm9vbCBkdW1wVmlzaXRlZExpbmtzQ2FsbGJhY2tzOwogCiAg
ICAgbXV0YWJsZSBRdFBsYXRmb3JtUGx1Z2luIG1fcGxhdGZvcm1QbHVnaW47CisKKyNpZiBVU0Uo
QUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgT3duUHRyPFRleHR1cmVNYXBwZXJMYXllckNs
aWVudFF0PiBtX3RleHR1cmVNYXBwZXJMYXllckNsaWVudDsKKyNlbmRpZgogfTsKIH0KIApkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9EZWZhdWx0RnVsbFNjcmVl
blZpZGVvSGFuZGxlci5jcHAgYi9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L0RlZmF1
bHRGdWxsU2NyZWVuVmlkZW9IYW5kbGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggMGZlMjRlOGJkNTIzNTI1YmFjOWJhODIyNDk4N2EzYjZjNmNlMTdkOS4uMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNv
cmVTdXBwb3J0L0RlZmF1bHRGdWxsU2NyZWVuVmlkZW9IYW5kbGVyLmNwcAorKysgL2Rldi9udWxs
CkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgRGlnaWEgUGxjIGFu
ZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKS4KLSAqIENvcHlyaWdodCAoQykgMjAxMSBOb2tpYSBD
b3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykuCi0gKgotICogVGhpcyBsaWJy
YXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICog
bW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJs
aWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp
b247IGVpdGhlcgotICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRp
b24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRl
ZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5Z
IFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNI
QU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUg
R05VCi0gKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4K
LSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFy
eSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2Vl
IHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwotICogdGhlIEZyZWUgU29m
dHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwK
LSAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgotICovCi0KLSNpbmNsdWRlICJjb25maWcu
aCIKLSNpbmNsdWRlICJEZWZhdWx0RnVsbFNjcmVlblZpZGVvSGFuZGxlci5oIgotCi0jaWYgVVNF
KFFUX01VTFRJTUVESUEpCi0KLSNpbmNsdWRlICJGdWxsU2NyZWVuVmlkZW9XaWRnZXQuaCIKLQot
dXNpbmcgbmFtZXNwYWNlIFdlYktpdDsKLQotYm9vbCBEZWZhdWx0RnVsbFNjcmVlblZpZGVvSGFu
ZGxlcjo6c19zaG91bGRGb3JjZUZ1bGxTY3JlZW5WaWRlb1BsYXliYWNrID0gZmFsc2U7Ci0KLURl
ZmF1bHRGdWxsU2NyZWVuVmlkZW9IYW5kbGVyOjpEZWZhdWx0RnVsbFNjcmVlblZpZGVvSGFuZGxl
cigpCi0gICAgOiBRV2ViRnVsbFNjcmVlblZpZGVvSGFuZGxlcigpCi0gICAgLCBtX2Z1bGxTY3Jl
ZW5XaWRnZXQobmV3IEZ1bGxTY3JlZW5WaWRlb1dpZGdldCkKLXsKLSAgICBjb25uZWN0KG1fZnVs
bFNjcmVlbldpZGdldCwgU0lHTkFMKGRpZEV4aXRGdWxsU2NyZWVuKCkpLCB0aGlzLCBTSUdOQUwo
ZnVsbFNjcmVlbkNsb3NlZCgpKSk7Ci0gICAgbV9mdWxsU2NyZWVuV2lkZ2V0LT5oaWRlKCk7Ci0K
LSAgICBtX2Z1bGxTY3JlZW5XaWRnZXQtPmNsb3NlKCk7Ci19Ci0KLURlZmF1bHRGdWxsU2NyZWVu
VmlkZW9IYW5kbGVyOjp+RGVmYXVsdEZ1bGxTY3JlZW5WaWRlb0hhbmRsZXIoKQotewotICAgIGRl
bGV0ZSBtX2Z1bGxTY3JlZW5XaWRnZXQ7Ci19Ci0KLWJvb2wgRGVmYXVsdEZ1bGxTY3JlZW5WaWRl
b0hhbmRsZXI6OnJlcXVpcmVzRnVsbFNjcmVlbkZvclZpZGVvUGxheWJhY2soKSBjb25zdAotewot
ICAgIHN0YXRpYyBib29sIGluaXRpYWxpemVkID0gZmFsc2U7Ci0gICAgaWYgKCFpbml0aWFsaXpl
ZCkgewotICAgICAgICBRQnl0ZUFycmF5IGZvcmNlRnVsbFNjcmVlbiA9IHFnZXRlbnYoIlFUX1dF
QktJVF9GT1JDRV9GVUxMU0NSRUVOX1ZJREVPIik7Ci0gICAgICAgIGlmICghZm9yY2VGdWxsU2Ny
ZWVuLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHNfc2hvdWxkRm9yY2VGdWxsU2NyZWVuVmlkZW9Q
bGF5YmFjayA9IHRydWU7Ci0KLSAgICAgICAgaW5pdGlhbGl6ZWQgPSB0cnVlOwotICAgIH0KLQot
ICAgIHJldHVybiBzX3Nob3VsZEZvcmNlRnVsbFNjcmVlblZpZGVvUGxheWJhY2s7Ci19Ci0KLXZv
aWQgRGVmYXVsdEZ1bGxTY3JlZW5WaWRlb0hhbmRsZXI6OmVudGVyRnVsbFNjcmVlbihRTWVkaWFQ
bGF5ZXIqIHBsYXllcikKLXsKLSAgICBtX2Z1bGxTY3JlZW5XaWRnZXQtPnNob3cocGxheWVyKTsK
LX0KLQotdm9pZCBEZWZhdWx0RnVsbFNjcmVlblZpZGVvSGFuZGxlcjo6ZXhpdEZ1bGxTY3JlZW4o
KQotewotICAgIG1fZnVsbFNjcmVlbldpZGdldC0+Y2xvc2UoKTsKLX0KLSNlbmRpZgotCi0KZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvRGVmYXVsdEZ1bGxTY3Jl
ZW5WaWRlb0hhbmRsZXIuaCBiL1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvRGVmYXVs
dEZ1bGxTY3JlZW5WaWRlb0hhbmRsZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
ZTk0M2M1NWU0NDAwODIyNTA4NWYzYTE2ODllNDlkZjIzODlmNGFkNy4uMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVT
dXBwb3J0L0RlZmF1bHRGdWxsU2NyZWVuVmlkZW9IYW5kbGVyLmgKKysrIC9kZXYvbnVsbApAQCAt
MSw1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIERpZ2lhIFBsYyBhbmQvb3Ig
aXRzIHN1YnNpZGlhcnkoLWllcykuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgTm9raWEgQ29ycG9y
YXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpLgotICoKLSAqIFRoaXMgbGlicmFyeSBp
cyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlm
eSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0g
KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBl
aXRoZXIKLSAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBh
bnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4g
dGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJS
QU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFC
SUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQot
ICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgot
ICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2Vu
ZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUg
ZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KLSAqIHRoZSBGcmVlIFNvZnR3YXJl
IEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCi0gKiBC
b3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KLSAqLwotI2lmbmRlZiBEZWZhdWx0RnVsbFNjcmVl
blZpZGVvSGFuZGxlcl9oCi0jZGVmaW5lIERlZmF1bHRGdWxsU2NyZWVuVmlkZW9IYW5kbGVyX2gK
LQotI2luY2x1ZGUgInF3ZWJraXRwbGF0Zm9ybXBsdWdpbi5oIgotCi1uYW1lc3BhY2UgV2ViS2l0
IHsKLQotY2xhc3MgRnVsbFNjcmVlblZpZGVvV2lkZ2V0OwotCi0vLyBXZSBkbyBub3QgdXNlIEVO
QUJMRSBvciBVU0UgYmVjYXVzZSBtb2MgZG9lcyBub3QgZXhwYW5kIHRoZXNlIG1hY3Jvcy4KLSNp
ZiBkZWZpbmVkKFdURl9VU0VfUVRfTVVMVElNRURJQSkgJiYgV1RGX1VTRV9RVF9NVUxUSU1FRElB
Ci1jbGFzcyBEZWZhdWx0RnVsbFNjcmVlblZpZGVvSGFuZGxlciA6IHB1YmxpYyBRV2ViRnVsbFNj
cmVlblZpZGVvSGFuZGxlciB7Ci0gICAgUV9PQkpFQ1QKLXB1YmxpYzoKLSAgICBEZWZhdWx0RnVs
bFNjcmVlblZpZGVvSGFuZGxlcigpOwotICAgIHZpcnR1YWwgfkRlZmF1bHRGdWxsU2NyZWVuVmlk
ZW9IYW5kbGVyKCk7Ci0gICAgYm9vbCByZXF1aXJlc0Z1bGxTY3JlZW5Gb3JWaWRlb1BsYXliYWNr
KCkgY29uc3Q7Ci0KLXB1YmxpYyBRX1NMT1RTOgotICAgIHZvaWQgZW50ZXJGdWxsU2NyZWVuKFFN
ZWRpYVBsYXllciopOwotICAgIHZvaWQgZXhpdEZ1bGxTY3JlZW4oKTsKLQotcHJpdmF0ZToKLSAg
ICBzdGF0aWMgYm9vbCBzX3Nob3VsZEZvcmNlRnVsbFNjcmVlblZpZGVvUGxheWJhY2s7Ci0gICAg
RnVsbFNjcmVlblZpZGVvV2lkZ2V0ICptX2Z1bGxTY3JlZW5XaWRnZXQ7Ci19OwotI2VuZGlmCi0K
LX0gLy8gbmFtZXNwYWNlIFdlYktpdAotCi0jZW5kaWYgLy8gRGVmYXVsdEZ1bGxTY3JlZW5WaWRl
b0hhbmRsZXJfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9E
dW1wUmVuZGVyVHJlZVN1cHBvcnRRdC5jcHAgYi9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBw
b3J0L0R1bXBSZW5kZXJUcmVlU3VwcG9ydFF0LmNwcAppbmRleCA5YTNiZTM1MjNmMWMxMDNiNzg0
MTNjNzEzZDAxYTQ1NDFjYWQwNTc0Li41Y2VhY2Q2YmMwMDI1ZjliNDk0OTAzMjA3OGViNDRkMTUy
MTQwNjhjIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L0R1bXBS
ZW5kZXJUcmVlU3VwcG9ydFF0LmNwcAorKysgYi9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBw
b3J0L0R1bXBSZW5kZXJUcmVlU3VwcG9ydFF0LmNwcApAQCAtMTA0OCwzICsxMDQ4LDExIEBAIHZv
aWQgRHVtcFJlbmRlclRyZWVTdXBwb3J0UXQ6OmdldFRyYWNrZWRSZXBhaW50UmVjdHMoUVdlYkZy
YW1lQWRhcHRlciogYWRhcHRlciwKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlY3RzLnNp
emUoKTsgKytpKQogICAgICAgICByZXN1bHQuYXBwZW5kKHJlY3RzW2ldKTsKIH0KKworUVN0cmlu
ZyBEdW1wUmVuZGVyVHJlZVN1cHBvcnRRdDo6ZnJhbWVSZW5kZXJUcmVlRHVtcChRV2ViRnJhbWVB
ZGFwdGVyKiBhZGFwdGVyKQoreworICAgIGlmIChhZGFwdGVyLT5mcmFtZS0+dmlldygpICYmIGFk
YXB0ZXItPmZyYW1lLT52aWV3KCktPmxheW91dFBlbmRpbmcoKSkKKyAgICAgICAgYWRhcHRlci0+
ZnJhbWUtPnZpZXcoKS0+bGF5b3V0KCk7CisKKyAgICByZXR1cm4gZXh0ZXJuYWxSZXByZXNlbnRh
dGlvbihhZGFwdGVyLT5mcmFtZSk7Cit9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0L1dl
YkNvcmVTdXBwb3J0L0R1bXBSZW5kZXJUcmVlU3VwcG9ydFF0LmggYi9Tb3VyY2UvV2ViS2l0L3F0
L1dlYkNvcmVTdXBwb3J0L0R1bXBSZW5kZXJUcmVlU3VwcG9ydFF0LmgKaW5kZXggNzI1MDViOGQz
NTIwYzc5NDhkNzQ2OGIyZDZjYjdhOGU2NDdhZTZmNS4uZDA2YTZiNTA1YmY2OTJkYWFjNTY4YmRj
ZDk5M2M2YTc4ZjIwMTJkYyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3Vw
cG9ydC9EdW1wUmVuZGVyVHJlZVN1cHBvcnRRdC5oCisrKyBiL1NvdXJjZS9XZWJLaXQvcXQvV2Vi
Q29yZVN1cHBvcnQvRHVtcFJlbmRlclRyZWVTdXBwb3J0UXQuaApAQCAtMjEzLDYgKzIxMyw4IEBA
IHB1YmxpYzoKICAgICBzdGF0aWMgdm9pZCBzZXRUcmFja1JlcGFpbnRSZWN0cyhRV2ViRnJhbWVB
ZGFwdGVyKiwgYm9vbCBlbmFibGUpOwogICAgIHN0YXRpYyBib29sIHRyYWNrUmVwYWludFJlY3Rz
KFFXZWJGcmFtZUFkYXB0ZXIqKTsKICAgICBzdGF0aWMgdm9pZCBnZXRUcmFja2VkUmVwYWludFJl
Y3RzKFFXZWJGcmFtZUFkYXB0ZXIqLCBRVmVjdG9yPFFSZWN0PiYgcmVzdWx0KTsKKworICAgIHN0
YXRpYyBRU3RyaW5nIGZyYW1lUmVuZGVyVHJlZUR1bXAoUVdlYkZyYW1lQWRhcHRlciopOwogfTsK
IAogI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L0Z1
bGxTY3JlZW5WaWRlb1dpZGdldC5jcHAgYi9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0
L0Z1bGxTY3JlZW5WaWRlb1dpZGdldC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDQxMDVkMDJjNjIyNTdjNTQ5OTA2ZmVjNTE1ZjRmNzZkNGVhOGI3ZDEuLjAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYktpdC9xdC9XZWJDb3Jl
U3VwcG9ydC9GdWxsU2NyZWVuVmlkZW9XaWRnZXQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTI1
ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgTm9raWEgQ29ycG9yYXRpb24gYW5k
L29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpLgotICoKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0g
KgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAot
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRF
UiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKLSAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVS
LCBJTkMuIE9SCi0gKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKLSAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgot
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQotICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0g
Ki8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIkZ1bGxTY3JlZW5WaWRlb1dpZGdl
dC5oIgotCi0jaW5jbHVkZSA8UUFwcGxpY2F0aW9uPgotI2luY2x1ZGUgPFFDbG9zZUV2ZW50Pgot
I2luY2x1ZGUgPFFEZXNrdG9wV2lkZ2V0PgotI2luY2x1ZGUgPFFLZXlFdmVudD4KLSNpbmNsdWRl
IDxRTWVkaWFQbGF5ZXI+Ci0KLXN0YXRpYyBjb25zdCBpbnQgZ0hpZGVNb3VzZUN1cnNvckRlbGF5
ID0gMzAwMDsKLQotbmFtZXNwYWNlIFdlYktpdCB7Ci0KLUZ1bGxTY3JlZW5WaWRlb1dpZGdldDo6
RnVsbFNjcmVlblZpZGVvV2lkZ2V0KCkKLSAgICA6IFFWaWRlb1dpZGdldCgpCi0gICAgLCBtX21l
ZGlhUGxheWVyKDApCi17Ci0gICAgUVBhbGV0dGUgcGFsZXR0ZSh0aGlzLT5wYWxldHRlKCkpOwot
ICAgIHBhbGV0dGUuc2V0Q29sb3IoUVBhbGV0dGU6OkJhc2UsIFF0OjpibGFjayk7Ci0gICAgcGFs
ZXR0ZS5zZXRDb2xvcihRUGFsZXR0ZTo6QmFja2dyb3VuZCwgUXQ6OmJsYWNrKTsKLSAgICBzZXRQ
YWxldHRlKHBhbGV0dGUpOwotCi0gICAgc2V0V2luZG93TW9kYWxpdHkoUXQ6OkFwcGxpY2F0aW9u
TW9kYWwpOwotICAgIHNldFdpbmRvd0ZsYWdzKHdpbmRvd0ZsYWdzKCkgfCBRdDo6RnJhbWVsZXNz
V2luZG93SGludCk7Ci0KLSAgICBzZXRHZW9tZXRyeShRQXBwbGljYXRpb246OmRlc2t0b3AoKS0+
c2NyZWVuR2VvbWV0cnkoKSk7Ci0KLSAgICBtX2N1cnNvclRpbWVyLnNldFNpbmdsZVNob3QodHJ1
ZSk7Ci0gICAgY29ubmVjdCgmbV9jdXJzb3JUaW1lciwgU0lHTkFMKHRpbWVvdXQoKSksIHRoaXMs
IFNMT1QoaGlkZUN1cnNvcigpKSk7Ci19Ci0KLUZ1bGxTY3JlZW5WaWRlb1dpZGdldDo6fkZ1bGxT
Y3JlZW5WaWRlb1dpZGdldCgpCi17Ci19Ci0KLXZvaWQgRnVsbFNjcmVlblZpZGVvV2lkZ2V0Ojpz
aG93KFFNZWRpYVBsYXllciogcGxheWVyKQotewotICAgIG1fbWVkaWFQbGF5ZXIgPSBwbGF5ZXI7
Ci0gICAgc2hvd0Z1bGxTY3JlZW4oKTsKLSAgICBzZXRNb3VzZVRyYWNraW5nKHRydWUpOwotICAg
IHJhaXNlKCk7Ci0gICAgbV9tZWRpYVBsYXllci0+c2V0VmlkZW9PdXRwdXQodGhpcyk7Ci0gICAg
c2V0Rm9jdXMoKTsKLSAgICBncmFiTW91c2UoKTsKLSAgICBoaWRlQ3Vyc29yKCk7Ci19Ci0KLXZv
aWQgRnVsbFNjcmVlblZpZGVvV2lkZ2V0OjpjbG9zZUV2ZW50KFFDbG9zZUV2ZW50KiBldmVudCkK
LXsKLSAgICBtX21lZGlhUGxheWVyID0gMDsKLSAgICBtX2N1cnNvclRpbWVyLnN0b3AoKTsKLSAg
ICBzZXRNb3VzZVRyYWNraW5nKGZhbHNlKTsKLSAgICByZWxlYXNlTW91c2UoKTsKLSAgICBRQXBw
bGljYXRpb246OnJlc3RvcmVPdmVycmlkZUN1cnNvcigpOwotICAgIGV2ZW50LT5pZ25vcmUoKTsK
LSAgICBoaWRlKCk7Ci0gICAgZW1pdCBkaWRFeGl0RnVsbFNjcmVlbigpOwotfQotCi1ib29sIEZ1
bGxTY3JlZW5WaWRlb1dpZGdldDo6ZXZlbnQoUUV2ZW50KiBldikKLXsKLSAgICBzd2l0Y2ggKGV2
LT50eXBlKCkpIHsKLSAgICBjYXNlIFFFdmVudDo6TW91c2VNb3ZlOgotICAgICAgICBzaG93Q3Vy
c29yKCk7Ci0gICAgICAgIGV2LT5hY2NlcHQoKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAg
Y2FzZSBRRXZlbnQ6Ok1vdXNlQnV0dG9uRGJsQ2xpY2s6Ci0gICAgICAgIGNsb3NlKCk7Ci0gICAg
ICAgIGV2LT5hY2NlcHQoKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZGVmYXVsdDoKLSAg
ICAgICAgcmV0dXJuIFFWaWRlb1dpZGdldDo6ZXZlbnQoZXYpOwotICAgIH0KLX0KLQotdm9pZCBG
dWxsU2NyZWVuVmlkZW9XaWRnZXQ6OmtleVByZXNzRXZlbnQoUUtleUV2ZW50KiBldikKLXsKLSAg
ICBpZiAobV9tZWRpYVBsYXllciAmJiBldi0+a2V5KCkgPT0gUXQ6OktleV9TcGFjZSkgewotICAg
ICAgICBpZiAobV9tZWRpYVBsYXllci0+c3RhdGUoKSA9PSBRTWVkaWFQbGF5ZXI6OlBsYXlpbmdT
dGF0ZSkKLSAgICAgICAgICAgIG1fbWVkaWFQbGF5ZXItPnBhdXNlKCk7Ci0gICAgICAgIGVsc2UK
LSAgICAgICAgICAgIG1fbWVkaWFQbGF5ZXItPnBsYXkoKTsKLSAgICB9IGVsc2UgaWYgKGV2LT5r
ZXkoKSA9PSBRdDo6S2V5X0VzY2FwZSkKLSAgICAgICAgY2xvc2UoKTsKLX0KLQotdm9pZCBGdWxs
U2NyZWVuVmlkZW9XaWRnZXQ6OmhpZGVDdXJzb3IoKQotewotICAgIFFBcHBsaWNhdGlvbjo6c2V0
T3ZlcnJpZGVDdXJzb3IoUUN1cnNvcihRdDo6QmxhbmtDdXJzb3IpKTsKLX0KLQotdm9pZCBGdWxs
U2NyZWVuVmlkZW9XaWRnZXQ6OnNob3dDdXJzb3IoKQotewotICAgIFFBcHBsaWNhdGlvbjo6cmVz
dG9yZU92ZXJyaWRlQ3Vyc29yKCk7Ci0gICAgbV9jdXJzb3JUaW1lci5zdGFydChnSGlkZU1vdXNl
Q3Vyc29yRGVsYXkpOwotfQotCi19CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNv
cmVTdXBwb3J0L0Z1bGxTY3JlZW5WaWRlb1dpZGdldC5oIGIvU291cmNlL1dlYktpdC9xdC9XZWJD
b3JlU3VwcG9ydC9GdWxsU2NyZWVuVmlkZW9XaWRnZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMjAxY2M0OWQxZTQxMmU5ODdiNmU0MWNjNTAzZGQyMmUzZDQ3NmExNy4uMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L3F0
L1dlYkNvcmVTdXBwb3J0L0Z1bGxTY3JlZW5WaWRlb1dpZGdldC5oCisrKyAvZGV2L251bGwKQEAg
LTEsNjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBOb2tpYSBDb3Jwb3JhdGlv
biBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykuCi0gKgotICogQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENP
TVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
Ci0gKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09N
UFVURVIsIElOQy4gT1IKLSAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCi0gKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCi0gKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KLSAqLwotCi0jaWZuZGVmIEZ1bGxTY3JlZW5WaWRlb1dpZGdldF9oCi0jZGVmaW5lIEZ1bGxT
Y3JlZW5WaWRlb1dpZGdldF9oCi0KLSNpbmNsdWRlIDxRVGltZXI+Ci0jaW5jbHVkZSA8UVZpZGVv
V2lkZ2V0PgotCi1RVF9CRUdJTl9OQU1FU1BBQ0UKLWNsYXNzIFFNZWRpYVBsYXllcjsKLVFUX0VO
RF9OQU1FU1BBQ0UKLQotbmFtZXNwYWNlIFdlYktpdCB7Ci0KLWNsYXNzIEZ1bGxTY3JlZW5WaWRl
b1dpZGdldCA6IHB1YmxpYyBRVmlkZW9XaWRnZXQgewotICAgIFFfT0JKRUNUCi1wdWJsaWM6Ci0g
ICAgRnVsbFNjcmVlblZpZGVvV2lkZ2V0KCk7Ci0gICAgdmlydHVhbCB+RnVsbFNjcmVlblZpZGVv
V2lkZ2V0KCk7Ci0gICAgdm9pZCBzaG93KFFNZWRpYVBsYXllciopOwotCi1RX1NJR05BTFM6Ci0g
ICAgdm9pZCBkaWRFeGl0RnVsbFNjcmVlbigpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB2
b2lkIGNsb3NlRXZlbnQoUUNsb3NlRXZlbnQqKTsKLSAgICB2aXJ0dWFsIGJvb2wgZXZlbnQoUUV2
ZW50Kik7Ci0gICAgdmlydHVhbCB2b2lkIGtleVByZXNzRXZlbnQoUUtleUV2ZW50Kik7Ci0KLXBy
aXZhdGUgUV9TTE9UUzoKLSAgICB2b2lkIGhpZGVDdXJzb3IoKTsKLQotcHJpdmF0ZToKLSAgICB2
b2lkIHNob3dDdXJzb3IoKTsKLSAgICBRTWVkaWFQbGF5ZXIqIG1fbWVkaWFQbGF5ZXI7Ci0gICAg
UVRpbWVyIG1fY3Vyc29yVGltZXI7Ci19OwotCi19Ci0KLSNlbmRpZiAvLyBGdWxsU2NyZWVuVmlk
ZW9XaWRnZXRfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9J
bml0V2ViQ29yZVF0LmNwcCBiL1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvSW5pdFdl
YkNvcmVRdC5jcHAKaW5kZXggZDJmNzVlYzE4NDNlNjY1YzE1NmQxYmE2ODc0ZDU0MDkyNWYwOWJj
MS4uNjBkY2RiZTk0YTZlNDIwYTQwM2RlYjIzM2U0ODI3YzNlMjY5MWQ2ZiAxMDA2NDQKLS0tIGEv
U291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9Jbml0V2ViQ29yZVF0LmNwcAorKysgYi9T
b3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L0luaXRXZWJDb3JlUXQuY3BwCkBAIC0zMCwx
MCArMzAsMTIgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJJbml0V2ViQ29yZVF0
LmgiCiAKKyNpbmNsdWRlICJDaHJvbWUuaCIKKyNpbmNsdWRlICJDaHJvbWVDbGllbnRRdC5oIgog
I2luY2x1ZGUgIkltYWdlLmgiCiAjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRl
ICJQYWdlLmgiCiAjaW5jbHVkZSAiUGxhdGZvcm1TdHJhdGVnaWVzUXQuaCIKLSNpbmNsdWRlICJR
U3R5bGVGYWNhZGVJbXAuaCIKICNpbmNsdWRlICJSZW5kZXJUaGVtZVFTdHlsZS5oIgogI2luY2x1
ZGUgIlNjcmlwdENvbnRyb2xsZXIuaCIKICNpbmNsdWRlICJTY3JvbGxiYXJUaGVtZVFTdHlsZS5o
IgpAQCAtNDgsMTggKzUwLDI2IEBACiAKIG5hbWVzcGFjZSBXZWJLaXQgewogCi1zdGF0aWMgUXRT
dHlsZUZhY3RvcnlGdW5jdGlvbiBpbml0Q2FsbGJhY2sgPSAwOworc3RhdGljIFF0U3R5bGVGYWNh
ZGVGYWN0b3J5RnVuY3Rpb24gaW5pdENhbGxiYWNrID0gMDsKIAotdm9pZCBzZXRXZWJLaXRXaWRn
ZXRzSW5pdENhbGxiYWNrKFF0U3R5bGVGYWN0b3J5RnVuY3Rpb24gY2FsbGJhY2spCitRX0RFQ0xf
RVhQT1JUIHZvaWQgc2V0V2ViS2l0V2lkZ2V0c0luaXRDYWxsYmFjayhRdFN0eWxlRmFjYWRlRmFj
dG9yeUZ1bmN0aW9uIGNhbGxiYWNrKQogewogICAgIGluaXRDYWxsYmFjayA9IGNhbGxiYWNrOwog
fQogCitzdGF0aWMgV2ViQ29yZTo6UVN0eWxlRmFjYWRlKiBjcmVhdGVTdHlsZUZvclBhZ2UoV2Vi
Q29yZTo6UGFnZSogcGFnZSkKK3sKKyAgICBRV2ViUGFnZUFkYXB0ZXIqIHBhZ2VBZGFwdGVyID0g
MDsKKyAgICBpZiAocGFnZSkKKyAgICAgICAgcGFnZUFkYXB0ZXIgPSBzdGF0aWNfY2FzdDxXZWJD
b3JlOjpDaHJvbWVDbGllbnRRdCo+KHBhZ2UtPmNocm9tZSgpLT5jbGllbnQoKSktPm1fd2ViUGFn
ZTsKKyAgICByZXR1cm4gaW5pdENhbGxiYWNrKHBhZ2VBZGFwdGVyKTsKK30KKwogLy8gQ2FsbGVk
IGFsc28gZnJvbSBXZWJLaXQyJ3MgV2ViUHJvY2VzcwogUV9ERUNMX0VYUE9SVCB2b2lkIGluaXRp
YWxpemVXZWJLaXRRdCgpCiB7CiAgICAgaWYgKGluaXRDYWxsYmFjaykgewotICAgICAgICBXZWJD
b3JlOjpSZW5kZXJUaGVtZVFTdHlsZTo6c2V0U3R5bGVGYWN0b3J5RnVuY3Rpb24oaW5pdENhbGxi
YWNrKTsKKyAgICAgICAgV2ViQ29yZTo6UmVuZGVyVGhlbWVRU3R5bGU6OnNldFN0eWxlRmFjdG9y
eUZ1bmN0aW9uKGNyZWF0ZVN0eWxlRm9yUGFnZSk7CiAgICAgICAgIFdlYkNvcmU6OlJlbmRlclRo
ZW1lUXQ6OnNldEN1c3RvbVRoZW1lKFdlYkNvcmU6OlJlbmRlclRoZW1lUVN0eWxlOjpjcmVhdGUs
IG5ldyBXZWJDb3JlOjpTY3JvbGxiYXJUaGVtZVFTdHlsZSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9Jbml0V2ViQ29yZVF0LmggYi9Tb3Vy
Y2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L0luaXRXZWJDb3JlUXQuaAppbmRleCA3ZTFiMGI3
YTI4NjIwMmUwM2Q1ZjdkODk1ODkwNmI4NTFjMjg3NmE5Li41OTEzOTk5OTMzODkxMmMyY2JiYzM5
ZmRjMzA2ZGQxNmZmZmI2MWQ1IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVT
dXBwb3J0L0luaXRXZWJDb3JlUXQuaAorKysgYi9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBw
b3J0L0luaXRXZWJDb3JlUXQuaApAQCAtMzYsMTEgKzM2LDEzIEBAIG5hbWVzcGFjZSBXZWJDb3Jl
IHsKIGNsYXNzIFBhZ2U7CiBjbGFzcyBRU3R5bGVGYWNhZGU7CiB9Ci10eXBlZGVmIFdlYkNvcmU6
OlFTdHlsZUZhY2FkZSogKCpRdFN0eWxlRmFjdG9yeUZ1bmN0aW9uKShXZWJDb3JlOjpQYWdlKik7
CitjbGFzcyBRV2ViUGFnZUFkYXB0ZXI7CisKK3R5cGVkZWYgV2ViQ29yZTo6UVN0eWxlRmFjYWRl
KiAoKlF0U3R5bGVGYWNhZGVGYWN0b3J5RnVuY3Rpb24pKFFXZWJQYWdlQWRhcHRlciopOwogCiBu
YW1lc3BhY2UgV2ViS2l0IHsKIAotdm9pZCBzZXRXZWJLaXRXaWRnZXRzSW5pdENhbGxiYWNrKFF0
U3R5bGVGYWN0b3J5RnVuY3Rpb24pOworUV9ERUNMX0VYUE9SVCB2b2lkIHNldFdlYktpdFdpZGdl
dHNJbml0Q2FsbGJhY2soUXRTdHlsZUZhY2FkZUZhY3RvcnlGdW5jdGlvbik7CiBRX0RFQ0xfRVhQ
T1JUIHZvaWQgaW5pdGlhbGl6ZVdlYktpdFF0KCk7CiBRX0RFQ0xfRVhQT1JUIHZvaWQgc2V0SW1h
Z2VQbGF0Zm9ybVJlc291cmNlKGNvbnN0IGNoYXIqIC8qIG5hbWUgKi8sIGNvbnN0IFFQaXhtYXAm
KTsKIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9Jbml0V2Vi
S2l0UXQuY3BwIGIvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9Jbml0V2ViS2l0UXQu
Y3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTg4NjAzN2RhNWY4YzEyNWY2NTA1
NGNmZThjZmYxNzcxNGRlNGUwLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvSW5pdFdlYktpdFF0LmNw
cAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIw
MTIgRGlnaWEgUGxjIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKS4KLSAqCi0gKiBUaGlzIGxp
YnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0g
KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1
YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh
dGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9w
dGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1
dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBB
TlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVS
Q0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRo
ZSBHTlUKLSAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxz
LgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBz
ZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCi0gKiB0aGUgRnJlZSBT
b2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29y
LAotICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCi0gKgotICovCi0KLSNpbmNsdWRlICJj
b25maWcuaCIKLSNpbmNsdWRlICJJbml0V2ViS2l0UXQuaCIKLQotI2luY2x1ZGUgIkluaXRXZWJD
b3JlUXQuaCIKLQotI2luY2x1ZGUgIlFTdHlsZUZhY2FkZUltcC5oIgotCi0jaW5jbHVkZSA8UUFw
cGxpY2F0aW9uPgotI2luY2x1ZGUgPFFTdHlsZT4KLQotbmFtZXNwYWNlIFdlYktpdCB7Ci0KLVFf
REVDTF9FWFBPUlQgdm9pZCBpbml0aWFsaXplV2ViS2l0V2lkZ2V0cygpCi17Ci0gICAgc3RhdGlj
IGJvb2wgaW5pdGlhbGl6ZWQgPSBmYWxzZTsKLSAgICBpZiAoaW5pdGlhbGl6ZWQpCi0gICAgICAg
IHJldHVybjsKLQotICAgIHNldFdlYktpdFdpZGdldHNJbml0Q2FsbGJhY2soUVN0eWxlRmFjYWRl
SW1wOjpjcmVhdGUpOwotICAgIGluaXRpYWxpemVXZWJLaXRRdCgpOwotCi0gICAgLy8gUVdlYlNl
dHRpbmdzOjpTZWFyY2hDYW5jZWxCdXR0b25HcmFwaGljCi0gICAgc2V0SW1hZ2VQbGF0Zm9ybVJl
c291cmNlKCJzZWFyY2hDYW5jZWxCdXR0b24iLCBRQXBwbGljYXRpb246OnN0eWxlKCktPnN0YW5k
YXJkUGl4bWFwKFFTdHlsZTo6U1BfRGlhbG9nQ2xvc2VCdXR0b24pKTsKLSAgICAvLyBRV2ViU2V0
dGluZ3M6OlNlYXJjaENhbmNlbEJ1dHRvblByZXNzZWRHcmFwaGljCi0gICAgc2V0SW1hZ2VQbGF0
Zm9ybVJlc291cmNlKCJzZWFyY2hDYW5jZWxCdXR0b25QcmVzc2VkIiwgUUFwcGxpY2F0aW9uOjpz
dHlsZSgpLT5zdGFuZGFyZFBpeG1hcChRU3R5bGU6OlNQX0RpYWxvZ0Nsb3NlQnV0dG9uKSk7Ci0K
LSAgICBpbml0aWFsaXplZCA9IHRydWU7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJL
aXQvcXQvV2ViQ29yZVN1cHBvcnQvSW5pdFdlYktpdFF0LmggYi9Tb3VyY2UvV2ViS2l0L3F0L1dl
YkNvcmVTdXBwb3J0L0luaXRXZWJLaXRRdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCBmYmIyZDE4ZjczZDc3MWYwODcxOGM2Y2JlYjE0Yjk5NTc5ZWQ1OGExLi4wMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29y
ZVN1cHBvcnQvSW5pdFdlYktpdFF0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0v
KgotICogQ29weXJpZ2h0IChDKSAyMDEyIERpZ2lhIFBsYyBhbmQvb3IgaXRzIHN1YnNpZGlhcnko
LWllcykuCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVk
aXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg
R05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyIG9mIHRoZSBM
aWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRo
aXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNl
ZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxp
ZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExp
Y2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQg
YSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9u
ZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3
cml0ZSB0bwotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmts
aW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKLSAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgot
ICoKLSAqLwotCi0jaWZuZGVmIEluaXRXZWJLaXRRdF9oCi0jZGVmaW5lIEluaXRXZWJLaXRRdF9o
Ci0KLW5hbWVzcGFjZSBXZWJLaXQgewotCi1RX0RFQ0xfRVhQT1JUIHZvaWQgaW5pdGlhbGl6ZVdl
YktpdFdpZGdldHMoKTsKLQotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0
L1dlYkNvcmVTdXBwb3J0L0luc3BlY3RvckNsaWVudFdlYlBhZ2UuY3BwIGIvU291cmNlL1dlYktp
dC9xdC9XZWJDb3JlU3VwcG9ydC9JbnNwZWN0b3JDbGllbnRXZWJQYWdlLmNwcApkZWxldGVkIGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggZGM0NzMwYjMyOTU4NTg3OGMwNTJlNGFmYjE5ODViYTA0YmUz
NzQzZC4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3Vy
Y2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L0luc3BlY3RvckNsaWVudFdlYlBhZ2UuY3BwCisr
KyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBB
cHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQ29weXJpZ2h0IChDKSAyMDA4IE5v
a2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQotICogQ29weXJpZ2h0
IChDKSAyMDA4IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyCi0gKiBDb3B5cmlnaHQgKEMpIDIw
MTIgRGlnaWEgUGxjIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQotICoKLSAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuICBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KLSAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgotICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBs
ZSIpIG5vciB0aGUgbmFtZXMgb2YKLSAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2Vk
IHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICAgZnJvbSB0aGlz
IHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoK
LSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRP
UlMgIkFTIElTIiBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJF
Ci0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAot
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJjb25maWcu
aCIKLSNpbmNsdWRlICJJbnNwZWN0b3JDbGllbnRXZWJQYWdlLmgiCi0KLSNpbmNsdWRlIDxxd2Vi
ZnJhbWUuaD4KLQotdXNpbmcgbmFtZXNwYWNlIFdlYktpdDsKLQotSW5zcGVjdG9yQ2xpZW50V2Vi
UGFnZTo6SW5zcGVjdG9yQ2xpZW50V2ViUGFnZSgpCi17Ci0gICAgUVdlYlZpZXcqIHZpZXcgPSBu
ZXcgUVdlYlZpZXc7Ci0gICAgdmlldy0+c2V0UGFnZSh0aGlzKTsKLSAgICBzZXRQYXJlbnQodmll
dyk7Ci0gICAgY29ubmVjdChtYWluRnJhbWUoKSwgU0lHTkFMKGphdmFTY3JpcHRXaW5kb3dPYmpl
Y3RDbGVhcmVkKCkpLCBTTE9UKGphdmFTY3JpcHRXaW5kb3dPYmplY3RDbGVhcmVkKCkpKTsKLX0K
LQotUVdlYlBhZ2UqIEluc3BlY3RvckNsaWVudFdlYlBhZ2U6OmNyZWF0ZVdpbmRvdyhRV2ViUGFn
ZTo6V2ViV2luZG93VHlwZSkKLXsKLSAgICBRV2ViVmlldyogdmlldyA9IG5ldyBRV2ViVmlldzsK
LSAgICBRV2ViUGFnZSogcGFnZSA9IG5ldyBRV2ViUGFnZTsKLSAgICB2aWV3LT5zZXRQYWdlKHBh
Z2UpOwotICAgIHZpZXctPnNldEF0dHJpYnV0ZShRdDo6V0FfRGVsZXRlT25DbG9zZSk7Ci0gICAg
cmV0dXJuIHBhZ2U7Ci19Ci0KLXZvaWQgSW5zcGVjdG9yQ2xpZW50V2ViUGFnZTo6amF2YVNjcmlw
dFdpbmRvd09iamVjdENsZWFyZWQoKQotewotICAgIFFWYXJpYW50IGluc3BlY3RvckphdmFTY3Jp
cHRXaW5kb3dPYmplY3RzID0gcHJvcGVydHkoIl9xX2luc3BlY3RvckphdmFTY3JpcHRXaW5kb3dP
YmplY3RzIik7Ci0gICAgaWYgKCFpbnNwZWN0b3JKYXZhU2NyaXB0V2luZG93T2JqZWN0cy5pc1Zh
bGlkKCkpCi0gICAgICAgIHJldHVybjsKLSAgICBRTWFwPFFTdHJpbmcsIFFWYXJpYW50PiBqYXZh
U2NyaXB0TmFtZU9iamVjdE1hcCA9IGluc3BlY3RvckphdmFTY3JpcHRXaW5kb3dPYmplY3RzLnRv
TWFwKCk7Ci0gICAgUVdlYkZyYW1lKiBmcmFtZSA9IG1haW5GcmFtZSgpOwotICAgIFFNYXA8UVN0
cmluZywgUVZhcmlhbnQ+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGphdmFTY3JpcHROYW1lT2JqZWN0
TWFwLmNvbnN0QmVnaW4oKTsKLSAgICBmb3IgKCA7IGl0ICE9IGphdmFTY3JpcHROYW1lT2JqZWN0
TWFwLmNvbnN0RW5kKCk7ICsraXQpIHsKLSAgICAgICAgUVN0cmluZyBuYW1lID0gaXQua2V5KCk7
Ci0gICAgICAgIFFWYXJpYW50IHZhbHVlID0gaXQudmFsdWUoKTsKLSAgICAgICAgUU9iamVjdCog
b2JqID0gdmFsdWUudmFsdWU8UU9iamVjdCo+KCk7Ci0gICAgICAgIGZyYW1lLT5hZGRUb0phdmFT
Y3JpcHRXaW5kb3dPYmplY3QobmFtZSwgb2JqKTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvSW5zcGVjdG9yQ2xpZW50V2ViUGFnZS5oIGIv
U291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9JbnNwZWN0b3JDbGllbnRXZWJQYWdlLmgK
ZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4N2YyOWIwY2Y1MjE5ZGZhYTA0ZmIzZThm
YzU3OGZkZGFlYTA4YWMuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAK
LS0tIGEvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9JbnNwZWN0b3JDbGllbnRXZWJQ
YWdlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChD
KSAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQgKEMp
IDIwMDggTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCi0gKiBD
b3B5cmlnaHQgKEMpIDIwMDggSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIKLSAqIENvcHlyaWdo
dCAoQykgMjAxMiBEaWdpYSBQbGMgYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCi0gKgotICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0g
KiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgotICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCi0gKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5j
LiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgotICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5
IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgICBm
cm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Np
b24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENP
TlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVP
UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLSNpZm5kZWYgSW5z
cGVjdG9yQ2xpZW50V2ViUGFnZV9oCi0jZGVmaW5lIEluc3BlY3RvckNsaWVudFdlYlBhZ2VfaAot
Ci0jaW5jbHVkZSA8cXdlYnBhZ2UuaD4KLSNpbmNsdWRlIDxxd2Vidmlldy5oPgotCi1uYW1lc3Bh
Y2UgV2ViS2l0IHsKLQotY2xhc3MgSW5zcGVjdG9yQ2xpZW50V2ViUGFnZSA6IHB1YmxpYyBRV2Vi
UGFnZSB7Ci0gICAgUV9PQkpFQ1QKLSAgICBmcmllbmQgY2xhc3MgSW5zcGVjdG9yQ2xpZW50UXQ7
Ci1wdWJsaWM6Ci0gICAgSW5zcGVjdG9yQ2xpZW50V2ViUGFnZSgpOwotCi0gICAgUVdlYlBhZ2Uq
IGNyZWF0ZVdpbmRvdyhRV2ViUGFnZTo6V2ViV2luZG93VHlwZSk7Ci0KLXB1YmxpYyBRX1NMT1RT
OgotICAgIHZvaWQgamF2YVNjcmlwdFdpbmRvd09iamVjdENsZWFyZWQoKTsKLX07Ci0KLX0gLy8g
bmFtZXNwYWNlIFdlYktpdAotCi0jZW5kaWYgLy8gSW5zcGVjdG9yQ2xpZW50V2ViUGFnZV9oCmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L0luc3BlY3RvclNlcnZl
clF0LmNwcCBiL1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvSW5zcGVjdG9yU2VydmVy
UXQuY3BwCmluZGV4IGFiZjljM2Y3ODcwMmYyZTEzNWRhYWE2NzMxNTNjZDQ5OWE1NWZhMjEuLjE1
YTNkYWYzOTY1ZWVlZmUyM2ZlYTM5ZTgxYzZmYTM0NzdhYzg0NzEgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvSW5zcGVjdG9yU2VydmVyUXQuY3BwCisrKyBiL1Nv
dXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvSW5zcGVjdG9yU2VydmVyUXQuY3BwCkBAIC0z
NjMsMyArMzYzLDUgQEAgdm9pZCBJbnNwZWN0b3JTZXJ2ZXJSZXF1ZXN0SGFuZGxlclF0Ojp3ZWJT
b2NrZXRSZWFkeVJlYWQoKQogfQogCiB9CisKKyNpbmNsdWRlICJtb2NfSW5zcGVjdG9yU2VydmVy
UXQuY3BwIgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9QYWdl
Q2xpZW50UXQuY3BwIGIvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9QYWdlQ2xpZW50
UXQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmIwOTBhZjJhMzg3MDMwNzdm
Y2E1NDBmYTAyOWVkMWFkZWU4YmE5Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvUGFnZUNsaWVudFF0
LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChD
KSAyMDEwIE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQotICoK
LSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp
dCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0
d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3Ig
KGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIGxpYnJhcnkg
aXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1
dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5
IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP
U0UuICBTZWUgdGhlIEdOVQotICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBt
b3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0
aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlz
IGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KLSAq
IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwg
RmlmdGggRmxvb3IsCi0gKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KLSAqCi0gKi8KLQot
I2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIlBhZ2VDbGllbnRRdC5oIgotCi0jaW5jbHVk
ZSA8UUdyYXBoaWNzU2NlbmU+Ci0jaW5jbHVkZSA8UUdyYXBoaWNzVmlldz4KLQotI2lmIGRlZmlu
ZWQoUV9XU19YMTEpCi0jaW5jbHVkZSA8UVgxMUluZm8+Ci0jZW5kaWYKLQotI2lmZGVmIFFUX09Q
RU5HTF9MSUIKLSNpbmNsdWRlIDxRR0xXaWRnZXQ+Ci0jZW5kaWYKLQotI2lmIFVTRSgzRF9HUkFQ
SElDUykKLSNpbmNsdWRlIDxRV2luZG93PgotCi1zdGF0aWMgdm9pZCBjcmVhdGVQbGF0Zm9ybUdy
YXBoaWNzQ29udGV4dDNERnJvbVdpZGdldChRV2lkZ2V0KiB3aWRnZXQsIFBsYXRmb3JtR3JhcGhp
Y3NDb250ZXh0M0QqIGNvbnRleHQsIFBsYXRmb3JtR3JhcGhpY3NTdXJmYWNlM0QqIHN1cmZhY2Us
IFFPYmplY3QqKiBzdXJmYWNlT3duZXIpCi17Ci0jaWZkZWYgUVRfT1BFTkdMX0xJQgotICAgICpj
b250ZXh0ID0gMDsKLSAgICAqc3VyZmFjZSA9IDA7Ci0gICAgaWYgKHN1cmZhY2VPd25lcikKLSAg
ICAgICAgKnN1cmZhY2VPd25lciA9IDA7Ci0gICAgUUFic3RyYWN0U2Nyb2xsQXJlYSogc2Nyb2xs
QXJlYSA9IHFvYmplY3RfY2FzdDxRQWJzdHJhY3RTY3JvbGxBcmVhKj4od2lkZ2V0KTsKLSAgICBp
ZiAoIXNjcm9sbEFyZWEpCi0gICAgICAgIHJldHVybjsKLQotICAgIFFHTFdpZGdldCogZ2xWaWV3
cG9ydCA9IHFvYmplY3RfY2FzdDxRR0xXaWRnZXQqPihzY3JvbGxBcmVhLT52aWV3cG9ydCgpKTsK
LSAgICBpZiAoIWdsVmlld3BvcnQpCi0gICAgICAgIHJldHVybjsKLSAgICBRR0xXaWRnZXQqIGds
V2lkZ2V0ID0gbmV3IFFHTFdpZGdldCgwLCBnbFZpZXdwb3J0KTsKLSAgICBpZiAoZ2xXaWRnZXQt
PmlzVmFsaWQoKSkgewotICAgICAgICAvLyBHZW9tZXRyeSBjYW4gYmUgc2V0IHRvIHplcm8gYmVj
YXVzZSBtX2dsV2lkZ2V0IGlzIHVzZWQgb25seSBmb3IgaXRzIFFHTENvbnRleHQuCi0gICAgICAg
IGdsV2lkZ2V0LT5zZXRHZW9tZXRyeSgwLCAwLCAwLCAwKTsKLSAgICAgICAgaWYgKHN1cmZhY2VP
d25lcikKLSAgICAgICAgICAgICpzdXJmYWNlT3duZXIgPSBnbFdpZGdldDsKLSAgICAgICAgKnN1
cmZhY2UgPSBnbFdpZGdldC0+d2luZG93SGFuZGxlKCk7Ci0gICAgICAgICpjb250ZXh0ID0gZ2xX
aWRnZXQtPmNvbnRleHQoKS0+Y29udGV4dEhhbmRsZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAg
IGRlbGV0ZSBnbFdpZGdldDsKLSAgICAgICAgZ2xXaWRnZXQgPSAwOwotICAgIH0KLSNlbmRpZgot
fQotI2VuZGlmCi0KLSNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCi0jaW5jbHVkZSAi
VGV4dHVyZU1hcHBlci5oIgotI2luY2x1ZGUgInRleG1hcC9UZXh0dXJlTWFwcGVyTGF5ZXIuaCIK
LSNlbmRpZgotCi1RV2luZG93KiBRV2ViUGFnZUNsaWVudDo6b3duZXJXaW5kb3coKSBjb25zdAot
ewotICAgIFFXaWRnZXQqIHdpZGdldCA9IHFvYmplY3RfY2FzdDxRV2lkZ2V0Kj4ob3duZXJXaWRn
ZXQoKSk7Ci0gICAgaWYgKCF3aWRnZXQpCi0gICAgICAgIHJldHVybiAwOwotICAgIGlmIChRV2lu
ZG93ICp3aW5kb3cgPSB3aWRnZXQtPndpbmRvd0hhbmRsZSgpKQotICAgICAgICByZXR1cm4gd2lu
ZG93OwotICAgIGlmIChjb25zdCBRV2lkZ2V0ICpuYXRpdmVQYXJlbnQgPSB3aWRnZXQtPm5hdGl2
ZVBhcmVudFdpZGdldCgpKQotICAgICAgICByZXR1cm4gbmF0aXZlUGFyZW50LT53aW5kb3dIYW5k
bGUoKTsKLSAgICByZXR1cm4gMDsKLX0KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotCi0jaWYgVVNF
KEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQotVGV4dHVyZU1hcHBlckxheWVyQ2xpZW50UXQ6OlRl
eHR1cmVNYXBwZXJMYXllckNsaWVudFF0KFFXZWJGcmFtZSogZnJhbWUsIEdyYXBoaWNzTGF5ZXIq
IGxheWVyKQotICAgIDogbV9mcmFtZShmcmFtZSkKLSAgICAsIG1fcm9vdEdyYXBoaWNzTGF5ZXIo
R3JhcGhpY3NMYXllcjo6Y3JlYXRlKDApKQotewotICAgIG1fZnJhbWUtPmQtPnJvb3RUZXh0dXJl
TWFwcGVyTGF5ZXIgPSByb290TGF5ZXIoKTsKLSAgICBtX3Jvb3RHcmFwaGljc0xheWVyLT5hZGRD
aGlsZChsYXllcik7Ci0gICAgbV9yb290R3JhcGhpY3NMYXllci0+c2V0RHJhd3NDb250ZW50KGZh
bHNlKTsKLSAgICBtX3Jvb3RHcmFwaGljc0xheWVyLT5zZXRNYXNrc1RvQm91bmRzKGZhbHNlKTsK
LSAgICBtX3Jvb3RHcmFwaGljc0xheWVyLT5zZXRTaXplKEludFNpemUoMSwgMSkpOwotfQotCi12
b2lkIFRleHR1cmVNYXBwZXJMYXllckNsaWVudFF0OjpzZXRUZXh0dXJlTWFwcGVyKGNvbnN0IFBh
c3NPd25QdHI8VGV4dHVyZU1hcHBlcj4mIHRleHR1cmVNYXBwZXIpCi17Ci0gICAgbV9mcmFtZS0+
ZC0+dGV4dHVyZU1hcHBlciA9IHRleHR1cmVNYXBwZXI7Ci0gICAgbV9mcmFtZS0+ZC0+cm9vdFRl
eHR1cmVNYXBwZXJMYXllci0+c2V0VGV4dHVyZU1hcHBlcihtX2ZyYW1lLT5kLT50ZXh0dXJlTWFw
cGVyLmdldCgpKTsKLSAgICBzeW5jUm9vdExheWVyKCk7Ci19Ci0KLVRleHR1cmVNYXBwZXJMYXll
ckNsaWVudFF0Ojp+VGV4dHVyZU1hcHBlckxheWVyQ2xpZW50UXQoKQotewotICAgIG1fZnJhbWUt
PmQtPnJvb3RUZXh0dXJlTWFwcGVyTGF5ZXIgPSAwOwotfQotCi12b2lkIFRleHR1cmVNYXBwZXJM
YXllckNsaWVudFF0OjpzeW5jUm9vdExheWVyKCkKLXsKLSAgICBtX3Jvb3RHcmFwaGljc0xheWVy
LT5mbHVzaENvbXBvc2l0aW5nU3RhdGVGb3JUaGlzTGF5ZXJPbmx5KCk7Ci19Ci0KLVRleHR1cmVN
YXBwZXJMYXllciogVGV4dHVyZU1hcHBlckxheWVyQ2xpZW50UXQ6OnJvb3RMYXllcigpCi17Ci0g
ICAgcmV0dXJuIHRvVGV4dHVyZU1hcHBlckxheWVyKG1fcm9vdEdyYXBoaWNzTGF5ZXIuZ2V0KCkp
OwotfQotCi0KLXZvaWQgUGFnZUNsaWVudFFXaWRnZXQ6OnNldFJvb3RHcmFwaGljc0xheWVyKEdy
YXBoaWNzTGF5ZXIqIGxheWVyKQotewotICAgIGlmIChsYXllcikgewotICAgICAgICBUZXh0dXJl
TWFwcGVyTGF5ZXJDbGllbnQgPSBhZG9wdFB0cihuZXcgVGV4dHVyZU1hcHBlckxheWVyQ2xpZW50
UXQocGFnZS0+bWFpbkZyYW1lKCksIGxheWVyKSk7Ci0gICAgICAgIFRleHR1cmVNYXBwZXJMYXll
ckNsaWVudC0+c2V0VGV4dHVyZU1hcHBlcihUZXh0dXJlTWFwcGVyOjpjcmVhdGUoKSk7Ci0gICAg
ICAgIHJldHVybjsKLSAgICB9Ci0gICAgVGV4dHVyZU1hcHBlckxheWVyQ2xpZW50LmNsZWFyKCk7
Ci19Ci0KLXZvaWQgUGFnZUNsaWVudFFXaWRnZXQ6Om1hcmtGb3JTeW5jKGJvb2wgc2NoZWR1bGVT
eW5jKQotewotICAgIGlmIChzeW5jVGltZXIuaXNBY3RpdmUoKSkKLSAgICAgICAgcmV0dXJuOwot
ICAgIHN5bmNUaW1lci5zdGFydE9uZVNob3QoMCk7Ci19Ci0KLXZvaWQgUGFnZUNsaWVudFFXaWRn
ZXQ6OnN5bmNMYXllcnMoVGltZXI8UGFnZUNsaWVudFFXaWRnZXQ+KikKLXsKLSAgICBpZiAoVGV4
dHVyZU1hcHBlckxheWVyQ2xpZW50KQotICAgICAgICBUZXh0dXJlTWFwcGVyTGF5ZXJDbGllbnQt
PnN5bmNSb290TGF5ZXIoKTsKLSAgICBRV2ViRnJhbWVQcml2YXRlOjpjb3JlKHBhZ2UtPm1haW5G
cmFtZSgpKS0+dmlldygpLT5mbHVzaENvbXBvc2l0aW5nU3RhdGVJbmNsdWRpbmdTdWJmcmFtZXMo
KTsKLSAgICBpZiAoIVRleHR1cmVNYXBwZXJMYXllckNsaWVudCkKLSAgICAgICAgcmV0dXJuOwot
ICAgIGlmIChUZXh0dXJlTWFwcGVyTGF5ZXJDbGllbnQtPnJvb3RMYXllcigpLT5kZXNjZW5kYW50
c09yU2VsZkhhdmVSdW5uaW5nQW5pbWF0aW9ucygpICYmICFzeW5jVGltZXIuaXNBY3RpdmUoKSkK
LSAgICAgICAgc3luY1RpbWVyLnN0YXJ0T25lU2hvdCgxLjAgLyA2MC4wKTsKLSAgICB1cGRhdGUo
dmlldy0+cmVjdCgpKTsKLX0KLSNlbmRpZgotCi12b2lkIFBhZ2VDbGllbnRRV2lkZ2V0OjpzY3Jv
bGwoaW50IGR4LCBpbnQgZHksIGNvbnN0IFFSZWN0JiByZWN0VG9TY3JvbGwpCi17Ci0gICAgdmll
dy0+c2Nyb2xsKHFyZWFsKGR4KSwgcXJlYWwoZHkpLCByZWN0VG9TY3JvbGwpOwotfQotCi12b2lk
IFBhZ2VDbGllbnRRV2lkZ2V0Ojp1cGRhdGUoY29uc3QgUVJlY3QgJiBkaXJ0eVJlY3QpCi17Ci0g
ICAgdmlldy0+dXBkYXRlKGRpcnR5UmVjdCk7Ci19Ci0KLXZvaWQgUGFnZUNsaWVudFFXaWRnZXQ6
OnNldElucHV0TWV0aG9kRW5hYmxlZChib29sIGVuYWJsZSkKLXsKLSAgICB2aWV3LT5zZXRBdHRy
aWJ1dGUoUXQ6OldBX0lucHV0TWV0aG9kRW5hYmxlZCwgZW5hYmxlKTsKLX0KLQotYm9vbCBQYWdl
Q2xpZW50UVdpZGdldDo6aW5wdXRNZXRob2RFbmFibGVkKCkgY29uc3QKLXsKLSAgICByZXR1cm4g
dmlldy0+dGVzdEF0dHJpYnV0ZShRdDo6V0FfSW5wdXRNZXRob2RFbmFibGVkKTsKLX0KLQotdm9p
ZCBQYWdlQ2xpZW50UVdpZGdldDo6c2V0SW5wdXRNZXRob2RIaW50cyhRdDo6SW5wdXRNZXRob2RI
aW50cyBoaW50cykKLXsKLSAgICB2aWV3LT5zZXRJbnB1dE1ldGhvZEhpbnRzKGhpbnRzKTsKLX0K
LQotUGFnZUNsaWVudFFXaWRnZXQ6On5QYWdlQ2xpZW50UVdpZGdldCgpCi17Ci19Ci0KLSNpZm5k
ZWYgUVRfTk9fQ1VSU09SCi1RQ3Vyc29yIFBhZ2VDbGllbnRRV2lkZ2V0OjpjdXJzb3IoKSBjb25z
dAotewotICAgIHJldHVybiB2aWV3LT5jdXJzb3IoKTsKLX0KLQotdm9pZCBQYWdlQ2xpZW50UVdp
ZGdldDo6dXBkYXRlQ3Vyc29yKGNvbnN0IFFDdXJzb3ImIGN1cnNvcikKLXsKLSAgICB2aWV3LT5z
ZXRDdXJzb3IoY3Vyc29yKTsKLX0KLSNlbmRpZgotCi1RUGFsZXR0ZSBQYWdlQ2xpZW50UVdpZGdl
dDo6cGFsZXR0ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHZpZXctPnBhbGV0dGUoKTsKLX0KLQot
aW50IFBhZ2VDbGllbnRRV2lkZ2V0OjpzY3JlZW5OdW1iZXIoKSBjb25zdAotewotI2lmIGRlZmlu
ZWQoUV9XU19YMTEpCi0gICAgcmV0dXJuIHZpZXctPngxMUluZm8oKS5zY3JlZW4oKTsKLSNlbmRp
ZgotICAgIHJldHVybiAwOwotfQotCi1RT2JqZWN0KiBQYWdlQ2xpZW50UVdpZGdldDo6b3duZXJX
aWRnZXQoKSBjb25zdAotewotICAgIHJldHVybiB2aWV3OwotfQotCi1RUmVjdCBQYWdlQ2xpZW50
UVdpZGdldDo6Z2VvbWV0cnlSZWxhdGl2ZVRvT3duZXJXaWRnZXQoKSBjb25zdAotewotICAgIHJl
dHVybiB2aWV3LT5nZW9tZXRyeSgpOwotfQotCi1RT2JqZWN0KiBQYWdlQ2xpZW50UVdpZGdldDo6
cGx1Z2luUGFyZW50KCkgY29uc3QKLXsKLSAgICByZXR1cm4gdmlldzsKLX0KLQotUVN0eWxlKiBQ
YWdlQ2xpZW50UVdpZGdldDo6c3R5bGUoKSBjb25zdAotewotICAgIHJldHVybiB2aWV3LT5zdHls
ZSgpOwotfQotCi1RUmVjdEYgUGFnZUNsaWVudFFXaWRnZXQ6OndpbmRvd1JlY3QoKSBjb25zdAot
ewotICAgIHJldHVybiBRUmVjdEYodmlldy0+d2luZG93KCktPmdlb21ldHJ5KCkpOwotfQotCi12
b2lkIFBhZ2VDbGllbnRRV2lkZ2V0OjpzZXRXaWRnZXRWaXNpYmxlKFdpZGdldCogd2lkZ2V0LCBi
b29sIHZpc2libGUpCi17Ci0gICAgUVdpZGdldCogcXRXaWRnZXQgPSBxb2JqZWN0X2Nhc3Q8UVdp
ZGdldCo+KHdpZGdldC0+cGxhdGZvcm1XaWRnZXQoKSk7Ci0gICAgaWYgKCFxdFdpZGdldCkKLSAg
ICAgICAgcmV0dXJuOwotICAgIHF0V2lkZ2V0LT5zZXRWaXNpYmxlKHZpc2libGUpOwotfQotCi0j
aWYgVVNFKDNEX0dSQVBISUNTKQotdm9pZCBQYWdlQ2xpZW50UVdpZGdldDo6Y3JlYXRlUGxhdGZv
cm1HcmFwaGljc0NvbnRleHQzRChQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dDNEKiBjb250ZXh0LCBQ
bGF0Zm9ybUdyYXBoaWNzU3VyZmFjZTNEKiBzdXJmYWNlLCBRT2JqZWN0Kiogc3VyZmFjZU93bmVy
KQotewotICAgIGNyZWF0ZVBsYXRmb3JtR3JhcGhpY3NDb250ZXh0M0RGcm9tV2lkZ2V0KHZpZXcs
IGNvbnRleHQsIHN1cmZhY2UsIHN1cmZhY2VPd25lcik7Ci19Ci0jZW5kaWYKLQotI2lmICFkZWZp
bmVkKFFUX05PX0dSQVBISUNTVklFVykKLVBhZ2VDbGllbnRRR3JhcGhpY3NXaWRnZXQ6On5QYWdl
Q2xpZW50UUdyYXBoaWNzV2lkZ2V0KCkKLXsKLSAgICBkZWxldGUgb3ZlcmxheTsKLX0KLQotdm9p
ZCBQYWdlQ2xpZW50UUdyYXBoaWNzV2lkZ2V0OjpzY3JvbGwoaW50IGR4LCBpbnQgZHksIGNvbnN0
IFFSZWN0JiByZWN0VG9TY3JvbGwpCi17Ci0gICAgdmlldy0+c2Nyb2xsKHFyZWFsKGR4KSwgcXJl
YWwoZHkpLCByZWN0VG9TY3JvbGwpOwotfQotCi12b2lkIFBhZ2VDbGllbnRRR3JhcGhpY3NXaWRn
ZXQ6OnVwZGF0ZShjb25zdCBRUmVjdCYgZGlydHlSZWN0KQotewotICAgIHZpZXctPnVwZGF0ZShk
aXJ0eVJlY3QpOwotCi0gICAgaWYgKG92ZXJsYXkpCi0gICAgICAgIG92ZXJsYXktPnVwZGF0ZShR
UmVjdEYoZGlydHlSZWN0KSk7Ci19Ci0KLSNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcp
Ci12b2lkIFBhZ2VDbGllbnRRR3JhcGhpY3NXaWRnZXQ6OnN5bmNMYXllcnMoKQotewotICAgIGlm
IChUZXh0dXJlTWFwcGVyTGF5ZXJDbGllbnQpCi0gICAgICAgIFRleHR1cmVNYXBwZXJMYXllckNs
aWVudC0+c3luY1Jvb3RMYXllcigpOwotCi0gICAgUVdlYkZyYW1lUHJpdmF0ZTo6Y29yZShwYWdl
LT5tYWluRnJhbWUoKSktPnZpZXcoKS0+Zmx1c2hDb21wb3NpdGluZ1N0YXRlSW5jbHVkaW5nU3Vi
ZnJhbWVzKCk7Ci0KLSAgICBpZiAoIVRleHR1cmVNYXBwZXJMYXllckNsaWVudCkKLSAgICAgICAg
cmV0dXJuOwotCi0gICAgaWYgKFRleHR1cmVNYXBwZXJMYXllckNsaWVudC0+cm9vdExheWVyKCkt
PmRlc2NlbmRhbnRzT3JTZWxmSGF2ZVJ1bm5pbmdBbmltYXRpb25zKCkgJiYgIXN5bmNUaW1lci5p
c0FjdGl2ZSgpKQotICAgICAgICBzeW5jVGltZXIuc3RhcnRPbmVTaG90KDEuMCAvIDYwLjApOwot
ICAgIHVwZGF0ZSh2aWV3LT5ib3VuZGluZ1JlY3QoKS50b0FsaWduZWRSZWN0KCkpOwotfQotCi12
b2lkIFBhZ2VDbGllbnRRR3JhcGhpY3NXaWRnZXQ6OnNldFJvb3RHcmFwaGljc0xheWVyKEdyYXBo
aWNzTGF5ZXIqIGxheWVyKQotewotICAgIGlmIChsYXllcikgewotICAgICAgICBUZXh0dXJlTWFw
cGVyTGF5ZXJDbGllbnQgPSBhZG9wdFB0cihuZXcgVGV4dHVyZU1hcHBlckxheWVyQ2xpZW50UXQo
cGFnZS0+bWFpbkZyYW1lKCksIGxheWVyKSk7Ci0jaWYgVVNFKFRFWFRVUkVfTUFQUEVSX0dMKSAm
JiBkZWZpbmVkKFFUX09QRU5HTF9MSUIpCi0gICAgICAgIFFHcmFwaGljc1ZpZXcqIGdyYXBoaWNz
VmlldyA9IHZpZXctPnNjZW5lKCktPnZpZXdzKClbMF07Ci0gICAgICAgIGlmIChncmFwaGljc1Zp
ZXcgJiYgZ3JhcGhpY3NWaWV3LT52aWV3cG9ydCgpKSB7Ci0gICAgICAgICAgICBRR0xXaWRnZXQq
IGdsV2lkZ2V0ID0gcW9iamVjdF9jYXN0PFFHTFdpZGdldCo+KGdyYXBoaWNzVmlldy0+dmlld3Bv
cnQoKSk7Ci0gICAgICAgICAgICBpZiAoZ2xXaWRnZXQpIHsKLSAgICAgICAgICAgICAgICAvLyBU
aGUgR0wgY29udGV4dCBiZWxvbmdpbmcgdG8gdGhlIFFHTFdpZGdldCB2aWV3cG9ydCBtdXN0IGJl
IGN1cnJlbnQgd2hlbiBUZXh0dXJlTWFwcGVyIGlzIGJlaW5nIGNyZWF0ZWQuCi0gICAgICAgICAg
ICAgICAgZ2xXaWRnZXQtPm1ha2VDdXJyZW50KCk7Ci0gICAgICAgICAgICAgICAgVGV4dHVyZU1h
cHBlckxheWVyQ2xpZW50LT5zZXRUZXh0dXJlTWFwcGVyKFRleHR1cmVNYXBwZXI6OmNyZWF0ZShU
ZXh0dXJlTWFwcGVyOjpPcGVuR0xNb2RlKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAg
ICAgICAgICAgfQotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgVGV4dHVyZU1hcHBlckxheWVy
Q2xpZW50LT5zZXRUZXh0dXJlTWFwcGVyKFRleHR1cmVNYXBwZXI6OmNyZWF0ZSgpKTsKLSAgICAg
ICAgcmV0dXJuOwotICAgIH0KLSAgICBUZXh0dXJlTWFwcGVyTGF5ZXJDbGllbnQuY2xlYXIoKTsK
LX0KLQotdm9pZCBQYWdlQ2xpZW50UUdyYXBoaWNzV2lkZ2V0OjptYXJrRm9yU3luYyhib29sIHNj
aGVkdWxlU3luYykKLXsKLSAgICBpZiAoc3luY1RpbWVyLmlzQWN0aXZlKCkpCi0gICAgICAgIHJl
dHVybjsKLSAgICBzeW5jVGltZXIuc3RhcnRPbmVTaG90KDApOwotfQotCi0jZW5kaWYKLQotI2lm
IFVTRShUSUxFRF9CQUNLSU5HX1NUT1JFKQotdm9pZCBQYWdlQ2xpZW50UUdyYXBoaWNzV2lkZ2V0
Ojp1cGRhdGVUaWxlZEJhY2tpbmdTdG9yZVNjYWxlKCkKLXsKLSAgICBXZWJDb3JlOjpUaWxlZEJh
Y2tpbmdTdG9yZSogYmFja2luZ1N0b3JlID0gUVdlYkZyYW1lUHJpdmF0ZTo6Y29yZShwYWdlLT5t
YWluRnJhbWUoKSktPnRpbGVkQmFja2luZ1N0b3JlKCk7Ci0gICAgaWYgKCFiYWNraW5nU3RvcmUp
Ci0gICAgICAgIHJldHVybjsKLSAgICBiYWNraW5nU3RvcmUtPnNldENvbnRlbnRzU2NhbGUodmll
dy0+c2NhbGUoKSk7Ci19Ci0jZW5kaWYKLQotdm9pZCBQYWdlQ2xpZW50UUdyYXBoaWNzV2lkZ2V0
OjpzZXRJbnB1dE1ldGhvZEVuYWJsZWQoYm9vbCBlbmFibGUpCi17Ci0gICAgdmlldy0+c2V0Rmxh
ZyhRR3JhcGhpY3NJdGVtOjpJdGVtQWNjZXB0c0lucHV0TWV0aG9kLCBlbmFibGUpOwotfQotCi1i
b29sIFBhZ2VDbGllbnRRR3JhcGhpY3NXaWRnZXQ6OmlucHV0TWV0aG9kRW5hYmxlZCgpIGNvbnN0
Ci17Ci0gICAgcmV0dXJuIHZpZXctPmZsYWdzKCkgJiBRR3JhcGhpY3NJdGVtOjpJdGVtQWNjZXB0
c0lucHV0TWV0aG9kOwotfQotCi12b2lkIFBhZ2VDbGllbnRRR3JhcGhpY3NXaWRnZXQ6OnNldElu
cHV0TWV0aG9kSGludHMoUXQ6OklucHV0TWV0aG9kSGludHMgaGludHMpCi17Ci0gICAgdmlldy0+
c2V0SW5wdXRNZXRob2RIaW50cyhoaW50cyk7Ci19Ci0KLSNpZm5kZWYgUVRfTk9fQ1VSU09SCi1R
Q3Vyc29yIFBhZ2VDbGllbnRRR3JhcGhpY3NXaWRnZXQ6OmN1cnNvcigpIGNvbnN0Ci17Ci0gICAg
cmV0dXJuIHZpZXctPmN1cnNvcigpOwotfQotCi12b2lkIFBhZ2VDbGllbnRRR3JhcGhpY3NXaWRn
ZXQ6OnVwZGF0ZUN1cnNvcihjb25zdCBRQ3Vyc29yJiBjdXJzb3IpCi17Ci0gICAgdmlldy0+c2V0
Q3Vyc29yKGN1cnNvcik7Ci19Ci0jZW5kaWYKLQotUVBhbGV0dGUgUGFnZUNsaWVudFFHcmFwaGlj
c1dpZGdldDo6cGFsZXR0ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHZpZXctPnBhbGV0dGUoKTsK
LX0KLQotaW50IFBhZ2VDbGllbnRRR3JhcGhpY3NXaWRnZXQ6OnNjcmVlbk51bWJlcigpIGNvbnN0
Ci17Ci0jaWYgZGVmaW5lZChRX1dTX1gxMSkKLSAgICBpZiAoUUdyYXBoaWNzU2NlbmUqIHNjZW5l
ID0gdmlldy0+c2NlbmUoKSkgewotICAgICAgICBjb25zdCBRTGlzdDxRR3JhcGhpY3NWaWV3Kj4g
dmlld3MgPSBzY2VuZS0+dmlld3MoKTsKLQotICAgICAgICBpZiAoIXZpZXdzLmlzRW1wdHkoKSkK
LSAgICAgICAgICAgIHJldHVybiB2aWV3cy5hdCgwKS0+eDExSW5mbygpLnNjcmVlbigpOwotICAg
IH0KLSNlbmRpZgotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLVFPYmplY3QqIFBhZ2VDbGllbnRRR3Jh
cGhpY3NXaWRnZXQ6Om93bmVyV2lkZ2V0KCkgY29uc3QKLXsKLSAgICBpZiAoUUdyYXBoaWNzU2Nl
bmUqIHNjZW5lID0gdmlldy0+c2NlbmUoKSkgewotICAgICAgICBjb25zdCBRTGlzdDxRR3JhcGhp
Y3NWaWV3Kj4gdmlld3MgPSBzY2VuZS0+dmlld3MoKTsKLSAgICAgICAgcmV0dXJuIHZpZXdzLnZh
bHVlKDApOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotUVJlY3QgUGFnZUNsaWVudFFHcmFw
aGljc1dpZGdldDo6Z2VvbWV0cnlSZWxhdGl2ZVRvT3duZXJXaWRnZXQoKSBjb25zdAotewotICAg
IGlmICghdmlldy0+c2NlbmUoKSkKLSAgICAgICAgcmV0dXJuIFFSZWN0KCk7Ci0KLSAgICBRTGlz
dDxRR3JhcGhpY3NWaWV3Kj4gdmlld3MgPSB2aWV3LT5zY2VuZSgpLT52aWV3cygpOwotICAgIGlm
ICh2aWV3cy5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybiBRUmVjdCgpOwotCi0gICAgUUdyYXBo
aWNzVmlldyogZ3JhcGhpY3NWaWV3ID0gdmlld3MuYXQoMCk7Ci0gICAgcmV0dXJuIGdyYXBoaWNz
Vmlldy0+bWFwRnJvbVNjZW5lKHZpZXctPmJvdW5kaW5nUmVjdCgpKS5ib3VuZGluZ1JlY3QoKTsK
LX0KLQotI2lmIFVTRShUSUxFRF9CQUNLSU5HX1NUT1JFKQotUVJlY3RGIFBhZ2VDbGllbnRRR3Jh
cGhpY3NXaWRnZXQ6OmdyYXBoaWNzSXRlbVZpc2libGVSZWN0KCkgY29uc3QKLXsKLSAgICBpZiAo
IXZpZXctPnNjZW5lKCkpCi0gICAgICAgIHJldHVybiBRUmVjdEYoKTsKLQotICAgIFFMaXN0PFFH
cmFwaGljc1ZpZXcqPiB2aWV3cyA9IHZpZXctPnNjZW5lKCktPnZpZXdzKCk7Ci0gICAgaWYgKHZp
ZXdzLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIFFSZWN0RigpOwotCi0gICAgUUdyYXBoaWNz
VmlldyogZ3JhcGhpY3NWaWV3ID0gdmlld3MuYXQoMCk7Ci0gICAgaW50IHhPZmZzZXQgPSBncmFw
aGljc1ZpZXctPmhvcml6b250YWxTY3JvbGxCYXIoKS0+dmFsdWUoKTsKLSAgICBpbnQgeU9mZnNl
dCA9IGdyYXBoaWNzVmlldy0+dmVydGljYWxTY3JvbGxCYXIoKS0+dmFsdWUoKTsKLSAgICByZXR1
cm4gdmlldy0+bWFwUmVjdEZyb21TY2VuZShRUmVjdEYoUVBvaW50Rih4T2Zmc2V0LCB5T2Zmc2V0
KSwgZ3JhcGhpY3NWaWV3LT52aWV3cG9ydCgpLT5zaXplKCkpKTsKLX0KLSNlbmRpZgotCi1RT2Jq
ZWN0KiBQYWdlQ2xpZW50UUdyYXBoaWNzV2lkZ2V0OjpwbHVnaW5QYXJlbnQoKSBjb25zdAotewot
ICAgIHJldHVybiB2aWV3OwotfQotCi1RU3R5bGUqIFBhZ2VDbGllbnRRR3JhcGhpY3NXaWRnZXQ6
OnN0eWxlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gdmlldy0+c3R5bGUoKTsKLX0KLQotdm9pZCBQ
YWdlQ2xpZW50UUdyYXBoaWNzV2lkZ2V0OjpzZXRXaWRnZXRWaXNpYmxlKFdpZGdldCosIGJvb2wp
Ci17Ci0gICAgLy8gRG9lc24ndCBtYWtlIHNlbnNlLCBkb2VzIGl0PwotfQotCi1RUmVjdEYgUGFn
ZUNsaWVudFFHcmFwaGljc1dpZGdldDo6d2luZG93UmVjdCgpIGNvbnN0Ci17Ci0gICAgaWYgKCF2
aWV3LT5zY2VuZSgpKQotICAgICAgICByZXR1cm4gUVJlY3RGKCk7Ci0KLSAgICAvLyBUaGUgc2Nl
bmVSZWN0IGlzIGEgZ29vZCBhcHByb3hpbWF0aW9uIG9mIHRoZSBzaXplIG9mIHRoZSBhcHBsaWNh
dGlvbiwgaW5kZXBlbmRlbnQgb2YgdGhlIHZpZXcuCi0gICAgcmV0dXJuIHZpZXctPnNjZW5lKCkt
PnNjZW5lUmVjdCgpOwotfQotI2VuZGlmIC8vIFFUX05PX0dSQVBISUNTVklFVwotCi0jaWYgVVNF
KDNEX0dSQVBISUNTKQotdm9pZCBQYWdlQ2xpZW50UUdyYXBoaWNzV2lkZ2V0OjpjcmVhdGVQbGF0
Zm9ybUdyYXBoaWNzQ29udGV4dDNEKFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0M0QqIGNvbnRleHQs
IFBsYXRmb3JtR3JhcGhpY3NTdXJmYWNlM0QqIHN1cmZhY2UsIFFPYmplY3QqKiBzdXJmYWNlT3du
ZXIpCi17Ci0gICAgY3JlYXRlUGxhdGZvcm1HcmFwaGljc0NvbnRleHQzREZyb21XaWRnZXQocW9i
amVjdF9jYXN0PFFXaWRnZXQqPihvd25lcldpZGdldCgpKSwgY29udGV4dCwgc3VyZmFjZSwgc3Vy
ZmFjZU93bmVyKTsKLX0KLSNlbmRpZgotCi19IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L1BhZ2VDbGllbnRRdC5oIGIvU291
cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9QYWdlQ2xpZW50UXQuaApkZWxldGVkIGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggNzJkY2E0MmMxNWJlYWMyMDM4YjgwYzE5NmMwMDdiZGU3MTgzMmYy
OS4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2Uv
V2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L1BhZ2VDbGllbnRRdC5oCisrKyAvZGV2L251bGwKQEAg
LTEsMjQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgTm9raWEgQ29ycG9yYXRp
b24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZy
ZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0
IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAqIExp
Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl
cgotICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBs
YXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUg
aG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZ
OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElU
WSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBM
aWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZ
b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxl
IENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwotICogdGhlIEZyZWUgU29mdHdhcmUgRm91
bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKLSAqIEJvc3Rv
biwgTUEgMDIxMTAtMTMwMSwgVVNBLgotICoKLSAqLwotCi0jaWZuZGVmIFBhZ2VDbGllbnRRdF9o
Ci0jZGVmaW5lIFBhZ2VDbGllbnRRdF9oCi0KLSNpbmNsdWRlICJGcmFtZVZpZXcuaCIKLSNpbmNs
dWRlICJHcmFwaGljc0NvbnRleHQuaCIKLSNpbmNsdWRlICJJbnRSZWN0LmgiCi0jaW5jbHVkZSAi
UVdlYlBhZ2VDbGllbnQuaCIKLSNpbmNsdWRlICJUaWxlZEJhY2tpbmdTdG9yZS5oIgotI2luY2x1
ZGUgInFncmFwaGljc3dlYnZpZXcuaCIKLSNpbmNsdWRlICJxd2ViZnJhbWUuaCIKLSNpbmNsdWRl
ICJxd2ViZnJhbWVfcC5oIgotI2luY2x1ZGUgInF3ZWJwYWdlLmgiCi0jaW5jbHVkZSAicXdlYnBh
Z2VfcC5oIgotI2luY2x1ZGUgPFNldHRpbmdzLmg+Ci0jaW5jbHVkZSA8cWdyYXBoaWNzc2NlbmUu
aD4KLSNpbmNsdWRlIDxxZ3JhcGhpY3N2aWV3Lmg+Ci0jaW5jbHVkZSA8cWdyYXBoaWNzd2lkZ2V0
Lmg+Ci0jaW5jbHVkZSA8cW1ldGFvYmplY3QuaD4KLSNpbmNsdWRlIDxxc2Nyb2xsYmFyLmg+Ci0j
aW5jbHVkZSA8cXN0eWxlb3B0aW9uLmg+Ci0jaW5jbHVkZSA8cXdpZGdldC5oPgotCi1uYW1lc3Bh
Y2UgV2ViQ29yZSB7Ci0KLSNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCi1jbGFzcyBU
ZXh0dXJlTWFwcGVyTGF5ZXJDbGllbnRRdCB7Ci1wdWJsaWM6Ci0gICAgVGV4dHVyZU1hcHBlckxh
eWVyQ2xpZW50UXQoUVdlYkZyYW1lKiwgR3JhcGhpY3NMYXllciopOwotICAgIHZpcnR1YWwgflRl
eHR1cmVNYXBwZXJMYXllckNsaWVudFF0KCk7Ci0gICAgdm9pZCBzZXRUZXh0dXJlTWFwcGVyKGNv
bnN0IFBhc3NPd25QdHI8VGV4dHVyZU1hcHBlcj4mKTsKLSAgICB2b2lkIHN5bmNSb290TGF5ZXIo
KTsKLSAgICBUZXh0dXJlTWFwcGVyTGF5ZXIqIHJvb3RMYXllcigpOwotCi1wcml2YXRlOgotICAg
IFFXZWJGcmFtZSogbV9mcmFtZTsKLSAgICBPd25QdHI8R3JhcGhpY3NMYXllcj4gbV9yb290R3Jh
cGhpY3NMYXllcjsKLX07Ci0jZW5kaWYKLQotY2xhc3MgUGFnZUNsaWVudFFXaWRnZXQgOiBwdWJs
aWMgUVdlYlBhZ2VDbGllbnQgewotcHVibGljOgotICAgIFBhZ2VDbGllbnRRV2lkZ2V0KFFXaWRn
ZXQqIG5ld1ZpZXcsIFFXZWJQYWdlKiBuZXdQYWdlKQotICAgICAgICA6IHZpZXcobmV3VmlldykK
LSAgICAgICAgLCBwYWdlKG5ld1BhZ2UpCi0jaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5H
KQotICAgICAgICAsIHN5bmNUaW1lcih0aGlzLCAmUGFnZUNsaWVudFFXaWRnZXQ6OnN5bmNMYXll
cnMpCi0jZW5kaWYKLSAgICB7Ci0gICAgICAgIFFfQVNTRVJUKHZpZXcpOwotICAgIH0KLSAgICB2
aXJ0dWFsIH5QYWdlQ2xpZW50UVdpZGdldCgpOwotCi0gICAgdmlydHVhbCBib29sIGlzUVdpZGdl
dENsaWVudCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBzY3Jv
bGwoaW50IGR4LCBpbnQgZHksIGNvbnN0IFFSZWN0Jik7Ci0gICAgdmlydHVhbCB2b2lkIHVwZGF0
ZShjb25zdCBRUmVjdCYgZGlydHlSZWN0KTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0SW5wdXRNZXRo
b2RFbmFibGVkKGJvb2wpOwotICAgIHZpcnR1YWwgYm9vbCBpbnB1dE1ldGhvZEVuYWJsZWQoKSBj
b25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0SW5wdXRNZXRob2RIaW50cyhRdDo6SW5wdXRNZXRo
b2RIaW50cyk7Ci0KLSNpZm5kZWYgUVRfTk9fQ1VSU09SCi0gICAgdmlydHVhbCBRQ3Vyc29yIGN1
cnNvcigpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVDdXJzb3IoY29uc3QgUUN1cnNv
ciYpOwotI2VuZGlmCi0KLSAgICB2aXJ0dWFsIFFQYWxldHRlIHBhbGV0dGUoKSBjb25zdDsKLSAg
ICB2aXJ0dWFsIGludCBzY3JlZW5OdW1iZXIoKSBjb25zdDsKLSAgICB2aXJ0dWFsIFFPYmplY3Qq
IG93bmVyV2lkZ2V0KCkgY29uc3Q7Ci0gICAgdmlydHVhbCBRUmVjdCBnZW9tZXRyeVJlbGF0aXZl
VG9Pd25lcldpZGdldCgpIGNvbnN0OwotCi0gICAgdmlydHVhbCBRT2JqZWN0KiBwbHVnaW5QYXJl
bnQoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgUVN0eWxlKiBzdHlsZSgpIGNvbnN0OwotCi0gICAg
dmlydHVhbCBib29sIHZpZXdSZXNpemVzVG9Db250ZW50c0VuYWJsZWQoKSBjb25zdCB7IHJldHVy
biBmYWxzZTsgfQotCi0gICAgdmlydHVhbCBRUmVjdEYgd2luZG93UmVjdCgpIGNvbnN0OwotCi0g
ICAgdmlydHVhbCB2b2lkIHNldFdpZGdldFZpc2libGUoV2lkZ2V0KiwgYm9vbCB2aXNpYmxlKTsK
LQotI2lmIFVTRSgzRF9HUkFQSElDUykKLSAgICB2aXJ0dWFsIHZvaWQgY3JlYXRlUGxhdGZvcm1H
cmFwaGljc0NvbnRleHQzRChQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dDNEKiwgUGxhdGZvcm1HcmFw
aGljc1N1cmZhY2UzRCosIFFPYmplY3QqKik7Ci0jZW5kaWYKLQotICAgIFFXaWRnZXQqIHZpZXc7
Ci0gICAgUVdlYlBhZ2UqIHBhZ2U7Ci0KLSNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcp
Ci0gICAgdmlydHVhbCB2b2lkIHNldFJvb3RHcmFwaGljc0xheWVyKEdyYXBoaWNzTGF5ZXIqKTsK
LSAgICB2aXJ0dWFsIHZvaWQgbWFya0ZvclN5bmMoYm9vbCBzY2hlZHVsZVN5bmMpOwotICAgIHZv
aWQgc3luY0xheWVycyhUaW1lcjxQYWdlQ2xpZW50UVdpZGdldD4qKTsKLSNlbmRpZgotCi0jaWYg
VVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQotICAgIHZpcnR1YWwgYm9vbCBhbGxvd3NBY2Nl
bGVyYXRlZENvbXBvc2l0aW5nKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotI2Vsc2UKLSAgICB2
aXJ0dWFsIGJvb2wgYWxsb3dzQWNjZWxlcmF0ZWRDb21wb3NpdGluZygpIGNvbnN0IHsgcmV0dXJu
IGZhbHNlOyB9Ci0jZW5kaWYKLQotI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKLSAg
ICBUaW1lcjxQYWdlQ2xpZW50UVdpZGdldD4gc3luY1RpbWVyOwotICAgIE93blB0cjxUZXh0dXJl
TWFwcGVyTGF5ZXJDbGllbnRRdD4gVGV4dHVyZU1hcHBlckxheWVyQ2xpZW50OwotI2VuZGlmCi19
OwotCi0jaWYgIWRlZmluZWQoUVRfTk9fR1JBUEhJQ1NWSUVXKQotLy8gdGhlIG92ZXJsYXkgaXMg
aGVyZSBmb3Igb25lIHJlYXNvbiBvbmx5OiB0byBoYXZlIHRoZSBzY3JvbGwtYmFycyBhbmQgb3Ro
ZXIKLS8vIGV4dHJhIFVJIGVsZW1lbnRzIGFwcGVhciBvbiB0b3Agb2YgYW55IFFHcmFwaGljc0l0
ZW1zIGNyZWF0ZWQgYnkgQ1NTIGNvbXBvc2l0aW5nIGxheWVycwotY2xhc3MgUUdyYXBoaWNzSXRl
bU92ZXJsYXkgOiBwdWJsaWMgUUdyYXBoaWNzT2JqZWN0IHsKLSAgICBwdWJsaWM6Ci0gICAgUUdy
YXBoaWNzSXRlbU92ZXJsYXkoUUdyYXBoaWNzV2lkZ2V0KiB2aWV3LCBRV2ViUGFnZSogcCkKLSAg
ICAgICAgOiBRR3JhcGhpY3NPYmplY3QodmlldykKLSAgICAgICAgLCBxKHZpZXcpCi0gICAgICAg
ICwgcGFnZShwKQotICAgIHsKLSAgICAgICAgc2V0UG9zKDAsIDApOwotICAgICAgICBzZXRGbGFn
KFFHcmFwaGljc0l0ZW06Okl0ZW1Vc2VzRXh0ZW5kZWRTdHlsZU9wdGlvbiwgdHJ1ZSk7Ci0gICAg
ICAgIHNldENhY2hlTW9kZShRR3JhcGhpY3NJdGVtOjpEZXZpY2VDb29yZGluYXRlQ2FjaGUpOwot
ICAgIH0KLQotICAgIFFSZWN0RiBib3VuZGluZ1JlY3QoKSBjb25zdAotICAgIHsKLSAgICAgICAg
cmV0dXJuIHEtPmJvdW5kaW5nUmVjdCgpOwotICAgIH0KLQotICAgIHZvaWQgcGFpbnQoUVBhaW50
ZXIqIHBhaW50ZXIsIGNvbnN0IFFTdHlsZU9wdGlvbkdyYXBoaWNzSXRlbSogb3B0aW9ucywgUVdp
ZGdldCopCi0gICAgewotICAgICAgICBwYWdlLT5tYWluRnJhbWUoKS0+cmVuZGVyKHBhaW50ZXIs
IHN0YXRpY19jYXN0PFFXZWJGcmFtZTo6UmVuZGVyTGF5ZXI+KFFXZWJGcmFtZTo6QWxsTGF5ZXJz
Jih+UVdlYkZyYW1lOjpDb250ZW50c0xheWVyKSksIG9wdGlvbnMtPmV4cG9zZWRSZWN0LnRvUmVj
dCgpKTsKLSAgICB9Ci0KLSAgICB2b2lkIHByZXBhcmVHcmFwaGljc0l0ZW1HZW9tZXRyeUNoYW5n
ZSgpCi0gICAgewotICAgICAgICBwcmVwYXJlR2VvbWV0cnlDaGFuZ2UoKTsKLSAgICB9Ci0KLSAg
ICBRR3JhcGhpY3NXaWRnZXQqIHE7Ci0gICAgUVdlYlBhZ2UqIHBhZ2U7Ci19OwotCi0KLWNsYXNz
IFBhZ2VDbGllbnRRR3JhcGhpY3NXaWRnZXQgOiBwdWJsaWMgUVdlYlBhZ2VDbGllbnQgewotcHVi
bGljOgotICAgIFBhZ2VDbGllbnRRR3JhcGhpY3NXaWRnZXQoUUdyYXBoaWNzV2ViVmlldyogbmV3
VmlldywgUVdlYlBhZ2UqIG5ld1BhZ2UpCi0gICAgICAgIDogdmlldyhuZXdWaWV3KQotICAgICAg
ICAsIHBhZ2UobmV3UGFnZSkKLSAgICAgICAgLCB2aWV3UmVzaXplc1RvQ29udGVudHMoZmFsc2Up
Ci0jaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQotICAgICAgICAsIHN5bmNUaW1lcih0
aGlzLCAmUGFnZUNsaWVudFFHcmFwaGljc1dpZGdldDo6c3luY0xheWVyc1RpbWVvdXQpCi0jZW5k
aWYKLSAgICAgICAgLCBvdmVybGF5KDApCi0gICAgewotICAgICAgICBRX0FTU0VSVCh2aWV3KTsK
LSNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCi0gICAgICAgIC8vIHRoZSBvdmVybGF5
IGFuZCBzdGF5cyBhbGl2ZSBmb3IgdGhlIGxpZmV0aW1lIG9mCi0gICAgICAgIC8vIHRoaXMgUUdy
YXBoaWNzV2ViVmlldyBhcyB0aGUgc2Nyb2xsYmFycyBhcmUgbmVlZGVkIHdoZW4gdGhlcmUncyBu
byBjb21wb3NpdGluZwotICAgICAgICB2aWV3LT5zZXRGbGFnKFFHcmFwaGljc0l0ZW06Okl0ZW1V
c2VzRXh0ZW5kZWRTdHlsZU9wdGlvbik7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIH5Q
YWdlQ2xpZW50UUdyYXBoaWNzV2lkZ2V0KCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNRV2lkZ2V0
Q2xpZW50KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBzY3Jv
bGwoaW50IGR4LCBpbnQgZHksIGNvbnN0IFFSZWN0Jik7Ci0gICAgdmlydHVhbCB2b2lkIHVwZGF0
ZShjb25zdCBRUmVjdCYgZGlydHlSZWN0KTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0SW5wdXRNZXRo
b2RFbmFibGVkKGJvb2wpOwotICAgIHZpcnR1YWwgYm9vbCBpbnB1dE1ldGhvZEVuYWJsZWQoKSBj
b25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0SW5wdXRNZXRob2RIaW50cyhRdDo6SW5wdXRNZXRo
b2RIaW50cyk7Ci0KLSNpZm5kZWYgUVRfTk9fQ1VSU09SCi0gICAgdmlydHVhbCBRQ3Vyc29yIGN1
cnNvcigpIGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVDdXJzb3IoY29uc3QgUUN1cnNv
ciYpOwotI2VuZGlmCi0KLSAgICB2aXJ0dWFsIFFQYWxldHRlIHBhbGV0dGUoKSBjb25zdDsKLSAg
ICB2aXJ0dWFsIGludCBzY3JlZW5OdW1iZXIoKSBjb25zdDsKLSAgICB2aXJ0dWFsIFFPYmplY3Qq
IG93bmVyV2lkZ2V0KCkgY29uc3Q7Ci0gICAgdmlydHVhbCBRUmVjdCBnZW9tZXRyeVJlbGF0aXZl
VG9Pd25lcldpZGdldCgpIGNvbnN0OwotCi0gICAgdmlydHVhbCBRT2JqZWN0KiBwbHVnaW5QYXJl
bnQoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgUVN0eWxlKiBzdHlsZSgpIGNvbnN0OwotCi0gICAg
dmlydHVhbCBib29sIHZpZXdSZXNpemVzVG9Db250ZW50c0VuYWJsZWQoKSBjb25zdCB7IHJldHVy
biB2aWV3UmVzaXplc1RvQ29udGVudHM7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBzZXRXaWRnZXRW
aXNpYmxlKFdpZGdldCosIGJvb2wpOwotCi0jaWYgVVNFKDNEX0dSQVBISUNTKQotICAgIHZpcnR1
YWwgdm9pZCBjcmVhdGVQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dDNEKFBsYXRmb3JtR3JhcGhpY3ND
b250ZXh0M0QqLCBQbGF0Zm9ybUdyYXBoaWNzU3VyZmFjZTNEKiwgUU9iamVjdCoqKTsKLSNlbmRp
ZgotCi0jaWYgVVNFKFRJTEVEX0JBQ0tJTkdfU1RPUkUpCi0gICAgdm9pZCB1cGRhdGVUaWxlZEJh
Y2tpbmdTdG9yZVNjYWxlKCk7Ci0gICAgdmlydHVhbCBRUmVjdEYgZ3JhcGhpY3NJdGVtVmlzaWJs
ZVJlY3QoKSBjb25zdDsKLSNlbmRpZgotCi0jaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5H
KQotICAgIHZpcnR1YWwgdm9pZCBzZXRSb290R3JhcGhpY3NMYXllcihHcmFwaGljc0xheWVyKik7
Ci0gICAgdmlydHVhbCB2b2lkIG1hcmtGb3JTeW5jKGJvb2wgc2NoZWR1bGVTeW5jKTsKLSAgICB2
b2lkIHN5bmNMYXllcnMoKTsKLSAgICB2b2lkIHN5bmNMYXllcnNUaW1lb3V0KFRpbWVyPFBhZ2VD
bGllbnRRR3JhcGhpY3NXaWRnZXQ+KikgeyBzeW5jTGF5ZXJzKCk7IH0KLQotICAgIC8vIFFHcmFw
aGljc1dlYlZpZXcgY2FuIHJlbmRlciBjb21wb3NpdGVkIGxheWVycwotICAgIHZpcnR1YWwgYm9v
bCBhbGxvd3NBY2NlbGVyYXRlZENvbXBvc2l0aW5nKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQot
I2VuZGlmCi0KLSAgICB2aXJ0dWFsIFFSZWN0RiB3aW5kb3dSZWN0KCkgY29uc3Q7Ci0KLSAgICBR
R3JhcGhpY3NXZWJWaWV3KiB2aWV3OwotICAgIFFXZWJQYWdlKiBwYWdlOwotICAgIGJvb2wgdmll
d1Jlc2l6ZXNUb0NvbnRlbnRzOwotCi0jaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQot
ICAgIE93blB0cjxUZXh0dXJlTWFwcGVyTGF5ZXJDbGllbnRRdD4gVGV4dHVyZU1hcHBlckxheWVy
Q2xpZW50OwotICAgIC8vIHdlIGhhdmUgdG8gZmx1c2ggcXVpdGUgb2Z0ZW4sIHNvIHdlIHVzZSBh
IG1ldGEtbWV0aG9kIGluc3RlYWQgb2YgUVRpbWVyOjpzaW5nbGVTaG90IGZvciBwdXR0aW5nIHRo
ZSBldmVudCBpbiB0aGUgcXVldWUKLSAgICBUaW1lcjxQYWdlQ2xpZW50UUdyYXBoaWNzV2lkZ2V0
PiBzeW5jVGltZXI7Ci0jZW5kaWYKLSAgICAvLyB0aGUgb3ZlcmxheSBnZXRzIGluc3RhbnRpYXRl
ZCB3aGVuIHRoZSByb290IGxheWVyIGlzIGF0dGFjaGVkLCBhbmQgZ2V0IGRlbGV0ZWQgd2hlbiBp
dCdzIGRldGFjaGVkCi0gICAgUUdyYXBoaWNzSXRlbU92ZXJsYXkqIG92ZXJsYXk7Ci0KLSAgICAv
LyB3ZSBuZWVkIHRvIHB1dCB0aGUgcm9vdCBncmFwaGljcyBsYXllciBiZWhpbmQgdGhlIG92ZXJs
YXkgKHdoaWNoIGNvbnRhaW5zIHRoZSBzY3JvbGxiYXIpCi0gICAgZW51bSB7IFJvb3RHcmFwaGlj
c0xheWVyWlZhbHVlLCBPdmVybGF5WlZhbHVlIH07Ci19OwotI2VuZGlmIC8vIFFUX05PX0dSQVBI
SUNTVklFVwotCi19Ci0jZW5kaWYgLy8gUGFnZUNsaWVudFF0CmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L1FHcmFwaGljc1dpZGdldFBsdWdpbkltcGwuY3BwIGIv
U291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9RR3JhcGhpY3NXaWRnZXRQbHVnaW5JbXBs
LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEzNzkzM2EwZmFhZTc0ZDUyN2Ux
OTc3MzM4ZGUzNjVhMjM3NTVkZi4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L1FHcmFwaGljc1dpZGdl
dFBsdWdpbkltcGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoKLSAqIENv
cHlyaWdodCAoQykgMjAxMiBEaWdpYSBQbGMgYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpLgot
ICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBT
b2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwg
b3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIGxpYnJh
cnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAq
IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJh
bnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UuICBTZWUgdGhlIEdOVQotICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv
ciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBv
ZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0
aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8K
LSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVl
dCwgRmlmdGggRmxvb3IsCi0gKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KLSAqCi0gKi8K
LQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIlFHcmFwaGljc1dpZGdldFBsdWdpbklt
cGwuaCIKLQotI2luY2x1ZGUgPFFHcmFwaGljc1NjZW5lPgotI2luY2x1ZGUgPFFHcmFwaGljc1dp
ZGdldD4KLQotI2lmbmRlZiBRVF9OT19HUkFQSElDU1ZJRVcKLQotUUdyYXBoaWNzV2lkZ2V0UGx1
Z2luSW1wbDo6flFHcmFwaGljc1dpZGdldFBsdWdpbkltcGwoKQotewotICAgIG1fZ3JhcGhpY3NX
aWRnZXQtPmRlbGV0ZUxhdGVyKCk7Ci19Ci0KLXZvaWQgUUdyYXBoaWNzV2lkZ2V0UGx1Z2luSW1w
bDo6dXBkYXRlKGNvbnN0IFFSZWN0ICZyZWN0KQotewotICAgIFFHcmFwaGljc1NjZW5lKiBzY2Vu
ZSA9IG1fZ3JhcGhpY3NXaWRnZXQtPnNjZW5lKCk7Ci0gICAgaWYgKHNjZW5lKQotICAgICAgICBz
Y2VuZS0+dXBkYXRlKHJlY3QpOwotfQotCi12b2lkIFFHcmFwaGljc1dpZGdldFBsdWdpbkltcGw6
OnNldEdlb21ldHJ5QW5kQ2xpcChjb25zdCBRUmVjdCAmZ2VvbWV0cnksIGNvbnN0IFFSZWN0ICYs
IGJvb2wpCi17Ci0gICAgbV9ncmFwaGljc1dpZGdldC0+c2V0R2VvbWV0cnkoZ2VvbWV0cnkpOwot
ICAgIC8vIEZJWE1FOiBNYWtlIHRoZSBjb2RlIGhhbmRsZSBjbGlwcGluZyBvZiBncmFwaGljcyB3
aWRnZXRzLgotfQotCi12b2lkIFFHcmFwaGljc1dpZGdldFBsdWdpbkltcGw6OnNldFZpc2libGUo
Ym9vbCB2aXNpYmxlKQotewotICAgIG1fZ3JhcGhpY3NXaWRnZXQtPnNldFZpc2libGUodmlzaWJs
ZSk7Ci19Ci0KLXZvaWQgUUdyYXBoaWNzV2lkZ2V0UGx1Z2luSW1wbDo6c2V0V2lkZ2V0UGFyZW50
KFFPYmplY3QqIHBhcmVudCkKLXsKLSAgICBRR3JhcGhpY3NPYmplY3QqIHBhcmVudEl0ZW0gPSBx
b2JqZWN0X2Nhc3Q8UUdyYXBoaWNzT2JqZWN0Kj4ocGFyZW50KTsKLSAgICBpZiAocGFyZW50SXRl
bSkKLSAgICAgICAgbV9ncmFwaGljc1dpZGdldC0+c2V0UGFyZW50SXRlbShwYXJlbnRJdGVtKTsK
LX0KLQotUU9iamVjdCogUUdyYXBoaWNzV2lkZ2V0UGx1Z2luSW1wbDo6aGFuZGxlKCkgY29uc3QK
LXsKLSAgICByZXR1cm4gbV9ncmFwaGljc1dpZGdldDsKLX0KLQotI2luY2x1ZGUgIm1vY19RR3Jh
cGhpY3NXaWRnZXRQbHVnaW5JbXBsLmNwcCIKLQotI2VuZGlmIC8vICFkZWZpbmVkKFFUX05PX0dS
QVBISUNTVklFVykKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQv
UUdyYXBoaWNzV2lkZ2V0UGx1Z2luSW1wbC5oIGIvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3Vw
cG9ydC9RR3JhcGhpY3NXaWRnZXRQbHVnaW5JbXBsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDdmNzU4MjI2YzRmODBmM2JmNDBhNTVkZmI2OTljNWU4NGZiYTkyM2UuLjAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYktpdC9xdC9X
ZWJDb3JlU3VwcG9ydC9RR3JhcGhpY3NXaWRnZXRQbHVnaW5JbXBsLmgKKysrIC9kZXYvbnVsbApA
QCAtMSw0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIERpZ2lhIFBsYyBhbmQv
b3IgaXRzIHN1YnNpZGlhcnkoLWllcykuCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29m
dHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVy
IHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2Ug
YXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICog
dmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2
ZXJzaW9uLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0
aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRo
b3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hv
dWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1Ymxp
YyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJ
TkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv
biwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKLSAqIEJvc3RvbiwgTUEg
MDIxMTAtMTMwMSwgVVNBLgotICoKLSAqLwotI2lmbmRlZiBRR3JhcGhpY3NXaWRnZXRQbHVnaW5J
bXBsX2gKLSNkZWZpbmUgUUdyYXBoaWNzV2lkZ2V0UGx1Z2luSW1wbF9oCi0KLSNpZm5kZWYgUVRf
Tk9fR1JBUEhJQ1NWSUVXCi0KLSNpbmNsdWRlICJRdFBsdWdpbldpZGdldEFkYXB0ZXIuaCIKLQot
UVRfQkVHSU5fTkFNRVNQQUNFCi1jbGFzcyBRR3JhcGhpY3NXaWRnZXQ7Ci1RVF9FTkRfTkFNRVNQ
QUNFCi0KLWNsYXNzIFFHcmFwaGljc1dpZGdldFBsdWdpbkltcGwgOiBwdWJsaWMgUXRQbHVnaW5X
aWRnZXRBZGFwdGVyIHsKLSAgICBRX09CSkVDVAotcHVibGljOgotICAgIFFHcmFwaGljc1dpZGdl
dFBsdWdpbkltcGwoUUdyYXBoaWNzV2lkZ2V0ICp3KSA6IG1fZ3JhcGhpY3NXaWRnZXQodykgeyB9
Ci0gICAgdmlydHVhbCB+UUdyYXBoaWNzV2lkZ2V0UGx1Z2luSW1wbCgpOwotICAgIHZpcnR1YWwg
dm9pZCB1cGRhdGUoY29uc3QgUVJlY3QgJikgT1ZFUlJJREU7Ci0gICAgdmlydHVhbCB2b2lkIHNl
dEdlb21ldHJ5QW5kQ2xpcChjb25zdCBRUmVjdCYsIGNvbnN0IFFSZWN0JiwgYm9vbCkgT1ZFUlJJ
REU7Ci0gICAgdmlydHVhbCB2b2lkIHNldFZpc2libGUoYm9vbCk7Ci0gICAgdmlydHVhbCB2b2lk
IHNldFN0eWxlU2hlZXQoY29uc3QgUVN0cmluZyYpIE9WRVJSSURFIHsgfQotICAgIHZpcnR1YWwg
dm9pZCBzZXRXaWRnZXRQYXJlbnQoUU9iamVjdCopIE9WRVJSSURFOwotICAgIHZpcnR1YWwgUU9i
amVjdCogaGFuZGxlKCkgY29uc3QgT1ZFUlJJREU7Ci1wcml2YXRlOgotICAgIFFHcmFwaGljc1dp
ZGdldCAqbV9ncmFwaGljc1dpZGdldDsKLX07Ci0jZW5kaWYgLy8gIWRlZmluZWQoUVRfTk9fR1JB
UEhJQ1NWSUVXKQotCi0jZW5kaWYgLy8gUUdyYXBoaWNzV2lkZ2V0UGx1Z2luSW1wbF9oCmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L1FTdHlsZUZhY2FkZUltcC5j
cHAgYi9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L1FTdHlsZUZhY2FkZUltcC5jcHAK
ZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZjZjZjY5NDYxMThkMTBhNjhlNTJhNzEw
Y2I3MTUxN2MwNDY5OWMuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAK
LS0tIGEvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9RU3R5bGVGYWNhZGVJbXAuY3Bw
CisrKyAvZGV2L251bGwKQEAgLTEsNDk1ICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgcGFy
dCBvZiB0aGUgdGhlbWUgaW1wbGVtZW50YXRpb24gZm9yIGZvcm0gY29udHJvbHMgaW4gV2ViQ29y
ZS4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgRGlnaWEgUGxjIGFuZC9vciBpdHMgc3Vic2lk
aWFyeSgtaWVzKS4KLSAqIENvcHlyaWdodCAoQykgMjAxMS0yMDEyIE5va2lhIENvcnBvcmF0aW9u
IGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKS4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJl
ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQg
dW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICogTGlj
ZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVy
Ci0gKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxh
dGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBo
b3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7
IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZ
IG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlv
dSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwg
UHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUg
Q09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu
ZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAotICogQm9zdG9u
LCBNQSAwMjExMC0xMzAxLCBVU0EuCi0gKgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQot
I2luY2x1ZGUgIlFTdHlsZUZhY2FkZUltcC5oIgotCi0jaW5jbHVkZSA8UUFwcGxpY2F0aW9uPgot
I2luY2x1ZGUgPFFMaW5lRWRpdD4KLSNpbmNsdWRlIDxRUGFpbnRlcj4KLSNpbmNsdWRlIDxRUHVz
aEJ1dHRvbj4KLSNpbmNsdWRlIDxRU3R5bGVGYWN0b3J5PgotI2luY2x1ZGUgPFFTdHlsZU9wdGlv
bj4KLQotI2luY2x1ZGUgPFFXZWJQYWdlQ2xpZW50Lmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBXZWJD
b3JlOwotCi1uYW1lc3BhY2UgV2ViS2l0IHsKLQotc3RhdGljIFFTdHlsZTo6U3RhdGUgY29udmVy
dFRvUVN0eWxlU3RhdGUoUVN0eWxlRmFjYWRlOjpTdGF0ZSBzdGF0ZSkKLXsKLSAgICBRU3R5bGU6
OlN0YXRlIHJlc3VsdDsKLSNkZWZpbmUgQ09OVkVSVF9TVEFURShQcm94aWVkU3RhdGUsIFZhbHVl
KSBcCi0gICAgaWYgKHN0YXRlICYgUVN0eWxlRmFjYWRlOjpQcm94aWVkU3RhdGUpIFwKLSAgICAg
ICAgcmVzdWx0IHw9IFFTdHlsZTo6UHJveGllZFN0YXRlOwotCi0gICAgRk9SX0VBQ0hfTUFQUEVE
X1NUQVRFKENPTlZFUlRfU1RBVEUsICkKLQotI3VuZGVmIENPTlZFUlRfU1RBVEUKLQotICAgIHJl
dHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBRU3R5bGU6OlN1YkNvbnRyb2wgY29udmVydFRvUVN0
eWxlU3ViQ29udHJvbChRU3R5bGVGYWNhZGU6OlN1YkNvbnRyb2wgc2MpCi17Ci0jZGVmaW5lIENP
TlZFUlRfU1VCQ09OVFJPTChGLCBWYWx1ZSkgXAotICAgIGNhc2UgUVN0eWxlRmFjYWRlOjpGOiBy
ZXR1cm4gUVN0eWxlOjpGCi0KLSAgICBzd2l0Y2ggKHNjKSB7Ci0gICAgICAgIEZPUl9FQUNIX1NV
QkNPTlRST0woQ09OVkVSVF9TVUJDT05UUk9MLCBTRU1JQ09MT04pOwotICAgIH0KLSAgICBBU1NF
UlRfTk9UX1JFQUNIRUQoKTsKLSAgICByZXR1cm4gUVN0eWxlOjpTQ19Ob25lOwotI3VuZGVmIENP
TlZFUlRfU1VCQ09OVFJPTAotfQotCi1zdGF0aWMgdm9pZCBpbml0R2VuZXJpY1N0eWxlT3B0aW9u
KFFTdHlsZU9wdGlvbiogb3B0aW9uLCBRV2lkZ2V0KiB3aWRnZXQsIGNvbnN0IFFTdHlsZUZhY2Fk
ZU9wdGlvbiYgZmFjYWRlT3B0aW9uKQotewotICAgIGlmICh3aWRnZXQpCi0gICAgICAgIG9wdGlv
bi0+aW5pdCh3aWRnZXQpOwotICAgIGVsc2UKLSAgICAgICAgLy8gSWYgYSB3aWRnZXQgaXMgbm90
IGRpcmVjdGx5IGF2YWlsYWJsZSBmb3IgcmVuZGVyaW5nLCB3ZSBmYWxsYmFjayB0byBkZWZhdWx0
Ci0gICAgICAgIC8vIHZhbHVlIGZvciBhbiBhY3RpdmUgd2lkZ2V0LgotICAgICAgICBvcHRpb24t
PnN0YXRlID0gUVN0eWxlOjpTdGF0ZV9BY3RpdmUgfCBRU3R5bGU6OlN0YXRlX0VuYWJsZWQ7Ci0K
LSAgICBvcHRpb24tPnJlY3QgPSBmYWNhZGVPcHRpb24ucmVjdDsKLSAgICBvcHRpb24tPnN0YXRl
ID0gY29udmVydFRvUVN0eWxlU3RhdGUoZmFjYWRlT3B0aW9uLnN0YXRlKTsKLSAgICBvcHRpb24t
PmRpcmVjdGlvbiA9IGZhY2FkZU9wdGlvbi5kaXJlY3Rpb247Ci0gICAgb3B0aW9uLT5wYWxldHRl
ID0gZmFjYWRlT3B0aW9uLnBhbGV0dGU7Ci19Ci0KLXN0YXRpYyB2b2lkIGluaXRTcGVjaWZpY1N0
eWxlT3B0aW9uKFFTdHlsZU9wdGlvbiosIGNvbnN0IFFTdHlsZUZhY2FkZU9wdGlvbiYpCi17Ci19
Ci0KLXN0YXRpYyB2b2lkIGluaXRTcGVjaWZpY1N0eWxlT3B0aW9uKFFTdHlsZU9wdGlvblNsaWRl
ciogc2xpZGVyT3B0aW9uLCBjb25zdCBRU3R5bGVGYWNhZGVPcHRpb24mIGZhY2FkZU9wdGlvbikK
LXsKLSAgICBzbGlkZXJPcHRpb24tPm9yaWVudGF0aW9uID0gZmFjYWRlT3B0aW9uLnNsaWRlci5v
cmllbnRhdGlvbjsKLSAgICBzbGlkZXJPcHRpb24tPnVwc2lkZURvd24gPSBmYWNhZGVPcHRpb24u
c2xpZGVyLnVwc2lkZURvd247Ci0gICAgc2xpZGVyT3B0aW9uLT5taW5pbXVtID0gZmFjYWRlT3B0
aW9uLnNsaWRlci5taW5pbXVtOwotICAgIHNsaWRlck9wdGlvbi0+bWF4aW11bSA9IGZhY2FkZU9w
dGlvbi5zbGlkZXIubWF4aW11bTsKLSAgICBzbGlkZXJPcHRpb24tPnNsaWRlclBvc2l0aW9uID0g
ZmFjYWRlT3B0aW9uLnNsaWRlci5wb3NpdGlvbjsKLSAgICBzbGlkZXJPcHRpb24tPnNsaWRlclZh
bHVlID0gZmFjYWRlT3B0aW9uLnNsaWRlci52YWx1ZTsKLSAgICBzbGlkZXJPcHRpb24tPnNpbmds
ZVN0ZXAgPSBmYWNhZGVPcHRpb24uc2xpZGVyLnNpbmdsZVN0ZXA7Ci0gICAgc2xpZGVyT3B0aW9u
LT5wYWdlU3RlcCA9IGZhY2FkZU9wdGlvbi5zbGlkZXIucGFnZVN0ZXA7Ci0gICAgc2xpZGVyT3B0
aW9uLT5hY3RpdmVTdWJDb250cm9scyA9IGNvbnZlcnRUb1FTdHlsZVN1YkNvbnRyb2woZmFjYWRl
T3B0aW9uLnNsaWRlci5hY3RpdmVTdWJDb250cm9scyk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFt
ZSBTdHlsZU9wdGlvbj4KLWNsYXNzIE1hcHBlZFN0eWxlT3B0aW9uIDogcHVibGljIFN0eWxlT3B0
aW9uIHsKLQotcHVibGljOgotICAgIE1hcHBlZFN0eWxlT3B0aW9uKFFXaWRnZXQqIHdpZGdldCwg
Y29uc3QgUVN0eWxlRmFjYWRlT3B0aW9uJiBmYWNhZGVPcHRpb24pCi0gICAgewotICAgICAgICBp
bml0R2VuZXJpY1N0eWxlT3B0aW9uKHRoaXMsIHdpZGdldCwgZmFjYWRlT3B0aW9uKTsKLSAgICAg
ICAgaW5pdFNwZWNpZmljU3R5bGVPcHRpb24odGhpcywgZmFjYWRlT3B0aW9uKTsKLSAgICB9Ci19
OwotCi1zdGF0aWMgUVN0eWxlOjpQaXhlbE1ldHJpYyBjb252ZXJ0UGl4ZWxNZXRyaWMoUVN0eWxl
RmFjYWRlOjpQaXhlbE1ldHJpYyBzdGF0ZSkKLXsKLSNkZWZpbmUgQ09OVkVSVF9NRVRSSUMoTWV0
cmljKSBcCi0gICAgY2FzZSBRU3R5bGVGYWNhZGU6Ok1ldHJpYzogcmV0dXJuIFFTdHlsZTo6TWV0
cmljCi0KLSAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgIEZPUl9FQUNIX01BUFBFRF9NRVRS
SUMoQ09OVkVSVF9NRVRSSUMsIFNFTUlDT0xPTik7Ci0gICAgfQotICAgIEFTU0VSVF9OT1RfUkVB
Q0hFRCgpOwotICAgIHJldHVybiBRU3R5bGU6OlBNX0N1c3RvbUJhc2U7Ci0KLSN1bmRlZiBDT05W
RVJUX01FVFJJQwotfQotCi1zdGF0aWMgUVN0eWxlRmFjYWRlOjpTdWJDb250cm9sIGNvbnZlcnRU
b1FTdHlsZUZhY2FkZVN1YkNvbnRyb2woUVN0eWxlOjpTdWJDb250cm9sIHNjKQotewotI2RlZmlu
ZSBDT05WRVJUX1NVQkNPTlRST0woRiwgVmFsdWUpIFwKLSAgICBjYXNlIFFTdHlsZTo6RjogcmV0
dXJuIFFTdHlsZUZhY2FkZTo6RgotCi0gICAgc3dpdGNoIChzYykgewotICAgICAgICBGT1JfRUFD
SF9TVUJDT05UUk9MKENPTlZFUlRfU1VCQ09OVFJPTCwgU0VNSUNPTE9OKTsKLSAgICB9Ci0gICAg
QVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgcmV0dXJuIFFTdHlsZUZhY2FkZTo6U0NfTm9uZTsK
LSN1bmRlZiBDT05WRVJUX1NVQkNPTlRST0wKLX0KLQotUVN0eWxlRmFjYWRlSW1wOjpRU3R5bGVG
YWNhZGVJbXAoUGFnZSogcGFnZSkKLSAgICA6IG1fcGFnZShwYWdlKQotICAgICwgbV9zdHlsZSgw
KQotewotICAgIG1fZmFsbGJhY2tTdHlsZSA9IFFTdHlsZUZhY3Rvcnk6OmNyZWF0ZShRTGF0aW4x
U3RyaW5nKCJ3aW5kb3dzIikpOwotICAgIG1fb3duRmFsbGJhY2tTdHlsZSA9IHRydWU7Ci0gICAg
aWYgKCFtX2ZhbGxiYWNrU3R5bGUpIHsKLSAgICAgICAgbV9mYWxsYmFja1N0eWxlID0gUUFwcGxp
Y2F0aW9uOjpzdHlsZSgpOwotICAgICAgICBtX293bkZhbGxiYWNrU3R5bGUgPSBmYWxzZTsKLSAg
ICB9Ci19Ci0KLVFTdHlsZUZhY2FkZUltcDo6flFTdHlsZUZhY2FkZUltcCgpCi17Ci0gICAgaWYg
KG1fb3duRmFsbGJhY2tTdHlsZSkKLSAgICAgICAgZGVsZXRlIG1fZmFsbGJhY2tTdHlsZTsKLX0K
LQotUVJlY3QgUVN0eWxlRmFjYWRlSW1wOjpidXR0b25TdWJFbGVtZW50UmVjdChRU3R5bGVGYWNh
ZGU6OkJ1dHRvblN1YkVsZW1lbnQgYnV0dG9uRWxlbWVudCwgU3RhdGUgc3RhdGUsIGNvbnN0IFFS
ZWN0JiBvcmlnaW5hbFJlY3QpIGNvbnN0Ci17Ci0gICAgUVN0eWxlT3B0aW9uQnV0dG9uIG9wdGlv
bjsKLSAgICBvcHRpb24uc3RhdGUgPSBjb252ZXJ0VG9RU3R5bGVTdGF0ZShzdGF0ZSk7Ci0gICAg
b3B0aW9uLnJlY3QgPSBvcmlnaW5hbFJlY3Q7Ci0KLSAgICBRU3R5bGU6OlN1YkVsZW1lbnQgc3Vi
RWxlbWVudCA9IFFTdHlsZTo6U0VfQ3VzdG9tQmFzZTsKLSAgICBzd2l0Y2ggKGJ1dHRvbkVsZW1l
bnQpIHsKLSAgICBjYXNlIFB1c2hCdXR0b25MYXlvdXRJdGVtOiBzdWJFbGVtZW50ID0gUVN0eWxl
OjpTRV9QdXNoQnV0dG9uTGF5b3V0SXRlbTsgYnJlYWs7Ci0gICAgY2FzZSBQdXNoQnV0dG9uQ29u
dGVudHM6IHN1YkVsZW1lbnQgPSBRU3R5bGU6OlNFX1B1c2hCdXR0b25Db250ZW50czsgYnJlYWs7
Ci0gICAgZGVmYXVsdDogQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgfQotICAgIHJldHVybiBz
dHlsZSgpLT5zdWJFbGVtZW50UmVjdChzdWJFbGVtZW50LCAmb3B0aW9uKTsKLX0KLQotaW50IFFT
dHlsZUZhY2FkZUltcDo6ZmluZEZyYW1lTGluZVdpZHRoKCkgY29uc3QKLXsKLSAgICBpZiAoIW1f
bGluZUVkaXQpCi0gICAgICAgIG1fbGluZUVkaXQucmVzZXQobmV3IFFMaW5lRWRpdCgpKTsKLQot
ICAgIHJldHVybiBzdHlsZSgpLT5waXhlbE1ldHJpYyhRU3R5bGU6OlBNX0RlZmF1bHRGcmFtZVdp
ZHRoLCAwLCBtX2xpbmVFZGl0LmRhdGEoKSk7Ci19Ci0KLWludCBRU3R5bGVGYWNhZGVJbXA6OnNp
bXBsZVBpeGVsTWV0cmljKFFTdHlsZUZhY2FkZTo6UGl4ZWxNZXRyaWMgbWV0cmljLCBTdGF0ZSBz
dGF0ZSkgY29uc3QKLXsKLSAgICBRU3R5bGVPcHRpb24gb3B0OwotICAgIG9wdC5zdGF0ZSA9IGNv
bnZlcnRUb1FTdHlsZVN0YXRlKHN0YXRlKTsKLSAgICByZXR1cm4gc3R5bGUoKS0+cGl4ZWxNZXRy
aWMoY29udmVydFBpeGVsTWV0cmljKG1ldHJpYyksICZvcHQsIDApOwotfQotCi1pbnQgUVN0eWxl
RmFjYWRlSW1wOjpidXR0b25NYXJnaW4oU3RhdGUgc3RhdGUsIGNvbnN0IFFSZWN0JiBvcmlnaW5h
bFJlY3QpIGNvbnN0Ci17Ci0gICAgUVN0eWxlT3B0aW9uQnV0dG9uIHN0eWxlT3B0aW9uOwotICAg
IHN0eWxlT3B0aW9uLnN0YXRlID0gY29udmVydFRvUVN0eWxlU3RhdGUoc3RhdGUpOwotICAgIHN0
eWxlT3B0aW9uLnJlY3QgPSBvcmlnaW5hbFJlY3Q7Ci0gICAgcmV0dXJuIHN0eWxlKCktPnBpeGVs
TWV0cmljKFFTdHlsZTo6UE1fQnV0dG9uTWFyZ2luLCAmc3R5bGVPcHRpb24sIDApOwotfQotCi1p
bnQgUVN0eWxlRmFjYWRlSW1wOjpzbGlkZXJMZW5ndGgoUXQ6Ok9yaWVudGF0aW9uIG9yaWVudGF0
aW9uKSBjb25zdAotewotICAgIFFTdHlsZU9wdGlvblNsaWRlciBvcHQ7Ci0gICAgb3B0Lm9yaWVu
dGF0aW9uID0gb3JpZW50YXRpb247Ci0gICAgcmV0dXJuIHN0eWxlKCktPnBpeGVsTWV0cmljKFFT
dHlsZTo6UE1fU2xpZGVyTGVuZ3RoLCAmb3B0KTsKLX0KLQotaW50IFFTdHlsZUZhY2FkZUltcDo6
c2xpZGVyVGhpY2tuZXNzKFF0OjpPcmllbnRhdGlvbiBvcmllbnRhdGlvbikgY29uc3QKLXsKLSAg
ICBRU3R5bGVPcHRpb25TbGlkZXIgb3B0OwotICAgIG9wdC5vcmllbnRhdGlvbiA9IG9yaWVudGF0
aW9uOwotICAgIHJldHVybiBzdHlsZSgpLT5waXhlbE1ldHJpYyhRU3R5bGU6OlBNX1NsaWRlclRo
aWNrbmVzcywgJm9wdCk7Ci19Ci0KLWludCBRU3R5bGVGYWNhZGVJbXA6OnByb2dyZXNzQmFyQ2h1
bmtXaWR0aChjb25zdCBRU2l6ZSYgc2l6ZSkgY29uc3QKLXsKLSAgICBRU3R5bGVPcHRpb25Qcm9n
cmVzc0JhclYyIG9wdGlvbjsKLSAgICBvcHRpb24ucmVjdC5zZXRTaXplKHNpemUpOwotICAgIC8v
IEZJWE1FOiBVbnRpbCBodHRwOi8vYnVncmVwb3J0cy5xdC5ub2tpYS5jb20vYnJvd3NlL1FUQlVH
LTkxNzEgaXMgZml4ZWQsCi0gICAgLy8gd2Ugc2ltdWxhdGUgb25lIHNxdWFyZSBhbmltYXRpbmcg
YWNyb3NzIHRoZSBwcm9ncmVzcyBiYXIuCi0gICAgcmV0dXJuIHN0eWxlKCktPnBpeGVsTWV0cmlj
KFFTdHlsZTo6UE1fUHJvZ3Jlc3NCYXJDaHVua1dpZHRoLCAmb3B0aW9uKTsKLX0KLQotdm9pZCBR
U3R5bGVGYWNhZGVJbXA6OmdldEJ1dHRvbk1ldHJpY3MoUVN0cmluZyAqYnV0dG9uRm9udEZhbWls
eSwgaW50ICpidXR0b25Gb250UGl4ZWxTaXplKSBjb25zdAotewotICAgIFFQdXNoQnV0dG9uIGJ1
dHRvbjsKLSAgICBRRm9udCBkZWZhdWx0QnV0dG9uRm9udCA9IFFBcHBsaWNhdGlvbjo6Zm9udCgm
YnV0dG9uKTsKLSAgICAqYnV0dG9uRm9udEZhbWlseSA9IGRlZmF1bHRCdXR0b25Gb250LmZhbWls
eSgpOwotICAgICpidXR0b25Gb250UGl4ZWxTaXplID0gMDsKLSNpZmRlZiBRX09TX01BQwotICAg
IGJ1dHRvbi5zZXRBdHRyaWJ1dGUoUXQ6OldBX01hY1NtYWxsU2l6ZSk7Ci0gICAgUUZvbnRJbmZv
IGZvbnRJbmZvKGRlZmF1bHRCdXR0b25Gb250KTsKLSAgICAqYnV0dG9uRm9udFBpeGVsU2l6ZSA9
IGZvbnRJbmZvLnBpeGVsU2l6ZSgpOwotI2VuZGlmCi19Ci0KLVFTaXplIFFTdHlsZUZhY2FkZUlt
cDo6Y29tYm9Cb3hTaXplRnJvbUNvbnRlbnRzKFN0YXRlIHN0YXRlLCBjb25zdCBRU2l6ZSYgY29u
dGVudHNTaXplKSBjb25zdAotewotICAgIFFTdHlsZU9wdGlvbkNvbWJvQm94IG9wdDsKLSAgICBv
cHQuc3RhdGUgPSBjb252ZXJ0VG9RU3R5bGVTdGF0ZShzdGF0ZSk7Ci0gICAgcmV0dXJuIHN0eWxl
KCktPnNpemVGcm9tQ29udGVudHMoUVN0eWxlOjpDVF9Db21ib0JveCwgJm9wdCwgY29udGVudHNT
aXplKTsKLX0KLQotUVNpemUgUVN0eWxlRmFjYWRlSW1wOjpwdXNoQnV0dG9uU2l6ZUZyb21Db250
ZW50cyhTdGF0ZSBzdGF0ZSwgY29uc3QgUVNpemUmIGNvbnRlbnRzU2l6ZSkgY29uc3QKLXsKLSAg
ICBRU3R5bGVPcHRpb25CdXR0b24gb3B0OwotICAgIG9wdC5zdGF0ZSA9IGNvbnZlcnRUb1FTdHls
ZVN0YXRlKHN0YXRlKTsKLSAgICByZXR1cm4gc3R5bGUoKS0+c2l6ZUZyb21Db250ZW50cyhRU3R5
bGU6OkNUX1B1c2hCdXR0b24sICZvcHQsIGNvbnRlbnRzU2l6ZSk7Ci19Ci0KLXZvaWQgUVN0eWxl
RmFjYWRlSW1wOjpwYWludEJ1dHRvbihRUGFpbnRlciogcGFpbnRlciwgUVN0eWxlRmFjYWRlOjpC
dXR0b25UeXBlIHR5cGUsIGNvbnN0IFFTdHlsZUZhY2FkZU9wdGlvbiAmcHJveHlPcHRpb24pCi17
Ci0gICAgUVdpZGdldCogd2lkZ2V0ID0gcW9iamVjdF9jYXN0PFFXaWRnZXQqPih3aWRnZXRGb3JQ
YWludGVyKHBhaW50ZXIpKTsKLSAgICBNYXBwZWRTdHlsZU9wdGlvbjxRU3R5bGVPcHRpb25CdXR0
b24+IG9wdGlvbih3aWRnZXQsIHByb3h5T3B0aW9uKTsKLQotICAgIGlmICh0eXBlID09IFB1c2hC
dXR0b24pCi0gICAgICAgIHN0eWxlKCktPmRyYXdDb250cm9sKFFTdHlsZTo6Q0VfUHVzaEJ1dHRv
biwgJm9wdGlvbiwgcGFpbnRlciwgd2lkZ2V0KTsKLSAgICBlbHNlIGlmICh0eXBlID09IFJhZGlv
QnV0dG9uKQotICAgICAgICBzdHlsZSgpLT5kcmF3Q29udHJvbChRU3R5bGU6OkNFX1JhZGlvQnV0
dG9uLCAmb3B0aW9uLCBwYWludGVyLCB3aWRnZXQpOwotICAgIGVsc2UgaWYgKHR5cGUgPT0gQ2hl
Y2tCb3gpCi0gICAgICAgIHN0eWxlKCktPmRyYXdDb250cm9sKFFTdHlsZTo6Q0VfQ2hlY2tCb3gs
ICZvcHRpb24sIHBhaW50ZXIsIHdpZGdldCk7Ci19Ci0KLXZvaWQgUVN0eWxlRmFjYWRlSW1wOjpw
YWludFRleHRGaWVsZChRUGFpbnRlciAqcGFpbnRlciwgY29uc3QgUVN0eWxlRmFjYWRlT3B0aW9u
ICZwcm94eU9wdGlvbikKLXsKLSAgICBRV2lkZ2V0KiB3aWRnZXQgPSBxb2JqZWN0X2Nhc3Q8UVdp
ZGdldCo+KHdpZGdldEZvclBhaW50ZXIocGFpbnRlcikpOwotCi0gICAgTWFwcGVkU3R5bGVPcHRp
b248UVN0eWxlT3B0aW9uRnJhbWVWMj4gcGFuZWwod2lkZ2V0LCBwcm94eU9wdGlvbik7Ci0KLSAg
ICBwYW5lbC5saW5lV2lkdGggPSBmaW5kRnJhbWVMaW5lV2lkdGgoKTsKLSAgICBwYW5lbC5mZWF0
dXJlcyA9IFFTdHlsZU9wdGlvbkZyYW1lVjI6Ok5vbmU7Ci0KLSAgICBzdHlsZSgpLT5kcmF3UHJp
bWl0aXZlKFFTdHlsZTo6UEVfUGFuZWxMaW5lRWRpdCwgJnBhbmVsLCBwYWludGVyLCB3aWRnZXQp
OwotfQotCi12b2lkIFFTdHlsZUZhY2FkZUltcDo6cGFpbnRDb21ib0JveChRUGFpbnRlciAqcGFp
bnRlciwgY29uc3QgUVN0eWxlRmFjYWRlT3B0aW9uICZwcm94eU9wdGlvbikKLXsKLSAgICBRV2lk
Z2V0KiB3aWRnZXQgPSBxb2JqZWN0X2Nhc3Q8UVdpZGdldCo+KHdpZGdldEZvclBhaW50ZXIocGFp
bnRlcikpOwotCi0gICAgTWFwcGVkU3R5bGVPcHRpb248UVN0eWxlT3B0aW9uQ29tYm9Cb3g+IG9w
dCh3aWRnZXQsIHByb3h5T3B0aW9uKTsKLQotICAgIEludFJlY3QgcmVjdCA9IG9wdC5yZWN0Owot
Ci0jaWYgZGVmaW5lZChRX09TX01BQykgJiYgIWRlZmluZWQoUVRfTk9fU1RZTEVfTUFDKQotICAg
IC8vIFFNYWNTdHlsZSBtYWtlcyB0aGUgY29tYm8gYm94ZXMgYSBsaXR0bGUgYml0IHNtYWxsZXIg
dG8gbGVhdmUgc3BhY2UgZm9yIHRoZSBmb2N1cyByZWN0LgotICAgIC8vIEJlY2F1c2Ugb2YgaXQs
IHRoZSBjb21ibyBidXR0b24gaXMgZHJhd24gYXQgYSBwb2ludCB0byB0aGUgbGVmdCBvZiB3aGVy
ZSBpdCB3YXMgZXhwZWN0IHRvIGJlIGFuZCBtYXkgZW5kIHVwCi0gICAgLy8gb3ZlcmxhcHBlZCB3
aXRoIHRoZSB0ZXh0LiBUaGlzIHdpbGwgZm9yY2UgUU1hY1N0eWxlIHRvIGRyYXcgdGhlIGNvbWJv
IGJveCB3aXRoIHRoZSBleHBlY3RlZCB3aWR0aC4KLSAgICBpZiAobV9zdHlsZS0+aW5oZXJpdHMo
IlFNYWNTdHlsZSIpKQotICAgICAgICByZWN0LmluZmxhdGVYKDMpOwotI2VuZGlmCi0KLSAgICBj
b25zdCBRUG9pbnQgdG9wTGVmdCA9IHJlY3QubG9jYXRpb24oKTsKLSAgICBwYWludGVyLT50cmFu
c2xhdGUodG9wTGVmdCk7Ci0gICAgb3B0LnJlY3QubW92ZVRvKFFQb2ludCgwLCAwKSk7Ci0gICAg
b3B0LnJlY3Quc2V0U2l6ZShyZWN0LnNpemUoKSk7Ci0KLSAgICBzdHlsZSgpLT5kcmF3Q29tcGxl
eENvbnRyb2woUVN0eWxlOjpDQ19Db21ib0JveCwgJm9wdCwgcGFpbnRlciwgd2lkZ2V0KTsKLSAg
ICBwYWludGVyLT50cmFuc2xhdGUoLXRvcExlZnQpOwotfQotCi12b2lkIFFTdHlsZUZhY2FkZUlt
cDo6cGFpbnRDb21ib0JveEFycm93KFFQYWludGVyICpwYWludGVyLCBjb25zdCBRU3R5bGVGYWNh
ZGVPcHRpb24gJnByb3h5T3B0aW9uKQotewotICAgIFFXaWRnZXQqIHdpZGdldCA9IHFvYmplY3Rf
Y2FzdDxRV2lkZ2V0Kj4od2lkZ2V0Rm9yUGFpbnRlcihwYWludGVyKSk7Ci0KLSAgICBNYXBwZWRT
dHlsZU9wdGlvbjxRU3R5bGVPcHRpb25Db21ib0JveD4gb3B0KHdpZGdldCwgcHJveHlPcHRpb24p
OwotICAgIG9wdC5zdWJDb250cm9scyA9IFFTdHlsZTo6U0NfQ29tYm9Cb3hBcnJvdzsKLSAgICAv
LyBmb3IgZHJhd2luZyB0aGUgY29tYm8gYm94IGFycm93LCByZWx5IG9ubHkgb24gdGhlIGZhbGxi
YWNrIHN0eWxlCi0gICAgbV9mYWxsYmFja1N0eWxlLT5kcmF3Q29tcGxleENvbnRyb2woUVN0eWxl
OjpDQ19Db21ib0JveCwgJm9wdCwgcGFpbnRlciwgd2lkZ2V0KTsKLX0KLQotdm9pZCBRU3R5bGVG
YWNhZGVJbXA6OnBhaW50U2xpZGVyVHJhY2soUVBhaW50ZXIqIHBhaW50ZXIsIGNvbnN0IFFTdHls
ZUZhY2FkZU9wdGlvbiYgcHJveHlPcHRpb24pCi17Ci0gICAgUVdpZGdldCogd2lkZ2V0ID0gcW9i
amVjdF9jYXN0PFFXaWRnZXQqPih3aWRnZXRGb3JQYWludGVyKHBhaW50ZXIpKTsKLQotICAgIE1h
cHBlZFN0eWxlT3B0aW9uPFFTdHlsZU9wdGlvblNsaWRlcj4gb3B0aW9uKHdpZGdldCwgcHJveHlP
cHRpb24pOwotICAgIG9wdGlvbi5zdWJDb250cm9scyA9IFFTdHlsZTo6U0NfU2xpZGVyR3Jvb3Zl
OwotCi0gICAgb3B0aW9uLnVwc2lkZURvd24gPSBwcm94eU9wdGlvbi5zbGlkZXIudXBzaWRlRG93
bjsKLSAgICBvcHRpb24ubWluaW11bSA9IHByb3h5T3B0aW9uLnNsaWRlci5taW5pbXVtOwotICAg
IG9wdGlvbi5tYXhpbXVtID0gcHJveHlPcHRpb24uc2xpZGVyLm1heGltdW07Ci0gICAgb3B0aW9u
LnNsaWRlclBvc2l0aW9uID0gcHJveHlPcHRpb24uc2xpZGVyLnBvc2l0aW9uOwotICAgIG9wdGlv
bi5vcmllbnRhdGlvbiA9IHByb3h5T3B0aW9uLnNsaWRlci5vcmllbnRhdGlvbjsKLQotICAgIHN0
eWxlKCktPmRyYXdDb21wbGV4Q29udHJvbChRU3R5bGU6OkNDX1NsaWRlciwgJm9wdGlvbiwgcGFp
bnRlciwgd2lkZ2V0KTsKLQotICAgIGlmIChvcHRpb24uc3RhdGUgJiBRU3R5bGU6OlN0YXRlX0hh
c0ZvY3VzKSB7Ci0gICAgICAgIFFTdHlsZU9wdGlvbkZvY3VzUmVjdCBmb2N1c09wdGlvbjsKLSAg
ICAgICAgZm9jdXNPcHRpb24ucmVjdCA9IG9wdGlvbi5yZWN0OwotICAgICAgICBzdHlsZSgpLT5k
cmF3UHJpbWl0aXZlKFFTdHlsZTo6UEVfRnJhbWVGb2N1c1JlY3QsICZmb2N1c09wdGlvbiwgcGFp
bnRlciwgd2lkZ2V0KTsKLSAgICB9Ci19Ci0KLXZvaWQgUVN0eWxlRmFjYWRlSW1wOjpwYWludFNs
aWRlclRodW1iKFFQYWludGVyKiBwYWludGVyLCBjb25zdCBRU3R5bGVGYWNhZGVPcHRpb24mIHBy
b3h5T3B0aW9uKQotewotICAgIFFXaWRnZXQqIHdpZGdldCA9IHFvYmplY3RfY2FzdDxRV2lkZ2V0
Kj4od2lkZ2V0Rm9yUGFpbnRlcihwYWludGVyKSk7Ci0KLSAgICBNYXBwZWRTdHlsZU9wdGlvbjxR
U3R5bGVPcHRpb25TbGlkZXI+IG9wdGlvbih3aWRnZXQsIHByb3h5T3B0aW9uKTsKLQotICAgIG9w
dGlvbi5zdWJDb250cm9scyA9IFFTdHlsZTo6U0NfU2xpZGVySGFuZGxlOwotICAgIGlmIChvcHRp
b24uc3RhdGUgJiBRU3R5bGU6OlN0YXRlX1N1bmtlbikKLSAgICAgICAgb3B0aW9uLmFjdGl2ZVN1
YkNvbnRyb2xzID0gUVN0eWxlOjpTQ19TbGlkZXJIYW5kbGU7Ci0KLSAgICBzdHlsZSgpLT5kcmF3
Q29tcGxleENvbnRyb2woUVN0eWxlOjpDQ19TbGlkZXIsICZvcHRpb24sIHBhaW50ZXIsIHdpZGdl
dCk7Ci19Ci0KLXZvaWQgUVN0eWxlRmFjYWRlSW1wOjpwYWludElubmVyU3BpbkJ1dHRvbihRUGFp
bnRlciogcGFpbnRlciwgY29uc3QgUVN0eWxlRmFjYWRlT3B0aW9uJiBwcm94eU9wdGlvbiwgYm9v
bCBzcGluQm94VXApCi17Ci0gICAgUVdpZGdldCogd2lkZ2V0ID0gcW9iamVjdF9jYXN0PFFXaWRn
ZXQqPih3aWRnZXRGb3JQYWludGVyKHBhaW50ZXIpKTsKLQotICAgIE1hcHBlZFN0eWxlT3B0aW9u
PFFTdHlsZU9wdGlvblNwaW5Cb3g+IG9wdGlvbih3aWRnZXQsIHByb3h5T3B0aW9uKTsKLQotICAg
IG9wdGlvbi5zdWJDb250cm9scyA9IFFTdHlsZTo6U0NfU3BpbkJveFVwIHwgUVN0eWxlOjpTQ19T
cGluQm94RG93bjsKLSAgICBpZiAoIShvcHRpb24uc3RhdGUgJiBRU3R5bGU6OlN0YXRlX1JlYWRP
bmx5KSkgewotICAgICAgICBpZiAob3B0aW9uLnN0YXRlICYgUVN0eWxlOjpTdGF0ZV9FbmFibGVk
KQotICAgICAgICAgICAgb3B0aW9uLnN0ZXBFbmFibGVkID0gUUFic3RyYWN0U3BpbkJveDo6U3Rl
cFVwRW5hYmxlZCB8IFFBYnN0cmFjdFNwaW5Cb3g6OlN0ZXBEb3duRW5hYmxlZDsKLSAgICAgICAg
aWYgKG9wdGlvbi5zdGF0ZSAmIFFTdHlsZTo6U3RhdGVfU3Vua2VuKSB7Ci0gICAgICAgICAgICBp
ZiAoc3BpbkJveFVwKQotICAgICAgICAgICAgICAgIG9wdGlvbi5hY3RpdmVTdWJDb250cm9scyA9
IFFTdHlsZTo6U0NfU3BpbkJveFVwOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAg
IG9wdGlvbi5hY3RpdmVTdWJDb250cm9scyA9IFFTdHlsZTo6U0NfU3BpbkJveERvd247Ci0gICAg
ICAgIH0KLSAgICB9Ci0KLSAgICBJbnRSZWN0IGJ1dHRvblJlY3QgPSBvcHRpb24ucmVjdDsKLSAg
ICAvLyBEZWZhdWx0IHRvIG1vdmluZyB0aGUgYnV0dG9ucyBhIGxpdHRsZSBiaXQgd2l0aGluIHRo
ZSBlZGl0b3IgZnJhbWUuCi0gICAgaW50IGluZmxhdGVYID0gLTI7Ci0gICAgaW50IGluZmxhdGVZ
ID0gLTI7Ci0jaWYgZGVmaW5lZChRX09TX01BQykgJiYgIWRlZmluZWQoUVRfTk9fU1RZTEVfTUFD
KQotICAgIC8vIFFNYWNTdHlsZSB3aWxsIHBvc2l0aW9uIHRoZSBhcXVhIGJ1dHRvbnMgZmx1c2gg
dG8gdGhlIHJpZ2h0LgotICAgIC8vIFRoaXMgd2lsbCBtb3ZlIHRoZW0gbW9yZSB3aXRoaW4gdGhl
IGNvbnRyb2wgZm9yIGJldHRlciBzdHlsZSwgYSBsYQotICAgIC8vIENocm9taXVtIGxvb2sgJiBm
ZWVsLgotICAgIGlmIChtX3N0eWxlLT5pbmhlcml0cygiUU1hY1N0eWxlIikpIHsKLSAgICAgICAg
aW5mbGF0ZVggPSAtNDsKLSAgICAgICAgLy8gUmVuZGVyIG1pbmkgYXF1YSBzcGluIGJ1dHRvbnMg
Zm9yIFFNYWNTdHlsZSB0byBmaXQgbmljZWx5IGludG8KLSAgICAgICAgLy8gdGhlIGVkaXRvciBh
cmVhLCBsaWtlIENocm9taXVtLgotICAgICAgICBvcHRpb24uc3RhdGUgfD0gUVN0eWxlOjpTdGF0
ZV9NaW5pOwotICAgIH0KLSNlbmRpZgotCi0gICAgYnV0dG9uUmVjdC5pbmZsYXRlWChpbmZsYXRl
WCk7Ci0gICAgYnV0dG9uUmVjdC5pbmZsYXRlWShpbmZsYXRlWSk7Ci0gICAgb3B0aW9uLnJlY3Qg
PSBidXR0b25SZWN0OwotCi0gICAgc3R5bGUoKS0+ZHJhd0NvbXBsZXhDb250cm9sKFFTdHlsZTo6
Q0NfU3BpbkJveCwgJm9wdGlvbiwgcGFpbnRlciwgd2lkZ2V0KTsKLX0KLQotdm9pZCBRU3R5bGVG
YWNhZGVJbXA6OnBhaW50UHJvZ3Jlc3NCYXIoUVBhaW50ZXIqIHBhaW50ZXIsIGNvbnN0IFFTdHls
ZUZhY2FkZU9wdGlvbiYgcHJveHlPcHRpb24sIGRvdWJsZSBwcm9ncmVzcywgZG91YmxlIGFuaW1h
dGlvblByb2dyZXNzKQotewotICAgIFFXaWRnZXQqIHdpZGdldCA9IHFvYmplY3RfY2FzdDxRV2lk
Z2V0Kj4od2lkZ2V0Rm9yUGFpbnRlcihwYWludGVyKSk7Ci0KLSAgICBNYXBwZWRTdHlsZU9wdGlv
bjxRU3R5bGVPcHRpb25Qcm9ncmVzc0JhclYyPiBvcHRpb24od2lkZ2V0LCBwcm94eU9wdGlvbik7
Ci0KLSAgICBvcHRpb24ubWF4aW11bSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCk7
Ci0gICAgb3B0aW9uLm1pbmltdW0gPSAwOwotICAgIG9wdGlvbi5wcm9ncmVzcyA9IHByb2dyZXNz
ICogc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKTsKLQotICAgIGNvbnN0IFFQb2ludCB0
b3BMZWZ0ID0gb3B0aW9uLnJlY3QudG9wTGVmdCgpOwotICAgIHBhaW50ZXItPnRyYW5zbGF0ZSh0
b3BMZWZ0KTsKLSAgICBvcHRpb24ucmVjdC5tb3ZlVG8oUVBvaW50KDAsIDApKTsKLQotICAgIGlm
IChwcm9ncmVzcyA8IDApIHsKLSAgICAgICAgLy8gRklYTUU6IFVudGlsIGh0dHA6Ly9idWdyZXBv
cnRzLnF0Lm5va2lhLmNvbS9icm93c2UvUVRCVUctOTE3MSBpcyBmaXhlZCwKLSAgICAgICAgLy8g
d2Ugc2ltdWxhdGUgb25lIHNxdWFyZSBhbmltYXRpbmcgYWNyb3NzIHRoZSBwcm9ncmVzcyBiYXIu
Ci0gICAgICAgIHN0eWxlKCktPmRyYXdDb250cm9sKFFTdHlsZTo6Q0VfUHJvZ3Jlc3NCYXJHcm9v
dmUsICZvcHRpb24sIHBhaW50ZXIsIHdpZGdldCk7Ci0gICAgICAgIGludCBjaHVua1dpZHRoID0g
c3R5bGUoKS0+cGl4ZWxNZXRyaWMoUVN0eWxlOjpQTV9Qcm9ncmVzc0JhckNodW5rV2lkdGgsICZv
cHRpb24pOwotICAgICAgICBRQ29sb3IgY29sb3IgPSAob3B0aW9uLnBhbGV0dGUuaGlnaGxpZ2h0
KCkgPT0gb3B0aW9uLnBhbGV0dGUuYmFja2dyb3VuZCgpKSA/IG9wdGlvbi5wYWxldHRlLmNvbG9y
KFFQYWxldHRlOjpBY3RpdmUsIFFQYWxldHRlOjpIaWdobGlnaHQpIDogb3B0aW9uLnBhbGV0dGUu
Y29sb3IoUVBhbGV0dGU6OkhpZ2hsaWdodCk7Ci0gICAgICAgIGlmIChvcHRpb24uZGlyZWN0aW9u
ID09IFF0OjpSaWdodFRvTGVmdCkKLSAgICAgICAgICAgIHBhaW50ZXItPmZpbGxSZWN0KG9wdGlv
bi5yZWN0LnJpZ2h0KCkgLSBjaHVua1dpZHRoICAtIGFuaW1hdGlvblByb2dyZXNzICogb3B0aW9u
LnJlY3Qud2lkdGgoKSwgMCwgY2h1bmtXaWR0aCwgb3B0aW9uLnJlY3QuaGVpZ2h0KCksIGNvbG9y
KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcGFpbnRlci0+ZmlsbFJlY3QoYW5pbWF0aW9u
UHJvZ3Jlc3MgKiBvcHRpb24ucmVjdC53aWR0aCgpLCAwLCBjaHVua1dpZHRoLCBvcHRpb24ucmVj
dC5oZWlnaHQoKSwgY29sb3IpOwotICAgIH0gZWxzZQotICAgICAgICBzdHlsZSgpLT5kcmF3Q29u
dHJvbChRU3R5bGU6OkNFX1Byb2dyZXNzQmFyLCAmb3B0aW9uLCBwYWludGVyLCB3aWRnZXQpOwot
Ci0gICAgcGFpbnRlci0+dHJhbnNsYXRlKC10b3BMZWZ0KTsKLX0KLQotaW50IFFTdHlsZUZhY2Fk
ZUltcDo6c2Nyb2xsQmFyRXh0ZW50KGJvb2wgbWluaSkKLXsKLSAgICBRU3R5bGVPcHRpb25TbGlk
ZXIgbzsKLSAgICBvLm9yaWVudGF0aW9uID0gUXQ6OlZlcnRpY2FsOwotICAgIG8uc3RhdGUgJj0g
flFTdHlsZTo6U3RhdGVfSG9yaXpvbnRhbDsKLSAgICBpZiAobWluaSkKLSAgICAgICAgby5zdGF0
ZSB8PSBRU3R5bGU6OlN0YXRlX01pbmk7Ci0gICAgcmV0dXJuIHN0eWxlKCktPnBpeGVsTWV0cmlj
KFFTdHlsZTo6UE1fU2Nyb2xsQmFyRXh0ZW50LCAmbywgMCk7Ci19Ci0KLWJvb2wgUVN0eWxlRmFj
YWRlSW1wOjpzY3JvbGxCYXJNaWRkbGVDbGlja0Fic29sdXRlUG9zaXRpb25TdHlsZUhpbnQoKSBj
b25zdAotewotICAgIHJldHVybiBzdHlsZSgpLT5zdHlsZUhpbnQoUVN0eWxlOjpTSF9TY3JvbGxC
YXJfTWlkZGxlQ2xpY2tBYnNvbHV0ZVBvc2l0aW9uKTsKLX0KLQotdm9pZCBRU3R5bGVGYWNhZGVJ
bXA6OnBhaW50U2Nyb2xsQ29ybmVyKFFQYWludGVyKiBwYWludGVyLCBjb25zdCBRUmVjdCYgcmVj
dCkKLXsKLSAgICBRV2lkZ2V0KiB3aWRnZXQgPSBxb2JqZWN0X2Nhc3Q8UVdpZGdldCo+KHdpZGdl
dEZvclBhaW50ZXIocGFpbnRlcikpOwotCi0gICAgUVN0eWxlT3B0aW9uIG9wdGlvbjsKLSAgICBv
cHRpb24ucmVjdCA9IHJlY3Q7Ci0gICAgc3R5bGUoKS0+ZHJhd1ByaW1pdGl2ZShRU3R5bGU6OlBF
X1BhbmVsU2Nyb2xsQXJlYUNvcm5lciwgJm9wdGlvbiwgcGFpbnRlciwgd2lkZ2V0KTsKLX0KLQot
UVN0eWxlRmFjYWRlOjpTdWJDb250cm9sIFFTdHlsZUZhY2FkZUltcDo6aGl0VGVzdFNjcm9sbEJh
cihjb25zdCBRU3R5bGVGYWNhZGVPcHRpb24gJnByb3h5T3B0aW9uLCBjb25zdCBRUG9pbnQgJnBv
cykKLXsKLSAgICBNYXBwZWRTdHlsZU9wdGlvbjxRU3R5bGVPcHRpb25TbGlkZXI+IG9wdCgwLCBw
cm94eU9wdGlvbik7Ci0gICAgUVN0eWxlOjpTdWJDb250cm9sIHNjID0gc3R5bGUoKS0+aGl0VGVz
dENvbXBsZXhDb250cm9sKFFTdHlsZTo6Q0NfU2Nyb2xsQmFyLCAmb3B0LCBwb3MsIDApOwotICAg
IHJldHVybiBjb252ZXJ0VG9RU3R5bGVGYWNhZGVTdWJDb250cm9sKHNjKTsKLX0KLQotUVJlY3Qg
UVN0eWxlRmFjYWRlSW1wOjpzY3JvbGxCYXJTdWJDb250cm9sUmVjdChjb25zdCBRU3R5bGVGYWNh
ZGVPcHRpb24gJnByb3h5T3B0aW9uLCBRU3R5bGVGYWNhZGU6OlN1YkNvbnRyb2wgc3ViQ29udHJv
bCkKLXsKLSAgICBNYXBwZWRTdHlsZU9wdGlvbjxRU3R5bGVPcHRpb25TbGlkZXI+IG9wdCgwLCBw
cm94eU9wdGlvbik7Ci0gICAgcmV0dXJuIHN0eWxlKCktPnN1YkNvbnRyb2xSZWN0KFFTdHlsZTo6
Q0NfU2Nyb2xsQmFyLCAmb3B0LCBjb252ZXJ0VG9RU3R5bGVTdWJDb250cm9sKHN1YkNvbnRyb2wp
LCAwKTsKLX0KLQotdm9pZCBRU3R5bGVGYWNhZGVJbXA6OnBhaW50U2Nyb2xsQmFyKFFQYWludGVy
ICpwYWludGVyLCBjb25zdCBRU3R5bGVGYWNhZGVPcHRpb24gJnByb3h5T3B0aW9uKQotewotICAg
IFFXaWRnZXQqIHdpZGdldCA9IHFvYmplY3RfY2FzdDxRV2lkZ2V0Kj4od2lkZ2V0Rm9yUGFpbnRl
cihwYWludGVyKSk7Ci0KLSAgICBNYXBwZWRTdHlsZU9wdGlvbjxRU3R5bGVPcHRpb25TbGlkZXI+
IG9wdCh3aWRnZXQsIHByb3h5T3B0aW9uKTsKLQotI2lmZGVmIFFfT1NfTUFDCi0gICAgLy8gRklY
TUU6IFdlIGFsc28gbmVlZCB0byBjaGVjayB0aGUgd2lkZ2V0IHN0eWxlIGJ1dCB0b2RheSBTY3Jv
bGxiYXJUaGVtZSBpcyBub3QgYXdhcmUgb2YgdGhlIHBhZ2Ugc28gd2UKLSAgICAvLyBjYW4ndCBn
ZXQgdGhlIHdpZGdldC4KLSAgICBpZiAobV9zdHlsZS0+aW5oZXJpdHMoIlFNYWNTdHlsZSIpKQot
ICAgICAgICBtX3N0eWxlLT5kcmF3Q29tcGxleENvbnRyb2woUVN0eWxlOjpDQ19TY3JvbGxCYXIs
ICZvcHQsIHBhaW50ZXIsIHdpZGdldCk7Ci0gICAgZWxzZQotI2VuZGlmCi0gICAgewotICAgICAg
ICAvLyBUaGUgUVN0eWxlIGV4cGVjdHMgdGhlIGJhY2tncm91bmQgdG8gYmUgYWxyZWFkeSBmaWxs
ZWQuCi0gICAgICAgIHBhaW50ZXItPmZpbGxSZWN0KG9wdC5yZWN0LCBvcHQucGFsZXR0ZS5iYWNr
Z3JvdW5kKCkpOwotCi0gICAgICAgIGNvbnN0IFFQb2ludCB0b3BMZWZ0ID0gb3B0LnJlY3QudG9w
TGVmdCgpOwotICAgICAgICBwYWludGVyLT50cmFuc2xhdGUodG9wTGVmdCk7Ci0gICAgICAgIG9w
dC5yZWN0Lm1vdmVUbyhRUG9pbnQoMCwgMCkpOwotICAgICAgICBzdHlsZSgpLT5kcmF3Q29tcGxl
eENvbnRyb2woUVN0eWxlOjpDQ19TY3JvbGxCYXIsICZvcHQsIHBhaW50ZXIsIHdpZGdldCk7Ci0g
ICAgICAgIG9wdC5yZWN0Lm1vdmVUbyh0b3BMZWZ0KTsKLSAgICB9Ci19Ci0KLVFPYmplY3QqIFFT
dHlsZUZhY2FkZUltcDo6d2lkZ2V0Rm9yUGFpbnRlcihRUGFpbnRlciogcGFpbnRlcikKLXsKLSAg
ICBRUGFpbnREZXZpY2UqIGRldiA9IDA7Ci0gICAgaWYgKHBhaW50ZXIpCi0gICAgICAgIGRldiA9
IHBhaW50ZXItPmRldmljZSgpOwotICAgIGlmIChkZXYgJiYgZGV2LT5kZXZUeXBlKCkgPT0gUUlu
dGVybmFsOjpXaWRnZXQpCi0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxRV2lkZ2V0Kj4oZGV2
KTsKLSAgICByZXR1cm4gMDsKLX0KLQotUVN0eWxlKiBRU3R5bGVGYWNhZGVJbXA6OnN0eWxlKCkg
Y29uc3QKLXsKLSAgICBpZiAobV9zdHlsZSkKLSAgICAgICAgcmV0dXJuIG1fc3R5bGU7Ci0KLSAg
ICBtX3N0eWxlID0gUVN0eWxlRmFjYWRlOjpzdHlsZUZvclBhZ2UobV9wYWdlKTsKLQotICAgIGlm
ICghbV9zdHlsZSkKLSAgICAgICAgbV9zdHlsZSA9IFFBcHBsaWNhdGlvbjo6c3R5bGUoKTsKLQot
ICAgIHJldHVybiBtX3N0eWxlOwotfQotCi19CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0
L1dlYkNvcmVTdXBwb3J0L1FTdHlsZUZhY2FkZUltcC5oIGIvU291cmNlL1dlYktpdC9xdC9XZWJD
b3JlU3VwcG9ydC9RU3R5bGVGYWNhZGVJbXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggNzIyMWQ3MmM0MWU4MWI4YjkzOTQ5YTU0YmZkMjNmMThlYWE3ZTYyMi4uMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNv
cmVTdXBwb3J0L1FTdHlsZUZhY2FkZUltcC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBA
QAotLyoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSB0aGVtZSBpbXBsZW1lbnRhdGlvbiBm
b3IgZm9ybSBjb250cm9scyBpbiBXZWJDb3JlLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBE
aWdpYSBQbGMgYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpLgotICogQ29weXJpZ2h0IChDKSAy
MDExLTIwMTIgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpLgot
ICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBT
b2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwg
b3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIGxpYnJh
cnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAq
IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJh
bnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UuICBTZWUgdGhlIEdOVQotICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv
ciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBv
ZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0
aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8K
LSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVl
dCwgRmlmdGggRmxvb3IsCi0gKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KLSAqCi0gKi8K
LSNpZm5kZWYgUVN0eWxlRmFjYWRlSW1wX2gKLSNkZWZpbmUgUVN0eWxlRmFjYWRlSW1wX2gKLQot
I2luY2x1ZGUgPFFQb2ludGVyPgotI2luY2x1ZGUgPFFTdHlsZUZhY2FkZS5oPgotCi1RVF9CRUdJ
Tl9OQU1FU1BBQ0UKLWNsYXNzIFFTdHlsZTsKLWNsYXNzIFFMaW5lRWRpdDsKLWNsYXNzIFFTdHls
ZU9wdGlvbjsKLWNsYXNzIFFTdHlsZU9wdGlvblNsaWRlcjsKLWNsYXNzIFFQYWludGVyOwotY2xh
c3MgUU9iamVjdDsKLVFUX0VORF9OQU1FU1BBQ0UKLQotbmFtZXNwYWNlIFdlYkNvcmUgewotY2xh
c3MgUGFnZTsKLX0KLQotbmFtZXNwYWNlIFdlYktpdCB7Ci0KLWNsYXNzIFFTdHlsZUZhY2FkZUlt
cCA6IHB1YmxpYyBXZWJDb3JlOjpRU3R5bGVGYWNhZGUgewotcHVibGljOgotICAgIFFTdHlsZUZh
Y2FkZUltcChXZWJDb3JlOjpQYWdlKiA9IDApOwotICAgIHZpcnR1YWwgflFTdHlsZUZhY2FkZUlt
cCgpOwotCi0gICAgc3RhdGljIFdlYkNvcmU6OlFTdHlsZUZhY2FkZSogY3JlYXRlKFdlYkNvcmU6
OlBhZ2UqIHBhZ2UpCi0gICAgeyByZXR1cm4gbmV3IFFTdHlsZUZhY2FkZUltcChwYWdlKTsgfQot
Ci0gICAgdmlydHVhbCBRUmVjdCBidXR0b25TdWJFbGVtZW50UmVjdChCdXR0b25TdWJFbGVtZW50
LCBTdGF0ZSwgY29uc3QgUVJlY3QmIG9yaWdpbmFsUmVjdCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFs
IGludCBmaW5kRnJhbWVMaW5lV2lkdGgoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGludCBzaW1wbGVQ
aXhlbE1ldHJpYyhQaXhlbE1ldHJpYywgU3RhdGUgPSBTdGF0ZV9Ob25lKSBjb25zdDsKLSAgICB2
aXJ0dWFsIGludCBidXR0b25NYXJnaW4oU3RhdGUsIGNvbnN0IFFSZWN0JiBvcmlnaW5hbFJlY3Qp
IGNvbnN0OwotICAgIHZpcnR1YWwgaW50IHNsaWRlckxlbmd0aChRdDo6T3JpZW50YXRpb24pIGNv
bnN0OwotICAgIHZpcnR1YWwgaW50IHNsaWRlclRoaWNrbmVzcyhRdDo6T3JpZW50YXRpb24pIGNv
bnN0OwotICAgIHZpcnR1YWwgaW50IHByb2dyZXNzQmFyQ2h1bmtXaWR0aChjb25zdCBRU2l6ZSYp
IGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBnZXRCdXR0b25NZXRyaWNzKFFTdHJpbmcqIGJ1dHRv
bkZvbnRGYW1pbHksIGludCogYnV0dG9uRm9udFBpeGVsU2l6ZSkgY29uc3Q7Ci0KLSAgICB2aXJ0
dWFsIFFTaXplIGNvbWJvQm94U2l6ZUZyb21Db250ZW50cyhTdGF0ZSwgY29uc3QgUVNpemUmIGNv
bnRlbnRzU2l6ZSkgY29uc3Q7Ci0gICAgdmlydHVhbCBRU2l6ZSBwdXNoQnV0dG9uU2l6ZUZyb21D
b250ZW50cyhTdGF0ZSwgY29uc3QgUVNpemUmIGNvbnRlbnRzU2l6ZSkgY29uc3Q7Ci0KLSAgICB2
aXJ0dWFsIHZvaWQgcGFpbnRCdXR0b24oUVBhaW50ZXIqLCBCdXR0b25UeXBlLCBjb25zdCBXZWJD
b3JlOjpRU3R5bGVGYWNhZGVPcHRpb24gJnByb3h5T3B0aW9uKTsKLSAgICB2aXJ0dWFsIHZvaWQg
cGFpbnRUZXh0RmllbGQoUVBhaW50ZXIqLCBjb25zdCBXZWJDb3JlOjpRU3R5bGVGYWNhZGVPcHRp
b24mKTsKLSAgICB2aXJ0dWFsIHZvaWQgcGFpbnRDb21ib0JveChRUGFpbnRlciosIGNvbnN0IFdl
YkNvcmU6OlFTdHlsZUZhY2FkZU9wdGlvbiYpOwotICAgIHZpcnR1YWwgdm9pZCBwYWludENvbWJv
Qm94QXJyb3coUVBhaW50ZXIqLCBjb25zdCBXZWJDb3JlOjpRU3R5bGVGYWNhZGVPcHRpb24mKTsK
LQotICAgIHZpcnR1YWwgdm9pZCBwYWludFNsaWRlclRyYWNrKFFQYWludGVyKiwgY29uc3QgV2Vi
Q29yZTo6UVN0eWxlRmFjYWRlT3B0aW9uJik7Ci0gICAgdmlydHVhbCB2b2lkIHBhaW50U2xpZGVy
VGh1bWIoUVBhaW50ZXIqLCBjb25zdCBXZWJDb3JlOjpRU3R5bGVGYWNhZGVPcHRpb24mKTsKLSAg
ICB2aXJ0dWFsIHZvaWQgcGFpbnRJbm5lclNwaW5CdXR0b24oUVBhaW50ZXIqLCBjb25zdCBXZWJD
b3JlOjpRU3R5bGVGYWNhZGVPcHRpb24mLCBib29sIHNwaW5Cb3hVcCk7Ci0gICAgdmlydHVhbCB2
b2lkIHBhaW50UHJvZ3Jlc3NCYXIoUVBhaW50ZXIqLCBjb25zdCBXZWJDb3JlOjpRU3R5bGVGYWNh
ZGVPcHRpb24mLCBkb3VibGUgcHJvZ3Jlc3MsIGRvdWJsZSBhbmltYXRpb25Qcm9ncmVzcyk7Ci0K
LSAgICB2aXJ0dWFsIGludCBzY3JvbGxCYXJFeHRlbnQoYm9vbCBtaW5pKTsKLSAgICB2aXJ0dWFs
IGJvb2wgc2Nyb2xsQmFyTWlkZGxlQ2xpY2tBYnNvbHV0ZVBvc2l0aW9uU3R5bGVIaW50KCkgY29u
c3Q7Ci0gICAgdmlydHVhbCB2b2lkIHBhaW50U2Nyb2xsQ29ybmVyKFFQYWludGVyKiwgY29uc3Qg
UVJlY3QmKTsKLQotICAgIHZpcnR1YWwgU3ViQ29udHJvbCBoaXRUZXN0U2Nyb2xsQmFyKGNvbnN0
IFdlYkNvcmU6OlFTdHlsZUZhY2FkZU9wdGlvbiYsIGNvbnN0IFFQb2ludCYgcG9zKTsKLSAgICB2
aXJ0dWFsIFFSZWN0IHNjcm9sbEJhclN1YkNvbnRyb2xSZWN0KGNvbnN0IFdlYkNvcmU6OlFTdHls
ZUZhY2FkZU9wdGlvbiYsIFN1YkNvbnRyb2wpOwotICAgIHZpcnR1YWwgdm9pZCBwYWludFNjcm9s
bEJhcihRUGFpbnRlciosIGNvbnN0IFdlYkNvcmU6OlFTdHlsZUZhY2FkZU9wdGlvbiYpOwotCi0g
ICAgdmlydHVhbCBRT2JqZWN0KiB3aWRnZXRGb3JQYWludGVyKFFQYWludGVyKik7Ci0KLSAgICB2
aXJ0dWFsIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIHN0eWxlKCk7IH0KLQotcHJpdmF0
ZToKLSAgICBRU3R5bGUqIHN0eWxlKCkgY29uc3Q7Ci0KLSAgICBXZWJDb3JlOjpQYWdlKiBtX3Bh
Z2U7Ci0gICAgbXV0YWJsZSBRUG9pbnRlcjxRU3R5bGU+IG1fc3R5bGU7Ci0gICAgUVN0eWxlKiBt
X2ZhbGxiYWNrU3R5bGU7Ci0gICAgYm9vbCBtX293bkZhbGxiYWNrU3R5bGU7Ci0gICAgbXV0YWJs
ZSBRU2NvcGVkUG9pbnRlcjxRTGluZUVkaXQ+IG1fbGluZUVkaXQ7Ci19OwotCi19Ci0KLSNlbmRp
ZiAvLyBRU3R5bGVGYWNhZGVJbXBfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9XZWJD
b3JlU3VwcG9ydC9RV2ViRnJhbWVBZGFwdGVyLmNwcCBiL1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29y
ZVN1cHBvcnQvUVdlYkZyYW1lQWRhcHRlci5jcHAKaW5kZXggMzgwYjc0OTU0Y2U0ZDU3ZjFhMWQ2
ZDliMjAwNjk2ZDMwNWEyMzgwYS4uNTBiYWQ1NjViYzQzMTQ1ZWMyZTEwY2U5OTRhNzdmNGIxNDg3
N2U5NCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9RV2ViRnJh
bWVBZGFwdGVyLmNwcAorKysgYi9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L1FXZWJG
cmFtZUFkYXB0ZXIuY3BwCkBAIC0yMSwxNSArMjEsNDQgQEAKICNpbmNsdWRlICJjb25maWcuaCIK
ICNpbmNsdWRlICJRV2ViRnJhbWVBZGFwdGVyLmgiCiAKKyNpbmNsdWRlICJBUElDYXN0LmgiCisj
aW5jbHVkZSAiQ2hyb21lLmgiCisjaW5jbHVkZSAiQ2hyb21lQ2xpZW50UXQuaCIKKyNpbmNsdWRl
ICJEb2N1bWVudExvYWRlci5oIgorI2luY2x1ZGUgIkZvY3VzQ29udHJvbGxlci5oIgogI2luY2x1
ZGUgIkZyYW1lLmgiCiAjaW5jbHVkZSAiRnJhbWVMb2FkUmVxdWVzdC5oIgogI2luY2x1ZGUgIkZy
YW1lTG9hZGVyQ2xpZW50UXQuaCIKKyNpbmNsdWRlICJGcmFtZVZpZXcuaCIKKyNpbmNsdWRlICJI
VFRQUGFyc2Vycy5oIgorI2luY2x1ZGUgIkhUTUxNZXRhRWxlbWVudC5oIgorI2luY2x1ZGUgIkhp
dFRlc3RSZXN1bHQuaCIKKyNpbmNsdWRlICJJbnNwZWN0b3JDb250cm9sbGVyLmgiCisjaW5jbHVk
ZSAiSlNET01XaW5kb3dCYXNlLmgiCisjaW5jbHVkZSAiS1VSTC5oIgogI2luY2x1ZGUgIlFXZWJQ
YWdlQWRhcHRlci5oIgorI2luY2x1ZGUgIk5hdmlnYXRpb25TY2hlZHVsZXIuaCIKKyNpbmNsdWRl
ICJOb2RlTGlzdC5oIgorI2luY2x1ZGUgIlBhZ2UuaCIKKyNpbmNsdWRlICJSZW5kZXJPYmplY3Qu
aCIKKyNpbmNsdWRlICJTY3JpcHRWYWx1ZS5oIgorI2luY2x1ZGUgIlNjcmlwdFNvdXJjZUNvZGUu
aCIKKyNpbmNsdWRlICJTdWJzdGl0dXRlRGF0YS5oIgorI2luY2x1ZGUgIlRleHR1cmVNYXBwZXJM
YXllckNsaWVudFF0LmgiCisjaW5jbHVkZSAiVGlsZWRCYWNraW5nU3RvcmUuaCIKICNpZiBFTkFC
TEUoR0VTVFVSRV9FVkVOVFMpCiAjaW5jbHVkZSAiUGxhdGZvcm1HZXN0dXJlRXZlbnQuaCIKICNp
bmNsdWRlICJXZWJFdmVudENvbnZlcnNpb24uaCIKICNlbmRpZgorI2luY2x1ZGUgIm1hcmt1cC5o
IgorI2luY2x1ZGUgImh0bWxlZGl0aW5nLmgiCisjaW5jbHVkZSAicXRfcnVudGltZS5oIgorI2lu
Y2x1ZGUgInF3ZWJzZWN1cml0eW9yaWdpbi5oIgorI2luY2x1ZGUgInF3ZWJzZWN1cml0eW9yaWdp
bl9wLmgiCisjaW5jbHVkZSAicXdlYnNldHRpbmdzLmgiCiAKKyNpbmNsdWRlIDxJbnRSZWN0Lmg+
CisjaW5jbHVkZSA8SW50U2l6ZS5oPgogI2luY2x1ZGUgPFFGaWxlSW5mbz4KICNpbmNsdWRlIDxR
TmV0d29ya1JlcXVlc3Q+CiAKQEAgLTcyLDYgKzEwMSw4IEBAIFFXZWJGcmFtZUFkYXB0ZXI6OlFX
ZWJGcmFtZUFkYXB0ZXIoKQogICAgICwgYWxsb3dzU2Nyb2xsaW5nKHRydWUpCiAgICAgLCBtYXJn
aW5XaWR0aCgtMSkKICAgICAsIG1hcmdpbkhlaWdodCgtMSkKKyAgICAsIGhvcml6b250YWxTY3Jv
bGxCYXJQb2xpY3koUXQ6OlNjcm9sbEJhckFzTmVlZGVkKQorICAgICwgdmVydGljYWxTY3JvbGxC
YXJQb2xpY3koUXQ6OlNjcm9sbEJhckFzTmVlZGVkKQogICAgICwgZnJhbWUoMCkKICAgICAsIGZy
YW1lTG9hZGVyQ2xpZW50KDApCiB7CkBAIC0xMzksMTAgKzE3MCwxNSBAQCB2b2lkIFFXZWJGcmFt
ZUFkYXB0ZXI6OmxvYWQoY29uc3QgUU5ldHdvcmtSZXF1ZXN0JiByZXEsIFFOZXR3b3JrQWNjZXNz
TWFuYWdlcjo6TwogICAgICAgICBwYWdlQWRhcHRlci0+aW5zaWRlT3BlbkNhbGwgPSBmYWxzZTsK
IH0KIAorYm9vbCBRV2ViRnJhbWVBZGFwdGVyOjpoYXNWaWV3KCkgY29uc3QKK3sKKyAgICByZXR1
cm4gZnJhbWUgJiYgZnJhbWUtPnZpZXcoKTsKK30KKwogI2lmIEVOQUJMRShHRVNUVVJFX0VWRU5U
UykKIHZvaWQgUVdlYkZyYW1lQWRhcHRlcjo6aGFuZGxlR2VzdHVyZUV2ZW50KFFHZXN0dXJlRXZl
bnRGYWNhZGUqIGdlc3R1cmVFdmVudCkKIHsKLSAgICBBU1NFUlQoaGFzVmlldygpKTsKKyAgICBB
U1NFUlQoZnJhbWUgJiYgZnJhbWUtPnZpZXcoKSk7CiAgICAgc3dpdGNoIChnZXN0dXJlRXZlbnQt
PnR5cGUpIHsKICAgICBjYXNlIFF0OjpUYXBHZXN0dXJlOgogICAgICAgICBmcmFtZS0+ZXZlbnRI
YW5kbGVyKCktPmhhbmRsZUdlc3R1cmVFdmVudChjb252ZXJ0R2VzdHVyZShnZXN0dXJlRXZlbnQp
KTsKQEAgLTE1NiwxOCArMTkyLDE0NCBAQCB2b2lkIFFXZWJGcmFtZUFkYXB0ZXI6OmhhbmRsZUdl
c3R1cmVFdmVudChRR2VzdHVyZUV2ZW50RmFjYWRlKiBnZXN0dXJlRXZlbnQpCiB9CiAjZW5kaWYK
IAotV2ViQ29yZTo6SW50U2l6ZSBRV2ViRnJhbWVBZGFwdGVyOjpzY3JvbGxQb3NpdGlvbigpIGNv
bnN0CitRVmFyaWFudCBRV2ViRnJhbWVBZGFwdGVyOjpldmFsdWF0ZUphdmFTY3JpcHQoY29uc3Qg
UVN0cmluZyAmc2NyaXB0U291cmNlKQoreworICAgIFNjcmlwdENvbnRyb2xsZXIgKnByb3h5ID0g
ZnJhbWUtPnNjcmlwdCgpOworICAgIFFWYXJpYW50IHJjOworICAgIGlmIChwcm94eSkgeworICAg
ICAgICBpbnQgZGlzdGFuY2UgPSAwOworICAgICAgICBKU0M6OkpTVmFsdWUgdiA9IGZyYW1lLT5z
Y3JpcHQoKS0+ZXhlY3V0ZVNjcmlwdChTY3JpcHRTb3VyY2VDb2RlKHNjcmlwdFNvdXJjZSkpLmpz
VmFsdWUoKTsKKyAgICAgICAgSlNDOjpFeGVjU3RhdGUqIGV4ZWMgPSBwcm94eS0+Z2xvYmFsT2Jq
ZWN0KG1haW5UaHJlYWROb3JtYWxXb3JsZCgpKS0+Z2xvYmFsRXhlYygpOworICAgICAgICBKU1Zh
bHVlUmVmKiBpZ25vcmVkRXhjZXB0aW9uID0gMDsKKyAgICAgICAgcmMgPSBKU0M6OkJpbmRpbmdz
Ojpjb252ZXJ0VmFsdWVUb1FWYXJpYW50KHRvUmVmKGV4ZWMpLCB0b1JlZihleGVjLCB2KSwgUU1l
dGFUeXBlOjpWb2lkLCAmZGlzdGFuY2UsIGlnbm9yZWRFeGNlcHRpb24pOworICAgIH0KKyAgICBy
ZXR1cm4gcmM7Cit9CisKK3ZvaWQgUVdlYkZyYW1lQWRhcHRlcjo6YWRkVG9KYXZhU2NyaXB0V2lu
ZG93T2JqZWN0KGNvbnN0IFFTdHJpbmcmIG5hbWUsIFFPYmplY3QqIG9iamVjdCwgVmFsdWVPd25l
cnNoaXAgb3duZXJzaGlwKQoreworICAgIGlmICghcGFnZUFkYXB0ZXItPnNldHRpbmdzLT50ZXN0
QXR0cmlidXRlKFFXZWJTZXR0aW5nczo6SmF2YXNjcmlwdEVuYWJsZWQpKQorICAgICAgICByZXR1
cm47CisgICAgSlNDOjpCaW5kaW5nczo6UXRJbnN0YW5jZTo6VmFsdWVPd25lcnNoaXAgdmFsdWVP
d25lcnNoaXAgPSBzdGF0aWNfY2FzdDxKU0M6OkJpbmRpbmdzOjpRdEluc3RhbmNlOjpWYWx1ZU93
bmVyc2hpcD4ob3duZXJzaGlwKTsKKyAgICBKU0RPTVdpbmRvdyogd2luZG93ID0gdG9KU0RPTVdp
bmRvdyhmcmFtZSwgbWFpblRocmVhZE5vcm1hbFdvcmxkKCkpOworICAgIEpTQzo6QmluZGluZ3M6
OlJvb3RPYmplY3QqIHJvb3Q7CisgICAgaWYgKHZhbHVlT3duZXJzaGlwID09IEpTQzo6QmluZGlu
Z3M6OlF0SW5zdGFuY2U6OlF0T3duZXJzaGlwKQorICAgICAgICByb290ID0gZnJhbWUtPnNjcmlw
dCgpLT5jYWNoZWFibGVCaW5kaW5nUm9vdE9iamVjdCgpOworICAgIGVsc2UKKyAgICAgICAgcm9v
dCA9IGZyYW1lLT5zY3JpcHQoKS0+YmluZGluZ1Jvb3RPYmplY3QoKTsKKworICAgIGlmICghd2lu
ZG93KSB7CisgICAgICAgIHFEZWJ1ZygpIDw8ICJXYXJuaW5nOiBjb3VsZG4ndCBnZXQgd2luZG93
IG9iamVjdCI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCFyb290KSB7CisgICAg
ICAgIHFEZWJ1ZygpIDw8ICJXYXJuaW5nOiBjb3VsZG4ndCBnZXQgcm9vdCBvYmplY3QiOworICAg
ICAgICByZXR1cm47CisgICAgfQorCisgICAgSlNDOjpFeGVjU3RhdGUqIGV4ZWMgPSB3aW5kb3ct
Pmdsb2JhbEV4ZWMoKTsKKyAgICBKU0M6OkpTTG9ja0hvbGRlciBsb2NrKGV4ZWMpOworCisgICAg
SlNDOjpKU09iamVjdCogcnVudGltZU9iamVjdCA9CisgICAgICAgICAgICBKU0M6OkJpbmRpbmdz
OjpRdEluc3RhbmNlOjpnZXRRdEluc3RhbmNlKG9iamVjdCwgcm9vdCwgdmFsdWVPd25lcnNoaXAp
LT5jcmVhdGVSdW50aW1lT2JqZWN0KGV4ZWMpOworCisgICAgSlNDOjpQdXRQcm9wZXJ0eVNsb3Qg
c2xvdDsKKyAgICB3aW5kb3ctPm1ldGhvZFRhYmxlKCktPnB1dCh3aW5kb3csIGV4ZWMsIEpTQzo6
SWRlbnRpZmllcigmZXhlYy0+Z2xvYmFsRGF0YSgpLCByZWludGVycHJldF9jYXN0X3B0cjxjb25z
dCBVQ2hhcio+KG5hbWUuY29uc3REYXRhKCkpLCBuYW1lLmxlbmd0aCgpKSwgcnVudGltZU9iamVj
dCwgc2xvdCk7Cit9CisKK1FTdHJpbmcgUVdlYkZyYW1lQWRhcHRlcjo6dG9IdG1sKCkgY29uc3QK
IHsKLSAgICBpZiAoIWhhc1ZpZXcoKSkKLSAgICAgICAgcmV0dXJuIEludFNpemUoKTsKLSAgICBy
ZXR1cm4gZnJhbWUtPnZpZXcoKS0+c2Nyb2xsT2Zmc2V0KCk7CisgICAgaWYgKCFmcmFtZS0+ZG9j
dW1lbnQoKSkKKyAgICAgICAgcmV0dXJuIFFTdHJpbmcoKTsKKyAgICByZXR1cm4gY3JlYXRlTWFy
a3VwKGZyYW1lLT5kb2N1bWVudCgpKTsKK30KKworUVN0cmluZyBRV2ViRnJhbWVBZGFwdGVyOjp0
b1BsYWluVGV4dCgpIGNvbnN0Cit7CisgICAgaWYgKGZyYW1lLT52aWV3KCkgJiYgZnJhbWUtPnZp
ZXcoKS0+bGF5b3V0UGVuZGluZygpKQorICAgICAgICBmcmFtZS0+dmlldygpLT5sYXlvdXQoKTsK
KworICAgIEVsZW1lbnQgKmRvY3VtZW50RWxlbWVudCA9IGZyYW1lLT5kb2N1bWVudCgpLT5kb2N1
bWVudEVsZW1lbnQoKTsKKyAgICBpZiAoZG9jdW1lbnRFbGVtZW50KQorICAgICAgICByZXR1cm4g
ZG9jdW1lbnRFbGVtZW50LT5pbm5lclRleHQoKTsKKyAgICByZXR1cm4gUVN0cmluZygpOworfQor
Cit2b2lkIFFXZWJGcmFtZUFkYXB0ZXI6OnNldENvbnRlbnQoY29uc3QgUUJ5dGVBcnJheSAmZGF0
YSwgY29uc3QgUVN0cmluZyAmbWltZVR5cGUsIGNvbnN0IFFVcmwgJmJhc2VVcmwpCit7CisgICAg
S1VSTCBrdXJsKGJhc2VVcmwpOworICAgIFdlYkNvcmU6OlJlc291cmNlUmVxdWVzdCByZXF1ZXN0
KGt1cmwpOworICAgIFdURjo6UmVmUHRyPFdlYkNvcmU6OlNoYXJlZEJ1ZmZlcj4gYnVmZmVyID0g
V2ViQ29yZTo6U2hhcmVkQnVmZmVyOjpjcmVhdGUoZGF0YS5jb25zdERhdGEoKSwgZGF0YS5sZW5n
dGgoKSk7CisgICAgUVN0cmluZyBhY3R1YWxNaW1lVHlwZTsKKyAgICBXVEY6OlN0cmluZyBlbmNv
ZGluZzsKKyAgICBpZiAobWltZVR5cGUuaXNFbXB0eSgpKQorICAgICAgICBhY3R1YWxNaW1lVHlw
ZSA9IFFMYXRpbjFTdHJpbmcoInRleHQvaHRtbCIpOworICAgIGVsc2UgeworICAgICAgICBhY3R1
YWxNaW1lVHlwZSA9IGV4dHJhY3RNSU1FVHlwZUZyb21NZWRpYVR5cGUobWltZVR5cGUpOworICAg
ICAgICBlbmNvZGluZyA9IGV4dHJhY3RDaGFyc2V0RnJvbU1lZGlhVHlwZShtaW1lVHlwZSk7Cisg
ICAgfQorICAgIFdlYkNvcmU6OlN1YnN0aXR1dGVEYXRhIHN1YnN0aXR1dGVEYXRhKGJ1ZmZlciwg
V1RGOjpTdHJpbmcoYWN0dWFsTWltZVR5cGUpLCBlbmNvZGluZywgS1VSTCgpKTsKKyAgICBmcmFt
ZS0+bG9hZGVyKCktPmxvYWQoV2ViQ29yZTo6RnJhbWVMb2FkUmVxdWVzdChmcmFtZSwgcmVxdWVz
dCwgc3Vic3RpdHV0ZURhdGEpKTsKK30KKwordm9pZCBRV2ViRnJhbWVBZGFwdGVyOjpzZXRIdG1s
KGNvbnN0IFFTdHJpbmcgJmh0bWwsIGNvbnN0IFFVcmwgJmJhc2VVcmwpCit7CisgICAgS1VSTCBr
dXJsKGJhc2VVcmwpOworICAgIFdlYkNvcmU6OlJlc291cmNlUmVxdWVzdCByZXF1ZXN0KGt1cmwp
OworICAgIGNvbnN0IFFCeXRlQXJyYXkgdXRmOCA9IGh0bWwudG9VdGY4KCk7CisgICAgV1RGOjpS
ZWZQdHI8V2ViQ29yZTo6U2hhcmVkQnVmZmVyPiBkYXRhID0gV2ViQ29yZTo6U2hhcmVkQnVmZmVy
OjpjcmVhdGUodXRmOC5jb25zdERhdGEoKSwgdXRmOC5sZW5ndGgoKSk7CisgICAgV2ViQ29yZTo6
U3Vic3RpdHV0ZURhdGEgc3Vic3RpdHV0ZURhdGEoZGF0YSwgV1RGOjpTdHJpbmcoInRleHQvaHRt
bCIpLCBXVEY6OlN0cmluZygidXRmLTgiKSwgS1VSTCgpKTsKKyAgICBmcmFtZS0+bG9hZGVyKCkt
PmxvYWQoV2ViQ29yZTo6RnJhbWVMb2FkUmVxdWVzdChmcmFtZSwgcmVxdWVzdCwgc3Vic3RpdHV0
ZURhdGEpKTsKK30KKworUU11bHRpTWFwPFFTdHJpbmcsIFFTdHJpbmc+IFFXZWJGcmFtZUFkYXB0
ZXI6Om1ldGFEYXRhKCkgY29uc3QKK3sKKyAgICBpZiAoIWZyYW1lLT5kb2N1bWVudCgpKQorICAg
ICAgIHJldHVybiBRTWFwPFFTdHJpbmcsIFFTdHJpbmc+KCk7CisKKyAgICBRTXVsdGlNYXA8UVN0
cmluZywgUVN0cmluZz4gbWFwOworICAgIERvY3VtZW50KiBkb2MgPSBmcmFtZS0+ZG9jdW1lbnQo
KTsKKyAgICBSZWZQdHI8Tm9kZUxpc3Q+IGxpc3QgPSBkb2MtPmdldEVsZW1lbnRzQnlUYWdOYW1l
KCJtZXRhIik7CisgICAgdW5zaWduZWQgbGVuID0gbGlzdC0+bGVuZ3RoKCk7CisgICAgZm9yICh1
bnNpZ25lZCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgIEhUTUxNZXRhRWxlbWVudCog
bWV0YSA9IHN0YXRpY19jYXN0PEhUTUxNZXRhRWxlbWVudCo+KGxpc3QtPml0ZW0oaSkpOworICAg
ICAgICBtYXAuaW5zZXJ0KG1ldGEtPm5hbWUoKSwgbWV0YS0+Y29udGVudCgpKTsKKyAgICB9Cisg
ICAgcmV0dXJuIG1hcDsKIH0KIAotSW50UmVjdCBRV2ViRnJhbWVBZGFwdGVyOjpmcmFtZVJlY3Qo
KSBjb25zdAorUVBvaW50IFFXZWJGcmFtZUFkYXB0ZXI6OnNjcm9sbFBvc2l0aW9uKCkgY29uc3QK
IHsKLSAgICBpZiAoIWhhc1ZpZXcoKSkKLSAgICAgICAgcmV0dXJuIEludFJlY3QoKTsKLSAgICBy
ZXR1cm4gZnJhbWUtPnZpZXcoKS0+ZnJhbWVSZWN0KCk7CisgICAgaWYgKCFmcmFtZSB8fCAhZnJh
bWUtPnZpZXcoKSkKKyAgICAgICAgcmV0dXJuIFFQb2ludCgpOworICAgIEludFNpemUgb2ZzID0g
ZnJhbWUtPnZpZXcoKS0+c2Nyb2xsT2Zmc2V0KCk7CisgICAgcmV0dXJuIFFQb2ludChvZnMud2lk
dGgoKSwgb2ZzLmhlaWdodCgpKTsKK30KKworUVJlY3QgUVdlYkZyYW1lQWRhcHRlcjo6ZnJhbWVS
ZWN0KCkgY29uc3QKK3sKKyAgICBpZiAoIWZyYW1lIHx8ICFmcmFtZS0+dmlldygpKQorICAgICAg
ICByZXR1cm4gUVJlY3QoKTsKKyAgICByZXR1cm4gUVJlY3QoZnJhbWUtPnZpZXcoKS0+ZnJhbWVS
ZWN0KCkpOworfQorCitRU2l6ZSBRV2ViRnJhbWVBZGFwdGVyOjpjb250ZW50c1NpemUoKSBjb25z
dAoreworICAgIEZyYW1lVmlldyAqdmlldyA9IGZyYW1lLT52aWV3KCk7CisgICAgaWYgKCF2aWV3
KQorICAgICAgICByZXR1cm4gUVNpemUoKTsKKyAgICByZXR1cm4gUVNpemUodmlldy0+Y29udGVu
dHNXaWR0aCgpLCB2aWV3LT5jb250ZW50c0hlaWdodCgpKTsKK30KKwordm9pZCBRV2ViRnJhbWVB
ZGFwdGVyOjpzZXRab29tRmFjdG9yKHFyZWFsIGZhY3RvcikKK3sKKyAgICBwYWdlQWRhcHRlci0+
c2V0dGluZ3MtPnNldEF0dHJpYnV0ZShRV2ViU2V0dGluZ3M6Olpvb21UZXh0T25seSwgdHJ1ZSk7
CisgICAgZnJhbWUtPnNldFBhZ2VBbmRUZXh0Wm9vbUZhY3RvcnMoMSwgZmFjdG9yKTsKK30KKwor
cXJlYWwgUVdlYkZyYW1lQWRhcHRlcjo6em9vbUZhY3RvcigpIGNvbnN0Cit7CisgICAgcmV0dXJu
IHBhZ2VBZGFwdGVyLT5zZXR0aW5ncy0+dGVzdEF0dHJpYnV0ZShRV2ViU2V0dGluZ3M6Olpvb21U
ZXh0T25seSkgPyBmcmFtZS0+dGV4dFpvb21GYWN0b3IoKSA6IGZyYW1lLT5wYWdlWm9vbUZhY3Rv
cigpOwogfQogCiB2b2lkIFFXZWJGcmFtZUFkYXB0ZXI6OmluaXQoUVdlYlBhZ2VBZGFwdGVyKiBw
YWdlQWRhcHRlcikKQEAgLTE5NiwxNiArMzU4LDYxNiBAQCBRV2ViRnJhbWVBZGFwdGVyKiBRV2Vi
RnJhbWVBZGFwdGVyOjpraXQoY29uc3QgRnJhbWUqIGZyYW1lKQogCiBRVXJsIFFXZWJGcmFtZUFk
YXB0ZXI6OmVuc3VyZUFic29sdXRlVXJsKGNvbnN0IFFVcmwmIHVybCkKIHsKLSAgICBpZiAoIXVy
bC5pc1ZhbGlkKCkgfHwgIXVybC5pc1JlbGF0aXZlKCkpCi0gICAgICAgIHJldHVybiB1cmw7Cisg
ICAgLy8gRklYTUU6IGl0IHdvdWxkIGJlIG5pY2UgaWYgd2UgY291bGQgYXZvaWQgZG9pbmcgdGhp
cy4KKyAgICAvLyBDb252ZXJ0IHRvIEtVUkwgYW5kIGJhY2sgdG8gcHJlc2VydmUgdGhlIG9sZCBi
ZWhhdmlvciAoZS5nLiBmaXh1cCBvZiBzaW5nbGUgc2xhc2ggaW4gJ2h0dHA6LycpCisgICAgUVVy
bCB2YWxpZGF0ZWRVcmwgPSBLVVJMKHVybCk7CisKKyAgICBpZiAoIXZhbGlkYXRlZFVybC5pc1Zh
bGlkKCkgfHwgIXZhbGlkYXRlZFVybC5pc1JlbGF0aXZlKCkpCisgICAgICAgIHJldHVybiB2YWxp
ZGF0ZWRVcmw7CiAKICAgICAvLyBUaGlzIGNvbnRhaW5zIHRoZSBVUkwgd2l0aCBhYnNvbHV0ZSBw
YXRoIGJ1dCB3aXRob3V0CiAgICAgLy8gdGhlIHF1ZXJ5IGFuZCB0aGUgZnJhZ21lbnQgcGFydC4K
LSAgICBRVXJsIGJhc2VVcmwgPSBRVXJsOjpmcm9tTG9jYWxGaWxlKFFGaWxlSW5mbyh1cmwudG9M
b2NhbEZpbGUoKSkuYWJzb2x1dGVGaWxlUGF0aCgpKTsKKyAgICBRVXJsIGJhc2VVcmwgPSBRVXJs
Ojpmcm9tTG9jYWxGaWxlKFFGaWxlSW5mbyh2YWxpZGF0ZWRVcmwudG9Mb2NhbEZpbGUoKSkuYWJz
b2x1dGVGaWxlUGF0aCgpKTsKIAogICAgIC8vIFRoZSBwYXRoIGlzIHJlbW92ZWQgc28gdGhlIHF1
ZXJ5IGFuZCB0aGUgZnJhZ21lbnQgcGFydHMgYXJlIHRoZXJlLgotICAgIFFTdHJpbmcgcGF0aFJl
bW92ZWQgPSB1cmwudG9TdHJpbmcoUVVybDo6UmVtb3ZlUGF0aCk7CisgICAgUVN0cmluZyBwYXRo
UmVtb3ZlZCA9IHZhbGlkYXRlZFVybC50b1N0cmluZyhRVXJsOjpSZW1vdmVQYXRoKTsKICAgICBR
VXJsIHRvUmVzb2x2ZShwYXRoUmVtb3ZlZCk7CiAKICAgICByZXR1cm4gYmFzZVVybC5yZXNvbHZl
ZCh0b1Jlc29sdmUpOwogfQorCitRV2ViSGl0VGVzdFJlc3VsdFByaXZhdGUgKlFXZWJGcmFtZUFk
YXB0ZXI6OmhpdFRlc3RDb250ZW50KGNvbnN0IFFQb2ludCAmcG9zKSBjb25zdAoreworICAgIGlm
ICghZnJhbWUtPnZpZXcoKSB8fCAhZnJhbWUtPmNvbnRlbnRSZW5kZXJlcigpKQorICAgICAgICBy
ZXR1cm4gMDsKKworICAgIEhpdFRlc3RSZXN1bHQgcmVzdWx0ID0gZnJhbWUtPmV2ZW50SGFuZGxl
cigpLT5oaXRUZXN0UmVzdWx0QXRQb2ludChmcmFtZS0+dmlldygpLT53aW5kb3dUb0NvbnRlbnRz
KHBvcyksIC8qYWxsb3dTaGFkb3dDb250ZW50Ki8gZmFsc2UsIC8qaWdub3JlQ2xpcHBpbmcqLyB0
cnVlKTsKKworICAgIGlmIChyZXN1bHQuc2Nyb2xsYmFyKCkpCisgICAgICAgIHJldHVybiAwOwor
ICAgIHJldHVybiBuZXcgUVdlYkhpdFRlc3RSZXN1bHRQcml2YXRlKHJlc3VsdCk7Cit9CisKK1FX
ZWJFbGVtZW50IFFXZWJGcmFtZUFkYXB0ZXI6OmRvY3VtZW50RWxlbWVudCgpIGNvbnN0Cit7Cisg
ICAgRG9jdW1lbnQgKmRvYyA9IGZyYW1lLT5kb2N1bWVudCgpOworICAgIGlmICghZG9jKQorICAg
ICAgICByZXR1cm4gUVdlYkVsZW1lbnQoKTsKKyAgICByZXR1cm4gUVdlYkVsZW1lbnQoZG9jLT5k
b2N1bWVudEVsZW1lbnQoKSk7Cit9CisKK1FTdHJpbmcgUVdlYkZyYW1lQWRhcHRlcjo6dGl0bGUo
KSBjb25zdAoreworICAgIGlmIChmcmFtZS0+ZG9jdW1lbnQoKSkKKyAgICAgICAgcmV0dXJuIGZy
YW1lLT5sb2FkZXIoKS0+ZG9jdW1lbnRMb2FkZXIoKS0+dGl0bGUoKS5zdHJpbmcoKTsKKyAgICBy
ZXR1cm4gUVN0cmluZygpOworfQorCit2b2lkIFFXZWJGcmFtZUFkYXB0ZXI6OmNsZWFyQ29yZUZy
YW1lKCkKK3sKKyAgICBEb2N1bWVudExvYWRlciogZG9jdW1lbnRMb2FkZXIgPSBmcmFtZS0+bG9h
ZGVyKCktPmFjdGl2ZURvY3VtZW50TG9hZGVyKCk7CisgICAgUV9BU1NFUlQoZG9jdW1lbnRMb2Fk
ZXIpOworICAgIGRvY3VtZW50TG9hZGVyLT53cml0ZXIoKS0+YmVnaW4oKTsKKyAgICBkb2N1bWVu
dExvYWRlci0+d3JpdGVyKCktPmVuZCgpOworfQorCisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0Nv
cmVGcmFtZUNsZWFyKFdlYkNvcmU6OkZyYW1lKiBmcmFtZSkKK3sKKyAgICByZXR1cm4gZnJhbWUt
PmRvY3VtZW50KCktPnVybCgpLmlzRW1wdHkoKTsKK30KKworUVVybCBRV2ViRnJhbWVBZGFwdGVy
OjpiYXNlVXJsKCkgY29uc3QKK3sKKyAgICBpZiAoaXNDb3JlRnJhbWVDbGVhcihmcmFtZSkpCisg
ICAgICAgIHJldHVybiB1cmwucmVzb2x2ZWQoUVVybCgpKTsKKyAgICByZXR1cm4gZnJhbWUtPmRv
Y3VtZW50KCktPmJhc2VVUkwoKTsKK30KKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElO
RykKK3ZvaWQgUVdlYkZyYW1lQWRhcHRlcjo6cmVuZGVyQ29tcG9zaXRlZExheWVycyhXZWJDb3Jl
OjpHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IFdlYkNvcmU6OkludFJlY3QmIGNsaXAp
Cit7CisgICAgV2ViQ29yZTo6UGFnZSogcGFnZSA9IGZyYW1lLT5wYWdlKCk7CisgICAgaWYgKCFw
YWdlKQorICAgICAgICByZXR1cm47CisgICAgaWYgKFRleHR1cmVNYXBwZXJMYXllckNsaWVudFF0
KiBjbGllbnQgPSBzdGF0aWNfY2FzdDxDaHJvbWVDbGllbnRRdCo+KHBhZ2UtPmNocm9tZSgpLT5j
bGllbnQoKSktPm1fdGV4dHVyZU1hcHBlckxheWVyQ2xpZW50LmdldCgpKQorICAgICAgICBjbGll
bnQtPnJlbmRlckNvbXBvc2l0ZWRMYXllcnMoY29udGV4dCwgY2xpcCk7Cit9CisjZW5kaWYKKy8v
IEZJWE1FOiB0aGlzIG1pZ2h0IG5vdCBiZSBuZWNlc3NhcnksIGJ1dCBmb3IgdGhlIHNha2Ugb2Yg
bm90IGJyZWFraW5nIHRoaW5ncywgd2UnbGwgdXNlIHRoYXQgZm9yIG5vdy4KK1FVcmwgUVdlYkZy
YW1lQWRhcHRlcjo6Y29yZUZyYW1lVXJsKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZnJhbWUtPmRv
Y3VtZW50KCktPnVybCgpOworfQorCitRVXJsIFFXZWJGcmFtZUFkYXB0ZXI6Omxhc3RSZXF1ZXN0
ZWRVcmwoKSBjb25zdAoreworICAgIHJldHVybiBmcmFtZUxvYWRlckNsaWVudC0+bGFzdFJlcXVl
c3RlZFVybCgpOworfQorCitRV2ViU2VjdXJpdHlPcmlnaW4gUVdlYkZyYW1lQWRhcHRlcjo6c2Vj
dXJpdHlPcmlnaW4oKSBjb25zdAoreworICAgIFFXZWJTZWN1cml0eU9yaWdpblByaXZhdGUqIHBy
aXYgPSBuZXcgUVdlYlNlY3VyaXR5T3JpZ2luUHJpdmF0ZShmcmFtZS0+ZG9jdW1lbnQoKS0+c2Vj
dXJpdHlPcmlnaW4oKSk7CisgICAgcmV0dXJuIFFXZWJTZWN1cml0eU9yaWdpbihwcml2KTsKK30K
KworUVN0cmluZyBRV2ViRnJhbWVBZGFwdGVyOjp1bmlxdWVOYW1lKCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gZnJhbWUtPnRyZWUoKS0+dW5pcXVlTmFtZSgpOworfQorCisvLyBUaGlzIGNvZGUgaXMg
Y29waWVkIGZyb20gQ2hyb21lQ2xpZW50R3RrLmNwcC4KK3N0YXRpYyB2b2lkIGNvYWxlc2NlUmVj
dHNJZlBvc3NpYmxlKGNvbnN0IFFSZWN0JiBjbGlwUmVjdCwgUVZlY3RvcjxRUmVjdD4mIHJlY3Rz
KQoreworICAgIGNvbnN0IHVuc2lnbmVkIGludCByZWN0VGhyZXNob2xkID0gMTA7CisgICAgY29u
c3QgZmxvYXQgd2FzdGVkU3BhY2VUaHJlc2hvbGQgPSAwLjc1ZjsKKyAgICBib29sIHVzZVVuaW9u
ZWRSZWN0ID0gKHJlY3RzLnNpemUoKSA8PSAxKSB8fCAocmVjdHMuc2l6ZSgpID4gcmVjdFRocmVz
aG9sZCk7CisgICAgaWYgKCF1c2VVbmlvbmVkUmVjdCkgeworICAgICAgICAvLyBBdHRlbXB0IHRv
IGd1ZXNzIHdoZXRoZXIgb3Igbm90IHdlIHNob3VsZCB1c2UgdGhlIHVuaW9uZWQgcmVjdCBvciB0
aGUgaW5kaXZpZHVhbCByZWN0cy4KKyAgICAgICAgLy8gV2UgZG8gdGhpcyBieSBjb21wdXRpbmcg
dGhlIHBlcmNlbnRhZ2Ugb2YgIndhc3RlZCBzcGFjZSIgaW4gdGhlIHVuaW9uLiBJZiB0aGF0IHdh
c3RlZCBzcGFjZQorICAgICAgICAvLyBpcyB0b28gbGFyZ2UsIHRoZW4gd2Ugd2lsbCBkbyBpbmRp
dmlkdWFsIHJlY3QgcGFpbnRpbmcgaW5zdGVhZC4KKyAgICAgICAgZmxvYXQgdW5pb25QaXhlbHMg
PSAoY2xpcFJlY3Qud2lkdGgoKSAqIGNsaXBSZWN0LmhlaWdodCgpKTsKKyAgICAgICAgZmxvYXQg
c2luZ2xlUGl4ZWxzID0gMDsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZWN0cy5z
aXplKCk7ICsraSkKKyAgICAgICAgICAgIHNpbmdsZVBpeGVscyArPSByZWN0c1tpXS53aWR0aCgp
ICogcmVjdHNbaV0uaGVpZ2h0KCk7CisgICAgICAgIGZsb2F0IHdhc3RlZFNwYWNlID0gMSAtIChz
aW5nbGVQaXhlbHMgLyB1bmlvblBpeGVscyk7CisgICAgICAgIGlmICh3YXN0ZWRTcGFjZSA8PSB3
YXN0ZWRTcGFjZVRocmVzaG9sZCkKKyAgICAgICAgICAgIHVzZVVuaW9uZWRSZWN0ID0gdHJ1ZTsK
KyAgICB9CisKKyAgICBpZiAoIXVzZVVuaW9uZWRSZWN0KQorICAgICAgICByZXR1cm47CisKKyAg
ICByZWN0cy5jbGVhcigpOworICAgIHJlY3RzLmFwcGVuZChjbGlwUmVjdCk7Cit9CisKK3ZvaWQg
UVdlYkZyYW1lQWRhcHRlcjo6cmVuZGVyUmVsYXRpdmVDb29yZHMoUVBhaW50ZXIqIHBhaW50ZXIs
IGludCBsYXllcnMsIGNvbnN0IFFSZWdpb24mIGNsaXApCit7CisgICAgR3JhcGhpY3NDb250ZXh0
IGNvbnRleHQocGFpbnRlcik7CisgICAgaWYgKGNvbnRleHQucGFpbnRpbmdEaXNhYmxlZCgpICYm
ICFjb250ZXh0LnVwZGF0aW5nQ29udHJvbFRpbnRzKCkpCisgICAgICAgIHJldHVybjsKKworICAg
IGlmICghZnJhbWUtPnZpZXcoKSB8fCAhZnJhbWUtPmNvbnRlbnRSZW5kZXJlcigpKQorICAgICAg
ICByZXR1cm47CisKKyAgICBRVmVjdG9yPFFSZWN0PiB2ZWN0b3IgPSBjbGlwLnJlY3RzKCk7Cisg
ICAgaWYgKHZlY3Rvci5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIFdlYkNvcmU6
OkZyYW1lVmlldyogdmlldyA9IGZyYW1lLT52aWV3KCk7CisgICAgdmlldy0+dXBkYXRlTGF5b3V0
QW5kU3R5bGVJZk5lZWRlZFJlY3Vyc2l2ZSgpOworCisgICAgaWYgKGxheWVycyAmIENvbnRlbnRz
TGF5ZXIpIHsKKyAgICAgICAgUVJlY3QgY2xpcEJvdW5kaW5nUmVjdCA9IGNsaXAuYm91bmRpbmdS
ZWN0KCk7CisgICAgICAgIGNvYWxlc2NlUmVjdHNJZlBvc3NpYmxlKGNsaXBCb3VuZGluZ1JlY3Qs
IHZlY3Rvcik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmVjdG9yLnNpemUoKTsgKytp
KSB7CisgICAgICAgICAgICBjb25zdCBRUmVjdCYgY2xpcFJlY3QgPSB2ZWN0b3IuYXQoaSk7CisK
KyAgICAgICAgICAgIFFSZWN0IHJlY3QgPSBjbGlwUmVjdC5pbnRlcnNlY3RlZCh2aWV3LT5mcmFt
ZVJlY3QoKSk7CisKKyAgICAgICAgICAgIGNvbnRleHQuc2F2ZSgpOworICAgICAgICAgICAgcGFp
bnRlci0+c2V0Q2xpcFJlY3QoY2xpcFJlY3QsIFF0OjpJbnRlcnNlY3RDbGlwKTsKKworICAgICAg
ICAgICAgaW50IHggPSB2aWV3LT54KCk7CisgICAgICAgICAgICBpbnQgeSA9IHZpZXctPnkoKTsK
KworICAgICAgICAgICAgaW50IHNjcm9sbFggPSB2aWV3LT5zY3JvbGxYKCk7CisgICAgICAgICAg
ICBpbnQgc2Nyb2xsWSA9IHZpZXctPnNjcm9sbFkoKTsKKworICAgICAgICAgICAgY29udGV4dC50
cmFuc2xhdGUoeCwgeSk7CisgICAgICAgICAgICByZWN0LnRyYW5zbGF0ZSgteCwgLXkpOworICAg
ICAgICAgICAgY29udGV4dC50cmFuc2xhdGUoLXNjcm9sbFgsIC1zY3JvbGxZKTsKKyAgICAgICAg
ICAgIHJlY3QudHJhbnNsYXRlKHNjcm9sbFgsIHNjcm9sbFkpOworICAgICAgICAgICAgY29udGV4
dC5jbGlwKHZpZXctPnZpc2libGVDb250ZW50UmVjdCgpKTsKKworICAgICAgICAgICAgdmlldy0+
cGFpbnRDb250ZW50cygmY29udGV4dCwgcmVjdCk7CisKKyAgICAgICAgICAgIGNvbnRleHQucmVz
dG9yZSgpOworICAgICAgICB9CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAg
ICAgICByZW5kZXJDb21wb3NpdGVkTGF5ZXJzKCZjb250ZXh0LCBJbnRSZWN0KGNsaXBCb3VuZGlu
Z1JlY3QpKTsKKyNlbmRpZgorICAgIH0KKyAgICByZW5kZXJGcmFtZUV4dHJhcygmY29udGV4dCwg
bGF5ZXJzLCBjbGlwKTsKKyNpZiBFTkFCTEUoSU5TUEVDVE9SKQorICAgIGlmIChmcmFtZS0+cGFn
ZSgpLT5pbnNwZWN0b3JDb250cm9sbGVyKCktPmhpZ2hsaWdodGVkTm9kZSgpKSB7CisgICAgICAg
IGNvbnRleHQuc2F2ZSgpOworICAgICAgICBmcmFtZS0+cGFnZSgpLT5pbnNwZWN0b3JDb250cm9s
bGVyKCktPmRyYXdIaWdobGlnaHQoY29udGV4dCk7CisgICAgICAgIGNvbnRleHQucmVzdG9yZSgp
OworICAgIH0KKyNlbmRpZgorfQorCit2b2lkIFFXZWJGcmFtZUFkYXB0ZXI6OnJlbmRlckZyYW1l
RXh0cmFzKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgaW50IGxheWVycywgY29u
c3QgUVJlZ2lvbiYgY2xpcCkKK3sKKyAgICBpZiAoIShsYXllcnMgJiAoUGFuSWNvbkxheWVyIHwg
U2Nyb2xsQmFyTGF5ZXIpKSkKKyAgICAgICAgcmV0dXJuOworICAgIFFQYWludGVyKiBwYWludGVy
ID0gY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCk7CisgICAgV2ViQ29yZTo6RnJhbWVWaWV3KiB2
aWV3ID0gZnJhbWUtPnZpZXcoKTsKKyAgICBRVmVjdG9yPFFSZWN0PiB2ZWN0b3IgPSBjbGlwLnJl
Y3RzKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2ZWN0b3Iuc2l6ZSgpOyArK2kpIHsKKyAg
ICAgICAgY29uc3QgUVJlY3QmIGNsaXBSZWN0ID0gdmVjdG9yLmF0KGkpOworCisgICAgICAgIFFS
ZWN0IGludGVyc2VjdGVkUmVjdCA9IGNsaXBSZWN0LmludGVyc2VjdGVkKHZpZXctPmZyYW1lUmVj
dCgpKTsKKworICAgICAgICBwYWludGVyLT5zYXZlKCk7CisgICAgICAgIHBhaW50ZXItPnNldENs
aXBSZWN0KGNsaXBSZWN0LCBRdDo6SW50ZXJzZWN0Q2xpcCk7CisKKyAgICAgICAgaW50IHggPSB2
aWV3LT54KCk7CisgICAgICAgIGludCB5ID0gdmlldy0+eSgpOworCisgICAgICAgIGlmIChsYXll
cnMgJiBTY3JvbGxCYXJMYXllcgorICAgICAgICAgICAgJiYgIXZpZXctPnNjcm9sbGJhcnNTdXBw
cmVzc2VkKCkKKyAgICAgICAgICAgICYmICh2aWV3LT5ob3Jpem9udGFsU2Nyb2xsYmFyKCkgfHwg
dmlldy0+dmVydGljYWxTY3JvbGxiYXIoKSkpIHsKKworICAgICAgICAgICAgUVJlY3QgcmVjdCA9
IGludGVyc2VjdGVkUmVjdDsKKyAgICAgICAgICAgIGNvbnRleHQtPnRyYW5zbGF0ZSh4LCB5KTsK
KyAgICAgICAgICAgIHJlY3QudHJhbnNsYXRlKC14LCAteSk7CisgICAgICAgICAgICB2aWV3LT5w
YWludFNjcm9sbGJhcnMoY29udGV4dCwgcmVjdCk7CisgICAgICAgICAgICBjb250ZXh0LT50cmFu
c2xhdGUoLXgsIC15KTsKKyAgICAgICAgfQorCisjaWYgRU5BQkxFKFBBTl9TQ1JPTExJTkcpCisg
ICAgICAgIGlmIChsYXllcnMgJiBQYW5JY29uTGF5ZXIpCisgICAgICAgICAgICB2aWV3LT5wYWlu
dFBhblNjcm9sbEljb24oY29udGV4dCk7CisjZW5kaWYKKworICAgICAgICBwYWludGVyLT5yZXN0
b3JlKCk7CisgICAgfQorfQorCisjaWYgVVNFKFRJTEVEX0JBQ0tJTkdfU1RPUkUpCit2b2lkIFFX
ZWJGcmFtZUFkYXB0ZXI6OnNldFRpbGVkQmFja2luZ1N0b3JlRnJvemVuKGJvb2wgZnJvemVuKQor
eworICAgIFdlYkNvcmU6OlRpbGVkQmFja2luZ1N0b3JlKiBiYWNraW5nU3RvcmUgPSBmcmFtZS0+
dGlsZWRCYWNraW5nU3RvcmUoKTsKKyAgICBpZiAoIWJhY2tpbmdTdG9yZSkKKyAgICAgICAgcmV0
dXJuOworICAgIGJhY2tpbmdTdG9yZS0+c2V0Q29udGVudHNGcm96ZW4oZnJvemVuKTsKK30KKwor
Ym9vbCBRV2ViRnJhbWVBZGFwdGVyOjp0aWxlZEJhY2tpbmdTdG9yZUZyb3plbigpIGNvbnN0Cit7
CisgICAgV2ViQ29yZTo6VGlsZWRCYWNraW5nU3RvcmUqIGJhY2tpbmdTdG9yZSA9IGZyYW1lLT50
aWxlZEJhY2tpbmdTdG9yZSgpOworICAgIGlmICghYmFja2luZ1N0b3JlKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgcmV0dXJuIGJhY2tpbmdTdG9yZS0+Y29udGVudHNGcm96ZW4oKTsKK30K
Kwordm9pZCBRV2ViRnJhbWVBZGFwdGVyOjpzZXRUaWxlZEJhY2tpbmdTdG9yZUNvbnRlbnRzU2Nh
bGUoZmxvYXQgc2NhbGUpCit7CisgICAgV2ViQ29yZTo6VGlsZWRCYWNraW5nU3RvcmUqIGJhY2tp
bmdTdG9yZSA9IGZyYW1lLT50aWxlZEJhY2tpbmdTdG9yZSgpOworICAgIGlmICghYmFja2luZ1N0
b3JlKQorICAgICAgICByZXR1cm47CisgICAgYmFja2luZ1N0b3JlLT5zZXRDb250ZW50c1NjYWxl
KHNjYWxlKTsKK30KKworYm9vbCBRV2ViRnJhbWVBZGFwdGVyOjpyZW5kZXJGcm9tVGlsZWRCYWNr
aW5nU3RvcmUoUVBhaW50ZXIqIHBhaW50ZXIsIGNvbnN0IFFSZWdpb24mIGNsaXApCit7CisgICAg
Ly8gTm8gdGlsZWQgYmFja2luZyBzdG9yZT8gVGVsbCB0aGUgY2FsbGVyIHRvIGZhbGwgYmFjayB0
byByZWd1bGFyIHJlbmRlcmluZy4KKyAgICBpZiAoIWZyYW1lLT50aWxlZEJhY2tpbmdTdG9yZSgp
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIHNldCB0
aGUgYmFja2luZyBzdG9yZSB2aWV3cG9ydCBlYXJsaWVyIHRoYW4gaW4gcGFpbnQKKyAgICBmcmFt
ZS0+dGlsZWRCYWNraW5nU3RvcmUoKS0+Y292ZXJXaXRoVGlsZXNJZk5lZWRlZCgpOworCisgICAg
aWYgKCFmcmFtZS0+dmlldygpIHx8ICFmcmFtZS0+Y29udGVudFJlbmRlcmVyKCkpCisgICAgICAg
IHJldHVybiB0cnVlOworCisgICAgUVZlY3RvcjxRUmVjdD4gdmVjdG9yID0gY2xpcC5yZWN0cygp
OworICAgIGlmICh2ZWN0b3IuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAg
IEdyYXBoaWNzQ29udGV4dCBjb250ZXh0KHBhaW50ZXIpOworCisgICAgV2ViQ29yZTo6RnJhbWVW
aWV3KiB2aWV3ID0gZnJhbWUtPnZpZXcoKTsKKworICAgIGludCBzY3JvbGxYID0gdmlldy0+c2Ny
b2xsWCgpOworICAgIGludCBzY3JvbGxZID0gdmlldy0+c2Nyb2xsWSgpOworICAgIGNvbnRleHQu
dHJhbnNsYXRlKC1zY3JvbGxYLCAtc2Nyb2xsWSk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8
IHZlY3Rvci5zaXplKCk7ICsraSkgeworICAgICAgICBjb25zdCBRUmVjdCYgY2xpcFJlY3QgPSB2
ZWN0b3IuYXQoaSk7CisKKyAgICAgICAgcGFpbnRlci0+c2F2ZSgpOworCisgICAgICAgIFFSZWN0
IHJlY3QgPSBjbGlwUmVjdC50cmFuc2xhdGVkKHNjcm9sbFgsIHNjcm9sbFkpOworICAgICAgICBw
YWludGVyLT5zZXRDbGlwUmVjdChyZWN0LCBRdDo6SW50ZXJzZWN0Q2xpcCk7CisKKyAgICAgICAg
ZnJhbWUtPnRpbGVkQmFja2luZ1N0b3JlKCktPnBhaW50KCZjb250ZXh0LCByZWN0KTsKKworICAg
ICAgICBwYWludGVyLT5yZXN0b3JlKCk7CisgICAgfQorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NP
TVBPU0lUSU5HKQorICAgIHJlbmRlckNvbXBvc2l0ZWRMYXllcnMoJmNvbnRleHQsIEludFJlY3Qo
Y2xpcC5ib3VuZGluZ1JlY3QoKSkpOworICAgIHJlbmRlckZyYW1lRXh0cmFzKCZjb250ZXh0LCBR
V2ViRnJhbWVBZGFwdGVyOjpTY3JvbGxCYXJMYXllciB8IFFXZWJGcmFtZUFkYXB0ZXI6OlBhbklj
b25MYXllciwgY2xpcCk7CisjZW5kaWYKKyAgICByZXR1cm4gdHJ1ZTsKK30KKyNlbmRpZgorCit2
b2lkIFFXZWJGcmFtZUFkYXB0ZXI6Ol9xX29yaWVudGF0aW9uQ2hhbmdlZCgpCit7CisjaWYgRU5B
QkxFKE9SSUVOVEFUSU9OX0VWRU5UUykKKyAgICBpbnQgb3JpZW50YXRpb247CisKKyAgICBzd2l0
Y2ggKG1fb3JpZW50YXRpb24ucmVhZGluZygpLT5vcmllbnRhdGlvbigpKSB7CisgICAgY2FzZSBR
T3JpZW50YXRpb25SZWFkaW5nOjpUb3BVcDoKKyAgICAgICAgb3JpZW50YXRpb24gPSAwOworICAg
ICAgICBicmVhazsKKyAgICBjYXNlIFFPcmllbnRhdGlvblJlYWRpbmc6OlRvcERvd246CisgICAg
ICAgIG9yaWVudGF0aW9uID0gMTgwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFFPcmllbnRh
dGlvblJlYWRpbmc6OkxlZnRVcDoKKyAgICAgICAgb3JpZW50YXRpb24gPSAtOTA7CisgICAgICAg
IGJyZWFrOworICAgIGNhc2UgUU9yaWVudGF0aW9uUmVhZGluZzo6UmlnaHRVcDoKKyAgICAgICAg
b3JpZW50YXRpb24gPSA5MDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRT3JpZW50YXRpb25S
ZWFkaW5nOjpGYWNlVXA6CisgICAgY2FzZSBRT3JpZW50YXRpb25SZWFkaW5nOjpGYWNlRG93bjoK
KyAgICAgICAgLy8gV2ViQ29yZSB1bmFibGUgdG8gaGFuZGxlIGl0CisgICAgZGVmYXVsdDoKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmcmFtZS0+c2VuZE9yaWVudGF0aW9uQ2hhbmdlRXZl
bnQob3JpZW50YXRpb24pOworI2VuZGlmCit9CisKK1FMaXN0PFFPYmplY3QqPiBRV2ViRnJhbWVB
ZGFwdGVyOjpjaGlsZEZyYW1lcygpIGNvbnN0Cit7CisgICAgUUxpc3Q8UU9iamVjdCo+IG9yaWdp
bmF0aW5nT2JqZWN0czsKKyAgICBpZiAoZnJhbWUpIHsKKyAgICAgICAgRnJhbWVUcmVlICp0cmVl
ID0gZnJhbWUtPnRyZWUoKTsKKyAgICAgICAgZm9yIChGcmFtZSAqY2hpbGQgPSB0cmVlLT5maXJz
dENoaWxkKCk7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT50cmVlKCktPm5leHRTaWJsaW5nKCkpIHsK
KyAgICAgICAgICAgIEZyYW1lTG9hZGVyICpsb2FkZXIgPSBjaGlsZC0+bG9hZGVyKCk7CisgICAg
ICAgICAgICBvcmlnaW5hdGluZ09iamVjdHMuYXBwZW5kKGxvYWRlci0+bmV0d29ya2luZ0NvbnRl
eHQoKS0+b3JpZ2luYXRpbmdPYmplY3QoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJu
IG9yaWdpbmF0aW5nT2JqZWN0czsKK30KKworYm9vbCBRV2ViRnJhbWVBZGFwdGVyOjpoYXNGb2N1
cygpIGNvbnN0Cit7CisgICAgRnJhbWUqIGZmID0gZnJhbWUtPnBhZ2UoKS0+Zm9jdXNDb250cm9s
bGVyKCktPmZvY3VzZWRGcmFtZSgpOworICAgIHJldHVybiBmZiAmJiBRV2ViRnJhbWVBZGFwdGVy
OjpraXQoZmYpID09IHRoaXM7Cit9CisKK3ZvaWQgUVdlYkZyYW1lQWRhcHRlcjo6c2V0Rm9jdXMo
KQoreworICAgIGZyYW1lLT5wYWdlKCktPmZvY3VzQ29udHJvbGxlcigpLT5zZXRGb2N1c2VkRnJh
bWUoZnJhbWUpOworfQorCit2b2lkIFFXZWJGcmFtZUFkYXB0ZXI6OnNldFNjcm9sbEJhclBvbGlj
eShRdDo6T3JpZW50YXRpb24gb3JpZW50YXRpb24sIFF0OjpTY3JvbGxCYXJQb2xpY3kgcG9saWN5
KQoreworICAgIFFfQVNTRVJUKChpbnQpU2Nyb2xsYmFyQXV0byA9PSAoaW50KVF0OjpTY3JvbGxC
YXJBc05lZWRlZCk7CisgICAgUV9BU1NFUlQoKGludClTY3JvbGxiYXJBbHdheXNPZmYgPT0gKGlu
dClRdDo6U2Nyb2xsQmFyQWx3YXlzT2ZmKTsKKyAgICBRX0FTU0VSVCgoaW50KVNjcm9sbGJhckFs
d2F5c09uID09IChpbnQpUXQ6OlNjcm9sbEJhckFsd2F5c09uKTsKKworICAgIGlmIChvcmllbnRh
dGlvbiA9PSBRdDo6SG9yaXpvbnRhbCkgeworICAgICAgICBob3Jpem9udGFsU2Nyb2xsQmFyUG9s
aWN5ID0gcG9saWN5OworICAgICAgICBpZiAoZnJhbWUtPnZpZXcoKSkgeworICAgICAgICAgICAg
ZnJhbWUtPnZpZXcoKS0+c2V0SG9yaXpvbnRhbFNjcm9sbGJhck1vZGUoKFNjcm9sbGJhck1vZGUp
cG9saWN5LCBwb2xpY3kgIT0gUXQ6OlNjcm9sbEJhckFzTmVlZGVkIC8qIGxvY2sgKi8pOworICAg
ICAgICAgICAgZnJhbWUtPnZpZXcoKS0+dXBkYXRlQ2FuSGF2ZVNjcm9sbGJhcnMoKTsKKyAgICAg
ICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHZlcnRpY2FsU2Nyb2xsQmFyUG9saWN5ID0gcG9s
aWN5OworICAgICAgICBpZiAoZnJhbWUtPnZpZXcoKSkgeworICAgICAgICAgICAgZnJhbWUtPnZp
ZXcoKS0+c2V0VmVydGljYWxTY3JvbGxiYXJNb2RlKChTY3JvbGxiYXJNb2RlKXBvbGljeSwgcG9s
aWN5ICE9IFF0OjpTY3JvbGxCYXJBc05lZWRlZCAvKiBsb2NrICovKTsKKyAgICAgICAgICAgIGZy
YW1lLT52aWV3KCktPnVwZGF0ZUNhbkhhdmVTY3JvbGxiYXJzKCk7CisgICAgICAgIH0KKyAgICB9
Cit9CisKK3ZvaWQgUVdlYkZyYW1lQWRhcHRlcjo6c2Nyb2xsVG9BbmNob3IoY29uc3QgUVN0cmlu
ZyAmYW5jaG9yKQoreworICAgIEZyYW1lVmlldyAqdmlldyA9IGZyYW1lLT52aWV3KCk7CisgICAg
aWYgKHZpZXcpCisgICAgICAgIHZpZXctPnNjcm9sbFRvQW5jaG9yKGFuY2hvcik7Cit9CisKK3Zv
aWQgUVdlYkZyYW1lQWRhcHRlcjo6c2Nyb2xsQnkoaW50IGR4LCBpbnQgZHkpCit7CisgICAgaWYg
KCFmcmFtZS0+dmlldygpKQorICAgICAgICByZXR1cm47CisgICAgZnJhbWUtPnZpZXcoKS0+c2Ny
b2xsQnkoSW50U2l6ZShkeCwgZHkpKTsKK30KKwordm9pZCBRV2ViRnJhbWVBZGFwdGVyOjpzZXRT
Y3JvbGxCYXJWYWx1ZShRdDo6T3JpZW50YXRpb24gb3JpZW50YXRpb24sIGludCB2YWx1ZSkKK3sK
KyAgICBTY3JvbGxiYXIgKnNiOworICAgIHNiID0gKG9yaWVudGF0aW9uID09IFF0OjpIb3Jpem9u
dGFsKSA/IGhvcml6b250YWxTY3JvbGxCYXIoKSA6IHZlcnRpY2FsU2Nyb2xsQmFyKCk7CisgICAg
aWYgKHNiKSB7CisgICAgICAgIGlmICh2YWx1ZSA8IDApCisgICAgICAgICAgICB2YWx1ZSA9IDA7
CisgICAgICAgIGVsc2UgaWYgKHZhbHVlID4gc2Nyb2xsQmFyTWF4aW11bShvcmllbnRhdGlvbikp
CisgICAgICAgICAgICB2YWx1ZSA9IHNjcm9sbEJhck1heGltdW0ob3JpZW50YXRpb24pOworICAg
ICAgICBzYi0+c2Nyb2xsYWJsZUFyZWEoKS0+c2Nyb2xsVG9PZmZzZXRXaXRob3V0QW5pbWF0aW9u
KG9yaWVudGF0aW9uID09IFF0OjpIb3Jpem9udGFsID8gSG9yaXpvbnRhbFNjcm9sbGJhciA6IFZl
cnRpY2FsU2Nyb2xsYmFyLCB2YWx1ZSk7CisgICAgfQorfQorCitpbnQgUVdlYkZyYW1lQWRhcHRl
cjo6c2Nyb2xsQmFyVmFsdWUoUXQ6Ok9yaWVudGF0aW9uIG9yaWVudGF0aW9uKSBjb25zdAorewor
ICAgIFNjcm9sbGJhciAqc2I7CisgICAgc2IgPSAob3JpZW50YXRpb24gPT0gUXQ6Okhvcml6b250
YWwpID8gaG9yaXpvbnRhbFNjcm9sbEJhcigpIDogdmVydGljYWxTY3JvbGxCYXIoKTsKKyAgICBp
ZiAoc2IpCisgICAgICAgIHJldHVybiBzYi0+dmFsdWUoKTsKKyAgICByZXR1cm4gMDsKK30KKwor
aW50IFFXZWJGcmFtZUFkYXB0ZXI6OnNjcm9sbEJhck1heGltdW0oUXQ6Ok9yaWVudGF0aW9uIG9y
aWVudGF0aW9uKSBjb25zdAoreworICAgIFNjcm9sbGJhciAqc2I7CisgICAgc2IgPSAob3JpZW50
YXRpb24gPT0gUXQ6Okhvcml6b250YWwpID8gaG9yaXpvbnRhbFNjcm9sbEJhcigpIDogdmVydGlj
YWxTY3JvbGxCYXIoKTsKKyAgICBpZiAoc2IpCisgICAgICAgIHJldHVybiBzYi0+bWF4aW11bSgp
OworICAgIHJldHVybiAwOworfQorCitRUmVjdCBRV2ViRnJhbWVBZGFwdGVyOjpzY3JvbGxCYXJH
ZW9tZXRyeShRdDo6T3JpZW50YXRpb24gb3JpZW50YXRpb24pIGNvbnN0Cit7CisgICAgU2Nyb2xs
YmFyICpzYjsKKyAgICBzYiA9IChvcmllbnRhdGlvbiA9PSBRdDo6SG9yaXpvbnRhbCkgPyBob3Jp
em9udGFsU2Nyb2xsQmFyKCkgOiB2ZXJ0aWNhbFNjcm9sbEJhcigpOworICAgIGlmIChzYikKKyAg
ICAgICAgcmV0dXJuIHNiLT5mcmFtZVJlY3QoKTsKKyAgICByZXR1cm4gUVJlY3QoKTsKK30KKwor
V2ViQ29yZTo6U2Nyb2xsYmFyKiBRV2ViRnJhbWVBZGFwdGVyOjpob3Jpem9udGFsU2Nyb2xsQmFy
KCkgY29uc3QKK3sKKyAgICBpZiAoIWZyYW1lLT52aWV3KCkpCisgICAgICAgIHJldHVybiAwOwor
ICAgIHJldHVybiBmcmFtZS0+dmlldygpLT5ob3Jpem9udGFsU2Nyb2xsYmFyKCk7Cit9CisKK1dl
YkNvcmU6OlNjcm9sbGJhciogUVdlYkZyYW1lQWRhcHRlcjo6dmVydGljYWxTY3JvbGxCYXIoKSBj
b25zdAoreworICAgIGlmICghZnJhbWUtPnZpZXcoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAg
cmV0dXJuIGZyYW1lLT52aWV3KCktPnZlcnRpY2FsU2Nyb2xsYmFyKCk7Cit9CisKKwordm9pZCBR
V2ViRnJhbWVBZGFwdGVyOjp1cGRhdGVCYWNrZ3JvdW5kUmVjdXJzaXZlbHkoY29uc3QgUUNvbG9y
JiBiYWNrZ3JvdW5kQ29sb3IpCit7CisgICAgQVNTRVJUKGZyYW1lLT52aWV3KCkpOworICAgIGZy
YW1lLT52aWV3KCktPnVwZGF0ZUJhY2tncm91bmRSZWN1cnNpdmVseShiYWNrZ3JvdW5kQ29sb3Is
IC8qdHJhbnNwYXJlbnQqLyFiYWNrZ3JvdW5kQ29sb3IuYWxwaGEoKSk7Cit9CisKK3ZvaWQgUVdl
YkZyYW1lQWRhcHRlcjo6Y2FuY2VsTG9hZCgpCit7CisgICAgZnJhbWUtPm5hdmlnYXRpb25TY2hl
ZHVsZXIoKS0+Y2FuY2VsKCk7Cit9CisKKy8vID09PT09PT09PT0gUVdlYkhpdFRlc3RSZXN1bHRQ
cml2YXRlIGltcGxlbWVudGF0aW9uID09PT09PT09PT09CisKK1FXZWJIaXRUZXN0UmVzdWx0UHJp
dmF0ZTo6UVdlYkhpdFRlc3RSZXN1bHRQcml2YXRlKGNvbnN0IFdlYkNvcmU6OkhpdFRlc3RSZXN1
bHQgJmhpdFRlc3QpCisgICAgOiBpc0NvbnRlbnRFZGl0YWJsZShmYWxzZSkKKyAgICAsIGlzQ29u
dGVudFNlbGVjdGVkKGZhbHNlKQorICAgICwgaXNTY3JvbGxCYXIoZmFsc2UpCisgICAgLCB3ZWJD
b3JlRnJhbWUoMCkKK3sKKyAgICBpZiAoIWhpdFRlc3QuaW5uZXJOb2RlKCkpCisgICAgICAgIHJl
dHVybjsKKyAgICBwb3MgPSBoaXRUZXN0LnJvdW5kZWRQb2ludEluSW5uZXJOb2RlRnJhbWUoKTsK
KyAgICBXZWJDb3JlOjpUZXh0RGlyZWN0aW9uIGRpcjsKKyAgICB0aXRsZSA9IGhpdFRlc3QudGl0
bGUoZGlyKTsKKyAgICBsaW5rVGV4dCA9IGhpdFRlc3QudGV4dENvbnRlbnQoKTsKKyAgICBsaW5r
VXJsID0gaGl0VGVzdC5hYnNvbHV0ZUxpbmtVUkwoKTsKKyAgICBsaW5rVGl0bGUgPSBoaXRUZXN0
LnRpdGxlRGlzcGxheVN0cmluZygpOworICAgIGFsdGVybmF0ZVRleHQgPSBoaXRUZXN0LmFsdERp
c3BsYXlTdHJpbmcoKTsKKyAgICBpbWFnZVVybCA9IGhpdFRlc3QuYWJzb2x1dGVJbWFnZVVSTCgp
OworICAgIGlubmVyTm9kZSA9IGhpdFRlc3QuaW5uZXJOb2RlKCk7CisgICAgaW5uZXJOb2RlLT5y
ZWYoKTsKKyAgICBpbm5lck5vblNoYXJlZE5vZGUgPSBoaXRUZXN0LmlubmVyTm9uU2hhcmVkTm9k
ZSgpOworICAgIGlubmVyTm9uU2hhcmVkTm9kZS0+cmVmKCk7CisgICAgYm91bmRpbmdSZWN0ID0g
aW5uZXJOb25TaGFyZWROb2RlID8gaW5uZXJOb25TaGFyZWROb2RlLT5yZW5kZXJlcigpLT5hYnNv
bHV0ZUJvdW5kaW5nQm94UmVjdCgpIDogSW50UmVjdCgpOworICAgIFdlYkNvcmU6OkltYWdlICpp
bWcgPSBoaXRUZXN0LmltYWdlKCk7CisgICAgaWYgKGltZykgeworICAgICAgICBRUGl4bWFwICpw
aXggPSBpbWctPm5hdGl2ZUltYWdlRm9yQ3VycmVudEZyYW1lKCk7CisgICAgICAgIGlmIChwaXgp
CisgICAgICAgICAgICBwaXhtYXAgPSAqcGl4OworICAgIH0KKyAgICBXZWJDb3JlOjpGcmFtZSAq
d2ZyYW1lID0gaGl0VGVzdC50YXJnZXRGcmFtZSgpOworICAgIGlmICh3ZnJhbWUpIHsKKyAgICAg
ICAgbGlua1RhcmdldEZyYW1lID0gUVdlYkZyYW1lQWRhcHRlcjo6a2l0KHdmcmFtZSktPmhhbmRs
ZSgpOworICAgICAgICB3ZWJDb3JlRnJhbWUgPSB3ZnJhbWU7CisgICAgICAgIHdlYkNvcmVGcmFt
ZS0+cmVmKCk7CisgICAgfQorICAgIGxpbmtFbGVtZW50ID0gUVdlYkVsZW1lbnQoaGl0VGVzdC5V
UkxFbGVtZW50KCkpOworCisgICAgaXNDb250ZW50RWRpdGFibGUgPSBoaXRUZXN0LmlzQ29udGVu
dEVkaXRhYmxlKCk7CisgICAgaXNDb250ZW50U2VsZWN0ZWQgPSBoaXRUZXN0LmlzU2VsZWN0ZWQo
KTsKKyAgICBpc1Njcm9sbEJhciA9IGhpdFRlc3Quc2Nyb2xsYmFyKCk7CisKKyAgICBXZWJDb3Jl
OjpGcmFtZSAqaW5uZXJOb2RlRnJhbWUgPSBoaXRUZXN0LmlubmVyTm9kZUZyYW1lKCk7CisgICAg
aWYgKGlubmVyTm9kZUZyYW1lKQorICAgICAgICBmcmFtZSA9IFFXZWJGcmFtZUFkYXB0ZXI6Omtp
dChpbm5lck5vZGVGcmFtZSktPmhhbmRsZSgpOworCisgICAgZW5jbG9zaW5nQmxvY2sgPSBRV2Vi
RWxlbWVudChXZWJDb3JlOjplbmNsb3NpbmdCbG9jayhpbm5lck5vZGUpKTsKK30KKworUVdlYkhp
dFRlc3RSZXN1bHRQcml2YXRlOjpRV2ViSGl0VGVzdFJlc3VsdFByaXZhdGUoY29uc3QgUVdlYkhp
dFRlc3RSZXN1bHRQcml2YXRlJiBvdGhlcikKK3sKKyAgICBpbm5lck5vZGUgPSAwOworICAgIGlu
bmVyTm9uU2hhcmVkTm9kZSA9IDA7CisgICAgd2ViQ29yZUZyYW1lID0gMDsKKyAgICAqdGhpcyA9
IG90aGVyOworfQorCitRV2ViSGl0VGVzdFJlc3VsdFByaXZhdGUmIFFXZWJIaXRUZXN0UmVzdWx0
UHJpdmF0ZTo6b3BlcmF0b3I9KGNvbnN0IFFXZWJIaXRUZXN0UmVzdWx0UHJpdmF0ZSYgb3RoZXIp
Cit7CisgICAgcG9zID0gb3RoZXIucG9zOworICAgIGJvdW5kaW5nUmVjdCA9IG90aGVyLmJvdW5k
aW5nUmVjdDsKKyAgICBlbmNsb3NpbmdCbG9jayA9IG90aGVyLmVuY2xvc2luZ0Jsb2NrOworICAg
IHRpdGxlID0gb3RoZXIudGl0bGU7CisgICAgbGlua1RleHQgPSBvdGhlci5saW5rVGV4dDsKKyAg
ICBsaW5rVXJsID0gb3RoZXIubGlua1VybDsKKyAgICBsaW5rVGl0bGUgPSBvdGhlci5saW5rVGl0
bGU7CisgICAgbGlua1RhcmdldEZyYW1lID0gb3RoZXIubGlua1RhcmdldEZyYW1lOworICAgIGxp
bmtFbGVtZW50ID0gb3RoZXIubGlua0VsZW1lbnQ7CisgICAgYWx0ZXJuYXRlVGV4dCA9IG90aGVy
LmFsdGVybmF0ZVRleHQ7CisgICAgaW1hZ2VVcmwgPSBvdGhlci5pbWFnZVVybDsKKyAgICBwaXht
YXAgPSBvdGhlci5waXhtYXA7CisgICAgaXNDb250ZW50RWRpdGFibGUgPSBvdGhlci5pc0NvbnRl
bnRFZGl0YWJsZTsKKyAgICBpc0NvbnRlbnRTZWxlY3RlZCA9IG90aGVyLmlzQ29udGVudFNlbGVj
dGVkOworICAgIGlzU2Nyb2xsQmFyID0gb3RoZXIuaXNTY3JvbGxCYXI7CisgICAgZnJhbWUgPSBv
dGhlci5mcmFtZTsKKworICAgIGlmIChpbm5lck5vZGUpCisgICAgICAgIGlubmVyTm9kZS0+ZGVy
ZWYoKTsKKyAgICBpbm5lck5vZGUgPSBvdGhlci5pbm5lck5vZGU7CisgICAgaWYgKGlubmVyTm9k
ZSkKKyAgICAgICAgaW5uZXJOb2RlLT5yZWYoKTsKKworICAgIGlmIChpbm5lck5vblNoYXJlZE5v
ZGUpCisgICAgICAgIGlubmVyTm9uU2hhcmVkTm9kZS0+ZGVyZWYoKTsKKyAgICBpbm5lck5vblNo
YXJlZE5vZGUgPSBvdGhlci5pbm5lck5vblNoYXJlZE5vZGU7CisgICAgaWYgKGlubmVyTm9uU2hh
cmVkTm9kZSkKKyAgICAgICAgaW5uZXJOb25TaGFyZWROb2RlLT5yZWYoKTsKKworICAgIGlmICh3
ZWJDb3JlRnJhbWUpCisgICAgICAgIHdlYkNvcmVGcmFtZS0+ZGVyZWYoKTsKKyAgICB3ZWJDb3Jl
RnJhbWUgPSBvdGhlci53ZWJDb3JlRnJhbWU7CisgICAgaWYgKHdlYkNvcmVGcmFtZSkKKyAgICAg
ICAgd2ViQ29yZUZyYW1lLT5yZWYoKTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworUVdlYkhp
dFRlc3RSZXN1bHRQcml2YXRlOjp+UVdlYkhpdFRlc3RSZXN1bHRQcml2YXRlKCkKK3sKKyAgICBp
ZiAoaW5uZXJOb2RlKQorICAgICAgICBpbm5lck5vZGUtPmRlcmVmKCk7CisgICAgaWYgKGlubmVy
Tm9uU2hhcmVkTm9kZSkKKyAgICAgICAgaW5uZXJOb25TaGFyZWROb2RlLT5kZXJlZigpOworICAg
IGlmICh3ZWJDb3JlRnJhbWUpCisgICAgICAgIHdlYkNvcmVGcmFtZS0+ZGVyZWYoKTsKK30KKwor
UVdlYkVsZW1lbnQgUVdlYkhpdFRlc3RSZXN1bHRQcml2YXRlOjplbGVtZW50Rm9ySW5uZXJOb2Rl
KCkgY29uc3QKK3sKKyAgICAgaWYgKCFpbm5lck5vblNoYXJlZE5vZGUgfHwgIWlubmVyTm9uU2hh
cmVkTm9kZS0+aXNFbGVtZW50Tm9kZSgpKQorICAgICAgICAgcmV0dXJuIFFXZWJFbGVtZW50KCk7
CisgICAgIHJldHVybiBRV2ViRWxlbWVudChzdGF0aWNfY2FzdDxFbGVtZW50Kj4oaW5uZXJOb25T
aGFyZWROb2RlKSk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQorCitRU2l6ZSBRV2ViRnJhbWVBZGFwdGVyOjpjdXN0b21MYXlv
dXRTaXplKCkgY29uc3QKK3sKKyAgICBBU1NFUlQocGFnZUFkYXB0ZXItPm1haW5GcmFtZUFkYXB0
ZXIoKSA9PSB0aGlzKTsKKyAgICBGcmFtZVZpZXcqIHZpZXcgPSBmcmFtZS0+dmlldygpOworICAg
IEFTU0VSVCh2aWV3KTsKKyAgICBpZiAodmlldy0+dXNlRml4ZWRMYXlvdXQoKSkKKyAgICAgICAg
cmV0dXJuIHZpZXctPmZpeGVkTGF5b3V0U2l6ZSgpOworICAgIHJldHVybiBRU2l6ZSgpOworfQor
Cit2b2lkIFFXZWJGcmFtZUFkYXB0ZXI6OnNldEN1c3RvbUxheW91dFNpemUoY29uc3QgUVNpemUm
IHNpemUpCit7CisgICAgQVNTRVJUKHBhZ2VBZGFwdGVyLT5tYWluRnJhbWVBZGFwdGVyKCkgPT0g
dGhpcyk7CisgICAgRnJhbWVWaWV3KiB2aWV3ID0gZnJhbWUtPnZpZXcoKTsKKyAgICBBU1NFUlQo
dmlldyk7CisKKyAgICBpZiAoc2l6ZS5pc1ZhbGlkKCkpIHsKKyAgICAgICAgdmlldy0+c2V0VXNl
Rml4ZWRMYXlvdXQodHJ1ZSk7CisgICAgICAgIHZpZXctPnNldEZpeGVkTGF5b3V0U2l6ZShzaXpl
KTsKKyAgICB9IGVsc2UgaWYgKHZpZXctPnVzZUZpeGVkTGF5b3V0KCkpCisgICAgICAgIHZpZXct
PnNldFVzZUZpeGVkTGF5b3V0KGZhbHNlKTsKKworICAgIHZpZXctPmxheW91dCgpOworfQorCit2
b2lkIFFXZWJGcmFtZUFkYXB0ZXI6OnNldEZpeGVkVmlzaWJsZUNvbnRlbnRSZWN0KGNvbnN0IFFS
ZWN0JiByZWN0KQoreworICAgIEFTU0VSVChwYWdlQWRhcHRlci0+bWFpbkZyYW1lQWRhcHRlcigp
ID09IHRoaXMpOworICAgIEZyYW1lVmlldyogdmlldyA9IGZyYW1lLT52aWV3KCk7CisgICAgQVNT
RVJUKHZpZXcpOworICAgIHZpZXctPnNldEZpeGVkVmlzaWJsZUNvbnRlbnRSZWN0KHJlY3QpOwor
fQorCit2b2lkIFFXZWJGcmFtZUFkYXB0ZXI6OnNldFZpZXdwb3J0U2l6ZShjb25zdCBRU2l6ZSYg
c2l6ZSkKK3sKKyAgICBBU1NFUlQocGFnZUFkYXB0ZXItPm1haW5GcmFtZUFkYXB0ZXIoKSA9PSB0
aGlzKTsKKyAgICBGcmFtZVZpZXcqIHZpZXcgPSBmcmFtZS0+dmlldygpOworICAgIEFTU0VSVCh2
aWV3KTsKKyAgICB2aWV3LT5yZXNpemUoc2l6ZSk7CisgICAgdmlldy0+YWRqdXN0Vmlld1NpemUo
KTsKK30KKworCit2b2lkIFFXZWJGcmFtZUFkYXB0ZXI6OnNldFBhaW50c0VudGlyZUNvbnRlbnRz
KGJvb2wgcmVzaXplc1RvQ29udGVudHMpCit7CisgICAgQVNTRVJUKHBhZ2VBZGFwdGVyLT5tYWlu
RnJhbWVBZGFwdGVyKCkgPT0gdGhpcyk7CisgICAgQVNTRVJUKGZyYW1lLT52aWV3KCkpOworICAg
IGZyYW1lLT52aWV3KCktPnNldFBhaW50c0VudGlyZUNvbnRlbnRzKHJlc2l6ZXNUb0NvbnRlbnRz
KTsKK30KKwordm9pZCBRV2ViRnJhbWVBZGFwdGVyOjpzZXREZWxlZ2F0ZXNTY3JvbGxpbmcoYm9v
bCByZXNpemVzVG9Db250ZW50cykKK3sKKyAgICBBU1NFUlQocGFnZUFkYXB0ZXItPm1haW5GcmFt
ZUFkYXB0ZXIoKSA9PSB0aGlzKTsKKyAgICBBU1NFUlQoZnJhbWUtPnZpZXcoKSk7CisgICAgZnJh
bWUtPnZpZXcoKS0+c2V0RGVsZWdhdGVzU2Nyb2xsaW5nKHJlc2l6ZXNUb0NvbnRlbnRzKTsKK30K
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvUVdlYkZyYW1lQWRh
cHRlci5oIGIvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9RV2ViRnJhbWVBZGFwdGVy
LmgKaW5kZXggMTdjNDFkNTM5MzVlYWJjNDIxOTNiYzFmYjc0Mjg1ZmExNDYwYjBjYy4uOTVkMTEy
MmMwNDJhYzRhNmRhOTE3ZDNlNmI0ZGViZWQ0MmYzYjBiYiAxMDA2NDQKLS0tIGEvU291cmNlL1dl
YktpdC9xdC9XZWJDb3JlU3VwcG9ydC9RV2ViRnJhbWVBZGFwdGVyLmgKKysrIGIvU291cmNlL1dl
YktpdC9xdC9XZWJDb3JlU3VwcG9ydC9RV2ViRnJhbWVBZGFwdGVyLmgKQEAgLTIyLDE3ICsyMiwy
NSBAQAogCiAjaW5jbHVkZSAiRnJhbWVMb2FkZXJDbGllbnRRdC5oIgogI2luY2x1ZGUgIlBsYXRm
b3JtRXZlbnQuaCIKKyNpZiBFTkFCTEUoT1JJRU5UQVRJT05fRVZFTlRTKQorI2luY2x1ZGUgInFv
cmllbnRhdGlvbnNlbnNvci5oIgorI2VuZGlmIC8vIEVOQUJMRShPUklFTlRBVElPTl9FVkVOVFMp
LgorI2luY2x1ZGUgInF3ZWJlbGVtZW50LmgiCiAKLSNpbmNsdWRlIDxGcmFtZVZpZXcuaD4KLSNp
bmNsdWRlIDxJbnRSZWN0Lmg+Ci0jaW5jbHVkZSA8SW50U2l6ZS5oPgotI2luY2x1ZGUgPEtVUkwu
aD4KLQorI2luY2x1ZGUgPFFMaXN0PgogI2luY2x1ZGUgPFFOZXR3b3JrQWNjZXNzTWFuYWdlcj4K
KyNpbmNsdWRlIDxRVXJsPgorI2luY2x1ZGUgPFFSZWN0PgogI2luY2x1ZGUgPFFTaXplPgorI2lu
Y2x1ZGUgPHd0Zi9FeHBvcnRNYWNyb3MuaD4KKyNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+CisjaW5j
bHVkZSA8d3RmL3RleHQvV1RGU3RyaW5nLmg+CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIGNsYXNz
IEZyYW1lOworY2xhc3MgR3JhcGhpY3NDb250ZXh0OworY2xhc3MgSW50UmVjdDsKK2NsYXNzIFRl
eHR1cmVNYXBwZXJMYXllcjsKIH0KIAogUVRfQkVHSU5fTkFNRVNQQUNFCkBAIC00NCw2ICs1Miw0
NiBAQCBjbGFzcyBRR2VzdHVyZUV2ZW50RmFjYWRlOwogI2VuZGlmCiBjbGFzcyBRV2ViRnJhbWU7
CiBjbGFzcyBRV2ViUGFnZUFkYXB0ZXI7CitjbGFzcyBRV2ViU2VjdXJpdHlPcmlnaW47CisKK2Ns
YXNzIFdFQktJVF9FWFBPUlREQVRBIFFXZWJIaXRUZXN0UmVzdWx0UHJpdmF0ZSB7CitwdWJsaWM6
CisgICAgUVdlYkhpdFRlc3RSZXN1bHRQcml2YXRlKCkKKyAgICAgICAgOiBpc0NvbnRlbnRFZGl0
YWJsZShmYWxzZSkKKyAgICAgICAgLCBpc0NvbnRlbnRTZWxlY3RlZChmYWxzZSksIGlzU2Nyb2xs
QmFyKGZhbHNlKQorICAgICAgICAsIGlubmVyTm9kZSgwKQorICAgICAgICAsIGlubmVyTm9uU2hh
cmVkTm9kZSgwKQorICAgICAgICAsIHdlYkNvcmVGcmFtZSgwKSB7fQorICAgIFFXZWJIaXRUZXN0
UmVzdWx0UHJpdmF0ZShjb25zdCBXZWJDb3JlOjpIaXRUZXN0UmVzdWx0ICZoaXRUZXN0KTsKKyAg
ICBRV2ViSGl0VGVzdFJlc3VsdFByaXZhdGUoY29uc3QgUVdlYkhpdFRlc3RSZXN1bHRQcml2YXRl
Jik7CisgICAgUVdlYkhpdFRlc3RSZXN1bHRQcml2YXRlJiBvcGVyYXRvcj0oY29uc3QgUVdlYkhp
dFRlc3RSZXN1bHRQcml2YXRlJik7CisgICAgflFXZWJIaXRUZXN0UmVzdWx0UHJpdmF0ZSgpOwor
CisgICAgUVdlYkVsZW1lbnQgZWxlbWVudEZvcklubmVyTm9kZSgpIGNvbnN0OworCisgICAgUVBv
aW50IHBvczsKKyAgICBRUmVjdCBib3VuZGluZ1JlY3Q7CisgICAgUVdlYkVsZW1lbnQgZW5jbG9z
aW5nQmxvY2s7CisgICAgUVN0cmluZyB0aXRsZTsKKyAgICBRU3RyaW5nIGxpbmtUZXh0OworICAg
IFFVcmwgbGlua1VybDsKKyAgICBRU3RyaW5nIGxpbmtUaXRsZTsKKyAgICBRUG9pbnRlcjxRT2Jq
ZWN0PiBsaW5rVGFyZ2V0RnJhbWU7CisgICAgUVdlYkVsZW1lbnQgbGlua0VsZW1lbnQ7CisgICAg
UVN0cmluZyBhbHRlcm5hdGVUZXh0OworICAgIFFVcmwgaW1hZ2VVcmw7CisgICAgUVBpeG1hcCBw
aXhtYXA7CisgICAgYm9vbCBpc0NvbnRlbnRFZGl0YWJsZTsKKyAgICBib29sIGlzQ29udGVudFNl
bGVjdGVkOworICAgIGJvb2wgaXNTY3JvbGxCYXI7CisgICAgUVBvaW50ZXI8UU9iamVjdD4gZnJh
bWU7Citwcml2YXRlOgorICAgIFdlYkNvcmU6Ok5vZGUqIGlubmVyTm9kZTsKKyAgICBXZWJDb3Jl
OjpOb2RlKiBpbm5lck5vblNoYXJlZE5vZGU7CisgICAgV2ViQ29yZTo6RnJhbWUqIHdlYkNvcmVG
cmFtZTsKKyAgICBmcmllbmQgY2xhc3MgUVdlYkZyYW1lQWRhcHRlcjsKKyAgICBmcmllbmQgY2xh
c3MgUVdlYlBhZ2VBZGFwdGVyOworfTsKIAogY2xhc3MgUVdlYkZyYW1lRGF0YSB7CiBwdWJsaWM6
CkBAIC02MSw4ICsxMDksMjIgQEAgcHVibGljOgogICAgIGludCBtYXJnaW5IZWlnaHQ7CiB9Owog
Ci1jbGFzcyBRV2ViRnJhbWVBZGFwdGVyIHsKK2NsYXNzIFdFQktJVF9FWFBPUlREQVRBIFFXZWJG
cmFtZUFkYXB0ZXIgewogcHVibGljOgorICAgIGVudW0gVmFsdWVPd25lcnNoaXAgeworICAgICAg
ICBRdE93bmVyc2hpcCwKKyAgICAgICAgU2NyaXB0T3duZXJzaGlwLAorICAgICAgICBBdXRvT3du
ZXJzaGlwCisgICAgfTsKKworICAgIGVudW0gUmVuZGVyTGF5ZXJzIHsKKyAgICAgICAgQ29udGVu
dHNMYXllciA9IDB4MTAsCisgICAgICAgIFNjcm9sbEJhckxheWVyID0gMHgyMCwKKyAgICAgICAg
UGFuSWNvbkxheWVyID0gMHg0MCwKKworICAgICAgICBBbGxMYXllcnMgPSAweGZmCisgICAgfTsK
KwogICAgIHN0YXRpYyBRVXJsIGVuc3VyZUFic29sdXRlVXJsKGNvbnN0IFFVcmwmKTsKIAogICAg
IFFXZWJGcmFtZUFkYXB0ZXIoKTsKQEAgLTgzLDI4ICsxNDUsMTAwIEBAIHB1YmxpYzoKICAgICB2
aXJ0dWFsIFFXZWJGcmFtZUFkYXB0ZXIqIGNyZWF0ZUNoaWxkRnJhbWUoUVdlYkZyYW1lRGF0YSop
ID0gMDsKIAogICAgIHZvaWQgbG9hZChjb25zdCBRTmV0d29ya1JlcXVlc3QmLCBRTmV0d29ya0Fj
Y2Vzc01hbmFnZXI6Ok9wZXJhdGlvbiA9IFFOZXR3b3JrQWNjZXNzTWFuYWdlcjo6R2V0T3BlcmF0
aW9uLCBjb25zdCBRQnl0ZUFycmF5JiBib2R5ID0gUUJ5dGVBcnJheSgpKTsKLSAgICBpbmxpbmUg
Ym9vbCBoYXNWaWV3KCkgY29uc3QgeyByZXR1cm4gZnJhbWUgJiYgZnJhbWUtPnZpZXcoKTsgfQor
ICAgIGJvb2wgaGFzVmlldygpIGNvbnN0OwogI2lmIEVOQUJMRShHRVNUVVJFX0VWRU5UUykKICAg
ICB2b2lkIGhhbmRsZUdlc3R1cmVFdmVudChRR2VzdHVyZUV2ZW50RmFjYWRlKik7CiAjZW5kaWYK
ICAgICBRV2ViRnJhbWVBZGFwdGVyKiBjcmVhdGVGcmFtZShRV2ViRnJhbWVEYXRhKik7CiAKLSAg
ICBXZWJDb3JlOjpJbnRTaXplIHNjcm9sbFBvc2l0aW9uKCkgY29uc3Q7Ci0gICAgV2ViQ29yZTo6
SW50UmVjdCBmcmFtZVJlY3QoKSBjb25zdDsKKyAgICBRVmFyaWFudCBldmFsdWF0ZUphdmFTY3Jp
cHQoY29uc3QgUVN0cmluZyYgc2NyaXB0U291cmNlKTsKKyAgICB2b2lkIGFkZFRvSmF2YVNjcmlw
dFdpbmRvd09iamVjdChjb25zdCBRU3RyaW5nJiBuYW1lLCBRT2JqZWN0KiwgVmFsdWVPd25lcnNo
aXAgb3duZXJzaGlwKTsKKworICAgIFFTdHJpbmcgdG9IdG1sKCkgY29uc3Q7CisgICAgUVN0cmlu
ZyB0b1BsYWluVGV4dCgpIGNvbnN0OworCisgICAgdm9pZCBzZXRDb250ZW50KGNvbnN0IFFCeXRl
QXJyYXkgJmRhdGEsIGNvbnN0IFFTdHJpbmcgJm1pbWVUeXBlLCBjb25zdCBRVXJsICZiYXNlVXJs
KTsKKyAgICB2b2lkIHNldEh0bWwoY29uc3QgUVN0cmluZyAmaHRtbCwgY29uc3QgUVVybCAmYmFz
ZVVybCk7CisKKyAgICBRTXVsdGlNYXA8UVN0cmluZywgUVN0cmluZz4gbWV0YURhdGEoKSBjb25z
dDsKKworICAgIFFXZWJIaXRUZXN0UmVzdWx0UHJpdmF0ZSogaGl0VGVzdENvbnRlbnQoY29uc3Qg
UVBvaW50JikgY29uc3Q7CisgICAgUVdlYkVsZW1lbnQgZG9jdW1lbnRFbGVtZW50KCkgY29uc3Q7
CisgICAgUVN0cmluZyB0aXRsZSgpIGNvbnN0OworICAgIHZvaWQgY2xlYXJDb3JlRnJhbWUoKTsK
KyAgICBRVXJsIGJhc2VVcmwoKSBjb25zdDsKKyAgICBRVXJsIGNvcmVGcmFtZVVybCgpIGNvbnN0
OworICAgIFFVcmwgbGFzdFJlcXVlc3RlZFVybCgpIGNvbnN0OworICAgIFFXZWJTZWN1cml0eU9y
aWdpbiBzZWN1cml0eU9yaWdpbigpIGNvbnN0OworICAgIFFTdHJpbmcgdW5pcXVlTmFtZSgpIGNv
bnN0OworCisgICAgdm9pZCByZW5kZXJSZWxhdGl2ZUNvb3JkcyhRUGFpbnRlciosIGludCBsYXll
cnMsIGNvbnN0IFFSZWdpb24mIGNsaXApOworICAgIHZvaWQgcmVuZGVyRnJhbWVFeHRyYXMoV2Vi
Q29yZTo6R3JhcGhpY3NDb250ZXh0KiwgaW50IGxheWVycywgY29uc3QgUVJlZ2lvbiYgY2xpcCk7
CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgIHZvaWQgcmVuZGVyQ29tcG9z
aXRlZExheWVycyhXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQqLCBjb25zdCBXZWJDb3JlOjpJbnRS
ZWN0JiBjbGlwKTsKKyNlbmRpZgorI2lmIFVTRShUSUxFRF9CQUNLSU5HX1NUT1JFKQorICAgIHZv
aWQgc2V0VGlsZWRCYWNraW5nU3RvcmVGcm96ZW4oYm9vbCk7CisgICAgYm9vbCB0aWxlZEJhY2tp
bmdTdG9yZUZyb3plbigpIGNvbnN0OworICAgIHZvaWQgc2V0VGlsZWRCYWNraW5nU3RvcmVDb250
ZW50c1NjYWxlKGZsb2F0IHNjYWxlKTsKKyAgICBib29sIHJlbmRlckZyb21UaWxlZEJhY2tpbmdT
dG9yZShRUGFpbnRlciosIGNvbnN0IFFSZWdpb24mIGNsaXApOworI2VuZGlmCisKKyAgICAvLyBD
YWxsZWQgZnJvbSBRV2ViRnJhbWUgYXMgYSBwcml2YXRlIHNsb3Q6CisgICAgdm9pZCBfcV9vcmll
bnRhdGlvbkNoYW5nZWQoKTsKKworICAgIFFMaXN0PFFPYmplY3QqPiBjaGlsZEZyYW1lcygpIGNv
bnN0OworICAgIGJvb2wgaGFzRm9jdXMoKSBjb25zdDsKKyAgICB2b2lkIHNldEZvY3VzKCk7CisK
KyAgICB2b2lkIHNldFNjcm9sbEJhclBvbGljeShRdDo6T3JpZW50YXRpb24sIFF0OjpTY3JvbGxC
YXJQb2xpY3kpOworICAgIHZvaWQgc2Nyb2xsVG9BbmNob3IoY29uc3QgUVN0cmluZyYpOworICAg
IHZvaWQgc2Nyb2xsQnkoaW50LCBpbnQpOworICAgIHZvaWQgc2V0U2Nyb2xsQmFyVmFsdWUoUXQ6
Ok9yaWVudGF0aW9uLCBpbnQpOworICAgIGludCBzY3JvbGxCYXJWYWx1ZShRdDo6T3JpZW50YXRp
b24pIGNvbnN0OworICAgIGludCBzY3JvbGxCYXJNYXhpbXVtKFF0OjpPcmllbnRhdGlvbikgY29u
c3Q7CisgICAgUVJlY3Qgc2Nyb2xsQmFyR2VvbWV0cnkoUXQ6Ok9yaWVudGF0aW9uKSBjb25zdDsK
KworICAgIFFQb2ludCBzY3JvbGxQb3NpdGlvbigpIGNvbnN0OworICAgIFFSZWN0IGZyYW1lUmVj
dCgpIGNvbnN0OworICAgIFFTaXplIGNvbnRlbnRzU2l6ZSgpIGNvbnN0OworCisgICAgdm9pZCBz
ZXRab29tRmFjdG9yKHFyZWFsKTsKKyAgICBxcmVhbCB6b29tRmFjdG9yKCkgY29uc3Q7CisKKyAg
ICB2b2lkIHVwZGF0ZUJhY2tncm91bmRSZWN1cnNpdmVseShjb25zdCBRQ29sb3ImKTsKKworICAg
IHZvaWQgY2FuY2VsTG9hZCgpOworCisgICAgLy8gRnJhbWVWaWV3IHJlbGF0ZWQgZnVuY3Rpb25z
CisgICAgUVNpemUgY3VzdG9tTGF5b3V0U2l6ZSgpIGNvbnN0OworICAgIHZvaWQgc2V0Q3VzdG9t
TGF5b3V0U2l6ZShjb25zdCBRU2l6ZSYpOworICAgIHZvaWQgc2V0Rml4ZWRWaXNpYmxlQ29udGVu
dFJlY3QoY29uc3QgUVJlY3QmKTsKKyAgICB2b2lkIHNldFZpZXdwb3J0U2l6ZShjb25zdCBRU2l6
ZSYpOworICAgIHZvaWQgc2V0UGFpbnRzRW50aXJlQ29udGVudHMoYm9vbCAvKnJlc2l6ZXNUb0Nv
bnRlbnRzKi8pOworICAgIHZvaWQgc2V0RGVsZWdhdGVzU2Nyb2xsaW5nKGJvb2wgLypyZXNpemVz
VG9Db250ZW50cyovKTsKKwogICAgIFFXZWJQYWdlQWRhcHRlciogcGFnZUFkYXB0ZXI7CiAKIC8v
IHByb3RlY3RlZDoKICAgICBib29sIGFsbG93c1Njcm9sbGluZzsKICAgICBpbnQgbWFyZ2luV2lk
dGg7CiAgICAgaW50IG1hcmdpbkhlaWdodDsKKyAgICBRdDo6U2Nyb2xsQmFyUG9saWN5IGhvcml6
b250YWxTY3JvbGxCYXJQb2xpY3k7CisgICAgUXQ6OlNjcm9sbEJhclBvbGljeSB2ZXJ0aWNhbFNj
cm9sbEJhclBvbGljeTsKKyAgICBRVXJsIHVybDsKKyNpZiBFTkFCTEUoT1JJRU5UQVRJT05fRVZF
TlRTKQorICAgIFFPcmllbnRhdGlvblNlbnNvciBtX29yaWVudGF0aW9uOworI2VuZGlmIC8vIEVO
QUJMRShPUklFTlRBVElPTl9FVkVOVFMpLgogCiAvLyBwcml2YXRlOgogICAgIHZvaWQgaW5pdChR
V2ViUGFnZUFkYXB0ZXIqKTsKICAgICB2b2lkIGluaXQoUVdlYlBhZ2VBZGFwdGVyKiwgUVdlYkZy
YW1lRGF0YSopOworICAgIFdlYkNvcmU6OlNjcm9sbGJhciogaG9yaXpvbnRhbFNjcm9sbEJhcigp
IGNvbnN0OworICAgIFdlYkNvcmU6OlNjcm9sbGJhciogdmVydGljYWxTY3JvbGxCYXIoKSBjb25z
dDsKIAogICAgIFdlYkNvcmU6OkZyYW1lICpmcmFtZTsKICAgICBXZWJDb3JlOjpGcmFtZUxvYWRl
ckNsaWVudFF0ICpmcmFtZUxvYWRlckNsaWVudDsKLSAgICBXZWJDb3JlOjpLVVJMIHVybDsKIAog
ICAgIHN0YXRpYyBRV2ViRnJhbWVBZGFwdGVyKiBraXQoY29uc3QgV2ViQ29yZTo6RnJhbWUqKTsK
IApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9RV2ViUGFnZUFk
YXB0ZXIuY3BwIGIvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9RV2ViUGFnZUFkYXB0
ZXIuY3BwCmluZGV4IDNkNjM5ZDk5YTg2MGZhMjQwNTUwZDUxNmU2MmNhNGZkYjU2NjI1MTguLjRh
YmJkYzRiYjBmYTJkYmM1MmRiOWYyZDVhYzU5OGM0OWM4YTI5NDMgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvUVdlYlBhZ2VBZGFwdGVyLmNwcAorKysgYi9Tb3Vy
Y2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L1FXZWJQYWdlQWRhcHRlci5jcHAKQEAgLTIzLDUw
ICsyMywyMTQgQEAKIAogI2luY2x1ZGUgIkNocm9tZS5oIgogI2luY2x1ZGUgIkNocm9tZUNsaWVu
dFF0LmgiCisjaW5jbHVkZSAiQ2xpZW50UmVjdC5oIgorI2luY2x1ZGUgIkNvbnRleHRNZW51Lmgi
CisjaW5jbHVkZSAiQ29udGV4dE1lbnVDbGllbnRRdC5oIgorI2luY2x1ZGUgIkNvbnRleHRNZW51
Q29udHJvbGxlci5oIgorI2luY2x1ZGUgIkNTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbi5oIgor
I2luY2x1ZGUgIkNTU1BhcnNlci5oIgorI2lmIEVOQUJMRShERVZJQ0VfT1JJRU5UQVRJT04pCisj
aW5jbHVkZSAiRGV2aWNlTW90aW9uQ2xpZW50UXQuaCIKKyNpbmNsdWRlICJEZXZpY2VPcmllbnRh
dGlvbkNsaWVudE1vY2suaCIKKyNpbmNsdWRlICJEZXZpY2VPcmllbnRhdGlvbkNsaWVudFF0Lmgi
CisjZW5kaWYKKyNpbmNsdWRlICJEb2N1bWVudExvYWRlci5oIgorI2luY2x1ZGUgIkRyYWdDbGll
bnRRdC5oIgorI2luY2x1ZGUgIkRyYWdDb250cm9sbGVyLmgiCisjaW5jbHVkZSAiRHJhZ0RhdGEu
aCIKKyNpbmNsdWRlICJEcmFnU2Vzc2lvbi5oIgorI2luY2x1ZGUgIkVkaXRvckNsaWVudFF0Lmgi
CisjaW5jbHVkZSAiRm9jdXNDb250cm9sbGVyLmgiCisjaW5jbHVkZSAiRnJhbWVWaWV3LmgiCisj
aWYgRU5BQkxFKEdFT0xPQ0FUSU9OKQorI2luY2x1ZGUgIkdlb2xvY2F0aW9uQ2xpZW50TW9jay5o
IgorI2luY2x1ZGUgIkdlb2xvY2F0aW9uQ2xpZW50UXQuaCIKKyNpbmNsdWRlICJHZW9sb2NhdGlv
bkNvbnRyb2xsZXIuaCIKKyNlbmRpZgorI2luY2x1ZGUgIkdlb2xvY2F0aW9uUGVybWlzc2lvbkNs
aWVudFF0LmgiCisjaW5jbHVkZSAiSGl0VGVzdFJlc3VsdC5oIgorI2luY2x1ZGUgIkhUTUxGcmFt
ZU93bmVyRWxlbWVudC5oIgorI2luY2x1ZGUgIkhUTUxJbnB1dEVsZW1lbnQuaCIKKyNpbmNsdWRl
ICJJbml0V2ViQ29yZVF0LmgiCisjaW5jbHVkZSAiSW5zcGVjdG9yQ2xpZW50UXQuaCIKKyNpbmNs
dWRlICJJbnNwZWN0b3JDb250cm9sbGVyLmgiCisjaW5jbHVkZSAiSW5zcGVjdG9yU2VydmVyUXQu
aCIKKyNpbmNsdWRlICJMb2NhbGl6ZWRTdHJpbmdzLmgiCisjaW5jbHVkZSAiTm9kZUxpc3QuaCIK
ICNpbmNsdWRlICJOb3RpZmljYXRpb25QcmVzZW50ZXJDbGllbnRRdC5oIgorI2luY2x1ZGUgIk1J
TUVUeXBlUmVnaXN0cnkuaCIKKyNpbmNsdWRlICJNZW1vcnlDYWNoZS5oIgorI2luY2x1ZGUgIlBh
Z2VHcm91cC5oIgorI2luY2x1ZGUgIlBhc3RlYm9hcmQuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybUtl
eWJvYXJkRXZlbnQuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVRvdWNoRXZlbnQuaCIKKyNpbmNsdWRl
ICJQbGF0Zm9ybVdoZWVsRXZlbnQuaCIKKyNpbmNsdWRlICJQbHVnaW5EYXRhYmFzZS5oIgorI2lu
Y2x1ZGUgIlBsdWdpblBhY2thZ2UuaCIKKyNpbmNsdWRlICJQcm9ncmVzc1RyYWNrZXIuaCIKICNp
bmNsdWRlICJRV2ViRnJhbWVBZGFwdGVyLmgiCisjaW5jbHVkZSAiUmVuZGVyVGV4dENvbnRyb2wu
aCIKKyNpbmNsdWRlICJTY2hlbWVSZWdpc3RyeS5oIgorI2luY2x1ZGUgIlNjcm9sbGJhci5oIgor
I2luY2x1ZGUgIlNjcm9sbGJhclRoZW1lLmgiCisjaW5jbHVkZSAiU2V0dGluZ3MuaCIKICNpbmNs
dWRlICJVbmRvU3RlcFF0LmgiCisjaW5jbHVkZSAiVXNlckFnZW50UXQuaCIKKyNpbmNsdWRlICJX
ZWJFdmVudENvbnZlcnNpb24uaCIKKyNpbmNsdWRlICJXZWJLaXRWZXJzaW9uLmgiCisjaW5jbHVk
ZSAiV2luZG93RmVhdHVyZXMuaCIKKyNpbmNsdWRlICJxd2ViaGlzdG9yeV9wLmgiCiAjaW5jbHVk
ZSAicXdlYnBsdWdpbmZhY3RvcnkuaCIKICNpbmNsdWRlICJxd2Vic2V0dGluZ3MuaCIKICNpbmNs
dWRlIDxQYWdlLmg+CisjaW5jbHVkZSA8UUJpdEFycmF5PgorI2luY2x1ZGUgPFFHdWlBcHBsaWNh
dGlvbj4KKyNpbmNsdWRlIDxRTWltZURhdGE+CisjaW5jbHVkZSA8UU1vdXNlRXZlbnQ+CiAjaW5j
bHVkZSA8UU5ldHdvcmtBY2Nlc3NNYW5hZ2VyPgorI2luY2x1ZGUgPFFTdHlsZUhpbnRzPgorI2lu
Y2x1ZGUgPFFUZXh0Q2hhckZvcm1hdD4KKyNpbmNsdWRlIDxRVG91Y2hFdmVudD4KKyNpbmNsdWRl
IDxRV2hlZWxFdmVudD4KKworLy8gZnJvbSB0ZXh0L3Fmb250LmNwcAorUVRfQkVHSU5fTkFNRVNQ
QUNFCitleHRlcm4gUV9HVUlfRVhQT1JUIGludCBxdF9kZWZhdWx0RHBpKCk7CitRVF9FTkRfTkFN
RVNQQUNFCiAKIHVzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwogCiBib29sIFFXZWJQYWdlQWRhcHRl
cjo6ZHJ0UnVuID0gZmFsc2U7CiAKK3R5cGVkZWYgUVdlYlBhZ2VBZGFwdGVyOjpNZW51SXRlbURl
c2NyaXB0aW9uIE1lbnVJdGVtOworCitzdGF0aWMgaW5saW5lIERyYWdPcGVyYXRpb24gZHJvcEFj
dGlvblRvRHJhZ09wKFF0OjpEcm9wQWN0aW9ucyBhY3Rpb25zKQoreworICAgIHVuc2lnbmVkIHJl
c3VsdCA9IDA7CisgICAgaWYgKGFjdGlvbnMgJiBRdDo6Q29weUFjdGlvbikKKyAgICAgICAgcmVz
dWx0IHw9IERyYWdPcGVyYXRpb25Db3B5OworICAgIC8vIERyYWdPcGVyYXRpb25nZW5lcmljIHJl
cHJlc2VudHMgSW50ZXJuZXRFeHBsb3JlcidzIGVxdWl2YWxlbnQgb2YgTW92ZSBvcGVyYXRpb24s
CisgICAgLy8gaGVuY2UgaXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYXMgIm1vdmUiCisgICAgaWYg
KGFjdGlvbnMgJiBRdDo6TW92ZUFjdGlvbikKKyAgICAgICAgcmVzdWx0IHw9IChEcmFnT3BlcmF0
aW9uTW92ZSB8IERyYWdPcGVyYXRpb25HZW5lcmljKTsKKyAgICBpZiAoYWN0aW9ucyAmIFF0OjpM
aW5rQWN0aW9uKQorICAgICAgICByZXN1bHQgfD0gRHJhZ09wZXJhdGlvbkxpbms7CisgICAgaWYg
KHJlc3VsdCA9PSAoRHJhZ09wZXJhdGlvbkNvcHkgfCBEcmFnT3BlcmF0aW9uTW92ZSB8IERyYWdP
cGVyYXRpb25HZW5lcmljIHwgRHJhZ09wZXJhdGlvbkxpbmspKQorICAgICAgICByZXN1bHQgPSBE
cmFnT3BlcmF0aW9uRXZlcnk7CisgICAgcmV0dXJuIChEcmFnT3BlcmF0aW9uKXJlc3VsdDsKK30K
Kworc3RhdGljIGlubGluZSBRdDo6RHJvcEFjdGlvbiBkcmFnT3BUb0Ryb3BBY3Rpb24odW5zaWdu
ZWQgYWN0aW9ucykKK3sKKyAgICBRdDo6RHJvcEFjdGlvbiByZXN1bHQgPSBRdDo6SWdub3JlQWN0
aW9uOworICAgIGlmIChhY3Rpb25zICYgRHJhZ09wZXJhdGlvbkNvcHkpCisgICAgICAgIHJlc3Vs
dCA9IFF0OjpDb3B5QWN0aW9uOworICAgIGVsc2UgaWYgKGFjdGlvbnMgJiBEcmFnT3BlcmF0aW9u
TW92ZSkKKyAgICAgICAgcmVzdWx0ID0gUXQ6Ok1vdmVBY3Rpb247CisgICAgLy8gRHJhZ09wZXJh
dGlvbmdlbmVyaWMgcmVwcmVzZW50cyBJbnRlcm5ldEV4cGxvcmVyJ3MgZXF1aXZhbGVudCBvZiBN
b3ZlIG9wZXJhdGlvbiwKKyAgICAvLyBoZW5jZSBpdCBzaG91bGQgYmUgY29uc2lkZXJlZCBhcyAi
bW92ZSIKKyAgICBlbHNlIGlmIChhY3Rpb25zICYgRHJhZ09wZXJhdGlvbkdlbmVyaWMpCisgICAg
ICAgIHJlc3VsdCA9IFF0OjpNb3ZlQWN0aW9uOworICAgIGVsc2UgaWYgKGFjdGlvbnMgJiBEcmFn
T3BlcmF0aW9uTGluaykKKyAgICAgICAgcmVzdWx0ID0gUXQ6OkxpbmtBY3Rpb247CisgICAgcmV0
dXJuIHJlc3VsdDsKK30KKworc3RhdGljIFdlYkNvcmU6OkZyYW1lTG9hZFJlcXVlc3QgZnJhbWVM
b2FkUmVxdWVzdChjb25zdCBRVXJsICZ1cmwsIFdlYkNvcmU6OkZyYW1lICpmcmFtZSkKK3sKKyAg
ICByZXR1cm4gV2ViQ29yZTo6RnJhbWVMb2FkUmVxdWVzdChmcmFtZS0+ZG9jdW1lbnQoKS0+c2Vj
dXJpdHlPcmlnaW4oKSwKKyAgICAgICAgV2ViQ29yZTo6UmVzb3VyY2VSZXF1ZXN0KHVybCwgZnJh
bWUtPmxvYWRlcigpLT5vdXRnb2luZ1JlZmVycmVyKCkpKTsKK30KKworc3RhdGljIHZvaWQgb3Bl
bk5ld1dpbmRvdyhjb25zdCBRVXJsJiB1cmwsIEZyYW1lKiBmcmFtZSkKK3sKKyAgICBpZiAoUGFn
ZSogb2xkUGFnZSA9IGZyYW1lLT5wYWdlKCkpIHsKKyAgICAgICAgV2luZG93RmVhdHVyZXMgZmVh
dHVyZXM7CisgICAgICAgIE5hdmlnYXRpb25BY3Rpb24gYWN0aW9uOworICAgICAgICBGcmFtZUxv
YWRSZXF1ZXN0IHJlcXVlc3QgPSBmcmFtZUxvYWRSZXF1ZXN0KHVybCwgZnJhbWUpOworICAgICAg
ICBpZiAoUGFnZSogbmV3UGFnZSA9IG9sZFBhZ2UtPmNocm9tZSgpLT5jcmVhdGVXaW5kb3coZnJh
bWUsIHJlcXVlc3QsIGZlYXR1cmVzLCBhY3Rpb24pKSB7CisgICAgICAgICAgICBuZXdQYWdlLT5t
YWluRnJhbWUoKS0+bG9hZGVyKCktPmxvYWRGcmFtZVJlcXVlc3QocmVxdWVzdCwgZmFsc2UsIGZh
bHNlLCAwLCAwLCBNYXliZVNlbmRSZWZlcnJlcik7CisgICAgICAgICAgICBuZXdQYWdlLT5jaHJv
bWUoKS0+c2hvdygpOworICAgICAgICB9CisgICAgfQorfQorCiBRV2ViUGFnZUFkYXB0ZXI6OlFX
ZWJQYWdlQWRhcHRlcigpCiAgICAgOiBzZXR0aW5ncygwKQogICAgICwgcGFnZSgwKQogICAgICwg
cGx1Z2luRmFjdG9yeSgwKQogICAgICwgZm9yd2FyZFVuc3VwcG9ydGVkQ29udGVudChmYWxzZSkK
ICAgICAsIGluc2lkZU9wZW5DYWxsKGZhbHNlKQorICAgICwgY2xpY2tDYXVzZWRGb2N1cyhmYWxz
ZSkKKyAgICAsIG1fdG90YWxCeXRlcygwKQorICAgICwgbV9ieXRlc1JlY2VpdmVkKCkKICAgICAs
IG5ldHdvcmtNYW5hZ2VyKDApCiB7Ci19CisgICAgV2ViQ29yZTo6aW5pdGlhbGl6ZVdlYkNvcmVR
dCgpOworI2lmIEVOQUJMRShHRU9MT0NBVElPTikgfHwgRU5BQkxFKERFVklDRV9PUklFTlRBVElP
TikKKyAgICBib29sIHVzZU1vY2sgPSBRV2ViUGFnZUFkYXB0ZXI6OmRydFJ1bjsKKyNlbmRpZgog
Ci1RV2ViUGFnZUFkYXB0ZXI6On5RV2ViUGFnZUFkYXB0ZXIoKQotewotICAgIGRlbGV0ZSBwYWdl
OwotICAgIGRlbGV0ZSBzZXR0aW5nczsKKyAgICBQYWdlOjpQYWdlQ2xpZW50cyBwYWdlQ2xpZW50
czsKKyAgICBwYWdlQ2xpZW50cy5jaHJvbWVDbGllbnQgPSBuZXcgQ2hyb21lQ2xpZW50UXQodGhp
cyk7CisgICAgcGFnZUNsaWVudHMuY29udGV4dE1lbnVDbGllbnQgPSBuZXcgQ29udGV4dE1lbnVD
bGllbnRRdCgpOworICAgIHBhZ2VDbGllbnRzLmVkaXRvckNsaWVudCA9IG5ldyBFZGl0b3JDbGll
bnRRdCh0aGlzKTsKKyAgICBwYWdlQ2xpZW50cy5kcmFnQ2xpZW50ID0gbmV3IERyYWdDbGllbnRR
dChwYWdlQ2xpZW50cy5jaHJvbWVDbGllbnQpOworICAgIHBhZ2VDbGllbnRzLmluc3BlY3RvckNs
aWVudCA9IG5ldyBJbnNwZWN0b3JDbGllbnRRdCh0aGlzKTsKKyAgICBwYWdlID0gbmV3IFBhZ2Uo
cGFnZUNsaWVudHMpOworI2lmIEVOQUJMRShHRU9MT0NBVElPTikKKyAgICBpZiAodXNlTW9jaykg
eworICAgICAgICAvLyBJbiBjYXNlIHJ1bm5pbmcgaW4gRHVtcFJlbmRlclRyZWUgbW9kZSBzZXQg
dGhlIGNvbnRyb2xsZXIgdG8gbW9jayBwcm92aWRlci4KKyAgICAgICAgR2VvbG9jYXRpb25DbGll
bnRNb2NrKiBtb2NrID0gbmV3IEdlb2xvY2F0aW9uQ2xpZW50TW9jazsKKyAgICAgICAgV2ViQ29y
ZTo6cHJvdmlkZUdlb2xvY2F0aW9uVG8ocGFnZSwgbW9jayk7CisgICAgICAgIG1vY2stPnNldENv
bnRyb2xsZXIoV2ViQ29yZTo6R2VvbG9jYXRpb25Db250cm9sbGVyOjpmcm9tKHBhZ2UpKTsKKyAg
ICB9IGVsc2UKKyAgICAgICAgV2ViQ29yZTo6cHJvdmlkZUdlb2xvY2F0aW9uVG8ocGFnZSwgbmV3
IEdlb2xvY2F0aW9uQ2xpZW50UXQodGhpcykpOworI2VuZGlmCisjaWYgRU5BQkxFKERFVklDRV9P
UklFTlRBVElPTikKKyAgICBpZiAodXNlTW9jaykKKyAgICAgICAgV2ViQ29yZTo6cHJvdmlkZURl
dmljZU9yaWVudGF0aW9uVG8ocGFnZSwgbmV3IERldmljZU9yaWVudGF0aW9uQ2xpZW50TW9jayk7
CisgICAgZWxzZQorICAgICAgICBXZWJDb3JlOjpwcm92aWRlRGV2aWNlT3JpZW50YXRpb25Ubyhw
YWdlLCBuZXcgRGV2aWNlT3JpZW50YXRpb25DbGllbnRRdCk7CisgICAgV2ViQ29yZTo6cHJvdmlk
ZURldmljZU1vdGlvblRvKHBhZ2UsIG5ldyBEZXZpY2VNb3Rpb25DbGllbnRRdCk7CisjZW5kaWYK
KworICAgIC8vIEJ5IGRlZmF1bHQgZWFjaCBwYWdlIGlzIHB1dCBpbnRvIHRoZWlyIG93biB1bmlx
dWUgcGFnZSBncm91cCwgd2hpY2ggYWZmZWN0cyBwb3B1cCB3aW5kb3dzCisgICAgLy8gYW5kIHZp
c2l0ZWQgbGlua3MuIFBhZ2UgZ3JvdXBzIChwZXIgcHJvY2VzcyBvbmx5KSBpcyBhIGZlYXR1cmUg
bWFraW5nIGl0IHBvc3NpYmxlIHRvIHVzZQorICAgIC8vIHNlcGFyYXRlIHNldHRpbmdzIGZvciBl
YWNoIGdyb3VwLCBzbyB0aGF0IGZvciBpbnN0YW5jZSBhbiBpbnRlZ3JhdGVkIGJyb3dzZXIvZW1h
aWwgcmVhZGVyCisgICAgLy8gY2FuIHVzZSBkaWZmZXJlbnQgc2V0dGluZ3MgZm9yIGRpc3BsYXlp
bmcgSFRNTCBwYWdlcyBhbmQgSFRNTCBlbWFpbC4gVG8gbWFrZSBRdFdlYktpdCB3b3JrCisgICAg
Ly8gYXMgZXhwZWN0ZWQgb3V0IG9mIHRoZSBib3gsIHdlIHVzZSBhIGRlZmF1bHQgZ3JvdXAgc2lt
aWxhciB0byB3aGF0IG90aGVyIHBvcnRzIGFyZSBkb2luZy4KKyAgICBwYWdlLT5zZXRHcm91cE5h
bWUoIkRlZmF1bHQgR3JvdXAiKTsKKworICAgIHBhZ2UtPmFkZExheW91dE1pbGVzdG9uZXMoRGlk
Rmlyc3RWaXN1YWxseU5vbkVtcHR5TGF5b3V0KTsKKworICAgIHNldHRpbmdzID0gbmV3IFFXZWJT
ZXR0aW5ncyhwYWdlLT5zZXR0aW5ncygpKTsKIAogI2lmIEVOQUJMRShOT1RJRklDQVRJT05TKSB8
fCBFTkFCTEUoTEVHQUNZX05PVElGSUNBVElPTlMpCi0gICAgTm90aWZpY2F0aW9uUHJlc2VudGVy
Q2xpZW50UXQ6Om5vdGlmaWNhdGlvblByZXNlbnRlcigpLT5yZW1vdmVDbGllbnQoKTsKKyAgICBX
ZWJDb3JlOjpwcm92aWRlTm90aWZpY2F0aW9uKHBhZ2UsIE5vdGlmaWNhdGlvblByZXNlbnRlckNs
aWVudFF0Ojpub3RpZmljYXRpb25QcmVzZW50ZXIoKSk7CiAjZW5kaWYKKworICAgIGhpc3Rvcnku
ZCA9IG5ldyBRV2ViSGlzdG9yeVByaXZhdGUoc3RhdGljX2Nhc3Q8V2ViQ29yZTo6QmFja0Zvcndh
cmRMaXN0SW1wbCo+KHBhZ2UtPmJhY2tGb3J3YXJkTGlzdCgpKSk7CisKKyAgICBQYWdlR3JvdXA6
OnNldFNob3VsZFRyYWNrVmlzaXRlZExpbmtzKHRydWUpOwogfQogCi12b2lkIFFXZWJQYWdlQWRh
cHRlcjo6aW5pdChQYWdlKiBwYWdlKQorUVdlYlBhZ2VBZGFwdGVyOjp+UVdlYlBhZ2VBZGFwdGVy
KCkKIHsKLSAgICB0aGlzLT5wYWdlID0gcGFnZTsKLSAgICBzZXR0aW5ncyA9IG5ldyBRV2ViU2V0
dGluZ3MocGFnZS0+c2V0dGluZ3MoKSk7CisgICAgZGVsZXRlIHBhZ2U7CisgICAgZGVsZXRlIHNl
dHRpbmdzOwogCiAjaWYgRU5BQkxFKE5PVElGSUNBVElPTlMpIHx8IEVOQUJMRShMRUdBQ1lfTk9U
SUZJQ0FUSU9OUykKLSAgICBXZWJDb3JlOjpwcm92aWRlTm90aWZpY2F0aW9uKHBhZ2UsIE5vdGlm
aWNhdGlvblByZXNlbnRlckNsaWVudFF0Ojpub3RpZmljYXRpb25QcmVzZW50ZXIoKSk7CisgICAg
Tm90aWZpY2F0aW9uUHJlc2VudGVyQ2xpZW50UXQ6Om5vdGlmaWNhdGlvblByZXNlbnRlcigpLT5y
ZW1vdmVDbGllbnQoKTsKICNlbmRpZgogfQogCiB2b2lkIFFXZWJQYWdlQWRhcHRlcjo6ZGVsZXRl
UGFnZSgpCiB7CisgICAgLy9CZWZvcmUgd2UgZGVsZXRlIHRoZSBwYWdlLCBkZXRhY2ggdGhlIG1h
aW5mcmFtZSdzIGxvYWRlcgorICAgIEZyYW1lTG9hZGVyKiBsb2FkZXIgPSBtYWluRnJhbWVBZGFw
dGVyKCktPmZyYW1lLT5sb2FkZXIoKTsKKyAgICBpZiAobG9hZGVyKQorICAgICAgICBsb2FkZXIt
PmRldGFjaEZyb21QYXJlbnQoKTsKICAgICBkZWxldGUgcGFnZTsKICAgICBwYWdlID0gMDsKIH0K
QEAgLTc2LDcgKzI0MCw3IEBAIFFXZWJQYWdlQWRhcHRlciogUVdlYlBhZ2VBZGFwdGVyOjpraXQo
UGFnZSogcGFnZSkKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q2hyb21lQ2xpZW50UXQqPihwYWdl
LT5jaHJvbWUoKS0+Y2xpZW50KCkpLT5tX3dlYlBhZ2U7CiB9CiAKLVZpZXdwb3J0QXJndW1lbnRz
IFFXZWJQYWdlQWRhcHRlcjo6dmlld3BvcnRBcmd1bWVudHMoKQorVmlld3BvcnRBcmd1bWVudHMg
UVdlYlBhZ2VBZGFwdGVyOjp2aWV3cG9ydEFyZ3VtZW50cygpIGNvbnN0CiB7CiAgICAgcmV0dXJu
IHBhZ2UgPyBwYWdlLT52aWV3cG9ydEFyZ3VtZW50cygpIDogV2ViQ29yZTo6Vmlld3BvcnRBcmd1
bWVudHMoKTsKIH0KQEAgLTEwMiwzICsyNjYsMTIxOSBAQCBRTmV0d29ya0FjY2Vzc01hbmFnZXIq
IFFXZWJQYWdlQWRhcHRlcjo6bmV0d29ya0FjY2Vzc01hbmFnZXIoKQogICAgICAgICBuZXR3b3Jr
TWFuYWdlciA9IG5ldyBRTmV0d29ya0FjY2Vzc01hbmFnZXIoaGFuZGxlKCkpOwogICAgIHJldHVy
biBuZXR3b3JrTWFuYWdlcjsKIH0KKworYm9vbCBRV2ViUGFnZUFkYXB0ZXI6Omhhc1NlbGVjdGlv
bigpIGNvbnN0Cit7CisgICAgRnJhbWUqIGZyYW1lID0gcGFnZS0+Zm9jdXNDb250cm9sbGVyKCkt
PmZvY3VzZWRPck1haW5GcmFtZSgpOworICAgIGlmIChmcmFtZSkKKyAgICAgICAgcmV0dXJuIChm
cmFtZS0+c2VsZWN0aW9uKCktPnNlbGVjdGlvbigpLnNlbGVjdGlvblR5cGUoKSAhPSBWaXNpYmxl
U2VsZWN0aW9uOjpOb1NlbGVjdGlvbik7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitRU3RyaW5n
IFFXZWJQYWdlQWRhcHRlcjo6c2VsZWN0ZWRUZXh0KCkgY29uc3QKK3sKKyAgICBGcmFtZSogZnJh
bWUgPSBwYWdlLT5mb2N1c0NvbnRyb2xsZXIoKS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCk7CisgICAg
aWYgKGZyYW1lLT5zZWxlY3Rpb24oKS0+c2VsZWN0aW9uKCkuc2VsZWN0aW9uVHlwZSgpID09IFZp
c2libGVTZWxlY3Rpb246Ok5vU2VsZWN0aW9uKQorICAgICAgICByZXR1cm4gUVN0cmluZygpOwor
ICAgIHJldHVybiBmcmFtZS0+ZWRpdG9yKCktPnNlbGVjdGVkVGV4dCgpOworfQorCitRU3RyaW5n
IFFXZWJQYWdlQWRhcHRlcjo6c2VsZWN0ZWRIdG1sKCkgY29uc3QKK3sKKyAgICByZXR1cm4gcGFn
ZS0+Zm9jdXNDb250cm9sbGVyKCktPmZvY3VzZWRPck1haW5GcmFtZSgpLT5lZGl0b3IoKS0+c2Vs
ZWN0ZWRSYW5nZSgpLT50b0hUTUwoKTsKK30KKworYm9vbCBRV2ViUGFnZUFkYXB0ZXI6OmlzQ29u
dGVudEVkaXRhYmxlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gcGFnZS0+aXNFZGl0YWJsZSgpOwor
fQorCit2b2lkIFFXZWJQYWdlQWRhcHRlcjo6c2V0Q29udGVudEVkaXRhYmxlKGJvb2wgZWRpdGFi
bGUpCit7CisgICAgcGFnZS0+c2V0RWRpdGFibGUoZWRpdGFibGUpOworICAgIHBhZ2UtPnNldFRh
YktleUN5Y2xlc1Rocm91Z2hFbGVtZW50cyghZWRpdGFibGUpOworCisgICAgRnJhbWUqIGZyYW1l
ID0gbWFpbkZyYW1lQWRhcHRlcigpLT5mcmFtZTsKKyAgICBpZiAoZWRpdGFibGUpIHsKKyAgICAg
ICAgZnJhbWUtPmVkaXRvcigpLT5hcHBseUVkaXRpbmdTdHlsZVRvQm9keUVsZW1lbnQoKTsKKyAg
ICAgICAgLy8gRklYTUU6IG1hYyBwb3J0IGNhbGxzIHRoaXMgaWYgdGhlcmUgaXMgbm8gc2VsZWN0
ZWRET01SYW5nZQorICAgICAgICAvL2ZyYW1lLT5zZXRTZWxlY3Rpb25Gcm9tTm9uZSgpOworICAg
IH0KKworfQorCitib29sIFFXZWJQYWdlQWRhcHRlcjo6ZmluZFRleHQoY29uc3QgUVN0cmluZyYg
c3ViU3RyaW5nLCBGaW5kRmxhZyBvcHRpb25zKQoreworICAgIDo6VGV4dENhc2VTZW5zaXRpdml0
eSBjYXNlU2Vuc2l0aXZpdHkgPSA6OlRleHRDYXNlSW5zZW5zaXRpdmU7CisgICAgaWYgKG9wdGlv
bnMgJiBGaW5kQ2FzZVNlbnNpdGl2ZWx5KQorICAgICAgICBjYXNlU2Vuc2l0aXZpdHkgPSA6OlRl
eHRDYXNlU2Vuc2l0aXZlOworCisgICAgaWYgKG9wdGlvbnMgJiBIaWdobGlnaHRBbGxPY2N1cnJl
bmNlcykgeworICAgICAgICBpZiAoc3ViU3RyaW5nLmlzRW1wdHkoKSkgeworICAgICAgICAgICAg
cGFnZS0+dW5tYXJrQWxsVGV4dE1hdGNoZXMoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwor
ICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHJldHVybiBwYWdlLT5tYXJrQWxsTWF0Y2hlc0Zv
clRleHQoc3ViU3RyaW5nLCBjYXNlU2Vuc2l0aXZpdHksIHRydWUsIDApOworICAgIH0gZWxzZSB7
CisgICAgICAgIGlmIChzdWJTdHJpbmcuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBwYWdlLT5t
YWluRnJhbWUoKS0+c2VsZWN0aW9uKCktPmNsZWFyKCk7CisgICAgICAgICAgICBGcmFtZSogZnJh
bWUgPSBwYWdlLT5tYWluRnJhbWUoKS0+dHJlZSgpLT5maXJzdENoaWxkKCk7CisgICAgICAgICAg
ICB3aGlsZSAoZnJhbWUpIHsKKyAgICAgICAgICAgICAgICBmcmFtZS0+c2VsZWN0aW9uKCktPmNs
ZWFyKCk7CisgICAgICAgICAgICAgICAgZnJhbWUgPSBmcmFtZS0+dHJlZSgpLT50cmF2ZXJzZU5l
eHRXaXRoV3JhcChmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgOjpG
aW5kRGlyZWN0aW9uIGRpcmVjdGlvbiA9IDo6RmluZERpcmVjdGlvbkZvcndhcmQ7CisgICAgICAg
IGlmIChvcHRpb25zICYgRmluZEJhY2t3YXJkKQorICAgICAgICAgICAgZGlyZWN0aW9uID0gOjpG
aW5kRGlyZWN0aW9uQmFja3dhcmQ7CisKKyAgICAgICAgY29uc3QgYm9vbCBzaG91bGRXcmFwID0g
b3B0aW9ucyAmIEZpbmRXcmFwc0Fyb3VuZERvY3VtZW50OworCisgICAgICAgIHJldHVybiBwYWdl
LT5maW5kU3RyaW5nKHN1YlN0cmluZywgY2FzZVNlbnNpdGl2aXR5LCBkaXJlY3Rpb24sIHNob3Vs
ZFdyYXApOworICAgIH0KK30KKwordm9pZCBRV2ViUGFnZUFkYXB0ZXI6OmFkanVzdFBvaW50Rm9y
Q2xpY2tpbmcoUU1vdXNlRXZlbnQqIGV2KQoreworICAgIFF0UGxhdGZvcm1QbHVnaW4gcGxhdGZv
cm1QbHVnaW47CisgICAgT3duUHRyPFFXZWJUb3VjaE1vZGlmaWVyPiB0b3VjaE1vZGlmaWVyID0g
cGxhdGZvcm1QbHVnaW4uY3JlYXRlVG91Y2hNb2RpZmllcigpOworICAgIGlmICghdG91Y2hNb2Rp
ZmllcikKKyAgICAgICAgcmV0dXJuOworCisgICAgdW5zaWduZWQgdG9wUGFkZGluZyA9IHRvdWNo
TW9kaWZpZXItPmhpdFRlc3RQYWRkaW5nRm9yVG91Y2goUVdlYlRvdWNoTW9kaWZpZXI6OlVwKTsK
KyAgICB1bnNpZ25lZCByaWdodFBhZGRpbmcgPSB0b3VjaE1vZGlmaWVyLT5oaXRUZXN0UGFkZGlu
Z0ZvclRvdWNoKFFXZWJUb3VjaE1vZGlmaWVyOjpSaWdodCk7CisgICAgdW5zaWduZWQgYm90dG9t
UGFkZGluZyA9IHRvdWNoTW9kaWZpZXItPmhpdFRlc3RQYWRkaW5nRm9yVG91Y2goUVdlYlRvdWNo
TW9kaWZpZXI6OkRvd24pOworICAgIHVuc2lnbmVkIGxlZnRQYWRkaW5nID0gdG91Y2hNb2RpZmll
ci0+aGl0VGVzdFBhZGRpbmdGb3JUb3VjaChRV2ViVG91Y2hNb2RpZmllcjo6TGVmdCk7CisKKyAg
ICB0b3VjaE1vZGlmaWVyID0gbnVsbHB0cjsKKworICAgIGlmICghdG9wUGFkZGluZyAmJiAhcmln
aHRQYWRkaW5nICYmICFib3R0b21QYWRkaW5nICYmICFsZWZ0UGFkZGluZykKKyAgICAgICAgcmV0
dXJuOworCisgICAgRG9jdW1lbnQqIHN0YXJ0aW5nRG9jdW1lbnQgPSBwYWdlLT5tYWluRnJhbWUo
KS0+ZG9jdW1lbnQoKTsKKyAgICBpZiAoIXN0YXJ0aW5nRG9jdW1lbnQpCisgICAgICAgIHJldHVy
bjsKKworICAgIEludFBvaW50IG9yaWdpbmFsUG9pbnQoZXYtPnBvcygpKTsKKyAgICBUb3VjaEFk
anVzdGVyIHRvdWNoQWRqdXN0ZXIodG9wUGFkZGluZywgcmlnaHRQYWRkaW5nLCBib3R0b21QYWRk
aW5nLCBsZWZ0UGFkZGluZyk7CisgICAgSW50UG9pbnQgYWRqdXN0ZWRQb2ludCA9IHRvdWNoQWRq
dXN0ZXIuZmluZENhbmRpZGF0ZVBvaW50Rm9yVG91Y2gob3JpZ2luYWxQb2ludCwgc3RhcnRpbmdE
b2N1bWVudCk7CisgICAgaWYgKGFkanVzdGVkUG9pbnQgPT0gSW50UG9pbnQ6Onplcm8oKSkKKyAg
ICAgICAgcmV0dXJuOworICAgIFFNb3VzZUV2ZW50KiByZXQgPSBuZXcgUU1vdXNlRXZlbnQoZXYt
PnR5cGUoKSwgUVBvaW50KGFkanVzdGVkUG9pbnQpLCBldi0+Z2xvYmFsUG9zKCksIGV2LT5idXR0
b24oKSwgZXYtPmJ1dHRvbnMoKSwgZXYtPm1vZGlmaWVycygpKTsKKyAgICBkZWxldGUgZXY7Cisg
ICAgZXYgPSByZXQ7Cit9CisKK3N0YXRpYyBib29sIGhhc01vdXNlTGlzdGVuZXIoRWxlbWVudCog
ZWxlbWVudCkKK3sKKyAgICBBU1NFUlQoZWxlbWVudCk7CisgICAgcmV0dXJuIGVsZW1lbnQtPmhh
c0V2ZW50TGlzdGVuZXJzKGV2ZW50TmFtZXMoKS5jbGlja0V2ZW50KQorICAgICAgICB8fCBlbGVt
ZW50LT5oYXNFdmVudExpc3RlbmVycyhldmVudE5hbWVzKCkubW91c2Vkb3duRXZlbnQpCisgICAg
ICAgIHx8IGVsZW1lbnQtPmhhc0V2ZW50TGlzdGVuZXJzKGV2ZW50TmFtZXMoKS5tb3VzZXVwRXZl
bnQpOworfQorCitzdGF0aWMgYm9vbCBpc0NsaWNrYWJsZUVsZW1lbnQoRWxlbWVudCogZWxlbWVu
dCwgUmVmUHRyPE5vZGVMaXN0PiBsaXN0KQoreworICAgIEFTU0VSVChlbGVtZW50KTsKKyAgICBi
b29sIGlzQ2xpY2thYmxlID0gaGFzTW91c2VMaXN0ZW5lcihlbGVtZW50KTsKKyAgICBpZiAoIWlz
Q2xpY2thYmxlICYmIGxpc3QpIHsKKyAgICAgICAgRWxlbWVudCogcGFyZW50ID0gZWxlbWVudC0+
cGFyZW50RWxlbWVudCgpOworICAgICAgICB1bnNpZ25lZCBjb3VudCA9IGxpc3QtPmxlbmd0aCgp
OworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgY291bnQgJiYgcGFyZW50OyBpKysp
IHsKKyAgICAgICAgICAgIGlmIChsaXN0LT5pdGVtKGkpICE9IHBhcmVudCkKKyAgICAgICAgICAg
ICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgaXNDbGlja2FibGUgPSBoYXNNb3VzZUxpc3Rl
bmVyKHBhcmVudCk7CisgICAgICAgICAgICBpZiAoaXNDbGlja2FibGUpCisgICAgICAgICAgICAg
ICAgYnJlYWs7CisKKyAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC0+cGFyZW50RWxlbWVudCgp
OworICAgICAgICB9CisgICAgfQorCisgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7CisgICAgcmV0
dXJuIGlzQ2xpY2thYmxlCisgICAgICAgIHx8IGVsZW1lbnQtPndlYmtpdE1hdGNoZXNTZWxlY3Rv
cigiYSwqOmxpbmssKjp2aXNpdGVkLCpbcm9sZT1idXR0b25dLGJ1dHRvbixpbnB1dCxzZWxlY3Qs
bGFiZWwiLCBlYykKKyAgICAgICAgfHwgQ1NTQ29tcHV0ZWRTdHlsZURlY2xhcmF0aW9uOjpjcmVh
dGUoZWxlbWVudCktPmdldFByb3BlcnR5VmFsdWUoY3NzUHJvcGVydHlJRCgiY3Vyc29yIikpID09
ICJwb2ludGVyIjsKK30KKworc3RhdGljIGJvb2wgaXNWYWxpZEZyYW1lT3duZXIoRWxlbWVudCog
ZWxlbWVudCkKK3sKKyAgICBBU1NFUlQoZWxlbWVudCk7CisgICAgcmV0dXJuIGVsZW1lbnQtPmlz
RnJhbWVPd25lckVsZW1lbnQoKSAmJiBzdGF0aWNfY2FzdDxIVE1MRnJhbWVPd25lckVsZW1lbnQq
PihlbGVtZW50KS0+Y29udGVudEZyYW1lKCk7Cit9CisKK1FXZWJQYWdlQWRhcHRlcjo6VG91Y2hB
ZGp1c3Rlcjo6VG91Y2hBZGp1c3Rlcih1bnNpZ25lZCB0b3BQYWRkaW5nLCB1bnNpZ25lZCByaWdo
dFBhZGRpbmcsIHVuc2lnbmVkIGJvdHRvbVBhZGRpbmcsIHVuc2lnbmVkIGxlZnRQYWRkaW5nKQor
ICAgIDogbV90b3BQYWRkaW5nKHRvcFBhZGRpbmcpCisgICAgLCBtX3JpZ2h0UGFkZGluZyhyaWdo
dFBhZGRpbmcpCisgICAgLCBtX2JvdHRvbVBhZGRpbmcoYm90dG9tUGFkZGluZykKKyAgICAsIG1f
bGVmdFBhZGRpbmcobGVmdFBhZGRpbmcpCit7Cit9CisKK0ludFBvaW50IFFXZWJQYWdlQWRhcHRl
cjo6VG91Y2hBZGp1c3Rlcjo6ZmluZENhbmRpZGF0ZVBvaW50Rm9yVG91Y2goY29uc3QgSW50UG9p
bnQmIHRvdWNoUG9pbnQsIERvY3VtZW50KiBkb2N1bWVudCkgY29uc3QKK3sKKyAgICBpZiAoIWRv
Y3VtZW50KQorICAgICAgICByZXR1cm4gSW50UG9pbnQoKTsKKworICAgIGludCB4ID0gdG91Y2hQ
b2ludC54KCk7CisgICAgaW50IHkgPSB0b3VjaFBvaW50LnkoKTsKKworICAgIFJlZlB0cjxOb2Rl
TGlzdD4gaW50ZXJzZWN0ZWROb2RlcyA9IGRvY3VtZW50LT5ub2Rlc0Zyb21SZWN0KHgsIHksIG1f
dG9wUGFkZGluZywgbV9yaWdodFBhZGRpbmcsIG1fYm90dG9tUGFkZGluZywgbV9sZWZ0UGFkZGlu
ZywgZmFsc2UgLyppZ25vcmVDbGlwcGluZyovLCBmYWxzZSAvKmFsbG93U2hhZG93Q29udGVudCov
KTsKKyAgICBpZiAoIWludGVyc2VjdGVkTm9kZXMpCisgICAgICAgIHJldHVybiBJbnRQb2ludCgp
OworCisgICAgRWxlbWVudCogY2xvc2VzdENsaWNrYWJsZUVsZW1lbnQgPSAwOworICAgIEludFJl
Y3QgbGFyZ2VzdEludGVyc2VjdGlvblJlY3Q7CisgICAgRnJhbWVWaWV3KiB2aWV3ID0gZG9jdW1l
bnQtPmZyYW1lKCktPnZpZXcoKTsKKworICAgIC8vIFRvdWNoIHJlY3QgaW4gY29udGVudHMgY29v
cmRpbmF0ZXMuCisgICAgSW50UmVjdCB0b3VjaFJlY3QoSGl0VGVzdExvY2F0aW9uOjpyZWN0Rm9y
UG9pbnQodmlldy0+d2luZG93VG9Db250ZW50cyhJbnRQb2ludCh4LCB5KSksIG1fdG9wUGFkZGlu
ZywgbV9yaWdodFBhZGRpbmcsIG1fYm90dG9tUGFkZGluZywgbV9sZWZ0UGFkZGluZykpOworCisg
ICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBsaXN0IG9mIG5vZGVzIGhpdCBsb29raW5nIGZvciB0aGUg
b25lIHdob3NlIGJvdW5kaW5nIGFyZWEKKyAgICAvLyBoYXMgbGFyZ2VzdCBpbnRlcnNlY3Rpb24g
d2l0aCB0aGUgdG91Y2ggYXJlYSAocG9pbnQgKyBwYWRkaW5nKS4KKyAgICBmb3IgKHVuc2lnbmVk
IGkgPSAwOyBpIDwgaW50ZXJzZWN0ZWROb2Rlcy0+bGVuZ3RoKCk7IGkrKykgeworICAgICAgICBO
b2RlKiBjdXJyZW50Tm9kZSA9IGludGVyc2VjdGVkTm9kZXMtPml0ZW0oaSk7CisKKyAgICAgICAg
RWxlbWVudCogY3VycmVudEVsZW1lbnQgPSBjdXJyZW50Tm9kZS0+aXNFbGVtZW50Tm9kZSgpID8g
dG9FbGVtZW50KGN1cnJlbnROb2RlKSA6IDA7CisgICAgICAgIGlmICghY3VycmVudEVsZW1lbnQg
fHwgKCFpc0NsaWNrYWJsZUVsZW1lbnQoY3VycmVudEVsZW1lbnQsIDApICYmICFpc1ZhbGlkRnJh
bWVPd25lcihjdXJyZW50RWxlbWVudCkpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAg
ICAgSW50UmVjdCBjdXJyZW50RWxlbWVudEJvdW5kaW5nUmVjdCA9IGN1cnJlbnRFbGVtZW50LT5w
aXhlbFNuYXBwZWRCb3VuZGluZ0JveCgpOworICAgICAgICBjdXJyZW50RWxlbWVudEJvdW5kaW5n
UmVjdC5pbnRlcnNlY3QodG91Y2hSZWN0KTsKKworICAgICAgICBpZiAoY3VycmVudEVsZW1lbnRC
b3VuZGluZ1JlY3QuaXNFbXB0eSgpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAg
aW50IGN1cnJlbnRJbnRlcnNlY3Rpb25SZWN0QXJlYSA9IGN1cnJlbnRFbGVtZW50Qm91bmRpbmdS
ZWN0LndpZHRoKCkgKiBjdXJyZW50RWxlbWVudEJvdW5kaW5nUmVjdC5oZWlnaHQoKTsKKyAgICAg
ICAgaW50IGxhcmdlc3RJbnRlcnNlY3Rpb25SZWN0QXJlYSA9IGxhcmdlc3RJbnRlcnNlY3Rpb25S
ZWN0LndpZHRoKCkgKiBsYXJnZXN0SW50ZXJzZWN0aW9uUmVjdC5oZWlnaHQoKTsKKyAgICAgICAg
aWYgKGN1cnJlbnRJbnRlcnNlY3Rpb25SZWN0QXJlYSA+IGxhcmdlc3RJbnRlcnNlY3Rpb25SZWN0
QXJlYSkgeworICAgICAgICAgICAgY2xvc2VzdENsaWNrYWJsZUVsZW1lbnQgPSBjdXJyZW50RWxl
bWVudDsKKyAgICAgICAgICAgIGxhcmdlc3RJbnRlcnNlY3Rpb25SZWN0ID0gY3VycmVudEVsZW1l
bnRCb3VuZGluZ1JlY3Q7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobGFyZ2VzdEludGVy
c2VjdGlvblJlY3QuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gSW50UG9pbnQoKTsKKworICAg
IC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVuIHVzZXIgdGFwcyBhIGlubmVyIGZyYW1lLiBJdCBpcyBk
b25lIGluIHRocmVlIHN0ZXBzOgorICAgIC8vIDEpIFRyYW5zZm9ybSB0aGUgb3JpZ2luYWwgdG91
Y2ggcG9pbnQgdG8gdGhlIGlubmVyIGRvY3VtZW50IGNvb3JkaW5hdGVzOworICAgIC8vIDEpIENh
bGwgbm9kZXNGcm9tUmVjdCBmb3IgdGhlIGlubmVyIGRvY3VtZW50IGluIGNhc2U7CisgICAgLy8g
MykgUmUtYWRkIHRoZSBpbm5lciBmcmFtZSBvZmZzZXQgKGxvY2F0aW9uKSBiZWZvcmUgcGFzc2lu
ZyB0aGUgbmV3IGNsaWNraW5nCisgICAgLy8gICAgcG9zaXRpb24gdG8gV2ViQ29yZS4KKyAgICBp
ZiAoY2xvc2VzdENsaWNrYWJsZUVsZW1lbnQtPmlzRnJhbWVPd25lckVsZW1lbnQoKSkgeworICAg
ICAgICAvLyBBZGp1c3QgY2xpZW50IGNvb3JkaW5hdGVzJyBvcmlnaW4gdG8gYmUgdG9wIGxlZnQg
b2YgaW5uZXIgZnJhbWUgdmlld3BvcnQuCisgICAgICAgIFBhc3NSZWZQdHI8Q2xpZW50UmVjdD4g
cmVjdCA9IGNsb3Nlc3RDbGlja2FibGVFbGVtZW50LT5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsK
KyAgICAgICAgSW50UG9pbnQgbmV3VG91Y2hQb2ludCA9IHRvdWNoUG9pbnQ7CisgICAgICAgIElu
dFNpemUgb2Zmc2V0ID0gIEludFNpemUocmVjdC0+bGVmdCgpLCByZWN0LT50b3AoKSk7CisgICAg
ICAgIG5ld1RvdWNoUG9pbnQgLT0gb2Zmc2V0OworCisgICAgICAgIEhUTUxGcmFtZU93bmVyRWxl
bWVudCogb3duZXIgPSBzdGF0aWNfY2FzdDxIVE1MRnJhbWVPd25lckVsZW1lbnQqPihjbG9zZXN0
Q2xpY2thYmxlRWxlbWVudCk7CisgICAgICAgIERvY3VtZW50KiBjaGlsZERvY3VtZW50ID0gb3du
ZXItPmNvbnRlbnRGcmFtZSgpLT5kb2N1bWVudCgpOworICAgICAgICByZXR1cm4gZmluZENhbmRp
ZGF0ZVBvaW50Rm9yVG91Y2gobmV3VG91Y2hQb2ludCwgY2hpbGREb2N1bWVudCk7CisgICAgfQor
ICAgIHJldHVybiB2aWV3LT5jb250ZW50c1RvV2luZG93KGxhcmdlc3RJbnRlcnNlY3Rpb25SZWN0
KS5jZW50ZXIoKTsKK30KKwordm9pZCBRV2ViUGFnZUFkYXB0ZXI6Om1vdXNlTW92ZUV2ZW50KFFN
b3VzZUV2ZW50KiBldikKK3sKKyAgICBXZWJDb3JlOjpGcmFtZSogZnJhbWUgPSBtYWluRnJhbWVB
ZGFwdGVyKCktPmZyYW1lOworICAgIGlmICghZnJhbWUtPnZpZXcoKSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgYm9vbCBhY2NlcHRlZCA9IGZyYW1lLT5ldmVudEhhbmRsZXIoKS0+bW91c2VNb3Zl
ZChjb252ZXJ0TW91c2VFdmVudChldiwgMCkpOworICAgIGV2LT5zZXRBY2NlcHRlZChhY2NlcHRl
ZCk7Cit9CisKK3ZvaWQgUVdlYlBhZ2VBZGFwdGVyOjptb3VzZVByZXNzRXZlbnQoUU1vdXNlRXZl
bnQqIGV2KQoreworICAgIFdlYkNvcmU6OkZyYW1lKiBmcmFtZSA9IG1haW5GcmFtZUFkYXB0ZXIo
KS0+ZnJhbWU7CisgICAgaWYgKCFmcmFtZS0+dmlldygpKQorICAgICAgICByZXR1cm47CisKKyAg
ICBSZWZQdHI8V2ViQ29yZTo6Tm9kZT4gb2xkTm9kZTsKKyAgICBGcmFtZSogZm9jdXNlZEZyYW1l
ID0gcGFnZS0+Zm9jdXNDb250cm9sbGVyKCktPmZvY3VzZWRGcmFtZSgpOworICAgIGlmIChEb2N1
bWVudCogZm9jdXNlZERvY3VtZW50ID0gZm9jdXNlZEZyYW1lID8gZm9jdXNlZEZyYW1lLT5kb2N1
bWVudCgpIDogMCkKKyAgICAgICAgb2xkTm9kZSA9IGZvY3VzZWREb2N1bWVudC0+Zm9jdXNlZE5v
ZGUoKTsKKworICAgIGlmICh0cmlwbGVDbGlja1RpbWVyLmlzQWN0aXZlKCkKKyAgICAgICAgICAg
ICYmIChldi0+cG9zKCkgLSB0cmlwbGVDbGljaykubWFuaGF0dGFuTGVuZ3RoKCkKKyAgICAgICAg
ICAgICAgICA8IHFHdWlBcHAtPnN0eWxlSGludHMoKS0+c3RhcnREcmFnRGlzdGFuY2UoKSkgewor
ICAgICAgICBtb3VzZVRyaXBsZUNsaWNrRXZlbnQoZXYpOworICAgICAgICByZXR1cm47CisgICAg
fQorCisgICAgYm9vbCBhY2NlcHRlZCA9IGZhbHNlOworICAgIFBsYXRmb3JtTW91c2VFdmVudCBt
ZXYgPSBjb252ZXJ0TW91c2VFdmVudChldiwgMSk7CisgICAgLy8gaWdub3JlIHRoZSBldmVudCBp
ZiB3ZSBjYW4ndCBtYXAgUXQncyBtb3VzZSBidXR0b25zIHRvIFdlYkNvcmU6Ok1vdXNlQnV0dG9u
CisgICAgaWYgKG1ldi5idXR0b24oKSAhPSBOb0J1dHRvbikKKyAgICAgICAgYWNjZXB0ZWQgPSBm
cmFtZS0+ZXZlbnRIYW5kbGVyKCktPmhhbmRsZU1vdXNlUHJlc3NFdmVudChtZXYpOworICAgIGV2
LT5zZXRBY2NlcHRlZChhY2NlcHRlZCk7CisKKyAgICBSZWZQdHI8V2ViQ29yZTo6Tm9kZT4gbmV3
Tm9kZTsKKyAgICBmb2N1c2VkRnJhbWUgPSBwYWdlLT5mb2N1c0NvbnRyb2xsZXIoKS0+Zm9jdXNl
ZEZyYW1lKCk7CisgICAgaWYgKERvY3VtZW50KiBmb2N1c2VkRG9jdW1lbnQgPSBmb2N1c2VkRnJh
bWUgPyBmb2N1c2VkRnJhbWUtPmRvY3VtZW50KCkgOiAwKQorICAgICAgICBuZXdOb2RlID0gZm9j
dXNlZERvY3VtZW50LT5mb2N1c2VkTm9kZSgpOworCisgICAgaWYgKG5ld05vZGUgJiYgb2xkTm9k
ZSAhPSBuZXdOb2RlKQorICAgICAgICBjbGlja0NhdXNlZEZvY3VzID0gdHJ1ZTsKK30KKwordm9p
ZCBRV2ViUGFnZUFkYXB0ZXI6Om1vdXNlRG91YmxlQ2xpY2tFdmVudChRTW91c2VFdmVudCAqZXYp
Cit7CisgICAgV2ViQ29yZTo6RnJhbWUqIGZyYW1lID0gbWFpbkZyYW1lQWRhcHRlcigpLT5mcmFt
ZTsKKyAgICBpZiAoIWZyYW1lLT52aWV3KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGJvb2wg
YWNjZXB0ZWQgPSBmYWxzZTsKKyAgICBQbGF0Zm9ybU1vdXNlRXZlbnQgbWV2ID0gY29udmVydE1v
dXNlRXZlbnQoZXYsIDIpOworICAgIC8vIGlnbm9yZSB0aGUgZXZlbnQgaWYgd2UgY2FuJ3QgbWFw
IFF0J3MgbW91c2UgYnV0dG9ucyB0byBXZWJDb3JlOjpNb3VzZUJ1dHRvbgorICAgIGlmIChtZXYu
YnV0dG9uKCkgIT0gTm9CdXR0b24pCisgICAgICAgIGFjY2VwdGVkID0gZnJhbWUtPmV2ZW50SGFu
ZGxlcigpLT5oYW5kbGVNb3VzZVByZXNzRXZlbnQobWV2KTsKKyAgICBldi0+c2V0QWNjZXB0ZWQo
YWNjZXB0ZWQpOworCisgICAgdHJpcGxlQ2xpY2tUaW1lci5zdGFydChxR3VpQXBwLT5zdHlsZUhp
bnRzKCktPm1vdXNlRG91YmxlQ2xpY2tJbnRlcnZhbCgpLCBoYW5kbGUoKSk7CisgICAgdHJpcGxl
Q2xpY2sgPSBRUG9pbnRGKGV2LT5wb3MoKSkudG9Qb2ludCgpOworfQorCit2b2lkIFFXZWJQYWdl
QWRhcHRlcjo6bW91c2VUcmlwbGVDbGlja0V2ZW50KFFNb3VzZUV2ZW50ICpldikKK3sKKyAgICBX
ZWJDb3JlOjpGcmFtZSogZnJhbWUgPSBtYWluRnJhbWVBZGFwdGVyKCktPmZyYW1lOworICAgIGlm
ICghZnJhbWUtPnZpZXcoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgYm9vbCBhY2NlcHRlZCA9
IGZhbHNlOworICAgIFBsYXRmb3JtTW91c2VFdmVudCBtZXYgPSBjb252ZXJ0TW91c2VFdmVudChl
diwgMyk7CisgICAgLy8gaWdub3JlIHRoZSBldmVudCBpZiB3ZSBjYW4ndCBtYXAgUXQncyBtb3Vz
ZSBidXR0b25zIHRvIFdlYkNvcmU6Ok1vdXNlQnV0dG9uCisgICAgaWYgKG1ldi5idXR0b24oKSAh
PSBOb0J1dHRvbikKKyAgICAgICAgYWNjZXB0ZWQgPSBmcmFtZS0+ZXZlbnRIYW5kbGVyKCktPmhh
bmRsZU1vdXNlUHJlc3NFdmVudChtZXYpOworICAgIGV2LT5zZXRBY2NlcHRlZChhY2NlcHRlZCk7
Cit9CisKK3ZvaWQgUVdlYlBhZ2VBZGFwdGVyOjptb3VzZVJlbGVhc2VFdmVudChRTW91c2VFdmVu
dCAqZXYpCit7CisgICAgV2ViQ29yZTo6RnJhbWUqIGZyYW1lID0gbWFpbkZyYW1lQWRhcHRlcigp
LT5mcmFtZTsKKyAgICBpZiAoIWZyYW1lLT52aWV3KCkpCisgICAgICAgIHJldHVybjsKKworICAg
IGJvb2wgYWNjZXB0ZWQgPSBmYWxzZTsKKyAgICBQbGF0Zm9ybU1vdXNlRXZlbnQgbWV2ID0gY29u
dmVydE1vdXNlRXZlbnQoZXYsIDApOworICAgIC8vIGlnbm9yZSB0aGUgZXZlbnQgaWYgd2UgY2Fu
J3QgbWFwIFF0J3MgbW91c2UgYnV0dG9ucyB0byBXZWJDb3JlOjpNb3VzZUJ1dHRvbgorICAgIGlm
IChtZXYuYnV0dG9uKCkgIT0gTm9CdXR0b24pCisgICAgICAgIGFjY2VwdGVkID0gZnJhbWUtPmV2
ZW50SGFuZGxlcigpLT5oYW5kbGVNb3VzZVJlbGVhc2VFdmVudChtZXYpOworICAgIGV2LT5zZXRB
Y2NlcHRlZChhY2NlcHRlZCk7CisKKyAgICBoYW5kbGVTb2Z0d2FyZUlucHV0UGFuZWwoZXYtPmJ1
dHRvbigpLCBRUG9pbnRGKGV2LT5wb3MoKSkudG9Qb2ludCgpKTsKK30KKwordm9pZCBRV2ViUGFn
ZUFkYXB0ZXI6OmhhbmRsZVNvZnR3YXJlSW5wdXRQYW5lbChRdDo6TW91c2VCdXR0b24gYnV0dG9u
LCBjb25zdCBRUG9pbnQmIHBvcykKK3sKKyAgICBGcmFtZSogZnJhbWUgPSBwYWdlLT5mb2N1c0Nv
bnRyb2xsZXIoKS0+Zm9jdXNlZEZyYW1lKCk7CisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgaWYgKGNsaWVudCAmJiBjbGllbnQtPmlucHV0TWV0aG9kRW5hYmxlZCgpCisg
ICAgICAgICYmIGZyYW1lLT5kb2N1bWVudCgpLT5mb2N1c2VkTm9kZSgpCisgICAgICAgICAgICAm
JiBidXR0b24gPT0gUXQ6OkxlZnRCdXR0b24gJiYgcUd1aUFwcC0+cHJvcGVydHkoImF1dG9TaXBF
bmFibGVkIikudG9Cb29sKCkpIHsKKyAgICAgICAgaWYgKCFjbGlja0NhdXNlZEZvY3VzIHx8IHJl
cXVlc3RTb2Z0d2FyZUlucHV0UGFuZWwoKSkgeworICAgICAgICAgICAgSGl0VGVzdFJlc3VsdCBy
ZXN1bHQgPSBmcmFtZS0+ZXZlbnRIYW5kbGVyKCktPmhpdFRlc3RSZXN1bHRBdFBvaW50KGZyYW1l
LT52aWV3KCktPndpbmRvd1RvQ29udGVudHMocG9zKSwgZmFsc2UpOworICAgICAgICAgICAgaWYg
KHJlc3VsdC5pc0NvbnRlbnRFZGl0YWJsZSgpKSB7CisgICAgICAgICAgICAgICAgUUV2ZW50IGV2
ZW50KFFFdmVudDo6UmVxdWVzdFNvZnR3YXJlSW5wdXRQYW5lbCk7CisgICAgICAgICAgICAgICAg
UUd1aUFwcGxpY2F0aW9uOjpzZW5kRXZlbnQoY2xpZW50LT5vd25lcldpZGdldCgpLCAmZXZlbnQp
OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgY2xpY2tDYXVzZWRGb2N1
cyA9IGZhbHNlOworfQorCisjaWZuZGVmIFFUX05PX1dIRUVMRVZFTlQKK3ZvaWQgUVdlYlBhZ2VB
ZGFwdGVyOjp3aGVlbEV2ZW50KFFXaGVlbEV2ZW50ICpldiwgaW50IHdoZWVsU2Nyb2xsTGluZXMp
Cit7CisgICAgV2ViQ29yZTo6RnJhbWUqIGZyYW1lID0gbWFpbkZyYW1lQWRhcHRlcigpLT5mcmFt
ZTsKKyAgICBpZiAoIWZyYW1lLT52aWV3KCkpCisgICAgICAgIHJldHVybjsKKworICAgIFBsYXRm
b3JtV2hlZWxFdmVudCBwZXYgPSBjb252ZXJ0V2hlZWxFdmVudChldiwgd2hlZWxTY3JvbGxMaW5l
cyk7CisgICAgYm9vbCBhY2NlcHRlZCA9IGZyYW1lLT5ldmVudEhhbmRsZXIoKS0+aGFuZGxlV2hl
ZWxFdmVudChwZXYpOworICAgIGV2LT5zZXRBY2NlcHRlZChhY2NlcHRlZCk7Cit9CisjZW5kaWYg
Ly8gUVRfTk9fV0hFRUxFVkVOVAorCisjaWZuZGVmIFFUX05PX0RSQUdBTkREUk9QCisKK1F0OjpE
cm9wQWN0aW9uIFFXZWJQYWdlQWRhcHRlcjo6ZHJhZ0VudGVyZWQoY29uc3QgUU1pbWVEYXRhICpk
YXRhLCBjb25zdCBRUG9pbnQgJnBvcywgUXQ6OkRyb3BBY3Rpb25zIHBvc3NpYmxlQWN0aW9ucykK
K3sKKyAgICBEcmFnRGF0YSBkcmFnRGF0YShkYXRhLCBwb3MsIFFDdXJzb3I6OnBvcygpLCBkcm9w
QWN0aW9uVG9EcmFnT3AocG9zc2libGVBY3Rpb25zKSk7CisgICAgcmV0dXJuIGRyYWdPcFRvRHJv
cEFjdGlvbihwYWdlLT5kcmFnQ29udHJvbGxlcigpLT5kcmFnRW50ZXJlZCgmZHJhZ0RhdGEpLm9w
ZXJhdGlvbik7Cit9CisKK3ZvaWQgUVdlYlBhZ2VBZGFwdGVyOjpkcmFnTGVhdmVFdmVudCgpCit7
CisgICAgRHJhZ0RhdGEgZHJhZ0RhdGEoMCwgSW50UG9pbnQoKSwgUUN1cnNvcjo6cG9zKCksIERy
YWdPcGVyYXRpb25Ob25lKTsKKyAgICBwYWdlLT5kcmFnQ29udHJvbGxlcigpLT5kcmFnRXhpdGVk
KCZkcmFnRGF0YSk7Cit9CisKK1F0OjpEcm9wQWN0aW9uIFFXZWJQYWdlQWRhcHRlcjo6ZHJhZ1Vw
ZGF0ZWQoY29uc3QgUU1pbWVEYXRhICpkYXRhLCBjb25zdCBRUG9pbnQgJnBvcywgUXQ6OkRyb3BB
Y3Rpb25zIHBvc3NpYmxlQWN0aW9ucykKK3sKKyAgICBEcmFnRGF0YSBkcmFnRGF0YShkYXRhLCBw
b3MsIFFDdXJzb3I6OnBvcygpLCBkcm9wQWN0aW9uVG9EcmFnT3AocG9zc2libGVBY3Rpb25zKSk7
CisgICAgcmV0dXJuIGRyYWdPcFRvRHJvcEFjdGlvbihwYWdlLT5kcmFnQ29udHJvbGxlcigpLT5k
cmFnVXBkYXRlZCgmZHJhZ0RhdGEpLm9wZXJhdGlvbik7Cit9CisKK2Jvb2wgUVdlYlBhZ2VBZGFw
dGVyOjpwZXJmb3JtRHJhZyhjb25zdCBRTWltZURhdGEgKmRhdGEsIGNvbnN0IFFQb2ludCAmcG9z
LCBRdDo6RHJvcEFjdGlvbnMgcG9zc2libGVBY3Rpb25zKQoreworICAgIERyYWdEYXRhIGRyYWdE
YXRhKGRhdGEsIHBvcywgUUN1cnNvcjo6cG9zKCksIGRyb3BBY3Rpb25Ub0RyYWdPcChwb3NzaWJs
ZUFjdGlvbnMpKTsKKyAgICByZXR1cm4gcGFnZS0+ZHJhZ0NvbnRyb2xsZXIoKS0+cGVyZm9ybURy
YWcoJmRyYWdEYXRhKTsKK30KKwordm9pZCBRV2ViUGFnZUFkYXB0ZXI6OmlucHV0TWV0aG9kRXZl
bnQoUUlucHV0TWV0aG9kRXZlbnQgKmV2KQoreworICAgIFdlYkNvcmU6OkZyYW1lICpmcmFtZSA9
IHBhZ2UtPmZvY3VzQ29udHJvbGxlcigpLT5mb2N1c2VkT3JNYWluRnJhbWUoKTsKKyAgICBXZWJD
b3JlOjpFZGl0b3IgKmVkaXRvciA9IGZyYW1lLT5lZGl0b3IoKTsKKworICAgIGlmICghZWRpdG9y
LT5jYW5FZGl0KCkpIHsKKyAgICAgICAgZXYtPmlnbm9yZSgpOworICAgICAgICByZXR1cm47Cisg
ICAgfQorCisgICAgTm9kZSogbm9kZSA9IDA7CisgICAgaWYgKGZyYW1lLT5zZWxlY3Rpb24oKS0+
cm9vdEVkaXRhYmxlRWxlbWVudCgpKQorICAgICAgICBub2RlID0gZnJhbWUtPnNlbGVjdGlvbigp
LT5yb290RWRpdGFibGVFbGVtZW50KCktPnNoYWRvd0FuY2VzdG9yTm9kZSgpOworCisgICAgVmVj
dG9yPENvbXBvc2l0aW9uVW5kZXJsaW5lPiB1bmRlcmxpbmVzOworICAgIGJvb2wgaGFzU2VsZWN0
aW9uID0gZmFsc2U7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGV2LT5hdHRyaWJ1dGVzKCku
c2l6ZSgpOyArK2kpIHsKKyAgICAgICAgY29uc3QgUUlucHV0TWV0aG9kRXZlbnQ6OkF0dHJpYnV0
ZSYgYSA9IGV2LT5hdHRyaWJ1dGVzKCkuYXQoaSk7CisgICAgICAgIHN3aXRjaCAoYS50eXBlKSB7
CisgICAgICAgIGNhc2UgUUlucHV0TWV0aG9kRXZlbnQ6OlRleHRGb3JtYXQ6IHsKKyAgICAgICAg
ICAgIFFUZXh0Q2hhckZvcm1hdCB0ZXh0Q2hhckZvcm1hdCA9IGEudmFsdWUudmFsdWU8UVRleHRG
b3JtYXQ+KCkudG9DaGFyRm9ybWF0KCk7CisgICAgICAgICAgICBRQ29sb3IgcWNvbG9yID0gdGV4
dENoYXJGb3JtYXQudW5kZXJsaW5lQ29sb3IoKTsKKyAgICAgICAgICAgIHVuZGVybGluZXMuYXBw
ZW5kKENvbXBvc2l0aW9uVW5kZXJsaW5lKHFNaW4oYS5zdGFydCwgKGEuc3RhcnQgKyBhLmxlbmd0
aCkpLCBxTWF4KGEuc3RhcnQsIChhLnN0YXJ0ICsgYS5sZW5ndGgpKSwgQ29sb3IobWFrZVJHQkEo
cWNvbG9yLnJlZCgpLCBxY29sb3IuZ3JlZW4oKSwgcWNvbG9yLmJsdWUoKSwgcWNvbG9yLmFscGhh
KCkpKSwgZmFsc2UpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNh
c2UgUUlucHV0TWV0aG9kRXZlbnQ6OkN1cnNvcjogeworICAgICAgICAgICAgZnJhbWUtPnNlbGVj
dGlvbigpLT5zZXRDYXJldFZpc2libGUoYS5sZW5ndGgpOyAvL2lmIGxlbmd0aCBpcyAwIGN1cnNv
ciBpcyBpbnZpc2libGUKKyAgICAgICAgICAgIGlmIChhLmxlbmd0aCA+IDApIHsKKyAgICAgICAg
ICAgICAgICBSZW5kZXJPYmplY3QqIGNhcmV0UmVuZGVyZXIgPSBmcmFtZS0+c2VsZWN0aW9uKCkt
PmNhcmV0UmVuZGVyZXIoKTsKKyAgICAgICAgICAgICAgICBpZiAoY2FyZXRSZW5kZXJlcikgewor
ICAgICAgICAgICAgICAgICAgICBRQ29sb3IgcWNvbG9yID0gYS52YWx1ZS52YWx1ZTxRQ29sb3I+
KCk7CisgICAgICAgICAgICAgICAgICAgIGNhcmV0UmVuZGVyZXItPnN0eWxlKCktPnNldENvbG9y
KENvbG9yKG1ha2VSR0JBKHFjb2xvci5yZWQoKSwgcWNvbG9yLmdyZWVuKCksIHFjb2xvci5ibHVl
KCksIHFjb2xvci5hbHBoYSgpKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgUUlucHV0TWV0aG9k
RXZlbnQ6OlNlbGVjdGlvbjogeworICAgICAgICAgICAgaGFzU2VsZWN0aW9uID0gdHJ1ZTsKKyAg
ICAgICAgICAgIC8vIEEgc2VsZWN0aW9uIGluIHRoZSBpbnB1dE1ldGhvZEV2ZW50IGlzIGFsd2F5
cyByZWZsZWN0ZWQgaW4gdGhlIHZpc2libGUgdGV4dAorICAgICAgICAgICAgaWYgKG5vZGUpIHsK
KyAgICAgICAgICAgICAgICBpZiAoSFRNTFRleHRGb3JtQ29udHJvbEVsZW1lbnQqIHRleHRDb250
cm9sID0gdG9UZXh0Rm9ybUNvbnRyb2wobm9kZSkpCisgICAgICAgICAgICAgICAgICAgIHRleHRD
b250cm9sLT5zZXRTZWxlY3Rpb25SYW5nZShxTWluKGEuc3RhcnQsIChhLnN0YXJ0ICsgYS5sZW5n
dGgpKSwgcU1heChhLnN0YXJ0LCAoYS5zdGFydCArIGEubGVuZ3RoKSkpOworICAgICAgICAgICAg
fQorCisgICAgICAgICAgICBpZiAoIWV2LT5wcmVlZGl0U3RyaW5nKCkuaXNFbXB0eSgpKQorICAg
ICAgICAgICAgICAgIGVkaXRvci0+c2V0Q29tcG9zaXRpb24oZXYtPnByZWVkaXRTdHJpbmcoKSwg
dW5kZXJsaW5lcywgcU1pbihhLnN0YXJ0LCAoYS5zdGFydCArIGEubGVuZ3RoKSksIHFNYXgoYS5z
dGFydCwgKGEuc3RhcnQgKyBhLmxlbmd0aCkpKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAg
ICAgICAgICAgIC8vIElmIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGEgY29tcG9zaXRpb24sIGFu
IGVtcHR5IHByZS1lZGl0IHN0cmluZyBhbmQgYSBzZWxlY3Rpb24gb2YgemVybworICAgICAgICAg
ICAgICAgIC8vIGNhbmNlbHMgdGhlIGN1cnJlbnQgY29tcG9zaXRpb24KKyAgICAgICAgICAgICAg
ICBpZiAoZWRpdG9yLT5oYXNDb21wb3NpdGlvbigpICYmIChhLnN0YXJ0ICsgYS5sZW5ndGggPT0g
MCkpCisgICAgICAgICAgICAgICAgICAgIGVkaXRvci0+c2V0Q29tcG9zaXRpb24oUVN0cmluZygp
LCB1bmRlcmxpbmVzLCAwLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
fQorICAgIH0KKworICAgIGlmIChub2RlICYmIGV2LT5yZXBsYWNlbWVudExlbmd0aCgpID4gMCkg
eworICAgICAgICBpbnQgY3Vyc29yUG9zID0gZnJhbWUtPnNlbGVjdGlvbigpLT5leHRlbnQoKS5v
ZmZzZXRJbkNvbnRhaW5lck5vZGUoKTsKKyAgICAgICAgaW50IHN0YXJ0ID0gY3Vyc29yUG9zICsg
ZXYtPnJlcGxhY2VtZW50U3RhcnQoKTsKKyAgICAgICAgaWYgKEhUTUxUZXh0Rm9ybUNvbnRyb2xF
bGVtZW50KiB0ZXh0Q29udHJvbCA9IHRvVGV4dEZvcm1Db250cm9sKG5vZGUpKQorICAgICAgICAg
ICAgdGV4dENvbnRyb2wtPnNldFNlbGVjdGlvblJhbmdlKHN0YXJ0LCBzdGFydCArIGV2LT5yZXBs
YWNlbWVudExlbmd0aCgpKTsKKyAgICAgICAgLy8gQ29tbWl0IHJlZ2FyZGxlc3Mgb2Ygd2hldGhl
ciBjb21taXRTdHJpbmcgaXMgZW1wdHksIHRvIGdldCByaWQgb2Ygc2VsZWN0aW9uLgorICAgICAg
ICBlZGl0b3ItPmNvbmZpcm1Db21wb3NpdGlvbihldi0+Y29tbWl0U3RyaW5nKCkpOworICAgIH0g
ZWxzZSBpZiAoIWV2LT5jb21taXRTdHJpbmcoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgaWYgKGVk
aXRvci0+aGFzQ29tcG9zaXRpb24oKSkKKyAgICAgICAgICAgIGVkaXRvci0+Y29uZmlybUNvbXBv
c2l0aW9uKGV2LT5jb21taXRTdHJpbmcoKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVk
aXRvci0+aW5zZXJ0VGV4dChldi0+Y29tbWl0U3RyaW5nKCksIDApOworICAgIH0gZWxzZSBpZiAo
IWhhc1NlbGVjdGlvbiAmJiAhZXYtPnByZWVkaXRTdHJpbmcoKS5pc0VtcHR5KCkpCisgICAgICAg
IGVkaXRvci0+c2V0Q29tcG9zaXRpb24oZXYtPnByZWVkaXRTdHJpbmcoKSwgdW5kZXJsaW5lcywg
MCwgMCk7CisgICAgZWxzZSBpZiAoZXYtPnByZWVkaXRTdHJpbmcoKS5pc0VtcHR5KCkgJiYgZWRp
dG9yLT5oYXNDb21wb3NpdGlvbigpKQorICAgICAgICBlZGl0b3ItPmNvbmZpcm1Db21wb3NpdGlv
bihTdHJpbmcoKSk7CisKKyAgICBldi0+YWNjZXB0KCk7Cit9CisKK1FWYXJpYW50IFFXZWJQYWdl
QWRhcHRlcjo6aW5wdXRNZXRob2RRdWVyeShRdDo6SW5wdXRNZXRob2RRdWVyeSBwcm9wZXJ0eSkg
Y29uc3QKK3sKKyAgICBGcmFtZSogZnJhbWUgPSBwYWdlLT5mb2N1c0NvbnRyb2xsZXIoKS0+Zm9j
dXNlZEZyYW1lKCk7CisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0dXJuIFFWYXJpYW50KCk7
CisKKyAgICBXZWJDb3JlOjpFZGl0b3IqIGVkaXRvciA9IGZyYW1lLT5lZGl0b3IoKTsKKworICAg
IFJlbmRlck9iamVjdCogcmVuZGVyZXIgPSAwOworICAgIFJlbmRlclRleHRDb250cm9sKiByZW5k
ZXJUZXh0Q29udHJvbCA9IDA7CisKKyAgICBpZiAoZnJhbWUtPnNlbGVjdGlvbigpLT5yb290RWRp
dGFibGVFbGVtZW50KCkpCisgICAgICAgIHJlbmRlcmVyID0gZnJhbWUtPnNlbGVjdGlvbigpLT5y
b290RWRpdGFibGVFbGVtZW50KCktPnNoYWRvd0FuY2VzdG9yTm9kZSgpLT5yZW5kZXJlcigpOwor
CisgICAgaWYgKHJlbmRlcmVyICYmIHJlbmRlcmVyLT5pc1RleHRDb250cm9sKCkpCisgICAgICAg
IHJlbmRlclRleHRDb250cm9sID0gdG9SZW5kZXJUZXh0Q29udHJvbChyZW5kZXJlcik7CisKKyAg
ICBzd2l0Y2ggKHByb3BlcnR5KSB7CisgICAgICAgIGNhc2UgUXQ6OkltTWljcm9Gb2N1czogewor
ICAgICAgICAgICAgV2ViQ29yZTo6RnJhbWVWaWV3KiB2aWV3ID0gZnJhbWUtPnZpZXcoKTsKKyAg
ICAgICAgICAgIGlmICh2aWV3ICYmIHZpZXctPm5lZWRzTGF5b3V0KCkpIHsKKyAgICAgICAgICAg
ICAgICAvLyBXZSBjYW4ndCBhY2Nlc3MgYWJzb2x1dGVDYXJldEJvdW5kcygpIHdoaWxlIHRoZSB2
aWV3IG5lZWRzIHRvIGxheW91dC4KKyAgICAgICAgICAgICAgICByZXR1cm4gUVZhcmlhbnQoKTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBRVmFyaWFudCh2aWV3LT5jb250ZW50
c1RvV2luZG93KGZyYW1lLT5zZWxlY3Rpb24oKS0+YWJzb2x1dGVDYXJldEJvdW5kcygpKSk7Cisg
ICAgICAgIH0KKyAgICAgICAgY2FzZSBRdDo6SW1Gb250OiB7CisgICAgICAgICAgICBpZiAocmVu
ZGVyVGV4dENvbnRyb2wpIHsKKyAgICAgICAgICAgICAgICBSZW5kZXJTdHlsZSogcmVuZGVyU3R5
bGUgPSByZW5kZXJUZXh0Q29udHJvbC0+c3R5bGUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4g
UVZhcmlhbnQoUUZvbnQocmVuZGVyU3R5bGUtPmZvbnQoKS5zeW50aGV0aWNGb250KCkpKTsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBRVmFyaWFudChRRm9udCgpKTsKKyAgICAg
ICAgfQorICAgICAgICBjYXNlIFF0OjpJbUN1cnNvclBvc2l0aW9uOiB7CisgICAgICAgICAgICBp
ZiAoZWRpdG9yLT5oYXNDb21wb3NpdGlvbigpKQorICAgICAgICAgICAgICAgIHJldHVybiBRVmFy
aWFudChmcmFtZS0+c2VsZWN0aW9uKCktPmVuZCgpLm9mZnNldEluQ29udGFpbmVyTm9kZSgpKTsK
KyAgICAgICAgICAgIHJldHVybiBRVmFyaWFudChmcmFtZS0+c2VsZWN0aW9uKCktPmV4dGVudCgp
Lm9mZnNldEluQ29udGFpbmVyTm9kZSgpKTsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFF0OjpJ
bVN1cnJvdW5kaW5nVGV4dDogeworICAgICAgICAgICAgaWYgKHJlbmRlclRleHRDb250cm9sICYm
IHJlbmRlclRleHRDb250cm9sLT50ZXh0Rm9ybUNvbnRyb2xFbGVtZW50KCkpIHsKKyAgICAgICAg
ICAgICAgICBRU3RyaW5nIHRleHQgPSByZW5kZXJUZXh0Q29udHJvbC0+dGV4dEZvcm1Db250cm9s
RWxlbWVudCgpLT52YWx1ZSgpOworICAgICAgICAgICAgICAgIFJlZlB0cjxSYW5nZT4gcmFuZ2Ug
PSBlZGl0b3ItPmNvbXBvc2l0aW9uUmFuZ2UoKTsKKyAgICAgICAgICAgICAgICBpZiAocmFuZ2Up
CisgICAgICAgICAgICAgICAgICAgIHRleHQucmVtb3ZlKHJhbmdlLT5zdGFydFBvc2l0aW9uKCku
b2Zmc2V0SW5Db250YWluZXJOb2RlKCksIFRleHRJdGVyYXRvcjo6cmFuZ2VMZW5ndGgocmFuZ2Uu
Z2V0KCkpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gUVZhcmlhbnQodGV4dCk7CisgICAgICAg
ICAgICB9CisgICAgICAgICAgICByZXR1cm4gUVZhcmlhbnQoKTsKKyAgICAgICAgfQorICAgICAg
ICBjYXNlIFF0OjpJbUN1cnJlbnRTZWxlY3Rpb246IHsKKyAgICAgICAgICAgIGlmICghZWRpdG9y
LT5oYXNDb21wb3NpdGlvbigpICYmIHJlbmRlclRleHRDb250cm9sICYmIHJlbmRlclRleHRDb250
cm9sLT50ZXh0Rm9ybUNvbnRyb2xFbGVtZW50KCkpIHsKKyAgICAgICAgICAgICAgICBpbnQgc3Rh
cnQgPSBmcmFtZS0+c2VsZWN0aW9uKCktPnN0YXJ0KCkub2Zmc2V0SW5Db250YWluZXJOb2RlKCk7
CisgICAgICAgICAgICAgICAgaW50IGVuZCA9IGZyYW1lLT5zZWxlY3Rpb24oKS0+ZW5kKCkub2Zm
c2V0SW5Db250YWluZXJOb2RlKCk7CisgICAgICAgICAgICAgICAgaWYgKGVuZCA+IHN0YXJ0KQor
ICAgICAgICAgICAgICAgICAgICByZXR1cm4gUVZhcmlhbnQoUVN0cmluZyhyZW5kZXJUZXh0Q29u
dHJvbC0+dGV4dEZvcm1Db250cm9sRWxlbWVudCgpLT52YWx1ZSgpKS5taWQoc3RhcnQsIGVuZCAt
IHN0YXJ0KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gUVZhcmlhbnQoKTsK
KworICAgICAgICB9CisgICAgICAgIGNhc2UgUXQ6OkltQW5jaG9yUG9zaXRpb246IHsKKyAgICAg
ICAgICAgIGlmIChlZGl0b3ItPmhhc0NvbXBvc2l0aW9uKCkpCisgICAgICAgICAgICAgICAgcmV0
dXJuIFFWYXJpYW50KGZyYW1lLT5zZWxlY3Rpb24oKS0+c3RhcnQoKS5vZmZzZXRJbkNvbnRhaW5l
ck5vZGUoKSk7CisgICAgICAgICAgICByZXR1cm4gUVZhcmlhbnQoZnJhbWUtPnNlbGVjdGlvbigp
LT5iYXNlKCkub2Zmc2V0SW5Db250YWluZXJOb2RlKCkpOworICAgICAgICB9CisgICAgICAgIGNh
c2UgUXQ6OkltTWF4aW11bVRleHRMZW5ndGg6IHsKKyAgICAgICAgICAgIGlmIChmcmFtZS0+c2Vs
ZWN0aW9uKCktPmlzQ29udGVudEVkaXRhYmxlKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZnJh
bWUtPmRvY3VtZW50KCkgJiYgZnJhbWUtPmRvY3VtZW50KCktPmZvY3VzZWROb2RlKCkpIHsKKyAg
ICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lLT5kb2N1bWVudCgpLT5mb2N1c2VkTm9kZSgpLT5o
YXNUYWdOYW1lKEhUTUxOYW1lczo6aW5wdXRUYWcpKSB7CisgICAgICAgICAgICAgICAgICAgICAg
ICBIVE1MSW5wdXRFbGVtZW50KiBpbnB1dEVsZW1lbnQgPSBzdGF0aWNfY2FzdDxIVE1MSW5wdXRF
bGVtZW50Kj4oZnJhbWUtPmRvY3VtZW50KCktPmZvY3VzZWROb2RlKCkpOworICAgICAgICAgICAg
ICAgICAgICAgICAgcmV0dXJuIFFWYXJpYW50KGlucHV0RWxlbWVudC0+bWF4TGVuZ3RoKCkpOwor
ICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAg
IHJldHVybiBRVmFyaWFudChIVE1MSW5wdXRFbGVtZW50OjptYXhpbXVtTGVuZ3RoKTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBRVmFyaWFudCgwKTsKKyAgICAgICAgfQorICAg
ICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIFFWYXJpYW50KCk7CisgICAgfQorfQor
Cit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgY2hhciogbmFtZTsKKyAgICBkb3VibGUgZGVm
ZXJyZWRSZXBhaW50RGVsYXk7CisgICAgZG91YmxlIGluaXRpYWxEZWZlcnJlZFJlcGFpbnREZWxh
eUR1cmluZ0xvYWRpbmc7CisgICAgZG91YmxlIG1heERlZmVycmVkUmVwYWludERlbGF5RHVyaW5n
TG9hZGluZzsKKyAgICBkb3VibGUgZGVmZXJyZWRSZXBhaW50RGVsYXlJbmNyZW1lbnREdXJpbmdM
b2FkaW5nOworfSBRUmVwYWludFRocm90dGxpbmdQcmVzZXQ7CisKK3ZvaWQgUVdlYlBhZ2VBZGFw
dGVyOjpkeW5hbWljUHJvcGVydHlDaGFuZ2VFdmVudChRT2JqZWN0KiBvYmosIFFEeW5hbWljUHJv
cGVydHlDaGFuZ2VFdmVudCogZXZlbnQpCit7CisgICAgaWYgKGV2ZW50LT5wcm9wZXJ0eU5hbWUo
KSA9PSAiX3Ffdmlld01vZGUiKSB7CisgICAgICAgIHBhZ2UtPnNldFZpZXdNb2RlKFBhZ2U6OnN0
cmluZ1RvVmlld01vZGUob2JqLT5wcm9wZXJ0eSgiX3Ffdmlld01vZGUiKS50b1N0cmluZygpKSk7
CisgICAgfSBlbHNlIGlmIChldmVudC0+cHJvcGVydHlOYW1lKCkgPT0gIl9xX0hUTUxUb2tlbml6
ZXJDaHVua1NpemUiKSB7CisgICAgICAgIGludCBjaHVua1NpemUgPSBvYmotPnByb3BlcnR5KCJf
cV9IVE1MVG9rZW5pemVyQ2h1bmtTaXplIikudG9JbnQoKTsKKyAgICAgICAgcGFnZS0+c2V0Q3Vz
dG9tSFRNTFRva2VuaXplckNodW5rU2l6ZShjaHVua1NpemUpOworICAgIH0gZWxzZSBpZiAoZXZl
bnQtPnByb3BlcnR5TmFtZSgpID09ICJfcV9IVE1MVG9rZW5pemVyVGltZURlbGF5IikgeworICAg
ICAgICBkb3VibGUgdGltZURlbGF5ID0gb2JqLT5wcm9wZXJ0eSgiX3FfSFRNTFRva2VuaXplclRp
bWVEZWxheSIpLnRvRG91YmxlKCk7CisgICAgICAgIHBhZ2UtPnNldEN1c3RvbUhUTUxUb2tlbml6
ZXJUaW1lRGVsYXkodGltZURlbGF5KTsKKyAgICB9IGVsc2UgaWYgKGV2ZW50LT5wcm9wZXJ0eU5h
bWUoKSA9PSAiX3FfUmVwYWludFRocm90dGxpbmdEZWZlcnJlZFJlcGFpbnREZWxheSIpIHsKKyAg
ICAgICAgZG91YmxlIHAgPSBvYmotPnByb3BlcnR5KCJfcV9SZXBhaW50VGhyb3R0bGluZ0RlZmVy
cmVkUmVwYWludERlbGF5IikudG9Eb3VibGUoKTsKKyAgICAgICAgRnJhbWVWaWV3OjpzZXRSZXBh
aW50VGhyb3R0bGluZ0RlZmVycmVkUmVwYWludERlbGF5KHApOworICAgIH0gZWxzZSBpZiAoZXZl
bnQtPnByb3BlcnR5TmFtZSgpID09ICJfcV9SZXBhaW50VGhyb3R0bGluZ25Jbml0aWFsRGVmZXJy
ZWRSZXBhaW50RGVsYXlEdXJpbmdMb2FkaW5nIikgeworICAgICAgICBkb3VibGUgcCA9IG9iai0+
cHJvcGVydHkoIl9xX1JlcGFpbnRUaHJvdHRsaW5nbkluaXRpYWxEZWZlcnJlZFJlcGFpbnREZWxh
eUR1cmluZ0xvYWRpbmciKS50b0RvdWJsZSgpOworICAgICAgICBGcmFtZVZpZXc6OnNldFJlcGFp
bnRUaHJvdHRsaW5nbkluaXRpYWxEZWZlcnJlZFJlcGFpbnREZWxheUR1cmluZ0xvYWRpbmcocCk7
CisgICAgfSBlbHNlIGlmIChldmVudC0+cHJvcGVydHlOYW1lKCkgPT0gIl9xX1JlcGFpbnRUaHJv
dHRsaW5nTWF4RGVmZXJyZWRSZXBhaW50RGVsYXlEdXJpbmdMb2FkaW5nIikgeworICAgICAgICBk
b3VibGUgcCA9IG9iai0+cHJvcGVydHkoIl9xX1JlcGFpbnRUaHJvdHRsaW5nTWF4RGVmZXJyZWRS
ZXBhaW50RGVsYXlEdXJpbmdMb2FkaW5nIikudG9Eb3VibGUoKTsKKyAgICAgICAgRnJhbWVWaWV3
OjpzZXRSZXBhaW50VGhyb3R0bGluZ01heERlZmVycmVkUmVwYWludERlbGF5RHVyaW5nTG9hZGlu
ZyhwKTsKKyAgICB9IGVsc2UgaWYgKGV2ZW50LT5wcm9wZXJ0eU5hbWUoKSA9PSAiX3FfUmVwYWlu
dFRocm90dGxpbmdEZWZlcnJlZFJlcGFpbnREZWxheUluY3JlbWVudER1cmluZ0xvYWRpbmciKSB7
CisgICAgICAgIGRvdWJsZSBwID0gb2JqLT5wcm9wZXJ0eSgiX3FfUmVwYWludFRocm90dGxpbmdE
ZWZlcnJlZFJlcGFpbnREZWxheUluY3JlbWVudER1cmluZ0xvYWRpbmciKS50b0RvdWJsZSgpOwor
ICAgICAgICBGcmFtZVZpZXc6OnNldFJlcGFpbnRUaHJvdHRsaW5nRGVmZXJyZWRSZXBhaW50RGVs
YXlJbmNyZW1lbnREdXJpbmdMb2FkaW5nKHApOworICAgIH0gZWxzZSBpZiAoZXZlbnQtPnByb3Bl
cnR5TmFtZSgpID09ICJfcV9SZXBhaW50VGhyb3R0bGluZ1ByZXNldCIpIHsKKyAgICAgICAgc3Rh
dGljIGNvbnN0IFFSZXBhaW50VGhyb3R0bGluZ1ByZXNldCBwcmVzZXRzW10gPSB7CisgICAgICAg
ICAgICB7ICAgIk5vVGhyb3R0bGluZyIsICAgICAwLCAgICAgIDAsICAgICAgMCwgICAgICAwIH0s
CisgICAgICAgICAgICB7ICAgIkxlZ2FjeSIsICAgICAgIDAuMDI1LCAgICAgIDAsICAgIDIuNSwg
ICAgMC41IH0sCisgICAgICAgICAgICB7ICAgIk1pbmltYWwiLCAgICAgICAwLjAxLCAgICAgIDAs
ICAgICAgMSwgICAgMC4yIH0sCisgICAgICAgICAgICB7ICAgIk1lZGl1bSIsICAgICAgIDAuMDI1
LCAgICAgIDEsICAgICAgNSwgICAgMC41IH0sCisgICAgICAgICAgICB7ICAgIkhlYXZ5IiwgICAg
ICAgICAgMC4xLCAgICAgIDIsICAgICAxMCwgICAgICAxIH0KKyAgICAgICAgfTsKKworICAgICAg
ICBRU3RyaW5nIHAgPSBvYmotPnByb3BlcnR5KCJfcV9SZXBhaW50VGhyb3R0bGluZ1ByZXNldCIp
LnRvU3RyaW5nKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKHByZXNl
dHMpIC8gc2l6ZW9mKHByZXNldHNbMF0pOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChwID09IFFM
YXRpbjFTdHJpbmcocHJlc2V0c1tpXS5uYW1lKSkgeworICAgICAgICAgICAgICAgIEZyYW1lVmll
dzo6c2V0UmVwYWludFRocm90dGxpbmdEZWZlcnJlZFJlcGFpbnREZWxheSgKKyAgICAgICAgICAg
ICAgICAgICAgICAgIHByZXNldHNbaV0uZGVmZXJyZWRSZXBhaW50RGVsYXkpOworICAgICAgICAg
ICAgICAgIEZyYW1lVmlldzo6c2V0UmVwYWludFRocm90dGxpbmduSW5pdGlhbERlZmVycmVkUmVw
YWludERlbGF5RHVyaW5nTG9hZGluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXNldHNb
aV0uaW5pdGlhbERlZmVycmVkUmVwYWludERlbGF5RHVyaW5nTG9hZGluZyk7CisgICAgICAgICAg
ICAgICAgRnJhbWVWaWV3OjpzZXRSZXBhaW50VGhyb3R0bGluZ01heERlZmVycmVkUmVwYWludERl
bGF5RHVyaW5nTG9hZGluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXNldHNbaV0ubWF4
RGVmZXJyZWRSZXBhaW50RGVsYXlEdXJpbmdMb2FkaW5nKTsKKyAgICAgICAgICAgICAgICBGcmFt
ZVZpZXc6OnNldFJlcGFpbnRUaHJvdHRsaW5nRGVmZXJyZWRSZXBhaW50RGVsYXlJbmNyZW1lbnRE
dXJpbmdMb2FkaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2V0c1tpXS5kZWZlcnJl
ZFJlcGFpbnREZWxheUluY3JlbWVudER1cmluZ0xvYWRpbmcpOworICAgICAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKGV2ZW50
LT5wcm9wZXJ0eU5hbWUoKSA9PSAiX3Ffd2ViSW5zcGVjdG9yU2VydmVyUG9ydCIpIHsKKyNpZiBF
TkFCTEUoSU5TUEVDVE9SKQorICAgICAgICBRVmFyaWFudCBwb3J0ID0gb2JqLT5wcm9wZXJ0eSgi
X3Ffd2ViSW5zcGVjdG9yU2VydmVyUG9ydCIpOworICAgICAgICBpZiAocG9ydC5pc1ZhbGlkKCkp
IHsKKyAgICAgICAgICAgIEluc3BlY3RvclNlcnZlclF0KiBpbnNwZWN0b3JTZXJ2ZXIgPSBJbnNw
ZWN0b3JTZXJ2ZXJRdDo6c2VydmVyKCk7CisgICAgICAgICAgICBpbnNwZWN0b3JTZXJ2ZXItPmxp
c3Rlbihwb3J0LnRvSW50KCkpOworICAgICAgICB9CisjZW5kaWYKKyAgICB9IGVsc2UgaWYgKGV2
ZW50LT5wcm9wZXJ0eU5hbWUoKSA9PSAiX3FfZGVhZERlY29kZWREYXRhRGVsZXRpb25JbnRlcnZh
bCIpIHsKKyAgICAgICAgZG91YmxlIGludGVydmFsID0gb2JqLT5wcm9wZXJ0eSgiX3FfZGVhZERl
Y29kZWREYXRhRGVsZXRpb25JbnRlcnZhbCIpLnRvRG91YmxlKCk7CisgICAgICAgIG1lbW9yeUNh
Y2hlKCktPnNldERlYWREZWNvZGVkRGF0YURlbGV0aW9uSW50ZXJ2YWwoaW50ZXJ2YWwpOworICAg
IH0KK30KKworI2VuZGlmIC8vIFFUX05PX0RSQUdBTkREUk9QCisKKyNkZWZpbmUgTUFQX0FDVElP
Tl9GUk9NX1ZBTFVFKE5hbWUsIFZhbHVlKSBcCisgICAgY2FzZSBWYWx1ZTogcmV0dXJuIFFXZWJQ
YWdlQWRhcHRlcjo6TmFtZQorCitzdGF0aWMgUVdlYlBhZ2VBZGFwdGVyOjpNZW51QWN0aW9uIGFk
YXB0ZXJBY3Rpb25Gb3JDb250ZXh0TWVudUFjdGlvbihXZWJDb3JlOjpDb250ZXh0TWVudUFjdGlv
biBhY3Rpb24pCit7CisgICAgc3dpdGNoKGFjdGlvbikgeworICAgIEZPUl9FQUNIX01BUFBFRF9N
RU5VX0FDVElPTihNQVBfQUNUSU9OX0ZST01fVkFMVUUsIFNFTUlDT0xPTl9TRVBBUkFUT1IpOwor
I2lmIEVOQUJMRShJTlNQRUNUT1IpCisgICAgY2FzZSBXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW1U
YWdJbnNwZWN0RWxlbWVudDogcmV0dXJuIFFXZWJQYWdlQWRhcHRlcjo6SW5zcGVjdEVsZW1lbnQ7
CisjZW5kaWYKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJu
IFFXZWJQYWdlQWRhcHRlcjo6Tm9BY3Rpb247Cit9CisKK1FMaXN0PE1lbnVJdGVtPiBkZXNjcmlw
dGlvbkZvclBsYXRmb3JtTWVudShjb25zdCBRTGlzdDxDb250ZXh0TWVudUl0ZW0+KiBpdGVtcywg
UGFnZSogcGFnZSkKK3sKKyAgICBRTGlzdDxNZW51SXRlbT4gaXRlbURlc2NyaXB0aW9uczsKKyAg
ICBpZiAoIWl0ZW1zKQorICAgICAgICByZXR1cm4gaXRlbURlc2NyaXB0aW9uczsKKyAgICBmb3Ig
KGludCBpID0gMDsgaSA8IGl0ZW1zLT5jb3VudCgpOyArK2kpIHsKKyAgICAgICAgY29uc3QgQ29u
dGV4dE1lbnVJdGVtICZpdGVtID0gaXRlbXMtPmF0KGkpOworICAgICAgICBNZW51SXRlbSBkZXNj
cmlwdGlvbjsKKyAgICAgICAgc3dpdGNoIChpdGVtLnR5cGUoKSkgeworICAgICAgICBjYXNlIFdl
YkNvcmU6OkNoZWNrYWJsZUFjdGlvblR5cGU6IC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgICBj
YXNlIFdlYkNvcmU6OkFjdGlvblR5cGU6IHsKKyAgICAgICAgICAgIFFXZWJQYWdlQWRhcHRlcjo6
TWVudUFjdGlvbiBhY3Rpb24gPSBhZGFwdGVyQWN0aW9uRm9yQ29udGV4dE1lbnVBY3Rpb24oaXRl
bS5hY3Rpb24oKSk7CisgICAgICAgICAgICBpZiAoYWN0aW9uID4gUVdlYlBhZ2VBZGFwdGVyOjpO
b0FjdGlvbikgeworICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLnR5cGUgPSBNZW51SXRlbTo6
QWN0aW9uOworICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLmFjdGlvbiA9IGFjdGlvbjsKKyAg
ICAgICAgICAgICAgICBDb250ZXh0TWVudUl0ZW0gaXQoaXRlbSk7CisgICAgICAgICAgICAgICAg
cGFnZS0+Y29udGV4dE1lbnVDb250cm9sbGVyKCktPmNoZWNrT3JFbmFibGVJZk5lZWRlZChpdCk7
CisgICAgICAgICAgICAgICAgUGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uIGRlc2MgPSBpdC5y
ZWxlYXNlUGxhdGZvcm1EZXNjcmlwdGlvbigpOworICAgICAgICAgICAgICAgIGlmIChkZXNjLmVu
YWJsZWQpCisgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLnRyYWl0cyB8PSBNZW51SXRl
bTo6RW5hYmxlZDsKKyAgICAgICAgICAgICAgICBpZiAoaXRlbS50eXBlKCkgPT0gV2ViQ29yZTo6
Q2hlY2thYmxlQWN0aW9uVHlwZSkgeworICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbi50
cmFpdHMgfD0gTWVudUl0ZW06OkNoZWNrYWJsZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRl
c2MuY2hlY2tlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLnRyYWl0cyB8
PSBNZW51SXRlbTo6Q2hlY2tlZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9Cisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFdlYkNvcmU6OlNlcGFy
YXRvclR5cGU6CisgICAgICAgICAgICBkZXNjcmlwdGlvbi50eXBlID0gTWVudUl0ZW06OlNlcGFy
YXRvcjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdlYkNvcmU6OlN1Ym1lbnVU
eXBlOiB7CisgICAgICAgICAgICBkZXNjcmlwdGlvbi50eXBlID0gTWVudUl0ZW06OlN1Yk1lbnU7
CisgICAgICAgICAgICBkZXNjcmlwdGlvbi5zdWJNZW51ID0gZGVzY3JpcHRpb25Gb3JQbGF0Zm9y
bU1lbnUoaXRlbS5wbGF0Zm9ybVN1Yk1lbnUoKSwgcGFnZSk7CisgICAgICAgICAgICBkZXNjcmlw
dGlvbi5zdWJNZW51VGl0bGUgPSBpdGVtLnRpdGxlKCk7CisgICAgICAgICAgICAvLyBEb24ndCBh
cHBlbmQgZW1wdHkgc3VibWVudSBkZXNjcmlwdGlvbnMuCisgICAgICAgICAgICBpZiAoZGVzY3Jp
cHRpb24uc3ViTWVudS5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAg
ICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZGVzY3JpcHRpb24udHlwZSA+IE1lbnVJdGVt
OjpOb1R5cGUpCisgICAgICAgICAgICBpdGVtRGVzY3JpcHRpb25zLmFwcGVuZChkZXNjcmlwdGlv
bik7CisgICAgfQorICAgIHJldHVybiBpdGVtRGVzY3JpcHRpb25zOworfQorCitRV2ViSGl0VGVz
dFJlc3VsdFByaXZhdGUqIFFXZWJQYWdlQWRhcHRlcjo6dXBkYXRlUG9zaXRpb25EZXBlbmRlbnRN
ZW51QWN0aW9ucyhjb25zdCBRUG9pbnQmIHBvcywgUUJpdEFycmF5KiB2aXNpdGVkV2ViQWN0aW9u
cykKK3sKKyAgICBBU1NFUlQodmlzaXRlZFdlYkFjdGlvbnMpOworICAgIFdlYkNvcmU6OkZyYW1l
KiBmb2N1c2VkRnJhbWUgPSBwYWdlLT5mb2N1c0NvbnRyb2xsZXIoKS0+Zm9jdXNlZE9yTWFpbkZy
YW1lKCk7CisgICAgSGl0VGVzdFJlc3VsdCByZXN1bHQgPSBmb2N1c2VkRnJhbWUtPmV2ZW50SGFu
ZGxlcigpLT5oaXRUZXN0UmVzdWx0QXRQb2ludChmb2N1c2VkRnJhbWUtPnZpZXcoKS0+d2luZG93
VG9Db250ZW50cyhwb3MpLCAvKmFsbG93U2hhZG93Q29udGVudCovIGZhbHNlKTsKKyAgICBwYWdl
LT5jb250ZXh0TWVudUNvbnRyb2xsZXIoKS0+c2V0SGl0VGVzdFJlc3VsdChyZXN1bHQpOworCisj
aWYgRU5BQkxFKElOU1BFQ1RPUikKKyAgICBpZiAocGFnZS0+aW5zcGVjdG9yQ29udHJvbGxlcigp
LT5lbmFibGVkKCkpCisgICAgICAgIHBhZ2UtPmNvbnRleHRNZW51Q29udHJvbGxlcigpLT5hZGRJ
bnNwZWN0RWxlbWVudEl0ZW0oKTsKKyNlbmRpZgorCisgICAgV2ViQ29yZTo6Q29udGV4dE1lbnUq
IHdlYmNvcmVNZW51ID0gcGFnZS0+Y29udGV4dE1lbnVDb250cm9sbGVyKCktPmNvbnRleHRNZW51
KCk7CisgICAgUUxpc3Q8TWVudUl0ZW0+IGl0ZW1EZXNjcmlwdGlvbnM7CisgICAgaWYgKGNsaWVu
dCAmJiB3ZWJjb3JlTWVudSkKKyAgICAgICAgaXRlbURlc2NyaXB0aW9ucyA9IGRlc2NyaXB0aW9u
Rm9yUGxhdGZvcm1NZW51KHdlYmNvcmVNZW51LT5wbGF0Zm9ybURlc2NyaXB0aW9uKCksIHBhZ2Up
OworICAgIGNyZWF0ZUFuZFNldEN1cnJlbnRDb250ZXh0TWVudShpdGVtRGVzY3JpcHRpb25zLCB2
aXNpdGVkV2ViQWN0aW9ucyk7CisgICAgaWYgKHJlc3VsdC5zY3JvbGxiYXIoKSkKKyAgICAgICAg
cmV0dXJuIDA7CisgICAgcmV0dXJuIG5ldyBRV2ViSGl0VGVzdFJlc3VsdFByaXZhdGUocmVzdWx0
KTsKK30KKworc3RhdGljIHZvaWQgZXh0cmFjdENvbnRlbnRUeXBlRnJvbUhhc2goY29uc3QgSGFz
aFNldDxTdHJpbmc+JiB0eXBlcywgUVN0cmluZ0xpc3QqIGxpc3QpCit7CisgICAgaWYgKCFsaXN0
KQorICAgICAgICByZXR1cm47CisKKyAgICBIYXNoU2V0PFN0cmluZz46OmNvbnN0X2l0ZXJhdG9y
IGVuZEl0ID0gdHlwZXMuZW5kKCk7CisgICAgZm9yIChIYXNoU2V0PFN0cmluZz46OmNvbnN0X2l0
ZXJhdG9yIGl0ID0gdHlwZXMuYmVnaW4oKTsgaXQgIT0gZW5kSXQ7ICsraXQpCisgICAgICAgICps
aXN0IDw8ICppdDsKK30KKworc3RhdGljIHZvaWQgZXh0cmFjdENvbnRlbnRUeXBlRnJvbVBsdWdp
blZlY3Rvcihjb25zdCBWZWN0b3I8UGx1Z2luUGFja2FnZSo+JiBwbHVnaW5zLCBRU3RyaW5nTGlz
dCogbGlzdCkKK3sKKyAgICBpZiAoIWxpc3QpCisgICAgICAgIHJldHVybjsKKworICAgIGZvciAo
dW5zaWduZWQgaW50IGkgPSAwOyBpIDwgcGx1Z2lucy5zaXplKCk7ICsraSkgeworICAgICAgICBN
SU1FVG9EZXNjcmlwdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIG1hcF9pdCA9IHBsdWdpbnNbaV0t
Pm1pbWVUb0Rlc2NyaXB0aW9ucygpLmJlZ2luKCk7CisgICAgICAgIE1JTUVUb0Rlc2NyaXB0aW9u
c01hcDo6Y29uc3RfaXRlcmF0b3IgbWFwX2VuZCA9IHBsdWdpbnNbaV0tPm1pbWVUb0Rlc2NyaXB0
aW9ucygpLmVuZCgpOworICAgICAgICBmb3IgKDsgbWFwX2l0ICE9IG1hcF9lbmQ7ICsrbWFwX2l0
KQorICAgICAgICAgICAgKmxpc3QgPDwgbWFwX2l0LT5rZXk7CisgICAgfQorfQorCitRU3RyaW5n
TGlzdCBRV2ViUGFnZUFkYXB0ZXI6OnN1cHBvcnRlZENvbnRlbnRUeXBlcygpIGNvbnN0Cit7Cisg
ICAgUVN0cmluZ0xpc3QgbWltZVR5cGVzOworCisgICAgZXh0cmFjdENvbnRlbnRUeXBlRnJvbUhh
c2goTUlNRVR5cGVSZWdpc3RyeTo6Z2V0U3VwcG9ydGVkSW1hZ2VNSU1FVHlwZXMoKSwgJm1pbWVU
eXBlcyk7CisgICAgZXh0cmFjdENvbnRlbnRUeXBlRnJvbUhhc2goTUlNRVR5cGVSZWdpc3RyeTo6
Z2V0U3VwcG9ydGVkTm9uSW1hZ2VNSU1FVHlwZXMoKSwgJm1pbWVUeXBlcyk7CisgICAgaWYgKHBh
Z2UtPnNldHRpbmdzKCkgJiYgcGFnZS0+c2V0dGluZ3MoKS0+YXJlUGx1Z2luc0VuYWJsZWQoKSkK
KyAgICAgICAgZXh0cmFjdENvbnRlbnRUeXBlRnJvbVBsdWdpblZlY3RvcihQbHVnaW5EYXRhYmFz
ZTo6aW5zdGFsbGVkUGx1Z2lucygpLT5wbHVnaW5zKCksICZtaW1lVHlwZXMpOworCisgICAgcmV0
dXJuIG1pbWVUeXBlczsKK30KKwordm9pZCBRV2ViUGFnZUFkYXB0ZXI6Ol9xX2NsZWFudXBMZWFr
TWVzc2FnZXMoKQoreworI2lmbmRlZiBOREVCVUcKKyAgICAvLyBOZWVkIHRoaXMgdG8gbWFrZSBs
ZWFrIG1lc3NhZ2VzIGFjY3VyYXRlLgorICAgIG1lbW9yeUNhY2hlKCktPnNldENhcGFjaXRpZXMo
MCwgMCwgMCk7CisjZW5kaWYKK30KKwordm9pZCBRV2ViUGFnZUFkYXB0ZXI6Ol9xX29uTG9hZFBy
b2dyZXNzQ2hhbmdlZChpbnQpCit7CisgICAgbV90b3RhbEJ5dGVzID0gcGFnZS0+cHJvZ3Jlc3Mo
KS0+dG90YWxQYWdlQW5kUmVzb3VyY2VCeXRlc1RvTG9hZCgpOworICAgIG1fYnl0ZXNSZWNlaXZl
ZCA9IHBhZ2UtPnByb2dyZXNzKCktPnRvdGFsQnl0ZXNSZWNlaXZlZCgpOworfQorCitib29sIFFX
ZWJQYWdlQWRhcHRlcjo6c3VwcG9ydHNDb250ZW50VHlwZShjb25zdCBRU3RyaW5nJiBtaW1lVHlw
ZSkgY29uc3QKK3sKKyAgICBjb25zdCBTdHJpbmcgdHlwZSA9IG1pbWVUeXBlLnRvTG93ZXIoKTsK
KyAgICBpZiAoTUlNRVR5cGVSZWdpc3RyeTo6aXNTdXBwb3J0ZWRJbWFnZU1JTUVUeXBlKHR5cGUp
KQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGlmIChNSU1FVHlwZVJlZ2lzdHJ5Ojppc1N1
cHBvcnRlZE5vbkltYWdlTUlNRVR5cGUodHlwZSkpCisgICAgICAgIHJldHVybiB0cnVlOworCisg
ICAgaWYgKHBhZ2UtPnNldHRpbmdzKCkgJiYgcGFnZS0+c2V0dGluZ3MoKS0+YXJlUGx1Z2luc0Vu
YWJsZWQoKQorICAgICAgICAmJiBQbHVnaW5EYXRhYmFzZTo6aW5zdGFsbGVkUGx1Z2lucygpLT5p
c01JTUVUeXBlUmVnaXN0ZXJlZCh0eXBlKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBy
ZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgUVdlYlBhZ2VBZGFwdGVyOjpkaWRTaG93SW5zcGVjdG9y
KCkKK3sKKyNpZiBFTkFCTEUoSU5TUEVDVE9SKQorICAgIHBhZ2UtPmluc3BlY3RvckNvbnRyb2xs
ZXIoKS0+c2hvdygpOworI2VuZGlmCit9CisKK3ZvaWQgUVdlYlBhZ2VBZGFwdGVyOjpkaWRDbG9z
ZUluc3BlY3RvcigpCit7CisjaWYgRU5BQkxFKElOU1BFQ1RPUikKKyAgICBwYWdlLT5pbnNwZWN0
b3JDb250cm9sbGVyKCktPmNsb3NlKCk7CisjZW5kaWYKK30KKwordm9pZCBRV2ViUGFnZUFkYXB0
ZXI6OnVwZGF0ZUFjdGlvbkludGVybmFsKFFXZWJQYWdlQWRhcHRlcjo6TWVudUFjdGlvbiBhY3Rp
b24sIGNvbnN0IGNoYXIgKmNvbW1hbmROYW1lLCBib29sICplbmFibGVkLCBib29sICpjaGVja2Vk
KQoreworICAgIFdlYkNvcmU6OkZyYW1lTG9hZGVyICpsb2FkZXIgPSBtYWluRnJhbWVBZGFwdGVy
KCktPmZyYW1lLT5sb2FkZXIoKTsKKyAgICBXZWJDb3JlOjpFZGl0b3IgKmVkaXRvciA9IHBhZ2Ut
PmZvY3VzQ29udHJvbGxlcigpLT5mb2N1c2VkT3JNYWluRnJhbWUoKS0+ZWRpdG9yKCk7CisKKyAg
ICBzd2l0Y2ggKGFjdGlvbikgeworICAgICAgICBjYXNlIFFXZWJQYWdlQWRhcHRlcjo6QmFjazoK
KyAgICAgICAgICAgICplbmFibGVkID0gcGFnZS0+Y2FuR29CYWNrT3JGb3J3YXJkKC0xKTsKKyAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFFXZWJQYWdlQWRhcHRlcjo6Rm9yd2FyZDoK
KyAgICAgICAgICAgICplbmFibGVkID0gcGFnZS0+Y2FuR29CYWNrT3JGb3J3YXJkKDEpOworICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUVdlYlBhZ2VBZGFwdGVyOjpTdG9wOgorICAg
ICAgICAgICAgKmVuYWJsZWQgPSBsb2FkZXItPmlzTG9hZGluZygpOworICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIGNhc2UgUVdlYlBhZ2VBZGFwdGVyOjpSZWxvYWQ6CisgICAgICAgICAgICAq
ZW5hYmxlZCA9ICFsb2FkZXItPmlzTG9hZGluZygpOworICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgIGNhc2UgUVdlYlBhZ2VBZGFwdGVyOjpTZXRUZXh0RGlyZWN0aW9uRGVmYXVsdDoKKyAgICAg
ICAgY2FzZSBRV2ViUGFnZUFkYXB0ZXI6OlNldFRleHREaXJlY3Rpb25MZWZ0VG9SaWdodDoKKyAg
ICAgICAgY2FzZSBRV2ViUGFnZUFkYXB0ZXI6OlNldFRleHREaXJlY3Rpb25SaWdodFRvTGVmdDoK
KyAgICAgICAgICAgICplbmFibGVkID0gZWRpdG9yLT5jYW5FZGl0KCk7CisgICAgICAgICAgICAq
Y2hlY2tlZCA9IGZhbHNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IHsK
KworICAgICAgICAgICAgLy8gaWYgaXQncyBhbiBlZGl0b3IgY29tbWFuZCwgbGV0IGl0cyBsb2dp
YyBkZXRlcm1pbmUgc3RhdGUKKyAgICAgICAgICAgIGlmIChjb21tYW5kTmFtZSkgeworICAgICAg
ICAgICAgICAgIEVkaXRvcjo6Q29tbWFuZCBjb21tYW5kID0gZWRpdG9yLT5jb21tYW5kKGNvbW1h
bmROYW1lKTsKKyAgICAgICAgICAgICAgICAqZW5hYmxlZCA9IGNvbW1hbmQuaXNFbmFibGVkKCk7
CisgICAgICAgICAgICAgICAgaWYgKCplbmFibGVkKQorICAgICAgICAgICAgICAgICAgICAqY2hl
Y2tlZCA9IGNvbW1hbmQuc3RhdGUoKSAhPSBGYWxzZVRyaVN0YXRlOworICAgICAgICAgICAgICAg
IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgKmNoZWNrZWQgPSBmYWxzZTsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFFXZWJQ
YWdlQWRhcHRlcjo6dHJpZ2dlckFjdGlvbihRV2ViUGFnZUFkYXB0ZXI6Ok1lbnVBY3Rpb24gYWN0
aW9uLCBRV2ViSGl0VGVzdFJlc3VsdFByaXZhdGUgKiBoaXRUZXN0UmVzdWx0LCBjb25zdCBjaGFy
ICpjb21tYW5kTmFtZSwgYm9vbCBlbmRUb0VuZFJlbG9hZCkKK3sKKyAgICBGcmFtZSAqZnJhbWUg
PSBwYWdlLT5mb2N1c0NvbnRyb2xsZXIoKS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCk7CisgICAgaWYg
KCFmcmFtZSkKKyAgICAgICAgcmV0dXJuOworICAgIEVkaXRvciAqZWRpdG9yID0gZnJhbWUtPmVk
aXRvcigpOworCisgICAgLy8gQ29udmVuaWVuY2UKKyAgICBRV2ViSGl0VGVzdFJlc3VsdFByaXZh
dGUgaGl0VGVzdDsKKyAgICBpZiAoIWhpdFRlc3RSZXN1bHQpCisgICAgICAgIGhpdFRlc3RSZXN1
bHQgPSAmaGl0VGVzdDsKKworICAgIHN3aXRjaCAoYWN0aW9uKSB7CisgICAgICAgIGNhc2UgT3Bl
bkxpbms6CisgICAgICAgICAgICBpZiAoRnJhbWUqIHRhcmdldEZyYW1lID0gaGl0VGVzdFJlc3Vs
dC0+d2ViQ29yZUZyYW1lKSB7CisgICAgICAgICAgICAgICAgdGFyZ2V0RnJhbWUtPmxvYWRlcigp
LT5sb2FkRnJhbWVSZXF1ZXN0KGZyYW1lTG9hZFJlcXVlc3QoaGl0VGVzdFJlc3VsdC0+bGlua1Vy
bCwgdGFyZ2V0RnJhbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgLypsb2NrSGlzdG9yeSovIGZhbHNlLCAvKmxvY2tC
YWNrRm9yd2FyZExpc3QqLyBmYWxzZSwgLypldmVudCovIDAsCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkZvcm1TdGF0
ZSovIDAsIE1heWJlU2VuZFJlZmVycmVyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICBjYXNlIE9wZW5M
aW5rSW5OZXdXaW5kb3c6CisgICAgICAgICAgICBvcGVuTmV3V2luZG93KGhpdFRlc3RSZXN1bHQt
PmxpbmtVcmwsIGZyYW1lKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9wZW5M
aW5rSW5UaGlzV2luZG93OgorICAgICAgICAgICAgZnJhbWUtPmxvYWRlcigpLT5sb2FkRnJhbWVS
ZXF1ZXN0KGZyYW1lTG9hZFJlcXVlc3QoaGl0VGVzdFJlc3VsdC0+bGlua1VybCwgZnJhbWUpLAor
ICAgICAgICAgICAgICAgIC8qbG9ja0hpc3RvcnkqLyBmYWxzZSwgLypsb2NrQmFja0ZvcndhcmRM
aXN0Ki8gZmFsc2UsIC8qZXZlbnQqLyAwLCAvKkZvcm1TdGF0ZSovIDAsIE1heWJlU2VuZFJlZmVy
cmVyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9wZW5GcmFtZUluTmV3V2lu
ZG93OiB7CisgICAgICAgICAgICBLVVJMIHVybCA9IGZyYW1lLT5sb2FkZXIoKS0+ZG9jdW1lbnRM
b2FkZXIoKS0+dW5yZWFjaGFibGVVUkwoKTsKKyAgICAgICAgICAgIGlmICh1cmwuaXNFbXB0eSgp
KQorICAgICAgICAgICAgICAgIHVybCA9IGZyYW1lLT5sb2FkZXIoKS0+ZG9jdW1lbnRMb2FkZXIo
KS0+dXJsKCk7CisgICAgICAgICAgICBvcGVuTmV3V2luZG93KHVybCwgZnJhbWUpOworICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBDb3B5TGlua1RvQ2xpcGJvYXJk
OiB7CisjaWYgZGVmaW5lZChRX1dTX1gxMSkKKyAgICAgICAgICAgIGJvb2wgb2xkU2VsZWN0aW9u
TW9kZSA9IFBhc3RlYm9hcmQ6OmdlbmVyYWxQYXN0ZWJvYXJkKCktPmlzU2VsZWN0aW9uTW9kZSgp
OworICAgICAgICAgICAgUGFzdGVib2FyZDo6Z2VuZXJhbFBhc3RlYm9hcmQoKS0+c2V0U2VsZWN0
aW9uTW9kZSh0cnVlKTsKKyAgICAgICAgICAgIGVkaXRvci0+Y29weVVSTChoaXRUZXN0UmVzdWx0
LT5saW5rVXJsLCBoaXRUZXN0UmVzdWx0LT5saW5rVGV4dCk7CisgICAgICAgICAgICBQYXN0ZWJv
YXJkOjpnZW5lcmFsUGFzdGVib2FyZCgpLT5zZXRTZWxlY3Rpb25Nb2RlKG9sZFNlbGVjdGlvbk1v
ZGUpOworI2VuZGlmCisgICAgICAgICAgICBlZGl0b3ItPmNvcHlVUkwoaGl0VGVzdFJlc3VsdC0+
bGlua1VybCwgaGl0VGVzdFJlc3VsdC0+bGlua1RleHQpOworICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgIH0KKyAgICAgICAgY2FzZSBPcGVuSW1hZ2VJbk5ld1dpbmRvdzoKKyAgICAgICAgICAg
IG9wZW5OZXdXaW5kb3coaGl0VGVzdFJlc3VsdC0+aW1hZ2VVcmwsIGZyYW1lKTsKKyAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICBjYXNlIERvd25sb2FkSW1hZ2VUb0Rpc2s6CisgICAgICAgICAg
ICBmcmFtZS0+bG9hZGVyKCktPmNsaWVudCgpLT5zdGFydERvd25sb2FkKFdlYkNvcmU6OlJlc291
cmNlUmVxdWVzdChoaXRUZXN0UmVzdWx0LT5pbWFnZVVybCwgZnJhbWUtPmxvYWRlcigpLT5vdXRn
b2luZ1JlZmVycmVyKCkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERvd25s
b2FkTGlua1RvRGlzazoKKyAgICAgICAgICAgIGZyYW1lLT5sb2FkZXIoKS0+Y2xpZW50KCktPnN0
YXJ0RG93bmxvYWQoV2ViQ29yZTo6UmVzb3VyY2VSZXF1ZXN0KGhpdFRlc3RSZXN1bHQtPmxpbmtV
cmwsIGZyYW1lLT5sb2FkZXIoKS0+b3V0Z29pbmdSZWZlcnJlcigpKSk7CisgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgY2FzZSBCYWNrOgorICAgICAgICAgICAgcGFnZS0+Z29CYWNrKCk7Cisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGb3J3YXJkOgorICAgICAgICAgICAgcGFn
ZS0+Z29Gb3J3YXJkKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTdG9wOgor
ICAgICAgICAgICAgbWFpbkZyYW1lQWRhcHRlcigpLT5mcmFtZS0+bG9hZGVyKCktPnN0b3BGb3JV
c2VyQ2FuY2VsKCk7CisgICAgICAgICAgICB1cGRhdGVOYXZpZ2F0aW9uQWN0aW9ucygpOworICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUmVsb2FkOgorICAgICAgICAgICAgbWFpbkZy
YW1lQWRhcHRlcigpLT5mcmFtZS0+bG9hZGVyKCktPnJlbG9hZChlbmRUb0VuZFJlbG9hZCk7Cisg
ICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFNldFRleHREaXJlY3Rpb25EZWZhdWx0
OgorICAgICAgICAgICAgZWRpdG9yLT5zZXRCYXNlV3JpdGluZ0RpcmVjdGlvbihOYXR1cmFsV3Jp
dGluZ0RpcmVjdGlvbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTZXRUZXh0
RGlyZWN0aW9uTGVmdFRvUmlnaHQ6CisgICAgICAgICAgICBlZGl0b3ItPnNldEJhc2VXcml0aW5n
RGlyZWN0aW9uKExlZnRUb1JpZ2h0V3JpdGluZ0RpcmVjdGlvbik7CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgY2FzZSBTZXRUZXh0RGlyZWN0aW9uUmlnaHRUb0xlZnQ6CisgICAgICAgICAg
ICBlZGl0b3ItPnNldEJhc2VXcml0aW5nRGlyZWN0aW9uKFJpZ2h0VG9MZWZ0V3JpdGluZ0RpcmVj
dGlvbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJbnNwZWN0RWxlbWVudDog
eworI2lmIEVOQUJMRShJTlNQRUNUT1IpCisgICAgICAgICAgICBBU1NFUlQoaGl0VGVzdFJlc3Vs
dCAhPSAmaGl0VGVzdCk7CisgICAgICAgICAgICBwYWdlLT5pbnNwZWN0b3JDb250cm9sbGVyKCkt
Pmluc3BlY3QoaGl0VGVzdFJlc3VsdC0+aW5uZXJOb25TaGFyZWROb2RlKTsKKyNlbmRpZgorICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAg
IGlmIChjb21tYW5kTmFtZSkKKyAgICAgICAgICAgICAgICBlZGl0b3ItPmNvbW1hbmQoY29tbWFu
ZE5hbWUpLmV4ZWN1dGUoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworCitRU3Ry
aW5nIFFXZWJQYWdlQWRhcHRlcjo6Y29udGV4dE1lbnVJdGVtVGFnRm9yQWN0aW9uKFFXZWJQYWdl
QWRhcHRlcjo6TWVudUFjdGlvbiBhY3Rpb24sIGJvb2wqIGNoZWNrYWJsZSkgY29uc3QKK3sKKyAg
ICBBU1NFUlQoY2hlY2thYmxlKTsKKyAgICBzd2l0Y2ggKGFjdGlvbikgeworICAgIGNhc2UgT3Bl
bkxpbms6CisgICAgICAgIHJldHVybiBjb250ZXh0TWVudUl0ZW1UYWdPcGVuTGluaygpOworICAg
IGNhc2UgT3BlbkxpbmtJbk5ld1dpbmRvdzoKKyAgICAgICAgcmV0dXJuIGNvbnRleHRNZW51SXRl
bVRhZ09wZW5MaW5rSW5OZXdXaW5kb3coKTsKKyAgICBjYXNlIE9wZW5GcmFtZUluTmV3V2luZG93
OgorICAgICAgICByZXR1cm4gY29udGV4dE1lbnVJdGVtVGFnT3BlbkZyYW1lSW5OZXdXaW5kb3co
KTsKKyAgICBjYXNlIE9wZW5MaW5rSW5UaGlzV2luZG93OgorICAgICAgICByZXR1cm4gY29udGV4
dE1lbnVJdGVtVGFnT3BlbkxpbmtJblRoaXNXaW5kb3coKTsKKworICAgIGNhc2UgRG93bmxvYWRM
aW5rVG9EaXNrOgorICAgICAgICByZXR1cm4gY29udGV4dE1lbnVJdGVtVGFnRG93bmxvYWRMaW5r
VG9EaXNrKCk7CisgICAgY2FzZSBDb3B5TGlua1RvQ2xpcGJvYXJkOgorICAgICAgICByZXR1cm4g
Y29udGV4dE1lbnVJdGVtVGFnQ29weUxpbmtUb0NsaXBib2FyZCgpOworCisgICAgY2FzZSBPcGVu
SW1hZ2VJbk5ld1dpbmRvdzoKKyAgICAgICAgcmV0dXJuIGNvbnRleHRNZW51SXRlbVRhZ09wZW5J
bWFnZUluTmV3V2luZG93KCk7CisgICAgY2FzZSBEb3dubG9hZEltYWdlVG9EaXNrOgorICAgICAg
ICByZXR1cm4gY29udGV4dE1lbnVJdGVtVGFnRG93bmxvYWRJbWFnZVRvRGlzaygpOworICAgIGNh
c2UgQ29weUltYWdlVG9DbGlwYm9hcmQ6CisgICAgICAgIHJldHVybiBjb250ZXh0TWVudUl0ZW1U
YWdDb3B5SW1hZ2VUb0NsaXBib2FyZCgpOworICAgIGNhc2UgQ29weUltYWdlVXJsVG9DbGlwYm9h
cmQ6CisgICAgICAgIHJldHVybiBjb250ZXh0TWVudUl0ZW1UYWdDb3B5SW1hZ2VVcmxUb0NsaXBi
b2FyZCgpOworCisgICAgY2FzZSBDdXQ6CisgICAgICAgIHJldHVybiBjb250ZXh0TWVudUl0ZW1U
YWdDdXQoKTsKKyAgICBjYXNlIENvcHk6CisgICAgICAgIHJldHVybiBjb250ZXh0TWVudUl0ZW1U
YWdDb3B5KCk7CisgICAgY2FzZSBQYXN0ZToKKyAgICAgICAgcmV0dXJuIGNvbnRleHRNZW51SXRl
bVRhZ1Bhc3RlKCk7CisgICAgY2FzZSBTZWxlY3RBbGw6CisgICAgICAgIHJldHVybiBjb250ZXh0
TWVudUl0ZW1UYWdTZWxlY3RBbGwoKTsKKworICAgIGNhc2UgQmFjazoKKyAgICAgICAgcmV0dXJu
IGNvbnRleHRNZW51SXRlbVRhZ0dvQmFjaygpOworICAgIGNhc2UgRm9yd2FyZDoKKyAgICAgICAg
cmV0dXJuIGNvbnRleHRNZW51SXRlbVRhZ0dvRm9yd2FyZCgpOworICAgIGNhc2UgUmVsb2FkOgor
ICAgICAgICByZXR1cm4gY29udGV4dE1lbnVJdGVtVGFnUmVsb2FkKCk7CisgICAgY2FzZSBTdG9w
OgorICAgICAgICByZXR1cm4gY29udGV4dE1lbnVJdGVtVGFnU3RvcCgpOworCisgICAgY2FzZSBT
ZXRUZXh0RGlyZWN0aW9uRGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGNvbnRleHRNZW51SXRlbVRh
Z0RlZmF1bHREaXJlY3Rpb24oKTsKKyAgICBjYXNlIFNldFRleHREaXJlY3Rpb25MZWZ0VG9SaWdo
dDoKKyAgICAgICAgKmNoZWNrYWJsZSA9IHRydWU7CisgICAgICAgIHJldHVybiBjb250ZXh0TWVu
dUl0ZW1UYWdMZWZ0VG9SaWdodCgpOworICAgIGNhc2UgU2V0VGV4dERpcmVjdGlvblJpZ2h0VG9M
ZWZ0OgorICAgICAgICAqY2hlY2thYmxlID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIGNvbnRleHRN
ZW51SXRlbVRhZ1JpZ2h0VG9MZWZ0KCk7CisKKyAgICBjYXNlIFRvZ2dsZUJvbGQ6CisgICAgICAg
ICpjaGVja2FibGUgPSB0cnVlOworICAgICAgICByZXR1cm4gY29udGV4dE1lbnVJdGVtVGFnQm9s
ZCgpOworICAgIGNhc2UgVG9nZ2xlSXRhbGljOgorICAgICAgICAqY2hlY2thYmxlID0gdHJ1ZTsK
KyAgICAgICAgcmV0dXJuIGNvbnRleHRNZW51SXRlbVRhZ0l0YWxpYygpOworICAgIGNhc2UgVG9n
Z2xlVW5kZXJsaW5lOgorICAgICAgICAqY2hlY2thYmxlID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJu
IGNvbnRleHRNZW51SXRlbVRhZ1VuZGVybGluZSgpOworCisgICAgY2FzZSBJbnNwZWN0RWxlbWVu
dDoKKyAgICAgICAgcmV0dXJuIGNvbnRleHRNZW51SXRlbVRhZ0luc3BlY3RFbGVtZW50KCk7Cisg
ICAgZGVmYXVsdDoKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIHJldHVy
biBRU3RyaW5nKCk7CisgICAgfQorfQorCisjaWYgRU5BQkxFKE5PVElGSUNBVElPTlMpIHx8IEVO
QUJMRShMRUdBQ1lfTk9USUZJQ0FUSU9OUykKK3ZvaWQgUVdlYlBhZ2VBZGFwdGVyOjphbGxvd05v
dGlmaWNhdGlvbnNGb3JGcmFtZShRV2ViRnJhbWVBZGFwdGVyKiBmcmFtZSkKK3sKKyAgICBOb3Rp
ZmljYXRpb25QcmVzZW50ZXJDbGllbnRRdDo6bm90aWZpY2F0aW9uUHJlc2VudGVyKCktPmFsbG93
Tm90aWZpY2F0aW9uRm9yRnJhbWUoZnJhbWUtPmZyYW1lKTsKK30KKwordm9pZCBRV2ViUGFnZUFk
YXB0ZXI6OmFkZE5vdGlmaWNhdGlvblByZXNlbnRlckNsaWVudCgpCit7CisgICAgTm90aWZpY2F0
aW9uUHJlc2VudGVyQ2xpZW50UXQ6Om5vdGlmaWNhdGlvblByZXNlbnRlcigpLT5hZGRDbGllbnQo
KTsKK30KKworI2lmbmRlZiBRVF9OT19TWVNURU1UUkFZSUNPTgorYm9vbCBRV2ViUGFnZUFkYXB0
ZXI6Omhhc1N5c3RlbVRyYXlJY29uKCkgY29uc3QKK3sKKyAgICByZXR1cm4gTm90aWZpY2F0aW9u
UHJlc2VudGVyQ2xpZW50UXQ6Om5vdGlmaWNhdGlvblByZXNlbnRlcigpLT5oYXNTeXN0ZW1UcmF5
SWNvbigpOworfQorCit2b2lkIFFXZWJQYWdlQWRhcHRlcjo6c2V0U3lzdGVtVHJheUljb24oUU9i
amVjdCAqaWNvbikKK3sKKyAgICBOb3RpZmljYXRpb25QcmVzZW50ZXJDbGllbnRRdDo6bm90aWZp
Y2F0aW9uUHJlc2VudGVyKCktPnNldFN5c3RlbVRyYXlJY29uKGljb24pOworfQorI2VuZGlmIC8v
IFFUX05PX1NZU1RFTVRSQVlJQ09OCisjZW5kaWYgLy9FTkFCTEUoTk9USUZJQ0FUSU9OUykgfHwg
RU5BQkxFKExFR0FDWV9OT1RJRklDQVRJT05TKQorCisjaWYgRU5BQkxFKEdFT0xPQ0FUSU9OKQor
dm9pZCBRV2ViUGFnZUFkYXB0ZXI6OnNldEdlb2xvY2F0aW9uRW5hYmxlZEZvckZyYW1lKFFXZWJG
cmFtZUFkYXB0ZXIqIGZyYW1lLCBib29sIG9uKQoreworICAgICAgICBHZW9sb2NhdGlvblBlcm1p
c3Npb25DbGllbnRRdDo6Z2VvbG9jYXRpb25QZXJtaXNzaW9uQ2xpZW50KCktPnNldFBlcm1pc3Np
b24oZnJhbWUsIG9uKTsKK30KKyNlbmRpZgorCisKK1FTdHJpbmcgUVdlYlBhZ2VBZGFwdGVyOjpk
ZWZhdWx0VXNlckFnZW50U3RyaW5nKCkKK3sKKyAgICByZXR1cm4gVXNlckFnZW50UXQ6OnN0YW5k
YXJkVXNlckFnZW50KCIiLCBXRUJLSVRfTUFKT1JfVkVSU0lPTiwgV0VCS0lUX01JTk9SX1ZFUlNJ
T04pOworfQorCitib29sIFFXZWJQYWdlQWRhcHRlcjo6dHJlYXRTY2hlbWVBc0xvY2FsKGNvbnN0
IFFTdHJpbmcmIHNjaGVtZSkKK3sKKyAgICByZXR1cm4gV2ViQ29yZTo6U2NoZW1lUmVnaXN0cnk6
OnNob3VsZFRyZWF0VVJMU2NoZW1lQXNMb2NhbChzY2hlbWUpOworfQorCitRT2JqZWN0ICpRV2Vi
UGFnZUFkYXB0ZXI6OmN1cnJlbnRGcmFtZSgpIGNvbnN0Cit7CisgICAgRnJhbWUgKmZyYW1lID0g
cGFnZS0+Zm9jdXNDb250cm9sbGVyKCktPmZvY3VzZWRPck1haW5GcmFtZSgpOworICAgIHJldHVy
biBmcmFtZS0+bG9hZGVyKCktPm5ldHdvcmtpbmdDb250ZXh0KCktPm9yaWdpbmF0aW5nT2JqZWN0
KCk7Cit9CisKK2Jvb2wgUVdlYlBhZ2VBZGFwdGVyOjpoYXNGb2N1c2VkTm9kZSgpIGNvbnN0Cit7
CisgICAgYm9vbCBoYXNGb2N1cyA9IGZhbHNlOworICAgIEZyYW1lICpmcmFtZSA9IHBhZ2UtPmZv
Y3VzQ29udHJvbGxlcigpLT5mb2N1c2VkRnJhbWUoKTsKKyAgICBpZiAoZnJhbWUpIHsKKyAgICAg
ICAgRG9jdW1lbnQgKmRvY3VtZW50ID0gZnJhbWUtPmRvY3VtZW50KCk7CisgICAgICAgIGhhc0Zv
Y3VzID0gZG9jdW1lbnQgJiYgZG9jdW1lbnQtPmZvY3VzZWROb2RlKCk7CisgICAgfQorICAgIHJl
dHVybiBoYXNGb2N1czsKK30KKworUVdlYlBhZ2VBZGFwdGVyOjpWaWV3cG9ydEF0dHJpYnV0ZXMg
UVdlYlBhZ2VBZGFwdGVyOjp2aWV3cG9ydEF0dHJpYnV0ZXNGb3JTaXplKGNvbnN0IFFTaXplICZh
dmFpbGFibGVTaXplLCBjb25zdCBRU2l6ZSAmZGV2aWNlU2l6ZSkgY29uc3QKK3sKKyAgICBzdGF0
aWMgY29uc3QgaW50IGRlc2t0b3BXaWR0aCA9IDk4MDsKKworICAgIGZsb2F0IGRldmljZVBpeGVs
UmF0aW8gPSBxdF9kZWZhdWx0RHBpKCkgLyBXZWJDb3JlOjpWaWV3cG9ydEFyZ3VtZW50czo6ZGVw
cmVjYXRlZFRhcmdldERQSTsKKworICAgIFdlYkNvcmU6OlZpZXdwb3J0QXR0cmlidXRlcyBjb25m
ID0gV2ViQ29yZTo6Y29tcHV0ZVZpZXdwb3J0QXR0cmlidXRlcyh2aWV3cG9ydEFyZ3VtZW50cygp
LCBkZXNrdG9wV2lkdGgsIGRldmljZVNpemUud2lkdGgoKSwgZGV2aWNlU2l6ZS5oZWlnaHQoKSwg
ZGV2aWNlUGl4ZWxSYXRpbywgYXZhaWxhYmxlU2l6ZSk7CisgICAgV2ViQ29yZTo6cmVzdHJpY3RN
aW5pbXVtU2NhbGVGYWN0b3JUb1ZpZXdwb3J0U2l6ZShjb25mLCBhdmFpbGFibGVTaXplLCBkZXZp
Y2VQaXhlbFJhdGlvKTsKKyAgICBXZWJDb3JlOjpyZXN0cmljdFNjYWxlRmFjdG9yVG9Jbml0aWFs
U2NhbGVJZk5vdFVzZXJTY2FsYWJsZShjb25mKTsKKworICAgIHBhZ2UtPnNldERldmljZVNjYWxl
RmFjdG9yKGRldmljZVBpeGVsUmF0aW8pOworICAgIFFXZWJQYWdlQWRhcHRlcjo6Vmlld3BvcnRB
dHRyaWJ1dGVzIHJlc3VsdDsKKworICAgIHJlc3VsdC5zaXplID0gUVNpemVGKGNvbmYubGF5b3V0
U2l6ZS53aWR0aCgpLCBjb25mLmxheW91dFNpemUuaGVpZ2h0KCkpOworICAgIHJlc3VsdC5pbml0
aWFsU2NhbGVGYWN0b3IgPSBjb25mLmluaXRpYWxTY2FsZTsKKyAgICByZXN1bHQubWluaW11bVNj
YWxlRmFjdG9yID0gY29uZi5taW5pbXVtU2NhbGU7CisgICAgcmVzdWx0Lm1heGltdW1TY2FsZUZh
Y3RvciA9IGNvbmYubWF4aW11bVNjYWxlOworICAgIHJlc3VsdC5kZXZpY2VQaXhlbFJhdGlvID0g
ZGV2aWNlUGl4ZWxSYXRpbzsKKyAgICByZXN1bHQuaXNVc2VyU2NhbGFibGUgPSBzdGF0aWNfY2Fz
dDxib29sPihjb25mLnVzZXJTY2FsYWJsZSk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisK
K2Jvb2wgUVdlYlBhZ2VBZGFwdGVyOjpoYW5kbGVLZXlFdmVudChRS2V5RXZlbnQgKmV2KQorewor
ICAgIEZyYW1lKiBmcmFtZSA9IHBhZ2UtPmZvY3VzQ29udHJvbGxlcigpLT5mb2N1c2VkT3JNYWlu
RnJhbWUoKTsKKyAgICByZXR1cm4gZnJhbWUtPmV2ZW50SGFuZGxlcigpLT5rZXlFdmVudChldik7
Cit9CisKK2Jvb2wgUVdlYlBhZ2VBZGFwdGVyOjpoYW5kbGVTY3JvbGxpbmcoUUtleUV2ZW50ICpl
dikKK3sKKyAgICBGcmFtZSogZnJhbWUgPSBwYWdlLT5mb2N1c0NvbnRyb2xsZXIoKS0+Zm9jdXNl
ZE9yTWFpbkZyYW1lKCk7CisgICAgV2ViQ29yZTo6U2Nyb2xsRGlyZWN0aW9uIGRpcmVjdGlvbjsK
KyAgICBXZWJDb3JlOjpTY3JvbGxHcmFudWxhcml0eSBncmFudWxhcml0eTsKKworI2lmbmRlZiBR
VF9OT19TSE9SVENVVAorICAgIGlmIChldiA9PSBRS2V5U2VxdWVuY2U6Ok1vdmVUb05leHRQYWdl
CisgICAgICAgIHx8IChldi0+a2V5KCkgPT0gUXQ6OktleV9TcGFjZSAmJiAhKGV2LT5tb2RpZmll
cnMoKSAmIFF0OjpTaGlmdE1vZGlmaWVyKSkpIHsKKyAgICAgICAgZ3JhbnVsYXJpdHkgPSBXZWJD
b3JlOjpTY3JvbGxCeVBhZ2U7CisgICAgICAgIGRpcmVjdGlvbiA9IFdlYkNvcmU6OlNjcm9sbERv
d247CisgICAgfSBlbHNlIGlmIChldiA9PSBRS2V5U2VxdWVuY2U6Ok1vdmVUb1ByZXZpb3VzUGFn
ZQorICAgICAgICAgICAgICAgfHwgKChldi0+a2V5KCkgPT0gUXQ6OktleV9TcGFjZSkgJiYgKGV2
LT5tb2RpZmllcnMoKSAmIFF0OjpTaGlmdE1vZGlmaWVyKSkpIHsKKyAgICAgICAgZ3JhbnVsYXJp
dHkgPSBXZWJDb3JlOjpTY3JvbGxCeVBhZ2U7CisgICAgICAgIGRpcmVjdGlvbiA9IFdlYkNvcmU6
OlNjcm9sbFVwOworICAgIH0gZWxzZQorI2VuZGlmIC8vIFFUX05PX1NIT1JUQ1VUCisgICAgaWYg
KChldi0+a2V5KCkgPT0gUXQ6OktleV9VcCAmJiBldi0+bW9kaWZpZXJzKCkgJiBRdDo6Q29udHJv
bE1vZGlmaWVyKQorICAgICAgICAgICAgICAgfHwgZXYtPmtleSgpID09IFF0OjpLZXlfSG9tZSkg
eworICAgICAgICBncmFudWxhcml0eSA9IFdlYkNvcmU6OlNjcm9sbEJ5RG9jdW1lbnQ7CisgICAg
ICAgIGRpcmVjdGlvbiA9IFdlYkNvcmU6OlNjcm9sbFVwOworICAgIH0gZWxzZSBpZiAoKGV2LT5r
ZXkoKSA9PSBRdDo6S2V5X0Rvd24gJiYgZXYtPm1vZGlmaWVycygpICYgUXQ6OkNvbnRyb2xNb2Rp
ZmllcikKKyAgICAgICAgICAgICAgIHx8IGV2LT5rZXkoKSA9PSBRdDo6S2V5X0VuZCkgeworICAg
ICAgICBncmFudWxhcml0eSA9IFdlYkNvcmU6OlNjcm9sbEJ5RG9jdW1lbnQ7CisgICAgICAgIGRp
cmVjdGlvbiA9IFdlYkNvcmU6OlNjcm9sbERvd247CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3dp
dGNoIChldi0+a2V5KCkpIHsKKyAgICAgICAgICAgIGNhc2UgUXQ6OktleV9VcDoKKyAgICAgICAg
ICAgICAgICBncmFudWxhcml0eSA9IFdlYkNvcmU6OlNjcm9sbEJ5TGluZTsKKyAgICAgICAgICAg
ICAgICBkaXJlY3Rpb24gPSBXZWJDb3JlOjpTY3JvbGxVcDsKKyAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgICAgIGNhc2UgUXQ6OktleV9Eb3duOgorICAgICAgICAgICAgICAgIGdyYW51
bGFyaXR5ID0gV2ViQ29yZTo6U2Nyb2xsQnlMaW5lOworICAgICAgICAgICAgICAgIGRpcmVjdGlv
biA9IFdlYkNvcmU6OlNjcm9sbERvd247CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICBjYXNlIFF0OjpLZXlfTGVmdDoKKyAgICAgICAgICAgICAgICBncmFudWxhcml0eSA9IFdl
YkNvcmU6OlNjcm9sbEJ5TGluZTsKKyAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSBXZWJDb3Jl
OjpTY3JvbGxMZWZ0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBR
dDo6S2V5X1JpZ2h0OgorICAgICAgICAgICAgICAgIGdyYW51bGFyaXR5ID0gV2ViQ29yZTo6U2Ny
b2xsQnlMaW5lOworICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IFdlYkNvcmU6OlNjcm9sbFJp
Z2h0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4g
ZnJhbWUtPmV2ZW50SGFuZGxlcigpLT5zY3JvbGxSZWN1cnNpdmVseShkaXJlY3Rpb24sIGdyYW51
bGFyaXR5KTsKK30KKwordm9pZCBRV2ViUGFnZUFkYXB0ZXI6OmZvY3VzSW5FdmVudChRRm9jdXNF
dmVudCAqKQoreworICAgIEZvY3VzQ29udHJvbGxlciAqZm9jdXNDb250cm9sbGVyID0gcGFnZS0+
Zm9jdXNDb250cm9sbGVyKCk7CisgICAgZm9jdXNDb250cm9sbGVyLT5zZXRBY3RpdmUodHJ1ZSk7
CisgICAgZm9jdXNDb250cm9sbGVyLT5zZXRGb2N1c2VkKHRydWUpOworICAgIGlmICghZm9jdXND
b250cm9sbGVyLT5mb2N1c2VkRnJhbWUoKSkKKyAgICAgICAgZm9jdXNDb250cm9sbGVyLT5zZXRG
b2N1c2VkRnJhbWUobWFpbkZyYW1lQWRhcHRlcigpLT5mcmFtZSk7Cit9CisKK3ZvaWQgUVdlYlBh
Z2VBZGFwdGVyOjpmb2N1c091dEV2ZW50KFFGb2N1c0V2ZW50ICopCit7CisgICAgLy8gb25seSBz
ZXQgdGhlIGZvY3VzZWQgZnJhbWUgaW5hY3RpdmUgc28gdGhhdCB3ZSBzdG9wIHBhaW50aW5nIHRo
ZSBjYXJldAorICAgIC8vIGFuZCB0aGUgZm9jdXMgZnJhbWUuIEJ1dCBkb24ndCB0ZWxsIHRoZSBm
b2N1cyBjb250cm9sbGVyIHNvIHRoYXQgdXBvbgorICAgIC8vIGZvY3VzSW5FdmVudCgpIHdlIGNh
biByZS1hY3RpdmF0ZSB0aGUgZnJhbWUuCisgICAgRm9jdXNDb250cm9sbGVyICpmb2N1c0NvbnRy
b2xsZXIgPSBwYWdlLT5mb2N1c0NvbnRyb2xsZXIoKTsKKyAgICAvLyBDYWxsIHNldEZvY3VzZWQg
Zmlyc3Qgc28gdGhhdCB3aW5kb3cub25ibHVyIGRvZXNuJ3QgZ2V0IGNhbGxlZCB0d2ljZQorICAg
IGZvY3VzQ29udHJvbGxlci0+c2V0Rm9jdXNlZChmYWxzZSk7CisgICAgZm9jdXNDb250cm9sbGVy
LT5zZXRBY3RpdmUoZmFsc2UpOworfQorCitib29sIFFXZWJQYWdlQWRhcHRlcjo6aGFuZGxlU2hv
cnRjdXRPdmVycmlkZUV2ZW50KFFLZXlFdmVudCogZXZlbnQpCit7CisgICAgV2ViQ29yZTo6RnJh
bWUqIGZyYW1lID0gcGFnZS0+Zm9jdXNDb250cm9sbGVyKCktPmZvY3VzZWRPck1haW5GcmFtZSgp
OworICAgIFdlYkNvcmU6OkVkaXRvciogZWRpdG9yID0gZnJhbWUtPmVkaXRvcigpOworICAgIGlm
ICghZWRpdG9yLT5jYW5FZGl0KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoZXZl
bnQtPm1vZGlmaWVycygpID09IFF0OjpOb01vZGlmaWVyCisgICAgICAgICAgICB8fCBldmVudC0+
bW9kaWZpZXJzKCkgPT0gUXQ6OlNoaWZ0TW9kaWZpZXIKKyAgICAgICAgICAgIHx8IGV2ZW50LT5t
b2RpZmllcnMoKSA9PSBRdDo6S2V5cGFkTW9kaWZpZXIpIHsKKyAgICAgICAgaWYgKGV2ZW50LT5r
ZXkoKSA8IFF0OjpLZXlfRXNjYXBlKSB7CisgICAgICAgICAgICBldmVudC0+YWNjZXB0KCk7Cisg
ICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LT5rZXkoKSkgeworICAg
ICAgICAgICAgY2FzZSBRdDo6S2V5X1JldHVybjoKKyAgICAgICAgICAgIGNhc2UgUXQ6OktleV9F
bnRlcjoKKyAgICAgICAgICAgIGNhc2UgUXQ6OktleV9EZWxldGU6CisgICAgICAgICAgICBjYXNl
IFF0OjpLZXlfSG9tZToKKyAgICAgICAgICAgIGNhc2UgUXQ6OktleV9FbmQ6CisgICAgICAgICAg
ICBjYXNlIFF0OjpLZXlfQmFja3NwYWNlOgorICAgICAgICAgICAgY2FzZSBRdDo6S2V5X0xlZnQ6
CisgICAgICAgICAgICBjYXNlIFF0OjpLZXlfUmlnaHQ6CisgICAgICAgICAgICBjYXNlIFF0OjpL
ZXlfVXA6CisgICAgICAgICAgICBjYXNlIFF0OjpLZXlfRG93bjoKKyAgICAgICAgICAgIGNhc2Ug
UXQ6OktleV9UYWI6CisgICAgICAgICAgICAgICAgZXZlbnQtPmFjY2VwdCgpOworICAgICAgICAg
ICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBRV2ViUGFnZUFkYXB0ZXI6
OnRvdWNoRXZlbnQoUVRvdWNoRXZlbnQqIGV2ZW50KQoreworI2lmIEVOQUJMRShUT1VDSF9FVkVO
VFMpCisgICAgRnJhbWUqIGZyYW1lID0gbWFpbkZyYW1lQWRhcHRlcigpLT5mcmFtZTsKKyAgICBp
ZiAoIWZyYW1lLT52aWV3KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIEFsd2F5
cyBhY2NlcHQgdGhlIFFUb3VjaEV2ZW50IHNvIHRoYXQgd2UnbGwgcmVjZWl2ZSBhbHNvIFRvdWNo
VXBkYXRlIGFuZCBUb3VjaEVuZCBldmVudHMKKyAgICBldmVudC0+c2V0QWNjZXB0ZWQodHJ1ZSk7
CisKKyAgICAvLyBSZXR1cm4gd2hldGhlciB0aGUgZGVmYXVsdCBhY3Rpb24gd2FzIGNhbmNlbGxl
ZCBpbiB0aGUgSlMgZXZlbnQgaGFuZGxlcgorICAgIHJldHVybiBmcmFtZS0+ZXZlbnRIYW5kbGVy
KCktPmhhbmRsZVRvdWNoRXZlbnQoY29udmVydFRvdWNoRXZlbnQoZXZlbnQpKTsKKyNlbHNlCisg
ICAgZXZlbnQtPmlnbm9yZSgpOworICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorfQorCitib29s
IFFXZWJQYWdlQWRhcHRlcjo6c3dhbGxvd0NvbnRleHRNZW51RXZlbnQoUUNvbnRleHRNZW51RXZl
bnQgKmV2ZW50LCBRV2ViRnJhbWVBZGFwdGVyICp3ZWJGcmFtZSkKK3sKKyAgICAvLyBDaGVjayB0
aGUgZmlyc3QgYW5kIGxhc3QgZW51bSB2YWx1ZXMgbWF0Y2ggYXQgbGVhc3QsIHNpbmNlIHdlIGNh
c3QuCisgICAgQVNTRVJUKGludChRV2ViUGFnZUFkYXB0ZXI6OlNjcm9sbFVwKSA9PSBpbnQoV2Vi
Q29yZTo6U2Nyb2xsVXApKTsKKyAgICBBU1NFUlQoaW50KFFXZWJQYWdlQWRhcHRlcjo6U2Nyb2xs
UmlnaHQpID09IGludChXZWJDb3JlOjpTY3JvbGxSaWdodCkpOworICAgIEFTU0VSVChpbnQoUVdl
YlBhZ2VBZGFwdGVyOjpTY3JvbGxCeUxpbmUpID09IGludChXZWJDb3JlOjpTY3JvbGxCeUxpbmUp
KTsKKyAgICBBU1NFUlQoaW50KFFXZWJQYWdlQWRhcHRlcjo6U2Nyb2xsQnlEb2N1bWVudCkgPT0g
aW50KFdlYkNvcmU6OlNjcm9sbEJ5RG9jdW1lbnQpKTsKKworICAgIHBhZ2UtPmNvbnRleHRNZW51
Q29udHJvbGxlcigpLT5jbGVhckNvbnRleHRNZW51KCk7CisKKyAgICBpZiAod2ViRnJhbWUpIHsK
KyAgICAgICAgRnJhbWUqIGZyYW1lID0gd2ViRnJhbWUtPmZyYW1lOworICAgICAgICBpZiAoU2Ny
b2xsYmFyKiBzY3JvbGxCYXIgPSBmcmFtZS0+dmlldygpLT5zY3JvbGxiYXJBdFBvaW50KGNvbnZl
cnRNb3VzZUV2ZW50KGV2ZW50LCAxKS5wb3NpdGlvbigpKSkgeworICAgICAgICAgICAgYm9vbCBo
b3Jpem9udGFsID0gKHNjcm9sbEJhci0+b3JpZW50YXRpb24oKSA9PSBIb3Jpem9udGFsU2Nyb2xs
YmFyKTsKKyAgICAgICAgICAgIFFXZWJQYWdlQWRhcHRlcjo6U2Nyb2xsRGlyZWN0aW9uIGRpcmVj
dGlvbiA9IFFXZWJQYWdlQWRhcHRlcjo6SW52YWxpZFNjcm9sbERpcmVjdGlvbjsKKyAgICAgICAg
ICAgIFFXZWJQYWdlQWRhcHRlcjo6U2Nyb2xsR3JhbnVsYXJpdHkgZ3JhbnVsYXJpdHkgPSBRV2Vi
UGFnZUFkYXB0ZXI6OkludmFsaWRTY3JvbGxHcmFudWxhcml0eTsKKyAgICAgICAgICAgIGJvb2wg
c2Nyb2xsID0gaGFuZGxlU2Nyb2xsYmFyQ29udGV4dE1lbnVFdmVudChldmVudCwgaG9yaXpvbnRh
bCwgJmRpcmVjdGlvbiwgJmdyYW51bGFyaXR5KTsKKyAgICAgICAgICAgIGlmICghc2Nyb2xsKQor
ICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9
PSBRV2ViUGFnZUFkYXB0ZXI6OkludmFsaWRTY3JvbGxEaXJlY3Rpb24gfHwgZ3JhbnVsYXJpdHkg
PT0gUVdlYlBhZ2VBZGFwdGVyOjpJbnZhbGlkU2Nyb2xsR3JhbnVsYXJpdHkpIHsKKyAgICAgICAg
ICAgICAgICBTY3JvbGxiYXJUaGVtZSogdGhlbWUgPSBzY3JvbGxCYXItPnRoZW1lKCk7CisgICAg
ICAgICAgICAgICAgLy8gU2V0IHRoZSBwcmVzc2VkIHBvc2l0aW9uIHRvIHRoZSBtaWRkbGUgb2Yg
dGhlIHRodW1iIHNvIHRoYXQgd2hlbiB3ZQorICAgICAgICAgICAgICAgIC8vIGRvIG1vdmUsIHRo
ZSBkZWx0YSB3aWxsIGJlIGZyb20gdGhlIGN1cnJlbnQgcGl4ZWwgcG9zaXRpb24gb2YgdGhlCisg
ICAgICAgICAgICAgICAgLy8gdGh1bWIgdG8gdGhlIG5ldyBwb3NpdGlvbgorICAgICAgICAgICAg
ICAgIGludCBwb3NpdGlvbiA9IHRoZW1lLT50cmFja1Bvc2l0aW9uKHNjcm9sbEJhcikgKyB0aGVt
ZS0+dGh1bWJQb3NpdGlvbihzY3JvbGxCYXIpICsgdGhlbWUtPnRodW1iTGVuZ3RoKHNjcm9sbEJh
cikgLyAyOworICAgICAgICAgICAgICAgIHNjcm9sbEJhci0+c2V0UHJlc3NlZFBvcyhwb3NpdGlv
bik7CisgICAgICAgICAgICAgICAgY29uc3QgUVBvaW50IHBvcyA9IHNjcm9sbEJhci0+Y29udmVy
dEZyb21Db250YWluaW5nV2luZG93KGV2ZW50LT5wb3MoKSk7CisgICAgICAgICAgICAgICAgc2Ny
b2xsQmFyLT5tb3ZlVGh1bWIoaG9yaXpvbnRhbCA/IHBvcy54KCkgOiBwb3MueSgpKTsKKyAgICAg
ICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHNjcm9sbEJhci0+c2Nyb2xsYWJsZUFyZWEo
KS0+c2Nyb2xsKFdlYkNvcmU6OlNjcm9sbERpcmVjdGlvbihkaXJlY3Rpb24pLCBXZWJDb3JlOjpT
Y3JvbGxHcmFudWxhcml0eShncmFudWxhcml0eSkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgICAgIH0KKyAgICB9CisKKyAgICBXZWJDb3JlOjpGcmFtZSogZm9jdXNlZEZyYW1lID0g
cGFnZS0+Zm9jdXNDb250cm9sbGVyKCktPmZvY3VzZWRPck1haW5GcmFtZSgpOworICAgIGZvY3Vz
ZWRGcmFtZS0+ZXZlbnRIYW5kbGVyKCktPnNlbmRDb250ZXh0TWVudUV2ZW50KGNvbnZlcnRNb3Vz
ZUV2ZW50KGV2ZW50LCAxKSk7CisgICAgQ29udGV4dE1lbnUgKm1lbnUgPSBwYWdlLT5jb250ZXh0
TWVudUNvbnRyb2xsZXIoKS0+Y29udGV4dE1lbnUoKTsKKyAgICAvLyBJZiB0aGUgd2Vic2l0ZSBk
ZWZpbmVzIGl0cyBvd24gaGFuZGxlciB0aGVuIHNlbmRDb250ZXh0TWVudUV2ZW50IHRha2VzIGNh
cmUgb2YKKyAgICAvLyBjYWxsaW5nL3Nob3dpbmcgaXQgYW5kIHRoZSBjb250ZXh0IG1lbnUgcG9p
bnRlciB3aWxsIGJlIHplcm8uIFRoaXMgaXMgdGhlIGNhc2UKKyAgICAvLyBvbiBtYXBzLmdvb2ds
ZS5jb20gZm9yIGV4YW1wbGUuCisKKyAgICByZXR1cm4gIW1lbnU7Cit9CmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L1FXZWJQYWdlQWRhcHRlci5oIGIvU291cmNl
L1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9RV2ViUGFnZUFkYXB0ZXIuaAppbmRleCA0ODI5ODky
MmUxOWJlMGU2ZGMwYWQzOTc1NWEyNjE1ZDBmNTBjMWU5Li4yOGRmZTBlODc0MDhiZGFhNWUwYzcx
YjAzMTQ1NWMyN2U5NDIyOWZjIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVT
dXBwb3J0L1FXZWJQYWdlQWRhcHRlci5oCisrKyBiL1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1
cHBvcnQvUVdlYlBhZ2VBZGFwdGVyLmgKQEAgLTIyLDI5ICsyMiwzOSBAQAogCiAjaW5jbHVkZSAi
UVdlYlBhZ2VDbGllbnQuaCIKICNpbmNsdWRlICJWaWV3cG9ydEFyZ3VtZW50cy5oIgorI2luY2x1
ZGUgInF3ZWJoaXN0b3J5LmgiCiAKKyNpbmNsdWRlIDxxYmFzaWN0aW1lci5oPgorI2luY2x1ZGUg
PHFldmVudC5oPgogI2luY2x1ZGUgPHFuZXR3b3JrcmVxdWVzdC5oPgogI2luY2x1ZGUgPHFyZWN0
Lmg+CiAjaW5jbHVkZSA8cXNjb3BlZHBvaW50ZXIuaD4KICNpbmNsdWRlIDxxc2hhcmVkcG9pbnRl
ci5oPgogI2luY2x1ZGUgPHFzdHJpbmcuaD4KICNpbmNsdWRlIDxxdXJsLmg+CisjaW5jbHVkZSA8
d3RmL0V4cG9ydE1hY3Jvcy5oPgogCiBRVF9CRUdJTl9OQU1FU1BBQ0UKK2NsYXNzIFFCaXRBcnJh
eTsKIGNsYXNzIFFLZXlFdmVudDsKK2NsYXNzIFFNaW1lRGF0YTsKK2NsYXNzIFFNb3VzZUV2ZW50
OwogY2xhc3MgUU5ldHdvcmtBY2Nlc3NNYW5hZ2VyOworY2xhc3MgUVdoZWVsRXZlbnQ7CitjbGFz
cyBRSW5wdXRNZXRob2RFdmVudDsKIFFUX0VORF9OQU1FU1BBQ0UKIAogbmFtZXNwYWNlIFdlYkNv
cmUgewotY2xhc3MgUGFnZTsKIGNsYXNzIENocm9tZUNsaWVudFF0OwogY2xhc3MgR2VvbG9jYXRp
b25DbGllbnRRdDsKK2NsYXNzIFBhZ2U7CiBjbGFzcyBVbmRvU3RlcDsKIH0KIAogY2xhc3MgUXRQ
bHVnaW5XaWRnZXRBZGFwdGVyOwogY2xhc3MgUVdlYkZyYW1lQWRhcHRlcjsKIGNsYXNzIFFXZWJI
aXN0b3J5SXRlbTsKK2NsYXNzIFFXZWJIaXRUZXN0UmVzdWx0UHJpdmF0ZTsKIGNsYXNzIFFXZWJQ
YWdlQ2xpZW50OwogY2xhc3MgUVdlYlBsdWdpbkZhY3Rvcnk7CiBjbGFzcyBRV2ViU2VjdXJpdHlP
cmlnaW47CkBAIC01MywxMyArNjMsNzUgQEAgY2xhc3MgUVdlYlNldHRpbmdzOwogY2xhc3MgUVdl
YkZ1bGxTY3JlZW5WaWRlb0hhbmRsZXI7CiBjbGFzcyBVbmRvU3RlcFF0OwogCi0KLWNsYXNzIFFX
ZWJQYWdlQWRhcHRlciB7CitjbGFzcyBXRUJLSVRfRVhQT1JUREFUQSBRV2ViUGFnZUFkYXB0ZXIg
ewogcHVibGljOgorCisjZGVmaW5lIEZPUl9FQUNIX01BUFBFRF9NRU5VX0FDVElPTihGLCBTRVBB
UkFUT1IpIFwKKyAgICBGKE9wZW5MaW5rLCBXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW1UYWdPcGVu
TGluaykgU0VQQVJBVE9SIFwKKyAgICBGKE9wZW5MaW5rSW5OZXdXaW5kb3csIFdlYkNvcmU6OkNv
bnRleHRNZW51SXRlbVRhZ09wZW5MaW5rSW5OZXdXaW5kb3cpIFNFUEFSQVRPUiBcCisgICAgRihP
cGVuTGlua0luVGhpc1dpbmRvdywgV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtVGFnT3BlbkxpbmtJ
blRoaXNXaW5kb3cpIFNFUEFSQVRPUiBcCisgICAgRihEb3dubG9hZExpbmtUb0Rpc2ssIFdlYkNv
cmU6OkNvbnRleHRNZW51SXRlbVRhZ0Rvd25sb2FkTGlua1RvRGlzaykgU0VQQVJBVE9SIFwKKyAg
ICBGKENvcHlMaW5rVG9DbGlwYm9hcmQsIFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbVRhZ0NvcHlM
aW5rVG9DbGlwYm9hcmQpIFNFUEFSQVRPUiBcCisgICAgRihPcGVuSW1hZ2VJbk5ld1dpbmRvdywg
V2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtVGFnT3BlbkltYWdlSW5OZXdXaW5kb3cpIFNFUEFSQVRP
UiBcCisgICAgRihEb3dubG9hZEltYWdlVG9EaXNrLCBXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW1U
YWdEb3dubG9hZEltYWdlVG9EaXNrKSBTRVBBUkFUT1IgXAorICAgIEYoQ29weUltYWdlVG9DbGlw
Ym9hcmQsIFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbVRhZ0NvcHlJbWFnZVRvQ2xpcGJvYXJkKSBT
RVBBUkFUT1IgXAorICAgIEYoQ29weUltYWdlVXJsVG9DbGlwYm9hcmQsIFdlYkNvcmU6OkNvbnRl
eHRNZW51SXRlbVRhZ0NvcHlJbWFnZVVybFRvQ2xpcGJvYXJkKSBTRVBBUkFUT1IgXAorICAgIEYo
T3BlbkZyYW1lSW5OZXdXaW5kb3csIFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbVRhZ09wZW5GcmFt
ZUluTmV3V2luZG93KSBTRVBBUkFUT1IgXAorICAgIEYoQ29weSwgV2ViQ29yZTo6Q29udGV4dE1l
bnVJdGVtVGFnQ29weSkgU0VQQVJBVE9SIFwKKyAgICBGKEJhY2ssIFdlYkNvcmU6OkNvbnRleHRN
ZW51SXRlbVRhZ0dvQmFjaykgU0VQQVJBVE9SIFwKKyAgICBGKEZvcndhcmQsIFdlYkNvcmU6OkNv
bnRleHRNZW51SXRlbVRhZ0dvRm9yd2FyZCkgU0VQQVJBVE9SIFwKKyAgICBGKFN0b3AsIFdlYkNv
cmU6OkNvbnRleHRNZW51SXRlbVRhZ1N0b3ApIFNFUEFSQVRPUiBcCisgICAgRihSZWxvYWQsIFdl
YkNvcmU6OkNvbnRleHRNZW51SXRlbVRhZ1JlbG9hZCkgU0VQQVJBVE9SIFwKKyAgICBGKEN1dCwg
V2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtVGFnQ3V0KSBTRVBBUkFUT1IgXAorICAgIEYoUGFzdGUs
IFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbVRhZ1Bhc3RlKSBTRVBBUkFUT1IgXAorICAgIEYoU2V0
VGV4dERpcmVjdGlvbkRlZmF1bHQsIFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbVRhZ0RlZmF1bHRE
aXJlY3Rpb24pIFNFUEFSQVRPUiBcCisgICAgRihTZXRUZXh0RGlyZWN0aW9uTGVmdFRvUmlnaHQs
IFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbVRhZ0xlZnRUb1JpZ2h0KSBTRVBBUkFUT1IgXAorICAg
IEYoU2V0VGV4dERpcmVjdGlvblJpZ2h0VG9MZWZ0LCBXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW1U
YWdSaWdodFRvTGVmdCkgU0VQQVJBVE9SIFwKKyAgICBGKFRvZ2dsZUJvbGQsIFdlYkNvcmU6OkNv
bnRleHRNZW51SXRlbVRhZ0JvbGQpIFNFUEFSQVRPUiBcCisgICAgRihUb2dnbGVJdGFsaWMsIFdl
YkNvcmU6OkNvbnRleHRNZW51SXRlbVRhZ0l0YWxpYykgU0VQQVJBVE9SIFwKKyAgICBGKFRvZ2ds
ZVVuZGVybGluZSwgV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtVGFnVW5kZXJsaW5lKSBTRVBBUkFU
T1IgXAorICAgIEYoU2VsZWN0QWxsLCBXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW1UYWdTZWxlY3RB
bGwpCisjZGVmaW5lIENPTU1BX1NFUEFSQVRPUiAsCisjZGVmaW5lIFNFTUlDT0xPTl9TRVBBUkFU
T1IgOworI2RlZmluZSBERUZJTkVfQUNUSU9OKE5hbWUsIFZhbHVlKSBcCisgICAgTmFtZQorCisg
ICAgZW51bSBNZW51QWN0aW9uIHsKKyAgICAgICAgTm9BY3Rpb24gPSAtIDEsCisgICAgICAgIEZP
Ul9FQUNIX01BUFBFRF9NRU5VX0FDVElPTihERUZJTkVfQUNUSU9OLCBDT01NQV9TRVBBUkFUT1Ip
CisjaWYgRU5BQkxFKElOU1BFQ1RPUikKKyAgICAgICAgLCBJbnNwZWN0RWxlbWVudAorI2VuZGlm
CisgICAgICAgICwgQWN0aW9uQ291bnQKKyAgICB9OworCisgICAgLy8gRHVwbGljYXRlZCBmcm9t
IHF3ZWJwYWdlLmgKKyAgICBlbnVtIEZpbmRGbGFnIHsKKyAgICAgICAgRmluZEJhY2t3YXJkID0g
MSwKKyAgICAgICAgRmluZENhc2VTZW5zaXRpdmVseSA9IDIsCisgICAgICAgIEZpbmRXcmFwc0Fy
b3VuZERvY3VtZW50ID0gNCwKKyAgICAgICAgSGlnaGxpZ2h0QWxsT2NjdXJyZW5jZXMgPSA4Cisg
ICAgfTsKKworICAgIC8vIHZhbGlkIHZhbHVlcyBtYXRjaGluZyB0aG9zZSBmcm9tIFNjcm9sbFR5
cGVzLmgKKyAgICBlbnVtIFNjcm9sbERpcmVjdGlvbiB7CisgICAgICAgIEludmFsaWRTY3JvbGxE
aXJlY3Rpb24gPSAtMSwKKyAgICAgICAgU2Nyb2xsVXAsCisgICAgICAgIFNjcm9sbERvd24sCisg
ICAgICAgIFNjcm9sbExlZnQsCisgICAgICAgIFNjcm9sbFJpZ2h0CisgICAgfTsKKyAgICAvLyBz
YW1lIGhlcmUKKyAgICBlbnVtIFNjcm9sbEdyYW51bGFyaXR5IHsKKyAgICAgICAgSW52YWxpZFNj
cm9sbEdyYW51bGFyaXR5ID0gLTEsCisgICAgICAgIFNjcm9sbEJ5TGluZSwKKyAgICAgICAgU2Ny
b2xsQnlQYWdlLAorICAgICAgICBTY3JvbGxCeURvY3VtZW50CisgICAgfTsKKwogICAgIFFXZWJQ
YWdlQWRhcHRlcigpOwogICAgIHZpcnR1YWwgflFXZWJQYWdlQWRhcHRlcigpOwogCi0gICAgdm9p
ZCBpbml0KFdlYkNvcmU6OlBhZ2UqKTsKICAgICAvLyBDYWxsZWQgbWFudWFsbHkgZnJvbSB+UVdl
YlBhZ2UgZGVzdHJ1Y3RvciB0byBlbnN1cmUgdGhhdAogICAgIC8vIHRoZSBRV2ViUGFnZUFkYXB0
ZXIgYW5kIHRoZSBRV2ViUGFnZVByaXZhdGUgYXJlIGludGFjdCB3aGVuCiAgICAgLy8gdmFyaW91
cyBkZXN0cnVjdGlvbiBjYWxsYmFja3MgZnJvbSBXZWJDb3JlOjpQYWdlOjp+UGFnZSgpIGhpdCB1
cy4KQEAgLTE0MCwxNSArMjEyLDEzMiBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCBib29sIGVycm9y
UGFnZUV4dGVuc2lvbihFcnJvclBhZ2VPcHRpb24qLCBFcnJvclBhZ2VSZXR1cm4qKSA9IDA7CiAg
ICAgdmlydHVhbCBRdFBsdWdpbldpZGdldEFkYXB0ZXIqIGNyZWF0ZVBsdWdpbihjb25zdCBRU3Ry
aW5nJiwgY29uc3QgUVVybCYsIGNvbnN0IFFTdHJpbmdMaXN0JiwgY29uc3QgUVN0cmluZ0xpc3Qm
KSA9IDA7CiAgICAgdmlydHVhbCBRdFBsdWdpbldpZGdldEFkYXB0ZXIqIGFkYXB0ZXJGb3JXaWRn
ZXQoUU9iamVjdCopIGNvbnN0ID0gMDsKLQorICAgIHZpcnR1YWwgYm9vbCByZXF1ZXN0U29mdHdh
cmVJbnB1dFBhbmVsKCkgY29uc3QgPSAwOworICAgIHN0cnVjdCBNZW51SXRlbURlc2NyaXB0aW9u
CisgICAgeworICAgICAgICBNZW51SXRlbURlc2NyaXB0aW9uKCkgOiB0eXBlKE5vVHlwZSksIGFj
dGlvbihOb0FjdGlvbiksIHRyYWl0cyhOb25lKSB7fQorICAgICAgICBlbnVtIFR5cGUgeworICAg
ICAgICAgICAgTm9UeXBlLAorICAgICAgICAgICAgQWN0aW9uLAorICAgICAgICAgICAgU2VwYXJh
dG9yLAorICAgICAgICAgICAgU3ViTWVudQorICAgICAgICB9IHR5cGU7CisgICAgICAgIE1lbnVB
Y3Rpb24gYWN0aW9uOworICAgICAgICBlbnVtIFRyYWl0IHsKKyAgICAgICAgICAgIE5vbmUgPSAw
LAorICAgICAgICAgICAgRW5hYmxlZCA9IDEsCisgICAgICAgICAgICBDaGVja2FibGUgPSAyLAor
ICAgICAgICAgICAgQ2hlY2tlZCA9IDQKKyAgICAgICAgfTsKKyAgICAgICAgUV9ERUNMQVJFX0ZM
QUdTKFRyYWl0cywgVHJhaXQpOworICAgICAgICBUcmFpdHMgdHJhaXRzOworICAgICAgICBRTGlz
dDxNZW51SXRlbURlc2NyaXB0aW9uPiBzdWJNZW51OworICAgICAgICBRU3RyaW5nIHN1Yk1lbnVU
aXRsZTsKKyAgICB9OworICAgIHZpcnR1YWwgdm9pZCBjcmVhdGVBbmRTZXRDdXJyZW50Q29udGV4
dE1lbnUoY29uc3QgUUxpc3Q8TWVudUl0ZW1EZXNjcmlwdGlvbj4mLCBRQml0QXJyYXkqKSA9IDA7
CisgICAgdmlydHVhbCBib29sIGhhbmRsZVNjcm9sbGJhckNvbnRleHRNZW51RXZlbnQoUUNvbnRl
eHRNZW51RXZlbnQqLCBib29sLCBTY3JvbGxEaXJlY3Rpb24qLCBTY3JvbGxHcmFudWxhcml0eSop
ID0gMDsKIAogICAgIHN0YXRpYyBRV2ViUGFnZUFkYXB0ZXIqIGtpdChXZWJDb3JlOjpQYWdlKik7
Ci0gICAgV2ViQ29yZTo6Vmlld3BvcnRBcmd1bWVudHMgdmlld3BvcnRBcmd1bWVudHMoKTsKKyAg
ICBXZWJDb3JlOjpWaWV3cG9ydEFyZ3VtZW50cyB2aWV3cG9ydEFyZ3VtZW50cygpIGNvbnN0Owog
ICAgIHZvaWQgcmVnaXN0ZXJVbmRvU3RlcChXVEY6OlBhc3NSZWZQdHI8V2ViQ29yZTo6VW5kb1N0
ZXA+KTsKIAogICAgIHZvaWQgc2V0TmV0d29ya0FjY2Vzc01hbmFnZXIoUU5ldHdvcmtBY2Nlc3NN
YW5hZ2VyKik7CiAgICAgUU5ldHdvcmtBY2Nlc3NNYW5hZ2VyKiBuZXR3b3JrQWNjZXNzTWFuYWdl
cigpOwogCisgICAgYm9vbCBoYXNTZWxlY3Rpb24oKSBjb25zdDsKKyAgICBRU3RyaW5nIHNlbGVj
dGVkVGV4dCgpIGNvbnN0OworICAgIFFTdHJpbmcgc2VsZWN0ZWRIdG1sKCkgY29uc3Q7CisKKyAg
ICBib29sIGlzQ29udGVudEVkaXRhYmxlKCkgY29uc3Q7CisgICAgdm9pZCBzZXRDb250ZW50RWRp
dGFibGUoYm9vbCk7CisKKyAgICBib29sIGZpbmRUZXh0KGNvbnN0IFFTdHJpbmcmIHN1YlN0cmlu
ZywgRmluZEZsYWcgb3B0aW9ucyk7CisKKyAgICBjbGFzcyBUb3VjaEFkanVzdGVyIHsKKyAgICBw
dWJsaWM6CisgICAgICAgIFRvdWNoQWRqdXN0ZXIodW5zaWduZWQgdG9wUGFkZGluZywgdW5zaWdu
ZWQgcmlnaHRQYWRkaW5nLCB1bnNpZ25lZCBib3R0b21QYWRkaW5nLCB1bnNpZ25lZCBsZWZ0UGFk
ZGluZyk7CisKKyAgICAgICAgV2ViQ29yZTo6SW50UG9pbnQgZmluZENhbmRpZGF0ZVBvaW50Rm9y
VG91Y2goY29uc3QgV2ViQ29yZTo6SW50UG9pbnQmLCBXZWJDb3JlOjpEb2N1bWVudCopIGNvbnN0
OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgdW5zaWduZWQgbV90b3BQYWRkaW5nOworICAgICAg
ICB1bnNpZ25lZCBtX3JpZ2h0UGFkZGluZzsKKyAgICAgICAgdW5zaWduZWQgbV9ib3R0b21QYWRk
aW5nOworICAgICAgICB1bnNpZ25lZCBtX2xlZnRQYWRkaW5nOworICAgIH07CisKKyAgICB2b2lk
IGFkanVzdFBvaW50Rm9yQ2xpY2tpbmcoUU1vdXNlRXZlbnQqKTsKKworICAgIHZvaWQgbW91c2VN
b3ZlRXZlbnQoUU1vdXNlRXZlbnQqKTsKKyAgICB2b2lkIG1vdXNlUHJlc3NFdmVudChRTW91c2VF
dmVudCopOworICAgIHZvaWQgbW91c2VEb3VibGVDbGlja0V2ZW50KFFNb3VzZUV2ZW50Kik7Cisg
ICAgdm9pZCBtb3VzZVRyaXBsZUNsaWNrRXZlbnQoUU1vdXNlRXZlbnQqKTsKKyAgICB2b2lkIG1v
dXNlUmVsZWFzZUV2ZW50KFFNb3VzZUV2ZW50Kik7CisgICAgdm9pZCBoYW5kbGVTb2Z0d2FyZUlu
cHV0UGFuZWwoUXQ6Ok1vdXNlQnV0dG9uLCBjb25zdCBRUG9pbnQmKTsKKyNpZm5kZWYgUVRfTk9f
V0hFRUxFVkVOVAorICAgIHZvaWQgd2hlZWxFdmVudChRV2hlZWxFdmVudCosIGludCB3aGVlbFNj
cm9sbExpbmVzKTsKKyNlbmRpZgorI2lmbmRlZiBRVF9OT19EUkFHQU5ERFJPUAorICAgIFF0OjpE
cm9wQWN0aW9uIGRyYWdFbnRlcmVkKGNvbnN0IFFNaW1lRGF0YSosIGNvbnN0IFFQb2ludCYsIFF0
OjpEcm9wQWN0aW9ucyk7CisgICAgdm9pZCBkcmFnTGVhdmVFdmVudCgpOworICAgIFF0OjpEcm9w
QWN0aW9uIGRyYWdVcGRhdGVkKGNvbnN0IFFNaW1lRGF0YSosIGNvbnN0IFFQb2ludCYsIFF0OjpE
cm9wQWN0aW9ucyk7CisgICAgYm9vbCBwZXJmb3JtRHJhZyhjb25zdCBRTWltZURhdGEqLCBjb25z
dCBRUG9pbnQmLCBRdDo6RHJvcEFjdGlvbnMpOworI2VuZGlmCisgICAgdm9pZCBpbnB1dE1ldGhv
ZEV2ZW50KFFJbnB1dE1ldGhvZEV2ZW50ICpldik7CisgICAgUVZhcmlhbnQgaW5wdXRNZXRob2RR
dWVyeShRdDo6SW5wdXRNZXRob2RRdWVyeSBwcm9wZXJ0eSkgY29uc3Q7CisgICAgdm9pZCBkeW5h
bWljUHJvcGVydHlDaGFuZ2VFdmVudChRT2JqZWN0KiwgUUR5bmFtaWNQcm9wZXJ0eUNoYW5nZUV2
ZW50Kik7CisgICAgYm9vbCBoYW5kbGVLZXlFdmVudChRS2V5RXZlbnQqKTsKKyAgICBib29sIGhh
bmRsZVNjcm9sbGluZyhRS2V5RXZlbnQqKTsKKyAgICB2b2lkIGZvY3VzSW5FdmVudChRRm9jdXNF
dmVudCopOworICAgIHZvaWQgZm9jdXNPdXRFdmVudChRRm9jdXNFdmVudCopOworICAgIGJvb2wg
aGFuZGxlU2hvcnRjdXRPdmVycmlkZUV2ZW50KFFLZXlFdmVudCopOworICAgIC8vIFJldHVybnMg
d2hldGhlciB0aGUgZGVmYXVsdCBhY3Rpb24gd2FzIGNhbmNlbGxlZCBpbiB0aGUgSlMgZXZlbnQg
aGFuZGxlcgorICAgIGJvb2wgdG91Y2hFdmVudChRVG91Y2hFdmVudCopOworICAgIGJvb2wgc3dh
bGxvd0NvbnRleHRNZW51RXZlbnQoUUNvbnRleHRNZW51RXZlbnQgKiwgUVdlYkZyYW1lQWRhcHRl
ciopOworCisgICAgUVdlYkhpdFRlc3RSZXN1bHRQcml2YXRlKiB1cGRhdGVQb3NpdGlvbkRlcGVu
ZGVudE1lbnVBY3Rpb25zKGNvbnN0IFFQb2ludCYsIFFCaXRBcnJheSopOworICAgIHZvaWQgdXBk
YXRlQWN0aW9uSW50ZXJuYWwoTWVudUFjdGlvbiwgY29uc3QgY2hhciogY29tbWFuZE5hbWUsIGJv
b2wqIGVuYWJsZWQsIGJvb2wqIGNoZWNrZWQpOworICAgIHZvaWQgdHJpZ2dlckFjdGlvbihNZW51
QWN0aW9uLCBRV2ViSGl0VGVzdFJlc3VsdFByaXZhdGUqLCBjb25zdCBjaGFyKiBjb21tYW5kTmFt
ZSwgYm9vbCBlbmRUb0VuZFJlbG9hZCk7CisgICAgUVN0cmluZyBjb250ZXh0TWVudUl0ZW1UYWdG
b3JBY3Rpb24oTWVudUFjdGlvbiwgYm9vbCogY2hlY2thYmxlKSBjb25zdDsKKworICAgIFFTdHJp
bmdMaXN0IHN1cHBvcnRlZENvbnRlbnRUeXBlcygpIGNvbnN0OworI2lmIEVOQUJMRShHRU9MT0NB
VElPTikKKyAgICB2b2lkIHNldEdlb2xvY2F0aW9uRW5hYmxlZEZvckZyYW1lKFFXZWJGcmFtZUFk
YXB0ZXIqLCBib29sKTsKKyNlbmRpZgorI2lmIEVOQUJMRShOT1RJRklDQVRJT05TKSB8fCBFTkFC
TEUoTEVHQUNZX05PVElGSUNBVElPTlMpCisgICAgdm9pZCBhbGxvd05vdGlmaWNhdGlvbnNGb3JG
cmFtZShRV2ViRnJhbWVBZGFwdGVyKik7CisgICAgdm9pZCBhZGROb3RpZmljYXRpb25QcmVzZW50
ZXJDbGllbnQoKTsKKyNpZm5kZWYgUVRfTk9fU1lTVEVNVFJBWUlDT04KKyAgICBib29sIGhhc1N5
c3RlbVRyYXlJY29uKCkgY29uc3Q7CisgICAgdm9pZCBzZXRTeXN0ZW1UcmF5SWNvbihRT2JqZWN0
Kik7CisjZW5kaWYgLy8gUVRfTk9fU1lTVEVNVFJBWUlDT04KKyNlbmRpZiAvLyBFTkFCTEUoTk9U
SUZJQ0FUSU9OUykgfHwgRU5BQkxFKExFR0FDWV9OT1RJRklDQVRJT05TKQorCisgICAgLy8gQ2Fs
bGVkIGZyb20gUVdlYlBhZ2UgYXMgcHJpdmF0ZSBzbG90cy4KKyAgICB2b2lkIF9xX2NsZWFudXBM
ZWFrTWVzc2FnZXMoKTsKKyAgICB2b2lkIF9xX29uTG9hZFByb2dyZXNzQ2hhbmdlZChpbnQpOwor
CisgICAgYm9vbCBzdXBwb3J0c0NvbnRlbnRUeXBlKGNvbnN0IFFTdHJpbmcmIG1pbWVUeXBlKSBj
b25zdDsKKworICAgIHZvaWQgZGlkU2hvd0luc3BlY3RvcigpOworICAgIHZvaWQgZGlkQ2xvc2VJ
bnNwZWN0b3IoKTsKKworICAgIHN0YXRpYyBRU3RyaW5nIGRlZmF1bHRVc2VyQWdlbnRTdHJpbmco
KTsKKyAgICBzdGF0aWMgYm9vbCB0cmVhdFNjaGVtZUFzTG9jYWwoY29uc3QgUVN0cmluZyYpOwor
CisgICAgUU9iamVjdCogY3VycmVudEZyYW1lKCkgY29uc3Q7CisgICAgYm9vbCBoYXNGb2N1c2Vk
Tm9kZSgpIGNvbnN0OworICAgIHN0cnVjdCBWaWV3cG9ydEF0dHJpYnV0ZXMgeworICAgICAgICBx
cmVhbCBpbml0aWFsU2NhbGVGYWN0b3I7CisgICAgICAgIHFyZWFsIG1pbmltdW1TY2FsZUZhY3Rv
cjsKKyAgICAgICAgcXJlYWwgbWF4aW11bVNjYWxlRmFjdG9yOworICAgICAgICBxcmVhbCBkZXZp
Y2VQaXhlbFJhdGlvOworICAgICAgICBib29sIGlzVXNlclNjYWxhYmxlOworICAgICAgICBRU2l6
ZUYgc2l6ZTsKKyAgICB9OworCisgICAgVmlld3BvcnRBdHRyaWJ1dGVzIHZpZXdwb3J0QXR0cmli
dXRlc0ZvclNpemUoY29uc3QgUVNpemUmIGF2YWlsYWJsZVNpemUsIGNvbnN0IFFTaXplJiBkZXZp
Y2VTaXplKSBjb25zdDsKKwogICAgIFFXZWJTZXR0aW5ncyAqc2V0dGluZ3M7CiAKICAgICBXZWJD
b3JlOjpQYWdlICpwYWdlOwpAQCAtMTU4LDYgKzM0NywxMyBAQCBwdWJsaWM6CiAKICAgICBib29s
IGZvcndhcmRVbnN1cHBvcnRlZENvbnRlbnQ7CiAgICAgYm9vbCBpbnNpZGVPcGVuQ2FsbDsKKyAg
ICBRUG9pbnQgdHJpcGxlQ2xpY2s7CisgICAgUUJhc2ljVGltZXIgdHJpcGxlQ2xpY2tUaW1lcjsK
KworICAgIGJvb2wgY2xpY2tDYXVzZWRGb2N1czsKKyAgICBxdWludDY0IG1fdG90YWxCeXRlczsK
KyAgICBxdWludDY0IG1fYnl0ZXNSZWNlaXZlZDsKKyAgICBRV2ViSGlzdG9yeSBoaXN0b3J5Owog
CiBwcml2YXRlOgogICAgIFFOZXR3b3JrQWNjZXNzTWFuYWdlciAqbmV0d29ya01hbmFnZXI7CmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L1FXZWJVbmRvQ29tbWFu
ZC5jcHAgYi9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L1FXZWJVbmRvQ29tbWFuZC5j
cHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExOTZkZjUwZDc0NWQwNDY5Mjk4OWIw
ODRkZDc4ZTRmYWJjNmRkM2YuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAKLS0tIGEvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9RV2ViVW5kb0NvbW1hbmQu
Y3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykg
MjAxMiBEaWdpYSBQbGMgYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpLgotICoKLSAqIFRoaXMg
bGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IK
LSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwg
UHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu
ZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIg
b3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJp
YnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VU
IEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBN
RVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUg
dGhlIEdOVQotICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFp
bHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7
IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KLSAqIHRoZSBGcmVl
IFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxv
b3IsCi0gKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KLSAqCi0gKi8KLSNpbmNsdWRlICJj
b25maWcuaCIKLSNpbmNsdWRlICJRV2ViVW5kb0NvbW1hbmQuaCIKLQotI2luY2x1ZGUgIlVuZG9T
dGVwUXQuaCIKLQotI2lmbmRlZiBRVF9OT19VTkRPQ09NTUFORAotUVdlYlVuZG9Db21tYW5kOjpR
V2ViVW5kb0NvbW1hbmQoUVNoYXJlZFBvaW50ZXI8VW5kb1N0ZXBRdD4gdW5kb1N0ZXAsIFFVbmRv
Q29tbWFuZCogcGFyZW50KQotICAgIDogUVVuZG9Db21tYW5kKHBhcmVudCkKLSAgICAsIG1fc3Rl
cCh1bmRvU3RlcCkKLXsKLSAgICBRX0FTU0VSVCh1bmRvU3RlcCk7Ci0gICAgc2V0VGV4dChtX3N0
ZXAtPnRleHQoKSk7Ci19Ci0KLXZvaWQgUVdlYlVuZG9Db21tYW5kOjp1bmRvKCkKLXsKLSAgICBt
X3N0ZXAtPnVuZG8oKTsKLX0KLQotdm9pZCBRV2ViVW5kb0NvbW1hbmQ6OnJlZG8oKQotewotICAg
IG1fc3RlcC0+cmVkbygpOwotfQotCi0jZW5kaWYgLy8gUVRfTk9fVU5ET0NPTU1BTkQKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvUVdlYlVuZG9Db21tYW5kLmgg
Yi9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L1FXZWJVbmRvQ29tbWFuZC5oCmRlbGV0
ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTYxMjFhZGMyOTExMGJmMDM0OTE3ZjJmMGRjYWFj
ZDRjZTY0ZmQzLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBh
L1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvUVdlYlVuZG9Db21tYW5kLmgKKysrIC9k
ZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIERpZ2lh
IFBsYyBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykuCi0gKgotICogVGhpcyBsaWJyYXJ5IGlz
IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5
IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAq
IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVp
dGhlcgotICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFu
eSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0
aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJB
TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJ
TElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0g
KiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0g
KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5l
cmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBm
aWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwotICogdGhlIEZyZWUgU29mdHdhcmUg
Rm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKLSAqIEJv
c3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgotICoKLSAqLwotI2lmbmRlZiBRV2ViVW5kb0NvbW1h
bmRfaAotI2RlZmluZSBRV2ViVW5kb0NvbW1hbmRfaAotCi0jaW5jbHVkZSA8cXNoYXJlZHBvaW50
ZXIuaD4KLSNpbmNsdWRlIDxxdW5kb3N0YWNrLmg+Ci0KLWNsYXNzIFVuZG9TdGVwUXQ7Ci0KLSNp
Zm5kZWYgUVRfTk9fVU5ET0NPTU1BTkQKLQotY2xhc3MgUVdlYlVuZG9Db21tYW5kIDogcHVibGlj
IFFVbmRvQ29tbWFuZCB7Ci1wdWJsaWM6Ci0gICAgUVdlYlVuZG9Db21tYW5kKFFTaGFyZWRQb2lu
dGVyPFVuZG9TdGVwUXQ+LCBRVW5kb0NvbW1hbmQgKnBhcmVudCA9IDApOwotCi0gICAgdm9pZCB1
bmRvKCk7Ci0gICAgdm9pZCByZWRvKCk7Ci0KLXByaXZhdGU6Ci0gICAgUVNoYXJlZFBvaW50ZXI8
VW5kb1N0ZXBRdD4gbV9zdGVwOwotfTsKLQotI2VuZGlmIC8vIFFUX05PX1VORE9DT01NQU5ECi0K
LSNlbmRpZiAvLyBRV2ViVW5kb0NvbW1hbmRfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9x
dC9XZWJDb3JlU3VwcG9ydC9RV2lkZ2V0UGx1Z2luSW1wbC5jcHAgYi9Tb3VyY2UvV2ViS2l0L3F0
L1dlYkNvcmVTdXBwb3J0L1FXaWRnZXRQbHVnaW5JbXBsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMmJlYWJmMWQwODU4NmNkNTUzNDM4YjcyMDhmYThhMzE1ZmJlMTliMy4uMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0
L3F0L1dlYkNvcmVTdXBwb3J0L1FXaWRnZXRQbHVnaW5JbXBsLmNwcAorKysgL2Rldi9udWxsCkBA
IC0xLDcyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgRGlnaWEgUGxjIGFuZC9v
ciBpdHMgc3Vic2lkaWFyeSgtaWVzKS4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0
d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIg
dGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBh
cyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2
ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZl
cnNpb24uCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRo
YXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhv
dXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91
bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlO
Ry5MSUIuICBJZiBub3QsIHdyaXRlIHRvCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
LCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAotICogQm9zdG9uLCBNQSAw
MjExMC0xMzAxLCBVU0EuCi0gKgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRl
ICJRV2lkZ2V0UGx1Z2luSW1wbC5oIgotCi0jaW5jbHVkZSA8UVdpZGdldD4KLQotUVdpZGdldFBs
dWdpbkltcGw6On5RV2lkZ2V0UGx1Z2luSW1wbCgpCi17Ci0gICAgbV93aWRnZXQtPmRlbGV0ZUxh
dGVyKCk7Ci19Ci0KLXZvaWQgUVdpZGdldFBsdWdpbkltcGw6OnVwZGF0ZShjb25zdCBRUmVjdCAm
cmVjdCkKLXsKLSAgICBtX3dpZGdldC0+dXBkYXRlKHJlY3QpOwotfQotCi12b2lkIFFXaWRnZXRQ
bHVnaW5JbXBsOjpzZXRHZW9tZXRyeUFuZENsaXAoY29uc3QgUVJlY3QgJmdlb21ldHJ5LCBjb25z
dCBRUmVjdCAmY2xpcFJlY3QsIGJvb2wgaXNWaXNpYmxlKQotewotICAgIG1fd2lkZ2V0LT5zZXRH
ZW9tZXRyeShnZW9tZXRyeSk7Ci0gICAgaWYgKCFjbGlwUmVjdC5pc051bGwoKSkgewotICAgICAg
ICBRUmVjdCBjbGlwKGNsaXBSZWN0LmludGVyc2VjdGVkKG1fd2lkZ2V0LT5yZWN0KCkpKTsKLSAg
ICAgICAgbV93aWRnZXQtPnNldE1hc2soUVJlZ2lvbihjbGlwKSk7Ci0gICAgfQotICAgIG1fd2lk
Z2V0LT51cGRhdGUoKTsKLSAgICBzZXRWaXNpYmxlKGlzVmlzaWJsZSk7Ci19Ci0KLXZvaWQgUVdp
ZGdldFBsdWdpbkltcGw6OnNldFZpc2libGUoYm9vbCB2aXNpYmxlKQotewotICAgIC8vIElmIHNl
dE1hc2sgaXMgc2V0IHdpdGggYW4gZW1wdHkgUVJlZ2lvbiwgbm8gY2xpcHBpbmcgd2lsbAotICAg
IC8vIGJlIHBlcmZvcm1lZCwgc28gaW4gdGhhdCBjYXNlIHdlIGhpZGUgdGhlIHBsYXRmb3JtV2lk
Z2V0LgotICAgIFFSZWdpb24gbWFzayA9IG1fd2lkZ2V0LT5tYXNrKCk7Ci0gICAgbV93aWRnZXQt
PnNldFZpc2libGUodmlzaWJsZSAmJiAhbWFzay5pc0VtcHR5KCkpOwotfQotCi12b2lkIFFXaWRn
ZXRQbHVnaW5JbXBsOjpzZXRTdHlsZVNoZWV0KGNvbnN0IFFTdHJpbmcgJnN0eWxlc2hlZXQpCi17
Ci0gICAgbV93aWRnZXQtPnNldFN0eWxlU2hlZXQoc3R5bGVzaGVldCk7Ci19Ci0KLXZvaWQgUVdp
ZGdldFBsdWdpbkltcGw6OnNldFdpZGdldFBhcmVudChRT2JqZWN0ICpwYXJlbnQpCi17Ci0gICAg
aWYgKCFwYXJlbnQtPmlzV2lkZ2V0VHlwZSgpKQotICAgICAgICByZXR1cm47Ci0gICAgbV93aWRn
ZXQtPnNldFBhcmVudChxb2JqZWN0X2Nhc3Q8UVdpZGdldCo+KHBhcmVudCkpOwotfQotCi1RT2Jq
ZWN0KiBRV2lkZ2V0UGx1Z2luSW1wbDo6aGFuZGxlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV93
aWRnZXQ7Ci19Ci0KLSNpbmNsdWRlICJtb2NfUVdpZGdldFBsdWdpbkltcGwuY3BwIgpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9RV2lkZ2V0UGx1Z2luSW1wbC5o
IGIvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9RV2lkZ2V0UGx1Z2luSW1wbC5oCmRl
bGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDU5YjdlZmY1ODcwMTNmM2FmMjQ4ZjdjMmM5
MTI4NmNmNzQ5OWVlLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0t
LSBhL1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvUVdpZGdldFBsdWdpbkltcGwuaAor
KysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIg
RGlnaWEgUGxjIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKS4KLSAqCi0gKiBUaGlzIGxpYnJh
cnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBt
b2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1Ymxp
YwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv
bjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlv
bikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVk
IGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkg
V0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hB
TlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBH
TlUKLSAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgot
ICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUg
dGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCi0gKiB0aGUgRnJlZSBTb2Z0
d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAot
ICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCi0gKgotICovCi0jaWZuZGVmIFFXaWRnZXRQ
bHVnaW5JbXBsX2gKLSNkZWZpbmUgUVdpZGdldFBsdWdpbkltcGxfaAotCi0jaW5jbHVkZSAiUXRQ
bHVnaW5XaWRnZXRBZGFwdGVyLmgiCi0KLVFUX0JFR0lOX05BTUVTUEFDRQotY2xhc3MgUVdpZGdl
dDsKLVFUX0VORF9OQU1FU1BBQ0UKLQotY2xhc3MgUVdpZGdldFBsdWdpbkltcGwgOiBwdWJsaWMg
UXRQbHVnaW5XaWRnZXRBZGFwdGVyIHsKLSAgICBRX09CSkVDVAotcHVibGljOgotICAgIFFXaWRn
ZXRQbHVnaW5JbXBsKFFXaWRnZXQgKncpIDogbV93aWRnZXQodykgeyB9Ci0gICAgdmlydHVhbCB+
UVdpZGdldFBsdWdpbkltcGwoKTsKLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlKGNvbnN0IFFSZWN0
ICYpIE9WRVJSSURFOwotICAgIHZpcnR1YWwgdm9pZCBzZXRHZW9tZXRyeUFuZENsaXAoY29uc3Qg
UVJlY3QmLCBjb25zdCBRUmVjdCYsIGJvb2wgaXNWaXNpYmxlKSBPVkVSUklERTsKLSAgICB2aXJ0
dWFsIHZvaWQgc2V0VmlzaWJsZShib29sKSBPVkVSUklERTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0
U3R5bGVTaGVldChjb25zdCBRU3RyaW5nJikgT1ZFUlJJREU7Ci0gICAgdmlydHVhbCB2b2lkIHNl
dFdpZGdldFBhcmVudChRT2JqZWN0ICopIE9WRVJSSURFOwotICAgIHZpcnR1YWwgUU9iamVjdCog
aGFuZGxlKCkgY29uc3QgT1ZFUlJJREU7Ci1wcml2YXRlOgotICAgIFFXaWRnZXQgKm1fd2lkZ2V0
OwotfTsKLQotI2VuZGlmIC8vIFFXaWRnZXRQbHVnaW5JbXBsX2gKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvUXRGYWxsYmFja1dlYlBvcHVwLmNwcCBiL1NvdXJj
ZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvUXRGYWxsYmFja1dlYlBvcHVwLmNwcApkZWxldGVk
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJmYmY2MjRhYTk1YmFkZDA0ODBhZjUzN2I1YTRmZGEy
ZDkyNzBlMS4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9T
b3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L1F0RmFsbGJhY2tXZWJQb3B1cC5jcHAKKysr
IC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBH
aXJpc2ggUmFtYWtyaXNobmFuIDxnaXJpc2hAZm9yd2FyZGJpYXMuaW4+Ci0gKiBDb3B5cmlnaHQg
KEMpIDIwMDkgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCi0g
KgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRl
IGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJh
cnkgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBv
ciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgbGlicmFy
eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICog
YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu
dHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9y
IG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9m
IHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRo
aXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwot
ICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0
LCBGaWZ0aCBGbG9vciwKLSAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgotICoKLSAqLwot
I2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIlF0RmFsbGJhY2tXZWJQb3B1cC5oIgotCi0j
aWZuZGVmIFFUX05PX0NPTUJPQk9YCi0KLSNpbmNsdWRlICJRV2ViUGFnZUFkYXB0ZXIuaCIKLSNp
bmNsdWRlICJRV2ViUGFnZUNsaWVudC5oIgotI2luY2x1ZGUgIlF0V2ViQ29tYm9Cb3guaCIKLSNp
bmNsdWRlICJxZ3JhcGhpY3N3ZWJ2aWV3LmgiCi0jaW5jbHVkZSA8UUdyYXBoaWNzUHJveHlXaWRn
ZXQ+Ci0jaW5jbHVkZSA8UXRHdWkvUVN0YW5kYXJkSXRlbU1vZGVsPgotCi1uYW1lc3BhY2UgV2Vi
Q29yZSB7Ci0KLVF0RmFsbGJhY2tXZWJQb3B1cDo6UXRGYWxsYmFja1dlYlBvcHVwKGNvbnN0IFFX
ZWJQYWdlQWRhcHRlciogcGFnZSkKLSAgICA6IG1fY29tYm8oMCkKLSAgICAsIG1fcGFnZShwYWdl
KQotewotfQotCi1RdEZhbGxiYWNrV2ViUG9wdXA6On5RdEZhbGxiYWNrV2ViUG9wdXAoKQotewot
ICAgIGRlbGV0ZUNvbWJvQm94KCk7Ci19Ci0KLXZvaWQgUXRGYWxsYmFja1dlYlBvcHVwOjpzaG93
KGNvbnN0IFFXZWJTZWxlY3REYXRhJiBkYXRhKQotewotICAgIGlmICghcGFnZUNsaWVudCgpKQot
ICAgICAgICByZXR1cm47Ci0KLSAgICBkZWxldGVDb21ib0JveCgpOwotCi0gICAgbV9jb21ibyA9
IG5ldyBRdFdlYkNvbWJvQm94KCk7Ci0gICAgY29ubmVjdChtX2NvbWJvLCBTSUdOQUwoYWN0aXZh
dGVkKGludCkpLCBTTE9UKGFjdGl2ZUNoYW5nZWQoaW50KSksIFF0OjpRdWV1ZWRDb25uZWN0aW9u
KTsKLSAgICBjb25uZWN0KG1fY29tYm8sIFNJR05BTChkaWRIaWRlKCkpLCBTTE9UKGRlbGV0ZUNv
bWJvQm94KCkpKTsKLSAgICBjb25uZWN0KG1fY29tYm8sIFNJR05BTChkaWRIaWRlKCkpLCBTSUdO
QUwoZGlkSGlkZSgpKSk7Ci0KLSAgICBwb3B1bGF0ZShkYXRhKTsKLQotICAgIFFSZWN0IHJlY3Qg
PSBnZW9tZXRyeSgpOwotICAgIGlmIChRR3JhcGhpY3NXZWJWaWV3ICp3ZWJWaWV3ID0gcW9iamVj
dF9jYXN0PFFHcmFwaGljc1dlYlZpZXcqPihwYWdlQ2xpZW50KCktPnBsdWdpblBhcmVudCgpKSkg
ewotICAgICAgICBRR3JhcGhpY3NQcm94eVdpZGdldCogcHJveHkgPSBuZXcgUUdyYXBoaWNzUHJv
eHlXaWRnZXQod2ViVmlldyk7Ci0gICAgICAgIHByb3h5LT5zZXRXaWRnZXQobV9jb21ibyk7Ci0g
ICAgICAgIHByb3h5LT5zZXRHZW9tZXRyeShyZWN0KTsKLSAgICB9IGVsc2UgewotICAgICAgICBt
X2NvbWJvLT5zZXRQYXJlbnQocW9iamVjdF9jYXN0PFFXaWRnZXQqPihwYWdlQ2xpZW50KCktPm93
bmVyV2lkZ2V0KCkpKTsKLSAgICAgICAgbV9jb21iby0+c2V0R2VvbWV0cnkoUVJlY3QocmVjdC5s
ZWZ0KCksIHJlY3QudG9wKCksIHJlY3Qud2lkdGgoKSwgbV9jb21iby0+c2l6ZUhpbnQoKS5oZWln
aHQoKSkpOwotICAgIH0KLQotICAgIG1fY29tYm8tPnNob3dQb3B1cEF0Q3Vyc29yUG9zaXRpb24o
KTsKLX0KLQotdm9pZCBRdEZhbGxiYWNrV2ViUG9wdXA6OmhpZGUoKQotewotICAgIC8vIERlc3Ry
b3lpbmcgdGhlIFFDb21ib0JveCBoZXJlIGNhdXNlIHByb2JsZW1zIGlmIHRoZSBwb3B1cCBpcyBp
biB0aGUKLSAgICAvLyBtaWRkbGUgb2YgaXRzIHNob3cgYW5pbWF0aW9uLiBJbnN0ZWFkIHdlIHJl
bHkgb24gdGhlIGZhY3QgdGhhdCB0aGUKLSAgICAvLyBRdDo6UG9wdXAgd2luZG93IHdpbGwgaGlk
ZSBpdHNlbGYgb24gbW91c2UgZXZlbnRzIG91dHNpZGUgaXRzIHdpbmRvdy4KLX0KLQotdm9pZCBR
dEZhbGxiYWNrV2ViUG9wdXA6OnBvcHVsYXRlKGNvbnN0IFFXZWJTZWxlY3REYXRhJiBkYXRhKQot
ewotICAgIFFTdGFuZGFyZEl0ZW1Nb2RlbCogbW9kZWwgPSBxb2JqZWN0X2Nhc3Q8UVN0YW5kYXJk
SXRlbU1vZGVsKj4obV9jb21iby0+bW9kZWwoKSk7Ci0gICAgUV9BU1NFUlQobW9kZWwpOwotCi0g
ICAgbV9jb21iby0+c2V0Rm9udChmb250KCkpOwotCi0gICAgaW50IGN1cnJlbnRJbmRleCA9IC0x
OwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5pdGVtQ291bnQoKTsgKytpKSB7Ci0gICAg
ICAgIHN3aXRjaCAoZGF0YS5pdGVtVHlwZShpKSkgewotICAgICAgICBjYXNlIFFXZWJTZWxlY3RE
YXRhOjpTZXBhcmF0b3I6Ci0gICAgICAgICAgICBtX2NvbWJvLT5pbnNlcnRTZXBhcmF0b3IoaSk7
Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBRV2ViU2VsZWN0RGF0YTo6R3JvdXA6
Ci0gICAgICAgICAgICBtX2NvbWJvLT5pbnNlcnRJdGVtKGksIGRhdGEuaXRlbVRleHQoaSkpOwot
ICAgICAgICAgICAgbW9kZWwtPml0ZW0oaSktPnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUVdlYlNlbGVjdERhdGE6Ok9wdGlvbjoKLSAgICAgICAg
ICAgIG1fY29tYm8tPmluc2VydEl0ZW0oaSwgZGF0YS5pdGVtVGV4dChpKSk7Ci0gICAgICAgICAg
ICBtb2RlbC0+aXRlbShpKS0+c2V0RW5hYmxlZChkYXRhLml0ZW1Jc0VuYWJsZWQoaSkpOwotI2lm
bmRlZiBRVF9OT19UT09MVElQCi0gICAgICAgICAgICBtb2RlbC0+aXRlbShpKS0+c2V0VG9vbFRp
cChkYXRhLml0ZW1Ub29sVGlwKGkpKTsKLSNlbmRpZgotICAgICAgICAgICAgbW9kZWwtPml0ZW0o
aSktPnNldEJhY2tncm91bmQoZGF0YS5pdGVtQmFja2dyb3VuZENvbG9yKGkpKTsKLSAgICAgICAg
ICAgIG1vZGVsLT5pdGVtKGkpLT5zZXRGb3JlZ3JvdW5kKGRhdGEuaXRlbUZvcmVncm91bmRDb2xv
cihpKSk7Ci0gICAgICAgICAgICBpZiAoZGF0YS5pdGVtSXNTZWxlY3RlZChpKSkKLSAgICAgICAg
ICAgICAgICBjdXJyZW50SW5kZXggPSBpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0K
LSAgICB9Ci0KLSAgICBpZiAoY3VycmVudEluZGV4ID49IDApCi0gICAgICAgIG1fY29tYm8tPnNl
dEN1cnJlbnRJbmRleChjdXJyZW50SW5kZXgpOwotfQotCi12b2lkIFF0RmFsbGJhY2tXZWJQb3B1
cDo6YWN0aXZlQ2hhbmdlZChpbnQgaW5kZXgpCi17Ci0gICAgaWYgKGluZGV4IDwgMCkKLSAgICAg
ICAgcmV0dXJuOwotCi0gICAgZW1pdCBzZWxlY3RJdGVtKGluZGV4LCBmYWxzZSwgZmFsc2UpOwot
fQotCi12b2lkIFF0RmFsbGJhY2tXZWJQb3B1cDo6ZGVsZXRlQ29tYm9Cb3goKQotewotICAgIGlm
ICghbV9jb21ibykKLSAgICAgICAgcmV0dXJuOwotICAgIG1fY29tYm8tPmRlbGV0ZUxhdGVyKCk7
Ci0gICAgbV9jb21ibyA9IDA7Ci19Ci0KLVFXZWJQYWdlQ2xpZW50KiBRdEZhbGxiYWNrV2ViUG9w
dXA6OnBhZ2VDbGllbnQoKSBjb25zdAotewotICAgIHJldHVybiBtX3BhZ2UtPmNsaWVudC5kYXRh
KCk7Ci19Ci0KLX0KLQotI2VuZGlmIC8vIFFUX05PX0NPTUJPQk9YCmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L1F0RmFsbGJhY2tXZWJQb3B1cC5oIGIvU291cmNl
L1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9RdEZhbGxiYWNrV2ViUG9wdXAuaApkZWxldGVkIGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggNjliNDliZGJmODg1MTg2YWY1NDVmNmVkYmEzOTBjNjU3NTU1
ZjA1ZC4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3Vy
Y2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L1F0RmFsbGJhY2tXZWJQb3B1cC5oCisrKyAvZGV2
L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBOb2tpYSBD
b3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykKLSAqCi0gKiBUaGlzIGxpYnJh
cnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBt
b2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1Ymxp
YwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv
bjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlv
bikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVk
IGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkg
V0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hB
TlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBH
TlUKLSAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgot
ICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUg
dGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCi0gKiB0aGUgRnJlZSBTb2Z0
d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAot
ICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCi0gKgotICovCi0jaWZuZGVmIFF0RmFsbGJh
Y2tXZWJQb3B1cF9oCi0jZGVmaW5lIFF0RmFsbGJhY2tXZWJQb3B1cF9oCi0KLSNpbmNsdWRlICJx
d2Via2l0cGxhdGZvcm1wbHVnaW4uaCIKLSNpbmNsdWRlIDx3dGYvUGxhdGZvcm0uaD4KLQotI2lm
bmRlZiBRVF9OT19DT01CT0JPWAotCi1RVF9CRUdJTl9OQU1FU1BBQ0UKLWNsYXNzIFFHcmFwaGlj
c1Byb3h5V2lkZ2V0OwotUVRfRU5EX05BTUVTUEFDRQotCi1jbGFzcyBRV2ViUGFnZUNsaWVudDsK
LWNsYXNzIFFXZWJQYWdlQWRhcHRlcjsKLQotbmFtZXNwYWNlIFdlYkNvcmUgewotCi1jbGFzcyBR
dFdlYkNvbWJvQm94OwotCi1jbGFzcyBRdEZhbGxiYWNrV2ViUG9wdXAgOiBwdWJsaWMgUVdlYlNl
bGVjdE1ldGhvZCB7Ci0gICAgUV9PQkpFQ1QKLXB1YmxpYzoKLSAgICBRdEZhbGxiYWNrV2ViUG9w
dXAoY29uc3QgUVdlYlBhZ2VBZGFwdGVyKik7Ci0gICAgflF0RmFsbGJhY2tXZWJQb3B1cCgpOwot
Ci0gICAgdmlydHVhbCB2b2lkIHNob3coY29uc3QgUVdlYlNlbGVjdERhdGEmKTsKLSAgICB2aXJ0
dWFsIHZvaWQgaGlkZSgpOwotCi0gICAgdm9pZCBzZXRHZW9tZXRyeShjb25zdCBRUmVjdCYgcmVj
dCkgeyBtX2dlb21ldHJ5ID0gcmVjdDsgfQotICAgIFFSZWN0IGdlb21ldHJ5KCkgY29uc3QgeyBy
ZXR1cm4gbV9nZW9tZXRyeTsgfQotCi0gICAgdm9pZCBzZXRGb250KGNvbnN0IFFGb250JiBmb250
KSB7IG1fZm9udCA9IGZvbnQ7IH0KLSAgICBRRm9udCBmb250KCkgY29uc3QgeyByZXR1cm4gbV9m
b250OyB9Ci0KLXByaXZhdGUgUV9TTE9UUzoKLSAgICB2b2lkIGFjdGl2ZUNoYW5nZWQoaW50KTsK
LSAgICB2b2lkIGRlbGV0ZUNvbWJvQm94KCk7Ci0KLXByaXZhdGU6Ci0gICAgUXRXZWJDb21ib0Jv
eCogbV9jb21ibzsKLSAgICBjb25zdCBRV2ViUGFnZUFkYXB0ZXIqIG1fcGFnZTsKLSAgICBRUmVj
dCBtX2dlb21ldHJ5OwotICAgIFFGb250IG1fZm9udDsKLQotICAgIFFXZWJQYWdlQ2xpZW50KiBw
YWdlQ2xpZW50KCkgY29uc3Q7Ci0KLSAgICB2b2lkIHBvcHVsYXRlKGNvbnN0IFFXZWJTZWxlY3RE
YXRhJik7Ci19OwotCi19Ci0KLSNlbmRpZiAvLyBRVF9OT19DT01CT0JPWAotCi0jZW5kaWYgLy8g
UXRGYWxsYmFja1dlYlBvcHVwX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29y
ZVN1cHBvcnQvUXRQbHVnaW5XaWRnZXRBZGFwdGVyLmNwcCBiL1NvdXJjZS9XZWJLaXQvcXQvV2Vi
Q29yZVN1cHBvcnQvUXRQbHVnaW5XaWRnZXRBZGFwdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5lZjU0YTVh
YjhjMjQyYjhkMTc3ZDIxNjYwNzM3NjFlY2UzMmQ0NGVlCi0tLSAvZGV2L251bGwKKysrIGIvU291
cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9RdFBsdWdpbldpZGdldEFkYXB0ZXIuY3BwCkBA
IC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgRGlnaWEgUGxjIGFuZC9v
ciBpdHMgc3Vic2lkaWFyeSgtaWVzKS4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0
d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIg
dGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBh
cyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2
ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZl
cnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRo
YXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhv
dXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91
bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlO
Ry5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
LCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAw
MjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRl
ICJRdFBsdWdpbldpZGdldEFkYXB0ZXIuaCIKKworUXRQbHVnaW5XaWRnZXRBZGFwdGVyOjpRdFBs
dWdpbldpZGdldEFkYXB0ZXIoKQoreworfQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9X
ZWJDb3JlU3VwcG9ydC9RdFBsdWdpbldpZGdldEFkYXB0ZXIuaCBiL1NvdXJjZS9XZWJLaXQvcXQv
V2ViQ29yZVN1cHBvcnQvUXRQbHVnaW5XaWRnZXRBZGFwdGVyLmgKaW5kZXggODQ5NGQzZGIyYTk4
NTVmNzRiYThhOTdmYzViY2QzM2E1M2U5MjRjNi4uMzI0ZGU3ODY2Mzc1NmMyODMzY2E3OTlmYzY4
MTNiYmI0ODRmNjc0NCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9y
dC9RdFBsdWdpbldpZGdldEFkYXB0ZXIuaAorKysgYi9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVT
dXBwb3J0L1F0UGx1Z2luV2lkZ2V0QWRhcHRlci5oCkBAIC0yMCwxMyArMjAsMTYgQEAKICNpZm5k
ZWYgUXRQbHVnaW5XaWRnZXRBZGFwdGVyX2gKICNkZWZpbmUgUXRQbHVnaW5XaWRnZXRBZGFwdGVy
X2gKIAorI2luY2x1ZGUgPFBsYXRmb3JtRXhwb3J0TWFjcm9zLmg+CiAjaW5jbHVkZSA8UU9iamVj
dD4KICNpbmNsdWRlIDxRUmVjdD4KICNpbmNsdWRlIDxRU3RyaW5nPgorI2luY2x1ZGUgPHF3ZWJr
aXRnbG9iYWwuaD4KIAotY2xhc3MgUXRQbHVnaW5XaWRnZXRBZGFwdGVyIDogcHVibGljIFFPYmpl
Y3QgeworY2xhc3MgV0VCS0lUX0VYUE9SVERBVEEgUXRQbHVnaW5XaWRnZXRBZGFwdGVyIDogcHVi
bGljIFFPYmplY3QgewogICAgIFFfT0JKRUNUCiBwdWJsaWM6CisgICAgUXRQbHVnaW5XaWRnZXRB
ZGFwdGVyKCk7CiAgICAgdmlydHVhbCB2b2lkIHVwZGF0ZShjb25zdCBRUmVjdCYpID0gMDsKICAg
ICB2aXJ0dWFsIHZvaWQgc2V0R2VvbWV0cnlBbmRDbGlwKGNvbnN0IFFSZWN0JiwgY29uc3QgUVJl
Y3QmLCBib29sIGlzVmlzaWJsZSA9IGZhbHNlKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkIHNldFZp
c2libGUoYm9vbCkgPSAwOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3Vw
cG9ydC9RdFByaW50Q29udGV4dC5jcHAgYi9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0
L1F0UHJpbnRDb250ZXh0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4xMjAzNmRmMDM0NTczMzMxZGJjZjgwMzAx
MjljZjQ5MDM4MmMzNzBkCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9xdC9XZWJD
b3JlU3VwcG9ydC9RdFByaW50Q29udGV4dC5jcHAKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxMiBEaWdpYSBQbGMgYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpLgor
ICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBT
b2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwg
b3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJh
cnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAq
IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJh
bnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv
ciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBv
ZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0
aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8K
KyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVl
dCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlF0UHJpbnRDb250ZXh0LmgiCisKKyNp
bmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJJbnRSZWN0LmgiCisjaW5jbHVk
ZSAiUHJpbnRDb250ZXh0LmgiCisjaW5jbHVkZSAiUVdlYkZyYW1lQWRhcHRlci5oIgorCit1c2lu
ZyBuYW1lc3BhY2UgV2ViQ29yZTsKKworUXRQcmludENvbnRleHQ6OlF0UHJpbnRDb250ZXh0KFFQ
YWludGVyKiBwYWludGVyLCBjb25zdCBRUmVjdCYgcGFnZVJlY3QsIFFXZWJGcmFtZUFkYXB0ZXIq
IGZyYW1lQWRhcHRlcikKKyAgICA6IG1fZ3JhcGhpY3NDb250ZXh0KG5ldyBHcmFwaGljc0NvbnRl
eHQocGFpbnRlcikpCisgICAgLCBtX3ByaW50Q29udGV4dChuZXcgUHJpbnRDb250ZXh0KGZyYW1l
QWRhcHRlci0+ZnJhbWUpKQoreworICAgIG1fcHJpbnRDb250ZXh0LT5iZWdpbihwYWdlUmVjdC53
aWR0aCgpLCBwYWdlUmVjdC5oZWlnaHQoKSk7CisKKyAgICBmbG9hdCBwYWdlSGVpZ2h0ID0gMDsK
KyAgICBtX3ByaW50Q29udGV4dC0+Y29tcHV0ZVBhZ2VSZWN0cyhJbnRSZWN0KHBhZ2VSZWN0KSwg
LyogaGVhZGVySGVpZ2h0ICovIDAsIC8qIGZvb3RlckhlaWdodCAqLyAwLCAvKiB1c2VyU2NhbGVG
YWN0b3IgKi8gMS4wLCBwYWdlSGVpZ2h0KTsKK30KKworUXRQcmludENvbnRleHQ6On5RdFByaW50
Q29udGV4dCgpCit7CisgICAgbV9wcmludENvbnRleHQtPmVuZCgpOzsKKyAgICBkZWxldGUgbV9n
cmFwaGljc0NvbnRleHQ7CisgICAgZGVsZXRlIG1fcHJpbnRDb250ZXh0OworfQorCitpbnQgUXRQ
cmludENvbnRleHQ6OnBhZ2VDb3VudCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcHJpbnRDb250
ZXh0LT5wYWdlQ291bnQoKTsKK30KKwordm9pZCBRdFByaW50Q29udGV4dDo6c3Bvb2xQYWdlKGlu
dCBwYWdlTnVtYmVyLCBmbG9hdCB3aWR0aCkKK3sKKyAgICBtX3ByaW50Q29udGV4dC0+c3Bvb2xQ
YWdlKCptX2dyYXBoaWNzQ29udGV4dCwgcGFnZU51bWJlciwgd2lkdGgpOworfQorCisKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvUXRQcmludENvbnRleHQuaCBi
L1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvUXRQcmludENvbnRleHQuaApuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwLi5kNjk2OGRhNGEyNTNkMzNjZWJjZTFiMjMwNzZhZDQzNmE0MzMzNDQ1Ci0tLSAvZGV2L251
bGwKKysrIGIvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9RdFByaW50Q29udGV4dC5o
CkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgRGlnaWEgUGxjIGFu
ZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKS4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBz
b2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5k
ZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5z
ZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisg
KiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy
IHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl
IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdp
dGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9y
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJh
cnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBz
aG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09Q
WUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0
aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBN
QSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisjaWZuZGVmIFF0UHJpbnRDb250ZXh0X2gKKyNk
ZWZpbmUgUXRQcmludENvbnRleHRfaAorCisjaW5jbHVkZSA8UVBhaW50ZXI+CisjaW5jbHVkZSA8
UVJlY3Q+CisjaW5jbHVkZSA8cXdlYmtpdGdsb2JhbC5oPgorI2luY2x1ZGUgPHd0Zi9FeHBvcnRN
YWNyb3MuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworY2xhc3MgUHJpbnRDb250ZXh0OworY2xh
c3MgR3JhcGhpY3NDb250ZXh0OworfQorCitjbGFzcyBRV2ViRnJhbWVBZGFwdGVyOworCitjbGFz
cyBXRUJLSVRfRVhQT1JUREFUQSBRdFByaW50Q29udGV4dCB7CitwdWJsaWM6CisgICAgUXRQcmlu
dENvbnRleHQoUVBhaW50ZXIqLCBjb25zdCBRUmVjdCYgcGFnZVJlY3QsIFFXZWJGcmFtZUFkYXB0
ZXIqKTsKKyAgICB+UXRQcmludENvbnRleHQoKTsKKworICAgIGludCBwYWdlQ291bnQoKSBjb25z
dDsKKyAgICB2b2lkIHNwb29sUGFnZShpbnQgcGFnZU51bWJlciwgZmxvYXQgd2lkdGgpOworCitw
cml2YXRlOgorICAgIFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dCogbV9ncmFwaGljc0NvbnRleHQ7
CisgICAgV2ViQ29yZTo6UHJpbnRDb250ZXh0KiBtX3ByaW50Q29udGV4dDsKK307CisKKyNlbmRp
ZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9RdFdlYkNvbWJv
Qm94LmNwcCBiL1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvUXRXZWJDb21ib0JveC5j
cHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMjJjZDQ3NmM2ZDU5YjM4MDIwYmZi
ZDMwMmQ1NzUyZDAyM2U3ZTAuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAKLS0tIGEvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9RdFdlYkNvbWJvQm94LmNw
cAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIw
MTAgR2lyaXNoIFJhbWFrcmlzaG5hbiA8Z2lyaXNoQGZvcndhcmRiaWFzLmluPgotICogQ29weXJp
Z2h0IChDKSAyMDA5LCAyMDExIE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFy
eSgtaWVzKQotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJl
ZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhl
IEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0
aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMiBvZiB0aGUg
TGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBU
aGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVz
ZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBs
aWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBM
aWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVk
IGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxv
bmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwg
d3JpdGUgdG8KLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5r
bGluIFN0cmVldCwgRmlmdGggRmxvb3IsCi0gKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4K
LSAqCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIlF0V2ViQ29tYm9Cb3gu
aCIKLQotI2lmbmRlZiBRVF9OT19DT01CT0JPWAotCi0jaW5jbHVkZSA8UUFic3RyYWN0SXRlbVZp
ZXc+Ci0jaW5jbHVkZSA8UUNvcmVBcHBsaWNhdGlvbj4KLSNpbmNsdWRlIDxRdEd1aS9RTW91c2VF
dmVudD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotCi1RdFdlYkNvbWJvQm94OjpRdFdlYkNvbWJv
Qm94KCkKLSAgICA6IFFDb21ib0JveCgpCi17Ci0gICAgLy8gSW5zdGFsbCBhbiBldmVudCBmaWx0
ZXIgb24gdGhlIHZpZXcgaW5zaWRlIHRoZSBjb21ibyBib3ggcG9wdXAgdG8gbWFrZSBzdXJlIHdl
IGtub3cKLSAgICAvLyB3aGVuIHRoZSBwb3B1cCBnb3QgY2xvc2VkLiBFLmcuIFFDb21ib0JveDo6
aGlkZVBvcHVwKCkgd29uJ3QgYmUgY2FsbGVkIHdoZW4gdGhlIHBvcHVwCi0gICAgLy8gaXMgY2xv
c2VkIGJ5IGEgbW91c2Ugd2hlZWwgZXZlbnQgb3V0c2lkZSBpdHMgd2luZG93LgotICAgIHZpZXco
KS0+aW5zdGFsbEV2ZW50RmlsdGVyKHRoaXMpOwotfQotCi12b2lkIFF0V2ViQ29tYm9Cb3g6OnNo
b3dQb3B1cEF0Q3Vyc29yUG9zaXRpb24oKQotewotICAgIFFNb3VzZUV2ZW50IGV2ZW50KFFFdmVu
dDo6TW91c2VCdXR0b25QcmVzcywgUUN1cnNvcjo6cG9zKCksIFF0OjpMZWZ0QnV0dG9uLCBRdDo6
TGVmdEJ1dHRvbiwgUXQ6Ok5vTW9kaWZpZXIpOwotICAgIFFDb3JlQXBwbGljYXRpb246OnNlbmRF
dmVudCh0aGlzLCAmZXZlbnQpOwotfQotCi1ib29sIFF0V2ViQ29tYm9Cb3g6OmV2ZW50RmlsdGVy
KFFPYmplY3QqIHdhdGNoZWQsIFFFdmVudCogZXZlbnQpCi17Ci0gICAgUV9BU1NFUlQod2F0Y2hl
ZCA9PSB2aWV3KCkpOwotICAgIGlmIChldmVudC0+dHlwZSgpID09IFFFdmVudDo6SGlkZSkKLSAg
ICAgICAgZW1pdCBkaWRIaWRlKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi19Ci0KLSNlbmRp
ZiAvLyBRVF9OT19DT01CT0JPWApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9XZWJDb3Jl
U3VwcG9ydC9RdFdlYkNvbWJvQm94LmggYi9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0
L1F0V2ViQ29tYm9Cb3guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMyNDI3ZWRm
NGQ0YjdmOTdkZWRlYjhlOGVlNGUwMjYwNGVkYzc2Mi4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L1F0
V2ViQ29tYm9Cb3guaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5
cmlnaHQgKEMpIDIwMTEgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1p
ZXMpCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0
cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBG
cmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyIG9mIHRoZSBMaWNl
bnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMg
bGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVs
LAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQg
d2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vu
c2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBj
b3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3
aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0
ZSB0bwotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4g
U3RyZWV0LCBGaWZ0aCBGbG9vciwKLSAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgotICoK
LSAqLwotCi0jaWZuZGVmIFF0V2ViQ29tYm9Cb3hfaAotI2RlZmluZSBRdFdlYkNvbWJvQm94X2gK
LQotI2luY2x1ZGUgPFFDb21ib0JveD4KLSNpbmNsdWRlIDx3dGYvUGxhdGZvcm0uaD4KLQotI2lm
bmRlZiBRVF9OT19DT01CT0JPWAotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0KLWNsYXNzIFF0V2Vi
Q29tYm9Cb3ggOiBwdWJsaWMgUUNvbWJvQm94IHsKLSAgICBRX09CSkVDVAotcHVibGljOgotICAg
IFF0V2ViQ29tYm9Cb3goKTsKLQotICAgIHZvaWQgc2hvd1BvcHVwQXRDdXJzb3JQb3NpdGlvbigp
OwotICAgIHZpcnR1YWwgYm9vbCBldmVudEZpbHRlcihRT2JqZWN0KiB3YXRjaGVkLCBRRXZlbnQq
KTsKLQotUV9TSUdOQUxTOgotICAgIHZvaWQgZGlkSGlkZSgpOwotfTsKLQotfQotCi0jZW5kaWYg
Ly8gUVRfTk9fQ09NQk9CT1gKLQotI2VuZGlmIC8vIFF0V2ViQ29tYm9Cb3hfaApkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9UZXh0dXJlTWFwcGVyTGF5ZXJDbGll
bnRRdC5jcHAgYi9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L1RleHR1cmVNYXBwZXJM
YXllckNsaWVudFF0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5iYTEzZDc1ZThkODg1ZDM5ZGE1ZTMzY2U5ZjZk
YjBkMThkZWQ2MTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9xdC9XZWJDb3Jl
U3VwcG9ydC9UZXh0dXJlTWFwcGVyTGF5ZXJDbGllbnRRdC5jcHAKQEAgLTAsMCArMSwxMjQgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBz
dWJzaWRpYXJ5KC1pZXMpCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgRGlnaWEgUGxjIGFuZC9vciBp
dHMgc3Vic2lkaWFyeSgtaWVzKQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJl
OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUg
dGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1
Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNp
b24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lv
bi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBp
dCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBl
dmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5l
cmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBo
YXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJ
Qi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIElu
Yy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEw
LTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlRl
eHR1cmVNYXBwZXJMYXllckNsaWVudFF0LmgiCisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9T
SVRJTkcpCisKKyNpbmNsdWRlICJGcmFtZVZpZXcuaCIKKyNpbmNsdWRlICJUZXh0dXJlTWFwcGVy
TGF5ZXIuaCIKKyNpbmNsdWRlICJRV2ViRnJhbWVBZGFwdGVyLmgiCisjaW5jbHVkZSAiUVdlYlBh
Z2VBZGFwdGVyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOworCitUZXh0dXJlTWFwcGVy
TGF5ZXJDbGllbnRRdDo6VGV4dHVyZU1hcHBlckxheWVyQ2xpZW50UXQoUVdlYkZyYW1lQWRhcHRl
ciogZnJhbWUpCisgICAgOiBtX2ZyYW1lKGZyYW1lKQorICAgICwgbV9zeW5jVGltZXIodGhpcywg
JlRleHR1cmVNYXBwZXJMYXllckNsaWVudFF0OjpzeW5jTGF5ZXJzKQorICAgICwgbV9yb290VGV4
dHVyZU1hcHBlckxheWVyKDApCit7Cit9CisKK1RleHR1cmVNYXBwZXJMYXllckNsaWVudFF0Ojp+
VGV4dHVyZU1hcHBlckxheWVyQ2xpZW50UXQoKQoreworICAgIG1fcm9vdFRleHR1cmVNYXBwZXJM
YXllciA9IDA7Cit9CisKK3ZvaWQgVGV4dHVyZU1hcHBlckxheWVyQ2xpZW50UXQ6OnN5bmNSb290
TGF5ZXIoKQoreworICAgIG1fcm9vdEdyYXBoaWNzTGF5ZXItPmZsdXNoQ29tcG9zaXRpbmdTdGF0
ZUZvclRoaXNMYXllck9ubHkoKTsKK30KKwordm9pZCBUZXh0dXJlTWFwcGVyTGF5ZXJDbGllbnRR
dDo6bWFya0ZvclN5bmMoYm9vbCBzY2hlZHVsZVN5bmMpCit7CisgICAgaWYgKG1fc3luY1RpbWVy
LmlzQWN0aXZlKCkpCisgICAgICAgIHJldHVybjsKKyAgICBtX3N5bmNUaW1lci5zdGFydE9uZVNo
b3QoMCk7Cit9CisKK1RleHR1cmVNYXBwZXJMYXllciogVGV4dHVyZU1hcHBlckxheWVyQ2xpZW50
UXQ6OnJvb3RMYXllcigpCit7CisgICAgcmV0dXJuIHRvVGV4dHVyZU1hcHBlckxheWVyKG1fcm9v
dEdyYXBoaWNzTGF5ZXIuZ2V0KCkpOworfQorCit2b2lkIFRleHR1cmVNYXBwZXJMYXllckNsaWVu
dFF0OjpzZXRSb290R3JhcGhpY3NMYXllcihHcmFwaGljc0xheWVyKiBsYXllcikKK3sKKyAgICBp
ZiAobGF5ZXIpIHsKKyAgICAgICAgbV9yb290R3JhcGhpY3NMYXllciA9IEdyYXBoaWNzTGF5ZXI6
OmNyZWF0ZSgwKTsKKyAgICAgICAgbV9yb290VGV4dHVyZU1hcHBlckxheWVyID0gdG9UZXh0dXJl
TWFwcGVyTGF5ZXIobV9yb290R3JhcGhpY3NMYXllci5nZXQoKSk7CisgICAgICAgIG1fcm9vdEdy
YXBoaWNzTGF5ZXItPmFkZENoaWxkKGxheWVyKTsKKyAgICAgICAgbV9yb290R3JhcGhpY3NMYXll
ci0+c2V0RHJhd3NDb250ZW50KGZhbHNlKTsKKyAgICAgICAgbV9yb290R3JhcGhpY3NMYXllci0+
c2V0TWFza3NUb0JvdW5kcyhmYWxzZSk7CisgICAgICAgIG1fcm9vdEdyYXBoaWNzTGF5ZXItPnNl
dFNpemUoSW50U2l6ZSgxLCAxKSk7CisgICAgICAgIFRleHR1cmVNYXBwZXI6OkFjY2VsZXJhdGlv
bk1vZGUgbW9kZSA9IFRleHR1cmVNYXBwZXI6OlNvZnR3YXJlTW9kZTsKKyAgICAgICAgaWYgKG1f
ZnJhbWUtPnBhZ2VBZGFwdGVyLT5jbGllbnQtPm1ha2VPcGVuR0xDb250ZXh0Q3VycmVudElmQXZh
aWxhYmxlKCkpCisgICAgICAgICAgICBtb2RlID0gVGV4dHVyZU1hcHBlcjo6T3BlbkdMTW9kZTsK
KyAgICAgICAgbV90ZXh0dXJlTWFwcGVyID0gVGV4dHVyZU1hcHBlcjo6Y3JlYXRlKG1vZGUpOwor
ICAgICAgICBtX3Jvb3RUZXh0dXJlTWFwcGVyTGF5ZXItPnNldFRleHR1cmVNYXBwZXIobV90ZXh0
dXJlTWFwcGVyLmdldCgpKTsKKyAgICAgICAgc3luY1Jvb3RMYXllcigpOworICAgIH0gZWxzZSB7
CisgICAgICAgIG1fcm9vdEdyYXBoaWNzTGF5ZXIuY2xlYXIoKTsKKyAgICB9Cit9CisKK3ZvaWQg
VGV4dHVyZU1hcHBlckxheWVyQ2xpZW50UXQ6OnN5bmNMYXllcnMoVGltZXI8VGV4dHVyZU1hcHBl
ckxheWVyQ2xpZW50UXQ+KikKK3sKKyAgICBpZiAobV9yb290R3JhcGhpY3NMYXllcikKKyAgICAg
ICAgc3luY1Jvb3RMYXllcigpOworCisgICAgbV9mcmFtZS0+ZnJhbWUtPnZpZXcoKS0+Zmx1c2hD
b21wb3NpdGluZ1N0YXRlSW5jbHVkaW5nU3ViZnJhbWVzKCk7CisKKyAgICBpZiAoIW1fcm9vdEdy
YXBoaWNzTGF5ZXIpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChyb290TGF5ZXIoKS0+ZGVz
Y2VuZGFudHNPclNlbGZIYXZlUnVubmluZ0FuaW1hdGlvbnMoKSAmJiAhbV9zeW5jVGltZXIuaXNB
Y3RpdmUoKSkKKyAgICAgICAgbV9zeW5jVGltZXIuc3RhcnRPbmVTaG90KDEuMCAvIDYwLjApOwor
CisgICAgbV9mcmFtZS0+cGFnZUFkYXB0ZXItPmNsaWVudC0+cmVwYWludFZpZXdwb3J0KCk7Cit9
CisKK3ZvaWQgVGV4dHVyZU1hcHBlckxheWVyQ2xpZW50UXQ6OnJlbmRlckNvbXBvc2l0ZWRMYXll
cnMoR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiBjbGlwKQoreworICAg
IGlmICghbV9yb290VGV4dHVyZU1hcHBlckxheWVyIHx8ICFtX3RleHR1cmVNYXBwZXIpCisgICAg
ICAgIHJldHVybjsKKworICAgIG1fdGV4dHVyZU1hcHBlci0+c2V0R3JhcGhpY3NDb250ZXh0KGNv
bnRleHQpOworICAgIG1fdGV4dHVyZU1hcHBlci0+c2V0SW1hZ2VJbnRlcnBvbGF0aW9uUXVhbGl0
eShjb250ZXh0LT5pbWFnZUludGVycG9sYXRpb25RdWFsaXR5KCkpOworICAgIG1fdGV4dHVyZU1h
cHBlci0+c2V0VGV4dERyYXdpbmdNb2RlKGNvbnRleHQtPnRleHREcmF3aW5nTW9kZSgpKTsKKyAg
ICBRUGFpbnRlciogcGFpbnRlciA9IGNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpOworICAgIGNv
bnN0IFFUcmFuc2Zvcm0gdHJhbnNmb3JtID0gcGFpbnRlci0+d29ybGRUcmFuc2Zvcm0oKTsKKyAg
ICBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBtYXRyaXgoCisgICAgICAgICAgICAgICAgdHJh
bnNmb3JtLm0xMSgpLCB0cmFuc2Zvcm0ubTEyKCksIDAsIHRyYW5zZm9ybS5tMTMoKSwKKyAgICAg
ICAgICAgICAgICB0cmFuc2Zvcm0ubTIxKCksIHRyYW5zZm9ybS5tMjIoKSwgMCwgdHJhbnNmb3Jt
Lm0yMygpLAorICAgICAgICAgICAgICAgIDAsIDAsIDEsIDAsCisgICAgICAgICAgICAgICAgdHJh
bnNmb3JtLm0zMSgpLCB0cmFuc2Zvcm0ubTMyKCksIDAsIHRyYW5zZm9ybS5tMzMoKQorICAgICAg
ICAgICAgICAgICk7CisgICAgbV9yb290VGV4dHVyZU1hcHBlckxheWVyLT5zZXRUcmFuc2Zvcm0o
bWF0cml4KTsKKyAgICBtX3Jvb3RUZXh0dXJlTWFwcGVyTGF5ZXItPnNldE9wYWNpdHkocGFpbnRl
ci0+b3BhY2l0eSgpKTsKKyAgICBtX3RleHR1cmVNYXBwZXItPmJlZ2luUGFpbnRpbmcoKTsKKyAg
ICBtX3RleHR1cmVNYXBwZXItPmJlZ2luQ2xpcChtYXRyaXgsIGNsaXApOworICAgIG1fcm9vdFRl
eHR1cmVNYXBwZXJMYXllci0+cGFpbnQoKTsKKyAgICBtX3RleHR1cmVNYXBwZXItPmVuZENsaXAo
KTsKKyAgICBtX3RleHR1cmVNYXBwZXItPmVuZFBhaW50aW5nKCk7Cit9CisKKyNlbmRpZgpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9UZXh0dXJlTWFwcGVyTGF5
ZXJDbGllbnRRdC5oIGIvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9UZXh0dXJlTWFw
cGVyTGF5ZXJDbGllbnRRdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjJjNzM1ZDc2MDQxYWY0NTQ5NDIzNGJlYzE0
YmFlOGU2NDZmMTFmMDIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNv
cmVTdXBwb3J0L1RleHR1cmVNYXBwZXJMYXllckNsaWVudFF0LmgKQEAgLTAsMCArMSw2MSBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1
YnNpZGlhcnkoLWllcykKKyAqIENvcHlyaWdodCAoQykgMjAxMiBEaWdpYSBQbGMgYW5kL29yIGl0
cyBzdWJzaWRpYXJ5KC1pZXMpCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7
IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0
ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVi
bGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lv
biAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9u
LgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0
IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2
ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVy
YWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhh
dmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNl
bnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElC
LiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5j
LiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAt
MTMwMSwgVVNBLgorICoKKyAqLworI2lmbmRlZiBUZXh0dXJlTWFwcGVyTGF5ZXJDbGllbnRRdF9o
CisjZGVmaW5lIFRleHR1cmVNYXBwZXJMYXllckNsaWVudFF0X2gKKworY2xhc3MgUVdlYkZyYW1l
QWRhcHRlcjsKKworI2luY2x1ZGUgIkdyYXBoaWNzTGF5ZXIuaCIKKyNpbmNsdWRlICJUZXh0dXJl
TWFwcGVyLmgiCisjaW5jbHVkZSAiVGltZXIuaCIKKyNpbmNsdWRlICJ3dGYvT3duUHRyLmgiCisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgVGV4dHVyZU1hcHBlckxheWVyOworCisjaWYg
VVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorY2xhc3MgVGV4dHVyZU1hcHBlckxheWVyQ2xp
ZW50UXQgeworcHVibGljOgorICAgIFRleHR1cmVNYXBwZXJMYXllckNsaWVudFF0KFFXZWJGcmFt
ZUFkYXB0ZXIqKTsKKyAgICB+VGV4dHVyZU1hcHBlckxheWVyQ2xpZW50UXQoKTsKKyAgICB2b2lk
IHN5bmNSb290TGF5ZXIoKTsKKyAgICBUZXh0dXJlTWFwcGVyTGF5ZXIqIHJvb3RMYXllcigpOwor
CisgICAgdm9pZCBtYXJrRm9yU3luYyhib29sIHNjaGVkdWxlU3luYyk7CisKKyAgICB2b2lkIHNl
dFJvb3RHcmFwaGljc0xheWVyKEdyYXBoaWNzTGF5ZXIqIGxheWVyKTsKKworICAgIHZvaWQgc3lu
Y0xheWVycyhUaW1lcjxUZXh0dXJlTWFwcGVyTGF5ZXJDbGllbnRRdD4qKTsKKworICAgIHZvaWQg
cmVuZGVyQ29tcG9zaXRlZExheWVycyhHcmFwaGljc0NvbnRleHQqLCBjb25zdCBJbnRSZWN0JiBj
bGlwKTsKK3ByaXZhdGU6CisgICAgUVdlYkZyYW1lQWRhcHRlciogbV9mcmFtZTsKKyAgICBPd25Q
dHI8R3JhcGhpY3NMYXllcj4gbV9yb290R3JhcGhpY3NMYXllcjsKKyAgICBUaW1lcjxUZXh0dXJl
TWFwcGVyTGF5ZXJDbGllbnRRdD4gbV9zeW5jVGltZXI7CisgICAgV2ViQ29yZTo6VGV4dHVyZU1h
cHBlckxheWVyKiBtX3Jvb3RUZXh0dXJlTWFwcGVyTGF5ZXI7CisgICAgT3duUHRyPFdlYkNvcmU6
OlRleHR1cmVNYXBwZXI+IG1fdGV4dHVyZU1hcHBlcjsKK307CisjZW5kaWYKKworfQorCisjZW5k
aWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvVW5kb1N0ZXBR
dC5oIGIvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9VbmRvU3RlcFF0LmgKaW5kZXgg
ODVkNzk5MWMzNzkzZjQzOGFmMTI4YmNiMmFmOGFhOGM0YmQ0NDJlYy4uNDk1MGM5OWY0N2I3ZWVj
YzIyODlhODBjMDM1NDkxNGU3NjM1MTIyMyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9xdC9X
ZWJDb3JlU3VwcG9ydC9VbmRvU3RlcFF0LmgKKysrIGIvU291cmNlL1dlYktpdC9xdC9XZWJDb3Jl
U3VwcG9ydC9VbmRvU3RlcFF0LmgKQEAgLTIzLDExICsyMywxMiBAQAogI2luY2x1ZGUgPFVuZG9T
dGVwLmg+CiAKICNpbmNsdWRlIDxxc3RyaW5nLmg+CisjaW5jbHVkZSA8cXdlYmtpdGdsb2JhbC5o
PgorI2luY2x1ZGUgPHd0Zi9FeHBvcnRNYWNyb3MuaD4KICNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+
CiAKLWNsYXNzIFVuZG9TdGVwUXQgeworY2xhc3MgV0VCS0lUX0VYUE9SVERBVEEgVW5kb1N0ZXBR
dCAgewogICAgIHB1YmxpYzoKLSAgICAgICAgVW5kb1N0ZXBRdChXVEY6OlJlZlB0cjxXZWJDb3Jl
OjpVbmRvU3RlcD4pOwogICAgICAgICB+VW5kb1N0ZXBRdCgpOwogCiAgICAgICAgIHZvaWQgcmVk
bygpOwpAQCAtMzUsOSArMzYsMTIgQEAgY2xhc3MgVW5kb1N0ZXBRdCB7CiAgICAgICAgIFFTdHJp
bmcgdGV4dCgpIGNvbnN0OwogCiAgICAgcHJpdmF0ZToKKyAgICAgICAgVW5kb1N0ZXBRdChXVEY6
OlJlZlB0cjxXZWJDb3JlOjpVbmRvU3RlcD4pOworCiAgICAgICAgIFdURjo6UmVmUHRyPFdlYkNv
cmU6OlVuZG9TdGVwPiBtX3N0ZXA7CiAgICAgICAgIGJvb2wgbV9maXJzdDsKICAgICAgICAgUVN0
cmluZyBtX3RleHQ7CisgICAgICAgIGZyaWVuZCBjbGFzcyBRV2ViUGFnZUFkYXB0ZXI7CiB9Owog
CiAjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvcXQvV2lkZ2V0QXBpL3FncmFwaGlj
c3dlYnZpZXcuY3BwIGIvU291cmNlL1dlYktpdC9xdC9XaWRnZXRBcGkvcWdyYXBoaWNzd2Vidmll
dy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMC4uZmI1NjYxZGY3NjZiY2M3YzhkMWM0YmE1Y2FkMjBkYTc2NDllMGI5
MQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvcXQvV2lkZ2V0QXBpL3FncmFwaGlj
c3dlYnZpZXcuY3BwCkBAIC0wLDAgKzEsMTE3MSBAQAorLyoKKyAgICBDb3B5cmlnaHQgKEMpIDIw
MDkgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCisgICAgQ29w
eXJpZ2h0IChDKSAyMDA5IEdpcmlzaCBSYW1ha3Jpc2huYW4gPGdpcmlzaEBmb3J3YXJkYmlhcy5p
bj4KKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJp
YnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg
TGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBG
cmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGlj
ZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMg
bGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVs
LAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVk
IHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExp
Y2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBh
IGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9u
ZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3
cml0ZSB0bworICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5r
bGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgICAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0Eu
CisqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAicWdyYXBoaWNzd2Vidmlldy5o
IgorCisjaWYgIWRlZmluZWQoUVRfTk9fR1JBUEhJQ1NWSUVXKQorCisjaW5jbHVkZSAicXdlYmZy
YW1lLmgiCisjaW5jbHVkZSAicXdlYmZyYW1lX3AuaCIKKyNpbmNsdWRlICJxd2VicGFnZS5oIgor
I2luY2x1ZGUgInF3ZWJwYWdlX3AuaCIKKyNpbmNsdWRlICJQYWdlQ2xpZW50UXQuaCIKKyNpbmNs
dWRlIDxxYXBwbGljYXRpb24uaD4KKyNpbmNsdWRlIDxxZ3JhcGhpY3NzY2VuZS5oPgorI2luY2x1
ZGUgPHFncmFwaGljc3NjZW5lZXZlbnQuaD4KKyNpbmNsdWRlIDxxZ3JhcGhpY3N2aWV3Lmg+Cisj
aW5jbHVkZSA8cXNjcm9sbGJhci5oPgorI2luY2x1ZGUgPHFzdHlsZW9wdGlvbi5oPgorI2luY2x1
ZGUgPFF0Q29yZS9xbWV0YW9iamVjdC5oPgorI2luY2x1ZGUgPFF0Q29yZS9xc2hhcmVkcG9pbnRl
ci5oPgorI2luY2x1ZGUgPFF0Q29yZS9xdGltZXIuaD4KKyNpbmNsdWRlIDxRdEd1aS9xcGl4bWFw
Y2FjaGUuaD4KKworI2lmIGRlZmluZWQoUV9XU19YMTEpCisjaW5jbHVkZSA8UVgxMUluZm8+Cisj
ZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CisKK2NsYXNzIFFHcmFwaGljc1dlYlZp
ZXdQcml2YXRlIHsKK3B1YmxpYzoKKyAgICBRR3JhcGhpY3NXZWJWaWV3UHJpdmF0ZShRR3JhcGhp
Y3NXZWJWaWV3KiBwYXJlbnQpCisgICAgICAgIDogcShwYXJlbnQpCisgICAgICAgICwgcGFnZSgw
KQorICAgICAgICAsIHJlc2l6ZXNUb0NvbnRlbnRzKGZhbHNlKQorICAgICAgICAsIHJlbmRlckhp
bnRzKFFQYWludGVyOjpUZXh0QW50aWFsaWFzaW5nIHwgUVBhaW50ZXI6OlNtb290aFBpeG1hcFRy
YW5zZm9ybSkge30KKworICAgIHZpcnR1YWwgflFHcmFwaGljc1dlYlZpZXdQcml2YXRlKCk7CisK
KyAgICB2b2lkIHVwZGF0ZVJlc2l6ZXNUb0NvbnRlbnRzRm9yUGFnZSgpOworCisgICAgdm9pZCBk
ZXRhY2hDdXJyZW50UGFnZSgpOworCisgICAgdm9pZCBfcV9kb0xvYWRGaW5pc2hlZChib29sIHN1
Y2Nlc3MpOworICAgIHZvaWQgX3FfY29udGVudHNTaXplQ2hhbmdlZChjb25zdCBRU2l6ZSYpOwor
ICAgIHZvaWQgX3Ffc2NhbGVDaGFuZ2VkKCk7CisKKyAgICB2b2lkIF9xX3BhZ2VEZXN0cm95ZWQo
KTsKKworICAgIFFHcmFwaGljc1dlYlZpZXcqIHE7CisgICAgUVdlYlBhZ2UqIHBhZ2U7CisgICAg
Ym9vbCByZXNpemVzVG9Db250ZW50czsKKyAgICBRUGFpbnRlcjo6UmVuZGVySGludHMgcmVuZGVy
SGludHM7CisKKyAgICBRR3JhcGhpY3NJdGVtT3ZlcmxheSogb3ZlcmxheSgpIGNvbnN0CisgICAg
eworICAgICAgICBpZiAoIXBhZ2UgfHwgIXBhZ2UtPmQtPmNsaWVudCkKKyAgICAgICAgICAgIHJl
dHVybiAwOworICAgICAgICByZXR1cm4gcGFnZUNsaWVudCgpLT5vdmVybGF5OworICAgIH0KKwor
ICAgIFBhZ2VDbGllbnRRR3JhcGhpY3NXaWRnZXQqIHBhZ2VDbGllbnQoKSBjb25zdAorICAgIHsK
KyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFdlYkNvcmU6OlBhZ2VDbGllbnRRR3JhcGhpY3NX
aWRnZXQqPiAocGFnZS0+ZC0+Y2xpZW50LmRhdGEoKSk7CisgICAgfSAKK307CisKK1FHcmFwaGlj
c1dlYlZpZXdQcml2YXRlOjp+UUdyYXBoaWNzV2ViVmlld1ByaXZhdGUoKQoreworICAgIGRldGFj
aEN1cnJlbnRQYWdlKCk7Cit9CisKK3ZvaWQgUUdyYXBoaWNzV2ViVmlld1ByaXZhdGU6Ol9xX2Rv
TG9hZEZpbmlzaGVkKGJvb2wgc3VjY2VzcykKK3sKKyAgICAvLyBJZiB0aGUgcGFnZSBoYWQgbm8g
dGl0bGUsIHN0aWxsIG1ha2Ugc3VyZSBpdCBnZXRzIHRoZSBzaWduYWwKKyAgICBpZiAocS0+dGl0
bGUoKS5pc0VtcHR5KCkpCisgICAgICAgIGVtaXQgcS0+dXJsQ2hhbmdlZChxLT51cmwoKSk7CisK
KyAgICBlbWl0IHEtPmxvYWRGaW5pc2hlZChzdWNjZXNzKTsKK30KKwordm9pZCBRR3JhcGhpY3NX
ZWJWaWV3UHJpdmF0ZTo6X3FfcGFnZURlc3Ryb3llZCgpCit7CisgICAgcGFnZSA9IDA7CisgICAg
cS0+c2V0UGFnZSgwKTsKK30KKwordm9pZCBRR3JhcGhpY3NXZWJWaWV3UHJpdmF0ZTo6dXBkYXRl
UmVzaXplc1RvQ29udGVudHNGb3JQYWdlKCkKK3sKKyAgICBBU1NFUlQocGFnZSk7CisgICAgcGFn
ZUNsaWVudCgpLT52aWV3UmVzaXplc1RvQ29udGVudHMgPSByZXNpemVzVG9Db250ZW50czsKKyAg
ICBpZiAocmVzaXplc1RvQ29udGVudHMpIHsKKyAgICAgICAgLy8gcmVzaXplcyB0byBjb250ZW50
cyBtb2RlIHJlcXVpcmVzIHByZWZlcnJlZCBjb250ZW50cyBzaXplIHRvIGJlIHNldAorICAgICAg
ICBpZiAoIXBhZ2UtPnByZWZlcnJlZENvbnRlbnRzU2l6ZSgpLmlzVmFsaWQoKSkKKyAgICAgICAg
ICAgIHBhZ2UtPnNldFByZWZlcnJlZENvbnRlbnRzU2l6ZShRU2l6ZSg5NjAsIDgwMCkpOworCisg
ICAgICAgIFFPYmplY3Q6OmNvbm5lY3QocGFnZS0+bWFpbkZyYW1lKCksIFNJR05BTChjb250ZW50
c1NpemVDaGFuZ2VkKFFTaXplKSksCisgICAgICAgICAgICBxLCBTTE9UKF9xX2NvbnRlbnRzU2l6
ZUNoYW5nZWQoY29uc3QgUVNpemUmKSksIFF0OjpVbmlxdWVDb25uZWN0aW9uKTsKKyAgICB9IGVs
c2UgeworICAgICAgICBRT2JqZWN0OjpkaXNjb25uZWN0KHBhZ2UtPm1haW5GcmFtZSgpLCBTSUdO
QUwoY29udGVudHNTaXplQ2hhbmdlZChRU2l6ZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAg
IHEsIFNMT1QoX3FfY29udGVudHNTaXplQ2hhbmdlZChjb25zdCBRU2l6ZSYpKSk7CisgICAgfQor
ICAgIHBhZ2UtPmQtPm1haW5GcmFtZUFkYXB0ZXIoKS0+c2V0UGFpbnRzRW50aXJlQ29udGVudHMo
cmVzaXplc1RvQ29udGVudHMpOworICAgIHBhZ2UtPmQtPm1haW5GcmFtZUFkYXB0ZXIoKS0+c2V0
RGVsZWdhdGVzU2Nyb2xsaW5nKHJlc2l6ZXNUb0NvbnRlbnRzKTsKK30KKwordm9pZCBRR3JhcGhp
Y3NXZWJWaWV3UHJpdmF0ZTo6X3FfY29udGVudHNTaXplQ2hhbmdlZChjb25zdCBRU2l6ZSYgc2l6
ZSkKK3sKKyAgICBpZiAoIXJlc2l6ZXNUb0NvbnRlbnRzKQorICAgICAgICByZXR1cm47CisgICAg
cS0+c2V0R2VvbWV0cnkoUVJlY3RGKHEtPmdlb21ldHJ5KCkudG9wTGVmdCgpLCBzaXplKSk7Cit9
CisKK3ZvaWQgUUdyYXBoaWNzV2ViVmlld1ByaXZhdGU6Ol9xX3NjYWxlQ2hhbmdlZCgpCit7Cisj
aWYgVVNFKFRJTEVEX0JBQ0tJTkdfU1RPUkUpCisgICAgaWYgKCFwYWdlKQorICAgICAgICByZXR1
cm47CisgICAgcGFnZS0+ZC0+bWFpbkZyYW1lQWRhcHRlcigpLT5zZXRUaWxlZEJhY2tpbmdTdG9y
ZUNvbnRlbnRzU2NhbGUocS0+c2NhbGUoKSk7CisjZW5kaWYKK30KKworLyohCisgICAgXGNsYXNz
IFFHcmFwaGljc1dlYlZpZXcKKyAgICBcYnJpZWYgVGhlIFFHcmFwaGljc1dlYlZpZXcgY2xhc3Mg
YWxsb3dzIFdlYiBjb250ZW50IHRvIGJlIGFkZGVkIHRvIGEgR3JhcGhpY3NWaWV3LgorICAgIFxz
aW5jZSA0LjYKKworICAgIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgcmVuZGVycyBXZWIgY29u
dGVudCBmcm9tIGEgVVJMIG9yIHN1cHBsaWVkIGFzIGRhdGEsIHVzaW5nCisgICAgZmVhdHVyZXMg
b2YgdGhlIFF0V2ViS2l0IG1vZHVsZS4KKworICAgIElmIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9m
IHRoZSBpdGVtIGFyZSBub3Qgc2V0LCB0aGV5IHdpbGwgZGVmYXVsdCB0byA4MDAgYW5kIDYwMCwK
KyAgICByZXNwZWN0aXZlbHkuIElmIHRoZSBXZWIgcGFnZSBjb250ZW50cyBpcyBsYXJnZXIgdGhh
biB0aGF0LCBzY3JvbGxiYXJzIHdpbGwgYmUgc2hvd24KKyAgICBpZiBub3QgZGlzYWJsZWQgZXhw
bGljaXRseS4KKworICAgIFxzZWN0aW9uMSBCcm93c2VyIEZlYXR1cmVzCisKKyAgICBNYW55IG9m
IHRoZSBmdW5jdGlvbnMsIHNpZ25hbHMgYW5kIHByb3BlcnRpZXMgcHJvdmlkZWQgYnkgUVdlYlZp
ZXcgYXJlIGFsc28gYXZhaWxhYmxlCisgICAgZm9yIHRoaXMgaXRlbSwgbWFraW5nIGl0IHNpbXBs
ZSB0byBhZGFwdCBleGlzdGluZyBjb2RlIHRvIHVzZSBRR3JhcGhpY3NXZWJWaWV3IGluc3RlYWQK
KyAgICBvZiBRV2ViVmlldy4KKworICAgIFRoZSBpdGVtIHVzZXMgYSBRV2ViUGFnZSBvYmplY3Qg
dG8gcGVyZm9ybSB0aGUgcmVuZGVyaW5nIG9mIFdlYiBjb250ZW50LCBhbmQgdGhpcyBjYW4KKyAg
ICBiZSBvYnRhaW5lZCB3aXRoIHRoZSBwYWdlKCkgZnVuY3Rpb24sIGVuYWJsaW5nIHRoZSBkb2N1
bWVudCBpdHNlbGYgdG8gYmUgYWNjZXNzZWQgYW5kCisgICAgbW9kaWZpZWQuCisKKyAgICBBcyB3
aXRoIFFXZWJWaWV3LCB0aGUgaXRlbSByZWNvcmRzIHRoZSBicm93c2luZyBoaXN0b3J5IHVzaW5n
IGEgUVdlYkhpc3Rvcnkgb2JqZWN0LAorICAgIGFjY2Vzc2libGUgdXNpbmcgdGhlIGhpc3Rvcnko
KSBmdW5jdGlvbi4gVGhlIFFXZWJTZXR0aW5ncyBvYmplY3QgdGhhdCBkZWZpbmVzIHRoZQorICAg
IGNvbmZpZ3VyYXRpb24gb2YgdGhlIGJyb3dzZXIgY2FuIGJlIG9idGFpbmVkIHdpdGggdGhlIHNl
dHRpbmdzKCkgZnVuY3Rpb24sIGVuYWJsaW5nCisgICAgZmVhdHVyZXMgbGlrZSBwbHVnaW4gc3Vw
cG9ydCB0byBiZSBjdXN0b21pemVkIGZvciBlYWNoIGl0ZW0uCisKKyAgICBcc2EgUVdlYlZpZXcs
IFFHcmFwaGljc1RleHRJdGVtCisqLworCisvKiEKKyAgICBcZm4gdm9pZCBRR3JhcGhpY3NXZWJW
aWV3Ojp0aXRsZUNoYW5nZWQoY29uc3QgUVN0cmluZyAmdGl0bGUpCisKKyAgICBUaGlzIHNpZ25h
bCBpcyBlbWl0dGVkIHdoZW5ldmVyIHRoZSBcYSB0aXRsZSBvZiB0aGUgbWFpbiBmcmFtZSBjaGFu
Z2VzLgorCisgICAgXHNhIHRpdGxlKCkKKyovCisKKy8qIQorICAgIFxmbiB2b2lkIFFHcmFwaGlj
c1dlYlZpZXc6OnVybENoYW5nZWQoY29uc3QgUVVybCAmdXJsKQorCisgICAgVGhpcyBzaWduYWwg
aXMgZW1pdHRlZCB3aGVuIHRoZSBcYSB1cmwgb2YgdGhlIHZpZXcgY2hhbmdlcy4KKworICAgIFxz
YSB1cmwoKSwgbG9hZCgpCisqLworCisvKiEKKyAgICBcZm4gdm9pZCBRR3JhcGhpY3NXZWJWaWV3
OjppY29uQ2hhbmdlZCgpCisKKyAgICBUaGlzIHNpZ25hbCBpcyBlbWl0dGVkIHdoZW5ldmVyIHRo
ZSBpY29uIG9mIHRoZSBwYWdlIGlzIGxvYWRlZCBvciBjaGFuZ2VzLgorCisgICAgSW4gb3JkZXIg
Zm9yIGljb25zIHRvIGJlIGxvYWRlZCwgeW91IHdpbGwgbmVlZCB0byBzZXQgYW4gaWNvbiBkYXRh
YmFzZSBwYXRoCisgICAgdXNpbmcgUVdlYlNldHRpbmdzOjpzZXRJY29uRGF0YWJhc2VQYXRoKCku
CisKKyAgICBcc2EgaWNvbigpLCBRV2ViU2V0dGluZ3M6OnNldEljb25EYXRhYmFzZVBhdGgoKQor
Ki8KKworLyohCisgICAgXGZuIHZvaWQgUUdyYXBoaWNzV2ViVmlldzo6bG9hZFN0YXJ0ZWQoKQor
CisgICAgVGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuIGEgbmV3IGxvYWQgb2YgdGhlIHBhZ2Ug
aXMgc3RhcnRlZC4KKworICAgIFxzYSBsb2FkUHJvZ3Jlc3MoKSwgbG9hZEZpbmlzaGVkKCkKKyov
CisKKy8qIQorICAgIFxmbiB2b2lkIFFHcmFwaGljc1dlYlZpZXc6OmxvYWRGaW5pc2hlZChib29s
IG9rKQorCisgICAgVGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuIGEgbG9hZCBvZiB0aGUgcGFn
ZSBpcyBmaW5pc2hlZC4KKyAgICBcYSBvayB3aWxsIGluZGljYXRlIHdoZXRoZXIgdGhlIGxvYWQg
d2FzIHN1Y2Nlc3NmdWwgb3IgYW55IGVycm9yIG9jY3VycmVkLgorCisgICAgXHNhIGxvYWRTdGFy
dGVkKCkKKyovCisKKy8qIQorICAgIENvbnN0cnVjdHMgYW4gZW1wdHkgUUdyYXBoaWNzV2ViVmll
dyB3aXRoIHBhcmVudCBcYSBwYXJlbnQuCisKKyAgICBcc2EgbG9hZCgpCisqLworUUdyYXBoaWNz
V2ViVmlldzo6UUdyYXBoaWNzV2ViVmlldyhRR3JhcGhpY3NJdGVtKiBwYXJlbnQpCisgICAgOiBR
R3JhcGhpY3NXaWRnZXQocGFyZW50KQorICAgICwgZChuZXcgUUdyYXBoaWNzV2ViVmlld1ByaXZh
dGUodGhpcykpCit7CisgICAgc2V0RmxhZyhRR3JhcGhpY3NJdGVtOjpJdGVtVXNlc0V4dGVuZGVk
U3R5bGVPcHRpb24sIHRydWUpOworICAgIHNldEFjY2VwdERyb3BzKHRydWUpOworICAgIHNldEFj
Y2VwdEhvdmVyRXZlbnRzKHRydWUpOworICAgIHNldEFjY2VwdFRvdWNoRXZlbnRzKHRydWUpOwor
ICAgIHNldEZvY3VzUG9saWN5KFF0OjpTdHJvbmdGb2N1cyk7CisgICAgc2V0RmxhZyhRR3JhcGhp
Y3NJdGVtOjpJdGVtQ2xpcHNDaGlsZHJlblRvU2hhcGUsIHRydWUpOworI2lmIFVTRShUSUxFRF9C
QUNLSU5HX1NUT1JFKQorICAgIFFPYmplY3Q6OmNvbm5lY3QodGhpcywgU0lHTkFMKHNjYWxlQ2hh
bmdlZCgpKSwgdGhpcywgU0xPVChfcV9zY2FsZUNoYW5nZWQoKSkpOworI2VuZGlmCit9CisKKy8q
IQorICAgIERlc3Ryb3lzIHRoZSBpdGVtLgorKi8KK1FHcmFwaGljc1dlYlZpZXc6On5RR3JhcGhp
Y3NXZWJWaWV3KCkKK3sKKyAgICBkZWxldGUgZDsKK30KKworLyohCisgICAgUmV0dXJucyBhIHBv
aW50ZXIgdG8gdGhlIHVuZGVybHlpbmcgd2ViIHBhZ2UuCisKKyAgICBcc2Egc2V0UGFnZSgpCisq
LworUVdlYlBhZ2UqIFFHcmFwaGljc1dlYlZpZXc6OnBhZ2UoKSBjb25zdAoreworICAgIGlmICgh
ZC0+cGFnZSkgeworICAgICAgICBRR3JhcGhpY3NXZWJWaWV3KiB0aGF0ID0gY29uc3RfY2FzdDxR
R3JhcGhpY3NXZWJWaWV3Kj4odGhpcyk7CisgICAgICAgIFFXZWJQYWdlKiBwYWdlID0gbmV3IFFX
ZWJQYWdlKHRoYXQpOworCisgICAgICAgIC8vIERlZmF1bHQgdG8gbm90IGhhdmluZyBhIGJhY2tn
cm91bmQsIGluIHRoZSBjYXNlCisgICAgICAgIC8vIHRoZSBwYWdlIGRvZXNuJ3QgcHJvdmlkZSBv
bmUuCisgICAgICAgIFFQYWxldHRlIHBhbGV0dGUgPSBRQXBwbGljYXRpb246OnBhbGV0dGUoKTsK
KyAgICAgICAgcGFsZXR0ZS5zZXRCcnVzaChRUGFsZXR0ZTo6QmFzZSwgUUNvbG9yOjpmcm9tUmdi
RigwLCAwLCAwLCAwKSk7CisgICAgICAgIHBhZ2UtPnNldFBhbGV0dGUocGFsZXR0ZSk7CisKKyAg
ICAgICAgdGhhdC0+c2V0UGFnZShwYWdlKTsKKyAgICB9CisKKyAgICByZXR1cm4gZC0+cGFnZTsK
K30KKworLyohIFxyZWltcAorKi8KK3ZvaWQgUUdyYXBoaWNzV2ViVmlldzo6cGFpbnQoUVBhaW50
ZXIqIHBhaW50ZXIsIGNvbnN0IFFTdHlsZU9wdGlvbkdyYXBoaWNzSXRlbSogb3B0aW9uLCBRV2lk
Z2V0KikKK3sKKyAgICBRUGFpbnRlcjo6UmVuZGVySGludHMgb2xkSGludHMgPSBwYWludGVyLT5y
ZW5kZXJIaW50cygpOworICAgIHBhaW50ZXItPnNldFJlbmRlckhpbnRzKG9sZEhpbnRzIHwgZC0+
cmVuZGVySGludHMpOworI2lmIFVTRShUSUxFRF9CQUNLSU5HX1NUT1JFKQorICAgIC8vIFFXZWJG
cmFtZTo6cmVuZGVyIGlzIGEgcHVibGljIEFQSSwgYnlwYXNzIGl0IGZvciB0aWxlZCByZW5kZXJp
bmcgc28gYmVoYXZpb3IgZG9lcyBub3QgbmVlZCB0byBjaGFuZ2UuCisgICAgaWYgKHBhZ2UoKS0+
bWFpbkZyYW1lKCktPmQtPnJlbmRlckZyb21UaWxlZEJhY2tpbmdTdG9yZShwYWludGVyLCBvcHRp
b24tPmV4cG9zZWRSZWN0LnRvQWxpZ25lZFJlY3QoKSkpIHsKKyAgICAgICAgcGFpbnRlci0+c2V0
UmVuZGVySGludHMob2xkSGludHMpOworICAgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmCisg
ICAgcGFnZSgpLT5tYWluRnJhbWUoKS0+cmVuZGVyKHBhaW50ZXIsIFFXZWJGcmFtZTo6QWxsTGF5
ZXJzLCBvcHRpb24tPmV4cG9zZWRSZWN0LnRvUmVjdCgpKTsKKyAgICBwYWludGVyLT5zZXRSZW5k
ZXJIaW50cyhvbGRIaW50cyk7Cit9CisKKy8qISBccmVpbXAKKyovCitib29sIFFHcmFwaGljc1dl
YlZpZXc6OnNjZW5lRXZlbnQoUUV2ZW50KiBldmVudCkKK3sKKyAgICAvLyBSZS1pbXBsZW1lbnRl
ZCBpbiBvcmRlciB0byBhbGxvd3MgZml4aW5nIGV2ZW50LXJlbGF0ZWQgYnVncyBpbiBwYXRjaCBy
ZWxlYXNlcy4KKworICAgIGlmIChkLT5wYWdlICYmIChldmVudC0+dHlwZSgpID09IFFFdmVudDo6
VG91Y2hCZWdpbgorICAgICAgICAgICAgICAgIHx8IGV2ZW50LT50eXBlKCkgPT0gUUV2ZW50OjpU
b3VjaEVuZAorICAgICAgICAgICAgICAgIHx8IGV2ZW50LT50eXBlKCkgPT0gUUV2ZW50OjpUb3Vj
aFVwZGF0ZQorICAgICAgICAgICAgICAgIHx8IGV2ZW50LT50eXBlKCkgPT0gUUV2ZW50OjpUb3Vj
aENhbmNlbAorICAgICAgICkpIHsKKyAgICAgICAgZC0+cGFnZS0+ZXZlbnQoZXZlbnQpOworCisg
ICAgICAgIC8vIEFsd2F5cyByZXR1cm4gdHJ1ZSBzbyB0aGF0IHdlJ2xsIHJlY2VpdmUgYWxzbyBU
b3VjaFVwZGF0ZSBhbmQgVG91Y2hFbmQgZXZlbnRzCisgICAgICAgIHJldHVybiB0cnVlOworICAg
IH0KKworICAgIHJldHVybiBRR3JhcGhpY3NXaWRnZXQ6OnNjZW5lRXZlbnQoZXZlbnQpOworfQor
CisvKiEgXHJlaW1wCisqLworUVZhcmlhbnQgUUdyYXBoaWNzV2ViVmlldzo6aXRlbUNoYW5nZShH
cmFwaGljc0l0ZW1DaGFuZ2UgY2hhbmdlLCBjb25zdCBRVmFyaWFudCYgdmFsdWUpCit7CisgICAg
c3dpdGNoIChjaGFuZ2UpIHsKKyAgICAvLyBEaWZmZXJlbnRseSBmcm9tIFFXZWJWaWV3LCBpdCBp
cyBpbnRlcmVzdGluZyB0byBRR3JhcGhpY3NXZWJWaWV3IHRvIGhhbmRsZQorICAgIC8vIHBvc3Qg
bW91c2UgY3Vyc29yIGNoYW5nZSBub3RpZmljYXRpb25zLiBSZWFzb246ICdJdGVtQ3Vyc29yQ2hh
bmdlJyBpcyBzZW50CisgICAgLy8gYXMgdGhlIGZpcnN0IGFjdGlvbiBpbiBRR3JhcGhpY3NJdGVt
OjpzZXRDdXJzb3IgaW1wbGVtZW50YXRpb24sIGFuZCBhdCB0aGF0CisgICAgLy8gaXRlbSB3aWRn
ZXQncyBjdXJzb3IgaGFzIG5vdCBiZWVuIGVmZmVjdGl2ZWx5IGNoYW5nZWQgeWV0LgorICAgIC8v
IEFmdGVyIGN1cnNvciBpcyBwcm9wZXJseSBzZXQgKGF0ICdJdGVtQ3Vyc29ySGFzQ2hhbmdlZCcg
ZW1pc3Npb24gdGltZSksIHdlCisgICAgLy8gZmlyZSAnQ3Vyc29yQ2hhbmdlJy4KKyAgICBjYXNl
IEl0ZW1DdXJzb3JDaGFuZ2U6CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICBjYXNlIEl0ZW1D
dXJzb3JIYXNDaGFuZ2VkOiB7CisgICAgICAgICAgICBRRXZlbnQgZXZlbnQoUUV2ZW50OjpDdXJz
b3JDaGFuZ2UpOworICAgICAgICAgICAgUUFwcGxpY2F0aW9uOjpzZW5kRXZlbnQodGhpcywgJmV2
ZW50KTsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIGRlZmF1bHQ6
CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBRR3JhcGhpY3NXaWRnZXQ6Oml0
ZW1DaGFuZ2UoY2hhbmdlLCB2YWx1ZSk7Cit9CisKKy8qISBccmVpbXAKKyovCitRU2l6ZUYgUUdy
YXBoaWNzV2ViVmlldzo6c2l6ZUhpbnQoUXQ6OlNpemVIaW50IHdoaWNoLCBjb25zdCBRU2l6ZUYm
IGNvbnN0cmFpbnQpIGNvbnN0Cit7CisgICAgaWYgKHdoaWNoID09IFF0OjpQcmVmZXJyZWRTaXpl
KQorICAgICAgICByZXR1cm4gUVNpemVGKDgwMCwgNjAwKTsgLy8gIyMjCisgICAgcmV0dXJuIFFH
cmFwaGljc1dpZGdldDo6c2l6ZUhpbnQod2hpY2gsIGNvbnN0cmFpbnQpOworfQorCisvKiEgXHJl
aW1wCisqLworUVZhcmlhbnQgUUdyYXBoaWNzV2ViVmlldzo6aW5wdXRNZXRob2RRdWVyeShRdDo6
SW5wdXRNZXRob2RRdWVyeSBxdWVyeSkgY29uc3QKK3sKKyAgICBpZiAoZC0+cGFnZSkKKyAgICAg
ICAgcmV0dXJuIGQtPnBhZ2UtPmlucHV0TWV0aG9kUXVlcnkocXVlcnkpOworICAgIHJldHVybiBR
VmFyaWFudCgpOworfQorCisvKiEKKyAgICBccHJvcGVydHkgUUdyYXBoaWNzV2ViVmlldzo6cmVu
ZGVySGludHMKKyAgICBcc2luY2UgNC44CisgICAgXGJyaWVmIHRoZSBkZWZhdWx0IHJlbmRlciBo
aW50cyBmb3IgdGhlIHZpZXcKKworICAgIFRoZXNlIGhpbnRzIGFyZSB1c2VkIHRvIGluaXRpYWxp
emUgUVBhaW50ZXIgYmVmb3JlIHBhaW50aW5nIHRoZSBXZWIgcGFnZS4KKworICAgIFFQYWludGVy
OjpUZXh0QW50aWFsaWFzaW5nIGFuZCBRUGFpbnRlcjo6U21vb3RoUGl4bWFwVHJhbnNmb3JtIGFy
ZSBlbmFibGVkIGJ5IGRlZmF1bHQgYW5kIHdpbGwgYmUKKyAgICB1c2VkIHRvIHJlbmRlciB0aGUg
aXRlbSBpbiBhZGRpdGlvbiBvZiB3aGF0IGhhcyBiZWVuIHNldCBvbiB0aGUgcGFpbnRlciBnaXZl
biBieSBRR3JhcGhpY3NTY2VuZS4KKworICAgIFxzYSBRUGFpbnRlcjo6cmVuZGVySGludHMoKQor
Ki8KKworLyohCisgICAgXHNpbmNlIDQuOAorICAgIFJldHVybnMgdGhlIHJlbmRlciBoaW50cyB1
c2VkIGJ5IHRoZSB2aWV3IHRvIHJlbmRlciBjb250ZW50LgorCisgICAgXHNhIFFQYWludGVyOjpy
ZW5kZXJIaW50cygpCisqLworUVBhaW50ZXI6OlJlbmRlckhpbnRzIFFHcmFwaGljc1dlYlZpZXc6
OnJlbmRlckhpbnRzKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZC0+cmVuZGVySGludHM7Cit9CisK
Ky8qIQorICAgIFxzaW5jZSA0LjgKKyAgICBTZXRzIHRoZSByZW5kZXIgaGludHMgdXNlZCBieSB0
aGUgdmlldyB0byB0aGUgc3BlY2lmaWVkIFxhIGhpbnRzLgorCisgICAgXHNhIFFQYWludGVyOjpz
ZXRSZW5kZXJIaW50cygpCisqLwordm9pZCBRR3JhcGhpY3NXZWJWaWV3OjpzZXRSZW5kZXJIaW50
cyhRUGFpbnRlcjo6UmVuZGVySGludHMgaGludHMpCit7CisgICAgaWYgKGhpbnRzID09IGQtPnJl
bmRlckhpbnRzKQorICAgICAgICByZXR1cm47CisgICAgZC0+cmVuZGVySGludHMgPSBoaW50czsK
KyAgICB1cGRhdGUoKTsKK30KKworLyohCisgICAgXHNpbmNlIDQuOAorICAgIElmIFxhIGVuYWJs
ZWQgaXMgdHJ1ZSwgZW5hYmxlcyB0aGUgc3BlY2lmaWVkIHJlbmRlciBcYSBoaW50OyBvdGhlcndp
c2UKKyAgICBkaXNhYmxlcyBpdC4KKworICAgIFxzYSByZW5kZXJIaW50cywgUVBhaW50ZXI6OnJl
bmRlckhpbnRzKCkKKyovCit2b2lkIFFHcmFwaGljc1dlYlZpZXc6OnNldFJlbmRlckhpbnQoUVBh
aW50ZXI6OlJlbmRlckhpbnQgaGludCwgYm9vbCBlbmFibGVkKQoreworICAgIFFQYWludGVyOjpS
ZW5kZXJIaW50cyBvbGRIaW50cyA9IGQtPnJlbmRlckhpbnRzOworICAgIGlmIChlbmFibGVkKQor
ICAgICAgICBkLT5yZW5kZXJIaW50cyB8PSBoaW50OworICAgIGVsc2UKKyAgICAgICAgZC0+cmVu
ZGVySGludHMgJj0gfmhpbnQ7CisgICAgaWYgKG9sZEhpbnRzICE9IGQtPnJlbmRlckhpbnRzKQor
ICAgICAgICB1cGRhdGUoKTsKK30KKworLyohIFxyZWltcAorKi8KK2Jvb2wgUUdyYXBoaWNzV2Vi
Vmlldzo6ZXZlbnQoUUV2ZW50KiBldmVudCkKK3sKKyAgICAvLyBSZS1pbXBsZW1lbnRlZCBpbiBv
cmRlciB0byBhbGxvd3MgZml4aW5nIGV2ZW50LXJlbGF0ZWQgYnVncyBpbiBwYXRjaCByZWxlYXNl
cy4KKworICAgIGlmIChkLT5wYWdlKSB7CisgICAgICAgIGlmIChldmVudC0+dHlwZSgpID09IFFF
dmVudDo6UGFsZXR0ZUNoYW5nZSkKKyAgICAgICAgICAgIGQtPnBhZ2UtPnNldFBhbGV0dGUocGFs
ZXR0ZSgpKTsKKyNpZm5kZWYgUVRfTk9fQ09OVEVYVE1FTlUKKyAgICAgICAgaWYgKGV2ZW50LT50
eXBlKCkgPT0gUUV2ZW50OjpHcmFwaGljc1NjZW5lQ29udGV4dE1lbnUpIHsKKyAgICAgICAgICAg
IGlmICghaXNFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
ICAgICAgICBRR3JhcGhpY3NTY2VuZUNvbnRleHRNZW51RXZlbnQqIGV2ID0gc3RhdGljX2Nhc3Q8
UUdyYXBoaWNzU2NlbmVDb250ZXh0TWVudUV2ZW50Kj4oZXZlbnQpOworICAgICAgICAgICAgUUNv
bnRleHRNZW51RXZlbnQgZmFrZUV2ZW50KFFDb250ZXh0TWVudUV2ZW50OjpSZWFzb24oZXYtPnJl
YXNvbigpKSwgZXYtPnBvcygpLnRvUG9pbnQoKSk7CisgICAgICAgICAgICBpZiAoZC0+cGFnZS0+
c3dhbGxvd0NvbnRleHRNZW51RXZlbnQoJmZha2VFdmVudCkpIHsKKyAgICAgICAgICAgICAgICBl
dmVudC0+YWNjZXB0KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICBkLT5wYWdlLT51cGRhdGVQb3NpdGlvbkRlcGVuZGVudEFjdGlvbnMo
ZmFrZUV2ZW50LnBvcygpKTsKKyAgICAgICAgfSBlbHNlCisjZW5kaWYgLy8gUVRfTk9fQ09OVEVY
VE1FTlUKKyAgICAgICAgeworI2lmbmRlZiBRVF9OT19DVVJTT1IKKyAgICAgICAgICAgIGlmIChl
dmVudC0+dHlwZSgpID09IFFFdmVudDo6Q3Vyc29yQ2hhbmdlKSB7CisgICAgICAgICAgICAgICAg
Ly8gQW4gdW5zZXRDdXJzb3Igd2lsbCBzZXQgdGhlIGN1cnNvciB0byBRdDo6QXJyb3dDdXJzb3Iu
CisgICAgICAgICAgICAgICAgLy8gVGh1cyB0aGlzIGN1cnNvciBjaGFuZ2UgbWlnaHQgYmUgYSBR
V2lkZ2V0Ojp1bnNldEN1cnNvcigpCisgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBub3Qg
dGhlIGNhc2UgYW5kIGl0IGNhbWUgZnJvbSBXZWJDb3JlLCB0aGUKKyAgICAgICAgICAgICAgICAv
LyBRV2ViUGFnZUNsaWVudCBhbHJlYWR5IGhhcyBzZXQgaXRzIGN1cnNvciBpbnRlcm5hbGx5Cisg
ICAgICAgICAgICAgICAgLy8gdG8gUXQ6OkFycm93Q3Vyc29yLCBzbyB1cGRhdGluZyB0aGUgY3Vy
c29yIGlzIGFsd2F5cworICAgICAgICAgICAgICAgIC8vIHJpZ2h0LCBhcyBpdCBmYWxscyBiYWNr
IHRvIHRoZSBsYXN0IGN1cnNvciBzZXQgYnkKKyAgICAgICAgICAgICAgICAvLyBXZWJDb3JlLgor
ICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBBZGQgYSBRRXZlbnQ6OkN1cnNvclVuc2V0IG9yIHNp
bWlsYXIgdG8gUXQuCisgICAgICAgICAgICAgICAgaWYgKGN1cnNvcigpLnNoYXBlKCkgPT0gUXQ6
OkFycm93Q3Vyc29yKQorICAgICAgICAgICAgICAgICAgICBkLT5wYWdlLT5kLT5jbGllbnQtPnJl
c2V0Q3Vyc29yKCk7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfQorICAgIH0KKyAg
ICByZXR1cm4gUUdyYXBoaWNzV2lkZ2V0OjpldmVudChldmVudCk7Cit9CisKK3ZvaWQgUUdyYXBo
aWNzV2ViVmlld1ByaXZhdGU6OmRldGFjaEN1cnJlbnRQYWdlKCkKK3sKKyAgICBpZiAoIXBhZ2Up
CisgICAgICAgIHJldHVybjsKKworICAgIHBhZ2UtPmQtPnZpZXcgPSAwOworICAgIHBhZ2UtPmQt
PmNsaWVudC5yZXNldCgpOworCisgICAgLy8gaWYgdGhlIHBhZ2Ugd2FzIGNyZWF0ZWQgYnkgdXMs
IHdlIG93biBpdCBhbmQgbmVlZCB0bworICAgIC8vIGRlc3Ryb3kgaXQgYXMgd2VsbC4KKworICAg
IGlmIChwYWdlLT5wYXJlbnQoKSA9PSBxKQorICAgICAgICBkZWxldGUgcGFnZTsKKyAgICBlbHNl
CisgICAgICAgIHBhZ2UtPmRpc2Nvbm5lY3QocSk7CisKKyAgICBwYWdlID0gMDsKK30KKworLyoh
CisgICAgTWFrZXMgXGEgcGFnZSB0aGUgbmV3IHdlYiBwYWdlIG9mIHRoZSB3ZWIgZ3JhcGhpY3Np
dGVtLgorCisgICAgVGhlIHBhcmVudCBRT2JqZWN0IG9mIHRoZSBwcm92aWRlZCBwYWdlIHJlbWFp
bnMgdGhlIG93bmVyCisgICAgb2YgdGhlIG9iamVjdC4gSWYgdGhlIGN1cnJlbnQgZG9jdW1lbnQg
aXMgYSBjaGlsZCBvZiB0aGUgd2ViCisgICAgdmlldywgaXQgd2lsbCBiZSBkZWxldGVkLgorCisg
ICAgXHNhIHBhZ2UoKQorKi8KK3ZvaWQgUUdyYXBoaWNzV2ViVmlldzo6c2V0UGFnZShRV2ViUGFn
ZSogcGFnZSkKK3sKKyAgICBpZiAoZC0+cGFnZSA9PSBwYWdlKQorICAgICAgICByZXR1cm47CisK
KyAgICBkLT5kZXRhY2hDdXJyZW50UGFnZSgpOworICAgIGQtPnBhZ2UgPSBwYWdlOworCisgICAg
aWYgKCFkLT5wYWdlKQorICAgICAgICByZXR1cm47CisKKyAgICBkLT5wYWdlLT5kLT5jbGllbnQu
cmVzZXQobmV3IFBhZ2VDbGllbnRRR3JhcGhpY3NXaWRnZXQodGhpcywgcGFnZSkpOworCisgICAg
aWYgKGQtPm92ZXJsYXkoKSkKKyAgICAgICAgZC0+b3ZlcmxheSgpLT5wcmVwYXJlR3JhcGhpY3NJ
dGVtR2VvbWV0cnlDaGFuZ2UoKTsKKworICAgIFFTaXplIHNpemUgPSBnZW9tZXRyeSgpLnNpemUo
KS50b1NpemUoKTsKKyAgICBwYWdlLT5zZXRWaWV3cG9ydFNpemUoc2l6ZSk7CisKKyAgICBpZiAo
ZC0+cmVzaXplc1RvQ29udGVudHMpCisgICAgICAgIGQtPnVwZGF0ZVJlc2l6ZXNUb0NvbnRlbnRz
Rm9yUGFnZSgpOworCisgICAgUVdlYkZyYW1lKiBtYWluRnJhbWUgPSBkLT5wYWdlLT5tYWluRnJh
bWUoKTsKKworICAgIGNvbm5lY3QobWFpbkZyYW1lLCBTSUdOQUwodGl0bGVDaGFuZ2VkKFFTdHJp
bmcpKSwKKyAgICAgICAgICAgIHRoaXMsIFNJR05BTCh0aXRsZUNoYW5nZWQoUVN0cmluZykpKTsK
KyAgICBjb25uZWN0KG1haW5GcmFtZSwgU0lHTkFMKGljb25DaGFuZ2VkKCkpLAorICAgICAgICAg
ICAgdGhpcywgU0lHTkFMKGljb25DaGFuZ2VkKCkpKTsKKyAgICBjb25uZWN0KG1haW5GcmFtZSwg
U0lHTkFMKHVybENoYW5nZWQoUVVybCkpLAorICAgICAgICAgICAgdGhpcywgU0lHTkFMKHVybENo
YW5nZWQoUVVybCkpKTsKKyAgICBjb25uZWN0KGQtPnBhZ2UsIFNJR05BTChsb2FkU3RhcnRlZCgp
KSwKKyAgICAgICAgICAgIHRoaXMsIFNJR05BTChsb2FkU3RhcnRlZCgpKSk7CisgICAgY29ubmVj
dChkLT5wYWdlLCBTSUdOQUwobG9hZFByb2dyZXNzKGludCkpLAorICAgICAgICAgICAgdGhpcywg
U0lHTkFMKGxvYWRQcm9ncmVzcyhpbnQpKSk7CisgICAgY29ubmVjdChkLT5wYWdlLCBTSUdOQUwo
bG9hZEZpbmlzaGVkKGJvb2wpKSwKKyAgICAgICAgICAgIHRoaXMsIFNMT1QoX3FfZG9Mb2FkRmlu
aXNoZWQoYm9vbCkpKTsKKyAgICBjb25uZWN0KGQtPnBhZ2UsIFNJR05BTChzdGF0dXNCYXJNZXNz
YWdlKFFTdHJpbmcpKSwKKyAgICAgICAgICAgIHRoaXMsIFNJR05BTChzdGF0dXNCYXJNZXNzYWdl
KFFTdHJpbmcpKSk7CisgICAgY29ubmVjdChkLT5wYWdlLCBTSUdOQUwobGlua0NsaWNrZWQoUVVy
bCkpLAorICAgICAgICAgICAgdGhpcywgU0lHTkFMKGxpbmtDbGlja2VkKFFVcmwpKSk7CisgICAg
Y29ubmVjdChkLT5wYWdlLCBTSUdOQUwoZGVzdHJveWVkKCkpLAorICAgICAgICAgICAgdGhpcywg
U0xPVChfcV9wYWdlRGVzdHJveWVkKCkpKTsKKyNpZiAhZGVmaW5lZChRVF9OT19JTSkgJiYgKGRl
ZmluZWQoUV9XU19YMTEpIHx8IGRlZmluZWQoUV9XU19RV1MpKQorICAgIGNvbm5lY3QoZC0+cGFn
ZSwgU0lHTkFMKG1pY3JvRm9jdXNDaGFuZ2VkKCkpLAorICAgICAgICAgICAgdGhpcywgU0xPVCh1
cGRhdGVNaWNyb0ZvY3VzKCkpKTsKKyNlbmRpZgorfQorCisvKiEKKyAgICBccHJvcGVydHkgUUdy
YXBoaWNzV2ViVmlldzo6dXJsCisgICAgXGJyaWVmIHRoZSB1cmwgb2YgdGhlIHdlYiBwYWdlIGN1
cnJlbnRseSB2aWV3ZWQKKworICAgIFNldHRpbmcgdGhpcyBwcm9wZXJ0eSBjbGVhcnMgdGhlIHZp
ZXcgYW5kIGxvYWRzIHRoZSBVUkwuCisKKyAgICBCeSBkZWZhdWx0LCB0aGlzIHByb3BlcnR5IGNv
bnRhaW5zIGFuIGVtcHR5LCBpbnZhbGlkIFVSTC4KKworICAgIFxzYSBsb2FkKCksIHVybENoYW5n
ZWQoKQorKi8KKwordm9pZCBRR3JhcGhpY3NXZWJWaWV3OjpzZXRVcmwoY29uc3QgUVVybCAmdXJs
KQoreworICAgIHBhZ2UoKS0+bWFpbkZyYW1lKCktPnNldFVybCh1cmwpOworfQorCitRVXJsIFFH
cmFwaGljc1dlYlZpZXc6OnVybCgpIGNvbnN0Cit7CisgICAgaWYgKGQtPnBhZ2UpCisgICAgICAg
IHJldHVybiBkLT5wYWdlLT5tYWluRnJhbWUoKS0+dXJsKCk7CisKKyAgICByZXR1cm4gUVVybCgp
OworfQorCisvKiEKKyAgICBccHJvcGVydHkgUUdyYXBoaWNzV2ViVmlldzo6dGl0bGUKKyAgICBc
YnJpZWYgdGhlIHRpdGxlIG9mIHRoZSB3ZWIgcGFnZSBjdXJyZW50bHkgdmlld2VkCisKKyAgICBC
eSBkZWZhdWx0LCB0aGlzIHByb3BlcnR5IGNvbnRhaW5zIGFuIGVtcHR5IHN0cmluZy4KKworICAg
IFxzYSB0aXRsZUNoYW5nZWQoKQorKi8KK1FTdHJpbmcgUUdyYXBoaWNzV2ViVmlldzo6dGl0bGUo
KSBjb25zdAoreworICAgIGlmIChkLT5wYWdlKQorICAgICAgICByZXR1cm4gZC0+cGFnZS0+bWFp
bkZyYW1lKCktPnRpdGxlKCk7CisKKyAgICByZXR1cm4gUVN0cmluZygpOworfQorCisvKiEKKyAg
ICBccHJvcGVydHkgUUdyYXBoaWNzV2ViVmlldzo6aWNvbgorICAgIFxicmllZiB0aGUgaWNvbiBh
c3NvY2lhdGVkIHdpdGggdGhlIHdlYiBwYWdlIGN1cnJlbnRseSB2aWV3ZWQKKworICAgIEJ5IGRl
ZmF1bHQsIHRoaXMgcHJvcGVydHkgY29udGFpbnMgYSBudWxsIGljb24uCisKKyAgICBcc2EgaWNv
bkNoYW5nZWQoKSwgUVdlYlNldHRpbmdzOjppY29uRm9yVXJsKCkKKyovCitRSWNvbiBRR3JhcGhp
Y3NXZWJWaWV3OjppY29uKCkgY29uc3QKK3sKKyAgICBpZiAoZC0+cGFnZSkKKyAgICAgICAgcmV0
dXJuIGQtPnBhZ2UtPm1haW5GcmFtZSgpLT5pY29uKCk7CisKKyAgICByZXR1cm4gUUljb24oKTsK
K30KKworLyohCisgICAgXHByb3BlcnR5IFFHcmFwaGljc1dlYlZpZXc6Onpvb21GYWN0b3IKKyAg
ICBcYnJpZWYgdGhlIHpvb20gZmFjdG9yIGZvciB0aGUgdmlldworKi8KKwordm9pZCBRR3JhcGhp
Y3NXZWJWaWV3OjpzZXRab29tRmFjdG9yKHFyZWFsIGZhY3RvcikKK3sKKyAgICBpZiAoZmFjdG9y
ID09IHBhZ2UoKS0+bWFpbkZyYW1lKCktPnpvb21GYWN0b3IoKSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgcGFnZSgpLT5tYWluRnJhbWUoKS0+c2V0Wm9vbUZhY3RvcihmYWN0b3IpOworfQorCitx
cmVhbCBRR3JhcGhpY3NXZWJWaWV3Ojp6b29tRmFjdG9yKCkgY29uc3QKK3sKKyAgICByZXR1cm4g
cGFnZSgpLT5tYWluRnJhbWUoKS0+em9vbUZhY3RvcigpOworfQorCisvKiEgXHJlaW1wCisqLwor
dm9pZCBRR3JhcGhpY3NXZWJWaWV3Ojp1cGRhdGVHZW9tZXRyeSgpCit7CisgICAgaWYgKGQtPm92
ZXJsYXkoKSkKKyAgICAgICAgZC0+b3ZlcmxheSgpLT5wcmVwYXJlR3JhcGhpY3NJdGVtR2VvbWV0
cnlDaGFuZ2UoKTsKKworICAgIFFHcmFwaGljc1dpZGdldDo6dXBkYXRlR2VvbWV0cnkoKTsKKwor
ICAgIGlmICghZC0+cGFnZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgUVNpemUgc2l6ZSA9IGdl
b21ldHJ5KCkuc2l6ZSgpLnRvU2l6ZSgpOworICAgIGQtPnBhZ2UtPnNldFZpZXdwb3J0U2l6ZShz
aXplKTsKK30KKworLyohIFxyZWltcAorKi8KK3ZvaWQgUUdyYXBoaWNzV2ViVmlldzo6c2V0R2Vv
bWV0cnkoY29uc3QgUVJlY3RGJiByZWN0KQoreworICAgIFFHcmFwaGljc1dpZGdldDo6c2V0R2Vv
bWV0cnkocmVjdCk7CisKKyAgICBpZiAoZC0+b3ZlcmxheSgpKQorICAgICAgICBkLT5vdmVybGF5
KCktPnByZXBhcmVHcmFwaGljc0l0ZW1HZW9tZXRyeUNoYW5nZSgpOworCisgICAgaWYgKCFkLT5w
YWdlKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBOT1RFOiBjYWxsIGdlb21ldHJ5KCkgYXMg
c2V0R2VvbWV0cnkgZW5zdXJlcyB0aGF0CisgICAgLy8gdGhlIGdlb21ldHJ5IGlzIHdpdGhpbiBs
ZWdhbCBib3VuZHMgKG1pbmltdW1TaXplLCBtYXhpbXVtU2l6ZSkKKyAgICBRU2l6ZSBzaXplID0g
Z2VvbWV0cnkoKS5zaXplKCkudG9TaXplKCk7CisgICAgZC0+cGFnZS0+c2V0Vmlld3BvcnRTaXpl
KHNpemUpOworfQorCisvKiEKKyAgICBDb252ZW5pZW5jZSBzbG90IHRoYXQgc3RvcHMgbG9hZGlu
ZyB0aGUgZG9jdW1lbnQuCisKKyAgICBcc2EgcmVsb2FkKCksIGxvYWRGaW5pc2hlZCgpCisqLwor
dm9pZCBRR3JhcGhpY3NXZWJWaWV3OjpzdG9wKCkKK3sKKyAgICBpZiAoZC0+cGFnZSkKKyAgICAg
ICAgZC0+cGFnZS0+dHJpZ2dlckFjdGlvbihRV2ViUGFnZTo6U3RvcCk7Cit9CisKKy8qIQorICAg
IENvbnZlbmllbmNlIHNsb3QgdGhhdCBsb2FkcyB0aGUgcHJldmlvdXMgZG9jdW1lbnQgaW4gdGhl
IGxpc3Qgb2YgZG9jdW1lbnRzCisgICAgYnVpbHQgYnkgbmF2aWdhdGluZyBsaW5rcy4gRG9lcyBu
b3RoaW5nIGlmIHRoZXJlIGlzIG5vIHByZXZpb3VzIGRvY3VtZW50LgorCisgICAgXHNhIGZvcndh
cmQoKQorKi8KK3ZvaWQgUUdyYXBoaWNzV2ViVmlldzo6YmFjaygpCit7CisgICAgaWYgKGQtPnBh
Z2UpCisgICAgICAgIGQtPnBhZ2UtPnRyaWdnZXJBY3Rpb24oUVdlYlBhZ2U6OkJhY2spOworfQor
CisvKiEKKyAgICBDb252ZW5pZW5jZSBzbG90IHRoYXQgbG9hZHMgdGhlIG5leHQgZG9jdW1lbnQg
aW4gdGhlIGxpc3Qgb2YgZG9jdW1lbnRzCisgICAgYnVpbHQgYnkgbmF2aWdhdGluZyBsaW5rcy4g
RG9lcyBub3RoaW5nIGlmIHRoZXJlIGlzIG5vIG5leHQgZG9jdW1lbnQuCisKKyAgICBcc2EgYmFj
aygpCisqLwordm9pZCBRR3JhcGhpY3NXZWJWaWV3Ojpmb3J3YXJkKCkKK3sKKyAgICBpZiAoZC0+
cGFnZSkKKyAgICAgICAgZC0+cGFnZS0+dHJpZ2dlckFjdGlvbihRV2ViUGFnZTo6Rm9yd2FyZCk7
Cit9CisKKy8qIQorICAgIFJlbG9hZHMgdGhlIGN1cnJlbnQgZG9jdW1lbnQuCisKKyAgICBcc2Eg
c3RvcCgpLCBsb2FkU3RhcnRlZCgpCisqLwordm9pZCBRR3JhcGhpY3NXZWJWaWV3OjpyZWxvYWQo
KQoreworICAgIGlmIChkLT5wYWdlKQorICAgICAgICBkLT5wYWdlLT50cmlnZ2VyQWN0aW9uKFFX
ZWJQYWdlOjpSZWxvYWQpOworfQorCisvKiEKKyAgICBMb2FkcyB0aGUgc3BlY2lmaWVkIFxhIHVy
bCBhbmQgZGlzcGxheXMgaXQuCisKKyAgICBcbm90ZSBUaGUgdmlldyByZW1haW5zIHRoZSBzYW1l
IHVudGlsIGVub3VnaCBkYXRhIGhhcyBhcnJpdmVkIHRvIGRpc3BsYXkgdGhlIG5ldyBcYSB1cmwu
CisKKyAgICBcc2Egc2V0VXJsKCksIHVybCgpLCB1cmxDaGFuZ2VkKCkKKyovCit2b2lkIFFHcmFw
aGljc1dlYlZpZXc6OmxvYWQoY29uc3QgUVVybCYgdXJsKQoreworICAgIHBhZ2UoKS0+bWFpbkZy
YW1lKCktPmxvYWQodXJsKTsKK30KKworLyohCisgICAgXGZuIHZvaWQgUUdyYXBoaWNzV2ViVmll
dzo6bG9hZChjb25zdCBRTmV0d29ya1JlcXVlc3QgJnJlcXVlc3QsIFFOZXR3b3JrQWNjZXNzTWFu
YWdlcjo6T3BlcmF0aW9uIG9wZXJhdGlvbiwgY29uc3QgUUJ5dGVBcnJheSAmYm9keSkKKworICAg
IExvYWRzIGEgbmV0d29yayByZXF1ZXN0LCBcYSByZXF1ZXN0LCB1c2luZyB0aGUgbWV0aG9kIHNw
ZWNpZmllZCBpbiBcYSBvcGVyYXRpb24uCisKKyAgICBcYSBib2R5IGlzIG9wdGlvbmFsIGFuZCBp
cyBvbmx5IHVzZWQgZm9yIFBPU1Qgb3BlcmF0aW9ucy4KKworICAgIFxub3RlIFRoZSB2aWV3IHJl
bWFpbnMgdGhlIHNhbWUgdW50aWwgZW5vdWdoIGRhdGEgaGFzIGFycml2ZWQgdG8gZGlzcGxheSB0
aGUgbmV3IHVybC4KKworICAgIFxzYSB1cmwoKSwgdXJsQ2hhbmdlZCgpCisqLworCit2b2lkIFFH
cmFwaGljc1dlYlZpZXc6OmxvYWQoY29uc3QgUU5ldHdvcmtSZXF1ZXN0JiByZXF1ZXN0LAorICAg
ICAgICAgICAgICAgICAgICBRTmV0d29ya0FjY2Vzc01hbmFnZXI6Ok9wZXJhdGlvbiBvcGVyYXRp
b24sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFFCeXRlQXJyYXkmIGJvZHkpCit7CisgICAg
cGFnZSgpLT5tYWluRnJhbWUoKS0+bG9hZChyZXF1ZXN0LCBvcGVyYXRpb24sIGJvZHkpOworfQor
CisvKiEKKyAgICBTZXRzIHRoZSBjb250ZW50IG9mIHRoZSB3ZWIgdmlldyB0byB0aGUgc3BlY2lm
aWVkIFxhIGh0bWwuCisKKyAgICBFeHRlcm5hbCBvYmplY3RzIHN1Y2ggYXMgc3R5bGVzaGVldHMg
b3IgaW1hZ2VzIHJlZmVyZW5jZWQgaW4gdGhlIEhUTUwKKyAgICBkb2N1bWVudCBhcmUgbG9jYXRl
ZCByZWxhdGl2ZSB0byBcYSBiYXNlVXJsLgorCisgICAgVGhlIFxhIGh0bWwgaXMgbG9hZGVkIGlt
bWVkaWF0ZWx5OyBleHRlcm5hbCBvYmplY3RzIGFyZSBsb2FkZWQgYXN5bmNocm9ub3VzbHkuCisK
KyAgICBXaGVuIHVzaW5nIHRoaXMgbWV0aG9kLCBXZWJLaXQgYXNzdW1lcyB0aGF0IGV4dGVybmFs
IHJlc291cmNlcyBzdWNoIGFzCisgICAgSmF2YVNjcmlwdCBwcm9ncmFtcyBvciBzdHlsZSBzaGVl
dHMgYXJlIGVuY29kZWQgaW4gVVRGLTggdW5sZXNzIG90aGVyd2lzZQorICAgIHNwZWNpZmllZC4g
Rm9yIGV4YW1wbGUsIHRoZSBlbmNvZGluZyBvZiBhbiBleHRlcm5hbCBzY3JpcHQgY2FuIGJlIHNw
ZWNpZmllZAorICAgIHRocm91Z2ggdGhlIGNoYXJzZXQgYXR0cmlidXRlIG9mIHRoZSBIVE1MIHNj
cmlwdCB0YWcuIEFsdGVybmF0aXZlbHksIHRoZQorICAgIGVuY29kaW5nIGNhbiBhbHNvIGJlIHNw
ZWNpZmllZCBieSB0aGUgd2ViIHNlcnZlci4KKworICAgIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBm
dW5jdGlvbiBlcXVpdmFsZW50IHRvIHNldENvbnRlbnQoaHRtbCwgInRleHQvaHRtbCIsIGJhc2VV
cmwpLgorCisgICAgXHdhcm5pbmcgVGhpcyBmdW5jdGlvbiB3b3JrcyBvbmx5IGZvciBIVE1MLCBm
b3Igb3RoZXIgbWltZSB0eXBlcyAoaS5lLiBYSFRNTCwgU1ZHKQorICAgIHNldENvbnRlbnQoKSBz
aG91bGQgYmUgdXNlZCBpbnN0ZWFkLgorCisgICAgXHNhIGxvYWQoKSwgc2V0Q29udGVudCgpLCBR
V2ViRnJhbWU6OnRvSHRtbCgpLCBRV2ViRnJhbWU6OnNldENvbnRlbnQoKQorKi8KK3ZvaWQgUUdy
YXBoaWNzV2ViVmlldzo6c2V0SHRtbChjb25zdCBRU3RyaW5nJiBodG1sLCBjb25zdCBRVXJsJiBi
YXNlVXJsKQoreworICAgIHBhZ2UoKS0+bWFpbkZyYW1lKCktPnNldEh0bWwoaHRtbCwgYmFzZVVy
bCk7Cit9CisKKy8qIQorICAgIFNldHMgdGhlIGNvbnRlbnQgb2YgdGhlIHdlYiBncmFwaGljc2l0
ZW0gdG8gdGhlIHNwZWNpZmllZCBjb250ZW50IFxhIGRhdGEuIElmIHRoZSBcYSBtaW1lVHlwZSBh
cmd1bWVudAorICAgIGlzIGVtcHR5IGl0IGlzIGN1cnJlbnRseSBhc3N1bWVkIHRoYXQgdGhlIGNv
bnRlbnQgaXMgSFRNTCBidXQgaW4gZnV0dXJlIHZlcnNpb25zIHdlIG1heSBpbnRyb2R1Y2UKKyAg
ICBhdXRvLWRldGVjdGlvbi4KKworICAgIEV4dGVybmFsIG9iamVjdHMgcmVmZXJlbmNlZCBpbiB0
aGUgY29udGVudCBhcmUgbG9jYXRlZCByZWxhdGl2ZSB0byBcYSBiYXNlVXJsLgorCisgICAgVGhl
IFxhIGRhdGEgaXMgbG9hZGVkIGltbWVkaWF0ZWx5OyBleHRlcm5hbCBvYmplY3RzIGFyZSBsb2Fk
ZWQgYXN5bmNocm9ub3VzbHkuCisKKyAgICBcc2EgbG9hZCgpLCBzZXRIdG1sKCksIFFXZWJGcmFt
ZTo6dG9IdG1sKCkKKyovCit2b2lkIFFHcmFwaGljc1dlYlZpZXc6OnNldENvbnRlbnQoY29uc3Qg
UUJ5dGVBcnJheSYgZGF0YSwgY29uc3QgUVN0cmluZyYgbWltZVR5cGUsIGNvbnN0IFFVcmwmIGJh
c2VVcmwpCit7CisgICAgcGFnZSgpLT5tYWluRnJhbWUoKS0+c2V0Q29udGVudChkYXRhLCBtaW1l
VHlwZSwgYmFzZVVybCk7Cit9CisKKy8qIQorICAgIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSB2
aWV3J3MgaGlzdG9yeSBvZiBuYXZpZ2F0ZWQgd2ViIHBhZ2VzLgorCisgICAgSXQgaXMgZXF1aXZh
bGVudCB0bworCisgICAgXHNuaXBwZXQgd2Via2l0c25pcHBldHMvcXR3ZWJraXRfcXdlYnZpZXdf
c25pcHBldC5jcHAgMAorKi8KK1FXZWJIaXN0b3J5KiBRR3JhcGhpY3NXZWJWaWV3OjpoaXN0b3J5
KCkgY29uc3QKK3sKKyAgICByZXR1cm4gcGFnZSgpLT5oaXN0b3J5KCk7Cit9CisKKy8qIQorICAg
IFxwcm9wZXJ0eSBRR3JhcGhpY3NXZWJWaWV3Ojptb2RpZmllZAorICAgIFxicmllZiB3aGV0aGVy
IHRoZSBkb2N1bWVudCB3YXMgbW9kaWZpZWQgYnkgdGhlIHVzZXIKKworICAgIFBhcnRzIG9mIEhU
TUwgZG9jdW1lbnRzIGNhbiBiZSBlZGl0YWJsZSBmb3IgZXhhbXBsZSB0aHJvdWdoIHRoZQorICAg
IFxje2NvbnRlbnRlZGl0YWJsZX0gYXR0cmlidXRlIG9uIEhUTUwgZWxlbWVudHMuCisKKyAgICBC
eSBkZWZhdWx0LCB0aGlzIHByb3BlcnR5IGlzIGZhbHNlLgorKi8KK2Jvb2wgUUdyYXBoaWNzV2Vi
Vmlldzo6aXNNb2RpZmllZCgpIGNvbnN0Cit7CisgICAgaWYgKGQtPnBhZ2UpCisgICAgICAgIHJl
dHVybiBkLT5wYWdlLT5pc01vZGlmaWVkKCk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKiEK
KyAgICBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgdmlldy9wYWdlIHNwZWNpZmljIHNldHRpbmdz
IG9iamVjdC4KKworICAgIEl0IGlzIGVxdWl2YWxlbnQgdG8KKworICAgIFxzbmlwcGV0IHdlYmtp
dHNuaXBwZXRzL3F0d2Via2l0X3F3ZWJ2aWV3X3NuaXBwZXQuY3BwIDEKKworICAgIFxzYSBRV2Vi
U2V0dGluZ3M6Omdsb2JhbFNldHRpbmdzKCkKKyovCitRV2ViU2V0dGluZ3MqIFFHcmFwaGljc1dl
YlZpZXc6OnNldHRpbmdzKCkgY29uc3QKK3sKKyAgICByZXR1cm4gcGFnZSgpLT5zZXR0aW5ncygp
OworfQorCisvKiEKKyAgICBSZXR1cm5zIGEgcG9pbnRlciB0byBhIFFBY3Rpb24gdGhhdCBlbmNh
cHN1bGF0ZXMgdGhlIHNwZWNpZmllZCB3ZWIgYWN0aW9uIFxhIGFjdGlvbi4KKyovCitRQWN0aW9u
ICpRR3JhcGhpY3NXZWJWaWV3OjpwYWdlQWN0aW9uKFFXZWJQYWdlOjpXZWJBY3Rpb24gYWN0aW9u
KSBjb25zdAoreworI2lmZGVmIFFUX05PX0FDVElPTgorICAgIFFfVU5VU0VEKGFjdGlvbikKKyAg
ICByZXR1cm4gMDsKKyNlbHNlCisgICAgcmV0dXJuIHBhZ2UoKS0+YWN0aW9uKGFjdGlvbik7Cisj
ZW5kaWYKK30KKworLyohCisgICAgVHJpZ2dlcnMgdGhlIHNwZWNpZmllZCBcYSBhY3Rpb24uIElm
IGl0IGlzIGEgY2hlY2thYmxlIGFjdGlvbiB0aGUgc3BlY2lmaWVkCisgICAgXGEgY2hlY2tlZCBz
dGF0ZSBpcyBhc3N1bWVkLgorCisgICAgXHNhIHBhZ2VBY3Rpb24oKQorKi8KK3ZvaWQgUUdyYXBo
aWNzV2ViVmlldzo6dHJpZ2dlclBhZ2VBY3Rpb24oUVdlYlBhZ2U6OldlYkFjdGlvbiBhY3Rpb24s
IGJvb2wgY2hlY2tlZCkKK3sKKyAgICBwYWdlKCktPnRyaWdnZXJBY3Rpb24oYWN0aW9uLCBjaGVj
a2VkKTsKK30KKworLyohCisgICAgRmluZHMgdGhlIHNwZWNpZmllZCBzdHJpbmcsIFxhIHN1YlN0
cmluZywgaW4gdGhlIHBhZ2UsIHVzaW5nIHRoZSBnaXZlbiBcYSBvcHRpb25zLgorCisgICAgSWYg
dGhlIEhpZ2hsaWdodEFsbE9jY3VycmVuY2VzIGZsYWcgaXMgcGFzc2VkLCB0aGUgZnVuY3Rpb24g
d2lsbCBoaWdobGlnaHQgYWxsIG9jY3VycmVuY2VzCisgICAgdGhhdCBleGlzdCBpbiB0aGUgcGFn
ZS4gQWxsIHN1YnNlcXVlbnQgY2FsbHMgd2lsbCBleHRlbmQgdGhlIGhpZ2hsaWdodCwgcmF0aGVy
IHRoYW4KKyAgICByZXBsYWNlIGl0LCB3aXRoIG9jY3VycmVuY2VzIG9mIHRoZSBuZXcgc3RyaW5n
LgorCisgICAgSWYgdGhlIEhpZ2hsaWdodEFsbE9jY3VycmVuY2VzIGZsYWcgaXMgbm90IHBhc3Nl
ZCwgdGhlIGZ1bmN0aW9uIHdpbGwgc2VsZWN0IGFuIG9jY3VycmVuY2UKKyAgICBhbmQgYWxsIHN1
YnNlcXVlbnQgY2FsbHMgd2lsbCByZXBsYWNlIHRoZSBjdXJyZW50IG9jY3VycmVuY2Ugd2l0aCB0
aGUgbmV4dCBvbmUuCisKKyAgICBUbyBjbGVhciB0aGUgc2VsZWN0aW9uLCBqdXN0IHBhc3MgYW4g
ZW1wdHkgc3RyaW5nLgorCisgICAgUmV0dXJucyB0cnVlIGlmIFxhIHN1YlN0cmluZyB3YXMgZm91
bmQ7IG90aGVyd2lzZSByZXR1cm5zIGZhbHNlLgorCisgICAgXHNhIFFXZWJQYWdlOjpzZWxlY3Rl
ZFRleHQoKSwgUVdlYlBhZ2U6OnNlbGVjdGlvbkNoYW5nZWQoKQorKi8KK2Jvb2wgUUdyYXBoaWNz
V2ViVmlldzo6ZmluZFRleHQoY29uc3QgUVN0cmluZyAmc3ViU3RyaW5nLCBRV2ViUGFnZTo6Rmlu
ZEZsYWdzIG9wdGlvbnMpCit7CisgICAgaWYgKGQtPnBhZ2UpCisgICAgICAgIHJldHVybiBkLT5w
YWdlLT5maW5kVGV4dChzdWJTdHJpbmcsIG9wdGlvbnMpOworICAgIHJldHVybiBmYWxzZTsKK30K
KworLyohCisgICAgXHByb3BlcnR5IFFHcmFwaGljc1dlYlZpZXc6OnJlc2l6ZXNUb0NvbnRlbnRz
CisgICAgXGJyaWVmIHdoZXRoZXIgdGhlIHNpemUgb2YgdGhlIFFHcmFwaGljc1dlYlZpZXcgYW5k
IGl0cyB2aWV3cG9ydCBjaGFuZ2VzIHRvIG1hdGNoIHRoZSBjb250ZW50cyBzaXplCisgICAgXHNp
bmNlIDQuNyAKKworICAgIElmIHRoaXMgcHJvcGVydHkgaXMgc2V0LCB0aGUgUUdyYXBoaWNzV2Vi
VmlldyB3aWxsIGF1dG9tYXRpY2FsbHkgY2hhbmdlIGl0cworICAgIHNpemUgdG8gbWF0Y2ggdGhl
IHNpemUgb2YgdGhlIG1haW4gZnJhbWUgY29udGVudHMuIEFzIGEgcmVzdWx0IHRoZSB0b3AgbGV2
ZWwgZnJhbWUKKyAgICB3aWxsIG5ldmVyIGhhdmUgc2Nyb2xsYmFycy4gSXQgd2lsbCBhbHNvIG1h
a2UgQ1NTIGZpeGVkIHBvc2l0aW9uaW5nIHRvIGJlaGF2ZSBsaWtlIGFic29sdXRlIHBvc2l0aW9u
aW5nCisgICAgd2l0aCBlbGVtZW50cyBwb3NpdGlvbmVkIHJlbGF0aXZlIHRvIHRoZSBkb2N1bWVu
dCBpbnN0ZWFkIG9mIHRoZSB2aWV3cG9ydC4KKworICAgIFRoaXMgcHJvcGVydHkgc2hvdWxkIGJl
IHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgUVdlYlBhZ2U6OnByZWZlcnJlZENvbnRlbnRz
U2l6ZSBwcm9wZXJ0eS4KKyAgICBJZiBub3QgZXhwbGljaXRseSBzZXQsIHRoZSBwcmVmZXJyZWRD
b250ZW50c1NpemUgaXMgYXV0b21hdGljYWxseSBzZXQgdG8gYSByZWFzb25hYmxlIHZhbHVlLgor
CisgICAgXHNhIFFXZWJQYWdlOjpzZXRQcmVmZXJyZWRDb250ZW50c1NpemUoKQorKi8KK3ZvaWQg
UUdyYXBoaWNzV2ViVmlldzo6c2V0UmVzaXplc1RvQ29udGVudHMoYm9vbCBlbmFibGVkKQorewor
ICAgIGlmIChkLT5yZXNpemVzVG9Db250ZW50cyA9PSBlbmFibGVkKQorICAgICAgICByZXR1cm47
CisgICAgZC0+cmVzaXplc1RvQ29udGVudHMgPSBlbmFibGVkOworICAgIGlmIChkLT5wYWdlKQor
ICAgICAgICBkLT51cGRhdGVSZXNpemVzVG9Db250ZW50c0ZvclBhZ2UoKTsKK30KKworYm9vbCBR
R3JhcGhpY3NXZWJWaWV3OjpyZXNpemVzVG9Db250ZW50cygpIGNvbnN0Cit7CisgICAgcmV0dXJu
IGQtPnJlc2l6ZXNUb0NvbnRlbnRzOworfQorCisvKiEKKyAgICBccHJvcGVydHkgUUdyYXBoaWNz
V2ViVmlldzo6dGlsZWRCYWNraW5nU3RvcmVGcm96ZW4KKyAgICBcYnJpZWYgd2hldGhlciB0aGUg
dGlsZWQgYmFja2luZyBzdG9yZSB1cGRhdGVzIGl0cyBjb250ZW50cworICAgIFxzaW5jZSA0Ljcg
CisKKyAgICBJZiB0aGUgdGlsZWQgYmFja2luZyBzdG9yZSBpcyBlbmFibGVkIHVzaW5nIFFXZWJT
ZXR0aW5nczo6VGlsZWRCYWNraW5nU3RvcmVFbmFibGVkIGF0dHJpYnV0ZSwgdGhpcyBwcm9wZXJ0
eQorICAgIGNhbiBiZSB1c2VkIHRvIGRpc2FibGUgYmFja2luZyBzdG9yZSB1cGRhdGVzIHRlbXBv
cmFyaWx5LiBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIGV4YW1wbGUgZm9yIHJ1bm5pbmcKKyAgICBh
IHNtb290aCBhbmltYXRpb24gdGhhdCBjaGFuZ2VzIHRoZSBzY2FsZSBvZiB0aGUgUUdyYXBoaWNz
V2ViVmlldy4KKyAKKyAgICBXaGVuIHRoZSBiYWNraW5nIHN0b3JlIGlzIHVuZnJvemVuLCBpdHMg
Y29udGVudHMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgdG8gbWF0Y2ggdGhlIGN1cnJl
bnQKKyAgICBzdGF0ZSBvZiB0aGUgZG9jdW1lbnQuIElmIHRoZSBRR3JhcGhpY3NXZWJWaWV3IHNj
YWxlIHdhcyBjaGFuZ2VkLCB0aGUgYmFja2luZyBzdG9yZSBpcyBhbHNvCisgICAgcmUtcmVuZGVy
ZWQgdXNpbmcgdGhlIG5ldyBzY2FsZS4KKyAKKyAgICBJZiB0aGUgdGlsZWQgYmFja2luZyBzdG9y
ZSBpcyBub3QgZW5hYmxlZCwgdGhpcyBwcm9wZXJ0eSBkb2VzIG5vdGhpbmcuCisKKyAgICBcc2Eg
UVdlYlNldHRpbmdzOjpUaWxlZEJhY2tpbmdTdG9yZUVuYWJsZWQKKyAgICBcc2EgUUdyYXBoaWNz
T2JqZWN0OjpzY2FsZQorKi8KK2Jvb2wgUUdyYXBoaWNzV2ViVmlldzo6aXNUaWxlZEJhY2tpbmdT
dG9yZUZyb3plbigpIGNvbnN0Cit7CisjaWYgVVNFKFRJTEVEX0JBQ0tJTkdfU1RPUkUpCisgICAg
cmV0dXJuIHBhZ2UoKS0+ZC0+bWFpbkZyYW1lQWRhcHRlcigpLT50aWxlZEJhY2tpbmdTdG9yZUZy
b3plbigpOworI2Vsc2UKKyAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKK30KKwordm9pZCBRR3Jh
cGhpY3NXZWJWaWV3OjpzZXRUaWxlZEJhY2tpbmdTdG9yZUZyb3plbihib29sIGZyb3plbikKK3sK
KyNpZiBVU0UoVElMRURfQkFDS0lOR19TVE9SRSkKKyAgICBwYWdlKCktPmQtPm1haW5GcmFtZUFk
YXB0ZXIoKS0+c2V0VGlsZWRCYWNraW5nU3RvcmVGcm96ZW4oZnJvemVuKTsKKyNlbHNlCisgICAg
VU5VU0VEX1BBUkFNKGZyb3plbik7CisjZW5kaWYKK30KKworLyohIFxyZWltcAorKi8KK3ZvaWQg
UUdyYXBoaWNzV2ViVmlldzo6aG92ZXJNb3ZlRXZlbnQoUUdyYXBoaWNzU2NlbmVIb3ZlckV2ZW50
KiBldikKK3sKKyAgICBpZiAoZC0+cGFnZSkgeworICAgICAgICBjb25zdCBib29sIGFjY2VwdGVk
ID0gZXYtPmlzQWNjZXB0ZWQoKTsKKyAgICAgICAgUU1vdXNlRXZlbnQgbWUgPSBRTW91c2VFdmVu
dChRRXZlbnQ6Ok1vdXNlTW92ZSwKKyAgICAgICAgICAgICAgICBldi0+cG9zKCkudG9Qb2ludCgp
LCBRdDo6Tm9CdXR0b24sCisgICAgICAgICAgICAgICAgUXQ6Ok5vQnV0dG9uLCBRdDo6Tm9Nb2Rp
Zmllcik7CisgICAgICAgIGQtPnBhZ2UtPmV2ZW50KCZtZSk7CisgICAgICAgIGV2LT5zZXRBY2Nl
cHRlZChhY2NlcHRlZCk7CisgICAgfQorCisgICAgaWYgKCFldi0+aXNBY2NlcHRlZCgpKQorICAg
ICAgICBRR3JhcGhpY3NJdGVtOjpob3Zlck1vdmVFdmVudChldik7Cit9CisKKy8qISBccmVpbXAK
KyovCit2b2lkIFFHcmFwaGljc1dlYlZpZXc6OmhvdmVyTGVhdmVFdmVudChRR3JhcGhpY3NTY2Vu
ZUhvdmVyRXZlbnQqIGV2KQoreworICAgIFFfVU5VU0VEKGV2KTsKK30KKworLyohIFxyZWltcAor
Ki8KK3ZvaWQgUUdyYXBoaWNzV2ViVmlldzo6bW91c2VNb3ZlRXZlbnQoUUdyYXBoaWNzU2NlbmVN
b3VzZUV2ZW50KiBldikKK3sKKyAgICBpZiAoZC0+cGFnZSkgeworICAgICAgICBjb25zdCBib29s
IGFjY2VwdGVkID0gZXYtPmlzQWNjZXB0ZWQoKTsKKyAgICAgICAgZC0+cGFnZS0+ZXZlbnQoZXYp
OworICAgICAgICBldi0+c2V0QWNjZXB0ZWQoYWNjZXB0ZWQpOworICAgIH0KKworICAgIGlmICgh
ZXYtPmlzQWNjZXB0ZWQoKSkKKyAgICAgICAgUUdyYXBoaWNzSXRlbTo6bW91c2VNb3ZlRXZlbnQo
ZXYpOworfQorCisvKiEgXHJlaW1wCisqLwordm9pZCBRR3JhcGhpY3NXZWJWaWV3Ojptb3VzZVBy
ZXNzRXZlbnQoUUdyYXBoaWNzU2NlbmVNb3VzZUV2ZW50KiBldikKK3sKKyAgICBpZiAoZC0+cGFn
ZSkgeworICAgICAgICBjb25zdCBib29sIGFjY2VwdGVkID0gZXYtPmlzQWNjZXB0ZWQoKTsKKyAg
ICAgICAgZC0+cGFnZS0+ZXZlbnQoZXYpOworICAgICAgICBldi0+c2V0QWNjZXB0ZWQoYWNjZXB0
ZWQpOworICAgIH0KKworICAgIGlmICghZXYtPmlzQWNjZXB0ZWQoKSkKKyAgICAgICAgUUdyYXBo
aWNzSXRlbTo6bW91c2VQcmVzc0V2ZW50KGV2KTsKK30KKworLyohIFxyZWltcAorKi8KK3ZvaWQg
UUdyYXBoaWNzV2ViVmlldzo6bW91c2VSZWxlYXNlRXZlbnQoUUdyYXBoaWNzU2NlbmVNb3VzZUV2
ZW50KiBldikKK3sKKyAgICBpZiAoZC0+cGFnZSkgeworICAgICAgICBjb25zdCBib29sIGFjY2Vw
dGVkID0gZXYtPmlzQWNjZXB0ZWQoKTsKKyAgICAgICAgZC0+cGFnZS0+ZXZlbnQoZXYpOworICAg
ICAgICBldi0+c2V0QWNjZXB0ZWQoYWNjZXB0ZWQpOworICAgIH0KKworICAgIGlmICghZXYtPmlz
QWNjZXB0ZWQoKSkKKyAgICAgICAgUUdyYXBoaWNzSXRlbTo6bW91c2VSZWxlYXNlRXZlbnQoZXYp
OworfQorCisvKiEgXHJlaW1wCisqLwordm9pZCBRR3JhcGhpY3NXZWJWaWV3Ojptb3VzZURvdWJs
ZUNsaWNrRXZlbnQoUUdyYXBoaWNzU2NlbmVNb3VzZUV2ZW50KiBldikKK3sKKyAgICBpZiAoZC0+
cGFnZSkgeworICAgICAgICBjb25zdCBib29sIGFjY2VwdGVkID0gZXYtPmlzQWNjZXB0ZWQoKTsK
KyAgICAgICAgZC0+cGFnZS0+ZXZlbnQoZXYpOworICAgICAgICBldi0+c2V0QWNjZXB0ZWQoYWNj
ZXB0ZWQpOworICAgIH0KKworICAgIGlmICghZXYtPmlzQWNjZXB0ZWQoKSkKKyAgICAgICAgUUdy
YXBoaWNzSXRlbTo6bW91c2VEb3VibGVDbGlja0V2ZW50KGV2KTsKK30KKworLyohIFxyZWltcAor
Ki8KK3ZvaWQgUUdyYXBoaWNzV2ViVmlldzo6a2V5UHJlc3NFdmVudChRS2V5RXZlbnQqIGV2KQor
eworICAgIGlmIChkLT5wYWdlKQorICAgICAgICBkLT5wYWdlLT5ldmVudChldik7CisKKyAgICBp
ZiAoIWV2LT5pc0FjY2VwdGVkKCkpCisgICAgICAgIFFHcmFwaGljc0l0ZW06OmtleVByZXNzRXZl
bnQoZXYpOworfQorCisvKiEgXHJlaW1wCisqLwordm9pZCBRR3JhcGhpY3NXZWJWaWV3OjprZXlS
ZWxlYXNlRXZlbnQoUUtleUV2ZW50KiBldikKK3sKKyAgICBpZiAoZC0+cGFnZSkKKyAgICAgICAg
ZC0+cGFnZS0+ZXZlbnQoZXYpOworCisgICAgaWYgKCFldi0+aXNBY2NlcHRlZCgpKQorICAgICAg
ICBRR3JhcGhpY3NJdGVtOjprZXlSZWxlYXNlRXZlbnQoZXYpOworfQorCisvKiEgXHJlaW1wCisq
Lwordm9pZCBRR3JhcGhpY3NXZWJWaWV3Ojpmb2N1c0luRXZlbnQoUUZvY3VzRXZlbnQqIGV2KQor
eworICAgIGlmIChkLT5wYWdlKQorICAgICAgICBkLT5wYWdlLT5ldmVudChldik7CisgICAgZWxz
ZQorICAgICAgICBRR3JhcGhpY3NJdGVtOjpmb2N1c0luRXZlbnQoZXYpOworfQorCisvKiEgXHJl
aW1wCisqLwordm9pZCBRR3JhcGhpY3NXZWJWaWV3Ojpmb2N1c091dEV2ZW50KFFGb2N1c0V2ZW50
KiBldikKK3sKKyAgICBpZiAoZC0+cGFnZSkKKyAgICAgICAgZC0+cGFnZS0+ZXZlbnQoZXYpOwor
ICAgIGVsc2UKKyAgICAgICAgUUdyYXBoaWNzSXRlbTo6Zm9jdXNPdXRFdmVudChldik7Cit9CisK
Ky8qISBccmVpbXAKKyovCitib29sIFFHcmFwaGljc1dlYlZpZXc6OmZvY3VzTmV4dFByZXZDaGls
ZChib29sIG5leHQpCit7CisgICAgaWYgKGQtPnBhZ2UpCisgICAgICAgIHJldHVybiBkLT5wYWdl
LT5mb2N1c05leHRQcmV2Q2hpbGQobmV4dCk7CisKKyAgICByZXR1cm4gUUdyYXBoaWNzV2lkZ2V0
Ojpmb2N1c05leHRQcmV2Q2hpbGQobmV4dCk7Cit9CisKKy8qISBccmVpbXAKKyovCit2b2lkIFFH
cmFwaGljc1dlYlZpZXc6OmRyYWdFbnRlckV2ZW50KFFHcmFwaGljc1NjZW5lRHJhZ0Ryb3BFdmVu
dCogZXYpCit7CisjaWZuZGVmIFFUX05PX0RSQUdBTkREUk9QCisgICAgaWYgKGQtPnBhZ2UpCisg
ICAgICAgIGQtPnBhZ2UtPmV2ZW50KGV2KTsKKyNlbHNlCisgICAgUV9VTlVTRUQoZXYpOworI2Vu
ZGlmCit9CisKKy8qISBccmVpbXAKKyovCit2b2lkIFFHcmFwaGljc1dlYlZpZXc6OmRyYWdMZWF2
ZUV2ZW50KFFHcmFwaGljc1NjZW5lRHJhZ0Ryb3BFdmVudCogZXYpCit7CisjaWZuZGVmIFFUX05P
X0RSQUdBTkREUk9QCisgICAgaWYgKGQtPnBhZ2UpIHsKKyAgICAgICAgY29uc3QgYm9vbCBhY2Nl
cHRlZCA9IGV2LT5pc0FjY2VwdGVkKCk7CisgICAgICAgIGQtPnBhZ2UtPmV2ZW50KGV2KTsKKyAg
ICAgICAgZXYtPnNldEFjY2VwdGVkKGFjY2VwdGVkKTsKKyAgICB9CisKKyAgICBpZiAoIWV2LT5p
c0FjY2VwdGVkKCkpCisgICAgICAgIFFHcmFwaGljc1dpZGdldDo6ZHJhZ0xlYXZlRXZlbnQoZXYp
OworI2Vsc2UKKyAgICBRX1VOVVNFRChldik7CisjZW5kaWYKK30KKworLyohIFxyZWltcAorKi8K
K3ZvaWQgUUdyYXBoaWNzV2ViVmlldzo6ZHJhZ01vdmVFdmVudChRR3JhcGhpY3NTY2VuZURyYWdE
cm9wRXZlbnQqIGV2KQoreworI2lmbmRlZiBRVF9OT19EUkFHQU5ERFJPUAorICAgIGlmIChkLT5w
YWdlKSB7CisgICAgICAgIGNvbnN0IGJvb2wgYWNjZXB0ZWQgPSBldi0+aXNBY2NlcHRlZCgpOwor
ICAgICAgICBkLT5wYWdlLT5ldmVudChldik7CisgICAgICAgIGV2LT5zZXRBY2NlcHRlZChhY2Nl
cHRlZCk7CisgICAgfQorCisgICAgaWYgKCFldi0+aXNBY2NlcHRlZCgpKQorICAgICAgICBRR3Jh
cGhpY3NXaWRnZXQ6OmRyYWdNb3ZlRXZlbnQoZXYpOworI2Vsc2UKKyAgICBRX1VOVVNFRChldik7
CisjZW5kaWYKK30KKworLyohIFxyZWltcAorKi8KK3ZvaWQgUUdyYXBoaWNzV2ViVmlldzo6ZHJv
cEV2ZW50KFFHcmFwaGljc1NjZW5lRHJhZ0Ryb3BFdmVudCogZXYpCit7CisjaWZuZGVmIFFUX05P
X0RSQUdBTkREUk9QCisgICAgaWYgKGQtPnBhZ2UpIHsKKyAgICAgICAgY29uc3QgYm9vbCBhY2Nl
cHRlZCA9IGV2LT5pc0FjY2VwdGVkKCk7CisgICAgICAgIGQtPnBhZ2UtPmV2ZW50KGV2KTsKKyAg
ICAgICAgZXYtPnNldEFjY2VwdGVkKGFjY2VwdGVkKTsKKyAgICB9CisKKyAgICBpZiAoIWV2LT5p
c0FjY2VwdGVkKCkpCisgICAgICAgIFFHcmFwaGljc1dpZGdldDo6ZHJvcEV2ZW50KGV2KTsKKyNl
bHNlCisgICAgUV9VTlVTRUQoZXYpOworI2VuZGlmCit9CisKKyNpZm5kZWYgUVRfTk9fQ09OVEVY
VE1FTlUKKy8qISBccmVpbXAKKyovCit2b2lkIFFHcmFwaGljc1dlYlZpZXc6OmNvbnRleHRNZW51
RXZlbnQoUUdyYXBoaWNzU2NlbmVDb250ZXh0TWVudUV2ZW50KiBldikKK3sKKyAgICBpZiAoZC0+
cGFnZSkgeworICAgICAgICBjb25zdCBib29sIGFjY2VwdGVkID0gZXYtPmlzQWNjZXB0ZWQoKTsK
KyAgICAgICAgZC0+cGFnZS0+ZXZlbnQoZXYpOworICAgICAgICBldi0+c2V0QWNjZXB0ZWQoYWNj
ZXB0ZWQpOworICAgIH0KK30KKyNlbmRpZiAvLyBRVF9OT19DT05URVhUTUVOVQorCisjaWZuZGVm
IFFUX05PX1dIRUVMRVZFTlQKKy8qISBccmVpbXAKKyovCit2b2lkIFFHcmFwaGljc1dlYlZpZXc6
OndoZWVsRXZlbnQoUUdyYXBoaWNzU2NlbmVXaGVlbEV2ZW50KiBldikKK3sKKyAgICBpZiAoZC0+
cGFnZSkgeworICAgICAgICBjb25zdCBib29sIGFjY2VwdGVkID0gZXYtPmlzQWNjZXB0ZWQoKTsK
KyAgICAgICAgZC0+cGFnZS0+ZXZlbnQoZXYpOworICAgICAgICBldi0+c2V0QWNjZXB0ZWQoYWNj
ZXB0ZWQpOworICAgIH0KKworICAgIGlmICghZXYtPmlzQWNjZXB0ZWQoKSkKKyAgICAgICAgUUdy
YXBoaWNzSXRlbTo6d2hlZWxFdmVudChldik7Cit9CisjZW5kaWYgLy8gUVRfTk9fV0hFRUxFVkVO
VAorCisvKiEgXHJlaW1wCisqLwordm9pZCBRR3JhcGhpY3NXZWJWaWV3OjppbnB1dE1ldGhvZEV2
ZW50KFFJbnB1dE1ldGhvZEV2ZW50KiBldikKK3sKKyAgICBpZiAoZC0+cGFnZSkKKyAgICAgICAg
ZC0+cGFnZS0+ZXZlbnQoZXYpOworCisgICAgaWYgKCFldi0+aXNBY2NlcHRlZCgpKQorICAgICAg
ICBRR3JhcGhpY3NJdGVtOjppbnB1dE1ldGhvZEV2ZW50KGV2KTsKK30KKworLyohCisgICAgXGZu
IHZvaWQgUUdyYXBoaWNzV2ViVmlldzo6c3RhdHVzQmFyTWVzc2FnZShjb25zdCBRU3RyaW5nJiB0
ZXh0KQorCisgICAgVGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuIHRoZSBzdGF0dXNiYXIgXGEg
dGV4dCBpcyBjaGFuZ2VkIGJ5IHRoZSBwYWdlLgorKi8KKworLyohCisgICAgXGZuIHZvaWQgUUdy
YXBoaWNzV2ViVmlldzo6bG9hZFByb2dyZXNzKGludCBwcm9ncmVzcykKKworICAgIFRoaXMgc2ln
bmFsIGlzIGVtaXR0ZWQgZXZlcnkgdGltZSBhbiBlbGVtZW50IGluIHRoZSB3ZWIgcGFnZQorICAg
IGNvbXBsZXRlcyBsb2FkaW5nIGFuZCB0aGUgb3ZlcmFsbCBsb2FkaW5nIHByb2dyZXNzIGFkdmFu
Y2VzLgorCisgICAgVGhpcyBzaWduYWwgdHJhY2tzIHRoZSBwcm9ncmVzcyBvZiBhbGwgY2hpbGQg
ZnJhbWVzLgorCisgICAgVGhlIGN1cnJlbnQgdmFsdWUgaXMgcHJvdmlkZWQgYnkgXGEgcHJvZ3Jl
c3MgYW5kIHNjYWxlcyBmcm9tIDAgdG8gMTAwLAorICAgIHdoaWNoIGlzIHRoZSBkZWZhdWx0IHJh
bmdlIG9mIFFQcm9ncmVzc0Jhci4KKworICAgIFxzYSBsb2FkU3RhcnRlZCgpLCBsb2FkRmluaXNo
ZWQoKQorKi8KKworLyohCisgICAgXGZuIHZvaWQgUUdyYXBoaWNzV2ViVmlldzo6bGlua0NsaWNr
ZWQoY29uc3QgUVVybCAmdXJsKQorCisgICAgVGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuZXZl
ciB0aGUgdXNlciBjbGlja3Mgb24gYSBsaW5rIGFuZCB0aGUgcGFnZSdzIGxpbmtEZWxlZ2F0aW9u
UG9saWN5CisgICAgcHJvcGVydHkgaXMgc2V0IHRvIGRlbGVnYXRlIHRoZSBsaW5rIGhhbmRsaW5n
IGZvciB0aGUgc3BlY2lmaWVkIFxhIHVybC4KKworICAgIFxzYSBRV2ViUGFnZTo6bGlua0RlbGVn
YXRpb25Qb2xpY3koKQorKi8KKworI2VuZGlmIC8vIFFUX05PX0dSQVBISUNTVklFVworCisjaW5j
bHVkZSAibW9jX3FncmFwaGljc3dlYnZpZXcuY3BwIgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktp
dC9xdC9XaWRnZXRBcGkvcWdyYXBoaWNzd2Vidmlldy5oIGIvU291cmNlL1dlYktpdC9xdC9XaWRn
ZXRBcGkvcWdyYXBoaWNzd2Vidmlldy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmNjZjcxMzJlNTA1MTU3NThmZWY1
YWFhODlhZTczOTk5ZGE4MGE2NjQKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L3F0
L1dpZGdldEFwaS9xZ3JhcGhpY3N3ZWJ2aWV3LmgKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgICAg
Q29weXJpZ2h0IChDKSAyMDA5IE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFy
eSgtaWVzKQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVk
aXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhl
IEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkg
dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRo
ZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAg
VGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1
c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGlt
cGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJs
aWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2Vp
dmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAg
IGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBu
b3QsIHdyaXRlIHRvCisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEg
RnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAgICBCb3N0b24sIE1BIDAyMTEwLTEzMDEs
IFVTQS4KKyovCisKKyNpZm5kZWYgUUdyYXBoaWNzV2ViVmlld19oCisjZGVmaW5lIFFHcmFwaGlj
c1dlYlZpZXdfaAorCisjaW5jbHVkZSAicXdlYmtpdGdsb2JhbC5oIgorI2luY2x1ZGUgInF3ZWJw
YWdlLmgiCisjaW5jbHVkZSA8UXRDb3JlL3F1cmwuaD4KKyNpbmNsdWRlIDxRdFdpZGdldHMvcWdy
YXBoaWNzd2lkZ2V0Lmg+CisjaW5jbHVkZSA8UXRHdWkvcWV2ZW50Lmg+CisjaW5jbHVkZSA8UXRH
dWkvcWljb24uaD4KKyNpbmNsdWRlIDxRdEd1aS9xcGFpbnRlci5oPgorI2luY2x1ZGUgPFF0TmV0
d29yay9xbmV0d29ya2FjY2Vzc21hbmFnZXIuaD4KKworI2lmICFkZWZpbmVkKFFUX05PX0dSQVBI
SUNTVklFVykKKworY2xhc3MgUVdlYlBhZ2U7CitjbGFzcyBRV2ViSGlzdG9yeTsKK2NsYXNzIFFX
ZWJTZXR0aW5nczsKKworY2xhc3MgUUdyYXBoaWNzV2ViVmlld1ByaXZhdGU7CisKK2NsYXNzIFFX
RUJLSVRfRVhQT1JUIFFHcmFwaGljc1dlYlZpZXcgOiBwdWJsaWMgUUdyYXBoaWNzV2lkZ2V0IHsK
KyAgICBRX09CSkVDVAorCisgICAgUV9QUk9QRVJUWShRU3RyaW5nIHRpdGxlIFJFQUQgdGl0bGUg
Tk9USUZZIHRpdGxlQ2hhbmdlZCkKKyAgICBRX1BST1BFUlRZKFFJY29uIGljb24gUkVBRCBpY29u
IE5PVElGWSBpY29uQ2hhbmdlZCkKKyAgICBRX1BST1BFUlRZKHFyZWFsIHpvb21GYWN0b3IgUkVB
RCB6b29tRmFjdG9yIFdSSVRFIHNldFpvb21GYWN0b3IpCisKKyAgICBRX1BST1BFUlRZKFFVcmwg
dXJsIFJFQUQgdXJsIFdSSVRFIHNldFVybCBOT1RJRlkgdXJsQ2hhbmdlZCkKKworICAgIFFfUFJP
UEVSVFkoYm9vbCBtb2RpZmllZCBSRUFEIGlzTW9kaWZpZWQpCisgICAgUV9QUk9QRVJUWShib29s
IHJlc2l6ZXNUb0NvbnRlbnRzIFJFQUQgcmVzaXplc1RvQ29udGVudHMgV1JJVEUgc2V0UmVzaXpl
c1RvQ29udGVudHMpCisgICAgUV9QUk9QRVJUWShib29sIHRpbGVkQmFja2luZ1N0b3JlRnJvemVu
IFJFQUQgaXNUaWxlZEJhY2tpbmdTdG9yZUZyb3plbiBXUklURSBzZXRUaWxlZEJhY2tpbmdTdG9y
ZUZyb3plbikKKworICAgIFFfUFJPUEVSVFkoUVBhaW50ZXI6OlJlbmRlckhpbnRzIHJlbmRlckhp
bnRzIFJFQUQgcmVuZGVySGludHMgV1JJVEUgc2V0UmVuZGVySGludHMpCisgICAgUV9GTEFHUyhR
UGFpbnRlcjo6UmVuZGVySGludHMpCisKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBRR3JhcGhpY3NX
ZWJWaWV3KFFHcmFwaGljc0l0ZW0qIHBhcmVudCA9IDApOworICAgIH5RR3JhcGhpY3NXZWJWaWV3
KCk7CisKKyAgICBRV2ViUGFnZSogcGFnZSgpIGNvbnN0OworICAgIHZvaWQgc2V0UGFnZShRV2Vi
UGFnZSopOworCisgICAgUVVybCB1cmwoKSBjb25zdDsKKyAgICB2b2lkIHNldFVybChjb25zdCBR
VXJsJik7CisKKyAgICBRU3RyaW5nIHRpdGxlKCkgY29uc3Q7CisgICAgUUljb24gaWNvbigpIGNv
bnN0OworCisgICAgcXJlYWwgem9vbUZhY3RvcigpIGNvbnN0OworICAgIHZvaWQgc2V0Wm9vbUZh
Y3RvcihxcmVhbCk7CisKKyAgICBib29sIGlzTW9kaWZpZWQoKSBjb25zdDsKKworICAgIHZvaWQg
bG9hZChjb25zdCBRVXJsJiB1cmwpOworICAgIHZvaWQgbG9hZChjb25zdCBRTmV0d29ya1JlcXVl
c3QmIHJlcXVlc3QsIFFOZXR3b3JrQWNjZXNzTWFuYWdlcjo6T3BlcmF0aW9uIG9wZXJhdGlvbiA9
IFFOZXR3b3JrQWNjZXNzTWFuYWdlcjo6R2V0T3BlcmF0aW9uLCBjb25zdCBRQnl0ZUFycmF5JiBi
b2R5ID0gUUJ5dGVBcnJheSgpKTsKKworICAgIHZvaWQgc2V0SHRtbChjb25zdCBRU3RyaW5nJiBo
dG1sLCBjb25zdCBRVXJsJiBiYXNlVXJsID0gUVVybCgpKTsKKyAgICAvLyBGSVhNRTogQ29uc2lk
ZXIgcmVuYW1lIHRvIHNldEh0bWw/CisgICAgdm9pZCBzZXRDb250ZW50KGNvbnN0IFFCeXRlQXJy
YXkmIGRhdGEsIGNvbnN0IFFTdHJpbmcmIG1pbWVUeXBlID0gUVN0cmluZygpLCBjb25zdCBRVXJs
JiBiYXNlVXJsID0gUVVybCgpKTsKKworICAgIFFXZWJIaXN0b3J5KiBoaXN0b3J5KCkgY29uc3Q7
CisgICAgUVdlYlNldHRpbmdzKiBzZXR0aW5ncygpIGNvbnN0OworCisgICAgUUFjdGlvbiogcGFn
ZUFjdGlvbihRV2ViUGFnZTo6V2ViQWN0aW9uIGFjdGlvbikgY29uc3Q7CisgICAgdm9pZCB0cmln
Z2VyUGFnZUFjdGlvbihRV2ViUGFnZTo6V2ViQWN0aW9uIGFjdGlvbiwgYm9vbCBjaGVja2VkID0g
ZmFsc2UpOworCisgICAgYm9vbCBmaW5kVGV4dChjb25zdCBRU3RyaW5nJiBzdWJTdHJpbmcsIFFX
ZWJQYWdlOjpGaW5kRmxhZ3Mgb3B0aW9ucyA9IDApOworCisgICAgYm9vbCByZXNpemVzVG9Db250
ZW50cygpIGNvbnN0OworICAgIHZvaWQgc2V0UmVzaXplc1RvQ29udGVudHMoYm9vbCBlbmFibGVk
KTsKKyAgICAKKyAgICBib29sIGlzVGlsZWRCYWNraW5nU3RvcmVGcm96ZW4oKSBjb25zdDsKKyAg
ICB2b2lkIHNldFRpbGVkQmFja2luZ1N0b3JlRnJvemVuKGJvb2wgZnJvemVuKTsKKworICAgIHZp
cnR1YWwgdm9pZCBzZXRHZW9tZXRyeShjb25zdCBRUmVjdEYmIHJlY3QpOworICAgIHZpcnR1YWwg
dm9pZCB1cGRhdGVHZW9tZXRyeSgpOworICAgIHZpcnR1YWwgdm9pZCBwYWludChRUGFpbnRlcios
IGNvbnN0IFFTdHlsZU9wdGlvbkdyYXBoaWNzSXRlbSogb3B0aW9ucywgUVdpZGdldCogd2lkZ2V0
ID0gMCk7CisgICAgdmlydHVhbCBRVmFyaWFudCBpdGVtQ2hhbmdlKEdyYXBoaWNzSXRlbUNoYW5n
ZSBjaGFuZ2UsIGNvbnN0IFFWYXJpYW50JiB2YWx1ZSk7CisgICAgdmlydHVhbCBib29sIGV2ZW50
KFFFdmVudCopOworCisgICAgdmlydHVhbCBRU2l6ZUYgc2l6ZUhpbnQoUXQ6OlNpemVIaW50IHdo
aWNoLCBjb25zdCBRU2l6ZUYmIGNvbnN0cmFpbnQpIGNvbnN0OworCisgICAgdmlydHVhbCBRVmFy
aWFudCBpbnB1dE1ldGhvZFF1ZXJ5KFF0OjpJbnB1dE1ldGhvZFF1ZXJ5IHF1ZXJ5KSBjb25zdDsK
KworICAgIFFQYWludGVyOjpSZW5kZXJIaW50cyByZW5kZXJIaW50cygpIGNvbnN0OworICAgIHZv
aWQgc2V0UmVuZGVySGludHMoUVBhaW50ZXI6OlJlbmRlckhpbnRzKTsKKyAgICB2b2lkIHNldFJl
bmRlckhpbnQoUVBhaW50ZXI6OlJlbmRlckhpbnQsIGJvb2wgZW5hYmxlZCA9IHRydWUpOworCitw
dWJsaWMgUV9TTE9UUzoKKyAgICB2b2lkIHN0b3AoKTsKKyAgICB2b2lkIGJhY2soKTsKKyAgICB2
b2lkIGZvcndhcmQoKTsKKyAgICB2b2lkIHJlbG9hZCgpOworCitRX1NJR05BTFM6CisgICAgdm9p
ZCBsb2FkU3RhcnRlZCgpOworICAgIHZvaWQgbG9hZEZpbmlzaGVkKGJvb2wpOworCisgICAgdm9p
ZCBsb2FkUHJvZ3Jlc3MoaW50IHByb2dyZXNzKTsKKyAgICB2b2lkIHVybENoYW5nZWQoY29uc3Qg
UVVybCYpOworICAgIHZvaWQgdGl0bGVDaGFuZ2VkKGNvbnN0IFFTdHJpbmcmKTsKKyAgICB2b2lk
IGljb25DaGFuZ2VkKCk7CisgICAgdm9pZCBzdGF0dXNCYXJNZXNzYWdlKGNvbnN0IFFTdHJpbmcm
IG1lc3NhZ2UpOworICAgIHZvaWQgbGlua0NsaWNrZWQoY29uc3QgUVVybCYpOworCitwcm90ZWN0
ZWQ6CisgICAgdmlydHVhbCB2b2lkIG1vdXNlUHJlc3NFdmVudChRR3JhcGhpY3NTY2VuZU1vdXNl
RXZlbnQqKTsKKyAgICB2aXJ0dWFsIHZvaWQgbW91c2VEb3VibGVDbGlja0V2ZW50KFFHcmFwaGlj
c1NjZW5lTW91c2VFdmVudCopOworICAgIHZpcnR1YWwgdm9pZCBtb3VzZVJlbGVhc2VFdmVudChR
R3JhcGhpY3NTY2VuZU1vdXNlRXZlbnQqKTsKKyAgICB2aXJ0dWFsIHZvaWQgbW91c2VNb3ZlRXZl
bnQoUUdyYXBoaWNzU2NlbmVNb3VzZUV2ZW50Kik7CisgICAgdmlydHVhbCB2b2lkIGhvdmVyTW92
ZUV2ZW50KFFHcmFwaGljc1NjZW5lSG92ZXJFdmVudCopOworICAgIHZpcnR1YWwgdm9pZCBob3Zl
ckxlYXZlRXZlbnQoUUdyYXBoaWNzU2NlbmVIb3ZlckV2ZW50Kik7CisjaWZuZGVmIFFUX05PX1dI
RUVMRVZFTlQKKyAgICB2aXJ0dWFsIHZvaWQgd2hlZWxFdmVudChRR3JhcGhpY3NTY2VuZVdoZWVs
RXZlbnQqKTsKKyNlbmRpZgorICAgIHZpcnR1YWwgdm9pZCBrZXlQcmVzc0V2ZW50KFFLZXlFdmVu
dCopOworICAgIHZpcnR1YWwgdm9pZCBrZXlSZWxlYXNlRXZlbnQoUUtleUV2ZW50Kik7CisjaWZu
ZGVmIFFUX05PX0NPTlRFWFRNRU5VCisgICAgdmlydHVhbCB2b2lkIGNvbnRleHRNZW51RXZlbnQo
UUdyYXBoaWNzU2NlbmVDb250ZXh0TWVudUV2ZW50Kik7CisjZW5kaWYKKyAgICB2aXJ0dWFsIHZv
aWQgZHJhZ0VudGVyRXZlbnQoUUdyYXBoaWNzU2NlbmVEcmFnRHJvcEV2ZW50Kik7CisgICAgdmly
dHVhbCB2b2lkIGRyYWdMZWF2ZUV2ZW50KFFHcmFwaGljc1NjZW5lRHJhZ0Ryb3BFdmVudCopOwor
ICAgIHZpcnR1YWwgdm9pZCBkcmFnTW92ZUV2ZW50KFFHcmFwaGljc1NjZW5lRHJhZ0Ryb3BFdmVu
dCopOworICAgIHZpcnR1YWwgdm9pZCBkcm9wRXZlbnQoUUdyYXBoaWNzU2NlbmVEcmFnRHJvcEV2
ZW50Kik7CisgICAgdmlydHVhbCB2b2lkIGZvY3VzSW5FdmVudChRRm9jdXNFdmVudCopOworICAg
IHZpcnR1YWwgdm9pZCBmb2N1c091dEV2ZW50KFFGb2N1c0V2ZW50Kik7CisgICAgdmlydHVhbCB2
b2lkIGlucHV0TWV0aG9kRXZlbnQoUUlucHV0TWV0aG9kRXZlbnQqKTsKKyAgICB2aXJ0dWFsIGJv
b2wgZm9jdXNOZXh0UHJldkNoaWxkKGJvb2wgbmV4dCk7CisKKyAgICB2aXJ0dWFsIGJvb2wgc2Nl
bmVFdmVudChRRXZlbnQqKTsKKworcHJpdmF0ZToKKyAgICBRX1BSSVZBVEVfU0xPVChkLCB2b2lk
IF9xX2RvTG9hZEZpbmlzaGVkKGJvb2wgc3VjY2VzcykpCisgICAgUV9QUklWQVRFX1NMT1QoZCwg
dm9pZCBfcV9wYWdlRGVzdHJveWVkKCkpCisgICAgUV9QUklWQVRFX1NMT1QoZCwgdm9pZCBfcV9j
b250ZW50c1NpemVDaGFuZ2VkKGNvbnN0IFFTaXplJikpCisgICAgUV9QUklWQVRFX1NMT1QoZCwg
dm9pZCBfcV9zY2FsZUNoYW5nZWQoKSkKKworICAgIFFHcmFwaGljc1dlYlZpZXdQcml2YXRlKiBj
b25zdCBkOworICAgIGZyaWVuZCBjbGFzcyBRR3JhcGhpY3NXZWJWaWV3UHJpdmF0ZTsKK307CisK
KyNlbmRpZiAvLyBRVF9OT19HUkFQSElDU1ZJRVcKKworI2VuZGlmIC8vIFFHcmFwaGljc1dlYlZp
ZXdfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9XaWRnZXRBcGkvcXdlYmZyYW1lLmNw
cCBiL1NvdXJjZS9XZWJLaXQvcXQvV2lkZ2V0QXBpL3F3ZWJmcmFtZS5jcHAKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4u
MWFiNzZkODM0YWNjZWVkMmJkZTA1ZDYwNDhiNzlmNzFjZmU5NDNjZQotLS0gL2Rldi9udWxsCisr
KyBiL1NvdXJjZS9XZWJLaXQvcXQvV2lkZ2V0QXBpL3F3ZWJmcmFtZS5jcHAKQEAgLTAsMCArMSwx
MjgxIEBACisvKgorICAgIENvcHlyaWdodCAoQykgMjAwOCwyMDA5IE5va2lhIENvcnBvcmF0aW9u
IGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQorICAgIENvcHlyaWdodCAoQykgMjAwNyBTdGFp
a29zIENvbXB1dGluZyBTZXJ2aWNlcyBJbmMuCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBz
b2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVu
ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNl
bnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIK
KyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxh
dGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhv
cGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7
IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElU
WSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAg
TGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZ
b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmls
ZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBG
b3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICAgIEJv
c3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgInF3ZWJmcmFtZS5oIgorCisjaW5jbHVkZSAiUXRQcmludENvbnRleHQuaCIKKyNpbmNs
dWRlICJxd2ViZWxlbWVudC5oIgorI2luY2x1ZGUgInF3ZWJmcmFtZV9wLmgiCisjaW5jbHVkZSAi
cXdlYnBhZ2UuaCIKKyNpbmNsdWRlICJxd2VicGFnZV9wLmgiCisjaW5jbHVkZSAicXdlYnNlY3Vy
aXR5b3JpZ2luLmgiCisjaW5jbHVkZSAicXdlYnNjcmlwdHdvcmxkLmgiCisjaW5jbHVkZSAicXdl
YnNjcmlwdHdvcmxkX3AuaCIKKyNpbmNsdWRlIDxRTXVsdGlNYXA+CisjaW5jbHVkZSA8cWRlYnVn
Lmg+CisjaW5jbHVkZSA8cWV2ZW50Lmg+CisjaW5jbHVkZSA8cWZpbGVpbmZvLmg+CisjaW5jbHVk
ZSA8cXBhaW50ZXIuaD4KKyNpZiBIQVZFKFFUUFJJTlRTVVBQT1JUKQorI2luY2x1ZGUgPHFwcmlu
dGVyLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxxcmVnaW9uLmg+CisjaW5jbHVkZSA8cW5ldHdvcmty
ZXF1ZXN0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOworCisvLyBmcm9tIHRleHQvcWZv
bnQuY3BwCitRVF9CRUdJTl9OQU1FU1BBQ0UKK2V4dGVybiBRX0dVSV9FWFBPUlQgaW50IHF0X2Rl
ZmF1bHREcGkoKTsKK1FUX0VORF9OQU1FU1BBQ0UKKwordm9pZCBRV2ViRnJhbWVQcml2YXRlOjpz
ZXRQYWdlKFFXZWJQYWdlKiBuZXdQYWdlKQoreworICAgIGlmIChwYWdlID09IG5ld1BhZ2UpCisg
ICAgICAgIHJldHVybjsKKworICAgIC8vIFRoZSBRV2ViRnJhbWUgaXMgY3JlYXRlZCBhcyBhIGNo
aWxkIG9mIFFXZWJQYWdlIG9yIGEgcGFyZW50IFFXZWJGcmFtZS4KKyAgICAvLyBUaGF0IGFkZHMg
aXQgdG8gUU9iamVjdCdzIGludGVybmFsIGNoaWxkcmVuIGxpc3QgYW5kIGVuc3VyZXMgaXQgd2ls
bCBiZQorICAgIC8vIGRlbGV0ZWQgd2hlbiBwYXJlbnQgUVdlYlBhZ2UgaXMgZGVsZXRlZC4gUmVw
YXJlbnQgaWYgbmVlZGVkLgorICAgIGlmIChxLT5wYXJlbnQoKSA9PSBxb2JqZWN0X2Nhc3Q8UU9i
amVjdCo+KHBhZ2UpKQorICAgICAgICBxLT5zZXRQYXJlbnQobmV3UGFnZSk7CisKKyAgICBwYWdl
ID0gbmV3UGFnZTsKKyAgICBwYWdlQWRhcHRlciA9IG5ld1BhZ2UtPmhhbmRsZSgpOworICAgIGVt
aXQgcS0+cGFnZUNoYW5nZWQoKTsKK30KKwordm9pZCBRV2ViRnJhbWVQcml2YXRlOjplbWl0VXJs
Q2hhbmdlZCgpCit7CisgICAgdXJsID0gY29yZUZyYW1lVXJsKCk7CisgICAgZW1pdCBxLT51cmxD
aGFuZ2VkKHVybCk7Cit9CisKK3ZvaWQgUVdlYkZyYW1lUHJpdmF0ZTo6ZGlkU3RhcnRQcm92aXNp
b25hbExvYWQoKQoreworICAgIGVtaXQgcS0+cHJvdmlzaW9uYWxMb2FkKCk7Cit9CisKK3ZvaWQg
UVdlYkZyYW1lUHJpdmF0ZTo6ZGlkQ2xlYXJXaW5kb3dPYmplY3QoKQoreworICAgIGVtaXQgcS0+
amF2YVNjcmlwdFdpbmRvd09iamVjdENsZWFyZWQoKTsKK30KKworYm9vbCBRV2ViRnJhbWVQcml2
YXRlOjpoYW5kbGVQcm9ncmVzc0ZpbmlzaGVkKFFQb2ludCAqbG9jYWxQb3MpCit7CisgICAgUVdp
ZGdldCAqdmlldyA9IHEtPnBhZ2UoKS0+dmlldygpOworICAgIGlmICghdmlldyB8fCAhbG9jYWxQ
b3MpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAqbG9jYWxQb3MgPSB2aWV3LT5tYXBGcm9t
R2xvYmFsKFFDdXJzb3I6OnBvcygpKTsKKyAgICByZXR1cm4gdmlldy0+aGFzRm9jdXMoKSAmJiB2
aWV3LT5yZWN0KCkuY29udGFpbnMoKmxvY2FsUG9zKTsKK30KKwordm9pZCBRV2ViRnJhbWVQcml2
YXRlOjplbWl0SW5pdGlhbExheW91dENvbXBsZXRlZCgpCit7CisgICAgZW1pdCBxLT5pbml0aWFs
TGF5b3V0Q29tcGxldGVkKCk7Cit9CisKK3ZvaWQgUVdlYkZyYW1lUHJpdmF0ZTo6ZW1pdEljb25D
aGFuZ2VkKCkKK3sKKyAgICBlbWl0IHEtPmljb25DaGFuZ2VkKCk7Cit9CisKK3ZvaWQgUVdlYkZy
YW1lUHJpdmF0ZTo6ZW1pdExvYWRTdGFydGVkKGJvb2wgb3JpZ2luYXRpbmdMb2FkKQoreworICAg
IGlmIChwYWdlICYmIG9yaWdpbmF0aW5nTG9hZCkKKyAgICAgICAgZW1pdCBwYWdlLT5sb2FkU3Rh
cnRlZCgpOworICAgIGVtaXQgcS0+bG9hZFN0YXJ0ZWQoKTsKK30KKwordm9pZCBRV2ViRnJhbWVQ
cml2YXRlOjplbWl0TG9hZEZpbmlzaGVkKGJvb2wgb3JpZ2luYXRpbmdMb2FkLCBib29sIG9rKQor
eworICAgIGlmIChwYWdlICYmIG9yaWdpbmF0aW5nTG9hZCkKKyAgICAgICAgZW1pdCBwYWdlLT5s
b2FkRmluaXNoZWQob2spOworICAgIGVtaXQgcS0+bG9hZEZpbmlzaGVkKG9rKTsKK30KKworUVdl
YkZyYW1lQWRhcHRlciogUVdlYkZyYW1lUHJpdmF0ZTo6Y3JlYXRlQ2hpbGRGcmFtZShRV2ViRnJh
bWVEYXRhKiBmcmFtZURhdGEpCit7CisgICAgUVdlYkZyYW1lKiBuZXdGcmFtZSA9IG5ldyBRV2Vi
RnJhbWUoLypwYXJlbnQgZnJhbWUqL3EsIGZyYW1lRGF0YSk7CisgICAgcmV0dXJuIG5ld0ZyYW1l
LT5kOworfQorCitRV2ViRnJhbWUgKlFXZWJGcmFtZVByaXZhdGU6OmFwaUhhbmRsZSgpCit7Cisg
ICAgcmV0dXJuIHE7Cit9CisKK1FPYmplY3QgKlFXZWJGcmFtZVByaXZhdGU6OmhhbmRsZSgpCit7
CisgICAgcmV0dXJuIHE7Cit9CisKK3ZvaWQgUVdlYkZyYW1lUHJpdmF0ZTo6Y29udGVudHNTaXpl
RGlkQ2hhbmdlKGNvbnN0IFFTaXplICZzaXplKQoreworICAgIGVtaXQgcS0+Y29udGVudHNTaXpl
Q2hhbmdlZChzaXplKTsKK30KKworaW50IFFXZWJGcmFtZVByaXZhdGU6OnNjcm9sbEJhclBvbGlj
eShRdDo6T3JpZW50YXRpb24gb3JpZW50YXRpb24pIGNvbnN0Cit7CisgICAgcmV0dXJuIChpbnQp
IHEtPnNjcm9sbEJhclBvbGljeShvcmllbnRhdGlvbik7Cit9CisKKy8qIQorICAgIFxjbGFzcyBR
V2ViRnJhbWUKKyAgICBcc2luY2UgNC40CisgICAgXGJyaWVmIFRoZSBRV2ViRnJhbWUgY2xhc3Mg
cmVwcmVzZW50cyBhIGZyYW1lIGluIGEgd2ViIHBhZ2UuCisKKyAgICBcaW5tb2R1bGUgUXRXZWJL
aXQKKworICAgIFFXZWJGcmFtZSByZXByZXNlbnRzIGEgZnJhbWUgaW5zaWRlIGEgd2ViIHBhZ2Uu
IEVhY2ggUVdlYlBhZ2UKKyAgICBvYmplY3QgY29udGFpbnMgYXQgbGVhc3Qgb25lIGZyYW1lLCB0
aGUgbWFpbiBmcmFtZSwgb2J0YWluZWQgdXNpbmcKKyAgICBRV2ViUGFnZTo6bWFpbkZyYW1lKCku
IEFkZGl0aW9uYWwgZnJhbWVzIHdpbGwgYmUgY3JlYXRlZCBmb3IgSFRNTAorICAgIFxjezxmcmFt
ZT59IG9yIFxjezxpZnJhbWU+fSBlbGVtZW50cy4KKworICAgIEEgZnJhbWUgY2FuIGJlIGxvYWRl
ZCB1c2luZyBsb2FkKCkgb3Igc2V0VXJsKCkuIEFsdGVybmF0aXZlbHksIGlmIHlvdSBoYXZlCisg
ICAgdGhlIEhUTUwgY29udGVudCByZWFkaWx5IGF2YWlsYWJsZSwgeW91IGNhbiB1c2Ugc2V0SHRt
bCgpIGluc3RlYWQuCisKKyAgICBUaGUgcGFnZSgpIGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVy
IHRvIHRoZSB3ZWIgcGFnZSBvYmplY3QuIFNlZQorICAgIFxse1FXZWJWaWV3fXtFbGVtZW50cyBv
ZiBRV2ViVmlld30gZm9yIGFuIGV4cGxhbmF0aW9uIG9mIGhvdyB3ZWIKKyAgICBmcmFtZXMgYXJl
IHJlbGF0ZWQgdG8gYSB3ZWIgcGFnZSBhbmQgd2ViIHZpZXcuCisKKyAgICBUaGUgUVdlYkZyYW1l
IGNsYXNzIGFsc28gb2ZmZXJzIG1ldGhvZHMgdG8gcmV0cmlldmUgYm90aCB0aGUgVVJMIGN1cnJl
bnRseQorICAgIGxvYWRlZCBieSB0aGUgZnJhbWUgKHNlZSB1cmwoKSkgYXMgd2VsbCBhcyB0aGUg
VVJMIG9yaWdpbmFsbHkgcmVxdWVzdGVkCisgICAgdG8gYmUgbG9hZGVkIChzZWUgcmVxdWVzdGVk
VXJsKCkpLiBUaGVzZSBtZXRob2RzIG1ha2UgcG9zc2libGUgdGhlIHJldHJpZXZhbAorICAgIG9m
IHRoZSBVUkwgYmVmb3JlIGFuZCBhZnRlciBhIEROUyByZXNvbHV0aW9uIG9yIGEgcmVkaXJlY3Rp
b24gb2NjdXJzIGR1cmluZworICAgIHRoZSBsb2FkIHByb2Nlc3MuIFRoZSByZXF1ZXN0ZWRVcmwo
KSBhbHNvIG1hdGNoZXMgdG8gdGhlIFVSTCBhZGRlZCB0byB0aGUKKyAgICBmcmFtZSBoaXN0b3J5
IChcbHtRV2ViSGlzdG9yeX0pIGlmIGxvYWQgaXMgc3VjY2Vzc2Z1bC4KKworICAgIFRoZSB0aXRs
ZSBvZiBhbiBIVE1MIGZyYW1lIGNhbiBiZSBhY2Nlc3NlZCB3aXRoIHRoZSB0aXRsZSgpIHByb3Bl
cnR5LgorICAgIEFkZGl0aW9uYWxseSwgYSBmcmFtZSBtYXkgYWxzbyBzcGVjaWZ5IGFuIGljb24s
IHdoaWNoIGNhbiBiZSBhY2Nlc3NlZAorICAgIHVzaW5nIHRoZSBpY29uKCkgcHJvcGVydHkuIElm
IHRoZSB0aXRsZSBvciB0aGUgaWNvbiBjaGFuZ2VzLCB0aGUKKyAgICBjb3JyZXNwb25kaW5nIHRp
dGxlQ2hhbmdlZCgpIGFuZCBpY29uQ2hhbmdlZCgpIHNpZ25hbHMgd2lsbCBiZSBlbWl0dGVkLgor
ICAgIFRoZSB6b29tRmFjdG9yKCkgcHJvcGVydHkgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZSBv
dmVyYWxsIHNpemUKKyAgICBvZiB0aGUgY29udGVudCBkaXNwbGF5ZWQgaW4gdGhlIGZyYW1lLgor
CisgICAgUVdlYkZyYW1lIG9iamVjdHMgYXJlIGNyZWF0ZWQgYW5kIGNvbnRyb2xsZWQgYnkgdGhl
IHdlYiBwYWdlLiBZb3UKKyAgICBjYW4gY29ubmVjdCB0byB0aGUgd2ViIHBhZ2UncyBcbHtRV2Vi
UGFnZTo6fXtmcmFtZUNyZWF0ZWQoKX0gc2lnbmFsCisgICAgdG8gYmUgbm90aWZpZWQgd2hlbiBh
IG5ldyBmcmFtZSBpcyBjcmVhdGVkLgorCisgICAgVGhlcmUgYXJlIG11bHRpcGxlIHdheXMgdG8g
cHJvZ3JhbW1hdGljYWxseSBleGFtaW5lIHRoZSBjb250ZW50cyBvZiBhIGZyYW1lLgorICAgIFRo
ZSBoaXRUZXN0Q29udGVudCgpIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGZpbmQgZWxlbWVudHMg
YnkgY29vcmRpbmF0ZS4KKyAgICBGb3IgYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIERPTSB0cmVl
LCB0aGVyZSBpcyBkb2N1bWVudEVsZW1lbnQoKSwKKyAgICBmaW5kQWxsRWxlbWVudHMoKSBhbmQg
ZmluZEZpcnN0RWxlbWVudCgpLgorCisgICAgQSBRV2ViRnJhbWUgY2FuIGJlIHByaW50ZWQgb250
byBhIFFQcmludGVyIHVzaW5nIHRoZSBwcmludCgpIGZ1bmN0aW9uLgorICAgIFRoaXMgZnVuY3Rp
b24gaXMgbWFya2VkIGFzIGEgc2xvdCBhbmQgY2FuIGJlIGNvbnZlbmllbnRseSBjb25uZWN0ZWQg
dG8KKyAgICBcbHtRUHJpbnRQcmV2aWV3RGlhbG9nfSdzIFxse1FQcmludFByZXZpZXdEaWFsb2c6
On17cGFpbnRSZXF1ZXN0ZWQoKX0KKyAgICBzaWduYWwuCisKKyAgICBcc2EgUVdlYlBhZ2UKKyov
CisKKy8qIQorICAgIFxlbnVtIFFXZWJGcmFtZTo6UmVuZGVyTGF5ZXIKKworICAgIFRoaXMgZW51
bSBkZXNjcmliZXMgdGhlIGxheWVycyBhdmFpbGFibGUgZm9yIHJlbmRlcmluZyB1c2luZyBcbHtR
V2ViRnJhbWU6On17cmVuZGVyKCl9LgorICAgIFRoZSBsYXllcnMgY2FuIGJlIE9SLWVkIHRvZ2V0
aGVyIGZyb20gdGhlIGZvbGxvd2luZyBsaXN0OgorCisgICAgXHZhbHVlIENvbnRlbnRzTGF5ZXIg
VGhlIHdlYiBjb250ZW50IG9mIHRoZSBmcmFtZQorICAgIFx2YWx1ZSBTY3JvbGxCYXJMYXllciBU
aGUgc2Nyb2xsYmFycyBvZiB0aGUgZnJhbWUKKyAgICBcdmFsdWUgUGFuSWNvbkxheWVyIFRoZSBp
Y29uIHVzZWQgd2hlbiBwYW5uaW5nIHRoZSBmcmFtZQorCisgICAgXHZhbHVlIEFsbExheWVycyBJ
bmNsdWRlcyBhbGwgdGhlIGFib3ZlIGxheWVycworKi8KKworUVdlYkZyYW1lOjpRV2ViRnJhbWUo
UVdlYlBhZ2UgKnBhcmVudFBhZ2UpCisgICAgOiBRT2JqZWN0KHBhcmVudFBhZ2UpCisgICAgLCBk
KG5ldyBRV2ViRnJhbWVQcml2YXRlKQoreworICAgIGQtPnBhZ2UgPSBwYXJlbnRQYWdlOworICAg
IGQtPnEgPSB0aGlzOworICAgIGQtPmluaXQoLypwYWdlIGFkYXB0ZXIqLyBwYXJlbnRQYWdlLT5o
YW5kbGUoKSk7CisKKyNpZiBFTkFCTEUoT1JJRU5UQVRJT05fRVZFTlRTKQorICAgIGNvbm5lY3Qo
JmQtPm1fb3JpZW50YXRpb24sIFNJR05BTChyZWFkaW5nQ2hhbmdlZCgpKSwgdGhpcywgU0xPVChf
cV9vcmllbnRhdGlvbkNoYW5nZWQoKSkpOworICAgIGQtPm1fb3JpZW50YXRpb24uc3RhcnQoKTsK
KyNlbmRpZgorfQorCitRV2ViRnJhbWU6OlFXZWJGcmFtZShRV2ViRnJhbWUqIHBhcmVudCwgUVdl
YkZyYW1lRGF0YSogZnJhbWVEYXRhKQorICAgIDogUU9iamVjdChwYXJlbnQpCisgICAgLCBkKG5l
dyBRV2ViRnJhbWVQcml2YXRlKQoreworICAgIGQtPnBhZ2UgPSBwYXJlbnQtPmQtPnBhZ2U7Cisg
ICAgZC0+cSA9IHRoaXM7CisgICAgZC0+aW5pdChwYXJlbnQtPmQtPnBhZ2VBZGFwdGVyLCBmcmFt
ZURhdGEpOworI2lmIEVOQUJMRShPUklFTlRBVElPTl9FVkVOVFMpCisgICAgY29ubmVjdCgmZC0+
bV9vcmllbnRhdGlvbiwgU0lHTkFMKHJlYWRpbmdDaGFuZ2VkKCkpLCB0aGlzLCBTTE9UKF9xX29y
aWVudGF0aW9uQ2hhbmdlZCgpKSk7CisgICAgZC0+bV9vcmllbnRhdGlvbi5zdGFydCgpOworI2Vu
ZGlmCit9CisKK1FXZWJGcmFtZTo6flFXZWJGcmFtZSgpCit7CisgICAgZGVsZXRlIGQ7Cit9CisK
Ky8qIQorICAgIFxmbiB2b2lkIFFXZWJGcmFtZTo6YWRkVG9KYXZhU2NyaXB0V2luZG93T2JqZWN0
KGNvbnN0IFFTdHJpbmcgJm5hbWUsIFFPYmplY3QgKm9iamVjdCwgVmFsdWVPd25lcnNoaXAgb3du
KQorCisgICAgTWFrZSBcYSBvYmplY3QgYXZhaWxhYmxlIHVuZGVyIFxhIG5hbWUgZnJvbSB3aXRo
aW4gdGhlIGZyYW1lJ3MgSmF2YVNjcmlwdAorICAgIGNvbnRleHQuIFRoZSBcYSBvYmplY3Qgd2ls
bCBiZSBpbnNlcnRlZCBhcyBhIGNoaWxkIG9mIHRoZSBmcmFtZSdzIHdpbmRvdworICAgIG9iamVj
dC4KKworICAgIFF0IHByb3BlcnRpZXMgd2lsbCBiZSBleHBvc2VkIGFzIEphdmFTY3JpcHQgcHJv
cGVydGllcyBhbmQgc2xvdHMgYXMKKyAgICBKYXZhU2NyaXB0IG1ldGhvZHMuCisgICAgVGhlIGlu
dGVyYWN0aW9uIGJldHdlZW4gQysrIGFuZCBKYXZhU2NyaXB0IGlzIGV4cGxhaW5lZCBpbiB0aGUg
ZG9jdW1lbnRhdGlvbiBvZiB0aGUgXGx7VGhlIFF0V2ViS2l0IEJyaWRnZX17UXRXZWJLaXQgYnJp
ZGdlfS4KKworICAgIElmIHlvdSB3YW50IHRvIGVuc3VyZSB0aGF0IHlvdXIgUU9iamVjdHMgcmVt
YWluIGFjY2Vzc2libGUgYWZ0ZXIgbG9hZGluZyBhCisgICAgbmV3IFVSTCwgeW91IHNob3VsZCBh
ZGQgdGhlbSBpbiBhIHNsb3QgY29ubmVjdGVkIHRvIHRoZQorICAgIGphdmFTY3JpcHRXaW5kb3dP
YmplY3RDbGVhcmVkKCkgc2lnbmFsLgorCisgICAgSWYgSmF2YXNjcmlwdCBpcyBub3QgZW5hYmxl
ZCBmb3IgdGhpcyBwYWdlLCB0aGVuIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZy4KKworICAgIFRo
ZSBvd25lcnNoaXAgb2YgXGEgb2JqZWN0IGlzIHNwZWNpZmllZCB1c2luZyBcYSBvd24uCisqLwor
dm9pZCBRV2ViRnJhbWU6OmFkZFRvSmF2YVNjcmlwdFdpbmRvd09iamVjdChjb25zdCBRU3RyaW5n
ICZuYW1lLCBRT2JqZWN0ICpvYmplY3QsIFZhbHVlT3duZXJzaGlwIG93bmVyc2hpcCkKK3sKKyAg
ICBkLT5hZGRUb0phdmFTY3JpcHRXaW5kb3dPYmplY3QobmFtZSwgb2JqZWN0LCBzdGF0aWNfY2Fz
dDxRV2ViRnJhbWVBZGFwdGVyOjpWYWx1ZU93bmVyc2hpcD4ob3duZXJzaGlwKSk7Cit9CisKKy8q
IQorICAgIFJldHVybnMgdGhlIGZyYW1lJ3MgY29udGVudCBhcyBIVE1MLCBlbmNsb3NlZCBpbiBI
VE1MIGFuZCBCT0RZIHRhZ3MuCisKKyAgICBcc2Egc2V0SHRtbCgpLCB0b1BsYWluVGV4dCgpCisq
LworUVN0cmluZyBRV2ViRnJhbWU6OnRvSHRtbCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGQtPnRv
SHRtbCgpOworfQorCisvKiEKKyAgICBSZXR1cm5zIHRoZSBjb250ZW50IG9mIHRoaXMgZnJhbWUg
Y29udmVydGVkIHRvIHBsYWluIHRleHQsIGNvbXBsZXRlbHkKKyAgICBzdHJpcHBlZCBvZiBhbGwg
SFRNTCBmb3JtYXR0aW5nLgorCisgICAgXHNhIHRvSHRtbCgpCisqLworUVN0cmluZyBRV2ViRnJh
bWU6OnRvUGxhaW5UZXh0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gZC0+dG9QbGFpblRleHQoKTsK
K30KKworLyohCisgICAgXHByb3BlcnR5IFFXZWJGcmFtZTo6dGl0bGUKKyAgICBcYnJpZWYgdGhl
IHRpdGxlIG9mIHRoZSBmcmFtZSBhcyBkZWZpbmVkIGJ5IHRoZSBIVE1MICZsdDt0aXRsZSZndDsg
ZWxlbWVudAorCisgICAgXHNhIHRpdGxlQ2hhbmdlZCgpCisqLworCitRU3RyaW5nIFFXZWJGcmFt
ZTo6dGl0bGUoKSBjb25zdAoreworICAgIHJldHVybiBkLT50aXRsZSgpOworfQorCisvKiEKKyAg
ICBcc2luY2UgNC41CisgICAgXGJyaWVmIFJldHVybnMgdGhlIG1ldGEgZGF0YSBpbiB0aGlzIGZy
YW1lIGFzIGEgUU11bHRpTWFwCisKKyAgICBUaGUgbWV0YSBkYXRhIGNvbnNpc3RzIG9mIHRoZSBu
YW1lIGFuZCBjb250ZW50IGF0dHJpYnV0ZXMgb2YgdGhlCisgICAgb2YgdGhlIFxjezxtZXRhPn0g
dGFncyBpbiB0aGUgSFRNTCBkb2N1bWVudC4KKworICAgIEZvciBleGFtcGxlOgorCisgICAgXGNv
ZGUKKyAgICA8aHRtbD4KKyAgICAgICAgPGhlYWQ+CisgICAgICAgICAgICA8bWV0YSBuYW1lPSJk
ZXNjcmlwdGlvbiIgY29udGVudD0iVGhpcyBkb2N1bWVudCBpcyBhIHR1dG9yaWFsIGFib3V0IFF0
IGRldmVsb3BtZW50Ij4KKyAgICAgICAgICAgIDxtZXRhIG5hbWU9ImtleXdvcmRzIiBjb250ZW50
PSJRdCwgV2ViS2l0LCBQcm9ncmFtbWluZyI+CisgICAgICAgIDwvaGVhZD4KKyAgICAgICAgLi4u
CisgICAgPC9odG1sPgorICAgIFxlbmRjb2RlCisKKyAgICBHaXZlbiB0aGUgYWJvdmUgSFRNTCBj
b2RlIHRoZSBtZXRhRGF0YSgpIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGEgbWFwIHdpdGggdHdvIGVu
dHJpZXM6CisgICAgXHRhYmxlCisgICAgXGhlYWRlciBcbGkgS2V5CisgICAgICAgICAgICBcbGkg
VmFsdWUKKyAgICBccm93ICAgIFxsaSAiZGVzY3JpcHRpb24iCisgICAgICAgICAgICBcbGkgIlRo
aXMgZG9jdW1lbnQgaXMgYSB0dXRvcmlhbCBhYm91dCBRdCBkZXZlbG9wbWVudCIKKyAgICBccm93
ICAgIFxsaSAia2V5d29yZHMiCisgICAgICAgICAgICBcbGkgIlF0LCBXZWJLaXQsIFByb2dyYW1t
aW5nIgorICAgIFxlbmR0YWJsZQorCisgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgbXVsdGkg
bWFwIHRvIHN1cHBvcnQgbXVsdGlwbGUgbWV0YSB0YWdzIHdpdGggdGhlIHNhbWUgYXR0cmlidXRl
IG5hbWUuCisqLworUU11bHRpTWFwPFFTdHJpbmcsIFFTdHJpbmc+IFFXZWJGcmFtZTo6bWV0YURh
dGEoKSBjb25zdAoreworICAgIHJldHVybiBkLT5tZXRhRGF0YSgpOworfQorCisvKiEKKyAgICBc
cHJvcGVydHkgUVdlYkZyYW1lOjp1cmwKKyAgICBcYnJpZWYgdGhlIHVybCBvZiB0aGUgZnJhbWUg
Y3VycmVudGx5IHZpZXdlZAorCisgICAgU2V0dGluZyB0aGlzIHByb3BlcnR5IGNsZWFycyB0aGUg
dmlldyBhbmQgbG9hZHMgdGhlIFVSTC4KKworICAgIEJ5IGRlZmF1bHQsIHRoaXMgcHJvcGVydHkg
Y29udGFpbnMgYW4gZW1wdHksIGludmFsaWQgVVJMLgorCisgICAgXHNhIHVybENoYW5nZWQoKQor
Ki8KKwordm9pZCBRV2ViRnJhbWU6OnNldFVybChjb25zdCBRVXJsICZ1cmwpCit7CisgICAgZC0+
Y2xlYXJDb3JlRnJhbWUoKTsKKyAgICBjb25zdCBRVXJsIGFic29sdXRlID0gUVdlYkZyYW1lQWRh
cHRlcjo6ZW5zdXJlQWJzb2x1dGVVcmwodXJsKTsKKyAgICBkLT51cmwgPSBhYnNvbHV0ZTsKKyAg
ICBsb2FkKGFic29sdXRlKTsKK30KKworUVVybCBRV2ViRnJhbWU6OnVybCgpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIGQtPnVybDsKK30KKworLyohCisgICAgXHNpbmNlIDQuNgorICAgIFxwcm9wZXJ0
eSBRV2ViRnJhbWU6OnJlcXVlc3RlZFVybAorCisgICAgVGhlIFVSTCByZXF1ZXN0ZWQgdG8gbG9h
ZGVkIGJ5IHRoZSBmcmFtZSBjdXJyZW50bHkgdmlld2VkLiBUaGUgVVJMIG1heSBkaWZmZXIgZnJv
bQorICAgIHRoZSBvbmUgcmV0dXJuZWQgYnkgdXJsKCkgaWYgYSBETlMgcmVzb2x1dGlvbiBvciBh
IHJlZGlyZWN0aW9uIG9jY3Vycy4KKworICAgIFxzYSB1cmwoKSwgc2V0VXJsKCkKKyovCitRVXJs
IFFXZWJGcmFtZTo6cmVxdWVzdGVkVXJsKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZC0+bGFzdFJl
cXVlc3RlZFVybCgpOworfQorLyohCisgICAgXHNpbmNlIDQuNgorICAgIFxwcm9wZXJ0eSBRV2Vi
RnJhbWU6OmJhc2VVcmwKKyAgICBcYnJpZWYgdGhlIGJhc2UgVVJMIG9mIHRoZSBmcmFtZSwgY2Fu
IGJlIHVzZWQgdG8gcmVzb2x2ZSByZWxhdGl2ZSBVUkxzCisgICAgXHNpbmNlIDQuNgorKi8KKwor
UVVybCBRV2ViRnJhbWU6OmJhc2VVcmwoKSBjb25zdAoreworICAgIHJldHVybiBkLT5iYXNlVXJs
KCk7Cit9CisKKy8qIQorICAgIFxwcm9wZXJ0eSBRV2ViRnJhbWU6Omljb24KKyAgICBcYnJpZWYg
dGhlIGljb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgZnJhbWUKKworICAgIFxzYSBpY29uQ2hhbmdl
ZCgpLCBRV2ViU2V0dGluZ3M6Omljb25Gb3JVcmwoKQorKi8KKworUUljb24gUVdlYkZyYW1lOjpp
Y29uKCkgY29uc3QKK3sKKyAgICByZXR1cm4gUVdlYlNldHRpbmdzOjppY29uRm9yVXJsKGQtPmNv
cmVGcmFtZVVybCgpKTsKK30KKworLyohCisgIFRoZSBuYW1lIG9mIHRoaXMgZnJhbWUgYXMgZGVm
aW5lZCBieSB0aGUgcGFyZW50IGZyYW1lLgorKi8KK1FTdHJpbmcgUVdlYkZyYW1lOjpmcmFtZU5h
bWUoKSBjb25zdAoreworICAgIHJldHVybiBkLT51bmlxdWVOYW1lKCk7Cit9CisKKy8qIQorICBU
aGUgd2ViIHBhZ2UgdGhhdCBjb250YWlucyB0aGlzIGZyYW1lLgorCisgIFxzYSBwYWdlQ2hhbmdl
ZCgpCisqLworUVdlYlBhZ2UgKlFXZWJGcmFtZTo6cGFnZSgpIGNvbnN0Cit7CisgICAgcmV0dXJu
IGQtPnBhZ2U7Cit9CisKKy8qIQorICBMb2FkcyBcYSB1cmwgaW50byB0aGlzIGZyYW1lLgorCisg
IFxub3RlIFRoZSB2aWV3IHJlbWFpbnMgdGhlIHNhbWUgdW50aWwgZW5vdWdoIGRhdGEgaGFzIGFy
cml2ZWQgdG8gZGlzcGxheSB0aGUgbmV3IFxhIHVybC4KKworICBcc2Egc2V0VXJsKCksIHNldEh0
bWwoKSwgc2V0Q29udGVudCgpCisqLwordm9pZCBRV2ViRnJhbWU6OmxvYWQoY29uc3QgUVVybCAm
dXJsKQoreworICAgIC8vIFRoZSBsb2FkKCkgb3ZlcmxvYWQgZW5zdXJlcyB0aGF0IHRoZSB1cmwg
aXMgYWJzb2x1dGUuCisgICAgbG9hZChRTmV0d29ya1JlcXVlc3QodXJsKSk7Cit9CisKKy8qIQor
ICBMb2FkcyBhIG5ldHdvcmsgcmVxdWVzdCwgXGEgcmVxLCBpbnRvIHRoaXMgZnJhbWUsIHVzaW5n
IHRoZSBtZXRob2Qgc3BlY2lmaWVkIGluIFxhCisgIG9wZXJhdGlvbi4KKworICBcYSBib2R5IGlz
IG9wdGlvbmFsIGFuZCBpcyBvbmx5IHVzZWQgZm9yIFBPU1Qgb3BlcmF0aW9ucy4KKworICBcbm90
ZSBUaGUgdmlldyByZW1haW5zIHRoZSBzYW1lIHVudGlsIGVub3VnaCBkYXRhIGhhcyBhcnJpdmVk
IHRvIGRpc3BsYXkgdGhlIG5ldyBjb250ZW50LgorCisgIFxzYSBzZXRVcmwoKQorKi8KK3ZvaWQg
UVdlYkZyYW1lOjpsb2FkKGNvbnN0IFFOZXR3b3JrUmVxdWVzdCAmcmVxLAorICAgICAgICAgICAg
ICAgICAgICAgUU5ldHdvcmtBY2Nlc3NNYW5hZ2VyOjpPcGVyYXRpb24gb3BlcmF0aW9uLAorICAg
ICAgICAgICAgICAgICAgICAgY29uc3QgUUJ5dGVBcnJheSAmYm9keSkKK3sKKyAgICBkLT5sb2Fk
KHJlcSwgb3BlcmF0aW9uLCBib2R5KTsKK30KKworLyohCisgIFNldHMgdGhlIGNvbnRlbnQgb2Yg
dGhpcyBmcmFtZSB0byBcYSBodG1sLiBcYSBiYXNlVXJsIGlzIG9wdGlvbmFsIGFuZCB1c2VkIHRv
IHJlc29sdmUgcmVsYXRpdmUKKyAgVVJMcyBpbiB0aGUgZG9jdW1lbnQsIHN1Y2ggYXMgcmVmZXJl
bmNlZCBpbWFnZXMgb3Igc3R5bGVzaGVldHMuCisKKyAgVGhlIFxhIGh0bWwgaXMgbG9hZGVkIGlt
bWVkaWF0ZWx5OyBleHRlcm5hbCBvYmplY3RzIGFyZSBsb2FkZWQgYXN5bmNocm9ub3VzbHkuCisK
KyAgSWYgYSBzY3JpcHQgaW4gdGhlIFxhIGh0bWwgcnVucyBsb25nZXIgdGhhbiB0aGUgZGVmYXVs
dCBzY3JpcHQgdGltZW91dCAoY3VycmVudGx5IDEwIHNlY29uZHMpLAorICBmb3IgZXhhbXBsZSBk
dWUgdG8gYmVpbmcgYmxvY2tlZCBieSBhIG1vZGFsIEphdmFTY3JpcHQgYWxlcnQgZGlhbG9nLCB0
aGlzIG1ldGhvZCB3aWxsIHJldHVybgorICBhcyBzb29uIGFzIHBvc3NpYmxlIGFmdGVyIHRoZSB0
aW1lb3V0IGFuZCBhbnkgc3Vic2VxdWVudCBcYSBodG1sIHdpbGwgYmUgbG9hZGVkIGFzeW5jaHJv
bm91c2x5LgorCisgIFdoZW4gdXNpbmcgdGhpcyBtZXRob2QgV2ViS2l0IGFzc3VtZXMgdGhhdCBl
eHRlcm5hbCByZXNvdXJjZXMgc3VjaCBhcyBKYXZhU2NyaXB0IHByb2dyYW1zIG9yIHN0eWxlCisg
IHNoZWV0cyBhcmUgZW5jb2RlZCBpbiBVVEYtOCB1bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZC4g
Rm9yIGV4YW1wbGUsIHRoZSBlbmNvZGluZyBvZiBhbiBleHRlcm5hbAorICBzY3JpcHQgY2FuIGJl
IHNwZWNpZmllZCB0aHJvdWdoIHRoZSBjaGFyc2V0IGF0dHJpYnV0ZSBvZiB0aGUgSFRNTCBzY3Jp
cHQgdGFnLiBJdCBpcyBhbHNvIHBvc3NpYmxlCisgIGZvciB0aGUgZW5jb2RpbmcgdG8gYmUgc3Bl
Y2lmaWVkIGJ5IHdlYiBzZXJ2ZXIuCisKKyAgVGhpcyBpcyBhIGNvbnZlbmllbmNlIGZ1bmN0aW9u
IGVxdWl2YWxlbnQgdG8gc2V0Q29udGVudChodG1sLCAidGV4dC9odG1sIiwgYmFzZVVybCkuCisK
KyAgXG5vdGUgVGhpcyBtZXRob2Qgd2lsbCBub3QgYWZmZWN0IHNlc3Npb24gb3IgZ2xvYmFsIGhp
c3RvcnkgZm9yIHRoZSBmcmFtZS4KKworICBcd2FybmluZyBUaGlzIGZ1bmN0aW9uIHdvcmtzIG9u
bHkgZm9yIEhUTUwsIGZvciBvdGhlciBtaW1lIHR5cGVzIChpLmUuIFhIVE1MLCBTVkcpCisgIHNl
dENvbnRlbnQoKSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgorCisgIFxzYSB0b0h0bWwoKSwgc2V0
Q29udGVudCgpLCBsb2FkKCkKKyovCit2b2lkIFFXZWJGcmFtZTo6c2V0SHRtbChjb25zdCBRU3Ry
aW5nICZodG1sLCBjb25zdCBRVXJsICZiYXNlVXJsKQoreworICAgIGQtPnNldEh0bWwoaHRtbCwg
YmFzZVVybCk7Cit9CisKKy8qIQorICBTZXRzIHRoZSBjb250ZW50IG9mIHRoaXMgZnJhbWUgdG8g
dGhlIHNwZWNpZmllZCBjb250ZW50IFxhIGRhdGEuIElmIHRoZSBcYSBtaW1lVHlwZSBhcmd1bWVu
dAorICBpcyBlbXB0eSBpdCBpcyBjdXJyZW50bHkgYXNzdW1lZCB0aGF0IHRoZSBjb250ZW50IGlz
IEhUTUwgYnV0IGluIGZ1dHVyZSB2ZXJzaW9ucyB3ZSBtYXkgaW50cm9kdWNlCisgIGF1dG8tZGV0
ZWN0aW9uLgorCisgIEV4dGVybmFsIG9iamVjdHMgcmVmZXJlbmNlZCBpbiB0aGUgY29udGVudCBh
cmUgbG9jYXRlZCByZWxhdGl2ZSB0byBcYSBiYXNlVXJsLgorCisgIFRoZSBcYSBkYXRhIGlzIGxv
YWRlZCBpbW1lZGlhdGVseTsgZXh0ZXJuYWwgb2JqZWN0cyBhcmUgbG9hZGVkIGFzeW5jaHJvbm91
c2x5LgorCisgIFxub3RlIFRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBzZXNzaW9uIG9yIGds
b2JhbCBoaXN0b3J5IGZvciB0aGUgZnJhbWUuCisKKyAgXHNhIHRvSHRtbCgpLCBzZXRIdG1sKCkK
KyovCit2b2lkIFFXZWJGcmFtZTo6c2V0Q29udGVudChjb25zdCBRQnl0ZUFycmF5ICZkYXRhLCBj
b25zdCBRU3RyaW5nICZtaW1lVHlwZSwgY29uc3QgUVVybCAmYmFzZVVybCkKK3sKKyAgICBkLT5z
ZXRDb250ZW50KGRhdGEsIG1pbWVUeXBlLCBiYXNlVXJsKTsKK30KKworLyohCisgIFJldHVybnMg
dGhlIHBhcmVudCBmcmFtZSBvZiB0aGlzIGZyYW1lLCBvciAwIGlmIHRoZSBmcmFtZSBpcyB0aGUg
d2ViIHBhZ2VzCisgIG1haW4gZnJhbWUuCisKKyAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHFvYmpl
Y3RfY2FzdDxRV2ViRnJhbWUqPihmcmFtZS0+cGFyZW50KCkpLgorCisgIFxzYSBjaGlsZEZyYW1l
cygpCisqLworUVdlYkZyYW1lICpRV2ViRnJhbWU6OnBhcmVudEZyYW1lKCkgY29uc3QKK3sKKyAg
ICByZXR1cm4gZC0+cGFyZW50RnJhbWUoKTsKK30KKworLyohCisgIFJldHVybnMgYSBsaXN0IG9m
IGFsbCBmcmFtZXMgdGhhdCBhcmUgZGlyZWN0IGNoaWxkcmVuIG9mIHRoaXMgZnJhbWUuCisKKyAg
XHNhIHBhcmVudEZyYW1lKCkKKyovCitRTGlzdDxRV2ViRnJhbWUqPiBRV2ViRnJhbWU6OmNoaWxk
RnJhbWVzKCkgY29uc3QKK3sKKyAgICBRTGlzdDxRT2JqZWN0Kj4gb2JqZWN0cyA9IGQtPmNoaWxk
RnJhbWVzKCk7CisgICAgUUxpc3Q8UVdlYkZyYW1lKj4gcmM7CisgICAgcmMucmVzZXJ2ZShvYmpl
Y3RzLnNpemUoKSk7CisgICAgUV9GT1JFQUNIKFFPYmplY3QqIG9iamVjdCwgb2JqZWN0cykgewor
ICAgICAgICBpZiAoUVdlYkZyYW1lKiBmcmFtZSA9IHFvYmplY3RfY2FzdDxRV2ViRnJhbWUqPihv
YmplY3QpKQorICAgICAgICAgICAgcmMuYXBwZW5kKGZyYW1lKTsKKyAgICB9CisKKyAgICByZXR1
cm4gcmM7Cit9CisKKy8qIQorICAgIFJldHVybnMgdGhlIHNjcm9sbGJhciBwb2xpY3kgZm9yIHRo
ZSBzY3JvbGxiYXIgZGVmaW5lZCBieSBcYSBvcmllbnRhdGlvbi4KKyovCitRdDo6U2Nyb2xsQmFy
UG9saWN5IFFXZWJGcmFtZTo6c2Nyb2xsQmFyUG9saWN5KFF0OjpPcmllbnRhdGlvbiBvcmllbnRh
dGlvbikgY29uc3QKK3sKKyAgICBpZiAob3JpZW50YXRpb24gPT0gUXQ6Okhvcml6b250YWwpCisg
ICAgICAgIHJldHVybiBkLT5ob3Jpem9udGFsU2Nyb2xsQmFyUG9saWN5OworICAgIHJldHVybiBk
LT52ZXJ0aWNhbFNjcm9sbEJhclBvbGljeTsKK30KKworLyohCisgICAgU2V0cyB0aGUgc2Nyb2xs
YmFyIHBvbGljeSBmb3IgdGhlIHNjcm9sbGJhciBkZWZpbmVkIGJ5IFxhIG9yaWVudGF0aW9uIHRv
IFxhIHBvbGljeS4KKyovCit2b2lkIFFXZWJGcmFtZTo6c2V0U2Nyb2xsQmFyUG9saWN5KFF0OjpP
cmllbnRhdGlvbiBvcmllbnRhdGlvbiwgUXQ6OlNjcm9sbEJhclBvbGljeSBwb2xpY3kpCit7Cisg
ICAgZC0+c2V0U2Nyb2xsQmFyUG9saWN5KG9yaWVudGF0aW9uLCBwb2xpY3kpOworfQorCisvKiEK
KyAgU2V0cyB0aGUgY3VycmVudCBcYSB2YWx1ZSBmb3IgdGhlIHNjcm9sbGJhciB3aXRoIG9yaWVu
dGF0aW9uIFxhIG9yaWVudGF0aW9uLgorCisgIFRoZSBzY3JvbGxiYXIgZm9yY2VzIHRoZSBcYSB2
YWx1ZSB0byBiZSB3aXRoaW4gdGhlIGxlZ2FsIHJhbmdlOiBtaW5pbXVtIDw9IHZhbHVlIDw9IG1h
eGltdW0uCisKKyAgQ2hhbmdpbmcgdGhlIHZhbHVlIGFsc28gdXBkYXRlcyB0aGUgdGh1bWIgcG9z
aXRpb24uCisKKyAgXHNhIHNjcm9sbEJhck1pbmltdW0oKSwgc2Nyb2xsQmFyTWF4aW11bSgpCisq
Lwordm9pZCBRV2ViRnJhbWU6OnNldFNjcm9sbEJhclZhbHVlKFF0OjpPcmllbnRhdGlvbiBvcmll
bnRhdGlvbiwgaW50IHZhbHVlKQoreworICAgIGQtPnNldFNjcm9sbEJhclZhbHVlKG9yaWVudGF0
aW9uLCB2YWx1ZSk7Cit9CisKKy8qIQorICBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIGZvciB0
aGUgc2Nyb2xsYmFyIHdpdGggb3JpZW50YXRpb24gXGEgb3JpZW50YXRpb24sIG9yIDAKKyAgaWYg
bm8gc2Nyb2xsYmFyIGlzIGZvdW5kIGZvciBcYSBvcmllbnRhdGlvbi4KKworICBcc2Egc2Nyb2xs
QmFyTWluaW11bSgpLCBzY3JvbGxCYXJNYXhpbXVtKCkKKyovCitpbnQgUVdlYkZyYW1lOjpzY3Jv
bGxCYXJWYWx1ZShRdDo6T3JpZW50YXRpb24gb3JpZW50YXRpb24pIGNvbnN0Cit7CisgICAgcmV0
dXJuIGQtPnNjcm9sbEJhclZhbHVlKG9yaWVudGF0aW9uKTsKK30KKworLyohCisgIFJldHVybnMg
dGhlIG1heGltdW0gdmFsdWUgZm9yIHRoZSBzY3JvbGxiYXIgd2l0aCBvcmllbnRhdGlvbiBcYSBv
cmllbnRhdGlvbiwgb3IgMAorICBpZiBubyBzY3JvbGxiYXIgaXMgZm91bmQgZm9yIFxhIG9yaWVu
dGF0aW9uLgorCisgIFxzYSBzY3JvbGxCYXJNaW5pbXVtKCkKKyovCitpbnQgUVdlYkZyYW1lOjpz
Y3JvbGxCYXJNYXhpbXVtKFF0OjpPcmllbnRhdGlvbiBvcmllbnRhdGlvbikgY29uc3QKK3sKKyAg
ICByZXR1cm4gZC0+c2Nyb2xsQmFyTWF4aW11bShvcmllbnRhdGlvbik7Cit9CisKKy8qIQorICBS
ZXR1cm5zIHRoZSBtaW5pbXVtIHZhbHVlIGZvciB0aGUgc2Nyb2xsYmFyIHdpdGggb3JpZW50YXRp
b24gXGEgb3JpZW50YXRpb24uCisKKyAgVGhlIG1pbmltdW0gdmFsdWUgaXMgYWx3YXlzIDAuCisK
KyAgXHNhIHNjcm9sbEJhck1heGltdW0oKQorKi8KK2ludCBRV2ViRnJhbWU6OnNjcm9sbEJhck1p
bmltdW0oUXQ6Ok9yaWVudGF0aW9uIG9yaWVudGF0aW9uKSBjb25zdAoreworICAgIFFfVU5VU0VE
KG9yaWVudGF0aW9uKTsKKyAgICByZXR1cm4gMDsKK30KKworLyohCisgIFxzaW5jZSA0LjYKKyAg
UmV0dXJucyB0aGUgZ2VvbWV0cnkgZm9yIHRoZSBzY3JvbGxiYXIgd2l0aCBvcmllbnRhdGlvbiBc
YSBvcmllbnRhdGlvbi4KKworICBJZiB0aGUgc2Nyb2xsYmFyIGRvZXMgbm90IGV4aXN0IGFuIGVt
cHR5IHJlY3QgaXMgcmV0dXJuZWQuCisqLworUVJlY3QgUVdlYkZyYW1lOjpzY3JvbGxCYXJHZW9t
ZXRyeShRdDo6T3JpZW50YXRpb24gb3JpZW50YXRpb24pIGNvbnN0Cit7CisgICAgcmV0dXJuIGQt
PnNjcm9sbEJhckdlb21ldHJ5KG9yaWVudGF0aW9uKTsKK30KKworLyohCisgIFxzaW5jZSA0LjUK
KyAgU2Nyb2xscyB0aGUgZnJhbWUgXGEgZHggcGl4ZWxzIHRvIHRoZSByaWdodCBhbmQgXGEgZHkg
cGl4ZWxzIGRvd253YXJkLiBCb3RoCisgIFxhIGR4IGFuZCBcYSBkeSBtYXkgYmUgbmVnYXRpdmUu
CisKKyAgXHNhIFFXZWJGcmFtZTo6c2Nyb2xsUG9zaXRpb24KKyovCisKK3ZvaWQgUVdlYkZyYW1l
OjpzY3JvbGwoaW50IGR4LCBpbnQgZHkpCit7CisgICAgZC0+c2Nyb2xsQnkoZHgsIGR5KTsKK30K
KworLyohCisgIFxwcm9wZXJ0eSBRV2ViRnJhbWU6OnNjcm9sbFBvc2l0aW9uCisgIFxzaW5jZSA0
LjUKKyAgXGJyaWVmIHRoZSBwb3NpdGlvbiB0aGUgZnJhbWUgaXMgY3VycmVudGx5IHNjcm9sbGVk
IHRvLgorKi8KKworUVBvaW50IFFXZWJGcmFtZTo6c2Nyb2xsUG9zaXRpb24oKSBjb25zdAorewor
ICAgIHJldHVybiBkLT5zY3JvbGxQb3NpdGlvbigpOworfQorCit2b2lkIFFXZWJGcmFtZTo6c2V0
U2Nyb2xsUG9zaXRpb24oY29uc3QgUVBvaW50ICZwb3MpCit7CisgICAgUVBvaW50IGN1cnJlbnQg
PSBzY3JvbGxQb3NpdGlvbigpOworICAgIGludCBkeCA9IHBvcy54KCkgLSBjdXJyZW50LngoKTsK
KyAgICBpbnQgZHkgPSBwb3MueSgpIC0gY3VycmVudC55KCk7CisgICAgc2Nyb2xsKGR4LCBkeSk7
Cit9CisKKy8qIQorICBcc2luY2UgNC43CisgIFNjcm9sbHMgdGhlIGZyYW1lIHRvIHRoZSBnaXZl
biBcYSBhbmNob3IgbmFtZS4KKyovCit2b2lkIFFXZWJGcmFtZTo6c2Nyb2xsVG9BbmNob3IoY29u
c3QgUVN0cmluZyYgYW5jaG9yKQoreworICAgIGQtPnNjcm9sbFRvQW5jaG9yKGFuY2hvcik7Cit9
CisKKy8qIQorICBcc2luY2UgNC42CisgIFJlbmRlciB0aGUgXGEgbGF5ZXIgb2YgdGhlIGZyYW1l
IHVzaW5nIFxhIHBhaW50ZXIgY2xpcHBpbmcgdG8gXGEgY2xpcC4KKworICBcc2EgcHJpbnQoKQor
Ki8KKwordm9pZCBRV2ViRnJhbWU6OnJlbmRlcihRUGFpbnRlciogcGFpbnRlciwgUmVuZGVyTGF5
ZXJzIGxheWVyLCBjb25zdCBRUmVnaW9uJiBjbGlwKQoreworICAgIGlmICghY2xpcC5pc0VtcHR5
KCkpCisgICAgICAgIGQtPnJlbmRlclJlbGF0aXZlQ29vcmRzKHBhaW50ZXIsIGxheWVyLCBjbGlw
KTsKKyAgICBlbHNlIGlmIChkLT5oYXNWaWV3KCkpCisgICAgICAgIGQtPnJlbmRlclJlbGF0aXZl
Q29vcmRzKHBhaW50ZXIsIGxheWVyLCBRUmVnaW9uKGQtPmZyYW1lUmVjdCgpKSk7Cit9CisKKy8q
IQorICBSZW5kZXIgdGhlIGZyYW1lIGludG8gXGEgcGFpbnRlciBjbGlwcGluZyB0byBcYSBjbGlw
LgorKi8KK3ZvaWQgUVdlYkZyYW1lOjpyZW5kZXIoUVBhaW50ZXIqIHBhaW50ZXIsIGNvbnN0IFFS
ZWdpb24mIGNsaXApCit7CisgICAgcmVuZGVyKHBhaW50ZXIsIEFsbExheWVycywgY2xpcCk7Cit9
CisKKy8qIQorICAgIFxwcm9wZXJ0eSBRV2ViRnJhbWU6OnRleHRTaXplTXVsdGlwbGllcgorICAg
IFxicmllZiB0aGUgc2NhbGluZyBmYWN0b3IgZm9yIGFsbCB0ZXh0IGluIHRoZSBmcmFtZQorICAg
IFxvYnNvbGV0ZQorCisgICAgVXNlIHNldFpvb21GYWN0b3IgaW5zdGVhZCwgaW4gY29tYmluYXRp
b24gd2l0aCB0aGUgWm9vbVRleHRPbmx5IGF0dHJpYnV0ZSBpbgorICAgIFFXZWJTZXR0aW5ncy4K
KworICAgIFxub3RlIFNldHRpbmcgdGhpcyBwcm9wZXJ0eSBhbHNvIGVuYWJsZXMgdGhlIFpvb21U
ZXh0T25seSBhdHRyaWJ1dGUgaW4KKyAgICBRV2ViU2V0dGluZ3MuCisqLworCisvKiEKKyAgICBT
ZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbXVsdGlwbGllciB1c2VkIHRvIHNjYWxlIHRoZSB0ZXh0IGlu
IGEgV2ViIGZyYW1lIHRvCisgICAgdGhlIFxhIGZhY3RvciBzcGVjaWZpZWQuCisqLwordm9pZCBR
V2ViRnJhbWU6OnNldFRleHRTaXplTXVsdGlwbGllcihxcmVhbCBmYWN0b3IpCit7CisgICAgZC0+
c2V0Wm9vbUZhY3RvcihmYWN0b3IpOworfQorCisvKiEKKyAgICBSZXR1cm5zIHRoZSB2YWx1ZSBv
ZiB0aGUgbXVsdGlwbGllciB1c2VkIHRvIHNjYWxlIHRoZSB0ZXh0IGluIGEgV2ViIGZyYW1lLgor
Ki8KK3FyZWFsIFFXZWJGcmFtZTo6dGV4dFNpemVNdWx0aXBsaWVyKCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gZC0+em9vbUZhY3RvcigpOworfQorCisvKiEKKyAgICBccHJvcGVydHkgUVdlYkZyYW1l
Ojp6b29tRmFjdG9yCisgICAgXHNpbmNlIDQuNQorICAgIFxicmllZiB0aGUgem9vbSBmYWN0b3Ig
Zm9yIHRoZSBmcmFtZQorKi8KKwordm9pZCBRV2ViRnJhbWU6OnNldFpvb21GYWN0b3IocXJlYWwg
ZmFjdG9yKQoreworICAgIGQtPnNldFpvb21GYWN0b3IoZmFjdG9yKTsKK30KKworcXJlYWwgUVdl
YkZyYW1lOjp6b29tRmFjdG9yKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZC0+em9vbUZhY3Rvcigp
OworfQorCisvKiEKKyAgICBccHJvcGVydHkgUVdlYkZyYW1lOjpmb2N1cworICAgIFxzaW5jZSA0
LjYKKworICAgIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGZyYW1lIGhhcyBrZXlib2FyZCBpbnB1dCBm
b2N1czsgb3RoZXJ3aXNlLCByZXR1cm5zIGZhbHNlLgorKi8KK2Jvb2wgUVdlYkZyYW1lOjpoYXNG
b2N1cygpIGNvbnN0Cit7CisgICAgcmV0dXJuIGQtPmhhc0ZvY3VzKCk7Cit9CisKKy8qIQorICAg
IFxzaW5jZSA0LjYKKworICAgIEdpdmVzIGtleWJvYXJkIGlucHV0IGZvY3VzIHRvIHRoaXMgZnJh
bWUuCisqLwordm9pZCBRV2ViRnJhbWU6OnNldEZvY3VzKCkKK3sKKyAgICBkLT5zZXRGb2N1cygp
OworfQorCisvKiEKKyAgICBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgZnJhbWUgcmVsYXRp
dmUgdG8gaXQncyBwYXJlbnQgZnJhbWUuCisqLworUVBvaW50IFFXZWJGcmFtZTo6cG9zKCkgY29u
c3QKK3sKKyAgICBpZiAoIWQtPmhhc1ZpZXcoKSkKKyAgICAgICAgcmV0dXJuIFFQb2ludCgpOwor
CisgICAgcmV0dXJuIGQtPmZyYW1lUmVjdCgpLnRvcExlZnQoKTsKK30KKworLyohCisgICAgUmV0
dXJuIHRoZSBnZW9tZXRyeSBvZiB0aGUgZnJhbWUgcmVsYXRpdmUgdG8gaXQncyBwYXJlbnQgZnJh
bWUuCisqLworUVJlY3QgUVdlYkZyYW1lOjpnZW9tZXRyeSgpIGNvbnN0Cit7CisgICAgcmV0dXJu
IGQtPmZyYW1lUmVjdCgpOworfQorCisvKiEKKyAgICBccHJvcGVydHkgUVdlYkZyYW1lOjpjb250
ZW50c1NpemUKKyAgICBcYnJpZWYgdGhlIHNpemUgb2YgdGhlIGNvbnRlbnRzIGluIHRoaXMgZnJh
bWUKKworICAgIFxzYSBjb250ZW50c1NpemVDaGFuZ2VkKCkKKyovCitRU2l6ZSBRV2ViRnJhbWU6
OmNvbnRlbnRzU2l6ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGQtPmNvbnRlbnRzU2l6ZSgpOwor
fQorCisvKiEKKyAgICBcc2luY2UgNC42CisKKyAgICBSZXR1cm5zIHRoZSBkb2N1bWVudCBlbGVt
ZW50IG9mIHRoaXMgZnJhbWUuCisKKyAgICBUaGUgZG9jdW1lbnQgZWxlbWVudCBwcm92aWRlcyBh
Y2Nlc3MgdG8gdGhlIGVudGlyZSBzdHJ1Y3R1cmVkCisgICAgY29udGVudCBvZiB0aGUgZnJhbWUu
CisqLworUVdlYkVsZW1lbnQgUVdlYkZyYW1lOjpkb2N1bWVudEVsZW1lbnQoKSBjb25zdAorewor
ICAgIHJldHVybiBkLT5kb2N1bWVudEVsZW1lbnQoKTsKK30KKworLyohCisgICAgXHNpbmNlIDQu
NgorICAgIFJldHVybnMgYSBuZXcgbGlzdCBvZiBlbGVtZW50cyBtYXRjaGluZyB0aGUgZ2l2ZW4g
Q1NTIHNlbGVjdG9yIFxhIHNlbGVjdG9yUXVlcnkuCisgICAgSWYgdGhlcmUgYXJlIG5vIG1hdGNo
aW5nIGVsZW1lbnRzLCBhbiBlbXB0eSBsaXN0IGlzIHJldHVybmVkLgorCisgICAgXGx7aHR0cDov
L3d3dy53My5vcmcvVFIvUkVDLUNTUzIvc2VsZWN0b3IuaHRtbCNxMX17U3RhbmRhcmQgQ1NTMiBz
ZWxlY3Rvcn0gc3ludGF4IGlzCisgICAgdXNlZCBmb3IgdGhlIHF1ZXJ5LgorCisgICAgXHNhIFFX
ZWJFbGVtZW50OjpmaW5kQWxsKCkKKyovCitRV2ViRWxlbWVudENvbGxlY3Rpb24gUVdlYkZyYW1l
OjpmaW5kQWxsRWxlbWVudHMoY29uc3QgUVN0cmluZyAmc2VsZWN0b3JRdWVyeSkgY29uc3QKK3sK
KyAgICByZXR1cm4gZG9jdW1lbnRFbGVtZW50KCkuZmluZEFsbChzZWxlY3RvclF1ZXJ5KTsKK30K
KworLyohCisgICAgXHNpbmNlIDQuNgorICAgIFJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgaW4g
dGhlIGZyYW1lJ3MgZG9jdW1lbnQgdGhhdCBtYXRjaGVzIHRoZQorICAgIGdpdmVuIENTUyBzZWxl
Y3RvciBcYSBzZWxlY3RvclF1ZXJ5LiBJZiB0aGVyZSBpcyBubyBtYXRjaGluZyBlbGVtZW50LCBh
CisgICAgbnVsbCBlbGVtZW50IGlzIHJldHVybmVkLgorCisgICAgXGx7aHR0cDovL3d3dy53My5v
cmcvVFIvUkVDLUNTUzIvc2VsZWN0b3IuaHRtbCNxMX17U3RhbmRhcmQgQ1NTMiBzZWxlY3Rvcn0g
c3ludGF4IGlzCisgICAgdXNlZCBmb3IgdGhlIHF1ZXJ5LgorCisgICAgXHNhIFFXZWJFbGVtZW50
OjpmaW5kRmlyc3QoKQorKi8KK1FXZWJFbGVtZW50IFFXZWJGcmFtZTo6ZmluZEZpcnN0RWxlbWVu
dChjb25zdCBRU3RyaW5nICZzZWxlY3RvclF1ZXJ5KSBjb25zdAoreworICAgIHJldHVybiBkb2N1
bWVudEVsZW1lbnQoKS5maW5kRmlyc3Qoc2VsZWN0b3JRdWVyeSk7Cit9CisKKy8qIQorICAgIFBl
cmZvcm1zIGEgaGl0IHRlc3Qgb24gdGhlIGZyYW1lIGNvbnRlbnRzIGF0IHRoZSBnaXZlbiBwb3Np
dGlvbiBcYSBwb3MgYW5kIHJldHVybnMgdGhlIGhpdCB0ZXN0IHJlc3VsdC4KKyovCitRV2ViSGl0
VGVzdFJlc3VsdCBRV2ViRnJhbWU6OmhpdFRlc3RDb250ZW50KGNvbnN0IFFQb2ludCAmcG9zKSBj
b25zdAoreworICAgIFFXZWJIaXRUZXN0UmVzdWx0UHJpdmF0ZSogcmVzdWx0ID0gZC0+aGl0VGVz
dENvbnRlbnQocG9zKTsKKworICAgIGlmICghcmVzdWx0KQorICAgICAgICByZXR1cm4gUVdlYkhp
dFRlc3RSZXN1bHQoKTsKKworICAgIHJldHVybiBRV2ViSGl0VGVzdFJlc3VsdChyZXN1bHQpOwor
fQorCisvKiEgXHJlaW1wCisqLworYm9vbCBRV2ViRnJhbWU6OmV2ZW50KFFFdmVudCAqZSkKK3sK
KyAgICByZXR1cm4gUU9iamVjdDo6ZXZlbnQoZSk7Cit9CisKKyNpZm5kZWYgUVRfTk9fUFJJTlRF
UgorLyohCisgICAgUHJpbnRzIHRoZSBmcmFtZSB0byB0aGUgZ2l2ZW4gXGEgcHJpbnRlci4KKwor
ICAgIFxzYSByZW5kZXIoKQorKi8KK3ZvaWQgUVdlYkZyYW1lOjpwcmludChRUHJpbnRlciAqcHJp
bnRlcikgY29uc3QKK3sKKyNpZiBIQVZFKFFUUFJJTlRTVVBQT1JUKQorICAgIFFQYWludGVyIHBh
aW50ZXI7CisgICAgaWYgKCFwYWludGVyLmJlZ2luKHByaW50ZXIpKQorICAgICAgICByZXR1cm47
CisKKyAgICBjb25zdCBxcmVhbCB6b29tRmFjdG9yWCA9IChxcmVhbClwcmludGVyLT5sb2dpY2Fs
RHBpWCgpIC8gcXRfZGVmYXVsdERwaSgpOworICAgIGNvbnN0IHFyZWFsIHpvb21GYWN0b3JZID0g
KHFyZWFsKXByaW50ZXItPmxvZ2ljYWxEcGlZKCkgLyBxdF9kZWZhdWx0RHBpKCk7CisKKyAgICBR
UmVjdCBxcHJpbnRlclJlY3QgPSBwcmludGVyLT5wYWdlUmVjdCgpOworCisgICAgUVJlY3QgcGFn
ZVJlY3QoMCwgMCwgaW50KHFwcmludGVyUmVjdC53aWR0aCgpIC8gem9vbUZhY3RvclgpLCBpbnQo
cXByaW50ZXJSZWN0LmhlaWdodCgpIC8gem9vbUZhY3RvclkpKTsKKworICAgIFF0UHJpbnRDb250
ZXh0IHByaW50Q29udGV4dCgmcGFpbnRlciwgcGFnZVJlY3QsIGQpOworCisgICAgaW50IGRvY0Nv
cGllczsKKyAgICBpbnQgcGFnZUNvcGllczsKKyAgICBpZiAocHJpbnRlci0+Y29sbGF0ZUNvcGll
cygpKSB7CisgICAgICAgIGRvY0NvcGllcyA9IDE7CisgICAgICAgIHBhZ2VDb3BpZXMgPSBwcmlu
dGVyLT5udW1Db3BpZXMoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkb2NDb3BpZXMgPSBwcmlu
dGVyLT5udW1Db3BpZXMoKTsKKyAgICAgICAgcGFnZUNvcGllcyA9IDE7CisgICAgfQorCisgICAg
aW50IGZyb21QYWdlID0gcHJpbnRlci0+ZnJvbVBhZ2UoKTsKKyAgICBpbnQgdG9QYWdlID0gcHJp
bnRlci0+dG9QYWdlKCk7CisgICAgYm9vbCBhc2NlbmRpbmcgPSB0cnVlOworCisgICAgaWYgKGZy
b21QYWdlID09IDAgJiYgdG9QYWdlID09IDApIHsKKyAgICAgICAgZnJvbVBhZ2UgPSAxOworICAg
ICAgICB0b1BhZ2UgPSBwcmludENvbnRleHQucGFnZUNvdW50KCk7CisgICAgfQorICAgIC8vIHBh
cmFub2lhIGNoZWNrCisgICAgZnJvbVBhZ2UgPSBxTWF4KDEsIGZyb21QYWdlKTsKKyAgICB0b1Bh
Z2UgPSBxTWluKHN0YXRpY19jYXN0PGludD4ocHJpbnRDb250ZXh0LnBhZ2VDb3VudCgpKSwgdG9Q
YWdlKTsKKyAgICBpZiAodG9QYWdlIDwgZnJvbVBhZ2UpIHsKKyAgICAgICAgLy8gaWYgdGhlIHVz
ZXIgZW50ZXJlZCBhIHBhZ2UgcmFuZ2Ugb3V0c2lkZSB0aGUgYWN0dWFsIG51bWJlcgorICAgICAg
ICAvLyBvZiBwcmludGFibGUgcGFnZXMsIGp1c3QgcmV0dXJuCisgICAgICAgIHJldHVybjsKKyAg
ICB9CisKKyAgICBpZiAocHJpbnRlci0+cGFnZU9yZGVyKCkgPT0gUVByaW50ZXI6Okxhc3RQYWdl
Rmlyc3QpIHsKKyAgICAgICAgaW50IHRtcCA9IGZyb21QYWdlOworICAgICAgICBmcm9tUGFnZSA9
IHRvUGFnZTsKKyAgICAgICAgdG9QYWdlID0gdG1wOworICAgICAgICBhc2NlbmRpbmcgPSBmYWxz
ZTsKKyAgICB9CisKKyAgICBwYWludGVyLnNjYWxlKHpvb21GYWN0b3JYLCB6b29tRmFjdG9yWSk7
CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGRvY0NvcGllczsgKytpKSB7CisgICAgICAgIGlu
dCBwYWdlID0gZnJvbVBhZ2U7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBm
b3IgKGludCBqID0gMDsgaiA8IHBhZ2VDb3BpZXM7ICsraikgeworICAgICAgICAgICAgICAgIGlm
IChwcmludGVyLT5wcmludGVyU3RhdGUoKSA9PSBRUHJpbnRlcjo6QWJvcnRlZAorICAgICAgICAg
ICAgICAgICAgICB8fCBwcmludGVyLT5wcmludGVyU3RhdGUoKSA9PSBRUHJpbnRlcjo6RXJyb3Ip
IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgICAgICBwcmludENvbnRleHQuc3Bvb2xQYWdlKHBhZ2UgLSAxLCBwYWdlUmVjdC53aWR0
aCgpKTsKKyAgICAgICAgICAgICAgICBpZiAoaiA8IHBhZ2VDb3BpZXMgLSAxKQorICAgICAgICAg
ICAgICAgICAgICBwcmludGVyLT5uZXdQYWdlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgIGlmIChwYWdlID09IHRvUGFnZSkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAg
ICAgICAgaWYgKGFzY2VuZGluZykKKyAgICAgICAgICAgICAgICArK3BhZ2U7CisgICAgICAgICAg
ICBlbHNlCisgICAgICAgICAgICAgICAgLS1wYWdlOworCisgICAgICAgICAgICBwcmludGVyLT5u
ZXdQYWdlKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIGkgPCBkb2NDb3BpZXMgLSAxKQor
ICAgICAgICAgICAgcHJpbnRlci0+bmV3UGFnZSgpOworICAgIH0KKyNlbmRpZiAvLyBIQVZFKFBS
SU5UU1VQUE9SVCkKK30KKyNlbmRpZiAvLyBRVF9OT19QUklOVEVSCisKKy8qIQorICAgIEV2YWx1
YXRlcyB0aGUgSmF2YVNjcmlwdCBkZWZpbmVkIGJ5IFxhIHNjcmlwdFNvdXJjZSB1c2luZyB0aGlz
IGZyYW1lIGFzIGNvbnRleHQKKyAgICBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0
IGV4ZWN1dGVkIHN0YXRlbWVudC4KKworICAgIFxzYSBhZGRUb0phdmFTY3JpcHRXaW5kb3dPYmpl
Y3QoKSwgamF2YVNjcmlwdFdpbmRvd09iamVjdENsZWFyZWQoKQorKi8KK1FWYXJpYW50IFFXZWJG
cmFtZTo6ZXZhbHVhdGVKYXZhU2NyaXB0KGNvbnN0IFFTdHJpbmcmIHNjcmlwdFNvdXJjZSkKK3sK
KyAgICByZXR1cm4gZC0+ZXZhbHVhdGVKYXZhU2NyaXB0KHNjcmlwdFNvdXJjZSk7Cit9CisKKy8q
IQorICAgIFxzaW5jZSA0LjUKKworICAgIFJldHVybnMgdGhlIGZyYW1lJ3Mgc2VjdXJpdHkgb3Jp
Z2luLgorKi8KK1FXZWJTZWN1cml0eU9yaWdpbiBRV2ViRnJhbWU6OnNlY3VyaXR5T3JpZ2luKCkg
Y29uc3QKK3sKKyAgICByZXR1cm4gZC0+c2VjdXJpdHlPcmlnaW4oKTsKK30KKworUVdlYkZyYW1l
ICpRV2ViRnJhbWVQcml2YXRlOjpraXQoY29uc3QgUVdlYkZyYW1lQWRhcHRlciogZnJhbWVBZGFw
dGVyKQoreworICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBRV2ViRnJhbWVQcml2YXRlKj4o
ZnJhbWVBZGFwdGVyKS0+cTsKK30KKworCisvKiEKKyAgICBcZm4gdm9pZCBRV2ViRnJhbWU6Omph
dmFTY3JpcHRXaW5kb3dPYmplY3RDbGVhcmVkKCkKKworICAgIFRoaXMgc2lnbmFsIGlzIGVtaXR0
ZWQgd2hlbmV2ZXIgdGhlIGdsb2JhbCB3aW5kb3cgb2JqZWN0IG9mIHRoZSBKYXZhU2NyaXB0Cisg
ICAgZW52aXJvbm1lbnQgaXMgY2xlYXJlZCwgZS5nLiwgYmVmb3JlIHN0YXJ0aW5nIGEgbmV3IGxv
YWQuCisKKyAgICBJZiB5b3UgaW50ZW5kIHRvIGFkZCBRT2JqZWN0cyB0byBhIFFXZWJGcmFtZSB1
c2luZworICAgIGFkZFRvSmF2YVNjcmlwdFdpbmRvd09iamVjdCgpLCB5b3Ugc2hvdWxkIGFkZCB0
aGVtIGluIGEgc2xvdCBjb25uZWN0ZWQKKyAgICB0byB0aGlzIHNpZ25hbC4gVGhpcyBlbnN1cmVz
IHRoYXQgeW91ciBvYmplY3RzIHJlbWFpbiBhY2Nlc3NpYmxlIHdoZW4KKyAgICBsb2FkaW5nIG5l
dyBVUkxzLgorKi8KKworLyohCisgICAgXGZuIHZvaWQgUVdlYkZyYW1lOjpwcm92aXNpb25hbExv
YWQoKQorICAgIFxpbnRlcm5hbAorKi8KKworLyohCisgICAgXGZuIHZvaWQgUVdlYkZyYW1lOjp0
aXRsZUNoYW5nZWQoY29uc3QgUVN0cmluZyAmdGl0bGUpCisKKyAgICBUaGlzIHNpZ25hbCBpcyBl
bWl0dGVkIHdoZW5ldmVyIHRoZSB0aXRsZSBvZiB0aGUgZnJhbWUgY2hhbmdlcy4KKyAgICBUaGUg
XGEgdGl0bGUgc3RyaW5nIHNwZWNpZmllcyB0aGUgbmV3IHRpdGxlLgorCisgICAgXHNhIHRpdGxl
KCkKKyovCisKKy8qIQorICAgIFxmbiB2b2lkIFFXZWJGcmFtZTo6dXJsQ2hhbmdlZChjb25zdCBR
VXJsICZ1cmwpCisKKyAgICBUaGlzIHNpZ25hbCBpcyBlbWl0dGVkIHdpdGggdGhlIFVSTCBvZiB0
aGUgZnJhbWUgd2hlbiB0aGUgZnJhbWUncyB0aXRsZSBpcworICAgIHJlY2VpdmVkLiBUaGUgbmV3
IFVSTCBpcyBzcGVjaWZpZWQgYnkgXGEgdXJsLgorCisgICAgXHNhIHVybCgpCisqLworCisvKiEK
KyAgICBcZm4gdm9pZCBRV2ViRnJhbWU6OmluaXRpYWxMYXlvdXRDb21wbGV0ZWQoKQorCisgICAg
VGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuIHRoZSBmcmFtZSBpcyBsYWlkIG91dCB0aGUgZmly
c3QgdGltZS4KKyAgICBUaGlzIGlzIHRoZSBmaXJzdCB0aW1lIHlvdSB3aWxsIHNlZSBjb250ZW50
cyBkaXNwbGF5ZWQgb24gdGhlIGZyYW1lLgorCisgICAgXG5vdGUgQSBmcmFtZSBjYW4gYmUgbGFp
ZCBvdXQgbXVsdGlwbGUgdGltZXMuCisqLworCisvKiEKKyAgXGZuIHZvaWQgUVdlYkZyYW1lOjpp
Y29uQ2hhbmdlZCgpCisKKyAgVGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuIHRoZSBpY29uICgi
ZmF2aWNvbiIpIGFzc29jaWF0ZWQgd2l0aCB0aGUgZnJhbWUKKyAgaGFzIGJlZW4gbG9hZGVkLgor
CisgIFxzYSBpY29uKCkKKyovCisKKy8qIQorICBcZm4gdm9pZCBRV2ViRnJhbWU6OmNvbnRlbnRz
U2l6ZUNoYW5nZWQoY29uc3QgUVNpemUgJnNpemUpCisgIFxzaW5jZSA0LjYKKworICBUaGlzIHNp
Z25hbCBpcyBlbWl0dGVkIHdoZW4gdGhlIGZyYW1lJ3MgY29udGVudHMgc2l6ZSBjaGFuZ2VzCisg
IHRvIFxhIHNpemUuCisKKyAgXHNhIGNvbnRlbnRzU2l6ZSgpCisqLworCisvKiEKKyAgICBcZm4g
dm9pZCBRV2ViRnJhbWU6OmxvYWRTdGFydGVkKCkKKyAgICBcc2luY2UgNC42CisKKyAgICBUaGlz
IHNpZ25hbCBpcyBlbWl0dGVkIHdoZW4gYSBuZXcgbG9hZCBvZiB0aGlzIGZyYW1lIGlzIHN0YXJ0
ZWQuCisKKyAgICBcc2EgbG9hZEZpbmlzaGVkKCkKKyovCisKKy8qIQorICAgIFxmbiB2b2lkIFFX
ZWJGcmFtZTo6bG9hZEZpbmlzaGVkKGJvb2wgb2spCisgICAgXHNpbmNlIDQuNgorCisgICAgVGhp
cyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuIGEgbG9hZCBvZiB0aGlzIGZyYW1lIGlzIGZpbmlzaGVk
LgorICAgIFxhIG9rIHdpbGwgaW5kaWNhdGUgd2hldGhlciB0aGUgbG9hZCB3YXMgc3VjY2Vzc2Z1
bCBvciBhbnkgZXJyb3Igb2NjdXJyZWQuCisKKyAgICBcc2EgbG9hZFN0YXJ0ZWQoKQorKi8KKwor
LyohCisgICAgXGZuIHZvaWQgUVdlYkZyYW1lOjpwYWdlQ2hhbmdlZCgpCisgICAgXHNpbmNlIDQu
NworCisgICAgVGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuIHRoaXMgZnJhbWUgaGFzIGJlZW4g
bW92ZWQgdG8gYSBkaWZmZXJlbnQgUVdlYlBhZ2UuCisKKyAgICBcc2EgcGFnZSgpCisqLworCisv
KiEKKyAgICBcY2xhc3MgUVdlYkhpdFRlc3RSZXN1bHQKKyAgICBcc2luY2UgNC40CisgICAgXGJy
aWVmIFRoZSBRV2ViSGl0VGVzdFJlc3VsdCBjbGFzcyBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91
dCB0aGUgd2ViCisgICAgcGFnZSBjb250ZW50IGFmdGVyIGEgaGl0IHRlc3QuCisKKyAgICBcaW5t
b2R1bGUgUXRXZWJLaXQKKworICAgIFFXZWJIaXRUZXN0UmVzdWx0IGlzIHJldHVybmVkIGJ5IFFX
ZWJGcmFtZTo6aGl0VGVzdENvbnRlbnQoKSB0byBwcm92aWRlCisgICAgaW5mb3JtYXRpb24gYWJv
dXQgdGhlIGNvbnRlbnQgb2YgdGhlIHdlYiBwYWdlIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24u
CisqLworCisvKiEKKyAgICBcaW50ZXJuYWwKKyovCitRV2ViSGl0VGVzdFJlc3VsdDo6UVdlYkhp
dFRlc3RSZXN1bHQoUVdlYkhpdFRlc3RSZXN1bHRQcml2YXRlICpwcml2KQorICAgIDogZChwcml2
KQoreworfQorCisvKiEKKyAgICBDb25zdHJ1Y3RzIGEgbnVsbCBoaXQgdGVzdCByZXN1bHQuCisq
LworUVdlYkhpdFRlc3RSZXN1bHQ6OlFXZWJIaXRUZXN0UmVzdWx0KCkKKyAgICA6IGQoMCkKK3sK
K30KKworLyohCisgICAgQ29uc3RydWN0cyBhIGhpdCB0ZXN0IHJlc3VsdCBmcm9tIFxhIG90aGVy
LgorKi8KK1FXZWJIaXRUZXN0UmVzdWx0OjpRV2ViSGl0VGVzdFJlc3VsdChjb25zdCBRV2ViSGl0
VGVzdFJlc3VsdCAmb3RoZXIpCisgICAgOiBkKDApCit7CisgICAgaWYgKG90aGVyLmQpCisgICAg
ICAgIGQgPSBuZXcgUVdlYkhpdFRlc3RSZXN1bHRQcml2YXRlKCpvdGhlci5kKTsKK30KKworLyoh
CisgICAgQXNzaWducyB0aGUgXGEgb3RoZXIgaGl0IHRlc3QgcmVzdWx0IHRvIHRoaXMuCisqLwor
UVdlYkhpdFRlc3RSZXN1bHQgJlFXZWJIaXRUZXN0UmVzdWx0OjpvcGVyYXRvcj0oY29uc3QgUVdl
YkhpdFRlc3RSZXN1bHQgJm90aGVyKQoreworICAgIGlmICh0aGlzICE9ICZvdGhlcikgeworICAg
ICAgICBpZiAob3RoZXIuZCkgeworICAgICAgICAgICAgaWYgKCFkKQorICAgICAgICAgICAgICAg
IGQgPSBuZXcgUVdlYkhpdFRlc3RSZXN1bHRQcml2YXRlOworICAgICAgICAgICAgKmQgPSAqb3Ro
ZXIuZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlbGV0ZSBkOworICAgICAgICAg
ICAgZCA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworfQorCisvKiEK
KyAgICBEZXN0cnVjdG9yLgorKi8KK1FXZWJIaXRUZXN0UmVzdWx0Ojp+UVdlYkhpdFRlc3RSZXN1
bHQoKQoreworICAgIGRlbGV0ZSBkOworfQorCisvKiEKKyAgICBSZXR1cm5zIHRydWUgaWYgdGhl
IGhpdCB0ZXN0IHJlc3VsdCBpcyBudWxsOyBvdGhlcndpc2UgcmV0dXJucyBmYWxzZS4KKyovCiti
b29sIFFXZWJIaXRUZXN0UmVzdWx0Ojppc051bGwoKSBjb25zdAoreworICAgIHJldHVybiAhZDsK
K30KKworLyohCisgICAgUmV0dXJucyB0aGUgcG9zaXRpb24gd2hlcmUgdGhlIGhpdCB0ZXN0IG9j
Y3VyZWQgaW4gdGhlIGNvb3JkaW5hdGVzIG9mIGZyYW1lIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnQg
aGl0LgorCisgICAgXHNhIGZyYW1lKCkKKyovCitRUG9pbnQgUVdlYkhpdFRlc3RSZXN1bHQ6OnBv
cygpIGNvbnN0Cit7CisgICAgaWYgKCFkKQorICAgICAgICByZXR1cm4gUVBvaW50KCk7CisgICAg
cmV0dXJuIGQtPnBvczsKK30KKworLyohCisgICAgXHNpbmNlIDQuNQorICAgIFJldHVybnMgdGhl
IGJvdW5kaW5nIHJlY3Qgb2YgdGhlIGVsZW1lbnQuCisqLworUVJlY3QgUVdlYkhpdFRlc3RSZXN1
bHQ6OmJvdW5kaW5nUmVjdCgpIGNvbnN0Cit7CisgICAgaWYgKCFkKQorICAgICAgICByZXR1cm4g
UVJlY3QoKTsKKyAgICByZXR1cm4gZC0+Ym91bmRpbmdSZWN0OworfQorCisvKiEKKyAgICBcc2lu
Y2UgNC42CisgICAgUmV0dXJucyB0aGUgYmxvY2sgZWxlbWVudCB0aGF0IGVuY2xvc2VzIHRoZSBl
bGVtZW50IGhpdC4KKworICAgIEEgYmxvY2sgZWxlbWVudCBpcyBhbiBlbGVtZW50IHRoYXQgaXMg
cmVuZGVyZWQgdXNpbmcgdGhlCisgICAgQ1NTICJibG9jayIgc3R5bGUuIFRoaXMgaW5jbHVkZXMg
Zm9yIGV4YW1wbGUgdGV4dAorICAgIHBhcmFncmFwaHMuCisqLworUVdlYkVsZW1lbnQgUVdlYkhp
dFRlc3RSZXN1bHQ6OmVuY2xvc2luZ0Jsb2NrRWxlbWVudCgpIGNvbnN0Cit7CisgICAgaWYgKCFk
KQorICAgICAgICByZXR1cm4gUVdlYkVsZW1lbnQoKTsKKyAgICByZXR1cm4gZC0+ZW5jbG9zaW5n
QmxvY2s7Cit9CisKKy8qIQorICAgIFJldHVybnMgdGhlIHRpdGxlIG9mIHRoZSBuZWFyZXN0IGVu
Y2xvc2luZyBIVE1MIGVsZW1lbnQuCisqLworUVN0cmluZyBRV2ViSGl0VGVzdFJlc3VsdDo6dGl0
bGUoKSBjb25zdAoreworICAgIGlmICghZCkKKyAgICAgICAgcmV0dXJuIFFTdHJpbmcoKTsKKyAg
ICByZXR1cm4gZC0+dGl0bGU7Cit9CisKKy8qIQorICAgIFJldHVybnMgdGhlIHRleHQgb2YgdGhl
IGxpbmsuCisqLworUVN0cmluZyBRV2ViSGl0VGVzdFJlc3VsdDo6bGlua1RleHQoKSBjb25zdAor
eworICAgIGlmICghZCkKKyAgICAgICAgcmV0dXJuIFFTdHJpbmcoKTsKKyAgICByZXR1cm4gZC0+
bGlua1RleHQ7Cit9CisKKy8qIQorICAgIFJldHVybnMgdGhlIHVybCB0byB3aGljaCB0aGUgbGlu
ayBwb2ludHMgdG8uCisqLworUVVybCBRV2ViSGl0VGVzdFJlc3VsdDo6bGlua1VybCgpIGNvbnN0
Cit7CisgICAgaWYgKCFkKQorICAgICAgICByZXR1cm4gUVVybCgpOworICAgIHJldHVybiBkLT5s
aW5rVXJsOworfQorCisvKiEKKyAgICBSZXR1cm5zIHRoZSB0aXRsZSBvZiB0aGUgbGluay4KKyov
CitRVXJsIFFXZWJIaXRUZXN0UmVzdWx0OjpsaW5rVGl0bGUoKSBjb25zdAoreworICAgIGlmICgh
ZCkKKyAgICAgICAgcmV0dXJuIFFVcmwoKTsKKyAgICByZXR1cm4gZC0+bGlua1RpdGxlOworfQor
CisvKiEKKyAgXHNpbmNlIDQuNgorICBSZXR1cm5zIHRoZSBlbGVtZW50IHRoYXQgcmVwcmVzZW50
cyB0aGUgbGluay4KKworICBcc2EgbGlua1RhcmdldEZyYW1lKCkKKyovCitRV2ViRWxlbWVudCBR
V2ViSGl0VGVzdFJlc3VsdDo6bGlua0VsZW1lbnQoKSBjb25zdAoreworICAgIGlmICghZCkKKyAg
ICAgICAgcmV0dXJuIFFXZWJFbGVtZW50KCk7CisgICAgcmV0dXJuIGQtPmxpbmtFbGVtZW50Owor
fQorCisvKiEKKyAgICBSZXR1cm5zIHRoZSBmcmFtZSB0aGF0IHdpbGwgbG9hZCB0aGUgbGluayBp
ZiBpdCBpcyBhY3RpdmF0ZWQuCisKKyAgICBcc2EgbGlua0VsZW1lbnQoKQorKi8KK1FXZWJGcmFt
ZSAqUVdlYkhpdFRlc3RSZXN1bHQ6OmxpbmtUYXJnZXRGcmFtZSgpIGNvbnN0Cit7CisgICAgaWYg
KCFkKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gcW9iamVjdF9jYXN0PFFXZWJGcmFt
ZSo+KGQtPmxpbmtUYXJnZXRGcmFtZS5kYXRhKCkpOworfQorCisvKiEKKyAgICBSZXR1cm5zIHRo
ZSBhbHRlcm5hdGUgdGV4dCBvZiB0aGUgZWxlbWVudC4gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUg
SFRNTCBhbHQgYXR0cmlidXRlLgorKi8KK1FTdHJpbmcgUVdlYkhpdFRlc3RSZXN1bHQ6OmFsdGVy
bmF0ZVRleHQoKSBjb25zdAoreworICAgIGlmICghZCkKKyAgICAgICAgcmV0dXJuIFFTdHJpbmco
KTsKKyAgICByZXR1cm4gZC0+YWx0ZXJuYXRlVGV4dDsKK30KKworLyohCisgICAgUmV0dXJucyB0
aGUgdXJsIG9mIHRoZSBpbWFnZS4KKyovCitRVXJsIFFXZWJIaXRUZXN0UmVzdWx0OjppbWFnZVVy
bCgpIGNvbnN0Cit7CisgICAgaWYgKCFkKQorICAgICAgICByZXR1cm4gUVVybCgpOworICAgIHJl
dHVybiBkLT5pbWFnZVVybDsKK30KKworLyohCisgICAgUmV0dXJucyBhIFFQaXhtYXAgY29udGFp
bmluZyB0aGUgaW1hZ2UuIEEgbnVsbCBwaXhtYXAgaXMgcmV0dXJuZWQgaWYgdGhlCisgICAgZWxl
bWVudCBiZWluZyB0ZXN0ZWQgaXMgbm90IGFuIGltYWdlLgorKi8KK1FQaXhtYXAgUVdlYkhpdFRl
c3RSZXN1bHQ6OnBpeG1hcCgpIGNvbnN0Cit7CisgICAgaWYgKCFkKQorICAgICAgICByZXR1cm4g
UVBpeG1hcCgpOworICAgIHJldHVybiBkLT5waXhtYXA7Cit9CisKKy8qIQorICAgIFJldHVybnMg
dHJ1ZSBpZiB0aGUgY29udGVudCBpcyBlZGl0YWJsZSBieSB0aGUgdXNlcjsgb3RoZXJ3aXNlIHJl
dHVybnMgZmFsc2UuCisqLworYm9vbCBRV2ViSGl0VGVzdFJlc3VsdDo6aXNDb250ZW50RWRpdGFi
bGUoKSBjb25zdAoreworICAgIGlmICghZCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJl
dHVybiBkLT5pc0NvbnRlbnRFZGl0YWJsZTsKK30KKworLyohCisgICAgUmV0dXJucyB0cnVlIGlm
IHRoZSBjb250ZW50IHRlc3RlZCBpcyBwYXJ0IG9mIHRoZSBzZWxlY3Rpb247IG90aGVyd2lzZSBy
ZXR1cm5zIGZhbHNlLgorKi8KK2Jvb2wgUVdlYkhpdFRlc3RSZXN1bHQ6OmlzQ29udGVudFNlbGVj
dGVkKCkgY29uc3QKK3sKKyAgICBpZiAoIWQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBy
ZXR1cm4gZC0+aXNDb250ZW50U2VsZWN0ZWQ7Cit9CisKKy8qIQorICAgIFxzaW5jZSA0LjYKKyAg
ICBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIERPTSBlbGVtZW50IGFzIFFXZWJFbGVtZW50LgorKi8K
K1FXZWJFbGVtZW50IFFXZWJIaXRUZXN0UmVzdWx0OjplbGVtZW50KCkgY29uc3QKK3sKKyAgICBp
ZiAoIWQpCisgICAgICAgIHJldHVybiBRV2ViRWxlbWVudCgpOworCisgICAgcmV0dXJuIGQtPmVs
ZW1lbnRGb3JJbm5lck5vZGUoKTsKK30KKworLyohCisgICAgUmV0dXJucyB0aGUgZnJhbWUgb2Yg
dGhlIGVsZW1lbnQgaGl0LgorKi8KK1FXZWJGcmFtZSAqUVdlYkhpdFRlc3RSZXN1bHQ6OmZyYW1l
KCkgY29uc3QKK3sKKyAgICBpZiAoIWQpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBx
b2JqZWN0X2Nhc3Q8UVdlYkZyYW1lKj4oZC0+ZnJhbWUuZGF0YSgpKTsKK30KKworLyohCisgKiBc
aW50ZXJuYWwKKyAqLworUVdlYkZyYW1lQWRhcHRlciAqUVdlYkZyYW1lOjpoYW5kbGUoKSBjb25z
dAoreworICAgIHJldHVybiBkOworfQorCisjaW5jbHVkZSAibW9jX3F3ZWJmcmFtZS5jcHAiCmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldEFwaS9xd2ViZnJhbWUuaCBiL1NvdXJj
ZS9XZWJLaXQvcXQvV2lkZ2V0QXBpL3F3ZWJmcmFtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjcwYjVkM2JhZDdm
M2UxMmI3MmI4MzA5MTIxY2M1MTM1MWUwYzQyMTIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2Uv
V2ViS2l0L3F0L1dpZGdldEFwaS9xd2ViZnJhbWUuaApAQCAtMCwwICsxLDI0NiBAQAorLyoKKyAg
ICBDb3B5cmlnaHQgKEMpIDIwMDgsMjAwOSBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1
YnNpZGlhcnkoLWllcykKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDcgU3RhaWtvcyBDb21wdXRpbmcg
U2VydmljZXMgSW5jLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBj
YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMg
b2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNo
ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAy
IG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgor
CisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2ls
bCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4g
dGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZl
IHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZQorICAgIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIu
ICBJZiBub3QsIHdyaXRlIHRvCisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5j
LiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAgICBCb3N0b24sIE1BIDAyMTEw
LTEzMDEsIFVTQS4KKyovCisKKyNpZm5kZWYgUVdFQkZSQU1FX0gKKyNkZWZpbmUgUVdFQkZSQU1F
X0gKKworI2luY2x1ZGUgPFF0Q29yZS9xb2JqZWN0Lmg+CisjaW5jbHVkZSA8UXRDb3JlL3F1cmwu
aD4KKyNpbmNsdWRlIDxRdENvcmUvcXZhcmlhbnQuaD4KKyNpbmNsdWRlIDxRdEd1aS9xaWNvbi5o
PgorI2luY2x1ZGUgPFF0TmV0d29yay9xbmV0d29ya2FjY2Vzc21hbmFnZXIuaD4KKyNpbmNsdWRl
ICJxd2Via2l0Z2xvYmFsLmgiCisKK1FUX0JFR0lOX05BTUVTUEFDRQorY2xhc3MgUVJlY3Q7Citj
bGFzcyBRUG9pbnQ7CitjbGFzcyBRUGFpbnRlcjsKK2NsYXNzIFFQaXhtYXA7CitjbGFzcyBRTW91
c2VFdmVudDsKK2NsYXNzIFFXaGVlbEV2ZW50OworY2xhc3MgUU5ldHdvcmtSZXF1ZXN0OworY2xh
c3MgUVJlZ2lvbjsKK2NsYXNzIFFQcmludGVyOworUVRfRU5EX05BTUVTUEFDRQorCitjbGFzcyBR
V2ViTmV0d29ya1JlcXVlc3Q7CitjbGFzcyBRV2ViRnJhbWVBZGFwdGVyOworY2xhc3MgUVdlYkZy
YW1lUHJpdmF0ZTsKK2NsYXNzIFFXZWJQYWdlOworY2xhc3MgUVdlYlBhZ2VBZGFwdGVyOworY2xh
c3MgUVdlYkhpdFRlc3RSZXN1bHQ7CitjbGFzcyBRV2ViSGlzdG9yeUl0ZW07CitjbGFzcyBRV2Vi
U2VjdXJpdHlPcmlnaW47CitjbGFzcyBRV2ViRWxlbWVudDsKK2NsYXNzIFFXZWJFbGVtZW50Q29s
bGVjdGlvbjsKK2NsYXNzIFFXZWJTY3JpcHRXb3JsZDsKKworY2xhc3MgRHVtcFJlbmRlclRyZWVT
dXBwb3J0UXQ7CituYW1lc3BhY2UgV2ViQ29yZSB7CisgICAgY2xhc3MgV2lkZ2V0UHJpdmF0ZTsK
KyAgICBjbGFzcyBGcmFtZUxvYWRlckNsaWVudFF0OworICAgIGNsYXNzIENocm9tZUNsaWVudFF0
OworICAgIGNsYXNzIFRleHR1cmVNYXBwZXJMYXllckNsaWVudFF0OworfQorY2xhc3MgUVdlYkZy
YW1lRGF0YTsKK2NsYXNzIFFXZWJIaXRUZXN0UmVzdWx0UHJpdmF0ZTsKK2NsYXNzIFFXZWJGcmFt
ZTsKKworY2xhc3MgUVdFQktJVF9FWFBPUlQgUVdlYkhpdFRlc3RSZXN1bHQgeworcHVibGljOgor
ICAgIFFXZWJIaXRUZXN0UmVzdWx0KCk7CisgICAgUVdlYkhpdFRlc3RSZXN1bHQoY29uc3QgUVdl
YkhpdFRlc3RSZXN1bHQgJm90aGVyKTsKKyAgICBRV2ViSGl0VGVzdFJlc3VsdCAmb3BlcmF0b3I9
KGNvbnN0IFFXZWJIaXRUZXN0UmVzdWx0ICZvdGhlcik7CisgICAgflFXZWJIaXRUZXN0UmVzdWx0
KCk7CisKKyAgICBib29sIGlzTnVsbCgpIGNvbnN0OworCisgICAgUVBvaW50IHBvcygpIGNvbnN0
OworICAgIFFSZWN0IGJvdW5kaW5nUmVjdCgpIGNvbnN0OworICAgIFFXZWJFbGVtZW50IGVuY2xv
c2luZ0Jsb2NrRWxlbWVudCgpIGNvbnN0OworICAgIFFTdHJpbmcgdGl0bGUoKSBjb25zdDsKKwor
ICAgIFFTdHJpbmcgbGlua1RleHQoKSBjb25zdDsKKyAgICBRVXJsIGxpbmtVcmwoKSBjb25zdDsK
KyAgICBRVXJsIGxpbmtUaXRsZSgpIGNvbnN0OworICAgIFFXZWJGcmFtZSAqbGlua1RhcmdldEZy
YW1lKCkgY29uc3Q7CisgICAgUVdlYkVsZW1lbnQgbGlua0VsZW1lbnQoKSBjb25zdDsKKworICAg
IFFTdHJpbmcgYWx0ZXJuYXRlVGV4dCgpIGNvbnN0OyAvLyBmb3IgaW1nLCBhcmVhLCBpbnB1dCBh
bmQgYXBwbGV0CisKKyAgICBRVXJsIGltYWdlVXJsKCkgY29uc3Q7CisgICAgUVBpeG1hcCBwaXht
YXAoKSBjb25zdDsKKworICAgIGJvb2wgaXNDb250ZW50RWRpdGFibGUoKSBjb25zdDsKKyAgICBi
b29sIGlzQ29udGVudFNlbGVjdGVkKCkgY29uc3Q7CisKKyAgICBRV2ViRWxlbWVudCBlbGVtZW50
KCkgY29uc3Q7CisKKyAgICBRV2ViRnJhbWUgKmZyYW1lKCkgY29uc3Q7CisKK3ByaXZhdGU6Cisg
ICAgUVdlYkhpdFRlc3RSZXN1bHQoUVdlYkhpdFRlc3RSZXN1bHRQcml2YXRlICpwcml2KTsKKyAg
ICBRV2ViSGl0VGVzdFJlc3VsdFByaXZhdGUgKmQ7CisKKyAgICBmcmllbmQgY2xhc3MgUVdlYkZy
YW1lOworICAgIGZyaWVuZCBjbGFzcyBRV2ViUGFnZVByaXZhdGU7CisgICAgZnJpZW5kIGNsYXNz
IFFXZWJQYWdlOworfTsKKworY2xhc3MgUVdFQktJVF9FWFBPUlQgUVdlYkZyYW1lIDogcHVibGlj
IFFPYmplY3QgeworICAgIFFfT0JKRUNUCisgICAgUV9QUk9QRVJUWShxcmVhbCB0ZXh0U2l6ZU11
bHRpcGxpZXIgUkVBRCB0ZXh0U2l6ZU11bHRpcGxpZXIgV1JJVEUgc2V0VGV4dFNpemVNdWx0aXBs
aWVyIERFU0lHTkFCTEUgZmFsc2UpCisgICAgUV9QUk9QRVJUWShxcmVhbCB6b29tRmFjdG9yIFJF
QUQgem9vbUZhY3RvciBXUklURSBzZXRab29tRmFjdG9yKQorICAgIFFfUFJPUEVSVFkoUVN0cmlu
ZyB0aXRsZSBSRUFEIHRpdGxlKQorICAgIFFfUFJPUEVSVFkoUVVybCB1cmwgUkVBRCB1cmwgV1JJ
VEUgc2V0VXJsKQorICAgIFFfUFJPUEVSVFkoUVVybCByZXF1ZXN0ZWRVcmwgUkVBRCByZXF1ZXN0
ZWRVcmwpCisgICAgUV9QUk9QRVJUWShRVXJsIGJhc2VVcmwgUkVBRCBiYXNlVXJsKQorICAgIFFf
UFJPUEVSVFkoUUljb24gaWNvbiBSRUFEIGljb24pCisgICAgUV9QUk9QRVJUWShRU2l6ZSBjb250
ZW50c1NpemUgUkVBRCBjb250ZW50c1NpemUpCisgICAgUV9QUk9QRVJUWShRUG9pbnQgc2Nyb2xs
UG9zaXRpb24gUkVBRCBzY3JvbGxQb3NpdGlvbiBXUklURSBzZXRTY3JvbGxQb3NpdGlvbikKKyAg
ICBRX1BST1BFUlRZKGJvb2wgZm9jdXMgUkVBRCBoYXNGb2N1cykKK3ByaXZhdGU6CisgICAgUVdl
YkZyYW1lKFFXZWJQYWdlICpwYXJlbnRQYWdlKTsKKyAgICBRV2ViRnJhbWUoUVdlYkZyYW1lKiBw
YXJlbnQsIFFXZWJGcmFtZURhdGEqKTsKKyAgICB+UVdlYkZyYW1lKCk7CisKK3B1YmxpYzoKKyAg
ICBlbnVtIFZhbHVlT3duZXJzaGlwIHsKKyAgICAgICAgUXRPd25lcnNoaXAsCisgICAgICAgIFNj
cmlwdE93bmVyc2hpcCwKKyAgICAgICAgQXV0b093bmVyc2hpcAorICAgIH07CisKKyAgICBRV2Vi
UGFnZSAqcGFnZSgpIGNvbnN0OworCisgICAgdm9pZCBsb2FkKGNvbnN0IFFVcmwgJnVybCk7Cisg
ICAgdm9pZCBsb2FkKGNvbnN0IFFOZXR3b3JrUmVxdWVzdCAmcmVxdWVzdCwgUU5ldHdvcmtBY2Nl
c3NNYW5hZ2VyOjpPcGVyYXRpb24gb3BlcmF0aW9uID0gUU5ldHdvcmtBY2Nlc3NNYW5hZ2VyOjpH
ZXRPcGVyYXRpb24sIGNvbnN0IFFCeXRlQXJyYXkgJmJvZHkgPSBRQnl0ZUFycmF5KCkpOworICAg
IHZvaWQgc2V0SHRtbChjb25zdCBRU3RyaW5nICZodG1sLCBjb25zdCBRVXJsICZiYXNlVXJsID0g
UVVybCgpKTsKKyAgICB2b2lkIHNldENvbnRlbnQoY29uc3QgUUJ5dGVBcnJheSAmZGF0YSwgY29u
c3QgUVN0cmluZyAmbWltZVR5cGUgPSBRU3RyaW5nKCksIGNvbnN0IFFVcmwgJmJhc2VVcmwgPSBR
VXJsKCkpOworCisgICAgdm9pZCBhZGRUb0phdmFTY3JpcHRXaW5kb3dPYmplY3QoY29uc3QgUVN0
cmluZyAmbmFtZSwgUU9iamVjdCAqb2JqZWN0LCBWYWx1ZU93bmVyc2hpcCBvd25lcnNoaXAgPSBR
dE93bmVyc2hpcCk7CisgICAgUVN0cmluZyB0b0h0bWwoKSBjb25zdDsKKyAgICBRU3RyaW5nIHRv
UGxhaW5UZXh0KCkgY29uc3Q7CisKKyAgICBRU3RyaW5nIHRpdGxlKCkgY29uc3Q7CisgICAgdm9p
ZCBzZXRVcmwoY29uc3QgUVVybCAmdXJsKTsKKyAgICBRVXJsIHVybCgpIGNvbnN0OworICAgIFFV
cmwgcmVxdWVzdGVkVXJsKCkgY29uc3Q7CisgICAgUVVybCBiYXNlVXJsKCkgY29uc3Q7CisgICAg
UUljb24gaWNvbigpIGNvbnN0OworICAgIFFNdWx0aU1hcDxRU3RyaW5nLCBRU3RyaW5nPiBtZXRh
RGF0YSgpIGNvbnN0OworCisgICAgUVN0cmluZyBmcmFtZU5hbWUoKSBjb25zdDsKKworICAgIFFX
ZWJGcmFtZSAqcGFyZW50RnJhbWUoKSBjb25zdDsKKyAgICBRTGlzdDxRV2ViRnJhbWUqPiBjaGls
ZEZyYW1lcygpIGNvbnN0OworCisgICAgUXQ6OlNjcm9sbEJhclBvbGljeSBzY3JvbGxCYXJQb2xp
Y3koUXQ6Ok9yaWVudGF0aW9uIG9yaWVudGF0aW9uKSBjb25zdDsKKyAgICB2b2lkIHNldFNjcm9s
bEJhclBvbGljeShRdDo6T3JpZW50YXRpb24gb3JpZW50YXRpb24sIFF0OjpTY3JvbGxCYXJQb2xp
Y3kgcG9saWN5KTsKKworICAgIHZvaWQgc2V0U2Nyb2xsQmFyVmFsdWUoUXQ6Ok9yaWVudGF0aW9u
IG9yaWVudGF0aW9uLCBpbnQgdmFsdWUpOworICAgIGludCBzY3JvbGxCYXJWYWx1ZShRdDo6T3Jp
ZW50YXRpb24gb3JpZW50YXRpb24pIGNvbnN0OworICAgIGludCBzY3JvbGxCYXJNaW5pbXVtKFF0
OjpPcmllbnRhdGlvbiBvcmllbnRhdGlvbikgY29uc3Q7CisgICAgaW50IHNjcm9sbEJhck1heGlt
dW0oUXQ6Ok9yaWVudGF0aW9uIG9yaWVudGF0aW9uKSBjb25zdDsKKyAgICBRUmVjdCBzY3JvbGxC
YXJHZW9tZXRyeShRdDo6T3JpZW50YXRpb24gb3JpZW50YXRpb24pIGNvbnN0OworCisgICAgdm9p
ZCBzY3JvbGwoaW50LCBpbnQpOworICAgIFFQb2ludCBzY3JvbGxQb3NpdGlvbigpIGNvbnN0Owor
ICAgIHZvaWQgc2V0U2Nyb2xsUG9zaXRpb24oY29uc3QgUVBvaW50ICZwb3MpOworCisgICAgdm9p
ZCBzY3JvbGxUb0FuY2hvcihjb25zdCBRU3RyaW5nJiBhbmNob3IpOworCisgICAgZW51bSBSZW5k
ZXJMYXllciB7CisgICAgICAgIENvbnRlbnRzTGF5ZXIgPSAweDEwLAorICAgICAgICBTY3JvbGxC
YXJMYXllciA9IDB4MjAsCisgICAgICAgIFBhbkljb25MYXllciA9IDB4NDAsCisKKyAgICAgICAg
QWxsTGF5ZXJzID0gMHhmZgorICAgIH07CisgICAgUV9ERUNMQVJFX0ZMQUdTKFJlbmRlckxheWVy
cywgUmVuZGVyTGF5ZXIpCisKKyAgICB2b2lkIHJlbmRlcihRUGFpbnRlciosIGNvbnN0IFFSZWdp
b24mIGNsaXAgPSBRUmVnaW9uKCkpOworICAgIHZvaWQgcmVuZGVyKFFQYWludGVyKiwgUmVuZGVy
TGF5ZXJzIGxheWVyLCBjb25zdCBRUmVnaW9uJiBjbGlwID0gUVJlZ2lvbigpKTsKKworICAgIHZv
aWQgc2V0VGV4dFNpemVNdWx0aXBsaWVyKHFyZWFsIGZhY3Rvcik7CisgICAgcXJlYWwgdGV4dFNp
emVNdWx0aXBsaWVyKCkgY29uc3Q7CisKKyAgICBxcmVhbCB6b29tRmFjdG9yKCkgY29uc3Q7Cisg
ICAgdm9pZCBzZXRab29tRmFjdG9yKHFyZWFsIGZhY3Rvcik7CisKKyAgICBib29sIGhhc0ZvY3Vz
KCkgY29uc3Q7CisgICAgdm9pZCBzZXRGb2N1cygpOworCisgICAgUVBvaW50IHBvcygpIGNvbnN0
OworICAgIFFSZWN0IGdlb21ldHJ5KCkgY29uc3Q7CisgICAgUVNpemUgY29udGVudHNTaXplKCkg
Y29uc3Q7CisKKyAgICBRV2ViRWxlbWVudCBkb2N1bWVudEVsZW1lbnQoKSBjb25zdDsKKyAgICBR
V2ViRWxlbWVudENvbGxlY3Rpb24gZmluZEFsbEVsZW1lbnRzKGNvbnN0IFFTdHJpbmcgJnNlbGVj
dG9yUXVlcnkpIGNvbnN0OworICAgIFFXZWJFbGVtZW50IGZpbmRGaXJzdEVsZW1lbnQoY29uc3Qg
UVN0cmluZyAmc2VsZWN0b3JRdWVyeSkgY29uc3Q7CisKKyAgICBRV2ViSGl0VGVzdFJlc3VsdCBo
aXRUZXN0Q29udGVudChjb25zdCBRUG9pbnQgJnBvcykgY29uc3Q7CisKKyAgICB2aXJ0dWFsIGJv
b2wgZXZlbnQoUUV2ZW50ICopOworCisgICAgUVdlYlNlY3VyaXR5T3JpZ2luIHNlY3VyaXR5T3Jp
Z2luKCkgY29uc3Q7CisgICAgUVdlYkZyYW1lQWRhcHRlciogaGFuZGxlKCkgY29uc3Q7CisKK3B1
YmxpYyBRX1NMT1RTOgorICAgIFFWYXJpYW50IGV2YWx1YXRlSmF2YVNjcmlwdChjb25zdCBRU3Ry
aW5nJiBzY3JpcHRTb3VyY2UpOworI2lmbmRlZiBRVF9OT19QUklOVEVSCisgICAgdm9pZCBwcmlu
dChRUHJpbnRlciAqcHJpbnRlcikgY29uc3Q7CisjZW5kaWYKKworUV9TSUdOQUxTOgorICAgIHZv
aWQgamF2YVNjcmlwdFdpbmRvd09iamVjdENsZWFyZWQoKTsKKworICAgIHZvaWQgcHJvdmlzaW9u
YWxMb2FkKCk7CisgICAgdm9pZCB0aXRsZUNoYW5nZWQoY29uc3QgUVN0cmluZyAmdGl0bGUpOwor
ICAgIHZvaWQgdXJsQ2hhbmdlZChjb25zdCBRVXJsICZ1cmwpOworCisgICAgdm9pZCBpbml0aWFs
TGF5b3V0Q29tcGxldGVkKCk7CisKKyAgICB2b2lkIGljb25DaGFuZ2VkKCk7CisKKyAgICB2b2lk
IGNvbnRlbnRzU2l6ZUNoYW5nZWQoY29uc3QgUVNpemUgJnNpemUpOworCisgICAgdm9pZCBsb2Fk
U3RhcnRlZCgpOworICAgIHZvaWQgbG9hZEZpbmlzaGVkKGJvb2wgb2spOworCisgICAgdm9pZCBw
YWdlQ2hhbmdlZCgpOworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBRR3JhcGhpY3NXZWJW
aWV3OworICAgIGZyaWVuZCBjbGFzcyBRV2ViUGFnZTsKKyAgICBmcmllbmQgY2xhc3MgUVdlYlBh
Z2VQcml2YXRlOworICAgIGZyaWVuZCBjbGFzcyBRV2ViRnJhbWVQcml2YXRlOworICAgIGZyaWVu
ZCBjbGFzcyBEdW1wUmVuZGVyVHJlZVN1cHBvcnRRdDsKKyAgICBmcmllbmQgY2xhc3MgV2ViQ29y
ZTo6V2lkZ2V0UHJpdmF0ZTsKKyAgICBmcmllbmQgY2xhc3MgV2ViQ29yZTo6RnJhbWVMb2FkZXJD
bGllbnRRdDsKKyAgICBmcmllbmQgY2xhc3MgV2ViQ29yZTo6Q2hyb21lQ2xpZW50UXQ7CisgICAg
ZnJpZW5kIGNsYXNzIFdlYkNvcmU6OlRleHR1cmVNYXBwZXJMYXllckNsaWVudFF0OworICAgIFFX
ZWJGcmFtZVByaXZhdGUgKmQ7CisgICAgUV9QUklWQVRFX1NMT1QoZCwgdm9pZCBfcV9vcmllbnRh
dGlvbkNoYW5nZWQoKSkKK307CisKK1FfREVDTEFSRV9PUEVSQVRPUlNfRk9SX0ZMQUdTKFFXZWJG
cmFtZTo6UmVuZGVyTGF5ZXJzKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQv
cXQvV2lkZ2V0QXBpL3F3ZWJmcmFtZV9wLmggYi9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldEFwaS9x
d2ViZnJhbWVfcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjU2Y2MyMzEyMDkyMjA4OTQ5MGIzN2E0MTI3NWVkMjZj
OTUwZmM0YjIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldEFwaS9x
d2ViZnJhbWVfcC5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgICAgQ29weXJpZ2h0IChDKSAyMDA4
IE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQorICAgIENvcHly
aWdodCAoQykgMjAwNyBTdGFpa29zIENvbXB1dGluZyBTZXJ2aWNlcyBJbmMuCisKKyAgICBUaGlz
IGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y
CisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBG
b3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5
b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlz
dHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lU
SE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgor
ICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4g
IFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3Jl
IGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBH
TlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIGxp
YnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAgICB0
aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZp
ZnRoIEZsb29yLAorICAgIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorKi8KKworI2lmbmRl
ZiBRV0VCRlJBTUVfUF9ICisjZGVmaW5lIFFXRUJGUkFNRV9QX0gKKworI2luY2x1ZGUgIlFXZWJG
cmFtZUFkYXB0ZXIuaCIKKworI2luY2x1ZGUgInF3ZWJmcmFtZS5oIgorI2luY2x1ZGUgInF3ZWJw
YWdlX3AuaCIKKworCituYW1lc3BhY2UgV2ViQ29yZSB7CisgICAgY2xhc3MgRnJhbWVMb2FkZXJD
bGllbnRRdDsKKyAgICBjbGFzcyBGcmFtZVZpZXc7CisgICAgY2xhc3MgSFRNTEZyYW1lT3duZXJF
bGVtZW50OworICAgIGNsYXNzIFNjcm9sbGJhcjsKKyAgICBjbGFzcyBUZXh0dXJlTWFwcGVyTGF5
ZXI7Cit9CitjbGFzcyBRV2ViUGFnZTsKKworY2xhc3MgUVdlYkZyYW1lUHJpdmF0ZSA6IHB1Ymxp
YyBRV2ViRnJhbWVBZGFwdGVyIHsKK3B1YmxpYzoKKyAgICBRV2ViRnJhbWVQcml2YXRlKCkKKyAg
ICAgICAgOiBxKDApCisgICAgICAgICwgcGFnZSgwKQorICAgICAgICB7fQorICAgIHZvaWQgc2V0
UGFnZShRV2ViUGFnZSopOworCisgICAgaW5saW5lIFFXZWJGcmFtZSAqcGFyZW50RnJhbWUoKSB7
IHJldHVybiBxb2JqZWN0X2Nhc3Q8UVdlYkZyYW1lKj4ocS0+cGFyZW50KCkpOyB9CisKKyAgICBz
dGF0aWMgUVdlYkZyYW1lKiBraXQoY29uc3QgUVdlYkZyYW1lQWRhcHRlciopOworCisgICAgLy8g
QWRhcHRlciBpbXBsZW1lbnRhdGlvbgorICAgIHZpcnR1YWwgUVdlYkZyYW1lKiBhcGlIYW5kbGUo
KSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIFFPYmplY3QqIGhhbmRsZSgpIE9WRVJSSURFOworICAg
IHZpcnR1YWwgdm9pZCBjb250ZW50c1NpemVEaWRDaGFuZ2UoY29uc3QgUVNpemUgJikgT1ZFUlJJ
REU7CisgICAgdmlydHVhbCBpbnQgc2Nyb2xsQmFyUG9saWN5KFF0OjpPcmllbnRhdGlvbikgY29u
c3QgT1ZFUlJJREU7CisgICAgdmlydHVhbCB2b2lkIGVtaXRVcmxDaGFuZ2VkKCkgT1ZFUlJJREU7
CisgICAgdmlydHVhbCB2b2lkIGRpZFN0YXJ0UHJvdmlzaW9uYWxMb2FkKCkgT1ZFUlJJREU7Cisg
ICAgdmlydHVhbCB2b2lkIGRpZENsZWFyV2luZG93T2JqZWN0KCkgT1ZFUlJJREU7CisgICAgdmly
dHVhbCBib29sIGhhbmRsZVByb2dyZXNzRmluaXNoZWQoUVBvaW50KikgT1ZFUlJJREU7CisgICAg
dmlydHVhbCB2b2lkIGVtaXRJbml0aWFsTGF5b3V0Q29tcGxldGVkKCkgT1ZFUlJJREU7CisgICAg
dmlydHVhbCB2b2lkIGVtaXRJY29uQ2hhbmdlZCgpIE9WRVJSSURFOworICAgIHZpcnR1YWwgdm9p
ZCBlbWl0TG9hZFN0YXJ0ZWQoYm9vbCBvcmlnaW5hdGluZ0xvYWQpIE9WRVJSSURFOworICAgIHZp
cnR1YWwgdm9pZCBlbWl0TG9hZEZpbmlzaGVkKGJvb2wgb3JpZ2luYXRpbmdMb2FkLCBib29sIG9r
KSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIFFXZWJGcmFtZUFkYXB0ZXIqIGNyZWF0ZUNoaWxkRnJh
bWUoUVdlYkZyYW1lRGF0YSopIE9WRVJSSURFOworCisgICAgUVdlYkZyYW1lICpxOworICAgIFFX
ZWJQYWdlICpwYWdlOworCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQv
cXQvV2lkZ2V0QXBpL3F3ZWJpbnNwZWN0b3IuY3BwIGIvU291cmNlL1dlYktpdC9xdC9XaWRnZXRB
cGkvcXdlYmluc3BlY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uOWFlNjlkYWNmMjU4ODBjNzRkMjQ5YjQz
YmExYmMyYWFkNjE1Y2VlMQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvcXQvV2lk
Z2V0QXBpL3F3ZWJpbnNwZWN0b3IuY3BwCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICAgIENvcHly
aWdodCAoQykgMjAwOSBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWll
cykKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJp
YnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg
TGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBG
cmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGlj
ZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMg
bGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVs
LAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVk
IHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExp
Y2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBh
IGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9u
ZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3
cml0ZSB0bworICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5r
bGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgICAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0Eu
CisqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAicXdlYmluc3BlY3Rvci5oIgor
CisjaW5jbHVkZSAicXdlYmVsZW1lbnQuaCIKKyNpbmNsdWRlICJxd2ViaW5zcGVjdG9yX3AuaCIK
KyNpbmNsdWRlICJxd2VicGFnZV9wLmgiCisKKyNpbmNsdWRlIDxRUmVzaXplRXZlbnQ+CisKKy8q
IQorICAgIFxjbGFzcyBRV2ViSW5zcGVjdG9yCisgICAgXHNpbmNlIDQuNgorICAgIFxpbm1vZHVs
ZSBRdFdlYktpdAorICAgIFxicmllZiBUaGUgUVdlYkluc3BlY3RvciBjbGFzcyBhbGxvd3MgdGhl
IHBsYWNlbWVudCBhbmQgY29udHJvbCBvZiBhCisgICAgUVdlYlBhZ2UncyBpbnNwZWN0b3IuCisg
ICAgVGhlIGluc3BlY3RvciBjYW4gZGlzcGxheSBhIHBhZ2UncyBoaWVyYXJjaHksIGl0cyBsb2Fk
aW5nIHN0YXRpc3RpY3MgYW5kCisgICAgdGhlIGN1cnJlbnQgc3RhdGUgb2YgaXRzIGluZGl2aWR1
YWwgZWxlbWVudHMuIEl0IGlzIG1vc3RseSB1c2VkIGJ5IHdlYgorICAgIGRldmVsb3BlcnMuCisK
KyAgICBUaGUgUVdlYlBhZ2UgdG8gYmUgaW5zcGVjdGVkIG11c3QgYmUgc3BlY2lmaWVkIHVzaW5n
IHRoZSBzZXRQYWdlKCkgbWV0aG9kLgorCisgICAgQSB0eXBpY2FsIHVzZSBvZiBRV2ViSW5zcGVj
dG9yIGZvbGxvd3M6CisKKyAgICBcc25pcHBldCB3ZWJraXRzbmlwcGV0cy9xdHdlYmtpdF9xd2Vi
aW5zcGVjdG9yX3NuaXBwZXQuY3BwIDAKKworICAgIEEgUVdlYkluc3BlY3RvciBjYW4gYmUgbWFk
ZSB2aXNpYmxlIGVpdGhlciBwcm9ncmFtbWF0aWNhbGx5IHVzaW5nCisgICAgc2V0VmlzaWJsZSgp
LCBvciBieSB0aGUgdXNlciB0aHJvdWdoIHRoZSBhdHRhY2hlZCBRV2ViUGFnZSdzIGNvbnRleHQK
KyAgICBtZW51LgorCisgICAgXG5vdGUgQSBRV2ViSW5zcGVjdG9yIHdpbGwgZGlzcGxheSBhIGJs
YW5rIHdpZGdldCBpZiBlaXRoZXI6CisgICAgXGxpc3QKKyAgICAgICAgXGxpIHBhZ2UoKSBpcyBu
dWxsCisgICAgICAgIFxsaSBRV2ViU2V0dGluZ3M6OkRldmVsb3BlckV4dHJhc0VuYWJsZWQgaXMg
ZmFsc2UKKyAgICBcZW5kbGlzdAorCisgICAgXHNlY3Rpb24xIFJlc291cmNlcworCisgICAgVGhp
cyBjbGFzcyBhY3RzIG1vc3RseSBhcyBhIGNvbnRhaW5lciBhbmQgYSBjb250cm9sbGVyIGZvciB0
aGUgaW5zcGVjdG9yLgorICAgIE1vc3Qgb2YgdGhlIHJlc291cmNlcyBuZWVkZWQgYnkgdGhlIGlu
c3BlY3RvciBhcmUgb3duZWQgYnkgdGhlIGFzc29jaWF0ZWQKKyAgICBRV2ViUGFnZSBhbmQgYXJl
IGFsbG9jYXRlZCB0aGUgZmlyc3QgdGltZSB0aGF0OgorICAgIFxsaXN0CisgICAgICAgIFxsaSBh
biBlbGVtZW50IGlzIGluc3BlY3RlZAorICAgICAgICBcbGkgdGhlIFFXZWJJbnNwZWN0b3IgaXMg
c2hvd24uCisgICAgXGVuZGxpc3QKKworICAgIFxzZWN0aW9uMSBJbnNwZWN0b3IgY29uZmlndXJh
dGlvbiBwZXJzaXN0ZW5jZQorCisgICAgVGhlIGluc3BlY3RvciBhbGxvd3MgdGhlIHVzZXIgdG8g
Y29uZmlndXJlIHNvbWUgb3B0aW9ucyB0aHJvdWdoIGl0cworICAgIHVzZXIgaW50ZXJmYWNlIChl
LmcuIHRoZSByZXNvdXJjZSB0cmFja2luZyAiQWx3YXlzIGVuYWJsZSIgb3B0aW9uKS4KKyAgICBU
aGVzZSBzZXR0aW5ncyB3aWxsIGJlIHBlcnNpc3RlZCBhdXRvbWF0aWNhbGx5IGJ5IFF0V2ViS2l0
IG9ubHkgaWYKKyAgICB5b3VyIGFwcGxpY2F0aW9uIHByZXZpb3VzbHkgY2FsbGVkIFFDb3JlQXBw
bGljYXRpb246OnNldE9yZ2FuaXphdGlvbk5hbWUoKQorICAgIGFuZCBRQ29yZUFwcGxpY2F0aW9u
OjpzZXRBcHBsaWNhdGlvbk5hbWUoKS4KKyAgICBTZWUgUVNldHRpbmdzJ3MgZGVmYXVsdCBjb25z
dHJ1Y3RvciBkb2N1bWVudGF0aW9uIGZvciBhbiBleHBsYW5hdGlvbgorICAgIG9mIHdoeSB0aGlz
IGlzIG5lY2Vzc2FyeS4KKyovCisKKy8qIQorICAgIENvbnN0cnVjdHMgYW4gdW5ib3VuZCBRV2Vi
SW5zcGVjdG9yIHdpdGggXGEgcGFyZW50IGFzIGl0cyBwYXJlbnQuCisqLworUVdlYkluc3BlY3Rv
cjo6UVdlYkluc3BlY3RvcihRV2lkZ2V0KiBwYXJlbnQpCisgICAgOiBRV2lkZ2V0KHBhcmVudCkK
KyAgICAsIGQobmV3IFFXZWJJbnNwZWN0b3JQcml2YXRlKHRoaXMpKQoreworfQorCisvKiEKKyAg
ICBEZXN0cm95cyB0aGUgaW5zcGVjdG9yLgorKi8KK1FXZWJJbnNwZWN0b3I6On5RV2ViSW5zcGVj
dG9yKCkKK3sKKyAgICAvLyBSZW1vdmUgYXNzb2NpYXRpb24gcHJpbmNpcGFsbHkgdG8gcHJldmVu
dCBkZWxldGluZyBhIGNoaWxkIGZyb250ZW5kCisgICAgc2V0UGFnZSgwKTsKKyAgICBkZWxldGUg
ZDsKKyAgICBkID0gMDsKK30KKworLyohCisgICAgQmluZCB0aGlzIGluc3BlY3RvciB0byB0aGUg
UVdlYlBhZ2UgdG8gYmUgaW5zcGVjdGVkLgorCisgICAgXGIge05vdGVzOn0KKyAgICBcbGlzdAor
ICAgICAgICBcbGkgVGhlcmUgY2FuIG9ubHkgYmUgb25lIFFXZWJJbnNwZWN0b3IgYXNzb2NpYXRl
ZCB3aXRoIGEgUVdlYlBhZ2UKKyAgICAgICAgICAgYW5kIHZpY2UgdmVyc2EuCisgICAgICAgIFxs
aSBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpdGggYSBudWxsIFxhIHBhZ2Ugd2lsbCBicmVhayB0aGUg
Y3VycmVudCBhc3NvY2lhdGlvbiwgaWYgYW55LgorICAgICAgICBcbGkgSWYgXGEgcGFnZSBpcyBh
bHJlYWR5IGFzc29jaWF0ZWQgdG8gYW5vdGhlciBRV2ViSW5zcGVjdG9yLCB0aGUgYXNzb2NpYXRp
b24KKyAgICAgICAgICAgd2lsbCBiZSByZXBsYWNlZCBhbmQgdGhlIHByZXZpb3VzIFFXZWJJbnNw
ZWN0b3Igd2lsbCBiZWNvbWUgdW5ib3VuZAorICAgIFxlbmRsaXN0CisKKyAgICBcc2EgcGFnZSgp
CisqLwordm9pZCBRV2ViSW5zcGVjdG9yOjpzZXRQYWdlKFFXZWJQYWdlKiBwYWdlKQoreworICAg
IGlmIChkLT5wYWdlKSB7CisgICAgICAgIC8vIEJyZWFrIGN1cnJlbnRQYWdlLS0+dGhpcworICAg
ICAgICBkLT5wYWdlLT5kLT5zZXRJbnNwZWN0b3IoMCk7CisgICAgfQorICAgIGlmIChwYWdlICYm
IHBhZ2UtPmQtPmluc3BlY3RvciAmJiBwYWdlLT5kLT5pbnNwZWN0b3IgIT0gdGhpcykgeworICAg
ICAgICAvLyBCcmVhayBuZXdQYWdlPC0+bmV3UGFnZUN1cnJlbnRJbnNwZWN0b3IKKyAgICAgICAg
cGFnZS0+ZC0+aW5zcGVjdG9yLT5zZXRQYWdlKDApOworICAgIH0KKworICAgIGQtPnBhZ2UgPSBw
YWdlOworCisgICAgaWYgKHBhZ2UpIHsKKyAgICAgICAgLy8gU2V0dXAgdGhlIHJlY2lwcm9jYWwg
YXNzb2NpYXRpb24KKyAgICAgICAgcGFnZS0+ZC0+c2V0SW5zcGVjdG9yKHRoaXMpOworICAgIH0K
K30KKworLyohCisgICAgUmV0dXJucyB0aGUgaW5zcGVjdGVkIFFXZWJQYWdlLgorICAgIElmIG5v
IHdlYiBwYWdlIGlzIGN1cnJlbnRseSBhc3NvY2lhdGVkLCBhIG51bGwgcG9pbnRlciBpcyByZXR1
cm5lZC4KKyovCitRV2ViUGFnZSogUVdlYkluc3BlY3Rvcjo6cGFnZSgpIGNvbnN0Cit7CisgICAg
cmV0dXJuIGQtPnBhZ2U7Cit9CisKKy8qISBccmVpbXAgKi8KK1FTaXplIFFXZWJJbnNwZWN0b3I6
OnNpemVIaW50KCkgY29uc3QKK3sKKyAgICByZXR1cm4gUVNpemUoNDUwLCAzMDApOworfQorCisv
KiEgXHJlaW1wICovCitib29sIFFXZWJJbnNwZWN0b3I6OmV2ZW50KFFFdmVudCogZXYpCit7Cisg
ICAgcmV0dXJuIFFXaWRnZXQ6OmV2ZW50KGV2KTsKK30KKworLyohIFxyZWltcCAqLwordm9pZCBR
V2ViSW5zcGVjdG9yOjpyZXNpemVFdmVudChRUmVzaXplRXZlbnQqIGV2ZW50KQoreworICAgIGQt
PmFkanVzdEZyb250ZW5kU2l6ZShldmVudC0+c2l6ZSgpKTsKK30KKworLyohIFxyZWltcCAqLwor
dm9pZCBRV2ViSW5zcGVjdG9yOjpzaG93RXZlbnQoUVNob3dFdmVudCogZXZlbnQpCit7CisjaWYg
RU5BQkxFKElOU1BFQ1RPUikKKyAgICAvLyBBbGxvd3MgUVdlYkluc3BlY3Rvcjo6c2hvdygpIHRv
IGluaXQgdGhlIGluc3BlY3Rvci4KKyAgICBpZiAoZC0+cGFnZSkKKyAgICAgICAgZC0+cGFnZS0+
ZC0+ZGlkU2hvd0luc3BlY3RvcigpOworI2VuZGlmCit9CisKKy8qISBccmVpbXAgKi8KK3ZvaWQg
UVdlYkluc3BlY3Rvcjo6aGlkZUV2ZW50KFFIaWRlRXZlbnQqIGV2ZW50KQoreworI2lmIEVOQUJM
RShJTlNQRUNUT1IpCisgICAgaWYgKGQtPnBhZ2UpCisgICAgICAgIGQtPnBhZ2UtPmQtPmRpZENs
b3NlSW5zcGVjdG9yKCk7CisjZW5kaWYKK30KKworLyohIFxyZWltcCAqLwordm9pZCBRV2ViSW5z
cGVjdG9yOjpjbG9zZUV2ZW50KFFDbG9zZUV2ZW50KiBldmVudCkKK3sKKyNpZiBFTkFCTEUoSU5T
UEVDVE9SKQorICAgIGlmIChkLT5wYWdlKQorICAgICAgICBkLT5wYWdlLT5kLT5kaWRDbG9zZUlu
c3BlY3RvcigpOworI2VuZGlmCit9CisKKy8qISBcaW50ZXJuYWwgKi8KK3ZvaWQgUVdlYkluc3Bl
Y3RvclByaXZhdGU6OnNldEZyb250ZW5kKFFPYmplY3QqIG5ld0Zyb250ZW5kKQoreworICAgIGlm
IChmcm9udGVuZCkKKyAgICAgICAgZnJvbnRlbmQtPnNldFBhcmVudCgwKTsKKworICAgIGZyb250
ZW5kID0gcW9iamVjdF9jYXN0PFFXaWRnZXQqPihuZXdGcm9udGVuZCk7CisKKyAgICBpZiAoZnJv
bnRlbmQpIHsKKyAgICAgICAgZnJvbnRlbmQtPnNldFBhcmVudChxKTsKKyAgICAgICAgZnJvbnRl
bmQtPnNob3coKTsKKyAgICAgICAgYWRqdXN0RnJvbnRlbmRTaXplKHEtPnNpemUoKSk7CisgICAg
fQorfQorCit2b2lkIFFXZWJJbnNwZWN0b3JQcml2YXRlOjphZGp1c3RGcm9udGVuZFNpemUoY29u
c3QgUVNpemUmIHNpemUpCit7CisgICAgaWYgKGZyb250ZW5kKQorICAgICAgICBmcm9udGVuZC0+
cmVzaXplKHNpemUpOworfQorCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldEFw
aS9xd2ViaW5zcGVjdG9yLmggYi9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldEFwaS9xd2ViaW5zcGVj
dG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMC4uZjE5MmU5MjFiNjM5YzhjN2ZjYjVmYmQxNmI4ZWI1NjNhYTE3MzRl
ZAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvcXQvV2lkZ2V0QXBpL3F3ZWJpbnNw
ZWN0b3IuaApAQCAtMCwwICsxLDU3IEBACisvKgorICAgIENvcHlyaWdodCAoQykgMjAwOSBOb2tp
YSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykKKworICAgIFRoaXMgbGli
cmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAg
ICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1
YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k
YXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIg
b3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmli
dXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VU
IEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAg
TUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2Vl
IHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0
YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBM
aWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgbGlicmFy
eTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICAgIHRoZSBG
cmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGgg
Rmxvb3IsCisgICAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisqLworCisjaWZuZGVmIFFX
RUJJTlNQRUNUT1JfSAorI2RlZmluZSBRV0VCSU5TUEVDVE9SX0gKKworI2luY2x1ZGUgInF3ZWJr
aXRnbG9iYWwuaCIKKyNpbmNsdWRlICJxd2VicGFnZS5oIgorCisjaW5jbHVkZSAicXdlYnZpZXcu
aCIKKworY2xhc3MgUVdlYkluc3BlY3RvclByaXZhdGU7CisKK2NsYXNzIFFXRUJLSVRfRVhQT1JU
IFFXZWJJbnNwZWN0b3IgOiBwdWJsaWMgUVdpZGdldCB7CisgICAgUV9PQkpFQ1QKK3B1YmxpYzoK
KyAgICBRV2ViSW5zcGVjdG9yKFFXaWRnZXQqIHBhcmVudCA9IDApOworICAgIH5RV2ViSW5zcGVj
dG9yKCk7CisKKyAgICB2b2lkIHNldFBhZ2UoUVdlYlBhZ2UqIHBhZ2UpOworICAgIFFXZWJQYWdl
KiBwYWdlKCkgY29uc3Q7CisKKyAgICBRU2l6ZSBzaXplSGludCgpIGNvbnN0OworICAgIGJvb2wg
ZXZlbnQoUUV2ZW50Kik7CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIHJlc2l6ZUV2ZW50KFFSZXNp
emVFdmVudCogZXZlbnQpOworICAgIHZvaWQgc2hvd0V2ZW50KFFTaG93RXZlbnQqIGV2ZW50KTsK
KyAgICB2b2lkIGhpZGVFdmVudChRSGlkZUV2ZW50KiBldmVudCk7CisgICAgdm9pZCBjbG9zZUV2
ZW50KFFDbG9zZUV2ZW50KiBldmVudCk7CisKK3ByaXZhdGU6CisgICAgUVdlYkluc3BlY3RvclBy
aXZhdGUqIGQ7CisKKyAgICBmcmllbmQgY2xhc3MgUVdlYkluc3BlY3RvclByaXZhdGU7CisgICAg
ZnJpZW5kIGNsYXNzIFFXZWJQYWdlOworICAgIGZyaWVuZCBjbGFzcyBRV2ViUGFnZVByaXZhdGU7
CisgICAgZnJpZW5kIGNsYXNzIFdlYkNvcmU6Okluc3BlY3RvckNsaWVudFF0OworICAgIGZyaWVu
ZCBjbGFzcyBXZWJDb3JlOjpJbnNwZWN0b3JGcm9udGVuZENsaWVudFF0OworfTsKKyNlbmRpZgpk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9XaWRnZXRBcGkvcXdlYmluc3BlY3Rvcl9wLmgg
Yi9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldEFwaS9xd2ViaW5zcGVjdG9yX3AuaApuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
Li45MDhkZTg0ZWRjMWQ5YWI3YTA3MTE4ZGRkYjU5MmY0YWUxYmYyNmQ2Ci0tLSAvZGV2L251bGwK
KysrIGIvU291cmNlL1dlYktpdC9xdC9XaWRnZXRBcGkvcXdlYmluc3BlY3Rvcl9wLmgKQEAgLTAs
MCArMSw0NiBAQAorLyoKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDkgTm9raWEgQ29ycG9y
YXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCisKKyAgICBUaGlzIGxpYnJhcnkgaXMg
ZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5
IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAg
ICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBl
aXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikg
YW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4g
dGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FS
UkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5U
QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05V
CisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisK
KyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0
aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAgICB0aGUgRnJlZSBTb2Z0
d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAor
ICAgIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorKi8KKworI2lmbmRlZiBRV0VCSU5TUEVD
VE9SX1BfSAorI2RlZmluZSBRV0VCSU5TUEVDVE9SX1BfSAorCitRVF9CRUdJTl9OQU1FU1BBQ0UK
K2NsYXNzIFFTaXplOworY2xhc3MgUVdpZGdldDsKK1FUX0VORF9OQU1FU1BBQ0UKK2NsYXNzIFFX
ZWJJbnNwZWN0b3I7CitjbGFzcyBRV2ViUGFnZTsKKworY2xhc3MgUVdlYkluc3BlY3RvclByaXZh
dGUgeworcHVibGljOgorICAgIFFXZWJJbnNwZWN0b3JQcml2YXRlKFFXZWJJbnNwZWN0b3IqIHFx
KQorICAgIDogcShxcSkKKyAgICAsIHBhZ2UoMCkKKyAgICAsIGZyb250ZW5kKDApCisgICAge30K
KworICAgIHZvaWQgc2V0RnJvbnRlbmQoUU9iamVjdCogbmV3RnJvbnRlbmQpOworICAgIHZvaWQg
YWRqdXN0RnJvbnRlbmRTaXplKGNvbnN0IFFTaXplJiBzaXplKTsKKworICAgIFFXZWJJbnNwZWN0
b3IqIHE7CisgICAgUVdlYlBhZ2UqIHBhZ2U7CisgICAgUVdpZGdldCogZnJvbnRlbmQ7Cit9Owor
CisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvcXQvV2lkZ2V0QXBpL3F3ZWJwYWdl
LmNwcCBiL1NvdXJjZS9XZWJLaXQvcXQvV2lkZ2V0QXBpL3F3ZWJwYWdlLmNwcApuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
Li43MzI4MzUzNjJiY2VhZTM3OTU4NDczMTFjMTI2MDA3OWM2NDNhNzI2Ci0tLSAvZGV2L251bGwK
KysrIGIvU291cmNlL1dlYktpdC9xdC9XaWRnZXRBcGkvcXdlYnBhZ2UuY3BwCkBAIC0wLDAgKzEs
MzM4MCBAQAorLyoKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDksIDIwMTIgTm9raWEgQ29y
cG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCisgICAgQ29weXJpZ2h0IChDKSAy
MDA3IFN0YWlrb3MgQ29tcHV0aW5nIFNlcnZpY2VzIEluYy4KKyAgICBDb3B5cmlnaHQgKEMpIDIw
MDcgQXBwbGUgSW5jLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBj
YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMg
b2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNo
ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAy
IG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgor
CisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2ls
bCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4g
dGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZl
IHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZQorICAgIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIu
ICBJZiBub3QsIHdyaXRlIHRvCisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5j
LiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAgICBCb3N0b24sIE1BIDAyMTEw
LTEzMDEsIFVTQS4KKyovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJxd2VicGFn
ZS5oIgorCisjaW5jbHVkZSAiRGVmYXVsdEZ1bGxTY3JlZW5WaWRlb0hhbmRsZXIuaCIKKyNpbmNs
dWRlICJJbml0V2ViS2l0UXQuaCIKKyNpbmNsdWRlICJJbnNwZWN0b3JDbGllbnRRdC5oIgorI2lu
Y2x1ZGUgIkluc3BlY3RvckNsaWVudFdlYlBhZ2UuaCIKKyNpbmNsdWRlICJJbnNwZWN0b3JTZXJ2
ZXJRdC5oIgorI2luY2x1ZGUgIlFHcmFwaGljc1dpZGdldFBsdWdpbkltcGwuaCIKKyNpbmNsdWRl
ICJRV2ViVW5kb0NvbW1hbmQuaCIKKyNpbmNsdWRlICJRV2lkZ2V0UGx1Z2luSW1wbC5oIgorI2lu
Y2x1ZGUgIlF0RmFsbGJhY2tXZWJQb3B1cC5oIgorI2luY2x1ZGUgIlF0UGxhdGZvcm1QbHVnaW4u
aCIKKyNpbmNsdWRlICJQYWdlQ2xpZW50UXQuaCIKKyNpbmNsdWRlICJVbmRvU3RlcFF0LmgiCisj
aW5jbHVkZSAiV2ViRXZlbnRDb252ZXJzaW9uLmgiCisKKyNpbmNsdWRlICJxd2ViZnJhbWUuaCIK
KyNpbmNsdWRlICJxd2ViZnJhbWVfcC5oIgorI2luY2x1ZGUgInF3ZWJoaXN0b3J5LmgiCisjaW5j
bHVkZSAicXdlYmluc3BlY3Rvci5oIgorI2luY2x1ZGUgInF3ZWJpbnNwZWN0b3JfcC5oIgorI2lu
Y2x1ZGUgInF3ZWJraXRwbGF0Zm9ybXBsdWdpbi5oIgorI2luY2x1ZGUgInF3ZWJraXR2ZXJzaW9u
LmgiCisjaW5jbHVkZSAicXdlYnBhZ2VfcC5oIgorI2luY2x1ZGUgInF3ZWJzZXR0aW5ncy5oIgor
I2luY2x1ZGUgInF3ZWJ2aWV3LmgiCisKKyNpbmNsdWRlIDxRQWN0aW9uPgorI2luY2x1ZGUgPFFB
cHBsaWNhdGlvbj4KKyNpbmNsdWRlIDxRQmFzaWNUaW1lcj4KKyNpbmNsdWRlIDxRQml0QXJyYXk+
CisjaW5jbHVkZSA8UUNsaXBib2FyZD4KKyNpbmNsdWRlIDxRQ29sb3JEaWFsb2c+CisjaW5jbHVk
ZSA8UURlYnVnPgorI2luY2x1ZGUgPFFEZXNrdG9wV2lkZ2V0PgorI2luY2x1ZGUgPFFEcmFnRW50
ZXJFdmVudD4KKyNpbmNsdWRlIDxRRHJhZ0xlYXZlRXZlbnQ+CisjaW5jbHVkZSA8UURyYWdNb3Zl
RXZlbnQ+CisjaW5jbHVkZSA8UURyb3BFdmVudD4KKyNpbmNsdWRlIDxRRmlsZURpYWxvZz4KKyNp
bmNsdWRlIDxRR2VzdHVyZUV2ZW50PgorI2luY2x1ZGUgPFFJbnB1dERpYWxvZz4KKyNpbmNsdWRl
IDxRTGFiZWw+CisjaW5jbHVkZSA8UU1lbnU+CisjaW5jbHVkZSA8UU1lc3NhZ2VCb3g+CisjaW5j
bHVkZSA8UU5ldHdvcmtBY2Nlc3NNYW5hZ2VyPgorI2luY2x1ZGUgPFFOZXR3b3JrUHJveHk+Cisj
aW5jbHVkZSA8UU5ldHdvcmtSZXF1ZXN0PgorI2luY2x1ZGUgPFFQYWludGVyPgorI2luY2x1ZGUg
PFFTc2xTb2NrZXQ+CisjaW5jbHVkZSA8UVN0eWxlPgorI2luY2x1ZGUgPFFTeXNJbmZvPgorI2lm
IFVTRShRVF9NT0JJTElUWV9TWVNURU1JTkZPKQorI2luY2x1ZGUgPHFzeXN0ZW1pbmZvLmg+Cisj
ZW5kaWYKKyNpbmNsdWRlIDxRU3lzdGVtVHJheUljb24+CisjaW5jbHVkZSA8UVRleHRDaGFyRm9y
bWF0PgorI2luY2x1ZGUgPFFUb29sVGlwPgorI2luY2x1ZGUgPFFUb3VjaEV2ZW50PgorI2luY2x1
ZGUgPFFVbmRvU3RhY2s+CisjaW5jbHVkZSA8UVVybD4KKyNpZiBkZWZpbmVkKFFfV1NfWDExKQor
I2luY2x1ZGUgPFFYMTFJbmZvPgorI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwor
CisvLyBMb29rdXAgdGFibGUgbWFwcGluZyBRV2ViUGFnZTo6V2ViQWN0aW9ucyB0byB0aGUgYXNz
b2NpYXRlZCBFZGl0b3IgY29tbWFuZHMKK3N0YXRpYyBjb25zdCBjaGFyKiBlZGl0b3JDb21tYW5k
V2ViQWN0aW9uc1tdID0KK3sKKyAgICAwLCAvLyBPcGVuTGluaywKKworICAgIDAsIC8vIE9wZW5M
aW5rSW5OZXdXaW5kb3csCisgICAgMCwgLy8gT3BlbkZyYW1lSW5OZXdXaW5kb3csCisKKyAgICAw
LCAvLyBEb3dubG9hZExpbmtUb0Rpc2ssCisgICAgMCwgLy8gQ29weUxpbmtUb0NsaXBib2FyZCwK
KworICAgIDAsIC8vIE9wZW5JbWFnZUluTmV3V2luZG93LAorICAgIDAsIC8vIERvd25sb2FkSW1h
Z2VUb0Rpc2ssCisgICAgMCwgLy8gQ29weUltYWdlVG9DbGlwYm9hcmQsCisKKyAgICAwLCAvLyBC
YWNrLAorICAgIDAsIC8vIEZvcndhcmQsCisgICAgMCwgLy8gU3RvcCwKKyAgICAwLCAvLyBSZWxv
YWQsCisKKyAgICAiQ3V0IiwgLy8gQ3V0LAorICAgICJDb3B5IiwgLy8gQ29weSwKKyAgICAiUGFz
dGUiLCAvLyBQYXN0ZSwKKworICAgICJVbmRvIiwgLy8gVW5kbywKKyAgICAiUmVkbyIsIC8vIFJl
ZG8sCisgICAgIk1vdmVGb3J3YXJkIiwgLy8gTW92ZVRvTmV4dENoYXIsCisgICAgIk1vdmVCYWNr
d2FyZCIsIC8vIE1vdmVUb1ByZXZpb3VzQ2hhciwKKyAgICAiTW92ZVdvcmRGb3J3YXJkIiwgLy8g
TW92ZVRvTmV4dFdvcmQsCisgICAgIk1vdmVXb3JkQmFja3dhcmQiLCAvLyBNb3ZlVG9QcmV2aW91
c1dvcmQsCisgICAgIk1vdmVEb3duIiwgLy8gTW92ZVRvTmV4dExpbmUsCisgICAgIk1vdmVVcCIs
IC8vIE1vdmVUb1ByZXZpb3VzTGluZSwKKyAgICAiTW92ZVRvQmVnaW5uaW5nT2ZMaW5lIiwgLy8g
TW92ZVRvU3RhcnRPZkxpbmUsCisgICAgIk1vdmVUb0VuZE9mTGluZSIsIC8vIE1vdmVUb0VuZE9m
TGluZSwKKyAgICAiTW92ZVRvQmVnaW5uaW5nT2ZQYXJhZ3JhcGgiLCAvLyBNb3ZlVG9TdGFydE9m
QmxvY2ssCisgICAgIk1vdmVUb0VuZE9mUGFyYWdyYXBoIiwgLy8gTW92ZVRvRW5kT2ZCbG9jaywK
KyAgICAiTW92ZVRvQmVnaW5uaW5nT2ZEb2N1bWVudCIsIC8vIE1vdmVUb1N0YXJ0T2ZEb2N1bWVu
dCwKKyAgICAiTW92ZVRvRW5kT2ZEb2N1bWVudCIsIC8vIE1vdmVUb0VuZE9mRG9jdW1lbnQsCisg
ICAgIk1vdmVGb3J3YXJkQW5kTW9kaWZ5U2VsZWN0aW9uIiwgLy8gU2VsZWN0TmV4dENoYXIsCisg
ICAgIk1vdmVCYWNrd2FyZEFuZE1vZGlmeVNlbGVjdGlvbiIsIC8vIFNlbGVjdFByZXZpb3VzQ2hh
ciwKKyAgICAiTW92ZVdvcmRGb3J3YXJkQW5kTW9kaWZ5U2VsZWN0aW9uIiwgLy8gU2VsZWN0TmV4
dFdvcmQsCisgICAgIk1vdmVXb3JkQmFja3dhcmRBbmRNb2RpZnlTZWxlY3Rpb24iLCAvLyBTZWxl
Y3RQcmV2aW91c1dvcmQsCisgICAgIk1vdmVEb3duQW5kTW9kaWZ5U2VsZWN0aW9uIiwgLy8gU2Vs
ZWN0TmV4dExpbmUsCisgICAgIk1vdmVVcEFuZE1vZGlmeVNlbGVjdGlvbiIsIC8vIFNlbGVjdFBy
ZXZpb3VzTGluZSwKKyAgICAiTW92ZVRvQmVnaW5uaW5nT2ZMaW5lQW5kTW9kaWZ5U2VsZWN0aW9u
IiwgLy8gU2VsZWN0U3RhcnRPZkxpbmUsCisgICAgIk1vdmVUb0VuZE9mTGluZUFuZE1vZGlmeVNl
bGVjdGlvbiIsIC8vIFNlbGVjdEVuZE9mTGluZSwKKyAgICAiTW92ZVRvQmVnaW5uaW5nT2ZQYXJh
Z3JhcGhBbmRNb2RpZnlTZWxlY3Rpb24iLCAvLyBTZWxlY3RTdGFydE9mQmxvY2ssCisgICAgIk1v
dmVUb0VuZE9mUGFyYWdyYXBoQW5kTW9kaWZ5U2VsZWN0aW9uIiwgLy8gU2VsZWN0RW5kT2ZCbG9j
aywKKyAgICAiTW92ZVRvQmVnaW5uaW5nT2ZEb2N1bWVudEFuZE1vZGlmeVNlbGVjdGlvbiIsIC8v
U2VsZWN0U3RhcnRPZkRvY3VtZW50LAorICAgICJNb3ZlVG9FbmRPZkRvY3VtZW50QW5kTW9kaWZ5
U2VsZWN0aW9uIiwgLy8gU2VsZWN0RW5kT2ZEb2N1bWVudCwKKyAgICAiRGVsZXRlV29yZEJhY2t3
YXJkIiwgLy8gRGVsZXRlU3RhcnRPZldvcmQsCisgICAgIkRlbGV0ZVdvcmRGb3J3YXJkIiwgLy8g
RGVsZXRlRW5kT2ZXb3JkLAorCisgICAgMCwgLy8gU2V0VGV4dERpcmVjdGlvbkRlZmF1bHQsCisg
ICAgMCwgLy8gU2V0VGV4dERpcmVjdGlvbkxlZnRUb1JpZ2h0LAorICAgIDAsIC8vIFNldFRleHRE
aXJlY3Rpb25SaWdodFRvTGVmdCwKKworICAgICJUb2dnbGVCb2xkIiwgLy8gVG9nZ2xlQm9sZCwK
KyAgICAiVG9nZ2xlSXRhbGljIiwgLy8gVG9nZ2xlSXRhbGljLAorICAgICJUb2dnbGVVbmRlcmxp
bmUiLCAvLyBUb2dnbGVVbmRlcmxpbmUsCisKKyAgICAwLCAvLyBJbnNwZWN0RWxlbWVudCwKKwor
ICAgICJJbnNlcnROZXdsaW5lIiwgLy8gSW5zZXJ0UGFyYWdyYXBoU2VwYXJhdG9yCisgICAgIklu
c2VydExpbmVCcmVhayIsIC8vIEluc2VydExpbmVTZXBhcmF0b3IKKworICAgICJTZWxlY3RBbGwi
LCAvLyBTZWxlY3RBbGwKKyAgICAwLCAvLyBSZWxvYWRBbmRCeXBhc3NDYWNoZSwKKworICAgICJQ
YXN0ZUFuZE1hdGNoU3R5bGUiLCAvLyBQYXN0ZUFuZE1hdGNoU3R5bGUKKyAgICAiUmVtb3ZlRm9y
bWF0IiwgLy8gUmVtb3ZlRm9ybWF0CisgICAgIlN0cmlrZXRocm91Z2giLCAvLyBUb2dnbGVTdHJp
a2V0aHJvdWdoLAorICAgICJTdWJzY3JpcHQiLCAvLyBUb2dnbGVTdWJzY3JpcHQKKyAgICAiU3Vw
ZXJzY3JpcHQiLCAvLyBUb2dnbGVTdXBlcnNjcmlwdAorICAgICJJbnNlcnRVbm9yZGVyZWRMaXN0
IiwgLy8gSW5zZXJ0VW5vcmRlcmVkTGlzdAorICAgICJJbnNlcnRPcmRlcmVkTGlzdCIsIC8vIElu
c2VydE9yZGVyZWRMaXN0CisgICAgIkluZGVudCIsIC8vIEluZGVudAorICAgICJPdXRkZW50Iiwg
Ly8gT3V0ZGVudCwKKworICAgICJBbGlnbkNlbnRlciIsIC8vIEFsaWduQ2VudGVyLAorICAgICJB
bGlnbkp1c3RpZmllZCIsIC8vIEFsaWduSnVzdGlmaWVkLAorICAgICJBbGlnbkxlZnQiLCAvLyBB
bGlnbkxlZnQsCisgICAgIkFsaWduUmlnaHQiLCAvLyBBbGlnblJpZ2h0LAorCisgICAgMCwgLy8g
U3RvcFNjaGVkdWxlZFBhZ2VSZWZyZXNoLAorCisgICAgMCwgLy8gQ29weUltYWdlVXJsVG9DbGlw
Ym9hcmQsCisKKyAgICAwLCAvLyBPcGVuTGlua0luVGhpc1dpbmRvdywKKworICAgIDAgLy8gV2Vi
QWN0aW9uQ291bnQKK307CisKKy8vIExvb2t1cCB0aGUgYXBwcm9wcmlhdGUgZWRpdG9yIGNvbW1h
bmQgdG8gdXNlIGZvciBXZWJBY3Rpb24gXGEgYWN0aW9uCitjb25zdCBjaGFyKiBRV2ViUGFnZVBy
aXZhdGU6OmVkaXRvckNvbW1hbmRGb3JXZWJBY3Rpb25zKFFXZWJQYWdlOjpXZWJBY3Rpb24gYWN0
aW9uKQoreworICAgIGlmICgoYWN0aW9uID4gUVdlYlBhZ2U6Ok5vV2ViQWN0aW9uKSAmJiAoYWN0
aW9uIDwgaW50KHNpemVvZihlZGl0b3JDb21tYW5kV2ViQWN0aW9ucykgLyBzaXplb2YoY29uc3Qg
Y2hhciopKSkpCisgICAgICAgIHJldHVybiBlZGl0b3JDb21tYW5kV2ViQWN0aW9uc1thY3Rpb25d
OworICAgIHJldHVybiAwOworfQorCitRV2ViUGFnZVByaXZhdGU6OlFXZWJQYWdlUHJpdmF0ZShR
V2ViUGFnZSAqcXEpCisgICAgOiBxKHFxKQorI2lmbmRlZiBRVF9OT19VTkRPU1RBQ0sKKyAgICAs
IHVuZG9TdGFjaygwKQorI2VuZGlmCisgICAgLCBsaW5rUG9saWN5KFFXZWJQYWdlOjpEb250RGVs
ZWdhdGVMaW5rcykKKyAgICAsIG1fdmlld3BvcnRTaXplKFFTaXplKDAsIDApKQorICAgICwgdXNl
Rml4ZWRMYXlvdXQoZmFsc2UpCisgICAgLCBpbnNwZWN0b3JGcm9udGVuZCgwKQorICAgICwgaW5z
cGVjdG9yKDApCisgICAgLCBpbnNwZWN0b3JJc0ludGVybmFsT25seShmYWxzZSkKKyAgICAsIG1f
bGFzdERyb3BBY3Rpb24oUXQ6Oklnbm9yZUFjdGlvbikKK3sKKyAgICBXZWJLaXQ6OmluaXRpYWxp
emVXZWJLaXRXaWRnZXRzKCk7CisgICAgbWVtc2V0KGFjdGlvbnMsIDAsIHNpemVvZihhY3Rpb25z
KSk7CisKKyNpZiBFTkFCTEUoTk9USUZJQ0FUSU9OUykgfHwgRU5BQkxFKExFR0FDWV9OT1RJRklD
QVRJT05TKQorICAgIGFkZE5vdGlmaWNhdGlvblByZXNlbnRlckNsaWVudCgpOworI2lmbmRlZiBR
VF9OT19TWVNURU1UUkFZSUNPTgorICAgIGlmICghaGFzU3lzdGVtVHJheUljb24oKSkKKyAgICAg
ICAgc2V0U3lzdGVtVHJheUljb24obmV3IFFTeXN0ZW1UcmF5SWNvbik7CisjZW5kaWYgLy8gUVRf
Tk9fU1lTVEVNVFJBWUlDT04KKyNlbmRpZiAvLyBFTkFCTEUoTk9USUZJQ0FUSU9OUykgfHwgRU5B
QkxFKExFR0FDWV9OT1RJRklDQVRJT05TKQorfQorCitRV2ViUGFnZVByaXZhdGU6On5RV2ViUGFn
ZVByaXZhdGUoKQoreworI2lmbmRlZiBRVF9OT19DT05URVhUTUVOVQorICAgIGRlbGV0ZSBjdXJy
ZW50Q29udGV4dE1lbnUuZGF0YSgpOworI2VuZGlmCisjaWZuZGVmIFFUX05PX1VORE9TVEFDSwor
ICAgIGRlbGV0ZSB1bmRvU3RhY2s7CisgICAgdW5kb1N0YWNrID0gMDsKKyNlbmRpZgorICAgIAor
ICAgIGlmIChpbnNwZWN0b3IpIHsKKyAgICAgICAgLy8gSWYgdGhlIGluc3BlY3RvciBpcyBvdXJz
LCBkZWxldGUgaXQsIG90aGVyd2lzZSBqdXN0IGRldGFjaCBmcm9tIGl0LgorICAgICAgICBpZiAo
aW5zcGVjdG9ySXNJbnRlcm5hbE9ubHkpCisgICAgICAgICAgICBkZWxldGUgaW5zcGVjdG9yOwor
ICAgICAgICBlbHNlCisgICAgICAgICAgICBpbnNwZWN0b3ItPnNldFBhZ2UoMCk7CisgICAgfQor
ICAgIC8vIEV4cGxpY2l0bHkgZGVzdHJ1Y3QgdGhlIFdlYkNvcmUgcGFnZSBhdCB0aGlzIHBvaW50
IHdoZW4gdGhlCisgICAgLy8gUVdlYlBhZ2VQcml2YXRlIC8gUVdlYlBhZ2VBZGFwYXRlciB2dGFi
bGVzIGFyZSBzdGlsbCBpbnRhY3QsCisgICAgLy8gaW4gb3JkZXIgZm9yIHZhcmlvdXMgZGVzdHJ1
Y3Rpb24gY2FsbGJhY2tzIG91dCBvZiBXZWJDb3JlIHRvCisgICAgLy8gd29yay4KKyAgICBkZWxl
dGVQYWdlKCk7Cit9CisKK3ZvaWQgUVdlYlBhZ2VQcml2YXRlOjpzaG93KCkKK3sKKyAgICBpZiAo
IXZpZXcpCisgICAgICAgIHJldHVybjsKKyAgICB2aWV3LT53aW5kb3coKS0+c2hvdygpOworfQor
Cit2b2lkIFFXZWJQYWdlUHJpdmF0ZTo6c2V0Rm9jdXMoKQoreworICAgIGlmICghdmlldykKKyAg
ICAgICAgcmV0dXJuOworICAgIHZpZXctPnNldEZvY3VzKCk7Cit9CisKK3ZvaWQgUVdlYlBhZ2VQ
cml2YXRlOjp1bmZvY3VzKCkKK3sKKyAgICBpZiAoIXZpZXcpCisgICAgICAgIHJldHVybjsKKyAg
ICB2aWV3LT5jbGVhckZvY3VzKCk7Cit9CisKK3ZvaWQgUVdlYlBhZ2VQcml2YXRlOjpzZXRXaW5k
b3dSZWN0KGNvbnN0IFFSZWN0ICZyZWN0KQoreworICAgIGVtaXQgcS0+Z2VvbWV0cnlDaGFuZ2VS
ZXF1ZXN0ZWQocmVjdCk7Cit9CisKK1FTaXplIFFXZWJQYWdlUHJpdmF0ZTo6dmlld3BvcnRTaXpl
KCkgY29uc3QKK3sKKyAgICByZXR1cm4gcS0+dmlld3BvcnRTaXplKCk7Cit9CisKK1FXZWJQYWdl
QWRhcHRlciAqUVdlYlBhZ2VQcml2YXRlOjpjcmVhdGVXaW5kb3coYm9vbCBkaWFsb2cpCit7Cisg
ICAgUVdlYlBhZ2UgKm5ld1BhZ2UgPSBxLT5jcmVhdGVXaW5kb3coZGlhbG9nID8gUVdlYlBhZ2U6
OldlYk1vZGFsRGlhbG9nIDogUVdlYlBhZ2U6OldlYkJyb3dzZXJXaW5kb3cpOworICAgIGlmICgh
bmV3UGFnZSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgLy8gTWFrZSBzdXJlIHRoZSBtYWluIGZy
YW1lIGV4aXN0cywgYXMgV2ViQ29yZSBleHBlY3RzIGl0IHdoZW4gcmV0dXJuaW5nIGZyb20gdGhp
cyBDaHJvbWVDbGllbnQ6OmNyZWF0ZVdpbmRvdygpCisgICAgbmV3UGFnZS0+ZC0+Y3JlYXRlTWFp
bkZyYW1lKCk7CisgICAgcmV0dXJuIG5ld1BhZ2UtPmQ7Cit9CisKK3ZvaWQgUVdlYlBhZ2VQcml2
YXRlOjpqYXZhU2NyaXB0Q29uc29sZU1lc3NhZ2UoY29uc3QgUVN0cmluZyAmbWVzc2FnZSwgaW50
IGxpbmVOdW1iZXIsIGNvbnN0IFFTdHJpbmcgJnNvdXJjZUlEKQoreworICAgIHEtPmphdmFTY3Jp
cHRDb25zb2xlTWVzc2FnZShtZXNzYWdlLCBsaW5lTnVtYmVyLCBzb3VyY2VJRCk7Cit9CisKK3Zv
aWQgUVdlYlBhZ2VQcml2YXRlOjpqYXZhU2NyaXB0QWxlcnQoUVdlYkZyYW1lQWRhcHRlciogZnJh
bWUsIGNvbnN0IFFTdHJpbmcmIG1zZykKK3sKKyAgICBxLT5qYXZhU2NyaXB0QWxlcnQoUVdlYkZy
YW1lUHJpdmF0ZTo6a2l0KGZyYW1lKSwgbXNnKTsKK30KKworYm9vbCBRV2ViUGFnZVByaXZhdGU6
OmphdmFTY3JpcHRDb25maXJtKFFXZWJGcmFtZUFkYXB0ZXIqIGZyYW1lLCBjb25zdCBRU3RyaW5n
JiBtc2cpCit7CisgICAgcmV0dXJuIHEtPmphdmFTY3JpcHRDb25maXJtKFFXZWJGcmFtZVByaXZh
dGU6OmtpdChmcmFtZSksIG1zZyk7Cit9CisKK2Jvb2wgUVdlYlBhZ2VQcml2YXRlOjpqYXZhU2Ny
aXB0UHJvbXB0KFFXZWJGcmFtZUFkYXB0ZXIgKmZyYW1lLCBjb25zdCBRU3RyaW5nICZtc2csIGNv
bnN0IFFTdHJpbmcgJmRlZmF1bHRWYWx1ZSwgUVN0cmluZyAqcmVzdWx0KQoreworICAgIHJldHVy
biBxLT5qYXZhU2NyaXB0UHJvbXB0KFFXZWJGcmFtZVByaXZhdGU6OmtpdChmcmFtZSksIG1zZywg
ZGVmYXVsdFZhbHVlLCByZXN1bHQpOworfQorCitib29sIFFXZWJQYWdlUHJpdmF0ZTo6c2hvdWxk
SW50ZXJydXB0SmF2YVNjcmlwdCgpCit7CisgICAgcmV0dXJuIHEtPnNob3VsZEludGVycnVwdEph
dmFTY3JpcHQoKTsKK30KKwordm9pZCBRV2ViUGFnZVByaXZhdGU6OnByaW50UmVxdWVzdGVkKFFX
ZWJGcmFtZUFkYXB0ZXIgKmZyYW1lKQoreworICAgIGVtaXQgcS0+cHJpbnRSZXF1ZXN0ZWQoUVdl
YkZyYW1lUHJpdmF0ZTo6a2l0KGZyYW1lKSk7Cit9CisKK3ZvaWQgUVdlYlBhZ2VQcml2YXRlOjpk
YXRhYmFzZVF1b3RhRXhjZWVkZWQoUVdlYkZyYW1lQWRhcHRlciogZnJhbWUsIGNvbnN0IFFTdHJp
bmcmIGRhdGFiYXNlTmFtZSkKK3sKKyAgICBlbWl0IHEtPmRhdGFiYXNlUXVvdGFFeGNlZWRlZChR
V2ViRnJhbWVQcml2YXRlOjpraXQoZnJhbWUpLCBkYXRhYmFzZU5hbWUpOworfQorCit2b2lkIFFX
ZWJQYWdlUHJpdmF0ZTo6YXBwbGljYXRpb25DYWNoZVF1b3RhRXhjZWVkZWQoUVdlYlNlY3VyaXR5
T3JpZ2luICpvcmlnaW4sIHF1aW50NjQgZGVmYXVsdE9yaWdpblF1b3RhLCBxdWludDY0IGMpCit7
CisgICAgZW1pdCBxLT5hcHBsaWNhdGlvbkNhY2hlUXVvdGFFeGNlZWRlZChvcmlnaW4sIGRlZmF1
bHRPcmlnaW5RdW90YSwgYyk7Cit9CisKK3ZvaWQgUVdlYlBhZ2VQcml2YXRlOjpzZXRUb29sVGlw
KGNvbnN0IFFTdHJpbmcgJnRpcCkKK3sKKyNpZm5kZWYgUVRfTk9fVE9PTFRJUAorICAgIGlmICgh
dmlldykKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKHRpcC5pc0VtcHR5KCkpIHsKKyAgICAg
ICAgdmlldy0+c2V0VG9vbFRpcChRU3RyaW5nKCkpOworICAgICAgICBRVG9vbFRpcDo6aGlkZVRl
eHQoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBRU3RyaW5nIGR0aXAgPSBRTGF0aW4xU3RyaW5n
KCI8cD4iKSArIFFTdHJpbmcodGlwKS50b0h0bWxFc2NhcGVkKCkgKyBRTGF0aW4xU3RyaW5nKCI8
L3A+Iik7CisgICAgICAgIHZpZXctPnNldFRvb2xUaXAoZHRpcCk7CisgICAgfQorI2Vsc2UKKyAg
ICBRX1VOVVNFRCh0aXApOworI2VuZGlmCit9CisKKyNpZiBVU0UoUVRfTVVMVElNRURJQSkKK1FX
ZWJGdWxsU2NyZWVuVmlkZW9IYW5kbGVyICpRV2ViUGFnZVByaXZhdGU6OmNyZWF0ZUZ1bGxTY3Jl
ZW5WaWRlb0hhbmRsZXIoKQoreworICAgIHJldHVybiBuZXcgV2ViS2l0OjpEZWZhdWx0RnVsbFNj
cmVlblZpZGVvSGFuZGxlcjsKK30KKyNlbmRpZgorCitRV2ViRnJhbWVBZGFwdGVyICpRV2ViUGFn
ZVByaXZhdGU6Om1haW5GcmFtZUFkYXB0ZXIoKQoreworICAgIHJldHVybiBxLT5tYWluRnJhbWUo
KS0+ZDsKK30KKworUVN0cmluZ0xpc3QgUVdlYlBhZ2VQcml2YXRlOjpjaG9vc2VGaWxlcyhRV2Vi
RnJhbWVBZGFwdGVyICpmcmFtZSwgYm9vbCBhbGxvd011bHRpcGxlLCBjb25zdCBRU3RyaW5nTGlz
dCAmc3VnZ2VzdGVkRmlsZU5hbWVzKQoreworICAgIGlmIChhbGxvd011bHRpcGxlICYmIHEtPnN1
cHBvcnRzRXh0ZW5zaW9uKFFXZWJQYWdlOjpDaG9vc2VNdWx0aXBsZUZpbGVzRXh0ZW5zaW9uKSkg
eworICAgICAgICBRV2ViUGFnZTo6Q2hvb3NlTXVsdGlwbGVGaWxlc0V4dGVuc2lvbk9wdGlvbiBv
cHRpb247CisgICAgICAgIG9wdGlvbi5wYXJlbnRGcmFtZSA9IFFXZWJGcmFtZVByaXZhdGU6Omtp
dChmcmFtZSk7CisgICAgICAgIG9wdGlvbi5zdWdnZXN0ZWRGaWxlTmFtZXMgPSBzdWdnZXN0ZWRG
aWxlTmFtZXM7CisKKyAgICAgICAgUVdlYlBhZ2U6OkNob29zZU11bHRpcGxlRmlsZXNFeHRlbnNp
b25SZXR1cm4gb3V0cHV0OworICAgICAgICBxLT5leHRlbnNpb24oUVdlYlBhZ2U6OkNob29zZU11
bHRpcGxlRmlsZXNFeHRlbnNpb24sICZvcHRpb24sICZvdXRwdXQpOworCisgICAgICAgIHJldHVy
biBvdXRwdXQuZmlsZU5hbWVzOworICAgIH0KKyAgICAvLyBTaW5nbGUgZmlsZQorICAgIFFTdHJp
bmdMaXN0IHJlc3VsdDsKKyAgICBRU3RyaW5nIHN1Z2dlc3RlZEZpbGU7CisgICAgaWYgKCFzdWdn
ZXN0ZWRGaWxlTmFtZXMuaXNFbXB0eSgpKQorICAgICAgICBzdWdnZXN0ZWRGaWxlID0gc3VnZ2Vz
dGVkRmlsZU5hbWVzLmZpcnN0KCk7CisgICAgUVN0cmluZyBmaWxlID0gcS0+Y2hvb3NlRmlsZShR
V2ViRnJhbWVQcml2YXRlOjpraXQoZnJhbWUpLCBzdWdnZXN0ZWRGaWxlKTsKKyAgICBpZiAoIWZp
bGUuaXNFbXB0eSgpKQorICAgICAgICByZXN1bHQgPDwgZmlsZTsKKyAgICByZXR1cm4gcmVzdWx0
OworfQorCitib29sIFFXZWJQYWdlUHJpdmF0ZTo6YWNjZXB0TmF2aWdhdGlvblJlcXVlc3QoUVdl
YkZyYW1lQWRhcHRlciAqZnJhbWVBZGFwdGVyLCBjb25zdCBRTmV0d29ya1JlcXVlc3QgJnJlcXVl
c3QsIGludCB0eXBlKQoreworICAgIFFXZWJGcmFtZSAqZnJhbWUgPSBmcmFtZUFkYXB0ZXIgPyBR
V2ViRnJhbWVQcml2YXRlOjpraXQoZnJhbWVBZGFwdGVyKTogMDsKKyAgICBpZiAoaW5zaWRlT3Bl
bkNhbGwKKyAgICAgICAgJiYgZnJhbWUgPT0gbWFpbkZyYW1lLmRhdGEoKSkKKyAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgcmV0dXJuIHEtPmFjY2VwdE5hdmlnYXRpb25SZXF1ZXN0KGZyYW1lLCBy
ZXF1ZXN0LCBRV2ViUGFnZTo6TmF2aWdhdGlvblR5cGUodHlwZSkpOworfQorCit2b2lkIFFXZWJQ
YWdlUHJpdmF0ZTo6ZW1pdFJlc3RvcmVGcmFtZVN0YXRlUmVxdWVzdGVkKFFXZWJGcmFtZUFkYXB0
ZXIgKmZyYW1lKQoreworICAgIGVtaXQgcS0+cmVzdG9yZUZyYW1lU3RhdGVSZXF1ZXN0ZWQoUVdl
YkZyYW1lUHJpdmF0ZTo6a2l0KGZyYW1lKSk7Cit9CisKK3ZvaWQgUVdlYlBhZ2VQcml2YXRlOjpl
bWl0U2F2ZUZyYW1lU3RhdGVSZXF1ZXN0ZWQoUVdlYkZyYW1lQWRhcHRlciAqZnJhbWUsIFFXZWJI
aXN0b3J5SXRlbSAqaXRlbSkKK3sKKyAgICBlbWl0IHEtPnNhdmVGcmFtZVN0YXRlUmVxdWVzdGVk
KFFXZWJGcmFtZVByaXZhdGU6OmtpdChmcmFtZSksIGl0ZW0pOworfQorCit2b2lkIFFXZWJQYWdl
UHJpdmF0ZTo6ZW1pdERvd25sb2FkUmVxdWVzdGVkKGNvbnN0IFFOZXR3b3JrUmVxdWVzdCAmcmVx
dWVzdCkKK3sKKyAgICBlbWl0IHEtPmRvd25sb2FkUmVxdWVzdGVkKHJlcXVlc3QpOworfQorCit2
b2lkIFFXZWJQYWdlUHJpdmF0ZTo6ZW1pdEZyYW1lQ3JlYXRlZChRV2ViRnJhbWVBZGFwdGVyICpm
cmFtZSkKK3sKKyAgICBlbWl0IHEtPmZyYW1lQ3JlYXRlZChRV2ViRnJhbWVQcml2YXRlOjpraXQo
ZnJhbWUpKTsKK30KKworYm9vbCBRV2ViUGFnZVByaXZhdGU6OmVycm9yUGFnZUV4dGVuc2lvbihR
V2ViUGFnZUFkYXB0ZXI6OkVycm9yUGFnZU9wdGlvbiAqb3B0LCBRV2ViUGFnZUFkYXB0ZXI6OkVy
cm9yUGFnZVJldHVybiAqb3V0KQoreworICAgIFFXZWJQYWdlOjpFcnJvclBhZ2VFeHRlbnNpb25P
cHRpb24gb3B0aW9uOworICAgIGlmIChvcHQtPmRvbWFpbiA9PSBRTGF0aW4xU3RyaW5nKCJRdE5l
dHdvcmsiKSkKKyAgICAgICAgb3B0aW9uLmRvbWFpbiA9IFFXZWJQYWdlOjpRdE5ldHdvcms7Cisg
ICAgZWxzZSBpZiAob3B0LT5kb21haW4gPT0gUUxhdGluMVN0cmluZygiSFRUUCIpKQorICAgICAg
ICBvcHRpb24uZG9tYWluID0gUVdlYlBhZ2U6Okh0dHA7CisgICAgZWxzZSBpZiAob3B0LT5kb21h
aW4gPT0gUUxhdGluMVN0cmluZygiV2ViS2l0IikpCisgICAgICAgIG9wdGlvbi5kb21haW4gPSBR
V2ViUGFnZTo6V2ViS2l0OworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIG9w
dGlvbi51cmwgPSBvcHQtPnVybDsKKyAgICBvcHRpb24uZnJhbWUgPSBRV2ViRnJhbWVQcml2YXRl
OjpraXQob3B0LT5mcmFtZSk7CisgICAgb3B0aW9uLmVycm9yID0gb3B0LT5lcnJvcjsKKyAgICBv
cHRpb24uZXJyb3JTdHJpbmcgPSBvcHQtPmVycm9yU3RyaW5nOworICAgIFFXZWJQYWdlOjpFcnJv
clBhZ2VFeHRlbnNpb25SZXR1cm4gb3V0cHV0OworICAgIGlmICghcS0+ZXh0ZW5zaW9uKFFXZWJQ
YWdlOjpFcnJvclBhZ2VFeHRlbnNpb24sICZvcHRpb24sICZvdXRwdXQpKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgb3V0LT5iYXNlVXJsID0gb3V0cHV0LmJhc2VVcmw7CisgICAgb3V0LT5j
b250ZW50ID0gb3V0cHV0LmNvbnRlbnQ7CisgICAgb3V0LT5jb250ZW50VHlwZSA9IG91dHB1dC5j
b250ZW50VHlwZTsKKyAgICBvdXQtPmVuY29kaW5nID0gb3V0cHV0LmVuY29kaW5nOworICAgIHJl
dHVybiB0cnVlOworfQorCitRdFBsdWdpbldpZGdldEFkYXB0ZXIgKlFXZWJQYWdlUHJpdmF0ZTo6
Y3JlYXRlUGx1Z2luKGNvbnN0IFFTdHJpbmcgJmNsYXNzaWQsIGNvbnN0IFFVcmwgJnVybCwgY29u
c3QgUVN0cmluZ0xpc3QgJnBhcmFtTmFtZXMsIGNvbnN0IFFTdHJpbmdMaXN0ICZwYXJhbVZhbHVl
cykKK3sKKyAgICBRT2JqZWN0ICp3aWRnZXQgPSBxLT5jcmVhdGVQbHVnaW4oY2xhc3NpZCwgdXJs
LCBwYXJhbU5hbWVzLCBwYXJhbVZhbHVlcyk7CisgICAgcmV0dXJuIGFkYXB0ZXJGb3JXaWRnZXQo
d2lkZ2V0KTsKK30KKworUXRQbHVnaW5XaWRnZXRBZGFwdGVyICpRV2ViUGFnZVByaXZhdGU6OmFk
YXB0ZXJGb3JXaWRnZXQoUU9iamVjdCAqb2JqZWN0KSBjb25zdAoreworICAgIGlmIChRV2lkZ2V0
ICp3aWRnZXQgPSBxb2JqZWN0X2Nhc3Q8UVdpZGdldCo+KG9iamVjdCkpCisgICAgICAgIHJldHVy
biBuZXcgUVdpZGdldFBsdWdpbkltcGwod2lkZ2V0KTsKKyAgICBpZiAoUUdyYXBoaWNzV2lkZ2V0
ICp3aWRnZXQgPSBxb2JqZWN0X2Nhc3Q8UUdyYXBoaWNzV2lkZ2V0Kj4ob2JqZWN0KSkKKyAgICAg
ICAgcmV0dXJuIG5ldyBRR3JhcGhpY3NXaWRnZXRQbHVnaW5JbXBsKHdpZGdldCk7CisgICAgcmV0
dXJuIDA7Cit9CisKK3ZvaWQgUVdlYlBhZ2VQcml2YXRlOjpjcmVhdGVNYWluRnJhbWUoKQorewor
ICAgIGlmICghbWFpbkZyYW1lKSB7CisgICAgICAgIG1haW5GcmFtZSA9IG5ldyBRV2ViRnJhbWUo
cSk7CisgICAgICAgIGVtaXQgcS0+ZnJhbWVDcmVhdGVkKG1haW5GcmFtZS5kYXRhKCkpOworICAg
IH0KK30KKworI2RlZmluZSBNQVBfV0VCX0FDVElPTl9GUk9NX0FEQVBURVJfRVFVSVZBTEVOVChO
YW1lLCBWYWx1ZSkgXAorICAgIGNhc2UgUVdlYlBhZ2VBZGFwdGVyOjpOYW1lOiByZXR1cm4gUVdl
YlBhZ2U6Ok5hbWUKKworc3RhdGljIFFXZWJQYWdlOjpXZWJBY3Rpb24gd2ViQWN0aW9uRm9yQWRh
cHRlck1lbnVBY3Rpb24oUVdlYlBhZ2VBZGFwdGVyOjpNZW51QWN0aW9uIGFjdGlvbikKK3sKKyAg
ICBzd2l0Y2ggKGFjdGlvbikgeworICAgIEZPUl9FQUNIX01BUFBFRF9NRU5VX0FDVElPTihNQVBf
V0VCX0FDVElPTl9GUk9NX0FEQVBURVJfRVFVSVZBTEVOVCwgU0VNSUNPTE9OX1NFUEFSQVRPUik7
CisjaWYgRU5BQkxFKElOU1BFQ1RPUikKKyAgICBjYXNlIFFXZWJQYWdlQWRhcHRlcjo6SW5zcGVj
dEVsZW1lbnQ6IHJldHVybiBRV2ViUGFnZTo6SW5zcGVjdEVsZW1lbnQ7CisjZW5kaWYKKyAgICBk
ZWZhdWx0OgorICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgfQorICAgIHJldHVybiBRV2ViUGFnZTo6Tm9XZWJBY3Rpb247Cit9CisKKyNkZWZpbmUgTUFQ
X0FEQVBURVJfQUNUSU9OX0ZST01fV0VCQUNUSU9OX0VRVUlWQUxFTlQoTmFtZSwgVmFsdWUpIFwK
KyAgICBjYXNlIFFXZWJQYWdlOjpOYW1lOiByZXR1cm4gUVdlYlBhZ2VBZGFwdGVyOjpOYW1lCisK
K3N0YXRpYyBRV2ViUGFnZUFkYXB0ZXI6Ok1lbnVBY3Rpb24gYWRhcHRlck1lbnVBY3Rpb25Gb3JX
ZWJBY3Rpb24oUVdlYlBhZ2U6OldlYkFjdGlvbiBhY3Rpb24pCit7CisgICAgc3dpdGNoIChhY3Rp
b24pIHsKKyAgICBGT1JfRUFDSF9NQVBQRURfTUVOVV9BQ1RJT04oTUFQX0FEQVBURVJfQUNUSU9O
X0ZST01fV0VCQUNUSU9OX0VRVUlWQUxFTlQsIFNFTUlDT0xPTl9TRVBBUkFUT1IpOworI2lmIEVO
QUJMRShJTlNQRUNUT1IpCisgICAgY2FzZSBRV2ViUGFnZTo6SW5zcGVjdEVsZW1lbnQ6IHJldHVy
biBRV2ViUGFnZUFkYXB0ZXI6Okluc3BlY3RFbGVtZW50OworI2VuZGlmCisgICAgZGVmYXVsdDoK
KyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAg
ICByZXR1cm4gUVdlYlBhZ2VBZGFwdGVyOjpOb0FjdGlvbjsKK30KKworI2lmbmRlZiBRVF9OT19D
T05URVhUTUVOVQordHlwZWRlZiBRV2ViUGFnZUFkYXB0ZXI6Ok1lbnVJdGVtRGVzY3JpcHRpb24g
TWVudUl0ZW07CitRTWVudSAqY3JlYXRlQ29udGV4dE1lbnUoUVdlYlBhZ2UqIHBhZ2UsIGNvbnN0
IFFMaXN0PE1lbnVJdGVtPiYgaXRlbXMsIFFCaXRBcnJheSAqdmlzaXRlZFdlYkFjdGlvbnMpCit7
CisgICAgaWYgKGl0ZW1zLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBRTWVu
dSogbWVudSA9IG5ldyBRTWVudShwYWdlLT52aWV3KCkpOworICAgIGZvciAoaW50IGkgPSAwOyBp
IDwgaXRlbXMuY291bnQoKTsgKytpKSB7CisgICAgICAgIGNvbnN0IE1lbnVJdGVtICZpdGVtID0g
aXRlbXMuYXQoaSk7CisgICAgICAgIHN3aXRjaCAoaXRlbS50eXBlKSB7CisgICAgICAgIGNhc2Ug
TWVudUl0ZW06OkFjdGlvbjogeworICAgICAgICAgICAgUVdlYlBhZ2U6OldlYkFjdGlvbiBhY3Rp
b24gPSB3ZWJBY3Rpb25Gb3JBZGFwdGVyTWVudUFjdGlvbihpdGVtLmFjdGlvbik7CisgICAgICAg
ICAgICBRQWN0aW9uICphID0gcGFnZS0+YWN0aW9uKGFjdGlvbik7CisgICAgICAgICAgICBpZiAo
YSkgeworICAgICAgICAgICAgICAgIGEtPnNldEVuYWJsZWQoaXRlbS50cmFpdHMgJiBNZW51SXRl
bTo6RW5hYmxlZCk7CisgICAgICAgICAgICAgICAgYS0+c2V0Q2hlY2thYmxlKGl0ZW0udHJhaXRz
ICYgTWVudUl0ZW06OkNoZWNrYWJsZSk7CisgICAgICAgICAgICAgICAgYS0+c2V0Q2hlY2tlZChp
dGVtLnRyYWl0cyAmIE1lbnVJdGVtOjpDaGVja2VkKTsKKworICAgICAgICAgICAgICAgIG1lbnUt
PmFkZEFjdGlvbihhKTsKKyAgICAgICAgICAgICAgICB2aXNpdGVkV2ViQWN0aW9ucy0+c2V0Qml0
KGFjdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQor
ICAgICAgICBjYXNlIE1lbnVJdGVtOjpTZXBhcmF0b3I6CisgICAgICAgICAgICBtZW51LT5hZGRT
ZXBhcmF0b3IoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1lbnVJdGVtOjpT
dWJNZW51OiB7CisgICAgICAgICAgICBRTWVudSAqc3ViTWVudSA9IGNyZWF0ZUNvbnRleHRNZW51
KHBhZ2UsIGl0ZW0uc3ViTWVudSwgdmlzaXRlZFdlYkFjdGlvbnMpOworICAgICAgICAgICAgUV9B
U1NFUlQoc3ViTWVudSk7CisKKyAgICAgICAgICAgIGJvb2wgYW55RW5hYmxlZEFjdGlvbiA9IGZh
bHNlOworCisgICAgICAgICAgICBRTGlzdDxRQWN0aW9uICo+IGFjdGlvbnMgPSBzdWJNZW51LT5h
Y3Rpb25zKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFjdGlvbnMuY291bnQo
KTsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKGFjdGlvbnMuYXQoaSktPmlzVmlzaWJsZSgp
KQorICAgICAgICAgICAgICAgICAgICBhbnlFbmFibGVkQWN0aW9uIHw9IGFjdGlvbnMuYXQoaSkt
PmlzRW5hYmxlZCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBkb24ndCBzaG93
IHN1Yi1tZW51cyB3aXRoIGp1c3QgZGlzYWJsZWQgYWN0aW9ucworICAgICAgICAgICAgaWYgKGFu
eUVuYWJsZWRBY3Rpb24pIHsKKyAgICAgICAgICAgICAgICBzdWJNZW51LT5zZXRUaXRsZShpdGVt
LnN1Yk1lbnVUaXRsZSk7CisgICAgICAgICAgICAgICAgbWVudS0+YWRkQWN0aW9uKHN1Yk1lbnUt
Pm1lbnVBY3Rpb24oKSk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBkZWxl
dGUgc3ViTWVudTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIH0KKyAg
ICB9CisgICAgcmV0dXJuIG1lbnU7Cit9CisjZW5kaWYgLy8gUVRfTk9fQ09OVEVYVE1FTlUKKwor
dm9pZCBRV2ViUGFnZVByaXZhdGU6OmNyZWF0ZUFuZFNldEN1cnJlbnRDb250ZXh0TWVudShjb25z
dCBRTGlzdDxNZW51SXRlbURlc2NyaXB0aW9uPiYgaXRlbXMsIFFCaXRBcnJheSogdmlzaXRlZFdl
YkFjdGlvbnMpCit7CisjaWZuZGVmIFFUX05PX0NPTlRFWFRNRU5VCisgICAgZGVsZXRlIGN1cnJl
bnRDb250ZXh0TWVudS5kYXRhKCk7CisKKyAgICBjdXJyZW50Q29udGV4dE1lbnUgPSBjcmVhdGVD
b250ZXh0TWVudShxLCBpdGVtcywgdmlzaXRlZFdlYkFjdGlvbnMpOworI2Vsc2UKKyAgICBRX1VO
VVNFRChtZW51RGVzY3JpcHRpb24pOworICAgIFFfVU5VU0VEKHZpc2l0ZWRXZWJBY3Rpb25zKTsK
KyNlbmRpZiAvLyBRVF9OT19DT05URVhUTUVOVQorfQorCisjaWZuZGVmIFFUX05PX0FDVElPTgor
dm9pZCBRV2ViUGFnZVByaXZhdGU6Ol9xX3dlYkFjdGlvblRyaWdnZXJlZChib29sIGNoZWNrZWQp
Cit7CisgICAgUUFjdGlvbiAqYSA9IHFvYmplY3RfY2FzdDxRQWN0aW9uICo+KHEtPnNlbmRlcigp
KTsKKyAgICBpZiAoIWEpCisgICAgICAgIHJldHVybjsKKyAgICBRV2ViUGFnZTo6V2ViQWN0aW9u
IGFjdGlvbiA9IHN0YXRpY19jYXN0PFFXZWJQYWdlOjpXZWJBY3Rpb24+KGEtPmRhdGEoKS50b0lu
dCgpKTsKKyAgICBxLT50cmlnZ2VyQWN0aW9uKGFjdGlvbiwgY2hlY2tlZCk7Cit9CisjZW5kaWYg
Ly8gUVRfTk9fQUNUSU9OCisKK3ZvaWQgUVdlYlBhZ2VQcml2YXRlOjp1cGRhdGVBY3Rpb24oUVdl
YlBhZ2U6OldlYkFjdGlvbiBhY3Rpb24pCit7CisjaWZkZWYgUVRfTk9fQUNUSU9OCisgICAgUV9V
TlVTRUQoYWN0aW9uKQorI2Vsc2UKKyAgICBRQWN0aW9uICphID0gYWN0aW9uc1thY3Rpb25dOwor
ICAgIGlmICghYSB8fCAhbWFpbkZyYW1lKQorICAgICAgICByZXR1cm47CisKKyAgICBib29sIGVu
YWJsZWQgPSBhLT5pc0VuYWJsZWQoKTsKKyAgICBib29sIGNoZWNrZWQgPSBhLT5pc0NoZWNrZWQo
KTsKKworICAgIFFXZWJQYWdlQWRhcHRlcjo6TWVudUFjdGlvbiBtYXBwZWRBY3Rpb24gPSBRV2Vi
UGFnZUFkYXB0ZXI6Ok5vQWN0aW9uOworICAgIGNvbnN0IGNoYXIqIGNvbW1hbmROYW1lID0gMDsK
KworICAgIHN3aXRjaCAoYWN0aW9uKSB7CisgICAgY2FzZSBRV2ViUGFnZTo6QmFjazoKKyAgICBj
YXNlIFFXZWJQYWdlOjpGb3J3YXJkOgorICAgIGNhc2UgUVdlYlBhZ2U6OlN0b3A6CisgICAgY2Fz
ZSBRV2ViUGFnZTo6UmVsb2FkOgorICAgIGNhc2UgUVdlYlBhZ2U6OlNldFRleHREaXJlY3Rpb25E
ZWZhdWx0OgorICAgIGNhc2UgUVdlYlBhZ2U6OlNldFRleHREaXJlY3Rpb25MZWZ0VG9SaWdodDoK
KyAgICBjYXNlIFFXZWJQYWdlOjpTZXRUZXh0RGlyZWN0aW9uUmlnaHRUb0xlZnQ6CisgICAgICAg
IG1hcHBlZEFjdGlvbiA9IGFkYXB0ZXJNZW51QWN0aW9uRm9yV2ViQWN0aW9uKGFjdGlvbik7Cisg
ICAgICAgIGJyZWFrOworICAgIGNhc2UgUVdlYlBhZ2U6OlJlbG9hZEFuZEJ5cGFzc0NhY2hlOiAv
LyBNYW51YWwgbWFwcGluZworICAgICAgICBtYXBwZWRBY3Rpb24gPSBRV2ViUGFnZUFkYXB0ZXI6
OlJlbG9hZDsKKyAgICAgICAgYnJlYWs7CisjaWZuZGVmIFFUX05PX1VORE9TVEFDSworICAgICAg
ICBjYXNlIFFXZWJQYWdlOjpVbmRvOgorICAgICAgICBjYXNlIFFXZWJQYWdlOjpSZWRvOgorICAg
ICAgICAgICAgLy8gdGhvc2UgdHdvIGFyZSBoYW5kbGVkIGJ5IFFVbmRvU3RhY2sKKyAgICAgICAg
ICAgIGJyZWFrOworI2VuZGlmIC8vIFFUX05PX1VORE9TVEFDSworICAgICAgICBjYXNlIFFXZWJQ
YWdlOjpTZWxlY3RBbGw6IC8vIGVkaXRvciBjb21tYW5kIGlzIGFsd2F5cyBlbmFibGVkCisgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgLy8gc2VlIGlm
IGl0J3MgYW4gZWRpdG9yIGNvbW1hbmQKKyAgICAgICAgICAgIGNvbW1hbmROYW1lID0gZWRpdG9y
Q29tbWFuZEZvcldlYkFjdGlvbnMoYWN0aW9uKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICB9CisgICAgfQorICAgIGlmIChtYXBwZWRBY3Rpb24gIT0gUVdlYlBhZ2VBZGFwdGVyOjpOb0Fj
dGlvbiB8fCBjb21tYW5kTmFtZSkKKyAgICAgICAgdXBkYXRlQWN0aW9uSW50ZXJuYWwobWFwcGVk
QWN0aW9uLCBjb21tYW5kTmFtZSwgJmVuYWJsZWQsICZjaGVja2VkKTsKKworICAgIGEtPnNldEVu
YWJsZWQoZW5hYmxlZCk7CisKKyAgICBpZiAoYS0+aXNDaGVja2FibGUoKSkKKyAgICAgICAgYS0+
c2V0Q2hlY2tlZChjaGVja2VkKTsKKyNlbmRpZiAvLyBRVF9OT19BQ1RJT04KK30KKwordm9pZCBR
V2ViUGFnZVByaXZhdGU6OnVwZGF0ZU5hdmlnYXRpb25BY3Rpb25zKCkKK3sKKyAgICB1cGRhdGVB
Y3Rpb24oUVdlYlBhZ2U6OkJhY2spOworICAgIHVwZGF0ZUFjdGlvbihRV2ViUGFnZTo6Rm9yd2Fy
ZCk7CisgICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpTdG9wKTsKKyAgICB1cGRhdGVBY3Rpb24o
UVdlYlBhZ2U6OlJlbG9hZCk7CisgICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpSZWxvYWRBbmRC
eXBhc3NDYWNoZSk7Cit9CisKK1FPYmplY3QgKlFXZWJQYWdlUHJpdmF0ZTo6aW5zcGVjdG9ySGFu
ZGxlKCkKK3sKKyAgICByZXR1cm4gZ2V0T3JDcmVhdGVJbnNwZWN0b3IoKTsKK30KKwordm9pZCBR
V2ViUGFnZVByaXZhdGU6OnNldEluc3BlY3RvckZyb250ZW5kKFFPYmplY3QqIGZyb250ZW5kKQor
eworICAgIGluc3BlY3RvckZyb250ZW5kID0gcW9iamVjdF9jYXN0PFFXaWRnZXQqPihmcm9udGVu
ZCk7CisgICAgaWYgKGluc3BlY3RvcikKKyAgICAgICAgaW5zcGVjdG9yLT5kLT5zZXRGcm9udGVu
ZChmcm9udGVuZCk7Cit9CisKK3ZvaWQgUVdlYlBhZ2VQcml2YXRlOjpzZXRJbnNwZWN0b3JXaW5k
b3dUaXRsZShjb25zdCBRU3RyaW5nJiB0aXRsZSkKK3sKKyAgICBpZiAoaW5zcGVjdG9yKQorICAg
ICAgICBpbnNwZWN0b3ItPnNldFdpbmRvd1RpdGxlKHRpdGxlKTsKK30KKwordm9pZCBRV2ViUGFn
ZVByaXZhdGU6OmNyZWF0ZVdlYkluc3BlY3RvcihRT2JqZWN0KiogaW5zcGVjdG9yVmlldywgUVdl
YlBhZ2VBZGFwdGVyKiogaW5zcGVjdG9yUGFnZSkKK3sKKyAgICBRV2ViUGFnZSogcGFnZSA9IG5l
dyBXZWJLaXQ6Okluc3BlY3RvckNsaWVudFdlYlBhZ2U7CisgICAgKmluc3BlY3RvclZpZXcgPSBw
YWdlLT52aWV3KCk7CisgICAgKmluc3BlY3RvclBhZ2UgPSBwYWdlLT5kOworfQorCisjaWZuZGVm
IFFUX05PX01FTlUKK3N0YXRpYyBRU3RyaW5nTGlzdCBpdGVyYXRlQ29udGV4dE1lbnUoUU1lbnUq
IG1lbnUpCit7CisgICAgaWYgKCFtZW51KQorICAgICAgICByZXR1cm4gUVN0cmluZ0xpc3QoKTsK
KworICAgIFFTdHJpbmdMaXN0IGl0ZW1zOworICAgIFFMaXN0PFFBY3Rpb24gKj4gYWN0aW9ucyA9
IG1lbnUtPmFjdGlvbnMoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGFjdGlvbnMuY291bnQo
KTsgKytpKSB7CisgICAgICAgIGlmIChhY3Rpb25zLmF0KGkpLT5pc1NlcGFyYXRvcigpKQorICAg
ICAgICAgICAgaXRlbXMgPDwgUUxhdGluMVN0cmluZygiPHNlcGFyYXRvcj4iKTsKKyAgICAgICAg
ZWxzZQorICAgICAgICAgICAgaXRlbXMgPDwgYWN0aW9ucy5hdChpKS0+dGV4dCgpOworICAgICAg
ICBpZiAoYWN0aW9ucy5hdChpKS0+bWVudSgpKQorICAgICAgICAgICAgaXRlbXMgPDwgaXRlcmF0
ZUNvbnRleHRNZW51KGFjdGlvbnMuYXQoaSktPm1lbnUoKSk7CisgICAgfQorICAgIHJldHVybiBp
dGVtczsKK30KKyNlbmRpZgorCitRU3RyaW5nTGlzdCBRV2ViUGFnZVByaXZhdGU6Om1lbnVBY3Rp
b25zQXNUZXh0KCkKK3sKKyNpZm5kZWYgUVRfTk9fTUVOVQorICAgIHJldHVybiBpdGVyYXRlQ29u
dGV4dE1lbnUoY3VycmVudENvbnRleHRNZW51LmRhdGEoKSk7CisjZWxzZQorICAgIHJldHVybiBR
U3RyaW5nTGlzdCgpOworI2VuZGlmCit9CisKK3ZvaWQgUVdlYlBhZ2VQcml2YXRlOjplbWl0Vmll
d3BvcnRDaGFuZ2VSZXF1ZXN0ZWQoKQoreworICAgIGVtaXQgcS0+dmlld3BvcnRDaGFuZ2VSZXF1
ZXN0ZWQoKTsKK30KKwordm9pZCBRV2ViUGFnZVByaXZhdGU6OnVwZGF0ZUVkaXRvckFjdGlvbnMo
KQoreworICAgIHVwZGF0ZUFjdGlvbihRV2ViUGFnZTo6Q3V0KTsKKyAgICB1cGRhdGVBY3Rpb24o
UVdlYlBhZ2U6OkNvcHkpOworICAgIHVwZGF0ZUFjdGlvbihRV2ViUGFnZTo6UGFzdGUpOworICAg
IHVwZGF0ZUFjdGlvbihRV2ViUGFnZTo6TW92ZVRvTmV4dENoYXIpOworICAgIHVwZGF0ZUFjdGlv
bihRV2ViUGFnZTo6TW92ZVRvUHJldmlvdXNDaGFyKTsKKyAgICB1cGRhdGVBY3Rpb24oUVdlYlBh
Z2U6Ok1vdmVUb05leHRXb3JkKTsKKyAgICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6Ok1vdmVUb1By
ZXZpb3VzV29yZCk7CisgICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpNb3ZlVG9OZXh0TGluZSk7
CisgICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpNb3ZlVG9QcmV2aW91c0xpbmUpOworICAgIHVw
ZGF0ZUFjdGlvbihRV2ViUGFnZTo6TW92ZVRvU3RhcnRPZkxpbmUpOworICAgIHVwZGF0ZUFjdGlv
bihRV2ViUGFnZTo6TW92ZVRvRW5kT2ZMaW5lKTsKKyAgICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6
Ok1vdmVUb1N0YXJ0T2ZCbG9jayk7CisgICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpNb3ZlVG9F
bmRPZkJsb2NrKTsKKyAgICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6Ok1vdmVUb1N0YXJ0T2ZEb2N1
bWVudCk7CisgICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpNb3ZlVG9FbmRPZkRvY3VtZW50KTsK
KyAgICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6OlNlbGVjdE5leHRDaGFyKTsKKyAgICB1cGRhdGVB
Y3Rpb24oUVdlYlBhZ2U6OlNlbGVjdFByZXZpb3VzQ2hhcik7CisgICAgdXBkYXRlQWN0aW9uKFFX
ZWJQYWdlOjpTZWxlY3ROZXh0V29yZCk7CisgICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpTZWxl
Y3RQcmV2aW91c1dvcmQpOworICAgIHVwZGF0ZUFjdGlvbihRV2ViUGFnZTo6U2VsZWN0TmV4dExp
bmUpOworICAgIHVwZGF0ZUFjdGlvbihRV2ViUGFnZTo6U2VsZWN0UHJldmlvdXNMaW5lKTsKKyAg
ICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6OlNlbGVjdFN0YXJ0T2ZMaW5lKTsKKyAgICB1cGRhdGVB
Y3Rpb24oUVdlYlBhZ2U6OlNlbGVjdEVuZE9mTGluZSk7CisgICAgdXBkYXRlQWN0aW9uKFFXZWJQ
YWdlOjpTZWxlY3RTdGFydE9mQmxvY2spOworICAgIHVwZGF0ZUFjdGlvbihRV2ViUGFnZTo6U2Vs
ZWN0RW5kT2ZCbG9jayk7CisgICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpTZWxlY3RTdGFydE9m
RG9jdW1lbnQpOworICAgIHVwZGF0ZUFjdGlvbihRV2ViUGFnZTo6U2VsZWN0RW5kT2ZEb2N1bWVu
dCk7CisgICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpEZWxldGVTdGFydE9mV29yZCk7CisgICAg
dXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpEZWxldGVFbmRPZldvcmQpOworICAgIHVwZGF0ZUFjdGlv
bihRV2ViUGFnZTo6U2V0VGV4dERpcmVjdGlvbkRlZmF1bHQpOworICAgIHVwZGF0ZUFjdGlvbihR
V2ViUGFnZTo6U2V0VGV4dERpcmVjdGlvbkxlZnRUb1JpZ2h0KTsKKyAgICB1cGRhdGVBY3Rpb24o
UVdlYlBhZ2U6OlNldFRleHREaXJlY3Rpb25SaWdodFRvTGVmdCk7CisgICAgdXBkYXRlQWN0aW9u
KFFXZWJQYWdlOjpUb2dnbGVCb2xkKTsKKyAgICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6OlRvZ2ds
ZUl0YWxpYyk7CisgICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpUb2dnbGVVbmRlcmxpbmUpOwor
ICAgIHVwZGF0ZUFjdGlvbihRV2ViUGFnZTo6SW5zZXJ0UGFyYWdyYXBoU2VwYXJhdG9yKTsKKyAg
ICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6Okluc2VydExpbmVTZXBhcmF0b3IpOworICAgIHVwZGF0
ZUFjdGlvbihRV2ViUGFnZTo6UGFzdGVBbmRNYXRjaFN0eWxlKTsKKyAgICB1cGRhdGVBY3Rpb24o
UVdlYlBhZ2U6OlJlbW92ZUZvcm1hdCk7CisgICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpUb2dn
bGVTdHJpa2V0aHJvdWdoKTsKKyAgICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6OlRvZ2dsZVN1YnNj
cmlwdCk7CisgICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpUb2dnbGVTdXBlcnNjcmlwdCk7Cisg
ICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpJbnNlcnRVbm9yZGVyZWRMaXN0KTsKKyAgICB1cGRh
dGVBY3Rpb24oUVdlYlBhZ2U6Okluc2VydE9yZGVyZWRMaXN0KTsKKyAgICB1cGRhdGVBY3Rpb24o
UVdlYlBhZ2U6OkluZGVudCk7CisgICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpPdXRkZW50KTsK
KyAgICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6OkFsaWduQ2VudGVyKTsKKyAgICB1cGRhdGVBY3Rp
b24oUVdlYlBhZ2U6OkFsaWduSnVzdGlmaWVkKTsKKyAgICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6
OkFsaWduTGVmdCk7CisgICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpBbGlnblJpZ2h0KTsKK30K
Kwordm9pZCBRV2ViUGFnZVByaXZhdGU6OnRpbWVyRXZlbnQoUVRpbWVyRXZlbnQgKmV2KQorewor
ICAgIGludCB0aW1lcklkID0gZXYtPnRpbWVySWQoKTsKKyAgICBpZiAodGltZXJJZCA9PSB0cmlw
bGVDbGlja1RpbWVyLnRpbWVySWQoKSkKKyAgICAgICAgdHJpcGxlQ2xpY2tUaW1lci5zdG9wKCk7
CisgICAgZWxzZQorICAgICAgICBxLT50aW1lckV2ZW50KGV2KTsKK30KKworYm9vbCBRV2ViUGFn
ZVByaXZhdGU6OnJlcXVlc3RTb2Z0d2FyZUlucHV0UGFuZWwoKSBjb25zdAoreworICAgIHJldHVy
biBRU3R5bGU6OlJlcXVlc3RTb2Z0d2FyZUlucHV0UGFuZWwoY2xpZW50LT5zdHlsZSgpLT5zdHls
ZUhpbnQoUVN0eWxlOjpTSF9SZXF1ZXN0U29mdHdhcmVJbnB1dFBhbmVsKSkgPT0gUVN0eWxlOjpS
U0lQX09uTW91c2VDbGljazsKK30KKworI2lmbmRlZiBRVF9OT19DT05URVhUTUVOVQordm9pZCBR
V2ViUGFnZVByaXZhdGU6OmNvbnRleHRNZW51RXZlbnQoY29uc3QgUVBvaW50JiBnbG9iYWxQb3Mp
Cit7CisgICAgUU1lbnUgKm1lbnUgPSBxLT5jcmVhdGVTdGFuZGFyZENvbnRleHRNZW51KCk7Cisg
ICAgaWYgKG1lbnUpIHsKKyAgICAgICAgbWVudS0+ZXhlYyhnbG9iYWxQb3MpOworICAgICAgICBk
ZWxldGUgbWVudTsKKyAgICB9Cit9CisjZW5kaWYgLy8gUVRfTk9fQ09OVEVYVE1FTlUKKworLyoh
CisgICAgXHNpbmNlIDQuNQorICAgIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyB0aGUgc3RhbmRhcmQg
Y29udGV4dCBtZW51IHdoaWNoIGlzIHNob3duIHdoZW4KKyAgICB0aGUgdXNlciBjbGlja3Mgb24g
dGhlIHdlYiBwYWdlIHdpdGggdGhlIHJpZ2h0IG1vdXNlIGJ1dHRvbi4gSXQgaXMKKyAgICBjYWxs
ZWQgZnJvbSB0aGUgZGVmYXVsdCBjb250ZXh0TWVudUV2ZW50KCkgaGFuZGxlci4gVGhlIHBvcHVw
IG1lbnUncworICAgIG93bmVyc2hpcCBpcyB0cmFuc2ZlcnJlZCB0byB0aGUgY2FsbGVyLgorICov
CitRTWVudSAqUVdlYlBhZ2U6OmNyZWF0ZVN0YW5kYXJkQ29udGV4dE1lbnUoKQoreworI2lmbmRl
ZiBRVF9OT19DT05URVhUTUVOVQorICAgIFFNZW51KiBtZW51ID0gZC0+Y3VycmVudENvbnRleHRN
ZW51LmRhdGEoKTsKKyAgICBkLT5jdXJyZW50Q29udGV4dE1lbnUgPSAwOworICAgIHJldHVybiBt
ZW51OworI2Vsc2UKKyAgICByZXR1cm4gMDsKKyNlbmRpZgorfQorCisjaWZuZGVmIFFUX05PX1NI
T1JUQ1VUCitRV2ViUGFnZTo6V2ViQWN0aW9uIFFXZWJQYWdlUHJpdmF0ZTo6ZWRpdG9yQWN0aW9u
Rm9yS2V5RXZlbnQoUUtleUV2ZW50KiBldmVudCkKK3sKKyAgICBzdGF0aWMgc3RydWN0IHsKKyAg
ICAgICAgUUtleVNlcXVlbmNlOjpTdGFuZGFyZEtleSBzdGFuZGFyZEtleTsKKyAgICAgICAgUVdl
YlBhZ2U6OldlYkFjdGlvbiBhY3Rpb247CisgICAgfSBlZGl0b3JBY3Rpb25zW10gPSB7CisgICAg
ICAgIHsgUUtleVNlcXVlbmNlOjpDdXQsIFFXZWJQYWdlOjpDdXQgfSwKKyAgICAgICAgeyBRS2V5
U2VxdWVuY2U6OkNvcHksIFFXZWJQYWdlOjpDb3B5IH0sCisgICAgICAgIHsgUUtleVNlcXVlbmNl
OjpQYXN0ZSwgUVdlYlBhZ2U6OlBhc3RlIH0sCisgICAgICAgIHsgUUtleVNlcXVlbmNlOjpVbmRv
LCBRV2ViUGFnZTo6VW5kbyB9LAorICAgICAgICB7IFFLZXlTZXF1ZW5jZTo6UmVkbywgUVdlYlBh
Z2U6OlJlZG8gfSwKKyAgICAgICAgeyBRS2V5U2VxdWVuY2U6Ok1vdmVUb05leHRDaGFyLCBRV2Vi
UGFnZTo6TW92ZVRvTmV4dENoYXIgfSwKKyAgICAgICAgeyBRS2V5U2VxdWVuY2U6Ok1vdmVUb1By
ZXZpb3VzQ2hhciwgUVdlYlBhZ2U6Ok1vdmVUb1ByZXZpb3VzQ2hhciB9LAorICAgICAgICB7IFFL
ZXlTZXF1ZW5jZTo6TW92ZVRvTmV4dFdvcmQsIFFXZWJQYWdlOjpNb3ZlVG9OZXh0V29yZCB9LAor
ICAgICAgICB7IFFLZXlTZXF1ZW5jZTo6TW92ZVRvUHJldmlvdXNXb3JkLCBRV2ViUGFnZTo6TW92
ZVRvUHJldmlvdXNXb3JkIH0sCisgICAgICAgIHsgUUtleVNlcXVlbmNlOjpNb3ZlVG9OZXh0TGlu
ZSwgUVdlYlBhZ2U6Ok1vdmVUb05leHRMaW5lIH0sCisgICAgICAgIHsgUUtleVNlcXVlbmNlOjpN
b3ZlVG9QcmV2aW91c0xpbmUsIFFXZWJQYWdlOjpNb3ZlVG9QcmV2aW91c0xpbmUgfSwKKyAgICAg
ICAgeyBRS2V5U2VxdWVuY2U6Ok1vdmVUb1N0YXJ0T2ZMaW5lLCBRV2ViUGFnZTo6TW92ZVRvU3Rh
cnRPZkxpbmUgfSwKKyAgICAgICAgeyBRS2V5U2VxdWVuY2U6Ok1vdmVUb0VuZE9mTGluZSwgUVdl
YlBhZ2U6Ok1vdmVUb0VuZE9mTGluZSB9LAorICAgICAgICB7IFFLZXlTZXF1ZW5jZTo6TW92ZVRv
U3RhcnRPZkJsb2NrLCBRV2ViUGFnZTo6TW92ZVRvU3RhcnRPZkJsb2NrIH0sCisgICAgICAgIHsg
UUtleVNlcXVlbmNlOjpNb3ZlVG9FbmRPZkJsb2NrLCBRV2ViUGFnZTo6TW92ZVRvRW5kT2ZCbG9j
ayB9LAorICAgICAgICB7IFFLZXlTZXF1ZW5jZTo6TW92ZVRvU3RhcnRPZkRvY3VtZW50LCBRV2Vi
UGFnZTo6TW92ZVRvU3RhcnRPZkRvY3VtZW50IH0sCisgICAgICAgIHsgUUtleVNlcXVlbmNlOjpN
b3ZlVG9FbmRPZkRvY3VtZW50LCBRV2ViUGFnZTo6TW92ZVRvRW5kT2ZEb2N1bWVudCB9LAorICAg
ICAgICB7IFFLZXlTZXF1ZW5jZTo6U2VsZWN0TmV4dENoYXIsIFFXZWJQYWdlOjpTZWxlY3ROZXh0
Q2hhciB9LAorICAgICAgICB7IFFLZXlTZXF1ZW5jZTo6U2VsZWN0UHJldmlvdXNDaGFyLCBRV2Vi
UGFnZTo6U2VsZWN0UHJldmlvdXNDaGFyIH0sCisgICAgICAgIHsgUUtleVNlcXVlbmNlOjpTZWxl
Y3ROZXh0V29yZCwgUVdlYlBhZ2U6OlNlbGVjdE5leHRXb3JkIH0sCisgICAgICAgIHsgUUtleVNl
cXVlbmNlOjpTZWxlY3RQcmV2aW91c1dvcmQsIFFXZWJQYWdlOjpTZWxlY3RQcmV2aW91c1dvcmQg
fSwKKyAgICAgICAgeyBRS2V5U2VxdWVuY2U6OlNlbGVjdE5leHRMaW5lLCBRV2ViUGFnZTo6U2Vs
ZWN0TmV4dExpbmUgfSwKKyAgICAgICAgeyBRS2V5U2VxdWVuY2U6OlNlbGVjdFByZXZpb3VzTGlu
ZSwgUVdlYlBhZ2U6OlNlbGVjdFByZXZpb3VzTGluZSB9LAorICAgICAgICB7IFFLZXlTZXF1ZW5j
ZTo6U2VsZWN0U3RhcnRPZkxpbmUsIFFXZWJQYWdlOjpTZWxlY3RTdGFydE9mTGluZSB9LAorICAg
ICAgICB7IFFLZXlTZXF1ZW5jZTo6U2VsZWN0RW5kT2ZMaW5lLCBRV2ViUGFnZTo6U2VsZWN0RW5k
T2ZMaW5lIH0sCisgICAgICAgIHsgUUtleVNlcXVlbmNlOjpTZWxlY3RTdGFydE9mQmxvY2ssIFFX
ZWJQYWdlOjpTZWxlY3RTdGFydE9mQmxvY2sgfSwKKyAgICAgICAgeyBRS2V5U2VxdWVuY2U6OlNl
bGVjdEVuZE9mQmxvY2ssICBRV2ViUGFnZTo6U2VsZWN0RW5kT2ZCbG9jayB9LAorICAgICAgICB7
IFFLZXlTZXF1ZW5jZTo6U2VsZWN0U3RhcnRPZkRvY3VtZW50LCBRV2ViUGFnZTo6U2VsZWN0U3Rh
cnRPZkRvY3VtZW50IH0sCisgICAgICAgIHsgUUtleVNlcXVlbmNlOjpTZWxlY3RFbmRPZkRvY3Vt
ZW50LCBRV2ViUGFnZTo6U2VsZWN0RW5kT2ZEb2N1bWVudCB9LAorICAgICAgICB7IFFLZXlTZXF1
ZW5jZTo6RGVsZXRlU3RhcnRPZldvcmQsIFFXZWJQYWdlOjpEZWxldGVTdGFydE9mV29yZCB9LAor
ICAgICAgICB7IFFLZXlTZXF1ZW5jZTo6RGVsZXRlRW5kT2ZXb3JkLCBRV2ViUGFnZTo6RGVsZXRl
RW5kT2ZXb3JkIH0sCisgICAgICAgIHsgUUtleVNlcXVlbmNlOjpJbnNlcnRQYXJhZ3JhcGhTZXBh
cmF0b3IsIFFXZWJQYWdlOjpJbnNlcnRQYXJhZ3JhcGhTZXBhcmF0b3IgfSwKKyAgICAgICAgeyBR
S2V5U2VxdWVuY2U6Okluc2VydExpbmVTZXBhcmF0b3IsIFFXZWJQYWdlOjpJbnNlcnRMaW5lU2Vw
YXJhdG9yIH0sCisgICAgICAgIHsgUUtleVNlcXVlbmNlOjpTZWxlY3RBbGwsIFFXZWJQYWdlOjpT
ZWxlY3RBbGwgfSwKKyAgICAgICAgeyBRS2V5U2VxdWVuY2U6OlVua25vd25LZXksIFFXZWJQYWdl
OjpOb1dlYkFjdGlvbiB9CisgICAgfTsKKworICAgIGZvciAoaW50IGkgPSAwOyBlZGl0b3JBY3Rp
b25zW2ldLnN0YW5kYXJkS2V5ICE9IFFLZXlTZXF1ZW5jZTo6VW5rbm93bktleTsgKytpKQorICAg
ICAgICBpZiAoZXZlbnQgPT0gZWRpdG9yQWN0aW9uc1tpXS5zdGFuZGFyZEtleSkKKyAgICAgICAg
ICAgIHJldHVybiBlZGl0b3JBY3Rpb25zW2ldLmFjdGlvbjsKKworICAgIHJldHVybiBRV2ViUGFn
ZTo6Tm9XZWJBY3Rpb247Cit9CisjZW5kaWYgLy8gUVRfTk9fU0hPUlRDVVQKKwordm9pZCBRV2Vi
UGFnZVByaXZhdGU6OmtleVByZXNzRXZlbnQoUUtleUV2ZW50ICpldikKK3sKKyAgICAvLyB3ZSBm
b3J3YXJkIHRoZSBrZXkgZXZlbnQgdG8gV2ViQ29yZSBmaXJzdCB0byBoYW5kbGUgcG90ZW50aWFs
IERPTQorICAgIC8vIGRlZmluZWQgZXZlbnQgaGFuZGxlcnMgYW5kIGxhdGVyIG9uIGVuZCB1cCBp
biBFZGl0b3JDbGllbnRRdDo6aGFuZGxlS2V5Ym9hcmRFdmVudAorICAgIC8vIHRvIHRyaWdnZXIg
ZWRpdG9yIGNvbW1hbmRzIHZpYSB0cmlnZ2VyQWN0aW9uKCkuCisgICAgYm9vbCBoYW5kbGVkID0g
aGFuZGxlS2V5RXZlbnQoZXYpOworCisgICAgaWYgKCFoYW5kbGVkKSB7CisgICAgICAgIGhhbmRs
ZWQgPSB0cnVlOworICAgICAgICBpZiAoIWhhbmRsZVNjcm9sbGluZyhldikpIHsKKyAgICAgICAg
ICAgIHN3aXRjaCAoZXYtPmtleSgpKSB7CisgICAgICAgICAgICBjYXNlIFF0OjpLZXlfQmFjazoK
KyAgICAgICAgICAgICAgICBxLT50cmlnZ2VyQWN0aW9uKFFXZWJQYWdlOjpCYWNrKTsKKyAgICAg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUXQ6OktleV9Gb3J3YXJkOgorICAg
ICAgICAgICAgICAgIHEtPnRyaWdnZXJBY3Rpb24oUVdlYlBhZ2U6OkZvcndhcmQpOworICAgICAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRdDo6S2V5X1N0b3A6CisgICAgICAg
ICAgICAgICAgcS0+dHJpZ2dlckFjdGlvbihRV2ViUGFnZTo6U3RvcCk7CisgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFF0OjpLZXlfUmVmcmVzaDoKKyAgICAgICAgICAg
ICAgICBxLT50cmlnZ2VyQWN0aW9uKFFXZWJQYWdlOjpSZWxvYWQpOworICAgICAgICAgICAgICAg
IGJyZWFrOworICAgICAgICAgICAgY2FzZSBRdDo6S2V5X0JhY2tzcGFjZToKKyAgICAgICAgICAg
ICAgICBpZiAoZXYtPm1vZGlmaWVycygpID09IFF0OjpTaGlmdE1vZGlmaWVyKQorICAgICAgICAg
ICAgICAgICAgICBxLT50cmlnZ2VyQWN0aW9uKFFXZWJQYWdlOjpGb3J3YXJkKTsKKyAgICAgICAg
ICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHEtPnRyaWdnZXJBY3Rpb24oUVdlYlBh
Z2U6OkJhY2spOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoK
KyAgICAgICAgICAgICAgICBoYW5kbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBldi0+c2V0QWNjZXB0ZWQo
aGFuZGxlZCk7Cit9CisKK3ZvaWQgUVdlYlBhZ2VQcml2YXRlOjprZXlSZWxlYXNlRXZlbnQoUUtl
eUV2ZW50ICpldikKK3sKKyAgICBpZiAoZXYtPmlzQXV0b1JlcGVhdCgpKSB7CisgICAgICAgIGV2
LT5zZXRBY2NlcHRlZCh0cnVlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wg
aGFuZGxlZCA9IGhhbmRsZUtleUV2ZW50KGV2KTsKKyAgICBldi0+c2V0QWNjZXB0ZWQoaGFuZGxl
ZCk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFQ+Cit2b2lkIFFXZWJQYWdlUHJpdmF0ZTo6ZHJhZ0Vu
dGVyRXZlbnQoVCogZXYpCit7CisjaWZuZGVmIFFUX05PX0RSQUdBTkREUk9QCisgICAgUXQ6OkRy
b3BBY3Rpb24gYWN0aW9uID0gZHJhZ0VudGVyZWQoZXYtPm1pbWVEYXRhKCksIFFQb2ludEYoZXYt
PnBvcygpKS50b1BvaW50KCksIGV2LT5wb3NzaWJsZUFjdGlvbnMoKSk7CisgICAgZXYtPnNldERy
b3BBY3Rpb24oYWN0aW9uKTsKKyAgICBldi0+YWNjZXB0UHJvcG9zZWRBY3Rpb24oKTsKKyNlbmRp
ZgorfQorCit0ZW1wbGF0ZTxjbGFzcyBUPgordm9pZCBRV2ViUGFnZVByaXZhdGU6OmRyYWdNb3Zl
RXZlbnQoVCAqZXYpCit7CisjaWZuZGVmIFFUX05PX0RSQUdBTkREUk9QCisgICAgbV9sYXN0RHJv
cEFjdGlvbiA9IGRyYWdVcGRhdGVkKGV2LT5taW1lRGF0YSgpLCBRUG9pbnRGKGV2LT5wb3MoKSku
dG9Qb2ludCgpLCBldi0+cG9zc2libGVBY3Rpb25zKCkpOworICAgIGV2LT5zZXREcm9wQWN0aW9u
KG1fbGFzdERyb3BBY3Rpb24pOworICAgIGlmIChtX2xhc3REcm9wQWN0aW9uICE9IFF0OjpJZ25v
cmVBY3Rpb24pCisgICAgICAgIGV2LT5hY2NlcHQoKTsKKyNlbmRpZgorfQorCit0ZW1wbGF0ZTxj
bGFzcyBUPgordm9pZCBRV2ViUGFnZVByaXZhdGU6OmRyb3BFdmVudChUICpldikKK3sKKyNpZm5k
ZWYgUVRfTk9fRFJBR0FORERST1AKKyAgICBpZiAocGVyZm9ybURyYWcoZXYtPm1pbWVEYXRhKCks
IFFQb2ludEYoZXYtPnBvcygpKS50b1BvaW50KCksIGV2LT5wb3NzaWJsZUFjdGlvbnMoKSkpIHsK
KyAgICAgICAgZXYtPnNldERyb3BBY3Rpb24obV9sYXN0RHJvcEFjdGlvbik7CisgICAgICAgIGV2
LT5hY2NlcHQoKTsKKyAgICB9CisjZW5kaWYKK30KKwordm9pZCBRV2ViUGFnZVByaXZhdGU6Omxl
YXZlRXZlbnQoUUV2ZW50KikKK3sKKyAgICAvLyBGYWtlIGEgbW91c2UgbW92ZSBldmVudCBqdXN0
IG91dHNpZGUgb2YgdGhlIHdpZGdldCwgc2luY2UgYWxsCisgICAgLy8gdGhlIGludGVyZXN0aW5n
IG1vdXNlLW91dCBiZWhhdmlvciBsaWtlIGludmFsaWRhdGluZyBzY3JvbGxiYXJzCisgICAgLy8g
aXMgaGFuZGxlZCBieSB0aGUgV2ViS2l0IGV2ZW50IGhhbmRsZXIncyBtb3VzZU1vdmVkIGZ1bmN0
aW9uLgorICAgIFFNb3VzZUV2ZW50IGZha2VFdmVudChRRXZlbnQ6Ok1vdXNlTW92ZSwgUUN1cnNv
cjo6cG9zKCksIFF0OjpOb0J1dHRvbiwgUXQ6Ok5vQnV0dG9uLCBRdDo6Tm9Nb2RpZmllcik7Cisg
ICAgbW91c2VNb3ZlRXZlbnQoJmZha2VFdmVudCk7Cit9CisKKy8qIQorICAgIFxwcm9wZXJ0eSBR
V2ViUGFnZTo6cGFsZXR0ZQorICAgIFxicmllZiB0aGUgcGFnZSdzIHBhbGV0dGUKKworICAgIFRo
ZSBiYXNlIGJydXNoIG9mIHRoZSBwYWxldHRlIGlzIHVzZWQgdG8gZHJhdyB0aGUgYmFja2dyb3Vu
ZCBvZiB0aGUgbWFpbiBmcmFtZS4KKworICAgIEJ5IGRlZmF1bHQsIHRoaXMgcHJvcGVydHkgY29u
dGFpbnMgdGhlIGFwcGxpY2F0aW9uJ3MgZGVmYXVsdCBwYWxldHRlLgorKi8KK3ZvaWQgUVdlYlBh
Z2U6OnNldFBhbGV0dGUoY29uc3QgUVBhbGV0dGUgJnBhbCkKK3sKKyAgICBkLT5wYWxldHRlID0g
cGFsOworICAgIGlmICghZC0+bWFpbkZyYW1lIHx8ICFkLT5tYWluRnJhbWUuZGF0YSgpLT5kLT5o
YXNWaWV3KCkpCisgICAgICAgIHJldHVybjsKKworICAgIFFCcnVzaCBicnVzaCA9IHBhbC5icnVz
aChRUGFsZXR0ZTo6QmFzZSk7CisgICAgUUNvbG9yIGJhY2tncm91bmRDb2xvciA9IGJydXNoLnN0
eWxlKCkgPT0gUXQ6OlNvbGlkUGF0dGVybiA/IGJydXNoLmNvbG9yKCkgOiBRQ29sb3IoKTsKKyAg
ICBkLT5tYWluRnJhbWUuZGF0YSgpLT5kLT51cGRhdGVCYWNrZ3JvdW5kUmVjdXJzaXZlbHkoYmFj
a2dyb3VuZENvbG9yKTsKK30KKworUVBhbGV0dGUgUVdlYlBhZ2U6OnBhbGV0dGUoKSBjb25zdAor
eworICAgIHJldHVybiBkLT5wYWxldHRlOworfQorCit2b2lkIFFXZWJQYWdlUHJpdmF0ZTo6c2hv
cnRjdXRPdmVycmlkZUV2ZW50KFFLZXlFdmVudCogZXZlbnQpCit7CisgICAgaWYgKGhhbmRsZVNo
b3J0Y3V0T3ZlcnJpZGVFdmVudChldmVudCkpCisgICAgICAgIHJldHVybjsKKyNpZm5kZWYgUVRf
Tk9fU0hPUlRDVVQKKyAgICBpZiAoZWRpdG9yQWN0aW9uRm9yS2V5RXZlbnQoZXZlbnQpICE9IFFX
ZWJQYWdlOjpOb1dlYkFjdGlvbikKKyAgICAgICAgZXZlbnQtPmFjY2VwdCgpOworI2VuZGlmCisK
K30KKworYm9vbCBRV2ViUGFnZVByaXZhdGU6Omdlc3R1cmVFdmVudChRR2VzdHVyZUV2ZW50KiBl
dmVudCkKK3sKKyAgICBRV2ViRnJhbWVBZGFwdGVyKiBmcmFtZSA9IG1haW5GcmFtZS5kYXRhKCkt
PmQ7CisgICAgaWYgKCFmcmFtZS0+aGFzVmlldygpKQorICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgLy8gUUdlc3R1cmVFdmVudHMgY2FuIGNvbnRhaW4gdXBkYXRlcyBmb3IgbXVsdGlwbGUgZ2Vz
dHVyZXMuCisgICAgYm9vbCBoYW5kbGVkID0gZmFsc2U7CisjaWYgRU5BQkxFKEdFU1RVUkVfRVZF
TlRTKQorICAgIC8vIFFHZXN0dXJlRXZlbnQgbGl2ZXMgaW4gV2lkZ2V0cywgd2UnbGwgbmVlZCBh
IGR1bW15IHN0cnVjdCB0byBtdWxlIHRoZSBpbmZvIGl0IGNvbnRhaW5zIHRvIHRoZSAib3RoZXIg
c2lkZSIKKyAgICBRR2VzdHVyZUV2ZW50RmFjYWRlIGdlc3R1cmVGYWNhZGU7CisKKyAgICBRR2Vz
dHVyZSogZ2VzdHVyZSA9IGV2ZW50LT5nZXN0dXJlKFF0OjpUYXBHZXN0dXJlKTsKKyAgICAvLyBC
ZXdhcmUgdGhhdCBnZXN0dXJlcyBzZW5kIGJ5IER1bXBSZW5kZXJUcmVlIHdpbGwgaGF2ZSBzdGF0
ZSBRdDo6Tm9HZXN0dXJlLAorICAgIC8vIGR1ZSB0byBub3Qgb3JpZ2luYXRpbmcgZnJvbSBhIEdl
c3R1cmVSZWNvZ25pemVyLgorICAgIGlmIChnZXN0dXJlICYmIChnZXN0dXJlLT5zdGF0ZSgpID09
IFF0OjpHZXN0dXJlU3RhcnRlZCB8fCBnZXN0dXJlLT5zdGF0ZSgpID09IFF0OjpOb0dlc3R1cmUp
KSB7CisgICAgICAgIGdlc3R1cmVGYWNhZGUudHlwZSA9IFF0OjpUYXBHZXN0dXJlOworICAgICAg
ICBRUG9pbnRGIGdsb2JhbFBvcyA9IHN0YXRpY19jYXN0PGNvbnN0IFFUYXBHZXN0dXJlKj4oZ2Vz
dHVyZSktPnBvc2l0aW9uKCk7CisgICAgICAgIGdlc3R1cmVGYWNhZGUuZ2xvYmFsUG9zID0gZ2xv
YmFsUG9zLnRvUG9pbnQoKTsKKyAgICAgICAgZ2VzdHVyZUZhY2FkZS5wb3MgPSBldmVudC0+d2lk
Z2V0KCktPm1hcEZyb21HbG9iYWwoZ2xvYmFsUG9zLnRvUG9pbnQoKSk7CisgICAgICAgIGZyYW1l
LT5oYW5kbGVHZXN0dXJlRXZlbnQoJmdlc3R1cmVGYWNhZGUpOworICAgICAgICBoYW5kbGVkID0g
dHJ1ZTsKKyAgICB9CisgICAgZ2VzdHVyZSA9IGV2ZW50LT5nZXN0dXJlKFF0OjpUYXBBbmRIb2xk
R2VzdHVyZSk7CisgICAgaWYgKGdlc3R1cmUgJiYgKGdlc3R1cmUtPnN0YXRlKCkgPT0gUXQ6Okdl
c3R1cmVTdGFydGVkIHx8IGdlc3R1cmUtPnN0YXRlKCkgPT0gUXQ6Ok5vR2VzdHVyZSkpIHsKKyAg
ICAgICAgZ2VzdHVyZUZhY2FkZS50eXBlID0gUXQ6OlRhcEFuZEhvbGRHZXN0dXJlOworICAgICAg
ICBRUG9pbnRGIGdsb2JhbFBvcyA9IHN0YXRpY19jYXN0PGNvbnN0IFFUYXBBbmRIb2xkR2VzdHVy
ZSo+KGdlc3R1cmUpLT5wb3NpdGlvbigpOworICAgICAgICBnZXN0dXJlRmFjYWRlLmdsb2JhbFBv
cyA9IGdsb2JhbFBvcy50b1BvaW50KCk7CisgICAgICAgIGdlc3R1cmVGYWNhZGUucG9zID0gZXZl
bnQtPndpZGdldCgpLT5tYXBGcm9tR2xvYmFsKGdsb2JhbFBvcy50b1BvaW50KCkpOworICAgICAg
ICBmcmFtZS0+aGFuZGxlR2VzdHVyZUV2ZW50KCZnZXN0dXJlRmFjYWRlKTsKKyAgICAgICAgaGFu
ZGxlZCA9IHRydWU7CisgICAgfQorI2VuZGlmIC8vIEVOQUJMRShHRVNUVVJFX0VWRU5UUykKKwor
ICAgIGV2ZW50LT5zZXRBY2NlcHRlZChoYW5kbGVkKTsKKyAgICByZXR1cm4gaGFuZGxlZDsKK30K
KworLyohCisgIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgdGhlIGlucHV0IG1ldGhvZCB0byBxdWVy
eSBhIHNldCBvZiBwcm9wZXJ0aWVzIG9mIHRoZSBwYWdlCisgIHRvIGJlIGFibGUgdG8gc3VwcG9y
dCBjb21wbGV4IGlucHV0IG1ldGhvZCBvcGVyYXRpb25zIGFzIHN1cHBvcnQgZm9yIHN1cnJvdW5k
aW5nCisgIHRleHQgYW5kIHJlY29udmVyc2lvbnMuCisKKyAgXGEgcHJvcGVydHkgc3BlY2lmaWVz
IHdoaWNoIHByb3BlcnR5IGlzIHF1ZXJpZWQuCisKKyAgXHNhIFFXaWRnZXQ6OmlucHV0TWV0aG9k
RXZlbnQoKSwgUUlucHV0TWV0aG9kRXZlbnQsIFFJbnB1dENvbnRleHQKKyovCitRVmFyaWFudCBR
V2ViUGFnZTo6aW5wdXRNZXRob2RRdWVyeShRdDo6SW5wdXRNZXRob2RRdWVyeSBwcm9wZXJ0eSkg
Y29uc3QKK3sKKyAgICByZXR1cm4gZC0+aW5wdXRNZXRob2RRdWVyeShwcm9wZXJ0eSk7Cit9CisK
Ky8qIQorICAgIFxpbnRlcm5hbAorKi8KK3ZvaWQgUVdlYlBhZ2VQcml2YXRlOjpzZXRJbnNwZWN0
b3IoUVdlYkluc3BlY3RvciogaW5zcCkKK3sKKyAgICBpZiAoaW5zcGVjdG9yKQorICAgICAgICBp
bnNwZWN0b3ItPmQtPnNldEZyb250ZW5kKDApOworCisgICAgaW5zcGVjdG9yID0gaW5zcDsKKwor
ICAgIC8vIEdpdmUgaW5zcGVjdG9yIGZyb250ZW5kIHdlYiB2aWV3IGlmIHByZXZpb3VzbHkgY3Jl
YXRlZAorICAgIGlmIChpbnNwZWN0b3IgJiYgaW5zcGVjdG9yRnJvbnRlbmQpCisgICAgICAgIGlu
c3BlY3Rvci0+ZC0+c2V0RnJvbnRlbmQoaW5zcGVjdG9yRnJvbnRlbmQpOworfQorCisvKiEKKyAg
ICBcaW50ZXJuYWwKKyAgICBSZXR1cm5zIHRoZSBpbnNwZWN0b3IgYW5kIGNyZWF0ZXMgaXQgaWYg
aXQgd2Fzbid0IGNyZWF0ZWQgeWV0LgorICAgIFRoZSBpbnN0YW5jZSBjcmVhdGVkIGhlcmUgd2ls
bCBub3QgYmUgYXZhaWxhYmxlIHRocm91Z2ggUVdlYlBhZ2UncyBBUEkuCisqLworUVdlYkluc3Bl
Y3RvciogUVdlYlBhZ2VQcml2YXRlOjpnZXRPckNyZWF0ZUluc3BlY3RvcigpCit7CisjaWYgRU5B
QkxFKElOU1BFQ1RPUikKKyAgICBpZiAoIWluc3BlY3RvcikgeworICAgICAgICBRV2ViSW5zcGVj
dG9yKiBpbnNwID0gbmV3IFFXZWJJbnNwZWN0b3I7CisgICAgICAgIGluc3AtPnNldFBhZ2UocSk7
CisgICAgICAgIGluc3BlY3RvcklzSW50ZXJuYWxPbmx5ID0gdHJ1ZTsKKworICAgICAgICBRX0FT
U0VSVChpbnNwZWN0b3IpOyAvLyBBc3NvY2lhdGVkIHRocm91Z2ggUVdlYkluc3BlY3Rvcjo6c2V0
UGFnZShxKQorICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBpbnNwZWN0b3I7Cit9CisKKy8qIQor
ICAgXGVudW0gUVdlYlBhZ2U6OkZpbmRGbGFnCisKKyAgIFRoaXMgZW51bSBkZXNjcmliZXMgdGhl
IG9wdGlvbnMgYXZhaWxhYmxlIHRvIHRoZSBmaW5kVGV4dCgpIGZ1bmN0aW9uLiBUaGUgb3B0aW9u
cworICAgY2FuIGJlIE9SLWVkIHRvZ2V0aGVyIGZyb20gdGhlIGZvbGxvd2luZyBsaXN0OgorCisg
ICBcdmFsdWUgRmluZEJhY2t3YXJkIFNlYXJjaGVzIGJhY2t3YXJkcyBpbnN0ZWFkIG9mIGZvcndh
cmRzLgorICAgXHZhbHVlIEZpbmRDYXNlU2Vuc2l0aXZlbHkgQnkgZGVmYXVsdCBmaW5kVGV4dCgp
IHdvcmtzIGNhc2UgaW5zZW5zaXRpdmUuIFNwZWNpZnlpbmcgdGhpcyBvcHRpb24KKyAgIGNoYW5n
ZXMgdGhlIGJlaGF2aW91ciB0byBhIGNhc2Ugc2Vuc2l0aXZlIGZpbmQgb3BlcmF0aW9uLgorICAg
XHZhbHVlIEZpbmRXcmFwc0Fyb3VuZERvY3VtZW50IE1ha2VzIGZpbmRUZXh0KCkgcmVzdGFydCBm
cm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRvY3VtZW50IGlmIHRoZSBlbmQKKyAgIHdhcyByZWFj
aGVkIGFuZCB0aGUgdGV4dCB3YXMgbm90IGZvdW5kLgorICAgXHZhbHVlIEhpZ2hsaWdodEFsbE9j
Y3VycmVuY2VzIEhpZ2hsaWdodHMgYWxsIGV4aXN0aW5nIG9jY3VycmVuY2VzIG9mIGEgc3BlY2lm
aWMgc3RyaW5nLgorICAgICAgIChUaGlzIHZhbHVlIHdhcyBpbnRyb2R1Y2VkIGluIDQuNi4pCisq
LworCisvKiEKKyAgICBcZW51bSBRV2ViUGFnZTo6TGlua0RlbGVnYXRpb25Qb2xpY3kKKworICAg
IFRoaXMgZW51bSBkZWZpbmVzIHRoZSBkZWxlZ2F0aW9uIHBvbGljaWVzIGEgd2VicGFnZSBjYW4g
aGF2ZSB3aGVuIGFjdGl2YXRpbmcgbGlua3MgYW5kIGVtaXR0aW5nCisgICAgdGhlIGxpbmtDbGlj
a2VkKCkgc2lnbmFsLgorCisgICAgXHZhbHVlIERvbnREZWxlZ2F0ZUxpbmtzIE5vIGxpbmtzIGFy
ZSBkZWxlZ2F0ZWQuIEluc3RlYWQsIFFXZWJQYWdlIHRyaWVzIHRvIGhhbmRsZSB0aGVtIGFsbC4K
KyAgICBcdmFsdWUgRGVsZWdhdGVFeHRlcm5hbExpbmtzIFdoZW4gYWN0aXZhdGluZyBsaW5rcyB0
aGF0IHBvaW50IHRvIGRvY3VtZW50cyBub3Qgc3RvcmVkIG9uIHRoZQorICAgIGxvY2FsIGZpbGVz
eXN0ZW0gb3IgYW4gZXF1aXZhbGVudCAtIHN1Y2ggYXMgdGhlIFF0IHJlc291cmNlIHN5c3RlbSAt
IHRoZW4gbGlua0NsaWNrZWQoKSBpcyBlbWl0dGVkLgorICAgIFx2YWx1ZSBEZWxlZ2F0ZUFsbExp
bmtzIFdoZW5ldmVyIGEgbGluayBpcyBhY3RpdmF0ZWQgdGhlIGxpbmtDbGlja2VkKCkgc2lnbmFs
IGlzIGVtaXR0ZWQuCisKKyAgICBcc2EgUVdlYlBhZ2U6OmxpbmtEZWxlZ2F0aW9uUG9saWN5Cisq
LworCisvKiEKKyAgICBcZW51bSBRV2ViUGFnZTo6TmF2aWdhdGlvblR5cGUKKworICAgIFRoaXMg
ZW51bSBkZXNjcmliZXMgdGhlIHR5cGVzIG9mIG5hdmlnYXRpb24gYXZhaWxhYmxlIHdoZW4gYnJv
d3NpbmcgdGhyb3VnaCBoeXBlcmxpbmtlZAorICAgIGRvY3VtZW50cy4KKworICAgIFx2YWx1ZSBO
YXZpZ2F0aW9uVHlwZUxpbmtDbGlja2VkIFRoZSB1c2VyIGNsaWNrZWQgb24gYSBsaW5rIG9yIHBy
ZXNzZWQgcmV0dXJuIG9uIGEgZm9jdXNlZCBsaW5rLgorICAgIFx2YWx1ZSBOYXZpZ2F0aW9uVHlw
ZUZvcm1TdWJtaXR0ZWQgVGhlIHVzZXIgYWN0aXZhdGVkIGEgc3VibWl0IGJ1dHRvbiBmb3IgYW4g
SFRNTCBmb3JtLgorICAgIFx2YWx1ZSBOYXZpZ2F0aW9uVHlwZUJhY2tPckZvcndhcmQgTmF2aWdh
dGlvbiB0byBhIHByZXZpb3VzbHkgc2hvd24gZG9jdW1lbnQgaW4gdGhlIGJhY2sgb3IgZm9yd2Fy
ZCBoaXN0b3J5IGlzIHJlcXVlc3RlZC4KKyAgICBcdmFsdWUgTmF2aWdhdGlvblR5cGVSZWxvYWQg
VGhlIHVzZXIgYWN0aXZhdGVkIHRoZSByZWxvYWQgYWN0aW9uLgorICAgIFx2YWx1ZSBOYXZpZ2F0
aW9uVHlwZUZvcm1SZXN1Ym1pdHRlZCBBbiBIVE1MIGZvcm0gd2FzIHN1Ym1pdHRlZCBhIHNlY29u
ZCB0aW1lLgorICAgIFx2YWx1ZSBOYXZpZ2F0aW9uVHlwZU90aGVyIEEgbmF2aWdhdGlvbiB0byBh
bm90aGVyIGRvY3VtZW50IHVzaW5nIGEgbWV0aG9kIG5vdCBsaXN0ZWQgYWJvdmUuCisKKyAgICBc
c2EgYWNjZXB0TmF2aWdhdGlvblJlcXVlc3QoKQorKi8KKworLyohCisgICAgXGVudW0gUVdlYlBh
Z2U6OldlYkFjdGlvbgorCisgICAgVGhpcyBlbnVtIGRlc2NyaWJlcyB0aGUgdHlwZXMgb2YgYWN0
aW9uIHdoaWNoIGNhbiBiZSBwZXJmb3JtZWQgb24gdGhlIHdlYiBwYWdlLgorCisgICAgQWN0aW9u
cyBvbmx5IGhhdmUgYW4gZWZmZWN0IHdoZW4gdGhleSBhcmUgYXBwbGljYWJsZS4gVGhlIGF2YWls
YWJpbGl0eSBvZgorICAgIGFjdGlvbnMgY2FuIGJlIGJlIGRldGVybWluZWQgYnkgY2hlY2tpbmcg
XGx7UUFjdGlvbjo6fXtpc0VuYWJsZWQoKX0gb24gdGhlCisgICAgYWN0aW9uIHJldHVybmVkIGJ5
IGFjdGlvbigpLgorCisgICAgT25lIG1ldGhvZCBvZiBlbmFibGluZyB0aGUgdGV4dCBlZGl0aW5n
LCBjdXJzb3IgbW92ZW1lbnQsIGFuZCB0ZXh0IHNlbGVjdGlvbiBhY3Rpb25zCisgICAgaXMgYnkg
c2V0dGluZyBcbCBjb250ZW50RWRpdGFibGUgdG8gdHJ1ZS4KKworICAgIFx2YWx1ZSBOb1dlYkFj
dGlvbiBObyBhY3Rpb24gaXMgdHJpZ2dlcmVkLgorICAgIFx2YWx1ZSBPcGVuTGluayBPcGVuIHRo
ZSBjdXJyZW50IGxpbmsuCisgICAgXHZhbHVlIE9wZW5MaW5rSW5OZXdXaW5kb3cgT3BlbiB0aGUg
Y3VycmVudCBsaW5rIGluIGEgbmV3IHdpbmRvdy4KKyAgICBcdmFsdWUgT3BlbkxpbmtJblRoaXNX
aW5kb3cgT3BlbiB0aGUgY3VycmVudCBsaW5rIHdpdGhvdXQgb3BlbmluZyBhIG5ldyB3aW5kb3cu
IFVzZWQgb24gbGlua3MgdGhhdCB3b3VsZCBkZWZhdWx0IHRvIG9wZW5pbmcgaW4gYW5vdGhlciBm
cmFtZSBvciBhIG5ldyB3aW5kb3cuIChBZGRlZCBpbiBRdCA1LjApCisgICAgXHZhbHVlIE9wZW5G
cmFtZUluTmV3V2luZG93IFJlcGxpY2F0ZSB0aGUgY3VycmVudCBmcmFtZSBpbiBhIG5ldyB3aW5k
b3cuCisgICAgXHZhbHVlIERvd25sb2FkTGlua1RvRGlzayBEb3dubG9hZCB0aGUgY3VycmVudCBs
aW5rIHRvIHRoZSBkaXNrLgorICAgIFx2YWx1ZSBDb3B5TGlua1RvQ2xpcGJvYXJkIENvcHkgdGhl
IGN1cnJlbnQgbGluayB0byB0aGUgY2xpcGJvYXJkLgorICAgIFx2YWx1ZSBPcGVuSW1hZ2VJbk5l
d1dpbmRvdyBPcGVuIHRoZSBoaWdobGlnaHRlZCBpbWFnZSBpbiBhIG5ldyB3aW5kb3cuCisgICAg
XHZhbHVlIERvd25sb2FkSW1hZ2VUb0Rpc2sgRG93bmxvYWQgdGhlIGhpZ2hsaWdodGVkIGltYWdl
IHRvIHRoZSBkaXNrLgorICAgIFx2YWx1ZSBDb3B5SW1hZ2VUb0NsaXBib2FyZCBDb3B5IHRoZSBo
aWdobGlnaHRlZCBpbWFnZSB0byB0aGUgY2xpcGJvYXJkLiAgKEFkZGVkIGluIFF0IDQuOCkKKyAg
ICBcdmFsdWUgQ29weUltYWdlVXJsVG9DbGlwYm9hcmQgQ29weSB0aGUgaGlnaGxpZ2h0ZWQgaW1h
Z2UncyBVUkwgdG8gdGhlIGNsaXBib2FyZC4KKyAgICBcdmFsdWUgQmFjayBOYXZpZ2F0ZSBiYWNr
IGluIHRoZSBoaXN0b3J5IG9mIG5hdmlnYXRlZCBsaW5rcy4KKyAgICBcdmFsdWUgRm9yd2FyZCBO
YXZpZ2F0ZSBmb3J3YXJkIGluIHRoZSBoaXN0b3J5IG9mIG5hdmlnYXRlZCBsaW5rcy4KKyAgICBc
dmFsdWUgU3RvcCBTdG9wIGxvYWRpbmcgdGhlIGN1cnJlbnQgcGFnZS4KKyAgICBcdmFsdWUgU3Rv
cFNjaGVkdWxlZFBhZ2VSZWZyZXNoIFN0b3AgYWxsIHBlbmRpbmcgcGFnZSByZWZyZXNoL3JlZGly
ZWN0IHJlcXVlc3RzLiAgKEFkZGVkIGluIFF0IDQuNykKKyAgICBcdmFsdWUgUmVsb2FkIFJlbG9h
ZCB0aGUgY3VycmVudCBwYWdlLgorICAgIFx2YWx1ZSBSZWxvYWRBbmRCeXBhc3NDYWNoZSBSZWxv
YWQgdGhlIGN1cnJlbnQgcGFnZSwgYnV0IGRvIG5vdCB1c2UgYW55IGxvY2FsIGNhY2hlLiAoQWRk
ZWQgaW4gUXQgNC42KQorICAgIFx2YWx1ZSBDdXQgQ3V0IHRoZSBjb250ZW50IGN1cnJlbnRseSBz
ZWxlY3RlZCBpbnRvIHRoZSBjbGlwYm9hcmQuCisgICAgXHZhbHVlIENvcHkgQ29weSB0aGUgY29u
dGVudCBjdXJyZW50bHkgc2VsZWN0ZWQgaW50byB0aGUgY2xpcGJvYXJkLgorICAgIFx2YWx1ZSBQ
YXN0ZSBQYXN0ZSBjb250ZW50IGZyb20gdGhlIGNsaXBib2FyZC4KKyAgICBcdmFsdWUgVW5kbyBV
bmRvIHRoZSBsYXN0IGVkaXRpbmcgYWN0aW9uLgorICAgIFx2YWx1ZSBSZWRvIFJlZG8gdGhlIGxh
c3QgZWRpdGluZyBhY3Rpb24uCisgICAgXHZhbHVlIE1vdmVUb05leHRDaGFyIE1vdmUgdGhlIGN1
cnNvciB0byB0aGUgbmV4dCBjaGFyYWN0ZXIuCisgICAgXHZhbHVlIE1vdmVUb1ByZXZpb3VzQ2hh
ciBNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIHByZXZpb3VzIGNoYXJhY3Rlci4KKyAgICBcdmFsdWUg
TW92ZVRvTmV4dFdvcmQgTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBuZXh0IHdvcmQuCisgICAgXHZh
bHVlIE1vdmVUb1ByZXZpb3VzV29yZCBNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIHByZXZpb3VzIHdv
cmQuCisgICAgXHZhbHVlIE1vdmVUb05leHRMaW5lIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgbmV4
dCBsaW5lLgorICAgIFx2YWx1ZSBNb3ZlVG9QcmV2aW91c0xpbmUgTW92ZSB0aGUgY3Vyc29yIHRv
IHRoZSBwcmV2aW91cyBsaW5lLgorICAgIFx2YWx1ZSBNb3ZlVG9TdGFydE9mTGluZSBNb3ZlIHRo
ZSBjdXJzb3IgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLgorICAgIFx2YWx1ZSBNb3ZlVG9FbmRP
ZkxpbmUgTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUuCisgICAgXHZhbHVl
IE1vdmVUb1N0YXJ0T2ZCbG9jayBNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIHN0YXJ0IG9mIHRoZSBi
bG9jay4KKyAgICBcdmFsdWUgTW92ZVRvRW5kT2ZCbG9jayBNb3ZlIHRoZSBjdXJzb3IgdG8gdGhl
IGVuZCBvZiB0aGUgYmxvY2suCisgICAgXHZhbHVlIE1vdmVUb1N0YXJ0T2ZEb2N1bWVudCBNb3Zl
IHRoZSBjdXJzb3IgdG8gdGhlIHN0YXJ0IG9mIHRoZSBkb2N1bWVudC4KKyAgICBcdmFsdWUgTW92
ZVRvRW5kT2ZEb2N1bWVudCBNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIGVuZCBvZiB0aGUgZG9jdW1l
bnQuCisgICAgXHZhbHVlIFNlbGVjdE5leHRDaGFyIFNlbGVjdCB0byB0aGUgbmV4dCBjaGFyYWN0
ZXIuCisgICAgXHZhbHVlIFNlbGVjdFByZXZpb3VzQ2hhciBTZWxlY3QgdG8gdGhlIHByZXZpb3Vz
IGNoYXJhY3Rlci4KKyAgICBcdmFsdWUgU2VsZWN0TmV4dFdvcmQgU2VsZWN0IHRvIHRoZSBuZXh0
IHdvcmQuCisgICAgXHZhbHVlIFNlbGVjdFByZXZpb3VzV29yZCBTZWxlY3QgdG8gdGhlIHByZXZp
b3VzIHdvcmQuCisgICAgXHZhbHVlIFNlbGVjdE5leHRMaW5lIFNlbGVjdCB0byB0aGUgbmV4dCBs
aW5lLgorICAgIFx2YWx1ZSBTZWxlY3RQcmV2aW91c0xpbmUgU2VsZWN0IHRvIHRoZSBwcmV2aW91
cyBsaW5lLgorICAgIFx2YWx1ZSBTZWxlY3RTdGFydE9mTGluZSBTZWxlY3QgdG8gdGhlIHN0YXJ0
IG9mIHRoZSBsaW5lLgorICAgIFx2YWx1ZSBTZWxlY3RFbmRPZkxpbmUgU2VsZWN0IHRvIHRoZSBl
bmQgb2YgdGhlIGxpbmUuCisgICAgXHZhbHVlIFNlbGVjdFN0YXJ0T2ZCbG9jayBTZWxlY3QgdG8g
dGhlIHN0YXJ0IG9mIHRoZSBibG9jay4KKyAgICBcdmFsdWUgU2VsZWN0RW5kT2ZCbG9jayBTZWxl
Y3QgdG8gdGhlIGVuZCBvZiB0aGUgYmxvY2suCisgICAgXHZhbHVlIFNlbGVjdFN0YXJ0T2ZEb2N1
bWVudCBTZWxlY3QgdG8gdGhlIHN0YXJ0IG9mIHRoZSBkb2N1bWVudC4KKyAgICBcdmFsdWUgU2Vs
ZWN0RW5kT2ZEb2N1bWVudCBTZWxlY3QgdG8gdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQuCisgICAg
XHZhbHVlIERlbGV0ZVN0YXJ0T2ZXb3JkIERlbGV0ZSB0byB0aGUgc3RhcnQgb2YgdGhlIHdvcmQu
CisgICAgXHZhbHVlIERlbGV0ZUVuZE9mV29yZCBEZWxldGUgdG8gdGhlIGVuZCBvZiB0aGUgd29y
ZC4KKyAgICBcdmFsdWUgU2V0VGV4dERpcmVjdGlvbkRlZmF1bHQgU2V0IHRoZSB0ZXh0IGRpcmVj
dGlvbiB0byB0aGUgZGVmYXVsdCBkaXJlY3Rpb24uCisgICAgXHZhbHVlIFNldFRleHREaXJlY3Rp
b25MZWZ0VG9SaWdodCBTZXQgdGhlIHRleHQgZGlyZWN0aW9uIHRvIGxlZnQtdG8tcmlnaHQuCisg
ICAgXHZhbHVlIFNldFRleHREaXJlY3Rpb25SaWdodFRvTGVmdCBTZXQgdGhlIHRleHQgZGlyZWN0
aW9uIHRvIHJpZ2h0LXRvLWxlZnQuCisgICAgXHZhbHVlIFRvZ2dsZUJvbGQgVG9nZ2xlIHRoZSBm
b3JtYXR0aW5nIGJldHdlZW4gYm9sZCBhbmQgbm9ybWFsIHdlaWdodC4KKyAgICBcdmFsdWUgVG9n
Z2xlSXRhbGljIFRvZ2dsZSB0aGUgZm9ybWF0dGluZyBiZXR3ZWVuIGl0YWxpYyBhbmQgbm9ybWFs
IHN0eWxlLgorICAgIFx2YWx1ZSBUb2dnbGVVbmRlcmxpbmUgVG9nZ2xlIHVuZGVybGluaW5nLgor
ICAgIFx2YWx1ZSBJbnNwZWN0RWxlbWVudCBTaG93IHRoZSBXZWIgSW5zcGVjdG9yIHdpdGggdGhl
IGN1cnJlbnRseSBoaWdobGlnaHRlZCBIVE1MIGVsZW1lbnQuCisgICAgXHZhbHVlIEluc2VydFBh
cmFncmFwaFNlcGFyYXRvciBJbnNlcnQgYSBuZXcgcGFyYWdyYXBoLgorICAgIFx2YWx1ZSBJbnNl
cnRMaW5lU2VwYXJhdG9yIEluc2VydCBhIG5ldyBsaW5lLgorICAgIFx2YWx1ZSBTZWxlY3RBbGwg
U2VsZWN0cyBhbGwgY29udGVudC4KKyAgICBcdmFsdWUgUGFzdGVBbmRNYXRjaFN0eWxlIFBhc3Rl
IGNvbnRlbnQgZnJvbSB0aGUgY2xpcGJvYXJkIHdpdGggY3VycmVudCBzdHlsZS4gKEFkZGVkIGlu
IFF0IDQuNikKKyAgICBcdmFsdWUgUmVtb3ZlRm9ybWF0IFJlbW92ZXMgZm9ybWF0dGluZyBhbmQg
c3R5bGUuIChBZGRlZCBpbiBRdCA0LjYpCisgICAgXHZhbHVlIFRvZ2dsZVN0cmlrZXRocm91Z2gg
VG9nZ2xlIHRoZSBmb3JtYXR0aW5nIGJldHdlZW4gc3RyaWtldGhyb3VnaCBhbmQgbm9ybWFsIHN0
eWxlLiAoQWRkZWQgaW4gUXQgNC42KQorICAgIFx2YWx1ZSBUb2dnbGVTdWJzY3JpcHQgVG9nZ2xl
IHRoZSBmb3JtYXR0aW5nIGJldHdlZW4gc3Vic2NyaXB0IGFuZCBiYXNlbGluZS4gKEFkZGVkIGlu
IFF0IDQuNikKKyAgICBcdmFsdWUgVG9nZ2xlU3VwZXJzY3JpcHQgVG9nZ2xlIHRoZSBmb3JtYXR0
aW5nIGJldHdlZW4gc3VwZXJjcmlwdCBhbmQgYmFzZWxpbmUuIChBZGRlZCBpbiBRdCA0LjYpCisg
ICAgXHZhbHVlIEluc2VydFVub3JkZXJlZExpc3QgVG9nZ2xlcyB0aGUgc2VsZWN0aW9uIGJldHdl
ZW4gYW4gb3JkZXJlZCBsaXN0IGFuZCBhIG5vcm1hbCBibG9jay4gKEFkZGVkIGluIFF0IDQuNikK
KyAgICBcdmFsdWUgSW5zZXJ0T3JkZXJlZExpc3QgVG9nZ2xlcyB0aGUgc2VsZWN0aW9uIGJldHdl
ZW4gYW4gb3JkZXJlZCBsaXN0IGFuZCBhIG5vcm1hbCBibG9jay4gKEFkZGVkIGluIFF0IDQuNikK
KyAgICBcdmFsdWUgSW5kZW50IEluY3JlYXNlcyB0aGUgaW5kZW50YXRpb24gb2YgdGhlIGN1cnJl
bnRseSBzZWxlY3RlZCBmb3JtYXQgYmxvY2sgYnkgb25lIGluY3JlbWVudC4gKEFkZGVkIGluIFF0
IDQuNikKKyAgICBcdmFsdWUgT3V0ZGVudCBEZWNyZWFzZXMgdGhlIGluZGVudGF0aW9uIG9mIHRo
ZSBjdXJyZW50bHkgc2VsZWN0ZWQgZm9ybWF0IGJsb2NrIGJ5IG9uZSBpbmNyZW1lbnQuIChBZGRl
ZCBpbiBRdCA0LjYpCisgICAgXHZhbHVlIEFsaWduQ2VudGVyIEFwcGxpZXMgY2VudGVyIGFsaWdu
bWVudCB0byBjb250ZW50LiAoQWRkZWQgaW4gUXQgNC42KQorICAgIFx2YWx1ZSBBbGlnbkp1c3Rp
ZmllZCBBcHBsaWVzIGZ1bGwganVzdGlmaWNhdGlvbiB0byBjb250ZW50LiAoQWRkZWQgaW4gUXQg
NC42KQorICAgIFx2YWx1ZSBBbGlnbkxlZnQgQXBwbGllcyBsZWZ0IGp1c3RpZmljYXRpb24gdG8g
Y29udGVudC4gKEFkZGVkIGluIFF0IDQuNikKKyAgICBcdmFsdWUgQWxpZ25SaWdodCBBcHBsaWVz
IHJpZ2h0IGp1c3RpZmljYXRpb24gdG8gY29udGVudC4gKEFkZGVkIGluIFF0IDQuNikKKworCisg
ICAgXG9taXR2YWx1ZSBXZWJBY3Rpb25Db3VudAorCisqLworCisvKiEKKyAgICBcZW51bSBRV2Vi
UGFnZTo6V2ViV2luZG93VHlwZQorCisgICAgVGhpcyBlbnVtIGRlc2NyaWJlcyB0aGUgdHlwZXMg
b2Ygd2luZG93IHRoYXQgY2FuIGJlIGNyZWF0ZWQgYnkgdGhlIGNyZWF0ZVdpbmRvdygpIGZ1bmN0
aW9uLgorCisgICAgXHZhbHVlIFdlYkJyb3dzZXJXaW5kb3cgVGhlIHdpbmRvdyBpcyBhIHJlZ3Vs
YXIgd2ViIGJyb3dzZXIgd2luZG93LgorICAgIFx2YWx1ZSBXZWJNb2RhbERpYWxvZyBUaGUgd2lu
ZG93IGFjdHMgYXMgbW9kYWwgZGlhbG9nLgorKi8KKworCisvKiEKKyAgICBcY2xhc3MgUVdlYlBh
Z2U6OlZpZXdwb3J0QXR0cmlidXRlcworICAgIFxzaW5jZSA0LjcKKyAgICBcYnJpZWYgVGhlIFFX
ZWJQYWdlOjpWaWV3cG9ydEF0dHJpYnV0ZXMgY2xhc3MgZGVzY3JpYmVzIGhpbnRzIHRoYXQgY2Fu
IGJlIGFwcGxpZWQgdG8gYSB2aWV3cG9ydC4KKworICAgIFFXZWJQYWdlOjpWaWV3cG9ydEF0dHJp
YnV0ZXMgcHJvdmlkZXMgYSBkZXNjcmlwdGlvbiBvZiBhIHZpZXdwb3J0LCBzdWNoIGFzIHZpZXdw
b3J0IGdlb21ldHJ5LAorICAgIGluaXRpYWwgc2NhbGUgZmFjdG9yIHdpdGggbGltaXRzLCBwbHVz
IGluZm9ybWF0aW9uIGFib3V0IHdoZXRoZXIgYSB1c2VyIHNob3VsZCBiZSBhYmxlCisgICAgdG8g
c2NhbGUgdGhlIGNvbnRlbnRzIGluIHRoZSB2aWV3cG9ydCBvciBub3QsIGllLiBieSB6b29taW5n
LgorCisgICAgVmlld3BvcnRBdHRyaWJ1dGVzIGNhbiBiZSBzZXQgYnkgYSB3ZWIgYXV0aG9yIHVz
aW5nIHRoZSB2aWV3cG9ydCBtZXRhIHRhZyBleHRlbnNpb24sIGRvY3VtZW50ZWQKKyAgICBhdCBc
bHtodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9zYWZhcmkvbGlicmFyeS9kb2N1bWVudGF0aW9u
L2FwcGxlYXBwbGljYXRpb25zL3JlZmVyZW5jZS9zYWZhcml3ZWJjb250ZW50L3VzaW5ndGhldmll
d3BvcnQvdXNpbmd0aGV2aWV3cG9ydC5odG1sfXtTYWZhcmkgUmVmZXJlbmNlIExpYnJhcnk6IFVz
aW5nIHRoZSBWaWV3cG9ydCBNZXRhIFRhZ30uCisKKyAgICBBbGwgdmFsdWVzIG1pZ2h0IG5vdCBi
ZSBzZXQsIGFzIHN1Y2ggd2hlbiBkZWFsaW5nIHdpdGggdGhlIGhpbnRzLCB0aGUgZGV2ZWxvcGVy
IG5lZWRzIHRvCisgICAgY2hlY2sgd2hldGhlciB0aGUgdmFsdWVzIGFyZSB2YWxpZC4gTmVnYXRp
dmUgdmFsdWVzIGRlbm90ZSBhbiBpbnZhbGlkIHFyZWFsIHZhbHVlLgorCisgICAgXGlubW9kdWxl
IFF0V2ViS2l0CisqLworCisvKiEKKyAgICBDb25zdHJ1Y3RzIGFuIGVtcHR5IFFXZWJQYWdlOjpW
aWV3cG9ydEF0dHJpYnV0ZXMuCisqLworUVdlYlBhZ2U6OlZpZXdwb3J0QXR0cmlidXRlczo6Vmll
d3BvcnRBdHRyaWJ1dGVzKCkKKyAgICA6IGQoMCkKKyAgICAsIG1faW5pdGlhbFNjYWxlRmFjdG9y
KC0xLjApCisgICAgLCBtX21pbmltdW1TY2FsZUZhY3RvcigtMS4wKQorICAgICwgbV9tYXhpbXVt
U2NhbGVGYWN0b3IoLTEuMCkKKyAgICAsIG1fZGV2aWNlUGl4ZWxSYXRpbygtMS4wKQorICAgICwg
bV9pc1VzZXJTY2FsYWJsZSh0cnVlKQorICAgICwgbV9pc1ZhbGlkKGZhbHNlKQoreworCit9CisK
Ky8qIQorICAgIENvbnN0cnVjdHMgYSBRV2ViUGFnZTo6Vmlld3BvcnRBdHRyaWJ1dGVzIHdoaWNo
IGlzIGEgY29weSBmcm9tIFxhIG90aGVyIC4KKyovCitRV2ViUGFnZTo6Vmlld3BvcnRBdHRyaWJ1
dGVzOjpWaWV3cG9ydEF0dHJpYnV0ZXMoY29uc3QgUVdlYlBhZ2U6OlZpZXdwb3J0QXR0cmlidXRl
cyYgb3RoZXIpCisgICAgOiBkKG90aGVyLmQpCisgICAgLCBtX2luaXRpYWxTY2FsZUZhY3Rvcihv
dGhlci5tX2luaXRpYWxTY2FsZUZhY3RvcikKKyAgICAsIG1fbWluaW11bVNjYWxlRmFjdG9yKG90
aGVyLm1fbWluaW11bVNjYWxlRmFjdG9yKQorICAgICwgbV9tYXhpbXVtU2NhbGVGYWN0b3Iob3Ro
ZXIubV9tYXhpbXVtU2NhbGVGYWN0b3IpCisgICAgLCBtX2RldmljZVBpeGVsUmF0aW8ob3RoZXIu
bV9kZXZpY2VQaXhlbFJhdGlvKQorICAgICwgbV9pc1VzZXJTY2FsYWJsZShvdGhlci5tX2lzVXNl
clNjYWxhYmxlKQorICAgICwgbV9pc1ZhbGlkKG90aGVyLm1faXNWYWxpZCkKKyAgICAsIG1fc2l6
ZShvdGhlci5tX3NpemUpCit7CisKK30KKworLyohCisgICAgRGVzdHJveXMgdGhlIFFXZWJQYWdl
OjpWaWV3cG9ydEF0dHJpYnV0ZXMuCisqLworUVdlYlBhZ2U6OlZpZXdwb3J0QXR0cmlidXRlczo6
flZpZXdwb3J0QXR0cmlidXRlcygpCit7CisKK30KKworLyohCisgICAgQXNzaWducyB0aGUgZ2l2
ZW4gUVdlYlBhZ2U6OlZpZXdwb3J0QXR0cmlidXRlcyB0byB0aGlzIHZpZXdwb3J0IGhpbnRzIGFu
ZCByZXR1cm5zIGEKKyAgICByZWZlcmVuY2UgdG8gdGhpcy4KKyovCitRV2ViUGFnZTo6Vmlld3Bv
cnRBdHRyaWJ1dGVzJiBRV2ViUGFnZTo6Vmlld3BvcnRBdHRyaWJ1dGVzOjpvcGVyYXRvcj0oY29u
c3QgUVdlYlBhZ2U6OlZpZXdwb3J0QXR0cmlidXRlcyYgb3RoZXIpCit7CisgICAgaWYgKHRoaXMg
IT0gJm90aGVyKSB7CisgICAgICAgIGQgPSBvdGhlci5kOworICAgICAgICBtX2luaXRpYWxTY2Fs
ZUZhY3RvciA9IG90aGVyLm1faW5pdGlhbFNjYWxlRmFjdG9yOworICAgICAgICBtX21pbmltdW1T
Y2FsZUZhY3RvciA9IG90aGVyLm1fbWluaW11bVNjYWxlRmFjdG9yOworICAgICAgICBtX21heGlt
dW1TY2FsZUZhY3RvciA9IG90aGVyLm1fbWF4aW11bVNjYWxlRmFjdG9yOworICAgICAgICBtX2lz
VXNlclNjYWxhYmxlID0gb3RoZXIubV9pc1VzZXJTY2FsYWJsZTsKKyAgICAgICAgbV9pc1ZhbGlk
ID0gb3RoZXIubV9pc1ZhbGlkOworICAgICAgICBtX3NpemUgPSBvdGhlci5tX3NpemU7CisgICAg
fQorCisgICAgcmV0dXJuICp0aGlzOworfQorCisvKiEgXGZuIGlubGluZSBib29sIFFXZWJQYWdl
OjpWaWV3cG9ydEF0dHJpYnV0ZXM6OmlzVmFsaWQoKSBjb25zdAorICAgIFJldHVybnMgd2hldGhl
ciB0aGlzIGlzIGEgdmFsaWQgVmlld3BvcnRBdHRyaWJ1dGVzIG9yIG5vdC4KKworICAgIEFuIGlu
dmFsaWQgVmlld3BvcnRBdHRyaWJ1dGVzIHdpbGwgaGF2ZSBhbiBlbXB0eSBRU2l6ZSwgbmVnYXRp
dmUgdmFsdWVzIGZvciBzY2FsZSBmYWN0b3JzIGFuZAorICAgIHRydWUgZm9yIHRoZSBib29sZWFu
IGlzVXNlclNjYWxhYmxlLgorKi8KKworLyohIFxmbiBpbmxpbmUgUVNpemUgUVdlYlBhZ2U6OlZp
ZXdwb3J0QXR0cmlidXRlczo6c2l6ZSgpIGNvbnN0CisgICAgUmV0dXJucyB0aGUgc2l6ZSBvZiB0
aGUgdmlld3BvcnQuCisqLworCisvKiEgXGZuIGlubGluZSBxcmVhbCBRV2ViUGFnZTo6Vmlld3Bv
cnRBdHRyaWJ1dGVzOjppbml0aWFsU2NhbGVGYWN0b3IoKSBjb25zdAorICAgIFJldHVybnMgdGhl
IGluaXRpYWwgc2NhbGUgb2YgdGhlIHZpZXdwb3J0IGFzIGEgbXVsdGlwbGllci4KKyovCisKKy8q
ISBcZm4gaW5saW5lIHFyZWFsIFFXZWJQYWdlOjpWaWV3cG9ydEF0dHJpYnV0ZXM6Om1pbmltdW1T
Y2FsZUZhY3RvcigpIGNvbnN0CisgICAgUmV0dXJucyB0aGUgbWluaW11bSBzY2FsZSB2YWx1ZSBv
ZiB0aGUgdmlld3BvcnQgYXMgYSBtdWx0aXBsaWVyLgorKi8KKworLyohIFxmbiBpbmxpbmUgcXJl
YWwgUVdlYlBhZ2U6OlZpZXdwb3J0QXR0cmlidXRlczo6bWF4aW11bVNjYWxlRmFjdG9yKCkgY29u
c3QKKyAgICBSZXR1cm5zIHRoZSBtYXhpbXVtIHNjYWxlIHZhbHVlIG9mIHRoZSB2aWV3cG9ydCBh
cyBhIG11bHRpcGxpZXIuCisqLworCisvKiEgXGZuIGlubGluZSBib29sIFFXZWJQYWdlOjpWaWV3
cG9ydEF0dHJpYnV0ZXM6OmlzVXNlclNjYWxhYmxlKCkgY29uc3QKKyAgICBEZXRlcm1pbmVzIHdo
ZXRoZXIgb3Igbm90IHRoZSBzY2FsZSBjYW4gYmUgbW9kaWZpZWQgYnkgdGhlIHVzZXIuCisqLwor
CisKKy8qIQorICAgIFxjbGFzcyBRV2ViUGFnZQorICAgIFxzaW5jZSA0LjQKKyAgICBcYnJpZWYg
VGhlIFFXZWJQYWdlIGNsYXNzIHByb3ZpZGVzIGFuIG9iamVjdCB0byB2aWV3IGFuZCBlZGl0IHdl
YiBkb2N1bWVudHMuCisKKyAgICBcaW5tb2R1bGUgUXRXZWJLaXQKKworICAgIFFXZWJQYWdlIGhv
bGRzIGEgbWFpbiBmcmFtZSByZXNwb25zaWJsZSBmb3Igd2ViIGNvbnRlbnQsIHNldHRpbmdzLCB0
aGUgaGlzdG9yeQorICAgIG9mIG5hdmlnYXRlZCBsaW5rcyBhbmQgYWN0aW9ucy4gVGhpcyBjbGFz
cyBjYW4gYmUgdXNlZCwgdG9nZXRoZXIgd2l0aCBRV2ViRnJhbWUsCisgICAgdG8gcHJvdmlkZSBm
dW5jdGlvbmFsaXR5IGxpa2UgUVdlYlZpZXcgaW4gYSB3aWRnZXQtbGVzcyBlbnZpcm9ubWVudC4K
KworICAgIFFXZWJQYWdlJ3MgQVBJIGlzIHZlcnkgc2ltaWxhciB0byBRV2ViVmlldywgYXMgeW91
IGFyZSBzdGlsbCBwcm92aWRlZCB3aXRoCisgICAgY29tbW9uIGZ1bmN0aW9ucyBsaWtlIGFjdGlv
bigpIChrbm93biBhcworICAgIFxse1FXZWJWaWV3OjpwYWdlQWN0aW9uKCl9e3BhZ2VBY3Rpb259
KCkgaW4gUVdlYlZpZXcpLCB0cmlnZ2VyQWN0aW9uKCksCisgICAgZmluZFRleHQoKSBhbmQgc2V0
dGluZ3MoKS4gTW9yZSBRV2ViVmlldy1saWtlIGZ1bmN0aW9ucyBjYW4gYmUgZm91bmQgaW4gdGhl
CisgICAgbWFpbiBmcmFtZSBvZiBRV2ViUGFnZSwgb2J0YWluZWQgdmlhIHRoZSBtYWluRnJhbWUo
KSBmdW5jdGlvbi4gRm9yIGV4YW1wbGUsCisgICAgdGhlIFxse1FXZWJGcmFtZTo6bG9hZCgpfXts
b2FkfSgpLCBcbHtRV2ViRnJhbWU6OnNldFVybCgpfXtzZXRVcmx9KCkgYW5kCisgICAgXGx7UVdl
YkZyYW1lOjpzZXRIdG1sKCl9e3NldEh0bWx9KCkgZnVuY3Rpb25zIGZvciBRV2ViUGFnZSBjYW4g
YmUgYWNjZXNzZWQKKyAgICB1c2luZyBRV2ViRnJhbWUuCisKKyAgICBUaGUgbG9hZFN0YXJ0ZWQo
KSBzaWduYWwgaXMgZW1pdHRlZCB3aGVuIHRoZSBwYWdlIGJlZ2lucyB0byBsb2FkLlRoZQorICAg
IGxvYWRQcm9ncmVzcygpIHNpZ25hbCwgb24gdGhlIG90aGVyIGhhbmQsIGlzIGVtaXR0ZWQgd2hl
bmV2ZXIgYW4gZWxlbWVudAorICAgIG9mIHRoZSB3ZWIgcGFnZSBjb21wbGV0ZXMgbG9hZGluZywg
c3VjaCBhcyBhbiBlbWJlZGRlZCBpbWFnZSwgYSBzY3JpcHQsCisgICAgZXRjLiBGaW5hbGx5LCB0
aGUgbG9hZEZpbmlzaGVkKCkgc2lnbmFsIGlzIGVtaXR0ZWQgd2hlbiB0aGUgcGFnZSBjb250ZW50
cworICAgIGFyZSBsb2FkZWQgY29tcGxldGVseSwgaW5kZXBlbmRlbnQgb2Ygc2NyaXB0IGV4ZWN1
dGlvbiBvciBwYWdlIHJlbmRlcmluZy4KKyAgICBJdHMgYXJndW1lbnQsIGVpdGhlciB0cnVlIG9y
IGZhbHNlLCBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIGxvYWQKKyAgICBvcGVyYXRpb24g
c3VjY2VlZGVkLgorCisgICAgXHNlY3Rpb24xIFVzaW5nIFFXZWJQYWdlIGluIGEgV2lkZ2V0LWxl
c3MgRW52aXJvbm1lbnQKKworICAgIEJlZm9yZSB5b3UgYmVnaW4gcGFpbnRpbmcgYSBRV2ViUGFn
ZSBvYmplY3QsIHlvdSBuZWVkIHRvIHNldCB0aGUgc2l6ZSBvZgorICAgIHRoZSB2aWV3cG9ydCBi
eSBjYWxsaW5nIHNldFZpZXdwb3J0U2l6ZSgpLiBUaGVuLCB5b3UgaW52b2tlIHRoZSBtYWluCisg
ICAgZnJhbWUncyByZW5kZXIgZnVuY3Rpb24gKFFXZWJGcmFtZTo6cmVuZGVyKCkpLiBBbiBleGFt
cGxlIG9mIHRoaXMKKyAgICBpcyBzaG93biBpbiB0aGUgY29kZSBzbmlwcGV0IGJlbG93LgorCisg
ICAgU3VwcG9zZSB3ZSBoYXZlIGEgXGMgVGh1bWJuYWlsIGNsYXNzIGFzIGZvbGxvd3M6CisKKyAg
ICBcc25pcHBldCB3ZWJraXRzbmlwcGV0cy93ZWJwYWdlL21haW4uY3BwIDAKKworICAgIFRoZSBc
YyBUaHVtYm5haWwncyBjb25zdHJ1Y3RvciB0YWtlcyBpbiBhIFxhIHVybC4gV2UgY29ubmVjdCBv
dXIgUVdlYlBhZ2UKKyAgICBvYmplY3QncyBcbHtRV2ViUGFnZTo6fXtsb2FkRmluaXNoZWQoKX0g
c2lnbmFsIHRvIG91ciBwcml2YXRlIHNsb3QsCisgICAgXGMgcmVuZGVyKCkuCisKKyAgICBcc25p
cHBldCB3ZWJraXRzbmlwcGV0cy93ZWJwYWdlL21haW4uY3BwIDEKKworICAgIFRoZSBcYyByZW5k
ZXIoKSBmdW5jdGlvbiBzaG93cyBob3cgd2UgY2FuIHBhaW50IGEgdGh1bWJuYWlsIHVzaW5nIGEK
KyAgICBRV2ViUGFnZSBvYmplY3QuCisKKyAgICBcc25pcHBldCB3ZWJraXRzbmlwcGV0cy93ZWJw
YWdlL21haW4uY3BwIDIKKworICAgIFdlIGJlZ2luIGJ5IHNldHRpbmcgdGhlIFxse1FXZWJQYWdl
Ojp2aWV3cG9ydFNpemUoKX17dmlld3BvcnRTaXplfSBhbmQKKyAgICB0aGVuIHdlIGluc3RhbnRp
YXRlIGEgUUltYWdlIG9iamVjdCwgXGMgaW1hZ2UsIHdpdGggdGhlIHNhbWUgc2l6ZSBhcyBvdXIK
KyAgICBcbHtRV2ViUGFnZTo6dmlld3BvcnRTaXplKCl9e3ZpZXdwb3J0U2l6ZX0uIFRoaXMgaW1h
Z2UgaXMgdGhlbiBzZW50CisgICAgYXMgYSBwYXJhbWV0ZXIgdG8gXGMgcGFpbnRlci4gTmV4dCwg
d2UgcmVuZGVyIHRoZSBjb250ZW50cyBvZiB0aGUgbWFpbgorICAgIGZyYW1lIGFuZCBpdHMgc3Vi
ZnJhbWVzIGludG8gXGMgcGFpbnRlci4gRmluYWxseSwgd2Ugc2F2ZSB0aGUgc2NhbGVkIGltYWdl
LgorCisgICAgXHNhIFFXZWJGcmFtZQorKi8KKworLyohCisgICAgQ29uc3RydWN0cyBhbiBlbXB0
eSBRV2ViUGFnZSB3aXRoIHBhcmVudCBcYSBwYXJlbnQuCisqLworUVdlYlBhZ2U6OlFXZWJQYWdl
KFFPYmplY3QgKnBhcmVudCkKKyAgICA6IFFPYmplY3QocGFyZW50KQorICAgICwgZChuZXcgUVdl
YlBhZ2VQcml2YXRlKHRoaXMpKQoreworICAgIHNldFZpZXcocW9iamVjdF9jYXN0PFFXaWRnZXQq
PihwYXJlbnQpKTsKKworICAgIGNvbm5lY3QodGhpcywgU0lHTkFMKGxvYWRQcm9ncmVzcyhpbnQp
KSwgdGhpcywgU0xPVChfcV9vbkxvYWRQcm9ncmVzc0NoYW5nZWQoaW50KSkpOworI2lmbmRlZiBO
REVCVUcKKyAgICBjb25uZWN0KFFDb3JlQXBwbGljYXRpb246Omluc3RhbmNlKCksIFNJR05BTChh
Ym91dFRvUXVpdCgpKSwgdGhpcywgU0xPVChfcV9jbGVhbnVwTGVha01lc3NhZ2VzKCkpKTsKKyNl
bmRpZgorfQorCisvKiEKKyAgICBEZXN0cm95cyB0aGUgd2ViIHBhZ2UuCisqLworUVdlYlBhZ2U6
On5RV2ViUGFnZSgpCit7CisgICAgZGVsZXRlIGQ7Cit9CisKKy8qIQorICAgIFJldHVybnMgdGhl
IG1haW4gZnJhbWUgb2YgdGhlIHBhZ2UuCisKKyAgICBUaGUgbWFpbiBmcmFtZSBwcm92aWRlcyBh
Y2Nlc3MgdG8gdGhlIGhpZXJhcmNoeSBvZiBzdWItZnJhbWVzIGFuZCBpcyBhbHNvIG5lZWRlZCBp
ZiB5b3UKKyAgICB3YW50IHRvIGV4cGxpY2l0bHkgcmVuZGVyIGEgd2ViIHBhZ2UgaW50byBhIGdp
dmVuIHBhaW50ZXIuCisKKyAgICBcc2EgY3VycmVudEZyYW1lKCkKKyovCitRV2ViRnJhbWUgKlFX
ZWJQYWdlOjptYWluRnJhbWUoKSBjb25zdAoreworICAgIGQtPmNyZWF0ZU1haW5GcmFtZSgpOwor
ICAgIHJldHVybiBkLT5tYWluRnJhbWUuZGF0YSgpOworfQorCisvKiEKKyAgICBSZXR1cm5zIHRo
ZSBmcmFtZSBjdXJyZW50bHkgYWN0aXZlLgorCisgICAgXHNhIG1haW5GcmFtZSgpLCBmcmFtZUNy
ZWF0ZWQoKQorKi8KK1FXZWJGcmFtZSAqUVdlYlBhZ2U6OmN1cnJlbnRGcmFtZSgpIGNvbnN0Cit7
CisgICAgZC0+Y3JlYXRlTWFpbkZyYW1lKCk7CisgICAgcmV0dXJuIHFvYmplY3RfY2FzdDxRV2Vi
RnJhbWUqPihkLT5jdXJyZW50RnJhbWUoKSk7Cit9CisKKworLyohCisgICAgXHNpbmNlIDQuNgor
CisgICAgUmV0dXJucyB0aGUgZnJhbWUgYXQgdGhlIGdpdmVuIHBvaW50IFxhIHBvcywgb3IgMCBp
ZiB0aGVyZSBpcyBubyBmcmFtZSBhdAorICAgIHRoYXQgcG9zaXRpb24uCisKKyAgICBcc2EgbWFp
bkZyYW1lKCksIGN1cnJlbnRGcmFtZSgpCisqLworUVdlYkZyYW1lKiBRV2ViUGFnZTo6ZnJhbWVB
dChjb25zdCBRUG9pbnQmIHBvcykgY29uc3QKK3sKKyAgICBRV2ViRnJhbWUqIHdlYkZyYW1lID0g
bWFpbkZyYW1lKCk7CisgICAgaWYgKCF3ZWJGcmFtZS0+Z2VvbWV0cnkoKS5jb250YWlucyhwb3Mp
KQorICAgICAgICByZXR1cm4gMDsKKyAgICBRV2ViSGl0VGVzdFJlc3VsdCBoaXRUZXN0UmVzdWx0
ID0gd2ViRnJhbWUtPmhpdFRlc3RDb250ZW50KHBvcyk7CisgICAgcmV0dXJuIGhpdFRlc3RSZXN1
bHQuZnJhbWUoKTsKK30KKworLyohCisgICAgUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHZpZXcn
cyBoaXN0b3J5IG9mIG5hdmlnYXRlZCB3ZWIgcGFnZXMuCisqLworUVdlYkhpc3RvcnkgKlFXZWJQ
YWdlOjpoaXN0b3J5KCkgY29uc3QKK3sKKyAgICBkLT5jcmVhdGVNYWluRnJhbWUoKTsKKyAgICBy
ZXR1cm4gJmQtPmhpc3Rvcnk7Cit9CisKKy8qIQorICAgIFNldHMgdGhlIFxhIHZpZXcgdGhhdCBp
cyBhc3NvY2lhdGVkIHdpdGggdGhlIHdlYiBwYWdlLgorCisgICAgXHNhIHZpZXcoKQorKi8KK3Zv
aWQgUVdlYlBhZ2U6OnNldFZpZXcoUVdpZGdldCogdmlldykKK3sKKyAgICBpZiAodGhpcy0+dmll
dygpID09IHZpZXcpCisgICAgICAgIHJldHVybjsKKworICAgIGQtPnZpZXcgPSB2aWV3OworICAg
IHNldFZpZXdwb3J0U2l6ZSh2aWV3ID8gdmlldy0+c2l6ZSgpIDogUVNpemUoMCwgMCkpOworCisg
ICAgLy8gSWYgd2UgaGF2ZSBubyBjbGllbnQsIHdlIGluc3RhbGwgYSBzcGVjaWFsIGNsaWVudCBk
ZWxlZ2F0aW5nCisgICAgLy8gdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHRoZSBRV2lkZ2V0LiBUaGlz
IGlzIHRoZSBjb2RlIHBhdGgKKyAgICAvLyBoYW5kbGluZyBhLm8uIHRoZSAibGVnYWN5IiBRV2Vi
Vmlldy4KKyAgICAvLworICAgIC8vIElmIHN1Y2ggYSBzcGVjaWFsIGRlbGVnYXRlIGFscmVhZHkg
ZXhpc3QsIHdlIHN1YnN0aXR1dGUgdGhlIHZpZXcuCisKKyAgICBpZiAoZC0+Y2xpZW50KSB7Cisg
ICAgICAgIGlmIChkLT5jbGllbnQtPmlzUVdpZGdldENsaWVudCgpKQorICAgICAgICAgICAgc3Rh
dGljX2Nhc3Q8UGFnZUNsaWVudFFXaWRnZXQqPihkLT5jbGllbnQuZGF0YSgpKS0+dmlldyA9IHZp
ZXc7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAodmlldykKKyAgICAgICAgZC0+
Y2xpZW50LnJlc2V0KG5ldyBQYWdlQ2xpZW50UVdpZGdldCh2aWV3LCB0aGlzKSk7Cit9CisKKy8q
IQorICAgIFJldHVybnMgdGhlIHZpZXcgd2lkZ2V0IHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRo
ZSB3ZWIgcGFnZS4KKworICAgIFxzYSBzZXRWaWV3KCkKKyovCitRV2lkZ2V0ICpRV2ViUGFnZTo6
dmlldygpIGNvbnN0Cit7CisgICAgcmV0dXJuIGQtPnZpZXcuZGF0YSgpOworfQorCisvKiEKKyAg
ICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuZXZlciBhIEphdmFTY3JpcHQgcHJvZ3JhbSB0
cmllcyB0byBwcmludCBhIFxhIG1lc3NhZ2UgdG8gdGhlIHdlYiBicm93c2VyJ3MgY29uc29sZS4K
KworICAgIEZvciBleGFtcGxlIGluIGNhc2Ugb2YgZXZhbHVhdGlvbiBlcnJvcnMgdGhlIHNvdXJj
ZSBVUkwgbWF5IGJlIHByb3ZpZGVkIGluIFxhIHNvdXJjZUlEIGFzIHdlbGwgYXMgdGhlIFxhIGxp
bmVOdW1iZXIuCisKKyAgICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBwcmludHMgbm90aGlu
Zy4KKyovCit2b2lkIFFXZWJQYWdlOjpqYXZhU2NyaXB0Q29uc29sZU1lc3NhZ2UoY29uc3QgUVN0
cmluZyYgbWVzc2FnZSwgaW50IGxpbmVOdW1iZXIsIGNvbnN0IFFTdHJpbmcmIHNvdXJjZUlEKQor
eworICAgIFFfVU5VU0VEKHNvdXJjZUlEKTsKKworICAgIC8vIENhdGNoIHBsdWdpbiBsb2dEZXN0
cm95IG1lc3NhZ2UgZm9yIExheW91dFRlc3RzL3BsdWdpbnMvb3Blbi1hbmQtY2xvc2Utd2luZG93
LXdpdGgtcGx1Z2luLmh0bWwKKyAgICAvLyBBdCB0aGlzIHBvaW50IERSVCdzIFdlYlBhZ2UgaGFz
IGFscmVhZHkgYmVlbiBkZXN0cm95ZWQKKyAgICBpZiAoUVdlYlBhZ2VBZGFwdGVyOjpkcnRSdW4p
IHsKKyAgICAgICAgaWYgKG1lc3NhZ2UgPT0gUUxhdGluMVN0cmluZygiUExVR0lOOiBOUFBfRGVz
dHJveSIpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIkNPTlNPTEUgTUVTU0FHRTog
Iik7CisgICAgICAgICAgICBpZiAobGluZU51bWJlcikKKyAgICAgICAgICAgICAgICBmcHJpbnRm
KHN0ZG91dCwgImxpbmUgJWQ6ICIsIGxpbmVOdW1iZXIpOworICAgICAgICAgICAgZnByaW50Zihz
dGRvdXQsICIlc1xuIiwgbWVzc2FnZS50b1V0ZjgoKS5jb25zdERhdGEoKSk7CisgICAgICAgIH0K
KyAgICB9Cit9CisKKy8qIQorICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW5ldmVyIGEg
SmF2YVNjcmlwdCBwcm9ncmFtIHJ1bm5pbmcgaW5zaWRlIFxhIGZyYW1lIGNhbGxzIHRoZSBhbGVy
dCgpIGZ1bmN0aW9uIHdpdGgKKyAgICB0aGUgbWVzc2FnZSBcYSBtc2cuCisKKyAgICBUaGUgZGVm
YXVsdCBpbXBsZW1lbnRhdGlvbiBzaG93cyB0aGUgbWVzc2FnZSwgXGEgbXNnLCB3aXRoIFFNZXNz
YWdlQm94OjppbmZvcm1hdGlvbi4KKyovCit2b2lkIFFXZWJQYWdlOjpqYXZhU2NyaXB0QWxlcnQo
UVdlYkZyYW1lICpmcmFtZSwgY29uc3QgUVN0cmluZyYgbXNnKQoreworICAgIFFfVU5VU0VEKGZy
YW1lKTsKKyNpZm5kZWYgUVRfTk9fTUVTU0FHRUJPWAorICAgIFFNZXNzYWdlQm94IGJveCh2aWV3
KCkpOworICAgIGJveC5zZXRXaW5kb3dUaXRsZSh0cigiSmF2YVNjcmlwdCBBbGVydCAtICUxIiku
YXJnKG1haW5GcmFtZSgpLT51cmwoKS5ob3N0KCkpKTsKKyAgICBib3guc2V0VGV4dEZvcm1hdChR
dDo6UGxhaW5UZXh0KTsKKyAgICBib3guc2V0VGV4dChtc2cpOworICAgIGJveC5zZXRTdGFuZGFy
ZEJ1dHRvbnMoUU1lc3NhZ2VCb3g6Ok9rKTsKKyAgICBib3guZXhlYygpOworI2VuZGlmCit9CisK
Ky8qIQorICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW5ldmVyIGEgSmF2YVNjcmlwdCBw
cm9ncmFtIHJ1bm5pbmcgaW5zaWRlIFxhIGZyYW1lIGNhbGxzIHRoZSBjb25maXJtKCkgZnVuY3Rp
b24KKyAgICB3aXRoIHRoZSBtZXNzYWdlLCBcYSBtc2cuIFJldHVybnMgdHJ1ZSBpZiB0aGUgdXNl
ciBjb25maXJtcyB0aGUgbWVzc2FnZTsgb3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuCisKKyAgICBU
aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBleGVjdXRlcyB0aGUgcXVlcnkgdXNpbmcgUU1lc3Nh
Z2VCb3g6OmluZm9ybWF0aW9uIHdpdGggUU1lc3NhZ2VCb3g6Ok9rIGFuZCBRTWVzc2FnZUJveDo6
Q2FuY2VsIGJ1dHRvbnMuCisqLworYm9vbCBRV2ViUGFnZTo6amF2YVNjcmlwdENvbmZpcm0oUVdl
YkZyYW1lICpmcmFtZSwgY29uc3QgUVN0cmluZyYgbXNnKQoreworICAgIFFfVU5VU0VEKGZyYW1l
KTsKKyNpZmRlZiBRVF9OT19NRVNTQUdFQk9YCisgICAgcmV0dXJuIHRydWU7CisjZWxzZQorICAg
IFFNZXNzYWdlQm94IGJveCh2aWV3KCkpOworICAgIGJveC5zZXRXaW5kb3dUaXRsZSh0cigiSmF2
YVNjcmlwdCBDb25maXJtIC0gJTEiKS5hcmcobWFpbkZyYW1lKCktPnVybCgpLmhvc3QoKSkpOwor
ICAgIGJveC5zZXRUZXh0Rm9ybWF0KFF0OjpQbGFpblRleHQpOworICAgIGJveC5zZXRUZXh0KG1z
Zyk7CisgICAgYm94LnNldFN0YW5kYXJkQnV0dG9ucyhRTWVzc2FnZUJveDo6T2sgfCBRTWVzc2Fn
ZUJveDo6Q2FuY2VsKTsKKyAgICByZXR1cm4gUU1lc3NhZ2VCb3g6Ok9rID09IGJveC5leGVjKCk7
CisjZW5kaWYKK30KKworLyohCisgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbmV2ZXIg
YSBKYXZhU2NyaXB0IHByb2dyYW0gcnVubmluZyBpbnNpZGUgXGEgZnJhbWUgdHJpZXMgdG8gcHJv
bXB0IHRoZSB1c2VyIGZvciBpbnB1dC4KKyAgICBUaGUgcHJvZ3JhbSBtYXkgcHJvdmlkZSBhbiBv
cHRpb25hbCBtZXNzYWdlLCBcYSBtc2csIGFzIHdlbGwgYXMgYSBkZWZhdWx0IHZhbHVlIGZvciB0
aGUgaW5wdXQgaW4gXGEgZGVmYXVsdFZhbHVlLgorCisgICAgSWYgdGhlIHByb21wdCB3YXMgY2Fu
Y2VsbGVkIGJ5IHRoZSB1c2VyIHRoZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgcmV0dXJuIGZhbHNl
OyBvdGhlcndpc2UgdGhlCisgICAgcmVzdWx0IHNob3VsZCBiZSB3cml0dGVuIHRvIFxhIHJlc3Vs
dCBhbmQgdHJ1ZSBzaG91bGQgYmUgcmV0dXJuZWQuIElmIHRoZSBwcm9tcHQgd2FzIG5vdCBjYW5j
ZWxsZWQgYnkgdGhlCisgICAgdXNlciwgdGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCByZXR1cm4g
dHJ1ZSBhbmQgdGhlIHJlc3VsdCBzdHJpbmcgbXVzdCBub3QgYmUgbnVsbC4KKworICAgIFRoZSBk
ZWZhdWx0IGltcGxlbWVudGF0aW9uIHVzZXMgUUlucHV0RGlhbG9nOjpnZXRUZXh0KCkuCisqLwor
Ym9vbCBRV2ViUGFnZTo6amF2YVNjcmlwdFByb21wdChRV2ViRnJhbWUgKmZyYW1lLCBjb25zdCBR
U3RyaW5nJiBtc2csIGNvbnN0IFFTdHJpbmcmIGRlZmF1bHRWYWx1ZSwgUVN0cmluZyogcmVzdWx0
KQoreworICAgIFFfVU5VU0VEKGZyYW1lKTsKKyAgICBib29sIG9rID0gZmFsc2U7CisjaWZuZGVm
IFFUX05PX0lOUFVURElBTE9HCisKKyAgICBRSW5wdXREaWFsb2cgZGxnKHZpZXcoKSk7CisgICAg
ZGxnLnNldFdpbmRvd1RpdGxlKHRyKCJKYXZhU2NyaXB0IFByb21wdCAtICUxIikuYXJnKG1haW5G
cmFtZSgpLT51cmwoKS5ob3N0KCkpKTsKKworICAgIC8vIEhhY2sgdG8gZm9yY2UgdGhlIGRpYWxv
ZydzIFFMYWJlbCBpbnRvIHBsYWluIHRleHQgbW9kZQorICAgIC8vIHByZXZlbnRzIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zNDQyOQorICAgIFFMYWJlbCogbGFiZWwg
PSBkbGcuZmluZENoaWxkPFFMYWJlbCo+KCk7CisgICAgaWYgKGxhYmVsKQorICAgICAgICBsYWJl
bC0+c2V0VGV4dEZvcm1hdChRdDo6UGxhaW5UZXh0KTsKKworICAgIC8vIGRvdWJsZSB0aGUgJidz
IGJlY2F1c2Ugc2luZ2xlICYgd2lsbCB1bmRlcmxpbmUgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXIK
KyAgICAvLyAoQWNjZWxlcmF0b3IgbW5lbW9uaWNzKQorICAgIFFTdHJpbmcgZXNjTXNnKG1zZyk7
CisgICAgZXNjTXNnLnJlcGxhY2UoUUNoYXI6OmZyb21MYXRpbjEoJyYnKSwgUUxhdGluMVN0cmlu
ZygiJiYiKSk7CisgICAgZGxnLnNldExhYmVsVGV4dChlc2NNc2cpOworCisgICAgZGxnLnNldFRl
eHRFY2hvTW9kZShRTGluZUVkaXQ6Ok5vcm1hbCk7CisgICAgZGxnLnNldFRleHRWYWx1ZShkZWZh
dWx0VmFsdWUpOworCisgICAgb2sgPSAhIWRsZy5leGVjKCk7CisKKyAgICBpZiAob2sgJiYgcmVz
dWx0KQorICAgICAgICAqcmVzdWx0ID0gZGxnLnRleHRWYWx1ZSgpOworI2VuZGlmCisgICAgcmV0
dXJuIG9rOworfQorCisvKiEKKyAgICBcZm4gYm9vbCBRV2ViUGFnZTo6c2hvdWxkSW50ZXJydXB0
SmF2YVNjcmlwdCgpCisgICAgXHNpbmNlIDQuNgorICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVk
IHdoZW4gYSBKYXZhU2NyaXB0IHByb2dyYW0gaXMgcnVubmluZyBmb3IgYSBsb25nIHBlcmlvZCBv
ZiB0aW1lLgorCisgICAgSWYgdGhlIHVzZXIgd2FudGVkIHRvIHN0b3AgdGhlIEphdmFTY3JpcHQg
dGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCByZXR1cm4gdHJ1ZTsgb3RoZXJ3aXNlIGZhbHNlLgor
CisgICAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZXhlY3V0ZXMgdGhlIHF1ZXJ5IHVzaW5n
IFFNZXNzYWdlQm94OjppbmZvcm1hdGlvbiB3aXRoIFFNZXNzYWdlQm94OjpZZXMgYW5kIFFNZXNz
YWdlQm94OjpObyBidXR0b25zLgorKi8KK2Jvb2wgUVdlYlBhZ2U6OnNob3VsZEludGVycnVwdEph
dmFTY3JpcHQoKQoreworI2lmZGVmIFFUX05PX01FU1NBR0VCT1gKKyAgICByZXR1cm4gZmFsc2U7
CisjZWxzZQorICAgIHJldHVybiBRTWVzc2FnZUJveDo6WWVzID09IFFNZXNzYWdlQm94OjppbmZv
cm1hdGlvbih2aWV3KCksIHRyKCJKYXZhU2NyaXB0IFByb2JsZW0gLSAlMSIpLmFyZyhtYWluRnJh
bWUoKS0+dXJsKCkuaG9zdCgpKSwgdHIoIlRoZSBzY3JpcHQgb24gdGhpcyBwYWdlIGFwcGVhcnMg
dG8gaGF2ZSBhIHByb2JsZW0uIERvIHlvdSB3YW50IHRvIHN0b3AgdGhlIHNjcmlwdD8iKSwgUU1l
c3NhZ2VCb3g6OlllcywgUU1lc3NhZ2VCb3g6Ok5vKTsKKyNlbmRpZgorfQorCit2b2lkIFFXZWJQ
YWdlOjpzZXRGZWF0dXJlUGVybWlzc2lvbihRV2ViRnJhbWUqIGZyYW1lLCBGZWF0dXJlIGZlYXR1
cmUsIFBlcm1pc3Npb25Qb2xpY3kgcG9saWN5KQoreworICAgIHN3aXRjaCAoZmVhdHVyZSkgewor
ICAgIGNhc2UgTm90aWZpY2F0aW9uczoKKyNpZiBFTkFCTEUoTk9USUZJQ0FUSU9OUykgfHwgRU5B
QkxFKExFR0FDWV9OT1RJRklDQVRJT05TKQorICAgICAgICBpZiAocG9saWN5ID09IFBlcm1pc3Np
b25HcmFudGVkQnlVc2VyKQorICAgICAgICAgICAgZC0+YWxsb3dOb3RpZmljYXRpb25zRm9yRnJh
bWUoZnJhbWUtPmQpOworI2VuZGlmCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR2VvbG9jYXRp
b246CisjaWYgRU5BQkxFKEdFT0xPQ0FUSU9OKQorICAgICAgICBpZiAocG9saWN5ICE9IFBlcm1p
c3Npb25Vbmtub3duKQorICAgICAgICAgICAgZC0+c2V0R2VvbG9jYXRpb25FbmFibGVkRm9yRnJh
bWUoZnJhbWUtPmQsIChwb2xpY3kgPT0gUGVybWlzc2lvbkdyYW50ZWRCeVVzZXIpKTsKKyNlbmRp
ZgorICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0K
K30KKworLyohCisgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbmV2ZXIgV2ViS2l0IHdh
bnRzIHRvIGNyZWF0ZSBhIG5ldyB3aW5kb3cgb2YgdGhlIGdpdmVuIFxhIHR5cGUsIGZvcgorICAg
IGV4YW1wbGUgd2hlbiBhIEphdmFTY3JpcHQgcHJvZ3JhbSByZXF1ZXN0cyB0byBvcGVuIGEgZG9j
dW1lbnQgaW4gYSBuZXcgd2luZG93LgorCisgICAgSWYgdGhlIG5ldyB3aW5kb3cgY2FuIGJlIGNy
ZWF0ZWQsIHRoZSBuZXcgd2luZG93J3MgUVdlYlBhZ2UgaXMgcmV0dXJuZWQ7IG90aGVyd2lzZSBh
IG51bGwgcG9pbnRlciBpcyByZXR1cm5lZC4KKworICAgIElmIHRoZSB2aWV3IGFzc29jaWF0ZWQg
d2l0aCB0aGUgd2ViIHBhZ2UgaXMgYSBRV2ViVmlldyBvYmplY3QsIHRoZW4gdGhlIGRlZmF1bHQg
aW1wbGVtZW50YXRpb24gZm9yd2FyZHMKKyAgICB0aGUgcmVxdWVzdCB0byBRV2ViVmlldydzIGNy
ZWF0ZVdpbmRvdygpIGZ1bmN0aW9uOyBvdGhlcndpc2UgaXQgcmV0dXJucyBhIG51bGwgcG9pbnRl
ci4KKworICAgIElmIFxhIHR5cGUgaXMgV2ViTW9kYWxEaWFsb2csIHRoZSBhcHBsaWNhdGlvbiBt
dXN0IGNhbGwgc2V0V2luZG93TW9kYWxpdHkoUXQ6OkFwcGxpY2F0aW9uTW9kYWwpIG9uIHRoZSBu
ZXcgd2luZG93LgorCisgICAgXG5vdGUgSW4gdGhlIGNhc2VzIHdoZW4gdGhlIHdpbmRvdyBjcmVh
dGlvbiBpcyBiZWluZyB0cmlnZ2VyZWQgYnkgSmF2YVNjcmlwdCwgYXBhcnQgZnJvbQorICAgIHJl
aW1wbGVtZW50aW5nIHRoaXMgbWV0aG9kIGFwcGxpY2F0aW9uIG11c3QgYWxzbyBzZXQgdGhlIEph
dmFTY3JpcHRDYW5PcGVuV2luZG93cyBhdHRyaWJ1dGUKKyAgICBvZiBRV2ViU2V0dGluZ3MgdG8g
dHJ1ZSBpbiBvcmRlciBmb3IgaXQgdG8gZ2V0IGNhbGxlZC4KKworICAgIFxzYSBhY2NlcHROYXZp
Z2F0aW9uUmVxdWVzdCgpLCBRV2ViVmlldzo6Y3JlYXRlV2luZG93KCkKKyovCitRV2ViUGFnZSAq
UVdlYlBhZ2U6OmNyZWF0ZVdpbmRvdyhXZWJXaW5kb3dUeXBlIHR5cGUpCit7CisgICAgUVdlYlZp
ZXcgKndlYlZpZXcgPSBxb2JqZWN0X2Nhc3Q8UVdlYlZpZXcqPih2aWV3KCkpOworICAgIGlmICh3
ZWJWaWV3KSB7CisgICAgICAgIFFXZWJWaWV3ICpuZXdWaWV3ID0gd2ViVmlldy0+Y3JlYXRlV2lu
ZG93KHR5cGUpOworICAgICAgICBpZiAobmV3VmlldykKKyAgICAgICAgICAgIHJldHVybiBuZXdW
aWV3LT5wYWdlKCk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKiEKKyAgICBUaGlzIGZ1
bmN0aW9uIGlzIGNhbGxlZCB3aGVuZXZlciBXZWJLaXQgZW5jb3VudGVycyBhIEhUTUwgb2JqZWN0
IGVsZW1lbnQgd2l0aCB0eXBlICJhcHBsaWNhdGlvbi94LXF0LXBsdWdpbiIuIEl0IGlzCisgICAg
Y2FsbGVkIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlIG9mIFFXZWJTZXR0aW5nczo6UGx1Z2luc0Vu
YWJsZWQuIFRoZSBcYSBjbGFzc2lkLCBcYSB1cmwsIFxhIHBhcmFtTmFtZXMgYW5kIFxhIHBhcmFt
VmFsdWVzCisgICAgY29ycmVzcG9uZCB0byB0aGUgSFRNTCBvYmplY3QgZWxlbWVudCBhdHRyaWJ1
dGVzIGFuZCBjaGlsZCBlbGVtZW50cyB0byBjb25maWd1cmUgdGhlIGVtYmVkZGFibGUgb2JqZWN0
LgorKi8KK1FPYmplY3QgKlFXZWJQYWdlOjpjcmVhdGVQbHVnaW4oY29uc3QgUVN0cmluZyAmY2xh
c3NpZCwgY29uc3QgUVVybCAmdXJsLCBjb25zdCBRU3RyaW5nTGlzdCAmcGFyYW1OYW1lcywgY29u
c3QgUVN0cmluZ0xpc3QgJnBhcmFtVmFsdWVzKQoreworICAgIFFfVU5VU0VEKGNsYXNzaWQpOwor
ICAgIFFfVU5VU0VEKHVybCk7CisgICAgUV9VTlVTRUQocGFyYW1OYW1lcyk7CisgICAgUV9VTlVT
RUQocGFyYW1WYWx1ZXMpOworICAgIHJldHVybiAwOworfQorCisvKiEKKyAqICBSZXR1cm5zIHRo
ZSBsaXN0IG9mIGFsbCBjb250ZW50IHR5cGVzIHN1cHBvcnRlZCBieSBRV2ViUGFnZS4KKyAqLwor
UVN0cmluZ0xpc3QgUVdlYlBhZ2U6OnN1cHBvcnRlZENvbnRlbnRUeXBlcygpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIGQtPnN1cHBvcnRlZENvbnRlbnRUeXBlcygpOworfQorCisvKiEKKyAqICBSZXR1
cm5zIHRydWUgaWYgUVdlYlBhZ2UgY2FuIGhhbmRsZSB0aGUgZ2l2ZW4gXGEgbWltZVR5cGU7IG90
aGVyd2lzZSwgcmV0dXJucyBmYWxzZS4KKyAqLworYm9vbCBRV2ViUGFnZTo6c3VwcG9ydHNDb250
ZW50VHlwZShjb25zdCBRU3RyaW5nJiBtaW1lVHlwZSkgY29uc3QKK3sKKyAgICByZXR1cm4gZC0+
c3VwcG9ydHNDb250ZW50VHlwZShtaW1lVHlwZSk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbGxlY3RD
aGlsZEZyYW1lcyhRV2ViRnJhbWUqIGZyYW1lLCBRTGlzdDxRV2ViRnJhbWUqPiYgbGlzdCkKK3sK
KyAgICBsaXN0IDw8IGZyYW1lLT5jaGlsZEZyYW1lcygpOworICAgIFFMaXN0SXRlcmF0b3I8UVdl
YkZyYW1lKj4gaXQoZnJhbWUtPmNoaWxkRnJhbWVzKCkpOworICAgIHdoaWxlIChpdC5oYXNOZXh0
KCkpIHsKKyAgICAgICAgY29sbGVjdENoaWxkRnJhbWVzKGl0Lm5leHQoKSwgbGlzdCk7CisgICAg
fQorfQorCisvKiEKKyAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgdG8gdHJpZ2dlciB0
aGUgc3BlY2lmaWVkIFxhIGFjdGlvbi4KKyAgICBJdCBpcyBhbHNvIGNhbGxlZCBieSBRdFdlYktp
dCBpZiB0aGUgdXNlciB0cmlnZ2VycyB0aGUgYWN0aW9uLCBmb3IgZXhhbXBsZQorICAgIHRocm91
Z2ggYSBjb250ZXh0IG1lbnUgaXRlbS4KKworICAgIElmIFxhIGFjdGlvbiBpcyBhIGNoZWNrYWJs
ZSBhY3Rpb24gdGhlbiBcYSBjaGVja2VkIHNwZWNpZmllZCB3aGV0aGVyIHRoZSBhY3Rpb24KKyAg
ICBpcyB0b2dnbGVkIG9yIG5vdC4KKworICAgIFxzYSBhY3Rpb24oKQorKi8KK3ZvaWQgUVdlYlBh
Z2U6OnRyaWdnZXJBY3Rpb24oV2ViQWN0aW9uIGFjdGlvbiwgYm9vbCkKK3sKKyAgICBjb25zdCBj
aGFyICpjb21tYW5kID0gMDsKKyAgICBRV2ViUGFnZUFkYXB0ZXI6Ok1lbnVBY3Rpb24gbWFwcGVk
QWN0aW9uID0gUVdlYlBhZ2VBZGFwdGVyOjpOb0FjdGlvbjsKKyAgICBRV2ViSGl0VGVzdFJlc3Vs
dFByaXZhdGUqIGhpdFRlc3RSZXN1bHQgPSBkLT5oaXRUZXN0UmVzdWx0LmQ7CisKKyAgICBzd2l0
Y2ggKGFjdGlvbikgeworICAgIGNhc2UgT3Blbkxpbms6CisgICAgY2FzZSBPcGVuTGlua0luTmV3
V2luZG93OgorICAgIGNhc2UgT3BlbkxpbmtJblRoaXNXaW5kb3c6CisgICAgY2FzZSBPcGVuRnJh
bWVJbk5ld1dpbmRvdzoKKyAgICBjYXNlIENvcHlMaW5rVG9DbGlwYm9hcmQ6CisgICAgY2FzZSBP
cGVuSW1hZ2VJbk5ld1dpbmRvdzoKKyAgICBjYXNlIERvd25sb2FkSW1hZ2VUb0Rpc2s6CisgICAg
Y2FzZSBEb3dubG9hZExpbmtUb0Rpc2s6CisgICAgY2FzZSBCYWNrOgorICAgIGNhc2UgRm9yd2Fy
ZDoKKyAgICBjYXNlIFN0b3A6CisgICAgY2FzZSBSZWxvYWQ6CisgICAgY2FzZSBTZXRUZXh0RGly
ZWN0aW9uRGVmYXVsdDoKKyAgICBjYXNlIFNldFRleHREaXJlY3Rpb25MZWZ0VG9SaWdodDoKKyAg
ICBjYXNlIFNldFRleHREaXJlY3Rpb25SaWdodFRvTGVmdDoKKyAgICAgICAgbWFwcGVkQWN0aW9u
ID0gYWRhcHRlck1lbnVBY3Rpb25Gb3JXZWJBY3Rpb24oYWN0aW9uKTsKKyAgICAgICAgYnJlYWs7
CisgICAgY2FzZSBSZWxvYWRBbmRCeXBhc3NDYWNoZTogLy8gTWFudWFsIG1hcHBpbmcKKyAgICAg
ICAgbWFwcGVkQWN0aW9uID0gUVdlYlBhZ2VBZGFwdGVyOjpSZWxvYWQ7CisgICAgICAgIGJyZWFr
OworI2lmbmRlZiBRVF9OT19DTElQQk9BUkQKKyAgICBjYXNlIENvcHlJbWFnZVRvQ2xpcGJvYXJk
OgorICAgICAgICBRQXBwbGljYXRpb246OmNsaXBib2FyZCgpLT5zZXRQaXhtYXAoZC0+aGl0VGVz
dFJlc3VsdC5waXhtYXAoKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ29weUltYWdlVXJs
VG9DbGlwYm9hcmQ6CisgICAgICAgIFFBcHBsaWNhdGlvbjo6Y2xpcGJvYXJkKCktPnNldFRleHQo
ZC0+aGl0VGVzdFJlc3VsdC5pbWFnZVVybCgpLnRvU3RyaW5nKCkpOworICAgICAgICBicmVhazsK
KyNlbmRpZgorICAgIGNhc2UgSW5zcGVjdEVsZW1lbnQ6IHsKKyNpZiBFTkFCTEUoSU5TUEVDVE9S
KQorICAgICAgICBpZiAoIWQtPmhpdFRlc3RSZXN1bHQuaXNOdWxsKCkpIHsKKyAgICAgICAgICAg
IGQtPmdldE9yQ3JlYXRlSW5zcGVjdG9yKCk7IC8vIE1ha2Ugc3VyZSB0aGUgaW5zcGVjdG9yIGlz
IGNyZWF0ZWQKKyAgICAgICAgICAgIGQtPmluc3BlY3Rvci0+c2hvdygpOyAvLyBUaGUgaW5zcGVj
dG9yIGlzIGV4cGVjdGVkIHRvIGJlIHNob3duIG9uIGluc3BlY3Rpb24KKyAgICAgICAgICAgIG1h
cHBlZEFjdGlvbiA9IFFXZWJQYWdlQWRhcHRlcjo6SW5zcGVjdEVsZW1lbnQ7CisgICAgICAgIH0K
KyNlbmRpZgorICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGNhc2UgU3RvcFNjaGVkdWxl
ZFBhZ2VSZWZyZXNoOiB7CisgICAgICAgIFFXZWJGcmFtZSogdG9wRnJhbWUgPSBtYWluRnJhbWUo
KTsKKyAgICAgICAgdG9wRnJhbWUtPmQtPmNhbmNlbExvYWQoKTsKKyAgICAgICAgUUxpc3Q8UVdl
YkZyYW1lKj4gY2hpbGRGcmFtZXM7CisgICAgICAgIGNvbGxlY3RDaGlsZEZyYW1lcyh0b3BGcmFt
ZSwgY2hpbGRGcmFtZXMpOworICAgICAgICBRTGlzdEl0ZXJhdG9yPFFXZWJGcmFtZSo+IGl0KGNo
aWxkRnJhbWVzKTsKKyAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKKyAgICAgICAgICAgIGl0
Lm5leHQoKS0+ZC0+Y2FuY2VsTG9hZCgpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGVm
YXVsdDoKKyAgICAgICAgY29tbWFuZCA9IFFXZWJQYWdlUHJpdmF0ZTo6ZWRpdG9yQ29tbWFuZEZv
cldlYkFjdGlvbnMoYWN0aW9uKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChjb21t
YW5kIHx8IG1hcHBlZEFjdGlvbiAhPSBRV2ViUGFnZUFkYXB0ZXI6Ok5vQWN0aW9uKQorICAgICAg
ICBkLT50cmlnZ2VyQWN0aW9uKG1hcHBlZEFjdGlvbiwgaGl0VGVzdFJlc3VsdCwgY29tbWFuZCwg
LyplbmRUb0VuZFJlbG9hZCovIGFjdGlvbiA9PSBSZWxvYWRBbmRCeXBhc3NDYWNoZSk7Cit9CisK
KworUUNvbG9yIFFXZWJQYWdlUHJpdmF0ZTo6Y29sb3JTZWxlY3Rpb25SZXF1ZXN0ZWQoY29uc3Qg
UUNvbG9yICZzZWxlY3RlZENvbG9yKQoreworICAgIFFDb2xvciByZXQgPSBzZWxlY3RlZENvbG9y
OworI2lmbmRlZiBRVF9OT19DT0xPUkRJQUxPRworICAgIHJldCA9IFFDb2xvckRpYWxvZzo6Z2V0
Q29sb3Ioc2VsZWN0ZWRDb2xvciwgcS0+dmlldygpKTsKKyAgICBpZiAoIXJldC5pc1ZhbGlkKCkp
CisgICAgICAgIHJldCA9IHNlbGVjdGVkQ29sb3I7CisjZW5kaWYKKyAgICByZXR1cm4gcmV0Owor
fQorCitRV2ViU2VsZWN0TWV0aG9kICpRV2ViUGFnZVByaXZhdGU6OmNyZWF0ZVNlbGVjdFBvcHVw
KCkKK3sKKyAgICByZXR1cm4gbmV3IFF0RmFsbGJhY2tXZWJQb3B1cCh0aGlzKTsKK30KKworUVJl
Y3QgUVdlYlBhZ2VQcml2YXRlOjp2aWV3UmVjdFJlbGF0aXZlVG9XaW5kb3coKQoreworCisgICAg
UVdpZGdldCogb3duZXJXaWRnZXQ9IGNsaWVudC5pc051bGwoKSA/IDAgOiBxb2JqZWN0X2Nhc3Q8
UVdpZGdldCo+KGNsaWVudC0+b3duZXJXaWRnZXQoKSk7CisgICAgaWYgKCFvd25lcldpZGdldCkK
KyAgICAgICAgcmV0dXJuIFFSZWN0KCk7CisgICAgUVdpZGdldCogdG9wTGV2ZWxXaWRnZXQgPSBv
d25lcldpZGdldC0+d2luZG93KCk7CisKKyAgICBRUG9pbnQgdG9wTGVmdENvcm5lciA9IG93bmVy
V2lkZ2V0LT5tYXBGcm9tKHRvcExldmVsV2lkZ2V0LCBRUG9pbnQoMCwgMCkpOworICAgIHJldHVy
biBRUmVjdCh0b3BMZWZ0Q29ybmVyLCBvd25lcldpZGdldC0+c2l6ZSgpKTsKK30KKwordm9pZCBR
V2ViUGFnZVByaXZhdGU6Omdlb2xvY2F0aW9uUGVybWlzc2lvblJlcXVlc3RlZChRV2ViRnJhbWVB
ZGFwdGVyKiBmcmFtZSkKK3sKKyAgICBlbWl0IHEtPmZlYXR1cmVQZXJtaXNzaW9uUmVxdWVzdGVk
KFFXZWJGcmFtZVByaXZhdGU6OmtpdChmcmFtZSksIFFXZWJQYWdlOjpHZW9sb2NhdGlvbik7Cit9
CisKK3ZvaWQgUVdlYlBhZ2VQcml2YXRlOjpnZW9sb2NhdGlvblBlcm1pc3Npb25SZXF1ZXN0Q2Fu
Y2VsbGVkKFFXZWJGcmFtZUFkYXB0ZXIqIGZyYW1lKQoreworICAgIGVtaXQgcS0+ZmVhdHVyZVBl
cm1pc3Npb25SZXF1ZXN0Q2FuY2VsZWQoUVdlYkZyYW1lUHJpdmF0ZTo6a2l0KGZyYW1lKSwgUVdl
YlBhZ2U6Okdlb2xvY2F0aW9uKTsKK30KKwordm9pZCBRV2ViUGFnZVByaXZhdGU6Om5vdGlmaWNh
dGlvbnNQZXJtaXNzaW9uUmVxdWVzdGVkKFFXZWJGcmFtZUFkYXB0ZXIqIGZyYW1lKQoreworICAg
IGVtaXQgcS0+ZmVhdHVyZVBlcm1pc3Npb25SZXF1ZXN0ZWQoUVdlYkZyYW1lUHJpdmF0ZTo6a2l0
KGZyYW1lKSwgUVdlYlBhZ2U6Ok5vdGlmaWNhdGlvbnMpOworfQorCit2b2lkIFFXZWJQYWdlUHJp
dmF0ZTo6bm90aWZpY2F0aW9uc1Blcm1pc3Npb25SZXF1ZXN0Q2FuY2VsbGVkKFFXZWJGcmFtZUFk
YXB0ZXIqIGZyYW1lKQoreworICAgIGVtaXQgcS0+ZmVhdHVyZVBlcm1pc3Npb25SZXF1ZXN0Q2Fu
Y2VsZWQoUVdlYkZyYW1lUHJpdmF0ZTo6a2l0KGZyYW1lKSwgUVdlYlBhZ2U6Ok5vdGlmaWNhdGlv
bnMpOworfQorCit2b2lkIFFXZWJQYWdlUHJpdmF0ZTo6cmVzcG9uZFRvQ2hhbmdlZENvbnRlbnRz
KCkKK3sKKyAgICB1cGRhdGVFZGl0b3JBY3Rpb25zKCk7CisKKyAgICBlbWl0IHEtPmNvbnRlbnRz
Q2hhbmdlZCgpOworfQorCit2b2lkIFFXZWJQYWdlUHJpdmF0ZTo6cmVzcG9uZFRvQ2hhbmdlZFNl
bGVjdGlvbigpCit7CisgICAgdXBkYXRlRWRpdG9yQWN0aW9ucygpOworICAgIGVtaXQgcS0+c2Vs
ZWN0aW9uQ2hhbmdlZCgpOworfQorCit2b2lkIFFXZWJQYWdlUHJpdmF0ZTo6bWljcm9Gb2N1c0No
YW5nZWQoKQoreworICAgIGVtaXQgcS0+bWljcm9Gb2N1c0NoYW5nZWQoKTsKK30KKwordm9pZCBR
V2ViUGFnZVByaXZhdGU6OnRyaWdnZXJDb3B5QWN0aW9uKCkKK3sKKyAgICBxLT50cmlnZ2VyQWN0
aW9uKFFXZWJQYWdlOjpDb3B5KTsKK30KKwordm9pZCBRV2ViUGFnZVByaXZhdGU6OnRyaWdnZXJB
Y3Rpb25Gb3JLZXlFdmVudChRS2V5RXZlbnQqIGV2ZW50KQoreworICAgIFFXZWJQYWdlOjpXZWJB
Y3Rpb24gYWN0aW9uID0gZWRpdG9yQWN0aW9uRm9yS2V5RXZlbnQoZXZlbnQpOworICAgIHEtPnRy
aWdnZXJBY3Rpb24oYWN0aW9uKTsKK30KKwordm9pZCBRV2ViUGFnZVByaXZhdGU6OmNsZWFyVW5k
b1N0YWNrKCkKK3sKKyNpZm5kZWYgUVRfTk9fVU5ET1NUQUNLCisgICAgaWYgKHVuZG9TdGFjaykK
KyAgICAgICAgdW5kb1N0YWNrLT5jbGVhcigpOworI2VuZGlmCit9CisKK2Jvb2wgUVdlYlBhZ2VQ
cml2YXRlOjpjYW5VbmRvKCkgY29uc3QKK3sKKyNpZm5kZWYgUVRfTk9fVU5ET1NUQUNLCisgICAg
aWYgKCF1bmRvU3RhY2spCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdW5kb1N0
YWNrLT5jYW5VbmRvKCk7CisjZWxzZQorICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorfQorCiti
b29sIFFXZWJQYWdlUHJpdmF0ZTo6Y2FuUmVkbygpIGNvbnN0Cit7CisjaWZuZGVmIFFUX05PX1VO
RE9TVEFDSworICAgIGlmICghdW5kb1N0YWNrKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
cmV0dXJuIHVuZG9TdGFjay0+Y2FuUmVkbygpOworI2Vsc2UKKyAgICByZXR1cm4gZmFsc2U7Cisj
ZW5kaWYKK30KKwordm9pZCBRV2ViUGFnZVByaXZhdGU6OnVuZG8oKQoreworI2lmbmRlZiBRVF9O
T19VTkRPU1RBQ0sKKyAgICBpZiAodW5kb1N0YWNrKQorICAgICAgICB1bmRvU3RhY2stPnVuZG8o
KTsKKyNlbmRpZgorfQorCit2b2lkIFFXZWJQYWdlUHJpdmF0ZTo6cmVkbygpCit7CisjaWZuZGVm
IFFUX05PX1VORE9TVEFDSworICAgIGlmICh1bmRvU3RhY2spCisgICAgICAgIHVuZG9TdGFjay0+
cmVkbygpOworI2VuZGlmCit9CisKK3ZvaWQgUVdlYlBhZ2VQcml2YXRlOjpjcmVhdGVVbmRvU3Rl
cChRU2hhcmVkUG9pbnRlcjxVbmRvU3RlcFF0PiBzdGVwKQoreworI2lmbmRlZiBRVF9OT19VTkRP
U1RBQ0sKKyAgICAvLyBDYWxsIHVuZG9TdGFjaygpIGdldHRlciBmaXJzdCB0byBlbnN1cmUgc3Rh
Y2sgaXMgY3JlYXRlZAorICAgIC8vIGlmIGl0IGRvZXNuJ3QgZXhpc3QgeWV0LgorICAgIHEtPnVu
ZG9TdGFjaygpLT5wdXNoKG5ldyBRV2ViVW5kb0NvbW1hbmQoc3RlcCkpOworI2VuZGlmCit9CisK
K2NvbnN0IGNoYXIgKlFXZWJQYWdlUHJpdmF0ZTo6ZWRpdG9yQ29tbWFuZEZvcktleUV2ZW50KFFL
ZXlFdmVudCogZXZlbnQpCit7CisgICAgUVdlYlBhZ2U6OldlYkFjdGlvbiBhY3Rpb24gPSBlZGl0
b3JBY3Rpb25Gb3JLZXlFdmVudChldmVudCk7CisgICAgcmV0dXJuIGVkaXRvckNvbW1hbmRGb3JX
ZWJBY3Rpb25zKGFjdGlvbik7Cit9CisKK1FTaXplIFFXZWJQYWdlOjp2aWV3cG9ydFNpemUoKSBj
b25zdAoreworICAgIGlmIChkLT5tYWluRnJhbWUgJiYgZC0+bWFpbkZyYW1lLmRhdGEoKS0+ZC0+
aGFzVmlldygpKQorICAgICAgICByZXR1cm4gZC0+bWFpbkZyYW1lLmRhdGEoKS0+ZC0+ZnJhbWVS
ZWN0KCkuc2l6ZSgpOworCisgICAgcmV0dXJuIGQtPm1fdmlld3BvcnRTaXplOworfQorCisvKiEK
KyAgICBccHJvcGVydHkgUVdlYlBhZ2U6OnZpZXdwb3J0U2l6ZQorICAgIFxicmllZiB0aGUgc2l6
ZSBvZiB0aGUgdmlld3BvcnQKKworICAgIFRoZSBzaXplIGFmZmVjdHMgZm9yIGV4YW1wbGUgdGhl
IHZpc2liaWxpdHkgb2Ygc2Nyb2xsYmFycworICAgIGlmIHRoZSBkb2N1bWVudCBpcyBsYXJnZXIg
dGhhbiB0aGUgdmlld3BvcnQuCisKKyAgICBCeSBkZWZhdWx0LCBmb3IgYSBuZXdseS1jcmVhdGVk
IFdlYiBwYWdlLCB0aGlzIHByb3BlcnR5IGNvbnRhaW5zIGEgc2l6ZSB3aXRoCisgICAgemVybyB3
aWR0aCBhbmQgaGVpZ2h0LgorCisgICAgXHNhIFFXZWJGcmFtZTo6cmVuZGVyKCksIHByZWZlcnJl
ZENvbnRlbnRzU2l6ZQorKi8KK3ZvaWQgUVdlYlBhZ2U6OnNldFZpZXdwb3J0U2l6ZShjb25zdCBR
U2l6ZSAmc2l6ZSkgY29uc3QKK3sKKyAgICBkLT5tX3ZpZXdwb3J0U2l6ZSA9IHNpemU7CisKKyAg
ICBRV2ViRnJhbWVBZGFwdGVyKiBtYWluRnJhbWUgPSBkLT5tYWluRnJhbWVBZGFwdGVyKCk7Cisg
ICAgaWYgKCFtYWluRnJhbWUtPmhhc1ZpZXcoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbWFp
bkZyYW1lLT5zZXRWaWV3cG9ydFNpemUoc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0aW50ZW52
KGNvbnN0IGNoYXIqIHZhcmlhYmxlKQoreworICAgIGJvb2wgb2s7CisgICAgaW50IHZhbHVlID0g
cWdldGVudih2YXJpYWJsZSkudG9JbnQoJm9rKTsKKyAgICByZXR1cm4gKG9rKSA/IHZhbHVlIDog
LTE7Cit9CisKK3N0YXRpYyBRU2l6ZSBxdWVyeURldmljZVNpemVGb3JTY3JlZW5Db250YWluaW5n
V2lkZ2V0KGNvbnN0IFFXaWRnZXQqIHdpZGdldCkKK3sKKyAgICBRRGVza3RvcFdpZGdldCogZGVz
a3RvcCA9IFFBcHBsaWNhdGlvbjo6ZGVza3RvcCgpOworICAgIGlmICghZGVza3RvcCkKKyAgICAg
ICAgcmV0dXJuIFFTaXplKCk7CisKKyAgICBRU2l6ZSBzaXplOworCisgICAgaWYgKHdpZGdldCkg
eworICAgICAgICAvLyBSZXR1cm5zIHRoZSBhdmFpbGFibGUgZ2VvbWV0cnkgb2YgdGhlIHNjcmVl
biB3aGljaCBjb250YWlucyB3aWRnZXQuCisgICAgICAgIC8vIE5PVEU6IHRoaXMgbXVzdCBiZSB0
aGUgdGhlIGZ1bGwgc2NyZWVuIHNpemUgaW5jbHVkaW5nIGFueSBmaXhlZCBzdGF0dXMgYXJlYXMg
ZXRjLgorICAgICAgICBzaXplID0gZGVza3RvcC0+YXZhaWxhYmxlR2VvbWV0cnkod2lkZ2V0KS5z
aXplKCk7CisgICAgfSBlbHNlCisgICAgICAgIHNpemUgPSBkZXNrdG9wLT5hdmFpbGFibGVHZW9t
ZXRyeSgpLnNpemUoKTsKKworICAgIC8vIFRoaXMgbXVzdCBiZSBpbiBwb3J0cmFpdCBtb2RlLCBh
ZGp1c3QgaWYgbm90LgorICAgIGlmIChzaXplLndpZHRoKCkgPiBzaXplLmhlaWdodCgpKSB7Cisg
ICAgICAgIGludCB3aWR0aCA9IHNpemUud2lkdGgoKTsKKyAgICAgICAgc2l6ZS5zZXRXaWR0aChz
aXplLmhlaWdodCgpKTsKKyAgICAgICAgc2l6ZS5zZXRIZWlnaHQod2lkdGgpOworICAgIH0KKwor
ICAgIHJldHVybiBzaXplOworfQorCisvKiEKKyAgICBDb21wdXRlcyB0aGUgb3B0aW1hbCB2aWV3
cG9ydCBjb25maWd1cmF0aW9uIGdpdmVuIHRoZSBcYSBhdmFpbGFibGVTaXplLCB3aGVuCisgICAg
dXNlciBpbnRlcmZhY2UgY29tcG9uZW50cyBhcmUgZGlzcmVnYXJkZWQuCisKKyAgICBUaGUgY29u
ZmlndXJhdGlvbiBpcyBhbHNvIGRlcGVuZGVudCBvbiB0aGUgZGV2aWNlIHNjcmVlbiBzaXplIHdo
aWNoIGlzIG9idGFpbmVkCisgICAgYXV0b21hdGljYWxseS4gRm9yIHRlc3RpbmcgcHVycG9zZXMg
dGhlIHNpemUgY2FuIGJlIG92ZXJyaWRkZW4gYnkgc2V0dGluZyB0d28KKyAgICBlbnZpcm9ubWVu
dCB2YXJpYWJsZXMgUVRXRUJLSVRfREVWSUNFX1dJRFRIIGFuZCBRVFdFQktJVF9ERVZJQ0VfSEVJ
R0hULCB3aGljaAorICAgIGJvdGggbmVlZHMgdG8gYmUgc2V0LgorCisgICAgVGhlIFZpZXdwb3J0
QXR0cmlidXRlcyBpbmNsdWRlcyBhIHBpeGVsIGRlbnNpdHkgcmF0aW8sIHdoaWNoIHdpbGwgYWxz
byBiZSBleHBvc2VkIHRvCisgICAgdGhlIHdlYiBhdXRob3IgdGhvdWdoIHRoZSAtd2Via2l0LXBp
eGVsLXJhdGlvIG1lZGlhIGZlYXR1cmUuIFRoaXMgaXMgdGhlIHJhdGlvCisgICAgYmV0d2VlbiAx
IGRlbnNpdHktaW5kZXBlbmRlbnQgcGl4ZWwgKERQSSkgYW5kIHBoeXNpY2FsIHBpeGVscy4KKwor
ICAgIEEgZGVuc2l0eS1pbmRlcGVuZGVudCBwaXhlbCBpcyBlcXVpdmFsZW50IHRvIG9uZSBwaHlz
aWNhbCBwaXhlbCBvbiBhIDE2MCBEUEkgc2NyZWVuLAorICAgIHNvIG9uIG91ciBwbGF0Zm9ybSBh
c3N1bWVzIHRoYXQgYXMgdGhlIGJhc2VsaW5lIGRlbnNpdHkuCisKKyAgICBUaGUgY29udmVyc2lv
biBvZiBESVAgdW5pdHMgdG8gc2NyZWVuIHBpeGVscyBpcyBxdWl0ZSBzaW1wbGU6CisKKyAgICBw
aXhlbHMgPSBESVBzICogKGRlbnNpdHkgLyAxNjApLgorCisgICAgVGh1cywgb24gYSAyNDAgRFBJ
IHNjcmVlbiwgMSBESVBzIHdvdWxkIGVxdWFsIDEuNSBwaHlzaWNhbCBwaXhlbHMuCisKKyAgICBB
biBpbnZhbGlkIGluc3RhbmNlIHdpbGwgYmUgcmV0dXJuZWQgaW4gdGhlIGNhc2UgYW4gZW1wdHkg
c2l6ZSBpcyBwYXNzZWQgdG8gdGhlCisgICAgbWV0aG9kLgorCisgICAgXG5vdGUgVGhlIGRlbnNp
dHkgaXMgYXV0b21hdGljYWxseSBvYnRhaW5lZCBmcm9tIHRoZSBEUEkgb2YgdGhlIHNjcmVlbiB3
aGVyZSB0aGUgcGFnZQorICAgIGlzIGJlaW5nIHNob3duLCBidXQgYXMgbWFueSBYMTEgc2VydmVy
cyBhcmUgcmVwb3J0aW5nIHdyb25nIERQSSwgaXQgaXMgcG9zc2libGUgdG8KKyAgICBvdmVycmlk
ZSBpdCB1c2luZyBRWDExSW5mbzo6c2V0QXBwRHBpWSgpLgorKi8KKworUVdlYlBhZ2U6OlZpZXdw
b3J0QXR0cmlidXRlcyBRV2ViUGFnZTo6dmlld3BvcnRBdHRyaWJ1dGVzRm9yU2l6ZShjb25zdCBR
U2l6ZSYgYXZhaWxhYmxlU2l6ZSkgY29uc3QKK3sKKyAgICBWaWV3cG9ydEF0dHJpYnV0ZXMgcmVz
dWx0OworCisgICAgaWYgKGF2YWlsYWJsZVNpemUuaXNFbXB0eSgpKQorICAgICAgICAgcmV0dXJu
IHJlc3VsdDsgLy8gUmV0dXJucyBhbiBpbnZhbGlkIGluc3RhbmNlLgorCisgICAgUVNpemUgZGV2
aWNlU2l6ZShnZXRpbnRlbnYoIlFUV0VCS0lUX0RFVklDRV9XSURUSCIpLCBnZXRpbnRlbnYoIlFU
V0VCS0lUX0RFVklDRV9IRUlHSFQiKSk7CisKKyAgICAvLyBCb3RoIGVudmlyb25tZW50IHZhcmlh
YmxlcyBuZWVkIHRvIGJlIHNldCAtIG9yIHRoZXkgd2lsbCBiZSBpZ25vcmVkLgorICAgIGlmIChk
ZXZpY2VTaXplLmlzTnVsbCgpKQorICAgICAgICBkZXZpY2VTaXplID0gcXVlcnlEZXZpY2VTaXpl
Rm9yU2NyZWVuQ29udGFpbmluZ1dpZGdldCh2aWV3KCkpOworICAgIFFXZWJQYWdlQWRhcHRlcjo6
Vmlld3BvcnRBdHRyaWJ1dGVzIGF0dHIgPSBkLT52aWV3cG9ydEF0dHJpYnV0ZXNGb3JTaXplKGF2
YWlsYWJsZVNpemUsIGRldmljZVNpemUpOworCisgICAgcmVzdWx0Lm1faXNWYWxpZCA9IHRydWU7
CisgICAgcmVzdWx0Lm1fc2l6ZSA9IGF0dHIuc2l6ZTsKKyAgICByZXN1bHQubV9pbml0aWFsU2Nh
bGVGYWN0b3IgPSBhdHRyLmluaXRpYWxTY2FsZUZhY3RvcjsKKyAgICByZXN1bHQubV9taW5pbXVt
U2NhbGVGYWN0b3IgPSBhdHRyLm1pbmltdW1TY2FsZUZhY3RvcjsKKyAgICByZXN1bHQubV9tYXhp
bXVtU2NhbGVGYWN0b3IgPSBhdHRyLm1heGltdW1TY2FsZUZhY3RvcjsKKyAgICByZXN1bHQubV9k
ZXZpY2VQaXhlbFJhdGlvID0gYXR0ci5kZXZpY2VQaXhlbFJhdGlvOworICAgIHJlc3VsdC5tX2lz
VXNlclNjYWxhYmxlID0gYXR0ci5pc1VzZXJTY2FsYWJsZTsKKworICAgIHJldHVybiByZXN1bHQ7
Cit9CisKK1FTaXplIFFXZWJQYWdlOjpwcmVmZXJyZWRDb250ZW50c1NpemUoKSBjb25zdAorewor
ICAgIFFXZWJGcmFtZUFkYXB0ZXIqIG1haW5GcmFtZSA9IGQtPm1haW5GcmFtZSA/IGQtPm1haW5G
cmFtZS0+ZCA6IDA7CisgICAgUVNpemUgY3VzdG9tU2l6ZTsKKyAgICBpZiAobWFpbkZyYW1lICYm
IG1haW5GcmFtZS0+aGFzVmlldygpKQorICAgICAgICBjdXN0b21TaXplID0gbWFpbkZyYW1lLT5j
dXN0b21MYXlvdXRTaXplKCk7CisKKyAgICByZXR1cm4gY3VzdG9tU2l6ZS5pc051bGwoKSA/IGQt
PmZpeGVkTGF5b3V0U2l6ZSA6IGN1c3RvbVNpemU7Cit9CisKKy8qIQorICAgIFxwcm9wZXJ0eSBR
V2ViUGFnZTo6cHJlZmVycmVkQ29udGVudHNTaXplCisgICAgXHNpbmNlIDQuNgorICAgIFxicmll
ZiBhIGN1c3RvbSBzaXplIHVzZWQgZm9yIGxheWluZyBvdXQgdGhlIHBhZ2UgY29udGVudHMuCisK
KyAgICBCeSBkZWZhdWx0IGFsbCBwYWdlcyBhcmUgbGFpZCBvdXQgdXNpbmcgdGhlIHZpZXdwb3J0
IG9mIHRoZSBwYWdlIGFzIHRoZSBiYXNlLgorCisgICAgQXMgcGFnZXMgbW9zdGx5IGFyZSBkZXNp
Z25lZCBmb3IgZGVza3RvcCB1c2FnZSwgdGhleSBvZnRlbiBkbyBub3QgbGF5b3V0IHByb3Blcmx5
CisgICAgb24gc21hbGwgZGV2aWNlcyBhcyB0aGUgY29udGVudHMgcmVxdWlyZSBhIGNlcnRhaW4g
dmlldyB3aWR0aC4gRm9yIHRoaXMgcmVhc29uCisgICAgaXQgaXMgY29tbW9uIHRvIHVzZSBhIGRp
ZmZlcmVudCBsYXlvdXQgc2l6ZSBhbmQgdGhlbiBzY2FsZSB0aGUgY29udGVudHMgdG8gZml0Cisg
ICAgd2l0aGluIHRoZSBhY3R1YWwgdmlldy4KKworICAgIElmIHRoaXMgcHJvcGVydHkgaXMgc2V0
IHRvIGEgdmFsaWQgc2l6ZSwgdGhpcyBzaXplIGlzIHVzZWQgZm9yIGFsbCBsYXlvdXQgbmVlZHMK
KyAgICBpbnN0ZWFkIG9mIHRoZSBzaXplIG9mIHRoZSB2aWV3cG9ydC4KKworICAgIFNldHRpbmcg
YW4gaW52YWxpZCBzaXplLCBtYWtlcyB0aGUgcGFnZSBmYWxsIGJhY2sgdG8gdXNpbmcgdGhlIHZp
ZXdwb3J0IHNpemUgZm9yIGxheW91dC4KKworICAgIFxzYSB2aWV3cG9ydFNpemUKKyovCit2b2lk
IFFXZWJQYWdlOjpzZXRQcmVmZXJyZWRDb250ZW50c1NpemUoY29uc3QgUVNpemUmIHNpemUpIGNv
bnN0Cit7CisgICAgLy8gRklYTUU6IFJlbmFtZSB0aGlzIG1ldGhvZCB0byBzZXRDdXN0b21MYXlv
dXRTaXplCisKKyAgICBkLT5maXhlZExheW91dFNpemUgPSBzaXplOworCisgICAgUVdlYkZyYW1l
QWRhcHRlciogbWFpbkZyYW1lID0gZC0+bWFpbkZyYW1lQWRhcHRlcigpOworICAgIGlmICghbWFp
bkZyYW1lLT5oYXNWaWV3KCkpCisgICAgICAgIHJldHVybjsKKworICAgIG1haW5GcmFtZS0+c2V0
Q3VzdG9tTGF5b3V0U2l6ZShzaXplKTsKK30KKworLyoKKyAgICBUaGlzIGZ1bmN0aW9uIGlzIHRv
IGJlIGNhbGxlZCBhZnRlciBhbnkgKGFuaW1hdGVkKSBzY3JvbGwvcGFuIGhhcyBlbmRlZCwgaW4g
dGhlIGNhc2UgdGhlIGFwcGxpY2F0aW9uIGhhbmRsZXMgdGhlCisgICAgc2Nyb2xsaW5nL3Bhbm5p
bmcgb2YgdGhlIHdlYiBjb250ZW50cy4gVGhpcyBpcyBjb21tb25seSB1c2VkIGluIGNvbWJpbmF0
aW9uIHdpdGggdGlsaW5nIHdoZXJlIGlzIGl0IGNvbW1vbiBmb3IKKyAgICB0aGUgYXBwbGljYXRp
b24gdG8gcGFuIHRoZSBhY3R1YWwgdmlldywgd2hpY2ggdGhlbiByZXNpemVzIGl0c2VsZiB0byB0
aGUgc2l6ZSBvZiB0aGUgY29udGVudHMuCisKKyAgICBcbm90ZSBDYWxsaW5nIHRoaXMgZnVuY3Rp
b24gbWFrZXMgV2ViS2l0IHN0b3AgdHJ5aW5nIHRvIGNhbGN1bGF0ZSB0aGUgdmlzaWJsZUNvbnRl
bnRSZWN0LiBUbyB0dXJuIHRoYXQgb24KKyAgICBhZ2FpbiwgY2FsbCB0aGlzIG1ldGhvZCB3aXRo
IGFuIGVtcHR5IHJlY3QuCisKKyAgICBcc2EgUUdyYXBoaWNzV2ViVmlldzo6cmVzaXplc1RvQ29u
dGVudHMsIFFXZWJTZXR0aW5nczo6VGlsZWRCYWNraW5nU3RvcmVFbmFibGVkCisqLwordm9pZCBR
V2ViUGFnZTo6c2V0QWN0dWFsVmlzaWJsZUNvbnRlbnRSZWN0KGNvbnN0IFFSZWN0JiByZWN0KSBj
b25zdAoreworICAgIFFXZWJGcmFtZUFkYXB0ZXIqIG1haW5GcmFtZSA9IGQtPm1haW5GcmFtZUFk
YXB0ZXIoKTsKKyAgICBpZiAoIW1haW5GcmFtZS0+aGFzVmlldygpKQorICAgICAgICByZXR1cm47
CisKKyAgICBtYWluRnJhbWUtPnNldEZpeGVkVmlzaWJsZUNvbnRlbnRSZWN0KHJlY3QpOworfQor
CisvKiEKKyAgICBcZm4gYm9vbCBRV2ViUGFnZTo6YWNjZXB0TmF2aWdhdGlvblJlcXVlc3QoUVdl
YkZyYW1lICpmcmFtZSwgY29uc3QgUU5ldHdvcmtSZXF1ZXN0ICZyZXF1ZXN0LCBRV2ViUGFnZTo6
TmF2aWdhdGlvblR5cGUgdHlwZSkKKworICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW5l
dmVyIFdlYktpdCByZXF1ZXN0cyB0byBuYXZpZ2F0ZSBcYSBmcmFtZSB0byB0aGUgcmVzb3VyY2Ug
c3BlY2lmaWVkIGJ5IFxhIHJlcXVlc3QgYnkgbWVhbnMgb2YKKyAgICB0aGUgc3BlY2lmaWVkIG5h
dmlnYXRpb24gdHlwZSBcYSB0eXBlLgorCisgICAgSWYgXGEgZnJhbWUgaXMgYSBudWxsIHBvaW50
ZXIgdGhlbiBuYXZpZ2F0aW9uIHRvIGEgbmV3IHdpbmRvdyBpcyByZXF1ZXN0ZWQuIElmIHRoZSBy
ZXF1ZXN0IGlzCisgICAgYWNjZXB0ZWQgY3JlYXRlV2luZG93KCkgd2lsbCBiZSBjYWxsZWQuCisK
KyAgICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpbnRlcnByZXRzIHRoZSBwYWdlJ3MgbGlu
a0RlbGVnYXRpb25Qb2xpY3kgYW5kIGVtaXRzIGxpbmtDbGlja2VkIGFjY29yZGluZ2x5IG9yIHJl
dHVybnMgdHJ1ZQorICAgIHRvIGxldCBRV2ViUGFnZSBoYW5kbGUgdGhlIG5hdmlnYXRpb24gaXRz
ZWxmLgorCisgICAgXHNhIGNyZWF0ZVdpbmRvdygpCisqLworYm9vbCBRV2ViUGFnZTo6YWNjZXB0
TmF2aWdhdGlvblJlcXVlc3QoUVdlYkZyYW1lICpmcmFtZSwgY29uc3QgUU5ldHdvcmtSZXF1ZXN0
ICZyZXF1ZXN0LCBRV2ViUGFnZTo6TmF2aWdhdGlvblR5cGUgdHlwZSkKK3sKKyAgICBRX1VOVVNF
RChmcmFtZSk7CisgICAgaWYgKHR5cGUgPT0gTmF2aWdhdGlvblR5cGVMaW5rQ2xpY2tlZCkgewor
ICAgICAgICBzd2l0Y2ggKGQtPmxpbmtQb2xpY3kpIHsKKyAgICAgICAgY2FzZSBEb250RGVsZWdh
dGVMaW5rczoKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIGNhc2UgRGVsZWdh
dGVFeHRlcm5hbExpbmtzOgorICAgICAgICAgICAgaWYgKFFXZWJQYWdlQWRhcHRlcjo6dHJlYXRT
Y2hlbWVBc0xvY2FsKHJlcXVlc3QudXJsKCkuc2NoZW1lKCkpKQorICAgICAgICAgICAgICAgIHJl
dHVybiB0cnVlOworICAgICAgICAgICAgZW1pdCBsaW5rQ2xpY2tlZChyZXF1ZXN0LnVybCgpKTsK
KyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBjYXNlIERlbGVnYXRlQWxsTGlu
a3M6CisgICAgICAgICAgICBlbWl0IGxpbmtDbGlja2VkKHJlcXVlc3QudXJsKCkpOworICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOwor
fQorCisvKiEKKyAgICBccHJvcGVydHkgUVdlYlBhZ2U6Omhhc1NlbGVjdGlvbgorICAgIFxicmll
ZiB3aGV0aGVyIHRoaXMgcGFnZSBjb250YWlucyBzZWxlY3RlZCBjb250ZW50IG9yIG5vdC4KKwor
ICAgIFxzYSBzZWxlY3Rpb25DaGFuZ2VkKCkKKyovCitib29sIFFXZWJQYWdlOjpoYXNTZWxlY3Rp
b24oKSBjb25zdAoreworICAgIGQtPmNyZWF0ZU1haW5GcmFtZSgpOworICAgIHJldHVybiBkLT5o
YXNTZWxlY3Rpb24oKTsKK30KKworLyohCisgICAgXHByb3BlcnR5IFFXZWJQYWdlOjpzZWxlY3Rl
ZFRleHQKKyAgICBcYnJpZWYgdGhlIHRleHQgY3VycmVudGx5IHNlbGVjdGVkCisKKyAgICBCeSBk
ZWZhdWx0LCB0aGlzIHByb3BlcnR5IGNvbnRhaW5zIGFuIGVtcHR5IHN0cmluZy4KKworICAgIFxz
YSBzZWxlY3Rpb25DaGFuZ2VkKCksIHNlbGVjdGVkSHRtbCgpCisqLworUVN0cmluZyBRV2ViUGFn
ZTo6c2VsZWN0ZWRUZXh0KCkgY29uc3QKK3sKKyAgICBkLT5jcmVhdGVNYWluRnJhbWUoKTsKKyAg
ICByZXR1cm4gZC0+c2VsZWN0ZWRUZXh0KCk7Cit9CisKKy8qIQorICAgIFxzaW5jZSA0LjgKKyAg
ICBccHJvcGVydHkgUVdlYlBhZ2U6OnNlbGVjdGVkSHRtbAorICAgIFxicmllZiB0aGUgSFRNTCBj
dXJyZW50bHkgc2VsZWN0ZWQKKworICAgIEJ5IGRlZmF1bHQsIHRoaXMgcHJvcGVydHkgY29udGFp
bnMgYW4gZW1wdHkgc3RyaW5nLgorCisgICAgXHNhIHNlbGVjdGlvbkNoYW5nZWQoKSwgc2VsZWN0
ZWRUZXh0KCkKKyovCitRU3RyaW5nIFFXZWJQYWdlOjpzZWxlY3RlZEh0bWwoKSBjb25zdAorewor
ICAgIGQtPmNyZWF0ZU1haW5GcmFtZSgpOworICAgIHJldHVybiBkLT5zZWxlY3RlZEh0bWwoKTsK
K30KKworI2lmbmRlZiBRVF9OT19BQ1RJT04KKy8qIQorICAgUmV0dXJucyBhIFFBY3Rpb24gZm9y
IHRoZSBzcGVjaWZpZWQgV2ViQWN0aW9uIFxhIGFjdGlvbi4KKworICAgVGhlIGFjdGlvbiBpcyBv
d25lZCBieSB0aGUgUVdlYlBhZ2UgYnV0IHlvdSBjYW4gY3VzdG9taXplIHRoZSBsb29rIGJ5Cisg
ICBjaGFuZ2luZyBpdHMgcHJvcGVydGllcy4KKworICAgUVdlYlBhZ2UgYWxzbyB0YWtlcyBjYXJl
IG9mIGltcGxlbWVudGluZyB0aGUgYWN0aW9uLCBzbyB0aGF0IHVwb24KKyAgIHRyaWdnZXJpbmcg
dGhlIGNvcnJlc3BvbmRpbmcgYWN0aW9uIGlzIHBlcmZvcm1lZCBvbiB0aGUgcGFnZS4KKworICAg
XHNhIHRyaWdnZXJBY3Rpb24oKQorKi8KK1FBY3Rpb24gKlFXZWJQYWdlOjphY3Rpb24oV2ViQWN0
aW9uIGFjdGlvbikgY29uc3QKK3sKKyAgICBpZiAoYWN0aW9uID09IFFXZWJQYWdlOjpOb1dlYkFj
dGlvbikgcmV0dXJuIDA7CisgICAgaWYgKGQtPmFjdGlvbnNbYWN0aW9uXSkKKyAgICAgICAgcmV0
dXJuIGQtPmFjdGlvbnNbYWN0aW9uXTsKKworICAgIFFTdHJpbmcgdGV4dDsKKyAgICBRSWNvbiBp
Y29uOworICAgIFFTdHlsZSAqc3R5bGUgPSBkLT5jbGllbnQgPyBkLT5jbGllbnQtPnN0eWxlKCkg
OiBxQXBwLT5zdHlsZSgpOworICAgIGJvb2wgY2hlY2thYmxlID0gZmFsc2U7CisgICAgUVdlYlBh
Z2VBZGFwdGVyOjpNZW51QWN0aW9uIG1hcHBlZEFjdGlvbiA9IFFXZWJQYWdlQWRhcHRlcjo6Tm9B
Y3Rpb247CisKKyAgICBzd2l0Y2ggKGFjdGlvbikgeworICAgIC8vIHRvIGJlIGZldGNoZWQgZnJv
bSBMb2NhbGl6ZWRTdHJpbmdzUXQgdmlhIHRoZSBwYWdlIGFkYXB0ZXIKKyAgICBjYXNlIE9wZW5M
aW5rOgorICAgIGNhc2UgT3BlbkxpbmtJbk5ld1dpbmRvdzoKKyAgICBjYXNlIE9wZW5GcmFtZUlu
TmV3V2luZG93OgorICAgIGNhc2UgT3BlbkxpbmtJblRoaXNXaW5kb3c6CisgICAgY2FzZSBEb3du
bG9hZExpbmtUb0Rpc2s6CisgICAgY2FzZSBDb3B5TGlua1RvQ2xpcGJvYXJkOgorICAgIGNhc2Ug
T3BlbkltYWdlSW5OZXdXaW5kb3c6CisgICAgY2FzZSBEb3dubG9hZEltYWdlVG9EaXNrOgorICAg
IGNhc2UgQ29weUltYWdlVG9DbGlwYm9hcmQ6CisgICAgY2FzZSBDb3B5SW1hZ2VVcmxUb0NsaXBi
b2FyZDoKKyAgICBjYXNlIEN1dDoKKyAgICBjYXNlIENvcHk6CisgICAgY2FzZSBQYXN0ZToKKyAg
ICBjYXNlIFNlbGVjdEFsbDoKKyAgICBjYXNlIFNldFRleHREaXJlY3Rpb25EZWZhdWx0OgorICAg
IGNhc2UgU2V0VGV4dERpcmVjdGlvbkxlZnRUb1JpZ2h0OgorICAgIGNhc2UgU2V0VGV4dERpcmVj
dGlvblJpZ2h0VG9MZWZ0OgorICAgIGNhc2UgVG9nZ2xlQm9sZDoKKyAgICBjYXNlIFRvZ2dsZUl0
YWxpYzoKKyAgICBjYXNlIFRvZ2dsZVVuZGVybGluZToKKyAgICAgICAgbWFwcGVkQWN0aW9uID0g
YWRhcHRlck1lbnVBY3Rpb25Gb3JXZWJBY3Rpb24oYWN0aW9uKTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgY2FzZSBJbnNwZWN0RWxlbWVudDoKKyNpZiBFTkFCTEUoSU5TUEVDVE9SKQorICAgICAgICBt
YXBwZWRBY3Rpb24gPSBRV2ViUGFnZUFkYXB0ZXI6Okluc3BlY3RFbGVtZW50OworI2VuZGlmCisg
ICAgICAgIGJyZWFrOworCisgICAgICAgIC8vIGljb24gbmVlZGVkIGFzIHdlbGwsIG1hcCBieSBo
YW5kLgorICAgIGNhc2UgQmFjazoKKyAgICAgICAgbWFwcGVkQWN0aW9uID0gUVdlYlBhZ2VBZGFw
dGVyOjpCYWNrOworICAgICAgICBpY29uID0gc3R5bGUtPnN0YW5kYXJkSWNvbihRU3R5bGU6OlNQ
X0Fycm93QmFjayk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRm9yd2FyZDoKKyAgICAgICAg
bWFwcGVkQWN0aW9uID0gUVdlYlBhZ2VBZGFwdGVyOjpGb3J3YXJkOworICAgICAgICBpY29uID0g
c3R5bGUtPnN0YW5kYXJkSWNvbihRU3R5bGU6OlNQX0Fycm93Rm9yd2FyZCk7CisgICAgICAgIGJy
ZWFrOworICAgIGNhc2UgU3RvcDoKKyAgICAgICAgbWFwcGVkQWN0aW9uID0gUVdlYlBhZ2VBZGFw
dGVyOjpTdG9wOworICAgICAgICBpY29uID0gc3R5bGUtPnN0YW5kYXJkSWNvbihRU3R5bGU6OlNQ
X0Jyb3dzZXJTdG9wKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSZWxvYWQ6CisgICAgICAg
IG1hcHBlZEFjdGlvbiA9IFFXZWJQYWdlQWRhcHRlcjo6UmVsb2FkOworICAgICAgICBpY29uID0g
c3R5bGUtPnN0YW5kYXJkSWNvbihRU3R5bGU6OlNQX0Jyb3dzZXJSZWxvYWQpOworICAgICAgICBi
cmVhazsKKworI2lmbmRlZiBRVF9OT19VTkRPU1RBQ0sKKyAgICAgICAgY2FzZSBVbmRvOiB7Cisg
ICAgICAgICAgICBRQWN0aW9uICphID0gdW5kb1N0YWNrKCktPmNyZWF0ZVVuZG9BY3Rpb24oZC0+
cSk7CisgICAgICAgICAgICBkLT5hY3Rpb25zW2FjdGlvbl0gPSBhOworICAgICAgICAgICAgcmV0
dXJuIGE7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBSZWRvOiB7CisgICAgICAgICAgICBRQWN0
aW9uICphID0gdW5kb1N0YWNrKCktPmNyZWF0ZVJlZG9BY3Rpb24oZC0+cSk7CisgICAgICAgICAg
ICBkLT5hY3Rpb25zW2FjdGlvbl0gPSBhOworICAgICAgICAgICAgcmV0dXJuIGE7CisgICAgICAg
IH0KKyNlbmRpZiAvLyBRVF9OT19VTkRPU1RBQ0sKKyAgICAgICAgLy8gaW4gcGxhY2UgbDEwbgor
ICAgICAgICBjYXNlIE1vdmVUb05leHRDaGFyOgorICAgICAgICAgICAgdGV4dCA9IHRyKCJNb3Zl
IHRoZSBjdXJzb3IgdG8gdGhlIG5leHQgY2hhcmFjdGVyIik7CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgY2FzZSBNb3ZlVG9QcmV2aW91c0NoYXI6CisgICAgICAgICAgICB0ZXh0ID0gdHIo
Ik1vdmUgdGhlIGN1cnNvciB0byB0aGUgcHJldmlvdXMgY2hhcmFjdGVyIik7CisgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgY2FzZSBNb3ZlVG9OZXh0V29yZDoKKyAgICAgICAgICAgIHRleHQg
PSB0cigiTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBuZXh0IHdvcmQiKTsKKyAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICBjYXNlIE1vdmVUb1ByZXZpb3VzV29yZDoKKyAgICAgICAgICAgIHRleHQg
PSB0cigiTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBwcmV2aW91cyB3b3JkIik7CisgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgY2FzZSBNb3ZlVG9OZXh0TGluZToKKyAgICAgICAgICAgIHRleHQg
PSB0cigiTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBuZXh0IGxpbmUiKTsKKyAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICBjYXNlIE1vdmVUb1ByZXZpb3VzTGluZToKKyAgICAgICAgICAgIHRleHQg
PSB0cigiTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBwcmV2aW91cyBsaW5lIik7CisgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgY2FzZSBNb3ZlVG9TdGFydE9mTGluZToKKyAgICAgICAgICAgIHRl
eHQgPSB0cigiTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZSIpOworICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTW92ZVRvRW5kT2ZMaW5lOgorICAgICAgICAg
ICAgdGV4dCA9IHRyKCJNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIGVuZCBvZiB0aGUgbGluZSIpOwor
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTW92ZVRvU3RhcnRPZkJsb2NrOgorICAg
ICAgICAgICAgdGV4dCA9IHRyKCJNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIHN0YXJ0IG9mIHRoZSBi
bG9jayIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTW92ZVRvRW5kT2ZCbG9j
azoKKyAgICAgICAgICAgIHRleHQgPSB0cigiTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBlbmQgb2Yg
dGhlIGJsb2NrIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNb3ZlVG9TdGFy
dE9mRG9jdW1lbnQ6CisgICAgICAgICAgICB0ZXh0ID0gdHIoIk1vdmUgdGhlIGN1cnNvciB0byB0
aGUgc3RhcnQgb2YgdGhlIGRvY3VtZW50Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
Y2FzZSBNb3ZlVG9FbmRPZkRvY3VtZW50OgorICAgICAgICAgICAgdGV4dCA9IHRyKCJNb3ZlIHRo
ZSBjdXJzb3IgdG8gdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQiKTsKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICBjYXNlIFNlbGVjdE5leHRDaGFyOgorICAgICAgICAgICAgdGV4dCA9IHRyKCJT
ZWxlY3QgdG8gdGhlIG5leHQgY2hhcmFjdGVyIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgY2FzZSBTZWxlY3RQcmV2aW91c0NoYXI6CisgICAgICAgICAgICB0ZXh0ID0gdHIoIlNlbGVj
dCB0byB0aGUgcHJldmlvdXMgY2hhcmFjdGVyIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgY2FzZSBTZWxlY3ROZXh0V29yZDoKKyAgICAgICAgICAgIHRleHQgPSB0cigiU2VsZWN0IHRv
IHRoZSBuZXh0IHdvcmQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNlbGVj
dFByZXZpb3VzV29yZDoKKyAgICAgICAgICAgIHRleHQgPSB0cigiU2VsZWN0IHRvIHRoZSBwcmV2
aW91cyB3b3JkIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTZWxlY3ROZXh0
TGluZToKKyAgICAgICAgICAgIHRleHQgPSB0cigiU2VsZWN0IHRvIHRoZSBuZXh0IGxpbmUiKTsK
KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNlbGVjdFByZXZpb3VzTGluZToKKyAg
ICAgICAgICAgIHRleHQgPSB0cigiU2VsZWN0IHRvIHRoZSBwcmV2aW91cyBsaW5lIik7CisgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTZWxlY3RTdGFydE9mTGluZToKKyAgICAgICAg
ICAgIHRleHQgPSB0cigiU2VsZWN0IHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZSIpOworICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2VsZWN0RW5kT2ZMaW5lOgorICAgICAgICAgICAg
dGV4dCA9IHRyKCJTZWxlY3QgdG8gdGhlIGVuZCBvZiB0aGUgbGluZSIpOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIGNhc2UgU2VsZWN0U3RhcnRPZkJsb2NrOgorICAgICAgICAgICAgdGV4
dCA9IHRyKCJTZWxlY3QgdG8gdGhlIHN0YXJ0IG9mIHRoZSBibG9jayIpOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIGNhc2UgU2VsZWN0RW5kT2ZCbG9jazoKKyAgICAgICAgICAgIHRleHQg
PSB0cigiU2VsZWN0IHRvIHRoZSBlbmQgb2YgdGhlIGJsb2NrIik7CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgY2FzZSBTZWxlY3RTdGFydE9mRG9jdW1lbnQ6CisgICAgICAgICAgICB0ZXh0
ID0gdHIoIlNlbGVjdCB0byB0aGUgc3RhcnQgb2YgdGhlIGRvY3VtZW50Iik7CisgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgY2FzZSBTZWxlY3RFbmRPZkRvY3VtZW50OgorICAgICAgICAgICAg
dGV4dCA9IHRyKCJTZWxlY3QgdG8gdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQiKTsKKyAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICBjYXNlIERlbGV0ZVN0YXJ0T2ZXb3JkOgorICAgICAgICAgICAg
dGV4dCA9IHRyKCJEZWxldGUgdG8gdGhlIHN0YXJ0IG9mIHRoZSB3b3JkIik7CisgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgY2FzZSBEZWxldGVFbmRPZldvcmQ6CisgICAgICAgICAgICB0ZXh0
ID0gdHIoIkRlbGV0ZSB0byB0aGUgZW5kIG9mIHRoZSB3b3JkIik7CisgICAgICAgICAgICBicmVh
azsKKworICAgICAgICBjYXNlIEluc2VydFBhcmFncmFwaFNlcGFyYXRvcjoKKyAgICAgICAgICAg
IHRleHQgPSB0cigiSW5zZXJ0IGEgbmV3IHBhcmFncmFwaCIpOworICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgIGNhc2UgSW5zZXJ0TGluZVNlcGFyYXRvcjoKKyAgICAgICAgICAgIHRleHQgPSB0
cigiSW5zZXJ0IGEgbmV3IGxpbmUiKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNh
c2UgUGFzdGVBbmRNYXRjaFN0eWxlOgorICAgICAgICAgICAgdGV4dCA9IHRyKCJQYXN0ZSBhbmQg
TWF0Y2ggU3R5bGUiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJlbW92ZUZv
cm1hdDoKKyAgICAgICAgICAgIHRleHQgPSB0cigiUmVtb3ZlIGZvcm1hdHRpbmciKTsKKyAgICAg
ICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVG9nZ2xlU3RyaWtldGhyb3VnaDoKKyAgICAg
ICAgICAgIHRleHQgPSB0cigiU3RyaWtldGhyb3VnaCIpOworICAgICAgICAgICAgY2hlY2thYmxl
ID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRvZ2dsZVN1YnNjcmlw
dDoKKyAgICAgICAgICAgIHRleHQgPSB0cigiU3Vic2NyaXB0Iik7CisgICAgICAgICAgICBjaGVj
a2FibGUgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVG9nZ2xlU3Vw
ZXJzY3JpcHQ6CisgICAgICAgICAgICB0ZXh0ID0gdHIoIlN1cGVyc2NyaXB0Iik7CisgICAgICAg
ICAgICBjaGVja2FibGUgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Ug
SW5zZXJ0VW5vcmRlcmVkTGlzdDoKKyAgICAgICAgICAgIHRleHQgPSB0cigiSW5zZXJ0IEJ1bGxl
dGVkIExpc3QiKTsKKyAgICAgICAgICAgIGNoZWNrYWJsZSA9IHRydWU7CisgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgY2FzZSBJbnNlcnRPcmRlcmVkTGlzdDoKKyAgICAgICAgICAgIHRleHQg
PSB0cigiSW5zZXJ0IE51bWJlcmVkIExpc3QiKTsKKyAgICAgICAgICAgIGNoZWNrYWJsZSA9IHRy
dWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJbmRlbnQ6CisgICAgICAgICAg
ICB0ZXh0ID0gdHIoIkluZGVudCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Ug
T3V0ZGVudDoKKyAgICAgICAgICAgIHRleHQgPSB0cigiT3V0ZGVudCIpOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIGNhc2UgQWxpZ25DZW50ZXI6CisgICAgICAgICAgICB0ZXh0ID0gdHIo
IkNlbnRlciIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQWxpZ25KdXN0aWZp
ZWQ6CisgICAgICAgICAgICB0ZXh0ID0gdHIoIkp1c3RpZnkiKTsKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICBjYXNlIEFsaWduTGVmdDoKKyAgICAgICAgICAgIHRleHQgPSB0cigiQWxpZ24g
TGVmdCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQWxpZ25SaWdodDoKKyAg
ICAgICAgICAgIHRleHQgPSB0cigiQWxpZ24gUmlnaHQiKTsKKyAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICBjYXNlIE5vV2ViQWN0aW9uOgorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAg
IGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKG1hcHBlZEFjdGlv
biAhPSBRV2ViUGFnZUFkYXB0ZXI6Ok5vQWN0aW9uKQorICAgICAgICB0ZXh0ID0gZC0+Y29udGV4
dE1lbnVJdGVtVGFnRm9yQWN0aW9uKG1hcHBlZEFjdGlvbiwgJmNoZWNrYWJsZSk7CisKKyAgICBp
ZiAodGV4dC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgUUFjdGlvbiAqYSA9
IG5ldyBRQWN0aW9uKGQtPnEpOworICAgIGEtPnNldFRleHQodGV4dCk7CisgICAgYS0+c2V0RGF0
YShhY3Rpb24pOworICAgIGEtPnNldENoZWNrYWJsZShjaGVja2FibGUpOworICAgIGEtPnNldElj
b24oaWNvbik7CisKKyAgICBjb25uZWN0KGEsIFNJR05BTCh0cmlnZ2VyZWQoYm9vbCkpLAorICAg
ICAgICAgICAgdGhpcywgU0xPVChfcV93ZWJBY3Rpb25UcmlnZ2VyZWQoYm9vbCkpKTsKKworICAg
IGQtPmFjdGlvbnNbYWN0aW9uXSA9IGE7CisgICAgZC0+dXBkYXRlQWN0aW9uKGFjdGlvbik7Cisg
ICAgcmV0dXJuIGE7Cit9CisjZW5kaWYgLy8gUVRfTk9fQUNUSU9OCisKKy8qIQorICAgIFxwcm9w
ZXJ0eSBRV2ViUGFnZTo6bW9kaWZpZWQKKyAgICBcYnJpZWYgd2hldGhlciB0aGUgcGFnZSBjb250
YWlucyB1bnN1Ym1pdHRlZCBmb3JtIGRhdGEsIG9yIHRoZSBjb250ZW50cyBoYXZlIGJlZW4gY2hh
bmdlZC4KKworICAgIEJ5IGRlZmF1bHQsIHRoaXMgcHJvcGVydHkgaXMgZmFsc2UuCisKKyAgICBc
c2EgY29udGVudHNDaGFuZ2VkKCksIGNvbnRlbnRFZGl0YWJsZSwgdW5kb1N0YWNrKCkKKyovCiti
b29sIFFXZWJQYWdlOjppc01vZGlmaWVkKCkgY29uc3QKK3sKKyNpZmRlZiBRVF9OT19VTkRPU1RB
Q0sKKyAgICByZXR1cm4gZmFsc2U7CisjZWxzZQorICAgIGlmICghZC0+dW5kb1N0YWNrKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIGQtPnVuZG9TdGFjay0+Y2FuVW5kbygpOwor
I2VuZGlmIC8vIFFUX05PX1VORE9TVEFDSworfQorCisjaWZuZGVmIFFUX05PX1VORE9TVEFDSwor
LyohCisgICAgUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHVuZG8gc3RhY2sgdXNlZCBmb3IgZWRp
dGFibGUgY29udGVudC4KKworICAgIFxzYSBtb2RpZmllZAorKi8KK1FVbmRvU3RhY2sgKlFXZWJQ
YWdlOjp1bmRvU3RhY2soKSBjb25zdAoreworICAgIGlmICghZC0+dW5kb1N0YWNrKQorICAgICAg
ICBkLT51bmRvU3RhY2sgPSBuZXcgUVVuZG9TdGFjayhjb25zdF9jYXN0PFFXZWJQYWdlICo+KHRo
aXMpKTsKKworICAgIHJldHVybiBkLT51bmRvU3RhY2s7Cit9CisjZW5kaWYgLy8gUVRfTk9fVU5E
T1NUQUNLCisKKy8qISBccmVpbXAKKyovCitib29sIFFXZWJQYWdlOjpldmVudChRRXZlbnQgKmV2
KQoreworICAgIHN3aXRjaCAoZXYtPnR5cGUoKSkgeworICAgIGNhc2UgUUV2ZW50OjpUaW1lcjoK
KyAgICAgICAgZC0+dGltZXJFdmVudChzdGF0aWNfY2FzdDxRVGltZXJFdmVudCo+KGV2KSk7Cisg
ICAgICAgIGJyZWFrOworICAgIGNhc2UgUUV2ZW50OjpNb3VzZU1vdmU6CisgICAgICAgIGQtPm1v
dXNlTW92ZUV2ZW50KHN0YXRpY19jYXN0PFFNb3VzZUV2ZW50Kj4oZXYpKTsKKyAgICAgICAgYnJl
YWs7CisgICAgY2FzZSBRRXZlbnQ6Ok1vdXNlQnV0dG9uUHJlc3M6CisgICAgICAgIGQtPm1vdXNl
UHJlc3NFdmVudChzdGF0aWNfY2FzdDxRTW91c2VFdmVudCo+KGV2KSk7CisgICAgICAgIGJyZWFr
OworICAgIGNhc2UgUUV2ZW50OjpNb3VzZUJ1dHRvbkRibENsaWNrOgorICAgICAgICBkLT5tb3Vz
ZURvdWJsZUNsaWNrRXZlbnQoc3RhdGljX2Nhc3Q8UU1vdXNlRXZlbnQqPihldikpOworICAgICAg
ICBicmVhazsKKyAgICBjYXNlIFFFdmVudDo6TW91c2VCdXR0b25SZWxlYXNlOgorICAgICAgICBk
LT5tb3VzZVJlbGVhc2VFdmVudChzdGF0aWNfY2FzdDxRTW91c2VFdmVudCo+KGV2KSk7CisgICAg
ICAgIGJyZWFrOworI2lmICFkZWZpbmVkKFFUX05PX0dSQVBISUNTVklFVykKKyAgICBjYXNlIFFF
dmVudDo6R3JhcGhpY3NTY2VuZU1vdXNlTW92ZTogeworICAgICAgICBRR3JhcGhpY3NTY2VuZU1v
dXNlRXZlbnQgKmdzRXYgPSBzdGF0aWNfY2FzdDxRR3JhcGhpY3NTY2VuZU1vdXNlRXZlbnQqPihl
dik7CisgICAgICAgIFFNb3VzZUV2ZW50IGR1bW15RXZlbnQoUUV2ZW50OjpNb3VzZU1vdmUsIGdz
RXYtPnBvcygpLCBnc0V2LT5zY3JlZW5Qb3MoKSwgZ3NFdi0+YnV0dG9uKCksIGdzRXYtPmJ1dHRv
bnMoKSwgZ3NFdi0+bW9kaWZpZXJzKCkpOworICAgICAgICBkLT5tb3VzZU1vdmVFdmVudCgmZHVt
bXlFdmVudCk7CisgICAgICAgIGV2LT5zZXRBY2NlcHRlZChkdW1teUV2ZW50LmlzQWNjZXB0ZWQo
KSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFFFdmVudDo6R3JhcGhpY3NTY2Vu
ZU1vdXNlUmVsZWFzZTogeworICAgICAgICBRR3JhcGhpY3NTY2VuZU1vdXNlRXZlbnQgKmdzRXYg
PSBzdGF0aWNfY2FzdDxRR3JhcGhpY3NTY2VuZU1vdXNlRXZlbnQqPihldik7CisgICAgICAgIFFN
b3VzZUV2ZW50IGR1bW15RXZlbnQoUUV2ZW50OjpNb3VzZUJ1dHRvblJlbGVhc2UsIGdzRXYtPnBv
cygpLCBnc0V2LT5zY3JlZW5Qb3MoKSwgZ3NFdi0+YnV0dG9uKCksIGdzRXYtPmJ1dHRvbnMoKSwg
Z3NFdi0+bW9kaWZpZXJzKCkpOworICAgICAgICBkLT5hZGp1c3RQb2ludEZvckNsaWNraW5nKCZk
dW1teUV2ZW50KTsKKyAgICAgICAgZC0+bW91c2VSZWxlYXNlRXZlbnQoJmR1bW15RXZlbnQpOwor
ICAgICAgICBldi0+c2V0QWNjZXB0ZWQoZHVtbXlFdmVudC5pc0FjY2VwdGVkKCkpOworICAgICAg
ICBicmVhazsKKyAgICB9CisgICAgY2FzZSBRRXZlbnQ6OkdyYXBoaWNzU2NlbmVNb3VzZVByZXNz
OiB7CisgICAgICAgIFFHcmFwaGljc1NjZW5lTW91c2VFdmVudCAqZ3NFdiA9IHN0YXRpY19jYXN0
PFFHcmFwaGljc1NjZW5lTW91c2VFdmVudCo+KGV2KTsKKyAgICAgICAgUU1vdXNlRXZlbnQgZHVt
bXlFdmVudChRRXZlbnQ6Ok1vdXNlQnV0dG9uUHJlc3MsIGdzRXYtPnBvcygpLCBnc0V2LT5zY3Jl
ZW5Qb3MoKSwgZ3NFdi0+YnV0dG9uKCksIGdzRXYtPmJ1dHRvbnMoKSwgZ3NFdi0+bW9kaWZpZXJz
KCkpOworICAgICAgICBkLT5hZGp1c3RQb2ludEZvckNsaWNraW5nKCZkdW1teUV2ZW50KTsKKyAg
ICAgICAgZC0+bW91c2VQcmVzc0V2ZW50KCZkdW1teUV2ZW50KTsKKyAgICAgICAgZXYtPnNldEFj
Y2VwdGVkKGR1bW15RXZlbnQuaXNBY2NlcHRlZCgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQor
ICAgIGNhc2UgUUV2ZW50OjpHcmFwaGljc1NjZW5lTW91c2VEb3VibGVDbGljazogeworICAgICAg
ICBRR3JhcGhpY3NTY2VuZU1vdXNlRXZlbnQgKmdzRXYgPSBzdGF0aWNfY2FzdDxRR3JhcGhpY3NT
Y2VuZU1vdXNlRXZlbnQqPihldik7CisgICAgICAgIFFNb3VzZUV2ZW50IGR1bW15RXZlbnQoUUV2
ZW50OjpNb3VzZUJ1dHRvbkRibENsaWNrLCBnc0V2LT5wb3MoKSwgZ3NFdi0+c2NyZWVuUG9zKCks
IGdzRXYtPmJ1dHRvbigpLCBnc0V2LT5idXR0b25zKCksIGdzRXYtPm1vZGlmaWVycygpKTsKKyAg
ICAgICAgZC0+YWRqdXN0UG9pbnRGb3JDbGlja2luZygmZHVtbXlFdmVudCk7CisgICAgICAgIGQt
Pm1vdXNlRG91YmxlQ2xpY2tFdmVudCgmZHVtbXlFdmVudCk7CisgICAgICAgIGV2LT5zZXRBY2Nl
cHRlZChkdW1teUV2ZW50LmlzQWNjZXB0ZWQoKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyNl
bmRpZgorI2lmbmRlZiBRVF9OT19DT05URVhUTUVOVQorICAgIGNhc2UgUUV2ZW50OjpDb250ZXh0
TWVudToKKyAgICAgICAgZC0+Y29udGV4dE1lbnVFdmVudChzdGF0aWNfY2FzdDxRQ29udGV4dE1l
bnVFdmVudCo+KGV2KS0+Z2xvYmFsUG9zKCkpOworICAgICAgICBicmVhazsKKyNpZiAhZGVmaW5l
ZChRVF9OT19HUkFQSElDU1ZJRVcpCisgICAgY2FzZSBRRXZlbnQ6OkdyYXBoaWNzU2NlbmVDb250
ZXh0TWVudToKKyAgICAgICAgZC0+Y29udGV4dE1lbnVFdmVudChzdGF0aWNfY2FzdDxRR3JhcGhp
Y3NTY2VuZUNvbnRleHRNZW51RXZlbnQqPihldiktPnNjcmVlblBvcygpKTsKKyAgICAgICAgYnJl
YWs7CisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBRVF9OT19XSEVFTEVWRU5UCisgICAgY2FzZSBR
RXZlbnQ6OldoZWVsOgorICAgICAgICBkLT53aGVlbEV2ZW50KHN0YXRpY19jYXN0PFFXaGVlbEV2
ZW50Kj4oZXYpLCBRQXBwbGljYXRpb246OndoZWVsU2Nyb2xsTGluZXMoKSk7CisgICAgICAgIGJy
ZWFrOworI2lmICFkZWZpbmVkKFFUX05PX0dSQVBISUNTVklFVykKKyAgICBjYXNlIFFFdmVudDo6
R3JhcGhpY3NTY2VuZVdoZWVsOiB7CisgICAgICAgIFFHcmFwaGljc1NjZW5lV2hlZWxFdmVudCAq
Z3NFdiA9IHN0YXRpY19jYXN0PFFHcmFwaGljc1NjZW5lV2hlZWxFdmVudCo+KGV2KTsKKyAgICAg
ICAgUVdoZWVsRXZlbnQgZHVtbXlFdmVudChnc0V2LT5wb3MoKSwgZ3NFdi0+c2NyZWVuUG9zKCks
IGdzRXYtPmRlbHRhKCksIGdzRXYtPmJ1dHRvbnMoKSwgZ3NFdi0+bW9kaWZpZXJzKCksIGdzRXYt
Pm9yaWVudGF0aW9uKCkpOworICAgICAgICBkLT53aGVlbEV2ZW50KCZkdW1teUV2ZW50LCBRQXBw
bGljYXRpb246OndoZWVsU2Nyb2xsTGluZXMoKSk7CisgICAgICAgIGV2LT5zZXRBY2NlcHRlZChk
dW1teUV2ZW50LmlzQWNjZXB0ZWQoKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZgor
I2VuZGlmCisgICAgY2FzZSBRRXZlbnQ6OktleVByZXNzOgorICAgICAgICBkLT5rZXlQcmVzc0V2
ZW50KHN0YXRpY19jYXN0PFFLZXlFdmVudCo+KGV2KSk7CisgICAgICAgIGJyZWFrOworICAgIGNh
c2UgUUV2ZW50OjpLZXlSZWxlYXNlOgorICAgICAgICBkLT5rZXlSZWxlYXNlRXZlbnQoc3RhdGlj
X2Nhc3Q8UUtleUV2ZW50Kj4oZXYpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRRXZlbnQ6
OkZvY3VzSW46CisgICAgICAgIGQtPmZvY3VzSW5FdmVudChzdGF0aWNfY2FzdDxRRm9jdXNFdmVu
dCo+KGV2KSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUV2ZW50OjpGb2N1c091dDoKKyAg
ICAgICAgZC0+Zm9jdXNPdXRFdmVudChzdGF0aWNfY2FzdDxRRm9jdXNFdmVudCo+KGV2KSk7Cisg
ICAgICAgIGJyZWFrOworI2lmbmRlZiBRVF9OT19EUkFHQU5ERFJPUAorICAgIGNhc2UgUUV2ZW50
OjpEcmFnRW50ZXI6CisgICAgICAgIGQtPmRyYWdFbnRlckV2ZW50KHN0YXRpY19jYXN0PFFEcmFn
RW50ZXJFdmVudCo+KGV2KSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUV2ZW50OjpEcmFn
TGVhdmU6CisgICAgICAgIGQtPmRyYWdMZWF2ZUV2ZW50KCk7CisgICAgICAgIGV2LT5hY2NlcHQo
KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRRXZlbnQ6OkRyYWdNb3ZlOgorICAgICAgICBk
LT5kcmFnTW92ZUV2ZW50KHN0YXRpY19jYXN0PFFEcmFnTW92ZUV2ZW50Kj4oZXYpKTsKKyAgICAg
ICAgYnJlYWs7CisgICAgY2FzZSBRRXZlbnQ6OkRyb3A6CisgICAgICAgIGQtPmRyb3BFdmVudChz
dGF0aWNfY2FzdDxRRHJvcEV2ZW50Kj4oZXYpKTsKKyAgICAgICAgYnJlYWs7CisjaWYgIWRlZmlu
ZWQoUVRfTk9fR1JBUEhJQ1NWSUVXKQorICAgIGNhc2UgUUV2ZW50OjpHcmFwaGljc1NjZW5lRHJh
Z0VudGVyOgorICAgICAgICBkLT5kcmFnRW50ZXJFdmVudChzdGF0aWNfY2FzdDxRR3JhcGhpY3NT
Y2VuZURyYWdEcm9wRXZlbnQqPihldikpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFFFdmVu
dDo6R3JhcGhpY3NTY2VuZURyYWdNb3ZlOgorICAgICAgICBkLT5kcmFnTW92ZUV2ZW50KHN0YXRp
Y19jYXN0PFFHcmFwaGljc1NjZW5lRHJhZ0Ryb3BFdmVudCo+KGV2KSk7CisgICAgICAgIGJyZWFr
OworICAgIGNhc2UgUUV2ZW50OjpHcmFwaGljc1NjZW5lRHJhZ0xlYXZlOgorICAgICAgICBkLT5k
cmFnTGVhdmVFdmVudCgpOworICAgICAgICBldi0+YWNjZXB0KCk7CisgICAgICAgIGJyZWFrOwor
ICAgIGNhc2UgUUV2ZW50OjpHcmFwaGljc1NjZW5lRHJvcDoKKyAgICAgICAgZC0+ZHJvcEV2ZW50
KHN0YXRpY19jYXN0PFFHcmFwaGljc1NjZW5lRHJhZ0Ryb3BFdmVudCo+KGV2KSk7CisgICAgICAg
IGJyZWFrOworI2VuZGlmCisKKyNlbmRpZgorICAgIGNhc2UgUUV2ZW50OjpJbnB1dE1ldGhvZDoK
KyAgICAgICAgZC0+aW5wdXRNZXRob2RFdmVudChzdGF0aWNfY2FzdDxRSW5wdXRNZXRob2RFdmVu
dCo+KGV2KSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUV2ZW50OjpTaG9ydGN1dE92ZXJy
aWRlOgorICAgICAgICBkLT5zaG9ydGN1dE92ZXJyaWRlRXZlbnQoc3RhdGljX2Nhc3Q8UUtleUV2
ZW50Kj4oZXYpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRRXZlbnQ6OkxlYXZlOgorICAg
ICAgICBkLT5sZWF2ZUV2ZW50KGV2KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRRXZlbnQ6
OlRvdWNoQmVnaW46CisgICAgY2FzZSBRRXZlbnQ6OlRvdWNoVXBkYXRlOgorICAgIGNhc2UgUUV2
ZW50OjpUb3VjaEVuZDoKKyAgICBjYXNlIFFFdmVudDo6VG91Y2hDYW5jZWw6CisgICAgICAgIC8v
IFJldHVybiB3aGV0aGVyIHRoZSBkZWZhdWx0IGFjdGlvbiB3YXMgY2FuY2VsbGVkIGluIHRoZSBK
UyBldmVudCBoYW5kbGVyCisgICAgICAgIHJldHVybiBkLT50b3VjaEV2ZW50KHN0YXRpY19jYXN0
PFFUb3VjaEV2ZW50Kj4oZXYpKTsKKyNpZm5kZWYgUVRfTk9fR0VTVFVSRVMKKyAgICBjYXNlIFFF
dmVudDo6R2VzdHVyZToKKyAgICAgICAgZC0+Z2VzdHVyZUV2ZW50KHN0YXRpY19jYXN0PFFHZXN0
dXJlRXZlbnQqPihldikpOworICAgICAgICBicmVhazsKKyNlbmRpZgorI2lmbmRlZiBRVF9OT19Q
Uk9QRVJUSUVTCisgICAgY2FzZSBRRXZlbnQ6OkR5bmFtaWNQcm9wZXJ0eUNoYW5nZToKKyAgICAg
ICAgZC0+ZHluYW1pY1Byb3BlcnR5Q2hhbmdlRXZlbnQodGhpcywgc3RhdGljX2Nhc3Q8UUR5bmFt
aWNQcm9wZXJ0eUNoYW5nZUV2ZW50Kj4oZXYpKTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAg
ICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gUU9iamVjdDo6ZXZlbnQoZXYpOworICAgIH0KKwor
ICAgIHJldHVybiB0cnVlOworfQorCisvKiEKKyAgICBTaW1pbGFyIHRvIFFXaWRnZXQ6OmZvY3Vz
TmV4dFByZXZDaGlsZCgpIGl0IGZvY3VzZXMgdGhlIG5leHQgZm9jdXNhYmxlIHdlYiBlbGVtZW50
CisgICAgaWYgXGEgbmV4dCBpcyB0cnVlOyBvdGhlcndpc2UgdGhlIHByZXZpb3VzIGVsZW1lbnQg
aXMgZm9jdXNlZC4KKworICAgIFJldHVybnMgdHJ1ZSBpZiBpdCBjYW4gZmluZCBhIG5ldyBmb2N1
c2FibGUgZWxlbWVudCwgb3IgZmFsc2UgaWYgaXQgY2FuJ3QuCisqLworYm9vbCBRV2ViUGFnZTo6
Zm9jdXNOZXh0UHJldkNoaWxkKGJvb2wgbmV4dCkKK3sKKyAgICBRS2V5RXZlbnQgZXYoUUV2ZW50
OjpLZXlQcmVzcywgUXQ6OktleV9UYWIsIFF0OjpLZXlib2FyZE1vZGlmaWVycyhuZXh0ID8gUXQ6
Ok5vTW9kaWZpZXIgOiBRdDo6U2hpZnRNb2RpZmllcikpOworICAgIGQtPmtleVByZXNzRXZlbnQo
JmV2KTsKKyAgICByZXR1cm4gZC0+aGFzRm9jdXNlZE5vZGUoKTsKK30KKworLyohCisgICAgXHBy
b3BlcnR5IFFXZWJQYWdlOjpjb250ZW50RWRpdGFibGUKKyAgICBcYnJpZWYgd2hldGhlciB0aGUg
Y29udGVudCBpbiB0aGlzIFFXZWJQYWdlIGlzIGVkaXRhYmxlIG9yIG5vdAorICAgIFxzaW5jZSA0
LjUKKworICAgIElmIHRoaXMgcHJvcGVydHkgaXMgZW5hYmxlZCB0aGUgY29udGVudHMgb2YgdGhl
IHBhZ2UgY2FuIGJlIGVkaXRlZCBieSB0aGUgdXNlciB0aHJvdWdoIGEgdmlzaWJsZQorICAgIGN1
cnNvci4gSWYgZGlzYWJsZWQgKHRoZSBkZWZhdWx0KSBvbmx5IEhUTUwgZWxlbWVudHMgaW4gdGhl
IHdlYiBwYWdlIHdpdGggdGhlaXIKKyAgICBcY3tjb250ZW50ZWRpdGFibGV9IGF0dHJpYnV0ZSBz
ZXQgYXJlIGVkaXRhYmxlLgorCisgICAgXHNhIG1vZGlmaWVkLCBjb250ZW50c0NoYW5nZWQoKSwg
V2ViQWN0aW9uCisqLwordm9pZCBRV2ViUGFnZTo6c2V0Q29udGVudEVkaXRhYmxlKGJvb2wgZWRp
dGFibGUpCit7CisgICAgaWYgKGlzQ29udGVudEVkaXRhYmxlKCkgIT0gZWRpdGFibGUpIHsKKyAg
ICAgICAgZC0+c2V0Q29udGVudEVkaXRhYmxlKGVkaXRhYmxlKTsKKyAgICAgICAgZC0+dXBkYXRl
RWRpdG9yQWN0aW9ucygpOworICAgIH0KK30KKworYm9vbCBRV2ViUGFnZTo6aXNDb250ZW50RWRp
dGFibGUoKSBjb25zdAoreworICAgIHJldHVybiBkLT5pc0NvbnRlbnRFZGl0YWJsZSgpOworfQor
CisvKiEKKyAgICBccHJvcGVydHkgUVdlYlBhZ2U6OmZvcndhcmRVbnN1cHBvcnRlZENvbnRlbnQK
KyAgICBcYnJpZWYgd2hldGhlciBRV2ViUGFnZSBzaG91bGQgZm9yd2FyZCB1bnN1cHBvcnRlZCBj
b250ZW50CisKKyAgICBJZiBlbmFibGVkLCB0aGUgdW5zdXBwb3J0ZWRDb250ZW50KCkgc2lnbmFs
IGlzIGVtaXR0ZWQgd2l0aCBhIG5ldHdvcmsgcmVwbHkgdGhhdAorICAgIGNhbiBiZSB1c2VkIHRv
IHJlYWQgdGhlIGNvbnRlbnQuCisKKyAgICBJZiBkaXNhYmxlZCwgdGhlIGRvd25sb2FkIG9mIHN1
Y2ggY29udGVudCBpcyBhYm9ydGVkIGltbWVkaWF0ZWx5LgorCisgICAgQnkgZGVmYXVsdCB1bnN1
cHBvcnRlZCBjb250ZW50IGlzIG5vdCBmb3J3YXJkZWQuCisqLworCit2b2lkIFFXZWJQYWdlOjpz
ZXRGb3J3YXJkVW5zdXBwb3J0ZWRDb250ZW50KGJvb2wgZm9yd2FyZCkKK3sKKyAgICBkLT5mb3J3
YXJkVW5zdXBwb3J0ZWRDb250ZW50ID0gZm9yd2FyZDsKK30KKworYm9vbCBRV2ViUGFnZTo6Zm9y
d2FyZFVuc3VwcG9ydGVkQ29udGVudCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGQtPmZvcndhcmRV
bnN1cHBvcnRlZENvbnRlbnQ7Cit9CisKKy8qIQorICAgIFxwcm9wZXJ0eSBRV2ViUGFnZTo6bGlu
a0RlbGVnYXRpb25Qb2xpY3kKKyAgICBcYnJpZWYgaG93IFFXZWJQYWdlIHNob3VsZCBkZWxlZ2F0
ZSB0aGUgaGFuZGxpbmcgb2YgbGlua3MgdGhyb3VnaCB0aGUKKyAgICBsaW5rQ2xpY2tlZCgpIHNp
Z25hbAorCisgICAgVGhlIGRlZmF1bHQgaXMgdG8gZGVsZWdhdGUgbm8gbGlua3MuCisqLworCit2
b2lkIFFXZWJQYWdlOjpzZXRMaW5rRGVsZWdhdGlvblBvbGljeShMaW5rRGVsZWdhdGlvblBvbGlj
eSBwb2xpY3kpCit7CisgICAgZC0+bGlua1BvbGljeSA9IHBvbGljeTsKK30KKworUVdlYlBhZ2U6
OkxpbmtEZWxlZ2F0aW9uUG9saWN5IFFXZWJQYWdlOjpsaW5rRGVsZWdhdGlvblBvbGljeSgpIGNv
bnN0Cit7CisgICAgcmV0dXJuIGQtPmxpbmtQb2xpY3k7Cit9CisKKyNpZm5kZWYgUVRfTk9fQ09O
VEVYVE1FTlUKKworYm9vbCBRV2ViUGFnZVByaXZhdGU6OmhhbmRsZVNjcm9sbGJhckNvbnRleHRN
ZW51RXZlbnQoUUNvbnRleHRNZW51RXZlbnQqIGV2ZW50LCBib29sIGhvcml6b250YWwsIFFXZWJQ
YWdlQWRhcHRlcjo6U2Nyb2xsRGlyZWN0aW9uKiBkaXJlY3Rpb24sIFFXZWJQYWdlQWRhcHRlcjo6
U2Nyb2xsR3JhbnVsYXJpdHkqIGdyYW51bGFyaXR5KQoreworICAgIGlmICghUUFwcGxpY2F0aW9u
OjpzdHlsZSgpLT5zdHlsZUhpbnQoUVN0eWxlOjpTSF9TY3JvbGxCYXJfQ29udGV4dE1lbnUpKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBRTWVudSBtZW51OworICAgIFFBY3Rpb24qIGFj
dFNjcm9sbEhlcmUgPSBtZW51LmFkZEFjdGlvbihRQ29yZUFwcGxpY2F0aW9uOjp0cmFuc2xhdGUo
IlFXZWJQYWdlIiwgIlNjcm9sbCBoZXJlIikpOworICAgIG1lbnUuYWRkU2VwYXJhdG9yKCk7CisK
KyAgICBRQWN0aW9uKiBhY3RTY3JvbGxUb3AgPSBtZW51LmFkZEFjdGlvbihob3Jpem9udGFsID8g
UUNvcmVBcHBsaWNhdGlvbjo6dHJhbnNsYXRlKCJRV2ViUGFnZSIsICJMZWZ0IGVkZ2UiKSA6IFFD
b3JlQXBwbGljYXRpb246OnRyYW5zbGF0ZSgiUVdlYlBhZ2UiLCAiVG9wIikpOworICAgIFFBY3Rp
b24qIGFjdFNjcm9sbEJvdHRvbSA9IG1lbnUuYWRkQWN0aW9uKGhvcml6b250YWwgPyBRQ29yZUFw
cGxpY2F0aW9uOjp0cmFuc2xhdGUoIlFXZWJQYWdlIiwgIlJpZ2h0IGVkZ2UiKSA6IFFDb3JlQXBw
bGljYXRpb246OnRyYW5zbGF0ZSgiUVdlYlBhZ2UiLCAiQm90dG9tIikpOworICAgIG1lbnUuYWRk
U2VwYXJhdG9yKCk7CisKKyAgICBRQWN0aW9uKiBhY3RQYWdlVXAgPSBtZW51LmFkZEFjdGlvbiho
b3Jpem9udGFsID8gUUNvcmVBcHBsaWNhdGlvbjo6dHJhbnNsYXRlKCJRV2ViUGFnZSIsICJQYWdl
IGxlZnQiKSA6IFFDb3JlQXBwbGljYXRpb246OnRyYW5zbGF0ZSgiUVdlYlBhZ2UiLCAiUGFnZSB1
cCIpKTsKKyAgICBRQWN0aW9uKiBhY3RQYWdlRG93biA9IG1lbnUuYWRkQWN0aW9uKGhvcml6b250
YWwgPyBRQ29yZUFwcGxpY2F0aW9uOjp0cmFuc2xhdGUoIlFXZWJQYWdlIiwgIlBhZ2UgcmlnaHQi
KSA6IFFDb3JlQXBwbGljYXRpb246OnRyYW5zbGF0ZSgiUVdlYlBhZ2UiLCAiUGFnZSBkb3duIikp
OworICAgIG1lbnUuYWRkU2VwYXJhdG9yKCk7CisKKyAgICBRQWN0aW9uKiBhY3RTY3JvbGxVcCA9
IG1lbnUuYWRkQWN0aW9uKGhvcml6b250YWwgPyBRQ29yZUFwcGxpY2F0aW9uOjp0cmFuc2xhdGUo
IlFXZWJQYWdlIiwgIlNjcm9sbCBsZWZ0IikgOiBRQ29yZUFwcGxpY2F0aW9uOjp0cmFuc2xhdGUo
IlFXZWJQYWdlIiwgIlNjcm9sbCB1cCIpKTsKKyAgICBRQWN0aW9uKiBhY3RTY3JvbGxEb3duID0g
bWVudS5hZGRBY3Rpb24oaG9yaXpvbnRhbCA/IFFDb3JlQXBwbGljYXRpb246OnRyYW5zbGF0ZSgi
UVdlYlBhZ2UiLCAiU2Nyb2xsIHJpZ2h0IikgOiBRQ29yZUFwcGxpY2F0aW9uOjp0cmFuc2xhdGUo
IlFXZWJQYWdlIiwgIlNjcm9sbCBkb3duIikpOworCisgICAgUUFjdGlvbiogYWN0aW9uU2VsZWN0
ZWQgPSBtZW51LmV4ZWMoZXZlbnQtPmdsb2JhbFBvcygpKTsKKworICAgIGlmIChhY3Rpb25TZWxl
Y3RlZCA9PSBhY3RTY3JvbGxIZXJlKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBlbHNlIGlm
IChhY3Rpb25TZWxlY3RlZCA9PSBhY3RTY3JvbGxUb3ApIHsKKyAgICAgICAgKmRpcmVjdGlvbiA9
IGhvcml6b250YWwgPyBTY3JvbGxMZWZ0IDogU2Nyb2xsVXA7CisgICAgICAgICpncmFudWxhcml0
eSA9IFNjcm9sbEJ5RG9jdW1lbnQ7CisgICAgfSBlbHNlIGlmIChhY3Rpb25TZWxlY3RlZCA9PSBh
Y3RTY3JvbGxCb3R0b20pIHsKKyAgICAgICAgKmRpcmVjdGlvbiA9aG9yaXpvbnRhbCA/IFNjcm9s
bFJpZ2h0IDogU2Nyb2xsRG93bjsKKyAgICAgICAgKmdyYW51bGFyaXR5ID0gU2Nyb2xsQnlEb2N1
bWVudDsKKyAgICB9IGVsc2UgaWYgKGFjdGlvblNlbGVjdGVkID09IGFjdFBhZ2VVcCkgeworICAg
ICAgICAqZGlyZWN0aW9uID0gaG9yaXpvbnRhbCA/IFNjcm9sbExlZnQgOiBTY3JvbGxVcDsKKyAg
ICAgICAgKmdyYW51bGFyaXR5ID0gU2Nyb2xsQnlQYWdlOworICAgIH0gZWxzZSBpZiAoYWN0aW9u
U2VsZWN0ZWQgPT0gYWN0UGFnZURvd24pIHsKKyAgICAgICAgKmRpcmVjdGlvbiA9aG9yaXpvbnRh
bCA/IFNjcm9sbFJpZ2h0IDogU2Nyb2xsRG93bjsKKyAgICAgICAgKmdyYW51bGFyaXR5ID0gU2Ny
b2xsQnlQYWdlOworICAgIH0gZWxzZSBpZiAoYWN0aW9uU2VsZWN0ZWQgPT0gYWN0U2Nyb2xsVXAp
IHsKKyAgICAgICAgKmRpcmVjdGlvbiA9IGhvcml6b250YWwgPyBTY3JvbGxMZWZ0IDogU2Nyb2xs
VXA7CisgICAgICAgICpncmFudWxhcml0eSA9IFNjcm9sbEJ5TGluZTsKKyAgICB9IGVsc2UgaWYg
KGFjdGlvblNlbGVjdGVkID09IGFjdFNjcm9sbERvd24pIHsKKyAgICAgICAgKmRpcmVjdGlvbiA9
aG9yaXpvbnRhbCA/IFNjcm9sbFJpZ2h0IDogU2Nyb2xsRG93bjsKKyAgICAgICAgKmdyYW51bGFy
aXR5ID0gU2Nyb2xsQnlMaW5lOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyohCisg
ICAgRmlsdGVycyB0aGUgY29udGV4dCBtZW51IGV2ZW50LCBcYSBldmVudCwgdGhyb3VnaCBoYW5k
bGVycyBmb3Igc2Nyb2xsYmFycyBhbmQKKyAgICBjdXN0b20gZXZlbnQgaGFuZGxlcnMgaW4gdGhl
IHdlYiBwYWdlLiBSZXR1cm5zIHRydWUgaWYgdGhlIGV2ZW50IHdhcyBoYW5kbGVkOworICAgIG90
aGVyd2lzZSBmYWxzZS4KKworICAgIEEgd2ViIHBhZ2UgbWF5IHN3YWxsb3cgYSBjb250ZXh0IG1l
bnUgZXZlbnQgdGhyb3VnaCBhIGN1c3RvbSBldmVudCBoYW5kbGVyLCBhbGxvd2luZyBmb3IgY29u
dGV4dAorICAgIG1lbnVzIHRvIGJlIGltcGxlbWVudGVkIGluIEhUTUwvSmF2YVNjcmlwdC4gVGhp
cyBpcyB1c2VkIGJ5IFxse2h0dHA6Ly9tYXBzLmdvb2dsZS5jb20vfXtHb29nbGUKKyAgICBNYXBz
fSwgZm9yIGV4YW1wbGUuCisqLworYm9vbCBRV2ViUGFnZTo6c3dhbGxvd0NvbnRleHRNZW51RXZl
bnQoUUNvbnRleHRNZW51RXZlbnQgKmV2ZW50KQoreworICAgIFFXZWJGcmFtZSogd2ViRnJhbWUg
PSBmcmFtZUF0KGV2ZW50LT5wb3MoKSk7CisgICAgcmV0dXJuIGQtPnN3YWxsb3dDb250ZXh0TWVu
dUV2ZW50KGV2ZW50LCB3ZWJGcmFtZSA/IHdlYkZyYW1lLT5kIDogMCk7Cit9CisjZW5kaWYgLy8g
UVRfTk9fQ09OVEVYVE1FTlUKKworLyohCisgICAgVXBkYXRlcyB0aGUgcGFnZSdzIGFjdGlvbnMg
ZGVwZW5kaW5nIG9uIHRoZSBwb3NpdGlvbiBcYSBwb3MuIEZvciBleGFtcGxlIGlmIFxhIHBvcyBp
cyBvdmVyIGFuIGltYWdlCisgICAgZWxlbWVudCB0aGUgQ29weUltYWdlVG9DbGlwYm9hcmQgYWN0
aW9uIGlzIGVuYWJsZWQuCisqLwordm9pZCBRV2ViUGFnZTo6dXBkYXRlUG9zaXRpb25EZXBlbmRl
bnRBY3Rpb25zKGNvbnN0IFFQb2ludCAmcG9zKQoreworI2lmbmRlZiBRVF9OT19BQ1RJT04KKyAg
ICAvLyBGaXJzdCB3ZSBkaXNhYmxlIGFsbCBhY3Rpb25zLCBidXQga2VlcCB0cmFjayBvZiB3aGlj
aCBvbmVzIHdlcmUgb3JpZ2luYWxseSBlbmFibGVkLgorICAgIFFCaXRBcnJheSBvcmlnaW5hbGx5
RW5hYmxlZFdlYkFjdGlvbnMoUVdlYlBhZ2U6OldlYkFjdGlvbkNvdW50KTsKKyAgICBmb3IgKGlu
dCBpID0gUVdlYlBhZ2VBZGFwdGVyOjpOb0FjdGlvbiArIDE7IGkgPCBRV2ViUGFnZUFkYXB0ZXI6
OkFjdGlvbkNvdW50OyArK2kpIHsKKyAgICAgICAgUVdlYlBhZ2U6OldlYkFjdGlvbiBhY3Rpb24g
PSB3ZWJBY3Rpb25Gb3JBZGFwdGVyTWVudUFjdGlvbihRV2ViUGFnZUFkYXB0ZXI6Ok1lbnVBY3Rp
b24oaSkpOworICAgICAgICBpZiAoUUFjdGlvbiAqYSA9IHRoaXMtPmFjdGlvbihhY3Rpb24pKSB7
CisgICAgICAgICAgICBvcmlnaW5hbGx5RW5hYmxlZFdlYkFjdGlvbnMuc2V0Qml0KGFjdGlvbiwg
YS0+aXNFbmFibGVkKCkpOworICAgICAgICAgICAgYS0+c2V0RW5hYmxlZChmYWxzZSk7CisgICAg
ICAgIH0KKyAgICB9CisjZW5kaWYgLy8gUVRfTk9fQUNUSU9OCisKKyAgICBRQml0QXJyYXkgdmlz
aXRlZFdlYkFjdGlvbnMoUVdlYlBhZ2U6OldlYkFjdGlvbkNvdW50KTsKKyAgICBkLT5jcmVhdGVN
YWluRnJhbWUoKTsKKyAgICAvLyBUaGVuIHdlIGxldCB1cGRhdGVQb3NpdGlvbkRlcGVuZGFudE1l
bnVBY3Rpb25zKCkgZW5hYmxlIHRoZSBhY3Rpb25zIHRoYXQgYXJlIHB1dCBpbnRvIHRoZSBtZW51
CisgICAgUVdlYkhpdFRlc3RSZXN1bHRQcml2YXRlKiByZXN1bHQgPSBkLT51cGRhdGVQb3NpdGlv
bkRlcGVuZGVudE1lbnVBY3Rpb25zKHBvcywgJnZpc2l0ZWRXZWJBY3Rpb25zKTsKKyAgICBpZiAo
IXJlc3VsdCkKKyAgICAgICAgZC0+aGl0VGVzdFJlc3VsdCA9IFFXZWJIaXRUZXN0UmVzdWx0KCk7
CisgICAgZWxzZQorICAgICAgICBkLT5oaXRUZXN0UmVzdWx0ID0gUVdlYkhpdFRlc3RSZXN1bHQo
cmVzdWx0KTsKKworI2lmbmRlZiBRVF9OT19BQ1RJT04KKyAgICAvLyBGaW5hbGx5LCB3ZSByZXN0
b3JlIHRoZSBvcmlnaW5hbCBlbmFibGVtZW50IGZvciB0aGUgYWN0aW9ucyB0aGF0IHdlcmUgbm90
IHB1dCBpbnRvIHRoZSBtZW51LgorICAgIG9yaWdpbmFsbHlFbmFibGVkV2ViQWN0aW9ucyAmPSB+
dmlzaXRlZFdlYkFjdGlvbnM7IC8vIE1hc2sgb3V0IHZpc2l0ZWQgYWN0aW9ucyAodGhleSdyZSBw
YXJ0IG9mIHRoZSBtZW51KQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUVdlYlBhZ2U6OldlYkFj
dGlvbkNvdW50OyArK2kpIHsKKyAgICAgICAgaWYgKG9yaWdpbmFsbHlFbmFibGVkV2ViQWN0aW9u
cy5hdChpKSkgeworICAgICAgICAgICAgaWYgKFFBY3Rpb24gKmEgPSB0aGlzLT5hY3Rpb24oUVdl
YlBhZ2U6OldlYkFjdGlvbihpKSkpCisgICAgICAgICAgICAgICAgYS0+c2V0RW5hYmxlZCh0cnVl
KTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvLyBRVF9OT19BQ1RJT04KKworICAgIC8vIFRo
aXMgd2hvbGUgcHJvY2VzcyBlbnN1cmVzIHRoYXQgYW55IGFjdGlvbnMgcHV0IGludG8gdG8gdGhl
IGNvbnRleHQgbWVudSBoYXMgdGhlIHJpZ2h0CisgICAgLy8gZW5hYmxlbWVudCwgd2hpbGUgYWxz
byBrZWVwaW5nIHRoZSBjb3JyZWN0IGVuYWJsZW1lbnQgZm9yIGFjdGlvbnMgdGhhdCB3ZXJlIGxl
ZnQgb3V0IG9mCisgICAgLy8gdGhlIG1lbnUuCisKK30KKworCisKKy8qIQorICAgIFxlbnVtIFFX
ZWJQYWdlOjpFeHRlbnNpb24KKworICAgIFRoaXMgZW51bSBkZXNjcmliZXMgdGhlIHR5cGVzIG9m
IGV4dGVuc2lvbnMgdGhhdCB0aGUgcGFnZSBjYW4gc3VwcG9ydC4gQmVmb3JlIHVzaW5nIHRoZXNl
IGV4dGVuc2lvbnMsIHlvdQorICAgIHNob3VsZCB2ZXJpZnkgdGhhdCB0aGUgZXh0ZW5zaW9uIGlz
IHN1cHBvcnRlZCBieSBjYWxsaW5nIHN1cHBvcnRzRXh0ZW5zaW9uKCkuCisKKyAgICBcdmFsdWUg
Q2hvb3NlTXVsdGlwbGVGaWxlc0V4dGVuc2lvbiBXaGV0aGVyIHRoZSB3ZWIgcGFnZSBzdXBwb3J0
cyBtdWx0aXBsZSBmaWxlIHNlbGVjdGlvbi4KKyAgICBUaGlzIGV4dGVuc2lvbiBpcyBpbnZva2Vk
IHdoZW4gdGhlIHdlYiBjb250ZW50IHJlcXVlc3RzIG9uZSBvciBtb3JlIGZpbGUgbmFtZXMsIGZv
ciBleGFtcGxlCisgICAgYXMgYSByZXN1bHQgb2YgdGhlIHVzZXIgY2xpY2tpbmcgb24gYSAiZmls
ZSB1cGxvYWQiIGJ1dHRvbiBpbiBhIEhUTUwgZm9ybSB3aGVyZSBtdWx0aXBsZQorICAgIGZpbGUg
c2VsZWN0aW9uIGlzIGFsbG93ZWQuCisKKyAgICBcdmFsdWUgRXJyb3JQYWdlRXh0ZW5zaW9uIFdo
ZXRoZXIgdGhlIHdlYiBwYWdlIGNhbiBwcm92aWRlIGFuIGVycm9yIHBhZ2Ugd2hlbiBsb2FkaW5n
IGZhaWxzLgorICAgIChpbnRyb2R1Y2VkIGluIFF0IDQuNikKKworICAgIFxzYSBDaG9vc2VNdWx0
aXBsZUZpbGVzRXh0ZW5zaW9uT3B0aW9uLCBDaG9vc2VNdWx0aXBsZUZpbGVzRXh0ZW5zaW9uUmV0
dXJuLCBFcnJvclBhZ2VFeHRlbnNpb25PcHRpb24sIEVycm9yUGFnZUV4dGVuc2lvblJldHVybgor
Ki8KKworLyohCisgICAgXGVudW0gUVdlYlBhZ2U6OkVycm9yRG9tYWluCisgICAgXHNpbmNlIDQu
NgorCisgICAgVGhpcyBlbnVtIGRlc2NyaWJlcyB0aGUgZG9tYWluIG9mIGFuIEVycm9yUGFnZUV4
dGVuc2lvbk9wdGlvbiBvYmplY3QgKGkuZS4gdGhlIGxheWVyIGluIHdoaWNoIHRoZSBlcnJvciBv
Y2N1cnJlZCkuCisKKyAgICBcdmFsdWUgUXROZXR3b3JrIFRoZSBlcnJvciBvY2N1cnJlZCBpbiB0
aGUgUXROZXR3b3JrIGxheWVyOyB0aGUgZXJyb3IgY29kZSBpcyBvZiB0eXBlIFFOZXR3b3JrUmVw
bHk6Ok5ldHdvcmtFcnJvci4KKyAgICBcdmFsdWUgSHR0cCBUaGUgZXJyb3Igb2NjdXJyZWQgaW4g
dGhlIEhUVFAgbGF5ZXI7IHRoZSBlcnJvciBjb2RlIGlzIGEgSFRUUCBzdGF0dXMgY29kZSAoc2Vl
IFFOZXR3b3JrUmVxdWVzdDo6SHR0cFN0YXR1c0NvZGVBdHRyaWJ1dGUpLgorICAgIFx2YWx1ZSBX
ZWJLaXQgVGhlIGVycm9yIGlzIGFuIGludGVybmFsIFdlYktpdCBlcnJvci4KKyovCisKKy8qIQor
ICAgIFxjbGFzcyBRV2ViUGFnZTo6RXh0ZW5zaW9uT3B0aW9uCisgICAgXHNpbmNlIDQuNAorICAg
IFxicmllZiBUaGUgRXh0ZW5zaW9uT3B0aW9uIGNsYXNzIHByb3ZpZGVzIGFuIGV4dGVuZGVkIGlu
cHV0IGFyZ3VtZW50IHRvIFFXZWJQYWdlJ3MgZXh0ZW5zaW9uIHN1cHBvcnQuCisKKyAgICBcaW5t
b2R1bGUgUXRXZWJLaXQKKworICAgIFxzYSBRV2ViUGFnZTo6ZXh0ZW5zaW9uKCksIFFXZWJQYWdl
OjpFeHRlbnNpb25SZXR1cm4KKyovCisKKworLyohCisgICAgXGNsYXNzIFFXZWJQYWdlOjpFeHRl
bnNpb25SZXR1cm4KKyAgICBcc2luY2UgNC40CisgICAgXGJyaWVmIFRoZSBFeHRlbnNpb25SZXR1
cm4gY2xhc3MgcHJvdmlkZXMgYW4gb3V0cHV0IHJlc3VsdCBmcm9tIGEgUVdlYlBhZ2UncyBleHRl
bnNpb24uCisKKyAgICBcaW5tb2R1bGUgUXRXZWJLaXQKKworICAgIFxzYSBRV2ViUGFnZTo6ZXh0
ZW5zaW9uKCksIFFXZWJQYWdlOjpFeHRlbnNpb25PcHRpb24KKyovCisKKy8qIQorICAgIFxjbGFz
cyBRV2ViUGFnZTo6RXJyb3JQYWdlRXh0ZW5zaW9uT3B0aW9uCisgICAgXHNpbmNlIDQuNgorICAg
IFxicmllZiBUaGUgRXJyb3JQYWdlRXh0ZW5zaW9uT3B0aW9uIGNsYXNzIGRlc2NyaWJlcyB0aGUg
b3B0aW9uCisgICAgZm9yIHRoZSBlcnJvciBwYWdlIGV4dGVuc2lvbi4KKworICAgIFxpbm1vZHVs
ZSBRdFdlYktpdAorCisgICAgVGhlIEVycm9yUGFnZUV4dGVuc2lvbk9wdGlvbiBjbGFzcyBob2xk
cyB0aGUgXGEgdXJsIGZvciB3aGljaCBhbiBlcnJvciBvY2N1cnJlZCBhcyB3ZWxsIGFzCisgICAg
dGhlIGFzc29jaWF0ZWQgXGEgZnJhbWUuCisKKyAgICBUaGUgZXJyb3IgaXRzZWxmIGlzIHJlcG9y
dGVkIGJ5IGFuIGVycm9yIFxhIGRvbWFpbiwgdGhlIFxhIGVycm9yIGNvZGUgYXMgd2VsbCBhcyBc
YSBlcnJvclN0cmluZy4KKworICAgIFxzYSBRV2ViUGFnZTo6ZXh0ZW5zaW9uKCksIFFXZWJQYWdl
OjpFcnJvclBhZ2VFeHRlbnNpb25SZXR1cm4KKyovCisKKy8qIQorICAgIFx2YXJpYWJsZSBRV2Vi
UGFnZTo6RXJyb3JQYWdlRXh0ZW5zaW9uT3B0aW9uOjp1cmwKKyAgICBcYnJpZWYgdGhlIHVybCBm
b3Igd2hpY2ggYW4gZXJyb3Igb2NjdXJyZWQKKyovCisKKy8qIQorICAgIFx2YXJpYWJsZSBRV2Vi
UGFnZTo6RXJyb3JQYWdlRXh0ZW5zaW9uT3B0aW9uOjpmcmFtZQorICAgIFxicmllZiB0aGUgZnJh
bWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBlcnJvcgorKi8KKworLyohCisgICAgXHZhcmlhYmxlIFFX
ZWJQYWdlOjpFcnJvclBhZ2VFeHRlbnNpb25PcHRpb246OmRvbWFpbgorICAgIFxicmllZiB0aGUg
ZG9tYWluIHRoYXQgcmVwb3J0ZWQgdGhlIGVycm9yCisqLworCisvKiEKKyAgICBcdmFyaWFibGUg
UVdlYlBhZ2U6OkVycm9yUGFnZUV4dGVuc2lvbk9wdGlvbjo6ZXJyb3IKKyAgICBcYnJpZWYgdGhl
IGVycm9yIGNvZGUuIEludGVycHJldGF0aW9uIG9mIHRoZSB2YWx1ZSBkZXBlbmRzIG9uIHRoZSBc
YSBkb21haW4KKyAgICBcc2EgUVdlYlBhZ2U6OkVycm9yRG9tYWluCisqLworCisvKiEKKyAgICBc
dmFyaWFibGUgUVdlYlBhZ2U6OkVycm9yUGFnZUV4dGVuc2lvbk9wdGlvbjo6ZXJyb3JTdHJpbmcK
KyAgICBcYnJpZWYgYSBzdHJpbmcgdGhhdCBkZXNjcmliZXMgdGhlIGVycm9yCisqLworCisvKiEK
KyAgICBcY2xhc3MgUVdlYlBhZ2U6OkVycm9yUGFnZUV4dGVuc2lvblJldHVybgorICAgIFxzaW5j
ZSA0LjYKKyAgICBcYnJpZWYgVGhlIEVycm9yUGFnZUV4dGVuc2lvblJldHVybiBkZXNjcmliZXMg
dGhlIGVycm9yIHBhZ2UsIHdoaWNoIHdpbGwgYmUgc2hvd24gZm9yIHRoZQorICAgIGZyYW1lIGZv
ciB3aGljaCB0aGUgZXJyb3Igb2NjdXJlZC4KKworICAgIFxpbm1vZHVsZSBRdFdlYktpdAorCisg
ICAgVGhlIEVycm9yUGFnZUV4dGVuc2lvblJldHVybiBjbGFzcyBob2xkcyB0aGUgZGF0YSBuZWVk
ZWQgZm9yIGNyZWF0aW5nIGFuIGVycm9yIHBhZ2UuIFNvbWUgYXJlCisgICAgb3B0aW9uYWwgc3Vj
aCBhcyBcYSBjb250ZW50VHlwZSwgd2hpY2ggZGVmYXVsdHMgdG8gInRleHQvaHRtbCIsIGFzIHdl
bGwgYXMgdGhlIFxhIGVuY29kaW5nLCB3aGljaAorICAgIGlzIGFzc3VtZWQgdG8gYmUgVVRGLTgg
aWYgbm90IGluZGljYXRlZCBvdGhlcndpc2UuCisKKyAgICBUaGUgZXJyb3IgcGFnZSBpcyBzdG9y
ZWQgaW4gdGhlIFxhIGNvbnRlbnQgYnl0ZSBhcnJheSwgYXMgSFRNTCBjb250ZW50LiBJbiBvcmRl
ciB0byBjb252ZXJ0IGEKKyAgICBRU3RyaW5nIHRvIGEgYnl0ZSBhcnJheSwgdGhlIFFTdHJpbmc6
OnRvVXRmOCgpIG1ldGhvZCBjYW4gYmUgdXNlZC4KKworICAgIEV4dGVybmFsIG9iamVjdHMgc3Vj
aCBhcyBzdHlsZXNoZWV0cyBvciBpbWFnZXMgcmVmZXJlbmNlZCBpbiB0aGUgSFRNTCBhcmUgbG9j
YXRlZCByZWxhdGl2ZSB0bworICAgIFxhIGJhc2VVcmwuCisKKyAgICBcc2EgUVdlYlBhZ2U6OmV4
dGVuc2lvbigpLCBRV2ViUGFnZTo6RXJyb3JQYWdlRXh0ZW5zaW9uT3B0aW9uLCBRU3RyaW5nOjp0
b1V0ZjgoKQorKi8KKworLyohCisgICAgXGZuIFFXZWJQYWdlOjpFcnJvclBhZ2VFeHRlbnNpb25S
ZXR1cm46OkVycm9yUGFnZUV4dGVuc2lvblJldHVybigpCisKKyAgICBDb25zdHJ1Y3RzIGEgbmV3
IGVycm9yIHBhZ2Ugb2JqZWN0LgorKi8KKworCisvKiEKKyAgICBcdmFyaWFibGUgUVdlYlBhZ2U6
OkVycm9yUGFnZUV4dGVuc2lvblJldHVybjo6Y29udGVudFR5cGUKKyAgICBcYnJpZWYgdGhlIGVy
cm9yIHBhZ2UncyBjb250ZW50IHR5cGUKKyovCisKKy8qIQorICAgIFx2YXJpYWJsZSBRV2ViUGFn
ZTo6RXJyb3JQYWdlRXh0ZW5zaW9uUmV0dXJuOjplbmNvZGluZworICAgIFxicmllZiB0aGUgZXJy
b3IgcGFnZSBlbmNvZGluZworKi8KKworLyohCisgICAgXHZhcmlhYmxlIFFXZWJQYWdlOjpFcnJv
clBhZ2VFeHRlbnNpb25SZXR1cm46OmJhc2VVcmwKKyAgICBcYnJpZWYgdGhlIGJhc2UgdXJsCisK
KyAgICBFeHRlcm5hbCBvYmplY3RzIHN1Y2ggYXMgc3R5bGVzaGVldHMgb3IgaW1hZ2VzIHJlZmVy
ZW5jZWQgaW4gdGhlIEhUTUwgYXJlIGxvY2F0ZWQgcmVsYXRpdmUgdG8gdGhpcyB1cmwuCisqLwor
CisvKiEKKyAgICBcdmFyaWFibGUgUVdlYlBhZ2U6OkVycm9yUGFnZUV4dGVuc2lvblJldHVybjo6
Y29udGVudAorICAgIFxicmllZiB0aGUgSFRNTCBjb250ZW50IG9mIHRoZSBlcnJvciBwYWdlCisq
LworCisvKiEKKyAgICBcY2xhc3MgUVdlYlBhZ2U6OkNob29zZU11bHRpcGxlRmlsZXNFeHRlbnNp
b25PcHRpb24KKyAgICBcc2luY2UgNC41CisgICAgXGJyaWVmIFRoZSBDaG9vc2VNdWx0aXBsZUZp
bGVzRXh0ZW5zaW9uT3B0aW9uIGNsYXNzIGRlc2NyaWJlcyB0aGUgb3B0aW9uCisgICAgZm9yIHRo
ZSBtdWx0aXBsZSBmaWxlcyBzZWxlY3Rpb24gZXh0ZW5zaW9uLgorCisgICAgXGlubW9kdWxlIFF0
V2ViS2l0CisKKyAgICBUaGUgQ2hvb3NlTXVsdGlwbGVGaWxlc0V4dGVuc2lvbk9wdGlvbiBjbGFz
cyBob2xkcyB0aGUgZnJhbWUgb3JpZ2luYXRpbmcgdGhlIHJlcXVlc3QKKyAgICBhbmQgdGhlIHN1
Z2dlc3RlZCBmaWxlbmFtZXMgd2hpY2ggbWlnaHQgYmUgcHJvdmlkZWQuCisKKyAgICBcc2EgUVdl
YlBhZ2U6OmV4dGVuc2lvbigpLCBRV2ViUGFnZTo6Y2hvb3NlRmlsZSgpLCBRV2ViUGFnZTo6Q2hv
b3NlTXVsdGlwbGVGaWxlc0V4dGVuc2lvblJldHVybgorKi8KKworLyohCisgICAgXHZhcmlhYmxl
IFFXZWJQYWdlOjpDaG9vc2VNdWx0aXBsZUZpbGVzRXh0ZW5zaW9uT3B0aW9uOjpwYXJlbnRGcmFt
ZQorICAgIFxicmllZiBUaGUgZnJhbWUgaW4gd2hpY2ggdGhlIHJlcXVlc3Qgb3JpZ2luYXRlZAor
Ki8KKworLyohCisgICAgXHZhcmlhYmxlIFFXZWJQYWdlOjpDaG9vc2VNdWx0aXBsZUZpbGVzRXh0
ZW5zaW9uT3B0aW9uOjpzdWdnZXN0ZWRGaWxlTmFtZXMKKyAgICBcYnJpZWYgVGhlIHN1Z2dlc3Rl
ZCBmaWxlbmFtZXMKKyovCisKKy8qIQorICAgIFx2YXJpYWJsZSBRV2ViUGFnZTo6Q2hvb3NlTXVs
dGlwbGVGaWxlc0V4dGVuc2lvblJldHVybjo6ZmlsZU5hbWVzCisgICAgXGJyaWVmIFRoZSBzZWxl
Y3RlZCBmaWxlbmFtZXMKKyovCisKKy8qIQorICAgIFxjbGFzcyBRV2ViUGFnZTo6Q2hvb3NlTXVs
dGlwbGVGaWxlc0V4dGVuc2lvblJldHVybgorICAgIFxzaW5jZSA0LjUKKyAgICBcYnJpZWYgVGhl
IENob29zZU11bHRpcGxlRmlsZXNFeHRlbnNpb25SZXR1cm4gZGVzY3JpYmVzIHRoZSByZXR1cm4g
dmFsdWUKKyAgICBmb3IgdGhlIG11bHRpcGxlIGZpbGVzIHNlbGVjdGlvbiBleHRlbnNpb24uCisK
KyAgICBcaW5tb2R1bGUgUXRXZWJLaXQKKworICAgIFRoZSBDaG9vc2VNdWx0aXBsZUZpbGVzRXh0
ZW5zaW9uUmV0dXJuIGNsYXNzIGhvbGRzIHRoZSBmaWxlbmFtZXMgc2VsZWN0ZWQgYnkgdGhlIHVz
ZXIKKyAgICB3aGVuIHRoZSBleHRlbnNpb24gaXMgaW52b2tlZC4KKworICAgIFxzYSBRV2ViUGFn
ZTo6ZXh0ZW5zaW9uKCksIFFXZWJQYWdlOjpDaG9vc2VNdWx0aXBsZUZpbGVzRXh0ZW5zaW9uT3B0
aW9uCisqLworCisvKiEKKyAgICBUaGlzIHZpcnR1YWwgZnVuY3Rpb24gY2FuIGJlIHJlaW1wbGVt
ZW50ZWQgaW4gYSBRV2ViUGFnZSBzdWJjbGFzcyB0byBwcm92aWRlIHN1cHBvcnQgZm9yIGV4dGVu
c2lvbnMuIFRoZSBcYSBvcHRpb24KKyAgICBhcmd1bWVudCBpcyBwcm92aWRlZCBhcyBpbnB1dCB0
byB0aGUgZXh0ZW5zaW9uOyB0aGUgb3V0cHV0IHJlc3VsdHMgY2FuIGJlIHN0b3JlZCBpbiBcYSBv
dXRwdXQuCisKKyAgICBUaGUgYmVoYXZpb3Igb2YgdGhpcyBmdW5jdGlvbiBpcyBkZXRlcm1pbmVk
IGJ5IFxhIGV4dGVuc2lvbi4gVGhlIFxhIG9wdGlvbgorICAgIGFuZCBcYSBvdXRwdXQgdmFsdWVz
IGFyZSB0eXBpY2FsbHkgY2FzdGVkIHRvIHRoZSBjb3JyZXNwb25kaW5nIHR5cGVzIChmb3IKKyAg
ICBleGFtcGxlLCBDaG9vc2VNdWx0aXBsZUZpbGVzRXh0ZW5zaW9uT3B0aW9uIGFuZAorICAgIENo
b29zZU11bHRpcGxlRmlsZXNFeHRlbnNpb25SZXR1cm4gZm9yIENob29zZU11bHRpcGxlRmlsZXNF
eHRlbnNpb24pLgorCisgICAgWW91IGNhbiBjYWxsIHN1cHBvcnRzRXh0ZW5zaW9uKCkgdG8gY2hl
Y2sgaWYgYW4gZXh0ZW5zaW9uIGlzIHN1cHBvcnRlZCBieSB0aGUgcGFnZS4KKworICAgIFJldHVy
bnMgdHJ1ZSBpZiB0aGUgZXh0ZW5zaW9uIHdhcyBjYWxsZWQgc3VjY2Vzc2Z1bGx5OyBvdGhlcndp
c2UgcmV0dXJucyBmYWxzZS4KKworICAgIFxzYSBzdXBwb3J0c0V4dGVuc2lvbigpLCBFeHRlbnNp
b24KKyovCitib29sIFFXZWJQYWdlOjpleHRlbnNpb24oRXh0ZW5zaW9uIGV4dGVuc2lvbiwgY29u
c3QgRXh0ZW5zaW9uT3B0aW9uICpvcHRpb24sIEV4dGVuc2lvblJldHVybiAqb3V0cHV0KQorewor
I2lmbmRlZiBRVF9OT19GSUxFRElBTE9HCisgICAgaWYgKGV4dGVuc2lvbiA9PSBDaG9vc2VNdWx0
aXBsZUZpbGVzRXh0ZW5zaW9uKSB7CisgICAgICAgIC8vIEZJWE1FOiBkbyBub3QgaWdub3JlIHN1
Z2dlc3RlZEZpbGVzCisgICAgICAgIFFTdHJpbmdMaXN0IHN1Z2dlc3RlZEZpbGVzID0gc3RhdGlj
X2Nhc3Q8Y29uc3QgQ2hvb3NlTXVsdGlwbGVGaWxlc0V4dGVuc2lvbk9wdGlvbio+KG9wdGlvbikt
PnN1Z2dlc3RlZEZpbGVOYW1lczsKKyAgICAgICAgUVN0cmluZ0xpc3QgbmFtZXMgPSBRRmlsZURp
YWxvZzo6Z2V0T3BlbkZpbGVOYW1lcyh2aWV3KCksIFFTdHJpbmc6Om51bGwpOworICAgICAgICBz
dGF0aWNfY2FzdDxDaG9vc2VNdWx0aXBsZUZpbGVzRXh0ZW5zaW9uUmV0dXJuKj4ob3V0cHV0KS0+
ZmlsZU5hbWVzID0gbmFtZXM7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyNlbmRpZgor
CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKiEKKyAgICBUaGlzIHZpcnR1YWwgZnVuY3Rpb24g
cmV0dXJucyB0cnVlIGlmIHRoZSB3ZWIgcGFnZSBzdXBwb3J0cyBcYSBleHRlbnNpb247IG90aGVy
d2lzZSBmYWxzZSBpcyByZXR1cm5lZC4KKworICAgIFxzYSBleHRlbnNpb24oKQorKi8KK2Jvb2wg
UVdlYlBhZ2U6OnN1cHBvcnRzRXh0ZW5zaW9uKEV4dGVuc2lvbiBleHRlbnNpb24pIGNvbnN0Cit7
CisjaWZuZGVmIFFUX05PX0ZJTEVESUFMT0cKKyAgICByZXR1cm4gZXh0ZW5zaW9uID09IENob29z
ZU11bHRpcGxlRmlsZXNFeHRlbnNpb247CisjZWxzZQorICAgIFFfVU5VU0VEKGV4dGVuc2lvbik7
CisgICAgcmV0dXJuIGZhbHNlOworI2VuZGlmCit9CisKKy8qIQorICogXGludGVybmFsCisgKi8K
K1FXZWJQYWdlQWRhcHRlciAqUVdlYlBhZ2U6OmhhbmRsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJu
IGQ7Cit9CisKKy8qIQorICAgIEZpbmRzIHRoZSBzcGVjaWZpZWQgc3RyaW5nLCBcYSBzdWJTdHJp
bmcsIGluIHRoZSBwYWdlLCB1c2luZyB0aGUgZ2l2ZW4gXGEgb3B0aW9ucy4KKworICAgIElmIHRo
ZSBIaWdobGlnaHRBbGxPY2N1cnJlbmNlcyBmbGFnIGlzIHBhc3NlZCwgdGhlIGZ1bmN0aW9uIHdp
bGwgaGlnaGxpZ2h0IGFsbCBvY2N1cnJlbmNlcworICAgIHRoYXQgZXhpc3QgaW4gdGhlIHBhZ2Uu
IEFsbCBzdWJzZXF1ZW50IGNhbGxzIHdpbGwgZXh0ZW5kIHRoZSBoaWdobGlnaHQsIHJhdGhlciB0
aGFuCisgICAgcmVwbGFjZSBpdCwgd2l0aCBvY2N1cnJlbmNlcyBvZiB0aGUgbmV3IHN0cmluZy4K
KworICAgIElmIHRoZSBIaWdobGlnaHRBbGxPY2N1cnJlbmNlcyBmbGFnIGlzIG5vdCBwYXNzZWQs
IHRoZSBmdW5jdGlvbiB3aWxsIHNlbGVjdCBhbiBvY2N1cnJlbmNlCisgICAgYW5kIGFsbCBzdWJz
ZXF1ZW50IGNhbGxzIHdpbGwgcmVwbGFjZSB0aGUgY3VycmVudCBvY2N1cnJlbmNlIHdpdGggdGhl
IG5leHQgb25lLgorCisgICAgVG8gY2xlYXIgdGhlIHNlbGVjdGlvbiwganVzdCBwYXNzIGFuIGVt
cHR5IHN0cmluZy4KKworICAgIFJldHVybnMgdHJ1ZSBpZiBcYSBzdWJTdHJpbmcgd2FzIGZvdW5k
OyBvdGhlcndpc2UgcmV0dXJucyBmYWxzZS4KKyovCitib29sIFFXZWJQYWdlOjpmaW5kVGV4dChj
b25zdCBRU3RyaW5nICZzdWJTdHJpbmcsIEZpbmRGbGFncyBvcHRpb25zKQoreworICAgIHJldHVy
biBkLT5maW5kVGV4dChzdWJTdHJpbmcsIHN0YXRpY19jYXN0PFFXZWJQYWdlQWRhcHRlcjo6Rmlu
ZEZsYWc+KG9wdGlvbnMub3BlcmF0b3IgaW50KCkpKTsKK30KKworLyohCisgICAgUmV0dXJucyBh
IHBvaW50ZXIgdG8gdGhlIHBhZ2UncyBzZXR0aW5ncyBvYmplY3QuCisKKyAgICBcc2EgUVdlYlNl
dHRpbmdzOjpnbG9iYWxTZXR0aW5ncygpCisqLworUVdlYlNldHRpbmdzICpRV2ViUGFnZTo6c2V0
dGluZ3MoKSBjb25zdAoreworICAgIHJldHVybiBkLT5zZXR0aW5nczsKK30KKworLyohCisgICAg
VGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgd2ViIGNvbnRlbnQgcmVxdWVzdHMgYSBm
aWxlIG5hbWUsIGZvciBleGFtcGxlCisgICAgYXMgYSByZXN1bHQgb2YgdGhlIHVzZXIgY2xpY2tp
bmcgb24gYSAiZmlsZSB1cGxvYWQiIGJ1dHRvbiBpbiBhIEhUTUwgZm9ybS4KKworICAgIEEgc3Vn
Z2VzdGVkIGZpbGVuYW1lIG1heSBiZSBwcm92aWRlZCBpbiBcYSBzdWdnZXN0ZWRGaWxlLiBUaGUg
ZnJhbWUgb3JpZ2luYXRpbmcgdGhlCisgICAgcmVxdWVzdCBpcyBwcm92aWRlZCBhcyBcYSBwYXJl
bnRGcmFtZS4KKworICAgIFxzYSBDaG9vc2VNdWx0aXBsZUZpbGVzRXh0ZW5zaW9uCisqLworUVN0
cmluZyBRV2ViUGFnZTo6Y2hvb3NlRmlsZShRV2ViRnJhbWUgKnBhcmVudEZyYW1lLCBjb25zdCBR
U3RyaW5nJiBzdWdnZXN0ZWRGaWxlKQoreworICAgIFFfVU5VU0VEKHBhcmVudEZyYW1lKTsKKyNp
Zm5kZWYgUVRfTk9fRklMRURJQUxPRworICAgIHJldHVybiBRRmlsZURpYWxvZzo6Z2V0T3BlbkZp
bGVOYW1lKHZpZXcoKSwgUVN0cmluZzo6bnVsbCwgc3VnZ2VzdGVkRmlsZSk7CisjZWxzZQorICAg
IHJldHVybiBRU3RyaW5nOjpudWxsOworI2VuZGlmCit9CisKKy8qIQorICAgIFNldHMgdGhlIFFO
ZXR3b3JrQWNjZXNzTWFuYWdlciBcYSBtYW5hZ2VyIHJlc3BvbnNpYmxlIGZvciBzZXJ2aW5nIG5l
dHdvcmsgcmVxdWVzdHMgZm9yIHRoaXMKKyAgICBRV2ViUGFnZS4KKworICAgIFxub3RlIEl0IGlz
IGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkIHRvIGNoYW5nZSB0aGUgbmV0d29yayBhY2Nlc3MgbWFu
YWdlciBhZnRlciB0aGUKKyAgICBRV2ViUGFnZSBoYXMgdXNlZCBpdC4gVGhlIHJlc3VsdHMgb2Yg
ZG9pbmcgdGhpcyBhcmUgdW5kZWZpbmVkLgorCisgICAgXHNhIG5ldHdvcmtBY2Nlc3NNYW5hZ2Vy
KCkKKyovCit2b2lkIFFXZWJQYWdlOjpzZXROZXR3b3JrQWNjZXNzTWFuYWdlcihRTmV0d29ya0Fj
Y2Vzc01hbmFnZXIgKm1hbmFnZXIpCit7CisgICAgZC0+c2V0TmV0d29ya0FjY2Vzc01hbmFnZXIo
bWFuYWdlcik7Cit9CisKKy8qIQorICAgIFJldHVybnMgdGhlIFFOZXR3b3JrQWNjZXNzTWFuYWdl
ciB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciBzZXJ2aW5nIG5ldHdvcmsKKyAgICByZXF1ZXN0cyBm
b3IgdGhpcyBRV2ViUGFnZS4KKworICAgIFxzYSBzZXROZXR3b3JrQWNjZXNzTWFuYWdlcigpCisq
LworUU5ldHdvcmtBY2Nlc3NNYW5hZ2VyICpRV2ViUGFnZTo6bmV0d29ya0FjY2Vzc01hbmFnZXIo
KSBjb25zdAoreworICAgIHJldHVybiBkLT5uZXR3b3JrQWNjZXNzTWFuYWdlcigpOworfQorCisv
KiEKKyAgICBTZXRzIHRoZSBRV2ViUGx1Z2luRmFjdG9yeSBcYSBmYWN0b3J5IHJlc3BvbnNpYmxl
IGZvciBjcmVhdGluZyBwbHVnaW5zIGVtYmVkZGVkIGludG8gdGhpcworICAgIFFXZWJQYWdlLgor
CisgICAgTm90ZTogVGhlIHBsdWdpbiBmYWN0b3J5IGlzIG9ubHkgdXNlZCBpZiB0aGUgUVdlYlNl
dHRpbmdzOjpQbHVnaW5zRW5hYmxlZCBhdHRyaWJ1dGUgaXMgZW5hYmxlZC4KKworICAgIFxzYSBw
bHVnaW5GYWN0b3J5KCkKKyovCit2b2lkIFFXZWJQYWdlOjpzZXRQbHVnaW5GYWN0b3J5KFFXZWJQ
bHVnaW5GYWN0b3J5ICpmYWN0b3J5KQoreworICAgIGQtPnBsdWdpbkZhY3RvcnkgPSBmYWN0b3J5
OworfQorCisvKiEKKyAgICBSZXR1cm5zIHRoZSBRV2ViUGx1Z2luRmFjdG9yeSB0aGF0IGlzIHJl
c3BvbnNpYmxlIGZvciBjcmVhdGluZyBwbHVnaW5zIGVtYmVkZGVkIGludG8KKyAgICB0aGlzIFFX
ZWJQYWdlLiBJZiBubyBwbHVnaW4gZmFjdG9yeSBpcyBpbnN0YWxsZWQgYSBudWxsIHBvaW50ZXIg
aXMgcmV0dXJuZWQuCisKKyAgICBcc2Egc2V0UGx1Z2luRmFjdG9yeSgpCisqLworUVdlYlBsdWdp
bkZhY3RvcnkgKlFXZWJQYWdlOjpwbHVnaW5GYWN0b3J5KCkgY29uc3QKK3sKKyAgICByZXR1cm4g
ZC0+cGx1Z2luRmFjdG9yeTsKK30KKworLyohCisgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQg
d2hlbiBhIHVzZXIgYWdlbnQgZm9yIEhUVFAgcmVxdWVzdHMgaXMgbmVlZGVkLiBZb3UgY2FuIHJl
aW1wbGVtZW50IHRoaXMKKyAgICBmdW5jdGlvbiB0byBkeW5hbWljYWxseSByZXR1cm4gZGlmZmVy
ZW50IHVzZXIgYWdlbnRzIGZvciBkaWZmZXJlbnQgVVJMcywgYmFzZWQgb24gdGhlIFxhIHVybCBw
YXJhbWV0ZXIuCisKKyAgICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRoZSBm
b2xsb3dpbmcgdmFsdWU6CisKKyAgICAiTW96aWxsYS81LjAgKCVQbGF0Zm9ybSUlU2VjdXJpdHkl
JVN1YnBsYXRmb3JtJSkgQXBwbGVXZWJLaXQvJVdlYktpdFZlcnNpb24lIChLSFRNTCwgbGlrZSBH
ZWNrbykgJUFwcFZlcnNpb24gU2FmYXJpLyVXZWJLaXRWZXJzaW9uJSIKKworICAgIEluIHRoaXMg
c3RyaW5nIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSByZXBsYWNlZCBhdCBydW4tdGltZToKKyAg
ICBcbGlzdAorICAgIFxsaSAlUGxhdGZvcm0lIGV4cGFuZHMgdG8gdGhlIHdpbmRvd2luZyBzeXN0
ZW0gZm9sbG93ZWQgYnkgIjsgIiBpZiBpdCBpcyBub3QgV2luZG93cyAoZS5nLiAiWDExOyAiKS4K
KyAgICBcbGkgJVNlY3VyaXR5JSBleHBhbmRzIHRvICJOOyAiIGlmIFNTTCBpcyBkaXNhYmxlZC4K
KyAgICBcbGkgJVN1YnBsYXRmb3JtJSBleHBhbmRzIHRvIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHZl
cnNpb24gKGUuZy4gIldpbmRvd3MgTlQgNi4xIiBvciAiSW50ZWwgTWFjIE9TIFggMTAuNSIpLgor
ICAgIFxsaSAlV2ViS2l0VmVyc2lvbiUgaXMgdGhlIHZlcnNpb24gb2YgV2ViS2l0IHRoZSBhcHBs
aWNhdGlvbiB3YXMgY29tcGlsZWQgYWdhaW5zdC4KKyAgICBcbGkgJUFwcFZlcnNpb24lIGV4cGFu
ZHMgdG8gUUNvcmVBcHBsaWNhdGlvbjo6YXBwbGljYXRpb25OYW1lKCkvUUNvcmVBcHBsaWNhdGlv
bjo6YXBwbGljYXRpb25WZXJzaW9uKCkgaWYgdGhleSdyZSBzZXQ7IG90aGVyd2lzZSBkZWZhdWx0
aW5nIHRvIFF0IGFuZCB0aGUgY3VycmVudCBRdCB2ZXJzaW9uLgorICAgIFxlbmRsaXN0CisqLwor
UVN0cmluZyBRV2ViUGFnZTo6dXNlckFnZW50Rm9yVXJsKGNvbnN0IFFVcmwmKSBjb25zdAorewor
ICAgIHJldHVybiBRV2ViUGFnZUFkYXB0ZXI6OmRlZmF1bHRVc2VyQWdlbnRTdHJpbmcoKTsKK30K
KworCisvKiEKKyAgICBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3ZXJl
IHJlY2VpdmVkIGZyb20gdGhlIG5ldHdvcmsgdG8gcmVuZGVyIHRoZSBjdXJyZW50IHBhZ2UsCisg
ICAgaW5jbHVkaW5nIGV4dHJhIGNvbnRlbnQgc3VjaCBhcyBlbWJlZGRlZCBpbWFnZXMuCisKKyAg
ICBcc2EgYnl0ZXNSZWNlaXZlZCgpCisqLworcXVpbnQ2NCBRV2ViUGFnZTo6dG90YWxCeXRlcygp
IGNvbnN0Cit7CisgICAgcmV0dXJuIGQtPm1fdG90YWxCeXRlczsKK30KKworCisvKiEKKyAgICBS
ZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3ZXJlIHJlY2VpdmVkIGZyb20gdGhlIG5l
dHdvcmsgdG8gcmVuZGVyIHRoZSBjdXJyZW50IHBhZ2UuCisKKyAgICBcc2EgdG90YWxCeXRlcygp
LCBsb2FkUHJvZ3Jlc3MoKQorKi8KK3F1aW50NjQgUVdlYlBhZ2U6OmJ5dGVzUmVjZWl2ZWQoKSBj
b25zdAoreworICAgIHJldHVybiBkLT5tX2J5dGVzUmVjZWl2ZWQ7Cit9CisKKy8qIQorICAgIFxz
aW5jZSA0LjgKKyAgICBcZm4gdm9pZCBRV2ViUGFnZTo6dmlld3BvcnRDaGFuZ2VSZXF1ZXN0ZWQo
KQorCisgICAgUGFnZSBhdXRob3JzIGNhbiBwcm92aWRlIHRoZSBzdXBwbGllZCB2YWx1ZXMgYnkg
dXNpbmcgdGhlIHZpZXdwb3J0IG1ldGEgdGFnLiBNb3JlIGluZm9ybWF0aW9uCisgICAgYWJvdXQg
dGhpcyBjYW4gYmUgZm91bmQgYXQgXGx7aHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vc2FmYXJp
L2xpYnJhcnkvZG9jdW1lbnRhdGlvbi9hcHBsZWFwcGxpY2F0aW9ucy9yZWZlcmVuY2Uvc2FmYXJp
d2ViY29udGVudC91c2luZ3RoZXZpZXdwb3J0L3VzaW5ndGhldmlld3BvcnQuaHRtbH17U2FmYXJp
IFJlZmVyZW5jZSBMaWJyYXJ5OiBVc2luZyB0aGUgVmlld3BvcnQgTWV0YSBUYWd9LgorCisgICAg
XHNhIFFXZWJQYWdlOjpWaWV3cG9ydEF0dHJpYnV0ZXMsIHNldFByZWZlcnJlZENvbnRlbnRzU2l6
ZSgpLCBRR3JhcGhpY3NXZWJWaWV3OjpzZXRTY2FsZSgpCisqLworCisvKiEKKyAgICBcZm4gdm9p
ZCBRV2ViUGFnZTo6bG9hZFN0YXJ0ZWQoKQorCisgICAgVGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3
aGVuIGEgcGFnZSBzdGFydHMgbG9hZGluZyBjb250ZW50LgorCisgICAgXHNhIGxvYWRGaW5pc2hl
ZCgpCisqLworCisvKiEKKyAgICBcZm4gdm9pZCBRV2ViUGFnZTo6bG9hZFByb2dyZXNzKGludCBw
cm9ncmVzcykKKworICAgIFRoaXMgc2lnbmFsIGlzIGVtaXR0ZWQgd2hlbiB0aGUgZ2xvYmFsIHBy
b2dyZXNzIHN0YXR1cyBjaGFuZ2VzLgorICAgIFRoZSBjdXJyZW50IHZhbHVlIGlzIHByb3ZpZGVk
IGJ5IFxhIHByb2dyZXNzIGFuZCBzY2FsZXMgZnJvbSAwIHRvIDEwMCwKKyAgICB3aGljaCBpcyB0
aGUgZGVmYXVsdCByYW5nZSBvZiBRUHJvZ3Jlc3NCYXIuCisgICAgSXQgYWNjdW11bGF0ZXMgY2hh
bmdlcyBmcm9tIGFsbCB0aGUgY2hpbGQgZnJhbWVzLgorCisgICAgXHNhIGJ5dGVzUmVjZWl2ZWQo
KQorKi8KKworLyohCisgICAgXGZuIHZvaWQgUVdlYlBhZ2U6OmxvYWRGaW5pc2hlZChib29sIG9r
KQorCisgICAgVGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuIHRoZSBwYWdlIGZpbmlzaGVzIGxv
YWRpbmcgY29udGVudC4gVGhpcyBzaWduYWwKKyAgICBpcyBpbmRlcGVuZGFudCBvZiBzY3JpcHQg
ZXhlY3V0aW9uIG9yIHBhZ2UgcmVuZGVyaW5nLgorICAgIFxhIG9rIHdpbGwgaW5kaWNhdGUgd2hl
dGhlciB0aGUgbG9hZCB3YXMgc3VjY2Vzc2Z1bCBvciBhbnkgZXJyb3Igb2NjdXJyZWQuCisKKyAg
ICBcc2EgbG9hZFN0YXJ0ZWQoKSwgRXJyb3JQYWdlRXh0ZW5zaW9uCisqLworCisvKiEKKyAgICBc
Zm4gdm9pZCBRV2ViUGFnZTo6bGlua0hvdmVyZWQoY29uc3QgUVN0cmluZyAmbGluaywgY29uc3Qg
UVN0cmluZyAmdGl0bGUsIGNvbnN0IFFTdHJpbmcgJnRleHRDb250ZW50KQorCisgICAgVGhpcyBz
aWduYWwgaXMgZW1pdHRlZCB3aGVuIHRoZSBtb3VzZSBob3ZlcnMgb3ZlciBhIGxpbmsuCisKKyAg
ICBcYSBsaW5rIGNvbnRhaW5zIHRoZSBsaW5rIHVybC4KKyAgICBcYSB0aXRsZSBpcyB0aGUgbGlu
ayBlbGVtZW50J3MgdGl0bGUsIGlmIGl0IGlzIHNwZWNpZmllZCBpbiB0aGUgbWFya3VwLgorICAg
IFxhIHRleHRDb250ZW50IHByb3ZpZGVzIHRleHQgd2l0aGluIHRoZSBsaW5rIGVsZW1lbnQsIGUu
Zy4sIHRleHQgaW5zaWRlIGFuIEhUTUwgYW5jaG9yIHRhZy4KKworICAgIFdoZW4gdGhlIG1vdXNl
IGxlYXZlcyB0aGUgbGluayBlbGVtZW50IHRoZSBzaWduYWwgaXMgZW1pdHRlZCB3aXRoIGVtcHR5
IHBhcmFtZXRlcnMuCisKKyAgICBcc2EgbGlua0NsaWNrZWQoKQorKi8KKworLyohCisgICAgXGZu
IHZvaWQgUVdlYlBhZ2U6OnN0YXR1c0Jhck1lc3NhZ2UoY29uc3QgUVN0cmluZyYgdGV4dCkKKwor
ICAgIFRoaXMgc2lnbmFsIGlzIGVtaXR0ZWQgd2hlbiB0aGUgc3RhdHVzYmFyIFxhIHRleHQgaXMg
Y2hhbmdlZCBieSB0aGUgcGFnZS4KKyovCisKKy8qIQorICAgIFxmbiB2b2lkIFFXZWJQYWdlOjpm
cmFtZUNyZWF0ZWQoUVdlYkZyYW1lICpmcmFtZSkKKworICAgIFRoaXMgc2lnbmFsIGlzIGVtaXR0
ZWQgd2hlbmV2ZXIgdGhlIHBhZ2UgY3JlYXRlcyBhIG5ldyBcYSBmcmFtZS4KKworICAgIFxzYSBj
dXJyZW50RnJhbWUoKQorKi8KKworLyohCisgICAgXGZuIHZvaWQgUVdlYlBhZ2U6OnNlbGVjdGlv
bkNoYW5nZWQoKQorCisgICAgVGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuZXZlciB0aGUgc2Vs
ZWN0aW9uIGNoYW5nZXMsIGVpdGhlciBpbnRlcmFjdGl2ZWx5CisgICAgb3IgcHJvZ3JhbW1hdGlj
YWxseSAoZS5nLiBieSBjYWxsaW5nIHRyaWdnZXJBY3Rpb24oKSB3aXRoIGEgc2VsZWN0aW9uIGFj
dGlvbikuCisKKyAgICBcc2Egc2VsZWN0ZWRUZXh0KCkKKyovCisKKy8qIQorICAgIFxmbiB2b2lk
IFFXZWJQYWdlOjpjb250ZW50c0NoYW5nZWQoKQorICAgIFxzaW5jZSA0LjUKKworICAgIFRoaXMg
c2lnbmFsIGlzIGVtaXR0ZWQgd2hlbmV2ZXIgdGhlIHRleHQgaW4gZm9ybSBlbGVtZW50cyBjaGFu
Z2VzCisgICAgYXMgd2VsbCBhcyBvdGhlciBlZGl0YWJsZSBjb250ZW50LgorCisgICAgXHNhIGNv
bnRlbnRFZGl0YWJsZSwgbW9kaWZpZWQsIFFXZWJGcmFtZTo6dG9IdG1sKCksIFFXZWJGcmFtZTo6
dG9QbGFpblRleHQoKQorKi8KKworLyohCisgICAgXGZuIHZvaWQgUVdlYlBhZ2U6Omdlb21ldHJ5
Q2hhbmdlUmVxdWVzdGVkKGNvbnN0IFFSZWN0JiBnZW9tKQorCisgICAgVGhpcyBzaWduYWwgaXMg
ZW1pdHRlZCB3aGVuZXZlciB0aGUgZG9jdW1lbnQgd2FudHMgdG8gY2hhbmdlIHRoZSBwb3NpdGlv
biBhbmQgc2l6ZSBvZiB0aGUKKyAgICBwYWdlIHRvIFxhIGdlb20uIFRoaXMgY2FuIGhhcHBlbiBm
b3IgZXhhbXBsZSB0aHJvdWdoIEphdmFTY3JpcHQuCisqLworCisvKiEKKyAgICBcZm4gdm9pZCBR
V2ViUGFnZTo6cmVwYWludFJlcXVlc3RlZChjb25zdCBRUmVjdCYgZGlydHlSZWN0KQorCisgICAg
VGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuZXZlciB0aGlzIFFXZWJQYWdlIHNob3VsZCBiZSB1
cGRhdGVkLiBJdCdzIHVzZWZ1bAorICAgIHdoZW4gcmVuZGVyaW5nIGEgUVdlYlBhZ2Ugd2l0aG91
dCBhIFFXZWJWaWV3IG9yIFFHcmFwaGljc1dlYlZpZXcuCisgICAgXGEgZGlydHlSZWN0IGNvbnRh
aW5zIHRoZSBhcmVhIHRoYXQgbmVlZHMgdG8gYmUgdXBkYXRlZC4gVG8gcGFpbnQgdGhlIFFXZWJQ
YWdlIGdldAorICAgIHRoZSBtYWluRnJhbWUoKSBhbmQgY2FsbCB0aGUgcmVuZGVyKFFQYWludGVy
KiwgY29uc3QgUVJlZ2lvbiYpIG1ldGhvZCB3aXRoIHRoZQorICAgIFxhIGRpcnR5UmVjdCBhcyB0
aGUgc2Vjb25kIHBhcmFtZXRlci4KKworICAgIFxzYSBtYWluRnJhbWUoKQorICAgIFxzYSB2aWV3
KCkKKyovCisKKy8qIQorICAgIFxmbiB2b2lkIFFXZWJQYWdlOjpzY3JvbGxSZXF1ZXN0ZWQoaW50
IGR4LCBpbnQgZHksIGNvbnN0IFFSZWN0JiByZWN0VG9TY3JvbGwpCisKKyAgICBUaGlzIHNpZ25h
bCBpcyBlbWl0dGVkIHdoZW5ldmVyIHRoZSBjb250ZW50IGdpdmVuIGJ5IFxhIHJlY3RUb1Njcm9s
bCBuZWVkcworICAgIHRvIGJlIHNjcm9sbGVkIFxhIGR4IGFuZCBcYSBkeSBkb3dud2FyZHMgYW5k
IG5vIHZpZXcgd2FzIHNldC4KKworICAgIFxzYSB2aWV3KCkKKyovCisKKy8qIQorICAgIFxmbiB2
b2lkIFFXZWJQYWdlOjp3aW5kb3dDbG9zZVJlcXVlc3RlZCgpCisKKyAgICBUaGlzIHNpZ25hbCBp
cyBlbWl0dGVkIHdoZW5ldmVyIHRoZSBwYWdlIHJlcXVlc3RzIHRoZSB3ZWIgYnJvd3NlciB3aW5k
b3cgdG8gYmUgY2xvc2VkLAorICAgIGZvciBleGFtcGxlIHRocm91Z2ggdGhlIEphdmFTY3JpcHQg
XGN7d2luZG93LmNsb3NlKCl9IGNhbGwuCisqLworCisvKiEKKyAgICBcZm4gdm9pZCBRV2ViUGFn
ZTo6cHJpbnRSZXF1ZXN0ZWQoUVdlYkZyYW1lICpmcmFtZSkKKworICAgIFRoaXMgc2lnbmFsIGlz
IGVtaXR0ZWQgd2hlbmV2ZXIgdGhlIHBhZ2UgcmVxdWVzdHMgdGhlIHdlYiBicm93c2VyIHRvIHBy
aW50IFxhIGZyYW1lLAorICAgIGZvciBleGFtcGxlIHRocm91Z2ggdGhlIEphdmFTY3JpcHQgXGN7
d2luZG93LnByaW50KCl9IGNhbGwuCisKKyAgICBcc2EgUVdlYkZyYW1lOjpwcmludCgpLCBRUHJp
bnRQcmV2aWV3RGlhbG9nCisqLworCisvKiEKKyAgICBcZm4gdm9pZCBRV2ViUGFnZTo6dW5zdXBw
b3J0ZWRDb250ZW50KFFOZXR3b3JrUmVwbHkgKnJlcGx5KQorCisgICAgVGhpcyBzaWduYWwgaXMg
ZW1pdHRlZCB3aGVuIFdlYktpdCBjYW5ub3QgaGFuZGxlIGEgbGluayB0aGUgdXNlciBuYXZpZ2F0
ZWQgdG8gb3IgYQorICAgIHdlYiBzZXJ2ZXIncyByZXNwb25zZSBpbmNsdWRlcyBhICJDb250ZW50
LURpc3Bvc2l0aW9uIiBoZWFkZXIgd2l0aCB0aGUgJ2F0dGFjaG1lbnQnIAorICAgIGRpcmVjdGl2
ZS4gSWYgIkNvbnRlbnQtRGlzcG9zaXRpb24iIGlzIHByZXNlbnQgaW4gXGEgcmVwbHksIHRoZSB3
ZWIgc2VydmVyIGlzIGluZGljYXRpbmcKKyAgICB0aGF0IHRoZSBjbGllbnQgc2hvdWxkIHByb21w
dCB0aGUgdXNlciB0byBzYXZlIHRoZSBjb250ZW50IHJlZ2FyZGxlc3Mgb2YgY29udGVudC10eXBl
LiAKKyAgICBTZWUgUkZDIDI2MTYgc2VjdGlvbnMgMTkuNS4xIGZvciBkZXRhaWxzIGFib3V0IENv
bnRlbnQtRGlzcG9zaXRpb24uCisKKyAgICBBdCBzaWduYWwgZW1pc3Npb24gdGltZSB0aGUgbWV0
YS1kYXRhIG9mIHRoZSBRTmV0d29ya1JlcGx5IFxhIHJlcGx5IGlzIGF2YWlsYWJsZS4KKworICAg
IFxub3RlIFRoZSByZWNlaXZpbmcgc2xvdCBpcyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcgdGhl
IFFOZXR3b3JrUmVwbHkgXGEgcmVwbHkuCisKKyAgICBcbm90ZSBUaGlzIHNpZ25hbCBpcyBvbmx5
IGVtaXR0ZWQgaWYgdGhlIGZvcndhcmRVbnN1cHBvcnRlZENvbnRlbnQgcHJvcGVydHkgaXMgc2V0
IHRvIHRydWUuCisKKyAgICBcc2EgZG93bmxvYWRSZXF1ZXN0ZWQoKQorKi8KKworLyohCisgICAg
XGZuIHZvaWQgUVdlYlBhZ2U6OmRvd25sb2FkUmVxdWVzdGVkKGNvbnN0IFFOZXR3b3JrUmVxdWVz
dCAmcmVxdWVzdCkKKworICAgIFRoaXMgc2lnbmFsIGlzIGVtaXR0ZWQgd2hlbiB0aGUgdXNlciBk
ZWNpZGVzIHRvIGRvd25sb2FkIGEgbGluay4gVGhlIHVybCBvZgorICAgIHRoZSBsaW5rIGFzIHdl
bGwgYXMgYWRkaXRpb25hbCBtZXRhLWluZm9ybWF0aW9uIGlzIGNvbnRhaW5lZCBpbiBcYSByZXF1
ZXN0LgorCisgICAgXHNhIHVuc3VwcG9ydGVkQ29udGVudCgpCisqLworCisvKiEKKyAgICBcZm4g
dm9pZCBRV2ViUGFnZTo6bWljcm9Gb2N1c0NoYW5nZWQoKQorCisgICAgVGhpcyBzaWduYWwgaXMg
ZW1pdHRlZCB3aGVuIGZvciBleGFtcGxlIHRoZSBwb3NpdGlvbiBvZiB0aGUgY3Vyc29yIGluIGFu
IGVkaXRhYmxlIGZvcm0KKyAgICBlbGVtZW50IGNoYW5nZXMuIEl0IGlzIHVzZWQgdG8gaW5mb3Jt
IGlucHV0IG1ldGhvZHMgYWJvdXQgdGhlIG5ldyBvbi1zY3JlZW4gcG9zaXRpb24gd2hlcmUKKyAg
ICB0aGUgdXNlciBpcyBhYmxlIHRvIGVudGVyIHRleHQuIFRoaXMgc2lnbmFsIGlzIHVzdWFsbHkg
Y29ubmVjdGVkIHRvIHRoZQorICAgIFFXaWRnZXQ6OnVwZGF0ZU1pY3JvRm9jdXMoKSBzbG90Lgor
Ki8KKworLyohCisgICAgXGZuIHZvaWQgUVdlYlBhZ2U6OmxpbmtDbGlja2VkKGNvbnN0IFFVcmwg
JnVybCkKKworICAgIFRoaXMgc2lnbmFsIGlzIGVtaXR0ZWQgd2hlbmV2ZXIgdGhlIHVzZXIgY2xp
Y2tzIG9uIGEgbGluayBhbmQgdGhlIHBhZ2UncyBsaW5rRGVsZWdhdGlvblBvbGljeQorICAgIHBy
b3BlcnR5IGlzIHNldCB0byBkZWxlZ2F0ZSB0aGUgbGluayBoYW5kbGluZyBmb3IgdGhlIHNwZWNp
ZmllZCBcYSB1cmwuCisKKyAgICBCeSBkZWZhdWx0IG5vIGxpbmtzIGFyZSBkZWxlZ2F0ZWQgYW5k
IGFyZSBoYW5kbGVkIGJ5IFFXZWJQYWdlIGluc3RlYWQuCisKKyAgICBcbm90ZSBUaGlzIHNpZ25h
bCBwb3NzaWJseSB3b24ndCBiZSBlbWl0dGVkIGZvciBjbGlja2VkIGxpbmtzIHdoaWNoIHVzZQor
ICAgIEphdmFTY3JpcHQgdG8gdHJpZ2dlciBuYXZpZ2F0aW9uLgorCisgICAgXHNhIGxpbmtIb3Zl
cmVkKCkKKyovCisKKy8qIQorICAgIFxmbiB2b2lkIFFXZWJQYWdlOjp0b29sQmFyVmlzaWJpbGl0
eUNoYW5nZVJlcXVlc3RlZChib29sIHZpc2libGUpCisKKyAgICBUaGlzIHNpZ25hbCBpcyBlbWl0
dGVkIHdoZW5ldmVyIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSB0b29sYmFyIGluIGEgd2ViIGJyb3dz
ZXIKKyAgICB3aW5kb3cgdGhhdCBob3N0cyBRV2ViUGFnZSBzaG91bGQgYmUgY2hhbmdlZCB0byBc
YSB2aXNpYmxlLgorKi8KKworLyohCisgICAgXGZuIHZvaWQgUVdlYlBhZ2U6OnN0YXR1c0JhclZp
c2liaWxpdHlDaGFuZ2VSZXF1ZXN0ZWQoYm9vbCB2aXNpYmxlKQorCisgICAgVGhpcyBzaWduYWwg
aXMgZW1pdHRlZCB3aGVuZXZlciB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgc3RhdHVzYmFyIGluIGEg
d2ViIGJyb3dzZXIKKyAgICB3aW5kb3cgdGhhdCBob3N0cyBRV2ViUGFnZSBzaG91bGQgYmUgY2hh
bmdlZCB0byBcYSB2aXNpYmxlLgorKi8KKworLyohCisgICAgXGZuIHZvaWQgUVdlYlBhZ2U6Om1l
bnVCYXJWaXNpYmlsaXR5Q2hhbmdlUmVxdWVzdGVkKGJvb2wgdmlzaWJsZSkKKworICAgIFRoaXMg
c2lnbmFsIGlzIGVtaXR0ZWQgd2hlbmV2ZXIgdGhlIHZpc2liaWxpdHkgb2YgdGhlIG1lbnViYXIg
aW4gYSB3ZWIgYnJvd3NlcgorICAgIHdpbmRvdyB0aGF0IGhvc3RzIFFXZWJQYWdlIHNob3VsZCBi
ZSBjaGFuZ2VkIHRvIFxhIHZpc2libGUuCisqLworCisvKiEKKyAgICBcZm4gdm9pZCBRV2ViUGFn
ZTo6ZGF0YWJhc2VRdW90YUV4Y2VlZGVkKFFXZWJGcmFtZSogZnJhbWUsIFFTdHJpbmcgZGF0YWJh
c2VOYW1lKTsKKyAgICBcc2luY2UgNC41CisKKyAgICBUaGlzIHNpZ25hbCBpcyBlbWl0dGVkIHdo
ZW5ldmVyIHRoZSB3ZWIgc2l0ZSBzaG93biBpbiBcYSBmcmFtZSBpcyBhc2tpbmcgdG8gc3RvcmUg
ZGF0YQorICAgIHRvIHRoZSBkYXRhYmFzZSBcYSBkYXRhYmFzZU5hbWUgYW5kIHRoZSBxdW90YSBh
bGxvY2F0ZWQgdG8gdGhhdCB3ZWIgc2l0ZSBpcyBleGNlZWRlZC4KKworICAgIFxzYSBRV2ViRGF0
YWJhc2UKKyovCisvKiEKKyAgICBcZm4gdm9pZCBRV2ViUGFnZTo6YXBwbGljYXRpb25DYWNoZVF1
b3RhRXhjZWVkZWQoUVdlYlNlY3VyaXR5T3JpZ2luKiBvcmlnaW4sIHF1aW50NjQgZGVmYXVsdE9y
aWdpblF1b3RhLCBxdWludDY0IHRvdGFsU3BhY2VOZWVkZWQpOworCisgICAgVGhpcyBzaWduYWwg
aXMgZW1pdHRlZCB3aGVuZXZlciB0aGUgd2ViIHNpdGUgaXMgYXNraW5nIHRvIHN0b3JlIGRhdGEg
dG8gdGhlIGFwcGxpY2F0aW9uIGNhY2hlCisgICAgZGF0YWJhc2UgZGF0YWJhc2VOYW1lIGFuZCB0
aGUgcXVvdGEgYWxsb2NhdGVkIHRvIHRoYXQgd2ViIHNpdGUgaXMgZXhjZWVkZWQuCisKKyovCisK
Ky8qIQorICBcc2luY2UgNC41CisgIFxmbiB2b2lkIFFXZWJQYWdlOjpzYXZlRnJhbWVTdGF0ZVJl
cXVlc3RlZChRV2ViRnJhbWUqIGZyYW1lLCBRV2ViSGlzdG9yeUl0ZW0qIGl0ZW0pOworCisgIFRo
aXMgc2lnbmFsIGlzIGVtaXR0ZWQgc2hvcnRseSBiZWZvcmUgdGhlIGhpc3Rvcnkgb2YgbmF2aWdh
dGVkIHBhZ2VzCisgIGluIFxhIGZyYW1lIGlzIGNoYW5nZWQsIGZvciBleGFtcGxlIHdoZW4gbmF2
aWdhdGluZyBiYWNrIGluIHRoZSBoaXN0b3J5LgorCisgIFRoZSBwcm92aWRlZCBRV2ViSGlzdG9y
eUl0ZW0sIFxhIGl0ZW0sIGhvbGRzIHRoZSBoaXN0b3J5IGVudHJ5IG9mIHRoZSBmcmFtZSBiZWZv
cmUKKyAgdGhlIGNoYW5nZS4KKworICBBIHBvdGVudGlhbCB1c2UtY2FzZSBmb3IgdGhpcyBzaWdu
YWwgaXMgdG8gc3RvcmUgY3VzdG9tIGRhdGEgaW4KKyAgdGhlIFFXZWJIaXN0b3J5SXRlbSBhc3Nv
Y2lhdGVkIHRvIHRoZSBmcmFtZSwgdXNpbmcgUVdlYkhpc3RvcnlJdGVtOjpzZXRVc2VyRGF0YSgp
LgorKi8KKworLyohCisgIFxzaW5jZSA0LjUKKyAgXGZuIHZvaWQgUVdlYlBhZ2U6OnJlc3RvcmVG
cmFtZVN0YXRlUmVxdWVzdGVkKFFXZWJGcmFtZSogZnJhbWUpOworCisgIFRoaXMgc2lnbmFsIGlz
IGVtaXR0ZWQgd2hlbiB0aGUgbG9hZCBvZiBcYSBmcmFtZSBpcyBmaW5pc2hlZCBhbmQgdGhlIGFw
cGxpY2F0aW9uIG1heSBub3cgdXBkYXRlIGl0cyBzdGF0ZSBhY2NvcmRpbmdseS4KKyovCisKKy8q
IQorICBcZm4gUVdlYlBhZ2VQcml2YXRlKiBRV2ViUGFnZTo6aGFuZGxlKCkgY29uc3QKKyAgXGlu
dGVybmFsCisqLworCisjaW5jbHVkZSAibW9jX3F3ZWJwYWdlLmNwcCIKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJLaXQvcXQvV2lkZ2V0QXBpL3F3ZWJwYWdlLmggYi9Tb3VyY2UvV2ViS2l0L3F0L1dp
ZGdldEFwaS9xd2VicGFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmI5ZDA2YjgyYTI2ZDYyNzcwMGVhZmFmMDhk
NTQzNzlhY2NiNTZlYTIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdl
dEFwaS9xd2VicGFnZS5oCkBAIC0wLDAgKzEsNDQ4IEBACisvKgorICAgIENvcHlyaWdodCAoQykg
MjAwOCBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykKKyAgICBD
b3B5cmlnaHQgKEMpIDIwMDcgU3RhaWtvcyBDb21wdXRpbmcgU2VydmljZXMgSW5jLgorCisgICAg
VGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu
ZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdh
cmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAo
YXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlz
IGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0
IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkg
b2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP
U0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3Ig
bW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0
aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhp
cyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisg
ICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0
LCBGaWZ0aCBGbG9vciwKKyAgICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyovCisKKyNp
Zm5kZWYgUVdFQlBBR0VfSAorI2RlZmluZSBRV0VCUEFHRV9ICisKKyNpbmNsdWRlICJxd2Vic2V0
dGluZ3MuaCIKKyNpbmNsdWRlICJxd2Via2l0Z2xvYmFsLmgiCisKKyNpbmNsdWRlIDxRdENvcmUv
cW9iamVjdC5oPgorI2luY2x1ZGUgPFF0Q29yZS9xdXJsLmg+CisjaW5jbHVkZSA8UXRXaWRnZXRz
L3F3aWRnZXQuaD4KKworUVRfQkVHSU5fTkFNRVNQQUNFCitjbGFzcyBRTmV0d29ya1Byb3h5Owor
Y2xhc3MgUVVuZG9TdGFjazsKK2NsYXNzIFFNZW51OworY2xhc3MgUU5ldHdvcmtSZXF1ZXN0Owor
Y2xhc3MgUU5ldHdvcmtSZXBseTsKK2NsYXNzIFFOZXR3b3JrQWNjZXNzTWFuYWdlcjsKK1FUX0VO
RF9OQU1FU1BBQ0UKKworY2xhc3MgUVdlYkVsZW1lbnQ7CitjbGFzcyBRV2ViRnJhbWU7CitjbGFz
cyBRV2ViTmV0d29ya1JlcXVlc3Q7CitjbGFzcyBRV2ViSGlzdG9yeTsKKworY2xhc3MgUVdlYkZy
YW1lRGF0YTsKK2NsYXNzIFFXZWJIaXN0b3J5SXRlbTsKK2NsYXNzIFFXZWJIaXRUZXN0UmVzdWx0
OworY2xhc3MgUVdlYk5ldHdvcmtJbnRlcmZhY2U7CitjbGFzcyBRV2ViUGFnZUFkYXB0ZXI7Citj
bGFzcyBRV2ViUGFnZVByaXZhdGU7CitjbGFzcyBRV2ViUGx1Z2luRmFjdG9yeTsKK2NsYXNzIFFX
ZWJTZWN1cml0eU9yaWdpbjsKK2NsYXNzIFF0Vmlld3BvcnRBdHRyaWJ1dGVzUHJpdmF0ZTsKKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworICAgIGNsYXNzIENocm9tZUNsaWVudFF0OworICAgIGNsYXNz
IEVkaXRvckNsaWVudFF0OworICAgIGNsYXNzIEZyYW1lTG9hZGVyQ2xpZW50UXQ7CisgICAgY2xh
c3MgSW5zcGVjdG9yQ2xpZW50UXQ7CisgICAgY2xhc3MgSW5zcGVjdG9yU2VydmVyUmVxdWVzdEhh
bmRsZXJRdDsKKyAgICBjbGFzcyBJbnNwZWN0b3JGcm9udGVuZENsaWVudFF0OworICAgIGNsYXNz
IFJlc291cmNlSGFuZGxlOworICAgIGNsYXNzIFFOZXR3b3JrUmVwbHlIYW5kbGVyOworCisgICAg
c3RydWN0IEZyYW1lTG9hZFJlcXVlc3Q7Cit9CisKK2NsYXNzIFFXRUJLSVRfRVhQT1JUIFFXZWJQ
YWdlIDogcHVibGljIFFPYmplY3QgeworICAgIFFfT0JKRUNUCisKKyAgICBRX1BST1BFUlRZKGJv
b2wgbW9kaWZpZWQgUkVBRCBpc01vZGlmaWVkKQorICAgIFFfUFJPUEVSVFkoUVN0cmluZyBzZWxl
Y3RlZFRleHQgUkVBRCBzZWxlY3RlZFRleHQpCisgICAgUV9QUk9QRVJUWShRU3RyaW5nIHNlbGVj
dGVkSHRtbCBSRUFEIHNlbGVjdGVkSHRtbCkKKyAgICBRX1BST1BFUlRZKGJvb2wgaGFzU2VsZWN0
aW9uIFJFQUQgaGFzU2VsZWN0aW9uKQorICAgIFFfUFJPUEVSVFkoUVNpemUgdmlld3BvcnRTaXpl
IFJFQUQgdmlld3BvcnRTaXplIFdSSVRFIHNldFZpZXdwb3J0U2l6ZSkKKyAgICBRX1BST1BFUlRZ
KFFTaXplIHByZWZlcnJlZENvbnRlbnRzU2l6ZSBSRUFEIHByZWZlcnJlZENvbnRlbnRzU2l6ZSBX
UklURSBzZXRQcmVmZXJyZWRDb250ZW50c1NpemUpCisgICAgUV9QUk9QRVJUWShib29sIGZvcndh
cmRVbnN1cHBvcnRlZENvbnRlbnQgUkVBRCBmb3J3YXJkVW5zdXBwb3J0ZWRDb250ZW50IFdSSVRF
IHNldEZvcndhcmRVbnN1cHBvcnRlZENvbnRlbnQpCisgICAgUV9QUk9QRVJUWShMaW5rRGVsZWdh
dGlvblBvbGljeSBsaW5rRGVsZWdhdGlvblBvbGljeSBSRUFEIGxpbmtEZWxlZ2F0aW9uUG9saWN5
IFdSSVRFIHNldExpbmtEZWxlZ2F0aW9uUG9saWN5KQorICAgIFFfUFJPUEVSVFkoUVBhbGV0dGUg
cGFsZXR0ZSBSRUFEIHBhbGV0dGUgV1JJVEUgc2V0UGFsZXR0ZSkKKyAgICBRX1BST1BFUlRZKGJv
b2wgY29udGVudEVkaXRhYmxlIFJFQUQgaXNDb250ZW50RWRpdGFibGUgV1JJVEUgc2V0Q29udGVu
dEVkaXRhYmxlKQorICAgIFFfRU5VTVMoTGlua0RlbGVnYXRpb25Qb2xpY3kgTmF2aWdhdGlvblR5
cGUgV2ViQWN0aW9uKQorcHVibGljOgorICAgIGVudW0gTmF2aWdhdGlvblR5cGUgeworICAgICAg
ICBOYXZpZ2F0aW9uVHlwZUxpbmtDbGlja2VkLAorICAgICAgICBOYXZpZ2F0aW9uVHlwZUZvcm1T
dWJtaXR0ZWQsCisgICAgICAgIE5hdmlnYXRpb25UeXBlQmFja09yRm9yd2FyZCwKKyAgICAgICAg
TmF2aWdhdGlvblR5cGVSZWxvYWQsCisgICAgICAgIE5hdmlnYXRpb25UeXBlRm9ybVJlc3VibWl0
dGVkLAorICAgICAgICBOYXZpZ2F0aW9uVHlwZU90aGVyCisgICAgfTsKKworICAgIGVudW0gV2Vi
QWN0aW9uIHsKKyAgICAgICAgTm9XZWJBY3Rpb24gPSAtIDEsCisKKyAgICAgICAgT3Blbkxpbmss
CisKKyAgICAgICAgT3BlbkxpbmtJbk5ld1dpbmRvdywKKyAgICAgICAgT3BlbkZyYW1lSW5OZXdX
aW5kb3csCisKKyAgICAgICAgRG93bmxvYWRMaW5rVG9EaXNrLAorICAgICAgICBDb3B5TGlua1Rv
Q2xpcGJvYXJkLAorCisgICAgICAgIE9wZW5JbWFnZUluTmV3V2luZG93LAorICAgICAgICBEb3du
bG9hZEltYWdlVG9EaXNrLAorICAgICAgICBDb3B5SW1hZ2VUb0NsaXBib2FyZCwKKworICAgICAg
ICBCYWNrLAorICAgICAgICBGb3J3YXJkLAorICAgICAgICBTdG9wLAorICAgICAgICBSZWxvYWQs
CisKKyAgICAgICAgQ3V0LAorICAgICAgICBDb3B5LAorICAgICAgICBQYXN0ZSwKKworICAgICAg
ICBVbmRvLAorICAgICAgICBSZWRvLAorICAgICAgICBNb3ZlVG9OZXh0Q2hhciwKKyAgICAgICAg
TW92ZVRvUHJldmlvdXNDaGFyLAorICAgICAgICBNb3ZlVG9OZXh0V29yZCwKKyAgICAgICAgTW92
ZVRvUHJldmlvdXNXb3JkLAorICAgICAgICBNb3ZlVG9OZXh0TGluZSwKKyAgICAgICAgTW92ZVRv
UHJldmlvdXNMaW5lLAorICAgICAgICBNb3ZlVG9TdGFydE9mTGluZSwKKyAgICAgICAgTW92ZVRv
RW5kT2ZMaW5lLAorICAgICAgICBNb3ZlVG9TdGFydE9mQmxvY2ssCisgICAgICAgIE1vdmVUb0Vu
ZE9mQmxvY2ssCisgICAgICAgIE1vdmVUb1N0YXJ0T2ZEb2N1bWVudCwKKyAgICAgICAgTW92ZVRv
RW5kT2ZEb2N1bWVudCwKKyAgICAgICAgU2VsZWN0TmV4dENoYXIsCisgICAgICAgIFNlbGVjdFBy
ZXZpb3VzQ2hhciwKKyAgICAgICAgU2VsZWN0TmV4dFdvcmQsCisgICAgICAgIFNlbGVjdFByZXZp
b3VzV29yZCwKKyAgICAgICAgU2VsZWN0TmV4dExpbmUsCisgICAgICAgIFNlbGVjdFByZXZpb3Vz
TGluZSwKKyAgICAgICAgU2VsZWN0U3RhcnRPZkxpbmUsCisgICAgICAgIFNlbGVjdEVuZE9mTGlu
ZSwKKyAgICAgICAgU2VsZWN0U3RhcnRPZkJsb2NrLAorICAgICAgICBTZWxlY3RFbmRPZkJsb2Nr
LAorICAgICAgICBTZWxlY3RTdGFydE9mRG9jdW1lbnQsCisgICAgICAgIFNlbGVjdEVuZE9mRG9j
dW1lbnQsCisgICAgICAgIERlbGV0ZVN0YXJ0T2ZXb3JkLAorICAgICAgICBEZWxldGVFbmRPZldv
cmQsCisKKyAgICAgICAgU2V0VGV4dERpcmVjdGlvbkRlZmF1bHQsCisgICAgICAgIFNldFRleHRE
aXJlY3Rpb25MZWZ0VG9SaWdodCwKKyAgICAgICAgU2V0VGV4dERpcmVjdGlvblJpZ2h0VG9MZWZ0
LAorCisgICAgICAgIFRvZ2dsZUJvbGQsCisgICAgICAgIFRvZ2dsZUl0YWxpYywKKyAgICAgICAg
VG9nZ2xlVW5kZXJsaW5lLAorCisgICAgICAgIEluc3BlY3RFbGVtZW50LAorCisgICAgICAgIElu
c2VydFBhcmFncmFwaFNlcGFyYXRvciwKKyAgICAgICAgSW5zZXJ0TGluZVNlcGFyYXRvciwKKwor
ICAgICAgICBTZWxlY3RBbGwsCisgICAgICAgIFJlbG9hZEFuZEJ5cGFzc0NhY2hlLAorCisgICAg
ICAgIFBhc3RlQW5kTWF0Y2hTdHlsZSwKKyAgICAgICAgUmVtb3ZlRm9ybWF0LAorCisgICAgICAg
IFRvZ2dsZVN0cmlrZXRocm91Z2gsCisgICAgICAgIFRvZ2dsZVN1YnNjcmlwdCwKKyAgICAgICAg
VG9nZ2xlU3VwZXJzY3JpcHQsCisgICAgICAgIEluc2VydFVub3JkZXJlZExpc3QsCisgICAgICAg
IEluc2VydE9yZGVyZWRMaXN0LAorICAgICAgICBJbmRlbnQsCisgICAgICAgIE91dGRlbnQsCisK
KyAgICAgICAgQWxpZ25DZW50ZXIsCisgICAgICAgIEFsaWduSnVzdGlmaWVkLAorICAgICAgICBB
bGlnbkxlZnQsCisgICAgICAgIEFsaWduUmlnaHQsCisKKyAgICAgICAgU3RvcFNjaGVkdWxlZFBh
Z2VSZWZyZXNoLAorCisgICAgICAgIENvcHlJbWFnZVVybFRvQ2xpcGJvYXJkLAorCisgICAgICAg
IE9wZW5MaW5rSW5UaGlzV2luZG93LAorCisgICAgICAgIFdlYkFjdGlvbkNvdW50CisgICAgfTsK
KworICAgIGVudW0gRmluZEZsYWcgeworICAgICAgICBGaW5kQmFja3dhcmQgPSAxLAorICAgICAg
ICBGaW5kQ2FzZVNlbnNpdGl2ZWx5ID0gMiwKKyAgICAgICAgRmluZFdyYXBzQXJvdW5kRG9jdW1l
bnQgPSA0LAorICAgICAgICBIaWdobGlnaHRBbGxPY2N1cnJlbmNlcyA9IDgKKyAgICB9OworICAg
IFFfREVDTEFSRV9GTEFHUyhGaW5kRmxhZ3MsIEZpbmRGbGFnKQorCisgICAgZW51bSBMaW5rRGVs
ZWdhdGlvblBvbGljeSB7CisgICAgICAgIERvbnREZWxlZ2F0ZUxpbmtzLAorICAgICAgICBEZWxl
Z2F0ZUV4dGVybmFsTGlua3MsCisgICAgICAgIERlbGVnYXRlQWxsTGlua3MKKyAgICB9OworCisg
ICAgZW51bSBXZWJXaW5kb3dUeXBlIHsKKyAgICAgICAgV2ViQnJvd3NlcldpbmRvdywKKyAgICAg
ICAgV2ViTW9kYWxEaWFsb2cKKyAgICB9OworCisgICAgZW51bSBQZXJtaXNzaW9uUG9saWN5IHsK
KyAgICAgICAgUGVybWlzc2lvblVua25vd24sCisgICAgICAgIFBlcm1pc3Npb25HcmFudGVkQnlV
c2VyLAorICAgICAgICBQZXJtaXNzaW9uRGVuaWVkQnlVc2VyCisgICAgfTsKKworICAgIGVudW0g
RmVhdHVyZSB7CisgICAgICAgIE5vdGlmaWNhdGlvbnMsCisgICAgICAgIEdlb2xvY2F0aW9uCisg
ICAgfTsKKworICAgIGNsYXNzIFFXRUJLSVRfRVhQT1JUIFZpZXdwb3J0QXR0cmlidXRlcyB7Cisg
ICAgcHVibGljOgorICAgICAgICBWaWV3cG9ydEF0dHJpYnV0ZXMoKTsKKyAgICAgICAgVmlld3Bv
cnRBdHRyaWJ1dGVzKGNvbnN0IFFXZWJQYWdlOjpWaWV3cG9ydEF0dHJpYnV0ZXMmIG90aGVyKTsK
KworICAgICAgICB+Vmlld3BvcnRBdHRyaWJ1dGVzKCk7CisKKyAgICAgICAgUVdlYlBhZ2U6OlZp
ZXdwb3J0QXR0cmlidXRlcyYgb3BlcmF0b3I9KGNvbnN0IFFXZWJQYWdlOjpWaWV3cG9ydEF0dHJp
YnV0ZXMmIG90aGVyKTsKKworICAgICAgICBpbmxpbmUgcXJlYWwgaW5pdGlhbFNjYWxlRmFjdG9y
KCkgY29uc3QgeyByZXR1cm4gbV9pbml0aWFsU2NhbGVGYWN0b3I7IH0KKyAgICAgICAgaW5saW5l
IHFyZWFsIG1pbmltdW1TY2FsZUZhY3RvcigpIGNvbnN0IHsgcmV0dXJuIG1fbWluaW11bVNjYWxl
RmFjdG9yOyB9CisgICAgICAgIGlubGluZSBxcmVhbCBtYXhpbXVtU2NhbGVGYWN0b3IoKSBjb25z
dCB7IHJldHVybiBtX21heGltdW1TY2FsZUZhY3RvcjsgfQorICAgICAgICBpbmxpbmUgcXJlYWwg
ZGV2aWNlUGl4ZWxSYXRpbygpIGNvbnN0IHsgcmV0dXJuIG1fZGV2aWNlUGl4ZWxSYXRpbzsgfQor
ICAgICAgICBpbmxpbmUgYm9vbCBpc1VzZXJTY2FsYWJsZSgpIGNvbnN0IHsgcmV0dXJuIG1faXNV
c2VyU2NhbGFibGU7IH0KKyAgICAgICAgaW5saW5lIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0
dXJuIG1faXNWYWxpZDsgfQorICAgICAgICBpbmxpbmUgUVNpemVGIHNpemUoKSBjb25zdCB7IHJl
dHVybiBtX3NpemU7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFFTaGFyZWREYXRhUG9pbnRl
cjxRdFZpZXdwb3J0QXR0cmlidXRlc1ByaXZhdGU+IGQ7CisgICAgICAgIHFyZWFsIG1faW5pdGlh
bFNjYWxlRmFjdG9yOworICAgICAgICBxcmVhbCBtX21pbmltdW1TY2FsZUZhY3RvcjsKKyAgICAg
ICAgcXJlYWwgbV9tYXhpbXVtU2NhbGVGYWN0b3I7CisgICAgICAgIHFyZWFsIG1fZGV2aWNlUGl4
ZWxSYXRpbzsKKyAgICAgICAgYm9vbCBtX2lzVXNlclNjYWxhYmxlOworICAgICAgICBib29sIG1f
aXNWYWxpZDsKKyAgICAgICAgUVNpemVGIG1fc2l6ZTsKKworICAgICAgICBmcmllbmQgY2xhc3Mg
V2ViQ29yZTo6Q2hyb21lQ2xpZW50UXQ7CisgICAgICAgIGZyaWVuZCBjbGFzcyBRV2ViUGFnZTsK
KyAgICB9OworCisKKyAgICBleHBsaWNpdCBRV2ViUGFnZShRT2JqZWN0ICpwYXJlbnQgPSAwKTsK
KyAgICB+UVdlYlBhZ2UoKTsKKworICAgIFFXZWJGcmFtZSAqbWFpbkZyYW1lKCkgY29uc3Q7Cisg
ICAgUVdlYkZyYW1lICpjdXJyZW50RnJhbWUoKSBjb25zdDsKKyAgICBRV2ViRnJhbWUqIGZyYW1l
QXQoY29uc3QgUVBvaW50JiBwb3MpIGNvbnN0OworCisgICAgUVdlYkhpc3RvcnkgKmhpc3Rvcnko
KSBjb25zdDsKKyAgICBRV2ViU2V0dGluZ3MgKnNldHRpbmdzKCkgY29uc3Q7CisKKyAgICB2b2lk
IHNldFZpZXcoUVdpZGdldCAqdmlldyk7CisgICAgUVdpZGdldCAqdmlldygpIGNvbnN0OworCisg
ICAgYm9vbCBpc01vZGlmaWVkKCkgY29uc3Q7CisjaWZuZGVmIFFUX05PX1VORE9TVEFDSworICAg
IFFVbmRvU3RhY2sgKnVuZG9TdGFjaygpIGNvbnN0OworI2VuZGlmCisKKyAgICB2b2lkIHNldE5l
dHdvcmtBY2Nlc3NNYW5hZ2VyKFFOZXR3b3JrQWNjZXNzTWFuYWdlciAqbWFuYWdlcik7CisgICAg
UU5ldHdvcmtBY2Nlc3NNYW5hZ2VyICpuZXR3b3JrQWNjZXNzTWFuYWdlcigpIGNvbnN0OworCisg
ICAgdm9pZCBzZXRQbHVnaW5GYWN0b3J5KFFXZWJQbHVnaW5GYWN0b3J5ICpmYWN0b3J5KTsKKyAg
ICBRV2ViUGx1Z2luRmFjdG9yeSAqcGx1Z2luRmFjdG9yeSgpIGNvbnN0OworCisgICAgcXVpbnQ2
NCB0b3RhbEJ5dGVzKCkgY29uc3Q7CisgICAgcXVpbnQ2NCBieXRlc1JlY2VpdmVkKCkgY29uc3Q7
CisKKyAgICBib29sIGhhc1NlbGVjdGlvbigpIGNvbnN0OworICAgIFFTdHJpbmcgc2VsZWN0ZWRU
ZXh0KCkgY29uc3Q7CisgICAgUVN0cmluZyBzZWxlY3RlZEh0bWwoKSBjb25zdDsKKworI2lmbmRl
ZiBRVF9OT19BQ1RJT04KKyAgICBRQWN0aW9uICphY3Rpb24oV2ViQWN0aW9uIGFjdGlvbikgY29u
c3Q7CisjZW5kaWYKKyAgICB2aXJ0dWFsIHZvaWQgdHJpZ2dlckFjdGlvbihXZWJBY3Rpb24gYWN0
aW9uLCBib29sIGNoZWNrZWQgPSBmYWxzZSk7CisKKyAgICBRU2l6ZSB2aWV3cG9ydFNpemUoKSBj
b25zdDsKKyAgICB2b2lkIHNldFZpZXdwb3J0U2l6ZShjb25zdCBRU2l6ZSAmc2l6ZSkgY29uc3Q7
CisgICAgVmlld3BvcnRBdHRyaWJ1dGVzIHZpZXdwb3J0QXR0cmlidXRlc0ZvclNpemUoY29uc3Qg
UVNpemUmIGF2YWlsYWJsZVNpemUpIGNvbnN0OworCisgICAgUVNpemUgcHJlZmVycmVkQ29udGVu
dHNTaXplKCkgY29uc3Q7CisgICAgdm9pZCBzZXRQcmVmZXJyZWRDb250ZW50c1NpemUoY29uc3Qg
UVNpemUgJnNpemUpIGNvbnN0OworICAgIHZvaWQgc2V0QWN0dWFsVmlzaWJsZUNvbnRlbnRSZWN0
KGNvbnN0IFFSZWN0JiByZWN0KSBjb25zdDsKKworICAgIHZpcnR1YWwgYm9vbCBldmVudChRRXZl
bnQqKTsKKyAgICBib29sIGZvY3VzTmV4dFByZXZDaGlsZChib29sIG5leHQpOworCisgICAgUVZh
cmlhbnQgaW5wdXRNZXRob2RRdWVyeShRdDo6SW5wdXRNZXRob2RRdWVyeSBwcm9wZXJ0eSkgY29u
c3Q7CisKKyAgICBib29sIGZpbmRUZXh0KGNvbnN0IFFTdHJpbmcgJnN1YlN0cmluZywgRmluZEZs
YWdzIG9wdGlvbnMgPSAwKTsKKworICAgIHZvaWQgc2V0Rm9yd2FyZFVuc3VwcG9ydGVkQ29udGVu
dChib29sIGZvcndhcmQpOworICAgIGJvb2wgZm9yd2FyZFVuc3VwcG9ydGVkQ29udGVudCgpIGNv
bnN0OworCisgICAgdm9pZCBzZXRMaW5rRGVsZWdhdGlvblBvbGljeShMaW5rRGVsZWdhdGlvblBv
bGljeSBwb2xpY3kpOworICAgIExpbmtEZWxlZ2F0aW9uUG9saWN5IGxpbmtEZWxlZ2F0aW9uUG9s
aWN5KCkgY29uc3Q7CisKKyAgICB2b2lkIHNldFBhbGV0dGUoY29uc3QgUVBhbGV0dGUgJnBhbGV0
dGUpOworICAgIFFQYWxldHRlIHBhbGV0dGUoKSBjb25zdDsKKworICAgIHZvaWQgc2V0Q29udGVu
dEVkaXRhYmxlKGJvb2wgZWRpdGFibGUpOworICAgIGJvb2wgaXNDb250ZW50RWRpdGFibGUoKSBj
b25zdDsKKworI2lmbmRlZiBRVF9OT19DT05URVhUTUVOVQorICAgIGJvb2wgc3dhbGxvd0NvbnRl
eHRNZW51RXZlbnQoUUNvbnRleHRNZW51RXZlbnQgKmV2ZW50KTsKKyNlbmRpZgorICAgIHZvaWQg
dXBkYXRlUG9zaXRpb25EZXBlbmRlbnRBY3Rpb25zKGNvbnN0IFFQb2ludCAmcG9zKTsKKworICAg
IFFNZW51ICpjcmVhdGVTdGFuZGFyZENvbnRleHRNZW51KCk7CisKKyAgICB2b2lkIHNldEZlYXR1
cmVQZXJtaXNzaW9uKFFXZWJGcmFtZSogZnJhbWUsIEZlYXR1cmUgZmVhdHVyZSwgUGVybWlzc2lv
blBvbGljeSBwb2xpY3kpOworCisgICAgUVN0cmluZ0xpc3Qgc3VwcG9ydGVkQ29udGVudFR5cGVz
KCkgY29uc3Q7CisgICAgYm9vbCBzdXBwb3J0c0NvbnRlbnRUeXBlKGNvbnN0IFFTdHJpbmcmIG1p
bWVUeXBlKSBjb25zdDsKKworICAgIGVudW0gRXh0ZW5zaW9uIHsKKyAgICAgICAgQ2hvb3NlTXVs
dGlwbGVGaWxlc0V4dGVuc2lvbiwKKyAgICAgICAgRXJyb3JQYWdlRXh0ZW5zaW9uCisgICAgfTsK
KyAgICBjbGFzcyBFeHRlbnNpb25PcHRpb24KKyAgICB7fTsKKyAgICBjbGFzcyBFeHRlbnNpb25S
ZXR1cm4KKyAgICB7fTsKKworICAgIGNsYXNzIENob29zZU11bHRpcGxlRmlsZXNFeHRlbnNpb25P
cHRpb24gOiBwdWJsaWMgRXh0ZW5zaW9uT3B0aW9uIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFFX
ZWJGcmFtZSAqcGFyZW50RnJhbWU7CisgICAgICAgIFFTdHJpbmdMaXN0IHN1Z2dlc3RlZEZpbGVO
YW1lczsKKyAgICB9OworCisgICAgY2xhc3MgQ2hvb3NlTXVsdGlwbGVGaWxlc0V4dGVuc2lvblJl
dHVybiA6IHB1YmxpYyBFeHRlbnNpb25SZXR1cm4geworICAgIHB1YmxpYzoKKyAgICAgICAgUVN0
cmluZ0xpc3QgZmlsZU5hbWVzOworICAgIH07CisKKyAgICBlbnVtIEVycm9yRG9tYWluIHsgUXRO
ZXR3b3JrLCBIdHRwLCBXZWJLaXQgfTsKKyAgICBjbGFzcyBFcnJvclBhZ2VFeHRlbnNpb25PcHRp
b24gOiBwdWJsaWMgRXh0ZW5zaW9uT3B0aW9uIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFFVcmwg
dXJsOworICAgICAgICBRV2ViRnJhbWUqIGZyYW1lOworICAgICAgICBFcnJvckRvbWFpbiBkb21h
aW47CisgICAgICAgIGludCBlcnJvcjsKKyAgICAgICAgUVN0cmluZyBlcnJvclN0cmluZzsKKyAg
ICB9OworCisgICAgY2xhc3MgRXJyb3JQYWdlRXh0ZW5zaW9uUmV0dXJuIDogcHVibGljIEV4dGVu
c2lvblJldHVybiB7CisgICAgcHVibGljOgorICAgICAgICBFcnJvclBhZ2VFeHRlbnNpb25SZXR1
cm4oKSA6IGNvbnRlbnRUeXBlKFFMYXRpbjFTdHJpbmcoInRleHQvaHRtbCIpKSwgZW5jb2Rpbmco
UUxhdGluMVN0cmluZygidXRmLTgiKSkge307CisgICAgICAgIFFTdHJpbmcgY29udGVudFR5cGU7
CisgICAgICAgIFFTdHJpbmcgZW5jb2Rpbmc7CisgICAgICAgIFFVcmwgYmFzZVVybDsKKyAgICAg
ICAgUUJ5dGVBcnJheSBjb250ZW50OworICAgIH07CisKKworICAgIHZpcnR1YWwgYm9vbCBleHRl
bnNpb24oRXh0ZW5zaW9uIGV4dGVuc2lvbiwgY29uc3QgRXh0ZW5zaW9uT3B0aW9uICpvcHRpb24g
PSAwLCBFeHRlbnNpb25SZXR1cm4gKm91dHB1dCA9IDApOworICAgIHZpcnR1YWwgYm9vbCBzdXBw
b3J0c0V4dGVuc2lvbihFeHRlbnNpb24gZXh0ZW5zaW9uKSBjb25zdDsKKworICAgIFFXZWJQYWdl
QWRhcHRlciogaGFuZGxlKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIGJvb2wgc2hvdWxkSW50ZXJy
dXB0SmF2YVNjcmlwdCgpOworCitRX1NJR05BTFM6CisgICAgdm9pZCBsb2FkU3RhcnRlZCgpOwor
ICAgIHZvaWQgbG9hZFByb2dyZXNzKGludCBwcm9ncmVzcyk7CisgICAgdm9pZCBsb2FkRmluaXNo
ZWQoYm9vbCBvayk7CisKKyAgICB2b2lkIGxpbmtIb3ZlcmVkKGNvbnN0IFFTdHJpbmcgJmxpbmss
IGNvbnN0IFFTdHJpbmcgJnRpdGxlLCBjb25zdCBRU3RyaW5nICZ0ZXh0Q29udGVudCk7CisgICAg
dm9pZCBzdGF0dXNCYXJNZXNzYWdlKGNvbnN0IFFTdHJpbmcmIHRleHQpOworICAgIHZvaWQgc2Vs
ZWN0aW9uQ2hhbmdlZCgpOworICAgIHZvaWQgZnJhbWVDcmVhdGVkKFFXZWJGcmFtZSAqZnJhbWUp
OworICAgIHZvaWQgZ2VvbWV0cnlDaGFuZ2VSZXF1ZXN0ZWQoY29uc3QgUVJlY3QmIGdlb20pOwor
ICAgIHZvaWQgcmVwYWludFJlcXVlc3RlZChjb25zdCBRUmVjdCYgZGlydHlSZWN0KTsKKyAgICB2
b2lkIHNjcm9sbFJlcXVlc3RlZChpbnQgZHgsIGludCBkeSwgY29uc3QgUVJlY3QmIHNjcm9sbFZp
ZXdSZWN0KTsKKyAgICB2b2lkIHdpbmRvd0Nsb3NlUmVxdWVzdGVkKCk7CisgICAgdm9pZCBwcmlu
dFJlcXVlc3RlZChRV2ViRnJhbWUgKmZyYW1lKTsKKyAgICB2b2lkIGxpbmtDbGlja2VkKGNvbnN0
IFFVcmwgJnVybCk7CisKKyAgICB2b2lkIHRvb2xCYXJWaXNpYmlsaXR5Q2hhbmdlUmVxdWVzdGVk
KGJvb2wgdmlzaWJsZSk7CisgICAgdm9pZCBzdGF0dXNCYXJWaXNpYmlsaXR5Q2hhbmdlUmVxdWVz
dGVkKGJvb2wgdmlzaWJsZSk7CisgICAgdm9pZCBtZW51QmFyVmlzaWJpbGl0eUNoYW5nZVJlcXVl
c3RlZChib29sIHZpc2libGUpOworCisgICAgdm9pZCB1bnN1cHBvcnRlZENvbnRlbnQoUU5ldHdv
cmtSZXBseSAqcmVwbHkpOworICAgIHZvaWQgZG93bmxvYWRSZXF1ZXN0ZWQoY29uc3QgUU5ldHdv
cmtSZXF1ZXN0ICZyZXF1ZXN0KTsKKworICAgIHZvaWQgbWljcm9Gb2N1c0NoYW5nZWQoKTsKKyAg
ICB2b2lkIGNvbnRlbnRzQ2hhbmdlZCgpOworICAgIHZvaWQgZGF0YWJhc2VRdW90YUV4Y2VlZGVk
KFFXZWJGcmFtZSogZnJhbWUsIFFTdHJpbmcgZGF0YWJhc2VOYW1lKTsKKyAgICB2b2lkIGFwcGxp
Y2F0aW9uQ2FjaGVRdW90YUV4Y2VlZGVkKFFXZWJTZWN1cml0eU9yaWdpbiogb3JpZ2luLCBxdWlu
dDY0IGRlZmF1bHRPcmlnaW5RdW90YSwgcXVpbnQ2NCB0b3RhbFNwYWNlTmVlZGVkKTsKKworICAg
IHZvaWQgc2F2ZUZyYW1lU3RhdGVSZXF1ZXN0ZWQoUVdlYkZyYW1lKiBmcmFtZSwgUVdlYkhpc3Rv
cnlJdGVtKiBpdGVtKTsKKyAgICB2b2lkIHJlc3RvcmVGcmFtZVN0YXRlUmVxdWVzdGVkKFFXZWJG
cmFtZSogZnJhbWUpOworCisgICAgdm9pZCB2aWV3cG9ydENoYW5nZVJlcXVlc3RlZCgpOworCisg
ICAgdm9pZCBmZWF0dXJlUGVybWlzc2lvblJlcXVlc3RlZChRV2ViRnJhbWUqIGZyYW1lLCBRV2Vi
UGFnZTo6RmVhdHVyZSBmZWF0dXJlKTsKKyAgICB2b2lkIGZlYXR1cmVQZXJtaXNzaW9uUmVxdWVz
dENhbmNlbGVkKFFXZWJGcmFtZSogZnJhbWUsIFFXZWJQYWdlOjpGZWF0dXJlIGZlYXR1cmUpOwor
Citwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCBRV2ViUGFnZSAqY3JlYXRlV2luZG93KFdlYldpbmRv
d1R5cGUgdHlwZSk7CisgICAgdmlydHVhbCBRT2JqZWN0ICpjcmVhdGVQbHVnaW4oY29uc3QgUVN0
cmluZyAmY2xhc3NpZCwgY29uc3QgUVVybCAmdXJsLCBjb25zdCBRU3RyaW5nTGlzdCAmcGFyYW1O
YW1lcywgY29uc3QgUVN0cmluZ0xpc3QgJnBhcmFtVmFsdWVzKTsKKworICAgIHZpcnR1YWwgYm9v
bCBhY2NlcHROYXZpZ2F0aW9uUmVxdWVzdChRV2ViRnJhbWUgKmZyYW1lLCBjb25zdCBRTmV0d29y
a1JlcXVlc3QgJnJlcXVlc3QsIE5hdmlnYXRpb25UeXBlIHR5cGUpOworICAgIHZpcnR1YWwgUVN0
cmluZyBjaG9vc2VGaWxlKFFXZWJGcmFtZSAqb3JpZ2luYXRpbmdGcmFtZSwgY29uc3QgUVN0cmlu
ZyYgb2xkRmlsZSk7CisgICAgdmlydHVhbCB2b2lkIGphdmFTY3JpcHRBbGVydChRV2ViRnJhbWUg
Km9yaWdpbmF0aW5nRnJhbWUsIGNvbnN0IFFTdHJpbmcmIG1zZyk7CisgICAgdmlydHVhbCBib29s
IGphdmFTY3JpcHRDb25maXJtKFFXZWJGcmFtZSAqb3JpZ2luYXRpbmdGcmFtZSwgY29uc3QgUVN0
cmluZyYgbXNnKTsKKyAgICB2aXJ0dWFsIGJvb2wgamF2YVNjcmlwdFByb21wdChRV2ViRnJhbWUg
Km9yaWdpbmF0aW5nRnJhbWUsIGNvbnN0IFFTdHJpbmcmIG1zZywgY29uc3QgUVN0cmluZyYgZGVm
YXVsdFZhbHVlLCBRU3RyaW5nKiByZXN1bHQpOworICAgIHZpcnR1YWwgdm9pZCBqYXZhU2NyaXB0
Q29uc29sZU1lc3NhZ2UoY29uc3QgUVN0cmluZyYgbWVzc2FnZSwgaW50IGxpbmVOdW1iZXIsIGNv
bnN0IFFTdHJpbmcmIHNvdXJjZUlEKTsKKworICAgIHZpcnR1YWwgUVN0cmluZyB1c2VyQWdlbnRG
b3JVcmwoY29uc3QgUVVybCYgdXJsKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBRX1BSSVZBVEVf
U0xPVChkLCB2b2lkIF9xX29uTG9hZFByb2dyZXNzQ2hhbmdlZChpbnQpKQorI2lmbmRlZiBRVF9O
T19BQ1RJT04KKyAgICBRX1BSSVZBVEVfU0xPVChkLCB2b2lkIF9xX3dlYkFjdGlvblRyaWdnZXJl
ZChib29sIGNoZWNrZWQpKQorI2VuZGlmCisgICAgUV9QUklWQVRFX1NMT1QoZCwgdm9pZCBfcV9j
bGVhbnVwTGVha01lc3NhZ2VzKCkpCisKKyAgICBRV2ViUGFnZVByaXZhdGUgKmQ7CisKKyAgICBm
cmllbmQgY2xhc3MgUVdlYkZyYW1lOworICAgIGZyaWVuZCBjbGFzcyBRV2ViUGFnZVByaXZhdGU7
CisgICAgZnJpZW5kIGNsYXNzIFFXZWJWaWV3OworICAgIGZyaWVuZCBjbGFzcyBRV2ViVmlld1By
aXZhdGU7CisgICAgZnJpZW5kIGNsYXNzIFFHcmFwaGljc1dlYlZpZXc7CisgICAgZnJpZW5kIGNs
YXNzIFFHcmFwaGljc1dlYlZpZXdQcml2YXRlOworICAgIGZyaWVuZCBjbGFzcyBRV2ViSW5zcGVj
dG9yOworICAgIGZyaWVuZCBjbGFzcyBXZWJDb3JlOjpDaHJvbWVDbGllbnRRdDsKKyAgICBmcmll
bmQgY2xhc3MgV2ViQ29yZTo6RWRpdG9yQ2xpZW50UXQ7CisgICAgZnJpZW5kIGNsYXNzIFdlYkNv
cmU6OkZyYW1lTG9hZGVyQ2xpZW50UXQ7CisgICAgZnJpZW5kIGNsYXNzIFdlYkNvcmU6Okluc3Bl
Y3RvckNsaWVudFF0OworICAgIGZyaWVuZCBjbGFzcyBXZWJDb3JlOjpJbnNwZWN0b3JTZXJ2ZXJS
ZXF1ZXN0SGFuZGxlclF0OworICAgIGZyaWVuZCBjbGFzcyBXZWJDb3JlOjpJbnNwZWN0b3JGcm9u
dGVuZENsaWVudFF0OworICAgIGZyaWVuZCBjbGFzcyBXZWJDb3JlOjpSZXNvdXJjZUhhbmRsZTsK
KyAgICBmcmllbmQgY2xhc3MgV2ViQ29yZTo6UU5ldHdvcmtSZXBseUhhbmRsZXI7CisgICAgZnJp
ZW5kIGNsYXNzIER1bXBSZW5kZXJUcmVlU3VwcG9ydFF0OworfTsKKworUV9ERUNMQVJFX09QRVJB
VE9SU19GT1JfRkxBR1MoUVdlYlBhZ2U6OkZpbmRGbGFncykKKworI2VuZGlmCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldEFwaS9xd2VicGFnZV9wLmggYi9Tb3VyY2UvV2ViS2l0
L3F0L1dpZGdldEFwaS9xd2VicGFnZV9wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYWJmNWYyYTUzYTcyYzU5Y2Ex
NzRmYjFkMGZhMTAzYjI1NTg4ODVjNAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQv
cXQvV2lkZ2V0QXBpL3F3ZWJwYWdlX3AuaApAQCAtMCwwICsxLDIwNCBAQAorLyoKKyAgICBDb3B5
cmlnaHQgKEMpIDIwMDgsIDIwMDkgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRp
YXJ5KC1pZXMpCisgICAgQ29weXJpZ2h0IChDKSAyMDA4IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0
aGVyCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry
aWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUg
RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExp
Y2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlz
IGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1
bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGll
ZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBM
aWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQg
YSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxv
bmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwg
d3JpdGUgdG8KKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFu
a2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICAgIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNB
LgorKi8KKworI2lmbmRlZiBRV0VCUEFHRV9QX0gKKyNkZWZpbmUgUVdFQlBBR0VfUF9ICisKKyNp
bmNsdWRlICJRV2ViUGFnZUFkYXB0ZXIuaCIKKworI2luY2x1ZGUgInF3ZWJmcmFtZS5oIgorI2lu
Y2x1ZGUgInF3ZWJwYWdlLmgiCisKKyNpbmNsdWRlIDxRUG9pbnRlcj4KKyNpbmNsdWRlIDxxZXZl
bnQuaD4KKyNpbmNsdWRlIDxxZ2VzdHVyZS5oPgorI2luY2x1ZGUgPHFncmFwaGljc3NjZW5lZXZl
bnQuaD4KKyNpbmNsdWRlIDxxZ3JhcGhpY3N3aWRnZXQuaD4KKyNpbmNsdWRlIDxxbmV0d29ya3By
b3h5Lmg+CisKKworbmFtZXNwYWNlIFdlYkNvcmUgeworICAgIGNsYXNzIENvbnRleHRNZW51Q2xp
ZW50UXQ7CisgICAgY2xhc3MgQ29udGV4dE1lbnVJdGVtOworICAgIGNsYXNzIENvbnRleHRNZW51
OworICAgIGNsYXNzIERvY3VtZW50OworICAgIGNsYXNzIEVkaXRvckNsaWVudFF0OworICAgIGNs
YXNzIEVsZW1lbnQ7CisgICAgY2xhc3MgSW50UmVjdDsKKyAgICBjbGFzcyBOb2RlOworICAgIGNs
YXNzIE5vZGVMaXN0OworICAgIGNsYXNzIEZyYW1lOworfQorCitRVF9CRUdJTl9OQU1FU1BBQ0UK
K2NsYXNzIFFVbmRvU3RhY2s7CitjbGFzcyBRTWVudTsKK2NsYXNzIFFCaXRBcnJheTsKK1FUX0VO
RF9OQU1FU1BBQ0UKKworY2xhc3MgUXRQbHVnaW5XaWRnZXRBZGFwdGVyOworY2xhc3MgUVdlYklu
c3BlY3RvcjsKK2NsYXNzIFFXZWJGcmFtZUFkYXB0ZXI7CitjbGFzcyBVbmRvU3RlcFF0OworCitj
bGFzcyBRdFZpZXdwb3J0QXR0cmlidXRlc1ByaXZhdGUgOiBwdWJsaWMgUVNoYXJlZERhdGEgewor
cHVibGljOgorICAgIFF0Vmlld3BvcnRBdHRyaWJ1dGVzUHJpdmF0ZShRV2ViUGFnZTo6Vmlld3Bv
cnRBdHRyaWJ1dGVzKiBxcSkKKyAgICAgICAgOiBxKHFxKQorICAgIHsgfQorCisgICAgUVdlYlBh
Z2U6OlZpZXdwb3J0QXR0cmlidXRlcyogcTsKK307CisKK2NsYXNzIFFXZWJQYWdlUHJpdmF0ZSA6
IHB1YmxpYyBRV2ViUGFnZUFkYXB0ZXIgeworcHVibGljOgorICAgIFFXZWJQYWdlUHJpdmF0ZShR
V2ViUGFnZSopOworICAgIH5RV2ViUGFnZVByaXZhdGUoKTsKKworICAgIHN0YXRpYyBXZWJDb3Jl
OjpQYWdlKiBjb3JlKGNvbnN0IFFXZWJQYWdlKik7CisKKyAgICAvLyBBZGFwdGVyIGltcGxlbWVu
dGF0aW9uCisgICAgdmlydHVhbCB2b2lkIHNob3coKSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIHZv
aWQgc2V0Rm9jdXMoKSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIHZvaWQgdW5mb2N1cygpIE9WRVJS
SURFOworICAgIHZpcnR1YWwgdm9pZCBzZXRXaW5kb3dSZWN0KGNvbnN0IFFSZWN0ICYpIE9WRVJS
SURFOworICAgIHZpcnR1YWwgUVNpemUgdmlld3BvcnRTaXplKCkgY29uc3QgT1ZFUlJJREU7Cisg
ICAgdmlydHVhbCBRV2ViUGFnZUFkYXB0ZXIqIGNyZWF0ZVdpbmRvdyhib29sIC8qZGlhbG9nKi8p
IE9WRVJSSURFOworICAgIHZpcnR1YWwgUU9iamVjdCogaGFuZGxlKCkgT1ZFUlJJREUgeyByZXR1
cm4gcTsgfQorICAgIHZpcnR1YWwgdm9pZCBqYXZhU2NyaXB0Q29uc29sZU1lc3NhZ2UoY29uc3Qg
UVN0cmluZyYgbWVzc2FnZSwgaW50IGxpbmVOdW1iZXIsIGNvbnN0IFFTdHJpbmcmIHNvdXJjZUlE
KSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIHZvaWQgamF2YVNjcmlwdEFsZXJ0KFFXZWJGcmFtZUFk
YXB0ZXIqLCBjb25zdCBRU3RyaW5nJiBtc2cpIE9WRVJSSURFOworICAgIHZpcnR1YWwgYm9vbCBq
YXZhU2NyaXB0Q29uZmlybShRV2ViRnJhbWVBZGFwdGVyKiwgY29uc3QgUVN0cmluZyYgbXNnKSBP
VkVSUklERTsKKyAgICB2aXJ0dWFsIGJvb2wgamF2YVNjcmlwdFByb21wdChRV2ViRnJhbWVBZGFw
dGVyKiwgY29uc3QgUVN0cmluZyYgbXNnLCBjb25zdCBRU3RyaW5nJiBkZWZhdWx0VmFsdWUsIFFT
dHJpbmcqIHJlc3VsdCkgT1ZFUlJJREU7CisgICAgdmlydHVhbCBib29sIHNob3VsZEludGVycnVw
dEphdmFTY3JpcHQoKSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIHZvaWQgcHJpbnRSZXF1ZXN0ZWQo
UVdlYkZyYW1lQWRhcHRlciopIE9WRVJSSURFOworICAgIHZpcnR1YWwgdm9pZCBkYXRhYmFzZVF1
b3RhRXhjZWVkZWQoUVdlYkZyYW1lQWRhcHRlciosIGNvbnN0IFFTdHJpbmcmIGRhdGFiYXNlTmFt
ZSkgT1ZFUlJJREU7CisgICAgdmlydHVhbCB2b2lkIGFwcGxpY2F0aW9uQ2FjaGVRdW90YUV4Y2Vl
ZGVkKFFXZWJTZWN1cml0eU9yaWdpbiosIHF1aW50NjQgZGVmYXVsdE9yaWdpblF1b3RhLCBxdWlu
dDY0IHRvdGFsU3BhY2VOZWVkZWQpIE9WRVJSSURFOworICAgIHZpcnR1YWwgdm9pZCBzZXRUb29s
VGlwKGNvbnN0IFFTdHJpbmcmKSBPVkVSUklERTsKKyNpZiBVU0UoUVRfTVVMVElNRURJQSkKKyAg
ICB2aXJ0dWFsIFFXZWJGdWxsU2NyZWVuVmlkZW9IYW5kbGVyKiBjcmVhdGVGdWxsU2NyZWVuVmlk
ZW9IYW5kbGVyKCkgT1ZFUlJJREU7CisjZW5kaWYKKyAgICB2aXJ0dWFsIFFXZWJGcmFtZUFkYXB0
ZXIqIG1haW5GcmFtZUFkYXB0ZXIoKSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIFFTdHJpbmdMaXN0
IGNob29zZUZpbGVzKFFXZWJGcmFtZUFkYXB0ZXIqLCBib29sIGFsbG93TXVsdGlwbGUsIGNvbnN0
IFFTdHJpbmdMaXN0JiBzdWdnZXN0ZWRGaWxlTmFtZXMpIE9WRVJSSURFOworICAgIHZpcnR1YWwg
UUNvbG9yIGNvbG9yU2VsZWN0aW9uUmVxdWVzdGVkKGNvbnN0IFFDb2xvciYgc2VsZWN0ZWRDb2xv
cikgT1ZFUlJJREU7CisgICAgdmlydHVhbCBRV2ViU2VsZWN0TWV0aG9kKiBjcmVhdGVTZWxlY3RQ
b3B1cCgpIE9WRVJSSURFOworICAgIHZpcnR1YWwgUVJlY3Qgdmlld1JlY3RSZWxhdGl2ZVRvV2lu
ZG93KCkgT1ZFUlJJREU7CisgICAgdmlydHVhbCB2b2lkIGdlb2xvY2F0aW9uUGVybWlzc2lvblJl
cXVlc3RlZChRV2ViRnJhbWVBZGFwdGVyKikgT1ZFUlJJREU7CisgICAgdmlydHVhbCB2b2lkIGdl
b2xvY2F0aW9uUGVybWlzc2lvblJlcXVlc3RDYW5jZWxsZWQoUVdlYkZyYW1lQWRhcHRlciopIE9W
RVJSSURFOworICAgIHZpcnR1YWwgdm9pZCBub3RpZmljYXRpb25zUGVybWlzc2lvblJlcXVlc3Rl
ZChRV2ViRnJhbWVBZGFwdGVyKikgT1ZFUlJJREU7CisgICAgdmlydHVhbCB2b2lkIG5vdGlmaWNh
dGlvbnNQZXJtaXNzaW9uUmVxdWVzdENhbmNlbGxlZChRV2ViRnJhbWVBZGFwdGVyKikgT1ZFUlJJ
REU7CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVzcG9uZFRvQ2hhbmdlZENvbnRlbnRzKCkgT1ZFUlJJ
REU7CisgICAgdmlydHVhbCB2b2lkIHJlc3BvbmRUb0NoYW5nZWRTZWxlY3Rpb24oKSBPVkVSUklE
RTsKKyAgICB2aXJ0dWFsIHZvaWQgbWljcm9Gb2N1c0NoYW5nZWQoKSBPVkVSUklERTsKKyAgICB2
aXJ0dWFsIHZvaWQgdHJpZ2dlckNvcHlBY3Rpb24oKSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIHZv
aWQgdHJpZ2dlckFjdGlvbkZvcktleUV2ZW50KFFLZXlFdmVudCopIE9WRVJSSURFOworICAgIHZp
cnR1YWwgdm9pZCBjbGVhclVuZG9TdGFjaygpIE9WRVJSSURFOworICAgIHZpcnR1YWwgYm9vbCBj
YW5VbmRvKCkgY29uc3QgT1ZFUlJJREU7CisgICAgdmlydHVhbCBib29sIGNhblJlZG8oKSBjb25z
dCBPVkVSUklERTsKKyAgICB2aXJ0dWFsIHZvaWQgdW5kbygpIE9WRVJSSURFOworICAgIHZpcnR1
YWwgdm9pZCByZWRvKCkgT1ZFUlJJREU7CisgICAgdmlydHVhbCB2b2lkIGNyZWF0ZVVuZG9TdGVw
KFFTaGFyZWRQb2ludGVyPFVuZG9TdGVwUXQ+KSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIGNvbnN0
IGNoYXIqIGVkaXRvckNvbW1hbmRGb3JLZXlFdmVudChRS2V5RXZlbnQqKSBPVkVSUklERTsKKwor
ICAgIHZvaWQgdXBkYXRlTmF2aWdhdGlvbkFjdGlvbnMoKSBPVkVSUklERTsKKworICAgIHZpcnR1
YWwgUU9iamVjdCogaW5zcGVjdG9ySGFuZGxlKCkgT1ZFUlJJREU7CisgICAgdmlydHVhbCB2b2lk
IHNldEluc3BlY3RvckZyb250ZW5kKFFPYmplY3QqKSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIHZv
aWQgc2V0SW5zcGVjdG9yV2luZG93VGl0bGUoY29uc3QgUVN0cmluZyYpIE9WRVJSSURFOworICAg
IHZpcnR1YWwgdm9pZCBjcmVhdGVXZWJJbnNwZWN0b3IoUU9iamVjdCoqIGluc3BlY3RvclZpZXcs
IFFXZWJQYWdlQWRhcHRlcioqIGluc3BlY3RvclBhZ2UpIE9WRVJSSURFOworICAgIHZpcnR1YWwg
UVN0cmluZ0xpc3QgbWVudUFjdGlvbnNBc1RleHQoKSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIHZv
aWQgZW1pdFZpZXdwb3J0Q2hhbmdlUmVxdWVzdGVkKCkgT1ZFUlJJREU7CisgICAgdmlydHVhbCBi
b29sIGFjY2VwdE5hdmlnYXRpb25SZXF1ZXN0KFFXZWJGcmFtZUFkYXB0ZXIqLCBjb25zdCBRTmV0
d29ya1JlcXVlc3QmLCBpbnQgdHlwZSkgT1ZFUlJJREU7CisgICAgdmlydHVhbCB2b2lkIGVtaXRS
ZXN0b3JlRnJhbWVTdGF0ZVJlcXVlc3RlZChRV2ViRnJhbWVBZGFwdGVyKikgT1ZFUlJJREU7Cisg
ICAgdmlydHVhbCB2b2lkIGVtaXRTYXZlRnJhbWVTdGF0ZVJlcXVlc3RlZChRV2ViRnJhbWVBZGFw
dGVyKiwgUVdlYkhpc3RvcnlJdGVtKikgT1ZFUlJJREU7CisgICAgdmlydHVhbCB2b2lkIGVtaXRE
b3dubG9hZFJlcXVlc3RlZChjb25zdCBRTmV0d29ya1JlcXVlc3QmKSBPVkVSUklERTsKKyAgICB2
aXJ0dWFsIHZvaWQgZW1pdEZyYW1lQ3JlYXRlZChRV2ViRnJhbWVBZGFwdGVyKikgT1ZFUlJJREU7
CisgICAgdmlydHVhbCBRU3RyaW5nIHVzZXJBZ2VudEZvclVybChjb25zdCBRVXJsICZ1cmwpIGNv
bnN0IE9WRVJSSURFIHsgcmV0dXJuIHEtPnVzZXJBZ2VudEZvclVybCh1cmwpOyB9CisgICAgdmly
dHVhbCBib29sIHN1cHBvcnRzRXJyb3JQYWdlRXh0ZW5zaW9uKCkgY29uc3QgT1ZFUlJJREUgeyBy
ZXR1cm4gcS0+c3VwcG9ydHNFeHRlbnNpb24oUVdlYlBhZ2U6OkVycm9yUGFnZUV4dGVuc2lvbik7
IH0KKyAgICB2aXJ0dWFsIGJvb2wgZXJyb3JQYWdlRXh0ZW5zaW9uKEVycm9yUGFnZU9wdGlvbiAq
LCBFcnJvclBhZ2VSZXR1cm4gKikgT1ZFUlJJREU7CisgICAgdmlydHVhbCBRdFBsdWdpbldpZGdl
dEFkYXB0ZXIqIGNyZWF0ZVBsdWdpbihjb25zdCBRU3RyaW5nICYsIGNvbnN0IFFVcmwgJiwgY29u
c3QgUVN0cmluZ0xpc3QgJiwgY29uc3QgUVN0cmluZ0xpc3QgJikgT1ZFUlJJREU7CisgICAgdmly
dHVhbCBRdFBsdWdpbldpZGdldEFkYXB0ZXIqIGFkYXB0ZXJGb3JXaWRnZXQoUU9iamVjdCAqKSBj
b25zdCBPVkVSUklERTsKKyAgICB2aXJ0dWFsIGJvb2wgcmVxdWVzdFNvZnR3YXJlSW5wdXRQYW5l
bCgpIGNvbnN0IE9WRVJSSURFOworICAgIHZpcnR1YWwgdm9pZCBjcmVhdGVBbmRTZXRDdXJyZW50
Q29udGV4dE1lbnUoY29uc3QgUUxpc3Q8TWVudUl0ZW1EZXNjcmlwdGlvbj4mLCBRQml0QXJyYXkq
KSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIGJvb2wgaGFuZGxlU2Nyb2xsYmFyQ29udGV4dE1lbnVF
dmVudChRQ29udGV4dE1lbnVFdmVudCosIGJvb2wsIFNjcm9sbERpcmVjdGlvbiosIFNjcm9sbEdy
YW51bGFyaXR5KikgT1ZFUlJJREU7CisKKworICAgIHZvaWQgY3JlYXRlTWFpbkZyYW1lKCk7CisK
KyAgICB2b2lkIF9xX3dlYkFjdGlvblRyaWdnZXJlZChib29sIGNoZWNrZWQpOworICAgIHZvaWQg
dXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpXZWJBY3Rpb24gYWN0aW9uKTsKKyAgICB2b2lkIHVwZGF0
ZUVkaXRvckFjdGlvbnMoKTsKKworICAgIHZvaWQgdGltZXJFdmVudChRVGltZXJFdmVudCopOwor
CisjaWZuZGVmIFFUX05PX0NPTlRFWFRNRU5VCisgICAgdm9pZCBjb250ZXh0TWVudUV2ZW50KGNv
bnN0IFFQb2ludCYgZ2xvYmFsUG9zKTsKKyNlbmRpZgorICAgIHZvaWQga2V5UHJlc3NFdmVudChR
S2V5RXZlbnQqKTsKKyAgICB2b2lkIGtleVJlbGVhc2VFdmVudChRS2V5RXZlbnQqKTsKKworICAg
IHRlbXBsYXRlPGNsYXNzIFQ+IHZvaWQgZHJhZ0VudGVyRXZlbnQoVCopOworICAgIHRlbXBsYXRl
PGNsYXNzIFQ+IHZvaWQgZHJhZ01vdmVFdmVudChUKik7CisgICAgdGVtcGxhdGU8Y2xhc3MgVD4g
dm9pZCBkcm9wRXZlbnQoVCopOworCisgICAgdm9pZCBzaG9ydGN1dE92ZXJyaWRlRXZlbnQoUUtl
eUV2ZW50Kik7CisgICAgdm9pZCBsZWF2ZUV2ZW50KFFFdmVudCopOworCisgICAgYm9vbCBnZXN0
dXJlRXZlbnQoUUdlc3R1cmVFdmVudCopOworCisKKyAgICB2b2lkIHNldEluc3BlY3RvcihRV2Vi
SW5zcGVjdG9yKik7CisgICAgUVdlYkluc3BlY3RvciogZ2V0T3JDcmVhdGVJbnNwZWN0b3IoKTsK
KworI2lmbmRlZiBRVF9OT19TSE9SVENVVAorICAgIHN0YXRpYyBRV2ViUGFnZTo6V2ViQWN0aW9u
IGVkaXRvckFjdGlvbkZvcktleUV2ZW50KFFLZXlFdmVudCogZXZlbnQpOworI2VuZGlmCisgICAg
c3RhdGljIGNvbnN0IGNoYXIqIGVkaXRvckNvbW1hbmRGb3JXZWJBY3Rpb25zKFFXZWJQYWdlOjpX
ZWJBY3Rpb24gYWN0aW9uKTsKKworICAgIFFXZWJQYWdlICpxOworICAgIFFQb2ludGVyPFFXZWJG
cmFtZT4gbWFpbkZyYW1lOworCisjaWZuZGVmIFFUX05PX1VORE9TVEFDSworICAgIFFVbmRvU3Rh
Y2sgKnVuZG9TdGFjazsKKyNlbmRpZgorCisgICAgUVBvaW50ZXI8UVdpZGdldD4gdmlldzsKKwor
ICAgIFFXZWJQYWdlOjpMaW5rRGVsZWdhdGlvblBvbGljeSBsaW5rUG9saWN5OworCisgICAgUVNp
emUgbV92aWV3cG9ydFNpemU7CisgICAgUVNpemUgZml4ZWRMYXlvdXRTaXplOworCisgICAgUVdl
YkhpdFRlc3RSZXN1bHQgaGl0VGVzdFJlc3VsdDsKKyNpZm5kZWYgUVRfTk9fQ09OVEVYVE1FTlUK
KyAgICBRUG9pbnRlcjxRTWVudT4gY3VycmVudENvbnRleHRNZW51OworI2VuZGlmCisgICAgUVBh
bGV0dGUgcGFsZXR0ZTsKKyAgICBib29sIHVzZUZpeGVkTGF5b3V0OworCisgICAgUUFjdGlvbiAq
YWN0aW9uc1tRV2ViUGFnZTo6V2ViQWN0aW9uQ291bnRdOworCisgICAgUVdpZGdldCogaW5zcGVj
dG9yRnJvbnRlbmQ7CisgICAgUVdlYkluc3BlY3RvciogaW5zcGVjdG9yOworICAgIGJvb2wgaW5z
cGVjdG9ySXNJbnRlcm5hbE9ubHk7IC8vIFRydWUgaWYgY3JlYXRlZCB0aHJvdWdoIHRoZSBJbnNw
ZWN0IGNvbnRleHQgbWVudSBhY3Rpb24KKyAgICBRdDo6RHJvcEFjdGlvbiBtX2xhc3REcm9wQWN0
aW9uOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldEFw
aS9xd2Vidmlldy5jcHAgYi9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldEFwaS9xd2Vidmlldy5jcHAK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMC4uMTA5NDJmMzAzYTcyMTE4ODFjNTNjZWQ1ZGYzODZmYzM0NjE4MGJmYwotLS0g
L2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvcXQvV2lkZ2V0QXBpL3F3ZWJ2aWV3LmNwcApA
QCAtMCwwICsxLDExMjcgQEAKKy8qCisgICAgQ29weXJpZ2h0IChDKSAyMDA4IE5va2lhIENvcnBv
cmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQorICAgIENvcHlyaWdodCAoQykgMjAw
OCBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlcgorICAgIENvcHlyaWdodCAoQykgMjAwOSBHaXJp
c2ggUmFtYWtyaXNobmFuIDxnaXJpc2hAZm9yd2FyZGJpYXMuaW4+CisKKyAgICBUaGlzIGxpYnJh
cnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAg
bW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJs
aWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0
aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9w
dGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0
ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBB
TlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1F
UkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0
aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFp
bHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGli
cmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7
IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAgICB0aGUgRnJl
ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZs
b29yLAorICAgIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorKi8KKworI2luY2x1ZGUgImNv
bmZpZy5oIgorI2luY2x1ZGUgInF3ZWJ2aWV3LmgiCisKKyNpbmNsdWRlICJRV2ViUGFnZUNsaWVu
dC5oIgorI2luY2x1ZGUgInF3ZWJmcmFtZS5oIgorI2luY2x1ZGUgInF3ZWJwYWdlX3AuaCIKKyNp
bmNsdWRlICJxYml0bWFwLmgiCisjaW5jbHVkZSAicWV2ZW50LmgiCisjaW5jbHVkZSAicXBhaW50
ZXIuaCIKKyNpZiBIQVZFKFFUUFJJTlRTVVBQT1JUKQorI2luY2x1ZGUgInFwcmludGVyLmgiCisj
ZW5kaWYKKyNpbmNsdWRlICJxZGlyLmgiCisjaW5jbHVkZSAicWZpbGUuaCIKKyNpZm5kZWYgUVRf
Tk9fQUNDRVNTSUJJTElUWQorI2luY2x1ZGUgInF3ZWJ2aWV3YWNjZXNzaWJsZV9wLmgiCisjZW5k
aWYKKworY2xhc3MgUVdlYlZpZXdQcml2YXRlIHsKK3B1YmxpYzoKKyAgICBRV2ViVmlld1ByaXZh
dGUoUVdlYlZpZXcgKnZpZXcpCisgICAgICAgIDogdmlldyh2aWV3KQorICAgICAgICAsIHBhZ2Uo
MCkKKyAgICAgICAgLCByZW5kZXJIaW50cyhRUGFpbnRlcjo6VGV4dEFudGlhbGlhc2luZyB8IFFQ
YWludGVyOjpTbW9vdGhQaXhtYXBUcmFuc2Zvcm0pCisgICAgeworICAgICAgICBRX0FTU0VSVCh2
aWV3KTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5RV2ViVmlld1ByaXZhdGUoKTsKKworICAgIHZv
aWQgX3FfcGFnZURlc3Ryb3llZCgpOworICAgIHZvaWQgZGV0YWNoQ3VycmVudFBhZ2UoKTsKKwor
ICAgIFFXZWJWaWV3ICp2aWV3OworICAgIFFXZWJQYWdlICpwYWdlOworCisgICAgUVBhaW50ZXI6
OlJlbmRlckhpbnRzIHJlbmRlckhpbnRzOworfTsKKworUVdlYlZpZXdQcml2YXRlOjp+UVdlYlZp
ZXdQcml2YXRlKCkKK3sKKyAgICBkZXRhY2hDdXJyZW50UGFnZSgpOworfQorCit2b2lkIFFXZWJW
aWV3UHJpdmF0ZTo6X3FfcGFnZURlc3Ryb3llZCgpCit7CisgICAgcGFnZSA9IDA7CisgICAgdmll
dy0+c2V0UGFnZSgwKTsKK30KKworLyohCisgICAgXGNsYXNzIFFXZWJWaWV3CisgICAgXHNpbmNl
IDQuNAorICAgIFxicmllZiBUaGUgUVdlYlZpZXcgY2xhc3MgcHJvdmlkZXMgYSB3aWRnZXQgdGhh
dCBpcyB1c2VkIHRvIHZpZXcgYW5kIGVkaXQKKyAgICB3ZWIgZG9jdW1lbnRzLgorICAgIFxpbmdy
b3VwIGFkdmFuY2VkCisKKyAgICBcaW5tb2R1bGUgUXRXZWJLaXQKKworICAgIFFXZWJWaWV3IGlz
IHRoZSBtYWluIHdpZGdldCBjb21wb25lbnQgb2YgdGhlIFF0V2ViS2l0IHdlYiBicm93c2luZyBt
b2R1bGUuCisgICAgSXQgY2FuIGJlIHVzZWQgaW4gdmFyaW91cyBhcHBsaWNhdGlvbnMgdG8gZGlz
cGxheSB3ZWIgY29udGVudCBsaXZlIGZyb20gdGhlCisgICAgSW50ZXJuZXQuCisKKyAgICBUaGUg
aW1hZ2UgYmVsb3cgc2hvd3MgUVdlYlZpZXcgcHJldmlld2VkIGluIFxRRCB3aXRoIGEgTm9raWEg
d2Vic2l0ZS4KKworICAgIFxpbWFnZSBxd2Vidmlldy11cmwucG5nCisKKyAgICBBIHdlYiBzaXRl
IGNhbiBiZSBsb2FkZWQgb250byBRV2ViVmlldyB3aXRoIHRoZSBsb2FkKCkgZnVuY3Rpb24uIExp
a2UgYWxsCisgICAgUXQgd2lkZ2V0cywgdGhlIHNob3coKSBmdW5jdGlvbiBtdXN0IGJlIGludm9r
ZWQgaW4gb3JkZXIgdG8gZGlzcGxheQorICAgIFFXZWJWaWV3LiBUaGUgc25pcHBldCBiZWxvdyBp
bGx1c3RyYXRlcyB0aGlzOgorCisgICAgXHNuaXBwZXQgd2Via2l0c25pcHBldHMvc2ltcGxlL21h
aW4uY3BwIFVzaW5nIFFXZWJWaWV3CisKKyAgICBBbHRlcm5hdGl2ZWx5LCBzZXRVcmwoKSBjYW4g
YWxzbyBiZSB1c2VkIHRvIGxvYWQgYSB3ZWIgc2l0ZS4gSWYgeW91IGhhdmUKKyAgICB0aGUgSFRN
TCBjb250ZW50IHJlYWRpbHkgYXZhaWxhYmxlLCB5b3UgY2FuIHVzZSBzZXRIdG1sKCkgaW5zdGVh
ZC4KKworICAgIFRoZSBsb2FkU3RhcnRlZCgpIHNpZ25hbCBpcyBlbWl0dGVkIHdoZW4gdGhlIHZp
ZXcgYmVnaW5zIGxvYWRpbmcuIFRoZQorICAgIGxvYWRQcm9ncmVzcygpIHNpZ25hbCwgb24gdGhl
IG90aGVyIGhhbmQsIGlzIGVtaXR0ZWQgd2hlbmV2ZXIgYW4gZWxlbWVudCBvZgorICAgIHRoZSB3
ZWIgdmlldyBjb21wbGV0ZXMgbG9hZGluZywgc3VjaCBhcyBhbiBlbWJlZGRlZCBpbWFnZSwgYSBz
Y3JpcHQsIGV0Yy4KKyAgICBGaW5hbGx5LCB0aGUgbG9hZEZpbmlzaGVkKCkgc2lnbmFsIGlzIGVt
aXR0ZWQgd2hlbiB0aGUgdmlldyBoYXMgbG9hZGVkCisgICAgY29tcGxldGVseS4gSXQncyBhcmd1
bWVudCAtIGVpdGhlciBcYyB0cnVlIG9yIFxjIGZhbHNlIC0gaW5kaWNhdGVzCisgICAgbG9hZCBz
dWNjZXNzIG9yIGZhaWx1cmUuCisKKyAgICBUaGUgcGFnZSgpIGZ1bmN0aW9uIHJldHVybnMgYSBw
b2ludGVyIHRvIHRoZSB3ZWIgcGFnZSBvYmplY3QuIFNlZQorICAgIFxse0VsZW1lbnRzIG9mIFFX
ZWJWaWV3fSBmb3IgYW4gZXhwbGFuYXRpb24gb2YgaG93IHRoZSB3ZWIgcGFnZQorICAgIGlzIHJl
bGF0ZWQgdG8gdGhlIHZpZXcuIFRvIG1vZGlmeSB5b3VyIHdlYiB2aWV3J3Mgc2V0dGluZ3MsIHlv
dSBjYW4gYWNjZXNzCisgICAgdGhlIFFXZWJTZXR0aW5ncyBvYmplY3Qgd2l0aCB0aGUgc2V0dGlu
Z3MoKSBmdW5jdGlvbi4gV2l0aCBRV2ViU2V0dGluZ3MsCisgICAgeW91IGNhbiBjaGFuZ2UgdGhl
IGRlZmF1bHQgZm9udHMsIGVuYWJsZSBvciBkaXNhYmxlIGZlYXR1cmVzIHN1Y2ggYXMKKyAgICBK
YXZhU2NyaXB0IGFuZCBwbHVnaW5zLgorCisgICAgVGhlIHRpdGxlIG9mIGFuIEhUTUwgZG9jdW1l
bnQgY2FuIGJlIGFjY2Vzc2VkIHdpdGggdGhlIHRpdGxlKCkgcHJvcGVydHkuCisgICAgQWRkaXRp
b25hbGx5LCBhIHdlYiBzaXRlIG1heSBhbHNvIHNwZWNpZnkgYW4gaWNvbiwgd2hpY2ggY2FuIGJl
IGFjY2Vzc2VkCisgICAgdXNpbmcgdGhlIGljb24oKSBwcm9wZXJ0eS4gSWYgdGhlIHRpdGxlIG9y
IHRoZSBpY29uIGNoYW5nZXMsIHRoZSBjb3JyZXNwb25kaW5nCisgICAgdGl0bGVDaGFuZ2VkKCkg
YW5kIGljb25DaGFuZ2VkKCkgc2lnbmFscyB3aWxsIGJlIGVtaXR0ZWQuIFRoZQorICAgIHRleHRT
aXplTXVsdGlwbGllcigpIHByb3BlcnR5IGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGUgb3ZlcmFs
bCBzaXplIG9mCisgICAgdGhlIHRleHQgZGlzcGxheWVkIGluIHRoZSB3ZWIgdmlldy4KKworICAg
IElmIHlvdSByZXF1aXJlIGEgY3VzdG9tIGNvbnRleHQgbWVudSwgeW91IGNhbiBpbXBsZW1lbnQg
aXQgYnkgcmVpbXBsZW1lbnRpbmcKKyAgICBcbHtRV2lkZ2V0Ojp9e2NvbnRleHRNZW51RXZlbnQo
KX0gYW5kIHBvcHVsYXRpbmcgeW91ciBRTWVudSB3aXRoIHRoZSBhY3Rpb25zCisgICAgb2J0YWlu
ZWQgZnJvbSBwYWdlQWN0aW9uKCkuIE1vcmUgZnVuY3Rpb25hbGl0eSBzdWNoIGFzIHJlbG9hZGlu
ZyB0aGUgdmlldywKKyAgICBjb3B5aW5nIHNlbGVjdGVkIHRleHQgdG8gdGhlIGNsaXBib2FyZCwg
b3IgcGFzdGluZyBpbnRvIHRoZSB2aWV3LCBpcyBhbHNvCisgICAgZW5jYXBzdWxhdGVkIHdpdGhp
biB0aGUgUUFjdGlvbiBvYmplY3RzIHJldHVybmVkIGJ5IHBhZ2VBY3Rpb24oKS4gVGhlc2UKKyAg
ICBhY3Rpb25zIGNhbiBiZSBwcm9ncmFtbWF0aWNhbGx5IHRyaWdnZXJlZCB1c2luZyB0cmlnZ2Vy
UGFnZUFjdGlvbigpLgorICAgIEFsdGVybmF0aXZlbHksIHRoZSBhY3Rpb25zIGNhbiBiZSBhZGRl
ZCB0byBhIHRvb2xiYXIgb3IgYSBtZW51IGRpcmVjdGx5LgorICAgIFFXZWJWaWV3IG1haW50YWlu
cyB0aGUgc3RhdGUgb2YgdGhlIHJldHVybmVkIGFjdGlvbnMgYnV0IGFsbG93cworICAgIG1vZGlm
aWNhdGlvbiBvZiBhY3Rpb24gcHJvcGVydGllcyBzdWNoIGFzIFxse1FBY3Rpb246On17dGV4dH0g
b3IKKyAgICBcbHtRQWN0aW9uOjp9e2ljb259LgorCisgICAgQSBRV2ViVmlldyBjYW4gYmUgcHJp
bnRlZCBvbnRvIGEgUVByaW50ZXIgdXNpbmcgdGhlIHByaW50KCkgZnVuY3Rpb24uCisgICAgVGhp
cyBmdW5jdGlvbiBpcyBtYXJrZWQgYXMgYSBzbG90IGFuZCBjYW4gYmUgY29udmVuaWVudGx5IGNv
bm5lY3RlZCB0bworICAgIFxse1FQcmludFByZXZpZXdEaWFsb2d9J3MgXGx7UVByaW50UHJldmll
d0RpYWxvZzo6fXtwYWludFJlcXVlc3RlZCgpfQorICAgIHNpZ25hbC4KKworICAgIElmIHlvdSB3
YW50IHRvIHByb3ZpZGUgc3VwcG9ydCBmb3Igd2ViIHNpdGVzIHRoYXQgYWxsb3cgdGhlIHVzZXIg
dG8gb3BlbgorICAgIG5ldyB3aW5kb3dzLCBzdWNoIGFzIHBvcC11cCB3aW5kb3dzLCB5b3UgY2Fu
IHN1YmNsYXNzIFFXZWJWaWV3IGFuZAorICAgIHJlaW1wbGVtZW50IHRoZSBjcmVhdGVXaW5kb3co
KSBmdW5jdGlvbi4KKworICAgIFxzZWN0aW9uMSBFbGVtZW50cyBvZiBRV2ViVmlldworCisgICAg
UVdlYlZpZXcgY29uc2lzdHMgb2Ygb3RoZXIgb2JqZWN0cyBzdWNoIGFzIFFXZWJGcmFtZSBhbmQg
UVdlYlBhZ2UuIFRoZQorICAgIGZsb3djaGFydCBiZWxvdyBzaG93cyB0aGVzZSBlbGVtZW50cyBh
cmUgcmVsYXRlZC4KKworICAgIFxpbWFnZSBxd2Vidmlldy1kaWFncmFtLnBuZworCisgICAgXG5v
dGUgSXQgaXMgcG9zc2libGUgdG8gdXNlIFFXZWJQYWdlIGFuZCBRV2ViRnJhbWUsIHdpdGhvdXQg
dXNpbmcgUVdlYlZpZXcsCisgICAgaWYgeW91IGRvIG5vdCByZXF1aXJlIFFXaWRnZXQgYXR0cmli
dXRlcy4gTmV2ZXJ0aGVsZXNzLCBRdFdlYktpdCBkZXBlbmRzCisgICAgb24gUXRHdWksIHNvIHlv
dSBzaG91bGQgdXNlIGEgUUFwcGxpY2F0aW9uIGluc3RlYWQgb2YgUUNvcmVBcHBsaWNhdGlvbi4K
KworICAgIFxzYSB7UHJldmlld2VyIEV4YW1wbGV9LCB7V2ViIEJyb3dzZXJ9LCB7Rm9ybSBFeHRy
YWN0b3IgRXhhbXBsZX0sCisgICAge0dvb2dsZSBDaGF0IEV4YW1wbGV9LCB7RmFuY3kgQnJvd3Nl
ciBFeGFtcGxlfQorKi8KKworI2lmbmRlZiBRVF9OT19BQ0NFU1NJQklMSVRZCitzdGF0aWMgUUFj
Y2Vzc2libGVJbnRlcmZhY2UqIGFjY2Vzc2libGVJbnRlcmZhY2VGYWN0b3J5KGNvbnN0IFFTdHJp
bmcmIGtleSwgUU9iamVjdCogb2JqZWN0KQoreworICAgIFFfVU5VU0VEKGtleSkKKworICAgIGlm
IChRV2ViUGFnZSogcGFnZSA9IHFvYmplY3RfY2FzdDxRV2ViUGFnZSo+KG9iamVjdCkpCisgICAg
ICAgIHJldHVybiBuZXcgUVdlYlBhZ2VBY2Nlc3NpYmxlKHBhZ2UpOworICAgIGlmIChRV2ViVmll
dyogdmlldyA9IHFvYmplY3RfY2FzdDxRV2ViVmlldyo+KG9iamVjdCkpCisgICAgICAgIHJldHVy
biBuZXcgUVdlYlZpZXdBY2Nlc3NpYmxlKHZpZXcpOworICAgIGlmIChRV2ViRnJhbWUqIGZyYW1l
ID0gcW9iamVjdF9jYXN0PFFXZWJGcmFtZSo+KG9iamVjdCkpCisgICAgICAgIHJldHVybiBuZXcg
UVdlYkZyYW1lQWNjZXNzaWJsZShmcmFtZSk7CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKwor
LyohCisgICAgQ29uc3RydWN0cyBhbiBlbXB0eSBRV2ViVmlldyB3aXRoIHBhcmVudCBcYSBwYXJl
bnQuCisKKyAgICBcc2EgbG9hZCgpCisqLworUVdlYlZpZXc6OlFXZWJWaWV3KFFXaWRnZXQgKnBh
cmVudCkKKyAgICA6IFFXaWRnZXQocGFyZW50KQoreworICAgIGQgPSBuZXcgUVdlYlZpZXdQcml2
YXRlKHRoaXMpOworCisjaWYgIWRlZmluZWQoUV9XU19RV1MpCisgICAgc2V0QXR0cmlidXRlKFF0
OjpXQV9JbnB1dE1ldGhvZEVuYWJsZWQpOworI2VuZGlmCisKKyAgICBzZXRBdHRyaWJ1dGUoUXQ6
OldBX0FjY2VwdFRvdWNoRXZlbnRzKTsKKyAgICBzZXRBY2NlcHREcm9wcyh0cnVlKTsKKworICAg
IHNldE1vdXNlVHJhY2tpbmcodHJ1ZSk7CisgICAgc2V0Rm9jdXNQb2xpY3koUXQ6OldoZWVsRm9j
dXMpOworCisjaWZuZGVmIFFUX05PX0FDQ0VTU0lCSUxJVFkKKyAgICBRQWNjZXNzaWJsZTo6aW5z
dGFsbEZhY3RvcnkoYWNjZXNzaWJsZUludGVyZmFjZUZhY3RvcnkpOworI2VuZGlmCit9CisKKy8q
IQorICAgIERlc3Ryb3lzIHRoZSB3ZWIgdmlldy4KKyovCitRV2ViVmlldzo6flFXZWJWaWV3KCkK
K3sKKyAgICBkZWxldGUgZDsKK30KKworLyohCisgICAgUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhl
IHVuZGVybHlpbmcgd2ViIHBhZ2UuCisKKyAgICBcc2Egc2V0UGFnZSgpCisqLworUVdlYlBhZ2Ug
KlFXZWJWaWV3OjpwYWdlKCkgY29uc3QKK3sKKyAgICBpZiAoIWQtPnBhZ2UpIHsKKyAgICAgICAg
UVdlYlZpZXcgKnRoYXQgPSBjb25zdF9jYXN0PFFXZWJWaWV3ICo+KHRoaXMpOworICAgICAgICB0
aGF0LT5zZXRQYWdlKG5ldyBRV2ViUGFnZSh0aGF0KSk7CisgICAgfQorICAgIHJldHVybiBkLT5w
YWdlOworfQorCit2b2lkIFFXZWJWaWV3UHJpdmF0ZTo6ZGV0YWNoQ3VycmVudFBhZ2UoKQorewor
ICAgIGlmICghcGFnZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgcGFnZS0+ZC0+dmlldyA9IDA7
CisKKyAgICAvLyBpZiB0aGUgcGFnZSBjbGllbnQgaXMgdGhlIHNwZWNpYWwgY2xpZW50IGNvbnN0
cnVjdGVkIGZvcgorICAgIC8vIGRlbGVnYXRpbmcgdGhlIHJlc3BvbnNpYmlsaXRpZXMgdG8gYSBR
V2lkZ2V0LCB3ZSBuZWVkCisgICAgLy8gdG8gZGVzdHJveSBpdC4KKworICAgIGlmIChwYWdlLT5k
LT5jbGllbnQgJiYgcGFnZS0+ZC0+Y2xpZW50LT5pc1FXaWRnZXRDbGllbnQoKSkKKyAgICAgICAg
cGFnZS0+ZC0+Y2xpZW50LnJlc2V0KCk7CisKKyAgICBwYWdlLT5kLT5jbGllbnQudGFrZSgpOwor
CisgICAgLy8gaWYgdGhlIHBhZ2Ugd2FzIGNyZWF0ZWQgYnkgdXMsIHdlIG93biBpdCBhbmQgbmVl
ZCB0bworICAgIC8vIGRlc3Ryb3kgaXQgYXMgd2VsbC4KKworICAgIGlmIChwYWdlLT5wYXJlbnQo
KSA9PSB2aWV3KQorICAgICAgICBkZWxldGUgcGFnZTsKKyAgICBlbHNlCisgICAgICAgIHBhZ2Ut
PmRpc2Nvbm5lY3Qodmlldyk7CisKKyAgICBwYWdlID0gMDsKK30KKworLyohCisgICAgTWFrZXMg
XGEgcGFnZSB0aGUgbmV3IHdlYiBwYWdlIG9mIHRoZSB3ZWIgdmlldy4KKworICAgIFRoZSBwYXJl
bnQgUU9iamVjdCBvZiB0aGUgcHJvdmlkZWQgcGFnZSByZW1haW5zIHRoZSBvd25lcgorICAgIG9m
IHRoZSBvYmplY3QuIElmIHRoZSBjdXJyZW50IHBhZ2UgaXMgYSBjaGlsZCBvZiB0aGUgd2ViCisg
ICAgdmlldywgaXQgd2lsbCBiZSBkZWxldGVkLgorCisgICAgXHNhIHBhZ2UoKQorKi8KK3ZvaWQg
UVdlYlZpZXc6OnNldFBhZ2UoUVdlYlBhZ2UqIHBhZ2UpCit7CisgICAgaWYgKGQtPnBhZ2UgPT0g
cGFnZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZC0+ZGV0YWNoQ3VycmVudFBhZ2UoKTsKKyAg
ICBkLT5wYWdlID0gcGFnZTsKKworICAgIGlmIChkLT5wYWdlKSB7CisgICAgICAgIGQtPnBhZ2Ut
PnNldFZpZXcodGhpcyk7CisgICAgICAgIGQtPnBhZ2UtPnNldFBhbGV0dGUocGFsZXR0ZSgpKTsK
KyAgICAgICAgLy8gIyMjIyBjb25uZWN0IHNpZ25hbHMKKyAgICAgICAgUVdlYkZyYW1lICptYWlu
RnJhbWUgPSBkLT5wYWdlLT5tYWluRnJhbWUoKTsKKyAgICAgICAgY29ubmVjdChtYWluRnJhbWUs
IFNJR05BTCh0aXRsZUNoYW5nZWQoUVN0cmluZykpLAorICAgICAgICAgICAgICAgIHRoaXMsIFNJ
R05BTCh0aXRsZUNoYW5nZWQoUVN0cmluZykpKTsKKyAgICAgICAgY29ubmVjdChtYWluRnJhbWUs
IFNJR05BTChpY29uQ2hhbmdlZCgpKSwKKyAgICAgICAgICAgICAgICB0aGlzLCBTSUdOQUwoaWNv
bkNoYW5nZWQoKSkpOworICAgICAgICBjb25uZWN0KG1haW5GcmFtZSwgU0lHTkFMKHVybENoYW5n
ZWQoUVVybCkpLAorICAgICAgICAgICAgICAgIHRoaXMsIFNJR05BTCh1cmxDaGFuZ2VkKFFVcmwp
KSk7CisKKyAgICAgICAgY29ubmVjdChkLT5wYWdlLCBTSUdOQUwobG9hZFN0YXJ0ZWQoKSksCisg
ICAgICAgICAgICAgICAgdGhpcywgU0lHTkFMKGxvYWRTdGFydGVkKCkpKTsKKyAgICAgICAgY29u
bmVjdChkLT5wYWdlLCBTSUdOQUwobG9hZFByb2dyZXNzKGludCkpLAorICAgICAgICAgICAgICAg
IHRoaXMsIFNJR05BTChsb2FkUHJvZ3Jlc3MoaW50KSkpOworICAgICAgICBjb25uZWN0KGQtPnBh
Z2UsIFNJR05BTChsb2FkRmluaXNoZWQoYm9vbCkpLAorICAgICAgICAgICAgICAgIHRoaXMsIFNJ
R05BTChsb2FkRmluaXNoZWQoYm9vbCkpKTsKKyAgICAgICAgY29ubmVjdChkLT5wYWdlLCBTSUdO
QUwoc3RhdHVzQmFyTWVzc2FnZShRU3RyaW5nKSksCisgICAgICAgICAgICAgICAgdGhpcywgU0lH
TkFMKHN0YXR1c0Jhck1lc3NhZ2UoUVN0cmluZykpKTsKKyAgICAgICAgY29ubmVjdChkLT5wYWdl
LCBTSUdOQUwobGlua0NsaWNrZWQoUVVybCkpLAorICAgICAgICAgICAgICAgIHRoaXMsIFNJR05B
TChsaW5rQ2xpY2tlZChRVXJsKSkpOworICAgICAgICBjb25uZWN0KGQtPnBhZ2UsIFNJR05BTChz
ZWxlY3Rpb25DaGFuZ2VkKCkpLAorICAgICAgICAgICAgICAgIHRoaXMsIFNJR05BTChzZWxlY3Rp
b25DaGFuZ2VkKCkpKTsKKworICAgICAgICBjb25uZWN0KGQtPnBhZ2UsIFNJR05BTChtaWNyb0Zv
Y3VzQ2hhbmdlZCgpKSwKKyAgICAgICAgICAgICAgICB0aGlzLCBTTE9UKHVwZGF0ZU1pY3JvRm9j
dXMoKSkpOworICAgICAgICBjb25uZWN0KGQtPnBhZ2UsIFNJR05BTChkZXN0cm95ZWQoKSksCisg
ICAgICAgICAgICAgICAgdGhpcywgU0xPVChfcV9wYWdlRGVzdHJveWVkKCkpKTsKKyAgICB9Cisg
ICAgc2V0QXR0cmlidXRlKFF0OjpXQV9PcGFxdWVQYWludEV2ZW50LCBkLT5wYWdlKTsKKyAgICB1
cGRhdGUoKTsKK30KKworLyohCisgICAgTG9hZHMgdGhlIHNwZWNpZmllZCBcYSB1cmwgYW5kIGRp
c3BsYXlzIGl0LgorCisgICAgXG5vdGUgVGhlIHZpZXcgcmVtYWlucyB0aGUgc2FtZSB1bnRpbCBl
bm91Z2ggZGF0YSBoYXMgYXJyaXZlZCB0byBkaXNwbGF5IHRoZSBuZXcgXGEgdXJsLgorCisgICAg
XHNhIHNldFVybCgpLCB1cmwoKSwgdXJsQ2hhbmdlZCgpLCBRVXJsOjpmcm9tVXNlcklucHV0KCkK
KyovCit2b2lkIFFXZWJWaWV3Ojpsb2FkKGNvbnN0IFFVcmwgJnVybCkKK3sKKyAgICBwYWdlKCkt
Pm1haW5GcmFtZSgpLT5sb2FkKHVybCk7Cit9CisKKy8qIQorICAgIFxmbiB2b2lkIFFXZWJWaWV3
Ojpsb2FkKGNvbnN0IFFOZXR3b3JrUmVxdWVzdCAmcmVxdWVzdCwgUU5ldHdvcmtBY2Nlc3NNYW5h
Z2VyOjpPcGVyYXRpb24gb3BlcmF0aW9uLCBjb25zdCBRQnl0ZUFycmF5ICZib2R5KQorCisgICAg
TG9hZHMgYSBuZXR3b3JrIHJlcXVlc3QsIFxhIHJlcXVlc3QsIHVzaW5nIHRoZSBtZXRob2Qgc3Bl
Y2lmaWVkIGluIFxhIG9wZXJhdGlvbi4KKworICAgIFxhIGJvZHkgaXMgb3B0aW9uYWwgYW5kIGlz
IG9ubHkgdXNlZCBmb3IgUE9TVCBvcGVyYXRpb25zLgorCisgICAgXG5vdGUgVGhlIHZpZXcgcmVt
YWlucyB0aGUgc2FtZSB1bnRpbCBlbm91Z2ggZGF0YSBoYXMgYXJyaXZlZCB0byBkaXNwbGF5IHRo
ZSBuZXcgdXJsLgorCisgICAgXHNhIHVybCgpLCB1cmxDaGFuZ2VkKCkKKyovCisKK3ZvaWQgUVdl
YlZpZXc6OmxvYWQoY29uc3QgUU5ldHdvcmtSZXF1ZXN0ICZyZXF1ZXN0LAorICAgICAgICAgICAg
ICAgICAgICBRTmV0d29ya0FjY2Vzc01hbmFnZXI6Ok9wZXJhdGlvbiBvcGVyYXRpb24sCisgICAg
ICAgICAgICAgICAgICAgIGNvbnN0IFFCeXRlQXJyYXkgJmJvZHkpCit7CisgICAgcGFnZSgpLT5t
YWluRnJhbWUoKS0+bG9hZChyZXF1ZXN0LCBvcGVyYXRpb24sIGJvZHkpOworfQorCisvKiEKKyAg
ICBTZXRzIHRoZSBjb250ZW50IG9mIHRoZSB3ZWIgdmlldyB0byB0aGUgc3BlY2lmaWVkIFxhIGh0
bWwuCisKKyAgICBFeHRlcm5hbCBvYmplY3RzIHN1Y2ggYXMgc3R5bGVzaGVldHMgb3IgaW1hZ2Vz
IHJlZmVyZW5jZWQgaW4gdGhlIEhUTUwKKyAgICBkb2N1bWVudCBhcmUgbG9jYXRlZCByZWxhdGl2
ZSB0byBcYSBiYXNlVXJsLgorCisgICAgVGhlIFxhIGh0bWwgaXMgbG9hZGVkIGltbWVkaWF0ZWx5
OyBleHRlcm5hbCBvYmplY3RzIGFyZSBsb2FkZWQgYXN5bmNocm9ub3VzbHkuCisKKyAgICBXaGVu
IHVzaW5nIHRoaXMgbWV0aG9kLCBXZWJLaXQgYXNzdW1lcyB0aGF0IGV4dGVybmFsIHJlc291cmNl
cyBzdWNoIGFzCisgICAgSmF2YVNjcmlwdCBwcm9ncmFtcyBvciBzdHlsZSBzaGVldHMgYXJlIGVu
Y29kZWQgaW4gVVRGLTggdW5sZXNzIG90aGVyd2lzZQorICAgIHNwZWNpZmllZC4gRm9yIGV4YW1w
bGUsIHRoZSBlbmNvZGluZyBvZiBhbiBleHRlcm5hbCBzY3JpcHQgY2FuIGJlIHNwZWNpZmllZAor
ICAgIHRocm91Z2ggdGhlIGNoYXJzZXQgYXR0cmlidXRlIG9mIHRoZSBIVE1MIHNjcmlwdCB0YWcu
IEFsdGVybmF0aXZlbHksIHRoZQorICAgIGVuY29kaW5nIGNhbiBhbHNvIGJlIHNwZWNpZmllZCBi
eSB0aGUgd2ViIHNlcnZlci4KKworICAgIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBmdW5jdGlvbiBl
cXVpdmFsZW50IHRvIHNldENvbnRlbnQoaHRtbCwgInRleHQvaHRtbCIsIGJhc2VVcmwpLgorCisg
ICAgXHdhcm5pbmcgVGhpcyBmdW5jdGlvbiB3b3JrcyBvbmx5IGZvciBIVE1MLCBmb3Igb3RoZXIg
bWltZSB0eXBlcyAoaS5lLiBYSFRNTCwgU1ZHKQorICAgIHNldENvbnRlbnQoKSBzaG91bGQgYmUg
dXNlZCBpbnN0ZWFkLgorCisgICAgXHNhIGxvYWQoKSwgc2V0Q29udGVudCgpLCBRV2ViRnJhbWU6
OnRvSHRtbCgpLCBRV2ViRnJhbWU6OnNldENvbnRlbnQoKQorKi8KK3ZvaWQgUVdlYlZpZXc6OnNl
dEh0bWwoY29uc3QgUVN0cmluZyAmaHRtbCwgY29uc3QgUVVybCAmYmFzZVVybCkKK3sKKyAgICBw
YWdlKCktPm1haW5GcmFtZSgpLT5zZXRIdG1sKGh0bWwsIGJhc2VVcmwpOworfQorCisvKiEKKyAg
ICBTZXRzIHRoZSBjb250ZW50IG9mIHRoZSB3ZWIgdmlldyB0byB0aGUgc3BlY2lmaWVkIGNvbnRl
bnQgXGEgZGF0YS4gSWYgdGhlIFxhIG1pbWVUeXBlIGFyZ3VtZW50CisgICAgaXMgZW1wdHkgaXQg
aXMgY3VycmVudGx5IGFzc3VtZWQgdGhhdCB0aGUgY29udGVudCBpcyBIVE1MIGJ1dCBpbiBmdXR1
cmUgdmVyc2lvbnMgd2UgbWF5IGludHJvZHVjZQorICAgIGF1dG8tZGV0ZWN0aW9uLgorCisgICAg
RXh0ZXJuYWwgb2JqZWN0cyByZWZlcmVuY2VkIGluIHRoZSBjb250ZW50IGFyZSBsb2NhdGVkIHJl
bGF0aXZlIHRvIFxhIGJhc2VVcmwuCisKKyAgICBUaGUgXGEgZGF0YSBpcyBsb2FkZWQgaW1tZWRp
YXRlbHk7IGV4dGVybmFsIG9iamVjdHMgYXJlIGxvYWRlZCBhc3luY2hyb25vdXNseS4KKworICAg
IFxzYSBsb2FkKCksIHNldEh0bWwoKSwgUVdlYkZyYW1lOjp0b0h0bWwoKQorKi8KK3ZvaWQgUVdl
YlZpZXc6OnNldENvbnRlbnQoY29uc3QgUUJ5dGVBcnJheSAmZGF0YSwgY29uc3QgUVN0cmluZyAm
bWltZVR5cGUsIGNvbnN0IFFVcmwgJmJhc2VVcmwpCit7CisgICAgcGFnZSgpLT5tYWluRnJhbWUo
KS0+c2V0Q29udGVudChkYXRhLCBtaW1lVHlwZSwgYmFzZVVybCk7Cit9CisKKy8qIQorICAgIFJl
dHVybnMgYSBwb2ludGVyIHRvIHRoZSB2aWV3J3MgaGlzdG9yeSBvZiBuYXZpZ2F0ZWQgd2ViIHBh
Z2VzLgorCisgICAgSXQgaXMgZXF1aXZhbGVudCB0bworCisgICAgXHNuaXBwZXQgd2Via2l0c25p
cHBldHMvcXR3ZWJraXRfcXdlYnZpZXdfc25pcHBldC5jcHAgMAorKi8KK1FXZWJIaXN0b3J5ICpR
V2ViVmlldzo6aGlzdG9yeSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIHBhZ2UoKS0+aGlzdG9yeSgp
OworfQorCisvKiEKKyAgICBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgdmlldy9wYWdlIHNwZWNp
ZmljIHNldHRpbmdzIG9iamVjdC4KKworICAgIEl0IGlzIGVxdWl2YWxlbnQgdG8KKworICAgIFxz
bmlwcGV0IHdlYmtpdHNuaXBwZXRzL3F0d2Via2l0X3F3ZWJ2aWV3X3NuaXBwZXQuY3BwIDEKKwor
ICAgIFxzYSBRV2ViU2V0dGluZ3M6Omdsb2JhbFNldHRpbmdzKCkKKyovCitRV2ViU2V0dGluZ3Mg
KlFXZWJWaWV3OjpzZXR0aW5ncygpIGNvbnN0Cit7CisgICAgcmV0dXJuIHBhZ2UoKS0+c2V0dGlu
Z3MoKTsKK30KKworLyohCisgICAgXHByb3BlcnR5IFFXZWJWaWV3Ojp0aXRsZQorICAgIFxicmll
ZiB0aGUgdGl0bGUgb2YgdGhlIHdlYiBwYWdlIGN1cnJlbnRseSB2aWV3ZWQKKworICAgIEJ5IGRl
ZmF1bHQsIHRoaXMgcHJvcGVydHkgY29udGFpbnMgYW4gZW1wdHkgc3RyaW5nLgorCisgICAgXHNh
IHRpdGxlQ2hhbmdlZCgpCisqLworUVN0cmluZyBRV2ViVmlldzo6dGl0bGUoKSBjb25zdAorewor
ICAgIGlmIChkLT5wYWdlKQorICAgICAgICByZXR1cm4gZC0+cGFnZS0+bWFpbkZyYW1lKCktPnRp
dGxlKCk7CisgICAgcmV0dXJuIFFTdHJpbmcoKTsKK30KKworLyohCisgICAgXHByb3BlcnR5IFFX
ZWJWaWV3Ojp1cmwKKyAgICBcYnJpZWYgdGhlIHVybCBvZiB0aGUgd2ViIHBhZ2UgY3VycmVudGx5
IHZpZXdlZAorCisgICAgU2V0dGluZyB0aGlzIHByb3BlcnR5IGNsZWFycyB0aGUgdmlldyBhbmQg
bG9hZHMgdGhlIFVSTC4KKworICAgIEJ5IGRlZmF1bHQsIHRoaXMgcHJvcGVydHkgY29udGFpbnMg
YW4gZW1wdHksIGludmFsaWQgVVJMLgorCisgICAgXHNhIGxvYWQoKSwgdXJsQ2hhbmdlZCgpCisq
LworCit2b2lkIFFXZWJWaWV3OjpzZXRVcmwoY29uc3QgUVVybCAmdXJsKQoreworICAgIHBhZ2Uo
KS0+bWFpbkZyYW1lKCktPnNldFVybCh1cmwpOworfQorCitRVXJsIFFXZWJWaWV3Ojp1cmwoKSBj
b25zdAoreworICAgIGlmIChkLT5wYWdlKQorICAgICAgICByZXR1cm4gZC0+cGFnZS0+bWFpbkZy
YW1lKCktPnVybCgpOworICAgIHJldHVybiBRVXJsKCk7Cit9CisKKy8qIQorICAgIFxwcm9wZXJ0
eSBRV2ViVmlldzo6aWNvbgorICAgIFxicmllZiB0aGUgaWNvbiBhc3NvY2lhdGVkIHdpdGggdGhl
IHdlYiBwYWdlIGN1cnJlbnRseSB2aWV3ZWQKKworICAgIEJ5IGRlZmF1bHQsIHRoaXMgcHJvcGVy
dHkgY29udGFpbnMgYSBudWxsIGljb24uCisKKyAgICBcc2EgaWNvbkNoYW5nZWQoKSwgUVdlYlNl
dHRpbmdzOjppY29uRm9yVXJsKCkKKyovCitRSWNvbiBRV2ViVmlldzo6aWNvbigpIGNvbnN0Cit7
CisgICAgaWYgKGQtPnBhZ2UpCisgICAgICAgIHJldHVybiBkLT5wYWdlLT5tYWluRnJhbWUoKS0+
aWNvbigpOworICAgIHJldHVybiBRSWNvbigpOworfQorCisvKiEKKyAgICBccHJvcGVydHkgUVdl
YlZpZXc6Omhhc1NlbGVjdGlvbgorICAgIFxicmllZiB3aGV0aGVyIHRoaXMgcGFnZSBjb250YWlu
cyBzZWxlY3RlZCBjb250ZW50IG9yIG5vdC4KKworICAgIEJ5IGRlZmF1bHQsIHRoaXMgcHJvcGVy
dHkgaXMgZmFsc2UuCisKKyAgICBcc2Egc2VsZWN0aW9uQ2hhbmdlZCgpCisqLworYm9vbCBRV2Vi
Vmlldzo6aGFzU2VsZWN0aW9uKCkgY29uc3QKK3sKKyAgICBpZiAoZC0+cGFnZSkKKyAgICAgICAg
cmV0dXJuIGQtPnBhZ2UtPmhhc1NlbGVjdGlvbigpOworICAgIHJldHVybiBmYWxzZTsKK30KKwor
LyohCisgICAgXHByb3BlcnR5IFFXZWJWaWV3OjpzZWxlY3RlZFRleHQKKyAgICBcYnJpZWYgdGhl
IHRleHQgY3VycmVudGx5IHNlbGVjdGVkCisKKyAgICBCeSBkZWZhdWx0LCB0aGlzIHByb3BlcnR5
IGNvbnRhaW5zIGFuIGVtcHR5IHN0cmluZy4KKworICAgIFxzYSBmaW5kVGV4dCgpLCBzZWxlY3Rp
b25DaGFuZ2VkKCksIHNlbGVjdGVkSHRtbCgpCisqLworUVN0cmluZyBRV2ViVmlldzo6c2VsZWN0
ZWRUZXh0KCkgY29uc3QKK3sKKyAgICBpZiAoZC0+cGFnZSkKKyAgICAgICAgcmV0dXJuIGQtPnBh
Z2UtPnNlbGVjdGVkVGV4dCgpOworICAgIHJldHVybiBRU3RyaW5nKCk7Cit9CisKKy8qIQorICAg
IFxzaW5jZSA0LjgKKyAgICBccHJvcGVydHkgUVdlYlZpZXc6OnNlbGVjdGVkSHRtbAorICAgIFxi
cmllZiB0aGUgSFRNTCBjdXJyZW50bHkgc2VsZWN0ZWQKKworICAgIEJ5IGRlZmF1bHQsIHRoaXMg
cHJvcGVydHkgY29udGFpbnMgYW4gZW1wdHkgc3RyaW5nLgorCisgICAgXHNhIGZpbmRUZXh0KCks
IHNlbGVjdGlvbkNoYW5nZWQoKSwgc2VsZWN0ZWRUZXh0KCkKKyovCitRU3RyaW5nIFFXZWJWaWV3
OjpzZWxlY3RlZEh0bWwoKSBjb25zdAoreworICAgIGlmIChkLT5wYWdlKQorICAgICAgICByZXR1
cm4gZC0+cGFnZS0+c2VsZWN0ZWRIdG1sKCk7CisgICAgcmV0dXJuIFFTdHJpbmcoKTsKK30KKwor
I2lmbmRlZiBRVF9OT19BQ1RJT04KKy8qIQorICAgIFJldHVybnMgYSBwb2ludGVyIHRvIGEgUUFj
dGlvbiB0aGF0IGVuY2Fwc3VsYXRlcyB0aGUgc3BlY2lmaWVkIHdlYiBhY3Rpb24gXGEgYWN0aW9u
LgorKi8KK1FBY3Rpb24gKlFXZWJWaWV3OjpwYWdlQWN0aW9uKFFXZWJQYWdlOjpXZWJBY3Rpb24g
YWN0aW9uKSBjb25zdAoreworICAgIHJldHVybiBwYWdlKCktPmFjdGlvbihhY3Rpb24pOworfQor
I2VuZGlmCisKKy8qIQorICAgIFRyaWdnZXJzIHRoZSBzcGVjaWZpZWQgXGEgYWN0aW9uLiBJZiBp
dCBpcyBhIGNoZWNrYWJsZSBhY3Rpb24gdGhlIHNwZWNpZmllZAorICAgIFxhIGNoZWNrZWQgc3Rh
dGUgaXMgYXNzdW1lZC4KKworICAgIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSB0cmlnZ2VycyB0aGUg
Y29weSBhY3Rpb24gYW5kIHRoZXJlZm9yZSBjb3BpZXMgYW55CisgICAgc2VsZWN0ZWQgdGV4dCB0
byB0aGUgY2xpcGJvYXJkLgorCisgICAgXHNuaXBwZXQgd2Via2l0c25pcHBldHMvcXR3ZWJraXRf
cXdlYnZpZXdfc25pcHBldC5jcHAgMgorCisgICAgXHNhIHBhZ2VBY3Rpb24oKQorKi8KK3ZvaWQg
UVdlYlZpZXc6OnRyaWdnZXJQYWdlQWN0aW9uKFFXZWJQYWdlOjpXZWJBY3Rpb24gYWN0aW9uLCBi
b29sIGNoZWNrZWQpCit7CisgICAgcGFnZSgpLT50cmlnZ2VyQWN0aW9uKGFjdGlvbiwgY2hlY2tl
ZCk7Cit9CisKKy8qIQorICAgIFxwcm9wZXJ0eSBRV2ViVmlldzo6bW9kaWZpZWQKKyAgICBcYnJp
ZWYgd2hldGhlciB0aGUgZG9jdW1lbnQgd2FzIG1vZGlmaWVkIGJ5IHRoZSB1c2VyCisKKyAgICBQ
YXJ0cyBvZiBIVE1MIGRvY3VtZW50cyBjYW4gYmUgZWRpdGFibGUgZm9yIGV4YW1wbGUgdGhyb3Vn
aCB0aGUKKyAgICBcY3tjb250ZW50ZWRpdGFibGV9IGF0dHJpYnV0ZSBvbiBIVE1MIGVsZW1lbnRz
LgorCisgICAgQnkgZGVmYXVsdCwgdGhpcyBwcm9wZXJ0eSBpcyBmYWxzZS4KKyovCitib29sIFFX
ZWJWaWV3Ojppc01vZGlmaWVkKCkgY29uc3QKK3sKKyAgICBpZiAoZC0+cGFnZSkKKyAgICAgICAg
cmV0dXJuIGQtPnBhZ2UtPmlzTW9kaWZpZWQoKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8q
CitRdDo6VGV4dEludGVyYWN0aW9uRmxhZ3MgUVdlYlZpZXc6OnRleHRJbnRlcmFjdGlvbkZsYWdz
KCkgY29uc3QKK3sKKyAgICAvLyAjIyMgRklYTUUgKGFkZCB0byBwYWdlKQorICAgIHJldHVybiBR
dDo6VGV4dEludGVyYWN0aW9uRmxhZ3MoKTsKK30KKyovCisKKy8qCisgICAgXHByb3BlcnR5IFFX
ZWJWaWV3Ojp0ZXh0SW50ZXJhY3Rpb25GbGFncworICAgIFxicmllZiBob3cgdGhlIHZpZXcgc2hv
dWxkIGhhbmRsZSB1c2VyIGlucHV0CisKKyAgICBTcGVjaWZpZXMgaG93IHRoZSB1c2VyIGNhbiBp
bnRlcmFjdCB3aXRoIHRoZSB0ZXh0IG9uIHRoZSBwYWdlLgorKi8KKworLyoKK3ZvaWQgUVdlYlZp
ZXc6OnNldFRleHRJbnRlcmFjdGlvbkZsYWdzKFF0OjpUZXh0SW50ZXJhY3Rpb25GbGFncyBmbGFn
cykKK3sKKyAgICBRX1VOVVNFRChmbGFncykKKyAgICAvLyAjIyMgRklYTUUgKGFkZCB0byBwYWdl
KQorfQorKi8KKworLyohCisgICAgXHJlaW1wCisqLworUVNpemUgUVdlYlZpZXc6OnNpemVIaW50
KCkgY29uc3QKK3sKKyAgICByZXR1cm4gUVNpemUoODAwLCA2MDApOyAvLyAjIyMjLi4uCit9CisK
Ky8qIQorICAgIFxwcm9wZXJ0eSBRV2ViVmlldzo6em9vbUZhY3RvcgorICAgIFxzaW5jZSA0LjUK
KyAgICBcYnJpZWYgdGhlIHpvb20gZmFjdG9yIGZvciB0aGUgdmlldworKi8KKwordm9pZCBRV2Vi
Vmlldzo6c2V0Wm9vbUZhY3RvcihxcmVhbCBmYWN0b3IpCit7CisgICAgcGFnZSgpLT5tYWluRnJh
bWUoKS0+c2V0Wm9vbUZhY3RvcihmYWN0b3IpOworfQorCitxcmVhbCBRV2ViVmlldzo6em9vbUZh
Y3RvcigpIGNvbnN0Cit7CisgICAgcmV0dXJuIHBhZ2UoKS0+bWFpbkZyYW1lKCktPnpvb21GYWN0
b3IoKTsKK30KKworLyohCisgIFxwcm9wZXJ0eSBRV2ViVmlldzo6dGV4dFNpemVNdWx0aXBsaWVy
CisgIFxicmllZiB0aGUgc2NhbGluZyBmYWN0b3IgZm9yIGFsbCB0ZXh0IGluIHRoZSBmcmFtZQor
ICBcb2Jzb2xldGUKKworICBVc2Ugc2V0Wm9vbUZhY3RvciBpbnN0ZWFkLCBpbiBjb21iaW5hdGlv
biB3aXRoIHRoZQorICBab29tVGV4dE9ubHkgYXR0cmlidXRlIGluIFFXZWJTZXR0aW5ncy4KKwor
ICBcbm90ZSBTZXR0aW5nIHRoaXMgcHJvcGVydHkgYWxzbyBlbmFibGVzIHRoZQorICBab29tVGV4
dE9ubHkgYXR0cmlidXRlIGluIFFXZWJTZXR0aW5ncy4KKworICBCeSBkZWZhdWx0LCB0aGlzIHBy
b3BlcnR5IGNvbnRhaW5zIGEgdmFsdWUgb2YgMS4wLgorKi8KKworLyohCisgICAgU2V0cyB0aGUg
dmFsdWUgb2YgdGhlIG11bHRpcGxpZXIgdXNlZCB0byBzY2FsZSB0aGUgdGV4dCBpbiBhIFdlYiBw
YWdlIHRvCisgICAgdGhlIFxhIGZhY3RvciBzcGVjaWZpZWQuCisqLwordm9pZCBRV2ViVmlldzo6
c2V0VGV4dFNpemVNdWx0aXBsaWVyKHFyZWFsIGZhY3RvcikKK3sKKyAgICBwYWdlKCktPm1haW5G
cmFtZSgpLT5zZXRUZXh0U2l6ZU11bHRpcGxpZXIoZmFjdG9yKTsKK30KKworLyohCisgICAgUmV0
dXJucyB0aGUgdmFsdWUgb2YgdGhlIG11bHRpcGxpZXIgdXNlZCB0byBzY2FsZSB0aGUgdGV4dCBp
biBhIFdlYiBwYWdlLgorKi8KK3FyZWFsIFFXZWJWaWV3Ojp0ZXh0U2l6ZU11bHRpcGxpZXIoKSBj
b25zdAoreworICAgIHJldHVybiBwYWdlKCktPm1haW5GcmFtZSgpLT50ZXh0U2l6ZU11bHRpcGxp
ZXIoKTsKK30KKworLyohCisgICAgXHByb3BlcnR5IFFXZWJWaWV3OjpyZW5kZXJIaW50cworICAg
IFxzaW5jZSA0LjYKKyAgICBcYnJpZWYgdGhlIGRlZmF1bHQgcmVuZGVyIGhpbnRzIGZvciB0aGUg
dmlldworCisgICAgVGhlc2UgaGludHMgYXJlIHVzZWQgdG8gaW5pdGlhbGl6ZSBRUGFpbnRlciBi
ZWZvcmUgcGFpbnRpbmcgdGhlIFdlYiBwYWdlLgorCisgICAgUVBhaW50ZXI6OlRleHRBbnRpYWxp
YXNpbmcgYW5kIFFQYWludGVyOjpTbW9vdGhQaXhtYXBUcmFuc2Zvcm0gYXJlIGVuYWJsZWQgYnkg
ZGVmYXVsdC4KKworICAgIFxzYSBRUGFpbnRlcjo6cmVuZGVySGludHMoKQorKi8KKworLyohCisg
ICAgXHNpbmNlIDQuNgorICAgIFJldHVybnMgdGhlIHJlbmRlciBoaW50cyB1c2VkIGJ5IHRoZSB2
aWV3IHRvIHJlbmRlciBjb250ZW50LgorCisgICAgXHNhIFFQYWludGVyOjpyZW5kZXJIaW50cygp
CisqLworUVBhaW50ZXI6OlJlbmRlckhpbnRzIFFXZWJWaWV3OjpyZW5kZXJIaW50cygpIGNvbnN0
Cit7CisgICAgcmV0dXJuIGQtPnJlbmRlckhpbnRzOworfQorCisvKiEKKyAgICBcc2luY2UgNC42
CisgICAgU2V0cyB0aGUgcmVuZGVyIGhpbnRzIHVzZWQgYnkgdGhlIHZpZXcgdG8gdGhlIHNwZWNp
ZmllZCBcYSBoaW50cy4KKworICAgIFxzYSBRUGFpbnRlcjo6c2V0UmVuZGVySGludHMoKQorKi8K
K3ZvaWQgUVdlYlZpZXc6OnNldFJlbmRlckhpbnRzKFFQYWludGVyOjpSZW5kZXJIaW50cyBoaW50
cykKK3sKKyAgICBpZiAoaGludHMgPT0gZC0+cmVuZGVySGludHMpCisgICAgICAgIHJldHVybjsK
KyAgICBkLT5yZW5kZXJIaW50cyA9IGhpbnRzOworICAgIHVwZGF0ZSgpOworfQorCisvKiEKKyAg
ICBcc2luY2UgNC42CisgICAgSWYgXGEgZW5hYmxlZCBpcyB0cnVlLCBlbmFibGVzIHRoZSBzcGVj
aWZpZWQgcmVuZGVyIFxhIGhpbnQ7IG90aGVyd2lzZQorICAgIGRpc2FibGVzIGl0LgorCisgICAg
XHNhIHJlbmRlckhpbnRzLCBRUGFpbnRlcjo6cmVuZGVySGludHMoKQorKi8KK3ZvaWQgUVdlYlZp
ZXc6OnNldFJlbmRlckhpbnQoUVBhaW50ZXI6OlJlbmRlckhpbnQgaGludCwgYm9vbCBlbmFibGVk
KQoreworICAgIFFQYWludGVyOjpSZW5kZXJIaW50cyBvbGRIaW50cyA9IGQtPnJlbmRlckhpbnRz
OworICAgIGlmIChlbmFibGVkKQorICAgICAgICBkLT5yZW5kZXJIaW50cyB8PSBoaW50OworICAg
IGVsc2UKKyAgICAgICAgZC0+cmVuZGVySGludHMgJj0gfmhpbnQ7CisgICAgaWYgKG9sZEhpbnRz
ICE9IGQtPnJlbmRlckhpbnRzKQorICAgICAgICB1cGRhdGUoKTsKK30KKworCisvKiEKKyAgICBG
aW5kcyB0aGUgc3BlY2lmaWVkIHN0cmluZywgXGEgc3ViU3RyaW5nLCBpbiB0aGUgcGFnZSwgdXNp
bmcgdGhlIGdpdmVuIFxhIG9wdGlvbnMuCisKKyAgICBJZiB0aGUgSGlnaGxpZ2h0QWxsT2NjdXJy
ZW5jZXMgZmxhZyBpcyBwYXNzZWQsIHRoZSBmdW5jdGlvbiB3aWxsIGhpZ2hsaWdodCBhbGwgb2Nj
dXJyZW5jZXMKKyAgICB0aGF0IGV4aXN0IGluIHRoZSBwYWdlLiBBbGwgc3Vic2VxdWVudCBjYWxs
cyB3aWxsIGV4dGVuZCB0aGUgaGlnaGxpZ2h0LCByYXRoZXIgdGhhbgorICAgIHJlcGxhY2UgaXQs
IHdpdGggb2NjdXJyZW5jZXMgb2YgdGhlIG5ldyBzdHJpbmcuCisKKyAgICBJZiB0aGUgSGlnaGxp
Z2h0QWxsT2NjdXJyZW5jZXMgZmxhZyBpcyBub3QgcGFzc2VkLCB0aGUgZnVuY3Rpb24gd2lsbCBz
ZWxlY3QgYW4gb2NjdXJyZW5jZQorICAgIGFuZCBhbGwgc3Vic2VxdWVudCBjYWxscyB3aWxsIHJl
cGxhY2UgdGhlIGN1cnJlbnQgb2NjdXJyZW5jZSB3aXRoIHRoZSBuZXh0IG9uZS4KKworICAgIFRv
IGNsZWFyIHRoZSBzZWxlY3Rpb24sIGp1c3QgcGFzcyBhbiBlbXB0eSBzdHJpbmcuCisKKyAgICBS
ZXR1cm5zIHRydWUgaWYgXGEgc3ViU3RyaW5nIHdhcyBmb3VuZDsgb3RoZXJ3aXNlIHJldHVybnMg
ZmFsc2UuCisKKyAgICBcc2Egc2VsZWN0ZWRUZXh0KCksIHNlbGVjdGlvbkNoYW5nZWQoKQorKi8K
K2Jvb2wgUVdlYlZpZXc6OmZpbmRUZXh0KGNvbnN0IFFTdHJpbmcgJnN1YlN0cmluZywgUVdlYlBh
Z2U6OkZpbmRGbGFncyBvcHRpb25zKQoreworICAgIGlmIChkLT5wYWdlKQorICAgICAgICByZXR1
cm4gZC0+cGFnZS0+ZmluZFRleHQoc3ViU3RyaW5nLCBvcHRpb25zKTsKKyAgICByZXR1cm4gZmFs
c2U7Cit9CisKKy8qISBccmVpbXAKKyovCitib29sIFFXZWJWaWV3OjpldmVudChRRXZlbnQgKmUp
Cit7CisgICAgaWYgKGQtPnBhZ2UpIHsKKyNpZm5kZWYgUVRfTk9fQ09OVEVYVE1FTlUKKyAgICAg
ICAgaWYgKGUtPnR5cGUoKSA9PSBRRXZlbnQ6OkNvbnRleHRNZW51KSB7CisgICAgICAgICAgICBp
ZiAoIWlzRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAg
ICAgIFFDb250ZXh0TWVudUV2ZW50ICpldmVudCA9IHN0YXRpY19jYXN0PFFDb250ZXh0TWVudUV2
ZW50ICo+KGUpOworICAgICAgICAgICAgaWYgKGQtPnBhZ2UtPnN3YWxsb3dDb250ZXh0TWVudUV2
ZW50KGV2ZW50KSkgeworICAgICAgICAgICAgICAgIGUtPmFjY2VwdCgpOworICAgICAgICAgICAg
ICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZC0+cGFnZS0+dXBk
YXRlUG9zaXRpb25EZXBlbmRlbnRBY3Rpb25zKGV2ZW50LT5wb3MoKSk7CisgICAgICAgIH0gZWxz
ZQorI2VuZGlmIC8vIFFUX05PX0NPTlRFWFRNRU5VCisgICAgICAgIGlmIChlLT50eXBlKCkgPT0g
UUV2ZW50OjpTaG9ydGN1dE92ZXJyaWRlKSB7CisgICAgICAgICAgICBkLT5wYWdlLT5ldmVudChl
KTsKKyNpZm5kZWYgUVRfTk9fQ1VSU09SCisgICAgICAgIH0gZWxzZSBpZiAoZS0+dHlwZSgpID09
IFFFdmVudDo6Q3Vyc29yQ2hhbmdlKSB7CisgICAgICAgICAgICAvLyBBbiB1bnNldEN1cnNvciB3
aWxsIHNldCB0aGUgY3Vyc29yIHRvIFF0OjpBcnJvd0N1cnNvci4KKyAgICAgICAgICAgIC8vIFRo
dXMgdGhpcyBjdXJzb3IgY2hhbmdlIG1pZ2h0IGJlIGEgUVdpZGdldDo6dW5zZXRDdXJzb3IoKQor
ICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBub3QgdGhlIGNhc2UgYW5kIGl0IGNhbWUgZnJvbSBX
ZWJDb3JlLCB0aGUKKyAgICAgICAgICAgIC8vIFFXZWJQYWdlQ2xpZW50IGFscmVhZHkgaGFzIHNl
dCBpdHMgY3Vyc29yIGludGVybmFsbHkKKyAgICAgICAgICAgIC8vIHRvIFF0OjpBcnJvd0N1cnNv
ciwgc28gdXBkYXRpbmcgdGhlIGN1cnNvciBpcyBhbHdheXMKKyAgICAgICAgICAgIC8vIHJpZ2h0
LCBhcyBpdCBmYWxscyBiYWNrIHRvIHRoZSBsYXN0IGN1cnNvciBzZXQgYnkKKyAgICAgICAgICAg
IC8vIFdlYkNvcmUuCisgICAgICAgICAgICAvLyBGSVhNRTogQWRkIGEgUUV2ZW50OjpDdXJzb3JV
bnNldCBvciBzaW1pbGFyIHRvIFF0LgorICAgICAgICAgICAgaWYgKGN1cnNvcigpLnNoYXBlKCkg
PT0gUXQ6OkFycm93Q3Vyc29yKQorICAgICAgICAgICAgICAgIGQtPnBhZ2UtPmQtPmNsaWVudC0+
cmVzZXRDdXJzb3IoKTsKKyNlbmRpZgorICAgICAgICB9IGVsc2UgaWYgKGUtPnR5cGUoKSA9PSBR
RXZlbnQ6OlRvdWNoQmVnaW4gCisgICAgICAgICAgICAgICAgICAgfHwgZS0+dHlwZSgpID09IFFF
dmVudDo6VG91Y2hFbmQgCisgICAgICAgICAgICAgICAgICAgfHwgZS0+dHlwZSgpID09IFFFdmVu
dDo6VG91Y2hVcGRhdGUKKyAgICAgICAgICAgICAgICAgICB8fCBlLT50eXBlKCkgPT0gUUV2ZW50
OjpUb3VjaENhbmNlbAorICAgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICBkLT5wYWdl
LT5ldmVudChlKTsKKworICAgICAgICAgICAgLy8gQWx3YXlzIHJldHVybiB0cnVlIHNvIHRoYXQg
d2UnbGwgcmVjZWl2ZSBhbHNvIFRvdWNoVXBkYXRlIGFuZCBUb3VjaEVuZCBldmVudHMKKyAgICAg
ICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKGUtPnR5cGUoKSA9PSBRRXZl
bnQ6OkxlYXZlKQorICAgICAgICAgICAgZC0+cGFnZS0+ZXZlbnQoZSk7CisgICAgfQorCisgICAg
cmV0dXJuIFFXaWRnZXQ6OmV2ZW50KGUpOworfQorCisvKiEKKyAgICBQcmludHMgdGhlIG1haW4g
ZnJhbWUgdG8gdGhlIGdpdmVuIFxhIHByaW50ZXIuCisKKyAgICBcc2EgUVdlYkZyYW1lOjpwcmlu
dCgpLCBRUHJpbnRQcmV2aWV3RGlhbG9nCisqLwordm9pZCBRV2ViVmlldzo6cHJpbnQoUVByaW50
ZXIgKnByaW50ZXIpIGNvbnN0Cit7CisjaWYgIWRlZmluZWQoUVRfTk9fUFJJTlRFUikgJiYgSEFW
RShRVFBSSU5UU1VQUE9SVCkKKyAgICBwYWdlKCktPm1haW5GcmFtZSgpLT5wcmludChwcmludGVy
KTsKKyNlbmRpZgorfQorCisvKiEKKyAgICBDb252ZW5pZW5jZSBzbG90IHRoYXQgc3RvcHMgbG9h
ZGluZyB0aGUgZG9jdW1lbnQuCisKKyAgICBJdCBpcyBlcXVpdmFsZW50IHRvCisKKyAgICBcc25p
cHBldCB3ZWJraXRzbmlwcGV0cy9xdHdlYmtpdF9xd2Vidmlld19zbmlwcGV0LmNwcCAzCisKKyAg
ICBcc2EgcmVsb2FkKCksIHBhZ2VBY3Rpb24oKSwgbG9hZEZpbmlzaGVkKCkKKyovCit2b2lkIFFX
ZWJWaWV3OjpzdG9wKCkKK3sKKyAgICBpZiAoZC0+cGFnZSkKKyAgICAgICAgZC0+cGFnZS0+dHJp
Z2dlckFjdGlvbihRV2ViUGFnZTo6U3RvcCk7Cit9CisKKy8qIQorICAgIENvbnZlbmllbmNlIHNs
b3QgdGhhdCBsb2FkcyB0aGUgcHJldmlvdXMgZG9jdW1lbnQgaW4gdGhlIGxpc3Qgb2YgZG9jdW1l
bnRzCisgICAgYnVpbHQgYnkgbmF2aWdhdGluZyBsaW5rcy4gRG9lcyBub3RoaW5nIGlmIHRoZXJl
IGlzIG5vIHByZXZpb3VzIGRvY3VtZW50LgorCisgICAgSXQgaXMgZXF1aXZhbGVudCB0bworCisg
ICAgXHNuaXBwZXQgd2Via2l0c25pcHBldHMvcXR3ZWJraXRfcXdlYnZpZXdfc25pcHBldC5jcHAg
NAorCisgICAgXHNhIGZvcndhcmQoKSwgcGFnZUFjdGlvbigpCisqLwordm9pZCBRV2ViVmlldzo6
YmFjaygpCit7CisgICAgaWYgKGQtPnBhZ2UpCisgICAgICAgIGQtPnBhZ2UtPnRyaWdnZXJBY3Rp
b24oUVdlYlBhZ2U6OkJhY2spOworfQorCisvKiEKKyAgICBDb252ZW5pZW5jZSBzbG90IHRoYXQg
bG9hZHMgdGhlIG5leHQgZG9jdW1lbnQgaW4gdGhlIGxpc3Qgb2YgZG9jdW1lbnRzCisgICAgYnVp
bHQgYnkgbmF2aWdhdGluZyBsaW5rcy4gRG9lcyBub3RoaW5nIGlmIHRoZXJlIGlzIG5vIG5leHQg
ZG9jdW1lbnQuCisKKyAgICBJdCBpcyBlcXVpdmFsZW50IHRvCisKKyAgICBcc25pcHBldCB3ZWJr
aXRzbmlwcGV0cy9xdHdlYmtpdF9xd2Vidmlld19zbmlwcGV0LmNwcCA1CisKKyAgICBcc2EgYmFj
aygpLCBwYWdlQWN0aW9uKCkKKyovCit2b2lkIFFXZWJWaWV3Ojpmb3J3YXJkKCkKK3sKKyAgICBp
ZiAoZC0+cGFnZSkKKyAgICAgICAgZC0+cGFnZS0+dHJpZ2dlckFjdGlvbihRV2ViUGFnZTo6Rm9y
d2FyZCk7Cit9CisKKy8qIQorICAgIFJlbG9hZHMgdGhlIGN1cnJlbnQgZG9jdW1lbnQuCisKKyAg
ICBcc2Egc3RvcCgpLCBwYWdlQWN0aW9uKCksIGxvYWRTdGFydGVkKCkKKyovCit2b2lkIFFXZWJW
aWV3OjpyZWxvYWQoKQoreworICAgIGlmIChkLT5wYWdlKQorICAgICAgICBkLT5wYWdlLT50cmln
Z2VyQWN0aW9uKFFXZWJQYWdlOjpSZWxvYWQpOworfQorCisvKiEgXHJlaW1wCisqLwordm9pZCBR
V2ViVmlldzo6cmVzaXplRXZlbnQoUVJlc2l6ZUV2ZW50ICplKQoreworICAgIGlmIChkLT5wYWdl
KQorICAgICAgICBkLT5wYWdlLT5zZXRWaWV3cG9ydFNpemUoZS0+c2l6ZSgpKTsKK30KKworLyoh
IFxyZWltcAorKi8KK3ZvaWQgUVdlYlZpZXc6OnBhaW50RXZlbnQoUVBhaW50RXZlbnQgKmV2KQor
eworICAgIGlmICghZC0+cGFnZSkKKyAgICAgICAgcmV0dXJuOworI2lmZGVmIFFXRUJLSVRfVElN
RV9SRU5ERVJJTkcKKyAgICBRVGltZSB0aW1lOworICAgIHRpbWUuc3RhcnQoKTsKKyNlbmRpZgor
CisgICAgUVdlYkZyYW1lICpmcmFtZSA9IGQtPnBhZ2UtPm1haW5GcmFtZSgpOworICAgIFFQYWlu
dGVyIHAodGhpcyk7CisgICAgcC5zZXRSZW5kZXJIaW50cyhkLT5yZW5kZXJIaW50cyk7CisKKyAg
ICBmcmFtZS0+cmVuZGVyKCZwLCBldi0+cmVnaW9uKCkpOworCisjaWZkZWYgICAgUVdFQktJVF9U
SU1FX1JFTkRFUklORworICAgIGludCBlbGFwc2VkID0gdGltZS5lbGFwc2VkKCk7CisgICAgcURl
YnVnKCkgPDwgInBhaW50IGV2ZW50IG9uICIgPDwgZXYtPnJlZ2lvbigpIDw8ICIsIHRvb2sgdG8g
cmVuZGVyID0gICIgPDwgZWxhcHNlZDsKKyNlbmRpZgorfQorCisvKiEKKyAgICBUaGlzIGZ1bmN0
aW9uIGlzIGNhbGxlZCBmcm9tIHRoZSBjcmVhdGVXaW5kb3coKSBtZXRob2Qgb2YgdGhlIGFzc29j
aWF0ZWQgUVdlYlBhZ2UsCisgICAgZWFjaCB0aW1lIHRoZSBwYWdlIHdhbnRzIHRvIGNyZWF0ZSBh
IG5ldyB3aW5kb3cgb2YgdGhlIGdpdmVuIFxhIHR5cGUuIFRoaXMgbWlnaHQKKyAgICBiZSB0aGUg
cmVzdWx0LCBmb3IgZXhhbXBsZSwgb2YgYSBKYXZhU2NyaXB0IHJlcXVlc3QgdG8gb3BlbiBhIGRv
Y3VtZW50IGluIGEgbmV3IHdpbmRvdy4KKworICAgIFxub3RlIElmIHRoZSBjcmVhdGVXaW5kb3co
KSBtZXRob2Qgb2YgdGhlIGFzc29jaWF0ZWQgcGFnZSBpcyByZWltcGxlbWVudGVkLCB0aGlzCisg
ICAgbWV0aG9kIGlzIG5vdCBjYWxsZWQsIHVubGVzcyBleHBsaWNpdGx5IGRvbmUgc28gaW4gdGhl
IHJlaW1wbGVtZW50YXRpb24uCisKKyAgICBcbm90ZSBJbiB0aGUgY2FzZXMgd2hlbiB0aGUgd2lu
ZG93IGNyZWF0aW9uIGlzIGJlaW5nIHRyaWdnZXJlZCBieSBKYXZhU2NyaXB0LCBhcGFydCBmcm9t
CisgICAgcmVpbXBsZW1lbnRpbmcgdGhpcyBtZXRob2QgYXBwbGljYXRpb24gbXVzdCBhbHNvIHNl
dCB0aGUgSmF2YVNjcmlwdENhbk9wZW5XaW5kb3dzIGF0dHJpYnV0ZQorICAgIG9mIFFXZWJTZXR0
aW5ncyB0byB0cnVlIGluIG9yZGVyIGZvciBpdCB0byBnZXQgY2FsbGVkLgorCisgICAgXHNhIFFX
ZWJQYWdlOjpjcmVhdGVXaW5kb3coKSwgUVdlYlBhZ2U6OmFjY2VwdE5hdmlnYXRpb25SZXF1ZXN0
KCkKKyovCitRV2ViVmlldyAqUVdlYlZpZXc6OmNyZWF0ZVdpbmRvdyhRV2ViUGFnZTo6V2ViV2lu
ZG93VHlwZSB0eXBlKQoreworICAgIFFfVU5VU0VEKHR5cGUpCisgICAgcmV0dXJuIDA7Cit9CisK
Ky8qISBccmVpbXAKKyovCit2b2lkIFFXZWJWaWV3Ojptb3VzZU1vdmVFdmVudChRTW91c2VFdmVu
dCogZXYpCit7CisgICAgaWYgKGQtPnBhZ2UpIHsKKyAgICAgICAgY29uc3QgYm9vbCBhY2NlcHRl
ZCA9IGV2LT5pc0FjY2VwdGVkKCk7CisgICAgICAgIGQtPnBhZ2UtPmV2ZW50KGV2KTsKKyAgICAg
ICAgZXYtPnNldEFjY2VwdGVkKGFjY2VwdGVkKTsKKyAgICB9Cit9CisKKy8qISBccmVpbXAKKyov
Cit2b2lkIFFXZWJWaWV3Ojptb3VzZVByZXNzRXZlbnQoUU1vdXNlRXZlbnQqIGV2KQoreworICAg
IGlmIChkLT5wYWdlKSB7CisgICAgICAgIGNvbnN0IGJvb2wgYWNjZXB0ZWQgPSBldi0+aXNBY2Nl
cHRlZCgpOworICAgICAgICBkLT5wYWdlLT5ldmVudChldik7CisgICAgICAgIGV2LT5zZXRBY2Nl
cHRlZChhY2NlcHRlZCk7CisgICAgfQorfQorCisvKiEgXHJlaW1wCisqLwordm9pZCBRV2ViVmll
dzo6bW91c2VEb3VibGVDbGlja0V2ZW50KFFNb3VzZUV2ZW50KiBldikKK3sKKyAgICBpZiAoZC0+
cGFnZSkgeworICAgICAgICBjb25zdCBib29sIGFjY2VwdGVkID0gZXYtPmlzQWNjZXB0ZWQoKTsK
KyAgICAgICAgZC0+cGFnZS0+ZXZlbnQoZXYpOworICAgICAgICBldi0+c2V0QWNjZXB0ZWQoYWNj
ZXB0ZWQpOworICAgIH0KK30KKworLyohIFxyZWltcAorKi8KK3ZvaWQgUVdlYlZpZXc6Om1vdXNl
UmVsZWFzZUV2ZW50KFFNb3VzZUV2ZW50KiBldikKK3sKKyAgICBpZiAoZC0+cGFnZSkgeworICAg
ICAgICBjb25zdCBib29sIGFjY2VwdGVkID0gZXYtPmlzQWNjZXB0ZWQoKTsKKyAgICAgICAgZC0+
cGFnZS0+ZXZlbnQoZXYpOworICAgICAgICBldi0+c2V0QWNjZXB0ZWQoYWNjZXB0ZWQpOworICAg
IH0KK30KKworI2lmbmRlZiBRVF9OT19DT05URVhUTUVOVQorLyohIFxyZWltcAorKi8KK3ZvaWQg
UVdlYlZpZXc6OmNvbnRleHRNZW51RXZlbnQoUUNvbnRleHRNZW51RXZlbnQqIGV2KQoreworICAg
IGlmIChkLT5wYWdlKSB7CisgICAgICAgIGNvbnN0IGJvb2wgYWNjZXB0ZWQgPSBldi0+aXNBY2Nl
cHRlZCgpOworICAgICAgICBkLT5wYWdlLT5ldmVudChldik7CisgICAgICAgIGV2LT5zZXRBY2Nl
cHRlZChhY2NlcHRlZCk7CisgICAgfQorfQorI2VuZGlmIC8vIFFUX05PX0NPTlRFWFRNRU5VCisK
KyNpZm5kZWYgUVRfTk9fV0hFRUxFVkVOVAorLyohIFxyZWltcAorKi8KK3ZvaWQgUVdlYlZpZXc6
OndoZWVsRXZlbnQoUVdoZWVsRXZlbnQqIGV2KQoreworICAgIGlmIChkLT5wYWdlKSB7CisgICAg
ICAgIGNvbnN0IGJvb2wgYWNjZXB0ZWQgPSBldi0+aXNBY2NlcHRlZCgpOworICAgICAgICBkLT5w
YWdlLT5ldmVudChldik7CisgICAgICAgIGV2LT5zZXRBY2NlcHRlZChhY2NlcHRlZCk7CisgICAg
fQorfQorI2VuZGlmIC8vIFFUX05PX1dIRUVMRVZFTlQKKworLyohIFxyZWltcAorKi8KK3ZvaWQg
UVdlYlZpZXc6OmtleVByZXNzRXZlbnQoUUtleUV2ZW50KiBldikKK3sKKyAgICBpZiAoZC0+cGFn
ZSkKKyAgICAgICAgZC0+cGFnZS0+ZXZlbnQoZXYpOworICAgIGlmICghZXYtPmlzQWNjZXB0ZWQo
KSkKKyAgICAgICAgUVdpZGdldDo6a2V5UHJlc3NFdmVudChldik7Cit9CisKKy8qISBccmVpbXAK
KyovCit2b2lkIFFXZWJWaWV3OjprZXlSZWxlYXNlRXZlbnQoUUtleUV2ZW50KiBldikKK3sKKyAg
ICBpZiAoZC0+cGFnZSkKKyAgICAgICAgZC0+cGFnZS0+ZXZlbnQoZXYpOworICAgIGlmICghZXYt
PmlzQWNjZXB0ZWQoKSkKKyAgICAgICAgUVdpZGdldDo6a2V5UmVsZWFzZUV2ZW50KGV2KTsKK30K
KworLyohIFxyZWltcAorKi8KK3ZvaWQgUVdlYlZpZXc6OmZvY3VzSW5FdmVudChRRm9jdXNFdmVu
dCogZXYpCit7CisgICAgaWYgKGQtPnBhZ2UpCisgICAgICAgIGQtPnBhZ2UtPmV2ZW50KGV2KTsK
KyAgICBlbHNlCisgICAgICAgIFFXaWRnZXQ6OmZvY3VzSW5FdmVudChldik7Cit9CisKKy8qISBc
cmVpbXAKKyovCit2b2lkIFFXZWJWaWV3Ojpmb2N1c091dEV2ZW50KFFGb2N1c0V2ZW50KiBldikK
K3sKKyAgICBpZiAoZC0+cGFnZSkKKyAgICAgICAgZC0+cGFnZS0+ZXZlbnQoZXYpOworICAgIGVs
c2UKKyAgICAgICAgUVdpZGdldDo6Zm9jdXNPdXRFdmVudChldik7Cit9CisKKy8qISBccmVpbXAK
KyovCit2b2lkIFFXZWJWaWV3OjpkcmFnRW50ZXJFdmVudChRRHJhZ0VudGVyRXZlbnQqIGV2KQor
eworI2lmbmRlZiBRVF9OT19EUkFHQU5ERFJPUAorICAgIGlmIChkLT5wYWdlKQorICAgICAgICBk
LT5wYWdlLT5ldmVudChldik7CisjZW5kaWYKK30KKworLyohIFxyZWltcAorKi8KK3ZvaWQgUVdl
YlZpZXc6OmRyYWdMZWF2ZUV2ZW50KFFEcmFnTGVhdmVFdmVudCogZXYpCit7CisjaWZuZGVmIFFU
X05PX0RSQUdBTkREUk9QCisgICAgaWYgKGQtPnBhZ2UpCisgICAgICAgIGQtPnBhZ2UtPmV2ZW50
KGV2KTsKKyNlbmRpZgorfQorCisvKiEgXHJlaW1wCisqLwordm9pZCBRV2ViVmlldzo6ZHJhZ01v
dmVFdmVudChRRHJhZ01vdmVFdmVudCogZXYpCit7CisjaWZuZGVmIFFUX05PX0RSQUdBTkREUk9Q
CisgICAgaWYgKGQtPnBhZ2UpCisgICAgICAgIGQtPnBhZ2UtPmV2ZW50KGV2KTsKKyNlbmRpZgor
fQorCisvKiEgXHJlaW1wCisqLwordm9pZCBRV2ViVmlldzo6ZHJvcEV2ZW50KFFEcm9wRXZlbnQq
IGV2KQoreworI2lmbmRlZiBRVF9OT19EUkFHQU5ERFJPUAorICAgIGlmIChkLT5wYWdlKQorICAg
ICAgICBkLT5wYWdlLT5ldmVudChldik7CisjZW5kaWYKK30KKworLyohIFxyZWltcAorKi8KK2Jv
b2wgUVdlYlZpZXc6OmZvY3VzTmV4dFByZXZDaGlsZChib29sIG5leHQpCit7CisgICAgaWYgKGQt
PnBhZ2UgJiYgZC0+cGFnZS0+Zm9jdXNOZXh0UHJldkNoaWxkKG5leHQpKQorICAgICAgICByZXR1
cm4gdHJ1ZTsKKyAgICByZXR1cm4gUVdpZGdldDo6Zm9jdXNOZXh0UHJldkNoaWxkKG5leHQpOwor
fQorCisvKiFccmVpbXAKKyovCitRVmFyaWFudCBRV2ViVmlldzo6aW5wdXRNZXRob2RRdWVyeShR
dDo6SW5wdXRNZXRob2RRdWVyeSBwcm9wZXJ0eSkgY29uc3QKK3sKKyAgICBpZiAoZC0+cGFnZSkK
KyAgICAgICAgcmV0dXJuIGQtPnBhZ2UtPmlucHV0TWV0aG9kUXVlcnkocHJvcGVydHkpOworICAg
IHJldHVybiBRVmFyaWFudCgpOworfQorCisvKiFccmVpbXAKKyovCit2b2lkIFFXZWJWaWV3Ojpp
bnB1dE1ldGhvZEV2ZW50KFFJbnB1dE1ldGhvZEV2ZW50ICplKQoreworICAgIGlmIChkLT5wYWdl
KQorICAgICAgIGQtPnBhZ2UtPmV2ZW50KGUpOworfQorCisvKiFccmVpbXAKKyovCit2b2lkIFFX
ZWJWaWV3OjpjaGFuZ2VFdmVudChRRXZlbnQgKmUpCit7CisgICAgaWYgKGQtPnBhZ2UgJiYgZS0+
dHlwZSgpID09IFFFdmVudDo6UGFsZXR0ZUNoYW5nZSkKKyAgICAgICAgZC0+cGFnZS0+c2V0UGFs
ZXR0ZShwYWxldHRlKCkpOworICAgIFFXaWRnZXQ6OmNoYW5nZUV2ZW50KGUpOworfQorCisvKiEK
KyAgICBcZm4gdm9pZCBRV2ViVmlldzo6dGl0bGVDaGFuZ2VkKGNvbnN0IFFTdHJpbmcgJnRpdGxl
KQorCisgICAgVGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuZXZlciB0aGUgXGEgdGl0bGUgb2Yg
dGhlIG1haW4gZnJhbWUgY2hhbmdlcy4KKworICAgIFxzYSB0aXRsZSgpCisqLworCisvKiEKKyAg
ICBcZm4gdm9pZCBRV2ViVmlldzo6dXJsQ2hhbmdlZChjb25zdCBRVXJsICZ1cmwpCisKKyAgICBU
aGlzIHNpZ25hbCBpcyBlbWl0dGVkIHdoZW4gdGhlIFxhIHVybCBvZiB0aGUgdmlldyBjaGFuZ2Vz
LgorCisgICAgXHNhIHVybCgpLCBsb2FkKCkKKyovCisKKy8qIQorICAgIFxmbiB2b2lkIFFXZWJW
aWV3OjpzdGF0dXNCYXJNZXNzYWdlKGNvbnN0IFFTdHJpbmcmIHRleHQpCisKKyAgICBUaGlzIHNp
Z25hbCBpcyBlbWl0dGVkIHdoZW4gdGhlIHN0YXR1cyBiYXIgXGEgdGV4dCBpcyBjaGFuZ2VkIGJ5
IHRoZSBwYWdlLgorKi8KKworLyohCisgICAgXGZuIHZvaWQgUVdlYlZpZXc6Omljb25DaGFuZ2Vk
KCkKKworICAgIFRoaXMgc2lnbmFsIGlzIGVtaXR0ZWQgd2hlbmV2ZXIgdGhlIGljb24gb2YgdGhl
IHBhZ2UgaXMgbG9hZGVkIG9yIGNoYW5nZXMuCisKKyAgICBJbiBvcmRlciBmb3IgaWNvbnMgdG8g
YmUgbG9hZGVkLCB5b3Ugd2lsbCBuZWVkIHRvIHNldCBhbiBpY29uIGRhdGFiYXNlIHBhdGgKKyAg
ICB1c2luZyBRV2ViU2V0dGluZ3M6OnNldEljb25EYXRhYmFzZVBhdGgoKS4KKworICAgIFxzYSBp
Y29uKCksIFFXZWJTZXR0aW5nczo6c2V0SWNvbkRhdGFiYXNlUGF0aCgpCisqLworCisvKiEKKyAg
ICBcZm4gdm9pZCBRV2ViVmlldzo6bG9hZFN0YXJ0ZWQoKQorCisgICAgVGhpcyBzaWduYWwgaXMg
ZW1pdHRlZCB3aGVuIGEgbmV3IGxvYWQgb2YgdGhlIHBhZ2UgaXMgc3RhcnRlZC4KKworICAgIFxz
YSBsb2FkUHJvZ3Jlc3MoKSwgbG9hZEZpbmlzaGVkKCkKKyovCisKKy8qIQorICAgIFxmbiB2b2lk
IFFXZWJWaWV3Ojpsb2FkRmluaXNoZWQoYm9vbCBvaykKKworICAgIFRoaXMgc2lnbmFsIGlzIGVt
aXR0ZWQgd2hlbiBhIGxvYWQgb2YgdGhlIHBhZ2UgaXMgZmluaXNoZWQuCisgICAgXGEgb2sgd2ls
bCBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBsb2FkIHdhcyBzdWNjZXNzZnVsIG9yIGFueSBlcnJvciBv
Y2N1cnJlZC4KKworICAgIFxzYSBsb2FkU3RhcnRlZCgpCisqLworCisvKiEKKyAgICBcZm4gdm9p
ZCBRV2ViVmlldzo6c2VsZWN0aW9uQ2hhbmdlZCgpCisKKyAgICBUaGlzIHNpZ25hbCBpcyBlbWl0
dGVkIHdoZW5ldmVyIHRoZSBzZWxlY3Rpb24gY2hhbmdlcy4KKworICAgIFxzYSBzZWxlY3RlZFRl
eHQoKQorKi8KKworLyohCisgICAgXGZuIHZvaWQgUVdlYlZpZXc6OmxvYWRQcm9ncmVzcyhpbnQg
cHJvZ3Jlc3MpCisKKyAgICBUaGlzIHNpZ25hbCBpcyBlbWl0dGVkIGV2ZXJ5IHRpbWUgYW4gZWxl
bWVudCBpbiB0aGUgd2ViIHBhZ2UKKyAgICBjb21wbGV0ZXMgbG9hZGluZyBhbmQgdGhlIG92ZXJh
bGwgbG9hZGluZyBwcm9ncmVzcyBhZHZhbmNlcy4KKworICAgIFRoaXMgc2lnbmFsIHRyYWNrcyB0
aGUgcHJvZ3Jlc3Mgb2YgYWxsIGNoaWxkIGZyYW1lcy4KKworICAgIFRoZSBjdXJyZW50IHZhbHVl
IGlzIHByb3ZpZGVkIGJ5IFxhIHByb2dyZXNzIGFuZCBzY2FsZXMgZnJvbSAwIHRvIDEwMCwKKyAg
ICB3aGljaCBpcyB0aGUgZGVmYXVsdCByYW5nZSBvZiBRUHJvZ3Jlc3NCYXIuCisKKyAgICBcc2Eg
bG9hZFN0YXJ0ZWQoKSwgbG9hZEZpbmlzaGVkKCkKKyovCisKKy8qIQorICAgIFxmbiB2b2lkIFFX
ZWJWaWV3OjpsaW5rQ2xpY2tlZChjb25zdCBRVXJsICZ1cmwpCisKKyAgICBUaGlzIHNpZ25hbCBp
cyBlbWl0dGVkIHdoZW5ldmVyIHRoZSB1c2VyIGNsaWNrcyBvbiBhIGxpbmsgYW5kIHRoZSBwYWdl
J3MgbGlua0RlbGVnYXRpb25Qb2xpY3kKKyAgICBwcm9wZXJ0eSBpcyBzZXQgdG8gZGVsZWdhdGUg
dGhlIGxpbmsgaGFuZGxpbmcgZm9yIHRoZSBzcGVjaWZpZWQgXGEgdXJsLgorCisgICAgXHNhIFFX
ZWJQYWdlOjpsaW5rRGVsZWdhdGlvblBvbGljeSgpCisqLworCisjaW5jbHVkZSAibW9jX3F3ZWJ2
aWV3LmNwcCIKKwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9XaWRnZXRBcGkvcXdlYnZp
ZXcuaCBiL1NvdXJjZS9XZWJLaXQvcXQvV2lkZ2V0QXBpL3F3ZWJ2aWV3LmgKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4u
ZDRiNGRkOTE3NWYwZDE4MWNmMmJkOGI1Y2RhMTgxOThhNTEyN2YxMwotLS0gL2Rldi9udWxsCisr
KyBiL1NvdXJjZS9XZWJLaXQvcXQvV2lkZ2V0QXBpL3F3ZWJ2aWV3LmgKQEAgLTAsMCArMSwxNjUg
QEAKKy8qCisgICAgQ29weXJpZ2h0IChDKSAyMDA4IE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBp
dHMgc3Vic2lkaWFyeSgtaWVzKQorICAgIENvcHlyaWdodCAoQykgMjAwNyBTdGFpa29zIENvbXB1
dGluZyBTZXJ2aWNlcyBJbmMuCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsg
eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0
ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1
Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJz
aW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNp
b24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBp
dCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQg
ZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxk
IGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBM
aWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5H
LkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
LCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICAgIEJvc3RvbiwgTUEg
MDIxMTAtMTMwMSwgVVNBLgorKi8KKworI2lmbmRlZiBRV0VCVklFV19ICisjZGVmaW5lIFFXRUJW
SUVXX0gKKworI2luY2x1ZGUgInF3ZWJraXRnbG9iYWwuaCIKKyNpbmNsdWRlICJxd2VicGFnZS5o
IgorI2luY2x1ZGUgPFF0V2lkZ2V0cy9xd2lkZ2V0Lmg+CisjaW5jbHVkZSA8UXRHdWkvcWljb24u
aD4KKyNpbmNsdWRlIDxRdEd1aS9xcGFpbnRlci5oPgorI2luY2x1ZGUgPFF0Q29yZS9xdXJsLmg+
CisjaW5jbHVkZSA8UXROZXR3b3JrL3FuZXR3b3JrYWNjZXNzbWFuYWdlci5oPgorCitRVF9CRUdJ
Tl9OQU1FU1BBQ0UKK2NsYXNzIFFOZXR3b3JrUmVxdWVzdDsKK2NsYXNzIFFQcmludGVyOworUVRf
RU5EX05BTUVTUEFDRQorCitjbGFzcyBRV2ViUGFnZTsKK2NsYXNzIFFXZWJWaWV3UHJpdmF0ZTsK
K2NsYXNzIFFXZWJOZXR3b3JrUmVxdWVzdDsKKworY2xhc3MgUVdFQktJVF9FWFBPUlQgUVdlYlZp
ZXcgOiBwdWJsaWMgUVdpZGdldCB7CisgICAgUV9PQkpFQ1QKKyAgICBRX1BST1BFUlRZKFFTdHJp
bmcgdGl0bGUgUkVBRCB0aXRsZSkKKyAgICBRX1BST1BFUlRZKFFVcmwgdXJsIFJFQUQgdXJsIFdS
SVRFIHNldFVybCkKKyAgICBRX1BST1BFUlRZKFFJY29uIGljb24gUkVBRCBpY29uKQorICAgIFFf
UFJPUEVSVFkoUVN0cmluZyBzZWxlY3RlZFRleHQgUkVBRCBzZWxlY3RlZFRleHQpCisgICAgUV9Q
Uk9QRVJUWShRU3RyaW5nIHNlbGVjdGVkSHRtbCBSRUFEIHNlbGVjdGVkSHRtbCkKKyAgICBRX1BS
T1BFUlRZKGJvb2wgaGFzU2VsZWN0aW9uIFJFQUQgaGFzU2VsZWN0aW9uKQorICAgIFFfUFJPUEVS
VFkoYm9vbCBtb2RpZmllZCBSRUFEIGlzTW9kaWZpZWQpCisgICAgLy9RX1BST1BFUlRZKFF0OjpU
ZXh0SW50ZXJhY3Rpb25GbGFncyB0ZXh0SW50ZXJhY3Rpb25GbGFncyBSRUFEIHRleHRJbnRlcmFj
dGlvbkZsYWdzIFdSSVRFIHNldFRleHRJbnRlcmFjdGlvbkZsYWdzKQorICAgIFFfUFJPUEVSVFko
cXJlYWwgdGV4dFNpemVNdWx0aXBsaWVyIFJFQUQgdGV4dFNpemVNdWx0aXBsaWVyIFdSSVRFIHNl
dFRleHRTaXplTXVsdGlwbGllciBERVNJR05BQkxFIGZhbHNlKQorICAgIFFfUFJPUEVSVFkocXJl
YWwgem9vbUZhY3RvciBSRUFEIHpvb21GYWN0b3IgV1JJVEUgc2V0Wm9vbUZhY3RvcikKKworICAg
IFFfUFJPUEVSVFkoUVBhaW50ZXI6OlJlbmRlckhpbnRzIHJlbmRlckhpbnRzIFJFQUQgcmVuZGVy
SGludHMgV1JJVEUgc2V0UmVuZGVySGludHMpCisgICAgUV9GTEFHUyhRUGFpbnRlcjo6UmVuZGVy
SGludHMpCitwdWJsaWM6CisgICAgZXhwbGljaXQgUVdlYlZpZXcoUVdpZGdldCogcGFyZW50ID0g
MCk7CisgICAgdmlydHVhbCB+UVdlYlZpZXcoKTsKKworICAgIFFXZWJQYWdlKiBwYWdlKCkgY29u
c3Q7CisgICAgdm9pZCBzZXRQYWdlKFFXZWJQYWdlKiBwYWdlKTsKKworICAgIHZvaWQgbG9hZChj
b25zdCBRVXJsJiB1cmwpOworICAgIHZvaWQgbG9hZChjb25zdCBRTmV0d29ya1JlcXVlc3QmIHJl
cXVlc3QsIFFOZXR3b3JrQWNjZXNzTWFuYWdlcjo6T3BlcmF0aW9uIG9wZXJhdGlvbiA9IFFOZXR3
b3JrQWNjZXNzTWFuYWdlcjo6R2V0T3BlcmF0aW9uLCBjb25zdCBRQnl0ZUFycmF5ICZib2R5ID0g
UUJ5dGVBcnJheSgpKTsKKyAgICB2b2lkIHNldEh0bWwoY29uc3QgUVN0cmluZyYgaHRtbCwgY29u
c3QgUVVybCYgYmFzZVVybCA9IFFVcmwoKSk7CisgICAgdm9pZCBzZXRDb250ZW50KGNvbnN0IFFC
eXRlQXJyYXkmIGRhdGEsIGNvbnN0IFFTdHJpbmcmIG1pbWVUeXBlID0gUVN0cmluZygpLCBjb25z
dCBRVXJsJiBiYXNlVXJsID0gUVVybCgpKTsKKworICAgIFFXZWJIaXN0b3J5KiBoaXN0b3J5KCkg
Y29uc3Q7CisgICAgUVdlYlNldHRpbmdzKiBzZXR0aW5ncygpIGNvbnN0OworCisgICAgUVN0cmlu
ZyB0aXRsZSgpIGNvbnN0OworICAgIHZvaWQgc2V0VXJsKGNvbnN0IFFVcmwgJnVybCk7CisgICAg
UVVybCB1cmwoKSBjb25zdDsKKyAgICBRSWNvbiBpY29uKCkgY29uc3Q7CisKKyAgICBib29sIGhh
c1NlbGVjdGlvbigpIGNvbnN0OworICAgIFFTdHJpbmcgc2VsZWN0ZWRUZXh0KCkgY29uc3Q7Cisg
ICAgUVN0cmluZyBzZWxlY3RlZEh0bWwoKSBjb25zdDsKKworI2lmbmRlZiBRVF9OT19BQ1RJT04K
KyAgICBRQWN0aW9uKiBwYWdlQWN0aW9uKFFXZWJQYWdlOjpXZWJBY3Rpb24gYWN0aW9uKSBjb25z
dDsKKyNlbmRpZgorICAgIHZvaWQgdHJpZ2dlclBhZ2VBY3Rpb24oUVdlYlBhZ2U6OldlYkFjdGlv
biBhY3Rpb24sIGJvb2wgY2hlY2tlZCA9IGZhbHNlKTsKKworICAgIGJvb2wgaXNNb2RpZmllZCgp
IGNvbnN0OworCisgICAgLyoKKyAgICBRdDo6VGV4dEludGVyYWN0aW9uRmxhZ3MgdGV4dEludGVy
YWN0aW9uRmxhZ3MoKSBjb25zdDsKKyAgICB2b2lkIHNldFRleHRJbnRlcmFjdGlvbkZsYWdzKFF0
OjpUZXh0SW50ZXJhY3Rpb25GbGFncyBmbGFncyk7CisgICAgdm9pZCBzZXRUZXh0SW50ZXJhY3Rp
b25GbGFnKFF0OjpUZXh0SW50ZXJhY3Rpb25GbGFnIGZsYWcpOworICAgICovCisKKyAgICBRVmFy
aWFudCBpbnB1dE1ldGhvZFF1ZXJ5KFF0OjpJbnB1dE1ldGhvZFF1ZXJ5IHByb3BlcnR5KSBjb25z
dDsKKworICAgIFFTaXplIHNpemVIaW50KCkgY29uc3Q7CisKKyAgICBxcmVhbCB6b29tRmFjdG9y
KCkgY29uc3Q7CisgICAgdm9pZCBzZXRab29tRmFjdG9yKHFyZWFsIGZhY3Rvcik7CisKKyAgICB2
b2lkIHNldFRleHRTaXplTXVsdGlwbGllcihxcmVhbCBmYWN0b3IpOworICAgIHFyZWFsIHRleHRT
aXplTXVsdGlwbGllcigpIGNvbnN0OworCisgICAgUVBhaW50ZXI6OlJlbmRlckhpbnRzIHJlbmRl
ckhpbnRzKCkgY29uc3Q7CisgICAgdm9pZCBzZXRSZW5kZXJIaW50cyhRUGFpbnRlcjo6UmVuZGVy
SGludHMgaGludHMpOworICAgIHZvaWQgc2V0UmVuZGVySGludChRUGFpbnRlcjo6UmVuZGVySGlu
dCBoaW50LCBib29sIGVuYWJsZWQgPSB0cnVlKTsKKworICAgIGJvb2wgZmluZFRleHQoY29uc3Qg
UVN0cmluZyYgc3ViU3RyaW5nLCBRV2ViUGFnZTo6RmluZEZsYWdzIG9wdGlvbnMgPSAwKTsKKwor
ICAgIHZpcnR1YWwgYm9vbCBldmVudChRRXZlbnQqKTsKKworcHVibGljIFFfU0xPVFM6CisgICAg
dm9pZCBzdG9wKCk7CisgICAgdm9pZCBiYWNrKCk7CisgICAgdm9pZCBmb3J3YXJkKCk7CisgICAg
dm9pZCByZWxvYWQoKTsKKworICAgIHZvaWQgcHJpbnQoUVByaW50ZXIqKSBjb25zdDsKKworUV9T
SUdOQUxTOgorICAgIHZvaWQgbG9hZFN0YXJ0ZWQoKTsKKyAgICB2b2lkIGxvYWRQcm9ncmVzcyhp
bnQgcHJvZ3Jlc3MpOworICAgIHZvaWQgbG9hZEZpbmlzaGVkKGJvb2wpOworICAgIHZvaWQgdGl0
bGVDaGFuZ2VkKGNvbnN0IFFTdHJpbmcmIHRpdGxlKTsKKyAgICB2b2lkIHN0YXR1c0Jhck1lc3Nh
Z2UoY29uc3QgUVN0cmluZyYgdGV4dCk7CisgICAgdm9pZCBsaW5rQ2xpY2tlZChjb25zdCBRVXJs
Jik7CisgICAgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKCk7CisgICAgdm9pZCBpY29uQ2hhbmdlZCgp
OworICAgIHZvaWQgdXJsQ2hhbmdlZChjb25zdCBRVXJsJik7CisKK3Byb3RlY3RlZDoKKyAgICB2
b2lkIHJlc2l6ZUV2ZW50KFFSZXNpemVFdmVudCopOworICAgIHZvaWQgcGFpbnRFdmVudChRUGFp
bnRFdmVudCopOworCisgICAgdmlydHVhbCBRV2ViVmlldyAqY3JlYXRlV2luZG93KFFXZWJQYWdl
OjpXZWJXaW5kb3dUeXBlIHR5cGUpOworCisgICAgdmlydHVhbCB2b2lkIGNoYW5nZUV2ZW50KFFF
dmVudCopOworICAgIHZpcnR1YWwgdm9pZCBtb3VzZU1vdmVFdmVudChRTW91c2VFdmVudCopOwor
ICAgIHZpcnR1YWwgdm9pZCBtb3VzZVByZXNzRXZlbnQoUU1vdXNlRXZlbnQqKTsKKyAgICB2aXJ0
dWFsIHZvaWQgbW91c2VEb3VibGVDbGlja0V2ZW50KFFNb3VzZUV2ZW50Kik7CisgICAgdmlydHVh
bCB2b2lkIG1vdXNlUmVsZWFzZUV2ZW50KFFNb3VzZUV2ZW50Kik7CisjaWZuZGVmIFFUX05PX0NP
TlRFWFRNRU5VCisgICAgdmlydHVhbCB2b2lkIGNvbnRleHRNZW51RXZlbnQoUUNvbnRleHRNZW51
RXZlbnQqKTsKKyNlbmRpZgorI2lmbmRlZiBRVF9OT19XSEVFTEVWRU5UCisgICAgdmlydHVhbCB2
b2lkIHdoZWVsRXZlbnQoUVdoZWVsRXZlbnQqKTsKKyNlbmRpZgorICAgIHZpcnR1YWwgdm9pZCBr
ZXlQcmVzc0V2ZW50KFFLZXlFdmVudCopOworICAgIHZpcnR1YWwgdm9pZCBrZXlSZWxlYXNlRXZl
bnQoUUtleUV2ZW50Kik7CisgICAgdmlydHVhbCB2b2lkIGRyYWdFbnRlckV2ZW50KFFEcmFnRW50
ZXJFdmVudCopOworICAgIHZpcnR1YWwgdm9pZCBkcmFnTGVhdmVFdmVudChRRHJhZ0xlYXZlRXZl
bnQqKTsKKyAgICB2aXJ0dWFsIHZvaWQgZHJhZ01vdmVFdmVudChRRHJhZ01vdmVFdmVudCopOwor
ICAgIHZpcnR1YWwgdm9pZCBkcm9wRXZlbnQoUURyb3BFdmVudCopOworICAgIHZpcnR1YWwgdm9p
ZCBmb2N1c0luRXZlbnQoUUZvY3VzRXZlbnQqKTsKKyAgICB2aXJ0dWFsIHZvaWQgZm9jdXNPdXRF
dmVudChRRm9jdXNFdmVudCopOworICAgIHZpcnR1YWwgdm9pZCBpbnB1dE1ldGhvZEV2ZW50KFFJ
bnB1dE1ldGhvZEV2ZW50Kik7CisKKyAgICB2aXJ0dWFsIGJvb2wgZm9jdXNOZXh0UHJldkNoaWxk
KGJvb2wgbmV4dCk7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFFXZWJQYWdlOworICAg
IFFXZWJWaWV3UHJpdmF0ZSogZDsKKyAgICBRX1BSSVZBVEVfU0xPVChkLCB2b2lkIF9xX3BhZ2VE
ZXN0cm95ZWQoKSkKK307CisKKyNlbmRpZiAvLyBRV0VCVklFV19ICmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViS2l0L3F0L1dpZGdldEFwaS9xd2Vidmlld2FjY2Vzc2libGUuY3BwIGIvU291cmNlL1dl
YktpdC9xdC9XaWRnZXRBcGkvcXdlYnZpZXdhY2Nlc3NpYmxlLmNwcApuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi43Y2Fl
MTlhMWE0MjIxNGJkYTQyOTFlODdhYjExNDZiN2I1MzdkYTIwCi0tLSAvZGV2L251bGwKKysrIGIv
U291cmNlL1dlYktpdC9xdC9XaWRnZXRBcGkvcXdlYnZpZXdhY2Nlc3NpYmxlLmNwcApAQCAtMCww
ICsxLDE1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBOb2tpYSBDb3Jwb3JhdGlvbiBh
bmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykKKworICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29m
dHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVy
IHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2Ug
YXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICog
dmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2
ZXJzaW9uLgorCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhh
dCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91
dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAqIFlvdSBzaG91bGQg
aGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExp
Y2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5M
SUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJ
bmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjEx
MC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgInF3ZWJ2
aWV3YWNjZXNzaWJsZV9wLmgiCisKKyNpbmNsdWRlICJxd2ViZnJhbWUuaCIKKyNpbmNsdWRlICJx
d2ViZnJhbWVfcC5oIgorI2luY2x1ZGUgInF3ZWJwYWdlLmgiCisjaW5jbHVkZSAicXdlYnZpZXcu
aCIKKworUVdlYkZyYW1lQWNjZXNzaWJsZTo6UVdlYkZyYW1lQWNjZXNzaWJsZShRV2ViRnJhbWUq
IGZyYW1lKQorICAgIDogUUFjY2Vzc2libGVPYmplY3QoZnJhbWUpCit7Cit9CisKK1FXZWJGcmFt
ZSogUVdlYkZyYW1lQWNjZXNzaWJsZTo6ZnJhbWUoKSBjb25zdAoreworICAgIHJldHVybiBxb2Jq
ZWN0X2Nhc3Q8UVdlYkZyYW1lKj4ob2JqZWN0KCkpOworfQorCitRQWNjZXNzaWJsZUludGVyZmFj
ZSogUVdlYkZyYW1lQWNjZXNzaWJsZTo6cGFyZW50KCkgY29uc3QKK3sKKyAgICByZXR1cm4gUUFj
Y2Vzc2libGU6OnF1ZXJ5QWNjZXNzaWJsZUludGVyZmFjZShvYmplY3QoKS0+cGFyZW50KCkpOwor
fQorCitRU3RyaW5nIFFXZWJGcmFtZUFjY2Vzc2libGU6OnRleHQoUUFjY2Vzc2libGU6OlRleHQp
IGNvbnN0Cit7CisgICAgcmV0dXJuIFFTdHJpbmcoKTsKK30KKworaW50IFFXZWJGcmFtZUFjY2Vz
c2libGU6OmNoaWxkQ291bnQoKSBjb25zdAoreworICAgIHJldHVybiAwOworfQorCitRQWNjZXNz
aWJsZUludGVyZmFjZSogUVdlYkZyYW1lQWNjZXNzaWJsZTo6Y2hpbGQoaW50IGluZGV4KSBjb25z
dAoreworICAgIHJldHVybiAwOworfQorCitpbnQgUVdlYkZyYW1lQWNjZXNzaWJsZTo6aW5kZXhP
ZkNoaWxkKGNvbnN0IFFBY2Nlc3NpYmxlSW50ZXJmYWNlKikgY29uc3QKK3sKKyAgICByZXR1cm4g
MDsKK30KKworUUFjY2Vzc2libGU6OlN0YXRlIFFXZWJGcmFtZUFjY2Vzc2libGU6OnN0YXRlKCkg
Y29uc3QKK3sKKyAgICByZXR1cm4gUUFjY2Vzc2libGU6OlN0YXRlKCk7Cit9CisKK1FBY2Nlc3Np
YmxlOjpSb2xlIFFXZWJGcmFtZUFjY2Vzc2libGU6OnJvbGUoKSBjb25zdAoreworICAgIHJldHVy
biBRQWNjZXNzaWJsZTo6Q2xpZW50OworfQorCitpbnQgUVdlYkZyYW1lQWNjZXNzaWJsZTo6bmF2
aWdhdGUoUUFjY2Vzc2libGU6OlJlbGF0aW9uRmxhZywgaW50LCBRQWNjZXNzaWJsZUludGVyZmFj
ZSoqIHRhcmdldCkgY29uc3QKK3sKKyAgICAqdGFyZ2V0ID0gMDsKKyAgICByZXR1cm4gLTE7Cit9
CisKK1FXZWJQYWdlQWNjZXNzaWJsZTo6UVdlYlBhZ2VBY2Nlc3NpYmxlKFFXZWJQYWdlKiBwYWdl
KQorICAgIDogUUFjY2Vzc2libGVPYmplY3QocGFnZSkKK3sKK30KKworUVdlYlBhZ2UqIFFXZWJQ
YWdlQWNjZXNzaWJsZTo6cGFnZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIHFvYmplY3RfY2FzdDxR
V2ViUGFnZSo+KG9iamVjdCgpKTsKK30KKworUVN0cmluZyBRV2ViUGFnZUFjY2Vzc2libGU6OnRl
eHQoUUFjY2Vzc2libGU6OlRleHQgdCkgY29uc3QKK3sKKyAgICByZXR1cm4gUVN0cmluZygpOwor
fQorCitRQWNjZXNzaWJsZUludGVyZmFjZSogUVdlYlBhZ2VBY2Nlc3NpYmxlOjpwYXJlbnQoKSBj
b25zdAoreworICAgIHJldHVybiBRQWNjZXNzaWJsZTo6cXVlcnlBY2Nlc3NpYmxlSW50ZXJmYWNl
KG9iamVjdCgpLT5wYXJlbnQoKSk7Cit9CisKK1FBY2Nlc3NpYmxlSW50ZXJmYWNlKiBRV2ViUGFn
ZUFjY2Vzc2libGU6OmNoaWxkKGludCBpbmRleCkgY29uc3QKK3sKKyAgICBpZiAoIWluZGV4ICYm
IHBhZ2UoKS0+bWFpbkZyYW1lKCkpCisgICAgICAgIHJldHVybiBuZXcgUVdlYkZyYW1lQWNjZXNz
aWJsZShwYWdlKCktPm1haW5GcmFtZSgpKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IFFXZWJQ
YWdlQWNjZXNzaWJsZTo6Y2hpbGRDb3VudCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIHBhZ2UoKS0+
bWFpbkZyYW1lKCkgPyAxIDogMDsKK30KKworaW50IFFXZWJQYWdlQWNjZXNzaWJsZTo6aW5kZXhP
ZkNoaWxkKGNvbnN0IFFBY2Nlc3NpYmxlSW50ZXJmYWNlKikgY29uc3QKK3sKKyAgICByZXR1cm4g
MDsKK30KKworaW50IFFXZWJQYWdlQWNjZXNzaWJsZTo6bmF2aWdhdGUoUUFjY2Vzc2libGU6OlJl
bGF0aW9uRmxhZywgaW50LCBRQWNjZXNzaWJsZUludGVyZmFjZSoqIHRhcmdldCkgY29uc3QKK3sK
KyAgICAqdGFyZ2V0ID0gMDsKKyAgICByZXR1cm4gLTE7Cit9CisKK1FBY2Nlc3NpYmxlOjpSb2xl
IFFXZWJQYWdlQWNjZXNzaWJsZTo6cm9sZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIFFBY2Nlc3Np
YmxlOjpDbGllbnQ7Cit9CisKK1FBY2Nlc3NpYmxlOjpTdGF0ZSBRV2ViUGFnZUFjY2Vzc2libGU6
OnN0YXRlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gUUFjY2Vzc2libGU6OlN0YXRlKCk7Cit9CisK
K1FXZWJWaWV3QWNjZXNzaWJsZTo6UVdlYlZpZXdBY2Nlc3NpYmxlKFFXZWJWaWV3KiB2aWV3KQor
ICAgIDogUUFjY2Vzc2libGVXaWRnZXQodmlldywgUUFjY2Vzc2libGU6OkRvY3VtZW50KQorewor
fQorCitRV2ViVmlldyogUVdlYlZpZXdBY2Nlc3NpYmxlOjp2aWV3KCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gcW9iamVjdF9jYXN0PFFXZWJWaWV3Kj4ob2JqZWN0KCkpOworfQorCitpbnQgUVdlYlZp
ZXdBY2Nlc3NpYmxlOjpjaGlsZENvdW50KCkgY29uc3QKK3sKKyAgICByZXR1cm4gdmlldygpLT5w
YWdlKCkgPyAxIDogMDsKK30KKworUUFjY2Vzc2libGVJbnRlcmZhY2UqIFFXZWJWaWV3QWNjZXNz
aWJsZTo6Y2hpbGQoaW50IGluZGV4KSBjb25zdAoreworICAgIGlmICghaW5kZXggJiYgdmlldygp
LT5wYWdlKCkpCisgICAgICAgIHJldHVybiBuZXcgUVdlYlBhZ2VBY2Nlc3NpYmxlKHZpZXcoKS0+
cGFnZSgpKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvcXQv
V2lkZ2V0QXBpL3F3ZWJ2aWV3YWNjZXNzaWJsZV9wLmggYi9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdl
dEFwaS9xd2Vidmlld2FjY2Vzc2libGVfcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjdjYmY0NDg3MDczZjY2YmVk
ZjgxYjU1NGE0YWVlZDE5ZmI0ZGIzNjMKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0
L3F0L1dpZGdldEFwaS9xd2Vidmlld2FjY2Vzc2libGVfcC5oCkBAIC0wLDAgKzEsODIgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJz
aWRpYXJ5KC1pZXMpCisKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2Fu
IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2Yg
dGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBi
eSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0
aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICog
VGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1
c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1w
bGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMg
TGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQg
YSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9u
ZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3
cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmts
aW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgor
ICovCisKKyNpZm5kZWYgcXdlYnZpZXdhY2Nlc3NpYmxlX3BfaAorI2RlZmluZSBxd2Vidmlld2Fj
Y2Vzc2libGVfcF9oCisKKyNpbmNsdWRlIDxxYWNjZXNzaWJsZS5oPgorI2luY2x1ZGUgPHFhY2Nl
c3NpYmxlb2JqZWN0Lmg+CisjaW5jbHVkZSA8cWFjY2Vzc2libGV3aWRnZXQuaD4KKworY2xhc3Mg
UVdlYkZyYW1lOworY2xhc3MgUVdlYlBhZ2U7CitjbGFzcyBRV2ViVmlldzsKKworLyoKKyAqIENs
YXNzZXMgcmVwcmVzZW50aW5nIGFjY2Vzc2libGUgb2JqZWN0cyBmb3IgVmlldywgRnJhbWUgYW5k
IFBhZ2UuCisgKgorICogRWFjaCBvZiB0aGVzZSBqdXN0IHJldHVybnMgb25lIGNoaWxkIHdoaWNo
IGxldHMgdGhlIGFjY2Vzc2liaWxpdHkKKyAqIGZyYW13b3JrIG5hdmlnYXRlIHRvd2FyZHMgdGhl
IGFjdHVhbCBjb250ZW50cyBpbiB0aGUgZnJhbWUuCisgKi8KKworY2xhc3MgUVdlYkZyYW1lQWNj
ZXNzaWJsZSA6IHB1YmxpYyBRQWNjZXNzaWJsZU9iamVjdCB7CitwdWJsaWM6CisgICAgUVdlYkZy
YW1lQWNjZXNzaWJsZShRV2ViRnJhbWUqKTsKKworICAgIFFXZWJGcmFtZSogZnJhbWUoKSBjb25z
dDsKKworICAgIFFBY2Nlc3NpYmxlSW50ZXJmYWNlKiBwYXJlbnQoKSBjb25zdDsKKyAgICBpbnQg
Y2hpbGRDb3VudCgpIGNvbnN0OworICAgIFFBY2Nlc3NpYmxlSW50ZXJmYWNlKiBjaGlsZChpbnQg
aW5kZXgpIGNvbnN0OworICAgIGludCBpbmRleE9mQ2hpbGQoY29uc3QgUUFjY2Vzc2libGVJbnRl
cmZhY2UqKSBjb25zdDsKKyAgICBpbnQgbmF2aWdhdGUoUUFjY2Vzc2libGU6OlJlbGF0aW9uRmxh
ZywgaW50LCBRQWNjZXNzaWJsZUludGVyZmFjZSoqIHRhcmdldCkgY29uc3Q7CisKKyAgICBRU3Ry
aW5nIHRleHQoUUFjY2Vzc2libGU6OlRleHQpIGNvbnN0OworICAgIFFBY2Nlc3NpYmxlOjpSb2xl
IHJvbGUoKSBjb25zdDsKKyAgICBRQWNjZXNzaWJsZTo6U3RhdGUgc3RhdGUoKSBjb25zdDsKK307
CisKK2NsYXNzIFFXZWJQYWdlQWNjZXNzaWJsZSA6IHB1YmxpYyBRQWNjZXNzaWJsZU9iamVjdCB7
CitwdWJsaWM6CisgICAgUVdlYlBhZ2VBY2Nlc3NpYmxlKFFXZWJQYWdlKik7CisKKyAgICBRV2Vi
UGFnZSogcGFnZSgpIGNvbnN0OworCisgICAgUUFjY2Vzc2libGVJbnRlcmZhY2UqIHBhcmVudCgp
IGNvbnN0OworICAgIGludCBjaGlsZENvdW50KCkgY29uc3Q7CisgICAgUUFjY2Vzc2libGVJbnRl
cmZhY2UqIGNoaWxkKGludCBpbmRleCkgY29uc3Q7CisgICAgaW50IGluZGV4T2ZDaGlsZChjb25z
dCBRQWNjZXNzaWJsZUludGVyZmFjZSopIGNvbnN0OworICAgIGludCBuYXZpZ2F0ZShRQWNjZXNz
aWJsZTo6UmVsYXRpb25GbGFnLCBpbnQsIFFBY2Nlc3NpYmxlSW50ZXJmYWNlKiogdGFyZ2V0KSBj
b25zdDsKKworICAgIFFTdHJpbmcgdGV4dChRQWNjZXNzaWJsZTo6VGV4dCkgY29uc3Q7CisgICAg
UUFjY2Vzc2libGU6OlJvbGUgcm9sZSgpIGNvbnN0OworICAgIFFBY2Nlc3NpYmxlOjpTdGF0ZSBz
dGF0ZSgpIGNvbnN0OworfTsKKworY2xhc3MgUVdlYlZpZXdBY2Nlc3NpYmxlIDogcHVibGljIFFB
Y2Nlc3NpYmxlV2lkZ2V0IHsKK3B1YmxpYzoKKyAgICBRV2ViVmlld0FjY2Vzc2libGUoUVdlYlZp
ZXcqKTsKKworICAgIFFXZWJWaWV3KiB2aWV3KCkgY29uc3Q7CisKKyAgICBpbnQgY2hpbGRDb3Vu
dCgpIGNvbnN0OworICAgIFFBY2Nlc3NpYmxlSW50ZXJmYWNlKiBjaGlsZChpbnQgaW5kZXgpIGNv
bnN0OworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldFN1
cHBvcnQvRGVmYXVsdEZ1bGxTY3JlZW5WaWRlb0hhbmRsZXIuY3BwIGIvU291cmNlL1dlYktpdC9x
dC9XaWRnZXRTdXBwb3J0L0RlZmF1bHRGdWxsU2NyZWVuVmlkZW9IYW5kbGVyLmNwcApuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwLi4wZmUyNGU4YmQ1MjM1MjViYWM5YmE4MjI0OTg3YTNiNmM2Y2UxN2Q5Ci0tLSAvZGV2L251
bGwKKysrIGIvU291cmNlL1dlYktpdC9xdC9XaWRnZXRTdXBwb3J0L0RlZmF1bHRGdWxsU2NyZWVu
VmlkZW9IYW5kbGVyLmNwcApAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDEyIERpZ2lhIFBsYyBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykuCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTEgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpLgor
ICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBT
b2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwg
b3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJh
cnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAq
IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJh
bnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv
ciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBv
ZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0
aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8K
KyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVl
dCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRGVmYXVsdEZ1bGxTY3JlZW5WaWRlb0hhbmRs
ZXIuaCIKKworI2lmIFVTRShRVF9NVUxUSU1FRElBKQorCisjaW5jbHVkZSAiRnVsbFNjcmVlblZp
ZGVvV2lkZ2V0LmgiCisKK3VzaW5nIG5hbWVzcGFjZSBXZWJLaXQ7CisKK2Jvb2wgRGVmYXVsdEZ1
bGxTY3JlZW5WaWRlb0hhbmRsZXI6OnNfc2hvdWxkRm9yY2VGdWxsU2NyZWVuVmlkZW9QbGF5YmFj
ayA9IGZhbHNlOworCitEZWZhdWx0RnVsbFNjcmVlblZpZGVvSGFuZGxlcjo6RGVmYXVsdEZ1bGxT
Y3JlZW5WaWRlb0hhbmRsZXIoKQorICAgIDogUVdlYkZ1bGxTY3JlZW5WaWRlb0hhbmRsZXIoKQor
ICAgICwgbV9mdWxsU2NyZWVuV2lkZ2V0KG5ldyBGdWxsU2NyZWVuVmlkZW9XaWRnZXQpCit7Cisg
ICAgY29ubmVjdChtX2Z1bGxTY3JlZW5XaWRnZXQsIFNJR05BTChkaWRFeGl0RnVsbFNjcmVlbigp
KSwgdGhpcywgU0lHTkFMKGZ1bGxTY3JlZW5DbG9zZWQoKSkpOworICAgIG1fZnVsbFNjcmVlbldp
ZGdldC0+aGlkZSgpOworCisgICAgbV9mdWxsU2NyZWVuV2lkZ2V0LT5jbG9zZSgpOworfQorCitE
ZWZhdWx0RnVsbFNjcmVlblZpZGVvSGFuZGxlcjo6fkRlZmF1bHRGdWxsU2NyZWVuVmlkZW9IYW5k
bGVyKCkKK3sKKyAgICBkZWxldGUgbV9mdWxsU2NyZWVuV2lkZ2V0OworfQorCitib29sIERlZmF1
bHRGdWxsU2NyZWVuVmlkZW9IYW5kbGVyOjpyZXF1aXJlc0Z1bGxTY3JlZW5Gb3JWaWRlb1BsYXli
YWNrKCkgY29uc3QKK3sKKyAgICBzdGF0aWMgYm9vbCBpbml0aWFsaXplZCA9IGZhbHNlOworICAg
IGlmICghaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgUUJ5dGVBcnJheSBmb3JjZUZ1bGxTY3JlZW4g
PSBxZ2V0ZW52KCJRVF9XRUJLSVRfRk9SQ0VfRlVMTFNDUkVFTl9WSURFTyIpOworICAgICAgICBp
ZiAoIWZvcmNlRnVsbFNjcmVlbi5pc0VtcHR5KCkpCisgICAgICAgICAgICBzX3Nob3VsZEZvcmNl
RnVsbFNjcmVlblZpZGVvUGxheWJhY2sgPSB0cnVlOworCisgICAgICAgIGluaXRpYWxpemVkID0g
dHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gc19zaG91bGRGb3JjZUZ1bGxTY3JlZW5WaWRlb1Bs
YXliYWNrOworfQorCit2b2lkIERlZmF1bHRGdWxsU2NyZWVuVmlkZW9IYW5kbGVyOjplbnRlckZ1
bGxTY3JlZW4oUU1lZGlhUGxheWVyKiBwbGF5ZXIpCit7CisgICAgbV9mdWxsU2NyZWVuV2lkZ2V0
LT5zaG93KHBsYXllcik7Cit9CisKK3ZvaWQgRGVmYXVsdEZ1bGxTY3JlZW5WaWRlb0hhbmRsZXI6
OmV4aXRGdWxsU2NyZWVuKCkKK3sKKyAgICBtX2Z1bGxTY3JlZW5XaWRnZXQtPmNsb3NlKCk7Cit9
CisjZW5kaWYKKworCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldFN1cHBvcnQv
RGVmYXVsdEZ1bGxTY3JlZW5WaWRlb0hhbmRsZXIuaCBiL1NvdXJjZS9XZWJLaXQvcXQvV2lkZ2V0
U3VwcG9ydC9EZWZhdWx0RnVsbFNjcmVlblZpZGVvSGFuZGxlci5oCm5ldyBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmU5NDNj
NTVlNDQwMDgyMjUwODVmM2ExNjg5ZTQ5ZGYyMzg5ZjRhZDcKLS0tIC9kZXYvbnVsbAorKysgYi9T
b3VyY2UvV2ViS2l0L3F0L1dpZGdldFN1cHBvcnQvRGVmYXVsdEZ1bGxTY3JlZW5WaWRlb0hhbmRs
ZXIuaApAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIERpZ2lhIFBs
YyBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgTm9r
aWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpLgorICoKKyAqIFRoaXMg
bGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IK
KyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwg
UHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu
ZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIg
b3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJp
YnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VU
IEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBN
RVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUg
dGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFp
bHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7
IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVl
IFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxv
b3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2lmbmRlZiBEZWZhdWx0
RnVsbFNjcmVlblZpZGVvSGFuZGxlcl9oCisjZGVmaW5lIERlZmF1bHRGdWxsU2NyZWVuVmlkZW9I
YW5kbGVyX2gKKworI2luY2x1ZGUgInF3ZWJraXRwbGF0Zm9ybXBsdWdpbi5oIgorCituYW1lc3Bh
Y2UgV2ViS2l0IHsKKworY2xhc3MgRnVsbFNjcmVlblZpZGVvV2lkZ2V0OworCisvLyBXZSBkbyBu
b3QgdXNlIEVOQUJMRSBvciBVU0UgYmVjYXVzZSBtb2MgZG9lcyBub3QgZXhwYW5kIHRoZXNlIG1h
Y3Jvcy4KKyNpZiBkZWZpbmVkKFdURl9VU0VfUVRfTVVMVElNRURJQSkgJiYgV1RGX1VTRV9RVF9N
VUxUSU1FRElBCitjbGFzcyBEZWZhdWx0RnVsbFNjcmVlblZpZGVvSGFuZGxlciA6IHB1YmxpYyBR
V2ViRnVsbFNjcmVlblZpZGVvSGFuZGxlciB7CisgICAgUV9PQkpFQ1QKK3B1YmxpYzoKKyAgICBE
ZWZhdWx0RnVsbFNjcmVlblZpZGVvSGFuZGxlcigpOworICAgIHZpcnR1YWwgfkRlZmF1bHRGdWxs
U2NyZWVuVmlkZW9IYW5kbGVyKCk7CisgICAgYm9vbCByZXF1aXJlc0Z1bGxTY3JlZW5Gb3JWaWRl
b1BsYXliYWNrKCkgY29uc3Q7CisKK3B1YmxpYyBRX1NMT1RTOgorICAgIHZvaWQgZW50ZXJGdWxs
U2NyZWVuKFFNZWRpYVBsYXllciopOworICAgIHZvaWQgZXhpdEZ1bGxTY3JlZW4oKTsKKworcHJp
dmF0ZToKKyAgICBzdGF0aWMgYm9vbCBzX3Nob3VsZEZvcmNlRnVsbFNjcmVlblZpZGVvUGxheWJh
Y2s7CisgICAgRnVsbFNjcmVlblZpZGVvV2lkZ2V0ICptX2Z1bGxTY3JlZW5XaWRnZXQ7Cit9Owor
I2VuZGlmCisKK30gLy8gbmFtZXNwYWNlIFdlYktpdAorCisjZW5kaWYgLy8gRGVmYXVsdEZ1bGxT
Y3JlZW5WaWRlb0hhbmRsZXJfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9XaWRnZXRT
dXBwb3J0L0Z1bGxTY3JlZW5WaWRlb1dpZGdldC5jcHAgYi9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdl
dFN1cHBvcnQvRnVsbFNjcmVlblZpZGVvV2lkZ2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi40MTA1ZDAyYzYy
MjU3YzU0OTkwNmZlYzUxNWY0Zjc2ZDRlYThiN2QxCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNl
L1dlYktpdC9xdC9XaWRnZXRTdXBwb3J0L0Z1bGxTY3JlZW5WaWRlb1dpZGdldC5jcHAKQEAgLTAs
MCArMSwxMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTm9raWEgQ29ycG9yYXRpb24g
YW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpLgorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01Q
VVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBV
VEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkZ1bGxTY3JlZW5WaWRlb1dp
ZGdldC5oIgorCisjaW5jbHVkZSA8UUFwcGxpY2F0aW9uPgorI2luY2x1ZGUgPFFDbG9zZUV2ZW50
PgorI2luY2x1ZGUgPFFEZXNrdG9wV2lkZ2V0PgorI2luY2x1ZGUgPFFLZXlFdmVudD4KKyNpbmNs
dWRlIDxRTWVkaWFQbGF5ZXI+CisKK3N0YXRpYyBjb25zdCBpbnQgZ0hpZGVNb3VzZUN1cnNvckRl
bGF5ID0gMzAwMDsKKworbmFtZXNwYWNlIFdlYktpdCB7CisKK0Z1bGxTY3JlZW5WaWRlb1dpZGdl
dDo6RnVsbFNjcmVlblZpZGVvV2lkZ2V0KCkKKyAgICA6IFFWaWRlb1dpZGdldCgpCisgICAgLCBt
X21lZGlhUGxheWVyKDApCit7CisgICAgUVBhbGV0dGUgcGFsZXR0ZSh0aGlzLT5wYWxldHRlKCkp
OworICAgIHBhbGV0dGUuc2V0Q29sb3IoUVBhbGV0dGU6OkJhc2UsIFF0OjpibGFjayk7CisgICAg
cGFsZXR0ZS5zZXRDb2xvcihRUGFsZXR0ZTo6QmFja2dyb3VuZCwgUXQ6OmJsYWNrKTsKKyAgICBz
ZXRQYWxldHRlKHBhbGV0dGUpOworCisgICAgc2V0V2luZG93TW9kYWxpdHkoUXQ6OkFwcGxpY2F0
aW9uTW9kYWwpOworICAgIHNldFdpbmRvd0ZsYWdzKHdpbmRvd0ZsYWdzKCkgfCBRdDo6RnJhbWVs
ZXNzV2luZG93SGludCk7CisKKyAgICBzZXRHZW9tZXRyeShRQXBwbGljYXRpb246OmRlc2t0b3Ao
KS0+c2NyZWVuR2VvbWV0cnkoKSk7CisKKyAgICBtX2N1cnNvclRpbWVyLnNldFNpbmdsZVNob3Qo
dHJ1ZSk7CisgICAgY29ubmVjdCgmbV9jdXJzb3JUaW1lciwgU0lHTkFMKHRpbWVvdXQoKSksIHRo
aXMsIFNMT1QoaGlkZUN1cnNvcigpKSk7Cit9CisKK0Z1bGxTY3JlZW5WaWRlb1dpZGdldDo6fkZ1
bGxTY3JlZW5WaWRlb1dpZGdldCgpCit7Cit9CisKK3ZvaWQgRnVsbFNjcmVlblZpZGVvV2lkZ2V0
OjpzaG93KFFNZWRpYVBsYXllciogcGxheWVyKQoreworICAgIG1fbWVkaWFQbGF5ZXIgPSBwbGF5
ZXI7CisgICAgc2hvd0Z1bGxTY3JlZW4oKTsKKyAgICBzZXRNb3VzZVRyYWNraW5nKHRydWUpOwor
ICAgIHJhaXNlKCk7CisgICAgbV9tZWRpYVBsYXllci0+c2V0VmlkZW9PdXRwdXQodGhpcyk7Cisg
ICAgc2V0Rm9jdXMoKTsKKyAgICBncmFiTW91c2UoKTsKKyAgICBoaWRlQ3Vyc29yKCk7Cit9CisK
K3ZvaWQgRnVsbFNjcmVlblZpZGVvV2lkZ2V0OjpjbG9zZUV2ZW50KFFDbG9zZUV2ZW50KiBldmVu
dCkKK3sKKyAgICBtX21lZGlhUGxheWVyID0gMDsKKyAgICBtX2N1cnNvclRpbWVyLnN0b3AoKTsK
KyAgICBzZXRNb3VzZVRyYWNraW5nKGZhbHNlKTsKKyAgICByZWxlYXNlTW91c2UoKTsKKyAgICBR
QXBwbGljYXRpb246OnJlc3RvcmVPdmVycmlkZUN1cnNvcigpOworICAgIGV2ZW50LT5pZ25vcmUo
KTsKKyAgICBoaWRlKCk7CisgICAgZW1pdCBkaWRFeGl0RnVsbFNjcmVlbigpOworfQorCitib29s
IEZ1bGxTY3JlZW5WaWRlb1dpZGdldDo6ZXZlbnQoUUV2ZW50KiBldikKK3sKKyAgICBzd2l0Y2gg
KGV2LT50eXBlKCkpIHsKKyAgICBjYXNlIFFFdmVudDo6TW91c2VNb3ZlOgorICAgICAgICBzaG93
Q3Vyc29yKCk7CisgICAgICAgIGV2LT5hY2NlcHQoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgY2FzZSBRRXZlbnQ6Ok1vdXNlQnV0dG9uRGJsQ2xpY2s6CisgICAgICAgIGNsb3NlKCk7Cisg
ICAgICAgIGV2LT5hY2NlcHQoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoK
KyAgICAgICAgcmV0dXJuIFFWaWRlb1dpZGdldDo6ZXZlbnQoZXYpOworICAgIH0KK30KKwordm9p
ZCBGdWxsU2NyZWVuVmlkZW9XaWRnZXQ6OmtleVByZXNzRXZlbnQoUUtleUV2ZW50KiBldikKK3sK
KyAgICBpZiAobV9tZWRpYVBsYXllciAmJiBldi0+a2V5KCkgPT0gUXQ6OktleV9TcGFjZSkgewor
ICAgICAgICBpZiAobV9tZWRpYVBsYXllci0+c3RhdGUoKSA9PSBRTWVkaWFQbGF5ZXI6OlBsYXlp
bmdTdGF0ZSkKKyAgICAgICAgICAgIG1fbWVkaWFQbGF5ZXItPnBhdXNlKCk7CisgICAgICAgIGVs
c2UKKyAgICAgICAgICAgIG1fbWVkaWFQbGF5ZXItPnBsYXkoKTsKKyAgICB9IGVsc2UgaWYgKGV2
LT5rZXkoKSA9PSBRdDo6S2V5X0VzY2FwZSkKKyAgICAgICAgY2xvc2UoKTsKK30KKwordm9pZCBG
dWxsU2NyZWVuVmlkZW9XaWRnZXQ6OmhpZGVDdXJzb3IoKQoreworICAgIFFBcHBsaWNhdGlvbjo6
c2V0T3ZlcnJpZGVDdXJzb3IoUUN1cnNvcihRdDo6QmxhbmtDdXJzb3IpKTsKK30KKwordm9pZCBG
dWxsU2NyZWVuVmlkZW9XaWRnZXQ6OnNob3dDdXJzb3IoKQoreworICAgIFFBcHBsaWNhdGlvbjo6
cmVzdG9yZU92ZXJyaWRlQ3Vyc29yKCk7CisgICAgbV9jdXJzb3JUaW1lci5zdGFydChnSGlkZU1v
dXNlQ3Vyc29yRGVsYXkpOworfQorCit9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0L1dp
ZGdldFN1cHBvcnQvRnVsbFNjcmVlblZpZGVvV2lkZ2V0LmggYi9Tb3VyY2UvV2ViS2l0L3F0L1dp
ZGdldFN1cHBvcnQvRnVsbFNjcmVlblZpZGVvV2lkZ2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMjAxY2M0OWQx
ZTQxMmU5ODdiNmU0MWNjNTAzZGQyMmUzZDQ3NmExNwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJj
ZS9XZWJLaXQvcXQvV2lkZ2V0U3VwcG9ydC9GdWxsU2NyZWVuVmlkZW9XaWRnZXQuaApAQCAtMCww
ICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIE5va2lhIENvcnBvcmF0aW9uIGFu
ZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKS4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVU
RVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRF
UiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgor
ICovCisKKyNpZm5kZWYgRnVsbFNjcmVlblZpZGVvV2lkZ2V0X2gKKyNkZWZpbmUgRnVsbFNjcmVl
blZpZGVvV2lkZ2V0X2gKKworI2luY2x1ZGUgPFFUaW1lcj4KKyNpbmNsdWRlIDxRVmlkZW9XaWRn
ZXQ+CisKK1FUX0JFR0lOX05BTUVTUEFDRQorY2xhc3MgUU1lZGlhUGxheWVyOworUVRfRU5EX05B
TUVTUEFDRQorCituYW1lc3BhY2UgV2ViS2l0IHsKKworY2xhc3MgRnVsbFNjcmVlblZpZGVvV2lk
Z2V0IDogcHVibGljIFFWaWRlb1dpZGdldCB7CisgICAgUV9PQkpFQ1QKK3B1YmxpYzoKKyAgICBG
dWxsU2NyZWVuVmlkZW9XaWRnZXQoKTsKKyAgICB2aXJ0dWFsIH5GdWxsU2NyZWVuVmlkZW9XaWRn
ZXQoKTsKKyAgICB2b2lkIHNob3coUU1lZGlhUGxheWVyKik7CisKK1FfU0lHTkFMUzoKKyAgICB2
b2lkIGRpZEV4aXRGdWxsU2NyZWVuKCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIHZvaWQg
Y2xvc2VFdmVudChRQ2xvc2VFdmVudCopOworICAgIHZpcnR1YWwgYm9vbCBldmVudChRRXZlbnQq
KTsKKyAgICB2aXJ0dWFsIHZvaWQga2V5UHJlc3NFdmVudChRS2V5RXZlbnQqKTsKKworcHJpdmF0
ZSBRX1NMT1RTOgorICAgIHZvaWQgaGlkZUN1cnNvcigpOworCitwcml2YXRlOgorICAgIHZvaWQg
c2hvd0N1cnNvcigpOworICAgIFFNZWRpYVBsYXllciogbV9tZWRpYVBsYXllcjsKKyAgICBRVGlt
ZXIgbV9jdXJzb3JUaW1lcjsKK307CisKK30KKworI2VuZGlmIC8vIEZ1bGxTY3JlZW5WaWRlb1dp
ZGdldF9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldFN1cHBvcnQvSW5pdFdl
YktpdFF0LmNwcCBiL1NvdXJjZS9XZWJLaXQvcXQvV2lkZ2V0U3VwcG9ydC9Jbml0V2ViS2l0UXQu
Y3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAuLjcxODg2MDM3ZGE1ZjhjMTI1ZjY1MDU0Y2ZlOGNmZjE3NzE0ZGU0ZTAK
LS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldFN1cHBvcnQvSW5pdFdl
YktpdFF0LmNwcApAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIERp
Z2lhIFBsYyBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykuCisgKgorICogVGhpcyBsaWJyYXJ5
IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9k
aWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMK
KyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247
IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24p
IGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBp
biB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdB
UlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5U
QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05V
CisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAq
CisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRo
ZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdh
cmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAq
IEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSAiY29uZmln
LmgiCisjaW5jbHVkZSAiSW5pdFdlYktpdFF0LmgiCisKKyNpbmNsdWRlICJJbml0V2ViQ29yZVF0
LmgiCisKKyNpbmNsdWRlICJRU3R5bGVGYWNhZGVJbXAuaCIKKworI2luY2x1ZGUgPFFBcHBsaWNh
dGlvbj4KKyNpbmNsdWRlIDxRU3R5bGU+CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitRX0RFQ0xf
RVhQT1JUIHZvaWQgaW5pdGlhbGl6ZVdlYktpdFdpZGdldHMoKQoreworICAgIHN0YXRpYyBib29s
IGluaXRpYWxpemVkID0gZmFsc2U7CisgICAgaWYgKGluaXRpYWxpemVkKQorICAgICAgICByZXR1
cm47CisKKyAgICBzZXRXZWJLaXRXaWRnZXRzSW5pdENhbGxiYWNrKFFTdHlsZUZhY2FkZUltcDo6
Y3JlYXRlKTsKKyAgICBpbml0aWFsaXplV2ViS2l0UXQoKTsKKworICAgIC8vIFFXZWJTZXR0aW5n
czo6U2VhcmNoQ2FuY2VsQnV0dG9uR3JhcGhpYworICAgIHNldEltYWdlUGxhdGZvcm1SZXNvdXJj
ZSgic2VhcmNoQ2FuY2VsQnV0dG9uIiwgUUFwcGxpY2F0aW9uOjpzdHlsZSgpLT5zdGFuZGFyZFBp
eG1hcChRU3R5bGU6OlNQX0RpYWxvZ0Nsb3NlQnV0dG9uKSk7CisgICAgLy8gUVdlYlNldHRpbmdz
OjpTZWFyY2hDYW5jZWxCdXR0b25QcmVzc2VkR3JhcGhpYworICAgIHNldEltYWdlUGxhdGZvcm1S
ZXNvdXJjZSgic2VhcmNoQ2FuY2VsQnV0dG9uUHJlc3NlZCIsIFFBcHBsaWNhdGlvbjo6c3R5bGUo
KS0+c3RhbmRhcmRQaXhtYXAoUVN0eWxlOjpTUF9EaWFsb2dDbG9zZUJ1dHRvbikpOworCisgICAg
aW5pdGlhbGl6ZWQgPSB0cnVlOworfQorCit9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0
L1dpZGdldFN1cHBvcnQvSW5pdFdlYktpdFF0LmggYi9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldFN1
cHBvcnQvSW5pdFdlYktpdFF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZmJiMmQxOGY3M2Q3NzFmMDg3MThjNmNi
ZWIxNGI5OTU3OWVkNThhMQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvcXQvV2lk
Z2V0U3VwcG9ydC9Jbml0V2ViS2l0UXQuaApAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDEyIERpZ2lhIFBsYyBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykuCisgKgor
ICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0
IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAo
YXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBp
cyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0
IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkg
b2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1v
cmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRo
ZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMg
bGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICog
dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBG
aWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisj
aWZuZGVmIEluaXRXZWJLaXRRdF9oCisjZGVmaW5lIEluaXRXZWJLaXRRdF9oCisKK25hbWVzcGFj
ZSBXZWJLaXQgeworCitRX0RFQ0xfRVhQT1JUIHZvaWQgaW5pdGlhbGl6ZVdlYktpdFdpZGdldHMo
KTsKKworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldFN1cHBv
cnQvSW5zcGVjdG9yQ2xpZW50V2ViUGFnZS5jcHAgYi9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldFN1
cHBvcnQvSW5zcGVjdG9yQ2xpZW50V2ViUGFnZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZGM0NzMwYjMyOTU4
NTg3OGMwNTJlNGFmYjE5ODViYTA0YmUzNzQzZAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9X
ZWJLaXQvcXQvV2lkZ2V0U3VwcG9ydC9JbnNwZWN0b3JDbGllbnRXZWJQYWdlLmNwcApAQCAtMCww
ICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTm9raWEgQ29ycG9yYXRpb24gYW5k
L29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggSG9sZ2VyIEhh
bnMgUGV0ZXIgRnJleXRoZXIKKyAqIENvcHlyaWdodCAoQykgMjAxMiBEaWdpYSBQbGMgYW5kL29y
IGl0cyBzdWJzaWRpYXJ5KC1pZXMpCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiAgTmVpdGhlciB0
aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBv
ZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9t
b3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBz
cGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NT
IE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YK
KyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkluc3Bl
Y3RvckNsaWVudFdlYlBhZ2UuaCIKKworI2luY2x1ZGUgPHF3ZWJmcmFtZS5oPgorCit1c2luZyBu
YW1lc3BhY2UgV2ViS2l0OworCitJbnNwZWN0b3JDbGllbnRXZWJQYWdlOjpJbnNwZWN0b3JDbGll
bnRXZWJQYWdlKCkKK3sKKyAgICBRV2ViVmlldyogdmlldyA9IG5ldyBRV2ViVmlldzsKKyAgICB2
aWV3LT5zZXRQYWdlKHRoaXMpOworICAgIHNldFBhcmVudCh2aWV3KTsKKyAgICBjb25uZWN0KG1h
aW5GcmFtZSgpLCBTSUdOQUwoamF2YVNjcmlwdFdpbmRvd09iamVjdENsZWFyZWQoKSksIFNMT1Qo
amF2YVNjcmlwdFdpbmRvd09iamVjdENsZWFyZWQoKSkpOworfQorCitRV2ViUGFnZSogSW5zcGVj
dG9yQ2xpZW50V2ViUGFnZTo6Y3JlYXRlV2luZG93KFFXZWJQYWdlOjpXZWJXaW5kb3dUeXBlKQor
eworICAgIFFXZWJWaWV3KiB2aWV3ID0gbmV3IFFXZWJWaWV3OworICAgIFFXZWJQYWdlKiBwYWdl
ID0gbmV3IFFXZWJQYWdlOworICAgIHZpZXctPnNldFBhZ2UocGFnZSk7CisgICAgdmlldy0+c2V0
QXR0cmlidXRlKFF0OjpXQV9EZWxldGVPbkNsb3NlKTsKKyAgICByZXR1cm4gcGFnZTsKK30KKwor
dm9pZCBJbnNwZWN0b3JDbGllbnRXZWJQYWdlOjpqYXZhU2NyaXB0V2luZG93T2JqZWN0Q2xlYXJl
ZCgpCit7CisgICAgUVZhcmlhbnQgaW5zcGVjdG9ySmF2YVNjcmlwdFdpbmRvd09iamVjdHMgPSBw
cm9wZXJ0eSgiX3FfaW5zcGVjdG9ySmF2YVNjcmlwdFdpbmRvd09iamVjdHMiKTsKKyAgICBpZiAo
IWluc3BlY3RvckphdmFTY3JpcHRXaW5kb3dPYmplY3RzLmlzVmFsaWQoKSkKKyAgICAgICAgcmV0
dXJuOworICAgIFFNYXA8UVN0cmluZywgUVZhcmlhbnQ+IGphdmFTY3JpcHROYW1lT2JqZWN0TWFw
ID0gaW5zcGVjdG9ySmF2YVNjcmlwdFdpbmRvd09iamVjdHMudG9NYXAoKTsKKyAgICBRV2ViRnJh
bWUqIGZyYW1lID0gbWFpbkZyYW1lKCk7CisgICAgUU1hcDxRU3RyaW5nLCBRVmFyaWFudD46OmNv
bnN0X2l0ZXJhdG9yIGl0ID0gamF2YVNjcmlwdE5hbWVPYmplY3RNYXAuY29uc3RCZWdpbigpOwor
ICAgIGZvciAoIDsgaXQgIT0gamF2YVNjcmlwdE5hbWVPYmplY3RNYXAuY29uc3RFbmQoKTsgKytp
dCkgeworICAgICAgICBRU3RyaW5nIG5hbWUgPSBpdC5rZXkoKTsKKyAgICAgICAgUVZhcmlhbnQg
dmFsdWUgPSBpdC52YWx1ZSgpOworICAgICAgICBRT2JqZWN0KiBvYmogPSB2YWx1ZS52YWx1ZTxR
T2JqZWN0Kj4oKTsKKyAgICAgICAgZnJhbWUtPmFkZFRvSmF2YVNjcmlwdFdpbmRvd09iamVjdChu
YW1lLCBvYmopOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9XaWRn
ZXRTdXBwb3J0L0luc3BlY3RvckNsaWVudFdlYlBhZ2UuaCBiL1NvdXJjZS9XZWJLaXQvcXQvV2lk
Z2V0U3VwcG9ydC9JbnNwZWN0b3JDbGllbnRXZWJQYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uODg3ZjI5YjBj
ZjUyMTlkZmFhMDRmYjNlOGZjNTc4ZmRkYWVhMDhhYwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJj
ZS9XZWJLaXQvcXQvV2lkZ2V0U3VwcG9ydC9JbnNwZWN0b3JDbGllbnRXZWJQYWdlLmgKQEAgLTAs
MCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmln
aHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA4IE5va2lhIENvcnBvcmF0aW9uIGFu
ZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQorICogQ29weXJpZ2h0IChDKSAyMDA4IEhvbGdlciBI
YW5zIFBldGVyIEZyZXl0aGVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgRGlnaWEgUGxjIGFuZC9v
ciBpdHMgc3Vic2lkaWFyeSgtaWVzKQorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIg
dGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMg
b2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJv
bW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQg
c3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9T
UyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9G
CisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorICovCisjaWZuZGVmIEluc3BlY3RvckNsaWVudFdlYlBhZ2VfaAorI2Rl
ZmluZSBJbnNwZWN0b3JDbGllbnRXZWJQYWdlX2gKKworI2luY2x1ZGUgPHF3ZWJwYWdlLmg+Cisj
aW5jbHVkZSA8cXdlYnZpZXcuaD4KKworbmFtZXNwYWNlIFdlYktpdCB7CisKK2NsYXNzIEluc3Bl
Y3RvckNsaWVudFdlYlBhZ2UgOiBwdWJsaWMgUVdlYlBhZ2UgeworICAgIFFfT0JKRUNUCisgICAg
ZnJpZW5kIGNsYXNzIEluc3BlY3RvckNsaWVudFF0OworcHVibGljOgorICAgIEluc3BlY3RvckNs
aWVudFdlYlBhZ2UoKTsKKworICAgIFFXZWJQYWdlKiBjcmVhdGVXaW5kb3coUVdlYlBhZ2U6Oldl
YldpbmRvd1R5cGUpOworCitwdWJsaWMgUV9TTE9UUzoKKyAgICB2b2lkIGphdmFTY3JpcHRXaW5k
b3dPYmplY3RDbGVhcmVkKCk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKKworI2VuZGlm
IC8vIEluc3BlY3RvckNsaWVudFdlYlBhZ2VfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9x
dC9XaWRnZXRTdXBwb3J0L1BhZ2VDbGllbnRRdC5jcHAgYi9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdl
dFN1cHBvcnQvUGFnZUNsaWVudFF0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4wOTVmOWU1ODI5ZDFlYWMwYzdh
ZTkwZTU0YzQwZGVjZmExNDhkOWZmCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9x
dC9XaWRnZXRTdXBwb3J0L1BhZ2VDbGllbnRRdC5jcHAKQEAgLTAsMCArMSwyOTcgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTAgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRp
YXJ5KC1pZXMpCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4g
cmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0
aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5
IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRo
ZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAq
IFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUg
dXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGlt
cGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2
ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBh
bG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90
LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJh
bmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNB
LgorICoKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUGFnZUNsaWVudFF0
LmgiCisKKyNpbmNsdWRlIDxRR3JhcGhpY3NTY2VuZT4KKyNpbmNsdWRlIDxRR3JhcGhpY3NWaWV3
PgorCisjaWYgZGVmaW5lZChRX1dTX1gxMSkKKyNpbmNsdWRlIDxRWDExSW5mbz4KKyNlbmRpZgor
CisjaWZkZWYgUVRfT1BFTkdMX0xJQgorI2luY2x1ZGUgPFFHTFdpZGdldD4KKyNlbmRpZgorCisj
aWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorI2luY2x1ZGUgIlRleHR1cmVNYXBwZXIu
aCIKKyNpbmNsdWRlICJ0ZXhtYXAvVGV4dHVyZU1hcHBlckxheWVyLmgiCisjZW5kaWYKKworUVdp
bmRvdyogUVdlYlBhZ2VDbGllbnQ6Om93bmVyV2luZG93KCkgY29uc3QKK3sKKyAgICBRV2lkZ2V0
KiB3aWRnZXQgPSBxb2JqZWN0X2Nhc3Q8UVdpZGdldCo+KG93bmVyV2lkZ2V0KCkpOworICAgIGlm
ICghd2lkZ2V0KQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoUVdpbmRvdyAqd2luZG93ID0g
d2lkZ2V0LT53aW5kb3dIYW5kbGUoKSkKKyAgICAgICAgcmV0dXJuIHdpbmRvdzsKKyAgICBpZiAo
Y29uc3QgUVdpZGdldCAqbmF0aXZlUGFyZW50ID0gd2lkZ2V0LT5uYXRpdmVQYXJlbnRXaWRnZXQo
KSkKKyAgICAgICAgcmV0dXJuIG5hdGl2ZVBhcmVudC0+d2luZG93SGFuZGxlKCk7CisgICAgcmV0
dXJuIDA7Cit9CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwordm9pZCBQYWdlQ2xpZW50UVdpZGdl
dDo6c2Nyb2xsKGludCBkeCwgaW50IGR5LCBjb25zdCBRUmVjdCYgcmVjdFRvU2Nyb2xsKQorewor
ICAgIHZpZXctPnNjcm9sbChxcmVhbChkeCksIHFyZWFsKGR5KSwgcmVjdFRvU2Nyb2xsKTsKK30K
Kwordm9pZCBQYWdlQ2xpZW50UVdpZGdldDo6dXBkYXRlKGNvbnN0IFFSZWN0ICYgZGlydHlSZWN0
KQoreworICAgIHZpZXctPnVwZGF0ZShkaXJ0eVJlY3QpOworfQorCit2b2lkIFBhZ2VDbGllbnRR
V2lkZ2V0OjpyZXBhaW50Vmlld3BvcnQoKQoreworICAgIHVwZGF0ZSh2aWV3LT5yZWN0KCkpOwor
fQorCit2b2lkIFBhZ2VDbGllbnRRV2lkZ2V0OjpzZXRJbnB1dE1ldGhvZEVuYWJsZWQoYm9vbCBl
bmFibGUpCit7CisgICAgdmlldy0+c2V0QXR0cmlidXRlKFF0OjpXQV9JbnB1dE1ldGhvZEVuYWJs
ZWQsIGVuYWJsZSk7Cit9CisKK2Jvb2wgUGFnZUNsaWVudFFXaWRnZXQ6OmlucHV0TWV0aG9kRW5h
YmxlZCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIHZpZXctPnRlc3RBdHRyaWJ1dGUoUXQ6OldBX0lu
cHV0TWV0aG9kRW5hYmxlZCk7Cit9CisKK3ZvaWQgUGFnZUNsaWVudFFXaWRnZXQ6OnNldElucHV0
TWV0aG9kSGludHMoUXQ6OklucHV0TWV0aG9kSGludHMgaGludHMpCit7CisgICAgdmlldy0+c2V0
SW5wdXRNZXRob2RIaW50cyhoaW50cyk7Cit9CisKK1BhZ2VDbGllbnRRV2lkZ2V0Ojp+UGFnZUNs
aWVudFFXaWRnZXQoKQoreworfQorCisjaWZuZGVmIFFUX05PX0NVUlNPUgorUUN1cnNvciBQYWdl
Q2xpZW50UVdpZGdldDo6Y3Vyc29yKCkgY29uc3QKK3sKKyAgICByZXR1cm4gdmlldy0+Y3Vyc29y
KCk7Cit9CisKK3ZvaWQgUGFnZUNsaWVudFFXaWRnZXQ6OnVwZGF0ZUN1cnNvcihjb25zdCBRQ3Vy
c29yJiBjdXJzb3IpCit7CisgICAgdmlldy0+c2V0Q3Vyc29yKGN1cnNvcik7Cit9CisjZW5kaWYK
KworUVBhbGV0dGUgUGFnZUNsaWVudFFXaWRnZXQ6OnBhbGV0dGUoKSBjb25zdAoreworICAgIHJl
dHVybiB2aWV3LT5wYWxldHRlKCk7Cit9CisKK2ludCBQYWdlQ2xpZW50UVdpZGdldDo6c2NyZWVu
TnVtYmVyKCkgY29uc3QKK3sKKyNpZiBkZWZpbmVkKFFfV1NfWDExKQorICAgIHJldHVybiB2aWV3
LT54MTFJbmZvKCkuc2NyZWVuKCk7CisjZW5kaWYKKyAgICByZXR1cm4gMDsKK30KKworUU9iamVj
dCogUGFnZUNsaWVudFFXaWRnZXQ6Om93bmVyV2lkZ2V0KCkgY29uc3QKK3sKKyAgICByZXR1cm4g
dmlldzsKK30KKworUVJlY3QgUGFnZUNsaWVudFFXaWRnZXQ6Omdlb21ldHJ5UmVsYXRpdmVUb093
bmVyV2lkZ2V0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gdmlldy0+Z2VvbWV0cnkoKTsKK30KKwor
UU9iamVjdCogUGFnZUNsaWVudFFXaWRnZXQ6OnBsdWdpblBhcmVudCgpIGNvbnN0Cit7CisgICAg
cmV0dXJuIHZpZXc7Cit9CisKK1FTdHlsZSogUGFnZUNsaWVudFFXaWRnZXQ6OnN0eWxlKCkgY29u
c3QKK3sKKyAgICByZXR1cm4gdmlldy0+c3R5bGUoKTsKK30KKworUVJlY3RGIFBhZ2VDbGllbnRR
V2lkZ2V0Ojp3aW5kb3dSZWN0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gUVJlY3RGKHZpZXctPndp
bmRvdygpLT5nZW9tZXRyeSgpKTsKK30KKwordm9pZCBQYWdlQ2xpZW50UVdpZGdldDo6c2V0V2lk
Z2V0VmlzaWJsZShXaWRnZXQqIHdpZGdldCwgYm9vbCB2aXNpYmxlKQoreworICAgIFFXaWRnZXQq
IHF0V2lkZ2V0ID0gcW9iamVjdF9jYXN0PFFXaWRnZXQqPih3aWRnZXQtPnBsYXRmb3JtV2lkZ2V0
KCkpOworICAgIGlmICghcXRXaWRnZXQpCisgICAgICAgIHJldHVybjsKKyAgICBxdFdpZGdldC0+
c2V0VmlzaWJsZSh2aXNpYmxlKTsKK30KKworI2lmICFkZWZpbmVkKFFUX05PX0dSQVBISUNTVklF
VykKK1BhZ2VDbGllbnRRR3JhcGhpY3NXaWRnZXQ6On5QYWdlQ2xpZW50UUdyYXBoaWNzV2lkZ2V0
KCkKK3sKKyAgICBkZWxldGUgb3ZlcmxheTsKK30KKwordm9pZCBQYWdlQ2xpZW50UUdyYXBoaWNz
V2lkZ2V0OjpzY3JvbGwoaW50IGR4LCBpbnQgZHksIGNvbnN0IFFSZWN0JiByZWN0VG9TY3JvbGwp
Cit7CisgICAgdmlldy0+c2Nyb2xsKHFyZWFsKGR4KSwgcXJlYWwoZHkpLCByZWN0VG9TY3JvbGwp
OworfQorCit2b2lkIFBhZ2VDbGllbnRRR3JhcGhpY3NXaWRnZXQ6OnVwZGF0ZShjb25zdCBRUmVj
dCYgZGlydHlSZWN0KQoreworICAgIHZpZXctPnVwZGF0ZShkaXJ0eVJlY3QpOworCisgICAgaWYg
KG92ZXJsYXkpCisgICAgICAgIG92ZXJsYXktPnVwZGF0ZShRUmVjdEYoZGlydHlSZWN0KSk7Cit9
CisKK3ZvaWQgUGFnZUNsaWVudFFHcmFwaGljc1dpZGdldDo6cmVwYWludFZpZXdwb3J0KCkKK3sK
KyAgICB1cGRhdGUodmlldy0+Ym91bmRpbmdSZWN0KCkudG9BbGlnbmVkUmVjdCgpKTsKK30KKwor
Ym9vbCBQYWdlQ2xpZW50UUdyYXBoaWNzV2lkZ2V0OjptYWtlT3BlbkdMQ29udGV4dEN1cnJlbnRJ
ZkF2YWlsYWJsZSgpCit7CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKSAmJiBVU0Uo
VEVYVFVSRV9NQVBQRVJfR0wpICYmIGRlZmluZWQoUVRfT1BFTkdMX0xJQikKKyAgICBRR3JhcGhp
Y3NWaWV3KiBncmFwaGljc1ZpZXcgPSB2aWV3LT5zY2VuZSgpLT52aWV3cygpWzBdOworICAgIGlm
IChncmFwaGljc1ZpZXcgJiYgZ3JhcGhpY3NWaWV3LT52aWV3cG9ydCgpKSB7CisgICAgICAgIFFH
TFdpZGdldCogZ2xXaWRnZXQgPSBxb2JqZWN0X2Nhc3Q8UUdMV2lkZ2V0Kj4oZ3JhcGhpY3NWaWV3
LT52aWV3cG9ydCgpKTsKKyAgICAgICAgaWYgKGdsV2lkZ2V0KSB7CisgICAgICAgICAgICAvLyBU
aGUgR0wgY29udGV4dCBiZWxvbmdpbmcgdG8gdGhlIFFHTFdpZGdldCB2aWV3cG9ydCBtdXN0IGJl
IGN1cnJlbnQgd2hlbiBUZXh0dXJlTWFwcGVyIGlzIGJlaW5nIGNyZWF0ZWQuCisgICAgICAgICAg
ICBnbFdpZGdldC0+bWFrZUN1cnJlbnQoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAg
ICAgICB9CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFBhZ2VD
bGllbnRRR3JhcGhpY3NXaWRnZXQ6OnNldElucHV0TWV0aG9kRW5hYmxlZChib29sIGVuYWJsZSkK
K3sKKyAgICB2aWV3LT5zZXRGbGFnKFFHcmFwaGljc0l0ZW06Okl0ZW1BY2NlcHRzSW5wdXRNZXRo
b2QsIGVuYWJsZSk7Cit9CisKK2Jvb2wgUGFnZUNsaWVudFFHcmFwaGljc1dpZGdldDo6aW5wdXRN
ZXRob2RFbmFibGVkKCkgY29uc3QKK3sKKyAgICByZXR1cm4gdmlldy0+ZmxhZ3MoKSAmIFFHcmFw
aGljc0l0ZW06Okl0ZW1BY2NlcHRzSW5wdXRNZXRob2Q7Cit9CisKK3ZvaWQgUGFnZUNsaWVudFFH
cmFwaGljc1dpZGdldDo6c2V0SW5wdXRNZXRob2RIaW50cyhRdDo6SW5wdXRNZXRob2RIaW50cyBo
aW50cykKK3sKKyAgICB2aWV3LT5zZXRJbnB1dE1ldGhvZEhpbnRzKGhpbnRzKTsKK30KKworI2lm
bmRlZiBRVF9OT19DVVJTT1IKK1FDdXJzb3IgUGFnZUNsaWVudFFHcmFwaGljc1dpZGdldDo6Y3Vy
c29yKCkgY29uc3QKK3sKKyAgICByZXR1cm4gdmlldy0+Y3Vyc29yKCk7Cit9CisKK3ZvaWQgUGFn
ZUNsaWVudFFHcmFwaGljc1dpZGdldDo6dXBkYXRlQ3Vyc29yKGNvbnN0IFFDdXJzb3ImIGN1cnNv
cikKK3sKKyAgICB2aWV3LT5zZXRDdXJzb3IoY3Vyc29yKTsKK30KKyNlbmRpZgorCitRUGFsZXR0
ZSBQYWdlQ2xpZW50UUdyYXBoaWNzV2lkZ2V0OjpwYWxldHRlKCkgY29uc3QKK3sKKyAgICByZXR1
cm4gdmlldy0+cGFsZXR0ZSgpOworfQorCitpbnQgUGFnZUNsaWVudFFHcmFwaGljc1dpZGdldDo6
c2NyZWVuTnVtYmVyKCkgY29uc3QKK3sKKyNpZiBkZWZpbmVkKFFfV1NfWDExKQorICAgIGlmIChR
R3JhcGhpY3NTY2VuZSogc2NlbmUgPSB2aWV3LT5zY2VuZSgpKSB7CisgICAgICAgIGNvbnN0IFFM
aXN0PFFHcmFwaGljc1ZpZXcqPiB2aWV3cyA9IHNjZW5lLT52aWV3cygpOworCisgICAgICAgIGlm
ICghdmlld3MuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIHZpZXdzLmF0KDApLT54MTFJ
bmZvKCkuc2NyZWVuKCk7CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gMDsKK30KKworUU9i
amVjdCogUGFnZUNsaWVudFFHcmFwaGljc1dpZGdldDo6b3duZXJXaWRnZXQoKSBjb25zdAorewor
ICAgIGlmIChRR3JhcGhpY3NTY2VuZSogc2NlbmUgPSB2aWV3LT5zY2VuZSgpKSB7CisgICAgICAg
IGNvbnN0IFFMaXN0PFFHcmFwaGljc1ZpZXcqPiB2aWV3cyA9IHNjZW5lLT52aWV3cygpOworICAg
ICAgICByZXR1cm4gdmlld3MudmFsdWUoMCk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitR
UmVjdCBQYWdlQ2xpZW50UUdyYXBoaWNzV2lkZ2V0OjpnZW9tZXRyeVJlbGF0aXZlVG9Pd25lcldp
ZGdldCgpIGNvbnN0Cit7CisgICAgaWYgKCF2aWV3LT5zY2VuZSgpKQorICAgICAgICByZXR1cm4g
UVJlY3QoKTsKKworICAgIFFMaXN0PFFHcmFwaGljc1ZpZXcqPiB2aWV3cyA9IHZpZXctPnNjZW5l
KCktPnZpZXdzKCk7CisgICAgaWYgKHZpZXdzLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIFFS
ZWN0KCk7CisKKyAgICBRR3JhcGhpY3NWaWV3KiBncmFwaGljc1ZpZXcgPSB2aWV3cy5hdCgwKTsK
KyAgICByZXR1cm4gZ3JhcGhpY3NWaWV3LT5tYXBGcm9tU2NlbmUodmlldy0+Ym91bmRpbmdSZWN0
KCkpLmJvdW5kaW5nUmVjdCgpOworfQorCisjaWYgVVNFKFRJTEVEX0JBQ0tJTkdfU1RPUkUpCitR
UmVjdEYgUGFnZUNsaWVudFFHcmFwaGljc1dpZGdldDo6Z3JhcGhpY3NJdGVtVmlzaWJsZVJlY3Qo
KSBjb25zdAoreworICAgIGlmICghdmlldy0+c2NlbmUoKSkKKyAgICAgICAgcmV0dXJuIFFSZWN0
RigpOworCisgICAgUUxpc3Q8UUdyYXBoaWNzVmlldyo+IHZpZXdzID0gdmlldy0+c2NlbmUoKS0+
dmlld3MoKTsKKyAgICBpZiAodmlld3MuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gUVJlY3RG
KCk7CisKKyAgICBRR3JhcGhpY3NWaWV3KiBncmFwaGljc1ZpZXcgPSB2aWV3cy5hdCgwKTsKKyAg
ICBpbnQgeE9mZnNldCA9IGdyYXBoaWNzVmlldy0+aG9yaXpvbnRhbFNjcm9sbEJhcigpLT52YWx1
ZSgpOworICAgIGludCB5T2Zmc2V0ID0gZ3JhcGhpY3NWaWV3LT52ZXJ0aWNhbFNjcm9sbEJhcigp
LT52YWx1ZSgpOworICAgIHJldHVybiB2aWV3LT5tYXBSZWN0RnJvbVNjZW5lKFFSZWN0RihRUG9p
bnRGKHhPZmZzZXQsIHlPZmZzZXQpLCBncmFwaGljc1ZpZXctPnZpZXdwb3J0KCktPnNpemUoKSkp
OworfQorI2VuZGlmCisKK1FPYmplY3QqIFBhZ2VDbGllbnRRR3JhcGhpY3NXaWRnZXQ6OnBsdWdp
blBhcmVudCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIHZpZXc7Cit9CisKK1FTdHlsZSogUGFnZUNs
aWVudFFHcmFwaGljc1dpZGdldDo6c3R5bGUoKSBjb25zdAoreworICAgIHJldHVybiB2aWV3LT5z
dHlsZSgpOworfQorCit2b2lkIFBhZ2VDbGllbnRRR3JhcGhpY3NXaWRnZXQ6OnNldFdpZGdldFZp
c2libGUoV2lkZ2V0KiwgYm9vbCkKK3sKKyAgICAvLyBEb2Vzbid0IG1ha2Ugc2Vuc2UsIGRvZXMg
aXQ/Cit9CisKK1FSZWN0RiBQYWdlQ2xpZW50UUdyYXBoaWNzV2lkZ2V0Ojp3aW5kb3dSZWN0KCkg
Y29uc3QKK3sKKyAgICBpZiAoIXZpZXctPnNjZW5lKCkpCisgICAgICAgIHJldHVybiBRUmVjdEYo
KTsKKworICAgIC8vIFRoZSBzY2VuZVJlY3QgaXMgYSBnb29kIGFwcHJveGltYXRpb24gb2YgdGhl
IHNpemUgb2YgdGhlIGFwcGxpY2F0aW9uLCBpbmRlcGVuZGVudCBvZiB0aGUgdmlldy4KKyAgICBy
ZXR1cm4gdmlldy0+c2NlbmUoKS0+c2NlbmVSZWN0KCk7Cit9CisjZW5kaWYgLy8gUVRfTk9fR1JB
UEhJQ1NWSUVXCisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKwpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYktpdC9xdC9XaWRnZXRTdXBwb3J0L1BhZ2VDbGllbnRRdC5oIGIvU291cmNlL1dlYktpdC9x
dC9XaWRnZXRTdXBwb3J0L1BhZ2VDbGllbnRRdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjYzYTgwYWQwMzkyMWU3
MWQ5MTQ4MzNjZTRmODdmZjRhMDM0NzZiYWYKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2Vi
S2l0L3F0L1dpZGdldFN1cHBvcnQvUGFnZUNsaWVudFF0LmgKQEAgLTAsMCArMSwxOTEgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJz
aWRpYXJ5KC1pZXMpCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBj
YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBv
ZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVk
IGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9m
IHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoK
KyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwg
YmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl
IGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVj
ZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisg
KiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYg
bm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEg
RnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwg
VVNBLgorICoKKyAqLworCisjaWZuZGVmIFBhZ2VDbGllbnRRdF9oCisjZGVmaW5lIFBhZ2VDbGll
bnRRdF9oCisKKyNpbmNsdWRlICJGcmFtZVZpZXcuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRl
eHQuaCIKKyNpbmNsdWRlICJJbnRSZWN0LmgiCisjaW5jbHVkZSAiUVdlYlBhZ2VDbGllbnQuaCIK
KyNpbmNsdWRlICJUZXh0dXJlTWFwcGVyTGF5ZXJDbGllbnRRdC5oIgorI2luY2x1ZGUgIlRpbGVk
QmFja2luZ1N0b3JlLmgiCisjaW5jbHVkZSAicWdyYXBoaWNzd2Vidmlldy5oIgorI2luY2x1ZGUg
InF3ZWJmcmFtZS5oIgorI2luY2x1ZGUgInF3ZWJmcmFtZV9wLmgiCisjaW5jbHVkZSAicXdlYnBh
Z2UuaCIKKyNpbmNsdWRlICJxd2VicGFnZV9wLmgiCisjaW5jbHVkZSA8U2V0dGluZ3MuaD4KKyNp
bmNsdWRlIDxxZ3JhcGhpY3NzY2VuZS5oPgorI2luY2x1ZGUgPHFncmFwaGljc3ZpZXcuaD4KKyNp
bmNsdWRlIDxxZ3JhcGhpY3N3aWRnZXQuaD4KKyNpbmNsdWRlIDxxbWV0YW9iamVjdC5oPgorI2lu
Y2x1ZGUgPHFzY3JvbGxiYXIuaD4KKyNpbmNsdWRlIDxxc3R5bGVvcHRpb24uaD4KKyNpbmNsdWRl
IDxxdGltZXIuaD4KKyNpbmNsdWRlIDxxd2lkZ2V0Lmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
KworY2xhc3MgUGFnZUNsaWVudFFXaWRnZXQgOiBwdWJsaWMgUVdlYlBhZ2VDbGllbnQgeworcHVi
bGljOgorICAgIFBhZ2VDbGllbnRRV2lkZ2V0KFFXaWRnZXQqIG5ld1ZpZXcsIFFXZWJQYWdlKiBu
ZXdQYWdlKQorICAgICAgICA6IHZpZXcobmV3VmlldykKKyAgICAgICAgLCBwYWdlKG5ld1BhZ2Up
CisgICAgeworICAgICAgICBRX0FTU0VSVCh2aWV3KTsKKyAgICB9CisgICAgdmlydHVhbCB+UGFn
ZUNsaWVudFFXaWRnZXQoKTsKKworICAgIHZpcnR1YWwgYm9vbCBpc1FXaWRnZXRDbGllbnQoKSBj
b25zdCB7IHJldHVybiB0cnVlOyB9CisKKyAgICB2aXJ0dWFsIHZvaWQgc2Nyb2xsKGludCBkeCwg
aW50IGR5LCBjb25zdCBRUmVjdCYpOworICAgIHZpcnR1YWwgdm9pZCB1cGRhdGUoY29uc3QgUVJl
Y3QmIGRpcnR5UmVjdCk7CisgICAgdmlydHVhbCB2b2lkIHJlcGFpbnRWaWV3cG9ydCgpOworICAg
IHZpcnR1YWwgdm9pZCBzZXRJbnB1dE1ldGhvZEVuYWJsZWQoYm9vbCk7CisgICAgdmlydHVhbCBi
b29sIGlucHV0TWV0aG9kRW5hYmxlZCgpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBzZXRJbnB1
dE1ldGhvZEhpbnRzKFF0OjpJbnB1dE1ldGhvZEhpbnRzKTsKKworI2lmbmRlZiBRVF9OT19DVVJT
T1IKKyAgICB2aXJ0dWFsIFFDdXJzb3IgY3Vyc29yKCkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lk
IHVwZGF0ZUN1cnNvcihjb25zdCBRQ3Vyc29yJik7CisjZW5kaWYKKworICAgIHZpcnR1YWwgUVBh
bGV0dGUgcGFsZXR0ZSgpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IHNjcmVlbk51bWJlcigpIGNv
bnN0OworICAgIHZpcnR1YWwgUU9iamVjdCogb3duZXJXaWRnZXQoKSBjb25zdDsKKyAgICB2aXJ0
dWFsIFFSZWN0IGdlb21ldHJ5UmVsYXRpdmVUb093bmVyV2lkZ2V0KCkgY29uc3Q7CisKKyAgICB2
aXJ0dWFsIFFPYmplY3QqIHBsdWdpblBhcmVudCgpIGNvbnN0OworCisgICAgdmlydHVhbCBRU3R5
bGUqIHN0eWxlKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIGJvb2wgdmlld1Jlc2l6ZXNUb0NvbnRl
bnRzRW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICB2aXJ0dWFsIFFSZWN0
RiB3aW5kb3dSZWN0KCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0V2lkZ2V0VmlzaWJs
ZShXaWRnZXQqLCBib29sIHZpc2libGUpOworCisgICAgUVdpZGdldCogdmlldzsKKyAgICBRV2Vi
UGFnZSogcGFnZTsKK307CisKKyNpZiAhZGVmaW5lZChRVF9OT19HUkFQSElDU1ZJRVcpCisvLyB0
aGUgb3ZlcmxheSBpcyBoZXJlIGZvciBvbmUgcmVhc29uIG9ubHk6IHRvIGhhdmUgdGhlIHNjcm9s
bC1iYXJzIGFuZCBvdGhlcgorLy8gZXh0cmEgVUkgZWxlbWVudHMgYXBwZWFyIG9uIHRvcCBvZiBh
bnkgUUdyYXBoaWNzSXRlbXMgY3JlYXRlZCBieSBDU1MgY29tcG9zaXRpbmcgbGF5ZXJzCitjbGFz
cyBRR3JhcGhpY3NJdGVtT3ZlcmxheSA6IHB1YmxpYyBRR3JhcGhpY3NPYmplY3QgeworICAgIHB1
YmxpYzoKKyAgICBRR3JhcGhpY3NJdGVtT3ZlcmxheShRR3JhcGhpY3NXaWRnZXQqIHZpZXcsIFFX
ZWJQYWdlKiBwKQorICAgICAgICA6IFFHcmFwaGljc09iamVjdCh2aWV3KQorICAgICAgICAsIHEo
dmlldykKKyAgICAgICAgLCBwYWdlKHApCisgICAgeworICAgICAgICBzZXRQb3MoMCwgMCk7Cisg
ICAgICAgIHNldEZsYWcoUUdyYXBoaWNzSXRlbTo6SXRlbVVzZXNFeHRlbmRlZFN0eWxlT3B0aW9u
LCB0cnVlKTsKKyAgICAgICAgc2V0Q2FjaGVNb2RlKFFHcmFwaGljc0l0ZW06OkRldmljZUNvb3Jk
aW5hdGVDYWNoZSk7CisgICAgfQorCisgICAgUVJlY3RGIGJvdW5kaW5nUmVjdCgpIGNvbnN0Cisg
ICAgeworICAgICAgICByZXR1cm4gcS0+Ym91bmRpbmdSZWN0KCk7CisgICAgfQorCisgICAgdm9p
ZCBwYWludChRUGFpbnRlciogcGFpbnRlciwgY29uc3QgUVN0eWxlT3B0aW9uR3JhcGhpY3NJdGVt
KiBvcHRpb25zLCBRV2lkZ2V0KikKKyAgICB7CisgICAgICAgIHBhZ2UtPm1haW5GcmFtZSgpLT5y
ZW5kZXIocGFpbnRlciwgc3RhdGljX2Nhc3Q8UVdlYkZyYW1lOjpSZW5kZXJMYXllcj4oUVdlYkZy
YW1lOjpBbGxMYXllcnMmKH5RV2ViRnJhbWU6OkNvbnRlbnRzTGF5ZXIpKSwgb3B0aW9ucy0+ZXhw
b3NlZFJlY3QudG9SZWN0KCkpOworICAgIH0KKworICAgIHZvaWQgcHJlcGFyZUdyYXBoaWNzSXRl
bUdlb21ldHJ5Q2hhbmdlKCkKKyAgICB7CisgICAgICAgIHByZXBhcmVHZW9tZXRyeUNoYW5nZSgp
OworICAgIH0KKworICAgIFFHcmFwaGljc1dpZGdldCogcTsKKyAgICBRV2ViUGFnZSogcGFnZTsK
K307CisKKworY2xhc3MgUGFnZUNsaWVudFFHcmFwaGljc1dpZGdldCA6IHB1YmxpYyBRV2ViUGFn
ZUNsaWVudCB7CitwdWJsaWM6CisgICAgUGFnZUNsaWVudFFHcmFwaGljc1dpZGdldChRR3JhcGhp
Y3NXZWJWaWV3KiBuZXdWaWV3LCBRV2ViUGFnZSogbmV3UGFnZSkKKyAgICAgICAgOiB2aWV3KG5l
d1ZpZXcpCisgICAgICAgICwgcGFnZShuZXdQYWdlKQorICAgICAgICAsIHZpZXdSZXNpemVzVG9D
b250ZW50cyhmYWxzZSkKKyAgICAgICAgLCBvdmVybGF5KDApCisgICAgeworICAgICAgICBRX0FT
U0VSVCh2aWV3KTsKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgICAgIC8v
IHRoZSBvdmVybGF5IGFuZCBzdGF5cyBhbGl2ZSBmb3IgdGhlIGxpZmV0aW1lIG9mCisgICAgICAg
IC8vIHRoaXMgUUdyYXBoaWNzV2ViVmlldyBhcyB0aGUgc2Nyb2xsYmFycyBhcmUgbmVlZGVkIHdo
ZW4gdGhlcmUncyBubyBjb21wb3NpdGluZworICAgICAgICB2aWV3LT5zZXRGbGFnKFFHcmFwaGlj
c0l0ZW06Okl0ZW1Vc2VzRXh0ZW5kZWRTdHlsZU9wdGlvbik7CisjZW5kaWYKKyAgICB9CisKKyAg
ICB2aXJ0dWFsIH5QYWdlQ2xpZW50UUdyYXBoaWNzV2lkZ2V0KCk7CisKKyAgICB2aXJ0dWFsIGJv
b2wgaXNRV2lkZ2V0Q2xpZW50KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICAgIHZpcnR1
YWwgdm9pZCBzY3JvbGwoaW50IGR4LCBpbnQgZHksIGNvbnN0IFFSZWN0Jik7CisgICAgdmlydHVh
bCB2b2lkIHVwZGF0ZShjb25zdCBRUmVjdCYgZGlydHlSZWN0KTsKKyAgICB2aXJ0dWFsIHZvaWQg
cmVwYWludFZpZXdwb3J0KCk7CisgICAgdmlydHVhbCB2b2lkIHNldElucHV0TWV0aG9kRW5hYmxl
ZChib29sKTsKKyAgICB2aXJ0dWFsIGJvb2wgaW5wdXRNZXRob2RFbmFibGVkKCkgY29uc3Q7Cisg
ICAgdmlydHVhbCB2b2lkIHNldElucHV0TWV0aG9kSGludHMoUXQ6OklucHV0TWV0aG9kSGludHMp
OworCisjaWZuZGVmIFFUX05PX0NVUlNPUgorICAgIHZpcnR1YWwgUUN1cnNvciBjdXJzb3IoKSBj
b25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlQ3Vyc29yKGNvbnN0IFFDdXJzb3ImKTsKKyNl
bmRpZgorCisgICAgdmlydHVhbCBRUGFsZXR0ZSBwYWxldHRlKCkgY29uc3Q7CisgICAgdmlydHVh
bCBpbnQgc2NyZWVuTnVtYmVyKCkgY29uc3Q7CisgICAgdmlydHVhbCBRT2JqZWN0KiBvd25lcldp
ZGdldCgpIGNvbnN0OworICAgIHZpcnR1YWwgUVJlY3QgZ2VvbWV0cnlSZWxhdGl2ZVRvT3duZXJX
aWRnZXQoKSBjb25zdDsKKworICAgIHZpcnR1YWwgUU9iamVjdCogcGx1Z2luUGFyZW50KCkgY29u
c3Q7CisKKyAgICB2aXJ0dWFsIFFTdHlsZSogc3R5bGUoKSBjb25zdDsKKworICAgIHZpcnR1YWwg
Ym9vbCB2aWV3UmVzaXplc1RvQ29udGVudHNFbmFibGVkKCkgY29uc3QgeyByZXR1cm4gdmlld1Jl
c2l6ZXNUb0NvbnRlbnRzOyB9CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0V2lkZ2V0VmlzaWJsZShX
aWRnZXQqLCBib29sKTsKKworI2lmIFVTRShUSUxFRF9CQUNLSU5HX1NUT1JFKQorICAgIHZpcnR1
YWwgUVJlY3RGIGdyYXBoaWNzSXRlbVZpc2libGVSZWN0KCkgY29uc3Q7CisjZW5kaWYKKworICAg
IHZpcnR1YWwgYm9vbCBtYWtlT3BlbkdMQ29udGV4dEN1cnJlbnRJZkF2YWlsYWJsZSgpOworCisg
ICAgdmlydHVhbCBRUmVjdEYgd2luZG93UmVjdCgpIGNvbnN0OworCisgICAgUUdyYXBoaWNzV2Vi
VmlldyogdmlldzsKKyAgICBRV2ViUGFnZSogcGFnZTsKKyAgICBib29sIHZpZXdSZXNpemVzVG9D
b250ZW50czsKKworICAgIC8vIHRoZSBvdmVybGF5IGdldHMgaW5zdGFudGlhdGVkIHdoZW4gdGhl
IHJvb3QgbGF5ZXIgaXMgYXR0YWNoZWQsIGFuZCBnZXQgZGVsZXRlZCB3aGVuIGl0J3MgZGV0YWNo
ZWQKKyAgICBRR3JhcGhpY3NJdGVtT3ZlcmxheSogb3ZlcmxheTsKKworICAgIC8vIHdlIG5lZWQg
dG8gcHV0IHRoZSByb290IGdyYXBoaWNzIGxheWVyIGJlaGluZCB0aGUgb3ZlcmxheSAod2hpY2gg
Y29udGFpbnMgdGhlIHNjcm9sbGJhcikKKyAgICBlbnVtIHsgUm9vdEdyYXBoaWNzTGF5ZXJaVmFs
dWUsIE92ZXJsYXlaVmFsdWUgfTsKK307CisjZW5kaWYgLy8gUVRfTk9fR1JBUEhJQ1NWSUVXCisK
K30KKyNlbmRpZiAvLyBQYWdlQ2xpZW50UXQKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvcXQv
V2lkZ2V0U3VwcG9ydC9RR3JhcGhpY3NXaWRnZXRQbHVnaW5JbXBsLmNwcCBiL1NvdXJjZS9XZWJL
aXQvcXQvV2lkZ2V0U3VwcG9ydC9RR3JhcGhpY3NXaWRnZXRQbHVnaW5JbXBsLmNwcApuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwLi41MTM3OTMzYTBmYWFlNzRkNTI3ZTE5NzczMzhkZTM2NWEyMzc1NWRmCi0tLSAvZGV2L251
bGwKKysrIGIvU291cmNlL1dlYktpdC9xdC9XaWRnZXRTdXBwb3J0L1FHcmFwaGljc1dpZGdldFBs
dWdpbkltcGwuY3BwCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIg
RGlnaWEgUGxjIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKS4KKyAqCisgKiBUaGlzIGxpYnJh
cnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBt
b2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1Ymxp
YworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv
bjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlv
bikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVk
IGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkg
V0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hB
TlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBH
TlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgor
ICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUg
dGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0
d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAor
ICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlICJjb25m
aWcuaCIKKyNpbmNsdWRlICJRR3JhcGhpY3NXaWRnZXRQbHVnaW5JbXBsLmgiCisKKyNpbmNsdWRl
IDxRR3JhcGhpY3NTY2VuZT4KKyNpbmNsdWRlIDxRR3JhcGhpY3NXaWRnZXQ+CisKKyNpZm5kZWYg
UVRfTk9fR1JBUEhJQ1NWSUVXCisKK1FHcmFwaGljc1dpZGdldFBsdWdpbkltcGw6On5RR3JhcGhp
Y3NXaWRnZXRQbHVnaW5JbXBsKCkKK3sKKyAgICBtX2dyYXBoaWNzV2lkZ2V0LT5kZWxldGVMYXRl
cigpOworfQorCit2b2lkIFFHcmFwaGljc1dpZGdldFBsdWdpbkltcGw6OnVwZGF0ZShjb25zdCBR
UmVjdCAmcmVjdCkKK3sKKyAgICBRR3JhcGhpY3NTY2VuZSogc2NlbmUgPSBtX2dyYXBoaWNzV2lk
Z2V0LT5zY2VuZSgpOworICAgIGlmIChzY2VuZSkKKyAgICAgICAgc2NlbmUtPnVwZGF0ZShyZWN0
KTsKK30KKwordm9pZCBRR3JhcGhpY3NXaWRnZXRQbHVnaW5JbXBsOjpzZXRHZW9tZXRyeUFuZENs
aXAoY29uc3QgUVJlY3QgJmdlb21ldHJ5LCBjb25zdCBRUmVjdCAmLCBib29sKQoreworICAgIG1f
Z3JhcGhpY3NXaWRnZXQtPnNldEdlb21ldHJ5KGdlb21ldHJ5KTsKKyAgICAvLyBGSVhNRTogTWFr
ZSB0aGUgY29kZSBoYW5kbGUgY2xpcHBpbmcgb2YgZ3JhcGhpY3Mgd2lkZ2V0cy4KK30KKwordm9p
ZCBRR3JhcGhpY3NXaWRnZXRQbHVnaW5JbXBsOjpzZXRWaXNpYmxlKGJvb2wgdmlzaWJsZSkKK3sK
KyAgICBtX2dyYXBoaWNzV2lkZ2V0LT5zZXRWaXNpYmxlKHZpc2libGUpOworfQorCit2b2lkIFFH
cmFwaGljc1dpZGdldFBsdWdpbkltcGw6OnNldFdpZGdldFBhcmVudChRT2JqZWN0KiBwYXJlbnQp
Cit7CisgICAgUUdyYXBoaWNzT2JqZWN0KiBwYXJlbnRJdGVtID0gcW9iamVjdF9jYXN0PFFHcmFw
aGljc09iamVjdCo+KHBhcmVudCk7CisgICAgaWYgKHBhcmVudEl0ZW0pCisgICAgICAgIG1fZ3Jh
cGhpY3NXaWRnZXQtPnNldFBhcmVudEl0ZW0ocGFyZW50SXRlbSk7Cit9CisKK1FPYmplY3QqIFFH
cmFwaGljc1dpZGdldFBsdWdpbkltcGw6OmhhbmRsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1f
Z3JhcGhpY3NXaWRnZXQ7Cit9CisKKyNpbmNsdWRlICJtb2NfUUdyYXBoaWNzV2lkZ2V0UGx1Z2lu
SW1wbC5jcHAiCisKKyNlbmRpZiAvLyAhZGVmaW5lZChRVF9OT19HUkFQSElDU1ZJRVcpCmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldFN1cHBvcnQvUUdyYXBoaWNzV2lkZ2V0UGx1
Z2luSW1wbC5oIGIvU291cmNlL1dlYktpdC9xdC9XaWRnZXRTdXBwb3J0L1FHcmFwaGljc1dpZGdl
dFBsdWdpbkltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi43Zjc1ODIyNmM0ZjgwZjNiZjQwYTU1ZGZiNjk5YzVl
ODRmYmE5MjNlCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9xdC9XaWRnZXRTdXBw
b3J0L1FHcmFwaGljc1dpZGdldFBsdWdpbkltcGwuaApAQCAtMCwwICsxLDQ3IEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDEyIERpZ2lhIFBsYyBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcyku
CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli
dXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVl
IFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNl
LCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGli
cmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAor
ICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2Fy
cmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug
Zm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5
IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRo
IHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0
bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3Ry
ZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAq
LworI2lmbmRlZiBRR3JhcGhpY3NXaWRnZXRQbHVnaW5JbXBsX2gKKyNkZWZpbmUgUUdyYXBoaWNz
V2lkZ2V0UGx1Z2luSW1wbF9oCisKKyNpZm5kZWYgUVRfTk9fR1JBUEhJQ1NWSUVXCisKKyNpbmNs
dWRlICJRdFBsdWdpbldpZGdldEFkYXB0ZXIuaCIKKworUVRfQkVHSU5fTkFNRVNQQUNFCitjbGFz
cyBRR3JhcGhpY3NXaWRnZXQ7CitRVF9FTkRfTkFNRVNQQUNFCisKK2NsYXNzIFFHcmFwaGljc1dp
ZGdldFBsdWdpbkltcGwgOiBwdWJsaWMgUXRQbHVnaW5XaWRnZXRBZGFwdGVyIHsKKyAgICBRX09C
SkVDVAorcHVibGljOgorICAgIFFHcmFwaGljc1dpZGdldFBsdWdpbkltcGwoUUdyYXBoaWNzV2lk
Z2V0ICp3KSA6IG1fZ3JhcGhpY3NXaWRnZXQodykgeyB9CisgICAgdmlydHVhbCB+UUdyYXBoaWNz
V2lkZ2V0UGx1Z2luSW1wbCgpOworICAgIHZpcnR1YWwgdm9pZCB1cGRhdGUoY29uc3QgUVJlY3Qg
JikgT1ZFUlJJREU7CisgICAgdmlydHVhbCB2b2lkIHNldEdlb21ldHJ5QW5kQ2xpcChjb25zdCBR
UmVjdCYsIGNvbnN0IFFSZWN0JiwgYm9vbCkgT1ZFUlJJREU7CisgICAgdmlydHVhbCB2b2lkIHNl
dFZpc2libGUoYm9vbCk7CisgICAgdmlydHVhbCB2b2lkIHNldFN0eWxlU2hlZXQoY29uc3QgUVN0
cmluZyYpIE9WRVJSSURFIHsgfQorICAgIHZpcnR1YWwgdm9pZCBzZXRXaWRnZXRQYXJlbnQoUU9i
amVjdCopIE9WRVJSSURFOworICAgIHZpcnR1YWwgUU9iamVjdCogaGFuZGxlKCkgY29uc3QgT1ZF
UlJJREU7Citwcml2YXRlOgorICAgIFFHcmFwaGljc1dpZGdldCAqbV9ncmFwaGljc1dpZGdldDsK
K307CisjZW5kaWYgLy8gIWRlZmluZWQoUVRfTk9fR1JBUEhJQ1NWSUVXKQorCisjZW5kaWYgLy8g
UUdyYXBoaWNzV2lkZ2V0UGx1Z2luSW1wbF9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0
L1dpZGdldFN1cHBvcnQvUVN0eWxlRmFjYWRlSW1wLmNwcCBiL1NvdXJjZS9XZWJLaXQvcXQvV2lk
Z2V0U3VwcG9ydC9RU3R5bGVGYWNhZGVJbXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmJkNmJlMWU0NzZhOTc0
MzY3ZWJiMmEyOWJmOWQxZGRjODkwNmExMzQKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2Vi
S2l0L3F0L1dpZGdldFN1cHBvcnQvUVN0eWxlRmFjYWRlSW1wLmNwcApAQCAtMCwwICsxLDUwMiBA
QAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSB0aGVtZSBpbXBsZW1lbnRhdGlvbiBm
b3IgZm9ybSBjb250cm9scyBpbiBXZWJDb3JlLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBE
aWdpYSBQbGMgYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpLgorICogQ29weXJpZ2h0IChDKSAy
MDExLTIwMTIgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpLgor
ICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBT
b2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwg
b3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJh
cnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAq
IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJh
bnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv
ciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBv
ZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0
aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8K
KyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVl
dCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSAiUVN0eWxlRmFjYWRlSW1wLmgiCisK
KyNpbmNsdWRlIDxRQXBwbGljYXRpb24+CisjaW5jbHVkZSA8UUxpbmVFZGl0PgorI2luY2x1ZGUg
PFFQYWludGVyPgorI2luY2x1ZGUgPFFQdXNoQnV0dG9uPgorI2luY2x1ZGUgPFFTdHlsZUZhY3Rv
cnk+CisjaW5jbHVkZSA8UVN0eWxlT3B0aW9uPgorCisjaW5jbHVkZSA8UVdlYlBhZ2VBZGFwdGVy
Lmg+CisjaW5jbHVkZSA8UVdlYlBhZ2VDbGllbnQuaD4KKwordXNpbmcgbmFtZXNwYWNlIFdlYkNv
cmU7CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitzdGF0aWMgUVN0eWxlOjpTdGF0ZSBjb252ZXJ0
VG9RU3R5bGVTdGF0ZShRU3R5bGVGYWNhZGU6OlN0YXRlIHN0YXRlKQoreworICAgIFFTdHlsZTo6
U3RhdGUgcmVzdWx0OworI2RlZmluZSBDT05WRVJUX1NUQVRFKFByb3hpZWRTdGF0ZSwgVmFsdWUp
IFwKKyAgICBpZiAoc3RhdGUgJiBRU3R5bGVGYWNhZGU6OlByb3hpZWRTdGF0ZSkgXAorICAgICAg
ICByZXN1bHQgfD0gUVN0eWxlOjpQcm94aWVkU3RhdGU7CisKKyAgICBGT1JfRUFDSF9NQVBQRURf
U1RBVEUoQ09OVkVSVF9TVEFURSwgKQorCisjdW5kZWYgQ09OVkVSVF9TVEFURQorCisgICAgcmV0
dXJuIHJlc3VsdDsKK30KKworc3RhdGljIFFTdHlsZTo6U3ViQ29udHJvbCBjb252ZXJ0VG9RU3R5
bGVTdWJDb250cm9sKFFTdHlsZUZhY2FkZTo6U3ViQ29udHJvbCBzYykKK3sKKyNkZWZpbmUgQ09O
VkVSVF9TVUJDT05UUk9MKEYsIFZhbHVlKSBcCisgICAgY2FzZSBRU3R5bGVGYWNhZGU6OkY6IHJl
dHVybiBRU3R5bGU6OkYKKworICAgIHN3aXRjaCAoc2MpIHsKKyAgICAgICAgRk9SX0VBQ0hfU1VC
Q09OVFJPTChDT05WRVJUX1NVQkNPTlRST0wsIFNFTUlDT0xPTik7CisgICAgfQorICAgIEFTU0VS
VF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiBRU3R5bGU6OlNDX05vbmU7CisjdW5kZWYgQ09O
VkVSVF9TVUJDT05UUk9MCit9CisKK3N0YXRpYyB2b2lkIGluaXRHZW5lcmljU3R5bGVPcHRpb24o
UVN0eWxlT3B0aW9uKiBvcHRpb24sIFFXaWRnZXQqIHdpZGdldCwgY29uc3QgUVN0eWxlRmFjYWRl
T3B0aW9uJiBmYWNhZGVPcHRpb24pCit7CisgICAgaWYgKHdpZGdldCkKKyAgICAgICAgb3B0aW9u
LT5pbml0KHdpZGdldCk7CisgICAgZWxzZQorICAgICAgICAvLyBJZiBhIHdpZGdldCBpcyBub3Qg
ZGlyZWN0bHkgYXZhaWxhYmxlIGZvciByZW5kZXJpbmcsIHdlIGZhbGxiYWNrIHRvIGRlZmF1bHQK
KyAgICAgICAgLy8gdmFsdWUgZm9yIGFuIGFjdGl2ZSB3aWRnZXQuCisgICAgICAgIG9wdGlvbi0+
c3RhdGUgPSBRU3R5bGU6OlN0YXRlX0FjdGl2ZSB8IFFTdHlsZTo6U3RhdGVfRW5hYmxlZDsKKwor
ICAgIG9wdGlvbi0+cmVjdCA9IGZhY2FkZU9wdGlvbi5yZWN0OworICAgIG9wdGlvbi0+c3RhdGUg
PSBjb252ZXJ0VG9RU3R5bGVTdGF0ZShmYWNhZGVPcHRpb24uc3RhdGUpOworICAgIG9wdGlvbi0+
ZGlyZWN0aW9uID0gZmFjYWRlT3B0aW9uLmRpcmVjdGlvbjsKKyAgICBvcHRpb24tPnBhbGV0dGUg
PSBmYWNhZGVPcHRpb24ucGFsZXR0ZTsKK30KKworc3RhdGljIHZvaWQgaW5pdFNwZWNpZmljU3R5
bGVPcHRpb24oUVN0eWxlT3B0aW9uKiwgY29uc3QgUVN0eWxlRmFjYWRlT3B0aW9uJikKK3sKK30K
Kworc3RhdGljIHZvaWQgaW5pdFNwZWNpZmljU3R5bGVPcHRpb24oUVN0eWxlT3B0aW9uU2xpZGVy
KiBzbGlkZXJPcHRpb24sIGNvbnN0IFFTdHlsZUZhY2FkZU9wdGlvbiYgZmFjYWRlT3B0aW9uKQor
eworICAgIHNsaWRlck9wdGlvbi0+b3JpZW50YXRpb24gPSBmYWNhZGVPcHRpb24uc2xpZGVyLm9y
aWVudGF0aW9uOworICAgIHNsaWRlck9wdGlvbi0+dXBzaWRlRG93biA9IGZhY2FkZU9wdGlvbi5z
bGlkZXIudXBzaWRlRG93bjsKKyAgICBzbGlkZXJPcHRpb24tPm1pbmltdW0gPSBmYWNhZGVPcHRp
b24uc2xpZGVyLm1pbmltdW07CisgICAgc2xpZGVyT3B0aW9uLT5tYXhpbXVtID0gZmFjYWRlT3B0
aW9uLnNsaWRlci5tYXhpbXVtOworICAgIHNsaWRlck9wdGlvbi0+c2xpZGVyUG9zaXRpb24gPSBm
YWNhZGVPcHRpb24uc2xpZGVyLnBvc2l0aW9uOworICAgIHNsaWRlck9wdGlvbi0+c2xpZGVyVmFs
dWUgPSBmYWNhZGVPcHRpb24uc2xpZGVyLnZhbHVlOworICAgIHNsaWRlck9wdGlvbi0+c2luZ2xl
U3RlcCA9IGZhY2FkZU9wdGlvbi5zbGlkZXIuc2luZ2xlU3RlcDsKKyAgICBzbGlkZXJPcHRpb24t
PnBhZ2VTdGVwID0gZmFjYWRlT3B0aW9uLnNsaWRlci5wYWdlU3RlcDsKKyAgICBzbGlkZXJPcHRp
b24tPmFjdGl2ZVN1YkNvbnRyb2xzID0gY29udmVydFRvUVN0eWxlU3ViQ29udHJvbChmYWNhZGVP
cHRpb24uc2xpZGVyLmFjdGl2ZVN1YkNvbnRyb2xzKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1l
IFN0eWxlT3B0aW9uPgorY2xhc3MgTWFwcGVkU3R5bGVPcHRpb24gOiBwdWJsaWMgU3R5bGVPcHRp
b24geworCitwdWJsaWM6CisgICAgTWFwcGVkU3R5bGVPcHRpb24oUVdpZGdldCogd2lkZ2V0LCBj
b25zdCBRU3R5bGVGYWNhZGVPcHRpb24mIGZhY2FkZU9wdGlvbikKKyAgICB7CisgICAgICAgIGlu
aXRHZW5lcmljU3R5bGVPcHRpb24odGhpcywgd2lkZ2V0LCBmYWNhZGVPcHRpb24pOworICAgICAg
ICBpbml0U3BlY2lmaWNTdHlsZU9wdGlvbih0aGlzLCBmYWNhZGVPcHRpb24pOworICAgIH0KK307
CisKK3N0YXRpYyBRU3R5bGU6OlBpeGVsTWV0cmljIGNvbnZlcnRQaXhlbE1ldHJpYyhRU3R5bGVG
YWNhZGU6OlBpeGVsTWV0cmljIHN0YXRlKQoreworI2RlZmluZSBDT05WRVJUX01FVFJJQyhNZXRy
aWMpIFwKKyAgICBjYXNlIFFTdHlsZUZhY2FkZTo6TWV0cmljOiByZXR1cm4gUVN0eWxlOjpNZXRy
aWMKKworICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgRk9SX0VBQ0hfTUFQUEVEX01FVFJJ
QyhDT05WRVJUX01FVFJJQywgU0VNSUNPTE9OKTsKKyAgICB9CisgICAgQVNTRVJUX05PVF9SRUFD
SEVEKCk7CisgICAgcmV0dXJuIFFTdHlsZTo6UE1fQ3VzdG9tQmFzZTsKKworI3VuZGVmIENPTlZF
UlRfTUVUUklDCit9CisKK3N0YXRpYyBRU3R5bGVGYWNhZGU6OlN1YkNvbnRyb2wgY29udmVydFRv
UVN0eWxlRmFjYWRlU3ViQ29udHJvbChRU3R5bGU6OlN1YkNvbnRyb2wgc2MpCit7CisjZGVmaW5l
IENPTlZFUlRfU1VCQ09OVFJPTChGLCBWYWx1ZSkgXAorICAgIGNhc2UgUVN0eWxlOjpGOiByZXR1
cm4gUVN0eWxlRmFjYWRlOjpGCisKKyAgICBzd2l0Y2ggKHNjKSB7CisgICAgICAgIEZPUl9FQUNI
X1NVQkNPTlRST0woQ09OVkVSVF9TVUJDT05UUk9MLCBTRU1JQ09MT04pOworICAgIH0KKyAgICBB
U1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gUVN0eWxlRmFjYWRlOjpTQ19Ob25lOwor
I3VuZGVmIENPTlZFUlRfU1VCQ09OVFJPTAorfQorCitRU3R5bGVGYWNhZGVJbXA6OlFTdHlsZUZh
Y2FkZUltcChRV2ViUGFnZUFkYXB0ZXIqIHBhZ2UpCisgICAgOiBtX3BhZ2UocGFnZSkKKyAgICAs
IG1fc3R5bGUoMCkKK3sKKyAgICBtX2ZhbGxiYWNrU3R5bGUgPSBRU3R5bGVGYWN0b3J5OjpjcmVh
dGUoUUxhdGluMVN0cmluZygid2luZG93cyIpKTsKKyAgICBtX293bkZhbGxiYWNrU3R5bGUgPSB0
cnVlOworICAgIGlmICghbV9mYWxsYmFja1N0eWxlKSB7CisgICAgICAgIG1fZmFsbGJhY2tTdHls
ZSA9IFFBcHBsaWNhdGlvbjo6c3R5bGUoKTsKKyAgICAgICAgbV9vd25GYWxsYmFja1N0eWxlID0g
ZmFsc2U7CisgICAgfQorfQorCitRU3R5bGVGYWNhZGVJbXA6On5RU3R5bGVGYWNhZGVJbXAoKQor
eworICAgIGlmIChtX293bkZhbGxiYWNrU3R5bGUpCisgICAgICAgIGRlbGV0ZSBtX2ZhbGxiYWNr
U3R5bGU7Cit9CisKK1FSZWN0IFFTdHlsZUZhY2FkZUltcDo6YnV0dG9uU3ViRWxlbWVudFJlY3Qo
UVN0eWxlRmFjYWRlOjpCdXR0b25TdWJFbGVtZW50IGJ1dHRvbkVsZW1lbnQsIFN0YXRlIHN0YXRl
LCBjb25zdCBRUmVjdCYgb3JpZ2luYWxSZWN0KSBjb25zdAoreworICAgIFFTdHlsZU9wdGlvbkJ1
dHRvbiBvcHRpb247CisgICAgb3B0aW9uLnN0YXRlID0gY29udmVydFRvUVN0eWxlU3RhdGUoc3Rh
dGUpOworICAgIG9wdGlvbi5yZWN0ID0gb3JpZ2luYWxSZWN0OworCisgICAgUVN0eWxlOjpTdWJF
bGVtZW50IHN1YkVsZW1lbnQgPSBRU3R5bGU6OlNFX0N1c3RvbUJhc2U7CisgICAgc3dpdGNoIChi
dXR0b25FbGVtZW50KSB7CisgICAgY2FzZSBQdXNoQnV0dG9uTGF5b3V0SXRlbTogc3ViRWxlbWVu
dCA9IFFTdHlsZTo6U0VfUHVzaEJ1dHRvbkxheW91dEl0ZW07IGJyZWFrOworICAgIGNhc2UgUHVz
aEJ1dHRvbkNvbnRlbnRzOiBzdWJFbGVtZW50ID0gUVN0eWxlOjpTRV9QdXNoQnV0dG9uQ29udGVu
dHM7IGJyZWFrOworICAgIGRlZmF1bHQ6IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIH0KKyAg
ICByZXR1cm4gc3R5bGUoKS0+c3ViRWxlbWVudFJlY3Qoc3ViRWxlbWVudCwgJm9wdGlvbik7Cit9
CisKK2ludCBRU3R5bGVGYWNhZGVJbXA6OmZpbmRGcmFtZUxpbmVXaWR0aCgpIGNvbnN0Cit7Cisg
ICAgaWYgKCFtX2xpbmVFZGl0KQorICAgICAgICBtX2xpbmVFZGl0LnJlc2V0KG5ldyBRTGluZUVk
aXQoKSk7CisKKyAgICByZXR1cm4gc3R5bGUoKS0+cGl4ZWxNZXRyaWMoUVN0eWxlOjpQTV9EZWZh
dWx0RnJhbWVXaWR0aCwgMCwgbV9saW5lRWRpdC5kYXRhKCkpOworfQorCitpbnQgUVN0eWxlRmFj
YWRlSW1wOjpzaW1wbGVQaXhlbE1ldHJpYyhRU3R5bGVGYWNhZGU6OlBpeGVsTWV0cmljIG1ldHJp
YywgU3RhdGUgc3RhdGUpIGNvbnN0Cit7CisgICAgUVN0eWxlT3B0aW9uIG9wdDsKKyAgICBvcHQu
c3RhdGUgPSBjb252ZXJ0VG9RU3R5bGVTdGF0ZShzdGF0ZSk7CisgICAgcmV0dXJuIHN0eWxlKCkt
PnBpeGVsTWV0cmljKGNvbnZlcnRQaXhlbE1ldHJpYyhtZXRyaWMpLCAmb3B0LCAwKTsKK30KKwor
aW50IFFTdHlsZUZhY2FkZUltcDo6YnV0dG9uTWFyZ2luKFN0YXRlIHN0YXRlLCBjb25zdCBRUmVj
dCYgb3JpZ2luYWxSZWN0KSBjb25zdAoreworICAgIFFTdHlsZU9wdGlvbkJ1dHRvbiBzdHlsZU9w
dGlvbjsKKyAgICBzdHlsZU9wdGlvbi5zdGF0ZSA9IGNvbnZlcnRUb1FTdHlsZVN0YXRlKHN0YXRl
KTsKKyAgICBzdHlsZU9wdGlvbi5yZWN0ID0gb3JpZ2luYWxSZWN0OworICAgIHJldHVybiBzdHls
ZSgpLT5waXhlbE1ldHJpYyhRU3R5bGU6OlBNX0J1dHRvbk1hcmdpbiwgJnN0eWxlT3B0aW9uLCAw
KTsKK30KKworaW50IFFTdHlsZUZhY2FkZUltcDo6c2xpZGVyTGVuZ3RoKFF0OjpPcmllbnRhdGlv
biBvcmllbnRhdGlvbikgY29uc3QKK3sKKyAgICBRU3R5bGVPcHRpb25TbGlkZXIgb3B0OworICAg
IG9wdC5vcmllbnRhdGlvbiA9IG9yaWVudGF0aW9uOworICAgIHJldHVybiBzdHlsZSgpLT5waXhl
bE1ldHJpYyhRU3R5bGU6OlBNX1NsaWRlckxlbmd0aCwgJm9wdCk7Cit9CisKK2ludCBRU3R5bGVG
YWNhZGVJbXA6OnNsaWRlclRoaWNrbmVzcyhRdDo6T3JpZW50YXRpb24gb3JpZW50YXRpb24pIGNv
bnN0Cit7CisgICAgUVN0eWxlT3B0aW9uU2xpZGVyIG9wdDsKKyAgICBvcHQub3JpZW50YXRpb24g
PSBvcmllbnRhdGlvbjsKKyAgICByZXR1cm4gc3R5bGUoKS0+cGl4ZWxNZXRyaWMoUVN0eWxlOjpQ
TV9TbGlkZXJUaGlja25lc3MsICZvcHQpOworfQorCitpbnQgUVN0eWxlRmFjYWRlSW1wOjpwcm9n
cmVzc0JhckNodW5rV2lkdGgoY29uc3QgUVNpemUmIHNpemUpIGNvbnN0Cit7CisgICAgUVN0eWxl
T3B0aW9uUHJvZ3Jlc3NCYXJWMiBvcHRpb247CisgICAgb3B0aW9uLnJlY3Quc2V0U2l6ZShzaXpl
KTsKKyAgICAvLyBGSVhNRTogVW50aWwgaHR0cDovL2J1Z3JlcG9ydHMucXQubm9raWEuY29tL2Jy
b3dzZS9RVEJVRy05MTcxIGlzIGZpeGVkLAorICAgIC8vIHdlIHNpbXVsYXRlIG9uZSBzcXVhcmUg
YW5pbWF0aW5nIGFjcm9zcyB0aGUgcHJvZ3Jlc3MgYmFyLgorICAgIHJldHVybiBzdHlsZSgpLT5w
aXhlbE1ldHJpYyhRU3R5bGU6OlBNX1Byb2dyZXNzQmFyQ2h1bmtXaWR0aCwgJm9wdGlvbik7Cit9
CisKK3ZvaWQgUVN0eWxlRmFjYWRlSW1wOjpnZXRCdXR0b25NZXRyaWNzKFFTdHJpbmcgKmJ1dHRv
bkZvbnRGYW1pbHksIGludCAqYnV0dG9uRm9udFBpeGVsU2l6ZSkgY29uc3QKK3sKKyAgICBRUHVz
aEJ1dHRvbiBidXR0b247CisgICAgUUZvbnQgZGVmYXVsdEJ1dHRvbkZvbnQgPSBRQXBwbGljYXRp
b246OmZvbnQoJmJ1dHRvbik7CisgICAgKmJ1dHRvbkZvbnRGYW1pbHkgPSBkZWZhdWx0QnV0dG9u
Rm9udC5mYW1pbHkoKTsKKyAgICAqYnV0dG9uRm9udFBpeGVsU2l6ZSA9IDA7CisjaWZkZWYgUV9P
U19NQUMKKyAgICBidXR0b24uc2V0QXR0cmlidXRlKFF0OjpXQV9NYWNTbWFsbFNpemUpOworICAg
IFFGb250SW5mbyBmb250SW5mbyhkZWZhdWx0QnV0dG9uRm9udCk7CisgICAgKmJ1dHRvbkZvbnRQ
aXhlbFNpemUgPSBmb250SW5mby5waXhlbFNpemUoKTsKKyNlbmRpZgorfQorCitRU2l6ZSBRU3R5
bGVGYWNhZGVJbXA6OmNvbWJvQm94U2l6ZUZyb21Db250ZW50cyhTdGF0ZSBzdGF0ZSwgY29uc3Qg
UVNpemUmIGNvbnRlbnRzU2l6ZSkgY29uc3QKK3sKKyAgICBRU3R5bGVPcHRpb25Db21ib0JveCBv
cHQ7CisgICAgb3B0LnN0YXRlID0gY29udmVydFRvUVN0eWxlU3RhdGUoc3RhdGUpOworICAgIHJl
dHVybiBzdHlsZSgpLT5zaXplRnJvbUNvbnRlbnRzKFFTdHlsZTo6Q1RfQ29tYm9Cb3gsICZvcHQs
IGNvbnRlbnRzU2l6ZSk7Cit9CisKK1FTaXplIFFTdHlsZUZhY2FkZUltcDo6cHVzaEJ1dHRvblNp
emVGcm9tQ29udGVudHMoU3RhdGUgc3RhdGUsIGNvbnN0IFFTaXplJiBjb250ZW50c1NpemUpIGNv
bnN0Cit7CisgICAgUVN0eWxlT3B0aW9uQnV0dG9uIG9wdDsKKyAgICBvcHQuc3RhdGUgPSBjb252
ZXJ0VG9RU3R5bGVTdGF0ZShzdGF0ZSk7CisgICAgcmV0dXJuIHN0eWxlKCktPnNpemVGcm9tQ29u
dGVudHMoUVN0eWxlOjpDVF9QdXNoQnV0dG9uLCAmb3B0LCBjb250ZW50c1NpemUpOworfQorCit2
b2lkIFFTdHlsZUZhY2FkZUltcDo6cGFpbnRCdXR0b24oUVBhaW50ZXIqIHBhaW50ZXIsIFFTdHls
ZUZhY2FkZTo6QnV0dG9uVHlwZSB0eXBlLCBjb25zdCBRU3R5bGVGYWNhZGVPcHRpb24gJnByb3h5
T3B0aW9uKQoreworICAgIFFXaWRnZXQqIHdpZGdldCA9IHFvYmplY3RfY2FzdDxRV2lkZ2V0Kj4o
d2lkZ2V0Rm9yUGFpbnRlcihwYWludGVyKSk7CisgICAgTWFwcGVkU3R5bGVPcHRpb248UVN0eWxl
T3B0aW9uQnV0dG9uPiBvcHRpb24od2lkZ2V0LCBwcm94eU9wdGlvbik7CisKKyAgICBpZiAodHlw
ZSA9PSBQdXNoQnV0dG9uKQorICAgICAgICBzdHlsZSgpLT5kcmF3Q29udHJvbChRU3R5bGU6OkNF
X1B1c2hCdXR0b24sICZvcHRpb24sIHBhaW50ZXIsIHdpZGdldCk7CisgICAgZWxzZSBpZiAodHlw
ZSA9PSBSYWRpb0J1dHRvbikKKyAgICAgICAgc3R5bGUoKS0+ZHJhd0NvbnRyb2woUVN0eWxlOjpD
RV9SYWRpb0J1dHRvbiwgJm9wdGlvbiwgcGFpbnRlciwgd2lkZ2V0KTsKKyAgICBlbHNlIGlmICh0
eXBlID09IENoZWNrQm94KQorICAgICAgICBzdHlsZSgpLT5kcmF3Q29udHJvbChRU3R5bGU6OkNF
X0NoZWNrQm94LCAmb3B0aW9uLCBwYWludGVyLCB3aWRnZXQpOworfQorCit2b2lkIFFTdHlsZUZh
Y2FkZUltcDo6cGFpbnRUZXh0RmllbGQoUVBhaW50ZXIgKnBhaW50ZXIsIGNvbnN0IFFTdHlsZUZh
Y2FkZU9wdGlvbiAmcHJveHlPcHRpb24pCit7CisgICAgUVdpZGdldCogd2lkZ2V0ID0gcW9iamVj
dF9jYXN0PFFXaWRnZXQqPih3aWRnZXRGb3JQYWludGVyKHBhaW50ZXIpKTsKKworICAgIE1hcHBl
ZFN0eWxlT3B0aW9uPFFTdHlsZU9wdGlvbkZyYW1lVjI+IHBhbmVsKHdpZGdldCwgcHJveHlPcHRp
b24pOworCisgICAgcGFuZWwubGluZVdpZHRoID0gZmluZEZyYW1lTGluZVdpZHRoKCk7CisgICAg
cGFuZWwuZmVhdHVyZXMgPSBRU3R5bGVPcHRpb25GcmFtZVYyOjpOb25lOworCisgICAgc3R5bGUo
KS0+ZHJhd1ByaW1pdGl2ZShRU3R5bGU6OlBFX1BhbmVsTGluZUVkaXQsICZwYW5lbCwgcGFpbnRl
ciwgd2lkZ2V0KTsKK30KKwordm9pZCBRU3R5bGVGYWNhZGVJbXA6OnBhaW50Q29tYm9Cb3goUVBh
aW50ZXIgKnBhaW50ZXIsIGNvbnN0IFFTdHlsZUZhY2FkZU9wdGlvbiAmcHJveHlPcHRpb24pCit7
CisgICAgUVdpZGdldCogd2lkZ2V0ID0gcW9iamVjdF9jYXN0PFFXaWRnZXQqPih3aWRnZXRGb3JQ
YWludGVyKHBhaW50ZXIpKTsKKworICAgIE1hcHBlZFN0eWxlT3B0aW9uPFFTdHlsZU9wdGlvbkNv
bWJvQm94PiBvcHQod2lkZ2V0LCBwcm94eU9wdGlvbik7CisKKyAgICBRUmVjdCByZWN0ID0gb3B0
LnJlY3Q7CisKKyNpZiBkZWZpbmVkKFFfT1NfTUFDKSAmJiAhZGVmaW5lZChRVF9OT19TVFlMRV9N
QUMpCisgICAgLy8gUU1hY1N0eWxlIG1ha2VzIHRoZSBjb21ibyBib3hlcyBhIGxpdHRsZSBiaXQg
c21hbGxlciB0byBsZWF2ZSBzcGFjZSBmb3IgdGhlIGZvY3VzIHJlY3QuCisgICAgLy8gQmVjYXVz
ZSBvZiBpdCwgdGhlIGNvbWJvIGJ1dHRvbiBpcyBkcmF3biBhdCBhIHBvaW50IHRvIHRoZSBsZWZ0
IG9mIHdoZXJlIGl0IHdhcyBleHBlY3QgdG8gYmUgYW5kIG1heSBlbmQgdXAKKyAgICAvLyBvdmVy
bGFwcGVkIHdpdGggdGhlIHRleHQuIFRoaXMgd2lsbCBmb3JjZSBRTWFjU3R5bGUgdG8gZHJhdyB0
aGUgY29tYm8gYm94IHdpdGggdGhlIGV4cGVjdGVkIHdpZHRoLgorICAgIGlmIChtX3N0eWxlLT5p
bmhlcml0cygiUU1hY1N0eWxlIikpIHsKKyAgICAgICAgcmVjdC5zZXRYKHJlY3QueCgpIC0gMyk7
CisgICAgICAgIHJlY3Quc2V0V2lkdGgocmVjdC53aWR0aCgpICsgMiAqIDMpOworICAgIH0KKyNl
bmRpZgorCisgICAgcGFpbnRlci0+dHJhbnNsYXRlKHJlY3QudG9wTGVmdCgpKTsKKyAgICBvcHQu
cmVjdC5tb3ZlVG8oUVBvaW50KDAsIDApKTsKKyAgICBvcHQucmVjdC5zZXRTaXplKHJlY3Quc2l6
ZSgpKTsKKworICAgIHN0eWxlKCktPmRyYXdDb21wbGV4Q29udHJvbChRU3R5bGU6OkNDX0NvbWJv
Qm94LCAmb3B0LCBwYWludGVyLCB3aWRnZXQpOworICAgIHBhaW50ZXItPnRyYW5zbGF0ZSgtcmVj
dC50b3BMZWZ0KCkpOworfQorCit2b2lkIFFTdHlsZUZhY2FkZUltcDo6cGFpbnRDb21ib0JveEFy
cm93KFFQYWludGVyICpwYWludGVyLCBjb25zdCBRU3R5bGVGYWNhZGVPcHRpb24gJnByb3h5T3B0
aW9uKQoreworICAgIFFXaWRnZXQqIHdpZGdldCA9IHFvYmplY3RfY2FzdDxRV2lkZ2V0Kj4od2lk
Z2V0Rm9yUGFpbnRlcihwYWludGVyKSk7CisKKyAgICBNYXBwZWRTdHlsZU9wdGlvbjxRU3R5bGVP
cHRpb25Db21ib0JveD4gb3B0KHdpZGdldCwgcHJveHlPcHRpb24pOworICAgIG9wdC5zdWJDb250
cm9scyA9IFFTdHlsZTo6U0NfQ29tYm9Cb3hBcnJvdzsKKyAgICAvLyBmb3IgZHJhd2luZyB0aGUg
Y29tYm8gYm94IGFycm93LCByZWx5IG9ubHkgb24gdGhlIGZhbGxiYWNrIHN0eWxlCisgICAgbV9m
YWxsYmFja1N0eWxlLT5kcmF3Q29tcGxleENvbnRyb2woUVN0eWxlOjpDQ19Db21ib0JveCwgJm9w
dCwgcGFpbnRlciwgd2lkZ2V0KTsKK30KKwordm9pZCBRU3R5bGVGYWNhZGVJbXA6OnBhaW50U2xp
ZGVyVHJhY2soUVBhaW50ZXIqIHBhaW50ZXIsIGNvbnN0IFFTdHlsZUZhY2FkZU9wdGlvbiYgcHJv
eHlPcHRpb24pCit7CisgICAgUVdpZGdldCogd2lkZ2V0ID0gcW9iamVjdF9jYXN0PFFXaWRnZXQq
Pih3aWRnZXRGb3JQYWludGVyKHBhaW50ZXIpKTsKKworICAgIE1hcHBlZFN0eWxlT3B0aW9uPFFT
dHlsZU9wdGlvblNsaWRlcj4gb3B0aW9uKHdpZGdldCwgcHJveHlPcHRpb24pOworICAgIG9wdGlv
bi5zdWJDb250cm9scyA9IFFTdHlsZTo6U0NfU2xpZGVyR3Jvb3ZlOworCisgICAgb3B0aW9uLnVw
c2lkZURvd24gPSBwcm94eU9wdGlvbi5zbGlkZXIudXBzaWRlRG93bjsKKyAgICBvcHRpb24ubWlu
aW11bSA9IHByb3h5T3B0aW9uLnNsaWRlci5taW5pbXVtOworICAgIG9wdGlvbi5tYXhpbXVtID0g
cHJveHlPcHRpb24uc2xpZGVyLm1heGltdW07CisgICAgb3B0aW9uLnNsaWRlclBvc2l0aW9uID0g
cHJveHlPcHRpb24uc2xpZGVyLnBvc2l0aW9uOworICAgIG9wdGlvbi5vcmllbnRhdGlvbiA9IHBy
b3h5T3B0aW9uLnNsaWRlci5vcmllbnRhdGlvbjsKKworICAgIHN0eWxlKCktPmRyYXdDb21wbGV4
Q29udHJvbChRU3R5bGU6OkNDX1NsaWRlciwgJm9wdGlvbiwgcGFpbnRlciwgd2lkZ2V0KTsKKwor
ICAgIGlmIChvcHRpb24uc3RhdGUgJiBRU3R5bGU6OlN0YXRlX0hhc0ZvY3VzKSB7CisgICAgICAg
IFFTdHlsZU9wdGlvbkZvY3VzUmVjdCBmb2N1c09wdGlvbjsKKyAgICAgICAgZm9jdXNPcHRpb24u
cmVjdCA9IG9wdGlvbi5yZWN0OworICAgICAgICBzdHlsZSgpLT5kcmF3UHJpbWl0aXZlKFFTdHls
ZTo6UEVfRnJhbWVGb2N1c1JlY3QsICZmb2N1c09wdGlvbiwgcGFpbnRlciwgd2lkZ2V0KTsKKyAg
ICB9Cit9CisKK3ZvaWQgUVN0eWxlRmFjYWRlSW1wOjpwYWludFNsaWRlclRodW1iKFFQYWludGVy
KiBwYWludGVyLCBjb25zdCBRU3R5bGVGYWNhZGVPcHRpb24mIHByb3h5T3B0aW9uKQoreworICAg
IFFXaWRnZXQqIHdpZGdldCA9IHFvYmplY3RfY2FzdDxRV2lkZ2V0Kj4od2lkZ2V0Rm9yUGFpbnRl
cihwYWludGVyKSk7CisKKyAgICBNYXBwZWRTdHlsZU9wdGlvbjxRU3R5bGVPcHRpb25TbGlkZXI+
IG9wdGlvbih3aWRnZXQsIHByb3h5T3B0aW9uKTsKKworICAgIG9wdGlvbi5zdWJDb250cm9scyA9
IFFTdHlsZTo6U0NfU2xpZGVySGFuZGxlOworICAgIGlmIChvcHRpb24uc3RhdGUgJiBRU3R5bGU6
OlN0YXRlX1N1bmtlbikKKyAgICAgICAgb3B0aW9uLmFjdGl2ZVN1YkNvbnRyb2xzID0gUVN0eWxl
OjpTQ19TbGlkZXJIYW5kbGU7CisKKyAgICBzdHlsZSgpLT5kcmF3Q29tcGxleENvbnRyb2woUVN0
eWxlOjpDQ19TbGlkZXIsICZvcHRpb24sIHBhaW50ZXIsIHdpZGdldCk7Cit9CisKK3ZvaWQgUVN0
eWxlRmFjYWRlSW1wOjpwYWludElubmVyU3BpbkJ1dHRvbihRUGFpbnRlciogcGFpbnRlciwgY29u
c3QgUVN0eWxlRmFjYWRlT3B0aW9uJiBwcm94eU9wdGlvbiwgYm9vbCBzcGluQm94VXApCit7Cisg
ICAgUVdpZGdldCogd2lkZ2V0ID0gcW9iamVjdF9jYXN0PFFXaWRnZXQqPih3aWRnZXRGb3JQYWlu
dGVyKHBhaW50ZXIpKTsKKworICAgIE1hcHBlZFN0eWxlT3B0aW9uPFFTdHlsZU9wdGlvblNwaW5C
b3g+IG9wdGlvbih3aWRnZXQsIHByb3h5T3B0aW9uKTsKKworICAgIG9wdGlvbi5zdWJDb250cm9s
cyA9IFFTdHlsZTo6U0NfU3BpbkJveFVwIHwgUVN0eWxlOjpTQ19TcGluQm94RG93bjsKKyAgICBp
ZiAoIShvcHRpb24uc3RhdGUgJiBRU3R5bGU6OlN0YXRlX1JlYWRPbmx5KSkgeworICAgICAgICBp
ZiAob3B0aW9uLnN0YXRlICYgUVN0eWxlOjpTdGF0ZV9FbmFibGVkKQorICAgICAgICAgICAgb3B0
aW9uLnN0ZXBFbmFibGVkID0gUUFic3RyYWN0U3BpbkJveDo6U3RlcFVwRW5hYmxlZCB8IFFBYnN0
cmFjdFNwaW5Cb3g6OlN0ZXBEb3duRW5hYmxlZDsKKyAgICAgICAgaWYgKG9wdGlvbi5zdGF0ZSAm
IFFTdHlsZTo6U3RhdGVfU3Vua2VuKSB7CisgICAgICAgICAgICBpZiAoc3BpbkJveFVwKQorICAg
ICAgICAgICAgICAgIG9wdGlvbi5hY3RpdmVTdWJDb250cm9scyA9IFFTdHlsZTo6U0NfU3BpbkJv
eFVwOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG9wdGlvbi5hY3RpdmVTdWJD
b250cm9scyA9IFFTdHlsZTo6U0NfU3BpbkJveERvd247CisgICAgICAgIH0KKyAgICB9CisKKyAg
ICBRUmVjdCBidXR0b25SZWN0ID0gb3B0aW9uLnJlY3Q7CisgICAgLy8gRGVmYXVsdCB0byBtb3Zp
bmcgdGhlIGJ1dHRvbnMgYSBsaXR0bGUgYml0IHdpdGhpbiB0aGUgZWRpdG9yIGZyYW1lLgorICAg
IGludCBpbmZsYXRlWCA9IC0yOworICAgIGludCBpbmZsYXRlWSA9IC0yOworI2lmIGRlZmluZWQo
UV9PU19NQUMpICYmICFkZWZpbmVkKFFUX05PX1NUWUxFX01BQykKKyAgICAvLyBRTWFjU3R5bGUg
d2lsbCBwb3NpdGlvbiB0aGUgYXF1YSBidXR0b25zIGZsdXNoIHRvIHRoZSByaWdodC4KKyAgICAv
LyBUaGlzIHdpbGwgbW92ZSB0aGVtIG1vcmUgd2l0aGluIHRoZSBjb250cm9sIGZvciBiZXR0ZXIg
c3R5bGUsIGEgbGEKKyAgICAvLyBDaHJvbWl1bSBsb29rICYgZmVlbC4KKyAgICBpZiAobV9zdHls
ZS0+aW5oZXJpdHMoIlFNYWNTdHlsZSIpKSB7CisgICAgICAgIGluZmxhdGVYID0gLTQ7CisgICAg
ICAgIC8vIFJlbmRlciBtaW5pIGFxdWEgc3BpbiBidXR0b25zIGZvciBRTWFjU3R5bGUgdG8gZml0
IG5pY2VseSBpbnRvCisgICAgICAgIC8vIHRoZSBlZGl0b3IgYXJlYSwgbGlrZSBDaHJvbWl1bS4K
KyAgICAgICAgb3B0aW9uLnN0YXRlIHw9IFFTdHlsZTo6U3RhdGVfTWluaTsKKyAgICB9CisjZW5k
aWYKKworICAgIGJ1dHRvblJlY3Quc2V0WChidXR0b25SZWN0LngoKSAtIGluZmxhdGVYKTsKKyAg
ICBidXR0b25SZWN0LnNldFdpZHRoKGJ1dHRvblJlY3Qud2lkdGgoKSArIDIgKiBpbmZsYXRlWCk7
CisgICAgYnV0dG9uUmVjdC5zZXRZKGJ1dHRvblJlY3QueSgpIC0gaW5mbGF0ZVkpOworICAgIGJ1
dHRvblJlY3Quc2V0SGVpZ2h0KGJ1dHRvblJlY3QuaGVpZ2h0KCkgKyAyICogaW5mbGF0ZVkpOwor
ICAgIG9wdGlvbi5yZWN0ID0gYnV0dG9uUmVjdDsKKworICAgIHN0eWxlKCktPmRyYXdDb21wbGV4
Q29udHJvbChRU3R5bGU6OkNDX1NwaW5Cb3gsICZvcHRpb24sIHBhaW50ZXIsIHdpZGdldCk7Cit9
CisKK3ZvaWQgUVN0eWxlRmFjYWRlSW1wOjpwYWludFByb2dyZXNzQmFyKFFQYWludGVyKiBwYWlu
dGVyLCBjb25zdCBRU3R5bGVGYWNhZGVPcHRpb24mIHByb3h5T3B0aW9uLCBkb3VibGUgcHJvZ3Jl
c3MsIGRvdWJsZSBhbmltYXRpb25Qcm9ncmVzcykKK3sKKyAgICBRV2lkZ2V0KiB3aWRnZXQgPSBx
b2JqZWN0X2Nhc3Q8UVdpZGdldCo+KHdpZGdldEZvclBhaW50ZXIocGFpbnRlcikpOworCisgICAg
TWFwcGVkU3R5bGVPcHRpb248UVN0eWxlT3B0aW9uUHJvZ3Jlc3NCYXJWMj4gb3B0aW9uKHdpZGdl
dCwgcHJveHlPcHRpb24pOworCisgICAgb3B0aW9uLm1heGltdW0gPSBzdGQ6Om51bWVyaWNfbGlt
aXRzPGludD46Om1heCgpOworICAgIG9wdGlvbi5taW5pbXVtID0gMDsKKyAgICBvcHRpb24ucHJv
Z3Jlc3MgPSBwcm9ncmVzcyAqIHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCk7CisKKyAg
ICBjb25zdCBRUG9pbnQgdG9wTGVmdCA9IG9wdGlvbi5yZWN0LnRvcExlZnQoKTsKKyAgICBwYWlu
dGVyLT50cmFuc2xhdGUodG9wTGVmdCk7CisgICAgb3B0aW9uLnJlY3QubW92ZVRvKFFQb2ludCgw
LCAwKSk7CisKKyAgICBpZiAocHJvZ3Jlc3MgPCAwKSB7CisgICAgICAgIC8vIEZJWE1FOiBVbnRp
bCBodHRwOi8vYnVncmVwb3J0cy5xdC5ub2tpYS5jb20vYnJvd3NlL1FUQlVHLTkxNzEgaXMgZml4
ZWQsCisgICAgICAgIC8vIHdlIHNpbXVsYXRlIG9uZSBzcXVhcmUgYW5pbWF0aW5nIGFjcm9zcyB0
aGUgcHJvZ3Jlc3MgYmFyLgorICAgICAgICBzdHlsZSgpLT5kcmF3Q29udHJvbChRU3R5bGU6OkNF
X1Byb2dyZXNzQmFyR3Jvb3ZlLCAmb3B0aW9uLCBwYWludGVyLCB3aWRnZXQpOworICAgICAgICBp
bnQgY2h1bmtXaWR0aCA9IHN0eWxlKCktPnBpeGVsTWV0cmljKFFTdHlsZTo6UE1fUHJvZ3Jlc3NC
YXJDaHVua1dpZHRoLCAmb3B0aW9uKTsKKyAgICAgICAgUUNvbG9yIGNvbG9yID0gKG9wdGlvbi5w
YWxldHRlLmhpZ2hsaWdodCgpID09IG9wdGlvbi5wYWxldHRlLmJhY2tncm91bmQoKSkgPyBvcHRp
b24ucGFsZXR0ZS5jb2xvcihRUGFsZXR0ZTo6QWN0aXZlLCBRUGFsZXR0ZTo6SGlnaGxpZ2h0KSA6
IG9wdGlvbi5wYWxldHRlLmNvbG9yKFFQYWxldHRlOjpIaWdobGlnaHQpOworICAgICAgICBpZiAo
b3B0aW9uLmRpcmVjdGlvbiA9PSBRdDo6UmlnaHRUb0xlZnQpCisgICAgICAgICAgICBwYWludGVy
LT5maWxsUmVjdChvcHRpb24ucmVjdC5yaWdodCgpIC0gY2h1bmtXaWR0aCAgLSBhbmltYXRpb25Q
cm9ncmVzcyAqIG9wdGlvbi5yZWN0LndpZHRoKCksIDAsIGNodW5rV2lkdGgsIG9wdGlvbi5yZWN0
LmhlaWdodCgpLCBjb2xvcik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBhaW50ZXItPmZp
bGxSZWN0KGFuaW1hdGlvblByb2dyZXNzICogb3B0aW9uLnJlY3Qud2lkdGgoKSwgMCwgY2h1bmtX
aWR0aCwgb3B0aW9uLnJlY3QuaGVpZ2h0KCksIGNvbG9yKTsKKyAgICB9IGVsc2UKKyAgICAgICAg
c3R5bGUoKS0+ZHJhd0NvbnRyb2woUVN0eWxlOjpDRV9Qcm9ncmVzc0JhciwgJm9wdGlvbiwgcGFp
bnRlciwgd2lkZ2V0KTsKKworICAgIHBhaW50ZXItPnRyYW5zbGF0ZSgtdG9wTGVmdCk7Cit9CisK
K2ludCBRU3R5bGVGYWNhZGVJbXA6OnNjcm9sbEJhckV4dGVudChib29sIG1pbmkpCit7CisgICAg
UVN0eWxlT3B0aW9uU2xpZGVyIG87CisgICAgby5vcmllbnRhdGlvbiA9IFF0OjpWZXJ0aWNhbDsK
KyAgICBvLnN0YXRlICY9IH5RU3R5bGU6OlN0YXRlX0hvcml6b250YWw7CisgICAgaWYgKG1pbmkp
CisgICAgICAgIG8uc3RhdGUgfD0gUVN0eWxlOjpTdGF0ZV9NaW5pOworICAgIHJldHVybiBzdHls
ZSgpLT5waXhlbE1ldHJpYyhRU3R5bGU6OlBNX1Njcm9sbEJhckV4dGVudCwgJm8sIDApOworfQor
Citib29sIFFTdHlsZUZhY2FkZUltcDo6c2Nyb2xsQmFyTWlkZGxlQ2xpY2tBYnNvbHV0ZVBvc2l0
aW9uU3R5bGVIaW50KCkgY29uc3QKK3sKKyAgICByZXR1cm4gc3R5bGUoKS0+c3R5bGVIaW50KFFT
dHlsZTo6U0hfU2Nyb2xsQmFyX01pZGRsZUNsaWNrQWJzb2x1dGVQb3NpdGlvbik7Cit9CisKK3Zv
aWQgUVN0eWxlRmFjYWRlSW1wOjpwYWludFNjcm9sbENvcm5lcihRUGFpbnRlciogcGFpbnRlciwg
Y29uc3QgUVJlY3QmIHJlY3QpCit7CisgICAgUVdpZGdldCogd2lkZ2V0ID0gcW9iamVjdF9jYXN0
PFFXaWRnZXQqPih3aWRnZXRGb3JQYWludGVyKHBhaW50ZXIpKTsKKworICAgIFFTdHlsZU9wdGlv
biBvcHRpb247CisgICAgb3B0aW9uLnJlY3QgPSByZWN0OworICAgIHN0eWxlKCktPmRyYXdQcmlt
aXRpdmUoUVN0eWxlOjpQRV9QYW5lbFNjcm9sbEFyZWFDb3JuZXIsICZvcHRpb24sIHBhaW50ZXIs
IHdpZGdldCk7Cit9CisKK1FTdHlsZUZhY2FkZTo6U3ViQ29udHJvbCBRU3R5bGVGYWNhZGVJbXA6
OmhpdFRlc3RTY3JvbGxCYXIoY29uc3QgUVN0eWxlRmFjYWRlT3B0aW9uICZwcm94eU9wdGlvbiwg
Y29uc3QgUVBvaW50ICZwb3MpCit7CisgICAgTWFwcGVkU3R5bGVPcHRpb248UVN0eWxlT3B0aW9u
U2xpZGVyPiBvcHQoMCwgcHJveHlPcHRpb24pOworICAgIFFTdHlsZTo6U3ViQ29udHJvbCBzYyA9
IHN0eWxlKCktPmhpdFRlc3RDb21wbGV4Q29udHJvbChRU3R5bGU6OkNDX1Njcm9sbEJhciwgJm9w
dCwgcG9zLCAwKTsKKyAgICByZXR1cm4gY29udmVydFRvUVN0eWxlRmFjYWRlU3ViQ29udHJvbChz
Yyk7Cit9CisKK1FSZWN0IFFTdHlsZUZhY2FkZUltcDo6c2Nyb2xsQmFyU3ViQ29udHJvbFJlY3Qo
Y29uc3QgUVN0eWxlRmFjYWRlT3B0aW9uICZwcm94eU9wdGlvbiwgUVN0eWxlRmFjYWRlOjpTdWJD
b250cm9sIHN1YkNvbnRyb2wpCit7CisgICAgTWFwcGVkU3R5bGVPcHRpb248UVN0eWxlT3B0aW9u
U2xpZGVyPiBvcHQoMCwgcHJveHlPcHRpb24pOworICAgIHJldHVybiBzdHlsZSgpLT5zdWJDb250
cm9sUmVjdChRU3R5bGU6OkNDX1Njcm9sbEJhciwgJm9wdCwgY29udmVydFRvUVN0eWxlU3ViQ29u
dHJvbChzdWJDb250cm9sKSwgMCk7Cit9CisKK3ZvaWQgUVN0eWxlRmFjYWRlSW1wOjpwYWludFNj
cm9sbEJhcihRUGFpbnRlciAqcGFpbnRlciwgY29uc3QgUVN0eWxlRmFjYWRlT3B0aW9uICZwcm94
eU9wdGlvbikKK3sKKyAgICBRV2lkZ2V0KiB3aWRnZXQgPSBxb2JqZWN0X2Nhc3Q8UVdpZGdldCo+
KHdpZGdldEZvclBhaW50ZXIocGFpbnRlcikpOworCisgICAgTWFwcGVkU3R5bGVPcHRpb248UVN0
eWxlT3B0aW9uU2xpZGVyPiBvcHQod2lkZ2V0LCBwcm94eU9wdGlvbik7CisKKyNpZmRlZiBRX09T
X01BQworICAgIC8vIEZJWE1FOiBXZSBhbHNvIG5lZWQgdG8gY2hlY2sgdGhlIHdpZGdldCBzdHls
ZSBidXQgdG9kYXkgU2Nyb2xsYmFyVGhlbWUgaXMgbm90IGF3YXJlIG9mIHRoZSBwYWdlIHNvIHdl
CisgICAgLy8gY2FuJ3QgZ2V0IHRoZSB3aWRnZXQuCisgICAgaWYgKG1fc3R5bGUtPmluaGVyaXRz
KCJRTWFjU3R5bGUiKSkKKyAgICAgICAgbV9zdHlsZS0+ZHJhd0NvbXBsZXhDb250cm9sKFFTdHls
ZTo6Q0NfU2Nyb2xsQmFyLCAmb3B0LCBwYWludGVyLCB3aWRnZXQpOworICAgIGVsc2UKKyNlbmRp
ZgorICAgIHsKKyAgICAgICAgLy8gVGhlIFFTdHlsZSBleHBlY3RzIHRoZSBiYWNrZ3JvdW5kIHRv
IGJlIGFscmVhZHkgZmlsbGVkLgorICAgICAgICBwYWludGVyLT5maWxsUmVjdChvcHQucmVjdCwg
b3B0LnBhbGV0dGUuYmFja2dyb3VuZCgpKTsKKworICAgICAgICBjb25zdCBRUG9pbnQgdG9wTGVm
dCA9IG9wdC5yZWN0LnRvcExlZnQoKTsKKyAgICAgICAgcGFpbnRlci0+dHJhbnNsYXRlKHRvcExl
ZnQpOworICAgICAgICBvcHQucmVjdC5tb3ZlVG8oUVBvaW50KDAsIDApKTsKKyAgICAgICAgc3R5
bGUoKS0+ZHJhd0NvbXBsZXhDb250cm9sKFFTdHlsZTo6Q0NfU2Nyb2xsQmFyLCAmb3B0LCBwYWlu
dGVyLCB3aWRnZXQpOworICAgICAgICBvcHQucmVjdC5tb3ZlVG8odG9wTGVmdCk7CisgICAgfQor
fQorCitRT2JqZWN0KiBRU3R5bGVGYWNhZGVJbXA6OndpZGdldEZvclBhaW50ZXIoUVBhaW50ZXIq
IHBhaW50ZXIpCit7CisgICAgUVBhaW50RGV2aWNlKiBkZXYgPSAwOworICAgIGlmIChwYWludGVy
KQorICAgICAgICBkZXYgPSBwYWludGVyLT5kZXZpY2UoKTsKKyAgICBpZiAoZGV2ICYmIGRldi0+
ZGV2VHlwZSgpID09IFFJbnRlcm5hbDo6V2lkZ2V0KQorICAgICAgICByZXR1cm4gc3RhdGljX2Nh
c3Q8UVdpZGdldCo+KGRldik7CisgICAgcmV0dXJuIDA7Cit9CisKK1FTdHlsZSogUVN0eWxlRmFj
YWRlSW1wOjpzdHlsZSgpIGNvbnN0Cit7CisgICAgaWYgKG1fc3R5bGUpCisgICAgICAgIHJldHVy
biBtX3N0eWxlOworCisgICAgaWYgKG1fcGFnZSkgeworICAgICAgICBpZiAoUVdlYlBhZ2VDbGll
bnQqIHBhZ2VDbGllbnQgPSBtX3BhZ2UtPmNsaWVudC5kYXRhKCkpCisgICAgICAgICAgICBtX3N0
eWxlID0gcGFnZUNsaWVudC0+c3R5bGUoKTsKKyAgICB9CisKKyAgICBpZiAoIW1fc3R5bGUpCisg
ICAgICAgIG1fc3R5bGUgPSBRQXBwbGljYXRpb246OnN0eWxlKCk7CisKKyAgICByZXR1cm4gbV9z
dHlsZTsKK30KKworfQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9XaWRnZXRTdXBwb3J0
L1FTdHlsZUZhY2FkZUltcC5oIGIvU291cmNlL1dlYktpdC9xdC9XaWRnZXRTdXBwb3J0L1FTdHls
ZUZhY2FkZUltcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjNlNjc3YWVlZmZiYWM2NDY3MDk4Y2FlMjY0Yzc0NGIx
ZGYzY2M4NjUKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldFN1cHBv
cnQvUVN0eWxlRmFjYWRlSW1wLmgKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIFRoaXMgZmlsZSBp
cyBwYXJ0IG9mIHRoZSB0aGVtZSBpbXBsZW1lbnRhdGlvbiBmb3IgZm9ybSBjb250cm9scyBpbiBX
ZWJDb3JlLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBEaWdpYSBQbGMgYW5kL29yIGl0cyBz
dWJzaWRpYXJ5KC1pZXMpLgorICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgTm9raWEgQ29ycG9y
YXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpLgorICoKKyAqIFRoaXMgbGlicmFyeSBp
cyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlm
eSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisg
KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBl
aXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBh
bnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4g
dGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJS
QU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFC
SUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQor
ICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgor
ICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2Vu
ZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUg
ZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJl
IEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBC
b3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKyNpZm5kZWYgUVN0eWxlRmFjYWRl
SW1wX2gKKyNkZWZpbmUgUVN0eWxlRmFjYWRlSW1wX2gKKworI2luY2x1ZGUgPFFQb2ludGVyPgor
I2luY2x1ZGUgPFFTdHlsZUZhY2FkZS5oPgorCitRVF9CRUdJTl9OQU1FU1BBQ0UKK2NsYXNzIFFT
dHlsZTsKK2NsYXNzIFFMaW5lRWRpdDsKK2NsYXNzIFFTdHlsZU9wdGlvbjsKK2NsYXNzIFFTdHls
ZU9wdGlvblNsaWRlcjsKK2NsYXNzIFFQYWludGVyOworY2xhc3MgUU9iamVjdDsKK1FUX0VORF9O
QU1FU1BBQ0UKKworY2xhc3MgUVdlYlBhZ2VBZGFwdGVyOworCituYW1lc3BhY2UgV2ViS2l0IHsK
KworY2xhc3MgUVN0eWxlRmFjYWRlSW1wIDogcHVibGljIFdlYkNvcmU6OlFTdHlsZUZhY2FkZSB7
CitwdWJsaWM6CisgICAgUVN0eWxlRmFjYWRlSW1wKFFXZWJQYWdlQWRhcHRlciogPSAwKTsKKyAg
ICB2aXJ0dWFsIH5RU3R5bGVGYWNhZGVJbXAoKTsKKworICAgIHN0YXRpYyBXZWJDb3JlOjpRU3R5
bGVGYWNhZGUqIGNyZWF0ZShRV2ViUGFnZUFkYXB0ZXIqIHBhZ2UpCisgICAgeyByZXR1cm4gbmV3
IFFTdHlsZUZhY2FkZUltcChwYWdlKTsgfQorCisgICAgdmlydHVhbCBRUmVjdCBidXR0b25TdWJF
bGVtZW50UmVjdChCdXR0b25TdWJFbGVtZW50LCBTdGF0ZSwgY29uc3QgUVJlY3QmIG9yaWdpbmFs
UmVjdCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIGludCBmaW5kRnJhbWVMaW5lV2lkdGgoKSBjb25z
dDsKKyAgICB2aXJ0dWFsIGludCBzaW1wbGVQaXhlbE1ldHJpYyhQaXhlbE1ldHJpYywgU3RhdGUg
PSBTdGF0ZV9Ob25lKSBjb25zdDsKKyAgICB2aXJ0dWFsIGludCBidXR0b25NYXJnaW4oU3RhdGUs
IGNvbnN0IFFSZWN0JiBvcmlnaW5hbFJlY3QpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IHNsaWRl
ckxlbmd0aChRdDo6T3JpZW50YXRpb24pIGNvbnN0OworICAgIHZpcnR1YWwgaW50IHNsaWRlclRo
aWNrbmVzcyhRdDo6T3JpZW50YXRpb24pIGNvbnN0OworICAgIHZpcnR1YWwgaW50IHByb2dyZXNz
QmFyQ2h1bmtXaWR0aChjb25zdCBRU2l6ZSYpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBnZXRC
dXR0b25NZXRyaWNzKFFTdHJpbmcqIGJ1dHRvbkZvbnRGYW1pbHksIGludCogYnV0dG9uRm9udFBp
eGVsU2l6ZSkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIFFTaXplIGNvbWJvQm94U2l6ZUZyb21Db250
ZW50cyhTdGF0ZSwgY29uc3QgUVNpemUmIGNvbnRlbnRzU2l6ZSkgY29uc3Q7CisgICAgdmlydHVh
bCBRU2l6ZSBwdXNoQnV0dG9uU2l6ZUZyb21Db250ZW50cyhTdGF0ZSwgY29uc3QgUVNpemUmIGNv
bnRlbnRzU2l6ZSkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHZvaWQgcGFpbnRCdXR0b24oUVBhaW50
ZXIqLCBCdXR0b25UeXBlLCBjb25zdCBXZWJDb3JlOjpRU3R5bGVGYWNhZGVPcHRpb24gJnByb3h5
T3B0aW9uKTsKKyAgICB2aXJ0dWFsIHZvaWQgcGFpbnRUZXh0RmllbGQoUVBhaW50ZXIqLCBjb25z
dCBXZWJDb3JlOjpRU3R5bGVGYWNhZGVPcHRpb24mKTsKKyAgICB2aXJ0dWFsIHZvaWQgcGFpbnRD
b21ib0JveChRUGFpbnRlciosIGNvbnN0IFdlYkNvcmU6OlFTdHlsZUZhY2FkZU9wdGlvbiYpOwor
ICAgIHZpcnR1YWwgdm9pZCBwYWludENvbWJvQm94QXJyb3coUVBhaW50ZXIqLCBjb25zdCBXZWJD
b3JlOjpRU3R5bGVGYWNhZGVPcHRpb24mKTsKKworICAgIHZpcnR1YWwgdm9pZCBwYWludFNsaWRl
clRyYWNrKFFQYWludGVyKiwgY29uc3QgV2ViQ29yZTo6UVN0eWxlRmFjYWRlT3B0aW9uJik7Cisg
ICAgdmlydHVhbCB2b2lkIHBhaW50U2xpZGVyVGh1bWIoUVBhaW50ZXIqLCBjb25zdCBXZWJDb3Jl
OjpRU3R5bGVGYWNhZGVPcHRpb24mKTsKKyAgICB2aXJ0dWFsIHZvaWQgcGFpbnRJbm5lclNwaW5C
dXR0b24oUVBhaW50ZXIqLCBjb25zdCBXZWJDb3JlOjpRU3R5bGVGYWNhZGVPcHRpb24mLCBib29s
IHNwaW5Cb3hVcCk7CisgICAgdmlydHVhbCB2b2lkIHBhaW50UHJvZ3Jlc3NCYXIoUVBhaW50ZXIq
LCBjb25zdCBXZWJDb3JlOjpRU3R5bGVGYWNhZGVPcHRpb24mLCBkb3VibGUgcHJvZ3Jlc3MsIGRv
dWJsZSBhbmltYXRpb25Qcm9ncmVzcyk7CisKKyAgICB2aXJ0dWFsIGludCBzY3JvbGxCYXJFeHRl
bnQoYm9vbCBtaW5pKTsKKyAgICB2aXJ0dWFsIGJvb2wgc2Nyb2xsQmFyTWlkZGxlQ2xpY2tBYnNv
bHV0ZVBvc2l0aW9uU3R5bGVIaW50KCkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIHBhaW50U2Ny
b2xsQ29ybmVyKFFQYWludGVyKiwgY29uc3QgUVJlY3QmKTsKKworICAgIHZpcnR1YWwgU3ViQ29u
dHJvbCBoaXRUZXN0U2Nyb2xsQmFyKGNvbnN0IFdlYkNvcmU6OlFTdHlsZUZhY2FkZU9wdGlvbiYs
IGNvbnN0IFFQb2ludCYgcG9zKTsKKyAgICB2aXJ0dWFsIFFSZWN0IHNjcm9sbEJhclN1YkNvbnRy
b2xSZWN0KGNvbnN0IFdlYkNvcmU6OlFTdHlsZUZhY2FkZU9wdGlvbiYsIFN1YkNvbnRyb2wpOwor
ICAgIHZpcnR1YWwgdm9pZCBwYWludFNjcm9sbEJhcihRUGFpbnRlciosIGNvbnN0IFdlYkNvcmU6
OlFTdHlsZUZhY2FkZU9wdGlvbiYpOworCisgICAgdmlydHVhbCBRT2JqZWN0KiB3aWRnZXRGb3JQ
YWludGVyKFFQYWludGVyKik7CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsg
cmV0dXJuIHN0eWxlKCk7IH0KKworcHJpdmF0ZToKKyAgICBRU3R5bGUqIHN0eWxlKCkgY29uc3Q7
CisKKyAgICBRV2ViUGFnZUFkYXB0ZXIqIG1fcGFnZTsKKyAgICBtdXRhYmxlIFFQb2ludGVyPFFT
dHlsZT4gbV9zdHlsZTsKKyAgICBRU3R5bGUqIG1fZmFsbGJhY2tTdHlsZTsKKyAgICBib29sIG1f
b3duRmFsbGJhY2tTdHlsZTsKKyAgICBtdXRhYmxlIFFTY29wZWRQb2ludGVyPFFMaW5lRWRpdD4g
bV9saW5lRWRpdDsKK307CisKK30KKworI2VuZGlmIC8vIFFTdHlsZUZhY2FkZUltcF9oCmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldFN1cHBvcnQvUVdlYlVuZG9Db21tYW5kLmNw
cCBiL1NvdXJjZS9XZWJLaXQvcXQvV2lkZ2V0U3VwcG9ydC9RV2ViVW5kb0NvbW1hbmQuY3BwCm5l
dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAuLmExOTZkZjUwZDc0NWQwNDY5Mjk4OWIwODRkZDc4ZTRmYWJjNmRkM2YKLS0tIC9k
ZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldFN1cHBvcnQvUVdlYlVuZG9Db21t
YW5kLmNwcApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIERpZ2lh
IFBsYyBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykuCisgKgorICogVGhpcyBsaWJyYXJ5IGlz
IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5
IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAq
IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVp
dGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFu
eSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0
aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJB
TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJ
TElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisg
KiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisg
KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5l
cmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBm
aWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUg
Rm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJv
c3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworI2luY2x1ZGUgImNvbmZpZy5oIgor
I2luY2x1ZGUgIlFXZWJVbmRvQ29tbWFuZC5oIgorCisjaW5jbHVkZSAiVW5kb1N0ZXBRdC5oIgor
CisjaWZuZGVmIFFUX05PX1VORE9DT01NQU5ECitRV2ViVW5kb0NvbW1hbmQ6OlFXZWJVbmRvQ29t
bWFuZChRU2hhcmVkUG9pbnRlcjxVbmRvU3RlcFF0PiB1bmRvU3RlcCwgUVVuZG9Db21tYW5kKiBw
YXJlbnQpCisgICAgOiBRVW5kb0NvbW1hbmQocGFyZW50KQorICAgICwgbV9zdGVwKHVuZG9TdGVw
KQoreworICAgIFFfQVNTRVJUKHVuZG9TdGVwKTsKKyAgICBzZXRUZXh0KG1fc3RlcC0+dGV4dCgp
KTsKK30KKwordm9pZCBRV2ViVW5kb0NvbW1hbmQ6OnVuZG8oKQoreworICAgIG1fc3RlcC0+dW5k
bygpOworfQorCit2b2lkIFFXZWJVbmRvQ29tbWFuZDo6cmVkbygpCit7CisgICAgbV9zdGVwLT5y
ZWRvKCk7Cit9CisKKyNlbmRpZiAvLyBRVF9OT19VTkRPQ09NTUFORApkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYktpdC9xdC9XaWRnZXRTdXBwb3J0L1FXZWJVbmRvQ29tbWFuZC5oIGIvU291cmNlL1dl
YktpdC9xdC9XaWRnZXRTdXBwb3J0L1FXZWJVbmRvQ29tbWFuZC5oCm5ldyBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjZlNjEy
MWFkYzI5MTEwYmYwMzQ5MTdmMmYwZGNhYWNkNGNlNjRmZDMKLS0tIC9kZXYvbnVsbAorKysgYi9T
b3VyY2UvV2ViS2l0L3F0L1dpZGdldFN1cHBvcnQvUVdlYlVuZG9Db21tYW5kLmgKQEAgLTAsMCAr
MSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBEaWdpYSBQbGMgYW5kL29yIGl0cyBz
dWJzaWRpYXJ5KC1pZXMpLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5
b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVy
bXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxp
c2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24g
MiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4K
KyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3
aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVu
IHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZl
IHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4g
IElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4s
IDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEz
MDEsIFVTQS4KKyAqCisgKi8KKyNpZm5kZWYgUVdlYlVuZG9Db21tYW5kX2gKKyNkZWZpbmUgUVdl
YlVuZG9Db21tYW5kX2gKKworI2luY2x1ZGUgPHFzaGFyZWRwb2ludGVyLmg+CisjaW5jbHVkZSA8
cXVuZG9zdGFjay5oPgorCitjbGFzcyBVbmRvU3RlcFF0OworCisjaWZuZGVmIFFUX05PX1VORE9D
T01NQU5ECisKK2NsYXNzIFFXZWJVbmRvQ29tbWFuZCA6IHB1YmxpYyBRVW5kb0NvbW1hbmQgewor
cHVibGljOgorICAgIFFXZWJVbmRvQ29tbWFuZChRU2hhcmVkUG9pbnRlcjxVbmRvU3RlcFF0Piwg
UVVuZG9Db21tYW5kICpwYXJlbnQgPSAwKTsKKworICAgIHZvaWQgdW5kbygpOworICAgIHZvaWQg
cmVkbygpOworCitwcml2YXRlOgorICAgIFFTaGFyZWRQb2ludGVyPFVuZG9TdGVwUXQ+IG1fc3Rl
cDsKK307CisKKyNlbmRpZiAvLyBRVF9OT19VTkRPQ09NTUFORAorCisjZW5kaWYgLy8gUVdlYlVu
ZG9Db21tYW5kX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvcXQvV2lkZ2V0U3VwcG9ydC9R
V2lkZ2V0UGx1Z2luSW1wbC5jcHAgYi9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldFN1cHBvcnQvUVdp
ZGdldFBsdWdpbkltcGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjJiZWFiZjFkMDg1ODZjZDU1MzQzOGI3MjA4
ZmE4YTMxNWZiZTE5YjMKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdl
dFN1cHBvcnQvUVdpZGdldFBsdWdpbkltcGwuY3BwCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTIgRGlnaWEgUGxjIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKS4K
KyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1
dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGli
cmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUg
U29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2Us
IG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJy
YXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisg
KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJy
YW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ
VVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBm
b3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkg
b2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGgg
dGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRv
CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJl
ZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICov
CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJRV2lkZ2V0UGx1Z2luSW1wbC5oIgor
CisjaW5jbHVkZSA8UVdpZGdldD4KKworUVdpZGdldFBsdWdpbkltcGw6On5RV2lkZ2V0UGx1Z2lu
SW1wbCgpCit7CisgICAgbV93aWRnZXQtPmRlbGV0ZUxhdGVyKCk7Cit9CisKK3ZvaWQgUVdpZGdl
dFBsdWdpbkltcGw6OnVwZGF0ZShjb25zdCBRUmVjdCAmcmVjdCkKK3sKKyAgICBtX3dpZGdldC0+
dXBkYXRlKHJlY3QpOworfQorCit2b2lkIFFXaWRnZXRQbHVnaW5JbXBsOjpzZXRHZW9tZXRyeUFu
ZENsaXAoY29uc3QgUVJlY3QgJmdlb21ldHJ5LCBjb25zdCBRUmVjdCAmY2xpcFJlY3QsIGJvb2wg
aXNWaXNpYmxlKQoreworICAgIG1fd2lkZ2V0LT5zZXRHZW9tZXRyeShnZW9tZXRyeSk7CisgICAg
aWYgKCFjbGlwUmVjdC5pc051bGwoKSkgeworICAgICAgICBRUmVjdCBjbGlwKGNsaXBSZWN0Lmlu
dGVyc2VjdGVkKG1fd2lkZ2V0LT5yZWN0KCkpKTsKKyAgICAgICAgbV93aWRnZXQtPnNldE1hc2so
UVJlZ2lvbihjbGlwKSk7CisgICAgfQorICAgIG1fd2lkZ2V0LT51cGRhdGUoKTsKKyAgICBzZXRW
aXNpYmxlKGlzVmlzaWJsZSk7Cit9CisKK3ZvaWQgUVdpZGdldFBsdWdpbkltcGw6OnNldFZpc2li
bGUoYm9vbCB2aXNpYmxlKQoreworICAgIC8vIElmIHNldE1hc2sgaXMgc2V0IHdpdGggYW4gZW1w
dHkgUVJlZ2lvbiwgbm8gY2xpcHBpbmcgd2lsbAorICAgIC8vIGJlIHBlcmZvcm1lZCwgc28gaW4g
dGhhdCBjYXNlIHdlIGhpZGUgdGhlIHBsYXRmb3JtV2lkZ2V0LgorICAgIFFSZWdpb24gbWFzayA9
IG1fd2lkZ2V0LT5tYXNrKCk7CisgICAgbV93aWRnZXQtPnNldFZpc2libGUodmlzaWJsZSAmJiAh
bWFzay5pc0VtcHR5KCkpOworfQorCit2b2lkIFFXaWRnZXRQbHVnaW5JbXBsOjpzZXRTdHlsZVNo
ZWV0KGNvbnN0IFFTdHJpbmcgJnN0eWxlc2hlZXQpCit7CisgICAgbV93aWRnZXQtPnNldFN0eWxl
U2hlZXQoc3R5bGVzaGVldCk7Cit9CisKK3ZvaWQgUVdpZGdldFBsdWdpbkltcGw6OnNldFdpZGdl
dFBhcmVudChRT2JqZWN0ICpwYXJlbnQpCit7CisgICAgaWYgKCFwYXJlbnQtPmlzV2lkZ2V0VHlw
ZSgpKQorICAgICAgICByZXR1cm47CisgICAgbV93aWRnZXQtPnNldFBhcmVudChxb2JqZWN0X2Nh
c3Q8UVdpZGdldCo+KHBhcmVudCkpOworfQorCitRT2JqZWN0KiBRV2lkZ2V0UGx1Z2luSW1wbDo6
aGFuZGxlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV93aWRnZXQ7Cit9CisKKyNpbmNsdWRlICJt
b2NfUVdpZGdldFBsdWdpbkltcGwuY3BwIgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9X
aWRnZXRTdXBwb3J0L1FXaWRnZXRQbHVnaW5JbXBsLmggYi9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdl
dFN1cHBvcnQvUVdpZGdldFBsdWdpbkltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi43NDU5YjdlZmY1ODcwMTNm
M2FmMjQ4ZjdjMmM5MTI4NmNmNzQ5OWVlCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktp
dC9xdC9XaWRnZXRTdXBwb3J0L1FXaWRnZXRQbHVnaW5JbXBsLmgKQEAgLTAsMCArMSw0NCBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBEaWdpYSBQbGMgYW5kL29yIGl0cyBzdWJzaWRpYXJ5
KC1pZXMpLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJl
ZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhl
IEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0
aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUg
TGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBU
aGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVz
ZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBs
aWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBM
aWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVk
IGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxv
bmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwg
d3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5r
bGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4K
KyAqCisgKi8KKyNpZm5kZWYgUVdpZGdldFBsdWdpbkltcGxfaAorI2RlZmluZSBRV2lkZ2V0UGx1
Z2luSW1wbF9oCisKKyNpbmNsdWRlICJRdFBsdWdpbldpZGdldEFkYXB0ZXIuaCIKKworUVRfQkVH
SU5fTkFNRVNQQUNFCitjbGFzcyBRV2lkZ2V0OworUVRfRU5EX05BTUVTUEFDRQorCitjbGFzcyBR
V2lkZ2V0UGx1Z2luSW1wbCA6IHB1YmxpYyBRdFBsdWdpbldpZGdldEFkYXB0ZXIgeworICAgIFFf
T0JKRUNUCitwdWJsaWM6CisgICAgUVdpZGdldFBsdWdpbkltcGwoUVdpZGdldCAqdykgOiBtX3dp
ZGdldCh3KSB7IH0KKyAgICB2aXJ0dWFsIH5RV2lkZ2V0UGx1Z2luSW1wbCgpOworICAgIHZpcnR1
YWwgdm9pZCB1cGRhdGUoY29uc3QgUVJlY3QgJikgT1ZFUlJJREU7CisgICAgdmlydHVhbCB2b2lk
IHNldEdlb21ldHJ5QW5kQ2xpcChjb25zdCBRUmVjdCYsIGNvbnN0IFFSZWN0JiwgYm9vbCBpc1Zp
c2libGUpIE9WRVJSSURFOworICAgIHZpcnR1YWwgdm9pZCBzZXRWaXNpYmxlKGJvb2wpIE9WRVJS
SURFOworICAgIHZpcnR1YWwgdm9pZCBzZXRTdHlsZVNoZWV0KGNvbnN0IFFTdHJpbmcmKSBPVkVS
UklERTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0V2lkZ2V0UGFyZW50KFFPYmplY3QgKikgT1ZFUlJJ
REU7CisgICAgdmlydHVhbCBRT2JqZWN0KiBoYW5kbGUoKSBjb25zdCBPVkVSUklERTsKK3ByaXZh
dGU6CisgICAgUVdpZGdldCAqbV93aWRnZXQ7Cit9OworCisjZW5kaWYgLy8gUVdpZGdldFBsdWdp
bkltcGxfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9XaWRnZXRTdXBwb3J0L1F0RmFs
bGJhY2tXZWJQb3B1cC5jcHAgYi9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldFN1cHBvcnQvUXRGYWxs
YmFja1dlYlBvcHVwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5iMmZiZjYyNGFhOTViYWRkMDQ4MGFmNTM3YjVh
NGZkYTJkOTI3MGUxCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9xdC9XaWRnZXRT
dXBwb3J0L1F0RmFsbGJhY2tXZWJQb3B1cC5jcHAKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTAgR2lyaXNoIFJhbWFrcmlzaG5hbiA8Z2lyaXNoQGZvcndhcmRiaWFz
LmluPgorICogQ29weXJpZ2h0IChDKSAyMDA5IE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMg
c3Vic2lkaWFyeSgtaWVzKQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5
b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVy
bXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxp
c2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24g
MiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4K
KyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3
aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVu
IHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZl
IHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4g
IElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4s
IDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEz
MDEsIFVTQS4KKyAqCisgKi8KKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJRdEZhbGxi
YWNrV2ViUG9wdXAuaCIKKworI2lmbmRlZiBRVF9OT19DT01CT0JPWAorCisjaW5jbHVkZSAiUVdl
YlBhZ2VBZGFwdGVyLmgiCisjaW5jbHVkZSAiUVdlYlBhZ2VDbGllbnQuaCIKKyNpbmNsdWRlICJR
dFdlYkNvbWJvQm94LmgiCisjaW5jbHVkZSAicWdyYXBoaWNzd2Vidmlldy5oIgorI2luY2x1ZGUg
PFFHcmFwaGljc1Byb3h5V2lkZ2V0PgorI2luY2x1ZGUgPFF0R3VpL1FTdGFuZGFyZEl0ZW1Nb2Rl
bD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitRdEZhbGxiYWNrV2ViUG9wdXA6OlF0RmFsbGJh
Y2tXZWJQb3B1cChjb25zdCBRV2ViUGFnZUFkYXB0ZXIqIHBhZ2UpCisgICAgOiBtX2NvbWJvKDAp
CisgICAgLCBtX3BhZ2UocGFnZSkKK3sKK30KKworUXRGYWxsYmFja1dlYlBvcHVwOjp+UXRGYWxs
YmFja1dlYlBvcHVwKCkKK3sKKyAgICBkZWxldGVDb21ib0JveCgpOworfQorCit2b2lkIFF0RmFs
bGJhY2tXZWJQb3B1cDo6c2hvdyhjb25zdCBRV2ViU2VsZWN0RGF0YSYgZGF0YSkKK3sKKyAgICBp
ZiAoIXBhZ2VDbGllbnQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZGVsZXRlQ29tYm9Cb3go
KTsKKworICAgIG1fY29tYm8gPSBuZXcgUXRXZWJDb21ib0JveCgpOworICAgIGNvbm5lY3QobV9j
b21ibywgU0lHTkFMKGFjdGl2YXRlZChpbnQpKSwgU0xPVChhY3RpdmVDaGFuZ2VkKGludCkpLCBR
dDo6UXVldWVkQ29ubmVjdGlvbik7CisgICAgY29ubmVjdChtX2NvbWJvLCBTSUdOQUwoZGlkSGlk
ZSgpKSwgU0xPVChkZWxldGVDb21ib0JveCgpKSk7CisgICAgY29ubmVjdChtX2NvbWJvLCBTSUdO
QUwoZGlkSGlkZSgpKSwgU0lHTkFMKGRpZEhpZGUoKSkpOworCisgICAgcG9wdWxhdGUoZGF0YSk7
CisKKyAgICBRUmVjdCByZWN0ID0gZ2VvbWV0cnkoKTsKKyAgICBpZiAoUUdyYXBoaWNzV2ViVmll
dyAqd2ViVmlldyA9IHFvYmplY3RfY2FzdDxRR3JhcGhpY3NXZWJWaWV3Kj4ocGFnZUNsaWVudCgp
LT5wbHVnaW5QYXJlbnQoKSkpIHsKKyAgICAgICAgUUdyYXBoaWNzUHJveHlXaWRnZXQqIHByb3h5
ID0gbmV3IFFHcmFwaGljc1Byb3h5V2lkZ2V0KHdlYlZpZXcpOworICAgICAgICBwcm94eS0+c2V0
V2lkZ2V0KG1fY29tYm8pOworICAgICAgICBwcm94eS0+c2V0R2VvbWV0cnkocmVjdCk7CisgICAg
fSBlbHNlIHsKKyAgICAgICAgbV9jb21iby0+c2V0UGFyZW50KHFvYmplY3RfY2FzdDxRV2lkZ2V0
Kj4ocGFnZUNsaWVudCgpLT5vd25lcldpZGdldCgpKSk7CisgICAgICAgIG1fY29tYm8tPnNldEdl
b21ldHJ5KFFSZWN0KHJlY3QubGVmdCgpLCByZWN0LnRvcCgpLCByZWN0LndpZHRoKCksIG1fY29t
Ym8tPnNpemVIaW50KCkuaGVpZ2h0KCkpKTsKKyAgICB9CisKKyAgICBtX2NvbWJvLT5zaG93UG9w
dXBBdEN1cnNvclBvc2l0aW9uKCk7Cit9CisKK3ZvaWQgUXRGYWxsYmFja1dlYlBvcHVwOjpoaWRl
KCkKK3sKKyAgICAvLyBEZXN0cm95aW5nIHRoZSBRQ29tYm9Cb3ggaGVyZSBjYXVzZSBwcm9ibGVt
cyBpZiB0aGUgcG9wdXAgaXMgaW4gdGhlCisgICAgLy8gbWlkZGxlIG9mIGl0cyBzaG93IGFuaW1h
dGlvbi4gSW5zdGVhZCB3ZSByZWx5IG9uIHRoZSBmYWN0IHRoYXQgdGhlCisgICAgLy8gUXQ6OlBv
cHVwIHdpbmRvdyB3aWxsIGhpZGUgaXRzZWxmIG9uIG1vdXNlIGV2ZW50cyBvdXRzaWRlIGl0cyB3
aW5kb3cuCit9CisKK3ZvaWQgUXRGYWxsYmFja1dlYlBvcHVwOjpwb3B1bGF0ZShjb25zdCBRV2Vi
U2VsZWN0RGF0YSYgZGF0YSkKK3sKKyAgICBRU3RhbmRhcmRJdGVtTW9kZWwqIG1vZGVsID0gcW9i
amVjdF9jYXN0PFFTdGFuZGFyZEl0ZW1Nb2RlbCo+KG1fY29tYm8tPm1vZGVsKCkpOworICAgIFFf
QVNTRVJUKG1vZGVsKTsKKworICAgIG1fY29tYm8tPnNldEZvbnQoZm9udCgpKTsKKworICAgIGlu
dCBjdXJyZW50SW5kZXggPSAtMTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGEuaXRlbUNv
dW50KCk7ICsraSkgeworICAgICAgICBzd2l0Y2ggKGRhdGEuaXRlbVR5cGUoaSkpIHsKKyAgICAg
ICAgY2FzZSBRV2ViU2VsZWN0RGF0YTo6U2VwYXJhdG9yOgorICAgICAgICAgICAgbV9jb21iby0+
aW5zZXJ0U2VwYXJhdG9yKGkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUVdl
YlNlbGVjdERhdGE6Okdyb3VwOgorICAgICAgICAgICAgbV9jb21iby0+aW5zZXJ0SXRlbShpLCBk
YXRhLml0ZW1UZXh0KGkpKTsKKyAgICAgICAgICAgIG1vZGVsLT5pdGVtKGkpLT5zZXRFbmFibGVk
KGZhbHNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFFXZWJTZWxlY3REYXRh
OjpPcHRpb246CisgICAgICAgICAgICBtX2NvbWJvLT5pbnNlcnRJdGVtKGksIGRhdGEuaXRlbVRl
eHQoaSkpOworICAgICAgICAgICAgbW9kZWwtPml0ZW0oaSktPnNldEVuYWJsZWQoZGF0YS5pdGVt
SXNFbmFibGVkKGkpKTsKKyNpZm5kZWYgUVRfTk9fVE9PTFRJUAorICAgICAgICAgICAgbW9kZWwt
Pml0ZW0oaSktPnNldFRvb2xUaXAoZGF0YS5pdGVtVG9vbFRpcChpKSk7CisjZW5kaWYKKyAgICAg
ICAgICAgIG1vZGVsLT5pdGVtKGkpLT5zZXRCYWNrZ3JvdW5kKGRhdGEuaXRlbUJhY2tncm91bmRD
b2xvcihpKSk7CisgICAgICAgICAgICBtb2RlbC0+aXRlbShpKS0+c2V0Rm9yZWdyb3VuZChkYXRh
Lml0ZW1Gb3JlZ3JvdW5kQ29sb3IoaSkpOworICAgICAgICAgICAgaWYgKGRhdGEuaXRlbUlzU2Vs
ZWN0ZWQoaSkpCisgICAgICAgICAgICAgICAgY3VycmVudEluZGV4ID0gaTsKKyAgICAgICAgICAg
IGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGN1cnJlbnRJbmRleCA+PSAwKQor
ICAgICAgICBtX2NvbWJvLT5zZXRDdXJyZW50SW5kZXgoY3VycmVudEluZGV4KTsKK30KKwordm9p
ZCBRdEZhbGxiYWNrV2ViUG9wdXA6OmFjdGl2ZUNoYW5nZWQoaW50IGluZGV4KQoreworICAgIGlm
IChpbmRleCA8IDApCisgICAgICAgIHJldHVybjsKKworICAgIGVtaXQgc2VsZWN0SXRlbShpbmRl
eCwgZmFsc2UsIGZhbHNlKTsKK30KKwordm9pZCBRdEZhbGxiYWNrV2ViUG9wdXA6OmRlbGV0ZUNv
bWJvQm94KCkKK3sKKyAgICBpZiAoIW1fY29tYm8pCisgICAgICAgIHJldHVybjsKKyAgICBtX2Nv
bWJvLT5kZWxldGVMYXRlcigpOworICAgIG1fY29tYm8gPSAwOworfQorCitRV2ViUGFnZUNsaWVu
dCogUXRGYWxsYmFja1dlYlBvcHVwOjpwYWdlQ2xpZW50KCkgY29uc3QKK3sKKyAgICByZXR1cm4g
bV9wYWdlLT5jbGllbnQuZGF0YSgpOworfQorCit9CisKKyNlbmRpZiAvLyBRVF9OT19DT01CT0JP
WApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9XaWRnZXRTdXBwb3J0L1F0RmFsbGJhY2tX
ZWJQb3B1cC5oIGIvU291cmNlL1dlYktpdC9xdC9XaWRnZXRTdXBwb3J0L1F0RmFsbGJhY2tXZWJQ
b3B1cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAuLjY5YjQ5YmRiZjg4NTE4NmFmNTQ1ZjZlZGJhMzkwYzY1NzU1NWYw
NWQKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldFN1cHBvcnQvUXRG
YWxsYmFja1dlYlBvcHVwLmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAwOSBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykKKyAqCisg
KiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQg
YW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdh
cmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChh
dCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlz
IGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQg
V0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBv
ZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF
LiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9y
ZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhl
IEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBs
aWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0
aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZp
ZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisjaWZu
ZGVmIFF0RmFsbGJhY2tXZWJQb3B1cF9oCisjZGVmaW5lIFF0RmFsbGJhY2tXZWJQb3B1cF9oCisK
KyNpbmNsdWRlICJxd2Via2l0cGxhdGZvcm1wbHVnaW4uaCIKKyNpbmNsdWRlIDx3dGYvUGxhdGZv
cm0uaD4KKworI2lmbmRlZiBRVF9OT19DT01CT0JPWAorCitRVF9CRUdJTl9OQU1FU1BBQ0UKK2Ns
YXNzIFFHcmFwaGljc1Byb3h5V2lkZ2V0OworUVRfRU5EX05BTUVTUEFDRQorCitjbGFzcyBRV2Vi
UGFnZUNsaWVudDsKK2NsYXNzIFFXZWJQYWdlQWRhcHRlcjsKKworbmFtZXNwYWNlIFdlYkNvcmUg
eworCitjbGFzcyBRdFdlYkNvbWJvQm94OworCitjbGFzcyBRdEZhbGxiYWNrV2ViUG9wdXAgOiBw
dWJsaWMgUVdlYlNlbGVjdE1ldGhvZCB7CisgICAgUV9PQkpFQ1QKK3B1YmxpYzoKKyAgICBRdEZh
bGxiYWNrV2ViUG9wdXAoY29uc3QgUVdlYlBhZ2VBZGFwdGVyKik7CisgICAgflF0RmFsbGJhY2tX
ZWJQb3B1cCgpOworCisgICAgdmlydHVhbCB2b2lkIHNob3coY29uc3QgUVdlYlNlbGVjdERhdGEm
KTsKKyAgICB2aXJ0dWFsIHZvaWQgaGlkZSgpOworCisgICAgdm9pZCBzZXRHZW9tZXRyeShjb25z
dCBRUmVjdCYgcmVjdCkgeyBtX2dlb21ldHJ5ID0gcmVjdDsgfQorICAgIFFSZWN0IGdlb21ldHJ5
KCkgY29uc3QgeyByZXR1cm4gbV9nZW9tZXRyeTsgfQorCisgICAgdm9pZCBzZXRGb250KGNvbnN0
IFFGb250JiBmb250KSB7IG1fZm9udCA9IGZvbnQ7IH0KKyAgICBRRm9udCBmb250KCkgY29uc3Qg
eyByZXR1cm4gbV9mb250OyB9CisKK3ByaXZhdGUgUV9TTE9UUzoKKyAgICB2b2lkIGFjdGl2ZUNo
YW5nZWQoaW50KTsKKyAgICB2b2lkIGRlbGV0ZUNvbWJvQm94KCk7CisKK3ByaXZhdGU6CisgICAg
UXRXZWJDb21ib0JveCogbV9jb21ibzsKKyAgICBjb25zdCBRV2ViUGFnZUFkYXB0ZXIqIG1fcGFn
ZTsKKyAgICBRUmVjdCBtX2dlb21ldHJ5OworICAgIFFGb250IG1fZm9udDsKKworICAgIFFXZWJQ
YWdlQ2xpZW50KiBwYWdlQ2xpZW50KCkgY29uc3Q7CisKKyAgICB2b2lkIHBvcHVsYXRlKGNvbnN0
IFFXZWJTZWxlY3REYXRhJik7Cit9OworCit9CisKKyNlbmRpZiAvLyBRVF9OT19DT01CT0JPWAor
CisjZW5kaWYgLy8gUXRGYWxsYmFja1dlYlBvcHVwX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJL
aXQvcXQvV2lkZ2V0U3VwcG9ydC9RdFdlYkNvbWJvQm94LmNwcCBiL1NvdXJjZS9XZWJLaXQvcXQv
V2lkZ2V0U3VwcG9ydC9RdFdlYkNvbWJvQm94LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4yYzIyY2Q0NzZjNmQ1
OWIzODAyMGJmYmQzMDJkNTc1MmQwMjNlN2UwCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dl
YktpdC9xdC9XaWRnZXRTdXBwb3J0L1F0V2ViQ29tYm9Cb3guY3BwCkBAIC0wLDAgKzEsNTggQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR2lyaXNoIFJhbWFrcmlzaG5hbiA8Z2lyaXNoQGZv
cndhcmRiaWFzLmluPgorICogQ29weXJpZ2h0IChDKSAyMDA5LCAyMDExIE5va2lhIENvcnBvcmF0
aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBm
cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBp
dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBM
aWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRo
ZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkg
bGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhl
IGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5U
WTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJ
VFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICog
TGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICog
WW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmls
ZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZv
dW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0
b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgor
I2luY2x1ZGUgIlF0V2ViQ29tYm9Cb3guaCIKKworI2lmbmRlZiBRVF9OT19DT01CT0JPWAorCisj
aW5jbHVkZSA8UUFic3RyYWN0SXRlbVZpZXc+CisjaW5jbHVkZSA8UUNvcmVBcHBsaWNhdGlvbj4K
KyNpbmNsdWRlIDxRdEd1aS9RTW91c2VFdmVudD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitR
dFdlYkNvbWJvQm94OjpRdFdlYkNvbWJvQm94KCkKKyAgICA6IFFDb21ib0JveCgpCit7CisgICAg
Ly8gSW5zdGFsbCBhbiBldmVudCBmaWx0ZXIgb24gdGhlIHZpZXcgaW5zaWRlIHRoZSBjb21ibyBi
b3ggcG9wdXAgdG8gbWFrZSBzdXJlIHdlIGtub3cKKyAgICAvLyB3aGVuIHRoZSBwb3B1cCBnb3Qg
Y2xvc2VkLiBFLmcuIFFDb21ib0JveDo6aGlkZVBvcHVwKCkgd29uJ3QgYmUgY2FsbGVkIHdoZW4g
dGhlIHBvcHVwCisgICAgLy8gaXMgY2xvc2VkIGJ5IGEgbW91c2Ugd2hlZWwgZXZlbnQgb3V0c2lk
ZSBpdHMgd2luZG93LgorICAgIHZpZXcoKS0+aW5zdGFsbEV2ZW50RmlsdGVyKHRoaXMpOworfQor
Cit2b2lkIFF0V2ViQ29tYm9Cb3g6OnNob3dQb3B1cEF0Q3Vyc29yUG9zaXRpb24oKQoreworICAg
IFFNb3VzZUV2ZW50IGV2ZW50KFFFdmVudDo6TW91c2VCdXR0b25QcmVzcywgUUN1cnNvcjo6cG9z
KCksIFF0OjpMZWZ0QnV0dG9uLCBRdDo6TGVmdEJ1dHRvbiwgUXQ6Ok5vTW9kaWZpZXIpOworICAg
IFFDb3JlQXBwbGljYXRpb246OnNlbmRFdmVudCh0aGlzLCAmZXZlbnQpOworfQorCitib29sIFF0
V2ViQ29tYm9Cb3g6OmV2ZW50RmlsdGVyKFFPYmplY3QqIHdhdGNoZWQsIFFFdmVudCogZXZlbnQp
Cit7CisgICAgUV9BU1NFUlQod2F0Y2hlZCA9PSB2aWV3KCkpOworICAgIGlmIChldmVudC0+dHlw
ZSgpID09IFFFdmVudDo6SGlkZSkKKyAgICAgICAgZW1pdCBkaWRIaWRlKCk7CisgICAgcmV0dXJu
IGZhbHNlOworfQorCit9CisKKyNlbmRpZiAvLyBRVF9OT19DT01CT0JPWApkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYktpdC9xdC9XaWRnZXRTdXBwb3J0L1F0V2ViQ29tYm9Cb3guaCBiL1NvdXJjZS9X
ZWJLaXQvcXQvV2lkZ2V0U3VwcG9ydC9RdFdlYkNvbWJvQm94LmgKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZTMyNDI3
ZWRmNGQ0YjdmOTdkZWRlYjhlOGVlNGUwMjYwNGVkYzc2MgotLS0gL2Rldi9udWxsCisrKyBiL1Nv
dXJjZS9XZWJLaXQvcXQvV2lkZ2V0U3VwcG9ydC9RdFdlYkNvbWJvQm94LmgKQEAgLTAsMCArMSw0
NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3Ig
aXRzIHN1YnNpZGlhcnkoLWllcykKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2Fy
ZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhl
IHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBw
dWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJz
aW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNp
b24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQg
aXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQg
ZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2Vu
ZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQg
aGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExp
Y2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5M
SUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJ
bmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjEx
MC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpZm5kZWYgUXRXZWJDb21ib0JveF9oCisjZGVmaW5l
IFF0V2ViQ29tYm9Cb3hfaAorCisjaW5jbHVkZSA8UUNvbWJvQm94PgorI2luY2x1ZGUgPHd0Zi9Q
bGF0Zm9ybS5oPgorCisjaWZuZGVmIFFUX05PX0NPTUJPQk9YCisKK25hbWVzcGFjZSBXZWJDb3Jl
IHsKKworY2xhc3MgUXRXZWJDb21ib0JveCA6IHB1YmxpYyBRQ29tYm9Cb3ggeworICAgIFFfT0JK
RUNUCitwdWJsaWM6CisgICAgUXRXZWJDb21ib0JveCgpOworCisgICAgdm9pZCBzaG93UG9wdXBB
dEN1cnNvclBvc2l0aW9uKCk7CisgICAgdmlydHVhbCBib29sIGV2ZW50RmlsdGVyKFFPYmplY3Qq
IHdhdGNoZWQsIFFFdmVudCopOworCitRX1NJR05BTFM6CisgICAgdm9pZCBkaWRIaWRlKCk7Cit9
OworCit9CisKKyNlbmRpZiAvLyBRVF9OT19DT01CT0JPWAorCisjZW5kaWYgLy8gUXRXZWJDb21i
b0JveF9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0L2RlY2xhcmF0aXZlL2V4cGVyaW1l
bnRhbC9leHBlcmltZW50YWwucHJpIGIvU291cmNlL1dlYktpdC9xdC9kZWNsYXJhdGl2ZS9leHBl
cmltZW50YWwvZXhwZXJpbWVudGFsLnByaQppbmRleCAzNzc1MDU2YWFlNWExNmE1NWRkNDAzZGI0
YWUwYWE4ZDY2ZGJiODZhLi41Y2Q5NTg3MjA3NjY2MmI1NGE4MDQ4MDg0ODBmZjY2NzQ3NWY1OTli
IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L3F0L2RlY2xhcmF0aXZlL2V4cGVyaW1lbnRhbC9l
eHBlcmltZW50YWwucHJpCisrKyBiL1NvdXJjZS9XZWJLaXQvcXQvZGVjbGFyYXRpdmUvZXhwZXJp
bWVudGFsL2V4cGVyaW1lbnRhbC5wcmkKQEAgLTI0LDcgKzI0LDcgQEAgY29udGFpbnMoUVRfQ09O
RklHLCByZWR1Y2VfZXhwb3J0cyk6Q09ORklHICs9IGhpZGVfc3ltYm9scwogCiB3aW5jZSo6TElC
UyArPSAkJFFNQUtFX0xJQlNfR1VJCiAKLVFUICs9IG5ldHdvcmsgcXVpY2sgcXVpY2stcHJpdmF0
ZSB3ZWJraXR3aWRnZXRzIHdlYmtpdHdpZGdldHMtcHJpdmF0ZQorUVQgKz0gbmV0d29yayBxdWlj
ayBxdWljay1wcml2YXRlIHdlYmtpdCB3ZWJraXQtcHJpdmF0ZQogCiBERVNURElSID0gJCR7Uk9P
VF9CVUlMRF9ESVJ9L2ltcG9ydHMvJCR7VEFSR0VULm1vZHVsZV9uYW1lfQogCkBAIC0zNSw3ICsz
NSw4IEBAIFNPVVJDRVMgKz0gcGx1Z2luLmNwcAogCiBERUZJTkVTICs9IEhBVkVfV0VCS0lUMgog
Ci1XRUJLSVQgKz0gd3RmIGphdmFzY3JpcHRjb3JlIHdlYmtpdDIKKyMjIyBMSUJTUExJVDogcmVt
b3ZlIHdlYmNvcmUKK1dFQktJVCArPSB3dGYgamF2YXNjcmlwdGNvcmUgd2ViY29yZSB3ZWJraXQy
CiAKIHRhcmdldC5wYXRoID0gJCRbUVRfSU5TVEFMTF9JTVBPUlRTXS8kJHtUQVJHRVQubW9kdWxl
X25hbWV9CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvcXQvZGVjbGFyYXRpdmUvcHVibGlj
LnByaSBiL1NvdXJjZS9XZWJLaXQvcXQvZGVjbGFyYXRpdmUvcHVibGljLnByaQppbmRleCA5MjE2
YThiNjQ1MTVhYWM0ZjdmNzNlZWE5YTFhYjdlMGE0N2E5NDA4Li40NmIxYTgzYzljZDYyNzQ2YTVl
MmUxZWE4NWEwOTE1ZjM5OTllMWRlIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L3F0L2RlY2xh
cmF0aXZlL3B1YmxpYy5wcmkKKysrIGIvU291cmNlL1dlYktpdC9xdC9kZWNsYXJhdGl2ZS9wdWJs
aWMucHJpCkBAIC0yNCw3ICsyNCw3IEBAIGNvbnRhaW5zKFFUX0NPTkZJRywgcmVkdWNlX2V4cG9y
dHMpOkNPTkZJRyArPSBoaWRlX3N5bWJvbHMKIAogd2luY2UqOkxJQlMgKz0gJCRRTUFLRV9MSUJT
X0dVSQogCi1RVCArPSB3ZWJraXR3aWRnZXRzIHdlYmtpdHdpZGdldHMtcHJpdmF0ZSBxdWljayBx
dWljay1wcml2YXRlCitRVCArPSB3ZWJraXQgd2Via2l0LXByaXZhdGUgcXVpY2sgcXVpY2stcHJp
dmF0ZQogCiBXRUJLSVQgKz0gd3RmCiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQyL1BsdWdp
blByb2Nlc3MucHJvIGIvU291cmNlL1dlYktpdDIvUGx1Z2luUHJvY2Vzcy5wcm8KaW5kZXggNTQ1
OTc5NTExYWJjYzJiN2MyZWMxNGNjOGU4ODgxMmQ5Y2M5YjJhNy4uZTI4Y2VjM2Q4YzFkZTkzN2M2
Y2Y1ZTlmMmE1YzdkYzcyMzQ2MDQwZSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdDIvUGx1Z2lu
UHJvY2Vzcy5wcm8KKysrIGIvU291cmNlL1dlYktpdDIvUGx1Z2luUHJvY2Vzcy5wcm8KQEAgLTIw
LDYgKzIwLDkgQEAgSU5DTFVERVBBVEggPSBcCiAKIElOU1RBTExTICs9IHRhcmdldAogCisjIyMg
TElCU1BMSVQ6IHJlbW92ZSBtZQorV0VCS0lUICs9IHdlYmNvcmUKKwogaXNFbXB0eShJTlNUQUxM
X0JJTlMpIHsKICAgICB1c2U/KGxpYmV4ZWNkaXIpOiB0YXJnZXQucGF0aCA9ICQkW1FUX0lOU1RB
TExfTElCRVhFQ1NdCiAgICAgZWxzZTogdGFyZ2V0LnBhdGggPSAkJFtRVF9JTlNUQUxMX0JJTlNd
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL3F0L3Rlc3RzL2luc3Bl
Y3RvcnNlcnZlci9pbnNwZWN0b3JzZXJ2ZXIucHJvIGIvU291cmNlL1dlYktpdDIvVUlQcm9jZXNz
L0FQSS9xdC90ZXN0cy9pbnNwZWN0b3JzZXJ2ZXIvaW5zcGVjdG9yc2VydmVyLnBybwppbmRleCBi
YzUzMDdmMmRjM2E1N2VkZjJiYWM4YWU5NWRiMDE2OGUyZDViZTI5Li40YThkODZmODA4OTdkN2Vl
MTJjMTA4OWJjMWRmOTQ5ZjMxODAzMzgwIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0Mi9VSVBy
b2Nlc3MvQVBJL3F0L3Rlc3RzL2luc3BlY3RvcnNlcnZlci9pbnNwZWN0b3JzZXJ2ZXIucHJvCisr
KyBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvcXQvdGVzdHMvaW5zcGVjdG9yc2VydmVy
L2luc3BlY3RvcnNlcnZlci5wcm8KQEAgLTEsNCArMSw0IEBACiBpbmNsdWRlKC4uL3Rlc3RzLnBy
aSkKIFNPVVJDRVMgKz0gJCR7VEFSR0VUfS5jcHAKLVFUICs9IHdlYmtpdHdpZGdldHMtcHJpdmF0
ZQorUVQgKz0gd2Via2l0LXByaXZhdGUKIERFRklORVMgKz0gSU1QT1JUX0RJUj1cIlxcXCIkJHtS
T09UX0JVSUxEX0RJUn0kJHtRTUFLRV9ESVJfU0VQfWltcG9ydHNcXFwiXCIKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvcXQvdGVzdHMvcHVibGljYXBpL3B1YmxpY2Fw
aS5wcm8gYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL3F0L3Rlc3RzL3B1YmxpY2FwaS9w
dWJsaWNhcGkucHJvCmluZGV4IGJhOGY0Y2VhMzQzNDk2NTZiNGEyZDc3NWFmYjE4YjIwZTRhZWY0
ZmIuLjAyZGMxOTdjNzllNzY3MGUxM2I1MmY4YWZhZTRkNjcyZWYyMWI3YjggMTAwNjQ0Ci0tLSBh
L1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvcXQvdGVzdHMvcHVibGljYXBpL3B1YmxpY2Fw
aS5wcm8KKysrIGIvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9xdC90ZXN0cy9wdWJsaWNh
cGkvcHVibGljYXBpLnBybwpAQCAtMSwzICsxLDMgQEAKIGluY2x1ZGUoLi4vdGVzdHMucHJpKQog
U09VUkNFUyArPSAkJHtUQVJHRVR9LmNwcAotUVQgKz0gd2Via2l0d2lkZ2V0cy1wcml2YXRlCitR
VCArPSB3ZWJraXQtcHJpdmF0ZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdDIvVUlQcm9jZXNz
L0FQSS9xdC90ZXN0cy9xbWx0ZXN0cy9EZXNrdG9wQmVoYXZpb3IucHJvIGIvU291cmNlL1dlYktp
dDIvVUlQcm9jZXNzL0FQSS9xdC90ZXN0cy9xbWx0ZXN0cy9EZXNrdG9wQmVoYXZpb3IucHJvCmlu
ZGV4IDdjNzJmZDJmMTViMDNjM2E2M2Y1MWY0MWEwYTNlNjI5ZDg3MGNjNmYuLjNmZDNkNDU4MzMz
NWE3YTQ2ZGE4ZGZmYTU2NzZkYTFlOTA2MjgxMjkgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQy
L1VJUHJvY2Vzcy9BUEkvcXQvdGVzdHMvcW1sdGVzdHMvRGVza3RvcEJlaGF2aW9yLnBybworKysg
Yi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL3F0L3Rlc3RzL3FtbHRlc3RzL0Rlc2t0b3BC
ZWhhdmlvci5wcm8KQEAgLTMsNyArMyw3IEBAIFNPVVJDRVMgKz0gdHN0X3FtbHRlc3RzLmNwcAog
VEFSR0VUID0gdHN0X3FtbHRlc3RzX0Rlc2t0b3BCZWhhdmlvcgogT0JKRUNUU19ESVIgPSBvYmpf
RGVza3RvcEJlaGF2aW9yLyQkYWN0aXZlQnVpbGRDb25maWcoKQogCi1RVCArPSB3ZWJraXR3aWRn
ZXRzLXByaXZhdGUKK1FUICs9IHdlYmtpdC1wcml2YXRlCiBDT05GSUcgKz0gd2Fybl9vbiB0ZXN0
Y2FzZQogCiBRVCArPSBxbWx0ZXN0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nl
c3MvQVBJL3F0L3Rlc3RzL3FtbHRlc3RzL1dlYlZpZXcucHJvIGIvU291cmNlL1dlYktpdDIvVUlQ
cm9jZXNzL0FQSS9xdC90ZXN0cy9xbWx0ZXN0cy9XZWJWaWV3LnBybwppbmRleCAzZTIxN2IzNjk1
ZGU0Zjk5NGQ1NmY2NTM5ODQxNzVhYWU1NWI1MGE5Li5iMzQwMjM1ZTQ3NGEwOTNiZjkyNmQyYzI0
ZmE1NTI0ZTNmNjllZDJiIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJ
L3F0L3Rlc3RzL3FtbHRlc3RzL1dlYlZpZXcucHJvCisrKyBiL1NvdXJjZS9XZWJLaXQyL1VJUHJv
Y2Vzcy9BUEkvcXQvdGVzdHMvcW1sdGVzdHMvV2ViVmlldy5wcm8KQEAgLTMsNyArMyw3IEBAIFNP
VVJDRVMgKz0gdHN0X3FtbHRlc3RzLmNwcAogVEFSR0VUID0gdHN0X3FtbHRlc3RzX1dlYlZpZXcK
IE9CSkVDVFNfRElSID0gb2JqX1dlYlZpZXcvJCRhY3RpdmVCdWlsZENvbmZpZygpCiAKLVFUICs9
IHdlYmtpdHdpZGdldHMtcHJpdmF0ZQorUVQgKz0gd2Via2l0LXByaXZhdGUKIENPTkZJRyArPSB3
YXJuX29uIHRlc3RjYXNlCiAKIFFUICs9IHFtbHRlc3QKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJL
aXQyL1VJUHJvY2Vzcy9BUEkvcXQvdGVzdHMvcXF1aWNrd2Vidmlldy9xcXVpY2t3ZWJ2aWV3LnBy
byBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvcXQvdGVzdHMvcXF1aWNrd2Vidmlldy9x
cXVpY2t3ZWJ2aWV3LnBybwppbmRleCBiYzUzMDdmMmRjM2E1N2VkZjJiYWM4YWU5NWRiMDE2OGUy
ZDViZTI5Li40YThkODZmODA4OTdkN2VlMTJjMTA4OWJjMWRmOTQ5ZjMxODAzMzgwIDEwMDY0NAot
LS0gYS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL3F0L3Rlc3RzL3FxdWlja3dlYnZpZXcv
cXF1aWNrd2Vidmlldy5wcm8KKysrIGIvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9xdC90
ZXN0cy9xcXVpY2t3ZWJ2aWV3L3FxdWlja3dlYnZpZXcucHJvCkBAIC0xLDQgKzEsNCBAQAogaW5j
bHVkZSguLi90ZXN0cy5wcmkpCiBTT1VSQ0VTICs9ICQke1RBUkdFVH0uY3BwCi1RVCArPSB3ZWJr
aXR3aWRnZXRzLXByaXZhdGUKK1FUICs9IHdlYmtpdC1wcml2YXRlCiBERUZJTkVTICs9IElNUE9S
VF9ESVI9XCJcXFwiJCR7Uk9PVF9CVUlMRF9ESVJ9JCR7UU1BS0VfRElSX1NFUH1pbXBvcnRzXFxc
IlwiCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL3F0L3Rlc3RzL3Fy
YXd3ZWJ2aWV3L3FyYXd3ZWJ2aWV3LnBybyBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkv
cXQvdGVzdHMvcXJhd3dlYnZpZXcvcXJhd3dlYnZpZXcucHJvCmluZGV4IGJhOGY0Y2VhMzQzNDk2
NTZiNGEyZDc3NWFmYjE4YjIwZTRhZWY0ZmIuLjAyZGMxOTdjNzllNzY3MGUxM2I1MmY4YWZhZTRk
NjcyZWYyMWI3YjggMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvcXQv
dGVzdHMvcXJhd3dlYnZpZXcvcXJhd3dlYnZpZXcucHJvCisrKyBiL1NvdXJjZS9XZWJLaXQyL1VJ
UHJvY2Vzcy9BUEkvcXQvdGVzdHMvcXJhd3dlYnZpZXcvcXJhd3dlYnZpZXcucHJvCkBAIC0xLDMg
KzEsMyBAQAogaW5jbHVkZSguLi90ZXN0cy5wcmkpCiBTT1VSQ0VTICs9ICQke1RBUkdFVH0uY3Bw
Ci1RVCArPSB3ZWJraXR3aWRnZXRzLXByaXZhdGUKK1FUICs9IHdlYmtpdC1wcml2YXRlCmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL3F0L3Rlc3RzL3Rlc3RzLnByaSBi
L1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvcXQvdGVzdHMvdGVzdHMucHJpCmluZGV4IDEy
M2IyNWNlMjBkY2U4MDAzOGYyNmFhZjI0MWNiZGJiNWM4OWIzZmYuLmExMTMzNTMwZGFhZTlhZmU2
YmUyMjJmMzFlNzNmMzY4MjcyY2VkODAgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQyL1VJUHJv
Y2Vzcy9BUEkvcXQvdGVzdHMvdGVzdHMucHJpCisrKyBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vz
cy9BUEkvcXQvdGVzdHMvdGVzdHMucHJpCkBAIC02LDcgKzYsNyBAQCBUQVJHRVQgPSB0c3RfJCRU
QVJHRVQKIElOQ0xVREVQQVRIICs9ICQkUFdECiBTT1VSQ0VTICs9ICAuLi91dGlsLmNwcAogCi1R
VCArPSB0ZXN0bGliIHdlYmtpdHdpZGdldHMKK1FUICs9IHRlc3RsaWIgd2Via2l0CiBoYXZlPyhR
VFFVSUNLKSB7CiAgICAgUVQgKz0gcW1sIHF1aWNrIHF1aWNrLXByaXZhdGUKICAgICBIRUFERVJT
ICs9IC4uL2J5dGVhcnJheXRlc3RkYXRhLmggXApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdDIv
Y29uZmlnLmggYi9Tb3VyY2UvV2ViS2l0Mi9jb25maWcuaAppbmRleCBjNDNhNzhmOTQ4MDhkOWRl
MjFjNGNlZDZmMDViNzNjMzBiYzBjZjYxLi5iZTQwOTE4N2FjMTNiY2MwZWFmZjM0YThmZWQ0Yjc4
YmI0NzU2Yzg1IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0Mi9jb25maWcuaAorKysgYi9Tb3Vy
Y2UvV2ViS2l0Mi9jb25maWcuaApAQCAtMzksNiArMzksOSBAQAogI2luY2x1ZGUgPHJ1bnRpbWUv
SlNFeHBvcnRNYWNyb3MuaD4KICNlbmRpZgogCisvLyAjIyMgUkVNT1ZFIEFGVEVSIExJQlNQTElU
CisjaW5jbHVkZSA8cGxhdGZvcm0vUGxhdGZvcm1FeHBvcnRNYWNyb3MuaD4KKwogI2lmZGVmIF9f
Y3BsdXNwbHVzCiAjaWZuZGVmIEVYVEVSTl9DX0JFR0lOCiAjZGVmaW5lIEVYVEVSTl9DX0JFR0lO
IGV4dGVybiAiQyIgewpkaWZmIC0tZ2l0IGEvU291cmNlL2FwaS5wcmkgYi9Tb3VyY2UvYXBpLnBy
aQppbmRleCBmNmMzYzNjNzVmNzZmMjBkZWUxNTNkOGM0NjIwNTk0NjM4ZjE0MDY5Li43OWYyOTZk
YzQyOTdmZGRjOWRiNTExM2VlZjZhNTQ0NjIxMTAxZjA4IDEwMDY0NAotLS0gYS9Tb3VyY2UvYXBp
LnByaQorKysgYi9Tb3VyY2UvYXBpLnByaQpAQCAtOCwxMyArOCwxMyBAQAogbG9hZChxdF9idWls
ZF9jb25maWcpCiAKIFRFTVBMQVRFID0gbGliCi1UQVJHRVQgPSBRdFdlYktpdFdpZGdldHMKK1RB
UkdFVCA9IFF0V2ViS2l0CiAKIFdFQktJVF9ERVNURElSID0gJCR7Uk9PVF9CVUlMRF9ESVJ9L2xp
YgogCiBXRUJLSVQgKz0gd3RmIGphdmFzY3JpcHRjb3JlIHdlYmNvcmUKIAotYnVpbGQ/KHdlYmtp
dDEpOiBXRUJLSVQgKz0gd2Via2l0d2lkZ2V0cyB3ZWJraXQxCitidWlsZD8od2Via2l0MSk6IFdF
QktJVCArPSB3ZWJraXQxCiBidWlsZD8od2Via2l0Mik6IFdFQktJVCArPSB3ZWJraXQyCiAKICMg
RW5zdXJlIHRoYXQgY2hhbmdlcyB0byB0aGUgV2ViS2l0MSBhbmQgV2ViS2l0MiBBUEkgd2lsbCB0
cmlnZ2VyIGEgcW1ha2Ugb2YgdGhpcwpAQCAtMjcsMTIgKzI3LDEyIEBAIGJ1aWxkPyh3ZWJraXQy
KTogUU1BS0VfSU5URVJOQUxfSU5DTFVERURfRklMRVMgKj0gV2ViS2l0Mi9UYXJnZXQucHJpCiAK
IHVzZT8oM0RfR1JBUEhJQ1MpOiBXRUJLSVQgKz0gYW5nbGUKIAotTU9EVUxFID0gd2Via2l0d2lk
Z2V0cworTU9EVUxFID0gd2Via2l0CitDT05GSUcgKz0gY3JlYXRpbmdfbW9kdWxlCiAKICMgVGhp
cyBpcyB0aGUgY2Fub25pY2FsIGxpc3Qgb2YgZGVwZW5kZW5jaWVzIGZvciB0aGUgcHVibGljIEFQ
SSBvZgogIyB0aGUgUXRXZWJLaXQgbGlicmFyeSwgYW5kIHdpbGwgZW5kIHVwIGluIHRoZSBsaWJy
YXJ5J3MgcHJsIGZpbGUuCiBRVF9BUElfREVQRU5EUyA9IGNvcmUgZ3VpIG5ldHdvcmsKLWJ1aWxk
Pyh3ZWJraXQxKTogUVRfQVBJX0RFUEVORFMgKz0gd2lkZ2V0cwogCiAjIFdlIHdhbnQgdGhlIFF0
V2ViS2l0IEFQSSBmb3J3YXJkaW5nIGluY2x1ZGVzIHRvIGxpdmUgaW4gdGhlIHJvb3QgYnVpbGQg
ZGlyLgogTU9EVUxFX0JBU0VfRElSID0gJCRfUFJPX0ZJTEVfUFdEXwpkaWZmIC0tZ2l0IGEvU291
cmNlL3N5bmMucHJvZmlsZSBiL1NvdXJjZS9zeW5jLnByb2ZpbGUKaW5kZXggODYwMzE0MjVlN2Zk
MDJlOGUwN2Q2NjJkODI5YTA0Y2FhNDhjNzA0Ny4uMjA4MzVmNGZhNmUyMTU5NGY4NzA5YzExYzBi
MDFjYzNhMmJmNWE1NSAxMDA2NDQKLS0tIGEvU291cmNlL3N5bmMucHJvZmlsZQorKysgYi9Tb3Vy
Y2Uvc3luYy5wcm9maWxlCkBAIC0xLDggKzEsMTAgQEAKICVtb2R1bGVzID0gKCAjIHBhdGggdG8g
bW9kdWxlIG5hbWUgbWFwCisgICAgIlF0V2ViS2l0IiA9PiAiJGJhc2VkaXIiLAogICAgICJRdFdl
YktpdFdpZGdldHMiID0+ICIkYmFzZWRpciIKICk7CiAlbW9kdWxlaGVhZGVycyA9ICggIyByZXN0
cmljdCB0aGUgbW9kdWxlIGhlYWRlcnMgdG8gdGhvc2UgZm91bmQgaW4gcmVsYXRpdmUgcGF0aAot
ICAgICJRdFdlYktpdFdpZGdldHMiID0+ICJXZWJLaXQvcXQvQXBpO1dlYktpdDIvVUlQcm9jZXNz
L0FQSS9xdCIsCisgICAgIlF0V2ViS2l0IiA9PiAiV2ViS2l0L3F0L0FwaTtXZWJLaXQyL1VJUHJv
Y2Vzcy9BUEkvcXQiLAorICAgICJRdFdlYktpdFdpZGdldHMiID0+ICJXZWJLaXQvcXQvV2lkZ2V0
QXBpIiwKICk7CiAlY2xhc3NuYW1lcyA9ICgKICk7CmRpZmYgLS1naXQgYS9Ub29scy9EdW1wUmVu
ZGVyVHJlZS9xdC9EdW1wUmVuZGVyVHJlZS5wcm8gYi9Ub29scy9EdW1wUmVuZGVyVHJlZS9xdC9E
dW1wUmVuZGVyVHJlZS5wcm8KaW5kZXggMGJkMGIxNmE2N2NhYmQ5ZTVjMzMzMGU4Y2VjNWY4OTZj
ODU5NDc1ZS4uZmY2OTZkMzk4YmM3ODBlOGFjNmE3Yzk3MzU2OTdmNTBiZDdkZmVmNiAxMDA2NDQK
LS0tIGEvVG9vbHMvRHVtcFJlbmRlclRyZWUvcXQvRHVtcFJlbmRlclRyZWUucHJvCisrKyBiL1Rv
b2xzL0R1bXBSZW5kZXJUcmVlL3F0L0R1bXBSZW5kZXJUcmVlLnBybwpAQCAtMTYsNiArMTYsNyBA
QCBJTkNMVURFUEFUSCArPSBcCiAgICAgJCRQV0QvLi4gXAogICAgICQke1JPT1RfV0VCS0lUX0RJ
Un0vU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vcXQgXAogICAgICQke1JPT1RfV0VCS0lUX0RJUn0v
U291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydCBcCisgICAgJCR7Uk9PVF9XRUJLSVRfRElS
fS9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldFN1cHBvcnQgXAogICAgICQke1JPT1RfV0VCS0lUX0RJ
Un0vU291cmNlL1dURgogCiBRVCA9IGNvcmUgZ3VpIG5ldHdvcmsgdGVzdGxpYiB3ZWJraXR3aWRn
ZXRzIHdpZGdldHMKZGlmZiAtLWdpdCBhL1Rvb2xzL0R1bXBSZW5kZXJUcmVlL3F0L0R1bXBSZW5k
ZXJUcmVlUXQuY3BwIGIvVG9vbHMvRHVtcFJlbmRlclRyZWUvcXQvRHVtcFJlbmRlclRyZWVRdC5j
cHAKaW5kZXggODhkOGFlNzUyZGUzZjdjZDZmMDEyOGU5MTRjYmU0Nzc1MjY0MGM0MC4uZGVhMGVk
YmMwM2MyOTcwOGE5ZDBkYTlmMGYzZTM1YmJjNDI0NmFlMCAxMDA3NTUKLS0tIGEvVG9vbHMvRHVt
cFJlbmRlclRyZWUvcXQvRHVtcFJlbmRlclRyZWVRdC5jcHAKKysrIGIvVG9vbHMvRHVtcFJlbmRl
clRyZWUvcXQvRHVtcFJlbmRlclRyZWVRdC5jcHAKQEAgLTkxNSw3ICs5MTUsNyBAQCB2b2lkIER1
bXBSZW5kZXJUcmVlOjpkdW1wKCkKICAgICBpZiAobV9jb250cm9sbGVyLT5zaG91bGREdW1wQXNU
ZXh0KCkpCiAgICAgICAgIHJlc3VsdFN0cmluZyA9IGR1bXBGcmFtZXNBc1RleHQobWFpbkZyYW1l
KTsKICAgICBlbHNlIHsKLSAgICAgICAgcmVzdWx0U3RyaW5nID0gbWFpbkZyYW1lLT5yZW5kZXJU
cmVlRHVtcCgpOworICAgICAgICByZXN1bHRTdHJpbmcgPSBEdW1wUmVuZGVyVHJlZVN1cHBvcnRR
dDo6ZnJhbWVSZW5kZXJUcmVlRHVtcChtYWluRnJhbWUtPmhhbmRsZSgpKTsKICAgICAgICAgcmVz
dWx0U3RyaW5nICs9IGR1bXBGcmFtZVNjcm9sbFBvc2l0aW9uKG1haW5GcmFtZSk7CiAgICAgfQog
ICAgIGlmICghcmVzdWx0U3RyaW5nLmlzRW1wdHkoKSkgewpkaWZmIC0tZ2l0IGEvVG9vbHMvTWlu
aUJyb3dzZXIvcXQvTWluaUJyb3dzZXIucHJvIGIvVG9vbHMvTWluaUJyb3dzZXIvcXQvTWluaUJy
b3dzZXIucHJvCmluZGV4IDBmYmRkYmUxMzMzMDAzMmE3MGNkYmY2NWQzNDNlMmEyZDA4ZTVjMzIu
LjNkYjFjNzg4N2M0MjlmMDNhNWIzNjkwMWVlYmZjZGJlNmJiNTFhNjggMTAwNjQ0Ci0tLSBhL1Rv
b2xzL01pbmlCcm93c2VyL3F0L01pbmlCcm93c2VyLnBybworKysgYi9Ub29scy9NaW5pQnJvd3Nl
ci9xdC9NaW5pQnJvd3Nlci5wcm8KQEAgLTMwLDcgKzMwLDcgQEAgREVTVERJUiA9ICQke1JPT1Rf
QlVJTERfRElSfS9iaW4KIAogaGF2ZT8oRk9OVENPTkZJRyk6IFBLR0NPTkZJRyArPSBmb250Y29u
ZmlnCiAKLVFUICs9IG5ldHdvcmsgZ3VpLXByaXZhdGUgcXVpY2sgcXVpY2stcHJpdmF0ZSB3ZWJr
aXR3aWRnZXRzIHdlYmtpdHdpZGdldHMtcHJpdmF0ZQorUVQgKz0gbmV0d29yayBndWktcHJpdmF0
ZSBxdWljayBxdWljay1wcml2YXRlIHdlYmtpdCB3ZWJraXQtcHJpdmF0ZQogbWFjeDogUVQgKz0g
eG1sCiAKIFJFU09VUkNFUyArPSBNaW5pQnJvd3Nlci5xcmMKZGlmZiAtLWdpdCBhL1Rvb2xzL1dl
YktpdFRlc3RSdW5uZXIvSW5qZWN0ZWRCdW5kbGUvVGFyZ2V0LnByaSBiL1Rvb2xzL1dlYktpdFRl
c3RSdW5uZXIvSW5qZWN0ZWRCdW5kbGUvVGFyZ2V0LnByaQppbmRleCBkNzMwNWUzYWNlMjFkOTA5
NTA2ZjY5YzMzZmU4MDkyZTIwNDQwZTY4Li5iMDA5MTE5NGE2NzVjYTNhNmEzYzVlOTlkZjc1NDdj
YTFmMGJhYjU5IDEwMDY0NAotLS0gYS9Ub29scy9XZWJLaXRUZXN0UnVubmVyL0luamVjdGVkQnVu
ZGxlL1RhcmdldC5wcmkKKysrIGIvVG9vbHMvV2ViS2l0VGVzdFJ1bm5lci9JbmplY3RlZEJ1bmRs
ZS9UYXJnZXQucHJpCkBAIC00OCw3ICs0OCw3IEBAIEhFQURFUlMgKz0gXAogCiBERVNURElSID0g
JCR7Uk9PVF9CVUlMRF9ESVJ9L2xpYgogCi1RVCArPSB3aWRnZXRzIHdlYmtpdHdpZGdldHMKK1FU
ICs9IHdpZGdldHMgd2Via2l0CiAKIFdFQktJVCArPSB3dGYgamF2YXNjcmlwdGNvcmUgd2ViY29y
ZQogCmRpZmYgLS1naXQgYS9Ub29scy9xbWFrZS9ta3NwZWNzL2ZlYXR1cmVzL2RlZmF1bHRfcG9z
dC5wcmYgYi9Ub29scy9xbWFrZS9ta3NwZWNzL2ZlYXR1cmVzL2RlZmF1bHRfcG9zdC5wcmYKaW5k
ZXggZGM1ZTQzOGMxYzI5ZmQ0MDA4NTgzYTk3NjUwODQ1MDY0OWM4N2RlNS4uN2M5MzliYzk0NTBj
MWZlNDk3ZTM0ZDBjNDJjNDYyYmU1YWI5MjNhNyAxMDA2NDQKLS0tIGEvVG9vbHMvcW1ha2UvbWtz
cGVjcy9mZWF0dXJlcy9kZWZhdWx0X3Bvc3QucHJmCisrKyBiL1Rvb2xzL3FtYWtlL21rc3BlY3Mv
ZmVhdHVyZXMvZGVmYXVsdF9wb3N0LnByZgpAQCAtMTU2LDcgKzE1Niw3IEBAIGNvbnRhaW5zKFRF
TVBMQVRFLCBsaWIpIHsKICAgICBERUZJTkVTICs9IEJVSUxESU5HXyQke1RBUkdFVH0KIAogICAg
ICMgVHJpZ2dlcnMgdGhlIHJpZ2h0IGV4cG9ydCBtYWNybyBmb3IgdGhlIFF0V2ViS2l0IEFQSSAo
c2VlIHF3ZWJraXRnbG9iYWwuaCkKLSAgICAhY29udGFpbnMoUVQsIHdlYmtpdHdpZGdldHMpOiBE
RUZJTkVTICs9IEJVSUxESU5HX1dFQktJVAorICAgICFjb250YWlucyhRVCwgd2Via2l0KXxlcXVh
bHMoTU9EVUxFLCB3ZWJraXR3aWRnZXRzKTogREVGSU5FUyArPSBCVUlMRElOR19XRUJLSVQKIAog
ICAgICMgUHJldmVudCBuYW1lIGNsYXNoZXMgd2hlbiBidWlsZGluZyBib3RoIGRlYnVnIGFuZCBy
ZWxlYXNlLiBRdDUncyBtb2R1bGUKICAgICAjIHN5c3RlbSBhbHJlYWR5IHRha2VzIGNhcmUgb2Yg
dGhpcyBmb3IgdGhlIHRvcCBsZXZlbCBRdFdlYktpdCBsaWJyYXJ5LgpAQCAtMTcyLDEyICsxNzIs
MTIgQEAgY29udGFpbnMoVEVNUExBVEUsIGxpYikgewogICAgIH0KIH0KIAotY29udGFpbnMoUVQs
IHdlYmtpdHdpZGdldHMpIHsKK2NvbnRhaW5zKFFULCB3ZWJraXQpfGNvbnRhaW5zKFFULCB3ZWJr
aXR3aWRnZXRzKSB7CiAgICAgIyBJbiBhZGRpdGlvbiB0byB0aGUgbWFpbiBzaGFyZWQgUXRXZWJL
aXQgbGlicmFyeSB3ZSBhbHNvCiAgICAgIyBuZWVkIHRvIGxpbmsgdG8gYW55IGludGVybWVkaWF0
ZSBzaGFyZWQgbGlicmFyaWVzLgogICAgIGZvcmNlX3N0YXRpY19saWJzX2FzX3NoYXJlZCB7CiAg
ICAgICAgIFdFQktJVCArPSB3dGYgamF2YXNjcmlwdGNvcmUgd2ViY29yZQotICAgICAgICBidWls
ZD8od2Via2l0MSk6IFdFQktJVCArPSB3ZWJraXR3aWRnZXRzIHdlYmtpdDEKKyAgICAgICAgYnVp
bGQ/KHdlYmtpdDEpOiBXRUJLSVQgKz0gd2Via2l0MQogICAgICAgICBidWlsZD8od2Via2l0Mik6
IFdFQktJVCArPSB3ZWJraXQyCiAgICAgfQogCkBAIC0xOTMsMTIgKzE5MywxMiBAQCBkZWZpbmVU
ZXN0KG5lZWRUb0xpbmspIHsKICAgICAgICAgY29udGFpbnMobGlicmFyaWVzLCAkJFRBUkdFVCk6
IHJldHVybih0cnVlKQogCiAgICAgICAgICMgT3IgYW55dGhpbmcgdGhhdCB1c2VzIFF0V2ViS2l0
IGluIHRoaXMgc3BlY2lhbCBjb25maWcKLSAgICAgICAgY29udGFpbnMoUVQsIHdlYmtpdHdpZGdl
dHMpOiByZXR1cm4odHJ1ZSkKKyAgICAgICAgY29udGFpbnMoUVQsIHdlYmtpdCk6IHJldHVybih0
cnVlKQogICAgIH0KIAogICAgICMgTGFzdGx5LCB3ZSBhbGxvdyBhcHBzIChqc2MpIHRvIGxpbmsg
ZGlyZWN0bHkgdG8gdGhlIGludGVybWVkaWF0ZQogICAgICMgbGlicmFyaWVzIGludGVhZCBvZiB1
c2luZyB0aGUgZXhwb3J0ZWQgc3ltYm9scyBmcm9tIFF0V2ViS2l0LgotICAgIGNvbnRhaW5zKFRF
TVBMQVRFLCBhcHApOiFjb250YWlucyhRVCwgd2Via2l0d2lkZ2V0cyk6IHJldHVybih0cnVlKQor
ICAgIGNvbnRhaW5zKFRFTVBMQVRFLCBhcHApOiFjb250YWlucyhRVCwgd2Via2l0KTohY29udGFp
bnMoUVQsIHdlYmtpdHdpZGdldHMpOiByZXR1cm4odHJ1ZSkKIAogICAgICMgQW55dGhpbmcgZWxz
ZSBzaG91bGQganVzdCBnZXQgaW5jbHVkZSBwYXRocywgZXRjLCBub3QgbGluawogICAgIHJldHVy
bihmYWxzZSkKZGlmZiAtLWdpdCBhL1Rvb2xzL3FtYWtlL21rc3BlY3MvZmVhdHVyZXMvd2Via2l0
X21vZHVsZXMucHJmIGIvVG9vbHMvcW1ha2UvbWtzcGVjcy9mZWF0dXJlcy93ZWJraXRfbW9kdWxl
cy5wcmYKaW5kZXggNTA1YjgyNjU4ZTIxOGQ2MjY2MGZkMjgxYmY1NmFlOWIxNzY5MzBhMy4uMTg5
Mzg3ODM1MjcwYzczZTU2OTc0MTZhNzkwN2IyNDBhNTNmYWJiOCAxMDA2NDQKLS0tIGEvVG9vbHMv
cW1ha2UvbWtzcGVjcy9mZWF0dXJlcy93ZWJraXRfbW9kdWxlcy5wcmYKKysrIGIvVG9vbHMvcW1h
a2UvbWtzcGVjcy9mZWF0dXJlcy93ZWJraXRfbW9kdWxlcy5wcmYKQEAgLTcsNyArNyw3IEBACiAK
ICMgUmVvcmRlciBsaWJyYXJpZXMgc28gdGhhdCB0aGUgbGluayBhbmQgaW5jbHVkZSBvcmRlciBp
cyBjb3JyZWN0LAogIyBhbmQgbWFrZSBzdXJlIHRoZSBjYXNlIG1hdGNoZXMgdGhlIG9yaWdpbmFs
IGNhc2UuCi1saWJyYXJpZXMgPSBXZWJLaXRXaWRnZXRzIFdlYktpdDEgV2ViS2l0MiBXZWJDb3Jl
IEFOR0xFIEphdmFTY3JpcHRDb3JlIFdURgorbGlicmFyaWVzID0gV2ViS2l0MSBXZWJLaXQyIFdl
YkNvcmUgQU5HTEUgSmF2YVNjcmlwdENvcmUgV1RGCiBmb3IobGlicmFyeSwgbGlicmFyaWVzKSB7
CiAgICAgY29udGFpbnMoV0VCS0lULCAkJGxvd2VyKCQkbGlicmFyeSkpIHsKICAgICAgICAgV0VC
S0lUIC09ICQkbG93ZXIoJCRsaWJyYXJ5KQpAQCAtMzQsMTEgKzM0LDkgQEAgZm9yKGxpYnJhcnks
IFdFQktJVCkgewogCiAgICAgIyBBbnl0aGluZyBub3QgbGlua2luZyBkeW5hbWljYWxseSB0byBR
dFdlYktpdCBzaG91bGQgbWFrZSBzdXJlIHRvIGhhdmUgaXRzIGV4cG9ydAogICAgICMgbWFjcm9z
IHN5bmNocm9uaXplZCB3aXRoIHRoZSBjb2RlIHRoYXQgaXQgd2lsbCBiZSBsaW5rZWQgd2l0aCBz
dGF0aWNhbGx5LgotICAgICFjb250YWlucyhRVCwgd2Via2l0d2lkZ2V0cyk6IERFRklORVMgKz0g
U1RBVElDQUxMWV9MSU5LRURfV0lUSF8kJGxpYnJhcnkKKyAgICAhY29udGFpbnMoUVQsIHdlYmtp
dCk6IERFRklORVMgKz0gU1RBVElDQUxMWV9MSU5LRURfV0lUSF8kJGxpYnJhcnkKIH0KIAotIWlz
RW1wdHkoTU9EVUxFKTogQ09ORklHICs9IGNyZWF0aW5nX21vZHVsZQotCiBjcmVhdGluZ19tb2R1
bGUgewogICAgICMgU2FuaXRpemUgUEtHQ09ORklHIGFzIHdlIGRvbid0IHdhbnQgYW55IG9mIHRo
ZXNlIGxpYnJhcmllcwogICAgICMgdG8gZW5kIHVwIGluIGFzIHB1YmxpYyBBUEkgZGVwZW5kZW5p
Y2VzIGluIHRoZSBRdFdlYktpdCBwcmwgZmlsZS4KZGlmZiAtLWdpdCBhL1Rvb2xzL3FtYWtlL21r
c3BlY3MvbW9kdWxlcy93ZWJraXR3aWRnZXRzLnByZiBiL1Rvb2xzL3FtYWtlL21rc3BlY3MvbW9k
dWxlcy93ZWJraXR3aWRnZXRzLnByZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Ex
NjQzYzhkZjAwMTBkZmFkMjc1YTM0ZDNiNjE4YjlhZmZiZDFkYy4uMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Ub29scy9xbWFrZS9ta3NwZWNzL21vZHVsZXMv
d2Via2l0d2lkZ2V0cy5wcmYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLSMgLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLQotIyBNb2R1bGUgZmlsZSBmb3IgV2ViS2l0V2lkZ2V0LCB1c2VkIGJ5IHRhcmdldHMgdGhh
dCBkZXBlbmQgb24gV2ViS2l0V2lkZ2V0Ci0jCi0jIFNlZSAnVG9vbHMvcW1ha2UvUkVBRE1FJyBm
b3IgYW4gb3ZlcnZpZXcgb2YgdGhlIGJ1aWxkIHN5c3RlbQotIyAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVdFQktJ
VC53ZWJraXR3aWRnZXRzLnJvb3Rfc291cmNlX2RpciA9ICQke1JPT1RfV0VCS0lUX0RJUn0vU291
cmNlL1dlYktpdAotCi1pbmNsdWRlKCQke1dFQktJVC53ZWJraXR3aWRnZXRzLnJvb3Rfc291cmNl
X2Rpcn0vV2ViS2l0V2lkZ2V0cy5wcmkpCmRpZmYgLS1naXQgYS9XZWJLaXQucHJvIGIvV2ViS2l0
LnBybwppbmRleCBmYmE1Yjk5N2FjN2IzMjQxODZkZTc3NTk3MWUzZDNkMGI5YTFjMDQ2Li44NzZk
NTU0MTI2NjM4YjhhYmRhN2ZkZThlOTExNDZkMWM1N2VlZjZjIDEwMDY0NAotLS0gYS9XZWJLaXQu
cHJvCisrKyBiL1dlYktpdC5wcm8KQEAgLTMyLDEwICszMiw2IEBAIGJ1aWxkPyh3ZWJraXQxKSB7
CiAgICAgd2Via2l0MS5maWxlID0gU291cmNlL1dlYktpdC9XZWJLaXQxLnBybwogICAgIHdlYmtp
dDEubWFrZWZpbGUgPSBNYWtlZmlsZS5XZWJLaXQxCiAgICAgU1VCRElSUyArPSB3ZWJraXQxCi0K
LSAgICB3ZWJraXR3aWRnZXRzLmZpbGUgPSBTb3VyY2UvV2ViS2l0L1dlYktpdFdpZGdldHMucHJv
Ci0gICAgd2Via2l0d2lkZ2V0cy5tYWtlZmlsZSA9IE1ha2VmaWxlLldlYktpdFdpZGdldHMKLSAg
ICBTVUJESVJTICs9IHdlYmtpdHdpZGdldHMKIH0KIAogYnVpbGQ/KHdlYmtpdDIpIHsK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>176959</attachid>
            <date>2012-11-30 06:47:04 -0800</date>
            <delta_ts>2012-11-30 06:48:27 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-99314-20121130154557.patch</filename>
            <type>text/plain</type>
            <size>952770</size>
            <attacher name="Simon Hausmann">hausmann</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTM2MjM0CmRpZmYgLS1naXQgYS9Tb3VyY2UvUXRXZWJLaXQu
cHJvIGIvU291cmNlL1F0V2ViS2l0LnBybwppbmRleCA1OWY5YTBkODEzYzIwNWU4MmFmMDIxZTQ3
ZmY0MDg1MjYzMjUwZDNmLi4xOWQ1MmZjODBjMWQ0MDZmYmRiODc4MGM2MzllNTFjYjZiY2E1NTg1
IDEwMDY0NAotLS0gYS9Tb3VyY2UvUXRXZWJLaXQucHJvCisrKyBiL1NvdXJjZS9RdFdlYktpdC5w
cm8KQEAgLTEwLDYgKzEwLDExIEBAIENPTkZJRyArPSBvcmRlcmVkCiBhcGkuZmlsZSA9IGFwaS5w
cmkKIFNVQkRJUlMgKz0gYXBpCiAKK2J1aWxkPyh3ZWJraXQxKSB7CisgICAgd2Via2l0d2lkZ2V0
cy5maWxlID0gd2lkZ2V0c2FwaS5wcmkKKyAgICBTVUJESVJTICs9IHdlYmtpdHdpZGdldHMKK30K
KwogYnVpbGQ/KHdlYmtpdDIpIHsKICAgICB3ZWJwcm9jZXNzLmZpbGUgPSBXZWJLaXQyL1dlYlBy
b2Nlc3MucHJvCiAgICAgU1VCRElSUyArPSB3ZWJwcm9jZXNzCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V1RGL3d0Zi90ZXh0L1dURlN0cmluZy5oIGIvU291cmNlL1dURi93dGYvdGV4dC9XVEZTdHJpbmcu
aAppbmRleCAwMDY2MjU3YzYzNWE0NTM0ZGQ0YTllNThjYmM3YmQ0NWZkYWRmYmRkLi4zYTkxNWIx
M2EyYjJiZmJkZTYxOTI2ZmJiYjU2ZjQwNTBhZTM2ZmZjIDEwMDY0NAotLS0gYS9Tb3VyY2UvV1RG
L3d0Zi90ZXh0L1dURlN0cmluZy5oCisrKyBiL1NvdXJjZS9XVEYvd3RmL3RleHQvV1RGU3RyaW5n
LmgKQEAgLTQxNiw5ICs0MTYsOSBAQCBwdWJsaWM6CiAjZW5kaWYKIAogI2lmIFBMQVRGT1JNKFFU
KQotICAgIFN0cmluZyhjb25zdCBRU3RyaW5nJik7Ci0gICAgU3RyaW5nKGNvbnN0IFFTdHJpbmdS
ZWYmKTsKLSAgICBvcGVyYXRvciBRU3RyaW5nKCkgY29uc3Q7CisgICAgV1RGX0VYUE9SVF9TVFJJ
TkdfQVBJIFN0cmluZyhjb25zdCBRU3RyaW5nJik7CisgICAgV1RGX0VYUE9SVF9TVFJJTkdfQVBJ
IFN0cmluZyhjb25zdCBRU3RyaW5nUmVmJik7CisgICAgV1RGX0VYUE9SVF9TVFJJTkdfQVBJIG9w
ZXJhdG9yIFFTdHJpbmcoKSBjb25zdDsKICNlbmRpZgogCiAjaWYgUExBVEZPUk0oV1gpCmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9UYXJnZXQucHJpIGIvU291cmNlL1dlYkNvcmUvVGFyZ2V0
LnByaQppbmRleCA0OGExMDE0ZDQ2NmY1NmEyOWM5ZDI3MDU2M2I1Mzk3MDQzMGUwM2Q0Li40NTM1
YTQ2YmY3OWVhNjM1YzY2N2JmOGI3YzM1ZjEzZjE3ZmMyNDA1IDEwMDY0NAotLS0gYS9Tb3VyY2Uv
V2ViQ29yZS9UYXJnZXQucHJpCisrKyBiL1NvdXJjZS9XZWJDb3JlL1RhcmdldC5wcmkKQEAgLTI4
NTcsNyArMjg1Nyw2IEBAIFNPVVJDRVMgKz0gXAogICAgIHBsYXRmb3JtL3F0L1Bhc3RlYm9hcmRR
dC5jcHAgXAogICAgIHBsYXRmb3JtL3F0L1BsYXRmb3JtS2V5Ym9hcmRFdmVudFF0LmNwcCBcCiAg
ICAgcGxhdGZvcm0vcXQvUGxhdGZvcm1TY3JlZW5RdC5jcHAgXAotICAgIHBsYXRmb3JtL3F0L1FT
dHlsZUZhY2FkZS5jcHAgXAogICAgIHBsYXRmb3JtL3F0L1JlbmRlclRoZW1lUVN0eWxlLmNwcCBc
CiAgICAgcGxhdGZvcm0vcXQvUmVuZGVyVGhlbWVRdC5jcHAgXAogICAgIHBsYXRmb3JtL3F0L1Jl
bmRlclRoZW1lUXRNb2JpbGUuY3BwIFwKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL3F0L1FTdHlsZUZhY2FkZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9xdC9RU3R5
bGVGYWNhZGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzA3YTJmYzE1MmZm
MTZkMjdiZGU2ZDc2YTRiNWZkYWZkZjQxMGQ0Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3F0L1FTdHlsZUZhY2Fk
ZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGlz
IHBhcnQgb2YgdGhlIHRoZW1lIGltcGxlbWVudGF0aW9uIGZvciBmb3JtIGNvbnRyb2xzIGluIFdl
YkNvcmUuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDEyIERpZ2lhIFBsYyBhbmQvb3IgaXRzIHN1
YnNpZGlhcnkoLWllcykuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiBOb2tpYSBDb3Jwb3Jh
dGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykuCi0gKgotICogVGhpcyBsaWJyYXJ5IGlz
IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5
IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAq
IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVp
dGhlcgotICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFu
eSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0
aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJB
TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJ
TElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0g
KiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0g
KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5l
cmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBm
aWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwotICogdGhlIEZyZWUgU29mdHdhcmUg
Rm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKLSAqIEJv
c3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgotICoKLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgi
Ci0jaW5jbHVkZSAiUVN0eWxlRmFjYWRlLmgiCi0KLSNpbmNsdWRlICJRV2ViUGFnZUNsaWVudC5o
IgotI2luY2x1ZGUgPENocm9tZS5oPgotI2luY2x1ZGUgPENocm9tZUNsaWVudC5oPgotI2luY2x1
ZGUgPFBhZ2UuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotCi1RU3R5bGUqIFFTdHlsZUZhY2Fk
ZTo6c3R5bGVGb3JQYWdlKFBhZ2UqIHBhZ2UpCi17Ci0gICAgaWYgKCFwYWdlKQotICAgICAgICBy
ZXR1cm4gMDsKLSAgICBRV2ViUGFnZUNsaWVudCogcGFnZUNsaWVudCA9IHBhZ2UtPmNocm9tZSgp
LT5jbGllbnQoKS0+cGxhdGZvcm1QYWdlQ2xpZW50KCk7Ci0KLSAgICBpZiAoIXBhZ2VDbGllbnQp
Ci0gICAgICAgIHJldHVybiAwOwotCi0gICAgcmV0dXJuIHBhZ2VDbGllbnQtPnN0eWxlKCk7Ci19
Ci0KLX0KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3F0L1FTdHlsZUZhY2Fk
ZS5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vcXQvUVN0eWxlRmFjYWRlLmgKaW5kZXggNzNl
ODM2MmIxMmVkNTlmMGY0MWQwMTJkMTllYzQxNmQ2MjRiMThiYi4uZDNjYjQzMTY2ZTViYTUxMmRi
OTM3Nzk2YjgyMjYzZWY5MTFkZmI0MiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vcXQvUVN0eWxlRmFjYWRlLmgKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vcXQvUVN0
eWxlRmFjYWRlLmgKQEAgLTE1NSw4ICsxNTUsNiBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCBRT2Jq
ZWN0KiB3aWRnZXRGb3JQYWludGVyKFFQYWludGVyKikgPSAwOwogCiAgICAgdmlydHVhbCBib29s
IGlzVmFsaWQoKSBjb25zdCA9IDA7Ci0KLSAgICBzdGF0aWMgUVN0eWxlKiBzdHlsZUZvclBhZ2Uo
UGFnZSopOwogfTsKIAogUV9ERUNMQVJFX09QRVJBVE9SU19GT1JfRkxBR1MoUVN0eWxlRmFjYWRl
OjpTdGF0ZSkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL3F0L1FXZWJQYWdl
Q2xpZW50LmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9xdC9RV2ViUGFnZUNsaWVudC5oCmlu
ZGV4IGFlM2ZiNGUyZmEwZGIyNGJkM2U0YmVhYzIxOGEyMTk2MDJiZGU3MWMuLjE1MjZlOWQyMGE3
YzlhY2I0ZWIwYzMzMzdhNzRjYmE5YWEyMjM1ZGUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL3F0L1FXZWJQYWdlQ2xpZW50LmgKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vcXQvUVdlYlBhZ2VDbGllbnQuaApAQCAtNTgsMTcgKzU4LDEwIEBAIHB1YmxpYzoKIAogICAg
IHZpcnR1YWwgdm9pZCBzY3JvbGwoaW50IGR4LCBpbnQgZHksIGNvbnN0IFFSZWN0JikgPSAwOwog
ICAgIHZpcnR1YWwgdm9pZCB1cGRhdGUoY29uc3QgUVJlY3QmKSA9IDA7CisgICAgdmlydHVhbCB2
b2lkIHJlcGFpbnRWaWV3cG9ydCgpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgc2V0SW5wdXRNZXRo
b2RFbmFibGVkKGJvb2wgZW5hYmxlKSA9IDA7CiAgICAgdmlydHVhbCBib29sIGlucHV0TWV0aG9k
RW5hYmxlZCgpIGNvbnN0ID0gMDsKLSNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCi0g
ICAgdmlydHVhbCB2b2lkIHNldFJvb3RHcmFwaGljc0xheWVyKFdlYkNvcmU6OkdyYXBoaWNzTGF5
ZXIqIGxheWVyKSB7IH0KLQotICAgIC8vIHRoaXMgZ2V0cyBjYWxsZWQgd2hlbiB0aGUgY29tcG9z
aXRvciB3YW50cyB1cyB0byBzeW5jIHRoZSBsYXllcnMKLSAgICAvLyBpZiBzY2hlZHVsZVN5bmMg
aXMgdHJ1ZSwgd2Ugc2NoZWR1bGUgYSBzeW5jIG91cnNlbHZlcy4gb3RoZXJ3aXNlLAotICAgIC8v
IHdlIHdhaXQgZm9yIHRoZSBuZXh0IHVwZGF0ZSBhbmQgc3luYyB0aGUgbGF5ZXJzIHRoZW4uCi0g
ICAgdmlydHVhbCB2b2lkIG1hcmtGb3JTeW5jKGJvb2wgc2NoZWR1bGVTeW5jID0gZmFsc2UpIHt9
Ci0gICAgdmlydHVhbCBib29sIGFsbG93c0FjY2VsZXJhdGVkQ29tcG9zaXRpbmcoKSBjb25zdCB7
IHJldHVybiBmYWxzZTsgfQotI2VuZGlmCisgICAgdmlydHVhbCBib29sIG1ha2VPcGVuR0xDb250
ZXh0Q3VycmVudElmQXZhaWxhYmxlKCkgeyByZXR1cm4gZmFsc2U7IH0KIAogICAgIHZpcnR1YWwg
dm9pZCBzZXRJbnB1dE1ldGhvZEhpbnRzKFF0OjpJbnB1dE1ldGhvZEhpbnRzIGhpbnQpID0gMDsK
IApAQCAtMTA2LDExICs5OSw2IEBAIHB1YmxpYzoKIAogICAgIHZpcnR1YWwgdm9pZCBzZXRXaWRn
ZXRWaXNpYmxlKFdlYkNvcmU6OldpZGdldCosIGJvb2wgdmlzaWJsZSkgPSAwOwogCi0jaWYgVVNF
KDNEX0dSQVBISUNTKQotICAgIHZpcnR1YWwgdm9pZCBjcmVhdGVQbGF0Zm9ybUdyYXBoaWNzQ29u
dGV4dDNEKFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0M0QqLAotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYXRmb3JtR3JhcGhpY3NTdXJmYWNlM0QqLAot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFPYmplY3Qq
KiA9IDApID0gMDsKLSNlbmRpZgogICAgIHZpcnR1YWwgUVdpbmRvdyogb3duZXJXaW5kb3coKSBj
b25zdDsKIAogcHJvdGVjdGVkOgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9XZWJLaXQxLnBy
byBiL1NvdXJjZS9XZWJLaXQvV2ViS2l0MS5wcm8KaW5kZXggZmVlOTllODg1MWJmZmQ2MTE4Y2Y0
Y2FhMGYyMjZiMTJkYjRiNzQ3Ny4uZWE4NTRlNmM4ZGE0OGFkOWE4M2Y5NjEyYjNkMDNjYTAwMTdi
NzJiMyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9XZWJLaXQxLnBybworKysgYi9Tb3VyY2Uv
V2ViS2l0L1dlYktpdDEucHJvCkBAIC0yMCw2ICsyMCw4IEBAIFNPVVJDRVMgKz0gXAogICAgICQk
UFdEL3F0L0FwaS9xd2ViZWxlbWVudC5jcHAgXAogICAgICQkUFdEL3F0L0FwaS9xd2ViaGlzdG9y
eS5jcHAgXAogICAgICQkUFdEL3F0L0FwaS9xd2ViaGlzdG9yeWludGVyZmFjZS5jcHAgXAorICAg
ICQkUFdEL3F0L0FwaS9xd2Via2l0Z2xvYmFsLmNwcCBcCisgICAgJCRQV0QvcXQvQXBpL3F3ZWJw
bHVnaW5kYXRhYmFzZS5jcHAgXAogICAgICQkUFdEL3F0L0FwaS9xd2VicGx1Z2luZmFjdG9yeS5j
cHAgXAogICAgICQkUFdEL3F0L0FwaS9xd2Vic2VjdXJpdHlvcmlnaW4uY3BwIFwKICAgICAkJFBX
RC9xdC9BcGkvcXdlYnNldHRpbmdzLmNwcCBcCkBAIC0zOSwxMCArNDEsMTMgQEAgU09VUkNFUyAr
PSBcCiAgICAgJCRQV0QvcXQvV2ViQ29yZVN1cHBvcnQvUGxhdGZvcm1TdHJhdGVnaWVzUXQuY3Bw
IFwKICAgICAkJFBXRC9xdC9XZWJDb3JlU3VwcG9ydC9Qb3B1cE1lbnVRdC5jcHAgXAogICAgICQk
UFdEL3F0L1dlYkNvcmVTdXBwb3J0L1F0UGxhdGZvcm1QbHVnaW4uY3BwIFwKKyAgICAkJFBXRC9x
dC9XZWJDb3JlU3VwcG9ydC9RdFBsdWdpbldpZGdldEFkYXB0ZXIuY3BwIFwKKyAgICAkJFBXRC9x
dC9XZWJDb3JlU3VwcG9ydC9RdFByaW50Q29udGV4dC5jcHAgXAogICAgICQkUFdEL3F0L1dlYkNv
cmVTdXBwb3J0L1FXZWJGcmFtZUFkYXB0ZXIuY3BwIFwKICAgICAkJFBXRC9xdC9XZWJDb3JlU3Vw
cG9ydC9RV2ViUGFnZUFkYXB0ZXIuY3BwIFwKICAgICAkJFBXRC9xdC9XZWJDb3JlU3VwcG9ydC9T
ZWFyY2hQb3B1cE1lbnVRdC5jcHAgXAogICAgICQkUFdEL3F0L1dlYkNvcmVTdXBwb3J0L1RleHRD
aGVja2VyQ2xpZW50UXQuY3BwIFwKKyAgICAkJFBXRC9xdC9XZWJDb3JlU3VwcG9ydC9UZXh0dXJl
TWFwcGVyTGF5ZXJDbGllbnRRdC5jcHAgXAogICAgICQkUFdEL3F0L1dlYkNvcmVTdXBwb3J0L1Vu
ZG9TdGVwUXQuY3BwIFwKICAgICAkJFBXRC9xdC9XZWJDb3JlU3VwcG9ydC9XZWJFdmVudENvbnZl
cnNpb24uY3BwCiAKQEAgLTU0LDEwICs1OSwxMiBAQCBIRUFERVJTICs9IFwKICAgICAkJFBXRC9x
dC9BcGkvcXdlYmhpc3RvcnkuaCBcCiAgICAgJCRQV0QvcXQvQXBpL3F3ZWJoaXN0b3J5X3AuaCBc
CiAgICAgJCRQV0QvcXQvQXBpL3F3ZWJoaXN0b3J5aW50ZXJmYWNlLmggXAorICAgICQkUFdEL3F0
L0FwaS9xd2VicGx1Z2luZGF0YWJhc2VfcC5oIFwKICAgICAkJFBXRC9xdC9BcGkvcXdlYnBsdWdp
bmZhY3RvcnkuaCBcCiAgICAgJCRQV0QvcXQvQXBpL3F3ZWJzZWN1cml0eW9yaWdpbi5oIFwKICAg
ICAkJFBXRC9xdC9BcGkvcXdlYnNldHRpbmdzLmggXAogICAgICQkUFdEL3F0L0FwaS9xd2Vic2Ny
aXB0d29ybGRfcC5oIFwKKyAgICAkJFBXRC9xdC9BcGkvcXdlYmtpdHBsYXRmb3JtcGx1Z2luLmgg
XAogICAgICQkUFdEL3F0L1dlYkNvcmVTdXBwb3J0L0Nocm9tZUNsaWVudFF0LmggXAogICAgICQk
UFdEL3F0L1dlYkNvcmVTdXBwb3J0L0NvbnRleHRNZW51Q2xpZW50UXQuaCBcCiAgICAgJCRQV0Qv
cXQvV2ViQ29yZVN1cHBvcnQvRHJhZ0NsaWVudFF0LmggXApAQCAtNzMsMTAgKzgwLDEyIEBAIEhF
QURFUlMgKz0gXAogICAgICQkUFdEL3F0L1dlYkNvcmVTdXBwb3J0L1BvcHVwTWVudVF0LmggXAog
ICAgICQkUFdEL3F0L1dlYkNvcmVTdXBwb3J0L1F0UGxhdGZvcm1QbHVnaW4uaCBcCiAgICAgJCRQ
V0QvcXQvV2ViQ29yZVN1cHBvcnQvUXRQbHVnaW5XaWRnZXRBZGFwdGVyLmggXAorICAgICQkUFdE
L3F0L1dlYkNvcmVTdXBwb3J0L1F0UHJpbnRDb250ZXh0LmggXAogICAgICQkUFdEL3F0L1dlYkNv
cmVTdXBwb3J0L1FXZWJGcmFtZUFkYXB0ZXIuaCBcCiAgICAgJCRQV0QvcXQvV2ViQ29yZVN1cHBv
cnQvUVdlYlBhZ2VBZGFwdGVyLmggXAogICAgICQkUFdEL3F0L1dlYkNvcmVTdXBwb3J0L1NlYXJj
aFBvcHVwTWVudVF0LmggXAogICAgICQkUFdEL3F0L1dlYkNvcmVTdXBwb3J0L1RleHRDaGVja2Vy
Q2xpZW50UXQuaCBcCisgICAgJCRQV0QvcXQvV2ViQ29yZVN1cHBvcnQvVGV4dHVyZU1hcHBlckxh
eWVyQ2xpZW50UXQuaCBcCiAgICAgJCRQV0QvcXQvV2ViQ29yZVN1cHBvcnQvVW5kb1N0ZXBRdC5o
IFwKICAgICAkJFBXRC9xdC9XZWJDb3JlU3VwcG9ydC9XZWJFdmVudENvbnZlcnNpb24uaAogCmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1dlYktpdFdpZGdldHMucHJpIGIvU291cmNlL1dlYktp
dC9XZWJLaXRXaWRnZXRzLnByaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRjNjE0
ODVmMjc4ODRlYWI0MjQ2YmY0ZDIyNjNhNzA0YmFhZTA3Yy4uMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L1dlYktpdFdpZGdldHMucHJp
CisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIFRoaXMgZmls
ZSBjb250YWlucyBzaGFyZWQgcnVsZXMgdXNlZCBib3RoIHdoZW4gYnVpbGRpbmcgV2ViS2l0V2lk
Z2V0cwotIyBpdHNlbGYsIGFuZCBieSB0YXJnZXRzIHRoYXQgdXNlIFdlYktpdFdpZGdldHMuCi0j
Ci0jIFNlZSAnVG9vbHMvcW1ha2UvUkVBRE1FJyBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIGJ1aWxk
IHN5c3RlbQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVNPVVJDRV9ESVIgPSAkJHtST09UX1dFQktJVF9ESVJ9
L1NvdXJjZS9XZWJLaXQKLQotSU5DTFVERVBBVEggKz0gXAotICAgICQkU09VUkNFX0RJUi9xdC9B
cGkgXAotICAgICQkU09VUkNFX0RJUi9xdC9XZWJDb3JlU3VwcG9ydCBcCi0gICAgJCRST09UX1dF
QktJVF9ESVIvU291cmNlL1dURi93dGYvcXQKLQotZW5hYmxlPyhERVZJQ0VfT1JJRU5UQVRJT04p
fGVuYWJsZT8oT1JJRU5UQVRJT05fRVZFTlRTKSB7Ci0gICAgUVQgKz0gc2Vuc29ycwotfQotCi1l
bmFibGU/KEdFT0xPQ0FUSU9OKTogUVQgKz0gbG9jYXRpb24KLQotdXNlPyhRVF9NVUxUSU1FRElB
KTogUVQgKj0gbXVsdGltZWRpYXdpZGdldHMKLQotY29udGFpbnMoQ09ORklHLCB0ZXhtYXApOiBE
RUZJTkVTICs9IFdURl9VU0VfVEVYVFVSRV9NQVBQRVI9MQotCi11c2U/KFBMVUdJTl9CQUNLRU5E
X1hMSUIpOiBQS0dDT05GSUcgKz0geDExCi0KLVFUICs9IG5ldHdvcmsgd2lkZ2V0cwotaGF2ZT8o
UVRRVUlDSyk6IFFUICs9IHF1aWNrCi1oYXZlPyhRVFBSSU5UU1VQUE9SVCk6IFFUICs9IHByaW50
c3VwcG9ydAotCi11c2U/KFRFWFRVUkVfTUFQUEVSX0dMKXxlbmFibGU/KFdFQkdMKSB7Ci0gICAg
UVQgKj0gb3BlbmdsCi19CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1dlYktpdFdpZGdldHMu
cHJvIGIvU291cmNlL1dlYktpdC9XZWJLaXRXaWRnZXRzLnBybwpkZWxldGVkIGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggNWNhNzU0MTkyYjc0MjBmOThmY2ViMmRiOWRhZTUxNTk1M2NjYzVkZC4uMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0
L1dlYktpdFdpZGdldHMucHJvCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotIyAtLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tCi0jIFRhcmdldCBmaWxlIGZvciB0aGUgV2ViS2l0V2lkZ2V0cyBzdGF0aWMgbGlicmFy
eQotIwotIyBTZWUgJ1Rvb2xzL3FtYWtlL1JFQURNRScgZm9yIGFuIG92ZXJ2aWV3IG9mIHRoZSBi
dWlsZCBzeXN0ZW0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1URU1QTEFURSA9IGxpYgotVEFSR0VUID0gV2Vi
S2l0V2lkZ2V0cwotCi1pbmNsdWRlKFdlYktpdFdpZGdldHMucHJpKQotCi1XRUJLSVQgKz0gd3Rm
IGphdmFzY3JpcHRjb3JlIHdlYmNvcmUgd2Via2l0MQotUVQgKz0gZ3VpCi0KLUNPTkZJRyArPSBz
dGF0aWNsaWIKLQotU09VUkNFUyArPSBcCi0gICAgJCRQV0QvcXQvQXBpL3FncmFwaGljc3dlYnZp
ZXcuY3BwIFwKLSAgICAkJFBXRC9xdC9BcGkvcXdlYmZyYW1lLmNwcCBcCi0gICAgJCRQV0QvcXQv
QXBpL3F3ZWJwYWdlLmNwcCBcCi0gICAgJCRQV0QvcXQvQXBpL3F3ZWJ2aWV3LmNwcCBcCi0gICAg
JCRQV0QvcXQvQXBpL3F3ZWJwbHVnaW5kYXRhYmFzZS5jcHAgXAotICAgICQkUFdEL3F0L0FwaS9x
d2ViaW5zcGVjdG9yLmNwcCBcCi0gICAgJCRQV0QvcXQvQXBpL3F3ZWJraXR2ZXJzaW9uLmNwcCBc
Ci0gICAgJCRQV0QvcXQvV2ViQ29yZVN1cHBvcnQvUXRGYWxsYmFja1dlYlBvcHVwLmNwcCBcCi0g
ICAgJCRQV0QvcXQvV2ViQ29yZVN1cHBvcnQvUXRXZWJDb21ib0JveC5jcHAgXAotICAgICQkUFdE
L3F0L1dlYkNvcmVTdXBwb3J0L1FXZWJVbmRvQ29tbWFuZC5jcHAgXAotICAgICQkUFdEL3F0L1dl
YkNvcmVTdXBwb3J0L0RlZmF1bHRGdWxsU2NyZWVuVmlkZW9IYW5kbGVyLmNwcCBcCi0gICAgJCRQ
V0QvcXQvV2ViQ29yZVN1cHBvcnQvSW5pdFdlYktpdFF0LmNwcCBcCi0gICAgJCRQV0QvcXQvV2Vi
Q29yZVN1cHBvcnQvSW5zcGVjdG9yQ2xpZW50V2ViUGFnZS5jcHAgXAotICAgICQkUFdEL3F0L1dl
YkNvcmVTdXBwb3J0L1BhZ2VDbGllbnRRdC5jcHAgXAotICAgICQkUFdEL3F0L1dlYkNvcmVTdXBw
b3J0L1FTdHlsZUZhY2FkZUltcC5jcHAgXAotICAgICQkUFdEL3F0L1dlYkNvcmVTdXBwb3J0L1FH
cmFwaGljc1dpZGdldFBsdWdpbkltcGwuY3BwIFwKLSAgICAkJFBXRC9xdC9XZWJDb3JlU3VwcG9y
dC9RV2lkZ2V0UGx1Z2luSW1wbC5jcHAKLQotSEVBREVSUyArPSBcCi0gICAgJCRQV0QvcXQvQXBp
L3FncmFwaGljc3dlYnZpZXcuaCBcCi0gICAgJCRQV0QvcXQvQXBpL3F3ZWJmcmFtZS5oIFwKLSAg
ICAkJFBXRC9xdC9BcGkvcXdlYmZyYW1lX3AuaCBcCi0gICAgJCRQV0QvcXQvQXBpL3F3ZWJraXRn
bG9iYWwuaCBcCi0gICAgJCRQV0QvcXQvQXBpL3F3ZWJraXRwbGF0Zm9ybXBsdWdpbi5oIFwKLSAg
ICAkJFBXRC9xdC9BcGkvcXdlYnBhZ2UuaCBcCi0gICAgJCRQV0QvcXQvQXBpL3F3ZWJwYWdlX3Au
aCBcCi0gICAgJCRQV0QvcXQvQXBpL3F3ZWJ2aWV3LmggXAotICAgICQkUFdEL3F0L0FwaS9xd2Vi
aW5zcGVjdG9yLmggXAotICAgICQkUFdEL3F0L0FwaS9xd2Via2l0dmVyc2lvbi5oIFwKLSAgICAk
JFBXRC9xdC9BcGkvcXdlYnBsdWdpbmRhdGFiYXNlX3AuaCBcCi0gICAgJCRQV0QvcXQvV2ViQ29y
ZVN1cHBvcnQvSW5pdFdlYktpdFF0LmggXAotICAgICQkUFdEL3F0L1dlYkNvcmVTdXBwb3J0L0lu
c3BlY3RvckNsaWVudFdlYlBhZ2UuaCBcCi0gICAgJCRQV0QvcXQvV2ViQ29yZVN1cHBvcnQvRGVm
YXVsdEZ1bGxTY3JlZW5WaWRlb0hhbmRsZXIuaCBcCi0gICAgJCRQV0QvcXQvV2ViQ29yZVN1cHBv
cnQvUXRGYWxsYmFja1dlYlBvcHVwLmggXAotICAgICQkUFdEL3F0L1dlYkNvcmVTdXBwb3J0L1F0
V2ViQ29tYm9Cb3guaCBcCi0gICAgJCRQV0QvcXQvV2ViQ29yZVN1cHBvcnQvUVdlYlVuZG9Db21t
YW5kLmggXAotICAgICQkUFdEL3F0L1dlYkNvcmVTdXBwb3J0L1BhZ2VDbGllbnRRdC5oIFwKLSAg
ICAkJFBXRC9xdC9XZWJDb3JlU3VwcG9ydC9RR3JhcGhpY3NXaWRnZXRQbHVnaW5JbXBsLmggXAot
ICAgICQkUFdEL3F0L1dlYkNvcmVTdXBwb3J0L1FTdHlsZUZhY2FkZUltcC5oIFwKLSAgICAkJFBX
RC9xdC9XZWJDb3JlU3VwcG9ydC9RV2lkZ2V0UGx1Z2luSW1wbC5oCi0KLWNvbnRhaW5zKFFUX0NP
TkZJRywgYWNjZXNzaWJpbGl0eSkgewotICAgIFNPVVJDRVMgKz0gJCRQV0QvcXQvQXBpL3F3ZWJ2
aWV3YWNjZXNzaWJsZS5jcHAKLSAgICBIRUFERVJTICs9ICQkUFdEL3F0L0FwaS9xd2Vidmlld2Fj
Y2Vzc2libGVfcC5oIAotfQotCi1JTkNMVURFUEFUSCArPSBcCi0gICAgJCRQV0QvcXQvQXBpIFwK
LSAgICAkJFBXRC9xdC9XZWJDb3JlU3VwcG9ydAotCi1lbmFibGU/KFZJREVPKSB7Ci0gICAgIXVz
ZT8oUVRLSVQpOiF1c2U/KEdTVFJFQU1FUik6dXNlPyhRVF9NVUxUSU1FRElBKSB7Ci0gICAgICAg
IEhFQURFUlMgKz0gJCRQV0QvcXQvV2ViQ29yZVN1cHBvcnQvRnVsbFNjcmVlblZpZGVvV2lkZ2V0
LmgKLSAgICAgICAgU09VUkNFUyArPSAkJFBXRC9xdC9XZWJDb3JlU3VwcG9ydC9GdWxsU2NyZWVu
VmlkZW9XaWRnZXQuY3BwCi0gICAgfQotfQotCi11c2U/KDNEX0dSQVBISUNTKTogV0VCS0lUICs9
IGFuZ2xlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0L0FwaS9xZ3JhcGhpY3N3ZWJ2aWV3
LmNwcCBiL1NvdXJjZS9XZWJLaXQvcXQvQXBpL3FncmFwaGljc3dlYnZpZXcuY3BwCmRlbGV0ZWQg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGI0ZTgwMWJkMWFjZGY2ZmZiZjczMjk2NGM5OGVjYWUz
M2E0MTc1Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1Nv
dXJjZS9XZWJLaXQvcXQvQXBpL3FncmFwaGljc3dlYnZpZXcuY3BwCisrKyAvZGV2L251bGwKQEAg
LTEsMTE5NyArMCwwIEBACi0vKgotICAgIENvcHlyaWdodCAoQykgMjAwOSBOb2tpYSBDb3Jwb3Jh
dGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykKLSAgICBDb3B5cmlnaHQgKEMpIDIwMDkg
R2lyaXNoIFJhbWFrcmlzaG5hbiA8Z2lyaXNoQGZvcndhcmRiaWFzLmluPgotCi0gICAgVGhpcyBs
aWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgot
ICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwg
UHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91
bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91
ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3Ry
aWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhP
VVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAg
ICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBT
ZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBk
ZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05V
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBsaWJy
YXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCi0gICAgdGhl
IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0
aCBGbG9vciwKLSAgICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KLSovCi0KLSNpbmNsdWRl
ICJjb25maWcuaCIKLSNpbmNsdWRlICJxZ3JhcGhpY3N3ZWJ2aWV3LmgiCi0KLSNpZiAhZGVmaW5l
ZChRVF9OT19HUkFQSElDU1ZJRVcpCi0KLSNpbmNsdWRlICJxd2ViZnJhbWUuaCIKLSNpbmNsdWRl
ICJxd2ViZnJhbWVfcC5oIgotI2luY2x1ZGUgInF3ZWJwYWdlLmgiCi0jaW5jbHVkZSAicXdlYnBh
Z2VfcC5oIgotI2luY2x1ZGUgIlBhZ2UuaCIKLSNpbmNsdWRlICJQYWdlQ2xpZW50UXQuaCIKLSNp
bmNsdWRlICJGcmFtZS5oIgotI2luY2x1ZGUgIkZyYW1lVmlldy5oIgotI2luY2x1ZGUgIkdyYXBo
aWNzQ29udGV4dC5oIgotI2luY2x1ZGUgIkludFJlY3QuaCIKLSNpbmNsdWRlICJUaWxlZEJhY2tp
bmdTdG9yZS5oIgotI2luY2x1ZGUgPHFhcHBsaWNhdGlvbi5oPgotI2luY2x1ZGUgPHFncmFwaGlj
c3NjZW5lLmg+Ci0jaW5jbHVkZSA8cWdyYXBoaWNzc2NlbmVldmVudC5oPgotI2luY2x1ZGUgPHFn
cmFwaGljc3ZpZXcuaD4KLSNpbmNsdWRlIDxxc2Nyb2xsYmFyLmg+Ci0jaW5jbHVkZSA8cXN0eWxl
b3B0aW9uLmg+Ci0jaW5jbHVkZSA8UXRDb3JlL3FtZXRhb2JqZWN0Lmg+Ci0jaW5jbHVkZSA8UXRD
b3JlL3FzaGFyZWRwb2ludGVyLmg+Ci0jaW5jbHVkZSA8UXRDb3JlL3F0aW1lci5oPgotI2luY2x1
ZGUgPFF0R3VpL3FwaXhtYXBjYWNoZS5oPgotCi0jaWYgZGVmaW5lZChRX1dTX1gxMSkKLSNpbmNs
dWRlIDxRWDExSW5mbz4KLSNlbmRpZgotI2luY2x1ZGUgPFNldHRpbmdzLmg+Ci0KLXVzaW5nIG5h
bWVzcGFjZSBXZWJDb3JlOwotCi1jbGFzcyBRR3JhcGhpY3NXZWJWaWV3UHJpdmF0ZSB7Ci1wdWJs
aWM6Ci0gICAgUUdyYXBoaWNzV2ViVmlld1ByaXZhdGUoUUdyYXBoaWNzV2ViVmlldyogcGFyZW50
KQotICAgICAgICA6IHEocGFyZW50KQotICAgICAgICAsIHBhZ2UoMCkKLSAgICAgICAgLCByZXNp
emVzVG9Db250ZW50cyhmYWxzZSkKLSAgICAgICAgLCByZW5kZXJIaW50cyhRUGFpbnRlcjo6VGV4
dEFudGlhbGlhc2luZyB8IFFQYWludGVyOjpTbW9vdGhQaXhtYXBUcmFuc2Zvcm0pIHt9Ci0KLSAg
ICB2aXJ0dWFsIH5RR3JhcGhpY3NXZWJWaWV3UHJpdmF0ZSgpOwotCi0gICAgdm9pZCBzeW5jTGF5
ZXJzKCk7Ci0KLSAgICB2b2lkIHVwZGF0ZVJlc2l6ZXNUb0NvbnRlbnRzRm9yUGFnZSgpOwotCi0g
ICAgdm9pZCBkZXRhY2hDdXJyZW50UGFnZSgpOwotCi0gICAgdm9pZCBfcV9kb0xvYWRGaW5pc2hl
ZChib29sIHN1Y2Nlc3MpOwotICAgIHZvaWQgX3FfY29udGVudHNTaXplQ2hhbmdlZChjb25zdCBR
U2l6ZSYpOwotICAgIHZvaWQgX3Ffc2NhbGVDaGFuZ2VkKCk7Ci0KLSAgICB2b2lkIF9xX3BhZ2VE
ZXN0cm95ZWQoKTsKLQotICAgIFFHcmFwaGljc1dlYlZpZXcqIHE7Ci0gICAgUVdlYlBhZ2UqIHBh
Z2U7Ci0gICAgYm9vbCByZXNpemVzVG9Db250ZW50czsKLSAgICBRUGFpbnRlcjo6UmVuZGVySGlu
dHMgcmVuZGVySGludHM7Ci0KLSAgICBRR3JhcGhpY3NJdGVtT3ZlcmxheSogb3ZlcmxheSgpIGNv
bnN0Ci0gICAgewotICAgICAgICBpZiAoIXBhZ2UgfHwgIXBhZ2UtPmQtPmNsaWVudCkKLSAgICAg
ICAgICAgIHJldHVybiAwOwotICAgICAgICByZXR1cm4gcGFnZUNsaWVudCgpLT5vdmVybGF5Owot
ICAgIH0KLQotICAgIFBhZ2VDbGllbnRRR3JhcGhpY3NXaWRnZXQqIHBhZ2VDbGllbnQoKSBjb25z
dAotICAgIHsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFdlYkNvcmU6OlBhZ2VDbGllbnRR
R3JhcGhpY3NXaWRnZXQqPiAocGFnZS0+ZC0+Y2xpZW50LmRhdGEoKSk7Ci0gICAgfSAKLX07Ci0K
LVFHcmFwaGljc1dlYlZpZXdQcml2YXRlOjp+UUdyYXBoaWNzV2ViVmlld1ByaXZhdGUoKQotewot
ICAgIGRldGFjaEN1cnJlbnRQYWdlKCk7Ci19Ci0KLXZvaWQgUUdyYXBoaWNzV2ViVmlld1ByaXZh
dGU6OnN5bmNMYXllcnMoKQotewotI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKLSAg
ICBwYWdlQ2xpZW50KCktPnN5bmNMYXllcnMoKTsKLSNlbmRpZgotfQotCi12b2lkIFFHcmFwaGlj
c1dlYlZpZXdQcml2YXRlOjpfcV9kb0xvYWRGaW5pc2hlZChib29sIHN1Y2Nlc3MpCi17Ci0gICAg
Ly8gSWYgdGhlIHBhZ2UgaGFkIG5vIHRpdGxlLCBzdGlsbCBtYWtlIHN1cmUgaXQgZ2V0cyB0aGUg
c2lnbmFsCi0gICAgaWYgKHEtPnRpdGxlKCkuaXNFbXB0eSgpKQotICAgICAgICBlbWl0IHEtPnVy
bENoYW5nZWQocS0+dXJsKCkpOwotCi0gICAgZW1pdCBxLT5sb2FkRmluaXNoZWQoc3VjY2Vzcyk7
Ci19Ci0KLXZvaWQgUUdyYXBoaWNzV2ViVmlld1ByaXZhdGU6Ol9xX3BhZ2VEZXN0cm95ZWQoKQot
ewotICAgIHBhZ2UgPSAwOwotICAgIHEtPnNldFBhZ2UoMCk7Ci19Ci0KLXZvaWQgUUdyYXBoaWNz
V2ViVmlld1ByaXZhdGU6OnVwZGF0ZVJlc2l6ZXNUb0NvbnRlbnRzRm9yUGFnZSgpCi17Ci0gICAg
QVNTRVJUKHBhZ2UpOwotICAgIHBhZ2VDbGllbnQoKS0+dmlld1Jlc2l6ZXNUb0NvbnRlbnRzID0g
cmVzaXplc1RvQ29udGVudHM7Ci0gICAgaWYgKHJlc2l6ZXNUb0NvbnRlbnRzKSB7Ci0gICAgICAg
IC8vIHJlc2l6ZXMgdG8gY29udGVudHMgbW9kZSByZXF1aXJlcyBwcmVmZXJyZWQgY29udGVudHMg
c2l6ZSB0byBiZSBzZXQKLSAgICAgICAgaWYgKCFwYWdlLT5wcmVmZXJyZWRDb250ZW50c1NpemUo
KS5pc1ZhbGlkKCkpCi0gICAgICAgICAgICBwYWdlLT5zZXRQcmVmZXJyZWRDb250ZW50c1NpemUo
UVNpemUoOTYwLCA4MDApKTsKLQotICAgICAgICBRT2JqZWN0Ojpjb25uZWN0KHBhZ2UtPm1haW5G
cmFtZSgpLCBTSUdOQUwoY29udGVudHNTaXplQ2hhbmdlZChRU2l6ZSkpLAotICAgICAgICAgICAg
cSwgU0xPVChfcV9jb250ZW50c1NpemVDaGFuZ2VkKGNvbnN0IFFTaXplJikpLCBRdDo6VW5pcXVl
Q29ubmVjdGlvbik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgUU9iamVjdDo6ZGlzY29ubmVjdChw
YWdlLT5tYWluRnJhbWUoKSwgU0lHTkFMKGNvbnRlbnRzU2l6ZUNoYW5nZWQoUVNpemUpKSwKLSAg
ICAgICAgICAgICAgICAgICAgICAgICBxLCBTTE9UKF9xX2NvbnRlbnRzU2l6ZUNoYW5nZWQoY29u
c3QgUVNpemUmKSkpOwotICAgIH0KLSAgICBwYWdlLT5kLT5wYWdlLT5tYWluRnJhbWUoKS0+dmll
dygpLT5zZXRQYWludHNFbnRpcmVDb250ZW50cyhyZXNpemVzVG9Db250ZW50cyk7Ci0gICAgcGFn
ZS0+ZC0+cGFnZS0+bWFpbkZyYW1lKCktPnZpZXcoKS0+c2V0RGVsZWdhdGVzU2Nyb2xsaW5nKHJl
c2l6ZXNUb0NvbnRlbnRzKTsKLX0KLQotdm9pZCBRR3JhcGhpY3NXZWJWaWV3UHJpdmF0ZTo6X3Ff
Y29udGVudHNTaXplQ2hhbmdlZChjb25zdCBRU2l6ZSYgc2l6ZSkKLXsKLSAgICBpZiAoIXJlc2l6
ZXNUb0NvbnRlbnRzKQotICAgICAgICByZXR1cm47Ci0gICAgcS0+c2V0R2VvbWV0cnkoUVJlY3RG
KHEtPmdlb21ldHJ5KCkudG9wTGVmdCgpLCBzaXplKSk7Ci19Ci0KLXZvaWQgUUdyYXBoaWNzV2Vi
Vmlld1ByaXZhdGU6Ol9xX3NjYWxlQ2hhbmdlZCgpCi17Ci0jaWYgVVNFKFRJTEVEX0JBQ0tJTkdf
U1RPUkUpCi0gICAgaWYgKCFwYWdlKQotICAgICAgICByZXR1cm47Ci0gICAgcGFnZUNsaWVudCgp
LT51cGRhdGVUaWxlZEJhY2tpbmdTdG9yZVNjYWxlKCk7Ci0jZW5kaWYKLX0KLQotLyohCi0gICAg
XGNsYXNzIFFHcmFwaGljc1dlYlZpZXcKLSAgICBcYnJpZWYgVGhlIFFHcmFwaGljc1dlYlZpZXcg
Y2xhc3MgYWxsb3dzIFdlYiBjb250ZW50IHRvIGJlIGFkZGVkIHRvIGEgR3JhcGhpY3NWaWV3Lgot
ICAgIFxzaW5jZSA0LjYKLQotICAgIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgcmVuZGVycyBX
ZWIgY29udGVudCBmcm9tIGEgVVJMIG9yIHN1cHBsaWVkIGFzIGRhdGEsIHVzaW5nCi0gICAgZmVh
dHVyZXMgb2YgdGhlIFF0V2ViS2l0IG1vZHVsZS4KLQotICAgIElmIHRoZSB3aWR0aCBhbmQgaGVp
Z2h0IG9mIHRoZSBpdGVtIGFyZSBub3Qgc2V0LCB0aGV5IHdpbGwgZGVmYXVsdCB0byA4MDAgYW5k
IDYwMCwKLSAgICByZXNwZWN0aXZlbHkuIElmIHRoZSBXZWIgcGFnZSBjb250ZW50cyBpcyBsYXJn
ZXIgdGhhbiB0aGF0LCBzY3JvbGxiYXJzIHdpbGwgYmUgc2hvd24KLSAgICBpZiBub3QgZGlzYWJs
ZWQgZXhwbGljaXRseS4KLQotICAgIFxzZWN0aW9uMSBCcm93c2VyIEZlYXR1cmVzCi0KLSAgICBN
YW55IG9mIHRoZSBmdW5jdGlvbnMsIHNpZ25hbHMgYW5kIHByb3BlcnRpZXMgcHJvdmlkZWQgYnkg
UVdlYlZpZXcgYXJlIGFsc28gYXZhaWxhYmxlCi0gICAgZm9yIHRoaXMgaXRlbSwgbWFraW5nIGl0
IHNpbXBsZSB0byBhZGFwdCBleGlzdGluZyBjb2RlIHRvIHVzZSBRR3JhcGhpY3NXZWJWaWV3IGlu
c3RlYWQKLSAgICBvZiBRV2ViVmlldy4KLQotICAgIFRoZSBpdGVtIHVzZXMgYSBRV2ViUGFnZSBv
YmplY3QgdG8gcGVyZm9ybSB0aGUgcmVuZGVyaW5nIG9mIFdlYiBjb250ZW50LCBhbmQgdGhpcyBj
YW4KLSAgICBiZSBvYnRhaW5lZCB3aXRoIHRoZSBwYWdlKCkgZnVuY3Rpb24sIGVuYWJsaW5nIHRo
ZSBkb2N1bWVudCBpdHNlbGYgdG8gYmUgYWNjZXNzZWQgYW5kCi0gICAgbW9kaWZpZWQuCi0KLSAg
ICBBcyB3aXRoIFFXZWJWaWV3LCB0aGUgaXRlbSByZWNvcmRzIHRoZSBicm93c2luZyBoaXN0b3J5
IHVzaW5nIGEgUVdlYkhpc3Rvcnkgb2JqZWN0LAotICAgIGFjY2Vzc2libGUgdXNpbmcgdGhlIGhp
c3RvcnkoKSBmdW5jdGlvbi4gVGhlIFFXZWJTZXR0aW5ncyBvYmplY3QgdGhhdCBkZWZpbmVzIHRo
ZQotICAgIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGJyb3dzZXIgY2FuIGJlIG9idGFpbmVkIHdpdGgg
dGhlIHNldHRpbmdzKCkgZnVuY3Rpb24sIGVuYWJsaW5nCi0gICAgZmVhdHVyZXMgbGlrZSBwbHVn
aW4gc3VwcG9ydCB0byBiZSBjdXN0b21pemVkIGZvciBlYWNoIGl0ZW0uCi0KLSAgICBcc2EgUVdl
YlZpZXcsIFFHcmFwaGljc1RleHRJdGVtCi0qLwotCi0vKiEKLSAgICBcZm4gdm9pZCBRR3JhcGhp
Y3NXZWJWaWV3Ojp0aXRsZUNoYW5nZWQoY29uc3QgUVN0cmluZyAmdGl0bGUpCi0KLSAgICBUaGlz
IHNpZ25hbCBpcyBlbWl0dGVkIHdoZW5ldmVyIHRoZSBcYSB0aXRsZSBvZiB0aGUgbWFpbiBmcmFt
ZSBjaGFuZ2VzLgotCi0gICAgXHNhIHRpdGxlKCkKLSovCi0KLS8qIQotICAgIFxmbiB2b2lkIFFH
cmFwaGljc1dlYlZpZXc6OnVybENoYW5nZWQoY29uc3QgUVVybCAmdXJsKQotCi0gICAgVGhpcyBz
aWduYWwgaXMgZW1pdHRlZCB3aGVuIHRoZSBcYSB1cmwgb2YgdGhlIHZpZXcgY2hhbmdlcy4KLQot
ICAgIFxzYSB1cmwoKSwgbG9hZCgpCi0qLwotCi0vKiEKLSAgICBcZm4gdm9pZCBRR3JhcGhpY3NX
ZWJWaWV3OjppY29uQ2hhbmdlZCgpCi0KLSAgICBUaGlzIHNpZ25hbCBpcyBlbWl0dGVkIHdoZW5l
dmVyIHRoZSBpY29uIG9mIHRoZSBwYWdlIGlzIGxvYWRlZCBvciBjaGFuZ2VzLgotCi0gICAgSW4g
b3JkZXIgZm9yIGljb25zIHRvIGJlIGxvYWRlZCwgeW91IHdpbGwgbmVlZCB0byBzZXQgYW4gaWNv
biBkYXRhYmFzZSBwYXRoCi0gICAgdXNpbmcgUVdlYlNldHRpbmdzOjpzZXRJY29uRGF0YWJhc2VQ
YXRoKCkuCi0KLSAgICBcc2EgaWNvbigpLCBRV2ViU2V0dGluZ3M6OnNldEljb25EYXRhYmFzZVBh
dGgoKQotKi8KLQotLyohCi0gICAgXGZuIHZvaWQgUUdyYXBoaWNzV2ViVmlldzo6bG9hZFN0YXJ0
ZWQoKQotCi0gICAgVGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuIGEgbmV3IGxvYWQgb2YgdGhl
IHBhZ2UgaXMgc3RhcnRlZC4KLQotICAgIFxzYSBsb2FkUHJvZ3Jlc3MoKSwgbG9hZEZpbmlzaGVk
KCkKLSovCi0KLS8qIQotICAgIFxmbiB2b2lkIFFHcmFwaGljc1dlYlZpZXc6OmxvYWRGaW5pc2hl
ZChib29sIG9rKQotCi0gICAgVGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuIGEgbG9hZCBvZiB0
aGUgcGFnZSBpcyBmaW5pc2hlZC4KLSAgICBcYSBvayB3aWxsIGluZGljYXRlIHdoZXRoZXIgdGhl
IGxvYWQgd2FzIHN1Y2Nlc3NmdWwgb3IgYW55IGVycm9yIG9jY3VycmVkLgotCi0gICAgXHNhIGxv
YWRTdGFydGVkKCkKLSovCi0KLS8qIQotICAgIENvbnN0cnVjdHMgYW4gZW1wdHkgUUdyYXBoaWNz
V2ViVmlldyB3aXRoIHBhcmVudCBcYSBwYXJlbnQuCi0KLSAgICBcc2EgbG9hZCgpCi0qLwotUUdy
YXBoaWNzV2ViVmlldzo6UUdyYXBoaWNzV2ViVmlldyhRR3JhcGhpY3NJdGVtKiBwYXJlbnQpCi0g
ICAgOiBRR3JhcGhpY3NXaWRnZXQocGFyZW50KQotICAgICwgZChuZXcgUUdyYXBoaWNzV2ViVmll
d1ByaXZhdGUodGhpcykpCi17Ci0gICAgc2V0RmxhZyhRR3JhcGhpY3NJdGVtOjpJdGVtVXNlc0V4
dGVuZGVkU3R5bGVPcHRpb24sIHRydWUpOwotICAgIHNldEFjY2VwdERyb3BzKHRydWUpOwotICAg
IHNldEFjY2VwdEhvdmVyRXZlbnRzKHRydWUpOwotICAgIHNldEFjY2VwdFRvdWNoRXZlbnRzKHRy
dWUpOwotICAgIHNldEZvY3VzUG9saWN5KFF0OjpTdHJvbmdGb2N1cyk7Ci0gICAgc2V0RmxhZyhR
R3JhcGhpY3NJdGVtOjpJdGVtQ2xpcHNDaGlsZHJlblRvU2hhcGUsIHRydWUpOwotI2lmIFVTRShU
SUxFRF9CQUNLSU5HX1NUT1JFKQotICAgIFFPYmplY3Q6OmNvbm5lY3QodGhpcywgU0lHTkFMKHNj
YWxlQ2hhbmdlZCgpKSwgdGhpcywgU0xPVChfcV9zY2FsZUNoYW5nZWQoKSkpOwotI2VuZGlmCi19
Ci0KLS8qIQotICAgIERlc3Ryb3lzIHRoZSBpdGVtLgotKi8KLVFHcmFwaGljc1dlYlZpZXc6On5R
R3JhcGhpY3NXZWJWaWV3KCkKLXsKLSAgICBkZWxldGUgZDsKLX0KLQotLyohCi0gICAgUmV0dXJu
cyBhIHBvaW50ZXIgdG8gdGhlIHVuZGVybHlpbmcgd2ViIHBhZ2UuCi0KLSAgICBcc2Egc2V0UGFn
ZSgpCi0qLwotUVdlYlBhZ2UqIFFHcmFwaGljc1dlYlZpZXc6OnBhZ2UoKSBjb25zdAotewotICAg
IGlmICghZC0+cGFnZSkgewotICAgICAgICBRR3JhcGhpY3NXZWJWaWV3KiB0aGF0ID0gY29uc3Rf
Y2FzdDxRR3JhcGhpY3NXZWJWaWV3Kj4odGhpcyk7Ci0gICAgICAgIFFXZWJQYWdlKiBwYWdlID0g
bmV3IFFXZWJQYWdlKHRoYXQpOwotCi0gICAgICAgIC8vIERlZmF1bHQgdG8gbm90IGhhdmluZyBh
IGJhY2tncm91bmQsIGluIHRoZSBjYXNlCi0gICAgICAgIC8vIHRoZSBwYWdlIGRvZXNuJ3QgcHJv
dmlkZSBvbmUuCi0gICAgICAgIFFQYWxldHRlIHBhbGV0dGUgPSBRQXBwbGljYXRpb246OnBhbGV0
dGUoKTsKLSAgICAgICAgcGFsZXR0ZS5zZXRCcnVzaChRUGFsZXR0ZTo6QmFzZSwgUUNvbG9yOjpm
cm9tUmdiRigwLCAwLCAwLCAwKSk7Ci0gICAgICAgIHBhZ2UtPnNldFBhbGV0dGUocGFsZXR0ZSk7
Ci0KLSAgICAgICAgdGhhdC0+c2V0UGFnZShwYWdlKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZC0+
cGFnZTsKLX0KLQotLyohIFxyZWltcAotKi8KLXZvaWQgUUdyYXBoaWNzV2ViVmlldzo6cGFpbnQo
UVBhaW50ZXIqIHBhaW50ZXIsIGNvbnN0IFFTdHlsZU9wdGlvbkdyYXBoaWNzSXRlbSogb3B0aW9u
LCBRV2lkZ2V0KikKLXsKLSAgICBRUGFpbnRlcjo6UmVuZGVySGludHMgb2xkSGludHMgPSBwYWlu
dGVyLT5yZW5kZXJIaW50cygpOwotICAgIHBhaW50ZXItPnNldFJlbmRlckhpbnRzKG9sZEhpbnRz
IHwgZC0+cmVuZGVySGludHMpOwotI2lmIFVTRShUSUxFRF9CQUNLSU5HX1NUT1JFKQotICAgIGlm
IChXZWJDb3JlOjpUaWxlZEJhY2tpbmdTdG9yZSogYmFja2luZ1N0b3JlID0gUVdlYkZyYW1lUHJp
dmF0ZTo6Y29yZShwYWdlKCktPm1haW5GcmFtZSgpKS0+dGlsZWRCYWNraW5nU3RvcmUoKSkgewot
ICAgICAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIHNldCB0aGUgYmFja2luZyBzdG9yZSB2aWV3cG9y
dCBlYXJsaWVyIHRoYW4gaW4gcGFpbnQKLSAgICAgICAgYmFja2luZ1N0b3JlLT5jb3ZlcldpdGhU
aWxlc0lmTmVlZGVkKCk7Ci0gICAgICAgIC8vIFFXZWJGcmFtZTo6cmVuZGVyIGlzIGEgcHVibGlj
IEFQSSwgYnlwYXNzIGl0IGZvciB0aWxlZCByZW5kZXJpbmcgc28gYmVoYXZpb3IgZG9lcyBub3Qg
bmVlZCB0byBjaGFuZ2UuCi0gICAgICAgIFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dCBjb250ZXh0
KHBhaW50ZXIpOwotICAgICAgICBwYWdlKCktPm1haW5GcmFtZSgpLT5kLT5yZW5kZXJGcm9tVGls
ZWRCYWNraW5nU3RvcmUoJmNvbnRleHQsIG9wdGlvbi0+ZXhwb3NlZFJlY3QudG9BbGlnbmVkUmVj
dCgpKTsKLSAgICAgICAgcGFpbnRlci0+c2V0UmVuZGVySGludHMob2xkSGludHMpOwotICAgICAg
ICByZXR1cm47Ci0gICAgfQotI2VuZGlmCi0gICAgcGFnZSgpLT5tYWluRnJhbWUoKS0+cmVuZGVy
KHBhaW50ZXIsIFFXZWJGcmFtZTo6QWxsTGF5ZXJzLCBvcHRpb24tPmV4cG9zZWRSZWN0LnRvUmVj
dCgpKTsKLSAgICBwYWludGVyLT5zZXRSZW5kZXJIaW50cyhvbGRIaW50cyk7Ci19Ci0KLS8qISBc
cmVpbXAKLSovCi1ib29sIFFHcmFwaGljc1dlYlZpZXc6OnNjZW5lRXZlbnQoUUV2ZW50KiBldmVu
dCkKLXsKLSAgICAvLyBSZS1pbXBsZW1lbnRlZCBpbiBvcmRlciB0byBhbGxvd3MgZml4aW5nIGV2
ZW50LXJlbGF0ZWQgYnVncyBpbiBwYXRjaCByZWxlYXNlcy4KLQotICAgIGlmIChkLT5wYWdlICYm
IChldmVudC0+dHlwZSgpID09IFFFdmVudDo6VG91Y2hCZWdpbgotICAgICAgICAgICAgICAgIHx8
IGV2ZW50LT50eXBlKCkgPT0gUUV2ZW50OjpUb3VjaEVuZAotICAgICAgICAgICAgICAgIHx8IGV2
ZW50LT50eXBlKCkgPT0gUUV2ZW50OjpUb3VjaFVwZGF0ZQotICAgICAgICAgICAgICAgIHx8IGV2
ZW50LT50eXBlKCkgPT0gUUV2ZW50OjpUb3VjaENhbmNlbAotICAgICAgICkpIHsKLSAgICAgICAg
ZC0+cGFnZS0+ZXZlbnQoZXZlbnQpOwotCi0gICAgICAgIC8vIEFsd2F5cyByZXR1cm4gdHJ1ZSBz
byB0aGF0IHdlJ2xsIHJlY2VpdmUgYWxzbyBUb3VjaFVwZGF0ZSBhbmQgVG91Y2hFbmQgZXZlbnRz
Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBRR3JhcGhpY3NXaWRn
ZXQ6OnNjZW5lRXZlbnQoZXZlbnQpOwotfQotCi0vKiEgXHJlaW1wCi0qLwotUVZhcmlhbnQgUUdy
YXBoaWNzV2ViVmlldzo6aXRlbUNoYW5nZShHcmFwaGljc0l0ZW1DaGFuZ2UgY2hhbmdlLCBjb25z
dCBRVmFyaWFudCYgdmFsdWUpCi17Ci0gICAgc3dpdGNoIChjaGFuZ2UpIHsKLSAgICAvLyBEaWZm
ZXJlbnRseSBmcm9tIFFXZWJWaWV3LCBpdCBpcyBpbnRlcmVzdGluZyB0byBRR3JhcGhpY3NXZWJW
aWV3IHRvIGhhbmRsZQotICAgIC8vIHBvc3QgbW91c2UgY3Vyc29yIGNoYW5nZSBub3RpZmljYXRp
b25zLiBSZWFzb246ICdJdGVtQ3Vyc29yQ2hhbmdlJyBpcyBzZW50Ci0gICAgLy8gYXMgdGhlIGZp
cnN0IGFjdGlvbiBpbiBRR3JhcGhpY3NJdGVtOjpzZXRDdXJzb3IgaW1wbGVtZW50YXRpb24sIGFu
ZCBhdCB0aGF0Ci0gICAgLy8gaXRlbSB3aWRnZXQncyBjdXJzb3IgaGFzIG5vdCBiZWVuIGVmZmVj
dGl2ZWx5IGNoYW5nZWQgeWV0LgotICAgIC8vIEFmdGVyIGN1cnNvciBpcyBwcm9wZXJseSBzZXQg
KGF0ICdJdGVtQ3Vyc29ySGFzQ2hhbmdlZCcgZW1pc3Npb24gdGltZSksIHdlCi0gICAgLy8gZmly
ZSAnQ3Vyc29yQ2hhbmdlJy4KLSAgICBjYXNlIEl0ZW1DdXJzb3JDaGFuZ2U6Ci0gICAgICAgIHJl
dHVybiB2YWx1ZTsKLSAgICBjYXNlIEl0ZW1DdXJzb3JIYXNDaGFuZ2VkOiB7Ci0gICAgICAgICAg
ICBRRXZlbnQgZXZlbnQoUUV2ZW50OjpDdXJzb3JDaGFuZ2UpOwotICAgICAgICAgICAgUUFwcGxp
Y2F0aW9uOjpzZW5kRXZlbnQodGhpcywgJmV2ZW50KTsKLSAgICAgICAgICAgIHJldHVybiB2YWx1
ZTsKLSAgICAgICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAg
IHJldHVybiBRR3JhcGhpY3NXaWRnZXQ6Oml0ZW1DaGFuZ2UoY2hhbmdlLCB2YWx1ZSk7Ci19Ci0K
LS8qISBccmVpbXAKLSovCi1RU2l6ZUYgUUdyYXBoaWNzV2ViVmlldzo6c2l6ZUhpbnQoUXQ6OlNp
emVIaW50IHdoaWNoLCBjb25zdCBRU2l6ZUYmIGNvbnN0cmFpbnQpIGNvbnN0Ci17Ci0gICAgaWYg
KHdoaWNoID09IFF0OjpQcmVmZXJyZWRTaXplKQotICAgICAgICByZXR1cm4gUVNpemVGKDgwMCwg
NjAwKTsgLy8gIyMjCi0gICAgcmV0dXJuIFFHcmFwaGljc1dpZGdldDo6c2l6ZUhpbnQod2hpY2gs
IGNvbnN0cmFpbnQpOwotfQotCi0vKiEgXHJlaW1wCi0qLwotUVZhcmlhbnQgUUdyYXBoaWNzV2Vi
Vmlldzo6aW5wdXRNZXRob2RRdWVyeShRdDo6SW5wdXRNZXRob2RRdWVyeSBxdWVyeSkgY29uc3QK
LXsKLSAgICBpZiAoZC0+cGFnZSkKLSAgICAgICAgcmV0dXJuIGQtPnBhZ2UtPmlucHV0TWV0aG9k
UXVlcnkocXVlcnkpOwotICAgIHJldHVybiBRVmFyaWFudCgpOwotfQotCi0vKiEKLSAgICBccHJv
cGVydHkgUUdyYXBoaWNzV2ViVmlldzo6cmVuZGVySGludHMKLSAgICBcc2luY2UgNC44Ci0gICAg
XGJyaWVmIHRoZSBkZWZhdWx0IHJlbmRlciBoaW50cyBmb3IgdGhlIHZpZXcKLQotICAgIFRoZXNl
IGhpbnRzIGFyZSB1c2VkIHRvIGluaXRpYWxpemUgUVBhaW50ZXIgYmVmb3JlIHBhaW50aW5nIHRo
ZSBXZWIgcGFnZS4KLQotICAgIFFQYWludGVyOjpUZXh0QW50aWFsaWFzaW5nIGFuZCBRUGFpbnRl
cjo6U21vb3RoUGl4bWFwVHJhbnNmb3JtIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQgYW5kIHdpbGwg
YmUKLSAgICB1c2VkIHRvIHJlbmRlciB0aGUgaXRlbSBpbiBhZGRpdGlvbiBvZiB3aGF0IGhhcyBi
ZWVuIHNldCBvbiB0aGUgcGFpbnRlciBnaXZlbiBieSBRR3JhcGhpY3NTY2VuZS4KLQotICAgIFxz
YSBRUGFpbnRlcjo6cmVuZGVySGludHMoKQotKi8KLQotLyohCi0gICAgXHNpbmNlIDQuOAotICAg
IFJldHVybnMgdGhlIHJlbmRlciBoaW50cyB1c2VkIGJ5IHRoZSB2aWV3IHRvIHJlbmRlciBjb250
ZW50LgotCi0gICAgXHNhIFFQYWludGVyOjpyZW5kZXJIaW50cygpCi0qLwotUVBhaW50ZXI6OlJl
bmRlckhpbnRzIFFHcmFwaGljc1dlYlZpZXc6OnJlbmRlckhpbnRzKCkgY29uc3QKLXsKLSAgICBy
ZXR1cm4gZC0+cmVuZGVySGludHM7Ci19Ci0KLS8qIQotICAgIFxzaW5jZSA0LjgKLSAgICBTZXRz
IHRoZSByZW5kZXIgaGludHMgdXNlZCBieSB0aGUgdmlldyB0byB0aGUgc3BlY2lmaWVkIFxhIGhp
bnRzLgotCi0gICAgXHNhIFFQYWludGVyOjpzZXRSZW5kZXJIaW50cygpCi0qLwotdm9pZCBRR3Jh
cGhpY3NXZWJWaWV3OjpzZXRSZW5kZXJIaW50cyhRUGFpbnRlcjo6UmVuZGVySGludHMgaGludHMp
Ci17Ci0gICAgaWYgKGhpbnRzID09IGQtPnJlbmRlckhpbnRzKQotICAgICAgICByZXR1cm47Ci0g
ICAgZC0+cmVuZGVySGludHMgPSBoaW50czsKLSAgICB1cGRhdGUoKTsKLX0KLQotLyohCi0gICAg
XHNpbmNlIDQuOAotICAgIElmIFxhIGVuYWJsZWQgaXMgdHJ1ZSwgZW5hYmxlcyB0aGUgc3BlY2lm
aWVkIHJlbmRlciBcYSBoaW50OyBvdGhlcndpc2UKLSAgICBkaXNhYmxlcyBpdC4KLQotICAgIFxz
YSByZW5kZXJIaW50cywgUVBhaW50ZXI6OnJlbmRlckhpbnRzKCkKLSovCi12b2lkIFFHcmFwaGlj
c1dlYlZpZXc6OnNldFJlbmRlckhpbnQoUVBhaW50ZXI6OlJlbmRlckhpbnQgaGludCwgYm9vbCBl
bmFibGVkKQotewotICAgIFFQYWludGVyOjpSZW5kZXJIaW50cyBvbGRIaW50cyA9IGQtPnJlbmRl
ckhpbnRzOwotICAgIGlmIChlbmFibGVkKQotICAgICAgICBkLT5yZW5kZXJIaW50cyB8PSBoaW50
OwotICAgIGVsc2UKLSAgICAgICAgZC0+cmVuZGVySGludHMgJj0gfmhpbnQ7Ci0gICAgaWYgKG9s
ZEhpbnRzICE9IGQtPnJlbmRlckhpbnRzKQotICAgICAgICB1cGRhdGUoKTsKLX0KLQotLyohIFxy
ZWltcAotKi8KLWJvb2wgUUdyYXBoaWNzV2ViVmlldzo6ZXZlbnQoUUV2ZW50KiBldmVudCkKLXsK
LSAgICAvLyBSZS1pbXBsZW1lbnRlZCBpbiBvcmRlciB0byBhbGxvd3MgZml4aW5nIGV2ZW50LXJl
bGF0ZWQgYnVncyBpbiBwYXRjaCByZWxlYXNlcy4KLQotICAgIGlmIChkLT5wYWdlKSB7Ci0gICAg
ICAgIGlmIChldmVudC0+dHlwZSgpID09IFFFdmVudDo6UGFsZXR0ZUNoYW5nZSkKLSAgICAgICAg
ICAgIGQtPnBhZ2UtPnNldFBhbGV0dGUocGFsZXR0ZSgpKTsKLSNpZm5kZWYgUVRfTk9fQ09OVEVY
VE1FTlUKLSAgICAgICAgaWYgKGV2ZW50LT50eXBlKCkgPT0gUUV2ZW50OjpHcmFwaGljc1NjZW5l
Q29udGV4dE1lbnUpIHsKLSAgICAgICAgICAgIGlmICghaXNFbmFibGVkKCkpCi0gICAgICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICBRR3JhcGhpY3NTY2VuZUNvbnRleHRN
ZW51RXZlbnQqIGV2ID0gc3RhdGljX2Nhc3Q8UUdyYXBoaWNzU2NlbmVDb250ZXh0TWVudUV2ZW50
Kj4oZXZlbnQpOwotICAgICAgICAgICAgUUNvbnRleHRNZW51RXZlbnQgZmFrZUV2ZW50KFFDb250
ZXh0TWVudUV2ZW50OjpSZWFzb24oZXYtPnJlYXNvbigpKSwgZXYtPnBvcygpLnRvUG9pbnQoKSk7
Ci0gICAgICAgICAgICBpZiAoZC0+cGFnZS0+c3dhbGxvd0NvbnRleHRNZW51RXZlbnQoJmZha2VF
dmVudCkpIHsKLSAgICAgICAgICAgICAgICBldmVudC0+YWNjZXB0KCk7Ci0gICAgICAgICAgICAg
ICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkLT5wYWdlLT51cGRh
dGVQb3NpdGlvbkRlcGVuZGVudEFjdGlvbnMoZmFrZUV2ZW50LnBvcygpKTsKLSAgICAgICAgfSBl
bHNlCi0jZW5kaWYgLy8gUVRfTk9fQ09OVEVYVE1FTlUKLSAgICAgICAgewotI2lmbmRlZiBRVF9O
T19DVVJTT1IKLSAgICAgICAgICAgIGlmIChldmVudC0+dHlwZSgpID09IFFFdmVudDo6Q3Vyc29y
Q2hhbmdlKSB7Ci0gICAgICAgICAgICAgICAgLy8gQW4gdW5zZXRDdXJzb3Igd2lsbCBzZXQgdGhl
IGN1cnNvciB0byBRdDo6QXJyb3dDdXJzb3IuCi0gICAgICAgICAgICAgICAgLy8gVGh1cyB0aGlz
IGN1cnNvciBjaGFuZ2UgbWlnaHQgYmUgYSBRV2lkZ2V0Ojp1bnNldEN1cnNvcigpCi0gICAgICAg
ICAgICAgICAgLy8gSWYgdGhpcyBpcyBub3QgdGhlIGNhc2UgYW5kIGl0IGNhbWUgZnJvbSBXZWJD
b3JlLCB0aGUKLSAgICAgICAgICAgICAgICAvLyBRV2ViUGFnZUNsaWVudCBhbHJlYWR5IGhhcyBz
ZXQgaXRzIGN1cnNvciBpbnRlcm5hbGx5Ci0gICAgICAgICAgICAgICAgLy8gdG8gUXQ6OkFycm93
Q3Vyc29yLCBzbyB1cGRhdGluZyB0aGUgY3Vyc29yIGlzIGFsd2F5cwotICAgICAgICAgICAgICAg
IC8vIHJpZ2h0LCBhcyBpdCBmYWxscyBiYWNrIHRvIHRoZSBsYXN0IGN1cnNvciBzZXQgYnkKLSAg
ICAgICAgICAgICAgICAvLyBXZWJDb3JlLgotICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBBZGQg
YSBRRXZlbnQ6OkN1cnNvclVuc2V0IG9yIHNpbWlsYXIgdG8gUXQuCi0gICAgICAgICAgICAgICAg
aWYgKGN1cnNvcigpLnNoYXBlKCkgPT0gUXQ6OkFycm93Q3Vyc29yKQotICAgICAgICAgICAgICAg
ICAgICBkLT5wYWdlLT5kLT5jbGllbnQtPnJlc2V0Q3Vyc29yKCk7Ci0gICAgICAgICAgICB9Ci0j
ZW5kaWYKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gUUdyYXBoaWNzV2lkZ2V0OjpldmVu
dChldmVudCk7Ci19Ci0KLXZvaWQgUUdyYXBoaWNzV2ViVmlld1ByaXZhdGU6OmRldGFjaEN1cnJl
bnRQYWdlKCkKLXsKLSAgICBpZiAoIXBhZ2UpCi0gICAgICAgIHJldHVybjsKLQotICAgIHBhZ2Ut
PmQtPnZpZXcgPSAwOwotICAgIHBhZ2UtPmQtPmNsaWVudC5yZXNldCgpOwotCi0gICAgLy8gaWYg
dGhlIHBhZ2Ugd2FzIGNyZWF0ZWQgYnkgdXMsIHdlIG93biBpdCBhbmQgbmVlZCB0bwotICAgIC8v
IGRlc3Ryb3kgaXQgYXMgd2VsbC4KLQotICAgIGlmIChwYWdlLT5wYXJlbnQoKSA9PSBxKQotICAg
ICAgICBkZWxldGUgcGFnZTsKLSAgICBlbHNlCi0gICAgICAgIHBhZ2UtPmRpc2Nvbm5lY3QocSk7
Ci0KLSAgICBwYWdlID0gMDsKLX0KLQotLyohCi0gICAgTWFrZXMgXGEgcGFnZSB0aGUgbmV3IHdl
YiBwYWdlIG9mIHRoZSB3ZWIgZ3JhcGhpY3NpdGVtLgotCi0gICAgVGhlIHBhcmVudCBRT2JqZWN0
IG9mIHRoZSBwcm92aWRlZCBwYWdlIHJlbWFpbnMgdGhlIG93bmVyCi0gICAgb2YgdGhlIG9iamVj
dC4gSWYgdGhlIGN1cnJlbnQgZG9jdW1lbnQgaXMgYSBjaGlsZCBvZiB0aGUgd2ViCi0gICAgdmll
dywgaXQgd2lsbCBiZSBkZWxldGVkLgotCi0gICAgXHNhIHBhZ2UoKQotKi8KLXZvaWQgUUdyYXBo
aWNzV2ViVmlldzo6c2V0UGFnZShRV2ViUGFnZSogcGFnZSkKLXsKLSAgICBpZiAoZC0+cGFnZSA9
PSBwYWdlKQotICAgICAgICByZXR1cm47Ci0KLSAgICBkLT5kZXRhY2hDdXJyZW50UGFnZSgpOwot
ICAgIGQtPnBhZ2UgPSBwYWdlOwotCi0gICAgaWYgKCFkLT5wYWdlKQotICAgICAgICByZXR1cm47
Ci0KLSAgICBkLT5wYWdlLT5kLT5jbGllbnQucmVzZXQobmV3IFBhZ2VDbGllbnRRR3JhcGhpY3NX
aWRnZXQodGhpcywgcGFnZSkpOwotCi0gICAgaWYgKGQtPm92ZXJsYXkoKSkKLSAgICAgICAgZC0+
b3ZlcmxheSgpLT5wcmVwYXJlR3JhcGhpY3NJdGVtR2VvbWV0cnlDaGFuZ2UoKTsKLQotICAgIFFT
aXplIHNpemUgPSBnZW9tZXRyeSgpLnNpemUoKS50b1NpemUoKTsKLSAgICBwYWdlLT5zZXRWaWV3
cG9ydFNpemUoc2l6ZSk7Ci0KLSAgICBpZiAoZC0+cmVzaXplc1RvQ29udGVudHMpCi0gICAgICAg
IGQtPnVwZGF0ZVJlc2l6ZXNUb0NvbnRlbnRzRm9yUGFnZSgpOwotCi0gICAgUVdlYkZyYW1lKiBt
YWluRnJhbWUgPSBkLT5wYWdlLT5tYWluRnJhbWUoKTsKLQotICAgIGNvbm5lY3QobWFpbkZyYW1l
LCBTSUdOQUwodGl0bGVDaGFuZ2VkKFFTdHJpbmcpKSwKLSAgICAgICAgICAgIHRoaXMsIFNJR05B
TCh0aXRsZUNoYW5nZWQoUVN0cmluZykpKTsKLSAgICBjb25uZWN0KG1haW5GcmFtZSwgU0lHTkFM
KGljb25DaGFuZ2VkKCkpLAotICAgICAgICAgICAgdGhpcywgU0lHTkFMKGljb25DaGFuZ2VkKCkp
KTsKLSAgICBjb25uZWN0KG1haW5GcmFtZSwgU0lHTkFMKHVybENoYW5nZWQoUVVybCkpLAotICAg
ICAgICAgICAgdGhpcywgU0lHTkFMKHVybENoYW5nZWQoUVVybCkpKTsKLSAgICBjb25uZWN0KGQt
PnBhZ2UsIFNJR05BTChsb2FkU3RhcnRlZCgpKSwKLSAgICAgICAgICAgIHRoaXMsIFNJR05BTChs
b2FkU3RhcnRlZCgpKSk7Ci0gICAgY29ubmVjdChkLT5wYWdlLCBTSUdOQUwobG9hZFByb2dyZXNz
KGludCkpLAotICAgICAgICAgICAgdGhpcywgU0lHTkFMKGxvYWRQcm9ncmVzcyhpbnQpKSk7Ci0g
ICAgY29ubmVjdChkLT5wYWdlLCBTSUdOQUwobG9hZEZpbmlzaGVkKGJvb2wpKSwKLSAgICAgICAg
ICAgIHRoaXMsIFNMT1QoX3FfZG9Mb2FkRmluaXNoZWQoYm9vbCkpKTsKLSAgICBjb25uZWN0KGQt
PnBhZ2UsIFNJR05BTChzdGF0dXNCYXJNZXNzYWdlKFFTdHJpbmcpKSwKLSAgICAgICAgICAgIHRo
aXMsIFNJR05BTChzdGF0dXNCYXJNZXNzYWdlKFFTdHJpbmcpKSk7Ci0gICAgY29ubmVjdChkLT5w
YWdlLCBTSUdOQUwobGlua0NsaWNrZWQoUVVybCkpLAotICAgICAgICAgICAgdGhpcywgU0lHTkFM
KGxpbmtDbGlja2VkKFFVcmwpKSk7Ci0gICAgY29ubmVjdChkLT5wYWdlLCBTSUdOQUwoZGVzdHJv
eWVkKCkpLAotICAgICAgICAgICAgdGhpcywgU0xPVChfcV9wYWdlRGVzdHJveWVkKCkpKTsKLSNp
ZiAhZGVmaW5lZChRVF9OT19JTSkgJiYgKGRlZmluZWQoUV9XU19YMTEpIHx8IGRlZmluZWQoUV9X
U19RV1MpKQotICAgIGNvbm5lY3QoZC0+cGFnZSwgU0lHTkFMKG1pY3JvRm9jdXNDaGFuZ2VkKCkp
LAotICAgICAgICAgICAgdGhpcywgU0xPVCh1cGRhdGVNaWNyb0ZvY3VzKCkpKTsKLSNlbmRpZgot
fQotCi0vKiEKLSAgICBccHJvcGVydHkgUUdyYXBoaWNzV2ViVmlldzo6dXJsCi0gICAgXGJyaWVm
IHRoZSB1cmwgb2YgdGhlIHdlYiBwYWdlIGN1cnJlbnRseSB2aWV3ZWQKLQotICAgIFNldHRpbmcg
dGhpcyBwcm9wZXJ0eSBjbGVhcnMgdGhlIHZpZXcgYW5kIGxvYWRzIHRoZSBVUkwuCi0KLSAgICBC
eSBkZWZhdWx0LCB0aGlzIHByb3BlcnR5IGNvbnRhaW5zIGFuIGVtcHR5LCBpbnZhbGlkIFVSTC4K
LQotICAgIFxzYSBsb2FkKCksIHVybENoYW5nZWQoKQotKi8KLQotdm9pZCBRR3JhcGhpY3NXZWJW
aWV3OjpzZXRVcmwoY29uc3QgUVVybCAmdXJsKQotewotICAgIHBhZ2UoKS0+bWFpbkZyYW1lKCkt
PnNldFVybCh1cmwpOwotfQotCi1RVXJsIFFHcmFwaGljc1dlYlZpZXc6OnVybCgpIGNvbnN0Ci17
Ci0gICAgaWYgKGQtPnBhZ2UpCi0gICAgICAgIHJldHVybiBkLT5wYWdlLT5tYWluRnJhbWUoKS0+
dXJsKCk7Ci0KLSAgICByZXR1cm4gUVVybCgpOwotfQotCi0vKiEKLSAgICBccHJvcGVydHkgUUdy
YXBoaWNzV2ViVmlldzo6dGl0bGUKLSAgICBcYnJpZWYgdGhlIHRpdGxlIG9mIHRoZSB3ZWIgcGFn
ZSBjdXJyZW50bHkgdmlld2VkCi0KLSAgICBCeSBkZWZhdWx0LCB0aGlzIHByb3BlcnR5IGNvbnRh
aW5zIGFuIGVtcHR5IHN0cmluZy4KLQotICAgIFxzYSB0aXRsZUNoYW5nZWQoKQotKi8KLVFTdHJp
bmcgUUdyYXBoaWNzV2ViVmlldzo6dGl0bGUoKSBjb25zdAotewotICAgIGlmIChkLT5wYWdlKQot
ICAgICAgICByZXR1cm4gZC0+cGFnZS0+bWFpbkZyYW1lKCktPnRpdGxlKCk7Ci0KLSAgICByZXR1
cm4gUVN0cmluZygpOwotfQotCi0vKiEKLSAgICBccHJvcGVydHkgUUdyYXBoaWNzV2ViVmlldzo6
aWNvbgotICAgIFxicmllZiB0aGUgaWNvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHdlYiBwYWdlIGN1
cnJlbnRseSB2aWV3ZWQKLQotICAgIEJ5IGRlZmF1bHQsIHRoaXMgcHJvcGVydHkgY29udGFpbnMg
YSBudWxsIGljb24uCi0KLSAgICBcc2EgaWNvbkNoYW5nZWQoKSwgUVdlYlNldHRpbmdzOjppY29u
Rm9yVXJsKCkKLSovCi1RSWNvbiBRR3JhcGhpY3NXZWJWaWV3OjppY29uKCkgY29uc3QKLXsKLSAg
ICBpZiAoZC0+cGFnZSkKLSAgICAgICAgcmV0dXJuIGQtPnBhZ2UtPm1haW5GcmFtZSgpLT5pY29u
KCk7Ci0KLSAgICByZXR1cm4gUUljb24oKTsKLX0KLQotLyohCi0gICAgXHByb3BlcnR5IFFHcmFw
aGljc1dlYlZpZXc6Onpvb21GYWN0b3IKLSAgICBcYnJpZWYgdGhlIHpvb20gZmFjdG9yIGZvciB0
aGUgdmlldwotKi8KLQotdm9pZCBRR3JhcGhpY3NXZWJWaWV3OjpzZXRab29tRmFjdG9yKHFyZWFs
IGZhY3RvcikKLXsKLSAgICBpZiAoZmFjdG9yID09IHBhZ2UoKS0+bWFpbkZyYW1lKCktPnpvb21G
YWN0b3IoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgcGFnZSgpLT5tYWluRnJhbWUoKS0+c2V0
Wm9vbUZhY3RvcihmYWN0b3IpOwotfQotCi1xcmVhbCBRR3JhcGhpY3NXZWJWaWV3Ojp6b29tRmFj
dG9yKCkgY29uc3QKLXsKLSAgICByZXR1cm4gcGFnZSgpLT5tYWluRnJhbWUoKS0+em9vbUZhY3Rv
cigpOwotfQotCi0vKiEgXHJlaW1wCi0qLwotdm9pZCBRR3JhcGhpY3NXZWJWaWV3Ojp1cGRhdGVH
ZW9tZXRyeSgpCi17Ci0gICAgaWYgKGQtPm92ZXJsYXkoKSkKLSAgICAgICAgZC0+b3ZlcmxheSgp
LT5wcmVwYXJlR3JhcGhpY3NJdGVtR2VvbWV0cnlDaGFuZ2UoKTsKLQotICAgIFFHcmFwaGljc1dp
ZGdldDo6dXBkYXRlR2VvbWV0cnkoKTsKLQotICAgIGlmICghZC0+cGFnZSkKLSAgICAgICAgcmV0
dXJuOwotCi0gICAgUVNpemUgc2l6ZSA9IGdlb21ldHJ5KCkuc2l6ZSgpLnRvU2l6ZSgpOwotICAg
IGQtPnBhZ2UtPnNldFZpZXdwb3J0U2l6ZShzaXplKTsKLX0KLQotLyohIFxyZWltcAotKi8KLXZv
aWQgUUdyYXBoaWNzV2ViVmlldzo6c2V0R2VvbWV0cnkoY29uc3QgUVJlY3RGJiByZWN0KQotewot
ICAgIFFHcmFwaGljc1dpZGdldDo6c2V0R2VvbWV0cnkocmVjdCk7Ci0KLSAgICBpZiAoZC0+b3Zl
cmxheSgpKQotICAgICAgICBkLT5vdmVybGF5KCktPnByZXBhcmVHcmFwaGljc0l0ZW1HZW9tZXRy
eUNoYW5nZSgpOwotCi0gICAgaWYgKCFkLT5wYWdlKQotICAgICAgICByZXR1cm47Ci0KLSAgICAv
LyBOT1RFOiBjYWxsIGdlb21ldHJ5KCkgYXMgc2V0R2VvbWV0cnkgZW5zdXJlcyB0aGF0Ci0gICAg
Ly8gdGhlIGdlb21ldHJ5IGlzIHdpdGhpbiBsZWdhbCBib3VuZHMgKG1pbmltdW1TaXplLCBtYXhp
bXVtU2l6ZSkKLSAgICBRU2l6ZSBzaXplID0gZ2VvbWV0cnkoKS5zaXplKCkudG9TaXplKCk7Ci0g
ICAgZC0+cGFnZS0+c2V0Vmlld3BvcnRTaXplKHNpemUpOwotfQotCi0vKiEKLSAgICBDb252ZW5p
ZW5jZSBzbG90IHRoYXQgc3RvcHMgbG9hZGluZyB0aGUgZG9jdW1lbnQuCi0KLSAgICBcc2EgcmVs
b2FkKCksIGxvYWRGaW5pc2hlZCgpCi0qLwotdm9pZCBRR3JhcGhpY3NXZWJWaWV3OjpzdG9wKCkK
LXsKLSAgICBpZiAoZC0+cGFnZSkKLSAgICAgICAgZC0+cGFnZS0+dHJpZ2dlckFjdGlvbihRV2Vi
UGFnZTo6U3RvcCk7Ci19Ci0KLS8qIQotICAgIENvbnZlbmllbmNlIHNsb3QgdGhhdCBsb2FkcyB0
aGUgcHJldmlvdXMgZG9jdW1lbnQgaW4gdGhlIGxpc3Qgb2YgZG9jdW1lbnRzCi0gICAgYnVpbHQg
YnkgbmF2aWdhdGluZyBsaW5rcy4gRG9lcyBub3RoaW5nIGlmIHRoZXJlIGlzIG5vIHByZXZpb3Vz
IGRvY3VtZW50LgotCi0gICAgXHNhIGZvcndhcmQoKQotKi8KLXZvaWQgUUdyYXBoaWNzV2ViVmll
dzo6YmFjaygpCi17Ci0gICAgaWYgKGQtPnBhZ2UpCi0gICAgICAgIGQtPnBhZ2UtPnRyaWdnZXJB
Y3Rpb24oUVdlYlBhZ2U6OkJhY2spOwotfQotCi0vKiEKLSAgICBDb252ZW5pZW5jZSBzbG90IHRo
YXQgbG9hZHMgdGhlIG5leHQgZG9jdW1lbnQgaW4gdGhlIGxpc3Qgb2YgZG9jdW1lbnRzCi0gICAg
YnVpbHQgYnkgbmF2aWdhdGluZyBsaW5rcy4gRG9lcyBub3RoaW5nIGlmIHRoZXJlIGlzIG5vIG5l
eHQgZG9jdW1lbnQuCi0KLSAgICBcc2EgYmFjaygpCi0qLwotdm9pZCBRR3JhcGhpY3NXZWJWaWV3
Ojpmb3J3YXJkKCkKLXsKLSAgICBpZiAoZC0+cGFnZSkKLSAgICAgICAgZC0+cGFnZS0+dHJpZ2dl
ckFjdGlvbihRV2ViUGFnZTo6Rm9yd2FyZCk7Ci19Ci0KLS8qIQotICAgIFJlbG9hZHMgdGhlIGN1
cnJlbnQgZG9jdW1lbnQuCi0KLSAgICBcc2Egc3RvcCgpLCBsb2FkU3RhcnRlZCgpCi0qLwotdm9p
ZCBRR3JhcGhpY3NXZWJWaWV3OjpyZWxvYWQoKQotewotICAgIGlmIChkLT5wYWdlKQotICAgICAg
ICBkLT5wYWdlLT50cmlnZ2VyQWN0aW9uKFFXZWJQYWdlOjpSZWxvYWQpOwotfQotCi0vKiEKLSAg
ICBMb2FkcyB0aGUgc3BlY2lmaWVkIFxhIHVybCBhbmQgZGlzcGxheXMgaXQuCi0KLSAgICBcbm90
ZSBUaGUgdmlldyByZW1haW5zIHRoZSBzYW1lIHVudGlsIGVub3VnaCBkYXRhIGhhcyBhcnJpdmVk
IHRvIGRpc3BsYXkgdGhlIG5ldyBcYSB1cmwuCi0KLSAgICBcc2Egc2V0VXJsKCksIHVybCgpLCB1
cmxDaGFuZ2VkKCkKLSovCi12b2lkIFFHcmFwaGljc1dlYlZpZXc6OmxvYWQoY29uc3QgUVVybCYg
dXJsKQotewotICAgIHBhZ2UoKS0+bWFpbkZyYW1lKCktPmxvYWQodXJsKTsKLX0KLQotLyohCi0g
ICAgXGZuIHZvaWQgUUdyYXBoaWNzV2ViVmlldzo6bG9hZChjb25zdCBRTmV0d29ya1JlcXVlc3Qg
JnJlcXVlc3QsIFFOZXR3b3JrQWNjZXNzTWFuYWdlcjo6T3BlcmF0aW9uIG9wZXJhdGlvbiwgY29u
c3QgUUJ5dGVBcnJheSAmYm9keSkKLQotICAgIExvYWRzIGEgbmV0d29yayByZXF1ZXN0LCBcYSBy
ZXF1ZXN0LCB1c2luZyB0aGUgbWV0aG9kIHNwZWNpZmllZCBpbiBcYSBvcGVyYXRpb24uCi0KLSAg
ICBcYSBib2R5IGlzIG9wdGlvbmFsIGFuZCBpcyBvbmx5IHVzZWQgZm9yIFBPU1Qgb3BlcmF0aW9u
cy4KLQotICAgIFxub3RlIFRoZSB2aWV3IHJlbWFpbnMgdGhlIHNhbWUgdW50aWwgZW5vdWdoIGRh
dGEgaGFzIGFycml2ZWQgdG8gZGlzcGxheSB0aGUgbmV3IHVybC4KLQotICAgIFxzYSB1cmwoKSwg
dXJsQ2hhbmdlZCgpCi0qLwotCi12b2lkIFFHcmFwaGljc1dlYlZpZXc6OmxvYWQoY29uc3QgUU5l
dHdvcmtSZXF1ZXN0JiByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICBRTmV0d29ya0FjY2Vz
c01hbmFnZXI6Ok9wZXJhdGlvbiBvcGVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0
IFFCeXRlQXJyYXkmIGJvZHkpCi17Ci0gICAgcGFnZSgpLT5tYWluRnJhbWUoKS0+bG9hZChyZXF1
ZXN0LCBvcGVyYXRpb24sIGJvZHkpOwotfQotCi0vKiEKLSAgICBTZXRzIHRoZSBjb250ZW50IG9m
IHRoZSB3ZWIgdmlldyB0byB0aGUgc3BlY2lmaWVkIFxhIGh0bWwuCi0KLSAgICBFeHRlcm5hbCBv
YmplY3RzIHN1Y2ggYXMgc3R5bGVzaGVldHMgb3IgaW1hZ2VzIHJlZmVyZW5jZWQgaW4gdGhlIEhU
TUwKLSAgICBkb2N1bWVudCBhcmUgbG9jYXRlZCByZWxhdGl2ZSB0byBcYSBiYXNlVXJsLgotCi0g
ICAgVGhlIFxhIGh0bWwgaXMgbG9hZGVkIGltbWVkaWF0ZWx5OyBleHRlcm5hbCBvYmplY3RzIGFy
ZSBsb2FkZWQgYXN5bmNocm9ub3VzbHkuCi0KLSAgICBXaGVuIHVzaW5nIHRoaXMgbWV0aG9kLCBX
ZWJLaXQgYXNzdW1lcyB0aGF0IGV4dGVybmFsIHJlc291cmNlcyBzdWNoIGFzCi0gICAgSmF2YVNj
cmlwdCBwcm9ncmFtcyBvciBzdHlsZSBzaGVldHMgYXJlIGVuY29kZWQgaW4gVVRGLTggdW5sZXNz
IG90aGVyd2lzZQotICAgIHNwZWNpZmllZC4gRm9yIGV4YW1wbGUsIHRoZSBlbmNvZGluZyBvZiBh
biBleHRlcm5hbCBzY3JpcHQgY2FuIGJlIHNwZWNpZmllZAotICAgIHRocm91Z2ggdGhlIGNoYXJz
ZXQgYXR0cmlidXRlIG9mIHRoZSBIVE1MIHNjcmlwdCB0YWcuIEFsdGVybmF0aXZlbHksIHRoZQot
ICAgIGVuY29kaW5nIGNhbiBhbHNvIGJlIHNwZWNpZmllZCBieSB0aGUgd2ViIHNlcnZlci4KLQot
ICAgIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBmdW5jdGlvbiBlcXVpdmFsZW50IHRvIHNldENvbnRl
bnQoaHRtbCwgInRleHQvaHRtbCIsIGJhc2VVcmwpLgotCi0gICAgXHdhcm5pbmcgVGhpcyBmdW5j
dGlvbiB3b3JrcyBvbmx5IGZvciBIVE1MLCBmb3Igb3RoZXIgbWltZSB0eXBlcyAoaS5lLiBYSFRN
TCwgU1ZHKQotICAgIHNldENvbnRlbnQoKSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgotCi0gICAg
XHNhIGxvYWQoKSwgc2V0Q29udGVudCgpLCBRV2ViRnJhbWU6OnRvSHRtbCgpLCBRV2ViRnJhbWU6
OnNldENvbnRlbnQoKQotKi8KLXZvaWQgUUdyYXBoaWNzV2ViVmlldzo6c2V0SHRtbChjb25zdCBR
U3RyaW5nJiBodG1sLCBjb25zdCBRVXJsJiBiYXNlVXJsKQotewotICAgIHBhZ2UoKS0+bWFpbkZy
YW1lKCktPnNldEh0bWwoaHRtbCwgYmFzZVVybCk7Ci19Ci0KLS8qIQotICAgIFNldHMgdGhlIGNv
bnRlbnQgb2YgdGhlIHdlYiBncmFwaGljc2l0ZW0gdG8gdGhlIHNwZWNpZmllZCBjb250ZW50IFxh
IGRhdGEuIElmIHRoZSBcYSBtaW1lVHlwZSBhcmd1bWVudAotICAgIGlzIGVtcHR5IGl0IGlzIGN1
cnJlbnRseSBhc3N1bWVkIHRoYXQgdGhlIGNvbnRlbnQgaXMgSFRNTCBidXQgaW4gZnV0dXJlIHZl
cnNpb25zIHdlIG1heSBpbnRyb2R1Y2UKLSAgICBhdXRvLWRldGVjdGlvbi4KLQotICAgIEV4dGVy
bmFsIG9iamVjdHMgcmVmZXJlbmNlZCBpbiB0aGUgY29udGVudCBhcmUgbG9jYXRlZCByZWxhdGl2
ZSB0byBcYSBiYXNlVXJsLgotCi0gICAgVGhlIFxhIGRhdGEgaXMgbG9hZGVkIGltbWVkaWF0ZWx5
OyBleHRlcm5hbCBvYmplY3RzIGFyZSBsb2FkZWQgYXN5bmNocm9ub3VzbHkuCi0KLSAgICBcc2Eg
bG9hZCgpLCBzZXRIdG1sKCksIFFXZWJGcmFtZTo6dG9IdG1sKCkKLSovCi12b2lkIFFHcmFwaGlj
c1dlYlZpZXc6OnNldENvbnRlbnQoY29uc3QgUUJ5dGVBcnJheSYgZGF0YSwgY29uc3QgUVN0cmlu
ZyYgbWltZVR5cGUsIGNvbnN0IFFVcmwmIGJhc2VVcmwpCi17Ci0gICAgcGFnZSgpLT5tYWluRnJh
bWUoKS0+c2V0Q29udGVudChkYXRhLCBtaW1lVHlwZSwgYmFzZVVybCk7Ci19Ci0KLS8qIQotICAg
IFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSB2aWV3J3MgaGlzdG9yeSBvZiBuYXZpZ2F0ZWQgd2Vi
IHBhZ2VzLgotCi0gICAgSXQgaXMgZXF1aXZhbGVudCB0bwotCi0gICAgXHNuaXBwZXQgd2Via2l0
c25pcHBldHMvcXR3ZWJraXRfcXdlYnZpZXdfc25pcHBldC5jcHAgMAotKi8KLVFXZWJIaXN0b3J5
KiBRR3JhcGhpY3NXZWJWaWV3OjpoaXN0b3J5KCkgY29uc3QKLXsKLSAgICByZXR1cm4gcGFnZSgp
LT5oaXN0b3J5KCk7Ci19Ci0KLS8qIQotICAgIFxwcm9wZXJ0eSBRR3JhcGhpY3NXZWJWaWV3Ojpt
b2RpZmllZAotICAgIFxicmllZiB3aGV0aGVyIHRoZSBkb2N1bWVudCB3YXMgbW9kaWZpZWQgYnkg
dGhlIHVzZXIKLQotICAgIFBhcnRzIG9mIEhUTUwgZG9jdW1lbnRzIGNhbiBiZSBlZGl0YWJsZSBm
b3IgZXhhbXBsZSB0aHJvdWdoIHRoZQotICAgIFxje2NvbnRlbnRlZGl0YWJsZX0gYXR0cmlidXRl
IG9uIEhUTUwgZWxlbWVudHMuCi0KLSAgICBCeSBkZWZhdWx0LCB0aGlzIHByb3BlcnR5IGlzIGZh
bHNlLgotKi8KLWJvb2wgUUdyYXBoaWNzV2ViVmlldzo6aXNNb2RpZmllZCgpIGNvbnN0Ci17Ci0g
ICAgaWYgKGQtPnBhZ2UpCi0gICAgICAgIHJldHVybiBkLT5wYWdlLT5pc01vZGlmaWVkKCk7Ci0g
ICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiEKLSAgICBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUg
dmlldy9wYWdlIHNwZWNpZmljIHNldHRpbmdzIG9iamVjdC4KLQotICAgIEl0IGlzIGVxdWl2YWxl
bnQgdG8KLQotICAgIFxzbmlwcGV0IHdlYmtpdHNuaXBwZXRzL3F0d2Via2l0X3F3ZWJ2aWV3X3Nu
aXBwZXQuY3BwIDEKLQotICAgIFxzYSBRV2ViU2V0dGluZ3M6Omdsb2JhbFNldHRpbmdzKCkKLSov
Ci1RV2ViU2V0dGluZ3MqIFFHcmFwaGljc1dlYlZpZXc6OnNldHRpbmdzKCkgY29uc3QKLXsKLSAg
ICByZXR1cm4gcGFnZSgpLT5zZXR0aW5ncygpOwotfQotCi0vKiEKLSAgICBSZXR1cm5zIGEgcG9p
bnRlciB0byBhIFFBY3Rpb24gdGhhdCBlbmNhcHN1bGF0ZXMgdGhlIHNwZWNpZmllZCB3ZWIgYWN0
aW9uIFxhIGFjdGlvbi4KLSovCi1RQWN0aW9uICpRR3JhcGhpY3NXZWJWaWV3OjpwYWdlQWN0aW9u
KFFXZWJQYWdlOjpXZWJBY3Rpb24gYWN0aW9uKSBjb25zdAotewotI2lmZGVmIFFUX05PX0FDVElP
TgotICAgIFFfVU5VU0VEKGFjdGlvbikKLSAgICByZXR1cm4gMDsKLSNlbHNlCi0gICAgcmV0dXJu
IHBhZ2UoKS0+YWN0aW9uKGFjdGlvbik7Ci0jZW5kaWYKLX0KLQotLyohCi0gICAgVHJpZ2dlcnMg
dGhlIHNwZWNpZmllZCBcYSBhY3Rpb24uIElmIGl0IGlzIGEgY2hlY2thYmxlIGFjdGlvbiB0aGUg
c3BlY2lmaWVkCi0gICAgXGEgY2hlY2tlZCBzdGF0ZSBpcyBhc3N1bWVkLgotCi0gICAgXHNhIHBh
Z2VBY3Rpb24oKQotKi8KLXZvaWQgUUdyYXBoaWNzV2ViVmlldzo6dHJpZ2dlclBhZ2VBY3Rpb24o
UVdlYlBhZ2U6OldlYkFjdGlvbiBhY3Rpb24sIGJvb2wgY2hlY2tlZCkKLXsKLSAgICBwYWdlKCkt
PnRyaWdnZXJBY3Rpb24oYWN0aW9uLCBjaGVja2VkKTsKLX0KLQotLyohCi0gICAgRmluZHMgdGhl
IHNwZWNpZmllZCBzdHJpbmcsIFxhIHN1YlN0cmluZywgaW4gdGhlIHBhZ2UsIHVzaW5nIHRoZSBn
aXZlbiBcYSBvcHRpb25zLgotCi0gICAgSWYgdGhlIEhpZ2hsaWdodEFsbE9jY3VycmVuY2VzIGZs
YWcgaXMgcGFzc2VkLCB0aGUgZnVuY3Rpb24gd2lsbCBoaWdobGlnaHQgYWxsIG9jY3VycmVuY2Vz
Ci0gICAgdGhhdCBleGlzdCBpbiB0aGUgcGFnZS4gQWxsIHN1YnNlcXVlbnQgY2FsbHMgd2lsbCBl
eHRlbmQgdGhlIGhpZ2hsaWdodCwgcmF0aGVyIHRoYW4KLSAgICByZXBsYWNlIGl0LCB3aXRoIG9j
Y3VycmVuY2VzIG9mIHRoZSBuZXcgc3RyaW5nLgotCi0gICAgSWYgdGhlIEhpZ2hsaWdodEFsbE9j
Y3VycmVuY2VzIGZsYWcgaXMgbm90IHBhc3NlZCwgdGhlIGZ1bmN0aW9uIHdpbGwgc2VsZWN0IGFu
IG9jY3VycmVuY2UKLSAgICBhbmQgYWxsIHN1YnNlcXVlbnQgY2FsbHMgd2lsbCByZXBsYWNlIHRo
ZSBjdXJyZW50IG9jY3VycmVuY2Ugd2l0aCB0aGUgbmV4dCBvbmUuCi0KLSAgICBUbyBjbGVhciB0
aGUgc2VsZWN0aW9uLCBqdXN0IHBhc3MgYW4gZW1wdHkgc3RyaW5nLgotCi0gICAgUmV0dXJucyB0
cnVlIGlmIFxhIHN1YlN0cmluZyB3YXMgZm91bmQ7IG90aGVyd2lzZSByZXR1cm5zIGZhbHNlLgot
Ci0gICAgXHNhIFFXZWJQYWdlOjpzZWxlY3RlZFRleHQoKSwgUVdlYlBhZ2U6OnNlbGVjdGlvbkNo
YW5nZWQoKQotKi8KLWJvb2wgUUdyYXBoaWNzV2ViVmlldzo6ZmluZFRleHQoY29uc3QgUVN0cmlu
ZyAmc3ViU3RyaW5nLCBRV2ViUGFnZTo6RmluZEZsYWdzIG9wdGlvbnMpCi17Ci0gICAgaWYgKGQt
PnBhZ2UpCi0gICAgICAgIHJldHVybiBkLT5wYWdlLT5maW5kVGV4dChzdWJTdHJpbmcsIG9wdGlv
bnMpOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyohCi0gICAgXHByb3BlcnR5IFFHcmFwaGlj
c1dlYlZpZXc6OnJlc2l6ZXNUb0NvbnRlbnRzCi0gICAgXGJyaWVmIHdoZXRoZXIgdGhlIHNpemUg
b2YgdGhlIFFHcmFwaGljc1dlYlZpZXcgYW5kIGl0cyB2aWV3cG9ydCBjaGFuZ2VzIHRvIG1hdGNo
IHRoZSBjb250ZW50cyBzaXplCi0gICAgXHNpbmNlIDQuNyAKLQotICAgIElmIHRoaXMgcHJvcGVy
dHkgaXMgc2V0LCB0aGUgUUdyYXBoaWNzV2ViVmlldyB3aWxsIGF1dG9tYXRpY2FsbHkgY2hhbmdl
IGl0cwotICAgIHNpemUgdG8gbWF0Y2ggdGhlIHNpemUgb2YgdGhlIG1haW4gZnJhbWUgY29udGVu
dHMuIEFzIGEgcmVzdWx0IHRoZSB0b3AgbGV2ZWwgZnJhbWUKLSAgICB3aWxsIG5ldmVyIGhhdmUg
c2Nyb2xsYmFycy4gSXQgd2lsbCBhbHNvIG1ha2UgQ1NTIGZpeGVkIHBvc2l0aW9uaW5nIHRvIGJl
aGF2ZSBsaWtlIGFic29sdXRlIHBvc2l0aW9uaW5nCi0gICAgd2l0aCBlbGVtZW50cyBwb3NpdGlv
bmVkIHJlbGF0aXZlIHRvIHRoZSBkb2N1bWVudCBpbnN0ZWFkIG9mIHRoZSB2aWV3cG9ydC4KLQot
ICAgIFRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUg
UVdlYlBhZ2U6OnByZWZlcnJlZENvbnRlbnRzU2l6ZSBwcm9wZXJ0eS4KLSAgICBJZiBub3QgZXhw
bGljaXRseSBzZXQsIHRoZSBwcmVmZXJyZWRDb250ZW50c1NpemUgaXMgYXV0b21hdGljYWxseSBz
ZXQgdG8gYSByZWFzb25hYmxlIHZhbHVlLgotCi0gICAgXHNhIFFXZWJQYWdlOjpzZXRQcmVmZXJy
ZWRDb250ZW50c1NpemUoKQotKi8KLXZvaWQgUUdyYXBoaWNzV2ViVmlldzo6c2V0UmVzaXplc1Rv
Q29udGVudHMoYm9vbCBlbmFibGVkKQotewotICAgIGlmIChkLT5yZXNpemVzVG9Db250ZW50cyA9
PSBlbmFibGVkKQotICAgICAgICByZXR1cm47Ci0gICAgZC0+cmVzaXplc1RvQ29udGVudHMgPSBl
bmFibGVkOwotICAgIGlmIChkLT5wYWdlKQotICAgICAgICBkLT51cGRhdGVSZXNpemVzVG9Db250
ZW50c0ZvclBhZ2UoKTsKLX0KLQotYm9vbCBRR3JhcGhpY3NXZWJWaWV3OjpyZXNpemVzVG9Db250
ZW50cygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGQtPnJlc2l6ZXNUb0NvbnRlbnRzOwotfQotCi0v
KiEKLSAgICBccHJvcGVydHkgUUdyYXBoaWNzV2ViVmlldzo6dGlsZWRCYWNraW5nU3RvcmVGcm96
ZW4KLSAgICBcYnJpZWYgd2hldGhlciB0aGUgdGlsZWQgYmFja2luZyBzdG9yZSB1cGRhdGVzIGl0
cyBjb250ZW50cwotICAgIFxzaW5jZSA0LjcgCi0KLSAgICBJZiB0aGUgdGlsZWQgYmFja2luZyBz
dG9yZSBpcyBlbmFibGVkIHVzaW5nIFFXZWJTZXR0aW5nczo6VGlsZWRCYWNraW5nU3RvcmVFbmFi
bGVkIGF0dHJpYnV0ZSwgdGhpcyBwcm9wZXJ0eQotICAgIGNhbiBiZSB1c2VkIHRvIGRpc2FibGUg
YmFja2luZyBzdG9yZSB1cGRhdGVzIHRlbXBvcmFyaWx5LiBUaGlzIGNhbiBiZSB1c2VmdWwgZm9y
IGV4YW1wbGUgZm9yIHJ1bm5pbmcKLSAgICBhIHNtb290aCBhbmltYXRpb24gdGhhdCBjaGFuZ2Vz
IHRoZSBzY2FsZSBvZiB0aGUgUUdyYXBoaWNzV2ViVmlldy4KLSAKLSAgICBXaGVuIHRoZSBiYWNr
aW5nIHN0b3JlIGlzIHVuZnJvemVuLCBpdHMgY29udGVudHMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5
IHVwZGF0ZWQgdG8gbWF0Y2ggdGhlIGN1cnJlbnQKLSAgICBzdGF0ZSBvZiB0aGUgZG9jdW1lbnQu
IElmIHRoZSBRR3JhcGhpY3NXZWJWaWV3IHNjYWxlIHdhcyBjaGFuZ2VkLCB0aGUgYmFja2luZyBz
dG9yZSBpcyBhbHNvCi0gICAgcmUtcmVuZGVyZWQgdXNpbmcgdGhlIG5ldyBzY2FsZS4KLSAKLSAg
ICBJZiB0aGUgdGlsZWQgYmFja2luZyBzdG9yZSBpcyBub3QgZW5hYmxlZCwgdGhpcyBwcm9wZXJ0
eSBkb2VzIG5vdGhpbmcuCi0KLSAgICBcc2EgUVdlYlNldHRpbmdzOjpUaWxlZEJhY2tpbmdTdG9y
ZUVuYWJsZWQKLSAgICBcc2EgUUdyYXBoaWNzT2JqZWN0OjpzY2FsZQotKi8KLWJvb2wgUUdyYXBo
aWNzV2ViVmlldzo6aXNUaWxlZEJhY2tpbmdTdG9yZUZyb3plbigpIGNvbnN0Ci17Ci0jaWYgVVNF
KFRJTEVEX0JBQ0tJTkdfU1RPUkUpCi0gICAgV2ViQ29yZTo6VGlsZWRCYWNraW5nU3RvcmUqIGJh
Y2tpbmdTdG9yZSA9IFFXZWJGcmFtZVByaXZhdGU6OmNvcmUocGFnZSgpLT5tYWluRnJhbWUoKSkt
PnRpbGVkQmFja2luZ1N0b3JlKCk7Ci0gICAgaWYgKCFiYWNraW5nU3RvcmUpCi0gICAgICAgIHJl
dHVybiBmYWxzZTsKLSAgICByZXR1cm4gYmFja2luZ1N0b3JlLT5jb250ZW50c0Zyb3plbigpOwot
I2Vsc2UKLSAgICByZXR1cm4gZmFsc2U7Ci0jZW5kaWYKLX0KLQotdm9pZCBRR3JhcGhpY3NXZWJW
aWV3OjpzZXRUaWxlZEJhY2tpbmdTdG9yZUZyb3plbihib29sIGZyb3plbikKLXsKLSNpZiBVU0Uo
VElMRURfQkFDS0lOR19TVE9SRSkKLSAgICBXZWJDb3JlOjpUaWxlZEJhY2tpbmdTdG9yZSogYmFj
a2luZ1N0b3JlID0gUVdlYkZyYW1lUHJpdmF0ZTo6Y29yZShwYWdlKCktPm1haW5GcmFtZSgpKS0+
dGlsZWRCYWNraW5nU3RvcmUoKTsKLSAgICBpZiAoIWJhY2tpbmdTdG9yZSkKLSAgICAgICAgcmV0
dXJuOwotICAgIGJhY2tpbmdTdG9yZS0+c2V0Q29udGVudHNGcm96ZW4oZnJvemVuKTsKLSNlbHNl
Ci0gICAgVU5VU0VEX1BBUkFNKGZyb3plbik7Ci0jZW5kaWYKLX0KLQotLyohIFxyZWltcAotKi8K
LXZvaWQgUUdyYXBoaWNzV2ViVmlldzo6aG92ZXJNb3ZlRXZlbnQoUUdyYXBoaWNzU2NlbmVIb3Zl
ckV2ZW50KiBldikKLXsKLSAgICBpZiAoZC0+cGFnZSkgewotICAgICAgICBjb25zdCBib29sIGFj
Y2VwdGVkID0gZXYtPmlzQWNjZXB0ZWQoKTsKLSAgICAgICAgUU1vdXNlRXZlbnQgbWUgPSBRTW91
c2VFdmVudChRRXZlbnQ6Ok1vdXNlTW92ZSwKLSAgICAgICAgICAgICAgICBldi0+cG9zKCkudG9Q
b2ludCgpLCBRdDo6Tm9CdXR0b24sCi0gICAgICAgICAgICAgICAgUXQ6Ok5vQnV0dG9uLCBRdDo6
Tm9Nb2RpZmllcik7Ci0gICAgICAgIGQtPnBhZ2UtPmV2ZW50KCZtZSk7Ci0gICAgICAgIGV2LT5z
ZXRBY2NlcHRlZChhY2NlcHRlZCk7Ci0gICAgfQotCi0gICAgaWYgKCFldi0+aXNBY2NlcHRlZCgp
KQotICAgICAgICBRR3JhcGhpY3NJdGVtOjpob3Zlck1vdmVFdmVudChldik7Ci19Ci0KLS8qISBc
cmVpbXAKLSovCi12b2lkIFFHcmFwaGljc1dlYlZpZXc6OmhvdmVyTGVhdmVFdmVudChRR3JhcGhp
Y3NTY2VuZUhvdmVyRXZlbnQqIGV2KQotewotICAgIFFfVU5VU0VEKGV2KTsKLX0KLQotLyohIFxy
ZWltcAotKi8KLXZvaWQgUUdyYXBoaWNzV2ViVmlldzo6bW91c2VNb3ZlRXZlbnQoUUdyYXBoaWNz
U2NlbmVNb3VzZUV2ZW50KiBldikKLXsKLSAgICBpZiAoZC0+cGFnZSkgewotICAgICAgICBjb25z
dCBib29sIGFjY2VwdGVkID0gZXYtPmlzQWNjZXB0ZWQoKTsKLSAgICAgICAgZC0+cGFnZS0+ZXZl
bnQoZXYpOwotICAgICAgICBldi0+c2V0QWNjZXB0ZWQoYWNjZXB0ZWQpOwotICAgIH0KLQotICAg
IGlmICghZXYtPmlzQWNjZXB0ZWQoKSkKLSAgICAgICAgUUdyYXBoaWNzSXRlbTo6bW91c2VNb3Zl
RXZlbnQoZXYpOwotfQotCi0vKiEgXHJlaW1wCi0qLwotdm9pZCBRR3JhcGhpY3NXZWJWaWV3Ojpt
b3VzZVByZXNzRXZlbnQoUUdyYXBoaWNzU2NlbmVNb3VzZUV2ZW50KiBldikKLXsKLSAgICBpZiAo
ZC0+cGFnZSkgewotICAgICAgICBjb25zdCBib29sIGFjY2VwdGVkID0gZXYtPmlzQWNjZXB0ZWQo
KTsKLSAgICAgICAgZC0+cGFnZS0+ZXZlbnQoZXYpOwotICAgICAgICBldi0+c2V0QWNjZXB0ZWQo
YWNjZXB0ZWQpOwotICAgIH0KLQotICAgIGlmICghZXYtPmlzQWNjZXB0ZWQoKSkKLSAgICAgICAg
UUdyYXBoaWNzSXRlbTo6bW91c2VQcmVzc0V2ZW50KGV2KTsKLX0KLQotLyohIFxyZWltcAotKi8K
LXZvaWQgUUdyYXBoaWNzV2ViVmlldzo6bW91c2VSZWxlYXNlRXZlbnQoUUdyYXBoaWNzU2NlbmVN
b3VzZUV2ZW50KiBldikKLXsKLSAgICBpZiAoZC0+cGFnZSkgewotICAgICAgICBjb25zdCBib29s
IGFjY2VwdGVkID0gZXYtPmlzQWNjZXB0ZWQoKTsKLSAgICAgICAgZC0+cGFnZS0+ZXZlbnQoZXYp
OwotICAgICAgICBldi0+c2V0QWNjZXB0ZWQoYWNjZXB0ZWQpOwotICAgIH0KLQotICAgIGlmICgh
ZXYtPmlzQWNjZXB0ZWQoKSkKLSAgICAgICAgUUdyYXBoaWNzSXRlbTo6bW91c2VSZWxlYXNlRXZl
bnQoZXYpOwotfQotCi0vKiEgXHJlaW1wCi0qLwotdm9pZCBRR3JhcGhpY3NXZWJWaWV3Ojptb3Vz
ZURvdWJsZUNsaWNrRXZlbnQoUUdyYXBoaWNzU2NlbmVNb3VzZUV2ZW50KiBldikKLXsKLSAgICBp
ZiAoZC0+cGFnZSkgewotICAgICAgICBjb25zdCBib29sIGFjY2VwdGVkID0gZXYtPmlzQWNjZXB0
ZWQoKTsKLSAgICAgICAgZC0+cGFnZS0+ZXZlbnQoZXYpOwotICAgICAgICBldi0+c2V0QWNjZXB0
ZWQoYWNjZXB0ZWQpOwotICAgIH0KLQotICAgIGlmICghZXYtPmlzQWNjZXB0ZWQoKSkKLSAgICAg
ICAgUUdyYXBoaWNzSXRlbTo6bW91c2VEb3VibGVDbGlja0V2ZW50KGV2KTsKLX0KLQotLyohIFxy
ZWltcAotKi8KLXZvaWQgUUdyYXBoaWNzV2ViVmlldzo6a2V5UHJlc3NFdmVudChRS2V5RXZlbnQq
IGV2KQotewotICAgIGlmIChkLT5wYWdlKQotICAgICAgICBkLT5wYWdlLT5ldmVudChldik7Ci0K
LSAgICBpZiAoIWV2LT5pc0FjY2VwdGVkKCkpCi0gICAgICAgIFFHcmFwaGljc0l0ZW06OmtleVBy
ZXNzRXZlbnQoZXYpOwotfQotCi0vKiEgXHJlaW1wCi0qLwotdm9pZCBRR3JhcGhpY3NXZWJWaWV3
OjprZXlSZWxlYXNlRXZlbnQoUUtleUV2ZW50KiBldikKLXsKLSAgICBpZiAoZC0+cGFnZSkKLSAg
ICAgICAgZC0+cGFnZS0+ZXZlbnQoZXYpOwotCi0gICAgaWYgKCFldi0+aXNBY2NlcHRlZCgpKQot
ICAgICAgICBRR3JhcGhpY3NJdGVtOjprZXlSZWxlYXNlRXZlbnQoZXYpOwotfQotCi0vKiEgXHJl
aW1wCi0qLwotdm9pZCBRR3JhcGhpY3NXZWJWaWV3Ojpmb2N1c0luRXZlbnQoUUZvY3VzRXZlbnQq
IGV2KQotewotICAgIGlmIChkLT5wYWdlKQotICAgICAgICBkLT5wYWdlLT5ldmVudChldik7Ci0g
ICAgZWxzZQotICAgICAgICBRR3JhcGhpY3NJdGVtOjpmb2N1c0luRXZlbnQoZXYpOwotfQotCi0v
KiEgXHJlaW1wCi0qLwotdm9pZCBRR3JhcGhpY3NXZWJWaWV3Ojpmb2N1c091dEV2ZW50KFFGb2N1
c0V2ZW50KiBldikKLXsKLSAgICBpZiAoZC0+cGFnZSkKLSAgICAgICAgZC0+cGFnZS0+ZXZlbnQo
ZXYpOwotICAgIGVsc2UKLSAgICAgICAgUUdyYXBoaWNzSXRlbTo6Zm9jdXNPdXRFdmVudChldik7
Ci19Ci0KLS8qISBccmVpbXAKLSovCi1ib29sIFFHcmFwaGljc1dlYlZpZXc6OmZvY3VzTmV4dFBy
ZXZDaGlsZChib29sIG5leHQpCi17Ci0gICAgaWYgKGQtPnBhZ2UpCi0gICAgICAgIHJldHVybiBk
LT5wYWdlLT5mb2N1c05leHRQcmV2Q2hpbGQobmV4dCk7Ci0KLSAgICByZXR1cm4gUUdyYXBoaWNz
V2lkZ2V0Ojpmb2N1c05leHRQcmV2Q2hpbGQobmV4dCk7Ci19Ci0KLS8qISBccmVpbXAKLSovCi12
b2lkIFFHcmFwaGljc1dlYlZpZXc6OmRyYWdFbnRlckV2ZW50KFFHcmFwaGljc1NjZW5lRHJhZ0Ry
b3BFdmVudCogZXYpCi17Ci0jaWZuZGVmIFFUX05PX0RSQUdBTkREUk9QCi0gICAgaWYgKGQtPnBh
Z2UpCi0gICAgICAgIGQtPnBhZ2UtPmV2ZW50KGV2KTsKLSNlbHNlCi0gICAgUV9VTlVTRUQoZXYp
OwotI2VuZGlmCi19Ci0KLS8qISBccmVpbXAKLSovCi12b2lkIFFHcmFwaGljc1dlYlZpZXc6OmRy
YWdMZWF2ZUV2ZW50KFFHcmFwaGljc1NjZW5lRHJhZ0Ryb3BFdmVudCogZXYpCi17Ci0jaWZuZGVm
IFFUX05PX0RSQUdBTkREUk9QCi0gICAgaWYgKGQtPnBhZ2UpIHsKLSAgICAgICAgY29uc3QgYm9v
bCBhY2NlcHRlZCA9IGV2LT5pc0FjY2VwdGVkKCk7Ci0gICAgICAgIGQtPnBhZ2UtPmV2ZW50KGV2
KTsKLSAgICAgICAgZXYtPnNldEFjY2VwdGVkKGFjY2VwdGVkKTsKLSAgICB9Ci0KLSAgICBpZiAo
IWV2LT5pc0FjY2VwdGVkKCkpCi0gICAgICAgIFFHcmFwaGljc1dpZGdldDo6ZHJhZ0xlYXZlRXZl
bnQoZXYpOwotI2Vsc2UKLSAgICBRX1VOVVNFRChldik7Ci0jZW5kaWYKLX0KLQotLyohIFxyZWlt
cAotKi8KLXZvaWQgUUdyYXBoaWNzV2ViVmlldzo6ZHJhZ01vdmVFdmVudChRR3JhcGhpY3NTY2Vu
ZURyYWdEcm9wRXZlbnQqIGV2KQotewotI2lmbmRlZiBRVF9OT19EUkFHQU5ERFJPUAotICAgIGlm
IChkLT5wYWdlKSB7Ci0gICAgICAgIGNvbnN0IGJvb2wgYWNjZXB0ZWQgPSBldi0+aXNBY2NlcHRl
ZCgpOwotICAgICAgICBkLT5wYWdlLT5ldmVudChldik7Ci0gICAgICAgIGV2LT5zZXRBY2NlcHRl
ZChhY2NlcHRlZCk7Ci0gICAgfQotCi0gICAgaWYgKCFldi0+aXNBY2NlcHRlZCgpKQotICAgICAg
ICBRR3JhcGhpY3NXaWRnZXQ6OmRyYWdNb3ZlRXZlbnQoZXYpOwotI2Vsc2UKLSAgICBRX1VOVVNF
RChldik7Ci0jZW5kaWYKLX0KLQotLyohIFxyZWltcAotKi8KLXZvaWQgUUdyYXBoaWNzV2ViVmll
dzo6ZHJvcEV2ZW50KFFHcmFwaGljc1NjZW5lRHJhZ0Ryb3BFdmVudCogZXYpCi17Ci0jaWZuZGVm
IFFUX05PX0RSQUdBTkREUk9QCi0gICAgaWYgKGQtPnBhZ2UpIHsKLSAgICAgICAgY29uc3QgYm9v
bCBhY2NlcHRlZCA9IGV2LT5pc0FjY2VwdGVkKCk7Ci0gICAgICAgIGQtPnBhZ2UtPmV2ZW50KGV2
KTsKLSAgICAgICAgZXYtPnNldEFjY2VwdGVkKGFjY2VwdGVkKTsKLSAgICB9Ci0KLSAgICBpZiAo
IWV2LT5pc0FjY2VwdGVkKCkpCi0gICAgICAgIFFHcmFwaGljc1dpZGdldDo6ZHJvcEV2ZW50KGV2
KTsKLSNlbHNlCi0gICAgUV9VTlVTRUQoZXYpOwotI2VuZGlmCi19Ci0KLSNpZm5kZWYgUVRfTk9f
Q09OVEVYVE1FTlUKLS8qISBccmVpbXAKLSovCi12b2lkIFFHcmFwaGljc1dlYlZpZXc6OmNvbnRl
eHRNZW51RXZlbnQoUUdyYXBoaWNzU2NlbmVDb250ZXh0TWVudUV2ZW50KiBldikKLXsKLSAgICBp
ZiAoZC0+cGFnZSkgewotICAgICAgICBjb25zdCBib29sIGFjY2VwdGVkID0gZXYtPmlzQWNjZXB0
ZWQoKTsKLSAgICAgICAgZC0+cGFnZS0+ZXZlbnQoZXYpOwotICAgICAgICBldi0+c2V0QWNjZXB0
ZWQoYWNjZXB0ZWQpOwotICAgIH0KLX0KLSNlbmRpZiAvLyBRVF9OT19DT05URVhUTUVOVQotCi0j
aWZuZGVmIFFUX05PX1dIRUVMRVZFTlQKLS8qISBccmVpbXAKLSovCi12b2lkIFFHcmFwaGljc1dl
YlZpZXc6OndoZWVsRXZlbnQoUUdyYXBoaWNzU2NlbmVXaGVlbEV2ZW50KiBldikKLXsKLSAgICBp
ZiAoZC0+cGFnZSkgewotICAgICAgICBjb25zdCBib29sIGFjY2VwdGVkID0gZXYtPmlzQWNjZXB0
ZWQoKTsKLSAgICAgICAgZC0+cGFnZS0+ZXZlbnQoZXYpOwotICAgICAgICBldi0+c2V0QWNjZXB0
ZWQoYWNjZXB0ZWQpOwotICAgIH0KLQotICAgIGlmICghZXYtPmlzQWNjZXB0ZWQoKSkKLSAgICAg
ICAgUUdyYXBoaWNzSXRlbTo6d2hlZWxFdmVudChldik7Ci19Ci0jZW5kaWYgLy8gUVRfTk9fV0hF
RUxFVkVOVAotCi0vKiEgXHJlaW1wCi0qLwotdm9pZCBRR3JhcGhpY3NXZWJWaWV3OjppbnB1dE1l
dGhvZEV2ZW50KFFJbnB1dE1ldGhvZEV2ZW50KiBldikKLXsKLSAgICBpZiAoZC0+cGFnZSkKLSAg
ICAgICAgZC0+cGFnZS0+ZXZlbnQoZXYpOwotCi0gICAgaWYgKCFldi0+aXNBY2NlcHRlZCgpKQot
ICAgICAgICBRR3JhcGhpY3NJdGVtOjppbnB1dE1ldGhvZEV2ZW50KGV2KTsKLX0KLQotLyohCi0g
ICAgXGZuIHZvaWQgUUdyYXBoaWNzV2ViVmlldzo6c3RhdHVzQmFyTWVzc2FnZShjb25zdCBRU3Ry
aW5nJiB0ZXh0KQotCi0gICAgVGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuIHRoZSBzdGF0dXNi
YXIgXGEgdGV4dCBpcyBjaGFuZ2VkIGJ5IHRoZSBwYWdlLgotKi8KLQotLyohCi0gICAgXGZuIHZv
aWQgUUdyYXBoaWNzV2ViVmlldzo6bG9hZFByb2dyZXNzKGludCBwcm9ncmVzcykKLQotICAgIFRo
aXMgc2lnbmFsIGlzIGVtaXR0ZWQgZXZlcnkgdGltZSBhbiBlbGVtZW50IGluIHRoZSB3ZWIgcGFn
ZQotICAgIGNvbXBsZXRlcyBsb2FkaW5nIGFuZCB0aGUgb3ZlcmFsbCBsb2FkaW5nIHByb2dyZXNz
IGFkdmFuY2VzLgotCi0gICAgVGhpcyBzaWduYWwgdHJhY2tzIHRoZSBwcm9ncmVzcyBvZiBhbGwg
Y2hpbGQgZnJhbWVzLgotCi0gICAgVGhlIGN1cnJlbnQgdmFsdWUgaXMgcHJvdmlkZWQgYnkgXGEg
cHJvZ3Jlc3MgYW5kIHNjYWxlcyBmcm9tIDAgdG8gMTAwLAotICAgIHdoaWNoIGlzIHRoZSBkZWZh
dWx0IHJhbmdlIG9mIFFQcm9ncmVzc0Jhci4KLQotICAgIFxzYSBsb2FkU3RhcnRlZCgpLCBsb2Fk
RmluaXNoZWQoKQotKi8KLQotLyohCi0gICAgXGZuIHZvaWQgUUdyYXBoaWNzV2ViVmlldzo6bGlu
a0NsaWNrZWQoY29uc3QgUVVybCAmdXJsKQotCi0gICAgVGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3
aGVuZXZlciB0aGUgdXNlciBjbGlja3Mgb24gYSBsaW5rIGFuZCB0aGUgcGFnZSdzIGxpbmtEZWxl
Z2F0aW9uUG9saWN5Ci0gICAgcHJvcGVydHkgaXMgc2V0IHRvIGRlbGVnYXRlIHRoZSBsaW5rIGhh
bmRsaW5nIGZvciB0aGUgc3BlY2lmaWVkIFxhIHVybC4KLQotICAgIFxzYSBRV2ViUGFnZTo6bGlu
a0RlbGVnYXRpb25Qb2xpY3koKQotKi8KLQotI2VuZGlmIC8vIFFUX05PX0dSQVBISUNTVklFVwot
Ci0jaW5jbHVkZSAibW9jX3FncmFwaGljc3dlYnZpZXcuY3BwIgpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYktpdC9xdC9BcGkvcWdyYXBoaWNzd2Vidmlldy5oIGIvU291cmNlL1dlYktpdC9xdC9BcGkv
cWdyYXBoaWNzd2Vidmlldy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjlmMTdi
NDgzODQ1OGIyMjAyMjIwN2RiNDI0NTYwYzgwYWI3NjFlLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvcXQvQXBpL3FncmFwaGljc3dl
YnZpZXcuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKgotICAgIENvcHlyaWdo
dCAoQykgMjAwOSBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykK
LQotICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGli
cmFyeSBHZW5lcmFsIFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVl
IFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5z
ZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGli
cmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAot
ICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdh
cnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vu
c2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNv
cHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3
aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0
ZSB0bwotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGlu
IFN0cmVldCwgRmlmdGggRmxvb3IsCi0gICAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCi0q
LwotCi0jaWZuZGVmIFFHcmFwaGljc1dlYlZpZXdfaAotI2RlZmluZSBRR3JhcGhpY3NXZWJWaWV3
X2gKLQotI2luY2x1ZGUgInF3ZWJraXRnbG9iYWwuaCIKLSNpbmNsdWRlICJxd2VicGFnZS5oIgot
I2luY2x1ZGUgPFF0Q29yZS9xdXJsLmg+Ci0jaW5jbHVkZSA8UXRXaWRnZXRzL3FncmFwaGljc3dp
ZGdldC5oPgotI2luY2x1ZGUgPFF0R3VpL3FldmVudC5oPgotI2luY2x1ZGUgPFF0R3VpL3FpY29u
Lmg+Ci0jaW5jbHVkZSA8UXRHdWkvcXBhaW50ZXIuaD4KLSNpbmNsdWRlIDxRdE5ldHdvcmsvcW5l
dHdvcmthY2Nlc3NtYW5hZ2VyLmg+Ci0KLSNpZiAhZGVmaW5lZChRVF9OT19HUkFQSElDU1ZJRVcp
Ci0KLWNsYXNzIFFXZWJQYWdlOwotY2xhc3MgUVdlYkhpc3Rvcnk7Ci1jbGFzcyBRV2ViU2V0dGlu
Z3M7Ci0KLWNsYXNzIFFHcmFwaGljc1dlYlZpZXdQcml2YXRlOwotCi1jbGFzcyBRV0VCS0lUX0VY
UE9SVCBRR3JhcGhpY3NXZWJWaWV3IDogcHVibGljIFFHcmFwaGljc1dpZGdldCB7Ci0gICAgUV9P
QkpFQ1QKLQotICAgIFFfUFJPUEVSVFkoUVN0cmluZyB0aXRsZSBSRUFEIHRpdGxlIE5PVElGWSB0
aXRsZUNoYW5nZWQpCi0gICAgUV9QUk9QRVJUWShRSWNvbiBpY29uIFJFQUQgaWNvbiBOT1RJRlkg
aWNvbkNoYW5nZWQpCi0gICAgUV9QUk9QRVJUWShxcmVhbCB6b29tRmFjdG9yIFJFQUQgem9vbUZh
Y3RvciBXUklURSBzZXRab29tRmFjdG9yKQotCi0gICAgUV9QUk9QRVJUWShRVXJsIHVybCBSRUFE
IHVybCBXUklURSBzZXRVcmwgTk9USUZZIHVybENoYW5nZWQpCi0KLSAgICBRX1BST1BFUlRZKGJv
b2wgbW9kaWZpZWQgUkVBRCBpc01vZGlmaWVkKQotICAgIFFfUFJPUEVSVFkoYm9vbCByZXNpemVz
VG9Db250ZW50cyBSRUFEIHJlc2l6ZXNUb0NvbnRlbnRzIFdSSVRFIHNldFJlc2l6ZXNUb0NvbnRl
bnRzKQotICAgIFFfUFJPUEVSVFkoYm9vbCB0aWxlZEJhY2tpbmdTdG9yZUZyb3plbiBSRUFEIGlz
VGlsZWRCYWNraW5nU3RvcmVGcm96ZW4gV1JJVEUgc2V0VGlsZWRCYWNraW5nU3RvcmVGcm96ZW4p
Ci0KLSAgICBRX1BST1BFUlRZKFFQYWludGVyOjpSZW5kZXJIaW50cyByZW5kZXJIaW50cyBSRUFE
IHJlbmRlckhpbnRzIFdSSVRFIHNldFJlbmRlckhpbnRzKQotICAgIFFfRkxBR1MoUVBhaW50ZXI6
OlJlbmRlckhpbnRzKQotCi1wdWJsaWM6Ci0gICAgZXhwbGljaXQgUUdyYXBoaWNzV2ViVmlldyhR
R3JhcGhpY3NJdGVtKiBwYXJlbnQgPSAwKTsKLSAgICB+UUdyYXBoaWNzV2ViVmlldygpOwotCi0g
ICAgUVdlYlBhZ2UqIHBhZ2UoKSBjb25zdDsKLSAgICB2b2lkIHNldFBhZ2UoUVdlYlBhZ2UqKTsK
LQotICAgIFFVcmwgdXJsKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRVcmwoY29uc3QgUVVybCYpOwot
Ci0gICAgUVN0cmluZyB0aXRsZSgpIGNvbnN0OwotICAgIFFJY29uIGljb24oKSBjb25zdDsKLQot
ICAgIHFyZWFsIHpvb21GYWN0b3IoKSBjb25zdDsKLSAgICB2b2lkIHNldFpvb21GYWN0b3IocXJl
YWwpOwotCi0gICAgYm9vbCBpc01vZGlmaWVkKCkgY29uc3Q7Ci0KLSAgICB2b2lkIGxvYWQoY29u
c3QgUVVybCYgdXJsKTsKLSAgICB2b2lkIGxvYWQoY29uc3QgUU5ldHdvcmtSZXF1ZXN0JiByZXF1
ZXN0LCBRTmV0d29ya0FjY2Vzc01hbmFnZXI6Ok9wZXJhdGlvbiBvcGVyYXRpb24gPSBRTmV0d29y
a0FjY2Vzc01hbmFnZXI6OkdldE9wZXJhdGlvbiwgY29uc3QgUUJ5dGVBcnJheSYgYm9keSA9IFFC
eXRlQXJyYXkoKSk7Ci0KLSAgICB2b2lkIHNldEh0bWwoY29uc3QgUVN0cmluZyYgaHRtbCwgY29u
c3QgUVVybCYgYmFzZVVybCA9IFFVcmwoKSk7Ci0gICAgLy8gRklYTUU6IENvbnNpZGVyIHJlbmFt
ZSB0byBzZXRIdG1sPwotICAgIHZvaWQgc2V0Q29udGVudChjb25zdCBRQnl0ZUFycmF5JiBkYXRh
LCBjb25zdCBRU3RyaW5nJiBtaW1lVHlwZSA9IFFTdHJpbmcoKSwgY29uc3QgUVVybCYgYmFzZVVy
bCA9IFFVcmwoKSk7Ci0KLSAgICBRV2ViSGlzdG9yeSogaGlzdG9yeSgpIGNvbnN0OwotICAgIFFX
ZWJTZXR0aW5ncyogc2V0dGluZ3MoKSBjb25zdDsKLQotICAgIFFBY3Rpb24qIHBhZ2VBY3Rpb24o
UVdlYlBhZ2U6OldlYkFjdGlvbiBhY3Rpb24pIGNvbnN0OwotICAgIHZvaWQgdHJpZ2dlclBhZ2VB
Y3Rpb24oUVdlYlBhZ2U6OldlYkFjdGlvbiBhY3Rpb24sIGJvb2wgY2hlY2tlZCA9IGZhbHNlKTsK
LQotICAgIGJvb2wgZmluZFRleHQoY29uc3QgUVN0cmluZyYgc3ViU3RyaW5nLCBRV2ViUGFnZTo6
RmluZEZsYWdzIG9wdGlvbnMgPSAwKTsKLQotICAgIGJvb2wgcmVzaXplc1RvQ29udGVudHMoKSBj
b25zdDsKLSAgICB2b2lkIHNldFJlc2l6ZXNUb0NvbnRlbnRzKGJvb2wgZW5hYmxlZCk7Ci0gICAg
Ci0gICAgYm9vbCBpc1RpbGVkQmFja2luZ1N0b3JlRnJvemVuKCkgY29uc3Q7Ci0gICAgdm9pZCBz
ZXRUaWxlZEJhY2tpbmdTdG9yZUZyb3plbihib29sIGZyb3plbik7Ci0KLSAgICB2aXJ0dWFsIHZv
aWQgc2V0R2VvbWV0cnkoY29uc3QgUVJlY3RGJiByZWN0KTsKLSAgICB2aXJ0dWFsIHZvaWQgdXBk
YXRlR2VvbWV0cnkoKTsKLSAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoUVBhaW50ZXIqLCBjb25zdCBR
U3R5bGVPcHRpb25HcmFwaGljc0l0ZW0qIG9wdGlvbnMsIFFXaWRnZXQqIHdpZGdldCA9IDApOwot
ICAgIHZpcnR1YWwgUVZhcmlhbnQgaXRlbUNoYW5nZShHcmFwaGljc0l0ZW1DaGFuZ2UgY2hhbmdl
LCBjb25zdCBRVmFyaWFudCYgdmFsdWUpOwotICAgIHZpcnR1YWwgYm9vbCBldmVudChRRXZlbnQq
KTsKLQotICAgIHZpcnR1YWwgUVNpemVGIHNpemVIaW50KFF0OjpTaXplSGludCB3aGljaCwgY29u
c3QgUVNpemVGJiBjb25zdHJhaW50KSBjb25zdDsKLQotICAgIHZpcnR1YWwgUVZhcmlhbnQgaW5w
dXRNZXRob2RRdWVyeShRdDo6SW5wdXRNZXRob2RRdWVyeSBxdWVyeSkgY29uc3Q7Ci0KLSAgICBR
UGFpbnRlcjo6UmVuZGVySGludHMgcmVuZGVySGludHMoKSBjb25zdDsKLSAgICB2b2lkIHNldFJl
bmRlckhpbnRzKFFQYWludGVyOjpSZW5kZXJIaW50cyk7Ci0gICAgdm9pZCBzZXRSZW5kZXJIaW50
KFFQYWludGVyOjpSZW5kZXJIaW50LCBib29sIGVuYWJsZWQgPSB0cnVlKTsKLQotcHVibGljIFFf
U0xPVFM6Ci0gICAgdm9pZCBzdG9wKCk7Ci0gICAgdm9pZCBiYWNrKCk7Ci0gICAgdm9pZCBmb3J3
YXJkKCk7Ci0gICAgdm9pZCByZWxvYWQoKTsKLQotUV9TSUdOQUxTOgotICAgIHZvaWQgbG9hZFN0
YXJ0ZWQoKTsKLSAgICB2b2lkIGxvYWRGaW5pc2hlZChib29sKTsKLQotICAgIHZvaWQgbG9hZFBy
b2dyZXNzKGludCBwcm9ncmVzcyk7Ci0gICAgdm9pZCB1cmxDaGFuZ2VkKGNvbnN0IFFVcmwmKTsK
LSAgICB2b2lkIHRpdGxlQ2hhbmdlZChjb25zdCBRU3RyaW5nJik7Ci0gICAgdm9pZCBpY29uQ2hh
bmdlZCgpOwotICAgIHZvaWQgc3RhdHVzQmFyTWVzc2FnZShjb25zdCBRU3RyaW5nJiBtZXNzYWdl
KTsKLSAgICB2b2lkIGxpbmtDbGlja2VkKGNvbnN0IFFVcmwmKTsKLQotcHJvdGVjdGVkOgotICAg
IHZpcnR1YWwgdm9pZCBtb3VzZVByZXNzRXZlbnQoUUdyYXBoaWNzU2NlbmVNb3VzZUV2ZW50Kik7
Ci0gICAgdmlydHVhbCB2b2lkIG1vdXNlRG91YmxlQ2xpY2tFdmVudChRR3JhcGhpY3NTY2VuZU1v
dXNlRXZlbnQqKTsKLSAgICB2aXJ0dWFsIHZvaWQgbW91c2VSZWxlYXNlRXZlbnQoUUdyYXBoaWNz
U2NlbmVNb3VzZUV2ZW50Kik7Ci0gICAgdmlydHVhbCB2b2lkIG1vdXNlTW92ZUV2ZW50KFFHcmFw
aGljc1NjZW5lTW91c2VFdmVudCopOwotICAgIHZpcnR1YWwgdm9pZCBob3Zlck1vdmVFdmVudChR
R3JhcGhpY3NTY2VuZUhvdmVyRXZlbnQqKTsKLSAgICB2aXJ0dWFsIHZvaWQgaG92ZXJMZWF2ZUV2
ZW50KFFHcmFwaGljc1NjZW5lSG92ZXJFdmVudCopOwotI2lmbmRlZiBRVF9OT19XSEVFTEVWRU5U
Ci0gICAgdmlydHVhbCB2b2lkIHdoZWVsRXZlbnQoUUdyYXBoaWNzU2NlbmVXaGVlbEV2ZW50Kik7
Ci0jZW5kaWYKLSAgICB2aXJ0dWFsIHZvaWQga2V5UHJlc3NFdmVudChRS2V5RXZlbnQqKTsKLSAg
ICB2aXJ0dWFsIHZvaWQga2V5UmVsZWFzZUV2ZW50KFFLZXlFdmVudCopOwotI2lmbmRlZiBRVF9O
T19DT05URVhUTUVOVQotICAgIHZpcnR1YWwgdm9pZCBjb250ZXh0TWVudUV2ZW50KFFHcmFwaGlj
c1NjZW5lQ29udGV4dE1lbnVFdmVudCopOwotI2VuZGlmCi0gICAgdmlydHVhbCB2b2lkIGRyYWdF
bnRlckV2ZW50KFFHcmFwaGljc1NjZW5lRHJhZ0Ryb3BFdmVudCopOwotICAgIHZpcnR1YWwgdm9p
ZCBkcmFnTGVhdmVFdmVudChRR3JhcGhpY3NTY2VuZURyYWdEcm9wRXZlbnQqKTsKLSAgICB2aXJ0
dWFsIHZvaWQgZHJhZ01vdmVFdmVudChRR3JhcGhpY3NTY2VuZURyYWdEcm9wRXZlbnQqKTsKLSAg
ICB2aXJ0dWFsIHZvaWQgZHJvcEV2ZW50KFFHcmFwaGljc1NjZW5lRHJhZ0Ryb3BFdmVudCopOwot
ICAgIHZpcnR1YWwgdm9pZCBmb2N1c0luRXZlbnQoUUZvY3VzRXZlbnQqKTsKLSAgICB2aXJ0dWFs
IHZvaWQgZm9jdXNPdXRFdmVudChRRm9jdXNFdmVudCopOwotICAgIHZpcnR1YWwgdm9pZCBpbnB1
dE1ldGhvZEV2ZW50KFFJbnB1dE1ldGhvZEV2ZW50Kik7Ci0gICAgdmlydHVhbCBib29sIGZvY3Vz
TmV4dFByZXZDaGlsZChib29sIG5leHQpOwotCi0gICAgdmlydHVhbCBib29sIHNjZW5lRXZlbnQo
UUV2ZW50Kik7Ci0KLXByaXZhdGU6Ci0gICAgUV9QUklWQVRFX1NMT1QoZCwgdm9pZCBfcV9kb0xv
YWRGaW5pc2hlZChib29sIHN1Y2Nlc3MpKQotICAgIFFfUFJJVkFURV9TTE9UKGQsIHZvaWQgX3Ff
cGFnZURlc3Ryb3llZCgpKQotICAgIC8vIHdlIGRvbid0IHdhbnQgdG8gY2hhbmdlIHRoZSBtb2Mg
YmFzZWQgb24gVVNFKCkgbWFjcm8sIHNvIHRoaXMgZnVuY3Rpb24gaXMgaGVyZQotICAgIC8vIGJ1
dCB3aWxsIGJlIGVtcHR5IGlmIEFDQ0xFUkFURURfQ09NUE9TSVRJTkcgaXMgZGlzYWJsZWQKLSAg
ICBRX1BSSVZBVEVfU0xPVChkLCB2b2lkIHN5bmNMYXllcnMoKSkKLSAgICBRX1BSSVZBVEVfU0xP
VChkLCB2b2lkIF9xX2NvbnRlbnRzU2l6ZUNoYW5nZWQoY29uc3QgUVNpemUmKSkKLSAgICBRX1BS
SVZBVEVfU0xPVChkLCB2b2lkIF9xX3NjYWxlQ2hhbmdlZCgpKQotCi0gICAgUUdyYXBoaWNzV2Vi
Vmlld1ByaXZhdGUqIGNvbnN0IGQ7Ci0gICAgZnJpZW5kIGNsYXNzIFFHcmFwaGljc1dlYlZpZXdQ
cml2YXRlOwotfTsKLQotI2VuZGlmIC8vIFFUX05PX0dSQVBISUNTVklFVwotCi0jZW5kaWYgLy8g
UUdyYXBoaWNzV2ViVmlld19oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0L0FwaS9xd2Vi
ZWxlbWVudC5oIGIvU291cmNlL1dlYktpdC9xdC9BcGkvcXdlYmVsZW1lbnQuaAppbmRleCBlZmVj
NWViN2M4ZDg4M2E0M2M3MGRhNTc2NWYzNjJjMWJhMjIxNGZmLi5lOTA3YTY5YTFjYmMzZjBjZjll
OWI4NzU4NWIwNjRkODYzYTg5ZWViIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L3F0L0FwaS9x
d2ViZWxlbWVudC5oCisrKyBiL1NvdXJjZS9XZWJLaXQvcXQvQXBpL3F3ZWJlbGVtZW50LmgKQEAg
LTE1MCw3ICsxNTAsNyBAQCBwcml2YXRlOgogICAgIHN0YXRpYyBRV2ViRWxlbWVudCBlbmNsb3Np
bmdFbGVtZW50KFdlYkNvcmU6Ok5vZGUqKTsKIAogICAgIGZyaWVuZCBjbGFzcyBEdW1wUmVuZGVy
VHJlZVN1cHBvcnRRdDsKLSAgICBmcmllbmQgY2xhc3MgUVdlYkZyYW1lOworICAgIGZyaWVuZCBj
bGFzcyBRV2ViRnJhbWVBZGFwdGVyOwogICAgIGZyaWVuZCBjbGFzcyBRV2ViRWxlbWVudENvbGxl
Y3Rpb247CiAgICAgZnJpZW5kIGNsYXNzIFFXZWJIaXRUZXN0UmVzdWx0OwogICAgIGZyaWVuZCBj
bGFzcyBRV2ViSGl0VGVzdFJlc3VsdFByaXZhdGU7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0
L3F0L0FwaS9xd2ViZnJhbWUuY3BwIGIvU291cmNlL1dlYktpdC9xdC9BcGkvcXdlYmZyYW1lLmNw
cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZhMGU4YjcxN2NiMzJhYzgzYWRjZjVm
ZmM3YzJkYzgyZDgxYjBhMS4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MAotLS0gYS9Tb3VyY2UvV2ViS2l0L3F0L0FwaS9xd2ViZnJhbWUuY3BwCisrKyAvZGV2L251bGwK
QEAgLTEsMTgxNiArMCwwIEBACi0vKgotICAgIENvcHlyaWdodCAoQykgMjAwOCwyMDA5IE5va2lh
IENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQotICAgIENvcHlyaWdodCAo
QykgMjAwNyBTdGFpa29zIENvbXB1dGluZyBTZXJ2aWNlcyBJbmMuCi0KLSAgICBUaGlzIGxpYnJh
cnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAg
bW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJs
aWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0
aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9w
dGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0
ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBB
TlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1F
UkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0
aGUgR05VCi0gICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFp
bHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGli
cmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7
IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KLSAgICB0aGUgRnJl
ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZs
b29yLAotICAgIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgotKi8KLQotI2luY2x1ZGUgImNv
bmZpZy5oIgotI2luY2x1ZGUgInF3ZWJmcmFtZS5oIgotCi0jaW5jbHVkZSAiQVBJQ2FzdC5oIgot
I2luY2x1ZGUgIkJyaWRnZUpTQy5oIgotI2luY2x1ZGUgIkNhbGxGcmFtZS5oIgotI2luY2x1ZGUg
IkRvY3VtZW50LmgiCi0jaW5jbHVkZSAiRG9jdW1lbnRMb2FkZXIuaCIKLSNpbmNsdWRlICJEcmFn
RGF0YS5oIgotI2luY2x1ZGUgIkVsZW1lbnQuaCIKLSNpbmNsdWRlICJGb2N1c0NvbnRyb2xsZXIu
aCIKLSNpbmNsdWRlICJGcmFtZS5oIgotI2luY2x1ZGUgIkZyYW1lTG9hZFJlcXVlc3QuaCIKLSNp
bmNsdWRlICJGcmFtZUxvYWRlckNsaWVudFF0LmgiCi0jaW5jbHVkZSAiRnJhbWVTZWxlY3Rpb24u
aCIKLSNpbmNsdWRlICJGcmFtZVRyZWUuaCIKLSNpbmNsdWRlICJGcmFtZVZpZXcuaCIKLSNpbmNs
dWRlICJHQ0NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKLSNpbmNs
dWRlICJIVE1MRm9ybUVsZW1lbnQuaCIKLSNpbmNsdWRlICJIVE1MTWV0YUVsZW1lbnQuaCIKLSNp
bmNsdWRlICJIaXRUZXN0UmVzdWx0LmgiCi0jaW5jbHVkZSAiSFRUUFBhcnNlcnMuaCIKLSNpbmNs
dWRlICJJY29uRGF0YWJhc2UuaCIKLSNpbmNsdWRlICJJbnNwZWN0b3JDb250cm9sbGVyLmgiCi0j
aW5jbHVkZSAiSmF2YVNjcmlwdC5oIgotI2luY2x1ZGUgIkpTRE9NQmluZGluZy5oIgotI2luY2x1
ZGUgIkpTRE9NV2luZG93QmFzZS5oIgotI2luY2x1ZGUgIkpTTG9jay5oIgotI2luY2x1ZGUgIkpT
T2JqZWN0LmgiCi0jaW5jbHVkZSAiSlNSZXRhaW5QdHIuaCIKLSNpbmNsdWRlICJPcGFxdWVKU1N0
cmluZy5oIgotI2luY2x1ZGUgIk5ldHdvcmtpbmdDb250ZXh0LmgiCi0jaW5jbHVkZSAiTm9kZUxp
c3QuaCIKLSNpbmNsdWRlICJQYWdlLmgiCi0jaW5jbHVkZSAiUGxhdGZvcm1Nb3VzZUV2ZW50Lmgi
Ci0jaW5jbHVkZSAiUGxhdGZvcm1XaGVlbEV2ZW50LmgiCi0jaW5jbHVkZSAiUHJpbnRDb250ZXh0
LmgiCi0jaW5jbHVkZSAiUHJvcGVydHlEZXNjcmlwdG9yLmgiCi0jaW5jbHVkZSAiUHV0UHJvcGVy
dHlTbG90LmgiCi0jaW5jbHVkZSAiUmVuZGVyTGF5ZXIuaCIKLSNpbmNsdWRlICJSZW5kZXJUcmVl
QXNUZXh0LmgiCi0jaW5jbHVkZSAiUmVuZGVyVmlldy5oIgotI2luY2x1ZGUgIlJlc291cmNlUmVx
dWVzdC5oIgotI2luY2x1ZGUgIlNjcmlwdENvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJTY3JpcHRT
b3VyY2VDb2RlLmgiCi0jaW5jbHVkZSAiU2NyaXB0VmFsdWUuaCIKLSNpbmNsdWRlICJTY3JvbGxi
YXIuaCIKLSNpbmNsdWRlICJTZXR0aW5ncy5oIgotI2luY2x1ZGUgIlN1YnN0aXR1dGVEYXRhLmgi
Ci0jaW5jbHVkZSAiU1ZHU01JTEVsZW1lbnQuaCIKLSNpbmNsdWRlICJUaWxlZEJhY2tpbmdTdG9y
ZS5oIgotI2luY2x1ZGUgImh0bWxlZGl0aW5nLmgiCi0jaW5jbHVkZSAibWFya3VwLmgiCi0jaW5j
bHVkZSAicXRfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJxdF9ydW50aW1lLmgiCi0jaW5jbHVkZSAi
cXdlYmVsZW1lbnQuaCIKLSNpbmNsdWRlICJxd2ViZnJhbWVfcC5oIgotI2luY2x1ZGUgInF3ZWJw
YWdlLmgiCi0jaW5jbHVkZSAicXdlYnBhZ2VfcC5oIgotI2luY2x1ZGUgInF3ZWJzZWN1cml0eW9y
aWdpbi5oIgotI2luY2x1ZGUgInF3ZWJzZWN1cml0eW9yaWdpbl9wLmgiCi0jaW5jbHVkZSAicXdl
YnNjcmlwdHdvcmxkLmgiCi0jaW5jbHVkZSAicXdlYnNjcmlwdHdvcmxkX3AuaCIKLSNpbmNsdWRl
ICJydW50aW1lX29iamVjdC5oIgotI2luY2x1ZGUgInJ1bnRpbWVfcm9vdC5oIgotI2lmIFVTRShU
RVhUVVJFX01BUFBFUikKLSNpbmNsdWRlICJ0ZXhtYXAvVGV4dHVyZU1hcHBlci5oIgotI2luY2x1
ZGUgInRleG1hcC9UZXh0dXJlTWFwcGVyTGF5ZXIuaCIKLSNlbmRpZgotI2luY2x1ZGUgInd0Zi9I
YXNoTWFwLmgiCi0jaW5jbHVkZSA8UU11bHRpTWFwPgotI2luY2x1ZGUgPHFkZWJ1Zy5oPgotI2lu
Y2x1ZGUgPHFldmVudC5oPgotI2luY2x1ZGUgPHFmaWxlaW5mby5oPgotI2luY2x1ZGUgPHFwYWlu
dGVyLmg+Ci0jaWYgSEFWRShRVFBSSU5UU1VQUE9SVCkKLSNpbmNsdWRlIDxxcHJpbnRlci5oPgot
I2VuZGlmCi0jaW5jbHVkZSA8cXJlZ2lvbi5oPgotI2luY2x1ZGUgPHFuZXR3b3JrcmVxdWVzdC5o
PgotCi11c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKLQotLy8gZnJvbSB0ZXh0L3Fmb250LmNwcAot
UVRfQkVHSU5fTkFNRVNQQUNFCi1leHRlcm4gUV9HVUlfRVhQT1JUIGludCBxdF9kZWZhdWx0RHBp
KCk7Ci1RVF9FTkRfTkFNRVNQQUNFCi0KLXZvaWQgUVdlYkZyYW1lUHJpdmF0ZTo6c2V0UGFnZShR
V2ViUGFnZSogbmV3UGFnZSkKLXsKLSAgICBpZiAocGFnZSA9PSBuZXdQYWdlKQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICAvLyBUaGUgUVdlYkZyYW1lIGlzIGNyZWF0ZWQgYXMgYSBjaGlsZCBvZiBR
V2ViUGFnZSBvciBhIHBhcmVudCBRV2ViRnJhbWUuCi0gICAgLy8gVGhhdCBhZGRzIGl0IHRvIFFP
YmplY3QncyBpbnRlcm5hbCBjaGlsZHJlbiBsaXN0IGFuZCBlbnN1cmVzIGl0IHdpbGwgYmUKLSAg
ICAvLyBkZWxldGVkIHdoZW4gcGFyZW50IFFXZWJQYWdlIGlzIGRlbGV0ZWQuIFJlcGFyZW50IGlm
IG5lZWRlZC4KLSAgICBpZiAocS0+cGFyZW50KCkgPT0gcW9iamVjdF9jYXN0PFFPYmplY3QqPihw
YWdlKSkKLSAgICAgICAgcS0+c2V0UGFyZW50KG5ld1BhZ2UpOwotCi0gICAgcGFnZSA9IG5ld1Bh
Z2U7Ci0gICAgcGFnZUFkYXB0ZXIgPSBuZXdQYWdlLT5oYW5kbGUoKTsKLSAgICBlbWl0IHEtPnBh
Z2VDaGFuZ2VkKCk7Ci19Ci0KLVdlYkNvcmU6OlNjcm9sbGJhciogUVdlYkZyYW1lUHJpdmF0ZTo6
aG9yaXpvbnRhbFNjcm9sbEJhcigpIGNvbnN0Ci17Ci0gICAgaWYgKCFmcmFtZS0+dmlldygpKQot
ICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gZnJhbWUtPnZpZXcoKS0+aG9yaXpvbnRhbFNj
cm9sbGJhcigpOwotfQotCi1XZWJDb3JlOjpTY3JvbGxiYXIqIFFXZWJGcmFtZVByaXZhdGU6OnZl
cnRpY2FsU2Nyb2xsQmFyKCkgY29uc3QKLXsKLSAgICBpZiAoIWZyYW1lLT52aWV3KCkpCi0gICAg
ICAgIHJldHVybiAwOwotICAgIHJldHVybiBmcmFtZS0+dmlldygpLT52ZXJ0aWNhbFNjcm9sbGJh
cigpOwotfQotCi0jaWYgVVNFKFRJTEVEX0JBQ0tJTkdfU1RPUkUpCi12b2lkIFFXZWJGcmFtZVBy
aXZhdGU6OnJlbmRlckZyb21UaWxlZEJhY2tpbmdTdG9yZShHcmFwaGljc0NvbnRleHQqIGNvbnRl
eHQsIGNvbnN0IFFSZWdpb24mIGNsaXApCi17Ci0gICAgQVNTRVJUKGZyYW1lLT50aWxlZEJhY2tp
bmdTdG9yZSgpKTsKLQotICAgIGlmICghZnJhbWUtPnZpZXcoKSB8fCAhZnJhbWUtPmNvbnRlbnRS
ZW5kZXJlcigpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBRVmVjdG9yPFFSZWN0PiB2ZWN0b3Ig
PSBjbGlwLnJlY3RzKCk7Ci0gICAgaWYgKHZlY3Rvci5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVy
bjsKLQotICAgIFFQYWludGVyKiBwYWludGVyID0gY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCk7
Ci0KLSAgICBXZWJDb3JlOjpGcmFtZVZpZXcqIHZpZXcgPSBmcmFtZS0+dmlldygpOwotICAgIAot
ICAgIGludCBzY3JvbGxYID0gdmlldy0+c2Nyb2xsWCgpOwotICAgIGludCBzY3JvbGxZID0gdmll
dy0+c2Nyb2xsWSgpOwotICAgIGNvbnRleHQtPnRyYW5zbGF0ZSgtc2Nyb2xsWCwgLXNjcm9sbFkp
OwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2ZWN0b3Iuc2l6ZSgpOyArK2kpIHsKLSAgICAg
ICAgY29uc3QgUVJlY3QmIGNsaXBSZWN0ID0gdmVjdG9yLmF0KGkpOwotCi0gICAgICAgIHBhaW50
ZXItPnNhdmUoKTsKLSAgICAgICAgCi0gICAgICAgIFFSZWN0IHJlY3QgPSBjbGlwUmVjdC50cmFu
c2xhdGVkKHNjcm9sbFgsIHNjcm9sbFkpOwotICAgICAgICBwYWludGVyLT5zZXRDbGlwUmVjdChy
ZWN0LCBRdDo6SW50ZXJzZWN0Q2xpcCk7Ci0KLSAgICAgICAgZnJhbWUtPnRpbGVkQmFja2luZ1N0
b3JlKCktPnBhaW50KGNvbnRleHQsIHJlY3QpOwotCi0gICAgICAgIHBhaW50ZXItPnJlc3RvcmUo
KTsKLSAgICB9Ci0KLSNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCi0gICAgcmVuZGVy
Q29tcG9zaXRlZExheWVycyhjb250ZXh0LCBJbnRSZWN0KGNsaXAuYm91bmRpbmdSZWN0KCkpKTsK
LSAgICByZW5kZXJGcmFtZUV4dHJhcyhjb250ZXh0LCBRRmxhZ3M8UVdlYkZyYW1lOjpSZW5kZXJM
YXllcj4oUVdlYkZyYW1lOjpTY3JvbGxCYXJMYXllcikgfCBRV2ViRnJhbWU6OlBhbkljb25MYXll
ciwgY2xpcCk7Ci0jZW5kaWYKLX0KLSNlbmRpZgotCi0jaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBP
U0lUSU5HKQotdm9pZCBRV2ViRnJhbWVQcml2YXRlOjpyZW5kZXJDb21wb3NpdGVkTGF5ZXJzKEdy
YXBoaWNzQ29udGV4dCogY29udGV4dCwgY29uc3QgSW50UmVjdCYgY2xpcCkKLXsKLSAgICBpZiAo
IXJvb3RUZXh0dXJlTWFwcGVyTGF5ZXIgfHwgIXRleHR1cmVNYXBwZXIpCi0gICAgICAgIHJldHVy
bjsKLQotICAgIHRleHR1cmVNYXBwZXItPnNldEdyYXBoaWNzQ29udGV4dChjb250ZXh0KTsKLSAg
ICB0ZXh0dXJlTWFwcGVyLT5zZXRJbWFnZUludGVycG9sYXRpb25RdWFsaXR5KGNvbnRleHQtPmlt
YWdlSW50ZXJwb2xhdGlvblF1YWxpdHkoKSk7Ci0gICAgdGV4dHVyZU1hcHBlci0+c2V0VGV4dERy
YXdpbmdNb2RlKGNvbnRleHQtPnRleHREcmF3aW5nTW9kZSgpKTsKLSAgICBRUGFpbnRlciogcGFp
bnRlciA9IGNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpOwotICAgIGNvbnN0IFFUcmFuc2Zvcm0g
dHJhbnNmb3JtID0gcGFpbnRlci0+d29ybGRUcmFuc2Zvcm0oKTsKLSAgICBjb25zdCBUcmFuc2Zv
cm1hdGlvbk1hdHJpeCBtYXRyaXgoCi0gICAgICAgICAgICAgICAgdHJhbnNmb3JtLm0xMSgpLCB0
cmFuc2Zvcm0ubTEyKCksIDAsIHRyYW5zZm9ybS5tMTMoKSwKLSAgICAgICAgICAgICAgICB0cmFu
c2Zvcm0ubTIxKCksIHRyYW5zZm9ybS5tMjIoKSwgMCwgdHJhbnNmb3JtLm0yMygpLAotICAgICAg
ICAgICAgICAgIDAsIDAsIDEsIDAsCi0gICAgICAgICAgICAgICAgdHJhbnNmb3JtLm0zMSgpLCB0
cmFuc2Zvcm0ubTMyKCksIDAsIHRyYW5zZm9ybS5tMzMoKQotICAgICAgICAgICAgICAgICk7Ci0g
ICAgcm9vdFRleHR1cmVNYXBwZXJMYXllci0+c2V0VHJhbnNmb3JtKG1hdHJpeCk7Ci0gICAgcm9v
dFRleHR1cmVNYXBwZXJMYXllci0+c2V0T3BhY2l0eShwYWludGVyLT5vcGFjaXR5KCkpOwotICAg
IHRleHR1cmVNYXBwZXItPmJlZ2luUGFpbnRpbmcoKTsKLSAgICB0ZXh0dXJlTWFwcGVyLT5iZWdp
bkNsaXAobWF0cml4LCBjbGlwKTsKLSAgICByb290VGV4dHVyZU1hcHBlckxheWVyLT5wYWludCgp
OwotICAgIHRleHR1cmVNYXBwZXItPmVuZENsaXAoKTsKLSAgICB0ZXh0dXJlTWFwcGVyLT5lbmRQ
YWludGluZygpOwotfQotI2VuZGlmCi0KLS8vIFRoaXMgY29kZSBpcyBjb3BpZWQgZnJvbSBDaHJv
bWVDbGllbnRHdGsuY3BwLgotc3RhdGljIHZvaWQgY29hbGVzY2VSZWN0c0lmUG9zc2libGUoY29u
c3QgUVJlY3QmIGNsaXBSZWN0LCBRVmVjdG9yPFFSZWN0PiYgcmVjdHMpCi17Ci0gICAgY29uc3Qg
dW5zaWduZWQgaW50IHJlY3RUaHJlc2hvbGQgPSAxMDsKLSAgICBjb25zdCBmbG9hdCB3YXN0ZWRT
cGFjZVRocmVzaG9sZCA9IDAuNzVmOwotICAgIGJvb2wgdXNlVW5pb25lZFJlY3QgPSAocmVjdHMu
c2l6ZSgpIDw9IDEpIHx8IChyZWN0cy5zaXplKCkgPiByZWN0VGhyZXNob2xkKTsKLSAgICBpZiAo
IXVzZVVuaW9uZWRSZWN0KSB7Ci0gICAgICAgIC8vIEF0dGVtcHQgdG8gZ3Vlc3Mgd2hldGhlciBv
ciBub3Qgd2Ugc2hvdWxkIHVzZSB0aGUgdW5pb25lZCByZWN0IG9yIHRoZSBpbmRpdmlkdWFsIHJl
Y3RzLgotICAgICAgICAvLyBXZSBkbyB0aGlzIGJ5IGNvbXB1dGluZyB0aGUgcGVyY2VudGFnZSBv
ZiAid2FzdGVkIHNwYWNlIiBpbiB0aGUgdW5pb24uIElmIHRoYXQgd2FzdGVkIHNwYWNlCi0gICAg
ICAgIC8vIGlzIHRvbyBsYXJnZSwgdGhlbiB3ZSB3aWxsIGRvIGluZGl2aWR1YWwgcmVjdCBwYWlu
dGluZyBpbnN0ZWFkLgotICAgICAgICBmbG9hdCB1bmlvblBpeGVscyA9IChjbGlwUmVjdC53aWR0
aCgpICogY2xpcFJlY3QuaGVpZ2h0KCkpOwotICAgICAgICBmbG9hdCBzaW5nbGVQaXhlbHMgPSAw
OwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlY3RzLnNpemUoKTsgKytpKQotICAg
ICAgICAgICAgc2luZ2xlUGl4ZWxzICs9IHJlY3RzW2ldLndpZHRoKCkgKiByZWN0c1tpXS5oZWln
aHQoKTsKLSAgICAgICAgZmxvYXQgd2FzdGVkU3BhY2UgPSAxIC0gKHNpbmdsZVBpeGVscyAvIHVu
aW9uUGl4ZWxzKTsKLSAgICAgICAgaWYgKHdhc3RlZFNwYWNlIDw9IHdhc3RlZFNwYWNlVGhyZXNo
b2xkKQotICAgICAgICAgICAgdXNlVW5pb25lZFJlY3QgPSB0cnVlOwotICAgIH0KLQotICAgIGlm
ICghdXNlVW5pb25lZFJlY3QpCi0gICAgICAgIHJldHVybjsKLQotICAgIHJlY3RzLmNsZWFyKCk7
Ci0gICAgcmVjdHMuYXBwZW5kKGNsaXBSZWN0KTsKLX0KLQotdm9pZCBRV2ViRnJhbWVQcml2YXRl
OjpyZW5kZXJSZWxhdGl2ZUNvb3JkcyhHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIFFGbGFnczxR
V2ViRnJhbWU6OlJlbmRlckxheWVyPiBsYXllcnMsIGNvbnN0IFFSZWdpb24mIGNsaXApCi17Ci0g
ICAgaWYgKCFmcmFtZS0+dmlldygpIHx8ICFmcmFtZS0+Y29udGVudFJlbmRlcmVyKCkpCi0gICAg
ICAgIHJldHVybjsKLQotICAgIFFWZWN0b3I8UVJlY3Q+IHZlY3RvciA9IGNsaXAucmVjdHMoKTsK
LSAgICBpZiAodmVjdG9yLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgUVBhaW50
ZXIqIHBhaW50ZXIgPSBjb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKTsKLQotICAgIFdlYkNvcmU6
OkZyYW1lVmlldyogdmlldyA9IGZyYW1lLT52aWV3KCk7Ci0gICAgdmlldy0+dXBkYXRlTGF5b3V0
QW5kU3R5bGVJZk5lZWRlZFJlY3Vyc2l2ZSgpOwotCi0gICAgaWYgKGxheWVycyAmIFFXZWJGcmFt
ZTo6Q29udGVudHNMYXllcikgewotICAgICAgICBRUmVjdCBjbGlwQm91bmRpbmdSZWN0ID0gY2xp
cC5ib3VuZGluZ1JlY3QoKTsKLSAgICAgICAgY29hbGVzY2VSZWN0c0lmUG9zc2libGUoY2xpcEJv
dW5kaW5nUmVjdCwgdmVjdG9yKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2ZWN0b3Iu
c2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIGNvbnN0IFFSZWN0JiBjbGlwUmVjdCA9IHZlY3Rv
ci5hdChpKTsKLQotICAgICAgICAgICAgUVJlY3QgcmVjdCA9IGNsaXBSZWN0LmludGVyc2VjdGVk
KHZpZXctPmZyYW1lUmVjdCgpKTsKLQotICAgICAgICAgICAgY29udGV4dC0+c2F2ZSgpOwotICAg
ICAgICAgICAgcGFpbnRlci0+c2V0Q2xpcFJlY3QoY2xpcFJlY3QsIFF0OjpJbnRlcnNlY3RDbGlw
KTsKLQotICAgICAgICAgICAgaW50IHggPSB2aWV3LT54KCk7Ci0gICAgICAgICAgICBpbnQgeSA9
IHZpZXctPnkoKTsKLQotICAgICAgICAgICAgaW50IHNjcm9sbFggPSB2aWV3LT5zY3JvbGxYKCk7
Ci0gICAgICAgICAgICBpbnQgc2Nyb2xsWSA9IHZpZXctPnNjcm9sbFkoKTsKLQotICAgICAgICAg
ICAgY29udGV4dC0+dHJhbnNsYXRlKHgsIHkpOwotICAgICAgICAgICAgcmVjdC50cmFuc2xhdGUo
LXgsIC15KTsKLSAgICAgICAgICAgIGNvbnRleHQtPnRyYW5zbGF0ZSgtc2Nyb2xsWCwgLXNjcm9s
bFkpOwotICAgICAgICAgICAgcmVjdC50cmFuc2xhdGUoc2Nyb2xsWCwgc2Nyb2xsWSk7Ci0gICAg
ICAgICAgICBjb250ZXh0LT5jbGlwKHZpZXctPnZpc2libGVDb250ZW50UmVjdCgpKTsKLQotICAg
ICAgICAgICAgdmlldy0+cGFpbnRDb250ZW50cyhjb250ZXh0LCByZWN0KTsKLQotICAgICAgICAg
ICAgY29udGV4dC0+cmVzdG9yZSgpOwotICAgICAgICB9Ci0jaWYgVVNFKEFDQ0VMRVJBVEVEX0NP
TVBPU0lUSU5HKQotICAgICAgICByZW5kZXJDb21wb3NpdGVkTGF5ZXJzKGNvbnRleHQsIEludFJl
Y3QoY2xpcEJvdW5kaW5nUmVjdCkpOwotI2VuZGlmCi0gICAgfQotICAgIHJlbmRlckZyYW1lRXh0
cmFzKGNvbnRleHQsIGxheWVycywgY2xpcCk7Ci0jaWYgRU5BQkxFKElOU1BFQ1RPUikKLSAgICBp
ZiAoZnJhbWUtPnBhZ2UoKS0+aW5zcGVjdG9yQ29udHJvbGxlcigpLT5oaWdobGlnaHRlZE5vZGUo
KSkgewotICAgICAgICBjb250ZXh0LT5zYXZlKCk7Ci0gICAgICAgIGZyYW1lLT5wYWdlKCktPmlu
c3BlY3RvckNvbnRyb2xsZXIoKS0+ZHJhd0hpZ2hsaWdodCgqY29udGV4dCk7Ci0gICAgICAgIGNv
bnRleHQtPnJlc3RvcmUoKTsKLSAgICB9Ci0jZW5kaWYKLX0KLQotdm9pZCBRV2ViRnJhbWVQcml2
YXRlOjpyZW5kZXJGcmFtZUV4dHJhcyhHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIFFGbGFnczxR
V2ViRnJhbWU6OlJlbmRlckxheWVyPiBsYXllcnMsIGNvbnN0IFFSZWdpb24mIGNsaXApCi17Ci0g
ICAgaWYgKCEobGF5ZXJzICYgKFFXZWJGcmFtZTo6UGFuSWNvbkxheWVyIHwgUVdlYkZyYW1lOjpT
Y3JvbGxCYXJMYXllcikpKQotICAgICAgICByZXR1cm47Ci0gICAgUVBhaW50ZXIqIHBhaW50ZXIg
PSBjb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKTsKLSAgICBXZWJDb3JlOjpGcmFtZVZpZXcqIHZp
ZXcgPSBmcmFtZS0+dmlldygpOwotICAgIFFWZWN0b3I8UVJlY3Q+IHZlY3RvciA9IGNsaXAucmVj
dHMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHZlY3Rvci5zaXplKCk7ICsraSkgewotICAg
ICAgICBjb25zdCBRUmVjdCYgY2xpcFJlY3QgPSB2ZWN0b3IuYXQoaSk7Ci0KLSAgICAgICAgUVJl
Y3QgaW50ZXJzZWN0ZWRSZWN0ID0gY2xpcFJlY3QuaW50ZXJzZWN0ZWQodmlldy0+ZnJhbWVSZWN0
KCkpOwotCi0gICAgICAgIHBhaW50ZXItPnNhdmUoKTsKLSAgICAgICAgcGFpbnRlci0+c2V0Q2xp
cFJlY3QoY2xpcFJlY3QsIFF0OjpJbnRlcnNlY3RDbGlwKTsKLQotICAgICAgICBpbnQgeCA9IHZp
ZXctPngoKTsKLSAgICAgICAgaW50IHkgPSB2aWV3LT55KCk7Ci0KLSAgICAgICAgaWYgKGxheWVy
cyAmIFFXZWJGcmFtZTo6U2Nyb2xsQmFyTGF5ZXIKLSAgICAgICAgICAgICYmICF2aWV3LT5zY3Jv
bGxiYXJzU3VwcHJlc3NlZCgpCi0gICAgICAgICAgICAmJiAodmlldy0+aG9yaXpvbnRhbFNjcm9s
bGJhcigpIHx8IHZpZXctPnZlcnRpY2FsU2Nyb2xsYmFyKCkpKSB7Ci0KLSAgICAgICAgICAgIFFS
ZWN0IHJlY3QgPSBpbnRlcnNlY3RlZFJlY3Q7Ci0gICAgICAgICAgICBjb250ZXh0LT50cmFuc2xh
dGUoeCwgeSk7Ci0gICAgICAgICAgICByZWN0LnRyYW5zbGF0ZSgteCwgLXkpOwotICAgICAgICAg
ICAgdmlldy0+cGFpbnRTY3JvbGxiYXJzKGNvbnRleHQsIHJlY3QpOwotICAgICAgICAgICAgY29u
dGV4dC0+dHJhbnNsYXRlKC14LCAteSk7Ci0gICAgICAgIH0KLQotI2lmIEVOQUJMRShQQU5fU0NS
T0xMSU5HKQotICAgICAgICBpZiAobGF5ZXJzICYgUVdlYkZyYW1lOjpQYW5JY29uTGF5ZXIpCi0g
ICAgICAgICAgICB2aWV3LT5wYWludFBhblNjcm9sbEljb24oY29udGV4dCk7Ci0jZW5kaWYKLQot
ICAgICAgICBwYWludGVyLT5yZXN0b3JlKCk7Ci0gICAgfQotfQotCi12b2lkIFFXZWJGcmFtZVBy
aXZhdGU6OmVtaXRVcmxDaGFuZ2VkKCkKLXsKLSAgICB1cmwgPSBmcmFtZS0+ZG9jdW1lbnQoKS0+
dXJsKCk7Ci0gICAgZW1pdCBxLT51cmxDaGFuZ2VkKHVybCk7Ci19Ci0KLXZvaWQgUVdlYkZyYW1l
UHJpdmF0ZTo6ZGlkU3RhcnRQcm92aXNpb25hbExvYWQoKQotewotICAgIGVtaXQgcS0+cHJvdmlz
aW9uYWxMb2FkKCk7Ci19Ci0KLXZvaWQgUVdlYkZyYW1lUHJpdmF0ZTo6X3Ffb3JpZW50YXRpb25D
aGFuZ2VkKCkKLXsKLSNpZiBFTkFCTEUoT1JJRU5UQVRJT05fRVZFTlRTKQotICAgIGludCBvcmll
bnRhdGlvbjsKLSAgICBXZWJDb3JlOjpGcmFtZSogZnJhbWUgPSBjb3JlKHEpOwotCi0gICAgc3dp
dGNoIChtX29yaWVudGF0aW9uLnJlYWRpbmcoKS0+b3JpZW50YXRpb24oKSkgewotICAgIGNhc2Ug
UU9yaWVudGF0aW9uUmVhZGluZzo6VG9wVXA6Ci0gICAgICAgIG9yaWVudGF0aW9uID0gMDsKLSAg
ICAgICAgYnJlYWs7Ci0gICAgY2FzZSBRT3JpZW50YXRpb25SZWFkaW5nOjpUb3BEb3duOgotICAg
ICAgICBvcmllbnRhdGlvbiA9IDE4MDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBRT3JpZW50
YXRpb25SZWFkaW5nOjpMZWZ0VXA6Ci0gICAgICAgIG9yaWVudGF0aW9uID0gLTkwOwotICAgICAg
ICBicmVhazsKLSAgICBjYXNlIFFPcmllbnRhdGlvblJlYWRpbmc6OlJpZ2h0VXA6Ci0gICAgICAg
IG9yaWVudGF0aW9uID0gOTA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUU9yaWVudGF0aW9u
UmVhZGluZzo6RmFjZVVwOgotICAgIGNhc2UgUU9yaWVudGF0aW9uUmVhZGluZzo6RmFjZURvd246
Ci0gICAgICAgIC8vIFdlYkNvcmUgdW5hYmxlIHRvIGhhbmRsZSBpdAotICAgIGRlZmF1bHQ6Ci0g
ICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZnJhbWUtPnNlbmRPcmllbnRhdGlvbkNoYW5nZUV2
ZW50KG9yaWVudGF0aW9uKTsKLSNlbmRpZgotfQotCi12b2lkIFFXZWJGcmFtZVByaXZhdGU6OmRp
ZENsZWFyV2luZG93T2JqZWN0KCkKLXsKLSAgICBlbWl0IHEtPmphdmFTY3JpcHRXaW5kb3dPYmpl
Y3RDbGVhcmVkKCk7Ci19Ci0KLWJvb2wgUVdlYkZyYW1lUHJpdmF0ZTo6aGFuZGxlUHJvZ3Jlc3NG
aW5pc2hlZChRUG9pbnQgKmxvY2FsUG9zKQotewotICAgIFFXaWRnZXQgKnZpZXcgPSBxLT5wYWdl
KCktPnZpZXcoKTsKLSAgICBpZiAoIXZpZXcgfHwgIWxvY2FsUG9zKQotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgKmxvY2FsUG9zID0gdmlldy0+bWFwRnJvbUdsb2JhbChRQ3Vyc29yOjpwb3Mo
KSk7Ci0gICAgcmV0dXJuIHZpZXctPmhhc0ZvY3VzKCkgJiYgdmlldy0+cmVjdCgpLmNvbnRhaW5z
KCpsb2NhbFBvcyk7Ci19Ci0KLXZvaWQgUVdlYkZyYW1lUHJpdmF0ZTo6ZW1pdEluaXRpYWxMYXlv
dXRDb21wbGV0ZWQoKQotewotICAgIGVtaXQgcS0+aW5pdGlhbExheW91dENvbXBsZXRlZCgpOwot
fQotCi12b2lkIFFXZWJGcmFtZVByaXZhdGU6OmVtaXRJY29uQ2hhbmdlZCgpCi17Ci0gICAgZW1p
dCBxLT5pY29uQ2hhbmdlZCgpOwotfQotCi12b2lkIFFXZWJGcmFtZVByaXZhdGU6OmVtaXRMb2Fk
U3RhcnRlZChib29sIG9yaWdpbmF0aW5nTG9hZCkKLXsKLSAgICBpZiAocGFnZSAmJiBvcmlnaW5h
dGluZ0xvYWQpCi0gICAgICAgIGVtaXQgcGFnZS0+bG9hZFN0YXJ0ZWQoKTsKLSAgICBlbWl0IHEt
PmxvYWRTdGFydGVkKCk7Ci19Ci0KLXZvaWQgUVdlYkZyYW1lUHJpdmF0ZTo6ZW1pdExvYWRGaW5p
c2hlZChib29sIG9yaWdpbmF0aW5nTG9hZCwgYm9vbCBvaykKLXsKLSAgICBpZiAocGFnZSAmJiBv
cmlnaW5hdGluZ0xvYWQpCi0gICAgICAgIGVtaXQgcGFnZS0+bG9hZEZpbmlzaGVkKG9rKTsKLSAg
ICBlbWl0IHEtPmxvYWRGaW5pc2hlZChvayk7Ci19Ci0KLVFXZWJGcmFtZUFkYXB0ZXIqIFFXZWJG
cmFtZVByaXZhdGU6OmNyZWF0ZUNoaWxkRnJhbWUoUVdlYkZyYW1lRGF0YSogZnJhbWVEYXRhKQot
ewotICAgIFFXZWJGcmFtZSogbmV3RnJhbWUgPSBuZXcgUVdlYkZyYW1lKC8qcGFyZW50IGZyYW1l
Ki9xLCBmcmFtZURhdGEpOwotICAgIHJldHVybiBuZXdGcmFtZS0+ZDsKLX0KLQotUVdlYkZyYW1l
ICpRV2ViRnJhbWVQcml2YXRlOjphcGlIYW5kbGUoKQotewotICAgIHJldHVybiBxOwotfQotCi1R
T2JqZWN0ICpRV2ViRnJhbWVQcml2YXRlOjpoYW5kbGUoKQotewotICAgIHJldHVybiBxOwotfQot
Ci12b2lkIFFXZWJGcmFtZVByaXZhdGU6OmNvbnRlbnRzU2l6ZURpZENoYW5nZShjb25zdCBRU2l6
ZSAmc2l6ZSkKLXsKLSAgICBlbWl0IHEtPmNvbnRlbnRzU2l6ZUNoYW5nZWQoc2l6ZSk7Ci19Ci0K
LWludCBRV2ViRnJhbWVQcml2YXRlOjpzY3JvbGxCYXJQb2xpY3koUXQ6Ok9yaWVudGF0aW9uIG9y
aWVudGF0aW9uKSBjb25zdAotewotICAgIHJldHVybiAoaW50KSBxLT5zY3JvbGxCYXJQb2xpY3ko
b3JpZW50YXRpb24pOwotfQotCi0vKiEKLSAgICBcY2xhc3MgUVdlYkZyYW1lCi0gICAgXHNpbmNl
IDQuNAotICAgIFxicmllZiBUaGUgUVdlYkZyYW1lIGNsYXNzIHJlcHJlc2VudHMgYSBmcmFtZSBp
biBhIHdlYiBwYWdlLgotCi0gICAgXGlubW9kdWxlIFF0V2ViS2l0Ci0KLSAgICBRV2ViRnJhbWUg
cmVwcmVzZW50cyBhIGZyYW1lIGluc2lkZSBhIHdlYiBwYWdlLiBFYWNoIFFXZWJQYWdlCi0gICAg
b2JqZWN0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBmcmFtZSwgdGhlIG1haW4gZnJhbWUsIG9idGFp
bmVkIHVzaW5nCi0gICAgUVdlYlBhZ2U6Om1haW5GcmFtZSgpLiBBZGRpdGlvbmFsIGZyYW1lcyB3
aWxsIGJlIGNyZWF0ZWQgZm9yIEhUTUwKLSAgICBcY3s8ZnJhbWU+fSBvciBcY3s8aWZyYW1lPn0g
ZWxlbWVudHMuCi0KLSAgICBBIGZyYW1lIGNhbiBiZSBsb2FkZWQgdXNpbmcgbG9hZCgpIG9yIHNl
dFVybCgpLiBBbHRlcm5hdGl2ZWx5LCBpZiB5b3UgaGF2ZQotICAgIHRoZSBIVE1MIGNvbnRlbnQg
cmVhZGlseSBhdmFpbGFibGUsIHlvdSBjYW4gdXNlIHNldEh0bWwoKSBpbnN0ZWFkLgotCi0gICAg
VGhlIHBhZ2UoKSBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgd2ViIHBhZ2Ugb2Jq
ZWN0LiBTZWUKLSAgICBcbHtRV2ViVmlld317RWxlbWVudHMgb2YgUVdlYlZpZXd9IGZvciBhbiBl
eHBsYW5hdGlvbiBvZiBob3cgd2ViCi0gICAgZnJhbWVzIGFyZSByZWxhdGVkIHRvIGEgd2ViIHBh
Z2UgYW5kIHdlYiB2aWV3LgotCi0gICAgVGhlIFFXZWJGcmFtZSBjbGFzcyBhbHNvIG9mZmVycyBt
ZXRob2RzIHRvIHJldHJpZXZlIGJvdGggdGhlIFVSTCBjdXJyZW50bHkKLSAgICBsb2FkZWQgYnkg
dGhlIGZyYW1lIChzZWUgdXJsKCkpIGFzIHdlbGwgYXMgdGhlIFVSTCBvcmlnaW5hbGx5IHJlcXVl
c3RlZAotICAgIHRvIGJlIGxvYWRlZCAoc2VlIHJlcXVlc3RlZFVybCgpKS4gVGhlc2UgbWV0aG9k
cyBtYWtlIHBvc3NpYmxlIHRoZSByZXRyaWV2YWwKLSAgICBvZiB0aGUgVVJMIGJlZm9yZSBhbmQg
YWZ0ZXIgYSBETlMgcmVzb2x1dGlvbiBvciBhIHJlZGlyZWN0aW9uIG9jY3VycyBkdXJpbmcKLSAg
ICB0aGUgbG9hZCBwcm9jZXNzLiBUaGUgcmVxdWVzdGVkVXJsKCkgYWxzbyBtYXRjaGVzIHRvIHRo
ZSBVUkwgYWRkZWQgdG8gdGhlCi0gICAgZnJhbWUgaGlzdG9yeSAoXGx7UVdlYkhpc3Rvcnl9KSBp
ZiBsb2FkIGlzIHN1Y2Nlc3NmdWwuCi0KLSAgICBUaGUgdGl0bGUgb2YgYW4gSFRNTCBmcmFtZSBj
YW4gYmUgYWNjZXNzZWQgd2l0aCB0aGUgdGl0bGUoKSBwcm9wZXJ0eS4KLSAgICBBZGRpdGlvbmFs
bHksIGEgZnJhbWUgbWF5IGFsc28gc3BlY2lmeSBhbiBpY29uLCB3aGljaCBjYW4gYmUgYWNjZXNz
ZWQKLSAgICB1c2luZyB0aGUgaWNvbigpIHByb3BlcnR5LiBJZiB0aGUgdGl0bGUgb3IgdGhlIGlj
b24gY2hhbmdlcywgdGhlCi0gICAgY29ycmVzcG9uZGluZyB0aXRsZUNoYW5nZWQoKSBhbmQgaWNv
bkNoYW5nZWQoKSBzaWduYWxzIHdpbGwgYmUgZW1pdHRlZC4KLSAgICBUaGUgem9vbUZhY3Rvcigp
IHByb3BlcnR5IGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGUgb3ZlcmFsbCBzaXplCi0gICAgb2Yg
dGhlIGNvbnRlbnQgZGlzcGxheWVkIGluIHRoZSBmcmFtZS4KLQotICAgIFFXZWJGcmFtZSBvYmpl
Y3RzIGFyZSBjcmVhdGVkIGFuZCBjb250cm9sbGVkIGJ5IHRoZSB3ZWIgcGFnZS4gWW91Ci0gICAg
Y2FuIGNvbm5lY3QgdG8gdGhlIHdlYiBwYWdlJ3MgXGx7UVdlYlBhZ2U6On17ZnJhbWVDcmVhdGVk
KCl9IHNpZ25hbAotICAgIHRvIGJlIG5vdGlmaWVkIHdoZW4gYSBuZXcgZnJhbWUgaXMgY3JlYXRl
ZC4KLQotICAgIFRoZXJlIGFyZSBtdWx0aXBsZSB3YXlzIHRvIHByb2dyYW1tYXRpY2FsbHkgZXhh
bWluZSB0aGUgY29udGVudHMgb2YgYSBmcmFtZS4KLSAgICBUaGUgaGl0VGVzdENvbnRlbnQoKSBm
dW5jdGlvbiBjYW4gYmUgdXNlZCB0byBmaW5kIGVsZW1lbnRzIGJ5IGNvb3JkaW5hdGUuCi0gICAg
Rm9yIGFjY2VzcyB0byB0aGUgdW5kZXJseWluZyBET00gdHJlZSwgdGhlcmUgaXMgZG9jdW1lbnRF
bGVtZW50KCksCi0gICAgZmluZEFsbEVsZW1lbnRzKCkgYW5kIGZpbmRGaXJzdEVsZW1lbnQoKS4K
LQotICAgIEEgUVdlYkZyYW1lIGNhbiBiZSBwcmludGVkIG9udG8gYSBRUHJpbnRlciB1c2luZyB0
aGUgcHJpbnQoKSBmdW5jdGlvbi4KLSAgICBUaGlzIGZ1bmN0aW9uIGlzIG1hcmtlZCBhcyBhIHNs
b3QgYW5kIGNhbiBiZSBjb252ZW5pZW50bHkgY29ubmVjdGVkIHRvCi0gICAgXGx7UVByaW50UHJl
dmlld0RpYWxvZ30ncyBcbHtRUHJpbnRQcmV2aWV3RGlhbG9nOjp9e3BhaW50UmVxdWVzdGVkKCl9
Ci0gICAgc2lnbmFsLgotCi0gICAgXHNhIFFXZWJQYWdlCi0qLwotCi0vKiEKLSAgICBcZW51bSBR
V2ViRnJhbWU6OlJlbmRlckxheWVyCi0KLSAgICBUaGlzIGVudW0gZGVzY3JpYmVzIHRoZSBsYXll
cnMgYXZhaWxhYmxlIGZvciByZW5kZXJpbmcgdXNpbmcgXGx7UVdlYkZyYW1lOjp9e3JlbmRlcigp
fS4KLSAgICBUaGUgbGF5ZXJzIGNhbiBiZSBPUi1lZCB0b2dldGhlciBmcm9tIHRoZSBmb2xsb3dp
bmcgbGlzdDoKLQotICAgIFx2YWx1ZSBDb250ZW50c0xheWVyIFRoZSB3ZWIgY29udGVudCBvZiB0
aGUgZnJhbWUKLSAgICBcdmFsdWUgU2Nyb2xsQmFyTGF5ZXIgVGhlIHNjcm9sbGJhcnMgb2YgdGhl
IGZyYW1lCi0gICAgXHZhbHVlIFBhbkljb25MYXllciBUaGUgaWNvbiB1c2VkIHdoZW4gcGFubmlu
ZyB0aGUgZnJhbWUKLQotICAgIFx2YWx1ZSBBbGxMYXllcnMgSW5jbHVkZXMgYWxsIHRoZSBhYm92
ZSBsYXllcnMKLSovCi0KLVFXZWJGcmFtZTo6UVdlYkZyYW1lKFFXZWJQYWdlICpwYXJlbnRQYWdl
KQotICAgIDogUU9iamVjdChwYXJlbnRQYWdlKQotICAgICwgZChuZXcgUVdlYkZyYW1lUHJpdmF0
ZSkKLXsKLSAgICBkLT5wYWdlID0gcGFyZW50UGFnZTsKLSAgICBkLT5xID0gdGhpczsKLSAgICBk
LT5pbml0KC8qcGFnZSBhZGFwdGVyKi8gcGFyZW50UGFnZS0+aGFuZGxlKCkpOwotCi0jaWYgRU5B
QkxFKE9SSUVOVEFUSU9OX0VWRU5UUykKLSAgICBjb25uZWN0KCZkLT5tX29yaWVudGF0aW9uLCBT
SUdOQUwocmVhZGluZ0NoYW5nZWQoKSksIHRoaXMsIFNMT1QoX3Ffb3JpZW50YXRpb25DaGFuZ2Vk
KCkpKTsKLSAgICBkLT5tX29yaWVudGF0aW9uLnN0YXJ0KCk7Ci0jZW5kaWYKLX0KLQotUVdlYkZy
YW1lOjpRV2ViRnJhbWUoUVdlYkZyYW1lKiBwYXJlbnQsIFFXZWJGcmFtZURhdGEqIGZyYW1lRGF0
YSkKLSAgICA6IFFPYmplY3QocGFyZW50KQotICAgICwgZChuZXcgUVdlYkZyYW1lUHJpdmF0ZSkK
LXsKLSAgICBkLT5wYWdlID0gcGFyZW50LT5kLT5wYWdlOwotICAgIGQtPnEgPSB0aGlzOwotICAg
IGQtPmluaXQocGFyZW50LT5kLT5wYWdlQWRhcHRlciwgZnJhbWVEYXRhKTsKLSNpZiBFTkFCTEUo
T1JJRU5UQVRJT05fRVZFTlRTKQotICAgIGNvbm5lY3QoJmQtPm1fb3JpZW50YXRpb24sIFNJR05B
TChyZWFkaW5nQ2hhbmdlZCgpKSwgdGhpcywgU0xPVChfcV9vcmllbnRhdGlvbkNoYW5nZWQoKSkp
OwotICAgIGQtPm1fb3JpZW50YXRpb24uc3RhcnQoKTsKLSNlbmRpZgotfQotCi1RV2ViRnJhbWU6
On5RV2ViRnJhbWUoKQotewotICAgIGRlbGV0ZSBkOwotfQotCi0vKiEKLSAgICBcZm4gdm9pZCBR
V2ViRnJhbWU6OmFkZFRvSmF2YVNjcmlwdFdpbmRvd09iamVjdChjb25zdCBRU3RyaW5nICZuYW1l
LCBRT2JqZWN0ICpvYmplY3QsIFZhbHVlT3duZXJzaGlwIG93bikKLQotICAgIE1ha2UgXGEgb2Jq
ZWN0IGF2YWlsYWJsZSB1bmRlciBcYSBuYW1lIGZyb20gd2l0aGluIHRoZSBmcmFtZSdzIEphdmFT
Y3JpcHQKLSAgICBjb250ZXh0LiBUaGUgXGEgb2JqZWN0IHdpbGwgYmUgaW5zZXJ0ZWQgYXMgYSBj
aGlsZCBvZiB0aGUgZnJhbWUncyB3aW5kb3cKLSAgICBvYmplY3QuCi0KLSAgICBRdCBwcm9wZXJ0
aWVzIHdpbGwgYmUgZXhwb3NlZCBhcyBKYXZhU2NyaXB0IHByb3BlcnRpZXMgYW5kIHNsb3RzIGFz
Ci0gICAgSmF2YVNjcmlwdCBtZXRob2RzLgotICAgIFRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIEMr
KyBhbmQgSmF2YVNjcmlwdCBpcyBleHBsYWluZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhl
IFxse1RoZSBRdFdlYktpdCBCcmlkZ2V9e1F0V2ViS2l0IGJyaWRnZX0uCi0KLSAgICBJZiB5b3Ug
d2FudCB0byBlbnN1cmUgdGhhdCB5b3VyIFFPYmplY3RzIHJlbWFpbiBhY2Nlc3NpYmxlIGFmdGVy
IGxvYWRpbmcgYQotICAgIG5ldyBVUkwsIHlvdSBzaG91bGQgYWRkIHRoZW0gaW4gYSBzbG90IGNv
bm5lY3RlZCB0byB0aGUKLSAgICBqYXZhU2NyaXB0V2luZG93T2JqZWN0Q2xlYXJlZCgpIHNpZ25h
bC4KLQotICAgIElmIEphdmFzY3JpcHQgaXMgbm90IGVuYWJsZWQgZm9yIHRoaXMgcGFnZSwgdGhl
biB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuCi0KLSAgICBUaGUgb3duZXJzaGlwIG9mIFxhIG9i
amVjdCBpcyBzcGVjaWZpZWQgdXNpbmcgXGEgb3duLgotKi8KLXZvaWQgUVdlYkZyYW1lOjphZGRU
b0phdmFTY3JpcHRXaW5kb3dPYmplY3QoY29uc3QgUVN0cmluZyAmbmFtZSwgUU9iamVjdCAqb2Jq
ZWN0LCBWYWx1ZU93bmVyc2hpcCBvd25lcnNoaXApCi17Ci0gICAgaWYgKCFwYWdlKCktPnNldHRp
bmdzKCktPnRlc3RBdHRyaWJ1dGUoUVdlYlNldHRpbmdzOjpKYXZhc2NyaXB0RW5hYmxlZCkpCi0g
ICAgICAgIHJldHVybjsKLSAgICBKU0M6OkJpbmRpbmdzOjpRdEluc3RhbmNlOjpWYWx1ZU93bmVy
c2hpcCB2YWx1ZU93bmVyc2hpcCA9IHN0YXRpY19jYXN0PEpTQzo6QmluZGluZ3M6OlF0SW5zdGFu
Y2U6OlZhbHVlT3duZXJzaGlwPihvd25lcnNoaXApOwotICAgIEpTRE9NV2luZG93KiB3aW5kb3cg
PSB0b0pTRE9NV2luZG93KGQtPmZyYW1lLCBtYWluVGhyZWFkTm9ybWFsV29ybGQoKSk7Ci0gICAg
SlNDOjpCaW5kaW5nczo6Um9vdE9iamVjdCogcm9vdDsKLSAgICBpZiAodmFsdWVPd25lcnNoaXAg
PT0gSlNDOjpCaW5kaW5nczo6UXRJbnN0YW5jZTo6UXRPd25lcnNoaXApCi0gICAgICAgIHJvb3Qg
PSBkLT5mcmFtZS0+c2NyaXB0KCktPmNhY2hlYWJsZUJpbmRpbmdSb290T2JqZWN0KCk7Ci0gICAg
ZWxzZQotICAgICAgICByb290ID0gZC0+ZnJhbWUtPnNjcmlwdCgpLT5iaW5kaW5nUm9vdE9iamVj
dCgpOwotCi0gICAgaWYgKCF3aW5kb3cpIHsKLSAgICAgICAgcURlYnVnKCkgPDwgIldhcm5pbmc6
IGNvdWxkbid0IGdldCB3aW5kb3cgb2JqZWN0IjsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAg
ICBpZiAoIXJvb3QpIHsKLSAgICAgICAgcURlYnVnKCkgPDwgIldhcm5pbmc6IGNvdWxkbid0IGdl
dCByb290IG9iamVjdCI7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBKU0M6OkV4ZWNT
dGF0ZSogZXhlYyA9IHdpbmRvdy0+Z2xvYmFsRXhlYygpOwotICAgIEpTQzo6SlNMb2NrSG9sZGVy
IGxvY2soZXhlYyk7Ci0KLSAgICBKU0M6OkpTT2JqZWN0KiBydW50aW1lT2JqZWN0ID0KLSAgICAg
ICAgICAgIEpTQzo6QmluZGluZ3M6OlF0SW5zdGFuY2U6OmdldFF0SW5zdGFuY2Uob2JqZWN0LCBy
b290LCB2YWx1ZU93bmVyc2hpcCktPmNyZWF0ZVJ1bnRpbWVPYmplY3QoZXhlYyk7Ci0KLSAgICBK
U0M6OlB1dFByb3BlcnR5U2xvdCBzbG90OwotICAgIHdpbmRvdy0+bWV0aG9kVGFibGUoKS0+cHV0
KHdpbmRvdywgZXhlYywgSlNDOjpJZGVudGlmaWVyKCZleGVjLT5nbG9iYWxEYXRhKCksIHJlaW50
ZXJwcmV0X2Nhc3RfcHRyPGNvbnN0IFVDaGFyKj4obmFtZS5jb25zdERhdGEoKSksIG5hbWUubGVu
Z3RoKCkpLCBydW50aW1lT2JqZWN0LCBzbG90KTsKLX0KLQotLyohCi0gICAgUmV0dXJucyB0aGUg
ZnJhbWUncyBjb250ZW50IGFzIEhUTUwsIGVuY2xvc2VkIGluIEhUTUwgYW5kIEJPRFkgdGFncy4K
LQotICAgIFxzYSBzZXRIdG1sKCksIHRvUGxhaW5UZXh0KCkKLSovCi1RU3RyaW5nIFFXZWJGcmFt
ZTo6dG9IdG1sKCkgY29uc3QKLXsKLSAgICBpZiAoIWQtPmZyYW1lLT5kb2N1bWVudCgpKQotICAg
ICAgICByZXR1cm4gUVN0cmluZygpOwotICAgIHJldHVybiBjcmVhdGVNYXJrdXAoZC0+ZnJhbWUt
PmRvY3VtZW50KCkpOwotfQotCi0vKiEKLSAgICBSZXR1cm5zIHRoZSBjb250ZW50IG9mIHRoaXMg
ZnJhbWUgY29udmVydGVkIHRvIHBsYWluIHRleHQsIGNvbXBsZXRlbHkKLSAgICBzdHJpcHBlZCBv
ZiBhbGwgSFRNTCBmb3JtYXR0aW5nLgotCi0gICAgXHNhIHRvSHRtbCgpCi0qLwotUVN0cmluZyBR
V2ViRnJhbWU6OnRvUGxhaW5UZXh0KCkgY29uc3QKLXsKLSAgICBpZiAoZC0+ZnJhbWUtPnZpZXco
KSAmJiBkLT5mcmFtZS0+dmlldygpLT5sYXlvdXRQZW5kaW5nKCkpCi0gICAgICAgIGQtPmZyYW1l
LT52aWV3KCktPmxheW91dCgpOwotCi0gICAgRWxlbWVudCAqZG9jdW1lbnRFbGVtZW50ID0gZC0+
ZnJhbWUtPmRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgpOwotICAgIGlmIChkb2N1bWVudEVs
ZW1lbnQpCi0gICAgICAgIHJldHVybiBkb2N1bWVudEVsZW1lbnQtPmlubmVyVGV4dCgpOwotICAg
IHJldHVybiBRU3RyaW5nKCk7Ci19Ci0KLS8qIQotICAgIFJldHVybnMgYSBkdW1wIG9mIHRoZSBy
ZW5kZXJpbmcgdHJlZS4gVGhpcyBpcyBtYWlubHkgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKLSAgICBo
dG1sLgotKi8KLVFTdHJpbmcgUVdlYkZyYW1lOjpyZW5kZXJUcmVlRHVtcCgpIGNvbnN0Ci17Ci0g
ICAgaWYgKGQtPmZyYW1lLT52aWV3KCkgJiYgZC0+ZnJhbWUtPnZpZXcoKS0+bGF5b3V0UGVuZGlu
ZygpKQotICAgICAgICBkLT5mcmFtZS0+dmlldygpLT5sYXlvdXQoKTsKLQotICAgIHJldHVybiBl
eHRlcm5hbFJlcHJlc2VudGF0aW9uKGQtPmZyYW1lKTsKLX0KLQotLyohCi0gICAgXHByb3BlcnR5
IFFXZWJGcmFtZTo6dGl0bGUKLSAgICBcYnJpZWYgdGhlIHRpdGxlIG9mIHRoZSBmcmFtZSBhcyBk
ZWZpbmVkIGJ5IHRoZSBIVE1MICZsdDt0aXRsZSZndDsgZWxlbWVudAotCi0gICAgXHNhIHRpdGxl
Q2hhbmdlZCgpCi0qLwotCi1RU3RyaW5nIFFXZWJGcmFtZTo6dGl0bGUoKSBjb25zdAotewotICAg
IGlmIChkLT5mcmFtZS0+ZG9jdW1lbnQoKSkKLSAgICAgICAgcmV0dXJuIGQtPmZyYW1lLT5sb2Fk
ZXIoKS0+ZG9jdW1lbnRMb2FkZXIoKS0+dGl0bGUoKS5zdHJpbmcoKTsKLSAgICByZXR1cm4gUVN0
cmluZygpOwotfQotCi0vKiEKLSAgICBcc2luY2UgNC41Ci0gICAgXGJyaWVmIFJldHVybnMgdGhl
IG1ldGEgZGF0YSBpbiB0aGlzIGZyYW1lIGFzIGEgUU11bHRpTWFwCi0KLSAgICBUaGUgbWV0YSBk
YXRhIGNvbnNpc3RzIG9mIHRoZSBuYW1lIGFuZCBjb250ZW50IGF0dHJpYnV0ZXMgb2YgdGhlCi0g
ICAgb2YgdGhlIFxjezxtZXRhPn0gdGFncyBpbiB0aGUgSFRNTCBkb2N1bWVudC4KLQotICAgIEZv
ciBleGFtcGxlOgotCi0gICAgXGNvZGUKLSAgICA8aHRtbD4KLSAgICAgICAgPGhlYWQ+Ci0gICAg
ICAgICAgICA8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhpcyBkb2N1bWVudCBp
cyBhIHR1dG9yaWFsIGFib3V0IFF0IGRldmVsb3BtZW50Ij4KLSAgICAgICAgICAgIDxtZXRhIG5h
bWU9ImtleXdvcmRzIiBjb250ZW50PSJRdCwgV2ViS2l0LCBQcm9ncmFtbWluZyI+Ci0gICAgICAg
IDwvaGVhZD4KLSAgICAgICAgLi4uCi0gICAgPC9odG1sPgotICAgIFxlbmRjb2RlCi0KLSAgICBH
aXZlbiB0aGUgYWJvdmUgSFRNTCBjb2RlIHRoZSBtZXRhRGF0YSgpIGZ1bmN0aW9uIHdpbGwgcmV0
dXJuIGEgbWFwIHdpdGggdHdvIGVudHJpZXM6Ci0gICAgXHRhYmxlCi0gICAgXGhlYWRlciBcbGkg
S2V5Ci0gICAgICAgICAgICBcbGkgVmFsdWUKLSAgICBccm93ICAgIFxsaSAiZGVzY3JpcHRpb24i
Ci0gICAgICAgICAgICBcbGkgIlRoaXMgZG9jdW1lbnQgaXMgYSB0dXRvcmlhbCBhYm91dCBRdCBk
ZXZlbG9wbWVudCIKLSAgICBccm93ICAgIFxsaSAia2V5d29yZHMiCi0gICAgICAgICAgICBcbGkg
IlF0LCBXZWJLaXQsIFByb2dyYW1taW5nIgotICAgIFxlbmR0YWJsZQotCi0gICAgVGhpcyBmdW5j
dGlvbiByZXR1cm5zIGEgbXVsdGkgbWFwIHRvIHN1cHBvcnQgbXVsdGlwbGUgbWV0YSB0YWdzIHdp
dGggdGhlIHNhbWUgYXR0cmlidXRlIG5hbWUuCi0qLwotUU11bHRpTWFwPFFTdHJpbmcsIFFTdHJp
bmc+IFFXZWJGcmFtZTo6bWV0YURhdGEoKSBjb25zdAotewotICAgIGlmICghZC0+ZnJhbWUtPmRv
Y3VtZW50KCkpCi0gICAgICAgcmV0dXJuIFFNYXA8UVN0cmluZywgUVN0cmluZz4oKTsKLQotICAg
IFFNdWx0aU1hcDxRU3RyaW5nLCBRU3RyaW5nPiBtYXA7Ci0gICAgRG9jdW1lbnQqIGRvYyA9IGQt
PmZyYW1lLT5kb2N1bWVudCgpOwotICAgIFJlZlB0cjxOb2RlTGlzdD4gbGlzdCA9IGRvYy0+Z2V0
RWxlbWVudHNCeVRhZ05hbWUoIm1ldGEiKTsKLSAgICB1bnNpZ25lZCBsZW4gPSBsaXN0LT5sZW5n
dGgoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgICAg
SFRNTE1ldGFFbGVtZW50KiBtZXRhID0gc3RhdGljX2Nhc3Q8SFRNTE1ldGFFbGVtZW50Kj4obGlz
dC0+aXRlbShpKSk7Ci0gICAgICAgIG1hcC5pbnNlcnQobWV0YS0+bmFtZSgpLCBtZXRhLT5jb250
ZW50KCkpOwotICAgIH0KLSAgICByZXR1cm4gbWFwOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQg
Y2xlYXJDb3JlRnJhbWUoV2ViQ29yZTo6RnJhbWUqIGZyYW1lKQotewotICAgIFdlYkNvcmU6OkRv
Y3VtZW50TG9hZGVyKiBkb2N1bWVudExvYWRlciA9IGZyYW1lLT5sb2FkZXIoKS0+YWN0aXZlRG9j
dW1lbnRMb2FkZXIoKTsKLSAgICBRX0FTU0VSVChkb2N1bWVudExvYWRlcik7Ci0gICAgZG9jdW1l
bnRMb2FkZXItPndyaXRlcigpLT5iZWdpbigpOwotICAgIGRvY3VtZW50TG9hZGVyLT53cml0ZXIo
KS0+ZW5kKCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpc0NvcmVGcmFtZUNsZWFyKFdlYkNv
cmU6OkZyYW1lKiBmcmFtZSkKLXsKLSAgICByZXR1cm4gZnJhbWUtPmRvY3VtZW50KCktPnVybCgp
LmlzRW1wdHkoKTsKLX0KLQotLyohCi0gICAgXHByb3BlcnR5IFFXZWJGcmFtZTo6dXJsCi0gICAg
XGJyaWVmIHRoZSB1cmwgb2YgdGhlIGZyYW1lIGN1cnJlbnRseSB2aWV3ZWQKLQotICAgIFNldHRp
bmcgdGhpcyBwcm9wZXJ0eSBjbGVhcnMgdGhlIHZpZXcgYW5kIGxvYWRzIHRoZSBVUkwuCi0KLSAg
ICBCeSBkZWZhdWx0LCB0aGlzIHByb3BlcnR5IGNvbnRhaW5zIGFuIGVtcHR5LCBpbnZhbGlkIFVS
TC4KLQotICAgIFxzYSB1cmxDaGFuZ2VkKCkKLSovCi0KLXZvaWQgUVdlYkZyYW1lOjpzZXRVcmwo
Y29uc3QgUVVybCAmdXJsKQotewotICAgIGNsZWFyQ29yZUZyYW1lKGQtPmZyYW1lKTsKLSAgICBj
b25zdCBRVXJsIGFic29sdXRlID0gUVdlYkZyYW1lQWRhcHRlcjo6ZW5zdXJlQWJzb2x1dGVVcmwo
dXJsKTsKLSAgICBkLT51cmwgPSBhYnNvbHV0ZTsKLSAgICBsb2FkKGFic29sdXRlKTsKLX0KLQot
UVVybCBRV2ViRnJhbWU6OnVybCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGQtPnVybDsKLX0KLQot
LyohCi0gICAgXHNpbmNlIDQuNgotICAgIFxwcm9wZXJ0eSBRV2ViRnJhbWU6OnJlcXVlc3RlZFVy
bAotCi0gICAgVGhlIFVSTCByZXF1ZXN0ZWQgdG8gbG9hZGVkIGJ5IHRoZSBmcmFtZSBjdXJyZW50
bHkgdmlld2VkLiBUaGUgVVJMIG1heSBkaWZmZXIgZnJvbQotICAgIHRoZSBvbmUgcmV0dXJuZWQg
YnkgdXJsKCkgaWYgYSBETlMgcmVzb2x1dGlvbiBvciBhIHJlZGlyZWN0aW9uIG9jY3Vycy4KLQot
ICAgIFxzYSB1cmwoKSwgc2V0VXJsKCkKLSovCi1RVXJsIFFXZWJGcmFtZTo6cmVxdWVzdGVkVXJs
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gZC0+ZnJhbWVMb2FkZXJDbGllbnQtPmxhc3RSZXF1ZXN0
ZWRVcmwoKTsKLX0KLS8qIQotICAgIFxzaW5jZSA0LjYKLSAgICBccHJvcGVydHkgUVdlYkZyYW1l
OjpiYXNlVXJsCi0gICAgXGJyaWVmIHRoZSBiYXNlIFVSTCBvZiB0aGUgZnJhbWUsIGNhbiBiZSB1
c2VkIHRvIHJlc29sdmUgcmVsYXRpdmUgVVJMcwotICAgIFxzaW5jZSA0LjYKLSovCi0KLVFVcmwg
UVdlYkZyYW1lOjpiYXNlVXJsKCkgY29uc3QKLXsKLSAgICBpZiAoaXNDb3JlRnJhbWVDbGVhcihk
LT5mcmFtZSkpCi0gICAgICAgIHJldHVybiBRVXJsKGQtPnVybCkucmVzb2x2ZWQoUVVybCgpKTsK
LSAgICByZXR1cm4gZC0+ZnJhbWUtPmRvY3VtZW50KCktPmJhc2VVUkwoKTsKLX0KLQotLyohCi0g
ICAgXHByb3BlcnR5IFFXZWJGcmFtZTo6aWNvbgotICAgIFxicmllZiB0aGUgaWNvbiBhc3NvY2lh
dGVkIHdpdGggdGhpcyBmcmFtZQotCi0gICAgXHNhIGljb25DaGFuZ2VkKCksIFFXZWJTZXR0aW5n
czo6aWNvbkZvclVybCgpCi0qLwotCi1RSWNvbiBRV2ViRnJhbWU6Omljb24oKSBjb25zdAotewot
ICAgIHJldHVybiBRV2ViU2V0dGluZ3M6Omljb25Gb3JVcmwoZC0+ZnJhbWUtPmRvY3VtZW50KCkt
PnVybCgpKTsKLX0KLQotLyohCi0gIFRoZSBuYW1lIG9mIHRoaXMgZnJhbWUgYXMgZGVmaW5lZCBi
eSB0aGUgcGFyZW50IGZyYW1lLgotKi8KLVFTdHJpbmcgUVdlYkZyYW1lOjpmcmFtZU5hbWUoKSBj
b25zdAotewotICAgIHJldHVybiBkLT5mcmFtZS0+dHJlZSgpLT51bmlxdWVOYW1lKCk7Ci19Ci0K
LS8qIQotICBUaGUgd2ViIHBhZ2UgdGhhdCBjb250YWlucyB0aGlzIGZyYW1lLgotCi0gIFxzYSBw
YWdlQ2hhbmdlZCgpCi0qLwotUVdlYlBhZ2UgKlFXZWJGcmFtZTo6cGFnZSgpIGNvbnN0Ci17Ci0g
ICAgcmV0dXJuIGQtPnBhZ2U7Ci19Ci0KLS8qIQotICBMb2FkcyBcYSB1cmwgaW50byB0aGlzIGZy
YW1lLgotCi0gIFxub3RlIFRoZSB2aWV3IHJlbWFpbnMgdGhlIHNhbWUgdW50aWwgZW5vdWdoIGRh
dGEgaGFzIGFycml2ZWQgdG8gZGlzcGxheSB0aGUgbmV3IFxhIHVybC4KLQotICBcc2Egc2V0VXJs
KCksIHNldEh0bWwoKSwgc2V0Q29udGVudCgpCi0qLwotdm9pZCBRV2ViRnJhbWU6OmxvYWQoY29u
c3QgUVVybCAmdXJsKQotewotICAgIC8vIFRoZSBsb2FkKCkgb3ZlcmxvYWQgZW5zdXJlcyB0aGF0
IHRoZSB1cmwgaXMgYWJzb2x1dGUuCi0gICAgbG9hZChRTmV0d29ya1JlcXVlc3QodXJsKSk7Ci19
Ci0KLS8qIQotICBMb2FkcyBhIG5ldHdvcmsgcmVxdWVzdCwgXGEgcmVxLCBpbnRvIHRoaXMgZnJh
bWUsIHVzaW5nIHRoZSBtZXRob2Qgc3BlY2lmaWVkIGluIFxhCi0gIG9wZXJhdGlvbi4KLQotICBc
YSBib2R5IGlzIG9wdGlvbmFsIGFuZCBpcyBvbmx5IHVzZWQgZm9yIFBPU1Qgb3BlcmF0aW9ucy4K
LQotICBcbm90ZSBUaGUgdmlldyByZW1haW5zIHRoZSBzYW1lIHVudGlsIGVub3VnaCBkYXRhIGhh
cyBhcnJpdmVkIHRvIGRpc3BsYXkgdGhlIG5ldyBjb250ZW50LgotCi0gIFxzYSBzZXRVcmwoKQot
Ki8KLXZvaWQgUVdlYkZyYW1lOjpsb2FkKGNvbnN0IFFOZXR3b3JrUmVxdWVzdCAmcmVxLAotICAg
ICAgICAgICAgICAgICAgICAgUU5ldHdvcmtBY2Nlc3NNYW5hZ2VyOjpPcGVyYXRpb24gb3BlcmF0
aW9uLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgUUJ5dGVBcnJheSAmYm9keSkKLXsKLSAg
ICBkLT5sb2FkKHJlcSwgb3BlcmF0aW9uLCBib2R5KTsKLX0KLQotLyohCi0gIFNldHMgdGhlIGNv
bnRlbnQgb2YgdGhpcyBmcmFtZSB0byBcYSBodG1sLiBcYSBiYXNlVXJsIGlzIG9wdGlvbmFsIGFu
ZCB1c2VkIHRvIHJlc29sdmUgcmVsYXRpdmUKLSAgVVJMcyBpbiB0aGUgZG9jdW1lbnQsIHN1Y2gg
YXMgcmVmZXJlbmNlZCBpbWFnZXMgb3Igc3R5bGVzaGVldHMuCi0KLSAgVGhlIFxhIGh0bWwgaXMg
bG9hZGVkIGltbWVkaWF0ZWx5OyBleHRlcm5hbCBvYmplY3RzIGFyZSBsb2FkZWQgYXN5bmNocm9u
b3VzbHkuCi0KLSAgSWYgYSBzY3JpcHQgaW4gdGhlIFxhIGh0bWwgcnVucyBsb25nZXIgdGhhbiB0
aGUgZGVmYXVsdCBzY3JpcHQgdGltZW91dCAoY3VycmVudGx5IDEwIHNlY29uZHMpLAotICBmb3Ig
ZXhhbXBsZSBkdWUgdG8gYmVpbmcgYmxvY2tlZCBieSBhIG1vZGFsIEphdmFTY3JpcHQgYWxlcnQg
ZGlhbG9nLCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybgotICBhcyBzb29uIGFzIHBvc3NpYmxlIGFm
dGVyIHRoZSB0aW1lb3V0IGFuZCBhbnkgc3Vic2VxdWVudCBcYSBodG1sIHdpbGwgYmUgbG9hZGVk
IGFzeW5jaHJvbm91c2x5LgotCi0gIFdoZW4gdXNpbmcgdGhpcyBtZXRob2QgV2ViS2l0IGFzc3Vt
ZXMgdGhhdCBleHRlcm5hbCByZXNvdXJjZXMgc3VjaCBhcyBKYXZhU2NyaXB0IHByb2dyYW1zIG9y
IHN0eWxlCi0gIHNoZWV0cyBhcmUgZW5jb2RlZCBpbiBVVEYtOCB1bmxlc3Mgb3RoZXJ3aXNlIHNw
ZWNpZmllZC4gRm9yIGV4YW1wbGUsIHRoZSBlbmNvZGluZyBvZiBhbiBleHRlcm5hbAotICBzY3Jp
cHQgY2FuIGJlIHNwZWNpZmllZCB0aHJvdWdoIHRoZSBjaGFyc2V0IGF0dHJpYnV0ZSBvZiB0aGUg
SFRNTCBzY3JpcHQgdGFnLiBJdCBpcyBhbHNvIHBvc3NpYmxlCi0gIGZvciB0aGUgZW5jb2Rpbmcg
dG8gYmUgc3BlY2lmaWVkIGJ5IHdlYiBzZXJ2ZXIuCi0KLSAgVGhpcyBpcyBhIGNvbnZlbmllbmNl
IGZ1bmN0aW9uIGVxdWl2YWxlbnQgdG8gc2V0Q29udGVudChodG1sLCAidGV4dC9odG1sIiwgYmFz
ZVVybCkuCi0KLSAgXG5vdGUgVGhpcyBtZXRob2Qgd2lsbCBub3QgYWZmZWN0IHNlc3Npb24gb3Ig
Z2xvYmFsIGhpc3RvcnkgZm9yIHRoZSBmcmFtZS4KLQotICBcd2FybmluZyBUaGlzIGZ1bmN0aW9u
IHdvcmtzIG9ubHkgZm9yIEhUTUwsIGZvciBvdGhlciBtaW1lIHR5cGVzIChpLmUuIFhIVE1MLCBT
VkcpCi0gIHNldENvbnRlbnQoKSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgotCi0gIFxzYSB0b0h0
bWwoKSwgc2V0Q29udGVudCgpLCBsb2FkKCkKLSovCi12b2lkIFFXZWJGcmFtZTo6c2V0SHRtbChj
b25zdCBRU3RyaW5nICZodG1sLCBjb25zdCBRVXJsICZiYXNlVXJsKQotewotICAgIEtVUkwga3Vy
bChiYXNlVXJsKTsKLSAgICBXZWJDb3JlOjpSZXNvdXJjZVJlcXVlc3QgcmVxdWVzdChrdXJsKTsK
LSAgICBjb25zdCBRQnl0ZUFycmF5IHV0ZjggPSBodG1sLnRvVXRmOCgpOwotICAgIFdURjo6UmVm
UHRyPFdlYkNvcmU6OlNoYXJlZEJ1ZmZlcj4gZGF0YSA9IFdlYkNvcmU6OlNoYXJlZEJ1ZmZlcjo6
Y3JlYXRlKHV0ZjguY29uc3REYXRhKCksIHV0ZjgubGVuZ3RoKCkpOwotICAgIFdlYkNvcmU6OlN1
YnN0aXR1dGVEYXRhIHN1YnN0aXR1dGVEYXRhKGRhdGEsIFdURjo6U3RyaW5nKCJ0ZXh0L2h0bWwi
KSwgV1RGOjpTdHJpbmcoInV0Zi04IiksIEtVUkwoKSk7Ci0gICAgZC0+ZnJhbWUtPmxvYWRlcigp
LT5sb2FkKFdlYkNvcmU6OkZyYW1lTG9hZFJlcXVlc3QoZC0+ZnJhbWUsIHJlcXVlc3QsIHN1YnN0
aXR1dGVEYXRhKSk7Ci19Ci0KLS8qIQotICBTZXRzIHRoZSBjb250ZW50IG9mIHRoaXMgZnJhbWUg
dG8gdGhlIHNwZWNpZmllZCBjb250ZW50IFxhIGRhdGEuIElmIHRoZSBcYSBtaW1lVHlwZSBhcmd1
bWVudAotICBpcyBlbXB0eSBpdCBpcyBjdXJyZW50bHkgYXNzdW1lZCB0aGF0IHRoZSBjb250ZW50
IGlzIEhUTUwgYnV0IGluIGZ1dHVyZSB2ZXJzaW9ucyB3ZSBtYXkgaW50cm9kdWNlCi0gIGF1dG8t
ZGV0ZWN0aW9uLgotCi0gIEV4dGVybmFsIG9iamVjdHMgcmVmZXJlbmNlZCBpbiB0aGUgY29udGVu
dCBhcmUgbG9jYXRlZCByZWxhdGl2ZSB0byBcYSBiYXNlVXJsLgotCi0gIFRoZSBcYSBkYXRhIGlz
IGxvYWRlZCBpbW1lZGlhdGVseTsgZXh0ZXJuYWwgb2JqZWN0cyBhcmUgbG9hZGVkIGFzeW5jaHJv
bm91c2x5LgotCi0gIFxub3RlIFRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBzZXNzaW9uIG9y
IGdsb2JhbCBoaXN0b3J5IGZvciB0aGUgZnJhbWUuCi0KLSAgXHNhIHRvSHRtbCgpLCBzZXRIdG1s
KCkKLSovCi12b2lkIFFXZWJGcmFtZTo6c2V0Q29udGVudChjb25zdCBRQnl0ZUFycmF5ICZkYXRh
LCBjb25zdCBRU3RyaW5nICZtaW1lVHlwZSwgY29uc3QgUVVybCAmYmFzZVVybCkKLXsKLSAgICBL
VVJMIGt1cmwoYmFzZVVybCk7Ci0gICAgV2ViQ29yZTo6UmVzb3VyY2VSZXF1ZXN0IHJlcXVlc3Qo
a3VybCk7Ci0gICAgV1RGOjpSZWZQdHI8V2ViQ29yZTo6U2hhcmVkQnVmZmVyPiBidWZmZXIgPSBX
ZWJDb3JlOjpTaGFyZWRCdWZmZXI6OmNyZWF0ZShkYXRhLmNvbnN0RGF0YSgpLCBkYXRhLmxlbmd0
aCgpKTsKLSAgICBRU3RyaW5nIGFjdHVhbE1pbWVUeXBlOwotICAgIFdURjo6U3RyaW5nIGVuY29k
aW5nOwotICAgIGlmIChtaW1lVHlwZS5pc0VtcHR5KCkpCi0gICAgICAgIGFjdHVhbE1pbWVUeXBl
ID0gUUxhdGluMVN0cmluZygidGV4dC9odG1sIik7Ci0gICAgZWxzZSB7Ci0gICAgICAgIGFjdHVh
bE1pbWVUeXBlID0gZXh0cmFjdE1JTUVUeXBlRnJvbU1lZGlhVHlwZShtaW1lVHlwZSk7Ci0gICAg
ICAgIGVuY29kaW5nID0gZXh0cmFjdENoYXJzZXRGcm9tTWVkaWFUeXBlKG1pbWVUeXBlKTsKLSAg
ICB9Ci0gICAgV2ViQ29yZTo6U3Vic3RpdHV0ZURhdGEgc3Vic3RpdHV0ZURhdGEoYnVmZmVyLCBX
VEY6OlN0cmluZyhhY3R1YWxNaW1lVHlwZSksIGVuY29kaW5nLCBLVVJMKCkpOwotICAgIGQtPmZy
YW1lLT5sb2FkZXIoKS0+bG9hZChXZWJDb3JlOjpGcmFtZUxvYWRSZXF1ZXN0KGQtPmZyYW1lLCBy
ZXF1ZXN0LCBzdWJzdGl0dXRlRGF0YSkpOwotfQotCi0vKiEKLSAgUmV0dXJucyB0aGUgcGFyZW50
IGZyYW1lIG9mIHRoaXMgZnJhbWUsIG9yIDAgaWYgdGhlIGZyYW1lIGlzIHRoZSB3ZWIgcGFnZXMK
LSAgbWFpbiBmcmFtZS4KLQotICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gcW9iamVjdF9jYXN0PFFX
ZWJGcmFtZSo+KGZyYW1lLT5wYXJlbnQoKSkuCi0KLSAgXHNhIGNoaWxkRnJhbWVzKCkKLSovCi1R
V2ViRnJhbWUgKlFXZWJGcmFtZTo6cGFyZW50RnJhbWUoKSBjb25zdAotewotICAgIHJldHVybiBk
LT5wYXJlbnRGcmFtZSgpOwotfQotCi0vKiEKLSAgUmV0dXJucyBhIGxpc3Qgb2YgYWxsIGZyYW1l
cyB0aGF0IGFyZSBkaXJlY3QgY2hpbGRyZW4gb2YgdGhpcyBmcmFtZS4KLQotICBcc2EgcGFyZW50
RnJhbWUoKQotKi8KLVFMaXN0PFFXZWJGcmFtZSo+IFFXZWJGcmFtZTo6Y2hpbGRGcmFtZXMoKSBj
b25zdAotewotICAgIFFMaXN0PFFXZWJGcmFtZSo+IHJjOwotICAgIGlmIChkLT5mcmFtZSkgewot
ICAgICAgICBGcmFtZVRyZWUgKnRyZWUgPSBkLT5mcmFtZS0+dHJlZSgpOwotICAgICAgICBmb3Ig
KEZyYW1lICpjaGlsZCA9IHRyZWUtPmZpcnN0Q2hpbGQoKTsgY2hpbGQ7IGNoaWxkID0gY2hpbGQt
PnRyZWUoKS0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgICAgICAgRnJhbWVMb2FkZXIgKmxvYWRl
ciA9IGNoaWxkLT5sb2FkZXIoKTsKLSAgICAgICAgICAgIFFXZWJGcmFtZSogd2ViRnJhbWUgPSBx
b2JqZWN0X2Nhc3Q8UVdlYkZyYW1lKj4obG9hZGVyLT5uZXR3b3JraW5nQ29udGV4dCgpLT5vcmln
aW5hdGluZ09iamVjdCgpKTsKLSAgICAgICAgICAgIGlmICh3ZWJGcmFtZSkKLSAgICAgICAgICAg
ICAgICByYy5hcHBlbmQod2ViRnJhbWUpOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgcmV0dXJu
IHJjOwotfQotCi0vKiEKLSAgICBSZXR1cm5zIHRoZSBzY3JvbGxiYXIgcG9saWN5IGZvciB0aGUg
c2Nyb2xsYmFyIGRlZmluZWQgYnkgXGEgb3JpZW50YXRpb24uCi0qLwotUXQ6OlNjcm9sbEJhclBv
bGljeSBRV2ViRnJhbWU6OnNjcm9sbEJhclBvbGljeShRdDo6T3JpZW50YXRpb24gb3JpZW50YXRp
b24pIGNvbnN0Ci17Ci0gICAgaWYgKG9yaWVudGF0aW9uID09IFF0OjpIb3Jpem9udGFsKQotICAg
ICAgICByZXR1cm4gZC0+aG9yaXpvbnRhbFNjcm9sbEJhclBvbGljeTsKLSAgICByZXR1cm4gZC0+
dmVydGljYWxTY3JvbGxCYXJQb2xpY3k7Ci19Ci0KLS8qIQotICAgIFNldHMgdGhlIHNjcm9sbGJh
ciBwb2xpY3kgZm9yIHRoZSBzY3JvbGxiYXIgZGVmaW5lZCBieSBcYSBvcmllbnRhdGlvbiB0byBc
YSBwb2xpY3kuCi0qLwotdm9pZCBRV2ViRnJhbWU6OnNldFNjcm9sbEJhclBvbGljeShRdDo6T3Jp
ZW50YXRpb24gb3JpZW50YXRpb24sIFF0OjpTY3JvbGxCYXJQb2xpY3kgcG9saWN5KQotewotICAg
IFFfQVNTRVJUKChpbnQpU2Nyb2xsYmFyQXV0byA9PSAoaW50KVF0OjpTY3JvbGxCYXJBc05lZWRl
ZCk7Ci0gICAgUV9BU1NFUlQoKGludClTY3JvbGxiYXJBbHdheXNPZmYgPT0gKGludClRdDo6U2Ny
b2xsQmFyQWx3YXlzT2ZmKTsKLSAgICBRX0FTU0VSVCgoaW50KVNjcm9sbGJhckFsd2F5c09uID09
IChpbnQpUXQ6OlNjcm9sbEJhckFsd2F5c09uKTsKLQotICAgIGlmIChvcmllbnRhdGlvbiA9PSBR
dDo6SG9yaXpvbnRhbCkgewotICAgICAgICBkLT5ob3Jpem9udGFsU2Nyb2xsQmFyUG9saWN5ID0g
cG9saWN5OwotICAgICAgICBpZiAoZC0+ZnJhbWUtPnZpZXcoKSkgewotICAgICAgICAgICAgZC0+
ZnJhbWUtPnZpZXcoKS0+c2V0SG9yaXpvbnRhbFNjcm9sbGJhck1vZGUoKFNjcm9sbGJhck1vZGUp
cG9saWN5LCBwb2xpY3kgIT0gUXQ6OlNjcm9sbEJhckFzTmVlZGVkIC8qIGxvY2sgKi8pOwotICAg
ICAgICAgICAgZC0+ZnJhbWUtPnZpZXcoKS0+dXBkYXRlQ2FuSGF2ZVNjcm9sbGJhcnMoKTsKLSAg
ICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGQtPnZlcnRpY2FsU2Nyb2xsQmFyUG9saWN5
ID0gcG9saWN5OwotICAgICAgICBpZiAoZC0+ZnJhbWUtPnZpZXcoKSkgewotICAgICAgICAgICAg
ZC0+ZnJhbWUtPnZpZXcoKS0+c2V0VmVydGljYWxTY3JvbGxiYXJNb2RlKChTY3JvbGxiYXJNb2Rl
KXBvbGljeSwgcG9saWN5ICE9IFF0OjpTY3JvbGxCYXJBc05lZWRlZCAvKiBsb2NrICovKTsKLSAg
ICAgICAgICAgIGQtPmZyYW1lLT52aWV3KCktPnVwZGF0ZUNhbkhhdmVTY3JvbGxiYXJzKCk7Ci0g
ICAgICAgIH0KLSAgICB9Ci19Ci0KLS8qIQotICBTZXRzIHRoZSBjdXJyZW50IFxhIHZhbHVlIGZv
ciB0aGUgc2Nyb2xsYmFyIHdpdGggb3JpZW50YXRpb24gXGEgb3JpZW50YXRpb24uCi0KLSAgVGhl
IHNjcm9sbGJhciBmb3JjZXMgdGhlIFxhIHZhbHVlIHRvIGJlIHdpdGhpbiB0aGUgbGVnYWwgcmFu
Z2U6IG1pbmltdW0gPD0gdmFsdWUgPD0gbWF4aW11bS4KLQotICBDaGFuZ2luZyB0aGUgdmFsdWUg
YWxzbyB1cGRhdGVzIHRoZSB0aHVtYiBwb3NpdGlvbi4KLQotICBcc2Egc2Nyb2xsQmFyTWluaW11
bSgpLCBzY3JvbGxCYXJNYXhpbXVtKCkKLSovCi12b2lkIFFXZWJGcmFtZTo6c2V0U2Nyb2xsQmFy
VmFsdWUoUXQ6Ok9yaWVudGF0aW9uIG9yaWVudGF0aW9uLCBpbnQgdmFsdWUpCi17Ci0gICAgU2Ny
b2xsYmFyICpzYjsKLSAgICBzYiA9IChvcmllbnRhdGlvbiA9PSBRdDo6SG9yaXpvbnRhbCkgPyBk
LT5ob3Jpem9udGFsU2Nyb2xsQmFyKCkgOiBkLT52ZXJ0aWNhbFNjcm9sbEJhcigpOwotICAgIGlm
IChzYikgewotICAgICAgICBpZiAodmFsdWUgPCAwKQotICAgICAgICAgICAgdmFsdWUgPSAwOwot
ICAgICAgICBlbHNlIGlmICh2YWx1ZSA+IHNjcm9sbEJhck1heGltdW0ob3JpZW50YXRpb24pKQot
ICAgICAgICAgICAgdmFsdWUgPSBzY3JvbGxCYXJNYXhpbXVtKG9yaWVudGF0aW9uKTsKLSAgICAg
ICAgc2ItPnNjcm9sbGFibGVBcmVhKCktPnNjcm9sbFRvT2Zmc2V0V2l0aG91dEFuaW1hdGlvbihv
cmllbnRhdGlvbiA9PSBRdDo6SG9yaXpvbnRhbCA/IEhvcml6b250YWxTY3JvbGxiYXIgOiBWZXJ0
aWNhbFNjcm9sbGJhciwgdmFsdWUpOwotICAgIH0KLX0KLQotLyohCi0gIFJldHVybnMgdGhlIGN1
cnJlbnQgdmFsdWUgZm9yIHRoZSBzY3JvbGxiYXIgd2l0aCBvcmllbnRhdGlvbiBcYSBvcmllbnRh
dGlvbiwgb3IgMAotICBpZiBubyBzY3JvbGxiYXIgaXMgZm91bmQgZm9yIFxhIG9yaWVudGF0aW9u
LgotCi0gIFxzYSBzY3JvbGxCYXJNaW5pbXVtKCksIHNjcm9sbEJhck1heGltdW0oKQotKi8KLWlu
dCBRV2ViRnJhbWU6OnNjcm9sbEJhclZhbHVlKFF0OjpPcmllbnRhdGlvbiBvcmllbnRhdGlvbikg
Y29uc3QKLXsKLSAgICBTY3JvbGxiYXIgKnNiOwotICAgIHNiID0gKG9yaWVudGF0aW9uID09IFF0
OjpIb3Jpem9udGFsKSA/IGQtPmhvcml6b250YWxTY3JvbGxCYXIoKSA6IGQtPnZlcnRpY2FsU2Ny
b2xsQmFyKCk7Ci0gICAgaWYgKHNiKQotICAgICAgICByZXR1cm4gc2ItPnZhbHVlKCk7Ci0gICAg
cmV0dXJuIDA7Ci19Ci0KLS8qIQotICBSZXR1cm5zIHRoZSBtYXhpbXVtIHZhbHVlIGZvciB0aGUg
c2Nyb2xsYmFyIHdpdGggb3JpZW50YXRpb24gXGEgb3JpZW50YXRpb24sIG9yIDAKLSAgaWYgbm8g
c2Nyb2xsYmFyIGlzIGZvdW5kIGZvciBcYSBvcmllbnRhdGlvbi4KLQotICBcc2Egc2Nyb2xsQmFy
TWluaW11bSgpCi0qLwotaW50IFFXZWJGcmFtZTo6c2Nyb2xsQmFyTWF4aW11bShRdDo6T3JpZW50
YXRpb24gb3JpZW50YXRpb24pIGNvbnN0Ci17Ci0gICAgU2Nyb2xsYmFyICpzYjsKLSAgICBzYiA9
IChvcmllbnRhdGlvbiA9PSBRdDo6SG9yaXpvbnRhbCkgPyBkLT5ob3Jpem9udGFsU2Nyb2xsQmFy
KCkgOiBkLT52ZXJ0aWNhbFNjcm9sbEJhcigpOwotICAgIGlmIChzYikKLSAgICAgICAgcmV0dXJu
IHNiLT5tYXhpbXVtKCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIQotICBSZXR1cm5zIHRoZSBt
aW5pbXVtIHZhbHVlIGZvciB0aGUgc2Nyb2xsYmFyIHdpdGggb3JpZW50YXRpb24gXGEgb3JpZW50
YXRpb24uCi0KLSAgVGhlIG1pbmltdW0gdmFsdWUgaXMgYWx3YXlzIDAuCi0KLSAgXHNhIHNjcm9s
bEJhck1heGltdW0oKQotKi8KLWludCBRV2ViRnJhbWU6OnNjcm9sbEJhck1pbmltdW0oUXQ6Ok9y
aWVudGF0aW9uIG9yaWVudGF0aW9uKSBjb25zdAotewotICAgIFFfVU5VU0VEKG9yaWVudGF0aW9u
KQotICAgIHJldHVybiAwOwotfQotCi0vKiEKLSAgXHNpbmNlIDQuNgotICBSZXR1cm5zIHRoZSBn
ZW9tZXRyeSBmb3IgdGhlIHNjcm9sbGJhciB3aXRoIG9yaWVudGF0aW9uIFxhIG9yaWVudGF0aW9u
LgotCi0gIElmIHRoZSBzY3JvbGxiYXIgZG9lcyBub3QgZXhpc3QgYW4gZW1wdHkgcmVjdCBpcyBy
ZXR1cm5lZC4KLSovCi1RUmVjdCBRV2ViRnJhbWU6OnNjcm9sbEJhckdlb21ldHJ5KFF0OjpPcmll
bnRhdGlvbiBvcmllbnRhdGlvbikgY29uc3QKLXsKLSAgICBTY3JvbGxiYXIgKnNiOwotICAgIHNi
ID0gKG9yaWVudGF0aW9uID09IFF0OjpIb3Jpem9udGFsKSA/IGQtPmhvcml6b250YWxTY3JvbGxC
YXIoKSA6IGQtPnZlcnRpY2FsU2Nyb2xsQmFyKCk7Ci0gICAgaWYgKHNiKQotICAgICAgICByZXR1
cm4gc2ItPmZyYW1lUmVjdCgpOwotICAgIHJldHVybiBRUmVjdCgpOwotfQotCi0vKiEKLSAgXHNp
bmNlIDQuNQotICBTY3JvbGxzIHRoZSBmcmFtZSBcYSBkeCBwaXhlbHMgdG8gdGhlIHJpZ2h0IGFu
ZCBcYSBkeSBwaXhlbHMgZG93bndhcmQuIEJvdGgKLSAgXGEgZHggYW5kIFxhIGR5IG1heSBiZSBu
ZWdhdGl2ZS4KLQotICBcc2EgUVdlYkZyYW1lOjpzY3JvbGxQb3NpdGlvbgotKi8KLQotdm9pZCBR
V2ViRnJhbWU6OnNjcm9sbChpbnQgZHgsIGludCBkeSkKLXsKLSAgICBpZiAoIWQtPmZyYW1lLT52
aWV3KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGQtPmZyYW1lLT52aWV3KCktPnNjcm9sbEJ5
KEludFNpemUoZHgsIGR5KSk7Ci19Ci0KLS8qIQotICBccHJvcGVydHkgUVdlYkZyYW1lOjpzY3Jv
bGxQb3NpdGlvbgotICBcc2luY2UgNC41Ci0gIFxicmllZiB0aGUgcG9zaXRpb24gdGhlIGZyYW1l
IGlzIGN1cnJlbnRseSBzY3JvbGxlZCB0by4KLSovCi0KLVFQb2ludCBRV2ViRnJhbWU6OnNjcm9s
bFBvc2l0aW9uKCkgY29uc3QKLXsKLSAgICBJbnRTaXplIG9mcyA9IGQtPnNjcm9sbFBvc2l0aW9u
KCk7Ci0gICAgcmV0dXJuIFFQb2ludChvZnMud2lkdGgoKSwgb2ZzLmhlaWdodCgpKTsKLX0KLQot
dm9pZCBRV2ViRnJhbWU6OnNldFNjcm9sbFBvc2l0aW9uKGNvbnN0IFFQb2ludCAmcG9zKQotewot
ICAgIFFQb2ludCBjdXJyZW50ID0gc2Nyb2xsUG9zaXRpb24oKTsKLSAgICBpbnQgZHggPSBwb3Mu
eCgpIC0gY3VycmVudC54KCk7Ci0gICAgaW50IGR5ID0gcG9zLnkoKSAtIGN1cnJlbnQueSgpOwot
ICAgIHNjcm9sbChkeCwgZHkpOwotfQotCi0vKiEKLSAgXHNpbmNlIDQuNwotICBTY3JvbGxzIHRo
ZSBmcmFtZSB0byB0aGUgZ2l2ZW4gXGEgYW5jaG9yIG5hbWUuCi0qLwotdm9pZCBRV2ViRnJhbWU6
OnNjcm9sbFRvQW5jaG9yKGNvbnN0IFFTdHJpbmcmIGFuY2hvcikKLXsKLSAgICBGcmFtZVZpZXcg
KnZpZXcgPSBkLT5mcmFtZS0+dmlldygpOwotICAgIGlmICh2aWV3KQotICAgICAgICB2aWV3LT5z
Y3JvbGxUb0FuY2hvcihhbmNob3IpOwotfQotCi0vKiEKLSAgXHNpbmNlIDQuNgotICBSZW5kZXIg
dGhlIFxhIGxheWVyIG9mIHRoZSBmcmFtZSB1c2luZyBcYSBwYWludGVyIGNsaXBwaW5nIHRvIFxh
IGNsaXAuCi0KLSAgXHNhIHByaW50KCkKLSovCi0KLXZvaWQgUVdlYkZyYW1lOjpyZW5kZXIoUVBh
aW50ZXIqIHBhaW50ZXIsIFJlbmRlckxheWVyIGxheWVyLCBjb25zdCBRUmVnaW9uJiBjbGlwKQot
ewotICAgIEdyYXBoaWNzQ29udGV4dCBjb250ZXh0KHBhaW50ZXIpOwotICAgIGlmIChjb250ZXh0
LnBhaW50aW5nRGlzYWJsZWQoKSAmJiAhY29udGV4dC51cGRhdGluZ0NvbnRyb2xUaW50cygpKQot
ICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAoIWNsaXAuaXNFbXB0eSgpKQotICAgICAgICBkLT5y
ZW5kZXJSZWxhdGl2ZUNvb3JkcygmY29udGV4dCwgbGF5ZXIsIGNsaXApOwotICAgIGVsc2UgaWYg
KGQtPmZyYW1lLT52aWV3KCkpCi0gICAgICAgIGQtPnJlbmRlclJlbGF0aXZlQ29vcmRzKCZjb250
ZXh0LCBsYXllciwgUVJlZ2lvbihkLT5mcmFtZS0+dmlldygpLT5mcmFtZVJlY3QoKSkpOwotfQot
Ci0vKiEKLSAgUmVuZGVyIHRoZSBmcmFtZSBpbnRvIFxhIHBhaW50ZXIgY2xpcHBpbmcgdG8gXGEg
Y2xpcC4KLSovCi12b2lkIFFXZWJGcmFtZTo6cmVuZGVyKFFQYWludGVyKiBwYWludGVyLCBjb25z
dCBRUmVnaW9uJiBjbGlwKQotewotICAgIEdyYXBoaWNzQ29udGV4dCBjb250ZXh0KHBhaW50ZXIp
OwotICAgIGlmIChjb250ZXh0LnBhaW50aW5nRGlzYWJsZWQoKSAmJiAhY29udGV4dC51cGRhdGlu
Z0NvbnRyb2xUaW50cygpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBkLT5yZW5kZXJSZWxhdGl2
ZUNvb3JkcygmY29udGV4dCwgQWxsTGF5ZXJzLCBjbGlwKTsKLX0KLQotLyohCi0gIFJlbmRlciB0
aGUgZnJhbWUgaW50byBcYSBwYWludGVyLgotKi8KLXZvaWQgUVdlYkZyYW1lOjpyZW5kZXIoUVBh
aW50ZXIqIHBhaW50ZXIpCi17Ci0gICAgaWYgKCFkLT5mcmFtZS0+dmlldygpKQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICBHcmFwaGljc0NvbnRleHQgY29udGV4dChwYWludGVyKTsKLSAgICBpZiAo
Y29udGV4dC5wYWludGluZ0Rpc2FibGVkKCkgJiYgIWNvbnRleHQudXBkYXRpbmdDb250cm9sVGlu
dHMoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgZC0+cmVuZGVyUmVsYXRpdmVDb29yZHMoJmNv
bnRleHQsIEFsbExheWVycywgUVJlZ2lvbihkLT5mcmFtZS0+dmlldygpLT5mcmFtZVJlY3QoKSkp
OwotfQotCi0vKiEKLSAgICBccHJvcGVydHkgUVdlYkZyYW1lOjp0ZXh0U2l6ZU11bHRpcGxpZXIK
LSAgICBcYnJpZWYgdGhlIHNjYWxpbmcgZmFjdG9yIGZvciBhbGwgdGV4dCBpbiB0aGUgZnJhbWUK
LSAgICBcb2Jzb2xldGUKLQotICAgIFVzZSBzZXRab29tRmFjdG9yIGluc3RlYWQsIGluIGNvbWJp
bmF0aW9uIHdpdGggdGhlIFpvb21UZXh0T25seSBhdHRyaWJ1dGUgaW4KLSAgICBRV2ViU2V0dGlu
Z3MuCi0KLSAgICBcbm90ZSBTZXR0aW5nIHRoaXMgcHJvcGVydHkgYWxzbyBlbmFibGVzIHRoZSBa
b29tVGV4dE9ubHkgYXR0cmlidXRlIGluCi0gICAgUVdlYlNldHRpbmdzLgotKi8KLQotLyohCi0g
ICAgU2V0cyB0aGUgdmFsdWUgb2YgdGhlIG11bHRpcGxpZXIgdXNlZCB0byBzY2FsZSB0aGUgdGV4
dCBpbiBhIFdlYiBmcmFtZSB0bwotICAgIHRoZSBcYSBmYWN0b3Igc3BlY2lmaWVkLgotKi8KLXZv
aWQgUVdlYkZyYW1lOjpzZXRUZXh0U2l6ZU11bHRpcGxpZXIocXJlYWwgZmFjdG9yKQotewotICAg
IHBhZ2UoKS0+c2V0dGluZ3MoKS0+c2V0QXR0cmlidXRlKFFXZWJTZXR0aW5nczo6Wm9vbVRleHRP
bmx5LCB0cnVlKTsKLQotICAgIGQtPmZyYW1lLT5zZXRQYWdlQW5kVGV4dFpvb21GYWN0b3JzKDEs
IGZhY3Rvcik7Ci19Ci0KLS8qIQotICAgIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBtdWx0aXBs
aWVyIHVzZWQgdG8gc2NhbGUgdGhlIHRleHQgaW4gYSBXZWIgZnJhbWUuCi0qLwotcXJlYWwgUVdl
YkZyYW1lOjp0ZXh0U2l6ZU11bHRpcGxpZXIoKSBjb25zdAotewotICAgIHJldHVybiBwYWdlKCkt
PnNldHRpbmdzKCktPnRlc3RBdHRyaWJ1dGUoUVdlYlNldHRpbmdzOjpab29tVGV4dE9ubHkpID8g
ZC0+ZnJhbWUtPnRleHRab29tRmFjdG9yKCkgOiBkLT5mcmFtZS0+cGFnZVpvb21GYWN0b3IoKTsK
LX0KLQotLyohCi0gICAgXHByb3BlcnR5IFFXZWJGcmFtZTo6em9vbUZhY3RvcgotICAgIFxzaW5j
ZSA0LjUKLSAgICBcYnJpZWYgdGhlIHpvb20gZmFjdG9yIGZvciB0aGUgZnJhbWUKLSovCi0KLXZv
aWQgUVdlYkZyYW1lOjpzZXRab29tRmFjdG9yKHFyZWFsIGZhY3RvcikKLXsKLSAgICBpZiAocGFn
ZSgpLT5zZXR0aW5ncygpLT50ZXN0QXR0cmlidXRlKFFXZWJTZXR0aW5nczo6Wm9vbVRleHRPbmx5
KSkKLSAgICAgICAgZC0+ZnJhbWUtPnNldFRleHRab29tRmFjdG9yKGZhY3Rvcik7Ci0gICAgZWxz
ZQotICAgICAgICBkLT5mcmFtZS0+c2V0UGFnZVpvb21GYWN0b3IoZmFjdG9yKTsKLX0KLQotcXJl
YWwgUVdlYkZyYW1lOjp6b29tRmFjdG9yKCkgY29uc3QKLXsKLSAgICByZXR1cm4gcGFnZSgpLT5z
ZXR0aW5ncygpLT50ZXN0QXR0cmlidXRlKFFXZWJTZXR0aW5nczo6Wm9vbVRleHRPbmx5KSA/IGQt
PmZyYW1lLT50ZXh0Wm9vbUZhY3RvcigpIDogZC0+ZnJhbWUtPnBhZ2Vab29tRmFjdG9yKCk7Ci19
Ci0KLS8qIQotICAgIFxwcm9wZXJ0eSBRV2ViRnJhbWU6OmZvY3VzCi0gICAgXHNpbmNlIDQuNgot
Ci0gICAgUmV0dXJucyB0cnVlIGlmIHRoaXMgZnJhbWUgaGFzIGtleWJvYXJkIGlucHV0IGZvY3Vz
OyBvdGhlcndpc2UsIHJldHVybnMgZmFsc2UuCi0qLwotYm9vbCBRV2ViRnJhbWU6Omhhc0ZvY3Vz
KCkgY29uc3QKLXsKLSAgICBXZWJDb3JlOjpGcmFtZSogZmYgPSBkLT5mcmFtZS0+cGFnZSgpLT5m
b2N1c0NvbnRyb2xsZXIoKS0+Zm9jdXNlZEZyYW1lKCk7Ci0gICAgcmV0dXJuIGZmICYmIFFXZWJG
cmFtZVByaXZhdGU6OmtpdChmZikgPT0gdGhpczsKLX0KLQotLyohCi0gICAgXHNpbmNlIDQuNgot
Ci0gICAgR2l2ZXMga2V5Ym9hcmQgaW5wdXQgZm9jdXMgdG8gdGhpcyBmcmFtZS4KLSovCi12b2lk
IFFXZWJGcmFtZTo6c2V0Rm9jdXMoKQotewotICAgIFFXZWJGcmFtZVByaXZhdGU6OmNvcmUodGhp
cyktPnBhZ2UoKS0+Zm9jdXNDb250cm9sbGVyKCktPnNldEZvY3VzZWRGcmFtZShRV2ViRnJhbWVQ
cml2YXRlOjpjb3JlKHRoaXMpKTsKLX0KLQotLyohCi0gICAgUmV0dXJucyB0aGUgcG9zaXRpb24g
b2YgdGhlIGZyYW1lIHJlbGF0aXZlIHRvIGl0J3MgcGFyZW50IGZyYW1lLgotKi8KLVFQb2ludCBR
V2ViRnJhbWU6OnBvcygpIGNvbnN0Ci17Ci0gICAgaWYgKCFkLT5mcmFtZS0+dmlldygpKQotICAg
ICAgICByZXR1cm4gUVBvaW50KCk7Ci0KLSAgICByZXR1cm4gZC0+ZnJhbWUtPnZpZXcoKS0+ZnJh
bWVSZWN0KCkubG9jYXRpb24oKTsKLX0KLQotLyohCi0gICAgUmV0dXJuIHRoZSBnZW9tZXRyeSBv
ZiB0aGUgZnJhbWUgcmVsYXRpdmUgdG8gaXQncyBwYXJlbnQgZnJhbWUuCi0qLwotUVJlY3QgUVdl
YkZyYW1lOjpnZW9tZXRyeSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGQtPmZyYW1lUmVjdCgpOwot
fQotCi0vKiEKLSAgICBccHJvcGVydHkgUVdlYkZyYW1lOjpjb250ZW50c1NpemUKLSAgICBcYnJp
ZWYgdGhlIHNpemUgb2YgdGhlIGNvbnRlbnRzIGluIHRoaXMgZnJhbWUKLQotICAgIFxzYSBjb250
ZW50c1NpemVDaGFuZ2VkKCkKLSovCi1RU2l6ZSBRV2ViRnJhbWU6OmNvbnRlbnRzU2l6ZSgpIGNv
bnN0Ci17Ci0gICAgRnJhbWVWaWV3ICp2aWV3ID0gZC0+ZnJhbWUtPnZpZXcoKTsKLSAgICBpZiAo
IXZpZXcpCi0gICAgICAgIHJldHVybiBRU2l6ZSgpOwotICAgIHJldHVybiBRU2l6ZSh2aWV3LT5j
b250ZW50c1dpZHRoKCksIHZpZXctPmNvbnRlbnRzSGVpZ2h0KCkpOwotfQotCi0vKiEKLSAgICBc
c2luY2UgNC42Ci0KLSAgICBSZXR1cm5zIHRoZSBkb2N1bWVudCBlbGVtZW50IG9mIHRoaXMgZnJh
bWUuCi0KLSAgICBUaGUgZG9jdW1lbnQgZWxlbWVudCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGVu
dGlyZSBzdHJ1Y3R1cmVkCi0gICAgY29udGVudCBvZiB0aGUgZnJhbWUuCi0qLwotUVdlYkVsZW1l
bnQgUVdlYkZyYW1lOjpkb2N1bWVudEVsZW1lbnQoKSBjb25zdAotewotICAgIFdlYkNvcmU6OkRv
Y3VtZW50ICpkb2MgPSBkLT5mcmFtZS0+ZG9jdW1lbnQoKTsKLSAgICBpZiAoIWRvYykKLSAgICAg
ICAgcmV0dXJuIFFXZWJFbGVtZW50KCk7Ci0gICAgcmV0dXJuIFFXZWJFbGVtZW50KGRvYy0+ZG9j
dW1lbnRFbGVtZW50KCkpOwotfQotCi0vKiEKLSAgICBcc2luY2UgNC42Ci0gICAgUmV0dXJucyBh
IG5ldyBsaXN0IG9mIGVsZW1lbnRzIG1hdGNoaW5nIHRoZSBnaXZlbiBDU1Mgc2VsZWN0b3IgXGEg
c2VsZWN0b3JRdWVyeS4KLSAgICBJZiB0aGVyZSBhcmUgbm8gbWF0Y2hpbmcgZWxlbWVudHMsIGFu
IGVtcHR5IGxpc3QgaXMgcmV0dXJuZWQuCi0KLSAgICBcbHtodHRwOi8vd3d3LnczLm9yZy9UUi9S
RUMtQ1NTMi9zZWxlY3Rvci5odG1sI3ExfXtTdGFuZGFyZCBDU1MyIHNlbGVjdG9yfSBzeW50YXgg
aXMKLSAgICB1c2VkIGZvciB0aGUgcXVlcnkuCi0KLSAgICBcc2EgUVdlYkVsZW1lbnQ6OmZpbmRB
bGwoKQotKi8KLVFXZWJFbGVtZW50Q29sbGVjdGlvbiBRV2ViRnJhbWU6OmZpbmRBbGxFbGVtZW50
cyhjb25zdCBRU3RyaW5nICZzZWxlY3RvclF1ZXJ5KSBjb25zdAotewotICAgIHJldHVybiBkb2N1
bWVudEVsZW1lbnQoKS5maW5kQWxsKHNlbGVjdG9yUXVlcnkpOwotfQotCi0vKiEKLSAgICBcc2lu
Y2UgNC42Ci0gICAgUmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgZnJhbWUncyBkb2N1
bWVudCB0aGF0IG1hdGNoZXMgdGhlCi0gICAgZ2l2ZW4gQ1NTIHNlbGVjdG9yIFxhIHNlbGVjdG9y
UXVlcnkuIElmIHRoZXJlIGlzIG5vIG1hdGNoaW5nIGVsZW1lbnQsIGEKLSAgICBudWxsIGVsZW1l
bnQgaXMgcmV0dXJuZWQuCi0KLSAgICBcbHtodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtQ1NTMi9z
ZWxlY3Rvci5odG1sI3ExfXtTdGFuZGFyZCBDU1MyIHNlbGVjdG9yfSBzeW50YXggaXMKLSAgICB1
c2VkIGZvciB0aGUgcXVlcnkuCi0KLSAgICBcc2EgUVdlYkVsZW1lbnQ6OmZpbmRGaXJzdCgpCi0q
LwotUVdlYkVsZW1lbnQgUVdlYkZyYW1lOjpmaW5kRmlyc3RFbGVtZW50KGNvbnN0IFFTdHJpbmcg
JnNlbGVjdG9yUXVlcnkpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGRvY3VtZW50RWxlbWVudCgpLmZp
bmRGaXJzdChzZWxlY3RvclF1ZXJ5KTsKLX0KLQotLyohCi0gICAgUGVyZm9ybXMgYSBoaXQgdGVz
dCBvbiB0aGUgZnJhbWUgY29udGVudHMgYXQgdGhlIGdpdmVuIHBvc2l0aW9uIFxhIHBvcyBhbmQg
cmV0dXJucyB0aGUgaGl0IHRlc3QgcmVzdWx0LgotKi8KLVFXZWJIaXRUZXN0UmVzdWx0IFFXZWJG
cmFtZTo6aGl0VGVzdENvbnRlbnQoY29uc3QgUVBvaW50ICZwb3MpIGNvbnN0Ci17Ci0gICAgaWYg
KCFkLT5mcmFtZS0+dmlldygpIHx8ICFkLT5mcmFtZS0+Y29udGVudFJlbmRlcmVyKCkpCi0gICAg
ICAgIHJldHVybiBRV2ViSGl0VGVzdFJlc3VsdCgpOwotCi0gICAgSGl0VGVzdFJlc3VsdCByZXN1
bHQgPSBkLT5mcmFtZS0+ZXZlbnRIYW5kbGVyKCktPmhpdFRlc3RSZXN1bHRBdFBvaW50KGQtPmZy
YW1lLT52aWV3KCktPndpbmRvd1RvQ29udGVudHMocG9zKSwgLyphbGxvd1NoYWRvd0NvbnRlbnQq
LyBmYWxzZSwgLyppZ25vcmVDbGlwcGluZyovIHRydWUpOwotCi0gICAgaWYgKHJlc3VsdC5zY3Jv
bGxiYXIoKSkKLSAgICAgICAgcmV0dXJuIFFXZWJIaXRUZXN0UmVzdWx0KCk7Ci0KLSAgICByZXR1
cm4gUVdlYkhpdFRlc3RSZXN1bHQobmV3IFFXZWJIaXRUZXN0UmVzdWx0UHJpdmF0ZShyZXN1bHQp
KTsKLX0KLQotLyohIFxyZWltcAotKi8KLWJvb2wgUVdlYkZyYW1lOjpldmVudChRRXZlbnQgKmUp
Ci17Ci0gICAgcmV0dXJuIFFPYmplY3Q6OmV2ZW50KGUpOwotfQotCi0jaWZuZGVmIFFUX05PX1BS
SU5URVIKLS8qIQotICAgIFByaW50cyB0aGUgZnJhbWUgdG8gdGhlIGdpdmVuIFxhIHByaW50ZXIu
Ci0KLSAgICBcc2EgcmVuZGVyKCkKLSovCi12b2lkIFFXZWJGcmFtZTo6cHJpbnQoUVByaW50ZXIg
KnByaW50ZXIpIGNvbnN0Ci17Ci0jaWYgSEFWRShRVFBSSU5UU1VQUE9SVCkKLSAgICBRUGFpbnRl
ciBwYWludGVyOwotICAgIGlmICghcGFpbnRlci5iZWdpbihwcmludGVyKSkKLSAgICAgICAgcmV0
dXJuOwotCi0gICAgY29uc3QgcXJlYWwgem9vbUZhY3RvclggPSAocXJlYWwpcHJpbnRlci0+bG9n
aWNhbERwaVgoKSAvIHF0X2RlZmF1bHREcGkoKTsKLSAgICBjb25zdCBxcmVhbCB6b29tRmFjdG9y
WSA9IChxcmVhbClwcmludGVyLT5sb2dpY2FsRHBpWSgpIC8gcXRfZGVmYXVsdERwaSgpOwotCi0g
ICAgUHJpbnRDb250ZXh0IHByaW50Q29udGV4dChkLT5mcmFtZSk7Ci0gICAgZmxvYXQgcGFnZUhl
aWdodCA9IDA7Ci0KLSAgICBRUmVjdCBxcHJpbnRlclJlY3QgPSBwcmludGVyLT5wYWdlUmVjdCgp
OwotCi0gICAgSW50UmVjdCBwYWdlUmVjdCgwLCAwLAotICAgICAgICAgICAgICAgICAgICAgaW50
KHFwcmludGVyUmVjdC53aWR0aCgpIC8gem9vbUZhY3RvclgpLAotICAgICAgICAgICAgICAgICAg
ICAgaW50KHFwcmludGVyUmVjdC5oZWlnaHQoKSAvIHpvb21GYWN0b3JZKSk7Ci0KLSAgICBwcmlu
dENvbnRleHQuYmVnaW4ocGFnZVJlY3Qud2lkdGgoKSwgcGFnZVJlY3QuaGVpZ2h0KCkpOwotCi0g
ICAgcHJpbnRDb250ZXh0LmNvbXB1dGVQYWdlUmVjdHMocGFnZVJlY3QsIC8qIGhlYWRlckhlaWdo
dCAqLyAwLCAvKiBmb290ZXJIZWlnaHQgKi8gMCwgLyogdXNlclNjYWxlRmFjdG9yICovIDEuMCwg
cGFnZUhlaWdodCk7Ci0KLSAgICBpbnQgZG9jQ29waWVzOwotICAgIGludCBwYWdlQ29waWVzOwot
ICAgIGlmIChwcmludGVyLT5jb2xsYXRlQ29waWVzKCkpIHsKLSAgICAgICAgZG9jQ29waWVzID0g
MTsKLSAgICAgICAgcGFnZUNvcGllcyA9IHByaW50ZXItPm51bUNvcGllcygpOwotICAgIH0gZWxz
ZSB7Ci0gICAgICAgIGRvY0NvcGllcyA9IHByaW50ZXItPm51bUNvcGllcygpOwotICAgICAgICBw
YWdlQ29waWVzID0gMTsKLSAgICB9Ci0KLSAgICBpbnQgZnJvbVBhZ2UgPSBwcmludGVyLT5mcm9t
UGFnZSgpOwotICAgIGludCB0b1BhZ2UgPSBwcmludGVyLT50b1BhZ2UoKTsKLSAgICBib29sIGFz
Y2VuZGluZyA9IHRydWU7Ci0KLSAgICBpZiAoZnJvbVBhZ2UgPT0gMCAmJiB0b1BhZ2UgPT0gMCkg
ewotICAgICAgICBmcm9tUGFnZSA9IDE7Ci0gICAgICAgIHRvUGFnZSA9IHByaW50Q29udGV4dC5w
YWdlQ291bnQoKTsKLSAgICB9Ci0gICAgLy8gcGFyYW5vaWEgY2hlY2sKLSAgICBmcm9tUGFnZSA9
IHFNYXgoMSwgZnJvbVBhZ2UpOwotICAgIHRvUGFnZSA9IHFNaW4oc3RhdGljX2Nhc3Q8aW50Pihw
cmludENvbnRleHQucGFnZUNvdW50KCkpLCB0b1BhZ2UpOwotICAgIGlmICh0b1BhZ2UgPCBmcm9t
UGFnZSkgewotICAgICAgICAvLyBpZiB0aGUgdXNlciBlbnRlcmVkIGEgcGFnZSByYW5nZSBvdXRz
aWRlIHRoZSBhY3R1YWwgbnVtYmVyCi0gICAgICAgIC8vIG9mIHByaW50YWJsZSBwYWdlcywganVz
dCByZXR1cm4KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChwcmludGVyLT5wYWdl
T3JkZXIoKSA9PSBRUHJpbnRlcjo6TGFzdFBhZ2VGaXJzdCkgewotICAgICAgICBpbnQgdG1wID0g
ZnJvbVBhZ2U7Ci0gICAgICAgIGZyb21QYWdlID0gdG9QYWdlOwotICAgICAgICB0b1BhZ2UgPSB0
bXA7Ci0gICAgICAgIGFzY2VuZGluZyA9IGZhbHNlOwotICAgIH0KLQotICAgIHBhaW50ZXIuc2Nh
bGUoem9vbUZhY3RvclgsIHpvb21GYWN0b3JZKTsKLSAgICBHcmFwaGljc0NvbnRleHQgY3R4KCZw
YWludGVyKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZG9jQ29waWVzOyArK2kpIHsKLSAg
ICAgICAgaW50IHBhZ2UgPSBmcm9tUGFnZTsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAg
ICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcGFnZUNvcGllczsgKytqKSB7Ci0gICAgICAgICAg
ICAgICAgaWYgKHByaW50ZXItPnByaW50ZXJTdGF0ZSgpID09IFFQcmludGVyOjpBYm9ydGVkCi0g
ICAgICAgICAgICAgICAgICAgIHx8IHByaW50ZXItPnByaW50ZXJTdGF0ZSgpID09IFFQcmludGVy
OjpFcnJvcikgewotICAgICAgICAgICAgICAgICAgICBwcmludENvbnRleHQuZW5kKCk7Ci0gICAg
ICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAg
ICAgcHJpbnRDb250ZXh0LnNwb29sUGFnZShjdHgsIHBhZ2UgLSAxLCBwYWdlUmVjdC53aWR0aCgp
KTsKLSAgICAgICAgICAgICAgICBpZiAoaiA8IHBhZ2VDb3BpZXMgLSAxKQotICAgICAgICAgICAg
ICAgICAgICBwcmludGVyLT5uZXdQYWdlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAg
IGlmIChwYWdlID09IHRvUGFnZSkKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAg
ICAgaWYgKGFzY2VuZGluZykKLSAgICAgICAgICAgICAgICArK3BhZ2U7Ci0gICAgICAgICAgICBl
bHNlCi0gICAgICAgICAgICAgICAgLS1wYWdlOwotCi0gICAgICAgICAgICBwcmludGVyLT5uZXdQ
YWdlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIGkgPCBkb2NDb3BpZXMgLSAxKQotICAg
ICAgICAgICAgcHJpbnRlci0+bmV3UGFnZSgpOwotICAgIH0KLQotICAgIHByaW50Q29udGV4dC5l
bmQoKTsKLSNlbmRpZiAvLyBIQVZFKFBSSU5UU1VQUE9SVCkKLX0KLSNlbmRpZiAvLyBRVF9OT19Q
UklOVEVSCi0KLS8qIQotICAgIEV2YWx1YXRlcyB0aGUgSmF2YVNjcmlwdCBkZWZpbmVkIGJ5IFxh
IHNjcmlwdFNvdXJjZSB1c2luZyB0aGlzIGZyYW1lIGFzIGNvbnRleHQKLSAgICBhbmQgcmV0dXJu
cyB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGV4ZWN1dGVkIHN0YXRlbWVudC4KLQotICAgIFxzYSBh
ZGRUb0phdmFTY3JpcHRXaW5kb3dPYmplY3QoKSwgamF2YVNjcmlwdFdpbmRvd09iamVjdENsZWFy
ZWQoKQotKi8KLVFWYXJpYW50IFFXZWJGcmFtZTo6ZXZhbHVhdGVKYXZhU2NyaXB0KGNvbnN0IFFT
dHJpbmcmIHNjcmlwdFNvdXJjZSkKLXsKLSAgICBTY3JpcHRDb250cm9sbGVyICpwcm94eSA9IGQt
PmZyYW1lLT5zY3JpcHQoKTsKLSAgICBRVmFyaWFudCByYzsKLSAgICBpZiAocHJveHkpIHsKLSAg
ICAgICAgaW50IGRpc3RhbmNlID0gMDsKLSAgICAgICAgSlNDOjpKU1ZhbHVlIHYgPSBkLT5mcmFt
ZS0+c2NyaXB0KCktPmV4ZWN1dGVTY3JpcHQoU2NyaXB0U291cmNlQ29kZShzY3JpcHRTb3VyY2Up
KS5qc1ZhbHVlKCk7Ci0gICAgICAgIEpTQzo6RXhlY1N0YXRlKiBleGVjID0gcHJveHktPmdsb2Jh
bE9iamVjdChtYWluVGhyZWFkTm9ybWFsV29ybGQoKSktPmdsb2JhbEV4ZWMoKTsKLSAgICAgICAg
SlNWYWx1ZVJlZiogaWdub3JlZEV4Y2VwdGlvbiA9IDA7Ci0gICAgICAgIHJjID0gSlNDOjpCaW5k
aW5nczo6Y29udmVydFZhbHVlVG9RVmFyaWFudCh0b1JlZihleGVjKSwgdG9SZWYoZXhlYywgdiks
IFFNZXRhVHlwZTo6Vm9pZCwgJmRpc3RhbmNlLCBpZ25vcmVkRXhjZXB0aW9uKTsKLSAgICB9Ci0g
ICAgcmV0dXJuIHJjOwotfQotCi0vKiEKLSAgICBcc2luY2UgNC41Ci0KLSAgICBSZXR1cm5zIHRo
ZSBmcmFtZSdzIHNlY3VyaXR5IG9yaWdpbi4KLSovCi1RV2ViU2VjdXJpdHlPcmlnaW4gUVdlYkZy
YW1lOjpzZWN1cml0eU9yaWdpbigpIGNvbnN0Ci17Ci0gICAgUVdlYkZyYW1lKiB0aGF0ID0gY29u
c3RfY2FzdDxRV2ViRnJhbWUqPih0aGlzKTsKLSAgICBRV2ViU2VjdXJpdHlPcmlnaW5Qcml2YXRl
KiBwcml2ID0gbmV3IFFXZWJTZWN1cml0eU9yaWdpblByaXZhdGUoUVdlYkZyYW1lUHJpdmF0ZTo6
Y29yZSh0aGF0KS0+ZG9jdW1lbnQoKS0+c2VjdXJpdHlPcmlnaW4oKSk7Ci0gICAgcmV0dXJuIFFX
ZWJTZWN1cml0eU9yaWdpbihwcml2KTsKLX0KLQotV2ViQ29yZTo6RnJhbWUqIFFXZWJGcmFtZVBy
aXZhdGU6OmNvcmUoY29uc3QgUVdlYkZyYW1lKiB3ZWJGcmFtZSkKLXsKLSAgICByZXR1cm4gd2Vi
RnJhbWUtPmQtPmZyYW1lOwotfQotCi1RV2ViRnJhbWUqIFFXZWJGcmFtZVByaXZhdGU6OmtpdChj
b25zdCBXZWJDb3JlOjpGcmFtZSogY29yZUZyYW1lKQotewotICAgIHJldHVybiBxb2JqZWN0X2Nh
c3Q8UVdlYkZyYW1lKj4oY29yZUZyYW1lLT5sb2FkZXIoKS0+bmV0d29ya2luZ0NvbnRleHQoKS0+
b3JpZ2luYXRpbmdPYmplY3QoKSk7Ci19Ci0KLVFXZWJGcmFtZSAqUVdlYkZyYW1lUHJpdmF0ZTo6
a2l0KGNvbnN0IFFXZWJGcmFtZUFkYXB0ZXIqIGZyYW1lQWRhcHRlcikKLXsKLSAgICByZXR1cm4g
c3RhdGljX2Nhc3Q8Y29uc3QgUVdlYkZyYW1lUHJpdmF0ZSo+KGZyYW1lQWRhcHRlciktPnE7Ci19
Ci0KLQotLyohCi0gICAgXGZuIHZvaWQgUVdlYkZyYW1lOjpqYXZhU2NyaXB0V2luZG93T2JqZWN0
Q2xlYXJlZCgpCi0KLSAgICBUaGlzIHNpZ25hbCBpcyBlbWl0dGVkIHdoZW5ldmVyIHRoZSBnbG9i
YWwgd2luZG93IG9iamVjdCBvZiB0aGUgSmF2YVNjcmlwdAotICAgIGVudmlyb25tZW50IGlzIGNs
ZWFyZWQsIGUuZy4sIGJlZm9yZSBzdGFydGluZyBhIG5ldyBsb2FkLgotCi0gICAgSWYgeW91IGlu
dGVuZCB0byBhZGQgUU9iamVjdHMgdG8gYSBRV2ViRnJhbWUgdXNpbmcKLSAgICBhZGRUb0phdmFT
Y3JpcHRXaW5kb3dPYmplY3QoKSwgeW91IHNob3VsZCBhZGQgdGhlbSBpbiBhIHNsb3QgY29ubmVj
dGVkCi0gICAgdG8gdGhpcyBzaWduYWwuIFRoaXMgZW5zdXJlcyB0aGF0IHlvdXIgb2JqZWN0cyBy
ZW1haW4gYWNjZXNzaWJsZSB3aGVuCi0gICAgbG9hZGluZyBuZXcgVVJMcy4KLSovCi0KLS8qIQot
ICAgIFxmbiB2b2lkIFFXZWJGcmFtZTo6cHJvdmlzaW9uYWxMb2FkKCkKLSAgICBcaW50ZXJuYWwK
LSovCi0KLS8qIQotICAgIFxmbiB2b2lkIFFXZWJGcmFtZTo6dGl0bGVDaGFuZ2VkKGNvbnN0IFFT
dHJpbmcgJnRpdGxlKQotCi0gICAgVGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuZXZlciB0aGUg
dGl0bGUgb2YgdGhlIGZyYW1lIGNoYW5nZXMuCi0gICAgVGhlIFxhIHRpdGxlIHN0cmluZyBzcGVj
aWZpZXMgdGhlIG5ldyB0aXRsZS4KLQotICAgIFxzYSB0aXRsZSgpCi0qLwotCi0vKiEKLSAgICBc
Zm4gdm9pZCBRV2ViRnJhbWU6OnVybENoYW5nZWQoY29uc3QgUVVybCAmdXJsKQotCi0gICAgVGhp
cyBzaWduYWwgaXMgZW1pdHRlZCB3aXRoIHRoZSBVUkwgb2YgdGhlIGZyYW1lIHdoZW4gdGhlIGZy
YW1lJ3MgdGl0bGUgaXMKLSAgICByZWNlaXZlZC4gVGhlIG5ldyBVUkwgaXMgc3BlY2lmaWVkIGJ5
IFxhIHVybC4KLQotICAgIFxzYSB1cmwoKQotKi8KLQotLyohCi0gICAgXGZuIHZvaWQgUVdlYkZy
YW1lOjppbml0aWFsTGF5b3V0Q29tcGxldGVkKCkKLQotICAgIFRoaXMgc2lnbmFsIGlzIGVtaXR0
ZWQgd2hlbiB0aGUgZnJhbWUgaXMgbGFpZCBvdXQgdGhlIGZpcnN0IHRpbWUuCi0gICAgVGhpcyBp
cyB0aGUgZmlyc3QgdGltZSB5b3Ugd2lsbCBzZWUgY29udGVudHMgZGlzcGxheWVkIG9uIHRoZSBm
cmFtZS4KLQotICAgIFxub3RlIEEgZnJhbWUgY2FuIGJlIGxhaWQgb3V0IG11bHRpcGxlIHRpbWVz
LgotKi8KLQotLyohCi0gIFxmbiB2b2lkIFFXZWJGcmFtZTo6aWNvbkNoYW5nZWQoKQotCi0gIFRo
aXMgc2lnbmFsIGlzIGVtaXR0ZWQgd2hlbiB0aGUgaWNvbiAoImZhdmljb24iKSBhc3NvY2lhdGVk
IHdpdGggdGhlIGZyYW1lCi0gIGhhcyBiZWVuIGxvYWRlZC4KLQotICBcc2EgaWNvbigpCi0qLwot
Ci0vKiEKLSAgXGZuIHZvaWQgUVdlYkZyYW1lOjpjb250ZW50c1NpemVDaGFuZ2VkKGNvbnN0IFFT
aXplICZzaXplKQotICBcc2luY2UgNC42Ci0KLSAgVGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVu
IHRoZSBmcmFtZSdzIGNvbnRlbnRzIHNpemUgY2hhbmdlcwotICB0byBcYSBzaXplLgotCi0gIFxz
YSBjb250ZW50c1NpemUoKQotKi8KLQotLyohCi0gICAgXGZuIHZvaWQgUVdlYkZyYW1lOjpsb2Fk
U3RhcnRlZCgpCi0gICAgXHNpbmNlIDQuNgotCi0gICAgVGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3
aGVuIGEgbmV3IGxvYWQgb2YgdGhpcyBmcmFtZSBpcyBzdGFydGVkLgotCi0gICAgXHNhIGxvYWRG
aW5pc2hlZCgpCi0qLwotCi0vKiEKLSAgICBcZm4gdm9pZCBRV2ViRnJhbWU6OmxvYWRGaW5pc2hl
ZChib29sIG9rKQotICAgIFxzaW5jZSA0LjYKLQotICAgIFRoaXMgc2lnbmFsIGlzIGVtaXR0ZWQg
d2hlbiBhIGxvYWQgb2YgdGhpcyBmcmFtZSBpcyBmaW5pc2hlZC4KLSAgICBcYSBvayB3aWxsIGlu
ZGljYXRlIHdoZXRoZXIgdGhlIGxvYWQgd2FzIHN1Y2Nlc3NmdWwgb3IgYW55IGVycm9yIG9jY3Vy
cmVkLgotCi0gICAgXHNhIGxvYWRTdGFydGVkKCkKLSovCi0KLS8qIQotICAgIFxmbiB2b2lkIFFX
ZWJGcmFtZTo6cGFnZUNoYW5nZWQoKQotICAgIFxzaW5jZSA0LjcKLQotICAgIFRoaXMgc2lnbmFs
IGlzIGVtaXR0ZWQgd2hlbiB0aGlzIGZyYW1lIGhhcyBiZWVuIG1vdmVkIHRvIGEgZGlmZmVyZW50
IFFXZWJQYWdlLgotCi0gICAgXHNhIHBhZ2UoKQotKi8KLQotLyohCi0gICAgXGNsYXNzIFFXZWJI
aXRUZXN0UmVzdWx0Ci0gICAgXHNpbmNlIDQuNAotICAgIFxicmllZiBUaGUgUVdlYkhpdFRlc3RS
ZXN1bHQgY2xhc3MgcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHdlYgotICAgIHBhZ2Ug
Y29udGVudCBhZnRlciBhIGhpdCB0ZXN0LgotCi0gICAgXGlubW9kdWxlIFF0V2ViS2l0Ci0KLSAg
ICBRV2ViSGl0VGVzdFJlc3VsdCBpcyByZXR1cm5lZCBieSBRV2ViRnJhbWU6OmhpdFRlc3RDb250
ZW50KCkgdG8gcHJvdmlkZQotICAgIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb250ZW50IG9mIHRo
ZSB3ZWIgcGFnZSBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLgotKi8KLQotLyohCi0gICAgXGlu
dGVybmFsCi0qLwotUVdlYkhpdFRlc3RSZXN1bHQ6OlFXZWJIaXRUZXN0UmVzdWx0KFFXZWJIaXRU
ZXN0UmVzdWx0UHJpdmF0ZSAqcHJpdikKLSAgICA6IGQocHJpdikKLXsKLX0KLQotUVdlYkhpdFRl
c3RSZXN1bHRQcml2YXRlOjpRV2ViSGl0VGVzdFJlc3VsdFByaXZhdGUoY29uc3QgV2ViQ29yZTo6
SGl0VGVzdFJlc3VsdCAmaGl0VGVzdCkKLSAgICA6IGlzQ29udGVudEVkaXRhYmxlKGZhbHNlKQot
ICAgICwgaXNDb250ZW50U2VsZWN0ZWQoZmFsc2UpCi0gICAgLCBpc1Njcm9sbEJhcihmYWxzZSkK
LXsKLSAgICBpZiAoIWhpdFRlc3QuaW5uZXJOb2RlKCkpCi0gICAgICAgIHJldHVybjsKLSAgICBw
b3MgPSBoaXRUZXN0LnJvdW5kZWRQb2ludEluSW5uZXJOb2RlRnJhbWUoKTsKLSAgICBXZWJDb3Jl
OjpUZXh0RGlyZWN0aW9uIGRpcjsKLSAgICB0aXRsZSA9IGhpdFRlc3QudGl0bGUoZGlyKTsKLSAg
ICBsaW5rVGV4dCA9IGhpdFRlc3QudGV4dENvbnRlbnQoKTsKLSAgICBsaW5rVXJsID0gaGl0VGVz
dC5hYnNvbHV0ZUxpbmtVUkwoKTsKLSAgICBsaW5rVGl0bGUgPSBoaXRUZXN0LnRpdGxlRGlzcGxh
eVN0cmluZygpOwotICAgIGFsdGVybmF0ZVRleHQgPSBoaXRUZXN0LmFsdERpc3BsYXlTdHJpbmco
KTsKLSAgICBpbWFnZVVybCA9IGhpdFRlc3QuYWJzb2x1dGVJbWFnZVVSTCgpOwotICAgIGlubmVy
Tm9kZSA9IGhpdFRlc3QuaW5uZXJOb2RlKCk7Ci0gICAgaW5uZXJOb25TaGFyZWROb2RlID0gaGl0
VGVzdC5pbm5lck5vblNoYXJlZE5vZGUoKTsKLSAgICBib3VuZGluZ1JlY3QgPSBpbm5lck5vblNo
YXJlZE5vZGUgPyBpbm5lck5vblNoYXJlZE5vZGUtPnJlbmRlcmVyKCktPmFic29sdXRlQm91bmRp
bmdCb3hSZWN0KCkgOiBJbnRSZWN0KCk7Ci0gICAgV2ViQ29yZTo6SW1hZ2UgKmltZyA9IGhpdFRl
c3QuaW1hZ2UoKTsKLSAgICBpZiAoaW1nKSB7Ci0gICAgICAgIFFQaXhtYXAgKnBpeCA9IGltZy0+
bmF0aXZlSW1hZ2VGb3JDdXJyZW50RnJhbWUoKTsKLSAgICAgICAgaWYgKHBpeCkKLSAgICAgICAg
ICAgIHBpeG1hcCA9ICpwaXg7Ci0gICAgfQotICAgIFdlYkNvcmU6OkZyYW1lICp3ZnJhbWUgPSBo
aXRUZXN0LnRhcmdldEZyYW1lKCk7Ci0gICAgaWYgKHdmcmFtZSkKLSAgICAgICAgbGlua1Rhcmdl
dEZyYW1lID0gUVdlYkZyYW1lUHJpdmF0ZTo6a2l0KHdmcmFtZSk7Ci0gICAgbGlua0VsZW1lbnQg
PSBRV2ViRWxlbWVudChoaXRUZXN0LlVSTEVsZW1lbnQoKSk7Ci0KLSAgICBpc0NvbnRlbnRFZGl0
YWJsZSA9IGhpdFRlc3QuaXNDb250ZW50RWRpdGFibGUoKTsKLSAgICBpc0NvbnRlbnRTZWxlY3Rl
ZCA9IGhpdFRlc3QuaXNTZWxlY3RlZCgpOwotICAgIGlzU2Nyb2xsQmFyID0gaGl0VGVzdC5zY3Jv
bGxiYXIoKTsKLQotICAgIFdlYkNvcmU6OkZyYW1lICppbm5lck5vZGVGcmFtZSA9IGhpdFRlc3Qu
aW5uZXJOb2RlRnJhbWUoKTsKLSAgICBpZiAoaW5uZXJOb2RlRnJhbWUpCi0gICAgICAgIGZyYW1l
ID0gUVdlYkZyYW1lUHJpdmF0ZTo6a2l0KGlubmVyTm9kZUZyYW1lKTsKLQotICAgIGVuY2xvc2lu
Z0Jsb2NrID0gUVdlYkVsZW1lbnQoV2ViQ29yZTo6ZW5jbG9zaW5nQmxvY2soaW5uZXJOb2RlLmdl
dCgpKSk7Ci19Ci0KLS8qIQotICAgIENvbnN0cnVjdHMgYSBudWxsIGhpdCB0ZXN0IHJlc3VsdC4K
LSovCi1RV2ViSGl0VGVzdFJlc3VsdDo6UVdlYkhpdFRlc3RSZXN1bHQoKQotICAgIDogZCgwKQot
ewotfQotCi0vKiEKLSAgICBDb25zdHJ1Y3RzIGEgaGl0IHRlc3QgcmVzdWx0IGZyb20gXGEgb3Ro
ZXIuCi0qLwotUVdlYkhpdFRlc3RSZXN1bHQ6OlFXZWJIaXRUZXN0UmVzdWx0KGNvbnN0IFFXZWJI
aXRUZXN0UmVzdWx0ICZvdGhlcikKLSAgICA6IGQoMCkKLXsKLSAgICBpZiAob3RoZXIuZCkKLSAg
ICAgICAgZCA9IG5ldyBRV2ViSGl0VGVzdFJlc3VsdFByaXZhdGUoKm90aGVyLmQpOwotfQotCi0v
KiEKLSAgICBBc3NpZ25zIHRoZSBcYSBvdGhlciBoaXQgdGVzdCByZXN1bHQgdG8gdGhpcy4KLSov
Ci1RV2ViSGl0VGVzdFJlc3VsdCAmUVdlYkhpdFRlc3RSZXN1bHQ6Om9wZXJhdG9yPShjb25zdCBR
V2ViSGl0VGVzdFJlc3VsdCAmb3RoZXIpCi17Ci0gICAgaWYgKHRoaXMgIT0gJm90aGVyKSB7Ci0g
ICAgICAgIGlmIChvdGhlci5kKSB7Ci0gICAgICAgICAgICBpZiAoIWQpCi0gICAgICAgICAgICAg
ICAgZCA9IG5ldyBRV2ViSGl0VGVzdFJlc3VsdFByaXZhdGU7Ci0gICAgICAgICAgICAqZCA9ICpv
dGhlci5kOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGVsZXRlIGQ7Ci0gICAgICAg
ICAgICBkID0gMDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLS8q
IQotICAgIERlc3RydWN0b3IuCi0qLwotUVdlYkhpdFRlc3RSZXN1bHQ6On5RV2ViSGl0VGVzdFJl
c3VsdCgpCi17Ci0gICAgZGVsZXRlIGQ7Ci19Ci0KLS8qIQotICAgIFJldHVybnMgdHJ1ZSBpZiB0
aGUgaGl0IHRlc3QgcmVzdWx0IGlzIG51bGw7IG90aGVyd2lzZSByZXR1cm5zIGZhbHNlLgotKi8K
LWJvb2wgUVdlYkhpdFRlc3RSZXN1bHQ6OmlzTnVsbCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICFk
OwotfQotCi0vKiEKLSAgICBSZXR1cm5zIHRoZSBwb3NpdGlvbiB3aGVyZSB0aGUgaGl0IHRlc3Qg
b2NjdXJlZCBpbiB0aGUgY29vcmRpbmF0ZXMgb2YgZnJhbWUgY29udGFpbmluZyB0aGUgZWxlbWVu
dCBoaXQuCi0KLSAgICBcc2EgZnJhbWUoKQotKi8KLVFQb2ludCBRV2ViSGl0VGVzdFJlc3VsdDo6
cG9zKCkgY29uc3QKLXsKLSAgICBpZiAoIWQpCi0gICAgICAgIHJldHVybiBRUG9pbnQoKTsKLSAg
ICByZXR1cm4gZC0+cG9zOwotfQotCi0vKiEKLSAgICBcc2luY2UgNC41Ci0gICAgUmV0dXJucyB0
aGUgYm91bmRpbmcgcmVjdCBvZiB0aGUgZWxlbWVudC4KLSovCi1RUmVjdCBRV2ViSGl0VGVzdFJl
c3VsdDo6Ym91bmRpbmdSZWN0KCkgY29uc3QKLXsKLSAgICBpZiAoIWQpCi0gICAgICAgIHJldHVy
biBRUmVjdCgpOwotICAgIHJldHVybiBkLT5ib3VuZGluZ1JlY3Q7Ci19Ci0KLS8qIQotICAgIFxz
aW5jZSA0LjYKLSAgICBSZXR1cm5zIHRoZSBibG9jayBlbGVtZW50IHRoYXQgZW5jbG9zZXMgdGhl
IGVsZW1lbnQgaGl0LgotCi0gICAgQSBibG9jayBlbGVtZW50IGlzIGFuIGVsZW1lbnQgdGhhdCBp
cyByZW5kZXJlZCB1c2luZyB0aGUKLSAgICBDU1MgImJsb2NrIiBzdHlsZS4gVGhpcyBpbmNsdWRl
cyBmb3IgZXhhbXBsZSB0ZXh0Ci0gICAgcGFyYWdyYXBocy4KLSovCi1RV2ViRWxlbWVudCBRV2Vi
SGl0VGVzdFJlc3VsdDo6ZW5jbG9zaW5nQmxvY2tFbGVtZW50KCkgY29uc3QKLXsKLSAgICBpZiAo
IWQpCi0gICAgICAgIHJldHVybiBRV2ViRWxlbWVudCgpOwotICAgIHJldHVybiBkLT5lbmNsb3Np
bmdCbG9jazsKLX0KLQotLyohCi0gICAgUmV0dXJucyB0aGUgdGl0bGUgb2YgdGhlIG5lYXJlc3Qg
ZW5jbG9zaW5nIEhUTUwgZWxlbWVudC4KLSovCi1RU3RyaW5nIFFXZWJIaXRUZXN0UmVzdWx0Ojp0
aXRsZSgpIGNvbnN0Ci17Ci0gICAgaWYgKCFkKQotICAgICAgICByZXR1cm4gUVN0cmluZygpOwot
ICAgIHJldHVybiBkLT50aXRsZTsKLX0KLQotLyohCi0gICAgUmV0dXJucyB0aGUgdGV4dCBvZiB0
aGUgbGluay4KLSovCi1RU3RyaW5nIFFXZWJIaXRUZXN0UmVzdWx0OjpsaW5rVGV4dCgpIGNvbnN0
Ci17Ci0gICAgaWYgKCFkKQotICAgICAgICByZXR1cm4gUVN0cmluZygpOwotICAgIHJldHVybiBk
LT5saW5rVGV4dDsKLX0KLQotLyohCi0gICAgUmV0dXJucyB0aGUgdXJsIHRvIHdoaWNoIHRoZSBs
aW5rIHBvaW50cyB0by4KLSovCi1RVXJsIFFXZWJIaXRUZXN0UmVzdWx0OjpsaW5rVXJsKCkgY29u
c3QKLXsKLSAgICBpZiAoIWQpCi0gICAgICAgIHJldHVybiBRVXJsKCk7Ci0gICAgcmV0dXJuIGQt
PmxpbmtVcmw7Ci19Ci0KLS8qIQotICAgIFJldHVybnMgdGhlIHRpdGxlIG9mIHRoZSBsaW5rLgot
Ki8KLVFVcmwgUVdlYkhpdFRlc3RSZXN1bHQ6OmxpbmtUaXRsZSgpIGNvbnN0Ci17Ci0gICAgaWYg
KCFkKQotICAgICAgICByZXR1cm4gUVVybCgpOwotICAgIHJldHVybiBkLT5saW5rVGl0bGU7Ci19
Ci0KLS8qIQotICBcc2luY2UgNC42Ci0gIFJldHVybnMgdGhlIGVsZW1lbnQgdGhhdCByZXByZXNl
bnRzIHRoZSBsaW5rLgotCi0gIFxzYSBsaW5rVGFyZ2V0RnJhbWUoKQotKi8KLVFXZWJFbGVtZW50
IFFXZWJIaXRUZXN0UmVzdWx0OjpsaW5rRWxlbWVudCgpIGNvbnN0Ci17Ci0gICAgaWYgKCFkKQot
ICAgICAgICByZXR1cm4gUVdlYkVsZW1lbnQoKTsKLSAgICByZXR1cm4gZC0+bGlua0VsZW1lbnQ7
Ci19Ci0KLS8qIQotICAgIFJldHVybnMgdGhlIGZyYW1lIHRoYXQgd2lsbCBsb2FkIHRoZSBsaW5r
IGlmIGl0IGlzIGFjdGl2YXRlZC4KLQotICAgIFxzYSBsaW5rRWxlbWVudCgpCi0qLwotUVdlYkZy
YW1lICpRV2ViSGl0VGVzdFJlc3VsdDo6bGlua1RhcmdldEZyYW1lKCkgY29uc3QKLXsKLSAgICBp
ZiAoIWQpCi0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiBkLT5saW5rVGFyZ2V0RnJhbWUu
ZGF0YSgpOwotfQotCi0vKiEKLSAgICBSZXR1cm5zIHRoZSBhbHRlcm5hdGUgdGV4dCBvZiB0aGUg
ZWxlbWVudC4gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgSFRNTCBhbHQgYXR0cmlidXRlLgotKi8K
LVFTdHJpbmcgUVdlYkhpdFRlc3RSZXN1bHQ6OmFsdGVybmF0ZVRleHQoKSBjb25zdAotewotICAg
IGlmICghZCkKLSAgICAgICAgcmV0dXJuIFFTdHJpbmcoKTsKLSAgICByZXR1cm4gZC0+YWx0ZXJu
YXRlVGV4dDsKLX0KLQotLyohCi0gICAgUmV0dXJucyB0aGUgdXJsIG9mIHRoZSBpbWFnZS4KLSov
Ci1RVXJsIFFXZWJIaXRUZXN0UmVzdWx0OjppbWFnZVVybCgpIGNvbnN0Ci17Ci0gICAgaWYgKCFk
KQotICAgICAgICByZXR1cm4gUVVybCgpOwotICAgIHJldHVybiBkLT5pbWFnZVVybDsKLX0KLQot
LyohCi0gICAgUmV0dXJucyBhIFFQaXhtYXAgY29udGFpbmluZyB0aGUgaW1hZ2UuIEEgbnVsbCBw
aXhtYXAgaXMgcmV0dXJuZWQgaWYgdGhlCi0gICAgZWxlbWVudCBiZWluZyB0ZXN0ZWQgaXMgbm90
IGFuIGltYWdlLgotKi8KLVFQaXhtYXAgUVdlYkhpdFRlc3RSZXN1bHQ6OnBpeG1hcCgpIGNvbnN0
Ci17Ci0gICAgaWYgKCFkKQotICAgICAgICByZXR1cm4gUVBpeG1hcCgpOwotICAgIHJldHVybiBk
LT5waXhtYXA7Ci19Ci0KLS8qIQotICAgIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29udGVudCBpcyBl
ZGl0YWJsZSBieSB0aGUgdXNlcjsgb3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuCi0qLwotYm9vbCBR
V2ViSGl0VGVzdFJlc3VsdDo6aXNDb250ZW50RWRpdGFibGUoKSBjb25zdAotewotICAgIGlmICgh
ZCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiBkLT5pc0NvbnRlbnRFZGl0YWJs
ZTsKLX0KLQotLyohCi0gICAgUmV0dXJucyB0cnVlIGlmIHRoZSBjb250ZW50IHRlc3RlZCBpcyBw
YXJ0IG9mIHRoZSBzZWxlY3Rpb247IG90aGVyd2lzZSByZXR1cm5zIGZhbHNlLgotKi8KLWJvb2wg
UVdlYkhpdFRlc3RSZXN1bHQ6OmlzQ29udGVudFNlbGVjdGVkKCkgY29uc3QKLXsKLSAgICBpZiAo
IWQpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gZC0+aXNDb250ZW50U2VsZWN0
ZWQ7Ci19Ci0KLS8qIQotICAgIFxzaW5jZSA0LjYKLSAgICBSZXR1cm5zIHRoZSB1bmRlcmx5aW5n
IERPTSBlbGVtZW50IGFzIFFXZWJFbGVtZW50LgotKi8KLVFXZWJFbGVtZW50IFFXZWJIaXRUZXN0
UmVzdWx0OjplbGVtZW50KCkgY29uc3QKLXsKLSAgICBpZiAoIWQgfHwgIWQtPmlubmVyTm9uU2hh
cmVkTm9kZSB8fCAhZC0+aW5uZXJOb25TaGFyZWROb2RlLT5pc0VsZW1lbnROb2RlKCkpCi0gICAg
ICAgIHJldHVybiBRV2ViRWxlbWVudCgpOwotCi0gICAgcmV0dXJuIFFXZWJFbGVtZW50KHN0YXRp
Y19jYXN0PFdlYkNvcmU6OkVsZW1lbnQqPihkLT5pbm5lck5vblNoYXJlZE5vZGUuZ2V0KCkpKTsK
LX0KLQotLyohCi0gICAgUmV0dXJucyB0aGUgZnJhbWUgb2YgdGhlIGVsZW1lbnQgaGl0LgotKi8K
LVFXZWJGcmFtZSAqUVdlYkhpdFRlc3RSZXN1bHQ6OmZyYW1lKCkgY29uc3QKLXsKLSAgICBpZiAo
IWQpCi0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiBkLT5mcmFtZS5kYXRhKCk7Ci19Ci0K
LS8qIQotICogXGludGVybmFsCi0gKi8KLVFXZWJGcmFtZUFkYXB0ZXIgKlFXZWJGcmFtZTo6aGFu
ZGxlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZDsKLX0KLQotI2luY2x1ZGUgIm1vY19xd2ViZnJh
bWUuY3BwIgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9BcGkvcXdlYmZyYW1lLmggYi9T
b3VyY2UvV2ViS2l0L3F0L0FwaS9xd2ViZnJhbWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggZmUwMGQ4MWY1YTA0NTJhZDI0ODE4OTk2NjM5NDE5OGRjY2Q3ZmJmNy4uMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L3F0L0Fw
aS9xd2ViZnJhbWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0NSArMCwwIEBACi0vKgotICAgIENv
cHlyaWdodCAoQykgMjAwOCwyMDA5IE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lk
aWFyeSgtaWVzKQotICAgIENvcHlyaWdodCAoQykgMjAwNyBTdGFpa29zIENvbXB1dGluZyBTZXJ2
aWNlcyBJbmMuCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy
ZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0
aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBi
eSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIgb2Yg
dGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAg
ICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJl
IHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUg
aW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGlicmFyeSBHZW5lcmFsIFB1
YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVj
ZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0g
ICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElm
IG5vdCwgd3JpdGUgdG8KLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1
MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAotICAgIEJvc3RvbiwgTUEgMDIxMTAtMTMw
MSwgVVNBLgotKi8KLQotI2lmbmRlZiBRV0VCRlJBTUVfSAotI2RlZmluZSBRV0VCRlJBTUVfSAot
Ci0jaW5jbHVkZSA8UXRDb3JlL3FvYmplY3QuaD4KLSNpbmNsdWRlIDxRdENvcmUvcXVybC5oPgot
I2luY2x1ZGUgPFF0Q29yZS9xdmFyaWFudC5oPgotI2luY2x1ZGUgPFF0R3VpL3FpY29uLmg+Ci0j
aW5jbHVkZSA8UXROZXR3b3JrL3FuZXR3b3JrYWNjZXNzbWFuYWdlci5oPgotI2luY2x1ZGUgInF3
ZWJraXRnbG9iYWwuaCIKLQotUVRfQkVHSU5fTkFNRVNQQUNFCi1jbGFzcyBRUmVjdDsKLWNsYXNz
IFFQb2ludDsKLWNsYXNzIFFQYWludGVyOwotY2xhc3MgUVBpeG1hcDsKLWNsYXNzIFFNb3VzZUV2
ZW50OwotY2xhc3MgUVdoZWVsRXZlbnQ7Ci1jbGFzcyBRTmV0d29ya1JlcXVlc3Q7Ci1jbGFzcyBR
UmVnaW9uOwotY2xhc3MgUVByaW50ZXI7Ci1RVF9FTkRfTkFNRVNQQUNFCi0KLWNsYXNzIFFXZWJO
ZXR3b3JrUmVxdWVzdDsKLWNsYXNzIFFXZWJGcmFtZUFkYXB0ZXI7Ci1jbGFzcyBRV2ViRnJhbWVQ
cml2YXRlOwotY2xhc3MgUVdlYlBhZ2U7Ci1jbGFzcyBRV2ViUGFnZUFkYXB0ZXI7Ci1jbGFzcyBR
V2ViSGl0VGVzdFJlc3VsdDsKLWNsYXNzIFFXZWJIaXN0b3J5SXRlbTsKLWNsYXNzIFFXZWJTZWN1
cml0eU9yaWdpbjsKLWNsYXNzIFFXZWJFbGVtZW50OwotY2xhc3MgUVdlYkVsZW1lbnRDb2xsZWN0
aW9uOwotY2xhc3MgUVdlYlNjcmlwdFdvcmxkOwotCi1jbGFzcyBEdW1wUmVuZGVyVHJlZVN1cHBv
cnRRdDsKLW5hbWVzcGFjZSBXZWJDb3JlIHsKLSAgICBjbGFzcyBXaWRnZXRQcml2YXRlOwotICAg
IGNsYXNzIEZyYW1lTG9hZGVyQ2xpZW50UXQ7Ci0gICAgY2xhc3MgQ2hyb21lQ2xpZW50UXQ7Ci0g
ICAgY2xhc3MgVGV4dHVyZU1hcHBlckxheWVyQ2xpZW50UXQ7Ci19Ci1jbGFzcyBRV2ViRnJhbWVE
YXRhOwotY2xhc3MgUVdlYkhpdFRlc3RSZXN1bHRQcml2YXRlOwotY2xhc3MgUVdlYkZyYW1lOwot
Ci1jbGFzcyBRV0VCS0lUX0VYUE9SVCBRV2ViSGl0VGVzdFJlc3VsdCB7Ci1wdWJsaWM6Ci0gICAg
UVdlYkhpdFRlc3RSZXN1bHQoKTsKLSAgICBRV2ViSGl0VGVzdFJlc3VsdChjb25zdCBRV2ViSGl0
VGVzdFJlc3VsdCAmb3RoZXIpOwotICAgIFFXZWJIaXRUZXN0UmVzdWx0ICZvcGVyYXRvcj0oY29u
c3QgUVdlYkhpdFRlc3RSZXN1bHQgJm90aGVyKTsKLSAgICB+UVdlYkhpdFRlc3RSZXN1bHQoKTsK
LQotICAgIGJvb2wgaXNOdWxsKCkgY29uc3Q7Ci0KLSAgICBRUG9pbnQgcG9zKCkgY29uc3Q7Ci0g
ICAgUVJlY3QgYm91bmRpbmdSZWN0KCkgY29uc3Q7Ci0gICAgUVdlYkVsZW1lbnQgZW5jbG9zaW5n
QmxvY2tFbGVtZW50KCkgY29uc3Q7Ci0gICAgUVN0cmluZyB0aXRsZSgpIGNvbnN0OwotCi0gICAg
UVN0cmluZyBsaW5rVGV4dCgpIGNvbnN0OwotICAgIFFVcmwgbGlua1VybCgpIGNvbnN0OwotICAg
IFFVcmwgbGlua1RpdGxlKCkgY29uc3Q7Ci0gICAgUVdlYkZyYW1lICpsaW5rVGFyZ2V0RnJhbWUo
KSBjb25zdDsKLSAgICBRV2ViRWxlbWVudCBsaW5rRWxlbWVudCgpIGNvbnN0OwotCi0gICAgUVN0
cmluZyBhbHRlcm5hdGVUZXh0KCkgY29uc3Q7IC8vIGZvciBpbWcsIGFyZWEsIGlucHV0IGFuZCBh
cHBsZXQKLQotICAgIFFVcmwgaW1hZ2VVcmwoKSBjb25zdDsKLSAgICBRUGl4bWFwIHBpeG1hcCgp
IGNvbnN0OwotCi0gICAgYm9vbCBpc0NvbnRlbnRFZGl0YWJsZSgpIGNvbnN0OwotICAgIGJvb2wg
aXNDb250ZW50U2VsZWN0ZWQoKSBjb25zdDsKLQotICAgIFFXZWJFbGVtZW50IGVsZW1lbnQoKSBj
b25zdDsKLQotICAgIFFXZWJGcmFtZSAqZnJhbWUoKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICBR
V2ViSGl0VGVzdFJlc3VsdChRV2ViSGl0VGVzdFJlc3VsdFByaXZhdGUgKnByaXYpOwotICAgIFFX
ZWJIaXRUZXN0UmVzdWx0UHJpdmF0ZSAqZDsKLQotICAgIGZyaWVuZCBjbGFzcyBRV2ViRnJhbWU7
Ci0gICAgZnJpZW5kIGNsYXNzIFFXZWJQYWdlUHJpdmF0ZTsKLSAgICBmcmllbmQgY2xhc3MgUVdl
YlBhZ2U7Ci19OwotCi1jbGFzcyBRV0VCS0lUX0VYUE9SVCBRV2ViRnJhbWUgOiBwdWJsaWMgUU9i
amVjdCB7Ci0gICAgUV9PQkpFQ1QKLSAgICBRX1BST1BFUlRZKHFyZWFsIHRleHRTaXplTXVsdGlw
bGllciBSRUFEIHRleHRTaXplTXVsdGlwbGllciBXUklURSBzZXRUZXh0U2l6ZU11bHRpcGxpZXIg
REVTSUdOQUJMRSBmYWxzZSkKLSAgICBRX1BST1BFUlRZKHFyZWFsIHpvb21GYWN0b3IgUkVBRCB6
b29tRmFjdG9yIFdSSVRFIHNldFpvb21GYWN0b3IpCi0gICAgUV9QUk9QRVJUWShRU3RyaW5nIHRp
dGxlIFJFQUQgdGl0bGUpCi0gICAgUV9QUk9QRVJUWShRVXJsIHVybCBSRUFEIHVybCBXUklURSBz
ZXRVcmwpCi0gICAgUV9QUk9QRVJUWShRVXJsIHJlcXVlc3RlZFVybCBSRUFEIHJlcXVlc3RlZFVy
bCkKLSAgICBRX1BST1BFUlRZKFFVcmwgYmFzZVVybCBSRUFEIGJhc2VVcmwpCi0gICAgUV9QUk9Q
RVJUWShRSWNvbiBpY29uIFJFQUQgaWNvbikKLSAgICBRX1BST1BFUlRZKFFTaXplIGNvbnRlbnRz
U2l6ZSBSRUFEIGNvbnRlbnRzU2l6ZSkKLSAgICBRX1BST1BFUlRZKFFQb2ludCBzY3JvbGxQb3Np
dGlvbiBSRUFEIHNjcm9sbFBvc2l0aW9uIFdSSVRFIHNldFNjcm9sbFBvc2l0aW9uKQotICAgIFFf
UFJPUEVSVFkoYm9vbCBmb2N1cyBSRUFEIGhhc0ZvY3VzKQotcHJpdmF0ZToKLSAgICBRV2ViRnJh
bWUoUVdlYlBhZ2UgKnBhcmVudFBhZ2UpOwotICAgIFFXZWJGcmFtZShRV2ViRnJhbWUqIHBhcmVu
dCwgUVdlYkZyYW1lRGF0YSopOwotICAgIH5RV2ViRnJhbWUoKTsKLQotcHVibGljOgotICAgIGVu
dW0gVmFsdWVPd25lcnNoaXAgewotICAgICAgICBRdE93bmVyc2hpcCwKLSAgICAgICAgU2NyaXB0
T3duZXJzaGlwLAotICAgICAgICBBdXRvT3duZXJzaGlwCi0gICAgfTsKLQotICAgIFFXZWJQYWdl
ICpwYWdlKCkgY29uc3Q7Ci0KLSAgICB2b2lkIGxvYWQoY29uc3QgUVVybCAmdXJsKTsKLSAgICB2
b2lkIGxvYWQoY29uc3QgUU5ldHdvcmtSZXF1ZXN0ICZyZXF1ZXN0LCBRTmV0d29ya0FjY2Vzc01h
bmFnZXI6Ok9wZXJhdGlvbiBvcGVyYXRpb24gPSBRTmV0d29ya0FjY2Vzc01hbmFnZXI6OkdldE9w
ZXJhdGlvbiwgY29uc3QgUUJ5dGVBcnJheSAmYm9keSA9IFFCeXRlQXJyYXkoKSk7Ci0gICAgdm9p
ZCBzZXRIdG1sKGNvbnN0IFFTdHJpbmcgJmh0bWwsIGNvbnN0IFFVcmwgJmJhc2VVcmwgPSBRVXJs
KCkpOwotICAgIHZvaWQgc2V0Q29udGVudChjb25zdCBRQnl0ZUFycmF5ICZkYXRhLCBjb25zdCBR
U3RyaW5nICZtaW1lVHlwZSA9IFFTdHJpbmcoKSwgY29uc3QgUVVybCAmYmFzZVVybCA9IFFVcmwo
KSk7Ci0KLSAgICB2b2lkIGFkZFRvSmF2YVNjcmlwdFdpbmRvd09iamVjdChjb25zdCBRU3RyaW5n
ICZuYW1lLCBRT2JqZWN0ICpvYmplY3QsIFZhbHVlT3duZXJzaGlwIG93bmVyc2hpcCA9IFF0T3du
ZXJzaGlwKTsKLSAgICBRU3RyaW5nIHRvSHRtbCgpIGNvbnN0OwotICAgIFFTdHJpbmcgdG9QbGFp
blRleHQoKSBjb25zdDsKLSAgICBRU3RyaW5nIHJlbmRlclRyZWVEdW1wKCkgY29uc3Q7Ci0KLSAg
ICBRU3RyaW5nIHRpdGxlKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRVcmwoY29uc3QgUVVybCAmdXJs
KTsKLSAgICBRVXJsIHVybCgpIGNvbnN0OwotICAgIFFVcmwgcmVxdWVzdGVkVXJsKCkgY29uc3Q7
Ci0gICAgUVVybCBiYXNlVXJsKCkgY29uc3Q7Ci0gICAgUUljb24gaWNvbigpIGNvbnN0OwotICAg
IFFNdWx0aU1hcDxRU3RyaW5nLCBRU3RyaW5nPiBtZXRhRGF0YSgpIGNvbnN0OwotCi0gICAgUVN0
cmluZyBmcmFtZU5hbWUoKSBjb25zdDsKLQotICAgIFFXZWJGcmFtZSAqcGFyZW50RnJhbWUoKSBj
b25zdDsKLSAgICBRTGlzdDxRV2ViRnJhbWUqPiBjaGlsZEZyYW1lcygpIGNvbnN0OwotCi0gICAg
UXQ6OlNjcm9sbEJhclBvbGljeSBzY3JvbGxCYXJQb2xpY3koUXQ6Ok9yaWVudGF0aW9uIG9yaWVu
dGF0aW9uKSBjb25zdDsKLSAgICB2b2lkIHNldFNjcm9sbEJhclBvbGljeShRdDo6T3JpZW50YXRp
b24gb3JpZW50YXRpb24sIFF0OjpTY3JvbGxCYXJQb2xpY3kgcG9saWN5KTsKLQotICAgIHZvaWQg
c2V0U2Nyb2xsQmFyVmFsdWUoUXQ6Ok9yaWVudGF0aW9uIG9yaWVudGF0aW9uLCBpbnQgdmFsdWUp
OwotICAgIGludCBzY3JvbGxCYXJWYWx1ZShRdDo6T3JpZW50YXRpb24gb3JpZW50YXRpb24pIGNv
bnN0OwotICAgIGludCBzY3JvbGxCYXJNaW5pbXVtKFF0OjpPcmllbnRhdGlvbiBvcmllbnRhdGlv
bikgY29uc3Q7Ci0gICAgaW50IHNjcm9sbEJhck1heGltdW0oUXQ6Ok9yaWVudGF0aW9uIG9yaWVu
dGF0aW9uKSBjb25zdDsKLSAgICBRUmVjdCBzY3JvbGxCYXJHZW9tZXRyeShRdDo6T3JpZW50YXRp
b24gb3JpZW50YXRpb24pIGNvbnN0OwotCi0gICAgdm9pZCBzY3JvbGwoaW50LCBpbnQpOwotICAg
IFFQb2ludCBzY3JvbGxQb3NpdGlvbigpIGNvbnN0OwotICAgIHZvaWQgc2V0U2Nyb2xsUG9zaXRp
b24oY29uc3QgUVBvaW50ICZwb3MpOwotCi0gICAgdm9pZCBzY3JvbGxUb0FuY2hvcihjb25zdCBR
U3RyaW5nJiBhbmNob3IpOwotCi0gICAgZW51bSBSZW5kZXJMYXllciB7Ci0gICAgICAgIENvbnRl
bnRzTGF5ZXIgPSAweDEwLAotICAgICAgICBTY3JvbGxCYXJMYXllciA9IDB4MjAsCi0gICAgICAg
IFBhbkljb25MYXllciA9IDB4NDAsCi0KLSAgICAgICAgQWxsTGF5ZXJzID0gMHhmZgotICAgIH07
Ci0KLSAgICB2b2lkIHJlbmRlcihRUGFpbnRlciopOwotICAgIHZvaWQgcmVuZGVyKFFQYWludGVy
KiwgY29uc3QgUVJlZ2lvbiYgY2xpcCk7Ci0gICAgdm9pZCByZW5kZXIoUVBhaW50ZXIqLCBSZW5k
ZXJMYXllciBsYXllciwgY29uc3QgUVJlZ2lvbiYgY2xpcCA9IFFSZWdpb24oKSk7Ci0KLSAgICB2
b2lkIHNldFRleHRTaXplTXVsdGlwbGllcihxcmVhbCBmYWN0b3IpOwotICAgIHFyZWFsIHRleHRT
aXplTXVsdGlwbGllcigpIGNvbnN0OwotCi0gICAgcXJlYWwgem9vbUZhY3RvcigpIGNvbnN0Owot
ICAgIHZvaWQgc2V0Wm9vbUZhY3RvcihxcmVhbCBmYWN0b3IpOwotCi0gICAgYm9vbCBoYXNGb2N1
cygpIGNvbnN0OwotICAgIHZvaWQgc2V0Rm9jdXMoKTsKLQotICAgIFFQb2ludCBwb3MoKSBjb25z
dDsKLSAgICBRUmVjdCBnZW9tZXRyeSgpIGNvbnN0OwotICAgIFFTaXplIGNvbnRlbnRzU2l6ZSgp
IGNvbnN0OwotCi0gICAgUVdlYkVsZW1lbnQgZG9jdW1lbnRFbGVtZW50KCkgY29uc3Q7Ci0gICAg
UVdlYkVsZW1lbnRDb2xsZWN0aW9uIGZpbmRBbGxFbGVtZW50cyhjb25zdCBRU3RyaW5nICZzZWxl
Y3RvclF1ZXJ5KSBjb25zdDsKLSAgICBRV2ViRWxlbWVudCBmaW5kRmlyc3RFbGVtZW50KGNvbnN0
IFFTdHJpbmcgJnNlbGVjdG9yUXVlcnkpIGNvbnN0OwotCi0gICAgUVdlYkhpdFRlc3RSZXN1bHQg
aGl0VGVzdENvbnRlbnQoY29uc3QgUVBvaW50ICZwb3MpIGNvbnN0OwotCi0gICAgdmlydHVhbCBi
b29sIGV2ZW50KFFFdmVudCAqKTsKLQotICAgIFFXZWJTZWN1cml0eU9yaWdpbiBzZWN1cml0eU9y
aWdpbigpIGNvbnN0OwotICAgIFFXZWJGcmFtZUFkYXB0ZXIqIGhhbmRsZSgpIGNvbnN0OwotCi1w
dWJsaWMgUV9TTE9UUzoKLSAgICBRVmFyaWFudCBldmFsdWF0ZUphdmFTY3JpcHQoY29uc3QgUVN0
cmluZyYgc2NyaXB0U291cmNlKTsKLSNpZm5kZWYgUVRfTk9fUFJJTlRFUgotICAgIHZvaWQgcHJp
bnQoUVByaW50ZXIgKnByaW50ZXIpIGNvbnN0OwotI2VuZGlmCi0KLVFfU0lHTkFMUzoKLSAgICB2
b2lkIGphdmFTY3JpcHRXaW5kb3dPYmplY3RDbGVhcmVkKCk7Ci0KLSAgICB2b2lkIHByb3Zpc2lv
bmFsTG9hZCgpOwotICAgIHZvaWQgdGl0bGVDaGFuZ2VkKGNvbnN0IFFTdHJpbmcgJnRpdGxlKTsK
LSAgICB2b2lkIHVybENoYW5nZWQoY29uc3QgUVVybCAmdXJsKTsKLQotICAgIHZvaWQgaW5pdGlh
bExheW91dENvbXBsZXRlZCgpOwotCi0gICAgdm9pZCBpY29uQ2hhbmdlZCgpOwotCi0gICAgdm9p
ZCBjb250ZW50c1NpemVDaGFuZ2VkKGNvbnN0IFFTaXplICZzaXplKTsKLQotICAgIHZvaWQgbG9h
ZFN0YXJ0ZWQoKTsKLSAgICB2b2lkIGxvYWRGaW5pc2hlZChib29sIG9rKTsKLQotICAgIHZvaWQg
cGFnZUNoYW5nZWQoKTsKLQotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgUUdyYXBoaWNzV2Vi
VmlldzsKLSAgICBmcmllbmQgY2xhc3MgUVdlYlBhZ2U7Ci0gICAgZnJpZW5kIGNsYXNzIFFXZWJQ
YWdlUHJpdmF0ZTsKLSAgICBmcmllbmQgY2xhc3MgUVdlYkZyYW1lUHJpdmF0ZTsKLSAgICBmcmll
bmQgY2xhc3MgRHVtcFJlbmRlclRyZWVTdXBwb3J0UXQ7Ci0gICAgZnJpZW5kIGNsYXNzIFdlYkNv
cmU6OldpZGdldFByaXZhdGU7Ci0gICAgZnJpZW5kIGNsYXNzIFdlYkNvcmU6OkZyYW1lTG9hZGVy
Q2xpZW50UXQ7Ci0gICAgZnJpZW5kIGNsYXNzIFdlYkNvcmU6OkNocm9tZUNsaWVudFF0OwotICAg
IGZyaWVuZCBjbGFzcyBXZWJDb3JlOjpUZXh0dXJlTWFwcGVyTGF5ZXJDbGllbnRRdDsKLSAgICBR
V2ViRnJhbWVQcml2YXRlICpkOwotICAgIFFfUFJJVkFURV9TTE9UKGQsIHZvaWQgX3Ffb3JpZW50
YXRpb25DaGFuZ2VkKCkpCi19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQv
cXQvQXBpL3F3ZWJmcmFtZV9wLmggYi9Tb3VyY2UvV2ViS2l0L3F0L0FwaS9xd2ViZnJhbWVfcC5o
CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmRjYmM4NWE0NThiOGU5OTQ3OWE2MDk2
OGE0OGE4OGM4YmU3MDE4Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
Ci0tLSBhL1NvdXJjZS9XZWJLaXQvcXQvQXBpL3F3ZWJmcmFtZV9wLmgKKysrIC9kZXYvbnVsbApA
QCAtMSwxNDMgKzAsMCBAQAotLyoKLSAgICBDb3B5cmlnaHQgKEMpIDIwMDggTm9raWEgQ29ycG9y
YXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCi0gICAgQ29weXJpZ2h0IChDKSAyMDA3
IFN0YWlrb3MgQ29tcHV0aW5nIFNlcnZpY2VzIEluYy4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBm
cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2RpZnkg
aXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICAg
IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVp
dGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBh
bnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0
aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJS
QU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRB
QklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUK
LSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQot
ICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRo
ZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwotICAgIHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCi0g
ICAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCi0qLwotCi0jaWZuZGVmIFFXRUJGUkFNRV9Q
X0gKLSNkZWZpbmUgUVdFQkZSQU1FX1BfSAotCi0jaW5jbHVkZSAiUVdlYkZyYW1lQWRhcHRlci5o
IgotCi0jaW5jbHVkZSAicXdlYmZyYW1lLmgiCi0jaW5jbHVkZSAicXdlYnBhZ2VfcC5oIgotCi0j
aW5jbHVkZSAiRXZlbnRIYW5kbGVyLmgiCi0jaW5jbHVkZSAiRnJhbWUuaCIKLSNpbmNsdWRlICJH
cmFwaGljc0NvbnRleHQuaCIKLSNpbmNsdWRlICJLVVJMLmgiCi0jaWYgRU5BQkxFKE9SSUVOVEFU
SU9OX0VWRU5UUykKLSNpbmNsdWRlICJxb3JpZW50YXRpb25zZW5zb3IuaCIKLSNlbmRpZiAvLyBF
TkFCTEUoT1JJRU5UQVRJT05fRVZFTlRTKS4KLSNpbmNsdWRlICJxd2ViZWxlbWVudC5oIgotI2lm
IFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKLSNpbmNsdWRlICJ0ZXhtYXAvVGV4dHVyZU1h
cHBlci5oIgotI2VuZGlmCi0jaW5jbHVkZSAiVmlld3BvcnRBcmd1bWVudHMuaCIKLSNpbmNsdWRl
IDx3dGYvUmVmUHRyLmg+Ci0jaW5jbHVkZSA8d3RmL3RleHQvV1RGU3RyaW5nLmg+Ci0KLQotbmFt
ZXNwYWNlIFdlYkNvcmUgewotICAgIGNsYXNzIEZyYW1lTG9hZGVyQ2xpZW50UXQ7Ci0gICAgY2xh
c3MgRnJhbWVWaWV3OwotICAgIGNsYXNzIEhUTUxGcmFtZU93bmVyRWxlbWVudDsKLSAgICBjbGFz
cyBTY3JvbGxiYXI7Ci0gICAgY2xhc3MgVGV4dHVyZU1hcHBlckxheWVyOwotfQotY2xhc3MgUVdl
YlBhZ2U7Ci0KLWNsYXNzIFFXZWJGcmFtZVByaXZhdGUgOiBwdWJsaWMgUVdlYkZyYW1lQWRhcHRl
ciB7Ci1wdWJsaWM6Ci0gICAgUVdlYkZyYW1lUHJpdmF0ZSgpCi0gICAgICAgIDogcSgwKQotICAg
ICAgICAsIGhvcml6b250YWxTY3JvbGxCYXJQb2xpY3koUXQ6OlNjcm9sbEJhckFzTmVlZGVkKQot
ICAgICAgICAsIHZlcnRpY2FsU2Nyb2xsQmFyUG9saWN5KFF0OjpTY3JvbGxCYXJBc05lZWRlZCkK
LSAgICAgICAgLCBwYWdlKDApCi0jaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQotICAg
ICAgICAsIHJvb3RUZXh0dXJlTWFwcGVyTGF5ZXIoMCkKLSNlbmRpZgotICAgICAgICB7fQotICAg
IHZvaWQgc2V0UGFnZShRV2ViUGFnZSopOwotCi0gICAgaW5saW5lIFFXZWJGcmFtZSAqcGFyZW50
RnJhbWUoKSB7IHJldHVybiBxb2JqZWN0X2Nhc3Q8UVdlYkZyYW1lKj4ocS0+cGFyZW50KCkpOyB9
Ci0KLSAgICBXZWJDb3JlOjpTY3JvbGxiYXIqIGhvcml6b250YWxTY3JvbGxCYXIoKSBjb25zdDsK
LSAgICBXZWJDb3JlOjpTY3JvbGxiYXIqIHZlcnRpY2FsU2Nyb2xsQmFyKCkgY29uc3Q7Ci0KLSAg
ICBzdGF0aWMgV2ViQ29yZTo6RnJhbWUqIGNvcmUoY29uc3QgUVdlYkZyYW1lKik7Ci0gICAgc3Rh
dGljIFFXZWJGcmFtZSoga2l0KGNvbnN0IFdlYkNvcmU6OkZyYW1lKik7Ci0gICAgc3RhdGljIFFX
ZWJGcmFtZSoga2l0KGNvbnN0IFFXZWJGcmFtZUFkYXB0ZXIqKTsKLQotICAgIHZvaWQgcmVuZGVy
UmVsYXRpdmVDb29yZHMoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0KiwgUUZsYWdzPFFXZWJGcmFt
ZTo6UmVuZGVyTGF5ZXI+LCBjb25zdCBRUmVnaW9uJiBjbGlwKTsKLSNpZiBVU0UoVElMRURfQkFD
S0lOR19TVE9SRSkKLSAgICB2b2lkIHJlbmRlckZyb21UaWxlZEJhY2tpbmdTdG9yZShXZWJDb3Jl
OjpHcmFwaGljc0NvbnRleHQqLCBjb25zdCBRUmVnaW9uJiBjbGlwKTsKLSNlbmRpZgotCi0jaWYg
VVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQotICAgIHZvaWQgcmVuZGVyQ29tcG9zaXRlZExh
eWVycyhXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQqLCBjb25zdCBXZWJDb3JlOjpJbnRSZWN0JiBj
bGlwKTsKLSNlbmRpZgotICAgIHZvaWQgcmVuZGVyRnJhbWVFeHRyYXMoV2ViQ29yZTo6R3JhcGhp
Y3NDb250ZXh0KiwgUUZsYWdzPFFXZWJGcmFtZTo6UmVuZGVyTGF5ZXI+LCBjb25zdCBRUmVnaW9u
JiBjbGlwKTsKLSAgICB2b2lkIF9xX29yaWVudGF0aW9uQ2hhbmdlZCgpOwotCi0KLSAgICAvLyBB
ZGFwdGVyIGltcGxlbWVudGF0aW9uCi0gICAgdmlydHVhbCBRV2ViRnJhbWUqIGFwaUhhbmRsZSgp
IE9WRVJSSURFOwotICAgIHZpcnR1YWwgUU9iamVjdCogaGFuZGxlKCkgT1ZFUlJJREU7Ci0gICAg
dmlydHVhbCB2b2lkIGNvbnRlbnRzU2l6ZURpZENoYW5nZShjb25zdCBRU2l6ZSAmKSBPVkVSUklE
RTsKLSAgICB2aXJ0dWFsIGludCBzY3JvbGxCYXJQb2xpY3koUXQ6Ok9yaWVudGF0aW9uKSBjb25z
dCBPVkVSUklERTsKLSAgICB2aXJ0dWFsIHZvaWQgZW1pdFVybENoYW5nZWQoKSBPVkVSUklERTsK
LSAgICB2aXJ0dWFsIHZvaWQgZGlkU3RhcnRQcm92aXNpb25hbExvYWQoKSBPVkVSUklERTsKLSAg
ICB2aXJ0dWFsIHZvaWQgZGlkQ2xlYXJXaW5kb3dPYmplY3QoKSBPVkVSUklERTsKLSAgICB2aXJ0
dWFsIGJvb2wgaGFuZGxlUHJvZ3Jlc3NGaW5pc2hlZChRUG9pbnQqKSBPVkVSUklERTsKLSAgICB2
aXJ0dWFsIHZvaWQgZW1pdEluaXRpYWxMYXlvdXRDb21wbGV0ZWQoKSBPVkVSUklERTsKLSAgICB2
aXJ0dWFsIHZvaWQgZW1pdEljb25DaGFuZ2VkKCkgT1ZFUlJJREU7Ci0gICAgdmlydHVhbCB2b2lk
IGVtaXRMb2FkU3RhcnRlZChib29sIG9yaWdpbmF0aW5nTG9hZCkgT1ZFUlJJREU7Ci0gICAgdmly
dHVhbCB2b2lkIGVtaXRMb2FkRmluaXNoZWQoYm9vbCBvcmlnaW5hdGluZ0xvYWQsIGJvb2wgb2sp
IE9WRVJSSURFOwotICAgIHZpcnR1YWwgUVdlYkZyYW1lQWRhcHRlciogY3JlYXRlQ2hpbGRGcmFt
ZShRV2ViRnJhbWVEYXRhKikgT1ZFUlJJREU7Ci0KLSAgICBRV2ViRnJhbWUgKnE7Ci0gICAgUXQ6
OlNjcm9sbEJhclBvbGljeSBob3Jpem9udGFsU2Nyb2xsQmFyUG9saWN5OwotICAgIFF0OjpTY3Jv
bGxCYXJQb2xpY3kgdmVydGljYWxTY3JvbGxCYXJQb2xpY3k7Ci0gICAgUVdlYlBhZ2UgKnBhZ2U7
Ci0KLSNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCi0gICAgV2ViQ29yZTo6VGV4dHVy
ZU1hcHBlckxheWVyKiByb290VGV4dHVyZU1hcHBlckxheWVyOwotICAgIE93blB0cjxXZWJDb3Jl
OjpUZXh0dXJlTWFwcGVyPiB0ZXh0dXJlTWFwcGVyOwotI2VuZGlmCi0KLSNpZiBFTkFCTEUoT1JJ
RU5UQVRJT05fRVZFTlRTKQotICAgIFFPcmllbnRhdGlvblNlbnNvciBtX29yaWVudGF0aW9uOwot
I2VuZGlmIC8vIEVOQUJMRShPUklFTlRBVElPTl9FVkVOVFMpLgotfTsKLQotY2xhc3MgUVdlYkhp
dFRlc3RSZXN1bHRQcml2YXRlIHsKLXB1YmxpYzoKLSAgICBRV2ViSGl0VGVzdFJlc3VsdFByaXZh
dGUoKSA6IGlzQ29udGVudEVkaXRhYmxlKGZhbHNlKSwgaXNDb250ZW50U2VsZWN0ZWQoZmFsc2Up
LCBpc1Njcm9sbEJhcihmYWxzZSkge30KLSAgICBRV2ViSGl0VGVzdFJlc3VsdFByaXZhdGUoY29u
c3QgV2ViQ29yZTo6SGl0VGVzdFJlc3VsdCAmaGl0VGVzdCk7Ci0KLSAgICBRUG9pbnQgcG9zOwot
ICAgIFFSZWN0IGJvdW5kaW5nUmVjdDsKLSAgICBRV2ViRWxlbWVudCBlbmNsb3NpbmdCbG9jazsK
LSAgICBRU3RyaW5nIHRpdGxlOwotICAgIFFTdHJpbmcgbGlua1RleHQ7Ci0gICAgUVVybCBsaW5r
VXJsOwotICAgIFFTdHJpbmcgbGlua1RpdGxlOwotICAgIFFQb2ludGVyPFFXZWJGcmFtZT4gbGlu
a1RhcmdldEZyYW1lOwotICAgIFFXZWJFbGVtZW50IGxpbmtFbGVtZW50OwotICAgIFFTdHJpbmcg
YWx0ZXJuYXRlVGV4dDsKLSAgICBRVXJsIGltYWdlVXJsOwotICAgIFFQaXhtYXAgcGl4bWFwOwot
ICAgIGJvb2wgaXNDb250ZW50RWRpdGFibGU7Ci0gICAgYm9vbCBpc0NvbnRlbnRTZWxlY3RlZDsK
LSAgICBib29sIGlzU2Nyb2xsQmFyOwotICAgIFFQb2ludGVyPFFXZWJGcmFtZT4gZnJhbWU7Ci0g
ICAgUmVmUHRyPFdlYkNvcmU6Ok5vZGU+IGlubmVyTm9kZTsKLSAgICBSZWZQdHI8V2ViQ29yZTo6
Tm9kZT4gaW5uZXJOb25TaGFyZWROb2RlOwotfTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViS2l0L3F0L0FwaS9xd2ViaGlzdG9yeS5oIGIvU291cmNlL1dlYktpdC9xdC9BcGkvcXdl
Ymhpc3RvcnkuaAppbmRleCA3NTNlYjYzNzZkZDViZGFmMGZjNzI2MWUxNzU0MzU2NzBlMjdjOWUy
Li4wOTJmNDI1ZWU2YTZmZjMwYTk3MDA4YjdlMTIwMDc3YjJlODA1NWE2IDEwMDY0NAotLS0gYS9T
b3VyY2UvV2ViS2l0L3F0L0FwaS9xd2ViaGlzdG9yeS5oCisrKyBiL1NvdXJjZS9XZWJLaXQvcXQv
QXBpL3F3ZWJoaXN0b3J5LmgKQEAgLTEwMSw3ICsxMDEsNyBAQCBwcml2YXRlOgogICAgIH5RV2Vi
SGlzdG9yeSgpOwogCiAgICAgZnJpZW5kIGNsYXNzIFFXZWJQYWdlOwotICAgIGZyaWVuZCBjbGFz
cyBRV2ViUGFnZVByaXZhdGU7CisgICAgZnJpZW5kIGNsYXNzIFFXZWJQYWdlQWRhcHRlcjsKICAg
ICBmcmllbmQgUVdFQktJVF9FWFBPUlQgUURhdGFTdHJlYW0mIG9wZXJhdG9yPj4oUURhdGFTdHJl
YW0mLCBRV2ViSGlzdG9yeSYpOwogICAgIGZyaWVuZCBRV0VCS0lUX0VYUE9SVCBRRGF0YVN0cmVh
bSYgb3BlcmF0b3I8PChRRGF0YVN0cmVhbSYsIGNvbnN0IFFXZWJIaXN0b3J5Jik7CiAKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJLaXQvcXQvQXBpL3F3ZWJpbnNwZWN0b3IuY3BwIGIvU291cmNlL1dl
YktpdC9xdC9BcGkvcXdlYmluc3BlY3Rvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDU1MDg5ZTFhMWZjZWU4Y2RlOTQzOWJkOTUyY2NiYzViMzMxNmVmOTAuLjAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYktpdC9xdC9BcGkv
cXdlYmluc3BlY3Rvci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoKLSAg
ICBDb3B5cmlnaHQgKEMpIDIwMDkgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRp
YXJ5KC1pZXMpCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy
ZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0
aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBi
eSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIgb2Yg
dGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAg
ICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJl
IHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUg
aW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGlicmFyeSBHZW5lcmFsIFB1
YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVj
ZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0g
ICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElm
IG5vdCwgd3JpdGUgdG8KLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1
MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAotICAgIEJvc3RvbiwgTUEgMDIxMTAtMTMw
MSwgVVNBLgotKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgInF3ZWJpbnNwZWN0
b3IuaCIKLQotI2luY2x1ZGUgIkVsZW1lbnQuaCIKLSNpbmNsdWRlICJJbnNwZWN0b3JDb250cm9s
bGVyLmgiCi0jaW5jbHVkZSAicXdlYmVsZW1lbnQuaCIKLSNpbmNsdWRlICJxd2ViaW5zcGVjdG9y
X3AuaCIKLSNpbmNsdWRlICJxd2VicGFnZV9wLmgiCi0KLSNpbmNsdWRlIDxRUmVzaXplRXZlbnQ+
Ci0KLS8qIQotICAgIFxjbGFzcyBRV2ViSW5zcGVjdG9yCi0gICAgXHNpbmNlIDQuNgotICAgIFxp
bm1vZHVsZSBRdFdlYktpdAotICAgIFxicmllZiBUaGUgUVdlYkluc3BlY3RvciBjbGFzcyBhbGxv
d3MgdGhlIHBsYWNlbWVudCBhbmQgY29udHJvbCBvZiBhCi0gICAgUVdlYlBhZ2UncyBpbnNwZWN0
b3IuCi0gICAgVGhlIGluc3BlY3RvciBjYW4gZGlzcGxheSBhIHBhZ2UncyBoaWVyYXJjaHksIGl0
cyBsb2FkaW5nIHN0YXRpc3RpY3MgYW5kCi0gICAgdGhlIGN1cnJlbnQgc3RhdGUgb2YgaXRzIGlu
ZGl2aWR1YWwgZWxlbWVudHMuIEl0IGlzIG1vc3RseSB1c2VkIGJ5IHdlYgotICAgIGRldmVsb3Bl
cnMuCi0KLSAgICBUaGUgUVdlYlBhZ2UgdG8gYmUgaW5zcGVjdGVkIG11c3QgYmUgc3BlY2lmaWVk
IHVzaW5nIHRoZSBzZXRQYWdlKCkgbWV0aG9kLgotCi0gICAgQSB0eXBpY2FsIHVzZSBvZiBRV2Vi
SW5zcGVjdG9yIGZvbGxvd3M6Ci0KLSAgICBcc25pcHBldCB3ZWJraXRzbmlwcGV0cy9xdHdlYmtp
dF9xd2ViaW5zcGVjdG9yX3NuaXBwZXQuY3BwIDAKLQotICAgIEEgUVdlYkluc3BlY3RvciBjYW4g
YmUgbWFkZSB2aXNpYmxlIGVpdGhlciBwcm9ncmFtbWF0aWNhbGx5IHVzaW5nCi0gICAgc2V0Vmlz
aWJsZSgpLCBvciBieSB0aGUgdXNlciB0aHJvdWdoIHRoZSBhdHRhY2hlZCBRV2ViUGFnZSdzIGNv
bnRleHQKLSAgICBtZW51LgotCi0gICAgXG5vdGUgQSBRV2ViSW5zcGVjdG9yIHdpbGwgZGlzcGxh
eSBhIGJsYW5rIHdpZGdldCBpZiBlaXRoZXI6Ci0gICAgXGxpc3QKLSAgICAgICAgXGxpIHBhZ2Uo
KSBpcyBudWxsCi0gICAgICAgIFxsaSBRV2ViU2V0dGluZ3M6OkRldmVsb3BlckV4dHJhc0VuYWJs
ZWQgaXMgZmFsc2UKLSAgICBcZW5kbGlzdAotCi0gICAgXHNlY3Rpb24xIFJlc291cmNlcwotCi0g
ICAgVGhpcyBjbGFzcyBhY3RzIG1vc3RseSBhcyBhIGNvbnRhaW5lciBhbmQgYSBjb250cm9sbGVy
IGZvciB0aGUgaW5zcGVjdG9yLgotICAgIE1vc3Qgb2YgdGhlIHJlc291cmNlcyBuZWVkZWQgYnkg
dGhlIGluc3BlY3RvciBhcmUgb3duZWQgYnkgdGhlIGFzc29jaWF0ZWQKLSAgICBRV2ViUGFnZSBh
bmQgYXJlIGFsbG9jYXRlZCB0aGUgZmlyc3QgdGltZSB0aGF0OgotICAgIFxsaXN0Ci0gICAgICAg
IFxsaSBhbiBlbGVtZW50IGlzIGluc3BlY3RlZAotICAgICAgICBcbGkgdGhlIFFXZWJJbnNwZWN0
b3IgaXMgc2hvd24uCi0gICAgXGVuZGxpc3QKLQotICAgIFxzZWN0aW9uMSBJbnNwZWN0b3IgY29u
ZmlndXJhdGlvbiBwZXJzaXN0ZW5jZQotCi0gICAgVGhlIGluc3BlY3RvciBhbGxvd3MgdGhlIHVz
ZXIgdG8gY29uZmlndXJlIHNvbWUgb3B0aW9ucyB0aHJvdWdoIGl0cwotICAgIHVzZXIgaW50ZXJm
YWNlIChlLmcuIHRoZSByZXNvdXJjZSB0cmFja2luZyAiQWx3YXlzIGVuYWJsZSIgb3B0aW9uKS4K
LSAgICBUaGVzZSBzZXR0aW5ncyB3aWxsIGJlIHBlcnNpc3RlZCBhdXRvbWF0aWNhbGx5IGJ5IFF0
V2ViS2l0IG9ubHkgaWYKLSAgICB5b3VyIGFwcGxpY2F0aW9uIHByZXZpb3VzbHkgY2FsbGVkIFFD
b3JlQXBwbGljYXRpb246OnNldE9yZ2FuaXphdGlvbk5hbWUoKQotICAgIGFuZCBRQ29yZUFwcGxp
Y2F0aW9uOjpzZXRBcHBsaWNhdGlvbk5hbWUoKS4KLSAgICBTZWUgUVNldHRpbmdzJ3MgZGVmYXVs
dCBjb25zdHJ1Y3RvciBkb2N1bWVudGF0aW9uIGZvciBhbiBleHBsYW5hdGlvbgotICAgIG9mIHdo
eSB0aGlzIGlzIG5lY2Vzc2FyeS4KLSovCi0KLS8qIQotICAgIENvbnN0cnVjdHMgYW4gdW5ib3Vu
ZCBRV2ViSW5zcGVjdG9yIHdpdGggXGEgcGFyZW50IGFzIGl0cyBwYXJlbnQuCi0qLwotUVdlYklu
c3BlY3Rvcjo6UVdlYkluc3BlY3RvcihRV2lkZ2V0KiBwYXJlbnQpCi0gICAgOiBRV2lkZ2V0KHBh
cmVudCkKLSAgICAsIGQobmV3IFFXZWJJbnNwZWN0b3JQcml2YXRlKHRoaXMpKQotewotfQotCi0v
KiEKLSAgICBEZXN0cm95cyB0aGUgaW5zcGVjdG9yLgotKi8KLVFXZWJJbnNwZWN0b3I6On5RV2Vi
SW5zcGVjdG9yKCkKLXsKLSAgICAvLyBSZW1vdmUgYXNzb2NpYXRpb24gcHJpbmNpcGFsbHkgdG8g
cHJldmVudCBkZWxldGluZyBhIGNoaWxkIGZyb250ZW5kCi0gICAgc2V0UGFnZSgwKTsKLSAgICBk
ZWxldGUgZDsKLSAgICBkID0gMDsKLX0KLQotLyohCi0gICAgQmluZCB0aGlzIGluc3BlY3RvciB0
byB0aGUgUVdlYlBhZ2UgdG8gYmUgaW5zcGVjdGVkLgotCi0gICAgXGIge05vdGVzOn0KLSAgICBc
bGlzdAotICAgICAgICBcbGkgVGhlcmUgY2FuIG9ubHkgYmUgb25lIFFXZWJJbnNwZWN0b3IgYXNz
b2NpYXRlZCB3aXRoIGEgUVdlYlBhZ2UKLSAgICAgICAgICAgYW5kIHZpY2UgdmVyc2EuCi0gICAg
ICAgIFxsaSBDYWxsaW5nIHRoaXMgbWV0aG9kIHdpdGggYSBudWxsIFxhIHBhZ2Ugd2lsbCBicmVh
ayB0aGUgY3VycmVudCBhc3NvY2lhdGlvbiwgaWYgYW55LgotICAgICAgICBcbGkgSWYgXGEgcGFn
ZSBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgdG8gYW5vdGhlciBRV2ViSW5zcGVjdG9yLCB0aGUgYXNz
b2NpYXRpb24KLSAgICAgICAgICAgd2lsbCBiZSByZXBsYWNlZCBhbmQgdGhlIHByZXZpb3VzIFFX
ZWJJbnNwZWN0b3Igd2lsbCBiZWNvbWUgdW5ib3VuZAotICAgIFxlbmRsaXN0Ci0KLSAgICBcc2Eg
cGFnZSgpCi0qLwotdm9pZCBRV2ViSW5zcGVjdG9yOjpzZXRQYWdlKFFXZWJQYWdlKiBwYWdlKQot
ewotICAgIGlmIChkLT5wYWdlKSB7Ci0gICAgICAgIC8vIEJyZWFrIGN1cnJlbnRQYWdlLS0+dGhp
cwotICAgICAgICBkLT5wYWdlLT5kLT5zZXRJbnNwZWN0b3IoMCk7Ci0gICAgfQotICAgIGlmIChw
YWdlICYmIHBhZ2UtPmQtPmluc3BlY3RvciAmJiBwYWdlLT5kLT5pbnNwZWN0b3IgIT0gdGhpcykg
ewotICAgICAgICAvLyBCcmVhayBuZXdQYWdlPC0+bmV3UGFnZUN1cnJlbnRJbnNwZWN0b3IKLSAg
ICAgICAgcGFnZS0+ZC0+aW5zcGVjdG9yLT5zZXRQYWdlKDApOwotICAgIH0KLQotICAgIGQtPnBh
Z2UgPSBwYWdlOwotCi0gICAgaWYgKHBhZ2UpIHsKLSAgICAgICAgLy8gU2V0dXAgdGhlIHJlY2lw
cm9jYWwgYXNzb2NpYXRpb24KLSAgICAgICAgcGFnZS0+ZC0+c2V0SW5zcGVjdG9yKHRoaXMpOwot
ICAgIH0KLX0KLQotLyohCi0gICAgUmV0dXJucyB0aGUgaW5zcGVjdGVkIFFXZWJQYWdlLgotICAg
IElmIG5vIHdlYiBwYWdlIGlzIGN1cnJlbnRseSBhc3NvY2lhdGVkLCBhIG51bGwgcG9pbnRlciBp
cyByZXR1cm5lZC4KLSovCi1RV2ViUGFnZSogUVdlYkluc3BlY3Rvcjo6cGFnZSgpIGNvbnN0Ci17
Ci0gICAgcmV0dXJuIGQtPnBhZ2U7Ci19Ci0KLS8qISBccmVpbXAgKi8KLVFTaXplIFFXZWJJbnNw
ZWN0b3I6OnNpemVIaW50KCkgY29uc3QKLXsKLSAgICByZXR1cm4gUVNpemUoNDUwLCAzMDApOwot
fQotCi0vKiEgXHJlaW1wICovCi1ib29sIFFXZWJJbnNwZWN0b3I6OmV2ZW50KFFFdmVudCogZXYp
Ci17Ci0gICAgcmV0dXJuIFFXaWRnZXQ6OmV2ZW50KGV2KTsKLX0KLQotLyohIFxyZWltcCAqLwot
dm9pZCBRV2ViSW5zcGVjdG9yOjpyZXNpemVFdmVudChRUmVzaXplRXZlbnQqIGV2ZW50KQotewot
ICAgIGQtPmFkanVzdEZyb250ZW5kU2l6ZShldmVudC0+c2l6ZSgpKTsKLX0KLQotLyohIFxyZWlt
cCAqLwotdm9pZCBRV2ViSW5zcGVjdG9yOjpzaG93RXZlbnQoUVNob3dFdmVudCogZXZlbnQpCi17
Ci0jaWYgRU5BQkxFKElOU1BFQ1RPUikKLSAgICAvLyBBbGxvd3MgUVdlYkluc3BlY3Rvcjo6c2hv
dygpIHRvIGluaXQgdGhlIGluc3BlY3Rvci4KLSAgICBpZiAoZC0+cGFnZSkKLSAgICAgICAgZC0+
cGFnZS0+ZC0+aW5zcGVjdG9yQ29udHJvbGxlcigpLT5zaG93KCk7Ci0jZW5kaWYKLX0KLQotLyoh
IFxyZWltcCAqLwotdm9pZCBRV2ViSW5zcGVjdG9yOjpoaWRlRXZlbnQoUUhpZGVFdmVudCogZXZl
bnQpCi17Ci0jaWYgRU5BQkxFKElOU1BFQ1RPUikKLSAgICBpZiAoZC0+cGFnZSkKLSAgICAgICAg
ZC0+cGFnZS0+ZC0+aW5zcGVjdG9yQ29udHJvbGxlcigpLT5jbG9zZSgpOwotI2VuZGlmCi19Ci0K
LS8qISBccmVpbXAgKi8KLXZvaWQgUVdlYkluc3BlY3Rvcjo6Y2xvc2VFdmVudChRQ2xvc2VFdmVu
dCogZXZlbnQpCi17Ci0jaWYgRU5BQkxFKElOU1BFQ1RPUikKLSAgICBpZiAoZC0+cGFnZSkKLSAg
ICAgICAgZC0+cGFnZS0+ZC0+aW5zcGVjdG9yQ29udHJvbGxlcigpLT5jbG9zZSgpOwotI2VuZGlm
Ci19Ci0KLS8qISBcaW50ZXJuYWwgKi8KLXZvaWQgUVdlYkluc3BlY3RvclByaXZhdGU6OnNldEZy
b250ZW5kKFFPYmplY3QqIG5ld0Zyb250ZW5kKQotewotICAgIGlmIChmcm9udGVuZCkKLSAgICAg
ICAgZnJvbnRlbmQtPnNldFBhcmVudCgwKTsKLQotICAgIGZyb250ZW5kID0gcW9iamVjdF9jYXN0
PFFXaWRnZXQqPihuZXdGcm9udGVuZCk7Ci0KLSAgICBpZiAoZnJvbnRlbmQpIHsKLSAgICAgICAg
ZnJvbnRlbmQtPnNldFBhcmVudChxKTsKLSAgICAgICAgZnJvbnRlbmQtPnNob3coKTsKLSAgICAg
ICAgYWRqdXN0RnJvbnRlbmRTaXplKHEtPnNpemUoKSk7Ci0gICAgfQotfQotCi12b2lkIFFXZWJJ
bnNwZWN0b3JQcml2YXRlOjphZGp1c3RGcm9udGVuZFNpemUoY29uc3QgUVNpemUmIHNpemUpCi17
Ci0gICAgaWYgKGZyb250ZW5kKQotICAgICAgICBmcm9udGVuZC0+cmVzaXplKHNpemUpOwotfQot
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0L0FwaS9xd2ViaW5zcGVjdG9yLmggYi9Tb3Vy
Y2UvV2ViS2l0L3F0L0FwaS9xd2ViaW5zcGVjdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IGYxOTJlOTIxYjYzOWM4YzdmY2I1ZmJkMTZiOGViNTYzYWExNzM0ZWQuLjAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYktpdC9xdC9B
cGkvcXdlYmluc3BlY3Rvci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAg
ICBDb3B5cmlnaHQgKEMpIDIwMDkgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRp
YXJ5KC1pZXMpCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy
ZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0
aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBi
eSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIgb2Yg
dGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAg
ICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJl
IHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUg
aW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGlicmFyeSBHZW5lcmFsIFB1
YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVj
ZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0g
ICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElm
IG5vdCwgd3JpdGUgdG8KLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1
MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAotICAgIEJvc3RvbiwgTUEgMDIxMTAtMTMw
MSwgVVNBLgotKi8KLQotI2lmbmRlZiBRV0VCSU5TUEVDVE9SX0gKLSNkZWZpbmUgUVdFQklOU1BF
Q1RPUl9ICi0KLSNpbmNsdWRlICJxd2Via2l0Z2xvYmFsLmgiCi0jaW5jbHVkZSAicXdlYnBhZ2Uu
aCIKLQotI2luY2x1ZGUgInF3ZWJ2aWV3LmgiCi0KLWNsYXNzIFFXZWJJbnNwZWN0b3JQcml2YXRl
OwotCi1jbGFzcyBRV0VCS0lUX0VYUE9SVCBRV2ViSW5zcGVjdG9yIDogcHVibGljIFFXaWRnZXQg
ewotICAgIFFfT0JKRUNUCi1wdWJsaWM6Ci0gICAgUVdlYkluc3BlY3RvcihRV2lkZ2V0KiBwYXJl
bnQgPSAwKTsKLSAgICB+UVdlYkluc3BlY3RvcigpOwotCi0gICAgdm9pZCBzZXRQYWdlKFFXZWJQ
YWdlKiBwYWdlKTsKLSAgICBRV2ViUGFnZSogcGFnZSgpIGNvbnN0OwotCi0gICAgUVNpemUgc2l6
ZUhpbnQoKSBjb25zdDsKLSAgICBib29sIGV2ZW50KFFFdmVudCopOwotCi1wcm90ZWN0ZWQ6Ci0g
ICAgdm9pZCByZXNpemVFdmVudChRUmVzaXplRXZlbnQqIGV2ZW50KTsKLSAgICB2b2lkIHNob3dF
dmVudChRU2hvd0V2ZW50KiBldmVudCk7Ci0gICAgdm9pZCBoaWRlRXZlbnQoUUhpZGVFdmVudCog
ZXZlbnQpOwotICAgIHZvaWQgY2xvc2VFdmVudChRQ2xvc2VFdmVudCogZXZlbnQpOwotCi1wcml2
YXRlOgotICAgIFFXZWJJbnNwZWN0b3JQcml2YXRlKiBkOwotCi0gICAgZnJpZW5kIGNsYXNzIFFX
ZWJJbnNwZWN0b3JQcml2YXRlOwotICAgIGZyaWVuZCBjbGFzcyBRV2ViUGFnZTsKLSAgICBmcmll
bmQgY2xhc3MgUVdlYlBhZ2VQcml2YXRlOwotICAgIGZyaWVuZCBjbGFzcyBXZWJDb3JlOjpJbnNw
ZWN0b3JDbGllbnRRdDsKLSAgICBmcmllbmQgY2xhc3MgV2ViQ29yZTo6SW5zcGVjdG9yRnJvbnRl
bmRDbGllbnRRdDsKLX07Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvcXQvQXBp
L3F3ZWJpbnNwZWN0b3JfcC5oIGIvU291cmNlL1dlYktpdC9xdC9BcGkvcXdlYmluc3BlY3Rvcl9w
LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwOGRlODRlZGMxZDlhYjdhMDcxMThk
ZGRiNTkyZjRhZTFiZjI2ZDYuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAKLS0tIGEvU291cmNlL1dlYktpdC9xdC9BcGkvcXdlYmluc3BlY3Rvcl9wLmgKKysrIC9kZXYv
bnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICAgIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSBO
b2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykKLQotICAgIFRoaXMg
bGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IK
LSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFs
IFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZv
dW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlv
dXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0
cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRI
T1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0g
ICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAg
U2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUg
ZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdO
VSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgbGli
cmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwotICAgIHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlm
dGggRmxvb3IsCi0gICAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCi0qLwotCi0jaWZuZGVm
IFFXRUJJTlNQRUNUT1JfUF9ICi0jZGVmaW5lIFFXRUJJTlNQRUNUT1JfUF9ICi0KLVFUX0JFR0lO
X05BTUVTUEFDRQotY2xhc3MgUVNpemU7Ci1jbGFzcyBRV2lkZ2V0OwotUVRfRU5EX05BTUVTUEFD
RQotY2xhc3MgUVdlYkluc3BlY3RvcjsKLWNsYXNzIFFXZWJQYWdlOwotCi1jbGFzcyBRV2ViSW5z
cGVjdG9yUHJpdmF0ZSB7Ci1wdWJsaWM6Ci0gICAgUVdlYkluc3BlY3RvclByaXZhdGUoUVdlYklu
c3BlY3RvciogcXEpCi0gICAgOiBxKHFxKQotICAgICwgcGFnZSgwKQotICAgICwgZnJvbnRlbmQo
MCkKLSAgICB7fQotCi0gICAgdm9pZCBzZXRGcm9udGVuZChRT2JqZWN0KiBuZXdGcm9udGVuZCk7
Ci0gICAgdm9pZCBhZGp1c3RGcm9udGVuZFNpemUoY29uc3QgUVNpemUmIHNpemUpOwotCi0gICAg
UVdlYkluc3BlY3RvciogcTsKLSAgICBRV2ViUGFnZSogcGFnZTsKLSAgICBRV2lkZ2V0KiBmcm9u
dGVuZDsKLX07Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9BcGkvcXdl
YmtpdGdsb2JhbC5jcHAgYi9Tb3VyY2UvV2ViS2l0L3F0L0FwaS9xd2Via2l0Z2xvYmFsLmNwcApu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwLi4wYWU5NTViOGY0NjIzM2I3ZGVmZDVjZjQ2ZGE3MDZkYzhlYTUxMzQ0Ci0tLSAv
ZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9xdC9BcGkvcXdlYmtpdGdsb2JhbC5jcHAKQEAg
LTAsMCArMSwxMTUgQEAKKy8qCisgICAgQ29weXJpZ2h0IChDKSAyMDA5IFJvYmVydCBIb2dhbiA8
cm9iZXJ0QHJvYmVydGhvZ2FuLm5ldD4KKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3
YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIg
dGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2Ug
YXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAg
IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg
dmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0
aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0
aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9y
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBz
aG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENP
UFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k
YXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgICAgQm9zdG9u
LCBNQSAwMjExMC0xMzAxLCBVU0EuCisqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVk
ZSAicXdlYmtpdGdsb2JhbC5oIgorCisjaW5jbHVkZSA8V2ViS2l0VmVyc2lvbi5oPgorCisvKiEK
KyAgICBccmVsYXRlcyBRV2ViUGFnZQorICAgIFxzaW5jZSA0LjYKKyAgICBSZXR1cm5zIHRoZSB2
ZXJzaW9uIG51bWJlciBvZiBXZWJLaXQgYXQgcnVuLXRpbWUgYXMgYSBzdHJpbmcgKGZvcgorICAg
IGV4YW1wbGUsICI1MzEuMyIpLgorCisgICAgVGhpcyB2ZXJzaW9uIGlzIGNvbW1vbmx5IHVzZWQg
aW4gV2ViS2l0IGJhc2VkIGJyb3dzZXJzIGFzIHBhcnQKKyAgICBvZiB0aGUgdXNlciBhZ2VudCBz
dHJpbmcuIFdlYiBzZXJ2ZXJzIGFuZCBKYXZhU2NyaXB0IG1pZ2h0IHVzZQorICAgIGl0IHRvIGlk
ZW50aWZ5IHRoZSBwcmVzZW5jZSBvZiBjZXJ0YWluIFdlYktpdCBlbmdpbmUgZmVhdHVyZXMKKyAg
ICBhbmQgYmVoYXZpb3VyLgorCisgICAgVGhlIGV2b2x1dGlvbiBvZiB0aGlzIHZlcnNpb24gaXMg
Ym91bmQgdG8gdGhlIHJlbGVhc2VzIG9mIEFwcGxlJ3MKKyAgICBTYWZhcmkgYnJvd3Nlci4gRm9y
IGEgdmVyc2lvbiBzcGVjaWZpYyB0byB0aGUgUXRXZWJLaXQgbGlicmFyeSwKKyAgICBzZWUgUVRX
RUJLSVRfVkVSU0lPTgorCisgICAgXHNhIFFXZWJQYWdlOjp1c2VyQWdlbnRGb3JVcmwoKQorKi8K
K1FTdHJpbmcgcVdlYktpdFZlcnNpb24oKQoreworICAgIHJldHVybiBRU3RyaW5nOjpmcm9tTGF0
aW4xKCIlMS4lMiIpLmFyZyhXRUJLSVRfTUFKT1JfVkVSU0lPTikuYXJnKFdFQktJVF9NSU5PUl9W
RVJTSU9OKTsKK30KKworLyohCisgICAgXHJlbGF0ZXMgUVdlYlBhZ2UKKyAgICBcc2luY2UgNC42
CisgICAgUmV0dXJucyB0aGUgJ21ham9yJyB2ZXJzaW9uIG51bWJlciBvZiBXZWJLaXQgYXQgcnVu
LXRpbWUgYXMgYW4gaW50ZWdlcgorICAgIChmb3IgZXhhbXBsZSwgNTMxKS4gVGhpcyBpcyB0aGUg
dmVyc2lvbiBvZiBXZWJLaXQgdGhlIGFwcGxpY2F0aW9uCisgICAgd2FzIGNvbXBpbGVkIGFnYWlu
c3QuCisKKyAgICBcc2EgcVdlYktpdFZlcnNpb24oKQorKi8KK2ludCBxV2ViS2l0TWFqb3JWZXJz
aW9uKCkKK3sKKyAgICByZXR1cm4gV0VCS0lUX01BSk9SX1ZFUlNJT047Cit9CisKKy8qIQorICAg
IFxyZWxhdGVzIFFXZWJQYWdlCisgICAgXHNpbmNlIDQuNgorICAgIFJldHVybnMgdGhlICdtaW5v
cicgdmVyc2lvbiBudW1iZXIgb2YgV2ViS2l0IGF0IHJ1bi10aW1lIGFzIGFuIGludGVnZXIKKyAg
ICAoZm9yIGV4YW1wbGUsIDMpLiBUaGlzIGlzIHRoZSB2ZXJzaW9uIG9mIFdlYktpdCB0aGUgYXBw
bGljYXRpb24KKyAgICB3YXMgY29tcGlsZWQgYWdhaW5zdC4KKworICAgIFxzYSBxV2ViS2l0VmVy
c2lvbigpCisqLworaW50IHFXZWJLaXRNaW5vclZlcnNpb24oKQoreworICAgIHJldHVybiBXRUJL
SVRfTUlOT1JfVkVSU0lPTjsKK30KKworLyohCisgICAgXG1hY3JvIFFUV0VCS0lUX1ZFUlNJT04K
KyAgICBccmVsYXRlcyBRV2ViUGFnZQorCisgICAgVGhpcyBtYWNybyBleHBhbmRzIGEgbnVtZXJp
YyB2YWx1ZSBvZiB0aGUgZm9ybSAweE1NTk5QUCAoTU0gPQorICAgIG1ham9yLCBOTiA9IG1pbm9y
LCBQUCA9IHBhdGNoKSB0aGF0IHNwZWNpZmllcyBRdFdlYktpdCdzIHZlcnNpb24KKyAgICBudW1i
ZXIuIEZvciBleGFtcGxlLCBpZiB5b3UgY29tcGlsZSB5b3VyIGFwcGxpY2F0aW9uIGFnYWluc3Qg
UXRXZWJLaXQKKyAgICAyLjEuMiwgdGhlIFFUV0VCS0lUX1ZFUlNJT04gbWFjcm8gd2lsbCBleHBh
bmQgdG8gMHgwMjAxMDIuCisKKyAgICBZb3UgY2FuIHVzZSBRVFdFQktJVF9WRVJTSU9OIHRvIHVz
ZSB0aGUgbGF0ZXN0IFF0V2ViS2l0IEFQSSB3aGVyZQorICAgIGF2YWlsYWJsZS4KKworICAgIFxz
YSBRVF9WRVJTSU9OCisqLworCisvKiEKKyAgICBcbWFjcm8gUVRXRUJLSVRfVkVSU0lPTl9TVFIK
KyAgICBccmVsYXRlcyBRV2ViUGFnZQorCisgICAgVGhpcyBtYWNybyBleHBhbmRzIHRvIGEgc3Ry
aW5nIHRoYXQgc3BlY2lmaWVzIFF0V2ViS2l0J3MgdmVyc2lvbiBudW1iZXIKKyAgICAoZm9yIGV4
YW1wbGUsICIyLjEuMiIpLiBUaGlzIGlzIHRoZSB2ZXJzaW9uIGFnYWluc3Qgd2hpY2ggdGhlCisg
ICAgYXBwbGljYXRpb24gaXMgY29tcGlsZWQuCisKKyAgICBcc2EgUVRXRUJLSVRfVkVSU0lPTgor
Ki8KKworLyohCisgICAgXG1hY3JvIFFUV0VCS0lUX1ZFUlNJT05fQ0hFQ0sKKyAgICBccmVsYXRl
cyBRV2ViUGFnZQorCisgICAgVHVybnMgdGhlIG1ham9yLCBtaW5vciBhbmQgcGF0Y2ggbnVtYmVy
cyBvZiBhIHZlcnNpb24gaW50byBhbgorICAgIGludGVnZXIsIDB4TU1OTlBQIChNTSA9IG1ham9y
LCBOTiA9IG1pbm9yLCBQUCA9IHBhdGNoKS4gVGhpcyBjYW4KKyAgICBiZSBjb21wYXJlZCB3aXRo
IGFub3RoZXIgc2ltaWxhcmx5IHByb2Nlc3NlZCB2ZXJzaW9uIGlkLCBmb3IgZXhhbXBsZQorICAg
IGluIGEgcHJlcHJvY2Vzc29yIHN0YXRlbWVudDoKKworICAgIFxjb2RlCisgICAgI2lmIFFUV0VC
S0lUX1ZFUlNJT04gPj0gUVRXRUJLSVRfVkVSU0lPTl9DSEVDSygyLCAxLCAwKQorICAgIC8vIGNv
ZGUgdG8gdXNlIEFQSSBuZXcgaW4gUXRXZWJLaXQgMi4xLjAKKyAgICAjZW5kaWYKKyAgICBcZW5k
Y29kZQorKi8KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvcXQvQXBpL3F3ZWJraXRnbG9iYWwu
aCBiL1NvdXJjZS9XZWJLaXQvcXQvQXBpL3F3ZWJraXRnbG9iYWwuaAppbmRleCA5NDdiYTA2NTQz
ZGY3OTNkOGU1OTUwZmQ3MDU4MDNiNjUyY2ZjNThhLi4xZDYxMTgyYzgxNDA4NWM5NmJkNjMxYTVk
MWQ2NGEyNjFhNTQwZmFjIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L3F0L0FwaS9xd2Via2l0
Z2xvYmFsLmgKKysrIGIvU291cmNlL1dlYktpdC9xdC9BcGkvcXdlYmtpdGdsb2JhbC5oCkBAIC0x
LDUgKzEsNiBAQAogLyoKICAgICBDb3B5cmlnaHQgKEMpIDIwMDggTm9raWEgQ29ycG9yYXRpb24g
YW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCisgICAgQ29weXJpZ2h0IChDKSAyMDA5IFJvYmVy
dCBIb2dhbiA8cm9iZXJ0QHJvYmVydGhvZ2FuLm5ldD4KIAogICAgIFRoaXMgbGlicmFyeSBpcyBm
cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAgICBtb2RpZnkg
aXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwpAQCAt
MjEsMTEgKzIyLDggQEAKICNkZWZpbmUgUVdFQktJVEdMT0JBTF9ICiAKICNpbmNsdWRlIDxRdENv
cmUvcWdsb2JhbC5oPgorI2luY2x1ZGUgPFF0Q29yZS9xc3RyaW5nLmg+CiAKLSNkZWZpbmUgUVRX
RUJLSVRfVkVSU0lPTl9TVFIgIjIuMi4wIgotLy8gUVRXRUJLSVRfVkVSU0lPTiBpcyAobWFqb3Ig
PDwgMTYpICsgKG1pbm9yIDw8IDgpICsgcGF0Y2guIFNpbWlsYXIgdG8gUXQuCi0jZGVmaW5lIFFU
V0VCS0lUX1ZFUlNJT04gMHgwMjAyMDAKLS8vIFVzZTogI2lmIChRVFdFQktJVF9WRVJTSU9OID49
IFFUV0VCS0lUX1ZFUlNJT05fQ0hFQ0soMiwgMCwgMCkpLiBTaW1pbGFyIHRvIFF0LgogI2RlZmlu
ZSBRVFdFQktJVF9WRVJTSU9OX0NIRUNLKG1ham9yLCBtaW5vciwgcGF0Y2gpICgobWFqb3I8PDE2
KXwobWlub3I8PDgpfChwYXRjaCkpCiAKICNpZm5kZWYgUVRfU1RBVElDCkBAIC0zOCw0ICszNiw4
IEBACiAjICBkZWZpbmUgUVdFQktJVF9FWFBPUlQKICNlbmRpZgogCitRV0VCS0lUX0VYUE9SVCBR
U3RyaW5nIHFXZWJLaXRWZXJzaW9uKCk7CitRV0VCS0lUX0VYUE9SVCBpbnQgcVdlYktpdE1ham9y
VmVyc2lvbigpOworUVdFQktJVF9FWFBPUlQgaW50IHFXZWJLaXRNaW5vclZlcnNpb24oKTsKKwog
I2VuZGlmIC8vIFFXRUJLSVRHTE9CQUxfSApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9B
cGkvcXdlYmtpdHZlcnNpb24uY3BwIGIvU291cmNlL1dlYktpdC9xdC9BcGkvcXdlYmtpdHZlcnNp
b24uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTQzZjk5ZTA1YjI5ZmJkNTc3
NjQ3ODRmNjFlNWM2OTQzMTM0ZGNiLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvcXQvQXBpL3F3ZWJraXR2ZXJzaW9uLmNwcAorKysg
L2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKgotICAgIENvcHlyaWdodCAoQykgMjAwOSBS
b2JlcnQgSG9nYW4gPHJvYmVydEByb2JlcnRob2dhbi5uZXQ+Ci0KLSAgICBUaGlzIGxpYnJhcnkg
aXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9k
aWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMK
LSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
OyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlv
bikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQg
aW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkg
V0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNI
QU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUg
R05VCi0gICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMu
Ci0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFy
eSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNl
ZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KLSAgICB0aGUgRnJlZSBT
b2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29y
LAotICAgIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgotKi8KLQotI2luY2x1ZGUgImNvbmZp
Zy5oIgotI2luY2x1ZGUgPHF3ZWJraXR2ZXJzaW9uLmg+Ci0jaW5jbHVkZSA8V2ViS2l0VmVyc2lv
bi5oPgotCi0vKiEKLSAgICBccmVsYXRlcyBRV2ViUGFnZQotICAgIFxzaW5jZSA0LjYKLSAgICBS
ZXR1cm5zIHRoZSB2ZXJzaW9uIG51bWJlciBvZiBXZWJLaXQgYXQgcnVuLXRpbWUgYXMgYSBzdHJp
bmcgKGZvcgotICAgIGV4YW1wbGUsICI1MzEuMyIpLgotCi0gICAgVGhpcyB2ZXJzaW9uIGlzIGNv
bW1vbmx5IHVzZWQgaW4gV2ViS2l0IGJhc2VkIGJyb3dzZXJzIGFzIHBhcnQKLSAgICBvZiB0aGUg
dXNlciBhZ2VudCBzdHJpbmcuIFdlYiBzZXJ2ZXJzIGFuZCBKYXZhU2NyaXB0IG1pZ2h0IHVzZQot
ICAgIGl0IHRvIGlkZW50aWZ5IHRoZSBwcmVzZW5jZSBvZiBjZXJ0YWluIFdlYktpdCBlbmdpbmUg
ZmVhdHVyZXMKLSAgICBhbmQgYmVoYXZpb3VyLgotCi0gICAgVGhlIGV2b2x1dGlvbiBvZiB0aGlz
IHZlcnNpb24gaXMgYm91bmQgdG8gdGhlIHJlbGVhc2VzIG9mIEFwcGxlJ3MKLSAgICBTYWZhcmkg
YnJvd3Nlci4gRm9yIGEgdmVyc2lvbiBzcGVjaWZpYyB0byB0aGUgUXRXZWJLaXQgbGlicmFyeSwK
LSAgICBzZWUgUVRXRUJLSVRfVkVSU0lPTgotCi0gICAgXHNhIFFXZWJQYWdlOjp1c2VyQWdlbnRG
b3JVcmwoKQotKi8KLVFTdHJpbmcgcVdlYktpdFZlcnNpb24oKQotewotICAgIHJldHVybiBRU3Ry
aW5nOjpmcm9tTGF0aW4xKCIlMS4lMiIpLmFyZyhXRUJLSVRfTUFKT1JfVkVSU0lPTikuYXJnKFdF
QktJVF9NSU5PUl9WRVJTSU9OKTsKLX0KLQotLyohCi0gICAgXHJlbGF0ZXMgUVdlYlBhZ2UKLSAg
ICBcc2luY2UgNC42Ci0gICAgUmV0dXJucyB0aGUgJ21ham9yJyB2ZXJzaW9uIG51bWJlciBvZiBX
ZWJLaXQgYXQgcnVuLXRpbWUgYXMgYW4gaW50ZWdlcgotICAgIChmb3IgZXhhbXBsZSwgNTMxKS4g
VGhpcyBpcyB0aGUgdmVyc2lvbiBvZiBXZWJLaXQgdGhlIGFwcGxpY2F0aW9uCi0gICAgd2FzIGNv
bXBpbGVkIGFnYWluc3QuCi0KLSAgICBcc2EgcVdlYktpdFZlcnNpb24oKQotKi8KLWludCBxV2Vi
S2l0TWFqb3JWZXJzaW9uKCkKLXsKLSAgICByZXR1cm4gV0VCS0lUX01BSk9SX1ZFUlNJT047Ci19
Ci0KLS8qIQotICAgIFxyZWxhdGVzIFFXZWJQYWdlCi0gICAgXHNpbmNlIDQuNgotICAgIFJldHVy
bnMgdGhlICdtaW5vcicgdmVyc2lvbiBudW1iZXIgb2YgV2ViS2l0IGF0IHJ1bi10aW1lIGFzIGFu
IGludGVnZXIKLSAgICAoZm9yIGV4YW1wbGUsIDMpLiBUaGlzIGlzIHRoZSB2ZXJzaW9uIG9mIFdl
YktpdCB0aGUgYXBwbGljYXRpb24KLSAgICB3YXMgY29tcGlsZWQgYWdhaW5zdC4KLQotICAgIFxz
YSBxV2ViS2l0VmVyc2lvbigpCi0qLwotaW50IHFXZWJLaXRNaW5vclZlcnNpb24oKQotewotICAg
IHJldHVybiBXRUJLSVRfTUlOT1JfVkVSU0lPTjsKLX0KLQotLyohCi0gICAgXG1hY3JvIFFUV0VC
S0lUX1ZFUlNJT04KLSAgICBccmVsYXRlcyBRV2ViUGFnZQotCi0gICAgVGhpcyBtYWNybyBleHBh
bmRzIGEgbnVtZXJpYyB2YWx1ZSBvZiB0aGUgZm9ybSAweE1NTk5QUCAoTU0gPQotICAgIG1ham9y
LCBOTiA9IG1pbm9yLCBQUCA9IHBhdGNoKSB0aGF0IHNwZWNpZmllcyBRdFdlYktpdCdzIHZlcnNp
b24KLSAgICBudW1iZXIuIEZvciBleGFtcGxlLCBpZiB5b3UgY29tcGlsZSB5b3VyIGFwcGxpY2F0
aW9uIGFnYWluc3QgUXRXZWJLaXQKLSAgICAyLjEuMiwgdGhlIFFUV0VCS0lUX1ZFUlNJT04gbWFj
cm8gd2lsbCBleHBhbmQgdG8gMHgwMjAxMDIuCi0KLSAgICBZb3UgY2FuIHVzZSBRVFdFQktJVF9W
RVJTSU9OIHRvIHVzZSB0aGUgbGF0ZXN0IFF0V2ViS2l0IEFQSSB3aGVyZQotICAgIGF2YWlsYWJs
ZS4KLQotICAgIFxzYSBRVF9WRVJTSU9OCi0qLwotCi0vKiEKLSAgICBcbWFjcm8gUVRXRUJLSVRf
VkVSU0lPTl9TVFIKLSAgICBccmVsYXRlcyBRV2ViUGFnZQotCi0gICAgVGhpcyBtYWNybyBleHBh
bmRzIHRvIGEgc3RyaW5nIHRoYXQgc3BlY2lmaWVzIFF0V2ViS2l0J3MgdmVyc2lvbiBudW1iZXIK
LSAgICAoZm9yIGV4YW1wbGUsICIyLjEuMiIpLiBUaGlzIGlzIHRoZSB2ZXJzaW9uIGFnYWluc3Qg
d2hpY2ggdGhlCi0gICAgYXBwbGljYXRpb24gaXMgY29tcGlsZWQuCi0KLSAgICBcc2EgUVRXRUJL
SVRfVkVSU0lPTgotKi8KLQotLyohCi0gICAgXG1hY3JvIFFUV0VCS0lUX1ZFUlNJT05fQ0hFQ0sK
LSAgICBccmVsYXRlcyBRV2ViUGFnZQotCi0gICAgVHVybnMgdGhlIG1ham9yLCBtaW5vciBhbmQg
cGF0Y2ggbnVtYmVycyBvZiBhIHZlcnNpb24gaW50byBhbgotICAgIGludGVnZXIsIDB4TU1OTlBQ
IChNTSA9IG1ham9yLCBOTiA9IG1pbm9yLCBQUCA9IHBhdGNoKS4gVGhpcyBjYW4KLSAgICBiZSBj
b21wYXJlZCB3aXRoIGFub3RoZXIgc2ltaWxhcmx5IHByb2Nlc3NlZCB2ZXJzaW9uIGlkLCBmb3Ig
ZXhhbXBsZQotICAgIGluIGEgcHJlcHJvY2Vzc29yIHN0YXRlbWVudDoKLQotICAgIFxjb2RlCi0g
ICAgI2lmIFFUV0VCS0lUX1ZFUlNJT04gPj0gUVRXRUJLSVRfVkVSU0lPTl9DSEVDSygyLCAxLCAw
KQotICAgIC8vIGNvZGUgdG8gdXNlIEFQSSBuZXcgaW4gUXRXZWJLaXQgMi4xLjAKLSAgICAjZW5k
aWYKLSAgICBcZW5kY29kZQotKi8KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvcXQvQXBpL3F3
ZWJraXR2ZXJzaW9uLmggYi9Tb3VyY2UvV2ViS2l0L3F0L0FwaS9xd2Via2l0dmVyc2lvbi5oCmRl
bGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTc5ZGQxYTcwM2NjNmM5OTBlZjA2ZjAzMzBi
YmU0ZTYzMGQ0MTI0Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0t
LSBhL1NvdXJjZS9XZWJLaXQvcXQvQXBpL3F3ZWJraXR2ZXJzaW9uLmgKKysrIC9kZXYvbnVsbApA
QCAtMSwzMiArMCwwIEBACi0vKgotICAgIENvcHlyaWdodCAoQykgMjAwOSBSb2JlcnQgSG9nYW4g
PHJvYmVydEByb2JlcnRob2dhbi5uZXQ+Ci0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0
d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9kaWZ5IGl0IHVuZGVy
IHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAgICBMaWNlbnNl
IGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAg
ICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy
IHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUg
dGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdp
dGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNIQU5UQUJJTElUWSBv
ciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gICAgTGli
cmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ug
c2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1
YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBD
T1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KLSAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu
ZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAotICAgIEJvc3Rv
biwgTUEgMDIxMTAtMTMwMSwgVVNBLgotKi8KLQotI2luY2x1ZGUgPFF0Q29yZS9xc3RyaW5nLmg+
Ci0KLSNpZm5kZWYgcXdlYmtpdHZlcnNpb25faAotI2RlZmluZSBxd2Via2l0dmVyc2lvbl9oCi0K
LSNpbmNsdWRlIDxRdENvcmUvcXN0cmluZy5oPgotI2luY2x1ZGUgInF3ZWJraXRnbG9iYWwuaCIK
LQotUVdFQktJVF9FWFBPUlQgUVN0cmluZyBxV2ViS2l0VmVyc2lvbigpOwotUVdFQktJVF9FWFBP
UlQgaW50IHFXZWJLaXRNYWpvclZlcnNpb24oKTsKLVFXRUJLSVRfRVhQT1JUIGludCBxV2ViS2l0
TWlub3JWZXJzaW9uKCk7Ci0KLSNlbmRpZiAvLyBxd2Via2l0dmVyc2lvbl9oCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViS2l0L3F0L0FwaS9xd2VicGFnZS5jcHAgYi9Tb3VyY2UvV2ViS2l0L3F0L0Fw
aS9xd2VicGFnZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NjI0ZDE5MGM2
ZGRjMmE0ODBlODZjMTY1NTI5OWVjYTNiZDRhMzQuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYktpdC9xdC9BcGkvcXdlYnBhZ2UuY3BwCisr
KyAvZGV2L251bGwKQEAgLTEsNDQ3NiArMCwwIEBACi0vKgotICAgIENvcHlyaWdodCAoQykgMjAw
OCwgMjAwOSwgMjAxMiBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWll
cykKLSAgICBDb3B5cmlnaHQgKEMpIDIwMDcgU3RhaWtvcyBDb21wdXRpbmcgU2VydmljZXMgSW5j
LgotICAgIENvcHlyaWdodCAoQykgMjAwNyBBcHBsZSBJbmMuCi0KLSAgICBUaGlzIGxpYnJhcnkg
aXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gICAgbW9k
aWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMK
LSAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
OyBlaXRoZXIKLSAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlv
bikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQg
aW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAgICBidXQgV0lUSE9VVCBBTlkg
V0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgIE1FUkNI
QU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUg
R05VCi0gICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMu
Ci0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFy
eSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNl
ZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KLSAgICB0aGUgRnJlZSBT
b2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29y
LAotICAgIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgotKi8KLQotI2luY2x1ZGUgImNvbmZp
Zy5oIgotI2luY2x1ZGUgInF3ZWJwYWdlLmgiCi0KLSNpbmNsdWRlICJDU1NDb21wdXRlZFN0eWxl
RGVjbGFyYXRpb24uaCIKLSNpbmNsdWRlICJDU1NQYXJzZXIuaCIKLSNpbmNsdWRlICJBcHBsaWNh
dGlvbkNhY2hlU3RvcmFnZS5oIgotI2luY2x1ZGUgIkJhY2tGb3J3YXJkTGlzdEltcGwuaCIKLSNp
bmNsdWRlICJNZW1vcnlDYWNoZS5oIgotI2luY2x1ZGUgIkNocm9tZS5oIgotI2luY2x1ZGUgIkNo
cm9tZUNsaWVudFF0LmgiCi0jaW5jbHVkZSAiQ2xpZW50UmVjdC5oIgotI2luY2x1ZGUgIkNvbnRl
eHRNZW51LmgiCi0jaW5jbHVkZSAiQ29udGV4dE1lbnVDbGllbnRRdC5oIgotI2luY2x1ZGUgIkNv
bnRleHRNZW51Q29udHJvbGxlci5oIgotI2lmIFVTRShRVF9NVUxUSU1FRElBKQotI2luY2x1ZGUg
IkRlZmF1bHRGdWxsU2NyZWVuVmlkZW9IYW5kbGVyLmgiCi0jZW5kaWYKLSNpZiBFTkFCTEUoREVW
SUNFX09SSUVOVEFUSU9OKQotI2luY2x1ZGUgIkRldmljZU1vdGlvbkNsaWVudFF0LmgiCi0jaW5j
bHVkZSAiRGV2aWNlT3JpZW50YXRpb25DbGllbnRNb2NrLmgiCi0jaW5jbHVkZSAiRGV2aWNlT3Jp
ZW50YXRpb25DbGllbnRRdC5oIgotI2VuZGlmCi0jaW5jbHVkZSAiRG9jdW1lbnRMb2FkZXIuaCIK
LSNpbmNsdWRlICJEcmFnQ2xpZW50UXQuaCIKLSNpbmNsdWRlICJEcmFnQ29udHJvbGxlci5oIgot
I2luY2x1ZGUgIkRyYWdEYXRhLmgiCi0jaW5jbHVkZSAiRHJhZ1Nlc3Npb24uaCIKLSNpbmNsdWRl
ICJFZGl0b3IuaCIKLSNpbmNsdWRlICJFZGl0b3JDbGllbnRRdC5oIgotI2luY2x1ZGUgIkZvY3Vz
Q29udHJvbGxlci5oIgotI2luY2x1ZGUgIkZvcm1TdGF0ZS5oIgotI2luY2x1ZGUgIkZyYW1lLmgi
Ci0jaW5jbHVkZSAiRnJhbWVMb2FkUmVxdWVzdC5oIgotI2luY2x1ZGUgIkZyYW1lTG9hZGVyLmgi
Ci0jaW5jbHVkZSAiRnJhbWVMb2FkZXJDbGllbnRRdC5oIgotI2luY2x1ZGUgIkZyYW1lVHJlZS5o
IgotI2luY2x1ZGUgIkZyYW1lVmlldy5oIgotI2lmIEVOQUJMRShHRU9MT0NBVElPTikKLSNpbmNs
dWRlICJHZW9sb2NhdGlvbkNsaWVudE1vY2suaCIKLSNpbmNsdWRlICJHZW9sb2NhdGlvbkNsaWVu
dFF0LmgiCi0jaW5jbHVkZSAiR2VvbG9jYXRpb25Db250cm9sbGVyLmgiCi0jZW5kaWYKLSNpbmNs
dWRlICJHZW9sb2NhdGlvblBlcm1pc3Npb25DbGllbnRRdC5oIgotI2luY2x1ZGUgIkhUTUxGb3Jt
RWxlbWVudC5oIgotI2luY2x1ZGUgIkhUTUxGcmFtZU93bmVyRWxlbWVudC5oIgotI2luY2x1ZGUg
IkhUTUxJbnB1dEVsZW1lbnQuaCIKLSNpbmNsdWRlICJIVE1MTmFtZXMuaCIKLSNpbmNsdWRlICJI
aXRUZXN0UmVzdWx0LmgiCi0jaW5jbHVkZSAiSW1hZ2UuaCIKLSNpbmNsdWRlICJJbml0V2ViQ29y
ZVF0LmgiCi0jaW5jbHVkZSAiSW5pdFdlYktpdFF0LmgiCi0jaW5jbHVkZSAiSW5zcGVjdG9yQ2xp
ZW50UXQuaCIKLSNpbmNsdWRlICJJbnNwZWN0b3JDbGllbnRXZWJQYWdlLmgiCi0jaW5jbHVkZSAi
SW5zcGVjdG9yQ29udHJvbGxlci5oIgotI2luY2x1ZGUgIkluc3BlY3RvclNlcnZlclF0LmgiCi0j
aW5jbHVkZSAiS1VSTC5oIgotI2luY2x1ZGUgIkxvY2FsaXplZFN0cmluZ3MuaCIKLSNpbmNsdWRl
ICJNSU1FVHlwZVJlZ2lzdHJ5LmgiCi0jaW5jbHVkZSAiTmF2aWdhdGlvbkFjdGlvbi5oIgotI2lu
Y2x1ZGUgIk5ldHdvcmtpbmdDb250ZXh0LmgiCi0jaW5jbHVkZSAiTm9kZUxpc3QuaCIKLSNpbmNs
dWRlICJOb3RJbXBsZW1lbnRlZC5oIgotI2luY2x1ZGUgIk5vdGlmaWNhdGlvblByZXNlbnRlckNs
aWVudFF0LmgiCi0jaW5jbHVkZSAiUGFnZS5oIgotI2luY2x1ZGUgIlBhZ2VDbGllbnRRdC5oIgot
I2luY2x1ZGUgIlBhZ2VHcm91cC5oIgotI2luY2x1ZGUgIlBhc3RlYm9hcmQuaCIKLSNpbmNsdWRl
ICJQbGF0Zm9ybUtleWJvYXJkRXZlbnQuaCIKLSNpbmNsdWRlICJQbGF0Zm9ybVRvdWNoRXZlbnQu
aCIKLSNpbmNsdWRlICJQbGF0Zm9ybVdoZWVsRXZlbnQuaCIKLSNpbmNsdWRlICJQbHVnaW5EYXRh
YmFzZS5oIgotI2luY2x1ZGUgIlBsdWdpblBhY2thZ2UuaCIKLSNpbmNsdWRlICJQcm9ncmVzc1Ry
YWNrZXIuaCIKLSNpbmNsdWRlICJRR3JhcGhpY3NXaWRnZXRQbHVnaW5JbXBsLmgiCi0jaW5jbHVk
ZSAiUVdlYlVuZG9Db21tYW5kLmgiCi0jaW5jbHVkZSAiUVdpZGdldFBsdWdpbkltcGwuaCIKLSNp
bmNsdWRlICJRdEZhbGxiYWNrV2ViUG9wdXAuaCIKLSNpbmNsdWRlICJRdFBsYXRmb3JtUGx1Z2lu
LmgiCi0jaW5jbHVkZSAiUmVuZGVyVGV4dENvbnRyb2wuaCIKLSNpbmNsdWRlICJSZW5kZXJUaGVt
ZVF0LmgiCi0jaW5jbHVkZSAiU2NoZW1lUmVnaXN0cnkuaCIKLSNpbmNsdWRlICJTY3JvbGxiYXIu
aCIKLSNpbmNsdWRlICJTY3JvbGxiYXJUaGVtZS5oIgotI2luY2x1ZGUgIlNlY3VyaXR5T3JpZ2lu
LmgiCi0jaW5jbHVkZSAiU2V0dGluZ3MuaCIKLSNpZiBkZWZpbmVkIFFfT1NfV0lOMzIKLSNpbmNs
dWRlICJTeXN0ZW1JbmZvLmgiCi0jZW5kaWYgLy8gUV9PU19XSU4zMgotI2luY2x1ZGUgIlRleHRJ
dGVyYXRvci5oIgotI2luY2x1ZGUgIlVuZG9TdGVwUXQuaCIKLSNpbmNsdWRlICJVc2VyQWdlbnRR
dC5oIgotI2luY2x1ZGUgIldlYkV2ZW50Q29udmVyc2lvbi5oIgotI2luY2x1ZGUgIldlYktpdFZl
cnNpb24uaCIKLSNpbmNsdWRlICJXaW5kb3dGZWF0dXJlcy5oIgotI2luY2x1ZGUgIldvcmtlclRo
cmVhZC5oIgotCi0jaW5jbHVkZSAicXdlYmZyYW1lLmgiCi0jaW5jbHVkZSAicXdlYmZyYW1lX3Au
aCIKLSNpbmNsdWRlICJxd2ViaGlzdG9yeS5oIgotI2luY2x1ZGUgInF3ZWJoaXN0b3J5X3AuaCIK
LSNpbmNsdWRlICJxd2ViaW5zcGVjdG9yLmgiCi0jaW5jbHVkZSAicXdlYmluc3BlY3Rvcl9wLmgi
Ci0jaW5jbHVkZSAicXdlYmtpdHBsYXRmb3JtcGx1Z2luLmgiCi0jaW5jbHVkZSAicXdlYmtpdHZl
cnNpb24uaCIKLSNpbmNsdWRlICJxd2VicGFnZV9wLmgiCi0jaW5jbHVkZSAicXdlYnNldHRpbmdz
LmgiCi0jaW5jbHVkZSAicXdlYnZpZXcuaCIKLQotI2luY2x1ZGUgPFFBY3Rpb24+Ci0jaW5jbHVk
ZSA8UUFwcGxpY2F0aW9uPgotI2luY2x1ZGUgPFFCYXNpY1RpbWVyPgotI2luY2x1ZGUgPFFCaXRB
cnJheT4KLSNpbmNsdWRlIDxRQ2xpcGJvYXJkPgotI2luY2x1ZGUgPFFDb2xvckRpYWxvZz4KLSNp
bmNsdWRlIDxRRGVidWc+Ci0jaW5jbHVkZSA8UURlc2t0b3BXaWRnZXQ+Ci0jaW5jbHVkZSA8UURy
YWdFbnRlckV2ZW50PgotI2luY2x1ZGUgPFFEcmFnTGVhdmVFdmVudD4KLSNpbmNsdWRlIDxRRHJh
Z01vdmVFdmVudD4KLSNpbmNsdWRlIDxRRHJvcEV2ZW50PgotI2luY2x1ZGUgPFFGaWxlRGlhbG9n
PgotI2luY2x1ZGUgPFFHZXN0dXJlRXZlbnQ+Ci0jaW5jbHVkZSA8UUlucHV0RGlhbG9nPgotI2lu
Y2x1ZGUgPFFMYWJlbD4KLSNpbmNsdWRlIDxRTWVudT4KLSNpbmNsdWRlIDxRTWVzc2FnZUJveD4K
LSNpbmNsdWRlIDxRTmV0d29ya0FjY2Vzc01hbmFnZXI+Ci0jaW5jbHVkZSA8UU5ldHdvcmtQcm94
eT4KLSNpbmNsdWRlIDxRTmV0d29ya1JlcXVlc3Q+Ci0jaW5jbHVkZSA8UVBhaW50ZXI+Ci0jaW5j
bHVkZSA8UVNzbFNvY2tldD4KLSNpbmNsdWRlIDxRU3R5bGU+Ci0jaW5jbHVkZSA8UVN5c0luZm8+
Ci0jaWYgVVNFKFFUX01PQklMSVRZX1NZU1RFTUlORk8pCi0jaW5jbHVkZSA8cXN5c3RlbWluZm8u
aD4KLSNlbmRpZgotI2luY2x1ZGUgPFFTeXN0ZW1UcmF5SWNvbj4KLSNpbmNsdWRlIDxRVGV4dENo
YXJGb3JtYXQ+Ci0jaW5jbHVkZSA8UVRvb2xUaXA+Ci0jaW5jbHVkZSA8UVRvdWNoRXZlbnQ+Ci0j
aW5jbHVkZSA8UVVuZG9TdGFjaz4KLSNpbmNsdWRlIDxRVXJsPgotI2lmIGRlZmluZWQoUV9XU19Y
MTEpCi0jaW5jbHVkZSA8UVgxMUluZm8+Ci0jZW5kaWYKLQotdXNpbmcgbmFtZXNwYWNlIFdlYkNv
cmU7Ci0KLS8vIGZyb20gdGV4dC9xZm9udC5jcHAKLVFUX0JFR0lOX05BTUVTUEFDRQotZXh0ZXJu
IFFfR1VJX0VYUE9SVCBpbnQgcXRfZGVmYXVsdERwaSgpOwotUVRfRU5EX05BTUVTUEFDRQotCi0v
LyBMb29rdXAgdGFibGUgbWFwcGluZyBRV2ViUGFnZTo6V2ViQWN0aW9ucyB0byB0aGUgYXNzb2Np
YXRlZCBFZGl0b3IgY29tbWFuZHMKLXN0YXRpYyBjb25zdCBjaGFyKiBlZGl0b3JDb21tYW5kV2Vi
QWN0aW9uc1tdID0KLXsKLSAgICAwLCAvLyBPcGVuTGluaywKLQotICAgIDAsIC8vIE9wZW5MaW5r
SW5OZXdXaW5kb3csCi0gICAgMCwgLy8gT3BlbkZyYW1lSW5OZXdXaW5kb3csCi0KLSAgICAwLCAv
LyBEb3dubG9hZExpbmtUb0Rpc2ssCi0gICAgMCwgLy8gQ29weUxpbmtUb0NsaXBib2FyZCwKLQot
ICAgIDAsIC8vIE9wZW5JbWFnZUluTmV3V2luZG93LAotICAgIDAsIC8vIERvd25sb2FkSW1hZ2VU
b0Rpc2ssCi0gICAgMCwgLy8gQ29weUltYWdlVG9DbGlwYm9hcmQsCi0KLSAgICAwLCAvLyBCYWNr
LAotICAgIDAsIC8vIEZvcndhcmQsCi0gICAgMCwgLy8gU3RvcCwKLSAgICAwLCAvLyBSZWxvYWQs
Ci0KLSAgICAiQ3V0IiwgLy8gQ3V0LAotICAgICJDb3B5IiwgLy8gQ29weSwKLSAgICAiUGFzdGUi
LCAvLyBQYXN0ZSwKLQotICAgICJVbmRvIiwgLy8gVW5kbywKLSAgICAiUmVkbyIsIC8vIFJlZG8s
Ci0gICAgIk1vdmVGb3J3YXJkIiwgLy8gTW92ZVRvTmV4dENoYXIsCi0gICAgIk1vdmVCYWNrd2Fy
ZCIsIC8vIE1vdmVUb1ByZXZpb3VzQ2hhciwKLSAgICAiTW92ZVdvcmRGb3J3YXJkIiwgLy8gTW92
ZVRvTmV4dFdvcmQsCi0gICAgIk1vdmVXb3JkQmFja3dhcmQiLCAvLyBNb3ZlVG9QcmV2aW91c1dv
cmQsCi0gICAgIk1vdmVEb3duIiwgLy8gTW92ZVRvTmV4dExpbmUsCi0gICAgIk1vdmVVcCIsIC8v
IE1vdmVUb1ByZXZpb3VzTGluZSwKLSAgICAiTW92ZVRvQmVnaW5uaW5nT2ZMaW5lIiwgLy8gTW92
ZVRvU3RhcnRPZkxpbmUsCi0gICAgIk1vdmVUb0VuZE9mTGluZSIsIC8vIE1vdmVUb0VuZE9mTGlu
ZSwKLSAgICAiTW92ZVRvQmVnaW5uaW5nT2ZQYXJhZ3JhcGgiLCAvLyBNb3ZlVG9TdGFydE9mQmxv
Y2ssCi0gICAgIk1vdmVUb0VuZE9mUGFyYWdyYXBoIiwgLy8gTW92ZVRvRW5kT2ZCbG9jaywKLSAg
ICAiTW92ZVRvQmVnaW5uaW5nT2ZEb2N1bWVudCIsIC8vIE1vdmVUb1N0YXJ0T2ZEb2N1bWVudCwK
LSAgICAiTW92ZVRvRW5kT2ZEb2N1bWVudCIsIC8vIE1vdmVUb0VuZE9mRG9jdW1lbnQsCi0gICAg
Ik1vdmVGb3J3YXJkQW5kTW9kaWZ5U2VsZWN0aW9uIiwgLy8gU2VsZWN0TmV4dENoYXIsCi0gICAg
Ik1vdmVCYWNrd2FyZEFuZE1vZGlmeVNlbGVjdGlvbiIsIC8vIFNlbGVjdFByZXZpb3VzQ2hhciwK
LSAgICAiTW92ZVdvcmRGb3J3YXJkQW5kTW9kaWZ5U2VsZWN0aW9uIiwgLy8gU2VsZWN0TmV4dFdv
cmQsCi0gICAgIk1vdmVXb3JkQmFja3dhcmRBbmRNb2RpZnlTZWxlY3Rpb24iLCAvLyBTZWxlY3RQ
cmV2aW91c1dvcmQsCi0gICAgIk1vdmVEb3duQW5kTW9kaWZ5U2VsZWN0aW9uIiwgLy8gU2VsZWN0
TmV4dExpbmUsCi0gICAgIk1vdmVVcEFuZE1vZGlmeVNlbGVjdGlvbiIsIC8vIFNlbGVjdFByZXZp
b3VzTGluZSwKLSAgICAiTW92ZVRvQmVnaW5uaW5nT2ZMaW5lQW5kTW9kaWZ5U2VsZWN0aW9uIiwg
Ly8gU2VsZWN0U3RhcnRPZkxpbmUsCi0gICAgIk1vdmVUb0VuZE9mTGluZUFuZE1vZGlmeVNlbGVj
dGlvbiIsIC8vIFNlbGVjdEVuZE9mTGluZSwKLSAgICAiTW92ZVRvQmVnaW5uaW5nT2ZQYXJhZ3Jh
cGhBbmRNb2RpZnlTZWxlY3Rpb24iLCAvLyBTZWxlY3RTdGFydE9mQmxvY2ssCi0gICAgIk1vdmVU
b0VuZE9mUGFyYWdyYXBoQW5kTW9kaWZ5U2VsZWN0aW9uIiwgLy8gU2VsZWN0RW5kT2ZCbG9jaywK
LSAgICAiTW92ZVRvQmVnaW5uaW5nT2ZEb2N1bWVudEFuZE1vZGlmeVNlbGVjdGlvbiIsIC8vU2Vs
ZWN0U3RhcnRPZkRvY3VtZW50LAotICAgICJNb3ZlVG9FbmRPZkRvY3VtZW50QW5kTW9kaWZ5U2Vs
ZWN0aW9uIiwgLy8gU2VsZWN0RW5kT2ZEb2N1bWVudCwKLSAgICAiRGVsZXRlV29yZEJhY2t3YXJk
IiwgLy8gRGVsZXRlU3RhcnRPZldvcmQsCi0gICAgIkRlbGV0ZVdvcmRGb3J3YXJkIiwgLy8gRGVs
ZXRlRW5kT2ZXb3JkLAotCi0gICAgMCwgLy8gU2V0VGV4dERpcmVjdGlvbkRlZmF1bHQsCi0gICAg
MCwgLy8gU2V0VGV4dERpcmVjdGlvbkxlZnRUb1JpZ2h0LAotICAgIDAsIC8vIFNldFRleHREaXJl
Y3Rpb25SaWdodFRvTGVmdCwKLQotICAgICJUb2dnbGVCb2xkIiwgLy8gVG9nZ2xlQm9sZCwKLSAg
ICAiVG9nZ2xlSXRhbGljIiwgLy8gVG9nZ2xlSXRhbGljLAotICAgICJUb2dnbGVVbmRlcmxpbmUi
LCAvLyBUb2dnbGVVbmRlcmxpbmUsCi0KLSAgICAwLCAvLyBJbnNwZWN0RWxlbWVudCwKLQotICAg
ICJJbnNlcnROZXdsaW5lIiwgLy8gSW5zZXJ0UGFyYWdyYXBoU2VwYXJhdG9yCi0gICAgIkluc2Vy
dExpbmVCcmVhayIsIC8vIEluc2VydExpbmVTZXBhcmF0b3IKLQotICAgICJTZWxlY3RBbGwiLCAv
LyBTZWxlY3RBbGwKLSAgICAwLCAvLyBSZWxvYWRBbmRCeXBhc3NDYWNoZSwKLQotICAgICJQYXN0
ZUFuZE1hdGNoU3R5bGUiLCAvLyBQYXN0ZUFuZE1hdGNoU3R5bGUKLSAgICAiUmVtb3ZlRm9ybWF0
IiwgLy8gUmVtb3ZlRm9ybWF0Ci0gICAgIlN0cmlrZXRocm91Z2giLCAvLyBUb2dnbGVTdHJpa2V0
aHJvdWdoLAotICAgICJTdWJzY3JpcHQiLCAvLyBUb2dnbGVTdWJzY3JpcHQKLSAgICAiU3VwZXJz
Y3JpcHQiLCAvLyBUb2dnbGVTdXBlcnNjcmlwdAotICAgICJJbnNlcnRVbm9yZGVyZWRMaXN0Iiwg
Ly8gSW5zZXJ0VW5vcmRlcmVkTGlzdAotICAgICJJbnNlcnRPcmRlcmVkTGlzdCIsIC8vIEluc2Vy
dE9yZGVyZWRMaXN0Ci0gICAgIkluZGVudCIsIC8vIEluZGVudAotICAgICJPdXRkZW50IiwgLy8g
T3V0ZGVudCwKLQotICAgICJBbGlnbkNlbnRlciIsIC8vIEFsaWduQ2VudGVyLAotICAgICJBbGln
bkp1c3RpZmllZCIsIC8vIEFsaWduSnVzdGlmaWVkLAotICAgICJBbGlnbkxlZnQiLCAvLyBBbGln
bkxlZnQsCi0gICAgIkFsaWduUmlnaHQiLCAvLyBBbGlnblJpZ2h0LAotCi0gICAgMCwgLy8gU3Rv
cFNjaGVkdWxlZFBhZ2VSZWZyZXNoLAotCi0gICAgMCwgLy8gQ29weUltYWdlVXJsVG9DbGlwYm9h
cmQsCi0KLSAgICAwLCAvLyBPcGVuTGlua0luVGhpc1dpbmRvdywKLQotICAgIDAgLy8gV2ViQWN0
aW9uQ291bnQKLX07Ci0KLS8vIExvb2t1cCB0aGUgYXBwcm9wcmlhdGUgZWRpdG9yIGNvbW1hbmQg
dG8gdXNlIGZvciBXZWJBY3Rpb24gXGEgYWN0aW9uCi1jb25zdCBjaGFyKiBRV2ViUGFnZVByaXZh
dGU6OmVkaXRvckNvbW1hbmRGb3JXZWJBY3Rpb25zKFFXZWJQYWdlOjpXZWJBY3Rpb24gYWN0aW9u
KQotewotICAgIGlmICgoYWN0aW9uID4gUVdlYlBhZ2U6Ok5vV2ViQWN0aW9uKSAmJiAoYWN0aW9u
IDwgaW50KHNpemVvZihlZGl0b3JDb21tYW5kV2ViQWN0aW9ucykgLyBzaXplb2YoY29uc3QgY2hh
ciopKSkpCi0gICAgICAgIHJldHVybiBlZGl0b3JDb21tYW5kV2ViQWN0aW9uc1thY3Rpb25dOwot
ICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIERyYWdPcGVyYXRpb24gZHJvcEFjdGlv
blRvRHJhZ09wKFF0OjpEcm9wQWN0aW9ucyBhY3Rpb25zKQotewotICAgIHVuc2lnbmVkIHJlc3Vs
dCA9IDA7Ci0gICAgaWYgKGFjdGlvbnMgJiBRdDo6Q29weUFjdGlvbikKLSAgICAgICAgcmVzdWx0
IHw9IERyYWdPcGVyYXRpb25Db3B5OwotICAgIC8vIERyYWdPcGVyYXRpb25nZW5lcmljIHJlcHJl
c2VudHMgSW50ZXJuZXRFeHBsb3JlcidzIGVxdWl2YWxlbnQgb2YgTW92ZSBvcGVyYXRpb24sCi0g
ICAgLy8gaGVuY2UgaXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYXMgIm1vdmUiCi0gICAgaWYgKGFj
dGlvbnMgJiBRdDo6TW92ZUFjdGlvbikKLSAgICAgICAgcmVzdWx0IHw9IChEcmFnT3BlcmF0aW9u
TW92ZSB8IERyYWdPcGVyYXRpb25HZW5lcmljKTsKLSAgICBpZiAoYWN0aW9ucyAmIFF0OjpMaW5r
QWN0aW9uKQotICAgICAgICByZXN1bHQgfD0gRHJhZ09wZXJhdGlvbkxpbms7Ci0gICAgaWYgKHJl
c3VsdCA9PSAoRHJhZ09wZXJhdGlvbkNvcHkgfCBEcmFnT3BlcmF0aW9uTW92ZSB8IERyYWdPcGVy
YXRpb25HZW5lcmljIHwgRHJhZ09wZXJhdGlvbkxpbmspKQotICAgICAgICByZXN1bHQgPSBEcmFn
T3BlcmF0aW9uRXZlcnk7Ci0gICAgcmV0dXJuIChEcmFnT3BlcmF0aW9uKXJlc3VsdDsKLX0KLQot
c3RhdGljIGlubGluZSBRdDo6RHJvcEFjdGlvbiBkcmFnT3BUb0Ryb3BBY3Rpb24odW5zaWduZWQg
YWN0aW9ucykKLXsKLSAgICBRdDo6RHJvcEFjdGlvbiByZXN1bHQgPSBRdDo6SWdub3JlQWN0aW9u
OwotICAgIGlmIChhY3Rpb25zICYgRHJhZ09wZXJhdGlvbkNvcHkpCi0gICAgICAgIHJlc3VsdCA9
IFF0OjpDb3B5QWN0aW9uOwotICAgIGVsc2UgaWYgKGFjdGlvbnMgJiBEcmFnT3BlcmF0aW9uTW92
ZSkKLSAgICAgICAgcmVzdWx0ID0gUXQ6Ok1vdmVBY3Rpb247Ci0gICAgLy8gRHJhZ09wZXJhdGlv
bmdlbmVyaWMgcmVwcmVzZW50cyBJbnRlcm5ldEV4cGxvcmVyJ3MgZXF1aXZhbGVudCBvZiBNb3Zl
IG9wZXJhdGlvbiwKLSAgICAvLyBoZW5jZSBpdCBzaG91bGQgYmUgY29uc2lkZXJlZCBhcyAibW92
ZSIKLSAgICBlbHNlIGlmIChhY3Rpb25zICYgRHJhZ09wZXJhdGlvbkdlbmVyaWMpCi0gICAgICAg
IHJlc3VsdCA9IFF0OjpNb3ZlQWN0aW9uOwotICAgIGVsc2UgaWYgKGFjdGlvbnMgJiBEcmFnT3Bl
cmF0aW9uTGluaykKLSAgICAgICAgcmVzdWx0ID0gUXQ6OkxpbmtBY3Rpb247Ci0gICAgcmV0dXJu
IHJlc3VsdDsKLX0KLQotUVdlYlBhZ2VQcml2YXRlOjpRV2ViUGFnZVByaXZhdGUoUVdlYlBhZ2Ug
KnFxKQotICAgIDogcShxcSkKLSNpZm5kZWYgUVRfTk9fVU5ET1NUQUNLCi0gICAgLCB1bmRvU3Rh
Y2soMCkKLSNlbmRpZgotICAgICwgbV90b3RhbEJ5dGVzKDApCi0gICAgLCBtX2J5dGVzUmVjZWl2
ZWQoKQotICAgICwgY2xpY2tDYXVzZWRGb2N1cyhmYWxzZSkKLSAgICAsIGxpbmtQb2xpY3koUVdl
YlBhZ2U6OkRvbnREZWxlZ2F0ZUxpbmtzKQotICAgICwgbV92aWV3cG9ydFNpemUoUVNpemUoMCwg
MCkpCi0gICAgLCB1c2VGaXhlZExheW91dChmYWxzZSkKLSAgICAsIGluc3BlY3RvckZyb250ZW5k
KDApCi0gICAgLCBpbnNwZWN0b3IoMCkKLSAgICAsIGluc3BlY3RvcklzSW50ZXJuYWxPbmx5KGZh
bHNlKQotICAgICwgbV9sYXN0RHJvcEFjdGlvbihRdDo6SWdub3JlQWN0aW9uKQotewotI2lmIEVO
QUJMRShHRU9MT0NBVElPTikgfHwgRU5BQkxFKERFVklDRV9PUklFTlRBVElPTikKLSAgICBib29s
IHVzZU1vY2sgPSBRV2ViUGFnZUFkYXB0ZXI6OmRydFJ1bjsKLSNlbmRpZgotCi0gICAgV2ViS2l0
Ojppbml0aWFsaXplV2ViS2l0V2lkZ2V0cygpOwotICAgIFdlYkNvcmU6OmluaXRpYWxpemVXZWJD
b3JlUXQoKTsKLQotICAgIFBhZ2U6OlBhZ2VDbGllbnRzIHBhZ2VDbGllbnRzOwotICAgIHBhZ2VD
bGllbnRzLmNocm9tZUNsaWVudCA9IG5ldyBDaHJvbWVDbGllbnRRdCh0aGlzKTsKLSAgICBwYWdl
Q2xpZW50cy5jb250ZXh0TWVudUNsaWVudCA9IG5ldyBDb250ZXh0TWVudUNsaWVudFF0KCk7Ci0g
ICAgcGFnZUNsaWVudHMuZWRpdG9yQ2xpZW50ID0gbmV3IEVkaXRvckNsaWVudFF0KHRoaXMpOwot
ICAgIHBhZ2VDbGllbnRzLmRyYWdDbGllbnQgPSBuZXcgRHJhZ0NsaWVudFF0KHBhZ2VDbGllbnRz
LmNocm9tZUNsaWVudCk7Ci0gICAgcGFnZUNsaWVudHMuaW5zcGVjdG9yQ2xpZW50ID0gbmV3IElu
c3BlY3RvckNsaWVudFF0KHRoaXMpOwotICAgIHBhZ2UgPSBuZXcgUGFnZShwYWdlQ2xpZW50cyk7
Ci0jaWYgRU5BQkxFKEdFT0xPQ0FUSU9OKQotICAgIGlmICh1c2VNb2NrKSB7Ci0gICAgICAgIC8v
IEluIGNhc2UgcnVubmluZyBpbiBEdW1wUmVuZGVyVHJlZSBtb2RlIHNldCB0aGUgY29udHJvbGxl
ciB0byBtb2NrIHByb3ZpZGVyLgotICAgICAgICBHZW9sb2NhdGlvbkNsaWVudE1vY2sqIG1vY2sg
PSBuZXcgR2VvbG9jYXRpb25DbGllbnRNb2NrOwotICAgICAgICBXZWJDb3JlOjpwcm92aWRlR2Vv
bG9jYXRpb25UbyhwYWdlLCBtb2NrKTsKLSAgICAgICAgbW9jay0+c2V0Q29udHJvbGxlcihXZWJD
b3JlOjpHZW9sb2NhdGlvbkNvbnRyb2xsZXI6OmZyb20ocGFnZSkpOwotICAgIH0gZWxzZQotICAg
ICAgICBXZWJDb3JlOjpwcm92aWRlR2VvbG9jYXRpb25UbyhwYWdlLCBuZXcgR2VvbG9jYXRpb25D
bGllbnRRdCh0aGlzKSk7Ci0jZW5kaWYKLSNpZiBFTkFCTEUoREVWSUNFX09SSUVOVEFUSU9OKQot
ICAgIGlmICh1c2VNb2NrKQotICAgICAgICBXZWJDb3JlOjpwcm92aWRlRGV2aWNlT3JpZW50YXRp
b25UbyhwYWdlLCBuZXcgRGV2aWNlT3JpZW50YXRpb25DbGllbnRNb2NrKTsKLSAgICBlbHNlCi0g
ICAgICAgIFdlYkNvcmU6OnByb3ZpZGVEZXZpY2VPcmllbnRhdGlvblRvKHBhZ2UsIG5ldyBEZXZp
Y2VPcmllbnRhdGlvbkNsaWVudFF0KTsKLSAgICBXZWJDb3JlOjpwcm92aWRlRGV2aWNlTW90aW9u
VG8ocGFnZSwgbmV3IERldmljZU1vdGlvbkNsaWVudFF0KTsKLSNlbmRpZgotCi0gICAgLy8gQnkg
ZGVmYXVsdCBlYWNoIHBhZ2UgaXMgcHV0IGludG8gdGhlaXIgb3duIHVuaXF1ZSBwYWdlIGdyb3Vw
LCB3aGljaCBhZmZlY3RzIHBvcHVwIHdpbmRvd3MKLSAgICAvLyBhbmQgdmlzaXRlZCBsaW5rcy4g
UGFnZSBncm91cHMgKHBlciBwcm9jZXNzIG9ubHkpIGlzIGEgZmVhdHVyZSBtYWtpbmcgaXQgcG9z
c2libGUgdG8gdXNlCi0gICAgLy8gc2VwYXJhdGUgc2V0dGluZ3MgZm9yIGVhY2ggZ3JvdXAsIHNv
IHRoYXQgZm9yIGluc3RhbmNlIGFuIGludGVncmF0ZWQgYnJvd3Nlci9lbWFpbCByZWFkZXIKLSAg
ICAvLyBjYW4gdXNlIGRpZmZlcmVudCBzZXR0aW5ncyBmb3IgZGlzcGxheWluZyBIVE1MIHBhZ2Vz
IGFuZCBIVE1MIGVtYWlsLiBUbyBtYWtlIFF0V2ViS2l0IHdvcmsKLSAgICAvLyBhcyBleHBlY3Rl
ZCBvdXQgb2YgdGhlIGJveCwgd2UgdXNlIGEgZGVmYXVsdCBncm91cCBzaW1pbGFyIHRvIHdoYXQg
b3RoZXIgcG9ydHMgYXJlIGRvaW5nLgotICAgIHBhZ2UtPnNldEdyb3VwTmFtZSgiRGVmYXVsdCBH
cm91cCIpOwotCi0gICAgcGFnZS0+YWRkTGF5b3V0TWlsZXN0b25lcyhEaWRGaXJzdFZpc3VhbGx5
Tm9uRW1wdHlMYXlvdXQpOwotCi0gICAgUVdlYlBhZ2VBZGFwdGVyOjppbml0KHBhZ2UpOwotCi0g
ICAgaGlzdG9yeS5kID0gbmV3IFFXZWJIaXN0b3J5UHJpdmF0ZShzdGF0aWNfY2FzdDxXZWJDb3Jl
OjpCYWNrRm9yd2FyZExpc3RJbXBsKj4ocGFnZS0+YmFja0ZvcndhcmRMaXN0KCkpKTsKLSAgICBt
ZW1zZXQoYWN0aW9ucywgMCwgc2l6ZW9mKGFjdGlvbnMpKTsKLQotICAgIFBhZ2VHcm91cDo6c2V0
U2hvdWxkVHJhY2tWaXNpdGVkTGlua3ModHJ1ZSk7Ci0gICAgCi0jaWYgRU5BQkxFKE5PVElGSUNB
VElPTlMpIHx8IEVOQUJMRShMRUdBQ1lfTk9USUZJQ0FUSU9OUykKLSAgICBOb3RpZmljYXRpb25Q
cmVzZW50ZXJDbGllbnRRdCogcHJlc2VudGVyID0gTm90aWZpY2F0aW9uUHJlc2VudGVyQ2xpZW50
UXQ6Om5vdGlmaWNhdGlvblByZXNlbnRlcigpOwotICAgIHByZXNlbnRlci0+YWRkQ2xpZW50KCk7
Ci0jaWZuZGVmIFFUX05PX1NZU1RFTVRSQVlJQ09OCi0gICAgaWYgKCFwcmVzZW50ZXItPmhhc1N5
c3RlbVRyYXlJY29uKCkpCi0gICAgICAgIHByZXNlbnRlci0+c2V0U3lzdGVtVHJheUljb24obmV3
IFFTeXN0ZW1UcmF5SWNvbik7Ci0jZW5kaWYgLy8gUVRfTk9fU1lTVEVNVFJBWUlDT04KLSNlbmRp
ZiAvLyBFTkFCTEUoTk9USUZJQ0FUSU9OUykgfHwgRU5BQkxFKExFR0FDWV9OT1RJRklDQVRJT05T
KQotfQotCi1RV2ViUGFnZVByaXZhdGU6On5RV2ViUGFnZVByaXZhdGUoKQotewotI2lmbmRlZiBR
VF9OT19DT05URVhUTUVOVQotICAgIGRlbGV0ZSBjdXJyZW50Q29udGV4dE1lbnUuZGF0YSgpOwot
I2VuZGlmCi0jaWZuZGVmIFFUX05PX1VORE9TVEFDSwotICAgIGRlbGV0ZSB1bmRvU3RhY2s7Ci0j
ZW5kaWYKLSAgICAKLSAgICBpZiAoaW5zcGVjdG9yKSB7Ci0gICAgICAgIC8vIElmIHRoZSBpbnNw
ZWN0b3IgaXMgb3VycywgZGVsZXRlIGl0LCBvdGhlcndpc2UganVzdCBkZXRhY2ggZnJvbSBpdC4K
LSAgICAgICAgaWYgKGluc3BlY3RvcklzSW50ZXJuYWxPbmx5KQotICAgICAgICAgICAgZGVsZXRl
IGluc3BlY3RvcjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgaW5zcGVjdG9yLT5zZXRQYWdl
KDApOwotICAgIH0KLSAgICAvLyBFeHBsaWNpdGx5IGRlc3RydWN0IHRoZSBXZWJDb3JlIHBhZ2Ug
YXQgdGhpcyBwb2ludCB3aGVuIHRoZQotICAgIC8vIFFXZWJQYWdlUHJpdmF0ZSAvIFFXZWJQYWdl
QWRhcGF0ZXIgdnRhYmxlcyBhcmUgc3RpbGwgaW50YWN0LAotICAgIC8vIGluIG9yZGVyIGZvciB2
YXJpb3VzIGRlc3RydWN0aW9uIGNhbGxiYWNrcyBvdXQgb2YgV2ViQ29yZSB0bwotICAgIC8vIHdv
cmsuCi0gICAgZGVsZXRlUGFnZSgpOwotfQotCi1XZWJDb3JlOjpQYWdlKiBRV2ViUGFnZVByaXZh
dGU6OmNvcmUoY29uc3QgUVdlYlBhZ2UqIHBhZ2UpCi17Ci0gICAgcmV0dXJuIHBhZ2UtPmQtPnBh
Z2U7Ci19Ci0KLXZvaWQgUVdlYlBhZ2VQcml2YXRlOjpzaG93KCkKLXsKLSAgICBpZiAoIXZpZXcp
Ci0gICAgICAgIHJldHVybjsKLSAgICB2aWV3LT53aW5kb3coKS0+c2hvdygpOwotfQotCi12b2lk
IFFXZWJQYWdlUHJpdmF0ZTo6c2V0Rm9jdXMoKQotewotICAgIGlmICghdmlldykKLSAgICAgICAg
cmV0dXJuOwotICAgIHZpZXctPnNldEZvY3VzKCk7Ci19Ci0KLXZvaWQgUVdlYlBhZ2VQcml2YXRl
Ojp1bmZvY3VzKCkKLXsKLSAgICBpZiAoIXZpZXcpCi0gICAgICAgIHJldHVybjsKLSAgICB2aWV3
LT5jbGVhckZvY3VzKCk7Ci19Ci0KLXZvaWQgUVdlYlBhZ2VQcml2YXRlOjpzZXRXaW5kb3dSZWN0
KGNvbnN0IFFSZWN0ICZyZWN0KQotewotICAgIGVtaXQgcS0+Z2VvbWV0cnlDaGFuZ2VSZXF1ZXN0
ZWQocmVjdCk7Ci19Ci0KLVFTaXplIFFXZWJQYWdlUHJpdmF0ZTo6dmlld3BvcnRTaXplKCkgY29u
c3QKLXsKLSAgICByZXR1cm4gcS0+dmlld3BvcnRTaXplKCk7Ci19Ci0KLVFXZWJQYWdlQWRhcHRl
ciAqUVdlYlBhZ2VQcml2YXRlOjpjcmVhdGVXaW5kb3coYm9vbCBkaWFsb2cpCi17Ci0gICAgUVdl
YlBhZ2UgKm5ld1BhZ2UgPSBxLT5jcmVhdGVXaW5kb3coZGlhbG9nID8gUVdlYlBhZ2U6OldlYk1v
ZGFsRGlhbG9nIDogUVdlYlBhZ2U6OldlYkJyb3dzZXJXaW5kb3cpOwotICAgIGlmICghbmV3UGFn
ZSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgLy8gTWFrZSBzdXJlIHRoZSBtYWluIGZyYW1lIGV4
aXN0cywgYXMgV2ViQ29yZSBleHBlY3RzIGl0IHdoZW4gcmV0dXJuaW5nIGZyb20gdGhpcyBDaHJv
bWVDbGllbnQ6OmNyZWF0ZVdpbmRvdygpCi0gICAgbmV3UGFnZS0+ZC0+Y3JlYXRlTWFpbkZyYW1l
KCk7Ci0gICAgcmV0dXJuIG5ld1BhZ2UtPmQ7Ci19Ci0KLXZvaWQgUVdlYlBhZ2VQcml2YXRlOjpq
YXZhU2NyaXB0Q29uc29sZU1lc3NhZ2UoY29uc3QgUVN0cmluZyAmbWVzc2FnZSwgaW50IGxpbmVO
dW1iZXIsIGNvbnN0IFFTdHJpbmcgJnNvdXJjZUlEKQotewotICAgIHEtPmphdmFTY3JpcHRDb25z
b2xlTWVzc2FnZShtZXNzYWdlLCBsaW5lTnVtYmVyLCBzb3VyY2VJRCk7Ci19Ci0KLXZvaWQgUVdl
YlBhZ2VQcml2YXRlOjpqYXZhU2NyaXB0QWxlcnQoUVdlYkZyYW1lQWRhcHRlciogZnJhbWUsIGNv
bnN0IFFTdHJpbmcmIG1zZykKLXsKLSAgICBxLT5qYXZhU2NyaXB0QWxlcnQoUVdlYkZyYW1lUHJp
dmF0ZTo6a2l0KGZyYW1lKSwgbXNnKTsKLX0KLQotYm9vbCBRV2ViUGFnZVByaXZhdGU6OmphdmFT
Y3JpcHRDb25maXJtKFFXZWJGcmFtZUFkYXB0ZXIqIGZyYW1lLCBjb25zdCBRU3RyaW5nJiBtc2cp
Ci17Ci0gICAgcmV0dXJuIHEtPmphdmFTY3JpcHRDb25maXJtKFFXZWJGcmFtZVByaXZhdGU6Omtp
dChmcmFtZSksIG1zZyk7Ci19Ci0KLWJvb2wgUVdlYlBhZ2VQcml2YXRlOjpqYXZhU2NyaXB0UHJv
bXB0KFFXZWJGcmFtZUFkYXB0ZXIgKmZyYW1lLCBjb25zdCBRU3RyaW5nICZtc2csIGNvbnN0IFFT
dHJpbmcgJmRlZmF1bHRWYWx1ZSwgUVN0cmluZyAqcmVzdWx0KQotewotICAgIHJldHVybiBxLT5q
YXZhU2NyaXB0UHJvbXB0KFFXZWJGcmFtZVByaXZhdGU6OmtpdChmcmFtZSksIG1zZywgZGVmYXVs
dFZhbHVlLCByZXN1bHQpOwotfQotCi1ib29sIFFXZWJQYWdlUHJpdmF0ZTo6c2hvdWxkSW50ZXJy
dXB0SmF2YVNjcmlwdCgpCi17Ci0gICAgcmV0dXJuIHEtPnNob3VsZEludGVycnVwdEphdmFTY3Jp
cHQoKTsKLX0KLQotdm9pZCBRV2ViUGFnZVByaXZhdGU6OnByaW50UmVxdWVzdGVkKFFXZWJGcmFt
ZUFkYXB0ZXIgKmZyYW1lKQotewotICAgIGVtaXQgcS0+cHJpbnRSZXF1ZXN0ZWQoUVdlYkZyYW1l
UHJpdmF0ZTo6a2l0KGZyYW1lKSk7Ci19Ci0KLXZvaWQgUVdlYlBhZ2VQcml2YXRlOjpkYXRhYmFz
ZVF1b3RhRXhjZWVkZWQoUVdlYkZyYW1lQWRhcHRlciogZnJhbWUsIGNvbnN0IFFTdHJpbmcmIGRh
dGFiYXNlTmFtZSkKLXsKLSAgICBlbWl0IHEtPmRhdGFiYXNlUXVvdGFFeGNlZWRlZChRV2ViRnJh
bWVQcml2YXRlOjpraXQoZnJhbWUpLCBkYXRhYmFzZU5hbWUpOwotfQotCi12b2lkIFFXZWJQYWdl
UHJpdmF0ZTo6YXBwbGljYXRpb25DYWNoZVF1b3RhRXhjZWVkZWQoUVdlYlNlY3VyaXR5T3JpZ2lu
ICpvcmlnaW4sIHF1aW50NjQgZGVmYXVsdE9yaWdpblF1b3RhLCBxdWludDY0IGMpCi17Ci0gICAg
ZW1pdCBxLT5hcHBsaWNhdGlvbkNhY2hlUXVvdGFFeGNlZWRlZChvcmlnaW4sIGRlZmF1bHRPcmln
aW5RdW90YSwgYyk7Ci19Ci0KLXZvaWQgUVdlYlBhZ2VQcml2YXRlOjpzZXRUb29sVGlwKGNvbnN0
IFFTdHJpbmcgJnRpcCkKLXsKLSNpZm5kZWYgUVRfTk9fVE9PTFRJUAotICAgIGlmICghdmlldykK
LSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKHRpcC5pc0VtcHR5KCkpIHsKLSAgICAgICAgdmll
dy0+c2V0VG9vbFRpcChRU3RyaW5nKCkpOwotICAgICAgICBRVG9vbFRpcDo6aGlkZVRleHQoKTsK
LSAgICB9IGVsc2UgewotICAgICAgICBRU3RyaW5nIGR0aXAgPSBRTGF0aW4xU3RyaW5nKCI8cD4i
KSArIFFTdHJpbmcodGlwKS50b0h0bWxFc2NhcGVkKCkgKyBRTGF0aW4xU3RyaW5nKCI8L3A+Iik7
Ci0gICAgICAgIHZpZXctPnNldFRvb2xUaXAoZHRpcCk7Ci0gICAgfQotI2Vsc2UKLSAgICBRX1VO
VVNFRCh0aXApOwotI2VuZGlmCi19Ci0KLSNpZiBVU0UoUVRfTVVMVElNRURJQSkKLVFXZWJGdWxs
U2NyZWVuVmlkZW9IYW5kbGVyICpRV2ViUGFnZVByaXZhdGU6OmNyZWF0ZUZ1bGxTY3JlZW5WaWRl
b0hhbmRsZXIoKQotewotICAgIHJldHVybiBuZXcgV2ViS2l0OjpEZWZhdWx0RnVsbFNjcmVlblZp
ZGVvSGFuZGxlcjsKLX0KLSNlbmRpZgotCi1RV2ViRnJhbWVBZGFwdGVyICpRV2ViUGFnZVByaXZh
dGU6Om1haW5GcmFtZUFkYXB0ZXIoKQotewotICAgIHJldHVybiBxLT5tYWluRnJhbWUoKS0+ZDsK
LX0KLQotUVN0cmluZ0xpc3QgUVdlYlBhZ2VQcml2YXRlOjpjaG9vc2VGaWxlcyhRV2ViRnJhbWVB
ZGFwdGVyICpmcmFtZSwgYm9vbCBhbGxvd011bHRpcGxlLCBjb25zdCBRU3RyaW5nTGlzdCAmc3Vn
Z2VzdGVkRmlsZU5hbWVzKQotewotICAgIGlmIChhbGxvd011bHRpcGxlICYmIHEtPnN1cHBvcnRz
RXh0ZW5zaW9uKFFXZWJQYWdlOjpDaG9vc2VNdWx0aXBsZUZpbGVzRXh0ZW5zaW9uKSkgewotICAg
ICAgICBRV2ViUGFnZTo6Q2hvb3NlTXVsdGlwbGVGaWxlc0V4dGVuc2lvbk9wdGlvbiBvcHRpb247
Ci0gICAgICAgIG9wdGlvbi5wYXJlbnRGcmFtZSA9IFFXZWJGcmFtZVByaXZhdGU6OmtpdChmcmFt
ZSk7Ci0gICAgICAgIG9wdGlvbi5zdWdnZXN0ZWRGaWxlTmFtZXMgPSBzdWdnZXN0ZWRGaWxlTmFt
ZXM7Ci0KLSAgICAgICAgUVdlYlBhZ2U6OkNob29zZU11bHRpcGxlRmlsZXNFeHRlbnNpb25SZXR1
cm4gb3V0cHV0OwotICAgICAgICBxLT5leHRlbnNpb24oUVdlYlBhZ2U6OkNob29zZU11bHRpcGxl
RmlsZXNFeHRlbnNpb24sICZvcHRpb24sICZvdXRwdXQpOwotCi0gICAgICAgIHJldHVybiBvdXRw
dXQuZmlsZU5hbWVzOwotICAgIH0KLSAgICAvLyBTaW5nbGUgZmlsZQotICAgIFFTdHJpbmdMaXN0
IHJlc3VsdDsKLSAgICBRU3RyaW5nIHN1Z2dlc3RlZEZpbGU7Ci0gICAgaWYgKCFzdWdnZXN0ZWRG
aWxlTmFtZXMuaXNFbXB0eSgpKQotICAgICAgICBzdWdnZXN0ZWRGaWxlID0gc3VnZ2VzdGVkRmls
ZU5hbWVzLmZpcnN0KCk7Ci0gICAgUVN0cmluZyBmaWxlID0gcS0+Y2hvb3NlRmlsZShRV2ViRnJh
bWVQcml2YXRlOjpraXQoZnJhbWUpLCBzdWdnZXN0ZWRGaWxlKTsKLSAgICBpZiAoIWZpbGUuaXNF
bXB0eSgpKQotICAgICAgICByZXN1bHQgPDwgZmlsZTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQot
Ci1ib29sIFFXZWJQYWdlUHJpdmF0ZTo6YWNjZXB0TmF2aWdhdGlvblJlcXVlc3QoUVdlYkZyYW1l
QWRhcHRlciAqZnJhbWVBZGFwdGVyLCBjb25zdCBRTmV0d29ya1JlcXVlc3QgJnJlcXVlc3QsIGlu
dCB0eXBlKQotewotICAgIFFXZWJGcmFtZSAqZnJhbWUgPSBmcmFtZUFkYXB0ZXIgPyBRV2ViRnJh
bWVQcml2YXRlOjpraXQoZnJhbWVBZGFwdGVyKTogMDsKLSAgICBpZiAoaW5zaWRlT3BlbkNhbGwK
LSAgICAgICAgJiYgZnJhbWUgPT0gbWFpbkZyYW1lLmRhdGEoKSkKLSAgICAgICAgcmV0dXJuIHRy
dWU7Ci0gICAgcmV0dXJuIHEtPmFjY2VwdE5hdmlnYXRpb25SZXF1ZXN0KGZyYW1lLCByZXF1ZXN0
LCBRV2ViUGFnZTo6TmF2aWdhdGlvblR5cGUodHlwZSkpOwotfQotCi12b2lkIFFXZWJQYWdlUHJp
dmF0ZTo6ZW1pdFJlc3RvcmVGcmFtZVN0YXRlUmVxdWVzdGVkKFFXZWJGcmFtZUFkYXB0ZXIgKmZy
YW1lKQotewotICAgIGVtaXQgcS0+cmVzdG9yZUZyYW1lU3RhdGVSZXF1ZXN0ZWQoUVdlYkZyYW1l
UHJpdmF0ZTo6a2l0KGZyYW1lKSk7Ci19Ci0KLXZvaWQgUVdlYlBhZ2VQcml2YXRlOjplbWl0U2F2
ZUZyYW1lU3RhdGVSZXF1ZXN0ZWQoUVdlYkZyYW1lQWRhcHRlciAqZnJhbWUsIFFXZWJIaXN0b3J5
SXRlbSAqaXRlbSkKLXsKLSAgICBlbWl0IHEtPnNhdmVGcmFtZVN0YXRlUmVxdWVzdGVkKFFXZWJG
cmFtZVByaXZhdGU6OmtpdChmcmFtZSksIGl0ZW0pOwotfQotCi12b2lkIFFXZWJQYWdlUHJpdmF0
ZTo6ZW1pdERvd25sb2FkUmVxdWVzdGVkKGNvbnN0IFFOZXR3b3JrUmVxdWVzdCAmcmVxdWVzdCkK
LXsKLSAgICBlbWl0IHEtPmRvd25sb2FkUmVxdWVzdGVkKHJlcXVlc3QpOwotfQotCi12b2lkIFFX
ZWJQYWdlUHJpdmF0ZTo6ZW1pdEZyYW1lQ3JlYXRlZChRV2ViRnJhbWVBZGFwdGVyICpmcmFtZSkK
LXsKLSAgICBlbWl0IHEtPmZyYW1lQ3JlYXRlZChRV2ViRnJhbWVQcml2YXRlOjpraXQoZnJhbWUp
KTsKLX0KLQotYm9vbCBRV2ViUGFnZVByaXZhdGU6OmVycm9yUGFnZUV4dGVuc2lvbihRV2ViUGFn
ZUFkYXB0ZXI6OkVycm9yUGFnZU9wdGlvbiAqb3B0LCBRV2ViUGFnZUFkYXB0ZXI6OkVycm9yUGFn
ZVJldHVybiAqb3V0KQotewotICAgIFFXZWJQYWdlOjpFcnJvclBhZ2VFeHRlbnNpb25PcHRpb24g
b3B0aW9uOwotICAgIGlmIChvcHQtPmRvbWFpbiA9PSBRTGF0aW4xU3RyaW5nKCJRdE5ldHdvcmsi
KSkKLSAgICAgICAgb3B0aW9uLmRvbWFpbiA9IFFXZWJQYWdlOjpRdE5ldHdvcms7Ci0gICAgZWxz
ZSBpZiAob3B0LT5kb21haW4gPT0gUUxhdGluMVN0cmluZygiSFRUUCIpKQotICAgICAgICBvcHRp
b24uZG9tYWluID0gUVdlYlBhZ2U6Okh0dHA7Ci0gICAgZWxzZSBpZiAob3B0LT5kb21haW4gPT0g
UUxhdGluMVN0cmluZygiV2ViS2l0IikpCi0gICAgICAgIG9wdGlvbi5kb21haW4gPSBRV2ViUGFn
ZTo6V2ViS2l0OwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIG9wdGlvbi51
cmwgPSBvcHQtPnVybDsKLSAgICBvcHRpb24uZnJhbWUgPSBRV2ViRnJhbWVQcml2YXRlOjpraXQo
b3B0LT5mcmFtZSk7Ci0gICAgb3B0aW9uLmVycm9yID0gb3B0LT5lcnJvcjsKLSAgICBvcHRpb24u
ZXJyb3JTdHJpbmcgPSBvcHQtPmVycm9yU3RyaW5nOwotICAgIFFXZWJQYWdlOjpFcnJvclBhZ2VF
eHRlbnNpb25SZXR1cm4gb3V0cHV0OwotICAgIGlmICghcS0+ZXh0ZW5zaW9uKFFXZWJQYWdlOjpF
cnJvclBhZ2VFeHRlbnNpb24sICZvcHRpb24sICZvdXRwdXQpKQotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0gICAgb3V0LT5iYXNlVXJsID0gb3V0cHV0LmJhc2VVcmw7Ci0gICAgb3V0LT5jb250ZW50
ID0gb3V0cHV0LmNvbnRlbnQ7Ci0gICAgb3V0LT5jb250ZW50VHlwZSA9IG91dHB1dC5jb250ZW50
VHlwZTsKLSAgICBvdXQtPmVuY29kaW5nID0gb3V0cHV0LmVuY29kaW5nOwotICAgIHJldHVybiB0
cnVlOwotfQotCi1RdFBsdWdpbldpZGdldEFkYXB0ZXIgKlFXZWJQYWdlUHJpdmF0ZTo6Y3JlYXRl
UGx1Z2luKGNvbnN0IFFTdHJpbmcgJmNsYXNzaWQsIGNvbnN0IFFVcmwgJnVybCwgY29uc3QgUVN0
cmluZ0xpc3QgJnBhcmFtTmFtZXMsIGNvbnN0IFFTdHJpbmdMaXN0ICZwYXJhbVZhbHVlcykKLXsK
LSAgICBRT2JqZWN0ICp3aWRnZXQgPSBxLT5jcmVhdGVQbHVnaW4oY2xhc3NpZCwgdXJsLCBwYXJh
bU5hbWVzLCBwYXJhbVZhbHVlcyk7Ci0gICAgcmV0dXJuIGFkYXB0ZXJGb3JXaWRnZXQod2lkZ2V0
KTsKLX0KLQotUXRQbHVnaW5XaWRnZXRBZGFwdGVyICpRV2ViUGFnZVByaXZhdGU6OmFkYXB0ZXJG
b3JXaWRnZXQoUU9iamVjdCAqb2JqZWN0KSBjb25zdAotewotICAgIGlmIChRV2lkZ2V0ICp3aWRn
ZXQgPSBxb2JqZWN0X2Nhc3Q8UVdpZGdldCo+KG9iamVjdCkpCi0gICAgICAgIHJldHVybiBuZXcg
UVdpZGdldFBsdWdpbkltcGwod2lkZ2V0KTsKLSAgICBpZiAoUUdyYXBoaWNzV2lkZ2V0ICp3aWRn
ZXQgPSBxb2JqZWN0X2Nhc3Q8UUdyYXBoaWNzV2lkZ2V0Kj4ob2JqZWN0KSkKLSAgICAgICAgcmV0
dXJuIG5ldyBRR3JhcGhpY3NXaWRnZXRQbHVnaW5JbXBsKHdpZGdldCk7Ci0gICAgcmV0dXJuIDA7
Ci19Ci0KLXZvaWQgUVdlYlBhZ2VQcml2YXRlOjpjcmVhdGVNYWluRnJhbWUoKQotewotICAgIGlm
ICghbWFpbkZyYW1lKSB7Ci0gICAgICAgIG1haW5GcmFtZSA9IG5ldyBRV2ViRnJhbWUocSk7Ci0g
ICAgICAgIGVtaXQgcS0+ZnJhbWVDcmVhdGVkKG1haW5GcmFtZS5kYXRhKCkpOwotICAgIH0KLX0K
LQotc3RhdGljIFFXZWJQYWdlOjpXZWJBY3Rpb24gd2ViQWN0aW9uRm9yQ29udGV4dE1lbnVBY3Rp
b24oV2ViQ29yZTo6Q29udGV4dE1lbnVBY3Rpb24gYWN0aW9uKQotewotICAgIHN3aXRjaCAoYWN0
aW9uKSB7Ci0gICAgICAgIGNhc2UgV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtVGFnT3Blbkxpbms6
IHJldHVybiBRV2ViUGFnZTo6T3Blbkxpbms7Ci0gICAgICAgIGNhc2UgV2ViQ29yZTo6Q29udGV4
dE1lbnVJdGVtVGFnT3BlbkxpbmtJbk5ld1dpbmRvdzogcmV0dXJuIFFXZWJQYWdlOjpPcGVuTGlu
a0luTmV3V2luZG93OwotICAgICAgICBjYXNlIFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbVRhZ09w
ZW5MaW5rSW5UaGlzV2luZG93OiByZXR1cm4gUVdlYlBhZ2U6Ok9wZW5MaW5rSW5UaGlzV2luZG93
OwotICAgICAgICBjYXNlIFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbVRhZ0Rvd25sb2FkTGlua1Rv
RGlzazogcmV0dXJuIFFXZWJQYWdlOjpEb3dubG9hZExpbmtUb0Rpc2s7Ci0gICAgICAgIGNhc2Ug
V2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtVGFnQ29weUxpbmtUb0NsaXBib2FyZDogcmV0dXJuIFFX
ZWJQYWdlOjpDb3B5TGlua1RvQ2xpcGJvYXJkOwotICAgICAgICBjYXNlIFdlYkNvcmU6OkNvbnRl
eHRNZW51SXRlbVRhZ09wZW5JbWFnZUluTmV3V2luZG93OiByZXR1cm4gUVdlYlBhZ2U6Ok9wZW5J
bWFnZUluTmV3V2luZG93OwotICAgICAgICBjYXNlIFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbVRh
Z0Rvd25sb2FkSW1hZ2VUb0Rpc2s6IHJldHVybiBRV2ViUGFnZTo6RG93bmxvYWRJbWFnZVRvRGlz
azsKLSAgICAgICAgY2FzZSBXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW1UYWdDb3B5SW1hZ2VUb0Ns
aXBib2FyZDogcmV0dXJuIFFXZWJQYWdlOjpDb3B5SW1hZ2VUb0NsaXBib2FyZDsKLSAgICAgICAg
Y2FzZSBXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW1UYWdDb3B5SW1hZ2VVcmxUb0NsaXBib2FyZDog
cmV0dXJuIFFXZWJQYWdlOjpDb3B5SW1hZ2VVcmxUb0NsaXBib2FyZDsKLSAgICAgICAgY2FzZSBX
ZWJDb3JlOjpDb250ZXh0TWVudUl0ZW1UYWdPcGVuRnJhbWVJbk5ld1dpbmRvdzogcmV0dXJuIFFX
ZWJQYWdlOjpPcGVuRnJhbWVJbk5ld1dpbmRvdzsKLSAgICAgICAgY2FzZSBXZWJDb3JlOjpDb250
ZXh0TWVudUl0ZW1UYWdDb3B5OiByZXR1cm4gUVdlYlBhZ2U6OkNvcHk7Ci0gICAgICAgIGNhc2Ug
V2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtVGFnR29CYWNrOiByZXR1cm4gUVdlYlBhZ2U6OkJhY2s7
Ci0gICAgICAgIGNhc2UgV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtVGFnR29Gb3J3YXJkOiByZXR1
cm4gUVdlYlBhZ2U6OkZvcndhcmQ7Ci0gICAgICAgIGNhc2UgV2ViQ29yZTo6Q29udGV4dE1lbnVJ
dGVtVGFnU3RvcDogcmV0dXJuIFFXZWJQYWdlOjpTdG9wOwotICAgICAgICBjYXNlIFdlYkNvcmU6
OkNvbnRleHRNZW51SXRlbVRhZ1JlbG9hZDogcmV0dXJuIFFXZWJQYWdlOjpSZWxvYWQ7Ci0gICAg
ICAgIGNhc2UgV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtVGFnQ3V0OiByZXR1cm4gUVdlYlBhZ2U6
OkN1dDsKLSAgICAgICAgY2FzZSBXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW1UYWdQYXN0ZTogcmV0
dXJuIFFXZWJQYWdlOjpQYXN0ZTsKLSAgICAgICAgY2FzZSBXZWJDb3JlOjpDb250ZXh0TWVudUl0
ZW1UYWdEZWZhdWx0RGlyZWN0aW9uOiByZXR1cm4gUVdlYlBhZ2U6OlNldFRleHREaXJlY3Rpb25E
ZWZhdWx0OwotICAgICAgICBjYXNlIFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbVRhZ0xlZnRUb1Jp
Z2h0OiByZXR1cm4gUVdlYlBhZ2U6OlNldFRleHREaXJlY3Rpb25MZWZ0VG9SaWdodDsKLSAgICAg
ICAgY2FzZSBXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW1UYWdSaWdodFRvTGVmdDogcmV0dXJuIFFX
ZWJQYWdlOjpTZXRUZXh0RGlyZWN0aW9uUmlnaHRUb0xlZnQ7Ci0gICAgICAgIGNhc2UgV2ViQ29y
ZTo6Q29udGV4dE1lbnVJdGVtVGFnQm9sZDogcmV0dXJuIFFXZWJQYWdlOjpUb2dnbGVCb2xkOwot
ICAgICAgICBjYXNlIFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbVRhZ0l0YWxpYzogcmV0dXJuIFFX
ZWJQYWdlOjpUb2dnbGVJdGFsaWM7Ci0gICAgICAgIGNhc2UgV2ViQ29yZTo6Q29udGV4dE1lbnVJ
dGVtVGFnVW5kZXJsaW5lOiByZXR1cm4gUVdlYlBhZ2U6OlRvZ2dsZVVuZGVybGluZTsKLSAgICAg
ICAgY2FzZSBXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW1UYWdTZWxlY3RBbGw6IHJldHVybiBRV2Vi
UGFnZTo6U2VsZWN0QWxsOwotI2lmIEVOQUJMRShJTlNQRUNUT1IpCi0gICAgICAgIGNhc2UgV2Vi
Q29yZTo6Q29udGV4dE1lbnVJdGVtVGFnSW5zcGVjdEVsZW1lbnQ6IHJldHVybiBRV2ViUGFnZTo6
SW5zcGVjdEVsZW1lbnQ7Ci0jZW5kaWYKLSAgICAgICAgZGVmYXVsdDogYnJlYWs7Ci0gICAgfQot
ICAgIHJldHVybiBRV2ViUGFnZTo6Tm9XZWJBY3Rpb247Ci19Ci0KLSNpZm5kZWYgUVRfTk9fQ09O
VEVYVE1FTlUKLVFNZW51ICpRV2ViUGFnZVByaXZhdGU6OmNyZWF0ZUNvbnRleHRNZW51KGNvbnN0
IFdlYkNvcmU6OkNvbnRleHRNZW51ICp3ZWJjb3JlTWVudSwKLSAgICAgICAgY29uc3QgUUxpc3Q8
V2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtPiAqaXRlbXMsIFFCaXRBcnJheSAqdmlzaXRlZFdlYkFj
dGlvbnMpCi17Ci0gICAgaWYgKCFjbGllbnQgfHwgIXdlYmNvcmVNZW51KQotICAgICAgICByZXR1
cm4gMDsKLQotICAgIFFNZW51KiBtZW51ID0gbmV3IFFNZW51KHEtPnZpZXcoKSk7Ci0gICAgZm9y
IChpbnQgaSA9IDA7IGkgPCBpdGVtcy0+Y291bnQoKTsgKytpKSB7Ci0gICAgICAgIGNvbnN0IENv
bnRleHRNZW51SXRlbSAmaXRlbSA9IGl0ZW1zLT5hdChpKTsKLSAgICAgICAgc3dpdGNoIChpdGVt
LnR5cGUoKSkgewotICAgICAgICBjYXNlIFdlYkNvcmU6OkNoZWNrYWJsZUFjdGlvblR5cGU6IC8q
IGZhbGwgdGhyb3VnaCAqLwotICAgICAgICBjYXNlIFdlYkNvcmU6OkFjdGlvblR5cGU6IHsKLSAg
ICAgICAgICAgIFFXZWJQYWdlOjpXZWJBY3Rpb24gYWN0aW9uID0gd2ViQWN0aW9uRm9yQ29udGV4
dE1lbnVBY3Rpb24oaXRlbS5hY3Rpb24oKSk7Ci0gICAgICAgICAgICBRQWN0aW9uICphID0gcS0+
YWN0aW9uKGFjdGlvbik7Ci0gICAgICAgICAgICBpZiAoYSkgewotICAgICAgICAgICAgICAgIENv
bnRleHRNZW51SXRlbSBpdChpdGVtKTsKLSAgICAgICAgICAgICAgICBwYWdlLT5jb250ZXh0TWVu
dUNvbnRyb2xsZXIoKS0+Y2hlY2tPckVuYWJsZUlmTmVlZGVkKGl0KTsKLSAgICAgICAgICAgICAg
ICBQbGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb24gZGVzYyA9IGl0LnJlbGVhc2VQbGF0Zm9ybURl
c2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgYS0+c2V0RW5hYmxlZChkZXNjLmVuYWJsZWQp
OwotICAgICAgICAgICAgICAgIGEtPnNldENoZWNrZWQoZGVzYy5jaGVja2VkKTsKLSAgICAgICAg
ICAgICAgICBhLT5zZXRDaGVja2FibGUoaXRlbS50eXBlKCkgPT0gV2ViQ29yZTo6Q2hlY2thYmxl
QWN0aW9uVHlwZSk7Ci0KLSAgICAgICAgICAgICAgICBtZW51LT5hZGRBY3Rpb24oYSk7Ci0gICAg
ICAgICAgICAgICAgdmlzaXRlZFdlYkFjdGlvbnMtPnNldEJpdChhY3Rpb24pOwotICAgICAgICAg
ICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBXZWJDb3Jl
OjpTZXBhcmF0b3JUeXBlOgotICAgICAgICAgICAgbWVudS0+YWRkU2VwYXJhdG9yKCk7Ci0gICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBXZWJDb3JlOjpTdWJtZW51VHlwZTogewotICAg
ICAgICAgICAgUU1lbnUgKnN1Yk1lbnUgPSBjcmVhdGVDb250ZXh0TWVudSh3ZWJjb3JlTWVudSwg
aXRlbS5wbGF0Zm9ybVN1Yk1lbnUoKSwgdmlzaXRlZFdlYkFjdGlvbnMpOwotCi0gICAgICAgICAg
ICBib29sIGFueUVuYWJsZWRBY3Rpb24gPSBmYWxzZTsKLQotICAgICAgICAgICAgUUxpc3Q8UUFj
dGlvbiAqPiBhY3Rpb25zID0gc3ViTWVudS0+YWN0aW9ucygpOwotICAgICAgICAgICAgZm9yIChp
bnQgaSA9IDA7IGkgPCBhY3Rpb25zLmNvdW50KCk7ICsraSkgewotICAgICAgICAgICAgICAgIGlm
IChhY3Rpb25zLmF0KGkpLT5pc1Zpc2libGUoKSkKLSAgICAgICAgICAgICAgICAgICAgYW55RW5h
YmxlZEFjdGlvbiB8PSBhY3Rpb25zLmF0KGkpLT5pc0VuYWJsZWQoKTsKLSAgICAgICAgICAgIH0K
LQotICAgICAgICAgICAgLy8gZG9uJ3Qgc2hvdyBzdWItbWVudXMgd2l0aCBqdXN0IGRpc2FibGVk
IGFjdGlvbnMKLSAgICAgICAgICAgIGlmIChhbnlFbmFibGVkQWN0aW9uKSB7Ci0gICAgICAgICAg
ICAgICAgc3ViTWVudS0+c2V0VGl0bGUoaXRlbS50aXRsZSgpKTsKLSAgICAgICAgICAgICAgICBt
ZW51LT5hZGRBY3Rpb24oc3ViTWVudS0+bWVudUFjdGlvbigpKTsKLSAgICAgICAgICAgIH0gZWxz
ZQotICAgICAgICAgICAgICAgIGRlbGV0ZSBzdWJNZW51OwotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbWVudTsKLX0KLSNlbmRpZiAv
LyBRVF9OT19DT05URVhUTUVOVQotCi0jaWZuZGVmIFFUX05PX0FDVElPTgotdm9pZCBRV2ViUGFn
ZVByaXZhdGU6Ol9xX3dlYkFjdGlvblRyaWdnZXJlZChib29sIGNoZWNrZWQpCi17Ci0gICAgUUFj
dGlvbiAqYSA9IHFvYmplY3RfY2FzdDxRQWN0aW9uICo+KHEtPnNlbmRlcigpKTsKLSAgICBpZiAo
IWEpCi0gICAgICAgIHJldHVybjsKLSAgICBRV2ViUGFnZTo6V2ViQWN0aW9uIGFjdGlvbiA9IHN0
YXRpY19jYXN0PFFXZWJQYWdlOjpXZWJBY3Rpb24+KGEtPmRhdGEoKS50b0ludCgpKTsKLSAgICBx
LT50cmlnZ2VyQWN0aW9uKGFjdGlvbiwgY2hlY2tlZCk7Ci19Ci0jZW5kaWYgLy8gUVRfTk9fQUNU
SU9OCi0KLXZvaWQgUVdlYlBhZ2VQcml2YXRlOjpfcV9jbGVhbnVwTGVha01lc3NhZ2VzKCkKLXsK
LSNpZm5kZWYgTkRFQlVHCi0gICAgLy8gTmVlZCB0aGlzIHRvIG1ha2UgbGVhayBtZXNzYWdlcyBh
Y2N1cmF0ZS4KLSAgICBtZW1vcnlDYWNoZSgpLT5zZXRDYXBhY2l0aWVzKDAsIDAsIDApOwotI2Vu
ZGlmCi19Ci0KLXZvaWQgUVdlYlBhZ2VQcml2YXRlOjp1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6Oldl
YkFjdGlvbiBhY3Rpb24pCi17Ci0jaWZkZWYgUVRfTk9fQUNUSU9OCi0gICAgUV9VTlVTRUQoYWN0
aW9uKQotI2Vsc2UKLSAgICBRQWN0aW9uICphID0gYWN0aW9uc1thY3Rpb25dOwotICAgIGlmICgh
YSB8fCAhbWFpbkZyYW1lKQotICAgICAgICByZXR1cm47Ci0KLSAgICBXZWJDb3JlOjpGcmFtZUxv
YWRlciAqbG9hZGVyID0gbWFpbkZyYW1lLmRhdGEoKS0+ZC0+ZnJhbWUtPmxvYWRlcigpOwotICAg
IFdlYkNvcmU6OkVkaXRvciAqZWRpdG9yID0gcGFnZS0+Zm9jdXNDb250cm9sbGVyKCktPmZvY3Vz
ZWRPck1haW5GcmFtZSgpLT5lZGl0b3IoKTsKLQotICAgIGJvb2wgZW5hYmxlZCA9IGEtPmlzRW5h
YmxlZCgpOwotICAgIGJvb2wgY2hlY2tlZCA9IGEtPmlzQ2hlY2tlZCgpOwotCi0gICAgc3dpdGNo
IChhY3Rpb24pIHsKLSAgICAgICAgY2FzZSBRV2ViUGFnZTo6QmFjazoKLSAgICAgICAgICAgIGVu
YWJsZWQgPSBwYWdlLT5jYW5Hb0JhY2tPckZvcndhcmQoLTEpOwotICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgIGNhc2UgUVdlYlBhZ2U6OkZvcndhcmQ6Ci0gICAgICAgICAgICBlbmFibGVkID0g
cGFnZS0+Y2FuR29CYWNrT3JGb3J3YXJkKDEpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
IGNhc2UgUVdlYlBhZ2U6OlN0b3A6Ci0gICAgICAgICAgICBlbmFibGVkID0gbG9hZGVyLT5pc0xv
YWRpbmcoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFFXZWJQYWdlOjpSZWxv
YWQ6Ci0gICAgICAgIGNhc2UgUVdlYlBhZ2U6OlJlbG9hZEFuZEJ5cGFzc0NhY2hlOgotICAgICAg
ICAgICAgZW5hYmxlZCA9ICFsb2FkZXItPmlzTG9hZGluZygpOwotICAgICAgICAgICAgYnJlYWs7
Ci0jaWZuZGVmIFFUX05PX1VORE9TVEFDSwotICAgICAgICBjYXNlIFFXZWJQYWdlOjpVbmRvOgot
ICAgICAgICBjYXNlIFFXZWJQYWdlOjpSZWRvOgotICAgICAgICAgICAgLy8gdGhvc2UgdHdvIGFy
ZSBoYW5kbGVkIGJ5IFFVbmRvU3RhY2sKLSAgICAgICAgICAgIGJyZWFrOwotI2VuZGlmIC8vIFFU
X05PX1VORE9TVEFDSwotICAgICAgICBjYXNlIFFXZWJQYWdlOjpTZWxlY3RBbGw6IC8vIGVkaXRv
ciBjb21tYW5kIGlzIGFsd2F5cyBlbmFibGVkCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAg
Y2FzZSBRV2ViUGFnZTo6U2V0VGV4dERpcmVjdGlvbkRlZmF1bHQ6Ci0gICAgICAgIGNhc2UgUVdl
YlBhZ2U6OlNldFRleHREaXJlY3Rpb25MZWZ0VG9SaWdodDoKLSAgICAgICAgY2FzZSBRV2ViUGFn
ZTo6U2V0VGV4dERpcmVjdGlvblJpZ2h0VG9MZWZ0OgotICAgICAgICAgICAgZW5hYmxlZCA9IGVk
aXRvci0+Y2FuRWRpdCgpOwotICAgICAgICAgICAgY2hlY2tlZCA9IGZhbHNlOwotICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgIC8vIHNlZSBpZiBpdCdz
IGFuIGVkaXRvciBjb21tYW5kCi0gICAgICAgICAgICBjb25zdCBjaGFyKiBjb21tYW5kTmFtZSA9
IGVkaXRvckNvbW1hbmRGb3JXZWJBY3Rpb25zKGFjdGlvbik7Ci0KLSAgICAgICAgICAgIC8vIGlm
IGl0J3MgYW4gZWRpdG9yIGNvbW1hbmQsIGxldCBpdCdzIGxvZ2ljIGRldGVybWluZSBzdGF0ZQot
ICAgICAgICAgICAgaWYgKGNvbW1hbmROYW1lKSB7Ci0gICAgICAgICAgICAgICAgRWRpdG9yOjpD
b21tYW5kIGNvbW1hbmQgPSBlZGl0b3ItPmNvbW1hbmQoY29tbWFuZE5hbWUpOwotICAgICAgICAg
ICAgICAgIGVuYWJsZWQgPSBjb21tYW5kLmlzRW5hYmxlZCgpOwotICAgICAgICAgICAgICAgIGlm
IChlbmFibGVkKQotICAgICAgICAgICAgICAgICAgICBjaGVja2VkID0gY29tbWFuZC5zdGF0ZSgp
ICE9IEZhbHNlVHJpU3RhdGU7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAg
ICAgICBjaGVja2VkID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsK
LSAgICAgICAgfQotICAgIH0KLQotICAgIGEtPnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0KLSAgICBp
ZiAoYS0+aXNDaGVja2FibGUoKSkKLSAgICAgICAgYS0+c2V0Q2hlY2tlZChjaGVja2VkKTsKLSNl
bmRpZiAvLyBRVF9OT19BQ1RJT04KLX0KLQotdm9pZCBRV2ViUGFnZVByaXZhdGU6OnVwZGF0ZU5h
dmlnYXRpb25BY3Rpb25zKCkKLXsKLSAgICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6OkJhY2spOwot
ICAgIHVwZGF0ZUFjdGlvbihRV2ViUGFnZTo6Rm9yd2FyZCk7Ci0gICAgdXBkYXRlQWN0aW9uKFFX
ZWJQYWdlOjpTdG9wKTsKLSAgICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6OlJlbG9hZCk7Ci0gICAg
dXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpSZWxvYWRBbmRCeXBhc3NDYWNoZSk7Ci19Ci0KLVFPYmpl
Y3QgKlFXZWJQYWdlUHJpdmF0ZTo6aW5zcGVjdG9ySGFuZGxlKCkKLXsKLSAgICByZXR1cm4gZ2V0
T3JDcmVhdGVJbnNwZWN0b3IoKTsKLX0KLQotdm9pZCBRV2ViUGFnZVByaXZhdGU6OnNldEluc3Bl
Y3RvckZyb250ZW5kKFFPYmplY3QqIGZyb250ZW5kKQotewotICAgIGluc3BlY3RvckZyb250ZW5k
ID0gcW9iamVjdF9jYXN0PFFXaWRnZXQqPihmcm9udGVuZCk7Ci0gICAgaWYgKGluc3BlY3RvcikK
LSAgICAgICAgaW5zcGVjdG9yLT5kLT5zZXRGcm9udGVuZChmcm9udGVuZCk7Ci19Ci0KLXZvaWQg
UVdlYlBhZ2VQcml2YXRlOjpzZXRJbnNwZWN0b3JXaW5kb3dUaXRsZShjb25zdCBRU3RyaW5nJiB0
aXRsZSkKLXsKLSAgICBpZiAoaW5zcGVjdG9yKQotICAgICAgICBpbnNwZWN0b3ItPnNldFdpbmRv
d1RpdGxlKHRpdGxlKTsKLX0KLQotdm9pZCBRV2ViUGFnZVByaXZhdGU6OmNyZWF0ZVdlYkluc3Bl
Y3RvcihRT2JqZWN0KiogaW5zcGVjdG9yVmlldywgUVdlYlBhZ2VBZGFwdGVyKiogaW5zcGVjdG9y
UGFnZSkKLXsKLSAgICBRV2ViUGFnZSogcGFnZSA9IG5ldyBXZWJLaXQ6Okluc3BlY3RvckNsaWVu
dFdlYlBhZ2U7Ci0gICAgKmluc3BlY3RvclZpZXcgPSBwYWdlLT52aWV3KCk7Ci0gICAgKmluc3Bl
Y3RvclBhZ2UgPSBwYWdlLT5kOwotfQotCi0jaWZuZGVmIFFUX05PX01FTlUKLXN0YXRpYyBRU3Ry
aW5nTGlzdCBpdGVyYXRlQ29udGV4dE1lbnUoUU1lbnUqIG1lbnUpCi17Ci0gICAgaWYgKCFtZW51
KQotICAgICAgICByZXR1cm4gUVN0cmluZ0xpc3QoKTsKLQotICAgIFFTdHJpbmdMaXN0IGl0ZW1z
OwotICAgIFFMaXN0PFFBY3Rpb24gKj4gYWN0aW9ucyA9IG1lbnUtPmFjdGlvbnMoKTsKLSAgICBm
b3IgKGludCBpID0gMDsgaSA8IGFjdGlvbnMuY291bnQoKTsgKytpKSB7Ci0gICAgICAgIGlmIChh
Y3Rpb25zLmF0KGkpLT5pc1NlcGFyYXRvcigpKQotICAgICAgICAgICAgaXRlbXMgPDwgUUxhdGlu
MVN0cmluZygiPHNlcGFyYXRvcj4iKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgaXRlbXMg
PDwgYWN0aW9ucy5hdChpKS0+dGV4dCgpOwotICAgICAgICBpZiAoYWN0aW9ucy5hdChpKS0+bWVu
dSgpKQotICAgICAgICAgICAgaXRlbXMgPDwgaXRlcmF0ZUNvbnRleHRNZW51KGFjdGlvbnMuYXQo
aSktPm1lbnUoKSk7Ci0gICAgfQotICAgIHJldHVybiBpdGVtczsKLX0KLSNlbmRpZgotCi1RU3Ry
aW5nTGlzdCBRV2ViUGFnZVByaXZhdGU6Om1lbnVBY3Rpb25zQXNUZXh0KCkKLXsKLSNpZm5kZWYg
UVRfTk9fTUVOVQotICAgIHJldHVybiBpdGVyYXRlQ29udGV4dE1lbnUoY3VycmVudENvbnRleHRN
ZW51LmRhdGEoKSk7Ci0jZWxzZQotICAgIHJldHVybiBRU3RyaW5nTGlzdCgpOwotI2VuZGlmCi19
Ci0KLXZvaWQgUVdlYlBhZ2VQcml2YXRlOjplbWl0Vmlld3BvcnRDaGFuZ2VSZXF1ZXN0ZWQoKQot
ewotICAgIGVtaXQgcS0+dmlld3BvcnRDaGFuZ2VSZXF1ZXN0ZWQoKTsKLX0KLQotdm9pZCBRV2Vi
UGFnZVByaXZhdGU6OnVwZGF0ZUVkaXRvckFjdGlvbnMoKQotewotICAgIHVwZGF0ZUFjdGlvbihR
V2ViUGFnZTo6Q3V0KTsKLSAgICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6OkNvcHkpOwotICAgIHVw
ZGF0ZUFjdGlvbihRV2ViUGFnZTo6UGFzdGUpOwotICAgIHVwZGF0ZUFjdGlvbihRV2ViUGFnZTo6
TW92ZVRvTmV4dENoYXIpOwotICAgIHVwZGF0ZUFjdGlvbihRV2ViUGFnZTo6TW92ZVRvUHJldmlv
dXNDaGFyKTsKLSAgICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6Ok1vdmVUb05leHRXb3JkKTsKLSAg
ICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6Ok1vdmVUb1ByZXZpb3VzV29yZCk7Ci0gICAgdXBkYXRl
QWN0aW9uKFFXZWJQYWdlOjpNb3ZlVG9OZXh0TGluZSk7Ci0gICAgdXBkYXRlQWN0aW9uKFFXZWJQ
YWdlOjpNb3ZlVG9QcmV2aW91c0xpbmUpOwotICAgIHVwZGF0ZUFjdGlvbihRV2ViUGFnZTo6TW92
ZVRvU3RhcnRPZkxpbmUpOwotICAgIHVwZGF0ZUFjdGlvbihRV2ViUGFnZTo6TW92ZVRvRW5kT2ZM
aW5lKTsKLSAgICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6Ok1vdmVUb1N0YXJ0T2ZCbG9jayk7Ci0g
ICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpNb3ZlVG9FbmRPZkJsb2NrKTsKLSAgICB1cGRhdGVB
Y3Rpb24oUVdlYlBhZ2U6Ok1vdmVUb1N0YXJ0T2ZEb2N1bWVudCk7Ci0gICAgdXBkYXRlQWN0aW9u
KFFXZWJQYWdlOjpNb3ZlVG9FbmRPZkRvY3VtZW50KTsKLSAgICB1cGRhdGVBY3Rpb24oUVdlYlBh
Z2U6OlNlbGVjdE5leHRDaGFyKTsKLSAgICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6OlNlbGVjdFBy
ZXZpb3VzQ2hhcik7Ci0gICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpTZWxlY3ROZXh0V29yZCk7
Ci0gICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpTZWxlY3RQcmV2aW91c1dvcmQpOwotICAgIHVw
ZGF0ZUFjdGlvbihRV2ViUGFnZTo6U2VsZWN0TmV4dExpbmUpOwotICAgIHVwZGF0ZUFjdGlvbihR
V2ViUGFnZTo6U2VsZWN0UHJldmlvdXNMaW5lKTsKLSAgICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6
OlNlbGVjdFN0YXJ0T2ZMaW5lKTsKLSAgICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6OlNlbGVjdEVu
ZE9mTGluZSk7Ci0gICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpTZWxlY3RTdGFydE9mQmxvY2sp
OwotICAgIHVwZGF0ZUFjdGlvbihRV2ViUGFnZTo6U2VsZWN0RW5kT2ZCbG9jayk7Ci0gICAgdXBk
YXRlQWN0aW9uKFFXZWJQYWdlOjpTZWxlY3RTdGFydE9mRG9jdW1lbnQpOwotICAgIHVwZGF0ZUFj
dGlvbihRV2ViUGFnZTo6U2VsZWN0RW5kT2ZEb2N1bWVudCk7Ci0gICAgdXBkYXRlQWN0aW9uKFFX
ZWJQYWdlOjpEZWxldGVTdGFydE9mV29yZCk7Ci0gICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpE
ZWxldGVFbmRPZldvcmQpOwotICAgIHVwZGF0ZUFjdGlvbihRV2ViUGFnZTo6U2V0VGV4dERpcmVj
dGlvbkRlZmF1bHQpOwotICAgIHVwZGF0ZUFjdGlvbihRV2ViUGFnZTo6U2V0VGV4dERpcmVjdGlv
bkxlZnRUb1JpZ2h0KTsKLSAgICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6OlNldFRleHREaXJlY3Rp
b25SaWdodFRvTGVmdCk7Ci0gICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpUb2dnbGVCb2xkKTsK
LSAgICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6OlRvZ2dsZUl0YWxpYyk7Ci0gICAgdXBkYXRlQWN0
aW9uKFFXZWJQYWdlOjpUb2dnbGVVbmRlcmxpbmUpOwotICAgIHVwZGF0ZUFjdGlvbihRV2ViUGFn
ZTo6SW5zZXJ0UGFyYWdyYXBoU2VwYXJhdG9yKTsKLSAgICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6
Okluc2VydExpbmVTZXBhcmF0b3IpOwotICAgIHVwZGF0ZUFjdGlvbihRV2ViUGFnZTo6UGFzdGVB
bmRNYXRjaFN0eWxlKTsKLSAgICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6OlJlbW92ZUZvcm1hdCk7
Ci0gICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpUb2dnbGVTdHJpa2V0aHJvdWdoKTsKLSAgICB1
cGRhdGVBY3Rpb24oUVdlYlBhZ2U6OlRvZ2dsZVN1YnNjcmlwdCk7Ci0gICAgdXBkYXRlQWN0aW9u
KFFXZWJQYWdlOjpUb2dnbGVTdXBlcnNjcmlwdCk7Ci0gICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdl
OjpJbnNlcnRVbm9yZGVyZWRMaXN0KTsKLSAgICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6Okluc2Vy
dE9yZGVyZWRMaXN0KTsKLSAgICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6OkluZGVudCk7Ci0gICAg
dXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpPdXRkZW50KTsKLSAgICB1cGRhdGVBY3Rpb24oUVdlYlBh
Z2U6OkFsaWduQ2VudGVyKTsKLSAgICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6OkFsaWduSnVzdGlm
aWVkKTsKLSAgICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6OkFsaWduTGVmdCk7Ci0gICAgdXBkYXRl
QWN0aW9uKFFXZWJQYWdlOjpBbGlnblJpZ2h0KTsKLX0KLQotdm9pZCBRV2ViUGFnZVByaXZhdGU6
OnRpbWVyRXZlbnQoUVRpbWVyRXZlbnQgKmV2KQotewotICAgIGludCB0aW1lcklkID0gZXYtPnRp
bWVySWQoKTsKLSAgICBpZiAodGltZXJJZCA9PSB0cmlwbGVDbGlja1RpbWVyLnRpbWVySWQoKSkK
LSAgICAgICAgdHJpcGxlQ2xpY2tUaW1lci5zdG9wKCk7Ci0gICAgZWxzZQotICAgICAgICBxLT50
aW1lckV2ZW50KGV2KTsKLX0KLQotdm9pZCBRV2ViUGFnZVByaXZhdGU6Om1vdXNlTW92ZUV2ZW50
KFFNb3VzZUV2ZW50KiBldikKLXsKLSAgICBXZWJDb3JlOjpGcmFtZSogZnJhbWUgPSBRV2ViRnJh
bWVQcml2YXRlOjpjb3JlKG1haW5GcmFtZS5kYXRhKCkpOwotICAgIGlmICghZnJhbWUtPnZpZXco
KSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgYm9vbCBhY2NlcHRlZCA9IGZyYW1lLT5ldmVudEhh
bmRsZXIoKS0+bW91c2VNb3ZlZChjb252ZXJ0TW91c2VFdmVudChldiwgMCkpOwotICAgIGV2LT5z
ZXRBY2NlcHRlZChhY2NlcHRlZCk7Ci19Ci0KLXZvaWQgUVdlYlBhZ2VQcml2YXRlOjptb3VzZVBy
ZXNzRXZlbnQoUU1vdXNlRXZlbnQqIGV2KQotewotICAgIFdlYkNvcmU6OkZyYW1lKiBmcmFtZSA9
IFFXZWJGcmFtZVByaXZhdGU6OmNvcmUobWFpbkZyYW1lLmRhdGEoKSk7Ci0gICAgaWYgKCFmcmFt
ZS0+dmlldygpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBSZWZQdHI8V2ViQ29yZTo6Tm9kZT4g
b2xkTm9kZTsKLSAgICBGcmFtZSogZm9jdXNlZEZyYW1lID0gcGFnZS0+Zm9jdXNDb250cm9sbGVy
KCktPmZvY3VzZWRGcmFtZSgpOwotICAgIGlmIChEb2N1bWVudCogZm9jdXNlZERvY3VtZW50ID0g
Zm9jdXNlZEZyYW1lID8gZm9jdXNlZEZyYW1lLT5kb2N1bWVudCgpIDogMCkKLSAgICAgICAgb2xk
Tm9kZSA9IGZvY3VzZWREb2N1bWVudC0+Zm9jdXNlZE5vZGUoKTsKLQotICAgIGlmICh0cmlwbGVD
bGlja1RpbWVyLmlzQWN0aXZlKCkKLSAgICAgICAgICAgICYmIChldi0+cG9zKCkgLSB0cmlwbGVD
bGljaykubWFuaGF0dGFuTGVuZ3RoKCkKLSAgICAgICAgICAgICAgICA8IFFBcHBsaWNhdGlvbjo6
c3RhcnREcmFnRGlzdGFuY2UoKSkgewotICAgICAgICBtb3VzZVRyaXBsZUNsaWNrRXZlbnQoZXYp
OwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYm9vbCBhY2NlcHRlZCA9IGZhbHNlOwot
ICAgIGFkanVzdFBvaW50Rm9yQ2xpY2tpbmcoZXYpOwotICAgIFBsYXRmb3JtTW91c2VFdmVudCBt
ZXYgPSBjb252ZXJ0TW91c2VFdmVudChldiwgMSk7Ci0gICAgLy8gaWdub3JlIHRoZSBldmVudCBp
ZiB3ZSBjYW4ndCBtYXAgUXQncyBtb3VzZSBidXR0b25zIHRvIFdlYkNvcmU6Ok1vdXNlQnV0dG9u
Ci0gICAgaWYgKG1ldi5idXR0b24oKSAhPSBOb0J1dHRvbikKLSAgICAgICAgYWNjZXB0ZWQgPSBm
cmFtZS0+ZXZlbnRIYW5kbGVyKCktPmhhbmRsZU1vdXNlUHJlc3NFdmVudChtZXYpOwotICAgIGV2
LT5zZXRBY2NlcHRlZChhY2NlcHRlZCk7Ci0KLSAgICBSZWZQdHI8V2ViQ29yZTo6Tm9kZT4gbmV3
Tm9kZTsKLSAgICBmb2N1c2VkRnJhbWUgPSBwYWdlLT5mb2N1c0NvbnRyb2xsZXIoKS0+Zm9jdXNl
ZEZyYW1lKCk7Ci0gICAgaWYgKERvY3VtZW50KiBmb2N1c2VkRG9jdW1lbnQgPSBmb2N1c2VkRnJh
bWUgPyBmb2N1c2VkRnJhbWUtPmRvY3VtZW50KCkgOiAwKQotICAgICAgICBuZXdOb2RlID0gZm9j
dXNlZERvY3VtZW50LT5mb2N1c2VkTm9kZSgpOwotCi0gICAgaWYgKG5ld05vZGUgJiYgb2xkTm9k
ZSAhPSBuZXdOb2RlKQotICAgICAgICBjbGlja0NhdXNlZEZvY3VzID0gdHJ1ZTsKLX0KLQotdm9p
ZCBRV2ViUGFnZVByaXZhdGU6Om1vdXNlRG91YmxlQ2xpY2tFdmVudChRTW91c2VFdmVudCAqZXYp
Ci17Ci0gICAgV2ViQ29yZTo6RnJhbWUqIGZyYW1lID0gUVdlYkZyYW1lUHJpdmF0ZTo6Y29yZSht
YWluRnJhbWUuZGF0YSgpKTsKLSAgICBpZiAoIWZyYW1lLT52aWV3KCkpCi0gICAgICAgIHJldHVy
bjsKLQotICAgIGJvb2wgYWNjZXB0ZWQgPSBmYWxzZTsKLSAgICBQbGF0Zm9ybU1vdXNlRXZlbnQg
bWV2ID0gY29udmVydE1vdXNlRXZlbnQoZXYsIDIpOwotICAgIC8vIGlnbm9yZSB0aGUgZXZlbnQg
aWYgd2UgY2FuJ3QgbWFwIFF0J3MgbW91c2UgYnV0dG9ucyB0byBXZWJDb3JlOjpNb3VzZUJ1dHRv
bgotICAgIGlmIChtZXYuYnV0dG9uKCkgIT0gTm9CdXR0b24pCi0gICAgICAgIGFjY2VwdGVkID0g
ZnJhbWUtPmV2ZW50SGFuZGxlcigpLT5oYW5kbGVNb3VzZVByZXNzRXZlbnQobWV2KTsKLSAgICBl
di0+c2V0QWNjZXB0ZWQoYWNjZXB0ZWQpOwotCi0gICAgdHJpcGxlQ2xpY2tUaW1lci5zdGFydChR
QXBwbGljYXRpb246OmRvdWJsZUNsaWNrSW50ZXJ2YWwoKSwgcSk7Ci0gICAgdHJpcGxlQ2xpY2sg
PSBRUG9pbnRGKGV2LT5wb3MoKSkudG9Qb2ludCgpOwotfQotCi12b2lkIFFXZWJQYWdlUHJpdmF0
ZTo6bW91c2VUcmlwbGVDbGlja0V2ZW50KFFNb3VzZUV2ZW50ICpldikKLXsKLSAgICBXZWJDb3Jl
OjpGcmFtZSogZnJhbWUgPSBRV2ViRnJhbWVQcml2YXRlOjpjb3JlKG1haW5GcmFtZS5kYXRhKCkp
OwotICAgIGlmICghZnJhbWUtPnZpZXcoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgYm9vbCBh
Y2NlcHRlZCA9IGZhbHNlOwotICAgIFBsYXRmb3JtTW91c2VFdmVudCBtZXYgPSBjb252ZXJ0TW91
c2VFdmVudChldiwgMyk7Ci0gICAgLy8gaWdub3JlIHRoZSBldmVudCBpZiB3ZSBjYW4ndCBtYXAg
UXQncyBtb3VzZSBidXR0b25zIHRvIFdlYkNvcmU6Ok1vdXNlQnV0dG9uCi0gICAgaWYgKG1ldi5i
dXR0b24oKSAhPSBOb0J1dHRvbikKLSAgICAgICAgYWNjZXB0ZWQgPSBmcmFtZS0+ZXZlbnRIYW5k
bGVyKCktPmhhbmRsZU1vdXNlUHJlc3NFdmVudChtZXYpOwotICAgIGV2LT5zZXRBY2NlcHRlZChh
Y2NlcHRlZCk7Ci19Ci0KLXZvaWQgUVdlYlBhZ2VQcml2YXRlOjptb3VzZVJlbGVhc2VFdmVudChR
TW91c2VFdmVudCAqZXYpCi17Ci0gICAgV2ViQ29yZTo6RnJhbWUqIGZyYW1lID0gUVdlYkZyYW1l
UHJpdmF0ZTo6Y29yZShtYWluRnJhbWUuZGF0YSgpKTsKLSAgICBpZiAoIWZyYW1lLT52aWV3KCkp
Ci0gICAgICAgIHJldHVybjsKLQotICAgIGJvb2wgYWNjZXB0ZWQgPSBmYWxzZTsKLSAgICBhZGp1
c3RQb2ludEZvckNsaWNraW5nKGV2KTsKLSAgICBQbGF0Zm9ybU1vdXNlRXZlbnQgbWV2ID0gY29u
dmVydE1vdXNlRXZlbnQoZXYsIDApOwotICAgIC8vIGlnbm9yZSB0aGUgZXZlbnQgaWYgd2UgY2Fu
J3QgbWFwIFF0J3MgbW91c2UgYnV0dG9ucyB0byBXZWJDb3JlOjpNb3VzZUJ1dHRvbgotICAgIGlm
IChtZXYuYnV0dG9uKCkgIT0gTm9CdXR0b24pCi0gICAgICAgIGFjY2VwdGVkID0gZnJhbWUtPmV2
ZW50SGFuZGxlcigpLT5oYW5kbGVNb3VzZVJlbGVhc2VFdmVudChtZXYpOwotICAgIGV2LT5zZXRB
Y2NlcHRlZChhY2NlcHRlZCk7Ci0KLSAgICBoYW5kbGVTb2Z0d2FyZUlucHV0UGFuZWwoZXYtPmJ1
dHRvbigpLCBRUG9pbnRGKGV2LT5wb3MoKSkudG9Qb2ludCgpKTsKLX0KLQotdm9pZCBRV2ViUGFn
ZVByaXZhdGU6OmhhbmRsZVNvZnR3YXJlSW5wdXRQYW5lbChRdDo6TW91c2VCdXR0b24gYnV0dG9u
LCBjb25zdCBRUG9pbnQmIHBvcykKLXsKLSAgICBGcmFtZSogZnJhbWUgPSBwYWdlLT5mb2N1c0Nv
bnRyb2xsZXIoKS0+Zm9jdXNlZEZyYW1lKCk7Ci0gICAgaWYgKCFmcmFtZSkKLSAgICAgICAgcmV0
dXJuOwotCi0gICAgaWYgKGNsaWVudCAmJiBjbGllbnQtPmlucHV0TWV0aG9kRW5hYmxlZCgpCi0g
ICAgICAgICYmIGZyYW1lLT5kb2N1bWVudCgpLT5mb2N1c2VkTm9kZSgpCi0gICAgICAgICYmIGJ1
dHRvbiA9PSBRdDo6TGVmdEJ1dHRvbiAmJiBxQXBwLT5hdXRvU2lwRW5hYmxlZCgpKSB7Ci0gICAg
ICAgIFFTdHlsZTo6UmVxdWVzdFNvZnR3YXJlSW5wdXRQYW5lbCBiZWhhdmlvciA9IFFTdHlsZTo6
UmVxdWVzdFNvZnR3YXJlSW5wdXRQYW5lbCgKLSAgICAgICAgICAgIGNsaWVudC0+c3R5bGUoKS0+
c3R5bGVIaW50KFFTdHlsZTo6U0hfUmVxdWVzdFNvZnR3YXJlSW5wdXRQYW5lbCkpOwotICAgICAg
ICBpZiAoIWNsaWNrQ2F1c2VkRm9jdXMgfHwgYmVoYXZpb3IgPT0gUVN0eWxlOjpSU0lQX09uTW91
c2VDbGljaykgewotICAgICAgICAgICAgSGl0VGVzdFJlc3VsdCByZXN1bHQgPSBmcmFtZS0+ZXZl
bnRIYW5kbGVyKCktPmhpdFRlc3RSZXN1bHRBdFBvaW50KGZyYW1lLT52aWV3KCktPndpbmRvd1Rv
Q29udGVudHMocG9zKSwgZmFsc2UpOwotICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0NvbnRlbnRF
ZGl0YWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgUUV2ZW50IGV2ZW50KFFFdmVudDo6UmVxdWVz
dFNvZnR3YXJlSW5wdXRQYW5lbCk7Ci0gICAgICAgICAgICAgICAgUUFwcGxpY2F0aW9uOjpzZW5k
RXZlbnQoY2xpZW50LT5vd25lcldpZGdldCgpLCAmZXZlbnQpOwotICAgICAgICAgICAgfQotICAg
ICAgICB9Ci0gICAgfQotCi0gICAgY2xpY2tDYXVzZWRGb2N1cyA9IGZhbHNlOwotfQotCi0jaWZu
ZGVmIFFUX05PX0NPTlRFWFRNRU5VCi12b2lkIFFXZWJQYWdlUHJpdmF0ZTo6Y29udGV4dE1lbnVF
dmVudChjb25zdCBRUG9pbnQmIGdsb2JhbFBvcykKLXsKLSAgICBRTWVudSAqbWVudSA9IHEtPmNy
ZWF0ZVN0YW5kYXJkQ29udGV4dE1lbnUoKTsKLSAgICBpZiAobWVudSkgewotICAgICAgICBtZW51
LT5leGVjKGdsb2JhbFBvcyk7Ci0gICAgICAgIGRlbGV0ZSBtZW51OwotICAgIH0KLX0KLSNlbmRp
ZiAvLyBRVF9OT19DT05URVhUTUVOVQotCi0vKiEKLSAgICBcc2luY2UgNC41Ci0gICAgVGhpcyBm
dW5jdGlvbiBjcmVhdGVzIHRoZSBzdGFuZGFyZCBjb250ZXh0IG1lbnUgd2hpY2ggaXMgc2hvd24g
d2hlbgotICAgIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGUgd2ViIHBhZ2Ugd2l0aCB0aGUgcmlnaHQg
bW91c2UgYnV0dG9uLiBJdCBpcwotICAgIGNhbGxlZCBmcm9tIHRoZSBkZWZhdWx0IGNvbnRleHRN
ZW51RXZlbnQoKSBoYW5kbGVyLiBUaGUgcG9wdXAgbWVudSdzCi0gICAgb3duZXJzaGlwIGlzIHRy
YW5zZmVycmVkIHRvIHRoZSBjYWxsZXIuCi0gKi8KLVFNZW51ICpRV2ViUGFnZTo6Y3JlYXRlU3Rh
bmRhcmRDb250ZXh0TWVudSgpCi17Ci0jaWZuZGVmIFFUX05PX0NPTlRFWFRNRU5VCi0gICAgUU1l
bnUqIG1lbnUgPSBkLT5jdXJyZW50Q29udGV4dE1lbnUuZGF0YSgpOwotICAgIGQtPmN1cnJlbnRD
b250ZXh0TWVudSA9IDA7Ci0gICAgcmV0dXJuIG1lbnU7Ci0jZWxzZQotICAgIHJldHVybiAwOwot
I2VuZGlmCi19Ci0KLSNpZm5kZWYgUVRfTk9fV0hFRUxFVkVOVAotdm9pZCBRV2ViUGFnZVByaXZh
dGU6OndoZWVsRXZlbnQoUVdoZWVsRXZlbnQgKmV2KQotewotICAgIFdlYkNvcmU6OkZyYW1lKiBm
cmFtZSA9IFFXZWJGcmFtZVByaXZhdGU6OmNvcmUobWFpbkZyYW1lLmRhdGEoKSk7Ci0gICAgaWYg
KCFmcmFtZS0+dmlldygpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBQbGF0Zm9ybVdoZWVsRXZl
bnQgcGV2ID0gY29udmVydFdoZWVsRXZlbnQoZXYsIFFBcHBsaWNhdGlvbjo6d2hlZWxTY3JvbGxM
aW5lcygpKTsKLSAgICBib29sIGFjY2VwdGVkID0gZnJhbWUtPmV2ZW50SGFuZGxlcigpLT5oYW5k
bGVXaGVlbEV2ZW50KHBldik7Ci0gICAgZXYtPnNldEFjY2VwdGVkKGFjY2VwdGVkKTsKLX0KLSNl
bmRpZiAvLyBRVF9OT19XSEVFTEVWRU5UCi0KLSNpZm5kZWYgUVRfTk9fU0hPUlRDVVQKLVFXZWJQ
YWdlOjpXZWJBY3Rpb24gUVdlYlBhZ2VQcml2YXRlOjplZGl0b3JBY3Rpb25Gb3JLZXlFdmVudChR
S2V5RXZlbnQqIGV2ZW50KQotewotICAgIHN0YXRpYyBzdHJ1Y3QgewotICAgICAgICBRS2V5U2Vx
dWVuY2U6OlN0YW5kYXJkS2V5IHN0YW5kYXJkS2V5OwotICAgICAgICBRV2ViUGFnZTo6V2ViQWN0
aW9uIGFjdGlvbjsKLSAgICB9IGVkaXRvckFjdGlvbnNbXSA9IHsKLSAgICAgICAgeyBRS2V5U2Vx
dWVuY2U6OkN1dCwgUVdlYlBhZ2U6OkN1dCB9LAotICAgICAgICB7IFFLZXlTZXF1ZW5jZTo6Q29w
eSwgUVdlYlBhZ2U6OkNvcHkgfSwKLSAgICAgICAgeyBRS2V5U2VxdWVuY2U6OlBhc3RlLCBRV2Vi
UGFnZTo6UGFzdGUgfSwKLSAgICAgICAgeyBRS2V5U2VxdWVuY2U6OlVuZG8sIFFXZWJQYWdlOjpV
bmRvIH0sCi0gICAgICAgIHsgUUtleVNlcXVlbmNlOjpSZWRvLCBRV2ViUGFnZTo6UmVkbyB9LAot
ICAgICAgICB7IFFLZXlTZXF1ZW5jZTo6TW92ZVRvTmV4dENoYXIsIFFXZWJQYWdlOjpNb3ZlVG9O
ZXh0Q2hhciB9LAotICAgICAgICB7IFFLZXlTZXF1ZW5jZTo6TW92ZVRvUHJldmlvdXNDaGFyLCBR
V2ViUGFnZTo6TW92ZVRvUHJldmlvdXNDaGFyIH0sCi0gICAgICAgIHsgUUtleVNlcXVlbmNlOjpN
b3ZlVG9OZXh0V29yZCwgUVdlYlBhZ2U6Ok1vdmVUb05leHRXb3JkIH0sCi0gICAgICAgIHsgUUtl
eVNlcXVlbmNlOjpNb3ZlVG9QcmV2aW91c1dvcmQsIFFXZWJQYWdlOjpNb3ZlVG9QcmV2aW91c1dv
cmQgfSwKLSAgICAgICAgeyBRS2V5U2VxdWVuY2U6Ok1vdmVUb05leHRMaW5lLCBRV2ViUGFnZTo6
TW92ZVRvTmV4dExpbmUgfSwKLSAgICAgICAgeyBRS2V5U2VxdWVuY2U6Ok1vdmVUb1ByZXZpb3Vz
TGluZSwgUVdlYlBhZ2U6Ok1vdmVUb1ByZXZpb3VzTGluZSB9LAotICAgICAgICB7IFFLZXlTZXF1
ZW5jZTo6TW92ZVRvU3RhcnRPZkxpbmUsIFFXZWJQYWdlOjpNb3ZlVG9TdGFydE9mTGluZSB9LAot
ICAgICAgICB7IFFLZXlTZXF1ZW5jZTo6TW92ZVRvRW5kT2ZMaW5lLCBRV2ViUGFnZTo6TW92ZVRv
RW5kT2ZMaW5lIH0sCi0gICAgICAgIHsgUUtleVNlcXVlbmNlOjpNb3ZlVG9TdGFydE9mQmxvY2ss
IFFXZWJQYWdlOjpNb3ZlVG9TdGFydE9mQmxvY2sgfSwKLSAgICAgICAgeyBRS2V5U2VxdWVuY2U6
Ok1vdmVUb0VuZE9mQmxvY2ssIFFXZWJQYWdlOjpNb3ZlVG9FbmRPZkJsb2NrIH0sCi0gICAgICAg
IHsgUUtleVNlcXVlbmNlOjpNb3ZlVG9TdGFydE9mRG9jdW1lbnQsIFFXZWJQYWdlOjpNb3ZlVG9T
dGFydE9mRG9jdW1lbnQgfSwKLSAgICAgICAgeyBRS2V5U2VxdWVuY2U6Ok1vdmVUb0VuZE9mRG9j
dW1lbnQsIFFXZWJQYWdlOjpNb3ZlVG9FbmRPZkRvY3VtZW50IH0sCi0gICAgICAgIHsgUUtleVNl
cXVlbmNlOjpTZWxlY3ROZXh0Q2hhciwgUVdlYlBhZ2U6OlNlbGVjdE5leHRDaGFyIH0sCi0gICAg
ICAgIHsgUUtleVNlcXVlbmNlOjpTZWxlY3RQcmV2aW91c0NoYXIsIFFXZWJQYWdlOjpTZWxlY3RQ
cmV2aW91c0NoYXIgfSwKLSAgICAgICAgeyBRS2V5U2VxdWVuY2U6OlNlbGVjdE5leHRXb3JkLCBR
V2ViUGFnZTo6U2VsZWN0TmV4dFdvcmQgfSwKLSAgICAgICAgeyBRS2V5U2VxdWVuY2U6OlNlbGVj
dFByZXZpb3VzV29yZCwgUVdlYlBhZ2U6OlNlbGVjdFByZXZpb3VzV29yZCB9LAotICAgICAgICB7
IFFLZXlTZXF1ZW5jZTo6U2VsZWN0TmV4dExpbmUsIFFXZWJQYWdlOjpTZWxlY3ROZXh0TGluZSB9
LAotICAgICAgICB7IFFLZXlTZXF1ZW5jZTo6U2VsZWN0UHJldmlvdXNMaW5lLCBRV2ViUGFnZTo6
U2VsZWN0UHJldmlvdXNMaW5lIH0sCi0gICAgICAgIHsgUUtleVNlcXVlbmNlOjpTZWxlY3RTdGFy
dE9mTGluZSwgUVdlYlBhZ2U6OlNlbGVjdFN0YXJ0T2ZMaW5lIH0sCi0gICAgICAgIHsgUUtleVNl
cXVlbmNlOjpTZWxlY3RFbmRPZkxpbmUsIFFXZWJQYWdlOjpTZWxlY3RFbmRPZkxpbmUgfSwKLSAg
ICAgICAgeyBRS2V5U2VxdWVuY2U6OlNlbGVjdFN0YXJ0T2ZCbG9jaywgUVdlYlBhZ2U6OlNlbGVj
dFN0YXJ0T2ZCbG9jayB9LAotICAgICAgICB7IFFLZXlTZXF1ZW5jZTo6U2VsZWN0RW5kT2ZCbG9j
aywgIFFXZWJQYWdlOjpTZWxlY3RFbmRPZkJsb2NrIH0sCi0gICAgICAgIHsgUUtleVNlcXVlbmNl
OjpTZWxlY3RTdGFydE9mRG9jdW1lbnQsIFFXZWJQYWdlOjpTZWxlY3RTdGFydE9mRG9jdW1lbnQg
fSwKLSAgICAgICAgeyBRS2V5U2VxdWVuY2U6OlNlbGVjdEVuZE9mRG9jdW1lbnQsIFFXZWJQYWdl
OjpTZWxlY3RFbmRPZkRvY3VtZW50IH0sCi0gICAgICAgIHsgUUtleVNlcXVlbmNlOjpEZWxldGVT
dGFydE9mV29yZCwgUVdlYlBhZ2U6OkRlbGV0ZVN0YXJ0T2ZXb3JkIH0sCi0gICAgICAgIHsgUUtl
eVNlcXVlbmNlOjpEZWxldGVFbmRPZldvcmQsIFFXZWJQYWdlOjpEZWxldGVFbmRPZldvcmQgfSwK
LSAgICAgICAgeyBRS2V5U2VxdWVuY2U6Okluc2VydFBhcmFncmFwaFNlcGFyYXRvciwgUVdlYlBh
Z2U6Okluc2VydFBhcmFncmFwaFNlcGFyYXRvciB9LAotICAgICAgICB7IFFLZXlTZXF1ZW5jZTo6
SW5zZXJ0TGluZVNlcGFyYXRvciwgUVdlYlBhZ2U6Okluc2VydExpbmVTZXBhcmF0b3IgfSwKLSAg
ICAgICAgeyBRS2V5U2VxdWVuY2U6OlNlbGVjdEFsbCwgUVdlYlBhZ2U6OlNlbGVjdEFsbCB9LAot
ICAgICAgICB7IFFLZXlTZXF1ZW5jZTo6VW5rbm93bktleSwgUVdlYlBhZ2U6Ok5vV2ViQWN0aW9u
IH0KLSAgICB9OwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGVkaXRvckFjdGlvbnNbaV0uc3RhbmRh
cmRLZXkgIT0gUUtleVNlcXVlbmNlOjpVbmtub3duS2V5OyArK2kpCi0gICAgICAgIGlmIChldmVu
dCA9PSBlZGl0b3JBY3Rpb25zW2ldLnN0YW5kYXJkS2V5KQotICAgICAgICAgICAgcmV0dXJuIGVk
aXRvckFjdGlvbnNbaV0uYWN0aW9uOwotCi0gICAgcmV0dXJuIFFXZWJQYWdlOjpOb1dlYkFjdGlv
bjsKLX0KLSNlbmRpZiAvLyBRVF9OT19TSE9SVENVVAotCi12b2lkIFFXZWJQYWdlUHJpdmF0ZTo6
a2V5UHJlc3NFdmVudChRS2V5RXZlbnQgKmV2KQotewotICAgIGJvb2wgaGFuZGxlZCA9IGZhbHNl
OwotICAgIFdlYkNvcmU6OkZyYW1lKiBmcmFtZSA9IHBhZ2UtPmZvY3VzQ29udHJvbGxlcigpLT5m
b2N1c2VkT3JNYWluRnJhbWUoKTsKLSAgICAvLyB3ZSBmb3J3YXJkIHRoZSBrZXkgZXZlbnQgdG8g
V2ViQ29yZSBmaXJzdCB0byBoYW5kbGUgcG90ZW50aWFsIERPTQotICAgIC8vIGRlZmluZWQgZXZl
bnQgaGFuZGxlcnMgYW5kIGxhdGVyIG9uIGVuZCB1cCBpbiBFZGl0b3JDbGllbnRRdDo6aGFuZGxl
S2V5Ym9hcmRFdmVudAotICAgIC8vIHRvIHRyaWdnZXIgZWRpdG9yIGNvbW1hbmRzIHZpYSB0cmln
Z2VyQWN0aW9uKCkuCi0gICAgaWYgKCFoYW5kbGVkKQotICAgICAgICBoYW5kbGVkID0gZnJhbWUt
PmV2ZW50SGFuZGxlcigpLT5rZXlFdmVudChldik7Ci0gICAgaWYgKCFoYW5kbGVkKSB7Ci0gICAg
ICAgIGhhbmRsZWQgPSB0cnVlOwotICAgICAgICBpZiAoIWhhbmRsZVNjcm9sbGluZyhldiwgZnJh
bWUpKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGV2LT5rZXkoKSkgewotICAgICAgICAgICAgY2Fz
ZSBRdDo6S2V5X0JhY2s6Ci0gICAgICAgICAgICAgICAgcS0+dHJpZ2dlckFjdGlvbihRV2ViUGFn
ZTo6QmFjayk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFF0OjpL
ZXlfRm9yd2FyZDoKLSAgICAgICAgICAgICAgICBxLT50cmlnZ2VyQWN0aW9uKFFXZWJQYWdlOjpG
b3J3YXJkKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUXQ6Oktl
eV9TdG9wOgotICAgICAgICAgICAgICAgIHEtPnRyaWdnZXJBY3Rpb24oUVdlYlBhZ2U6OlN0b3Ap
OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBRdDo6S2V5X1JlZnJl
c2g6Ci0gICAgICAgICAgICAgICAgcS0+dHJpZ2dlckFjdGlvbihRV2ViUGFnZTo6UmVsb2FkKTsK
LSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUXQ6OktleV9CYWNrc3Bh
Y2U6Ci0gICAgICAgICAgICAgICAgaWYgKGV2LT5tb2RpZmllcnMoKSA9PSBRdDo6U2hpZnRNb2Rp
ZmllcikKLSAgICAgICAgICAgICAgICAgICAgcS0+dHJpZ2dlckFjdGlvbihRV2ViUGFnZTo6Rm9y
d2FyZCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBxLT50cmln
Z2VyQWN0aW9uKFFXZWJQYWdlOjpCYWNrKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAg
ICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgaGFuZGxlZCA9IGZhbHNlOwotICAgICAg
ICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAg
ZXYtPnNldEFjY2VwdGVkKGhhbmRsZWQpOwotfQotCi12b2lkIFFXZWJQYWdlUHJpdmF0ZTo6a2V5
UmVsZWFzZUV2ZW50KFFLZXlFdmVudCAqZXYpCi17Ci0gICAgaWYgKGV2LT5pc0F1dG9SZXBlYXQo
KSkgewotICAgICAgICBldi0+c2V0QWNjZXB0ZWQodHJ1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAg
ICB9Ci0KLSAgICBXZWJDb3JlOjpGcmFtZSogZnJhbWUgPSBwYWdlLT5mb2N1c0NvbnRyb2xsZXIo
KS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCk7Ci0gICAgYm9vbCBoYW5kbGVkID0gZnJhbWUtPmV2ZW50
SGFuZGxlcigpLT5rZXlFdmVudChldik7Ci0gICAgZXYtPnNldEFjY2VwdGVkKGhhbmRsZWQpOwot
fQotCi12b2lkIFFXZWJQYWdlUHJpdmF0ZTo6Zm9jdXNJbkV2ZW50KFFGb2N1c0V2ZW50KikKLXsK
LSAgICBGb2N1c0NvbnRyb2xsZXIgKmZvY3VzQ29udHJvbGxlciA9IHBhZ2UtPmZvY3VzQ29udHJv
bGxlcigpOwotICAgIGZvY3VzQ29udHJvbGxlci0+c2V0QWN0aXZlKHRydWUpOwotICAgIGZvY3Vz
Q29udHJvbGxlci0+c2V0Rm9jdXNlZCh0cnVlKTsKLSAgICBpZiAoIWZvY3VzQ29udHJvbGxlci0+
Zm9jdXNlZEZyYW1lKCkpCi0gICAgICAgIGZvY3VzQ29udHJvbGxlci0+c2V0Rm9jdXNlZEZyYW1l
KFFXZWJGcmFtZVByaXZhdGU6OmNvcmUobWFpbkZyYW1lLmRhdGEoKSkpOwotfQotCi12b2lkIFFX
ZWJQYWdlUHJpdmF0ZTo6Zm9jdXNPdXRFdmVudChRRm9jdXNFdmVudCopCi17Ci0gICAgLy8gb25s
eSBzZXQgdGhlIGZvY3VzZWQgZnJhbWUgaW5hY3RpdmUgc28gdGhhdCB3ZSBzdG9wIHBhaW50aW5n
IHRoZSBjYXJldAotICAgIC8vIGFuZCB0aGUgZm9jdXMgZnJhbWUuIEJ1dCBkb24ndCB0ZWxsIHRo
ZSBmb2N1cyBjb250cm9sbGVyIHNvIHRoYXQgdXBvbgotICAgIC8vIGZvY3VzSW5FdmVudCgpIHdl
IGNhbiByZS1hY3RpdmF0ZSB0aGUgZnJhbWUuCi0gICAgRm9jdXNDb250cm9sbGVyICpmb2N1c0Nv
bnRyb2xsZXIgPSBwYWdlLT5mb2N1c0NvbnRyb2xsZXIoKTsKLSAgICAvLyBDYWxsIHNldEZvY3Vz
ZWQgZmlyc3Qgc28gdGhhdCB3aW5kb3cub25ibHVyIGRvZXNuJ3QgZ2V0IGNhbGxlZCB0d2ljZQot
ICAgIGZvY3VzQ29udHJvbGxlci0+c2V0Rm9jdXNlZChmYWxzZSk7Ci0gICAgZm9jdXNDb250cm9s
bGVyLT5zZXRBY3RpdmUoZmFsc2UpOwotfQotCi10ZW1wbGF0ZTxjbGFzcyBUPgotdm9pZCBRV2Vi
UGFnZVByaXZhdGU6OmRyYWdFbnRlckV2ZW50KFQqIGV2KQotewotI2lmbmRlZiBRVF9OT19EUkFH
QU5ERFJPUAotICAgIERyYWdEYXRhIGRyYWdEYXRhKGV2LT5taW1lRGF0YSgpLCBRUG9pbnRGKGV2
LT5wb3MoKSkudG9Qb2ludCgpLAotICAgICAgICAgICAgUUN1cnNvcjo6cG9zKCksIGRyb3BBY3Rp
b25Ub0RyYWdPcChldi0+cG9zc2libGVBY3Rpb25zKCkpKTsKLSAgICBRdDo6RHJvcEFjdGlvbiBh
Y3Rpb24gPSBkcmFnT3BUb0Ryb3BBY3Rpb24ocGFnZS0+ZHJhZ0NvbnRyb2xsZXIoKS0+ZHJhZ0Vu
dGVyZWQoJmRyYWdEYXRhKS5vcGVyYXRpb24pOwotICAgIGV2LT5zZXREcm9wQWN0aW9uKGFjdGlv
bik7Ci0gICAgZXYtPmFjY2VwdFByb3Bvc2VkQWN0aW9uKCk7Ci0jZW5kaWYKLX0KLQotdGVtcGxh
dGU8Y2xhc3MgVD4KLXZvaWQgUVdlYlBhZ2VQcml2YXRlOjpkcmFnTGVhdmVFdmVudChUICpldikK
LXsKLSNpZm5kZWYgUVRfTk9fRFJBR0FORERST1AKLSAgICBEcmFnRGF0YSBkcmFnRGF0YSgwLCBJ
bnRQb2ludCgpLCBRQ3Vyc29yOjpwb3MoKSwgRHJhZ09wZXJhdGlvbk5vbmUpOwotICAgIHBhZ2Ut
PmRyYWdDb250cm9sbGVyKCktPmRyYWdFeGl0ZWQoJmRyYWdEYXRhKTsKLSAgICBldi0+YWNjZXB0
KCk7Ci0jZW5kaWYKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVD4KLXZvaWQgUVdlYlBhZ2VQcml2YXRl
OjpkcmFnTW92ZUV2ZW50KFQgKmV2KQotewotI2lmbmRlZiBRVF9OT19EUkFHQU5ERFJPUAotICAg
IERyYWdEYXRhIGRyYWdEYXRhKGV2LT5taW1lRGF0YSgpLCBRUG9pbnRGKGV2LT5wb3MoKSkudG9Q
b2ludCgpLAotICAgICAgICAgICAgUUN1cnNvcjo6cG9zKCksIGRyb3BBY3Rpb25Ub0RyYWdPcChl
di0+cG9zc2libGVBY3Rpb25zKCkpKTsKLSAgICBtX2xhc3REcm9wQWN0aW9uID0gZHJhZ09wVG9E
cm9wQWN0aW9uKHBhZ2UtPmRyYWdDb250cm9sbGVyKCktPmRyYWdVcGRhdGVkKCZkcmFnRGF0YSku
b3BlcmF0aW9uKTsKLSAgICBldi0+c2V0RHJvcEFjdGlvbihtX2xhc3REcm9wQWN0aW9uKTsKLSAg
ICBpZiAobV9sYXN0RHJvcEFjdGlvbiAhPSBRdDo6SWdub3JlQWN0aW9uKQotICAgICAgICBldi0+
YWNjZXB0KCk7Ci0jZW5kaWYKLX0KLQotdGVtcGxhdGU8Y2xhc3MgVD4KLXZvaWQgUVdlYlBhZ2VQ
cml2YXRlOjpkcm9wRXZlbnQoVCAqZXYpCi17Ci0jaWZuZGVmIFFUX05PX0RSQUdBTkREUk9QCi0g
ICAgRHJhZ0RhdGEgZHJhZ0RhdGEoZXYtPm1pbWVEYXRhKCksIFFQb2ludEYoZXYtPnBvcygpKS50
b1BvaW50KCksCi0gICAgICAgICAgICBRQ3Vyc29yOjpwb3MoKSwgZHJvcEFjdGlvblRvRHJhZ09w
KGV2LT5wb3NzaWJsZUFjdGlvbnMoKSkpOwotICAgIGlmIChwYWdlLT5kcmFnQ29udHJvbGxlcigp
LT5wZXJmb3JtRHJhZygmZHJhZ0RhdGEpKSB7Ci0gICAgICAgIGV2LT5zZXREcm9wQWN0aW9uKG1f
bGFzdERyb3BBY3Rpb24pOwotICAgICAgICBldi0+YWNjZXB0KCk7Ci0gICAgfQotI2VuZGlmCi19
Ci0KLXZvaWQgUVdlYlBhZ2VQcml2YXRlOjpsZWF2ZUV2ZW50KFFFdmVudCopCi17Ci0gICAgLy8g
RmFrZSBhIG1vdXNlIG1vdmUgZXZlbnQganVzdCBvdXRzaWRlIG9mIHRoZSB3aWRnZXQsIHNpbmNl
IGFsbAotICAgIC8vIHRoZSBpbnRlcmVzdGluZyBtb3VzZS1vdXQgYmVoYXZpb3IgbGlrZSBpbnZh
bGlkYXRpbmcgc2Nyb2xsYmFycwotICAgIC8vIGlzIGhhbmRsZWQgYnkgdGhlIFdlYktpdCBldmVu
dCBoYW5kbGVyJ3MgbW91c2VNb3ZlZCBmdW5jdGlvbi4KLSAgICBRTW91c2VFdmVudCBmYWtlRXZl
bnQoUUV2ZW50OjpNb3VzZU1vdmUsIFFDdXJzb3I6OnBvcygpLCBRdDo6Tm9CdXR0b24sIFF0OjpO
b0J1dHRvbiwgUXQ6Ok5vTW9kaWZpZXIpOwotICAgIG1vdXNlTW92ZUV2ZW50KCZmYWtlRXZlbnQp
OwotfQotCi0vKiEKLSAgICBccHJvcGVydHkgUVdlYlBhZ2U6OnBhbGV0dGUKLSAgICBcYnJpZWYg
dGhlIHBhZ2UncyBwYWxldHRlCi0KLSAgICBUaGUgYmFzZSBicnVzaCBvZiB0aGUgcGFsZXR0ZSBp
cyB1c2VkIHRvIGRyYXcgdGhlIGJhY2tncm91bmQgb2YgdGhlIG1haW4gZnJhbWUuCi0KLSAgICBC
eSBkZWZhdWx0LCB0aGlzIHByb3BlcnR5IGNvbnRhaW5zIHRoZSBhcHBsaWNhdGlvbidzIGRlZmF1
bHQgcGFsZXR0ZS4KLSovCi12b2lkIFFXZWJQYWdlOjpzZXRQYWxldHRlKGNvbnN0IFFQYWxldHRl
ICZwYWwpCi17Ci0gICAgZC0+cGFsZXR0ZSA9IHBhbDsKLSAgICBpZiAoIWQtPm1haW5GcmFtZSB8
fCAhZC0+bWFpbkZyYW1lLmRhdGEoKS0+ZC0+ZnJhbWUtPnZpZXcoKSkKLSAgICAgICAgcmV0dXJu
OwotCi0gICAgUUJydXNoIGJydXNoID0gcGFsLmJydXNoKFFQYWxldHRlOjpCYXNlKTsKLSAgICBR
Q29sb3IgYmFja2dyb3VuZENvbG9yID0gYnJ1c2guc3R5bGUoKSA9PSBRdDo6U29saWRQYXR0ZXJu
ID8gYnJ1c2guY29sb3IoKSA6IFFDb2xvcigpOwotICAgIFFXZWJGcmFtZVByaXZhdGU6OmNvcmUo
ZC0+bWFpbkZyYW1lLmRhdGEoKSktPnZpZXcoKS0+dXBkYXRlQmFja2dyb3VuZFJlY3Vyc2l2ZWx5
KGJhY2tncm91bmRDb2xvciwgIWJhY2tncm91bmRDb2xvci5hbHBoYSgpKTsKLX0KLQotUVBhbGV0
dGUgUVdlYlBhZ2U6OnBhbGV0dGUoKSBjb25zdAotewotICAgIHJldHVybiBkLT5wYWxldHRlOwot
fQotCi12b2lkIFFXZWJQYWdlUHJpdmF0ZTo6aW5wdXRNZXRob2RFdmVudChRSW5wdXRNZXRob2RF
dmVudCAqZXYpCi17Ci0gICAgV2ViQ29yZTo6RnJhbWUgKmZyYW1lID0gcGFnZS0+Zm9jdXNDb250
cm9sbGVyKCktPmZvY3VzZWRPck1haW5GcmFtZSgpOwotICAgIFdlYkNvcmU6OkVkaXRvciAqZWRp
dG9yID0gZnJhbWUtPmVkaXRvcigpOwotCi0gICAgaWYgKCFlZGl0b3ItPmNhbkVkaXQoKSkgewot
ICAgICAgICBldi0+aWdub3JlKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBOb2Rl
KiBub2RlID0gMDsKLSAgICBpZiAoZnJhbWUtPnNlbGVjdGlvbigpLT5yb290RWRpdGFibGVFbGVt
ZW50KCkpCi0gICAgICAgIG5vZGUgPSBmcmFtZS0+c2VsZWN0aW9uKCktPnJvb3RFZGl0YWJsZUVs
ZW1lbnQoKS0+c2hhZG93QW5jZXN0b3JOb2RlKCk7Ci0KLSAgICBWZWN0b3I8Q29tcG9zaXRpb25V
bmRlcmxpbmU+IHVuZGVybGluZXM7Ci0gICAgYm9vbCBoYXNTZWxlY3Rpb24gPSBmYWxzZTsKLQot
ICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXYtPmF0dHJpYnV0ZXMoKS5zaXplKCk7ICsraSkgewot
ICAgICAgICBjb25zdCBRSW5wdXRNZXRob2RFdmVudDo6QXR0cmlidXRlJiBhID0gZXYtPmF0dHJp
YnV0ZXMoKS5hdChpKTsKLSAgICAgICAgc3dpdGNoIChhLnR5cGUpIHsKLSAgICAgICAgY2FzZSBR
SW5wdXRNZXRob2RFdmVudDo6VGV4dEZvcm1hdDogewotICAgICAgICAgICAgUVRleHRDaGFyRm9y
bWF0IHRleHRDaGFyRm9ybWF0ID0gYS52YWx1ZS52YWx1ZTxRVGV4dEZvcm1hdD4oKS50b0NoYXJG
b3JtYXQoKTsKLSAgICAgICAgICAgIFFDb2xvciBxY29sb3IgPSB0ZXh0Q2hhckZvcm1hdC51bmRl
cmxpbmVDb2xvcigpOwotICAgICAgICAgICAgdW5kZXJsaW5lcy5hcHBlbmQoQ29tcG9zaXRpb25V
bmRlcmxpbmUocU1pbihhLnN0YXJ0LCAoYS5zdGFydCArIGEubGVuZ3RoKSksIHFNYXgoYS5zdGFy
dCwgKGEuc3RhcnQgKyBhLmxlbmd0aCkpLCBDb2xvcihtYWtlUkdCQShxY29sb3IucmVkKCksIHFj
b2xvci5ncmVlbigpLCBxY29sb3IuYmx1ZSgpLCBxY29sb3IuYWxwaGEoKSkpLCBmYWxzZSkpOwot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBRSW5wdXRNZXRob2RF
dmVudDo6Q3Vyc29yOiB7Ci0gICAgICAgICAgICBmcmFtZS0+c2VsZWN0aW9uKCktPnNldENhcmV0
VmlzaWJsZShhLmxlbmd0aCk7IC8vaWYgbGVuZ3RoIGlzIDAgY3Vyc29yIGlzIGludmlzaWJsZQot
ICAgICAgICAgICAgaWYgKGEubGVuZ3RoID4gMCkgewotICAgICAgICAgICAgICAgIFJlbmRlck9i
amVjdCogY2FyZXRSZW5kZXJlciA9IGZyYW1lLT5zZWxlY3Rpb24oKS0+Y2FyZXRSZW5kZXJlcigp
OwotICAgICAgICAgICAgICAgIGlmIChjYXJldFJlbmRlcmVyKSB7Ci0gICAgICAgICAgICAgICAg
ICAgIFFDb2xvciBxY29sb3IgPSBhLnZhbHVlLnZhbHVlPFFDb2xvcj4oKTsKLSAgICAgICAgICAg
ICAgICAgICAgY2FyZXRSZW5kZXJlci0+c3R5bGUoKS0+c2V0Q29sb3IoQ29sb3IobWFrZVJHQkEo
cWNvbG9yLnJlZCgpLCBxY29sb3IuZ3JlZW4oKSwgcWNvbG9yLmJsdWUoKSwgcWNvbG9yLmFscGhh
KCkpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBRSW5wdXRNZXRob2RFdmVudDo6U2VsZWN0aW9u
OiB7Ci0gICAgICAgICAgICBoYXNTZWxlY3Rpb24gPSB0cnVlOwotICAgICAgICAgICAgLy8gQSBz
ZWxlY3Rpb24gaW4gdGhlIGlucHV0TWV0aG9kRXZlbnQgaXMgYWx3YXlzIHJlZmxlY3RlZCBpbiB0
aGUgdmlzaWJsZSB0ZXh0Ci0gICAgICAgICAgICBpZiAobm9kZSkgewotICAgICAgICAgICAgICAg
IGlmIChIVE1MVGV4dEZvcm1Db250cm9sRWxlbWVudCogdGV4dENvbnRyb2wgPSB0b1RleHRGb3Jt
Q29udHJvbChub2RlKSkKLSAgICAgICAgICAgICAgICAgICAgdGV4dENvbnRyb2wtPnNldFNlbGVj
dGlvblJhbmdlKHFNaW4oYS5zdGFydCwgKGEuc3RhcnQgKyBhLmxlbmd0aCkpLCBxTWF4KGEuc3Rh
cnQsIChhLnN0YXJ0ICsgYS5sZW5ndGgpKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAg
IGlmICghZXYtPnByZWVkaXRTdHJpbmcoKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgZWRp
dG9yLT5zZXRDb21wb3NpdGlvbihldi0+cHJlZWRpdFN0cmluZygpLCB1bmRlcmxpbmVzLCBxTWlu
KGEuc3RhcnQsIChhLnN0YXJ0ICsgYS5sZW5ndGgpKSwgcU1heChhLnN0YXJ0LCAoYS5zdGFydCAr
IGEubGVuZ3RoKSkpOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYg
d2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBjb21wb3NpdGlvbiwgYW4gZW1wdHkgcHJlLWVkaXQg
c3RyaW5nIGFuZCBhIHNlbGVjdGlvbiBvZiB6ZXJvCi0gICAgICAgICAgICAgICAgLy8gY2FuY2Vs
cyB0aGUgY3VycmVudCBjb21wb3NpdGlvbgotICAgICAgICAgICAgICAgIGlmIChlZGl0b3ItPmhh
c0NvbXBvc2l0aW9uKCkgJiYgKGEuc3RhcnQgKyBhLmxlbmd0aCA9PSAwKSkKLSAgICAgICAgICAg
ICAgICAgICAgZWRpdG9yLT5zZXRDb21wb3NpdGlvbihRU3RyaW5nKCksIHVuZGVybGluZXMsIDAs
IDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAg
ICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAg
aWYgKG5vZGUgJiYgZXYtPnJlcGxhY2VtZW50TGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgIGludCBj
dXJzb3JQb3MgPSBmcmFtZS0+c2VsZWN0aW9uKCktPmV4dGVudCgpLm9mZnNldEluQ29udGFpbmVy
Tm9kZSgpOwotICAgICAgICBpbnQgc3RhcnQgPSBjdXJzb3JQb3MgKyBldi0+cmVwbGFjZW1lbnRT
dGFydCgpOwotICAgICAgICBpZiAoSFRNTFRleHRGb3JtQ29udHJvbEVsZW1lbnQqIHRleHRDb250
cm9sID0gdG9UZXh0Rm9ybUNvbnRyb2wobm9kZSkpCi0gICAgICAgICAgICB0ZXh0Q29udHJvbC0+
c2V0U2VsZWN0aW9uUmFuZ2Uoc3RhcnQsIHN0YXJ0ICsgZXYtPnJlcGxhY2VtZW50TGVuZ3RoKCkp
OwotICAgICAgICAvLyBDb21taXQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGNvbW1pdFN0cmluZyBp
cyBlbXB0eSwgdG8gZ2V0IHJpZCBvZiBzZWxlY3Rpb24uCi0gICAgICAgIGVkaXRvci0+Y29uZmly
bUNvbXBvc2l0aW9uKGV2LT5jb21taXRTdHJpbmcoKSk7Ci0gICAgfSBlbHNlIGlmICghZXYtPmNv
bW1pdFN0cmluZygpLmlzRW1wdHkoKSkgewotICAgICAgICBpZiAoZWRpdG9yLT5oYXNDb21wb3Np
dGlvbigpKQotICAgICAgICAgICAgZWRpdG9yLT5jb25maXJtQ29tcG9zaXRpb24oZXYtPmNvbW1p
dFN0cmluZygpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZWRpdG9yLT5pbnNlcnRUZXh0
KGV2LT5jb21taXRTdHJpbmcoKSwgMCk7Ci0gICAgfSBlbHNlIGlmICghaGFzU2VsZWN0aW9uICYm
ICFldi0+cHJlZWRpdFN0cmluZygpLmlzRW1wdHkoKSkKLSAgICAgICAgZWRpdG9yLT5zZXRDb21w
b3NpdGlvbihldi0+cHJlZWRpdFN0cmluZygpLCB1bmRlcmxpbmVzLCAwLCAwKTsKLSAgICBlbHNl
IGlmIChldi0+cHJlZWRpdFN0cmluZygpLmlzRW1wdHkoKSAmJiBlZGl0b3ItPmhhc0NvbXBvc2l0
aW9uKCkpCi0gICAgICAgIGVkaXRvci0+Y29uZmlybUNvbXBvc2l0aW9uKFN0cmluZygpKTsKLQot
ICAgIGV2LT5hY2NlcHQoKTsKLX0KLQotI2lmbmRlZiBRVF9OT19QUk9QRVJUSUVTCi10eXBlZGVm
IHN0cnVjdCB7Ci0gICAgY29uc3QgY2hhciogbmFtZTsKLSAgICBkb3VibGUgZGVmZXJyZWRSZXBh
aW50RGVsYXk7Ci0gICAgZG91YmxlIGluaXRpYWxEZWZlcnJlZFJlcGFpbnREZWxheUR1cmluZ0xv
YWRpbmc7Ci0gICAgZG91YmxlIG1heERlZmVycmVkUmVwYWludERlbGF5RHVyaW5nTG9hZGluZzsK
LSAgICBkb3VibGUgZGVmZXJyZWRSZXBhaW50RGVsYXlJbmNyZW1lbnREdXJpbmdMb2FkaW5nOwot
fSBRUmVwYWludFRocm90dGxpbmdQcmVzZXQ7Ci0KLXZvaWQgUVdlYlBhZ2VQcml2YXRlOjpkeW5h
bWljUHJvcGVydHlDaGFuZ2VFdmVudChRRHluYW1pY1Byb3BlcnR5Q2hhbmdlRXZlbnQqIGV2ZW50
KQotewotICAgIGlmIChldmVudC0+cHJvcGVydHlOYW1lKCkgPT0gIl9xX3ZpZXdNb2RlIikgewot
ICAgICAgICBwYWdlLT5zZXRWaWV3TW9kZShQYWdlOjpzdHJpbmdUb1ZpZXdNb2RlKHEtPnByb3Bl
cnR5KCJfcV92aWV3TW9kZSIpLnRvU3RyaW5nKCkpKTsKLSAgICB9IGVsc2UgaWYgKGV2ZW50LT5w
cm9wZXJ0eU5hbWUoKSA9PSAiX3FfSFRNTFRva2VuaXplckNodW5rU2l6ZSIpIHsKLSAgICAgICAg
aW50IGNodW5rU2l6ZSA9IHEtPnByb3BlcnR5KCJfcV9IVE1MVG9rZW5pemVyQ2h1bmtTaXplIiku
dG9JbnQoKTsKLSAgICAgICAgcS0+aGFuZGxlKCktPnBhZ2UtPnNldEN1c3RvbUhUTUxUb2tlbml6
ZXJDaHVua1NpemUoY2h1bmtTaXplKTsKLSAgICB9IGVsc2UgaWYgKGV2ZW50LT5wcm9wZXJ0eU5h
bWUoKSA9PSAiX3FfSFRNTFRva2VuaXplclRpbWVEZWxheSIpIHsKLSAgICAgICAgZG91YmxlIHRp
bWVEZWxheSA9IHEtPnByb3BlcnR5KCJfcV9IVE1MVG9rZW5pemVyVGltZURlbGF5IikudG9Eb3Vi
bGUoKTsKLSAgICAgICAgcS0+aGFuZGxlKCktPnBhZ2UtPnNldEN1c3RvbUhUTUxUb2tlbml6ZXJU
aW1lRGVsYXkodGltZURlbGF5KTsKLSAgICB9IGVsc2UgaWYgKGV2ZW50LT5wcm9wZXJ0eU5hbWUo
KSA9PSAiX3FfUmVwYWludFRocm90dGxpbmdEZWZlcnJlZFJlcGFpbnREZWxheSIpIHsKLSAgICAg
ICAgZG91YmxlIHAgPSBxLT5wcm9wZXJ0eSgiX3FfUmVwYWludFRocm90dGxpbmdEZWZlcnJlZFJl
cGFpbnREZWxheSIpLnRvRG91YmxlKCk7Ci0gICAgICAgIEZyYW1lVmlldzo6c2V0UmVwYWludFRo
cm90dGxpbmdEZWZlcnJlZFJlcGFpbnREZWxheShwKTsKLSAgICB9IGVsc2UgaWYgKGV2ZW50LT5w
cm9wZXJ0eU5hbWUoKSA9PSAiX3FfUmVwYWludFRocm90dGxpbmduSW5pdGlhbERlZmVycmVkUmVw
YWludERlbGF5RHVyaW5nTG9hZGluZyIpIHsKLSAgICAgICAgZG91YmxlIHAgPSBxLT5wcm9wZXJ0
eSgiX3FfUmVwYWludFRocm90dGxpbmduSW5pdGlhbERlZmVycmVkUmVwYWludERlbGF5RHVyaW5n
TG9hZGluZyIpLnRvRG91YmxlKCk7Ci0gICAgICAgIEZyYW1lVmlldzo6c2V0UmVwYWludFRocm90
dGxpbmduSW5pdGlhbERlZmVycmVkUmVwYWludERlbGF5RHVyaW5nTG9hZGluZyhwKTsKLSAgICB9
IGVsc2UgaWYgKGV2ZW50LT5wcm9wZXJ0eU5hbWUoKSA9PSAiX3FfUmVwYWludFRocm90dGxpbmdN
YXhEZWZlcnJlZFJlcGFpbnREZWxheUR1cmluZ0xvYWRpbmciKSB7Ci0gICAgICAgIGRvdWJsZSBw
ID0gcS0+cHJvcGVydHkoIl9xX1JlcGFpbnRUaHJvdHRsaW5nTWF4RGVmZXJyZWRSZXBhaW50RGVs
YXlEdXJpbmdMb2FkaW5nIikudG9Eb3VibGUoKTsKLSAgICAgICAgRnJhbWVWaWV3OjpzZXRSZXBh
aW50VGhyb3R0bGluZ01heERlZmVycmVkUmVwYWludERlbGF5RHVyaW5nTG9hZGluZyhwKTsKLSAg
ICB9IGVsc2UgaWYgKGV2ZW50LT5wcm9wZXJ0eU5hbWUoKSA9PSAiX3FfUmVwYWludFRocm90dGxp
bmdEZWZlcnJlZFJlcGFpbnREZWxheUluY3JlbWVudER1cmluZ0xvYWRpbmciKSB7Ci0gICAgICAg
IGRvdWJsZSBwID0gcS0+cHJvcGVydHkoIl9xX1JlcGFpbnRUaHJvdHRsaW5nRGVmZXJyZWRSZXBh
aW50RGVsYXlJbmNyZW1lbnREdXJpbmdMb2FkaW5nIikudG9Eb3VibGUoKTsKLSAgICAgICAgRnJh
bWVWaWV3OjpzZXRSZXBhaW50VGhyb3R0bGluZ0RlZmVycmVkUmVwYWludERlbGF5SW5jcmVtZW50
RHVyaW5nTG9hZGluZyhwKTsKLSAgICB9IGVsc2UgaWYgKGV2ZW50LT5wcm9wZXJ0eU5hbWUoKSA9
PSAiX3FfUmVwYWludFRocm90dGxpbmdQcmVzZXQiKSB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBR
UmVwYWludFRocm90dGxpbmdQcmVzZXQgcHJlc2V0c1tdID0gewotICAgICAgICAgICAgeyAgICJO
b1Rocm90dGxpbmciLCAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgMCB9LAotICAgICAgICAg
ICAgeyAgICJMZWdhY3kiLCAgICAgICAwLjAyNSwgICAgICAwLCAgICAyLjUsICAgIDAuNSB9LAot
ICAgICAgICAgICAgeyAgICJNaW5pbWFsIiwgICAgICAgMC4wMSwgICAgICAwLCAgICAgIDEsICAg
IDAuMiB9LAotICAgICAgICAgICAgeyAgICJNZWRpdW0iLCAgICAgICAwLjAyNSwgICAgICAxLCAg
ICAgIDUsICAgIDAuNSB9LAotICAgICAgICAgICAgeyAgICJIZWF2eSIsICAgICAgICAgIDAuMSwg
ICAgICAyLCAgICAgMTAsICAgICAgMSB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgUVN0cmluZyBw
ID0gcS0+cHJvcGVydHkoIl9xX1JlcGFpbnRUaHJvdHRsaW5nUHJlc2V0IikudG9TdHJpbmcoKTsK
LSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2YocHJlc2V0cykgLyBzaXplb2Yo
cHJlc2V0c1swXSk7IGkrKykgewotICAgICAgICAgICAgaWYgKHAgPT0gUUxhdGluMVN0cmluZyhw
cmVzZXRzW2ldLm5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgRnJhbWVWaWV3OjpzZXRSZXBhaW50
VGhyb3R0bGluZ0RlZmVycmVkUmVwYWludERlbGF5KAotICAgICAgICAgICAgICAgICAgICAgICAg
cHJlc2V0c1tpXS5kZWZlcnJlZFJlcGFpbnREZWxheSk7Ci0gICAgICAgICAgICAgICAgRnJhbWVW
aWV3OjpzZXRSZXBhaW50VGhyb3R0bGluZ25Jbml0aWFsRGVmZXJyZWRSZXBhaW50RGVsYXlEdXJp
bmdMb2FkaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2V0c1tpXS5pbml0aWFsRGVm
ZXJyZWRSZXBhaW50RGVsYXlEdXJpbmdMb2FkaW5nKTsKLSAgICAgICAgICAgICAgICBGcmFtZVZp
ZXc6OnNldFJlcGFpbnRUaHJvdHRsaW5nTWF4RGVmZXJyZWRSZXBhaW50RGVsYXlEdXJpbmdMb2Fk
aW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2V0c1tpXS5tYXhEZWZlcnJlZFJlcGFp
bnREZWxheUR1cmluZ0xvYWRpbmcpOwotICAgICAgICAgICAgICAgIEZyYW1lVmlldzo6c2V0UmVw
YWludFRocm90dGxpbmdEZWZlcnJlZFJlcGFpbnREZWxheUluY3JlbWVudER1cmluZ0xvYWRpbmco
Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVzZXRzW2ldLmRlZmVycmVkUmVwYWludERlbGF5
SW5jcmVtZW50RHVyaW5nTG9hZGluZyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZXZlbnQtPnByb3BlcnR5TmFt
ZSgpID09ICJfcV93ZWJJbnNwZWN0b3JTZXJ2ZXJQb3J0IikgewotICAgICAgICBJbnNwZWN0b3JT
ZXJ2ZXJRdCogaW5zcGVjdG9yU2VydmVyID0gSW5zcGVjdG9yU2VydmVyUXQ6OnNlcnZlcigpOwot
ICAgICAgICBpbnNwZWN0b3JTZXJ2ZXItPmxpc3RlbihpbnNwZWN0b3JTZXJ2ZXJQb3J0KCkpOwot
ICAgIH0gZWxzZSBpZiAoZXZlbnQtPnByb3BlcnR5TmFtZSgpID09ICJfcV9kZWFkRGVjb2RlZERh
dGFEZWxldGlvbkludGVydmFsIikgewotICAgICAgICBkb3VibGUgaW50ZXJ2YWwgPSBxLT5wcm9w
ZXJ0eSgiX3FfZGVhZERlY29kZWREYXRhRGVsZXRpb25JbnRlcnZhbCIpLnRvRG91YmxlKCk7Ci0g
ICAgICAgIG1lbW9yeUNhY2hlKCktPnNldERlYWREZWNvZGVkRGF0YURlbGV0aW9uSW50ZXJ2YWwo
aW50ZXJ2YWwpOwotICAgIH0KLX0KLSNlbmRpZgotCi12b2lkIFFXZWJQYWdlUHJpdmF0ZTo6c2hv
cnRjdXRPdmVycmlkZUV2ZW50KFFLZXlFdmVudCogZXZlbnQpCi17Ci0gICAgV2ViQ29yZTo6RnJh
bWUqIGZyYW1lID0gcGFnZS0+Zm9jdXNDb250cm9sbGVyKCktPmZvY3VzZWRPck1haW5GcmFtZSgp
OwotICAgIFdlYkNvcmU6OkVkaXRvciogZWRpdG9yID0gZnJhbWUtPmVkaXRvcigpOwotICAgIGlm
IChlZGl0b3ItPmNhbkVkaXQoKSkgewotICAgICAgICBpZiAoZXZlbnQtPm1vZGlmaWVycygpID09
IFF0OjpOb01vZGlmaWVyCi0gICAgICAgICAgICB8fCBldmVudC0+bW9kaWZpZXJzKCkgPT0gUXQ6
OlNoaWZ0TW9kaWZpZXIKLSAgICAgICAgICAgIHx8IGV2ZW50LT5tb2RpZmllcnMoKSA9PSBRdDo6
S2V5cGFkTW9kaWZpZXIpIHsKLSAgICAgICAgICAgICAgICBpZiAoZXZlbnQtPmtleSgpIDwgUXQ6
OktleV9Fc2NhcGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZXZlbnQtPmFjY2VwdCgpOwotICAg
ICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQt
PmtleSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgUXQ6OktleV9SZXR1cm46Ci0gICAg
ICAgICAgICAgICAgICAgIGNhc2UgUXQ6OktleV9FbnRlcjoKLSAgICAgICAgICAgICAgICAgICAg
Y2FzZSBRdDo6S2V5X0RlbGV0ZToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBRdDo6S2V5X0hv
bWU6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgUXQ6OktleV9FbmQ6Ci0gICAgICAgICAgICAg
ICAgICAgIGNhc2UgUXQ6OktleV9CYWNrc3BhY2U6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2Ug
UXQ6OktleV9MZWZ0OgotICAgICAgICAgICAgICAgICAgICBjYXNlIFF0OjpLZXlfUmlnaHQ6Ci0g
ICAgICAgICAgICAgICAgICAgIGNhc2UgUXQ6OktleV9VcDoKLSAgICAgICAgICAgICAgICAgICAg
Y2FzZSBRdDo6S2V5X0Rvd246Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgUXQ6OktleV9UYWI6
Ci0gICAgICAgICAgICAgICAgICAgICAgICBldmVudC0+YWNjZXB0KCk7Ci0gICAgICAgICAgICAg
ICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAg
ICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotI2lmbmRlZiBRVF9O
T19TSE9SVENVVAotICAgICAgICBlbHNlIGlmIChlZGl0b3JBY3Rpb25Gb3JLZXlFdmVudChldmVu
dCkgIT0gUVdlYlBhZ2U6Ok5vV2ViQWN0aW9uKQotICAgICAgICAgICAgZXZlbnQtPmFjY2VwdCgp
OwotI2VuZGlmCi0gICAgfQotfQotCi1ib29sIFFXZWJQYWdlUHJpdmF0ZTo6aGFuZGxlU2Nyb2xs
aW5nKFFLZXlFdmVudCAqZXYsIEZyYW1lICpmcmFtZSkKLXsKLSAgICBTY3JvbGxEaXJlY3Rpb24g
ZGlyZWN0aW9uOwotICAgIFNjcm9sbEdyYW51bGFyaXR5IGdyYW51bGFyaXR5OwotCi0jaWZuZGVm
IFFUX05PX1NIT1JUQ1VUCi0gICAgaWYgKGV2ID09IFFLZXlTZXF1ZW5jZTo6TW92ZVRvTmV4dFBh
Z2UKLSAgICAgICAgfHwgKGV2LT5rZXkoKSA9PSBRdDo6S2V5X1NwYWNlICYmICEoZXYtPm1vZGlm
aWVycygpICYgUXQ6OlNoaWZ0TW9kaWZpZXIpKSkgewotICAgICAgICBncmFudWxhcml0eSA9IFNj
cm9sbEJ5UGFnZTsKLSAgICAgICAgZGlyZWN0aW9uID0gU2Nyb2xsRG93bjsKLSAgICB9IGVsc2Ug
aWYgKGV2ID09IFFLZXlTZXF1ZW5jZTo6TW92ZVRvUHJldmlvdXNQYWdlCi0gICAgICAgICAgICAg
ICB8fCAoKGV2LT5rZXkoKSA9PSBRdDo6S2V5X1NwYWNlKSAmJiAoZXYtPm1vZGlmaWVycygpICYg
UXQ6OlNoaWZ0TW9kaWZpZXIpKSkgewotICAgICAgICBncmFudWxhcml0eSA9IFNjcm9sbEJ5UGFn
ZTsKLSAgICAgICAgZGlyZWN0aW9uID0gU2Nyb2xsVXA7Ci0gICAgfSBlbHNlCi0jZW5kaWYgLy8g
UVRfTk9fU0hPUlRDVVQKLSAgICBpZiAoKGV2LT5rZXkoKSA9PSBRdDo6S2V5X1VwICYmIGV2LT5t
b2RpZmllcnMoKSAmIFF0OjpDb250cm9sTW9kaWZpZXIpCi0gICAgICAgICAgICAgICB8fCBldi0+
a2V5KCkgPT0gUXQ6OktleV9Ib21lKSB7Ci0gICAgICAgIGdyYW51bGFyaXR5ID0gU2Nyb2xsQnlE
b2N1bWVudDsKLSAgICAgICAgZGlyZWN0aW9uID0gU2Nyb2xsVXA7Ci0gICAgfSBlbHNlIGlmICgo
ZXYtPmtleSgpID09IFF0OjpLZXlfRG93biAmJiBldi0+bW9kaWZpZXJzKCkgJiBRdDo6Q29udHJv
bE1vZGlmaWVyKQotICAgICAgICAgICAgICAgfHwgZXYtPmtleSgpID09IFF0OjpLZXlfRW5kKSB7
Ci0gICAgICAgIGdyYW51bGFyaXR5ID0gU2Nyb2xsQnlEb2N1bWVudDsKLSAgICAgICAgZGlyZWN0
aW9uID0gU2Nyb2xsRG93bjsKLSAgICB9IGVsc2UgewotICAgICAgICBzd2l0Y2ggKGV2LT5rZXko
KSkgewotICAgICAgICAgICAgY2FzZSBRdDo6S2V5X1VwOgotICAgICAgICAgICAgICAgIGdyYW51
bGFyaXR5ID0gU2Nyb2xsQnlMaW5lOwotICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IFNjcm9s
bFVwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBRdDo6S2V5X0Rv
d246Ci0gICAgICAgICAgICAgICAgZ3JhbnVsYXJpdHkgPSBTY3JvbGxCeUxpbmU7Ci0gICAgICAg
ICAgICAgICAgZGlyZWN0aW9uID0gU2Nyb2xsRG93bjsKLSAgICAgICAgICAgICAgICBicmVhazsK
LSAgICAgICAgICAgIGNhc2UgUXQ6OktleV9MZWZ0OgotICAgICAgICAgICAgICAgIGdyYW51bGFy
aXR5ID0gU2Nyb2xsQnlMaW5lOwotICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IFNjcm9sbExl
ZnQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFF0OjpLZXlfUmln
aHQ6Ci0gICAgICAgICAgICAgICAgZ3JhbnVsYXJpdHkgPSBTY3JvbGxCeUxpbmU7Ci0gICAgICAg
ICAgICAgICAgZGlyZWN0aW9uID0gU2Nyb2xsUmlnaHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAg
ICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBmcmFtZS0+ZXZlbnRIYW5kbGVyKCktPnNjcm9s
bFJlY3Vyc2l2ZWx5KGRpcmVjdGlvbiwgZ3JhbnVsYXJpdHkpOwotfQotCi12b2lkIFFXZWJQYWdl
UHJpdmF0ZTo6YWRqdXN0UG9pbnRGb3JDbGlja2luZyhRTW91c2VFdmVudCopCi17Ci0gICAgbm90
SW1wbGVtZW50ZWQoKTsKLX0KLQotI2lmICFkZWZpbmVkKFFUX05PX0dSQVBISUNTVklFVykKLXZv
aWQgUVdlYlBhZ2VQcml2YXRlOjphZGp1c3RQb2ludEZvckNsaWNraW5nKFFHcmFwaGljc1NjZW5l
TW91c2VFdmVudCogZXYpCi17Ci0gICAgUXRQbGF0Zm9ybVBsdWdpbiBwbGF0Zm9ybVBsdWdpbjsK
LSAgICBPd25QdHI8UVdlYlRvdWNoTW9kaWZpZXI+IHRvdWNoTW9kaWZpZXIgPSBwbGF0Zm9ybVBs
dWdpbi5jcmVhdGVUb3VjaE1vZGlmaWVyKCk7Ci0gICAgaWYgKCF0b3VjaE1vZGlmaWVyKQotICAg
ICAgICByZXR1cm47Ci0KLSAgICB1bnNpZ25lZCB0b3BQYWRkaW5nID0gdG91Y2hNb2RpZmllci0+
aGl0VGVzdFBhZGRpbmdGb3JUb3VjaChRV2ViVG91Y2hNb2RpZmllcjo6VXApOwotICAgIHVuc2ln
bmVkIHJpZ2h0UGFkZGluZyA9IHRvdWNoTW9kaWZpZXItPmhpdFRlc3RQYWRkaW5nRm9yVG91Y2go
UVdlYlRvdWNoTW9kaWZpZXI6OlJpZ2h0KTsKLSAgICB1bnNpZ25lZCBib3R0b21QYWRkaW5nID0g
dG91Y2hNb2RpZmllci0+aGl0VGVzdFBhZGRpbmdGb3JUb3VjaChRV2ViVG91Y2hNb2RpZmllcjo6
RG93bik7Ci0gICAgdW5zaWduZWQgbGVmdFBhZGRpbmcgPSB0b3VjaE1vZGlmaWVyLT5oaXRUZXN0
UGFkZGluZ0ZvclRvdWNoKFFXZWJUb3VjaE1vZGlmaWVyOjpMZWZ0KTsKLQotICAgIHRvdWNoTW9k
aWZpZXIgPSBudWxscHRyOwotCi0gICAgaWYgKCF0b3BQYWRkaW5nICYmICFyaWdodFBhZGRpbmcg
JiYgIWJvdHRvbVBhZGRpbmcgJiYgIWxlZnRQYWRkaW5nKQotICAgICAgICByZXR1cm47Ci0KLSAg
ICBEb2N1bWVudCogc3RhcnRpbmdEb2N1bWVudCA9IHBhZ2UtPm1haW5GcmFtZSgpLT5kb2N1bWVu
dCgpOwotICAgIGlmICghc3RhcnRpbmdEb2N1bWVudCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAg
SW50UG9pbnQgb3JpZ2luYWxQb2ludChRUG9pbnRGKGV2LT5wb3MoKSkudG9Qb2ludCgpKTsKLSAg
ICBUb3VjaEFkanVzdGVyIHRvdWNoQWRqdXN0ZXIodG9wUGFkZGluZywgcmlnaHRQYWRkaW5nLCBi
b3R0b21QYWRkaW5nLCBsZWZ0UGFkZGluZyk7Ci0gICAgSW50UG9pbnQgYWRqdXN0ZWRQb2ludCA9
IHRvdWNoQWRqdXN0ZXIuZmluZENhbmRpZGF0ZVBvaW50Rm9yVG91Y2gob3JpZ2luYWxQb2ludCwg
c3RhcnRpbmdEb2N1bWVudCk7Ci0gICAgaWYgKGFkanVzdGVkUG9pbnQgPT0gSW50UG9pbnQ6Onpl
cm8oKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgZXYtPnNldFBvcyhRUG9pbnRGKGFkanVzdGVk
UG9pbnQpKTsKLX0KLSNlbmRpZgotCi1ib29sIFFXZWJQYWdlUHJpdmF0ZTo6dG91Y2hFdmVudChR
VG91Y2hFdmVudCogZXZlbnQpCi17Ci0jaWYgRU5BQkxFKFRPVUNIX0VWRU5UUykKLSAgICBXZWJD
b3JlOjpGcmFtZSogZnJhbWUgPSBRV2ViRnJhbWVQcml2YXRlOjpjb3JlKG1haW5GcmFtZS5kYXRh
KCkpOwotICAgIGlmICghZnJhbWUtPnZpZXcoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0g
ICAgLy8gQWx3YXlzIGFjY2VwdCB0aGUgUVRvdWNoRXZlbnQgc28gdGhhdCB3ZSdsbCByZWNlaXZl
IGFsc28gVG91Y2hVcGRhdGUgYW5kIFRvdWNoRW5kIGV2ZW50cwotICAgIGV2ZW50LT5zZXRBY2Nl
cHRlZCh0cnVlKTsKLQotICAgIC8vIFJldHVybiB3aGV0aGVyIHRoZSBkZWZhdWx0IGFjdGlvbiB3
YXMgY2FuY2VsbGVkIGluIHRoZSBKUyBldmVudCBoYW5kbGVyCi0gICAgcmV0dXJuIGZyYW1lLT5l
dmVudEhhbmRsZXIoKS0+aGFuZGxlVG91Y2hFdmVudChjb252ZXJ0VG91Y2hFdmVudChldmVudCkp
OwotI2Vsc2UKLSAgICBldmVudC0+aWdub3JlKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotI2VuZGlm
Ci19Ci0KLWJvb2wgUVdlYlBhZ2VQcml2YXRlOjpnZXN0dXJlRXZlbnQoUUdlc3R1cmVFdmVudCog
ZXZlbnQpCi17Ci0gICAgUVdlYkZyYW1lQWRhcHRlciogZnJhbWUgPSBtYWluRnJhbWUuZGF0YSgp
LT5kOwotICAgIGlmICghZnJhbWUtPmhhc1ZpZXcoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgIC8vIFFHZXN0dXJlRXZlbnRzIGNhbiBjb250YWluIHVwZGF0ZXMgZm9yIG11bHRpcGxlIGdl
c3R1cmVzLgotICAgIGJvb2wgaGFuZGxlZCA9IGZhbHNlOwotI2lmIEVOQUJMRShHRVNUVVJFX0VW
RU5UUykKLSAgICAvLyBRR2VzdHVyZUV2ZW50IGxpdmVzIGluIFdpZGdldHMsIHdlJ2xsIG5lZWQg
YSBkdW1teSBzdHJ1Y3QgdG8gbXVsZSB0aGUgaW5mbyBpdCBjb250YWlucyB0byB0aGUgIm90aGVy
IHNpZGUiCi0gICAgUUdlc3R1cmVFdmVudEZhY2FkZSBnZXN0dXJlRmFjYWRlOwotCi0gICAgUUdl
c3R1cmUqIGdlc3R1cmUgPSBldmVudC0+Z2VzdHVyZShRdDo6VGFwR2VzdHVyZSk7Ci0gICAgLy8g
QmV3YXJlIHRoYXQgZ2VzdHVyZXMgc2VuZCBieSBEdW1wUmVuZGVyVHJlZSB3aWxsIGhhdmUgc3Rh
dGUgUXQ6Ok5vR2VzdHVyZSwKLSAgICAvLyBkdWUgdG8gbm90IG9yaWdpbmF0aW5nIGZyb20gYSBH
ZXN0dXJlUmVjb2duaXplci4KLSAgICBpZiAoZ2VzdHVyZSAmJiAoZ2VzdHVyZS0+c3RhdGUoKSA9
PSBRdDo6R2VzdHVyZVN0YXJ0ZWQgfHwgZ2VzdHVyZS0+c3RhdGUoKSA9PSBRdDo6Tm9HZXN0dXJl
KSkgewotICAgICAgICBnZXN0dXJlRmFjYWRlLnR5cGUgPSBRdDo6VGFwR2VzdHVyZTsKLSAgICAg
ICAgUVBvaW50RiBnbG9iYWxQb3MgPSBzdGF0aWNfY2FzdDxjb25zdCBRVGFwR2VzdHVyZSo+KGdl
c3R1cmUpLT5wb3NpdGlvbigpOwotICAgICAgICBnZXN0dXJlRmFjYWRlLmdsb2JhbFBvcyA9IGds
b2JhbFBvcy50b1BvaW50KCk7Ci0gICAgICAgIGdlc3R1cmVGYWNhZGUucG9zID0gZXZlbnQtPndp
ZGdldCgpLT5tYXBGcm9tR2xvYmFsKGdsb2JhbFBvcy50b1BvaW50KCkpOwotICAgICAgICBmcmFt
ZS0+aGFuZGxlR2VzdHVyZUV2ZW50KCZnZXN0dXJlRmFjYWRlKTsKLSAgICAgICAgaGFuZGxlZCA9
IHRydWU7Ci0gICAgfQotICAgIGdlc3R1cmUgPSBldmVudC0+Z2VzdHVyZShRdDo6VGFwQW5kSG9s
ZEdlc3R1cmUpOwotICAgIGlmIChnZXN0dXJlICYmIChnZXN0dXJlLT5zdGF0ZSgpID09IFF0OjpH
ZXN0dXJlU3RhcnRlZCB8fCBnZXN0dXJlLT5zdGF0ZSgpID09IFF0OjpOb0dlc3R1cmUpKSB7Ci0g
ICAgICAgIGdlc3R1cmVGYWNhZGUudHlwZSA9IFF0OjpUYXBBbmRIb2xkR2VzdHVyZTsKLSAgICAg
ICAgUVBvaW50RiBnbG9iYWxQb3MgPSBzdGF0aWNfY2FzdDxjb25zdCBRVGFwQW5kSG9sZEdlc3R1
cmUqPihnZXN0dXJlKS0+cG9zaXRpb24oKTsKLSAgICAgICAgZ2VzdHVyZUZhY2FkZS5nbG9iYWxQ
b3MgPSBnbG9iYWxQb3MudG9Qb2ludCgpOwotICAgICAgICBnZXN0dXJlRmFjYWRlLnBvcyA9IGV2
ZW50LT53aWRnZXQoKS0+bWFwRnJvbUdsb2JhbChnbG9iYWxQb3MudG9Qb2ludCgpKTsKLSAgICAg
ICAgZnJhbWUtPmhhbmRsZUdlc3R1cmVFdmVudCgmZ2VzdHVyZUZhY2FkZSk7Ci0gICAgICAgIGhh
bmRsZWQgPSB0cnVlOwotICAgIH0KLSNlbmRpZiAvLyBFTkFCTEUoR0VTVFVSRV9FVkVOVFMpCi0K
LSAgICBldmVudC0+c2V0QWNjZXB0ZWQoaGFuZGxlZCk7Ci0gICAgcmV0dXJuIGhhbmRsZWQ7Ci19
Ci0KLS8qIQotICBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IHRoZSBpbnB1dCBtZXRob2QgdG8gcXVl
cnkgYSBzZXQgb2YgcHJvcGVydGllcyBvZiB0aGUgcGFnZQotICB0byBiZSBhYmxlIHRvIHN1cHBv
cnQgY29tcGxleCBpbnB1dCBtZXRob2Qgb3BlcmF0aW9ucyBhcyBzdXBwb3J0IGZvciBzdXJyb3Vu
ZGluZwotICB0ZXh0IGFuZCByZWNvbnZlcnNpb25zLgotCi0gIFxhIHByb3BlcnR5IHNwZWNpZmll
cyB3aGljaCBwcm9wZXJ0eSBpcyBxdWVyaWVkLgotCi0gIFxzYSBRV2lkZ2V0OjppbnB1dE1ldGhv
ZEV2ZW50KCksIFFJbnB1dE1ldGhvZEV2ZW50LCBRSW5wdXRDb250ZXh0Ci0qLwotUVZhcmlhbnQg
UVdlYlBhZ2U6OmlucHV0TWV0aG9kUXVlcnkoUXQ6OklucHV0TWV0aG9kUXVlcnkgcHJvcGVydHkp
IGNvbnN0Ci17Ci0gICAgRnJhbWUqIGZyYW1lID0gZC0+cGFnZS0+Zm9jdXNDb250cm9sbGVyKCkt
PmZvY3VzZWRGcmFtZSgpOwotICAgIGlmICghZnJhbWUpCi0gICAgICAgIHJldHVybiBRVmFyaWFu
dCgpOwotCi0gICAgV2ViQ29yZTo6RWRpdG9yKiBlZGl0b3IgPSBmcmFtZS0+ZWRpdG9yKCk7Ci0K
LSAgICBSZW5kZXJPYmplY3QqIHJlbmRlcmVyID0gMDsKLSAgICBSZW5kZXJUZXh0Q29udHJvbCog
cmVuZGVyVGV4dENvbnRyb2wgPSAwOwotCi0gICAgaWYgKGZyYW1lLT5zZWxlY3Rpb24oKS0+cm9v
dEVkaXRhYmxlRWxlbWVudCgpKQotICAgICAgICByZW5kZXJlciA9IGZyYW1lLT5zZWxlY3Rpb24o
KS0+cm9vdEVkaXRhYmxlRWxlbWVudCgpLT5zaGFkb3dBbmNlc3Rvck5vZGUoKS0+cmVuZGVyZXIo
KTsKLQotICAgIGlmIChyZW5kZXJlciAmJiByZW5kZXJlci0+aXNUZXh0Q29udHJvbCgpKQotICAg
ICAgICByZW5kZXJUZXh0Q29udHJvbCA9IHRvUmVuZGVyVGV4dENvbnRyb2wocmVuZGVyZXIpOwot
Ci0gICAgc3dpdGNoIChwcm9wZXJ0eSkgewotICAgICAgICBjYXNlIFF0OjpJbU1pY3JvRm9jdXM6
IHsKLSAgICAgICAgICAgIFdlYkNvcmU6OkZyYW1lVmlldyogdmlldyA9IGZyYW1lLT52aWV3KCk7
Ci0gICAgICAgICAgICBpZiAodmlldyAmJiB2aWV3LT5uZWVkc0xheW91dCgpKSB7Ci0gICAgICAg
ICAgICAgICAgLy8gV2UgY2FuJ3QgYWNjZXNzIGFic29sdXRlQ2FyZXRCb3VuZHMoKSB3aGlsZSB0
aGUgdmlldyBuZWVkcyB0byBsYXlvdXQuCi0gICAgICAgICAgICAgICAgcmV0dXJuIFFWYXJpYW50
KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gUVZhcmlhbnQodmlldy0+Y29u
dGVudHNUb1dpbmRvdyhmcmFtZS0+c2VsZWN0aW9uKCktPmFic29sdXRlQ2FyZXRCb3VuZHMoKSkp
OwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgUXQ6OkltRm9udDogewotICAgICAgICAgICAgaWYg
KHJlbmRlclRleHRDb250cm9sKSB7Ci0gICAgICAgICAgICAgICAgUmVuZGVyU3R5bGUqIHJlbmRl
clN0eWxlID0gcmVuZGVyVGV4dENvbnRyb2wtPnN0eWxlKCk7Ci0gICAgICAgICAgICAgICAgcmV0
dXJuIFFWYXJpYW50KFFGb250KHJlbmRlclN0eWxlLT5mb250KCkuc3ludGhldGljRm9udCgpKSk7
Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gUVZhcmlhbnQoUUZvbnQoKSk7Ci0g
ICAgICAgIH0KLSAgICAgICAgY2FzZSBRdDo6SW1DdXJzb3JQb3NpdGlvbjogewotICAgICAgICAg
ICAgaWYgKGVkaXRvci0+aGFzQ29tcG9zaXRpb24oKSkKLSAgICAgICAgICAgICAgICByZXR1cm4g
UVZhcmlhbnQoZnJhbWUtPnNlbGVjdGlvbigpLT5lbmQoKS5vZmZzZXRJbkNvbnRhaW5lck5vZGUo
KSk7Ci0gICAgICAgICAgICByZXR1cm4gUVZhcmlhbnQoZnJhbWUtPnNlbGVjdGlvbigpLT5leHRl
bnQoKS5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBR
dDo6SW1TdXJyb3VuZGluZ1RleHQ6IHsKLSAgICAgICAgICAgIGlmIChyZW5kZXJUZXh0Q29udHJv
bCAmJiByZW5kZXJUZXh0Q29udHJvbC0+dGV4dEZvcm1Db250cm9sRWxlbWVudCgpKSB7Ci0gICAg
ICAgICAgICAgICAgUVN0cmluZyB0ZXh0ID0gcmVuZGVyVGV4dENvbnRyb2wtPnRleHRGb3JtQ29u
dHJvbEVsZW1lbnQoKS0+dmFsdWUoKTsKLSAgICAgICAgICAgICAgICBSZWZQdHI8UmFuZ2U+IHJh
bmdlID0gZWRpdG9yLT5jb21wb3NpdGlvblJhbmdlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJh
bmdlKQotICAgICAgICAgICAgICAgICAgICB0ZXh0LnJlbW92ZShyYW5nZS0+c3RhcnRQb3NpdGlv
bigpLm9mZnNldEluQ29udGFpbmVyTm9kZSgpLCBUZXh0SXRlcmF0b3I6OnJhbmdlTGVuZ3RoKHJh
bmdlLmdldCgpKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFFWYXJpYW50KHRleHQpOwotICAg
ICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFFWYXJpYW50KCk7Ci0gICAgICAgIH0KLSAg
ICAgICAgY2FzZSBRdDo6SW1DdXJyZW50U2VsZWN0aW9uOiB7Ci0gICAgICAgICAgICBpZiAoIWVk
aXRvci0+aGFzQ29tcG9zaXRpb24oKSAmJiByZW5kZXJUZXh0Q29udHJvbCAmJiByZW5kZXJUZXh0
Q29udHJvbC0+dGV4dEZvcm1Db250cm9sRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICAgICAgaW50
IHN0YXJ0ID0gZnJhbWUtPnNlbGVjdGlvbigpLT5zdGFydCgpLm9mZnNldEluQ29udGFpbmVyTm9k
ZSgpOwotICAgICAgICAgICAgICAgIGludCBlbmQgPSBmcmFtZS0+c2VsZWN0aW9uKCktPmVuZCgp
Lm9mZnNldEluQ29udGFpbmVyTm9kZSgpOwotICAgICAgICAgICAgICAgIGlmIChlbmQgPiBzdGFy
dCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFFWYXJpYW50KFFTdHJpbmcocmVuZGVyVGV4
dENvbnRyb2wtPnRleHRGb3JtQ29udHJvbEVsZW1lbnQoKS0+dmFsdWUoKSkubWlkKHN0YXJ0LCBl
bmQgLSBzdGFydCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFFWYXJpYW50
KCk7Ci0KLSAgICAgICAgfQotICAgICAgICBjYXNlIFF0OjpJbUFuY2hvclBvc2l0aW9uOiB7Ci0g
ICAgICAgICAgICBpZiAoZWRpdG9yLT5oYXNDb21wb3NpdGlvbigpKQotICAgICAgICAgICAgICAg
IHJldHVybiBRVmFyaWFudChmcmFtZS0+c2VsZWN0aW9uKCktPnN0YXJ0KCkub2Zmc2V0SW5Db250
YWluZXJOb2RlKCkpOwotICAgICAgICAgICAgcmV0dXJuIFFWYXJpYW50KGZyYW1lLT5zZWxlY3Rp
b24oKS0+YmFzZSgpLm9mZnNldEluQ29udGFpbmVyTm9kZSgpKTsKLSAgICAgICAgfQotICAgICAg
ICBjYXNlIFF0OjpJbU1heGltdW1UZXh0TGVuZ3RoOiB7Ci0gICAgICAgICAgICBpZiAoZnJhbWUt
PnNlbGVjdGlvbigpLT5pc0NvbnRlbnRFZGl0YWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYg
KGZyYW1lLT5kb2N1bWVudCgpICYmIGZyYW1lLT5kb2N1bWVudCgpLT5mb2N1c2VkTm9kZSgpKSB7
Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZS0+ZG9jdW1lbnQoKS0+Zm9jdXNlZE5vZGUo
KS0+aGFzVGFnTmFtZShIVE1MTmFtZXM6OmlucHV0VGFnKSkgewotICAgICAgICAgICAgICAgICAg
ICAgICAgSFRNTElucHV0RWxlbWVudCogaW5wdXRFbGVtZW50ID0gc3RhdGljX2Nhc3Q8SFRNTElu
cHV0RWxlbWVudCo+KGZyYW1lLT5kb2N1bWVudCgpLT5mb2N1c2VkTm9kZSgpKTsKLSAgICAgICAg
ICAgICAgICAgICAgICAgIHJldHVybiBRVmFyaWFudChpbnB1dEVsZW1lbnQtPm1heExlbmd0aCgp
KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAg
ICAgICByZXR1cm4gUVZhcmlhbnQoSFRNTElucHV0RWxlbWVudDo6bWF4aW11bUxlbmd0aCk7Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gUVZhcmlhbnQoMCk7Ci0gICAgICAgIH0K
LSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBRVmFyaWFudCgpOwotICAgIH0K
LX0KLQotLyohCi0gICAgXGludGVybmFsCi0qLwotdm9pZCBRV2ViUGFnZVByaXZhdGU6OnNldElu
c3BlY3RvcihRV2ViSW5zcGVjdG9yKiBpbnNwKQotewotICAgIGlmIChpbnNwZWN0b3IpCi0gICAg
ICAgIGluc3BlY3Rvci0+ZC0+c2V0RnJvbnRlbmQoMCk7Ci0KLSAgICBpbnNwZWN0b3IgPSBpbnNw
OwotCi0gICAgLy8gR2l2ZSBpbnNwZWN0b3IgZnJvbnRlbmQgd2ViIHZpZXcgaWYgcHJldmlvdXNs
eSBjcmVhdGVkCi0gICAgaWYgKGluc3BlY3RvciAmJiBpbnNwZWN0b3JGcm9udGVuZCkKLSAgICAg
ICAgaW5zcGVjdG9yLT5kLT5zZXRGcm9udGVuZChpbnNwZWN0b3JGcm9udGVuZCk7Ci19Ci0KLS8q
IQotICAgIFxpbnRlcm5hbAotICAgIFJldHVybnMgdGhlIGluc3BlY3RvciBhbmQgY3JlYXRlcyBp
dCBpZiBpdCB3YXNuJ3QgY3JlYXRlZCB5ZXQuCi0gICAgVGhlIGluc3RhbmNlIGNyZWF0ZWQgaGVy
ZSB3aWxsIG5vdCBiZSBhdmFpbGFibGUgdGhyb3VnaCBRV2ViUGFnZSdzIEFQSS4KLSovCi1RV2Vi
SW5zcGVjdG9yKiBRV2ViUGFnZVByaXZhdGU6OmdldE9yQ3JlYXRlSW5zcGVjdG9yKCkKLXsKLSNp
ZiBFTkFCTEUoSU5TUEVDVE9SKQotICAgIGlmICghaW5zcGVjdG9yKSB7Ci0gICAgICAgIFFXZWJJ
bnNwZWN0b3IqIGluc3AgPSBuZXcgUVdlYkluc3BlY3RvcjsKLSAgICAgICAgaW5zcC0+c2V0UGFn
ZShxKTsKLSAgICAgICAgaW5zcGVjdG9ySXNJbnRlcm5hbE9ubHkgPSB0cnVlOwotCi0gICAgICAg
IFFfQVNTRVJUKGluc3BlY3Rvcik7IC8vIEFzc29jaWF0ZWQgdGhyb3VnaCBRV2ViSW5zcGVjdG9y
OjpzZXRQYWdlKHEpCi0gICAgfQotI2VuZGlmCi0gICAgcmV0dXJuIGluc3BlY3RvcjsKLX0KLQot
LyohIFxpbnRlcm5hbCAqLwotSW5zcGVjdG9yQ29udHJvbGxlciogUVdlYlBhZ2VQcml2YXRlOjpp
bnNwZWN0b3JDb250cm9sbGVyKCkKLXsKLSNpZiBFTkFCTEUoSU5TUEVDVE9SKQotICAgIHJldHVy
biBwYWdlLT5pbnNwZWN0b3JDb250cm9sbGVyKCk7Ci0jZWxzZQotICAgIHJldHVybiAwOwotI2Vu
ZGlmCi19Ci0KLXF1aW50MTYgUVdlYlBhZ2VQcml2YXRlOjppbnNwZWN0b3JTZXJ2ZXJQb3J0KCkK
LXsKLSNpZiBFTkFCTEUoSU5TUEVDVE9SKSAmJiAhZGVmaW5lZChRVF9OT19QUk9QRVJUSUVTKQot
ICAgIGlmIChxICYmIHEtPnByb3BlcnR5KCJfcV93ZWJJbnNwZWN0b3JTZXJ2ZXJQb3J0IikuaXNW
YWxpZCgpKQotICAgICAgICByZXR1cm4gcS0+cHJvcGVydHkoIl9xX3dlYkluc3BlY3RvclNlcnZl
clBvcnQiKS50b0ludCgpOwotI2VuZGlmCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBib29s
IGhhc01vdXNlTGlzdGVuZXIoRWxlbWVudCogZWxlbWVudCkKLXsKLSAgICBBU1NFUlQoZWxlbWVu
dCk7Ci0gICAgcmV0dXJuIGVsZW1lbnQtPmhhc0V2ZW50TGlzdGVuZXJzKGV2ZW50TmFtZXMoKS5j
bGlja0V2ZW50KQotICAgICAgICB8fCBlbGVtZW50LT5oYXNFdmVudExpc3RlbmVycyhldmVudE5h
bWVzKCkubW91c2Vkb3duRXZlbnQpCi0gICAgICAgIHx8IGVsZW1lbnQtPmhhc0V2ZW50TGlzdGVu
ZXJzKGV2ZW50TmFtZXMoKS5tb3VzZXVwRXZlbnQpOwotfQotCi1zdGF0aWMgYm9vbCBpc0NsaWNr
YWJsZUVsZW1lbnQoRWxlbWVudCogZWxlbWVudCwgUmVmUHRyPE5vZGVMaXN0PiBsaXN0KQotewot
ICAgIEFTU0VSVChlbGVtZW50KTsKLSAgICBib29sIGlzQ2xpY2thYmxlID0gaGFzTW91c2VMaXN0
ZW5lcihlbGVtZW50KTsKLSAgICBpZiAoIWlzQ2xpY2thYmxlICYmIGxpc3QpIHsKLSAgICAgICAg
RWxlbWVudCogcGFyZW50ID0gZWxlbWVudC0+cGFyZW50RWxlbWVudCgpOwotICAgICAgICB1bnNp
Z25lZCBjb3VudCA9IGxpc3QtPmxlbmd0aCgpOwotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAw
OyBpIDwgY291bnQgJiYgcGFyZW50OyBpKyspIHsKLSAgICAgICAgICAgIGlmIChsaXN0LT5pdGVt
KGkpICE9IHBhcmVudCkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAg
aXNDbGlja2FibGUgPSBoYXNNb3VzZUxpc3RlbmVyKHBhcmVudCk7Ci0gICAgICAgICAgICBpZiAo
aXNDbGlja2FibGUpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIHBhcmVu
dCA9IHBhcmVudC0+cGFyZW50RWxlbWVudCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgRXhj
ZXB0aW9uQ29kZSBlYyA9IDA7Ci0gICAgcmV0dXJuIGlzQ2xpY2thYmxlCi0gICAgICAgIHx8IGVs
ZW1lbnQtPndlYmtpdE1hdGNoZXNTZWxlY3RvcigiYSwqOmxpbmssKjp2aXNpdGVkLCpbcm9sZT1i
dXR0b25dLGJ1dHRvbixpbnB1dCxzZWxlY3QsbGFiZWwiLCBlYykKLSAgICAgICAgfHwgQ1NTQ29t
cHV0ZWRTdHlsZURlY2xhcmF0aW9uOjpjcmVhdGUoZWxlbWVudCktPmdldFByb3BlcnR5VmFsdWUo
Y3NzUHJvcGVydHlJRCgiY3Vyc29yIikpID09ICJwb2ludGVyIjsKLX0KLQotc3RhdGljIGJvb2wg
aXNWYWxpZEZyYW1lT3duZXIoRWxlbWVudCogZWxlbWVudCkKLXsKLSAgICBBU1NFUlQoZWxlbWVu
dCk7Ci0gICAgcmV0dXJuIGVsZW1lbnQtPmlzRnJhbWVPd25lckVsZW1lbnQoKSAmJiBzdGF0aWNf
Y2FzdDxIVE1MRnJhbWVPd25lckVsZW1lbnQqPihlbGVtZW50KS0+Y29udGVudEZyYW1lKCk7Ci19
Ci0KLXN0YXRpYyBFbGVtZW50KiBub2RlVG9FbGVtZW50KE5vZGUqIG5vZGUpCi17Ci0gICAgaWYg
KG5vZGUgJiYgbm9kZS0+aXNFbGVtZW50Tm9kZSgpKQotICAgICAgICByZXR1cm4gc3RhdGljX2Nh
c3Q8RWxlbWVudCo+KG5vZGUpOwotICAgIHJldHVybiAwOwotfQotCi1RV2ViUGFnZVByaXZhdGU6
OlRvdWNoQWRqdXN0ZXI6OlRvdWNoQWRqdXN0ZXIodW5zaWduZWQgdG9wUGFkZGluZywgdW5zaWdu
ZWQgcmlnaHRQYWRkaW5nLCB1bnNpZ25lZCBib3R0b21QYWRkaW5nLCB1bnNpZ25lZCBsZWZ0UGFk
ZGluZykKLSAgICA6IG1fdG9wUGFkZGluZyh0b3BQYWRkaW5nKQotICAgICwgbV9yaWdodFBhZGRp
bmcocmlnaHRQYWRkaW5nKQotICAgICwgbV9ib3R0b21QYWRkaW5nKGJvdHRvbVBhZGRpbmcpCi0g
ICAgLCBtX2xlZnRQYWRkaW5nKGxlZnRQYWRkaW5nKQotewotfQotCi1JbnRQb2ludCBRV2ViUGFn
ZVByaXZhdGU6OlRvdWNoQWRqdXN0ZXI6OmZpbmRDYW5kaWRhdGVQb2ludEZvclRvdWNoKGNvbnN0
IEludFBvaW50JiB0b3VjaFBvaW50LCBEb2N1bWVudCogZG9jdW1lbnQpIGNvbnN0Ci17Ci0gICAg
aWYgKCFkb2N1bWVudCkKLSAgICAgICAgcmV0dXJuIEludFBvaW50KCk7Ci0KLSAgICBpbnQgeCA9
IHRvdWNoUG9pbnQueCgpOwotICAgIGludCB5ID0gdG91Y2hQb2ludC55KCk7Ci0KLSAgICBSZWZQ
dHI8Tm9kZUxpc3Q+IGludGVyc2VjdGVkTm9kZXMgPSBkb2N1bWVudC0+bm9kZXNGcm9tUmVjdCh4
LCB5LCBtX3RvcFBhZGRpbmcsIG1fcmlnaHRQYWRkaW5nLCBtX2JvdHRvbVBhZGRpbmcsIG1fbGVm
dFBhZGRpbmcsIGZhbHNlIC8qaWdub3JlQ2xpcHBpbmcqLywgZmFsc2UgLyphbGxvd1NoYWRvd0Nv
bnRlbnQqLyk7Ci0gICAgaWYgKCFpbnRlcnNlY3RlZE5vZGVzKQotICAgICAgICByZXR1cm4gSW50
UG9pbnQoKTsKLQotICAgIEVsZW1lbnQqIGNsb3Nlc3RDbGlja2FibGVFbGVtZW50ID0gMDsKLSAg
ICBJbnRSZWN0IGxhcmdlc3RJbnRlcnNlY3Rpb25SZWN0OwotICAgIEZyYW1lVmlldyogdmlldyA9
IGRvY3VtZW50LT5mcmFtZSgpLT52aWV3KCk7Ci0KLSAgICAvLyBUb3VjaCByZWN0IGluIGNvbnRl
bnRzIGNvb3JkaW5hdGVzLgotICAgIEludFJlY3QgdG91Y2hSZWN0KEhpdFRlc3RMb2NhdGlvbjo6
cmVjdEZvclBvaW50KHZpZXctPndpbmRvd1RvQ29udGVudHMoSW50UG9pbnQoeCwgeSkpLCBtX3Rv
cFBhZGRpbmcsIG1fcmlnaHRQYWRkaW5nLCBtX2JvdHRvbVBhZGRpbmcsIG1fbGVmdFBhZGRpbmcp
KTsKLQotICAgIC8vIEl0ZXJhdGUgb3ZlciB0aGUgbGlzdCBvZiBub2RlcyBoaXQgbG9va2luZyBm
b3IgdGhlIG9uZSB3aG9zZSBib3VuZGluZyBhcmVhCi0gICAgLy8gaGFzIGxhcmdlc3QgaW50ZXJz
ZWN0aW9uIHdpdGggdGhlIHRvdWNoIGFyZWEgKHBvaW50ICsgcGFkZGluZykuCi0gICAgZm9yICh1
bnNpZ25lZCBpID0gMDsgaSA8IGludGVyc2VjdGVkTm9kZXMtPmxlbmd0aCgpOyBpKyspIHsKLSAg
ICAgICAgTm9kZSogY3VycmVudE5vZGUgPSBpbnRlcnNlY3RlZE5vZGVzLT5pdGVtKGkpOwotCi0g
ICAgICAgIEVsZW1lbnQqIGN1cnJlbnRFbGVtZW50ID0gbm9kZVRvRWxlbWVudChjdXJyZW50Tm9k
ZSk7Ci0gICAgICAgIGlmICghY3VycmVudEVsZW1lbnQgfHwgKCFpc0NsaWNrYWJsZUVsZW1lbnQo
Y3VycmVudEVsZW1lbnQsIDApICYmICFpc1ZhbGlkRnJhbWVPd25lcihjdXJyZW50RWxlbWVudCkp
KQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgSW50UmVjdCBjdXJyZW50RWxlbWVu
dEJvdW5kaW5nUmVjdCA9IGN1cnJlbnRFbGVtZW50LT5waXhlbFNuYXBwZWRCb3VuZGluZ0JveCgp
OwotICAgICAgICBjdXJyZW50RWxlbWVudEJvdW5kaW5nUmVjdC5pbnRlcnNlY3QodG91Y2hSZWN0
KTsKLQotICAgICAgICBpZiAoY3VycmVudEVsZW1lbnRCb3VuZGluZ1JlY3QuaXNFbXB0eSgpKQot
ICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgaW50IGN1cnJlbnRJbnRlcnNlY3Rpb25S
ZWN0QXJlYSA9IGN1cnJlbnRFbGVtZW50Qm91bmRpbmdSZWN0LndpZHRoKCkgKiBjdXJyZW50RWxl
bWVudEJvdW5kaW5nUmVjdC5oZWlnaHQoKTsKLSAgICAgICAgaW50IGxhcmdlc3RJbnRlcnNlY3Rp
b25SZWN0QXJlYSA9IGxhcmdlc3RJbnRlcnNlY3Rpb25SZWN0LndpZHRoKCkgKiBsYXJnZXN0SW50
ZXJzZWN0aW9uUmVjdC5oZWlnaHQoKTsKLSAgICAgICAgaWYgKGN1cnJlbnRJbnRlcnNlY3Rpb25S
ZWN0QXJlYSA+IGxhcmdlc3RJbnRlcnNlY3Rpb25SZWN0QXJlYSkgewotICAgICAgICAgICAgY2xv
c2VzdENsaWNrYWJsZUVsZW1lbnQgPSBjdXJyZW50RWxlbWVudDsKLSAgICAgICAgICAgIGxhcmdl
c3RJbnRlcnNlY3Rpb25SZWN0ID0gY3VycmVudEVsZW1lbnRCb3VuZGluZ1JlY3Q7Ci0gICAgICAg
IH0KLSAgICB9Ci0KLSAgICBpZiAobGFyZ2VzdEludGVyc2VjdGlvblJlY3QuaXNFbXB0eSgpKQot
ICAgICAgICByZXR1cm4gSW50UG9pbnQoKTsKLQotICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVu
IHVzZXIgdGFwcyBhIGlubmVyIGZyYW1lLiBJdCBpcyBkb25lIGluIHRocmVlIHN0ZXBzOgotICAg
IC8vIDEpIFRyYW5zZm9ybSB0aGUgb3JpZ2luYWwgdG91Y2ggcG9pbnQgdG8gdGhlIGlubmVyIGRv
Y3VtZW50IGNvb3JkaW5hdGVzOwotICAgIC8vIDEpIENhbGwgbm9kZXNGcm9tUmVjdCBmb3IgdGhl
IGlubmVyIGRvY3VtZW50IGluIGNhc2U7Ci0gICAgLy8gMykgUmUtYWRkIHRoZSBpbm5lciBmcmFt
ZSBvZmZzZXQgKGxvY2F0aW9uKSBiZWZvcmUgcGFzc2luZyB0aGUgbmV3IGNsaWNraW5nCi0gICAg
Ly8gICAgcG9zaXRpb24gdG8gV2ViQ29yZS4KLSAgICBpZiAoY2xvc2VzdENsaWNrYWJsZUVsZW1l
bnQtPmlzRnJhbWVPd25lckVsZW1lbnQoKSkgewotICAgICAgICAvLyBBZGp1c3QgY2xpZW50IGNv
b3JkaW5hdGVzJyBvcmlnaW4gdG8gYmUgdG9wIGxlZnQgb2YgaW5uZXIgZnJhbWUgdmlld3BvcnQu
Ci0gICAgICAgIFBhc3NSZWZQdHI8Q2xpZW50UmVjdD4gcmVjdCA9IGNsb3Nlc3RDbGlja2FibGVF
bGVtZW50LT5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKLSAgICAgICAgSW50UG9pbnQgbmV3VG91
Y2hQb2ludCA9IHRvdWNoUG9pbnQ7Ci0gICAgICAgIEludFNpemUgb2Zmc2V0ID0gIEludFNpemUo
cmVjdC0+bGVmdCgpLCByZWN0LT50b3AoKSk7Ci0gICAgICAgIG5ld1RvdWNoUG9pbnQgLT0gb2Zm
c2V0OwotCi0gICAgICAgIEhUTUxGcmFtZU93bmVyRWxlbWVudCogb3duZXIgPSBzdGF0aWNfY2Fz
dDxIVE1MRnJhbWVPd25lckVsZW1lbnQqPihjbG9zZXN0Q2xpY2thYmxlRWxlbWVudCk7Ci0gICAg
ICAgIERvY3VtZW50KiBjaGlsZERvY3VtZW50ID0gb3duZXItPmNvbnRlbnRGcmFtZSgpLT5kb2N1
bWVudCgpOwotICAgICAgICByZXR1cm4gZmluZENhbmRpZGF0ZVBvaW50Rm9yVG91Y2gobmV3VG91
Y2hQb2ludCwgY2hpbGREb2N1bWVudCk7Ci0gICAgfQotICAgIHJldHVybiB2aWV3LT5jb250ZW50
c1RvV2luZG93KGxhcmdlc3RJbnRlcnNlY3Rpb25SZWN0KS5jZW50ZXIoKTsKLX0KLQotLyohCi0g
ICBcZW51bSBRV2ViUGFnZTo6RmluZEZsYWcKLQotICAgVGhpcyBlbnVtIGRlc2NyaWJlcyB0aGUg
b3B0aW9ucyBhdmFpbGFibGUgdG8gdGhlIGZpbmRUZXh0KCkgZnVuY3Rpb24uIFRoZSBvcHRpb25z
Ci0gICBjYW4gYmUgT1ItZWQgdG9nZXRoZXIgZnJvbSB0aGUgZm9sbG93aW5nIGxpc3Q6Ci0KLSAg
IFx2YWx1ZSBGaW5kQmFja3dhcmQgU2VhcmNoZXMgYmFja3dhcmRzIGluc3RlYWQgb2YgZm9yd2Fy
ZHMuCi0gICBcdmFsdWUgRmluZENhc2VTZW5zaXRpdmVseSBCeSBkZWZhdWx0IGZpbmRUZXh0KCkg
d29ya3MgY2FzZSBpbnNlbnNpdGl2ZS4gU3BlY2lmeWluZyB0aGlzIG9wdGlvbgotICAgY2hhbmdl
cyB0aGUgYmVoYXZpb3VyIHRvIGEgY2FzZSBzZW5zaXRpdmUgZmluZCBvcGVyYXRpb24uCi0gICBc
dmFsdWUgRmluZFdyYXBzQXJvdW5kRG9jdW1lbnQgTWFrZXMgZmluZFRleHQoKSByZXN0YXJ0IGZy
b20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZG9jdW1lbnQgaWYgdGhlIGVuZAotICAgd2FzIHJlYWNo
ZWQgYW5kIHRoZSB0ZXh0IHdhcyBub3QgZm91bmQuCi0gICBcdmFsdWUgSGlnaGxpZ2h0QWxsT2Nj
dXJyZW5jZXMgSGlnaGxpZ2h0cyBhbGwgZXhpc3Rpbmcgb2NjdXJyZW5jZXMgb2YgYSBzcGVjaWZp
YyBzdHJpbmcuCi0gICAgICAgKFRoaXMgdmFsdWUgd2FzIGludHJvZHVjZWQgaW4gNC42LikKLSov
Ci0KLS8qIQotICAgIFxlbnVtIFFXZWJQYWdlOjpMaW5rRGVsZWdhdGlvblBvbGljeQotCi0gICAg
VGhpcyBlbnVtIGRlZmluZXMgdGhlIGRlbGVnYXRpb24gcG9saWNpZXMgYSB3ZWJwYWdlIGNhbiBo
YXZlIHdoZW4gYWN0aXZhdGluZyBsaW5rcyBhbmQgZW1pdHRpbmcKLSAgICB0aGUgbGlua0NsaWNr
ZWQoKSBzaWduYWwuCi0KLSAgICBcdmFsdWUgRG9udERlbGVnYXRlTGlua3MgTm8gbGlua3MgYXJl
IGRlbGVnYXRlZC4gSW5zdGVhZCwgUVdlYlBhZ2UgdHJpZXMgdG8gaGFuZGxlIHRoZW0gYWxsLgot
ICAgIFx2YWx1ZSBEZWxlZ2F0ZUV4dGVybmFsTGlua3MgV2hlbiBhY3RpdmF0aW5nIGxpbmtzIHRo
YXQgcG9pbnQgdG8gZG9jdW1lbnRzIG5vdCBzdG9yZWQgb24gdGhlCi0gICAgbG9jYWwgZmlsZXN5
c3RlbSBvciBhbiBlcXVpdmFsZW50IC0gc3VjaCBhcyB0aGUgUXQgcmVzb3VyY2Ugc3lzdGVtIC0g
dGhlbiBsaW5rQ2xpY2tlZCgpIGlzIGVtaXR0ZWQuCi0gICAgXHZhbHVlIERlbGVnYXRlQWxsTGlu
a3MgV2hlbmV2ZXIgYSBsaW5rIGlzIGFjdGl2YXRlZCB0aGUgbGlua0NsaWNrZWQoKSBzaWduYWwg
aXMgZW1pdHRlZC4KLQotICAgIFxzYSBRV2ViUGFnZTo6bGlua0RlbGVnYXRpb25Qb2xpY3kKLSov
Ci0KLS8qIQotICAgIFxlbnVtIFFXZWJQYWdlOjpOYXZpZ2F0aW9uVHlwZQotCi0gICAgVGhpcyBl
bnVtIGRlc2NyaWJlcyB0aGUgdHlwZXMgb2YgbmF2aWdhdGlvbiBhdmFpbGFibGUgd2hlbiBicm93
c2luZyB0aHJvdWdoIGh5cGVybGlua2VkCi0gICAgZG9jdW1lbnRzLgotCi0gICAgXHZhbHVlIE5h
dmlnYXRpb25UeXBlTGlua0NsaWNrZWQgVGhlIHVzZXIgY2xpY2tlZCBvbiBhIGxpbmsgb3IgcHJl
c3NlZCByZXR1cm4gb24gYSBmb2N1c2VkIGxpbmsuCi0gICAgXHZhbHVlIE5hdmlnYXRpb25UeXBl
Rm9ybVN1Ym1pdHRlZCBUaGUgdXNlciBhY3RpdmF0ZWQgYSBzdWJtaXQgYnV0dG9uIGZvciBhbiBI
VE1MIGZvcm0uCi0gICAgXHZhbHVlIE5hdmlnYXRpb25UeXBlQmFja09yRm9yd2FyZCBOYXZpZ2F0
aW9uIHRvIGEgcHJldmlvdXNseSBzaG93biBkb2N1bWVudCBpbiB0aGUgYmFjayBvciBmb3J3YXJk
IGhpc3RvcnkgaXMgcmVxdWVzdGVkLgotICAgIFx2YWx1ZSBOYXZpZ2F0aW9uVHlwZVJlbG9hZCBU
aGUgdXNlciBhY3RpdmF0ZWQgdGhlIHJlbG9hZCBhY3Rpb24uCi0gICAgXHZhbHVlIE5hdmlnYXRp
b25UeXBlRm9ybVJlc3VibWl0dGVkIEFuIEhUTUwgZm9ybSB3YXMgc3VibWl0dGVkIGEgc2Vjb25k
IHRpbWUuCi0gICAgXHZhbHVlIE5hdmlnYXRpb25UeXBlT3RoZXIgQSBuYXZpZ2F0aW9uIHRvIGFu
b3RoZXIgZG9jdW1lbnQgdXNpbmcgYSBtZXRob2Qgbm90IGxpc3RlZCBhYm92ZS4KLQotICAgIFxz
YSBhY2NlcHROYXZpZ2F0aW9uUmVxdWVzdCgpCi0qLwotCi0vKiEKLSAgICBcZW51bSBRV2ViUGFn
ZTo6V2ViQWN0aW9uCi0KLSAgICBUaGlzIGVudW0gZGVzY3JpYmVzIHRoZSB0eXBlcyBvZiBhY3Rp
b24gd2hpY2ggY2FuIGJlIHBlcmZvcm1lZCBvbiB0aGUgd2ViIHBhZ2UuCi0KLSAgICBBY3Rpb25z
IG9ubHkgaGF2ZSBhbiBlZmZlY3Qgd2hlbiB0aGV5IGFyZSBhcHBsaWNhYmxlLiBUaGUgYXZhaWxh
YmlsaXR5IG9mCi0gICAgYWN0aW9ucyBjYW4gYmUgYmUgZGV0ZXJtaW5lZCBieSBjaGVja2luZyBc
bHtRQWN0aW9uOjp9e2lzRW5hYmxlZCgpfSBvbiB0aGUKLSAgICBhY3Rpb24gcmV0dXJuZWQgYnkg
YWN0aW9uKCkuCi0KLSAgICBPbmUgbWV0aG9kIG9mIGVuYWJsaW5nIHRoZSB0ZXh0IGVkaXRpbmcs
IGN1cnNvciBtb3ZlbWVudCwgYW5kIHRleHQgc2VsZWN0aW9uIGFjdGlvbnMKLSAgICBpcyBieSBz
ZXR0aW5nIFxsIGNvbnRlbnRFZGl0YWJsZSB0byB0cnVlLgotCi0gICAgXHZhbHVlIE5vV2ViQWN0
aW9uIE5vIGFjdGlvbiBpcyB0cmlnZ2VyZWQuCi0gICAgXHZhbHVlIE9wZW5MaW5rIE9wZW4gdGhl
IGN1cnJlbnQgbGluay4KLSAgICBcdmFsdWUgT3BlbkxpbmtJbk5ld1dpbmRvdyBPcGVuIHRoZSBj
dXJyZW50IGxpbmsgaW4gYSBuZXcgd2luZG93LgotICAgIFx2YWx1ZSBPcGVuTGlua0luVGhpc1dp
bmRvdyBPcGVuIHRoZSBjdXJyZW50IGxpbmsgd2l0aG91dCBvcGVuaW5nIGEgbmV3IHdpbmRvdy4g
VXNlZCBvbiBsaW5rcyB0aGF0IHdvdWxkIGRlZmF1bHQgdG8gb3BlbmluZyBpbiBhbm90aGVyIGZy
YW1lIG9yIGEgbmV3IHdpbmRvdy4gKEFkZGVkIGluIFF0IDUuMCkKLSAgICBcdmFsdWUgT3BlbkZy
YW1lSW5OZXdXaW5kb3cgUmVwbGljYXRlIHRoZSBjdXJyZW50IGZyYW1lIGluIGEgbmV3IHdpbmRv
dy4KLSAgICBcdmFsdWUgRG93bmxvYWRMaW5rVG9EaXNrIERvd25sb2FkIHRoZSBjdXJyZW50IGxp
bmsgdG8gdGhlIGRpc2suCi0gICAgXHZhbHVlIENvcHlMaW5rVG9DbGlwYm9hcmQgQ29weSB0aGUg
Y3VycmVudCBsaW5rIHRvIHRoZSBjbGlwYm9hcmQuCi0gICAgXHZhbHVlIE9wZW5JbWFnZUluTmV3
V2luZG93IE9wZW4gdGhlIGhpZ2hsaWdodGVkIGltYWdlIGluIGEgbmV3IHdpbmRvdy4KLSAgICBc
dmFsdWUgRG93bmxvYWRJbWFnZVRvRGlzayBEb3dubG9hZCB0aGUgaGlnaGxpZ2h0ZWQgaW1hZ2Ug
dG8gdGhlIGRpc2suCi0gICAgXHZhbHVlIENvcHlJbWFnZVRvQ2xpcGJvYXJkIENvcHkgdGhlIGhp
Z2hsaWdodGVkIGltYWdlIHRvIHRoZSBjbGlwYm9hcmQuICAoQWRkZWQgaW4gUXQgNC44KQotICAg
IFx2YWx1ZSBDb3B5SW1hZ2VVcmxUb0NsaXBib2FyZCBDb3B5IHRoZSBoaWdobGlnaHRlZCBpbWFn
ZSdzIFVSTCB0byB0aGUgY2xpcGJvYXJkLgotICAgIFx2YWx1ZSBCYWNrIE5hdmlnYXRlIGJhY2sg
aW4gdGhlIGhpc3Rvcnkgb2YgbmF2aWdhdGVkIGxpbmtzLgotICAgIFx2YWx1ZSBGb3J3YXJkIE5h
dmlnYXRlIGZvcndhcmQgaW4gdGhlIGhpc3Rvcnkgb2YgbmF2aWdhdGVkIGxpbmtzLgotICAgIFx2
YWx1ZSBTdG9wIFN0b3AgbG9hZGluZyB0aGUgY3VycmVudCBwYWdlLgotICAgIFx2YWx1ZSBTdG9w
U2NoZWR1bGVkUGFnZVJlZnJlc2ggU3RvcCBhbGwgcGVuZGluZyBwYWdlIHJlZnJlc2gvcmVkaXJl
Y3QgcmVxdWVzdHMuICAoQWRkZWQgaW4gUXQgNC43KQotICAgIFx2YWx1ZSBSZWxvYWQgUmVsb2Fk
IHRoZSBjdXJyZW50IHBhZ2UuCi0gICAgXHZhbHVlIFJlbG9hZEFuZEJ5cGFzc0NhY2hlIFJlbG9h
ZCB0aGUgY3VycmVudCBwYWdlLCBidXQgZG8gbm90IHVzZSBhbnkgbG9jYWwgY2FjaGUuIChBZGRl
ZCBpbiBRdCA0LjYpCi0gICAgXHZhbHVlIEN1dCBDdXQgdGhlIGNvbnRlbnQgY3VycmVudGx5IHNl
bGVjdGVkIGludG8gdGhlIGNsaXBib2FyZC4KLSAgICBcdmFsdWUgQ29weSBDb3B5IHRoZSBjb250
ZW50IGN1cnJlbnRseSBzZWxlY3RlZCBpbnRvIHRoZSBjbGlwYm9hcmQuCi0gICAgXHZhbHVlIFBh
c3RlIFBhc3RlIGNvbnRlbnQgZnJvbSB0aGUgY2xpcGJvYXJkLgotICAgIFx2YWx1ZSBVbmRvIFVu
ZG8gdGhlIGxhc3QgZWRpdGluZyBhY3Rpb24uCi0gICAgXHZhbHVlIFJlZG8gUmVkbyB0aGUgbGFz
dCBlZGl0aW5nIGFjdGlvbi4KLSAgICBcdmFsdWUgTW92ZVRvTmV4dENoYXIgTW92ZSB0aGUgY3Vy
c29yIHRvIHRoZSBuZXh0IGNoYXJhY3Rlci4KLSAgICBcdmFsdWUgTW92ZVRvUHJldmlvdXNDaGFy
IE1vdmUgdGhlIGN1cnNvciB0byB0aGUgcHJldmlvdXMgY2hhcmFjdGVyLgotICAgIFx2YWx1ZSBN
b3ZlVG9OZXh0V29yZCBNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIG5leHQgd29yZC4KLSAgICBcdmFs
dWUgTW92ZVRvUHJldmlvdXNXb3JkIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgcHJldmlvdXMgd29y
ZC4KLSAgICBcdmFsdWUgTW92ZVRvTmV4dExpbmUgTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBuZXh0
IGxpbmUuCi0gICAgXHZhbHVlIE1vdmVUb1ByZXZpb3VzTGluZSBNb3ZlIHRoZSBjdXJzb3IgdG8g
dGhlIHByZXZpb3VzIGxpbmUuCi0gICAgXHZhbHVlIE1vdmVUb1N0YXJ0T2ZMaW5lIE1vdmUgdGhl
IGN1cnNvciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmUuCi0gICAgXHZhbHVlIE1vdmVUb0VuZE9m
TGluZSBNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIGVuZCBvZiB0aGUgbGluZS4KLSAgICBcdmFsdWUg
TW92ZVRvU3RhcnRPZkJsb2NrIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgc3RhcnQgb2YgdGhlIGJs
b2NrLgotICAgIFx2YWx1ZSBNb3ZlVG9FbmRPZkJsb2NrIE1vdmUgdGhlIGN1cnNvciB0byB0aGUg
ZW5kIG9mIHRoZSBibG9jay4KLSAgICBcdmFsdWUgTW92ZVRvU3RhcnRPZkRvY3VtZW50IE1vdmUg
dGhlIGN1cnNvciB0byB0aGUgc3RhcnQgb2YgdGhlIGRvY3VtZW50LgotICAgIFx2YWx1ZSBNb3Zl
VG9FbmRPZkRvY3VtZW50IE1vdmUgdGhlIGN1cnNvciB0byB0aGUgZW5kIG9mIHRoZSBkb2N1bWVu
dC4KLSAgICBcdmFsdWUgU2VsZWN0TmV4dENoYXIgU2VsZWN0IHRvIHRoZSBuZXh0IGNoYXJhY3Rl
ci4KLSAgICBcdmFsdWUgU2VsZWN0UHJldmlvdXNDaGFyIFNlbGVjdCB0byB0aGUgcHJldmlvdXMg
Y2hhcmFjdGVyLgotICAgIFx2YWx1ZSBTZWxlY3ROZXh0V29yZCBTZWxlY3QgdG8gdGhlIG5leHQg
d29yZC4KLSAgICBcdmFsdWUgU2VsZWN0UHJldmlvdXNXb3JkIFNlbGVjdCB0byB0aGUgcHJldmlv
dXMgd29yZC4KLSAgICBcdmFsdWUgU2VsZWN0TmV4dExpbmUgU2VsZWN0IHRvIHRoZSBuZXh0IGxp
bmUuCi0gICAgXHZhbHVlIFNlbGVjdFByZXZpb3VzTGluZSBTZWxlY3QgdG8gdGhlIHByZXZpb3Vz
IGxpbmUuCi0gICAgXHZhbHVlIFNlbGVjdFN0YXJ0T2ZMaW5lIFNlbGVjdCB0byB0aGUgc3RhcnQg
b2YgdGhlIGxpbmUuCi0gICAgXHZhbHVlIFNlbGVjdEVuZE9mTGluZSBTZWxlY3QgdG8gdGhlIGVu
ZCBvZiB0aGUgbGluZS4KLSAgICBcdmFsdWUgU2VsZWN0U3RhcnRPZkJsb2NrIFNlbGVjdCB0byB0
aGUgc3RhcnQgb2YgdGhlIGJsb2NrLgotICAgIFx2YWx1ZSBTZWxlY3RFbmRPZkJsb2NrIFNlbGVj
dCB0byB0aGUgZW5kIG9mIHRoZSBibG9jay4KLSAgICBcdmFsdWUgU2VsZWN0U3RhcnRPZkRvY3Vt
ZW50IFNlbGVjdCB0byB0aGUgc3RhcnQgb2YgdGhlIGRvY3VtZW50LgotICAgIFx2YWx1ZSBTZWxl
Y3RFbmRPZkRvY3VtZW50IFNlbGVjdCB0byB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudC4KLSAgICBc
dmFsdWUgRGVsZXRlU3RhcnRPZldvcmQgRGVsZXRlIHRvIHRoZSBzdGFydCBvZiB0aGUgd29yZC4K
LSAgICBcdmFsdWUgRGVsZXRlRW5kT2ZXb3JkIERlbGV0ZSB0byB0aGUgZW5kIG9mIHRoZSB3b3Jk
LgotICAgIFx2YWx1ZSBTZXRUZXh0RGlyZWN0aW9uRGVmYXVsdCBTZXQgdGhlIHRleHQgZGlyZWN0
aW9uIHRvIHRoZSBkZWZhdWx0IGRpcmVjdGlvbi4KLSAgICBcdmFsdWUgU2V0VGV4dERpcmVjdGlv
bkxlZnRUb1JpZ2h0IFNldCB0aGUgdGV4dCBkaXJlY3Rpb24gdG8gbGVmdC10by1yaWdodC4KLSAg
ICBcdmFsdWUgU2V0VGV4dERpcmVjdGlvblJpZ2h0VG9MZWZ0IFNldCB0aGUgdGV4dCBkaXJlY3Rp
b24gdG8gcmlnaHQtdG8tbGVmdC4KLSAgICBcdmFsdWUgVG9nZ2xlQm9sZCBUb2dnbGUgdGhlIGZv
cm1hdHRpbmcgYmV0d2VlbiBib2xkIGFuZCBub3JtYWwgd2VpZ2h0LgotICAgIFx2YWx1ZSBUb2dn
bGVJdGFsaWMgVG9nZ2xlIHRoZSBmb3JtYXR0aW5nIGJldHdlZW4gaXRhbGljIGFuZCBub3JtYWwg
c3R5bGUuCi0gICAgXHZhbHVlIFRvZ2dsZVVuZGVybGluZSBUb2dnbGUgdW5kZXJsaW5pbmcuCi0g
ICAgXHZhbHVlIEluc3BlY3RFbGVtZW50IFNob3cgdGhlIFdlYiBJbnNwZWN0b3Igd2l0aCB0aGUg
Y3VycmVudGx5IGhpZ2hsaWdodGVkIEhUTUwgZWxlbWVudC4KLSAgICBcdmFsdWUgSW5zZXJ0UGFy
YWdyYXBoU2VwYXJhdG9yIEluc2VydCBhIG5ldyBwYXJhZ3JhcGguCi0gICAgXHZhbHVlIEluc2Vy
dExpbmVTZXBhcmF0b3IgSW5zZXJ0IGEgbmV3IGxpbmUuCi0gICAgXHZhbHVlIFNlbGVjdEFsbCBT
ZWxlY3RzIGFsbCBjb250ZW50LgotICAgIFx2YWx1ZSBQYXN0ZUFuZE1hdGNoU3R5bGUgUGFzdGUg
Y29udGVudCBmcm9tIHRoZSBjbGlwYm9hcmQgd2l0aCBjdXJyZW50IHN0eWxlLiAoQWRkZWQgaW4g
UXQgNC42KQotICAgIFx2YWx1ZSBSZW1vdmVGb3JtYXQgUmVtb3ZlcyBmb3JtYXR0aW5nIGFuZCBz
dHlsZS4gKEFkZGVkIGluIFF0IDQuNikKLSAgICBcdmFsdWUgVG9nZ2xlU3RyaWtldGhyb3VnaCBU
b2dnbGUgdGhlIGZvcm1hdHRpbmcgYmV0d2VlbiBzdHJpa2V0aHJvdWdoIGFuZCBub3JtYWwgc3R5
bGUuIChBZGRlZCBpbiBRdCA0LjYpCi0gICAgXHZhbHVlIFRvZ2dsZVN1YnNjcmlwdCBUb2dnbGUg
dGhlIGZvcm1hdHRpbmcgYmV0d2VlbiBzdWJzY3JpcHQgYW5kIGJhc2VsaW5lLiAoQWRkZWQgaW4g
UXQgNC42KQotICAgIFx2YWx1ZSBUb2dnbGVTdXBlcnNjcmlwdCBUb2dnbGUgdGhlIGZvcm1hdHRp
bmcgYmV0d2VlbiBzdXBlcmNyaXB0IGFuZCBiYXNlbGluZS4gKEFkZGVkIGluIFF0IDQuNikKLSAg
ICBcdmFsdWUgSW5zZXJ0VW5vcmRlcmVkTGlzdCBUb2dnbGVzIHRoZSBzZWxlY3Rpb24gYmV0d2Vl
biBhbiBvcmRlcmVkIGxpc3QgYW5kIGEgbm9ybWFsIGJsb2NrLiAoQWRkZWQgaW4gUXQgNC42KQot
ICAgIFx2YWx1ZSBJbnNlcnRPcmRlcmVkTGlzdCBUb2dnbGVzIHRoZSBzZWxlY3Rpb24gYmV0d2Vl
biBhbiBvcmRlcmVkIGxpc3QgYW5kIGEgbm9ybWFsIGJsb2NrLiAoQWRkZWQgaW4gUXQgNC42KQot
ICAgIFx2YWx1ZSBJbmRlbnQgSW5jcmVhc2VzIHRoZSBpbmRlbnRhdGlvbiBvZiB0aGUgY3VycmVu
dGx5IHNlbGVjdGVkIGZvcm1hdCBibG9jayBieSBvbmUgaW5jcmVtZW50LiAoQWRkZWQgaW4gUXQg
NC42KQotICAgIFx2YWx1ZSBPdXRkZW50IERlY3JlYXNlcyB0aGUgaW5kZW50YXRpb24gb2YgdGhl
IGN1cnJlbnRseSBzZWxlY3RlZCBmb3JtYXQgYmxvY2sgYnkgb25lIGluY3JlbWVudC4gKEFkZGVk
IGluIFF0IDQuNikKLSAgICBcdmFsdWUgQWxpZ25DZW50ZXIgQXBwbGllcyBjZW50ZXIgYWxpZ25t
ZW50IHRvIGNvbnRlbnQuIChBZGRlZCBpbiBRdCA0LjYpCi0gICAgXHZhbHVlIEFsaWduSnVzdGlm
aWVkIEFwcGxpZXMgZnVsbCBqdXN0aWZpY2F0aW9uIHRvIGNvbnRlbnQuIChBZGRlZCBpbiBRdCA0
LjYpCi0gICAgXHZhbHVlIEFsaWduTGVmdCBBcHBsaWVzIGxlZnQganVzdGlmaWNhdGlvbiB0byBj
b250ZW50LiAoQWRkZWQgaW4gUXQgNC42KQotICAgIFx2YWx1ZSBBbGlnblJpZ2h0IEFwcGxpZXMg
cmlnaHQganVzdGlmaWNhdGlvbiB0byBjb250ZW50LiAoQWRkZWQgaW4gUXQgNC42KQotCi0KLSAg
ICBcb21pdHZhbHVlIFdlYkFjdGlvbkNvdW50Ci0KLSovCi0KLS8qIQotICAgIFxlbnVtIFFXZWJQ
YWdlOjpXZWJXaW5kb3dUeXBlCi0KLSAgICBUaGlzIGVudW0gZGVzY3JpYmVzIHRoZSB0eXBlcyBv
ZiB3aW5kb3cgdGhhdCBjYW4gYmUgY3JlYXRlZCBieSB0aGUgY3JlYXRlV2luZG93KCkgZnVuY3Rp
b24uCi0KLSAgICBcdmFsdWUgV2ViQnJvd3NlcldpbmRvdyBUaGUgd2luZG93IGlzIGEgcmVndWxh
ciB3ZWIgYnJvd3NlciB3aW5kb3cuCi0gICAgXHZhbHVlIFdlYk1vZGFsRGlhbG9nIFRoZSB3aW5k
b3cgYWN0cyBhcyBtb2RhbCBkaWFsb2cuCi0qLwotCi0KLS8qIQotICAgIFxjbGFzcyBRV2ViUGFn
ZTo6Vmlld3BvcnRBdHRyaWJ1dGVzCi0gICAgXHNpbmNlIDQuNwotICAgIFxicmllZiBUaGUgUVdl
YlBhZ2U6OlZpZXdwb3J0QXR0cmlidXRlcyBjbGFzcyBkZXNjcmliZXMgaGludHMgdGhhdCBjYW4g
YmUgYXBwbGllZCB0byBhIHZpZXdwb3J0LgotCi0gICAgUVdlYlBhZ2U6OlZpZXdwb3J0QXR0cmli
dXRlcyBwcm92aWRlcyBhIGRlc2NyaXB0aW9uIG9mIGEgdmlld3BvcnQsIHN1Y2ggYXMgdmlld3Bv
cnQgZ2VvbWV0cnksCi0gICAgaW5pdGlhbCBzY2FsZSBmYWN0b3Igd2l0aCBsaW1pdHMsIHBsdXMg
aW5mb3JtYXRpb24gYWJvdXQgd2hldGhlciBhIHVzZXIgc2hvdWxkIGJlIGFibGUKLSAgICB0byBz
Y2FsZSB0aGUgY29udGVudHMgaW4gdGhlIHZpZXdwb3J0IG9yIG5vdCwgaWUuIGJ5IHpvb21pbmcu
Ci0KLSAgICBWaWV3cG9ydEF0dHJpYnV0ZXMgY2FuIGJlIHNldCBieSBhIHdlYiBhdXRob3IgdXNp
bmcgdGhlIHZpZXdwb3J0IG1ldGEgdGFnIGV4dGVuc2lvbiwgZG9jdW1lbnRlZAotICAgIGF0IFxs
e2h0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL3NhZmFyaS9saWJyYXJ5L2RvY3VtZW50YXRpb24v
YXBwbGVhcHBsaWNhdGlvbnMvcmVmZXJlbmNlL3NhZmFyaXdlYmNvbnRlbnQvdXNpbmd0aGV2aWV3
cG9ydC91c2luZ3RoZXZpZXdwb3J0Lmh0bWx9e1NhZmFyaSBSZWZlcmVuY2UgTGlicmFyeTogVXNp
bmcgdGhlIFZpZXdwb3J0IE1ldGEgVGFnfS4KLQotICAgIEFsbCB2YWx1ZXMgbWlnaHQgbm90IGJl
IHNldCwgYXMgc3VjaCB3aGVuIGRlYWxpbmcgd2l0aCB0aGUgaGludHMsIHRoZSBkZXZlbG9wZXIg
bmVlZHMgdG8KLSAgICBjaGVjayB3aGV0aGVyIHRoZSB2YWx1ZXMgYXJlIHZhbGlkLiBOZWdhdGl2
ZSB2YWx1ZXMgZGVub3RlIGFuIGludmFsaWQgcXJlYWwgdmFsdWUuCi0KLSAgICBcaW5tb2R1bGUg
UXRXZWJLaXQKLSovCi0KLS8qIQotICAgIENvbnN0cnVjdHMgYW4gZW1wdHkgUVdlYlBhZ2U6OlZp
ZXdwb3J0QXR0cmlidXRlcy4KLSovCi1RV2ViUGFnZTo6Vmlld3BvcnRBdHRyaWJ1dGVzOjpWaWV3
cG9ydEF0dHJpYnV0ZXMoKQotICAgIDogZCgwKQotICAgICwgbV9pbml0aWFsU2NhbGVGYWN0b3Io
LTEuMCkKLSAgICAsIG1fbWluaW11bVNjYWxlRmFjdG9yKC0xLjApCi0gICAgLCBtX21heGltdW1T
Y2FsZUZhY3RvcigtMS4wKQotICAgICwgbV9kZXZpY2VQaXhlbFJhdGlvKC0xLjApCi0gICAgLCBt
X2lzVXNlclNjYWxhYmxlKHRydWUpCi0gICAgLCBtX2lzVmFsaWQoZmFsc2UpCi17Ci0KLX0KLQot
LyohCi0gICAgQ29uc3RydWN0cyBhIFFXZWJQYWdlOjpWaWV3cG9ydEF0dHJpYnV0ZXMgd2hpY2gg
aXMgYSBjb3B5IGZyb20gXGEgb3RoZXIgLgotKi8KLVFXZWJQYWdlOjpWaWV3cG9ydEF0dHJpYnV0
ZXM6OlZpZXdwb3J0QXR0cmlidXRlcyhjb25zdCBRV2ViUGFnZTo6Vmlld3BvcnRBdHRyaWJ1dGVz
JiBvdGhlcikKLSAgICA6IGQob3RoZXIuZCkKLSAgICAsIG1faW5pdGlhbFNjYWxlRmFjdG9yKG90
aGVyLm1faW5pdGlhbFNjYWxlRmFjdG9yKQotICAgICwgbV9taW5pbXVtU2NhbGVGYWN0b3Iob3Ro
ZXIubV9taW5pbXVtU2NhbGVGYWN0b3IpCi0gICAgLCBtX21heGltdW1TY2FsZUZhY3RvcihvdGhl
ci5tX21heGltdW1TY2FsZUZhY3RvcikKLSAgICAsIG1fZGV2aWNlUGl4ZWxSYXRpbyhvdGhlci5t
X2RldmljZVBpeGVsUmF0aW8pCi0gICAgLCBtX2lzVXNlclNjYWxhYmxlKG90aGVyLm1faXNVc2Vy
U2NhbGFibGUpCi0gICAgLCBtX2lzVmFsaWQob3RoZXIubV9pc1ZhbGlkKQotICAgICwgbV9zaXpl
KG90aGVyLm1fc2l6ZSkKLXsKLQotfQotCi0vKiEKLSAgICBEZXN0cm95cyB0aGUgUVdlYlBhZ2U6
OlZpZXdwb3J0QXR0cmlidXRlcy4KLSovCi1RV2ViUGFnZTo6Vmlld3BvcnRBdHRyaWJ1dGVzOjp+
Vmlld3BvcnRBdHRyaWJ1dGVzKCkKLXsKLQotfQotCi0vKiEKLSAgICBBc3NpZ25zIHRoZSBnaXZl
biBRV2ViUGFnZTo6Vmlld3BvcnRBdHRyaWJ1dGVzIHRvIHRoaXMgdmlld3BvcnQgaGludHMgYW5k
IHJldHVybnMgYQotICAgIHJlZmVyZW5jZSB0byB0aGlzLgotKi8KLVFXZWJQYWdlOjpWaWV3cG9y
dEF0dHJpYnV0ZXMmIFFXZWJQYWdlOjpWaWV3cG9ydEF0dHJpYnV0ZXM6Om9wZXJhdG9yPShjb25z
dCBRV2ViUGFnZTo6Vmlld3BvcnRBdHRyaWJ1dGVzJiBvdGhlcikKLXsKLSAgICBpZiAodGhpcyAh
PSAmb3RoZXIpIHsKLSAgICAgICAgZCA9IG90aGVyLmQ7Ci0gICAgICAgIG1faW5pdGlhbFNjYWxl
RmFjdG9yID0gb3RoZXIubV9pbml0aWFsU2NhbGVGYWN0b3I7Ci0gICAgICAgIG1fbWluaW11bVNj
YWxlRmFjdG9yID0gb3RoZXIubV9taW5pbXVtU2NhbGVGYWN0b3I7Ci0gICAgICAgIG1fbWF4aW11
bVNjYWxlRmFjdG9yID0gb3RoZXIubV9tYXhpbXVtU2NhbGVGYWN0b3I7Ci0gICAgICAgIG1faXNV
c2VyU2NhbGFibGUgPSBvdGhlci5tX2lzVXNlclNjYWxhYmxlOwotICAgICAgICBtX2lzVmFsaWQg
PSBvdGhlci5tX2lzVmFsaWQ7Ci0gICAgICAgIG1fc2l6ZSA9IG90aGVyLm1fc2l6ZTsKLSAgICB9
Ci0KLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLS8qISBcZm4gaW5saW5lIGJvb2wgUVdlYlBhZ2U6
OlZpZXdwb3J0QXR0cmlidXRlczo6aXNWYWxpZCgpIGNvbnN0Ci0gICAgUmV0dXJucyB3aGV0aGVy
IHRoaXMgaXMgYSB2YWxpZCBWaWV3cG9ydEF0dHJpYnV0ZXMgb3Igbm90LgotCi0gICAgQW4gaW52
YWxpZCBWaWV3cG9ydEF0dHJpYnV0ZXMgd2lsbCBoYXZlIGFuIGVtcHR5IFFTaXplLCBuZWdhdGl2
ZSB2YWx1ZXMgZm9yIHNjYWxlIGZhY3RvcnMgYW5kCi0gICAgdHJ1ZSBmb3IgdGhlIGJvb2xlYW4g
aXNVc2VyU2NhbGFibGUuCi0qLwotCi0vKiEgXGZuIGlubGluZSBRU2l6ZSBRV2ViUGFnZTo6Vmll
d3BvcnRBdHRyaWJ1dGVzOjpzaXplKCkgY29uc3QKLSAgICBSZXR1cm5zIHRoZSBzaXplIG9mIHRo
ZSB2aWV3cG9ydC4KLSovCi0KLS8qISBcZm4gaW5saW5lIHFyZWFsIFFXZWJQYWdlOjpWaWV3cG9y
dEF0dHJpYnV0ZXM6OmluaXRpYWxTY2FsZUZhY3RvcigpIGNvbnN0Ci0gICAgUmV0dXJucyB0aGUg
aW5pdGlhbCBzY2FsZSBvZiB0aGUgdmlld3BvcnQgYXMgYSBtdWx0aXBsaWVyLgotKi8KLQotLyoh
IFxmbiBpbmxpbmUgcXJlYWwgUVdlYlBhZ2U6OlZpZXdwb3J0QXR0cmlidXRlczo6bWluaW11bVNj
YWxlRmFjdG9yKCkgY29uc3QKLSAgICBSZXR1cm5zIHRoZSBtaW5pbXVtIHNjYWxlIHZhbHVlIG9m
IHRoZSB2aWV3cG9ydCBhcyBhIG11bHRpcGxpZXIuCi0qLwotCi0vKiEgXGZuIGlubGluZSBxcmVh
bCBRV2ViUGFnZTo6Vmlld3BvcnRBdHRyaWJ1dGVzOjptYXhpbXVtU2NhbGVGYWN0b3IoKSBjb25z
dAotICAgIFJldHVybnMgdGhlIG1heGltdW0gc2NhbGUgdmFsdWUgb2YgdGhlIHZpZXdwb3J0IGFz
IGEgbXVsdGlwbGllci4KLSovCi0KLS8qISBcZm4gaW5saW5lIGJvb2wgUVdlYlBhZ2U6OlZpZXdw
b3J0QXR0cmlidXRlczo6aXNVc2VyU2NhbGFibGUoKSBjb25zdAotICAgIERldGVybWluZXMgd2hl
dGhlciBvciBub3QgdGhlIHNjYWxlIGNhbiBiZSBtb2RpZmllZCBieSB0aGUgdXNlci4KLSovCi0K
LQotLyohCi0gICAgXGNsYXNzIFFXZWJQYWdlCi0gICAgXHNpbmNlIDQuNAotICAgIFxicmllZiBU
aGUgUVdlYlBhZ2UgY2xhc3MgcHJvdmlkZXMgYW4gb2JqZWN0IHRvIHZpZXcgYW5kIGVkaXQgd2Vi
IGRvY3VtZW50cy4KLQotICAgIFxpbm1vZHVsZSBRdFdlYktpdAotCi0gICAgUVdlYlBhZ2UgaG9s
ZHMgYSBtYWluIGZyYW1lIHJlc3BvbnNpYmxlIGZvciB3ZWIgY29udGVudCwgc2V0dGluZ3MsIHRo
ZSBoaXN0b3J5Ci0gICAgb2YgbmF2aWdhdGVkIGxpbmtzIGFuZCBhY3Rpb25zLiBUaGlzIGNsYXNz
IGNhbiBiZSB1c2VkLCB0b2dldGhlciB3aXRoIFFXZWJGcmFtZSwKLSAgICB0byBwcm92aWRlIGZ1
bmN0aW9uYWxpdHkgbGlrZSBRV2ViVmlldyBpbiBhIHdpZGdldC1sZXNzIGVudmlyb25tZW50Lgot
Ci0gICAgUVdlYlBhZ2UncyBBUEkgaXMgdmVyeSBzaW1pbGFyIHRvIFFXZWJWaWV3LCBhcyB5b3Ug
YXJlIHN0aWxsIHByb3ZpZGVkIHdpdGgKLSAgICBjb21tb24gZnVuY3Rpb25zIGxpa2UgYWN0aW9u
KCkgKGtub3duIGFzCi0gICAgXGx7UVdlYlZpZXc6OnBhZ2VBY3Rpb24oKX17cGFnZUFjdGlvbn0o
KSBpbiBRV2ViVmlldyksIHRyaWdnZXJBY3Rpb24oKSwKLSAgICBmaW5kVGV4dCgpIGFuZCBzZXR0
aW5ncygpLiBNb3JlIFFXZWJWaWV3LWxpa2UgZnVuY3Rpb25zIGNhbiBiZSBmb3VuZCBpbiB0aGUK
LSAgICBtYWluIGZyYW1lIG9mIFFXZWJQYWdlLCBvYnRhaW5lZCB2aWEgdGhlIG1haW5GcmFtZSgp
IGZ1bmN0aW9uLiBGb3IgZXhhbXBsZSwKLSAgICB0aGUgXGx7UVdlYkZyYW1lOjpsb2FkKCl9e2xv
YWR9KCksIFxse1FXZWJGcmFtZTo6c2V0VXJsKCl9e3NldFVybH0oKSBhbmQKLSAgICBcbHtRV2Vi
RnJhbWU6OnNldEh0bWwoKX17c2V0SHRtbH0oKSBmdW5jdGlvbnMgZm9yIFFXZWJQYWdlIGNhbiBi
ZSBhY2Nlc3NlZAotICAgIHVzaW5nIFFXZWJGcmFtZS4KLQotICAgIFRoZSBsb2FkU3RhcnRlZCgp
IHNpZ25hbCBpcyBlbWl0dGVkIHdoZW4gdGhlIHBhZ2UgYmVnaW5zIHRvIGxvYWQuVGhlCi0gICAg
bG9hZFByb2dyZXNzKCkgc2lnbmFsLCBvbiB0aGUgb3RoZXIgaGFuZCwgaXMgZW1pdHRlZCB3aGVu
ZXZlciBhbiBlbGVtZW50Ci0gICAgb2YgdGhlIHdlYiBwYWdlIGNvbXBsZXRlcyBsb2FkaW5nLCBz
dWNoIGFzIGFuIGVtYmVkZGVkIGltYWdlLCBhIHNjcmlwdCwKLSAgICBldGMuIEZpbmFsbHksIHRo
ZSBsb2FkRmluaXNoZWQoKSBzaWduYWwgaXMgZW1pdHRlZCB3aGVuIHRoZSBwYWdlIGNvbnRlbnRz
Ci0gICAgYXJlIGxvYWRlZCBjb21wbGV0ZWx5LCBpbmRlcGVuZGVudCBvZiBzY3JpcHQgZXhlY3V0
aW9uIG9yIHBhZ2UgcmVuZGVyaW5nLgotICAgIEl0cyBhcmd1bWVudCwgZWl0aGVyIHRydWUgb3Ig
ZmFsc2UsIGluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGUgbG9hZAotICAgIG9wZXJhdGlvbiBz
dWNjZWVkZWQuCi0KLSAgICBcc2VjdGlvbjEgVXNpbmcgUVdlYlBhZ2UgaW4gYSBXaWRnZXQtbGVz
cyBFbnZpcm9ubWVudAotCi0gICAgQmVmb3JlIHlvdSBiZWdpbiBwYWludGluZyBhIFFXZWJQYWdl
IG9iamVjdCwgeW91IG5lZWQgdG8gc2V0IHRoZSBzaXplIG9mCi0gICAgdGhlIHZpZXdwb3J0IGJ5
IGNhbGxpbmcgc2V0Vmlld3BvcnRTaXplKCkuIFRoZW4sIHlvdSBpbnZva2UgdGhlIG1haW4KLSAg
ICBmcmFtZSdzIHJlbmRlciBmdW5jdGlvbiAoUVdlYkZyYW1lOjpyZW5kZXIoKSkuIEFuIGV4YW1w
bGUgb2YgdGhpcwotICAgIGlzIHNob3duIGluIHRoZSBjb2RlIHNuaXBwZXQgYmVsb3cuCi0KLSAg
ICBTdXBwb3NlIHdlIGhhdmUgYSBcYyBUaHVtYm5haWwgY2xhc3MgYXMgZm9sbG93czoKLQotICAg
IFxzbmlwcGV0IHdlYmtpdHNuaXBwZXRzL3dlYnBhZ2UvbWFpbi5jcHAgMAotCi0gICAgVGhlIFxj
IFRodW1ibmFpbCdzIGNvbnN0cnVjdG9yIHRha2VzIGluIGEgXGEgdXJsLiBXZSBjb25uZWN0IG91
ciBRV2ViUGFnZQotICAgIG9iamVjdCdzIFxse1FXZWJQYWdlOjp9e2xvYWRGaW5pc2hlZCgpfSBz
aWduYWwgdG8gb3VyIHByaXZhdGUgc2xvdCwKLSAgICBcYyByZW5kZXIoKS4KLQotICAgIFxzbmlw
cGV0IHdlYmtpdHNuaXBwZXRzL3dlYnBhZ2UvbWFpbi5jcHAgMQotCi0gICAgVGhlIFxjIHJlbmRl
cigpIGZ1bmN0aW9uIHNob3dzIGhvdyB3ZSBjYW4gcGFpbnQgYSB0aHVtYm5haWwgdXNpbmcgYQot
ICAgIFFXZWJQYWdlIG9iamVjdC4KLQotICAgIFxzbmlwcGV0IHdlYmtpdHNuaXBwZXRzL3dlYnBh
Z2UvbWFpbi5jcHAgMgotCi0gICAgV2UgYmVnaW4gYnkgc2V0dGluZyB0aGUgXGx7UVdlYlBhZ2U6
OnZpZXdwb3J0U2l6ZSgpfXt2aWV3cG9ydFNpemV9IGFuZAotICAgIHRoZW4gd2UgaW5zdGFudGlh
dGUgYSBRSW1hZ2Ugb2JqZWN0LCBcYyBpbWFnZSwgd2l0aCB0aGUgc2FtZSBzaXplIGFzIG91cgot
ICAgIFxse1FXZWJQYWdlOjp2aWV3cG9ydFNpemUoKX17dmlld3BvcnRTaXplfS4gVGhpcyBpbWFn
ZSBpcyB0aGVuIHNlbnQKLSAgICBhcyBhIHBhcmFtZXRlciB0byBcYyBwYWludGVyLiBOZXh0LCB3
ZSByZW5kZXIgdGhlIGNvbnRlbnRzIG9mIHRoZSBtYWluCi0gICAgZnJhbWUgYW5kIGl0cyBzdWJm
cmFtZXMgaW50byBcYyBwYWludGVyLiBGaW5hbGx5LCB3ZSBzYXZlIHRoZSBzY2FsZWQgaW1hZ2Uu
Ci0KLSAgICBcc2EgUVdlYkZyYW1lCi0qLwotCi0vKiEKLSAgICBDb25zdHJ1Y3RzIGFuIGVtcHR5
IFFXZWJQYWdlIHdpdGggcGFyZW50IFxhIHBhcmVudC4KLSovCi1RV2ViUGFnZTo6UVdlYlBhZ2Uo
UU9iamVjdCAqcGFyZW50KQotICAgIDogUU9iamVjdChwYXJlbnQpCi0gICAgLCBkKG5ldyBRV2Vi
UGFnZVByaXZhdGUodGhpcykpCi17Ci0gICAgc2V0Vmlldyhxb2JqZWN0X2Nhc3Q8UVdpZGdldCo+
KHBhcmVudCkpOwotCi0gICAgY29ubmVjdCh0aGlzLCBTSUdOQUwobG9hZFByb2dyZXNzKGludCkp
LCB0aGlzLCBTTE9UKF9xX29uTG9hZFByb2dyZXNzQ2hhbmdlZChpbnQpKSk7Ci0jaWZuZGVmIE5E
RUJVRwotICAgIGNvbm5lY3QoUUNvcmVBcHBsaWNhdGlvbjo6aW5zdGFuY2UoKSwgU0lHTkFMKGFi
b3V0VG9RdWl0KCkpLCB0aGlzLCBTTE9UKF9xX2NsZWFudXBMZWFrTWVzc2FnZXMoKSkpOwotI2Vu
ZGlmCi19Ci0KLS8qIQotICAgIERlc3Ryb3lzIHRoZSB3ZWIgcGFnZS4KLSovCi1RV2ViUGFnZTo6
flFXZWJQYWdlKCkKLXsKLSAgICBkLT5jcmVhdGVNYWluRnJhbWUoKTsKLSAgICBGcmFtZUxvYWRl
ciogbG9hZGVyID0gZC0+bWFpbkZyYW1lLmRhdGEoKS0+ZC0+ZnJhbWUtPmxvYWRlcigpOwotICAg
IGlmIChsb2FkZXIpCi0gICAgICAgIGxvYWRlci0+ZGV0YWNoRnJvbVBhcmVudCgpOwotICAgIGRl
bGV0ZSBkOwotfQotCi0vKiEKLSAgICBSZXR1cm5zIHRoZSBtYWluIGZyYW1lIG9mIHRoZSBwYWdl
LgotCi0gICAgVGhlIG1haW4gZnJhbWUgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBoaWVyYXJjaHkg
b2Ygc3ViLWZyYW1lcyBhbmQgaXMgYWxzbyBuZWVkZWQgaWYgeW91Ci0gICAgd2FudCB0byBleHBs
aWNpdGx5IHJlbmRlciBhIHdlYiBwYWdlIGludG8gYSBnaXZlbiBwYWludGVyLgotCi0gICAgXHNh
IGN1cnJlbnRGcmFtZSgpCi0qLwotUVdlYkZyYW1lICpRV2ViUGFnZTo6bWFpbkZyYW1lKCkgY29u
c3QKLXsKLSAgICBkLT5jcmVhdGVNYWluRnJhbWUoKTsKLSAgICByZXR1cm4gZC0+bWFpbkZyYW1l
LmRhdGEoKTsKLX0KLQotLyohCi0gICAgUmV0dXJucyB0aGUgZnJhbWUgY3VycmVudGx5IGFjdGl2
ZS4KLQotICAgIFxzYSBtYWluRnJhbWUoKSwgZnJhbWVDcmVhdGVkKCkKLSovCi1RV2ViRnJhbWUg
KlFXZWJQYWdlOjpjdXJyZW50RnJhbWUoKSBjb25zdAotewotICAgIGQtPmNyZWF0ZU1haW5GcmFt
ZSgpOwotICAgIFdlYkNvcmU6OkZyYW1lICpmcmFtZSA9IGQtPnBhZ2UtPmZvY3VzQ29udHJvbGxl
cigpLT5mb2N1c2VkT3JNYWluRnJhbWUoKTsKLSAgICByZXR1cm4gcW9iamVjdF9jYXN0PFFXZWJG
cmFtZSo+KGZyYW1lLT5sb2FkZXIoKS0+bmV0d29ya2luZ0NvbnRleHQoKS0+b3JpZ2luYXRpbmdP
YmplY3QoKSk7Ci19Ci0KLQotLyohCi0gICAgXHNpbmNlIDQuNgotCi0gICAgUmV0dXJucyB0aGUg
ZnJhbWUgYXQgdGhlIGdpdmVuIHBvaW50IFxhIHBvcywgb3IgMCBpZiB0aGVyZSBpcyBubyBmcmFt
ZSBhdAotICAgIHRoYXQgcG9zaXRpb24uCi0KLSAgICBcc2EgbWFpbkZyYW1lKCksIGN1cnJlbnRG
cmFtZSgpCi0qLwotUVdlYkZyYW1lKiBRV2ViUGFnZTo6ZnJhbWVBdChjb25zdCBRUG9pbnQmIHBv
cykgY29uc3QKLXsKLSAgICBRV2ViRnJhbWUqIHdlYkZyYW1lID0gbWFpbkZyYW1lKCk7Ci0gICAg
aWYgKCF3ZWJGcmFtZS0+Z2VvbWV0cnkoKS5jb250YWlucyhwb3MpKQotICAgICAgICByZXR1cm4g
MDsKLSAgICBRV2ViSGl0VGVzdFJlc3VsdCBoaXRUZXN0UmVzdWx0ID0gd2ViRnJhbWUtPmhpdFRl
c3RDb250ZW50KHBvcyk7Ci0gICAgcmV0dXJuIGhpdFRlc3RSZXN1bHQuZnJhbWUoKTsKLX0KLQot
LyohCi0gICAgUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHZpZXcncyBoaXN0b3J5IG9mIG5hdmln
YXRlZCB3ZWIgcGFnZXMuCi0qLwotUVdlYkhpc3RvcnkgKlFXZWJQYWdlOjpoaXN0b3J5KCkgY29u
c3QKLXsKLSAgICBkLT5jcmVhdGVNYWluRnJhbWUoKTsKLSAgICByZXR1cm4gJmQtPmhpc3Rvcnk7
Ci19Ci0KLS8qIQotICAgIFNldHMgdGhlIFxhIHZpZXcgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGgg
dGhlIHdlYiBwYWdlLgotCi0gICAgXHNhIHZpZXcoKQotKi8KLXZvaWQgUVdlYlBhZ2U6OnNldFZp
ZXcoUVdpZGdldCogdmlldykKLXsKLSAgICBpZiAodGhpcy0+dmlldygpID09IHZpZXcpCi0gICAg
ICAgIHJldHVybjsKLQotICAgIGQtPnZpZXcgPSB2aWV3OwotICAgIHNldFZpZXdwb3J0U2l6ZSh2
aWV3ID8gdmlldy0+c2l6ZSgpIDogUVNpemUoMCwgMCkpOwotCi0gICAgLy8gSWYgd2UgaGF2ZSBu
byBjbGllbnQsIHdlIGluc3RhbGwgYSBzcGVjaWFsIGNsaWVudCBkZWxlZ2F0aW5nCi0gICAgLy8g
dGhlIHJlc3BvbnNpYmlsaXR5IHRvIHRoZSBRV2lkZ2V0LiBUaGlzIGlzIHRoZSBjb2RlIHBhdGgK
LSAgICAvLyBoYW5kbGluZyBhLm8uIHRoZSAibGVnYWN5IiBRV2ViVmlldy4KLSAgICAvLwotICAg
IC8vIElmIHN1Y2ggYSBzcGVjaWFsIGRlbGVnYXRlIGFscmVhZHkgZXhpc3QsIHdlIHN1YnN0aXR1
dGUgdGhlIHZpZXcuCi0KLSAgICBpZiAoZC0+Y2xpZW50KSB7Ci0gICAgICAgIGlmIChkLT5jbGll
bnQtPmlzUVdpZGdldENsaWVudCgpKQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UGFnZUNsaWVu
dFFXaWRnZXQqPihkLT5jbGllbnQuZGF0YSgpKS0+dmlldyA9IHZpZXc7Ci0gICAgICAgIHJldHVy
bjsKLSAgICB9Ci0KLSAgICBpZiAodmlldykKLSAgICAgICAgZC0+Y2xpZW50LnJlc2V0KG5ldyBQ
YWdlQ2xpZW50UVdpZGdldCh2aWV3LCB0aGlzKSk7Ci19Ci0KLS8qIQotICAgIFJldHVybnMgdGhl
IHZpZXcgd2lkZ2V0IHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB3ZWIgcGFnZS4KLQotICAg
IFxzYSBzZXRWaWV3KCkKLSovCi1RV2lkZ2V0ICpRV2ViUGFnZTo6dmlldygpIGNvbnN0Ci17Ci0g
ICAgcmV0dXJuIGQtPnZpZXcuZGF0YSgpOwotfQotCi0vKiEKLSAgICBUaGlzIGZ1bmN0aW9uIGlz
IGNhbGxlZCB3aGVuZXZlciBhIEphdmFTY3JpcHQgcHJvZ3JhbSB0cmllcyB0byBwcmludCBhIFxh
IG1lc3NhZ2UgdG8gdGhlIHdlYiBicm93c2VyJ3MgY29uc29sZS4KLQotICAgIEZvciBleGFtcGxl
IGluIGNhc2Ugb2YgZXZhbHVhdGlvbiBlcnJvcnMgdGhlIHNvdXJjZSBVUkwgbWF5IGJlIHByb3Zp
ZGVkIGluIFxhIHNvdXJjZUlEIGFzIHdlbGwgYXMgdGhlIFxhIGxpbmVOdW1iZXIuCi0KLSAgICBU
aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBwcmludHMgbm90aGluZy4KLSovCi12b2lkIFFXZWJQ
YWdlOjpqYXZhU2NyaXB0Q29uc29sZU1lc3NhZ2UoY29uc3QgUVN0cmluZyYgbWVzc2FnZSwgaW50
IGxpbmVOdW1iZXIsIGNvbnN0IFFTdHJpbmcmIHNvdXJjZUlEKQotewotICAgIFFfVU5VU0VEKHNv
dXJjZUlEKQotCi0gICAgLy8gQ2F0Y2ggcGx1Z2luIGxvZ0Rlc3Ryb3kgbWVzc2FnZSBmb3IgTGF5
b3V0VGVzdHMvcGx1Z2lucy9vcGVuLWFuZC1jbG9zZS13aW5kb3ctd2l0aC1wbHVnaW4uaHRtbAot
ICAgIC8vIEF0IHRoaXMgcG9pbnQgRFJUJ3MgV2ViUGFnZSBoYXMgYWxyZWFkeSBiZWVuIGRlc3Ry
b3llZAotICAgIGlmIChRV2ViUGFnZUFkYXB0ZXI6OmRydFJ1bikgewotICAgICAgICBpZiAobWVz
c2FnZSA9PSBRTGF0aW4xU3RyaW5nKCJQTFVHSU46IE5QUF9EZXN0cm95IikpIHsKLSAgICAgICAg
ICAgIGZwcmludGYoc3Rkb3V0LCAiQ09OU09MRSBNRVNTQUdFOiAiKTsKLSAgICAgICAgICAgIGlm
IChsaW5lTnVtYmVyKQotICAgICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAibGluZSAlZDog
IiwgbGluZU51bWJlcik7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIiVzXG4iLCBtZXNz
YWdlLnRvVXRmOCgpLmNvbnN0RGF0YSgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyohCi0g
ICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbmV2ZXIgYSBKYXZhU2NyaXB0IHByb2dyYW0g
cnVubmluZyBpbnNpZGUgXGEgZnJhbWUgY2FsbHMgdGhlIGFsZXJ0KCkgZnVuY3Rpb24gd2l0aAot
ICAgIHRoZSBtZXNzYWdlIFxhIG1zZy4KLQotICAgIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9u
IHNob3dzIHRoZSBtZXNzYWdlLCBcYSBtc2csIHdpdGggUU1lc3NhZ2VCb3g6OmluZm9ybWF0aW9u
LgotKi8KLXZvaWQgUVdlYlBhZ2U6OmphdmFTY3JpcHRBbGVydChRV2ViRnJhbWUgKmZyYW1lLCBj
b25zdCBRU3RyaW5nJiBtc2cpCi17Ci0gICAgUV9VTlVTRUQoZnJhbWUpCi0jaWZuZGVmIFFUX05P
X01FU1NBR0VCT1gKLSAgICBRTWVzc2FnZUJveCBib3godmlldygpKTsKLSAgICBib3guc2V0V2lu
ZG93VGl0bGUodHIoIkphdmFTY3JpcHQgQWxlcnQgLSAlMSIpLmFyZyhtYWluRnJhbWUoKS0+dXJs
KCkuaG9zdCgpKSk7Ci0gICAgYm94LnNldFRleHRGb3JtYXQoUXQ6OlBsYWluVGV4dCk7Ci0gICAg
Ym94LnNldFRleHQobXNnKTsKLSAgICBib3guc2V0U3RhbmRhcmRCdXR0b25zKFFNZXNzYWdlQm94
OjpPayk7Ci0gICAgYm94LmV4ZWMoKTsKLSNlbmRpZgotfQotCi0vKiEKLSAgICBUaGlzIGZ1bmN0
aW9uIGlzIGNhbGxlZCB3aGVuZXZlciBhIEphdmFTY3JpcHQgcHJvZ3JhbSBydW5uaW5nIGluc2lk
ZSBcYSBmcmFtZSBjYWxscyB0aGUgY29uZmlybSgpIGZ1bmN0aW9uCi0gICAgd2l0aCB0aGUgbWVz
c2FnZSwgXGEgbXNnLiBSZXR1cm5zIHRydWUgaWYgdGhlIHVzZXIgY29uZmlybXMgdGhlIG1lc3Nh
Z2U7IG90aGVyd2lzZSByZXR1cm5zIGZhbHNlLgotCi0gICAgVGhlIGRlZmF1bHQgaW1wbGVtZW50
YXRpb24gZXhlY3V0ZXMgdGhlIHF1ZXJ5IHVzaW5nIFFNZXNzYWdlQm94OjppbmZvcm1hdGlvbiB3
aXRoIFFNZXNzYWdlQm94OjpPayBhbmQgUU1lc3NhZ2VCb3g6OkNhbmNlbCBidXR0b25zLgotKi8K
LWJvb2wgUVdlYlBhZ2U6OmphdmFTY3JpcHRDb25maXJtKFFXZWJGcmFtZSAqZnJhbWUsIGNvbnN0
IFFTdHJpbmcmIG1zZykKLXsKLSAgICBRX1VOVVNFRChmcmFtZSkKLSNpZmRlZiBRVF9OT19NRVNT
QUdFQk9YCi0gICAgcmV0dXJuIHRydWU7Ci0jZWxzZQotICAgIFFNZXNzYWdlQm94IGJveCh2aWV3
KCkpOwotICAgIGJveC5zZXRXaW5kb3dUaXRsZSh0cigiSmF2YVNjcmlwdCBDb25maXJtIC0gJTEi
KS5hcmcobWFpbkZyYW1lKCktPnVybCgpLmhvc3QoKSkpOwotICAgIGJveC5zZXRUZXh0Rm9ybWF0
KFF0OjpQbGFpblRleHQpOwotICAgIGJveC5zZXRUZXh0KG1zZyk7Ci0gICAgYm94LnNldFN0YW5k
YXJkQnV0dG9ucyhRTWVzc2FnZUJveDo6T2sgfCBRTWVzc2FnZUJveDo6Q2FuY2VsKTsKLSAgICBy
ZXR1cm4gUU1lc3NhZ2VCb3g6Ok9rID09IGJveC5leGVjKCk7Ci0jZW5kaWYKLX0KLQotLyohCi0g
ICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbmV2ZXIgYSBKYXZhU2NyaXB0IHByb2dyYW0g
cnVubmluZyBpbnNpZGUgXGEgZnJhbWUgdHJpZXMgdG8gcHJvbXB0IHRoZSB1c2VyIGZvciBpbnB1
dC4KLSAgICBUaGUgcHJvZ3JhbSBtYXkgcHJvdmlkZSBhbiBvcHRpb25hbCBtZXNzYWdlLCBcYSBt
c2csIGFzIHdlbGwgYXMgYSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgaW5wdXQgaW4gXGEgZGVmYXVs
dFZhbHVlLgotCi0gICAgSWYgdGhlIHByb21wdCB3YXMgY2FuY2VsbGVkIGJ5IHRoZSB1c2VyIHRo
ZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgcmV0dXJuIGZhbHNlOyBvdGhlcndpc2UgdGhlCi0gICAg
cmVzdWx0IHNob3VsZCBiZSB3cml0dGVuIHRvIFxhIHJlc3VsdCBhbmQgdHJ1ZSBzaG91bGQgYmUg
cmV0dXJuZWQuIElmIHRoZSBwcm9tcHQgd2FzIG5vdCBjYW5jZWxsZWQgYnkgdGhlCi0gICAgdXNl
ciwgdGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCByZXR1cm4gdHJ1ZSBhbmQgdGhlIHJlc3VsdCBz
dHJpbmcgbXVzdCBub3QgYmUgbnVsbC4KLQotICAgIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9u
IHVzZXMgUUlucHV0RGlhbG9nOjpnZXRUZXh0KCkuCi0qLwotYm9vbCBRV2ViUGFnZTo6amF2YVNj
cmlwdFByb21wdChRV2ViRnJhbWUgKmZyYW1lLCBjb25zdCBRU3RyaW5nJiBtc2csIGNvbnN0IFFT
dHJpbmcmIGRlZmF1bHRWYWx1ZSwgUVN0cmluZyogcmVzdWx0KQotewotICAgIFFfVU5VU0VEKGZy
YW1lKQotICAgIGJvb2wgb2sgPSBmYWxzZTsKLSNpZm5kZWYgUVRfTk9fSU5QVVRESUFMT0cKLQot
ICAgIFFJbnB1dERpYWxvZyBkbGcodmlldygpKTsKLSAgICBkbGcuc2V0V2luZG93VGl0bGUodHIo
IkphdmFTY3JpcHQgUHJvbXB0IC0gJTEiKS5hcmcobWFpbkZyYW1lKCktPnVybCgpLmhvc3QoKSkp
OwotCi0gICAgLy8gSGFjayB0byBmb3JjZSB0aGUgZGlhbG9nJ3MgUUxhYmVsIGludG8gcGxhaW4g
dGV4dCBtb2RlCi0gICAgLy8gcHJldmVudHMgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTM0NDI5Ci0gICAgUUxhYmVsKiBsYWJlbCA9IGRsZy5maW5kQ2hpbGQ8UUxhYmVs
Kj4oKTsKLSAgICBpZiAobGFiZWwpCi0gICAgICAgIGxhYmVsLT5zZXRUZXh0Rm9ybWF0KFF0OjpQ
bGFpblRleHQpOwotCi0gICAgLy8gZG91YmxlIHRoZSAmJ3MgYmVjYXVzZSBzaW5nbGUgJiB3aWxs
IHVuZGVybGluZSB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcgotICAgIC8vIChBY2NlbGVyYXRvciBt
bmVtb25pY3MpCi0gICAgUVN0cmluZyBlc2NNc2cobXNnKTsKLSAgICBlc2NNc2cucmVwbGFjZShR
Q2hhcjo6ZnJvbUxhdGluMSgnJicpLCBRTGF0aW4xU3RyaW5nKCImJiIpKTsKLSAgICBkbGcuc2V0
TGFiZWxUZXh0KGVzY01zZyk7Ci0KLSAgICBkbGcuc2V0VGV4dEVjaG9Nb2RlKFFMaW5lRWRpdDo6
Tm9ybWFsKTsKLSAgICBkbGcuc2V0VGV4dFZhbHVlKGRlZmF1bHRWYWx1ZSk7Ci0KLSAgICBvayA9
ICEhZGxnLmV4ZWMoKTsKLQotICAgIGlmIChvayAmJiByZXN1bHQpCi0gICAgICAgICpyZXN1bHQg
PSBkbGcudGV4dFZhbHVlKCk7Ci0jZW5kaWYKLSAgICByZXR1cm4gb2s7Ci19Ci0KLS8qIQotICAg
IFxmbiBib29sIFFXZWJQYWdlOjpzaG91bGRJbnRlcnJ1cHRKYXZhU2NyaXB0KCkKLSAgICBcc2lu
Y2UgNC42Ci0gICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIEphdmFTY3JpcHQgcHJv
Z3JhbSBpcyBydW5uaW5nIGZvciBhIGxvbmcgcGVyaW9kIG9mIHRpbWUuCi0KLSAgICBJZiB0aGUg
dXNlciB3YW50ZWQgdG8gc3RvcCB0aGUgSmF2YVNjcmlwdCB0aGUgaW1wbGVtZW50YXRpb24gc2hv
dWxkIHJldHVybiB0cnVlOyBvdGhlcndpc2UgZmFsc2UuCi0KLSAgICBUaGUgZGVmYXVsdCBpbXBs
ZW1lbnRhdGlvbiBleGVjdXRlcyB0aGUgcXVlcnkgdXNpbmcgUU1lc3NhZ2VCb3g6OmluZm9ybWF0
aW9uIHdpdGggUU1lc3NhZ2VCb3g6OlllcyBhbmQgUU1lc3NhZ2VCb3g6Ok5vIGJ1dHRvbnMuCi0q
LwotYm9vbCBRV2ViUGFnZTo6c2hvdWxkSW50ZXJydXB0SmF2YVNjcmlwdCgpCi17Ci0jaWZkZWYg
UVRfTk9fTUVTU0FHRUJPWAotICAgIHJldHVybiBmYWxzZTsKLSNlbHNlCi0gICAgcmV0dXJuIFFN
ZXNzYWdlQm94OjpZZXMgPT0gUU1lc3NhZ2VCb3g6OmluZm9ybWF0aW9uKHZpZXcoKSwgdHIoIkph
dmFTY3JpcHQgUHJvYmxlbSAtICUxIikuYXJnKG1haW5GcmFtZSgpLT51cmwoKS5ob3N0KCkpLCB0
cigiVGhlIHNjcmlwdCBvbiB0aGlzIHBhZ2UgYXBwZWFycyB0byBoYXZlIGEgcHJvYmxlbS4gRG8g
eW91IHdhbnQgdG8gc3RvcCB0aGUgc2NyaXB0PyIpLCBRTWVzc2FnZUJveDo6WWVzLCBRTWVzc2Fn
ZUJveDo6Tm8pOwotI2VuZGlmCi19Ci0KLXZvaWQgUVdlYlBhZ2U6OnNldEZlYXR1cmVQZXJtaXNz
aW9uKFFXZWJGcmFtZSogZnJhbWUsIEZlYXR1cmUgZmVhdHVyZSwgUGVybWlzc2lvblBvbGljeSBw
b2xpY3kpCi17Ci0gICAgc3dpdGNoIChmZWF0dXJlKSB7Ci0gICAgY2FzZSBOb3RpZmljYXRpb25z
OgotI2lmIEVOQUJMRShOT1RJRklDQVRJT05TKSB8fCBFTkFCTEUoTEVHQUNZX05PVElGSUNBVElP
TlMpCi0gICAgICAgIGlmIChwb2xpY3kgPT0gUGVybWlzc2lvbkdyYW50ZWRCeVVzZXIpCi0gICAg
ICAgICAgICBOb3RpZmljYXRpb25QcmVzZW50ZXJDbGllbnRRdDo6bm90aWZpY2F0aW9uUHJlc2Vu
dGVyKCktPmFsbG93Tm90aWZpY2F0aW9uRm9yRnJhbWUoZnJhbWUtPmQtPmZyYW1lKTsKLSNlbmRp
ZgotICAgICAgICBicmVhazsKLSAgICBjYXNlIEdlb2xvY2F0aW9uOgotI2lmIEVOQUJMRShHRU9M
T0NBVElPTikKLSAgICAgICAgaWYgKHBvbGljeSAhPSBQZXJtaXNzaW9uVW5rbm93bikKLSAgICAg
ICAgICAgIEdlb2xvY2F0aW9uUGVybWlzc2lvbkNsaWVudFF0OjpnZW9sb2NhdGlvblBlcm1pc3Np
b25DbGllbnQoKS0+c2V0UGVybWlzc2lvbihmcmFtZS0+ZCwgKHBvbGljeSA9PSBQZXJtaXNzaW9u
R3JhbnRlZEJ5VXNlcikpOwotI2VuZGlmCi0gICAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoK
LSAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi0vKiEKLSAgICBUaGlzIGZ1bmN0aW9uIGlzIGNh
bGxlZCB3aGVuZXZlciBXZWJLaXQgd2FudHMgdG8gY3JlYXRlIGEgbmV3IHdpbmRvdyBvZiB0aGUg
Z2l2ZW4gXGEgdHlwZSwgZm9yCi0gICAgZXhhbXBsZSB3aGVuIGEgSmF2YVNjcmlwdCBwcm9ncmFt
IHJlcXVlc3RzIHRvIG9wZW4gYSBkb2N1bWVudCBpbiBhIG5ldyB3aW5kb3cuCi0KLSAgICBJZiB0
aGUgbmV3IHdpbmRvdyBjYW4gYmUgY3JlYXRlZCwgdGhlIG5ldyB3aW5kb3cncyBRV2ViUGFnZSBp
cyByZXR1cm5lZDsgb3RoZXJ3aXNlIGEgbnVsbCBwb2ludGVyIGlzIHJldHVybmVkLgotCi0gICAg
SWYgdGhlIHZpZXcgYXNzb2NpYXRlZCB3aXRoIHRoZSB3ZWIgcGFnZSBpcyBhIFFXZWJWaWV3IG9i
amVjdCwgdGhlbiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3J3YXJkcwotICAgIHRoZSBy
ZXF1ZXN0IHRvIFFXZWJWaWV3J3MgY3JlYXRlV2luZG93KCkgZnVuY3Rpb247IG90aGVyd2lzZSBp
dCByZXR1cm5zIGEgbnVsbCBwb2ludGVyLgotCi0gICAgSWYgXGEgdHlwZSBpcyBXZWJNb2RhbERp
YWxvZywgdGhlIGFwcGxpY2F0aW9uIG11c3QgY2FsbCBzZXRXaW5kb3dNb2RhbGl0eShRdDo6QXBw
bGljYXRpb25Nb2RhbCkgb24gdGhlIG5ldyB3aW5kb3cuCi0KLSAgICBcbm90ZSBJbiB0aGUgY2Fz
ZXMgd2hlbiB0aGUgd2luZG93IGNyZWF0aW9uIGlzIGJlaW5nIHRyaWdnZXJlZCBieSBKYXZhU2Ny
aXB0LCBhcGFydCBmcm9tCi0gICAgcmVpbXBsZW1lbnRpbmcgdGhpcyBtZXRob2QgYXBwbGljYXRp
b24gbXVzdCBhbHNvIHNldCB0aGUgSmF2YVNjcmlwdENhbk9wZW5XaW5kb3dzIGF0dHJpYnV0ZQot
ICAgIG9mIFFXZWJTZXR0aW5ncyB0byB0cnVlIGluIG9yZGVyIGZvciBpdCB0byBnZXQgY2FsbGVk
LgotCi0gICAgXHNhIGFjY2VwdE5hdmlnYXRpb25SZXF1ZXN0KCksIFFXZWJWaWV3OjpjcmVhdGVX
aW5kb3coKQotKi8KLVFXZWJQYWdlICpRV2ViUGFnZTo6Y3JlYXRlV2luZG93KFdlYldpbmRvd1R5
cGUgdHlwZSkKLXsKLSAgICBRV2ViVmlldyAqd2ViVmlldyA9IHFvYmplY3RfY2FzdDxRV2ViVmll
dyo+KHZpZXcoKSk7Ci0gICAgaWYgKHdlYlZpZXcpIHsKLSAgICAgICAgUVdlYlZpZXcgKm5ld1Zp
ZXcgPSB3ZWJWaWV3LT5jcmVhdGVXaW5kb3codHlwZSk7Ci0gICAgICAgIGlmIChuZXdWaWV3KQot
ICAgICAgICAgICAgcmV0dXJuIG5ld1ZpZXctPnBhZ2UoKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7
Ci19Ci0KLS8qIQotICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW5ldmVyIFdlYktpdCBl
bmNvdW50ZXJzIGEgSFRNTCBvYmplY3QgZWxlbWVudCB3aXRoIHR5cGUgImFwcGxpY2F0aW9uL3gt
cXQtcGx1Z2luIi4gSXQgaXMKLSAgICBjYWxsZWQgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2Yg
UVdlYlNldHRpbmdzOjpQbHVnaW5zRW5hYmxlZC4gVGhlIFxhIGNsYXNzaWQsIFxhIHVybCwgXGEg
cGFyYW1OYW1lcyBhbmQgXGEgcGFyYW1WYWx1ZXMKLSAgICBjb3JyZXNwb25kIHRvIHRoZSBIVE1M
IG9iamVjdCBlbGVtZW50IGF0dHJpYnV0ZXMgYW5kIGNoaWxkIGVsZW1lbnRzIHRvIGNvbmZpZ3Vy
ZSB0aGUgZW1iZWRkYWJsZSBvYmplY3QuCi0qLwotUU9iamVjdCAqUVdlYlBhZ2U6OmNyZWF0ZVBs
dWdpbihjb25zdCBRU3RyaW5nICZjbGFzc2lkLCBjb25zdCBRVXJsICZ1cmwsIGNvbnN0IFFTdHJp
bmdMaXN0ICZwYXJhbU5hbWVzLCBjb25zdCBRU3RyaW5nTGlzdCAmcGFyYW1WYWx1ZXMpCi17Ci0g
ICAgUV9VTlVTRUQoY2xhc3NpZCkKLSAgICBRX1VOVVNFRCh1cmwpCi0gICAgUV9VTlVTRUQocGFy
YW1OYW1lcykKLSAgICBRX1VOVVNFRChwYXJhbVZhbHVlcykKLSAgICByZXR1cm4gMDsKLX0KLQot
c3RhdGljIHZvaWQgZXh0cmFjdENvbnRlbnRUeXBlRnJvbUhhc2goY29uc3QgSGFzaFNldDxTdHJp
bmc+JiB0eXBlcywgUVN0cmluZ0xpc3QqIGxpc3QpCi17Ci0gICAgaWYgKCFsaXN0KQotICAgICAg
ICByZXR1cm47Ci0KLSAgICBIYXNoU2V0PFN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0g
dHlwZXMuZW5kKCk7Ci0gICAgZm9yIChIYXNoU2V0PFN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0
ID0gdHlwZXMuYmVnaW4oKTsgaXQgIT0gZW5kSXQ7ICsraXQpCi0gICAgICAgICpsaXN0IDw8ICpp
dDsKLX0KLQotc3RhdGljIHZvaWQgZXh0cmFjdENvbnRlbnRUeXBlRnJvbVBsdWdpblZlY3Rvcihj
b25zdCBWZWN0b3I8UGx1Z2luUGFja2FnZSo+JiBwbHVnaW5zLCBRU3RyaW5nTGlzdCogbGlzdCkK
LXsKLSAgICBpZiAoIWxpc3QpCi0gICAgICAgIHJldHVybjsKLQotICAgIGZvciAodW5zaWduZWQg
aW50IGkgPSAwOyBpIDwgcGx1Z2lucy5zaXplKCk7ICsraSkgewotICAgICAgICBNSU1FVG9EZXNj
cmlwdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIG1hcF9pdCA9IHBsdWdpbnNbaV0tPm1pbWVUb0Rl
c2NyaXB0aW9ucygpLmJlZ2luKCk7Ci0gICAgICAgIE1JTUVUb0Rlc2NyaXB0aW9uc01hcDo6Y29u
c3RfaXRlcmF0b3IgbWFwX2VuZCA9IHBsdWdpbnNbaV0tPm1pbWVUb0Rlc2NyaXB0aW9ucygpLmVu
ZCgpOwotICAgICAgICBmb3IgKDsgbWFwX2l0ICE9IG1hcF9lbmQ7ICsrbWFwX2l0KQotICAgICAg
ICAgICAgKmxpc3QgPDwgbWFwX2l0LT5rZXk7Ci0gICAgfQotfQotCi0vKiEKLSAqICBSZXR1cm5z
IHRoZSBsaXN0IG9mIGFsbCBjb250ZW50IHR5cGVzIHN1cHBvcnRlZCBieSBRV2ViUGFnZS4KLSAq
LwotUVN0cmluZ0xpc3QgUVdlYlBhZ2U6OnN1cHBvcnRlZENvbnRlbnRUeXBlcygpIGNvbnN0Ci17
Ci0gICAgUVN0cmluZ0xpc3QgbWltZVR5cGVzOwotCi0gICAgZXh0cmFjdENvbnRlbnRUeXBlRnJv
bUhhc2goTUlNRVR5cGVSZWdpc3RyeTo6Z2V0U3VwcG9ydGVkSW1hZ2VNSU1FVHlwZXMoKSwgJm1p
bWVUeXBlcyk7Ci0gICAgZXh0cmFjdENvbnRlbnRUeXBlRnJvbUhhc2goTUlNRVR5cGVSZWdpc3Ry
eTo6Z2V0U3VwcG9ydGVkTm9uSW1hZ2VNSU1FVHlwZXMoKSwgJm1pbWVUeXBlcyk7Ci0gICAgaWYg
KGQtPnBhZ2UtPnNldHRpbmdzKCkgJiYgZC0+cGFnZS0+c2V0dGluZ3MoKS0+YXJlUGx1Z2luc0Vu
YWJsZWQoKSkKLSAgICAgICAgZXh0cmFjdENvbnRlbnRUeXBlRnJvbVBsdWdpblZlY3RvcihQbHVn
aW5EYXRhYmFzZTo6aW5zdGFsbGVkUGx1Z2lucygpLT5wbHVnaW5zKCksICZtaW1lVHlwZXMpOwot
Ci0gICAgcmV0dXJuIG1pbWVUeXBlczsKLX0KLQotLyohCi0gKiAgUmV0dXJucyB0cnVlIGlmIFFX
ZWJQYWdlIGNhbiBoYW5kbGUgdGhlIGdpdmVuIFxhIG1pbWVUeXBlOyBvdGhlcndpc2UsIHJldHVy
bnMgZmFsc2UuCi0gKi8KLWJvb2wgUVdlYlBhZ2U6OnN1cHBvcnRzQ29udGVudFR5cGUoY29uc3Qg
UVN0cmluZyYgbWltZVR5cGUpIGNvbnN0Ci17Ci0gICAgY29uc3QgU3RyaW5nIHR5cGUgPSBtaW1l
VHlwZS50b0xvd2VyKCk7Ci0gICAgaWYgKE1JTUVUeXBlUmVnaXN0cnk6OmlzU3VwcG9ydGVkSW1h
Z2VNSU1FVHlwZSh0eXBlKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBpZiAoTUlNRVR5
cGVSZWdpc3RyeTo6aXNTdXBwb3J0ZWROb25JbWFnZU1JTUVUeXBlKHR5cGUpKQotICAgICAgICBy
ZXR1cm4gdHJ1ZTsKLQotICAgIGlmIChkLT5wYWdlLT5zZXR0aW5ncygpICYmIGQtPnBhZ2UtPnNl
dHRpbmdzKCktPmFyZVBsdWdpbnNFbmFibGVkKCkKLSAgICAgICAgJiYgUGx1Z2luRGF0YWJhc2U6
Omluc3RhbGxlZFBsdWdpbnMoKS0+aXNNSU1FVHlwZVJlZ2lzdGVyZWQodHlwZSkpCi0gICAgICAg
IHJldHVybiB0cnVlOwotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgV2ViQ29yZTo6
RnJhbWVMb2FkUmVxdWVzdCBmcmFtZUxvYWRSZXF1ZXN0KGNvbnN0IFFVcmwgJnVybCwgV2ViQ29y
ZTo6RnJhbWUgKmZyYW1lKQotewotICAgIHJldHVybiBXZWJDb3JlOjpGcmFtZUxvYWRSZXF1ZXN0
KGZyYW1lLT5kb2N1bWVudCgpLT5zZWN1cml0eU9yaWdpbigpLAotICAgICAgICBXZWJDb3JlOjpS
ZXNvdXJjZVJlcXVlc3QodXJsLCBmcmFtZS0+bG9hZGVyKCktPm91dGdvaW5nUmVmZXJyZXIoKSkp
OwotfQotCi1zdGF0aWMgdm9pZCBvcGVuTmV3V2luZG93KGNvbnN0IFFVcmwmIHVybCwgV2ViQ29y
ZTo6RnJhbWUqIGZyYW1lKQotewotICAgIGlmIChQYWdlKiBvbGRQYWdlID0gZnJhbWUtPnBhZ2Uo
KSkgewotICAgICAgICBXaW5kb3dGZWF0dXJlcyBmZWF0dXJlczsKLSAgICAgICAgTmF2aWdhdGlv
bkFjdGlvbiBhY3Rpb247Ci0gICAgICAgIEZyYW1lTG9hZFJlcXVlc3QgcmVxdWVzdCA9IGZyYW1l
TG9hZFJlcXVlc3QodXJsLCBmcmFtZSk7Ci0gICAgICAgIGlmIChQYWdlKiBuZXdQYWdlID0gb2xk
UGFnZS0+Y2hyb21lKCktPmNyZWF0ZVdpbmRvdyhmcmFtZSwgcmVxdWVzdCwgZmVhdHVyZXMsIGFj
dGlvbikpIHsKLSAgICAgICAgICAgIG5ld1BhZ2UtPm1haW5GcmFtZSgpLT5sb2FkZXIoKS0+bG9h
ZEZyYW1lUmVxdWVzdChyZXF1ZXN0LCBmYWxzZSwgZmFsc2UsIDAsIDAsIE1heWJlU2VuZFJlZmVy
cmVyKTsKLSAgICAgICAgICAgIG5ld1BhZ2UtPmNocm9tZSgpLT5zaG93KCk7Ci0gICAgICAgIH0K
LSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvbGxlY3RDaGlsZEZyYW1lcyhRV2ViRnJhbWUqIGZy
YW1lLCBRTGlzdDxRV2ViRnJhbWUqPiYgbGlzdCkKLXsKLSAgICBsaXN0IDw8IGZyYW1lLT5jaGls
ZEZyYW1lcygpOwotICAgIFFMaXN0SXRlcmF0b3I8UVdlYkZyYW1lKj4gaXQoZnJhbWUtPmNoaWxk
RnJhbWVzKCkpOwotICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgY29sbGVjdENo
aWxkRnJhbWVzKGl0Lm5leHQoKSwgbGlzdCk7Ci0gICAgfQotfQotCi0vKiEKLSAgICBUaGlzIGZ1
bmN0aW9uIGNhbiBiZSBjYWxsZWQgdG8gdHJpZ2dlciB0aGUgc3BlY2lmaWVkIFxhIGFjdGlvbi4K
LSAgICBJdCBpcyBhbHNvIGNhbGxlZCBieSBRdFdlYktpdCBpZiB0aGUgdXNlciB0cmlnZ2VycyB0
aGUgYWN0aW9uLCBmb3IgZXhhbXBsZQotICAgIHRocm91Z2ggYSBjb250ZXh0IG1lbnUgaXRlbS4K
LQotICAgIElmIFxhIGFjdGlvbiBpcyBhIGNoZWNrYWJsZSBhY3Rpb24gdGhlbiBcYSBjaGVja2Vk
IHNwZWNpZmllZCB3aGV0aGVyIHRoZSBhY3Rpb24KLSAgICBpcyB0b2dnbGVkIG9yIG5vdC4KLQot
ICAgIFxzYSBhY3Rpb24oKQotKi8KLXZvaWQgUVdlYlBhZ2U6OnRyaWdnZXJBY3Rpb24oV2ViQWN0
aW9uIGFjdGlvbiwgYm9vbCkKLXsKLSAgICBXZWJDb3JlOjpGcmFtZSAqZnJhbWUgPSBkLT5wYWdl
LT5mb2N1c0NvbnRyb2xsZXIoKS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCk7Ci0gICAgaWYgKCFmcmFt
ZSkKLSAgICAgICAgcmV0dXJuOwotICAgIFdlYkNvcmU6OkVkaXRvciAqZWRpdG9yID0gZnJhbWUt
PmVkaXRvcigpOwotICAgIGNvbnN0IGNoYXIgKmNvbW1hbmQgPSAwOwotCi0gICAgc3dpdGNoIChh
Y3Rpb24pIHsKLSAgICAgICAgY2FzZSBPcGVuTGluazoKLSAgICAgICAgICAgIGlmIChRV2ViRnJh
bWUgKnRhcmdldEZyYW1lID0gZC0+aGl0VGVzdFJlc3VsdC5saW5rVGFyZ2V0RnJhbWUoKSkgewot
ICAgICAgICAgICAgICAgIFdURjo6UmVmUHRyPFdlYkNvcmU6OkZyYW1lPiB3Y0ZyYW1lID0gdGFy
Z2V0RnJhbWUtPmQtPmZyYW1lOwotICAgICAgICAgICAgICAgIHRhcmdldEZyYW1lLT5kLT5mcmFt
ZS0+bG9hZGVyKCktPmxvYWRGcmFtZVJlcXVlc3QoZnJhbWVMb2FkUmVxdWVzdChkLT5oaXRUZXN0
UmVzdWx0LmxpbmtVcmwoKSwgd2NGcmFtZS5nZXQoKSksCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmxvY2tIaXN0b3J5
Ki8gZmFsc2UsIC8qbG9ja0JhY2tGb3J3YXJkTGlzdCovIGZhbHNlLCAvKmV2ZW50Ki8gMCwKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIC8qRm9ybVN0YXRlKi8gMCwgTWF5YmVTZW5kUmVmZXJyZXIpOwotICAgICAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCi0g
ICAgICAgIGNhc2UgT3BlbkxpbmtJbk5ld1dpbmRvdzoKLSAgICAgICAgICAgIG9wZW5OZXdXaW5k
b3coZC0+aGl0VGVzdFJlc3VsdC5saW5rVXJsKCksIGZyYW1lKTsKLSAgICAgICAgICAgIGJyZWFr
OwotICAgICAgICBjYXNlIE9wZW5MaW5rSW5UaGlzV2luZG93OgotICAgICAgICAgICAgZnJhbWUt
PmxvYWRlcigpLT5sb2FkRnJhbWVSZXF1ZXN0KGZyYW1lTG9hZFJlcXVlc3QoZC0+aGl0VGVzdFJl
c3VsdC5saW5rVXJsKCksIGZyYW1lKSwKLSAgICAgICAgICAgICAgICAvKmxvY2tIaXN0b3J5Ki8g
ZmFsc2UsIC8qbG9ja0JhY2tGb3J3YXJkTGlzdCovIGZhbHNlLCAvKmV2ZW50Ki8gMCwgLypGb3Jt
U3RhdGUqLyAwLCBNYXliZVNlbmRSZWZlcnJlcik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAg
ICAgY2FzZSBPcGVuRnJhbWVJbk5ld1dpbmRvdzogewotICAgICAgICAgICAgS1VSTCB1cmwgPSBm
cmFtZS0+bG9hZGVyKCktPmRvY3VtZW50TG9hZGVyKCktPnVucmVhY2hhYmxlVVJMKCk7Ci0gICAg
ICAgICAgICBpZiAodXJsLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICB1cmwgPSBmcmFtZS0+
bG9hZGVyKCktPmRvY3VtZW50TG9hZGVyKCktPnVybCgpOwotICAgICAgICAgICAgb3Blbk5ld1dp
bmRvdyh1cmwsIGZyYW1lKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAg
IGNhc2UgQ29weUxpbmtUb0NsaXBib2FyZDogewotI2lmIGRlZmluZWQoUV9XU19YMTEpCi0gICAg
ICAgICAgICBib29sIG9sZFNlbGVjdGlvbk1vZGUgPSBQYXN0ZWJvYXJkOjpnZW5lcmFsUGFzdGVi
b2FyZCgpLT5pc1NlbGVjdGlvbk1vZGUoKTsKLSAgICAgICAgICAgIFBhc3RlYm9hcmQ6OmdlbmVy
YWxQYXN0ZWJvYXJkKCktPnNldFNlbGVjdGlvbk1vZGUodHJ1ZSk7Ci0gICAgICAgICAgICBlZGl0
b3ItPmNvcHlVUkwoZC0+aGl0VGVzdFJlc3VsdC5saW5rVXJsKCksIGQtPmhpdFRlc3RSZXN1bHQu
bGlua1RleHQoKSk7Ci0gICAgICAgICAgICBQYXN0ZWJvYXJkOjpnZW5lcmFsUGFzdGVib2FyZCgp
LT5zZXRTZWxlY3Rpb25Nb2RlKG9sZFNlbGVjdGlvbk1vZGUpOwotI2VuZGlmCi0gICAgICAgICAg
ICBlZGl0b3ItPmNvcHlVUkwoZC0+aGl0VGVzdFJlc3VsdC5saW5rVXJsKCksIGQtPmhpdFRlc3RS
ZXN1bHQubGlua1RleHQoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAg
ICBjYXNlIE9wZW5JbWFnZUluTmV3V2luZG93OgotICAgICAgICAgICAgb3Blbk5ld1dpbmRvdyhk
LT5oaXRUZXN0UmVzdWx0LmltYWdlVXJsKCksIGZyYW1lKTsKLSAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICBjYXNlIERvd25sb2FkSW1hZ2VUb0Rpc2s6Ci0gICAgICAgICAgICBmcmFtZS0+bG9h
ZGVyKCktPmNsaWVudCgpLT5zdGFydERvd25sb2FkKFdlYkNvcmU6OlJlc291cmNlUmVxdWVzdChk
LT5oaXRUZXN0UmVzdWx0LmltYWdlVXJsKCksIGZyYW1lLT5sb2FkZXIoKS0+b3V0Z29pbmdSZWZl
cnJlcigpKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBEb3dubG9hZExpbmtU
b0Rpc2s6Ci0gICAgICAgICAgICBmcmFtZS0+bG9hZGVyKCktPmNsaWVudCgpLT5zdGFydERvd25s
b2FkKFdlYkNvcmU6OlJlc291cmNlUmVxdWVzdChkLT5oaXRUZXN0UmVzdWx0LmxpbmtVcmwoKSwg
ZnJhbWUtPmxvYWRlcigpLT5vdXRnb2luZ1JlZmVycmVyKCkpKTsKLSAgICAgICAgICAgIGJyZWFr
OwotI2lmbmRlZiBRVF9OT19DTElQQk9BUkQKLSAgICAgICAgY2FzZSBDb3B5SW1hZ2VUb0NsaXBi
b2FyZDoKLSAgICAgICAgICAgIFFBcHBsaWNhdGlvbjo6Y2xpcGJvYXJkKCktPnNldFBpeG1hcChk
LT5oaXRUZXN0UmVzdWx0LnBpeG1hcCgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBj
YXNlIENvcHlJbWFnZVVybFRvQ2xpcGJvYXJkOgotICAgICAgICAgICAgUUFwcGxpY2F0aW9uOjpj
bGlwYm9hcmQoKS0+c2V0VGV4dChkLT5oaXRUZXN0UmVzdWx0LmltYWdlVXJsKCkudG9TdHJpbmco
KSk7Ci0gICAgICAgICAgICBicmVhazsKLSNlbmRpZgotICAgICAgICBjYXNlIEJhY2s6Ci0gICAg
ICAgICAgICBkLT5wYWdlLT5nb0JhY2soKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBj
YXNlIEZvcndhcmQ6Ci0gICAgICAgICAgICBkLT5wYWdlLT5nb0ZvcndhcmQoKTsKLSAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICBjYXNlIFN0b3A6Ci0gICAgICAgICAgICBtYWluRnJhbWUoKS0+
ZC0+ZnJhbWUtPmxvYWRlcigpLT5zdG9wRm9yVXNlckNhbmNlbCgpOwotICAgICAgICAgICAgZC0+
dXBkYXRlTmF2aWdhdGlvbkFjdGlvbnMoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBj
YXNlIFJlbG9hZDoKLSAgICAgICAgICAgIG1haW5GcmFtZSgpLT5kLT5mcmFtZS0+bG9hZGVyKCkt
PnJlbG9hZCgvKmVuZHRvZW5kcmVsb2FkKi9mYWxzZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgY2FzZSBSZWxvYWRBbmRCeXBhc3NDYWNoZToKLSAgICAgICAgICAgIG1haW5GcmFtZSgp
LT5kLT5mcmFtZS0+bG9hZGVyKCktPnJlbG9hZCgvKmVuZHRvZW5kcmVsb2FkKi90cnVlKTsKLSAg
ICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNldFRleHREaXJlY3Rpb25EZWZhdWx0Ogot
ICAgICAgICAgICAgZWRpdG9yLT5zZXRCYXNlV3JpdGluZ0RpcmVjdGlvbihOYXR1cmFsV3JpdGlu
Z0RpcmVjdGlvbik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTZXRUZXh0RGly
ZWN0aW9uTGVmdFRvUmlnaHQ6Ci0gICAgICAgICAgICBlZGl0b3ItPnNldEJhc2VXcml0aW5nRGly
ZWN0aW9uKExlZnRUb1JpZ2h0V3JpdGluZ0RpcmVjdGlvbik7Ci0gICAgICAgICAgICBicmVhazsK
LSAgICAgICAgY2FzZSBTZXRUZXh0RGlyZWN0aW9uUmlnaHRUb0xlZnQ6Ci0gICAgICAgICAgICBl
ZGl0b3ItPnNldEJhc2VXcml0aW5nRGlyZWN0aW9uKFJpZ2h0VG9MZWZ0V3JpdGluZ0RpcmVjdGlv
bik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBJbnNwZWN0RWxlbWVudDogewot
I2lmIEVOQUJMRShJTlNQRUNUT1IpCi0gICAgICAgICAgICBpZiAoIWQtPmhpdFRlc3RSZXN1bHQu
aXNOdWxsKCkpIHsKLSAgICAgICAgICAgICAgICBkLT5nZXRPckNyZWF0ZUluc3BlY3RvcigpOyAv
LyBNYWtlIHN1cmUgdGhlIGluc3BlY3RvciBpcyBjcmVhdGVkCi0gICAgICAgICAgICAgICAgZC0+
aW5zcGVjdG9yLT5zaG93KCk7IC8vIFRoZSBpbnNwZWN0b3IgaXMgZXhwZWN0ZWQgdG8gYmUgc2hv
d24gb24gaW5zcGVjdGlvbgotICAgICAgICAgICAgICAgIGQtPnBhZ2UtPmluc3BlY3RvckNvbnRy
b2xsZXIoKS0+aW5zcGVjdChkLT5oaXRUZXN0UmVzdWx0LmQtPmlubmVyTm9uU2hhcmVkTm9kZS5n
ZXQoKSk7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICB9Ci0gICAgICAgIGNhc2UgU3RvcFNjaGVkdWxlZFBhZ2VSZWZyZXNoOiB7Ci0gICAgICAgICAg
ICBRV2ViRnJhbWUqIHRvcEZyYW1lID0gbWFpbkZyYW1lKCk7Ci0gICAgICAgICAgICB0b3BGcmFt
ZS0+ZC0+ZnJhbWUtPm5hdmlnYXRpb25TY2hlZHVsZXIoKS0+Y2FuY2VsKCk7Ci0gICAgICAgICAg
ICBRTGlzdDxRV2ViRnJhbWUqPiBjaGlsZEZyYW1lczsKLSAgICAgICAgICAgIGNvbGxlY3RDaGls
ZEZyYW1lcyh0b3BGcmFtZSwgY2hpbGRGcmFtZXMpOwotICAgICAgICAgICAgUUxpc3RJdGVyYXRv
cjxRV2ViRnJhbWUqPiBpdChjaGlsZEZyYW1lcyk7Ci0gICAgICAgICAgICB3aGlsZSAoaXQuaGFz
TmV4dCgpKQotICAgICAgICAgICAgICAgIGl0Lm5leHQoKS0+ZC0+ZnJhbWUtPm5hdmlnYXRpb25T
Y2hlZHVsZXIoKS0+Y2FuY2VsKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAg
ICAgICBkZWZhdWx0OgotICAgICAgICAgICAgY29tbWFuZCA9IFFXZWJQYWdlUHJpdmF0ZTo6ZWRp
dG9yQ29tbWFuZEZvcldlYkFjdGlvbnMoYWN0aW9uKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAg
IH0KLQotICAgIGlmIChjb21tYW5kKQotICAgICAgICBlZGl0b3ItPmNvbW1hbmQoY29tbWFuZCku
ZXhlY3V0ZSgpOwotfQotCi0KLVFDb2xvciBRV2ViUGFnZVByaXZhdGU6OmNvbG9yU2VsZWN0aW9u
UmVxdWVzdGVkKGNvbnN0IFFDb2xvciAmc2VsZWN0ZWRDb2xvcikKLXsKLSAgICBRQ29sb3IgcmV0
ID0gc2VsZWN0ZWRDb2xvcjsKLSNpZm5kZWYgUVRfTk9fQ09MT1JESUFMT0cKLSAgICByZXQgPSBR
Q29sb3JEaWFsb2c6OmdldENvbG9yKHNlbGVjdGVkQ29sb3IsIHEtPnZpZXcoKSk7Ci0gICAgaWYg
KCFyZXQuaXNWYWxpZCgpKQotICAgICAgICByZXQgPSBzZWxlY3RlZENvbG9yOwotI2VuZGlmCi0g
ICAgcmV0dXJuIHJldDsKLX0KLQotUVdlYlNlbGVjdE1ldGhvZCAqUVdlYlBhZ2VQcml2YXRlOjpj
cmVhdGVTZWxlY3RQb3B1cCgpCi17Ci0gICAgcmV0dXJuIG5ldyBRdEZhbGxiYWNrV2ViUG9wdXAo
dGhpcyk7Ci19Ci0KLVFSZWN0IFFXZWJQYWdlUHJpdmF0ZTo6dmlld1JlY3RSZWxhdGl2ZVRvV2lu
ZG93KCkKLXsKLQotICAgIFFXaWRnZXQqIG93bmVyV2lkZ2V0PSBjbGllbnQuaXNOdWxsKCkgPyAw
IDogcW9iamVjdF9jYXN0PFFXaWRnZXQqPihjbGllbnQtPm93bmVyV2lkZ2V0KCkpOwotICAgIGlm
ICghb3duZXJXaWRnZXQpCi0gICAgICAgIHJldHVybiBRUmVjdCgpOwotICAgIFFXaWRnZXQqIHRv
cExldmVsV2lkZ2V0ID0gb3duZXJXaWRnZXQtPndpbmRvdygpOwotCi0gICAgUVBvaW50IHRvcExl
ZnRDb3JuZXIgPSBvd25lcldpZGdldC0+bWFwRnJvbSh0b3BMZXZlbFdpZGdldCwgUVBvaW50KDAs
IDApKTsKLSAgICByZXR1cm4gUVJlY3QodG9wTGVmdENvcm5lciwgb3duZXJXaWRnZXQtPnNpemUo
KSk7Ci19Ci0KLXZvaWQgUVdlYlBhZ2VQcml2YXRlOjpnZW9sb2NhdGlvblBlcm1pc3Npb25SZXF1
ZXN0ZWQoUVdlYkZyYW1lQWRhcHRlciogZnJhbWUpCi17Ci0gICAgZW1pdCBxLT5mZWF0dXJlUGVy
bWlzc2lvblJlcXVlc3RlZChRV2ViRnJhbWVQcml2YXRlOjpraXQoZnJhbWUpLCBRV2ViUGFnZTo6
R2VvbG9jYXRpb24pOwotfQotCi12b2lkIFFXZWJQYWdlUHJpdmF0ZTo6Z2VvbG9jYXRpb25QZXJt
aXNzaW9uUmVxdWVzdENhbmNlbGxlZChRV2ViRnJhbWVBZGFwdGVyKiBmcmFtZSkKLXsKLSAgICBl
bWl0IHEtPmZlYXR1cmVQZXJtaXNzaW9uUmVxdWVzdENhbmNlbGVkKFFXZWJGcmFtZVByaXZhdGU6
OmtpdChmcmFtZSksIFFXZWJQYWdlOjpHZW9sb2NhdGlvbik7Ci19Ci0KLXZvaWQgUVdlYlBhZ2VQ
cml2YXRlOjpub3RpZmljYXRpb25zUGVybWlzc2lvblJlcXVlc3RlZChRV2ViRnJhbWVBZGFwdGVy
KiBmcmFtZSkKLXsKLSAgICBlbWl0IHEtPmZlYXR1cmVQZXJtaXNzaW9uUmVxdWVzdGVkKFFXZWJG
cmFtZVByaXZhdGU6OmtpdChmcmFtZSksIFFXZWJQYWdlOjpOb3RpZmljYXRpb25zKTsKLX0KLQot
dm9pZCBRV2ViUGFnZVByaXZhdGU6Om5vdGlmaWNhdGlvbnNQZXJtaXNzaW9uUmVxdWVzdENhbmNl
bGxlZChRV2ViRnJhbWVBZGFwdGVyKiBmcmFtZSkKLXsKLSAgICBlbWl0IHEtPmZlYXR1cmVQZXJt
aXNzaW9uUmVxdWVzdENhbmNlbGVkKFFXZWJGcmFtZVByaXZhdGU6OmtpdChmcmFtZSksIFFXZWJQ
YWdlOjpOb3RpZmljYXRpb25zKTsKLX0KLQotdm9pZCBRV2ViUGFnZVByaXZhdGU6OnJlc3BvbmRU
b0NoYW5nZWRDb250ZW50cygpCi17Ci0gICAgdXBkYXRlRWRpdG9yQWN0aW9ucygpOwotCi0gICAg
ZW1pdCBxLT5jb250ZW50c0NoYW5nZWQoKTsKLX0KLQotdm9pZCBRV2ViUGFnZVByaXZhdGU6OnJl
c3BvbmRUb0NoYW5nZWRTZWxlY3Rpb24oKQotewotICAgIHVwZGF0ZUVkaXRvckFjdGlvbnMoKTsK
LSAgICBlbWl0IHEtPnNlbGVjdGlvbkNoYW5nZWQoKTsKLX0KLQotdm9pZCBRV2ViUGFnZVByaXZh
dGU6Om1pY3JvRm9jdXNDaGFuZ2VkKCkKLXsKLSAgICBlbWl0IHEtPm1pY3JvRm9jdXNDaGFuZ2Vk
KCk7Ci19Ci0KLXZvaWQgUVdlYlBhZ2VQcml2YXRlOjp0cmlnZ2VyQ29weUFjdGlvbigpCi17Ci0g
ICAgcS0+dHJpZ2dlckFjdGlvbihRV2ViUGFnZTo6Q29weSk7Ci19Ci0KLXZvaWQgUVdlYlBhZ2VQ
cml2YXRlOjp0cmlnZ2VyQWN0aW9uRm9yS2V5RXZlbnQoUUtleUV2ZW50KiBldmVudCkKLXsKLSAg
ICBRV2ViUGFnZTo6V2ViQWN0aW9uIGFjdGlvbiA9IGVkaXRvckFjdGlvbkZvcktleUV2ZW50KGV2
ZW50KTsKLSAgICBxLT50cmlnZ2VyQWN0aW9uKGFjdGlvbik7Ci19Ci0KLXZvaWQgUVdlYlBhZ2VQ
cml2YXRlOjpjbGVhclVuZG9TdGFjaygpCi17Ci0jaWZuZGVmIFFUX05PX1VORE9TVEFDSwotICAg
IGlmICh1bmRvU3RhY2spCi0gICAgICAgIHVuZG9TdGFjay0+Y2xlYXIoKTsKLSNlbmRpZgotfQot
Ci1ib29sIFFXZWJQYWdlUHJpdmF0ZTo6Y2FuVW5kbygpIGNvbnN0Ci17Ci0jaWZuZGVmIFFUX05P
X1VORE9TVEFDSwotICAgIGlmICghdW5kb1N0YWNrKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgcmV0dXJuIHVuZG9TdGFjay0+Y2FuVW5kbygpOwotI2Vsc2UKLSAgICByZXR1cm4gZmFsc2U7
Ci0jZW5kaWYKLX0KLQotYm9vbCBRV2ViUGFnZVByaXZhdGU6OmNhblJlZG8oKSBjb25zdAotewot
I2lmbmRlZiBRVF9OT19VTkRPU1RBQ0sKLSAgICBpZiAoIXVuZG9TdGFjaykKLSAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgIHJldHVybiB1bmRvU3RhY2stPmNhblJlZG8oKTsKLSNlbHNlCi0gICAg
cmV0dXJuIGZhbHNlOwotI2VuZGlmCi19Ci0KLXZvaWQgUVdlYlBhZ2VQcml2YXRlOjp1bmRvKCkK
LXsKLSNpZm5kZWYgUVRfTk9fVU5ET1NUQUNLCi0gICAgaWYgKHVuZG9TdGFjaykKLSAgICAgICAg
dW5kb1N0YWNrLT51bmRvKCk7Ci0jZW5kaWYKLX0KLQotdm9pZCBRV2ViUGFnZVByaXZhdGU6OnJl
ZG8oKQotewotI2lmbmRlZiBRVF9OT19VTkRPU1RBQ0sKLSAgICBpZiAodW5kb1N0YWNrKQotICAg
ICAgICB1bmRvU3RhY2stPnJlZG8oKTsKLSNlbmRpZgotfQotCi12b2lkIFFXZWJQYWdlUHJpdmF0
ZTo6Y3JlYXRlVW5kb1N0ZXAoUVNoYXJlZFBvaW50ZXI8VW5kb1N0ZXBRdD4gc3RlcCkKLXsKLSNp
Zm5kZWYgUVRfTk9fVU5ET1NUQUNLCi0gICAgLy8gQ2FsbCB1bmRvU3RhY2soKSBnZXR0ZXIgZmly
c3QgdG8gZW5zdXJlIHN0YWNrIGlzIGNyZWF0ZWQKLSAgICAvLyBpZiBpdCBkb2Vzbid0IGV4aXN0
IHlldC4KLSAgICBxLT51bmRvU3RhY2soKS0+cHVzaChuZXcgUVdlYlVuZG9Db21tYW5kKHN0ZXAp
KTsKLSNlbmRpZgotfQotCi1jb25zdCBjaGFyICpRV2ViUGFnZVByaXZhdGU6OmVkaXRvckNvbW1h
bmRGb3JLZXlFdmVudChRS2V5RXZlbnQqIGV2ZW50KQotewotICAgIFFXZWJQYWdlOjpXZWJBY3Rp
b24gYWN0aW9uID0gZWRpdG9yQWN0aW9uRm9yS2V5RXZlbnQoZXZlbnQpOwotICAgIHJldHVybiBl
ZGl0b3JDb21tYW5kRm9yV2ViQWN0aW9ucyhhY3Rpb24pOwotfQotCi1RU2l6ZSBRV2ViUGFnZTo6
dmlld3BvcnRTaXplKCkgY29uc3QKLXsKLSAgICBpZiAoZC0+bWFpbkZyYW1lICYmIGQtPm1haW5G
cmFtZS5kYXRhKCktPmQtPmZyYW1lLT52aWV3KCkpCi0gICAgICAgIHJldHVybiBkLT5tYWluRnJh
bWUuZGF0YSgpLT5kLT5mcmFtZS0+dmlldygpLT5mcmFtZVJlY3QoKS5zaXplKCk7Ci0KLSAgICBy
ZXR1cm4gZC0+bV92aWV3cG9ydFNpemU7Ci19Ci0KLS8qIQotICAgIFxwcm9wZXJ0eSBRV2ViUGFn
ZTo6dmlld3BvcnRTaXplCi0gICAgXGJyaWVmIHRoZSBzaXplIG9mIHRoZSB2aWV3cG9ydAotCi0g
ICAgVGhlIHNpemUgYWZmZWN0cyBmb3IgZXhhbXBsZSB0aGUgdmlzaWJpbGl0eSBvZiBzY3JvbGxi
YXJzCi0gICAgaWYgdGhlIGRvY3VtZW50IGlzIGxhcmdlciB0aGFuIHRoZSB2aWV3cG9ydC4KLQot
ICAgIEJ5IGRlZmF1bHQsIGZvciBhIG5ld2x5LWNyZWF0ZWQgV2ViIHBhZ2UsIHRoaXMgcHJvcGVy
dHkgY29udGFpbnMgYSBzaXplIHdpdGgKLSAgICB6ZXJvIHdpZHRoIGFuZCBoZWlnaHQuCi0KLSAg
ICBcc2EgUVdlYkZyYW1lOjpyZW5kZXIoKSwgcHJlZmVycmVkQ29udGVudHNTaXplCi0qLwotdm9p
ZCBRV2ViUGFnZTo6c2V0Vmlld3BvcnRTaXplKGNvbnN0IFFTaXplICZzaXplKSBjb25zdAotewot
ICAgIGQtPm1fdmlld3BvcnRTaXplID0gc2l6ZTsKLQotICAgIFFXZWJGcmFtZSAqZnJhbWUgPSBt
YWluRnJhbWUoKTsKLSAgICBpZiAoZnJhbWUtPmQtPmZyYW1lICYmIGZyYW1lLT5kLT5mcmFtZS0+
dmlldygpKSB7Ci0gICAgICAgIFdlYkNvcmU6OkZyYW1lVmlldyogdmlldyA9IGZyYW1lLT5kLT5m
cmFtZS0+dmlldygpOwotICAgICAgICB2aWV3LT5yZXNpemUoc2l6ZSk7Ci0gICAgICAgIHZpZXct
PmFkanVzdFZpZXdTaXplKCk7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50IGdldGludGVudihjb25z
dCBjaGFyKiB2YXJpYWJsZSkKLXsKLSAgICBib29sIG9rOwotICAgIGludCB2YWx1ZSA9IHFnZXRl
bnYodmFyaWFibGUpLnRvSW50KCZvayk7Ci0gICAgcmV0dXJuIChvaykgPyB2YWx1ZSA6IC0xOwot
fQotCi1zdGF0aWMgUVNpemUgcXVlcnlEZXZpY2VTaXplRm9yU2NyZWVuQ29udGFpbmluZ1dpZGdl
dChjb25zdCBRV2lkZ2V0KiB3aWRnZXQpCi17Ci0gICAgUURlc2t0b3BXaWRnZXQqIGRlc2t0b3Ag
PSBRQXBwbGljYXRpb246OmRlc2t0b3AoKTsKLSAgICBpZiAoIWRlc2t0b3ApCi0gICAgICAgIHJl
dHVybiBRU2l6ZSgpOwotCi0gICAgUVNpemUgc2l6ZTsKLQotICAgIGlmICh3aWRnZXQpIHsKLSAg
ICAgICAgLy8gUmV0dXJucyB0aGUgYXZhaWxhYmxlIGdlb21ldHJ5IG9mIHRoZSBzY3JlZW4gd2hp
Y2ggY29udGFpbnMgd2lkZ2V0LgotICAgICAgICAvLyBOT1RFOiB0aGlzIG11c3QgYmUgdGhlIHRo
ZSBmdWxsIHNjcmVlbiBzaXplIGluY2x1ZGluZyBhbnkgZml4ZWQgc3RhdHVzIGFyZWFzIGV0Yy4K
LSAgICAgICAgc2l6ZSA9IGRlc2t0b3AtPmF2YWlsYWJsZUdlb21ldHJ5KHdpZGdldCkuc2l6ZSgp
OwotICAgIH0gZWxzZQotICAgICAgICBzaXplID0gZGVza3RvcC0+YXZhaWxhYmxlR2VvbWV0cnko
KS5zaXplKCk7Ci0KLSAgICAvLyBUaGlzIG11c3QgYmUgaW4gcG9ydHJhaXQgbW9kZSwgYWRqdXN0
IGlmIG5vdC4KLSAgICBpZiAoc2l6ZS53aWR0aCgpID4gc2l6ZS5oZWlnaHQoKSkgewotICAgICAg
ICBpbnQgd2lkdGggPSBzaXplLndpZHRoKCk7Ci0gICAgICAgIHNpemUuc2V0V2lkdGgoc2l6ZS5o
ZWlnaHQoKSk7Ci0gICAgICAgIHNpemUuc2V0SGVpZ2h0KHdpZHRoKTsKLSAgICB9Ci0KLSAgICBy
ZXR1cm4gc2l6ZTsKLX0KLQotLyohCi0gICAgQ29tcHV0ZXMgdGhlIG9wdGltYWwgdmlld3BvcnQg
Y29uZmlndXJhdGlvbiBnaXZlbiB0aGUgXGEgYXZhaWxhYmxlU2l6ZSwgd2hlbgotICAgIHVzZXIg
aW50ZXJmYWNlIGNvbXBvbmVudHMgYXJlIGRpc3JlZ2FyZGVkLgotCi0gICAgVGhlIGNvbmZpZ3Vy
YXRpb24gaXMgYWxzbyBkZXBlbmRlbnQgb24gdGhlIGRldmljZSBzY3JlZW4gc2l6ZSB3aGljaCBp
cyBvYnRhaW5lZAotICAgIGF1dG9tYXRpY2FsbHkuIEZvciB0ZXN0aW5nIHB1cnBvc2VzIHRoZSBz
aXplIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHNldHRpbmcgdHdvCi0gICAgZW52aXJvbm1lbnQgdmFy
aWFibGVzIFFUV0VCS0lUX0RFVklDRV9XSURUSCBhbmQgUVRXRUJLSVRfREVWSUNFX0hFSUdIVCwg
d2hpY2gKLSAgICBib3RoIG5lZWRzIHRvIGJlIHNldC4KLQotICAgIFRoZSBWaWV3cG9ydEF0dHJp
YnV0ZXMgaW5jbHVkZXMgYSBwaXhlbCBkZW5zaXR5IHJhdGlvLCB3aGljaCB3aWxsIGFsc28gYmUg
ZXhwb3NlZCB0bwotICAgIHRoZSB3ZWIgYXV0aG9yIHRob3VnaCB0aGUgLXdlYmtpdC1waXhlbC1y
YXRpbyBtZWRpYSBmZWF0dXJlLiBUaGlzIGlzIHRoZSByYXRpbwotICAgIGJldHdlZW4gMSBkZW5z
aXR5LWluZGVwZW5kZW50IHBpeGVsIChEUEkpIGFuZCBwaHlzaWNhbCBwaXhlbHMuCi0KLSAgICBB
IGRlbnNpdHktaW5kZXBlbmRlbnQgcGl4ZWwgaXMgZXF1aXZhbGVudCB0byBvbmUgcGh5c2ljYWwg
cGl4ZWwgb24gYSAxNjAgRFBJIHNjcmVlbiwKLSAgICBzbyBvbiBvdXIgcGxhdGZvcm0gYXNzdW1l
cyB0aGF0IGFzIHRoZSBiYXNlbGluZSBkZW5zaXR5LgotCi0gICAgVGhlIGNvbnZlcnNpb24gb2Yg
RElQIHVuaXRzIHRvIHNjcmVlbiBwaXhlbHMgaXMgcXVpdGUgc2ltcGxlOgotCi0gICAgcGl4ZWxz
ID0gRElQcyAqIChkZW5zaXR5IC8gMTYwKS4KLQotICAgIFRodXMsIG9uIGEgMjQwIERQSSBzY3Jl
ZW4sIDEgRElQcyB3b3VsZCBlcXVhbCAxLjUgcGh5c2ljYWwgcGl4ZWxzLgotCi0gICAgQW4gaW52
YWxpZCBpbnN0YW5jZSB3aWxsIGJlIHJldHVybmVkIGluIHRoZSBjYXNlIGFuIGVtcHR5IHNpemUg
aXMgcGFzc2VkIHRvIHRoZQotICAgIG1ldGhvZC4KLQotICAgIFxub3RlIFRoZSBkZW5zaXR5IGlz
IGF1dG9tYXRpY2FsbHkgb2J0YWluZWQgZnJvbSB0aGUgRFBJIG9mIHRoZSBzY3JlZW4gd2hlcmUg
dGhlIHBhZ2UKLSAgICBpcyBiZWluZyBzaG93biwgYnV0IGFzIG1hbnkgWDExIHNlcnZlcnMgYXJl
IHJlcG9ydGluZyB3cm9uZyBEUEksIGl0IGlzIHBvc3NpYmxlIHRvCi0gICAgb3ZlcnJpZGUgaXQg
dXNpbmcgUVgxMUluZm86OnNldEFwcERwaVkoKS4KLSovCi0KLVFXZWJQYWdlOjpWaWV3cG9ydEF0
dHJpYnV0ZXMgUVdlYlBhZ2U6OnZpZXdwb3J0QXR0cmlidXRlc0ZvclNpemUoY29uc3QgUVNpemUm
IGF2YWlsYWJsZVNpemUpIGNvbnN0Ci17Ci0gICAgc3RhdGljIGludCBkZXNrdG9wV2lkdGggPSA5
ODA7Ci0KLSAgICBWaWV3cG9ydEF0dHJpYnV0ZXMgcmVzdWx0OwotCi0gICAgIGlmIChhdmFpbGFi
bGVTaXplLmlzRW1wdHkoKSkKLSAgICAgICAgIHJldHVybiByZXN1bHQ7IC8vIFJldHVybnMgYW4g
aW52YWxpZCBpbnN0YW5jZS4KLQotICAgIGludCBkZXZpY2VXaWR0aCA9IGdldGludGVudigiUVRX
RUJLSVRfREVWSUNFX1dJRFRIIik7Ci0gICAgaW50IGRldmljZUhlaWdodCA9IGdldGludGVudigi
UVRXRUJLSVRfREVWSUNFX0hFSUdIVCIpOwotCi0gICAgLy8gQm90aCBlbnZpcm9ubWVudCB2YXJp
YWJsZXMgbmVlZCB0byBiZSBzZXQgLSBvciB0aGV5IHdpbGwgYmUgaWdub3JlZC4KLSAgICBpZiAo
ZGV2aWNlV2lkdGggPCAwICYmIGRldmljZUhlaWdodCA8IDApIHsKLSAgICAgICAgUVNpemUgc2l6
ZSA9IHF1ZXJ5RGV2aWNlU2l6ZUZvclNjcmVlbkNvbnRhaW5pbmdXaWRnZXQodmlldygpKTsKLSAg
ICAgICAgZGV2aWNlV2lkdGggPSBzaXplLndpZHRoKCk7Ci0gICAgICAgIGRldmljZUhlaWdodCA9
IHNpemUuaGVpZ2h0KCk7Ci0gICAgfQotCi0gICAgZmxvYXQgZGV2aWNlUGl4ZWxSYXRpbyA9IHF0
X2RlZmF1bHREcGkoKSAvIFdlYkNvcmU6OlZpZXdwb3J0QXJndW1lbnRzOjpkZXByZWNhdGVkVGFy
Z2V0RFBJOwotCi0gICAgV2ViQ29yZTo6Vmlld3BvcnRBdHRyaWJ1dGVzIGNvbmYgPSBXZWJDb3Jl
Ojpjb21wdXRlVmlld3BvcnRBdHRyaWJ1dGVzKGQtPnZpZXdwb3J0QXJndW1lbnRzKCksIGRlc2t0
b3BXaWR0aCwgZGV2aWNlV2lkdGgsIGRldmljZUhlaWdodCwgZGV2aWNlUGl4ZWxSYXRpbywgYXZh
aWxhYmxlU2l6ZSk7Ci0gICAgV2ViQ29yZTo6cmVzdHJpY3RNaW5pbXVtU2NhbGVGYWN0b3JUb1Zp
ZXdwb3J0U2l6ZShjb25mLCBhdmFpbGFibGVTaXplLCBkZXZpY2VQaXhlbFJhdGlvKTsKLSAgICBX
ZWJDb3JlOjpyZXN0cmljdFNjYWxlRmFjdG9yVG9Jbml0aWFsU2NhbGVJZk5vdFVzZXJTY2FsYWJs
ZShjb25mKTsKLQotICAgIHJlc3VsdC5tX2lzVmFsaWQgPSB0cnVlOwotICAgIHJlc3VsdC5tX3Np
emUgPSBRU2l6ZUYoY29uZi5sYXlvdXRTaXplLndpZHRoKCksIGNvbmYubGF5b3V0U2l6ZS5oZWln
aHQoKSk7Ci0gICAgcmVzdWx0Lm1faW5pdGlhbFNjYWxlRmFjdG9yID0gY29uZi5pbml0aWFsU2Nh
bGU7Ci0gICAgcmVzdWx0Lm1fbWluaW11bVNjYWxlRmFjdG9yID0gY29uZi5taW5pbXVtU2NhbGU7
Ci0gICAgcmVzdWx0Lm1fbWF4aW11bVNjYWxlRmFjdG9yID0gY29uZi5tYXhpbXVtU2NhbGU7Ci0g
ICAgcmVzdWx0Lm1fZGV2aWNlUGl4ZWxSYXRpbyA9IGRldmljZVBpeGVsUmF0aW87Ci0gICAgcmVz
dWx0Lm1faXNVc2VyU2NhbGFibGUgPSBzdGF0aWNfY2FzdDxib29sPihjb25mLnVzZXJTY2FsYWJs
ZSk7Ci0KLSAgICBkLT5wYWdlLT5zZXREZXZpY2VTY2FsZUZhY3RvcihkZXZpY2VQaXhlbFJhdGlv
KTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLVFTaXplIFFXZWJQYWdlOjpwcmVmZXJyZWRD
b250ZW50c1NpemUoKSBjb25zdAotewotICAgIFFXZWJGcmFtZSogZnJhbWUgPSBkLT5tYWluRnJh
bWUuZGF0YSgpOwotICAgIGlmIChmcmFtZSkgewotICAgICAgICBXZWJDb3JlOjpGcmFtZVZpZXcq
IHZpZXcgPSBmcmFtZS0+ZC0+ZnJhbWUtPnZpZXcoKTsKLSAgICAgICAgaWYgKHZpZXcgJiYgdmll
dy0+dXNlRml4ZWRMYXlvdXQoKSkKLSAgICAgICAgICAgIHJldHVybiBkLT5tYWluRnJhbWUuZGF0
YSgpLT5kLT5mcmFtZS0+dmlldygpLT5maXhlZExheW91dFNpemUoKTsKLSAgICB9Ci0KLSAgICBy
ZXR1cm4gZC0+Zml4ZWRMYXlvdXRTaXplOwotfQotCi0vKiEKLSAgICBccHJvcGVydHkgUVdlYlBh
Z2U6OnByZWZlcnJlZENvbnRlbnRzU2l6ZQotICAgIFxzaW5jZSA0LjYKLSAgICBcYnJpZWYgYSBj
dXN0b20gc2l6ZSB1c2VkIGZvciBsYXlpbmcgb3V0IHRoZSBwYWdlIGNvbnRlbnRzLgotCi0gICAg
QnkgZGVmYXVsdCBhbGwgcGFnZXMgYXJlIGxhaWQgb3V0IHVzaW5nIHRoZSB2aWV3cG9ydCBvZiB0
aGUgcGFnZSBhcyB0aGUgYmFzZS4KLQotICAgIEFzIHBhZ2VzIG1vc3RseSBhcmUgZGVzaWduZWQg
Zm9yIGRlc2t0b3AgdXNhZ2UsIHRoZXkgb2Z0ZW4gZG8gbm90IGxheW91dCBwcm9wZXJseQotICAg
IG9uIHNtYWxsIGRldmljZXMgYXMgdGhlIGNvbnRlbnRzIHJlcXVpcmUgYSBjZXJ0YWluIHZpZXcg
d2lkdGguIEZvciB0aGlzIHJlYXNvbgotICAgIGl0IGlzIGNvbW1vbiB0byB1c2UgYSBkaWZmZXJl
bnQgbGF5b3V0IHNpemUgYW5kIHRoZW4gc2NhbGUgdGhlIGNvbnRlbnRzIHRvIGZpdAotICAgIHdp
dGhpbiB0aGUgYWN0dWFsIHZpZXcuCi0KLSAgICBJZiB0aGlzIHByb3BlcnR5IGlzIHNldCB0byBh
IHZhbGlkIHNpemUsIHRoaXMgc2l6ZSBpcyB1c2VkIGZvciBhbGwgbGF5b3V0IG5lZWRzCi0gICAg
aW5zdGVhZCBvZiB0aGUgc2l6ZSBvZiB0aGUgdmlld3BvcnQuCi0KLSAgICBTZXR0aW5nIGFuIGlu
dmFsaWQgc2l6ZSwgbWFrZXMgdGhlIHBhZ2UgZmFsbCBiYWNrIHRvIHVzaW5nIHRoZSB2aWV3cG9y
dCBzaXplIGZvciBsYXlvdXQuCi0KLSAgICBcc2Egdmlld3BvcnRTaXplCi0qLwotdm9pZCBRV2Vi
UGFnZTo6c2V0UHJlZmVycmVkQ29udGVudHNTaXplKGNvbnN0IFFTaXplJiBzaXplKSBjb25zdAot
ewotICAgIC8vIEZJWE1FOiBSZW5hbWUgdGhpcyBtZXRob2QgdG8gc2V0Q3VzdG9tTGF5b3V0U2l6
ZQotCi0gICAgZC0+Zml4ZWRMYXlvdXRTaXplID0gc2l6ZTsKLQotICAgIFFXZWJGcmFtZSogZnJh
bWUgPSBtYWluRnJhbWUoKTsKLSAgICBpZiAoIWZyYW1lLT5kLT5mcmFtZSB8fCAhZnJhbWUtPmQt
PmZyYW1lLT52aWV3KCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIFdlYkNvcmU6OkZyYW1lVmll
dyogdmlldyA9IGZyYW1lLT5kLT5mcmFtZS0+dmlldygpOwotCi0gICAgaWYgKHNpemUuaXNWYWxp
ZCgpKSB7Ci0gICAgICAgIHZpZXctPnNldFVzZUZpeGVkTGF5b3V0KHRydWUpOwotICAgICAgICB2
aWV3LT5zZXRGaXhlZExheW91dFNpemUoc2l6ZSk7Ci0gICAgfSBlbHNlIGlmICh2aWV3LT51c2VG
aXhlZExheW91dCgpKQotICAgICAgICB2aWV3LT5zZXRVc2VGaXhlZExheW91dChmYWxzZSk7Ci0K
LSAgICB2aWV3LT5sYXlvdXQoKTsKLX0KLQotLyoKLSAgICBUaGlzIGZ1bmN0aW9uIGlzIHRvIGJl
IGNhbGxlZCBhZnRlciBhbnkgKGFuaW1hdGVkKSBzY3JvbGwvcGFuIGhhcyBlbmRlZCwgaW4gdGhl
IGNhc2UgdGhlIGFwcGxpY2F0aW9uIGhhbmRsZXMgdGhlCi0gICAgc2Nyb2xsaW5nL3Bhbm5pbmcg
b2YgdGhlIHdlYiBjb250ZW50cy4gVGhpcyBpcyBjb21tb25seSB1c2VkIGluIGNvbWJpbmF0aW9u
IHdpdGggdGlsaW5nIHdoZXJlIGlzIGl0IGNvbW1vbiBmb3IKLSAgICB0aGUgYXBwbGljYXRpb24g
dG8gcGFuIHRoZSBhY3R1YWwgdmlldywgd2hpY2ggdGhlbiByZXNpemVzIGl0c2VsZiB0byB0aGUg
c2l6ZSBvZiB0aGUgY29udGVudHMuCi0KLSAgICBcbm90ZSBDYWxsaW5nIHRoaXMgZnVuY3Rpb24g
bWFrZXMgV2ViS2l0IHN0b3AgdHJ5aW5nIHRvIGNhbGN1bGF0ZSB0aGUgdmlzaWJsZUNvbnRlbnRS
ZWN0LiBUbyB0dXJuIHRoYXQgb24KLSAgICBhZ2FpbiwgY2FsbCB0aGlzIG1ldGhvZCB3aXRoIGFu
IGVtcHR5IHJlY3QuCi0KLSAgICBcc2EgUUdyYXBoaWNzV2ViVmlldzo6cmVzaXplc1RvQ29udGVu
dHMsIFFXZWJTZXR0aW5nczo6VGlsZWRCYWNraW5nU3RvcmVFbmFibGVkCi0qLwotdm9pZCBRV2Vi
UGFnZTo6c2V0QWN0dWFsVmlzaWJsZUNvbnRlbnRSZWN0KGNvbnN0IFFSZWN0JiByZWN0KSBjb25z
dAotewotICAgIFFXZWJGcmFtZSogZnJhbWUgPSBtYWluRnJhbWUoKTsKLSAgICBpZiAoIWZyYW1l
LT5kLT5mcmFtZSB8fCAhZnJhbWUtPmQtPmZyYW1lLT52aWV3KCkpCi0gICAgICAgIHJldHVybjsK
LQotICAgIFdlYkNvcmU6OkZyYW1lVmlldyogdmlldyA9IGZyYW1lLT5kLT5mcmFtZS0+dmlldygp
OwotICAgIHZpZXctPnNldEZpeGVkVmlzaWJsZUNvbnRlbnRSZWN0KHJlY3QpOwotfQotCi0vKiEK
LSAgICBcZm4gYm9vbCBRV2ViUGFnZTo6YWNjZXB0TmF2aWdhdGlvblJlcXVlc3QoUVdlYkZyYW1l
ICpmcmFtZSwgY29uc3QgUU5ldHdvcmtSZXF1ZXN0ICZyZXF1ZXN0LCBRV2ViUGFnZTo6TmF2aWdh
dGlvblR5cGUgdHlwZSkKLQotICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW5ldmVyIFdl
YktpdCByZXF1ZXN0cyB0byBuYXZpZ2F0ZSBcYSBmcmFtZSB0byB0aGUgcmVzb3VyY2Ugc3BlY2lm
aWVkIGJ5IFxhIHJlcXVlc3QgYnkgbWVhbnMgb2YKLSAgICB0aGUgc3BlY2lmaWVkIG5hdmlnYXRp
b24gdHlwZSBcYSB0eXBlLgotCi0gICAgSWYgXGEgZnJhbWUgaXMgYSBudWxsIHBvaW50ZXIgdGhl
biBuYXZpZ2F0aW9uIHRvIGEgbmV3IHdpbmRvdyBpcyByZXF1ZXN0ZWQuIElmIHRoZSByZXF1ZXN0
IGlzCi0gICAgYWNjZXB0ZWQgY3JlYXRlV2luZG93KCkgd2lsbCBiZSBjYWxsZWQuCi0KLSAgICBU
aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpbnRlcnByZXRzIHRoZSBwYWdlJ3MgbGlua0RlbGVn
YXRpb25Qb2xpY3kgYW5kIGVtaXRzIGxpbmtDbGlja2VkIGFjY29yZGluZ2x5IG9yIHJldHVybnMg
dHJ1ZQotICAgIHRvIGxldCBRV2ViUGFnZSBoYW5kbGUgdGhlIG5hdmlnYXRpb24gaXRzZWxmLgot
Ci0gICAgXHNhIGNyZWF0ZVdpbmRvdygpCi0qLwotYm9vbCBRV2ViUGFnZTo6YWNjZXB0TmF2aWdh
dGlvblJlcXVlc3QoUVdlYkZyYW1lICpmcmFtZSwgY29uc3QgUU5ldHdvcmtSZXF1ZXN0ICZyZXF1
ZXN0LCBRV2ViUGFnZTo6TmF2aWdhdGlvblR5cGUgdHlwZSkKLXsKLSAgICBRX1VOVVNFRChmcmFt
ZSkKLSAgICBpZiAodHlwZSA9PSBOYXZpZ2F0aW9uVHlwZUxpbmtDbGlja2VkKSB7Ci0gICAgICAg
IHN3aXRjaCAoZC0+bGlua1BvbGljeSkgewotICAgICAgICAgICAgY2FzZSBEb250RGVsZWdhdGVM
aW5rczoKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICAgICAgY2FzZSBE
ZWxlZ2F0ZUV4dGVybmFsTGlua3M6Ci0gICAgICAgICAgICAgICAgaWYgKFdlYkNvcmU6OlNjaGVt
ZVJlZ2lzdHJ5OjpzaG91bGRUcmVhdFVSTFNjaGVtZUFzTG9jYWwocmVxdWVzdC51cmwoKS5zY2hl
bWUoKSkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAg
IGVtaXQgbGlua0NsaWNrZWQocmVxdWVzdC51cmwoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOwotCi0gICAgICAgICAgICBjYXNlIERlbGVnYXRlQWxsTGlua3M6Ci0gICAgICAgICAg
ICAgICAgZW1pdCBsaW5rQ2xpY2tlZChyZXF1ZXN0LnVybCgpKTsKLSAgICAgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8q
IQotICAgIFxwcm9wZXJ0eSBRV2ViUGFnZTo6aGFzU2VsZWN0aW9uCi0gICAgXGJyaWVmIHdoZXRo
ZXIgdGhpcyBwYWdlIGNvbnRhaW5zIHNlbGVjdGVkIGNvbnRlbnQgb3Igbm90LgotCi0gICAgXHNh
IHNlbGVjdGlvbkNoYW5nZWQoKQotKi8KLWJvb2wgUVdlYlBhZ2U6Omhhc1NlbGVjdGlvbigpIGNv
bnN0Ci17Ci0gICAgZC0+Y3JlYXRlTWFpbkZyYW1lKCk7Ci0gICAgV2ViQ29yZTo6RnJhbWUqIGZy
YW1lID0gZC0+cGFnZS0+Zm9jdXNDb250cm9sbGVyKCktPmZvY3VzZWRPck1haW5GcmFtZSgpOwot
ICAgIGlmIChmcmFtZSkKLSAgICAgICAgcmV0dXJuIChmcmFtZS0+c2VsZWN0aW9uKCktPnNlbGVj
dGlvbigpLnNlbGVjdGlvblR5cGUoKSAhPSBWaXNpYmxlU2VsZWN0aW9uOjpOb1NlbGVjdGlvbik7
Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiEKLSAgICBccHJvcGVydHkgUVdlYlBhZ2U6OnNl
bGVjdGVkVGV4dAotICAgIFxicmllZiB0aGUgdGV4dCBjdXJyZW50bHkgc2VsZWN0ZWQKLQotICAg
IEJ5IGRlZmF1bHQsIHRoaXMgcHJvcGVydHkgY29udGFpbnMgYW4gZW1wdHkgc3RyaW5nLgotCi0g
ICAgXHNhIHNlbGVjdGlvbkNoYW5nZWQoKSwgc2VsZWN0ZWRIdG1sKCkKLSovCi1RU3RyaW5nIFFX
ZWJQYWdlOjpzZWxlY3RlZFRleHQoKSBjb25zdAotewotICAgIGQtPmNyZWF0ZU1haW5GcmFtZSgp
OwotICAgIFdlYkNvcmU6OkZyYW1lKiBmcmFtZSA9IGQtPnBhZ2UtPmZvY3VzQ29udHJvbGxlcigp
LT5mb2N1c2VkT3JNYWluRnJhbWUoKTsKLSAgICBpZiAoZnJhbWUtPnNlbGVjdGlvbigpLT5zZWxl
Y3Rpb24oKS5zZWxlY3Rpb25UeXBlKCkgPT0gVmlzaWJsZVNlbGVjdGlvbjo6Tm9TZWxlY3Rpb24p
Ci0gICAgICAgIHJldHVybiBRU3RyaW5nKCk7Ci0gICAgcmV0dXJuIGZyYW1lLT5lZGl0b3IoKS0+
c2VsZWN0ZWRUZXh0KCk7Ci19Ci0KLS8qIQotICAgIFxzaW5jZSA0LjgKLSAgICBccHJvcGVydHkg
UVdlYlBhZ2U6OnNlbGVjdGVkSHRtbAotICAgIFxicmllZiB0aGUgSFRNTCBjdXJyZW50bHkgc2Vs
ZWN0ZWQKLQotICAgIEJ5IGRlZmF1bHQsIHRoaXMgcHJvcGVydHkgY29udGFpbnMgYW4gZW1wdHkg
c3RyaW5nLgotCi0gICAgXHNhIHNlbGVjdGlvbkNoYW5nZWQoKSwgc2VsZWN0ZWRUZXh0KCkKLSov
Ci1RU3RyaW5nIFFXZWJQYWdlOjpzZWxlY3RlZEh0bWwoKSBjb25zdAotewotICAgIGQtPmNyZWF0
ZU1haW5GcmFtZSgpOwotICAgIHJldHVybiBkLT5wYWdlLT5mb2N1c0NvbnRyb2xsZXIoKS0+Zm9j
dXNlZE9yTWFpbkZyYW1lKCktPmVkaXRvcigpLT5zZWxlY3RlZFJhbmdlKCktPnRvSFRNTCgpOwot
fQotCi0jaWZuZGVmIFFUX05PX0FDVElPTgotLyohCi0gICBSZXR1cm5zIGEgUUFjdGlvbiBmb3Ig
dGhlIHNwZWNpZmllZCBXZWJBY3Rpb24gXGEgYWN0aW9uLgotCi0gICBUaGUgYWN0aW9uIGlzIG93
bmVkIGJ5IHRoZSBRV2ViUGFnZSBidXQgeW91IGNhbiBjdXN0b21pemUgdGhlIGxvb2sgYnkKLSAg
IGNoYW5naW5nIGl0cyBwcm9wZXJ0aWVzLgotCi0gICBRV2ViUGFnZSBhbHNvIHRha2VzIGNhcmUg
b2YgaW1wbGVtZW50aW5nIHRoZSBhY3Rpb24sIHNvIHRoYXQgdXBvbgotICAgdHJpZ2dlcmluZyB0
aGUgY29ycmVzcG9uZGluZyBhY3Rpb24gaXMgcGVyZm9ybWVkIG9uIHRoZSBwYWdlLgotCi0gICBc
c2EgdHJpZ2dlckFjdGlvbigpCi0qLwotUUFjdGlvbiAqUVdlYlBhZ2U6OmFjdGlvbihXZWJBY3Rp
b24gYWN0aW9uKSBjb25zdAotewotICAgIGlmIChhY3Rpb24gPT0gUVdlYlBhZ2U6Ok5vV2ViQWN0
aW9uKSByZXR1cm4gMDsKLSAgICBpZiAoZC0+YWN0aW9uc1thY3Rpb25dKQotICAgICAgICByZXR1
cm4gZC0+YWN0aW9uc1thY3Rpb25dOwotCi0gICAgUVN0cmluZyB0ZXh0OwotICAgIFFJY29uIGlj
b247Ci0gICAgUVN0eWxlICpzdHlsZSA9IGQtPmNsaWVudCA/IGQtPmNsaWVudC0+c3R5bGUoKSA6
IHFBcHAtPnN0eWxlKCk7Ci0gICAgYm9vbCBjaGVja2FibGUgPSBmYWxzZTsKLQotICAgIHN3aXRj
aCAoYWN0aW9uKSB7Ci0gICAgICAgIGNhc2UgT3Blbkxpbms6Ci0gICAgICAgICAgICB0ZXh0ID0g
Y29udGV4dE1lbnVJdGVtVGFnT3BlbkxpbmsoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICBjYXNlIE9wZW5MaW5rSW5OZXdXaW5kb3c6Ci0gICAgICAgICAgICB0ZXh0ID0gY29udGV4dE1l
bnVJdGVtVGFnT3BlbkxpbmtJbk5ld1dpbmRvdygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgIGNhc2UgT3BlbkZyYW1lSW5OZXdXaW5kb3c6Ci0gICAgICAgICAgICB0ZXh0ID0gY29udGV4
dE1lbnVJdGVtVGFnT3BlbkZyYW1lSW5OZXdXaW5kb3coKTsKLSAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICBjYXNlIE9wZW5MaW5rSW5UaGlzV2luZG93OgotICAgICAgICAgICAgdGV4dCA9IGNv
bnRleHRNZW51SXRlbVRhZ09wZW5MaW5rSW5UaGlzV2luZG93KCk7Ci0gICAgICAgICAgICBicmVh
azsKLQotICAgICAgICBjYXNlIERvd25sb2FkTGlua1RvRGlzazoKLSAgICAgICAgICAgIHRleHQg
PSBjb250ZXh0TWVudUl0ZW1UYWdEb3dubG9hZExpbmtUb0Rpc2soKTsKLSAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICBjYXNlIENvcHlMaW5rVG9DbGlwYm9hcmQ6Ci0gICAgICAgICAgICB0ZXh0
ID0gY29udGV4dE1lbnVJdGVtVGFnQ29weUxpbmtUb0NsaXBib2FyZCgpOwotICAgICAgICAgICAg
YnJlYWs7Ci0KLSAgICAgICAgY2FzZSBPcGVuSW1hZ2VJbk5ld1dpbmRvdzoKLSAgICAgICAgICAg
IHRleHQgPSBjb250ZXh0TWVudUl0ZW1UYWdPcGVuSW1hZ2VJbk5ld1dpbmRvdygpOwotICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRG93bmxvYWRJbWFnZVRvRGlzazoKLSAgICAgICAg
ICAgIHRleHQgPSBjb250ZXh0TWVudUl0ZW1UYWdEb3dubG9hZEltYWdlVG9EaXNrKCk7Ci0gICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDb3B5SW1hZ2VUb0NsaXBib2FyZDoKLSAgICAg
ICAgICAgIHRleHQgPSBjb250ZXh0TWVudUl0ZW1UYWdDb3B5SW1hZ2VUb0NsaXBib2FyZCgpOwot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ29weUltYWdlVXJsVG9DbGlwYm9hcmQ6
Ci0gICAgICAgICAgICB0ZXh0ID0gY29udGV4dE1lbnVJdGVtVGFnQ29weUltYWdlVXJsVG9DbGlw
Ym9hcmQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQmFjazoKLSAgICAg
ICAgICAgIHRleHQgPSBjb250ZXh0TWVudUl0ZW1UYWdHb0JhY2soKTsKLSAgICAgICAgICAgIGlj
b24gPSBzdHlsZS0+c3RhbmRhcmRJY29uKFFTdHlsZTo6U1BfQXJyb3dCYWNrKTsKLSAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZvcndhcmQ6Ci0gICAgICAgICAgICB0ZXh0ID0gY29u
dGV4dE1lbnVJdGVtVGFnR29Gb3J3YXJkKCk7Ci0gICAgICAgICAgICBpY29uID0gc3R5bGUtPnN0
YW5kYXJkSWNvbihRU3R5bGU6OlNQX0Fycm93Rm9yd2FyZCk7Ci0gICAgICAgICAgICBicmVhazsK
LSAgICAgICAgY2FzZSBTdG9wOgotICAgICAgICAgICAgdGV4dCA9IGNvbnRleHRNZW51SXRlbVRh
Z1N0b3AoKTsKLSAgICAgICAgICAgIGljb24gPSBzdHlsZS0+c3RhbmRhcmRJY29uKFFTdHlsZTo6
U1BfQnJvd3NlclN0b3ApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUmVsb2Fk
OgotICAgICAgICAgICAgdGV4dCA9IGNvbnRleHRNZW51SXRlbVRhZ1JlbG9hZCgpOwotICAgICAg
ICAgICAgaWNvbiA9IHN0eWxlLT5zdGFuZGFyZEljb24oUVN0eWxlOjpTUF9Ccm93c2VyUmVsb2Fk
KTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQ3V0OgotICAgICAgICAgICAg
dGV4dCA9IGNvbnRleHRNZW51SXRlbVRhZ0N1dCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgIGNhc2UgQ29weToKLSAgICAgICAgICAgIHRleHQgPSBjb250ZXh0TWVudUl0ZW1UYWdDb3B5
KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBQYXN0ZToKLSAgICAgICAgICAg
IHRleHQgPSBjb250ZXh0TWVudUl0ZW1UYWdQYXN0ZSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgIGNhc2UgU2VsZWN0QWxsOgotICAgICAgICAgICAgdGV4dCA9IGNvbnRleHRNZW51SXRl
bVRhZ1NlbGVjdEFsbCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0jaWZuZGVmIFFUX05PX1VORE9T
VEFDSwotICAgICAgICBjYXNlIFVuZG86IHsKLSAgICAgICAgICAgIFFBY3Rpb24gKmEgPSB1bmRv
U3RhY2soKS0+Y3JlYXRlVW5kb0FjdGlvbihkLT5xKTsKLSAgICAgICAgICAgIGQtPmFjdGlvbnNb
YWN0aW9uXSA9IGE7Ci0gICAgICAgICAgICByZXR1cm4gYTsKLSAgICAgICAgfQotICAgICAgICBj
YXNlIFJlZG86IHsKLSAgICAgICAgICAgIFFBY3Rpb24gKmEgPSB1bmRvU3RhY2soKS0+Y3JlYXRl
UmVkb0FjdGlvbihkLT5xKTsKLSAgICAgICAgICAgIGQtPmFjdGlvbnNbYWN0aW9uXSA9IGE7Ci0g
ICAgICAgICAgICByZXR1cm4gYTsKLSAgICAgICAgfQotI2VuZGlmIC8vIFFUX05PX1VORE9TVEFD
SwotICAgICAgICBjYXNlIE1vdmVUb05leHRDaGFyOgotICAgICAgICAgICAgdGV4dCA9IHRyKCJN
b3ZlIHRoZSBjdXJzb3IgdG8gdGhlIG5leHQgY2hhcmFjdGVyIik7Ci0gICAgICAgICAgICBicmVh
azsKLSAgICAgICAgY2FzZSBNb3ZlVG9QcmV2aW91c0NoYXI6Ci0gICAgICAgICAgICB0ZXh0ID0g
dHIoIk1vdmUgdGhlIGN1cnNvciB0byB0aGUgcHJldmlvdXMgY2hhcmFjdGVyIik7Ci0gICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNb3ZlVG9OZXh0V29yZDoKLSAgICAgICAgICAgIHRl
eHQgPSB0cigiTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBuZXh0IHdvcmQiKTsKLSAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICBjYXNlIE1vdmVUb1ByZXZpb3VzV29yZDoKLSAgICAgICAgICAgIHRl
eHQgPSB0cigiTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBwcmV2aW91cyB3b3JkIik7Ci0gICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNb3ZlVG9OZXh0TGluZToKLSAgICAgICAgICAgIHRl
eHQgPSB0cigiTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBuZXh0IGxpbmUiKTsKLSAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICBjYXNlIE1vdmVUb1ByZXZpb3VzTGluZToKLSAgICAgICAgICAgIHRl
eHQgPSB0cigiTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBwcmV2aW91cyBsaW5lIik7Ci0gICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNb3ZlVG9TdGFydE9mTGluZToKLSAgICAgICAgICAg
IHRleHQgPSB0cigiTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZSIpOwot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTW92ZVRvRW5kT2ZMaW5lOgotICAgICAg
ICAgICAgdGV4dCA9IHRyKCJNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIGVuZCBvZiB0aGUgbGluZSIp
OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTW92ZVRvU3RhcnRPZkJsb2NrOgot
ICAgICAgICAgICAgdGV4dCA9IHRyKCJNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIHN0YXJ0IG9mIHRo
ZSBibG9jayIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTW92ZVRvRW5kT2ZC
bG9jazoKLSAgICAgICAgICAgIHRleHQgPSB0cigiTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBlbmQg
b2YgdGhlIGJsb2NrIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNb3ZlVG9T
dGFydE9mRG9jdW1lbnQ6Ci0gICAgICAgICAgICB0ZXh0ID0gdHIoIk1vdmUgdGhlIGN1cnNvciB0
byB0aGUgc3RhcnQgb2YgdGhlIGRvY3VtZW50Iik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAg
ICAgY2FzZSBNb3ZlVG9FbmRPZkRvY3VtZW50OgotICAgICAgICAgICAgdGV4dCA9IHRyKCJNb3Zl
IHRoZSBjdXJzb3IgdG8gdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQiKTsKLSAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICBjYXNlIFNlbGVjdE5leHRDaGFyOgotICAgICAgICAgICAgdGV4dCA9IHRy
KCJTZWxlY3QgdG8gdGhlIG5leHQgY2hhcmFjdGVyIik7Ci0gICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgY2FzZSBTZWxlY3RQcmV2aW91c0NoYXI6Ci0gICAgICAgICAgICB0ZXh0ID0gdHIoIlNl
bGVjdCB0byB0aGUgcHJldmlvdXMgY2hhcmFjdGVyIik7Ci0gICAgICAgICAgICBicmVhazsKLSAg
ICAgICAgY2FzZSBTZWxlY3ROZXh0V29yZDoKLSAgICAgICAgICAgIHRleHQgPSB0cigiU2VsZWN0
IHRvIHRoZSBuZXh0IHdvcmQiKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNl
bGVjdFByZXZpb3VzV29yZDoKLSAgICAgICAgICAgIHRleHQgPSB0cigiU2VsZWN0IHRvIHRoZSBw
cmV2aW91cyB3b3JkIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTZWxlY3RO
ZXh0TGluZToKLSAgICAgICAgICAgIHRleHQgPSB0cigiU2VsZWN0IHRvIHRoZSBuZXh0IGxpbmUi
KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNlbGVjdFByZXZpb3VzTGluZToK
LSAgICAgICAgICAgIHRleHQgPSB0cigiU2VsZWN0IHRvIHRoZSBwcmV2aW91cyBsaW5lIik7Ci0g
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTZWxlY3RTdGFydE9mTGluZToKLSAgICAg
ICAgICAgIHRleHQgPSB0cigiU2VsZWN0IHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZSIpOwotICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU2VsZWN0RW5kT2ZMaW5lOgotICAgICAgICAg
ICAgdGV4dCA9IHRyKCJTZWxlY3QgdG8gdGhlIGVuZCBvZiB0aGUgbGluZSIpOwotICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU2VsZWN0U3RhcnRPZkJsb2NrOgotICAgICAgICAgICAg
dGV4dCA9IHRyKCJTZWxlY3QgdG8gdGhlIHN0YXJ0IG9mIHRoZSBibG9jayIpOwotICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU2VsZWN0RW5kT2ZCbG9jazoKLSAgICAgICAgICAgIHRl
eHQgPSB0cigiU2VsZWN0IHRvIHRoZSBlbmQgb2YgdGhlIGJsb2NrIik7Ci0gICAgICAgICAgICBi
cmVhazsKLSAgICAgICAgY2FzZSBTZWxlY3RTdGFydE9mRG9jdW1lbnQ6Ci0gICAgICAgICAgICB0
ZXh0ID0gdHIoIlNlbGVjdCB0byB0aGUgc3RhcnQgb2YgdGhlIGRvY3VtZW50Iik7Ci0gICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTZWxlY3RFbmRPZkRvY3VtZW50OgotICAgICAgICAg
ICAgdGV4dCA9IHRyKCJTZWxlY3QgdG8gdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQiKTsKLSAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERlbGV0ZVN0YXJ0T2ZXb3JkOgotICAgICAgICAg
ICAgdGV4dCA9IHRyKCJEZWxldGUgdG8gdGhlIHN0YXJ0IG9mIHRoZSB3b3JkIik7Ci0gICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgY2FzZSBEZWxldGVFbmRPZldvcmQ6Ci0gICAgICAgICAgICB0
ZXh0ID0gdHIoIkRlbGV0ZSB0byB0aGUgZW5kIG9mIHRoZSB3b3JkIik7Ci0gICAgICAgICAgICBi
cmVhazsKLQotICAgICAgICBjYXNlIFNldFRleHREaXJlY3Rpb25EZWZhdWx0OgotICAgICAgICAg
ICAgdGV4dCA9IGNvbnRleHRNZW51SXRlbVRhZ0RlZmF1bHREaXJlY3Rpb24oKTsKLSAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNldFRleHREaXJlY3Rpb25MZWZ0VG9SaWdodDoKLSAg
ICAgICAgICAgIHRleHQgPSBjb250ZXh0TWVudUl0ZW1UYWdMZWZ0VG9SaWdodCgpOwotICAgICAg
ICAgICAgY2hlY2thYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNl
IFNldFRleHREaXJlY3Rpb25SaWdodFRvTGVmdDoKLSAgICAgICAgICAgIHRleHQgPSBjb250ZXh0
TWVudUl0ZW1UYWdSaWdodFRvTGVmdCgpOwotICAgICAgICAgICAgY2hlY2thYmxlID0gdHJ1ZTsK
LSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgVG9nZ2xlQm9sZDoKLSAgICAgICAg
ICAgIHRleHQgPSBjb250ZXh0TWVudUl0ZW1UYWdCb2xkKCk7Ci0gICAgICAgICAgICBjaGVja2Fi
bGUgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVG9nZ2xlSXRhbGlj
OgotICAgICAgICAgICAgdGV4dCA9IGNvbnRleHRNZW51SXRlbVRhZ0l0YWxpYygpOwotICAgICAg
ICAgICAgY2hlY2thYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNl
IFRvZ2dsZVVuZGVybGluZToKLSAgICAgICAgICAgIHRleHQgPSBjb250ZXh0TWVudUl0ZW1UYWdV
bmRlcmxpbmUoKTsKLSAgICAgICAgICAgIGNoZWNrYWJsZSA9IHRydWU7Ci0gICAgICAgICAgICBi
cmVhazsKLQotICAgICAgICBjYXNlIEluc3BlY3RFbGVtZW50OgotICAgICAgICAgICAgdGV4dCA9
IGNvbnRleHRNZW51SXRlbVRhZ0luc3BlY3RFbGVtZW50KCk7Ci0gICAgICAgICAgICBicmVhazsK
LQotICAgICAgICBjYXNlIEluc2VydFBhcmFncmFwaFNlcGFyYXRvcjoKLSAgICAgICAgICAgIHRl
eHQgPSB0cigiSW5zZXJ0IGEgbmV3IHBhcmFncmFwaCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgIGNhc2UgSW5zZXJ0TGluZVNlcGFyYXRvcjoKLSAgICAgICAgICAgIHRleHQgPSB0cigi
SW5zZXJ0IGEgbmV3IGxpbmUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2Ug
UGFzdGVBbmRNYXRjaFN0eWxlOgotICAgICAgICAgICAgdGV4dCA9IHRyKCJQYXN0ZSBhbmQgTWF0
Y2ggU3R5bGUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJlbW92ZUZvcm1h
dDoKLSAgICAgICAgICAgIHRleHQgPSB0cigiUmVtb3ZlIGZvcm1hdHRpbmciKTsKLSAgICAgICAg
ICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgVG9nZ2xlU3RyaWtldGhyb3VnaDoKLSAgICAgICAg
ICAgIHRleHQgPSB0cigiU3RyaWtldGhyb3VnaCIpOwotICAgICAgICAgICAgY2hlY2thYmxlID0g
dHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRvZ2dsZVN1YnNjcmlwdDoK
LSAgICAgICAgICAgIHRleHQgPSB0cigiU3Vic2NyaXB0Iik7Ci0gICAgICAgICAgICBjaGVja2Fi
bGUgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVG9nZ2xlU3VwZXJz
Y3JpcHQ6Ci0gICAgICAgICAgICB0ZXh0ID0gdHIoIlN1cGVyc2NyaXB0Iik7Ci0gICAgICAgICAg
ICBjaGVja2FibGUgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSW5z
ZXJ0VW5vcmRlcmVkTGlzdDoKLSAgICAgICAgICAgIHRleHQgPSB0cigiSW5zZXJ0IEJ1bGxldGVk
IExpc3QiKTsKLSAgICAgICAgICAgIGNoZWNrYWJsZSA9IHRydWU7Ci0gICAgICAgICAgICBicmVh
azsKLSAgICAgICAgY2FzZSBJbnNlcnRPcmRlcmVkTGlzdDoKLSAgICAgICAgICAgIHRleHQgPSB0
cigiSW5zZXJ0IE51bWJlcmVkIExpc3QiKTsKLSAgICAgICAgICAgIGNoZWNrYWJsZSA9IHRydWU7
Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBJbmRlbnQ6Ci0gICAgICAgICAgICB0
ZXh0ID0gdHIoIkluZGVudCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT3V0
ZGVudDoKLSAgICAgICAgICAgIHRleHQgPSB0cigiT3V0ZGVudCIpOwotICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgIGNhc2UgQWxpZ25DZW50ZXI6Ci0gICAgICAgICAgICB0ZXh0ID0gdHIoIkNl
bnRlciIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQWxpZ25KdXN0aWZpZWQ6
Ci0gICAgICAgICAgICB0ZXh0ID0gdHIoIkp1c3RpZnkiKTsKLSAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICBjYXNlIEFsaWduTGVmdDoKLSAgICAgICAgICAgIHRleHQgPSB0cigiQWxpZ24gTGVm
dCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQWxpZ25SaWdodDoKLSAgICAg
ICAgICAgIHRleHQgPSB0cigiQWxpZ24gUmlnaHQiKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICBjYXNlIE5vV2ViQWN0aW9uOgotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGRl
ZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAodGV4dC5pc0VtcHR5
KCkpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgUUFjdGlvbiAqYSA9IG5ldyBRQWN0aW9uKGQt
PnEpOwotICAgIGEtPnNldFRleHQodGV4dCk7Ci0gICAgYS0+c2V0RGF0YShhY3Rpb24pOwotICAg
IGEtPnNldENoZWNrYWJsZShjaGVja2FibGUpOwotICAgIGEtPnNldEljb24oaWNvbik7Ci0KLSAg
ICBjb25uZWN0KGEsIFNJR05BTCh0cmlnZ2VyZWQoYm9vbCkpLAotICAgICAgICAgICAgdGhpcywg
U0xPVChfcV93ZWJBY3Rpb25UcmlnZ2VyZWQoYm9vbCkpKTsKLQotICAgIGQtPmFjdGlvbnNbYWN0
aW9uXSA9IGE7Ci0gICAgZC0+dXBkYXRlQWN0aW9uKGFjdGlvbik7Ci0gICAgcmV0dXJuIGE7Ci19
Ci0jZW5kaWYgLy8gUVRfTk9fQUNUSU9OCi0KLS8qIQotICAgIFxwcm9wZXJ0eSBRV2ViUGFnZTo6
bW9kaWZpZWQKLSAgICBcYnJpZWYgd2hldGhlciB0aGUgcGFnZSBjb250YWlucyB1bnN1Ym1pdHRl
ZCBmb3JtIGRhdGEsIG9yIHRoZSBjb250ZW50cyBoYXZlIGJlZW4gY2hhbmdlZC4KLQotICAgIEJ5
IGRlZmF1bHQsIHRoaXMgcHJvcGVydHkgaXMgZmFsc2UuCi0KLSAgICBcc2EgY29udGVudHNDaGFu
Z2VkKCksIGNvbnRlbnRFZGl0YWJsZSwgdW5kb1N0YWNrKCkKLSovCi1ib29sIFFXZWJQYWdlOjpp
c01vZGlmaWVkKCkgY29uc3QKLXsKLSNpZmRlZiBRVF9OT19VTkRPU1RBQ0sKLSAgICByZXR1cm4g
ZmFsc2U7Ci0jZWxzZQotICAgIGlmICghZC0+dW5kb1N0YWNrKQotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0gICAgcmV0dXJuIGQtPnVuZG9TdGFjay0+Y2FuVW5kbygpOwotI2VuZGlmIC8vIFFUX05P
X1VORE9TVEFDSwotfQotCi0jaWZuZGVmIFFUX05PX1VORE9TVEFDSwotLyohCi0gICAgUmV0dXJu
cyBhIHBvaW50ZXIgdG8gdGhlIHVuZG8gc3RhY2sgdXNlZCBmb3IgZWRpdGFibGUgY29udGVudC4K
LQotICAgIFxzYSBtb2RpZmllZAotKi8KLVFVbmRvU3RhY2sgKlFXZWJQYWdlOjp1bmRvU3RhY2so
KSBjb25zdAotewotICAgIGlmICghZC0+dW5kb1N0YWNrKQotICAgICAgICBkLT51bmRvU3RhY2sg
PSBuZXcgUVVuZG9TdGFjayhjb25zdF9jYXN0PFFXZWJQYWdlICo+KHRoaXMpKTsKLQotICAgIHJl
dHVybiBkLT51bmRvU3RhY2s7Ci19Ci0jZW5kaWYgLy8gUVRfTk9fVU5ET1NUQUNLCi0KLS8qISBc
cmVpbXAKLSovCi1ib29sIFFXZWJQYWdlOjpldmVudChRRXZlbnQgKmV2KQotewotICAgIHN3aXRj
aCAoZXYtPnR5cGUoKSkgewotICAgIGNhc2UgUUV2ZW50OjpUaW1lcjoKLSAgICAgICAgZC0+dGlt
ZXJFdmVudChzdGF0aWNfY2FzdDxRVGltZXJFdmVudCo+KGV2KSk7Ci0gICAgICAgIGJyZWFrOwot
ICAgIGNhc2UgUUV2ZW50OjpNb3VzZU1vdmU6Ci0gICAgICAgIGQtPm1vdXNlTW92ZUV2ZW50KHN0
YXRpY19jYXN0PFFNb3VzZUV2ZW50Kj4oZXYpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBR
RXZlbnQ6Ok1vdXNlQnV0dG9uUHJlc3M6Ci0gICAgICAgIGQtPm1vdXNlUHJlc3NFdmVudChzdGF0
aWNfY2FzdDxRTW91c2VFdmVudCo+KGV2KSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUUV2
ZW50OjpNb3VzZUJ1dHRvbkRibENsaWNrOgotICAgICAgICBkLT5tb3VzZURvdWJsZUNsaWNrRXZl
bnQoc3RhdGljX2Nhc3Q8UU1vdXNlRXZlbnQqPihldikpOwotICAgICAgICBicmVhazsKLSAgICBj
YXNlIFFFdmVudDo6TW91c2VCdXR0b25SZWxlYXNlOgotICAgICAgICBkLT5tb3VzZVJlbGVhc2VF
dmVudChzdGF0aWNfY2FzdDxRTW91c2VFdmVudCo+KGV2KSk7Ci0gICAgICAgIGJyZWFrOwotI2lm
ICFkZWZpbmVkKFFUX05PX0dSQVBISUNTVklFVykKLSAgICBjYXNlIFFFdmVudDo6R3JhcGhpY3NT
Y2VuZU1vdXNlTW92ZTogewotICAgICAgICBRR3JhcGhpY3NTY2VuZU1vdXNlRXZlbnQgKmdzRXYg
PSBzdGF0aWNfY2FzdDxRR3JhcGhpY3NTY2VuZU1vdXNlRXZlbnQqPihldik7Ci0gICAgICAgIFFN
b3VzZUV2ZW50IGR1bW15RXZlbnQoUUV2ZW50OjpNb3VzZU1vdmUsIGdzRXYtPnBvcygpLCBnc0V2
LT5zY3JlZW5Qb3MoKSwgZ3NFdi0+YnV0dG9uKCksIGdzRXYtPmJ1dHRvbnMoKSwgZ3NFdi0+bW9k
aWZpZXJzKCkpOwotICAgICAgICBkLT5tb3VzZU1vdmVFdmVudCgmZHVtbXlFdmVudCk7Ci0gICAg
ICAgIGV2LT5zZXRBY2NlcHRlZChkdW1teUV2ZW50LmlzQWNjZXB0ZWQoKSk7Ci0gICAgICAgIGJy
ZWFrOwotICAgIH0KLSAgICBjYXNlIFFFdmVudDo6R3JhcGhpY3NTY2VuZU1vdXNlUmVsZWFzZTog
ewotICAgICAgICBRR3JhcGhpY3NTY2VuZU1vdXNlRXZlbnQgKmdzRXYgPSBzdGF0aWNfY2FzdDxR
R3JhcGhpY3NTY2VuZU1vdXNlRXZlbnQqPihldik7Ci0gICAgICAgIFFNb3VzZUV2ZW50IGR1bW15
RXZlbnQoUUV2ZW50OjpNb3VzZUJ1dHRvblJlbGVhc2UsIGdzRXYtPnBvcygpLCBnc0V2LT5zY3Jl
ZW5Qb3MoKSwgZ3NFdi0+YnV0dG9uKCksIGdzRXYtPmJ1dHRvbnMoKSwgZ3NFdi0+bW9kaWZpZXJz
KCkpOwotICAgICAgICBkLT5tb3VzZVJlbGVhc2VFdmVudCgmZHVtbXlFdmVudCk7Ci0gICAgICAg
IGV2LT5zZXRBY2NlcHRlZChkdW1teUV2ZW50LmlzQWNjZXB0ZWQoKSk7Ci0gICAgICAgIGJyZWFr
OwotICAgIH0KLSAgICBjYXNlIFFFdmVudDo6R3JhcGhpY3NTY2VuZU1vdXNlUHJlc3M6IHsKLSAg
ICAgICAgUUdyYXBoaWNzU2NlbmVNb3VzZUV2ZW50ICpnc0V2ID0gc3RhdGljX2Nhc3Q8UUdyYXBo
aWNzU2NlbmVNb3VzZUV2ZW50Kj4oZXYpOwotICAgICAgICBRTW91c2VFdmVudCBkdW1teUV2ZW50
KFFFdmVudDo6TW91c2VCdXR0b25QcmVzcywgZ3NFdi0+cG9zKCksIGdzRXYtPnNjcmVlblBvcygp
LCBnc0V2LT5idXR0b24oKSwgZ3NFdi0+YnV0dG9ucygpLCBnc0V2LT5tb2RpZmllcnMoKSk7Ci0g
ICAgICAgIGQtPm1vdXNlUHJlc3NFdmVudCgmZHVtbXlFdmVudCk7Ci0gICAgICAgIGV2LT5zZXRB
Y2NlcHRlZChkdW1teUV2ZW50LmlzQWNjZXB0ZWQoKSk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0K
LSAgICBjYXNlIFFFdmVudDo6R3JhcGhpY3NTY2VuZU1vdXNlRG91YmxlQ2xpY2s6IHsKLSAgICAg
ICAgUUdyYXBoaWNzU2NlbmVNb3VzZUV2ZW50ICpnc0V2ID0gc3RhdGljX2Nhc3Q8UUdyYXBoaWNz
U2NlbmVNb3VzZUV2ZW50Kj4oZXYpOwotICAgICAgICBRTW91c2VFdmVudCBkdW1teUV2ZW50KFFF
dmVudDo6TW91c2VCdXR0b25EYmxDbGljaywgZ3NFdi0+cG9zKCksIGdzRXYtPnNjcmVlblBvcygp
LCBnc0V2LT5idXR0b24oKSwgZ3NFdi0+YnV0dG9ucygpLCBnc0V2LT5tb2RpZmllcnMoKSk7Ci0g
ICAgICAgIGQtPm1vdXNlRG91YmxlQ2xpY2tFdmVudCgmZHVtbXlFdmVudCk7Ci0gICAgICAgIGV2
LT5zZXRBY2NlcHRlZChkdW1teUV2ZW50LmlzQWNjZXB0ZWQoKSk7Ci0gICAgICAgIGJyZWFrOwot
ICAgIH0KLSNlbmRpZgotI2lmbmRlZiBRVF9OT19DT05URVhUTUVOVQotICAgIGNhc2UgUUV2ZW50
OjpDb250ZXh0TWVudToKLSAgICAgICAgZC0+Y29udGV4dE1lbnVFdmVudChzdGF0aWNfY2FzdDxR
Q29udGV4dE1lbnVFdmVudCo+KGV2KS0+Z2xvYmFsUG9zKCkpOwotICAgICAgICBicmVhazsKLSNp
ZiAhZGVmaW5lZChRVF9OT19HUkFQSElDU1ZJRVcpCi0gICAgY2FzZSBRRXZlbnQ6OkdyYXBoaWNz
U2NlbmVDb250ZXh0TWVudToKLSAgICAgICAgZC0+Y29udGV4dE1lbnVFdmVudChzdGF0aWNfY2Fz
dDxRR3JhcGhpY3NTY2VuZUNvbnRleHRNZW51RXZlbnQqPihldiktPnNjcmVlblBvcygpKTsKLSAg
ICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNlbmRpZgotI2lmbmRlZiBRVF9OT19XSEVFTEVWRU5UCi0g
ICAgY2FzZSBRRXZlbnQ6OldoZWVsOgotICAgICAgICBkLT53aGVlbEV2ZW50KHN0YXRpY19jYXN0
PFFXaGVlbEV2ZW50Kj4oZXYpKTsKLSAgICAgICAgYnJlYWs7Ci0jaWYgIWRlZmluZWQoUVRfTk9f
R1JBUEhJQ1NWSUVXKQotICAgIGNhc2UgUUV2ZW50OjpHcmFwaGljc1NjZW5lV2hlZWw6IHsKLSAg
ICAgICAgUUdyYXBoaWNzU2NlbmVXaGVlbEV2ZW50ICpnc0V2ID0gc3RhdGljX2Nhc3Q8UUdyYXBo
aWNzU2NlbmVXaGVlbEV2ZW50Kj4oZXYpOwotICAgICAgICBRV2hlZWxFdmVudCBkdW1teUV2ZW50
KGdzRXYtPnBvcygpLCBnc0V2LT5zY3JlZW5Qb3MoKSwgZ3NFdi0+ZGVsdGEoKSwgZ3NFdi0+YnV0
dG9ucygpLCBnc0V2LT5tb2RpZmllcnMoKSwgZ3NFdi0+b3JpZW50YXRpb24oKSk7Ci0gICAgICAg
IGQtPndoZWVsRXZlbnQoJmR1bW15RXZlbnQpOwotICAgICAgICBldi0+c2V0QWNjZXB0ZWQoZHVt
bXlFdmVudC5pc0FjY2VwdGVkKCkpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0jZW5kaWYKLSNl
bmRpZgotICAgIGNhc2UgUUV2ZW50OjpLZXlQcmVzczoKLSAgICAgICAgZC0+a2V5UHJlc3NFdmVu
dChzdGF0aWNfY2FzdDxRS2V5RXZlbnQqPihldikpOwotICAgICAgICBicmVhazsKLSAgICBjYXNl
IFFFdmVudDo6S2V5UmVsZWFzZToKLSAgICAgICAgZC0+a2V5UmVsZWFzZUV2ZW50KHN0YXRpY19j
YXN0PFFLZXlFdmVudCo+KGV2KSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUUV2ZW50OjpG
b2N1c0luOgotICAgICAgICBkLT5mb2N1c0luRXZlbnQoc3RhdGljX2Nhc3Q8UUZvY3VzRXZlbnQq
PihldikpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFFFdmVudDo6Rm9jdXNPdXQ6Ci0gICAg
ICAgIGQtPmZvY3VzT3V0RXZlbnQoc3RhdGljX2Nhc3Q8UUZvY3VzRXZlbnQqPihldikpOwotICAg
ICAgICBicmVhazsKLSNpZm5kZWYgUVRfTk9fRFJBR0FORERST1AKLSAgICBjYXNlIFFFdmVudDo6
RHJhZ0VudGVyOgotICAgICAgICBkLT5kcmFnRW50ZXJFdmVudChzdGF0aWNfY2FzdDxRRHJhZ0Vu
dGVyRXZlbnQqPihldikpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFFFdmVudDo6RHJhZ0xl
YXZlOgotICAgICAgICBkLT5kcmFnTGVhdmVFdmVudChzdGF0aWNfY2FzdDxRRHJhZ0xlYXZlRXZl
bnQqPihldikpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFFFdmVudDo6RHJhZ01vdmU6Ci0g
ICAgICAgIGQtPmRyYWdNb3ZlRXZlbnQoc3RhdGljX2Nhc3Q8UURyYWdNb3ZlRXZlbnQqPihldikp
OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFFFdmVudDo6RHJvcDoKLSAgICAgICAgZC0+ZHJv
cEV2ZW50KHN0YXRpY19jYXN0PFFEcm9wRXZlbnQqPihldikpOwotICAgICAgICBicmVhazsKLSNp
ZiAhZGVmaW5lZChRVF9OT19HUkFQSElDU1ZJRVcpCi0gICAgY2FzZSBRRXZlbnQ6OkdyYXBoaWNz
U2NlbmVEcmFnRW50ZXI6Ci0gICAgICAgIGQtPmRyYWdFbnRlckV2ZW50KHN0YXRpY19jYXN0PFFH
cmFwaGljc1NjZW5lRHJhZ0Ryb3BFdmVudCo+KGV2KSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNh
c2UgUUV2ZW50OjpHcmFwaGljc1NjZW5lRHJhZ01vdmU6Ci0gICAgICAgIGQtPmRyYWdNb3ZlRXZl
bnQoc3RhdGljX2Nhc3Q8UUdyYXBoaWNzU2NlbmVEcmFnRHJvcEV2ZW50Kj4oZXYpKTsKLSAgICAg
ICAgYnJlYWs7Ci0gICAgY2FzZSBRRXZlbnQ6OkdyYXBoaWNzU2NlbmVEcmFnTGVhdmU6Ci0gICAg
ICAgIGQtPmRyYWdMZWF2ZUV2ZW50KHN0YXRpY19jYXN0PFFHcmFwaGljc1NjZW5lRHJhZ0Ryb3BF
dmVudCo+KGV2KSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUUV2ZW50OjpHcmFwaGljc1Nj
ZW5lRHJvcDoKLSAgICAgICAgZC0+ZHJvcEV2ZW50KHN0YXRpY19jYXN0PFFHcmFwaGljc1NjZW5l
RHJhZ0Ryb3BFdmVudCo+KGV2KSk7Ci0gICAgICAgIGJyZWFrOwotI2VuZGlmCi0KLSNlbmRpZgot
ICAgIGNhc2UgUUV2ZW50OjpJbnB1dE1ldGhvZDoKLSAgICAgICAgZC0+aW5wdXRNZXRob2RFdmVu
dChzdGF0aWNfY2FzdDxRSW5wdXRNZXRob2RFdmVudCo+KGV2KSk7Ci0gICAgICAgIGJyZWFrOwot
ICAgIGNhc2UgUUV2ZW50OjpTaG9ydGN1dE92ZXJyaWRlOgotICAgICAgICBkLT5zaG9ydGN1dE92
ZXJyaWRlRXZlbnQoc3RhdGljX2Nhc3Q8UUtleUV2ZW50Kj4oZXYpKTsKLSAgICAgICAgYnJlYWs7
Ci0gICAgY2FzZSBRRXZlbnQ6OkxlYXZlOgotICAgICAgICBkLT5sZWF2ZUV2ZW50KGV2KTsKLSAg
ICAgICAgYnJlYWs7Ci0gICAgY2FzZSBRRXZlbnQ6OlRvdWNoQmVnaW46Ci0gICAgY2FzZSBRRXZl
bnQ6OlRvdWNoVXBkYXRlOgotICAgIGNhc2UgUUV2ZW50OjpUb3VjaEVuZDoKLSAgICBjYXNlIFFF
dmVudDo6VG91Y2hDYW5jZWw6Ci0gICAgICAgIC8vIFJldHVybiB3aGV0aGVyIHRoZSBkZWZhdWx0
IGFjdGlvbiB3YXMgY2FuY2VsbGVkIGluIHRoZSBKUyBldmVudCBoYW5kbGVyCi0gICAgICAgIHJl
dHVybiBkLT50b3VjaEV2ZW50KHN0YXRpY19jYXN0PFFUb3VjaEV2ZW50Kj4oZXYpKTsKLSNpZm5k
ZWYgUVRfTk9fR0VTVFVSRVMKLSAgICBjYXNlIFFFdmVudDo6R2VzdHVyZToKLSAgICAgICAgZC0+
Z2VzdHVyZUV2ZW50KHN0YXRpY19jYXN0PFFHZXN0dXJlRXZlbnQqPihldikpOwotICAgICAgICBi
cmVhazsKLSNlbmRpZgotI2lmbmRlZiBRVF9OT19QUk9QRVJUSUVTCi0gICAgY2FzZSBRRXZlbnQ6
OkR5bmFtaWNQcm9wZXJ0eUNoYW5nZToKLSAgICAgICAgZC0+ZHluYW1pY1Byb3BlcnR5Q2hhbmdl
RXZlbnQoc3RhdGljX2Nhc3Q8UUR5bmFtaWNQcm9wZXJ0eUNoYW5nZUV2ZW50Kj4oZXYpKTsKLSAg
ICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gUU9iamVj
dDo6ZXZlbnQoZXYpOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi0vKiEKLSAgICBT
aW1pbGFyIHRvIFFXaWRnZXQ6OmZvY3VzTmV4dFByZXZDaGlsZCgpIGl0IGZvY3VzZXMgdGhlIG5l
eHQgZm9jdXNhYmxlIHdlYiBlbGVtZW50Ci0gICAgaWYgXGEgbmV4dCBpcyB0cnVlOyBvdGhlcndp
c2UgdGhlIHByZXZpb3VzIGVsZW1lbnQgaXMgZm9jdXNlZC4KLQotICAgIFJldHVybnMgdHJ1ZSBp
ZiBpdCBjYW4gZmluZCBhIG5ldyBmb2N1c2FibGUgZWxlbWVudCwgb3IgZmFsc2UgaWYgaXQgY2Fu
J3QuCi0qLwotYm9vbCBRV2ViUGFnZTo6Zm9jdXNOZXh0UHJldkNoaWxkKGJvb2wgbmV4dCkKLXsK
LSAgICBRS2V5RXZlbnQgZXYoUUV2ZW50OjpLZXlQcmVzcywgUXQ6OktleV9UYWIsIFF0OjpLZXli
b2FyZE1vZGlmaWVycyhuZXh0ID8gUXQ6Ok5vTW9kaWZpZXIgOiBRdDo6U2hpZnRNb2RpZmllcikp
OwotICAgIGQtPmtleVByZXNzRXZlbnQoJmV2KTsKLSAgICBib29sIGhhc0ZvY3VzZWROb2RlID0g
ZmFsc2U7Ci0gICAgRnJhbWUgKmZyYW1lID0gZC0+cGFnZS0+Zm9jdXNDb250cm9sbGVyKCktPmZv
Y3VzZWRGcmFtZSgpOwotICAgIGlmIChmcmFtZSkgewotICAgICAgICBEb2N1bWVudCAqZG9jdW1l
bnQgPSBmcmFtZS0+ZG9jdW1lbnQoKTsKLSAgICAgICAgaGFzRm9jdXNlZE5vZGUgPSBkb2N1bWVu
dCAmJiBkb2N1bWVudC0+Zm9jdXNlZE5vZGUoKTsKLSAgICB9Ci0gICAgLy9xRGVidWcoKSA8PCAi
Zm9jdXNOZXh0UHJldkNoaWxkKCIgPDwgbmV4dCA8PCAiKSA9IiA8PCBldi5pc0FjY2VwdGVkKCkg
PDwgImZvY3VzZWROb2RlPyIgPDwgaGFzRm9jdXNlZE5vZGU7Ci0gICAgcmV0dXJuIGhhc0ZvY3Vz
ZWROb2RlOwotfQotCi0vKiEKLSAgICBccHJvcGVydHkgUVdlYlBhZ2U6OmNvbnRlbnRFZGl0YWJs
ZQotICAgIFxicmllZiB3aGV0aGVyIHRoZSBjb250ZW50IGluIHRoaXMgUVdlYlBhZ2UgaXMgZWRp
dGFibGUgb3Igbm90Ci0gICAgXHNpbmNlIDQuNQotCi0gICAgSWYgdGhpcyBwcm9wZXJ0eSBpcyBl
bmFibGVkIHRoZSBjb250ZW50cyBvZiB0aGUgcGFnZSBjYW4gYmUgZWRpdGVkIGJ5IHRoZSB1c2Vy
IHRocm91Z2ggYSB2aXNpYmxlCi0gICAgY3Vyc29yLiBJZiBkaXNhYmxlZCAodGhlIGRlZmF1bHQp
IG9ubHkgSFRNTCBlbGVtZW50cyBpbiB0aGUgd2ViIHBhZ2Ugd2l0aCB0aGVpcgotICAgIFxje2Nv
bnRlbnRlZGl0YWJsZX0gYXR0cmlidXRlIHNldCBhcmUgZWRpdGFibGUuCi0KLSAgICBcc2EgbW9k
aWZpZWQsIGNvbnRlbnRzQ2hhbmdlZCgpLCBXZWJBY3Rpb24KLSovCi12b2lkIFFXZWJQYWdlOjpz
ZXRDb250ZW50RWRpdGFibGUoYm9vbCBlZGl0YWJsZSkKLXsKLSAgICBpZiAoaXNDb250ZW50RWRp
dGFibGUoKSAhPSBlZGl0YWJsZSkgewotICAgICAgICBkLT5wYWdlLT5zZXRFZGl0YWJsZShlZGl0
YWJsZSk7Ci0gICAgICAgIGQtPnBhZ2UtPnNldFRhYktleUN5Y2xlc1Rocm91Z2hFbGVtZW50cygh
ZWRpdGFibGUpOwotICAgICAgICBpZiAoZC0+bWFpbkZyYW1lKSB7Ci0gICAgICAgICAgICBXZWJD
b3JlOjpGcmFtZSogZnJhbWUgPSBkLT5tYWluRnJhbWUuZGF0YSgpLT5kLT5mcmFtZTsKLSAgICAg
ICAgICAgIGlmIChlZGl0YWJsZSkgewotICAgICAgICAgICAgICAgIGZyYW1lLT5lZGl0b3IoKS0+
YXBwbHlFZGl0aW5nU3R5bGVUb0JvZHlFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgLy8gRklY
TUU6IG1hYyBwb3J0IGNhbGxzIHRoaXMgaWYgdGhlcmUgaXMgbm8gc2VsZWN0ZWRET01SYW5nZQot
ICAgICAgICAgICAgICAgIC8vZnJhbWUtPnNldFNlbGVjdGlvbkZyb21Ob25lKCk7Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBkLT51cGRhdGVFZGl0b3JBY3Rpb25zKCk7Ci0g
ICAgfQotfQotCi1ib29sIFFXZWJQYWdlOjppc0NvbnRlbnRFZGl0YWJsZSgpIGNvbnN0Ci17Ci0g
ICAgcmV0dXJuIGQtPnBhZ2UtPmlzRWRpdGFibGUoKTsKLX0KLQotLyohCi0gICAgXHByb3BlcnR5
IFFXZWJQYWdlOjpmb3J3YXJkVW5zdXBwb3J0ZWRDb250ZW50Ci0gICAgXGJyaWVmIHdoZXRoZXIg
UVdlYlBhZ2Ugc2hvdWxkIGZvcndhcmQgdW5zdXBwb3J0ZWQgY29udGVudAotCi0gICAgSWYgZW5h
YmxlZCwgdGhlIHVuc3VwcG9ydGVkQ29udGVudCgpIHNpZ25hbCBpcyBlbWl0dGVkIHdpdGggYSBu
ZXR3b3JrIHJlcGx5IHRoYXQKLSAgICBjYW4gYmUgdXNlZCB0byByZWFkIHRoZSBjb250ZW50Lgot
Ci0gICAgSWYgZGlzYWJsZWQsIHRoZSBkb3dubG9hZCBvZiBzdWNoIGNvbnRlbnQgaXMgYWJvcnRl
ZCBpbW1lZGlhdGVseS4KLQotICAgIEJ5IGRlZmF1bHQgdW5zdXBwb3J0ZWQgY29udGVudCBpcyBu
b3QgZm9yd2FyZGVkLgotKi8KLQotdm9pZCBRV2ViUGFnZTo6c2V0Rm9yd2FyZFVuc3VwcG9ydGVk
Q29udGVudChib29sIGZvcndhcmQpCi17Ci0gICAgZC0+Zm9yd2FyZFVuc3VwcG9ydGVkQ29udGVu
dCA9IGZvcndhcmQ7Ci19Ci0KLWJvb2wgUVdlYlBhZ2U6OmZvcndhcmRVbnN1cHBvcnRlZENvbnRl
bnQoKSBjb25zdAotewotICAgIHJldHVybiBkLT5mb3J3YXJkVW5zdXBwb3J0ZWRDb250ZW50Owot
fQotCi0vKiEKLSAgICBccHJvcGVydHkgUVdlYlBhZ2U6OmxpbmtEZWxlZ2F0aW9uUG9saWN5Ci0g
ICAgXGJyaWVmIGhvdyBRV2ViUGFnZSBzaG91bGQgZGVsZWdhdGUgdGhlIGhhbmRsaW5nIG9mIGxp
bmtzIHRocm91Z2ggdGhlCi0gICAgbGlua0NsaWNrZWQoKSBzaWduYWwKLQotICAgIFRoZSBkZWZh
dWx0IGlzIHRvIGRlbGVnYXRlIG5vIGxpbmtzLgotKi8KLQotdm9pZCBRV2ViUGFnZTo6c2V0TGlu
a0RlbGVnYXRpb25Qb2xpY3koTGlua0RlbGVnYXRpb25Qb2xpY3kgcG9saWN5KQotewotICAgIGQt
PmxpbmtQb2xpY3kgPSBwb2xpY3k7Ci19Ci0KLVFXZWJQYWdlOjpMaW5rRGVsZWdhdGlvblBvbGlj
eSBRV2ViUGFnZTo6bGlua0RlbGVnYXRpb25Qb2xpY3koKSBjb25zdAotewotICAgIHJldHVybiBk
LT5saW5rUG9saWN5OwotfQotCi0jaWZuZGVmIFFUX05PX0NPTlRFWFRNRU5VCi0KLXN0YXRpYyBi
b29sIGhhbmRsZVNjcm9sbGJhckNvbnRleHRNZW51RXZlbnQoU2Nyb2xsYmFyKiBzY3JvbGxCYXIs
IFFDb250ZXh0TWVudUV2ZW50KiBldmVudCkKLXsKLSAgICBpZiAoIVFBcHBsaWNhdGlvbjo6c3R5
bGUoKS0+c3R5bGVIaW50KFFTdHlsZTo6U0hfU2Nyb2xsQmFyX0NvbnRleHRNZW51KSkKLSAgICAg
ICAgcmV0dXJuIHRydWU7Ci0KLSAgICBib29sIGhvcml6b250YWwgPSAoc2Nyb2xsQmFyLT5vcmll
bnRhdGlvbigpID09IEhvcml6b250YWxTY3JvbGxiYXIpOwotCi0gICAgUU1lbnUgbWVudTsKLSAg
ICBRQWN0aW9uKiBhY3RTY3JvbGxIZXJlID0gbWVudS5hZGRBY3Rpb24oUUNvcmVBcHBsaWNhdGlv
bjo6dHJhbnNsYXRlKCJRV2ViUGFnZSIsICJTY3JvbGwgaGVyZSIpKTsKLSAgICBtZW51LmFkZFNl
cGFyYXRvcigpOwotCi0gICAgUUFjdGlvbiogYWN0U2Nyb2xsVG9wID0gbWVudS5hZGRBY3Rpb24o
aG9yaXpvbnRhbCA/IFFDb3JlQXBwbGljYXRpb246OnRyYW5zbGF0ZSgiUVdlYlBhZ2UiLCAiTGVm
dCBlZGdlIikgOiBRQ29yZUFwcGxpY2F0aW9uOjp0cmFuc2xhdGUoIlFXZWJQYWdlIiwgIlRvcCIp
KTsKLSAgICBRQWN0aW9uKiBhY3RTY3JvbGxCb3R0b20gPSBtZW51LmFkZEFjdGlvbihob3Jpem9u
dGFsID8gUUNvcmVBcHBsaWNhdGlvbjo6dHJhbnNsYXRlKCJRV2ViUGFnZSIsICJSaWdodCBlZGdl
IikgOiBRQ29yZUFwcGxpY2F0aW9uOjp0cmFuc2xhdGUoIlFXZWJQYWdlIiwgIkJvdHRvbSIpKTsK
LSAgICBtZW51LmFkZFNlcGFyYXRvcigpOwotCi0gICAgUUFjdGlvbiogYWN0UGFnZVVwID0gbWVu
dS5hZGRBY3Rpb24oaG9yaXpvbnRhbCA/IFFDb3JlQXBwbGljYXRpb246OnRyYW5zbGF0ZSgiUVdl
YlBhZ2UiLCAiUGFnZSBsZWZ0IikgOiBRQ29yZUFwcGxpY2F0aW9uOjp0cmFuc2xhdGUoIlFXZWJQ
YWdlIiwgIlBhZ2UgdXAiKSk7Ci0gICAgUUFjdGlvbiogYWN0UGFnZURvd24gPSBtZW51LmFkZEFj
dGlvbihob3Jpem9udGFsID8gUUNvcmVBcHBsaWNhdGlvbjo6dHJhbnNsYXRlKCJRV2ViUGFnZSIs
ICJQYWdlIHJpZ2h0IikgOiBRQ29yZUFwcGxpY2F0aW9uOjp0cmFuc2xhdGUoIlFXZWJQYWdlIiwg
IlBhZ2UgZG93biIpKTsKLSAgICBtZW51LmFkZFNlcGFyYXRvcigpOwotCi0gICAgUUFjdGlvbiog
YWN0U2Nyb2xsVXAgPSBtZW51LmFkZEFjdGlvbihob3Jpem9udGFsID8gUUNvcmVBcHBsaWNhdGlv
bjo6dHJhbnNsYXRlKCJRV2ViUGFnZSIsICJTY3JvbGwgbGVmdCIpIDogUUNvcmVBcHBsaWNhdGlv
bjo6dHJhbnNsYXRlKCJRV2ViUGFnZSIsICJTY3JvbGwgdXAiKSk7Ci0gICAgUUFjdGlvbiogYWN0
U2Nyb2xsRG93biA9IG1lbnUuYWRkQWN0aW9uKGhvcml6b250YWwgPyBRQ29yZUFwcGxpY2F0aW9u
Ojp0cmFuc2xhdGUoIlFXZWJQYWdlIiwgIlNjcm9sbCByaWdodCIpIDogUUNvcmVBcHBsaWNhdGlv
bjo6dHJhbnNsYXRlKCJRV2ViUGFnZSIsICJTY3JvbGwgZG93biIpKTsKLQotICAgIFFBY3Rpb24q
IGFjdGlvblNlbGVjdGVkID0gbWVudS5leGVjKGV2ZW50LT5nbG9iYWxQb3MoKSk7Ci0KLSAgICBp
ZiAoYWN0aW9uU2VsZWN0ZWQgPT0gYWN0U2Nyb2xsSGVyZSkgewotICAgICAgICBTY3JvbGxiYXJU
aGVtZSogdGhlbWUgPSBzY3JvbGxCYXItPnRoZW1lKCk7Ci0gICAgICAgIC8vIFNldCB0aGUgcHJl
c3NlZCBwb3NpdGlvbiB0byB0aGUgbWlkZGxlIG9mIHRoZSB0aHVtYiBzbyB0aGF0IHdoZW4gd2UK
LSAgICAgICAgLy8gZG8gbW92ZSwgdGhlIGRlbHRhIHdpbGwgYmUgZnJvbSB0aGUgY3VycmVudCBw
aXhlbCBwb3NpdGlvbiBvZiB0aGUKLSAgICAgICAgLy8gdGh1bWIgdG8gdGhlIG5ldyBwb3NpdGlv
bgotICAgICAgICBpbnQgcG9zaXRpb24gPSB0aGVtZS0+dHJhY2tQb3NpdGlvbihzY3JvbGxCYXIp
ICsgdGhlbWUtPnRodW1iUG9zaXRpb24oc2Nyb2xsQmFyKSArIHRoZW1lLT50aHVtYkxlbmd0aChz
Y3JvbGxCYXIpIC8gMjsKLSAgICAgICAgc2Nyb2xsQmFyLT5zZXRQcmVzc2VkUG9zKHBvc2l0aW9u
KTsKLSAgICAgICAgY29uc3QgUVBvaW50IHBvcyA9IHNjcm9sbEJhci0+Y29udmVydEZyb21Db250
YWluaW5nV2luZG93KGV2ZW50LT5wb3MoKSk7Ci0gICAgICAgIHNjcm9sbEJhci0+bW92ZVRodW1i
KGhvcml6b250YWwgPyBwb3MueCgpIDogcG9zLnkoKSk7Ci0gICAgfSBlbHNlIGlmIChhY3Rpb25T
ZWxlY3RlZCA9PSBhY3RTY3JvbGxUb3ApCi0gICAgICAgIHNjcm9sbEJhci0+c2Nyb2xsYWJsZUFy
ZWEoKS0+c2Nyb2xsKGhvcml6b250YWwgPyBTY3JvbGxMZWZ0IDogU2Nyb2xsVXAsIFNjcm9sbEJ5
RG9jdW1lbnQpOwotICAgIGVsc2UgaWYgKGFjdGlvblNlbGVjdGVkID09IGFjdFNjcm9sbEJvdHRv
bSkKLSAgICAgICAgc2Nyb2xsQmFyLT5zY3JvbGxhYmxlQXJlYSgpLT5zY3JvbGwoaG9yaXpvbnRh
bCA/IFNjcm9sbFJpZ2h0IDogU2Nyb2xsRG93biwgU2Nyb2xsQnlEb2N1bWVudCk7Ci0gICAgZWxz
ZSBpZiAoYWN0aW9uU2VsZWN0ZWQgPT0gYWN0UGFnZVVwKQotICAgICAgICBzY3JvbGxCYXItPnNj
cm9sbGFibGVBcmVhKCktPnNjcm9sbChob3Jpem9udGFsID8gU2Nyb2xsTGVmdCA6IFNjcm9sbFVw
LCBTY3JvbGxCeVBhZ2UpOwotICAgIGVsc2UgaWYgKGFjdGlvblNlbGVjdGVkID09IGFjdFBhZ2VE
b3duKQotICAgICAgICBzY3JvbGxCYXItPnNjcm9sbGFibGVBcmVhKCktPnNjcm9sbChob3Jpem9u
dGFsID8gU2Nyb2xsUmlnaHQgOiBTY3JvbGxEb3duLCBTY3JvbGxCeVBhZ2UpOwotICAgIGVsc2Ug
aWYgKGFjdGlvblNlbGVjdGVkID09IGFjdFNjcm9sbFVwKQotICAgICAgICBzY3JvbGxCYXItPnNj
cm9sbGFibGVBcmVhKCktPnNjcm9sbChob3Jpem9udGFsID8gU2Nyb2xsTGVmdCA6IFNjcm9sbFVw
LCBTY3JvbGxCeUxpbmUpOwotICAgIGVsc2UgaWYgKGFjdGlvblNlbGVjdGVkID09IGFjdFNjcm9s
bERvd24pCi0gICAgICAgIHNjcm9sbEJhci0+c2Nyb2xsYWJsZUFyZWEoKS0+c2Nyb2xsKGhvcml6
b250YWwgPyBTY3JvbGxSaWdodCA6IFNjcm9sbERvd24sIFNjcm9sbEJ5TGluZSk7Ci0gICAgcmV0
dXJuIHRydWU7Ci19Ci0KLS8qIQotICAgIEZpbHRlcnMgdGhlIGNvbnRleHQgbWVudSBldmVudCwg
XGEgZXZlbnQsIHRocm91Z2ggaGFuZGxlcnMgZm9yIHNjcm9sbGJhcnMgYW5kCi0gICAgY3VzdG9t
IGV2ZW50IGhhbmRsZXJzIGluIHRoZSB3ZWIgcGFnZS4gUmV0dXJucyB0cnVlIGlmIHRoZSBldmVu
dCB3YXMgaGFuZGxlZDsKLSAgICBvdGhlcndpc2UgZmFsc2UuCi0KLSAgICBBIHdlYiBwYWdlIG1h
eSBzd2FsbG93IGEgY29udGV4dCBtZW51IGV2ZW50IHRocm91Z2ggYSBjdXN0b20gZXZlbnQgaGFu
ZGxlciwgYWxsb3dpbmcgZm9yIGNvbnRleHQKLSAgICBtZW51cyB0byBiZSBpbXBsZW1lbnRlZCBp
biBIVE1ML0phdmFTY3JpcHQuIFRoaXMgaXMgdXNlZCBieSBcbHtodHRwOi8vbWFwcy5nb29nbGUu
Y29tL317R29vZ2xlCi0gICAgTWFwc30sIGZvciBleGFtcGxlLgotKi8KLWJvb2wgUVdlYlBhZ2U6
OnN3YWxsb3dDb250ZXh0TWVudUV2ZW50KFFDb250ZXh0TWVudUV2ZW50ICpldmVudCkKLXsKLSAg
ICBkLT5wYWdlLT5jb250ZXh0TWVudUNvbnRyb2xsZXIoKS0+Y2xlYXJDb250ZXh0TWVudSgpOwot
Ci0gICAgaWYgKFFXZWJGcmFtZSogd2ViRnJhbWUgPSBmcmFtZUF0KGV2ZW50LT5wb3MoKSkpIHsK
LSAgICAgICAgRnJhbWUqIGZyYW1lID0gUVdlYkZyYW1lUHJpdmF0ZTo6Y29yZSh3ZWJGcmFtZSk7
Ci0gICAgICAgIGlmIChTY3JvbGxiYXIqIHNjcm9sbGJhciA9IGZyYW1lLT52aWV3KCktPnNjcm9s
bGJhckF0UG9pbnQoY29udmVydE1vdXNlRXZlbnQoZXZlbnQsIDEpLnBvc2l0aW9uKCkpKQotICAg
ICAgICAgICAgcmV0dXJuIGhhbmRsZVNjcm9sbGJhckNvbnRleHRNZW51RXZlbnQoc2Nyb2xsYmFy
LCBldmVudCk7Ci0gICAgfQotCi0gICAgV2ViQ29yZTo6RnJhbWUqIGZvY3VzZWRGcmFtZSA9IGQt
PnBhZ2UtPmZvY3VzQ29udHJvbGxlcigpLT5mb2N1c2VkT3JNYWluRnJhbWUoKTsKLSAgICBmb2N1
c2VkRnJhbWUtPmV2ZW50SGFuZGxlcigpLT5zZW5kQ29udGV4dE1lbnVFdmVudChjb252ZXJ0TW91
c2VFdmVudChldmVudCwgMSkpOwotICAgIENvbnRleHRNZW51ICptZW51ID0gZC0+cGFnZS0+Y29u
dGV4dE1lbnVDb250cm9sbGVyKCktPmNvbnRleHRNZW51KCk7Ci0gICAgLy8gSWYgdGhlIHdlYnNp
dGUgZGVmaW5lcyBpdHMgb3duIGhhbmRsZXIgdGhlbiBzZW5kQ29udGV4dE1lbnVFdmVudCB0YWtl
cyBjYXJlIG9mCi0gICAgLy8gY2FsbGluZy9zaG93aW5nIGl0IGFuZCB0aGUgY29udGV4dCBtZW51
IHBvaW50ZXIgd2lsbCBiZSB6ZXJvLiBUaGlzIGlzIHRoZSBjYXNlCi0gICAgLy8gb24gbWFwcy5n
b29nbGUuY29tIGZvciBleGFtcGxlLgotCi0gICAgcmV0dXJuICFtZW51OwotfQotI2VuZGlmIC8v
IFFUX05PX0NPTlRFWFRNRU5VCi0KLS8qIQotICAgIFVwZGF0ZXMgdGhlIHBhZ2UncyBhY3Rpb25z
IGRlcGVuZGluZyBvbiB0aGUgcG9zaXRpb24gXGEgcG9zLiBGb3IgZXhhbXBsZSBpZiBcYSBwb3Mg
aXMgb3ZlciBhbiBpbWFnZQotICAgIGVsZW1lbnQgdGhlIENvcHlJbWFnZVRvQ2xpcGJvYXJkIGFj
dGlvbiBpcyBlbmFibGVkLgotKi8KLXZvaWQgUVdlYlBhZ2U6OnVwZGF0ZVBvc2l0aW9uRGVwZW5k
ZW50QWN0aW9ucyhjb25zdCBRUG9pbnQgJnBvcykKLXsKLSNpZm5kZWYgUVRfTk9fQUNUSU9OCi0g
ICAgLy8gRmlyc3Qgd2UgZGlzYWJsZSBhbGwgYWN0aW9ucywgYnV0IGtlZXAgdHJhY2sgb2Ygd2hp
Y2ggb25lcyB3ZXJlIG9yaWdpbmFsbHkgZW5hYmxlZC4KLSAgICBRQml0QXJyYXkgb3JpZ2luYWxs
eUVuYWJsZWRXZWJBY3Rpb25zKFFXZWJQYWdlOjpXZWJBY3Rpb25Db3VudCk7Ci0gICAgZm9yIChp
bnQgaSA9IENvbnRleHRNZW51SXRlbVRhZ05vQWN0aW9uOyBpIDwgQ29udGV4dE1lbnVJdGVtQmFz
ZUFwcGxpY2F0aW9uVGFnOyArK2kpIHsKLSAgICAgICAgUVdlYlBhZ2U6OldlYkFjdGlvbiBhY3Rp
b24gPSB3ZWJBY3Rpb25Gb3JDb250ZXh0TWVudUFjdGlvbihXZWJDb3JlOjpDb250ZXh0TWVudUFj
dGlvbihpKSk7Ci0gICAgICAgIGlmIChRQWN0aW9uICphID0gdGhpcy0+YWN0aW9uKGFjdGlvbikp
IHsKLSAgICAgICAgICAgIG9yaWdpbmFsbHlFbmFibGVkV2ViQWN0aW9ucy5zZXRCaXQoYWN0aW9u
LCBhLT5pc0VuYWJsZWQoKSk7Ci0gICAgICAgICAgICBhLT5zZXRFbmFibGVkKGZhbHNlKTsKLSAg
ICAgICAgfQotICAgIH0KLSNlbmRpZiAvLyBRVF9OT19BQ1RJT04KLQotICAgIGQtPmNyZWF0ZU1h
aW5GcmFtZSgpOwotICAgIFdlYkNvcmU6OkZyYW1lKiBmb2N1c2VkRnJhbWUgPSBkLT5wYWdlLT5m
b2N1c0NvbnRyb2xsZXIoKS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCk7Ci0KLSAgICBIaXRUZXN0UmVz
dWx0IHJlc3VsdCA9IGZvY3VzZWRGcmFtZS0+ZXZlbnRIYW5kbGVyKCktPmhpdFRlc3RSZXN1bHRB
dFBvaW50KGZvY3VzZWRGcmFtZS0+dmlldygpLT53aW5kb3dUb0NvbnRlbnRzKHBvcyksIC8qYWxs
b3dTaGFkb3dDb250ZW50Ki8gZmFsc2UpOwotICAgIGlmIChyZXN1bHQuc2Nyb2xsYmFyKCkpCi0g
ICAgICAgIGQtPmhpdFRlc3RSZXN1bHQgPSBRV2ViSGl0VGVzdFJlc3VsdCgpOwotICAgIGVsc2UK
LSAgICAgICAgZC0+aGl0VGVzdFJlc3VsdCA9IFFXZWJIaXRUZXN0UmVzdWx0KG5ldyBRV2ViSGl0
VGVzdFJlc3VsdFByaXZhdGUocmVzdWx0KSk7Ci0gICAgZC0+cGFnZS0+Y29udGV4dE1lbnVDb250
cm9sbGVyKCktPnNldEhpdFRlc3RSZXN1bHQocmVzdWx0KTsKLQotI2lmIEVOQUJMRShJTlNQRUNU
T1IpCi0gICAgaWYgKGQtPnBhZ2UtPmluc3BlY3RvckNvbnRyb2xsZXIoKS0+ZW5hYmxlZCgpKQot
ICAgICAgICBkLT5wYWdlLT5jb250ZXh0TWVudUNvbnRyb2xsZXIoKS0+YWRkSW5zcGVjdEVsZW1l
bnRJdGVtKCk7Ci0jZW5kaWYKLQotICAgIFFCaXRBcnJheSB2aXNpdGVkV2ViQWN0aW9ucyhRV2Vi
UGFnZTo6V2ViQWN0aW9uQ291bnQpOwotCi0jaWZuZGVmIFFUX05PX0NPTlRFWFRNRU5VCi0gICAg
ZGVsZXRlIGQtPmN1cnJlbnRDb250ZXh0TWVudS5kYXRhKCk7Ci0KLSAgICAvLyBUaGVuIHdlIGxl
dCBjcmVhdGVDb250ZXh0TWVudSgpIGVuYWJsZSB0aGUgYWN0aW9ucyB0aGF0IGFyZSBwdXQgaW50
byB0aGUgbWVudQotICAgIGQtPmN1cnJlbnRDb250ZXh0TWVudSA9IGQtPmNyZWF0ZUNvbnRleHRN
ZW51KGQtPnBhZ2UtPmNvbnRleHRNZW51Q29udHJvbGxlcigpLT5jb250ZXh0TWVudSgpLCBkLT5w
YWdlLT5jb250ZXh0TWVudUNvbnRyb2xsZXIoKS0+Y29udGV4dE1lbnUoKS0+cGxhdGZvcm1EZXNj
cmlwdGlvbigpLCAmdmlzaXRlZFdlYkFjdGlvbnMpOwotI2VuZGlmIC8vIFFUX05PX0NPTlRFWFRN
RU5VCi0KLSNpZm5kZWYgUVRfTk9fQUNUSU9OCi0gICAgLy8gRmluYWxseSwgd2UgcmVzdG9yZSB0
aGUgb3JpZ2luYWwgZW5hYmxlbWVudCBmb3IgdGhlIGFjdGlvbnMgdGhhdCB3ZXJlIG5vdCBwdXQg
aW50byB0aGUgbWVudS4KLSAgICBvcmlnaW5hbGx5RW5hYmxlZFdlYkFjdGlvbnMgJj0gfnZpc2l0
ZWRXZWJBY3Rpb25zOyAvLyBNYXNrIG91dCB2aXNpdGVkIGFjdGlvbnMgKHRoZXkncmUgcGFydCBv
ZiB0aGUgbWVudSkKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IFFXZWJQYWdlOjpXZWJBY3Rpb25D
b3VudDsgKytpKSB7Ci0gICAgICAgIGlmIChvcmlnaW5hbGx5RW5hYmxlZFdlYkFjdGlvbnMuYXQo
aSkpIHsKLSAgICAgICAgICAgIGlmIChRQWN0aW9uICphID0gdGhpcy0+YWN0aW9uKFFXZWJQYWdl
OjpXZWJBY3Rpb24oaSkpKQotICAgICAgICAgICAgICAgIGEtPnNldEVuYWJsZWQodHJ1ZSk7Ci0g
ICAgICAgIH0KLSAgICB9Ci0jZW5kaWYgLy8gUVRfTk9fQUNUSU9OCi0KLSAgICAvLyBUaGlzIHdo
b2xlIHByb2Nlc3MgZW5zdXJlcyB0aGF0IGFueSBhY3Rpb25zIHB1dCBpbnRvIHRvIHRoZSBjb250
ZXh0IG1lbnUgaGFzIHRoZSByaWdodAotICAgIC8vIGVuYWJsZW1lbnQsIHdoaWxlIGFsc28ga2Vl
cGluZyB0aGUgY29ycmVjdCBlbmFibGVtZW50IGZvciBhY3Rpb25zIHRoYXQgd2VyZSBsZWZ0IG91
dCBvZgotICAgIC8vIHRoZSBtZW51LgotCi19Ci0KLQotCi0vKiEKLSAgICBcZW51bSBRV2ViUGFn
ZTo6RXh0ZW5zaW9uCi0KLSAgICBUaGlzIGVudW0gZGVzY3JpYmVzIHRoZSB0eXBlcyBvZiBleHRl
bnNpb25zIHRoYXQgdGhlIHBhZ2UgY2FuIHN1cHBvcnQuIEJlZm9yZSB1c2luZyB0aGVzZSBleHRl
bnNpb25zLCB5b3UKLSAgICBzaG91bGQgdmVyaWZ5IHRoYXQgdGhlIGV4dGVuc2lvbiBpcyBzdXBw
b3J0ZWQgYnkgY2FsbGluZyBzdXBwb3J0c0V4dGVuc2lvbigpLgotCi0gICAgXHZhbHVlIENob29z
ZU11bHRpcGxlRmlsZXNFeHRlbnNpb24gV2hldGhlciB0aGUgd2ViIHBhZ2Ugc3VwcG9ydHMgbXVs
dGlwbGUgZmlsZSBzZWxlY3Rpb24uCi0gICAgVGhpcyBleHRlbnNpb24gaXMgaW52b2tlZCB3aGVu
IHRoZSB3ZWIgY29udGVudCByZXF1ZXN0cyBvbmUgb3IgbW9yZSBmaWxlIG5hbWVzLCBmb3IgZXhh
bXBsZQotICAgIGFzIGEgcmVzdWx0IG9mIHRoZSB1c2VyIGNsaWNraW5nIG9uIGEgImZpbGUgdXBs
b2FkIiBidXR0b24gaW4gYSBIVE1MIGZvcm0gd2hlcmUgbXVsdGlwbGUKLSAgICBmaWxlIHNlbGVj
dGlvbiBpcyBhbGxvd2VkLgotCi0gICAgXHZhbHVlIEVycm9yUGFnZUV4dGVuc2lvbiBXaGV0aGVy
IHRoZSB3ZWIgcGFnZSBjYW4gcHJvdmlkZSBhbiBlcnJvciBwYWdlIHdoZW4gbG9hZGluZyBmYWls
cy4KLSAgICAoaW50cm9kdWNlZCBpbiBRdCA0LjYpCi0KLSAgICBcc2EgQ2hvb3NlTXVsdGlwbGVG
aWxlc0V4dGVuc2lvbk9wdGlvbiwgQ2hvb3NlTXVsdGlwbGVGaWxlc0V4dGVuc2lvblJldHVybiwg
RXJyb3JQYWdlRXh0ZW5zaW9uT3B0aW9uLCBFcnJvclBhZ2VFeHRlbnNpb25SZXR1cm4KLSovCi0K
LS8qIQotICAgIFxlbnVtIFFXZWJQYWdlOjpFcnJvckRvbWFpbgotICAgIFxzaW5jZSA0LjYKLQot
ICAgIFRoaXMgZW51bSBkZXNjcmliZXMgdGhlIGRvbWFpbiBvZiBhbiBFcnJvclBhZ2VFeHRlbnNp
b25PcHRpb24gb2JqZWN0IChpLmUuIHRoZSBsYXllciBpbiB3aGljaCB0aGUgZXJyb3Igb2NjdXJy
ZWQpLgotCi0gICAgXHZhbHVlIFF0TmV0d29yayBUaGUgZXJyb3Igb2NjdXJyZWQgaW4gdGhlIFF0
TmV0d29yayBsYXllcjsgdGhlIGVycm9yIGNvZGUgaXMgb2YgdHlwZSBRTmV0d29ya1JlcGx5OjpO
ZXR3b3JrRXJyb3IuCi0gICAgXHZhbHVlIEh0dHAgVGhlIGVycm9yIG9jY3VycmVkIGluIHRoZSBI
VFRQIGxheWVyOyB0aGUgZXJyb3IgY29kZSBpcyBhIEhUVFAgc3RhdHVzIGNvZGUgKHNlZSBRTmV0
d29ya1JlcXVlc3Q6Okh0dHBTdGF0dXNDb2RlQXR0cmlidXRlKS4KLSAgICBcdmFsdWUgV2ViS2l0
IFRoZSBlcnJvciBpcyBhbiBpbnRlcm5hbCBXZWJLaXQgZXJyb3IuCi0qLwotCi0vKiEKLSAgICBc
Y2xhc3MgUVdlYlBhZ2U6OkV4dGVuc2lvbk9wdGlvbgotICAgIFxzaW5jZSA0LjQKLSAgICBcYnJp
ZWYgVGhlIEV4dGVuc2lvbk9wdGlvbiBjbGFzcyBwcm92aWRlcyBhbiBleHRlbmRlZCBpbnB1dCBh
cmd1bWVudCB0byBRV2ViUGFnZSdzIGV4dGVuc2lvbiBzdXBwb3J0LgotCi0gICAgXGlubW9kdWxl
IFF0V2ViS2l0Ci0KLSAgICBcc2EgUVdlYlBhZ2U6OmV4dGVuc2lvbigpLCBRV2ViUGFnZTo6RXh0
ZW5zaW9uUmV0dXJuCi0qLwotCi0KLS8qIQotICAgIFxjbGFzcyBRV2ViUGFnZTo6RXh0ZW5zaW9u
UmV0dXJuCi0gICAgXHNpbmNlIDQuNAotICAgIFxicmllZiBUaGUgRXh0ZW5zaW9uUmV0dXJuIGNs
YXNzIHByb3ZpZGVzIGFuIG91dHB1dCByZXN1bHQgZnJvbSBhIFFXZWJQYWdlJ3MgZXh0ZW5zaW9u
LgotCi0gICAgXGlubW9kdWxlIFF0V2ViS2l0Ci0KLSAgICBcc2EgUVdlYlBhZ2U6OmV4dGVuc2lv
bigpLCBRV2ViUGFnZTo6RXh0ZW5zaW9uT3B0aW9uCi0qLwotCi0vKiEKLSAgICBcY2xhc3MgUVdl
YlBhZ2U6OkVycm9yUGFnZUV4dGVuc2lvbk9wdGlvbgotICAgIFxzaW5jZSA0LjYKLSAgICBcYnJp
ZWYgVGhlIEVycm9yUGFnZUV4dGVuc2lvbk9wdGlvbiBjbGFzcyBkZXNjcmliZXMgdGhlIG9wdGlv
bgotICAgIGZvciB0aGUgZXJyb3IgcGFnZSBleHRlbnNpb24uCi0KLSAgICBcaW5tb2R1bGUgUXRX
ZWJLaXQKLQotICAgIFRoZSBFcnJvclBhZ2VFeHRlbnNpb25PcHRpb24gY2xhc3MgaG9sZHMgdGhl
IFxhIHVybCBmb3Igd2hpY2ggYW4gZXJyb3Igb2NjdXJyZWQgYXMgd2VsbCBhcwotICAgIHRoZSBh
c3NvY2lhdGVkIFxhIGZyYW1lLgotCi0gICAgVGhlIGVycm9yIGl0c2VsZiBpcyByZXBvcnRlZCBi
eSBhbiBlcnJvciBcYSBkb21haW4sIHRoZSBcYSBlcnJvciBjb2RlIGFzIHdlbGwgYXMgXGEgZXJy
b3JTdHJpbmcuCi0KLSAgICBcc2EgUVdlYlBhZ2U6OmV4dGVuc2lvbigpLCBRV2ViUGFnZTo6RXJy
b3JQYWdlRXh0ZW5zaW9uUmV0dXJuCi0qLwotCi0vKiEKLSAgICBcdmFyaWFibGUgUVdlYlBhZ2U6
OkVycm9yUGFnZUV4dGVuc2lvbk9wdGlvbjo6dXJsCi0gICAgXGJyaWVmIHRoZSB1cmwgZm9yIHdo
aWNoIGFuIGVycm9yIG9jY3VycmVkCi0qLwotCi0vKiEKLSAgICBcdmFyaWFibGUgUVdlYlBhZ2U6
OkVycm9yUGFnZUV4dGVuc2lvbk9wdGlvbjo6ZnJhbWUKLSAgICBcYnJpZWYgdGhlIGZyYW1lIGFz
c29jaWF0ZWQgd2l0aCB0aGUgZXJyb3IKLSovCi0KLS8qIQotICAgIFx2YXJpYWJsZSBRV2ViUGFn
ZTo6RXJyb3JQYWdlRXh0ZW5zaW9uT3B0aW9uOjpkb21haW4KLSAgICBcYnJpZWYgdGhlIGRvbWFp
biB0aGF0IHJlcG9ydGVkIHRoZSBlcnJvcgotKi8KLQotLyohCi0gICAgXHZhcmlhYmxlIFFXZWJQ
YWdlOjpFcnJvclBhZ2VFeHRlbnNpb25PcHRpb246OmVycm9yCi0gICAgXGJyaWVmIHRoZSBlcnJv
ciBjb2RlLiBJbnRlcnByZXRhdGlvbiBvZiB0aGUgdmFsdWUgZGVwZW5kcyBvbiB0aGUgXGEgZG9t
YWluCi0gICAgXHNhIFFXZWJQYWdlOjpFcnJvckRvbWFpbgotKi8KLQotLyohCi0gICAgXHZhcmlh
YmxlIFFXZWJQYWdlOjpFcnJvclBhZ2VFeHRlbnNpb25PcHRpb246OmVycm9yU3RyaW5nCi0gICAg
XGJyaWVmIGEgc3RyaW5nIHRoYXQgZGVzY3JpYmVzIHRoZSBlcnJvcgotKi8KLQotLyohCi0gICAg
XGNsYXNzIFFXZWJQYWdlOjpFcnJvclBhZ2VFeHRlbnNpb25SZXR1cm4KLSAgICBcc2luY2UgNC42
Ci0gICAgXGJyaWVmIFRoZSBFcnJvclBhZ2VFeHRlbnNpb25SZXR1cm4gZGVzY3JpYmVzIHRoZSBl
cnJvciBwYWdlLCB3aGljaCB3aWxsIGJlIHNob3duIGZvciB0aGUKLSAgICBmcmFtZSBmb3Igd2hp
Y2ggdGhlIGVycm9yIG9jY3VyZWQuCi0KLSAgICBcaW5tb2R1bGUgUXRXZWJLaXQKLQotICAgIFRo
ZSBFcnJvclBhZ2VFeHRlbnNpb25SZXR1cm4gY2xhc3MgaG9sZHMgdGhlIGRhdGEgbmVlZGVkIGZv
ciBjcmVhdGluZyBhbiBlcnJvciBwYWdlLiBTb21lIGFyZQotICAgIG9wdGlvbmFsIHN1Y2ggYXMg
XGEgY29udGVudFR5cGUsIHdoaWNoIGRlZmF1bHRzIHRvICJ0ZXh0L2h0bWwiLCBhcyB3ZWxsIGFz
IHRoZSBcYSBlbmNvZGluZywgd2hpY2gKLSAgICBpcyBhc3N1bWVkIHRvIGJlIFVURi04IGlmIG5v
dCBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotCi0gICAgVGhlIGVycm9yIHBhZ2UgaXMgc3RvcmVkIGlu
IHRoZSBcYSBjb250ZW50IGJ5dGUgYXJyYXksIGFzIEhUTUwgY29udGVudC4gSW4gb3JkZXIgdG8g
Y29udmVydCBhCi0gICAgUVN0cmluZyB0byBhIGJ5dGUgYXJyYXksIHRoZSBRU3RyaW5nOjp0b1V0
ZjgoKSBtZXRob2QgY2FuIGJlIHVzZWQuCi0KLSAgICBFeHRlcm5hbCBvYmplY3RzIHN1Y2ggYXMg
c3R5bGVzaGVldHMgb3IgaW1hZ2VzIHJlZmVyZW5jZWQgaW4gdGhlIEhUTUwgYXJlIGxvY2F0ZWQg
cmVsYXRpdmUgdG8KLSAgICBcYSBiYXNlVXJsLgotCi0gICAgXHNhIFFXZWJQYWdlOjpleHRlbnNp
b24oKSwgUVdlYlBhZ2U6OkVycm9yUGFnZUV4dGVuc2lvbk9wdGlvbiwgUVN0cmluZzo6dG9VdGY4
KCkKLSovCi0KLS8qIQotICAgIFxmbiBRV2ViUGFnZTo6RXJyb3JQYWdlRXh0ZW5zaW9uUmV0dXJu
OjpFcnJvclBhZ2VFeHRlbnNpb25SZXR1cm4oKQotCi0gICAgQ29uc3RydWN0cyBhIG5ldyBlcnJv
ciBwYWdlIG9iamVjdC4KLSovCi0KLQotLyohCi0gICAgXHZhcmlhYmxlIFFXZWJQYWdlOjpFcnJv
clBhZ2VFeHRlbnNpb25SZXR1cm46OmNvbnRlbnRUeXBlCi0gICAgXGJyaWVmIHRoZSBlcnJvciBw
YWdlJ3MgY29udGVudCB0eXBlCi0qLwotCi0vKiEKLSAgICBcdmFyaWFibGUgUVdlYlBhZ2U6OkVy
cm9yUGFnZUV4dGVuc2lvblJldHVybjo6ZW5jb2RpbmcKLSAgICBcYnJpZWYgdGhlIGVycm9yIHBh
Z2UgZW5jb2RpbmcKLSovCi0KLS8qIQotICAgIFx2YXJpYWJsZSBRV2ViUGFnZTo6RXJyb3JQYWdl
RXh0ZW5zaW9uUmV0dXJuOjpiYXNlVXJsCi0gICAgXGJyaWVmIHRoZSBiYXNlIHVybAotCi0gICAg
RXh0ZXJuYWwgb2JqZWN0cyBzdWNoIGFzIHN0eWxlc2hlZXRzIG9yIGltYWdlcyByZWZlcmVuY2Vk
IGluIHRoZSBIVE1MIGFyZSBsb2NhdGVkIHJlbGF0aXZlIHRvIHRoaXMgdXJsLgotKi8KLQotLyoh
Ci0gICAgXHZhcmlhYmxlIFFXZWJQYWdlOjpFcnJvclBhZ2VFeHRlbnNpb25SZXR1cm46OmNvbnRl
bnQKLSAgICBcYnJpZWYgdGhlIEhUTUwgY29udGVudCBvZiB0aGUgZXJyb3IgcGFnZQotKi8KLQot
LyohCi0gICAgXGNsYXNzIFFXZWJQYWdlOjpDaG9vc2VNdWx0aXBsZUZpbGVzRXh0ZW5zaW9uT3B0
aW9uCi0gICAgXHNpbmNlIDQuNQotICAgIFxicmllZiBUaGUgQ2hvb3NlTXVsdGlwbGVGaWxlc0V4
dGVuc2lvbk9wdGlvbiBjbGFzcyBkZXNjcmliZXMgdGhlIG9wdGlvbgotICAgIGZvciB0aGUgbXVs
dGlwbGUgZmlsZXMgc2VsZWN0aW9uIGV4dGVuc2lvbi4KLQotICAgIFxpbm1vZHVsZSBRdFdlYktp
dAotCi0gICAgVGhlIENob29zZU11bHRpcGxlRmlsZXNFeHRlbnNpb25PcHRpb24gY2xhc3MgaG9s
ZHMgdGhlIGZyYW1lIG9yaWdpbmF0aW5nIHRoZSByZXF1ZXN0Ci0gICAgYW5kIHRoZSBzdWdnZXN0
ZWQgZmlsZW5hbWVzIHdoaWNoIG1pZ2h0IGJlIHByb3ZpZGVkLgotCi0gICAgXHNhIFFXZWJQYWdl
OjpleHRlbnNpb24oKSwgUVdlYlBhZ2U6OmNob29zZUZpbGUoKSwgUVdlYlBhZ2U6OkNob29zZU11
bHRpcGxlRmlsZXNFeHRlbnNpb25SZXR1cm4KLSovCi0KLS8qIQotICAgIFx2YXJpYWJsZSBRV2Vi
UGFnZTo6Q2hvb3NlTXVsdGlwbGVGaWxlc0V4dGVuc2lvbk9wdGlvbjo6cGFyZW50RnJhbWUKLSAg
ICBcYnJpZWYgVGhlIGZyYW1lIGluIHdoaWNoIHRoZSByZXF1ZXN0IG9yaWdpbmF0ZWQKLSovCi0K
LS8qIQotICAgIFx2YXJpYWJsZSBRV2ViUGFnZTo6Q2hvb3NlTXVsdGlwbGVGaWxlc0V4dGVuc2lv
bk9wdGlvbjo6c3VnZ2VzdGVkRmlsZU5hbWVzCi0gICAgXGJyaWVmIFRoZSBzdWdnZXN0ZWQgZmls
ZW5hbWVzCi0qLwotCi0vKiEKLSAgICBcdmFyaWFibGUgUVdlYlBhZ2U6OkNob29zZU11bHRpcGxl
RmlsZXNFeHRlbnNpb25SZXR1cm46OmZpbGVOYW1lcwotICAgIFxicmllZiBUaGUgc2VsZWN0ZWQg
ZmlsZW5hbWVzCi0qLwotCi0vKiEKLSAgICBcY2xhc3MgUVdlYlBhZ2U6OkNob29zZU11bHRpcGxl
RmlsZXNFeHRlbnNpb25SZXR1cm4KLSAgICBcc2luY2UgNC41Ci0gICAgXGJyaWVmIFRoZSBDaG9v
c2VNdWx0aXBsZUZpbGVzRXh0ZW5zaW9uUmV0dXJuIGRlc2NyaWJlcyB0aGUgcmV0dXJuIHZhbHVl
Ci0gICAgZm9yIHRoZSBtdWx0aXBsZSBmaWxlcyBzZWxlY3Rpb24gZXh0ZW5zaW9uLgotCi0gICAg
XGlubW9kdWxlIFF0V2ViS2l0Ci0KLSAgICBUaGUgQ2hvb3NlTXVsdGlwbGVGaWxlc0V4dGVuc2lv
blJldHVybiBjbGFzcyBob2xkcyB0aGUgZmlsZW5hbWVzIHNlbGVjdGVkIGJ5IHRoZSB1c2VyCi0g
ICAgd2hlbiB0aGUgZXh0ZW5zaW9uIGlzIGludm9rZWQuCi0KLSAgICBcc2EgUVdlYlBhZ2U6OmV4
dGVuc2lvbigpLCBRV2ViUGFnZTo6Q2hvb3NlTXVsdGlwbGVGaWxlc0V4dGVuc2lvbk9wdGlvbgot
Ki8KLQotLyohCi0gICAgVGhpcyB2aXJ0dWFsIGZ1bmN0aW9uIGNhbiBiZSByZWltcGxlbWVudGVk
IGluIGEgUVdlYlBhZ2Ugc3ViY2xhc3MgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciBleHRlbnNpb25z
LiBUaGUgXGEgb3B0aW9uCi0gICAgYXJndW1lbnQgaXMgcHJvdmlkZWQgYXMgaW5wdXQgdG8gdGhl
IGV4dGVuc2lvbjsgdGhlIG91dHB1dCByZXN1bHRzIGNhbiBiZSBzdG9yZWQgaW4gXGEgb3V0cHV0
LgotCi0gICAgVGhlIGJlaGF2aW9yIG9mIHRoaXMgZnVuY3Rpb24gaXMgZGV0ZXJtaW5lZCBieSBc
YSBleHRlbnNpb24uIFRoZSBcYSBvcHRpb24KLSAgICBhbmQgXGEgb3V0cHV0IHZhbHVlcyBhcmUg
dHlwaWNhbGx5IGNhc3RlZCB0byB0aGUgY29ycmVzcG9uZGluZyB0eXBlcyAoZm9yCi0gICAgZXhh
bXBsZSwgQ2hvb3NlTXVsdGlwbGVGaWxlc0V4dGVuc2lvbk9wdGlvbiBhbmQKLSAgICBDaG9vc2VN
dWx0aXBsZUZpbGVzRXh0ZW5zaW9uUmV0dXJuIGZvciBDaG9vc2VNdWx0aXBsZUZpbGVzRXh0ZW5z
aW9uKS4KLQotICAgIFlvdSBjYW4gY2FsbCBzdXBwb3J0c0V4dGVuc2lvbigpIHRvIGNoZWNrIGlm
IGFuIGV4dGVuc2lvbiBpcyBzdXBwb3J0ZWQgYnkgdGhlIHBhZ2UuCi0KLSAgICBSZXR1cm5zIHRy
dWUgaWYgdGhlIGV4dGVuc2lvbiB3YXMgY2FsbGVkIHN1Y2Nlc3NmdWxseTsgb3RoZXJ3aXNlIHJl
dHVybnMgZmFsc2UuCi0KLSAgICBcc2Egc3VwcG9ydHNFeHRlbnNpb24oKSwgRXh0ZW5zaW9uCi0q
LwotYm9vbCBRV2ViUGFnZTo6ZXh0ZW5zaW9uKEV4dGVuc2lvbiBleHRlbnNpb24sIGNvbnN0IEV4
dGVuc2lvbk9wdGlvbiAqb3B0aW9uLCBFeHRlbnNpb25SZXR1cm4gKm91dHB1dCkKLXsKLSNpZm5k
ZWYgUVRfTk9fRklMRURJQUxPRwotICAgIGlmIChleHRlbnNpb24gPT0gQ2hvb3NlTXVsdGlwbGVG
aWxlc0V4dGVuc2lvbikgewotICAgICAgICAvLyBGSVhNRTogZG8gbm90IGlnbm9yZSBzdWdnZXN0
ZWRGaWxlcwotICAgICAgICBRU3RyaW5nTGlzdCBzdWdnZXN0ZWRGaWxlcyA9IHN0YXRpY19jYXN0
PGNvbnN0IENob29zZU11bHRpcGxlRmlsZXNFeHRlbnNpb25PcHRpb24qPihvcHRpb24pLT5zdWdn
ZXN0ZWRGaWxlTmFtZXM7Ci0gICAgICAgIFFTdHJpbmdMaXN0IG5hbWVzID0gUUZpbGVEaWFsb2c6
OmdldE9wZW5GaWxlTmFtZXModmlldygpLCBRU3RyaW5nOjpudWxsKTsKLSAgICAgICAgc3RhdGlj
X2Nhc3Q8Q2hvb3NlTXVsdGlwbGVGaWxlc0V4dGVuc2lvblJldHVybio+KG91dHB1dCktPmZpbGVO
YW1lcyA9IG5hbWVzOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0jZW5kaWYKLQotICAg
IHJldHVybiBmYWxzZTsKLX0KLQotLyohCi0gICAgVGhpcyB2aXJ0dWFsIGZ1bmN0aW9uIHJldHVy
bnMgdHJ1ZSBpZiB0aGUgd2ViIHBhZ2Ugc3VwcG9ydHMgXGEgZXh0ZW5zaW9uOyBvdGhlcndpc2Ug
ZmFsc2UgaXMgcmV0dXJuZWQuCi0KLSAgICBcc2EgZXh0ZW5zaW9uKCkKLSovCi1ib29sIFFXZWJQ
YWdlOjpzdXBwb3J0c0V4dGVuc2lvbihFeHRlbnNpb24gZXh0ZW5zaW9uKSBjb25zdAotewotI2lm
bmRlZiBRVF9OT19GSUxFRElBTE9HCi0gICAgcmV0dXJuIGV4dGVuc2lvbiA9PSBDaG9vc2VNdWx0
aXBsZUZpbGVzRXh0ZW5zaW9uOwotI2Vsc2UKLSAgICBRX1VOVVNFRChleHRlbnNpb24pOwotICAg
IHJldHVybiBmYWxzZTsKLSNlbmRpZgotfQotCi0vKiEKLSAqIFxpbnRlcm5hbAotICovCi1RV2Vi
UGFnZUFkYXB0ZXIgKlFXZWJQYWdlOjpoYW5kbGUoKSBjb25zdAotewotICAgIHJldHVybiBkOwot
fQotCi0vKiEKLSAgICBGaW5kcyB0aGUgc3BlY2lmaWVkIHN0cmluZywgXGEgc3ViU3RyaW5nLCBp
biB0aGUgcGFnZSwgdXNpbmcgdGhlIGdpdmVuIFxhIG9wdGlvbnMuCi0KLSAgICBJZiB0aGUgSGln
aGxpZ2h0QWxsT2NjdXJyZW5jZXMgZmxhZyBpcyBwYXNzZWQsIHRoZSBmdW5jdGlvbiB3aWxsIGhp
Z2hsaWdodCBhbGwgb2NjdXJyZW5jZXMKLSAgICB0aGF0IGV4aXN0IGluIHRoZSBwYWdlLiBBbGwg
c3Vic2VxdWVudCBjYWxscyB3aWxsIGV4dGVuZCB0aGUgaGlnaGxpZ2h0LCByYXRoZXIgdGhhbgot
ICAgIHJlcGxhY2UgaXQsIHdpdGggb2NjdXJyZW5jZXMgb2YgdGhlIG5ldyBzdHJpbmcuCi0KLSAg
ICBJZiB0aGUgSGlnaGxpZ2h0QWxsT2NjdXJyZW5jZXMgZmxhZyBpcyBub3QgcGFzc2VkLCB0aGUg
ZnVuY3Rpb24gd2lsbCBzZWxlY3QgYW4gb2NjdXJyZW5jZQotICAgIGFuZCBhbGwgc3Vic2VxdWVu
dCBjYWxscyB3aWxsIHJlcGxhY2UgdGhlIGN1cnJlbnQgb2NjdXJyZW5jZSB3aXRoIHRoZSBuZXh0
IG9uZS4KLQotICAgIFRvIGNsZWFyIHRoZSBzZWxlY3Rpb24sIGp1c3QgcGFzcyBhbiBlbXB0eSBz
dHJpbmcuCi0KLSAgICBSZXR1cm5zIHRydWUgaWYgXGEgc3ViU3RyaW5nIHdhcyBmb3VuZDsgb3Ro
ZXJ3aXNlIHJldHVybnMgZmFsc2UuCi0qLwotYm9vbCBRV2ViUGFnZTo6ZmluZFRleHQoY29uc3Qg
UVN0cmluZyAmc3ViU3RyaW5nLCBGaW5kRmxhZ3Mgb3B0aW9ucykKLXsKLSAgICA6OlRleHRDYXNl
U2Vuc2l0aXZpdHkgY2FzZVNlbnNpdGl2aXR5ID0gOjpUZXh0Q2FzZUluc2Vuc2l0aXZlOwotICAg
IGlmIChvcHRpb25zICYgRmluZENhc2VTZW5zaXRpdmVseSkKLSAgICAgICAgY2FzZVNlbnNpdGl2
aXR5ID0gOjpUZXh0Q2FzZVNlbnNpdGl2ZTsKLQotICAgIGlmIChvcHRpb25zICYgSGlnaGxpZ2h0
QWxsT2NjdXJyZW5jZXMpIHsKLSAgICAgICAgaWYgKHN1YlN0cmluZy5pc0VtcHR5KCkpIHsKLSAg
ICAgICAgICAgIGQtPnBhZ2UtPnVubWFya0FsbFRleHRNYXRjaGVzKCk7Ci0gICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICByZXR1cm4gZC0+cGFnZS0+
bWFya0FsbE1hdGNoZXNGb3JUZXh0KHN1YlN0cmluZywgY2FzZVNlbnNpdGl2aXR5LCB0cnVlLCAw
KTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoc3ViU3RyaW5nLmlzRW1wdHkoKSkgewotICAg
ICAgICAgICAgZC0+cGFnZS0+bWFpbkZyYW1lKCktPnNlbGVjdGlvbigpLT5jbGVhcigpOwotICAg
ICAgICAgICAgRnJhbWUqIGZyYW1lID0gZC0+cGFnZS0+bWFpbkZyYW1lKCktPnRyZWUoKS0+Zmly
c3RDaGlsZCgpOwotICAgICAgICAgICAgd2hpbGUgKGZyYW1lKSB7Ci0gICAgICAgICAgICAgICAg
ZnJhbWUtPnNlbGVjdGlvbigpLT5jbGVhcigpOwotICAgICAgICAgICAgICAgIGZyYW1lID0gZnJh
bWUtPnRyZWUoKS0+dHJhdmVyc2VOZXh0V2l0aFdyYXAoZmFsc2UpOwotICAgICAgICAgICAgfQot
ICAgICAgICB9Ci0gICAgICAgIDo6RmluZERpcmVjdGlvbiBkaXJlY3Rpb24gPSA6OkZpbmREaXJl
Y3Rpb25Gb3J3YXJkOwotICAgICAgICBpZiAob3B0aW9ucyAmIEZpbmRCYWNrd2FyZCkKLSAgICAg
ICAgICAgIGRpcmVjdGlvbiA9IDo6RmluZERpcmVjdGlvbkJhY2t3YXJkOwotCi0gICAgICAgIGNv
bnN0IGJvb2wgc2hvdWxkV3JhcCA9IG9wdGlvbnMgJiBGaW5kV3JhcHNBcm91bmREb2N1bWVudDsK
LQotICAgICAgICByZXR1cm4gZC0+cGFnZS0+ZmluZFN0cmluZyhzdWJTdHJpbmcsIGNhc2VTZW5z
aXRpdml0eSwgZGlyZWN0aW9uLCBzaG91bGRXcmFwKTsKLSAgICB9Ci19Ci0KLS8qIQotICAgIFJl
dHVybnMgYSBwb2ludGVyIHRvIHRoZSBwYWdlJ3Mgc2V0dGluZ3Mgb2JqZWN0LgotCi0gICAgXHNh
IFFXZWJTZXR0aW5nczo6Z2xvYmFsU2V0dGluZ3MoKQotKi8KLVFXZWJTZXR0aW5ncyAqUVdlYlBh
Z2U6OnNldHRpbmdzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZC0+c2V0dGluZ3M7Ci19Ci0KLS8q
IQotICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHdlYiBjb250ZW50IHJlcXVl
c3RzIGEgZmlsZSBuYW1lLCBmb3IgZXhhbXBsZQotICAgIGFzIGEgcmVzdWx0IG9mIHRoZSB1c2Vy
IGNsaWNraW5nIG9uIGEgImZpbGUgdXBsb2FkIiBidXR0b24gaW4gYSBIVE1MIGZvcm0uCi0KLSAg
ICBBIHN1Z2dlc3RlZCBmaWxlbmFtZSBtYXkgYmUgcHJvdmlkZWQgaW4gXGEgc3VnZ2VzdGVkRmls
ZS4gVGhlIGZyYW1lIG9yaWdpbmF0aW5nIHRoZQotICAgIHJlcXVlc3QgaXMgcHJvdmlkZWQgYXMg
XGEgcGFyZW50RnJhbWUuCi0KLSAgICBcc2EgQ2hvb3NlTXVsdGlwbGVGaWxlc0V4dGVuc2lvbgot
Ki8KLVFTdHJpbmcgUVdlYlBhZ2U6OmNob29zZUZpbGUoUVdlYkZyYW1lICpwYXJlbnRGcmFtZSwg
Y29uc3QgUVN0cmluZyYgc3VnZ2VzdGVkRmlsZSkKLXsKLSAgICBRX1VOVVNFRChwYXJlbnRGcmFt
ZSkKLSNpZm5kZWYgUVRfTk9fRklMRURJQUxPRwotICAgIHJldHVybiBRRmlsZURpYWxvZzo6Z2V0
T3BlbkZpbGVOYW1lKHZpZXcoKSwgUVN0cmluZzo6bnVsbCwgc3VnZ2VzdGVkRmlsZSk7Ci0jZWxz
ZQotICAgIHJldHVybiBRU3RyaW5nOjpudWxsOwotI2VuZGlmCi19Ci0KLS8qIQotICAgIFNldHMg
dGhlIFFOZXR3b3JrQWNjZXNzTWFuYWdlciBcYSBtYW5hZ2VyIHJlc3BvbnNpYmxlIGZvciBzZXJ2
aW5nIG5ldHdvcmsgcmVxdWVzdHMgZm9yIHRoaXMKLSAgICBRV2ViUGFnZS4KLQotICAgIFxub3Rl
IEl0IGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkIHRvIGNoYW5nZSB0aGUgbmV0d29yayBhY2Nl
c3MgbWFuYWdlciBhZnRlciB0aGUKLSAgICBRV2ViUGFnZSBoYXMgdXNlZCBpdC4gVGhlIHJlc3Vs
dHMgb2YgZG9pbmcgdGhpcyBhcmUgdW5kZWZpbmVkLgotCi0gICAgXHNhIG5ldHdvcmtBY2Nlc3NN
YW5hZ2VyKCkKLSovCi12b2lkIFFXZWJQYWdlOjpzZXROZXR3b3JrQWNjZXNzTWFuYWdlcihRTmV0
d29ya0FjY2Vzc01hbmFnZXIgKm1hbmFnZXIpCi17Ci0gICAgZC0+c2V0TmV0d29ya0FjY2Vzc01h
bmFnZXIobWFuYWdlcik7Ci19Ci0KLS8qIQotICAgIFJldHVybnMgdGhlIFFOZXR3b3JrQWNjZXNz
TWFuYWdlciB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciBzZXJ2aW5nIG5ldHdvcmsKLSAgICByZXF1
ZXN0cyBmb3IgdGhpcyBRV2ViUGFnZS4KLQotICAgIFxzYSBzZXROZXR3b3JrQWNjZXNzTWFuYWdl
cigpCi0qLwotUU5ldHdvcmtBY2Nlc3NNYW5hZ2VyICpRV2ViUGFnZTo6bmV0d29ya0FjY2Vzc01h
bmFnZXIoKSBjb25zdAotewotICAgIHJldHVybiBkLT5uZXR3b3JrQWNjZXNzTWFuYWdlcigpOwot
fQotCi0vKiEKLSAgICBTZXRzIHRoZSBRV2ViUGx1Z2luRmFjdG9yeSBcYSBmYWN0b3J5IHJlc3Bv
bnNpYmxlIGZvciBjcmVhdGluZyBwbHVnaW5zIGVtYmVkZGVkIGludG8gdGhpcwotICAgIFFXZWJQ
YWdlLgotCi0gICAgTm90ZTogVGhlIHBsdWdpbiBmYWN0b3J5IGlzIG9ubHkgdXNlZCBpZiB0aGUg
UVdlYlNldHRpbmdzOjpQbHVnaW5zRW5hYmxlZCBhdHRyaWJ1dGUgaXMgZW5hYmxlZC4KLQotICAg
IFxzYSBwbHVnaW5GYWN0b3J5KCkKLSovCi12b2lkIFFXZWJQYWdlOjpzZXRQbHVnaW5GYWN0b3J5
KFFXZWJQbHVnaW5GYWN0b3J5ICpmYWN0b3J5KQotewotICAgIGQtPnBsdWdpbkZhY3RvcnkgPSBm
YWN0b3J5OwotfQotCi0vKiEKLSAgICBSZXR1cm5zIHRoZSBRV2ViUGx1Z2luRmFjdG9yeSB0aGF0
IGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBwbHVnaW5zIGVtYmVkZGVkIGludG8KLSAgICB0
aGlzIFFXZWJQYWdlLiBJZiBubyBwbHVnaW4gZmFjdG9yeSBpcyBpbnN0YWxsZWQgYSBudWxsIHBv
aW50ZXIgaXMgcmV0dXJuZWQuCi0KLSAgICBcc2Egc2V0UGx1Z2luRmFjdG9yeSgpCi0qLwotUVdl
YlBsdWdpbkZhY3RvcnkgKlFXZWJQYWdlOjpwbHVnaW5GYWN0b3J5KCkgY29uc3QKLXsKLSAgICBy
ZXR1cm4gZC0+cGx1Z2luRmFjdG9yeTsKLX0KLQotLyohCi0gICAgVGhpcyBmdW5jdGlvbiBpcyBj
YWxsZWQgd2hlbiBhIHVzZXIgYWdlbnQgZm9yIEhUVFAgcmVxdWVzdHMgaXMgbmVlZGVkLiBZb3Ug
Y2FuIHJlaW1wbGVtZW50IHRoaXMKLSAgICBmdW5jdGlvbiB0byBkeW5hbWljYWxseSByZXR1cm4g
ZGlmZmVyZW50IHVzZXIgYWdlbnRzIGZvciBkaWZmZXJlbnQgVVJMcywgYmFzZWQgb24gdGhlIFxh
IHVybCBwYXJhbWV0ZXIuCi0KLSAgICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5z
IHRoZSBmb2xsb3dpbmcgdmFsdWU6Ci0KLSAgICAiTW96aWxsYS81LjAgKCVQbGF0Zm9ybSUlU2Vj
dXJpdHklJVN1YnBsYXRmb3JtJSkgQXBwbGVXZWJLaXQvJVdlYktpdFZlcnNpb24lIChLSFRNTCwg
bGlrZSBHZWNrbykgJUFwcFZlcnNpb24gU2FmYXJpLyVXZWJLaXRWZXJzaW9uJSIKLQotICAgIElu
IHRoaXMgc3RyaW5nIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSByZXBsYWNlZCBhdCBydW4tdGlt
ZToKLSAgICBcbGlzdAotICAgIFxsaSAlUGxhdGZvcm0lIGV4cGFuZHMgdG8gdGhlIHdpbmRvd2lu
ZyBzeXN0ZW0gZm9sbG93ZWQgYnkgIjsgIiBpZiBpdCBpcyBub3QgV2luZG93cyAoZS5nLiAiWDEx
OyAiKS4KLSAgICBcbGkgJVNlY3VyaXR5JSBleHBhbmRzIHRvICJOOyAiIGlmIFNTTCBpcyBkaXNh
YmxlZC4KLSAgICBcbGkgJVN1YnBsYXRmb3JtJSBleHBhbmRzIHRvIHRoZSBvcGVyYXRpbmcgc3lz
dGVtIHZlcnNpb24gKGUuZy4gIldpbmRvd3MgTlQgNi4xIiBvciAiSW50ZWwgTWFjIE9TIFggMTAu
NSIpLgotICAgIFxsaSAlV2ViS2l0VmVyc2lvbiUgaXMgdGhlIHZlcnNpb24gb2YgV2ViS2l0IHRo
ZSBhcHBsaWNhdGlvbiB3YXMgY29tcGlsZWQgYWdhaW5zdC4KLSAgICBcbGkgJUFwcFZlcnNpb24l
IGV4cGFuZHMgdG8gUUNvcmVBcHBsaWNhdGlvbjo6YXBwbGljYXRpb25OYW1lKCkvUUNvcmVBcHBs
aWNhdGlvbjo6YXBwbGljYXRpb25WZXJzaW9uKCkgaWYgdGhleSdyZSBzZXQ7IG90aGVyd2lzZSBk
ZWZhdWx0aW5nIHRvIFF0IGFuZCB0aGUgY3VycmVudCBRdCB2ZXJzaW9uLgotICAgIFxlbmRsaXN0
Ci0qLwotUVN0cmluZyBRV2ViUGFnZTo6dXNlckFnZW50Rm9yVXJsKGNvbnN0IFFVcmwmKSBjb25z
dAotewotICAgIHJldHVybiBVc2VyQWdlbnRRdDo6c3RhbmRhcmRVc2VyQWdlbnQoIiIsIFdFQktJ
VF9NQUpPUl9WRVJTSU9OLCBXRUJLSVRfTUlOT1JfVkVSU0lPTik7Ci19Ci0KLQotdm9pZCBRV2Vi
UGFnZVByaXZhdGU6Ol9xX29uTG9hZFByb2dyZXNzQ2hhbmdlZChpbnQpCi17Ci0gICAgbV90b3Rh
bEJ5dGVzID0gcGFnZS0+cHJvZ3Jlc3MoKS0+dG90YWxQYWdlQW5kUmVzb3VyY2VCeXRlc1RvTG9h
ZCgpOwotICAgIG1fYnl0ZXNSZWNlaXZlZCA9IHBhZ2UtPnByb2dyZXNzKCktPnRvdGFsQnl0ZXNS
ZWNlaXZlZCgpOwotfQotCi0KLS8qIQotICAgIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBi
eXRlcyB0aGF0IHdlcmUgcmVjZWl2ZWQgZnJvbSB0aGUgbmV0d29yayB0byByZW5kZXIgdGhlIGN1
cnJlbnQgcGFnZSwKLSAgICBpbmNsdWRpbmcgZXh0cmEgY29udGVudCBzdWNoIGFzIGVtYmVkZGVk
IGltYWdlcy4KLQotICAgIFxzYSBieXRlc1JlY2VpdmVkKCkKLSovCi1xdWludDY0IFFXZWJQYWdl
Ojp0b3RhbEJ5dGVzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZC0+bV90b3RhbEJ5dGVzOwotfQot
Ci0KLS8qIQotICAgIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdlcmUgcmVjZWl2
ZWQgZnJvbSB0aGUgbmV0d29yayB0byByZW5kZXIgdGhlIGN1cnJlbnQgcGFnZS4KLQotICAgIFxz
YSB0b3RhbEJ5dGVzKCksIGxvYWRQcm9ncmVzcygpCi0qLwotcXVpbnQ2NCBRV2ViUGFnZTo6Ynl0
ZXNSZWNlaXZlZCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGQtPm1fYnl0ZXNSZWNlaXZlZDsKLX0K
LQotLyohCi0gICAgXHNpbmNlIDQuOAotICAgIFxmbiB2b2lkIFFXZWJQYWdlOjp2aWV3cG9ydENo
YW5nZVJlcXVlc3RlZCgpCi0KLSAgICBQYWdlIGF1dGhvcnMgY2FuIHByb3ZpZGUgdGhlIHN1cHBs
aWVkIHZhbHVlcyBieSB1c2luZyB0aGUgdmlld3BvcnQgbWV0YSB0YWcuIE1vcmUgaW5mb3JtYXRp
b24KLSAgICBhYm91dCB0aGlzIGNhbiBiZSBmb3VuZCBhdCBcbHtodHRwOi8vZGV2ZWxvcGVyLmFw
cGxlLmNvbS9zYWZhcmkvbGlicmFyeS9kb2N1bWVudGF0aW9uL2FwcGxlYXBwbGljYXRpb25zL3Jl
ZmVyZW5jZS9zYWZhcml3ZWJjb250ZW50L3VzaW5ndGhldmlld3BvcnQvdXNpbmd0aGV2aWV3cG9y
dC5odG1sfXtTYWZhcmkgUmVmZXJlbmNlIExpYnJhcnk6IFVzaW5nIHRoZSBWaWV3cG9ydCBNZXRh
IFRhZ30uCi0KLSAgICBcc2EgUVdlYlBhZ2U6OlZpZXdwb3J0QXR0cmlidXRlcywgc2V0UHJlZmVy
cmVkQ29udGVudHNTaXplKCksIFFHcmFwaGljc1dlYlZpZXc6OnNldFNjYWxlKCkKLSovCi0KLS8q
IQotICAgIFxmbiB2b2lkIFFXZWJQYWdlOjpsb2FkU3RhcnRlZCgpCi0KLSAgICBUaGlzIHNpZ25h
bCBpcyBlbWl0dGVkIHdoZW4gYSBwYWdlIHN0YXJ0cyBsb2FkaW5nIGNvbnRlbnQuCi0KLSAgICBc
c2EgbG9hZEZpbmlzaGVkKCkKLSovCi0KLS8qIQotICAgIFxmbiB2b2lkIFFXZWJQYWdlOjpsb2Fk
UHJvZ3Jlc3MoaW50IHByb2dyZXNzKQotCi0gICAgVGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVu
IHRoZSBnbG9iYWwgcHJvZ3Jlc3Mgc3RhdHVzIGNoYW5nZXMuCi0gICAgVGhlIGN1cnJlbnQgdmFs
dWUgaXMgcHJvdmlkZWQgYnkgXGEgcHJvZ3Jlc3MgYW5kIHNjYWxlcyBmcm9tIDAgdG8gMTAwLAot
ICAgIHdoaWNoIGlzIHRoZSBkZWZhdWx0IHJhbmdlIG9mIFFQcm9ncmVzc0Jhci4KLSAgICBJdCBh
Y2N1bXVsYXRlcyBjaGFuZ2VzIGZyb20gYWxsIHRoZSBjaGlsZCBmcmFtZXMuCi0KLSAgICBcc2Eg
Ynl0ZXNSZWNlaXZlZCgpCi0qLwotCi0vKiEKLSAgICBcZm4gdm9pZCBRV2ViUGFnZTo6bG9hZEZp
bmlzaGVkKGJvb2wgb2spCi0KLSAgICBUaGlzIHNpZ25hbCBpcyBlbWl0dGVkIHdoZW4gdGhlIHBh
Z2UgZmluaXNoZXMgbG9hZGluZyBjb250ZW50LiBUaGlzIHNpZ25hbAotICAgIGlzIGluZGVwZW5k
YW50IG9mIHNjcmlwdCBleGVjdXRpb24gb3IgcGFnZSByZW5kZXJpbmcuCi0gICAgXGEgb2sgd2ls
bCBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBsb2FkIHdhcyBzdWNjZXNzZnVsIG9yIGFueSBlcnJvciBv
Y2N1cnJlZC4KLQotICAgIFxzYSBsb2FkU3RhcnRlZCgpLCBFcnJvclBhZ2VFeHRlbnNpb24KLSov
Ci0KLS8qIQotICAgIFxmbiB2b2lkIFFXZWJQYWdlOjpsaW5rSG92ZXJlZChjb25zdCBRU3RyaW5n
ICZsaW5rLCBjb25zdCBRU3RyaW5nICZ0aXRsZSwgY29uc3QgUVN0cmluZyAmdGV4dENvbnRlbnQp
Ci0KLSAgICBUaGlzIHNpZ25hbCBpcyBlbWl0dGVkIHdoZW4gdGhlIG1vdXNlIGhvdmVycyBvdmVy
IGEgbGluay4KLQotICAgIFxhIGxpbmsgY29udGFpbnMgdGhlIGxpbmsgdXJsLgotICAgIFxhIHRp
dGxlIGlzIHRoZSBsaW5rIGVsZW1lbnQncyB0aXRsZSwgaWYgaXQgaXMgc3BlY2lmaWVkIGluIHRo
ZSBtYXJrdXAuCi0gICAgXGEgdGV4dENvbnRlbnQgcHJvdmlkZXMgdGV4dCB3aXRoaW4gdGhlIGxp
bmsgZWxlbWVudCwgZS5nLiwgdGV4dCBpbnNpZGUgYW4gSFRNTCBhbmNob3IgdGFnLgotCi0gICAg
V2hlbiB0aGUgbW91c2UgbGVhdmVzIHRoZSBsaW5rIGVsZW1lbnQgdGhlIHNpZ25hbCBpcyBlbWl0
dGVkIHdpdGggZW1wdHkgcGFyYW1ldGVycy4KLQotICAgIFxzYSBsaW5rQ2xpY2tlZCgpCi0qLwot
Ci0vKiEKLSAgICBcZm4gdm9pZCBRV2ViUGFnZTo6c3RhdHVzQmFyTWVzc2FnZShjb25zdCBRU3Ry
aW5nJiB0ZXh0KQotCi0gICAgVGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuIHRoZSBzdGF0dXNi
YXIgXGEgdGV4dCBpcyBjaGFuZ2VkIGJ5IHRoZSBwYWdlLgotKi8KLQotLyohCi0gICAgXGZuIHZv
aWQgUVdlYlBhZ2U6OmZyYW1lQ3JlYXRlZChRV2ViRnJhbWUgKmZyYW1lKQotCi0gICAgVGhpcyBz
aWduYWwgaXMgZW1pdHRlZCB3aGVuZXZlciB0aGUgcGFnZSBjcmVhdGVzIGEgbmV3IFxhIGZyYW1l
LgotCi0gICAgXHNhIGN1cnJlbnRGcmFtZSgpCi0qLwotCi0vKiEKLSAgICBcZm4gdm9pZCBRV2Vi
UGFnZTo6c2VsZWN0aW9uQ2hhbmdlZCgpCi0KLSAgICBUaGlzIHNpZ25hbCBpcyBlbWl0dGVkIHdo
ZW5ldmVyIHRoZSBzZWxlY3Rpb24gY2hhbmdlcywgZWl0aGVyIGludGVyYWN0aXZlbHkKLSAgICBv
ciBwcm9ncmFtbWF0aWNhbGx5IChlLmcuIGJ5IGNhbGxpbmcgdHJpZ2dlckFjdGlvbigpIHdpdGgg
YSBzZWxlY3Rpb24gYWN0aW9uKS4KLQotICAgIFxzYSBzZWxlY3RlZFRleHQoKQotKi8KLQotLyoh
Ci0gICAgXGZuIHZvaWQgUVdlYlBhZ2U6OmNvbnRlbnRzQ2hhbmdlZCgpCi0gICAgXHNpbmNlIDQu
NQotCi0gICAgVGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuZXZlciB0aGUgdGV4dCBpbiBmb3Jt
IGVsZW1lbnRzIGNoYW5nZXMKLSAgICBhcyB3ZWxsIGFzIG90aGVyIGVkaXRhYmxlIGNvbnRlbnQu
Ci0KLSAgICBcc2EgY29udGVudEVkaXRhYmxlLCBtb2RpZmllZCwgUVdlYkZyYW1lOjp0b0h0bWwo
KSwgUVdlYkZyYW1lOjp0b1BsYWluVGV4dCgpCi0qLwotCi0vKiEKLSAgICBcZm4gdm9pZCBRV2Vi
UGFnZTo6Z2VvbWV0cnlDaGFuZ2VSZXF1ZXN0ZWQoY29uc3QgUVJlY3QmIGdlb20pCi0KLSAgICBU
aGlzIHNpZ25hbCBpcyBlbWl0dGVkIHdoZW5ldmVyIHRoZSBkb2N1bWVudCB3YW50cyB0byBjaGFu
Z2UgdGhlIHBvc2l0aW9uIGFuZCBzaXplIG9mIHRoZQotICAgIHBhZ2UgdG8gXGEgZ2VvbS4gVGhp
cyBjYW4gaGFwcGVuIGZvciBleGFtcGxlIHRocm91Z2ggSmF2YVNjcmlwdC4KLSovCi0KLS8qIQot
ICAgIFxmbiB2b2lkIFFXZWJQYWdlOjpyZXBhaW50UmVxdWVzdGVkKGNvbnN0IFFSZWN0JiBkaXJ0
eVJlY3QpCi0KLSAgICBUaGlzIHNpZ25hbCBpcyBlbWl0dGVkIHdoZW5ldmVyIHRoaXMgUVdlYlBh
Z2Ugc2hvdWxkIGJlIHVwZGF0ZWQuIEl0J3MgdXNlZnVsCi0gICAgd2hlbiByZW5kZXJpbmcgYSBR
V2ViUGFnZSB3aXRob3V0IGEgUVdlYlZpZXcgb3IgUUdyYXBoaWNzV2ViVmlldy4KLSAgICBcYSBk
aXJ0eVJlY3QgY29udGFpbnMgdGhlIGFyZWEgdGhhdCBuZWVkcyB0byBiZSB1cGRhdGVkLiBUbyBw
YWludCB0aGUgUVdlYlBhZ2UgZ2V0Ci0gICAgdGhlIG1haW5GcmFtZSgpIGFuZCBjYWxsIHRoZSBy
ZW5kZXIoUVBhaW50ZXIqLCBjb25zdCBRUmVnaW9uJikgbWV0aG9kIHdpdGggdGhlCi0gICAgXGEg
ZGlydHlSZWN0IGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyLgotCi0gICAgXHNhIG1haW5GcmFtZSgp
Ci0gICAgXHNhIHZpZXcoKQotKi8KLQotLyohCi0gICAgXGZuIHZvaWQgUVdlYlBhZ2U6OnNjcm9s
bFJlcXVlc3RlZChpbnQgZHgsIGludCBkeSwgY29uc3QgUVJlY3QmIHJlY3RUb1Njcm9sbCkKLQot
ICAgIFRoaXMgc2lnbmFsIGlzIGVtaXR0ZWQgd2hlbmV2ZXIgdGhlIGNvbnRlbnQgZ2l2ZW4gYnkg
XGEgcmVjdFRvU2Nyb2xsIG5lZWRzCi0gICAgdG8gYmUgc2Nyb2xsZWQgXGEgZHggYW5kIFxhIGR5
IGRvd253YXJkcyBhbmQgbm8gdmlldyB3YXMgc2V0LgotCi0gICAgXHNhIHZpZXcoKQotKi8KLQot
LyohCi0gICAgXGZuIHZvaWQgUVdlYlBhZ2U6OndpbmRvd0Nsb3NlUmVxdWVzdGVkKCkKLQotICAg
IFRoaXMgc2lnbmFsIGlzIGVtaXR0ZWQgd2hlbmV2ZXIgdGhlIHBhZ2UgcmVxdWVzdHMgdGhlIHdl
YiBicm93c2VyIHdpbmRvdyB0byBiZSBjbG9zZWQsCi0gICAgZm9yIGV4YW1wbGUgdGhyb3VnaCB0
aGUgSmF2YVNjcmlwdCBcY3t3aW5kb3cuY2xvc2UoKX0gY2FsbC4KLSovCi0KLS8qIQotICAgIFxm
biB2b2lkIFFXZWJQYWdlOjpwcmludFJlcXVlc3RlZChRV2ViRnJhbWUgKmZyYW1lKQotCi0gICAg
VGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuZXZlciB0aGUgcGFnZSByZXF1ZXN0cyB0aGUgd2Vi
IGJyb3dzZXIgdG8gcHJpbnQgXGEgZnJhbWUsCi0gICAgZm9yIGV4YW1wbGUgdGhyb3VnaCB0aGUg
SmF2YVNjcmlwdCBcY3t3aW5kb3cucHJpbnQoKX0gY2FsbC4KLQotICAgIFxzYSBRV2ViRnJhbWU6
OnByaW50KCksIFFQcmludFByZXZpZXdEaWFsb2cKLSovCi0KLS8qIQotICAgIFxmbiB2b2lkIFFX
ZWJQYWdlOjp1bnN1cHBvcnRlZENvbnRlbnQoUU5ldHdvcmtSZXBseSAqcmVwbHkpCi0KLSAgICBU
aGlzIHNpZ25hbCBpcyBlbWl0dGVkIHdoZW4gV2ViS2l0IGNhbm5vdCBoYW5kbGUgYSBsaW5rIHRo
ZSB1c2VyIG5hdmlnYXRlZCB0byBvciBhCi0gICAgd2ViIHNlcnZlcidzIHJlc3BvbnNlIGluY2x1
ZGVzIGEgIkNvbnRlbnQtRGlzcG9zaXRpb24iIGhlYWRlciB3aXRoIHRoZSAnYXR0YWNobWVudCcg
Ci0gICAgZGlyZWN0aXZlLiBJZiAiQ29udGVudC1EaXNwb3NpdGlvbiIgaXMgcHJlc2VudCBpbiBc
YSByZXBseSwgdGhlIHdlYiBzZXJ2ZXIgaXMgaW5kaWNhdGluZwotICAgIHRoYXQgdGhlIGNsaWVu
dCBzaG91bGQgcHJvbXB0IHRoZSB1c2VyIHRvIHNhdmUgdGhlIGNvbnRlbnQgcmVnYXJkbGVzcyBv
ZiBjb250ZW50LXR5cGUuIAotICAgIFNlZSBSRkMgMjYxNiBzZWN0aW9ucyAxOS41LjEgZm9yIGRl
dGFpbHMgYWJvdXQgQ29udGVudC1EaXNwb3NpdGlvbi4KLQotICAgIEF0IHNpZ25hbCBlbWlzc2lv
biB0aW1lIHRoZSBtZXRhLWRhdGEgb2YgdGhlIFFOZXR3b3JrUmVwbHkgXGEgcmVwbHkgaXMgYXZh
aWxhYmxlLgotCi0gICAgXG5vdGUgVGhlIHJlY2VpdmluZyBzbG90IGlzIHJlc3BvbnNpYmxlIGZv
ciBkZWxldGluZyB0aGUgUU5ldHdvcmtSZXBseSBcYSByZXBseS4KLQotICAgIFxub3RlIFRoaXMg
c2lnbmFsIGlzIG9ubHkgZW1pdHRlZCBpZiB0aGUgZm9yd2FyZFVuc3VwcG9ydGVkQ29udGVudCBw
cm9wZXJ0eSBpcyBzZXQgdG8gdHJ1ZS4KLQotICAgIFxzYSBkb3dubG9hZFJlcXVlc3RlZCgpCi0q
LwotCi0vKiEKLSAgICBcZm4gdm9pZCBRV2ViUGFnZTo6ZG93bmxvYWRSZXF1ZXN0ZWQoY29uc3Qg
UU5ldHdvcmtSZXF1ZXN0ICZyZXF1ZXN0KQotCi0gICAgVGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3
aGVuIHRoZSB1c2VyIGRlY2lkZXMgdG8gZG93bmxvYWQgYSBsaW5rLiBUaGUgdXJsIG9mCi0gICAg
dGhlIGxpbmsgYXMgd2VsbCBhcyBhZGRpdGlvbmFsIG1ldGEtaW5mb3JtYXRpb24gaXMgY29udGFp
bmVkIGluIFxhIHJlcXVlc3QuCi0KLSAgICBcc2EgdW5zdXBwb3J0ZWRDb250ZW50KCkKLSovCi0K
LS8qIQotICAgIFxmbiB2b2lkIFFXZWJQYWdlOjptaWNyb0ZvY3VzQ2hhbmdlZCgpCi0KLSAgICBU
aGlzIHNpZ25hbCBpcyBlbWl0dGVkIHdoZW4gZm9yIGV4YW1wbGUgdGhlIHBvc2l0aW9uIG9mIHRo
ZSBjdXJzb3IgaW4gYW4gZWRpdGFibGUgZm9ybQotICAgIGVsZW1lbnQgY2hhbmdlcy4gSXQgaXMg
dXNlZCB0byBpbmZvcm0gaW5wdXQgbWV0aG9kcyBhYm91dCB0aGUgbmV3IG9uLXNjcmVlbiBwb3Np
dGlvbiB3aGVyZQotICAgIHRoZSB1c2VyIGlzIGFibGUgdG8gZW50ZXIgdGV4dC4gVGhpcyBzaWdu
YWwgaXMgdXN1YWxseSBjb25uZWN0ZWQgdG8gdGhlCi0gICAgUVdpZGdldDo6dXBkYXRlTWljcm9G
b2N1cygpIHNsb3QuCi0qLwotCi0vKiEKLSAgICBcZm4gdm9pZCBRV2ViUGFnZTo6bGlua0NsaWNr
ZWQoY29uc3QgUVVybCAmdXJsKQotCi0gICAgVGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuZXZl
ciB0aGUgdXNlciBjbGlja3Mgb24gYSBsaW5rIGFuZCB0aGUgcGFnZSdzIGxpbmtEZWxlZ2F0aW9u
UG9saWN5Ci0gICAgcHJvcGVydHkgaXMgc2V0IHRvIGRlbGVnYXRlIHRoZSBsaW5rIGhhbmRsaW5n
IGZvciB0aGUgc3BlY2lmaWVkIFxhIHVybC4KLQotICAgIEJ5IGRlZmF1bHQgbm8gbGlua3MgYXJl
IGRlbGVnYXRlZCBhbmQgYXJlIGhhbmRsZWQgYnkgUVdlYlBhZ2UgaW5zdGVhZC4KLQotICAgIFxu
b3RlIFRoaXMgc2lnbmFsIHBvc3NpYmx5IHdvbid0IGJlIGVtaXR0ZWQgZm9yIGNsaWNrZWQgbGlu
a3Mgd2hpY2ggdXNlCi0gICAgSmF2YVNjcmlwdCB0byB0cmlnZ2VyIG5hdmlnYXRpb24uCi0KLSAg
ICBcc2EgbGlua0hvdmVyZWQoKQotKi8KLQotLyohCi0gICAgXGZuIHZvaWQgUVdlYlBhZ2U6OnRv
b2xCYXJWaXNpYmlsaXR5Q2hhbmdlUmVxdWVzdGVkKGJvb2wgdmlzaWJsZSkKLQotICAgIFRoaXMg
c2lnbmFsIGlzIGVtaXR0ZWQgd2hlbmV2ZXIgdGhlIHZpc2liaWxpdHkgb2YgdGhlIHRvb2xiYXIg
aW4gYSB3ZWIgYnJvd3NlcgotICAgIHdpbmRvdyB0aGF0IGhvc3RzIFFXZWJQYWdlIHNob3VsZCBi
ZSBjaGFuZ2VkIHRvIFxhIHZpc2libGUuCi0qLwotCi0vKiEKLSAgICBcZm4gdm9pZCBRV2ViUGFn
ZTo6c3RhdHVzQmFyVmlzaWJpbGl0eUNoYW5nZVJlcXVlc3RlZChib29sIHZpc2libGUpCi0KLSAg
ICBUaGlzIHNpZ25hbCBpcyBlbWl0dGVkIHdoZW5ldmVyIHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBz
dGF0dXNiYXIgaW4gYSB3ZWIgYnJvd3NlcgotICAgIHdpbmRvdyB0aGF0IGhvc3RzIFFXZWJQYWdl
IHNob3VsZCBiZSBjaGFuZ2VkIHRvIFxhIHZpc2libGUuCi0qLwotCi0vKiEKLSAgICBcZm4gdm9p
ZCBRV2ViUGFnZTo6bWVudUJhclZpc2liaWxpdHlDaGFuZ2VSZXF1ZXN0ZWQoYm9vbCB2aXNpYmxl
KQotCi0gICAgVGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuZXZlciB0aGUgdmlzaWJpbGl0eSBv
ZiB0aGUgbWVudWJhciBpbiBhIHdlYiBicm93c2VyCi0gICAgd2luZG93IHRoYXQgaG9zdHMgUVdl
YlBhZ2Ugc2hvdWxkIGJlIGNoYW5nZWQgdG8gXGEgdmlzaWJsZS4KLSovCi0KLS8qIQotICAgIFxm
biB2b2lkIFFXZWJQYWdlOjpkYXRhYmFzZVF1b3RhRXhjZWVkZWQoUVdlYkZyYW1lKiBmcmFtZSwg
UVN0cmluZyBkYXRhYmFzZU5hbWUpOwotICAgIFxzaW5jZSA0LjUKLQotICAgIFRoaXMgc2lnbmFs
IGlzIGVtaXR0ZWQgd2hlbmV2ZXIgdGhlIHdlYiBzaXRlIHNob3duIGluIFxhIGZyYW1lIGlzIGFz
a2luZyB0byBzdG9yZSBkYXRhCi0gICAgdG8gdGhlIGRhdGFiYXNlIFxhIGRhdGFiYXNlTmFtZSBh
bmQgdGhlIHF1b3RhIGFsbG9jYXRlZCB0byB0aGF0IHdlYiBzaXRlIGlzIGV4Y2VlZGVkLgotCi0g
ICAgXHNhIFFXZWJEYXRhYmFzZQotKi8KLS8qIQotICAgIFxmbiB2b2lkIFFXZWJQYWdlOjphcHBs
aWNhdGlvbkNhY2hlUXVvdGFFeGNlZWRlZChRV2ViU2VjdXJpdHlPcmlnaW4qIG9yaWdpbiwgcXVp
bnQ2NCBkZWZhdWx0T3JpZ2luUXVvdGEsIHF1aW50NjQgdG90YWxTcGFjZU5lZWRlZCk7Ci0KLSAg
ICBUaGlzIHNpZ25hbCBpcyBlbWl0dGVkIHdoZW5ldmVyIHRoZSB3ZWIgc2l0ZSBpcyBhc2tpbmcg
dG8gc3RvcmUgZGF0YSB0byB0aGUgYXBwbGljYXRpb24gY2FjaGUKLSAgICBkYXRhYmFzZSBkYXRh
YmFzZU5hbWUgYW5kIHRoZSBxdW90YSBhbGxvY2F0ZWQgdG8gdGhhdCB3ZWIgc2l0ZSBpcyBleGNl
ZWRlZC4KLQotKi8KLQotLyohCi0gIFxzaW5jZSA0LjUKLSAgXGZuIHZvaWQgUVdlYlBhZ2U6OnNh
dmVGcmFtZVN0YXRlUmVxdWVzdGVkKFFXZWJGcmFtZSogZnJhbWUsIFFXZWJIaXN0b3J5SXRlbSog
aXRlbSk7Ci0KLSAgVGhpcyBzaWduYWwgaXMgZW1pdHRlZCBzaG9ydGx5IGJlZm9yZSB0aGUgaGlz
dG9yeSBvZiBuYXZpZ2F0ZWQgcGFnZXMKLSAgaW4gXGEgZnJhbWUgaXMgY2hhbmdlZCwgZm9yIGV4
YW1wbGUgd2hlbiBuYXZpZ2F0aW5nIGJhY2sgaW4gdGhlIGhpc3RvcnkuCi0KLSAgVGhlIHByb3Zp
ZGVkIFFXZWJIaXN0b3J5SXRlbSwgXGEgaXRlbSwgaG9sZHMgdGhlIGhpc3RvcnkgZW50cnkgb2Yg
dGhlIGZyYW1lIGJlZm9yZQotICB0aGUgY2hhbmdlLgotCi0gIEEgcG90ZW50aWFsIHVzZS1jYXNl
IGZvciB0aGlzIHNpZ25hbCBpcyB0byBzdG9yZSBjdXN0b20gZGF0YSBpbgotICB0aGUgUVdlYkhp
c3RvcnlJdGVtIGFzc29jaWF0ZWQgdG8gdGhlIGZyYW1lLCB1c2luZyBRV2ViSGlzdG9yeUl0ZW06
OnNldFVzZXJEYXRhKCkuCi0qLwotCi0vKiEKLSAgXHNpbmNlIDQuNQotICBcZm4gdm9pZCBRV2Vi
UGFnZTo6cmVzdG9yZUZyYW1lU3RhdGVSZXF1ZXN0ZWQoUVdlYkZyYW1lKiBmcmFtZSk7Ci0KLSAg
VGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuIHRoZSBsb2FkIG9mIFxhIGZyYW1lIGlzIGZpbmlz
aGVkIGFuZCB0aGUgYXBwbGljYXRpb24gbWF5IG5vdyB1cGRhdGUgaXRzIHN0YXRlIGFjY29yZGlu
Z2x5LgotKi8KLQotLyohCi0gIFxmbiBRV2ViUGFnZVByaXZhdGUqIFFXZWJQYWdlOjpoYW5kbGUo
KSBjb25zdAotICBcaW50ZXJuYWwKLSovCi0KLSNpbmNsdWRlICJtb2NfcXdlYnBhZ2UuY3BwIgpk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9BcGkvcXdlYnBhZ2UuaCBiL1NvdXJjZS9XZWJL
aXQvcXQvQXBpL3F3ZWJwYWdlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNTQy
MWZjYzlmZjI3NDEyMWNjNzhjNzBlYjdjNjhjNWEwODBlMGMuLjAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYktpdC9xdC9BcGkvcXdlYnBhZ2Uu
aAorKysgL2Rldi9udWxsCkBAIC0xLDQ1MyArMCwwIEBACi0vKgotICAgIENvcHlyaWdodCAoQykg
MjAwOCBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykKLSAgICBD
b3B5cmlnaHQgKEMpIDIwMDcgU3RhaWtvcyBDb21wdXRpbmcgU2VydmljZXMgSW5jLgotCi0gICAg
VGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu
ZC9vcgotICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljCi0gICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdh
cmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAo
YXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlz
IGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0
IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkg
b2YKLSAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP
U0UuICBTZWUgdGhlIEdOVQotICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3Ig
bW9yZSBkZXRhaWxzLgotCi0gICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0
aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhp
cyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCi0g
ICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0
LCBGaWZ0aCBGbG9vciwKLSAgICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KLSovCi0KLSNp
Zm5kZWYgUVdFQlBBR0VfSAotI2RlZmluZSBRV0VCUEFHRV9ICi0KLSNpbmNsdWRlICJxd2Vic2V0
dGluZ3MuaCIKLSNpbmNsdWRlICJxd2Via2l0Z2xvYmFsLmgiCi0KLSNpbmNsdWRlIDxRdENvcmUv
cW9iamVjdC5oPgotI2luY2x1ZGUgPFF0Q29yZS9xdXJsLmg+Ci0jaW5jbHVkZSA8UXRXaWRnZXRz
L3F3aWRnZXQuaD4KLQotUVRfQkVHSU5fTkFNRVNQQUNFCi1jbGFzcyBRTmV0d29ya1Byb3h5Owot
Y2xhc3MgUVVuZG9TdGFjazsKLWNsYXNzIFFNZW51OwotY2xhc3MgUU5ldHdvcmtSZXF1ZXN0Owot
Y2xhc3MgUU5ldHdvcmtSZXBseTsKLWNsYXNzIFFOZXR3b3JrQWNjZXNzTWFuYWdlcjsKLVFUX0VO
RF9OQU1FU1BBQ0UKLQotY2xhc3MgUVdlYkVsZW1lbnQ7Ci1jbGFzcyBRV2ViRnJhbWU7Ci1jbGFz
cyBRV2ViTmV0d29ya1JlcXVlc3Q7Ci1jbGFzcyBRV2ViSGlzdG9yeTsKLQotY2xhc3MgUVdlYkZy
YW1lRGF0YTsKLWNsYXNzIFFXZWJIaXN0b3J5SXRlbTsKLWNsYXNzIFFXZWJIaXRUZXN0UmVzdWx0
OwotY2xhc3MgUVdlYk5ldHdvcmtJbnRlcmZhY2U7Ci1jbGFzcyBRV2ViUGFnZUFkYXB0ZXI7Ci1j
bGFzcyBRV2ViUGFnZVByaXZhdGU7Ci1jbGFzcyBRV2ViUGx1Z2luRmFjdG9yeTsKLWNsYXNzIFFX
ZWJTZWN1cml0eU9yaWdpbjsKLWNsYXNzIFF0Vmlld3BvcnRBdHRyaWJ1dGVzUHJpdmF0ZTsKLQot
bmFtZXNwYWNlIFdlYkNvcmUgewotICAgIGNsYXNzIENocm9tZUNsaWVudFF0OwotICAgIGNsYXNz
IEVkaXRvckNsaWVudFF0OwotICAgIGNsYXNzIEZyYW1lTG9hZGVyQ2xpZW50UXQ7Ci0gICAgY2xh
c3MgSW5zcGVjdG9yQ2xpZW50UXQ7Ci0gICAgY2xhc3MgSW5zcGVjdG9yU2VydmVyUmVxdWVzdEhh
bmRsZXJRdDsKLSAgICBjbGFzcyBJbnNwZWN0b3JGcm9udGVuZENsaWVudFF0OwotICAgIGNsYXNz
IE5vdGlmaWNhdGlvblByZXNlbnRlckNsaWVudFF0OwotICAgIGNsYXNzIEdlb2xvY2F0aW9uUGVy
bWlzc2lvbkNsaWVudFF0OwotICAgIGNsYXNzIFJlc291cmNlSGFuZGxlOwotICAgIGNsYXNzIEhp
dFRlc3RSZXN1bHQ7Ci0gICAgY2xhc3MgUU5ldHdvcmtSZXBseUhhbmRsZXI7Ci0KLSAgICBzdHJ1
Y3QgRnJhbWVMb2FkUmVxdWVzdDsKLX0KLQotY2xhc3MgUVdFQktJVF9FWFBPUlQgUVdlYlBhZ2Ug
OiBwdWJsaWMgUU9iamVjdCB7Ci0gICAgUV9PQkpFQ1QKLQotICAgIFFfUFJPUEVSVFkoYm9vbCBt
b2RpZmllZCBSRUFEIGlzTW9kaWZpZWQpCi0gICAgUV9QUk9QRVJUWShRU3RyaW5nIHNlbGVjdGVk
VGV4dCBSRUFEIHNlbGVjdGVkVGV4dCkKLSAgICBRX1BST1BFUlRZKFFTdHJpbmcgc2VsZWN0ZWRI
dG1sIFJFQUQgc2VsZWN0ZWRIdG1sKQotICAgIFFfUFJPUEVSVFkoYm9vbCBoYXNTZWxlY3Rpb24g
UkVBRCBoYXNTZWxlY3Rpb24pCi0gICAgUV9QUk9QRVJUWShRU2l6ZSB2aWV3cG9ydFNpemUgUkVB
RCB2aWV3cG9ydFNpemUgV1JJVEUgc2V0Vmlld3BvcnRTaXplKQotICAgIFFfUFJPUEVSVFkoUVNp
emUgcHJlZmVycmVkQ29udGVudHNTaXplIFJFQUQgcHJlZmVycmVkQ29udGVudHNTaXplIFdSSVRF
IHNldFByZWZlcnJlZENvbnRlbnRzU2l6ZSkKLSAgICBRX1BST1BFUlRZKGJvb2wgZm9yd2FyZFVu
c3VwcG9ydGVkQ29udGVudCBSRUFEIGZvcndhcmRVbnN1cHBvcnRlZENvbnRlbnQgV1JJVEUgc2V0
Rm9yd2FyZFVuc3VwcG9ydGVkQ29udGVudCkKLSAgICBRX1BST1BFUlRZKExpbmtEZWxlZ2F0aW9u
UG9saWN5IGxpbmtEZWxlZ2F0aW9uUG9saWN5IFJFQUQgbGlua0RlbGVnYXRpb25Qb2xpY3kgV1JJ
VEUgc2V0TGlua0RlbGVnYXRpb25Qb2xpY3kpCi0gICAgUV9QUk9QRVJUWShRUGFsZXR0ZSBwYWxl
dHRlIFJFQUQgcGFsZXR0ZSBXUklURSBzZXRQYWxldHRlKQotICAgIFFfUFJPUEVSVFkoYm9vbCBj
b250ZW50RWRpdGFibGUgUkVBRCBpc0NvbnRlbnRFZGl0YWJsZSBXUklURSBzZXRDb250ZW50RWRp
dGFibGUpCi0gICAgUV9FTlVNUyhMaW5rRGVsZWdhdGlvblBvbGljeSBOYXZpZ2F0aW9uVHlwZSBX
ZWJBY3Rpb24pCi1wdWJsaWM6Ci0gICAgZW51bSBOYXZpZ2F0aW9uVHlwZSB7Ci0gICAgICAgIE5h
dmlnYXRpb25UeXBlTGlua0NsaWNrZWQsCi0gICAgICAgIE5hdmlnYXRpb25UeXBlRm9ybVN1Ym1p
dHRlZCwKLSAgICAgICAgTmF2aWdhdGlvblR5cGVCYWNrT3JGb3J3YXJkLAotICAgICAgICBOYXZp
Z2F0aW9uVHlwZVJlbG9hZCwKLSAgICAgICAgTmF2aWdhdGlvblR5cGVGb3JtUmVzdWJtaXR0ZWQs
Ci0gICAgICAgIE5hdmlnYXRpb25UeXBlT3RoZXIKLSAgICB9OwotCi0gICAgZW51bSBXZWJBY3Rp
b24gewotICAgICAgICBOb1dlYkFjdGlvbiA9IC0gMSwKLQotICAgICAgICBPcGVuTGluaywKLQot
ICAgICAgICBPcGVuTGlua0luTmV3V2luZG93LAotICAgICAgICBPcGVuRnJhbWVJbk5ld1dpbmRv
dywKLQotICAgICAgICBEb3dubG9hZExpbmtUb0Rpc2ssCi0gICAgICAgIENvcHlMaW5rVG9DbGlw
Ym9hcmQsCi0KLSAgICAgICAgT3BlbkltYWdlSW5OZXdXaW5kb3csCi0gICAgICAgIERvd25sb2Fk
SW1hZ2VUb0Rpc2ssCi0gICAgICAgIENvcHlJbWFnZVRvQ2xpcGJvYXJkLAotCi0gICAgICAgIEJh
Y2ssCi0gICAgICAgIEZvcndhcmQsCi0gICAgICAgIFN0b3AsCi0gICAgICAgIFJlbG9hZCwKLQot
ICAgICAgICBDdXQsCi0gICAgICAgIENvcHksCi0gICAgICAgIFBhc3RlLAotCi0gICAgICAgIFVu
ZG8sCi0gICAgICAgIFJlZG8sCi0gICAgICAgIE1vdmVUb05leHRDaGFyLAotICAgICAgICBNb3Zl
VG9QcmV2aW91c0NoYXIsCi0gICAgICAgIE1vdmVUb05leHRXb3JkLAotICAgICAgICBNb3ZlVG9Q
cmV2aW91c1dvcmQsCi0gICAgICAgIE1vdmVUb05leHRMaW5lLAotICAgICAgICBNb3ZlVG9QcmV2
aW91c0xpbmUsCi0gICAgICAgIE1vdmVUb1N0YXJ0T2ZMaW5lLAotICAgICAgICBNb3ZlVG9FbmRP
ZkxpbmUsCi0gICAgICAgIE1vdmVUb1N0YXJ0T2ZCbG9jaywKLSAgICAgICAgTW92ZVRvRW5kT2ZC
bG9jaywKLSAgICAgICAgTW92ZVRvU3RhcnRPZkRvY3VtZW50LAotICAgICAgICBNb3ZlVG9FbmRP
ZkRvY3VtZW50LAotICAgICAgICBTZWxlY3ROZXh0Q2hhciwKLSAgICAgICAgU2VsZWN0UHJldmlv
dXNDaGFyLAotICAgICAgICBTZWxlY3ROZXh0V29yZCwKLSAgICAgICAgU2VsZWN0UHJldmlvdXNX
b3JkLAotICAgICAgICBTZWxlY3ROZXh0TGluZSwKLSAgICAgICAgU2VsZWN0UHJldmlvdXNMaW5l
LAotICAgICAgICBTZWxlY3RTdGFydE9mTGluZSwKLSAgICAgICAgU2VsZWN0RW5kT2ZMaW5lLAot
ICAgICAgICBTZWxlY3RTdGFydE9mQmxvY2ssCi0gICAgICAgIFNlbGVjdEVuZE9mQmxvY2ssCi0g
ICAgICAgIFNlbGVjdFN0YXJ0T2ZEb2N1bWVudCwKLSAgICAgICAgU2VsZWN0RW5kT2ZEb2N1bWVu
dCwKLSAgICAgICAgRGVsZXRlU3RhcnRPZldvcmQsCi0gICAgICAgIERlbGV0ZUVuZE9mV29yZCwK
LQotICAgICAgICBTZXRUZXh0RGlyZWN0aW9uRGVmYXVsdCwKLSAgICAgICAgU2V0VGV4dERpcmVj
dGlvbkxlZnRUb1JpZ2h0LAotICAgICAgICBTZXRUZXh0RGlyZWN0aW9uUmlnaHRUb0xlZnQsCi0K
LSAgICAgICAgVG9nZ2xlQm9sZCwKLSAgICAgICAgVG9nZ2xlSXRhbGljLAotICAgICAgICBUb2dn
bGVVbmRlcmxpbmUsCi0KLSAgICAgICAgSW5zcGVjdEVsZW1lbnQsCi0KLSAgICAgICAgSW5zZXJ0
UGFyYWdyYXBoU2VwYXJhdG9yLAotICAgICAgICBJbnNlcnRMaW5lU2VwYXJhdG9yLAotCi0gICAg
ICAgIFNlbGVjdEFsbCwKLSAgICAgICAgUmVsb2FkQW5kQnlwYXNzQ2FjaGUsCi0KLSAgICAgICAg
UGFzdGVBbmRNYXRjaFN0eWxlLAotICAgICAgICBSZW1vdmVGb3JtYXQsCi0KLSAgICAgICAgVG9n
Z2xlU3RyaWtldGhyb3VnaCwKLSAgICAgICAgVG9nZ2xlU3Vic2NyaXB0LAotICAgICAgICBUb2dn
bGVTdXBlcnNjcmlwdCwKLSAgICAgICAgSW5zZXJ0VW5vcmRlcmVkTGlzdCwKLSAgICAgICAgSW5z
ZXJ0T3JkZXJlZExpc3QsCi0gICAgICAgIEluZGVudCwKLSAgICAgICAgT3V0ZGVudCwKLQotICAg
ICAgICBBbGlnbkNlbnRlciwKLSAgICAgICAgQWxpZ25KdXN0aWZpZWQsCi0gICAgICAgIEFsaWdu
TGVmdCwKLSAgICAgICAgQWxpZ25SaWdodCwKLQotICAgICAgICBTdG9wU2NoZWR1bGVkUGFnZVJl
ZnJlc2gsCi0KLSAgICAgICAgQ29weUltYWdlVXJsVG9DbGlwYm9hcmQsCi0KLSAgICAgICAgT3Bl
bkxpbmtJblRoaXNXaW5kb3csCi0KLSAgICAgICAgV2ViQWN0aW9uQ291bnQKLSAgICB9OwotCi0g
ICAgZW51bSBGaW5kRmxhZyB7Ci0gICAgICAgIEZpbmRCYWNrd2FyZCA9IDEsCi0gICAgICAgIEZp
bmRDYXNlU2Vuc2l0aXZlbHkgPSAyLAotICAgICAgICBGaW5kV3JhcHNBcm91bmREb2N1bWVudCA9
IDQsCi0gICAgICAgIEhpZ2hsaWdodEFsbE9jY3VycmVuY2VzID0gOAotICAgIH07Ci0gICAgUV9E
RUNMQVJFX0ZMQUdTKEZpbmRGbGFncywgRmluZEZsYWcpCi0KLSAgICBlbnVtIExpbmtEZWxlZ2F0
aW9uUG9saWN5IHsKLSAgICAgICAgRG9udERlbGVnYXRlTGlua3MsCi0gICAgICAgIERlbGVnYXRl
RXh0ZXJuYWxMaW5rcywKLSAgICAgICAgRGVsZWdhdGVBbGxMaW5rcwotICAgIH07Ci0KLSAgICBl
bnVtIFdlYldpbmRvd1R5cGUgewotICAgICAgICBXZWJCcm93c2VyV2luZG93LAotICAgICAgICBX
ZWJNb2RhbERpYWxvZwotICAgIH07Ci0KLSAgICBlbnVtIFBlcm1pc3Npb25Qb2xpY3kgewotICAg
ICAgICBQZXJtaXNzaW9uVW5rbm93biwKLSAgICAgICAgUGVybWlzc2lvbkdyYW50ZWRCeVVzZXIs
Ci0gICAgICAgIFBlcm1pc3Npb25EZW5pZWRCeVVzZXIKLSAgICB9OwotCi0gICAgZW51bSBGZWF0
dXJlIHsKLSAgICAgICAgTm90aWZpY2F0aW9ucywKLSAgICAgICAgR2VvbG9jYXRpb24KLSAgICB9
OwotCi0gICAgY2xhc3MgUVdFQktJVF9FWFBPUlQgVmlld3BvcnRBdHRyaWJ1dGVzIHsKLSAgICBw
dWJsaWM6Ci0gICAgICAgIFZpZXdwb3J0QXR0cmlidXRlcygpOwotICAgICAgICBWaWV3cG9ydEF0
dHJpYnV0ZXMoY29uc3QgUVdlYlBhZ2U6OlZpZXdwb3J0QXR0cmlidXRlcyYgb3RoZXIpOwotCi0g
ICAgICAgIH5WaWV3cG9ydEF0dHJpYnV0ZXMoKTsKLQotICAgICAgICBRV2ViUGFnZTo6Vmlld3Bv
cnRBdHRyaWJ1dGVzJiBvcGVyYXRvcj0oY29uc3QgUVdlYlBhZ2U6OlZpZXdwb3J0QXR0cmlidXRl
cyYgb3RoZXIpOwotCi0gICAgICAgIGlubGluZSBxcmVhbCBpbml0aWFsU2NhbGVGYWN0b3IoKSBj
b25zdCB7IHJldHVybiBtX2luaXRpYWxTY2FsZUZhY3RvcjsgfQotICAgICAgICBpbmxpbmUgcXJl
YWwgbWluaW11bVNjYWxlRmFjdG9yKCkgY29uc3QgeyByZXR1cm4gbV9taW5pbXVtU2NhbGVGYWN0
b3I7IH0KLSAgICAgICAgaW5saW5lIHFyZWFsIG1heGltdW1TY2FsZUZhY3RvcigpIGNvbnN0IHsg
cmV0dXJuIG1fbWF4aW11bVNjYWxlRmFjdG9yOyB9Ci0gICAgICAgIGlubGluZSBxcmVhbCBkZXZp
Y2VQaXhlbFJhdGlvKCkgY29uc3QgeyByZXR1cm4gbV9kZXZpY2VQaXhlbFJhdGlvOyB9Ci0gICAg
ICAgIGlubGluZSBib29sIGlzVXNlclNjYWxhYmxlKCkgY29uc3QgeyByZXR1cm4gbV9pc1VzZXJT
Y2FsYWJsZTsgfQotICAgICAgICBpbmxpbmUgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4g
bV9pc1ZhbGlkOyB9Ci0gICAgICAgIGlubGluZSBRU2l6ZUYgc2l6ZSgpIGNvbnN0IHsgcmV0dXJu
IG1fc2l6ZTsgfQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgUVNoYXJlZERhdGFQb2ludGVyPFF0
Vmlld3BvcnRBdHRyaWJ1dGVzUHJpdmF0ZT4gZDsKLSAgICAgICAgcXJlYWwgbV9pbml0aWFsU2Nh
bGVGYWN0b3I7Ci0gICAgICAgIHFyZWFsIG1fbWluaW11bVNjYWxlRmFjdG9yOwotICAgICAgICBx
cmVhbCBtX21heGltdW1TY2FsZUZhY3RvcjsKLSAgICAgICAgcXJlYWwgbV9kZXZpY2VQaXhlbFJh
dGlvOwotICAgICAgICBib29sIG1faXNVc2VyU2NhbGFibGU7Ci0gICAgICAgIGJvb2wgbV9pc1Zh
bGlkOwotICAgICAgICBRU2l6ZUYgbV9zaXplOwotCi0gICAgICAgIGZyaWVuZCBjbGFzcyBXZWJD
b3JlOjpDaHJvbWVDbGllbnRRdDsKLSAgICAgICAgZnJpZW5kIGNsYXNzIFFXZWJQYWdlOwotICAg
IH07Ci0KLQotICAgIGV4cGxpY2l0IFFXZWJQYWdlKFFPYmplY3QgKnBhcmVudCA9IDApOwotICAg
IH5RV2ViUGFnZSgpOwotCi0gICAgUVdlYkZyYW1lICptYWluRnJhbWUoKSBjb25zdDsKLSAgICBR
V2ViRnJhbWUgKmN1cnJlbnRGcmFtZSgpIGNvbnN0OwotICAgIFFXZWJGcmFtZSogZnJhbWVBdChj
b25zdCBRUG9pbnQmIHBvcykgY29uc3Q7Ci0KLSAgICBRV2ViSGlzdG9yeSAqaGlzdG9yeSgpIGNv
bnN0OwotICAgIFFXZWJTZXR0aW5ncyAqc2V0dGluZ3MoKSBjb25zdDsKLQotICAgIHZvaWQgc2V0
VmlldyhRV2lkZ2V0ICp2aWV3KTsKLSAgICBRV2lkZ2V0ICp2aWV3KCkgY29uc3Q7Ci0KLSAgICBi
b29sIGlzTW9kaWZpZWQoKSBjb25zdDsKLSNpZm5kZWYgUVRfTk9fVU5ET1NUQUNLCi0gICAgUVVu
ZG9TdGFjayAqdW5kb1N0YWNrKCkgY29uc3Q7Ci0jZW5kaWYKLQotICAgIHZvaWQgc2V0TmV0d29y
a0FjY2Vzc01hbmFnZXIoUU5ldHdvcmtBY2Nlc3NNYW5hZ2VyICptYW5hZ2VyKTsKLSAgICBRTmV0
d29ya0FjY2Vzc01hbmFnZXIgKm5ldHdvcmtBY2Nlc3NNYW5hZ2VyKCkgY29uc3Q7Ci0KLSAgICB2
b2lkIHNldFBsdWdpbkZhY3RvcnkoUVdlYlBsdWdpbkZhY3RvcnkgKmZhY3RvcnkpOwotICAgIFFX
ZWJQbHVnaW5GYWN0b3J5ICpwbHVnaW5GYWN0b3J5KCkgY29uc3Q7Ci0KLSAgICBxdWludDY0IHRv
dGFsQnl0ZXMoKSBjb25zdDsKLSAgICBxdWludDY0IGJ5dGVzUmVjZWl2ZWQoKSBjb25zdDsKLQot
ICAgIGJvb2wgaGFzU2VsZWN0aW9uKCkgY29uc3Q7Ci0gICAgUVN0cmluZyBzZWxlY3RlZFRleHQo
KSBjb25zdDsKLSAgICBRU3RyaW5nIHNlbGVjdGVkSHRtbCgpIGNvbnN0OwotCi0jaWZuZGVmIFFU
X05PX0FDVElPTgotICAgIFFBY3Rpb24gKmFjdGlvbihXZWJBY3Rpb24gYWN0aW9uKSBjb25zdDsK
LSNlbmRpZgotICAgIHZpcnR1YWwgdm9pZCB0cmlnZ2VyQWN0aW9uKFdlYkFjdGlvbiBhY3Rpb24s
IGJvb2wgY2hlY2tlZCA9IGZhbHNlKTsKLQotICAgIFFTaXplIHZpZXdwb3J0U2l6ZSgpIGNvbnN0
OwotICAgIHZvaWQgc2V0Vmlld3BvcnRTaXplKGNvbnN0IFFTaXplICZzaXplKSBjb25zdDsKLSAg
ICBWaWV3cG9ydEF0dHJpYnV0ZXMgdmlld3BvcnRBdHRyaWJ1dGVzRm9yU2l6ZShjb25zdCBRU2l6
ZSYgYXZhaWxhYmxlU2l6ZSkgY29uc3Q7Ci0KLSAgICBRU2l6ZSBwcmVmZXJyZWRDb250ZW50c1Np
emUoKSBjb25zdDsKLSAgICB2b2lkIHNldFByZWZlcnJlZENvbnRlbnRzU2l6ZShjb25zdCBRU2l6
ZSAmc2l6ZSkgY29uc3Q7Ci0gICAgdm9pZCBzZXRBY3R1YWxWaXNpYmxlQ29udGVudFJlY3QoY29u
c3QgUVJlY3QmIHJlY3QpIGNvbnN0OwotCi0gICAgdmlydHVhbCBib29sIGV2ZW50KFFFdmVudCop
OwotICAgIGJvb2wgZm9jdXNOZXh0UHJldkNoaWxkKGJvb2wgbmV4dCk7Ci0KLSAgICBRVmFyaWFu
dCBpbnB1dE1ldGhvZFF1ZXJ5KFF0OjpJbnB1dE1ldGhvZFF1ZXJ5IHByb3BlcnR5KSBjb25zdDsK
LQotICAgIGJvb2wgZmluZFRleHQoY29uc3QgUVN0cmluZyAmc3ViU3RyaW5nLCBGaW5kRmxhZ3Mg
b3B0aW9ucyA9IDApOwotCi0gICAgdm9pZCBzZXRGb3J3YXJkVW5zdXBwb3J0ZWRDb250ZW50KGJv
b2wgZm9yd2FyZCk7Ci0gICAgYm9vbCBmb3J3YXJkVW5zdXBwb3J0ZWRDb250ZW50KCkgY29uc3Q7
Ci0KLSAgICB2b2lkIHNldExpbmtEZWxlZ2F0aW9uUG9saWN5KExpbmtEZWxlZ2F0aW9uUG9saWN5
IHBvbGljeSk7Ci0gICAgTGlua0RlbGVnYXRpb25Qb2xpY3kgbGlua0RlbGVnYXRpb25Qb2xpY3ko
KSBjb25zdDsKLQotICAgIHZvaWQgc2V0UGFsZXR0ZShjb25zdCBRUGFsZXR0ZSAmcGFsZXR0ZSk7
Ci0gICAgUVBhbGV0dGUgcGFsZXR0ZSgpIGNvbnN0OwotCi0gICAgdm9pZCBzZXRDb250ZW50RWRp
dGFibGUoYm9vbCBlZGl0YWJsZSk7Ci0gICAgYm9vbCBpc0NvbnRlbnRFZGl0YWJsZSgpIGNvbnN0
OwotCi0jaWZuZGVmIFFUX05PX0NPTlRFWFRNRU5VCi0gICAgYm9vbCBzd2FsbG93Q29udGV4dE1l
bnVFdmVudChRQ29udGV4dE1lbnVFdmVudCAqZXZlbnQpOwotI2VuZGlmCi0gICAgdm9pZCB1cGRh
dGVQb3NpdGlvbkRlcGVuZGVudEFjdGlvbnMoY29uc3QgUVBvaW50ICZwb3MpOwotCi0gICAgUU1l
bnUgKmNyZWF0ZVN0YW5kYXJkQ29udGV4dE1lbnUoKTsKLQotICAgIHZvaWQgc2V0RmVhdHVyZVBl
cm1pc3Npb24oUVdlYkZyYW1lKiBmcmFtZSwgRmVhdHVyZSBmZWF0dXJlLCBQZXJtaXNzaW9uUG9s
aWN5IHBvbGljeSk7Ci0KLSAgICBRU3RyaW5nTGlzdCBzdXBwb3J0ZWRDb250ZW50VHlwZXMoKSBj
b25zdDsKLSAgICBib29sIHN1cHBvcnRzQ29udGVudFR5cGUoY29uc3QgUVN0cmluZyYgbWltZVR5
cGUpIGNvbnN0OwotCi0gICAgZW51bSBFeHRlbnNpb24gewotICAgICAgICBDaG9vc2VNdWx0aXBs
ZUZpbGVzRXh0ZW5zaW9uLAotICAgICAgICBFcnJvclBhZ2VFeHRlbnNpb24KLSAgICB9OwotICAg
IGNsYXNzIEV4dGVuc2lvbk9wdGlvbgotICAgIHt9OwotICAgIGNsYXNzIEV4dGVuc2lvblJldHVy
bgotICAgIHt9OwotCi0gICAgY2xhc3MgQ2hvb3NlTXVsdGlwbGVGaWxlc0V4dGVuc2lvbk9wdGlv
biA6IHB1YmxpYyBFeHRlbnNpb25PcHRpb24gewotICAgIHB1YmxpYzoKLSAgICAgICAgUVdlYkZy
YW1lICpwYXJlbnRGcmFtZTsKLSAgICAgICAgUVN0cmluZ0xpc3Qgc3VnZ2VzdGVkRmlsZU5hbWVz
OwotICAgIH07Ci0KLSAgICBjbGFzcyBDaG9vc2VNdWx0aXBsZUZpbGVzRXh0ZW5zaW9uUmV0dXJu
IDogcHVibGljIEV4dGVuc2lvblJldHVybiB7Ci0gICAgcHVibGljOgotICAgICAgICBRU3RyaW5n
TGlzdCBmaWxlTmFtZXM7Ci0gICAgfTsKLQotICAgIGVudW0gRXJyb3JEb21haW4geyBRdE5ldHdv
cmssIEh0dHAsIFdlYktpdCB9OwotICAgIGNsYXNzIEVycm9yUGFnZUV4dGVuc2lvbk9wdGlvbiA6
IHB1YmxpYyBFeHRlbnNpb25PcHRpb24gewotICAgIHB1YmxpYzoKLSAgICAgICAgUVVybCB1cmw7
Ci0gICAgICAgIFFXZWJGcmFtZSogZnJhbWU7Ci0gICAgICAgIEVycm9yRG9tYWluIGRvbWFpbjsK
LSAgICAgICAgaW50IGVycm9yOwotICAgICAgICBRU3RyaW5nIGVycm9yU3RyaW5nOwotICAgIH07
Ci0KLSAgICBjbGFzcyBFcnJvclBhZ2VFeHRlbnNpb25SZXR1cm4gOiBwdWJsaWMgRXh0ZW5zaW9u
UmV0dXJuIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIEVycm9yUGFnZUV4dGVuc2lvblJldHVybigp
IDogY29udGVudFR5cGUoUUxhdGluMVN0cmluZygidGV4dC9odG1sIikpLCBlbmNvZGluZyhRTGF0
aW4xU3RyaW5nKCJ1dGYtOCIpKSB7fTsKLSAgICAgICAgUVN0cmluZyBjb250ZW50VHlwZTsKLSAg
ICAgICAgUVN0cmluZyBlbmNvZGluZzsKLSAgICAgICAgUVVybCBiYXNlVXJsOwotICAgICAgICBR
Qnl0ZUFycmF5IGNvbnRlbnQ7Ci0gICAgfTsKLQotCi0gICAgdmlydHVhbCBib29sIGV4dGVuc2lv
bihFeHRlbnNpb24gZXh0ZW5zaW9uLCBjb25zdCBFeHRlbnNpb25PcHRpb24gKm9wdGlvbiA9IDAs
IEV4dGVuc2lvblJldHVybiAqb3V0cHV0ID0gMCk7Ci0gICAgdmlydHVhbCBib29sIHN1cHBvcnRz
RXh0ZW5zaW9uKEV4dGVuc2lvbiBleHRlbnNpb24pIGNvbnN0OwotCi0gICAgUVdlYlBhZ2VBZGFw
dGVyKiBoYW5kbGUoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgYm9vbCBzaG91bGRJbnRlcnJ1cHRK
YXZhU2NyaXB0KCk7Ci0KLVFfU0lHTkFMUzoKLSAgICB2b2lkIGxvYWRTdGFydGVkKCk7Ci0gICAg
dm9pZCBsb2FkUHJvZ3Jlc3MoaW50IHByb2dyZXNzKTsKLSAgICB2b2lkIGxvYWRGaW5pc2hlZChi
b29sIG9rKTsKLQotICAgIHZvaWQgbGlua0hvdmVyZWQoY29uc3QgUVN0cmluZyAmbGluaywgY29u
c3QgUVN0cmluZyAmdGl0bGUsIGNvbnN0IFFTdHJpbmcgJnRleHRDb250ZW50KTsKLSAgICB2b2lk
IHN0YXR1c0Jhck1lc3NhZ2UoY29uc3QgUVN0cmluZyYgdGV4dCk7Ci0gICAgdm9pZCBzZWxlY3Rp
b25DaGFuZ2VkKCk7Ci0gICAgdm9pZCBmcmFtZUNyZWF0ZWQoUVdlYkZyYW1lICpmcmFtZSk7Ci0g
ICAgdm9pZCBnZW9tZXRyeUNoYW5nZVJlcXVlc3RlZChjb25zdCBRUmVjdCYgZ2VvbSk7Ci0gICAg
dm9pZCByZXBhaW50UmVxdWVzdGVkKGNvbnN0IFFSZWN0JiBkaXJ0eVJlY3QpOwotICAgIHZvaWQg
c2Nyb2xsUmVxdWVzdGVkKGludCBkeCwgaW50IGR5LCBjb25zdCBRUmVjdCYgc2Nyb2xsVmlld1Jl
Y3QpOwotICAgIHZvaWQgd2luZG93Q2xvc2VSZXF1ZXN0ZWQoKTsKLSAgICB2b2lkIHByaW50UmVx
dWVzdGVkKFFXZWJGcmFtZSAqZnJhbWUpOwotICAgIHZvaWQgbGlua0NsaWNrZWQoY29uc3QgUVVy
bCAmdXJsKTsKLQotICAgIHZvaWQgdG9vbEJhclZpc2liaWxpdHlDaGFuZ2VSZXF1ZXN0ZWQoYm9v
bCB2aXNpYmxlKTsKLSAgICB2b2lkIHN0YXR1c0JhclZpc2liaWxpdHlDaGFuZ2VSZXF1ZXN0ZWQo
Ym9vbCB2aXNpYmxlKTsKLSAgICB2b2lkIG1lbnVCYXJWaXNpYmlsaXR5Q2hhbmdlUmVxdWVzdGVk
KGJvb2wgdmlzaWJsZSk7Ci0KLSAgICB2b2lkIHVuc3VwcG9ydGVkQ29udGVudChRTmV0d29ya1Jl
cGx5ICpyZXBseSk7Ci0gICAgdm9pZCBkb3dubG9hZFJlcXVlc3RlZChjb25zdCBRTmV0d29ya1Jl
cXVlc3QgJnJlcXVlc3QpOwotCi0gICAgdm9pZCBtaWNyb0ZvY3VzQ2hhbmdlZCgpOwotICAgIHZv
aWQgY29udGVudHNDaGFuZ2VkKCk7Ci0gICAgdm9pZCBkYXRhYmFzZVF1b3RhRXhjZWVkZWQoUVdl
YkZyYW1lKiBmcmFtZSwgUVN0cmluZyBkYXRhYmFzZU5hbWUpOwotICAgIHZvaWQgYXBwbGljYXRp
b25DYWNoZVF1b3RhRXhjZWVkZWQoUVdlYlNlY3VyaXR5T3JpZ2luKiBvcmlnaW4sIHF1aW50NjQg
ZGVmYXVsdE9yaWdpblF1b3RhLCBxdWludDY0IHRvdGFsU3BhY2VOZWVkZWQpOwotCi0gICAgdm9p
ZCBzYXZlRnJhbWVTdGF0ZVJlcXVlc3RlZChRV2ViRnJhbWUqIGZyYW1lLCBRV2ViSGlzdG9yeUl0
ZW0qIGl0ZW0pOwotICAgIHZvaWQgcmVzdG9yZUZyYW1lU3RhdGVSZXF1ZXN0ZWQoUVdlYkZyYW1l
KiBmcmFtZSk7Ci0KLSAgICB2b2lkIHZpZXdwb3J0Q2hhbmdlUmVxdWVzdGVkKCk7Ci0KLSAgICB2
b2lkIGZlYXR1cmVQZXJtaXNzaW9uUmVxdWVzdGVkKFFXZWJGcmFtZSogZnJhbWUsIFFXZWJQYWdl
OjpGZWF0dXJlIGZlYXR1cmUpOwotICAgIHZvaWQgZmVhdHVyZVBlcm1pc3Npb25SZXF1ZXN0Q2Fu
Y2VsZWQoUVdlYkZyYW1lKiBmcmFtZSwgUVdlYlBhZ2U6OkZlYXR1cmUgZmVhdHVyZSk7Ci0KLXBy
b3RlY3RlZDoKLSAgICB2aXJ0dWFsIFFXZWJQYWdlICpjcmVhdGVXaW5kb3coV2ViV2luZG93VHlw
ZSB0eXBlKTsKLSAgICB2aXJ0dWFsIFFPYmplY3QgKmNyZWF0ZVBsdWdpbihjb25zdCBRU3RyaW5n
ICZjbGFzc2lkLCBjb25zdCBRVXJsICZ1cmwsIGNvbnN0IFFTdHJpbmdMaXN0ICZwYXJhbU5hbWVz
LCBjb25zdCBRU3RyaW5nTGlzdCAmcGFyYW1WYWx1ZXMpOwotCi0gICAgdmlydHVhbCBib29sIGFj
Y2VwdE5hdmlnYXRpb25SZXF1ZXN0KFFXZWJGcmFtZSAqZnJhbWUsIGNvbnN0IFFOZXR3b3JrUmVx
dWVzdCAmcmVxdWVzdCwgTmF2aWdhdGlvblR5cGUgdHlwZSk7Ci0gICAgdmlydHVhbCBRU3RyaW5n
IGNob29zZUZpbGUoUVdlYkZyYW1lICpvcmlnaW5hdGluZ0ZyYW1lLCBjb25zdCBRU3RyaW5nJiBv
bGRGaWxlKTsKLSAgICB2aXJ0dWFsIHZvaWQgamF2YVNjcmlwdEFsZXJ0KFFXZWJGcmFtZSAqb3Jp
Z2luYXRpbmdGcmFtZSwgY29uc3QgUVN0cmluZyYgbXNnKTsKLSAgICB2aXJ0dWFsIGJvb2wgamF2
YVNjcmlwdENvbmZpcm0oUVdlYkZyYW1lICpvcmlnaW5hdGluZ0ZyYW1lLCBjb25zdCBRU3RyaW5n
JiBtc2cpOwotICAgIHZpcnR1YWwgYm9vbCBqYXZhU2NyaXB0UHJvbXB0KFFXZWJGcmFtZSAqb3Jp
Z2luYXRpbmdGcmFtZSwgY29uc3QgUVN0cmluZyYgbXNnLCBjb25zdCBRU3RyaW5nJiBkZWZhdWx0
VmFsdWUsIFFTdHJpbmcqIHJlc3VsdCk7Ci0gICAgdmlydHVhbCB2b2lkIGphdmFTY3JpcHRDb25z
b2xlTWVzc2FnZShjb25zdCBRU3RyaW5nJiBtZXNzYWdlLCBpbnQgbGluZU51bWJlciwgY29uc3Qg
UVN0cmluZyYgc291cmNlSUQpOwotCi0gICAgdmlydHVhbCBRU3RyaW5nIHVzZXJBZ2VudEZvclVy
bChjb25zdCBRVXJsJiB1cmwpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIFFfUFJJVkFURV9TTE9U
KGQsIHZvaWQgX3Ffb25Mb2FkUHJvZ3Jlc3NDaGFuZ2VkKGludCkpCi0jaWZuZGVmIFFUX05PX0FD
VElPTgotICAgIFFfUFJJVkFURV9TTE9UKGQsIHZvaWQgX3Ffd2ViQWN0aW9uVHJpZ2dlcmVkKGJv
b2wgY2hlY2tlZCkpCi0jZW5kaWYKLSAgICBRX1BSSVZBVEVfU0xPVChkLCB2b2lkIF9xX2NsZWFu
dXBMZWFrTWVzc2FnZXMoKSkKLQotICAgIFFXZWJQYWdlUHJpdmF0ZSAqZDsKLQotICAgIGZyaWVu
ZCBjbGFzcyBRV2ViRnJhbWU7Ci0gICAgZnJpZW5kIGNsYXNzIFFXZWJQYWdlUHJpdmF0ZTsKLSAg
ICBmcmllbmQgY2xhc3MgUVdlYlZpZXc7Ci0gICAgZnJpZW5kIGNsYXNzIFFXZWJWaWV3UHJpdmF0
ZTsKLSAgICBmcmllbmQgY2xhc3MgUUdyYXBoaWNzV2ViVmlldzsKLSAgICBmcmllbmQgY2xhc3Mg
UUdyYXBoaWNzV2ViVmlld1ByaXZhdGU7Ci0gICAgZnJpZW5kIGNsYXNzIFFXZWJJbnNwZWN0b3I7
Ci0gICAgZnJpZW5kIGNsYXNzIFdlYkNvcmU6OkNocm9tZUNsaWVudFF0OwotICAgIGZyaWVuZCBj
bGFzcyBXZWJDb3JlOjpFZGl0b3JDbGllbnRRdDsKLSAgICBmcmllbmQgY2xhc3MgV2ViQ29yZTo6
RnJhbWVMb2FkZXJDbGllbnRRdDsKLSAgICBmcmllbmQgY2xhc3MgV2ViQ29yZTo6SW5zcGVjdG9y
Q2xpZW50UXQ7Ci0gICAgZnJpZW5kIGNsYXNzIFdlYkNvcmU6Okluc3BlY3RvclNlcnZlclJlcXVl
c3RIYW5kbGVyUXQ7Ci0gICAgZnJpZW5kIGNsYXNzIFdlYkNvcmU6Okluc3BlY3RvckZyb250ZW5k
Q2xpZW50UXQ7Ci0gICAgZnJpZW5kIGNsYXNzIFdlYkNvcmU6Ok5vdGlmaWNhdGlvblByZXNlbnRl
ckNsaWVudFF0OwotICAgIGZyaWVuZCBjbGFzcyBXZWJDb3JlOjpHZW9sb2NhdGlvblBlcm1pc3Np
b25DbGllbnRRdDsKLSAgICBmcmllbmQgY2xhc3MgV2ViQ29yZTo6UmVzb3VyY2VIYW5kbGU7Ci0g
ICAgZnJpZW5kIGNsYXNzIFdlYkNvcmU6OlFOZXR3b3JrUmVwbHlIYW5kbGVyOwotICAgIGZyaWVu
ZCBjbGFzcyBEdW1wUmVuZGVyVHJlZVN1cHBvcnRRdDsKLX07Ci0KLVFfREVDTEFSRV9PUEVSQVRP
UlNfRk9SX0ZMQUdTKFFXZWJQYWdlOjpGaW5kRmxhZ3MpCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYktpdC9xdC9BcGkvcXdlYnBhZ2VfcC5oIGIvU291cmNlL1dlYktpdC9xdC9BcGkv
cXdlYnBhZ2VfcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDM0ZGQ2NTNjNzdm
NmRkMGExMWY1MmMwMjBhZDU1ZTk5ZTk4MGI3Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvcXQvQXBpL3F3ZWJwYWdlX3AuaAorKysg
L2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0vKgotICAgIENvcHlyaWdodCAoQykgMjAwOCwg
MjAwOSBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykKLSAgICBD
b3B5cmlnaHQgKEMpIDIwMDggSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIKLQotICAgIFRoaXMg
bGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IK
LSAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFs
IFB1YmxpYwotICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZv
dW5kYXRpb247IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlv
dXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0
cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRI
T1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0g
ICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAg
U2VlIHRoZSBHTlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUg
ZGV0YWlscy4KLQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdO
VSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgbGli
cmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwotICAgIHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlm
dGggRmxvb3IsCi0gICAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCi0qLwotCi0jaWZuZGVm
IFFXRUJQQUdFX1BfSAotI2RlZmluZSBRV0VCUEFHRV9QX0gKLQotI2luY2x1ZGUgIlFXZWJQYWdl
QWRhcHRlci5oIgotCi0jaW5jbHVkZSAicXdlYmZyYW1lLmgiCi0jaW5jbHVkZSAicXdlYmhpc3Rv
cnkuaCIKLSNpbmNsdWRlICJxd2VicGFnZS5oIgotCi0jaW5jbHVkZSA8UVBvaW50ZXI+Ci0jaW5j
bHVkZSA8cWJhc2ljdGltZXIuaD4KLSNpbmNsdWRlIDxxZXZlbnQuaD4KLSNpbmNsdWRlIDxxZ2Vz
dHVyZS5oPgotI2luY2x1ZGUgPHFncmFwaGljc3NjZW5lZXZlbnQuaD4KLSNpbmNsdWRlIDxxZ3Jh
cGhpY3N3aWRnZXQuaD4KLSNpbmNsdWRlIDxxbmV0d29ya3Byb3h5Lmg+Ci0KLQotbmFtZXNwYWNl
IFdlYkNvcmUgewotICAgIGNsYXNzIENvbnRleHRNZW51Q2xpZW50UXQ7Ci0gICAgY2xhc3MgQ29u
dGV4dE1lbnVJdGVtOwotICAgIGNsYXNzIENvbnRleHRNZW51OwotICAgIGNsYXNzIERvY3VtZW50
OwotICAgIGNsYXNzIEVkaXRvckNsaWVudFF0OwotICAgIGNsYXNzIEVsZW1lbnQ7Ci0gICAgY2xh
c3MgSW5zcGVjdG9yQ29udHJvbGxlcjsKLSAgICBjbGFzcyBJbnRSZWN0OwotICAgIGNsYXNzIE5v
ZGU7Ci0gICAgY2xhc3MgTm9kZUxpc3Q7Ci0gICAgY2xhc3MgRnJhbWU7Ci19Ci0KLVFUX0JFR0lO
X05BTUVTUEFDRQotY2xhc3MgUVVuZG9TdGFjazsKLWNsYXNzIFFNZW51OwotY2xhc3MgUUJpdEFy
cmF5OwotUVRfRU5EX05BTUVTUEFDRQotCi1jbGFzcyBRdFBsdWdpbldpZGdldEFkYXB0ZXI7Ci1j
bGFzcyBRV2ViSW5zcGVjdG9yOwotY2xhc3MgUVdlYkZyYW1lQWRhcHRlcjsKLWNsYXNzIFVuZG9T
dGVwUXQ7Ci0KLWNsYXNzIFF0Vmlld3BvcnRBdHRyaWJ1dGVzUHJpdmF0ZSA6IHB1YmxpYyBRU2hh
cmVkRGF0YSB7Ci1wdWJsaWM6Ci0gICAgUXRWaWV3cG9ydEF0dHJpYnV0ZXNQcml2YXRlKFFXZWJQ
YWdlOjpWaWV3cG9ydEF0dHJpYnV0ZXMqIHFxKQotICAgICAgICA6IHEocXEpCi0gICAgeyB9Ci0K
LSAgICBRV2ViUGFnZTo6Vmlld3BvcnRBdHRyaWJ1dGVzKiBxOwotfTsKLQotY2xhc3MgUVdlYlBh
Z2VQcml2YXRlIDogcHVibGljIFFXZWJQYWdlQWRhcHRlciB7Ci1wdWJsaWM6Ci0gICAgUVdlYlBh
Z2VQcml2YXRlKFFXZWJQYWdlKik7Ci0gICAgflFXZWJQYWdlUHJpdmF0ZSgpOwotCi0gICAgc3Rh
dGljIFdlYkNvcmU6OlBhZ2UqIGNvcmUoY29uc3QgUVdlYlBhZ2UqKTsKLQotICAgIC8vIEFkYXB0
ZXIgaW1wbGVtZW50YXRpb24KLSAgICB2aXJ0dWFsIHZvaWQgc2hvdygpIE9WRVJSSURFOwotICAg
IHZpcnR1YWwgdm9pZCBzZXRGb2N1cygpIE9WRVJSSURFOwotICAgIHZpcnR1YWwgdm9pZCB1bmZv
Y3VzKCkgT1ZFUlJJREU7Ci0gICAgdmlydHVhbCB2b2lkIHNldFdpbmRvd1JlY3QoY29uc3QgUVJl
Y3QgJikgT1ZFUlJJREU7Ci0gICAgdmlydHVhbCBRU2l6ZSB2aWV3cG9ydFNpemUoKSBjb25zdCBP
VkVSUklERTsKLSAgICB2aXJ0dWFsIFFXZWJQYWdlQWRhcHRlciogY3JlYXRlV2luZG93KGJvb2wg
LypkaWFsb2cqLykgT1ZFUlJJREU7Ci0gICAgdmlydHVhbCBRT2JqZWN0KiBoYW5kbGUoKSBPVkVS
UklERSB7IHJldHVybiBxOyB9Ci0gICAgdmlydHVhbCB2b2lkIGphdmFTY3JpcHRDb25zb2xlTWVz
c2FnZShjb25zdCBRU3RyaW5nJiBtZXNzYWdlLCBpbnQgbGluZU51bWJlciwgY29uc3QgUVN0cmlu
ZyYgc291cmNlSUQpIE9WRVJSSURFOwotICAgIHZpcnR1YWwgdm9pZCBqYXZhU2NyaXB0QWxlcnQo
UVdlYkZyYW1lQWRhcHRlciosIGNvbnN0IFFTdHJpbmcmIG1zZykgT1ZFUlJJREU7Ci0gICAgdmly
dHVhbCBib29sIGphdmFTY3JpcHRDb25maXJtKFFXZWJGcmFtZUFkYXB0ZXIqLCBjb25zdCBRU3Ry
aW5nJiBtc2cpIE9WRVJSSURFOwotICAgIHZpcnR1YWwgYm9vbCBqYXZhU2NyaXB0UHJvbXB0KFFX
ZWJGcmFtZUFkYXB0ZXIqLCBjb25zdCBRU3RyaW5nJiBtc2csIGNvbnN0IFFTdHJpbmcmIGRlZmF1
bHRWYWx1ZSwgUVN0cmluZyogcmVzdWx0KSBPVkVSUklERTsKLSAgICB2aXJ0dWFsIGJvb2wgc2hv
dWxkSW50ZXJydXB0SmF2YVNjcmlwdCgpIE9WRVJSSURFOwotICAgIHZpcnR1YWwgdm9pZCBwcmlu
dFJlcXVlc3RlZChRV2ViRnJhbWVBZGFwdGVyKikgT1ZFUlJJREU7Ci0gICAgdmlydHVhbCB2b2lk
IGRhdGFiYXNlUXVvdGFFeGNlZWRlZChRV2ViRnJhbWVBZGFwdGVyKiwgY29uc3QgUVN0cmluZyYg
ZGF0YWJhc2VOYW1lKSBPVkVSUklERTsKLSAgICB2aXJ0dWFsIHZvaWQgYXBwbGljYXRpb25DYWNo
ZVF1b3RhRXhjZWVkZWQoUVdlYlNlY3VyaXR5T3JpZ2luKiwgcXVpbnQ2NCBkZWZhdWx0T3JpZ2lu
UXVvdGEsIHF1aW50NjQgdG90YWxTcGFjZU5lZWRlZCkgT1ZFUlJJREU7Ci0gICAgdmlydHVhbCB2
b2lkIHNldFRvb2xUaXAoY29uc3QgUVN0cmluZyYpIE9WRVJSSURFOwotI2lmIFVTRShRVF9NVUxU
SU1FRElBKQotICAgIHZpcnR1YWwgUVdlYkZ1bGxTY3JlZW5WaWRlb0hhbmRsZXIqIGNyZWF0ZUZ1
bGxTY3JlZW5WaWRlb0hhbmRsZXIoKSBPVkVSUklERTsKLSNlbmRpZgotICAgIHZpcnR1YWwgUVdl
YkZyYW1lQWRhcHRlciogbWFpbkZyYW1lQWRhcHRlcigpIE9WRVJSSURFOwotICAgIHZpcnR1YWwg
UVN0cmluZ0xpc3QgY2hvb3NlRmlsZXMoUVdlYkZyYW1lQWRhcHRlciosIGJvb2wgYWxsb3dNdWx0
aXBsZSwgY29uc3QgUVN0cmluZ0xpc3QmIHN1Z2dlc3RlZEZpbGVOYW1lcykgT1ZFUlJJREU7Ci0g
ICAgdmlydHVhbCBRQ29sb3IgY29sb3JTZWxlY3Rpb25SZXF1ZXN0ZWQoY29uc3QgUUNvbG9yJiBz
ZWxlY3RlZENvbG9yKSBPVkVSUklERTsKLSAgICB2aXJ0dWFsIFFXZWJTZWxlY3RNZXRob2QqIGNy
ZWF0ZVNlbGVjdFBvcHVwKCkgT1ZFUlJJREU7Ci0gICAgdmlydHVhbCBRUmVjdCB2aWV3UmVjdFJl
bGF0aXZlVG9XaW5kb3coKSBPVkVSUklERTsKLSAgICB2aXJ0dWFsIHZvaWQgZ2VvbG9jYXRpb25Q
ZXJtaXNzaW9uUmVxdWVzdGVkKFFXZWJGcmFtZUFkYXB0ZXIqKSBPVkVSUklERTsKLSAgICB2aXJ0
dWFsIHZvaWQgZ2VvbG9jYXRpb25QZXJtaXNzaW9uUmVxdWVzdENhbmNlbGxlZChRV2ViRnJhbWVB
ZGFwdGVyKikgT1ZFUlJJREU7Ci0gICAgdmlydHVhbCB2b2lkIG5vdGlmaWNhdGlvbnNQZXJtaXNz
aW9uUmVxdWVzdGVkKFFXZWJGcmFtZUFkYXB0ZXIqKSBPVkVSUklERTsKLSAgICB2aXJ0dWFsIHZv
aWQgbm90aWZpY2F0aW9uc1Blcm1pc3Npb25SZXF1ZXN0Q2FuY2VsbGVkKFFXZWJGcmFtZUFkYXB0
ZXIqKSBPVkVSUklERTsKLQotICAgIHZpcnR1YWwgdm9pZCByZXNwb25kVG9DaGFuZ2VkQ29udGVu
dHMoKSBPVkVSUklERTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVzcG9uZFRvQ2hhbmdlZFNlbGVjdGlv
bigpIE9WRVJSSURFOwotICAgIHZpcnR1YWwgdm9pZCBtaWNyb0ZvY3VzQ2hhbmdlZCgpIE9WRVJS
SURFOwotICAgIHZpcnR1YWwgdm9pZCB0cmlnZ2VyQ29weUFjdGlvbigpIE9WRVJSSURFOwotICAg
IHZpcnR1YWwgdm9pZCB0cmlnZ2VyQWN0aW9uRm9yS2V5RXZlbnQoUUtleUV2ZW50KikgT1ZFUlJJ
REU7Ci0gICAgdmlydHVhbCB2b2lkIGNsZWFyVW5kb1N0YWNrKCkgT1ZFUlJJREU7Ci0gICAgdmly
dHVhbCBib29sIGNhblVuZG8oKSBjb25zdCBPVkVSUklERTsKLSAgICB2aXJ0dWFsIGJvb2wgY2Fu
UmVkbygpIGNvbnN0IE9WRVJSSURFOwotICAgIHZpcnR1YWwgdm9pZCB1bmRvKCkgT1ZFUlJJREU7
Ci0gICAgdmlydHVhbCB2b2lkIHJlZG8oKSBPVkVSUklERTsKLSAgICB2aXJ0dWFsIHZvaWQgY3Jl
YXRlVW5kb1N0ZXAoUVNoYXJlZFBvaW50ZXI8VW5kb1N0ZXBRdD4pIE9WRVJSSURFOwotICAgIHZp
cnR1YWwgY29uc3QgY2hhciogZWRpdG9yQ29tbWFuZEZvcktleUV2ZW50KFFLZXlFdmVudCopIE9W
RVJSSURFOwotCi0gICAgdm9pZCB1cGRhdGVOYXZpZ2F0aW9uQWN0aW9ucygpIE9WRVJSSURFOwot
Ci0gICAgdmlydHVhbCBRT2JqZWN0KiBpbnNwZWN0b3JIYW5kbGUoKSBPVkVSUklERTsKLSAgICB2
aXJ0dWFsIHZvaWQgc2V0SW5zcGVjdG9yRnJvbnRlbmQoUU9iamVjdCopIE9WRVJSSURFOwotICAg
IHZpcnR1YWwgdm9pZCBzZXRJbnNwZWN0b3JXaW5kb3dUaXRsZShjb25zdCBRU3RyaW5nJikgT1ZF
UlJJREU7Ci0gICAgdmlydHVhbCB2b2lkIGNyZWF0ZVdlYkluc3BlY3RvcihRT2JqZWN0KiogaW5z
cGVjdG9yVmlldywgUVdlYlBhZ2VBZGFwdGVyKiogaW5zcGVjdG9yUGFnZSkgT1ZFUlJJREU7Ci0g
ICAgdmlydHVhbCBRU3RyaW5nTGlzdCBtZW51QWN0aW9uc0FzVGV4dCgpIE9WRVJSSURFOwotICAg
IHZpcnR1YWwgdm9pZCBlbWl0Vmlld3BvcnRDaGFuZ2VSZXF1ZXN0ZWQoKSBPVkVSUklERTsKLSAg
ICB2aXJ0dWFsIGJvb2wgYWNjZXB0TmF2aWdhdGlvblJlcXVlc3QoUVdlYkZyYW1lQWRhcHRlcios
IGNvbnN0IFFOZXR3b3JrUmVxdWVzdCYsIGludCB0eXBlKSBPVkVSUklERTsKLSAgICB2aXJ0dWFs
IHZvaWQgZW1pdFJlc3RvcmVGcmFtZVN0YXRlUmVxdWVzdGVkKFFXZWJGcmFtZUFkYXB0ZXIqKSBP
VkVSUklERTsKLSAgICB2aXJ0dWFsIHZvaWQgZW1pdFNhdmVGcmFtZVN0YXRlUmVxdWVzdGVkKFFX
ZWJGcmFtZUFkYXB0ZXIqLCBRV2ViSGlzdG9yeUl0ZW0qKSBPVkVSUklERTsKLSAgICB2aXJ0dWFs
IHZvaWQgZW1pdERvd25sb2FkUmVxdWVzdGVkKGNvbnN0IFFOZXR3b3JrUmVxdWVzdCYpIE9WRVJS
SURFOwotICAgIHZpcnR1YWwgdm9pZCBlbWl0RnJhbWVDcmVhdGVkKFFXZWJGcmFtZUFkYXB0ZXIq
KSBPVkVSUklERTsKLSAgICB2aXJ0dWFsIFFTdHJpbmcgdXNlckFnZW50Rm9yVXJsKGNvbnN0IFFV
cmwgJnVybCkgY29uc3QgT1ZFUlJJREUgeyByZXR1cm4gcS0+dXNlckFnZW50Rm9yVXJsKHVybCk7
IH0KLSAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydHNFcnJvclBhZ2VFeHRlbnNpb24oKSBjb25zdCBP
VkVSUklERSB7IHJldHVybiBxLT5zdXBwb3J0c0V4dGVuc2lvbihRV2ViUGFnZTo6RXJyb3JQYWdl
RXh0ZW5zaW9uKTsgfQotICAgIHZpcnR1YWwgYm9vbCBlcnJvclBhZ2VFeHRlbnNpb24oRXJyb3JQ
YWdlT3B0aW9uICosIEVycm9yUGFnZVJldHVybiAqKSBPVkVSUklERTsKLSAgICB2aXJ0dWFsIFF0
UGx1Z2luV2lkZ2V0QWRhcHRlciogY3JlYXRlUGx1Z2luKGNvbnN0IFFTdHJpbmcgJiwgY29uc3Qg
UVVybCAmLCBjb25zdCBRU3RyaW5nTGlzdCAmLCBjb25zdCBRU3RyaW5nTGlzdCAmKSBPVkVSUklE
RTsKLSAgICB2aXJ0dWFsIFF0UGx1Z2luV2lkZ2V0QWRhcHRlciogYWRhcHRlckZvcldpZGdldChR
T2JqZWN0ICopIGNvbnN0IE9WRVJSSURFOwotCi0gICAgdm9pZCBjcmVhdGVNYWluRnJhbWUoKTsK
LSNpZm5kZWYgUVRfTk9fQ09OVEVYVE1FTlUKLSAgICBRTWVudSogY3JlYXRlQ29udGV4dE1lbnUo
Y29uc3QgV2ViQ29yZTo6Q29udGV4dE1lbnUqIHdlYmNvcmVNZW51LCBjb25zdCBRTGlzdDxXZWJD
b3JlOjpDb250ZXh0TWVudUl0ZW0+KiBpdGVtcywgUUJpdEFycmF5KiB2aXNpdGVkV2ViQWN0aW9u
cyk7Ci0jZW5kaWYKLSAgICB2b2lkIF9xX29uTG9hZFByb2dyZXNzQ2hhbmdlZChpbnQpOwotICAg
IHZvaWQgX3Ffd2ViQWN0aW9uVHJpZ2dlcmVkKGJvb2wgY2hlY2tlZCk7Ci0gICAgdm9pZCBfcV9j
bGVhbnVwTGVha01lc3NhZ2VzKCk7Ci0gICAgdm9pZCB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6Oldl
YkFjdGlvbiBhY3Rpb24pOwotICAgIHZvaWQgdXBkYXRlRWRpdG9yQWN0aW9ucygpOwotCi0gICAg
dm9pZCB0aW1lckV2ZW50KFFUaW1lckV2ZW50Kik7Ci0KLSAgICB2b2lkIG1vdXNlTW92ZUV2ZW50
KFFNb3VzZUV2ZW50Kik7Ci0gICAgdm9pZCBtb3VzZVByZXNzRXZlbnQoUU1vdXNlRXZlbnQqKTsK
LSAgICB2b2lkIG1vdXNlRG91YmxlQ2xpY2tFdmVudChRTW91c2VFdmVudCopOwotICAgIHZvaWQg
bW91c2VUcmlwbGVDbGlja0V2ZW50KFFNb3VzZUV2ZW50Kik7Ci0gICAgdm9pZCBtb3VzZVJlbGVh
c2VFdmVudChRTW91c2VFdmVudCopOwotI2lmbmRlZiBRVF9OT19DT05URVhUTUVOVQotICAgIHZv
aWQgY29udGV4dE1lbnVFdmVudChjb25zdCBRUG9pbnQmIGdsb2JhbFBvcyk7Ci0jZW5kaWYKLSNp
Zm5kZWYgUVRfTk9fV0hFRUxFVkVOVAotICAgIHZvaWQgd2hlZWxFdmVudChRV2hlZWxFdmVudCop
OwotI2VuZGlmCi0gICAgdm9pZCBrZXlQcmVzc0V2ZW50KFFLZXlFdmVudCopOwotICAgIHZvaWQg
a2V5UmVsZWFzZUV2ZW50KFFLZXlFdmVudCopOwotICAgIHZvaWQgZm9jdXNJbkV2ZW50KFFGb2N1
c0V2ZW50Kik7Ci0gICAgdm9pZCBmb2N1c091dEV2ZW50KFFGb2N1c0V2ZW50Kik7Ci0KLSAgICB0
ZW1wbGF0ZTxjbGFzcyBUPiB2b2lkIGRyYWdFbnRlckV2ZW50KFQqKTsKLSAgICB0ZW1wbGF0ZTxj
bGFzcyBUPiB2b2lkIGRyYWdMZWF2ZUV2ZW50KFQqKTsKLSAgICB0ZW1wbGF0ZTxjbGFzcyBUPiB2
b2lkIGRyYWdNb3ZlRXZlbnQoVCopOwotICAgIHRlbXBsYXRlPGNsYXNzIFQ+IHZvaWQgZHJvcEV2
ZW50KFQqKTsKLQotICAgIHZvaWQgaW5wdXRNZXRob2RFdmVudChRSW5wdXRNZXRob2RFdmVudCop
OwotCi0jaWZuZGVmIFFUX05PX1BST1BFUlRJRVMKLSAgICB2b2lkIGR5bmFtaWNQcm9wZXJ0eUNo
YW5nZUV2ZW50KFFEeW5hbWljUHJvcGVydHlDaGFuZ2VFdmVudCopOwotI2VuZGlmCi0KLSAgICB2
b2lkIHNob3J0Y3V0T3ZlcnJpZGVFdmVudChRS2V5RXZlbnQqKTsKLSAgICB2b2lkIGxlYXZlRXZl
bnQoUUV2ZW50Kik7Ci0gICAgdm9pZCBoYW5kbGVTb2Z0d2FyZUlucHV0UGFuZWwoUXQ6Ok1vdXNl
QnV0dG9uLCBjb25zdCBRUG9pbnQmKTsKLSAgICBib29sIGhhbmRsZVNjcm9sbGluZyhRS2V5RXZl
bnQqLCBXZWJDb3JlOjpGcmFtZSopOwotCi0gICAgLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBkZWZh
dWx0IGFjdGlvbiB3YXMgY2FuY2VsbGVkIGluIHRoZSBKUyBldmVudCBoYW5kbGVyCi0gICAgYm9v
bCB0b3VjaEV2ZW50KFFUb3VjaEV2ZW50Kik7Ci0KLSAgICBib29sIGdlc3R1cmVFdmVudChRR2Vz
dHVyZUV2ZW50Kik7Ci0KLSAgICBjbGFzcyBUb3VjaEFkanVzdGVyIHsKLSAgICBwdWJsaWM6Ci0g
ICAgICAgIFRvdWNoQWRqdXN0ZXIodW5zaWduZWQgdG9wUGFkZGluZywgdW5zaWduZWQgcmlnaHRQ
YWRkaW5nLCB1bnNpZ25lZCBib3R0b21QYWRkaW5nLCB1bnNpZ25lZCBsZWZ0UGFkZGluZyk7Ci0K
LSAgICAgICAgV2ViQ29yZTo6SW50UG9pbnQgZmluZENhbmRpZGF0ZVBvaW50Rm9yVG91Y2goY29u
c3QgV2ViQ29yZTo6SW50UG9pbnQmLCBXZWJDb3JlOjpEb2N1bWVudCopIGNvbnN0OwotCi0gICAg
cHJpdmF0ZToKLSAgICAgICAgdW5zaWduZWQgbV90b3BQYWRkaW5nOwotICAgICAgICB1bnNpZ25l
ZCBtX3JpZ2h0UGFkZGluZzsKLSAgICAgICAgdW5zaWduZWQgbV9ib3R0b21QYWRkaW5nOwotICAg
ICAgICB1bnNpZ25lZCBtX2xlZnRQYWRkaW5nOwotICAgIH07Ci0KLSAgICB2b2lkIGFkanVzdFBv
aW50Rm9yQ2xpY2tpbmcoUU1vdXNlRXZlbnQqKTsKLSNpZiAhZGVmaW5lZChRVF9OT19HUkFQSElD
U1ZJRVcpCi0gICAgdm9pZCBhZGp1c3RQb2ludEZvckNsaWNraW5nKFFHcmFwaGljc1NjZW5lTW91
c2VFdmVudCopOwotI2VuZGlmCi0KLSAgICB2b2lkIHNldEluc3BlY3RvcihRV2ViSW5zcGVjdG9y
Kik7Ci0gICAgUVdlYkluc3BlY3RvciogZ2V0T3JDcmVhdGVJbnNwZWN0b3IoKTsKLSAgICBXZWJD
b3JlOjpJbnNwZWN0b3JDb250cm9sbGVyKiBpbnNwZWN0b3JDb250cm9sbGVyKCk7Ci0gICAgcXVp
bnQxNiBpbnNwZWN0b3JTZXJ2ZXJQb3J0KCk7Ci0KLSNpZm5kZWYgUVRfTk9fU0hPUlRDVVQKLSAg
ICBzdGF0aWMgUVdlYlBhZ2U6OldlYkFjdGlvbiBlZGl0b3JBY3Rpb25Gb3JLZXlFdmVudChRS2V5
RXZlbnQqIGV2ZW50KTsKLSNlbmRpZgotICAgIHN0YXRpYyBjb25zdCBjaGFyKiBlZGl0b3JDb21t
YW5kRm9yV2ViQWN0aW9ucyhRV2ViUGFnZTo6V2ViQWN0aW9uIGFjdGlvbik7Ci0KLSAgICBRV2Vi
UGFnZSAqcTsKLSAgICBRUG9pbnRlcjxRV2ViRnJhbWU+IG1haW5GcmFtZTsKLQotI2lmbmRlZiBR
VF9OT19VTkRPU1RBQ0sKLSAgICBRVW5kb1N0YWNrICp1bmRvU3RhY2s7Ci0jZW5kaWYKLQotICAg
IFFQb2ludGVyPFFXaWRnZXQ+IHZpZXc7Ci0KLSAgICBxdWludDY0IG1fdG90YWxCeXRlczsKLSAg
ICBxdWludDY0IG1fYnl0ZXNSZWNlaXZlZDsKLQotICAgIFFQb2ludCB0cmlwbGVDbGljazsKLSAg
ICBRQmFzaWNUaW1lciB0cmlwbGVDbGlja1RpbWVyOwotCi0gICAgYm9vbCBjbGlja0NhdXNlZEZv
Y3VzOwotCi0gICAgUVdlYlBhZ2U6OkxpbmtEZWxlZ2F0aW9uUG9saWN5IGxpbmtQb2xpY3k7Ci0K
LSAgICBRU2l6ZSBtX3ZpZXdwb3J0U2l6ZTsKLSAgICBRU2l6ZSBmaXhlZExheW91dFNpemU7Ci0K
LSAgICBRV2ViSGlzdG9yeSBoaXN0b3J5OwotICAgIFFXZWJIaXRUZXN0UmVzdWx0IGhpdFRlc3RS
ZXN1bHQ7Ci0jaWZuZGVmIFFUX05PX0NPTlRFWFRNRU5VCi0gICAgUVBvaW50ZXI8UU1lbnU+IGN1
cnJlbnRDb250ZXh0TWVudTsKLSNlbmRpZgotICAgIFFQYWxldHRlIHBhbGV0dGU7Ci0gICAgYm9v
bCB1c2VGaXhlZExheW91dDsKLQotICAgIFFBY3Rpb24gKmFjdGlvbnNbUVdlYlBhZ2U6OldlYkFj
dGlvbkNvdW50XTsKLQotICAgIFFXaWRnZXQqIGluc3BlY3RvckZyb250ZW5kOwotICAgIFFXZWJJ
bnNwZWN0b3IqIGluc3BlY3RvcjsKLSAgICBib29sIGluc3BlY3RvcklzSW50ZXJuYWxPbmx5OyAv
LyBUcnVlIGlmIGNyZWF0ZWQgdGhyb3VnaCB0aGUgSW5zcGVjdCBjb250ZXh0IG1lbnUgYWN0aW9u
Ci0gICAgUXQ6OkRyb3BBY3Rpb24gbV9sYXN0RHJvcEFjdGlvbjsKLX07Ci0KLSNlbmRpZgpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9BcGkvcXdlYnNlY3VyaXR5b3JpZ2luLmggYi9Tb3Vy
Y2UvV2ViS2l0L3F0L0FwaS9xd2Vic2VjdXJpdHlvcmlnaW4uaAppbmRleCA3MzI4NjgwZjMxYzYy
YmEyMzNiYzQ5M2EzYzgwMzQ3Y2ZlNzEwODFkLi42MWM0NWYxZDZmOGQwMGE2N2Y3YWM4ODNiYjUz
NjBiYjAwNjVhOWFkIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L3F0L0FwaS9xd2Vic2VjdXJp
dHlvcmlnaW4uaAorKysgYi9Tb3VyY2UvV2ViS2l0L3F0L0FwaS9xd2Vic2VjdXJpdHlvcmlnaW4u
aApAQCAtNTksNyArNTksNyBAQCBwdWJsaWM6CiAgICAgUVdlYlNlY3VyaXR5T3JpZ2luICZvcGVy
YXRvcj0oY29uc3QgUVdlYlNlY3VyaXR5T3JpZ2luJiBvdGhlcik7CiBwcml2YXRlOgogICAgIGZy
aWVuZCBjbGFzcyBRV2ViRGF0YWJhc2U7Ci0gICAgZnJpZW5kIGNsYXNzIFFXZWJGcmFtZTsKKyAg
ICBmcmllbmQgY2xhc3MgUVdlYkZyYW1lQWRhcHRlcjsKICAgICBmcmllbmQgY2xhc3MgV2ViQ29y
ZTo6Q2hyb21lQ2xpZW50UXQ7CiAgICAgUVdlYlNlY3VyaXR5T3JpZ2luKFFXZWJTZWN1cml0eU9y
aWdpblByaXZhdGUqIHByaXYpOwogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0L0FwaS9x
d2Vidmlldy5jcHAgYi9Tb3VyY2UvV2ViS2l0L3F0L0FwaS9xd2Vidmlldy5jcHAKZGVsZXRlZCBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZGE2YTE4ZWZkMTc4MjU4NDYyZjE1Y2I5Mjk1MTRkOGQw
MDkzMjMuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291
cmNlL1dlYktpdC9xdC9BcGkvcXdlYnZpZXcuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTEyOSAr
MCwwIEBACi0vKgotICAgIENvcHlyaWdodCAoQykgMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQv
b3IgaXRzIHN1YnNpZGlhcnkoLWllcykKLSAgICBDb3B5cmlnaHQgKEMpIDIwMDggSG9sZ2VyIEhh
bnMgUGV0ZXIgRnJleXRoZXIKLSAgICBDb3B5cmlnaHQgKEMpIDIwMDkgR2lyaXNoIFJhbWFrcmlz
aG5hbiA8Z2lyaXNoQGZvcndhcmRiaWFzLmluPgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUg
c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICAgIG1vZGlmeSBpdCB1
bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gICAgTGlj
ZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVy
Ci0gICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBs
YXRlciB2ZXJzaW9uLgotCi0gICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBo
b3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZ
OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAgICBNRVJDSEFOVEFCSUxJ
VFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICAg
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi0gICAg
WW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZp
bGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCi0gICAgdGhlIEZyZWUgU29mdHdhcmUg
Rm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKLSAgICBC
b3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KLSovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNp
bmNsdWRlICJxd2Vidmlldy5oIgotCi0jaW5jbHVkZSAiUGFnZS5oIgotI2luY2x1ZGUgIlFXZWJQ
YWdlQ2xpZW50LmgiCi0jaW5jbHVkZSAiU2V0dGluZ3MuaCIKLSNpbmNsdWRlICJxd2ViZnJhbWUu
aCIKLSNpbmNsdWRlICJxd2VicGFnZV9wLmgiCi0jaW5jbHVkZSAicWJpdG1hcC5oIgotI2luY2x1
ZGUgInFldmVudC5oIgotI2luY2x1ZGUgInFwYWludGVyLmgiCi0jaWYgSEFWRShRVFBSSU5UU1VQ
UE9SVCkKLSNpbmNsdWRlICJxcHJpbnRlci5oIgotI2VuZGlmCi0jaW5jbHVkZSAicWRpci5oIgot
I2luY2x1ZGUgInFmaWxlLmgiCi0jaWZuZGVmIFFUX05PX0FDQ0VTU0lCSUxJVFkKLSNpbmNsdWRl
ICJxd2Vidmlld2FjY2Vzc2libGVfcC5oIgotI2VuZGlmCi0KLWNsYXNzIFFXZWJWaWV3UHJpdmF0
ZSB7Ci1wdWJsaWM6Ci0gICAgUVdlYlZpZXdQcml2YXRlKFFXZWJWaWV3ICp2aWV3KQotICAgICAg
ICA6IHZpZXcodmlldykKLSAgICAgICAgLCBwYWdlKDApCi0gICAgICAgICwgcmVuZGVySGludHMo
UVBhaW50ZXI6OlRleHRBbnRpYWxpYXNpbmcgfCBRUGFpbnRlcjo6U21vb3RoUGl4bWFwVHJhbnNm
b3JtKQotICAgIHsKLSAgICAgICAgUV9BU1NFUlQodmlldyk7Ci0gICAgfQotCi0gICAgdmlydHVh
bCB+UVdlYlZpZXdQcml2YXRlKCk7Ci0KLSAgICB2b2lkIF9xX3BhZ2VEZXN0cm95ZWQoKTsKLSAg
ICB2b2lkIGRldGFjaEN1cnJlbnRQYWdlKCk7Ci0KLSAgICBRV2ViVmlldyAqdmlldzsKLSAgICBR
V2ViUGFnZSAqcGFnZTsKLQotICAgIFFQYWludGVyOjpSZW5kZXJIaW50cyByZW5kZXJIaW50czsK
LX07Ci0KLVFXZWJWaWV3UHJpdmF0ZTo6flFXZWJWaWV3UHJpdmF0ZSgpCi17Ci0gICAgZGV0YWNo
Q3VycmVudFBhZ2UoKTsKLX0KLQotdm9pZCBRV2ViVmlld1ByaXZhdGU6Ol9xX3BhZ2VEZXN0cm95
ZWQoKQotewotICAgIHBhZ2UgPSAwOwotICAgIHZpZXctPnNldFBhZ2UoMCk7Ci19Ci0KLS8qIQot
ICAgIFxjbGFzcyBRV2ViVmlldwotICAgIFxzaW5jZSA0LjQKLSAgICBcYnJpZWYgVGhlIFFXZWJW
aWV3IGNsYXNzIHByb3ZpZGVzIGEgd2lkZ2V0IHRoYXQgaXMgdXNlZCB0byB2aWV3IGFuZCBlZGl0
Ci0gICAgd2ViIGRvY3VtZW50cy4KLSAgICBcaW5ncm91cCBhZHZhbmNlZAotCi0gICAgXGlubW9k
dWxlIFF0V2ViS2l0Ci0KLSAgICBRV2ViVmlldyBpcyB0aGUgbWFpbiB3aWRnZXQgY29tcG9uZW50
IG9mIHRoZSBRdFdlYktpdCB3ZWIgYnJvd3NpbmcgbW9kdWxlLgotICAgIEl0IGNhbiBiZSB1c2Vk
IGluIHZhcmlvdXMgYXBwbGljYXRpb25zIHRvIGRpc3BsYXkgd2ViIGNvbnRlbnQgbGl2ZSBmcm9t
IHRoZQotICAgIEludGVybmV0LgotCi0gICAgVGhlIGltYWdlIGJlbG93IHNob3dzIFFXZWJWaWV3
IHByZXZpZXdlZCBpbiBcUUQgd2l0aCBhIE5va2lhIHdlYnNpdGUuCi0KLSAgICBcaW1hZ2UgcXdl
YnZpZXctdXJsLnBuZwotCi0gICAgQSB3ZWIgc2l0ZSBjYW4gYmUgbG9hZGVkIG9udG8gUVdlYlZp
ZXcgd2l0aCB0aGUgbG9hZCgpIGZ1bmN0aW9uLiBMaWtlIGFsbAotICAgIFF0IHdpZGdldHMsIHRo
ZSBzaG93KCkgZnVuY3Rpb24gbXVzdCBiZSBpbnZva2VkIGluIG9yZGVyIHRvIGRpc3BsYXkKLSAg
ICBRV2ViVmlldy4gVGhlIHNuaXBwZXQgYmVsb3cgaWxsdXN0cmF0ZXMgdGhpczoKLQotICAgIFxz
bmlwcGV0IHdlYmtpdHNuaXBwZXRzL3NpbXBsZS9tYWluLmNwcCBVc2luZyBRV2ViVmlldwotCi0g
ICAgQWx0ZXJuYXRpdmVseSwgc2V0VXJsKCkgY2FuIGFsc28gYmUgdXNlZCB0byBsb2FkIGEgd2Vi
IHNpdGUuIElmIHlvdSBoYXZlCi0gICAgdGhlIEhUTUwgY29udGVudCByZWFkaWx5IGF2YWlsYWJs
ZSwgeW91IGNhbiB1c2Ugc2V0SHRtbCgpIGluc3RlYWQuCi0KLSAgICBUaGUgbG9hZFN0YXJ0ZWQo
KSBzaWduYWwgaXMgZW1pdHRlZCB3aGVuIHRoZSB2aWV3IGJlZ2lucyBsb2FkaW5nLiBUaGUKLSAg
ICBsb2FkUHJvZ3Jlc3MoKSBzaWduYWwsIG9uIHRoZSBvdGhlciBoYW5kLCBpcyBlbWl0dGVkIHdo
ZW5ldmVyIGFuIGVsZW1lbnQgb2YKLSAgICB0aGUgd2ViIHZpZXcgY29tcGxldGVzIGxvYWRpbmcs
IHN1Y2ggYXMgYW4gZW1iZWRkZWQgaW1hZ2UsIGEgc2NyaXB0LCBldGMuCi0gICAgRmluYWxseSwg
dGhlIGxvYWRGaW5pc2hlZCgpIHNpZ25hbCBpcyBlbWl0dGVkIHdoZW4gdGhlIHZpZXcgaGFzIGxv
YWRlZAotICAgIGNvbXBsZXRlbHkuIEl0J3MgYXJndW1lbnQgLSBlaXRoZXIgXGMgdHJ1ZSBvciBc
YyBmYWxzZSAtIGluZGljYXRlcwotICAgIGxvYWQgc3VjY2VzcyBvciBmYWlsdXJlLgotCi0gICAg
VGhlIHBhZ2UoKSBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgd2ViIHBhZ2Ugb2Jq
ZWN0LiBTZWUKLSAgICBcbHtFbGVtZW50cyBvZiBRV2ViVmlld30gZm9yIGFuIGV4cGxhbmF0aW9u
IG9mIGhvdyB0aGUgd2ViIHBhZ2UKLSAgICBpcyByZWxhdGVkIHRvIHRoZSB2aWV3LiBUbyBtb2Rp
ZnkgeW91ciB3ZWIgdmlldydzIHNldHRpbmdzLCB5b3UgY2FuIGFjY2VzcwotICAgIHRoZSBRV2Vi
U2V0dGluZ3Mgb2JqZWN0IHdpdGggdGhlIHNldHRpbmdzKCkgZnVuY3Rpb24uIFdpdGggUVdlYlNl
dHRpbmdzLAotICAgIHlvdSBjYW4gY2hhbmdlIHRoZSBkZWZhdWx0IGZvbnRzLCBlbmFibGUgb3Ig
ZGlzYWJsZSBmZWF0dXJlcyBzdWNoIGFzCi0gICAgSmF2YVNjcmlwdCBhbmQgcGx1Z2lucy4KLQot
ICAgIFRoZSB0aXRsZSBvZiBhbiBIVE1MIGRvY3VtZW50IGNhbiBiZSBhY2Nlc3NlZCB3aXRoIHRo
ZSB0aXRsZSgpIHByb3BlcnR5LgotICAgIEFkZGl0aW9uYWxseSwgYSB3ZWIgc2l0ZSBtYXkgYWxz
byBzcGVjaWZ5IGFuIGljb24sIHdoaWNoIGNhbiBiZSBhY2Nlc3NlZAotICAgIHVzaW5nIHRoZSBp
Y29uKCkgcHJvcGVydHkuIElmIHRoZSB0aXRsZSBvciB0aGUgaWNvbiBjaGFuZ2VzLCB0aGUgY29y
cmVzcG9uZGluZwotICAgIHRpdGxlQ2hhbmdlZCgpIGFuZCBpY29uQ2hhbmdlZCgpIHNpZ25hbHMg
d2lsbCBiZSBlbWl0dGVkLiBUaGUKLSAgICB0ZXh0U2l6ZU11bHRpcGxpZXIoKSBwcm9wZXJ0eSBj
YW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIG92ZXJhbGwgc2l6ZSBvZgotICAgIHRoZSB0ZXh0IGRp
c3BsYXllZCBpbiB0aGUgd2ViIHZpZXcuCi0KLSAgICBJZiB5b3UgcmVxdWlyZSBhIGN1c3RvbSBj
b250ZXh0IG1lbnUsIHlvdSBjYW4gaW1wbGVtZW50IGl0IGJ5IHJlaW1wbGVtZW50aW5nCi0gICAg
XGx7UVdpZGdldDo6fXtjb250ZXh0TWVudUV2ZW50KCl9IGFuZCBwb3B1bGF0aW5nIHlvdXIgUU1l
bnUgd2l0aCB0aGUgYWN0aW9ucwotICAgIG9idGFpbmVkIGZyb20gcGFnZUFjdGlvbigpLiBNb3Jl
IGZ1bmN0aW9uYWxpdHkgc3VjaCBhcyByZWxvYWRpbmcgdGhlIHZpZXcsCi0gICAgY29weWluZyBz
ZWxlY3RlZCB0ZXh0IHRvIHRoZSBjbGlwYm9hcmQsIG9yIHBhc3RpbmcgaW50byB0aGUgdmlldywg
aXMgYWxzbwotICAgIGVuY2Fwc3VsYXRlZCB3aXRoaW4gdGhlIFFBY3Rpb24gb2JqZWN0cyByZXR1
cm5lZCBieSBwYWdlQWN0aW9uKCkuIFRoZXNlCi0gICAgYWN0aW9ucyBjYW4gYmUgcHJvZ3JhbW1h
dGljYWxseSB0cmlnZ2VyZWQgdXNpbmcgdHJpZ2dlclBhZ2VBY3Rpb24oKS4KLSAgICBBbHRlcm5h
dGl2ZWx5LCB0aGUgYWN0aW9ucyBjYW4gYmUgYWRkZWQgdG8gYSB0b29sYmFyIG9yIGEgbWVudSBk
aXJlY3RseS4KLSAgICBRV2ViVmlldyBtYWludGFpbnMgdGhlIHN0YXRlIG9mIHRoZSByZXR1cm5l
ZCBhY3Rpb25zIGJ1dCBhbGxvd3MKLSAgICBtb2RpZmljYXRpb24gb2YgYWN0aW9uIHByb3BlcnRp
ZXMgc3VjaCBhcyBcbHtRQWN0aW9uOjp9e3RleHR9IG9yCi0gICAgXGx7UUFjdGlvbjo6fXtpY29u
fS4KLQotICAgIEEgUVdlYlZpZXcgY2FuIGJlIHByaW50ZWQgb250byBhIFFQcmludGVyIHVzaW5n
IHRoZSBwcmludCgpIGZ1bmN0aW9uLgotICAgIFRoaXMgZnVuY3Rpb24gaXMgbWFya2VkIGFzIGEg
c2xvdCBhbmQgY2FuIGJlIGNvbnZlbmllbnRseSBjb25uZWN0ZWQgdG8KLSAgICBcbHtRUHJpbnRQ
cmV2aWV3RGlhbG9nfSdzIFxse1FQcmludFByZXZpZXdEaWFsb2c6On17cGFpbnRSZXF1ZXN0ZWQo
KX0KLSAgICBzaWduYWwuCi0KLSAgICBJZiB5b3Ugd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9y
IHdlYiBzaXRlcyB0aGF0IGFsbG93IHRoZSB1c2VyIHRvIG9wZW4KLSAgICBuZXcgd2luZG93cywg
c3VjaCBhcyBwb3AtdXAgd2luZG93cywgeW91IGNhbiBzdWJjbGFzcyBRV2ViVmlldyBhbmQKLSAg
ICByZWltcGxlbWVudCB0aGUgY3JlYXRlV2luZG93KCkgZnVuY3Rpb24uCi0KLSAgICBcc2VjdGlv
bjEgRWxlbWVudHMgb2YgUVdlYlZpZXcKLQotICAgIFFXZWJWaWV3IGNvbnNpc3RzIG9mIG90aGVy
IG9iamVjdHMgc3VjaCBhcyBRV2ViRnJhbWUgYW5kIFFXZWJQYWdlLiBUaGUKLSAgICBmbG93Y2hh
cnQgYmVsb3cgc2hvd3MgdGhlc2UgZWxlbWVudHMgYXJlIHJlbGF0ZWQuCi0KLSAgICBcaW1hZ2Ug
cXdlYnZpZXctZGlhZ3JhbS5wbmcKLQotICAgIFxub3RlIEl0IGlzIHBvc3NpYmxlIHRvIHVzZSBR
V2ViUGFnZSBhbmQgUVdlYkZyYW1lLCB3aXRob3V0IHVzaW5nIFFXZWJWaWV3LAotICAgIGlmIHlv
dSBkbyBub3QgcmVxdWlyZSBRV2lkZ2V0IGF0dHJpYnV0ZXMuIE5ldmVydGhlbGVzcywgUXRXZWJL
aXQgZGVwZW5kcwotICAgIG9uIFF0R3VpLCBzbyB5b3Ugc2hvdWxkIHVzZSBhIFFBcHBsaWNhdGlv
biBpbnN0ZWFkIG9mIFFDb3JlQXBwbGljYXRpb24uCi0KLSAgICBcc2Ege1ByZXZpZXdlciBFeGFt
cGxlfSwge1dlYiBCcm93c2VyfSwge0Zvcm0gRXh0cmFjdG9yIEV4YW1wbGV9LAotICAgIHtHb29n
bGUgQ2hhdCBFeGFtcGxlfSwge0ZhbmN5IEJyb3dzZXIgRXhhbXBsZX0KLSovCi0KLSNpZm5kZWYg
UVRfTk9fQUNDRVNTSUJJTElUWQotc3RhdGljIFFBY2Nlc3NpYmxlSW50ZXJmYWNlKiBhY2Nlc3Np
YmxlSW50ZXJmYWNlRmFjdG9yeShjb25zdCBRU3RyaW5nJiBrZXksIFFPYmplY3QqIG9iamVjdCkK
LXsKLSAgICBRX1VOVVNFRChrZXkpCi0KLSAgICBpZiAoUVdlYlBhZ2UqIHBhZ2UgPSBxb2JqZWN0
X2Nhc3Q8UVdlYlBhZ2UqPihvYmplY3QpKQotICAgICAgICByZXR1cm4gbmV3IFFXZWJQYWdlQWNj
ZXNzaWJsZShwYWdlKTsKLSAgICBpZiAoUVdlYlZpZXcqIHZpZXcgPSBxb2JqZWN0X2Nhc3Q8UVdl
YlZpZXcqPihvYmplY3QpKQotICAgICAgICByZXR1cm4gbmV3IFFXZWJWaWV3QWNjZXNzaWJsZSh2
aWV3KTsKLSAgICBpZiAoUVdlYkZyYW1lKiBmcmFtZSA9IHFvYmplY3RfY2FzdDxRV2ViRnJhbWUq
PihvYmplY3QpKQotICAgICAgICByZXR1cm4gbmV3IFFXZWJGcmFtZUFjY2Vzc2libGUoZnJhbWUp
OwotICAgIHJldHVybiAwOwotfQotI2VuZGlmCi0KLS8qIQotICAgIENvbnN0cnVjdHMgYW4gZW1w
dHkgUVdlYlZpZXcgd2l0aCBwYXJlbnQgXGEgcGFyZW50LgotCi0gICAgXHNhIGxvYWQoKQotKi8K
LVFXZWJWaWV3OjpRV2ViVmlldyhRV2lkZ2V0ICpwYXJlbnQpCi0gICAgOiBRV2lkZ2V0KHBhcmVu
dCkKLXsKLSAgICBkID0gbmV3IFFXZWJWaWV3UHJpdmF0ZSh0aGlzKTsKLQotI2lmICFkZWZpbmVk
KFFfV1NfUVdTKQotICAgIHNldEF0dHJpYnV0ZShRdDo6V0FfSW5wdXRNZXRob2RFbmFibGVkKTsK
LSNlbmRpZgotCi0gICAgc2V0QXR0cmlidXRlKFF0OjpXQV9BY2NlcHRUb3VjaEV2ZW50cyk7Ci0g
ICAgc2V0QWNjZXB0RHJvcHModHJ1ZSk7Ci0KLSAgICBzZXRNb3VzZVRyYWNraW5nKHRydWUpOwot
ICAgIHNldEZvY3VzUG9saWN5KFF0OjpXaGVlbEZvY3VzKTsKLQotI2lmbmRlZiBRVF9OT19BQ0NF
U1NJQklMSVRZCi0gICAgUUFjY2Vzc2libGU6Omluc3RhbGxGYWN0b3J5KGFjY2Vzc2libGVJbnRl
cmZhY2VGYWN0b3J5KTsKLSNlbmRpZgotfQotCi0vKiEKLSAgICBEZXN0cm95cyB0aGUgd2ViIHZp
ZXcuCi0qLwotUVdlYlZpZXc6On5RV2ViVmlldygpCi17Ci0gICAgZGVsZXRlIGQ7Ci19Ci0KLS8q
IQotICAgIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSB1bmRlcmx5aW5nIHdlYiBwYWdlLgotCi0g
ICAgXHNhIHNldFBhZ2UoKQotKi8KLVFXZWJQYWdlICpRV2ViVmlldzo6cGFnZSgpIGNvbnN0Ci17
Ci0gICAgaWYgKCFkLT5wYWdlKSB7Ci0gICAgICAgIFFXZWJWaWV3ICp0aGF0ID0gY29uc3RfY2Fz
dDxRV2ViVmlldyAqPih0aGlzKTsKLSAgICAgICAgdGhhdC0+c2V0UGFnZShuZXcgUVdlYlBhZ2Uo
dGhhdCkpOwotICAgIH0KLSAgICByZXR1cm4gZC0+cGFnZTsKLX0KLQotdm9pZCBRV2ViVmlld1By
aXZhdGU6OmRldGFjaEN1cnJlbnRQYWdlKCkKLXsKLSAgICBpZiAoIXBhZ2UpCi0gICAgICAgIHJl
dHVybjsKLQotICAgIHBhZ2UtPmQtPnZpZXcgPSAwOwotCi0gICAgLy8gaWYgdGhlIHBhZ2UgY2xp
ZW50IGlzIHRoZSBzcGVjaWFsIGNsaWVudCBjb25zdHJ1Y3RlZCBmb3IKLSAgICAvLyBkZWxlZ2F0
aW5nIHRoZSByZXNwb25zaWJpbGl0aWVzIHRvIGEgUVdpZGdldCwgd2UgbmVlZAotICAgIC8vIHRv
IGRlc3Ryb3kgaXQuCi0KLSAgICBpZiAocGFnZS0+ZC0+Y2xpZW50ICYmIHBhZ2UtPmQtPmNsaWVu
dC0+aXNRV2lkZ2V0Q2xpZW50KCkpCi0gICAgICAgIHBhZ2UtPmQtPmNsaWVudC5yZXNldCgpOwot
Ci0gICAgcGFnZS0+ZC0+Y2xpZW50LnRha2UoKTsKLQotICAgIC8vIGlmIHRoZSBwYWdlIHdhcyBj
cmVhdGVkIGJ5IHVzLCB3ZSBvd24gaXQgYW5kIG5lZWQgdG8KLSAgICAvLyBkZXN0cm95IGl0IGFz
IHdlbGwuCi0KLSAgICBpZiAocGFnZS0+cGFyZW50KCkgPT0gdmlldykKLSAgICAgICAgZGVsZXRl
IHBhZ2U7Ci0gICAgZWxzZQotICAgICAgICBwYWdlLT5kaXNjb25uZWN0KHZpZXcpOwotCi0gICAg
cGFnZSA9IDA7Ci19Ci0KLS8qIQotICAgIE1ha2VzIFxhIHBhZ2UgdGhlIG5ldyB3ZWIgcGFnZSBv
ZiB0aGUgd2ViIHZpZXcuCi0KLSAgICBUaGUgcGFyZW50IFFPYmplY3Qgb2YgdGhlIHByb3ZpZGVk
IHBhZ2UgcmVtYWlucyB0aGUgb3duZXIKLSAgICBvZiB0aGUgb2JqZWN0LiBJZiB0aGUgY3VycmVu
dCBwYWdlIGlzIGEgY2hpbGQgb2YgdGhlIHdlYgotICAgIHZpZXcsIGl0IHdpbGwgYmUgZGVsZXRl
ZC4KLQotICAgIFxzYSBwYWdlKCkKLSovCi12b2lkIFFXZWJWaWV3OjpzZXRQYWdlKFFXZWJQYWdl
KiBwYWdlKQotewotICAgIGlmIChkLT5wYWdlID09IHBhZ2UpCi0gICAgICAgIHJldHVybjsKLQot
ICAgIGQtPmRldGFjaEN1cnJlbnRQYWdlKCk7Ci0gICAgZC0+cGFnZSA9IHBhZ2U7Ci0KLSAgICBp
ZiAoZC0+cGFnZSkgewotICAgICAgICBkLT5wYWdlLT5zZXRWaWV3KHRoaXMpOwotICAgICAgICBk
LT5wYWdlLT5zZXRQYWxldHRlKHBhbGV0dGUoKSk7Ci0gICAgICAgIC8vICMjIyMgY29ubmVjdCBz
aWduYWxzCi0gICAgICAgIFFXZWJGcmFtZSAqbWFpbkZyYW1lID0gZC0+cGFnZS0+bWFpbkZyYW1l
KCk7Ci0gICAgICAgIGNvbm5lY3QobWFpbkZyYW1lLCBTSUdOQUwodGl0bGVDaGFuZ2VkKFFTdHJp
bmcpKSwKLSAgICAgICAgICAgICAgICB0aGlzLCBTSUdOQUwodGl0bGVDaGFuZ2VkKFFTdHJpbmcp
KSk7Ci0gICAgICAgIGNvbm5lY3QobWFpbkZyYW1lLCBTSUdOQUwoaWNvbkNoYW5nZWQoKSksCi0g
ICAgICAgICAgICAgICAgdGhpcywgU0lHTkFMKGljb25DaGFuZ2VkKCkpKTsKLSAgICAgICAgY29u
bmVjdChtYWluRnJhbWUsIFNJR05BTCh1cmxDaGFuZ2VkKFFVcmwpKSwKLSAgICAgICAgICAgICAg
ICB0aGlzLCBTSUdOQUwodXJsQ2hhbmdlZChRVXJsKSkpOwotCi0gICAgICAgIGNvbm5lY3QoZC0+
cGFnZSwgU0lHTkFMKGxvYWRTdGFydGVkKCkpLAotICAgICAgICAgICAgICAgIHRoaXMsIFNJR05B
TChsb2FkU3RhcnRlZCgpKSk7Ci0gICAgICAgIGNvbm5lY3QoZC0+cGFnZSwgU0lHTkFMKGxvYWRQ
cm9ncmVzcyhpbnQpKSwKLSAgICAgICAgICAgICAgICB0aGlzLCBTSUdOQUwobG9hZFByb2dyZXNz
KGludCkpKTsKLSAgICAgICAgY29ubmVjdChkLT5wYWdlLCBTSUdOQUwobG9hZEZpbmlzaGVkKGJv
b2wpKSwKLSAgICAgICAgICAgICAgICB0aGlzLCBTSUdOQUwobG9hZEZpbmlzaGVkKGJvb2wpKSk7
Ci0gICAgICAgIGNvbm5lY3QoZC0+cGFnZSwgU0lHTkFMKHN0YXR1c0Jhck1lc3NhZ2UoUVN0cmlu
ZykpLAotICAgICAgICAgICAgICAgIHRoaXMsIFNJR05BTChzdGF0dXNCYXJNZXNzYWdlKFFTdHJp
bmcpKSk7Ci0gICAgICAgIGNvbm5lY3QoZC0+cGFnZSwgU0lHTkFMKGxpbmtDbGlja2VkKFFVcmwp
KSwKLSAgICAgICAgICAgICAgICB0aGlzLCBTSUdOQUwobGlua0NsaWNrZWQoUVVybCkpKTsKLSAg
ICAgICAgY29ubmVjdChkLT5wYWdlLCBTSUdOQUwoc2VsZWN0aW9uQ2hhbmdlZCgpKSwKLSAgICAg
ICAgICAgICAgICB0aGlzLCBTSUdOQUwoc2VsZWN0aW9uQ2hhbmdlZCgpKSk7Ci0KLSAgICAgICAg
Y29ubmVjdChkLT5wYWdlLCBTSUdOQUwobWljcm9Gb2N1c0NoYW5nZWQoKSksCi0gICAgICAgICAg
ICAgICAgdGhpcywgU0xPVCh1cGRhdGVNaWNyb0ZvY3VzKCkpKTsKLSAgICAgICAgY29ubmVjdChk
LT5wYWdlLCBTSUdOQUwoZGVzdHJveWVkKCkpLAotICAgICAgICAgICAgICAgIHRoaXMsIFNMT1Qo
X3FfcGFnZURlc3Ryb3llZCgpKSk7Ci0gICAgfQotICAgIHNldEF0dHJpYnV0ZShRdDo6V0FfT3Bh
cXVlUGFpbnRFdmVudCwgZC0+cGFnZSk7Ci0gICAgdXBkYXRlKCk7Ci19Ci0KLS8qIQotICAgIExv
YWRzIHRoZSBzcGVjaWZpZWQgXGEgdXJsIGFuZCBkaXNwbGF5cyBpdC4KLQotICAgIFxub3RlIFRo
ZSB2aWV3IHJlbWFpbnMgdGhlIHNhbWUgdW50aWwgZW5vdWdoIGRhdGEgaGFzIGFycml2ZWQgdG8g
ZGlzcGxheSB0aGUgbmV3IFxhIHVybC4KLQotICAgIFxzYSBzZXRVcmwoKSwgdXJsKCksIHVybENo
YW5nZWQoKSwgUVVybDo6ZnJvbVVzZXJJbnB1dCgpCi0qLwotdm9pZCBRV2ViVmlldzo6bG9hZChj
b25zdCBRVXJsICZ1cmwpCi17Ci0gICAgcGFnZSgpLT5tYWluRnJhbWUoKS0+bG9hZCh1cmwpOwot
fQotCi0vKiEKLSAgICBcZm4gdm9pZCBRV2ViVmlldzo6bG9hZChjb25zdCBRTmV0d29ya1JlcXVl
c3QgJnJlcXVlc3QsIFFOZXR3b3JrQWNjZXNzTWFuYWdlcjo6T3BlcmF0aW9uIG9wZXJhdGlvbiwg
Y29uc3QgUUJ5dGVBcnJheSAmYm9keSkKLQotICAgIExvYWRzIGEgbmV0d29yayByZXF1ZXN0LCBc
YSByZXF1ZXN0LCB1c2luZyB0aGUgbWV0aG9kIHNwZWNpZmllZCBpbiBcYSBvcGVyYXRpb24uCi0K
LSAgICBcYSBib2R5IGlzIG9wdGlvbmFsIGFuZCBpcyBvbmx5IHVzZWQgZm9yIFBPU1Qgb3BlcmF0
aW9ucy4KLQotICAgIFxub3RlIFRoZSB2aWV3IHJlbWFpbnMgdGhlIHNhbWUgdW50aWwgZW5vdWdo
IGRhdGEgaGFzIGFycml2ZWQgdG8gZGlzcGxheSB0aGUgbmV3IHVybC4KLQotICAgIFxzYSB1cmwo
KSwgdXJsQ2hhbmdlZCgpCi0qLwotCi12b2lkIFFXZWJWaWV3Ojpsb2FkKGNvbnN0IFFOZXR3b3Jr
UmVxdWVzdCAmcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgUU5ldHdvcmtBY2Nlc3NNYW5h
Z2VyOjpPcGVyYXRpb24gb3BlcmF0aW9uLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBRQnl0
ZUFycmF5ICZib2R5KQotewotICAgIHBhZ2UoKS0+bWFpbkZyYW1lKCktPmxvYWQocmVxdWVzdCwg
b3BlcmF0aW9uLCBib2R5KTsKLX0KLQotLyohCi0gICAgU2V0cyB0aGUgY29udGVudCBvZiB0aGUg
d2ViIHZpZXcgdG8gdGhlIHNwZWNpZmllZCBcYSBodG1sLgotCi0gICAgRXh0ZXJuYWwgb2JqZWN0
cyBzdWNoIGFzIHN0eWxlc2hlZXRzIG9yIGltYWdlcyByZWZlcmVuY2VkIGluIHRoZSBIVE1MCi0g
ICAgZG9jdW1lbnQgYXJlIGxvY2F0ZWQgcmVsYXRpdmUgdG8gXGEgYmFzZVVybC4KLQotICAgIFRo
ZSBcYSBodG1sIGlzIGxvYWRlZCBpbW1lZGlhdGVseTsgZXh0ZXJuYWwgb2JqZWN0cyBhcmUgbG9h
ZGVkIGFzeW5jaHJvbm91c2x5LgotCi0gICAgV2hlbiB1c2luZyB0aGlzIG1ldGhvZCwgV2ViS2l0
IGFzc3VtZXMgdGhhdCBleHRlcm5hbCByZXNvdXJjZXMgc3VjaCBhcwotICAgIEphdmFTY3JpcHQg
cHJvZ3JhbXMgb3Igc3R5bGUgc2hlZXRzIGFyZSBlbmNvZGVkIGluIFVURi04IHVubGVzcyBvdGhl
cndpc2UKLSAgICBzcGVjaWZpZWQuIEZvciBleGFtcGxlLCB0aGUgZW5jb2Rpbmcgb2YgYW4gZXh0
ZXJuYWwgc2NyaXB0IGNhbiBiZSBzcGVjaWZpZWQKLSAgICB0aHJvdWdoIHRoZSBjaGFyc2V0IGF0
dHJpYnV0ZSBvZiB0aGUgSFRNTCBzY3JpcHQgdGFnLiBBbHRlcm5hdGl2ZWx5LCB0aGUKLSAgICBl
bmNvZGluZyBjYW4gYWxzbyBiZSBzcGVjaWZpZWQgYnkgdGhlIHdlYiBzZXJ2ZXIuCi0KLSAgICBU
aGlzIGlzIGEgY29udmVuaWVuY2UgZnVuY3Rpb24gZXF1aXZhbGVudCB0byBzZXRDb250ZW50KGh0
bWwsICJ0ZXh0L2h0bWwiLCBiYXNlVXJsKS4KLQotICAgIFx3YXJuaW5nIFRoaXMgZnVuY3Rpb24g
d29ya3Mgb25seSBmb3IgSFRNTCwgZm9yIG90aGVyIG1pbWUgdHlwZXMgKGkuZS4gWEhUTUwsIFNW
RykKLSAgICBzZXRDb250ZW50KCkgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4KLQotICAgIFxzYSBs
b2FkKCksIHNldENvbnRlbnQoKSwgUVdlYkZyYW1lOjp0b0h0bWwoKSwgUVdlYkZyYW1lOjpzZXRD
b250ZW50KCkKLSovCi12b2lkIFFXZWJWaWV3OjpzZXRIdG1sKGNvbnN0IFFTdHJpbmcgJmh0bWws
IGNvbnN0IFFVcmwgJmJhc2VVcmwpCi17Ci0gICAgcGFnZSgpLT5tYWluRnJhbWUoKS0+c2V0SHRt
bChodG1sLCBiYXNlVXJsKTsKLX0KLQotLyohCi0gICAgU2V0cyB0aGUgY29udGVudCBvZiB0aGUg
d2ViIHZpZXcgdG8gdGhlIHNwZWNpZmllZCBjb250ZW50IFxhIGRhdGEuIElmIHRoZSBcYSBtaW1l
VHlwZSBhcmd1bWVudAotICAgIGlzIGVtcHR5IGl0IGlzIGN1cnJlbnRseSBhc3N1bWVkIHRoYXQg
dGhlIGNvbnRlbnQgaXMgSFRNTCBidXQgaW4gZnV0dXJlIHZlcnNpb25zIHdlIG1heSBpbnRyb2R1
Y2UKLSAgICBhdXRvLWRldGVjdGlvbi4KLQotICAgIEV4dGVybmFsIG9iamVjdHMgcmVmZXJlbmNl
ZCBpbiB0aGUgY29udGVudCBhcmUgbG9jYXRlZCByZWxhdGl2ZSB0byBcYSBiYXNlVXJsLgotCi0g
ICAgVGhlIFxhIGRhdGEgaXMgbG9hZGVkIGltbWVkaWF0ZWx5OyBleHRlcm5hbCBvYmplY3RzIGFy
ZSBsb2FkZWQgYXN5bmNocm9ub3VzbHkuCi0KLSAgICBcc2EgbG9hZCgpLCBzZXRIdG1sKCksIFFX
ZWJGcmFtZTo6dG9IdG1sKCkKLSovCi12b2lkIFFXZWJWaWV3OjpzZXRDb250ZW50KGNvbnN0IFFC
eXRlQXJyYXkgJmRhdGEsIGNvbnN0IFFTdHJpbmcgJm1pbWVUeXBlLCBjb25zdCBRVXJsICZiYXNl
VXJsKQotewotICAgIHBhZ2UoKS0+bWFpbkZyYW1lKCktPnNldENvbnRlbnQoZGF0YSwgbWltZVR5
cGUsIGJhc2VVcmwpOwotfQotCi0vKiEKLSAgICBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgdmll
dydzIGhpc3Rvcnkgb2YgbmF2aWdhdGVkIHdlYiBwYWdlcy4KLQotICAgIEl0IGlzIGVxdWl2YWxl
bnQgdG8KLQotICAgIFxzbmlwcGV0IHdlYmtpdHNuaXBwZXRzL3F0d2Via2l0X3F3ZWJ2aWV3X3Nu
aXBwZXQuY3BwIDAKLSovCi1RV2ViSGlzdG9yeSAqUVdlYlZpZXc6Omhpc3RvcnkoKSBjb25zdAot
ewotICAgIHJldHVybiBwYWdlKCktPmhpc3RvcnkoKTsKLX0KLQotLyohCi0gICAgUmV0dXJucyBh
IHBvaW50ZXIgdG8gdGhlIHZpZXcvcGFnZSBzcGVjaWZpYyBzZXR0aW5ncyBvYmplY3QuCi0KLSAg
ICBJdCBpcyBlcXVpdmFsZW50IHRvCi0KLSAgICBcc25pcHBldCB3ZWJraXRzbmlwcGV0cy9xdHdl
YmtpdF9xd2Vidmlld19zbmlwcGV0LmNwcCAxCi0KLSAgICBcc2EgUVdlYlNldHRpbmdzOjpnbG9i
YWxTZXR0aW5ncygpCi0qLwotUVdlYlNldHRpbmdzICpRV2ViVmlldzo6c2V0dGluZ3MoKSBjb25z
dAotewotICAgIHJldHVybiBwYWdlKCktPnNldHRpbmdzKCk7Ci19Ci0KLS8qIQotICAgIFxwcm9w
ZXJ0eSBRV2ViVmlldzo6dGl0bGUKLSAgICBcYnJpZWYgdGhlIHRpdGxlIG9mIHRoZSB3ZWIgcGFn
ZSBjdXJyZW50bHkgdmlld2VkCi0KLSAgICBCeSBkZWZhdWx0LCB0aGlzIHByb3BlcnR5IGNvbnRh
aW5zIGFuIGVtcHR5IHN0cmluZy4KLQotICAgIFxzYSB0aXRsZUNoYW5nZWQoKQotKi8KLVFTdHJp
bmcgUVdlYlZpZXc6OnRpdGxlKCkgY29uc3QKLXsKLSAgICBpZiAoZC0+cGFnZSkKLSAgICAgICAg
cmV0dXJuIGQtPnBhZ2UtPm1haW5GcmFtZSgpLT50aXRsZSgpOwotICAgIHJldHVybiBRU3RyaW5n
KCk7Ci19Ci0KLS8qIQotICAgIFxwcm9wZXJ0eSBRV2ViVmlldzo6dXJsCi0gICAgXGJyaWVmIHRo
ZSB1cmwgb2YgdGhlIHdlYiBwYWdlIGN1cnJlbnRseSB2aWV3ZWQKLQotICAgIFNldHRpbmcgdGhp
cyBwcm9wZXJ0eSBjbGVhcnMgdGhlIHZpZXcgYW5kIGxvYWRzIHRoZSBVUkwuCi0KLSAgICBCeSBk
ZWZhdWx0LCB0aGlzIHByb3BlcnR5IGNvbnRhaW5zIGFuIGVtcHR5LCBpbnZhbGlkIFVSTC4KLQot
ICAgIFxzYSBsb2FkKCksIHVybENoYW5nZWQoKQotKi8KLQotdm9pZCBRV2ViVmlldzo6c2V0VXJs
KGNvbnN0IFFVcmwgJnVybCkKLXsKLSAgICBwYWdlKCktPm1haW5GcmFtZSgpLT5zZXRVcmwodXJs
KTsKLX0KLQotUVVybCBRV2ViVmlldzo6dXJsKCkgY29uc3QKLXsKLSAgICBpZiAoZC0+cGFnZSkK
LSAgICAgICAgcmV0dXJuIGQtPnBhZ2UtPm1haW5GcmFtZSgpLT51cmwoKTsKLSAgICByZXR1cm4g
UVVybCgpOwotfQotCi0vKiEKLSAgICBccHJvcGVydHkgUVdlYlZpZXc6Omljb24KLSAgICBcYnJp
ZWYgdGhlIGljb24gYXNzb2NpYXRlZCB3aXRoIHRoZSB3ZWIgcGFnZSBjdXJyZW50bHkgdmlld2Vk
Ci0KLSAgICBCeSBkZWZhdWx0LCB0aGlzIHByb3BlcnR5IGNvbnRhaW5zIGEgbnVsbCBpY29uLgot
Ci0gICAgXHNhIGljb25DaGFuZ2VkKCksIFFXZWJTZXR0aW5nczo6aWNvbkZvclVybCgpCi0qLwot
UUljb24gUVdlYlZpZXc6Omljb24oKSBjb25zdAotewotICAgIGlmIChkLT5wYWdlKQotICAgICAg
ICByZXR1cm4gZC0+cGFnZS0+bWFpbkZyYW1lKCktPmljb24oKTsKLSAgICByZXR1cm4gUUljb24o
KTsKLX0KLQotLyohCi0gICAgXHByb3BlcnR5IFFXZWJWaWV3OjpoYXNTZWxlY3Rpb24KLSAgICBc
YnJpZWYgd2hldGhlciB0aGlzIHBhZ2UgY29udGFpbnMgc2VsZWN0ZWQgY29udGVudCBvciBub3Qu
Ci0KLSAgICBCeSBkZWZhdWx0LCB0aGlzIHByb3BlcnR5IGlzIGZhbHNlLgotCi0gICAgXHNhIHNl
bGVjdGlvbkNoYW5nZWQoKQotKi8KLWJvb2wgUVdlYlZpZXc6Omhhc1NlbGVjdGlvbigpIGNvbnN0
Ci17Ci0gICAgaWYgKGQtPnBhZ2UpCi0gICAgICAgIHJldHVybiBkLT5wYWdlLT5oYXNTZWxlY3Rp
b24oKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIQotICAgIFxwcm9wZXJ0eSBRV2ViVmll
dzo6c2VsZWN0ZWRUZXh0Ci0gICAgXGJyaWVmIHRoZSB0ZXh0IGN1cnJlbnRseSBzZWxlY3RlZAot
Ci0gICAgQnkgZGVmYXVsdCwgdGhpcyBwcm9wZXJ0eSBjb250YWlucyBhbiBlbXB0eSBzdHJpbmcu
Ci0KLSAgICBcc2EgZmluZFRleHQoKSwgc2VsZWN0aW9uQ2hhbmdlZCgpLCBzZWxlY3RlZEh0bWwo
KQotKi8KLVFTdHJpbmcgUVdlYlZpZXc6OnNlbGVjdGVkVGV4dCgpIGNvbnN0Ci17Ci0gICAgaWYg
KGQtPnBhZ2UpCi0gICAgICAgIHJldHVybiBkLT5wYWdlLT5zZWxlY3RlZFRleHQoKTsKLSAgICBy
ZXR1cm4gUVN0cmluZygpOwotfQotCi0vKiEKLSAgICBcc2luY2UgNC44Ci0gICAgXHByb3BlcnR5
IFFXZWJWaWV3OjpzZWxlY3RlZEh0bWwKLSAgICBcYnJpZWYgdGhlIEhUTUwgY3VycmVudGx5IHNl
bGVjdGVkCi0KLSAgICBCeSBkZWZhdWx0LCB0aGlzIHByb3BlcnR5IGNvbnRhaW5zIGFuIGVtcHR5
IHN0cmluZy4KLQotICAgIFxzYSBmaW5kVGV4dCgpLCBzZWxlY3Rpb25DaGFuZ2VkKCksIHNlbGVj
dGVkVGV4dCgpCi0qLwotUVN0cmluZyBRV2ViVmlldzo6c2VsZWN0ZWRIdG1sKCkgY29uc3QKLXsK
LSAgICBpZiAoZC0+cGFnZSkKLSAgICAgICAgcmV0dXJuIGQtPnBhZ2UtPnNlbGVjdGVkSHRtbCgp
OwotICAgIHJldHVybiBRU3RyaW5nKCk7Ci19Ci0KLSNpZm5kZWYgUVRfTk9fQUNUSU9OCi0vKiEK
LSAgICBSZXR1cm5zIGEgcG9pbnRlciB0byBhIFFBY3Rpb24gdGhhdCBlbmNhcHN1bGF0ZXMgdGhl
IHNwZWNpZmllZCB3ZWIgYWN0aW9uIFxhIGFjdGlvbi4KLSovCi1RQWN0aW9uICpRV2ViVmlldzo6
cGFnZUFjdGlvbihRV2ViUGFnZTo6V2ViQWN0aW9uIGFjdGlvbikgY29uc3QKLXsKLSAgICByZXR1
cm4gcGFnZSgpLT5hY3Rpb24oYWN0aW9uKTsKLX0KLSNlbmRpZgotCi0vKiEKLSAgICBUcmlnZ2Vy
cyB0aGUgc3BlY2lmaWVkIFxhIGFjdGlvbi4gSWYgaXQgaXMgYSBjaGVja2FibGUgYWN0aW9uIHRo
ZSBzcGVjaWZpZWQKLSAgICBcYSBjaGVja2VkIHN0YXRlIGlzIGFzc3VtZWQuCi0KLSAgICBUaGUg
Zm9sbG93aW5nIGV4YW1wbGUgdHJpZ2dlcnMgdGhlIGNvcHkgYWN0aW9uIGFuZCB0aGVyZWZvcmUg
Y29waWVzIGFueQotICAgIHNlbGVjdGVkIHRleHQgdG8gdGhlIGNsaXBib2FyZC4KLQotICAgIFxz
bmlwcGV0IHdlYmtpdHNuaXBwZXRzL3F0d2Via2l0X3F3ZWJ2aWV3X3NuaXBwZXQuY3BwIDIKLQot
ICAgIFxzYSBwYWdlQWN0aW9uKCkKLSovCi12b2lkIFFXZWJWaWV3Ojp0cmlnZ2VyUGFnZUFjdGlv
bihRV2ViUGFnZTo6V2ViQWN0aW9uIGFjdGlvbiwgYm9vbCBjaGVja2VkKQotewotICAgIHBhZ2Uo
KS0+dHJpZ2dlckFjdGlvbihhY3Rpb24sIGNoZWNrZWQpOwotfQotCi0vKiEKLSAgICBccHJvcGVy
dHkgUVdlYlZpZXc6Om1vZGlmaWVkCi0gICAgXGJyaWVmIHdoZXRoZXIgdGhlIGRvY3VtZW50IHdh
cyBtb2RpZmllZCBieSB0aGUgdXNlcgotCi0gICAgUGFydHMgb2YgSFRNTCBkb2N1bWVudHMgY2Fu
IGJlIGVkaXRhYmxlIGZvciBleGFtcGxlIHRocm91Z2ggdGhlCi0gICAgXGN7Y29udGVudGVkaXRh
YmxlfSBhdHRyaWJ1dGUgb24gSFRNTCBlbGVtZW50cy4KLQotICAgIEJ5IGRlZmF1bHQsIHRoaXMg
cHJvcGVydHkgaXMgZmFsc2UuCi0qLwotYm9vbCBRV2ViVmlldzo6aXNNb2RpZmllZCgpIGNvbnN0
Ci17Ci0gICAgaWYgKGQtPnBhZ2UpCi0gICAgICAgIHJldHVybiBkLT5wYWdlLT5pc01vZGlmaWVk
KCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKgotUXQ6OlRleHRJbnRlcmFjdGlvbkZsYWdz
IFFXZWJWaWV3Ojp0ZXh0SW50ZXJhY3Rpb25GbGFncygpIGNvbnN0Ci17Ci0gICAgLy8gIyMjIEZJ
WE1FIChhZGQgdG8gcGFnZSkKLSAgICByZXR1cm4gUXQ6OlRleHRJbnRlcmFjdGlvbkZsYWdzKCk7
Ci19Ci0qLwotCi0vKgotICAgIFxwcm9wZXJ0eSBRV2ViVmlldzo6dGV4dEludGVyYWN0aW9uRmxh
Z3MKLSAgICBcYnJpZWYgaG93IHRoZSB2aWV3IHNob3VsZCBoYW5kbGUgdXNlciBpbnB1dAotCi0g
ICAgU3BlY2lmaWVzIGhvdyB0aGUgdXNlciBjYW4gaW50ZXJhY3Qgd2l0aCB0aGUgdGV4dCBvbiB0
aGUgcGFnZS4KLSovCi0KLS8qCi12b2lkIFFXZWJWaWV3OjpzZXRUZXh0SW50ZXJhY3Rpb25GbGFn
cyhRdDo6VGV4dEludGVyYWN0aW9uRmxhZ3MgZmxhZ3MpCi17Ci0gICAgUV9VTlVTRUQoZmxhZ3Mp
Ci0gICAgLy8gIyMjIEZJWE1FIChhZGQgdG8gcGFnZSkKLX0KLSovCi0KLS8qIQotICAgIFxyZWlt
cAotKi8KLVFTaXplIFFXZWJWaWV3OjpzaXplSGludCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIFFT
aXplKDgwMCwgNjAwKTsgLy8gIyMjIy4uLgotfQotCi0vKiEKLSAgICBccHJvcGVydHkgUVdlYlZp
ZXc6Onpvb21GYWN0b3IKLSAgICBcc2luY2UgNC41Ci0gICAgXGJyaWVmIHRoZSB6b29tIGZhY3Rv
ciBmb3IgdGhlIHZpZXcKLSovCi0KLXZvaWQgUVdlYlZpZXc6OnNldFpvb21GYWN0b3IocXJlYWwg
ZmFjdG9yKQotewotICAgIHBhZ2UoKS0+bWFpbkZyYW1lKCktPnNldFpvb21GYWN0b3IoZmFjdG9y
KTsKLX0KLQotcXJlYWwgUVdlYlZpZXc6Onpvb21GYWN0b3IoKSBjb25zdAotewotICAgIHJldHVy
biBwYWdlKCktPm1haW5GcmFtZSgpLT56b29tRmFjdG9yKCk7Ci19Ci0KLS8qIQotICBccHJvcGVy
dHkgUVdlYlZpZXc6OnRleHRTaXplTXVsdGlwbGllcgotICBcYnJpZWYgdGhlIHNjYWxpbmcgZmFj
dG9yIGZvciBhbGwgdGV4dCBpbiB0aGUgZnJhbWUKLSAgXG9ic29sZXRlCi0KLSAgVXNlIHNldFpv
b21GYWN0b3IgaW5zdGVhZCwgaW4gY29tYmluYXRpb24gd2l0aCB0aGUKLSAgWm9vbVRleHRPbmx5
IGF0dHJpYnV0ZSBpbiBRV2ViU2V0dGluZ3MuCi0KLSAgXG5vdGUgU2V0dGluZyB0aGlzIHByb3Bl
cnR5IGFsc28gZW5hYmxlcyB0aGUKLSAgWm9vbVRleHRPbmx5IGF0dHJpYnV0ZSBpbiBRV2ViU2V0
dGluZ3MuCi0KLSAgQnkgZGVmYXVsdCwgdGhpcyBwcm9wZXJ0eSBjb250YWlucyBhIHZhbHVlIG9m
IDEuMC4KLSovCi0KLS8qIQotICAgIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBtdWx0aXBsaWVyIHVz
ZWQgdG8gc2NhbGUgdGhlIHRleHQgaW4gYSBXZWIgcGFnZSB0bwotICAgIHRoZSBcYSBmYWN0b3Ig
c3BlY2lmaWVkLgotKi8KLXZvaWQgUVdlYlZpZXc6OnNldFRleHRTaXplTXVsdGlwbGllcihxcmVh
bCBmYWN0b3IpCi17Ci0gICAgcGFnZSgpLT5tYWluRnJhbWUoKS0+c2V0VGV4dFNpemVNdWx0aXBs
aWVyKGZhY3Rvcik7Ci19Ci0KLS8qIQotICAgIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBtdWx0
aXBsaWVyIHVzZWQgdG8gc2NhbGUgdGhlIHRleHQgaW4gYSBXZWIgcGFnZS4KLSovCi1xcmVhbCBR
V2ViVmlldzo6dGV4dFNpemVNdWx0aXBsaWVyKCkgY29uc3QKLXsKLSAgICByZXR1cm4gcGFnZSgp
LT5tYWluRnJhbWUoKS0+dGV4dFNpemVNdWx0aXBsaWVyKCk7Ci19Ci0KLS8qIQotICAgIFxwcm9w
ZXJ0eSBRV2ViVmlldzo6cmVuZGVySGludHMKLSAgICBcc2luY2UgNC42Ci0gICAgXGJyaWVmIHRo
ZSBkZWZhdWx0IHJlbmRlciBoaW50cyBmb3IgdGhlIHZpZXcKLQotICAgIFRoZXNlIGhpbnRzIGFy
ZSB1c2VkIHRvIGluaXRpYWxpemUgUVBhaW50ZXIgYmVmb3JlIHBhaW50aW5nIHRoZSBXZWIgcGFn
ZS4KLQotICAgIFFQYWludGVyOjpUZXh0QW50aWFsaWFzaW5nIGFuZCBRUGFpbnRlcjo6U21vb3Ro
UGl4bWFwVHJhbnNmb3JtIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQuCi0KLSAgICBcc2EgUVBhaW50
ZXI6OnJlbmRlckhpbnRzKCkKLSovCi0KLS8qIQotICAgIFxzaW5jZSA0LjYKLSAgICBSZXR1cm5z
IHRoZSByZW5kZXIgaGludHMgdXNlZCBieSB0aGUgdmlldyB0byByZW5kZXIgY29udGVudC4KLQot
ICAgIFxzYSBRUGFpbnRlcjo6cmVuZGVySGludHMoKQotKi8KLVFQYWludGVyOjpSZW5kZXJIaW50
cyBRV2ViVmlldzo6cmVuZGVySGludHMoKSBjb25zdAotewotICAgIHJldHVybiBkLT5yZW5kZXJI
aW50czsKLX0KLQotLyohCi0gICAgXHNpbmNlIDQuNgotICAgIFNldHMgdGhlIHJlbmRlciBoaW50
cyB1c2VkIGJ5IHRoZSB2aWV3IHRvIHRoZSBzcGVjaWZpZWQgXGEgaGludHMuCi0KLSAgICBcc2Eg
UVBhaW50ZXI6OnNldFJlbmRlckhpbnRzKCkKLSovCi12b2lkIFFXZWJWaWV3OjpzZXRSZW5kZXJI
aW50cyhRUGFpbnRlcjo6UmVuZGVySGludHMgaGludHMpCi17Ci0gICAgaWYgKGhpbnRzID09IGQt
PnJlbmRlckhpbnRzKQotICAgICAgICByZXR1cm47Ci0gICAgZC0+cmVuZGVySGludHMgPSBoaW50
czsKLSAgICB1cGRhdGUoKTsKLX0KLQotLyohCi0gICAgXHNpbmNlIDQuNgotICAgIElmIFxhIGVu
YWJsZWQgaXMgdHJ1ZSwgZW5hYmxlcyB0aGUgc3BlY2lmaWVkIHJlbmRlciBcYSBoaW50OyBvdGhl
cndpc2UKLSAgICBkaXNhYmxlcyBpdC4KLQotICAgIFxzYSByZW5kZXJIaW50cywgUVBhaW50ZXI6
OnJlbmRlckhpbnRzKCkKLSovCi12b2lkIFFXZWJWaWV3OjpzZXRSZW5kZXJIaW50KFFQYWludGVy
OjpSZW5kZXJIaW50IGhpbnQsIGJvb2wgZW5hYmxlZCkKLXsKLSAgICBRUGFpbnRlcjo6UmVuZGVy
SGludHMgb2xkSGludHMgPSBkLT5yZW5kZXJIaW50czsKLSAgICBpZiAoZW5hYmxlZCkKLSAgICAg
ICAgZC0+cmVuZGVySGludHMgfD0gaGludDsKLSAgICBlbHNlCi0gICAgICAgIGQtPnJlbmRlckhp
bnRzICY9IH5oaW50OwotICAgIGlmIChvbGRIaW50cyAhPSBkLT5yZW5kZXJIaW50cykKLSAgICAg
ICAgdXBkYXRlKCk7Ci19Ci0KLQotLyohCi0gICAgRmluZHMgdGhlIHNwZWNpZmllZCBzdHJpbmcs
IFxhIHN1YlN0cmluZywgaW4gdGhlIHBhZ2UsIHVzaW5nIHRoZSBnaXZlbiBcYSBvcHRpb25zLgot
Ci0gICAgSWYgdGhlIEhpZ2hsaWdodEFsbE9jY3VycmVuY2VzIGZsYWcgaXMgcGFzc2VkLCB0aGUg
ZnVuY3Rpb24gd2lsbCBoaWdobGlnaHQgYWxsIG9jY3VycmVuY2VzCi0gICAgdGhhdCBleGlzdCBp
biB0aGUgcGFnZS4gQWxsIHN1YnNlcXVlbnQgY2FsbHMgd2lsbCBleHRlbmQgdGhlIGhpZ2hsaWdo
dCwgcmF0aGVyIHRoYW4KLSAgICByZXBsYWNlIGl0LCB3aXRoIG9jY3VycmVuY2VzIG9mIHRoZSBu
ZXcgc3RyaW5nLgotCi0gICAgSWYgdGhlIEhpZ2hsaWdodEFsbE9jY3VycmVuY2VzIGZsYWcgaXMg
bm90IHBhc3NlZCwgdGhlIGZ1bmN0aW9uIHdpbGwgc2VsZWN0IGFuIG9jY3VycmVuY2UKLSAgICBh
bmQgYWxsIHN1YnNlcXVlbnQgY2FsbHMgd2lsbCByZXBsYWNlIHRoZSBjdXJyZW50IG9jY3VycmVu
Y2Ugd2l0aCB0aGUgbmV4dCBvbmUuCi0KLSAgICBUbyBjbGVhciB0aGUgc2VsZWN0aW9uLCBqdXN0
IHBhc3MgYW4gZW1wdHkgc3RyaW5nLgotCi0gICAgUmV0dXJucyB0cnVlIGlmIFxhIHN1YlN0cmlu
ZyB3YXMgZm91bmQ7IG90aGVyd2lzZSByZXR1cm5zIGZhbHNlLgotCi0gICAgXHNhIHNlbGVjdGVk
VGV4dCgpLCBzZWxlY3Rpb25DaGFuZ2VkKCkKLSovCi1ib29sIFFXZWJWaWV3OjpmaW5kVGV4dChj
b25zdCBRU3RyaW5nICZzdWJTdHJpbmcsIFFXZWJQYWdlOjpGaW5kRmxhZ3Mgb3B0aW9ucykKLXsK
LSAgICBpZiAoZC0+cGFnZSkKLSAgICAgICAgcmV0dXJuIGQtPnBhZ2UtPmZpbmRUZXh0KHN1YlN0
cmluZywgb3B0aW9ucyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiEgXHJlaW1wCi0qLwot
Ym9vbCBRV2ViVmlldzo6ZXZlbnQoUUV2ZW50ICplKQotewotICAgIGlmIChkLT5wYWdlKSB7Ci0j
aWZuZGVmIFFUX05PX0NPTlRFWFRNRU5VCi0gICAgICAgIGlmIChlLT50eXBlKCkgPT0gUUV2ZW50
OjpDb250ZXh0TWVudSkgewotICAgICAgICAgICAgaWYgKCFpc0VuYWJsZWQoKSkKLSAgICAgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBRQ29udGV4dE1lbnVFdmVudCAqZXZl
bnQgPSBzdGF0aWNfY2FzdDxRQ29udGV4dE1lbnVFdmVudCAqPihlKTsKLSAgICAgICAgICAgIGlm
IChkLT5wYWdlLT5zd2FsbG93Q29udGV4dE1lbnVFdmVudChldmVudCkpIHsKLSAgICAgICAgICAg
ICAgICBlLT5hY2NlcHQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIGQtPnBhZ2UtPnVwZGF0ZVBvc2l0aW9uRGVwZW5kZW50QWN0aW9u
cyhldmVudC0+cG9zKCkpOwotICAgICAgICB9IGVsc2UKLSNlbmRpZiAvLyBRVF9OT19DT05URVhU
TUVOVQotICAgICAgICBpZiAoZS0+dHlwZSgpID09IFFFdmVudDo6U2hvcnRjdXRPdmVycmlkZSkg
ewotICAgICAgICAgICAgZC0+cGFnZS0+ZXZlbnQoZSk7Ci0jaWZuZGVmIFFUX05PX0NVUlNPUgot
ICAgICAgICB9IGVsc2UgaWYgKGUtPnR5cGUoKSA9PSBRRXZlbnQ6OkN1cnNvckNoYW5nZSkgewot
ICAgICAgICAgICAgLy8gQW4gdW5zZXRDdXJzb3Igd2lsbCBzZXQgdGhlIGN1cnNvciB0byBRdDo6
QXJyb3dDdXJzb3IuCi0gICAgICAgICAgICAvLyBUaHVzIHRoaXMgY3Vyc29yIGNoYW5nZSBtaWdo
dCBiZSBhIFFXaWRnZXQ6OnVuc2V0Q3Vyc29yKCkKLSAgICAgICAgICAgIC8vIElmIHRoaXMgaXMg
bm90IHRoZSBjYXNlIGFuZCBpdCBjYW1lIGZyb20gV2ViQ29yZSwgdGhlCi0gICAgICAgICAgICAv
LyBRV2ViUGFnZUNsaWVudCBhbHJlYWR5IGhhcyBzZXQgaXRzIGN1cnNvciBpbnRlcm5hbGx5Ci0g
ICAgICAgICAgICAvLyB0byBRdDo6QXJyb3dDdXJzb3IsIHNvIHVwZGF0aW5nIHRoZSBjdXJzb3Ig
aXMgYWx3YXlzCi0gICAgICAgICAgICAvLyByaWdodCwgYXMgaXQgZmFsbHMgYmFjayB0byB0aGUg
bGFzdCBjdXJzb3Igc2V0IGJ5Ci0gICAgICAgICAgICAvLyBXZWJDb3JlLgotICAgICAgICAgICAg
Ly8gRklYTUU6IEFkZCBhIFFFdmVudDo6Q3Vyc29yVW5zZXQgb3Igc2ltaWxhciB0byBRdC4KLSAg
ICAgICAgICAgIGlmIChjdXJzb3IoKS5zaGFwZSgpID09IFF0OjpBcnJvd0N1cnNvcikKLSAgICAg
ICAgICAgICAgICBkLT5wYWdlLT5kLT5jbGllbnQtPnJlc2V0Q3Vyc29yKCk7Ci0jZW5kaWYKLSAg
ICAgICAgfSBlbHNlIGlmIChlLT50eXBlKCkgPT0gUUV2ZW50OjpUb3VjaEJlZ2luIAotICAgICAg
ICAgICAgICAgICAgIHx8IGUtPnR5cGUoKSA9PSBRRXZlbnQ6OlRvdWNoRW5kIAotICAgICAgICAg
ICAgICAgICAgIHx8IGUtPnR5cGUoKSA9PSBRRXZlbnQ6OlRvdWNoVXBkYXRlCi0gICAgICAgICAg
ICAgICAgICAgfHwgZS0+dHlwZSgpID09IFFFdmVudDo6VG91Y2hDYW5jZWwKLSAgICAgICAgICAg
ICAgICAgICkgewotICAgICAgICAgICAgZC0+cGFnZS0+ZXZlbnQoZSk7Ci0KLSAgICAgICAgICAg
IC8vIEFsd2F5cyByZXR1cm4gdHJ1ZSBzbyB0aGF0IHdlJ2xsIHJlY2VpdmUgYWxzbyBUb3VjaFVw
ZGF0ZSBhbmQgVG91Y2hFbmQgZXZlbnRzCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAg
ICAgfSBlbHNlIGlmIChlLT50eXBlKCkgPT0gUUV2ZW50OjpMZWF2ZSkKLSAgICAgICAgICAgIGQt
PnBhZ2UtPmV2ZW50KGUpOwotICAgIH0KLQotICAgIHJldHVybiBRV2lkZ2V0OjpldmVudChlKTsK
LX0KLQotLyohCi0gICAgUHJpbnRzIHRoZSBtYWluIGZyYW1lIHRvIHRoZSBnaXZlbiBcYSBwcmlu
dGVyLgotCi0gICAgXHNhIFFXZWJGcmFtZTo6cHJpbnQoKSwgUVByaW50UHJldmlld0RpYWxvZwot
Ki8KLXZvaWQgUVdlYlZpZXc6OnByaW50KFFQcmludGVyICpwcmludGVyKSBjb25zdAotewotI2lm
ICFkZWZpbmVkKFFUX05PX1BSSU5URVIpICYmIEhBVkUoUVRQUklOVFNVUFBPUlQpCi0gICAgcGFn
ZSgpLT5tYWluRnJhbWUoKS0+cHJpbnQocHJpbnRlcik7Ci0jZW5kaWYKLX0KLQotLyohCi0gICAg
Q29udmVuaWVuY2Ugc2xvdCB0aGF0IHN0b3BzIGxvYWRpbmcgdGhlIGRvY3VtZW50LgotCi0gICAg
SXQgaXMgZXF1aXZhbGVudCB0bwotCi0gICAgXHNuaXBwZXQgd2Via2l0c25pcHBldHMvcXR3ZWJr
aXRfcXdlYnZpZXdfc25pcHBldC5jcHAgMwotCi0gICAgXHNhIHJlbG9hZCgpLCBwYWdlQWN0aW9u
KCksIGxvYWRGaW5pc2hlZCgpCi0qLwotdm9pZCBRV2ViVmlldzo6c3RvcCgpCi17Ci0gICAgaWYg
KGQtPnBhZ2UpCi0gICAgICAgIGQtPnBhZ2UtPnRyaWdnZXJBY3Rpb24oUVdlYlBhZ2U6OlN0b3Ap
OwotfQotCi0vKiEKLSAgICBDb252ZW5pZW5jZSBzbG90IHRoYXQgbG9hZHMgdGhlIHByZXZpb3Vz
IGRvY3VtZW50IGluIHRoZSBsaXN0IG9mIGRvY3VtZW50cwotICAgIGJ1aWx0IGJ5IG5hdmlnYXRp
bmcgbGlua3MuIERvZXMgbm90aGluZyBpZiB0aGVyZSBpcyBubyBwcmV2aW91cyBkb2N1bWVudC4K
LQotICAgIEl0IGlzIGVxdWl2YWxlbnQgdG8KLQotICAgIFxzbmlwcGV0IHdlYmtpdHNuaXBwZXRz
L3F0d2Via2l0X3F3ZWJ2aWV3X3NuaXBwZXQuY3BwIDQKLQotICAgIFxzYSBmb3J3YXJkKCksIHBh
Z2VBY3Rpb24oKQotKi8KLXZvaWQgUVdlYlZpZXc6OmJhY2soKQotewotICAgIGlmIChkLT5wYWdl
KQotICAgICAgICBkLT5wYWdlLT50cmlnZ2VyQWN0aW9uKFFXZWJQYWdlOjpCYWNrKTsKLX0KLQot
LyohCi0gICAgQ29udmVuaWVuY2Ugc2xvdCB0aGF0IGxvYWRzIHRoZSBuZXh0IGRvY3VtZW50IGlu
IHRoZSBsaXN0IG9mIGRvY3VtZW50cwotICAgIGJ1aWx0IGJ5IG5hdmlnYXRpbmcgbGlua3MuIERv
ZXMgbm90aGluZyBpZiB0aGVyZSBpcyBubyBuZXh0IGRvY3VtZW50LgotCi0gICAgSXQgaXMgZXF1
aXZhbGVudCB0bwotCi0gICAgXHNuaXBwZXQgd2Via2l0c25pcHBldHMvcXR3ZWJraXRfcXdlYnZp
ZXdfc25pcHBldC5jcHAgNQotCi0gICAgXHNhIGJhY2soKSwgcGFnZUFjdGlvbigpCi0qLwotdm9p
ZCBRV2ViVmlldzo6Zm9yd2FyZCgpCi17Ci0gICAgaWYgKGQtPnBhZ2UpCi0gICAgICAgIGQtPnBh
Z2UtPnRyaWdnZXJBY3Rpb24oUVdlYlBhZ2U6OkZvcndhcmQpOwotfQotCi0vKiEKLSAgICBSZWxv
YWRzIHRoZSBjdXJyZW50IGRvY3VtZW50LgotCi0gICAgXHNhIHN0b3AoKSwgcGFnZUFjdGlvbigp
LCBsb2FkU3RhcnRlZCgpCi0qLwotdm9pZCBRV2ViVmlldzo6cmVsb2FkKCkKLXsKLSAgICBpZiAo
ZC0+cGFnZSkKLSAgICAgICAgZC0+cGFnZS0+dHJpZ2dlckFjdGlvbihRV2ViUGFnZTo6UmVsb2Fk
KTsKLX0KLQotLyohIFxyZWltcAotKi8KLXZvaWQgUVdlYlZpZXc6OnJlc2l6ZUV2ZW50KFFSZXNp
emVFdmVudCAqZSkKLXsKLSAgICBpZiAoZC0+cGFnZSkKLSAgICAgICAgZC0+cGFnZS0+c2V0Vmll
d3BvcnRTaXplKGUtPnNpemUoKSk7Ci19Ci0KLS8qISBccmVpbXAKLSovCi12b2lkIFFXZWJWaWV3
OjpwYWludEV2ZW50KFFQYWludEV2ZW50ICpldikKLXsKLSAgICBpZiAoIWQtPnBhZ2UpCi0gICAg
ICAgIHJldHVybjsKLSNpZmRlZiBRV0VCS0lUX1RJTUVfUkVOREVSSU5HCi0gICAgUVRpbWUgdGlt
ZTsKLSAgICB0aW1lLnN0YXJ0KCk7Ci0jZW5kaWYKLQotICAgIFFXZWJGcmFtZSAqZnJhbWUgPSBk
LT5wYWdlLT5tYWluRnJhbWUoKTsKLSAgICBRUGFpbnRlciBwKHRoaXMpOwotICAgIHAuc2V0UmVu
ZGVySGludHMoZC0+cmVuZGVySGludHMpOwotCi0gICAgZnJhbWUtPnJlbmRlcigmcCwgZXYtPnJl
Z2lvbigpKTsKLQotI2lmZGVmICAgIFFXRUJLSVRfVElNRV9SRU5ERVJJTkcKLSAgICBpbnQgZWxh
cHNlZCA9IHRpbWUuZWxhcHNlZCgpOwotICAgIHFEZWJ1ZygpIDw8ICJwYWludCBldmVudCBvbiAi
IDw8IGV2LT5yZWdpb24oKSA8PCAiLCB0b29rIHRvIHJlbmRlciA9ICAiIDw8IGVsYXBzZWQ7Ci0j
ZW5kaWYKLX0KLQotLyohCi0gICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSB0aGUgY3Jl
YXRlV2luZG93KCkgbWV0aG9kIG9mIHRoZSBhc3NvY2lhdGVkIFFXZWJQYWdlLAotICAgIGVhY2gg
dGltZSB0aGUgcGFnZSB3YW50cyB0byBjcmVhdGUgYSBuZXcgd2luZG93IG9mIHRoZSBnaXZlbiBc
YSB0eXBlLiBUaGlzIG1pZ2h0Ci0gICAgYmUgdGhlIHJlc3VsdCwgZm9yIGV4YW1wbGUsIG9mIGEg
SmF2YVNjcmlwdCByZXF1ZXN0IHRvIG9wZW4gYSBkb2N1bWVudCBpbiBhIG5ldyB3aW5kb3cuCi0K
LSAgICBcbm90ZSBJZiB0aGUgY3JlYXRlV2luZG93KCkgbWV0aG9kIG9mIHRoZSBhc3NvY2lhdGVk
IHBhZ2UgaXMgcmVpbXBsZW1lbnRlZCwgdGhpcwotICAgIG1ldGhvZCBpcyBub3QgY2FsbGVkLCB1
bmxlc3MgZXhwbGljaXRseSBkb25lIHNvIGluIHRoZSByZWltcGxlbWVudGF0aW9uLgotCi0gICAg
XG5vdGUgSW4gdGhlIGNhc2VzIHdoZW4gdGhlIHdpbmRvdyBjcmVhdGlvbiBpcyBiZWluZyB0cmln
Z2VyZWQgYnkgSmF2YVNjcmlwdCwgYXBhcnQgZnJvbQotICAgIHJlaW1wbGVtZW50aW5nIHRoaXMg
bWV0aG9kIGFwcGxpY2F0aW9uIG11c3QgYWxzbyBzZXQgdGhlIEphdmFTY3JpcHRDYW5PcGVuV2lu
ZG93cyBhdHRyaWJ1dGUKLSAgICBvZiBRV2ViU2V0dGluZ3MgdG8gdHJ1ZSBpbiBvcmRlciBmb3Ig
aXQgdG8gZ2V0IGNhbGxlZC4KLQotICAgIFxzYSBRV2ViUGFnZTo6Y3JlYXRlV2luZG93KCksIFFX
ZWJQYWdlOjphY2NlcHROYXZpZ2F0aW9uUmVxdWVzdCgpCi0qLwotUVdlYlZpZXcgKlFXZWJWaWV3
OjpjcmVhdGVXaW5kb3coUVdlYlBhZ2U6OldlYldpbmRvd1R5cGUgdHlwZSkKLXsKLSAgICBRX1VO
VVNFRCh0eXBlKQotICAgIHJldHVybiAwOwotfQotCi0vKiEgXHJlaW1wCi0qLwotdm9pZCBRV2Vi
Vmlldzo6bW91c2VNb3ZlRXZlbnQoUU1vdXNlRXZlbnQqIGV2KQotewotICAgIGlmIChkLT5wYWdl
KSB7Ci0gICAgICAgIGNvbnN0IGJvb2wgYWNjZXB0ZWQgPSBldi0+aXNBY2NlcHRlZCgpOwotICAg
ICAgICBkLT5wYWdlLT5ldmVudChldik7Ci0gICAgICAgIGV2LT5zZXRBY2NlcHRlZChhY2NlcHRl
ZCk7Ci0gICAgfQotfQotCi0vKiEgXHJlaW1wCi0qLwotdm9pZCBRV2ViVmlldzo6bW91c2VQcmVz
c0V2ZW50KFFNb3VzZUV2ZW50KiBldikKLXsKLSAgICBpZiAoZC0+cGFnZSkgewotICAgICAgICBj
b25zdCBib29sIGFjY2VwdGVkID0gZXYtPmlzQWNjZXB0ZWQoKTsKLSAgICAgICAgZC0+cGFnZS0+
ZXZlbnQoZXYpOwotICAgICAgICBldi0+c2V0QWNjZXB0ZWQoYWNjZXB0ZWQpOwotICAgIH0KLX0K
LQotLyohIFxyZWltcAotKi8KLXZvaWQgUVdlYlZpZXc6Om1vdXNlRG91YmxlQ2xpY2tFdmVudChR
TW91c2VFdmVudCogZXYpCi17Ci0gICAgaWYgKGQtPnBhZ2UpIHsKLSAgICAgICAgY29uc3QgYm9v
bCBhY2NlcHRlZCA9IGV2LT5pc0FjY2VwdGVkKCk7Ci0gICAgICAgIGQtPnBhZ2UtPmV2ZW50KGV2
KTsKLSAgICAgICAgZXYtPnNldEFjY2VwdGVkKGFjY2VwdGVkKTsKLSAgICB9Ci19Ci0KLS8qISBc
cmVpbXAKLSovCi12b2lkIFFXZWJWaWV3Ojptb3VzZVJlbGVhc2VFdmVudChRTW91c2VFdmVudCog
ZXYpCi17Ci0gICAgaWYgKGQtPnBhZ2UpIHsKLSAgICAgICAgY29uc3QgYm9vbCBhY2NlcHRlZCA9
IGV2LT5pc0FjY2VwdGVkKCk7Ci0gICAgICAgIGQtPnBhZ2UtPmV2ZW50KGV2KTsKLSAgICAgICAg
ZXYtPnNldEFjY2VwdGVkKGFjY2VwdGVkKTsKLSAgICB9Ci19Ci0KLSNpZm5kZWYgUVRfTk9fQ09O
VEVYVE1FTlUKLS8qISBccmVpbXAKLSovCi12b2lkIFFXZWJWaWV3Ojpjb250ZXh0TWVudUV2ZW50
KFFDb250ZXh0TWVudUV2ZW50KiBldikKLXsKLSAgICBpZiAoZC0+cGFnZSkgewotICAgICAgICBj
b25zdCBib29sIGFjY2VwdGVkID0gZXYtPmlzQWNjZXB0ZWQoKTsKLSAgICAgICAgZC0+cGFnZS0+
ZXZlbnQoZXYpOwotICAgICAgICBldi0+c2V0QWNjZXB0ZWQoYWNjZXB0ZWQpOwotICAgIH0KLX0K
LSNlbmRpZiAvLyBRVF9OT19DT05URVhUTUVOVQotCi0jaWZuZGVmIFFUX05PX1dIRUVMRVZFTlQK
LS8qISBccmVpbXAKLSovCi12b2lkIFFXZWJWaWV3Ojp3aGVlbEV2ZW50KFFXaGVlbEV2ZW50KiBl
dikKLXsKLSAgICBpZiAoZC0+cGFnZSkgewotICAgICAgICBjb25zdCBib29sIGFjY2VwdGVkID0g
ZXYtPmlzQWNjZXB0ZWQoKTsKLSAgICAgICAgZC0+cGFnZS0+ZXZlbnQoZXYpOwotICAgICAgICBl
di0+c2V0QWNjZXB0ZWQoYWNjZXB0ZWQpOwotICAgIH0KLX0KLSNlbmRpZiAvLyBRVF9OT19XSEVF
TEVWRU5UCi0KLS8qISBccmVpbXAKLSovCi12b2lkIFFXZWJWaWV3OjprZXlQcmVzc0V2ZW50KFFL
ZXlFdmVudCogZXYpCi17Ci0gICAgaWYgKGQtPnBhZ2UpCi0gICAgICAgIGQtPnBhZ2UtPmV2ZW50
KGV2KTsKLSAgICBpZiAoIWV2LT5pc0FjY2VwdGVkKCkpCi0gICAgICAgIFFXaWRnZXQ6OmtleVBy
ZXNzRXZlbnQoZXYpOwotfQotCi0vKiEgXHJlaW1wCi0qLwotdm9pZCBRV2ViVmlldzo6a2V5UmVs
ZWFzZUV2ZW50KFFLZXlFdmVudCogZXYpCi17Ci0gICAgaWYgKGQtPnBhZ2UpCi0gICAgICAgIGQt
PnBhZ2UtPmV2ZW50KGV2KTsKLSAgICBpZiAoIWV2LT5pc0FjY2VwdGVkKCkpCi0gICAgICAgIFFX
aWRnZXQ6OmtleVJlbGVhc2VFdmVudChldik7Ci19Ci0KLS8qISBccmVpbXAKLSovCi12b2lkIFFX
ZWJWaWV3Ojpmb2N1c0luRXZlbnQoUUZvY3VzRXZlbnQqIGV2KQotewotICAgIGlmIChkLT5wYWdl
KQotICAgICAgICBkLT5wYWdlLT5ldmVudChldik7Ci0gICAgZWxzZQotICAgICAgICBRV2lkZ2V0
Ojpmb2N1c0luRXZlbnQoZXYpOwotfQotCi0vKiEgXHJlaW1wCi0qLwotdm9pZCBRV2ViVmlldzo6
Zm9jdXNPdXRFdmVudChRRm9jdXNFdmVudCogZXYpCi17Ci0gICAgaWYgKGQtPnBhZ2UpCi0gICAg
ICAgIGQtPnBhZ2UtPmV2ZW50KGV2KTsKLSAgICBlbHNlCi0gICAgICAgIFFXaWRnZXQ6OmZvY3Vz
T3V0RXZlbnQoZXYpOwotfQotCi0vKiEgXHJlaW1wCi0qLwotdm9pZCBRV2ViVmlldzo6ZHJhZ0Vu
dGVyRXZlbnQoUURyYWdFbnRlckV2ZW50KiBldikKLXsKLSNpZm5kZWYgUVRfTk9fRFJBR0FORERS
T1AKLSAgICBpZiAoZC0+cGFnZSkKLSAgICAgICAgZC0+cGFnZS0+ZXZlbnQoZXYpOwotI2VuZGlm
Ci19Ci0KLS8qISBccmVpbXAKLSovCi12b2lkIFFXZWJWaWV3OjpkcmFnTGVhdmVFdmVudChRRHJh
Z0xlYXZlRXZlbnQqIGV2KQotewotI2lmbmRlZiBRVF9OT19EUkFHQU5ERFJPUAotICAgIGlmIChk
LT5wYWdlKQotICAgICAgICBkLT5wYWdlLT5ldmVudChldik7Ci0jZW5kaWYKLX0KLQotLyohIFxy
ZWltcAotKi8KLXZvaWQgUVdlYlZpZXc6OmRyYWdNb3ZlRXZlbnQoUURyYWdNb3ZlRXZlbnQqIGV2
KQotewotI2lmbmRlZiBRVF9OT19EUkFHQU5ERFJPUAotICAgIGlmIChkLT5wYWdlKQotICAgICAg
ICBkLT5wYWdlLT5ldmVudChldik7Ci0jZW5kaWYKLX0KLQotLyohIFxyZWltcAotKi8KLXZvaWQg
UVdlYlZpZXc6OmRyb3BFdmVudChRRHJvcEV2ZW50KiBldikKLXsKLSNpZm5kZWYgUVRfTk9fRFJB
R0FORERST1AKLSAgICBpZiAoZC0+cGFnZSkKLSAgICAgICAgZC0+cGFnZS0+ZXZlbnQoZXYpOwot
I2VuZGlmCi19Ci0KLS8qISBccmVpbXAKLSovCi1ib29sIFFXZWJWaWV3Ojpmb2N1c05leHRQcmV2
Q2hpbGQoYm9vbCBuZXh0KQotewotICAgIGlmIChkLT5wYWdlICYmIGQtPnBhZ2UtPmZvY3VzTmV4
dFByZXZDaGlsZChuZXh0KSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIFFXaWRn
ZXQ6OmZvY3VzTmV4dFByZXZDaGlsZChuZXh0KTsKLX0KLQotLyohXHJlaW1wCi0qLwotUVZhcmlh
bnQgUVdlYlZpZXc6OmlucHV0TWV0aG9kUXVlcnkoUXQ6OklucHV0TWV0aG9kUXVlcnkgcHJvcGVy
dHkpIGNvbnN0Ci17Ci0gICAgaWYgKGQtPnBhZ2UpCi0gICAgICAgIHJldHVybiBkLT5wYWdlLT5p
bnB1dE1ldGhvZFF1ZXJ5KHByb3BlcnR5KTsKLSAgICByZXR1cm4gUVZhcmlhbnQoKTsKLX0KLQot
LyohXHJlaW1wCi0qLwotdm9pZCBRV2ViVmlldzo6aW5wdXRNZXRob2RFdmVudChRSW5wdXRNZXRo
b2RFdmVudCAqZSkKLXsKLSAgICBpZiAoZC0+cGFnZSkKLSAgICAgICBkLT5wYWdlLT5ldmVudChl
KTsKLX0KLQotLyohXHJlaW1wCi0qLwotdm9pZCBRV2ViVmlldzo6Y2hhbmdlRXZlbnQoUUV2ZW50
ICplKQotewotICAgIGlmIChkLT5wYWdlICYmIGUtPnR5cGUoKSA9PSBRRXZlbnQ6OlBhbGV0dGVD
aGFuZ2UpCi0gICAgICAgIGQtPnBhZ2UtPnNldFBhbGV0dGUocGFsZXR0ZSgpKTsKLSAgICBRV2lk
Z2V0OjpjaGFuZ2VFdmVudChlKTsKLX0KLQotLyohCi0gICAgXGZuIHZvaWQgUVdlYlZpZXc6OnRp
dGxlQ2hhbmdlZChjb25zdCBRU3RyaW5nICZ0aXRsZSkKLQotICAgIFRoaXMgc2lnbmFsIGlzIGVt
aXR0ZWQgd2hlbmV2ZXIgdGhlIFxhIHRpdGxlIG9mIHRoZSBtYWluIGZyYW1lIGNoYW5nZXMuCi0K
LSAgICBcc2EgdGl0bGUoKQotKi8KLQotLyohCi0gICAgXGZuIHZvaWQgUVdlYlZpZXc6OnVybENo
YW5nZWQoY29uc3QgUVVybCAmdXJsKQotCi0gICAgVGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVu
IHRoZSBcYSB1cmwgb2YgdGhlIHZpZXcgY2hhbmdlcy4KLQotICAgIFxzYSB1cmwoKSwgbG9hZCgp
Ci0qLwotCi0vKiEKLSAgICBcZm4gdm9pZCBRV2ViVmlldzo6c3RhdHVzQmFyTWVzc2FnZShjb25z
dCBRU3RyaW5nJiB0ZXh0KQotCi0gICAgVGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuIHRoZSBz
dGF0dXMgYmFyIFxhIHRleHQgaXMgY2hhbmdlZCBieSB0aGUgcGFnZS4KLSovCi0KLS8qIQotICAg
IFxmbiB2b2lkIFFXZWJWaWV3OjppY29uQ2hhbmdlZCgpCi0KLSAgICBUaGlzIHNpZ25hbCBpcyBl
bWl0dGVkIHdoZW5ldmVyIHRoZSBpY29uIG9mIHRoZSBwYWdlIGlzIGxvYWRlZCBvciBjaGFuZ2Vz
LgotCi0gICAgSW4gb3JkZXIgZm9yIGljb25zIHRvIGJlIGxvYWRlZCwgeW91IHdpbGwgbmVlZCB0
byBzZXQgYW4gaWNvbiBkYXRhYmFzZSBwYXRoCi0gICAgdXNpbmcgUVdlYlNldHRpbmdzOjpzZXRJ
Y29uRGF0YWJhc2VQYXRoKCkuCi0KLSAgICBcc2EgaWNvbigpLCBRV2ViU2V0dGluZ3M6OnNldElj
b25EYXRhYmFzZVBhdGgoKQotKi8KLQotLyohCi0gICAgXGZuIHZvaWQgUVdlYlZpZXc6OmxvYWRT
dGFydGVkKCkKLQotICAgIFRoaXMgc2lnbmFsIGlzIGVtaXR0ZWQgd2hlbiBhIG5ldyBsb2FkIG9m
IHRoZSBwYWdlIGlzIHN0YXJ0ZWQuCi0KLSAgICBcc2EgbG9hZFByb2dyZXNzKCksIGxvYWRGaW5p
c2hlZCgpCi0qLwotCi0vKiEKLSAgICBcZm4gdm9pZCBRV2ViVmlldzo6bG9hZEZpbmlzaGVkKGJv
b2wgb2spCi0KLSAgICBUaGlzIHNpZ25hbCBpcyBlbWl0dGVkIHdoZW4gYSBsb2FkIG9mIHRoZSBw
YWdlIGlzIGZpbmlzaGVkLgotICAgIFxhIG9rIHdpbGwgaW5kaWNhdGUgd2hldGhlciB0aGUgbG9h
ZCB3YXMgc3VjY2Vzc2Z1bCBvciBhbnkgZXJyb3Igb2NjdXJyZWQuCi0KLSAgICBcc2EgbG9hZFN0
YXJ0ZWQoKQotKi8KLQotLyohCi0gICAgXGZuIHZvaWQgUVdlYlZpZXc6OnNlbGVjdGlvbkNoYW5n
ZWQoKQotCi0gICAgVGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuZXZlciB0aGUgc2VsZWN0aW9u
IGNoYW5nZXMuCi0KLSAgICBcc2Egc2VsZWN0ZWRUZXh0KCkKLSovCi0KLS8qIQotICAgIFxmbiB2
b2lkIFFXZWJWaWV3Ojpsb2FkUHJvZ3Jlc3MoaW50IHByb2dyZXNzKQotCi0gICAgVGhpcyBzaWdu
YWwgaXMgZW1pdHRlZCBldmVyeSB0aW1lIGFuIGVsZW1lbnQgaW4gdGhlIHdlYiBwYWdlCi0gICAg
Y29tcGxldGVzIGxvYWRpbmcgYW5kIHRoZSBvdmVyYWxsIGxvYWRpbmcgcHJvZ3Jlc3MgYWR2YW5j
ZXMuCi0KLSAgICBUaGlzIHNpZ25hbCB0cmFja3MgdGhlIHByb2dyZXNzIG9mIGFsbCBjaGlsZCBm
cmFtZXMuCi0KLSAgICBUaGUgY3VycmVudCB2YWx1ZSBpcyBwcm92aWRlZCBieSBcYSBwcm9ncmVz
cyBhbmQgc2NhbGVzIGZyb20gMCB0byAxMDAsCi0gICAgd2hpY2ggaXMgdGhlIGRlZmF1bHQgcmFu
Z2Ugb2YgUVByb2dyZXNzQmFyLgotCi0gICAgXHNhIGxvYWRTdGFydGVkKCksIGxvYWRGaW5pc2hl
ZCgpCi0qLwotCi0vKiEKLSAgICBcZm4gdm9pZCBRV2ViVmlldzo6bGlua0NsaWNrZWQoY29uc3Qg
UVVybCAmdXJsKQotCi0gICAgVGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuZXZlciB0aGUgdXNl
ciBjbGlja3Mgb24gYSBsaW5rIGFuZCB0aGUgcGFnZSdzIGxpbmtEZWxlZ2F0aW9uUG9saWN5Ci0g
ICAgcHJvcGVydHkgaXMgc2V0IHRvIGRlbGVnYXRlIHRoZSBsaW5rIGhhbmRsaW5nIGZvciB0aGUg
c3BlY2lmaWVkIFxhIHVybC4KLQotICAgIFxzYSBRV2ViUGFnZTo6bGlua0RlbGVnYXRpb25Qb2xp
Y3koKQotKi8KLQotI2luY2x1ZGUgIm1vY19xd2Vidmlldy5jcHAiCi0KZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJLaXQvcXQvQXBpL3F3ZWJ2aWV3LmggYi9Tb3VyY2UvV2ViS2l0L3F0L0FwaS9xd2Vi
dmlldy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGI0ZGQ5MTc1ZjBkMTgxY2Yy
YmQ4YjVjZGExODE5OGE1MTI3ZjEzLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvcXQvQXBpL3F3ZWJ2aWV3LmgKKysrIC9kZXYvbnVs
bApAQCAtMSwxNjUgKzAsMCBAQAotLyoKLSAgICBDb3B5cmlnaHQgKEMpIDIwMDggTm9raWEgQ29y
cG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCi0gICAgQ29weXJpZ2h0IChDKSAy
MDA3IFN0YWlrb3MgQ29tcHV0aW5nIFNlcnZpY2VzIEluYy4KLQotICAgIFRoaXMgbGlicmFyeSBp
cyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAgICBtb2Rp
ZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwot
ICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247
IGVpdGhlcgotICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9u
KSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBp
biB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBX
QVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hB
TlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBH
TlUKLSAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4K
LQotICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2Vl
IHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwotICAgIHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3Is
Ci0gICAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCi0qLwotCi0jaWZuZGVmIFFXRUJWSUVX
X0gKLSNkZWZpbmUgUVdFQlZJRVdfSAotCi0jaW5jbHVkZSAicXdlYmtpdGdsb2JhbC5oIgotI2lu
Y2x1ZGUgInF3ZWJwYWdlLmgiCi0jaW5jbHVkZSA8UXRXaWRnZXRzL3F3aWRnZXQuaD4KLSNpbmNs
dWRlIDxRdEd1aS9xaWNvbi5oPgotI2luY2x1ZGUgPFF0R3VpL3FwYWludGVyLmg+Ci0jaW5jbHVk
ZSA8UXRDb3JlL3F1cmwuaD4KLSNpbmNsdWRlIDxRdE5ldHdvcmsvcW5ldHdvcmthY2Nlc3NtYW5h
Z2VyLmg+Ci0KLVFUX0JFR0lOX05BTUVTUEFDRQotY2xhc3MgUU5ldHdvcmtSZXF1ZXN0OwotY2xh
c3MgUVByaW50ZXI7Ci1RVF9FTkRfTkFNRVNQQUNFCi0KLWNsYXNzIFFXZWJQYWdlOwotY2xhc3Mg
UVdlYlZpZXdQcml2YXRlOwotY2xhc3MgUVdlYk5ldHdvcmtSZXF1ZXN0OwotCi1jbGFzcyBRV0VC
S0lUX0VYUE9SVCBRV2ViVmlldyA6IHB1YmxpYyBRV2lkZ2V0IHsKLSAgICBRX09CSkVDVAotICAg
IFFfUFJPUEVSVFkoUVN0cmluZyB0aXRsZSBSRUFEIHRpdGxlKQotICAgIFFfUFJPUEVSVFkoUVVy
bCB1cmwgUkVBRCB1cmwgV1JJVEUgc2V0VXJsKQotICAgIFFfUFJPUEVSVFkoUUljb24gaWNvbiBS
RUFEIGljb24pCi0gICAgUV9QUk9QRVJUWShRU3RyaW5nIHNlbGVjdGVkVGV4dCBSRUFEIHNlbGVj
dGVkVGV4dCkKLSAgICBRX1BST1BFUlRZKFFTdHJpbmcgc2VsZWN0ZWRIdG1sIFJFQUQgc2VsZWN0
ZWRIdG1sKQotICAgIFFfUFJPUEVSVFkoYm9vbCBoYXNTZWxlY3Rpb24gUkVBRCBoYXNTZWxlY3Rp
b24pCi0gICAgUV9QUk9QRVJUWShib29sIG1vZGlmaWVkIFJFQUQgaXNNb2RpZmllZCkKLSAgICAv
L1FfUFJPUEVSVFkoUXQ6OlRleHRJbnRlcmFjdGlvbkZsYWdzIHRleHRJbnRlcmFjdGlvbkZsYWdz
IFJFQUQgdGV4dEludGVyYWN0aW9uRmxhZ3MgV1JJVEUgc2V0VGV4dEludGVyYWN0aW9uRmxhZ3Mp
Ci0gICAgUV9QUk9QRVJUWShxcmVhbCB0ZXh0U2l6ZU11bHRpcGxpZXIgUkVBRCB0ZXh0U2l6ZU11
bHRpcGxpZXIgV1JJVEUgc2V0VGV4dFNpemVNdWx0aXBsaWVyIERFU0lHTkFCTEUgZmFsc2UpCi0g
ICAgUV9QUk9QRVJUWShxcmVhbCB6b29tRmFjdG9yIFJFQUQgem9vbUZhY3RvciBXUklURSBzZXRa
b29tRmFjdG9yKQotCi0gICAgUV9QUk9QRVJUWShRUGFpbnRlcjo6UmVuZGVySGludHMgcmVuZGVy
SGludHMgUkVBRCByZW5kZXJIaW50cyBXUklURSBzZXRSZW5kZXJIaW50cykKLSAgICBRX0ZMQUdT
KFFQYWludGVyOjpSZW5kZXJIaW50cykKLXB1YmxpYzoKLSAgICBleHBsaWNpdCBRV2ViVmlldyhR
V2lkZ2V0KiBwYXJlbnQgPSAwKTsKLSAgICB2aXJ0dWFsIH5RV2ViVmlldygpOwotCi0gICAgUVdl
YlBhZ2UqIHBhZ2UoKSBjb25zdDsKLSAgICB2b2lkIHNldFBhZ2UoUVdlYlBhZ2UqIHBhZ2UpOwot
Ci0gICAgdm9pZCBsb2FkKGNvbnN0IFFVcmwmIHVybCk7Ci0gICAgdm9pZCBsb2FkKGNvbnN0IFFO
ZXR3b3JrUmVxdWVzdCYgcmVxdWVzdCwgUU5ldHdvcmtBY2Nlc3NNYW5hZ2VyOjpPcGVyYXRpb24g
b3BlcmF0aW9uID0gUU5ldHdvcmtBY2Nlc3NNYW5hZ2VyOjpHZXRPcGVyYXRpb24sIGNvbnN0IFFC
eXRlQXJyYXkgJmJvZHkgPSBRQnl0ZUFycmF5KCkpOwotICAgIHZvaWQgc2V0SHRtbChjb25zdCBR
U3RyaW5nJiBodG1sLCBjb25zdCBRVXJsJiBiYXNlVXJsID0gUVVybCgpKTsKLSAgICB2b2lkIHNl
dENvbnRlbnQoY29uc3QgUUJ5dGVBcnJheSYgZGF0YSwgY29uc3QgUVN0cmluZyYgbWltZVR5cGUg
PSBRU3RyaW5nKCksIGNvbnN0IFFVcmwmIGJhc2VVcmwgPSBRVXJsKCkpOwotCi0gICAgUVdlYkhp
c3RvcnkqIGhpc3RvcnkoKSBjb25zdDsKLSAgICBRV2ViU2V0dGluZ3MqIHNldHRpbmdzKCkgY29u
c3Q7Ci0KLSAgICBRU3RyaW5nIHRpdGxlKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRVcmwoY29uc3Qg
UVVybCAmdXJsKTsKLSAgICBRVXJsIHVybCgpIGNvbnN0OwotICAgIFFJY29uIGljb24oKSBjb25z
dDsKLQotICAgIGJvb2wgaGFzU2VsZWN0aW9uKCkgY29uc3Q7Ci0gICAgUVN0cmluZyBzZWxlY3Rl
ZFRleHQoKSBjb25zdDsKLSAgICBRU3RyaW5nIHNlbGVjdGVkSHRtbCgpIGNvbnN0OwotCi0jaWZu
ZGVmIFFUX05PX0FDVElPTgotICAgIFFBY3Rpb24qIHBhZ2VBY3Rpb24oUVdlYlBhZ2U6OldlYkFj
dGlvbiBhY3Rpb24pIGNvbnN0OwotI2VuZGlmCi0gICAgdm9pZCB0cmlnZ2VyUGFnZUFjdGlvbihR
V2ViUGFnZTo6V2ViQWN0aW9uIGFjdGlvbiwgYm9vbCBjaGVja2VkID0gZmFsc2UpOwotCi0gICAg
Ym9vbCBpc01vZGlmaWVkKCkgY29uc3Q7Ci0KLSAgICAvKgotICAgIFF0OjpUZXh0SW50ZXJhY3Rp
b25GbGFncyB0ZXh0SW50ZXJhY3Rpb25GbGFncygpIGNvbnN0OwotICAgIHZvaWQgc2V0VGV4dElu
dGVyYWN0aW9uRmxhZ3MoUXQ6OlRleHRJbnRlcmFjdGlvbkZsYWdzIGZsYWdzKTsKLSAgICB2b2lk
IHNldFRleHRJbnRlcmFjdGlvbkZsYWcoUXQ6OlRleHRJbnRlcmFjdGlvbkZsYWcgZmxhZyk7Ci0g
ICAgKi8KLQotICAgIFFWYXJpYW50IGlucHV0TWV0aG9kUXVlcnkoUXQ6OklucHV0TWV0aG9kUXVl
cnkgcHJvcGVydHkpIGNvbnN0OwotCi0gICAgUVNpemUgc2l6ZUhpbnQoKSBjb25zdDsKLQotICAg
IHFyZWFsIHpvb21GYWN0b3IoKSBjb25zdDsKLSAgICB2b2lkIHNldFpvb21GYWN0b3IocXJlYWwg
ZmFjdG9yKTsKLQotICAgIHZvaWQgc2V0VGV4dFNpemVNdWx0aXBsaWVyKHFyZWFsIGZhY3Rvcik7
Ci0gICAgcXJlYWwgdGV4dFNpemVNdWx0aXBsaWVyKCkgY29uc3Q7Ci0KLSAgICBRUGFpbnRlcjo6
UmVuZGVySGludHMgcmVuZGVySGludHMoKSBjb25zdDsKLSAgICB2b2lkIHNldFJlbmRlckhpbnRz
KFFQYWludGVyOjpSZW5kZXJIaW50cyBoaW50cyk7Ci0gICAgdm9pZCBzZXRSZW5kZXJIaW50KFFQ
YWludGVyOjpSZW5kZXJIaW50IGhpbnQsIGJvb2wgZW5hYmxlZCA9IHRydWUpOwotCi0gICAgYm9v
bCBmaW5kVGV4dChjb25zdCBRU3RyaW5nJiBzdWJTdHJpbmcsIFFXZWJQYWdlOjpGaW5kRmxhZ3Mg
b3B0aW9ucyA9IDApOwotCi0gICAgdmlydHVhbCBib29sIGV2ZW50KFFFdmVudCopOwotCi1wdWJs
aWMgUV9TTE9UUzoKLSAgICB2b2lkIHN0b3AoKTsKLSAgICB2b2lkIGJhY2soKTsKLSAgICB2b2lk
IGZvcndhcmQoKTsKLSAgICB2b2lkIHJlbG9hZCgpOwotCi0gICAgdm9pZCBwcmludChRUHJpbnRl
ciopIGNvbnN0OwotCi1RX1NJR05BTFM6Ci0gICAgdm9pZCBsb2FkU3RhcnRlZCgpOwotICAgIHZv
aWQgbG9hZFByb2dyZXNzKGludCBwcm9ncmVzcyk7Ci0gICAgdm9pZCBsb2FkRmluaXNoZWQoYm9v
bCk7Ci0gICAgdm9pZCB0aXRsZUNoYW5nZWQoY29uc3QgUVN0cmluZyYgdGl0bGUpOwotICAgIHZv
aWQgc3RhdHVzQmFyTWVzc2FnZShjb25zdCBRU3RyaW5nJiB0ZXh0KTsKLSAgICB2b2lkIGxpbmtD
bGlja2VkKGNvbnN0IFFVcmwmKTsKLSAgICB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoKTsKLSAgICB2
b2lkIGljb25DaGFuZ2VkKCk7Ci0gICAgdm9pZCB1cmxDaGFuZ2VkKGNvbnN0IFFVcmwmKTsKLQot
cHJvdGVjdGVkOgotICAgIHZvaWQgcmVzaXplRXZlbnQoUVJlc2l6ZUV2ZW50Kik7Ci0gICAgdm9p
ZCBwYWludEV2ZW50KFFQYWludEV2ZW50Kik7Ci0KLSAgICB2aXJ0dWFsIFFXZWJWaWV3ICpjcmVh
dGVXaW5kb3coUVdlYlBhZ2U6OldlYldpbmRvd1R5cGUgdHlwZSk7Ci0KLSAgICB2aXJ0dWFsIHZv
aWQgY2hhbmdlRXZlbnQoUUV2ZW50Kik7Ci0gICAgdmlydHVhbCB2b2lkIG1vdXNlTW92ZUV2ZW50
KFFNb3VzZUV2ZW50Kik7Ci0gICAgdmlydHVhbCB2b2lkIG1vdXNlUHJlc3NFdmVudChRTW91c2VF
dmVudCopOwotICAgIHZpcnR1YWwgdm9pZCBtb3VzZURvdWJsZUNsaWNrRXZlbnQoUU1vdXNlRXZl
bnQqKTsKLSAgICB2aXJ0dWFsIHZvaWQgbW91c2VSZWxlYXNlRXZlbnQoUU1vdXNlRXZlbnQqKTsK
LSNpZm5kZWYgUVRfTk9fQ09OVEVYVE1FTlUKLSAgICB2aXJ0dWFsIHZvaWQgY29udGV4dE1lbnVF
dmVudChRQ29udGV4dE1lbnVFdmVudCopOwotI2VuZGlmCi0jaWZuZGVmIFFUX05PX1dIRUVMRVZF
TlQKLSAgICB2aXJ0dWFsIHZvaWQgd2hlZWxFdmVudChRV2hlZWxFdmVudCopOwotI2VuZGlmCi0g
ICAgdmlydHVhbCB2b2lkIGtleVByZXNzRXZlbnQoUUtleUV2ZW50Kik7Ci0gICAgdmlydHVhbCB2
b2lkIGtleVJlbGVhc2VFdmVudChRS2V5RXZlbnQqKTsKLSAgICB2aXJ0dWFsIHZvaWQgZHJhZ0Vu
dGVyRXZlbnQoUURyYWdFbnRlckV2ZW50Kik7Ci0gICAgdmlydHVhbCB2b2lkIGRyYWdMZWF2ZUV2
ZW50KFFEcmFnTGVhdmVFdmVudCopOwotICAgIHZpcnR1YWwgdm9pZCBkcmFnTW92ZUV2ZW50KFFE
cmFnTW92ZUV2ZW50Kik7Ci0gICAgdmlydHVhbCB2b2lkIGRyb3BFdmVudChRRHJvcEV2ZW50Kik7
Ci0gICAgdmlydHVhbCB2b2lkIGZvY3VzSW5FdmVudChRRm9jdXNFdmVudCopOwotICAgIHZpcnR1
YWwgdm9pZCBmb2N1c091dEV2ZW50KFFGb2N1c0V2ZW50Kik7Ci0gICAgdmlydHVhbCB2b2lkIGlu
cHV0TWV0aG9kRXZlbnQoUUlucHV0TWV0aG9kRXZlbnQqKTsKLQotICAgIHZpcnR1YWwgYm9vbCBm
b2N1c05leHRQcmV2Q2hpbGQoYm9vbCBuZXh0KTsKLQotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xh
c3MgUVdlYlBhZ2U7Ci0gICAgUVdlYlZpZXdQcml2YXRlKiBkOwotICAgIFFfUFJJVkFURV9TTE9U
KGQsIHZvaWQgX3FfcGFnZURlc3Ryb3llZCgpKQotfTsKLQotI2VuZGlmIC8vIFFXRUJWSUVXX0gK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvcXQvQXBpL3F3ZWJ2aWV3YWNjZXNzaWJsZS5jcHAg
Yi9Tb3VyY2UvV2ViS2l0L3F0L0FwaS9xd2Vidmlld2FjY2Vzc2libGUuY3BwCmRlbGV0ZWQgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCA3Y2FlMTlhMWE0MjIxNGJkYTQyOTFlODdhYjExNDZiN2I1Mzdk
YTIwLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJj
ZS9XZWJLaXQvcXQvQXBpL3F3ZWJ2aWV3YWNjZXNzaWJsZS5jcHAKKysrIC9kZXYvbnVsbApAQCAt
MSwxNTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBOb2tpYSBDb3Jwb3JhdGlv
biBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykKLQotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUg
c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVu
ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vu
c2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgot
ICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRl
ciB2ZXJzaW9uLgotCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUg
dGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0
aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3Ig
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGlicmFy
eSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAqIFlvdSBzaG91
bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlO
Ry5MSUIuICBJZiBub3QsIHdyaXRlIHRvCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
LCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAotICogQm9zdG9uLCBNQSAw
MjExMC0xMzAxLCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgInF3
ZWJ2aWV3YWNjZXNzaWJsZV9wLmgiCi0KLSNpbmNsdWRlICJxd2ViZnJhbWUuaCIKLSNpbmNsdWRl
ICJxd2ViZnJhbWVfcC5oIgotI2luY2x1ZGUgInF3ZWJwYWdlLmgiCi0jaW5jbHVkZSAicXdlYnZp
ZXcuaCIKLQotUVdlYkZyYW1lQWNjZXNzaWJsZTo6UVdlYkZyYW1lQWNjZXNzaWJsZShRV2ViRnJh
bWUqIGZyYW1lKQotICAgIDogUUFjY2Vzc2libGVPYmplY3QoZnJhbWUpCi17Ci19Ci0KLVFXZWJG
cmFtZSogUVdlYkZyYW1lQWNjZXNzaWJsZTo6ZnJhbWUoKSBjb25zdAotewotICAgIHJldHVybiBx
b2JqZWN0X2Nhc3Q8UVdlYkZyYW1lKj4ob2JqZWN0KCkpOwotfQotCi1RQWNjZXNzaWJsZUludGVy
ZmFjZSogUVdlYkZyYW1lQWNjZXNzaWJsZTo6cGFyZW50KCkgY29uc3QKLXsKLSAgICByZXR1cm4g
UUFjY2Vzc2libGU6OnF1ZXJ5QWNjZXNzaWJsZUludGVyZmFjZShvYmplY3QoKS0+cGFyZW50KCkp
OwotfQotCi1RU3RyaW5nIFFXZWJGcmFtZUFjY2Vzc2libGU6OnRleHQoUUFjY2Vzc2libGU6OlRl
eHQpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIFFTdHJpbmcoKTsKLX0KLQotaW50IFFXZWJGcmFtZUFj
Y2Vzc2libGU6OmNoaWxkQ291bnQoKSBjb25zdAotewotICAgIHJldHVybiAwOwotfQotCi1RQWNj
ZXNzaWJsZUludGVyZmFjZSogUVdlYkZyYW1lQWNjZXNzaWJsZTo6Y2hpbGQoaW50IGluZGV4KSBj
b25zdAotewotICAgIHJldHVybiAwOwotfQotCi1pbnQgUVdlYkZyYW1lQWNjZXNzaWJsZTo6aW5k
ZXhPZkNoaWxkKGNvbnN0IFFBY2Nlc3NpYmxlSW50ZXJmYWNlKikgY29uc3QKLXsKLSAgICByZXR1
cm4gMDsKLX0KLQotUUFjY2Vzc2libGU6OlN0YXRlIFFXZWJGcmFtZUFjY2Vzc2libGU6OnN0YXRl
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gUUFjY2Vzc2libGU6OlN0YXRlKCk7Ci19Ci0KLVFBY2Nl
c3NpYmxlOjpSb2xlIFFXZWJGcmFtZUFjY2Vzc2libGU6OnJvbGUoKSBjb25zdAotewotICAgIHJl
dHVybiBRQWNjZXNzaWJsZTo6Q2xpZW50OwotfQotCi1pbnQgUVdlYkZyYW1lQWNjZXNzaWJsZTo6
bmF2aWdhdGUoUUFjY2Vzc2libGU6OlJlbGF0aW9uRmxhZywgaW50LCBRQWNjZXNzaWJsZUludGVy
ZmFjZSoqIHRhcmdldCkgY29uc3QKLXsKLSAgICAqdGFyZ2V0ID0gMDsKLSAgICByZXR1cm4gLTE7
Ci19Ci0KLVFXZWJQYWdlQWNjZXNzaWJsZTo6UVdlYlBhZ2VBY2Nlc3NpYmxlKFFXZWJQYWdlKiBw
YWdlKQotICAgIDogUUFjY2Vzc2libGVPYmplY3QocGFnZSkKLXsKLX0KLQotUVdlYlBhZ2UqIFFX
ZWJQYWdlQWNjZXNzaWJsZTo6cGFnZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHFvYmplY3RfY2Fz
dDxRV2ViUGFnZSo+KG9iamVjdCgpKTsKLX0KLQotUVN0cmluZyBRV2ViUGFnZUFjY2Vzc2libGU6
OnRleHQoUUFjY2Vzc2libGU6OlRleHQgdCkgY29uc3QKLXsKLSAgICByZXR1cm4gUVN0cmluZygp
OwotfQotCi1RQWNjZXNzaWJsZUludGVyZmFjZSogUVdlYlBhZ2VBY2Nlc3NpYmxlOjpwYXJlbnQo
KSBjb25zdAotewotICAgIHJldHVybiBRQWNjZXNzaWJsZTo6cXVlcnlBY2Nlc3NpYmxlSW50ZXJm
YWNlKG9iamVjdCgpLT5wYXJlbnQoKSk7Ci19Ci0KLVFBY2Nlc3NpYmxlSW50ZXJmYWNlKiBRV2Vi
UGFnZUFjY2Vzc2libGU6OmNoaWxkKGludCBpbmRleCkgY29uc3QKLXsKLSAgICBpZiAoIWluZGV4
ICYmIHBhZ2UoKS0+bWFpbkZyYW1lKCkpCi0gICAgICAgIHJldHVybiBuZXcgUVdlYkZyYW1lQWNj
ZXNzaWJsZShwYWdlKCktPm1haW5GcmFtZSgpKTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IFFX
ZWJQYWdlQWNjZXNzaWJsZTo6Y2hpbGRDb3VudCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHBhZ2Uo
KS0+bWFpbkZyYW1lKCkgPyAxIDogMDsKLX0KLQotaW50IFFXZWJQYWdlQWNjZXNzaWJsZTo6aW5k
ZXhPZkNoaWxkKGNvbnN0IFFBY2Nlc3NpYmxlSW50ZXJmYWNlKikgY29uc3QKLXsKLSAgICByZXR1
cm4gMDsKLX0KLQotaW50IFFXZWJQYWdlQWNjZXNzaWJsZTo6bmF2aWdhdGUoUUFjY2Vzc2libGU6
OlJlbGF0aW9uRmxhZywgaW50LCBRQWNjZXNzaWJsZUludGVyZmFjZSoqIHRhcmdldCkgY29uc3QK
LXsKLSAgICAqdGFyZ2V0ID0gMDsKLSAgICByZXR1cm4gLTE7Ci19Ci0KLVFBY2Nlc3NpYmxlOjpS
b2xlIFFXZWJQYWdlQWNjZXNzaWJsZTo6cm9sZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIFFBY2Nl
c3NpYmxlOjpDbGllbnQ7Ci19Ci0KLVFBY2Nlc3NpYmxlOjpTdGF0ZSBRV2ViUGFnZUFjY2Vzc2li
bGU6OnN0YXRlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gUUFjY2Vzc2libGU6OlN0YXRlKCk7Ci19
Ci0KLVFXZWJWaWV3QWNjZXNzaWJsZTo6UVdlYlZpZXdBY2Nlc3NpYmxlKFFXZWJWaWV3KiB2aWV3
KQotICAgIDogUUFjY2Vzc2libGVXaWRnZXQodmlldywgUUFjY2Vzc2libGU6OkRvY3VtZW50KQot
ewotfQotCi1RV2ViVmlldyogUVdlYlZpZXdBY2Nlc3NpYmxlOjp2aWV3KCkgY29uc3QKLXsKLSAg
ICByZXR1cm4gcW9iamVjdF9jYXN0PFFXZWJWaWV3Kj4ob2JqZWN0KCkpOwotfQotCi1pbnQgUVdl
YlZpZXdBY2Nlc3NpYmxlOjpjaGlsZENvdW50KCkgY29uc3QKLXsKLSAgICByZXR1cm4gdmlldygp
LT5wYWdlKCkgPyAxIDogMDsKLX0KLQotUUFjY2Vzc2libGVJbnRlcmZhY2UqIFFXZWJWaWV3QWNj
ZXNzaWJsZTo6Y2hpbGQoaW50IGluZGV4KSBjb25zdAotewotICAgIGlmICghaW5kZXggJiYgdmll
dygpLT5wYWdlKCkpCi0gICAgICAgIHJldHVybiBuZXcgUVdlYlBhZ2VBY2Nlc3NpYmxlKHZpZXco
KS0+cGFnZSgpKTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQv
cXQvQXBpL3F3ZWJ2aWV3YWNjZXNzaWJsZV9wLmggYi9Tb3VyY2UvV2ViS2l0L3F0L0FwaS9xd2Vi
dmlld2FjY2Vzc2libGVfcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2JmNDQ4
NzA3M2Y2NmJlZGY4MWI1NTRhNGFlZWQxOWZiNGRiMzYzLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvcXQvQXBpL3F3ZWJ2aWV3YWNj
ZXNzaWJsZV9wLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogQ29weXJp
Z2h0IChDKSAyMDEyIE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVz
KQotCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1
dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGli
cmFyeSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUg
U29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2Us
IG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0KLSAqIFRoaXMgbGlicmFy
eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICog
YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu
dHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9y
IG1vcmUgZGV0YWlscy4KLQotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0
aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlz
IGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KLSAq
IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwg
RmlmdGggRmxvb3IsCi0gKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KLSAqLwotCi0jaWZu
ZGVmIHF3ZWJ2aWV3YWNjZXNzaWJsZV9wX2gKLSNkZWZpbmUgcXdlYnZpZXdhY2Nlc3NpYmxlX3Bf
aAotCi0jaW5jbHVkZSA8cWFjY2Vzc2libGUuaD4KLSNpbmNsdWRlIDxxYWNjZXNzaWJsZW9iamVj
dC5oPgotI2luY2x1ZGUgPHFhY2Nlc3NpYmxld2lkZ2V0Lmg+Ci0KLWNsYXNzIFFXZWJGcmFtZTsK
LWNsYXNzIFFXZWJQYWdlOwotY2xhc3MgUVdlYlZpZXc7Ci0KLS8qCi0gKiBDbGFzc2VzIHJlcHJl
c2VudGluZyBhY2Nlc3NpYmxlIG9iamVjdHMgZm9yIFZpZXcsIEZyYW1lIGFuZCBQYWdlLgotICoK
LSAqIEVhY2ggb2YgdGhlc2UganVzdCByZXR1cm5zIG9uZSBjaGlsZCB3aGljaCBsZXRzIHRoZSBh
Y2Nlc3NpYmlsaXR5Ci0gKiBmcmFtd29yayBuYXZpZ2F0ZSB0b3dhcmRzIHRoZSBhY3R1YWwgY29u
dGVudHMgaW4gdGhlIGZyYW1lLgotICovCi0KLWNsYXNzIFFXZWJGcmFtZUFjY2Vzc2libGUgOiBw
dWJsaWMgUUFjY2Vzc2libGVPYmplY3QgewotcHVibGljOgotICAgIFFXZWJGcmFtZUFjY2Vzc2li
bGUoUVdlYkZyYW1lKik7Ci0KLSAgICBRV2ViRnJhbWUqIGZyYW1lKCkgY29uc3Q7Ci0KLSAgICBR
QWNjZXNzaWJsZUludGVyZmFjZSogcGFyZW50KCkgY29uc3Q7Ci0gICAgaW50IGNoaWxkQ291bnQo
KSBjb25zdDsKLSAgICBRQWNjZXNzaWJsZUludGVyZmFjZSogY2hpbGQoaW50IGluZGV4KSBjb25z
dDsKLSAgICBpbnQgaW5kZXhPZkNoaWxkKGNvbnN0IFFBY2Nlc3NpYmxlSW50ZXJmYWNlKikgY29u
c3Q7Ci0gICAgaW50IG5hdmlnYXRlKFFBY2Nlc3NpYmxlOjpSZWxhdGlvbkZsYWcsIGludCwgUUFj
Y2Vzc2libGVJbnRlcmZhY2UqKiB0YXJnZXQpIGNvbnN0OwotCi0gICAgUVN0cmluZyB0ZXh0KFFB
Y2Nlc3NpYmxlOjpUZXh0KSBjb25zdDsKLSAgICBRQWNjZXNzaWJsZTo6Um9sZSByb2xlKCkgY29u
c3Q7Ci0gICAgUUFjY2Vzc2libGU6OlN0YXRlIHN0YXRlKCkgY29uc3Q7Ci19OwotCi1jbGFzcyBR
V2ViUGFnZUFjY2Vzc2libGUgOiBwdWJsaWMgUUFjY2Vzc2libGVPYmplY3QgewotcHVibGljOgot
ICAgIFFXZWJQYWdlQWNjZXNzaWJsZShRV2ViUGFnZSopOwotCi0gICAgUVdlYlBhZ2UqIHBhZ2Uo
KSBjb25zdDsKLQotICAgIFFBY2Nlc3NpYmxlSW50ZXJmYWNlKiBwYXJlbnQoKSBjb25zdDsKLSAg
ICBpbnQgY2hpbGRDb3VudCgpIGNvbnN0OwotICAgIFFBY2Nlc3NpYmxlSW50ZXJmYWNlKiBjaGls
ZChpbnQgaW5kZXgpIGNvbnN0OwotICAgIGludCBpbmRleE9mQ2hpbGQoY29uc3QgUUFjY2Vzc2li
bGVJbnRlcmZhY2UqKSBjb25zdDsKLSAgICBpbnQgbmF2aWdhdGUoUUFjY2Vzc2libGU6OlJlbGF0
aW9uRmxhZywgaW50LCBRQWNjZXNzaWJsZUludGVyZmFjZSoqIHRhcmdldCkgY29uc3Q7Ci0KLSAg
ICBRU3RyaW5nIHRleHQoUUFjY2Vzc2libGU6OlRleHQpIGNvbnN0OwotICAgIFFBY2Nlc3NpYmxl
OjpSb2xlIHJvbGUoKSBjb25zdDsKLSAgICBRQWNjZXNzaWJsZTo6U3RhdGUgc3RhdGUoKSBjb25z
dDsKLX07Ci0KLWNsYXNzIFFXZWJWaWV3QWNjZXNzaWJsZSA6IHB1YmxpYyBRQWNjZXNzaWJsZVdp
ZGdldCB7Ci1wdWJsaWM6Ci0gICAgUVdlYlZpZXdBY2Nlc3NpYmxlKFFXZWJWaWV3Kik7Ci0KLSAg
ICBRV2ViVmlldyogdmlldygpIGNvbnN0OwotCi0gICAgaW50IGNoaWxkQ291bnQoKSBjb25zdDsK
LSAgICBRQWNjZXNzaWJsZUludGVyZmFjZSogY2hpbGQoaW50IGluZGV4KSBjb25zdDsKLX07Ci0K
LSNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9DaHJv
bWVDbGllbnRRdC5jcHAgYi9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L0Nocm9tZUNs
aWVudFF0LmNwcAppbmRleCAwNWY3Yjk0OWRjY2NkMjI5MGFjOTcwMWY4YTY2YmYwMjM0OGM3MzYx
Li43MWI0NWQ2ZGRkNzJlMTNhZTQ0OTkxYzVmY2NmNTk5YjVkMjJhZDM2IDEwMDY0NAotLS0gYS9T
b3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L0Nocm9tZUNsaWVudFF0LmNwcAorKysgYi9T
b3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L0Nocm9tZUNsaWVudFF0LmNwcApAQCAtNjAs
NiArNjAsNyBAQAogI2luY2x1ZGUgIlNjcm9sbGJhclRoZW1lLmgiCiAjaW5jbHVkZSAiU2VhcmNo
UG9wdXBNZW51UXQuaCIKICNpbmNsdWRlICJTZWN1cml0eU9yaWdpbi5oIgorI2luY2x1ZGUgIlRl
eHR1cmVNYXBwZXJMYXllckNsaWVudFF0LmgiCiAjaW5jbHVkZSAiVGlsZWRCYWNraW5nU3RvcmUu
aCIKICNpbmNsdWRlICJWaWV3cG9ydEFyZ3VtZW50cy5oIgogI2luY2x1ZGUgIldpbmRvd0ZlYXR1
cmVzLmgiCkBAIC0xNjUsNyArMTY2LDExIEBAIGJvb2wgQ2hyb21lQ2xpZW50UXQ6OmFsbG93c0Fj
Y2VsZXJhdGVkQ29tcG9zaXRpbmcoKSBjb25zdAogewogICAgIGlmICghcGxhdGZvcm1QYWdlQ2xp
ZW50KCkpCiAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gcGxhdGZvcm1QYWdlQ2xp
ZW50KCktPmFsbG93c0FjY2VsZXJhdGVkQ29tcG9zaXRpbmcoKTsKKyNpZiBVU0UoQUNDRUxFUkFU
RURfQ09NUE9TSVRJTkcpCisgICAgcmV0dXJuIHRydWU7CisjZWxzZQorICAgIHJldHVybiBmYWxz
ZTsKKyNlbmRpZgogfQogCiBGbG9hdFJlY3QgQ2hyb21lQ2xpZW50UXQ6OnBhZ2VSZWN0KCkKQEAg
LTQ1Niw3ICs0NjEsOCBAQCB2b2lkIENocm9tZUNsaWVudFF0OjpzY3JvbGwoY29uc3QgSW50U2l6
ZSYgZGVsdGEsIGNvbnN0IEludFJlY3QmIHNjcm9sbFZpZXdSZWN0LAogdm9pZCBDaHJvbWVDbGll
bnRRdDo6ZGVsZWdhdGVkU2Nyb2xsUmVxdWVzdGVkKGNvbnN0IEludFBvaW50JiBwb2ludCkKIHsK
IAotICAgIEludFNpemUgY3VycmVudFBvc2l0aW9uID0gbV93ZWJQYWdlLT5tYWluRnJhbWVBZGFw
dGVyKCktPnNjcm9sbFBvc2l0aW9uKCk7CisgICAgY29uc3QgUVBvaW50IG9mcyA9IG1fd2ViUGFn
ZS0+bWFpbkZyYW1lQWRhcHRlcigpLT5zY3JvbGxQb3NpdGlvbigpOworICAgIEludFNpemUgY3Vy
cmVudFBvc2l0aW9uKG9mcy54KCksIG9mcy55KCkpOwogICAgIGludCB4ID0gcG9pbnQueCgpIC0g
Y3VycmVudFBvc2l0aW9uLndpZHRoKCk7CiAgICAgaW50IHkgPSBwb2ludC55KCkgLSBjdXJyZW50
UG9zaXRpb24uaGVpZ2h0KCk7CiAgICAgY29uc3QgUVJlY3QgcmVjdChRUG9pbnQoMCwgMCksIG1f
d2ViUGFnZS0+dmlld3BvcnRTaXplKCkpOwpAQCAtNjI2LDI3ICs2MzIsMjggQEAgdm9pZCBDaHJv
bWVDbGllbnRRdDo6c2VydmljZVNjcmlwdGVkQW5pbWF0aW9ucygpCiAjaWYgVVNFKEFDQ0VMRVJB
VEVEX0NPTVBPU0lUSU5HKQogdm9pZCBDaHJvbWVDbGllbnRRdDo6YXR0YWNoUm9vdEdyYXBoaWNz
TGF5ZXIoRnJhbWUqIGZyYW1lLCBHcmFwaGljc0xheWVyKiBncmFwaGljc0xheWVyKQogewotICAg
IGlmIChwbGF0Zm9ybVBhZ2VDbGllbnQoKSkKLSAgICAgICAgcGxhdGZvcm1QYWdlQ2xpZW50KCkt
PnNldFJvb3RHcmFwaGljc0xheWVyKGdyYXBoaWNzTGF5ZXIpOworICAgIGlmICghbV90ZXh0dXJl
TWFwcGVyTGF5ZXJDbGllbnQpCisgICAgICAgIG1fdGV4dHVyZU1hcHBlckxheWVyQ2xpZW50ID0g
YWRvcHRQdHIobmV3IFRleHR1cmVNYXBwZXJMYXllckNsaWVudFF0KG1fd2ViUGFnZS0+bWFpbkZy
YW1lQWRhcHRlcigpKSk7CisgICAgbV90ZXh0dXJlTWFwcGVyTGF5ZXJDbGllbnQtPnNldFJvb3RH
cmFwaGljc0xheWVyKGdyYXBoaWNzTGF5ZXIpOwogfQogCiB2b2lkIENocm9tZUNsaWVudFF0Ojpz
ZXROZWVkc09uZVNob3REcmF3aW5nU3luY2hyb25pemF0aW9uKCkKIHsKICAgICAvLyB3ZSB3YW50
IHRoZSBsYXllcnMgdG8gc3luY2hyb25pemUgbmV4dCB0aW1lIHdlIHVwZGF0ZSB0aGUgc2NyZWVu
IGFueXdheQotICAgIGlmIChwbGF0Zm9ybVBhZ2VDbGllbnQoKSkKLSAgICAgICAgcGxhdGZvcm1Q
YWdlQ2xpZW50KCktPm1hcmtGb3JTeW5jKGZhbHNlKTsKKyAgICBpZiAobV90ZXh0dXJlTWFwcGVy
TGF5ZXJDbGllbnQpCisgICAgICAgIG1fdGV4dHVyZU1hcHBlckxheWVyQ2xpZW50LT5tYXJrRm9y
U3luYyhmYWxzZSk7CiB9CiAKIHZvaWQgQ2hyb21lQ2xpZW50UXQ6OnNjaGVkdWxlQ29tcG9zaXRp
bmdMYXllckZsdXNoKCkKIHsKICAgICAvLyB3ZSB3YW50IHRoZSBsYXllcnMgdG8gc3luY2hyb25p
emUgQVNBUAotICAgIGlmIChwbGF0Zm9ybVBhZ2VDbGllbnQoKSkKLSAgICAgICAgcGxhdGZvcm1Q
YWdlQ2xpZW50KCktPm1hcmtGb3JTeW5jKHRydWUpOworICAgIGlmIChtX3RleHR1cmVNYXBwZXJM
YXllckNsaWVudCkKKyAgICAgICAgbV90ZXh0dXJlTWFwcGVyTGF5ZXJDbGllbnQtPm1hcmtGb3JT
eW5jKHRydWUpOwogfQogCiBDaHJvbWVDbGllbnQ6OkNvbXBvc2l0aW5nVHJpZ2dlckZsYWdzIENo
cm9tZUNsaWVudFF0OjphbGxvd2VkQ29tcG9zaXRpbmdUcmlnZ2VycygpIGNvbnN0CiB7Ci0gICAg
aWYgKHBsYXRmb3JtUGFnZUNsaWVudCgpICYmIHBsYXRmb3JtUGFnZUNsaWVudCgpLT5hbGxvd3NB
Y2NlbGVyYXRlZENvbXBvc2l0aW5nKCkpCisgICAgaWYgKGFsbG93c0FjY2VsZXJhdGVkQ29tcG9z
aXRpbmcoKSkKICAgICAgICAgcmV0dXJuIFRocmVlRFRyYW5zZm9ybVRyaWdnZXIgfCBWaWRlb1Ry
aWdnZXIgfCBDYW52YXNUcmlnZ2VyIHwgQW5pbWF0aW9uVHJpZ2dlcjsKIAogICAgIHJldHVybiAw
OwpAQCAtNjYxLDcgKzY2OCw4IEBAIEludFJlY3QgQ2hyb21lQ2xpZW50UXQ6OnZpc2libGVSZWN0
Rm9yVGlsZWRCYWNraW5nU3RvcmUoKSBjb25zdAogICAgICAgICByZXR1cm4gSW50UmVjdCgpOwog
CiAgICAgaWYgKCFwbGF0Zm9ybVBhZ2VDbGllbnQoKS0+dmlld1Jlc2l6ZXNUb0NvbnRlbnRzRW5h
YmxlZCgpKSB7Ci0gICAgICAgIEludFNpemUgb2Zmc2V0ID0gbV93ZWJQYWdlLT5tYWluRnJhbWVB
ZGFwdGVyKCktPnNjcm9sbFBvc2l0aW9uKCk7CisgICAgICAgIGNvbnN0IFFQb2ludCBvZnMgPSBt
X3dlYlBhZ2UtPm1haW5GcmFtZUFkYXB0ZXIoKS0+c2Nyb2xsUG9zaXRpb24oKTsKKyAgICAgICAg
SW50U2l6ZSBvZmZzZXQob2ZzLngoKSwgb2ZzLnkoKSk7CiAgICAgICAgIHJldHVybiBRUmVjdChR
UG9pbnQob2Zmc2V0LndpZHRoKCksIG9mZnNldC5oZWlnaHQoKSksIG1fd2ViUGFnZS0+bWFpbkZy
YW1lQWRhcHRlcigpLT5mcmFtZVJlY3QoKS5zaXplKCkpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9DaHJvbWVDbGllbnRRdC5oIGIvU291cmNl
L1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9DaHJvbWVDbGllbnRRdC5oCmluZGV4IDk2ZDg2MjVj
MDUwMTNmMjdlYWIyOTc0MjM0ZmVlYjdhOGQzYWZmYTIuLjEyMmI0MDhmYjU3NDhiY2I5YzA3NDg0
ZDY2Zjc0NWM5ZDRhMzE0ZWUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1
cHBvcnQvQ2hyb21lQ2xpZW50UXQuaAorKysgYi9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBw
b3J0L0Nocm9tZUNsaWVudFF0LmgKQEAgLTU4LDYgKzU4LDcgQEAgc3RydWN0IFZpZXdwb3J0QXJn
dW1lbnRzOwogI2lmIEVOQUJMRShWSURFTykKIGNsYXNzIEZ1bGxTY3JlZW5WaWRlb1F0OwogI2Vu
ZGlmCitjbGFzcyBUZXh0dXJlTWFwcGVyTGF5ZXJDbGllbnRRdDsKIAogY2xhc3MgQ2hyb21lQ2xp
ZW50UXQgOiBwdWJsaWMgQ2hyb21lQ2xpZW50IHsKIHB1YmxpYzoKQEAgLTIyMiw2ICsyMjMsMTAg
QEAgcHVibGljOgogICAgIHN0YXRpYyBib29sIGR1bXBWaXNpdGVkTGlua3NDYWxsYmFja3M7CiAK
ICAgICBtdXRhYmxlIFF0UGxhdGZvcm1QbHVnaW4gbV9wbGF0Zm9ybVBsdWdpbjsKKworI2lmIFVT
RShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICBPd25QdHI8VGV4dHVyZU1hcHBlckxheWVy
Q2xpZW50UXQ+IG1fdGV4dHVyZU1hcHBlckxheWVyQ2xpZW50OworI2VuZGlmCiB9OwogfQogCmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L0RlZmF1bHRGdWxsU2Ny
ZWVuVmlkZW9IYW5kbGVyLmNwcCBiL1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvRGVm
YXVsdEZ1bGxTY3JlZW5WaWRlb0hhbmRsZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwZmUyNGU4YmQ1MjM1MjViYWM5YmE4MjI0OTg3YTNiNmM2Y2UxN2Q5Li4wMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvcXQvV2Vi
Q29yZVN1cHBvcnQvRGVmYXVsdEZ1bGxTY3JlZW5WaWRlb0hhbmRsZXIuY3BwCisrKyAvZGV2L251
bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBEaWdpYSBQbGMg
YW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpLgotICogQ29weXJpZ2h0IChDKSAyMDExIE5va2lh
IENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKS4KLSAqCi0gKiBUaGlzIGxp
YnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0g
KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1
YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh
dGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9w
dGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1
dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBB
TlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVS
Q0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRo
ZSBHTlUKLSAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxz
LgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBz
ZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCi0gKiB0aGUgRnJlZSBT
b2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29y
LAotICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZp
Zy5oIgotI2luY2x1ZGUgIkRlZmF1bHRGdWxsU2NyZWVuVmlkZW9IYW5kbGVyLmgiCi0KLSNpZiBV
U0UoUVRfTVVMVElNRURJQSkKLQotI2luY2x1ZGUgIkZ1bGxTY3JlZW5WaWRlb1dpZGdldC5oIgot
Ci11c2luZyBuYW1lc3BhY2UgV2ViS2l0OwotCi1ib29sIERlZmF1bHRGdWxsU2NyZWVuVmlkZW9I
YW5kbGVyOjpzX3Nob3VsZEZvcmNlRnVsbFNjcmVlblZpZGVvUGxheWJhY2sgPSBmYWxzZTsKLQot
RGVmYXVsdEZ1bGxTY3JlZW5WaWRlb0hhbmRsZXI6OkRlZmF1bHRGdWxsU2NyZWVuVmlkZW9IYW5k
bGVyKCkKLSAgICA6IFFXZWJGdWxsU2NyZWVuVmlkZW9IYW5kbGVyKCkKLSAgICAsIG1fZnVsbFNj
cmVlbldpZGdldChuZXcgRnVsbFNjcmVlblZpZGVvV2lkZ2V0KQotewotICAgIGNvbm5lY3QobV9m
dWxsU2NyZWVuV2lkZ2V0LCBTSUdOQUwoZGlkRXhpdEZ1bGxTY3JlZW4oKSksIHRoaXMsIFNJR05B
TChmdWxsU2NyZWVuQ2xvc2VkKCkpKTsKLSAgICBtX2Z1bGxTY3JlZW5XaWRnZXQtPmhpZGUoKTsK
LQotICAgIG1fZnVsbFNjcmVlbldpZGdldC0+Y2xvc2UoKTsKLX0KLQotRGVmYXVsdEZ1bGxTY3Jl
ZW5WaWRlb0hhbmRsZXI6On5EZWZhdWx0RnVsbFNjcmVlblZpZGVvSGFuZGxlcigpCi17Ci0gICAg
ZGVsZXRlIG1fZnVsbFNjcmVlbldpZGdldDsKLX0KLQotYm9vbCBEZWZhdWx0RnVsbFNjcmVlblZp
ZGVvSGFuZGxlcjo6cmVxdWlyZXNGdWxsU2NyZWVuRm9yVmlkZW9QbGF5YmFjaygpIGNvbnN0Ci17
Ci0gICAgc3RhdGljIGJvb2wgaW5pdGlhbGl6ZWQgPSBmYWxzZTsKLSAgICBpZiAoIWluaXRpYWxp
emVkKSB7Ci0gICAgICAgIFFCeXRlQXJyYXkgZm9yY2VGdWxsU2NyZWVuID0gcWdldGVudigiUVRf
V0VCS0lUX0ZPUkNFX0ZVTExTQ1JFRU5fVklERU8iKTsKLSAgICAgICAgaWYgKCFmb3JjZUZ1bGxT
Y3JlZW4uaXNFbXB0eSgpKQotICAgICAgICAgICAgc19zaG91bGRGb3JjZUZ1bGxTY3JlZW5WaWRl
b1BsYXliYWNrID0gdHJ1ZTsKLQotICAgICAgICBpbml0aWFsaXplZCA9IHRydWU7Ci0gICAgfQot
Ci0gICAgcmV0dXJuIHNfc2hvdWxkRm9yY2VGdWxsU2NyZWVuVmlkZW9QbGF5YmFjazsKLX0KLQot
dm9pZCBEZWZhdWx0RnVsbFNjcmVlblZpZGVvSGFuZGxlcjo6ZW50ZXJGdWxsU2NyZWVuKFFNZWRp
YVBsYXllciogcGxheWVyKQotewotICAgIG1fZnVsbFNjcmVlbldpZGdldC0+c2hvdyhwbGF5ZXIp
OwotfQotCi12b2lkIERlZmF1bHRGdWxsU2NyZWVuVmlkZW9IYW5kbGVyOjpleGl0RnVsbFNjcmVl
bigpCi17Ci0gICAgbV9mdWxsU2NyZWVuV2lkZ2V0LT5jbG9zZSgpOwotfQotI2VuZGlmCi0KLQpk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9EZWZhdWx0RnVsbFNj
cmVlblZpZGVvSGFuZGxlci5oIGIvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9EZWZh
dWx0RnVsbFNjcmVlblZpZGVvSGFuZGxlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCBlOTQzYzU1ZTQ0MDA4MjI1MDg1ZjNhMTY4OWU0OWRmMjM4OWY0YWQ3Li4wMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29y
ZVN1cHBvcnQvRGVmYXVsdEZ1bGxTY3JlZW5WaWRlb0hhbmRsZXIuaAorKysgL2Rldi9udWxsCkBA
IC0xLDUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgRGlnaWEgUGxjIGFuZC9v
ciBpdHMgc3Vic2lkaWFyeSgtaWVzKS4KLSAqIENvcHlyaWdodCAoQykgMjAxMSBOb2tpYSBDb3Jw
b3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykuCi0gKgotICogVGhpcyBsaWJyYXJ5
IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9k
aWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMK
LSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247
IGVpdGhlcgotICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24p
IGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBp
biB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdB
UlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5U
QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05V
Ci0gKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAq
Ci0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRo
ZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwotICogdGhlIEZyZWUgU29mdHdh
cmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKLSAq
IEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgotICovCi0jaWZuZGVmIERlZmF1bHRGdWxsU2Ny
ZWVuVmlkZW9IYW5kbGVyX2gKLSNkZWZpbmUgRGVmYXVsdEZ1bGxTY3JlZW5WaWRlb0hhbmRsZXJf
aAotCi0jaW5jbHVkZSAicXdlYmtpdHBsYXRmb3JtcGx1Z2luLmgiCi0KLW5hbWVzcGFjZSBXZWJL
aXQgewotCi1jbGFzcyBGdWxsU2NyZWVuVmlkZW9XaWRnZXQ7Ci0KLS8vIFdlIGRvIG5vdCB1c2Ug
RU5BQkxFIG9yIFVTRSBiZWNhdXNlIG1vYyBkb2VzIG5vdCBleHBhbmQgdGhlc2UgbWFjcm9zLgot
I2lmIGRlZmluZWQoV1RGX1VTRV9RVF9NVUxUSU1FRElBKSAmJiBXVEZfVVNFX1FUX01VTFRJTUVE
SUEKLWNsYXNzIERlZmF1bHRGdWxsU2NyZWVuVmlkZW9IYW5kbGVyIDogcHVibGljIFFXZWJGdWxs
U2NyZWVuVmlkZW9IYW5kbGVyIHsKLSAgICBRX09CSkVDVAotcHVibGljOgotICAgIERlZmF1bHRG
dWxsU2NyZWVuVmlkZW9IYW5kbGVyKCk7Ci0gICAgdmlydHVhbCB+RGVmYXVsdEZ1bGxTY3JlZW5W
aWRlb0hhbmRsZXIoKTsKLSAgICBib29sIHJlcXVpcmVzRnVsbFNjcmVlbkZvclZpZGVvUGxheWJh
Y2soKSBjb25zdDsKLQotcHVibGljIFFfU0xPVFM6Ci0gICAgdm9pZCBlbnRlckZ1bGxTY3JlZW4o
UU1lZGlhUGxheWVyKik7Ci0gICAgdm9pZCBleGl0RnVsbFNjcmVlbigpOwotCi1wcml2YXRlOgot
ICAgIHN0YXRpYyBib29sIHNfc2hvdWxkRm9yY2VGdWxsU2NyZWVuVmlkZW9QbGF5YmFjazsKLSAg
ICBGdWxsU2NyZWVuVmlkZW9XaWRnZXQgKm1fZnVsbFNjcmVlbldpZGdldDsKLX07Ci0jZW5kaWYK
LQotfSAvLyBuYW1lc3BhY2UgV2ViS2l0Ci0KLSNlbmRpZiAvLyBEZWZhdWx0RnVsbFNjcmVlblZp
ZGVvSGFuZGxlcl9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0
L0R1bXBSZW5kZXJUcmVlU3VwcG9ydFF0LmNwcCBiL1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1
cHBvcnQvRHVtcFJlbmRlclRyZWVTdXBwb3J0UXQuY3BwCmluZGV4IDlhM2JlMzUyM2YxYzEwM2I3
ODQxM2M3MTNkMDFhNDU0MWNhZDA1NzQuLjVjZWFjZDZiYzAwMjVmOWI0OTQ5MDMyMDc4ZWI0NGQx
NTIxNDA2OGMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvRHVt
cFJlbmRlclRyZWVTdXBwb3J0UXQuY3BwCisrKyBiL1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1
cHBvcnQvRHVtcFJlbmRlclRyZWVTdXBwb3J0UXQuY3BwCkBAIC0xMDQ4LDMgKzEwNDgsMTEgQEAg
dm9pZCBEdW1wUmVuZGVyVHJlZVN1cHBvcnRRdDo6Z2V0VHJhY2tlZFJlcGFpbnRSZWN0cyhRV2Vi
RnJhbWVBZGFwdGVyKiBhZGFwdGVyLAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVjdHMu
c2l6ZSgpOyArK2kpCiAgICAgICAgIHJlc3VsdC5hcHBlbmQocmVjdHNbaV0pOwogfQorCitRU3Ry
aW5nIER1bXBSZW5kZXJUcmVlU3VwcG9ydFF0OjpmcmFtZVJlbmRlclRyZWVEdW1wKFFXZWJGcmFt
ZUFkYXB0ZXIqIGFkYXB0ZXIpCit7CisgICAgaWYgKGFkYXB0ZXItPmZyYW1lLT52aWV3KCkgJiYg
YWRhcHRlci0+ZnJhbWUtPnZpZXcoKS0+bGF5b3V0UGVuZGluZygpKQorICAgICAgICBhZGFwdGVy
LT5mcmFtZS0+dmlldygpLT5sYXlvdXQoKTsKKworICAgIHJldHVybiBleHRlcm5hbFJlcHJlc2Vu
dGF0aW9uKGFkYXB0ZXItPmZyYW1lKTsKK30KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvcXQv
V2ViQ29yZVN1cHBvcnQvRHVtcFJlbmRlclRyZWVTdXBwb3J0UXQuaCBiL1NvdXJjZS9XZWJLaXQv
cXQvV2ViQ29yZVN1cHBvcnQvRHVtcFJlbmRlclRyZWVTdXBwb3J0UXQuaAppbmRleCA3MjUwNWI4
ZDM1MjBjNzk0OGQ3NDY4YjJkNmNiN2E4ZTY0N2FlNmY1Li5kMDZhNmI1MDViZjY5MmRhYWM1Njhi
ZGNkOTkzYzZhNzhmMjAxMmRjIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVT
dXBwb3J0L0R1bXBSZW5kZXJUcmVlU3VwcG9ydFF0LmgKKysrIGIvU291cmNlL1dlYktpdC9xdC9X
ZWJDb3JlU3VwcG9ydC9EdW1wUmVuZGVyVHJlZVN1cHBvcnRRdC5oCkBAIC0yMTMsNiArMjEzLDgg
QEAgcHVibGljOgogICAgIHN0YXRpYyB2b2lkIHNldFRyYWNrUmVwYWludFJlY3RzKFFXZWJGcmFt
ZUFkYXB0ZXIqLCBib29sIGVuYWJsZSk7CiAgICAgc3RhdGljIGJvb2wgdHJhY2tSZXBhaW50UmVj
dHMoUVdlYkZyYW1lQWRhcHRlciopOwogICAgIHN0YXRpYyB2b2lkIGdldFRyYWNrZWRSZXBhaW50
UmVjdHMoUVdlYkZyYW1lQWRhcHRlciosIFFWZWN0b3I8UVJlY3Q+JiByZXN1bHQpOworCisgICAg
c3RhdGljIFFTdHJpbmcgZnJhbWVSZW5kZXJUcmVlRHVtcChRV2ViRnJhbWVBZGFwdGVyKik7CiB9
OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQv
RnVsbFNjcmVlblZpZGVvV2lkZ2V0LmNwcCBiL1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBv
cnQvRnVsbFNjcmVlblZpZGVvV2lkZ2V0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggNDEwNWQwMmM2MjI1N2M1NDk5MDZmZWM1MTVmNGY3NmQ0ZWE4YjdkMS4uMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNv
cmVTdXBwb3J0L0Z1bGxTY3JlZW5WaWRlb1dpZGdldC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwx
MjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBOb2tpYSBDb3Jwb3JhdGlvbiBh
bmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykuCi0gKgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4K
LSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBV
VEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0g
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVU
RVIsIElOQy4gT1IKLSAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAotICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAotICogUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
Ci0gKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZCi0gKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
LSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiRnVsbFNjcmVlblZpZGVvV2lk
Z2V0LmgiCi0KLSNpbmNsdWRlIDxRQXBwbGljYXRpb24+Ci0jaW5jbHVkZSA8UUNsb3NlRXZlbnQ+
Ci0jaW5jbHVkZSA8UURlc2t0b3BXaWRnZXQ+Ci0jaW5jbHVkZSA8UUtleUV2ZW50PgotI2luY2x1
ZGUgPFFNZWRpYVBsYXllcj4KLQotc3RhdGljIGNvbnN0IGludCBnSGlkZU1vdXNlQ3Vyc29yRGVs
YXkgPSAzMDAwOwotCi1uYW1lc3BhY2UgV2ViS2l0IHsKLQotRnVsbFNjcmVlblZpZGVvV2lkZ2V0
OjpGdWxsU2NyZWVuVmlkZW9XaWRnZXQoKQotICAgIDogUVZpZGVvV2lkZ2V0KCkKLSAgICAsIG1f
bWVkaWFQbGF5ZXIoMCkKLXsKLSAgICBRUGFsZXR0ZSBwYWxldHRlKHRoaXMtPnBhbGV0dGUoKSk7
Ci0gICAgcGFsZXR0ZS5zZXRDb2xvcihRUGFsZXR0ZTo6QmFzZSwgUXQ6OmJsYWNrKTsKLSAgICBw
YWxldHRlLnNldENvbG9yKFFQYWxldHRlOjpCYWNrZ3JvdW5kLCBRdDo6YmxhY2spOwotICAgIHNl
dFBhbGV0dGUocGFsZXR0ZSk7Ci0KLSAgICBzZXRXaW5kb3dNb2RhbGl0eShRdDo6QXBwbGljYXRp
b25Nb2RhbCk7Ci0gICAgc2V0V2luZG93RmxhZ3Mod2luZG93RmxhZ3MoKSB8IFF0OjpGcmFtZWxl
c3NXaW5kb3dIaW50KTsKLQotICAgIHNldEdlb21ldHJ5KFFBcHBsaWNhdGlvbjo6ZGVza3RvcCgp
LT5zY3JlZW5HZW9tZXRyeSgpKTsKLQotICAgIG1fY3Vyc29yVGltZXIuc2V0U2luZ2xlU2hvdCh0
cnVlKTsKLSAgICBjb25uZWN0KCZtX2N1cnNvclRpbWVyLCBTSUdOQUwodGltZW91dCgpKSwgdGhp
cywgU0xPVChoaWRlQ3Vyc29yKCkpKTsKLX0KLQotRnVsbFNjcmVlblZpZGVvV2lkZ2V0Ojp+RnVs
bFNjcmVlblZpZGVvV2lkZ2V0KCkKLXsKLX0KLQotdm9pZCBGdWxsU2NyZWVuVmlkZW9XaWRnZXQ6
OnNob3coUU1lZGlhUGxheWVyKiBwbGF5ZXIpCi17Ci0gICAgbV9tZWRpYVBsYXllciA9IHBsYXll
cjsKLSAgICBzaG93RnVsbFNjcmVlbigpOwotICAgIHNldE1vdXNlVHJhY2tpbmcodHJ1ZSk7Ci0g
ICAgcmFpc2UoKTsKLSAgICBtX21lZGlhUGxheWVyLT5zZXRWaWRlb091dHB1dCh0aGlzKTsKLSAg
ICBzZXRGb2N1cygpOwotICAgIGdyYWJNb3VzZSgpOwotICAgIGhpZGVDdXJzb3IoKTsKLX0KLQot
dm9pZCBGdWxsU2NyZWVuVmlkZW9XaWRnZXQ6OmNsb3NlRXZlbnQoUUNsb3NlRXZlbnQqIGV2ZW50
KQotewotICAgIG1fbWVkaWFQbGF5ZXIgPSAwOwotICAgIG1fY3Vyc29yVGltZXIuc3RvcCgpOwot
ICAgIHNldE1vdXNlVHJhY2tpbmcoZmFsc2UpOwotICAgIHJlbGVhc2VNb3VzZSgpOwotICAgIFFB
cHBsaWNhdGlvbjo6cmVzdG9yZU92ZXJyaWRlQ3Vyc29yKCk7Ci0gICAgZXZlbnQtPmlnbm9yZSgp
OwotICAgIGhpZGUoKTsKLSAgICBlbWl0IGRpZEV4aXRGdWxsU2NyZWVuKCk7Ci19Ci0KLWJvb2wg
RnVsbFNjcmVlblZpZGVvV2lkZ2V0OjpldmVudChRRXZlbnQqIGV2KQotewotICAgIHN3aXRjaCAo
ZXYtPnR5cGUoKSkgewotICAgIGNhc2UgUUV2ZW50OjpNb3VzZU1vdmU6Ci0gICAgICAgIHNob3dD
dXJzb3IoKTsKLSAgICAgICAgZXYtPmFjY2VwdCgpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAg
ICBjYXNlIFFFdmVudDo6TW91c2VCdXR0b25EYmxDbGljazoKLSAgICAgICAgY2xvc2UoKTsKLSAg
ICAgICAgZXYtPmFjY2VwdCgpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICBkZWZhdWx0Ogot
ICAgICAgICByZXR1cm4gUVZpZGVvV2lkZ2V0OjpldmVudChldik7Ci0gICAgfQotfQotCi12b2lk
IEZ1bGxTY3JlZW5WaWRlb1dpZGdldDo6a2V5UHJlc3NFdmVudChRS2V5RXZlbnQqIGV2KQotewot
ICAgIGlmIChtX21lZGlhUGxheWVyICYmIGV2LT5rZXkoKSA9PSBRdDo6S2V5X1NwYWNlKSB7Ci0g
ICAgICAgIGlmIChtX21lZGlhUGxheWVyLT5zdGF0ZSgpID09IFFNZWRpYVBsYXllcjo6UGxheWlu
Z1N0YXRlKQotICAgICAgICAgICAgbV9tZWRpYVBsYXllci0+cGF1c2UoKTsKLSAgICAgICAgZWxz
ZQotICAgICAgICAgICAgbV9tZWRpYVBsYXllci0+cGxheSgpOwotICAgIH0gZWxzZSBpZiAoZXYt
PmtleSgpID09IFF0OjpLZXlfRXNjYXBlKQotICAgICAgICBjbG9zZSgpOwotfQotCi12b2lkIEZ1
bGxTY3JlZW5WaWRlb1dpZGdldDo6aGlkZUN1cnNvcigpCi17Ci0gICAgUUFwcGxpY2F0aW9uOjpz
ZXRPdmVycmlkZUN1cnNvcihRQ3Vyc29yKFF0OjpCbGFua0N1cnNvcikpOwotfQotCi12b2lkIEZ1
bGxTY3JlZW5WaWRlb1dpZGdldDo6c2hvd0N1cnNvcigpCi17Ci0gICAgUUFwcGxpY2F0aW9uOjpy
ZXN0b3JlT3ZlcnJpZGVDdXJzb3IoKTsKLSAgICBtX2N1cnNvclRpbWVyLnN0YXJ0KGdIaWRlTW91
c2VDdXJzb3JEZWxheSk7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvcXQvV2Vi
Q29yZVN1cHBvcnQvRnVsbFNjcmVlblZpZGVvV2lkZ2V0LmggYi9Tb3VyY2UvV2ViS2l0L3F0L1dl
YkNvcmVTdXBwb3J0L0Z1bGxTY3JlZW5WaWRlb1dpZGdldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAyMDFjYzQ5ZDFlNDEyZTk4N2I2ZTQxY2M1MDNkZDIyZTNkNDc2YTE3Li4wMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQv
cXQvV2ViQ29yZVN1cHBvcnQvRnVsbFNjcmVlblZpZGVvV2lkZ2V0LmgKKysrIC9kZXYvbnVsbApA
QCAtMSw2NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIE5va2lhIENvcnBvcmF0
aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKS4KLSAqCi0gKiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
Q09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBD
T01QVVRFUiwgSU5DLiBPUgotICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCi0gKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCi0gKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKLSAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKLSAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgotICovCi0KLSNpZm5kZWYgRnVsbFNjcmVlblZpZGVvV2lkZ2V0X2gKLSNkZWZpbmUgRnVs
bFNjcmVlblZpZGVvV2lkZ2V0X2gKLQotI2luY2x1ZGUgPFFUaW1lcj4KLSNpbmNsdWRlIDxRVmlk
ZW9XaWRnZXQ+Ci0KLVFUX0JFR0lOX05BTUVTUEFDRQotY2xhc3MgUU1lZGlhUGxheWVyOwotUVRf
RU5EX05BTUVTUEFDRQotCi1uYW1lc3BhY2UgV2ViS2l0IHsKLQotY2xhc3MgRnVsbFNjcmVlblZp
ZGVvV2lkZ2V0IDogcHVibGljIFFWaWRlb1dpZGdldCB7Ci0gICAgUV9PQkpFQ1QKLXB1YmxpYzoK
LSAgICBGdWxsU2NyZWVuVmlkZW9XaWRnZXQoKTsKLSAgICB2aXJ0dWFsIH5GdWxsU2NyZWVuVmlk
ZW9XaWRnZXQoKTsKLSAgICB2b2lkIHNob3coUU1lZGlhUGxheWVyKik7Ci0KLVFfU0lHTkFMUzoK
LSAgICB2b2lkIGRpZEV4aXRGdWxsU2NyZWVuKCk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFs
IHZvaWQgY2xvc2VFdmVudChRQ2xvc2VFdmVudCopOwotICAgIHZpcnR1YWwgYm9vbCBldmVudChR
RXZlbnQqKTsKLSAgICB2aXJ0dWFsIHZvaWQga2V5UHJlc3NFdmVudChRS2V5RXZlbnQqKTsKLQot
cHJpdmF0ZSBRX1NMT1RTOgotICAgIHZvaWQgaGlkZUN1cnNvcigpOwotCi1wcml2YXRlOgotICAg
IHZvaWQgc2hvd0N1cnNvcigpOwotICAgIFFNZWRpYVBsYXllciogbV9tZWRpYVBsYXllcjsKLSAg
ICBRVGltZXIgbV9jdXJzb3JUaW1lcjsKLX07Ci0KLX0KLQotI2VuZGlmIC8vIEZ1bGxTY3JlZW5W
aWRlb1dpZGdldF9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0
L0luaXRXZWJDb3JlUXQuY3BwIGIvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9Jbml0
V2ViQ29yZVF0LmNwcAppbmRleCBkMmY3NWVjMTg0M2U2NjVjMTU2ZDFiYTY4NzRkNTQwOTI1ZjA5
YmMxLi42MGRjZGJlOTRhNmU0MjBhNDAzZGViMjMzZTQ4MjdjM2UyNjkxZDZmIDEwMDY0NAotLS0g
YS9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L0luaXRXZWJDb3JlUXQuY3BwCisrKyBi
L1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvSW5pdFdlYkNvcmVRdC5jcHAKQEAgLTMw
LDEwICszMCwxMiBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIkluaXRXZWJDb3Jl
UXQuaCIKIAorI2luY2x1ZGUgIkNocm9tZS5oIgorI2luY2x1ZGUgIkNocm9tZUNsaWVudFF0Lmgi
CiAjaW5jbHVkZSAiSW1hZ2UuaCIKICNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgorI2luY2x1
ZGUgIlBhZ2UuaCIKICNpbmNsdWRlICJQbGF0Zm9ybVN0cmF0ZWdpZXNRdC5oIgotI2luY2x1ZGUg
IlFTdHlsZUZhY2FkZUltcC5oIgogI2luY2x1ZGUgIlJlbmRlclRoZW1lUVN0eWxlLmgiCiAjaW5j
bHVkZSAiU2NyaXB0Q29udHJvbGxlci5oIgogI2luY2x1ZGUgIlNjcm9sbGJhclRoZW1lUVN0eWxl
LmgiCkBAIC00OCwxOCArNTAsMjYgQEAKIAogbmFtZXNwYWNlIFdlYktpdCB7CiAKLXN0YXRpYyBR
dFN0eWxlRmFjdG9yeUZ1bmN0aW9uIGluaXRDYWxsYmFjayA9IDA7CitzdGF0aWMgUXRTdHlsZUZh
Y2FkZUZhY3RvcnlGdW5jdGlvbiBpbml0Q2FsbGJhY2sgPSAwOwogCi12b2lkIHNldFdlYktpdFdp
ZGdldHNJbml0Q2FsbGJhY2soUXRTdHlsZUZhY3RvcnlGdW5jdGlvbiBjYWxsYmFjaykKK1FfREVD
TF9FWFBPUlQgdm9pZCBzZXRXZWJLaXRXaWRnZXRzSW5pdENhbGxiYWNrKFF0U3R5bGVGYWNhZGVG
YWN0b3J5RnVuY3Rpb24gY2FsbGJhY2spCiB7CiAgICAgaW5pdENhbGxiYWNrID0gY2FsbGJhY2s7
CiB9CiAKK3N0YXRpYyBXZWJDb3JlOjpRU3R5bGVGYWNhZGUqIGNyZWF0ZVN0eWxlRm9yUGFnZShX
ZWJDb3JlOjpQYWdlKiBwYWdlKQoreworICAgIFFXZWJQYWdlQWRhcHRlciogcGFnZUFkYXB0ZXIg
PSAwOworICAgIGlmIChwYWdlKQorICAgICAgICBwYWdlQWRhcHRlciA9IHN0YXRpY19jYXN0PFdl
YkNvcmU6OkNocm9tZUNsaWVudFF0Kj4ocGFnZS0+Y2hyb21lKCktPmNsaWVudCgpKS0+bV93ZWJQ
YWdlOworICAgIHJldHVybiBpbml0Q2FsbGJhY2socGFnZUFkYXB0ZXIpOworfQorCiAvLyBDYWxs
ZWQgYWxzbyBmcm9tIFdlYktpdDIncyBXZWJQcm9jZXNzCiBRX0RFQ0xfRVhQT1JUIHZvaWQgaW5p
dGlhbGl6ZVdlYktpdFF0KCkKIHsKICAgICBpZiAoaW5pdENhbGxiYWNrKSB7Ci0gICAgICAgIFdl
YkNvcmU6OlJlbmRlclRoZW1lUVN0eWxlOjpzZXRTdHlsZUZhY3RvcnlGdW5jdGlvbihpbml0Q2Fs
bGJhY2spOworICAgICAgICBXZWJDb3JlOjpSZW5kZXJUaGVtZVFTdHlsZTo6c2V0U3R5bGVGYWN0
b3J5RnVuY3Rpb24oY3JlYXRlU3R5bGVGb3JQYWdlKTsKICAgICAgICAgV2ViQ29yZTo6UmVuZGVy
VGhlbWVRdDo6c2V0Q3VzdG9tVGhlbWUoV2ViQ29yZTo6UmVuZGVyVGhlbWVRU3R5bGU6OmNyZWF0
ZSwgbmV3IFdlYkNvcmU6OlNjcm9sbGJhclRoZW1lUVN0eWxlKTsKICAgICB9CiB9CmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L0luaXRXZWJDb3JlUXQuaCBiL1Nv
dXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvSW5pdFdlYkNvcmVRdC5oCmluZGV4IDdlMWIw
YjdhMjg2MjAyZTAzZDVmN2Q4OTU4OTA2Yjg1MWMyODc2YTkuLjU5MTM5OTk5MzM4OTEyYzJjYmJj
MzlmZGMzMDZkZDE2ZmZmYjYxZDUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29y
ZVN1cHBvcnQvSW5pdFdlYkNvcmVRdC5oCisrKyBiL1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1
cHBvcnQvSW5pdFdlYkNvcmVRdC5oCkBAIC0zNiwxMSArMzYsMTMgQEAgbmFtZXNwYWNlIFdlYkNv
cmUgewogY2xhc3MgUGFnZTsKIGNsYXNzIFFTdHlsZUZhY2FkZTsKIH0KLXR5cGVkZWYgV2ViQ29y
ZTo6UVN0eWxlRmFjYWRlKiAoKlF0U3R5bGVGYWN0b3J5RnVuY3Rpb24pKFdlYkNvcmU6OlBhZ2Uq
KTsKK2NsYXNzIFFXZWJQYWdlQWRhcHRlcjsKKwordHlwZWRlZiBXZWJDb3JlOjpRU3R5bGVGYWNh
ZGUqICgqUXRTdHlsZUZhY2FkZUZhY3RvcnlGdW5jdGlvbikoUVdlYlBhZ2VBZGFwdGVyKik7CiAK
IG5hbWVzcGFjZSBXZWJLaXQgewogCi12b2lkIHNldFdlYktpdFdpZGdldHNJbml0Q2FsbGJhY2so
UXRTdHlsZUZhY3RvcnlGdW5jdGlvbik7CitRX0RFQ0xfRVhQT1JUIHZvaWQgc2V0V2ViS2l0V2lk
Z2V0c0luaXRDYWxsYmFjayhRdFN0eWxlRmFjYWRlRmFjdG9yeUZ1bmN0aW9uKTsKIFFfREVDTF9F
WFBPUlQgdm9pZCBpbml0aWFsaXplV2ViS2l0UXQoKTsKIFFfREVDTF9FWFBPUlQgdm9pZCBzZXRJ
bWFnZVBsYXRmb3JtUmVzb3VyY2UoY29uc3QgY2hhciogLyogbmFtZSAqLywgY29uc3QgUVBpeG1h
cCYpOwogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L0luaXRX
ZWJLaXRRdC5jcHAgYi9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L0luaXRXZWJLaXRR
dC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxODg2MDM3ZGE1ZjhjMTI1ZjY1
MDU0Y2ZlOGNmZjE3NzE0ZGU0ZTAuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAKLS0tIGEvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9Jbml0V2ViS2l0UXQu
Y3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykg
MjAxMiBEaWdpYSBQbGMgYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpLgotICoKLSAqIFRoaXMg
bGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IK
LSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwg
UHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu
ZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIg
b3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJp
YnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VU
IEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBN
RVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUg
dGhlIEdOVQotICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFp
bHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7
IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KLSAqIHRoZSBGcmVl
IFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxv
b3IsCi0gKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KLSAqCi0gKi8KLQotI2luY2x1ZGUg
ImNvbmZpZy5oIgotI2luY2x1ZGUgIkluaXRXZWJLaXRRdC5oIgotCi0jaW5jbHVkZSAiSW5pdFdl
YkNvcmVRdC5oIgotCi0jaW5jbHVkZSAiUVN0eWxlRmFjYWRlSW1wLmgiCi0KLSNpbmNsdWRlIDxR
QXBwbGljYXRpb24+Ci0jaW5jbHVkZSA8UVN0eWxlPgotCi1uYW1lc3BhY2UgV2ViS2l0IHsKLQot
UV9ERUNMX0VYUE9SVCB2b2lkIGluaXRpYWxpemVXZWJLaXRXaWRnZXRzKCkKLXsKLSAgICBzdGF0
aWMgYm9vbCBpbml0aWFsaXplZCA9IGZhbHNlOwotICAgIGlmIChpbml0aWFsaXplZCkKLSAgICAg
ICAgcmV0dXJuOwotCi0gICAgc2V0V2ViS2l0V2lkZ2V0c0luaXRDYWxsYmFjayhRU3R5bGVGYWNh
ZGVJbXA6OmNyZWF0ZSk7Ci0gICAgaW5pdGlhbGl6ZVdlYktpdFF0KCk7Ci0KLSAgICAvLyBRV2Vi
U2V0dGluZ3M6OlNlYXJjaENhbmNlbEJ1dHRvbkdyYXBoaWMKLSAgICBzZXRJbWFnZVBsYXRmb3Jt
UmVzb3VyY2UoInNlYXJjaENhbmNlbEJ1dHRvbiIsIFFBcHBsaWNhdGlvbjo6c3R5bGUoKS0+c3Rh
bmRhcmRQaXhtYXAoUVN0eWxlOjpTUF9EaWFsb2dDbG9zZUJ1dHRvbikpOwotICAgIC8vIFFXZWJT
ZXR0aW5nczo6U2VhcmNoQ2FuY2VsQnV0dG9uUHJlc3NlZEdyYXBoaWMKLSAgICBzZXRJbWFnZVBs
YXRmb3JtUmVzb3VyY2UoInNlYXJjaENhbmNlbEJ1dHRvblByZXNzZWQiLCBRQXBwbGljYXRpb246
OnN0eWxlKCktPnN0YW5kYXJkUGl4bWFwKFFTdHlsZTo6U1BfRGlhbG9nQ2xvc2VCdXR0b24pKTsK
LQotICAgIGluaXRpYWxpemVkID0gdHJ1ZTsKLX0KLQotfQpkaWZmIC0tZ2l0IGEvU291cmNlL1dl
YktpdC9xdC9XZWJDb3JlU3VwcG9ydC9Jbml0V2ViS2l0UXQuaCBiL1NvdXJjZS9XZWJLaXQvcXQv
V2ViQ29yZVN1cHBvcnQvSW5pdFdlYktpdFF0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IGZiYjJkMThmNzNkNzcxZjA4NzE4YzZjYmViMTRiOTk1NzllZDU4YTEuLjAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYktpdC9xdC9XZWJD
b3JlU3VwcG9ydC9Jbml0V2ViS2l0UXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAK
LS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgRGlnaWEgUGxjIGFuZC9vciBpdHMgc3Vic2lkaWFy
eSgtaWVzKS4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy
ZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRo
ZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkg
dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIgb2YgdGhl
IExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICog
VGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1
c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1w
bGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMg
TGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZl
ZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFs
b25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3Qs
IHdyaXRlIHRvCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFu
a2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAotICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0Eu
Ci0gKgotICovCi0KLSNpZm5kZWYgSW5pdFdlYktpdFF0X2gKLSNkZWZpbmUgSW5pdFdlYktpdFF0
X2gKLQotbmFtZXNwYWNlIFdlYktpdCB7Ci0KLVFfREVDTF9FWFBPUlQgdm9pZCBpbml0aWFsaXpl
V2ViS2l0V2lkZ2V0cygpOwotCi19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQv
cXQvV2ViQ29yZVN1cHBvcnQvSW5zcGVjdG9yQ2xpZW50V2ViUGFnZS5jcHAgYi9Tb3VyY2UvV2Vi
S2l0L3F0L1dlYkNvcmVTdXBwb3J0L0luc3BlY3RvckNsaWVudFdlYlBhZ2UuY3BwCmRlbGV0ZWQg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzQ3MzBiMzI5NTg1ODc4YzA1MmU0YWZiMTk4NWJhMDRi
ZTM3NDNkLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1Nv
dXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvSW5zcGVjdG9yQ2xpZW50V2ViUGFnZS5jcHAK
KysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA3
IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDgg
Tm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCi0gKiBDb3B5cmln
aHQgKEMpIDIwMDggSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIKLSAqIENvcHlyaWdodCAoQykg
MjAxMiBEaWdpYSBQbGMgYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCi0gKgotICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgotICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCi0gKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFw
cGxlIikgbm9yIHRoZSBuYW1lcyBvZgotICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVz
ZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgICBmcm9tIHRo
aXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0g
KgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJV
VE9SUyAiQVMgSVMiIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBB
UkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
Ci0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZp
Zy5oIgotI2luY2x1ZGUgIkluc3BlY3RvckNsaWVudFdlYlBhZ2UuaCIKLQotI2luY2x1ZGUgPHF3
ZWJmcmFtZS5oPgotCi11c2luZyBuYW1lc3BhY2UgV2ViS2l0OwotCi1JbnNwZWN0b3JDbGllbnRX
ZWJQYWdlOjpJbnNwZWN0b3JDbGllbnRXZWJQYWdlKCkKLXsKLSAgICBRV2ViVmlldyogdmlldyA9
IG5ldyBRV2ViVmlldzsKLSAgICB2aWV3LT5zZXRQYWdlKHRoaXMpOwotICAgIHNldFBhcmVudCh2
aWV3KTsKLSAgICBjb25uZWN0KG1haW5GcmFtZSgpLCBTSUdOQUwoamF2YVNjcmlwdFdpbmRvd09i
amVjdENsZWFyZWQoKSksIFNMT1QoamF2YVNjcmlwdFdpbmRvd09iamVjdENsZWFyZWQoKSkpOwot
fQotCi1RV2ViUGFnZSogSW5zcGVjdG9yQ2xpZW50V2ViUGFnZTo6Y3JlYXRlV2luZG93KFFXZWJQ
YWdlOjpXZWJXaW5kb3dUeXBlKQotewotICAgIFFXZWJWaWV3KiB2aWV3ID0gbmV3IFFXZWJWaWV3
OwotICAgIFFXZWJQYWdlKiBwYWdlID0gbmV3IFFXZWJQYWdlOwotICAgIHZpZXctPnNldFBhZ2Uo
cGFnZSk7Ci0gICAgdmlldy0+c2V0QXR0cmlidXRlKFF0OjpXQV9EZWxldGVPbkNsb3NlKTsKLSAg
ICByZXR1cm4gcGFnZTsKLX0KLQotdm9pZCBJbnNwZWN0b3JDbGllbnRXZWJQYWdlOjpqYXZhU2Ny
aXB0V2luZG93T2JqZWN0Q2xlYXJlZCgpCi17Ci0gICAgUVZhcmlhbnQgaW5zcGVjdG9ySmF2YVNj
cmlwdFdpbmRvd09iamVjdHMgPSBwcm9wZXJ0eSgiX3FfaW5zcGVjdG9ySmF2YVNjcmlwdFdpbmRv
d09iamVjdHMiKTsKLSAgICBpZiAoIWluc3BlY3RvckphdmFTY3JpcHRXaW5kb3dPYmplY3RzLmlz
VmFsaWQoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIFFNYXA8UVN0cmluZywgUVZhcmlhbnQ+IGph
dmFTY3JpcHROYW1lT2JqZWN0TWFwID0gaW5zcGVjdG9ySmF2YVNjcmlwdFdpbmRvd09iamVjdHMu
dG9NYXAoKTsKLSAgICBRV2ViRnJhbWUqIGZyYW1lID0gbWFpbkZyYW1lKCk7Ci0gICAgUU1hcDxR
U3RyaW5nLCBRVmFyaWFudD46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gamF2YVNjcmlwdE5hbWVPYmpl
Y3RNYXAuY29uc3RCZWdpbigpOwotICAgIGZvciAoIDsgaXQgIT0gamF2YVNjcmlwdE5hbWVPYmpl
Y3RNYXAuY29uc3RFbmQoKTsgKytpdCkgewotICAgICAgICBRU3RyaW5nIG5hbWUgPSBpdC5rZXko
KTsKLSAgICAgICAgUVZhcmlhbnQgdmFsdWUgPSBpdC52YWx1ZSgpOwotICAgICAgICBRT2JqZWN0
KiBvYmogPSB2YWx1ZS52YWx1ZTxRT2JqZWN0Kj4oKTsKLSAgICAgICAgZnJhbWUtPmFkZFRvSmF2
YVNjcmlwdFdpbmRvd09iamVjdChuYW1lLCBvYmopOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9JbnNwZWN0b3JDbGllbnRXZWJQYWdlLmgg
Yi9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L0luc3BlY3RvckNsaWVudFdlYlBhZ2Uu
aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg3ZjI5YjBjZjUyMTlkZmFhMDRmYjNl
OGZjNTc4ZmRkYWVhMDhhYy4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MAotLS0gYS9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L0luc3BlY3RvckNsaWVudFdl
YlBhZ2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQg
KEMpIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodCAo
QykgMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykKLSAq
IENvcHlyaWdodCAoQykgMjAwOCBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlcgotICogQ29weXJp
Z2h0IChDKSAyMDEyIERpZ2lhIFBsYyBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykKLSAqCi0g
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiAgUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
LSAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCi0gKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KLSAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJ
bmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCi0gKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBt
YXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAg
IGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlz
c2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMg
Q09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQotICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ
VVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRT
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAq
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRI
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgotICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotI2lmbmRlZiBJ
bnNwZWN0b3JDbGllbnRXZWJQYWdlX2gKLSNkZWZpbmUgSW5zcGVjdG9yQ2xpZW50V2ViUGFnZV9o
Ci0KLSNpbmNsdWRlIDxxd2VicGFnZS5oPgotI2luY2x1ZGUgPHF3ZWJ2aWV3Lmg+Ci0KLW5hbWVz
cGFjZSBXZWJLaXQgewotCi1jbGFzcyBJbnNwZWN0b3JDbGllbnRXZWJQYWdlIDogcHVibGljIFFX
ZWJQYWdlIHsKLSAgICBRX09CSkVDVAotICAgIGZyaWVuZCBjbGFzcyBJbnNwZWN0b3JDbGllbnRR
dDsKLXB1YmxpYzoKLSAgICBJbnNwZWN0b3JDbGllbnRXZWJQYWdlKCk7Ci0KLSAgICBRV2ViUGFn
ZSogY3JlYXRlV2luZG93KFFXZWJQYWdlOjpXZWJXaW5kb3dUeXBlKTsKLQotcHVibGljIFFfU0xP
VFM6Ci0gICAgdm9pZCBqYXZhU2NyaXB0V2luZG93T2JqZWN0Q2xlYXJlZCgpOwotfTsKLQotfSAv
LyBuYW1lc3BhY2UgV2ViS2l0Ci0KLSNlbmRpZiAvLyBJbnNwZWN0b3JDbGllbnRXZWJQYWdlX2gK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvSW5zcGVjdG9yU2Vy
dmVyUXQuY3BwIGIvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9JbnNwZWN0b3JTZXJ2
ZXJRdC5jcHAKaW5kZXggYWJmOWMzZjc4NzAyZjJlMTM1ZGFhYTY3MzE1M2NkNDk5YTU1ZmEyMS4u
MTVhM2RhZjM5NjVlZWVmZTIzZmVhMzllODFjNmZhMzQ3N2FjODQ3MSAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9JbnNwZWN0b3JTZXJ2ZXJRdC5jcHAKKysrIGIv
U291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9JbnNwZWN0b3JTZXJ2ZXJRdC5jcHAKQEAg
LTM2MywzICszNjMsNSBAQCB2b2lkIEluc3BlY3RvclNlcnZlclJlcXVlc3RIYW5kbGVyUXQ6Ondl
YlNvY2tldFJlYWR5UmVhZCgpCiB9CiAKIH0KKworI2luY2x1ZGUgIm1vY19JbnNwZWN0b3JTZXJ2
ZXJRdC5jcHAiCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L1Bh
Z2VDbGllbnRRdC5jcHAgYi9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L1BhZ2VDbGll
bnRRdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYjA5MGFmMmEzODcwMzA3
N2ZjYTU0MGZhMDI5ZWQxYWRlZThiYTkuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9QYWdlQ2xpZW50
UXQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDM5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQg
KEMpIDIwMTAgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCi0g
KgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRl
IGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJh
cnkgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBv
ciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgbGlicmFy
eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICog
YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu
dHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9y
IG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9m
IHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRo
aXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwot
ICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0
LCBGaWZ0aCBGbG9vciwKLSAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgotICoKLSAqLwot
Ci0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiUGFnZUNsaWVudFF0LmgiCi0KLSNpbmNs
dWRlIDxRR3JhcGhpY3NTY2VuZT4KLSNpbmNsdWRlIDxRR3JhcGhpY3NWaWV3PgotCi0jaWYgZGVm
aW5lZChRX1dTX1gxMSkKLSNpbmNsdWRlIDxRWDExSW5mbz4KLSNlbmRpZgotCi0jaWZkZWYgUVRf
T1BFTkdMX0xJQgotI2luY2x1ZGUgPFFHTFdpZGdldD4KLSNlbmRpZgotCi0jaWYgVVNFKDNEX0dS
QVBISUNTKQotI2luY2x1ZGUgPFFXaW5kb3c+Ci0KLXN0YXRpYyB2b2lkIGNyZWF0ZVBsYXRmb3Jt
R3JhcGhpY3NDb250ZXh0M0RGcm9tV2lkZ2V0KFFXaWRnZXQqIHdpZGdldCwgUGxhdGZvcm1HcmFw
aGljc0NvbnRleHQzRCogY29udGV4dCwgUGxhdGZvcm1HcmFwaGljc1N1cmZhY2UzRCogc3VyZmFj
ZSwgUU9iamVjdCoqIHN1cmZhY2VPd25lcikKLXsKLSNpZmRlZiBRVF9PUEVOR0xfTElCCi0gICAg
KmNvbnRleHQgPSAwOwotICAgICpzdXJmYWNlID0gMDsKLSAgICBpZiAoc3VyZmFjZU93bmVyKQot
ICAgICAgICAqc3VyZmFjZU93bmVyID0gMDsKLSAgICBRQWJzdHJhY3RTY3JvbGxBcmVhKiBzY3Jv
bGxBcmVhID0gcW9iamVjdF9jYXN0PFFBYnN0cmFjdFNjcm9sbEFyZWEqPih3aWRnZXQpOwotICAg
IGlmICghc2Nyb2xsQXJlYSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgUUdMV2lkZ2V0KiBnbFZp
ZXdwb3J0ID0gcW9iamVjdF9jYXN0PFFHTFdpZGdldCo+KHNjcm9sbEFyZWEtPnZpZXdwb3J0KCkp
OwotICAgIGlmICghZ2xWaWV3cG9ydCkKLSAgICAgICAgcmV0dXJuOwotICAgIFFHTFdpZGdldCog
Z2xXaWRnZXQgPSBuZXcgUUdMV2lkZ2V0KDAsIGdsVmlld3BvcnQpOwotICAgIGlmIChnbFdpZGdl
dC0+aXNWYWxpZCgpKSB7Ci0gICAgICAgIC8vIEdlb21ldHJ5IGNhbiBiZSBzZXQgdG8gemVybyBi
ZWNhdXNlIG1fZ2xXaWRnZXQgaXMgdXNlZCBvbmx5IGZvciBpdHMgUUdMQ29udGV4dC4KLSAgICAg
ICAgZ2xXaWRnZXQtPnNldEdlb21ldHJ5KDAsIDAsIDAsIDApOwotICAgICAgICBpZiAoc3VyZmFj
ZU93bmVyKQotICAgICAgICAgICAgKnN1cmZhY2VPd25lciA9IGdsV2lkZ2V0OwotICAgICAgICAq
c3VyZmFjZSA9IGdsV2lkZ2V0LT53aW5kb3dIYW5kbGUoKTsKLSAgICAgICAgKmNvbnRleHQgPSBn
bFdpZGdldC0+Y29udGV4dCgpLT5jb250ZXh0SGFuZGxlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAg
ICAgZGVsZXRlIGdsV2lkZ2V0OwotICAgICAgICBnbFdpZGdldCA9IDA7Ci0gICAgfQotI2VuZGlm
Ci19Ci0jZW5kaWYKLQotI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKLSNpbmNsdWRl
ICJUZXh0dXJlTWFwcGVyLmgiCi0jaW5jbHVkZSAidGV4bWFwL1RleHR1cmVNYXBwZXJMYXllci5o
IgotI2VuZGlmCi0KLVFXaW5kb3cqIFFXZWJQYWdlQ2xpZW50Ojpvd25lcldpbmRvdygpIGNvbnN0
Ci17Ci0gICAgUVdpZGdldCogd2lkZ2V0ID0gcW9iamVjdF9jYXN0PFFXaWRnZXQqPihvd25lcldp
ZGdldCgpKTsKLSAgICBpZiAoIXdpZGdldCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgaWYgKFFX
aW5kb3cgKndpbmRvdyA9IHdpZGdldC0+d2luZG93SGFuZGxlKCkpCi0gICAgICAgIHJldHVybiB3
aW5kb3c7Ci0gICAgaWYgKGNvbnN0IFFXaWRnZXQgKm5hdGl2ZVBhcmVudCA9IHdpZGdldC0+bmF0
aXZlUGFyZW50V2lkZ2V0KCkpCi0gICAgICAgIHJldHVybiBuYXRpdmVQYXJlbnQtPndpbmRvd0hh
bmRsZSgpOwotICAgIHJldHVybiAwOwotfQotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0KLSNpZiBV
U0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCi1UZXh0dXJlTWFwcGVyTGF5ZXJDbGllbnRRdDo6
VGV4dHVyZU1hcHBlckxheWVyQ2xpZW50UXQoUVdlYkZyYW1lKiBmcmFtZSwgR3JhcGhpY3NMYXll
ciogbGF5ZXIpCi0gICAgOiBtX2ZyYW1lKGZyYW1lKQotICAgICwgbV9yb290R3JhcGhpY3NMYXll
cihHcmFwaGljc0xheWVyOjpjcmVhdGUoMCkpCi17Ci0gICAgbV9mcmFtZS0+ZC0+cm9vdFRleHR1
cmVNYXBwZXJMYXllciA9IHJvb3RMYXllcigpOwotICAgIG1fcm9vdEdyYXBoaWNzTGF5ZXItPmFk
ZENoaWxkKGxheWVyKTsKLSAgICBtX3Jvb3RHcmFwaGljc0xheWVyLT5zZXREcmF3c0NvbnRlbnQo
ZmFsc2UpOwotICAgIG1fcm9vdEdyYXBoaWNzTGF5ZXItPnNldE1hc2tzVG9Cb3VuZHMoZmFsc2Up
OwotICAgIG1fcm9vdEdyYXBoaWNzTGF5ZXItPnNldFNpemUoSW50U2l6ZSgxLCAxKSk7Ci19Ci0K
LXZvaWQgVGV4dHVyZU1hcHBlckxheWVyQ2xpZW50UXQ6OnNldFRleHR1cmVNYXBwZXIoY29uc3Qg
UGFzc093blB0cjxUZXh0dXJlTWFwcGVyPiYgdGV4dHVyZU1hcHBlcikKLXsKLSAgICBtX2ZyYW1l
LT5kLT50ZXh0dXJlTWFwcGVyID0gdGV4dHVyZU1hcHBlcjsKLSAgICBtX2ZyYW1lLT5kLT5yb290
VGV4dHVyZU1hcHBlckxheWVyLT5zZXRUZXh0dXJlTWFwcGVyKG1fZnJhbWUtPmQtPnRleHR1cmVN
YXBwZXIuZ2V0KCkpOwotICAgIHN5bmNSb290TGF5ZXIoKTsKLX0KLQotVGV4dHVyZU1hcHBlckxh
eWVyQ2xpZW50UXQ6On5UZXh0dXJlTWFwcGVyTGF5ZXJDbGllbnRRdCgpCi17Ci0gICAgbV9mcmFt
ZS0+ZC0+cm9vdFRleHR1cmVNYXBwZXJMYXllciA9IDA7Ci19Ci0KLXZvaWQgVGV4dHVyZU1hcHBl
ckxheWVyQ2xpZW50UXQ6OnN5bmNSb290TGF5ZXIoKQotewotICAgIG1fcm9vdEdyYXBoaWNzTGF5
ZXItPmZsdXNoQ29tcG9zaXRpbmdTdGF0ZUZvclRoaXNMYXllck9ubHkoKTsKLX0KLQotVGV4dHVy
ZU1hcHBlckxheWVyKiBUZXh0dXJlTWFwcGVyTGF5ZXJDbGllbnRRdDo6cm9vdExheWVyKCkKLXsK
LSAgICByZXR1cm4gdG9UZXh0dXJlTWFwcGVyTGF5ZXIobV9yb290R3JhcGhpY3NMYXllci5nZXQo
KSk7Ci19Ci0KLQotdm9pZCBQYWdlQ2xpZW50UVdpZGdldDo6c2V0Um9vdEdyYXBoaWNzTGF5ZXIo
R3JhcGhpY3NMYXllciogbGF5ZXIpCi17Ci0gICAgaWYgKGxheWVyKSB7Ci0gICAgICAgIFRleHR1
cmVNYXBwZXJMYXllckNsaWVudCA9IGFkb3B0UHRyKG5ldyBUZXh0dXJlTWFwcGVyTGF5ZXJDbGll
bnRRdChwYWdlLT5tYWluRnJhbWUoKSwgbGF5ZXIpKTsKLSAgICAgICAgVGV4dHVyZU1hcHBlckxh
eWVyQ2xpZW50LT5zZXRUZXh0dXJlTWFwcGVyKFRleHR1cmVNYXBwZXI6OmNyZWF0ZSgpKTsKLSAg
ICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBUZXh0dXJlTWFwcGVyTGF5ZXJDbGllbnQuY2xlYXIo
KTsKLX0KLQotdm9pZCBQYWdlQ2xpZW50UVdpZGdldDo6bWFya0ZvclN5bmMoYm9vbCBzY2hlZHVs
ZVN5bmMpCi17Ci0gICAgaWYgKHN5bmNUaW1lci5pc0FjdGl2ZSgpKQotICAgICAgICByZXR1cm47
Ci0gICAgc3luY1RpbWVyLnN0YXJ0T25lU2hvdCgwKTsKLX0KLQotdm9pZCBQYWdlQ2xpZW50UVdp
ZGdldDo6c3luY0xheWVycyhUaW1lcjxQYWdlQ2xpZW50UVdpZGdldD4qKQotewotICAgIGlmIChU
ZXh0dXJlTWFwcGVyTGF5ZXJDbGllbnQpCi0gICAgICAgIFRleHR1cmVNYXBwZXJMYXllckNsaWVu
dC0+c3luY1Jvb3RMYXllcigpOwotICAgIFFXZWJGcmFtZVByaXZhdGU6OmNvcmUocGFnZS0+bWFp
bkZyYW1lKCkpLT52aWV3KCktPmZsdXNoQ29tcG9zaXRpbmdTdGF0ZUluY2x1ZGluZ1N1YmZyYW1l
cygpOwotICAgIGlmICghVGV4dHVyZU1hcHBlckxheWVyQ2xpZW50KQotICAgICAgICByZXR1cm47
Ci0gICAgaWYgKFRleHR1cmVNYXBwZXJMYXllckNsaWVudC0+cm9vdExheWVyKCktPmRlc2NlbmRh
bnRzT3JTZWxmSGF2ZVJ1bm5pbmdBbmltYXRpb25zKCkgJiYgIXN5bmNUaW1lci5pc0FjdGl2ZSgp
KQotICAgICAgICBzeW5jVGltZXIuc3RhcnRPbmVTaG90KDEuMCAvIDYwLjApOwotICAgIHVwZGF0
ZSh2aWV3LT5yZWN0KCkpOwotfQotI2VuZGlmCi0KLXZvaWQgUGFnZUNsaWVudFFXaWRnZXQ6OnNj
cm9sbChpbnQgZHgsIGludCBkeSwgY29uc3QgUVJlY3QmIHJlY3RUb1Njcm9sbCkKLXsKLSAgICB2
aWV3LT5zY3JvbGwocXJlYWwoZHgpLCBxcmVhbChkeSksIHJlY3RUb1Njcm9sbCk7Ci19Ci0KLXZv
aWQgUGFnZUNsaWVudFFXaWRnZXQ6OnVwZGF0ZShjb25zdCBRUmVjdCAmIGRpcnR5UmVjdCkKLXsK
LSAgICB2aWV3LT51cGRhdGUoZGlydHlSZWN0KTsKLX0KLQotdm9pZCBQYWdlQ2xpZW50UVdpZGdl
dDo6c2V0SW5wdXRNZXRob2RFbmFibGVkKGJvb2wgZW5hYmxlKQotewotICAgIHZpZXctPnNldEF0
dHJpYnV0ZShRdDo6V0FfSW5wdXRNZXRob2RFbmFibGVkLCBlbmFibGUpOwotfQotCi1ib29sIFBh
Z2VDbGllbnRRV2lkZ2V0OjppbnB1dE1ldGhvZEVuYWJsZWQoKSBjb25zdAotewotICAgIHJldHVy
biB2aWV3LT50ZXN0QXR0cmlidXRlKFF0OjpXQV9JbnB1dE1ldGhvZEVuYWJsZWQpOwotfQotCi12
b2lkIFBhZ2VDbGllbnRRV2lkZ2V0OjpzZXRJbnB1dE1ldGhvZEhpbnRzKFF0OjpJbnB1dE1ldGhv
ZEhpbnRzIGhpbnRzKQotewotICAgIHZpZXctPnNldElucHV0TWV0aG9kSGludHMoaGludHMpOwot
fQotCi1QYWdlQ2xpZW50UVdpZGdldDo6flBhZ2VDbGllbnRRV2lkZ2V0KCkKLXsKLX0KLQotI2lm
bmRlZiBRVF9OT19DVVJTT1IKLVFDdXJzb3IgUGFnZUNsaWVudFFXaWRnZXQ6OmN1cnNvcigpIGNv
bnN0Ci17Ci0gICAgcmV0dXJuIHZpZXctPmN1cnNvcigpOwotfQotCi12b2lkIFBhZ2VDbGllbnRR
V2lkZ2V0Ojp1cGRhdGVDdXJzb3IoY29uc3QgUUN1cnNvciYgY3Vyc29yKQotewotICAgIHZpZXct
PnNldEN1cnNvcihjdXJzb3IpOwotfQotI2VuZGlmCi0KLVFQYWxldHRlIFBhZ2VDbGllbnRRV2lk
Z2V0OjpwYWxldHRlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gdmlldy0+cGFsZXR0ZSgpOwotfQot
Ci1pbnQgUGFnZUNsaWVudFFXaWRnZXQ6OnNjcmVlbk51bWJlcigpIGNvbnN0Ci17Ci0jaWYgZGVm
aW5lZChRX1dTX1gxMSkKLSAgICByZXR1cm4gdmlldy0+eDExSW5mbygpLnNjcmVlbigpOwotI2Vu
ZGlmCi0gICAgcmV0dXJuIDA7Ci19Ci0KLVFPYmplY3QqIFBhZ2VDbGllbnRRV2lkZ2V0Ojpvd25l
cldpZGdldCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHZpZXc7Ci19Ci0KLVFSZWN0IFBhZ2VDbGll
bnRRV2lkZ2V0OjpnZW9tZXRyeVJlbGF0aXZlVG9Pd25lcldpZGdldCgpIGNvbnN0Ci17Ci0gICAg
cmV0dXJuIHZpZXctPmdlb21ldHJ5KCk7Ci19Ci0KLVFPYmplY3QqIFBhZ2VDbGllbnRRV2lkZ2V0
OjpwbHVnaW5QYXJlbnQoKSBjb25zdAotewotICAgIHJldHVybiB2aWV3OwotfQotCi1RU3R5bGUq
IFBhZ2VDbGllbnRRV2lkZ2V0OjpzdHlsZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHZpZXctPnN0
eWxlKCk7Ci19Ci0KLVFSZWN0RiBQYWdlQ2xpZW50UVdpZGdldDo6d2luZG93UmVjdCgpIGNvbnN0
Ci17Ci0gICAgcmV0dXJuIFFSZWN0Rih2aWV3LT53aW5kb3coKS0+Z2VvbWV0cnkoKSk7Ci19Ci0K
LXZvaWQgUGFnZUNsaWVudFFXaWRnZXQ6OnNldFdpZGdldFZpc2libGUoV2lkZ2V0KiB3aWRnZXQs
IGJvb2wgdmlzaWJsZSkKLXsKLSAgICBRV2lkZ2V0KiBxdFdpZGdldCA9IHFvYmplY3RfY2FzdDxR
V2lkZ2V0Kj4od2lkZ2V0LT5wbGF0Zm9ybVdpZGdldCgpKTsKLSAgICBpZiAoIXF0V2lkZ2V0KQot
ICAgICAgICByZXR1cm47Ci0gICAgcXRXaWRnZXQtPnNldFZpc2libGUodmlzaWJsZSk7Ci19Ci0K
LSNpZiBVU0UoM0RfR1JBUEhJQ1MpCi12b2lkIFBhZ2VDbGllbnRRV2lkZ2V0OjpjcmVhdGVQbGF0
Zm9ybUdyYXBoaWNzQ29udGV4dDNEKFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0M0QqIGNvbnRleHQs
IFBsYXRmb3JtR3JhcGhpY3NTdXJmYWNlM0QqIHN1cmZhY2UsIFFPYmplY3QqKiBzdXJmYWNlT3du
ZXIpCi17Ci0gICAgY3JlYXRlUGxhdGZvcm1HcmFwaGljc0NvbnRleHQzREZyb21XaWRnZXQodmll
dywgY29udGV4dCwgc3VyZmFjZSwgc3VyZmFjZU93bmVyKTsKLX0KLSNlbmRpZgotCi0jaWYgIWRl
ZmluZWQoUVRfTk9fR1JBUEhJQ1NWSUVXKQotUGFnZUNsaWVudFFHcmFwaGljc1dpZGdldDo6flBh
Z2VDbGllbnRRR3JhcGhpY3NXaWRnZXQoKQotewotICAgIGRlbGV0ZSBvdmVybGF5OwotfQotCi12
b2lkIFBhZ2VDbGllbnRRR3JhcGhpY3NXaWRnZXQ6OnNjcm9sbChpbnQgZHgsIGludCBkeSwgY29u
c3QgUVJlY3QmIHJlY3RUb1Njcm9sbCkKLXsKLSAgICB2aWV3LT5zY3JvbGwocXJlYWwoZHgpLCBx
cmVhbChkeSksIHJlY3RUb1Njcm9sbCk7Ci19Ci0KLXZvaWQgUGFnZUNsaWVudFFHcmFwaGljc1dp
ZGdldDo6dXBkYXRlKGNvbnN0IFFSZWN0JiBkaXJ0eVJlY3QpCi17Ci0gICAgdmlldy0+dXBkYXRl
KGRpcnR5UmVjdCk7Ci0KLSAgICBpZiAob3ZlcmxheSkKLSAgICAgICAgb3ZlcmxheS0+dXBkYXRl
KFFSZWN0RihkaXJ0eVJlY3QpKTsKLX0KLQotI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElO
RykKLXZvaWQgUGFnZUNsaWVudFFHcmFwaGljc1dpZGdldDo6c3luY0xheWVycygpCi17Ci0gICAg
aWYgKFRleHR1cmVNYXBwZXJMYXllckNsaWVudCkKLSAgICAgICAgVGV4dHVyZU1hcHBlckxheWVy
Q2xpZW50LT5zeW5jUm9vdExheWVyKCk7Ci0KLSAgICBRV2ViRnJhbWVQcml2YXRlOjpjb3JlKHBh
Z2UtPm1haW5GcmFtZSgpKS0+dmlldygpLT5mbHVzaENvbXBvc2l0aW5nU3RhdGVJbmNsdWRpbmdT
dWJmcmFtZXMoKTsKLQotICAgIGlmICghVGV4dHVyZU1hcHBlckxheWVyQ2xpZW50KQotICAgICAg
ICByZXR1cm47Ci0KLSAgICBpZiAoVGV4dHVyZU1hcHBlckxheWVyQ2xpZW50LT5yb290TGF5ZXIo
KS0+ZGVzY2VuZGFudHNPclNlbGZIYXZlUnVubmluZ0FuaW1hdGlvbnMoKSAmJiAhc3luY1RpbWVy
LmlzQWN0aXZlKCkpCi0gICAgICAgIHN5bmNUaW1lci5zdGFydE9uZVNob3QoMS4wIC8gNjAuMCk7
Ci0gICAgdXBkYXRlKHZpZXctPmJvdW5kaW5nUmVjdCgpLnRvQWxpZ25lZFJlY3QoKSk7Ci19Ci0K
LXZvaWQgUGFnZUNsaWVudFFHcmFwaGljc1dpZGdldDo6c2V0Um9vdEdyYXBoaWNzTGF5ZXIoR3Jh
cGhpY3NMYXllciogbGF5ZXIpCi17Ci0gICAgaWYgKGxheWVyKSB7Ci0gICAgICAgIFRleHR1cmVN
YXBwZXJMYXllckNsaWVudCA9IGFkb3B0UHRyKG5ldyBUZXh0dXJlTWFwcGVyTGF5ZXJDbGllbnRR
dChwYWdlLT5tYWluRnJhbWUoKSwgbGF5ZXIpKTsKLSNpZiBVU0UoVEVYVFVSRV9NQVBQRVJfR0wp
ICYmIGRlZmluZWQoUVRfT1BFTkdMX0xJQikKLSAgICAgICAgUUdyYXBoaWNzVmlldyogZ3JhcGhp
Y3NWaWV3ID0gdmlldy0+c2NlbmUoKS0+dmlld3MoKVswXTsKLSAgICAgICAgaWYgKGdyYXBoaWNz
VmlldyAmJiBncmFwaGljc1ZpZXctPnZpZXdwb3J0KCkpIHsKLSAgICAgICAgICAgIFFHTFdpZGdl
dCogZ2xXaWRnZXQgPSBxb2JqZWN0X2Nhc3Q8UUdMV2lkZ2V0Kj4oZ3JhcGhpY3NWaWV3LT52aWV3
cG9ydCgpKTsKLSAgICAgICAgICAgIGlmIChnbFdpZGdldCkgewotICAgICAgICAgICAgICAgIC8v
IFRoZSBHTCBjb250ZXh0IGJlbG9uZ2luZyB0byB0aGUgUUdMV2lkZ2V0IHZpZXdwb3J0IG11c3Qg
YmUgY3VycmVudCB3aGVuIFRleHR1cmVNYXBwZXIgaXMgYmVpbmcgY3JlYXRlZC4KLSAgICAgICAg
ICAgICAgICBnbFdpZGdldC0+bWFrZUN1cnJlbnQoKTsKLSAgICAgICAgICAgICAgICBUZXh0dXJl
TWFwcGVyTGF5ZXJDbGllbnQtPnNldFRleHR1cmVNYXBwZXIoVGV4dHVyZU1hcHBlcjo6Y3JlYXRl
KFRleHR1cmVNYXBwZXI6Ok9wZW5HTE1vZGUpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgIH0KLSNlbmRpZgotICAgICAgICBUZXh0dXJlTWFwcGVyTGF5
ZXJDbGllbnQtPnNldFRleHR1cmVNYXBwZXIoVGV4dHVyZU1hcHBlcjo6Y3JlYXRlKCkpOwotICAg
ICAgICByZXR1cm47Ci0gICAgfQotICAgIFRleHR1cmVNYXBwZXJMYXllckNsaWVudC5jbGVhcigp
OwotfQotCi12b2lkIFBhZ2VDbGllbnRRR3JhcGhpY3NXaWRnZXQ6Om1hcmtGb3JTeW5jKGJvb2wg
c2NoZWR1bGVTeW5jKQotewotICAgIGlmIChzeW5jVGltZXIuaXNBY3RpdmUoKSkKLSAgICAgICAg
cmV0dXJuOwotICAgIHN5bmNUaW1lci5zdGFydE9uZVNob3QoMCk7Ci19Ci0KLSNlbmRpZgotCi0j
aWYgVVNFKFRJTEVEX0JBQ0tJTkdfU1RPUkUpCi12b2lkIFBhZ2VDbGllbnRRR3JhcGhpY3NXaWRn
ZXQ6OnVwZGF0ZVRpbGVkQmFja2luZ1N0b3JlU2NhbGUoKQotewotICAgIFdlYkNvcmU6OlRpbGVk
QmFja2luZ1N0b3JlKiBiYWNraW5nU3RvcmUgPSBRV2ViRnJhbWVQcml2YXRlOjpjb3JlKHBhZ2Ut
Pm1haW5GcmFtZSgpKS0+dGlsZWRCYWNraW5nU3RvcmUoKTsKLSAgICBpZiAoIWJhY2tpbmdTdG9y
ZSkKLSAgICAgICAgcmV0dXJuOwotICAgIGJhY2tpbmdTdG9yZS0+c2V0Q29udGVudHNTY2FsZSh2
aWV3LT5zY2FsZSgpKTsKLX0KLSNlbmRpZgotCi12b2lkIFBhZ2VDbGllbnRRR3JhcGhpY3NXaWRn
ZXQ6OnNldElucHV0TWV0aG9kRW5hYmxlZChib29sIGVuYWJsZSkKLXsKLSAgICB2aWV3LT5zZXRG
bGFnKFFHcmFwaGljc0l0ZW06Okl0ZW1BY2NlcHRzSW5wdXRNZXRob2QsIGVuYWJsZSk7Ci19Ci0K
LWJvb2wgUGFnZUNsaWVudFFHcmFwaGljc1dpZGdldDo6aW5wdXRNZXRob2RFbmFibGVkKCkgY29u
c3QKLXsKLSAgICByZXR1cm4gdmlldy0+ZmxhZ3MoKSAmIFFHcmFwaGljc0l0ZW06Okl0ZW1BY2Nl
cHRzSW5wdXRNZXRob2Q7Ci19Ci0KLXZvaWQgUGFnZUNsaWVudFFHcmFwaGljc1dpZGdldDo6c2V0
SW5wdXRNZXRob2RIaW50cyhRdDo6SW5wdXRNZXRob2RIaW50cyBoaW50cykKLXsKLSAgICB2aWV3
LT5zZXRJbnB1dE1ldGhvZEhpbnRzKGhpbnRzKTsKLX0KLQotI2lmbmRlZiBRVF9OT19DVVJTT1IK
LVFDdXJzb3IgUGFnZUNsaWVudFFHcmFwaGljc1dpZGdldDo6Y3Vyc29yKCkgY29uc3QKLXsKLSAg
ICByZXR1cm4gdmlldy0+Y3Vyc29yKCk7Ci19Ci0KLXZvaWQgUGFnZUNsaWVudFFHcmFwaGljc1dp
ZGdldDo6dXBkYXRlQ3Vyc29yKGNvbnN0IFFDdXJzb3ImIGN1cnNvcikKLXsKLSAgICB2aWV3LT5z
ZXRDdXJzb3IoY3Vyc29yKTsKLX0KLSNlbmRpZgotCi1RUGFsZXR0ZSBQYWdlQ2xpZW50UUdyYXBo
aWNzV2lkZ2V0OjpwYWxldHRlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gdmlldy0+cGFsZXR0ZSgp
OwotfQotCi1pbnQgUGFnZUNsaWVudFFHcmFwaGljc1dpZGdldDo6c2NyZWVuTnVtYmVyKCkgY29u
c3QKLXsKLSNpZiBkZWZpbmVkKFFfV1NfWDExKQotICAgIGlmIChRR3JhcGhpY3NTY2VuZSogc2Nl
bmUgPSB2aWV3LT5zY2VuZSgpKSB7Ci0gICAgICAgIGNvbnN0IFFMaXN0PFFHcmFwaGljc1ZpZXcq
PiB2aWV3cyA9IHNjZW5lLT52aWV3cygpOwotCi0gICAgICAgIGlmICghdmlld3MuaXNFbXB0eSgp
KQotICAgICAgICAgICAgcmV0dXJuIHZpZXdzLmF0KDApLT54MTFJbmZvKCkuc2NyZWVuKCk7Ci0g
ICAgfQotI2VuZGlmCi0KLSAgICByZXR1cm4gMDsKLX0KLQotUU9iamVjdCogUGFnZUNsaWVudFFH
cmFwaGljc1dpZGdldDo6b3duZXJXaWRnZXQoKSBjb25zdAotewotICAgIGlmIChRR3JhcGhpY3NT
Y2VuZSogc2NlbmUgPSB2aWV3LT5zY2VuZSgpKSB7Ci0gICAgICAgIGNvbnN0IFFMaXN0PFFHcmFw
aGljc1ZpZXcqPiB2aWV3cyA9IHNjZW5lLT52aWV3cygpOwotICAgICAgICByZXR1cm4gdmlld3Mu
dmFsdWUoMCk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1RUmVjdCBQYWdlQ2xpZW50UUdy
YXBoaWNzV2lkZ2V0OjpnZW9tZXRyeVJlbGF0aXZlVG9Pd25lcldpZGdldCgpIGNvbnN0Ci17Ci0g
ICAgaWYgKCF2aWV3LT5zY2VuZSgpKQotICAgICAgICByZXR1cm4gUVJlY3QoKTsKLQotICAgIFFM
aXN0PFFHcmFwaGljc1ZpZXcqPiB2aWV3cyA9IHZpZXctPnNjZW5lKCktPnZpZXdzKCk7Ci0gICAg
aWYgKHZpZXdzLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIFFSZWN0KCk7Ci0KLSAgICBRR3Jh
cGhpY3NWaWV3KiBncmFwaGljc1ZpZXcgPSB2aWV3cy5hdCgwKTsKLSAgICByZXR1cm4gZ3JhcGhp
Y3NWaWV3LT5tYXBGcm9tU2NlbmUodmlldy0+Ym91bmRpbmdSZWN0KCkpLmJvdW5kaW5nUmVjdCgp
OwotfQotCi0jaWYgVVNFKFRJTEVEX0JBQ0tJTkdfU1RPUkUpCi1RUmVjdEYgUGFnZUNsaWVudFFH
cmFwaGljc1dpZGdldDo6Z3JhcGhpY3NJdGVtVmlzaWJsZVJlY3QoKSBjb25zdAotewotICAgIGlm
ICghdmlldy0+c2NlbmUoKSkKLSAgICAgICAgcmV0dXJuIFFSZWN0RigpOwotCi0gICAgUUxpc3Q8
UUdyYXBoaWNzVmlldyo+IHZpZXdzID0gdmlldy0+c2NlbmUoKS0+dmlld3MoKTsKLSAgICBpZiAo
dmlld3MuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gUVJlY3RGKCk7Ci0KLSAgICBRR3JhcGhp
Y3NWaWV3KiBncmFwaGljc1ZpZXcgPSB2aWV3cy5hdCgwKTsKLSAgICBpbnQgeE9mZnNldCA9IGdy
YXBoaWNzVmlldy0+aG9yaXpvbnRhbFNjcm9sbEJhcigpLT52YWx1ZSgpOwotICAgIGludCB5T2Zm
c2V0ID0gZ3JhcGhpY3NWaWV3LT52ZXJ0aWNhbFNjcm9sbEJhcigpLT52YWx1ZSgpOwotICAgIHJl
dHVybiB2aWV3LT5tYXBSZWN0RnJvbVNjZW5lKFFSZWN0RihRUG9pbnRGKHhPZmZzZXQsIHlPZmZz
ZXQpLCBncmFwaGljc1ZpZXctPnZpZXdwb3J0KCktPnNpemUoKSkpOwotfQotI2VuZGlmCi0KLVFP
YmplY3QqIFBhZ2VDbGllbnRRR3JhcGhpY3NXaWRnZXQ6OnBsdWdpblBhcmVudCgpIGNvbnN0Ci17
Ci0gICAgcmV0dXJuIHZpZXc7Ci19Ci0KLVFTdHlsZSogUGFnZUNsaWVudFFHcmFwaGljc1dpZGdl
dDo6c3R5bGUoKSBjb25zdAotewotICAgIHJldHVybiB2aWV3LT5zdHlsZSgpOwotfQotCi12b2lk
IFBhZ2VDbGllbnRRR3JhcGhpY3NXaWRnZXQ6OnNldFdpZGdldFZpc2libGUoV2lkZ2V0KiwgYm9v
bCkKLXsKLSAgICAvLyBEb2Vzbid0IG1ha2Ugc2Vuc2UsIGRvZXMgaXQ/Ci19Ci0KLVFSZWN0RiBQ
YWdlQ2xpZW50UUdyYXBoaWNzV2lkZ2V0Ojp3aW5kb3dSZWN0KCkgY29uc3QKLXsKLSAgICBpZiAo
IXZpZXctPnNjZW5lKCkpCi0gICAgICAgIHJldHVybiBRUmVjdEYoKTsKLQotICAgIC8vIFRoZSBz
Y2VuZVJlY3QgaXMgYSBnb29kIGFwcHJveGltYXRpb24gb2YgdGhlIHNpemUgb2YgdGhlIGFwcGxp
Y2F0aW9uLCBpbmRlcGVuZGVudCBvZiB0aGUgdmlldy4KLSAgICByZXR1cm4gdmlldy0+c2NlbmUo
KS0+c2NlbmVSZWN0KCk7Ci19Ci0jZW5kaWYgLy8gUVRfTk9fR1JBUEhJQ1NWSUVXCi0KLSNpZiBV
U0UoM0RfR1JBUEhJQ1MpCi12b2lkIFBhZ2VDbGllbnRRR3JhcGhpY3NXaWRnZXQ6OmNyZWF0ZVBs
YXRmb3JtR3JhcGhpY3NDb250ZXh0M0QoUGxhdGZvcm1HcmFwaGljc0NvbnRleHQzRCogY29udGV4
dCwgUGxhdGZvcm1HcmFwaGljc1N1cmZhY2UzRCogc3VyZmFjZSwgUU9iamVjdCoqIHN1cmZhY2VP
d25lcikKLXsKLSAgICBjcmVhdGVQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dDNERnJvbVdpZGdldChx
b2JqZWN0X2Nhc3Q8UVdpZGdldCo+KG93bmVyV2lkZ2V0KCkpLCBjb250ZXh0LCBzdXJmYWNlLCBz
dXJmYWNlT3duZXIpOwotfQotI2VuZGlmCi0KLX0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvUGFnZUNsaWVudFF0LmggYi9T
b3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L1BhZ2VDbGllbnRRdC5oCmRlbGV0ZWQgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCA3MmRjYTQyYzE1YmVhYzIwMzhiODBjMTk2YzAwN2JkZTcxODMy
ZjI5Li4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJj
ZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvUGFnZUNsaWVudFF0LmgKKysrIC9kZXYvbnVsbApA
QCAtMSwyNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBOb2tpYSBDb3Jwb3Jh
dGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykKLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMg
ZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkg
aXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICog
TGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0
aGVyCi0gKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55
IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRo
ZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFO
VFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklM
SVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAq
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAq
IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVy
YWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZp
bGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBG
b3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAotICogQm9z
dG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCi0gKgotICovCi0KLSNpZm5kZWYgUGFnZUNsaWVudFF0
X2gKLSNkZWZpbmUgUGFnZUNsaWVudFF0X2gKLQotI2luY2x1ZGUgIkZyYW1lVmlldy5oIgotI2lu
Y2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgotI2luY2x1ZGUgIkludFJlY3QuaCIKLSNpbmNsdWRl
ICJRV2ViUGFnZUNsaWVudC5oIgotI2luY2x1ZGUgIlRpbGVkQmFja2luZ1N0b3JlLmgiCi0jaW5j
bHVkZSAicWdyYXBoaWNzd2Vidmlldy5oIgotI2luY2x1ZGUgInF3ZWJmcmFtZS5oIgotI2luY2x1
ZGUgInF3ZWJmcmFtZV9wLmgiCi0jaW5jbHVkZSAicXdlYnBhZ2UuaCIKLSNpbmNsdWRlICJxd2Vi
cGFnZV9wLmgiCi0jaW5jbHVkZSA8U2V0dGluZ3MuaD4KLSNpbmNsdWRlIDxxZ3JhcGhpY3NzY2Vu
ZS5oPgotI2luY2x1ZGUgPHFncmFwaGljc3ZpZXcuaD4KLSNpbmNsdWRlIDxxZ3JhcGhpY3N3aWRn
ZXQuaD4KLSNpbmNsdWRlIDxxbWV0YW9iamVjdC5oPgotI2luY2x1ZGUgPHFzY3JvbGxiYXIuaD4K
LSNpbmNsdWRlIDxxc3R5bGVvcHRpb24uaD4KLSNpbmNsdWRlIDxxd2lkZ2V0Lmg+Ci0KLW5hbWVz
cGFjZSBXZWJDb3JlIHsKLQotI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKLWNsYXNz
IFRleHR1cmVNYXBwZXJMYXllckNsaWVudFF0IHsKLXB1YmxpYzoKLSAgICBUZXh0dXJlTWFwcGVy
TGF5ZXJDbGllbnRRdChRV2ViRnJhbWUqLCBHcmFwaGljc0xheWVyKik7Ci0gICAgdmlydHVhbCB+
VGV4dHVyZU1hcHBlckxheWVyQ2xpZW50UXQoKTsKLSAgICB2b2lkIHNldFRleHR1cmVNYXBwZXIo
Y29uc3QgUGFzc093blB0cjxUZXh0dXJlTWFwcGVyPiYpOwotICAgIHZvaWQgc3luY1Jvb3RMYXll
cigpOwotICAgIFRleHR1cmVNYXBwZXJMYXllciogcm9vdExheWVyKCk7Ci0KLXByaXZhdGU6Ci0g
ICAgUVdlYkZyYW1lKiBtX2ZyYW1lOwotICAgIE93blB0cjxHcmFwaGljc0xheWVyPiBtX3Jvb3RH
cmFwaGljc0xheWVyOwotfTsKLSNlbmRpZgotCi1jbGFzcyBQYWdlQ2xpZW50UVdpZGdldCA6IHB1
YmxpYyBRV2ViUGFnZUNsaWVudCB7Ci1wdWJsaWM6Ci0gICAgUGFnZUNsaWVudFFXaWRnZXQoUVdp
ZGdldCogbmV3VmlldywgUVdlYlBhZ2UqIG5ld1BhZ2UpCi0gICAgICAgIDogdmlldyhuZXdWaWV3
KQotICAgICAgICAsIHBhZ2UobmV3UGFnZSkKLSNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJ
TkcpCi0gICAgICAgICwgc3luY1RpbWVyKHRoaXMsICZQYWdlQ2xpZW50UVdpZGdldDo6c3luY0xh
eWVycykKLSNlbmRpZgotICAgIHsKLSAgICAgICAgUV9BU1NFUlQodmlldyk7Ci0gICAgfQotICAg
IHZpcnR1YWwgflBhZ2VDbGllbnRRV2lkZ2V0KCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNRV2lk
Z2V0Q2xpZW50KCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotCi0gICAgdmlydHVhbCB2b2lkIHNj
cm9sbChpbnQgZHgsIGludCBkeSwgY29uc3QgUVJlY3QmKTsKLSAgICB2aXJ0dWFsIHZvaWQgdXBk
YXRlKGNvbnN0IFFSZWN0JiBkaXJ0eVJlY3QpOwotICAgIHZpcnR1YWwgdm9pZCBzZXRJbnB1dE1l
dGhvZEVuYWJsZWQoYm9vbCk7Ci0gICAgdmlydHVhbCBib29sIGlucHV0TWV0aG9kRW5hYmxlZCgp
IGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBzZXRJbnB1dE1ldGhvZEhpbnRzKFF0OjpJbnB1dE1l
dGhvZEhpbnRzKTsKLQotI2lmbmRlZiBRVF9OT19DVVJTT1IKLSAgICB2aXJ0dWFsIFFDdXJzb3Ig
Y3Vyc29yKCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZUN1cnNvcihjb25zdCBRQ3Vy
c29yJik7Ci0jZW5kaWYKLQotICAgIHZpcnR1YWwgUVBhbGV0dGUgcGFsZXR0ZSgpIGNvbnN0Owot
ICAgIHZpcnR1YWwgaW50IHNjcmVlbk51bWJlcigpIGNvbnN0OwotICAgIHZpcnR1YWwgUU9iamVj
dCogb3duZXJXaWRnZXQoKSBjb25zdDsKLSAgICB2aXJ0dWFsIFFSZWN0IGdlb21ldHJ5UmVsYXRp
dmVUb093bmVyV2lkZ2V0KCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIFFPYmplY3QqIHBsdWdpblBh
cmVudCgpIGNvbnN0OwotCi0gICAgdmlydHVhbCBRU3R5bGUqIHN0eWxlKCkgY29uc3Q7Ci0KLSAg
ICB2aXJ0dWFsIGJvb2wgdmlld1Jlc2l6ZXNUb0NvbnRlbnRzRW5hYmxlZCgpIGNvbnN0IHsgcmV0
dXJuIGZhbHNlOyB9Ci0KLSAgICB2aXJ0dWFsIFFSZWN0RiB3aW5kb3dSZWN0KCkgY29uc3Q7Ci0K
LSAgICB2aXJ0dWFsIHZvaWQgc2V0V2lkZ2V0VmlzaWJsZShXaWRnZXQqLCBib29sIHZpc2libGUp
OwotCi0jaWYgVVNFKDNEX0dSQVBISUNTKQotICAgIHZpcnR1YWwgdm9pZCBjcmVhdGVQbGF0Zm9y
bUdyYXBoaWNzQ29udGV4dDNEKFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0M0QqLCBQbGF0Zm9ybUdy
YXBoaWNzU3VyZmFjZTNEKiwgUU9iamVjdCoqKTsKLSNlbmRpZgotCi0gICAgUVdpZGdldCogdmll
dzsKLSAgICBRV2ViUGFnZSogcGFnZTsKLQotI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElO
RykKLSAgICB2aXJ0dWFsIHZvaWQgc2V0Um9vdEdyYXBoaWNzTGF5ZXIoR3JhcGhpY3NMYXllciop
OwotICAgIHZpcnR1YWwgdm9pZCBtYXJrRm9yU3luYyhib29sIHNjaGVkdWxlU3luYyk7Ci0gICAg
dm9pZCBzeW5jTGF5ZXJzKFRpbWVyPFBhZ2VDbGllbnRRV2lkZ2V0PiopOwotI2VuZGlmCi0KLSNp
ZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCi0gICAgdmlydHVhbCBib29sIGFsbG93c0Fj
Y2VsZXJhdGVkQ29tcG9zaXRpbmcoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0jZWxzZQotICAg
IHZpcnR1YWwgYm9vbCBhbGxvd3NBY2NlbGVyYXRlZENvbXBvc2l0aW5nKCkgY29uc3QgeyByZXR1
cm4gZmFsc2U7IH0KLSNlbmRpZgotCi0jaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQot
ICAgIFRpbWVyPFBhZ2VDbGllbnRRV2lkZ2V0PiBzeW5jVGltZXI7Ci0gICAgT3duUHRyPFRleHR1
cmVNYXBwZXJMYXllckNsaWVudFF0PiBUZXh0dXJlTWFwcGVyTGF5ZXJDbGllbnQ7Ci0jZW5kaWYK
LX07Ci0KLSNpZiAhZGVmaW5lZChRVF9OT19HUkFQSElDU1ZJRVcpCi0vLyB0aGUgb3ZlcmxheSBp
cyBoZXJlIGZvciBvbmUgcmVhc29uIG9ubHk6IHRvIGhhdmUgdGhlIHNjcm9sbC1iYXJzIGFuZCBv
dGhlcgotLy8gZXh0cmEgVUkgZWxlbWVudHMgYXBwZWFyIG9uIHRvcCBvZiBhbnkgUUdyYXBoaWNz
SXRlbXMgY3JlYXRlZCBieSBDU1MgY29tcG9zaXRpbmcgbGF5ZXJzCi1jbGFzcyBRR3JhcGhpY3NJ
dGVtT3ZlcmxheSA6IHB1YmxpYyBRR3JhcGhpY3NPYmplY3QgewotICAgIHB1YmxpYzoKLSAgICBR
R3JhcGhpY3NJdGVtT3ZlcmxheShRR3JhcGhpY3NXaWRnZXQqIHZpZXcsIFFXZWJQYWdlKiBwKQot
ICAgICAgICA6IFFHcmFwaGljc09iamVjdCh2aWV3KQotICAgICAgICAsIHEodmlldykKLSAgICAg
ICAgLCBwYWdlKHApCi0gICAgewotICAgICAgICBzZXRQb3MoMCwgMCk7Ci0gICAgICAgIHNldEZs
YWcoUUdyYXBoaWNzSXRlbTo6SXRlbVVzZXNFeHRlbmRlZFN0eWxlT3B0aW9uLCB0cnVlKTsKLSAg
ICAgICAgc2V0Q2FjaGVNb2RlKFFHcmFwaGljc0l0ZW06OkRldmljZUNvb3JkaW5hdGVDYWNoZSk7
Ci0gICAgfQotCi0gICAgUVJlY3RGIGJvdW5kaW5nUmVjdCgpIGNvbnN0Ci0gICAgewotICAgICAg
ICByZXR1cm4gcS0+Ym91bmRpbmdSZWN0KCk7Ci0gICAgfQotCi0gICAgdm9pZCBwYWludChRUGFp
bnRlciogcGFpbnRlciwgY29uc3QgUVN0eWxlT3B0aW9uR3JhcGhpY3NJdGVtKiBvcHRpb25zLCBR
V2lkZ2V0KikKLSAgICB7Ci0gICAgICAgIHBhZ2UtPm1haW5GcmFtZSgpLT5yZW5kZXIocGFpbnRl
ciwgc3RhdGljX2Nhc3Q8UVdlYkZyYW1lOjpSZW5kZXJMYXllcj4oUVdlYkZyYW1lOjpBbGxMYXll
cnMmKH5RV2ViRnJhbWU6OkNvbnRlbnRzTGF5ZXIpKSwgb3B0aW9ucy0+ZXhwb3NlZFJlY3QudG9S
ZWN0KCkpOwotICAgIH0KLQotICAgIHZvaWQgcHJlcGFyZUdyYXBoaWNzSXRlbUdlb21ldHJ5Q2hh
bmdlKCkKLSAgICB7Ci0gICAgICAgIHByZXBhcmVHZW9tZXRyeUNoYW5nZSgpOwotICAgIH0KLQot
ICAgIFFHcmFwaGljc1dpZGdldCogcTsKLSAgICBRV2ViUGFnZSogcGFnZTsKLX07Ci0KLQotY2xh
c3MgUGFnZUNsaWVudFFHcmFwaGljc1dpZGdldCA6IHB1YmxpYyBRV2ViUGFnZUNsaWVudCB7Ci1w
dWJsaWM6Ci0gICAgUGFnZUNsaWVudFFHcmFwaGljc1dpZGdldChRR3JhcGhpY3NXZWJWaWV3KiBu
ZXdWaWV3LCBRV2ViUGFnZSogbmV3UGFnZSkKLSAgICAgICAgOiB2aWV3KG5ld1ZpZXcpCi0gICAg
ICAgICwgcGFnZShuZXdQYWdlKQotICAgICAgICAsIHZpZXdSZXNpemVzVG9Db250ZW50cyhmYWxz
ZSkKLSNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCi0gICAgICAgICwgc3luY1RpbWVy
KHRoaXMsICZQYWdlQ2xpZW50UUdyYXBoaWNzV2lkZ2V0OjpzeW5jTGF5ZXJzVGltZW91dCkKLSNl
bmRpZgotICAgICAgICAsIG92ZXJsYXkoMCkKLSAgICB7Ci0gICAgICAgIFFfQVNTRVJUKHZpZXcp
OwotI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKLSAgICAgICAgLy8gdGhlIG92ZXJs
YXkgYW5kIHN0YXlzIGFsaXZlIGZvciB0aGUgbGlmZXRpbWUgb2YKLSAgICAgICAgLy8gdGhpcyBR
R3JhcGhpY3NXZWJWaWV3IGFzIHRoZSBzY3JvbGxiYXJzIGFyZSBuZWVkZWQgd2hlbiB0aGVyZSdz
IG5vIGNvbXBvc2l0aW5nCi0gICAgICAgIHZpZXctPnNldEZsYWcoUUdyYXBoaWNzSXRlbTo6SXRl
bVVzZXNFeHRlbmRlZFN0eWxlT3B0aW9uKTsKLSNlbmRpZgotICAgIH0KLQotICAgIHZpcnR1YWwg
flBhZ2VDbGllbnRRR3JhcGhpY3NXaWRnZXQoKTsKLQotICAgIHZpcnR1YWwgYm9vbCBpc1FXaWRn
ZXRDbGllbnQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotCi0gICAgdmlydHVhbCB2b2lkIHNj
cm9sbChpbnQgZHgsIGludCBkeSwgY29uc3QgUVJlY3QmKTsKLSAgICB2aXJ0dWFsIHZvaWQgdXBk
YXRlKGNvbnN0IFFSZWN0JiBkaXJ0eVJlY3QpOwotICAgIHZpcnR1YWwgdm9pZCBzZXRJbnB1dE1l
dGhvZEVuYWJsZWQoYm9vbCk7Ci0gICAgdmlydHVhbCBib29sIGlucHV0TWV0aG9kRW5hYmxlZCgp
IGNvbnN0OwotICAgIHZpcnR1YWwgdm9pZCBzZXRJbnB1dE1ldGhvZEhpbnRzKFF0OjpJbnB1dE1l
dGhvZEhpbnRzKTsKLQotI2lmbmRlZiBRVF9OT19DVVJTT1IKLSAgICB2aXJ0dWFsIFFDdXJzb3Ig
Y3Vyc29yKCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZUN1cnNvcihjb25zdCBRQ3Vy
c29yJik7Ci0jZW5kaWYKLQotICAgIHZpcnR1YWwgUVBhbGV0dGUgcGFsZXR0ZSgpIGNvbnN0Owot
ICAgIHZpcnR1YWwgaW50IHNjcmVlbk51bWJlcigpIGNvbnN0OwotICAgIHZpcnR1YWwgUU9iamVj
dCogb3duZXJXaWRnZXQoKSBjb25zdDsKLSAgICB2aXJ0dWFsIFFSZWN0IGdlb21ldHJ5UmVsYXRp
dmVUb093bmVyV2lkZ2V0KCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIFFPYmplY3QqIHBsdWdpblBh
cmVudCgpIGNvbnN0OwotCi0gICAgdmlydHVhbCBRU3R5bGUqIHN0eWxlKCkgY29uc3Q7Ci0KLSAg
ICB2aXJ0dWFsIGJvb2wgdmlld1Jlc2l6ZXNUb0NvbnRlbnRzRW5hYmxlZCgpIGNvbnN0IHsgcmV0
dXJuIHZpZXdSZXNpemVzVG9Db250ZW50czsgfQotCi0gICAgdmlydHVhbCB2b2lkIHNldFdpZGdl
dFZpc2libGUoV2lkZ2V0KiwgYm9vbCk7Ci0KLSNpZiBVU0UoM0RfR1JBUEhJQ1MpCi0gICAgdmly
dHVhbCB2b2lkIGNyZWF0ZVBsYXRmb3JtR3JhcGhpY3NDb250ZXh0M0QoUGxhdGZvcm1HcmFwaGlj
c0NvbnRleHQzRCosIFBsYXRmb3JtR3JhcGhpY3NTdXJmYWNlM0QqLCBRT2JqZWN0KiopOwotI2Vu
ZGlmCi0KLSNpZiBVU0UoVElMRURfQkFDS0lOR19TVE9SRSkKLSAgICB2b2lkIHVwZGF0ZVRpbGVk
QmFja2luZ1N0b3JlU2NhbGUoKTsKLSAgICB2aXJ0dWFsIFFSZWN0RiBncmFwaGljc0l0ZW1WaXNp
YmxlUmVjdCgpIGNvbnN0OwotI2VuZGlmCi0KLSNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJ
TkcpCi0gICAgdmlydHVhbCB2b2lkIHNldFJvb3RHcmFwaGljc0xheWVyKEdyYXBoaWNzTGF5ZXIq
KTsKLSAgICB2aXJ0dWFsIHZvaWQgbWFya0ZvclN5bmMoYm9vbCBzY2hlZHVsZVN5bmMpOwotICAg
IHZvaWQgc3luY0xheWVycygpOwotICAgIHZvaWQgc3luY0xheWVyc1RpbWVvdXQoVGltZXI8UGFn
ZUNsaWVudFFHcmFwaGljc1dpZGdldD4qKSB7IHN5bmNMYXllcnMoKTsgfQotCi0gICAgLy8gUUdy
YXBoaWNzV2ViVmlldyBjYW4gcmVuZGVyIGNvbXBvc2l0ZWQgbGF5ZXJzCi0gICAgdmlydHVhbCBi
b29sIGFsbG93c0FjY2VsZXJhdGVkQ29tcG9zaXRpbmcoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9
Ci0jZW5kaWYKLQotICAgIHZpcnR1YWwgUVJlY3RGIHdpbmRvd1JlY3QoKSBjb25zdDsKLQotICAg
IFFHcmFwaGljc1dlYlZpZXcqIHZpZXc7Ci0gICAgUVdlYlBhZ2UqIHBhZ2U7Ci0gICAgYm9vbCB2
aWV3UmVzaXplc1RvQ29udGVudHM7Ci0KLSNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcp
Ci0gICAgT3duUHRyPFRleHR1cmVNYXBwZXJMYXllckNsaWVudFF0PiBUZXh0dXJlTWFwcGVyTGF5
ZXJDbGllbnQ7Ci0gICAgLy8gd2UgaGF2ZSB0byBmbHVzaCBxdWl0ZSBvZnRlbiwgc28gd2UgdXNl
IGEgbWV0YS1tZXRob2QgaW5zdGVhZCBvZiBRVGltZXI6OnNpbmdsZVNob3QgZm9yIHB1dHRpbmcg
dGhlIGV2ZW50IGluIHRoZSBxdWV1ZQotICAgIFRpbWVyPFBhZ2VDbGllbnRRR3JhcGhpY3NXaWRn
ZXQ+IHN5bmNUaW1lcjsKLSNlbmRpZgotICAgIC8vIHRoZSBvdmVybGF5IGdldHMgaW5zdGFudGlh
dGVkIHdoZW4gdGhlIHJvb3QgbGF5ZXIgaXMgYXR0YWNoZWQsIGFuZCBnZXQgZGVsZXRlZCB3aGVu
IGl0J3MgZGV0YWNoZWQKLSAgICBRR3JhcGhpY3NJdGVtT3ZlcmxheSogb3ZlcmxheTsKLQotICAg
IC8vIHdlIG5lZWQgdG8gcHV0IHRoZSByb290IGdyYXBoaWNzIGxheWVyIGJlaGluZCB0aGUgb3Zl
cmxheSAod2hpY2ggY29udGFpbnMgdGhlIHNjcm9sbGJhcikKLSAgICBlbnVtIHsgUm9vdEdyYXBo
aWNzTGF5ZXJaVmFsdWUsIE92ZXJsYXlaVmFsdWUgfTsKLX07Ci0jZW5kaWYgLy8gUVRfTk9fR1JB
UEhJQ1NWSUVXCi0KLX0KLSNlbmRpZiAvLyBQYWdlQ2xpZW50UXQKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvUUdyYXBoaWNzV2lkZ2V0UGx1Z2luSW1wbC5jcHAg
Yi9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L1FHcmFwaGljc1dpZGdldFBsdWdpbklt
cGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTM3OTMzYTBmYWFlNzRkNTI3
ZTE5NzczMzhkZTM2NWEyMzc1NWRmLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvUUdyYXBoaWNzV2lk
Z2V0UGx1Z2luSW1wbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKgotICog
Q29weXJpZ2h0IChDKSAyMDEyIERpZ2lhIFBsYyBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcyku
Ci0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli
dXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVl
IFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNl
LCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgbGli
cmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAot
ICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2Fy
cmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug
Zm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5
IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRo
IHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0
bwotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3Ry
ZWV0LCBGaWZ0aCBGbG9vciwKLSAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgotICoKLSAq
LwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiUUdyYXBoaWNzV2lkZ2V0UGx1Z2lu
SW1wbC5oIgotCi0jaW5jbHVkZSA8UUdyYXBoaWNzU2NlbmU+Ci0jaW5jbHVkZSA8UUdyYXBoaWNz
V2lkZ2V0PgotCi0jaWZuZGVmIFFUX05PX0dSQVBISUNTVklFVwotCi1RR3JhcGhpY3NXaWRnZXRQ
bHVnaW5JbXBsOjp+UUdyYXBoaWNzV2lkZ2V0UGx1Z2luSW1wbCgpCi17Ci0gICAgbV9ncmFwaGlj
c1dpZGdldC0+ZGVsZXRlTGF0ZXIoKTsKLX0KLQotdm9pZCBRR3JhcGhpY3NXaWRnZXRQbHVnaW5J
bXBsOjp1cGRhdGUoY29uc3QgUVJlY3QgJnJlY3QpCi17Ci0gICAgUUdyYXBoaWNzU2NlbmUqIHNj
ZW5lID0gbV9ncmFwaGljc1dpZGdldC0+c2NlbmUoKTsKLSAgICBpZiAoc2NlbmUpCi0gICAgICAg
IHNjZW5lLT51cGRhdGUocmVjdCk7Ci19Ci0KLXZvaWQgUUdyYXBoaWNzV2lkZ2V0UGx1Z2luSW1w
bDo6c2V0R2VvbWV0cnlBbmRDbGlwKGNvbnN0IFFSZWN0ICZnZW9tZXRyeSwgY29uc3QgUVJlY3Qg
JiwgYm9vbCkKLXsKLSAgICBtX2dyYXBoaWNzV2lkZ2V0LT5zZXRHZW9tZXRyeShnZW9tZXRyeSk7
Ci0gICAgLy8gRklYTUU6IE1ha2UgdGhlIGNvZGUgaGFuZGxlIGNsaXBwaW5nIG9mIGdyYXBoaWNz
IHdpZGdldHMuCi19Ci0KLXZvaWQgUUdyYXBoaWNzV2lkZ2V0UGx1Z2luSW1wbDo6c2V0VmlzaWJs
ZShib29sIHZpc2libGUpCi17Ci0gICAgbV9ncmFwaGljc1dpZGdldC0+c2V0VmlzaWJsZSh2aXNp
YmxlKTsKLX0KLQotdm9pZCBRR3JhcGhpY3NXaWRnZXRQbHVnaW5JbXBsOjpzZXRXaWRnZXRQYXJl
bnQoUU9iamVjdCogcGFyZW50KQotewotICAgIFFHcmFwaGljc09iamVjdCogcGFyZW50SXRlbSA9
IHFvYmplY3RfY2FzdDxRR3JhcGhpY3NPYmplY3QqPihwYXJlbnQpOwotICAgIGlmIChwYXJlbnRJ
dGVtKQotICAgICAgICBtX2dyYXBoaWNzV2lkZ2V0LT5zZXRQYXJlbnRJdGVtKHBhcmVudEl0ZW0p
OwotfQotCi1RT2JqZWN0KiBRR3JhcGhpY3NXaWRnZXRQbHVnaW5JbXBsOjpoYW5kbGUoKSBjb25z
dAotewotICAgIHJldHVybiBtX2dyYXBoaWNzV2lkZ2V0OwotfQotCi0jaW5jbHVkZSAibW9jX1FH
cmFwaGljc1dpZGdldFBsdWdpbkltcGwuY3BwIgotCi0jZW5kaWYgLy8gIWRlZmluZWQoUVRfTk9f
R1JBUEhJQ1NWSUVXKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9y
dC9RR3JhcGhpY3NXaWRnZXRQbHVnaW5JbXBsLmggYi9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVT
dXBwb3J0L1FHcmFwaGljc1dpZGdldFBsdWdpbkltcGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggN2Y3NTgyMjZjNGY4MGYzYmY0MGE1NWRmYjY5OWM1ZTg0ZmJhOTIzZS4uMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L3F0
L1dlYkNvcmVTdXBwb3J0L1FHcmFwaGljc1dpZGdldFBsdWdpbkltcGwuaAorKysgL2Rldi9udWxs
CkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgRGlnaWEgUGxjIGFu
ZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKS4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBz
b2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5k
ZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5z
ZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0g
KiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy
IHZlcnNpb24uCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl
IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdp
dGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9y
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExpYnJh
cnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBz
aG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09Q
WUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0
aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAotICogQm9zdG9uLCBN
QSAwMjExMC0xMzAxLCBVU0EuCi0gKgotICovCi0jaWZuZGVmIFFHcmFwaGljc1dpZGdldFBsdWdp
bkltcGxfaAotI2RlZmluZSBRR3JhcGhpY3NXaWRnZXRQbHVnaW5JbXBsX2gKLQotI2lmbmRlZiBR
VF9OT19HUkFQSElDU1ZJRVcKLQotI2luY2x1ZGUgIlF0UGx1Z2luV2lkZ2V0QWRhcHRlci5oIgot
Ci1RVF9CRUdJTl9OQU1FU1BBQ0UKLWNsYXNzIFFHcmFwaGljc1dpZGdldDsKLVFUX0VORF9OQU1F
U1BBQ0UKLQotY2xhc3MgUUdyYXBoaWNzV2lkZ2V0UGx1Z2luSW1wbCA6IHB1YmxpYyBRdFBsdWdp
bldpZGdldEFkYXB0ZXIgewotICAgIFFfT0JKRUNUCi1wdWJsaWM6Ci0gICAgUUdyYXBoaWNzV2lk
Z2V0UGx1Z2luSW1wbChRR3JhcGhpY3NXaWRnZXQgKncpIDogbV9ncmFwaGljc1dpZGdldCh3KSB7
IH0KLSAgICB2aXJ0dWFsIH5RR3JhcGhpY3NXaWRnZXRQbHVnaW5JbXBsKCk7Ci0gICAgdmlydHVh
bCB2b2lkIHVwZGF0ZShjb25zdCBRUmVjdCAmKSBPVkVSUklERTsKLSAgICB2aXJ0dWFsIHZvaWQg
c2V0R2VvbWV0cnlBbmRDbGlwKGNvbnN0IFFSZWN0JiwgY29uc3QgUVJlY3QmLCBib29sKSBPVkVS
UklERTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0VmlzaWJsZShib29sKTsKLSAgICB2aXJ0dWFsIHZv
aWQgc2V0U3R5bGVTaGVldChjb25zdCBRU3RyaW5nJikgT1ZFUlJJREUgeyB9Ci0gICAgdmlydHVh
bCB2b2lkIHNldFdpZGdldFBhcmVudChRT2JqZWN0KikgT1ZFUlJJREU7Ci0gICAgdmlydHVhbCBR
T2JqZWN0KiBoYW5kbGUoKSBjb25zdCBPVkVSUklERTsKLXByaXZhdGU6Ci0gICAgUUdyYXBoaWNz
V2lkZ2V0ICptX2dyYXBoaWNzV2lkZ2V0OwotfTsKLSNlbmRpZiAvLyAhZGVmaW5lZChRVF9OT19H
UkFQSElDU1ZJRVcpCi0KLSNlbmRpZiAvLyBRR3JhcGhpY3NXaWRnZXRQbHVnaW5JbXBsX2gKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvUVN0eWxlRmFjYWRlSW1w
LmNwcCBiL1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvUVN0eWxlRmFjYWRlSW1wLmNw
cApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FmNmNmNjk0NjExOGQxMGE2OGU1MmE3
MTBjYjcxNTE3YzA0Njk5Yy4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MAotLS0gYS9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L1FTdHlsZUZhY2FkZUltcC5j
cHAKKysrIC9kZXYvbnVsbApAQCAtMSw0OTUgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyBw
YXJ0IG9mIHRoZSB0aGVtZSBpbXBsZW1lbnRhdGlvbiBmb3IgZm9ybSBjb250cm9scyBpbiBXZWJD
b3JlLgotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBEaWdpYSBQbGMgYW5kL29yIGl0cyBzdWJz
aWRpYXJ5KC1pZXMpLgotICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTIgTm9raWEgQ29ycG9yYXRp
b24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBm
cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBp
dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gKiBM
aWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRo
ZXIKLSAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkg
bGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhl
IGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5U
WTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJ
VFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICog
TGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICog
WW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmls
ZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZv
dW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCi0gKiBCb3N0
b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgot
Ci0jaW5jbHVkZSAiUVN0eWxlRmFjYWRlSW1wLmgiCi0KLSNpbmNsdWRlIDxRQXBwbGljYXRpb24+
Ci0jaW5jbHVkZSA8UUxpbmVFZGl0PgotI2luY2x1ZGUgPFFQYWludGVyPgotI2luY2x1ZGUgPFFQ
dXNoQnV0dG9uPgotI2luY2x1ZGUgPFFTdHlsZUZhY3Rvcnk+Ci0jaW5jbHVkZSA8UVN0eWxlT3B0
aW9uPgotCi0jaW5jbHVkZSA8UVdlYlBhZ2VDbGllbnQuaD4KLQotdXNpbmcgbmFtZXNwYWNlIFdl
YkNvcmU7Ci0KLW5hbWVzcGFjZSBXZWJLaXQgewotCi1zdGF0aWMgUVN0eWxlOjpTdGF0ZSBjb252
ZXJ0VG9RU3R5bGVTdGF0ZShRU3R5bGVGYWNhZGU6OlN0YXRlIHN0YXRlKQotewotICAgIFFTdHls
ZTo6U3RhdGUgcmVzdWx0OwotI2RlZmluZSBDT05WRVJUX1NUQVRFKFByb3hpZWRTdGF0ZSwgVmFs
dWUpIFwKLSAgICBpZiAoc3RhdGUgJiBRU3R5bGVGYWNhZGU6OlByb3hpZWRTdGF0ZSkgXAotICAg
ICAgICByZXN1bHQgfD0gUVN0eWxlOjpQcm94aWVkU3RhdGU7Ci0KLSAgICBGT1JfRUFDSF9NQVBQ
RURfU1RBVEUoQ09OVkVSVF9TVEFURSwgKQotCi0jdW5kZWYgQ09OVkVSVF9TVEFURQotCi0gICAg
cmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIFFTdHlsZTo6U3ViQ29udHJvbCBjb252ZXJ0VG9R
U3R5bGVTdWJDb250cm9sKFFTdHlsZUZhY2FkZTo6U3ViQ29udHJvbCBzYykKLXsKLSNkZWZpbmUg
Q09OVkVSVF9TVUJDT05UUk9MKEYsIFZhbHVlKSBcCi0gICAgY2FzZSBRU3R5bGVGYWNhZGU6OkY6
IHJldHVybiBRU3R5bGU6OkYKLQotICAgIHN3aXRjaCAoc2MpIHsKLSAgICAgICAgRk9SX0VBQ0hf
U1VCQ09OVFJPTChDT05WRVJUX1NVQkNPTlRST0wsIFNFTUlDT0xPTik7Ci0gICAgfQotICAgIEFT
U0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgIHJldHVybiBRU3R5bGU6OlNDX05vbmU7Ci0jdW5kZWYg
Q09OVkVSVF9TVUJDT05UUk9MCi19Ci0KLXN0YXRpYyB2b2lkIGluaXRHZW5lcmljU3R5bGVPcHRp
b24oUVN0eWxlT3B0aW9uKiBvcHRpb24sIFFXaWRnZXQqIHdpZGdldCwgY29uc3QgUVN0eWxlRmFj
YWRlT3B0aW9uJiBmYWNhZGVPcHRpb24pCi17Ci0gICAgaWYgKHdpZGdldCkKLSAgICAgICAgb3B0
aW9uLT5pbml0KHdpZGdldCk7Ci0gICAgZWxzZQotICAgICAgICAvLyBJZiBhIHdpZGdldCBpcyBu
b3QgZGlyZWN0bHkgYXZhaWxhYmxlIGZvciByZW5kZXJpbmcsIHdlIGZhbGxiYWNrIHRvIGRlZmF1
bHQKLSAgICAgICAgLy8gdmFsdWUgZm9yIGFuIGFjdGl2ZSB3aWRnZXQuCi0gICAgICAgIG9wdGlv
bi0+c3RhdGUgPSBRU3R5bGU6OlN0YXRlX0FjdGl2ZSB8IFFTdHlsZTo6U3RhdGVfRW5hYmxlZDsK
LQotICAgIG9wdGlvbi0+cmVjdCA9IGZhY2FkZU9wdGlvbi5yZWN0OwotICAgIG9wdGlvbi0+c3Rh
dGUgPSBjb252ZXJ0VG9RU3R5bGVTdGF0ZShmYWNhZGVPcHRpb24uc3RhdGUpOwotICAgIG9wdGlv
bi0+ZGlyZWN0aW9uID0gZmFjYWRlT3B0aW9uLmRpcmVjdGlvbjsKLSAgICBvcHRpb24tPnBhbGV0
dGUgPSBmYWNhZGVPcHRpb24ucGFsZXR0ZTsKLX0KLQotc3RhdGljIHZvaWQgaW5pdFNwZWNpZmlj
U3R5bGVPcHRpb24oUVN0eWxlT3B0aW9uKiwgY29uc3QgUVN0eWxlRmFjYWRlT3B0aW9uJikKLXsK
LX0KLQotc3RhdGljIHZvaWQgaW5pdFNwZWNpZmljU3R5bGVPcHRpb24oUVN0eWxlT3B0aW9uU2xp
ZGVyKiBzbGlkZXJPcHRpb24sIGNvbnN0IFFTdHlsZUZhY2FkZU9wdGlvbiYgZmFjYWRlT3B0aW9u
KQotewotICAgIHNsaWRlck9wdGlvbi0+b3JpZW50YXRpb24gPSBmYWNhZGVPcHRpb24uc2xpZGVy
Lm9yaWVudGF0aW9uOwotICAgIHNsaWRlck9wdGlvbi0+dXBzaWRlRG93biA9IGZhY2FkZU9wdGlv
bi5zbGlkZXIudXBzaWRlRG93bjsKLSAgICBzbGlkZXJPcHRpb24tPm1pbmltdW0gPSBmYWNhZGVP
cHRpb24uc2xpZGVyLm1pbmltdW07Ci0gICAgc2xpZGVyT3B0aW9uLT5tYXhpbXVtID0gZmFjYWRl
T3B0aW9uLnNsaWRlci5tYXhpbXVtOwotICAgIHNsaWRlck9wdGlvbi0+c2xpZGVyUG9zaXRpb24g
PSBmYWNhZGVPcHRpb24uc2xpZGVyLnBvc2l0aW9uOwotICAgIHNsaWRlck9wdGlvbi0+c2xpZGVy
VmFsdWUgPSBmYWNhZGVPcHRpb24uc2xpZGVyLnZhbHVlOwotICAgIHNsaWRlck9wdGlvbi0+c2lu
Z2xlU3RlcCA9IGZhY2FkZU9wdGlvbi5zbGlkZXIuc2luZ2xlU3RlcDsKLSAgICBzbGlkZXJPcHRp
b24tPnBhZ2VTdGVwID0gZmFjYWRlT3B0aW9uLnNsaWRlci5wYWdlU3RlcDsKLSAgICBzbGlkZXJP
cHRpb24tPmFjdGl2ZVN1YkNvbnRyb2xzID0gY29udmVydFRvUVN0eWxlU3ViQ29udHJvbChmYWNh
ZGVPcHRpb24uc2xpZGVyLmFjdGl2ZVN1YkNvbnRyb2xzKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVu
YW1lIFN0eWxlT3B0aW9uPgotY2xhc3MgTWFwcGVkU3R5bGVPcHRpb24gOiBwdWJsaWMgU3R5bGVP
cHRpb24gewotCi1wdWJsaWM6Ci0gICAgTWFwcGVkU3R5bGVPcHRpb24oUVdpZGdldCogd2lkZ2V0
LCBjb25zdCBRU3R5bGVGYWNhZGVPcHRpb24mIGZhY2FkZU9wdGlvbikKLSAgICB7Ci0gICAgICAg
IGluaXRHZW5lcmljU3R5bGVPcHRpb24odGhpcywgd2lkZ2V0LCBmYWNhZGVPcHRpb24pOwotICAg
ICAgICBpbml0U3BlY2lmaWNTdHlsZU9wdGlvbih0aGlzLCBmYWNhZGVPcHRpb24pOwotICAgIH0K
LX07Ci0KLXN0YXRpYyBRU3R5bGU6OlBpeGVsTWV0cmljIGNvbnZlcnRQaXhlbE1ldHJpYyhRU3R5
bGVGYWNhZGU6OlBpeGVsTWV0cmljIHN0YXRlKQotewotI2RlZmluZSBDT05WRVJUX01FVFJJQyhN
ZXRyaWMpIFwKLSAgICBjYXNlIFFTdHlsZUZhY2FkZTo6TWV0cmljOiByZXR1cm4gUVN0eWxlOjpN
ZXRyaWMKLQotICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgRk9SX0VBQ0hfTUFQUEVEX01F
VFJJQyhDT05WRVJUX01FVFJJQywgU0VNSUNPTE9OKTsKLSAgICB9Ci0gICAgQVNTRVJUX05PVF9S
RUFDSEVEKCk7Ci0gICAgcmV0dXJuIFFTdHlsZTo6UE1fQ3VzdG9tQmFzZTsKLQotI3VuZGVmIENP
TlZFUlRfTUVUUklDCi19Ci0KLXN0YXRpYyBRU3R5bGVGYWNhZGU6OlN1YkNvbnRyb2wgY29udmVy
dFRvUVN0eWxlRmFjYWRlU3ViQ29udHJvbChRU3R5bGU6OlN1YkNvbnRyb2wgc2MpCi17Ci0jZGVm
aW5lIENPTlZFUlRfU1VCQ09OVFJPTChGLCBWYWx1ZSkgXAotICAgIGNhc2UgUVN0eWxlOjpGOiBy
ZXR1cm4gUVN0eWxlRmFjYWRlOjpGCi0KLSAgICBzd2l0Y2ggKHNjKSB7Ci0gICAgICAgIEZPUl9F
QUNIX1NVQkNPTlRST0woQ09OVkVSVF9TVUJDT05UUk9MLCBTRU1JQ09MT04pOwotICAgIH0KLSAg
ICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICByZXR1cm4gUVN0eWxlRmFjYWRlOjpTQ19Ob25l
OwotI3VuZGVmIENPTlZFUlRfU1VCQ09OVFJPTAotfQotCi1RU3R5bGVGYWNhZGVJbXA6OlFTdHls
ZUZhY2FkZUltcChQYWdlKiBwYWdlKQotICAgIDogbV9wYWdlKHBhZ2UpCi0gICAgLCBtX3N0eWxl
KDApCi17Ci0gICAgbV9mYWxsYmFja1N0eWxlID0gUVN0eWxlRmFjdG9yeTo6Y3JlYXRlKFFMYXRp
bjFTdHJpbmcoIndpbmRvd3MiKSk7Ci0gICAgbV9vd25GYWxsYmFja1N0eWxlID0gdHJ1ZTsKLSAg
ICBpZiAoIW1fZmFsbGJhY2tTdHlsZSkgewotICAgICAgICBtX2ZhbGxiYWNrU3R5bGUgPSBRQXBw
bGljYXRpb246OnN0eWxlKCk7Ci0gICAgICAgIG1fb3duRmFsbGJhY2tTdHlsZSA9IGZhbHNlOwot
ICAgIH0KLX0KLQotUVN0eWxlRmFjYWRlSW1wOjp+UVN0eWxlRmFjYWRlSW1wKCkKLXsKLSAgICBp
ZiAobV9vd25GYWxsYmFja1N0eWxlKQotICAgICAgICBkZWxldGUgbV9mYWxsYmFja1N0eWxlOwot
fQotCi1RUmVjdCBRU3R5bGVGYWNhZGVJbXA6OmJ1dHRvblN1YkVsZW1lbnRSZWN0KFFTdHlsZUZh
Y2FkZTo6QnV0dG9uU3ViRWxlbWVudCBidXR0b25FbGVtZW50LCBTdGF0ZSBzdGF0ZSwgY29uc3Qg
UVJlY3QmIG9yaWdpbmFsUmVjdCkgY29uc3QKLXsKLSAgICBRU3R5bGVPcHRpb25CdXR0b24gb3B0
aW9uOwotICAgIG9wdGlvbi5zdGF0ZSA9IGNvbnZlcnRUb1FTdHlsZVN0YXRlKHN0YXRlKTsKLSAg
ICBvcHRpb24ucmVjdCA9IG9yaWdpbmFsUmVjdDsKLQotICAgIFFTdHlsZTo6U3ViRWxlbWVudCBz
dWJFbGVtZW50ID0gUVN0eWxlOjpTRV9DdXN0b21CYXNlOwotICAgIHN3aXRjaCAoYnV0dG9uRWxl
bWVudCkgewotICAgIGNhc2UgUHVzaEJ1dHRvbkxheW91dEl0ZW06IHN1YkVsZW1lbnQgPSBRU3R5
bGU6OlNFX1B1c2hCdXR0b25MYXlvdXRJdGVtOyBicmVhazsKLSAgICBjYXNlIFB1c2hCdXR0b25D
b250ZW50czogc3ViRWxlbWVudCA9IFFTdHlsZTo6U0VfUHVzaEJ1dHRvbkNvbnRlbnRzOyBicmVh
azsKLSAgICBkZWZhdWx0OiBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLSAgICB9Ci0gICAgcmV0dXJu
IHN0eWxlKCktPnN1YkVsZW1lbnRSZWN0KHN1YkVsZW1lbnQsICZvcHRpb24pOwotfQotCi1pbnQg
UVN0eWxlRmFjYWRlSW1wOjpmaW5kRnJhbWVMaW5lV2lkdGgoKSBjb25zdAotewotICAgIGlmICgh
bV9saW5lRWRpdCkKLSAgICAgICAgbV9saW5lRWRpdC5yZXNldChuZXcgUUxpbmVFZGl0KCkpOwot
Ci0gICAgcmV0dXJuIHN0eWxlKCktPnBpeGVsTWV0cmljKFFTdHlsZTo6UE1fRGVmYXVsdEZyYW1l
V2lkdGgsIDAsIG1fbGluZUVkaXQuZGF0YSgpKTsKLX0KLQotaW50IFFTdHlsZUZhY2FkZUltcDo6
c2ltcGxlUGl4ZWxNZXRyaWMoUVN0eWxlRmFjYWRlOjpQaXhlbE1ldHJpYyBtZXRyaWMsIFN0YXRl
IHN0YXRlKSBjb25zdAotewotICAgIFFTdHlsZU9wdGlvbiBvcHQ7Ci0gICAgb3B0LnN0YXRlID0g
Y29udmVydFRvUVN0eWxlU3RhdGUoc3RhdGUpOwotICAgIHJldHVybiBzdHlsZSgpLT5waXhlbE1l
dHJpYyhjb252ZXJ0UGl4ZWxNZXRyaWMobWV0cmljKSwgJm9wdCwgMCk7Ci19Ci0KLWludCBRU3R5
bGVGYWNhZGVJbXA6OmJ1dHRvbk1hcmdpbihTdGF0ZSBzdGF0ZSwgY29uc3QgUVJlY3QmIG9yaWdp
bmFsUmVjdCkgY29uc3QKLXsKLSAgICBRU3R5bGVPcHRpb25CdXR0b24gc3R5bGVPcHRpb247Ci0g
ICAgc3R5bGVPcHRpb24uc3RhdGUgPSBjb252ZXJ0VG9RU3R5bGVTdGF0ZShzdGF0ZSk7Ci0gICAg
c3R5bGVPcHRpb24ucmVjdCA9IG9yaWdpbmFsUmVjdDsKLSAgICByZXR1cm4gc3R5bGUoKS0+cGl4
ZWxNZXRyaWMoUVN0eWxlOjpQTV9CdXR0b25NYXJnaW4sICZzdHlsZU9wdGlvbiwgMCk7Ci19Ci0K
LWludCBRU3R5bGVGYWNhZGVJbXA6OnNsaWRlckxlbmd0aChRdDo6T3JpZW50YXRpb24gb3JpZW50
YXRpb24pIGNvbnN0Ci17Ci0gICAgUVN0eWxlT3B0aW9uU2xpZGVyIG9wdDsKLSAgICBvcHQub3Jp
ZW50YXRpb24gPSBvcmllbnRhdGlvbjsKLSAgICByZXR1cm4gc3R5bGUoKS0+cGl4ZWxNZXRyaWMo
UVN0eWxlOjpQTV9TbGlkZXJMZW5ndGgsICZvcHQpOwotfQotCi1pbnQgUVN0eWxlRmFjYWRlSW1w
OjpzbGlkZXJUaGlja25lc3MoUXQ6Ok9yaWVudGF0aW9uIG9yaWVudGF0aW9uKSBjb25zdAotewot
ICAgIFFTdHlsZU9wdGlvblNsaWRlciBvcHQ7Ci0gICAgb3B0Lm9yaWVudGF0aW9uID0gb3JpZW50
YXRpb247Ci0gICAgcmV0dXJuIHN0eWxlKCktPnBpeGVsTWV0cmljKFFTdHlsZTo6UE1fU2xpZGVy
VGhpY2tuZXNzLCAmb3B0KTsKLX0KLQotaW50IFFTdHlsZUZhY2FkZUltcDo6cHJvZ3Jlc3NCYXJD
aHVua1dpZHRoKGNvbnN0IFFTaXplJiBzaXplKSBjb25zdAotewotICAgIFFTdHlsZU9wdGlvblBy
b2dyZXNzQmFyVjIgb3B0aW9uOwotICAgIG9wdGlvbi5yZWN0LnNldFNpemUoc2l6ZSk7Ci0gICAg
Ly8gRklYTUU6IFVudGlsIGh0dHA6Ly9idWdyZXBvcnRzLnF0Lm5va2lhLmNvbS9icm93c2UvUVRC
VUctOTE3MSBpcyBmaXhlZCwKLSAgICAvLyB3ZSBzaW11bGF0ZSBvbmUgc3F1YXJlIGFuaW1hdGlu
ZyBhY3Jvc3MgdGhlIHByb2dyZXNzIGJhci4KLSAgICByZXR1cm4gc3R5bGUoKS0+cGl4ZWxNZXRy
aWMoUVN0eWxlOjpQTV9Qcm9ncmVzc0JhckNodW5rV2lkdGgsICZvcHRpb24pOwotfQotCi12b2lk
IFFTdHlsZUZhY2FkZUltcDo6Z2V0QnV0dG9uTWV0cmljcyhRU3RyaW5nICpidXR0b25Gb250RmFt
aWx5LCBpbnQgKmJ1dHRvbkZvbnRQaXhlbFNpemUpIGNvbnN0Ci17Ci0gICAgUVB1c2hCdXR0b24g
YnV0dG9uOwotICAgIFFGb250IGRlZmF1bHRCdXR0b25Gb250ID0gUUFwcGxpY2F0aW9uOjpmb250
KCZidXR0b24pOwotICAgICpidXR0b25Gb250RmFtaWx5ID0gZGVmYXVsdEJ1dHRvbkZvbnQuZmFt
aWx5KCk7Ci0gICAgKmJ1dHRvbkZvbnRQaXhlbFNpemUgPSAwOwotI2lmZGVmIFFfT1NfTUFDCi0g
ICAgYnV0dG9uLnNldEF0dHJpYnV0ZShRdDo6V0FfTWFjU21hbGxTaXplKTsKLSAgICBRRm9udElu
Zm8gZm9udEluZm8oZGVmYXVsdEJ1dHRvbkZvbnQpOwotICAgICpidXR0b25Gb250UGl4ZWxTaXpl
ID0gZm9udEluZm8ucGl4ZWxTaXplKCk7Ci0jZW5kaWYKLX0KLQotUVNpemUgUVN0eWxlRmFjYWRl
SW1wOjpjb21ib0JveFNpemVGcm9tQ29udGVudHMoU3RhdGUgc3RhdGUsIGNvbnN0IFFTaXplJiBj
b250ZW50c1NpemUpIGNvbnN0Ci17Ci0gICAgUVN0eWxlT3B0aW9uQ29tYm9Cb3ggb3B0OwotICAg
IG9wdC5zdGF0ZSA9IGNvbnZlcnRUb1FTdHlsZVN0YXRlKHN0YXRlKTsKLSAgICByZXR1cm4gc3R5
bGUoKS0+c2l6ZUZyb21Db250ZW50cyhRU3R5bGU6OkNUX0NvbWJvQm94LCAmb3B0LCBjb250ZW50
c1NpemUpOwotfQotCi1RU2l6ZSBRU3R5bGVGYWNhZGVJbXA6OnB1c2hCdXR0b25TaXplRnJvbUNv
bnRlbnRzKFN0YXRlIHN0YXRlLCBjb25zdCBRU2l6ZSYgY29udGVudHNTaXplKSBjb25zdAotewot
ICAgIFFTdHlsZU9wdGlvbkJ1dHRvbiBvcHQ7Ci0gICAgb3B0LnN0YXRlID0gY29udmVydFRvUVN0
eWxlU3RhdGUoc3RhdGUpOwotICAgIHJldHVybiBzdHlsZSgpLT5zaXplRnJvbUNvbnRlbnRzKFFT
dHlsZTo6Q1RfUHVzaEJ1dHRvbiwgJm9wdCwgY29udGVudHNTaXplKTsKLX0KLQotdm9pZCBRU3R5
bGVGYWNhZGVJbXA6OnBhaW50QnV0dG9uKFFQYWludGVyKiBwYWludGVyLCBRU3R5bGVGYWNhZGU6
OkJ1dHRvblR5cGUgdHlwZSwgY29uc3QgUVN0eWxlRmFjYWRlT3B0aW9uICZwcm94eU9wdGlvbikK
LXsKLSAgICBRV2lkZ2V0KiB3aWRnZXQgPSBxb2JqZWN0X2Nhc3Q8UVdpZGdldCo+KHdpZGdldEZv
clBhaW50ZXIocGFpbnRlcikpOwotICAgIE1hcHBlZFN0eWxlT3B0aW9uPFFTdHlsZU9wdGlvbkJ1
dHRvbj4gb3B0aW9uKHdpZGdldCwgcHJveHlPcHRpb24pOwotCi0gICAgaWYgKHR5cGUgPT0gUHVz
aEJ1dHRvbikKLSAgICAgICAgc3R5bGUoKS0+ZHJhd0NvbnRyb2woUVN0eWxlOjpDRV9QdXNoQnV0
dG9uLCAmb3B0aW9uLCBwYWludGVyLCB3aWRnZXQpOwotICAgIGVsc2UgaWYgKHR5cGUgPT0gUmFk
aW9CdXR0b24pCi0gICAgICAgIHN0eWxlKCktPmRyYXdDb250cm9sKFFTdHlsZTo6Q0VfUmFkaW9C
dXR0b24sICZvcHRpb24sIHBhaW50ZXIsIHdpZGdldCk7Ci0gICAgZWxzZSBpZiAodHlwZSA9PSBD
aGVja0JveCkKLSAgICAgICAgc3R5bGUoKS0+ZHJhd0NvbnRyb2woUVN0eWxlOjpDRV9DaGVja0Jv
eCwgJm9wdGlvbiwgcGFpbnRlciwgd2lkZ2V0KTsKLX0KLQotdm9pZCBRU3R5bGVGYWNhZGVJbXA6
OnBhaW50VGV4dEZpZWxkKFFQYWludGVyICpwYWludGVyLCBjb25zdCBRU3R5bGVGYWNhZGVPcHRp
b24gJnByb3h5T3B0aW9uKQotewotICAgIFFXaWRnZXQqIHdpZGdldCA9IHFvYmplY3RfY2FzdDxR
V2lkZ2V0Kj4od2lkZ2V0Rm9yUGFpbnRlcihwYWludGVyKSk7Ci0KLSAgICBNYXBwZWRTdHlsZU9w
dGlvbjxRU3R5bGVPcHRpb25GcmFtZVYyPiBwYW5lbCh3aWRnZXQsIHByb3h5T3B0aW9uKTsKLQot
ICAgIHBhbmVsLmxpbmVXaWR0aCA9IGZpbmRGcmFtZUxpbmVXaWR0aCgpOwotICAgIHBhbmVsLmZl
YXR1cmVzID0gUVN0eWxlT3B0aW9uRnJhbWVWMjo6Tm9uZTsKLQotICAgIHN0eWxlKCktPmRyYXdQ
cmltaXRpdmUoUVN0eWxlOjpQRV9QYW5lbExpbmVFZGl0LCAmcGFuZWwsIHBhaW50ZXIsIHdpZGdl
dCk7Ci19Ci0KLXZvaWQgUVN0eWxlRmFjYWRlSW1wOjpwYWludENvbWJvQm94KFFQYWludGVyICpw
YWludGVyLCBjb25zdCBRU3R5bGVGYWNhZGVPcHRpb24gJnByb3h5T3B0aW9uKQotewotICAgIFFX
aWRnZXQqIHdpZGdldCA9IHFvYmplY3RfY2FzdDxRV2lkZ2V0Kj4od2lkZ2V0Rm9yUGFpbnRlcihw
YWludGVyKSk7Ci0KLSAgICBNYXBwZWRTdHlsZU9wdGlvbjxRU3R5bGVPcHRpb25Db21ib0JveD4g
b3B0KHdpZGdldCwgcHJveHlPcHRpb24pOwotCi0gICAgSW50UmVjdCByZWN0ID0gb3B0LnJlY3Q7
Ci0KLSNpZiBkZWZpbmVkKFFfT1NfTUFDKSAmJiAhZGVmaW5lZChRVF9OT19TVFlMRV9NQUMpCi0g
ICAgLy8gUU1hY1N0eWxlIG1ha2VzIHRoZSBjb21ibyBib3hlcyBhIGxpdHRsZSBiaXQgc21hbGxl
ciB0byBsZWF2ZSBzcGFjZSBmb3IgdGhlIGZvY3VzIHJlY3QuCi0gICAgLy8gQmVjYXVzZSBvZiBp
dCwgdGhlIGNvbWJvIGJ1dHRvbiBpcyBkcmF3biBhdCBhIHBvaW50IHRvIHRoZSBsZWZ0IG9mIHdo
ZXJlIGl0IHdhcyBleHBlY3QgdG8gYmUgYW5kIG1heSBlbmQgdXAKLSAgICAvLyBvdmVybGFwcGVk
IHdpdGggdGhlIHRleHQuIFRoaXMgd2lsbCBmb3JjZSBRTWFjU3R5bGUgdG8gZHJhdyB0aGUgY29t
Ym8gYm94IHdpdGggdGhlIGV4cGVjdGVkIHdpZHRoLgotICAgIGlmIChtX3N0eWxlLT5pbmhlcml0
cygiUU1hY1N0eWxlIikpCi0gICAgICAgIHJlY3QuaW5mbGF0ZVgoMyk7Ci0jZW5kaWYKLQotICAg
IGNvbnN0IFFQb2ludCB0b3BMZWZ0ID0gcmVjdC5sb2NhdGlvbigpOwotICAgIHBhaW50ZXItPnRy
YW5zbGF0ZSh0b3BMZWZ0KTsKLSAgICBvcHQucmVjdC5tb3ZlVG8oUVBvaW50KDAsIDApKTsKLSAg
ICBvcHQucmVjdC5zZXRTaXplKHJlY3Quc2l6ZSgpKTsKLQotICAgIHN0eWxlKCktPmRyYXdDb21w
bGV4Q29udHJvbChRU3R5bGU6OkNDX0NvbWJvQm94LCAmb3B0LCBwYWludGVyLCB3aWRnZXQpOwot
ICAgIHBhaW50ZXItPnRyYW5zbGF0ZSgtdG9wTGVmdCk7Ci19Ci0KLXZvaWQgUVN0eWxlRmFjYWRl
SW1wOjpwYWludENvbWJvQm94QXJyb3coUVBhaW50ZXIgKnBhaW50ZXIsIGNvbnN0IFFTdHlsZUZh
Y2FkZU9wdGlvbiAmcHJveHlPcHRpb24pCi17Ci0gICAgUVdpZGdldCogd2lkZ2V0ID0gcW9iamVj
dF9jYXN0PFFXaWRnZXQqPih3aWRnZXRGb3JQYWludGVyKHBhaW50ZXIpKTsKLQotICAgIE1hcHBl
ZFN0eWxlT3B0aW9uPFFTdHlsZU9wdGlvbkNvbWJvQm94PiBvcHQod2lkZ2V0LCBwcm94eU9wdGlv
bik7Ci0gICAgb3B0LnN1YkNvbnRyb2xzID0gUVN0eWxlOjpTQ19Db21ib0JveEFycm93OwotICAg
IC8vIGZvciBkcmF3aW5nIHRoZSBjb21ibyBib3ggYXJyb3csIHJlbHkgb25seSBvbiB0aGUgZmFs
bGJhY2sgc3R5bGUKLSAgICBtX2ZhbGxiYWNrU3R5bGUtPmRyYXdDb21wbGV4Q29udHJvbChRU3R5
bGU6OkNDX0NvbWJvQm94LCAmb3B0LCBwYWludGVyLCB3aWRnZXQpOwotfQotCi12b2lkIFFTdHls
ZUZhY2FkZUltcDo6cGFpbnRTbGlkZXJUcmFjayhRUGFpbnRlciogcGFpbnRlciwgY29uc3QgUVN0
eWxlRmFjYWRlT3B0aW9uJiBwcm94eU9wdGlvbikKLXsKLSAgICBRV2lkZ2V0KiB3aWRnZXQgPSBx
b2JqZWN0X2Nhc3Q8UVdpZGdldCo+KHdpZGdldEZvclBhaW50ZXIocGFpbnRlcikpOwotCi0gICAg
TWFwcGVkU3R5bGVPcHRpb248UVN0eWxlT3B0aW9uU2xpZGVyPiBvcHRpb24od2lkZ2V0LCBwcm94
eU9wdGlvbik7Ci0gICAgb3B0aW9uLnN1YkNvbnRyb2xzID0gUVN0eWxlOjpTQ19TbGlkZXJHcm9v
dmU7Ci0KLSAgICBvcHRpb24udXBzaWRlRG93biA9IHByb3h5T3B0aW9uLnNsaWRlci51cHNpZGVE
b3duOwotICAgIG9wdGlvbi5taW5pbXVtID0gcHJveHlPcHRpb24uc2xpZGVyLm1pbmltdW07Ci0g
ICAgb3B0aW9uLm1heGltdW0gPSBwcm94eU9wdGlvbi5zbGlkZXIubWF4aW11bTsKLSAgICBvcHRp
b24uc2xpZGVyUG9zaXRpb24gPSBwcm94eU9wdGlvbi5zbGlkZXIucG9zaXRpb247Ci0gICAgb3B0
aW9uLm9yaWVudGF0aW9uID0gcHJveHlPcHRpb24uc2xpZGVyLm9yaWVudGF0aW9uOwotCi0gICAg
c3R5bGUoKS0+ZHJhd0NvbXBsZXhDb250cm9sKFFTdHlsZTo6Q0NfU2xpZGVyLCAmb3B0aW9uLCBw
YWludGVyLCB3aWRnZXQpOwotCi0gICAgaWYgKG9wdGlvbi5zdGF0ZSAmIFFTdHlsZTo6U3RhdGVf
SGFzRm9jdXMpIHsKLSAgICAgICAgUVN0eWxlT3B0aW9uRm9jdXNSZWN0IGZvY3VzT3B0aW9uOwot
ICAgICAgICBmb2N1c09wdGlvbi5yZWN0ID0gb3B0aW9uLnJlY3Q7Ci0gICAgICAgIHN0eWxlKCkt
PmRyYXdQcmltaXRpdmUoUVN0eWxlOjpQRV9GcmFtZUZvY3VzUmVjdCwgJmZvY3VzT3B0aW9uLCBw
YWludGVyLCB3aWRnZXQpOwotICAgIH0KLX0KLQotdm9pZCBRU3R5bGVGYWNhZGVJbXA6OnBhaW50
U2xpZGVyVGh1bWIoUVBhaW50ZXIqIHBhaW50ZXIsIGNvbnN0IFFTdHlsZUZhY2FkZU9wdGlvbiYg
cHJveHlPcHRpb24pCi17Ci0gICAgUVdpZGdldCogd2lkZ2V0ID0gcW9iamVjdF9jYXN0PFFXaWRn
ZXQqPih3aWRnZXRGb3JQYWludGVyKHBhaW50ZXIpKTsKLQotICAgIE1hcHBlZFN0eWxlT3B0aW9u
PFFTdHlsZU9wdGlvblNsaWRlcj4gb3B0aW9uKHdpZGdldCwgcHJveHlPcHRpb24pOwotCi0gICAg
b3B0aW9uLnN1YkNvbnRyb2xzID0gUVN0eWxlOjpTQ19TbGlkZXJIYW5kbGU7Ci0gICAgaWYgKG9w
dGlvbi5zdGF0ZSAmIFFTdHlsZTo6U3RhdGVfU3Vua2VuKQotICAgICAgICBvcHRpb24uYWN0aXZl
U3ViQ29udHJvbHMgPSBRU3R5bGU6OlNDX1NsaWRlckhhbmRsZTsKLQotICAgIHN0eWxlKCktPmRy
YXdDb21wbGV4Q29udHJvbChRU3R5bGU6OkNDX1NsaWRlciwgJm9wdGlvbiwgcGFpbnRlciwgd2lk
Z2V0KTsKLX0KLQotdm9pZCBRU3R5bGVGYWNhZGVJbXA6OnBhaW50SW5uZXJTcGluQnV0dG9uKFFQ
YWludGVyKiBwYWludGVyLCBjb25zdCBRU3R5bGVGYWNhZGVPcHRpb24mIHByb3h5T3B0aW9uLCBi
b29sIHNwaW5Cb3hVcCkKLXsKLSAgICBRV2lkZ2V0KiB3aWRnZXQgPSBxb2JqZWN0X2Nhc3Q8UVdp
ZGdldCo+KHdpZGdldEZvclBhaW50ZXIocGFpbnRlcikpOwotCi0gICAgTWFwcGVkU3R5bGVPcHRp
b248UVN0eWxlT3B0aW9uU3BpbkJveD4gb3B0aW9uKHdpZGdldCwgcHJveHlPcHRpb24pOwotCi0g
ICAgb3B0aW9uLnN1YkNvbnRyb2xzID0gUVN0eWxlOjpTQ19TcGluQm94VXAgfCBRU3R5bGU6OlND
X1NwaW5Cb3hEb3duOwotICAgIGlmICghKG9wdGlvbi5zdGF0ZSAmIFFTdHlsZTo6U3RhdGVfUmVh
ZE9ubHkpKSB7Ci0gICAgICAgIGlmIChvcHRpb24uc3RhdGUgJiBRU3R5bGU6OlN0YXRlX0VuYWJs
ZWQpCi0gICAgICAgICAgICBvcHRpb24uc3RlcEVuYWJsZWQgPSBRQWJzdHJhY3RTcGluQm94OjpT
dGVwVXBFbmFibGVkIHwgUUFic3RyYWN0U3BpbkJveDo6U3RlcERvd25FbmFibGVkOwotICAgICAg
ICBpZiAob3B0aW9uLnN0YXRlICYgUVN0eWxlOjpTdGF0ZV9TdW5rZW4pIHsKLSAgICAgICAgICAg
IGlmIChzcGluQm94VXApCi0gICAgICAgICAgICAgICAgb3B0aW9uLmFjdGl2ZVN1YkNvbnRyb2xz
ID0gUVN0eWxlOjpTQ19TcGluQm94VXA7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAg
ICAgb3B0aW9uLmFjdGl2ZVN1YkNvbnRyb2xzID0gUVN0eWxlOjpTQ19TcGluQm94RG93bjsKLSAg
ICAgICAgfQotICAgIH0KLQotICAgIEludFJlY3QgYnV0dG9uUmVjdCA9IG9wdGlvbi5yZWN0Owot
ICAgIC8vIERlZmF1bHQgdG8gbW92aW5nIHRoZSBidXR0b25zIGEgbGl0dGxlIGJpdCB3aXRoaW4g
dGhlIGVkaXRvciBmcmFtZS4KLSAgICBpbnQgaW5mbGF0ZVggPSAtMjsKLSAgICBpbnQgaW5mbGF0
ZVkgPSAtMjsKLSNpZiBkZWZpbmVkKFFfT1NfTUFDKSAmJiAhZGVmaW5lZChRVF9OT19TVFlMRV9N
QUMpCi0gICAgLy8gUU1hY1N0eWxlIHdpbGwgcG9zaXRpb24gdGhlIGFxdWEgYnV0dG9ucyBmbHVz
aCB0byB0aGUgcmlnaHQuCi0gICAgLy8gVGhpcyB3aWxsIG1vdmUgdGhlbSBtb3JlIHdpdGhpbiB0
aGUgY29udHJvbCBmb3IgYmV0dGVyIHN0eWxlLCBhIGxhCi0gICAgLy8gQ2hyb21pdW0gbG9vayAm
IGZlZWwuCi0gICAgaWYgKG1fc3R5bGUtPmluaGVyaXRzKCJRTWFjU3R5bGUiKSkgewotICAgICAg
ICBpbmZsYXRlWCA9IC00OwotICAgICAgICAvLyBSZW5kZXIgbWluaSBhcXVhIHNwaW4gYnV0dG9u
cyBmb3IgUU1hY1N0eWxlIHRvIGZpdCBuaWNlbHkgaW50bwotICAgICAgICAvLyB0aGUgZWRpdG9y
IGFyZWEsIGxpa2UgQ2hyb21pdW0uCi0gICAgICAgIG9wdGlvbi5zdGF0ZSB8PSBRU3R5bGU6OlN0
YXRlX01pbmk7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBidXR0b25SZWN0LmluZmxhdGVYKGluZmxh
dGVYKTsKLSAgICBidXR0b25SZWN0LmluZmxhdGVZKGluZmxhdGVZKTsKLSAgICBvcHRpb24ucmVj
dCA9IGJ1dHRvblJlY3Q7Ci0KLSAgICBzdHlsZSgpLT5kcmF3Q29tcGxleENvbnRyb2woUVN0eWxl
OjpDQ19TcGluQm94LCAmb3B0aW9uLCBwYWludGVyLCB3aWRnZXQpOwotfQotCi12b2lkIFFTdHls
ZUZhY2FkZUltcDo6cGFpbnRQcm9ncmVzc0JhcihRUGFpbnRlciogcGFpbnRlciwgY29uc3QgUVN0
eWxlRmFjYWRlT3B0aW9uJiBwcm94eU9wdGlvbiwgZG91YmxlIHByb2dyZXNzLCBkb3VibGUgYW5p
bWF0aW9uUHJvZ3Jlc3MpCi17Ci0gICAgUVdpZGdldCogd2lkZ2V0ID0gcW9iamVjdF9jYXN0PFFX
aWRnZXQqPih3aWRnZXRGb3JQYWludGVyKHBhaW50ZXIpKTsKLQotICAgIE1hcHBlZFN0eWxlT3B0
aW9uPFFTdHlsZU9wdGlvblByb2dyZXNzQmFyVjI+IG9wdGlvbih3aWRnZXQsIHByb3h5T3B0aW9u
KTsKLQotICAgIG9wdGlvbi5tYXhpbXVtID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgo
KTsKLSAgICBvcHRpb24ubWluaW11bSA9IDA7Ci0gICAgb3B0aW9uLnByb2dyZXNzID0gcHJvZ3Jl
c3MgKiBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCgpOwotCi0gICAgY29uc3QgUVBvaW50
IHRvcExlZnQgPSBvcHRpb24ucmVjdC50b3BMZWZ0KCk7Ci0gICAgcGFpbnRlci0+dHJhbnNsYXRl
KHRvcExlZnQpOwotICAgIG9wdGlvbi5yZWN0Lm1vdmVUbyhRUG9pbnQoMCwgMCkpOwotCi0gICAg
aWYgKHByb2dyZXNzIDwgMCkgewotICAgICAgICAvLyBGSVhNRTogVW50aWwgaHR0cDovL2J1Z3Jl
cG9ydHMucXQubm9raWEuY29tL2Jyb3dzZS9RVEJVRy05MTcxIGlzIGZpeGVkLAotICAgICAgICAv
LyB3ZSBzaW11bGF0ZSBvbmUgc3F1YXJlIGFuaW1hdGluZyBhY3Jvc3MgdGhlIHByb2dyZXNzIGJh
ci4KLSAgICAgICAgc3R5bGUoKS0+ZHJhd0NvbnRyb2woUVN0eWxlOjpDRV9Qcm9ncmVzc0Jhckdy
b292ZSwgJm9wdGlvbiwgcGFpbnRlciwgd2lkZ2V0KTsKLSAgICAgICAgaW50IGNodW5rV2lkdGgg
PSBzdHlsZSgpLT5waXhlbE1ldHJpYyhRU3R5bGU6OlBNX1Byb2dyZXNzQmFyQ2h1bmtXaWR0aCwg
Jm9wdGlvbik7Ci0gICAgICAgIFFDb2xvciBjb2xvciA9IChvcHRpb24ucGFsZXR0ZS5oaWdobGln
aHQoKSA9PSBvcHRpb24ucGFsZXR0ZS5iYWNrZ3JvdW5kKCkpID8gb3B0aW9uLnBhbGV0dGUuY29s
b3IoUVBhbGV0dGU6OkFjdGl2ZSwgUVBhbGV0dGU6OkhpZ2hsaWdodCkgOiBvcHRpb24ucGFsZXR0
ZS5jb2xvcihRUGFsZXR0ZTo6SGlnaGxpZ2h0KTsKLSAgICAgICAgaWYgKG9wdGlvbi5kaXJlY3Rp
b24gPT0gUXQ6OlJpZ2h0VG9MZWZ0KQotICAgICAgICAgICAgcGFpbnRlci0+ZmlsbFJlY3Qob3B0
aW9uLnJlY3QucmlnaHQoKSAtIGNodW5rV2lkdGggIC0gYW5pbWF0aW9uUHJvZ3Jlc3MgKiBvcHRp
b24ucmVjdC53aWR0aCgpLCAwLCBjaHVua1dpZHRoLCBvcHRpb24ucmVjdC5oZWlnaHQoKSwgY29s
b3IpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBwYWludGVyLT5maWxsUmVjdChhbmltYXRp
b25Qcm9ncmVzcyAqIG9wdGlvbi5yZWN0LndpZHRoKCksIDAsIGNodW5rV2lkdGgsIG9wdGlvbi5y
ZWN0LmhlaWdodCgpLCBjb2xvcik7Ci0gICAgfSBlbHNlCi0gICAgICAgIHN0eWxlKCktPmRyYXdD
b250cm9sKFFTdHlsZTo6Q0VfUHJvZ3Jlc3NCYXIsICZvcHRpb24sIHBhaW50ZXIsIHdpZGdldCk7
Ci0KLSAgICBwYWludGVyLT50cmFuc2xhdGUoLXRvcExlZnQpOwotfQotCi1pbnQgUVN0eWxlRmFj
YWRlSW1wOjpzY3JvbGxCYXJFeHRlbnQoYm9vbCBtaW5pKQotewotICAgIFFTdHlsZU9wdGlvblNs
aWRlciBvOwotICAgIG8ub3JpZW50YXRpb24gPSBRdDo6VmVydGljYWw7Ci0gICAgby5zdGF0ZSAm
PSB+UVN0eWxlOjpTdGF0ZV9Ib3Jpem9udGFsOwotICAgIGlmIChtaW5pKQotICAgICAgICBvLnN0
YXRlIHw9IFFTdHlsZTo6U3RhdGVfTWluaTsKLSAgICByZXR1cm4gc3R5bGUoKS0+cGl4ZWxNZXRy
aWMoUVN0eWxlOjpQTV9TY3JvbGxCYXJFeHRlbnQsICZvLCAwKTsKLX0KLQotYm9vbCBRU3R5bGVG
YWNhZGVJbXA6OnNjcm9sbEJhck1pZGRsZUNsaWNrQWJzb2x1dGVQb3NpdGlvblN0eWxlSGludCgp
IGNvbnN0Ci17Ci0gICAgcmV0dXJuIHN0eWxlKCktPnN0eWxlSGludChRU3R5bGU6OlNIX1Njcm9s
bEJhcl9NaWRkbGVDbGlja0Fic29sdXRlUG9zaXRpb24pOwotfQotCi12b2lkIFFTdHlsZUZhY2Fk
ZUltcDo6cGFpbnRTY3JvbGxDb3JuZXIoUVBhaW50ZXIqIHBhaW50ZXIsIGNvbnN0IFFSZWN0JiBy
ZWN0KQotewotICAgIFFXaWRnZXQqIHdpZGdldCA9IHFvYmplY3RfY2FzdDxRV2lkZ2V0Kj4od2lk
Z2V0Rm9yUGFpbnRlcihwYWludGVyKSk7Ci0KLSAgICBRU3R5bGVPcHRpb24gb3B0aW9uOwotICAg
IG9wdGlvbi5yZWN0ID0gcmVjdDsKLSAgICBzdHlsZSgpLT5kcmF3UHJpbWl0aXZlKFFTdHlsZTo6
UEVfUGFuZWxTY3JvbGxBcmVhQ29ybmVyLCAmb3B0aW9uLCBwYWludGVyLCB3aWRnZXQpOwotfQot
Ci1RU3R5bGVGYWNhZGU6OlN1YkNvbnRyb2wgUVN0eWxlRmFjYWRlSW1wOjpoaXRUZXN0U2Nyb2xs
QmFyKGNvbnN0IFFTdHlsZUZhY2FkZU9wdGlvbiAmcHJveHlPcHRpb24sIGNvbnN0IFFQb2ludCAm
cG9zKQotewotICAgIE1hcHBlZFN0eWxlT3B0aW9uPFFTdHlsZU9wdGlvblNsaWRlcj4gb3B0KDAs
IHByb3h5T3B0aW9uKTsKLSAgICBRU3R5bGU6OlN1YkNvbnRyb2wgc2MgPSBzdHlsZSgpLT5oaXRU
ZXN0Q29tcGxleENvbnRyb2woUVN0eWxlOjpDQ19TY3JvbGxCYXIsICZvcHQsIHBvcywgMCk7Ci0g
ICAgcmV0dXJuIGNvbnZlcnRUb1FTdHlsZUZhY2FkZVN1YkNvbnRyb2woc2MpOwotfQotCi1RUmVj
dCBRU3R5bGVGYWNhZGVJbXA6OnNjcm9sbEJhclN1YkNvbnRyb2xSZWN0KGNvbnN0IFFTdHlsZUZh
Y2FkZU9wdGlvbiAmcHJveHlPcHRpb24sIFFTdHlsZUZhY2FkZTo6U3ViQ29udHJvbCBzdWJDb250
cm9sKQotewotICAgIE1hcHBlZFN0eWxlT3B0aW9uPFFTdHlsZU9wdGlvblNsaWRlcj4gb3B0KDAs
IHByb3h5T3B0aW9uKTsKLSAgICByZXR1cm4gc3R5bGUoKS0+c3ViQ29udHJvbFJlY3QoUVN0eWxl
OjpDQ19TY3JvbGxCYXIsICZvcHQsIGNvbnZlcnRUb1FTdHlsZVN1YkNvbnRyb2woc3ViQ29udHJv
bCksIDApOwotfQotCi12b2lkIFFTdHlsZUZhY2FkZUltcDo6cGFpbnRTY3JvbGxCYXIoUVBhaW50
ZXIgKnBhaW50ZXIsIGNvbnN0IFFTdHlsZUZhY2FkZU9wdGlvbiAmcHJveHlPcHRpb24pCi17Ci0g
ICAgUVdpZGdldCogd2lkZ2V0ID0gcW9iamVjdF9jYXN0PFFXaWRnZXQqPih3aWRnZXRGb3JQYWlu
dGVyKHBhaW50ZXIpKTsKLQotICAgIE1hcHBlZFN0eWxlT3B0aW9uPFFTdHlsZU9wdGlvblNsaWRl
cj4gb3B0KHdpZGdldCwgcHJveHlPcHRpb24pOwotCi0jaWZkZWYgUV9PU19NQUMKLSAgICAvLyBG
SVhNRTogV2UgYWxzbyBuZWVkIHRvIGNoZWNrIHRoZSB3aWRnZXQgc3R5bGUgYnV0IHRvZGF5IFNj
cm9sbGJhclRoZW1lIGlzIG5vdCBhd2FyZSBvZiB0aGUgcGFnZSBzbyB3ZQotICAgIC8vIGNhbid0
IGdldCB0aGUgd2lkZ2V0LgotICAgIGlmIChtX3N0eWxlLT5pbmhlcml0cygiUU1hY1N0eWxlIikp
Ci0gICAgICAgIG1fc3R5bGUtPmRyYXdDb21wbGV4Q29udHJvbChRU3R5bGU6OkNDX1Njcm9sbEJh
ciwgJm9wdCwgcGFpbnRlciwgd2lkZ2V0KTsKLSAgICBlbHNlCi0jZW5kaWYKLSAgICB7Ci0gICAg
ICAgIC8vIFRoZSBRU3R5bGUgZXhwZWN0cyB0aGUgYmFja2dyb3VuZCB0byBiZSBhbHJlYWR5IGZp
bGxlZC4KLSAgICAgICAgcGFpbnRlci0+ZmlsbFJlY3Qob3B0LnJlY3QsIG9wdC5wYWxldHRlLmJh
Y2tncm91bmQoKSk7Ci0KLSAgICAgICAgY29uc3QgUVBvaW50IHRvcExlZnQgPSBvcHQucmVjdC50
b3BMZWZ0KCk7Ci0gICAgICAgIHBhaW50ZXItPnRyYW5zbGF0ZSh0b3BMZWZ0KTsKLSAgICAgICAg
b3B0LnJlY3QubW92ZVRvKFFQb2ludCgwLCAwKSk7Ci0gICAgICAgIHN0eWxlKCktPmRyYXdDb21w
bGV4Q29udHJvbChRU3R5bGU6OkNDX1Njcm9sbEJhciwgJm9wdCwgcGFpbnRlciwgd2lkZ2V0KTsK
LSAgICAgICAgb3B0LnJlY3QubW92ZVRvKHRvcExlZnQpOwotICAgIH0KLX0KLQotUU9iamVjdCog
UVN0eWxlRmFjYWRlSW1wOjp3aWRnZXRGb3JQYWludGVyKFFQYWludGVyKiBwYWludGVyKQotewot
ICAgIFFQYWludERldmljZSogZGV2ID0gMDsKLSAgICBpZiAocGFpbnRlcikKLSAgICAgICAgZGV2
ID0gcGFpbnRlci0+ZGV2aWNlKCk7Ci0gICAgaWYgKGRldiAmJiBkZXYtPmRldlR5cGUoKSA9PSBR
SW50ZXJuYWw6OldpZGdldCkKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFFXaWRnZXQqPihk
ZXYpOwotICAgIHJldHVybiAwOwotfQotCi1RU3R5bGUqIFFTdHlsZUZhY2FkZUltcDo6c3R5bGUo
KSBjb25zdAotewotICAgIGlmIChtX3N0eWxlKQotICAgICAgICByZXR1cm4gbV9zdHlsZTsKLQot
ICAgIG1fc3R5bGUgPSBRU3R5bGVGYWNhZGU6OnN0eWxlRm9yUGFnZShtX3BhZ2UpOwotCi0gICAg
aWYgKCFtX3N0eWxlKQotICAgICAgICBtX3N0eWxlID0gUUFwcGxpY2F0aW9uOjpzdHlsZSgpOwot
Ci0gICAgcmV0dXJuIG1fc3R5bGU7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQv
cXQvV2ViQ29yZVN1cHBvcnQvUVN0eWxlRmFjYWRlSW1wLmggYi9Tb3VyY2UvV2ViS2l0L3F0L1dl
YkNvcmVTdXBwb3J0L1FTdHlsZUZhY2FkZUltcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCA3MjIxZDcyYzQxZTgxYjhiOTM5NDlhNTRiZmQyM2YxOGVhYTdlNjIyLi4wMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQvcXQvV2Vi
Q29yZVN1cHBvcnQvUVN0eWxlRmFjYWRlSW1wLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCww
IEBACi0vKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHRoZW1lIGltcGxlbWVudGF0aW9u
IGZvciBmb3JtIGNvbnRyb2xzIGluIFdlYkNvcmUuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDEy
IERpZ2lhIFBsYyBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykuCi0gKiBDb3B5cmlnaHQgKEMp
IDIwMTEtMjAxMiBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcyku
Ci0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli
dXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVl
IFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNl
LCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgbGli
cmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAot
ICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2Fy
cmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug
Zm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5
IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRo
IHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0
bwotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3Ry
ZWV0LCBGaWZ0aCBGbG9vciwKLSAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgotICoKLSAq
LwotI2lmbmRlZiBRU3R5bGVGYWNhZGVJbXBfaAotI2RlZmluZSBRU3R5bGVGYWNhZGVJbXBfaAot
Ci0jaW5jbHVkZSA8UVBvaW50ZXI+Ci0jaW5jbHVkZSA8UVN0eWxlRmFjYWRlLmg+Ci0KLVFUX0JF
R0lOX05BTUVTUEFDRQotY2xhc3MgUVN0eWxlOwotY2xhc3MgUUxpbmVFZGl0OwotY2xhc3MgUVN0
eWxlT3B0aW9uOwotY2xhc3MgUVN0eWxlT3B0aW9uU2xpZGVyOwotY2xhc3MgUVBhaW50ZXI7Ci1j
bGFzcyBRT2JqZWN0OwotUVRfRU5EX05BTUVTUEFDRQotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci1j
bGFzcyBQYWdlOwotfQotCi1uYW1lc3BhY2UgV2ViS2l0IHsKLQotY2xhc3MgUVN0eWxlRmFjYWRl
SW1wIDogcHVibGljIFdlYkNvcmU6OlFTdHlsZUZhY2FkZSB7Ci1wdWJsaWM6Ci0gICAgUVN0eWxl
RmFjYWRlSW1wKFdlYkNvcmU6OlBhZ2UqID0gMCk7Ci0gICAgdmlydHVhbCB+UVN0eWxlRmFjYWRl
SW1wKCk7Ci0KLSAgICBzdGF0aWMgV2ViQ29yZTo6UVN0eWxlRmFjYWRlKiBjcmVhdGUoV2ViQ29y
ZTo6UGFnZSogcGFnZSkKLSAgICB7IHJldHVybiBuZXcgUVN0eWxlRmFjYWRlSW1wKHBhZ2UpOyB9
Ci0KLSAgICB2aXJ0dWFsIFFSZWN0IGJ1dHRvblN1YkVsZW1lbnRSZWN0KEJ1dHRvblN1YkVsZW1l
bnQsIFN0YXRlLCBjb25zdCBRUmVjdCYgb3JpZ2luYWxSZWN0KSBjb25zdDsKLQotICAgIHZpcnR1
YWwgaW50IGZpbmRGcmFtZUxpbmVXaWR0aCgpIGNvbnN0OwotICAgIHZpcnR1YWwgaW50IHNpbXBs
ZVBpeGVsTWV0cmljKFBpeGVsTWV0cmljLCBTdGF0ZSA9IFN0YXRlX05vbmUpIGNvbnN0OwotICAg
IHZpcnR1YWwgaW50IGJ1dHRvbk1hcmdpbihTdGF0ZSwgY29uc3QgUVJlY3QmIG9yaWdpbmFsUmVj
dCkgY29uc3Q7Ci0gICAgdmlydHVhbCBpbnQgc2xpZGVyTGVuZ3RoKFF0OjpPcmllbnRhdGlvbikg
Y29uc3Q7Ci0gICAgdmlydHVhbCBpbnQgc2xpZGVyVGhpY2tuZXNzKFF0OjpPcmllbnRhdGlvbikg
Y29uc3Q7Ci0gICAgdmlydHVhbCBpbnQgcHJvZ3Jlc3NCYXJDaHVua1dpZHRoKGNvbnN0IFFTaXpl
JikgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIGdldEJ1dHRvbk1ldHJpY3MoUVN0cmluZyogYnV0
dG9uRm9udEZhbWlseSwgaW50KiBidXR0b25Gb250UGl4ZWxTaXplKSBjb25zdDsKLQotICAgIHZp
cnR1YWwgUVNpemUgY29tYm9Cb3hTaXplRnJvbUNvbnRlbnRzKFN0YXRlLCBjb25zdCBRU2l6ZSYg
Y29udGVudHNTaXplKSBjb25zdDsKLSAgICB2aXJ0dWFsIFFTaXplIHB1c2hCdXR0b25TaXplRnJv
bUNvbnRlbnRzKFN0YXRlLCBjb25zdCBRU2l6ZSYgY29udGVudHNTaXplKSBjb25zdDsKLQotICAg
IHZpcnR1YWwgdm9pZCBwYWludEJ1dHRvbihRUGFpbnRlciosIEJ1dHRvblR5cGUsIGNvbnN0IFdl
YkNvcmU6OlFTdHlsZUZhY2FkZU9wdGlvbiAmcHJveHlPcHRpb24pOwotICAgIHZpcnR1YWwgdm9p
ZCBwYWludFRleHRGaWVsZChRUGFpbnRlciosIGNvbnN0IFdlYkNvcmU6OlFTdHlsZUZhY2FkZU9w
dGlvbiYpOwotICAgIHZpcnR1YWwgdm9pZCBwYWludENvbWJvQm94KFFQYWludGVyKiwgY29uc3Qg
V2ViQ29yZTo6UVN0eWxlRmFjYWRlT3B0aW9uJik7Ci0gICAgdmlydHVhbCB2b2lkIHBhaW50Q29t
Ym9Cb3hBcnJvdyhRUGFpbnRlciosIGNvbnN0IFdlYkNvcmU6OlFTdHlsZUZhY2FkZU9wdGlvbiYp
OwotCi0gICAgdmlydHVhbCB2b2lkIHBhaW50U2xpZGVyVHJhY2soUVBhaW50ZXIqLCBjb25zdCBX
ZWJDb3JlOjpRU3R5bGVGYWNhZGVPcHRpb24mKTsKLSAgICB2aXJ0dWFsIHZvaWQgcGFpbnRTbGlk
ZXJUaHVtYihRUGFpbnRlciosIGNvbnN0IFdlYkNvcmU6OlFTdHlsZUZhY2FkZU9wdGlvbiYpOwot
ICAgIHZpcnR1YWwgdm9pZCBwYWludElubmVyU3BpbkJ1dHRvbihRUGFpbnRlciosIGNvbnN0IFdl
YkNvcmU6OlFTdHlsZUZhY2FkZU9wdGlvbiYsIGJvb2wgc3BpbkJveFVwKTsKLSAgICB2aXJ0dWFs
IHZvaWQgcGFpbnRQcm9ncmVzc0JhcihRUGFpbnRlciosIGNvbnN0IFdlYkNvcmU6OlFTdHlsZUZh
Y2FkZU9wdGlvbiYsIGRvdWJsZSBwcm9ncmVzcywgZG91YmxlIGFuaW1hdGlvblByb2dyZXNzKTsK
LQotICAgIHZpcnR1YWwgaW50IHNjcm9sbEJhckV4dGVudChib29sIG1pbmkpOwotICAgIHZpcnR1
YWwgYm9vbCBzY3JvbGxCYXJNaWRkbGVDbGlja0Fic29sdXRlUG9zaXRpb25TdHlsZUhpbnQoKSBj
b25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgcGFpbnRTY3JvbGxDb3JuZXIoUVBhaW50ZXIqLCBjb25z
dCBRUmVjdCYpOwotCi0gICAgdmlydHVhbCBTdWJDb250cm9sIGhpdFRlc3RTY3JvbGxCYXIoY29u
c3QgV2ViQ29yZTo6UVN0eWxlRmFjYWRlT3B0aW9uJiwgY29uc3QgUVBvaW50JiBwb3MpOwotICAg
IHZpcnR1YWwgUVJlY3Qgc2Nyb2xsQmFyU3ViQ29udHJvbFJlY3QoY29uc3QgV2ViQ29yZTo6UVN0
eWxlRmFjYWRlT3B0aW9uJiwgU3ViQ29udHJvbCk7Ci0gICAgdmlydHVhbCB2b2lkIHBhaW50U2Ny
b2xsQmFyKFFQYWludGVyKiwgY29uc3QgV2ViQ29yZTo6UVN0eWxlRmFjYWRlT3B0aW9uJik7Ci0K
LSAgICB2aXJ0dWFsIFFPYmplY3QqIHdpZGdldEZvclBhaW50ZXIoUVBhaW50ZXIqKTsKLQotICAg
IHZpcnR1YWwgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gc3R5bGUoKTsgfQotCi1wcml2
YXRlOgotICAgIFFTdHlsZSogc3R5bGUoKSBjb25zdDsKLQotICAgIFdlYkNvcmU6OlBhZ2UqIG1f
cGFnZTsKLSAgICBtdXRhYmxlIFFQb2ludGVyPFFTdHlsZT4gbV9zdHlsZTsKLSAgICBRU3R5bGUq
IG1fZmFsbGJhY2tTdHlsZTsKLSAgICBib29sIG1fb3duRmFsbGJhY2tTdHlsZTsKLSAgICBtdXRh
YmxlIFFTY29wZWRQb2ludGVyPFFMaW5lRWRpdD4gbV9saW5lRWRpdDsKLX07Ci0KLX0KLQotI2Vu
ZGlmIC8vIFFTdHlsZUZhY2FkZUltcF9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0L1dl
YkNvcmVTdXBwb3J0L1FXZWJGcmFtZUFkYXB0ZXIuY3BwIGIvU291cmNlL1dlYktpdC9xdC9XZWJD
b3JlU3VwcG9ydC9RV2ViRnJhbWVBZGFwdGVyLmNwcAppbmRleCAzODBiNzQ5NTRjZTRkNTdmMWEx
ZDZkOWIyMDA2OTZkMzA1YTIzODBhLi4yMGE5N2E1MjRhMDcwNDM4YWRhMDM2YTdiZDFkM2E3ZDQ4
OWMwM2U3IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L1FXZWJG
cmFtZUFkYXB0ZXIuY3BwCisrKyBiL1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvUVdl
YkZyYW1lQWRhcHRlci5jcHAKQEAgLTIxLDE1ICsyMSw0NCBAQAogI2luY2x1ZGUgImNvbmZpZy5o
IgogI2luY2x1ZGUgIlFXZWJGcmFtZUFkYXB0ZXIuaCIKIAorI2luY2x1ZGUgIkFQSUNhc3QuaCIK
KyNpbmNsdWRlICJDaHJvbWUuaCIKKyNpbmNsdWRlICJDaHJvbWVDbGllbnRRdC5oIgorI2luY2x1
ZGUgIkRvY3VtZW50TG9hZGVyLmgiCisjaW5jbHVkZSAiRm9jdXNDb250cm9sbGVyLmgiCiAjaW5j
bHVkZSAiRnJhbWUuaCIKICNpbmNsdWRlICJGcmFtZUxvYWRSZXF1ZXN0LmgiCiAjaW5jbHVkZSAi
RnJhbWVMb2FkZXJDbGllbnRRdC5oIgorI2luY2x1ZGUgIkZyYW1lVmlldy5oIgorI2luY2x1ZGUg
IkhUTUxNZXRhRWxlbWVudC5oIgorI2luY2x1ZGUgIkhUVFBQYXJzZXJzLmgiCisjaW5jbHVkZSAi
SGl0VGVzdFJlc3VsdC5oIgorI2luY2x1ZGUgIkluc3BlY3RvckNvbnRyb2xsZXIuaCIKKyNpbmNs
dWRlICJKU0RPTVdpbmRvd0Jhc2UuaCIKKyNpbmNsdWRlICJLVVJMLmgiCisjaW5jbHVkZSAiTmF2
aWdhdGlvblNjaGVkdWxlci5oIgorI2luY2x1ZGUgIk5vZGVMaXN0LmgiCisjaW5jbHVkZSAiUGFn
ZS5oIgogI2luY2x1ZGUgIlFXZWJQYWdlQWRhcHRlci5oIgorI2luY2x1ZGUgIlJlbmRlck9iamVj
dC5oIgorI2luY2x1ZGUgIlNjcmlwdFNvdXJjZUNvZGUuaCIKKyNpbmNsdWRlICJTY3JpcHRWYWx1
ZS5oIgorI2luY2x1ZGUgIlN1YnN0aXR1dGVEYXRhLmgiCisjaW5jbHVkZSAiVGV4dHVyZU1hcHBl
ckxheWVyQ2xpZW50UXQuaCIKKyNpbmNsdWRlICJUaWxlZEJhY2tpbmdTdG9yZS5oIgogI2lmIEVO
QUJMRShHRVNUVVJFX0VWRU5UUykKICNpbmNsdWRlICJQbGF0Zm9ybUdlc3R1cmVFdmVudC5oIgog
I2luY2x1ZGUgIldlYkV2ZW50Q29udmVyc2lvbi5oIgogI2VuZGlmCisjaW5jbHVkZSAiaHRtbGVk
aXRpbmcuaCIKKyNpbmNsdWRlICJtYXJrdXAuaCIKKyNpbmNsdWRlICJxdF9ydW50aW1lLmgiCisj
aW5jbHVkZSAicXdlYnNlY3VyaXR5b3JpZ2luLmgiCisjaW5jbHVkZSAicXdlYnNlY3VyaXR5b3Jp
Z2luX3AuaCIKKyNpbmNsdWRlICJxd2Vic2V0dGluZ3MuaCIKIAorI2luY2x1ZGUgPEludFJlY3Qu
aD4KKyNpbmNsdWRlIDxJbnRTaXplLmg+CiAjaW5jbHVkZSA8UUZpbGVJbmZvPgogI2luY2x1ZGUg
PFFOZXR3b3JrUmVxdWVzdD4KIApAQCAtNzIsNiArMTAxLDggQEAgUVdlYkZyYW1lQWRhcHRlcjo6
UVdlYkZyYW1lQWRhcHRlcigpCiAgICAgLCBhbGxvd3NTY3JvbGxpbmcodHJ1ZSkKICAgICAsIG1h
cmdpbldpZHRoKC0xKQogICAgICwgbWFyZ2luSGVpZ2h0KC0xKQorICAgICwgaG9yaXpvbnRhbFNj
cm9sbEJhclBvbGljeShRdDo6U2Nyb2xsQmFyQXNOZWVkZWQpCisgICAgLCB2ZXJ0aWNhbFNjcm9s
bEJhclBvbGljeShRdDo6U2Nyb2xsQmFyQXNOZWVkZWQpCiAgICAgLCBmcmFtZSgwKQogICAgICwg
ZnJhbWVMb2FkZXJDbGllbnQoMCkKIHsKQEAgLTEzOSwxMCArMTcwLDE1IEBAIHZvaWQgUVdlYkZy
YW1lQWRhcHRlcjo6bG9hZChjb25zdCBRTmV0d29ya1JlcXVlc3QmIHJlcSwgUU5ldHdvcmtBY2Nl
c3NNYW5hZ2VyOjpPCiAgICAgICAgIHBhZ2VBZGFwdGVyLT5pbnNpZGVPcGVuQ2FsbCA9IGZhbHNl
OwogfQogCitib29sIFFXZWJGcmFtZUFkYXB0ZXI6Omhhc1ZpZXcoKSBjb25zdAoreworICAgIHJl
dHVybiBmcmFtZSAmJiBmcmFtZS0+dmlldygpOworfQorCiAjaWYgRU5BQkxFKEdFU1RVUkVfRVZF
TlRTKQogdm9pZCBRV2ViRnJhbWVBZGFwdGVyOjpoYW5kbGVHZXN0dXJlRXZlbnQoUUdlc3R1cmVF
dmVudEZhY2FkZSogZ2VzdHVyZUV2ZW50KQogewotICAgIEFTU0VSVChoYXNWaWV3KCkpOworICAg
IEFTU0VSVChmcmFtZSAmJiBmcmFtZS0+dmlldygpKTsKICAgICBzd2l0Y2ggKGdlc3R1cmVFdmVu
dC0+dHlwZSkgewogICAgIGNhc2UgUXQ6OlRhcEdlc3R1cmU6CiAgICAgICAgIGZyYW1lLT5ldmVu
dEhhbmRsZXIoKS0+aGFuZGxlR2VzdHVyZUV2ZW50KGNvbnZlcnRHZXN0dXJlKGdlc3R1cmVFdmVu
dCkpOwpAQCAtMTU2LDE4ICsxOTIsMTQzIEBAIHZvaWQgUVdlYkZyYW1lQWRhcHRlcjo6aGFuZGxl
R2VzdHVyZUV2ZW50KFFHZXN0dXJlRXZlbnRGYWNhZGUqIGdlc3R1cmVFdmVudCkKIH0KICNlbmRp
ZgogCi1XZWJDb3JlOjpJbnRTaXplIFFXZWJGcmFtZUFkYXB0ZXI6OnNjcm9sbFBvc2l0aW9uKCkg
Y29uc3QKK1FWYXJpYW50IFFXZWJGcmFtZUFkYXB0ZXI6OmV2YWx1YXRlSmF2YVNjcmlwdChjb25z
dCBRU3RyaW5nICZzY3JpcHRTb3VyY2UpCit7CisgICAgU2NyaXB0Q29udHJvbGxlciogcHJveHkg
PSBmcmFtZS0+c2NyaXB0KCk7CisgICAgUVZhcmlhbnQgcmM7CisgICAgaWYgKHByb3h5KSB7Cisg
ICAgICAgIGludCBkaXN0YW5jZSA9IDA7CisgICAgICAgIEpTQzo6SlNWYWx1ZSB2ID0gZnJhbWUt
PnNjcmlwdCgpLT5leGVjdXRlU2NyaXB0KFNjcmlwdFNvdXJjZUNvZGUoc2NyaXB0U291cmNlKSku
anNWYWx1ZSgpOworICAgICAgICBKU0M6OkV4ZWNTdGF0ZSogZXhlYyA9IHByb3h5LT5nbG9iYWxP
YmplY3QobWFpblRocmVhZE5vcm1hbFdvcmxkKCkpLT5nbG9iYWxFeGVjKCk7CisgICAgICAgIEpT
VmFsdWVSZWYqIGlnbm9yZWRFeGNlcHRpb24gPSAwOworICAgICAgICByYyA9IEpTQzo6QmluZGlu
Z3M6OmNvbnZlcnRWYWx1ZVRvUVZhcmlhbnQodG9SZWYoZXhlYyksIHRvUmVmKGV4ZWMsIHYpLCBR
TWV0YVR5cGU6OlZvaWQsICZkaXN0YW5jZSwgaWdub3JlZEV4Y2VwdGlvbik7CisgICAgfQorICAg
IHJldHVybiByYzsKK30KKwordm9pZCBRV2ViRnJhbWVBZGFwdGVyOjphZGRUb0phdmFTY3JpcHRX
aW5kb3dPYmplY3QoY29uc3QgUVN0cmluZyYgbmFtZSwgUU9iamVjdCogb2JqZWN0LCBWYWx1ZU93
bmVyc2hpcCBvd25lcnNoaXApCit7CisgICAgaWYgKCFwYWdlQWRhcHRlci0+c2V0dGluZ3MtPnRl
c3RBdHRyaWJ1dGUoUVdlYlNldHRpbmdzOjpKYXZhc2NyaXB0RW5hYmxlZCkpCisgICAgICAgIHJl
dHVybjsKKyAgICBKU0M6OkJpbmRpbmdzOjpRdEluc3RhbmNlOjpWYWx1ZU93bmVyc2hpcCB2YWx1
ZU93bmVyc2hpcCA9IHN0YXRpY19jYXN0PEpTQzo6QmluZGluZ3M6OlF0SW5zdGFuY2U6OlZhbHVl
T3duZXJzaGlwPihvd25lcnNoaXApOworICAgIEpTRE9NV2luZG93KiB3aW5kb3cgPSB0b0pTRE9N
V2luZG93KGZyYW1lLCBtYWluVGhyZWFkTm9ybWFsV29ybGQoKSk7CisgICAgSlNDOjpCaW5kaW5n
czo6Um9vdE9iamVjdCogcm9vdDsKKyAgICBpZiAodmFsdWVPd25lcnNoaXAgPT0gSlNDOjpCaW5k
aW5nczo6UXRJbnN0YW5jZTo6UXRPd25lcnNoaXApCisgICAgICAgIHJvb3QgPSBmcmFtZS0+c2Ny
aXB0KCktPmNhY2hlYWJsZUJpbmRpbmdSb290T2JqZWN0KCk7CisgICAgZWxzZQorICAgICAgICBy
b290ID0gZnJhbWUtPnNjcmlwdCgpLT5iaW5kaW5nUm9vdE9iamVjdCgpOworCisgICAgaWYgKCF3
aW5kb3cpIHsKKyAgICAgICAgcURlYnVnKCkgPDwgIldhcm5pbmc6IGNvdWxkbid0IGdldCB3aW5k
b3cgb2JqZWN0IjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIXJvb3QpIHsKKyAg
ICAgICAgcURlYnVnKCkgPDwgIldhcm5pbmc6IGNvdWxkbid0IGdldCByb290IG9iamVjdCI7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBKU0M6OkV4ZWNTdGF0ZSogZXhlYyA9IHdpbmRv
dy0+Z2xvYmFsRXhlYygpOworICAgIEpTQzo6SlNMb2NrSG9sZGVyIGxvY2soZXhlYyk7CisKKyAg
ICBKU0M6OkpTT2JqZWN0KiBydW50aW1lT2JqZWN0ID0gSlNDOjpCaW5kaW5nczo6UXRJbnN0YW5j
ZTo6Z2V0UXRJbnN0YW5jZShvYmplY3QsIHJvb3QsIHZhbHVlT3duZXJzaGlwKS0+Y3JlYXRlUnVu
dGltZU9iamVjdChleGVjKTsKKworICAgIEpTQzo6UHV0UHJvcGVydHlTbG90IHNsb3Q7CisgICAg
d2luZG93LT5tZXRob2RUYWJsZSgpLT5wdXQod2luZG93LCBleGVjLCBKU0M6OklkZW50aWZpZXIo
JmV4ZWMtPmdsb2JhbERhdGEoKSwgcmVpbnRlcnByZXRfY2FzdF9wdHI8Y29uc3QgVUNoYXIqPihu
YW1lLmNvbnN0RGF0YSgpKSwgbmFtZS5sZW5ndGgoKSksIHJ1bnRpbWVPYmplY3QsIHNsb3QpOwor
fQorCitRU3RyaW5nIFFXZWJGcmFtZUFkYXB0ZXI6OnRvSHRtbCgpIGNvbnN0CiB7Ci0gICAgaWYg
KCFoYXNWaWV3KCkpCi0gICAgICAgIHJldHVybiBJbnRTaXplKCk7Ci0gICAgcmV0dXJuIGZyYW1l
LT52aWV3KCktPnNjcm9sbE9mZnNldCgpOworICAgIGlmICghZnJhbWUtPmRvY3VtZW50KCkpCisg
ICAgICAgIHJldHVybiBRU3RyaW5nKCk7CisgICAgcmV0dXJuIGNyZWF0ZU1hcmt1cChmcmFtZS0+
ZG9jdW1lbnQoKSk7Cit9CisKK1FTdHJpbmcgUVdlYkZyYW1lQWRhcHRlcjo6dG9QbGFpblRleHQo
KSBjb25zdAoreworICAgIGlmIChmcmFtZS0+dmlldygpICYmIGZyYW1lLT52aWV3KCktPmxheW91
dFBlbmRpbmcoKSkKKyAgICAgICAgZnJhbWUtPnZpZXcoKS0+bGF5b3V0KCk7CisKKyAgICBFbGVt
ZW50KiBkb2N1bWVudEVsZW1lbnQgPSBmcmFtZS0+ZG9jdW1lbnQoKS0+ZG9jdW1lbnRFbGVtZW50
KCk7CisgICAgaWYgKGRvY3VtZW50RWxlbWVudCkKKyAgICAgICAgcmV0dXJuIGRvY3VtZW50RWxl
bWVudC0+aW5uZXJUZXh0KCk7CisgICAgcmV0dXJuIFFTdHJpbmcoKTsKK30KKwordm9pZCBRV2Vi
RnJhbWVBZGFwdGVyOjpzZXRDb250ZW50KGNvbnN0IFFCeXRlQXJyYXkgJmRhdGEsIGNvbnN0IFFT
dHJpbmcgJm1pbWVUeXBlLCBjb25zdCBRVXJsICZiYXNlVXJsKQoreworICAgIEtVUkwga3VybChi
YXNlVXJsKTsKKyAgICBXZWJDb3JlOjpSZXNvdXJjZVJlcXVlc3QgcmVxdWVzdChrdXJsKTsKKyAg
ICBXVEY6OlJlZlB0cjxXZWJDb3JlOjpTaGFyZWRCdWZmZXI+IGJ1ZmZlciA9IFdlYkNvcmU6OlNo
YXJlZEJ1ZmZlcjo6Y3JlYXRlKGRhdGEuY29uc3REYXRhKCksIGRhdGEubGVuZ3RoKCkpOworICAg
IFFTdHJpbmcgYWN0dWFsTWltZVR5cGU7CisgICAgV1RGOjpTdHJpbmcgZW5jb2Rpbmc7CisgICAg
aWYgKG1pbWVUeXBlLmlzRW1wdHkoKSkKKyAgICAgICAgYWN0dWFsTWltZVR5cGUgPSBRTGF0aW4x
U3RyaW5nKCJ0ZXh0L2h0bWwiKTsKKyAgICBlbHNlIHsKKyAgICAgICAgYWN0dWFsTWltZVR5cGUg
PSBleHRyYWN0TUlNRVR5cGVGcm9tTWVkaWFUeXBlKG1pbWVUeXBlKTsKKyAgICAgICAgZW5jb2Rp
bmcgPSBleHRyYWN0Q2hhcnNldEZyb21NZWRpYVR5cGUobWltZVR5cGUpOworICAgIH0KKyAgICBX
ZWJDb3JlOjpTdWJzdGl0dXRlRGF0YSBzdWJzdGl0dXRlRGF0YShidWZmZXIsIFdURjo6U3RyaW5n
KGFjdHVhbE1pbWVUeXBlKSwgZW5jb2RpbmcsIEtVUkwoKSk7CisgICAgZnJhbWUtPmxvYWRlcigp
LT5sb2FkKFdlYkNvcmU6OkZyYW1lTG9hZFJlcXVlc3QoZnJhbWUsIHJlcXVlc3QsIHN1YnN0aXR1
dGVEYXRhKSk7Cit9CisKK3ZvaWQgUVdlYkZyYW1lQWRhcHRlcjo6c2V0SHRtbChjb25zdCBRU3Ry
aW5nICZodG1sLCBjb25zdCBRVXJsICZiYXNlVXJsKQoreworICAgIEtVUkwga3VybChiYXNlVXJs
KTsKKyAgICBXZWJDb3JlOjpSZXNvdXJjZVJlcXVlc3QgcmVxdWVzdChrdXJsKTsKKyAgICBjb25z
dCBRQnl0ZUFycmF5IHV0ZjggPSBodG1sLnRvVXRmOCgpOworICAgIFdURjo6UmVmUHRyPFdlYkNv
cmU6OlNoYXJlZEJ1ZmZlcj4gZGF0YSA9IFdlYkNvcmU6OlNoYXJlZEJ1ZmZlcjo6Y3JlYXRlKHV0
ZjguY29uc3REYXRhKCksIHV0ZjgubGVuZ3RoKCkpOworICAgIFdlYkNvcmU6OlN1YnN0aXR1dGVE
YXRhIHN1YnN0aXR1dGVEYXRhKGRhdGEsIFdURjo6U3RyaW5nKCJ0ZXh0L2h0bWwiKSwgV1RGOjpT
dHJpbmcoInV0Zi04IiksIEtVUkwoKSk7CisgICAgZnJhbWUtPmxvYWRlcigpLT5sb2FkKFdlYkNv
cmU6OkZyYW1lTG9hZFJlcXVlc3QoZnJhbWUsIHJlcXVlc3QsIHN1YnN0aXR1dGVEYXRhKSk7Cit9
CisKK1FNdWx0aU1hcDxRU3RyaW5nLCBRU3RyaW5nPiBRV2ViRnJhbWVBZGFwdGVyOjptZXRhRGF0
YSgpIGNvbnN0Cit7CisgICAgaWYgKCFmcmFtZS0+ZG9jdW1lbnQoKSkKKyAgICAgICAgcmV0dXJu
IFFNYXA8UVN0cmluZywgUVN0cmluZz4oKTsKKworICAgIFFNdWx0aU1hcDxRU3RyaW5nLCBRU3Ry
aW5nPiBtYXA7CisgICAgRG9jdW1lbnQqIGRvYyA9IGZyYW1lLT5kb2N1bWVudCgpOworICAgIFJl
ZlB0cjxOb2RlTGlzdD4gbGlzdCA9IGRvYy0+Z2V0RWxlbWVudHNCeVRhZ05hbWUoIm1ldGEiKTsK
KyAgICB1bnNpZ25lZCBsZW4gPSBsaXN0LT5sZW5ndGgoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkg
PSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgSFRNTE1ldGFFbGVtZW50KiBtZXRhID0gc3Rh
dGljX2Nhc3Q8SFRNTE1ldGFFbGVtZW50Kj4obGlzdC0+aXRlbShpKSk7CisgICAgICAgIG1hcC5p
bnNlcnQobWV0YS0+bmFtZSgpLCBtZXRhLT5jb250ZW50KCkpOworICAgIH0KKyAgICByZXR1cm4g
bWFwOwogfQogCi1JbnRSZWN0IFFXZWJGcmFtZUFkYXB0ZXI6OmZyYW1lUmVjdCgpIGNvbnN0CitR
UG9pbnQgUVdlYkZyYW1lQWRhcHRlcjo6c2Nyb2xsUG9zaXRpb24oKSBjb25zdAogewotICAgIGlm
ICghaGFzVmlldygpKQotICAgICAgICByZXR1cm4gSW50UmVjdCgpOwotICAgIHJldHVybiBmcmFt
ZS0+dmlldygpLT5mcmFtZVJlY3QoKTsKKyAgICBpZiAoIWZyYW1lIHx8ICFmcmFtZS0+dmlldygp
KQorICAgICAgICByZXR1cm4gUVBvaW50KCk7CisgICAgSW50U2l6ZSBvZnMgPSBmcmFtZS0+dmll
dygpLT5zY3JvbGxPZmZzZXQoKTsKKyAgICByZXR1cm4gUVBvaW50KG9mcy53aWR0aCgpLCBvZnMu
aGVpZ2h0KCkpOworfQorCitRUmVjdCBRV2ViRnJhbWVBZGFwdGVyOjpmcmFtZVJlY3QoKSBjb25z
dAoreworICAgIGlmICghZnJhbWUgfHwgIWZyYW1lLT52aWV3KCkpCisgICAgICAgIHJldHVybiBR
UmVjdCgpOworICAgIHJldHVybiBRUmVjdChmcmFtZS0+dmlldygpLT5mcmFtZVJlY3QoKSk7Cit9
CisKK1FTaXplIFFXZWJGcmFtZUFkYXB0ZXI6OmNvbnRlbnRzU2l6ZSgpIGNvbnN0Cit7CisgICAg
RnJhbWVWaWV3KiB2aWV3ID0gZnJhbWUtPnZpZXcoKTsKKyAgICBpZiAoIXZpZXcpCisgICAgICAg
IHJldHVybiBRU2l6ZSgpOworICAgIHJldHVybiBRU2l6ZSh2aWV3LT5jb250ZW50c1dpZHRoKCks
IHZpZXctPmNvbnRlbnRzSGVpZ2h0KCkpOworfQorCit2b2lkIFFXZWJGcmFtZUFkYXB0ZXI6OnNl
dFpvb21GYWN0b3IocXJlYWwgZmFjdG9yKQoreworICAgIHBhZ2VBZGFwdGVyLT5zZXR0aW5ncy0+
c2V0QXR0cmlidXRlKFFXZWJTZXR0aW5nczo6Wm9vbVRleHRPbmx5LCB0cnVlKTsKKyAgICBmcmFt
ZS0+c2V0UGFnZUFuZFRleHRab29tRmFjdG9ycygxLCBmYWN0b3IpOworfQorCitxcmVhbCBRV2Vi
RnJhbWVBZGFwdGVyOjp6b29tRmFjdG9yKCkgY29uc3QKK3sKKyAgICByZXR1cm4gcGFnZUFkYXB0
ZXItPnNldHRpbmdzLT50ZXN0QXR0cmlidXRlKFFXZWJTZXR0aW5nczo6Wm9vbVRleHRPbmx5KSA/
IGZyYW1lLT50ZXh0Wm9vbUZhY3RvcigpIDogZnJhbWUtPnBhZ2Vab29tRmFjdG9yKCk7CiB9CiAK
IHZvaWQgUVdlYkZyYW1lQWRhcHRlcjo6aW5pdChRV2ViUGFnZUFkYXB0ZXIqIHBhZ2VBZGFwdGVy
KQpAQCAtMTk2LDE2ICszNTcsNjE2IEBAIFFXZWJGcmFtZUFkYXB0ZXIqIFFXZWJGcmFtZUFkYXB0
ZXI6OmtpdChjb25zdCBGcmFtZSogZnJhbWUpCiAKIFFVcmwgUVdlYkZyYW1lQWRhcHRlcjo6ZW5z
dXJlQWJzb2x1dGVVcmwoY29uc3QgUVVybCYgdXJsKQogewotICAgIGlmICghdXJsLmlzVmFsaWQo
KSB8fCAhdXJsLmlzUmVsYXRpdmUoKSkKLSAgICAgICAgcmV0dXJuIHVybDsKKyAgICAvLyBGSVhN
RTogaXQgd291bGQgYmUgbmljZSBpZiB3ZSBjb3VsZCBhdm9pZCBkb2luZyB0aGlzLgorICAgIC8v
IENvbnZlcnQgdG8gS1VSTCBhbmQgYmFjayB0byBwcmVzZXJ2ZSB0aGUgb2xkIGJlaGF2aW9yIChl
LmcuIGZpeHVwIG9mIHNpbmdsZSBzbGFzaCBpbiAnaHR0cDovJykKKyAgICBRVXJsIHZhbGlkYXRl
ZFVybCA9IEtVUkwodXJsKTsKKworICAgIGlmICghdmFsaWRhdGVkVXJsLmlzVmFsaWQoKSB8fCAh
dmFsaWRhdGVkVXJsLmlzUmVsYXRpdmUoKSkKKyAgICAgICAgcmV0dXJuIHZhbGlkYXRlZFVybDsK
IAogICAgIC8vIFRoaXMgY29udGFpbnMgdGhlIFVSTCB3aXRoIGFic29sdXRlIHBhdGggYnV0IHdp
dGhvdXQKICAgICAvLyB0aGUgcXVlcnkgYW5kIHRoZSBmcmFnbWVudCBwYXJ0LgotICAgIFFVcmwg
YmFzZVVybCA9IFFVcmw6OmZyb21Mb2NhbEZpbGUoUUZpbGVJbmZvKHVybC50b0xvY2FsRmlsZSgp
KS5hYnNvbHV0ZUZpbGVQYXRoKCkpOworICAgIFFVcmwgYmFzZVVybCA9IFFVcmw6OmZyb21Mb2Nh
bEZpbGUoUUZpbGVJbmZvKHZhbGlkYXRlZFVybC50b0xvY2FsRmlsZSgpKS5hYnNvbHV0ZUZpbGVQ
YXRoKCkpOwogCiAgICAgLy8gVGhlIHBhdGggaXMgcmVtb3ZlZCBzbyB0aGUgcXVlcnkgYW5kIHRo
ZSBmcmFnbWVudCBwYXJ0cyBhcmUgdGhlcmUuCi0gICAgUVN0cmluZyBwYXRoUmVtb3ZlZCA9IHVy
bC50b1N0cmluZyhRVXJsOjpSZW1vdmVQYXRoKTsKKyAgICBRU3RyaW5nIHBhdGhSZW1vdmVkID0g
dmFsaWRhdGVkVXJsLnRvU3RyaW5nKFFVcmw6OlJlbW92ZVBhdGgpOwogICAgIFFVcmwgdG9SZXNv
bHZlKHBhdGhSZW1vdmVkKTsKIAogICAgIHJldHVybiBiYXNlVXJsLnJlc29sdmVkKHRvUmVzb2x2
ZSk7CiB9CisKK1FXZWJIaXRUZXN0UmVzdWx0UHJpdmF0ZSogUVdlYkZyYW1lQWRhcHRlcjo6aGl0
VGVzdENvbnRlbnQoY29uc3QgUVBvaW50JiBwb3MpIGNvbnN0Cit7CisgICAgaWYgKCFmcmFtZS0+
dmlldygpIHx8ICFmcmFtZS0+Y29udGVudFJlbmRlcmVyKCkpCisgICAgICAgIHJldHVybiAwOwor
CisgICAgSGl0VGVzdFJlc3VsdCByZXN1bHQgPSBmcmFtZS0+ZXZlbnRIYW5kbGVyKCktPmhpdFRl
c3RSZXN1bHRBdFBvaW50KGZyYW1lLT52aWV3KCktPndpbmRvd1RvQ29udGVudHMocG9zKSwgLyph
bGxvd1NoYWRvd0NvbnRlbnQqLyBmYWxzZSwgLyppZ25vcmVDbGlwcGluZyovIHRydWUpOworCisg
ICAgaWYgKHJlc3VsdC5zY3JvbGxiYXIoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJu
IG5ldyBRV2ViSGl0VGVzdFJlc3VsdFByaXZhdGUocmVzdWx0KTsKK30KKworUVdlYkVsZW1lbnQg
UVdlYkZyYW1lQWRhcHRlcjo6ZG9jdW1lbnRFbGVtZW50KCkgY29uc3QKK3sKKyAgICBEb2N1bWVu
dCogZG9jID0gZnJhbWUtPmRvY3VtZW50KCk7CisgICAgaWYgKCFkb2MpCisgICAgICAgIHJldHVy
biBRV2ViRWxlbWVudCgpOworICAgIHJldHVybiBRV2ViRWxlbWVudChkb2MtPmRvY3VtZW50RWxl
bWVudCgpKTsKK30KKworUVN0cmluZyBRV2ViRnJhbWVBZGFwdGVyOjp0aXRsZSgpIGNvbnN0Cit7
CisgICAgaWYgKGZyYW1lLT5kb2N1bWVudCgpKQorICAgICAgICByZXR1cm4gZnJhbWUtPmxvYWRl
cigpLT5kb2N1bWVudExvYWRlcigpLT50aXRsZSgpLnN0cmluZygpOworICAgIHJldHVybiBRU3Ry
aW5nKCk7Cit9CisKK3ZvaWQgUVdlYkZyYW1lQWRhcHRlcjo6Y2xlYXJDb3JlRnJhbWUoKQorewor
ICAgIERvY3VtZW50TG9hZGVyKiBkb2N1bWVudExvYWRlciA9IGZyYW1lLT5sb2FkZXIoKS0+YWN0
aXZlRG9jdW1lbnRMb2FkZXIoKTsKKyAgICBRX0FTU0VSVChkb2N1bWVudExvYWRlcik7CisgICAg
ZG9jdW1lbnRMb2FkZXItPndyaXRlcigpLT5iZWdpbigpOworICAgIGRvY3VtZW50TG9hZGVyLT53
cml0ZXIoKS0+ZW5kKCk7Cit9CisKKworc3RhdGljIGlubGluZSBib29sIGlzQ29yZUZyYW1lQ2xl
YXIoV2ViQ29yZTo6RnJhbWUqIGZyYW1lKQoreworICAgIHJldHVybiBmcmFtZS0+ZG9jdW1lbnQo
KS0+dXJsKCkuaXNFbXB0eSgpOworfQorCitRVXJsIFFXZWJGcmFtZUFkYXB0ZXI6OmJhc2VVcmwo
KSBjb25zdAoreworICAgIGlmIChpc0NvcmVGcmFtZUNsZWFyKGZyYW1lKSkKKyAgICAgICAgcmV0
dXJuIHVybC5yZXNvbHZlZChRVXJsKCkpOworICAgIHJldHVybiBmcmFtZS0+ZG9jdW1lbnQoKS0+
YmFzZVVSTCgpOworfQorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQordm9pZCBR
V2ViRnJhbWVBZGFwdGVyOjpyZW5kZXJDb21wb3NpdGVkTGF5ZXJzKFdlYkNvcmU6OkdyYXBoaWNz
Q29udGV4dCogY29udGV4dCwgY29uc3QgV2ViQ29yZTo6SW50UmVjdCYgY2xpcCkKK3sKKyAgICBX
ZWJDb3JlOjpQYWdlKiBwYWdlID0gZnJhbWUtPnBhZ2UoKTsKKyAgICBpZiAoIXBhZ2UpCisgICAg
ICAgIHJldHVybjsKKyAgICBpZiAoVGV4dHVyZU1hcHBlckxheWVyQ2xpZW50UXQqIGNsaWVudCA9
IHN0YXRpY19jYXN0PENocm9tZUNsaWVudFF0Kj4ocGFnZS0+Y2hyb21lKCktPmNsaWVudCgpKS0+
bV90ZXh0dXJlTWFwcGVyTGF5ZXJDbGllbnQuZ2V0KCkpCisgICAgICAgIGNsaWVudC0+cmVuZGVy
Q29tcG9zaXRlZExheWVycyhjb250ZXh0LCBjbGlwKTsKK30KKyNlbmRpZgorLy8gRklYTUU6IHRo
aXMgbWlnaHQgbm90IGJlIG5lY2Vzc2FyeSwgYnV0IGZvciB0aGUgc2FrZSBvZiBub3QgYnJlYWtp
bmcgdGhpbmdzLCB3ZSdsbCB1c2UgdGhhdCBmb3Igbm93LgorUVVybCBRV2ViRnJhbWVBZGFwdGVy
Ojpjb3JlRnJhbWVVcmwoKSBjb25zdAoreworICAgIHJldHVybiBmcmFtZS0+ZG9jdW1lbnQoKS0+
dXJsKCk7Cit9CisKK1FVcmwgUVdlYkZyYW1lQWRhcHRlcjo6bGFzdFJlcXVlc3RlZFVybCgpIGNv
bnN0Cit7CisgICAgcmV0dXJuIGZyYW1lTG9hZGVyQ2xpZW50LT5sYXN0UmVxdWVzdGVkVXJsKCk7
Cit9CisKK1FXZWJTZWN1cml0eU9yaWdpbiBRV2ViRnJhbWVBZGFwdGVyOjpzZWN1cml0eU9yaWdp
bigpIGNvbnN0Cit7CisgICAgUVdlYlNlY3VyaXR5T3JpZ2luUHJpdmF0ZSogcHJpdiA9IG5ldyBR
V2ViU2VjdXJpdHlPcmlnaW5Qcml2YXRlKGZyYW1lLT5kb2N1bWVudCgpLT5zZWN1cml0eU9yaWdp
bigpKTsKKyAgICByZXR1cm4gUVdlYlNlY3VyaXR5T3JpZ2luKHByaXYpOworfQorCitRU3RyaW5n
IFFXZWJGcmFtZUFkYXB0ZXI6OnVuaXF1ZU5hbWUoKSBjb25zdAoreworICAgIHJldHVybiBmcmFt
ZS0+dHJlZSgpLT51bmlxdWVOYW1lKCk7Cit9CisKKy8vIFRoaXMgY29kZSBpcyBjb3BpZWQgZnJv
bSBDaHJvbWVDbGllbnRHdGsuY3BwLgorc3RhdGljIHZvaWQgY29hbGVzY2VSZWN0c0lmUG9zc2li
bGUoY29uc3QgUVJlY3QmIGNsaXBSZWN0LCBRVmVjdG9yPFFSZWN0PiYgcmVjdHMpCit7CisgICAg
Y29uc3QgdW5zaWduZWQgcmVjdFRocmVzaG9sZCA9IDEwOworICAgIGNvbnN0IGZsb2F0IHdhc3Rl
ZFNwYWNlVGhyZXNob2xkID0gMC43NWY7CisgICAgYm9vbCB1c2VVbmlvbmVkUmVjdCA9IChyZWN0
cy5zaXplKCkgPD0gMSkgfHwgKHJlY3RzLnNpemUoKSA+IHJlY3RUaHJlc2hvbGQpOworICAgIGlm
ICghdXNlVW5pb25lZFJlY3QpIHsKKyAgICAgICAgLy8gQXR0ZW1wdCB0byBndWVzcyB3aGV0aGVy
IG9yIG5vdCB3ZSBzaG91bGQgdXNlIHRoZSB1bmlvbmVkIHJlY3Qgb3IgdGhlIGluZGl2aWR1YWwg
cmVjdHMuCisgICAgICAgIC8vIFdlIGRvIHRoaXMgYnkgY29tcHV0aW5nIHRoZSBwZXJjZW50YWdl
IG9mICJ3YXN0ZWQgc3BhY2UiIGluIHRoZSB1bmlvbi4gSWYgdGhhdCB3YXN0ZWQgc3BhY2UKKyAg
ICAgICAgLy8gaXMgdG9vIGxhcmdlLCB0aGVuIHdlIHdpbGwgZG8gaW5kaXZpZHVhbCByZWN0IHBh
aW50aW5nIGluc3RlYWQuCisgICAgICAgIGZsb2F0IHVuaW9uUGl4ZWxzID0gKGNsaXBSZWN0Lndp
ZHRoKCkgKiBjbGlwUmVjdC5oZWlnaHQoKSk7CisgICAgICAgIGZsb2F0IHNpbmdsZVBpeGVscyA9
IDA7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVjdHMuc2l6ZSgpOyArK2kpCisg
ICAgICAgICAgICBzaW5nbGVQaXhlbHMgKz0gcmVjdHNbaV0ud2lkdGgoKSAqIHJlY3RzW2ldLmhl
aWdodCgpOworICAgICAgICBmbG9hdCB3YXN0ZWRTcGFjZSA9IDEgLSAoc2luZ2xlUGl4ZWxzIC8g
dW5pb25QaXhlbHMpOworICAgICAgICBpZiAod2FzdGVkU3BhY2UgPD0gd2FzdGVkU3BhY2VUaHJl
c2hvbGQpCisgICAgICAgICAgICB1c2VVbmlvbmVkUmVjdCA9IHRydWU7CisgICAgfQorCisgICAg
aWYgKCF1c2VVbmlvbmVkUmVjdCkKKyAgICAgICAgcmV0dXJuOworCisgICAgcmVjdHMuY2xlYXIo
KTsKKyAgICByZWN0cy5hcHBlbmQoY2xpcFJlY3QpOworfQorCit2b2lkIFFXZWJGcmFtZUFkYXB0
ZXI6OnJlbmRlclJlbGF0aXZlQ29vcmRzKFFQYWludGVyKiBwYWludGVyLCBpbnQgbGF5ZXJzLCBj
b25zdCBRUmVnaW9uJiBjbGlwKQoreworICAgIEdyYXBoaWNzQ29udGV4dCBjb250ZXh0KHBhaW50
ZXIpOworICAgIGlmIChjb250ZXh0LnBhaW50aW5nRGlzYWJsZWQoKSAmJiAhY29udGV4dC51cGRh
dGluZ0NvbnRyb2xUaW50cygpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIWZyYW1lLT52
aWV3KCkgfHwgIWZyYW1lLT5jb250ZW50UmVuZGVyZXIoKSkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgUVZlY3RvcjxRUmVjdD4gdmVjdG9yID0gY2xpcC5yZWN0cygpOworICAgIGlmICh2ZWN0b3Iu
aXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBXZWJDb3JlOjpGcmFtZVZpZXcqIHZp
ZXcgPSBmcmFtZS0+dmlldygpOworICAgIHZpZXctPnVwZGF0ZUxheW91dEFuZFN0eWxlSWZOZWVk
ZWRSZWN1cnNpdmUoKTsKKworICAgIGlmIChsYXllcnMgJiBDb250ZW50c0xheWVyKSB7CisgICAg
ICAgIFFSZWN0IGNsaXBCb3VuZGluZ1JlY3QgPSBjbGlwLmJvdW5kaW5nUmVjdCgpOworICAgICAg
ICBjb2FsZXNjZVJlY3RzSWZQb3NzaWJsZShjbGlwQm91bmRpbmdSZWN0LCB2ZWN0b3IpOworICAg
ICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZlY3Rvci5zaXplKCk7ICsraSkgeworICAgICAgICAg
ICAgY29uc3QgUVJlY3QmIGNsaXBSZWN0ID0gdmVjdG9yLmF0KGkpOworCisgICAgICAgICAgICBR
UmVjdCByZWN0ID0gY2xpcFJlY3QuaW50ZXJzZWN0ZWQodmlldy0+ZnJhbWVSZWN0KCkpOworCisg
ICAgICAgICAgICBjb250ZXh0LnNhdmUoKTsKKyAgICAgICAgICAgIHBhaW50ZXItPnNldENsaXBS
ZWN0KGNsaXBSZWN0LCBRdDo6SW50ZXJzZWN0Q2xpcCk7CisKKyAgICAgICAgICAgIGludCB4ID0g
dmlldy0+eCgpOworICAgICAgICAgICAgaW50IHkgPSB2aWV3LT55KCk7CisKKyAgICAgICAgICAg
IGludCBzY3JvbGxYID0gdmlldy0+c2Nyb2xsWCgpOworICAgICAgICAgICAgaW50IHNjcm9sbFkg
PSB2aWV3LT5zY3JvbGxZKCk7CisKKyAgICAgICAgICAgIGNvbnRleHQudHJhbnNsYXRlKHgsIHkp
OworICAgICAgICAgICAgcmVjdC50cmFuc2xhdGUoLXgsIC15KTsKKyAgICAgICAgICAgIGNvbnRl
eHQudHJhbnNsYXRlKC1zY3JvbGxYLCAtc2Nyb2xsWSk7CisgICAgICAgICAgICByZWN0LnRyYW5z
bGF0ZShzY3JvbGxYLCBzY3JvbGxZKTsKKyAgICAgICAgICAgIGNvbnRleHQuY2xpcCh2aWV3LT52
aXNpYmxlQ29udGVudFJlY3QoKSk7CisKKyAgICAgICAgICAgIHZpZXctPnBhaW50Q29udGVudHMo
JmNvbnRleHQsIHJlY3QpOworCisgICAgICAgICAgICBjb250ZXh0LnJlc3RvcmUoKTsKKyAgICAg
ICAgfQorI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICAgICAgcmVuZGVyQ29t
cG9zaXRlZExheWVycygmY29udGV4dCwgSW50UmVjdChjbGlwQm91bmRpbmdSZWN0KSk7CisjZW5k
aWYKKyAgICB9CisgICAgcmVuZGVyRnJhbWVFeHRyYXMoJmNvbnRleHQsIGxheWVycywgY2xpcCk7
CisjaWYgRU5BQkxFKElOU1BFQ1RPUikKKyAgICBpZiAoZnJhbWUtPnBhZ2UoKS0+aW5zcGVjdG9y
Q29udHJvbGxlcigpLT5oaWdobGlnaHRlZE5vZGUoKSkgeworICAgICAgICBjb250ZXh0LnNhdmUo
KTsKKyAgICAgICAgZnJhbWUtPnBhZ2UoKS0+aW5zcGVjdG9yQ29udHJvbGxlcigpLT5kcmF3SGln
aGxpZ2h0KGNvbnRleHQpOworICAgICAgICBjb250ZXh0LnJlc3RvcmUoKTsKKyAgICB9CisjZW5k
aWYKK30KKwordm9pZCBRV2ViRnJhbWVBZGFwdGVyOjpyZW5kZXJGcmFtZUV4dHJhcyhXZWJDb3Jl
OjpHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGludCBsYXllcnMsIGNvbnN0IFFSZWdpb24mIGNs
aXApCit7CisgICAgaWYgKCEobGF5ZXJzICYgKFBhbkljb25MYXllciB8IFNjcm9sbEJhckxheWVy
KSkpCisgICAgICAgIHJldHVybjsKKyAgICBRUGFpbnRlciogcGFpbnRlciA9IGNvbnRleHQtPnBs
YXRmb3JtQ29udGV4dCgpOworICAgIFdlYkNvcmU6OkZyYW1lVmlldyogdmlldyA9IGZyYW1lLT52
aWV3KCk7CisgICAgUVZlY3RvcjxRUmVjdD4gdmVjdG9yID0gY2xpcC5yZWN0cygpOworICAgIGZv
ciAoaW50IGkgPSAwOyBpIDwgdmVjdG9yLnNpemUoKTsgKytpKSB7CisgICAgICAgIGNvbnN0IFFS
ZWN0JiBjbGlwUmVjdCA9IHZlY3Rvci5hdChpKTsKKworICAgICAgICBRUmVjdCBpbnRlcnNlY3Rl
ZFJlY3QgPSBjbGlwUmVjdC5pbnRlcnNlY3RlZCh2aWV3LT5mcmFtZVJlY3QoKSk7CisKKyAgICAg
ICAgcGFpbnRlci0+c2F2ZSgpOworICAgICAgICBwYWludGVyLT5zZXRDbGlwUmVjdChjbGlwUmVj
dCwgUXQ6OkludGVyc2VjdENsaXApOworCisgICAgICAgIGludCB4ID0gdmlldy0+eCgpOworICAg
ICAgICBpbnQgeSA9IHZpZXctPnkoKTsKKworICAgICAgICBpZiAobGF5ZXJzICYgU2Nyb2xsQmFy
TGF5ZXIKKyAgICAgICAgICAgICYmICF2aWV3LT5zY3JvbGxiYXJzU3VwcHJlc3NlZCgpCisgICAg
ICAgICAgICAmJiAodmlldy0+aG9yaXpvbnRhbFNjcm9sbGJhcigpIHx8IHZpZXctPnZlcnRpY2Fs
U2Nyb2xsYmFyKCkpKSB7CisKKyAgICAgICAgICAgIFFSZWN0IHJlY3QgPSBpbnRlcnNlY3RlZFJl
Y3Q7CisgICAgICAgICAgICBjb250ZXh0LT50cmFuc2xhdGUoeCwgeSk7CisgICAgICAgICAgICBy
ZWN0LnRyYW5zbGF0ZSgteCwgLXkpOworICAgICAgICAgICAgdmlldy0+cGFpbnRTY3JvbGxiYXJz
KGNvbnRleHQsIHJlY3QpOworICAgICAgICAgICAgY29udGV4dC0+dHJhbnNsYXRlKC14LCAteSk7
CisgICAgICAgIH0KKworI2lmIEVOQUJMRShQQU5fU0NST0xMSU5HKQorICAgICAgICBpZiAobGF5
ZXJzICYgUGFuSWNvbkxheWVyKQorICAgICAgICAgICAgdmlldy0+cGFpbnRQYW5TY3JvbGxJY29u
KGNvbnRleHQpOworI2VuZGlmCisKKyAgICAgICAgcGFpbnRlci0+cmVzdG9yZSgpOworICAgIH0K
K30KKworI2lmIFVTRShUSUxFRF9CQUNLSU5HX1NUT1JFKQordm9pZCBRV2ViRnJhbWVBZGFwdGVy
OjpzZXRUaWxlZEJhY2tpbmdTdG9yZUZyb3plbihib29sIGZyb3plbikKK3sKKyAgICBXZWJDb3Jl
OjpUaWxlZEJhY2tpbmdTdG9yZSogYmFja2luZ1N0b3JlID0gZnJhbWUtPnRpbGVkQmFja2luZ1N0
b3JlKCk7CisgICAgaWYgKCFiYWNraW5nU3RvcmUpCisgICAgICAgIHJldHVybjsKKyAgICBiYWNr
aW5nU3RvcmUtPnNldENvbnRlbnRzRnJvemVuKGZyb3plbik7Cit9CisKK2Jvb2wgUVdlYkZyYW1l
QWRhcHRlcjo6dGlsZWRCYWNraW5nU3RvcmVGcm96ZW4oKSBjb25zdAoreworICAgIFdlYkNvcmU6
OlRpbGVkQmFja2luZ1N0b3JlKiBiYWNraW5nU3RvcmUgPSBmcmFtZS0+dGlsZWRCYWNraW5nU3Rv
cmUoKTsKKyAgICBpZiAoIWJhY2tpbmdTdG9yZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
IHJldHVybiBiYWNraW5nU3RvcmUtPmNvbnRlbnRzRnJvemVuKCk7Cit9CisKK3ZvaWQgUVdlYkZy
YW1lQWRhcHRlcjo6c2V0VGlsZWRCYWNraW5nU3RvcmVDb250ZW50c1NjYWxlKGZsb2F0IHNjYWxl
KQoreworICAgIFdlYkNvcmU6OlRpbGVkQmFja2luZ1N0b3JlKiBiYWNraW5nU3RvcmUgPSBmcmFt
ZS0+dGlsZWRCYWNraW5nU3RvcmUoKTsKKyAgICBpZiAoIWJhY2tpbmdTdG9yZSkKKyAgICAgICAg
cmV0dXJuOworICAgIGJhY2tpbmdTdG9yZS0+c2V0Q29udGVudHNTY2FsZShzY2FsZSk7Cit9CisK
K2Jvb2wgUVdlYkZyYW1lQWRhcHRlcjo6cmVuZGVyRnJvbVRpbGVkQmFja2luZ1N0b3JlKFFQYWlu
dGVyKiBwYWludGVyLCBjb25zdCBRUmVnaW9uJiBjbGlwKQoreworICAgIC8vIE5vIHRpbGVkIGJh
Y2tpbmcgc3RvcmU/IFRlbGwgdGhlIGNhbGxlciB0byBmYWxsIGJhY2sgdG8gcmVndWxhciByZW5k
ZXJpbmcuCisgICAgaWYgKCFmcmFtZS0+dGlsZWRCYWNraW5nU3RvcmUoKSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgLy8gRklYTUU6IFdlIHNob3VsZCBzZXQgdGhlIGJhY2tpbmcgc3Rv
cmUgdmlld3BvcnQgZWFybGllciB0aGFuIGluIHBhaW50CisgICAgZnJhbWUtPnRpbGVkQmFja2lu
Z1N0b3JlKCktPmNvdmVyV2l0aFRpbGVzSWZOZWVkZWQoKTsKKworICAgIGlmICghZnJhbWUtPnZp
ZXcoKSB8fCAhZnJhbWUtPmNvbnRlbnRSZW5kZXJlcigpKQorICAgICAgICByZXR1cm4gdHJ1ZTsK
KworICAgIFFWZWN0b3I8UVJlY3Q+IHZlY3RvciA9IGNsaXAucmVjdHMoKTsKKyAgICBpZiAodmVj
dG9yLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBHcmFwaGljc0NvbnRl
eHQgY29udGV4dChwYWludGVyKTsKKworICAgIFdlYkNvcmU6OkZyYW1lVmlldyogdmlldyA9IGZy
YW1lLT52aWV3KCk7CisKKyAgICBpbnQgc2Nyb2xsWCA9IHZpZXctPnNjcm9sbFgoKTsKKyAgICBp
bnQgc2Nyb2xsWSA9IHZpZXctPnNjcm9sbFkoKTsKKyAgICBjb250ZXh0LnRyYW5zbGF0ZSgtc2Ny
b2xsWCwgLXNjcm9sbFkpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2ZWN0b3Iuc2l6ZSgp
OyArK2kpIHsKKyAgICAgICAgY29uc3QgUVJlY3QmIGNsaXBSZWN0ID0gdmVjdG9yLmF0KGkpOwor
CisgICAgICAgIHBhaW50ZXItPnNhdmUoKTsKKworICAgICAgICBRUmVjdCByZWN0ID0gY2xpcFJl
Y3QudHJhbnNsYXRlZChzY3JvbGxYLCBzY3JvbGxZKTsKKyAgICAgICAgcGFpbnRlci0+c2V0Q2xp
cFJlY3QocmVjdCwgUXQ6OkludGVyc2VjdENsaXApOworCisgICAgICAgIGZyYW1lLT50aWxlZEJh
Y2tpbmdTdG9yZSgpLT5wYWludCgmY29udGV4dCwgcmVjdCk7CisKKyAgICAgICAgcGFpbnRlci0+
cmVzdG9yZSgpOworICAgIH0KKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAg
ICByZW5kZXJDb21wb3NpdGVkTGF5ZXJzKCZjb250ZXh0LCBJbnRSZWN0KGNsaXAuYm91bmRpbmdS
ZWN0KCkpKTsKKyAgICByZW5kZXJGcmFtZUV4dHJhcygmY29udGV4dCwgUVdlYkZyYW1lQWRhcHRl
cjo6U2Nyb2xsQmFyTGF5ZXIgfCBRV2ViRnJhbWVBZGFwdGVyOjpQYW5JY29uTGF5ZXIsIGNsaXAp
OworI2VuZGlmCisgICAgcmV0dXJuIHRydWU7Cit9CisjZW5kaWYKKwordm9pZCBRV2ViRnJhbWVB
ZGFwdGVyOjpfcV9vcmllbnRhdGlvbkNoYW5nZWQoKQoreworI2lmIEVOQUJMRShPUklFTlRBVElP
Tl9FVkVOVFMpCisgICAgaW50IG9yaWVudGF0aW9uOworCisgICAgc3dpdGNoIChtX29yaWVudGF0
aW9uLnJlYWRpbmcoKS0+b3JpZW50YXRpb24oKSkgeworICAgIGNhc2UgUU9yaWVudGF0aW9uUmVh
ZGluZzo6VG9wVXA6CisgICAgICAgIG9yaWVudGF0aW9uID0gMDsKKyAgICAgICAgYnJlYWs7Cisg
ICAgY2FzZSBRT3JpZW50YXRpb25SZWFkaW5nOjpUb3BEb3duOgorICAgICAgICBvcmllbnRhdGlv
biA9IDE4MDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRT3JpZW50YXRpb25SZWFkaW5nOjpM
ZWZ0VXA6CisgICAgICAgIG9yaWVudGF0aW9uID0gLTkwOworICAgICAgICBicmVhazsKKyAgICBj
YXNlIFFPcmllbnRhdGlvblJlYWRpbmc6OlJpZ2h0VXA6CisgICAgICAgIG9yaWVudGF0aW9uID0g
OTA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUU9yaWVudGF0aW9uUmVhZGluZzo6RmFjZVVw
OgorICAgIGNhc2UgUU9yaWVudGF0aW9uUmVhZGluZzo6RmFjZURvd246CisgICAgICAgIC8vIFdl
YkNvcmUgdW5hYmxlIHRvIGhhbmRsZSBpdAorICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybjsK
KyAgICB9CisgICAgZnJhbWUtPnNlbmRPcmllbnRhdGlvbkNoYW5nZUV2ZW50KG9yaWVudGF0aW9u
KTsKKyNlbmRpZgorfQorCitRTGlzdDxRT2JqZWN0Kj4gUVdlYkZyYW1lQWRhcHRlcjo6Y2hpbGRG
cmFtZXMoKSBjb25zdAoreworICAgIFFMaXN0PFFPYmplY3QqPiBvcmlnaW5hdGluZ09iamVjdHM7
CisgICAgaWYgKGZyYW1lKSB7CisgICAgICAgIEZyYW1lVHJlZSogdHJlZSA9IGZyYW1lLT50cmVl
KCk7CisgICAgICAgIGZvciAoRnJhbWUqIGNoaWxkID0gdHJlZS0+Zmlyc3RDaGlsZCgpOyBjaGls
ZDsgY2hpbGQgPSBjaGlsZC0+dHJlZSgpLT5uZXh0U2libGluZygpKSB7CisgICAgICAgICAgICBG
cmFtZUxvYWRlciogbG9hZGVyID0gY2hpbGQtPmxvYWRlcigpOworICAgICAgICAgICAgb3JpZ2lu
YXRpbmdPYmplY3RzLmFwcGVuZChsb2FkZXItPm5ldHdvcmtpbmdDb250ZXh0KCktPm9yaWdpbmF0
aW5nT2JqZWN0KCkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBvcmlnaW5hdGluZ09i
amVjdHM7Cit9CisKK2Jvb2wgUVdlYkZyYW1lQWRhcHRlcjo6aGFzRm9jdXMoKSBjb25zdAorewor
ICAgIEZyYW1lKiBmZiA9IGZyYW1lLT5wYWdlKCktPmZvY3VzQ29udHJvbGxlcigpLT5mb2N1c2Vk
RnJhbWUoKTsKKyAgICByZXR1cm4gZmYgJiYgUVdlYkZyYW1lQWRhcHRlcjo6a2l0KGZmKSA9PSB0
aGlzOworfQorCit2b2lkIFFXZWJGcmFtZUFkYXB0ZXI6OnNldEZvY3VzKCkKK3sKKyAgICBmcmFt
ZS0+cGFnZSgpLT5mb2N1c0NvbnRyb2xsZXIoKS0+c2V0Rm9jdXNlZEZyYW1lKGZyYW1lKTsKK30K
Kwordm9pZCBRV2ViRnJhbWVBZGFwdGVyOjpzZXRTY3JvbGxCYXJQb2xpY3koUXQ6Ok9yaWVudGF0
aW9uIG9yaWVudGF0aW9uLCBRdDo6U2Nyb2xsQmFyUG9saWN5IHBvbGljeSkKK3sKKyAgICBRX0FT
U0VSVCgoaW50KVNjcm9sbGJhckF1dG8gPT0gKGludClRdDo6U2Nyb2xsQmFyQXNOZWVkZWQpOwor
ICAgIFFfQVNTRVJUKChpbnQpU2Nyb2xsYmFyQWx3YXlzT2ZmID09IChpbnQpUXQ6OlNjcm9sbEJh
ckFsd2F5c09mZik7CisgICAgUV9BU1NFUlQoKGludClTY3JvbGxiYXJBbHdheXNPbiA9PSAoaW50
KVF0OjpTY3JvbGxCYXJBbHdheXNPbik7CisKKyAgICBpZiAob3JpZW50YXRpb24gPT0gUXQ6Okhv
cml6b250YWwpIHsKKyAgICAgICAgaG9yaXpvbnRhbFNjcm9sbEJhclBvbGljeSA9IHBvbGljeTsK
KyAgICAgICAgaWYgKGZyYW1lLT52aWV3KCkpIHsKKyAgICAgICAgICAgIGZyYW1lLT52aWV3KCkt
PnNldEhvcml6b250YWxTY3JvbGxiYXJNb2RlKChTY3JvbGxiYXJNb2RlKXBvbGljeSwgcG9saWN5
ICE9IFF0OjpTY3JvbGxCYXJBc05lZWRlZCAvKiBsb2NrICovKTsKKyAgICAgICAgICAgIGZyYW1l
LT52aWV3KCktPnVwZGF0ZUNhbkhhdmVTY3JvbGxiYXJzKCk7CisgICAgICAgIH0KKyAgICB9IGVs
c2UgeworICAgICAgICB2ZXJ0aWNhbFNjcm9sbEJhclBvbGljeSA9IHBvbGljeTsKKyAgICAgICAg
aWYgKGZyYW1lLT52aWV3KCkpIHsKKyAgICAgICAgICAgIGZyYW1lLT52aWV3KCktPnNldFZlcnRp
Y2FsU2Nyb2xsYmFyTW9kZSgoU2Nyb2xsYmFyTW9kZSlwb2xpY3ksIHBvbGljeSAhPSBRdDo6U2Ny
b2xsQmFyQXNOZWVkZWQgLyogbG9jayAqLyk7CisgICAgICAgICAgICBmcmFtZS0+dmlldygpLT51
cGRhdGVDYW5IYXZlU2Nyb2xsYmFycygpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFFX
ZWJGcmFtZUFkYXB0ZXI6OnNjcm9sbFRvQW5jaG9yKGNvbnN0IFFTdHJpbmcgJmFuY2hvcikKK3sK
KyAgICBGcmFtZVZpZXcqIHZpZXcgPSBmcmFtZS0+dmlldygpOworICAgIGlmICh2aWV3KQorICAg
ICAgICB2aWV3LT5zY3JvbGxUb0FuY2hvcihhbmNob3IpOworfQorCit2b2lkIFFXZWJGcmFtZUFk
YXB0ZXI6OnNjcm9sbEJ5KGludCBkeCwgaW50IGR5KQoreworICAgIGlmICghZnJhbWUtPnZpZXco
KSkKKyAgICAgICAgcmV0dXJuOworICAgIGZyYW1lLT52aWV3KCktPnNjcm9sbEJ5KEludFNpemUo
ZHgsIGR5KSk7Cit9CisKK3ZvaWQgUVdlYkZyYW1lQWRhcHRlcjo6c2V0U2Nyb2xsQmFyVmFsdWUo
UXQ6Ok9yaWVudGF0aW9uIG9yaWVudGF0aW9uLCBpbnQgdmFsdWUpCit7CisgICAgU2Nyb2xsYmFy
KiBzYjsKKyAgICBzYiA9IChvcmllbnRhdGlvbiA9PSBRdDo6SG9yaXpvbnRhbCkgPyBob3Jpem9u
dGFsU2Nyb2xsQmFyKCkgOiB2ZXJ0aWNhbFNjcm9sbEJhcigpOworICAgIGlmIChzYikgeworICAg
ICAgICBpZiAodmFsdWUgPCAwKQorICAgICAgICAgICAgdmFsdWUgPSAwOworICAgICAgICBlbHNl
IGlmICh2YWx1ZSA+IHNjcm9sbEJhck1heGltdW0ob3JpZW50YXRpb24pKQorICAgICAgICAgICAg
dmFsdWUgPSBzY3JvbGxCYXJNYXhpbXVtKG9yaWVudGF0aW9uKTsKKyAgICAgICAgc2ItPnNjcm9s
bGFibGVBcmVhKCktPnNjcm9sbFRvT2Zmc2V0V2l0aG91dEFuaW1hdGlvbihvcmllbnRhdGlvbiA9
PSBRdDo6SG9yaXpvbnRhbCA/IEhvcml6b250YWxTY3JvbGxiYXIgOiBWZXJ0aWNhbFNjcm9sbGJh
ciwgdmFsdWUpOworICAgIH0KK30KKworaW50IFFXZWJGcmFtZUFkYXB0ZXI6OnNjcm9sbEJhclZh
bHVlKFF0OjpPcmllbnRhdGlvbiBvcmllbnRhdGlvbikgY29uc3QKK3sKKyAgICBTY3JvbGxiYXIq
IHNiOworICAgIHNiID0gKG9yaWVudGF0aW9uID09IFF0OjpIb3Jpem9udGFsKSA/IGhvcml6b250
YWxTY3JvbGxCYXIoKSA6IHZlcnRpY2FsU2Nyb2xsQmFyKCk7CisgICAgaWYgKHNiKQorICAgICAg
ICByZXR1cm4gc2ItPnZhbHVlKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBRV2ViRnJhbWVB
ZGFwdGVyOjpzY3JvbGxCYXJNYXhpbXVtKFF0OjpPcmllbnRhdGlvbiBvcmllbnRhdGlvbikgY29u
c3QKK3sKKyAgICBTY3JvbGxiYXIqIHNiOworICAgIHNiID0gKG9yaWVudGF0aW9uID09IFF0OjpI
b3Jpem9udGFsKSA/IGhvcml6b250YWxTY3JvbGxCYXIoKSA6IHZlcnRpY2FsU2Nyb2xsQmFyKCk7
CisgICAgaWYgKHNiKQorICAgICAgICByZXR1cm4gc2ItPm1heGltdW0oKTsKKyAgICByZXR1cm4g
MDsKK30KKworUVJlY3QgUVdlYkZyYW1lQWRhcHRlcjo6c2Nyb2xsQmFyR2VvbWV0cnkoUXQ6Ok9y
aWVudGF0aW9uIG9yaWVudGF0aW9uKSBjb25zdAoreworICAgIFNjcm9sbGJhciogc2I7CisgICAg
c2IgPSAob3JpZW50YXRpb24gPT0gUXQ6Okhvcml6b250YWwpID8gaG9yaXpvbnRhbFNjcm9sbEJh
cigpIDogdmVydGljYWxTY3JvbGxCYXIoKTsKKyAgICBpZiAoc2IpCisgICAgICAgIHJldHVybiBz
Yi0+ZnJhbWVSZWN0KCk7CisgICAgcmV0dXJuIFFSZWN0KCk7Cit9CisKK1dlYkNvcmU6OlNjcm9s
bGJhciogUVdlYkZyYW1lQWRhcHRlcjo6aG9yaXpvbnRhbFNjcm9sbEJhcigpIGNvbnN0Cit7Cisg
ICAgaWYgKCFmcmFtZS0+dmlldygpKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gZnJh
bWUtPnZpZXcoKS0+aG9yaXpvbnRhbFNjcm9sbGJhcigpOworfQorCitXZWJDb3JlOjpTY3JvbGxi
YXIqIFFXZWJGcmFtZUFkYXB0ZXI6OnZlcnRpY2FsU2Nyb2xsQmFyKCkgY29uc3QKK3sKKyAgICBp
ZiAoIWZyYW1lLT52aWV3KCkpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBmcmFtZS0+
dmlldygpLT52ZXJ0aWNhbFNjcm9sbGJhcigpOworfQorCisKK3ZvaWQgUVdlYkZyYW1lQWRhcHRl
cjo6dXBkYXRlQmFja2dyb3VuZFJlY3Vyc2l2ZWx5KGNvbnN0IFFDb2xvciYgYmFja2dyb3VuZENv
bG9yKQoreworICAgIEFTU0VSVChmcmFtZS0+dmlldygpKTsKKyAgICBmcmFtZS0+dmlldygpLT51
cGRhdGVCYWNrZ3JvdW5kUmVjdXJzaXZlbHkoYmFja2dyb3VuZENvbG9yLCAvKnRyYW5zcGFyZW50
Ki8gIWJhY2tncm91bmRDb2xvci5hbHBoYSgpKTsKK30KKwordm9pZCBRV2ViRnJhbWVBZGFwdGVy
OjpjYW5jZWxMb2FkKCkKK3sKKyAgICBmcmFtZS0+bmF2aWdhdGlvblNjaGVkdWxlcigpLT5jYW5j
ZWwoKTsKK30KKworLy8gPT09PT09PT09PSBRV2ViSGl0VGVzdFJlc3VsdFByaXZhdGUgaW1wbGVt
ZW50YXRpb24gPT09PT09PT09PT0KKworUVdlYkhpdFRlc3RSZXN1bHRQcml2YXRlOjpRV2ViSGl0
VGVzdFJlc3VsdFByaXZhdGUoY29uc3QgV2ViQ29yZTo6SGl0VGVzdFJlc3VsdCAmaGl0VGVzdCkK
KyAgICA6IGlzQ29udGVudEVkaXRhYmxlKGZhbHNlKQorICAgICwgaXNDb250ZW50U2VsZWN0ZWQo
ZmFsc2UpCisgICAgLCBpc1Njcm9sbEJhcihmYWxzZSkKKyAgICAsIHdlYkNvcmVGcmFtZSgwKQor
eworICAgIGlmICghaGl0VGVzdC5pbm5lck5vZGUoKSkKKyAgICAgICAgcmV0dXJuOworICAgIHBv
cyA9IGhpdFRlc3Qucm91bmRlZFBvaW50SW5Jbm5lck5vZGVGcmFtZSgpOworICAgIFdlYkNvcmU6
OlRleHREaXJlY3Rpb24gZGlyOworICAgIHRpdGxlID0gaGl0VGVzdC50aXRsZShkaXIpOworICAg
IGxpbmtUZXh0ID0gaGl0VGVzdC50ZXh0Q29udGVudCgpOworICAgIGxpbmtVcmwgPSBoaXRUZXN0
LmFic29sdXRlTGlua1VSTCgpOworICAgIGxpbmtUaXRsZSA9IGhpdFRlc3QudGl0bGVEaXNwbGF5
U3RyaW5nKCk7CisgICAgYWx0ZXJuYXRlVGV4dCA9IGhpdFRlc3QuYWx0RGlzcGxheVN0cmluZygp
OworICAgIGltYWdlVXJsID0gaGl0VGVzdC5hYnNvbHV0ZUltYWdlVVJMKCk7CisgICAgaW5uZXJO
b2RlID0gaGl0VGVzdC5pbm5lck5vZGUoKTsKKyAgICBpbm5lck5vZGUtPnJlZigpOworICAgIGlu
bmVyTm9uU2hhcmVkTm9kZSA9IGhpdFRlc3QuaW5uZXJOb25TaGFyZWROb2RlKCk7CisgICAgaW5u
ZXJOb25TaGFyZWROb2RlLT5yZWYoKTsKKyAgICBib3VuZGluZ1JlY3QgPSBpbm5lck5vblNoYXJl
ZE5vZGUgPyBpbm5lck5vblNoYXJlZE5vZGUtPnJlbmRlcmVyKCktPmFic29sdXRlQm91bmRpbmdC
b3hSZWN0KCkgOiBJbnRSZWN0KCk7CisgICAgV2ViQ29yZTo6SW1hZ2UgKmltZyA9IGhpdFRlc3Qu
aW1hZ2UoKTsKKyAgICBpZiAoaW1nKSB7CisgICAgICAgIFFQaXhtYXAqIHBpeCA9IGltZy0+bmF0
aXZlSW1hZ2VGb3JDdXJyZW50RnJhbWUoKTsKKyAgICAgICAgaWYgKHBpeCkKKyAgICAgICAgICAg
IHBpeG1hcCA9ICpwaXg7CisgICAgfQorICAgIFdlYkNvcmU6OkZyYW1lICp3ZnJhbWUgPSBoaXRU
ZXN0LnRhcmdldEZyYW1lKCk7CisgICAgaWYgKHdmcmFtZSkgeworICAgICAgICBsaW5rVGFyZ2V0
RnJhbWUgPSBRV2ViRnJhbWVBZGFwdGVyOjpraXQod2ZyYW1lKS0+aGFuZGxlKCk7CisgICAgICAg
IHdlYkNvcmVGcmFtZSA9IHdmcmFtZTsKKyAgICAgICAgd2ViQ29yZUZyYW1lLT5yZWYoKTsKKyAg
ICB9CisgICAgbGlua0VsZW1lbnQgPSBRV2ViRWxlbWVudChoaXRUZXN0LlVSTEVsZW1lbnQoKSk7
CisKKyAgICBpc0NvbnRlbnRFZGl0YWJsZSA9IGhpdFRlc3QuaXNDb250ZW50RWRpdGFibGUoKTsK
KyAgICBpc0NvbnRlbnRTZWxlY3RlZCA9IGhpdFRlc3QuaXNTZWxlY3RlZCgpOworICAgIGlzU2Ny
b2xsQmFyID0gaGl0VGVzdC5zY3JvbGxiYXIoKTsKKworICAgIFdlYkNvcmU6OkZyYW1lICppbm5l
ck5vZGVGcmFtZSA9IGhpdFRlc3QuaW5uZXJOb2RlRnJhbWUoKTsKKyAgICBpZiAoaW5uZXJOb2Rl
RnJhbWUpCisgICAgICAgIGZyYW1lID0gUVdlYkZyYW1lQWRhcHRlcjo6a2l0KGlubmVyTm9kZUZy
YW1lKS0+aGFuZGxlKCk7CisKKyAgICBlbmNsb3NpbmdCbG9jayA9IFFXZWJFbGVtZW50KFdlYkNv
cmU6OmVuY2xvc2luZ0Jsb2NrKGlubmVyTm9kZSkpOworfQorCitRV2ViSGl0VGVzdFJlc3VsdFBy
aXZhdGU6OlFXZWJIaXRUZXN0UmVzdWx0UHJpdmF0ZShjb25zdCBRV2ViSGl0VGVzdFJlc3VsdFBy
aXZhdGUmIG90aGVyKQoreworICAgIGlubmVyTm9kZSA9IDA7CisgICAgaW5uZXJOb25TaGFyZWRO
b2RlID0gMDsKKyAgICB3ZWJDb3JlRnJhbWUgPSAwOworICAgICp0aGlzID0gb3RoZXI7Cit9CisK
K1FXZWJIaXRUZXN0UmVzdWx0UHJpdmF0ZSYgUVdlYkhpdFRlc3RSZXN1bHRQcml2YXRlOjpvcGVy
YXRvcj0oY29uc3QgUVdlYkhpdFRlc3RSZXN1bHRQcml2YXRlJiBvdGhlcikKK3sKKyAgICBwb3Mg
PSBvdGhlci5wb3M7CisgICAgYm91bmRpbmdSZWN0ID0gb3RoZXIuYm91bmRpbmdSZWN0OworICAg
IGVuY2xvc2luZ0Jsb2NrID0gb3RoZXIuZW5jbG9zaW5nQmxvY2s7CisgICAgdGl0bGUgPSBvdGhl
ci50aXRsZTsKKyAgICBsaW5rVGV4dCA9IG90aGVyLmxpbmtUZXh0OworICAgIGxpbmtVcmwgPSBv
dGhlci5saW5rVXJsOworICAgIGxpbmtUaXRsZSA9IG90aGVyLmxpbmtUaXRsZTsKKyAgICBsaW5r
VGFyZ2V0RnJhbWUgPSBvdGhlci5saW5rVGFyZ2V0RnJhbWU7CisgICAgbGlua0VsZW1lbnQgPSBv
dGhlci5saW5rRWxlbWVudDsKKyAgICBhbHRlcm5hdGVUZXh0ID0gb3RoZXIuYWx0ZXJuYXRlVGV4
dDsKKyAgICBpbWFnZVVybCA9IG90aGVyLmltYWdlVXJsOworICAgIHBpeG1hcCA9IG90aGVyLnBp
eG1hcDsKKyAgICBpc0NvbnRlbnRFZGl0YWJsZSA9IG90aGVyLmlzQ29udGVudEVkaXRhYmxlOwor
ICAgIGlzQ29udGVudFNlbGVjdGVkID0gb3RoZXIuaXNDb250ZW50U2VsZWN0ZWQ7CisgICAgaXNT
Y3JvbGxCYXIgPSBvdGhlci5pc1Njcm9sbEJhcjsKKyAgICBmcmFtZSA9IG90aGVyLmZyYW1lOwor
CisgICAgaWYgKGlubmVyTm9kZSkKKyAgICAgICAgaW5uZXJOb2RlLT5kZXJlZigpOworICAgIGlu
bmVyTm9kZSA9IG90aGVyLmlubmVyTm9kZTsKKyAgICBpZiAoaW5uZXJOb2RlKQorICAgICAgICBp
bm5lck5vZGUtPnJlZigpOworCisgICAgaWYgKGlubmVyTm9uU2hhcmVkTm9kZSkKKyAgICAgICAg
aW5uZXJOb25TaGFyZWROb2RlLT5kZXJlZigpOworICAgIGlubmVyTm9uU2hhcmVkTm9kZSA9IG90
aGVyLmlubmVyTm9uU2hhcmVkTm9kZTsKKyAgICBpZiAoaW5uZXJOb25TaGFyZWROb2RlKQorICAg
ICAgICBpbm5lck5vblNoYXJlZE5vZGUtPnJlZigpOworCisgICAgaWYgKHdlYkNvcmVGcmFtZSkK
KyAgICAgICAgd2ViQ29yZUZyYW1lLT5kZXJlZigpOworICAgIHdlYkNvcmVGcmFtZSA9IG90aGVy
LndlYkNvcmVGcmFtZTsKKyAgICBpZiAod2ViQ29yZUZyYW1lKQorICAgICAgICB3ZWJDb3JlRnJh
bWUtPnJlZigpOworCisgICAgcmV0dXJuICp0aGlzOworfQorCitRV2ViSGl0VGVzdFJlc3VsdFBy
aXZhdGU6On5RV2ViSGl0VGVzdFJlc3VsdFByaXZhdGUoKQoreworICAgIGlmIChpbm5lck5vZGUp
CisgICAgICAgIGlubmVyTm9kZS0+ZGVyZWYoKTsKKyAgICBpZiAoaW5uZXJOb25TaGFyZWROb2Rl
KQorICAgICAgICBpbm5lck5vblNoYXJlZE5vZGUtPmRlcmVmKCk7CisgICAgaWYgKHdlYkNvcmVG
cmFtZSkKKyAgICAgICAgd2ViQ29yZUZyYW1lLT5kZXJlZigpOworfQorCitRV2ViRWxlbWVudCBR
V2ViSGl0VGVzdFJlc3VsdFByaXZhdGU6OmVsZW1lbnRGb3JJbm5lck5vZGUoKSBjb25zdAorewor
ICAgIGlmICghaW5uZXJOb25TaGFyZWROb2RlIHx8ICFpbm5lck5vblNoYXJlZE5vZGUtPmlzRWxl
bWVudE5vZGUoKSkKKyAgICAgICAgcmV0dXJuIFFXZWJFbGVtZW50KCk7CisgICAgcmV0dXJuIFFX
ZWJFbGVtZW50KHN0YXRpY19jYXN0PEVsZW1lbnQqPihpbm5lck5vblNoYXJlZE5vZGUpKTsKK30K
KworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09CisKK1FTaXplIFFXZWJGcmFtZUFkYXB0ZXI6OmN1c3RvbUxheW91dFNpemUoKSBjb25zdAor
eworICAgIEFTU0VSVChwYWdlQWRhcHRlci0+bWFpbkZyYW1lQWRhcHRlcigpID09IHRoaXMpOwor
ICAgIEZyYW1lVmlldyogdmlldyA9IGZyYW1lLT52aWV3KCk7CisgICAgQVNTRVJUKHZpZXcpOwor
ICAgIGlmICh2aWV3LT51c2VGaXhlZExheW91dCgpKQorICAgICAgICByZXR1cm4gdmlldy0+Zml4
ZWRMYXlvdXRTaXplKCk7CisgICAgcmV0dXJuIFFTaXplKCk7Cit9CisKK3ZvaWQgUVdlYkZyYW1l
QWRhcHRlcjo6c2V0Q3VzdG9tTGF5b3V0U2l6ZShjb25zdCBRU2l6ZSYgc2l6ZSkKK3sKKyAgICBB
U1NFUlQocGFnZUFkYXB0ZXItPm1haW5GcmFtZUFkYXB0ZXIoKSA9PSB0aGlzKTsKKyAgICBGcmFt
ZVZpZXcqIHZpZXcgPSBmcmFtZS0+dmlldygpOworICAgIEFTU0VSVCh2aWV3KTsKKworICAgIGlm
IChzaXplLmlzVmFsaWQoKSkgeworICAgICAgICB2aWV3LT5zZXRVc2VGaXhlZExheW91dCh0cnVl
KTsKKyAgICAgICAgdmlldy0+c2V0Rml4ZWRMYXlvdXRTaXplKHNpemUpOworICAgIH0gZWxzZSBp
ZiAodmlldy0+dXNlRml4ZWRMYXlvdXQoKSkKKyAgICAgICAgdmlldy0+c2V0VXNlRml4ZWRMYXlv
dXQoZmFsc2UpOworCisgICAgdmlldy0+bGF5b3V0KCk7Cit9CisKK3ZvaWQgUVdlYkZyYW1lQWRh
cHRlcjo6c2V0Rml4ZWRWaXNpYmxlQ29udGVudFJlY3QoY29uc3QgUVJlY3QmIHJlY3QpCit7Cisg
ICAgQVNTRVJUKHBhZ2VBZGFwdGVyLT5tYWluRnJhbWVBZGFwdGVyKCkgPT0gdGhpcyk7CisgICAg
RnJhbWVWaWV3KiB2aWV3ID0gZnJhbWUtPnZpZXcoKTsKKyAgICBBU1NFUlQodmlldyk7CisgICAg
dmlldy0+c2V0Rml4ZWRWaXNpYmxlQ29udGVudFJlY3QocmVjdCk7Cit9CisKK3ZvaWQgUVdlYkZy
YW1lQWRhcHRlcjo6c2V0Vmlld3BvcnRTaXplKGNvbnN0IFFTaXplJiBzaXplKQoreworICAgIEFT
U0VSVChwYWdlQWRhcHRlci0+bWFpbkZyYW1lQWRhcHRlcigpID09IHRoaXMpOworICAgIEZyYW1l
VmlldyogdmlldyA9IGZyYW1lLT52aWV3KCk7CisgICAgQVNTRVJUKHZpZXcpOworICAgIHZpZXct
PnJlc2l6ZShzaXplKTsKKyAgICB2aWV3LT5hZGp1c3RWaWV3U2l6ZSgpOworfQorCisKK3ZvaWQg
UVdlYkZyYW1lQWRhcHRlcjo6c2V0UGFpbnRzRW50aXJlQ29udGVudHMoYm9vbCByZXNpemVzVG9D
b250ZW50cykKK3sKKyAgICBBU1NFUlQocGFnZUFkYXB0ZXItPm1haW5GcmFtZUFkYXB0ZXIoKSA9
PSB0aGlzKTsKKyAgICBBU1NFUlQoZnJhbWUtPnZpZXcoKSk7CisgICAgZnJhbWUtPnZpZXcoKS0+
c2V0UGFpbnRzRW50aXJlQ29udGVudHMocmVzaXplc1RvQ29udGVudHMpOworfQorCit2b2lkIFFX
ZWJGcmFtZUFkYXB0ZXI6OnNldERlbGVnYXRlc1Njcm9sbGluZyhib29sIHJlc2l6ZXNUb0NvbnRl
bnRzKQoreworICAgIEFTU0VSVChwYWdlQWRhcHRlci0+bWFpbkZyYW1lQWRhcHRlcigpID09IHRo
aXMpOworICAgIEFTU0VSVChmcmFtZS0+dmlldygpKTsKKyAgICBmcmFtZS0+dmlldygpLT5zZXRE
ZWxlZ2F0ZXNTY3JvbGxpbmcocmVzaXplc1RvQ29udGVudHMpOworfQpkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9RV2ViRnJhbWVBZGFwdGVyLmggYi9Tb3VyY2Uv
V2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L1FXZWJGcmFtZUFkYXB0ZXIuaAppbmRleCAxN2M0MWQ1
MzkzNWVhYmM0MjE5M2JjMWZiNzQyODVmYTE0NjBiMGNjLi5jM2M3OGVhZGQyYzNjMGI1NmVkMmZh
OGJiYmRlZThmYzcwNzc5YThlIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVT
dXBwb3J0L1FXZWJGcmFtZUFkYXB0ZXIuaAorKysgYi9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVT
dXBwb3J0L1FXZWJGcmFtZUFkYXB0ZXIuaApAQCAtMjIsMTcgKzIyLDI1IEBACiAKICNpbmNsdWRl
ICJGcmFtZUxvYWRlckNsaWVudFF0LmgiCiAjaW5jbHVkZSAiUGxhdGZvcm1FdmVudC5oIgorI2lm
IEVOQUJMRShPUklFTlRBVElPTl9FVkVOVFMpCisjaW5jbHVkZSAicW9yaWVudGF0aW9uc2Vuc29y
LmgiCisjZW5kaWYgLy8gRU5BQkxFKE9SSUVOVEFUSU9OX0VWRU5UUykuCisjaW5jbHVkZSAicXdl
YmVsZW1lbnQuaCIKIAotI2luY2x1ZGUgPEZyYW1lVmlldy5oPgotI2luY2x1ZGUgPEludFJlY3Qu
aD4KLSNpbmNsdWRlIDxJbnRTaXplLmg+Ci0jaW5jbHVkZSA8S1VSTC5oPgotCisjaW5jbHVkZSA8
UUxpc3Q+CiAjaW5jbHVkZSA8UU5ldHdvcmtBY2Nlc3NNYW5hZ2VyPgorI2luY2x1ZGUgPFFSZWN0
PgogI2luY2x1ZGUgPFFTaXplPgorI2luY2x1ZGUgPFFVcmw+CisjaW5jbHVkZSA8d3RmL0V4cG9y
dE1hY3Jvcy5oPgorI2luY2x1ZGUgPHd0Zi9SZWZQdHIuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9X
VEZTdHJpbmcuaD4KIAogbmFtZXNwYWNlIFdlYkNvcmUgewogY2xhc3MgRnJhbWU7CitjbGFzcyBH
cmFwaGljc0NvbnRleHQ7CitjbGFzcyBJbnRSZWN0OworY2xhc3MgVGV4dHVyZU1hcHBlckxheWVy
OwogfQogCiBRVF9CRUdJTl9OQU1FU1BBQ0UKQEAgLTQ0LDYgKzUyLDQ3IEBAIGNsYXNzIFFHZXN0
dXJlRXZlbnRGYWNhZGU7CiAjZW5kaWYKIGNsYXNzIFFXZWJGcmFtZTsKIGNsYXNzIFFXZWJQYWdl
QWRhcHRlcjsKK2NsYXNzIFFXZWJTZWN1cml0eU9yaWdpbjsKKworY2xhc3MgV0VCS0lUX0VYUE9S
VERBVEEgUVdlYkhpdFRlc3RSZXN1bHRQcml2YXRlIHsKK3B1YmxpYzoKKyAgICBRV2ViSGl0VGVz
dFJlc3VsdFByaXZhdGUoKQorICAgICAgICA6IGlzQ29udGVudEVkaXRhYmxlKGZhbHNlKQorICAg
ICAgICAsIGlzQ29udGVudFNlbGVjdGVkKGZhbHNlKSwgaXNTY3JvbGxCYXIoZmFsc2UpCisgICAg
ICAgICwgaW5uZXJOb2RlKDApCisgICAgICAgICwgaW5uZXJOb25TaGFyZWROb2RlKDApCisgICAg
ICAgICwgd2ViQ29yZUZyYW1lKDApCisgICAgeyB9CisgICAgUVdlYkhpdFRlc3RSZXN1bHRQcml2
YXRlKGNvbnN0IFdlYkNvcmU6OkhpdFRlc3RSZXN1bHQgJik7CisgICAgUVdlYkhpdFRlc3RSZXN1
bHRQcml2YXRlKGNvbnN0IFFXZWJIaXRUZXN0UmVzdWx0UHJpdmF0ZSYpOworICAgIFFXZWJIaXRU
ZXN0UmVzdWx0UHJpdmF0ZSYgb3BlcmF0b3I9KGNvbnN0IFFXZWJIaXRUZXN0UmVzdWx0UHJpdmF0
ZSYpOworICAgIH5RV2ViSGl0VGVzdFJlc3VsdFByaXZhdGUoKTsKKworICAgIFFXZWJFbGVtZW50
IGVsZW1lbnRGb3JJbm5lck5vZGUoKSBjb25zdDsKKworICAgIFFQb2ludCBwb3M7CisgICAgUVJl
Y3QgYm91bmRpbmdSZWN0OworICAgIFFXZWJFbGVtZW50IGVuY2xvc2luZ0Jsb2NrOworICAgIFFT
dHJpbmcgdGl0bGU7CisgICAgUVN0cmluZyBsaW5rVGV4dDsKKyAgICBRVXJsIGxpbmtVcmw7Cisg
ICAgUVN0cmluZyBsaW5rVGl0bGU7CisgICAgUVBvaW50ZXI8UU9iamVjdD4gbGlua1RhcmdldEZy
YW1lOworICAgIFFXZWJFbGVtZW50IGxpbmtFbGVtZW50OworICAgIFFTdHJpbmcgYWx0ZXJuYXRl
VGV4dDsKKyAgICBRVXJsIGltYWdlVXJsOworICAgIFFQaXhtYXAgcGl4bWFwOworICAgIGJvb2wg
aXNDb250ZW50RWRpdGFibGU7CisgICAgYm9vbCBpc0NvbnRlbnRTZWxlY3RlZDsKKyAgICBib29s
IGlzU2Nyb2xsQmFyOworICAgIFFQb2ludGVyPFFPYmplY3Q+IGZyYW1lOworcHJpdmF0ZToKKyAg
ICBXZWJDb3JlOjpOb2RlKiBpbm5lck5vZGU7CisgICAgV2ViQ29yZTo6Tm9kZSogaW5uZXJOb25T
aGFyZWROb2RlOworICAgIFdlYkNvcmU6OkZyYW1lKiB3ZWJDb3JlRnJhbWU7CisgICAgZnJpZW5k
IGNsYXNzIFFXZWJGcmFtZUFkYXB0ZXI7CisgICAgZnJpZW5kIGNsYXNzIFFXZWJQYWdlQWRhcHRl
cjsKK307CiAKIGNsYXNzIFFXZWJGcmFtZURhdGEgewogcHVibGljOgpAQCAtNjEsOCArMTEwLDIy
IEBAIHB1YmxpYzoKICAgICBpbnQgbWFyZ2luSGVpZ2h0OwogfTsKIAotY2xhc3MgUVdlYkZyYW1l
QWRhcHRlciB7CitjbGFzcyBXRUJLSVRfRVhQT1JUREFUQSBRV2ViRnJhbWVBZGFwdGVyIHsKIHB1
YmxpYzoKKyAgICBlbnVtIFZhbHVlT3duZXJzaGlwIHsKKyAgICAgICAgUXRPd25lcnNoaXAsCisg
ICAgICAgIFNjcmlwdE93bmVyc2hpcCwKKyAgICAgICAgQXV0b093bmVyc2hpcAorICAgIH07CisK
KyAgICBlbnVtIFJlbmRlckxheWVycyB7CisgICAgICAgIENvbnRlbnRzTGF5ZXIgPSAweDEwLAor
ICAgICAgICBTY3JvbGxCYXJMYXllciA9IDB4MjAsCisgICAgICAgIFBhbkljb25MYXllciA9IDB4
NDAsCisKKyAgICAgICAgQWxsTGF5ZXJzID0gMHhmZgorICAgIH07CisKICAgICBzdGF0aWMgUVVy
bCBlbnN1cmVBYnNvbHV0ZVVybChjb25zdCBRVXJsJik7CiAKICAgICBRV2ViRnJhbWVBZGFwdGVy
KCk7CkBAIC04MywyOCArMTQ2LDEwMCBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCBRV2ViRnJhbWVB
ZGFwdGVyKiBjcmVhdGVDaGlsZEZyYW1lKFFXZWJGcmFtZURhdGEqKSA9IDA7CiAKICAgICB2b2lk
IGxvYWQoY29uc3QgUU5ldHdvcmtSZXF1ZXN0JiwgUU5ldHdvcmtBY2Nlc3NNYW5hZ2VyOjpPcGVy
YXRpb24gPSBRTmV0d29ya0FjY2Vzc01hbmFnZXI6OkdldE9wZXJhdGlvbiwgY29uc3QgUUJ5dGVB
cnJheSYgYm9keSA9IFFCeXRlQXJyYXkoKSk7Ci0gICAgaW5saW5lIGJvb2wgaGFzVmlldygpIGNv
bnN0IHsgcmV0dXJuIGZyYW1lICYmIGZyYW1lLT52aWV3KCk7IH0KKyAgICBib29sIGhhc1ZpZXco
KSBjb25zdDsKICNpZiBFTkFCTEUoR0VTVFVSRV9FVkVOVFMpCiAgICAgdm9pZCBoYW5kbGVHZXN0
dXJlRXZlbnQoUUdlc3R1cmVFdmVudEZhY2FkZSopOwogI2VuZGlmCiAgICAgUVdlYkZyYW1lQWRh
cHRlciogY3JlYXRlRnJhbWUoUVdlYkZyYW1lRGF0YSopOwogCi0gICAgV2ViQ29yZTo6SW50U2l6
ZSBzY3JvbGxQb3NpdGlvbigpIGNvbnN0OwotICAgIFdlYkNvcmU6OkludFJlY3QgZnJhbWVSZWN0
KCkgY29uc3Q7CisgICAgUVZhcmlhbnQgZXZhbHVhdGVKYXZhU2NyaXB0KGNvbnN0IFFTdHJpbmcm
IHNjcmlwdFNvdXJjZSk7CisgICAgdm9pZCBhZGRUb0phdmFTY3JpcHRXaW5kb3dPYmplY3QoY29u
c3QgUVN0cmluZyYgbmFtZSwgUU9iamVjdCosIFZhbHVlT3duZXJzaGlwKTsKKworICAgIFFTdHJp
bmcgdG9IdG1sKCkgY29uc3Q7CisgICAgUVN0cmluZyB0b1BsYWluVGV4dCgpIGNvbnN0OworCisg
ICAgdm9pZCBzZXRDb250ZW50KGNvbnN0IFFCeXRlQXJyYXkmIGRhdGEsIGNvbnN0IFFTdHJpbmcm
IG1pbWVUeXBlLCBjb25zdCBRVXJsJiBiYXNlVXJsKTsKKyAgICB2b2lkIHNldEh0bWwoY29uc3Qg
UVN0cmluZyYgaHRtbCwgY29uc3QgUVVybCYgYmFzZVVybCk7CisKKyAgICBRTXVsdGlNYXA8UVN0
cmluZywgUVN0cmluZz4gbWV0YURhdGEoKSBjb25zdDsKKworICAgIFFXZWJIaXRUZXN0UmVzdWx0
UHJpdmF0ZSogaGl0VGVzdENvbnRlbnQoY29uc3QgUVBvaW50JikgY29uc3Q7CisgICAgUVdlYkVs
ZW1lbnQgZG9jdW1lbnRFbGVtZW50KCkgY29uc3Q7CisgICAgUVN0cmluZyB0aXRsZSgpIGNvbnN0
OworICAgIHZvaWQgY2xlYXJDb3JlRnJhbWUoKTsKKyAgICBRVXJsIGJhc2VVcmwoKSBjb25zdDsK
KyAgICBRVXJsIGNvcmVGcmFtZVVybCgpIGNvbnN0OworICAgIFFVcmwgbGFzdFJlcXVlc3RlZFVy
bCgpIGNvbnN0OworICAgIFFXZWJTZWN1cml0eU9yaWdpbiBzZWN1cml0eU9yaWdpbigpIGNvbnN0
OworICAgIFFTdHJpbmcgdW5pcXVlTmFtZSgpIGNvbnN0OworCisgICAgdm9pZCByZW5kZXJSZWxh
dGl2ZUNvb3JkcyhRUGFpbnRlciosIGludCBsYXllcnMsIGNvbnN0IFFSZWdpb24mIGNsaXApOwor
ICAgIHZvaWQgcmVuZGVyRnJhbWVFeHRyYXMoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0KiwgaW50
IGxheWVycywgY29uc3QgUVJlZ2lvbiYgY2xpcCk7CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBP
U0lUSU5HKQorICAgIHZvaWQgcmVuZGVyQ29tcG9zaXRlZExheWVycyhXZWJDb3JlOjpHcmFwaGlj
c0NvbnRleHQqLCBjb25zdCBXZWJDb3JlOjpJbnRSZWN0JiBjbGlwKTsKKyNlbmRpZgorI2lmIFVT
RShUSUxFRF9CQUNLSU5HX1NUT1JFKQorICAgIHZvaWQgc2V0VGlsZWRCYWNraW5nU3RvcmVGcm96
ZW4oYm9vbCk7CisgICAgYm9vbCB0aWxlZEJhY2tpbmdTdG9yZUZyb3plbigpIGNvbnN0OworICAg
IHZvaWQgc2V0VGlsZWRCYWNraW5nU3RvcmVDb250ZW50c1NjYWxlKGZsb2F0KTsKKyAgICBib29s
IHJlbmRlckZyb21UaWxlZEJhY2tpbmdTdG9yZShRUGFpbnRlciosIGNvbnN0IFFSZWdpb24mIGNs
aXApOworI2VuZGlmCisKKyAgICAvLyBDYWxsZWQgZnJvbSBRV2ViRnJhbWUgYXMgYSBwcml2YXRl
IHNsb3Q6CisgICAgdm9pZCBfcV9vcmllbnRhdGlvbkNoYW5nZWQoKTsKKworICAgIFFMaXN0PFFP
YmplY3QqPiBjaGlsZEZyYW1lcygpIGNvbnN0OworICAgIGJvb2wgaGFzRm9jdXMoKSBjb25zdDsK
KyAgICB2b2lkIHNldEZvY3VzKCk7CisKKyAgICB2b2lkIHNldFNjcm9sbEJhclBvbGljeShRdDo6
T3JpZW50YXRpb24sIFF0OjpTY3JvbGxCYXJQb2xpY3kpOworICAgIHZvaWQgc2Nyb2xsVG9BbmNo
b3IoY29uc3QgUVN0cmluZyYpOworICAgIHZvaWQgc2Nyb2xsQnkoaW50LCBpbnQpOworICAgIHZv
aWQgc2V0U2Nyb2xsQmFyVmFsdWUoUXQ6Ok9yaWVudGF0aW9uLCBpbnQpOworICAgIGludCBzY3Jv
bGxCYXJWYWx1ZShRdDo6T3JpZW50YXRpb24pIGNvbnN0OworICAgIGludCBzY3JvbGxCYXJNYXhp
bXVtKFF0OjpPcmllbnRhdGlvbikgY29uc3Q7CisgICAgUVJlY3Qgc2Nyb2xsQmFyR2VvbWV0cnko
UXQ6Ok9yaWVudGF0aW9uKSBjb25zdDsKKworICAgIFFQb2ludCBzY3JvbGxQb3NpdGlvbigpIGNv
bnN0OworICAgIFFSZWN0IGZyYW1lUmVjdCgpIGNvbnN0OworICAgIFFTaXplIGNvbnRlbnRzU2l6
ZSgpIGNvbnN0OworCisgICAgdm9pZCBzZXRab29tRmFjdG9yKHFyZWFsKTsKKyAgICBxcmVhbCB6
b29tRmFjdG9yKCkgY29uc3Q7CisKKyAgICB2b2lkIHVwZGF0ZUJhY2tncm91bmRSZWN1cnNpdmVs
eShjb25zdCBRQ29sb3ImKTsKKworICAgIHZvaWQgY2FuY2VsTG9hZCgpOworCisgICAgLy8gRnJh
bWVWaWV3IHJlbGF0ZWQgZnVuY3Rpb25zCisgICAgUVNpemUgY3VzdG9tTGF5b3V0U2l6ZSgpIGNv
bnN0OworICAgIHZvaWQgc2V0Q3VzdG9tTGF5b3V0U2l6ZShjb25zdCBRU2l6ZSYpOworICAgIHZv
aWQgc2V0Rml4ZWRWaXNpYmxlQ29udGVudFJlY3QoY29uc3QgUVJlY3QmKTsKKyAgICB2b2lkIHNl
dFZpZXdwb3J0U2l6ZShjb25zdCBRU2l6ZSYpOworICAgIHZvaWQgc2V0UGFpbnRzRW50aXJlQ29u
dGVudHMoYm9vbCAvKnJlc2l6ZXNUb0NvbnRlbnRzKi8pOworICAgIHZvaWQgc2V0RGVsZWdhdGVz
U2Nyb2xsaW5nKGJvb2wgLypyZXNpemVzVG9Db250ZW50cyovKTsKKwogICAgIFFXZWJQYWdlQWRh
cHRlciogcGFnZUFkYXB0ZXI7CiAKIC8vIHByb3RlY3RlZDoKICAgICBib29sIGFsbG93c1Njcm9s
bGluZzsKICAgICBpbnQgbWFyZ2luV2lkdGg7CiAgICAgaW50IG1hcmdpbkhlaWdodDsKKyAgICBR
dDo6U2Nyb2xsQmFyUG9saWN5IGhvcml6b250YWxTY3JvbGxCYXJQb2xpY3k7CisgICAgUXQ6OlNj
cm9sbEJhclBvbGljeSB2ZXJ0aWNhbFNjcm9sbEJhclBvbGljeTsKKyNpZiBFTkFCTEUoT1JJRU5U
QVRJT05fRVZFTlRTKQorICAgIFFPcmllbnRhdGlvblNlbnNvciBtX29yaWVudGF0aW9uOworI2Vu
ZGlmIC8vIEVOQUJMRShPUklFTlRBVElPTl9FVkVOVFMpLgogCiAvLyBwcml2YXRlOgogICAgIHZv
aWQgaW5pdChRV2ViUGFnZUFkYXB0ZXIqKTsKICAgICB2b2lkIGluaXQoUVdlYlBhZ2VBZGFwdGVy
KiwgUVdlYkZyYW1lRGF0YSopOworICAgIFdlYkNvcmU6OlNjcm9sbGJhciogaG9yaXpvbnRhbFNj
cm9sbEJhcigpIGNvbnN0OworICAgIFdlYkNvcmU6OlNjcm9sbGJhciogdmVydGljYWxTY3JvbGxC
YXIoKSBjb25zdDsKIAogICAgIFdlYkNvcmU6OkZyYW1lICpmcmFtZTsKICAgICBXZWJDb3JlOjpG
cmFtZUxvYWRlckNsaWVudFF0ICpmcmFtZUxvYWRlckNsaWVudDsKLSAgICBXZWJDb3JlOjpLVVJM
IHVybDsKKyAgICBRVXJsIHVybDsKIAogICAgIHN0YXRpYyBRV2ViRnJhbWVBZGFwdGVyKiBraXQo
Y29uc3QgV2ViQ29yZTo6RnJhbWUqKTsKIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9X
ZWJDb3JlU3VwcG9ydC9RV2ViUGFnZUFkYXB0ZXIuY3BwIGIvU291cmNlL1dlYktpdC9xdC9XZWJD
b3JlU3VwcG9ydC9RV2ViUGFnZUFkYXB0ZXIuY3BwCmluZGV4IDNkNjM5ZDk5YTg2MGZhMjQwNTUw
ZDUxNmU2MmNhNGZkYjU2NjI1MTguLmU0ODIyNmVhNjdjNjYxMWYxNDAzZmEzOTkzM2QyNTY4M2Vh
N2VjNWIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvUVdlYlBh
Z2VBZGFwdGVyLmNwcAorKysgYi9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L1FXZWJQ
YWdlQWRhcHRlci5jcHAKQEAgLTIxLDUyICsyMSwyMTYgQEAKICNpbmNsdWRlICJjb25maWcuaCIK
ICNpbmNsdWRlICJRV2ViUGFnZUFkYXB0ZXIuaCIKIAorI2luY2x1ZGUgIkNTU0NvbXB1dGVkU3R5
bGVEZWNsYXJhdGlvbi5oIgorI2luY2x1ZGUgIkNTU1BhcnNlci5oIgogI2luY2x1ZGUgIkNocm9t
ZS5oIgogI2luY2x1ZGUgIkNocm9tZUNsaWVudFF0LmgiCisjaW5jbHVkZSAiQ2xpZW50UmVjdC5o
IgorI2luY2x1ZGUgIkNvbnRleHRNZW51LmgiCisjaW5jbHVkZSAiQ29udGV4dE1lbnVDbGllbnRR
dC5oIgorI2luY2x1ZGUgIkNvbnRleHRNZW51Q29udHJvbGxlci5oIgorI2lmIEVOQUJMRShERVZJ
Q0VfT1JJRU5UQVRJT04pCisjaW5jbHVkZSAiRGV2aWNlTW90aW9uQ2xpZW50UXQuaCIKKyNpbmNs
dWRlICJEZXZpY2VPcmllbnRhdGlvbkNsaWVudE1vY2suaCIKKyNpbmNsdWRlICJEZXZpY2VPcmll
bnRhdGlvbkNsaWVudFF0LmgiCisjZW5kaWYKKyNpbmNsdWRlICJEb2N1bWVudExvYWRlci5oIgor
I2luY2x1ZGUgIkRyYWdDbGllbnRRdC5oIgorI2luY2x1ZGUgIkRyYWdDb250cm9sbGVyLmgiCisj
aW5jbHVkZSAiRHJhZ0RhdGEuaCIKKyNpbmNsdWRlICJEcmFnU2Vzc2lvbi5oIgorI2luY2x1ZGUg
IkVkaXRvckNsaWVudFF0LmgiCisjaW5jbHVkZSAiRm9jdXNDb250cm9sbGVyLmgiCisjaW5jbHVk
ZSAiRnJhbWVWaWV3LmgiCisjaWYgRU5BQkxFKEdFT0xPQ0FUSU9OKQorI2luY2x1ZGUgIkdlb2xv
Y2F0aW9uQ2xpZW50TW9jay5oIgorI2luY2x1ZGUgIkdlb2xvY2F0aW9uQ2xpZW50UXQuaCIKKyNp
bmNsdWRlICJHZW9sb2NhdGlvbkNvbnRyb2xsZXIuaCIKKyNlbmRpZgorI2luY2x1ZGUgIkdlb2xv
Y2F0aW9uUGVybWlzc2lvbkNsaWVudFF0LmgiCisjaW5jbHVkZSAiSFRNTEZyYW1lT3duZXJFbGVt
ZW50LmgiCisjaW5jbHVkZSAiSFRNTElucHV0RWxlbWVudC5oIgorI2luY2x1ZGUgIkhpdFRlc3RS
ZXN1bHQuaCIKKyNpbmNsdWRlICJJbml0V2ViQ29yZVF0LmgiCisjaW5jbHVkZSAiSW5zcGVjdG9y
Q2xpZW50UXQuaCIKKyNpbmNsdWRlICJJbnNwZWN0b3JDb250cm9sbGVyLmgiCisjaW5jbHVkZSAi
SW5zcGVjdG9yU2VydmVyUXQuaCIKKyNpbmNsdWRlICJMb2NhbGl6ZWRTdHJpbmdzLmgiCisjaW5j
bHVkZSAiTUlNRVR5cGVSZWdpc3RyeS5oIgorI2luY2x1ZGUgIk1lbW9yeUNhY2hlLmgiCisjaW5j
bHVkZSAiTm9kZUxpc3QuaCIKICNpbmNsdWRlICJOb3RpZmljYXRpb25QcmVzZW50ZXJDbGllbnRR
dC5oIgorI2luY2x1ZGUgIlBhZ2VHcm91cC5oIgorI2luY2x1ZGUgIlBhc3RlYm9hcmQuaCIKKyNp
bmNsdWRlICJQbGF0Zm9ybUtleWJvYXJkRXZlbnQuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVRvdWNo
RXZlbnQuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVdoZWVsRXZlbnQuaCIKKyNpbmNsdWRlICJQbHVn
aW5EYXRhYmFzZS5oIgorI2luY2x1ZGUgIlBsdWdpblBhY2thZ2UuaCIKKyNpbmNsdWRlICJQcm9n
cmVzc1RyYWNrZXIuaCIKICNpbmNsdWRlICJRV2ViRnJhbWVBZGFwdGVyLmgiCisjaW5jbHVkZSAi
UmVuZGVyVGV4dENvbnRyb2wuaCIKKyNpbmNsdWRlICJTY2hlbWVSZWdpc3RyeS5oIgorI2luY2x1
ZGUgIlNjcm9sbGJhci5oIgorI2luY2x1ZGUgIlNjcm9sbGJhclRoZW1lLmgiCisjaW5jbHVkZSAi
U2V0dGluZ3MuaCIKICNpbmNsdWRlICJVbmRvU3RlcFF0LmgiCisjaW5jbHVkZSAiVXNlckFnZW50
UXQuaCIKKyNpbmNsdWRlICJXZWJFdmVudENvbnZlcnNpb24uaCIKKyNpbmNsdWRlICJXZWJLaXRW
ZXJzaW9uLmgiCisjaW5jbHVkZSAiV2luZG93RmVhdHVyZXMuaCIKKyNpbmNsdWRlICJxd2ViaGlz
dG9yeV9wLmgiCiAjaW5jbHVkZSAicXdlYnBsdWdpbmZhY3RvcnkuaCIKICNpbmNsdWRlICJxd2Vi
c2V0dGluZ3MuaCIKICNpbmNsdWRlIDxQYWdlLmg+CisjaW5jbHVkZSA8UUJpdEFycmF5PgorI2lu
Y2x1ZGUgPFFHdWlBcHBsaWNhdGlvbj4KKyNpbmNsdWRlIDxRTWltZURhdGE+CisjaW5jbHVkZSA8
UU1vdXNlRXZlbnQ+CiAjaW5jbHVkZSA8UU5ldHdvcmtBY2Nlc3NNYW5hZ2VyPgorI2luY2x1ZGUg
PFFTdHlsZUhpbnRzPgorI2luY2x1ZGUgPFFUZXh0Q2hhckZvcm1hdD4KKyNpbmNsdWRlIDxRVG91
Y2hFdmVudD4KKyNpbmNsdWRlIDxRV2hlZWxFdmVudD4KKworLy8gZnJvbSB0ZXh0L3Fmb250LmNw
cAorUVRfQkVHSU5fTkFNRVNQQUNFCitleHRlcm4gUV9HVUlfRVhQT1JUIGludCBxdF9kZWZhdWx0
RHBpKCk7CitRVF9FTkRfTkFNRVNQQUNFCiAKIHVzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwogCiBi
b29sIFFXZWJQYWdlQWRhcHRlcjo6ZHJ0UnVuID0gZmFsc2U7CiAKK3R5cGVkZWYgUVdlYlBhZ2VB
ZGFwdGVyOjpNZW51SXRlbURlc2NyaXB0aW9uIE1lbnVJdGVtOworCitzdGF0aWMgaW5saW5lIERy
YWdPcGVyYXRpb24gZHJvcEFjdGlvblRvRHJhZ09wKFF0OjpEcm9wQWN0aW9ucyBhY3Rpb25zKQor
eworICAgIHVuc2lnbmVkIHJlc3VsdCA9IDA7CisgICAgaWYgKGFjdGlvbnMgJiBRdDo6Q29weUFj
dGlvbikKKyAgICAgICAgcmVzdWx0IHw9IERyYWdPcGVyYXRpb25Db3B5OworICAgIC8vIERyYWdP
cGVyYXRpb25nZW5lcmljIHJlcHJlc2VudHMgSW50ZXJuZXRFeHBsb3JlcidzIGVxdWl2YWxlbnQg
b2YgTW92ZSBvcGVyYXRpb24sCisgICAgLy8gaGVuY2UgaXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQg
YXMgIm1vdmUiCisgICAgaWYgKGFjdGlvbnMgJiBRdDo6TW92ZUFjdGlvbikKKyAgICAgICAgcmVz
dWx0IHw9IChEcmFnT3BlcmF0aW9uTW92ZSB8IERyYWdPcGVyYXRpb25HZW5lcmljKTsKKyAgICBp
ZiAoYWN0aW9ucyAmIFF0OjpMaW5rQWN0aW9uKQorICAgICAgICByZXN1bHQgfD0gRHJhZ09wZXJh
dGlvbkxpbms7CisgICAgaWYgKHJlc3VsdCA9PSAoRHJhZ09wZXJhdGlvbkNvcHkgfCBEcmFnT3Bl
cmF0aW9uTW92ZSB8IERyYWdPcGVyYXRpb25HZW5lcmljIHwgRHJhZ09wZXJhdGlvbkxpbmspKQor
ICAgICAgICByZXN1bHQgPSBEcmFnT3BlcmF0aW9uRXZlcnk7CisgICAgcmV0dXJuIChEcmFnT3Bl
cmF0aW9uKXJlc3VsdDsKK30KKworc3RhdGljIGlubGluZSBRdDo6RHJvcEFjdGlvbiBkcmFnT3BU
b0Ryb3BBY3Rpb24odW5zaWduZWQgYWN0aW9ucykKK3sKKyAgICBRdDo6RHJvcEFjdGlvbiByZXN1
bHQgPSBRdDo6SWdub3JlQWN0aW9uOworICAgIGlmIChhY3Rpb25zICYgRHJhZ09wZXJhdGlvbkNv
cHkpCisgICAgICAgIHJlc3VsdCA9IFF0OjpDb3B5QWN0aW9uOworICAgIGVsc2UgaWYgKGFjdGlv
bnMgJiBEcmFnT3BlcmF0aW9uTW92ZSkKKyAgICAgICAgcmVzdWx0ID0gUXQ6Ok1vdmVBY3Rpb247
CisgICAgLy8gRHJhZ09wZXJhdGlvbmdlbmVyaWMgcmVwcmVzZW50cyBJbnRlcm5ldEV4cGxvcmVy
J3MgZXF1aXZhbGVudCBvZiBNb3ZlIG9wZXJhdGlvbiwKKyAgICAvLyBoZW5jZSBpdCBzaG91bGQg
YmUgY29uc2lkZXJlZCBhcyAibW92ZSIKKyAgICBlbHNlIGlmIChhY3Rpb25zICYgRHJhZ09wZXJh
dGlvbkdlbmVyaWMpCisgICAgICAgIHJlc3VsdCA9IFF0OjpNb3ZlQWN0aW9uOworICAgIGVsc2Ug
aWYgKGFjdGlvbnMgJiBEcmFnT3BlcmF0aW9uTGluaykKKyAgICAgICAgcmVzdWx0ID0gUXQ6Okxp
bmtBY3Rpb247CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIFdlYkNvcmU6OkZyYW1l
TG9hZFJlcXVlc3QgZnJhbWVMb2FkUmVxdWVzdChjb25zdCBRVXJsICZ1cmwsIFdlYkNvcmU6OkZy
YW1lICpmcmFtZSkKK3sKKyAgICByZXR1cm4gV2ViQ29yZTo6RnJhbWVMb2FkUmVxdWVzdChmcmFt
ZS0+ZG9jdW1lbnQoKS0+c2VjdXJpdHlPcmlnaW4oKSwKKyAgICAgICAgV2ViQ29yZTo6UmVzb3Vy
Y2VSZXF1ZXN0KHVybCwgZnJhbWUtPmxvYWRlcigpLT5vdXRnb2luZ1JlZmVycmVyKCkpKTsKK30K
Kworc3RhdGljIHZvaWQgb3Blbk5ld1dpbmRvdyhjb25zdCBRVXJsJiB1cmwsIEZyYW1lKiBmcmFt
ZSkKK3sKKyAgICBpZiAoUGFnZSogb2xkUGFnZSA9IGZyYW1lLT5wYWdlKCkpIHsKKyAgICAgICAg
V2luZG93RmVhdHVyZXMgZmVhdHVyZXM7CisgICAgICAgIE5hdmlnYXRpb25BY3Rpb24gYWN0aW9u
OworICAgICAgICBGcmFtZUxvYWRSZXF1ZXN0IHJlcXVlc3QgPSBmcmFtZUxvYWRSZXF1ZXN0KHVy
bCwgZnJhbWUpOworICAgICAgICBpZiAoUGFnZSogbmV3UGFnZSA9IG9sZFBhZ2UtPmNocm9tZSgp
LT5jcmVhdGVXaW5kb3coZnJhbWUsIHJlcXVlc3QsIGZlYXR1cmVzLCBhY3Rpb24pKSB7CisgICAg
ICAgICAgICBuZXdQYWdlLT5tYWluRnJhbWUoKS0+bG9hZGVyKCktPmxvYWRGcmFtZVJlcXVlc3Qo
cmVxdWVzdCwgZmFsc2UsIGZhbHNlLCAwLCAwLCBNYXliZVNlbmRSZWZlcnJlcik7CisgICAgICAg
ICAgICBuZXdQYWdlLT5jaHJvbWUoKS0+c2hvdygpOworICAgICAgICB9CisgICAgfQorfQorCiBR
V2ViUGFnZUFkYXB0ZXI6OlFXZWJQYWdlQWRhcHRlcigpCiAgICAgOiBzZXR0aW5ncygwKQogICAg
ICwgcGFnZSgwKQogICAgICwgcGx1Z2luRmFjdG9yeSgwKQogICAgICwgZm9yd2FyZFVuc3VwcG9y
dGVkQ29udGVudChmYWxzZSkKICAgICAsIGluc2lkZU9wZW5DYWxsKGZhbHNlKQorICAgICwgY2xp
Y2tDYXVzZWRGb2N1cyhmYWxzZSkKKyAgICAsIG1fdG90YWxCeXRlcygwKQorICAgICwgbV9ieXRl
c1JlY2VpdmVkKCkKICAgICAsIG5ldHdvcmtNYW5hZ2VyKDApCiB7Ci19CisgICAgV2ViQ29yZTo6
aW5pdGlhbGl6ZVdlYkNvcmVRdCgpOworI2lmIEVOQUJMRShHRU9MT0NBVElPTikgfHwgRU5BQkxF
KERFVklDRV9PUklFTlRBVElPTikKKyAgICBib29sIHVzZU1vY2sgPSBRV2ViUGFnZUFkYXB0ZXI6
OmRydFJ1bjsKKyNlbmRpZgogCi1RV2ViUGFnZUFkYXB0ZXI6On5RV2ViUGFnZUFkYXB0ZXIoKQot
ewotICAgIGRlbGV0ZSBwYWdlOwotICAgIGRlbGV0ZSBzZXR0aW5nczsKKyAgICBQYWdlOjpQYWdl
Q2xpZW50cyBwYWdlQ2xpZW50czsKKyAgICBwYWdlQ2xpZW50cy5jaHJvbWVDbGllbnQgPSBuZXcg
Q2hyb21lQ2xpZW50UXQodGhpcyk7CisgICAgcGFnZUNsaWVudHMuY29udGV4dE1lbnVDbGllbnQg
PSBuZXcgQ29udGV4dE1lbnVDbGllbnRRdCgpOworICAgIHBhZ2VDbGllbnRzLmVkaXRvckNsaWVu
dCA9IG5ldyBFZGl0b3JDbGllbnRRdCh0aGlzKTsKKyAgICBwYWdlQ2xpZW50cy5kcmFnQ2xpZW50
ID0gbmV3IERyYWdDbGllbnRRdChwYWdlQ2xpZW50cy5jaHJvbWVDbGllbnQpOworICAgIHBhZ2VD
bGllbnRzLmluc3BlY3RvckNsaWVudCA9IG5ldyBJbnNwZWN0b3JDbGllbnRRdCh0aGlzKTsKKyAg
ICBwYWdlID0gbmV3IFBhZ2UocGFnZUNsaWVudHMpOworI2lmIEVOQUJMRShHRU9MT0NBVElPTikK
KyAgICBpZiAodXNlTW9jaykgeworICAgICAgICAvLyBJbiBjYXNlIHJ1bm5pbmcgaW4gRHVtcFJl
bmRlclRyZWUgbW9kZSBzZXQgdGhlIGNvbnRyb2xsZXIgdG8gbW9jayBwcm92aWRlci4KKyAgICAg
ICAgR2VvbG9jYXRpb25DbGllbnRNb2NrKiBtb2NrID0gbmV3IEdlb2xvY2F0aW9uQ2xpZW50TW9j
azsKKyAgICAgICAgV2ViQ29yZTo6cHJvdmlkZUdlb2xvY2F0aW9uVG8ocGFnZSwgbW9jayk7Cisg
ICAgICAgIG1vY2stPnNldENvbnRyb2xsZXIoV2ViQ29yZTo6R2VvbG9jYXRpb25Db250cm9sbGVy
Ojpmcm9tKHBhZ2UpKTsKKyAgICB9IGVsc2UKKyAgICAgICAgV2ViQ29yZTo6cHJvdmlkZUdlb2xv
Y2F0aW9uVG8ocGFnZSwgbmV3IEdlb2xvY2F0aW9uQ2xpZW50UXQodGhpcykpOworI2VuZGlmCisj
aWYgRU5BQkxFKERFVklDRV9PUklFTlRBVElPTikKKyAgICBpZiAodXNlTW9jaykKKyAgICAgICAg
V2ViQ29yZTo6cHJvdmlkZURldmljZU9yaWVudGF0aW9uVG8ocGFnZSwgbmV3IERldmljZU9yaWVu
dGF0aW9uQ2xpZW50TW9jayk7CisgICAgZWxzZQorICAgICAgICBXZWJDb3JlOjpwcm92aWRlRGV2
aWNlT3JpZW50YXRpb25UbyhwYWdlLCBuZXcgRGV2aWNlT3JpZW50YXRpb25DbGllbnRRdCk7Cisg
ICAgV2ViQ29yZTo6cHJvdmlkZURldmljZU1vdGlvblRvKHBhZ2UsIG5ldyBEZXZpY2VNb3Rpb25D
bGllbnRRdCk7CisjZW5kaWYKKworICAgIC8vIEJ5IGRlZmF1bHQgZWFjaCBwYWdlIGlzIHB1dCBp
bnRvIHRoZWlyIG93biB1bmlxdWUgcGFnZSBncm91cCwgd2hpY2ggYWZmZWN0cyBwb3B1cCB3aW5k
b3dzCisgICAgLy8gYW5kIHZpc2l0ZWQgbGlua3MuIFBhZ2UgZ3JvdXBzIChwZXIgcHJvY2VzcyBv
bmx5KSBpcyBhIGZlYXR1cmUgbWFraW5nIGl0IHBvc3NpYmxlIHRvIHVzZQorICAgIC8vIHNlcGFy
YXRlIHNldHRpbmdzIGZvciBlYWNoIGdyb3VwLCBzbyB0aGF0IGZvciBpbnN0YW5jZSBhbiBpbnRl
Z3JhdGVkIGJyb3dzZXIvZW1haWwgcmVhZGVyCisgICAgLy8gY2FuIHVzZSBkaWZmZXJlbnQgc2V0
dGluZ3MgZm9yIGRpc3BsYXlpbmcgSFRNTCBwYWdlcyBhbmQgSFRNTCBlbWFpbC4gVG8gbWFrZSBR
dFdlYktpdCB3b3JrCisgICAgLy8gYXMgZXhwZWN0ZWQgb3V0IG9mIHRoZSBib3gsIHdlIHVzZSBh
IGRlZmF1bHQgZ3JvdXAgc2ltaWxhciB0byB3aGF0IG90aGVyIHBvcnRzIGFyZSBkb2luZy4KKyAg
ICBwYWdlLT5zZXRHcm91cE5hbWUoIkRlZmF1bHQgR3JvdXAiKTsKKworICAgIHBhZ2UtPmFkZExh
eW91dE1pbGVzdG9uZXMoRGlkRmlyc3RWaXN1YWxseU5vbkVtcHR5TGF5b3V0KTsKKworICAgIHNl
dHRpbmdzID0gbmV3IFFXZWJTZXR0aW5ncyhwYWdlLT5zZXR0aW5ncygpKTsKIAogI2lmIEVOQUJM
RShOT1RJRklDQVRJT05TKSB8fCBFTkFCTEUoTEVHQUNZX05PVElGSUNBVElPTlMpCi0gICAgTm90
aWZpY2F0aW9uUHJlc2VudGVyQ2xpZW50UXQ6Om5vdGlmaWNhdGlvblByZXNlbnRlcigpLT5yZW1v
dmVDbGllbnQoKTsKKyAgICBXZWJDb3JlOjpwcm92aWRlTm90aWZpY2F0aW9uKHBhZ2UsIE5vdGlm
aWNhdGlvblByZXNlbnRlckNsaWVudFF0Ojpub3RpZmljYXRpb25QcmVzZW50ZXIoKSk7CiAjZW5k
aWYKKworICAgIGhpc3RvcnkuZCA9IG5ldyBRV2ViSGlzdG9yeVByaXZhdGUoc3RhdGljX2Nhc3Q8
V2ViQ29yZTo6QmFja0ZvcndhcmRMaXN0SW1wbCo+KHBhZ2UtPmJhY2tGb3J3YXJkTGlzdCgpKSk7
CisKKyAgICBQYWdlR3JvdXA6OnNldFNob3VsZFRyYWNrVmlzaXRlZExpbmtzKHRydWUpOwogfQog
Ci12b2lkIFFXZWJQYWdlQWRhcHRlcjo6aW5pdChQYWdlKiBwYWdlKQorUVdlYlBhZ2VBZGFwdGVy
Ojp+UVdlYlBhZ2VBZGFwdGVyKCkKIHsKLSAgICB0aGlzLT5wYWdlID0gcGFnZTsKLSAgICBzZXR0
aW5ncyA9IG5ldyBRV2ViU2V0dGluZ3MocGFnZS0+c2V0dGluZ3MoKSk7CisgICAgZGVsZXRlIHBh
Z2U7CisgICAgZGVsZXRlIHNldHRpbmdzOwogCiAjaWYgRU5BQkxFKE5PVElGSUNBVElPTlMpIHx8
IEVOQUJMRShMRUdBQ1lfTk9USUZJQ0FUSU9OUykKLSAgICBXZWJDb3JlOjpwcm92aWRlTm90aWZp
Y2F0aW9uKHBhZ2UsIE5vdGlmaWNhdGlvblByZXNlbnRlckNsaWVudFF0Ojpub3RpZmljYXRpb25Q
cmVzZW50ZXIoKSk7CisgICAgTm90aWZpY2F0aW9uUHJlc2VudGVyQ2xpZW50UXQ6Om5vdGlmaWNh
dGlvblByZXNlbnRlcigpLT5yZW1vdmVDbGllbnQoKTsKICNlbmRpZgogfQogCiB2b2lkIFFXZWJQ
YWdlQWRhcHRlcjo6ZGVsZXRlUGFnZSgpCiB7CisgICAgLy8gQmVmb3JlIHdlIGRlbGV0ZSB0aGUg
cGFnZSwgZGV0YWNoIHRoZSBtYWluZnJhbWUncyBsb2FkZXIKKyAgICBGcmFtZUxvYWRlciogbG9h
ZGVyID0gbWFpbkZyYW1lQWRhcHRlcigpLT5mcmFtZS0+bG9hZGVyKCk7CisgICAgaWYgKGxvYWRl
cikKKyAgICAgICAgbG9hZGVyLT5kZXRhY2hGcm9tUGFyZW50KCk7CiAgICAgZGVsZXRlIHBhZ2U7
CiAgICAgcGFnZSA9IDA7CiB9CkBAIC03Niw3ICsyNDAsNyBAQCBRV2ViUGFnZUFkYXB0ZXIqIFFX
ZWJQYWdlQWRhcHRlcjo6a2l0KFBhZ2UqIHBhZ2UpCiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PENo
cm9tZUNsaWVudFF0Kj4ocGFnZS0+Y2hyb21lKCktPmNsaWVudCgpKS0+bV93ZWJQYWdlOwogfQog
Ci1WaWV3cG9ydEFyZ3VtZW50cyBRV2ViUGFnZUFkYXB0ZXI6OnZpZXdwb3J0QXJndW1lbnRzKCkK
K1ZpZXdwb3J0QXJndW1lbnRzIFFXZWJQYWdlQWRhcHRlcjo6dmlld3BvcnRBcmd1bWVudHMoKSBj
b25zdAogewogICAgIHJldHVybiBwYWdlID8gcGFnZS0+dmlld3BvcnRBcmd1bWVudHMoKSA6IFdl
YkNvcmU6OlZpZXdwb3J0QXJndW1lbnRzKCk7CiB9CkBAIC0xMDIsMyArMjY2LDEyMDggQEAgUU5l
dHdvcmtBY2Nlc3NNYW5hZ2VyKiBRV2ViUGFnZUFkYXB0ZXI6Om5ldHdvcmtBY2Nlc3NNYW5hZ2Vy
KCkKICAgICAgICAgbmV0d29ya01hbmFnZXIgPSBuZXcgUU5ldHdvcmtBY2Nlc3NNYW5hZ2VyKGhh
bmRsZSgpKTsKICAgICByZXR1cm4gbmV0d29ya01hbmFnZXI7CiB9CisKK2Jvb2wgUVdlYlBhZ2VB
ZGFwdGVyOjpoYXNTZWxlY3Rpb24oKSBjb25zdAoreworICAgIEZyYW1lKiBmcmFtZSA9IHBhZ2Ut
PmZvY3VzQ29udHJvbGxlcigpLT5mb2N1c2VkT3JNYWluRnJhbWUoKTsKKyAgICBpZiAoZnJhbWUp
CisgICAgICAgIHJldHVybiAoZnJhbWUtPnNlbGVjdGlvbigpLT5zZWxlY3Rpb24oKS5zZWxlY3Rp
b25UeXBlKCkgIT0gVmlzaWJsZVNlbGVjdGlvbjo6Tm9TZWxlY3Rpb24pOworICAgIHJldHVybiBm
YWxzZTsKK30KKworUVN0cmluZyBRV2ViUGFnZUFkYXB0ZXI6OnNlbGVjdGVkVGV4dCgpIGNvbnN0
Cit7CisgICAgRnJhbWUqIGZyYW1lID0gcGFnZS0+Zm9jdXNDb250cm9sbGVyKCktPmZvY3VzZWRP
ck1haW5GcmFtZSgpOworICAgIGlmIChmcmFtZS0+c2VsZWN0aW9uKCktPnNlbGVjdGlvbigpLnNl
bGVjdGlvblR5cGUoKSA9PSBWaXNpYmxlU2VsZWN0aW9uOjpOb1NlbGVjdGlvbikKKyAgICAgICAg
cmV0dXJuIFFTdHJpbmcoKTsKKyAgICByZXR1cm4gZnJhbWUtPmVkaXRvcigpLT5zZWxlY3RlZFRl
eHQoKTsKK30KKworUVN0cmluZyBRV2ViUGFnZUFkYXB0ZXI6OnNlbGVjdGVkSHRtbCgpIGNvbnN0
Cit7CisgICAgcmV0dXJuIHBhZ2UtPmZvY3VzQ29udHJvbGxlcigpLT5mb2N1c2VkT3JNYWluRnJh
bWUoKS0+ZWRpdG9yKCktPnNlbGVjdGVkUmFuZ2UoKS0+dG9IVE1MKCk7Cit9CisKK2Jvb2wgUVdl
YlBhZ2VBZGFwdGVyOjppc0NvbnRlbnRFZGl0YWJsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIHBh
Z2UtPmlzRWRpdGFibGUoKTsKK30KKwordm9pZCBRV2ViUGFnZUFkYXB0ZXI6OnNldENvbnRlbnRF
ZGl0YWJsZShib29sIGVkaXRhYmxlKQoreworICAgIHBhZ2UtPnNldEVkaXRhYmxlKGVkaXRhYmxl
KTsKKyAgICBwYWdlLT5zZXRUYWJLZXlDeWNsZXNUaHJvdWdoRWxlbWVudHMoIWVkaXRhYmxlKTsK
KworICAgIEZyYW1lKiBmcmFtZSA9IG1haW5GcmFtZUFkYXB0ZXIoKS0+ZnJhbWU7CisgICAgaWYg
KGVkaXRhYmxlKSB7CisgICAgICAgIGZyYW1lLT5lZGl0b3IoKS0+YXBwbHlFZGl0aW5nU3R5bGVU
b0JvZHlFbGVtZW50KCk7CisgICAgICAgIC8vIEZJWE1FOiBtYWMgcG9ydCBjYWxscyB0aGlzIGlm
IHRoZXJlIGlzIG5vIHNlbGVjdGVkRE9NUmFuZ2UKKyAgICAgICAgLy8gZnJhbWUtPnNldFNlbGVj
dGlvbkZyb21Ob25lKCk7CisgICAgfQorCit9CisKK2Jvb2wgUVdlYlBhZ2VBZGFwdGVyOjpmaW5k
VGV4dChjb25zdCBRU3RyaW5nJiBzdWJTdHJpbmcsIEZpbmRGbGFnIG9wdGlvbnMpCit7CisgICAg
OjpUZXh0Q2FzZVNlbnNpdGl2aXR5IGNhc2VTZW5zaXRpdml0eSA9IDo6VGV4dENhc2VJbnNlbnNp
dGl2ZTsKKyAgICBpZiAob3B0aW9ucyAmIEZpbmRDYXNlU2Vuc2l0aXZlbHkpCisgICAgICAgIGNh
c2VTZW5zaXRpdml0eSA9IDo6VGV4dENhc2VTZW5zaXRpdmU7CisKKyAgICBpZiAob3B0aW9ucyAm
IEhpZ2hsaWdodEFsbE9jY3VycmVuY2VzKSB7CisgICAgICAgIGlmIChzdWJTdHJpbmcuaXNFbXB0
eSgpKSB7CisgICAgICAgICAgICBwYWdlLT51bm1hcmtBbGxUZXh0TWF0Y2hlcygpOworICAgICAg
ICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhZ2UtPm1hcmtB
bGxNYXRjaGVzRm9yVGV4dChzdWJTdHJpbmcsIGNhc2VTZW5zaXRpdml0eSwgdHJ1ZSwgMCk7Cisg
ICAgfQorCisgICAgaWYgKHN1YlN0cmluZy5pc0VtcHR5KCkpIHsKKyAgICAgICAgcGFnZS0+bWFp
bkZyYW1lKCktPnNlbGVjdGlvbigpLT5jbGVhcigpOworICAgICAgICBGcmFtZSogZnJhbWUgPSBw
YWdlLT5tYWluRnJhbWUoKS0+dHJlZSgpLT5maXJzdENoaWxkKCk7CisgICAgICAgIHdoaWxlIChm
cmFtZSkgeworICAgICAgICAgICAgZnJhbWUtPnNlbGVjdGlvbigpLT5jbGVhcigpOworICAgICAg
ICAgICAgZnJhbWUgPSBmcmFtZS0+dHJlZSgpLT50cmF2ZXJzZU5leHRXaXRoV3JhcChmYWxzZSk7
CisgICAgICAgIH0KKyAgICB9CisgICAgOjpGaW5kRGlyZWN0aW9uIGRpcmVjdGlvbiA9IDo6Rmlu
ZERpcmVjdGlvbkZvcndhcmQ7CisgICAgaWYgKG9wdGlvbnMgJiBGaW5kQmFja3dhcmQpCisgICAg
ICAgIGRpcmVjdGlvbiA9IDo6RmluZERpcmVjdGlvbkJhY2t3YXJkOworCisgICAgY29uc3QgYm9v
bCBzaG91bGRXcmFwID0gb3B0aW9ucyAmIEZpbmRXcmFwc0Fyb3VuZERvY3VtZW50OworCisgICAg
cmV0dXJuIHBhZ2UtPmZpbmRTdHJpbmcoc3ViU3RyaW5nLCBjYXNlU2Vuc2l0aXZpdHksIGRpcmVj
dGlvbiwgc2hvdWxkV3JhcCk7Cit9CisKK3ZvaWQgUVdlYlBhZ2VBZGFwdGVyOjphZGp1c3RQb2lu
dEZvckNsaWNraW5nKFFNb3VzZUV2ZW50KiBldikKK3sKKyAgICBRdFBsYXRmb3JtUGx1Z2luIHBs
YXRmb3JtUGx1Z2luOworICAgIE93blB0cjxRV2ViVG91Y2hNb2RpZmllcj4gdG91Y2hNb2RpZmll
ciA9IHBsYXRmb3JtUGx1Z2luLmNyZWF0ZVRvdWNoTW9kaWZpZXIoKTsKKyAgICBpZiAoIXRvdWNo
TW9kaWZpZXIpCisgICAgICAgIHJldHVybjsKKworICAgIHVuc2lnbmVkIHRvcFBhZGRpbmcgPSB0
b3VjaE1vZGlmaWVyLT5oaXRUZXN0UGFkZGluZ0ZvclRvdWNoKFFXZWJUb3VjaE1vZGlmaWVyOjpV
cCk7CisgICAgdW5zaWduZWQgcmlnaHRQYWRkaW5nID0gdG91Y2hNb2RpZmllci0+aGl0VGVzdFBh
ZGRpbmdGb3JUb3VjaChRV2ViVG91Y2hNb2RpZmllcjo6UmlnaHQpOworICAgIHVuc2lnbmVkIGJv
dHRvbVBhZGRpbmcgPSB0b3VjaE1vZGlmaWVyLT5oaXRUZXN0UGFkZGluZ0ZvclRvdWNoKFFXZWJU
b3VjaE1vZGlmaWVyOjpEb3duKTsKKyAgICB1bnNpZ25lZCBsZWZ0UGFkZGluZyA9IHRvdWNoTW9k
aWZpZXItPmhpdFRlc3RQYWRkaW5nRm9yVG91Y2goUVdlYlRvdWNoTW9kaWZpZXI6OkxlZnQpOwor
CisgICAgdG91Y2hNb2RpZmllciA9IG51bGxwdHI7CisKKyAgICBpZiAoIXRvcFBhZGRpbmcgJiYg
IXJpZ2h0UGFkZGluZyAmJiAhYm90dG9tUGFkZGluZyAmJiAhbGVmdFBhZGRpbmcpCisgICAgICAg
IHJldHVybjsKKworICAgIERvY3VtZW50KiBzdGFydGluZ0RvY3VtZW50ID0gcGFnZS0+bWFpbkZy
YW1lKCktPmRvY3VtZW50KCk7CisgICAgaWYgKCFzdGFydGluZ0RvY3VtZW50KQorICAgICAgICBy
ZXR1cm47CisKKyAgICBJbnRQb2ludCBvcmlnaW5hbFBvaW50KGV2LT5wb3MoKSk7CisgICAgVG91
Y2hBZGp1c3RlciB0b3VjaEFkanVzdGVyKHRvcFBhZGRpbmcsIHJpZ2h0UGFkZGluZywgYm90dG9t
UGFkZGluZywgbGVmdFBhZGRpbmcpOworICAgIEludFBvaW50IGFkanVzdGVkUG9pbnQgPSB0b3Vj
aEFkanVzdGVyLmZpbmRDYW5kaWRhdGVQb2ludEZvclRvdWNoKG9yaWdpbmFsUG9pbnQsIHN0YXJ0
aW5nRG9jdW1lbnQpOworICAgIGlmIChhZGp1c3RlZFBvaW50ID09IEludFBvaW50Ojp6ZXJvKCkp
CisgICAgICAgIHJldHVybjsKKyAgICBRTW91c2VFdmVudCogcmV0ID0gbmV3IFFNb3VzZUV2ZW50
KGV2LT50eXBlKCksIFFQb2ludChhZGp1c3RlZFBvaW50KSwgZXYtPmdsb2JhbFBvcygpLCBldi0+
YnV0dG9uKCksIGV2LT5idXR0b25zKCksIGV2LT5tb2RpZmllcnMoKSk7CisgICAgZGVsZXRlIGV2
OworICAgIGV2ID0gcmV0OworfQorCitzdGF0aWMgYm9vbCBoYXNNb3VzZUxpc3RlbmVyKEVsZW1l
bnQqIGVsZW1lbnQpCit7CisgICAgQVNTRVJUKGVsZW1lbnQpOworICAgIHJldHVybiBlbGVtZW50
LT5oYXNFdmVudExpc3RlbmVycyhldmVudE5hbWVzKCkuY2xpY2tFdmVudCkKKyAgICAgICAgfHwg
ZWxlbWVudC0+aGFzRXZlbnRMaXN0ZW5lcnMoZXZlbnROYW1lcygpLm1vdXNlZG93bkV2ZW50KQor
ICAgICAgICB8fCBlbGVtZW50LT5oYXNFdmVudExpc3RlbmVycyhldmVudE5hbWVzKCkubW91c2V1
cEV2ZW50KTsKK30KKworc3RhdGljIGJvb2wgaXNDbGlja2FibGVFbGVtZW50KEVsZW1lbnQqIGVs
ZW1lbnQsIFBhc3NSZWZQdHI8Tm9kZUxpc3Q+IHBycExpc3QpCit7CisgICAgQVNTRVJUKGVsZW1l
bnQpOworICAgIFJlZlB0cjxOb2RlTGlzdD4gbGlzdCA9IHBycExpc3Q7CisgICAgYm9vbCBpc0Ns
aWNrYWJsZSA9IGhhc01vdXNlTGlzdGVuZXIoZWxlbWVudCk7CisgICAgaWYgKCFpc0NsaWNrYWJs
ZSAmJiBsaXN0KSB7CisgICAgICAgIEVsZW1lbnQqIHBhcmVudCA9IGVsZW1lbnQtPnBhcmVudEVs
ZW1lbnQoKTsKKyAgICAgICAgdW5zaWduZWQgY291bnQgPSBsaXN0LT5sZW5ndGgoKTsKKyAgICAg
ICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGNvdW50ICYmIHBhcmVudDsgaSsrKSB7CisgICAg
ICAgICAgICBpZiAobGlzdC0+aXRlbShpKSAhPSBwYXJlbnQpCisgICAgICAgICAgICAgICAgY29u
dGludWU7CisKKyAgICAgICAgICAgIGlzQ2xpY2thYmxlID0gaGFzTW91c2VMaXN0ZW5lcihwYXJl
bnQpOworICAgICAgICAgICAgaWYgKGlzQ2xpY2thYmxlKQorICAgICAgICAgICAgICAgIGJyZWFr
OworCisgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQtPnBhcmVudEVsZW1lbnQoKTsKKyAgICAg
ICAgfQorICAgIH0KKworICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOworICAgIHJldHVybiBpc0Ns
aWNrYWJsZQorICAgICAgICB8fCBlbGVtZW50LT53ZWJraXRNYXRjaGVzU2VsZWN0b3IoImEsKjps
aW5rLCo6dmlzaXRlZCwqW3JvbGU9YnV0dG9uXSxidXR0b24saW5wdXQsc2VsZWN0LGxhYmVsIiwg
ZWMpCisgICAgICAgIHx8IENTU0NvbXB1dGVkU3R5bGVEZWNsYXJhdGlvbjo6Y3JlYXRlKGVsZW1l
bnQpLT5nZXRQcm9wZXJ0eVZhbHVlKGNzc1Byb3BlcnR5SUQoImN1cnNvciIpKSA9PSAicG9pbnRl
ciI7Cit9CisKK3N0YXRpYyBib29sIGlzVmFsaWRGcmFtZU93bmVyKEVsZW1lbnQqIGVsZW1lbnQp
Cit7CisgICAgQVNTRVJUKGVsZW1lbnQpOworICAgIHJldHVybiBlbGVtZW50LT5pc0ZyYW1lT3du
ZXJFbGVtZW50KCkgJiYgc3RhdGljX2Nhc3Q8SFRNTEZyYW1lT3duZXJFbGVtZW50Kj4oZWxlbWVu
dCktPmNvbnRlbnRGcmFtZSgpOworfQorCitRV2ViUGFnZUFkYXB0ZXI6OlRvdWNoQWRqdXN0ZXI6
OlRvdWNoQWRqdXN0ZXIodW5zaWduZWQgdG9wUGFkZGluZywgdW5zaWduZWQgcmlnaHRQYWRkaW5n
LCB1bnNpZ25lZCBib3R0b21QYWRkaW5nLCB1bnNpZ25lZCBsZWZ0UGFkZGluZykKKyAgICA6IG1f
dG9wUGFkZGluZyh0b3BQYWRkaW5nKQorICAgICwgbV9yaWdodFBhZGRpbmcocmlnaHRQYWRkaW5n
KQorICAgICwgbV9ib3R0b21QYWRkaW5nKGJvdHRvbVBhZGRpbmcpCisgICAgLCBtX2xlZnRQYWRk
aW5nKGxlZnRQYWRkaW5nKQoreworfQorCitJbnRQb2ludCBRV2ViUGFnZUFkYXB0ZXI6OlRvdWNo
QWRqdXN0ZXI6OmZpbmRDYW5kaWRhdGVQb2ludEZvclRvdWNoKGNvbnN0IEludFBvaW50JiB0b3Vj
aFBvaW50LCBEb2N1bWVudCogZG9jdW1lbnQpIGNvbnN0Cit7CisgICAgaWYgKCFkb2N1bWVudCkK
KyAgICAgICAgcmV0dXJuIEludFBvaW50KCk7CisKKyAgICBpbnQgeCA9IHRvdWNoUG9pbnQueCgp
OworICAgIGludCB5ID0gdG91Y2hQb2ludC55KCk7CisKKyAgICBSZWZQdHI8Tm9kZUxpc3Q+IGlu
dGVyc2VjdGVkTm9kZXMgPSBkb2N1bWVudC0+bm9kZXNGcm9tUmVjdCh4LCB5LCBtX3RvcFBhZGRp
bmcsIG1fcmlnaHRQYWRkaW5nLCBtX2JvdHRvbVBhZGRpbmcsIG1fbGVmdFBhZGRpbmcsIGZhbHNl
IC8qaWdub3JlQ2xpcHBpbmcqLywgZmFsc2UgLyphbGxvd1NoYWRvd0NvbnRlbnQqLyk7CisgICAg
aWYgKCFpbnRlcnNlY3RlZE5vZGVzKQorICAgICAgICByZXR1cm4gSW50UG9pbnQoKTsKKworICAg
IEVsZW1lbnQqIGNsb3Nlc3RDbGlja2FibGVFbGVtZW50ID0gMDsKKyAgICBJbnRSZWN0IGxhcmdl
c3RJbnRlcnNlY3Rpb25SZWN0OworICAgIEZyYW1lVmlldyogdmlldyA9IGRvY3VtZW50LT5mcmFt
ZSgpLT52aWV3KCk7CisKKyAgICAvLyBUb3VjaCByZWN0IGluIGNvbnRlbnRzIGNvb3JkaW5hdGVz
LgorICAgIEludFJlY3QgdG91Y2hSZWN0KEhpdFRlc3RMb2NhdGlvbjo6cmVjdEZvclBvaW50KHZp
ZXctPndpbmRvd1RvQ29udGVudHMoSW50UG9pbnQoeCwgeSkpLCBtX3RvcFBhZGRpbmcsIG1fcmln
aHRQYWRkaW5nLCBtX2JvdHRvbVBhZGRpbmcsIG1fbGVmdFBhZGRpbmcpKTsKKworICAgIC8vIEl0
ZXJhdGUgb3ZlciB0aGUgbGlzdCBvZiBub2RlcyBoaXQgbG9va2luZyBmb3IgdGhlIG9uZSB3aG9z
ZSBib3VuZGluZyBhcmVhCisgICAgLy8gaGFzIGxhcmdlc3QgaW50ZXJzZWN0aW9uIHdpdGggdGhl
IHRvdWNoIGFyZWEgKHBvaW50ICsgcGFkZGluZykuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSA8IGludGVyc2VjdGVkTm9kZXMtPmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgTm9kZSogY3Vy
cmVudE5vZGUgPSBpbnRlcnNlY3RlZE5vZGVzLT5pdGVtKGkpOworCisgICAgICAgIEVsZW1lbnQq
IGN1cnJlbnRFbGVtZW50ID0gY3VycmVudE5vZGUtPmlzRWxlbWVudE5vZGUoKSA/IHRvRWxlbWVu
dChjdXJyZW50Tm9kZSkgOiAwOworICAgICAgICBpZiAoIWN1cnJlbnRFbGVtZW50IHx8ICghaXND
bGlja2FibGVFbGVtZW50KGN1cnJlbnRFbGVtZW50LCAwKSAmJiAhaXNWYWxpZEZyYW1lT3duZXIo
Y3VycmVudEVsZW1lbnQpKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIEludFJl
Y3QgY3VycmVudEVsZW1lbnRCb3VuZGluZ1JlY3QgPSBjdXJyZW50RWxlbWVudC0+cGl4ZWxTbmFw
cGVkQm91bmRpbmdCb3goKTsKKyAgICAgICAgY3VycmVudEVsZW1lbnRCb3VuZGluZ1JlY3QuaW50
ZXJzZWN0KHRvdWNoUmVjdCk7CisKKyAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50Qm91bmRpbmdS
ZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGludCBjdXJy
ZW50SW50ZXJzZWN0aW9uUmVjdEFyZWEgPSBjdXJyZW50RWxlbWVudEJvdW5kaW5nUmVjdC53aWR0
aCgpICogY3VycmVudEVsZW1lbnRCb3VuZGluZ1JlY3QuaGVpZ2h0KCk7CisgICAgICAgIGludCBs
YXJnZXN0SW50ZXJzZWN0aW9uUmVjdEFyZWEgPSBsYXJnZXN0SW50ZXJzZWN0aW9uUmVjdC53aWR0
aCgpICogbGFyZ2VzdEludGVyc2VjdGlvblJlY3QuaGVpZ2h0KCk7CisgICAgICAgIGlmIChjdXJy
ZW50SW50ZXJzZWN0aW9uUmVjdEFyZWEgPiBsYXJnZXN0SW50ZXJzZWN0aW9uUmVjdEFyZWEpIHsK
KyAgICAgICAgICAgIGNsb3Nlc3RDbGlja2FibGVFbGVtZW50ID0gY3VycmVudEVsZW1lbnQ7Cisg
ICAgICAgICAgICBsYXJnZXN0SW50ZXJzZWN0aW9uUmVjdCA9IGN1cnJlbnRFbGVtZW50Qm91bmRp
bmdSZWN0OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGxhcmdlc3RJbnRlcnNlY3Rpb25S
ZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIEludFBvaW50KCk7CisKKyAgICAvLyBIYW5k
bGUgdGhlIGNhc2Ugd2hlbiB1c2VyIHRhcHMgYSBpbm5lciBmcmFtZS4gSXQgaXMgZG9uZSBpbiB0
aHJlZSBzdGVwczoKKyAgICAvLyAxKSBUcmFuc2Zvcm0gdGhlIG9yaWdpbmFsIHRvdWNoIHBvaW50
IHRvIHRoZSBpbm5lciBkb2N1bWVudCBjb29yZGluYXRlczsKKyAgICAvLyAxKSBDYWxsIG5vZGVz
RnJvbVJlY3QgZm9yIHRoZSBpbm5lciBkb2N1bWVudCBpbiBjYXNlOworICAgIC8vIDMpIFJlLWFk
ZCB0aGUgaW5uZXIgZnJhbWUgb2Zmc2V0IChsb2NhdGlvbikgYmVmb3JlIHBhc3NpbmcgdGhlIG5l
dyBjbGlja2luZworICAgIC8vICAgIHBvc2l0aW9uIHRvIFdlYkNvcmUuCisgICAgaWYgKGNsb3Nl
c3RDbGlja2FibGVFbGVtZW50LT5pc0ZyYW1lT3duZXJFbGVtZW50KCkpIHsKKyAgICAgICAgLy8g
QWRqdXN0IGNsaWVudCBjb29yZGluYXRlcycgb3JpZ2luIHRvIGJlIHRvcCBsZWZ0IG9mIGlubmVy
IGZyYW1lIHZpZXdwb3J0LgorICAgICAgICBSZWZQdHI8Q2xpZW50UmVjdD4gcmVjdCA9IGNsb3Nl
c3RDbGlja2FibGVFbGVtZW50LT5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKKyAgICAgICAgSW50
UG9pbnQgbmV3VG91Y2hQb2ludCA9IHRvdWNoUG9pbnQ7CisgICAgICAgIEludFNpemUgb2Zmc2V0
ID0gIEludFNpemUocmVjdC0+bGVmdCgpLCByZWN0LT50b3AoKSk7CisgICAgICAgIG5ld1RvdWNo
UG9pbnQgLT0gb2Zmc2V0OworCisgICAgICAgIEhUTUxGcmFtZU93bmVyRWxlbWVudCogb3duZXIg
PSBzdGF0aWNfY2FzdDxIVE1MRnJhbWVPd25lckVsZW1lbnQqPihjbG9zZXN0Q2xpY2thYmxlRWxl
bWVudCk7CisgICAgICAgIERvY3VtZW50KiBjaGlsZERvY3VtZW50ID0gb3duZXItPmNvbnRlbnRG
cmFtZSgpLT5kb2N1bWVudCgpOworICAgICAgICByZXR1cm4gZmluZENhbmRpZGF0ZVBvaW50Rm9y
VG91Y2gobmV3VG91Y2hQb2ludCwgY2hpbGREb2N1bWVudCk7CisgICAgfQorICAgIHJldHVybiB2
aWV3LT5jb250ZW50c1RvV2luZG93KGxhcmdlc3RJbnRlcnNlY3Rpb25SZWN0KS5jZW50ZXIoKTsK
K30KKwordm9pZCBRV2ViUGFnZUFkYXB0ZXI6Om1vdXNlTW92ZUV2ZW50KFFNb3VzZUV2ZW50KiBl
dikKK3sKKyAgICBXZWJDb3JlOjpGcmFtZSogZnJhbWUgPSBtYWluRnJhbWVBZGFwdGVyKCktPmZy
YW1lOworICAgIGlmICghZnJhbWUtPnZpZXcoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgYm9v
bCBhY2NlcHRlZCA9IGZyYW1lLT5ldmVudEhhbmRsZXIoKS0+bW91c2VNb3ZlZChjb252ZXJ0TW91
c2VFdmVudChldiwgMCkpOworICAgIGV2LT5zZXRBY2NlcHRlZChhY2NlcHRlZCk7Cit9CisKK3Zv
aWQgUVdlYlBhZ2VBZGFwdGVyOjptb3VzZVByZXNzRXZlbnQoUU1vdXNlRXZlbnQqIGV2KQorewor
ICAgIFdlYkNvcmU6OkZyYW1lKiBmcmFtZSA9IG1haW5GcmFtZUFkYXB0ZXIoKS0+ZnJhbWU7Cisg
ICAgaWYgKCFmcmFtZS0+dmlldygpKQorICAgICAgICByZXR1cm47CisKKyAgICBSZWZQdHI8V2Vi
Q29yZTo6Tm9kZT4gb2xkTm9kZTsKKyAgICBGcmFtZSogZm9jdXNlZEZyYW1lID0gcGFnZS0+Zm9j
dXNDb250cm9sbGVyKCktPmZvY3VzZWRGcmFtZSgpOworICAgIGlmIChEb2N1bWVudCogZm9jdXNl
ZERvY3VtZW50ID0gZm9jdXNlZEZyYW1lID8gZm9jdXNlZEZyYW1lLT5kb2N1bWVudCgpIDogMCkK
KyAgICAgICAgb2xkTm9kZSA9IGZvY3VzZWREb2N1bWVudC0+Zm9jdXNlZE5vZGUoKTsKKworICAg
IGlmICh0cmlwbGVDbGlja1RpbWVyLmlzQWN0aXZlKCkKKyAgICAgICAgJiYgKGV2LT5wb3MoKSAt
IHRyaXBsZUNsaWNrKS5tYW5oYXR0YW5MZW5ndGgoKSA8IHFHdWlBcHAtPnN0eWxlSGludHMoKS0+
c3RhcnREcmFnRGlzdGFuY2UoKSkgeworICAgICAgICBtb3VzZVRyaXBsZUNsaWNrRXZlbnQoZXYp
OworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYm9vbCBhY2NlcHRlZCA9IGZhbHNlOwor
ICAgIFBsYXRmb3JtTW91c2VFdmVudCBtZXYgPSBjb252ZXJ0TW91c2VFdmVudChldiwgMSk7Cisg
ICAgLy8gaWdub3JlIHRoZSBldmVudCBpZiB3ZSBjYW4ndCBtYXAgUXQncyBtb3VzZSBidXR0b25z
IHRvIFdlYkNvcmU6Ok1vdXNlQnV0dG9uCisgICAgaWYgKG1ldi5idXR0b24oKSAhPSBOb0J1dHRv
bikKKyAgICAgICAgYWNjZXB0ZWQgPSBmcmFtZS0+ZXZlbnRIYW5kbGVyKCktPmhhbmRsZU1vdXNl
UHJlc3NFdmVudChtZXYpOworICAgIGV2LT5zZXRBY2NlcHRlZChhY2NlcHRlZCk7CisKKyAgICBS
ZWZQdHI8V2ViQ29yZTo6Tm9kZT4gbmV3Tm9kZTsKKyAgICBmb2N1c2VkRnJhbWUgPSBwYWdlLT5m
b2N1c0NvbnRyb2xsZXIoKS0+Zm9jdXNlZEZyYW1lKCk7CisgICAgaWYgKERvY3VtZW50KiBmb2N1
c2VkRG9jdW1lbnQgPSBmb2N1c2VkRnJhbWUgPyBmb2N1c2VkRnJhbWUtPmRvY3VtZW50KCkgOiAw
KQorICAgICAgICBuZXdOb2RlID0gZm9jdXNlZERvY3VtZW50LT5mb2N1c2VkTm9kZSgpOworCisg
ICAgaWYgKG5ld05vZGUgJiYgb2xkTm9kZSAhPSBuZXdOb2RlKQorICAgICAgICBjbGlja0NhdXNl
ZEZvY3VzID0gdHJ1ZTsKK30KKwordm9pZCBRV2ViUGFnZUFkYXB0ZXI6Om1vdXNlRG91YmxlQ2xp
Y2tFdmVudChRTW91c2VFdmVudCAqZXYpCit7CisgICAgV2ViQ29yZTo6RnJhbWUqIGZyYW1lID0g
bWFpbkZyYW1lQWRhcHRlcigpLT5mcmFtZTsKKyAgICBpZiAoIWZyYW1lLT52aWV3KCkpCisgICAg
ICAgIHJldHVybjsKKworICAgIGJvb2wgYWNjZXB0ZWQgPSBmYWxzZTsKKyAgICBQbGF0Zm9ybU1v
dXNlRXZlbnQgbWV2ID0gY29udmVydE1vdXNlRXZlbnQoZXYsIDIpOworICAgIC8vIGlnbm9yZSB0
aGUgZXZlbnQgaWYgd2UgY2FuJ3QgbWFwIFF0J3MgbW91c2UgYnV0dG9ucyB0byBXZWJDb3JlOjpN
b3VzZUJ1dHRvbgorICAgIGlmIChtZXYuYnV0dG9uKCkgIT0gTm9CdXR0b24pCisgICAgICAgIGFj
Y2VwdGVkID0gZnJhbWUtPmV2ZW50SGFuZGxlcigpLT5oYW5kbGVNb3VzZVByZXNzRXZlbnQobWV2
KTsKKyAgICBldi0+c2V0QWNjZXB0ZWQoYWNjZXB0ZWQpOworCisgICAgdHJpcGxlQ2xpY2tUaW1l
ci5zdGFydChxR3VpQXBwLT5zdHlsZUhpbnRzKCktPm1vdXNlRG91YmxlQ2xpY2tJbnRlcnZhbCgp
LCBoYW5kbGUoKSk7CisgICAgdHJpcGxlQ2xpY2sgPSBRUG9pbnRGKGV2LT5wb3MoKSkudG9Qb2lu
dCgpOworfQorCit2b2lkIFFXZWJQYWdlQWRhcHRlcjo6bW91c2VUcmlwbGVDbGlja0V2ZW50KFFN
b3VzZUV2ZW50ICpldikKK3sKKyAgICBXZWJDb3JlOjpGcmFtZSogZnJhbWUgPSBtYWluRnJhbWVB
ZGFwdGVyKCktPmZyYW1lOworICAgIGlmICghZnJhbWUtPnZpZXcoKSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgYm9vbCBhY2NlcHRlZCA9IGZhbHNlOworICAgIFBsYXRmb3JtTW91c2VFdmVudCBt
ZXYgPSBjb252ZXJ0TW91c2VFdmVudChldiwgMyk7CisgICAgLy8gaWdub3JlIHRoZSBldmVudCBp
ZiB3ZSBjYW4ndCBtYXAgUXQncyBtb3VzZSBidXR0b25zIHRvIFdlYkNvcmU6Ok1vdXNlQnV0dG9u
CisgICAgaWYgKG1ldi5idXR0b24oKSAhPSBOb0J1dHRvbikKKyAgICAgICAgYWNjZXB0ZWQgPSBm
cmFtZS0+ZXZlbnRIYW5kbGVyKCktPmhhbmRsZU1vdXNlUHJlc3NFdmVudChtZXYpOworICAgIGV2
LT5zZXRBY2NlcHRlZChhY2NlcHRlZCk7Cit9CisKK3ZvaWQgUVdlYlBhZ2VBZGFwdGVyOjptb3Vz
ZVJlbGVhc2VFdmVudChRTW91c2VFdmVudCAqZXYpCit7CisgICAgV2ViQ29yZTo6RnJhbWUqIGZy
YW1lID0gbWFpbkZyYW1lQWRhcHRlcigpLT5mcmFtZTsKKyAgICBpZiAoIWZyYW1lLT52aWV3KCkp
CisgICAgICAgIHJldHVybjsKKworICAgIGJvb2wgYWNjZXB0ZWQgPSBmYWxzZTsKKyAgICBQbGF0
Zm9ybU1vdXNlRXZlbnQgbWV2ID0gY29udmVydE1vdXNlRXZlbnQoZXYsIDApOworICAgIC8vIGln
bm9yZSB0aGUgZXZlbnQgaWYgd2UgY2FuJ3QgbWFwIFF0J3MgbW91c2UgYnV0dG9ucyB0byBXZWJD
b3JlOjpNb3VzZUJ1dHRvbgorICAgIGlmIChtZXYuYnV0dG9uKCkgIT0gTm9CdXR0b24pCisgICAg
ICAgIGFjY2VwdGVkID0gZnJhbWUtPmV2ZW50SGFuZGxlcigpLT5oYW5kbGVNb3VzZVJlbGVhc2VF
dmVudChtZXYpOworICAgIGV2LT5zZXRBY2NlcHRlZChhY2NlcHRlZCk7CisKKyAgICBoYW5kbGVT
b2Z0d2FyZUlucHV0UGFuZWwoZXYtPmJ1dHRvbigpLCBRUG9pbnRGKGV2LT5wb3MoKSkudG9Qb2lu
dCgpKTsKK30KKwordm9pZCBRV2ViUGFnZUFkYXB0ZXI6OmhhbmRsZVNvZnR3YXJlSW5wdXRQYW5l
bChRdDo6TW91c2VCdXR0b24gYnV0dG9uLCBjb25zdCBRUG9pbnQmIHBvcykKK3sKKyAgICBGcmFt
ZSogZnJhbWUgPSBwYWdlLT5mb2N1c0NvbnRyb2xsZXIoKS0+Zm9jdXNlZEZyYW1lKCk7CisgICAg
aWYgKCFmcmFtZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGNsaWVudCAmJiBjbGllbnQt
PmlucHV0TWV0aG9kRW5hYmxlZCgpCisgICAgICAgICYmIGZyYW1lLT5kb2N1bWVudCgpLT5mb2N1
c2VkTm9kZSgpCisgICAgICAgICAgICAmJiBidXR0b24gPT0gUXQ6OkxlZnRCdXR0b24gJiYgcUd1
aUFwcC0+cHJvcGVydHkoImF1dG9TaXBFbmFibGVkIikudG9Cb29sKCkpIHsKKyAgICAgICAgaWYg
KCFjbGlja0NhdXNlZEZvY3VzIHx8IHJlcXVlc3RTb2Z0d2FyZUlucHV0UGFuZWwoKSkgeworICAg
ICAgICAgICAgSGl0VGVzdFJlc3VsdCByZXN1bHQgPSBmcmFtZS0+ZXZlbnRIYW5kbGVyKCktPmhp
dFRlc3RSZXN1bHRBdFBvaW50KGZyYW1lLT52aWV3KCktPndpbmRvd1RvQ29udGVudHMocG9zKSwg
ZmFsc2UpOworICAgICAgICAgICAgaWYgKHJlc3VsdC5pc0NvbnRlbnRFZGl0YWJsZSgpKSB7Cisg
ICAgICAgICAgICAgICAgUUV2ZW50IGV2ZW50KFFFdmVudDo6UmVxdWVzdFNvZnR3YXJlSW5wdXRQ
YW5lbCk7CisgICAgICAgICAgICAgICAgUUd1aUFwcGxpY2F0aW9uOjpzZW5kRXZlbnQoY2xpZW50
LT5vd25lcldpZGdldCgpLCAmZXZlbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAg
fQorCisgICAgY2xpY2tDYXVzZWRGb2N1cyA9IGZhbHNlOworfQorCisjaWZuZGVmIFFUX05PX1dI
RUVMRVZFTlQKK3ZvaWQgUVdlYlBhZ2VBZGFwdGVyOjp3aGVlbEV2ZW50KFFXaGVlbEV2ZW50ICpl
diwgaW50IHdoZWVsU2Nyb2xsTGluZXMpCit7CisgICAgV2ViQ29yZTo6RnJhbWUqIGZyYW1lID0g
bWFpbkZyYW1lQWRhcHRlcigpLT5mcmFtZTsKKyAgICBpZiAoIWZyYW1lLT52aWV3KCkpCisgICAg
ICAgIHJldHVybjsKKworICAgIFBsYXRmb3JtV2hlZWxFdmVudCBwZXYgPSBjb252ZXJ0V2hlZWxF
dmVudChldiwgd2hlZWxTY3JvbGxMaW5lcyk7CisgICAgYm9vbCBhY2NlcHRlZCA9IGZyYW1lLT5l
dmVudEhhbmRsZXIoKS0+aGFuZGxlV2hlZWxFdmVudChwZXYpOworICAgIGV2LT5zZXRBY2NlcHRl
ZChhY2NlcHRlZCk7Cit9CisjZW5kaWYgLy8gUVRfTk9fV0hFRUxFVkVOVAorCisjaWZuZGVmIFFU
X05PX0RSQUdBTkREUk9QCisKK1F0OjpEcm9wQWN0aW9uIFFXZWJQYWdlQWRhcHRlcjo6ZHJhZ0Vu
dGVyZWQoY29uc3QgUU1pbWVEYXRhICpkYXRhLCBjb25zdCBRUG9pbnQgJnBvcywgUXQ6OkRyb3BB
Y3Rpb25zIHBvc3NpYmxlQWN0aW9ucykKK3sKKyAgICBEcmFnRGF0YSBkcmFnRGF0YShkYXRhLCBw
b3MsIFFDdXJzb3I6OnBvcygpLCBkcm9wQWN0aW9uVG9EcmFnT3AocG9zc2libGVBY3Rpb25zKSk7
CisgICAgcmV0dXJuIGRyYWdPcFRvRHJvcEFjdGlvbihwYWdlLT5kcmFnQ29udHJvbGxlcigpLT5k
cmFnRW50ZXJlZCgmZHJhZ0RhdGEpLm9wZXJhdGlvbik7Cit9CisKK3ZvaWQgUVdlYlBhZ2VBZGFw
dGVyOjpkcmFnTGVhdmVFdmVudCgpCit7CisgICAgRHJhZ0RhdGEgZHJhZ0RhdGEoMCwgSW50UG9p
bnQoKSwgUUN1cnNvcjo6cG9zKCksIERyYWdPcGVyYXRpb25Ob25lKTsKKyAgICBwYWdlLT5kcmFn
Q29udHJvbGxlcigpLT5kcmFnRXhpdGVkKCZkcmFnRGF0YSk7Cit9CisKK1F0OjpEcm9wQWN0aW9u
IFFXZWJQYWdlQWRhcHRlcjo6ZHJhZ1VwZGF0ZWQoY29uc3QgUU1pbWVEYXRhICpkYXRhLCBjb25z
dCBRUG9pbnQgJnBvcywgUXQ6OkRyb3BBY3Rpb25zIHBvc3NpYmxlQWN0aW9ucykKK3sKKyAgICBE
cmFnRGF0YSBkcmFnRGF0YShkYXRhLCBwb3MsIFFDdXJzb3I6OnBvcygpLCBkcm9wQWN0aW9uVG9E
cmFnT3AocG9zc2libGVBY3Rpb25zKSk7CisgICAgcmV0dXJuIGRyYWdPcFRvRHJvcEFjdGlvbihw
YWdlLT5kcmFnQ29udHJvbGxlcigpLT5kcmFnVXBkYXRlZCgmZHJhZ0RhdGEpLm9wZXJhdGlvbik7
Cit9CisKK2Jvb2wgUVdlYlBhZ2VBZGFwdGVyOjpwZXJmb3JtRHJhZyhjb25zdCBRTWltZURhdGEg
KmRhdGEsIGNvbnN0IFFQb2ludCAmcG9zLCBRdDo6RHJvcEFjdGlvbnMgcG9zc2libGVBY3Rpb25z
KQoreworICAgIERyYWdEYXRhIGRyYWdEYXRhKGRhdGEsIHBvcywgUUN1cnNvcjo6cG9zKCksIGRy
b3BBY3Rpb25Ub0RyYWdPcChwb3NzaWJsZUFjdGlvbnMpKTsKKyAgICByZXR1cm4gcGFnZS0+ZHJh
Z0NvbnRyb2xsZXIoKS0+cGVyZm9ybURyYWcoJmRyYWdEYXRhKTsKK30KKwordm9pZCBRV2ViUGFn
ZUFkYXB0ZXI6OmlucHV0TWV0aG9kRXZlbnQoUUlucHV0TWV0aG9kRXZlbnQgKmV2KQoreworICAg
IFdlYkNvcmU6OkZyYW1lICpmcmFtZSA9IHBhZ2UtPmZvY3VzQ29udHJvbGxlcigpLT5mb2N1c2Vk
T3JNYWluRnJhbWUoKTsKKyAgICBXZWJDb3JlOjpFZGl0b3IgKmVkaXRvciA9IGZyYW1lLT5lZGl0
b3IoKTsKKworICAgIGlmICghZWRpdG9yLT5jYW5FZGl0KCkpIHsKKyAgICAgICAgZXYtPmlnbm9y
ZSgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTm9kZSogbm9kZSA9IDA7CisgICAg
aWYgKGZyYW1lLT5zZWxlY3Rpb24oKS0+cm9vdEVkaXRhYmxlRWxlbWVudCgpKQorICAgICAgICBu
b2RlID0gZnJhbWUtPnNlbGVjdGlvbigpLT5yb290RWRpdGFibGVFbGVtZW50KCktPnNoYWRvd0Fu
Y2VzdG9yTm9kZSgpOworCisgICAgVmVjdG9yPENvbXBvc2l0aW9uVW5kZXJsaW5lPiB1bmRlcmxp
bmVzOworICAgIGJvb2wgaGFzU2VsZWN0aW9uID0gZmFsc2U7CisKKyAgICBmb3IgKGludCBpID0g
MDsgaSA8IGV2LT5hdHRyaWJ1dGVzKCkuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgY29uc3QgUUlu
cHV0TWV0aG9kRXZlbnQ6OkF0dHJpYnV0ZSYgYSA9IGV2LT5hdHRyaWJ1dGVzKCkuYXQoaSk7Cisg
ICAgICAgIHN3aXRjaCAoYS50eXBlKSB7CisgICAgICAgIGNhc2UgUUlucHV0TWV0aG9kRXZlbnQ6
OlRleHRGb3JtYXQ6IHsKKyAgICAgICAgICAgIFFUZXh0Q2hhckZvcm1hdCB0ZXh0Q2hhckZvcm1h
dCA9IGEudmFsdWUudmFsdWU8UVRleHRGb3JtYXQ+KCkudG9DaGFyRm9ybWF0KCk7CisgICAgICAg
ICAgICBRQ29sb3IgcWNvbG9yID0gdGV4dENoYXJGb3JtYXQudW5kZXJsaW5lQ29sb3IoKTsKKyAg
ICAgICAgICAgIHVuZGVybGluZXMuYXBwZW5kKENvbXBvc2l0aW9uVW5kZXJsaW5lKHFNaW4oYS5z
dGFydCwgKGEuc3RhcnQgKyBhLmxlbmd0aCkpLCBxTWF4KGEuc3RhcnQsIChhLnN0YXJ0ICsgYS5s
ZW5ndGgpKSwgQ29sb3IobWFrZVJHQkEocWNvbG9yLnJlZCgpLCBxY29sb3IuZ3JlZW4oKSwgcWNv
bG9yLmJsdWUoKSwgcWNvbG9yLmFscGhhKCkpKSwgZmFsc2UpKTsKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICB9CisgICAgICAgIGNhc2UgUUlucHV0TWV0aG9kRXZlbnQ6OkN1cnNvcjogewor
ICAgICAgICAgICAgZnJhbWUtPnNlbGVjdGlvbigpLT5zZXRDYXJldFZpc2libGUoYS5sZW5ndGgp
OyAvLyBpZiBsZW5ndGggaXMgMCBjdXJzb3IgaXMgaW52aXNpYmxlCisgICAgICAgICAgICBpZiAo
YS5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgUmVuZGVyT2JqZWN0KiBjYXJldFJlbmRl
cmVyID0gZnJhbWUtPnNlbGVjdGlvbigpLT5jYXJldFJlbmRlcmVyKCk7CisgICAgICAgICAgICAg
ICAgaWYgKGNhcmV0UmVuZGVyZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgUUNvbG9yIHFjb2xv
ciA9IGEudmFsdWUudmFsdWU8UUNvbG9yPigpOworICAgICAgICAgICAgICAgICAgICBjYXJldFJl
bmRlcmVyLT5zdHlsZSgpLT5zZXRDb2xvcihDb2xvcihtYWtlUkdCQShxY29sb3IucmVkKCksIHFj
b2xvci5ncmVlbigpLCBxY29sb3IuYmx1ZSgpLCBxY29sb3IuYWxwaGEoKSkpKTsKKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQor
ICAgICAgICBjYXNlIFFJbnB1dE1ldGhvZEV2ZW50OjpTZWxlY3Rpb246IHsKKyAgICAgICAgICAg
IGhhc1NlbGVjdGlvbiA9IHRydWU7CisgICAgICAgICAgICAvLyBBIHNlbGVjdGlvbiBpbiB0aGUg
aW5wdXRNZXRob2RFdmVudCBpcyBhbHdheXMgcmVmbGVjdGVkIGluIHRoZSB2aXNpYmxlIHRleHQK
KyAgICAgICAgICAgIGlmIChub2RlKSB7CisgICAgICAgICAgICAgICAgaWYgKEhUTUxUZXh0Rm9y
bUNvbnRyb2xFbGVtZW50KiB0ZXh0Q29udHJvbCA9IHRvVGV4dEZvcm1Db250cm9sKG5vZGUpKQor
ICAgICAgICAgICAgICAgICAgICB0ZXh0Q29udHJvbC0+c2V0U2VsZWN0aW9uUmFuZ2UocU1pbihh
LnN0YXJ0LCAoYS5zdGFydCArIGEubGVuZ3RoKSksIHFNYXgoYS5zdGFydCwgKGEuc3RhcnQgKyBh
Lmxlbmd0aCkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFldi0+cHJlZWRp
dFN0cmluZygpLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICBlZGl0b3ItPnNldENvbXBvc2l0
aW9uKGV2LT5wcmVlZGl0U3RyaW5nKCksIHVuZGVybGluZXMsIHFNaW4oYS5zdGFydCwgKGEuc3Rh
cnQgKyBhLmxlbmd0aCkpLCBxTWF4KGEuc3RhcnQsIChhLnN0YXJ0ICsgYS5sZW5ndGgpKSk7Cisg
ICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSBhcmUgaW4gdGhlIG1p
ZGRsZSBvZiBhIGNvbXBvc2l0aW9uLCBhbiBlbXB0eSBwcmUtZWRpdCBzdHJpbmcgYW5kIGEgc2Vs
ZWN0aW9uIG9mIHplcm8KKyAgICAgICAgICAgICAgICAvLyBjYW5jZWxzIHRoZSBjdXJyZW50IGNv
bXBvc2l0aW9uCisgICAgICAgICAgICAgICAgaWYgKGVkaXRvci0+aGFzQ29tcG9zaXRpb24oKSAm
JiAhKGEuc3RhcnQgKyBhLmxlbmd0aCkpCisgICAgICAgICAgICAgICAgICAgIGVkaXRvci0+c2V0
Q29tcG9zaXRpb24oUVN0cmluZygpLCB1bmRlcmxpbmVzLCAwLCAwKTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChub2RlICYmIGV2LT5yZXBs
YWNlbWVudExlbmd0aCgpID4gMCkgeworICAgICAgICBpbnQgY3Vyc29yUG9zID0gZnJhbWUtPnNl
bGVjdGlvbigpLT5leHRlbnQoKS5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKTsKKyAgICAgICAgaW50
IHN0YXJ0ID0gY3Vyc29yUG9zICsgZXYtPnJlcGxhY2VtZW50U3RhcnQoKTsKKyAgICAgICAgaWYg
KEhUTUxUZXh0Rm9ybUNvbnRyb2xFbGVtZW50KiB0ZXh0Q29udHJvbCA9IHRvVGV4dEZvcm1Db250
cm9sKG5vZGUpKQorICAgICAgICAgICAgdGV4dENvbnRyb2wtPnNldFNlbGVjdGlvblJhbmdlKHN0
YXJ0LCBzdGFydCArIGV2LT5yZXBsYWNlbWVudExlbmd0aCgpKTsKKyAgICAgICAgLy8gQ29tbWl0
IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBjb21taXRTdHJpbmcgaXMgZW1wdHksIHRvIGdldCByaWQg
b2Ygc2VsZWN0aW9uLgorICAgICAgICBlZGl0b3ItPmNvbmZpcm1Db21wb3NpdGlvbihldi0+Y29t
bWl0U3RyaW5nKCkpOworICAgIH0gZWxzZSBpZiAoIWV2LT5jb21taXRTdHJpbmcoKS5pc0VtcHR5
KCkpIHsKKyAgICAgICAgaWYgKGVkaXRvci0+aGFzQ29tcG9zaXRpb24oKSkKKyAgICAgICAgICAg
IGVkaXRvci0+Y29uZmlybUNvbXBvc2l0aW9uKGV2LT5jb21taXRTdHJpbmcoKSk7CisgICAgICAg
IGVsc2UKKyAgICAgICAgICAgIGVkaXRvci0+aW5zZXJ0VGV4dChldi0+Y29tbWl0U3RyaW5nKCks
IDApOworICAgIH0gZWxzZSBpZiAoIWhhc1NlbGVjdGlvbiAmJiAhZXYtPnByZWVkaXRTdHJpbmco
KS5pc0VtcHR5KCkpCisgICAgICAgIGVkaXRvci0+c2V0Q29tcG9zaXRpb24oZXYtPnByZWVkaXRT
dHJpbmcoKSwgdW5kZXJsaW5lcywgMCwgMCk7CisgICAgZWxzZSBpZiAoZXYtPnByZWVkaXRTdHJp
bmcoKS5pc0VtcHR5KCkgJiYgZWRpdG9yLT5oYXNDb21wb3NpdGlvbigpKQorICAgICAgICBlZGl0
b3ItPmNvbmZpcm1Db21wb3NpdGlvbihTdHJpbmcoKSk7CisKKyAgICBldi0+YWNjZXB0KCk7Cit9
CisKK1FWYXJpYW50IFFXZWJQYWdlQWRhcHRlcjo6aW5wdXRNZXRob2RRdWVyeShRdDo6SW5wdXRN
ZXRob2RRdWVyeSBwcm9wZXJ0eSkgY29uc3QKK3sKKyAgICBGcmFtZSogZnJhbWUgPSBwYWdlLT5m
b2N1c0NvbnRyb2xsZXIoKS0+Zm9jdXNlZEZyYW1lKCk7CisgICAgaWYgKCFmcmFtZSkKKyAgICAg
ICAgcmV0dXJuIFFWYXJpYW50KCk7CisKKyAgICBXZWJDb3JlOjpFZGl0b3IqIGVkaXRvciA9IGZy
YW1lLT5lZGl0b3IoKTsKKworICAgIFJlbmRlck9iamVjdCogcmVuZGVyZXIgPSAwOworICAgIFJl
bmRlclRleHRDb250cm9sKiByZW5kZXJUZXh0Q29udHJvbCA9IDA7CisKKyAgICBpZiAoZnJhbWUt
PnNlbGVjdGlvbigpLT5yb290RWRpdGFibGVFbGVtZW50KCkpCisgICAgICAgIHJlbmRlcmVyID0g
ZnJhbWUtPnNlbGVjdGlvbigpLT5yb290RWRpdGFibGVFbGVtZW50KCktPnNoYWRvd0FuY2VzdG9y
Tm9kZSgpLT5yZW5kZXJlcigpOworCisgICAgaWYgKHJlbmRlcmVyICYmIHJlbmRlcmVyLT5pc1Rl
eHRDb250cm9sKCkpCisgICAgICAgIHJlbmRlclRleHRDb250cm9sID0gdG9SZW5kZXJUZXh0Q29u
dHJvbChyZW5kZXJlcik7CisKKyAgICBzd2l0Y2ggKHByb3BlcnR5KSB7CisgICAgY2FzZSBRdDo6
SW1NaWNyb0ZvY3VzOiB7CisgICAgICAgIFdlYkNvcmU6OkZyYW1lVmlldyogdmlldyA9IGZyYW1l
LT52aWV3KCk7CisgICAgICAgIGlmICh2aWV3ICYmIHZpZXctPm5lZWRzTGF5b3V0KCkpIHsKKyAg
ICAgICAgICAgIC8vIFdlIGNhbid0IGFjY2VzcyBhYnNvbHV0ZUNhcmV0Qm91bmRzKCkgd2hpbGUg
dGhlIHZpZXcgbmVlZHMgdG8gbGF5b3V0LgorICAgICAgICAgICAgcmV0dXJuIFFWYXJpYW50KCk7
CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFFWYXJpYW50KHZpZXctPmNvbnRlbnRzVG9XaW5k
b3coZnJhbWUtPnNlbGVjdGlvbigpLT5hYnNvbHV0ZUNhcmV0Qm91bmRzKCkpKTsKKyAgICB9Cisg
ICAgY2FzZSBRdDo6SW1Gb250OiB7CisgICAgICAgIGlmIChyZW5kZXJUZXh0Q29udHJvbCkgewor
ICAgICAgICAgICAgUmVuZGVyU3R5bGUqIHJlbmRlclN0eWxlID0gcmVuZGVyVGV4dENvbnRyb2wt
PnN0eWxlKCk7CisgICAgICAgICAgICByZXR1cm4gUVZhcmlhbnQoUUZvbnQocmVuZGVyU3R5bGUt
PmZvbnQoKS5zeW50aGV0aWNGb250KCkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUVZh
cmlhbnQoUUZvbnQoKSk7CisgICAgfQorICAgIGNhc2UgUXQ6OkltQ3Vyc29yUG9zaXRpb246IHsK
KyAgICAgICAgaWYgKGVkaXRvci0+aGFzQ29tcG9zaXRpb24oKSkKKyAgICAgICAgICAgIHJldHVy
biBRVmFyaWFudChmcmFtZS0+c2VsZWN0aW9uKCktPmVuZCgpLm9mZnNldEluQ29udGFpbmVyTm9k
ZSgpKTsKKyAgICAgICAgcmV0dXJuIFFWYXJpYW50KGZyYW1lLT5zZWxlY3Rpb24oKS0+ZXh0ZW50
KCkub2Zmc2V0SW5Db250YWluZXJOb2RlKCkpOworICAgIH0KKyAgICBjYXNlIFF0OjpJbVN1cnJv
dW5kaW5nVGV4dDogeworICAgICAgICBpZiAocmVuZGVyVGV4dENvbnRyb2wgJiYgcmVuZGVyVGV4
dENvbnRyb2wtPnRleHRGb3JtQ29udHJvbEVsZW1lbnQoKSkgeworICAgICAgICAgICAgUVN0cmlu
ZyB0ZXh0ID0gcmVuZGVyVGV4dENvbnRyb2wtPnRleHRGb3JtQ29udHJvbEVsZW1lbnQoKS0+dmFs
dWUoKTsKKyAgICAgICAgICAgIFJlZlB0cjxSYW5nZT4gcmFuZ2UgPSBlZGl0b3ItPmNvbXBvc2l0
aW9uUmFuZ2UoKTsKKyAgICAgICAgICAgIGlmIChyYW5nZSkKKyAgICAgICAgICAgICAgICB0ZXh0
LnJlbW92ZShyYW5nZS0+c3RhcnRQb3NpdGlvbigpLm9mZnNldEluQ29udGFpbmVyTm9kZSgpLCBU
ZXh0SXRlcmF0b3I6OnJhbmdlTGVuZ3RoKHJhbmdlLmdldCgpKSk7CisgICAgICAgICAgICByZXR1
cm4gUVZhcmlhbnQodGV4dCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFFWYXJpYW50KCk7
CisgICAgfQorICAgIGNhc2UgUXQ6OkltQ3VycmVudFNlbGVjdGlvbjogeworICAgICAgICBpZiAo
IWVkaXRvci0+aGFzQ29tcG9zaXRpb24oKSAmJiByZW5kZXJUZXh0Q29udHJvbCAmJiByZW5kZXJU
ZXh0Q29udHJvbC0+dGV4dEZvcm1Db250cm9sRWxlbWVudCgpKSB7CisgICAgICAgICAgICBpbnQg
c3RhcnQgPSBmcmFtZS0+c2VsZWN0aW9uKCktPnN0YXJ0KCkub2Zmc2V0SW5Db250YWluZXJOb2Rl
KCk7CisgICAgICAgICAgICBpbnQgZW5kID0gZnJhbWUtPnNlbGVjdGlvbigpLT5lbmQoKS5vZmZz
ZXRJbkNvbnRhaW5lck5vZGUoKTsKKyAgICAgICAgICAgIGlmIChlbmQgPiBzdGFydCkKKyAgICAg
ICAgICAgICAgICByZXR1cm4gUVZhcmlhbnQoUVN0cmluZyhyZW5kZXJUZXh0Q29udHJvbC0+dGV4
dEZvcm1Db250cm9sRWxlbWVudCgpLT52YWx1ZSgpKS5taWQoc3RhcnQsIGVuZCAtIHN0YXJ0KSk7
CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFFWYXJpYW50KCk7CisKKyAgICB9CisgICAgY2Fz
ZSBRdDo6SW1BbmNob3JQb3NpdGlvbjogeworICAgICAgICBpZiAoZWRpdG9yLT5oYXNDb21wb3Np
dGlvbigpKQorICAgICAgICAgICAgcmV0dXJuIFFWYXJpYW50KGZyYW1lLT5zZWxlY3Rpb24oKS0+
c3RhcnQoKS5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSk7CisgICAgICAgIHJldHVybiBRVmFyaWFu
dChmcmFtZS0+c2VsZWN0aW9uKCktPmJhc2UoKS5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSk7Cisg
ICAgfQorICAgIGNhc2UgUXQ6OkltTWF4aW11bVRleHRMZW5ndGg6IHsKKyAgICAgICAgaWYgKGZy
YW1lLT5zZWxlY3Rpb24oKS0+aXNDb250ZW50RWRpdGFibGUoKSkgeworICAgICAgICAgICAgaWYg
KGZyYW1lLT5kb2N1bWVudCgpICYmIGZyYW1lLT5kb2N1bWVudCgpLT5mb2N1c2VkTm9kZSgpKSB7
CisgICAgICAgICAgICAgICAgaWYgKGZyYW1lLT5kb2N1bWVudCgpLT5mb2N1c2VkTm9kZSgpLT5o
YXNUYWdOYW1lKEhUTUxOYW1lczo6aW5wdXRUYWcpKSB7CisgICAgICAgICAgICAgICAgICAgIEhU
TUxJbnB1dEVsZW1lbnQqIGlucHV0RWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxJbnB1dEVsZW1l
bnQqPihmcmFtZS0+ZG9jdW1lbnQoKS0+Zm9jdXNlZE5vZGUoKSk7CisgICAgICAgICAgICAgICAg
ICAgIHJldHVybiBRVmFyaWFudChpbnB1dEVsZW1lbnQtPm1heExlbmd0aCgpKTsKKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gUVZhcmlhbnQoSFRN
TElucHV0RWxlbWVudDo6bWF4aW11bUxlbmd0aCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJu
IFFWYXJpYW50KDApOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gUVZhcmlh
bnQoKTsKKyAgICB9Cit9CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyKiBuYW1l
OworICAgIGRvdWJsZSBkZWZlcnJlZFJlcGFpbnREZWxheTsKKyAgICBkb3VibGUgaW5pdGlhbERl
ZmVycmVkUmVwYWludERlbGF5RHVyaW5nTG9hZGluZzsKKyAgICBkb3VibGUgbWF4RGVmZXJyZWRS
ZXBhaW50RGVsYXlEdXJpbmdMb2FkaW5nOworICAgIGRvdWJsZSBkZWZlcnJlZFJlcGFpbnREZWxh
eUluY3JlbWVudER1cmluZ0xvYWRpbmc7Cit9IFFSZXBhaW50VGhyb3R0bGluZ1ByZXNldDsKKwor
dm9pZCBRV2ViUGFnZUFkYXB0ZXI6OmR5bmFtaWNQcm9wZXJ0eUNoYW5nZUV2ZW50KFFPYmplY3Qq
IG9iaiwgUUR5bmFtaWNQcm9wZXJ0eUNoYW5nZUV2ZW50KiBldmVudCkKK3sKKyAgICBpZiAoZXZl
bnQtPnByb3BlcnR5TmFtZSgpID09ICJfcV92aWV3TW9kZSIpIHsKKyAgICAgICAgcGFnZS0+c2V0
Vmlld01vZGUoUGFnZTo6c3RyaW5nVG9WaWV3TW9kZShvYmotPnByb3BlcnR5KCJfcV92aWV3TW9k
ZSIpLnRvU3RyaW5nKCkpKTsKKyAgICB9IGVsc2UgaWYgKGV2ZW50LT5wcm9wZXJ0eU5hbWUoKSA9
PSAiX3FfSFRNTFRva2VuaXplckNodW5rU2l6ZSIpIHsKKyAgICAgICAgaW50IGNodW5rU2l6ZSA9
IG9iai0+cHJvcGVydHkoIl9xX0hUTUxUb2tlbml6ZXJDaHVua1NpemUiKS50b0ludCgpOworICAg
ICAgICBwYWdlLT5zZXRDdXN0b21IVE1MVG9rZW5pemVyQ2h1bmtTaXplKGNodW5rU2l6ZSk7Cisg
ICAgfSBlbHNlIGlmIChldmVudC0+cHJvcGVydHlOYW1lKCkgPT0gIl9xX0hUTUxUb2tlbml6ZXJU
aW1lRGVsYXkiKSB7CisgICAgICAgIGRvdWJsZSB0aW1lRGVsYXkgPSBvYmotPnByb3BlcnR5KCJf
cV9IVE1MVG9rZW5pemVyVGltZURlbGF5IikudG9Eb3VibGUoKTsKKyAgICAgICAgcGFnZS0+c2V0
Q3VzdG9tSFRNTFRva2VuaXplclRpbWVEZWxheSh0aW1lRGVsYXkpOworICAgIH0gZWxzZSBpZiAo
ZXZlbnQtPnByb3BlcnR5TmFtZSgpID09ICJfcV9SZXBhaW50VGhyb3R0bGluZ0RlZmVycmVkUmVw
YWludERlbGF5IikgeworICAgICAgICBkb3VibGUgcCA9IG9iai0+cHJvcGVydHkoIl9xX1JlcGFp
bnRUaHJvdHRsaW5nRGVmZXJyZWRSZXBhaW50RGVsYXkiKS50b0RvdWJsZSgpOworICAgICAgICBG
cmFtZVZpZXc6OnNldFJlcGFpbnRUaHJvdHRsaW5nRGVmZXJyZWRSZXBhaW50RGVsYXkocCk7Cisg
ICAgfSBlbHNlIGlmIChldmVudC0+cHJvcGVydHlOYW1lKCkgPT0gIl9xX1JlcGFpbnRUaHJvdHRs
aW5nbkluaXRpYWxEZWZlcnJlZFJlcGFpbnREZWxheUR1cmluZ0xvYWRpbmciKSB7CisgICAgICAg
IGRvdWJsZSBwID0gb2JqLT5wcm9wZXJ0eSgiX3FfUmVwYWludFRocm90dGxpbmduSW5pdGlhbERl
ZmVycmVkUmVwYWludERlbGF5RHVyaW5nTG9hZGluZyIpLnRvRG91YmxlKCk7CisgICAgICAgIEZy
YW1lVmlldzo6c2V0UmVwYWludFRocm90dGxpbmduSW5pdGlhbERlZmVycmVkUmVwYWludERlbGF5
RHVyaW5nTG9hZGluZyhwKTsKKyAgICB9IGVsc2UgaWYgKGV2ZW50LT5wcm9wZXJ0eU5hbWUoKSA9
PSAiX3FfUmVwYWludFRocm90dGxpbmdNYXhEZWZlcnJlZFJlcGFpbnREZWxheUR1cmluZ0xvYWRp
bmciKSB7CisgICAgICAgIGRvdWJsZSBwID0gb2JqLT5wcm9wZXJ0eSgiX3FfUmVwYWludFRocm90
dGxpbmdNYXhEZWZlcnJlZFJlcGFpbnREZWxheUR1cmluZ0xvYWRpbmciKS50b0RvdWJsZSgpOwor
ICAgICAgICBGcmFtZVZpZXc6OnNldFJlcGFpbnRUaHJvdHRsaW5nTWF4RGVmZXJyZWRSZXBhaW50
RGVsYXlEdXJpbmdMb2FkaW5nKHApOworICAgIH0gZWxzZSBpZiAoZXZlbnQtPnByb3BlcnR5TmFt
ZSgpID09ICJfcV9SZXBhaW50VGhyb3R0bGluZ0RlZmVycmVkUmVwYWludERlbGF5SW5jcmVtZW50
RHVyaW5nTG9hZGluZyIpIHsKKyAgICAgICAgZG91YmxlIHAgPSBvYmotPnByb3BlcnR5KCJfcV9S
ZXBhaW50VGhyb3R0bGluZ0RlZmVycmVkUmVwYWludERlbGF5SW5jcmVtZW50RHVyaW5nTG9hZGlu
ZyIpLnRvRG91YmxlKCk7CisgICAgICAgIEZyYW1lVmlldzo6c2V0UmVwYWludFRocm90dGxpbmdE
ZWZlcnJlZFJlcGFpbnREZWxheUluY3JlbWVudER1cmluZ0xvYWRpbmcocCk7CisgICAgfSBlbHNl
IGlmIChldmVudC0+cHJvcGVydHlOYW1lKCkgPT0gIl9xX1JlcGFpbnRUaHJvdHRsaW5nUHJlc2V0
IikgeworICAgICAgICBzdGF0aWMgY29uc3QgUVJlcGFpbnRUaHJvdHRsaW5nUHJlc2V0IHByZXNl
dHNbXSA9IHsKKyAgICAgICAgICAgIHsgICAiTm9UaHJvdHRsaW5nIiwgICAgIDAsICAgICAgMCwg
ICAgICAwLCAgICAgIDAgfSwKKyAgICAgICAgICAgIHsgICAiTGVnYWN5IiwgICAgICAgMC4wMjUs
ICAgICAgMCwgICAgMi41LCAgICAwLjUgfSwKKyAgICAgICAgICAgIHsgICAiTWluaW1hbCIsICAg
ICAgIDAuMDEsICAgICAgMCwgICAgICAxLCAgICAwLjIgfSwKKyAgICAgICAgICAgIHsgICAiTWVk
aXVtIiwgICAgICAgMC4wMjUsICAgICAgMSwgICAgICA1LCAgICAwLjUgfSwKKyAgICAgICAgICAg
IHsgICAiSGVhdnkiLCAgICAgICAgICAwLjEsICAgICAgMiwgICAgIDEwLCAgICAgIDEgfQorICAg
ICAgICB9OworCisgICAgICAgIFFTdHJpbmcgcCA9IG9iai0+cHJvcGVydHkoIl9xX1JlcGFpbnRU
aHJvdHRsaW5nUHJlc2V0IikudG9TdHJpbmcoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7
IGkgPCBzaXplb2YocHJlc2V0cykgLyBzaXplb2YocHJlc2V0c1swXSk7IGkrKykgeworICAgICAg
ICAgICAgaWYgKHAgPT0gUUxhdGluMVN0cmluZyhwcmVzZXRzW2ldLm5hbWUpKSB7CisgICAgICAg
ICAgICAgICAgRnJhbWVWaWV3OjpzZXRSZXBhaW50VGhyb3R0bGluZ0RlZmVycmVkUmVwYWludERl
bGF5KHByZXNldHNbaV0uZGVmZXJyZWRSZXBhaW50RGVsYXkpOworICAgICAgICAgICAgICAgIEZy
YW1lVmlldzo6c2V0UmVwYWludFRocm90dGxpbmduSW5pdGlhbERlZmVycmVkUmVwYWludERlbGF5
RHVyaW5nTG9hZGluZyhwcmVzZXRzW2ldLmluaXRpYWxEZWZlcnJlZFJlcGFpbnREZWxheUR1cmlu
Z0xvYWRpbmcpOworICAgICAgICAgICAgICAgIEZyYW1lVmlldzo6c2V0UmVwYWludFRocm90dGxp
bmdNYXhEZWZlcnJlZFJlcGFpbnREZWxheUR1cmluZ0xvYWRpbmcocHJlc2V0c1tpXS5tYXhEZWZl
cnJlZFJlcGFpbnREZWxheUR1cmluZ0xvYWRpbmcpOworICAgICAgICAgICAgICAgIEZyYW1lVmll
dzo6c2V0UmVwYWludFRocm90dGxpbmdEZWZlcnJlZFJlcGFpbnREZWxheUluY3JlbWVudER1cmlu
Z0xvYWRpbmcocHJlc2V0c1tpXS5kZWZlcnJlZFJlcGFpbnREZWxheUluY3JlbWVudER1cmluZ0xv
YWRpbmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9
CisgICAgfSBlbHNlIGlmIChldmVudC0+cHJvcGVydHlOYW1lKCkgPT0gIl9xX3dlYkluc3BlY3Rv
clNlcnZlclBvcnQiKSB7CisjaWYgRU5BQkxFKElOU1BFQ1RPUikKKyAgICAgICAgUVZhcmlhbnQg
cG9ydCA9IG9iai0+cHJvcGVydHkoIl9xX3dlYkluc3BlY3RvclNlcnZlclBvcnQiKTsKKyAgICAg
ICAgaWYgKHBvcnQuaXNWYWxpZCgpKSB7CisgICAgICAgICAgICBJbnNwZWN0b3JTZXJ2ZXJRdCog
aW5zcGVjdG9yU2VydmVyID0gSW5zcGVjdG9yU2VydmVyUXQ6OnNlcnZlcigpOworICAgICAgICAg
ICAgaW5zcGVjdG9yU2VydmVyLT5saXN0ZW4ocG9ydC50b0ludCgpKTsKKyAgICAgICAgfQorI2Vu
ZGlmCisgICAgfSBlbHNlIGlmIChldmVudC0+cHJvcGVydHlOYW1lKCkgPT0gIl9xX2RlYWREZWNv
ZGVkRGF0YURlbGV0aW9uSW50ZXJ2YWwiKSB7CisgICAgICAgIGRvdWJsZSBpbnRlcnZhbCA9IG9i
ai0+cHJvcGVydHkoIl9xX2RlYWREZWNvZGVkRGF0YURlbGV0aW9uSW50ZXJ2YWwiKS50b0RvdWJs
ZSgpOworICAgICAgICBtZW1vcnlDYWNoZSgpLT5zZXREZWFkRGVjb2RlZERhdGFEZWxldGlvbklu
dGVydmFsKGludGVydmFsKTsKKyAgICB9Cit9CisKKyNlbmRpZiAvLyBRVF9OT19EUkFHQU5ERFJP
UAorCisjZGVmaW5lIE1BUF9BQ1RJT05fRlJPTV9WQUxVRShOYW1lLCBWYWx1ZSkgXAorICAgIGNh
c2UgVmFsdWU6IHJldHVybiBRV2ViUGFnZUFkYXB0ZXI6Ok5hbWUKKworc3RhdGljIFFXZWJQYWdl
QWRhcHRlcjo6TWVudUFjdGlvbiBhZGFwdGVyQWN0aW9uRm9yQ29udGV4dE1lbnVBY3Rpb24oV2Vi
Q29yZTo6Q29udGV4dE1lbnVBY3Rpb24gYWN0aW9uKQoreworICAgIHN3aXRjaCAoYWN0aW9uKSB7
CisgICAgICAgIEZPUl9FQUNIX01BUFBFRF9NRU5VX0FDVElPTihNQVBfQUNUSU9OX0ZST01fVkFM
VUUsIFNFTUlDT0xPTl9TRVBBUkFUT1IpOworI2lmIEVOQUJMRShJTlNQRUNUT1IpCisgICAgY2Fz
ZSBXZWJDb3JlOjpDb250ZXh0TWVudUl0ZW1UYWdJbnNwZWN0RWxlbWVudDoKKyAgICAgICAgcmV0
dXJuIFFXZWJQYWdlQWRhcHRlcjo6SW5zcGVjdEVsZW1lbnQ7CisjZW5kaWYKKyAgICBkZWZhdWx0
OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIFFXZWJQYWdlQWRhcHRlcjo6Tm9B
Y3Rpb247Cit9CisKK1FMaXN0PE1lbnVJdGVtPiBkZXNjcmlwdGlvbkZvclBsYXRmb3JtTWVudShj
b25zdCBRTGlzdDxDb250ZXh0TWVudUl0ZW0+KiBpdGVtcywgUGFnZSogcGFnZSkKK3sKKyAgICBR
TGlzdDxNZW51SXRlbT4gaXRlbURlc2NyaXB0aW9uczsKKyAgICBpZiAoIWl0ZW1zKQorICAgICAg
ICByZXR1cm4gaXRlbURlc2NyaXB0aW9uczsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1z
LT5jb3VudCgpOyArK2kpIHsKKyAgICAgICAgY29uc3QgQ29udGV4dE1lbnVJdGVtICZpdGVtID0g
aXRlbXMtPmF0KGkpOworICAgICAgICBNZW51SXRlbSBkZXNjcmlwdGlvbjsKKyAgICAgICAgc3dp
dGNoIChpdGVtLnR5cGUoKSkgeworICAgICAgICBjYXNlIFdlYkNvcmU6OkNoZWNrYWJsZUFjdGlv
blR5cGU6IC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgICBjYXNlIFdlYkNvcmU6OkFjdGlvblR5
cGU6IHsKKyAgICAgICAgICAgIFFXZWJQYWdlQWRhcHRlcjo6TWVudUFjdGlvbiBhY3Rpb24gPSBh
ZGFwdGVyQWN0aW9uRm9yQ29udGV4dE1lbnVBY3Rpb24oaXRlbS5hY3Rpb24oKSk7CisgICAgICAg
ICAgICBpZiAoYWN0aW9uID4gUVdlYlBhZ2VBZGFwdGVyOjpOb0FjdGlvbikgeworICAgICAgICAg
ICAgICAgIGRlc2NyaXB0aW9uLnR5cGUgPSBNZW51SXRlbTo6QWN0aW9uOworICAgICAgICAgICAg
ICAgIGRlc2NyaXB0aW9uLmFjdGlvbiA9IGFjdGlvbjsKKyAgICAgICAgICAgICAgICBDb250ZXh0
TWVudUl0ZW0gaXQoaXRlbSk7CisgICAgICAgICAgICAgICAgcGFnZS0+Y29udGV4dE1lbnVDb250
cm9sbGVyKCktPmNoZWNrT3JFbmFibGVJZk5lZWRlZChpdCk7CisgICAgICAgICAgICAgICAgUGxh
dGZvcm1NZW51SXRlbURlc2NyaXB0aW9uIGRlc2MgPSBpdC5yZWxlYXNlUGxhdGZvcm1EZXNjcmlw
dGlvbigpOworICAgICAgICAgICAgICAgIGlmIChkZXNjLmVuYWJsZWQpCisgICAgICAgICAgICAg
ICAgICAgIGRlc2NyaXB0aW9uLnRyYWl0cyB8PSBNZW51SXRlbTo6RW5hYmxlZDsKKyAgICAgICAg
ICAgICAgICBpZiAoaXRlbS50eXBlKCkgPT0gV2ViQ29yZTo6Q2hlY2thYmxlQWN0aW9uVHlwZSkg
eworICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbi50cmFpdHMgfD0gTWVudUl0ZW06OkNo
ZWNrYWJsZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2MuY2hlY2tlZCkKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLnRyYWl0cyB8PSBNZW51SXRlbTo6Q2hlY2tlZDsK
KyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgfQorICAgICAgICBjYXNlIFdlYkNvcmU6OlNlcGFyYXRvclR5cGU6CisgICAgICAgICAg
ICBkZXNjcmlwdGlvbi50eXBlID0gTWVudUl0ZW06OlNlcGFyYXRvcjsKKyAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICBjYXNlIFdlYkNvcmU6OlN1Ym1lbnVUeXBlOiB7CisgICAgICAgICAgICBk
ZXNjcmlwdGlvbi50eXBlID0gTWVudUl0ZW06OlN1Yk1lbnU7CisgICAgICAgICAgICBkZXNjcmlw
dGlvbi5zdWJNZW51ID0gZGVzY3JpcHRpb25Gb3JQbGF0Zm9ybU1lbnUoaXRlbS5wbGF0Zm9ybVN1
Yk1lbnUoKSwgcGFnZSk7CisgICAgICAgICAgICBkZXNjcmlwdGlvbi5zdWJNZW51VGl0bGUgPSBp
dGVtLnRpdGxlKCk7CisgICAgICAgICAgICAvLyBEb24ndCBhcHBlbmQgZW1wdHkgc3VibWVudSBk
ZXNjcmlwdGlvbnMuCisgICAgICAgICAgICBpZiAoZGVzY3JpcHRpb24uc3ViTWVudS5pc0VtcHR5
KCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgfQorICAg
ICAgICBpZiAoZGVzY3JpcHRpb24udHlwZSA+IE1lbnVJdGVtOjpOb1R5cGUpCisgICAgICAgICAg
ICBpdGVtRGVzY3JpcHRpb25zLmFwcGVuZChkZXNjcmlwdGlvbik7CisgICAgfQorICAgIHJldHVy
biBpdGVtRGVzY3JpcHRpb25zOworfQorCitRV2ViSGl0VGVzdFJlc3VsdFByaXZhdGUqIFFXZWJQ
YWdlQWRhcHRlcjo6dXBkYXRlUG9zaXRpb25EZXBlbmRlbnRNZW51QWN0aW9ucyhjb25zdCBRUG9p
bnQmIHBvcywgUUJpdEFycmF5KiB2aXNpdGVkV2ViQWN0aW9ucykKK3sKKyAgICBBU1NFUlQodmlz
aXRlZFdlYkFjdGlvbnMpOworICAgIFdlYkNvcmU6OkZyYW1lKiBmb2N1c2VkRnJhbWUgPSBwYWdl
LT5mb2N1c0NvbnRyb2xsZXIoKS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCk7CisgICAgSGl0VGVzdFJl
c3VsdCByZXN1bHQgPSBmb2N1c2VkRnJhbWUtPmV2ZW50SGFuZGxlcigpLT5oaXRUZXN0UmVzdWx0
QXRQb2ludChmb2N1c2VkRnJhbWUtPnZpZXcoKS0+d2luZG93VG9Db250ZW50cyhwb3MpLCAvKmFs
bG93U2hhZG93Q29udGVudCovIGZhbHNlKTsKKyAgICBwYWdlLT5jb250ZXh0TWVudUNvbnRyb2xs
ZXIoKS0+c2V0SGl0VGVzdFJlc3VsdChyZXN1bHQpOworCisjaWYgRU5BQkxFKElOU1BFQ1RPUikK
KyAgICBpZiAocGFnZS0+aW5zcGVjdG9yQ29udHJvbGxlcigpLT5lbmFibGVkKCkpCisgICAgICAg
IHBhZ2UtPmNvbnRleHRNZW51Q29udHJvbGxlcigpLT5hZGRJbnNwZWN0RWxlbWVudEl0ZW0oKTsK
KyNlbmRpZgorCisgICAgV2ViQ29yZTo6Q29udGV4dE1lbnUqIHdlYmNvcmVNZW51ID0gcGFnZS0+
Y29udGV4dE1lbnVDb250cm9sbGVyKCktPmNvbnRleHRNZW51KCk7CisgICAgUUxpc3Q8TWVudUl0
ZW0+IGl0ZW1EZXNjcmlwdGlvbnM7CisgICAgaWYgKGNsaWVudCAmJiB3ZWJjb3JlTWVudSkKKyAg
ICAgICAgaXRlbURlc2NyaXB0aW9ucyA9IGRlc2NyaXB0aW9uRm9yUGxhdGZvcm1NZW51KHdlYmNv
cmVNZW51LT5wbGF0Zm9ybURlc2NyaXB0aW9uKCksIHBhZ2UpOworICAgIGNyZWF0ZUFuZFNldEN1
cnJlbnRDb250ZXh0TWVudShpdGVtRGVzY3JpcHRpb25zLCB2aXNpdGVkV2ViQWN0aW9ucyk7Cisg
ICAgaWYgKHJlc3VsdC5zY3JvbGxiYXIoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJu
IG5ldyBRV2ViSGl0VGVzdFJlc3VsdFByaXZhdGUocmVzdWx0KTsKK30KKworc3RhdGljIHZvaWQg
ZXh0cmFjdENvbnRlbnRUeXBlRnJvbUhhc2goY29uc3QgSGFzaFNldDxTdHJpbmc+JiB0eXBlcywg
UVN0cmluZ0xpc3QqIGxpc3QpCit7CisgICAgaWYgKCFsaXN0KQorICAgICAgICByZXR1cm47CisK
KyAgICBIYXNoU2V0PFN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGVuZEl0ID0gdHlwZXMuZW5kKCk7
CisgICAgZm9yIChIYXNoU2V0PFN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gdHlwZXMuYmVn
aW4oKTsgaXQgIT0gZW5kSXQ7ICsraXQpCisgICAgICAgICpsaXN0IDw8ICppdDsKK30KKworc3Rh
dGljIHZvaWQgZXh0cmFjdENvbnRlbnRUeXBlRnJvbVBsdWdpblZlY3Rvcihjb25zdCBWZWN0b3I8
UGx1Z2luUGFja2FnZSo+JiBwbHVnaW5zLCBRU3RyaW5nTGlzdCogbGlzdCkKK3sKKyAgICBpZiAo
IWxpc3QpCisgICAgICAgIHJldHVybjsKKworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBw
bHVnaW5zLnNpemUoKTsgKytpKSB7CisgICAgICAgIE1JTUVUb0Rlc2NyaXB0aW9uc01hcDo6Y29u
c3RfaXRlcmF0b3IgaXQgPSBwbHVnaW5zW2ldLT5taW1lVG9EZXNjcmlwdGlvbnMoKS5iZWdpbigp
OworICAgICAgICBNSU1FVG9EZXNjcmlwdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IHBs
dWdpbnNbaV0tPm1pbWVUb0Rlc2NyaXB0aW9ucygpLmVuZCgpOworICAgICAgICBmb3IgKDsgaXQg
IT0gZW5kOyArK2l0KQorICAgICAgICAgICAgKmxpc3QgPDwgaXQtPmtleTsKKyAgICB9Cit9CisK
K1FTdHJpbmdMaXN0IFFXZWJQYWdlQWRhcHRlcjo6c3VwcG9ydGVkQ29udGVudFR5cGVzKCkgY29u
c3QKK3sKKyAgICBRU3RyaW5nTGlzdCBtaW1lVHlwZXM7CisKKyAgICBleHRyYWN0Q29udGVudFR5
cGVGcm9tSGFzaChNSU1FVHlwZVJlZ2lzdHJ5OjpnZXRTdXBwb3J0ZWRJbWFnZU1JTUVUeXBlcygp
LCAmbWltZVR5cGVzKTsKKyAgICBleHRyYWN0Q29udGVudFR5cGVGcm9tSGFzaChNSU1FVHlwZVJl
Z2lzdHJ5OjpnZXRTdXBwb3J0ZWROb25JbWFnZU1JTUVUeXBlcygpLCAmbWltZVR5cGVzKTsKKyAg
ICBpZiAocGFnZS0+c2V0dGluZ3MoKSAmJiBwYWdlLT5zZXR0aW5ncygpLT5hcmVQbHVnaW5zRW5h
YmxlZCgpKQorICAgICAgICBleHRyYWN0Q29udGVudFR5cGVGcm9tUGx1Z2luVmVjdG9yKFBsdWdp
bkRhdGFiYXNlOjppbnN0YWxsZWRQbHVnaW5zKCktPnBsdWdpbnMoKSwgJm1pbWVUeXBlcyk7CisK
KyAgICByZXR1cm4gbWltZVR5cGVzOworfQorCit2b2lkIFFXZWJQYWdlQWRhcHRlcjo6X3FfY2xl
YW51cExlYWtNZXNzYWdlcygpCit7CisjaWZuZGVmIE5ERUJVRworICAgIC8vIE5lZWQgdGhpcyB0
byBtYWtlIGxlYWsgbWVzc2FnZXMgYWNjdXJhdGUuCisgICAgbWVtb3J5Q2FjaGUoKS0+c2V0Q2Fw
YWNpdGllcygwLCAwLCAwKTsKKyNlbmRpZgorfQorCit2b2lkIFFXZWJQYWdlQWRhcHRlcjo6X3Ff
b25Mb2FkUHJvZ3Jlc3NDaGFuZ2VkKGludCkKK3sKKyAgICBtX3RvdGFsQnl0ZXMgPSBwYWdlLT5w
cm9ncmVzcygpLT50b3RhbFBhZ2VBbmRSZXNvdXJjZUJ5dGVzVG9Mb2FkKCk7CisgICAgbV9ieXRl
c1JlY2VpdmVkID0gcGFnZS0+cHJvZ3Jlc3MoKS0+dG90YWxCeXRlc1JlY2VpdmVkKCk7Cit9CisK
K2Jvb2wgUVdlYlBhZ2VBZGFwdGVyOjpzdXBwb3J0c0NvbnRlbnRUeXBlKGNvbnN0IFFTdHJpbmcm
IG1pbWVUeXBlKSBjb25zdAoreworICAgIGNvbnN0IFN0cmluZyB0eXBlID0gbWltZVR5cGUudG9M
b3dlcigpOworICAgIGlmIChNSU1FVHlwZVJlZ2lzdHJ5Ojppc1N1cHBvcnRlZEltYWdlTUlNRVR5
cGUodHlwZSkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgaWYgKE1JTUVUeXBlUmVnaXN0
cnk6OmlzU3VwcG9ydGVkTm9uSW1hZ2VNSU1FVHlwZSh0eXBlKSkKKyAgICAgICAgcmV0dXJuIHRy
dWU7CisKKyAgICBpZiAocGFnZS0+c2V0dGluZ3MoKSAmJiBwYWdlLT5zZXR0aW5ncygpLT5hcmVQ
bHVnaW5zRW5hYmxlZCgpCisgICAgICAgICYmIFBsdWdpbkRhdGFiYXNlOjppbnN0YWxsZWRQbHVn
aW5zKCktPmlzTUlNRVR5cGVSZWdpc3RlcmVkKHR5cGUpKQorICAgICAgICByZXR1cm4gdHJ1ZTsK
KworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBRV2ViUGFnZUFkYXB0ZXI6OmRpZFNob3dJ
bnNwZWN0b3IoKQoreworI2lmIEVOQUJMRShJTlNQRUNUT1IpCisgICAgcGFnZS0+aW5zcGVjdG9y
Q29udHJvbGxlcigpLT5zaG93KCk7CisjZW5kaWYKK30KKwordm9pZCBRV2ViUGFnZUFkYXB0ZXI6
OmRpZENsb3NlSW5zcGVjdG9yKCkKK3sKKyNpZiBFTkFCTEUoSU5TUEVDVE9SKQorICAgIHBhZ2Ut
Pmluc3BlY3RvckNvbnRyb2xsZXIoKS0+Y2xvc2UoKTsKKyNlbmRpZgorfQorCit2b2lkIFFXZWJQ
YWdlQWRhcHRlcjo6dXBkYXRlQWN0aW9uSW50ZXJuYWwoUVdlYlBhZ2VBZGFwdGVyOjpNZW51QWN0
aW9uIGFjdGlvbiwgY29uc3QgY2hhciogY29tbWFuZE5hbWUsIGJvb2wqIGVuYWJsZWQsIGJvb2wq
IGNoZWNrZWQpCit7CisgICAgV2ViQ29yZTo6RnJhbWVMb2FkZXIqIGxvYWRlciA9IG1haW5GcmFt
ZUFkYXB0ZXIoKS0+ZnJhbWUtPmxvYWRlcigpOworICAgIFdlYkNvcmU6OkVkaXRvciogZWRpdG9y
ID0gcGFnZS0+Zm9jdXNDb250cm9sbGVyKCktPmZvY3VzZWRPck1haW5GcmFtZSgpLT5lZGl0b3Io
KTsKKworICAgIHN3aXRjaCAoYWN0aW9uKSB7CisgICAgY2FzZSBRV2ViUGFnZUFkYXB0ZXI6OkJh
Y2s6CisgICAgICAgICplbmFibGVkID0gcGFnZS0+Y2FuR29CYWNrT3JGb3J3YXJkKC0xKTsKKyAg
ICAgICAgYnJlYWs7CisgICAgY2FzZSBRV2ViUGFnZUFkYXB0ZXI6OkZvcndhcmQ6CisgICAgICAg
ICplbmFibGVkID0gcGFnZS0+Y2FuR29CYWNrT3JGb3J3YXJkKDEpOworICAgICAgICBicmVhazsK
KyAgICBjYXNlIFFXZWJQYWdlQWRhcHRlcjo6U3RvcDoKKyAgICAgICAgKmVuYWJsZWQgPSBsb2Fk
ZXItPmlzTG9hZGluZygpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFFXZWJQYWdlQWRhcHRl
cjo6UmVsb2FkOgorICAgICAgICAqZW5hYmxlZCA9ICFsb2FkZXItPmlzTG9hZGluZygpOworICAg
ICAgICBicmVhazsKKyAgICBjYXNlIFFXZWJQYWdlQWRhcHRlcjo6U2V0VGV4dERpcmVjdGlvbkRl
ZmF1bHQ6CisgICAgY2FzZSBRV2ViUGFnZUFkYXB0ZXI6OlNldFRleHREaXJlY3Rpb25MZWZ0VG9S
aWdodDoKKyAgICBjYXNlIFFXZWJQYWdlQWRhcHRlcjo6U2V0VGV4dERpcmVjdGlvblJpZ2h0VG9M
ZWZ0OgorICAgICAgICAqZW5hYmxlZCA9IGVkaXRvci0+Y2FuRWRpdCgpOworICAgICAgICAqY2hl
Y2tlZCA9IGZhbHNlOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiB7CisKKyAgICAgICAg
Ly8gaWYgaXQncyBhbiBlZGl0b3IgY29tbWFuZCwgbGV0IGl0cyBsb2dpYyBkZXRlcm1pbmUgc3Rh
dGUKKyAgICAgICAgaWYgKGNvbW1hbmROYW1lKSB7CisgICAgICAgICAgICBFZGl0b3I6OkNvbW1h
bmQgY29tbWFuZCA9IGVkaXRvci0+Y29tbWFuZChjb21tYW5kTmFtZSk7CisgICAgICAgICAgICAq
ZW5hYmxlZCA9IGNvbW1hbmQuaXNFbmFibGVkKCk7CisgICAgICAgICAgICBpZiAoKmVuYWJsZWQp
CisgICAgICAgICAgICAgICAgKmNoZWNrZWQgPSBjb21tYW5kLnN0YXRlKCkgIT0gRmFsc2VUcmlT
dGF0ZTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAqY2hlY2tlZCA9IGZhbHNl
OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgUVdl
YlBhZ2VBZGFwdGVyOjp0cmlnZ2VyQWN0aW9uKFFXZWJQYWdlQWRhcHRlcjo6TWVudUFjdGlvbiBh
Y3Rpb24sIFFXZWJIaXRUZXN0UmVzdWx0UHJpdmF0ZSogaGl0VGVzdFJlc3VsdCwgY29uc3QgY2hh
ciogY29tbWFuZE5hbWUsIGJvb2wgZW5kVG9FbmRSZWxvYWQpCit7CisgICAgRnJhbWUqIGZyYW1l
ID0gcGFnZS0+Zm9jdXNDb250cm9sbGVyKCktPmZvY3VzZWRPck1haW5GcmFtZSgpOworICAgIGlm
ICghZnJhbWUpCisgICAgICAgIHJldHVybjsKKyAgICBFZGl0b3IqIGVkaXRvciA9IGZyYW1lLT5l
ZGl0b3IoKTsKKworICAgIC8vIENvbnZlbmllbmNlCisgICAgUVdlYkhpdFRlc3RSZXN1bHRQcml2
YXRlIGhpdFRlc3Q7CisgICAgaWYgKCFoaXRUZXN0UmVzdWx0KQorICAgICAgICBoaXRUZXN0UmVz
dWx0ID0gJmhpdFRlc3Q7CisKKyAgICBzd2l0Y2ggKGFjdGlvbikgeworICAgIGNhc2UgT3Blbkxp
bms6CisgICAgICAgIGlmIChGcmFtZSogdGFyZ2V0RnJhbWUgPSBoaXRUZXN0UmVzdWx0LT53ZWJD
b3JlRnJhbWUpIHsKKyAgICAgICAgICAgIHRhcmdldEZyYW1lLT5sb2FkZXIoKS0+bG9hZEZyYW1l
UmVxdWVzdChmcmFtZUxvYWRSZXF1ZXN0KGhpdFRlc3RSZXN1bHQtPmxpbmtVcmwsIHRhcmdldEZy
YW1lKSwgLypsb2NrSGlzdG9yeSovIGZhbHNlLCAvKmxvY2tCYWNrRm9yd2FyZExpc3QqLyBmYWxz
ZSwgLypldmVudCovIDAsIC8qRm9ybVN0YXRlKi8gMCwgTWF5YmVTZW5kUmVmZXJyZXIpOworICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAg
Y2FzZSBPcGVuTGlua0luTmV3V2luZG93OgorICAgICAgICBvcGVuTmV3V2luZG93KGhpdFRlc3RS
ZXN1bHQtPmxpbmtVcmwsIGZyYW1lKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPcGVuTGlu
a0luVGhpc1dpbmRvdzoKKyAgICAgICAgZnJhbWUtPmxvYWRlcigpLT5sb2FkRnJhbWVSZXF1ZXN0
KGZyYW1lTG9hZFJlcXVlc3QoaGl0VGVzdFJlc3VsdC0+bGlua1VybCwgZnJhbWUpLCAvKmxvY2tI
aXN0b3J5Ki8gZmFsc2UsIC8qbG9ja0JhY2tGb3J3YXJkTGlzdCovIGZhbHNlLCAvKmV2ZW50Ki8g
MCwgLypGb3JtU3RhdGUqLyAwLCBNYXliZVNlbmRSZWZlcnJlcik7CisgICAgICAgIGJyZWFrOwor
ICAgIGNhc2UgT3BlbkZyYW1lSW5OZXdXaW5kb3c6IHsKKyAgICAgICAgS1VSTCB1cmwgPSBmcmFt
ZS0+bG9hZGVyKCktPmRvY3VtZW50TG9hZGVyKCktPnVucmVhY2hhYmxlVVJMKCk7CisgICAgICAg
IGlmICh1cmwuaXNFbXB0eSgpKQorICAgICAgICAgICAgdXJsID0gZnJhbWUtPmxvYWRlcigpLT5k
b2N1bWVudExvYWRlcigpLT51cmwoKTsKKyAgICAgICAgb3Blbk5ld1dpbmRvdyh1cmwsIGZyYW1l
KTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBjYXNlIENvcHlMaW5rVG9DbGlwYm9h
cmQ6IHsKKyNpZiBkZWZpbmVkKFFfV1NfWDExKQorICAgICAgICBib29sIG9sZFNlbGVjdGlvbk1v
ZGUgPSBQYXN0ZWJvYXJkOjpnZW5lcmFsUGFzdGVib2FyZCgpLT5pc1NlbGVjdGlvbk1vZGUoKTsK
KyAgICAgICAgUGFzdGVib2FyZDo6Z2VuZXJhbFBhc3RlYm9hcmQoKS0+c2V0U2VsZWN0aW9uTW9k
ZSh0cnVlKTsKKyAgICAgICAgZWRpdG9yLT5jb3B5VVJMKGhpdFRlc3RSZXN1bHQtPmxpbmtVcmws
IGhpdFRlc3RSZXN1bHQtPmxpbmtUZXh0KTsKKyAgICAgICAgUGFzdGVib2FyZDo6Z2VuZXJhbFBh
c3RlYm9hcmQoKS0+c2V0U2VsZWN0aW9uTW9kZShvbGRTZWxlY3Rpb25Nb2RlKTsKKyNlbmRpZgor
ICAgICAgICBlZGl0b3ItPmNvcHlVUkwoaGl0VGVzdFJlc3VsdC0+bGlua1VybCwgaGl0VGVzdFJl
c3VsdC0+bGlua1RleHQpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBPcGVuSW1h
Z2VJbk5ld1dpbmRvdzoKKyAgICAgICAgb3Blbk5ld1dpbmRvdyhoaXRUZXN0UmVzdWx0LT5pbWFn
ZVVybCwgZnJhbWUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERvd25sb2FkSW1hZ2VUb0Rp
c2s6CisgICAgICAgIGZyYW1lLT5sb2FkZXIoKS0+Y2xpZW50KCktPnN0YXJ0RG93bmxvYWQoV2Vi
Q29yZTo6UmVzb3VyY2VSZXF1ZXN0KGhpdFRlc3RSZXN1bHQtPmltYWdlVXJsLCBmcmFtZS0+bG9h
ZGVyKCktPm91dGdvaW5nUmVmZXJyZXIoKSkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERv
d25sb2FkTGlua1RvRGlzazoKKyAgICAgICAgZnJhbWUtPmxvYWRlcigpLT5jbGllbnQoKS0+c3Rh
cnREb3dubG9hZChXZWJDb3JlOjpSZXNvdXJjZVJlcXVlc3QoaGl0VGVzdFJlc3VsdC0+bGlua1Vy
bCwgZnJhbWUtPmxvYWRlcigpLT5vdXRnb2luZ1JlZmVycmVyKCkpKTsKKyAgICAgICAgYnJlYWs7
CisgICAgY2FzZSBCYWNrOgorICAgICAgICBwYWdlLT5nb0JhY2soKTsKKyAgICAgICAgYnJlYWs7
CisgICAgY2FzZSBGb3J3YXJkOgorICAgICAgICBwYWdlLT5nb0ZvcndhcmQoKTsKKyAgICAgICAg
YnJlYWs7CisgICAgY2FzZSBTdG9wOgorICAgICAgICBtYWluRnJhbWVBZGFwdGVyKCktPmZyYW1l
LT5sb2FkZXIoKS0+c3RvcEZvclVzZXJDYW5jZWwoKTsKKyAgICAgICAgdXBkYXRlTmF2aWdhdGlv
bkFjdGlvbnMoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSZWxvYWQ6CisgICAgICAgIG1h
aW5GcmFtZUFkYXB0ZXIoKS0+ZnJhbWUtPmxvYWRlcigpLT5yZWxvYWQoZW5kVG9FbmRSZWxvYWQp
OworICAgICAgICBicmVhazsKKworICAgIGNhc2UgU2V0VGV4dERpcmVjdGlvbkRlZmF1bHQ6Cisg
ICAgICAgIGVkaXRvci0+c2V0QmFzZVdyaXRpbmdEaXJlY3Rpb24oTmF0dXJhbFdyaXRpbmdEaXJl
Y3Rpb24pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNldFRleHREaXJlY3Rpb25MZWZ0VG9S
aWdodDoKKyAgICAgICAgZWRpdG9yLT5zZXRCYXNlV3JpdGluZ0RpcmVjdGlvbihMZWZ0VG9SaWdo
dFdyaXRpbmdEaXJlY3Rpb24pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNldFRleHREaXJl
Y3Rpb25SaWdodFRvTGVmdDoKKyAgICAgICAgZWRpdG9yLT5zZXRCYXNlV3JpdGluZ0RpcmVjdGlv
bihSaWdodFRvTGVmdFdyaXRpbmdEaXJlY3Rpb24pOworICAgICAgICBicmVhazsKKyAgICBjYXNl
IEluc3BlY3RFbGVtZW50OiB7CisjaWYgRU5BQkxFKElOU1BFQ1RPUikKKyAgICAgICAgQVNTRVJU
KGhpdFRlc3RSZXN1bHQgIT0gJmhpdFRlc3QpOworICAgICAgICBwYWdlLT5pbnNwZWN0b3JDb250
cm9sbGVyKCktPmluc3BlY3QoaGl0VGVzdFJlc3VsdC0+aW5uZXJOb25TaGFyZWROb2RlKTsKKyNl
bmRpZgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKGNv
bW1hbmROYW1lKQorICAgICAgICAgICAgZWRpdG9yLT5jb21tYW5kKGNvbW1hbmROYW1lKS5leGVj
dXRlKCk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworCitRU3RyaW5nIFFXZWJQYWdlQWRh
cHRlcjo6Y29udGV4dE1lbnVJdGVtVGFnRm9yQWN0aW9uKFFXZWJQYWdlQWRhcHRlcjo6TWVudUFj
dGlvbiBhY3Rpb24sIGJvb2wqIGNoZWNrYWJsZSkgY29uc3QKK3sKKyAgICBBU1NFUlQoY2hlY2th
YmxlKTsKKyAgICBzd2l0Y2ggKGFjdGlvbikgeworICAgIGNhc2UgT3Blbkxpbms6CisgICAgICAg
IHJldHVybiBjb250ZXh0TWVudUl0ZW1UYWdPcGVuTGluaygpOworICAgIGNhc2UgT3BlbkxpbmtJ
bk5ld1dpbmRvdzoKKyAgICAgICAgcmV0dXJuIGNvbnRleHRNZW51SXRlbVRhZ09wZW5MaW5rSW5O
ZXdXaW5kb3coKTsKKyAgICBjYXNlIE9wZW5GcmFtZUluTmV3V2luZG93OgorICAgICAgICByZXR1
cm4gY29udGV4dE1lbnVJdGVtVGFnT3BlbkZyYW1lSW5OZXdXaW5kb3coKTsKKyAgICBjYXNlIE9w
ZW5MaW5rSW5UaGlzV2luZG93OgorICAgICAgICByZXR1cm4gY29udGV4dE1lbnVJdGVtVGFnT3Bl
bkxpbmtJblRoaXNXaW5kb3coKTsKKworICAgIGNhc2UgRG93bmxvYWRMaW5rVG9EaXNrOgorICAg
ICAgICByZXR1cm4gY29udGV4dE1lbnVJdGVtVGFnRG93bmxvYWRMaW5rVG9EaXNrKCk7CisgICAg
Y2FzZSBDb3B5TGlua1RvQ2xpcGJvYXJkOgorICAgICAgICByZXR1cm4gY29udGV4dE1lbnVJdGVt
VGFnQ29weUxpbmtUb0NsaXBib2FyZCgpOworCisgICAgY2FzZSBPcGVuSW1hZ2VJbk5ld1dpbmRv
dzoKKyAgICAgICAgcmV0dXJuIGNvbnRleHRNZW51SXRlbVRhZ09wZW5JbWFnZUluTmV3V2luZG93
KCk7CisgICAgY2FzZSBEb3dubG9hZEltYWdlVG9EaXNrOgorICAgICAgICByZXR1cm4gY29udGV4
dE1lbnVJdGVtVGFnRG93bmxvYWRJbWFnZVRvRGlzaygpOworICAgIGNhc2UgQ29weUltYWdlVG9D
bGlwYm9hcmQ6CisgICAgICAgIHJldHVybiBjb250ZXh0TWVudUl0ZW1UYWdDb3B5SW1hZ2VUb0Ns
aXBib2FyZCgpOworICAgIGNhc2UgQ29weUltYWdlVXJsVG9DbGlwYm9hcmQ6CisgICAgICAgIHJl
dHVybiBjb250ZXh0TWVudUl0ZW1UYWdDb3B5SW1hZ2VVcmxUb0NsaXBib2FyZCgpOworCisgICAg
Y2FzZSBDdXQ6CisgICAgICAgIHJldHVybiBjb250ZXh0TWVudUl0ZW1UYWdDdXQoKTsKKyAgICBj
YXNlIENvcHk6CisgICAgICAgIHJldHVybiBjb250ZXh0TWVudUl0ZW1UYWdDb3B5KCk7CisgICAg
Y2FzZSBQYXN0ZToKKyAgICAgICAgcmV0dXJuIGNvbnRleHRNZW51SXRlbVRhZ1Bhc3RlKCk7Cisg
ICAgY2FzZSBTZWxlY3RBbGw6CisgICAgICAgIHJldHVybiBjb250ZXh0TWVudUl0ZW1UYWdTZWxl
Y3RBbGwoKTsKKworICAgIGNhc2UgQmFjazoKKyAgICAgICAgcmV0dXJuIGNvbnRleHRNZW51SXRl
bVRhZ0dvQmFjaygpOworICAgIGNhc2UgRm9yd2FyZDoKKyAgICAgICAgcmV0dXJuIGNvbnRleHRN
ZW51SXRlbVRhZ0dvRm9yd2FyZCgpOworICAgIGNhc2UgUmVsb2FkOgorICAgICAgICByZXR1cm4g
Y29udGV4dE1lbnVJdGVtVGFnUmVsb2FkKCk7CisgICAgY2FzZSBTdG9wOgorICAgICAgICByZXR1
cm4gY29udGV4dE1lbnVJdGVtVGFnU3RvcCgpOworCisgICAgY2FzZSBTZXRUZXh0RGlyZWN0aW9u
RGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGNvbnRleHRNZW51SXRlbVRhZ0RlZmF1bHREaXJlY3Rp
b24oKTsKKyAgICBjYXNlIFNldFRleHREaXJlY3Rpb25MZWZ0VG9SaWdodDoKKyAgICAgICAgKmNo
ZWNrYWJsZSA9IHRydWU7CisgICAgICAgIHJldHVybiBjb250ZXh0TWVudUl0ZW1UYWdMZWZ0VG9S
aWdodCgpOworICAgIGNhc2UgU2V0VGV4dERpcmVjdGlvblJpZ2h0VG9MZWZ0OgorICAgICAgICAq
Y2hlY2thYmxlID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIGNvbnRleHRNZW51SXRlbVRhZ1JpZ2h0
VG9MZWZ0KCk7CisKKyAgICBjYXNlIFRvZ2dsZUJvbGQ6CisgICAgICAgICpjaGVja2FibGUgPSB0
cnVlOworICAgICAgICByZXR1cm4gY29udGV4dE1lbnVJdGVtVGFnQm9sZCgpOworICAgIGNhc2Ug
VG9nZ2xlSXRhbGljOgorICAgICAgICAqY2hlY2thYmxlID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJu
IGNvbnRleHRNZW51SXRlbVRhZ0l0YWxpYygpOworICAgIGNhc2UgVG9nZ2xlVW5kZXJsaW5lOgor
ICAgICAgICAqY2hlY2thYmxlID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIGNvbnRleHRNZW51SXRl
bVRhZ1VuZGVybGluZSgpOworCisgICAgY2FzZSBJbnNwZWN0RWxlbWVudDoKKyAgICAgICAgcmV0
dXJuIGNvbnRleHRNZW51SXRlbVRhZ0luc3BlY3RFbGVtZW50KCk7CisgICAgZGVmYXVsdDoKKyAg
ICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIHJldHVybiBRU3RyaW5nKCk7Cisg
ICAgfQorfQorCisjaWYgRU5BQkxFKE5PVElGSUNBVElPTlMpIHx8IEVOQUJMRShMRUdBQ1lfTk9U
SUZJQ0FUSU9OUykKK3ZvaWQgUVdlYlBhZ2VBZGFwdGVyOjphbGxvd05vdGlmaWNhdGlvbnNGb3JG
cmFtZShRV2ViRnJhbWVBZGFwdGVyKiBmcmFtZSkKK3sKKyAgICBOb3RpZmljYXRpb25QcmVzZW50
ZXJDbGllbnRRdDo6bm90aWZpY2F0aW9uUHJlc2VudGVyKCktPmFsbG93Tm90aWZpY2F0aW9uRm9y
RnJhbWUoZnJhbWUtPmZyYW1lKTsKK30KKwordm9pZCBRV2ViUGFnZUFkYXB0ZXI6OmFkZE5vdGlm
aWNhdGlvblByZXNlbnRlckNsaWVudCgpCit7CisgICAgTm90aWZpY2F0aW9uUHJlc2VudGVyQ2xp
ZW50UXQ6Om5vdGlmaWNhdGlvblByZXNlbnRlcigpLT5hZGRDbGllbnQoKTsKK30KKworI2lmbmRl
ZiBRVF9OT19TWVNURU1UUkFZSUNPTgorYm9vbCBRV2ViUGFnZUFkYXB0ZXI6Omhhc1N5c3RlbVRy
YXlJY29uKCkgY29uc3QKK3sKKyAgICByZXR1cm4gTm90aWZpY2F0aW9uUHJlc2VudGVyQ2xpZW50
UXQ6Om5vdGlmaWNhdGlvblByZXNlbnRlcigpLT5oYXNTeXN0ZW1UcmF5SWNvbigpOworfQorCit2
b2lkIFFXZWJQYWdlQWRhcHRlcjo6c2V0U3lzdGVtVHJheUljb24oUU9iamVjdCAqaWNvbikKK3sK
KyAgICBOb3RpZmljYXRpb25QcmVzZW50ZXJDbGllbnRRdDo6bm90aWZpY2F0aW9uUHJlc2VudGVy
KCktPnNldFN5c3RlbVRyYXlJY29uKGljb24pOworfQorI2VuZGlmIC8vIFFUX05PX1NZU1RFTVRS
QVlJQ09OCisjZW5kaWYgLy8gRU5BQkxFKE5PVElGSUNBVElPTlMpIHx8IEVOQUJMRShMRUdBQ1lf
Tk9USUZJQ0FUSU9OUykKKworI2lmIEVOQUJMRShHRU9MT0NBVElPTikKK3ZvaWQgUVdlYlBhZ2VB
ZGFwdGVyOjpzZXRHZW9sb2NhdGlvbkVuYWJsZWRGb3JGcmFtZShRV2ViRnJhbWVBZGFwdGVyKiBm
cmFtZSwgYm9vbCBvbikKK3sKKyAgICBHZW9sb2NhdGlvblBlcm1pc3Npb25DbGllbnRRdDo6Z2Vv
bG9jYXRpb25QZXJtaXNzaW9uQ2xpZW50KCktPnNldFBlcm1pc3Npb24oZnJhbWUsIG9uKTsKK30K
KyNlbmRpZgorCisKK1FTdHJpbmcgUVdlYlBhZ2VBZGFwdGVyOjpkZWZhdWx0VXNlckFnZW50U3Ry
aW5nKCkKK3sKKyAgICByZXR1cm4gVXNlckFnZW50UXQ6OnN0YW5kYXJkVXNlckFnZW50KCIiLCBX
RUJLSVRfTUFKT1JfVkVSU0lPTiwgV0VCS0lUX01JTk9SX1ZFUlNJT04pOworfQorCitib29sIFFX
ZWJQYWdlQWRhcHRlcjo6dHJlYXRTY2hlbWVBc0xvY2FsKGNvbnN0IFFTdHJpbmcmIHNjaGVtZSkK
K3sKKyAgICByZXR1cm4gV2ViQ29yZTo6U2NoZW1lUmVnaXN0cnk6OnNob3VsZFRyZWF0VVJMU2No
ZW1lQXNMb2NhbChzY2hlbWUpOworfQorCitRT2JqZWN0KiBRV2ViUGFnZUFkYXB0ZXI6OmN1cnJl
bnRGcmFtZSgpIGNvbnN0Cit7CisgICAgRnJhbWUqIGZyYW1lID0gcGFnZS0+Zm9jdXNDb250cm9s
bGVyKCktPmZvY3VzZWRPck1haW5GcmFtZSgpOworICAgIHJldHVybiBmcmFtZS0+bG9hZGVyKCkt
Pm5ldHdvcmtpbmdDb250ZXh0KCktPm9yaWdpbmF0aW5nT2JqZWN0KCk7Cit9CisKK2Jvb2wgUVdl
YlBhZ2VBZGFwdGVyOjpoYXNGb2N1c2VkTm9kZSgpIGNvbnN0Cit7CisgICAgYm9vbCBoYXNGb2N1
cyA9IGZhbHNlOworICAgIEZyYW1lKiBmcmFtZSA9IHBhZ2UtPmZvY3VzQ29udHJvbGxlcigpLT5m
b2N1c2VkRnJhbWUoKTsKKyAgICBpZiAoZnJhbWUpIHsKKyAgICAgICAgRG9jdW1lbnQqIGRvY3Vt
ZW50ID0gZnJhbWUtPmRvY3VtZW50KCk7CisgICAgICAgIGhhc0ZvY3VzID0gZG9jdW1lbnQgJiYg
ZG9jdW1lbnQtPmZvY3VzZWROb2RlKCk7CisgICAgfQorICAgIHJldHVybiBoYXNGb2N1czsKK30K
KworUVdlYlBhZ2VBZGFwdGVyOjpWaWV3cG9ydEF0dHJpYnV0ZXMgUVdlYlBhZ2VBZGFwdGVyOjp2
aWV3cG9ydEF0dHJpYnV0ZXNGb3JTaXplKGNvbnN0IFFTaXplICZhdmFpbGFibGVTaXplLCBjb25z
dCBRU2l6ZSAmZGV2aWNlU2l6ZSkgY29uc3QKK3sKKyAgICBzdGF0aWMgY29uc3QgaW50IGRlc2t0
b3BXaWR0aCA9IDk4MDsKKworICAgIGZsb2F0IGRldmljZVBpeGVsUmF0aW8gPSBxdF9kZWZhdWx0
RHBpKCkgLyBXZWJDb3JlOjpWaWV3cG9ydEFyZ3VtZW50czo6ZGVwcmVjYXRlZFRhcmdldERQSTsK
KworICAgIFdlYkNvcmU6OlZpZXdwb3J0QXR0cmlidXRlcyBjb25mID0gV2ViQ29yZTo6Y29tcHV0
ZVZpZXdwb3J0QXR0cmlidXRlcyh2aWV3cG9ydEFyZ3VtZW50cygpLCBkZXNrdG9wV2lkdGgsIGRl
dmljZVNpemUud2lkdGgoKSwgZGV2aWNlU2l6ZS5oZWlnaHQoKSwgZGV2aWNlUGl4ZWxSYXRpbywg
YXZhaWxhYmxlU2l6ZSk7CisgICAgV2ViQ29yZTo6cmVzdHJpY3RNaW5pbXVtU2NhbGVGYWN0b3JU
b1ZpZXdwb3J0U2l6ZShjb25mLCBhdmFpbGFibGVTaXplLCBkZXZpY2VQaXhlbFJhdGlvKTsKKyAg
ICBXZWJDb3JlOjpyZXN0cmljdFNjYWxlRmFjdG9yVG9Jbml0aWFsU2NhbGVJZk5vdFVzZXJTY2Fs
YWJsZShjb25mKTsKKworICAgIHBhZ2UtPnNldERldmljZVNjYWxlRmFjdG9yKGRldmljZVBpeGVs
UmF0aW8pOworICAgIFFXZWJQYWdlQWRhcHRlcjo6Vmlld3BvcnRBdHRyaWJ1dGVzIHJlc3VsdDsK
KworICAgIHJlc3VsdC5zaXplID0gUVNpemVGKGNvbmYubGF5b3V0U2l6ZS53aWR0aCgpLCBjb25m
LmxheW91dFNpemUuaGVpZ2h0KCkpOworICAgIHJlc3VsdC5pbml0aWFsU2NhbGVGYWN0b3IgPSBj
b25mLmluaXRpYWxTY2FsZTsKKyAgICByZXN1bHQubWluaW11bVNjYWxlRmFjdG9yID0gY29uZi5t
aW5pbXVtU2NhbGU7CisgICAgcmVzdWx0Lm1heGltdW1TY2FsZUZhY3RvciA9IGNvbmYubWF4aW11
bVNjYWxlOworICAgIHJlc3VsdC5kZXZpY2VQaXhlbFJhdGlvID0gZGV2aWNlUGl4ZWxSYXRpbzsK
KyAgICByZXN1bHQuaXNVc2VyU2NhbGFibGUgPSBzdGF0aWNfY2FzdDxib29sPihjb25mLnVzZXJT
Y2FsYWJsZSk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK2Jvb2wgUVdlYlBhZ2VBZGFw
dGVyOjpoYW5kbGVLZXlFdmVudChRS2V5RXZlbnQgKmV2KQoreworICAgIEZyYW1lKiBmcmFtZSA9
IHBhZ2UtPmZvY3VzQ29udHJvbGxlcigpLT5mb2N1c2VkT3JNYWluRnJhbWUoKTsKKyAgICByZXR1
cm4gZnJhbWUtPmV2ZW50SGFuZGxlcigpLT5rZXlFdmVudChldik7Cit9CisKK2Jvb2wgUVdlYlBh
Z2VBZGFwdGVyOjpoYW5kbGVTY3JvbGxpbmcoUUtleUV2ZW50ICpldikKK3sKKyAgICBGcmFtZSog
ZnJhbWUgPSBwYWdlLT5mb2N1c0NvbnRyb2xsZXIoKS0+Zm9jdXNlZE9yTWFpbkZyYW1lKCk7Cisg
ICAgV2ViQ29yZTo6U2Nyb2xsRGlyZWN0aW9uIGRpcmVjdGlvbjsKKyAgICBXZWJDb3JlOjpTY3Jv
bGxHcmFudWxhcml0eSBncmFudWxhcml0eTsKKworI2lmbmRlZiBRVF9OT19TSE9SVENVVAorICAg
IGlmIChldiA9PSBRS2V5U2VxdWVuY2U6Ok1vdmVUb05leHRQYWdlIHx8IChldi0+a2V5KCkgPT0g
UXQ6OktleV9TcGFjZSAmJiAhKGV2LT5tb2RpZmllcnMoKSAmIFF0OjpTaGlmdE1vZGlmaWVyKSkp
IHsKKyAgICAgICAgZ3JhbnVsYXJpdHkgPSBXZWJDb3JlOjpTY3JvbGxCeVBhZ2U7CisgICAgICAg
IGRpcmVjdGlvbiA9IFdlYkNvcmU6OlNjcm9sbERvd247CisgICAgfSBlbHNlIGlmIChldiA9PSBR
S2V5U2VxdWVuY2U6Ok1vdmVUb1ByZXZpb3VzUGFnZSB8fCAoKGV2LT5rZXkoKSA9PSBRdDo6S2V5
X1NwYWNlKSAmJiAoZXYtPm1vZGlmaWVycygpICYgUXQ6OlNoaWZ0TW9kaWZpZXIpKSkgeworICAg
ICAgICBncmFudWxhcml0eSA9IFdlYkNvcmU6OlNjcm9sbEJ5UGFnZTsKKyAgICAgICAgZGlyZWN0
aW9uID0gV2ViQ29yZTo6U2Nyb2xsVXA7CisgICAgfSBlbHNlCisjZW5kaWYgLy8gUVRfTk9fU0hP
UlRDVVQKKyAgICBpZiAoKGV2LT5rZXkoKSA9PSBRdDo6S2V5X1VwICYmIGV2LT5tb2RpZmllcnMo
KSAmIFF0OjpDb250cm9sTW9kaWZpZXIpIHx8IGV2LT5rZXkoKSA9PSBRdDo6S2V5X0hvbWUpIHsK
KyAgICAgICAgZ3JhbnVsYXJpdHkgPSBXZWJDb3JlOjpTY3JvbGxCeURvY3VtZW50OworICAgICAg
ICBkaXJlY3Rpb24gPSBXZWJDb3JlOjpTY3JvbGxVcDsKKyAgICB9IGVsc2UgaWYgKChldi0+a2V5
KCkgPT0gUXQ6OktleV9Eb3duICYmIGV2LT5tb2RpZmllcnMoKSAmIFF0OjpDb250cm9sTW9kaWZp
ZXIpIHx8IGV2LT5rZXkoKSA9PSBRdDo6S2V5X0VuZCkgeworICAgICAgICBncmFudWxhcml0eSA9
IFdlYkNvcmU6OlNjcm9sbEJ5RG9jdW1lbnQ7CisgICAgICAgIGRpcmVjdGlvbiA9IFdlYkNvcmU6
OlNjcm9sbERvd247CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoIChldi0+a2V5KCkpIHsK
KyAgICAgICAgY2FzZSBRdDo6S2V5X1VwOgorICAgICAgICAgICAgZ3JhbnVsYXJpdHkgPSBXZWJD
b3JlOjpTY3JvbGxCeUxpbmU7CisgICAgICAgICAgICBkaXJlY3Rpb24gPSBXZWJDb3JlOjpTY3Jv
bGxVcDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFF0OjpLZXlfRG93bjoKKyAg
ICAgICAgICAgIGdyYW51bGFyaXR5ID0gV2ViQ29yZTo6U2Nyb2xsQnlMaW5lOworICAgICAgICAg
ICAgZGlyZWN0aW9uID0gV2ViQ29yZTo6U2Nyb2xsRG93bjsKKyAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICBjYXNlIFF0OjpLZXlfTGVmdDoKKyAgICAgICAgICAgIGdyYW51bGFyaXR5ID0gV2Vi
Q29yZTo6U2Nyb2xsQnlMaW5lOworICAgICAgICAgICAgZGlyZWN0aW9uID0gV2ViQ29yZTo6U2Ny
b2xsTGVmdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFF0OjpLZXlfUmlnaHQ6
CisgICAgICAgICAgICBncmFudWxhcml0eSA9IFdlYkNvcmU6OlNjcm9sbEJ5TGluZTsKKyAgICAg
ICAgICAgIGRpcmVjdGlvbiA9IFdlYkNvcmU6OlNjcm9sbFJpZ2h0OworICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAg
IH0KKyAgICB9CisKKyAgICByZXR1cm4gZnJhbWUtPmV2ZW50SGFuZGxlcigpLT5zY3JvbGxSZWN1
cnNpdmVseShkaXJlY3Rpb24sIGdyYW51bGFyaXR5KTsKK30KKwordm9pZCBRV2ViUGFnZUFkYXB0
ZXI6OmZvY3VzSW5FdmVudChRRm9jdXNFdmVudCAqKQoreworICAgIEZvY3VzQ29udHJvbGxlciog
Zm9jdXNDb250cm9sbGVyID0gcGFnZS0+Zm9jdXNDb250cm9sbGVyKCk7CisgICAgZm9jdXNDb250
cm9sbGVyLT5zZXRBY3RpdmUodHJ1ZSk7CisgICAgZm9jdXNDb250cm9sbGVyLT5zZXRGb2N1c2Vk
KHRydWUpOworICAgIGlmICghZm9jdXNDb250cm9sbGVyLT5mb2N1c2VkRnJhbWUoKSkKKyAgICAg
ICAgZm9jdXNDb250cm9sbGVyLT5zZXRGb2N1c2VkRnJhbWUobWFpbkZyYW1lQWRhcHRlcigpLT5m
cmFtZSk7Cit9CisKK3ZvaWQgUVdlYlBhZ2VBZGFwdGVyOjpmb2N1c091dEV2ZW50KFFGb2N1c0V2
ZW50ICopCit7CisgICAgLy8gb25seSBzZXQgdGhlIGZvY3VzZWQgZnJhbWUgaW5hY3RpdmUgc28g
dGhhdCB3ZSBzdG9wIHBhaW50aW5nIHRoZSBjYXJldAorICAgIC8vIGFuZCB0aGUgZm9jdXMgZnJh
bWUuIEJ1dCBkb24ndCB0ZWxsIHRoZSBmb2N1cyBjb250cm9sbGVyIHNvIHRoYXQgdXBvbgorICAg
IC8vIGZvY3VzSW5FdmVudCgpIHdlIGNhbiByZS1hY3RpdmF0ZSB0aGUgZnJhbWUuCisgICAgRm9j
dXNDb250cm9sbGVyKiBmb2N1c0NvbnRyb2xsZXIgPSBwYWdlLT5mb2N1c0NvbnRyb2xsZXIoKTsK
KyAgICAvLyBDYWxsIHNldEZvY3VzZWQgZmlyc3Qgc28gdGhhdCB3aW5kb3cub25ibHVyIGRvZXNu
J3QgZ2V0IGNhbGxlZCB0d2ljZQorICAgIGZvY3VzQ29udHJvbGxlci0+c2V0Rm9jdXNlZChmYWxz
ZSk7CisgICAgZm9jdXNDb250cm9sbGVyLT5zZXRBY3RpdmUoZmFsc2UpOworfQorCitib29sIFFX
ZWJQYWdlQWRhcHRlcjo6aGFuZGxlU2hvcnRjdXRPdmVycmlkZUV2ZW50KFFLZXlFdmVudCogZXZl
bnQpCit7CisgICAgV2ViQ29yZTo6RnJhbWUqIGZyYW1lID0gcGFnZS0+Zm9jdXNDb250cm9sbGVy
KCktPmZvY3VzZWRPck1haW5GcmFtZSgpOworICAgIFdlYkNvcmU6OkVkaXRvciogZWRpdG9yID0g
ZnJhbWUtPmVkaXRvcigpOworICAgIGlmICghZWRpdG9yLT5jYW5FZGl0KCkpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICBpZiAoZXZlbnQtPm1vZGlmaWVycygpID09IFF0OjpOb01vZGlmaWVy
CisgICAgICAgIHx8IGV2ZW50LT5tb2RpZmllcnMoKSA9PSBRdDo6U2hpZnRNb2RpZmllcgorICAg
ICAgICB8fCBldmVudC0+bW9kaWZpZXJzKCkgPT0gUXQ6OktleXBhZE1vZGlmaWVyKSB7CisgICAg
ICAgIGlmIChldmVudC0+a2V5KCkgPCBRdDo6S2V5X0VzY2FwZSkKKyAgICAgICAgICAgIGV2ZW50
LT5hY2NlcHQoKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LT5r
ZXkoKSkgeworICAgICAgICAgICAgY2FzZSBRdDo6S2V5X1JldHVybjoKKyAgICAgICAgICAgIGNh
c2UgUXQ6OktleV9FbnRlcjoKKyAgICAgICAgICAgIGNhc2UgUXQ6OktleV9EZWxldGU6CisgICAg
ICAgICAgICBjYXNlIFF0OjpLZXlfSG9tZToKKyAgICAgICAgICAgIGNhc2UgUXQ6OktleV9FbmQ6
CisgICAgICAgICAgICBjYXNlIFF0OjpLZXlfQmFja3NwYWNlOgorICAgICAgICAgICAgY2FzZSBR
dDo6S2V5X0xlZnQ6CisgICAgICAgICAgICBjYXNlIFF0OjpLZXlfUmlnaHQ6CisgICAgICAgICAg
ICBjYXNlIFF0OjpLZXlfVXA6CisgICAgICAgICAgICBjYXNlIFF0OjpLZXlfRG93bjoKKyAgICAg
ICAgICAgIGNhc2UgUXQ6OktleV9UYWI6CisgICAgICAgICAgICAgICAgZXZlbnQtPmFjY2VwdCgp
OworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBRV2Vi
UGFnZUFkYXB0ZXI6OnRvdWNoRXZlbnQoUVRvdWNoRXZlbnQqIGV2ZW50KQoreworI2lmIEVOQUJM
RShUT1VDSF9FVkVOVFMpCisgICAgRnJhbWUqIGZyYW1lID0gbWFpbkZyYW1lQWRhcHRlcigpLT5m
cmFtZTsKKyAgICBpZiAoIWZyYW1lLT52aWV3KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKwor
ICAgIC8vIEFsd2F5cyBhY2NlcHQgdGhlIFFUb3VjaEV2ZW50IHNvIHRoYXQgd2UnbGwgcmVjZWl2
ZSBhbHNvIFRvdWNoVXBkYXRlIGFuZCBUb3VjaEVuZCBldmVudHMKKyAgICBldmVudC0+c2V0QWNj
ZXB0ZWQodHJ1ZSk7CisKKyAgICAvLyBSZXR1cm4gd2hldGhlciB0aGUgZGVmYXVsdCBhY3Rpb24g
d2FzIGNhbmNlbGxlZCBpbiB0aGUgSlMgZXZlbnQgaGFuZGxlcgorICAgIHJldHVybiBmcmFtZS0+
ZXZlbnRIYW5kbGVyKCktPmhhbmRsZVRvdWNoRXZlbnQoY29udmVydFRvdWNoRXZlbnQoZXZlbnQp
KTsKKyNlbHNlCisgICAgZXZlbnQtPmlnbm9yZSgpOworICAgIHJldHVybiBmYWxzZTsKKyNlbmRp
ZgorfQorCitib29sIFFXZWJQYWdlQWRhcHRlcjo6c3dhbGxvd0NvbnRleHRNZW51RXZlbnQoUUNv
bnRleHRNZW51RXZlbnQgKmV2ZW50LCBRV2ViRnJhbWVBZGFwdGVyICp3ZWJGcmFtZSkKK3sKKyAg
ICAvLyBDaGVjayB0aGUgZmlyc3QgYW5kIGxhc3QgZW51bSB2YWx1ZXMgbWF0Y2ggYXQgbGVhc3Qs
IHNpbmNlIHdlIGNhc3QuCisgICAgQVNTRVJUKGludChRV2ViUGFnZUFkYXB0ZXI6OlNjcm9sbFVw
KSA9PSBpbnQoV2ViQ29yZTo6U2Nyb2xsVXApKTsKKyAgICBBU1NFUlQoaW50KFFXZWJQYWdlQWRh
cHRlcjo6U2Nyb2xsUmlnaHQpID09IGludChXZWJDb3JlOjpTY3JvbGxSaWdodCkpOworICAgIEFT
U0VSVChpbnQoUVdlYlBhZ2VBZGFwdGVyOjpTY3JvbGxCeUxpbmUpID09IGludChXZWJDb3JlOjpT
Y3JvbGxCeUxpbmUpKTsKKyAgICBBU1NFUlQoaW50KFFXZWJQYWdlQWRhcHRlcjo6U2Nyb2xsQnlE
b2N1bWVudCkgPT0gaW50KFdlYkNvcmU6OlNjcm9sbEJ5RG9jdW1lbnQpKTsKKworICAgIHBhZ2Ut
PmNvbnRleHRNZW51Q29udHJvbGxlcigpLT5jbGVhckNvbnRleHRNZW51KCk7CisKKyAgICBpZiAo
d2ViRnJhbWUpIHsKKyAgICAgICAgRnJhbWUqIGZyYW1lID0gd2ViRnJhbWUtPmZyYW1lOworICAg
ICAgICBpZiAoU2Nyb2xsYmFyKiBzY3JvbGxCYXIgPSBmcmFtZS0+dmlldygpLT5zY3JvbGxiYXJB
dFBvaW50KGNvbnZlcnRNb3VzZUV2ZW50KGV2ZW50LCAxKS5wb3NpdGlvbigpKSkgeworICAgICAg
ICAgICAgYm9vbCBob3Jpem9udGFsID0gKHNjcm9sbEJhci0+b3JpZW50YXRpb24oKSA9PSBIb3Jp
em9udGFsU2Nyb2xsYmFyKTsKKyAgICAgICAgICAgIFFXZWJQYWdlQWRhcHRlcjo6U2Nyb2xsRGly
ZWN0aW9uIGRpcmVjdGlvbiA9IFFXZWJQYWdlQWRhcHRlcjo6SW52YWxpZFNjcm9sbERpcmVjdGlv
bjsKKyAgICAgICAgICAgIFFXZWJQYWdlQWRhcHRlcjo6U2Nyb2xsR3JhbnVsYXJpdHkgZ3JhbnVs
YXJpdHkgPSBRV2ViUGFnZUFkYXB0ZXI6OkludmFsaWRTY3JvbGxHcmFudWxhcml0eTsKKyAgICAg
ICAgICAgIGJvb2wgc2Nyb2xsID0gaGFuZGxlU2Nyb2xsYmFyQ29udGV4dE1lbnVFdmVudChldmVu
dCwgaG9yaXpvbnRhbCwgJmRpcmVjdGlvbiwgJmdyYW51bGFyaXR5KTsKKyAgICAgICAgICAgIGlm
ICghc2Nyb2xsKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgaWYg
KGRpcmVjdGlvbiA9PSBRV2ViUGFnZUFkYXB0ZXI6OkludmFsaWRTY3JvbGxEaXJlY3Rpb24gfHwg
Z3JhbnVsYXJpdHkgPT0gUVdlYlBhZ2VBZGFwdGVyOjpJbnZhbGlkU2Nyb2xsR3JhbnVsYXJpdHkp
IHsKKyAgICAgICAgICAgICAgICBTY3JvbGxiYXJUaGVtZSogdGhlbWUgPSBzY3JvbGxCYXItPnRo
ZW1lKCk7CisgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBwcmVzc2VkIHBvc2l0aW9uIHRvIHRo
ZSBtaWRkbGUgb2YgdGhlIHRodW1iIHNvIHRoYXQgd2hlbiB3ZQorICAgICAgICAgICAgICAgIC8v
IGRvIG1vdmUsIHRoZSBkZWx0YSB3aWxsIGJlIGZyb20gdGhlIGN1cnJlbnQgcGl4ZWwgcG9zaXRp
b24gb2YgdGhlCisgICAgICAgICAgICAgICAgLy8gdGh1bWIgdG8gdGhlIG5ldyBwb3NpdGlvbgor
ICAgICAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IHRoZW1lLT50cmFja1Bvc2l0aW9uKHNjcm9s
bEJhcikgKyB0aGVtZS0+dGh1bWJQb3NpdGlvbihzY3JvbGxCYXIpICsgdGhlbWUtPnRodW1iTGVu
Z3RoKHNjcm9sbEJhcikgLyAyOworICAgICAgICAgICAgICAgIHNjcm9sbEJhci0+c2V0UHJlc3Nl
ZFBvcyhwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgY29uc3QgUVBvaW50IHBvcyA9IHNjcm9s
bEJhci0+Y29udmVydEZyb21Db250YWluaW5nV2luZG93KGV2ZW50LT5wb3MoKSk7CisgICAgICAg
ICAgICAgICAgc2Nyb2xsQmFyLT5tb3ZlVGh1bWIoaG9yaXpvbnRhbCA/IHBvcy54KCkgOiBwb3Mu
eSgpKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHNjcm9sbEJhci0+c2Ny
b2xsYWJsZUFyZWEoKS0+c2Nyb2xsKFdlYkNvcmU6OlNjcm9sbERpcmVjdGlvbihkaXJlY3Rpb24p
LCBXZWJDb3JlOjpTY3JvbGxHcmFudWxhcml0eShncmFudWxhcml0eSkpOworICAgICAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBXZWJDb3JlOjpGcmFtZSogZm9j
dXNlZEZyYW1lID0gcGFnZS0+Zm9jdXNDb250cm9sbGVyKCktPmZvY3VzZWRPck1haW5GcmFtZSgp
OworICAgIGZvY3VzZWRGcmFtZS0+ZXZlbnRIYW5kbGVyKCktPnNlbmRDb250ZXh0TWVudUV2ZW50
KGNvbnZlcnRNb3VzZUV2ZW50KGV2ZW50LCAxKSk7CisgICAgQ29udGV4dE1lbnUqIG1lbnUgPSBw
YWdlLT5jb250ZXh0TWVudUNvbnRyb2xsZXIoKS0+Y29udGV4dE1lbnUoKTsKKyAgICAvLyBJZiB0
aGUgd2Vic2l0ZSBkZWZpbmVzIGl0cyBvd24gaGFuZGxlciB0aGVuIHNlbmRDb250ZXh0TWVudUV2
ZW50IHRha2VzIGNhcmUgb2YKKyAgICAvLyBjYWxsaW5nL3Nob3dpbmcgaXQgYW5kIHRoZSBjb250
ZXh0IG1lbnUgcG9pbnRlciB3aWxsIGJlIHplcm8uIFRoaXMgaXMgdGhlIGNhc2UKKyAgICAvLyBv
biBtYXBzLmdvb2dsZS5jb20gZm9yIGV4YW1wbGUuCisKKyAgICByZXR1cm4gIW1lbnU7Cit9CmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L1FXZWJQYWdlQWRhcHRl
ci5oIGIvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9RV2ViUGFnZUFkYXB0ZXIuaApp
bmRleCA0ODI5ODkyMmUxOWJlMGU2ZGMwYWQzOTc1NWEyNjE1ZDBmNTBjMWU5Li44N2I0ZWNkMTRh
ZmY1NDFhZDhmZTI3MWU5Njk4ZGFmMzM0N2JhZGJhIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0
L3F0L1dlYkNvcmVTdXBwb3J0L1FXZWJQYWdlQWRhcHRlci5oCisrKyBiL1NvdXJjZS9XZWJLaXQv
cXQvV2ViQ29yZVN1cHBvcnQvUVdlYlBhZ2VBZGFwdGVyLmgKQEAgLTIyLDI5ICsyMiwzOSBAQAog
CiAjaW5jbHVkZSAiUVdlYlBhZ2VDbGllbnQuaCIKICNpbmNsdWRlICJWaWV3cG9ydEFyZ3VtZW50
cy5oIgorI2luY2x1ZGUgInF3ZWJoaXN0b3J5LmgiCiAKKyNpbmNsdWRlIDxxYmFzaWN0aW1lci5o
PgorI2luY2x1ZGUgPHFldmVudC5oPgogI2luY2x1ZGUgPHFuZXR3b3JrcmVxdWVzdC5oPgogI2lu
Y2x1ZGUgPHFyZWN0Lmg+CiAjaW5jbHVkZSA8cXNjb3BlZHBvaW50ZXIuaD4KICNpbmNsdWRlIDxx
c2hhcmVkcG9pbnRlci5oPgogI2luY2x1ZGUgPHFzdHJpbmcuaD4KICNpbmNsdWRlIDxxdXJsLmg+
CisjaW5jbHVkZSA8d3RmL0V4cG9ydE1hY3Jvcy5oPgogCiBRVF9CRUdJTl9OQU1FU1BBQ0UKK2Ns
YXNzIFFCaXRBcnJheTsKIGNsYXNzIFFLZXlFdmVudDsKK2NsYXNzIFFNaW1lRGF0YTsKK2NsYXNz
IFFNb3VzZUV2ZW50OwogY2xhc3MgUU5ldHdvcmtBY2Nlc3NNYW5hZ2VyOworY2xhc3MgUVdoZWVs
RXZlbnQ7CitjbGFzcyBRSW5wdXRNZXRob2RFdmVudDsKIFFUX0VORF9OQU1FU1BBQ0UKIAogbmFt
ZXNwYWNlIFdlYkNvcmUgewotY2xhc3MgUGFnZTsKIGNsYXNzIENocm9tZUNsaWVudFF0OwogY2xh
c3MgR2VvbG9jYXRpb25DbGllbnRRdDsKK2NsYXNzIFBhZ2U7CiBjbGFzcyBVbmRvU3RlcDsKIH0K
IAogY2xhc3MgUXRQbHVnaW5XaWRnZXRBZGFwdGVyOwogY2xhc3MgUVdlYkZyYW1lQWRhcHRlcjsK
IGNsYXNzIFFXZWJIaXN0b3J5SXRlbTsKK2NsYXNzIFFXZWJIaXRUZXN0UmVzdWx0UHJpdmF0ZTsK
IGNsYXNzIFFXZWJQYWdlQ2xpZW50OwogY2xhc3MgUVdlYlBsdWdpbkZhY3Rvcnk7CiBjbGFzcyBR
V2ViU2VjdXJpdHlPcmlnaW47CkBAIC01MywxMyArNjMsNzUgQEAgY2xhc3MgUVdlYlNldHRpbmdz
OwogY2xhc3MgUVdlYkZ1bGxTY3JlZW5WaWRlb0hhbmRsZXI7CiBjbGFzcyBVbmRvU3RlcFF0Owog
Ci0KLWNsYXNzIFFXZWJQYWdlQWRhcHRlciB7CitjbGFzcyBXRUJLSVRfRVhQT1JUREFUQSBRV2Vi
UGFnZUFkYXB0ZXIgewogcHVibGljOgorCisjZGVmaW5lIEZPUl9FQUNIX01BUFBFRF9NRU5VX0FD
VElPTihGLCBTRVBBUkFUT1IpIFwKKyAgICBGKE9wZW5MaW5rLCBXZWJDb3JlOjpDb250ZXh0TWVu
dUl0ZW1UYWdPcGVuTGluaykgU0VQQVJBVE9SIFwKKyAgICBGKE9wZW5MaW5rSW5OZXdXaW5kb3cs
IFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbVRhZ09wZW5MaW5rSW5OZXdXaW5kb3cpIFNFUEFSQVRP
UiBcCisgICAgRihPcGVuTGlua0luVGhpc1dpbmRvdywgV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVt
VGFnT3BlbkxpbmtJblRoaXNXaW5kb3cpIFNFUEFSQVRPUiBcCisgICAgRihEb3dubG9hZExpbmtU
b0Rpc2ssIFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbVRhZ0Rvd25sb2FkTGlua1RvRGlzaykgU0VQ
QVJBVE9SIFwKKyAgICBGKENvcHlMaW5rVG9DbGlwYm9hcmQsIFdlYkNvcmU6OkNvbnRleHRNZW51
SXRlbVRhZ0NvcHlMaW5rVG9DbGlwYm9hcmQpIFNFUEFSQVRPUiBcCisgICAgRihPcGVuSW1hZ2VJ
bk5ld1dpbmRvdywgV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtVGFnT3BlbkltYWdlSW5OZXdXaW5k
b3cpIFNFUEFSQVRPUiBcCisgICAgRihEb3dubG9hZEltYWdlVG9EaXNrLCBXZWJDb3JlOjpDb250
ZXh0TWVudUl0ZW1UYWdEb3dubG9hZEltYWdlVG9EaXNrKSBTRVBBUkFUT1IgXAorICAgIEYoQ29w
eUltYWdlVG9DbGlwYm9hcmQsIFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbVRhZ0NvcHlJbWFnZVRv
Q2xpcGJvYXJkKSBTRVBBUkFUT1IgXAorICAgIEYoQ29weUltYWdlVXJsVG9DbGlwYm9hcmQsIFdl
YkNvcmU6OkNvbnRleHRNZW51SXRlbVRhZ0NvcHlJbWFnZVVybFRvQ2xpcGJvYXJkKSBTRVBBUkFU
T1IgXAorICAgIEYoT3BlbkZyYW1lSW5OZXdXaW5kb3csIFdlYkNvcmU6OkNvbnRleHRNZW51SXRl
bVRhZ09wZW5GcmFtZUluTmV3V2luZG93KSBTRVBBUkFUT1IgXAorICAgIEYoQ29weSwgV2ViQ29y
ZTo6Q29udGV4dE1lbnVJdGVtVGFnQ29weSkgU0VQQVJBVE9SIFwKKyAgICBGKEJhY2ssIFdlYkNv
cmU6OkNvbnRleHRNZW51SXRlbVRhZ0dvQmFjaykgU0VQQVJBVE9SIFwKKyAgICBGKEZvcndhcmQs
IFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbVRhZ0dvRm9yd2FyZCkgU0VQQVJBVE9SIFwKKyAgICBG
KFN0b3AsIFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbVRhZ1N0b3ApIFNFUEFSQVRPUiBcCisgICAg
RihSZWxvYWQsIFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbVRhZ1JlbG9hZCkgU0VQQVJBVE9SIFwK
KyAgICBGKEN1dCwgV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtVGFnQ3V0KSBTRVBBUkFUT1IgXAor
ICAgIEYoUGFzdGUsIFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbVRhZ1Bhc3RlKSBTRVBBUkFUT1Ig
XAorICAgIEYoU2V0VGV4dERpcmVjdGlvbkRlZmF1bHQsIFdlYkNvcmU6OkNvbnRleHRNZW51SXRl
bVRhZ0RlZmF1bHREaXJlY3Rpb24pIFNFUEFSQVRPUiBcCisgICAgRihTZXRUZXh0RGlyZWN0aW9u
TGVmdFRvUmlnaHQsIFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbVRhZ0xlZnRUb1JpZ2h0KSBTRVBB
UkFUT1IgXAorICAgIEYoU2V0VGV4dERpcmVjdGlvblJpZ2h0VG9MZWZ0LCBXZWJDb3JlOjpDb250
ZXh0TWVudUl0ZW1UYWdSaWdodFRvTGVmdCkgU0VQQVJBVE9SIFwKKyAgICBGKFRvZ2dsZUJvbGQs
IFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbVRhZ0JvbGQpIFNFUEFSQVRPUiBcCisgICAgRihUb2dn
bGVJdGFsaWMsIFdlYkNvcmU6OkNvbnRleHRNZW51SXRlbVRhZ0l0YWxpYykgU0VQQVJBVE9SIFwK
KyAgICBGKFRvZ2dsZVVuZGVybGluZSwgV2ViQ29yZTo6Q29udGV4dE1lbnVJdGVtVGFnVW5kZXJs
aW5lKSBTRVBBUkFUT1IgXAorICAgIEYoU2VsZWN0QWxsLCBXZWJDb3JlOjpDb250ZXh0TWVudUl0
ZW1UYWdTZWxlY3RBbGwpCisjZGVmaW5lIENPTU1BX1NFUEFSQVRPUiAsCisjZGVmaW5lIFNFTUlD
T0xPTl9TRVBBUkFUT1IgOworI2RlZmluZSBERUZJTkVfQUNUSU9OKE5hbWUsIFZhbHVlKSBcCisg
ICAgTmFtZQorCisgICAgZW51bSBNZW51QWN0aW9uIHsKKyAgICAgICAgTm9BY3Rpb24gPSAtIDEs
CisgICAgICAgIEZPUl9FQUNIX01BUFBFRF9NRU5VX0FDVElPTihERUZJTkVfQUNUSU9OLCBDT01N
QV9TRVBBUkFUT1IpCisjaWYgRU5BQkxFKElOU1BFQ1RPUikKKyAgICAgICAgLCBJbnNwZWN0RWxl
bWVudAorI2VuZGlmCisgICAgICAgICwgQWN0aW9uQ291bnQKKyAgICB9OworCisgICAgLy8gRHVw
bGljYXRlZCBmcm9tIHF3ZWJwYWdlLmgKKyAgICBlbnVtIEZpbmRGbGFnIHsKKyAgICAgICAgRmlu
ZEJhY2t3YXJkID0gMSwKKyAgICAgICAgRmluZENhc2VTZW5zaXRpdmVseSA9IDIsCisgICAgICAg
IEZpbmRXcmFwc0Fyb3VuZERvY3VtZW50ID0gNCwKKyAgICAgICAgSGlnaGxpZ2h0QWxsT2NjdXJy
ZW5jZXMgPSA4CisgICAgfTsKKworICAgIC8vIHZhbGlkIHZhbHVlcyBtYXRjaGluZyB0aG9zZSBm
cm9tIFNjcm9sbFR5cGVzLmgKKyAgICBlbnVtIFNjcm9sbERpcmVjdGlvbiB7CisgICAgICAgIElu
dmFsaWRTY3JvbGxEaXJlY3Rpb24gPSAtMSwKKyAgICAgICAgU2Nyb2xsVXAsCisgICAgICAgIFNj
cm9sbERvd24sCisgICAgICAgIFNjcm9sbExlZnQsCisgICAgICAgIFNjcm9sbFJpZ2h0CisgICAg
fTsKKyAgICAvLyBzYW1lIGhlcmUKKyAgICBlbnVtIFNjcm9sbEdyYW51bGFyaXR5IHsKKyAgICAg
ICAgSW52YWxpZFNjcm9sbEdyYW51bGFyaXR5ID0gLTEsCisgICAgICAgIFNjcm9sbEJ5TGluZSwK
KyAgICAgICAgU2Nyb2xsQnlQYWdlLAorICAgICAgICBTY3JvbGxCeURvY3VtZW50CisgICAgfTsK
KwogICAgIFFXZWJQYWdlQWRhcHRlcigpOwogICAgIHZpcnR1YWwgflFXZWJQYWdlQWRhcHRlcigp
OwogCi0gICAgdm9pZCBpbml0KFdlYkNvcmU6OlBhZ2UqKTsKICAgICAvLyBDYWxsZWQgbWFudWFs
bHkgZnJvbSB+UVdlYlBhZ2UgZGVzdHJ1Y3RvciB0byBlbnN1cmUgdGhhdAogICAgIC8vIHRoZSBR
V2ViUGFnZUFkYXB0ZXIgYW5kIHRoZSBRV2ViUGFnZVByaXZhdGUgYXJlIGludGFjdCB3aGVuCiAg
ICAgLy8gdmFyaW91cyBkZXN0cnVjdGlvbiBjYWxsYmFja3MgZnJvbSBXZWJDb3JlOjpQYWdlOjp+
UGFnZSgpIGhpdCB1cy4KQEAgLTE0MCwxNSArMjEyLDEzNSBAQCBwdWJsaWM6CiAgICAgdmlydHVh
bCBib29sIGVycm9yUGFnZUV4dGVuc2lvbihFcnJvclBhZ2VPcHRpb24qLCBFcnJvclBhZ2VSZXR1
cm4qKSA9IDA7CiAgICAgdmlydHVhbCBRdFBsdWdpbldpZGdldEFkYXB0ZXIqIGNyZWF0ZVBsdWdp
bihjb25zdCBRU3RyaW5nJiwgY29uc3QgUVVybCYsIGNvbnN0IFFTdHJpbmdMaXN0JiwgY29uc3Qg
UVN0cmluZ0xpc3QmKSA9IDA7CiAgICAgdmlydHVhbCBRdFBsdWdpbldpZGdldEFkYXB0ZXIqIGFk
YXB0ZXJGb3JXaWRnZXQoUU9iamVjdCopIGNvbnN0ID0gMDsKLQorICAgIHZpcnR1YWwgYm9vbCBy
ZXF1ZXN0U29mdHdhcmVJbnB1dFBhbmVsKCkgY29uc3QgPSAwOworICAgIHN0cnVjdCBNZW51SXRl
bURlc2NyaXB0aW9uIHsKKyAgICAgICAgTWVudUl0ZW1EZXNjcmlwdGlvbigpCisgICAgICAgICAg
ICA6IHR5cGUoTm9UeXBlKQorICAgICAgICAgICAgLCBhY3Rpb24oTm9BY3Rpb24pCisgICAgICAg
ICAgICAsIHRyYWl0cyhOb25lKQorICAgICAgICB7IH0KKyAgICAgICAgZW51bSBUeXBlIHsKKyAg
ICAgICAgICAgIE5vVHlwZSwKKyAgICAgICAgICAgIEFjdGlvbiwKKyAgICAgICAgICAgIFNlcGFy
YXRvciwKKyAgICAgICAgICAgIFN1Yk1lbnUKKyAgICAgICAgfSB0eXBlOworICAgICAgICBNZW51
QWN0aW9uIGFjdGlvbjsKKyAgICAgICAgZW51bSBUcmFpdCB7CisgICAgICAgICAgICBOb25lID0g
MCwKKyAgICAgICAgICAgIEVuYWJsZWQgPSAxLAorICAgICAgICAgICAgQ2hlY2thYmxlID0gMiwK
KyAgICAgICAgICAgIENoZWNrZWQgPSA0CisgICAgICAgIH07CisgICAgICAgIFFfREVDTEFSRV9G
TEFHUyhUcmFpdHMsIFRyYWl0KTsKKyAgICAgICAgVHJhaXRzIHRyYWl0czsKKyAgICAgICAgUUxp
c3Q8TWVudUl0ZW1EZXNjcmlwdGlvbj4gc3ViTWVudTsKKyAgICAgICAgUVN0cmluZyBzdWJNZW51
VGl0bGU7CisgICAgfTsKKyAgICB2aXJ0dWFsIHZvaWQgY3JlYXRlQW5kU2V0Q3VycmVudENvbnRl
eHRNZW51KGNvbnN0IFFMaXN0PE1lbnVJdGVtRGVzY3JpcHRpb24+JiwgUUJpdEFycmF5KikgPSAw
OworICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVTY3JvbGxiYXJDb250ZXh0TWVudUV2ZW50KFFDb250
ZXh0TWVudUV2ZW50KiwgYm9vbCwgU2Nyb2xsRGlyZWN0aW9uKiwgU2Nyb2xsR3JhbnVsYXJpdHkq
KSA9IDA7CiAKICAgICBzdGF0aWMgUVdlYlBhZ2VBZGFwdGVyKiBraXQoV2ViQ29yZTo6UGFnZSop
OwotICAgIFdlYkNvcmU6OlZpZXdwb3J0QXJndW1lbnRzIHZpZXdwb3J0QXJndW1lbnRzKCk7Cisg
ICAgV2ViQ29yZTo6Vmlld3BvcnRBcmd1bWVudHMgdmlld3BvcnRBcmd1bWVudHMoKSBjb25zdDsK
ICAgICB2b2lkIHJlZ2lzdGVyVW5kb1N0ZXAoV1RGOjpQYXNzUmVmUHRyPFdlYkNvcmU6OlVuZG9T
dGVwPik7CiAKICAgICB2b2lkIHNldE5ldHdvcmtBY2Nlc3NNYW5hZ2VyKFFOZXR3b3JrQWNjZXNz
TWFuYWdlciopOwogICAgIFFOZXR3b3JrQWNjZXNzTWFuYWdlciogbmV0d29ya0FjY2Vzc01hbmFn
ZXIoKTsKIAorICAgIGJvb2wgaGFzU2VsZWN0aW9uKCkgY29uc3Q7CisgICAgUVN0cmluZyBzZWxl
Y3RlZFRleHQoKSBjb25zdDsKKyAgICBRU3RyaW5nIHNlbGVjdGVkSHRtbCgpIGNvbnN0OworCisg
ICAgYm9vbCBpc0NvbnRlbnRFZGl0YWJsZSgpIGNvbnN0OworICAgIHZvaWQgc2V0Q29udGVudEVk
aXRhYmxlKGJvb2wpOworCisgICAgYm9vbCBmaW5kVGV4dChjb25zdCBRU3RyaW5nJiBzdWJTdHJp
bmcsIEZpbmRGbGFnIG9wdGlvbnMpOworCisgICAgY2xhc3MgVG91Y2hBZGp1c3RlciB7CisgICAg
cHVibGljOgorICAgICAgICBUb3VjaEFkanVzdGVyKHVuc2lnbmVkIHRvcFBhZGRpbmcsIHVuc2ln
bmVkIHJpZ2h0UGFkZGluZywgdW5zaWduZWQgYm90dG9tUGFkZGluZywgdW5zaWduZWQgbGVmdFBh
ZGRpbmcpOworCisgICAgICAgIFdlYkNvcmU6OkludFBvaW50IGZpbmRDYW5kaWRhdGVQb2ludEZv
clRvdWNoKGNvbnN0IFdlYkNvcmU6OkludFBvaW50JiwgV2ViQ29yZTo6RG9jdW1lbnQqKSBjb25z
dDsKKworICAgIHByaXZhdGU6CisgICAgICAgIHVuc2lnbmVkIG1fdG9wUGFkZGluZzsKKyAgICAg
ICAgdW5zaWduZWQgbV9yaWdodFBhZGRpbmc7CisgICAgICAgIHVuc2lnbmVkIG1fYm90dG9tUGFk
ZGluZzsKKyAgICAgICAgdW5zaWduZWQgbV9sZWZ0UGFkZGluZzsKKyAgICB9OworCisgICAgdm9p
ZCBhZGp1c3RQb2ludEZvckNsaWNraW5nKFFNb3VzZUV2ZW50Kik7CisKKyAgICB2b2lkIG1vdXNl
TW92ZUV2ZW50KFFNb3VzZUV2ZW50Kik7CisgICAgdm9pZCBtb3VzZVByZXNzRXZlbnQoUU1vdXNl
RXZlbnQqKTsKKyAgICB2b2lkIG1vdXNlRG91YmxlQ2xpY2tFdmVudChRTW91c2VFdmVudCopOwor
ICAgIHZvaWQgbW91c2VUcmlwbGVDbGlja0V2ZW50KFFNb3VzZUV2ZW50Kik7CisgICAgdm9pZCBt
b3VzZVJlbGVhc2VFdmVudChRTW91c2VFdmVudCopOworICAgIHZvaWQgaGFuZGxlU29mdHdhcmVJ
bnB1dFBhbmVsKFF0OjpNb3VzZUJ1dHRvbiwgY29uc3QgUVBvaW50Jik7CisjaWZuZGVmIFFUX05P
X1dIRUVMRVZFTlQKKyAgICB2b2lkIHdoZWVsRXZlbnQoUVdoZWVsRXZlbnQqLCBpbnQgd2hlZWxT
Y3JvbGxMaW5lcyk7CisjZW5kaWYKKyNpZm5kZWYgUVRfTk9fRFJBR0FORERST1AKKyAgICBRdDo6
RHJvcEFjdGlvbiBkcmFnRW50ZXJlZChjb25zdCBRTWltZURhdGEqLCBjb25zdCBRUG9pbnQmLCBR
dDo6RHJvcEFjdGlvbnMpOworICAgIHZvaWQgZHJhZ0xlYXZlRXZlbnQoKTsKKyAgICBRdDo6RHJv
cEFjdGlvbiBkcmFnVXBkYXRlZChjb25zdCBRTWltZURhdGEqLCBjb25zdCBRUG9pbnQmLCBRdDo6
RHJvcEFjdGlvbnMpOworICAgIGJvb2wgcGVyZm9ybURyYWcoY29uc3QgUU1pbWVEYXRhKiwgY29u
c3QgUVBvaW50JiwgUXQ6OkRyb3BBY3Rpb25zKTsKKyNlbmRpZgorICAgIHZvaWQgaW5wdXRNZXRo
b2RFdmVudChRSW5wdXRNZXRob2RFdmVudCopOworICAgIFFWYXJpYW50IGlucHV0TWV0aG9kUXVl
cnkoUXQ6OklucHV0TWV0aG9kUXVlcnkgcHJvcGVydHkpIGNvbnN0OworICAgIHZvaWQgZHluYW1p
Y1Byb3BlcnR5Q2hhbmdlRXZlbnQoUU9iamVjdCosIFFEeW5hbWljUHJvcGVydHlDaGFuZ2VFdmVu
dCopOworICAgIGJvb2wgaGFuZGxlS2V5RXZlbnQoUUtleUV2ZW50Kik7CisgICAgYm9vbCBoYW5k
bGVTY3JvbGxpbmcoUUtleUV2ZW50Kik7CisgICAgdm9pZCBmb2N1c0luRXZlbnQoUUZvY3VzRXZl
bnQqKTsKKyAgICB2b2lkIGZvY3VzT3V0RXZlbnQoUUZvY3VzRXZlbnQqKTsKKyAgICBib29sIGhh
bmRsZVNob3J0Y3V0T3ZlcnJpZGVFdmVudChRS2V5RXZlbnQqKTsKKyAgICAvLyBSZXR1cm5zIHdo
ZXRoZXIgdGhlIGRlZmF1bHQgYWN0aW9uIHdhcyBjYW5jZWxsZWQgaW4gdGhlIEpTIGV2ZW50IGhh
bmRsZXIKKyAgICBib29sIHRvdWNoRXZlbnQoUVRvdWNoRXZlbnQqKTsKKyAgICBib29sIHN3YWxs
b3dDb250ZXh0TWVudUV2ZW50KFFDb250ZXh0TWVudUV2ZW50ICosIFFXZWJGcmFtZUFkYXB0ZXIq
KTsKKworICAgIFFXZWJIaXRUZXN0UmVzdWx0UHJpdmF0ZSogdXBkYXRlUG9zaXRpb25EZXBlbmRl
bnRNZW51QWN0aW9ucyhjb25zdCBRUG9pbnQmLCBRQml0QXJyYXkqKTsKKyAgICB2b2lkIHVwZGF0
ZUFjdGlvbkludGVybmFsKE1lbnVBY3Rpb24sIGNvbnN0IGNoYXIqIGNvbW1hbmROYW1lLCBib29s
KiBlbmFibGVkLCBib29sKiBjaGVja2VkKTsKKyAgICB2b2lkIHRyaWdnZXJBY3Rpb24oTWVudUFj
dGlvbiwgUVdlYkhpdFRlc3RSZXN1bHRQcml2YXRlKiwgY29uc3QgY2hhciogY29tbWFuZE5hbWUs
IGJvb2wgZW5kVG9FbmRSZWxvYWQpOworICAgIFFTdHJpbmcgY29udGV4dE1lbnVJdGVtVGFnRm9y
QWN0aW9uKE1lbnVBY3Rpb24sIGJvb2wqIGNoZWNrYWJsZSkgY29uc3Q7CisKKyAgICBRU3RyaW5n
TGlzdCBzdXBwb3J0ZWRDb250ZW50VHlwZXMoKSBjb25zdDsKKyNpZiBFTkFCTEUoR0VPTE9DQVRJ
T04pCisgICAgdm9pZCBzZXRHZW9sb2NhdGlvbkVuYWJsZWRGb3JGcmFtZShRV2ViRnJhbWVBZGFw
dGVyKiwgYm9vbCk7CisjZW5kaWYKKyNpZiBFTkFCTEUoTk9USUZJQ0FUSU9OUykgfHwgRU5BQkxF
KExFR0FDWV9OT1RJRklDQVRJT05TKQorICAgIHZvaWQgYWxsb3dOb3RpZmljYXRpb25zRm9yRnJh
bWUoUVdlYkZyYW1lQWRhcHRlciopOworICAgIHZvaWQgYWRkTm90aWZpY2F0aW9uUHJlc2VudGVy
Q2xpZW50KCk7CisjaWZuZGVmIFFUX05PX1NZU1RFTVRSQVlJQ09OCisgICAgYm9vbCBoYXNTeXN0
ZW1UcmF5SWNvbigpIGNvbnN0OworICAgIHZvaWQgc2V0U3lzdGVtVHJheUljb24oUU9iamVjdCop
OworI2VuZGlmIC8vIFFUX05PX1NZU1RFTVRSQVlJQ09OCisjZW5kaWYgLy8gRU5BQkxFKE5PVElG
SUNBVElPTlMpIHx8IEVOQUJMRShMRUdBQ1lfTk9USUZJQ0FUSU9OUykKKworICAgIC8vIENhbGxl
ZCBmcm9tIFFXZWJQYWdlIGFzIHByaXZhdGUgc2xvdHMuCisgICAgdm9pZCBfcV9jbGVhbnVwTGVh
a01lc3NhZ2VzKCk7CisgICAgdm9pZCBfcV9vbkxvYWRQcm9ncmVzc0NoYW5nZWQoaW50KTsKKwor
ICAgIGJvb2wgc3VwcG9ydHNDb250ZW50VHlwZShjb25zdCBRU3RyaW5nJiBtaW1lVHlwZSkgY29u
c3Q7CisKKyAgICB2b2lkIGRpZFNob3dJbnNwZWN0b3IoKTsKKyAgICB2b2lkIGRpZENsb3NlSW5z
cGVjdG9yKCk7CisKKyAgICBzdGF0aWMgUVN0cmluZyBkZWZhdWx0VXNlckFnZW50U3RyaW5nKCk7
CisgICAgc3RhdGljIGJvb2wgdHJlYXRTY2hlbWVBc0xvY2FsKGNvbnN0IFFTdHJpbmcmKTsKKwor
ICAgIFFPYmplY3QqIGN1cnJlbnRGcmFtZSgpIGNvbnN0OworICAgIGJvb2wgaGFzRm9jdXNlZE5v
ZGUoKSBjb25zdDsKKyAgICBzdHJ1Y3QgVmlld3BvcnRBdHRyaWJ1dGVzIHsKKyAgICAgICAgcXJl
YWwgaW5pdGlhbFNjYWxlRmFjdG9yOworICAgICAgICBxcmVhbCBtaW5pbXVtU2NhbGVGYWN0b3I7
CisgICAgICAgIHFyZWFsIG1heGltdW1TY2FsZUZhY3RvcjsKKyAgICAgICAgcXJlYWwgZGV2aWNl
UGl4ZWxSYXRpbzsKKyAgICAgICAgYm9vbCBpc1VzZXJTY2FsYWJsZTsKKyAgICAgICAgUVNpemVG
IHNpemU7CisgICAgfTsKKworICAgIFZpZXdwb3J0QXR0cmlidXRlcyB2aWV3cG9ydEF0dHJpYnV0
ZXNGb3JTaXplKGNvbnN0IFFTaXplJiBhdmFpbGFibGVTaXplLCBjb25zdCBRU2l6ZSYgZGV2aWNl
U2l6ZSkgY29uc3Q7CisKICAgICBRV2ViU2V0dGluZ3MgKnNldHRpbmdzOwogCiAgICAgV2ViQ29y
ZTo6UGFnZSAqcGFnZTsKQEAgLTE1OCw2ICszNTAsMTMgQEAgcHVibGljOgogCiAgICAgYm9vbCBm
b3J3YXJkVW5zdXBwb3J0ZWRDb250ZW50OwogICAgIGJvb2wgaW5zaWRlT3BlbkNhbGw7CisgICAg
UVBvaW50IHRyaXBsZUNsaWNrOworICAgIFFCYXNpY1RpbWVyIHRyaXBsZUNsaWNrVGltZXI7CisK
KyAgICBib29sIGNsaWNrQ2F1c2VkRm9jdXM7CisgICAgcXVpbnQ2NCBtX3RvdGFsQnl0ZXM7Cisg
ICAgcXVpbnQ2NCBtX2J5dGVzUmVjZWl2ZWQ7CisgICAgUVdlYkhpc3RvcnkgaGlzdG9yeTsKIAog
cHJpdmF0ZToKICAgICBRTmV0d29ya0FjY2Vzc01hbmFnZXIgKm5ldHdvcmtNYW5hZ2VyOwpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9RV2ViVW5kb0NvbW1hbmQu
Y3BwIGIvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9RV2ViVW5kb0NvbW1hbmQuY3Bw
CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTk2ZGY1MGQ3NDVkMDQ2OTI5ODliMDg0
ZGQ3OGU0ZmFiYzZkZDNmLi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
Ci0tLSBhL1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvUVdlYlVuZG9Db21tYW5kLmNw
cAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIw
MTIgRGlnaWEgUGxjIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKS4KLSAqCi0gKiBUaGlzIGxp
YnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0g
KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1
YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh
dGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9w
dGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1
dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBB
TlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVS
Q0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRo
ZSBHTlUKLSAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxz
LgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBz
ZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCi0gKiB0aGUgRnJlZSBT
b2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29y
LAotICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCi0gKgotICovCi0jaW5jbHVkZSAiY29u
ZmlnLmgiCi0jaW5jbHVkZSAiUVdlYlVuZG9Db21tYW5kLmgiCi0KLSNpbmNsdWRlICJVbmRvU3Rl
cFF0LmgiCi0KLSNpZm5kZWYgUVRfTk9fVU5ET0NPTU1BTkQKLVFXZWJVbmRvQ29tbWFuZDo6UVdl
YlVuZG9Db21tYW5kKFFTaGFyZWRQb2ludGVyPFVuZG9TdGVwUXQ+IHVuZG9TdGVwLCBRVW5kb0Nv
bW1hbmQqIHBhcmVudCkKLSAgICA6IFFVbmRvQ29tbWFuZChwYXJlbnQpCi0gICAgLCBtX3N0ZXAo
dW5kb1N0ZXApCi17Ci0gICAgUV9BU1NFUlQodW5kb1N0ZXApOwotICAgIHNldFRleHQobV9zdGVw
LT50ZXh0KCkpOwotfQotCi12b2lkIFFXZWJVbmRvQ29tbWFuZDo6dW5kbygpCi17Ci0gICAgbV9z
dGVwLT51bmRvKCk7Ci19Ci0KLXZvaWQgUVdlYlVuZG9Db21tYW5kOjpyZWRvKCkKLXsKLSAgICBt
X3N0ZXAtPnJlZG8oKTsKLX0KLQotI2VuZGlmIC8vIFFUX05PX1VORE9DT01NQU5ECmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L1FXZWJVbmRvQ29tbWFuZC5oIGIv
U291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9RV2ViVW5kb0NvbW1hbmQuaApkZWxldGVk
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU2MTIxYWRjMjkxMTBiZjAzNDkxN2YyZjBkY2FhY2Q0
Y2U2NGZkMy4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9T
b3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L1FXZWJVbmRvQ29tbWFuZC5oCisrKyAvZGV2
L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBEaWdpYSBQ
bGMgYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBm
cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBp
dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gKiBM
aWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRo
ZXIKLSAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkg
bGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhl
IGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5U
WTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJ
VFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICog
TGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICog
WW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmls
ZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZv
dW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCi0gKiBCb3N0
b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KLSAqCi0gKi8KLSNpZm5kZWYgUVdlYlVuZG9Db21tYW5k
X2gKLSNkZWZpbmUgUVdlYlVuZG9Db21tYW5kX2gKLQotI2luY2x1ZGUgPHFzaGFyZWRwb2ludGVy
Lmg+Ci0jaW5jbHVkZSA8cXVuZG9zdGFjay5oPgotCi1jbGFzcyBVbmRvU3RlcFF0OwotCi0jaWZu
ZGVmIFFUX05PX1VORE9DT01NQU5ECi0KLWNsYXNzIFFXZWJVbmRvQ29tbWFuZCA6IHB1YmxpYyBR
VW5kb0NvbW1hbmQgewotcHVibGljOgotICAgIFFXZWJVbmRvQ29tbWFuZChRU2hhcmVkUG9pbnRl
cjxVbmRvU3RlcFF0PiwgUVVuZG9Db21tYW5kICpwYXJlbnQgPSAwKTsKLQotICAgIHZvaWQgdW5k
bygpOwotICAgIHZvaWQgcmVkbygpOwotCi1wcml2YXRlOgotICAgIFFTaGFyZWRQb2ludGVyPFVu
ZG9TdGVwUXQ+IG1fc3RlcDsKLX07Ci0KLSNlbmRpZiAvLyBRVF9OT19VTkRPQ09NTUFORAotCi0j
ZW5kaWYgLy8gUVdlYlVuZG9Db21tYW5kX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvcXQv
V2ViQ29yZVN1cHBvcnQvUVdpZGdldFBsdWdpbkltcGwuY3BwIGIvU291cmNlL1dlYktpdC9xdC9X
ZWJDb3JlU3VwcG9ydC9RV2lkZ2V0UGx1Z2luSW1wbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDJiZWFiZjFkMDg1ODZjZDU1MzQzOGI3MjA4ZmE4YTMxNWZiZTE5YjMuLjAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNlL1dlYktpdC9x
dC9XZWJDb3JlU3VwcG9ydC9RV2lkZ2V0UGx1Z2luSW1wbC5jcHAKKysrIC9kZXYvbnVsbApAQCAt
MSw3MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIERpZ2lhIFBsYyBhbmQvb3Ig
aXRzIHN1YnNpZGlhcnkoLWllcykuCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdh
cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRo
ZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMg
cHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVy
c2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJz
aW9uLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0
IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0
IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxk
IGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBM
aWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcu
TElCLiAgSWYgbm90LCB3cml0ZSB0bwotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwg
SW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKLSAqIEJvc3RvbiwgTUEgMDIx
MTAtMTMwMSwgVVNBLgotICoKLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAi
UVdpZGdldFBsdWdpbkltcGwuaCIKLQotI2luY2x1ZGUgPFFXaWRnZXQ+Ci0KLVFXaWRnZXRQbHVn
aW5JbXBsOjp+UVdpZGdldFBsdWdpbkltcGwoKQotewotICAgIG1fd2lkZ2V0LT5kZWxldGVMYXRl
cigpOwotfQotCi12b2lkIFFXaWRnZXRQbHVnaW5JbXBsOjp1cGRhdGUoY29uc3QgUVJlY3QgJnJl
Y3QpCi17Ci0gICAgbV93aWRnZXQtPnVwZGF0ZShyZWN0KTsKLX0KLQotdm9pZCBRV2lkZ2V0UGx1
Z2luSW1wbDo6c2V0R2VvbWV0cnlBbmRDbGlwKGNvbnN0IFFSZWN0ICZnZW9tZXRyeSwgY29uc3Qg
UVJlY3QgJmNsaXBSZWN0LCBib29sIGlzVmlzaWJsZSkKLXsKLSAgICBtX3dpZGdldC0+c2V0R2Vv
bWV0cnkoZ2VvbWV0cnkpOwotICAgIGlmICghY2xpcFJlY3QuaXNOdWxsKCkpIHsKLSAgICAgICAg
UVJlY3QgY2xpcChjbGlwUmVjdC5pbnRlcnNlY3RlZChtX3dpZGdldC0+cmVjdCgpKSk7Ci0gICAg
ICAgIG1fd2lkZ2V0LT5zZXRNYXNrKFFSZWdpb24oY2xpcCkpOwotICAgIH0KLSAgICBtX3dpZGdl
dC0+dXBkYXRlKCk7Ci0gICAgc2V0VmlzaWJsZShpc1Zpc2libGUpOwotfQotCi12b2lkIFFXaWRn
ZXRQbHVnaW5JbXBsOjpzZXRWaXNpYmxlKGJvb2wgdmlzaWJsZSkKLXsKLSAgICAvLyBJZiBzZXRN
YXNrIGlzIHNldCB3aXRoIGFuIGVtcHR5IFFSZWdpb24sIG5vIGNsaXBwaW5nIHdpbGwKLSAgICAv
LyBiZSBwZXJmb3JtZWQsIHNvIGluIHRoYXQgY2FzZSB3ZSBoaWRlIHRoZSBwbGF0Zm9ybVdpZGdl
dC4KLSAgICBRUmVnaW9uIG1hc2sgPSBtX3dpZGdldC0+bWFzaygpOwotICAgIG1fd2lkZ2V0LT5z
ZXRWaXNpYmxlKHZpc2libGUgJiYgIW1hc2suaXNFbXB0eSgpKTsKLX0KLQotdm9pZCBRV2lkZ2V0
UGx1Z2luSW1wbDo6c2V0U3R5bGVTaGVldChjb25zdCBRU3RyaW5nICZzdHlsZXNoZWV0KQotewot
ICAgIG1fd2lkZ2V0LT5zZXRTdHlsZVNoZWV0KHN0eWxlc2hlZXQpOwotfQotCi12b2lkIFFXaWRn
ZXRQbHVnaW5JbXBsOjpzZXRXaWRnZXRQYXJlbnQoUU9iamVjdCAqcGFyZW50KQotewotICAgIGlm
ICghcGFyZW50LT5pc1dpZGdldFR5cGUoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIG1fd2lkZ2V0
LT5zZXRQYXJlbnQocW9iamVjdF9jYXN0PFFXaWRnZXQqPihwYXJlbnQpKTsKLX0KLQotUU9iamVj
dCogUVdpZGdldFBsdWdpbkltcGw6OmhhbmRsZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fd2lk
Z2V0OwotfQotCi0jaW5jbHVkZSAibW9jX1FXaWRnZXRQbHVnaW5JbXBsLmNwcCIKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvUVdpZGdldFBsdWdpbkltcGwuaCBi
L1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvUVdpZGdldFBsdWdpbkltcGwuaApkZWxl
dGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ1OWI3ZWZmNTg3MDEzZjNhZjI0OGY3YzJjOTEy
ODZjZjc0OTllZS4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0g
YS9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L1FXaWRnZXRQbHVnaW5JbXBsLmgKKysr
IC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIERp
Z2lhIFBsYyBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykuCi0gKgotICogVGhpcyBsaWJyYXJ5
IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9k
aWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMK
LSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247
IGVpdGhlcgotICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24p
IGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBp
biB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdB
UlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5U
QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05V
Ci0gKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAq
Ci0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRo
ZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwotICogdGhlIEZyZWUgU29mdHdh
cmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKLSAq
IEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgotICoKLSAqLwotI2lmbmRlZiBRV2lkZ2V0UGx1
Z2luSW1wbF9oCi0jZGVmaW5lIFFXaWRnZXRQbHVnaW5JbXBsX2gKLQotI2luY2x1ZGUgIlF0UGx1
Z2luV2lkZ2V0QWRhcHRlci5oIgotCi1RVF9CRUdJTl9OQU1FU1BBQ0UKLWNsYXNzIFFXaWRnZXQ7
Ci1RVF9FTkRfTkFNRVNQQUNFCi0KLWNsYXNzIFFXaWRnZXRQbHVnaW5JbXBsIDogcHVibGljIFF0
UGx1Z2luV2lkZ2V0QWRhcHRlciB7Ci0gICAgUV9PQkpFQ1QKLXB1YmxpYzoKLSAgICBRV2lkZ2V0
UGx1Z2luSW1wbChRV2lkZ2V0ICp3KSA6IG1fd2lkZ2V0KHcpIHsgfQotICAgIHZpcnR1YWwgflFX
aWRnZXRQbHVnaW5JbXBsKCk7Ci0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZShjb25zdCBRUmVjdCAm
KSBPVkVSUklERTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0R2VvbWV0cnlBbmRDbGlwKGNvbnN0IFFS
ZWN0JiwgY29uc3QgUVJlY3QmLCBib29sIGlzVmlzaWJsZSkgT1ZFUlJJREU7Ci0gICAgdmlydHVh
bCB2b2lkIHNldFZpc2libGUoYm9vbCkgT1ZFUlJJREU7Ci0gICAgdmlydHVhbCB2b2lkIHNldFN0
eWxlU2hlZXQoY29uc3QgUVN0cmluZyYpIE9WRVJSSURFOwotICAgIHZpcnR1YWwgdm9pZCBzZXRX
aWRnZXRQYXJlbnQoUU9iamVjdCAqKSBPVkVSUklERTsKLSAgICB2aXJ0dWFsIFFPYmplY3QqIGhh
bmRsZSgpIGNvbnN0IE9WRVJSSURFOwotcHJpdmF0ZToKLSAgICBRV2lkZ2V0ICptX3dpZGdldDsK
LX07Ci0KLSNlbmRpZiAvLyBRV2lkZ2V0UGx1Z2luSW1wbF9oCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L1F0RmFsbGJhY2tXZWJQb3B1cC5jcHAgYi9Tb3VyY2Uv
V2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L1F0RmFsbGJhY2tXZWJQb3B1cC5jcHAKZGVsZXRlZCBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZmJmNjI0YWE5NWJhZGQwNDgwYWY1MzdiNWE0ZmRhMmQ5
MjcwZTEuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291
cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9RdEZhbGxiYWNrV2ViUG9wdXAuY3BwCisrKyAv
ZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgR2ly
aXNoIFJhbWFrcmlzaG5hbiA8Z2lyaXNoQGZvcndhcmRiaWFzLmluPgotICogQ29weXJpZ2h0IChD
KSAyMDA5IE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQotICoK
LSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp
dCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0
d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3Ig
KGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIGxpYnJhcnkg
aXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1
dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5
IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP
U0UuICBTZWUgdGhlIEdOVQotICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBt
b3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0
aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlz
IGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KLSAq
IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwg
RmlmdGggRmxvb3IsCi0gKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KLSAqCi0gKi8KLSNp
bmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJRdEZhbGxiYWNrV2ViUG9wdXAuaCIKLQotI2lm
bmRlZiBRVF9OT19DT01CT0JPWAotCi0jaW5jbHVkZSAiUVdlYlBhZ2VBZGFwdGVyLmgiCi0jaW5j
bHVkZSAiUVdlYlBhZ2VDbGllbnQuaCIKLSNpbmNsdWRlICJRdFdlYkNvbWJvQm94LmgiCi0jaW5j
bHVkZSAicWdyYXBoaWNzd2Vidmlldy5oIgotI2luY2x1ZGUgPFFHcmFwaGljc1Byb3h5V2lkZ2V0
PgotI2luY2x1ZGUgPFF0R3VpL1FTdGFuZGFyZEl0ZW1Nb2RlbD4KLQotbmFtZXNwYWNlIFdlYkNv
cmUgewotCi1RdEZhbGxiYWNrV2ViUG9wdXA6OlF0RmFsbGJhY2tXZWJQb3B1cChjb25zdCBRV2Vi
UGFnZUFkYXB0ZXIqIHBhZ2UpCi0gICAgOiBtX2NvbWJvKDApCi0gICAgLCBtX3BhZ2UocGFnZSkK
LXsKLX0KLQotUXRGYWxsYmFja1dlYlBvcHVwOjp+UXRGYWxsYmFja1dlYlBvcHVwKCkKLXsKLSAg
ICBkZWxldGVDb21ib0JveCgpOwotfQotCi12b2lkIFF0RmFsbGJhY2tXZWJQb3B1cDo6c2hvdyhj
b25zdCBRV2ViU2VsZWN0RGF0YSYgZGF0YSkKLXsKLSAgICBpZiAoIXBhZ2VDbGllbnQoKSkKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgZGVsZXRlQ29tYm9Cb3goKTsKLQotICAgIG1fY29tYm8gPSBu
ZXcgUXRXZWJDb21ib0JveCgpOwotICAgIGNvbm5lY3QobV9jb21ibywgU0lHTkFMKGFjdGl2YXRl
ZChpbnQpKSwgU0xPVChhY3RpdmVDaGFuZ2VkKGludCkpLCBRdDo6UXVldWVkQ29ubmVjdGlvbik7
Ci0gICAgY29ubmVjdChtX2NvbWJvLCBTSUdOQUwoZGlkSGlkZSgpKSwgU0xPVChkZWxldGVDb21i
b0JveCgpKSk7Ci0gICAgY29ubmVjdChtX2NvbWJvLCBTSUdOQUwoZGlkSGlkZSgpKSwgU0lHTkFM
KGRpZEhpZGUoKSkpOwotCi0gICAgcG9wdWxhdGUoZGF0YSk7Ci0KLSAgICBRUmVjdCByZWN0ID0g
Z2VvbWV0cnkoKTsKLSAgICBpZiAoUUdyYXBoaWNzV2ViVmlldyAqd2ViVmlldyA9IHFvYmplY3Rf
Y2FzdDxRR3JhcGhpY3NXZWJWaWV3Kj4ocGFnZUNsaWVudCgpLT5wbHVnaW5QYXJlbnQoKSkpIHsK
LSAgICAgICAgUUdyYXBoaWNzUHJveHlXaWRnZXQqIHByb3h5ID0gbmV3IFFHcmFwaGljc1Byb3h5
V2lkZ2V0KHdlYlZpZXcpOwotICAgICAgICBwcm94eS0+c2V0V2lkZ2V0KG1fY29tYm8pOwotICAg
ICAgICBwcm94eS0+c2V0R2VvbWV0cnkocmVjdCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbV9j
b21iby0+c2V0UGFyZW50KHFvYmplY3RfY2FzdDxRV2lkZ2V0Kj4ocGFnZUNsaWVudCgpLT5vd25l
cldpZGdldCgpKSk7Ci0gICAgICAgIG1fY29tYm8tPnNldEdlb21ldHJ5KFFSZWN0KHJlY3QubGVm
dCgpLCByZWN0LnRvcCgpLCByZWN0LndpZHRoKCksIG1fY29tYm8tPnNpemVIaW50KCkuaGVpZ2h0
KCkpKTsKLSAgICB9Ci0KLSAgICBtX2NvbWJvLT5zaG93UG9wdXBBdEN1cnNvclBvc2l0aW9uKCk7
Ci19Ci0KLXZvaWQgUXRGYWxsYmFja1dlYlBvcHVwOjpoaWRlKCkKLXsKLSAgICAvLyBEZXN0cm95
aW5nIHRoZSBRQ29tYm9Cb3ggaGVyZSBjYXVzZSBwcm9ibGVtcyBpZiB0aGUgcG9wdXAgaXMgaW4g
dGhlCi0gICAgLy8gbWlkZGxlIG9mIGl0cyBzaG93IGFuaW1hdGlvbi4gSW5zdGVhZCB3ZSByZWx5
IG9uIHRoZSBmYWN0IHRoYXQgdGhlCi0gICAgLy8gUXQ6OlBvcHVwIHdpbmRvdyB3aWxsIGhpZGUg
aXRzZWxmIG9uIG1vdXNlIGV2ZW50cyBvdXRzaWRlIGl0cyB3aW5kb3cuCi19Ci0KLXZvaWQgUXRG
YWxsYmFja1dlYlBvcHVwOjpwb3B1bGF0ZShjb25zdCBRV2ViU2VsZWN0RGF0YSYgZGF0YSkKLXsK
LSAgICBRU3RhbmRhcmRJdGVtTW9kZWwqIG1vZGVsID0gcW9iamVjdF9jYXN0PFFTdGFuZGFyZEl0
ZW1Nb2RlbCo+KG1fY29tYm8tPm1vZGVsKCkpOwotICAgIFFfQVNTRVJUKG1vZGVsKTsKLQotICAg
IG1fY29tYm8tPnNldEZvbnQoZm9udCgpKTsKLQotICAgIGludCBjdXJyZW50SW5kZXggPSAtMTsK
LSAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGEuaXRlbUNvdW50KCk7ICsraSkgewotICAgICAg
ICBzd2l0Y2ggKGRhdGEuaXRlbVR5cGUoaSkpIHsKLSAgICAgICAgY2FzZSBRV2ViU2VsZWN0RGF0
YTo6U2VwYXJhdG9yOgotICAgICAgICAgICAgbV9jb21iby0+aW5zZXJ0U2VwYXJhdG9yKGkpOwot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUVdlYlNlbGVjdERhdGE6Okdyb3VwOgot
ICAgICAgICAgICAgbV9jb21iby0+aW5zZXJ0SXRlbShpLCBkYXRhLml0ZW1UZXh0KGkpKTsKLSAg
ICAgICAgICAgIG1vZGVsLT5pdGVtKGkpLT5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICBjYXNlIFFXZWJTZWxlY3REYXRhOjpPcHRpb246Ci0gICAgICAgICAg
ICBtX2NvbWJvLT5pbnNlcnRJdGVtKGksIGRhdGEuaXRlbVRleHQoaSkpOwotICAgICAgICAgICAg
bW9kZWwtPml0ZW0oaSktPnNldEVuYWJsZWQoZGF0YS5pdGVtSXNFbmFibGVkKGkpKTsKLSNpZm5k
ZWYgUVRfTk9fVE9PTFRJUAotICAgICAgICAgICAgbW9kZWwtPml0ZW0oaSktPnNldFRvb2xUaXAo
ZGF0YS5pdGVtVG9vbFRpcChpKSk7Ci0jZW5kaWYKLSAgICAgICAgICAgIG1vZGVsLT5pdGVtKGkp
LT5zZXRCYWNrZ3JvdW5kKGRhdGEuaXRlbUJhY2tncm91bmRDb2xvcihpKSk7Ci0gICAgICAgICAg
ICBtb2RlbC0+aXRlbShpKS0+c2V0Rm9yZWdyb3VuZChkYXRhLml0ZW1Gb3JlZ3JvdW5kQ29sb3Io
aSkpOwotICAgICAgICAgICAgaWYgKGRhdGEuaXRlbUlzU2VsZWN0ZWQoaSkpCi0gICAgICAgICAg
ICAgICAgY3VycmVudEluZGV4ID0gaTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0g
ICAgfQotCi0gICAgaWYgKGN1cnJlbnRJbmRleCA+PSAwKQotICAgICAgICBtX2NvbWJvLT5zZXRD
dXJyZW50SW5kZXgoY3VycmVudEluZGV4KTsKLX0KLQotdm9pZCBRdEZhbGxiYWNrV2ViUG9wdXA6
OmFjdGl2ZUNoYW5nZWQoaW50IGluZGV4KQotewotICAgIGlmIChpbmRleCA8IDApCi0gICAgICAg
IHJldHVybjsKLQotICAgIGVtaXQgc2VsZWN0SXRlbShpbmRleCwgZmFsc2UsIGZhbHNlKTsKLX0K
LQotdm9pZCBRdEZhbGxiYWNrV2ViUG9wdXA6OmRlbGV0ZUNvbWJvQm94KCkKLXsKLSAgICBpZiAo
IW1fY29tYm8pCi0gICAgICAgIHJldHVybjsKLSAgICBtX2NvbWJvLT5kZWxldGVMYXRlcigpOwot
ICAgIG1fY29tYm8gPSAwOwotfQotCi1RV2ViUGFnZUNsaWVudCogUXRGYWxsYmFja1dlYlBvcHVw
OjpwYWdlQ2xpZW50KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9wYWdlLT5jbGllbnQuZGF0YSgp
OwotfQotCi19Ci0KLSNlbmRpZiAvLyBRVF9OT19DT01CT0JPWApkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9RdEZhbGxiYWNrV2ViUG9wdXAuaCBiL1NvdXJjZS9X
ZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvUXRGYWxsYmFja1dlYlBvcHVwLmgKZGVsZXRlZCBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDY5YjQ5YmRiZjg4NTE4NmFmNTQ1ZjZlZGJhMzkwYzY1NzU1NWYw
NWQuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKLS0tIGEvU291cmNl
L1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9RdEZhbGxiYWNrV2ViUG9wdXAuaAorKysgL2Rldi9u
dWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgTm9raWEgQ29y
cG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCi0gKgotICogVGhpcyBsaWJyYXJ5
IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9k
aWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMK
LSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247
IGVpdGhlcgotICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24p
IGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBp
biB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdB
UlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5U
QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05V
Ci0gKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAq
Ci0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRo
ZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwotICogdGhlIEZyZWUgU29mdHdh
cmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKLSAq
IEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgotICoKLSAqLwotI2lmbmRlZiBRdEZhbGxiYWNr
V2ViUG9wdXBfaAotI2RlZmluZSBRdEZhbGxiYWNrV2ViUG9wdXBfaAotCi0jaW5jbHVkZSAicXdl
YmtpdHBsYXRmb3JtcGx1Z2luLmgiCi0jaW5jbHVkZSA8d3RmL1BsYXRmb3JtLmg+Ci0KLSNpZm5k
ZWYgUVRfTk9fQ09NQk9CT1gKLQotUVRfQkVHSU5fTkFNRVNQQUNFCi1jbGFzcyBRR3JhcGhpY3NQ
cm94eVdpZGdldDsKLVFUX0VORF9OQU1FU1BBQ0UKLQotY2xhc3MgUVdlYlBhZ2VDbGllbnQ7Ci1j
bGFzcyBRV2ViUGFnZUFkYXB0ZXI7Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotY2xhc3MgUXRX
ZWJDb21ib0JveDsKLQotY2xhc3MgUXRGYWxsYmFja1dlYlBvcHVwIDogcHVibGljIFFXZWJTZWxl
Y3RNZXRob2QgewotICAgIFFfT0JKRUNUCi1wdWJsaWM6Ci0gICAgUXRGYWxsYmFja1dlYlBvcHVw
KGNvbnN0IFFXZWJQYWdlQWRhcHRlciopOwotICAgIH5RdEZhbGxiYWNrV2ViUG9wdXAoKTsKLQot
ICAgIHZpcnR1YWwgdm9pZCBzaG93KGNvbnN0IFFXZWJTZWxlY3REYXRhJik7Ci0gICAgdmlydHVh
bCB2b2lkIGhpZGUoKTsKLQotICAgIHZvaWQgc2V0R2VvbWV0cnkoY29uc3QgUVJlY3QmIHJlY3Qp
IHsgbV9nZW9tZXRyeSA9IHJlY3Q7IH0KLSAgICBRUmVjdCBnZW9tZXRyeSgpIGNvbnN0IHsgcmV0
dXJuIG1fZ2VvbWV0cnk7IH0KLQotICAgIHZvaWQgc2V0Rm9udChjb25zdCBRRm9udCYgZm9udCkg
eyBtX2ZvbnQgPSBmb250OyB9Ci0gICAgUUZvbnQgZm9udCgpIGNvbnN0IHsgcmV0dXJuIG1fZm9u
dDsgfQotCi1wcml2YXRlIFFfU0xPVFM6Ci0gICAgdm9pZCBhY3RpdmVDaGFuZ2VkKGludCk7Ci0g
ICAgdm9pZCBkZWxldGVDb21ib0JveCgpOwotCi1wcml2YXRlOgotICAgIFF0V2ViQ29tYm9Cb3gq
IG1fY29tYm87Ci0gICAgY29uc3QgUVdlYlBhZ2VBZGFwdGVyKiBtX3BhZ2U7Ci0gICAgUVJlY3Qg
bV9nZW9tZXRyeTsKLSAgICBRRm9udCBtX2ZvbnQ7Ci0KLSAgICBRV2ViUGFnZUNsaWVudCogcGFn
ZUNsaWVudCgpIGNvbnN0OwotCi0gICAgdm9pZCBwb3B1bGF0ZShjb25zdCBRV2ViU2VsZWN0RGF0
YSYpOwotfTsKLQotfQotCi0jZW5kaWYgLy8gUVRfTk9fQ09NQk9CT1gKLQotI2VuZGlmIC8vIFF0
RmFsbGJhY2tXZWJQb3B1cF9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVT
dXBwb3J0L1F0UGx1Z2luV2lkZ2V0QWRhcHRlci5jcHAgYi9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNv
cmVTdXBwb3J0L1F0UGx1Z2luV2lkZ2V0QWRhcHRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZWY1NGE1YWI4
YzI0MmI4ZDE3N2QyMTY2MDczNzYxZWNlMzJkNDRlZQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJj
ZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvUXRQbHVnaW5XaWRnZXRBZGFwdGVyLmNwcApAQCAt
MCwwICsxLDI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIERpZ2lhIFBsYyBhbmQvb3Ig
aXRzIHN1YnNpZGlhcnkoLWllcykuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdh
cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRo
ZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMg
cHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVy
c2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJz
aW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0
IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0
IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxk
IGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBM
aWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcu
TElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwg
SW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIx
MTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAi
UXRQbHVnaW5XaWRnZXRBZGFwdGVyLmgiCisKK1F0UGx1Z2luV2lkZ2V0QWRhcHRlcjo6UXRQbHVn
aW5XaWRnZXRBZGFwdGVyKCkKK3sKK30KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvcXQvV2Vi
Q29yZVN1cHBvcnQvUXRQbHVnaW5XaWRnZXRBZGFwdGVyLmggYi9Tb3VyY2UvV2ViS2l0L3F0L1dl
YkNvcmVTdXBwb3J0L1F0UGx1Z2luV2lkZ2V0QWRhcHRlci5oCmluZGV4IDg0OTRkM2RiMmE5ODU1
Zjc0YmE4YTk3ZmM1YmNkMzNhNTNlOTI0YzYuLjMyNGRlNzg2NjM3NTZjMjgzM2NhNzk5ZmM2ODEz
YmJiNDg0ZjY3NDQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQv
UXRQbHVnaW5XaWRnZXRBZGFwdGVyLmgKKysrIGIvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3Vw
cG9ydC9RdFBsdWdpbldpZGdldEFkYXB0ZXIuaApAQCAtMjAsMTMgKzIwLDE2IEBACiAjaWZuZGVm
IFF0UGx1Z2luV2lkZ2V0QWRhcHRlcl9oCiAjZGVmaW5lIFF0UGx1Z2luV2lkZ2V0QWRhcHRlcl9o
CiAKKyNpbmNsdWRlIDxQbGF0Zm9ybUV4cG9ydE1hY3Jvcy5oPgogI2luY2x1ZGUgPFFPYmplY3Q+
CiAjaW5jbHVkZSA8UVJlY3Q+CiAjaW5jbHVkZSA8UVN0cmluZz4KKyNpbmNsdWRlIDxxd2Via2l0
Z2xvYmFsLmg+CiAKLWNsYXNzIFF0UGx1Z2luV2lkZ2V0QWRhcHRlciA6IHB1YmxpYyBRT2JqZWN0
IHsKK2NsYXNzIFdFQktJVF9FWFBPUlREQVRBIFF0UGx1Z2luV2lkZ2V0QWRhcHRlciA6IHB1Ymxp
YyBRT2JqZWN0IHsKICAgICBRX09CSkVDVAogcHVibGljOgorICAgIFF0UGx1Z2luV2lkZ2V0QWRh
cHRlcigpOwogICAgIHZpcnR1YWwgdm9pZCB1cGRhdGUoY29uc3QgUVJlY3QmKSA9IDA7CiAgICAg
dmlydHVhbCB2b2lkIHNldEdlb21ldHJ5QW5kQ2xpcChjb25zdCBRUmVjdCYsIGNvbnN0IFFSZWN0
JiwgYm9vbCBpc1Zpc2libGUgPSBmYWxzZSkgPSAwOwogICAgIHZpcnR1YWwgdm9pZCBzZXRWaXNp
YmxlKGJvb2wpID0gMDsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBv
cnQvUXRQcmludENvbnRleHQuY3BwIGIvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9R
dFByaW50Q29udGV4dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMzc4ZWMyYzY4YjNlMTYxMWZjMGNkY2QzMjk0
MTg3NmFhNzU0MGIxMAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29y
ZVN1cHBvcnQvUXRQcmludENvbnRleHQuY3BwCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTIgRGlnaWEgUGxjIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKS4KKyAq
CisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUg
aXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFy
eSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29m
dHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9y
IChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5
IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBi
dXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50
eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ
T1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3Ig
bW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg
dGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhp
cyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisg
KiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQs
IEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJRdFByaW50Q29udGV4dC5oIgorCisjaW5j
bHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiSW50UmVjdC5oIgorI2luY2x1ZGUg
IlByaW50Q29udGV4dC5oIgorI2luY2x1ZGUgIlFXZWJGcmFtZUFkYXB0ZXIuaCIKKwordXNpbmcg
bmFtZXNwYWNlIFdlYkNvcmU7CisKK1F0UHJpbnRDb250ZXh0OjpRdFByaW50Q29udGV4dChRUGFp
bnRlciogcGFpbnRlciwgY29uc3QgUVJlY3QmIHBhZ2VSZWN0LCBRV2ViRnJhbWVBZGFwdGVyKiBm
cmFtZUFkYXB0ZXIpCisgICAgOiBtX2dyYXBoaWNzQ29udGV4dChuZXcgR3JhcGhpY3NDb250ZXh0
KHBhaW50ZXIpKQorICAgICwgbV9wcmludENvbnRleHQobmV3IFByaW50Q29udGV4dChmcmFtZUFk
YXB0ZXItPmZyYW1lKSkKK3sKKyAgICBtX3ByaW50Q29udGV4dC0+YmVnaW4ocGFnZVJlY3Qud2lk
dGgoKSwgcGFnZVJlY3QuaGVpZ2h0KCkpOworCisgICAgZmxvYXQgcGFnZUhlaWdodCA9IDA7Cisg
ICAgbV9wcmludENvbnRleHQtPmNvbXB1dGVQYWdlUmVjdHMoSW50UmVjdChwYWdlUmVjdCksIC8q
IGhlYWRlckhlaWdodCAqLyAwLCAvKiBmb290ZXJIZWlnaHQgKi8gMCwgLyogdXNlclNjYWxlRmFj
dG9yICovIDEuMCwgcGFnZUhlaWdodCk7Cit9CisKK1F0UHJpbnRDb250ZXh0Ojp+UXRQcmludENv
bnRleHQoKQoreworICAgIG1fcHJpbnRDb250ZXh0LT5lbmQoKTsKKyAgICBkZWxldGUgbV9ncmFw
aGljc0NvbnRleHQ7CisgICAgZGVsZXRlIG1fcHJpbnRDb250ZXh0OworfQorCitpbnQgUXRQcmlu
dENvbnRleHQ6OnBhZ2VDb3VudCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcHJpbnRDb250ZXh0
LT5wYWdlQ291bnQoKTsKK30KKwordm9pZCBRdFByaW50Q29udGV4dDo6c3Bvb2xQYWdlKGludCBw
YWdlTnVtYmVyLCBmbG9hdCB3aWR0aCkKK3sKKyAgICBtX3ByaW50Q29udGV4dC0+c3Bvb2xQYWdl
KCptX2dyYXBoaWNzQ29udGV4dCwgcGFnZU51bWJlciwgd2lkdGgpOworfQorCisKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvUXRQcmludENvbnRleHQuaCBiL1Nv
dXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvUXRQcmludENvbnRleHQuaApuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
Li5kNjk2OGRhNGEyNTNkMzNjZWJjZTFiMjMwNzZhZDQzNmE0MzMzNDQ1Ci0tLSAvZGV2L251bGwK
KysrIGIvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9RdFByaW50Q29udGV4dC5oCkBA
IC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgRGlnaWEgUGxjIGFuZC9v
ciBpdHMgc3Vic2lkaWFyeSgtaWVzKS4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0
d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIg
dGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBh
cyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2
ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZl
cnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRo
YXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhv
dXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91
bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlO
Ry5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
LCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAw
MjExMC0xMzAxLCBVU0EuCisgKgorICovCisjaWZuZGVmIFF0UHJpbnRDb250ZXh0X2gKKyNkZWZp
bmUgUXRQcmludENvbnRleHRfaAorCisjaW5jbHVkZSA8UVBhaW50ZXI+CisjaW5jbHVkZSA8UVJl
Y3Q+CisjaW5jbHVkZSA8cXdlYmtpdGdsb2JhbC5oPgorI2luY2x1ZGUgPHd0Zi9FeHBvcnRNYWNy
b3MuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworY2xhc3MgUHJpbnRDb250ZXh0OworY2xhc3Mg
R3JhcGhpY3NDb250ZXh0OworfQorCitjbGFzcyBRV2ViRnJhbWVBZGFwdGVyOworCitjbGFzcyBX
RUJLSVRfRVhQT1JUREFUQSBRdFByaW50Q29udGV4dCB7CitwdWJsaWM6CisgICAgUXRQcmludENv
bnRleHQoUVBhaW50ZXIqLCBjb25zdCBRUmVjdCYgcGFnZVJlY3QsIFFXZWJGcmFtZUFkYXB0ZXIq
KTsKKyAgICB+UXRQcmludENvbnRleHQoKTsKKworICAgIGludCBwYWdlQ291bnQoKSBjb25zdDsK
KyAgICB2b2lkIHNwb29sUGFnZShpbnQgcGFnZU51bWJlciwgZmxvYXQgd2lkdGgpOworCitwcml2
YXRlOgorICAgIFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dCogbV9ncmFwaGljc0NvbnRleHQ7Cisg
ICAgV2ViQ29yZTo6UHJpbnRDb250ZXh0KiBtX3ByaW50Q29udGV4dDsKK307CisKKyNlbmRpZgpk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9RdFdlYkNvbWJvQm94
LmNwcCBiL1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1cHBvcnQvUXRXZWJDb21ib0JveC5jcHAK
ZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMjJjZDQ3NmM2ZDU5YjM4MDIwYmZiZDMw
MmQ1NzUyZDAyM2U3ZTAuLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAK
LS0tIGEvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9RdFdlYkNvbWJvQm94LmNwcAor
KysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAg
R2lyaXNoIFJhbWFrcmlzaG5hbiA8Z2lyaXNoQGZvcndhcmRiaWFzLmluPgotICogQ29weXJpZ2h0
IChDKSAyMDA5LCAyMDExIE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgt
aWVzKQotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlz
dHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO
VSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUg
RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMiBvZiB0aGUgTGlj
ZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlz
IGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1
bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVk
IHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNl
bnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEg
Y29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcg
d2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3Jp
dGUgdG8KLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGlu
IFN0cmVldCwgRmlmdGggRmxvb3IsCi0gKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KLSAq
Ci0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIlF0V2ViQ29tYm9Cb3guaCIK
LQotI2lmbmRlZiBRVF9OT19DT01CT0JPWAotCi0jaW5jbHVkZSA8UUFic3RyYWN0SXRlbVZpZXc+
Ci0jaW5jbHVkZSA8UUNvcmVBcHBsaWNhdGlvbj4KLSNpbmNsdWRlIDxRdEd1aS9RTW91c2VFdmVu
dD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewotCi1RdFdlYkNvbWJvQm94OjpRdFdlYkNvbWJvQm94
KCkKLSAgICA6IFFDb21ib0JveCgpCi17Ci0gICAgLy8gSW5zdGFsbCBhbiBldmVudCBmaWx0ZXIg
b24gdGhlIHZpZXcgaW5zaWRlIHRoZSBjb21ibyBib3ggcG9wdXAgdG8gbWFrZSBzdXJlIHdlIGtu
b3cKLSAgICAvLyB3aGVuIHRoZSBwb3B1cCBnb3QgY2xvc2VkLiBFLmcuIFFDb21ib0JveDo6aGlk
ZVBvcHVwKCkgd29uJ3QgYmUgY2FsbGVkIHdoZW4gdGhlIHBvcHVwCi0gICAgLy8gaXMgY2xvc2Vk
IGJ5IGEgbW91c2Ugd2hlZWwgZXZlbnQgb3V0c2lkZSBpdHMgd2luZG93LgotICAgIHZpZXcoKS0+
aW5zdGFsbEV2ZW50RmlsdGVyKHRoaXMpOwotfQotCi12b2lkIFF0V2ViQ29tYm9Cb3g6OnNob3dQ
b3B1cEF0Q3Vyc29yUG9zaXRpb24oKQotewotICAgIFFNb3VzZUV2ZW50IGV2ZW50KFFFdmVudDo6
TW91c2VCdXR0b25QcmVzcywgUUN1cnNvcjo6cG9zKCksIFF0OjpMZWZ0QnV0dG9uLCBRdDo6TGVm
dEJ1dHRvbiwgUXQ6Ok5vTW9kaWZpZXIpOwotICAgIFFDb3JlQXBwbGljYXRpb246OnNlbmRFdmVu
dCh0aGlzLCAmZXZlbnQpOwotfQotCi1ib29sIFF0V2ViQ29tYm9Cb3g6OmV2ZW50RmlsdGVyKFFP
YmplY3QqIHdhdGNoZWQsIFFFdmVudCogZXZlbnQpCi17Ci0gICAgUV9BU1NFUlQod2F0Y2hlZCA9
PSB2aWV3KCkpOwotICAgIGlmIChldmVudC0+dHlwZSgpID09IFFFdmVudDo6SGlkZSkKLSAgICAg
ICAgZW1pdCBkaWRIaWRlKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi19Ci0KLSNlbmRpZiAv
LyBRVF9OT19DT01CT0JPWApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3Vw
cG9ydC9RdFdlYkNvbWJvQm94LmggYi9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L1F0
V2ViQ29tYm9Cb3guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMyNDI3ZWRmNGQ0
YjdmOTdkZWRlYjhlOGVlNGUwMjYwNGVkYzc2Mi4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMAotLS0gYS9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L1F0V2Vi
Q29tYm9Cb3guaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmln
aHQgKEMpIDIwMTEgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMp
Ci0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli
dXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVl
IFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNl
LCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgbGli
cmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAot
ICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2Fy
cmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug
Zm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5
IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRo
IHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0
bwotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3Ry
ZWV0LCBGaWZ0aCBGbG9vciwKLSAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgotICoKLSAq
LwotCi0jaWZuZGVmIFF0V2ViQ29tYm9Cb3hfaAotI2RlZmluZSBRdFdlYkNvbWJvQm94X2gKLQot
I2luY2x1ZGUgPFFDb21ib0JveD4KLSNpbmNsdWRlIDx3dGYvUGxhdGZvcm0uaD4KLQotI2lmbmRl
ZiBRVF9OT19DT01CT0JPWAotCi1uYW1lc3BhY2UgV2ViQ29yZSB7Ci0KLWNsYXNzIFF0V2ViQ29t
Ym9Cb3ggOiBwdWJsaWMgUUNvbWJvQm94IHsKLSAgICBRX09CSkVDVAotcHVibGljOgotICAgIFF0
V2ViQ29tYm9Cb3goKTsKLQotICAgIHZvaWQgc2hvd1BvcHVwQXRDdXJzb3JQb3NpdGlvbigpOwot
ICAgIHZpcnR1YWwgYm9vbCBldmVudEZpbHRlcihRT2JqZWN0KiB3YXRjaGVkLCBRRXZlbnQqKTsK
LQotUV9TSUdOQUxTOgotICAgIHZvaWQgZGlkSGlkZSgpOwotfTsKLQotfQotCi0jZW5kaWYgLy8g
UVRfTk9fQ09NQk9CT1gKLQotI2VuZGlmIC8vIFF0V2ViQ29tYm9Cb3hfaApkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9UZXh0dXJlTWFwcGVyTGF5ZXJDbGllbnRR
dC5jcHAgYi9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L1RleHR1cmVNYXBwZXJMYXll
ckNsaWVudFF0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi40NDQyYmFmZmZmNzM3ODQ0NjIxOWEwOTAyZjZjMzll
ZDY5ZDhlYTg1Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3Vw
cG9ydC9UZXh0dXJlTWFwcGVyTGF5ZXJDbGllbnRRdC5jcHAKQEAgLTAsMCArMSwxMjUgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJz
aWRpYXJ5KC1pZXMpCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgRGlnaWEgUGxjIGFuZC9vciBpdHMg
c3Vic2lkaWFyeSgtaWVzKQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5
b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVy
bXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxp
c2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24g
MiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4K
KyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3
aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVu
IHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZl
IHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4g
IElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4s
IDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEz
MDEsIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlRleHR1
cmVNYXBwZXJMYXllckNsaWVudFF0LmgiCisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJ
TkcpCisKKyNpbmNsdWRlICJGcmFtZVZpZXcuaCIKKyNpbmNsdWRlICJRV2ViRnJhbWVBZGFwdGVy
LmgiCisjaW5jbHVkZSAiUVdlYlBhZ2VBZGFwdGVyLmgiCisjaW5jbHVkZSAiVGV4dHVyZU1hcHBl
ckxheWVyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOworCitUZXh0dXJlTWFwcGVyTGF5
ZXJDbGllbnRRdDo6VGV4dHVyZU1hcHBlckxheWVyQ2xpZW50UXQoUVdlYkZyYW1lQWRhcHRlciog
ZnJhbWUpCisgICAgOiBtX2ZyYW1lKGZyYW1lKQorICAgICwgbV9zeW5jVGltZXIodGhpcywgJlRl
eHR1cmVNYXBwZXJMYXllckNsaWVudFF0OjpzeW5jTGF5ZXJzKQorICAgICwgbV9yb290VGV4dHVy
ZU1hcHBlckxheWVyKDApCit7Cit9CisKK1RleHR1cmVNYXBwZXJMYXllckNsaWVudFF0Ojp+VGV4
dHVyZU1hcHBlckxheWVyQ2xpZW50UXQoKQoreworICAgIG1fcm9vdFRleHR1cmVNYXBwZXJMYXll
ciA9IDA7Cit9CisKK3ZvaWQgVGV4dHVyZU1hcHBlckxheWVyQ2xpZW50UXQ6OnN5bmNSb290TGF5
ZXIoKQoreworICAgIG1fcm9vdEdyYXBoaWNzTGF5ZXItPmZsdXNoQ29tcG9zaXRpbmdTdGF0ZUZv
clRoaXNMYXllck9ubHkoKTsKK30KKwordm9pZCBUZXh0dXJlTWFwcGVyTGF5ZXJDbGllbnRRdDo6
bWFya0ZvclN5bmMoYm9vbCBzY2hlZHVsZVN5bmMpCit7CisgICAgaWYgKG1fc3luY1RpbWVyLmlz
QWN0aXZlKCkpCisgICAgICAgIHJldHVybjsKKyAgICBtX3N5bmNUaW1lci5zdGFydE9uZVNob3Qo
MCk7Cit9CisKK1RleHR1cmVNYXBwZXJMYXllciogVGV4dHVyZU1hcHBlckxheWVyQ2xpZW50UXQ6
OnJvb3RMYXllcigpCit7CisgICAgcmV0dXJuIHRvVGV4dHVyZU1hcHBlckxheWVyKG1fcm9vdEdy
YXBoaWNzTGF5ZXIuZ2V0KCkpOworfQorCit2b2lkIFRleHR1cmVNYXBwZXJMYXllckNsaWVudFF0
OjpzZXRSb290R3JhcGhpY3NMYXllcihHcmFwaGljc0xheWVyKiBsYXllcikKK3sKKyAgICBpZiAo
bGF5ZXIpIHsKKyAgICAgICAgbV9yb290R3JhcGhpY3NMYXllciA9IEdyYXBoaWNzTGF5ZXI6OmNy
ZWF0ZSgwKTsKKyAgICAgICAgbV9yb290VGV4dHVyZU1hcHBlckxheWVyID0gdG9UZXh0dXJlTWFw
cGVyTGF5ZXIobV9yb290R3JhcGhpY3NMYXllci5nZXQoKSk7CisgICAgICAgIG1fcm9vdEdyYXBo
aWNzTGF5ZXItPmFkZENoaWxkKGxheWVyKTsKKyAgICAgICAgbV9yb290R3JhcGhpY3NMYXllci0+
c2V0RHJhd3NDb250ZW50KGZhbHNlKTsKKyAgICAgICAgbV9yb290R3JhcGhpY3NMYXllci0+c2V0
TWFza3NUb0JvdW5kcyhmYWxzZSk7CisgICAgICAgIG1fcm9vdEdyYXBoaWNzTGF5ZXItPnNldFNp
emUoSW50U2l6ZSgxLCAxKSk7CisgICAgICAgIFRleHR1cmVNYXBwZXI6OkFjY2VsZXJhdGlvbk1v
ZGUgbW9kZSA9IFRleHR1cmVNYXBwZXI6OlNvZnR3YXJlTW9kZTsKKyAgICAgICAgaWYgKG1fZnJh
bWUtPnBhZ2VBZGFwdGVyLT5jbGllbnQtPm1ha2VPcGVuR0xDb250ZXh0Q3VycmVudElmQXZhaWxh
YmxlKCkpCisgICAgICAgICAgICBtb2RlID0gVGV4dHVyZU1hcHBlcjo6T3BlbkdMTW9kZTsKKyAg
ICAgICAgbV90ZXh0dXJlTWFwcGVyID0gVGV4dHVyZU1hcHBlcjo6Y3JlYXRlKG1vZGUpOworICAg
ICAgICBtX3Jvb3RUZXh0dXJlTWFwcGVyTGF5ZXItPnNldFRleHR1cmVNYXBwZXIobV90ZXh0dXJl
TWFwcGVyLmdldCgpKTsKKyAgICAgICAgc3luY1Jvb3RMYXllcigpOworICAgIH0gZWxzZSB7Cisg
ICAgICAgIG1fcm9vdEdyYXBoaWNzTGF5ZXIuY2xlYXIoKTsKKyAgICAgICAgbV9yb290VGV4dHVy
ZU1hcHBlckxheWVyID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgVGV4dHVyZU1hcHBlckxheWVyQ2xp
ZW50UXQ6OnN5bmNMYXllcnMoVGltZXI8VGV4dHVyZU1hcHBlckxheWVyQ2xpZW50UXQ+KikKK3sK
KyAgICBpZiAobV9yb290R3JhcGhpY3NMYXllcikKKyAgICAgICAgc3luY1Jvb3RMYXllcigpOwor
CisgICAgbV9mcmFtZS0+ZnJhbWUtPnZpZXcoKS0+Zmx1c2hDb21wb3NpdGluZ1N0YXRlSW5jbHVk
aW5nU3ViZnJhbWVzKCk7CisKKyAgICBpZiAoIW1fcm9vdEdyYXBoaWNzTGF5ZXIpCisgICAgICAg
IHJldHVybjsKKworICAgIGlmIChyb290TGF5ZXIoKS0+ZGVzY2VuZGFudHNPclNlbGZIYXZlUnVu
bmluZ0FuaW1hdGlvbnMoKSAmJiAhbV9zeW5jVGltZXIuaXNBY3RpdmUoKSkKKyAgICAgICAgbV9z
eW5jVGltZXIuc3RhcnRPbmVTaG90KDEuMCAvIDYwLjApOworCisgICAgbV9mcmFtZS0+cGFnZUFk
YXB0ZXItPmNsaWVudC0+cmVwYWludFZpZXdwb3J0KCk7Cit9CisKK3ZvaWQgVGV4dHVyZU1hcHBl
ckxheWVyQ2xpZW50UXQ6OnJlbmRlckNvbXBvc2l0ZWRMYXllcnMoR3JhcGhpY3NDb250ZXh0KiBj
b250ZXh0LCBjb25zdCBJbnRSZWN0JiBjbGlwKQoreworICAgIGlmICghbV9yb290VGV4dHVyZU1h
cHBlckxheWVyIHx8ICFtX3RleHR1cmVNYXBwZXIpCisgICAgICAgIHJldHVybjsKKworICAgIG1f
dGV4dHVyZU1hcHBlci0+c2V0R3JhcGhpY3NDb250ZXh0KGNvbnRleHQpOworICAgIG1fdGV4dHVy
ZU1hcHBlci0+c2V0SW1hZ2VJbnRlcnBvbGF0aW9uUXVhbGl0eShjb250ZXh0LT5pbWFnZUludGVy
cG9sYXRpb25RdWFsaXR5KCkpOworICAgIG1fdGV4dHVyZU1hcHBlci0+c2V0VGV4dERyYXdpbmdN
b2RlKGNvbnRleHQtPnRleHREcmF3aW5nTW9kZSgpKTsKKyAgICBRUGFpbnRlciogcGFpbnRlciA9
IGNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpOworICAgIGNvbnN0IFFUcmFuc2Zvcm0gdHJhbnNm
b3JtID0gcGFpbnRlci0+d29ybGRUcmFuc2Zvcm0oKTsKKyAgICBjb25zdCBUcmFuc2Zvcm1hdGlv
bk1hdHJpeCBtYXRyaXgoCisgICAgICAgIHRyYW5zZm9ybS5tMTEoKSwgdHJhbnNmb3JtLm0xMigp
LCAwLCB0cmFuc2Zvcm0ubTEzKCksCisgICAgICAgIHRyYW5zZm9ybS5tMjEoKSwgdHJhbnNmb3Jt
Lm0yMigpLCAwLCB0cmFuc2Zvcm0ubTIzKCksCisgICAgICAgIDAsIDAsIDEsIDAsCisgICAgICAg
IHRyYW5zZm9ybS5tMzEoKSwgdHJhbnNmb3JtLm0zMigpLCAwLCB0cmFuc2Zvcm0ubTMzKCkKKyAg
ICAgICAgKTsKKyAgICBtX3Jvb3RUZXh0dXJlTWFwcGVyTGF5ZXItPnNldFRyYW5zZm9ybShtYXRy
aXgpOworICAgIG1fcm9vdFRleHR1cmVNYXBwZXJMYXllci0+c2V0T3BhY2l0eShwYWludGVyLT5v
cGFjaXR5KCkpOworICAgIG1fdGV4dHVyZU1hcHBlci0+YmVnaW5QYWludGluZygpOworICAgIG1f
dGV4dHVyZU1hcHBlci0+YmVnaW5DbGlwKG1hdHJpeCwgY2xpcCk7CisgICAgbV9yb290VGV4dHVy
ZU1hcHBlckxheWVyLT5wYWludCgpOworICAgIG1fdGV4dHVyZU1hcHBlci0+ZW5kQ2xpcCgpOwor
ICAgIG1fdGV4dHVyZU1hcHBlci0+ZW5kUGFpbnRpbmcoKTsKK30KKworI2VuZGlmCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L1RleHR1cmVNYXBwZXJMYXllckNs
aWVudFF0LmggYi9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L1RleHR1cmVNYXBwZXJM
YXllckNsaWVudFF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNjczMjhjYzk5Y2NlZGU2YmNkM2MzOWQwYTlhNTdk
YWFjNzBhODM3NQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvcXQvV2ViQ29yZVN1
cHBvcnQvVGV4dHVyZU1hcHBlckxheWVyQ2xpZW50UXQuaApAQCAtMCwwICsxLDYxIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDEwIE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lk
aWFyeSgtaWVzKQorICogQ29weXJpZ2h0IChDKSAyMDEyIERpZ2lhIFBsYyBhbmQvb3IgaXRzIHN1
YnNpZGlhcnkoLWllcykKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91
IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1z
IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNo
ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIg
b2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisg
KgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2ls
bCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0
aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSBy
ZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UK
KyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJ
ZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1
MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAx
LCBVU0EuCisgKgorICovCisjaWZuZGVmIFRleHR1cmVNYXBwZXJMYXllckNsaWVudFF0X2gKKyNk
ZWZpbmUgVGV4dHVyZU1hcHBlckxheWVyQ2xpZW50UXRfaAorCitjbGFzcyBRV2ViRnJhbWVBZGFw
dGVyOworCisjaW5jbHVkZSAiR3JhcGhpY3NMYXllci5oIgorI2luY2x1ZGUgIlRleHR1cmVNYXBw
ZXIuaCIKKyNpbmNsdWRlICJUaW1lci5oIgorI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKworbmFt
ZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBUZXh0dXJlTWFwcGVyTGF5ZXI7CisKKyNpZiBVU0Uo
QUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCitjbGFzcyBUZXh0dXJlTWFwcGVyTGF5ZXJDbGllbnRR
dCB7CitwdWJsaWM6CisgICAgVGV4dHVyZU1hcHBlckxheWVyQ2xpZW50UXQoUVdlYkZyYW1lQWRh
cHRlciopOworICAgIH5UZXh0dXJlTWFwcGVyTGF5ZXJDbGllbnRRdCgpOworICAgIHZvaWQgc3lu
Y1Jvb3RMYXllcigpOworICAgIFRleHR1cmVNYXBwZXJMYXllciogcm9vdExheWVyKCk7CisKKyAg
ICB2b2lkIG1hcmtGb3JTeW5jKGJvb2wgc2NoZWR1bGVTeW5jKTsKKworICAgIHZvaWQgc2V0Um9v
dEdyYXBoaWNzTGF5ZXIoR3JhcGhpY3NMYXllciopOworCisgICAgdm9pZCBzeW5jTGF5ZXJzKFRp
bWVyPFRleHR1cmVNYXBwZXJMYXllckNsaWVudFF0PiopOworCisgICAgdm9pZCByZW5kZXJDb21w
b3NpdGVkTGF5ZXJzKEdyYXBoaWNzQ29udGV4dCosIGNvbnN0IEludFJlY3QmIGNsaXApOworcHJp
dmF0ZToKKyAgICBRV2ViRnJhbWVBZGFwdGVyKiBtX2ZyYW1lOworICAgIE93blB0cjxHcmFwaGlj
c0xheWVyPiBtX3Jvb3RHcmFwaGljc0xheWVyOworICAgIFRpbWVyPFRleHR1cmVNYXBwZXJMYXll
ckNsaWVudFF0PiBtX3N5bmNUaW1lcjsKKyAgICBXZWJDb3JlOjpUZXh0dXJlTWFwcGVyTGF5ZXIq
IG1fcm9vdFRleHR1cmVNYXBwZXJMYXllcjsKKyAgICBPd25QdHI8V2ViQ29yZTo6VGV4dHVyZU1h
cHBlcj4gbV90ZXh0dXJlTWFwcGVyOworfTsKKyNlbmRpZgorCit9CisKKyNlbmRpZgpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYktpdC9xdC9XZWJDb3JlU3VwcG9ydC9VbmRvU3RlcFF0LmggYi9Tb3Vy
Y2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L1VuZG9TdGVwUXQuaAppbmRleCA4NWQ3OTkxYzM3
OTNmNDM4YWYxMjhiY2IyYWY4YWE4YzRiZDQ0MmVjLi40OTUwYzk5ZjQ3YjdlZWNjMjI4OWE4MGMw
MzU0OTE0ZTc2MzUxMjIzIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBw
b3J0L1VuZG9TdGVwUXQuaAorKysgYi9Tb3VyY2UvV2ViS2l0L3F0L1dlYkNvcmVTdXBwb3J0L1Vu
ZG9TdGVwUXQuaApAQCAtMjMsMTEgKzIzLDEyIEBACiAjaW5jbHVkZSA8VW5kb1N0ZXAuaD4KIAog
I2luY2x1ZGUgPHFzdHJpbmcuaD4KKyNpbmNsdWRlIDxxd2Via2l0Z2xvYmFsLmg+CisjaW5jbHVk
ZSA8d3RmL0V4cG9ydE1hY3Jvcy5oPgogI2luY2x1ZGUgPHd0Zi9SZWZQdHIuaD4KIAotY2xhc3Mg
VW5kb1N0ZXBRdCB7CitjbGFzcyBXRUJLSVRfRVhQT1JUREFUQSBVbmRvU3RlcFF0ICB7CiAgICAg
cHVibGljOgotICAgICAgICBVbmRvU3RlcFF0KFdURjo6UmVmUHRyPFdlYkNvcmU6OlVuZG9TdGVw
Pik7CiAgICAgICAgIH5VbmRvU3RlcFF0KCk7CiAKICAgICAgICAgdm9pZCByZWRvKCk7CkBAIC0z
NSw5ICszNiwxMiBAQCBjbGFzcyBVbmRvU3RlcFF0IHsKICAgICAgICAgUVN0cmluZyB0ZXh0KCkg
Y29uc3Q7CiAKICAgICBwcml2YXRlOgorICAgICAgICBVbmRvU3RlcFF0KFdURjo6UmVmUHRyPFdl
YkNvcmU6OlVuZG9TdGVwPik7CisKICAgICAgICAgV1RGOjpSZWZQdHI8V2ViQ29yZTo6VW5kb1N0
ZXA+IG1fc3RlcDsKICAgICAgICAgYm9vbCBtX2ZpcnN0OwogICAgICAgICBRU3RyaW5nIG1fdGV4
dDsKKyAgICAgICAgZnJpZW5kIGNsYXNzIFFXZWJQYWdlQWRhcHRlcjsKIH07CiAKICNlbmRpZgpk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9XaWRnZXRBcGkvcWdyYXBoaWNzd2Vidmlldy5j
cHAgYi9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldEFwaS9xZ3JhcGhpY3N3ZWJ2aWV3LmNwcApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwLi45ODI3ZDIyNGUwMzQ3MzJjYjYwNDA4OTA2NDNhMGEwZWIyMjQyMWRhCi0tLSAvZGV2
L251bGwKKysrIGIvU291cmNlL1dlYktpdC9xdC9XaWRnZXRBcGkvcWdyYXBoaWNzd2Vidmlldy5j
cHAKQEAgLTAsMCArMSwxMTY3IEBACisvKgorICAgIENvcHlyaWdodCAoQykgMjAwOSBOb2tpYSBD
b3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykKKyAgICBDb3B5cmlnaHQgKEMp
IDIwMDkgR2lyaXNoIFJhbWFrcmlzaG5hbiA8Z2lyaXNoQGZvcndhcmRiaWFzLmluPgorCisgICAg
VGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu
ZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdh
cmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAo
YXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlz
IGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0
IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkg
b2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP
U0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3Ig
bW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0
aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhp
cyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisg
ICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0
LCBGaWZ0aCBGbG9vciwKKyAgICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJxZ3JhcGhpY3N3ZWJ2aWV3LmgiCisKKyNpZiAh
ZGVmaW5lZChRVF9OT19HUkFQSElDU1ZJRVcpCisKKyNpbmNsdWRlICJQYWdlQ2xpZW50UXQuaCIK
KyNpbmNsdWRlICJxd2ViZnJhbWUuaCIKKyNpbmNsdWRlICJxd2ViZnJhbWVfcC5oIgorI2luY2x1
ZGUgInF3ZWJwYWdlLmgiCisjaW5jbHVkZSAicXdlYnBhZ2VfcC5oIgorI2luY2x1ZGUgPHFhcHBs
aWNhdGlvbi5oPgorI2luY2x1ZGUgPHFncmFwaGljc3NjZW5lLmg+CisjaW5jbHVkZSA8cWdyYXBo
aWNzc2NlbmVldmVudC5oPgorI2luY2x1ZGUgPHFncmFwaGljc3ZpZXcuaD4KKyNpbmNsdWRlIDxx
bWV0YW9iamVjdC5oPgorI2luY2x1ZGUgPHFwaXhtYXBjYWNoZS5oPgorI2luY2x1ZGUgPHFzY3Jv
bGxiYXIuaD4KKyNpbmNsdWRlIDxxc2hhcmVkcG9pbnRlci5oPgorI2luY2x1ZGUgPHFzdHlsZW9w
dGlvbi5oPgorI2luY2x1ZGUgPHF0aW1lci5oPgorCisjaWYgZGVmaW5lZChRX1dTX1gxMSkKKyNp
bmNsdWRlIDxRWDExSW5mbz4KKyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKKwor
Y2xhc3MgUUdyYXBoaWNzV2ViVmlld1ByaXZhdGUgeworcHVibGljOgorICAgIFFHcmFwaGljc1dl
YlZpZXdQcml2YXRlKFFHcmFwaGljc1dlYlZpZXcqIHBhcmVudCkKKyAgICAgICAgOiBxKHBhcmVu
dCkKKyAgICAgICAgLCBwYWdlKDApCisgICAgICAgICwgcmVzaXplc1RvQ29udGVudHMoZmFsc2Up
CisgICAgICAgICwgcmVuZGVySGludHMoUVBhaW50ZXI6OlRleHRBbnRpYWxpYXNpbmcgfCBRUGFp
bnRlcjo6U21vb3RoUGl4bWFwVHJhbnNmb3JtKQorICAgIHsgfQorCisgICAgdmlydHVhbCB+UUdy
YXBoaWNzV2ViVmlld1ByaXZhdGUoKTsKKworICAgIHZvaWQgdXBkYXRlUmVzaXplc1RvQ29udGVu
dHNGb3JQYWdlKCk7CisKKyAgICB2b2lkIGRldGFjaEN1cnJlbnRQYWdlKCk7CisKKyAgICB2b2lk
IF9xX2RvTG9hZEZpbmlzaGVkKGJvb2wgc3VjY2Vzcyk7CisgICAgdm9pZCBfcV9jb250ZW50c1Np
emVDaGFuZ2VkKGNvbnN0IFFTaXplJik7CisgICAgdm9pZCBfcV9zY2FsZUNoYW5nZWQoKTsKKwor
ICAgIHZvaWQgX3FfcGFnZURlc3Ryb3llZCgpOworCisgICAgUUdyYXBoaWNzV2ViVmlldyogcTsK
KyAgICBRV2ViUGFnZSogcGFnZTsKKyAgICBib29sIHJlc2l6ZXNUb0NvbnRlbnRzOworICAgIFFQ
YWludGVyOjpSZW5kZXJIaW50cyByZW5kZXJIaW50czsKKworICAgIFFHcmFwaGljc0l0ZW1PdmVy
bGF5KiBvdmVybGF5KCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmICghcGFnZSB8fCAhcGFnZS0+
ZC0+Y2xpZW50KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBwYWdlQ2xp
ZW50KCktPm92ZXJsYXk7CisgICAgfQorCisgICAgUGFnZUNsaWVudFFHcmFwaGljc1dpZGdldCog
cGFnZUNsaWVudCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8V2Vi
Q29yZTo6UGFnZUNsaWVudFFHcmFwaGljc1dpZGdldCo+IChwYWdlLT5kLT5jbGllbnQuZGF0YSgp
KTsKKyAgICB9IAorfTsKKworUUdyYXBoaWNzV2ViVmlld1ByaXZhdGU6On5RR3JhcGhpY3NXZWJW
aWV3UHJpdmF0ZSgpCit7CisgICAgZGV0YWNoQ3VycmVudFBhZ2UoKTsKK30KKwordm9pZCBRR3Jh
cGhpY3NXZWJWaWV3UHJpdmF0ZTo6X3FfZG9Mb2FkRmluaXNoZWQoYm9vbCBzdWNjZXNzKQorewor
ICAgIC8vIElmIHRoZSBwYWdlIGhhZCBubyB0aXRsZSwgc3RpbGwgbWFrZSBzdXJlIGl0IGdldHMg
dGhlIHNpZ25hbAorICAgIGlmIChxLT50aXRsZSgpLmlzRW1wdHkoKSkKKyAgICAgICAgZW1pdCBx
LT51cmxDaGFuZ2VkKHEtPnVybCgpKTsKKworICAgIGVtaXQgcS0+bG9hZEZpbmlzaGVkKHN1Y2Nl
c3MpOworfQorCit2b2lkIFFHcmFwaGljc1dlYlZpZXdQcml2YXRlOjpfcV9wYWdlRGVzdHJveWVk
KCkKK3sKKyAgICBwYWdlID0gMDsKKyAgICBxLT5zZXRQYWdlKDApOworfQorCit2b2lkIFFHcmFw
aGljc1dlYlZpZXdQcml2YXRlOjp1cGRhdGVSZXNpemVzVG9Db250ZW50c0ZvclBhZ2UoKQorewor
ICAgIEFTU0VSVChwYWdlKTsKKyAgICBwYWdlQ2xpZW50KCktPnZpZXdSZXNpemVzVG9Db250ZW50
cyA9IHJlc2l6ZXNUb0NvbnRlbnRzOworICAgIGlmIChyZXNpemVzVG9Db250ZW50cykgeworICAg
ICAgICAvLyByZXNpemVzIHRvIGNvbnRlbnRzIG1vZGUgcmVxdWlyZXMgcHJlZmVycmVkIGNvbnRl
bnRzIHNpemUgdG8gYmUgc2V0CisgICAgICAgIGlmICghcGFnZS0+cHJlZmVycmVkQ29udGVudHNT
aXplKCkuaXNWYWxpZCgpKQorICAgICAgICAgICAgcGFnZS0+c2V0UHJlZmVycmVkQ29udGVudHNT
aXplKFFTaXplKDk2MCwgODAwKSk7CisKKyAgICAgICAgUU9iamVjdDo6Y29ubmVjdChwYWdlLT5t
YWluRnJhbWUoKSwgU0lHTkFMKGNvbnRlbnRzU2l6ZUNoYW5nZWQoUVNpemUpKSwKKyAgICAgICAg
ICAgIHEsIFNMT1QoX3FfY29udGVudHNTaXplQ2hhbmdlZChjb25zdCBRU2l6ZSYpKSwgUXQ6OlVu
aXF1ZUNvbm5lY3Rpb24pOworICAgIH0gZWxzZSB7CisgICAgICAgIFFPYmplY3Q6OmRpc2Nvbm5l
Y3QocGFnZS0+bWFpbkZyYW1lKCksIFNJR05BTChjb250ZW50c1NpemVDaGFuZ2VkKFFTaXplKSks
CisgICAgICAgICAgICBxLCBTTE9UKF9xX2NvbnRlbnRzU2l6ZUNoYW5nZWQoY29uc3QgUVNpemUm
KSkpOworICAgIH0KKyAgICBwYWdlLT5kLT5tYWluRnJhbWVBZGFwdGVyKCktPnNldFBhaW50c0Vu
dGlyZUNvbnRlbnRzKHJlc2l6ZXNUb0NvbnRlbnRzKTsKKyAgICBwYWdlLT5kLT5tYWluRnJhbWVB
ZGFwdGVyKCktPnNldERlbGVnYXRlc1Njcm9sbGluZyhyZXNpemVzVG9Db250ZW50cyk7Cit9CisK
K3ZvaWQgUUdyYXBoaWNzV2ViVmlld1ByaXZhdGU6Ol9xX2NvbnRlbnRzU2l6ZUNoYW5nZWQoY29u
c3QgUVNpemUmIHNpemUpCit7CisgICAgaWYgKCFyZXNpemVzVG9Db250ZW50cykKKyAgICAgICAg
cmV0dXJuOworICAgIHEtPnNldEdlb21ldHJ5KFFSZWN0RihxLT5nZW9tZXRyeSgpLnRvcExlZnQo
KSwgc2l6ZSkpOworfQorCit2b2lkIFFHcmFwaGljc1dlYlZpZXdQcml2YXRlOjpfcV9zY2FsZUNo
YW5nZWQoKQoreworI2lmIFVTRShUSUxFRF9CQUNLSU5HX1NUT1JFKQorICAgIGlmICghcGFnZSkK
KyAgICAgICAgcmV0dXJuOworICAgIHBhZ2UtPmQtPm1haW5GcmFtZUFkYXB0ZXIoKS0+c2V0VGls
ZWRCYWNraW5nU3RvcmVDb250ZW50c1NjYWxlKHEtPnNjYWxlKCkpOworI2VuZGlmCit9CisKKy8q
IQorICAgIFxjbGFzcyBRR3JhcGhpY3NXZWJWaWV3CisgICAgXGJyaWVmIFRoZSBRR3JhcGhpY3NX
ZWJWaWV3IGNsYXNzIGFsbG93cyBXZWIgY29udGVudCB0byBiZSBhZGRlZCB0byBhIEdyYXBoaWNz
Vmlldy4KKyAgICBcc2luY2UgNC42CisKKyAgICBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHJl
bmRlcnMgV2ViIGNvbnRlbnQgZnJvbSBhIFVSTCBvciBzdXBwbGllZCBhcyBkYXRhLCB1c2luZwor
ICAgIGZlYXR1cmVzIG9mIHRoZSBRdFdlYktpdCBtb2R1bGUuCisKKyAgICBJZiB0aGUgd2lkdGgg
YW5kIGhlaWdodCBvZiB0aGUgaXRlbSBhcmUgbm90IHNldCwgdGhleSB3aWxsIGRlZmF1bHQgdG8g
ODAwIGFuZCA2MDAsCisgICAgcmVzcGVjdGl2ZWx5LiBJZiB0aGUgV2ViIHBhZ2UgY29udGVudHMg
aXMgbGFyZ2VyIHRoYW4gdGhhdCwgc2Nyb2xsYmFycyB3aWxsIGJlIHNob3duCisgICAgaWYgbm90
IGRpc2FibGVkIGV4cGxpY2l0bHkuCisKKyAgICBcc2VjdGlvbjEgQnJvd3NlciBGZWF0dXJlcwor
CisgICAgTWFueSBvZiB0aGUgZnVuY3Rpb25zLCBzaWduYWxzIGFuZCBwcm9wZXJ0aWVzIHByb3Zp
ZGVkIGJ5IFFXZWJWaWV3IGFyZSBhbHNvIGF2YWlsYWJsZQorICAgIGZvciB0aGlzIGl0ZW0sIG1h
a2luZyBpdCBzaW1wbGUgdG8gYWRhcHQgZXhpc3RpbmcgY29kZSB0byB1c2UgUUdyYXBoaWNzV2Vi
VmlldyBpbnN0ZWFkCisgICAgb2YgUVdlYlZpZXcuCisKKyAgICBUaGUgaXRlbSB1c2VzIGEgUVdl
YlBhZ2Ugb2JqZWN0IHRvIHBlcmZvcm0gdGhlIHJlbmRlcmluZyBvZiBXZWIgY29udGVudCwgYW5k
IHRoaXMgY2FuCisgICAgYmUgb2J0YWluZWQgd2l0aCB0aGUgcGFnZSgpIGZ1bmN0aW9uLCBlbmFi
bGluZyB0aGUgZG9jdW1lbnQgaXRzZWxmIHRvIGJlIGFjY2Vzc2VkIGFuZAorICAgIG1vZGlmaWVk
LgorCisgICAgQXMgd2l0aCBRV2ViVmlldywgdGhlIGl0ZW0gcmVjb3JkcyB0aGUgYnJvd3Npbmcg
aGlzdG9yeSB1c2luZyBhIFFXZWJIaXN0b3J5IG9iamVjdCwKKyAgICBhY2Nlc3NpYmxlIHVzaW5n
IHRoZSBoaXN0b3J5KCkgZnVuY3Rpb24uIFRoZSBRV2ViU2V0dGluZ3Mgb2JqZWN0IHRoYXQgZGVm
aW5lcyB0aGUKKyAgICBjb25maWd1cmF0aW9uIG9mIHRoZSBicm93c2VyIGNhbiBiZSBvYnRhaW5l
ZCB3aXRoIHRoZSBzZXR0aW5ncygpIGZ1bmN0aW9uLCBlbmFibGluZworICAgIGZlYXR1cmVzIGxp
a2UgcGx1Z2luIHN1cHBvcnQgdG8gYmUgY3VzdG9taXplZCBmb3IgZWFjaCBpdGVtLgorCisgICAg
XHNhIFFXZWJWaWV3LCBRR3JhcGhpY3NUZXh0SXRlbQorKi8KKworLyohCisgICAgXGZuIHZvaWQg
UUdyYXBoaWNzV2ViVmlldzo6dGl0bGVDaGFuZ2VkKGNvbnN0IFFTdHJpbmcgJnRpdGxlKQorCisg
ICAgVGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuZXZlciB0aGUgXGEgdGl0bGUgb2YgdGhlIG1h
aW4gZnJhbWUgY2hhbmdlcy4KKworICAgIFxzYSB0aXRsZSgpCisqLworCisvKiEKKyAgICBcZm4g
dm9pZCBRR3JhcGhpY3NXZWJWaWV3Ojp1cmxDaGFuZ2VkKGNvbnN0IFFVcmwgJnVybCkKKworICAg
IFRoaXMgc2lnbmFsIGlzIGVtaXR0ZWQgd2hlbiB0aGUgXGEgdXJsIG9mIHRoZSB2aWV3IGNoYW5n
ZXMuCisKKyAgICBcc2EgdXJsKCksIGxvYWQoKQorKi8KKworLyohCisgICAgXGZuIHZvaWQgUUdy
YXBoaWNzV2ViVmlldzo6aWNvbkNoYW5nZWQoKQorCisgICAgVGhpcyBzaWduYWwgaXMgZW1pdHRl
ZCB3aGVuZXZlciB0aGUgaWNvbiBvZiB0aGUgcGFnZSBpcyBsb2FkZWQgb3IgY2hhbmdlcy4KKwor
ICAgIEluIG9yZGVyIGZvciBpY29ucyB0byBiZSBsb2FkZWQsIHlvdSB3aWxsIG5lZWQgdG8gc2V0
IGFuIGljb24gZGF0YWJhc2UgcGF0aAorICAgIHVzaW5nIFFXZWJTZXR0aW5nczo6c2V0SWNvbkRh
dGFiYXNlUGF0aCgpLgorCisgICAgXHNhIGljb24oKSwgUVdlYlNldHRpbmdzOjpzZXRJY29uRGF0
YWJhc2VQYXRoKCkKKyovCisKKy8qIQorICAgIFxmbiB2b2lkIFFHcmFwaGljc1dlYlZpZXc6Omxv
YWRTdGFydGVkKCkKKworICAgIFRoaXMgc2lnbmFsIGlzIGVtaXR0ZWQgd2hlbiBhIG5ldyBsb2Fk
IG9mIHRoZSBwYWdlIGlzIHN0YXJ0ZWQuCisKKyAgICBcc2EgbG9hZFByb2dyZXNzKCksIGxvYWRG
aW5pc2hlZCgpCisqLworCisvKiEKKyAgICBcZm4gdm9pZCBRR3JhcGhpY3NXZWJWaWV3Ojpsb2Fk
RmluaXNoZWQoYm9vbCBvaykKKworICAgIFRoaXMgc2lnbmFsIGlzIGVtaXR0ZWQgd2hlbiBhIGxv
YWQgb2YgdGhlIHBhZ2UgaXMgZmluaXNoZWQuCisgICAgXGEgb2sgd2lsbCBpbmRpY2F0ZSB3aGV0
aGVyIHRoZSBsb2FkIHdhcyBzdWNjZXNzZnVsIG9yIGFueSBlcnJvciBvY2N1cnJlZC4KKworICAg
IFxzYSBsb2FkU3RhcnRlZCgpCisqLworCisvKiEKKyAgICBDb25zdHJ1Y3RzIGFuIGVtcHR5IFFH
cmFwaGljc1dlYlZpZXcgd2l0aCBwYXJlbnQgXGEgcGFyZW50LgorCisgICAgXHNhIGxvYWQoKQor
Ki8KK1FHcmFwaGljc1dlYlZpZXc6OlFHcmFwaGljc1dlYlZpZXcoUUdyYXBoaWNzSXRlbSogcGFy
ZW50KQorICAgIDogUUdyYXBoaWNzV2lkZ2V0KHBhcmVudCkKKyAgICAsIGQobmV3IFFHcmFwaGlj
c1dlYlZpZXdQcml2YXRlKHRoaXMpKQoreworICAgIHNldEZsYWcoUUdyYXBoaWNzSXRlbTo6SXRl
bVVzZXNFeHRlbmRlZFN0eWxlT3B0aW9uLCB0cnVlKTsKKyAgICBzZXRBY2NlcHREcm9wcyh0cnVl
KTsKKyAgICBzZXRBY2NlcHRIb3ZlckV2ZW50cyh0cnVlKTsKKyAgICBzZXRBY2NlcHRUb3VjaEV2
ZW50cyh0cnVlKTsKKyAgICBzZXRGb2N1c1BvbGljeShRdDo6U3Ryb25nRm9jdXMpOworICAgIHNl
dEZsYWcoUUdyYXBoaWNzSXRlbTo6SXRlbUNsaXBzQ2hpbGRyZW5Ub1NoYXBlLCB0cnVlKTsKKyNp
ZiBVU0UoVElMRURfQkFDS0lOR19TVE9SRSkKKyAgICBRT2JqZWN0Ojpjb25uZWN0KHRoaXMsIFNJ
R05BTChzY2FsZUNoYW5nZWQoKSksIHRoaXMsIFNMT1QoX3Ffc2NhbGVDaGFuZ2VkKCkpKTsKKyNl
bmRpZgorfQorCisvKiEKKyAgICBEZXN0cm95cyB0aGUgaXRlbS4KKyovCitRR3JhcGhpY3NXZWJW
aWV3Ojp+UUdyYXBoaWNzV2ViVmlldygpCit7CisgICAgZGVsZXRlIGQ7Cit9CisKKy8qIQorICAg
IFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSB1bmRlcmx5aW5nIHdlYiBwYWdlLgorCisgICAgXHNh
IHNldFBhZ2UoKQorKi8KK1FXZWJQYWdlKiBRR3JhcGhpY3NXZWJWaWV3OjpwYWdlKCkgY29uc3QK
K3sKKyAgICBpZiAoIWQtPnBhZ2UpIHsKKyAgICAgICAgUUdyYXBoaWNzV2ViVmlldyogdGhhdCA9
IGNvbnN0X2Nhc3Q8UUdyYXBoaWNzV2ViVmlldyo+KHRoaXMpOworICAgICAgICBRV2ViUGFnZSog
cGFnZSA9IG5ldyBRV2ViUGFnZSh0aGF0KTsKKworICAgICAgICAvLyBEZWZhdWx0IHRvIG5vdCBo
YXZpbmcgYSBiYWNrZ3JvdW5kLCBpbiB0aGUgY2FzZQorICAgICAgICAvLyB0aGUgcGFnZSBkb2Vz
bid0IHByb3ZpZGUgb25lLgorICAgICAgICBRUGFsZXR0ZSBwYWxldHRlID0gUUFwcGxpY2F0aW9u
OjpwYWxldHRlKCk7CisgICAgICAgIHBhbGV0dGUuc2V0QnJ1c2goUVBhbGV0dGU6OkJhc2UsIFFD
b2xvcjo6ZnJvbVJnYkYoMCwgMCwgMCwgMCkpOworICAgICAgICBwYWdlLT5zZXRQYWxldHRlKHBh
bGV0dGUpOworCisgICAgICAgIHRoYXQtPnNldFBhZ2UocGFnZSk7CisgICAgfQorCisgICAgcmV0
dXJuIGQtPnBhZ2U7Cit9CisKKy8qISBccmVpbXAKKyovCit2b2lkIFFHcmFwaGljc1dlYlZpZXc6
OnBhaW50KFFQYWludGVyKiBwYWludGVyLCBjb25zdCBRU3R5bGVPcHRpb25HcmFwaGljc0l0ZW0q
IG9wdGlvbiwgUVdpZGdldCopCit7CisgICAgUVBhaW50ZXI6OlJlbmRlckhpbnRzIG9sZEhpbnRz
ID0gcGFpbnRlci0+cmVuZGVySGludHMoKTsKKyAgICBwYWludGVyLT5zZXRSZW5kZXJIaW50cyhv
bGRIaW50cyB8IGQtPnJlbmRlckhpbnRzKTsKKyNpZiBVU0UoVElMRURfQkFDS0lOR19TVE9SRSkK
KyAgICAvLyBRV2ViRnJhbWU6OnJlbmRlciBpcyBhIHB1YmxpYyBBUEksIGJ5cGFzcyBpdCBmb3Ig
dGlsZWQgcmVuZGVyaW5nIHNvIGJlaGF2aW9yIGRvZXMgbm90IG5lZWQgdG8gY2hhbmdlLgorICAg
IGlmIChwYWdlKCktPm1haW5GcmFtZSgpLT5kLT5yZW5kZXJGcm9tVGlsZWRCYWNraW5nU3RvcmUo
cGFpbnRlciwgb3B0aW9uLT5leHBvc2VkUmVjdC50b0FsaWduZWRSZWN0KCkpKSB7CisgICAgICAg
IHBhaW50ZXItPnNldFJlbmRlckhpbnRzKG9sZEhpbnRzKTsKKyAgICAgICAgcmV0dXJuOworICAg
IH0KKyNlbmRpZgorICAgIHBhZ2UoKS0+bWFpbkZyYW1lKCktPnJlbmRlcihwYWludGVyLCBRV2Vi
RnJhbWU6OkFsbExheWVycywgb3B0aW9uLT5leHBvc2VkUmVjdC50b1JlY3QoKSk7CisgICAgcGFp
bnRlci0+c2V0UmVuZGVySGludHMob2xkSGludHMpOworfQorCisvKiEgXHJlaW1wCisqLworYm9v
bCBRR3JhcGhpY3NXZWJWaWV3OjpzY2VuZUV2ZW50KFFFdmVudCogZXZlbnQpCit7CisgICAgLy8g
UmUtaW1wbGVtZW50ZWQgaW4gb3JkZXIgdG8gYWxsb3dzIGZpeGluZyBldmVudC1yZWxhdGVkIGJ1
Z3MgaW4gcGF0Y2ggcmVsZWFzZXMuCisKKyAgICBpZiAoZC0+cGFnZSAmJiAoZXZlbnQtPnR5cGUo
KSA9PSBRRXZlbnQ6OlRvdWNoQmVnaW4KKyAgICAgICAgfHwgZXZlbnQtPnR5cGUoKSA9PSBRRXZl
bnQ6OlRvdWNoRW5kCisgICAgICAgIHx8IGV2ZW50LT50eXBlKCkgPT0gUUV2ZW50OjpUb3VjaFVw
ZGF0ZQorICAgICAgICB8fCBldmVudC0+dHlwZSgpID09IFFFdmVudDo6VG91Y2hDYW5jZWwpKSB7
CisgICAgICAgIGQtPnBhZ2UtPmV2ZW50KGV2ZW50KTsKKworICAgICAgICAvLyBBbHdheXMgcmV0
dXJuIHRydWUgc28gdGhhdCB3ZSdsbCByZWNlaXZlIGFsc28gVG91Y2hVcGRhdGUgYW5kIFRvdWNo
RW5kIGV2ZW50cworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gUUdy
YXBoaWNzV2lkZ2V0OjpzY2VuZUV2ZW50KGV2ZW50KTsKK30KKworLyohIFxyZWltcAorKi8KK1FW
YXJpYW50IFFHcmFwaGljc1dlYlZpZXc6Oml0ZW1DaGFuZ2UoR3JhcGhpY3NJdGVtQ2hhbmdlIGNo
YW5nZSwgY29uc3QgUVZhcmlhbnQmIHZhbHVlKQoreworICAgIHN3aXRjaCAoY2hhbmdlKSB7Cisg
ICAgLy8gRGlmZmVyZW50bHkgZnJvbSBRV2ViVmlldywgaXQgaXMgaW50ZXJlc3RpbmcgdG8gUUdy
YXBoaWNzV2ViVmlldyB0byBoYW5kbGUKKyAgICAvLyBwb3N0IG1vdXNlIGN1cnNvciBjaGFuZ2Ug
bm90aWZpY2F0aW9ucy4gUmVhc29uOiAnSXRlbUN1cnNvckNoYW5nZScgaXMgc2VudAorICAgIC8v
IGFzIHRoZSBmaXJzdCBhY3Rpb24gaW4gUUdyYXBoaWNzSXRlbTo6c2V0Q3Vyc29yIGltcGxlbWVu
dGF0aW9uLCBhbmQgYXQgdGhhdAorICAgIC8vIGl0ZW0gd2lkZ2V0J3MgY3Vyc29yIGhhcyBub3Qg
YmVlbiBlZmZlY3RpdmVseSBjaGFuZ2VkIHlldC4KKyAgICAvLyBBZnRlciBjdXJzb3IgaXMgcHJv
cGVybHkgc2V0IChhdCAnSXRlbUN1cnNvckhhc0NoYW5nZWQnIGVtaXNzaW9uIHRpbWUpLCB3ZQor
ICAgIC8vIGZpcmUgJ0N1cnNvckNoYW5nZScuCisgICAgY2FzZSBJdGVtQ3Vyc29yQ2hhbmdlOgor
ICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgY2FzZSBJdGVtQ3Vyc29ySGFzQ2hhbmdlZDogewor
ICAgICAgICBRRXZlbnQgZXZlbnQoUUV2ZW50OjpDdXJzb3JDaGFuZ2UpOworICAgICAgICBRQXBw
bGljYXRpb246OnNlbmRFdmVudCh0aGlzLCAmZXZlbnQpOworICAgICAgICByZXR1cm4gdmFsdWU7
CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVy
biBRR3JhcGhpY3NXaWRnZXQ6Oml0ZW1DaGFuZ2UoY2hhbmdlLCB2YWx1ZSk7Cit9CisKKy8qISBc
cmVpbXAKKyovCitRU2l6ZUYgUUdyYXBoaWNzV2ViVmlldzo6c2l6ZUhpbnQoUXQ6OlNpemVIaW50
IHdoaWNoLCBjb25zdCBRU2l6ZUYmIGNvbnN0cmFpbnQpIGNvbnN0Cit7CisgICAgaWYgKHdoaWNo
ID09IFF0OjpQcmVmZXJyZWRTaXplKQorICAgICAgICByZXR1cm4gUVNpemVGKDgwMCwgNjAwKTsg
Ly8gIyMjCisgICAgcmV0dXJuIFFHcmFwaGljc1dpZGdldDo6c2l6ZUhpbnQod2hpY2gsIGNvbnN0
cmFpbnQpOworfQorCisvKiEgXHJlaW1wCisqLworUVZhcmlhbnQgUUdyYXBoaWNzV2ViVmlldzo6
aW5wdXRNZXRob2RRdWVyeShRdDo6SW5wdXRNZXRob2RRdWVyeSBxdWVyeSkgY29uc3QKK3sKKyAg
ICBpZiAoZC0+cGFnZSkKKyAgICAgICAgcmV0dXJuIGQtPnBhZ2UtPmlucHV0TWV0aG9kUXVlcnko
cXVlcnkpOworICAgIHJldHVybiBRVmFyaWFudCgpOworfQorCisvKiEKKyAgICBccHJvcGVydHkg
UUdyYXBoaWNzV2ViVmlldzo6cmVuZGVySGludHMKKyAgICBcc2luY2UgNC44CisgICAgXGJyaWVm
IHRoZSBkZWZhdWx0IHJlbmRlciBoaW50cyBmb3IgdGhlIHZpZXcKKworICAgIFRoZXNlIGhpbnRz
IGFyZSB1c2VkIHRvIGluaXRpYWxpemUgUVBhaW50ZXIgYmVmb3JlIHBhaW50aW5nIHRoZSBXZWIg
cGFnZS4KKworICAgIFFQYWludGVyOjpUZXh0QW50aWFsaWFzaW5nIGFuZCBRUGFpbnRlcjo6U21v
b3RoUGl4bWFwVHJhbnNmb3JtIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQgYW5kIHdpbGwgYmUKKyAg
ICB1c2VkIHRvIHJlbmRlciB0aGUgaXRlbSBpbiBhZGRpdGlvbiBvZiB3aGF0IGhhcyBiZWVuIHNl
dCBvbiB0aGUgcGFpbnRlciBnaXZlbiBieSBRR3JhcGhpY3NTY2VuZS4KKworICAgIFxzYSBRUGFp
bnRlcjo6cmVuZGVySGludHMoKQorKi8KKworLyohCisgICAgXHNpbmNlIDQuOAorICAgIFJldHVy
bnMgdGhlIHJlbmRlciBoaW50cyB1c2VkIGJ5IHRoZSB2aWV3IHRvIHJlbmRlciBjb250ZW50Lgor
CisgICAgXHNhIFFQYWludGVyOjpyZW5kZXJIaW50cygpCisqLworUVBhaW50ZXI6OlJlbmRlckhp
bnRzIFFHcmFwaGljc1dlYlZpZXc6OnJlbmRlckhpbnRzKCkgY29uc3QKK3sKKyAgICByZXR1cm4g
ZC0+cmVuZGVySGludHM7Cit9CisKKy8qIQorICAgIFxzaW5jZSA0LjgKKyAgICBTZXRzIHRoZSBy
ZW5kZXIgaGludHMgdXNlZCBieSB0aGUgdmlldyB0byB0aGUgc3BlY2lmaWVkIFxhIGhpbnRzLgor
CisgICAgXHNhIFFQYWludGVyOjpzZXRSZW5kZXJIaW50cygpCisqLwordm9pZCBRR3JhcGhpY3NX
ZWJWaWV3OjpzZXRSZW5kZXJIaW50cyhRUGFpbnRlcjo6UmVuZGVySGludHMgaGludHMpCit7Cisg
ICAgaWYgKGhpbnRzID09IGQtPnJlbmRlckhpbnRzKQorICAgICAgICByZXR1cm47CisgICAgZC0+
cmVuZGVySGludHMgPSBoaW50czsKKyAgICB1cGRhdGUoKTsKK30KKworLyohCisgICAgXHNpbmNl
IDQuOAorICAgIElmIFxhIGVuYWJsZWQgaXMgdHJ1ZSwgZW5hYmxlcyB0aGUgc3BlY2lmaWVkIHJl
bmRlciBcYSBoaW50OyBvdGhlcndpc2UKKyAgICBkaXNhYmxlcyBpdC4KKworICAgIFxzYSByZW5k
ZXJIaW50cywgUVBhaW50ZXI6OnJlbmRlckhpbnRzKCkKKyovCit2b2lkIFFHcmFwaGljc1dlYlZp
ZXc6OnNldFJlbmRlckhpbnQoUVBhaW50ZXI6OlJlbmRlckhpbnQgaGludCwgYm9vbCBlbmFibGVk
KQoreworICAgIFFQYWludGVyOjpSZW5kZXJIaW50cyBvbGRIaW50cyA9IGQtPnJlbmRlckhpbnRz
OworICAgIGlmIChlbmFibGVkKQorICAgICAgICBkLT5yZW5kZXJIaW50cyB8PSBoaW50OworICAg
IGVsc2UKKyAgICAgICAgZC0+cmVuZGVySGludHMgJj0gfmhpbnQ7CisgICAgaWYgKG9sZEhpbnRz
ICE9IGQtPnJlbmRlckhpbnRzKQorICAgICAgICB1cGRhdGUoKTsKK30KKworLyohIFxyZWltcAor
Ki8KK2Jvb2wgUUdyYXBoaWNzV2ViVmlldzo6ZXZlbnQoUUV2ZW50KiBldmVudCkKK3sKKyAgICAv
LyBSZS1pbXBsZW1lbnRlZCBpbiBvcmRlciB0byBhbGxvd3MgZml4aW5nIGV2ZW50LXJlbGF0ZWQg
YnVncyBpbiBwYXRjaCByZWxlYXNlcy4KKworICAgIGlmIChkLT5wYWdlKSB7CisgICAgICAgIGlm
IChldmVudC0+dHlwZSgpID09IFFFdmVudDo6UGFsZXR0ZUNoYW5nZSkKKyAgICAgICAgICAgIGQt
PnBhZ2UtPnNldFBhbGV0dGUocGFsZXR0ZSgpKTsKKyNpZm5kZWYgUVRfTk9fQ09OVEVYVE1FTlUK
KyAgICAgICAgaWYgKGV2ZW50LT50eXBlKCkgPT0gUUV2ZW50OjpHcmFwaGljc1NjZW5lQ29udGV4
dE1lbnUpIHsKKyAgICAgICAgICAgIGlmICghaXNFbmFibGVkKCkpCisgICAgICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBRR3JhcGhpY3NTY2VuZUNvbnRleHRNZW51RXZl
bnQqIGV2ID0gc3RhdGljX2Nhc3Q8UUdyYXBoaWNzU2NlbmVDb250ZXh0TWVudUV2ZW50Kj4oZXZl
bnQpOworICAgICAgICAgICAgUUNvbnRleHRNZW51RXZlbnQgZmFrZUV2ZW50KFFDb250ZXh0TWVu
dUV2ZW50OjpSZWFzb24oZXYtPnJlYXNvbigpKSwgZXYtPnBvcygpLnRvUG9pbnQoKSk7CisgICAg
ICAgICAgICBpZiAoZC0+cGFnZS0+c3dhbGxvd0NvbnRleHRNZW51RXZlbnQoJmZha2VFdmVudCkp
IHsKKyAgICAgICAgICAgICAgICBldmVudC0+YWNjZXB0KCk7CisgICAgICAgICAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkLT5wYWdlLT51cGRhdGVQb3Np
dGlvbkRlcGVuZGVudEFjdGlvbnMoZmFrZUV2ZW50LnBvcygpKTsKKyAgICAgICAgfSBlbHNlCisj
ZW5kaWYgLy8gUVRfTk9fQ09OVEVYVE1FTlUKKyAgICAgICAgeworI2lmbmRlZiBRVF9OT19DVVJT
T1IKKyAgICAgICAgICAgIGlmIChldmVudC0+dHlwZSgpID09IFFFdmVudDo6Q3Vyc29yQ2hhbmdl
KSB7CisgICAgICAgICAgICAgICAgLy8gQW4gdW5zZXRDdXJzb3Igd2lsbCBzZXQgdGhlIGN1cnNv
ciB0byBRdDo6QXJyb3dDdXJzb3IuCisgICAgICAgICAgICAgICAgLy8gVGh1cyB0aGlzIGN1cnNv
ciBjaGFuZ2UgbWlnaHQgYmUgYSBRV2lkZ2V0Ojp1bnNldEN1cnNvcigpCisgICAgICAgICAgICAg
ICAgLy8gSWYgdGhpcyBpcyBub3QgdGhlIGNhc2UgYW5kIGl0IGNhbWUgZnJvbSBXZWJDb3JlLCB0
aGUKKyAgICAgICAgICAgICAgICAvLyBRV2ViUGFnZUNsaWVudCBhbHJlYWR5IGhhcyBzZXQgaXRz
IGN1cnNvciBpbnRlcm5hbGx5CisgICAgICAgICAgICAgICAgLy8gdG8gUXQ6OkFycm93Q3Vyc29y
LCBzbyB1cGRhdGluZyB0aGUgY3Vyc29yIGlzIGFsd2F5cworICAgICAgICAgICAgICAgIC8vIHJp
Z2h0LCBhcyBpdCBmYWxscyBiYWNrIHRvIHRoZSBsYXN0IGN1cnNvciBzZXQgYnkKKyAgICAgICAg
ICAgICAgICAvLyBXZWJDb3JlLgorICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBBZGQgYSBRRXZl
bnQ6OkN1cnNvclVuc2V0IG9yIHNpbWlsYXIgdG8gUXQuCisgICAgICAgICAgICAgICAgaWYgKGN1
cnNvcigpLnNoYXBlKCkgPT0gUXQ6OkFycm93Q3Vyc29yKQorICAgICAgICAgICAgICAgICAgICBk
LT5wYWdlLT5kLT5jbGllbnQtPnJlc2V0Q3Vyc29yKCk7CisgICAgICAgICAgICB9CisjZW5kaWYK
KyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gUUdyYXBoaWNzV2lkZ2V0OjpldmVudChldmVu
dCk7Cit9CisKK3ZvaWQgUUdyYXBoaWNzV2ViVmlld1ByaXZhdGU6OmRldGFjaEN1cnJlbnRQYWdl
KCkKK3sKKyAgICBpZiAoIXBhZ2UpCisgICAgICAgIHJldHVybjsKKworICAgIHBhZ2UtPmQtPnZp
ZXcgPSAwOworICAgIHBhZ2UtPmQtPmNsaWVudC5yZXNldCgpOworCisgICAgLy8gaWYgdGhlIHBh
Z2Ugd2FzIGNyZWF0ZWQgYnkgdXMsIHdlIG93biBpdCBhbmQgbmVlZCB0bworICAgIC8vIGRlc3Ry
b3kgaXQgYXMgd2VsbC4KKworICAgIGlmIChwYWdlLT5wYXJlbnQoKSA9PSBxKQorICAgICAgICBk
ZWxldGUgcGFnZTsKKyAgICBlbHNlCisgICAgICAgIHBhZ2UtPmRpc2Nvbm5lY3QocSk7CisKKyAg
ICBwYWdlID0gMDsKK30KKworLyohCisgICAgTWFrZXMgXGEgcGFnZSB0aGUgbmV3IHdlYiBwYWdl
IG9mIHRoZSB3ZWIgZ3JhcGhpY3NpdGVtLgorCisgICAgVGhlIHBhcmVudCBRT2JqZWN0IG9mIHRo
ZSBwcm92aWRlZCBwYWdlIHJlbWFpbnMgdGhlIG93bmVyCisgICAgb2YgdGhlIG9iamVjdC4gSWYg
dGhlIGN1cnJlbnQgZG9jdW1lbnQgaXMgYSBjaGlsZCBvZiB0aGUgd2ViCisgICAgdmlldywgaXQg
d2lsbCBiZSBkZWxldGVkLgorCisgICAgXHNhIHBhZ2UoKQorKi8KK3ZvaWQgUUdyYXBoaWNzV2Vi
Vmlldzo6c2V0UGFnZShRV2ViUGFnZSogcGFnZSkKK3sKKyAgICBpZiAoZC0+cGFnZSA9PSBwYWdl
KQorICAgICAgICByZXR1cm47CisKKyAgICBkLT5kZXRhY2hDdXJyZW50UGFnZSgpOworICAgIGQt
PnBhZ2UgPSBwYWdlOworCisgICAgaWYgKCFkLT5wYWdlKQorICAgICAgICByZXR1cm47CisKKyAg
ICBkLT5wYWdlLT5kLT5jbGllbnQucmVzZXQobmV3IFBhZ2VDbGllbnRRR3JhcGhpY3NXaWRnZXQo
dGhpcywgcGFnZSkpOworCisgICAgaWYgKGQtPm92ZXJsYXkoKSkKKyAgICAgICAgZC0+b3Zlcmxh
eSgpLT5wcmVwYXJlR3JhcGhpY3NJdGVtR2VvbWV0cnlDaGFuZ2UoKTsKKworICAgIFFTaXplIHNp
emUgPSBnZW9tZXRyeSgpLnNpemUoKS50b1NpemUoKTsKKyAgICBwYWdlLT5zZXRWaWV3cG9ydFNp
emUoc2l6ZSk7CisKKyAgICBpZiAoZC0+cmVzaXplc1RvQ29udGVudHMpCisgICAgICAgIGQtPnVw
ZGF0ZVJlc2l6ZXNUb0NvbnRlbnRzRm9yUGFnZSgpOworCisgICAgUVdlYkZyYW1lKiBtYWluRnJh
bWUgPSBkLT5wYWdlLT5tYWluRnJhbWUoKTsKKworICAgIGNvbm5lY3QobWFpbkZyYW1lLCBTSUdO
QUwodGl0bGVDaGFuZ2VkKFFTdHJpbmcpKSwKKyAgICAgICAgdGhpcywgU0lHTkFMKHRpdGxlQ2hh
bmdlZChRU3RyaW5nKSkpOworICAgIGNvbm5lY3QobWFpbkZyYW1lLCBTSUdOQUwoaWNvbkNoYW5n
ZWQoKSksCisgICAgICAgIHRoaXMsIFNJR05BTChpY29uQ2hhbmdlZCgpKSk7CisgICAgY29ubmVj
dChtYWluRnJhbWUsIFNJR05BTCh1cmxDaGFuZ2VkKFFVcmwpKSwKKyAgICAgICAgdGhpcywgU0lH
TkFMKHVybENoYW5nZWQoUVVybCkpKTsKKyAgICBjb25uZWN0KGQtPnBhZ2UsIFNJR05BTChsb2Fk
U3RhcnRlZCgpKSwKKyAgICAgICAgdGhpcywgU0lHTkFMKGxvYWRTdGFydGVkKCkpKTsKKyAgICBj
b25uZWN0KGQtPnBhZ2UsIFNJR05BTChsb2FkUHJvZ3Jlc3MoaW50KSksCisgICAgICAgIHRoaXMs
IFNJR05BTChsb2FkUHJvZ3Jlc3MoaW50KSkpOworICAgIGNvbm5lY3QoZC0+cGFnZSwgU0lHTkFM
KGxvYWRGaW5pc2hlZChib29sKSksCisgICAgICAgIHRoaXMsIFNMT1QoX3FfZG9Mb2FkRmluaXNo
ZWQoYm9vbCkpKTsKKyAgICBjb25uZWN0KGQtPnBhZ2UsIFNJR05BTChzdGF0dXNCYXJNZXNzYWdl
KFFTdHJpbmcpKSwKKyAgICAgICAgdGhpcywgU0lHTkFMKHN0YXR1c0Jhck1lc3NhZ2UoUVN0cmlu
ZykpKTsKKyAgICBjb25uZWN0KGQtPnBhZ2UsIFNJR05BTChsaW5rQ2xpY2tlZChRVXJsKSksCisg
ICAgICAgIHRoaXMsIFNJR05BTChsaW5rQ2xpY2tlZChRVXJsKSkpOworICAgIGNvbm5lY3QoZC0+
cGFnZSwgU0lHTkFMKGRlc3Ryb3llZCgpKSwKKyAgICAgICAgdGhpcywgU0xPVChfcV9wYWdlRGVz
dHJveWVkKCkpKTsKKyNpZiAhZGVmaW5lZChRVF9OT19JTSkgJiYgKGRlZmluZWQoUV9XU19YMTEp
IHx8IGRlZmluZWQoUV9XU19RV1MpKQorICAgIGNvbm5lY3QoZC0+cGFnZSwgU0lHTkFMKG1pY3Jv
Rm9jdXNDaGFuZ2VkKCkpLAorICAgICAgICB0aGlzLCBTTE9UKHVwZGF0ZU1pY3JvRm9jdXMoKSkp
OworI2VuZGlmCit9CisKKy8qIQorICAgIFxwcm9wZXJ0eSBRR3JhcGhpY3NXZWJWaWV3Ojp1cmwK
KyAgICBcYnJpZWYgdGhlIHVybCBvZiB0aGUgd2ViIHBhZ2UgY3VycmVudGx5IHZpZXdlZAorCisg
ICAgU2V0dGluZyB0aGlzIHByb3BlcnR5IGNsZWFycyB0aGUgdmlldyBhbmQgbG9hZHMgdGhlIFVS
TC4KKworICAgIEJ5IGRlZmF1bHQsIHRoaXMgcHJvcGVydHkgY29udGFpbnMgYW4gZW1wdHksIGlu
dmFsaWQgVVJMLgorCisgICAgXHNhIGxvYWQoKSwgdXJsQ2hhbmdlZCgpCisqLworCit2b2lkIFFH
cmFwaGljc1dlYlZpZXc6OnNldFVybChjb25zdCBRVXJsICZ1cmwpCit7CisgICAgcGFnZSgpLT5t
YWluRnJhbWUoKS0+c2V0VXJsKHVybCk7Cit9CisKK1FVcmwgUUdyYXBoaWNzV2ViVmlldzo6dXJs
KCkgY29uc3QKK3sKKyAgICBpZiAoZC0+cGFnZSkKKyAgICAgICAgcmV0dXJuIGQtPnBhZ2UtPm1h
aW5GcmFtZSgpLT51cmwoKTsKKworICAgIHJldHVybiBRVXJsKCk7Cit9CisKKy8qIQorICAgIFxw
cm9wZXJ0eSBRR3JhcGhpY3NXZWJWaWV3Ojp0aXRsZQorICAgIFxicmllZiB0aGUgdGl0bGUgb2Yg
dGhlIHdlYiBwYWdlIGN1cnJlbnRseSB2aWV3ZWQKKworICAgIEJ5IGRlZmF1bHQsIHRoaXMgcHJv
cGVydHkgY29udGFpbnMgYW4gZW1wdHkgc3RyaW5nLgorCisgICAgXHNhIHRpdGxlQ2hhbmdlZCgp
CisqLworUVN0cmluZyBRR3JhcGhpY3NXZWJWaWV3Ojp0aXRsZSgpIGNvbnN0Cit7CisgICAgaWYg
KGQtPnBhZ2UpCisgICAgICAgIHJldHVybiBkLT5wYWdlLT5tYWluRnJhbWUoKS0+dGl0bGUoKTsK
KworICAgIHJldHVybiBRU3RyaW5nKCk7Cit9CisKKy8qIQorICAgIFxwcm9wZXJ0eSBRR3JhcGhp
Y3NXZWJWaWV3OjppY29uCisgICAgXGJyaWVmIHRoZSBpY29uIGFzc29jaWF0ZWQgd2l0aCB0aGUg
d2ViIHBhZ2UgY3VycmVudGx5IHZpZXdlZAorCisgICAgQnkgZGVmYXVsdCwgdGhpcyBwcm9wZXJ0
eSBjb250YWlucyBhIG51bGwgaWNvbi4KKworICAgIFxzYSBpY29uQ2hhbmdlZCgpLCBRV2ViU2V0
dGluZ3M6Omljb25Gb3JVcmwoKQorKi8KK1FJY29uIFFHcmFwaGljc1dlYlZpZXc6Omljb24oKSBj
b25zdAoreworICAgIGlmIChkLT5wYWdlKQorICAgICAgICByZXR1cm4gZC0+cGFnZS0+bWFpbkZy
YW1lKCktPmljb24oKTsKKworICAgIHJldHVybiBRSWNvbigpOworfQorCisvKiEKKyAgICBccHJv
cGVydHkgUUdyYXBoaWNzV2ViVmlldzo6em9vbUZhY3RvcgorICAgIFxicmllZiB0aGUgem9vbSBm
YWN0b3IgZm9yIHRoZSB2aWV3CisqLworCit2b2lkIFFHcmFwaGljc1dlYlZpZXc6OnNldFpvb21G
YWN0b3IocXJlYWwgZmFjdG9yKQoreworICAgIGlmIChmYWN0b3IgPT0gcGFnZSgpLT5tYWluRnJh
bWUoKS0+em9vbUZhY3RvcigpKQorICAgICAgICByZXR1cm47CisKKyAgICBwYWdlKCktPm1haW5G
cmFtZSgpLT5zZXRab29tRmFjdG9yKGZhY3Rvcik7Cit9CisKK3FyZWFsIFFHcmFwaGljc1dlYlZp
ZXc6Onpvb21GYWN0b3IoKSBjb25zdAoreworICAgIHJldHVybiBwYWdlKCktPm1haW5GcmFtZSgp
LT56b29tRmFjdG9yKCk7Cit9CisKKy8qISBccmVpbXAKKyovCit2b2lkIFFHcmFwaGljc1dlYlZp
ZXc6OnVwZGF0ZUdlb21ldHJ5KCkKK3sKKyAgICBpZiAoZC0+b3ZlcmxheSgpKQorICAgICAgICBk
LT5vdmVybGF5KCktPnByZXBhcmVHcmFwaGljc0l0ZW1HZW9tZXRyeUNoYW5nZSgpOworCisgICAg
UUdyYXBoaWNzV2lkZ2V0Ojp1cGRhdGVHZW9tZXRyeSgpOworCisgICAgaWYgKCFkLT5wYWdlKQor
ICAgICAgICByZXR1cm47CisKKyAgICBRU2l6ZSBzaXplID0gZ2VvbWV0cnkoKS5zaXplKCkudG9T
aXplKCk7CisgICAgZC0+cGFnZS0+c2V0Vmlld3BvcnRTaXplKHNpemUpOworfQorCisvKiEgXHJl
aW1wCisqLwordm9pZCBRR3JhcGhpY3NXZWJWaWV3OjpzZXRHZW9tZXRyeShjb25zdCBRUmVjdEYm
IHJlY3QpCit7CisgICAgUUdyYXBoaWNzV2lkZ2V0OjpzZXRHZW9tZXRyeShyZWN0KTsKKworICAg
IGlmIChkLT5vdmVybGF5KCkpCisgICAgICAgIGQtPm92ZXJsYXkoKS0+cHJlcGFyZUdyYXBoaWNz
SXRlbUdlb21ldHJ5Q2hhbmdlKCk7CisKKyAgICBpZiAoIWQtPnBhZ2UpCisgICAgICAgIHJldHVy
bjsKKworICAgIC8vIE5PVEU6IGNhbGwgZ2VvbWV0cnkoKSBhcyBzZXRHZW9tZXRyeSBlbnN1cmVz
IHRoYXQKKyAgICAvLyB0aGUgZ2VvbWV0cnkgaXMgd2l0aGluIGxlZ2FsIGJvdW5kcyAobWluaW11
bVNpemUsIG1heGltdW1TaXplKQorICAgIFFTaXplIHNpemUgPSBnZW9tZXRyeSgpLnNpemUoKS50
b1NpemUoKTsKKyAgICBkLT5wYWdlLT5zZXRWaWV3cG9ydFNpemUoc2l6ZSk7Cit9CisKKy8qIQor
ICAgIENvbnZlbmllbmNlIHNsb3QgdGhhdCBzdG9wcyBsb2FkaW5nIHRoZSBkb2N1bWVudC4KKwor
ICAgIFxzYSByZWxvYWQoKSwgbG9hZEZpbmlzaGVkKCkKKyovCit2b2lkIFFHcmFwaGljc1dlYlZp
ZXc6OnN0b3AoKQoreworICAgIGlmIChkLT5wYWdlKQorICAgICAgICBkLT5wYWdlLT50cmlnZ2Vy
QWN0aW9uKFFXZWJQYWdlOjpTdG9wKTsKK30KKworLyohCisgICAgQ29udmVuaWVuY2Ugc2xvdCB0
aGF0IGxvYWRzIHRoZSBwcmV2aW91cyBkb2N1bWVudCBpbiB0aGUgbGlzdCBvZiBkb2N1bWVudHMK
KyAgICBidWlsdCBieSBuYXZpZ2F0aW5nIGxpbmtzLiBEb2VzIG5vdGhpbmcgaWYgdGhlcmUgaXMg
bm8gcHJldmlvdXMgZG9jdW1lbnQuCisKKyAgICBcc2EgZm9yd2FyZCgpCisqLwordm9pZCBRR3Jh
cGhpY3NXZWJWaWV3OjpiYWNrKCkKK3sKKyAgICBpZiAoZC0+cGFnZSkKKyAgICAgICAgZC0+cGFn
ZS0+dHJpZ2dlckFjdGlvbihRV2ViUGFnZTo6QmFjayk7Cit9CisKKy8qIQorICAgIENvbnZlbmll
bmNlIHNsb3QgdGhhdCBsb2FkcyB0aGUgbmV4dCBkb2N1bWVudCBpbiB0aGUgbGlzdCBvZiBkb2N1
bWVudHMKKyAgICBidWlsdCBieSBuYXZpZ2F0aW5nIGxpbmtzLiBEb2VzIG5vdGhpbmcgaWYgdGhl
cmUgaXMgbm8gbmV4dCBkb2N1bWVudC4KKworICAgIFxzYSBiYWNrKCkKKyovCit2b2lkIFFHcmFw
aGljc1dlYlZpZXc6OmZvcndhcmQoKQoreworICAgIGlmIChkLT5wYWdlKQorICAgICAgICBkLT5w
YWdlLT50cmlnZ2VyQWN0aW9uKFFXZWJQYWdlOjpGb3J3YXJkKTsKK30KKworLyohCisgICAgUmVs
b2FkcyB0aGUgY3VycmVudCBkb2N1bWVudC4KKworICAgIFxzYSBzdG9wKCksIGxvYWRTdGFydGVk
KCkKKyovCit2b2lkIFFHcmFwaGljc1dlYlZpZXc6OnJlbG9hZCgpCit7CisgICAgaWYgKGQtPnBh
Z2UpCisgICAgICAgIGQtPnBhZ2UtPnRyaWdnZXJBY3Rpb24oUVdlYlBhZ2U6OlJlbG9hZCk7Cit9
CisKKy8qIQorICAgIExvYWRzIHRoZSBzcGVjaWZpZWQgXGEgdXJsIGFuZCBkaXNwbGF5cyBpdC4K
KworICAgIFxub3RlIFRoZSB2aWV3IHJlbWFpbnMgdGhlIHNhbWUgdW50aWwgZW5vdWdoIGRhdGEg
aGFzIGFycml2ZWQgdG8gZGlzcGxheSB0aGUgbmV3IFxhIHVybC4KKworICAgIFxzYSBzZXRVcmwo
KSwgdXJsKCksIHVybENoYW5nZWQoKQorKi8KK3ZvaWQgUUdyYXBoaWNzV2ViVmlldzo6bG9hZChj
b25zdCBRVXJsJiB1cmwpCit7CisgICAgcGFnZSgpLT5tYWluRnJhbWUoKS0+bG9hZCh1cmwpOwor
fQorCisvKiEKKyAgICBcZm4gdm9pZCBRR3JhcGhpY3NXZWJWaWV3Ojpsb2FkKGNvbnN0IFFOZXR3
b3JrUmVxdWVzdCAmcmVxdWVzdCwgUU5ldHdvcmtBY2Nlc3NNYW5hZ2VyOjpPcGVyYXRpb24gb3Bl
cmF0aW9uLCBjb25zdCBRQnl0ZUFycmF5ICZib2R5KQorCisgICAgTG9hZHMgYSBuZXR3b3JrIHJl
cXVlc3QsIFxhIHJlcXVlc3QsIHVzaW5nIHRoZSBtZXRob2Qgc3BlY2lmaWVkIGluIFxhIG9wZXJh
dGlvbi4KKworICAgIFxhIGJvZHkgaXMgb3B0aW9uYWwgYW5kIGlzIG9ubHkgdXNlZCBmb3IgUE9T
VCBvcGVyYXRpb25zLgorCisgICAgXG5vdGUgVGhlIHZpZXcgcmVtYWlucyB0aGUgc2FtZSB1bnRp
bCBlbm91Z2ggZGF0YSBoYXMgYXJyaXZlZCB0byBkaXNwbGF5IHRoZSBuZXcgdXJsLgorCisgICAg
XHNhIHVybCgpLCB1cmxDaGFuZ2VkKCkKKyovCisKK3ZvaWQgUUdyYXBoaWNzV2ViVmlldzo6bG9h
ZChjb25zdCBRTmV0d29ya1JlcXVlc3QmIHJlcXVlc3QsIFFOZXR3b3JrQWNjZXNzTWFuYWdlcjo6
T3BlcmF0aW9uIG9wZXJhdGlvbiwgY29uc3QgUUJ5dGVBcnJheSYgYm9keSkKK3sKKyAgICBwYWdl
KCktPm1haW5GcmFtZSgpLT5sb2FkKHJlcXVlc3QsIG9wZXJhdGlvbiwgYm9keSk7Cit9CisKKy8q
IQorICAgIFNldHMgdGhlIGNvbnRlbnQgb2YgdGhlIHdlYiB2aWV3IHRvIHRoZSBzcGVjaWZpZWQg
XGEgaHRtbC4KKworICAgIEV4dGVybmFsIG9iamVjdHMgc3VjaCBhcyBzdHlsZXNoZWV0cyBvciBp
bWFnZXMgcmVmZXJlbmNlZCBpbiB0aGUgSFRNTAorICAgIGRvY3VtZW50IGFyZSBsb2NhdGVkIHJl
bGF0aXZlIHRvIFxhIGJhc2VVcmwuCisKKyAgICBUaGUgXGEgaHRtbCBpcyBsb2FkZWQgaW1tZWRp
YXRlbHk7IGV4dGVybmFsIG9iamVjdHMgYXJlIGxvYWRlZCBhc3luY2hyb25vdXNseS4KKworICAg
IFdoZW4gdXNpbmcgdGhpcyBtZXRob2QsIFdlYktpdCBhc3N1bWVzIHRoYXQgZXh0ZXJuYWwgcmVz
b3VyY2VzIHN1Y2ggYXMKKyAgICBKYXZhU2NyaXB0IHByb2dyYW1zIG9yIHN0eWxlIHNoZWV0cyBh
cmUgZW5jb2RlZCBpbiBVVEYtOCB1bmxlc3Mgb3RoZXJ3aXNlCisgICAgc3BlY2lmaWVkLiBGb3Ig
ZXhhbXBsZSwgdGhlIGVuY29kaW5nIG9mIGFuIGV4dGVybmFsIHNjcmlwdCBjYW4gYmUgc3BlY2lm
aWVkCisgICAgdGhyb3VnaCB0aGUgY2hhcnNldCBhdHRyaWJ1dGUgb2YgdGhlIEhUTUwgc2NyaXB0
IHRhZy4gQWx0ZXJuYXRpdmVseSwgdGhlCisgICAgZW5jb2RpbmcgY2FuIGFsc28gYmUgc3BlY2lm
aWVkIGJ5IHRoZSB3ZWIgc2VydmVyLgorCisgICAgVGhpcyBpcyBhIGNvbnZlbmllbmNlIGZ1bmN0
aW9uIGVxdWl2YWxlbnQgdG8gc2V0Q29udGVudChodG1sLCAidGV4dC9odG1sIiwgYmFzZVVybCku
CisKKyAgICBcd2FybmluZyBUaGlzIGZ1bmN0aW9uIHdvcmtzIG9ubHkgZm9yIEhUTUwsIGZvciBv
dGhlciBtaW1lIHR5cGVzIChpLmUuIFhIVE1MLCBTVkcpCisgICAgc2V0Q29udGVudCgpIHNob3Vs
ZCBiZSB1c2VkIGluc3RlYWQuCisKKyAgICBcc2EgbG9hZCgpLCBzZXRDb250ZW50KCksIFFXZWJG
cmFtZTo6dG9IdG1sKCksIFFXZWJGcmFtZTo6c2V0Q29udGVudCgpCisqLwordm9pZCBRR3JhcGhp
Y3NXZWJWaWV3OjpzZXRIdG1sKGNvbnN0IFFTdHJpbmcmIGh0bWwsIGNvbnN0IFFVcmwmIGJhc2VV
cmwpCit7CisgICAgcGFnZSgpLT5tYWluRnJhbWUoKS0+c2V0SHRtbChodG1sLCBiYXNlVXJsKTsK
K30KKworLyohCisgICAgU2V0cyB0aGUgY29udGVudCBvZiB0aGUgd2ViIGdyYXBoaWNzaXRlbSB0
byB0aGUgc3BlY2lmaWVkIGNvbnRlbnQgXGEgZGF0YS4gSWYgdGhlIFxhIG1pbWVUeXBlIGFyZ3Vt
ZW50CisgICAgaXMgZW1wdHkgaXQgaXMgY3VycmVudGx5IGFzc3VtZWQgdGhhdCB0aGUgY29udGVu
dCBpcyBIVE1MIGJ1dCBpbiBmdXR1cmUgdmVyc2lvbnMgd2UgbWF5IGludHJvZHVjZQorICAgIGF1
dG8tZGV0ZWN0aW9uLgorCisgICAgRXh0ZXJuYWwgb2JqZWN0cyByZWZlcmVuY2VkIGluIHRoZSBj
b250ZW50IGFyZSBsb2NhdGVkIHJlbGF0aXZlIHRvIFxhIGJhc2VVcmwuCisKKyAgICBUaGUgXGEg
ZGF0YSBpcyBsb2FkZWQgaW1tZWRpYXRlbHk7IGV4dGVybmFsIG9iamVjdHMgYXJlIGxvYWRlZCBh
c3luY2hyb25vdXNseS4KKworICAgIFxzYSBsb2FkKCksIHNldEh0bWwoKSwgUVdlYkZyYW1lOjp0
b0h0bWwoKQorKi8KK3ZvaWQgUUdyYXBoaWNzV2ViVmlldzo6c2V0Q29udGVudChjb25zdCBRQnl0
ZUFycmF5JiBkYXRhLCBjb25zdCBRU3RyaW5nJiBtaW1lVHlwZSwgY29uc3QgUVVybCYgYmFzZVVy
bCkKK3sKKyAgICBwYWdlKCktPm1haW5GcmFtZSgpLT5zZXRDb250ZW50KGRhdGEsIG1pbWVUeXBl
LCBiYXNlVXJsKTsKK30KKworLyohCisgICAgUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHZpZXcn
cyBoaXN0b3J5IG9mIG5hdmlnYXRlZCB3ZWIgcGFnZXMuCisKKyAgICBJdCBpcyBlcXVpdmFsZW50
IHRvCisKKyAgICBcc25pcHBldCB3ZWJraXRzbmlwcGV0cy9xdHdlYmtpdF9xd2Vidmlld19zbmlw
cGV0LmNwcCAwCisqLworUVdlYkhpc3RvcnkqIFFHcmFwaGljc1dlYlZpZXc6Omhpc3RvcnkoKSBj
b25zdAoreworICAgIHJldHVybiBwYWdlKCktPmhpc3RvcnkoKTsKK30KKworLyohCisgICAgXHBy
b3BlcnR5IFFHcmFwaGljc1dlYlZpZXc6Om1vZGlmaWVkCisgICAgXGJyaWVmIHdoZXRoZXIgdGhl
IGRvY3VtZW50IHdhcyBtb2RpZmllZCBieSB0aGUgdXNlcgorCisgICAgUGFydHMgb2YgSFRNTCBk
b2N1bWVudHMgY2FuIGJlIGVkaXRhYmxlIGZvciBleGFtcGxlIHRocm91Z2ggdGhlCisgICAgXGN7
Y29udGVudGVkaXRhYmxlfSBhdHRyaWJ1dGUgb24gSFRNTCBlbGVtZW50cy4KKworICAgIEJ5IGRl
ZmF1bHQsIHRoaXMgcHJvcGVydHkgaXMgZmFsc2UuCisqLworYm9vbCBRR3JhcGhpY3NXZWJWaWV3
Ojppc01vZGlmaWVkKCkgY29uc3QKK3sKKyAgICBpZiAoZC0+cGFnZSkKKyAgICAgICAgcmV0dXJu
IGQtPnBhZ2UtPmlzTW9kaWZpZWQoKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qIQorICAg
IFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSB2aWV3L3BhZ2Ugc3BlY2lmaWMgc2V0dGluZ3Mgb2Jq
ZWN0LgorCisgICAgSXQgaXMgZXF1aXZhbGVudCB0bworCisgICAgXHNuaXBwZXQgd2Via2l0c25p
cHBldHMvcXR3ZWJraXRfcXdlYnZpZXdfc25pcHBldC5jcHAgMQorCisgICAgXHNhIFFXZWJTZXR0
aW5nczo6Z2xvYmFsU2V0dGluZ3MoKQorKi8KK1FXZWJTZXR0aW5ncyogUUdyYXBoaWNzV2ViVmll
dzo6c2V0dGluZ3MoKSBjb25zdAoreworICAgIHJldHVybiBwYWdlKCktPnNldHRpbmdzKCk7Cit9
CisKKy8qIQorICAgIFJldHVybnMgYSBwb2ludGVyIHRvIGEgUUFjdGlvbiB0aGF0IGVuY2Fwc3Vs
YXRlcyB0aGUgc3BlY2lmaWVkIHdlYiBhY3Rpb24gXGEgYWN0aW9uLgorKi8KK1FBY3Rpb24gKlFH
cmFwaGljc1dlYlZpZXc6OnBhZ2VBY3Rpb24oUVdlYlBhZ2U6OldlYkFjdGlvbiBhY3Rpb24pIGNv
bnN0Cit7CisjaWZkZWYgUVRfTk9fQUNUSU9OCisgICAgUV9VTlVTRUQoYWN0aW9uKQorICAgIHJl
dHVybiAwOworI2Vsc2UKKyAgICByZXR1cm4gcGFnZSgpLT5hY3Rpb24oYWN0aW9uKTsKKyNlbmRp
ZgorfQorCisvKiEKKyAgICBUcmlnZ2VycyB0aGUgc3BlY2lmaWVkIFxhIGFjdGlvbi4gSWYgaXQg
aXMgYSBjaGVja2FibGUgYWN0aW9uIHRoZSBzcGVjaWZpZWQKKyAgICBcYSBjaGVja2VkIHN0YXRl
IGlzIGFzc3VtZWQuCisKKyAgICBcc2EgcGFnZUFjdGlvbigpCisqLwordm9pZCBRR3JhcGhpY3NX
ZWJWaWV3Ojp0cmlnZ2VyUGFnZUFjdGlvbihRV2ViUGFnZTo6V2ViQWN0aW9uIGFjdGlvbiwgYm9v
bCBjaGVja2VkKQoreworICAgIHBhZ2UoKS0+dHJpZ2dlckFjdGlvbihhY3Rpb24sIGNoZWNrZWQp
OworfQorCisvKiEKKyAgICBGaW5kcyB0aGUgc3BlY2lmaWVkIHN0cmluZywgXGEgc3ViU3RyaW5n
LCBpbiB0aGUgcGFnZSwgdXNpbmcgdGhlIGdpdmVuIFxhIG9wdGlvbnMuCisKKyAgICBJZiB0aGUg
SGlnaGxpZ2h0QWxsT2NjdXJyZW5jZXMgZmxhZyBpcyBwYXNzZWQsIHRoZSBmdW5jdGlvbiB3aWxs
IGhpZ2hsaWdodCBhbGwgb2NjdXJyZW5jZXMKKyAgICB0aGF0IGV4aXN0IGluIHRoZSBwYWdlLiBB
bGwgc3Vic2VxdWVudCBjYWxscyB3aWxsIGV4dGVuZCB0aGUgaGlnaGxpZ2h0LCByYXRoZXIgdGhh
bgorICAgIHJlcGxhY2UgaXQsIHdpdGggb2NjdXJyZW5jZXMgb2YgdGhlIG5ldyBzdHJpbmcuCisK
KyAgICBJZiB0aGUgSGlnaGxpZ2h0QWxsT2NjdXJyZW5jZXMgZmxhZyBpcyBub3QgcGFzc2VkLCB0
aGUgZnVuY3Rpb24gd2lsbCBzZWxlY3QgYW4gb2NjdXJyZW5jZQorICAgIGFuZCBhbGwgc3Vic2Vx
dWVudCBjYWxscyB3aWxsIHJlcGxhY2UgdGhlIGN1cnJlbnQgb2NjdXJyZW5jZSB3aXRoIHRoZSBu
ZXh0IG9uZS4KKworICAgIFRvIGNsZWFyIHRoZSBzZWxlY3Rpb24sIGp1c3QgcGFzcyBhbiBlbXB0
eSBzdHJpbmcuCisKKyAgICBSZXR1cm5zIHRydWUgaWYgXGEgc3ViU3RyaW5nIHdhcyBmb3VuZDsg
b3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuCisKKyAgICBcc2EgUVdlYlBhZ2U6OnNlbGVjdGVkVGV4
dCgpLCBRV2ViUGFnZTo6c2VsZWN0aW9uQ2hhbmdlZCgpCisqLworYm9vbCBRR3JhcGhpY3NXZWJW
aWV3OjpmaW5kVGV4dChjb25zdCBRU3RyaW5nICZzdWJTdHJpbmcsIFFXZWJQYWdlOjpGaW5kRmxh
Z3Mgb3B0aW9ucykKK3sKKyAgICBpZiAoZC0+cGFnZSkKKyAgICAgICAgcmV0dXJuIGQtPnBhZ2Ut
PmZpbmRUZXh0KHN1YlN0cmluZywgb3B0aW9ucyk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisv
KiEKKyAgICBccHJvcGVydHkgUUdyYXBoaWNzV2ViVmlldzo6cmVzaXplc1RvQ29udGVudHMKKyAg
ICBcYnJpZWYgd2hldGhlciB0aGUgc2l6ZSBvZiB0aGUgUUdyYXBoaWNzV2ViVmlldyBhbmQgaXRz
IHZpZXdwb3J0IGNoYW5nZXMgdG8gbWF0Y2ggdGhlIGNvbnRlbnRzIHNpemUKKyAgICBcc2luY2Ug
NC43IAorCisgICAgSWYgdGhpcyBwcm9wZXJ0eSBpcyBzZXQsIHRoZSBRR3JhcGhpY3NXZWJWaWV3
IHdpbGwgYXV0b21hdGljYWxseSBjaGFuZ2UgaXRzCisgICAgc2l6ZSB0byBtYXRjaCB0aGUgc2l6
ZSBvZiB0aGUgbWFpbiBmcmFtZSBjb250ZW50cy4gQXMgYSByZXN1bHQgdGhlIHRvcCBsZXZlbCBm
cmFtZQorICAgIHdpbGwgbmV2ZXIgaGF2ZSBzY3JvbGxiYXJzLiBJdCB3aWxsIGFsc28gbWFrZSBD
U1MgZml4ZWQgcG9zaXRpb25pbmcgdG8gYmVoYXZlIGxpa2UgYWJzb2x1dGUgcG9zaXRpb25pbmcK
KyAgICB3aXRoIGVsZW1lbnRzIHBvc2l0aW9uZWQgcmVsYXRpdmUgdG8gdGhlIGRvY3VtZW50IGlu
c3RlYWQgb2YgdGhlIHZpZXdwb3J0LgorCisgICAgVGhpcyBwcm9wZXJ0eSBzaG91bGQgYmUgdXNl
ZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBRV2ViUGFnZTo6cHJlZmVycmVkQ29udGVudHNTaXpl
IHByb3BlcnR5LgorICAgIElmIG5vdCBleHBsaWNpdGx5IHNldCwgdGhlIHByZWZlcnJlZENvbnRl
bnRzU2l6ZSBpcyBhdXRvbWF0aWNhbGx5IHNldCB0byBhIHJlYXNvbmFibGUgdmFsdWUuCisKKyAg
ICBcc2EgUVdlYlBhZ2U6OnNldFByZWZlcnJlZENvbnRlbnRzU2l6ZSgpCisqLwordm9pZCBRR3Jh
cGhpY3NXZWJWaWV3OjpzZXRSZXNpemVzVG9Db250ZW50cyhib29sIGVuYWJsZWQpCit7CisgICAg
aWYgKGQtPnJlc2l6ZXNUb0NvbnRlbnRzID09IGVuYWJsZWQpCisgICAgICAgIHJldHVybjsKKyAg
ICBkLT5yZXNpemVzVG9Db250ZW50cyA9IGVuYWJsZWQ7CisgICAgaWYgKGQtPnBhZ2UpCisgICAg
ICAgIGQtPnVwZGF0ZVJlc2l6ZXNUb0NvbnRlbnRzRm9yUGFnZSgpOworfQorCitib29sIFFHcmFw
aGljc1dlYlZpZXc6OnJlc2l6ZXNUb0NvbnRlbnRzKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZC0+
cmVzaXplc1RvQ29udGVudHM7Cit9CisKKy8qIQorICAgIFxwcm9wZXJ0eSBRR3JhcGhpY3NXZWJW
aWV3Ojp0aWxlZEJhY2tpbmdTdG9yZUZyb3plbgorICAgIFxicmllZiB3aGV0aGVyIHRoZSB0aWxl
ZCBiYWNraW5nIHN0b3JlIHVwZGF0ZXMgaXRzIGNvbnRlbnRzCisgICAgXHNpbmNlIDQuNyAKKwor
ICAgIElmIHRoZSB0aWxlZCBiYWNraW5nIHN0b3JlIGlzIGVuYWJsZWQgdXNpbmcgUVdlYlNldHRp
bmdzOjpUaWxlZEJhY2tpbmdTdG9yZUVuYWJsZWQgYXR0cmlidXRlLCB0aGlzIHByb3BlcnR5Cisg
ICAgY2FuIGJlIHVzZWQgdG8gZGlzYWJsZSBiYWNraW5nIHN0b3JlIHVwZGF0ZXMgdGVtcG9yYXJp
bHkuIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgZXhhbXBsZSBmb3IgcnVubmluZworICAgIGEgc21v
b3RoIGFuaW1hdGlvbiB0aGF0IGNoYW5nZXMgdGhlIHNjYWxlIG9mIHRoZSBRR3JhcGhpY3NXZWJW
aWV3LgorIAorICAgIFdoZW4gdGhlIGJhY2tpbmcgc3RvcmUgaXMgdW5mcm96ZW4sIGl0cyBjb250
ZW50cyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgdXBkYXRlZCB0byBtYXRjaCB0aGUgY3VycmVudAor
ICAgIHN0YXRlIG9mIHRoZSBkb2N1bWVudC4gSWYgdGhlIFFHcmFwaGljc1dlYlZpZXcgc2NhbGUg
d2FzIGNoYW5nZWQsIHRoZSBiYWNraW5nIHN0b3JlIGlzIGFsc28KKyAgICByZS1yZW5kZXJlZCB1
c2luZyB0aGUgbmV3IHNjYWxlLgorIAorICAgIElmIHRoZSB0aWxlZCBiYWNraW5nIHN0b3JlIGlz
IG5vdCBlbmFibGVkLCB0aGlzIHByb3BlcnR5IGRvZXMgbm90aGluZy4KKworICAgIFxzYSBRV2Vi
U2V0dGluZ3M6OlRpbGVkQmFja2luZ1N0b3JlRW5hYmxlZAorICAgIFxzYSBRR3JhcGhpY3NPYmpl
Y3Q6OnNjYWxlCisqLworYm9vbCBRR3JhcGhpY3NXZWJWaWV3Ojppc1RpbGVkQmFja2luZ1N0b3Jl
RnJvemVuKCkgY29uc3QKK3sKKyNpZiBVU0UoVElMRURfQkFDS0lOR19TVE9SRSkKKyAgICByZXR1
cm4gcGFnZSgpLT5kLT5tYWluRnJhbWVBZGFwdGVyKCktPnRpbGVkQmFja2luZ1N0b3JlRnJvemVu
KCk7CisjZWxzZQorICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorfQorCit2b2lkIFFHcmFwaGlj
c1dlYlZpZXc6OnNldFRpbGVkQmFja2luZ1N0b3JlRnJvemVuKGJvb2wgZnJvemVuKQoreworI2lm
IFVTRShUSUxFRF9CQUNLSU5HX1NUT1JFKQorICAgIHBhZ2UoKS0+ZC0+bWFpbkZyYW1lQWRhcHRl
cigpLT5zZXRUaWxlZEJhY2tpbmdTdG9yZUZyb3plbihmcm96ZW4pOworI2Vsc2UKKyAgICBVTlVT
RURfUEFSQU0oZnJvemVuKTsKKyNlbmRpZgorfQorCisvKiEgXHJlaW1wCisqLwordm9pZCBRR3Jh
cGhpY3NXZWJWaWV3Ojpob3Zlck1vdmVFdmVudChRR3JhcGhpY3NTY2VuZUhvdmVyRXZlbnQqIGV2
KQoreworICAgIGlmIChkLT5wYWdlKSB7CisgICAgICAgIGNvbnN0IGJvb2wgYWNjZXB0ZWQgPSBl
di0+aXNBY2NlcHRlZCgpOworICAgICAgICBRTW91c2VFdmVudCBtZSA9IFFNb3VzZUV2ZW50KFFF
dmVudDo6TW91c2VNb3ZlLCBldi0+cG9zKCkudG9Qb2ludCgpLCBRdDo6Tm9CdXR0b24sIFF0OjpO
b0J1dHRvbiwgUXQ6Ok5vTW9kaWZpZXIpOworICAgICAgICBkLT5wYWdlLT5ldmVudCgmbWUpOwor
ICAgICAgICBldi0+c2V0QWNjZXB0ZWQoYWNjZXB0ZWQpOworICAgIH0KKworICAgIGlmICghZXYt
PmlzQWNjZXB0ZWQoKSkKKyAgICAgICAgUUdyYXBoaWNzSXRlbTo6aG92ZXJNb3ZlRXZlbnQoZXYp
OworfQorCisvKiEgXHJlaW1wCisqLwordm9pZCBRR3JhcGhpY3NXZWJWaWV3Ojpob3ZlckxlYXZl
RXZlbnQoUUdyYXBoaWNzU2NlbmVIb3ZlckV2ZW50KiBldikKK3sKKyAgICBRX1VOVVNFRChldik7
Cit9CisKKy8qISBccmVpbXAKKyovCit2b2lkIFFHcmFwaGljc1dlYlZpZXc6Om1vdXNlTW92ZUV2
ZW50KFFHcmFwaGljc1NjZW5lTW91c2VFdmVudCogZXYpCit7CisgICAgaWYgKGQtPnBhZ2UpIHsK
KyAgICAgICAgY29uc3QgYm9vbCBhY2NlcHRlZCA9IGV2LT5pc0FjY2VwdGVkKCk7CisgICAgICAg
IGQtPnBhZ2UtPmV2ZW50KGV2KTsKKyAgICAgICAgZXYtPnNldEFjY2VwdGVkKGFjY2VwdGVkKTsK
KyAgICB9CisKKyAgICBpZiAoIWV2LT5pc0FjY2VwdGVkKCkpCisgICAgICAgIFFHcmFwaGljc0l0
ZW06Om1vdXNlTW92ZUV2ZW50KGV2KTsKK30KKworLyohIFxyZWltcAorKi8KK3ZvaWQgUUdyYXBo
aWNzV2ViVmlldzo6bW91c2VQcmVzc0V2ZW50KFFHcmFwaGljc1NjZW5lTW91c2VFdmVudCogZXYp
Cit7CisgICAgaWYgKGQtPnBhZ2UpIHsKKyAgICAgICAgY29uc3QgYm9vbCBhY2NlcHRlZCA9IGV2
LT5pc0FjY2VwdGVkKCk7CisgICAgICAgIGQtPnBhZ2UtPmV2ZW50KGV2KTsKKyAgICAgICAgZXYt
PnNldEFjY2VwdGVkKGFjY2VwdGVkKTsKKyAgICB9CisKKyAgICBpZiAoIWV2LT5pc0FjY2VwdGVk
KCkpCisgICAgICAgIFFHcmFwaGljc0l0ZW06Om1vdXNlUHJlc3NFdmVudChldik7Cit9CisKKy8q
ISBccmVpbXAKKyovCit2b2lkIFFHcmFwaGljc1dlYlZpZXc6Om1vdXNlUmVsZWFzZUV2ZW50KFFH
cmFwaGljc1NjZW5lTW91c2VFdmVudCogZXYpCit7CisgICAgaWYgKGQtPnBhZ2UpIHsKKyAgICAg
ICAgY29uc3QgYm9vbCBhY2NlcHRlZCA9IGV2LT5pc0FjY2VwdGVkKCk7CisgICAgICAgIGQtPnBh
Z2UtPmV2ZW50KGV2KTsKKyAgICAgICAgZXYtPnNldEFjY2VwdGVkKGFjY2VwdGVkKTsKKyAgICB9
CisKKyAgICBpZiAoIWV2LT5pc0FjY2VwdGVkKCkpCisgICAgICAgIFFHcmFwaGljc0l0ZW06Om1v
dXNlUmVsZWFzZUV2ZW50KGV2KTsKK30KKworLyohIFxyZWltcAorKi8KK3ZvaWQgUUdyYXBoaWNz
V2ViVmlldzo6bW91c2VEb3VibGVDbGlja0V2ZW50KFFHcmFwaGljc1NjZW5lTW91c2VFdmVudCog
ZXYpCit7CisgICAgaWYgKGQtPnBhZ2UpIHsKKyAgICAgICAgY29uc3QgYm9vbCBhY2NlcHRlZCA9
IGV2LT5pc0FjY2VwdGVkKCk7CisgICAgICAgIGQtPnBhZ2UtPmV2ZW50KGV2KTsKKyAgICAgICAg
ZXYtPnNldEFjY2VwdGVkKGFjY2VwdGVkKTsKKyAgICB9CisKKyAgICBpZiAoIWV2LT5pc0FjY2Vw
dGVkKCkpCisgICAgICAgIFFHcmFwaGljc0l0ZW06Om1vdXNlRG91YmxlQ2xpY2tFdmVudChldik7
Cit9CisKKy8qISBccmVpbXAKKyovCit2b2lkIFFHcmFwaGljc1dlYlZpZXc6OmtleVByZXNzRXZl
bnQoUUtleUV2ZW50KiBldikKK3sKKyAgICBpZiAoZC0+cGFnZSkKKyAgICAgICAgZC0+cGFnZS0+
ZXZlbnQoZXYpOworCisgICAgaWYgKCFldi0+aXNBY2NlcHRlZCgpKQorICAgICAgICBRR3JhcGhp
Y3NJdGVtOjprZXlQcmVzc0V2ZW50KGV2KTsKK30KKworLyohIFxyZWltcAorKi8KK3ZvaWQgUUdy
YXBoaWNzV2ViVmlldzo6a2V5UmVsZWFzZUV2ZW50KFFLZXlFdmVudCogZXYpCit7CisgICAgaWYg
KGQtPnBhZ2UpCisgICAgICAgIGQtPnBhZ2UtPmV2ZW50KGV2KTsKKworICAgIGlmICghZXYtPmlz
QWNjZXB0ZWQoKSkKKyAgICAgICAgUUdyYXBoaWNzSXRlbTo6a2V5UmVsZWFzZUV2ZW50KGV2KTsK
K30KKworLyohIFxyZWltcAorKi8KK3ZvaWQgUUdyYXBoaWNzV2ViVmlldzo6Zm9jdXNJbkV2ZW50
KFFGb2N1c0V2ZW50KiBldikKK3sKKyAgICBpZiAoZC0+cGFnZSkKKyAgICAgICAgZC0+cGFnZS0+
ZXZlbnQoZXYpOworICAgIGVsc2UKKyAgICAgICAgUUdyYXBoaWNzSXRlbTo6Zm9jdXNJbkV2ZW50
KGV2KTsKK30KKworLyohIFxyZWltcAorKi8KK3ZvaWQgUUdyYXBoaWNzV2ViVmlldzo6Zm9jdXNP
dXRFdmVudChRRm9jdXNFdmVudCogZXYpCit7CisgICAgaWYgKGQtPnBhZ2UpCisgICAgICAgIGQt
PnBhZ2UtPmV2ZW50KGV2KTsKKyAgICBlbHNlCisgICAgICAgIFFHcmFwaGljc0l0ZW06OmZvY3Vz
T3V0RXZlbnQoZXYpOworfQorCisvKiEgXHJlaW1wCisqLworYm9vbCBRR3JhcGhpY3NXZWJWaWV3
Ojpmb2N1c05leHRQcmV2Q2hpbGQoYm9vbCBuZXh0KQoreworICAgIGlmIChkLT5wYWdlKQorICAg
ICAgICByZXR1cm4gZC0+cGFnZS0+Zm9jdXNOZXh0UHJldkNoaWxkKG5leHQpOworCisgICAgcmV0
dXJuIFFHcmFwaGljc1dpZGdldDo6Zm9jdXNOZXh0UHJldkNoaWxkKG5leHQpOworfQorCisvKiEg
XHJlaW1wCisqLwordm9pZCBRR3JhcGhpY3NXZWJWaWV3OjpkcmFnRW50ZXJFdmVudChRR3JhcGhp
Y3NTY2VuZURyYWdEcm9wRXZlbnQqIGV2KQoreworI2lmbmRlZiBRVF9OT19EUkFHQU5ERFJPUAor
ICAgIGlmIChkLT5wYWdlKQorICAgICAgICBkLT5wYWdlLT5ldmVudChldik7CisjZWxzZQorICAg
IFFfVU5VU0VEKGV2KTsKKyNlbmRpZgorfQorCisvKiEgXHJlaW1wCisqLwordm9pZCBRR3JhcGhp
Y3NXZWJWaWV3OjpkcmFnTGVhdmVFdmVudChRR3JhcGhpY3NTY2VuZURyYWdEcm9wRXZlbnQqIGV2
KQoreworI2lmbmRlZiBRVF9OT19EUkFHQU5ERFJPUAorICAgIGlmIChkLT5wYWdlKSB7CisgICAg
ICAgIGNvbnN0IGJvb2wgYWNjZXB0ZWQgPSBldi0+aXNBY2NlcHRlZCgpOworICAgICAgICBkLT5w
YWdlLT5ldmVudChldik7CisgICAgICAgIGV2LT5zZXRBY2NlcHRlZChhY2NlcHRlZCk7CisgICAg
fQorCisgICAgaWYgKCFldi0+aXNBY2NlcHRlZCgpKQorICAgICAgICBRR3JhcGhpY3NXaWRnZXQ6
OmRyYWdMZWF2ZUV2ZW50KGV2KTsKKyNlbHNlCisgICAgUV9VTlVTRUQoZXYpOworI2VuZGlmCit9
CisKKy8qISBccmVpbXAKKyovCit2b2lkIFFHcmFwaGljc1dlYlZpZXc6OmRyYWdNb3ZlRXZlbnQo
UUdyYXBoaWNzU2NlbmVEcmFnRHJvcEV2ZW50KiBldikKK3sKKyNpZm5kZWYgUVRfTk9fRFJBR0FO
RERST1AKKyAgICBpZiAoZC0+cGFnZSkgeworICAgICAgICBjb25zdCBib29sIGFjY2VwdGVkID0g
ZXYtPmlzQWNjZXB0ZWQoKTsKKyAgICAgICAgZC0+cGFnZS0+ZXZlbnQoZXYpOworICAgICAgICBl
di0+c2V0QWNjZXB0ZWQoYWNjZXB0ZWQpOworICAgIH0KKworICAgIGlmICghZXYtPmlzQWNjZXB0
ZWQoKSkKKyAgICAgICAgUUdyYXBoaWNzV2lkZ2V0OjpkcmFnTW92ZUV2ZW50KGV2KTsKKyNlbHNl
CisgICAgUV9VTlVTRUQoZXYpOworI2VuZGlmCit9CisKKy8qISBccmVpbXAKKyovCit2b2lkIFFH
cmFwaGljc1dlYlZpZXc6OmRyb3BFdmVudChRR3JhcGhpY3NTY2VuZURyYWdEcm9wRXZlbnQqIGV2
KQoreworI2lmbmRlZiBRVF9OT19EUkFHQU5ERFJPUAorICAgIGlmIChkLT5wYWdlKSB7CisgICAg
ICAgIGNvbnN0IGJvb2wgYWNjZXB0ZWQgPSBldi0+aXNBY2NlcHRlZCgpOworICAgICAgICBkLT5w
YWdlLT5ldmVudChldik7CisgICAgICAgIGV2LT5zZXRBY2NlcHRlZChhY2NlcHRlZCk7CisgICAg
fQorCisgICAgaWYgKCFldi0+aXNBY2NlcHRlZCgpKQorICAgICAgICBRR3JhcGhpY3NXaWRnZXQ6
OmRyb3BFdmVudChldik7CisjZWxzZQorICAgIFFfVU5VU0VEKGV2KTsKKyNlbmRpZgorfQorCisj
aWZuZGVmIFFUX05PX0NPTlRFWFRNRU5VCisvKiEgXHJlaW1wCisqLwordm9pZCBRR3JhcGhpY3NX
ZWJWaWV3Ojpjb250ZXh0TWVudUV2ZW50KFFHcmFwaGljc1NjZW5lQ29udGV4dE1lbnVFdmVudCog
ZXYpCit7CisgICAgaWYgKGQtPnBhZ2UpIHsKKyAgICAgICAgY29uc3QgYm9vbCBhY2NlcHRlZCA9
IGV2LT5pc0FjY2VwdGVkKCk7CisgICAgICAgIGQtPnBhZ2UtPmV2ZW50KGV2KTsKKyAgICAgICAg
ZXYtPnNldEFjY2VwdGVkKGFjY2VwdGVkKTsKKyAgICB9Cit9CisjZW5kaWYgLy8gUVRfTk9fQ09O
VEVYVE1FTlUKKworI2lmbmRlZiBRVF9OT19XSEVFTEVWRU5UCisvKiEgXHJlaW1wCisqLwordm9p
ZCBRR3JhcGhpY3NXZWJWaWV3Ojp3aGVlbEV2ZW50KFFHcmFwaGljc1NjZW5lV2hlZWxFdmVudCog
ZXYpCit7CisgICAgaWYgKGQtPnBhZ2UpIHsKKyAgICAgICAgY29uc3QgYm9vbCBhY2NlcHRlZCA9
IGV2LT5pc0FjY2VwdGVkKCk7CisgICAgICAgIGQtPnBhZ2UtPmV2ZW50KGV2KTsKKyAgICAgICAg
ZXYtPnNldEFjY2VwdGVkKGFjY2VwdGVkKTsKKyAgICB9CisKKyAgICBpZiAoIWV2LT5pc0FjY2Vw
dGVkKCkpCisgICAgICAgIFFHcmFwaGljc0l0ZW06OndoZWVsRXZlbnQoZXYpOworfQorI2VuZGlm
IC8vIFFUX05PX1dIRUVMRVZFTlQKKworLyohIFxyZWltcAorKi8KK3ZvaWQgUUdyYXBoaWNzV2Vi
Vmlldzo6aW5wdXRNZXRob2RFdmVudChRSW5wdXRNZXRob2RFdmVudCogZXYpCit7CisgICAgaWYg
KGQtPnBhZ2UpCisgICAgICAgIGQtPnBhZ2UtPmV2ZW50KGV2KTsKKworICAgIGlmICghZXYtPmlz
QWNjZXB0ZWQoKSkKKyAgICAgICAgUUdyYXBoaWNzSXRlbTo6aW5wdXRNZXRob2RFdmVudChldik7
Cit9CisKKy8qIQorICAgIFxmbiB2b2lkIFFHcmFwaGljc1dlYlZpZXc6OnN0YXR1c0Jhck1lc3Nh
Z2UoY29uc3QgUVN0cmluZyYgdGV4dCkKKworICAgIFRoaXMgc2lnbmFsIGlzIGVtaXR0ZWQgd2hl
biB0aGUgc3RhdHVzYmFyIFxhIHRleHQgaXMgY2hhbmdlZCBieSB0aGUgcGFnZS4KKyovCisKKy8q
IQorICAgIFxmbiB2b2lkIFFHcmFwaGljc1dlYlZpZXc6OmxvYWRQcm9ncmVzcyhpbnQgcHJvZ3Jl
c3MpCisKKyAgICBUaGlzIHNpZ25hbCBpcyBlbWl0dGVkIGV2ZXJ5IHRpbWUgYW4gZWxlbWVudCBp
biB0aGUgd2ViIHBhZ2UKKyAgICBjb21wbGV0ZXMgbG9hZGluZyBhbmQgdGhlIG92ZXJhbGwgbG9h
ZGluZyBwcm9ncmVzcyBhZHZhbmNlcy4KKworICAgIFRoaXMgc2lnbmFsIHRyYWNrcyB0aGUgcHJv
Z3Jlc3Mgb2YgYWxsIGNoaWxkIGZyYW1lcy4KKworICAgIFRoZSBjdXJyZW50IHZhbHVlIGlzIHBy
b3ZpZGVkIGJ5IFxhIHByb2dyZXNzIGFuZCBzY2FsZXMgZnJvbSAwIHRvIDEwMCwKKyAgICB3aGlj
aCBpcyB0aGUgZGVmYXVsdCByYW5nZSBvZiBRUHJvZ3Jlc3NCYXIuCisKKyAgICBcc2EgbG9hZFN0
YXJ0ZWQoKSwgbG9hZEZpbmlzaGVkKCkKKyovCisKKy8qIQorICAgIFxmbiB2b2lkIFFHcmFwaGlj
c1dlYlZpZXc6OmxpbmtDbGlja2VkKGNvbnN0IFFVcmwgJnVybCkKKworICAgIFRoaXMgc2lnbmFs
IGlzIGVtaXR0ZWQgd2hlbmV2ZXIgdGhlIHVzZXIgY2xpY2tzIG9uIGEgbGluayBhbmQgdGhlIHBh
Z2UncyBsaW5rRGVsZWdhdGlvblBvbGljeQorICAgIHByb3BlcnR5IGlzIHNldCB0byBkZWxlZ2F0
ZSB0aGUgbGluayBoYW5kbGluZyBmb3IgdGhlIHNwZWNpZmllZCBcYSB1cmwuCisKKyAgICBcc2Eg
UVdlYlBhZ2U6OmxpbmtEZWxlZ2F0aW9uUG9saWN5KCkKKyovCisKKyNlbmRpZiAvLyBRVF9OT19H
UkFQSElDU1ZJRVcKKworI2luY2x1ZGUgIm1vY19xZ3JhcGhpY3N3ZWJ2aWV3LmNwcCIKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJLaXQvcXQvV2lkZ2V0QXBpL3FncmFwaGljc3dlYnZpZXcuaCBiL1Nv
dXJjZS9XZWJLaXQvcXQvV2lkZ2V0QXBpL3FncmFwaGljc3dlYnZpZXcuaApuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi41
YzViNjY2ZDEwNGNhYWFiNmRkMDRiOWI2MmI2NGVmNzM3Y2YxOWRkCi0tLSAvZGV2L251bGwKKysr
IGIvU291cmNlL1dlYktpdC9xdC9XaWRnZXRBcGkvcWdyYXBoaWNzd2Vidmlldy5oCkBAIC0wLDAg
KzEsMTY0IEBACisvKgorICAgIENvcHlyaWdodCAoQykgMjAwOSBOb2tpYSBDb3Jwb3JhdGlvbiBh
bmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNv
ZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5k
ZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vu
c2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgor
ICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0
ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9w
ZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsg
d2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZ
IG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBM
aWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlv
dSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwg
UHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxl
IENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZv
dW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgICAgQm9z
dG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisqLworCisjaWZuZGVmIFFHcmFwaGljc1dlYlZpZXdf
aAorI2RlZmluZSBRR3JhcGhpY3NXZWJWaWV3X2gKKworI2luY2x1ZGUgPFF0V2ViS2l0L3F3ZWJr
aXRnbG9iYWwuaD4KKyNpbmNsdWRlIDxRdFdlYktpdFdpZGdldHMvcXdlYnBhZ2UuaD4KKyNpbmNs
dWRlIDxRdENvcmUvcXVybC5oPgorI2luY2x1ZGUgPFF0R3VpL3FldmVudC5oPgorI2luY2x1ZGUg
PFF0R3VpL3FpY29uLmg+CisjaW5jbHVkZSA8UXRHdWkvcXBhaW50ZXIuaD4KKyNpbmNsdWRlIDxR
dE5ldHdvcmsvcW5ldHdvcmthY2Nlc3NtYW5hZ2VyLmg+CisjaW5jbHVkZSA8UXRXaWRnZXRzL3Fn
cmFwaGljc3dpZGdldC5oPgorCisjaWYgIWRlZmluZWQoUVRfTk9fR1JBUEhJQ1NWSUVXKQorCitj
bGFzcyBRV2ViUGFnZTsKK2NsYXNzIFFXZWJIaXN0b3J5OworY2xhc3MgUVdlYlNldHRpbmdzOwor
CitjbGFzcyBRR3JhcGhpY3NXZWJWaWV3UHJpdmF0ZTsKKworY2xhc3MgUVdFQktJVF9FWFBPUlQg
UUdyYXBoaWNzV2ViVmlldyA6IHB1YmxpYyBRR3JhcGhpY3NXaWRnZXQgeworICAgIFFfT0JKRUNU
CisKKyAgICBRX1BST1BFUlRZKFFTdHJpbmcgdGl0bGUgUkVBRCB0aXRsZSBOT1RJRlkgdGl0bGVD
aGFuZ2VkKQorICAgIFFfUFJPUEVSVFkoUUljb24gaWNvbiBSRUFEIGljb24gTk9USUZZIGljb25D
aGFuZ2VkKQorICAgIFFfUFJPUEVSVFkocXJlYWwgem9vbUZhY3RvciBSRUFEIHpvb21GYWN0b3Ig
V1JJVEUgc2V0Wm9vbUZhY3RvcikKKworICAgIFFfUFJPUEVSVFkoUVVybCB1cmwgUkVBRCB1cmwg
V1JJVEUgc2V0VXJsIE5PVElGWSB1cmxDaGFuZ2VkKQorCisgICAgUV9QUk9QRVJUWShib29sIG1v
ZGlmaWVkIFJFQUQgaXNNb2RpZmllZCkKKyAgICBRX1BST1BFUlRZKGJvb2wgcmVzaXplc1RvQ29u
dGVudHMgUkVBRCByZXNpemVzVG9Db250ZW50cyBXUklURSBzZXRSZXNpemVzVG9Db250ZW50cykK
KyAgICBRX1BST1BFUlRZKGJvb2wgdGlsZWRCYWNraW5nU3RvcmVGcm96ZW4gUkVBRCBpc1RpbGVk
QmFja2luZ1N0b3JlRnJvemVuIFdSSVRFIHNldFRpbGVkQmFja2luZ1N0b3JlRnJvemVuKQorCisg
ICAgUV9QUk9QRVJUWShRUGFpbnRlcjo6UmVuZGVySGludHMgcmVuZGVySGludHMgUkVBRCByZW5k
ZXJIaW50cyBXUklURSBzZXRSZW5kZXJIaW50cykKKyAgICBRX0ZMQUdTKFFQYWludGVyOjpSZW5k
ZXJIaW50cykKKworcHVibGljOgorICAgIGV4cGxpY2l0IFFHcmFwaGljc1dlYlZpZXcoUUdyYXBo
aWNzSXRlbSogcGFyZW50ID0gMCk7CisgICAgflFHcmFwaGljc1dlYlZpZXcoKTsKKworICAgIFFX
ZWJQYWdlKiBwYWdlKCkgY29uc3Q7CisgICAgdm9pZCBzZXRQYWdlKFFXZWJQYWdlKik7CisKKyAg
ICBRVXJsIHVybCgpIGNvbnN0OworICAgIHZvaWQgc2V0VXJsKGNvbnN0IFFVcmwmKTsKKworICAg
IFFTdHJpbmcgdGl0bGUoKSBjb25zdDsKKyAgICBRSWNvbiBpY29uKCkgY29uc3Q7CisKKyAgICBx
cmVhbCB6b29tRmFjdG9yKCkgY29uc3Q7CisgICAgdm9pZCBzZXRab29tRmFjdG9yKHFyZWFsKTsK
KworICAgIGJvb2wgaXNNb2RpZmllZCgpIGNvbnN0OworCisgICAgdm9pZCBsb2FkKGNvbnN0IFFV
cmwmIHVybCk7CisgICAgdm9pZCBsb2FkKGNvbnN0IFFOZXR3b3JrUmVxdWVzdCYgcmVxdWVzdCwg
UU5ldHdvcmtBY2Nlc3NNYW5hZ2VyOjpPcGVyYXRpb24gb3BlcmF0aW9uID0gUU5ldHdvcmtBY2Nl
c3NNYW5hZ2VyOjpHZXRPcGVyYXRpb24sIGNvbnN0IFFCeXRlQXJyYXkmIGJvZHkgPSBRQnl0ZUFy
cmF5KCkpOworCisgICAgdm9pZCBzZXRIdG1sKGNvbnN0IFFTdHJpbmcmIGh0bWwsIGNvbnN0IFFV
cmwmIGJhc2VVcmwgPSBRVXJsKCkpOworICAgIC8vIEZJWE1FOiBDb25zaWRlciByZW5hbWUgdG8g
c2V0SHRtbD8KKyAgICB2b2lkIHNldENvbnRlbnQoY29uc3QgUUJ5dGVBcnJheSYgZGF0YSwgY29u
c3QgUVN0cmluZyYgbWltZVR5cGUgPSBRU3RyaW5nKCksIGNvbnN0IFFVcmwmIGJhc2VVcmwgPSBR
VXJsKCkpOworCisgICAgUVdlYkhpc3RvcnkqIGhpc3RvcnkoKSBjb25zdDsKKyAgICBRV2ViU2V0
dGluZ3MqIHNldHRpbmdzKCkgY29uc3Q7CisKKyAgICBRQWN0aW9uKiBwYWdlQWN0aW9uKFFXZWJQ
YWdlOjpXZWJBY3Rpb24gYWN0aW9uKSBjb25zdDsKKyAgICB2b2lkIHRyaWdnZXJQYWdlQWN0aW9u
KFFXZWJQYWdlOjpXZWJBY3Rpb24gYWN0aW9uLCBib29sIGNoZWNrZWQgPSBmYWxzZSk7CisKKyAg
ICBib29sIGZpbmRUZXh0KGNvbnN0IFFTdHJpbmcmIHN1YlN0cmluZywgUVdlYlBhZ2U6OkZpbmRG
bGFncyBvcHRpb25zID0gMCk7CisKKyAgICBib29sIHJlc2l6ZXNUb0NvbnRlbnRzKCkgY29uc3Q7
CisgICAgdm9pZCBzZXRSZXNpemVzVG9Db250ZW50cyhib29sIGVuYWJsZWQpOworICAgIAorICAg
IGJvb2wgaXNUaWxlZEJhY2tpbmdTdG9yZUZyb3plbigpIGNvbnN0OworICAgIHZvaWQgc2V0VGls
ZWRCYWNraW5nU3RvcmVGcm96ZW4oYm9vbCBmcm96ZW4pOworCisgICAgdmlydHVhbCB2b2lkIHNl
dEdlb21ldHJ5KGNvbnN0IFFSZWN0RiYgcmVjdCk7CisgICAgdmlydHVhbCB2b2lkIHVwZGF0ZUdl
b21ldHJ5KCk7CisgICAgdmlydHVhbCB2b2lkIHBhaW50KFFQYWludGVyKiwgY29uc3QgUVN0eWxl
T3B0aW9uR3JhcGhpY3NJdGVtKiBvcHRpb25zLCBRV2lkZ2V0KiB3aWRnZXQgPSAwKTsKKyAgICB2
aXJ0dWFsIFFWYXJpYW50IGl0ZW1DaGFuZ2UoR3JhcGhpY3NJdGVtQ2hhbmdlIGNoYW5nZSwgY29u
c3QgUVZhcmlhbnQmIHZhbHVlKTsKKyAgICB2aXJ0dWFsIGJvb2wgZXZlbnQoUUV2ZW50Kik7CisK
KyAgICB2aXJ0dWFsIFFTaXplRiBzaXplSGludChRdDo6U2l6ZUhpbnQgd2hpY2gsIGNvbnN0IFFT
aXplRiYgY29uc3RyYWludCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIFFWYXJpYW50IGlucHV0TWV0
aG9kUXVlcnkoUXQ6OklucHV0TWV0aG9kUXVlcnkgcXVlcnkpIGNvbnN0OworCisgICAgUVBhaW50
ZXI6OlJlbmRlckhpbnRzIHJlbmRlckhpbnRzKCkgY29uc3Q7CisgICAgdm9pZCBzZXRSZW5kZXJI
aW50cyhRUGFpbnRlcjo6UmVuZGVySGludHMpOworICAgIHZvaWQgc2V0UmVuZGVySGludChRUGFp
bnRlcjo6UmVuZGVySGludCwgYm9vbCBlbmFibGVkID0gdHJ1ZSk7CisKK3B1YmxpYyBRX1NMT1RT
OgorICAgIHZvaWQgc3RvcCgpOworICAgIHZvaWQgYmFjaygpOworICAgIHZvaWQgZm9yd2FyZCgp
OworICAgIHZvaWQgcmVsb2FkKCk7CisKK1FfU0lHTkFMUzoKKyAgICB2b2lkIGxvYWRTdGFydGVk
KCk7CisgICAgdm9pZCBsb2FkRmluaXNoZWQoYm9vbCk7CisKKyAgICB2b2lkIGxvYWRQcm9ncmVz
cyhpbnQgcHJvZ3Jlc3MpOworICAgIHZvaWQgdXJsQ2hhbmdlZChjb25zdCBRVXJsJik7CisgICAg
dm9pZCB0aXRsZUNoYW5nZWQoY29uc3QgUVN0cmluZyYpOworICAgIHZvaWQgaWNvbkNoYW5nZWQo
KTsKKyAgICB2b2lkIHN0YXR1c0Jhck1lc3NhZ2UoY29uc3QgUVN0cmluZyYgbWVzc2FnZSk7Cisg
ICAgdm9pZCBsaW5rQ2xpY2tlZChjb25zdCBRVXJsJik7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0
dWFsIHZvaWQgbW91c2VQcmVzc0V2ZW50KFFHcmFwaGljc1NjZW5lTW91c2VFdmVudCopOworICAg
IHZpcnR1YWwgdm9pZCBtb3VzZURvdWJsZUNsaWNrRXZlbnQoUUdyYXBoaWNzU2NlbmVNb3VzZUV2
ZW50Kik7CisgICAgdmlydHVhbCB2b2lkIG1vdXNlUmVsZWFzZUV2ZW50KFFHcmFwaGljc1NjZW5l
TW91c2VFdmVudCopOworICAgIHZpcnR1YWwgdm9pZCBtb3VzZU1vdmVFdmVudChRR3JhcGhpY3NT
Y2VuZU1vdXNlRXZlbnQqKTsKKyAgICB2aXJ0dWFsIHZvaWQgaG92ZXJNb3ZlRXZlbnQoUUdyYXBo
aWNzU2NlbmVIb3ZlckV2ZW50Kik7CisgICAgdmlydHVhbCB2b2lkIGhvdmVyTGVhdmVFdmVudChR
R3JhcGhpY3NTY2VuZUhvdmVyRXZlbnQqKTsKKyNpZm5kZWYgUVRfTk9fV0hFRUxFVkVOVAorICAg
IHZpcnR1YWwgdm9pZCB3aGVlbEV2ZW50KFFHcmFwaGljc1NjZW5lV2hlZWxFdmVudCopOworI2Vu
ZGlmCisgICAgdmlydHVhbCB2b2lkIGtleVByZXNzRXZlbnQoUUtleUV2ZW50Kik7CisgICAgdmly
dHVhbCB2b2lkIGtleVJlbGVhc2VFdmVudChRS2V5RXZlbnQqKTsKKyNpZm5kZWYgUVRfTk9fQ09O
VEVYVE1FTlUKKyAgICB2aXJ0dWFsIHZvaWQgY29udGV4dE1lbnVFdmVudChRR3JhcGhpY3NTY2Vu
ZUNvbnRleHRNZW51RXZlbnQqKTsKKyNlbmRpZgorICAgIHZpcnR1YWwgdm9pZCBkcmFnRW50ZXJF
dmVudChRR3JhcGhpY3NTY2VuZURyYWdEcm9wRXZlbnQqKTsKKyAgICB2aXJ0dWFsIHZvaWQgZHJh
Z0xlYXZlRXZlbnQoUUdyYXBoaWNzU2NlbmVEcmFnRHJvcEV2ZW50Kik7CisgICAgdmlydHVhbCB2
b2lkIGRyYWdNb3ZlRXZlbnQoUUdyYXBoaWNzU2NlbmVEcmFnRHJvcEV2ZW50Kik7CisgICAgdmly
dHVhbCB2b2lkIGRyb3BFdmVudChRR3JhcGhpY3NTY2VuZURyYWdEcm9wRXZlbnQqKTsKKyAgICB2
aXJ0dWFsIHZvaWQgZm9jdXNJbkV2ZW50KFFGb2N1c0V2ZW50Kik7CisgICAgdmlydHVhbCB2b2lk
IGZvY3VzT3V0RXZlbnQoUUZvY3VzRXZlbnQqKTsKKyAgICB2aXJ0dWFsIHZvaWQgaW5wdXRNZXRo
b2RFdmVudChRSW5wdXRNZXRob2RFdmVudCopOworICAgIHZpcnR1YWwgYm9vbCBmb2N1c05leHRQ
cmV2Q2hpbGQoYm9vbCBuZXh0KTsKKworICAgIHZpcnR1YWwgYm9vbCBzY2VuZUV2ZW50KFFFdmVu
dCopOworCitwcml2YXRlOgorICAgIFFfUFJJVkFURV9TTE9UKGQsIHZvaWQgX3FfZG9Mb2FkRmlu
aXNoZWQoYm9vbCBzdWNjZXNzKSkKKyAgICBRX1BSSVZBVEVfU0xPVChkLCB2b2lkIF9xX3BhZ2VE
ZXN0cm95ZWQoKSkKKyAgICBRX1BSSVZBVEVfU0xPVChkLCB2b2lkIF9xX2NvbnRlbnRzU2l6ZUNo
YW5nZWQoY29uc3QgUVNpemUmKSkKKyAgICBRX1BSSVZBVEVfU0xPVChkLCB2b2lkIF9xX3NjYWxl
Q2hhbmdlZCgpKQorCisgICAgUUdyYXBoaWNzV2ViVmlld1ByaXZhdGUqIGNvbnN0IGQ7CisgICAg
ZnJpZW5kIGNsYXNzIFFHcmFwaGljc1dlYlZpZXdQcml2YXRlOworfTsKKworI2VuZGlmIC8vIFFU
X05PX0dSQVBISUNTVklFVworCisjZW5kaWYgLy8gUUdyYXBoaWNzV2ViVmlld19oCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldEFwaS9xd2ViZnJhbWUuY3BwIGIvU291cmNlL1dl
YktpdC9xdC9XaWRnZXRBcGkvcXdlYmZyYW1lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4xNDI0NjFkOThmNTZl
MTg0MWY2NjVhMDQwYmU3Y2M0M2VlMzFkMDY5Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dl
YktpdC9xdC9XaWRnZXRBcGkvcXdlYmZyYW1lLmNwcApAQCAtMCwwICsxLDEyNzkgQEAKKy8qCisg
ICAgQ29weXJpZ2h0IChDKSAyMDA4LDIwMDkgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBz
dWJzaWRpYXJ5KC1pZXMpCisgICAgQ29weXJpZ2h0IChDKSAyMDA3IFN0YWlrb3MgQ29tcHV0aW5n
IFNlcnZpY2VzIEluYy4KKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3Ug
Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1z
IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlz
aGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24g
MiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4K
KworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdp
bGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVu
IHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVy
YWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2
ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vu
c2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElC
LiAgSWYgbm90LCB3cml0ZSB0bworICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIElu
Yy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgICAgQm9zdG9uLCBNQSAwMjEx
MC0xMzAxLCBVU0EuCisqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAicXdlYmZy
YW1lLmgiCisKKyNpbmNsdWRlICJRdFByaW50Q29udGV4dC5oIgorI2luY2x1ZGUgInF3ZWJlbGVt
ZW50LmgiCisjaW5jbHVkZSAicXdlYmZyYW1lX3AuaCIKKyNpbmNsdWRlICJxd2VicGFnZS5oIgor
I2luY2x1ZGUgInF3ZWJwYWdlX3AuaCIKKyNpbmNsdWRlICJxd2Vic2NyaXB0d29ybGQuaCIKKyNp
bmNsdWRlICJxd2Vic2NyaXB0d29ybGRfcC5oIgorI2luY2x1ZGUgInF3ZWJzZWN1cml0eW9yaWdp
bi5oIgorI2luY2x1ZGUgPFFNdWx0aU1hcD4KKyNpbmNsdWRlIDxxZGVidWcuaD4KKyNpbmNsdWRl
IDxxZXZlbnQuaD4KKyNpbmNsdWRlIDxxZmlsZWluZm8uaD4KKyNpbmNsdWRlIDxxcGFpbnRlci5o
PgorI2lmIEhBVkUoUVRQUklOVFNVUFBPUlQpCisjaW5jbHVkZSA8cXByaW50ZXIuaD4KKyNlbmRp
ZgorI2luY2x1ZGUgPHFuZXR3b3JrcmVxdWVzdC5oPgorI2luY2x1ZGUgPHFyZWdpb24uaD4KKwor
dXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CisKKy8vIGZyb20gdGV4dC9xZm9udC5jcHAKK1FUX0JF
R0lOX05BTUVTUEFDRQorZXh0ZXJuIFFfR1VJX0VYUE9SVCBpbnQgcXRfZGVmYXVsdERwaSgpOwor
UVRfRU5EX05BTUVTUEFDRQorCit2b2lkIFFXZWJGcmFtZVByaXZhdGU6OnNldFBhZ2UoUVdlYlBh
Z2UqIG5ld1BhZ2UpCit7CisgICAgaWYgKHBhZ2UgPT0gbmV3UGFnZSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgLy8gVGhlIFFXZWJGcmFtZSBpcyBjcmVhdGVkIGFzIGEgY2hpbGQgb2YgUVdlYlBh
Z2Ugb3IgYSBwYXJlbnQgUVdlYkZyYW1lLgorICAgIC8vIFRoYXQgYWRkcyBpdCB0byBRT2JqZWN0
J3MgaW50ZXJuYWwgY2hpbGRyZW4gbGlzdCBhbmQgZW5zdXJlcyBpdCB3aWxsIGJlCisgICAgLy8g
ZGVsZXRlZCB3aGVuIHBhcmVudCBRV2ViUGFnZSBpcyBkZWxldGVkLiBSZXBhcmVudCBpZiBuZWVk
ZWQuCisgICAgaWYgKHEtPnBhcmVudCgpID09IHFvYmplY3RfY2FzdDxRT2JqZWN0Kj4ocGFnZSkp
CisgICAgICAgIHEtPnNldFBhcmVudChuZXdQYWdlKTsKKworICAgIHBhZ2UgPSBuZXdQYWdlOwor
ICAgIHBhZ2VBZGFwdGVyID0gbmV3UGFnZS0+aGFuZGxlKCk7CisgICAgZW1pdCBxLT5wYWdlQ2hh
bmdlZCgpOworfQorCit2b2lkIFFXZWJGcmFtZVByaXZhdGU6OmVtaXRVcmxDaGFuZ2VkKCkKK3sK
KyAgICB1cmwgPSBjb3JlRnJhbWVVcmwoKTsKKyAgICBlbWl0IHEtPnVybENoYW5nZWQodXJsKTsK
K30KKwordm9pZCBRV2ViRnJhbWVQcml2YXRlOjpkaWRTdGFydFByb3Zpc2lvbmFsTG9hZCgpCit7
CisgICAgZW1pdCBxLT5wcm92aXNpb25hbExvYWQoKTsKK30KKwordm9pZCBRV2ViRnJhbWVQcml2
YXRlOjpkaWRDbGVhcldpbmRvd09iamVjdCgpCit7CisgICAgZW1pdCBxLT5qYXZhU2NyaXB0V2lu
ZG93T2JqZWN0Q2xlYXJlZCgpOworfQorCitib29sIFFXZWJGcmFtZVByaXZhdGU6OmhhbmRsZVBy
b2dyZXNzRmluaXNoZWQoUVBvaW50ICpsb2NhbFBvcykKK3sKKyAgICBRV2lkZ2V0ICp2aWV3ID0g
cS0+cGFnZSgpLT52aWV3KCk7CisgICAgaWYgKCF2aWV3IHx8ICFsb2NhbFBvcykKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgICpsb2NhbFBvcyA9IHZpZXctPm1hcEZyb21HbG9iYWwoUUN1cnNv
cjo6cG9zKCkpOworICAgIHJldHVybiB2aWV3LT5oYXNGb2N1cygpICYmIHZpZXctPnJlY3QoKS5j
b250YWlucygqbG9jYWxQb3MpOworfQorCit2b2lkIFFXZWJGcmFtZVByaXZhdGU6OmVtaXRJbml0
aWFsTGF5b3V0Q29tcGxldGVkKCkKK3sKKyAgICBlbWl0IHEtPmluaXRpYWxMYXlvdXRDb21wbGV0
ZWQoKTsKK30KKwordm9pZCBRV2ViRnJhbWVQcml2YXRlOjplbWl0SWNvbkNoYW5nZWQoKQorewor
ICAgIGVtaXQgcS0+aWNvbkNoYW5nZWQoKTsKK30KKwordm9pZCBRV2ViRnJhbWVQcml2YXRlOjpl
bWl0TG9hZFN0YXJ0ZWQoYm9vbCBvcmlnaW5hdGluZ0xvYWQpCit7CisgICAgaWYgKHBhZ2UgJiYg
b3JpZ2luYXRpbmdMb2FkKQorICAgICAgICBlbWl0IHBhZ2UtPmxvYWRTdGFydGVkKCk7CisgICAg
ZW1pdCBxLT5sb2FkU3RhcnRlZCgpOworfQorCit2b2lkIFFXZWJGcmFtZVByaXZhdGU6OmVtaXRM
b2FkRmluaXNoZWQoYm9vbCBvcmlnaW5hdGluZ0xvYWQsIGJvb2wgb2spCit7CisgICAgaWYgKHBh
Z2UgJiYgb3JpZ2luYXRpbmdMb2FkKQorICAgICAgICBlbWl0IHBhZ2UtPmxvYWRGaW5pc2hlZChv
ayk7CisgICAgZW1pdCBxLT5sb2FkRmluaXNoZWQob2spOworfQorCitRV2ViRnJhbWVBZGFwdGVy
KiBRV2ViRnJhbWVQcml2YXRlOjpjcmVhdGVDaGlsZEZyYW1lKFFXZWJGcmFtZURhdGEqIGZyYW1l
RGF0YSkKK3sKKyAgICBRV2ViRnJhbWUqIG5ld0ZyYW1lID0gbmV3IFFXZWJGcmFtZSgvKnBhcmVu
dCBmcmFtZSovcSwgZnJhbWVEYXRhKTsKKyAgICByZXR1cm4gbmV3RnJhbWUtPmQ7Cit9CisKK1FX
ZWJGcmFtZSAqUVdlYkZyYW1lUHJpdmF0ZTo6YXBpSGFuZGxlKCkKK3sKKyAgICByZXR1cm4gcTsK
K30KKworUU9iamVjdCAqUVdlYkZyYW1lUHJpdmF0ZTo6aGFuZGxlKCkKK3sKKyAgICByZXR1cm4g
cTsKK30KKwordm9pZCBRV2ViRnJhbWVQcml2YXRlOjpjb250ZW50c1NpemVEaWRDaGFuZ2UoY29u
c3QgUVNpemUgJnNpemUpCit7CisgICAgZW1pdCBxLT5jb250ZW50c1NpemVDaGFuZ2VkKHNpemUp
OworfQorCitpbnQgUVdlYkZyYW1lUHJpdmF0ZTo6c2Nyb2xsQmFyUG9saWN5KFF0OjpPcmllbnRh
dGlvbiBvcmllbnRhdGlvbikgY29uc3QKK3sKKyAgICByZXR1cm4gKGludCkgcS0+c2Nyb2xsQmFy
UG9saWN5KG9yaWVudGF0aW9uKTsKK30KKworLyohCisgICAgXGNsYXNzIFFXZWJGcmFtZQorICAg
IFxzaW5jZSA0LjQKKyAgICBcYnJpZWYgVGhlIFFXZWJGcmFtZSBjbGFzcyByZXByZXNlbnRzIGEg
ZnJhbWUgaW4gYSB3ZWIgcGFnZS4KKworICAgIFxpbm1vZHVsZSBRdFdlYktpdAorCisgICAgUVdl
YkZyYW1lIHJlcHJlc2VudHMgYSBmcmFtZSBpbnNpZGUgYSB3ZWIgcGFnZS4gRWFjaCBRV2ViUGFn
ZQorICAgIG9iamVjdCBjb250YWlucyBhdCBsZWFzdCBvbmUgZnJhbWUsIHRoZSBtYWluIGZyYW1l
LCBvYnRhaW5lZCB1c2luZworICAgIFFXZWJQYWdlOjptYWluRnJhbWUoKS4gQWRkaXRpb25hbCBm
cmFtZXMgd2lsbCBiZSBjcmVhdGVkIGZvciBIVE1MCisgICAgXGN7PGZyYW1lPn0gb3IgXGN7PGlm
cmFtZT59IGVsZW1lbnRzLgorCisgICAgQSBmcmFtZSBjYW4gYmUgbG9hZGVkIHVzaW5nIGxvYWQo
KSBvciBzZXRVcmwoKS4gQWx0ZXJuYXRpdmVseSwgaWYgeW91IGhhdmUKKyAgICB0aGUgSFRNTCBj
b250ZW50IHJlYWRpbHkgYXZhaWxhYmxlLCB5b3UgY2FuIHVzZSBzZXRIdG1sKCkgaW5zdGVhZC4K
KworICAgIFRoZSBwYWdlKCkgZnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHdlYiBw
YWdlIG9iamVjdC4gU2VlCisgICAgXGx7UVdlYlZpZXd9e0VsZW1lbnRzIG9mIFFXZWJWaWV3fSBm
b3IgYW4gZXhwbGFuYXRpb24gb2YgaG93IHdlYgorICAgIGZyYW1lcyBhcmUgcmVsYXRlZCB0byBh
IHdlYiBwYWdlIGFuZCB3ZWIgdmlldy4KKworICAgIFRoZSBRV2ViRnJhbWUgY2xhc3MgYWxzbyBv
ZmZlcnMgbWV0aG9kcyB0byByZXRyaWV2ZSBib3RoIHRoZSBVUkwgY3VycmVudGx5CisgICAgbG9h
ZGVkIGJ5IHRoZSBmcmFtZSAoc2VlIHVybCgpKSBhcyB3ZWxsIGFzIHRoZSBVUkwgb3JpZ2luYWxs
eSByZXF1ZXN0ZWQKKyAgICB0byBiZSBsb2FkZWQgKHNlZSByZXF1ZXN0ZWRVcmwoKSkuIFRoZXNl
IG1ldGhvZHMgbWFrZSBwb3NzaWJsZSB0aGUgcmV0cmlldmFsCisgICAgb2YgdGhlIFVSTCBiZWZv
cmUgYW5kIGFmdGVyIGEgRE5TIHJlc29sdXRpb24gb3IgYSByZWRpcmVjdGlvbiBvY2N1cnMgZHVy
aW5nCisgICAgdGhlIGxvYWQgcHJvY2Vzcy4gVGhlIHJlcXVlc3RlZFVybCgpIGFsc28gbWF0Y2hl
cyB0byB0aGUgVVJMIGFkZGVkIHRvIHRoZQorICAgIGZyYW1lIGhpc3RvcnkgKFxse1FXZWJIaXN0
b3J5fSkgaWYgbG9hZCBpcyBzdWNjZXNzZnVsLgorCisgICAgVGhlIHRpdGxlIG9mIGFuIEhUTUwg
ZnJhbWUgY2FuIGJlIGFjY2Vzc2VkIHdpdGggdGhlIHRpdGxlKCkgcHJvcGVydHkuCisgICAgQWRk
aXRpb25hbGx5LCBhIGZyYW1lIG1heSBhbHNvIHNwZWNpZnkgYW4gaWNvbiwgd2hpY2ggY2FuIGJl
IGFjY2Vzc2VkCisgICAgdXNpbmcgdGhlIGljb24oKSBwcm9wZXJ0eS4gSWYgdGhlIHRpdGxlIG9y
IHRoZSBpY29uIGNoYW5nZXMsIHRoZQorICAgIGNvcnJlc3BvbmRpbmcgdGl0bGVDaGFuZ2VkKCkg
YW5kIGljb25DaGFuZ2VkKCkgc2lnbmFscyB3aWxsIGJlIGVtaXR0ZWQuCisgICAgVGhlIHpvb21G
YWN0b3IoKSBwcm9wZXJ0eSBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIG92ZXJhbGwgc2l6ZQor
ICAgIG9mIHRoZSBjb250ZW50IGRpc3BsYXllZCBpbiB0aGUgZnJhbWUuCisKKyAgICBRV2ViRnJh
bWUgb2JqZWN0cyBhcmUgY3JlYXRlZCBhbmQgY29udHJvbGxlZCBieSB0aGUgd2ViIHBhZ2UuIFlv
dQorICAgIGNhbiBjb25uZWN0IHRvIHRoZSB3ZWIgcGFnZSdzIFxse1FXZWJQYWdlOjp9e2ZyYW1l
Q3JlYXRlZCgpfSBzaWduYWwKKyAgICB0byBiZSBub3RpZmllZCB3aGVuIGEgbmV3IGZyYW1lIGlz
IGNyZWF0ZWQuCisKKyAgICBUaGVyZSBhcmUgbXVsdGlwbGUgd2F5cyB0byBwcm9ncmFtbWF0aWNh
bGx5IGV4YW1pbmUgdGhlIGNvbnRlbnRzIG9mIGEgZnJhbWUuCisgICAgVGhlIGhpdFRlc3RDb250
ZW50KCkgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZmluZCBlbGVtZW50cyBieSBjb29yZGluYXRl
LgorICAgIEZvciBhY2Nlc3MgdG8gdGhlIHVuZGVybHlpbmcgRE9NIHRyZWUsIHRoZXJlIGlzIGRv
Y3VtZW50RWxlbWVudCgpLAorICAgIGZpbmRBbGxFbGVtZW50cygpIGFuZCBmaW5kRmlyc3RFbGVt
ZW50KCkuCisKKyAgICBBIFFXZWJGcmFtZSBjYW4gYmUgcHJpbnRlZCBvbnRvIGEgUVByaW50ZXIg
dXNpbmcgdGhlIHByaW50KCkgZnVuY3Rpb24uCisgICAgVGhpcyBmdW5jdGlvbiBpcyBtYXJrZWQg
YXMgYSBzbG90IGFuZCBjYW4gYmUgY29udmVuaWVudGx5IGNvbm5lY3RlZCB0bworICAgIFxse1FQ
cmludFByZXZpZXdEaWFsb2d9J3MgXGx7UVByaW50UHJldmlld0RpYWxvZzo6fXtwYWludFJlcXVl
c3RlZCgpfQorICAgIHNpZ25hbC4KKworICAgIFxzYSBRV2ViUGFnZQorKi8KKworLyohCisgICAg
XGVudW0gUVdlYkZyYW1lOjpSZW5kZXJMYXllcgorCisgICAgVGhpcyBlbnVtIGRlc2NyaWJlcyB0
aGUgbGF5ZXJzIGF2YWlsYWJsZSBmb3IgcmVuZGVyaW5nIHVzaW5nIFxse1FXZWJGcmFtZTo6fXty
ZW5kZXIoKX0uCisgICAgVGhlIGxheWVycyBjYW4gYmUgT1ItZWQgdG9nZXRoZXIgZnJvbSB0aGUg
Zm9sbG93aW5nIGxpc3Q6CisKKyAgICBcdmFsdWUgQ29udGVudHNMYXllciBUaGUgd2ViIGNvbnRl
bnQgb2YgdGhlIGZyYW1lCisgICAgXHZhbHVlIFNjcm9sbEJhckxheWVyIFRoZSBzY3JvbGxiYXJz
IG9mIHRoZSBmcmFtZQorICAgIFx2YWx1ZSBQYW5JY29uTGF5ZXIgVGhlIGljb24gdXNlZCB3aGVu
IHBhbm5pbmcgdGhlIGZyYW1lCisKKyAgICBcdmFsdWUgQWxsTGF5ZXJzIEluY2x1ZGVzIGFsbCB0
aGUgYWJvdmUgbGF5ZXJzCisqLworCitRV2ViRnJhbWU6OlFXZWJGcmFtZShRV2ViUGFnZSAqcGFy
ZW50UGFnZSkKKyAgICA6IFFPYmplY3QocGFyZW50UGFnZSkKKyAgICAsIGQobmV3IFFXZWJGcmFt
ZVByaXZhdGUpCit7CisgICAgZC0+cGFnZSA9IHBhcmVudFBhZ2U7CisgICAgZC0+cSA9IHRoaXM7
CisgICAgZC0+aW5pdCgvKnBhZ2UgYWRhcHRlciovIHBhcmVudFBhZ2UtPmhhbmRsZSgpKTsKKwor
I2lmIEVOQUJMRShPUklFTlRBVElPTl9FVkVOVFMpCisgICAgY29ubmVjdCgmZC0+bV9vcmllbnRh
dGlvbiwgU0lHTkFMKHJlYWRpbmdDaGFuZ2VkKCkpLCB0aGlzLCBTTE9UKF9xX29yaWVudGF0aW9u
Q2hhbmdlZCgpKSk7CisgICAgZC0+bV9vcmllbnRhdGlvbi5zdGFydCgpOworI2VuZGlmCit9CisK
K1FXZWJGcmFtZTo6UVdlYkZyYW1lKFFXZWJGcmFtZSogcGFyZW50LCBRV2ViRnJhbWVEYXRhKiBm
cmFtZURhdGEpCisgICAgOiBRT2JqZWN0KHBhcmVudCkKKyAgICAsIGQobmV3IFFXZWJGcmFtZVBy
aXZhdGUpCit7CisgICAgZC0+cGFnZSA9IHBhcmVudC0+ZC0+cGFnZTsKKyAgICBkLT5xID0gdGhp
czsKKyAgICBkLT5pbml0KHBhcmVudC0+ZC0+cGFnZUFkYXB0ZXIsIGZyYW1lRGF0YSk7CisjaWYg
RU5BQkxFKE9SSUVOVEFUSU9OX0VWRU5UUykKKyAgICBjb25uZWN0KCZkLT5tX29yaWVudGF0aW9u
LCBTSUdOQUwocmVhZGluZ0NoYW5nZWQoKSksIHRoaXMsIFNMT1QoX3Ffb3JpZW50YXRpb25DaGFu
Z2VkKCkpKTsKKyAgICBkLT5tX29yaWVudGF0aW9uLnN0YXJ0KCk7CisjZW5kaWYKK30KKworUVdl
YkZyYW1lOjp+UVdlYkZyYW1lKCkKK3sKKyAgICBkZWxldGUgZDsKK30KKworLyohCisgICAgXGZu
IHZvaWQgUVdlYkZyYW1lOjphZGRUb0phdmFTY3JpcHRXaW5kb3dPYmplY3QoY29uc3QgUVN0cmlu
ZyAmbmFtZSwgUU9iamVjdCAqb2JqZWN0LCBWYWx1ZU93bmVyc2hpcCBvd24pCisKKyAgICBNYWtl
IFxhIG9iamVjdCBhdmFpbGFibGUgdW5kZXIgXGEgbmFtZSBmcm9tIHdpdGhpbiB0aGUgZnJhbWUn
cyBKYXZhU2NyaXB0CisgICAgY29udGV4dC4gVGhlIFxhIG9iamVjdCB3aWxsIGJlIGluc2VydGVk
IGFzIGEgY2hpbGQgb2YgdGhlIGZyYW1lJ3Mgd2luZG93CisgICAgb2JqZWN0LgorCisgICAgUXQg
cHJvcGVydGllcyB3aWxsIGJlIGV4cG9zZWQgYXMgSmF2YVNjcmlwdCBwcm9wZXJ0aWVzIGFuZCBz
bG90cyBhcworICAgIEphdmFTY3JpcHQgbWV0aG9kcy4KKyAgICBUaGUgaW50ZXJhY3Rpb24gYmV0
d2VlbiBDKysgYW5kIEphdmFTY3JpcHQgaXMgZXhwbGFpbmVkIGluIHRoZSBkb2N1bWVudGF0aW9u
IG9mIHRoZSBcbHtUaGUgUXRXZWJLaXQgQnJpZGdlfXtRdFdlYktpdCBicmlkZ2V9LgorCisgICAg
SWYgeW91IHdhbnQgdG8gZW5zdXJlIHRoYXQgeW91ciBRT2JqZWN0cyByZW1haW4gYWNjZXNzaWJs
ZSBhZnRlciBsb2FkaW5nIGEKKyAgICBuZXcgVVJMLCB5b3Ugc2hvdWxkIGFkZCB0aGVtIGluIGEg
c2xvdCBjb25uZWN0ZWQgdG8gdGhlCisgICAgamF2YVNjcmlwdFdpbmRvd09iamVjdENsZWFyZWQo
KSBzaWduYWwuCisKKyAgICBJZiBKYXZhc2NyaXB0IGlzIG5vdCBlbmFibGVkIGZvciB0aGlzIHBh
Z2UsIHRoZW4gdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgorCisgICAgVGhlIG93bmVyc2hpcCBv
ZiBcYSBvYmplY3QgaXMgc3BlY2lmaWVkIHVzaW5nIFxhIG93bi4KKyovCit2b2lkIFFXZWJGcmFt
ZTo6YWRkVG9KYXZhU2NyaXB0V2luZG93T2JqZWN0KGNvbnN0IFFTdHJpbmcgJm5hbWUsIFFPYmpl
Y3QgKm9iamVjdCwgVmFsdWVPd25lcnNoaXAgb3duZXJzaGlwKQoreworICAgIGQtPmFkZFRvSmF2
YVNjcmlwdFdpbmRvd09iamVjdChuYW1lLCBvYmplY3QsIHN0YXRpY19jYXN0PFFXZWJGcmFtZUFk
YXB0ZXI6OlZhbHVlT3duZXJzaGlwPihvd25lcnNoaXApKTsKK30KKworLyohCisgICAgUmV0dXJu
cyB0aGUgZnJhbWUncyBjb250ZW50IGFzIEhUTUwsIGVuY2xvc2VkIGluIEhUTUwgYW5kIEJPRFkg
dGFncy4KKworICAgIFxzYSBzZXRIdG1sKCksIHRvUGxhaW5UZXh0KCkKKyovCitRU3RyaW5nIFFX
ZWJGcmFtZTo6dG9IdG1sKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZC0+dG9IdG1sKCk7Cit9CisK
Ky8qIQorICAgIFJldHVybnMgdGhlIGNvbnRlbnQgb2YgdGhpcyBmcmFtZSBjb252ZXJ0ZWQgdG8g
cGxhaW4gdGV4dCwgY29tcGxldGVseQorICAgIHN0cmlwcGVkIG9mIGFsbCBIVE1MIGZvcm1hdHRp
bmcuCisKKyAgICBcc2EgdG9IdG1sKCkKKyovCitRU3RyaW5nIFFXZWJGcmFtZTo6dG9QbGFpblRl
eHQoKSBjb25zdAoreworICAgIHJldHVybiBkLT50b1BsYWluVGV4dCgpOworfQorCisvKiEKKyAg
ICBccHJvcGVydHkgUVdlYkZyYW1lOjp0aXRsZQorICAgIFxicmllZiB0aGUgdGl0bGUgb2YgdGhl
IGZyYW1lIGFzIGRlZmluZWQgYnkgdGhlIEhUTUwgJmx0O3RpdGxlJmd0OyBlbGVtZW50CisKKyAg
ICBcc2EgdGl0bGVDaGFuZ2VkKCkKKyovCisKK1FTdHJpbmcgUVdlYkZyYW1lOjp0aXRsZSgpIGNv
bnN0Cit7CisgICAgcmV0dXJuIGQtPnRpdGxlKCk7Cit9CisKKy8qIQorICAgIFxzaW5jZSA0LjUK
KyAgICBcYnJpZWYgUmV0dXJucyB0aGUgbWV0YSBkYXRhIGluIHRoaXMgZnJhbWUgYXMgYSBRTXVs
dGlNYXAKKworICAgIFRoZSBtZXRhIGRhdGEgY29uc2lzdHMgb2YgdGhlIG5hbWUgYW5kIGNvbnRl
bnQgYXR0cmlidXRlcyBvZiB0aGUKKyAgICBvZiB0aGUgXGN7PG1ldGE+fSB0YWdzIGluIHRoZSBI
VE1MIGRvY3VtZW50LgorCisgICAgRm9yIGV4YW1wbGU6CisKKyAgICBcY29kZQorICAgIDxodG1s
PgorICAgICAgICA8aGVhZD4KKyAgICAgICAgICAgIDxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBj
b250ZW50PSJUaGlzIGRvY3VtZW50IGlzIGEgdHV0b3JpYWwgYWJvdXQgUXQgZGV2ZWxvcG1lbnQi
PgorICAgICAgICAgICAgPG1ldGEgbmFtZT0ia2V5d29yZHMiIGNvbnRlbnQ9IlF0LCBXZWJLaXQs
IFByb2dyYW1taW5nIj4KKyAgICAgICAgPC9oZWFkPgorICAgICAgICAuLi4KKyAgICA8L2h0bWw+
CisgICAgXGVuZGNvZGUKKworICAgIEdpdmVuIHRoZSBhYm92ZSBIVE1MIGNvZGUgdGhlIG1ldGFE
YXRhKCkgZnVuY3Rpb24gd2lsbCByZXR1cm4gYSBtYXAgd2l0aCB0d28gZW50cmllczoKKyAgICBc
dGFibGUKKyAgICBcaGVhZGVyIFxsaSBLZXkKKyAgICAgICAgICAgIFxsaSBWYWx1ZQorICAgIFxy
b3cgICAgXGxpICJkZXNjcmlwdGlvbiIKKyAgICAgICAgICAgIFxsaSAiVGhpcyBkb2N1bWVudCBp
cyBhIHR1dG9yaWFsIGFib3V0IFF0IGRldmVsb3BtZW50IgorICAgIFxyb3cgICAgXGxpICJrZXl3
b3JkcyIKKyAgICAgICAgICAgIFxsaSAiUXQsIFdlYktpdCwgUHJvZ3JhbW1pbmciCisgICAgXGVu
ZHRhYmxlCisKKyAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBtdWx0aSBtYXAgdG8gc3VwcG9y
dCBtdWx0aXBsZSBtZXRhIHRhZ3Mgd2l0aCB0aGUgc2FtZSBhdHRyaWJ1dGUgbmFtZS4KKyovCitR
TXVsdGlNYXA8UVN0cmluZywgUVN0cmluZz4gUVdlYkZyYW1lOjptZXRhRGF0YSgpIGNvbnN0Cit7
CisgICAgcmV0dXJuIGQtPm1ldGFEYXRhKCk7Cit9CisKKy8qIQorICAgIFxwcm9wZXJ0eSBRV2Vi
RnJhbWU6OnVybAorICAgIFxicmllZiB0aGUgdXJsIG9mIHRoZSBmcmFtZSBjdXJyZW50bHkgdmll
d2VkCisKKyAgICBTZXR0aW5nIHRoaXMgcHJvcGVydHkgY2xlYXJzIHRoZSB2aWV3IGFuZCBsb2Fk
cyB0aGUgVVJMLgorCisgICAgQnkgZGVmYXVsdCwgdGhpcyBwcm9wZXJ0eSBjb250YWlucyBhbiBl
bXB0eSwgaW52YWxpZCBVUkwuCisKKyAgICBcc2EgdXJsQ2hhbmdlZCgpCisqLworCit2b2lkIFFX
ZWJGcmFtZTo6c2V0VXJsKGNvbnN0IFFVcmwgJnVybCkKK3sKKyAgICBkLT5jbGVhckNvcmVGcmFt
ZSgpOworICAgIGNvbnN0IFFVcmwgYWJzb2x1dGUgPSBRV2ViRnJhbWVBZGFwdGVyOjplbnN1cmVB
YnNvbHV0ZVVybCh1cmwpOworICAgIGQtPnVybCA9IGFic29sdXRlOworICAgIGxvYWQoYWJzb2x1
dGUpOworfQorCitRVXJsIFFXZWJGcmFtZTo6dXJsKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZC0+
dXJsOworfQorCisvKiEKKyAgICBcc2luY2UgNC42CisgICAgXHByb3BlcnR5IFFXZWJGcmFtZTo6
cmVxdWVzdGVkVXJsCisKKyAgICBUaGUgVVJMIHJlcXVlc3RlZCB0byBsb2FkZWQgYnkgdGhlIGZy
YW1lIGN1cnJlbnRseSB2aWV3ZWQuIFRoZSBVUkwgbWF5IGRpZmZlciBmcm9tCisgICAgdGhlIG9u
ZSByZXR1cm5lZCBieSB1cmwoKSBpZiBhIEROUyByZXNvbHV0aW9uIG9yIGEgcmVkaXJlY3Rpb24g
b2NjdXJzLgorCisgICAgXHNhIHVybCgpLCBzZXRVcmwoKQorKi8KK1FVcmwgUVdlYkZyYW1lOjpy
ZXF1ZXN0ZWRVcmwoKSBjb25zdAoreworICAgIHJldHVybiBkLT5sYXN0UmVxdWVzdGVkVXJsKCk7
Cit9CisvKiEKKyAgICBcc2luY2UgNC42CisgICAgXHByb3BlcnR5IFFXZWJGcmFtZTo6YmFzZVVy
bAorICAgIFxicmllZiB0aGUgYmFzZSBVUkwgb2YgdGhlIGZyYW1lLCBjYW4gYmUgdXNlZCB0byBy
ZXNvbHZlIHJlbGF0aXZlIFVSTHMKKyAgICBcc2luY2UgNC42CisqLworCitRVXJsIFFXZWJGcmFt
ZTo6YmFzZVVybCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGQtPmJhc2VVcmwoKTsKK30KKworLyoh
CisgICAgXHByb3BlcnR5IFFXZWJGcmFtZTo6aWNvbgorICAgIFxicmllZiB0aGUgaWNvbiBhc3Nv
Y2lhdGVkIHdpdGggdGhpcyBmcmFtZQorCisgICAgXHNhIGljb25DaGFuZ2VkKCksIFFXZWJTZXR0
aW5nczo6aWNvbkZvclVybCgpCisqLworCitRSWNvbiBRV2ViRnJhbWU6Omljb24oKSBjb25zdAor
eworICAgIHJldHVybiBRV2ViU2V0dGluZ3M6Omljb25Gb3JVcmwoZC0+Y29yZUZyYW1lVXJsKCkp
OworfQorCisvKiEKKyAgVGhlIG5hbWUgb2YgdGhpcyBmcmFtZSBhcyBkZWZpbmVkIGJ5IHRoZSBw
YXJlbnQgZnJhbWUuCisqLworUVN0cmluZyBRV2ViRnJhbWU6OmZyYW1lTmFtZSgpIGNvbnN0Cit7
CisgICAgcmV0dXJuIGQtPnVuaXF1ZU5hbWUoKTsKK30KKworLyohCisgIFRoZSB3ZWIgcGFnZSB0
aGF0IGNvbnRhaW5zIHRoaXMgZnJhbWUuCisKKyAgXHNhIHBhZ2VDaGFuZ2VkKCkKKyovCitRV2Vi
UGFnZSAqUVdlYkZyYW1lOjpwYWdlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZC0+cGFnZTsKK30K
KworLyohCisgIExvYWRzIFxhIHVybCBpbnRvIHRoaXMgZnJhbWUuCisKKyAgXG5vdGUgVGhlIHZp
ZXcgcmVtYWlucyB0aGUgc2FtZSB1bnRpbCBlbm91Z2ggZGF0YSBoYXMgYXJyaXZlZCB0byBkaXNw
bGF5IHRoZSBuZXcgXGEgdXJsLgorCisgIFxzYSBzZXRVcmwoKSwgc2V0SHRtbCgpLCBzZXRDb250
ZW50KCkKKyovCit2b2lkIFFXZWJGcmFtZTo6bG9hZChjb25zdCBRVXJsICZ1cmwpCit7CisgICAg
Ly8gVGhlIGxvYWQoKSBvdmVybG9hZCBlbnN1cmVzIHRoYXQgdGhlIHVybCBpcyBhYnNvbHV0ZS4K
KyAgICBsb2FkKFFOZXR3b3JrUmVxdWVzdCh1cmwpKTsKK30KKworLyohCisgIExvYWRzIGEgbmV0
d29yayByZXF1ZXN0LCBcYSByZXEsIGludG8gdGhpcyBmcmFtZSwgdXNpbmcgdGhlIG1ldGhvZCBz
cGVjaWZpZWQgaW4gXGEKKyAgb3BlcmF0aW9uLgorCisgIFxhIGJvZHkgaXMgb3B0aW9uYWwgYW5k
IGlzIG9ubHkgdXNlZCBmb3IgUE9TVCBvcGVyYXRpb25zLgorCisgIFxub3RlIFRoZSB2aWV3IHJl
bWFpbnMgdGhlIHNhbWUgdW50aWwgZW5vdWdoIGRhdGEgaGFzIGFycml2ZWQgdG8gZGlzcGxheSB0
aGUgbmV3IGNvbnRlbnQuCisKKyAgXHNhIHNldFVybCgpCisqLwordm9pZCBRV2ViRnJhbWU6Omxv
YWQoY29uc3QgUU5ldHdvcmtSZXF1ZXN0ICZyZXEsIFFOZXR3b3JrQWNjZXNzTWFuYWdlcjo6T3Bl
cmF0aW9uIG9wZXJhdGlvbiwgY29uc3QgUUJ5dGVBcnJheSAmYm9keSkKK3sKKyAgICBkLT5sb2Fk
KHJlcSwgb3BlcmF0aW9uLCBib2R5KTsKK30KKworLyohCisgIFNldHMgdGhlIGNvbnRlbnQgb2Yg
dGhpcyBmcmFtZSB0byBcYSBodG1sLiBcYSBiYXNlVXJsIGlzIG9wdGlvbmFsIGFuZCB1c2VkIHRv
IHJlc29sdmUgcmVsYXRpdmUKKyAgVVJMcyBpbiB0aGUgZG9jdW1lbnQsIHN1Y2ggYXMgcmVmZXJl
bmNlZCBpbWFnZXMgb3Igc3R5bGVzaGVldHMuCisKKyAgVGhlIFxhIGh0bWwgaXMgbG9hZGVkIGlt
bWVkaWF0ZWx5OyBleHRlcm5hbCBvYmplY3RzIGFyZSBsb2FkZWQgYXN5bmNocm9ub3VzbHkuCisK
KyAgSWYgYSBzY3JpcHQgaW4gdGhlIFxhIGh0bWwgcnVucyBsb25nZXIgdGhhbiB0aGUgZGVmYXVs
dCBzY3JpcHQgdGltZW91dCAoY3VycmVudGx5IDEwIHNlY29uZHMpLAorICBmb3IgZXhhbXBsZSBk
dWUgdG8gYmVpbmcgYmxvY2tlZCBieSBhIG1vZGFsIEphdmFTY3JpcHQgYWxlcnQgZGlhbG9nLCB0
aGlzIG1ldGhvZCB3aWxsIHJldHVybgorICBhcyBzb29uIGFzIHBvc3NpYmxlIGFmdGVyIHRoZSB0
aW1lb3V0IGFuZCBhbnkgc3Vic2VxdWVudCBcYSBodG1sIHdpbGwgYmUgbG9hZGVkIGFzeW5jaHJv
bm91c2x5LgorCisgIFdoZW4gdXNpbmcgdGhpcyBtZXRob2QgV2ViS2l0IGFzc3VtZXMgdGhhdCBl
eHRlcm5hbCByZXNvdXJjZXMgc3VjaCBhcyBKYXZhU2NyaXB0IHByb2dyYW1zIG9yIHN0eWxlCisg
IHNoZWV0cyBhcmUgZW5jb2RlZCBpbiBVVEYtOCB1bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZC4g
Rm9yIGV4YW1wbGUsIHRoZSBlbmNvZGluZyBvZiBhbiBleHRlcm5hbAorICBzY3JpcHQgY2FuIGJl
IHNwZWNpZmllZCB0aHJvdWdoIHRoZSBjaGFyc2V0IGF0dHJpYnV0ZSBvZiB0aGUgSFRNTCBzY3Jp
cHQgdGFnLiBJdCBpcyBhbHNvIHBvc3NpYmxlCisgIGZvciB0aGUgZW5jb2RpbmcgdG8gYmUgc3Bl
Y2lmaWVkIGJ5IHdlYiBzZXJ2ZXIuCisKKyAgVGhpcyBpcyBhIGNvbnZlbmllbmNlIGZ1bmN0aW9u
IGVxdWl2YWxlbnQgdG8gc2V0Q29udGVudChodG1sLCAidGV4dC9odG1sIiwgYmFzZVVybCkuCisK
KyAgXG5vdGUgVGhpcyBtZXRob2Qgd2lsbCBub3QgYWZmZWN0IHNlc3Npb24gb3IgZ2xvYmFsIGhp
c3RvcnkgZm9yIHRoZSBmcmFtZS4KKworICBcd2FybmluZyBUaGlzIGZ1bmN0aW9uIHdvcmtzIG9u
bHkgZm9yIEhUTUwsIGZvciBvdGhlciBtaW1lIHR5cGVzIChpLmUuIFhIVE1MLCBTVkcpCisgIHNl
dENvbnRlbnQoKSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgorCisgIFxzYSB0b0h0bWwoKSwgc2V0
Q29udGVudCgpLCBsb2FkKCkKKyovCit2b2lkIFFXZWJGcmFtZTo6c2V0SHRtbChjb25zdCBRU3Ry
aW5nICZodG1sLCBjb25zdCBRVXJsICZiYXNlVXJsKQoreworICAgIGQtPnNldEh0bWwoaHRtbCwg
YmFzZVVybCk7Cit9CisKKy8qIQorICBTZXRzIHRoZSBjb250ZW50IG9mIHRoaXMgZnJhbWUgdG8g
dGhlIHNwZWNpZmllZCBjb250ZW50IFxhIGRhdGEuIElmIHRoZSBcYSBtaW1lVHlwZSBhcmd1bWVu
dAorICBpcyBlbXB0eSBpdCBpcyBjdXJyZW50bHkgYXNzdW1lZCB0aGF0IHRoZSBjb250ZW50IGlz
IEhUTUwgYnV0IGluIGZ1dHVyZSB2ZXJzaW9ucyB3ZSBtYXkgaW50cm9kdWNlCisgIGF1dG8tZGV0
ZWN0aW9uLgorCisgIEV4dGVybmFsIG9iamVjdHMgcmVmZXJlbmNlZCBpbiB0aGUgY29udGVudCBh
cmUgbG9jYXRlZCByZWxhdGl2ZSB0byBcYSBiYXNlVXJsLgorCisgIFRoZSBcYSBkYXRhIGlzIGxv
YWRlZCBpbW1lZGlhdGVseTsgZXh0ZXJuYWwgb2JqZWN0cyBhcmUgbG9hZGVkIGFzeW5jaHJvbm91
c2x5LgorCisgIFxub3RlIFRoaXMgbWV0aG9kIHdpbGwgbm90IGFmZmVjdCBzZXNzaW9uIG9yIGds
b2JhbCBoaXN0b3J5IGZvciB0aGUgZnJhbWUuCisKKyAgXHNhIHRvSHRtbCgpLCBzZXRIdG1sKCkK
KyovCit2b2lkIFFXZWJGcmFtZTo6c2V0Q29udGVudChjb25zdCBRQnl0ZUFycmF5ICZkYXRhLCBj
b25zdCBRU3RyaW5nICZtaW1lVHlwZSwgY29uc3QgUVVybCAmYmFzZVVybCkKK3sKKyAgICBkLT5z
ZXRDb250ZW50KGRhdGEsIG1pbWVUeXBlLCBiYXNlVXJsKTsKK30KKworLyohCisgIFJldHVybnMg
dGhlIHBhcmVudCBmcmFtZSBvZiB0aGlzIGZyYW1lLCBvciAwIGlmIHRoZSBmcmFtZSBpcyB0aGUg
d2ViIHBhZ2VzCisgIG1haW4gZnJhbWUuCisKKyAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHFvYmpl
Y3RfY2FzdDxRV2ViRnJhbWUqPihmcmFtZS0+cGFyZW50KCkpLgorCisgIFxzYSBjaGlsZEZyYW1l
cygpCisqLworUVdlYkZyYW1lICpRV2ViRnJhbWU6OnBhcmVudEZyYW1lKCkgY29uc3QKK3sKKyAg
ICByZXR1cm4gZC0+cGFyZW50RnJhbWUoKTsKK30KKworLyohCisgIFJldHVybnMgYSBsaXN0IG9m
IGFsbCBmcmFtZXMgdGhhdCBhcmUgZGlyZWN0IGNoaWxkcmVuIG9mIHRoaXMgZnJhbWUuCisKKyAg
XHNhIHBhcmVudEZyYW1lKCkKKyovCitRTGlzdDxRV2ViRnJhbWUqPiBRV2ViRnJhbWU6OmNoaWxk
RnJhbWVzKCkgY29uc3QKK3sKKyAgICBRTGlzdDxRT2JqZWN0Kj4gb2JqZWN0cyA9IGQtPmNoaWxk
RnJhbWVzKCk7CisgICAgUUxpc3Q8UVdlYkZyYW1lKj4gcmM7CisgICAgcmMucmVzZXJ2ZShvYmpl
Y3RzLnNpemUoKSk7CisgICAgUV9GT1JFQUNIKFFPYmplY3QqIG9iamVjdCwgb2JqZWN0cykgewor
ICAgICAgICBpZiAoUVdlYkZyYW1lKiBmcmFtZSA9IHFvYmplY3RfY2FzdDxRV2ViRnJhbWUqPihv
YmplY3QpKQorICAgICAgICAgICAgcmMuYXBwZW5kKGZyYW1lKTsKKyAgICB9CisKKyAgICByZXR1
cm4gcmM7Cit9CisKKy8qIQorICAgIFJldHVybnMgdGhlIHNjcm9sbGJhciBwb2xpY3kgZm9yIHRo
ZSBzY3JvbGxiYXIgZGVmaW5lZCBieSBcYSBvcmllbnRhdGlvbi4KKyovCitRdDo6U2Nyb2xsQmFy
UG9saWN5IFFXZWJGcmFtZTo6c2Nyb2xsQmFyUG9saWN5KFF0OjpPcmllbnRhdGlvbiBvcmllbnRh
dGlvbikgY29uc3QKK3sKKyAgICBpZiAob3JpZW50YXRpb24gPT0gUXQ6Okhvcml6b250YWwpCisg
ICAgICAgIHJldHVybiBkLT5ob3Jpem9udGFsU2Nyb2xsQmFyUG9saWN5OworICAgIHJldHVybiBk
LT52ZXJ0aWNhbFNjcm9sbEJhclBvbGljeTsKK30KKworLyohCisgICAgU2V0cyB0aGUgc2Nyb2xs
YmFyIHBvbGljeSBmb3IgdGhlIHNjcm9sbGJhciBkZWZpbmVkIGJ5IFxhIG9yaWVudGF0aW9uIHRv
IFxhIHBvbGljeS4KKyovCit2b2lkIFFXZWJGcmFtZTo6c2V0U2Nyb2xsQmFyUG9saWN5KFF0OjpP
cmllbnRhdGlvbiBvcmllbnRhdGlvbiwgUXQ6OlNjcm9sbEJhclBvbGljeSBwb2xpY3kpCit7Cisg
ICAgZC0+c2V0U2Nyb2xsQmFyUG9saWN5KG9yaWVudGF0aW9uLCBwb2xpY3kpOworfQorCisvKiEK
KyAgU2V0cyB0aGUgY3VycmVudCBcYSB2YWx1ZSBmb3IgdGhlIHNjcm9sbGJhciB3aXRoIG9yaWVu
dGF0aW9uIFxhIG9yaWVudGF0aW9uLgorCisgIFRoZSBzY3JvbGxiYXIgZm9yY2VzIHRoZSBcYSB2
YWx1ZSB0byBiZSB3aXRoaW4gdGhlIGxlZ2FsIHJhbmdlOiBtaW5pbXVtIDw9IHZhbHVlIDw9IG1h
eGltdW0uCisKKyAgQ2hhbmdpbmcgdGhlIHZhbHVlIGFsc28gdXBkYXRlcyB0aGUgdGh1bWIgcG9z
aXRpb24uCisKKyAgXHNhIHNjcm9sbEJhck1pbmltdW0oKSwgc2Nyb2xsQmFyTWF4aW11bSgpCisq
Lwordm9pZCBRV2ViRnJhbWU6OnNldFNjcm9sbEJhclZhbHVlKFF0OjpPcmllbnRhdGlvbiBvcmll
bnRhdGlvbiwgaW50IHZhbHVlKQoreworICAgIGQtPnNldFNjcm9sbEJhclZhbHVlKG9yaWVudGF0
aW9uLCB2YWx1ZSk7Cit9CisKKy8qIQorICBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIGZvciB0
aGUgc2Nyb2xsYmFyIHdpdGggb3JpZW50YXRpb24gXGEgb3JpZW50YXRpb24sIG9yIDAKKyAgaWYg
bm8gc2Nyb2xsYmFyIGlzIGZvdW5kIGZvciBcYSBvcmllbnRhdGlvbi4KKworICBcc2Egc2Nyb2xs
QmFyTWluaW11bSgpLCBzY3JvbGxCYXJNYXhpbXVtKCkKKyovCitpbnQgUVdlYkZyYW1lOjpzY3Jv
bGxCYXJWYWx1ZShRdDo6T3JpZW50YXRpb24gb3JpZW50YXRpb24pIGNvbnN0Cit7CisgICAgcmV0
dXJuIGQtPnNjcm9sbEJhclZhbHVlKG9yaWVudGF0aW9uKTsKK30KKworLyohCisgIFJldHVybnMg
dGhlIG1heGltdW0gdmFsdWUgZm9yIHRoZSBzY3JvbGxiYXIgd2l0aCBvcmllbnRhdGlvbiBcYSBv
cmllbnRhdGlvbiwgb3IgMAorICBpZiBubyBzY3JvbGxiYXIgaXMgZm91bmQgZm9yIFxhIG9yaWVu
dGF0aW9uLgorCisgIFxzYSBzY3JvbGxCYXJNaW5pbXVtKCkKKyovCitpbnQgUVdlYkZyYW1lOjpz
Y3JvbGxCYXJNYXhpbXVtKFF0OjpPcmllbnRhdGlvbiBvcmllbnRhdGlvbikgY29uc3QKK3sKKyAg
ICByZXR1cm4gZC0+c2Nyb2xsQmFyTWF4aW11bShvcmllbnRhdGlvbik7Cit9CisKKy8qIQorICBS
ZXR1cm5zIHRoZSBtaW5pbXVtIHZhbHVlIGZvciB0aGUgc2Nyb2xsYmFyIHdpdGggb3JpZW50YXRp
b24gXGEgb3JpZW50YXRpb24uCisKKyAgVGhlIG1pbmltdW0gdmFsdWUgaXMgYWx3YXlzIDAuCisK
KyAgXHNhIHNjcm9sbEJhck1heGltdW0oKQorKi8KK2ludCBRV2ViRnJhbWU6OnNjcm9sbEJhck1p
bmltdW0oUXQ6Ok9yaWVudGF0aW9uIG9yaWVudGF0aW9uKSBjb25zdAoreworICAgIFFfVU5VU0VE
KG9yaWVudGF0aW9uKTsKKyAgICByZXR1cm4gMDsKK30KKworLyohCisgIFxzaW5jZSA0LjYKKyAg
UmV0dXJucyB0aGUgZ2VvbWV0cnkgZm9yIHRoZSBzY3JvbGxiYXIgd2l0aCBvcmllbnRhdGlvbiBc
YSBvcmllbnRhdGlvbi4KKworICBJZiB0aGUgc2Nyb2xsYmFyIGRvZXMgbm90IGV4aXN0IGFuIGVt
cHR5IHJlY3QgaXMgcmV0dXJuZWQuCisqLworUVJlY3QgUVdlYkZyYW1lOjpzY3JvbGxCYXJHZW9t
ZXRyeShRdDo6T3JpZW50YXRpb24gb3JpZW50YXRpb24pIGNvbnN0Cit7CisgICAgcmV0dXJuIGQt
PnNjcm9sbEJhckdlb21ldHJ5KG9yaWVudGF0aW9uKTsKK30KKworLyohCisgIFxzaW5jZSA0LjUK
KyAgU2Nyb2xscyB0aGUgZnJhbWUgXGEgZHggcGl4ZWxzIHRvIHRoZSByaWdodCBhbmQgXGEgZHkg
cGl4ZWxzIGRvd253YXJkLiBCb3RoCisgIFxhIGR4IGFuZCBcYSBkeSBtYXkgYmUgbmVnYXRpdmUu
CisKKyAgXHNhIFFXZWJGcmFtZTo6c2Nyb2xsUG9zaXRpb24KKyovCisKK3ZvaWQgUVdlYkZyYW1l
OjpzY3JvbGwoaW50IGR4LCBpbnQgZHkpCit7CisgICAgZC0+c2Nyb2xsQnkoZHgsIGR5KTsKK30K
KworLyohCisgIFxwcm9wZXJ0eSBRV2ViRnJhbWU6OnNjcm9sbFBvc2l0aW9uCisgIFxzaW5jZSA0
LjUKKyAgXGJyaWVmIHRoZSBwb3NpdGlvbiB0aGUgZnJhbWUgaXMgY3VycmVudGx5IHNjcm9sbGVk
IHRvLgorKi8KKworUVBvaW50IFFXZWJGcmFtZTo6c2Nyb2xsUG9zaXRpb24oKSBjb25zdAorewor
ICAgIHJldHVybiBkLT5zY3JvbGxQb3NpdGlvbigpOworfQorCit2b2lkIFFXZWJGcmFtZTo6c2V0
U2Nyb2xsUG9zaXRpb24oY29uc3QgUVBvaW50ICZwb3MpCit7CisgICAgUVBvaW50IGN1cnJlbnQg
PSBzY3JvbGxQb3NpdGlvbigpOworICAgIGludCBkeCA9IHBvcy54KCkgLSBjdXJyZW50LngoKTsK
KyAgICBpbnQgZHkgPSBwb3MueSgpIC0gY3VycmVudC55KCk7CisgICAgc2Nyb2xsKGR4LCBkeSk7
Cit9CisKKy8qIQorICBcc2luY2UgNC43CisgIFNjcm9sbHMgdGhlIGZyYW1lIHRvIHRoZSBnaXZl
biBcYSBhbmNob3IgbmFtZS4KKyovCit2b2lkIFFXZWJGcmFtZTo6c2Nyb2xsVG9BbmNob3IoY29u
c3QgUVN0cmluZyYgYW5jaG9yKQoreworICAgIGQtPnNjcm9sbFRvQW5jaG9yKGFuY2hvcik7Cit9
CisKKy8qIQorICBcc2luY2UgNC42CisgIFJlbmRlciB0aGUgXGEgbGF5ZXIgb2YgdGhlIGZyYW1l
IHVzaW5nIFxhIHBhaW50ZXIgY2xpcHBpbmcgdG8gXGEgY2xpcC4KKworICBcc2EgcHJpbnQoKQor
Ki8KKwordm9pZCBRV2ViRnJhbWU6OnJlbmRlcihRUGFpbnRlciogcGFpbnRlciwgUmVuZGVyTGF5
ZXJzIGxheWVyLCBjb25zdCBRUmVnaW9uJiBjbGlwKQoreworICAgIGlmICghY2xpcC5pc0VtcHR5
KCkpCisgICAgICAgIGQtPnJlbmRlclJlbGF0aXZlQ29vcmRzKHBhaW50ZXIsIGxheWVyLCBjbGlw
KTsKKyAgICBlbHNlIGlmIChkLT5oYXNWaWV3KCkpCisgICAgICAgIGQtPnJlbmRlclJlbGF0aXZl
Q29vcmRzKHBhaW50ZXIsIGxheWVyLCBRUmVnaW9uKGQtPmZyYW1lUmVjdCgpKSk7Cit9CisKKy8q
IQorICBSZW5kZXIgdGhlIGZyYW1lIGludG8gXGEgcGFpbnRlciBjbGlwcGluZyB0byBcYSBjbGlw
LgorKi8KK3ZvaWQgUVdlYkZyYW1lOjpyZW5kZXIoUVBhaW50ZXIqIHBhaW50ZXIsIGNvbnN0IFFS
ZWdpb24mIGNsaXApCit7CisgICAgcmVuZGVyKHBhaW50ZXIsIEFsbExheWVycywgY2xpcCk7Cit9
CisKKy8qIQorICAgIFxwcm9wZXJ0eSBRV2ViRnJhbWU6OnRleHRTaXplTXVsdGlwbGllcgorICAg
IFxicmllZiB0aGUgc2NhbGluZyBmYWN0b3IgZm9yIGFsbCB0ZXh0IGluIHRoZSBmcmFtZQorICAg
IFxvYnNvbGV0ZQorCisgICAgVXNlIHNldFpvb21GYWN0b3IgaW5zdGVhZCwgaW4gY29tYmluYXRp
b24gd2l0aCB0aGUgWm9vbVRleHRPbmx5IGF0dHJpYnV0ZSBpbgorICAgIFFXZWJTZXR0aW5ncy4K
KworICAgIFxub3RlIFNldHRpbmcgdGhpcyBwcm9wZXJ0eSBhbHNvIGVuYWJsZXMgdGhlIFpvb21U
ZXh0T25seSBhdHRyaWJ1dGUgaW4KKyAgICBRV2ViU2V0dGluZ3MuCisqLworCisvKiEKKyAgICBT
ZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbXVsdGlwbGllciB1c2VkIHRvIHNjYWxlIHRoZSB0ZXh0IGlu
IGEgV2ViIGZyYW1lIHRvCisgICAgdGhlIFxhIGZhY3RvciBzcGVjaWZpZWQuCisqLwordm9pZCBR
V2ViRnJhbWU6OnNldFRleHRTaXplTXVsdGlwbGllcihxcmVhbCBmYWN0b3IpCit7CisgICAgZC0+
c2V0Wm9vbUZhY3RvcihmYWN0b3IpOworfQorCisvKiEKKyAgICBSZXR1cm5zIHRoZSB2YWx1ZSBv
ZiB0aGUgbXVsdGlwbGllciB1c2VkIHRvIHNjYWxlIHRoZSB0ZXh0IGluIGEgV2ViIGZyYW1lLgor
Ki8KK3FyZWFsIFFXZWJGcmFtZTo6dGV4dFNpemVNdWx0aXBsaWVyKCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gZC0+em9vbUZhY3RvcigpOworfQorCisvKiEKKyAgICBccHJvcGVydHkgUVdlYkZyYW1l
Ojp6b29tRmFjdG9yCisgICAgXHNpbmNlIDQuNQorICAgIFxicmllZiB0aGUgem9vbSBmYWN0b3Ig
Zm9yIHRoZSBmcmFtZQorKi8KKwordm9pZCBRV2ViRnJhbWU6OnNldFpvb21GYWN0b3IocXJlYWwg
ZmFjdG9yKQoreworICAgIGQtPnNldFpvb21GYWN0b3IoZmFjdG9yKTsKK30KKworcXJlYWwgUVdl
YkZyYW1lOjp6b29tRmFjdG9yKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZC0+em9vbUZhY3Rvcigp
OworfQorCisvKiEKKyAgICBccHJvcGVydHkgUVdlYkZyYW1lOjpmb2N1cworICAgIFxzaW5jZSA0
LjYKKworICAgIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGZyYW1lIGhhcyBrZXlib2FyZCBpbnB1dCBm
b2N1czsgb3RoZXJ3aXNlLCByZXR1cm5zIGZhbHNlLgorKi8KK2Jvb2wgUVdlYkZyYW1lOjpoYXNG
b2N1cygpIGNvbnN0Cit7CisgICAgcmV0dXJuIGQtPmhhc0ZvY3VzKCk7Cit9CisKKy8qIQorICAg
IFxzaW5jZSA0LjYKKworICAgIEdpdmVzIGtleWJvYXJkIGlucHV0IGZvY3VzIHRvIHRoaXMgZnJh
bWUuCisqLwordm9pZCBRV2ViRnJhbWU6OnNldEZvY3VzKCkKK3sKKyAgICBkLT5zZXRGb2N1cygp
OworfQorCisvKiEKKyAgICBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgZnJhbWUgcmVsYXRp
dmUgdG8gaXQncyBwYXJlbnQgZnJhbWUuCisqLworUVBvaW50IFFXZWJGcmFtZTo6cG9zKCkgY29u
c3QKK3sKKyAgICBpZiAoIWQtPmhhc1ZpZXcoKSkKKyAgICAgICAgcmV0dXJuIFFQb2ludCgpOwor
CisgICAgcmV0dXJuIGQtPmZyYW1lUmVjdCgpLnRvcExlZnQoKTsKK30KKworLyohCisgICAgUmV0
dXJuIHRoZSBnZW9tZXRyeSBvZiB0aGUgZnJhbWUgcmVsYXRpdmUgdG8gaXQncyBwYXJlbnQgZnJh
bWUuCisqLworUVJlY3QgUVdlYkZyYW1lOjpnZW9tZXRyeSgpIGNvbnN0Cit7CisgICAgcmV0dXJu
IGQtPmZyYW1lUmVjdCgpOworfQorCisvKiEKKyAgICBccHJvcGVydHkgUVdlYkZyYW1lOjpjb250
ZW50c1NpemUKKyAgICBcYnJpZWYgdGhlIHNpemUgb2YgdGhlIGNvbnRlbnRzIGluIHRoaXMgZnJh
bWUKKworICAgIFxzYSBjb250ZW50c1NpemVDaGFuZ2VkKCkKKyovCitRU2l6ZSBRV2ViRnJhbWU6
OmNvbnRlbnRzU2l6ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGQtPmNvbnRlbnRzU2l6ZSgpOwor
fQorCisvKiEKKyAgICBcc2luY2UgNC42CisKKyAgICBSZXR1cm5zIHRoZSBkb2N1bWVudCBlbGVt
ZW50IG9mIHRoaXMgZnJhbWUuCisKKyAgICBUaGUgZG9jdW1lbnQgZWxlbWVudCBwcm92aWRlcyBh
Y2Nlc3MgdG8gdGhlIGVudGlyZSBzdHJ1Y3R1cmVkCisgICAgY29udGVudCBvZiB0aGUgZnJhbWUu
CisqLworUVdlYkVsZW1lbnQgUVdlYkZyYW1lOjpkb2N1bWVudEVsZW1lbnQoKSBjb25zdAorewor
ICAgIHJldHVybiBkLT5kb2N1bWVudEVsZW1lbnQoKTsKK30KKworLyohCisgICAgXHNpbmNlIDQu
NgorICAgIFJldHVybnMgYSBuZXcgbGlzdCBvZiBlbGVtZW50cyBtYXRjaGluZyB0aGUgZ2l2ZW4g
Q1NTIHNlbGVjdG9yIFxhIHNlbGVjdG9yUXVlcnkuCisgICAgSWYgdGhlcmUgYXJlIG5vIG1hdGNo
aW5nIGVsZW1lbnRzLCBhbiBlbXB0eSBsaXN0IGlzIHJldHVybmVkLgorCisgICAgXGx7aHR0cDov
L3d3dy53My5vcmcvVFIvUkVDLUNTUzIvc2VsZWN0b3IuaHRtbCNxMX17U3RhbmRhcmQgQ1NTMiBz
ZWxlY3Rvcn0gc3ludGF4IGlzCisgICAgdXNlZCBmb3IgdGhlIHF1ZXJ5LgorCisgICAgXHNhIFFX
ZWJFbGVtZW50OjpmaW5kQWxsKCkKKyovCitRV2ViRWxlbWVudENvbGxlY3Rpb24gUVdlYkZyYW1l
OjpmaW5kQWxsRWxlbWVudHMoY29uc3QgUVN0cmluZyAmc2VsZWN0b3JRdWVyeSkgY29uc3QKK3sK
KyAgICByZXR1cm4gZG9jdW1lbnRFbGVtZW50KCkuZmluZEFsbChzZWxlY3RvclF1ZXJ5KTsKK30K
KworLyohCisgICAgXHNpbmNlIDQuNgorICAgIFJldHVybnMgdGhlIGZpcnN0IGVsZW1lbnQgaW4g
dGhlIGZyYW1lJ3MgZG9jdW1lbnQgdGhhdCBtYXRjaGVzIHRoZQorICAgIGdpdmVuIENTUyBzZWxl
Y3RvciBcYSBzZWxlY3RvclF1ZXJ5LiBJZiB0aGVyZSBpcyBubyBtYXRjaGluZyBlbGVtZW50LCBh
CisgICAgbnVsbCBlbGVtZW50IGlzIHJldHVybmVkLgorCisgICAgXGx7aHR0cDovL3d3dy53My5v
cmcvVFIvUkVDLUNTUzIvc2VsZWN0b3IuaHRtbCNxMX17U3RhbmRhcmQgQ1NTMiBzZWxlY3Rvcn0g
c3ludGF4IGlzCisgICAgdXNlZCBmb3IgdGhlIHF1ZXJ5LgorCisgICAgXHNhIFFXZWJFbGVtZW50
OjpmaW5kRmlyc3QoKQorKi8KK1FXZWJFbGVtZW50IFFXZWJGcmFtZTo6ZmluZEZpcnN0RWxlbWVu
dChjb25zdCBRU3RyaW5nICZzZWxlY3RvclF1ZXJ5KSBjb25zdAoreworICAgIHJldHVybiBkb2N1
bWVudEVsZW1lbnQoKS5maW5kRmlyc3Qoc2VsZWN0b3JRdWVyeSk7Cit9CisKKy8qIQorICAgIFBl
cmZvcm1zIGEgaGl0IHRlc3Qgb24gdGhlIGZyYW1lIGNvbnRlbnRzIGF0IHRoZSBnaXZlbiBwb3Np
dGlvbiBcYSBwb3MgYW5kIHJldHVybnMgdGhlIGhpdCB0ZXN0IHJlc3VsdC4KKyovCitRV2ViSGl0
VGVzdFJlc3VsdCBRV2ViRnJhbWU6OmhpdFRlc3RDb250ZW50KGNvbnN0IFFQb2ludCAmcG9zKSBj
b25zdAoreworICAgIFFXZWJIaXRUZXN0UmVzdWx0UHJpdmF0ZSogcmVzdWx0ID0gZC0+aGl0VGVz
dENvbnRlbnQocG9zKTsKKworICAgIGlmICghcmVzdWx0KQorICAgICAgICByZXR1cm4gUVdlYkhp
dFRlc3RSZXN1bHQoKTsKKworICAgIHJldHVybiBRV2ViSGl0VGVzdFJlc3VsdChyZXN1bHQpOwor
fQorCisvKiEgXHJlaW1wCisqLworYm9vbCBRV2ViRnJhbWU6OmV2ZW50KFFFdmVudCAqZSkKK3sK
KyAgICByZXR1cm4gUU9iamVjdDo6ZXZlbnQoZSk7Cit9CisKKyNpZm5kZWYgUVRfTk9fUFJJTlRF
UgorLyohCisgICAgUHJpbnRzIHRoZSBmcmFtZSB0byB0aGUgZ2l2ZW4gXGEgcHJpbnRlci4KKwor
ICAgIFxzYSByZW5kZXIoKQorKi8KK3ZvaWQgUVdlYkZyYW1lOjpwcmludChRUHJpbnRlciAqcHJp
bnRlcikgY29uc3QKK3sKKyNpZiBIQVZFKFFUUFJJTlRTVVBQT1JUKQorICAgIFFQYWludGVyIHBh
aW50ZXI7CisgICAgaWYgKCFwYWludGVyLmJlZ2luKHByaW50ZXIpKQorICAgICAgICByZXR1cm47
CisKKyAgICBjb25zdCBxcmVhbCB6b29tRmFjdG9yWCA9IChxcmVhbClwcmludGVyLT5sb2dpY2Fs
RHBpWCgpIC8gcXRfZGVmYXVsdERwaSgpOworICAgIGNvbnN0IHFyZWFsIHpvb21GYWN0b3JZID0g
KHFyZWFsKXByaW50ZXItPmxvZ2ljYWxEcGlZKCkgLyBxdF9kZWZhdWx0RHBpKCk7CisKKyAgICBR
UmVjdCBxcHJpbnRlclJlY3QgPSBwcmludGVyLT5wYWdlUmVjdCgpOworCisgICAgUVJlY3QgcGFn
ZVJlY3QoMCwgMCwgaW50KHFwcmludGVyUmVjdC53aWR0aCgpIC8gem9vbUZhY3RvclgpLCBpbnQo
cXByaW50ZXJSZWN0LmhlaWdodCgpIC8gem9vbUZhY3RvclkpKTsKKworICAgIFF0UHJpbnRDb250
ZXh0IHByaW50Q29udGV4dCgmcGFpbnRlciwgcGFnZVJlY3QsIGQpOworCisgICAgaW50IGRvY0Nv
cGllczsKKyAgICBpbnQgcGFnZUNvcGllczsKKyAgICBpZiAocHJpbnRlci0+Y29sbGF0ZUNvcGll
cygpKSB7CisgICAgICAgIGRvY0NvcGllcyA9IDE7CisgICAgICAgIHBhZ2VDb3BpZXMgPSBwcmlu
dGVyLT5udW1Db3BpZXMoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkb2NDb3BpZXMgPSBwcmlu
dGVyLT5udW1Db3BpZXMoKTsKKyAgICAgICAgcGFnZUNvcGllcyA9IDE7CisgICAgfQorCisgICAg
aW50IGZyb21QYWdlID0gcHJpbnRlci0+ZnJvbVBhZ2UoKTsKKyAgICBpbnQgdG9QYWdlID0gcHJp
bnRlci0+dG9QYWdlKCk7CisgICAgYm9vbCBhc2NlbmRpbmcgPSB0cnVlOworCisgICAgaWYgKCFm
cm9tUGFnZSAmJiAhdG9QYWdlKSB7CisgICAgICAgIGZyb21QYWdlID0gMTsKKyAgICAgICAgdG9Q
YWdlID0gcHJpbnRDb250ZXh0LnBhZ2VDb3VudCgpOworICAgIH0KKyAgICAvLyBwYXJhbm9pYSBj
aGVjaworICAgIGZyb21QYWdlID0gcU1heCgxLCBmcm9tUGFnZSk7CisgICAgdG9QYWdlID0gcU1p
bihzdGF0aWNfY2FzdDxpbnQ+KHByaW50Q29udGV4dC5wYWdlQ291bnQoKSksIHRvUGFnZSk7Cisg
ICAgaWYgKHRvUGFnZSA8IGZyb21QYWdlKSB7CisgICAgICAgIC8vIGlmIHRoZSB1c2VyIGVudGVy
ZWQgYSBwYWdlIHJhbmdlIG91dHNpZGUgdGhlIGFjdHVhbCBudW1iZXIKKyAgICAgICAgLy8gb2Yg
cHJpbnRhYmxlIHBhZ2VzLCBqdXN0IHJldHVybgorICAgICAgICByZXR1cm47CisgICAgfQorCisg
ICAgaWYgKHByaW50ZXItPnBhZ2VPcmRlcigpID09IFFQcmludGVyOjpMYXN0UGFnZUZpcnN0KSB7
CisgICAgICAgIGludCB0bXAgPSBmcm9tUGFnZTsKKyAgICAgICAgZnJvbVBhZ2UgPSB0b1BhZ2U7
CisgICAgICAgIHRvUGFnZSA9IHRtcDsKKyAgICAgICAgYXNjZW5kaW5nID0gZmFsc2U7CisgICAg
fQorCisgICAgcGFpbnRlci5zY2FsZSh6b29tRmFjdG9yWCwgem9vbUZhY3RvclkpOworCisgICAg
Zm9yIChpbnQgaSA9IDA7IGkgPCBkb2NDb3BpZXM7ICsraSkgeworICAgICAgICBpbnQgcGFnZSA9
IGZyb21QYWdlOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgZm9yIChpbnQg
aiA9IDA7IGogPCBwYWdlQ29waWVzOyArK2opIHsKKyAgICAgICAgICAgICAgICBpZiAocHJpbnRl
ci0+cHJpbnRlclN0YXRlKCkgPT0gUVByaW50ZXI6OkFib3J0ZWQKKyAgICAgICAgICAgICAgICAg
ICAgfHwgcHJpbnRlci0+cHJpbnRlclN0YXRlKCkgPT0gUVByaW50ZXI6OkVycm9yKSB7CisgICAg
ICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAg
ICAgcHJpbnRDb250ZXh0LnNwb29sUGFnZShwYWdlIC0gMSwgcGFnZVJlY3Qud2lkdGgoKSk7Cisg
ICAgICAgICAgICAgICAgaWYgKGogPCBwYWdlQ29waWVzIC0gMSkKKyAgICAgICAgICAgICAgICAg
ICAgcHJpbnRlci0+bmV3UGFnZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAo
cGFnZSA9PSB0b1BhZ2UpCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGlm
IChhc2NlbmRpbmcpCisgICAgICAgICAgICAgICAgKytwYWdlOworICAgICAgICAgICAgZWxzZQor
ICAgICAgICAgICAgICAgIC0tcGFnZTsKKworICAgICAgICAgICAgcHJpbnRlci0+bmV3UGFnZSgp
OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGkgPCBkb2NDb3BpZXMgLSAxKQorICAgICAgICAg
ICAgcHJpbnRlci0+bmV3UGFnZSgpOworICAgIH0KKyNlbmRpZiAvLyBIQVZFKFBSSU5UU1VQUE9S
VCkKK30KKyNlbmRpZiAvLyBRVF9OT19QUklOVEVSCisKKy8qIQorICAgIEV2YWx1YXRlcyB0aGUg
SmF2YVNjcmlwdCBkZWZpbmVkIGJ5IFxhIHNjcmlwdFNvdXJjZSB1c2luZyB0aGlzIGZyYW1lIGFz
IGNvbnRleHQKKyAgICBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGV4ZWN1dGVk
IHN0YXRlbWVudC4KKworICAgIFxzYSBhZGRUb0phdmFTY3JpcHRXaW5kb3dPYmplY3QoKSwgamF2
YVNjcmlwdFdpbmRvd09iamVjdENsZWFyZWQoKQorKi8KK1FWYXJpYW50IFFXZWJGcmFtZTo6ZXZh
bHVhdGVKYXZhU2NyaXB0KGNvbnN0IFFTdHJpbmcmIHNjcmlwdFNvdXJjZSkKK3sKKyAgICByZXR1
cm4gZC0+ZXZhbHVhdGVKYXZhU2NyaXB0KHNjcmlwdFNvdXJjZSk7Cit9CisKKy8qIQorICAgIFxz
aW5jZSA0LjUKKworICAgIFJldHVybnMgdGhlIGZyYW1lJ3Mgc2VjdXJpdHkgb3JpZ2luLgorKi8K
K1FXZWJTZWN1cml0eU9yaWdpbiBRV2ViRnJhbWU6OnNlY3VyaXR5T3JpZ2luKCkgY29uc3QKK3sK
KyAgICByZXR1cm4gZC0+c2VjdXJpdHlPcmlnaW4oKTsKK30KKworUVdlYkZyYW1lICpRV2ViRnJh
bWVQcml2YXRlOjpraXQoY29uc3QgUVdlYkZyYW1lQWRhcHRlciogZnJhbWVBZGFwdGVyKQorewor
ICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBRV2ViRnJhbWVQcml2YXRlKj4oZnJhbWVBZGFw
dGVyKS0+cTsKK30KKworCisvKiEKKyAgICBcZm4gdm9pZCBRV2ViRnJhbWU6OmphdmFTY3JpcHRX
aW5kb3dPYmplY3RDbGVhcmVkKCkKKworICAgIFRoaXMgc2lnbmFsIGlzIGVtaXR0ZWQgd2hlbmV2
ZXIgdGhlIGdsb2JhbCB3aW5kb3cgb2JqZWN0IG9mIHRoZSBKYXZhU2NyaXB0CisgICAgZW52aXJv
bm1lbnQgaXMgY2xlYXJlZCwgZS5nLiwgYmVmb3JlIHN0YXJ0aW5nIGEgbmV3IGxvYWQuCisKKyAg
ICBJZiB5b3UgaW50ZW5kIHRvIGFkZCBRT2JqZWN0cyB0byBhIFFXZWJGcmFtZSB1c2luZworICAg
IGFkZFRvSmF2YVNjcmlwdFdpbmRvd09iamVjdCgpLCB5b3Ugc2hvdWxkIGFkZCB0aGVtIGluIGEg
c2xvdCBjb25uZWN0ZWQKKyAgICB0byB0aGlzIHNpZ25hbC4gVGhpcyBlbnN1cmVzIHRoYXQgeW91
ciBvYmplY3RzIHJlbWFpbiBhY2Nlc3NpYmxlIHdoZW4KKyAgICBsb2FkaW5nIG5ldyBVUkxzLgor
Ki8KKworLyohCisgICAgXGZuIHZvaWQgUVdlYkZyYW1lOjpwcm92aXNpb25hbExvYWQoKQorICAg
IFxpbnRlcm5hbAorKi8KKworLyohCisgICAgXGZuIHZvaWQgUVdlYkZyYW1lOjp0aXRsZUNoYW5n
ZWQoY29uc3QgUVN0cmluZyAmdGl0bGUpCisKKyAgICBUaGlzIHNpZ25hbCBpcyBlbWl0dGVkIHdo
ZW5ldmVyIHRoZSB0aXRsZSBvZiB0aGUgZnJhbWUgY2hhbmdlcy4KKyAgICBUaGUgXGEgdGl0bGUg
c3RyaW5nIHNwZWNpZmllcyB0aGUgbmV3IHRpdGxlLgorCisgICAgXHNhIHRpdGxlKCkKKyovCisK
Ky8qIQorICAgIFxmbiB2b2lkIFFXZWJGcmFtZTo6dXJsQ2hhbmdlZChjb25zdCBRVXJsICZ1cmwp
CisKKyAgICBUaGlzIHNpZ25hbCBpcyBlbWl0dGVkIHdpdGggdGhlIFVSTCBvZiB0aGUgZnJhbWUg
d2hlbiB0aGUgZnJhbWUncyB0aXRsZSBpcworICAgIHJlY2VpdmVkLiBUaGUgbmV3IFVSTCBpcyBz
cGVjaWZpZWQgYnkgXGEgdXJsLgorCisgICAgXHNhIHVybCgpCisqLworCisvKiEKKyAgICBcZm4g
dm9pZCBRV2ViRnJhbWU6OmluaXRpYWxMYXlvdXRDb21wbGV0ZWQoKQorCisgICAgVGhpcyBzaWdu
YWwgaXMgZW1pdHRlZCB3aGVuIHRoZSBmcmFtZSBpcyBsYWlkIG91dCB0aGUgZmlyc3QgdGltZS4K
KyAgICBUaGlzIGlzIHRoZSBmaXJzdCB0aW1lIHlvdSB3aWxsIHNlZSBjb250ZW50cyBkaXNwbGF5
ZWQgb24gdGhlIGZyYW1lLgorCisgICAgXG5vdGUgQSBmcmFtZSBjYW4gYmUgbGFpZCBvdXQgbXVs
dGlwbGUgdGltZXMuCisqLworCisvKiEKKyAgXGZuIHZvaWQgUVdlYkZyYW1lOjppY29uQ2hhbmdl
ZCgpCisKKyAgVGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuIHRoZSBpY29uICgiZmF2aWNvbiIp
IGFzc29jaWF0ZWQgd2l0aCB0aGUgZnJhbWUKKyAgaGFzIGJlZW4gbG9hZGVkLgorCisgIFxzYSBp
Y29uKCkKKyovCisKKy8qIQorICBcZm4gdm9pZCBRV2ViRnJhbWU6OmNvbnRlbnRzU2l6ZUNoYW5n
ZWQoY29uc3QgUVNpemUgJnNpemUpCisgIFxzaW5jZSA0LjYKKworICBUaGlzIHNpZ25hbCBpcyBl
bWl0dGVkIHdoZW4gdGhlIGZyYW1lJ3MgY29udGVudHMgc2l6ZSBjaGFuZ2VzCisgIHRvIFxhIHNp
emUuCisKKyAgXHNhIGNvbnRlbnRzU2l6ZSgpCisqLworCisvKiEKKyAgICBcZm4gdm9pZCBRV2Vi
RnJhbWU6OmxvYWRTdGFydGVkKCkKKyAgICBcc2luY2UgNC42CisKKyAgICBUaGlzIHNpZ25hbCBp
cyBlbWl0dGVkIHdoZW4gYSBuZXcgbG9hZCBvZiB0aGlzIGZyYW1lIGlzIHN0YXJ0ZWQuCisKKyAg
ICBcc2EgbG9hZEZpbmlzaGVkKCkKKyovCisKKy8qIQorICAgIFxmbiB2b2lkIFFXZWJGcmFtZTo6
bG9hZEZpbmlzaGVkKGJvb2wgb2spCisgICAgXHNpbmNlIDQuNgorCisgICAgVGhpcyBzaWduYWwg
aXMgZW1pdHRlZCB3aGVuIGEgbG9hZCBvZiB0aGlzIGZyYW1lIGlzIGZpbmlzaGVkLgorICAgIFxh
IG9rIHdpbGwgaW5kaWNhdGUgd2hldGhlciB0aGUgbG9hZCB3YXMgc3VjY2Vzc2Z1bCBvciBhbnkg
ZXJyb3Igb2NjdXJyZWQuCisKKyAgICBcc2EgbG9hZFN0YXJ0ZWQoKQorKi8KKworLyohCisgICAg
XGZuIHZvaWQgUVdlYkZyYW1lOjpwYWdlQ2hhbmdlZCgpCisgICAgXHNpbmNlIDQuNworCisgICAg
VGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuIHRoaXMgZnJhbWUgaGFzIGJlZW4gbW92ZWQgdG8g
YSBkaWZmZXJlbnQgUVdlYlBhZ2UuCisKKyAgICBcc2EgcGFnZSgpCisqLworCisvKiEKKyAgICBc
Y2xhc3MgUVdlYkhpdFRlc3RSZXN1bHQKKyAgICBcc2luY2UgNC40CisgICAgXGJyaWVmIFRoZSBR
V2ViSGl0VGVzdFJlc3VsdCBjbGFzcyBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgd2Vi
CisgICAgcGFnZSBjb250ZW50IGFmdGVyIGEgaGl0IHRlc3QuCisKKyAgICBcaW5tb2R1bGUgUXRX
ZWJLaXQKKworICAgIFFXZWJIaXRUZXN0UmVzdWx0IGlzIHJldHVybmVkIGJ5IFFXZWJGcmFtZTo6
aGl0VGVzdENvbnRlbnQoKSB0byBwcm92aWRlCisgICAgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNv
bnRlbnQgb2YgdGhlIHdlYiBwYWdlIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uCisqLworCisv
KiEKKyAgICBcaW50ZXJuYWwKKyovCitRV2ViSGl0VGVzdFJlc3VsdDo6UVdlYkhpdFRlc3RSZXN1
bHQoUVdlYkhpdFRlc3RSZXN1bHRQcml2YXRlICpwcml2KQorICAgIDogZChwcml2KQoreworfQor
CisvKiEKKyAgICBDb25zdHJ1Y3RzIGEgbnVsbCBoaXQgdGVzdCByZXN1bHQuCisqLworUVdlYkhp
dFRlc3RSZXN1bHQ6OlFXZWJIaXRUZXN0UmVzdWx0KCkKKyAgICA6IGQoMCkKK3sKK30KKworLyoh
CisgICAgQ29uc3RydWN0cyBhIGhpdCB0ZXN0IHJlc3VsdCBmcm9tIFxhIG90aGVyLgorKi8KK1FX
ZWJIaXRUZXN0UmVzdWx0OjpRV2ViSGl0VGVzdFJlc3VsdChjb25zdCBRV2ViSGl0VGVzdFJlc3Vs
dCAmb3RoZXIpCisgICAgOiBkKDApCit7CisgICAgaWYgKG90aGVyLmQpCisgICAgICAgIGQgPSBu
ZXcgUVdlYkhpdFRlc3RSZXN1bHRQcml2YXRlKCpvdGhlci5kKTsKK30KKworLyohCisgICAgQXNz
aWducyB0aGUgXGEgb3RoZXIgaGl0IHRlc3QgcmVzdWx0IHRvIHRoaXMuCisqLworUVdlYkhpdFRl
c3RSZXN1bHQgJlFXZWJIaXRUZXN0UmVzdWx0OjpvcGVyYXRvcj0oY29uc3QgUVdlYkhpdFRlc3RS
ZXN1bHQgJm90aGVyKQoreworICAgIGlmICh0aGlzICE9ICZvdGhlcikgeworICAgICAgICBpZiAo
b3RoZXIuZCkgeworICAgICAgICAgICAgaWYgKCFkKQorICAgICAgICAgICAgICAgIGQgPSBuZXcg
UVdlYkhpdFRlc3RSZXN1bHRQcml2YXRlOworICAgICAgICAgICAgKmQgPSAqb3RoZXIuZDsKKyAg
ICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlbGV0ZSBkOworICAgICAgICAgICAgZCA9IDA7
CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworfQorCisvKiEKKyAgICBEZXN0
cnVjdG9yLgorKi8KK1FXZWJIaXRUZXN0UmVzdWx0Ojp+UVdlYkhpdFRlc3RSZXN1bHQoKQorewor
ICAgIGRlbGV0ZSBkOworfQorCisvKiEKKyAgICBSZXR1cm5zIHRydWUgaWYgdGhlIGhpdCB0ZXN0
IHJlc3VsdCBpcyBudWxsOyBvdGhlcndpc2UgcmV0dXJucyBmYWxzZS4KKyovCitib29sIFFXZWJI
aXRUZXN0UmVzdWx0Ojppc051bGwoKSBjb25zdAoreworICAgIHJldHVybiAhZDsKK30KKworLyoh
CisgICAgUmV0dXJucyB0aGUgcG9zaXRpb24gd2hlcmUgdGhlIGhpdCB0ZXN0IG9jY3VyZWQgaW4g
dGhlIGNvb3JkaW5hdGVzIG9mIGZyYW1lIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnQgaGl0LgorCisg
ICAgXHNhIGZyYW1lKCkKKyovCitRUG9pbnQgUVdlYkhpdFRlc3RSZXN1bHQ6OnBvcygpIGNvbnN0
Cit7CisgICAgaWYgKCFkKQorICAgICAgICByZXR1cm4gUVBvaW50KCk7CisgICAgcmV0dXJuIGQt
PnBvczsKK30KKworLyohCisgICAgXHNpbmNlIDQuNQorICAgIFJldHVybnMgdGhlIGJvdW5kaW5n
IHJlY3Qgb2YgdGhlIGVsZW1lbnQuCisqLworUVJlY3QgUVdlYkhpdFRlc3RSZXN1bHQ6OmJvdW5k
aW5nUmVjdCgpIGNvbnN0Cit7CisgICAgaWYgKCFkKQorICAgICAgICByZXR1cm4gUVJlY3QoKTsK
KyAgICByZXR1cm4gZC0+Ym91bmRpbmdSZWN0OworfQorCisvKiEKKyAgICBcc2luY2UgNC42Cisg
ICAgUmV0dXJucyB0aGUgYmxvY2sgZWxlbWVudCB0aGF0IGVuY2xvc2VzIHRoZSBlbGVtZW50IGhp
dC4KKworICAgIEEgYmxvY2sgZWxlbWVudCBpcyBhbiBlbGVtZW50IHRoYXQgaXMgcmVuZGVyZWQg
dXNpbmcgdGhlCisgICAgQ1NTICJibG9jayIgc3R5bGUuIFRoaXMgaW5jbHVkZXMgZm9yIGV4YW1w
bGUgdGV4dAorICAgIHBhcmFncmFwaHMuCisqLworUVdlYkVsZW1lbnQgUVdlYkhpdFRlc3RSZXN1
bHQ6OmVuY2xvc2luZ0Jsb2NrRWxlbWVudCgpIGNvbnN0Cit7CisgICAgaWYgKCFkKQorICAgICAg
ICByZXR1cm4gUVdlYkVsZW1lbnQoKTsKKyAgICByZXR1cm4gZC0+ZW5jbG9zaW5nQmxvY2s7Cit9
CisKKy8qIQorICAgIFJldHVybnMgdGhlIHRpdGxlIG9mIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBI
VE1MIGVsZW1lbnQuCisqLworUVN0cmluZyBRV2ViSGl0VGVzdFJlc3VsdDo6dGl0bGUoKSBjb25z
dAoreworICAgIGlmICghZCkKKyAgICAgICAgcmV0dXJuIFFTdHJpbmcoKTsKKyAgICByZXR1cm4g
ZC0+dGl0bGU7Cit9CisKKy8qIQorICAgIFJldHVybnMgdGhlIHRleHQgb2YgdGhlIGxpbmsuCisq
LworUVN0cmluZyBRV2ViSGl0VGVzdFJlc3VsdDo6bGlua1RleHQoKSBjb25zdAoreworICAgIGlm
ICghZCkKKyAgICAgICAgcmV0dXJuIFFTdHJpbmcoKTsKKyAgICByZXR1cm4gZC0+bGlua1RleHQ7
Cit9CisKKy8qIQorICAgIFJldHVybnMgdGhlIHVybCB0byB3aGljaCB0aGUgbGluayBwb2ludHMg
dG8uCisqLworUVVybCBRV2ViSGl0VGVzdFJlc3VsdDo6bGlua1VybCgpIGNvbnN0Cit7CisgICAg
aWYgKCFkKQorICAgICAgICByZXR1cm4gUVVybCgpOworICAgIHJldHVybiBkLT5saW5rVXJsOwor
fQorCisvKiEKKyAgICBSZXR1cm5zIHRoZSB0aXRsZSBvZiB0aGUgbGluay4KKyovCitRVXJsIFFX
ZWJIaXRUZXN0UmVzdWx0OjpsaW5rVGl0bGUoKSBjb25zdAoreworICAgIGlmICghZCkKKyAgICAg
ICAgcmV0dXJuIFFVcmwoKTsKKyAgICByZXR1cm4gZC0+bGlua1RpdGxlOworfQorCisvKiEKKyAg
XHNpbmNlIDQuNgorICBSZXR1cm5zIHRoZSBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyB0aGUgbGlu
ay4KKworICBcc2EgbGlua1RhcmdldEZyYW1lKCkKKyovCitRV2ViRWxlbWVudCBRV2ViSGl0VGVz
dFJlc3VsdDo6bGlua0VsZW1lbnQoKSBjb25zdAoreworICAgIGlmICghZCkKKyAgICAgICAgcmV0
dXJuIFFXZWJFbGVtZW50KCk7CisgICAgcmV0dXJuIGQtPmxpbmtFbGVtZW50OworfQorCisvKiEK
KyAgICBSZXR1cm5zIHRoZSBmcmFtZSB0aGF0IHdpbGwgbG9hZCB0aGUgbGluayBpZiBpdCBpcyBh
Y3RpdmF0ZWQuCisKKyAgICBcc2EgbGlua0VsZW1lbnQoKQorKi8KK1FXZWJGcmFtZSAqUVdlYkhp
dFRlc3RSZXN1bHQ6OmxpbmtUYXJnZXRGcmFtZSgpIGNvbnN0Cit7CisgICAgaWYgKCFkKQorICAg
ICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gcW9iamVjdF9jYXN0PFFXZWJGcmFtZSo+KGQtPmxp
bmtUYXJnZXRGcmFtZS5kYXRhKCkpOworfQorCisvKiEKKyAgICBSZXR1cm5zIHRoZSBhbHRlcm5h
dGUgdGV4dCBvZiB0aGUgZWxlbWVudC4gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgSFRNTCBhbHQg
YXR0cmlidXRlLgorKi8KK1FTdHJpbmcgUVdlYkhpdFRlc3RSZXN1bHQ6OmFsdGVybmF0ZVRleHQo
KSBjb25zdAoreworICAgIGlmICghZCkKKyAgICAgICAgcmV0dXJuIFFTdHJpbmcoKTsKKyAgICBy
ZXR1cm4gZC0+YWx0ZXJuYXRlVGV4dDsKK30KKworLyohCisgICAgUmV0dXJucyB0aGUgdXJsIG9m
IHRoZSBpbWFnZS4KKyovCitRVXJsIFFXZWJIaXRUZXN0UmVzdWx0OjppbWFnZVVybCgpIGNvbnN0
Cit7CisgICAgaWYgKCFkKQorICAgICAgICByZXR1cm4gUVVybCgpOworICAgIHJldHVybiBkLT5p
bWFnZVVybDsKK30KKworLyohCisgICAgUmV0dXJucyBhIFFQaXhtYXAgY29udGFpbmluZyB0aGUg
aW1hZ2UuIEEgbnVsbCBwaXhtYXAgaXMgcmV0dXJuZWQgaWYgdGhlCisgICAgZWxlbWVudCBiZWlu
ZyB0ZXN0ZWQgaXMgbm90IGFuIGltYWdlLgorKi8KK1FQaXhtYXAgUVdlYkhpdFRlc3RSZXN1bHQ6
OnBpeG1hcCgpIGNvbnN0Cit7CisgICAgaWYgKCFkKQorICAgICAgICByZXR1cm4gUVBpeG1hcCgp
OworICAgIHJldHVybiBkLT5waXhtYXA7Cit9CisKKy8qIQorICAgIFJldHVybnMgdHJ1ZSBpZiB0
aGUgY29udGVudCBpcyBlZGl0YWJsZSBieSB0aGUgdXNlcjsgb3RoZXJ3aXNlIHJldHVybnMgZmFs
c2UuCisqLworYm9vbCBRV2ViSGl0VGVzdFJlc3VsdDo6aXNDb250ZW50RWRpdGFibGUoKSBjb25z
dAoreworICAgIGlmICghZCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBkLT5p
c0NvbnRlbnRFZGl0YWJsZTsKK30KKworLyohCisgICAgUmV0dXJucyB0cnVlIGlmIHRoZSBjb250
ZW50IHRlc3RlZCBpcyBwYXJ0IG9mIHRoZSBzZWxlY3Rpb247IG90aGVyd2lzZSByZXR1cm5zIGZh
bHNlLgorKi8KK2Jvb2wgUVdlYkhpdFRlc3RSZXN1bHQ6OmlzQ29udGVudFNlbGVjdGVkKCkgY29u
c3QKK3sKKyAgICBpZiAoIWQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gZC0+
aXNDb250ZW50U2VsZWN0ZWQ7Cit9CisKKy8qIQorICAgIFxzaW5jZSA0LjYKKyAgICBSZXR1cm5z
IHRoZSB1bmRlcmx5aW5nIERPTSBlbGVtZW50IGFzIFFXZWJFbGVtZW50LgorKi8KK1FXZWJFbGVt
ZW50IFFXZWJIaXRUZXN0UmVzdWx0OjplbGVtZW50KCkgY29uc3QKK3sKKyAgICBpZiAoIWQpCisg
ICAgICAgIHJldHVybiBRV2ViRWxlbWVudCgpOworCisgICAgcmV0dXJuIGQtPmVsZW1lbnRGb3JJ
bm5lck5vZGUoKTsKK30KKworLyohCisgICAgUmV0dXJucyB0aGUgZnJhbWUgb2YgdGhlIGVsZW1l
bnQgaGl0LgorKi8KK1FXZWJGcmFtZSAqUVdlYkhpdFRlc3RSZXN1bHQ6OmZyYW1lKCkgY29uc3QK
K3sKKyAgICBpZiAoIWQpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBxb2JqZWN0X2Nh
c3Q8UVdlYkZyYW1lKj4oZC0+ZnJhbWUuZGF0YSgpKTsKK30KKworLyohCisgKiBcaW50ZXJuYWwK
KyAqLworUVdlYkZyYW1lQWRhcHRlciAqUVdlYkZyYW1lOjpoYW5kbGUoKSBjb25zdAoreworICAg
IHJldHVybiBkOworfQorCisjaW5jbHVkZSAibW9jX3F3ZWJmcmFtZS5jcHAiCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldEFwaS9xd2ViZnJhbWUuaCBiL1NvdXJjZS9XZWJLaXQv
cXQvV2lkZ2V0QXBpL3F3ZWJmcmFtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmYzNjc2ZmVkN2ZiMWQ0MDc3YTg4
YzUzMzczNWU2ODIyNzAyYTAwOGYKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L3F0
L1dpZGdldEFwaS9xd2ViZnJhbWUuaApAQCAtMCwwICsxLDI0NiBAQAorLyoKKyAgICBDb3B5cmln
aHQgKEMpIDIwMDgsMjAwOSBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnko
LWllcykKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDcgU3RhaWtvcyBDb21wdXRpbmcgU2VydmljZXMg
SW5jLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0
cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO
VSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhl
IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBM
aWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhp
cyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2Vm
dWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxp
ZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMg
TGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVk
IGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFs
b25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3Qs
IHdyaXRlIHRvCisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJh
bmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAgICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVT
QS4KKyovCisKKyNpZm5kZWYgUVdFQkZSQU1FX0gKKyNkZWZpbmUgUVdFQkZSQU1FX0gKKworI2lu
Y2x1ZGUgPFF0Q29yZS9xb2JqZWN0Lmg+CisjaW5jbHVkZSA8UXRDb3JlL3F1cmwuaD4KKyNpbmNs
dWRlIDxRdENvcmUvcXZhcmlhbnQuaD4KKyNpbmNsdWRlIDxRdEd1aS9xaWNvbi5oPgorI2luY2x1
ZGUgPFF0TmV0d29yay9xbmV0d29ya2FjY2Vzc21hbmFnZXIuaD4KKyNpbmNsdWRlIDxRdFdlYktp
dC9xd2Via2l0Z2xvYmFsLmg+CisKK1FUX0JFR0lOX05BTUVTUEFDRQorY2xhc3MgUVJlY3Q7Citj
bGFzcyBRUG9pbnQ7CitjbGFzcyBRUGFpbnRlcjsKK2NsYXNzIFFQaXhtYXA7CitjbGFzcyBRTW91
c2VFdmVudDsKK2NsYXNzIFFXaGVlbEV2ZW50OworY2xhc3MgUU5ldHdvcmtSZXF1ZXN0OworY2xh
c3MgUVJlZ2lvbjsKK2NsYXNzIFFQcmludGVyOworUVRfRU5EX05BTUVTUEFDRQorCitjbGFzcyBR
V2ViTmV0d29ya1JlcXVlc3Q7CitjbGFzcyBRV2ViRnJhbWVBZGFwdGVyOworY2xhc3MgUVdlYkZy
YW1lUHJpdmF0ZTsKK2NsYXNzIFFXZWJQYWdlOworY2xhc3MgUVdlYlBhZ2VBZGFwdGVyOworY2xh
c3MgUVdlYkhpdFRlc3RSZXN1bHQ7CitjbGFzcyBRV2ViSGlzdG9yeUl0ZW07CitjbGFzcyBRV2Vi
U2VjdXJpdHlPcmlnaW47CitjbGFzcyBRV2ViRWxlbWVudDsKK2NsYXNzIFFXZWJFbGVtZW50Q29s
bGVjdGlvbjsKK2NsYXNzIFFXZWJTY3JpcHRXb3JsZDsKKworY2xhc3MgRHVtcFJlbmRlclRyZWVT
dXBwb3J0UXQ7CituYW1lc3BhY2UgV2ViQ29yZSB7CisgICAgY2xhc3MgV2lkZ2V0UHJpdmF0ZTsK
KyAgICBjbGFzcyBGcmFtZUxvYWRlckNsaWVudFF0OworICAgIGNsYXNzIENocm9tZUNsaWVudFF0
OworICAgIGNsYXNzIFRleHR1cmVNYXBwZXJMYXllckNsaWVudFF0OworfQorY2xhc3MgUVdlYkZy
YW1lRGF0YTsKK2NsYXNzIFFXZWJIaXRUZXN0UmVzdWx0UHJpdmF0ZTsKK2NsYXNzIFFXZWJGcmFt
ZTsKKworY2xhc3MgUVdFQktJVF9FWFBPUlQgUVdlYkhpdFRlc3RSZXN1bHQgeworcHVibGljOgor
ICAgIFFXZWJIaXRUZXN0UmVzdWx0KCk7CisgICAgUVdlYkhpdFRlc3RSZXN1bHQoY29uc3QgUVdl
YkhpdFRlc3RSZXN1bHQgJm90aGVyKTsKKyAgICBRV2ViSGl0VGVzdFJlc3VsdCAmb3BlcmF0b3I9
KGNvbnN0IFFXZWJIaXRUZXN0UmVzdWx0ICZvdGhlcik7CisgICAgflFXZWJIaXRUZXN0UmVzdWx0
KCk7CisKKyAgICBib29sIGlzTnVsbCgpIGNvbnN0OworCisgICAgUVBvaW50IHBvcygpIGNvbnN0
OworICAgIFFSZWN0IGJvdW5kaW5nUmVjdCgpIGNvbnN0OworICAgIFFXZWJFbGVtZW50IGVuY2xv
c2luZ0Jsb2NrRWxlbWVudCgpIGNvbnN0OworICAgIFFTdHJpbmcgdGl0bGUoKSBjb25zdDsKKwor
ICAgIFFTdHJpbmcgbGlua1RleHQoKSBjb25zdDsKKyAgICBRVXJsIGxpbmtVcmwoKSBjb25zdDsK
KyAgICBRVXJsIGxpbmtUaXRsZSgpIGNvbnN0OworICAgIFFXZWJGcmFtZSAqbGlua1RhcmdldEZy
YW1lKCkgY29uc3Q7CisgICAgUVdlYkVsZW1lbnQgbGlua0VsZW1lbnQoKSBjb25zdDsKKworICAg
IFFTdHJpbmcgYWx0ZXJuYXRlVGV4dCgpIGNvbnN0OyAvLyBmb3IgaW1nLCBhcmVhLCBpbnB1dCBh
bmQgYXBwbGV0CisKKyAgICBRVXJsIGltYWdlVXJsKCkgY29uc3Q7CisgICAgUVBpeG1hcCBwaXht
YXAoKSBjb25zdDsKKworICAgIGJvb2wgaXNDb250ZW50RWRpdGFibGUoKSBjb25zdDsKKyAgICBi
b29sIGlzQ29udGVudFNlbGVjdGVkKCkgY29uc3Q7CisKKyAgICBRV2ViRWxlbWVudCBlbGVtZW50
KCkgY29uc3Q7CisKKyAgICBRV2ViRnJhbWUgKmZyYW1lKCkgY29uc3Q7CisKK3ByaXZhdGU6Cisg
ICAgUVdlYkhpdFRlc3RSZXN1bHQoUVdlYkhpdFRlc3RSZXN1bHRQcml2YXRlICpwcml2KTsKKyAg
ICBRV2ViSGl0VGVzdFJlc3VsdFByaXZhdGUgKmQ7CisKKyAgICBmcmllbmQgY2xhc3MgUVdlYkZy
YW1lOworICAgIGZyaWVuZCBjbGFzcyBRV2ViUGFnZVByaXZhdGU7CisgICAgZnJpZW5kIGNsYXNz
IFFXZWJQYWdlOworfTsKKworY2xhc3MgUVdFQktJVF9FWFBPUlQgUVdlYkZyYW1lIDogcHVibGlj
IFFPYmplY3QgeworICAgIFFfT0JKRUNUCisgICAgUV9QUk9QRVJUWShxcmVhbCB0ZXh0U2l6ZU11
bHRpcGxpZXIgUkVBRCB0ZXh0U2l6ZU11bHRpcGxpZXIgV1JJVEUgc2V0VGV4dFNpemVNdWx0aXBs
aWVyIERFU0lHTkFCTEUgZmFsc2UpCisgICAgUV9QUk9QRVJUWShxcmVhbCB6b29tRmFjdG9yIFJF
QUQgem9vbUZhY3RvciBXUklURSBzZXRab29tRmFjdG9yKQorICAgIFFfUFJPUEVSVFkoUVN0cmlu
ZyB0aXRsZSBSRUFEIHRpdGxlKQorICAgIFFfUFJPUEVSVFkoUVVybCB1cmwgUkVBRCB1cmwgV1JJ
VEUgc2V0VXJsKQorICAgIFFfUFJPUEVSVFkoUVVybCByZXF1ZXN0ZWRVcmwgUkVBRCByZXF1ZXN0
ZWRVcmwpCisgICAgUV9QUk9QRVJUWShRVXJsIGJhc2VVcmwgUkVBRCBiYXNlVXJsKQorICAgIFFf
UFJPUEVSVFkoUUljb24gaWNvbiBSRUFEIGljb24pCisgICAgUV9QUk9QRVJUWShRU2l6ZSBjb250
ZW50c1NpemUgUkVBRCBjb250ZW50c1NpemUpCisgICAgUV9QUk9QRVJUWShRUG9pbnQgc2Nyb2xs
UG9zaXRpb24gUkVBRCBzY3JvbGxQb3NpdGlvbiBXUklURSBzZXRTY3JvbGxQb3NpdGlvbikKKyAg
ICBRX1BST1BFUlRZKGJvb2wgZm9jdXMgUkVBRCBoYXNGb2N1cykKK3ByaXZhdGU6CisgICAgUVdl
YkZyYW1lKFFXZWJQYWdlICpwYXJlbnRQYWdlKTsKKyAgICBRV2ViRnJhbWUoUVdlYkZyYW1lKiBw
YXJlbnQsIFFXZWJGcmFtZURhdGEqKTsKKyAgICB+UVdlYkZyYW1lKCk7CisKK3B1YmxpYzoKKyAg
ICBlbnVtIFZhbHVlT3duZXJzaGlwIHsKKyAgICAgICAgUXRPd25lcnNoaXAsCisgICAgICAgIFNj
cmlwdE93bmVyc2hpcCwKKyAgICAgICAgQXV0b093bmVyc2hpcAorICAgIH07CisKKyAgICBRV2Vi
UGFnZSAqcGFnZSgpIGNvbnN0OworCisgICAgdm9pZCBsb2FkKGNvbnN0IFFVcmwgJnVybCk7Cisg
ICAgdm9pZCBsb2FkKGNvbnN0IFFOZXR3b3JrUmVxdWVzdCAmcmVxdWVzdCwgUU5ldHdvcmtBY2Nl
c3NNYW5hZ2VyOjpPcGVyYXRpb24gb3BlcmF0aW9uID0gUU5ldHdvcmtBY2Nlc3NNYW5hZ2VyOjpH
ZXRPcGVyYXRpb24sIGNvbnN0IFFCeXRlQXJyYXkgJmJvZHkgPSBRQnl0ZUFycmF5KCkpOworICAg
IHZvaWQgc2V0SHRtbChjb25zdCBRU3RyaW5nICZodG1sLCBjb25zdCBRVXJsICZiYXNlVXJsID0g
UVVybCgpKTsKKyAgICB2b2lkIHNldENvbnRlbnQoY29uc3QgUUJ5dGVBcnJheSAmZGF0YSwgY29u
c3QgUVN0cmluZyAmbWltZVR5cGUgPSBRU3RyaW5nKCksIGNvbnN0IFFVcmwgJmJhc2VVcmwgPSBR
VXJsKCkpOworCisgICAgdm9pZCBhZGRUb0phdmFTY3JpcHRXaW5kb3dPYmplY3QoY29uc3QgUVN0
cmluZyAmbmFtZSwgUU9iamVjdCAqb2JqZWN0LCBWYWx1ZU93bmVyc2hpcCBvd25lcnNoaXAgPSBR
dE93bmVyc2hpcCk7CisgICAgUVN0cmluZyB0b0h0bWwoKSBjb25zdDsKKyAgICBRU3RyaW5nIHRv
UGxhaW5UZXh0KCkgY29uc3Q7CisKKyAgICBRU3RyaW5nIHRpdGxlKCkgY29uc3Q7CisgICAgdm9p
ZCBzZXRVcmwoY29uc3QgUVVybCAmdXJsKTsKKyAgICBRVXJsIHVybCgpIGNvbnN0OworICAgIFFV
cmwgcmVxdWVzdGVkVXJsKCkgY29uc3Q7CisgICAgUVVybCBiYXNlVXJsKCkgY29uc3Q7CisgICAg
UUljb24gaWNvbigpIGNvbnN0OworICAgIFFNdWx0aU1hcDxRU3RyaW5nLCBRU3RyaW5nPiBtZXRh
RGF0YSgpIGNvbnN0OworCisgICAgUVN0cmluZyBmcmFtZU5hbWUoKSBjb25zdDsKKworICAgIFFX
ZWJGcmFtZSAqcGFyZW50RnJhbWUoKSBjb25zdDsKKyAgICBRTGlzdDxRV2ViRnJhbWUqPiBjaGls
ZEZyYW1lcygpIGNvbnN0OworCisgICAgUXQ6OlNjcm9sbEJhclBvbGljeSBzY3JvbGxCYXJQb2xp
Y3koUXQ6Ok9yaWVudGF0aW9uIG9yaWVudGF0aW9uKSBjb25zdDsKKyAgICB2b2lkIHNldFNjcm9s
bEJhclBvbGljeShRdDo6T3JpZW50YXRpb24gb3JpZW50YXRpb24sIFF0OjpTY3JvbGxCYXJQb2xp
Y3kgcG9saWN5KTsKKworICAgIHZvaWQgc2V0U2Nyb2xsQmFyVmFsdWUoUXQ6Ok9yaWVudGF0aW9u
IG9yaWVudGF0aW9uLCBpbnQgdmFsdWUpOworICAgIGludCBzY3JvbGxCYXJWYWx1ZShRdDo6T3Jp
ZW50YXRpb24gb3JpZW50YXRpb24pIGNvbnN0OworICAgIGludCBzY3JvbGxCYXJNaW5pbXVtKFF0
OjpPcmllbnRhdGlvbiBvcmllbnRhdGlvbikgY29uc3Q7CisgICAgaW50IHNjcm9sbEJhck1heGlt
dW0oUXQ6Ok9yaWVudGF0aW9uIG9yaWVudGF0aW9uKSBjb25zdDsKKyAgICBRUmVjdCBzY3JvbGxC
YXJHZW9tZXRyeShRdDo6T3JpZW50YXRpb24gb3JpZW50YXRpb24pIGNvbnN0OworCisgICAgdm9p
ZCBzY3JvbGwoaW50LCBpbnQpOworICAgIFFQb2ludCBzY3JvbGxQb3NpdGlvbigpIGNvbnN0Owor
ICAgIHZvaWQgc2V0U2Nyb2xsUG9zaXRpb24oY29uc3QgUVBvaW50ICZwb3MpOworCisgICAgdm9p
ZCBzY3JvbGxUb0FuY2hvcihjb25zdCBRU3RyaW5nJiBhbmNob3IpOworCisgICAgZW51bSBSZW5k
ZXJMYXllciB7CisgICAgICAgIENvbnRlbnRzTGF5ZXIgPSAweDEwLAorICAgICAgICBTY3JvbGxC
YXJMYXllciA9IDB4MjAsCisgICAgICAgIFBhbkljb25MYXllciA9IDB4NDAsCisKKyAgICAgICAg
QWxsTGF5ZXJzID0gMHhmZgorICAgIH07CisgICAgUV9ERUNMQVJFX0ZMQUdTKFJlbmRlckxheWVy
cywgUmVuZGVyTGF5ZXIpCisKKyAgICB2b2lkIHJlbmRlcihRUGFpbnRlciosIGNvbnN0IFFSZWdp
b24mIGNsaXAgPSBRUmVnaW9uKCkpOworICAgIHZvaWQgcmVuZGVyKFFQYWludGVyKiwgUmVuZGVy
TGF5ZXJzIGxheWVyLCBjb25zdCBRUmVnaW9uJiBjbGlwID0gUVJlZ2lvbigpKTsKKworICAgIHZv
aWQgc2V0VGV4dFNpemVNdWx0aXBsaWVyKHFyZWFsIGZhY3Rvcik7CisgICAgcXJlYWwgdGV4dFNp
emVNdWx0aXBsaWVyKCkgY29uc3Q7CisKKyAgICBxcmVhbCB6b29tRmFjdG9yKCkgY29uc3Q7Cisg
ICAgdm9pZCBzZXRab29tRmFjdG9yKHFyZWFsIGZhY3Rvcik7CisKKyAgICBib29sIGhhc0ZvY3Vz
KCkgY29uc3Q7CisgICAgdm9pZCBzZXRGb2N1cygpOworCisgICAgUVBvaW50IHBvcygpIGNvbnN0
OworICAgIFFSZWN0IGdlb21ldHJ5KCkgY29uc3Q7CisgICAgUVNpemUgY29udGVudHNTaXplKCkg
Y29uc3Q7CisKKyAgICBRV2ViRWxlbWVudCBkb2N1bWVudEVsZW1lbnQoKSBjb25zdDsKKyAgICBR
V2ViRWxlbWVudENvbGxlY3Rpb24gZmluZEFsbEVsZW1lbnRzKGNvbnN0IFFTdHJpbmcgJnNlbGVj
dG9yUXVlcnkpIGNvbnN0OworICAgIFFXZWJFbGVtZW50IGZpbmRGaXJzdEVsZW1lbnQoY29uc3Qg
UVN0cmluZyAmc2VsZWN0b3JRdWVyeSkgY29uc3Q7CisKKyAgICBRV2ViSGl0VGVzdFJlc3VsdCBo
aXRUZXN0Q29udGVudChjb25zdCBRUG9pbnQgJnBvcykgY29uc3Q7CisKKyAgICB2aXJ0dWFsIGJv
b2wgZXZlbnQoUUV2ZW50ICopOworCisgICAgUVdlYlNlY3VyaXR5T3JpZ2luIHNlY3VyaXR5T3Jp
Z2luKCkgY29uc3Q7CisgICAgUVdlYkZyYW1lQWRhcHRlciogaGFuZGxlKCkgY29uc3Q7CisKK3B1
YmxpYyBRX1NMT1RTOgorICAgIFFWYXJpYW50IGV2YWx1YXRlSmF2YVNjcmlwdChjb25zdCBRU3Ry
aW5nJiBzY3JpcHRTb3VyY2UpOworI2lmbmRlZiBRVF9OT19QUklOVEVSCisgICAgdm9pZCBwcmlu
dChRUHJpbnRlciAqcHJpbnRlcikgY29uc3Q7CisjZW5kaWYKKworUV9TSUdOQUxTOgorICAgIHZv
aWQgamF2YVNjcmlwdFdpbmRvd09iamVjdENsZWFyZWQoKTsKKworICAgIHZvaWQgcHJvdmlzaW9u
YWxMb2FkKCk7CisgICAgdm9pZCB0aXRsZUNoYW5nZWQoY29uc3QgUVN0cmluZyAmdGl0bGUpOwor
ICAgIHZvaWQgdXJsQ2hhbmdlZChjb25zdCBRVXJsICZ1cmwpOworCisgICAgdm9pZCBpbml0aWFs
TGF5b3V0Q29tcGxldGVkKCk7CisKKyAgICB2b2lkIGljb25DaGFuZ2VkKCk7CisKKyAgICB2b2lk
IGNvbnRlbnRzU2l6ZUNoYW5nZWQoY29uc3QgUVNpemUgJnNpemUpOworCisgICAgdm9pZCBsb2Fk
U3RhcnRlZCgpOworICAgIHZvaWQgbG9hZEZpbmlzaGVkKGJvb2wgb2spOworCisgICAgdm9pZCBw
YWdlQ2hhbmdlZCgpOworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBRR3JhcGhpY3NXZWJW
aWV3OworICAgIGZyaWVuZCBjbGFzcyBRV2ViUGFnZTsKKyAgICBmcmllbmQgY2xhc3MgUVdlYlBh
Z2VQcml2YXRlOworICAgIGZyaWVuZCBjbGFzcyBRV2ViRnJhbWVQcml2YXRlOworICAgIGZyaWVu
ZCBjbGFzcyBEdW1wUmVuZGVyVHJlZVN1cHBvcnRRdDsKKyAgICBmcmllbmQgY2xhc3MgV2ViQ29y
ZTo6V2lkZ2V0UHJpdmF0ZTsKKyAgICBmcmllbmQgY2xhc3MgV2ViQ29yZTo6RnJhbWVMb2FkZXJD
bGllbnRRdDsKKyAgICBmcmllbmQgY2xhc3MgV2ViQ29yZTo6Q2hyb21lQ2xpZW50UXQ7CisgICAg
ZnJpZW5kIGNsYXNzIFdlYkNvcmU6OlRleHR1cmVNYXBwZXJMYXllckNsaWVudFF0OworICAgIFFX
ZWJGcmFtZVByaXZhdGUgKmQ7CisgICAgUV9QUklWQVRFX1NMT1QoZCwgdm9pZCBfcV9vcmllbnRh
dGlvbkNoYW5nZWQoKSkKK307CisKK1FfREVDTEFSRV9PUEVSQVRPUlNfRk9SX0ZMQUdTKFFXZWJG
cmFtZTo6UmVuZGVyTGF5ZXJzKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQv
cXQvV2lkZ2V0QXBpL3F3ZWJmcmFtZV9wLmggYi9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldEFwaS9x
d2ViZnJhbWVfcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjJhMWMyMDI3OGFkODY5MDE4NDQ3YzRiZTc3MzM1YTQ5
ZTMwZmVhZWEKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldEFwaS9x
d2ViZnJhbWVfcC5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgICAgQ29weXJpZ2h0IChDKSAyMDA4
IE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQorICAgIENvcHly
aWdodCAoQykgMjAwNyBTdGFpa29zIENvbXB1dGluZyBTZXJ2aWNlcyBJbmMuCisKKyAgICBUaGlz
IGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y
CisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBG
b3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5
b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlz
dHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lU
SE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgor
ICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4g
IFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3Jl
IGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBH
TlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIGxp
YnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAgICB0
aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZp
ZnRoIEZsb29yLAorICAgIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorKi8KKworI2lmbmRl
ZiBxd2ViZnJhbWVfcF9oCisjZGVmaW5lIHF3ZWJmcmFtZV9wX2gKKworI2luY2x1ZGUgIlFXZWJG
cmFtZUFkYXB0ZXIuaCIKKworI2luY2x1ZGUgInF3ZWJmcmFtZS5oIgorI2luY2x1ZGUgInF3ZWJw
YWdlX3AuaCIKKworCituYW1lc3BhY2UgV2ViQ29yZSB7CitjbGFzcyBGcmFtZUxvYWRlckNsaWVu
dFF0OworY2xhc3MgRnJhbWVWaWV3OworY2xhc3MgSFRNTEZyYW1lT3duZXJFbGVtZW50OworY2xh
c3MgU2Nyb2xsYmFyOworY2xhc3MgVGV4dHVyZU1hcHBlckxheWVyOworfQorY2xhc3MgUVdlYlBh
Z2U7CisKK2NsYXNzIFFXZWJGcmFtZVByaXZhdGUgOiBwdWJsaWMgUVdlYkZyYW1lQWRhcHRlciB7
CitwdWJsaWM6CisgICAgUVdlYkZyYW1lUHJpdmF0ZSgpCisgICAgICAgIDogcSgwKQorICAgICAg
ICAsIHBhZ2UoMCkKKyAgICB7IH0KKyAgICB2b2lkIHNldFBhZ2UoUVdlYlBhZ2UqKTsKKworICAg
IGlubGluZSBRV2ViRnJhbWUgKnBhcmVudEZyYW1lKCkgeyByZXR1cm4gcW9iamVjdF9jYXN0PFFX
ZWJGcmFtZSo+KHEtPnBhcmVudCgpKTsgfQorCisgICAgc3RhdGljIFFXZWJGcmFtZSoga2l0KGNv
bnN0IFFXZWJGcmFtZUFkYXB0ZXIqKTsKKworICAgIC8vIEFkYXB0ZXIgaW1wbGVtZW50YXRpb24K
KyAgICB2aXJ0dWFsIFFXZWJGcmFtZSogYXBpSGFuZGxlKCkgT1ZFUlJJREU7CisgICAgdmlydHVh
bCBRT2JqZWN0KiBoYW5kbGUoKSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIHZvaWQgY29udGVudHNT
aXplRGlkQ2hhbmdlKGNvbnN0IFFTaXplICYpIE9WRVJSSURFOworICAgIHZpcnR1YWwgaW50IHNj
cm9sbEJhclBvbGljeShRdDo6T3JpZW50YXRpb24pIGNvbnN0IE9WRVJSSURFOworICAgIHZpcnR1
YWwgdm9pZCBlbWl0VXJsQ2hhbmdlZCgpIE9WRVJSSURFOworICAgIHZpcnR1YWwgdm9pZCBkaWRT
dGFydFByb3Zpc2lvbmFsTG9hZCgpIE9WRVJSSURFOworICAgIHZpcnR1YWwgdm9pZCBkaWRDbGVh
cldpbmRvd09iamVjdCgpIE9WRVJSSURFOworICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVQcm9ncmVz
c0ZpbmlzaGVkKFFQb2ludCopIE9WRVJSSURFOworICAgIHZpcnR1YWwgdm9pZCBlbWl0SW5pdGlh
bExheW91dENvbXBsZXRlZCgpIE9WRVJSSURFOworICAgIHZpcnR1YWwgdm9pZCBlbWl0SWNvbkNo
YW5nZWQoKSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIHZvaWQgZW1pdExvYWRTdGFydGVkKGJvb2wg
b3JpZ2luYXRpbmdMb2FkKSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIHZvaWQgZW1pdExvYWRGaW5p
c2hlZChib29sIG9yaWdpbmF0aW5nTG9hZCwgYm9vbCBvaykgT1ZFUlJJREU7CisgICAgdmlydHVh
bCBRV2ViRnJhbWVBZGFwdGVyKiBjcmVhdGVDaGlsZEZyYW1lKFFXZWJGcmFtZURhdGEqKSBPVkVS
UklERTsKKworICAgIFFXZWJGcmFtZSAqcTsKKyAgICBRV2ViUGFnZSAqcGFnZTsKKworfTsKKwor
I2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldEFwaS9xd2ViaW5zcGVj
dG9yLmNwcCBiL1NvdXJjZS9XZWJLaXQvcXQvV2lkZ2V0QXBpL3F3ZWJpbnNwZWN0b3IuY3BwCm5l
dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAuLjlhZTY5ZGFjZjI1ODgwYzc0ZDI0OWI0M2JhMWJjMmFhZDYxNWNlZTEKLS0tIC9k
ZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldEFwaS9xd2ViaW5zcGVjdG9yLmNw
cApAQCAtMCwwICsxLDIwNCBAQAorLyoKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDkgTm9raWEgQ29y
cG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCisKKyAgICBUaGlzIGxpYnJhcnkg
aXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9k
aWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMK
KyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
OyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlv
bikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQg
aW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkg
V0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNI
QU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUg
R05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMu
CisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFy
eSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNl
ZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAgICB0aGUgRnJlZSBT
b2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29y
LAorICAgIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorI2luY2x1ZGUgInF3ZWJpbnNwZWN0b3IuaCIKKworI2luY2x1ZGUgInF3ZWJlbGVtZW50
LmgiCisjaW5jbHVkZSAicXdlYmluc3BlY3Rvcl9wLmgiCisjaW5jbHVkZSAicXdlYnBhZ2VfcC5o
IgorCisjaW5jbHVkZSA8UVJlc2l6ZUV2ZW50PgorCisvKiEKKyAgICBcY2xhc3MgUVdlYkluc3Bl
Y3RvcgorICAgIFxzaW5jZSA0LjYKKyAgICBcaW5tb2R1bGUgUXRXZWJLaXQKKyAgICBcYnJpZWYg
VGhlIFFXZWJJbnNwZWN0b3IgY2xhc3MgYWxsb3dzIHRoZSBwbGFjZW1lbnQgYW5kIGNvbnRyb2wg
b2YgYQorICAgIFFXZWJQYWdlJ3MgaW5zcGVjdG9yLgorICAgIFRoZSBpbnNwZWN0b3IgY2FuIGRp
c3BsYXkgYSBwYWdlJ3MgaGllcmFyY2h5LCBpdHMgbG9hZGluZyBzdGF0aXN0aWNzIGFuZAorICAg
IHRoZSBjdXJyZW50IHN0YXRlIG9mIGl0cyBpbmRpdmlkdWFsIGVsZW1lbnRzLiBJdCBpcyBtb3N0
bHkgdXNlZCBieSB3ZWIKKyAgICBkZXZlbG9wZXJzLgorCisgICAgVGhlIFFXZWJQYWdlIHRvIGJl
IGluc3BlY3RlZCBtdXN0IGJlIHNwZWNpZmllZCB1c2luZyB0aGUgc2V0UGFnZSgpIG1ldGhvZC4K
KworICAgIEEgdHlwaWNhbCB1c2Ugb2YgUVdlYkluc3BlY3RvciBmb2xsb3dzOgorCisgICAgXHNu
aXBwZXQgd2Via2l0c25pcHBldHMvcXR3ZWJraXRfcXdlYmluc3BlY3Rvcl9zbmlwcGV0LmNwcCAw
CisKKyAgICBBIFFXZWJJbnNwZWN0b3IgY2FuIGJlIG1hZGUgdmlzaWJsZSBlaXRoZXIgcHJvZ3Jh
bW1hdGljYWxseSB1c2luZworICAgIHNldFZpc2libGUoKSwgb3IgYnkgdGhlIHVzZXIgdGhyb3Vn
aCB0aGUgYXR0YWNoZWQgUVdlYlBhZ2UncyBjb250ZXh0CisgICAgbWVudS4KKworICAgIFxub3Rl
IEEgUVdlYkluc3BlY3RvciB3aWxsIGRpc3BsYXkgYSBibGFuayB3aWRnZXQgaWYgZWl0aGVyOgor
ICAgIFxsaXN0CisgICAgICAgIFxsaSBwYWdlKCkgaXMgbnVsbAorICAgICAgICBcbGkgUVdlYlNl
dHRpbmdzOjpEZXZlbG9wZXJFeHRyYXNFbmFibGVkIGlzIGZhbHNlCisgICAgXGVuZGxpc3QKKwor
ICAgIFxzZWN0aW9uMSBSZXNvdXJjZXMKKworICAgIFRoaXMgY2xhc3MgYWN0cyBtb3N0bHkgYXMg
YSBjb250YWluZXIgYW5kIGEgY29udHJvbGxlciBmb3IgdGhlIGluc3BlY3Rvci4KKyAgICBNb3N0
IG9mIHRoZSByZXNvdXJjZXMgbmVlZGVkIGJ5IHRoZSBpbnNwZWN0b3IgYXJlIG93bmVkIGJ5IHRo
ZSBhc3NvY2lhdGVkCisgICAgUVdlYlBhZ2UgYW5kIGFyZSBhbGxvY2F0ZWQgdGhlIGZpcnN0IHRp
bWUgdGhhdDoKKyAgICBcbGlzdAorICAgICAgICBcbGkgYW4gZWxlbWVudCBpcyBpbnNwZWN0ZWQK
KyAgICAgICAgXGxpIHRoZSBRV2ViSW5zcGVjdG9yIGlzIHNob3duLgorICAgIFxlbmRsaXN0CisK
KyAgICBcc2VjdGlvbjEgSW5zcGVjdG9yIGNvbmZpZ3VyYXRpb24gcGVyc2lzdGVuY2UKKworICAg
IFRoZSBpbnNwZWN0b3IgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbmZpZ3VyZSBzb21lIG9wdGlvbnMg
dGhyb3VnaCBpdHMKKyAgICB1c2VyIGludGVyZmFjZSAoZS5nLiB0aGUgcmVzb3VyY2UgdHJhY2tp
bmcgIkFsd2F5cyBlbmFibGUiIG9wdGlvbikuCisgICAgVGhlc2Ugc2V0dGluZ3Mgd2lsbCBiZSBw
ZXJzaXN0ZWQgYXV0b21hdGljYWxseSBieSBRdFdlYktpdCBvbmx5IGlmCisgICAgeW91ciBhcHBs
aWNhdGlvbiBwcmV2aW91c2x5IGNhbGxlZCBRQ29yZUFwcGxpY2F0aW9uOjpzZXRPcmdhbml6YXRp
b25OYW1lKCkKKyAgICBhbmQgUUNvcmVBcHBsaWNhdGlvbjo6c2V0QXBwbGljYXRpb25OYW1lKCku
CisgICAgU2VlIFFTZXR0aW5ncydzIGRlZmF1bHQgY29uc3RydWN0b3IgZG9jdW1lbnRhdGlvbiBm
b3IgYW4gZXhwbGFuYXRpb24KKyAgICBvZiB3aHkgdGhpcyBpcyBuZWNlc3NhcnkuCisqLworCisv
KiEKKyAgICBDb25zdHJ1Y3RzIGFuIHVuYm91bmQgUVdlYkluc3BlY3RvciB3aXRoIFxhIHBhcmVu
dCBhcyBpdHMgcGFyZW50LgorKi8KK1FXZWJJbnNwZWN0b3I6OlFXZWJJbnNwZWN0b3IoUVdpZGdl
dCogcGFyZW50KQorICAgIDogUVdpZGdldChwYXJlbnQpCisgICAgLCBkKG5ldyBRV2ViSW5zcGVj
dG9yUHJpdmF0ZSh0aGlzKSkKK3sKK30KKworLyohCisgICAgRGVzdHJveXMgdGhlIGluc3BlY3Rv
ci4KKyovCitRV2ViSW5zcGVjdG9yOjp+UVdlYkluc3BlY3RvcigpCit7CisgICAgLy8gUmVtb3Zl
IGFzc29jaWF0aW9uIHByaW5jaXBhbGx5IHRvIHByZXZlbnQgZGVsZXRpbmcgYSBjaGlsZCBmcm9u
dGVuZAorICAgIHNldFBhZ2UoMCk7CisgICAgZGVsZXRlIGQ7CisgICAgZCA9IDA7Cit9CisKKy8q
IQorICAgIEJpbmQgdGhpcyBpbnNwZWN0b3IgdG8gdGhlIFFXZWJQYWdlIHRvIGJlIGluc3BlY3Rl
ZC4KKworICAgIFxiIHtOb3Rlczp9CisgICAgXGxpc3QKKyAgICAgICAgXGxpIFRoZXJlIGNhbiBv
bmx5IGJlIG9uZSBRV2ViSW5zcGVjdG9yIGFzc29jaWF0ZWQgd2l0aCBhIFFXZWJQYWdlCisgICAg
ICAgICAgIGFuZCB2aWNlIHZlcnNhLgorICAgICAgICBcbGkgQ2FsbGluZyB0aGlzIG1ldGhvZCB3
aXRoIGEgbnVsbCBcYSBwYWdlIHdpbGwgYnJlYWsgdGhlIGN1cnJlbnQgYXNzb2NpYXRpb24sIGlm
IGFueS4KKyAgICAgICAgXGxpIElmIFxhIHBhZ2UgaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHRvIGFu
b3RoZXIgUVdlYkluc3BlY3RvciwgdGhlIGFzc29jaWF0aW9uCisgICAgICAgICAgIHdpbGwgYmUg
cmVwbGFjZWQgYW5kIHRoZSBwcmV2aW91cyBRV2ViSW5zcGVjdG9yIHdpbGwgYmVjb21lIHVuYm91
bmQKKyAgICBcZW5kbGlzdAorCisgICAgXHNhIHBhZ2UoKQorKi8KK3ZvaWQgUVdlYkluc3BlY3Rv
cjo6c2V0UGFnZShRV2ViUGFnZSogcGFnZSkKK3sKKyAgICBpZiAoZC0+cGFnZSkgeworICAgICAg
ICAvLyBCcmVhayBjdXJyZW50UGFnZS0tPnRoaXMKKyAgICAgICAgZC0+cGFnZS0+ZC0+c2V0SW5z
cGVjdG9yKDApOworICAgIH0KKyAgICBpZiAocGFnZSAmJiBwYWdlLT5kLT5pbnNwZWN0b3IgJiYg
cGFnZS0+ZC0+aW5zcGVjdG9yICE9IHRoaXMpIHsKKyAgICAgICAgLy8gQnJlYWsgbmV3UGFnZTwt
Pm5ld1BhZ2VDdXJyZW50SW5zcGVjdG9yCisgICAgICAgIHBhZ2UtPmQtPmluc3BlY3Rvci0+c2V0
UGFnZSgwKTsKKyAgICB9CisKKyAgICBkLT5wYWdlID0gcGFnZTsKKworICAgIGlmIChwYWdlKSB7
CisgICAgICAgIC8vIFNldHVwIHRoZSByZWNpcHJvY2FsIGFzc29jaWF0aW9uCisgICAgICAgIHBh
Z2UtPmQtPnNldEluc3BlY3Rvcih0aGlzKTsKKyAgICB9Cit9CisKKy8qIQorICAgIFJldHVybnMg
dGhlIGluc3BlY3RlZCBRV2ViUGFnZS4KKyAgICBJZiBubyB3ZWIgcGFnZSBpcyBjdXJyZW50bHkg
YXNzb2NpYXRlZCwgYSBudWxsIHBvaW50ZXIgaXMgcmV0dXJuZWQuCisqLworUVdlYlBhZ2UqIFFX
ZWJJbnNwZWN0b3I6OnBhZ2UoKSBjb25zdAoreworICAgIHJldHVybiBkLT5wYWdlOworfQorCisv
KiEgXHJlaW1wICovCitRU2l6ZSBRV2ViSW5zcGVjdG9yOjpzaXplSGludCgpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIFFTaXplKDQ1MCwgMzAwKTsKK30KKworLyohIFxyZWltcCAqLworYm9vbCBRV2Vi
SW5zcGVjdG9yOjpldmVudChRRXZlbnQqIGV2KQoreworICAgIHJldHVybiBRV2lkZ2V0OjpldmVu
dChldik7Cit9CisKKy8qISBccmVpbXAgKi8KK3ZvaWQgUVdlYkluc3BlY3Rvcjo6cmVzaXplRXZl
bnQoUVJlc2l6ZUV2ZW50KiBldmVudCkKK3sKKyAgICBkLT5hZGp1c3RGcm9udGVuZFNpemUoZXZl
bnQtPnNpemUoKSk7Cit9CisKKy8qISBccmVpbXAgKi8KK3ZvaWQgUVdlYkluc3BlY3Rvcjo6c2hv
d0V2ZW50KFFTaG93RXZlbnQqIGV2ZW50KQoreworI2lmIEVOQUJMRShJTlNQRUNUT1IpCisgICAg
Ly8gQWxsb3dzIFFXZWJJbnNwZWN0b3I6OnNob3coKSB0byBpbml0IHRoZSBpbnNwZWN0b3IuCisg
ICAgaWYgKGQtPnBhZ2UpCisgICAgICAgIGQtPnBhZ2UtPmQtPmRpZFNob3dJbnNwZWN0b3IoKTsK
KyNlbmRpZgorfQorCisvKiEgXHJlaW1wICovCit2b2lkIFFXZWJJbnNwZWN0b3I6OmhpZGVFdmVu
dChRSGlkZUV2ZW50KiBldmVudCkKK3sKKyNpZiBFTkFCTEUoSU5TUEVDVE9SKQorICAgIGlmIChk
LT5wYWdlKQorICAgICAgICBkLT5wYWdlLT5kLT5kaWRDbG9zZUluc3BlY3RvcigpOworI2VuZGlm
Cit9CisKKy8qISBccmVpbXAgKi8KK3ZvaWQgUVdlYkluc3BlY3Rvcjo6Y2xvc2VFdmVudChRQ2xv
c2VFdmVudCogZXZlbnQpCit7CisjaWYgRU5BQkxFKElOU1BFQ1RPUikKKyAgICBpZiAoZC0+cGFn
ZSkKKyAgICAgICAgZC0+cGFnZS0+ZC0+ZGlkQ2xvc2VJbnNwZWN0b3IoKTsKKyNlbmRpZgorfQor
CisvKiEgXGludGVybmFsICovCit2b2lkIFFXZWJJbnNwZWN0b3JQcml2YXRlOjpzZXRGcm9udGVu
ZChRT2JqZWN0KiBuZXdGcm9udGVuZCkKK3sKKyAgICBpZiAoZnJvbnRlbmQpCisgICAgICAgIGZy
b250ZW5kLT5zZXRQYXJlbnQoMCk7CisKKyAgICBmcm9udGVuZCA9IHFvYmplY3RfY2FzdDxRV2lk
Z2V0Kj4obmV3RnJvbnRlbmQpOworCisgICAgaWYgKGZyb250ZW5kKSB7CisgICAgICAgIGZyb250
ZW5kLT5zZXRQYXJlbnQocSk7CisgICAgICAgIGZyb250ZW5kLT5zaG93KCk7CisgICAgICAgIGFk
anVzdEZyb250ZW5kU2l6ZShxLT5zaXplKCkpOworICAgIH0KK30KKwordm9pZCBRV2ViSW5zcGVj
dG9yUHJpdmF0ZTo6YWRqdXN0RnJvbnRlbmRTaXplKGNvbnN0IFFTaXplJiBzaXplKQoreworICAg
IGlmIChmcm9udGVuZCkKKyAgICAgICAgZnJvbnRlbmQtPnJlc2l6ZShzaXplKTsKK30KKwpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9XaWRnZXRBcGkvcXdlYmluc3BlY3Rvci5oIGIvU291
cmNlL1dlYktpdC9xdC9XaWRnZXRBcGkvcXdlYmluc3BlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjM3MzMx
MjkzMzgwY2JkYmQxZGM0YmRjYmVkMGI4ZmFiYmUzNzE3ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9T
b3VyY2UvV2ViS2l0L3F0L1dpZGdldEFwaS9xd2ViaW5zcGVjdG9yLmgKQEAgLTAsMCArMSw1NyBA
QAorLyoKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDkgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0
cyBzdWJzaWRpYXJ5KC1pZXMpCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsg
eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0
ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1
Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJz
aW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNp
b24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBp
dCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQg
ZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxk
IGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBM
aWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5H
LkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
LCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICAgIEJvc3RvbiwgTUEg
MDIxMTAtMTMwMSwgVVNBLgorKi8KKworI2lmbmRlZiBRV0VCSU5TUEVDVE9SX0gKKyNkZWZpbmUg
UVdFQklOU1BFQ1RPUl9ICisKKyNpbmNsdWRlIDxRdFdlYktpdC9xd2Via2l0Z2xvYmFsLmg+Cisj
aW5jbHVkZSA8UXRXZWJLaXRXaWRnZXRzL3F3ZWJwYWdlLmg+CisKKyNpbmNsdWRlIDxRdFdlYktp
dFdpZGdldHMvcXdlYnZpZXcuaD4KKworY2xhc3MgUVdlYkluc3BlY3RvclByaXZhdGU7CisKK2Ns
YXNzIFFXRUJLSVRfRVhQT1JUIFFXZWJJbnNwZWN0b3IgOiBwdWJsaWMgUVdpZGdldCB7CisgICAg
UV9PQkpFQ1QKK3B1YmxpYzoKKyAgICBRV2ViSW5zcGVjdG9yKFFXaWRnZXQqIHBhcmVudCA9IDAp
OworICAgIH5RV2ViSW5zcGVjdG9yKCk7CisKKyAgICB2b2lkIHNldFBhZ2UoUVdlYlBhZ2UqIHBh
Z2UpOworICAgIFFXZWJQYWdlKiBwYWdlKCkgY29uc3Q7CisKKyAgICBRU2l6ZSBzaXplSGludCgp
IGNvbnN0OworICAgIGJvb2wgZXZlbnQoUUV2ZW50Kik7CisKK3Byb3RlY3RlZDoKKyAgICB2b2lk
IHJlc2l6ZUV2ZW50KFFSZXNpemVFdmVudCogZXZlbnQpOworICAgIHZvaWQgc2hvd0V2ZW50KFFT
aG93RXZlbnQqIGV2ZW50KTsKKyAgICB2b2lkIGhpZGVFdmVudChRSGlkZUV2ZW50KiBldmVudCk7
CisgICAgdm9pZCBjbG9zZUV2ZW50KFFDbG9zZUV2ZW50KiBldmVudCk7CisKK3ByaXZhdGU6Cisg
ICAgUVdlYkluc3BlY3RvclByaXZhdGUqIGQ7CisKKyAgICBmcmllbmQgY2xhc3MgUVdlYkluc3Bl
Y3RvclByaXZhdGU7CisgICAgZnJpZW5kIGNsYXNzIFFXZWJQYWdlOworICAgIGZyaWVuZCBjbGFz
cyBRV2ViUGFnZVByaXZhdGU7CisgICAgZnJpZW5kIGNsYXNzIFdlYkNvcmU6Okluc3BlY3RvckNs
aWVudFF0OworICAgIGZyaWVuZCBjbGFzcyBXZWJDb3JlOjpJbnNwZWN0b3JGcm9udGVuZENsaWVu
dFF0OworfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9XaWRnZXRBcGkv
cXdlYmluc3BlY3Rvcl9wLmggYi9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldEFwaS9xd2ViaW5zcGVj
dG9yX3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwLi4zNjRlZWNmZjY3MWYzYzczZTk4MjkwOGM0NzI4YTNhOGMzMzU1
OGY2Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9xdC9XaWRnZXRBcGkvcXdlYmlu
c3BlY3Rvcl9wLmgKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDgs
IDIwMDkgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCisKKyAg
ICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQg
YW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0
d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9y
IChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkg
aXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBi
dXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50
eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv
ciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9m
IHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0
aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8K
KyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJl
ZXQsIEZpZnRoIEZsb29yLAorICAgIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorKi8KKwor
I2lmbmRlZiBxd2ViaW5zcGVjdG9yX3BfaAorI2RlZmluZSBxd2ViaW5zcGVjdG9yX3BfaAorCitR
VF9CRUdJTl9OQU1FU1BBQ0UKK2NsYXNzIFFTaXplOworY2xhc3MgUVdpZGdldDsKK1FUX0VORF9O
QU1FU1BBQ0UKK2NsYXNzIFFXZWJJbnNwZWN0b3I7CitjbGFzcyBRV2ViUGFnZTsKKworY2xhc3Mg
UVdlYkluc3BlY3RvclByaXZhdGUgeworcHVibGljOgorICAgIFFXZWJJbnNwZWN0b3JQcml2YXRl
KFFXZWJJbnNwZWN0b3IqIHFxKQorICAgIDogcShxcSkKKyAgICAsIHBhZ2UoMCkKKyAgICAsIGZy
b250ZW5kKDApCisgICAgeyB9CisKKyAgICB2b2lkIHNldEZyb250ZW5kKFFPYmplY3QqIG5ld0Zy
b250ZW5kKTsKKyAgICB2b2lkIGFkanVzdEZyb250ZW5kU2l6ZShjb25zdCBRU2l6ZSYpOworCisg
ICAgUVdlYkluc3BlY3RvciogcTsKKyAgICBRV2ViUGFnZSogcGFnZTsKKyAgICBRV2lkZ2V0KiBm
cm9udGVuZDsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9XaWRn
ZXRBcGkvcXdlYnBhZ2UuY3BwIGIvU291cmNlL1dlYktpdC9xdC9XaWRnZXRBcGkvcXdlYnBhZ2Uu
Y3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAuLmMxMTc2Y2Y2NjlhYWYwOGMwZTRkZWY2MjMxZjYyOGUzYjZiM2UwZDkK
LS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldEFwaS9xd2VicGFnZS5j
cHAKQEAgLTAsMCArMSwzMzc5IEBACisvKgorICAgIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSwg
MjAxMiBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykKKyAgICBD
b3B5cmlnaHQgKEMpIDIwMDcgU3RhaWtvcyBDb21wdXRpbmcgU2VydmljZXMgSW5jLgorICAgIENv
cHlyaWdodCAoQykgMjAwNyBBcHBsZSBJbmMuCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBz
b2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVu
ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNl
bnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIK
KyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxh
dGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhv
cGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7
IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElU
WSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAg
TGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZ
b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmls
ZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBG
b3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICAgIEJv
c3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgInF3ZWJwYWdlLmgiCisKKyNpbmNsdWRlICJEZWZhdWx0RnVsbFNjcmVlblZpZGVvSGFu
ZGxlci5oIgorI2luY2x1ZGUgIkluaXRXZWJLaXRRdC5oIgorI2luY2x1ZGUgIkluc3BlY3RvckNs
aWVudFF0LmgiCisjaW5jbHVkZSAiSW5zcGVjdG9yQ2xpZW50V2ViUGFnZS5oIgorI2luY2x1ZGUg
Ikluc3BlY3RvclNlcnZlclF0LmgiCisjaW5jbHVkZSAiUGFnZUNsaWVudFF0LmgiCisjaW5jbHVk
ZSAiUUdyYXBoaWNzV2lkZ2V0UGx1Z2luSW1wbC5oIgorI2luY2x1ZGUgIlFXZWJVbmRvQ29tbWFu
ZC5oIgorI2luY2x1ZGUgIlFXaWRnZXRQbHVnaW5JbXBsLmgiCisjaW5jbHVkZSAiUXRGYWxsYmFj
a1dlYlBvcHVwLmgiCisjaW5jbHVkZSAiUXRQbGF0Zm9ybVBsdWdpbi5oIgorI2luY2x1ZGUgIlVu
ZG9TdGVwUXQuaCIKKyNpbmNsdWRlICJXZWJFdmVudENvbnZlcnNpb24uaCIKKworI2luY2x1ZGUg
InF3ZWJmcmFtZS5oIgorI2luY2x1ZGUgInF3ZWJmcmFtZV9wLmgiCisjaW5jbHVkZSAicXdlYmhp
c3RvcnkuaCIKKyNpbmNsdWRlICJxd2ViaW5zcGVjdG9yLmgiCisjaW5jbHVkZSAicXdlYmluc3Bl
Y3Rvcl9wLmgiCisjaW5jbHVkZSAicXdlYmtpdHBsYXRmb3JtcGx1Z2luLmgiCisjaW5jbHVkZSAi
cXdlYnBhZ2VfcC5oIgorI2luY2x1ZGUgInF3ZWJzZXR0aW5ncy5oIgorI2luY2x1ZGUgInF3ZWJ2
aWV3LmgiCisKKyNpbmNsdWRlIDxRQWN0aW9uPgorI2luY2x1ZGUgPFFBcHBsaWNhdGlvbj4KKyNp
bmNsdWRlIDxRQmFzaWNUaW1lcj4KKyNpbmNsdWRlIDxRQml0QXJyYXk+CisjaW5jbHVkZSA8UUNs
aXBib2FyZD4KKyNpbmNsdWRlIDxRQ29sb3JEaWFsb2c+CisjaW5jbHVkZSA8UURlYnVnPgorI2lu
Y2x1ZGUgPFFEZXNrdG9wV2lkZ2V0PgorI2luY2x1ZGUgPFFEcmFnRW50ZXJFdmVudD4KKyNpbmNs
dWRlIDxRRHJhZ0xlYXZlRXZlbnQ+CisjaW5jbHVkZSA8UURyYWdNb3ZlRXZlbnQ+CisjaW5jbHVk
ZSA8UURyb3BFdmVudD4KKyNpbmNsdWRlIDxRRmlsZURpYWxvZz4KKyNpbmNsdWRlIDxRR2VzdHVy
ZUV2ZW50PgorI2luY2x1ZGUgPFFJbnB1dERpYWxvZz4KKyNpbmNsdWRlIDxRTGFiZWw+CisjaW5j
bHVkZSA8UU1lbnU+CisjaW5jbHVkZSA8UU1lc3NhZ2VCb3g+CisjaW5jbHVkZSA8UU5ldHdvcmtB
Y2Nlc3NNYW5hZ2VyPgorI2luY2x1ZGUgPFFOZXR3b3JrUHJveHk+CisjaW5jbHVkZSA8UU5ldHdv
cmtSZXF1ZXN0PgorI2luY2x1ZGUgPFFQYWludGVyPgorI2luY2x1ZGUgPFFTc2xTb2NrZXQ+Cisj
aW5jbHVkZSA8UVN0eWxlPgorI2luY2x1ZGUgPFFTeXNJbmZvPgorI2lmIFVTRShRVF9NT0JJTElU
WV9TWVNURU1JTkZPKQorI2luY2x1ZGUgPHFzeXN0ZW1pbmZvLmg+CisjZW5kaWYKKyNpbmNsdWRl
IDxRU3lzdGVtVHJheUljb24+CisjaW5jbHVkZSA8UVRleHRDaGFyRm9ybWF0PgorI2luY2x1ZGUg
PFFUb29sVGlwPgorI2luY2x1ZGUgPFFUb3VjaEV2ZW50PgorI2luY2x1ZGUgPFFVbmRvU3RhY2s+
CisjaW5jbHVkZSA8UVVybD4KKyNpZiBkZWZpbmVkKFFfV1NfWDExKQorI2luY2x1ZGUgPFFYMTFJ
bmZvPgorI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOworCisvLyBMb29rdXAgdGFi
bGUgbWFwcGluZyBRV2ViUGFnZTo6V2ViQWN0aW9ucyB0byB0aGUgYXNzb2NpYXRlZCBFZGl0b3Ig
Y29tbWFuZHMKK3N0YXRpYyBjb25zdCBjaGFyKiBlZGl0b3JDb21tYW5kV2ViQWN0aW9uc1tdID0K
K3sKKyAgICAwLCAvLyBPcGVuTGluaywKKworICAgIDAsIC8vIE9wZW5MaW5rSW5OZXdXaW5kb3cs
CisgICAgMCwgLy8gT3BlbkZyYW1lSW5OZXdXaW5kb3csCisKKyAgICAwLCAvLyBEb3dubG9hZExp
bmtUb0Rpc2ssCisgICAgMCwgLy8gQ29weUxpbmtUb0NsaXBib2FyZCwKKworICAgIDAsIC8vIE9w
ZW5JbWFnZUluTmV3V2luZG93LAorICAgIDAsIC8vIERvd25sb2FkSW1hZ2VUb0Rpc2ssCisgICAg
MCwgLy8gQ29weUltYWdlVG9DbGlwYm9hcmQsCisKKyAgICAwLCAvLyBCYWNrLAorICAgIDAsIC8v
IEZvcndhcmQsCisgICAgMCwgLy8gU3RvcCwKKyAgICAwLCAvLyBSZWxvYWQsCisKKyAgICAiQ3V0
IiwgLy8gQ3V0LAorICAgICJDb3B5IiwgLy8gQ29weSwKKyAgICAiUGFzdGUiLCAvLyBQYXN0ZSwK
KworICAgICJVbmRvIiwgLy8gVW5kbywKKyAgICAiUmVkbyIsIC8vIFJlZG8sCisgICAgIk1vdmVG
b3J3YXJkIiwgLy8gTW92ZVRvTmV4dENoYXIsCisgICAgIk1vdmVCYWNrd2FyZCIsIC8vIE1vdmVU
b1ByZXZpb3VzQ2hhciwKKyAgICAiTW92ZVdvcmRGb3J3YXJkIiwgLy8gTW92ZVRvTmV4dFdvcmQs
CisgICAgIk1vdmVXb3JkQmFja3dhcmQiLCAvLyBNb3ZlVG9QcmV2aW91c1dvcmQsCisgICAgIk1v
dmVEb3duIiwgLy8gTW92ZVRvTmV4dExpbmUsCisgICAgIk1vdmVVcCIsIC8vIE1vdmVUb1ByZXZp
b3VzTGluZSwKKyAgICAiTW92ZVRvQmVnaW5uaW5nT2ZMaW5lIiwgLy8gTW92ZVRvU3RhcnRPZkxp
bmUsCisgICAgIk1vdmVUb0VuZE9mTGluZSIsIC8vIE1vdmVUb0VuZE9mTGluZSwKKyAgICAiTW92
ZVRvQmVnaW5uaW5nT2ZQYXJhZ3JhcGgiLCAvLyBNb3ZlVG9TdGFydE9mQmxvY2ssCisgICAgIk1v
dmVUb0VuZE9mUGFyYWdyYXBoIiwgLy8gTW92ZVRvRW5kT2ZCbG9jaywKKyAgICAiTW92ZVRvQmVn
aW5uaW5nT2ZEb2N1bWVudCIsIC8vIE1vdmVUb1N0YXJ0T2ZEb2N1bWVudCwKKyAgICAiTW92ZVRv
RW5kT2ZEb2N1bWVudCIsIC8vIE1vdmVUb0VuZE9mRG9jdW1lbnQsCisgICAgIk1vdmVGb3J3YXJk
QW5kTW9kaWZ5U2VsZWN0aW9uIiwgLy8gU2VsZWN0TmV4dENoYXIsCisgICAgIk1vdmVCYWNrd2Fy
ZEFuZE1vZGlmeVNlbGVjdGlvbiIsIC8vIFNlbGVjdFByZXZpb3VzQ2hhciwKKyAgICAiTW92ZVdv
cmRGb3J3YXJkQW5kTW9kaWZ5U2VsZWN0aW9uIiwgLy8gU2VsZWN0TmV4dFdvcmQsCisgICAgIk1v
dmVXb3JkQmFja3dhcmRBbmRNb2RpZnlTZWxlY3Rpb24iLCAvLyBTZWxlY3RQcmV2aW91c1dvcmQs
CisgICAgIk1vdmVEb3duQW5kTW9kaWZ5U2VsZWN0aW9uIiwgLy8gU2VsZWN0TmV4dExpbmUsCisg
ICAgIk1vdmVVcEFuZE1vZGlmeVNlbGVjdGlvbiIsIC8vIFNlbGVjdFByZXZpb3VzTGluZSwKKyAg
ICAiTW92ZVRvQmVnaW5uaW5nT2ZMaW5lQW5kTW9kaWZ5U2VsZWN0aW9uIiwgLy8gU2VsZWN0U3Rh
cnRPZkxpbmUsCisgICAgIk1vdmVUb0VuZE9mTGluZUFuZE1vZGlmeVNlbGVjdGlvbiIsIC8vIFNl
bGVjdEVuZE9mTGluZSwKKyAgICAiTW92ZVRvQmVnaW5uaW5nT2ZQYXJhZ3JhcGhBbmRNb2RpZnlT
ZWxlY3Rpb24iLCAvLyBTZWxlY3RTdGFydE9mQmxvY2ssCisgICAgIk1vdmVUb0VuZE9mUGFyYWdy
YXBoQW5kTW9kaWZ5U2VsZWN0aW9uIiwgLy8gU2VsZWN0RW5kT2ZCbG9jaywKKyAgICAiTW92ZVRv
QmVnaW5uaW5nT2ZEb2N1bWVudEFuZE1vZGlmeVNlbGVjdGlvbiIsIC8vIFNlbGVjdFN0YXJ0T2ZE
b2N1bWVudCwKKyAgICAiTW92ZVRvRW5kT2ZEb2N1bWVudEFuZE1vZGlmeVNlbGVjdGlvbiIsIC8v
IFNlbGVjdEVuZE9mRG9jdW1lbnQsCisgICAgIkRlbGV0ZVdvcmRCYWNrd2FyZCIsIC8vIERlbGV0
ZVN0YXJ0T2ZXb3JkLAorICAgICJEZWxldGVXb3JkRm9yd2FyZCIsIC8vIERlbGV0ZUVuZE9mV29y
ZCwKKworICAgIDAsIC8vIFNldFRleHREaXJlY3Rpb25EZWZhdWx0LAorICAgIDAsIC8vIFNldFRl
eHREaXJlY3Rpb25MZWZ0VG9SaWdodCwKKyAgICAwLCAvLyBTZXRUZXh0RGlyZWN0aW9uUmlnaHRU
b0xlZnQsCisKKyAgICAiVG9nZ2xlQm9sZCIsIC8vIFRvZ2dsZUJvbGQsCisgICAgIlRvZ2dsZUl0
YWxpYyIsIC8vIFRvZ2dsZUl0YWxpYywKKyAgICAiVG9nZ2xlVW5kZXJsaW5lIiwgLy8gVG9nZ2xl
VW5kZXJsaW5lLAorCisgICAgMCwgLy8gSW5zcGVjdEVsZW1lbnQsCisKKyAgICAiSW5zZXJ0TmV3
bGluZSIsIC8vIEluc2VydFBhcmFncmFwaFNlcGFyYXRvcgorICAgICJJbnNlcnRMaW5lQnJlYWsi
LCAvLyBJbnNlcnRMaW5lU2VwYXJhdG9yCisKKyAgICAiU2VsZWN0QWxsIiwgLy8gU2VsZWN0QWxs
CisgICAgMCwgLy8gUmVsb2FkQW5kQnlwYXNzQ2FjaGUsCisKKyAgICAiUGFzdGVBbmRNYXRjaFN0
eWxlIiwgLy8gUGFzdGVBbmRNYXRjaFN0eWxlCisgICAgIlJlbW92ZUZvcm1hdCIsIC8vIFJlbW92
ZUZvcm1hdAorICAgICJTdHJpa2V0aHJvdWdoIiwgLy8gVG9nZ2xlU3RyaWtldGhyb3VnaCwKKyAg
ICAiU3Vic2NyaXB0IiwgLy8gVG9nZ2xlU3Vic2NyaXB0CisgICAgIlN1cGVyc2NyaXB0IiwgLy8g
VG9nZ2xlU3VwZXJzY3JpcHQKKyAgICAiSW5zZXJ0VW5vcmRlcmVkTGlzdCIsIC8vIEluc2VydFVu
b3JkZXJlZExpc3QKKyAgICAiSW5zZXJ0T3JkZXJlZExpc3QiLCAvLyBJbnNlcnRPcmRlcmVkTGlz
dAorICAgICJJbmRlbnQiLCAvLyBJbmRlbnQKKyAgICAiT3V0ZGVudCIsIC8vIE91dGRlbnQsCisK
KyAgICAiQWxpZ25DZW50ZXIiLCAvLyBBbGlnbkNlbnRlciwKKyAgICAiQWxpZ25KdXN0aWZpZWQi
LCAvLyBBbGlnbkp1c3RpZmllZCwKKyAgICAiQWxpZ25MZWZ0IiwgLy8gQWxpZ25MZWZ0LAorICAg
ICJBbGlnblJpZ2h0IiwgLy8gQWxpZ25SaWdodCwKKworICAgIDAsIC8vIFN0b3BTY2hlZHVsZWRQ
YWdlUmVmcmVzaCwKKworICAgIDAsIC8vIENvcHlJbWFnZVVybFRvQ2xpcGJvYXJkLAorCisgICAg
MCwgLy8gT3BlbkxpbmtJblRoaXNXaW5kb3csCisKKyAgICAwIC8vIFdlYkFjdGlvbkNvdW50Cit9
OworCisvLyBMb29rdXAgdGhlIGFwcHJvcHJpYXRlIGVkaXRvciBjb21tYW5kIHRvIHVzZSBmb3Ig
V2ViQWN0aW9uIFxhIGFjdGlvbgorY29uc3QgY2hhciogUVdlYlBhZ2VQcml2YXRlOjplZGl0b3JD
b21tYW5kRm9yV2ViQWN0aW9ucyhRV2ViUGFnZTo6V2ViQWN0aW9uIGFjdGlvbikKK3sKKyAgICBp
ZiAoKGFjdGlvbiA+IFFXZWJQYWdlOjpOb1dlYkFjdGlvbikgJiYgKGFjdGlvbiA8IGludChzaXpl
b2YoZWRpdG9yQ29tbWFuZFdlYkFjdGlvbnMpIC8gc2l6ZW9mKGNvbnN0IGNoYXIqKSkpKQorICAg
ICAgICByZXR1cm4gZWRpdG9yQ29tbWFuZFdlYkFjdGlvbnNbYWN0aW9uXTsKKyAgICByZXR1cm4g
MDsKK30KKworUVdlYlBhZ2VQcml2YXRlOjpRV2ViUGFnZVByaXZhdGUoUVdlYlBhZ2UgKnFxKQor
ICAgIDogcShxcSkKKyNpZm5kZWYgUVRfTk9fVU5ET1NUQUNLCisgICAgLCB1bmRvU3RhY2soMCkK
KyNlbmRpZgorICAgICwgbGlua1BvbGljeShRV2ViUGFnZTo6RG9udERlbGVnYXRlTGlua3MpCisg
ICAgLCBtX3ZpZXdwb3J0U2l6ZShRU2l6ZSgwLCAwKSkKKyAgICAsIHVzZUZpeGVkTGF5b3V0KGZh
bHNlKQorICAgICwgaW5zcGVjdG9yRnJvbnRlbmQoMCkKKyAgICAsIGluc3BlY3RvcigwKQorICAg
ICwgaW5zcGVjdG9ySXNJbnRlcm5hbE9ubHkoZmFsc2UpCisgICAgLCBtX2xhc3REcm9wQWN0aW9u
KFF0OjpJZ25vcmVBY3Rpb24pCit7CisgICAgV2ViS2l0Ojppbml0aWFsaXplV2ViS2l0V2lkZ2V0
cygpOworICAgIG1lbXNldChhY3Rpb25zLCAwLCBzaXplb2YoYWN0aW9ucykpOworCisjaWYgRU5B
QkxFKE5PVElGSUNBVElPTlMpIHx8IEVOQUJMRShMRUdBQ1lfTk9USUZJQ0FUSU9OUykKKyAgICBh
ZGROb3RpZmljYXRpb25QcmVzZW50ZXJDbGllbnQoKTsKKyNpZm5kZWYgUVRfTk9fU1lTVEVNVFJB
WUlDT04KKyAgICBpZiAoIWhhc1N5c3RlbVRyYXlJY29uKCkpCisgICAgICAgIHNldFN5c3RlbVRy
YXlJY29uKG5ldyBRU3lzdGVtVHJheUljb24pOworI2VuZGlmIC8vIFFUX05PX1NZU1RFTVRSQVlJ
Q09OCisjZW5kaWYgLy8gRU5BQkxFKE5PVElGSUNBVElPTlMpIHx8IEVOQUJMRShMRUdBQ1lfTk9U
SUZJQ0FUSU9OUykKK30KKworUVdlYlBhZ2VQcml2YXRlOjp+UVdlYlBhZ2VQcml2YXRlKCkKK3sK
KyNpZm5kZWYgUVRfTk9fQ09OVEVYVE1FTlUKKyAgICBkZWxldGUgY3VycmVudENvbnRleHRNZW51
LmRhdGEoKTsKKyNlbmRpZgorI2lmbmRlZiBRVF9OT19VTkRPU1RBQ0sKKyAgICBkZWxldGUgdW5k
b1N0YWNrOworICAgIHVuZG9TdGFjayA9IDA7CisjZW5kaWYKKyAgICAKKyAgICBpZiAoaW5zcGVj
dG9yKSB7CisgICAgICAgIC8vIElmIHRoZSBpbnNwZWN0b3IgaXMgb3VycywgZGVsZXRlIGl0LCBv
dGhlcndpc2UganVzdCBkZXRhY2ggZnJvbSBpdC4KKyAgICAgICAgaWYgKGluc3BlY3RvcklzSW50
ZXJuYWxPbmx5KQorICAgICAgICAgICAgZGVsZXRlIGluc3BlY3RvcjsKKyAgICAgICAgZWxzZQor
ICAgICAgICAgICAgaW5zcGVjdG9yLT5zZXRQYWdlKDApOworICAgIH0KKyAgICAvLyBFeHBsaWNp
dGx5IGRlc3RydWN0IHRoZSBXZWJDb3JlIHBhZ2UgYXQgdGhpcyBwb2ludCB3aGVuIHRoZQorICAg
IC8vIFFXZWJQYWdlUHJpdmF0ZSAvIFFXZWJQYWdlQWRhcGF0ZXIgdnRhYmxlcyBhcmUgc3RpbGwg
aW50YWN0LAorICAgIC8vIGluIG9yZGVyIGZvciB2YXJpb3VzIGRlc3RydWN0aW9uIGNhbGxiYWNr
cyBvdXQgb2YgV2ViQ29yZSB0bworICAgIC8vIHdvcmsuCisgICAgZGVsZXRlUGFnZSgpOworfQor
Cit2b2lkIFFXZWJQYWdlUHJpdmF0ZTo6c2hvdygpCit7CisgICAgaWYgKCF2aWV3KQorICAgICAg
ICByZXR1cm47CisgICAgdmlldy0+d2luZG93KCktPnNob3coKTsKK30KKwordm9pZCBRV2ViUGFn
ZVByaXZhdGU6OnNldEZvY3VzKCkKK3sKKyAgICBpZiAoIXZpZXcpCisgICAgICAgIHJldHVybjsK
KyAgICB2aWV3LT5zZXRGb2N1cygpOworfQorCit2b2lkIFFXZWJQYWdlUHJpdmF0ZTo6dW5mb2N1
cygpCit7CisgICAgaWYgKCF2aWV3KQorICAgICAgICByZXR1cm47CisgICAgdmlldy0+Y2xlYXJG
b2N1cygpOworfQorCit2b2lkIFFXZWJQYWdlUHJpdmF0ZTo6c2V0V2luZG93UmVjdChjb25zdCBR
UmVjdCAmcmVjdCkKK3sKKyAgICBlbWl0IHEtPmdlb21ldHJ5Q2hhbmdlUmVxdWVzdGVkKHJlY3Qp
OworfQorCitRU2l6ZSBRV2ViUGFnZVByaXZhdGU6OnZpZXdwb3J0U2l6ZSgpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIHEtPnZpZXdwb3J0U2l6ZSgpOworfQorCitRV2ViUGFnZUFkYXB0ZXIgKlFXZWJQ
YWdlUHJpdmF0ZTo6Y3JlYXRlV2luZG93KGJvb2wgZGlhbG9nKQoreworICAgIFFXZWJQYWdlICpu
ZXdQYWdlID0gcS0+Y3JlYXRlV2luZG93KGRpYWxvZyA/IFFXZWJQYWdlOjpXZWJNb2RhbERpYWxv
ZyA6IFFXZWJQYWdlOjpXZWJCcm93c2VyV2luZG93KTsKKyAgICBpZiAoIW5ld1BhZ2UpCisgICAg
ICAgIHJldHVybiAwOworICAgIC8vIE1ha2Ugc3VyZSB0aGUgbWFpbiBmcmFtZSBleGlzdHMsIGFz
IFdlYkNvcmUgZXhwZWN0cyBpdCB3aGVuIHJldHVybmluZyBmcm9tIHRoaXMgQ2hyb21lQ2xpZW50
OjpjcmVhdGVXaW5kb3coKQorICAgIG5ld1BhZ2UtPmQtPmNyZWF0ZU1haW5GcmFtZSgpOworICAg
IHJldHVybiBuZXdQYWdlLT5kOworfQorCit2b2lkIFFXZWJQYWdlUHJpdmF0ZTo6amF2YVNjcmlw
dENvbnNvbGVNZXNzYWdlKGNvbnN0IFFTdHJpbmcgJm1lc3NhZ2UsIGludCBsaW5lTnVtYmVyLCBj
b25zdCBRU3RyaW5nICZzb3VyY2VJRCkKK3sKKyAgICBxLT5qYXZhU2NyaXB0Q29uc29sZU1lc3Nh
Z2UobWVzc2FnZSwgbGluZU51bWJlciwgc291cmNlSUQpOworfQorCit2b2lkIFFXZWJQYWdlUHJp
dmF0ZTo6amF2YVNjcmlwdEFsZXJ0KFFXZWJGcmFtZUFkYXB0ZXIqIGZyYW1lLCBjb25zdCBRU3Ry
aW5nJiBtc2cpCit7CisgICAgcS0+amF2YVNjcmlwdEFsZXJ0KFFXZWJGcmFtZVByaXZhdGU6Omtp
dChmcmFtZSksIG1zZyk7Cit9CisKK2Jvb2wgUVdlYlBhZ2VQcml2YXRlOjpqYXZhU2NyaXB0Q29u
ZmlybShRV2ViRnJhbWVBZGFwdGVyKiBmcmFtZSwgY29uc3QgUVN0cmluZyYgbXNnKQoreworICAg
IHJldHVybiBxLT5qYXZhU2NyaXB0Q29uZmlybShRV2ViRnJhbWVQcml2YXRlOjpraXQoZnJhbWUp
LCBtc2cpOworfQorCitib29sIFFXZWJQYWdlUHJpdmF0ZTo6amF2YVNjcmlwdFByb21wdChRV2Vi
RnJhbWVBZGFwdGVyICpmcmFtZSwgY29uc3QgUVN0cmluZyAmbXNnLCBjb25zdCBRU3RyaW5nICZk
ZWZhdWx0VmFsdWUsIFFTdHJpbmcgKnJlc3VsdCkKK3sKKyAgICByZXR1cm4gcS0+amF2YVNjcmlw
dFByb21wdChRV2ViRnJhbWVQcml2YXRlOjpraXQoZnJhbWUpLCBtc2csIGRlZmF1bHRWYWx1ZSwg
cmVzdWx0KTsKK30KKworYm9vbCBRV2ViUGFnZVByaXZhdGU6OnNob3VsZEludGVycnVwdEphdmFT
Y3JpcHQoKQoreworICAgIHJldHVybiBxLT5zaG91bGRJbnRlcnJ1cHRKYXZhU2NyaXB0KCk7Cit9
CisKK3ZvaWQgUVdlYlBhZ2VQcml2YXRlOjpwcmludFJlcXVlc3RlZChRV2ViRnJhbWVBZGFwdGVy
ICpmcmFtZSkKK3sKKyAgICBlbWl0IHEtPnByaW50UmVxdWVzdGVkKFFXZWJGcmFtZVByaXZhdGU6
OmtpdChmcmFtZSkpOworfQorCit2b2lkIFFXZWJQYWdlUHJpdmF0ZTo6ZGF0YWJhc2VRdW90YUV4
Y2VlZGVkKFFXZWJGcmFtZUFkYXB0ZXIqIGZyYW1lLCBjb25zdCBRU3RyaW5nJiBkYXRhYmFzZU5h
bWUpCit7CisgICAgZW1pdCBxLT5kYXRhYmFzZVF1b3RhRXhjZWVkZWQoUVdlYkZyYW1lUHJpdmF0
ZTo6a2l0KGZyYW1lKSwgZGF0YWJhc2VOYW1lKTsKK30KKwordm9pZCBRV2ViUGFnZVByaXZhdGU6
OmFwcGxpY2F0aW9uQ2FjaGVRdW90YUV4Y2VlZGVkKFFXZWJTZWN1cml0eU9yaWdpbiAqb3JpZ2lu
LCBxdWludDY0IGRlZmF1bHRPcmlnaW5RdW90YSwgcXVpbnQ2NCBjKQoreworICAgIGVtaXQgcS0+
YXBwbGljYXRpb25DYWNoZVF1b3RhRXhjZWVkZWQob3JpZ2luLCBkZWZhdWx0T3JpZ2luUXVvdGEs
IGMpOworfQorCit2b2lkIFFXZWJQYWdlUHJpdmF0ZTo6c2V0VG9vbFRpcChjb25zdCBRU3RyaW5n
ICZ0aXApCit7CisjaWZuZGVmIFFUX05PX1RPT0xUSVAKKyAgICBpZiAoIXZpZXcpCisgICAgICAg
IHJldHVybjsKKworICAgIGlmICh0aXAuaXNFbXB0eSgpKSB7CisgICAgICAgIHZpZXctPnNldFRv
b2xUaXAoUVN0cmluZygpKTsKKyAgICAgICAgUVRvb2xUaXA6OmhpZGVUZXh0KCk7CisgICAgfSBl
bHNlIHsKKyAgICAgICAgUVN0cmluZyBkdGlwID0gUUxhdGluMVN0cmluZygiPHA+IikgKyBRU3Ry
aW5nKHRpcCkudG9IdG1sRXNjYXBlZCgpICsgUUxhdGluMVN0cmluZygiPC9wPiIpOworICAgICAg
ICB2aWV3LT5zZXRUb29sVGlwKGR0aXApOworICAgIH0KKyNlbHNlCisgICAgUV9VTlVTRUQodGlw
KTsKKyNlbmRpZgorfQorCisjaWYgVVNFKFFUX01VTFRJTUVESUEpCitRV2ViRnVsbFNjcmVlblZp
ZGVvSGFuZGxlciAqUVdlYlBhZ2VQcml2YXRlOjpjcmVhdGVGdWxsU2NyZWVuVmlkZW9IYW5kbGVy
KCkKK3sKKyAgICByZXR1cm4gbmV3IFdlYktpdDo6RGVmYXVsdEZ1bGxTY3JlZW5WaWRlb0hhbmRs
ZXI7Cit9CisjZW5kaWYKKworUVdlYkZyYW1lQWRhcHRlciAqUVdlYlBhZ2VQcml2YXRlOjptYWlu
RnJhbWVBZGFwdGVyKCkKK3sKKyAgICByZXR1cm4gcS0+bWFpbkZyYW1lKCktPmQ7Cit9CisKK1FT
dHJpbmdMaXN0IFFXZWJQYWdlUHJpdmF0ZTo6Y2hvb3NlRmlsZXMoUVdlYkZyYW1lQWRhcHRlciAq
ZnJhbWUsIGJvb2wgYWxsb3dNdWx0aXBsZSwgY29uc3QgUVN0cmluZ0xpc3QgJnN1Z2dlc3RlZEZp
bGVOYW1lcykKK3sKKyAgICBpZiAoYWxsb3dNdWx0aXBsZSAmJiBxLT5zdXBwb3J0c0V4dGVuc2lv
bihRV2ViUGFnZTo6Q2hvb3NlTXVsdGlwbGVGaWxlc0V4dGVuc2lvbikpIHsKKyAgICAgICAgUVdl
YlBhZ2U6OkNob29zZU11bHRpcGxlRmlsZXNFeHRlbnNpb25PcHRpb24gb3B0aW9uOworICAgICAg
ICBvcHRpb24ucGFyZW50RnJhbWUgPSBRV2ViRnJhbWVQcml2YXRlOjpraXQoZnJhbWUpOworICAg
ICAgICBvcHRpb24uc3VnZ2VzdGVkRmlsZU5hbWVzID0gc3VnZ2VzdGVkRmlsZU5hbWVzOworCisg
ICAgICAgIFFXZWJQYWdlOjpDaG9vc2VNdWx0aXBsZUZpbGVzRXh0ZW5zaW9uUmV0dXJuIG91dHB1
dDsKKyAgICAgICAgcS0+ZXh0ZW5zaW9uKFFXZWJQYWdlOjpDaG9vc2VNdWx0aXBsZUZpbGVzRXh0
ZW5zaW9uLCAmb3B0aW9uLCAmb3V0cHV0KTsKKworICAgICAgICByZXR1cm4gb3V0cHV0LmZpbGVO
YW1lczsKKyAgICB9CisgICAgLy8gU2luZ2xlIGZpbGUKKyAgICBRU3RyaW5nTGlzdCByZXN1bHQ7
CisgICAgUVN0cmluZyBzdWdnZXN0ZWRGaWxlOworICAgIGlmICghc3VnZ2VzdGVkRmlsZU5hbWVz
LmlzRW1wdHkoKSkKKyAgICAgICAgc3VnZ2VzdGVkRmlsZSA9IHN1Z2dlc3RlZEZpbGVOYW1lcy5m
aXJzdCgpOworICAgIFFTdHJpbmcgZmlsZSA9IHEtPmNob29zZUZpbGUoUVdlYkZyYW1lUHJpdmF0
ZTo6a2l0KGZyYW1lKSwgc3VnZ2VzdGVkRmlsZSk7CisgICAgaWYgKCFmaWxlLmlzRW1wdHkoKSkK
KyAgICAgICAgcmVzdWx0IDw8IGZpbGU7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworYm9vbCBR
V2ViUGFnZVByaXZhdGU6OmFjY2VwdE5hdmlnYXRpb25SZXF1ZXN0KFFXZWJGcmFtZUFkYXB0ZXIg
KmZyYW1lQWRhcHRlciwgY29uc3QgUU5ldHdvcmtSZXF1ZXN0ICZyZXF1ZXN0LCBpbnQgdHlwZSkK
K3sKKyAgICBRV2ViRnJhbWUgKmZyYW1lID0gZnJhbWVBZGFwdGVyID8gUVdlYkZyYW1lUHJpdmF0
ZTo6a2l0KGZyYW1lQWRhcHRlcik6IDA7CisgICAgaWYgKGluc2lkZU9wZW5DYWxsCisgICAgICAg
ICYmIGZyYW1lID09IG1haW5GcmFtZS5kYXRhKCkpCisgICAgICAgIHJldHVybiB0cnVlOworICAg
IHJldHVybiBxLT5hY2NlcHROYXZpZ2F0aW9uUmVxdWVzdChmcmFtZSwgcmVxdWVzdCwgUVdlYlBh
Z2U6Ok5hdmlnYXRpb25UeXBlKHR5cGUpKTsKK30KKwordm9pZCBRV2ViUGFnZVByaXZhdGU6OmVt
aXRSZXN0b3JlRnJhbWVTdGF0ZVJlcXVlc3RlZChRV2ViRnJhbWVBZGFwdGVyICpmcmFtZSkKK3sK
KyAgICBlbWl0IHEtPnJlc3RvcmVGcmFtZVN0YXRlUmVxdWVzdGVkKFFXZWJGcmFtZVByaXZhdGU6
OmtpdChmcmFtZSkpOworfQorCit2b2lkIFFXZWJQYWdlUHJpdmF0ZTo6ZW1pdFNhdmVGcmFtZVN0
YXRlUmVxdWVzdGVkKFFXZWJGcmFtZUFkYXB0ZXIgKmZyYW1lLCBRV2ViSGlzdG9yeUl0ZW0gKml0
ZW0pCit7CisgICAgZW1pdCBxLT5zYXZlRnJhbWVTdGF0ZVJlcXVlc3RlZChRV2ViRnJhbWVQcml2
YXRlOjpraXQoZnJhbWUpLCBpdGVtKTsKK30KKwordm9pZCBRV2ViUGFnZVByaXZhdGU6OmVtaXRE
b3dubG9hZFJlcXVlc3RlZChjb25zdCBRTmV0d29ya1JlcXVlc3QgJnJlcXVlc3QpCit7CisgICAg
ZW1pdCBxLT5kb3dubG9hZFJlcXVlc3RlZChyZXF1ZXN0KTsKK30KKwordm9pZCBRV2ViUGFnZVBy
aXZhdGU6OmVtaXRGcmFtZUNyZWF0ZWQoUVdlYkZyYW1lQWRhcHRlciAqZnJhbWUpCit7CisgICAg
ZW1pdCBxLT5mcmFtZUNyZWF0ZWQoUVdlYkZyYW1lUHJpdmF0ZTo6a2l0KGZyYW1lKSk7Cit9CisK
K2Jvb2wgUVdlYlBhZ2VQcml2YXRlOjplcnJvclBhZ2VFeHRlbnNpb24oUVdlYlBhZ2VBZGFwdGVy
OjpFcnJvclBhZ2VPcHRpb24gKm9wdCwgUVdlYlBhZ2VBZGFwdGVyOjpFcnJvclBhZ2VSZXR1cm4g
Km91dCkKK3sKKyAgICBRV2ViUGFnZTo6RXJyb3JQYWdlRXh0ZW5zaW9uT3B0aW9uIG9wdGlvbjsK
KyAgICBpZiAob3B0LT5kb21haW4gPT0gUUxhdGluMVN0cmluZygiUXROZXR3b3JrIikpCisgICAg
ICAgIG9wdGlvbi5kb21haW4gPSBRV2ViUGFnZTo6UXROZXR3b3JrOworICAgIGVsc2UgaWYgKG9w
dC0+ZG9tYWluID09IFFMYXRpbjFTdHJpbmcoIkhUVFAiKSkKKyAgICAgICAgb3B0aW9uLmRvbWFp
biA9IFFXZWJQYWdlOjpIdHRwOworICAgIGVsc2UgaWYgKG9wdC0+ZG9tYWluID09IFFMYXRpbjFT
dHJpbmcoIldlYktpdCIpKQorICAgICAgICBvcHRpb24uZG9tYWluID0gUVdlYlBhZ2U6OldlYktp
dDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBvcHRpb24udXJsID0gb3B0
LT51cmw7CisgICAgb3B0aW9uLmZyYW1lID0gUVdlYkZyYW1lUHJpdmF0ZTo6a2l0KG9wdC0+ZnJh
bWUpOworICAgIG9wdGlvbi5lcnJvciA9IG9wdC0+ZXJyb3I7CisgICAgb3B0aW9uLmVycm9yU3Ry
aW5nID0gb3B0LT5lcnJvclN0cmluZzsKKyAgICBRV2ViUGFnZTo6RXJyb3JQYWdlRXh0ZW5zaW9u
UmV0dXJuIG91dHB1dDsKKyAgICBpZiAoIXEtPmV4dGVuc2lvbihRV2ViUGFnZTo6RXJyb3JQYWdl
RXh0ZW5zaW9uLCAmb3B0aW9uLCAmb3V0cHV0KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
IG91dC0+YmFzZVVybCA9IG91dHB1dC5iYXNlVXJsOworICAgIG91dC0+Y29udGVudCA9IG91dHB1
dC5jb250ZW50OworICAgIG91dC0+Y29udGVudFR5cGUgPSBvdXRwdXQuY29udGVudFR5cGU7Cisg
ICAgb3V0LT5lbmNvZGluZyA9IG91dHB1dC5lbmNvZGluZzsKKyAgICByZXR1cm4gdHJ1ZTsKK30K
KworUXRQbHVnaW5XaWRnZXRBZGFwdGVyICpRV2ViUGFnZVByaXZhdGU6OmNyZWF0ZVBsdWdpbihj
b25zdCBRU3RyaW5nICZjbGFzc2lkLCBjb25zdCBRVXJsICZ1cmwsIGNvbnN0IFFTdHJpbmdMaXN0
ICZwYXJhbU5hbWVzLCBjb25zdCBRU3RyaW5nTGlzdCAmcGFyYW1WYWx1ZXMpCit7CisgICAgUU9i
amVjdCAqd2lkZ2V0ID0gcS0+Y3JlYXRlUGx1Z2luKGNsYXNzaWQsIHVybCwgcGFyYW1OYW1lcywg
cGFyYW1WYWx1ZXMpOworICAgIHJldHVybiBhZGFwdGVyRm9yV2lkZ2V0KHdpZGdldCk7Cit9CisK
K1F0UGx1Z2luV2lkZ2V0QWRhcHRlciAqUVdlYlBhZ2VQcml2YXRlOjphZGFwdGVyRm9yV2lkZ2V0
KFFPYmplY3QgKm9iamVjdCkgY29uc3QKK3sKKyAgICBpZiAoUVdpZGdldCAqd2lkZ2V0ID0gcW9i
amVjdF9jYXN0PFFXaWRnZXQqPihvYmplY3QpKQorICAgICAgICByZXR1cm4gbmV3IFFXaWRnZXRQ
bHVnaW5JbXBsKHdpZGdldCk7CisgICAgaWYgKFFHcmFwaGljc1dpZGdldCAqd2lkZ2V0ID0gcW9i
amVjdF9jYXN0PFFHcmFwaGljc1dpZGdldCo+KG9iamVjdCkpCisgICAgICAgIHJldHVybiBuZXcg
UUdyYXBoaWNzV2lkZ2V0UGx1Z2luSW1wbCh3aWRnZXQpOworICAgIHJldHVybiAwOworfQorCit2
b2lkIFFXZWJQYWdlUHJpdmF0ZTo6Y3JlYXRlTWFpbkZyYW1lKCkKK3sKKyAgICBpZiAoIW1haW5G
cmFtZSkgeworICAgICAgICBtYWluRnJhbWUgPSBuZXcgUVdlYkZyYW1lKHEpOworICAgICAgICBl
bWl0IHEtPmZyYW1lQ3JlYXRlZChtYWluRnJhbWUuZGF0YSgpKTsKKyAgICB9Cit9CisKKyNkZWZp
bmUgTUFQX1dFQl9BQ1RJT05fRlJPTV9BREFQVEVSX0VRVUlWQUxFTlQoTmFtZSwgVmFsdWUpIFwK
KyAgICBjYXNlIFFXZWJQYWdlQWRhcHRlcjo6TmFtZTogcmV0dXJuIFFXZWJQYWdlOjpOYW1lCisK
K3N0YXRpYyBRV2ViUGFnZTo6V2ViQWN0aW9uIHdlYkFjdGlvbkZvckFkYXB0ZXJNZW51QWN0aW9u
KFFXZWJQYWdlQWRhcHRlcjo6TWVudUFjdGlvbiBhY3Rpb24pCit7CisgICAgc3dpdGNoIChhY3Rp
b24pIHsKKyAgICAgICAgRk9SX0VBQ0hfTUFQUEVEX01FTlVfQUNUSU9OKE1BUF9XRUJfQUNUSU9O
X0ZST01fQURBUFRFUl9FUVVJVkFMRU5ULCBTRU1JQ09MT05fU0VQQVJBVE9SKTsKKyNpZiBFTkFC
TEUoSU5TUEVDVE9SKQorICAgIGNhc2UgUVdlYlBhZ2VBZGFwdGVyOjpJbnNwZWN0RWxlbWVudDog
cmV0dXJuIFFXZWJQYWdlOjpJbnNwZWN0RWxlbWVudDsKKyNlbmRpZgorICAgIGRlZmF1bHQ6Cisg
ICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAg
cmV0dXJuIFFXZWJQYWdlOjpOb1dlYkFjdGlvbjsKK30KKworI2RlZmluZSBNQVBfQURBUFRFUl9B
Q1RJT05fRlJPTV9XRUJBQ1RJT05fRVFVSVZBTEVOVChOYW1lLCBWYWx1ZSkgXAorICAgIGNhc2Ug
UVdlYlBhZ2U6Ok5hbWU6IHJldHVybiBRV2ViUGFnZUFkYXB0ZXI6Ok5hbWUKKworc3RhdGljIFFX
ZWJQYWdlQWRhcHRlcjo6TWVudUFjdGlvbiBhZGFwdGVyTWVudUFjdGlvbkZvcldlYkFjdGlvbihR
V2ViUGFnZTo6V2ViQWN0aW9uIGFjdGlvbikKK3sKKyAgICBzd2l0Y2ggKGFjdGlvbikgeworICAg
ICAgICBGT1JfRUFDSF9NQVBQRURfTUVOVV9BQ1RJT04oTUFQX0FEQVBURVJfQUNUSU9OX0ZST01f
V0VCQUNUSU9OX0VRVUlWQUxFTlQsIFNFTUlDT0xPTl9TRVBBUkFUT1IpOworI2lmIEVOQUJMRShJ
TlNQRUNUT1IpCisgICAgY2FzZSBRV2ViUGFnZTo6SW5zcGVjdEVsZW1lbnQ6IHJldHVybiBRV2Vi
UGFnZUFkYXB0ZXI6Okluc3BlY3RFbGVtZW50OworI2VuZGlmCisgICAgZGVmYXVsdDoKKyAgICAg
ICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1
cm4gUVdlYlBhZ2VBZGFwdGVyOjpOb0FjdGlvbjsKK30KKworI2lmbmRlZiBRVF9OT19DT05URVhU
TUVOVQordHlwZWRlZiBRV2ViUGFnZUFkYXB0ZXI6Ok1lbnVJdGVtRGVzY3JpcHRpb24gTWVudUl0
ZW07CitRTWVudSAqY3JlYXRlQ29udGV4dE1lbnUoUVdlYlBhZ2UqIHBhZ2UsIGNvbnN0IFFMaXN0
PE1lbnVJdGVtPiYgaXRlbXMsIFFCaXRBcnJheSAqdmlzaXRlZFdlYkFjdGlvbnMpCit7CisgICAg
aWYgKGl0ZW1zLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBRTWVudSogbWVu
dSA9IG5ldyBRTWVudShwYWdlLT52aWV3KCkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRl
bXMuY291bnQoKTsgKytpKSB7CisgICAgICAgIGNvbnN0IE1lbnVJdGVtICZpdGVtID0gaXRlbXMu
YXQoaSk7CisgICAgICAgIHN3aXRjaCAoaXRlbS50eXBlKSB7CisgICAgICAgIGNhc2UgTWVudUl0
ZW06OkFjdGlvbjogeworICAgICAgICAgICAgUVdlYlBhZ2U6OldlYkFjdGlvbiBhY3Rpb24gPSB3
ZWJBY3Rpb25Gb3JBZGFwdGVyTWVudUFjdGlvbihpdGVtLmFjdGlvbik7CisgICAgICAgICAgICBR
QWN0aW9uICphID0gcGFnZS0+YWN0aW9uKGFjdGlvbik7CisgICAgICAgICAgICBpZiAoYSkgewor
ICAgICAgICAgICAgICAgIGEtPnNldEVuYWJsZWQoaXRlbS50cmFpdHMgJiBNZW51SXRlbTo6RW5h
YmxlZCk7CisgICAgICAgICAgICAgICAgYS0+c2V0Q2hlY2thYmxlKGl0ZW0udHJhaXRzICYgTWVu
dUl0ZW06OkNoZWNrYWJsZSk7CisgICAgICAgICAgICAgICAgYS0+c2V0Q2hlY2tlZChpdGVtLnRy
YWl0cyAmIE1lbnVJdGVtOjpDaGVja2VkKTsKKworICAgICAgICAgICAgICAgIG1lbnUtPmFkZEFj
dGlvbihhKTsKKyAgICAgICAgICAgICAgICB2aXNpdGVkV2ViQWN0aW9ucy0+c2V0Qml0KGFjdGlv
bik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAg
ICBjYXNlIE1lbnVJdGVtOjpTZXBhcmF0b3I6CisgICAgICAgICAgICBtZW51LT5hZGRTZXBhcmF0
b3IoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1lbnVJdGVtOjpTdWJNZW51
OiB7CisgICAgICAgICAgICBRTWVudSAqc3ViTWVudSA9IGNyZWF0ZUNvbnRleHRNZW51KHBhZ2Us
IGl0ZW0uc3ViTWVudSwgdmlzaXRlZFdlYkFjdGlvbnMpOworICAgICAgICAgICAgUV9BU1NFUlQo
c3ViTWVudSk7CisKKyAgICAgICAgICAgIGJvb2wgYW55RW5hYmxlZEFjdGlvbiA9IGZhbHNlOwor
CisgICAgICAgICAgICBRTGlzdDxRQWN0aW9uICo+IGFjdGlvbnMgPSBzdWJNZW51LT5hY3Rpb25z
KCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFjdGlvbnMuY291bnQoKTsgKytp
KSB7CisgICAgICAgICAgICAgICAgaWYgKGFjdGlvbnMuYXQoaSktPmlzVmlzaWJsZSgpKQorICAg
ICAgICAgICAgICAgICAgICBhbnlFbmFibGVkQWN0aW9uIHw9IGFjdGlvbnMuYXQoaSktPmlzRW5h
YmxlZCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBkb24ndCBzaG93IHN1Yi1t
ZW51cyB3aXRoIGp1c3QgZGlzYWJsZWQgYWN0aW9ucworICAgICAgICAgICAgaWYgKGFueUVuYWJs
ZWRBY3Rpb24pIHsKKyAgICAgICAgICAgICAgICBzdWJNZW51LT5zZXRUaXRsZShpdGVtLnN1Yk1l
bnVUaXRsZSk7CisgICAgICAgICAgICAgICAgbWVudS0+YWRkQWN0aW9uKHN1Yk1lbnUtPm1lbnVB
Y3Rpb24oKSk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBkZWxldGUgc3Vi
TWVudTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cisg
ICAgcmV0dXJuIG1lbnU7Cit9CisjZW5kaWYgLy8gUVRfTk9fQ09OVEVYVE1FTlUKKwordm9pZCBR
V2ViUGFnZVByaXZhdGU6OmNyZWF0ZUFuZFNldEN1cnJlbnRDb250ZXh0TWVudShjb25zdCBRTGlz
dDxNZW51SXRlbURlc2NyaXB0aW9uPiYgaXRlbXMsIFFCaXRBcnJheSogdmlzaXRlZFdlYkFjdGlv
bnMpCit7CisjaWZuZGVmIFFUX05PX0NPTlRFWFRNRU5VCisgICAgZGVsZXRlIGN1cnJlbnRDb250
ZXh0TWVudS5kYXRhKCk7CisKKyAgICBjdXJyZW50Q29udGV4dE1lbnUgPSBjcmVhdGVDb250ZXh0
TWVudShxLCBpdGVtcywgdmlzaXRlZFdlYkFjdGlvbnMpOworI2Vsc2UKKyAgICBRX1VOVVNFRCht
ZW51RGVzY3JpcHRpb24pOworICAgIFFfVU5VU0VEKHZpc2l0ZWRXZWJBY3Rpb25zKTsKKyNlbmRp
ZiAvLyBRVF9OT19DT05URVhUTUVOVQorfQorCisjaWZuZGVmIFFUX05PX0FDVElPTgordm9pZCBR
V2ViUGFnZVByaXZhdGU6Ol9xX3dlYkFjdGlvblRyaWdnZXJlZChib29sIGNoZWNrZWQpCit7Cisg
ICAgUUFjdGlvbiAqYSA9IHFvYmplY3RfY2FzdDxRQWN0aW9uICo+KHEtPnNlbmRlcigpKTsKKyAg
ICBpZiAoIWEpCisgICAgICAgIHJldHVybjsKKyAgICBRV2ViUGFnZTo6V2ViQWN0aW9uIGFjdGlv
biA9IHN0YXRpY19jYXN0PFFXZWJQYWdlOjpXZWJBY3Rpb24+KGEtPmRhdGEoKS50b0ludCgpKTsK
KyAgICBxLT50cmlnZ2VyQWN0aW9uKGFjdGlvbiwgY2hlY2tlZCk7Cit9CisjZW5kaWYgLy8gUVRf
Tk9fQUNUSU9OCisKK3ZvaWQgUVdlYlBhZ2VQcml2YXRlOjp1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6
OldlYkFjdGlvbiBhY3Rpb24pCit7CisjaWZkZWYgUVRfTk9fQUNUSU9OCisgICAgUV9VTlVTRUQo
YWN0aW9uKQorI2Vsc2UKKyAgICBRQWN0aW9uICphID0gYWN0aW9uc1thY3Rpb25dOworICAgIGlm
ICghYSB8fCAhbWFpbkZyYW1lKQorICAgICAgICByZXR1cm47CisKKyAgICBib29sIGVuYWJsZWQg
PSBhLT5pc0VuYWJsZWQoKTsKKyAgICBib29sIGNoZWNrZWQgPSBhLT5pc0NoZWNrZWQoKTsKKwor
ICAgIFFXZWJQYWdlQWRhcHRlcjo6TWVudUFjdGlvbiBtYXBwZWRBY3Rpb24gPSBRV2ViUGFnZUFk
YXB0ZXI6Ok5vQWN0aW9uOworICAgIGNvbnN0IGNoYXIqIGNvbW1hbmROYW1lID0gMDsKKworICAg
IHN3aXRjaCAoYWN0aW9uKSB7CisgICAgY2FzZSBRV2ViUGFnZTo6QmFjazoKKyAgICBjYXNlIFFX
ZWJQYWdlOjpGb3J3YXJkOgorICAgIGNhc2UgUVdlYlBhZ2U6OlN0b3A6CisgICAgY2FzZSBRV2Vi
UGFnZTo6UmVsb2FkOgorICAgIGNhc2UgUVdlYlBhZ2U6OlNldFRleHREaXJlY3Rpb25EZWZhdWx0
OgorICAgIGNhc2UgUVdlYlBhZ2U6OlNldFRleHREaXJlY3Rpb25MZWZ0VG9SaWdodDoKKyAgICBj
YXNlIFFXZWJQYWdlOjpTZXRUZXh0RGlyZWN0aW9uUmlnaHRUb0xlZnQ6CisgICAgICAgIG1hcHBl
ZEFjdGlvbiA9IGFkYXB0ZXJNZW51QWN0aW9uRm9yV2ViQWN0aW9uKGFjdGlvbik7CisgICAgICAg
IGJyZWFrOworICAgIGNhc2UgUVdlYlBhZ2U6OlJlbG9hZEFuZEJ5cGFzc0NhY2hlOiAvLyBNYW51
YWwgbWFwcGluZworICAgICAgICBtYXBwZWRBY3Rpb24gPSBRV2ViUGFnZUFkYXB0ZXI6OlJlbG9h
ZDsKKyAgICAgICAgYnJlYWs7CisjaWZuZGVmIFFUX05PX1VORE9TVEFDSworICAgIGNhc2UgUVdl
YlBhZ2U6OlVuZG86CisgICAgY2FzZSBRV2ViUGFnZTo6UmVkbzoKKyAgICAgICAgLy8gdGhvc2Ug
dHdvIGFyZSBoYW5kbGVkIGJ5IFFVbmRvU3RhY2sKKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLy8g
UVRfTk9fVU5ET1NUQUNLCisgICAgY2FzZSBRV2ViUGFnZTo6U2VsZWN0QWxsOiAvLyBlZGl0b3Ig
Y29tbWFuZCBpcyBhbHdheXMgZW5hYmxlZAorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiB7
CisgICAgICAgIC8vIHNlZSBpZiBpdCdzIGFuIGVkaXRvciBjb21tYW5kCisgICAgICAgIGNvbW1h
bmROYW1lID0gZWRpdG9yQ29tbWFuZEZvcldlYkFjdGlvbnMoYWN0aW9uKTsKKyAgICAgICAgYnJl
YWs7CisgICAgfQorICAgIH0KKyAgICBpZiAobWFwcGVkQWN0aW9uICE9IFFXZWJQYWdlQWRhcHRl
cjo6Tm9BY3Rpb24gfHwgY29tbWFuZE5hbWUpCisgICAgICAgIHVwZGF0ZUFjdGlvbkludGVybmFs
KG1hcHBlZEFjdGlvbiwgY29tbWFuZE5hbWUsICZlbmFibGVkLCAmY2hlY2tlZCk7CisKKyAgICBh
LT5zZXRFbmFibGVkKGVuYWJsZWQpOworCisgICAgaWYgKGEtPmlzQ2hlY2thYmxlKCkpCisgICAg
ICAgIGEtPnNldENoZWNrZWQoY2hlY2tlZCk7CisjZW5kaWYgLy8gUVRfTk9fQUNUSU9OCit9CisK
K3ZvaWQgUVdlYlBhZ2VQcml2YXRlOjp1cGRhdGVOYXZpZ2F0aW9uQWN0aW9ucygpCit7CisgICAg
dXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpCYWNrKTsKKyAgICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6
OkZvcndhcmQpOworICAgIHVwZGF0ZUFjdGlvbihRV2ViUGFnZTo6U3RvcCk7CisgICAgdXBkYXRl
QWN0aW9uKFFXZWJQYWdlOjpSZWxvYWQpOworICAgIHVwZGF0ZUFjdGlvbihRV2ViUGFnZTo6UmVs
b2FkQW5kQnlwYXNzQ2FjaGUpOworfQorCitRT2JqZWN0ICpRV2ViUGFnZVByaXZhdGU6Omluc3Bl
Y3RvckhhbmRsZSgpCit7CisgICAgcmV0dXJuIGdldE9yQ3JlYXRlSW5zcGVjdG9yKCk7Cit9CisK
K3ZvaWQgUVdlYlBhZ2VQcml2YXRlOjpzZXRJbnNwZWN0b3JGcm9udGVuZChRT2JqZWN0KiBmcm9u
dGVuZCkKK3sKKyAgICBpbnNwZWN0b3JGcm9udGVuZCA9IHFvYmplY3RfY2FzdDxRV2lkZ2V0Kj4o
ZnJvbnRlbmQpOworICAgIGlmIChpbnNwZWN0b3IpCisgICAgICAgIGluc3BlY3Rvci0+ZC0+c2V0
RnJvbnRlbmQoZnJvbnRlbmQpOworfQorCit2b2lkIFFXZWJQYWdlUHJpdmF0ZTo6c2V0SW5zcGVj
dG9yV2luZG93VGl0bGUoY29uc3QgUVN0cmluZyYgdGl0bGUpCit7CisgICAgaWYgKGluc3BlY3Rv
cikKKyAgICAgICAgaW5zcGVjdG9yLT5zZXRXaW5kb3dUaXRsZSh0aXRsZSk7Cit9CisKK3ZvaWQg
UVdlYlBhZ2VQcml2YXRlOjpjcmVhdGVXZWJJbnNwZWN0b3IoUU9iamVjdCoqIGluc3BlY3RvclZp
ZXcsIFFXZWJQYWdlQWRhcHRlcioqIGluc3BlY3RvclBhZ2UpCit7CisgICAgUVdlYlBhZ2UqIHBh
Z2UgPSBuZXcgV2ViS2l0OjpJbnNwZWN0b3JDbGllbnRXZWJQYWdlOworICAgICppbnNwZWN0b3JW
aWV3ID0gcGFnZS0+dmlldygpOworICAgICppbnNwZWN0b3JQYWdlID0gcGFnZS0+ZDsKK30KKwor
I2lmbmRlZiBRVF9OT19NRU5VCitzdGF0aWMgUVN0cmluZ0xpc3QgaXRlcmF0ZUNvbnRleHRNZW51
KFFNZW51KiBtZW51KQoreworICAgIGlmICghbWVudSkKKyAgICAgICAgcmV0dXJuIFFTdHJpbmdM
aXN0KCk7CisKKyAgICBRU3RyaW5nTGlzdCBpdGVtczsKKyAgICBRTGlzdDxRQWN0aW9uICo+IGFj
dGlvbnMgPSBtZW51LT5hY3Rpb25zKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhY3Rpb25z
LmNvdW50KCk7ICsraSkgeworICAgICAgICBpZiAoYWN0aW9ucy5hdChpKS0+aXNTZXBhcmF0b3Io
KSkKKyAgICAgICAgICAgIGl0ZW1zIDw8IFFMYXRpbjFTdHJpbmcoIjxzZXBhcmF0b3I+Iik7Cisg
ICAgICAgIGVsc2UKKyAgICAgICAgICAgIGl0ZW1zIDw8IGFjdGlvbnMuYXQoaSktPnRleHQoKTsK
KyAgICAgICAgaWYgKGFjdGlvbnMuYXQoaSktPm1lbnUoKSkKKyAgICAgICAgICAgIGl0ZW1zIDw8
IGl0ZXJhdGVDb250ZXh0TWVudShhY3Rpb25zLmF0KGkpLT5tZW51KCkpOworICAgIH0KKyAgICBy
ZXR1cm4gaXRlbXM7Cit9CisjZW5kaWYKKworUVN0cmluZ0xpc3QgUVdlYlBhZ2VQcml2YXRlOjpt
ZW51QWN0aW9uc0FzVGV4dCgpCit7CisjaWZuZGVmIFFUX05PX01FTlUKKyAgICByZXR1cm4gaXRl
cmF0ZUNvbnRleHRNZW51KGN1cnJlbnRDb250ZXh0TWVudS5kYXRhKCkpOworI2Vsc2UKKyAgICBy
ZXR1cm4gUVN0cmluZ0xpc3QoKTsKKyNlbmRpZgorfQorCit2b2lkIFFXZWJQYWdlUHJpdmF0ZTo6
ZW1pdFZpZXdwb3J0Q2hhbmdlUmVxdWVzdGVkKCkKK3sKKyAgICBlbWl0IHEtPnZpZXdwb3J0Q2hh
bmdlUmVxdWVzdGVkKCk7Cit9CisKK3ZvaWQgUVdlYlBhZ2VQcml2YXRlOjp1cGRhdGVFZGl0b3JB
Y3Rpb25zKCkKK3sKKyAgICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6OkN1dCk7CisgICAgdXBkYXRl
QWN0aW9uKFFXZWJQYWdlOjpDb3B5KTsKKyAgICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6OlBhc3Rl
KTsKKyAgICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6Ok1vdmVUb05leHRDaGFyKTsKKyAgICB1cGRh
dGVBY3Rpb24oUVdlYlBhZ2U6Ok1vdmVUb1ByZXZpb3VzQ2hhcik7CisgICAgdXBkYXRlQWN0aW9u
KFFXZWJQYWdlOjpNb3ZlVG9OZXh0V29yZCk7CisgICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpN
b3ZlVG9QcmV2aW91c1dvcmQpOworICAgIHVwZGF0ZUFjdGlvbihRV2ViUGFnZTo6TW92ZVRvTmV4
dExpbmUpOworICAgIHVwZGF0ZUFjdGlvbihRV2ViUGFnZTo6TW92ZVRvUHJldmlvdXNMaW5lKTsK
KyAgICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6Ok1vdmVUb1N0YXJ0T2ZMaW5lKTsKKyAgICB1cGRh
dGVBY3Rpb24oUVdlYlBhZ2U6Ok1vdmVUb0VuZE9mTGluZSk7CisgICAgdXBkYXRlQWN0aW9uKFFX
ZWJQYWdlOjpNb3ZlVG9TdGFydE9mQmxvY2spOworICAgIHVwZGF0ZUFjdGlvbihRV2ViUGFnZTo6
TW92ZVRvRW5kT2ZCbG9jayk7CisgICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpNb3ZlVG9TdGFy
dE9mRG9jdW1lbnQpOworICAgIHVwZGF0ZUFjdGlvbihRV2ViUGFnZTo6TW92ZVRvRW5kT2ZEb2N1
bWVudCk7CisgICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpTZWxlY3ROZXh0Q2hhcik7CisgICAg
dXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpTZWxlY3RQcmV2aW91c0NoYXIpOworICAgIHVwZGF0ZUFj
dGlvbihRV2ViUGFnZTo6U2VsZWN0TmV4dFdvcmQpOworICAgIHVwZGF0ZUFjdGlvbihRV2ViUGFn
ZTo6U2VsZWN0UHJldmlvdXNXb3JkKTsKKyAgICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6OlNlbGVj
dE5leHRMaW5lKTsKKyAgICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6OlNlbGVjdFByZXZpb3VzTGlu
ZSk7CisgICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpTZWxlY3RTdGFydE9mTGluZSk7CisgICAg
dXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpTZWxlY3RFbmRPZkxpbmUpOworICAgIHVwZGF0ZUFjdGlv
bihRV2ViUGFnZTo6U2VsZWN0U3RhcnRPZkJsb2NrKTsKKyAgICB1cGRhdGVBY3Rpb24oUVdlYlBh
Z2U6OlNlbGVjdEVuZE9mQmxvY2spOworICAgIHVwZGF0ZUFjdGlvbihRV2ViUGFnZTo6U2VsZWN0
U3RhcnRPZkRvY3VtZW50KTsKKyAgICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6OlNlbGVjdEVuZE9m
RG9jdW1lbnQpOworICAgIHVwZGF0ZUFjdGlvbihRV2ViUGFnZTo6RGVsZXRlU3RhcnRPZldvcmQp
OworICAgIHVwZGF0ZUFjdGlvbihRV2ViUGFnZTo6RGVsZXRlRW5kT2ZXb3JkKTsKKyAgICB1cGRh
dGVBY3Rpb24oUVdlYlBhZ2U6OlNldFRleHREaXJlY3Rpb25EZWZhdWx0KTsKKyAgICB1cGRhdGVB
Y3Rpb24oUVdlYlBhZ2U6OlNldFRleHREaXJlY3Rpb25MZWZ0VG9SaWdodCk7CisgICAgdXBkYXRl
QWN0aW9uKFFXZWJQYWdlOjpTZXRUZXh0RGlyZWN0aW9uUmlnaHRUb0xlZnQpOworICAgIHVwZGF0
ZUFjdGlvbihRV2ViUGFnZTo6VG9nZ2xlQm9sZCk7CisgICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdl
OjpUb2dnbGVJdGFsaWMpOworICAgIHVwZGF0ZUFjdGlvbihRV2ViUGFnZTo6VG9nZ2xlVW5kZXJs
aW5lKTsKKyAgICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6Okluc2VydFBhcmFncmFwaFNlcGFyYXRv
cik7CisgICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpJbnNlcnRMaW5lU2VwYXJhdG9yKTsKKyAg
ICB1cGRhdGVBY3Rpb24oUVdlYlBhZ2U6OlBhc3RlQW5kTWF0Y2hTdHlsZSk7CisgICAgdXBkYXRl
QWN0aW9uKFFXZWJQYWdlOjpSZW1vdmVGb3JtYXQpOworICAgIHVwZGF0ZUFjdGlvbihRV2ViUGFn
ZTo6VG9nZ2xlU3RyaWtldGhyb3VnaCk7CisgICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpUb2dn
bGVTdWJzY3JpcHQpOworICAgIHVwZGF0ZUFjdGlvbihRV2ViUGFnZTo6VG9nZ2xlU3VwZXJzY3Jp
cHQpOworICAgIHVwZGF0ZUFjdGlvbihRV2ViUGFnZTo6SW5zZXJ0VW5vcmRlcmVkTGlzdCk7Cisg
ICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpJbnNlcnRPcmRlcmVkTGlzdCk7CisgICAgdXBkYXRl
QWN0aW9uKFFXZWJQYWdlOjpJbmRlbnQpOworICAgIHVwZGF0ZUFjdGlvbihRV2ViUGFnZTo6T3V0
ZGVudCk7CisgICAgdXBkYXRlQWN0aW9uKFFXZWJQYWdlOjpBbGlnbkNlbnRlcik7CisgICAgdXBk
YXRlQWN0aW9uKFFXZWJQYWdlOjpBbGlnbkp1c3RpZmllZCk7CisgICAgdXBkYXRlQWN0aW9uKFFX
ZWJQYWdlOjpBbGlnbkxlZnQpOworICAgIHVwZGF0ZUFjdGlvbihRV2ViUGFnZTo6QWxpZ25SaWdo
dCk7Cit9CisKK3ZvaWQgUVdlYlBhZ2VQcml2YXRlOjp0aW1lckV2ZW50KFFUaW1lckV2ZW50ICpl
dikKK3sKKyAgICBpbnQgdGltZXJJZCA9IGV2LT50aW1lcklkKCk7CisgICAgaWYgKHRpbWVySWQg
PT0gdHJpcGxlQ2xpY2tUaW1lci50aW1lcklkKCkpCisgICAgICAgIHRyaXBsZUNsaWNrVGltZXIu
c3RvcCgpOworICAgIGVsc2UKKyAgICAgICAgcS0+dGltZXJFdmVudChldik7Cit9CisKK2Jvb2wg
UVdlYlBhZ2VQcml2YXRlOjpyZXF1ZXN0U29mdHdhcmVJbnB1dFBhbmVsKCkgY29uc3QKK3sKKyAg
ICByZXR1cm4gUVN0eWxlOjpSZXF1ZXN0U29mdHdhcmVJbnB1dFBhbmVsKGNsaWVudC0+c3R5bGUo
KS0+c3R5bGVIaW50KFFTdHlsZTo6U0hfUmVxdWVzdFNvZnR3YXJlSW5wdXRQYW5lbCkpID09IFFT
dHlsZTo6UlNJUF9Pbk1vdXNlQ2xpY2s7Cit9CisKKyNpZm5kZWYgUVRfTk9fQ09OVEVYVE1FTlUK
K3ZvaWQgUVdlYlBhZ2VQcml2YXRlOjpjb250ZXh0TWVudUV2ZW50KGNvbnN0IFFQb2ludCYgZ2xv
YmFsUG9zKQoreworICAgIFFNZW51ICptZW51ID0gcS0+Y3JlYXRlU3RhbmRhcmRDb250ZXh0TWVu
dSgpOworICAgIGlmIChtZW51KSB7CisgICAgICAgIG1lbnUtPmV4ZWMoZ2xvYmFsUG9zKTsKKyAg
ICAgICAgZGVsZXRlIG1lbnU7CisgICAgfQorfQorI2VuZGlmIC8vIFFUX05PX0NPTlRFWFRNRU5V
CisKKy8qIQorICAgIFxzaW5jZSA0LjUKKyAgICBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgdGhlIHN0
YW5kYXJkIGNvbnRleHQgbWVudSB3aGljaCBpcyBzaG93biB3aGVuCisgICAgdGhlIHVzZXIgY2xp
Y2tzIG9uIHRoZSB3ZWIgcGFnZSB3aXRoIHRoZSByaWdodCBtb3VzZSBidXR0b24uIEl0IGlzCisg
ICAgY2FsbGVkIGZyb20gdGhlIGRlZmF1bHQgY29udGV4dE1lbnVFdmVudCgpIGhhbmRsZXIuIFRo
ZSBwb3B1cCBtZW51J3MKKyAgICBvd25lcnNoaXAgaXMgdHJhbnNmZXJyZWQgdG8gdGhlIGNhbGxl
ci4KKyAqLworUU1lbnUgKlFXZWJQYWdlOjpjcmVhdGVTdGFuZGFyZENvbnRleHRNZW51KCkKK3sK
KyNpZm5kZWYgUVRfTk9fQ09OVEVYVE1FTlUKKyAgICBRTWVudSogbWVudSA9IGQtPmN1cnJlbnRD
b250ZXh0TWVudS5kYXRhKCk7CisgICAgZC0+Y3VycmVudENvbnRleHRNZW51ID0gMDsKKyAgICBy
ZXR1cm4gbWVudTsKKyNlbHNlCisgICAgcmV0dXJuIDA7CisjZW5kaWYKK30KKworI2lmbmRlZiBR
VF9OT19TSE9SVENVVAorUVdlYlBhZ2U6OldlYkFjdGlvbiBRV2ViUGFnZVByaXZhdGU6OmVkaXRv
ckFjdGlvbkZvcktleUV2ZW50KFFLZXlFdmVudCogZXZlbnQpCit7CisgICAgc3RhdGljIHN0cnVj
dCB7CisgICAgICAgIFFLZXlTZXF1ZW5jZTo6U3RhbmRhcmRLZXkgc3RhbmRhcmRLZXk7CisgICAg
ICAgIFFXZWJQYWdlOjpXZWJBY3Rpb24gYWN0aW9uOworICAgIH0gZWRpdG9yQWN0aW9uc1tdID0g
eworICAgICAgICB7IFFLZXlTZXF1ZW5jZTo6Q3V0LCBRV2ViUGFnZTo6Q3V0IH0sCisgICAgICAg
IHsgUUtleVNlcXVlbmNlOjpDb3B5LCBRV2ViUGFnZTo6Q29weSB9LAorICAgICAgICB7IFFLZXlT
ZXF1ZW5jZTo6UGFzdGUsIFFXZWJQYWdlOjpQYXN0ZSB9LAorICAgICAgICB7IFFLZXlTZXF1ZW5j
ZTo6VW5kbywgUVdlYlBhZ2U6OlVuZG8gfSwKKyAgICAgICAgeyBRS2V5U2VxdWVuY2U6OlJlZG8s
IFFXZWJQYWdlOjpSZWRvIH0sCisgICAgICAgIHsgUUtleVNlcXVlbmNlOjpNb3ZlVG9OZXh0Q2hh
ciwgUVdlYlBhZ2U6Ok1vdmVUb05leHRDaGFyIH0sCisgICAgICAgIHsgUUtleVNlcXVlbmNlOjpN
b3ZlVG9QcmV2aW91c0NoYXIsIFFXZWJQYWdlOjpNb3ZlVG9QcmV2aW91c0NoYXIgfSwKKyAgICAg
ICAgeyBRS2V5U2VxdWVuY2U6Ok1vdmVUb05leHRXb3JkLCBRV2ViUGFnZTo6TW92ZVRvTmV4dFdv
cmQgfSwKKyAgICAgICAgeyBRS2V5U2VxdWVuY2U6Ok1vdmVUb1ByZXZpb3VzV29yZCwgUVdlYlBh
Z2U6Ok1vdmVUb1ByZXZpb3VzV29yZCB9LAorICAgICAgICB7IFFLZXlTZXF1ZW5jZTo6TW92ZVRv
TmV4dExpbmUsIFFXZWJQYWdlOjpNb3ZlVG9OZXh0TGluZSB9LAorICAgICAgICB7IFFLZXlTZXF1
ZW5jZTo6TW92ZVRvUHJldmlvdXNMaW5lLCBRV2ViUGFnZTo6TW92ZVRvUHJldmlvdXNMaW5lIH0s
CisgICAgICAgIHsgUUtleVNlcXVlbmNlOjpNb3ZlVG9TdGFydE9mTGluZSwgUVdlYlBhZ2U6Ok1v
dmVUb1N0YXJ0T2ZMaW5lIH0sCisgICAgICAgIHsgUUtleVNlcXVlbmNlOjpNb3ZlVG9FbmRPZkxp
bmUsIFFXZWJQYWdlOjpNb3ZlVG9FbmRPZkxpbmUgfSwKKyAgICAgICAgeyBRS2V5U2VxdWVuY2U6
Ok1vdmVUb1N0YXJ0T2ZCbG9jaywgUVdlYlBhZ2U6Ok1vdmVUb1N0YXJ0T2ZCbG9jayB9LAorICAg
ICAgICB7IFFLZXlTZXF1ZW5jZTo6TW92ZVRvRW5kT2ZCbG9jaywgUVdlYlBhZ2U6Ok1vdmVUb0Vu
ZE9mQmxvY2sgfSwKKyAgICAgICAgeyBRS2V5U2VxdWVuY2U6Ok1vdmVUb1N0YXJ0T2ZEb2N1bWVu
dCwgUVdlYlBhZ2U6Ok1vdmVUb1N0YXJ0T2ZEb2N1bWVudCB9LAorICAgICAgICB7IFFLZXlTZXF1
ZW5jZTo6TW92ZVRvRW5kT2ZEb2N1bWVudCwgUVdlYlBhZ2U6Ok1vdmVUb0VuZE9mRG9jdW1lbnQg
fSwKKyAgICAgICAgeyBRS2V5U2VxdWVuY2U6OlNlbGVjdE5leHRDaGFyLCBRV2ViUGFnZTo6U2Vs
ZWN0TmV4dENoYXIgfSwKKyAgICAgICAgeyBRS2V5U2VxdWVuY2U6OlNlbGVjdFByZXZpb3VzQ2hh
ciwgUVdlYlBhZ2U6OlNlbGVjdFByZXZpb3VzQ2hhciB9LAorICAgICAgICB7IFFLZXlTZXF1ZW5j
ZTo6U2VsZWN0TmV4dFdvcmQsIFFXZWJQYWdlOjpTZWxlY3ROZXh0V29yZCB9LAorICAgICAgICB7
IFFLZXlTZXF1ZW5jZTo6U2VsZWN0UHJldmlvdXNXb3JkLCBRV2ViUGFnZTo6U2VsZWN0UHJldmlv
dXNXb3JkIH0sCisgICAgICAgIHsgUUtleVNlcXVlbmNlOjpTZWxlY3ROZXh0TGluZSwgUVdlYlBh
Z2U6OlNlbGVjdE5leHRMaW5lIH0sCisgICAgICAgIHsgUUtleVNlcXVlbmNlOjpTZWxlY3RQcmV2
aW91c0xpbmUsIFFXZWJQYWdlOjpTZWxlY3RQcmV2aW91c0xpbmUgfSwKKyAgICAgICAgeyBRS2V5
U2VxdWVuY2U6OlNlbGVjdFN0YXJ0T2ZMaW5lLCBRV2ViUGFnZTo6U2VsZWN0U3RhcnRPZkxpbmUg
fSwKKyAgICAgICAgeyBRS2V5U2VxdWVuY2U6OlNlbGVjdEVuZE9mTGluZSwgUVdlYlBhZ2U6OlNl
bGVjdEVuZE9mTGluZSB9LAorICAgICAgICB7IFFLZXlTZXF1ZW5jZTo6U2VsZWN0U3RhcnRPZkJs
b2NrLCBRV2ViUGFnZTo6U2VsZWN0U3RhcnRPZkJsb2NrIH0sCisgICAgICAgIHsgUUtleVNlcXVl
bmNlOjpTZWxlY3RFbmRPZkJsb2NrLCAgUVdlYlBhZ2U6OlNlbGVjdEVuZE9mQmxvY2sgfSwKKyAg
ICAgICAgeyBRS2V5U2VxdWVuY2U6OlNlbGVjdFN0YXJ0T2ZEb2N1bWVudCwgUVdlYlBhZ2U6OlNl
bGVjdFN0YXJ0T2ZEb2N1bWVudCB9LAorICAgICAgICB7IFFLZXlTZXF1ZW5jZTo6U2VsZWN0RW5k
T2ZEb2N1bWVudCwgUVdlYlBhZ2U6OlNlbGVjdEVuZE9mRG9jdW1lbnQgfSwKKyAgICAgICAgeyBR
S2V5U2VxdWVuY2U6OkRlbGV0ZVN0YXJ0T2ZXb3JkLCBRV2ViUGFnZTo6RGVsZXRlU3RhcnRPZldv
cmQgfSwKKyAgICAgICAgeyBRS2V5U2VxdWVuY2U6OkRlbGV0ZUVuZE9mV29yZCwgUVdlYlBhZ2U6
OkRlbGV0ZUVuZE9mV29yZCB9LAorICAgICAgICB7IFFLZXlTZXF1ZW5jZTo6SW5zZXJ0UGFyYWdy
YXBoU2VwYXJhdG9yLCBRV2ViUGFnZTo6SW5zZXJ0UGFyYWdyYXBoU2VwYXJhdG9yIH0sCisgICAg
ICAgIHsgUUtleVNlcXVlbmNlOjpJbnNlcnRMaW5lU2VwYXJhdG9yLCBRV2ViUGFnZTo6SW5zZXJ0
TGluZVNlcGFyYXRvciB9LAorICAgICAgICB7IFFLZXlTZXF1ZW5jZTo6U2VsZWN0QWxsLCBRV2Vi
UGFnZTo6U2VsZWN0QWxsIH0sCisgICAgICAgIHsgUUtleVNlcXVlbmNlOjpVbmtub3duS2V5LCBR
V2ViUGFnZTo6Tm9XZWJBY3Rpb24gfQorICAgIH07CisKKyAgICBmb3IgKGludCBpID0gMDsgZWRp
dG9yQWN0aW9uc1tpXS5zdGFuZGFyZEtleSAhPSBRS2V5U2VxdWVuY2U6OlVua25vd25LZXk7ICsr
aSkKKyAgICAgICAgaWYgKGV2ZW50ID09IGVkaXRvckFjdGlvbnNbaV0uc3RhbmRhcmRLZXkpCisg
ICAgICAgICAgICByZXR1cm4gZWRpdG9yQWN0aW9uc1tpXS5hY3Rpb247CisKKyAgICByZXR1cm4g
UVdlYlBhZ2U6Ok5vV2ViQWN0aW9uOworfQorI2VuZGlmIC8vIFFUX05PX1NIT1JUQ1VUCisKK3Zv
aWQgUVdlYlBhZ2VQcml2YXRlOjprZXlQcmVzc0V2ZW50KFFLZXlFdmVudCAqZXYpCit7CisgICAg
Ly8gd2UgZm9yd2FyZCB0aGUga2V5IGV2ZW50IHRvIFdlYkNvcmUgZmlyc3QgdG8gaGFuZGxlIHBv
dGVudGlhbCBET00KKyAgICAvLyBkZWZpbmVkIGV2ZW50IGhhbmRsZXJzIGFuZCBsYXRlciBvbiBl
bmQgdXAgaW4gRWRpdG9yQ2xpZW50UXQ6OmhhbmRsZUtleWJvYXJkRXZlbnQKKyAgICAvLyB0byB0
cmlnZ2VyIGVkaXRvciBjb21tYW5kcyB2aWEgdHJpZ2dlckFjdGlvbigpLgorICAgIGJvb2wgaGFu
ZGxlZCA9IGhhbmRsZUtleUV2ZW50KGV2KTsKKworICAgIGlmICghaGFuZGxlZCkgeworICAgICAg
ICBoYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgaWYgKCFoYW5kbGVTY3JvbGxpbmcoZXYpKSB7Cisg
ICAgICAgICAgICBzd2l0Y2ggKGV2LT5rZXkoKSkgeworICAgICAgICAgICAgY2FzZSBRdDo6S2V5
X0JhY2s6CisgICAgICAgICAgICAgICAgcS0+dHJpZ2dlckFjdGlvbihRV2ViUGFnZTo6QmFjayk7
CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFF0OjpLZXlfRm9yd2Fy
ZDoKKyAgICAgICAgICAgICAgICBxLT50cmlnZ2VyQWN0aW9uKFFXZWJQYWdlOjpGb3J3YXJkKTsK
KyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUXQ6OktleV9TdG9wOgor
ICAgICAgICAgICAgICAgIHEtPnRyaWdnZXJBY3Rpb24oUVdlYlBhZ2U6OlN0b3ApOworICAgICAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRdDo6S2V5X1JlZnJlc2g6CisgICAg
ICAgICAgICAgICAgcS0+dHJpZ2dlckFjdGlvbihRV2ViUGFnZTo6UmVsb2FkKTsKKyAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUXQ6OktleV9CYWNrc3BhY2U6CisgICAg
ICAgICAgICAgICAgaWYgKGV2LT5tb2RpZmllcnMoKSA9PSBRdDo6U2hpZnRNb2RpZmllcikKKyAg
ICAgICAgICAgICAgICAgICAgcS0+dHJpZ2dlckFjdGlvbihRV2ViUGFnZTo6Rm9yd2FyZCk7Cisg
ICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBxLT50cmlnZ2VyQWN0aW9u
KFFXZWJQYWdlOjpCYWNrKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRl
ZmF1bHQ6CisgICAgICAgICAgICAgICAgaGFuZGxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAg
IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZXYtPnNldEFj
Y2VwdGVkKGhhbmRsZWQpOworfQorCit2b2lkIFFXZWJQYWdlUHJpdmF0ZTo6a2V5UmVsZWFzZUV2
ZW50KFFLZXlFdmVudCAqZXYpCit7CisgICAgaWYgKGV2LT5pc0F1dG9SZXBlYXQoKSkgeworICAg
ICAgICBldi0+c2V0QWNjZXB0ZWQodHJ1ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAg
ICBib29sIGhhbmRsZWQgPSBoYW5kbGVLZXlFdmVudChldik7CisgICAgZXYtPnNldEFjY2VwdGVk
KGhhbmRsZWQpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBUPgordm9pZCBRV2ViUGFnZVByaXZhdGU6
OmRyYWdFbnRlckV2ZW50KFQqIGV2KQoreworI2lmbmRlZiBRVF9OT19EUkFHQU5ERFJPUAorICAg
IFF0OjpEcm9wQWN0aW9uIGFjdGlvbiA9IGRyYWdFbnRlcmVkKGV2LT5taW1lRGF0YSgpLCBRUG9p
bnRGKGV2LT5wb3MoKSkudG9Qb2ludCgpLCBldi0+cG9zc2libGVBY3Rpb25zKCkpOworICAgIGV2
LT5zZXREcm9wQWN0aW9uKGFjdGlvbik7CisgICAgZXYtPmFjY2VwdFByb3Bvc2VkQWN0aW9uKCk7
CisjZW5kaWYKK30KKwordGVtcGxhdGU8Y2xhc3MgVD4KK3ZvaWQgUVdlYlBhZ2VQcml2YXRlOjpk
cmFnTW92ZUV2ZW50KFQgKmV2KQoreworI2lmbmRlZiBRVF9OT19EUkFHQU5ERFJPUAorICAgIG1f
bGFzdERyb3BBY3Rpb24gPSBkcmFnVXBkYXRlZChldi0+bWltZURhdGEoKSwgUVBvaW50Rihldi0+
cG9zKCkpLnRvUG9pbnQoKSwgZXYtPnBvc3NpYmxlQWN0aW9ucygpKTsKKyAgICBldi0+c2V0RHJv
cEFjdGlvbihtX2xhc3REcm9wQWN0aW9uKTsKKyAgICBpZiAobV9sYXN0RHJvcEFjdGlvbiAhPSBR
dDo6SWdub3JlQWN0aW9uKQorICAgICAgICBldi0+YWNjZXB0KCk7CisjZW5kaWYKK30KKwordGVt
cGxhdGU8Y2xhc3MgVD4KK3ZvaWQgUVdlYlBhZ2VQcml2YXRlOjpkcm9wRXZlbnQoVCAqZXYpCit7
CisjaWZuZGVmIFFUX05PX0RSQUdBTkREUk9QCisgICAgaWYgKHBlcmZvcm1EcmFnKGV2LT5taW1l
RGF0YSgpLCBRUG9pbnRGKGV2LT5wb3MoKSkudG9Qb2ludCgpLCBldi0+cG9zc2libGVBY3Rpb25z
KCkpKSB7CisgICAgICAgIGV2LT5zZXREcm9wQWN0aW9uKG1fbGFzdERyb3BBY3Rpb24pOworICAg
ICAgICBldi0+YWNjZXB0KCk7CisgICAgfQorI2VuZGlmCit9CisKK3ZvaWQgUVdlYlBhZ2VQcml2
YXRlOjpsZWF2ZUV2ZW50KFFFdmVudCopCit7CisgICAgLy8gRmFrZSBhIG1vdXNlIG1vdmUgZXZl
bnQganVzdCBvdXRzaWRlIG9mIHRoZSB3aWRnZXQsIHNpbmNlIGFsbAorICAgIC8vIHRoZSBpbnRl
cmVzdGluZyBtb3VzZS1vdXQgYmVoYXZpb3IgbGlrZSBpbnZhbGlkYXRpbmcgc2Nyb2xsYmFycwor
ICAgIC8vIGlzIGhhbmRsZWQgYnkgdGhlIFdlYktpdCBldmVudCBoYW5kbGVyJ3MgbW91c2VNb3Zl
ZCBmdW5jdGlvbi4KKyAgICBRTW91c2VFdmVudCBmYWtlRXZlbnQoUUV2ZW50OjpNb3VzZU1vdmUs
IFFDdXJzb3I6OnBvcygpLCBRdDo6Tm9CdXR0b24sIFF0OjpOb0J1dHRvbiwgUXQ6Ok5vTW9kaWZp
ZXIpOworICAgIG1vdXNlTW92ZUV2ZW50KCZmYWtlRXZlbnQpOworfQorCisvKiEKKyAgICBccHJv
cGVydHkgUVdlYlBhZ2U6OnBhbGV0dGUKKyAgICBcYnJpZWYgdGhlIHBhZ2UncyBwYWxldHRlCisK
KyAgICBUaGUgYmFzZSBicnVzaCBvZiB0aGUgcGFsZXR0ZSBpcyB1c2VkIHRvIGRyYXcgdGhlIGJh
Y2tncm91bmQgb2YgdGhlIG1haW4gZnJhbWUuCisKKyAgICBCeSBkZWZhdWx0LCB0aGlzIHByb3Bl
cnR5IGNvbnRhaW5zIHRoZSBhcHBsaWNhdGlvbidzIGRlZmF1bHQgcGFsZXR0ZS4KKyovCit2b2lk
IFFXZWJQYWdlOjpzZXRQYWxldHRlKGNvbnN0IFFQYWxldHRlICZwYWwpCit7CisgICAgZC0+cGFs
ZXR0ZSA9IHBhbDsKKyAgICBpZiAoIWQtPm1haW5GcmFtZSB8fCAhZC0+bWFpbkZyYW1lLmRhdGEo
KS0+ZC0+aGFzVmlldygpKQorICAgICAgICByZXR1cm47CisKKyAgICBRQnJ1c2ggYnJ1c2ggPSBw
YWwuYnJ1c2goUVBhbGV0dGU6OkJhc2UpOworICAgIFFDb2xvciBiYWNrZ3JvdW5kQ29sb3IgPSBi
cnVzaC5zdHlsZSgpID09IFF0OjpTb2xpZFBhdHRlcm4gPyBicnVzaC5jb2xvcigpIDogUUNvbG9y
KCk7CisgICAgZC0+bWFpbkZyYW1lLmRhdGEoKS0+ZC0+dXBkYXRlQmFja2dyb3VuZFJlY3Vyc2l2
ZWx5KGJhY2tncm91bmRDb2xvcik7Cit9CisKK1FQYWxldHRlIFFXZWJQYWdlOjpwYWxldHRlKCkg
Y29uc3QKK3sKKyAgICByZXR1cm4gZC0+cGFsZXR0ZTsKK30KKwordm9pZCBRV2ViUGFnZVByaXZh
dGU6OnNob3J0Y3V0T3ZlcnJpZGVFdmVudChRS2V5RXZlbnQqIGV2ZW50KQoreworICAgIGlmICho
YW5kbGVTaG9ydGN1dE92ZXJyaWRlRXZlbnQoZXZlbnQpKQorICAgICAgICByZXR1cm47CisjaWZu
ZGVmIFFUX05PX1NIT1JUQ1VUCisgICAgaWYgKGVkaXRvckFjdGlvbkZvcktleUV2ZW50KGV2ZW50
KSAhPSBRV2ViUGFnZTo6Tm9XZWJBY3Rpb24pCisgICAgICAgIGV2ZW50LT5hY2NlcHQoKTsKKyNl
bmRpZgorCit9CisKK2Jvb2wgUVdlYlBhZ2VQcml2YXRlOjpnZXN0dXJlRXZlbnQoUUdlc3R1cmVF
dmVudCogZXZlbnQpCit7CisgICAgUVdlYkZyYW1lQWRhcHRlciogZnJhbWUgPSBtYWluRnJhbWUu
ZGF0YSgpLT5kOworICAgIGlmICghZnJhbWUtPmhhc1ZpZXcoKSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgIC8vIFFHZXN0dXJlRXZlbnRzIGNhbiBjb250YWluIHVwZGF0ZXMgZm9yIG11bHRp
cGxlIGdlc3R1cmVzLgorICAgIGJvb2wgaGFuZGxlZCA9IGZhbHNlOworI2lmIEVOQUJMRShHRVNU
VVJFX0VWRU5UUykKKyAgICAvLyBRR2VzdHVyZUV2ZW50IGxpdmVzIGluIFdpZGdldHMsIHdlJ2xs
IG5lZWQgYSBkdW1teSBzdHJ1Y3QgdG8gbXVsZSB0aGUgaW5mbyBpdCBjb250YWlucyB0byB0aGUg
Im90aGVyIHNpZGUiCisgICAgUUdlc3R1cmVFdmVudEZhY2FkZSBnZXN0dXJlRmFjYWRlOworCisg
ICAgUUdlc3R1cmUqIGdlc3R1cmUgPSBldmVudC0+Z2VzdHVyZShRdDo6VGFwR2VzdHVyZSk7Cisg
ICAgLy8gQmV3YXJlIHRoYXQgZ2VzdHVyZXMgc2VuZCBieSBEdW1wUmVuZGVyVHJlZSB3aWxsIGhh
dmUgc3RhdGUgUXQ6Ok5vR2VzdHVyZSwKKyAgICAvLyBkdWUgdG8gbm90IG9yaWdpbmF0aW5nIGZy
b20gYSBHZXN0dXJlUmVjb2duaXplci4KKyAgICBpZiAoZ2VzdHVyZSAmJiAoZ2VzdHVyZS0+c3Rh
dGUoKSA9PSBRdDo6R2VzdHVyZVN0YXJ0ZWQgfHwgZ2VzdHVyZS0+c3RhdGUoKSA9PSBRdDo6Tm9H
ZXN0dXJlKSkgeworICAgICAgICBnZXN0dXJlRmFjYWRlLnR5cGUgPSBRdDo6VGFwR2VzdHVyZTsK
KyAgICAgICAgUVBvaW50RiBnbG9iYWxQb3MgPSBzdGF0aWNfY2FzdDxjb25zdCBRVGFwR2VzdHVy
ZSo+KGdlc3R1cmUpLT5wb3NpdGlvbigpOworICAgICAgICBnZXN0dXJlRmFjYWRlLmdsb2JhbFBv
cyA9IGdsb2JhbFBvcy50b1BvaW50KCk7CisgICAgICAgIGdlc3R1cmVGYWNhZGUucG9zID0gZXZl
bnQtPndpZGdldCgpLT5tYXBGcm9tR2xvYmFsKGdsb2JhbFBvcy50b1BvaW50KCkpOworICAgICAg
ICBmcmFtZS0+aGFuZGxlR2VzdHVyZUV2ZW50KCZnZXN0dXJlRmFjYWRlKTsKKyAgICAgICAgaGFu
ZGxlZCA9IHRydWU7CisgICAgfQorICAgIGdlc3R1cmUgPSBldmVudC0+Z2VzdHVyZShRdDo6VGFw
QW5kSG9sZEdlc3R1cmUpOworICAgIGlmIChnZXN0dXJlICYmIChnZXN0dXJlLT5zdGF0ZSgpID09
IFF0OjpHZXN0dXJlU3RhcnRlZCB8fCBnZXN0dXJlLT5zdGF0ZSgpID09IFF0OjpOb0dlc3R1cmUp
KSB7CisgICAgICAgIGdlc3R1cmVGYWNhZGUudHlwZSA9IFF0OjpUYXBBbmRIb2xkR2VzdHVyZTsK
KyAgICAgICAgUVBvaW50RiBnbG9iYWxQb3MgPSBzdGF0aWNfY2FzdDxjb25zdCBRVGFwQW5kSG9s
ZEdlc3R1cmUqPihnZXN0dXJlKS0+cG9zaXRpb24oKTsKKyAgICAgICAgZ2VzdHVyZUZhY2FkZS5n
bG9iYWxQb3MgPSBnbG9iYWxQb3MudG9Qb2ludCgpOworICAgICAgICBnZXN0dXJlRmFjYWRlLnBv
cyA9IGV2ZW50LT53aWRnZXQoKS0+bWFwRnJvbUdsb2JhbChnbG9iYWxQb3MudG9Qb2ludCgpKTsK
KyAgICAgICAgZnJhbWUtPmhhbmRsZUdlc3R1cmVFdmVudCgmZ2VzdHVyZUZhY2FkZSk7CisgICAg
ICAgIGhhbmRsZWQgPSB0cnVlOworICAgIH0KKyNlbmRpZiAvLyBFTkFCTEUoR0VTVFVSRV9FVkVO
VFMpCisKKyAgICBldmVudC0+c2V0QWNjZXB0ZWQoaGFuZGxlZCk7CisgICAgcmV0dXJuIGhhbmRs
ZWQ7Cit9CisKKy8qIQorICBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IHRoZSBpbnB1dCBtZXRob2Qg
dG8gcXVlcnkgYSBzZXQgb2YgcHJvcGVydGllcyBvZiB0aGUgcGFnZQorICB0byBiZSBhYmxlIHRv
IHN1cHBvcnQgY29tcGxleCBpbnB1dCBtZXRob2Qgb3BlcmF0aW9ucyBhcyBzdXBwb3J0IGZvciBz
dXJyb3VuZGluZworICB0ZXh0IGFuZCByZWNvbnZlcnNpb25zLgorCisgIFxhIHByb3BlcnR5IHNw
ZWNpZmllcyB3aGljaCBwcm9wZXJ0eSBpcyBxdWVyaWVkLgorCisgIFxzYSBRV2lkZ2V0OjppbnB1
dE1ldGhvZEV2ZW50KCksIFFJbnB1dE1ldGhvZEV2ZW50LCBRSW5wdXRDb250ZXh0CisqLworUVZh
cmlhbnQgUVdlYlBhZ2U6OmlucHV0TWV0aG9kUXVlcnkoUXQ6OklucHV0TWV0aG9kUXVlcnkgcHJv
cGVydHkpIGNvbnN0Cit7CisgICAgcmV0dXJuIGQtPmlucHV0TWV0aG9kUXVlcnkocHJvcGVydHkp
OworfQorCisvKiEKKyAgICBcaW50ZXJuYWwKKyovCit2b2lkIFFXZWJQYWdlUHJpdmF0ZTo6c2V0
SW5zcGVjdG9yKFFXZWJJbnNwZWN0b3IqIGluc3ApCit7CisgICAgaWYgKGluc3BlY3RvcikKKyAg
ICAgICAgaW5zcGVjdG9yLT5kLT5zZXRGcm9udGVuZCgwKTsKKworICAgIGluc3BlY3RvciA9IGlu
c3A7CisKKyAgICAvLyBHaXZlIGluc3BlY3RvciBmcm9udGVuZCB3ZWIgdmlldyBpZiBwcmV2aW91
c2x5IGNyZWF0ZWQKKyAgICBpZiAoaW5zcGVjdG9yICYmIGluc3BlY3RvckZyb250ZW5kKQorICAg
ICAgICBpbnNwZWN0b3ItPmQtPnNldEZyb250ZW5kKGluc3BlY3RvckZyb250ZW5kKTsKK30KKwor
LyohCisgICAgXGludGVybmFsCisgICAgUmV0dXJucyB0aGUgaW5zcGVjdG9yIGFuZCBjcmVhdGVz
IGl0IGlmIGl0IHdhc24ndCBjcmVhdGVkIHlldC4KKyAgICBUaGUgaW5zdGFuY2UgY3JlYXRlZCBo
ZXJlIHdpbGwgbm90IGJlIGF2YWlsYWJsZSB0aHJvdWdoIFFXZWJQYWdlJ3MgQVBJLgorKi8KK1FX
ZWJJbnNwZWN0b3IqIFFXZWJQYWdlUHJpdmF0ZTo6Z2V0T3JDcmVhdGVJbnNwZWN0b3IoKQorewor
I2lmIEVOQUJMRShJTlNQRUNUT1IpCisgICAgaWYgKCFpbnNwZWN0b3IpIHsKKyAgICAgICAgUVdl
Ykluc3BlY3RvciogaW5zcCA9IG5ldyBRV2ViSW5zcGVjdG9yOworICAgICAgICBpbnNwLT5zZXRQ
YWdlKHEpOworICAgICAgICBpbnNwZWN0b3JJc0ludGVybmFsT25seSA9IHRydWU7CisKKyAgICAg
ICAgUV9BU1NFUlQoaW5zcGVjdG9yKTsgLy8gQXNzb2NpYXRlZCB0aHJvdWdoIFFXZWJJbnNwZWN0
b3I6OnNldFBhZ2UocSkKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gaW5zcGVjdG9yOworfQor
CisvKiEKKyAgIFxlbnVtIFFXZWJQYWdlOjpGaW5kRmxhZworCisgICBUaGlzIGVudW0gZGVzY3Jp
YmVzIHRoZSBvcHRpb25zIGF2YWlsYWJsZSB0byB0aGUgZmluZFRleHQoKSBmdW5jdGlvbi4gVGhl
IG9wdGlvbnMKKyAgIGNhbiBiZSBPUi1lZCB0b2dldGhlciBmcm9tIHRoZSBmb2xsb3dpbmcgbGlz
dDoKKworICAgXHZhbHVlIEZpbmRCYWNrd2FyZCBTZWFyY2hlcyBiYWNrd2FyZHMgaW5zdGVhZCBv
ZiBmb3J3YXJkcy4KKyAgIFx2YWx1ZSBGaW5kQ2FzZVNlbnNpdGl2ZWx5IEJ5IGRlZmF1bHQgZmlu
ZFRleHQoKSB3b3JrcyBjYXNlIGluc2Vuc2l0aXZlLiBTcGVjaWZ5aW5nIHRoaXMgb3B0aW9uCisg
ICBjaGFuZ2VzIHRoZSBiZWhhdmlvdXIgdG8gYSBjYXNlIHNlbnNpdGl2ZSBmaW5kIG9wZXJhdGlv
bi4KKyAgIFx2YWx1ZSBGaW5kV3JhcHNBcm91bmREb2N1bWVudCBNYWtlcyBmaW5kVGV4dCgpIHJl
c3RhcnQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkb2N1bWVudCBpZiB0aGUgZW5kCisgICB3
YXMgcmVhY2hlZCBhbmQgdGhlIHRleHQgd2FzIG5vdCBmb3VuZC4KKyAgIFx2YWx1ZSBIaWdobGln
aHRBbGxPY2N1cnJlbmNlcyBIaWdobGlnaHRzIGFsbCBleGlzdGluZyBvY2N1cnJlbmNlcyBvZiBh
IHNwZWNpZmljIHN0cmluZy4KKyAgICAgICAoVGhpcyB2YWx1ZSB3YXMgaW50cm9kdWNlZCBpbiA0
LjYuKQorKi8KKworLyohCisgICAgXGVudW0gUVdlYlBhZ2U6OkxpbmtEZWxlZ2F0aW9uUG9saWN5
CisKKyAgICBUaGlzIGVudW0gZGVmaW5lcyB0aGUgZGVsZWdhdGlvbiBwb2xpY2llcyBhIHdlYnBh
Z2UgY2FuIGhhdmUgd2hlbiBhY3RpdmF0aW5nIGxpbmtzIGFuZCBlbWl0dGluZworICAgIHRoZSBs
aW5rQ2xpY2tlZCgpIHNpZ25hbC4KKworICAgIFx2YWx1ZSBEb250RGVsZWdhdGVMaW5rcyBObyBs
aW5rcyBhcmUgZGVsZWdhdGVkLiBJbnN0ZWFkLCBRV2ViUGFnZSB0cmllcyB0byBoYW5kbGUgdGhl
bSBhbGwuCisgICAgXHZhbHVlIERlbGVnYXRlRXh0ZXJuYWxMaW5rcyBXaGVuIGFjdGl2YXRpbmcg
bGlua3MgdGhhdCBwb2ludCB0byBkb2N1bWVudHMgbm90IHN0b3JlZCBvbiB0aGUKKyAgICBsb2Nh
bCBmaWxlc3lzdGVtIG9yIGFuIGVxdWl2YWxlbnQgLSBzdWNoIGFzIHRoZSBRdCByZXNvdXJjZSBz
eXN0ZW0gLSB0aGVuIGxpbmtDbGlja2VkKCkgaXMgZW1pdHRlZC4KKyAgICBcdmFsdWUgRGVsZWdh
dGVBbGxMaW5rcyBXaGVuZXZlciBhIGxpbmsgaXMgYWN0aXZhdGVkIHRoZSBsaW5rQ2xpY2tlZCgp
IHNpZ25hbCBpcyBlbWl0dGVkLgorCisgICAgXHNhIFFXZWJQYWdlOjpsaW5rRGVsZWdhdGlvblBv
bGljeQorKi8KKworLyohCisgICAgXGVudW0gUVdlYlBhZ2U6Ok5hdmlnYXRpb25UeXBlCisKKyAg
ICBUaGlzIGVudW0gZGVzY3JpYmVzIHRoZSB0eXBlcyBvZiBuYXZpZ2F0aW9uIGF2YWlsYWJsZSB3
aGVuIGJyb3dzaW5nIHRocm91Z2ggaHlwZXJsaW5rZWQKKyAgICBkb2N1bWVudHMuCisKKyAgICBc
dmFsdWUgTmF2aWdhdGlvblR5cGVMaW5rQ2xpY2tlZCBUaGUgdXNlciBjbGlja2VkIG9uIGEgbGlu
ayBvciBwcmVzc2VkIHJldHVybiBvbiBhIGZvY3VzZWQgbGluay4KKyAgICBcdmFsdWUgTmF2aWdh
dGlvblR5cGVGb3JtU3VibWl0dGVkIFRoZSB1c2VyIGFjdGl2YXRlZCBhIHN1Ym1pdCBidXR0b24g
Zm9yIGFuIEhUTUwgZm9ybS4KKyAgICBcdmFsdWUgTmF2aWdhdGlvblR5cGVCYWNrT3JGb3J3YXJk
IE5hdmlnYXRpb24gdG8gYSBwcmV2aW91c2x5IHNob3duIGRvY3VtZW50IGluIHRoZSBiYWNrIG9y
IGZvcndhcmQgaGlzdG9yeSBpcyByZXF1ZXN0ZWQuCisgICAgXHZhbHVlIE5hdmlnYXRpb25UeXBl
UmVsb2FkIFRoZSB1c2VyIGFjdGl2YXRlZCB0aGUgcmVsb2FkIGFjdGlvbi4KKyAgICBcdmFsdWUg
TmF2aWdhdGlvblR5cGVGb3JtUmVzdWJtaXR0ZWQgQW4gSFRNTCBmb3JtIHdhcyBzdWJtaXR0ZWQg
YSBzZWNvbmQgdGltZS4KKyAgICBcdmFsdWUgTmF2aWdhdGlvblR5cGVPdGhlciBBIG5hdmlnYXRp
b24gdG8gYW5vdGhlciBkb2N1bWVudCB1c2luZyBhIG1ldGhvZCBub3QgbGlzdGVkIGFib3ZlLgor
CisgICAgXHNhIGFjY2VwdE5hdmlnYXRpb25SZXF1ZXN0KCkKKyovCisKKy8qIQorICAgIFxlbnVt
IFFXZWJQYWdlOjpXZWJBY3Rpb24KKworICAgIFRoaXMgZW51bSBkZXNjcmliZXMgdGhlIHR5cGVz
IG9mIGFjdGlvbiB3aGljaCBjYW4gYmUgcGVyZm9ybWVkIG9uIHRoZSB3ZWIgcGFnZS4KKworICAg
IEFjdGlvbnMgb25seSBoYXZlIGFuIGVmZmVjdCB3aGVuIHRoZXkgYXJlIGFwcGxpY2FibGUuIFRo
ZSBhdmFpbGFiaWxpdHkgb2YKKyAgICBhY3Rpb25zIGNhbiBiZSBiZSBkZXRlcm1pbmVkIGJ5IGNo
ZWNraW5nIFxse1FBY3Rpb246On17aXNFbmFibGVkKCl9IG9uIHRoZQorICAgIGFjdGlvbiByZXR1
cm5lZCBieSBhY3Rpb24oKS4KKworICAgIE9uZSBtZXRob2Qgb2YgZW5hYmxpbmcgdGhlIHRleHQg
ZWRpdGluZywgY3Vyc29yIG1vdmVtZW50LCBhbmQgdGV4dCBzZWxlY3Rpb24gYWN0aW9ucworICAg
IGlzIGJ5IHNldHRpbmcgXGwgY29udGVudEVkaXRhYmxlIHRvIHRydWUuCisKKyAgICBcdmFsdWUg
Tm9XZWJBY3Rpb24gTm8gYWN0aW9uIGlzIHRyaWdnZXJlZC4KKyAgICBcdmFsdWUgT3Blbkxpbmsg
T3BlbiB0aGUgY3VycmVudCBsaW5rLgorICAgIFx2YWx1ZSBPcGVuTGlua0luTmV3V2luZG93IE9w
ZW4gdGhlIGN1cnJlbnQgbGluayBpbiBhIG5ldyB3aW5kb3cuCisgICAgXHZhbHVlIE9wZW5MaW5r
SW5UaGlzV2luZG93IE9wZW4gdGhlIGN1cnJlbnQgbGluayB3aXRob3V0IG9wZW5pbmcgYSBuZXcg
d2luZG93LiBVc2VkIG9uIGxpbmtzIHRoYXQgd291bGQgZGVmYXVsdCB0byBvcGVuaW5nIGluIGFu
b3RoZXIgZnJhbWUgb3IgYSBuZXcgd2luZG93LiAoQWRkZWQgaW4gUXQgNS4wKQorICAgIFx2YWx1
ZSBPcGVuRnJhbWVJbk5ld1dpbmRvdyBSZXBsaWNhdGUgdGhlIGN1cnJlbnQgZnJhbWUgaW4gYSBu
ZXcgd2luZG93LgorICAgIFx2YWx1ZSBEb3dubG9hZExpbmtUb0Rpc2sgRG93bmxvYWQgdGhlIGN1
cnJlbnQgbGluayB0byB0aGUgZGlzay4KKyAgICBcdmFsdWUgQ29weUxpbmtUb0NsaXBib2FyZCBD
b3B5IHRoZSBjdXJyZW50IGxpbmsgdG8gdGhlIGNsaXBib2FyZC4KKyAgICBcdmFsdWUgT3Blbklt
YWdlSW5OZXdXaW5kb3cgT3BlbiB0aGUgaGlnaGxpZ2h0ZWQgaW1hZ2UgaW4gYSBuZXcgd2luZG93
LgorICAgIFx2YWx1ZSBEb3dubG9hZEltYWdlVG9EaXNrIERvd25sb2FkIHRoZSBoaWdobGlnaHRl
ZCBpbWFnZSB0byB0aGUgZGlzay4KKyAgICBcdmFsdWUgQ29weUltYWdlVG9DbGlwYm9hcmQgQ29w
eSB0aGUgaGlnaGxpZ2h0ZWQgaW1hZ2UgdG8gdGhlIGNsaXBib2FyZC4gIChBZGRlZCBpbiBRdCA0
LjgpCisgICAgXHZhbHVlIENvcHlJbWFnZVVybFRvQ2xpcGJvYXJkIENvcHkgdGhlIGhpZ2hsaWdo
dGVkIGltYWdlJ3MgVVJMIHRvIHRoZSBjbGlwYm9hcmQuCisgICAgXHZhbHVlIEJhY2sgTmF2aWdh
dGUgYmFjayBpbiB0aGUgaGlzdG9yeSBvZiBuYXZpZ2F0ZWQgbGlua3MuCisgICAgXHZhbHVlIEZv
cndhcmQgTmF2aWdhdGUgZm9yd2FyZCBpbiB0aGUgaGlzdG9yeSBvZiBuYXZpZ2F0ZWQgbGlua3Mu
CisgICAgXHZhbHVlIFN0b3AgU3RvcCBsb2FkaW5nIHRoZSBjdXJyZW50IHBhZ2UuCisgICAgXHZh
bHVlIFN0b3BTY2hlZHVsZWRQYWdlUmVmcmVzaCBTdG9wIGFsbCBwZW5kaW5nIHBhZ2UgcmVmcmVz
aC9yZWRpcmVjdCByZXF1ZXN0cy4gIChBZGRlZCBpbiBRdCA0LjcpCisgICAgXHZhbHVlIFJlbG9h
ZCBSZWxvYWQgdGhlIGN1cnJlbnQgcGFnZS4KKyAgICBcdmFsdWUgUmVsb2FkQW5kQnlwYXNzQ2Fj
aGUgUmVsb2FkIHRoZSBjdXJyZW50IHBhZ2UsIGJ1dCBkbyBub3QgdXNlIGFueSBsb2NhbCBjYWNo
ZS4gKEFkZGVkIGluIFF0IDQuNikKKyAgICBcdmFsdWUgQ3V0IEN1dCB0aGUgY29udGVudCBjdXJy
ZW50bHkgc2VsZWN0ZWQgaW50byB0aGUgY2xpcGJvYXJkLgorICAgIFx2YWx1ZSBDb3B5IENvcHkg
dGhlIGNvbnRlbnQgY3VycmVudGx5IHNlbGVjdGVkIGludG8gdGhlIGNsaXBib2FyZC4KKyAgICBc
dmFsdWUgUGFzdGUgUGFzdGUgY29udGVudCBmcm9tIHRoZSBjbGlwYm9hcmQuCisgICAgXHZhbHVl
IFVuZG8gVW5kbyB0aGUgbGFzdCBlZGl0aW5nIGFjdGlvbi4KKyAgICBcdmFsdWUgUmVkbyBSZWRv
IHRoZSBsYXN0IGVkaXRpbmcgYWN0aW9uLgorICAgIFx2YWx1ZSBNb3ZlVG9OZXh0Q2hhciBNb3Zl
IHRoZSBjdXJzb3IgdG8gdGhlIG5leHQgY2hhcmFjdGVyLgorICAgIFx2YWx1ZSBNb3ZlVG9QcmV2
aW91c0NoYXIgTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBwcmV2aW91cyBjaGFyYWN0ZXIuCisgICAg
XHZhbHVlIE1vdmVUb05leHRXb3JkIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgbmV4dCB3b3JkLgor
ICAgIFx2YWx1ZSBNb3ZlVG9QcmV2aW91c1dvcmQgTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBwcmV2
aW91cyB3b3JkLgorICAgIFx2YWx1ZSBNb3ZlVG9OZXh0TGluZSBNb3ZlIHRoZSBjdXJzb3IgdG8g
dGhlIG5leHQgbGluZS4KKyAgICBcdmFsdWUgTW92ZVRvUHJldmlvdXNMaW5lIE1vdmUgdGhlIGN1
cnNvciB0byB0aGUgcHJldmlvdXMgbGluZS4KKyAgICBcdmFsdWUgTW92ZVRvU3RhcnRPZkxpbmUg
TW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZS4KKyAgICBcdmFsdWUgTW92
ZVRvRW5kT2ZMaW5lIE1vdmUgdGhlIGN1cnNvciB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLgorICAg
IFx2YWx1ZSBNb3ZlVG9TdGFydE9mQmxvY2sgTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBzdGFydCBv
ZiB0aGUgYmxvY2suCisgICAgXHZhbHVlIE1vdmVUb0VuZE9mQmxvY2sgTW92ZSB0aGUgY3Vyc29y
IHRvIHRoZSBlbmQgb2YgdGhlIGJsb2NrLgorICAgIFx2YWx1ZSBNb3ZlVG9TdGFydE9mRG9jdW1l
bnQgTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBzdGFydCBvZiB0aGUgZG9jdW1lbnQuCisgICAgXHZh
bHVlIE1vdmVUb0VuZE9mRG9jdW1lbnQgTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBlbmQgb2YgdGhl
IGRvY3VtZW50LgorICAgIFx2YWx1ZSBTZWxlY3ROZXh0Q2hhciBTZWxlY3QgdG8gdGhlIG5leHQg
Y2hhcmFjdGVyLgorICAgIFx2YWx1ZSBTZWxlY3RQcmV2aW91c0NoYXIgU2VsZWN0IHRvIHRoZSBw
cmV2aW91cyBjaGFyYWN0ZXIuCisgICAgXHZhbHVlIFNlbGVjdE5leHRXb3JkIFNlbGVjdCB0byB0
aGUgbmV4dCB3b3JkLgorICAgIFx2YWx1ZSBTZWxlY3RQcmV2aW91c1dvcmQgU2VsZWN0IHRvIHRo
ZSBwcmV2aW91cyB3b3JkLgorICAgIFx2YWx1ZSBTZWxlY3ROZXh0TGluZSBTZWxlY3QgdG8gdGhl
IG5leHQgbGluZS4KKyAgICBcdmFsdWUgU2VsZWN0UHJldmlvdXNMaW5lIFNlbGVjdCB0byB0aGUg
cHJldmlvdXMgbGluZS4KKyAgICBcdmFsdWUgU2VsZWN0U3RhcnRPZkxpbmUgU2VsZWN0IHRvIHRo
ZSBzdGFydCBvZiB0aGUgbGluZS4KKyAgICBcdmFsdWUgU2VsZWN0RW5kT2ZMaW5lIFNlbGVjdCB0
byB0aGUgZW5kIG9mIHRoZSBsaW5lLgorICAgIFx2YWx1ZSBTZWxlY3RTdGFydE9mQmxvY2sgU2Vs
ZWN0IHRvIHRoZSBzdGFydCBvZiB0aGUgYmxvY2suCisgICAgXHZhbHVlIFNlbGVjdEVuZE9mQmxv
Y2sgU2VsZWN0IHRvIHRoZSBlbmQgb2YgdGhlIGJsb2NrLgorICAgIFx2YWx1ZSBTZWxlY3RTdGFy
dE9mRG9jdW1lbnQgU2VsZWN0IHRvIHRoZSBzdGFydCBvZiB0aGUgZG9jdW1lbnQuCisgICAgXHZh
bHVlIFNlbGVjdEVuZE9mRG9jdW1lbnQgU2VsZWN0IHRvIHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50
LgorICAgIFx2YWx1ZSBEZWxldGVTdGFydE9mV29yZCBEZWxldGUgdG8gdGhlIHN0YXJ0IG9mIHRo
ZSB3b3JkLgorICAgIFx2YWx1ZSBEZWxldGVFbmRPZldvcmQgRGVsZXRlIHRvIHRoZSBlbmQgb2Yg
dGhlIHdvcmQuCisgICAgXHZhbHVlIFNldFRleHREaXJlY3Rpb25EZWZhdWx0IFNldCB0aGUgdGV4
dCBkaXJlY3Rpb24gdG8gdGhlIGRlZmF1bHQgZGlyZWN0aW9uLgorICAgIFx2YWx1ZSBTZXRUZXh0
RGlyZWN0aW9uTGVmdFRvUmlnaHQgU2V0IHRoZSB0ZXh0IGRpcmVjdGlvbiB0byBsZWZ0LXRvLXJp
Z2h0LgorICAgIFx2YWx1ZSBTZXRUZXh0RGlyZWN0aW9uUmlnaHRUb0xlZnQgU2V0IHRoZSB0ZXh0
IGRpcmVjdGlvbiB0byByaWdodC10by1sZWZ0LgorICAgIFx2YWx1ZSBUb2dnbGVCb2xkIFRvZ2ds
ZSB0aGUgZm9ybWF0dGluZyBiZXR3ZWVuIGJvbGQgYW5kIG5vcm1hbCB3ZWlnaHQuCisgICAgXHZh
bHVlIFRvZ2dsZUl0YWxpYyBUb2dnbGUgdGhlIGZvcm1hdHRpbmcgYmV0d2VlbiBpdGFsaWMgYW5k
IG5vcm1hbCBzdHlsZS4KKyAgICBcdmFsdWUgVG9nZ2xlVW5kZXJsaW5lIFRvZ2dsZSB1bmRlcmxp
bmluZy4KKyAgICBcdmFsdWUgSW5zcGVjdEVsZW1lbnQgU2hvdyB0aGUgV2ViIEluc3BlY3RvciB3
aXRoIHRoZSBjdXJyZW50bHkgaGlnaGxpZ2h0ZWQgSFRNTCBlbGVtZW50LgorICAgIFx2YWx1ZSBJ
bnNlcnRQYXJhZ3JhcGhTZXBhcmF0b3IgSW5zZXJ0IGEgbmV3IHBhcmFncmFwaC4KKyAgICBcdmFs
dWUgSW5zZXJ0TGluZVNlcGFyYXRvciBJbnNlcnQgYSBuZXcgbGluZS4KKyAgICBcdmFsdWUgU2Vs
ZWN0QWxsIFNlbGVjdHMgYWxsIGNvbnRlbnQuCisgICAgXHZhbHVlIFBhc3RlQW5kTWF0Y2hTdHls
ZSBQYXN0ZSBjb250ZW50IGZyb20gdGhlIGNsaXBib2FyZCB3aXRoIGN1cnJlbnQgc3R5bGUuIChB
ZGRlZCBpbiBRdCA0LjYpCisgICAgXHZhbHVlIFJlbW92ZUZvcm1hdCBSZW1vdmVzIGZvcm1hdHRp
bmcgYW5kIHN0eWxlLiAoQWRkZWQgaW4gUXQgNC42KQorICAgIFx2YWx1ZSBUb2dnbGVTdHJpa2V0
aHJvdWdoIFRvZ2dsZSB0aGUgZm9ybWF0dGluZyBiZXR3ZWVuIHN0cmlrZXRocm91Z2ggYW5kIG5v
cm1hbCBzdHlsZS4gKEFkZGVkIGluIFF0IDQuNikKKyAgICBcdmFsdWUgVG9nZ2xlU3Vic2NyaXB0
IFRvZ2dsZSB0aGUgZm9ybWF0dGluZyBiZXR3ZWVuIHN1YnNjcmlwdCBhbmQgYmFzZWxpbmUuIChB
ZGRlZCBpbiBRdCA0LjYpCisgICAgXHZhbHVlIFRvZ2dsZVN1cGVyc2NyaXB0IFRvZ2dsZSB0aGUg
Zm9ybWF0dGluZyBiZXR3ZWVuIHN1cGVyY3JpcHQgYW5kIGJhc2VsaW5lLiAoQWRkZWQgaW4gUXQg
NC42KQorICAgIFx2YWx1ZSBJbnNlcnRVbm9yZGVyZWRMaXN0IFRvZ2dsZXMgdGhlIHNlbGVjdGlv
biBiZXR3ZWVuIGFuIG9yZGVyZWQgbGlzdCBhbmQgYSBub3JtYWwgYmxvY2suIChBZGRlZCBpbiBR
dCA0LjYpCisgICAgXHZhbHVlIEluc2VydE9yZGVyZWRMaXN0IFRvZ2dsZXMgdGhlIHNlbGVjdGlv
biBiZXR3ZWVuIGFuIG9yZGVyZWQgbGlzdCBhbmQgYSBub3JtYWwgYmxvY2suIChBZGRlZCBpbiBR
dCA0LjYpCisgICAgXHZhbHVlIEluZGVudCBJbmNyZWFzZXMgdGhlIGluZGVudGF0aW9uIG9mIHRo
ZSBjdXJyZW50bHkgc2VsZWN0ZWQgZm9ybWF0IGJsb2NrIGJ5IG9uZSBpbmNyZW1lbnQuIChBZGRl
ZCBpbiBRdCA0LjYpCisgICAgXHZhbHVlIE91dGRlbnQgRGVjcmVhc2VzIHRoZSBpbmRlbnRhdGlv
biBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGZvcm1hdCBibG9jayBieSBvbmUgaW5jcmVtZW50
LiAoQWRkZWQgaW4gUXQgNC42KQorICAgIFx2YWx1ZSBBbGlnbkNlbnRlciBBcHBsaWVzIGNlbnRl
ciBhbGlnbm1lbnQgdG8gY29udGVudC4gKEFkZGVkIGluIFF0IDQuNikKKyAgICBcdmFsdWUgQWxp
Z25KdXN0aWZpZWQgQXBwbGllcyBmdWxsIGp1c3RpZmljYXRpb24gdG8gY29udGVudC4gKEFkZGVk
IGluIFF0IDQuNikKKyAgICBcdmFsdWUgQWxpZ25MZWZ0IEFwcGxpZXMgbGVmdCBqdXN0aWZpY2F0
aW9uIHRvIGNvbnRlbnQuIChBZGRlZCBpbiBRdCA0LjYpCisgICAgXHZhbHVlIEFsaWduUmlnaHQg
QXBwbGllcyByaWdodCBqdXN0aWZpY2F0aW9uIHRvIGNvbnRlbnQuIChBZGRlZCBpbiBRdCA0LjYp
CisKKworICAgIFxvbWl0dmFsdWUgV2ViQWN0aW9uQ291bnQKKworKi8KKworLyohCisgICAgXGVu
dW0gUVdlYlBhZ2U6OldlYldpbmRvd1R5cGUKKworICAgIFRoaXMgZW51bSBkZXNjcmliZXMgdGhl
IHR5cGVzIG9mIHdpbmRvdyB0aGF0IGNhbiBiZSBjcmVhdGVkIGJ5IHRoZSBjcmVhdGVXaW5kb3co
KSBmdW5jdGlvbi4KKworICAgIFx2YWx1ZSBXZWJCcm93c2VyV2luZG93IFRoZSB3aW5kb3cgaXMg
YSByZWd1bGFyIHdlYiBicm93c2VyIHdpbmRvdy4KKyAgICBcdmFsdWUgV2ViTW9kYWxEaWFsb2cg
VGhlIHdpbmRvdyBhY3RzIGFzIG1vZGFsIGRpYWxvZy4KKyovCisKKworLyohCisgICAgXGNsYXNz
IFFXZWJQYWdlOjpWaWV3cG9ydEF0dHJpYnV0ZXMKKyAgICBcc2luY2UgNC43CisgICAgXGJyaWVm
IFRoZSBRV2ViUGFnZTo6Vmlld3BvcnRBdHRyaWJ1dGVzIGNsYXNzIGRlc2NyaWJlcyBoaW50cyB0
aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGEgdmlld3BvcnQuCisKKyAgICBRV2ViUGFnZTo6Vmlld3Bv
cnRBdHRyaWJ1dGVzIHByb3ZpZGVzIGEgZGVzY3JpcHRpb24gb2YgYSB2aWV3cG9ydCwgc3VjaCBh
cyB2aWV3cG9ydCBnZW9tZXRyeSwKKyAgICBpbml0aWFsIHNjYWxlIGZhY3RvciB3aXRoIGxpbWl0
cywgcGx1cyBpbmZvcm1hdGlvbiBhYm91dCB3aGV0aGVyIGEgdXNlciBzaG91bGQgYmUgYWJsZQor
ICAgIHRvIHNjYWxlIHRoZSBjb250ZW50cyBpbiB0aGUgdmlld3BvcnQgb3Igbm90LCBpZS4gYnkg
em9vbWluZy4KKworICAgIFZpZXdwb3J0QXR0cmlidXRlcyBjYW4gYmUgc2V0IGJ5IGEgd2ViIGF1
dGhvciB1c2luZyB0aGUgdmlld3BvcnQgbWV0YSB0YWcgZXh0ZW5zaW9uLCBkb2N1bWVudGVkCisg
ICAgYXQgXGx7aHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vc2FmYXJpL2xpYnJhcnkvZG9jdW1l
bnRhdGlvbi9hcHBsZWFwcGxpY2F0aW9ucy9yZWZlcmVuY2Uvc2FmYXJpd2ViY29udGVudC91c2lu
Z3RoZXZpZXdwb3J0L3VzaW5ndGhldmlld3BvcnQuaHRtbH17U2FmYXJpIFJlZmVyZW5jZSBMaWJy
YXJ5OiBVc2luZyB0aGUgVmlld3BvcnQgTWV0YSBUYWd9LgorCisgICAgQWxsIHZhbHVlcyBtaWdo
dCBub3QgYmUgc2V0LCBhcyBzdWNoIHdoZW4gZGVhbGluZyB3aXRoIHRoZSBoaW50cywgdGhlIGRl
dmVsb3BlciBuZWVkcyB0bworICAgIGNoZWNrIHdoZXRoZXIgdGhlIHZhbHVlcyBhcmUgdmFsaWQu
IE5lZ2F0aXZlIHZhbHVlcyBkZW5vdGUgYW4gaW52YWxpZCBxcmVhbCB2YWx1ZS4KKworICAgIFxp
bm1vZHVsZSBRdFdlYktpdAorKi8KKworLyohCisgICAgQ29uc3RydWN0cyBhbiBlbXB0eSBRV2Vi
UGFnZTo6Vmlld3BvcnRBdHRyaWJ1dGVzLgorKi8KK1FXZWJQYWdlOjpWaWV3cG9ydEF0dHJpYnV0
ZXM6OlZpZXdwb3J0QXR0cmlidXRlcygpCisgICAgOiBkKDApCisgICAgLCBtX2luaXRpYWxTY2Fs
ZUZhY3RvcigtMS4wKQorICAgICwgbV9taW5pbXVtU2NhbGVGYWN0b3IoLTEuMCkKKyAgICAsIG1f
bWF4aW11bVNjYWxlRmFjdG9yKC0xLjApCisgICAgLCBtX2RldmljZVBpeGVsUmF0aW8oLTEuMCkK
KyAgICAsIG1faXNVc2VyU2NhbGFibGUodHJ1ZSkKKyAgICAsIG1faXNWYWxpZChmYWxzZSkKK3sK
KworfQorCisvKiEKKyAgICBDb25zdHJ1Y3RzIGEgUVdlYlBhZ2U6OlZpZXdwb3J0QXR0cmlidXRl
cyB3aGljaCBpcyBhIGNvcHkgZnJvbSBcYSBvdGhlciAuCisqLworUVdlYlBhZ2U6OlZpZXdwb3J0
QXR0cmlidXRlczo6Vmlld3BvcnRBdHRyaWJ1dGVzKGNvbnN0IFFXZWJQYWdlOjpWaWV3cG9ydEF0
dHJpYnV0ZXMmIG90aGVyKQorICAgIDogZChvdGhlci5kKQorICAgICwgbV9pbml0aWFsU2NhbGVG
YWN0b3Iob3RoZXIubV9pbml0aWFsU2NhbGVGYWN0b3IpCisgICAgLCBtX21pbmltdW1TY2FsZUZh
Y3RvcihvdGhlci5tX21pbmltdW1TY2FsZUZhY3RvcikKKyAgICAsIG1fbWF4aW11bVNjYWxlRmFj
dG9yKG90aGVyLm1fbWF4aW11bVNjYWxlRmFjdG9yKQorICAgICwgbV9kZXZpY2VQaXhlbFJhdGlv
KG90aGVyLm1fZGV2aWNlUGl4ZWxSYXRpbykKKyAgICAsIG1faXNVc2VyU2NhbGFibGUob3RoZXIu
bV9pc1VzZXJTY2FsYWJsZSkKKyAgICAsIG1faXNWYWxpZChvdGhlci5tX2lzVmFsaWQpCisgICAg
LCBtX3NpemUob3RoZXIubV9zaXplKQoreworCit9CisKKy8qIQorICAgIERlc3Ryb3lzIHRoZSBR
V2ViUGFnZTo6Vmlld3BvcnRBdHRyaWJ1dGVzLgorKi8KK1FXZWJQYWdlOjpWaWV3cG9ydEF0dHJp
YnV0ZXM6On5WaWV3cG9ydEF0dHJpYnV0ZXMoKQoreworCit9CisKKy8qIQorICAgIEFzc2lnbnMg
dGhlIGdpdmVuIFFXZWJQYWdlOjpWaWV3cG9ydEF0dHJpYnV0ZXMgdG8gdGhpcyB2aWV3cG9ydCBo
aW50cyBhbmQgcmV0dXJucyBhCisgICAgcmVmZXJlbmNlIHRvIHRoaXMuCisqLworUVdlYlBhZ2U6
OlZpZXdwb3J0QXR0cmlidXRlcyYgUVdlYlBhZ2U6OlZpZXdwb3J0QXR0cmlidXRlczo6b3BlcmF0
b3I9KGNvbnN0IFFXZWJQYWdlOjpWaWV3cG9ydEF0dHJpYnV0ZXMmIG90aGVyKQoreworICAgIGlm
ICh0aGlzICE9ICZvdGhlcikgeworICAgICAgICBkID0gb3RoZXIuZDsKKyAgICAgICAgbV9pbml0
aWFsU2NhbGVGYWN0b3IgPSBvdGhlci5tX2luaXRpYWxTY2FsZUZhY3RvcjsKKyAgICAgICAgbV9t
aW5pbXVtU2NhbGVGYWN0b3IgPSBvdGhlci5tX21pbmltdW1TY2FsZUZhY3RvcjsKKyAgICAgICAg
bV9tYXhpbXVtU2NhbGVGYWN0b3IgPSBvdGhlci5tX21heGltdW1TY2FsZUZhY3RvcjsKKyAgICAg
ICAgbV9pc1VzZXJTY2FsYWJsZSA9IG90aGVyLm1faXNVc2VyU2NhbGFibGU7CisgICAgICAgIG1f
aXNWYWxpZCA9IG90aGVyLm1faXNWYWxpZDsKKyAgICAgICAgbV9zaXplID0gb3RoZXIubV9zaXpl
OworICAgIH0KKworICAgIHJldHVybiAqdGhpczsKK30KKworLyohIFxmbiBpbmxpbmUgYm9vbCBR
V2ViUGFnZTo6Vmlld3BvcnRBdHRyaWJ1dGVzOjppc1ZhbGlkKCkgY29uc3QKKyAgICBSZXR1cm5z
IHdoZXRoZXIgdGhpcyBpcyBhIHZhbGlkIFZpZXdwb3J0QXR0cmlidXRlcyBvciBub3QuCisKKyAg
ICBBbiBpbnZhbGlkIFZpZXdwb3J0QXR0cmlidXRlcyB3aWxsIGhhdmUgYW4gZW1wdHkgUVNpemUs
IG5lZ2F0aXZlIHZhbHVlcyBmb3Igc2NhbGUgZmFjdG9ycyBhbmQKKyAgICB0cnVlIGZvciB0aGUg
Ym9vbGVhbiBpc1VzZXJTY2FsYWJsZS4KKyovCisKKy8qISBcZm4gaW5saW5lIFFTaXplIFFXZWJQ
YWdlOjpWaWV3cG9ydEF0dHJpYnV0ZXM6OnNpemUoKSBjb25zdAorICAgIFJldHVybnMgdGhlIHNp
emUgb2YgdGhlIHZpZXdwb3J0LgorKi8KKworLyohIFxmbiBpbmxpbmUgcXJlYWwgUVdlYlBhZ2U6
OlZpZXdwb3J0QXR0cmlidXRlczo6aW5pdGlhbFNjYWxlRmFjdG9yKCkgY29uc3QKKyAgICBSZXR1
cm5zIHRoZSBpbml0aWFsIHNjYWxlIG9mIHRoZSB2aWV3cG9ydCBhcyBhIG11bHRpcGxpZXIuCisq
LworCisvKiEgXGZuIGlubGluZSBxcmVhbCBRV2ViUGFnZTo6Vmlld3BvcnRBdHRyaWJ1dGVzOjpt
aW5pbXVtU2NhbGVGYWN0b3IoKSBjb25zdAorICAgIFJldHVybnMgdGhlIG1pbmltdW0gc2NhbGUg
dmFsdWUgb2YgdGhlIHZpZXdwb3J0IGFzIGEgbXVsdGlwbGllci4KKyovCisKKy8qISBcZm4gaW5s
aW5lIHFyZWFsIFFXZWJQYWdlOjpWaWV3cG9ydEF0dHJpYnV0ZXM6Om1heGltdW1TY2FsZUZhY3Rv
cigpIGNvbnN0CisgICAgUmV0dXJucyB0aGUgbWF4aW11bSBzY2FsZSB2YWx1ZSBvZiB0aGUgdmll
d3BvcnQgYXMgYSBtdWx0aXBsaWVyLgorKi8KKworLyohIFxmbiBpbmxpbmUgYm9vbCBRV2ViUGFn
ZTo6Vmlld3BvcnRBdHRyaWJ1dGVzOjppc1VzZXJTY2FsYWJsZSgpIGNvbnN0CisgICAgRGV0ZXJt
aW5lcyB3aGV0aGVyIG9yIG5vdCB0aGUgc2NhbGUgY2FuIGJlIG1vZGlmaWVkIGJ5IHRoZSB1c2Vy
LgorKi8KKworCisvKiEKKyAgICBcY2xhc3MgUVdlYlBhZ2UKKyAgICBcc2luY2UgNC40CisgICAg
XGJyaWVmIFRoZSBRV2ViUGFnZSBjbGFzcyBwcm92aWRlcyBhbiBvYmplY3QgdG8gdmlldyBhbmQg
ZWRpdCB3ZWIgZG9jdW1lbnRzLgorCisgICAgXGlubW9kdWxlIFF0V2ViS2l0CisKKyAgICBRV2Vi
UGFnZSBob2xkcyBhIG1haW4gZnJhbWUgcmVzcG9uc2libGUgZm9yIHdlYiBjb250ZW50LCBzZXR0
aW5ncywgdGhlIGhpc3RvcnkKKyAgICBvZiBuYXZpZ2F0ZWQgbGlua3MgYW5kIGFjdGlvbnMuIFRo
aXMgY2xhc3MgY2FuIGJlIHVzZWQsIHRvZ2V0aGVyIHdpdGggUVdlYkZyYW1lLAorICAgIHRvIHBy
b3ZpZGUgZnVuY3Rpb25hbGl0eSBsaWtlIFFXZWJWaWV3IGluIGEgd2lkZ2V0LWxlc3MgZW52aXJv
bm1lbnQuCisKKyAgICBRV2ViUGFnZSdzIEFQSSBpcyB2ZXJ5IHNpbWlsYXIgdG8gUVdlYlZpZXcs
IGFzIHlvdSBhcmUgc3RpbGwgcHJvdmlkZWQgd2l0aAorICAgIGNvbW1vbiBmdW5jdGlvbnMgbGlr
ZSBhY3Rpb24oKSAoa25vd24gYXMKKyAgICBcbHtRV2ViVmlldzo6cGFnZUFjdGlvbigpfXtwYWdl
QWN0aW9ufSgpIGluIFFXZWJWaWV3KSwgdHJpZ2dlckFjdGlvbigpLAorICAgIGZpbmRUZXh0KCkg
YW5kIHNldHRpbmdzKCkuIE1vcmUgUVdlYlZpZXctbGlrZSBmdW5jdGlvbnMgY2FuIGJlIGZvdW5k
IGluIHRoZQorICAgIG1haW4gZnJhbWUgb2YgUVdlYlBhZ2UsIG9idGFpbmVkIHZpYSB0aGUgbWFp
bkZyYW1lKCkgZnVuY3Rpb24uIEZvciBleGFtcGxlLAorICAgIHRoZSBcbHtRV2ViRnJhbWU6Omxv
YWQoKX17bG9hZH0oKSwgXGx7UVdlYkZyYW1lOjpzZXRVcmwoKX17c2V0VXJsfSgpIGFuZAorICAg
IFxse1FXZWJGcmFtZTo6c2V0SHRtbCgpfXtzZXRIdG1sfSgpIGZ1bmN0aW9ucyBmb3IgUVdlYlBh
Z2UgY2FuIGJlIGFjY2Vzc2VkCisgICAgdXNpbmcgUVdlYkZyYW1lLgorCisgICAgVGhlIGxvYWRT
dGFydGVkKCkgc2lnbmFsIGlzIGVtaXR0ZWQgd2hlbiB0aGUgcGFnZSBiZWdpbnMgdG8gbG9hZC5U
aGUKKyAgICBsb2FkUHJvZ3Jlc3MoKSBzaWduYWwsIG9uIHRoZSBvdGhlciBoYW5kLCBpcyBlbWl0
dGVkIHdoZW5ldmVyIGFuIGVsZW1lbnQKKyAgICBvZiB0aGUgd2ViIHBhZ2UgY29tcGxldGVzIGxv
YWRpbmcsIHN1Y2ggYXMgYW4gZW1iZWRkZWQgaW1hZ2UsIGEgc2NyaXB0LAorICAgIGV0Yy4gRmlu
YWxseSwgdGhlIGxvYWRGaW5pc2hlZCgpIHNpZ25hbCBpcyBlbWl0dGVkIHdoZW4gdGhlIHBhZ2Ug
Y29udGVudHMKKyAgICBhcmUgbG9hZGVkIGNvbXBsZXRlbHksIGluZGVwZW5kZW50IG9mIHNjcmlw
dCBleGVjdXRpb24gb3IgcGFnZSByZW5kZXJpbmcuCisgICAgSXRzIGFyZ3VtZW50LCBlaXRoZXIg
dHJ1ZSBvciBmYWxzZSwgaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBsb2FkCisgICAgb3Bl
cmF0aW9uIHN1Y2NlZWRlZC4KKworICAgIFxzZWN0aW9uMSBVc2luZyBRV2ViUGFnZSBpbiBhIFdp
ZGdldC1sZXNzIEVudmlyb25tZW50CisKKyAgICBCZWZvcmUgeW91IGJlZ2luIHBhaW50aW5nIGEg
UVdlYlBhZ2Ugb2JqZWN0LCB5b3UgbmVlZCB0byBzZXQgdGhlIHNpemUgb2YKKyAgICB0aGUgdmll
d3BvcnQgYnkgY2FsbGluZyBzZXRWaWV3cG9ydFNpemUoKS4gVGhlbiwgeW91IGludm9rZSB0aGUg
bWFpbgorICAgIGZyYW1lJ3MgcmVuZGVyIGZ1bmN0aW9uIChRV2ViRnJhbWU6OnJlbmRlcigpKS4g
QW4gZXhhbXBsZSBvZiB0aGlzCisgICAgaXMgc2hvd24gaW4gdGhlIGNvZGUgc25pcHBldCBiZWxv
dy4KKworICAgIFN1cHBvc2Ugd2UgaGF2ZSBhIFxjIFRodW1ibmFpbCBjbGFzcyBhcyBmb2xsb3dz
OgorCisgICAgXHNuaXBwZXQgd2Via2l0c25pcHBldHMvd2VicGFnZS9tYWluLmNwcCAwCisKKyAg
ICBUaGUgXGMgVGh1bWJuYWlsJ3MgY29uc3RydWN0b3IgdGFrZXMgaW4gYSBcYSB1cmwuIFdlIGNv
bm5lY3Qgb3VyIFFXZWJQYWdlCisgICAgb2JqZWN0J3MgXGx7UVdlYlBhZ2U6On17bG9hZEZpbmlz
aGVkKCl9IHNpZ25hbCB0byBvdXIgcHJpdmF0ZSBzbG90LAorICAgIFxjIHJlbmRlcigpLgorCisg
ICAgXHNuaXBwZXQgd2Via2l0c25pcHBldHMvd2VicGFnZS9tYWluLmNwcCAxCisKKyAgICBUaGUg
XGMgcmVuZGVyKCkgZnVuY3Rpb24gc2hvd3MgaG93IHdlIGNhbiBwYWludCBhIHRodW1ibmFpbCB1
c2luZyBhCisgICAgUVdlYlBhZ2Ugb2JqZWN0LgorCisgICAgXHNuaXBwZXQgd2Via2l0c25pcHBl
dHMvd2VicGFnZS9tYWluLmNwcCAyCisKKyAgICBXZSBiZWdpbiBieSBzZXR0aW5nIHRoZSBcbHtR
V2ViUGFnZTo6dmlld3BvcnRTaXplKCl9e3ZpZXdwb3J0U2l6ZX0gYW5kCisgICAgdGhlbiB3ZSBp
bnN0YW50aWF0ZSBhIFFJbWFnZSBvYmplY3QsIFxjIGltYWdlLCB3aXRoIHRoZSBzYW1lIHNpemUg
YXMgb3VyCisgICAgXGx7UVdlYlBhZ2U6OnZpZXdwb3J0U2l6ZSgpfXt2aWV3cG9ydFNpemV9LiBU
aGlzIGltYWdlIGlzIHRoZW4gc2VudAorICAgIGFzIGEgcGFyYW1ldGVyIHRvIFxjIHBhaW50ZXIu
IE5leHQsIHdlIHJlbmRlciB0aGUgY29udGVudHMgb2YgdGhlIG1haW4KKyAgICBmcmFtZSBhbmQg
aXRzIHN1YmZyYW1lcyBpbnRvIFxjIHBhaW50ZXIuIEZpbmFsbHksIHdlIHNhdmUgdGhlIHNjYWxl
ZCBpbWFnZS4KKworICAgIFxzYSBRV2ViRnJhbWUKKyovCisKKy8qIQorICAgIENvbnN0cnVjdHMg
YW4gZW1wdHkgUVdlYlBhZ2Ugd2l0aCBwYXJlbnQgXGEgcGFyZW50LgorKi8KK1FXZWJQYWdlOjpR
V2ViUGFnZShRT2JqZWN0ICpwYXJlbnQpCisgICAgOiBRT2JqZWN0KHBhcmVudCkKKyAgICAsIGQo
bmV3IFFXZWJQYWdlUHJpdmF0ZSh0aGlzKSkKK3sKKyAgICBzZXRWaWV3KHFvYmplY3RfY2FzdDxR
V2lkZ2V0Kj4ocGFyZW50KSk7CisKKyAgICBjb25uZWN0KHRoaXMsIFNJR05BTChsb2FkUHJvZ3Jl
c3MoaW50KSksIHRoaXMsIFNMT1QoX3Ffb25Mb2FkUHJvZ3Jlc3NDaGFuZ2VkKGludCkpKTsKKyNp
Zm5kZWYgTkRFQlVHCisgICAgY29ubmVjdChRQ29yZUFwcGxpY2F0aW9uOjppbnN0YW5jZSgpLCBT
SUdOQUwoYWJvdXRUb1F1aXQoKSksIHRoaXMsIFNMT1QoX3FfY2xlYW51cExlYWtNZXNzYWdlcygp
KSk7CisjZW5kaWYKK30KKworLyohCisgICAgRGVzdHJveXMgdGhlIHdlYiBwYWdlLgorKi8KK1FX
ZWJQYWdlOjp+UVdlYlBhZ2UoKQoreworICAgIGRlbGV0ZSBkOworfQorCisvKiEKKyAgICBSZXR1
cm5zIHRoZSBtYWluIGZyYW1lIG9mIHRoZSBwYWdlLgorCisgICAgVGhlIG1haW4gZnJhbWUgcHJv
dmlkZXMgYWNjZXNzIHRvIHRoZSBoaWVyYXJjaHkgb2Ygc3ViLWZyYW1lcyBhbmQgaXMgYWxzbyBu
ZWVkZWQgaWYgeW91CisgICAgd2FudCB0byBleHBsaWNpdGx5IHJlbmRlciBhIHdlYiBwYWdlIGlu
dG8gYSBnaXZlbiBwYWludGVyLgorCisgICAgXHNhIGN1cnJlbnRGcmFtZSgpCisqLworUVdlYkZy
YW1lICpRV2ViUGFnZTo6bWFpbkZyYW1lKCkgY29uc3QKK3sKKyAgICBkLT5jcmVhdGVNYWluRnJh
bWUoKTsKKyAgICByZXR1cm4gZC0+bWFpbkZyYW1lLmRhdGEoKTsKK30KKworLyohCisgICAgUmV0
dXJucyB0aGUgZnJhbWUgY3VycmVudGx5IGFjdGl2ZS4KKworICAgIFxzYSBtYWluRnJhbWUoKSwg
ZnJhbWVDcmVhdGVkKCkKKyovCitRV2ViRnJhbWUgKlFXZWJQYWdlOjpjdXJyZW50RnJhbWUoKSBj
b25zdAoreworICAgIGQtPmNyZWF0ZU1haW5GcmFtZSgpOworICAgIHJldHVybiBxb2JqZWN0X2Nh
c3Q8UVdlYkZyYW1lKj4oZC0+Y3VycmVudEZyYW1lKCkpOworfQorCisKKy8qIQorICAgIFxzaW5j
ZSA0LjYKKworICAgIFJldHVybnMgdGhlIGZyYW1lIGF0IHRoZSBnaXZlbiBwb2ludCBcYSBwb3Ms
IG9yIDAgaWYgdGhlcmUgaXMgbm8gZnJhbWUgYXQKKyAgICB0aGF0IHBvc2l0aW9uLgorCisgICAg
XHNhIG1haW5GcmFtZSgpLCBjdXJyZW50RnJhbWUoKQorKi8KK1FXZWJGcmFtZSogUVdlYlBhZ2U6
OmZyYW1lQXQoY29uc3QgUVBvaW50JiBwb3MpIGNvbnN0Cit7CisgICAgUVdlYkZyYW1lKiB3ZWJG
cmFtZSA9IG1haW5GcmFtZSgpOworICAgIGlmICghd2ViRnJhbWUtPmdlb21ldHJ5KCkuY29udGFp
bnMocG9zKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgUVdlYkhpdFRlc3RSZXN1bHQgaGl0VGVz
dFJlc3VsdCA9IHdlYkZyYW1lLT5oaXRUZXN0Q29udGVudChwb3MpOworICAgIHJldHVybiBoaXRU
ZXN0UmVzdWx0LmZyYW1lKCk7Cit9CisKKy8qIQorICAgIFJldHVybnMgYSBwb2ludGVyIHRvIHRo
ZSB2aWV3J3MgaGlzdG9yeSBvZiBuYXZpZ2F0ZWQgd2ViIHBhZ2VzLgorKi8KK1FXZWJIaXN0b3J5
ICpRV2ViUGFnZTo6aGlzdG9yeSgpIGNvbnN0Cit7CisgICAgZC0+Y3JlYXRlTWFpbkZyYW1lKCk7
CisgICAgcmV0dXJuICZkLT5oaXN0b3J5OworfQorCisvKiEKKyAgICBTZXRzIHRoZSBcYSB2aWV3
IHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB3ZWIgcGFnZS4KKworICAgIFxzYSB2aWV3KCkK
KyovCit2b2lkIFFXZWJQYWdlOjpzZXRWaWV3KFFXaWRnZXQqIHZpZXcpCit7CisgICAgaWYgKHRo
aXMtPnZpZXcoKSA9PSB2aWV3KQorICAgICAgICByZXR1cm47CisKKyAgICBkLT52aWV3ID0gdmll
dzsKKyAgICBzZXRWaWV3cG9ydFNpemUodmlldyA/IHZpZXctPnNpemUoKSA6IFFTaXplKDAsIDAp
KTsKKworICAgIC8vIElmIHdlIGhhdmUgbm8gY2xpZW50LCB3ZSBpbnN0YWxsIGEgc3BlY2lhbCBj
bGllbnQgZGVsZWdhdGluZworICAgIC8vIHRoZSByZXNwb25zaWJpbGl0eSB0byB0aGUgUVdpZGdl
dC4gVGhpcyBpcyB0aGUgY29kZSBwYXRoCisgICAgLy8gaGFuZGxpbmcgYS5vLiB0aGUgImxlZ2Fj
eSIgUVdlYlZpZXcuCisgICAgLy8KKyAgICAvLyBJZiBzdWNoIGEgc3BlY2lhbCBkZWxlZ2F0ZSBh
bHJlYWR5IGV4aXN0LCB3ZSBzdWJzdGl0dXRlIHRoZSB2aWV3LgorCisgICAgaWYgKGQtPmNsaWVu
dCkgeworICAgICAgICBpZiAoZC0+Y2xpZW50LT5pc1FXaWRnZXRDbGllbnQoKSkKKyAgICAgICAg
ICAgIHN0YXRpY19jYXN0PFBhZ2VDbGllbnRRV2lkZ2V0Kj4oZC0+Y2xpZW50LmRhdGEoKSktPnZp
ZXcgPSB2aWV3OworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHZpZXcpCisgICAg
ICAgIGQtPmNsaWVudC5yZXNldChuZXcgUGFnZUNsaWVudFFXaWRnZXQodmlldywgdGhpcykpOwor
fQorCisvKiEKKyAgICBSZXR1cm5zIHRoZSB2aWV3IHdpZGdldCB0aGF0IGlzIGFzc29jaWF0ZWQg
d2l0aCB0aGUgd2ViIHBhZ2UuCisKKyAgICBcc2Egc2V0VmlldygpCisqLworUVdpZGdldCAqUVdl
YlBhZ2U6OnZpZXcoKSBjb25zdAoreworICAgIHJldHVybiBkLT52aWV3LmRhdGEoKTsKK30KKwor
LyohCisgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbmV2ZXIgYSBKYXZhU2NyaXB0IHBy
b2dyYW0gdHJpZXMgdG8gcHJpbnQgYSBcYSBtZXNzYWdlIHRvIHRoZSB3ZWIgYnJvd3NlcidzIGNv
bnNvbGUuCisKKyAgICBGb3IgZXhhbXBsZSBpbiBjYXNlIG9mIGV2YWx1YXRpb24gZXJyb3JzIHRo
ZSBzb3VyY2UgVVJMIG1heSBiZSBwcm92aWRlZCBpbiBcYSBzb3VyY2VJRCBhcyB3ZWxsIGFzIHRo
ZSBcYSBsaW5lTnVtYmVyLgorCisgICAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcHJpbnRz
IG5vdGhpbmcuCisqLwordm9pZCBRV2ViUGFnZTo6amF2YVNjcmlwdENvbnNvbGVNZXNzYWdlKGNv
bnN0IFFTdHJpbmcmIG1lc3NhZ2UsIGludCBsaW5lTnVtYmVyLCBjb25zdCBRU3RyaW5nJiBzb3Vy
Y2VJRCkKK3sKKyAgICBRX1VOVVNFRChzb3VyY2VJRCk7CisKKyAgICAvLyBDYXRjaCBwbHVnaW4g
bG9nRGVzdHJveSBtZXNzYWdlIGZvciBMYXlvdXRUZXN0cy9wbHVnaW5zL29wZW4tYW5kLWNsb3Nl
LXdpbmRvdy13aXRoLXBsdWdpbi5odG1sCisgICAgLy8gQXQgdGhpcyBwb2ludCBEUlQncyBXZWJQ
YWdlIGhhcyBhbHJlYWR5IGJlZW4gZGVzdHJveWVkCisgICAgaWYgKFFXZWJQYWdlQWRhcHRlcjo6
ZHJ0UnVuKSB7CisgICAgICAgIGlmIChtZXNzYWdlID09IFFMYXRpbjFTdHJpbmcoIlBMVUdJTjog
TlBQX0Rlc3Ryb3kiKSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRvdXQsICJDT05TT0xFIE1F
U1NBR0U6ICIpOworICAgICAgICAgICAgaWYgKGxpbmVOdW1iZXIpCisgICAgICAgICAgICAgICAg
ZnByaW50ZihzdGRvdXQsICJsaW5lICVkOiAiLCBsaW5lTnVtYmVyKTsKKyAgICAgICAgICAgIGZw
cmludGYoc3Rkb3V0LCAiJXNcbiIsIG1lc3NhZ2UudG9VdGY4KCkuY29uc3REYXRhKCkpOworICAg
ICAgICB9CisgICAgfQorfQorCisvKiEKKyAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVu
ZXZlciBhIEphdmFTY3JpcHQgcHJvZ3JhbSBydW5uaW5nIGluc2lkZSBcYSBmcmFtZSBjYWxscyB0
aGUgYWxlcnQoKSBmdW5jdGlvbiB3aXRoCisgICAgdGhlIG1lc3NhZ2UgXGEgbXNnLgorCisgICAg
VGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2hvd3MgdGhlIG1lc3NhZ2UsIFxhIG1zZywgd2l0
aCBRTWVzc2FnZUJveDo6aW5mb3JtYXRpb24uCisqLwordm9pZCBRV2ViUGFnZTo6amF2YVNjcmlw
dEFsZXJ0KFFXZWJGcmFtZSAqZnJhbWUsIGNvbnN0IFFTdHJpbmcmIG1zZykKK3sKKyAgICBRX1VO
VVNFRChmcmFtZSk7CisjaWZuZGVmIFFUX05PX01FU1NBR0VCT1gKKyAgICBRTWVzc2FnZUJveCBi
b3godmlldygpKTsKKyAgICBib3guc2V0V2luZG93VGl0bGUodHIoIkphdmFTY3JpcHQgQWxlcnQg
LSAlMSIpLmFyZyhtYWluRnJhbWUoKS0+dXJsKCkuaG9zdCgpKSk7CisgICAgYm94LnNldFRleHRG
b3JtYXQoUXQ6OlBsYWluVGV4dCk7CisgICAgYm94LnNldFRleHQobXNnKTsKKyAgICBib3guc2V0
U3RhbmRhcmRCdXR0b25zKFFNZXNzYWdlQm94OjpPayk7CisgICAgYm94LmV4ZWMoKTsKKyNlbmRp
ZgorfQorCisvKiEKKyAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuZXZlciBhIEphdmFT
Y3JpcHQgcHJvZ3JhbSBydW5uaW5nIGluc2lkZSBcYSBmcmFtZSBjYWxscyB0aGUgY29uZmlybSgp
IGZ1bmN0aW9uCisgICAgd2l0aCB0aGUgbWVzc2FnZSwgXGEgbXNnLiBSZXR1cm5zIHRydWUgaWYg
dGhlIHVzZXIgY29uZmlybXMgdGhlIG1lc3NhZ2U7IG90aGVyd2lzZSByZXR1cm5zIGZhbHNlLgor
CisgICAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZXhlY3V0ZXMgdGhlIHF1ZXJ5IHVzaW5n
IFFNZXNzYWdlQm94OjppbmZvcm1hdGlvbiB3aXRoIFFNZXNzYWdlQm94OjpPayBhbmQgUU1lc3Nh
Z2VCb3g6OkNhbmNlbCBidXR0b25zLgorKi8KK2Jvb2wgUVdlYlBhZ2U6OmphdmFTY3JpcHRDb25m
aXJtKFFXZWJGcmFtZSAqZnJhbWUsIGNvbnN0IFFTdHJpbmcmIG1zZykKK3sKKyAgICBRX1VOVVNF
RChmcmFtZSk7CisjaWZkZWYgUVRfTk9fTUVTU0FHRUJPWAorICAgIHJldHVybiB0cnVlOworI2Vs
c2UKKyAgICBRTWVzc2FnZUJveCBib3godmlldygpKTsKKyAgICBib3guc2V0V2luZG93VGl0bGUo
dHIoIkphdmFTY3JpcHQgQ29uZmlybSAtICUxIikuYXJnKG1haW5GcmFtZSgpLT51cmwoKS5ob3N0
KCkpKTsKKyAgICBib3guc2V0VGV4dEZvcm1hdChRdDo6UGxhaW5UZXh0KTsKKyAgICBib3guc2V0
VGV4dChtc2cpOworICAgIGJveC5zZXRTdGFuZGFyZEJ1dHRvbnMoUU1lc3NhZ2VCb3g6Ok9rIHwg
UU1lc3NhZ2VCb3g6OkNhbmNlbCk7CisgICAgcmV0dXJuIFFNZXNzYWdlQm94OjpPayA9PSBib3gu
ZXhlYygpOworI2VuZGlmCit9CisKKy8qIQorICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdo
ZW5ldmVyIGEgSmF2YVNjcmlwdCBwcm9ncmFtIHJ1bm5pbmcgaW5zaWRlIFxhIGZyYW1lIHRyaWVz
IHRvIHByb21wdCB0aGUgdXNlciBmb3IgaW5wdXQuCisgICAgVGhlIHByb2dyYW0gbWF5IHByb3Zp
ZGUgYW4gb3B0aW9uYWwgbWVzc2FnZSwgXGEgbXNnLCBhcyB3ZWxsIGFzIGEgZGVmYXVsdCB2YWx1
ZSBmb3IgdGhlIGlucHV0IGluIFxhIGRlZmF1bHRWYWx1ZS4KKworICAgIElmIHRoZSBwcm9tcHQg
d2FzIGNhbmNlbGxlZCBieSB0aGUgdXNlciB0aGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIHJldHVy
biBmYWxzZTsgb3RoZXJ3aXNlIHRoZQorICAgIHJlc3VsdCBzaG91bGQgYmUgd3JpdHRlbiB0byBc
YSByZXN1bHQgYW5kIHRydWUgc2hvdWxkIGJlIHJldHVybmVkLiBJZiB0aGUgcHJvbXB0IHdhcyBu
b3QgY2FuY2VsbGVkIGJ5IHRoZQorICAgIHVzZXIsIHRoZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQg
cmV0dXJuIHRydWUgYW5kIHRoZSByZXN1bHQgc3RyaW5nIG11c3Qgbm90IGJlIG51bGwuCisKKyAg
ICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB1c2VzIFFJbnB1dERpYWxvZzo6Z2V0VGV4dCgp
LgorKi8KK2Jvb2wgUVdlYlBhZ2U6OmphdmFTY3JpcHRQcm9tcHQoUVdlYkZyYW1lICpmcmFtZSwg
Y29uc3QgUVN0cmluZyYgbXNnLCBjb25zdCBRU3RyaW5nJiBkZWZhdWx0VmFsdWUsIFFTdHJpbmcq
IHJlc3VsdCkKK3sKKyAgICBRX1VOVVNFRChmcmFtZSk7CisgICAgYm9vbCBvayA9IGZhbHNlOwor
I2lmbmRlZiBRVF9OT19JTlBVVERJQUxPRworCisgICAgUUlucHV0RGlhbG9nIGRsZyh2aWV3KCkp
OworICAgIGRsZy5zZXRXaW5kb3dUaXRsZSh0cigiSmF2YVNjcmlwdCBQcm9tcHQgLSAlMSIpLmFy
ZyhtYWluRnJhbWUoKS0+dXJsKCkuaG9zdCgpKSk7CisKKyAgICAvLyBIYWNrIHRvIGZvcmNlIHRo
ZSBkaWFsb2cncyBRTGFiZWwgaW50byBwbGFpbiB0ZXh0IG1vZGUKKyAgICAvLyBwcmV2ZW50cyBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzQ0MjkKKyAgICBRTGFiZWwq
IGxhYmVsID0gZGxnLmZpbmRDaGlsZDxRTGFiZWwqPigpOworICAgIGlmIChsYWJlbCkKKyAgICAg
ICAgbGFiZWwtPnNldFRleHRGb3JtYXQoUXQ6OlBsYWluVGV4dCk7CisKKyAgICAvLyBkb3VibGUg
dGhlICYncyBiZWNhdXNlIHNpbmdsZSAmIHdpbGwgdW5kZXJsaW5lIHRoZSBmb2xsb3dpbmcgY2hh
cmFjdGVyCisgICAgLy8gKEFjY2VsZXJhdG9yIG1uZW1vbmljcykKKyAgICBRU3RyaW5nIGVzY01z
Zyhtc2cpOworICAgIGVzY01zZy5yZXBsYWNlKFFDaGFyOjpmcm9tTGF0aW4xKCcmJyksIFFMYXRp
bjFTdHJpbmcoIiYmIikpOworICAgIGRsZy5zZXRMYWJlbFRleHQoZXNjTXNnKTsKKworICAgIGRs
Zy5zZXRUZXh0RWNob01vZGUoUUxpbmVFZGl0OjpOb3JtYWwpOworICAgIGRsZy5zZXRUZXh0VmFs
dWUoZGVmYXVsdFZhbHVlKTsKKworICAgIG9rID0gISFkbGcuZXhlYygpOworCisgICAgaWYgKG9r
ICYmIHJlc3VsdCkKKyAgICAgICAgKnJlc3VsdCA9IGRsZy50ZXh0VmFsdWUoKTsKKyNlbmRpZgor
ICAgIHJldHVybiBvazsKK30KKworLyohCisgICAgXGZuIGJvb2wgUVdlYlBhZ2U6OnNob3VsZElu
dGVycnVwdEphdmFTY3JpcHQoKQorICAgIFxzaW5jZSA0LjYKKyAgICBUaGlzIGZ1bmN0aW9uIGlz
IGNhbGxlZCB3aGVuIGEgSmF2YVNjcmlwdCBwcm9ncmFtIGlzIHJ1bm5pbmcgZm9yIGEgbG9uZyBw
ZXJpb2Qgb2YgdGltZS4KKworICAgIElmIHRoZSB1c2VyIHdhbnRlZCB0byBzdG9wIHRoZSBKYXZh
U2NyaXB0IHRoZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgcmV0dXJuIHRydWU7IG90aGVyd2lzZSBm
YWxzZS4KKworICAgIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGV4ZWN1dGVzIHRoZSBxdWVy
eSB1c2luZyBRTWVzc2FnZUJveDo6aW5mb3JtYXRpb24gd2l0aCBRTWVzc2FnZUJveDo6WWVzIGFu
ZCBRTWVzc2FnZUJveDo6Tm8gYnV0dG9ucy4KKyovCitib29sIFFXZWJQYWdlOjpzaG91bGRJbnRl
cnJ1cHRKYXZhU2NyaXB0KCkKK3sKKyNpZmRlZiBRVF9OT19NRVNTQUdFQk9YCisgICAgcmV0dXJu
IGZhbHNlOworI2Vsc2UKKyAgICByZXR1cm4gUU1lc3NhZ2VCb3g6OlllcyA9PSBRTWVzc2FnZUJv
eDo6aW5mb3JtYXRpb24odmlldygpLCB0cigiSmF2YVNjcmlwdCBQcm9ibGVtIC0gJTEiKS5hcmco
bWFpbkZyYW1lKCktPnVybCgpLmhvc3QoKSksIHRyKCJUaGUgc2NyaXB0IG9uIHRoaXMgcGFnZSBh
cHBlYXJzIHRvIGhhdmUgYSBwcm9ibGVtLiBEbyB5b3Ugd2FudCB0byBzdG9wIHRoZSBzY3JpcHQ/
IiksIFFNZXNzYWdlQm94OjpZZXMsIFFNZXNzYWdlQm94OjpObyk7CisjZW5kaWYKK30KKwordm9p
ZCBRV2ViUGFnZTo6c2V0RmVhdHVyZVBlcm1pc3Npb24oUVdlYkZyYW1lKiBmcmFtZSwgRmVhdHVy
ZSBmZWF0dXJlLCBQZXJtaXNzaW9uUG9saWN5IHBvbGljeSkKK3sKKyAgICBzd2l0Y2ggKGZlYXR1
cmUpIHsKKyAgICBjYXNlIE5vdGlmaWNhdGlvbnM6CisjaWYgRU5BQkxFKE5PVElGSUNBVElPTlMp
IHx8IEVOQUJMRShMRUdBQ1lfTk9USUZJQ0FUSU9OUykKKyAgICAgICAgaWYgKHBvbGljeSA9PSBQ
ZXJtaXNzaW9uR3JhbnRlZEJ5VXNlcikKKyAgICAgICAgICAgIGQtPmFsbG93Tm90aWZpY2F0aW9u
c0ZvckZyYW1lKGZyYW1lLT5kKTsKKyNlbmRpZgorICAgICAgICBicmVhazsKKyAgICBjYXNlIEdl
b2xvY2F0aW9uOgorI2lmIEVOQUJMRShHRU9MT0NBVElPTikKKyAgICAgICAgaWYgKHBvbGljeSAh
PSBQZXJtaXNzaW9uVW5rbm93bikKKyAgICAgICAgICAgIGQtPnNldEdlb2xvY2F0aW9uRW5hYmxl
ZEZvckZyYW1lKGZyYW1lLT5kLCAocG9saWN5ID09IFBlcm1pc3Npb25HcmFudGVkQnlVc2VyKSk7
CisjZW5kaWYKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsK
KyAgICB9Cit9CisKKy8qIQorICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW5ldmVyIFdl
YktpdCB3YW50cyB0byBjcmVhdGUgYSBuZXcgd2luZG93IG9mIHRoZSBnaXZlbiBcYSB0eXBlLCBm
b3IKKyAgICBleGFtcGxlIHdoZW4gYSBKYXZhU2NyaXB0IHByb2dyYW0gcmVxdWVzdHMgdG8gb3Bl
biBhIGRvY3VtZW50IGluIGEgbmV3IHdpbmRvdy4KKworICAgIElmIHRoZSBuZXcgd2luZG93IGNh
biBiZSBjcmVhdGVkLCB0aGUgbmV3IHdpbmRvdydzIFFXZWJQYWdlIGlzIHJldHVybmVkOyBvdGhl
cndpc2UgYSBudWxsIHBvaW50ZXIgaXMgcmV0dXJuZWQuCisKKyAgICBJZiB0aGUgdmlldyBhc3Nv
Y2lhdGVkIHdpdGggdGhlIHdlYiBwYWdlIGlzIGEgUVdlYlZpZXcgb2JqZWN0LCB0aGVuIHRoZSBk
ZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvcndhcmRzCisgICAgdGhlIHJlcXVlc3QgdG8gUVdlYlZp
ZXcncyBjcmVhdGVXaW5kb3coKSBmdW5jdGlvbjsgb3RoZXJ3aXNlIGl0IHJldHVybnMgYSBudWxs
IHBvaW50ZXIuCisKKyAgICBJZiBcYSB0eXBlIGlzIFdlYk1vZGFsRGlhbG9nLCB0aGUgYXBwbGlj
YXRpb24gbXVzdCBjYWxsIHNldFdpbmRvd01vZGFsaXR5KFF0OjpBcHBsaWNhdGlvbk1vZGFsKSBv
biB0aGUgbmV3IHdpbmRvdy4KKworICAgIFxub3RlIEluIHRoZSBjYXNlcyB3aGVuIHRoZSB3aW5k
b3cgY3JlYXRpb24gaXMgYmVpbmcgdHJpZ2dlcmVkIGJ5IEphdmFTY3JpcHQsIGFwYXJ0IGZyb20K
KyAgICByZWltcGxlbWVudGluZyB0aGlzIG1ldGhvZCBhcHBsaWNhdGlvbiBtdXN0IGFsc28gc2V0
IHRoZSBKYXZhU2NyaXB0Q2FuT3BlbldpbmRvd3MgYXR0cmlidXRlCisgICAgb2YgUVdlYlNldHRp
bmdzIHRvIHRydWUgaW4gb3JkZXIgZm9yIGl0IHRvIGdldCBjYWxsZWQuCisKKyAgICBcc2EgYWNj
ZXB0TmF2aWdhdGlvblJlcXVlc3QoKSwgUVdlYlZpZXc6OmNyZWF0ZVdpbmRvdygpCisqLworUVdl
YlBhZ2UgKlFXZWJQYWdlOjpjcmVhdGVXaW5kb3coV2ViV2luZG93VHlwZSB0eXBlKQoreworICAg
IFFXZWJWaWV3ICp3ZWJWaWV3ID0gcW9iamVjdF9jYXN0PFFXZWJWaWV3Kj4odmlldygpKTsKKyAg
ICBpZiAod2ViVmlldykgeworICAgICAgICBRV2ViVmlldyAqbmV3VmlldyA9IHdlYlZpZXctPmNy
ZWF0ZVdpbmRvdyh0eXBlKTsKKyAgICAgICAgaWYgKG5ld1ZpZXcpCisgICAgICAgICAgICByZXR1
cm4gbmV3Vmlldy0+cGFnZSgpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyohCisgICAg
VGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbmV2ZXIgV2ViS2l0IGVuY291bnRlcnMgYSBIVE1M
IG9iamVjdCBlbGVtZW50IHdpdGggdHlwZSAiYXBwbGljYXRpb24veC1xdC1wbHVnaW4iLiBJdCBp
cworICAgIGNhbGxlZCByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZSBvZiBRV2ViU2V0dGluZ3M6OlBs
dWdpbnNFbmFibGVkLiBUaGUgXGEgY2xhc3NpZCwgXGEgdXJsLCBcYSBwYXJhbU5hbWVzIGFuZCBc
YSBwYXJhbVZhbHVlcworICAgIGNvcnJlc3BvbmQgdG8gdGhlIEhUTUwgb2JqZWN0IGVsZW1lbnQg
YXR0cmlidXRlcyBhbmQgY2hpbGQgZWxlbWVudHMgdG8gY29uZmlndXJlIHRoZSBlbWJlZGRhYmxl
IG9iamVjdC4KKyovCitRT2JqZWN0ICpRV2ViUGFnZTo6Y3JlYXRlUGx1Z2luKGNvbnN0IFFTdHJp
bmcgJmNsYXNzaWQsIGNvbnN0IFFVcmwgJnVybCwgY29uc3QgUVN0cmluZ0xpc3QgJnBhcmFtTmFt
ZXMsIGNvbnN0IFFTdHJpbmdMaXN0ICZwYXJhbVZhbHVlcykKK3sKKyAgICBRX1VOVVNFRChjbGFz
c2lkKTsKKyAgICBRX1VOVVNFRCh1cmwpOworICAgIFFfVU5VU0VEKHBhcmFtTmFtZXMpOworICAg
IFFfVU5VU0VEKHBhcmFtVmFsdWVzKTsKKyAgICByZXR1cm4gMDsKK30KKworLyohCisgKiAgUmV0
dXJucyB0aGUgbGlzdCBvZiBhbGwgY29udGVudCB0eXBlcyBzdXBwb3J0ZWQgYnkgUVdlYlBhZ2Uu
CisgKi8KK1FTdHJpbmdMaXN0IFFXZWJQYWdlOjpzdXBwb3J0ZWRDb250ZW50VHlwZXMoKSBjb25z
dAoreworICAgIHJldHVybiBkLT5zdXBwb3J0ZWRDb250ZW50VHlwZXMoKTsKK30KKworLyohCisg
KiAgUmV0dXJucyB0cnVlIGlmIFFXZWJQYWdlIGNhbiBoYW5kbGUgdGhlIGdpdmVuIFxhIG1pbWVU
eXBlOyBvdGhlcndpc2UsIHJldHVybnMgZmFsc2UuCisgKi8KK2Jvb2wgUVdlYlBhZ2U6OnN1cHBv
cnRzQ29udGVudFR5cGUoY29uc3QgUVN0cmluZyYgbWltZVR5cGUpIGNvbnN0Cit7CisgICAgcmV0
dXJuIGQtPnN1cHBvcnRzQ29udGVudFR5cGUobWltZVR5cGUpOworfQorCitzdGF0aWMgdm9pZCBj
b2xsZWN0Q2hpbGRGcmFtZXMoUVdlYkZyYW1lKiBmcmFtZSwgUUxpc3Q8UVdlYkZyYW1lKj4mIGxp
c3QpCit7CisgICAgbGlzdCA8PCBmcmFtZS0+Y2hpbGRGcmFtZXMoKTsKKyAgICBRTGlzdEl0ZXJh
dG9yPFFXZWJGcmFtZSo+IGl0KGZyYW1lLT5jaGlsZEZyYW1lcygpKTsKKyAgICB3aGlsZSAoaXQu
aGFzTmV4dCgpKQorICAgICAgICBjb2xsZWN0Q2hpbGRGcmFtZXMoaXQubmV4dCgpLCBsaXN0KTsK
K30KKworLyohCisgICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIHRvIHRyaWdnZXIgdGhl
IHNwZWNpZmllZCBcYSBhY3Rpb24uCisgICAgSXQgaXMgYWxzbyBjYWxsZWQgYnkgUXRXZWJLaXQg
aWYgdGhlIHVzZXIgdHJpZ2dlcnMgdGhlIGFjdGlvbiwgZm9yIGV4YW1wbGUKKyAgICB0aHJvdWdo
IGEgY29udGV4dCBtZW51IGl0ZW0uCisKKyAgICBJZiBcYSBhY3Rpb24gaXMgYSBjaGVja2FibGUg
YWN0aW9uIHRoZW4gXGEgY2hlY2tlZCBzcGVjaWZpZWQgd2hldGhlciB0aGUgYWN0aW9uCisgICAg
aXMgdG9nZ2xlZCBvciBub3QuCisKKyAgICBcc2EgYWN0aW9uKCkKKyovCit2b2lkIFFXZWJQYWdl
Ojp0cmlnZ2VyQWN0aW9uKFdlYkFjdGlvbiBhY3Rpb24sIGJvb2wpCit7CisgICAgY29uc3QgY2hh
ciAqY29tbWFuZCA9IDA7CisgICAgUVdlYlBhZ2VBZGFwdGVyOjpNZW51QWN0aW9uIG1hcHBlZEFj
dGlvbiA9IFFXZWJQYWdlQWRhcHRlcjo6Tm9BY3Rpb247CisgICAgUVdlYkhpdFRlc3RSZXN1bHRQ
cml2YXRlKiBoaXRUZXN0UmVzdWx0ID0gZC0+aGl0VGVzdFJlc3VsdC5kOworCisgICAgc3dpdGNo
IChhY3Rpb24pIHsKKyAgICBjYXNlIE9wZW5MaW5rOgorICAgIGNhc2UgT3BlbkxpbmtJbk5ld1dp
bmRvdzoKKyAgICBjYXNlIE9wZW5MaW5rSW5UaGlzV2luZG93OgorICAgIGNhc2UgT3BlbkZyYW1l
SW5OZXdXaW5kb3c6CisgICAgY2FzZSBDb3B5TGlua1RvQ2xpcGJvYXJkOgorICAgIGNhc2UgT3Bl
bkltYWdlSW5OZXdXaW5kb3c6CisgICAgY2FzZSBEb3dubG9hZEltYWdlVG9EaXNrOgorICAgIGNh
c2UgRG93bmxvYWRMaW5rVG9EaXNrOgorICAgIGNhc2UgQmFjazoKKyAgICBjYXNlIEZvcndhcmQ6
CisgICAgY2FzZSBTdG9wOgorICAgIGNhc2UgUmVsb2FkOgorICAgIGNhc2UgU2V0VGV4dERpcmVj
dGlvbkRlZmF1bHQ6CisgICAgY2FzZSBTZXRUZXh0RGlyZWN0aW9uTGVmdFRvUmlnaHQ6CisgICAg
Y2FzZSBTZXRUZXh0RGlyZWN0aW9uUmlnaHRUb0xlZnQ6CisgICAgICAgIG1hcHBlZEFjdGlvbiA9
IGFkYXB0ZXJNZW51QWN0aW9uRm9yV2ViQWN0aW9uKGFjdGlvbik7CisgICAgICAgIGJyZWFrOwor
ICAgIGNhc2UgUmVsb2FkQW5kQnlwYXNzQ2FjaGU6IC8vIE1hbnVhbCBtYXBwaW5nCisgICAgICAg
IG1hcHBlZEFjdGlvbiA9IFFXZWJQYWdlQWRhcHRlcjo6UmVsb2FkOworICAgICAgICBicmVhazsK
KyNpZm5kZWYgUVRfTk9fQ0xJUEJPQVJECisgICAgY2FzZSBDb3B5SW1hZ2VUb0NsaXBib2FyZDoK
KyAgICAgICAgUUFwcGxpY2F0aW9uOjpjbGlwYm9hcmQoKS0+c2V0UGl4bWFwKGQtPmhpdFRlc3RS
ZXN1bHQucGl4bWFwKCkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENvcHlJbWFnZVVybFRv
Q2xpcGJvYXJkOgorICAgICAgICBRQXBwbGljYXRpb246OmNsaXBib2FyZCgpLT5zZXRUZXh0KGQt
PmhpdFRlc3RSZXN1bHQuaW1hZ2VVcmwoKS50b1N0cmluZygpKTsKKyAgICAgICAgYnJlYWs7Cisj
ZW5kaWYKKyAgICBjYXNlIEluc3BlY3RFbGVtZW50OiB7CisjaWYgRU5BQkxFKElOU1BFQ1RPUikK
KyAgICAgICAgaWYgKCFkLT5oaXRUZXN0UmVzdWx0LmlzTnVsbCgpKSB7CisgICAgICAgICAgICBk
LT5nZXRPckNyZWF0ZUluc3BlY3RvcigpOyAvLyBNYWtlIHN1cmUgdGhlIGluc3BlY3RvciBpcyBj
cmVhdGVkCisgICAgICAgICAgICBkLT5pbnNwZWN0b3ItPnNob3coKTsgLy8gVGhlIGluc3BlY3Rv
ciBpcyBleHBlY3RlZCB0byBiZSBzaG93biBvbiBpbnNwZWN0aW9uCisgICAgICAgICAgICBtYXBw
ZWRBY3Rpb24gPSBRV2ViUGFnZUFkYXB0ZXI6Okluc3BlY3RFbGVtZW50OworICAgICAgICB9Cisj
ZW5kaWYKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgU3RvcFNjaGVkdWxlZFBhZ2VS
ZWZyZXNoOiB7CisgICAgICAgIFFXZWJGcmFtZSogdG9wRnJhbWUgPSBtYWluRnJhbWUoKTsKKyAg
ICAgICAgdG9wRnJhbWUtPmQtPmNhbmNlbExvYWQoKTsKKyAgICAgICAgUUxpc3Q8UVdlYkZyYW1l
Kj4gY2hpbGRGcmFtZXM7CisgICAgICAgIGNvbGxlY3RDaGlsZEZyYW1lcyh0b3BGcmFtZSwgY2hp
bGRGcmFtZXMpOworICAgICAgICBRTGlzdEl0ZXJhdG9yPFFXZWJGcmFtZSo+IGl0KGNoaWxkRnJh
bWVzKTsKKyAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkKKyAgICAgICAgICAgIGl0Lm5leHQo
KS0+ZC0+Y2FuY2VsTG9hZCgpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoK
KyAgICAgICAgY29tbWFuZCA9IFFXZWJQYWdlUHJpdmF0ZTo6ZWRpdG9yQ29tbWFuZEZvcldlYkFj
dGlvbnMoYWN0aW9uKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChjb21tYW5kIHx8
IG1hcHBlZEFjdGlvbiAhPSBRV2ViUGFnZUFkYXB0ZXI6Ok5vQWN0aW9uKQorICAgICAgICBkLT50
cmlnZ2VyQWN0aW9uKG1hcHBlZEFjdGlvbiwgaGl0VGVzdFJlc3VsdCwgY29tbWFuZCwgLyplbmRU
b0VuZFJlbG9hZCovIGFjdGlvbiA9PSBSZWxvYWRBbmRCeXBhc3NDYWNoZSk7Cit9CisKKworUUNv
bG9yIFFXZWJQYWdlUHJpdmF0ZTo6Y29sb3JTZWxlY3Rpb25SZXF1ZXN0ZWQoY29uc3QgUUNvbG9y
ICZzZWxlY3RlZENvbG9yKQoreworICAgIFFDb2xvciByZXQgPSBzZWxlY3RlZENvbG9yOworI2lm
bmRlZiBRVF9OT19DT0xPUkRJQUxPRworICAgIHJldCA9IFFDb2xvckRpYWxvZzo6Z2V0Q29sb3Io
c2VsZWN0ZWRDb2xvciwgcS0+dmlldygpKTsKKyAgICBpZiAoIXJldC5pc1ZhbGlkKCkpCisgICAg
ICAgIHJldCA9IHNlbGVjdGVkQ29sb3I7CisjZW5kaWYKKyAgICByZXR1cm4gcmV0OworfQorCitR
V2ViU2VsZWN0TWV0aG9kICpRV2ViUGFnZVByaXZhdGU6OmNyZWF0ZVNlbGVjdFBvcHVwKCkKK3sK
KyAgICByZXR1cm4gbmV3IFF0RmFsbGJhY2tXZWJQb3B1cCh0aGlzKTsKK30KKworUVJlY3QgUVdl
YlBhZ2VQcml2YXRlOjp2aWV3UmVjdFJlbGF0aXZlVG9XaW5kb3coKQoreworCisgICAgUVdpZGdl
dCogb3duZXJXaWRnZXQ9IGNsaWVudC5pc051bGwoKSA/IDAgOiBxb2JqZWN0X2Nhc3Q8UVdpZGdl
dCo+KGNsaWVudC0+b3duZXJXaWRnZXQoKSk7CisgICAgaWYgKCFvd25lcldpZGdldCkKKyAgICAg
ICAgcmV0dXJuIFFSZWN0KCk7CisgICAgUVdpZGdldCogdG9wTGV2ZWxXaWRnZXQgPSBvd25lcldp
ZGdldC0+d2luZG93KCk7CisKKyAgICBRUG9pbnQgdG9wTGVmdENvcm5lciA9IG93bmVyV2lkZ2V0
LT5tYXBGcm9tKHRvcExldmVsV2lkZ2V0LCBRUG9pbnQoMCwgMCkpOworICAgIHJldHVybiBRUmVj
dCh0b3BMZWZ0Q29ybmVyLCBvd25lcldpZGdldC0+c2l6ZSgpKTsKK30KKwordm9pZCBRV2ViUGFn
ZVByaXZhdGU6Omdlb2xvY2F0aW9uUGVybWlzc2lvblJlcXVlc3RlZChRV2ViRnJhbWVBZGFwdGVy
KiBmcmFtZSkKK3sKKyAgICBlbWl0IHEtPmZlYXR1cmVQZXJtaXNzaW9uUmVxdWVzdGVkKFFXZWJG
cmFtZVByaXZhdGU6OmtpdChmcmFtZSksIFFXZWJQYWdlOjpHZW9sb2NhdGlvbik7Cit9CisKK3Zv
aWQgUVdlYlBhZ2VQcml2YXRlOjpnZW9sb2NhdGlvblBlcm1pc3Npb25SZXF1ZXN0Q2FuY2VsbGVk
KFFXZWJGcmFtZUFkYXB0ZXIqIGZyYW1lKQoreworICAgIGVtaXQgcS0+ZmVhdHVyZVBlcm1pc3Np
b25SZXF1ZXN0Q2FuY2VsZWQoUVdlYkZyYW1lUHJpdmF0ZTo6a2l0KGZyYW1lKSwgUVdlYlBhZ2U6
Okdlb2xvY2F0aW9uKTsKK30KKwordm9pZCBRV2ViUGFnZVByaXZhdGU6Om5vdGlmaWNhdGlvbnNQ
ZXJtaXNzaW9uUmVxdWVzdGVkKFFXZWJGcmFtZUFkYXB0ZXIqIGZyYW1lKQoreworICAgIGVtaXQg
cS0+ZmVhdHVyZVBlcm1pc3Npb25SZXF1ZXN0ZWQoUVdlYkZyYW1lUHJpdmF0ZTo6a2l0KGZyYW1l
KSwgUVdlYlBhZ2U6Ok5vdGlmaWNhdGlvbnMpOworfQorCit2b2lkIFFXZWJQYWdlUHJpdmF0ZTo6
bm90aWZpY2F0aW9uc1Blcm1pc3Npb25SZXF1ZXN0Q2FuY2VsbGVkKFFXZWJGcmFtZUFkYXB0ZXIq
IGZyYW1lKQoreworICAgIGVtaXQgcS0+ZmVhdHVyZVBlcm1pc3Npb25SZXF1ZXN0Q2FuY2VsZWQo
UVdlYkZyYW1lUHJpdmF0ZTo6a2l0KGZyYW1lKSwgUVdlYlBhZ2U6Ok5vdGlmaWNhdGlvbnMpOwor
fQorCit2b2lkIFFXZWJQYWdlUHJpdmF0ZTo6cmVzcG9uZFRvQ2hhbmdlZENvbnRlbnRzKCkKK3sK
KyAgICB1cGRhdGVFZGl0b3JBY3Rpb25zKCk7CisKKyAgICBlbWl0IHEtPmNvbnRlbnRzQ2hhbmdl
ZCgpOworfQorCit2b2lkIFFXZWJQYWdlUHJpdmF0ZTo6cmVzcG9uZFRvQ2hhbmdlZFNlbGVjdGlv
bigpCit7CisgICAgdXBkYXRlRWRpdG9yQWN0aW9ucygpOworICAgIGVtaXQgcS0+c2VsZWN0aW9u
Q2hhbmdlZCgpOworfQorCit2b2lkIFFXZWJQYWdlUHJpdmF0ZTo6bWljcm9Gb2N1c0NoYW5nZWQo
KQoreworICAgIGVtaXQgcS0+bWljcm9Gb2N1c0NoYW5nZWQoKTsKK30KKwordm9pZCBRV2ViUGFn
ZVByaXZhdGU6OnRyaWdnZXJDb3B5QWN0aW9uKCkKK3sKKyAgICBxLT50cmlnZ2VyQWN0aW9uKFFX
ZWJQYWdlOjpDb3B5KTsKK30KKwordm9pZCBRV2ViUGFnZVByaXZhdGU6OnRyaWdnZXJBY3Rpb25G
b3JLZXlFdmVudChRS2V5RXZlbnQqIGV2ZW50KQoreworICAgIFFXZWJQYWdlOjpXZWJBY3Rpb24g
YWN0aW9uID0gZWRpdG9yQWN0aW9uRm9yS2V5RXZlbnQoZXZlbnQpOworICAgIHEtPnRyaWdnZXJB
Y3Rpb24oYWN0aW9uKTsKK30KKwordm9pZCBRV2ViUGFnZVByaXZhdGU6OmNsZWFyVW5kb1N0YWNr
KCkKK3sKKyNpZm5kZWYgUVRfTk9fVU5ET1NUQUNLCisgICAgaWYgKHVuZG9TdGFjaykKKyAgICAg
ICAgdW5kb1N0YWNrLT5jbGVhcigpOworI2VuZGlmCit9CisKK2Jvb2wgUVdlYlBhZ2VQcml2YXRl
OjpjYW5VbmRvKCkgY29uc3QKK3sKKyNpZm5kZWYgUVRfTk9fVU5ET1NUQUNLCisgICAgaWYgKCF1
bmRvU3RhY2spCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdW5kb1N0YWNrLT5j
YW5VbmRvKCk7CisjZWxzZQorICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorfQorCitib29sIFFX
ZWJQYWdlUHJpdmF0ZTo6Y2FuUmVkbygpIGNvbnN0Cit7CisjaWZuZGVmIFFUX05PX1VORE9TVEFD
SworICAgIGlmICghdW5kb1N0YWNrKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJu
IHVuZG9TdGFjay0+Y2FuUmVkbygpOworI2Vsc2UKKyAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYK
K30KKwordm9pZCBRV2ViUGFnZVByaXZhdGU6OnVuZG8oKQoreworI2lmbmRlZiBRVF9OT19VTkRP
U1RBQ0sKKyAgICBpZiAodW5kb1N0YWNrKQorICAgICAgICB1bmRvU3RhY2stPnVuZG8oKTsKKyNl
bmRpZgorfQorCit2b2lkIFFXZWJQYWdlUHJpdmF0ZTo6cmVkbygpCit7CisjaWZuZGVmIFFUX05P
X1VORE9TVEFDSworICAgIGlmICh1bmRvU3RhY2spCisgICAgICAgIHVuZG9TdGFjay0+cmVkbygp
OworI2VuZGlmCit9CisKK3ZvaWQgUVdlYlBhZ2VQcml2YXRlOjpjcmVhdGVVbmRvU3RlcChRU2hh
cmVkUG9pbnRlcjxVbmRvU3RlcFF0PiBzdGVwKQoreworI2lmbmRlZiBRVF9OT19VTkRPU1RBQ0sK
KyAgICAvLyBDYWxsIHVuZG9TdGFjaygpIGdldHRlciBmaXJzdCB0byBlbnN1cmUgc3RhY2sgaXMg
Y3JlYXRlZAorICAgIC8vIGlmIGl0IGRvZXNuJ3QgZXhpc3QgeWV0LgorICAgIHEtPnVuZG9TdGFj
aygpLT5wdXNoKG5ldyBRV2ViVW5kb0NvbW1hbmQoc3RlcCkpOworI2VuZGlmCit9CisKK2NvbnN0
IGNoYXIgKlFXZWJQYWdlUHJpdmF0ZTo6ZWRpdG9yQ29tbWFuZEZvcktleUV2ZW50KFFLZXlFdmVu
dCogZXZlbnQpCit7CisgICAgUVdlYlBhZ2U6OldlYkFjdGlvbiBhY3Rpb24gPSBlZGl0b3JBY3Rp
b25Gb3JLZXlFdmVudChldmVudCk7CisgICAgcmV0dXJuIGVkaXRvckNvbW1hbmRGb3JXZWJBY3Rp
b25zKGFjdGlvbik7Cit9CisKK1FTaXplIFFXZWJQYWdlOjp2aWV3cG9ydFNpemUoKSBjb25zdAor
eworICAgIGlmIChkLT5tYWluRnJhbWUgJiYgZC0+bWFpbkZyYW1lLmRhdGEoKS0+ZC0+aGFzVmll
dygpKQorICAgICAgICByZXR1cm4gZC0+bWFpbkZyYW1lLmRhdGEoKS0+ZC0+ZnJhbWVSZWN0KCku
c2l6ZSgpOworCisgICAgcmV0dXJuIGQtPm1fdmlld3BvcnRTaXplOworfQorCisvKiEKKyAgICBc
cHJvcGVydHkgUVdlYlBhZ2U6OnZpZXdwb3J0U2l6ZQorICAgIFxicmllZiB0aGUgc2l6ZSBvZiB0
aGUgdmlld3BvcnQKKworICAgIFRoZSBzaXplIGFmZmVjdHMgZm9yIGV4YW1wbGUgdGhlIHZpc2li
aWxpdHkgb2Ygc2Nyb2xsYmFycworICAgIGlmIHRoZSBkb2N1bWVudCBpcyBsYXJnZXIgdGhhbiB0
aGUgdmlld3BvcnQuCisKKyAgICBCeSBkZWZhdWx0LCBmb3IgYSBuZXdseS1jcmVhdGVkIFdlYiBw
YWdlLCB0aGlzIHByb3BlcnR5IGNvbnRhaW5zIGEgc2l6ZSB3aXRoCisgICAgemVybyB3aWR0aCBh
bmQgaGVpZ2h0LgorCisgICAgXHNhIFFXZWJGcmFtZTo6cmVuZGVyKCksIHByZWZlcnJlZENvbnRl
bnRzU2l6ZQorKi8KK3ZvaWQgUVdlYlBhZ2U6OnNldFZpZXdwb3J0U2l6ZShjb25zdCBRU2l6ZSAm
c2l6ZSkgY29uc3QKK3sKKyAgICBkLT5tX3ZpZXdwb3J0U2l6ZSA9IHNpemU7CisKKyAgICBRV2Vi
RnJhbWVBZGFwdGVyKiBtYWluRnJhbWUgPSBkLT5tYWluRnJhbWVBZGFwdGVyKCk7CisgICAgaWYg
KCFtYWluRnJhbWUtPmhhc1ZpZXcoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbWFpbkZyYW1l
LT5zZXRWaWV3cG9ydFNpemUoc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0aW50ZW52KGNvbnN0
IGNoYXIqIHZhcmlhYmxlKQoreworICAgIGJvb2wgb2s7CisgICAgaW50IHZhbHVlID0gcWdldGVu
dih2YXJpYWJsZSkudG9JbnQoJm9rKTsKKyAgICByZXR1cm4gKG9rKSA/IHZhbHVlIDogLTE7Cit9
CisKK3N0YXRpYyBRU2l6ZSBxdWVyeURldmljZVNpemVGb3JTY3JlZW5Db250YWluaW5nV2lkZ2V0
KGNvbnN0IFFXaWRnZXQqIHdpZGdldCkKK3sKKyAgICBRRGVza3RvcFdpZGdldCogZGVza3RvcCA9
IFFBcHBsaWNhdGlvbjo6ZGVza3RvcCgpOworICAgIGlmICghZGVza3RvcCkKKyAgICAgICAgcmV0
dXJuIFFTaXplKCk7CisKKyAgICBRU2l6ZSBzaXplOworCisgICAgaWYgKHdpZGdldCkgeworICAg
ICAgICAvLyBSZXR1cm5zIHRoZSBhdmFpbGFibGUgZ2VvbWV0cnkgb2YgdGhlIHNjcmVlbiB3aGlj
aCBjb250YWlucyB3aWRnZXQuCisgICAgICAgIC8vIE5PVEU6IHRoaXMgbXVzdCBiZSB0aGUgdGhl
IGZ1bGwgc2NyZWVuIHNpemUgaW5jbHVkaW5nIGFueSBmaXhlZCBzdGF0dXMgYXJlYXMgZXRjLgor
ICAgICAgICBzaXplID0gZGVza3RvcC0+YXZhaWxhYmxlR2VvbWV0cnkod2lkZ2V0KS5zaXplKCk7
CisgICAgfSBlbHNlCisgICAgICAgIHNpemUgPSBkZXNrdG9wLT5hdmFpbGFibGVHZW9tZXRyeSgp
LnNpemUoKTsKKworICAgIC8vIFRoaXMgbXVzdCBiZSBpbiBwb3J0cmFpdCBtb2RlLCBhZGp1c3Qg
aWYgbm90LgorICAgIGlmIChzaXplLndpZHRoKCkgPiBzaXplLmhlaWdodCgpKSB7CisgICAgICAg
IGludCB3aWR0aCA9IHNpemUud2lkdGgoKTsKKyAgICAgICAgc2l6ZS5zZXRXaWR0aChzaXplLmhl
aWdodCgpKTsKKyAgICAgICAgc2l6ZS5zZXRIZWlnaHQod2lkdGgpOworICAgIH0KKworICAgIHJl
dHVybiBzaXplOworfQorCisvKiEKKyAgICBDb21wdXRlcyB0aGUgb3B0aW1hbCB2aWV3cG9ydCBj
b25maWd1cmF0aW9uIGdpdmVuIHRoZSBcYSBhdmFpbGFibGVTaXplLCB3aGVuCisgICAgdXNlciBp
bnRlcmZhY2UgY29tcG9uZW50cyBhcmUgZGlzcmVnYXJkZWQuCisKKyAgICBUaGUgY29uZmlndXJh
dGlvbiBpcyBhbHNvIGRlcGVuZGVudCBvbiB0aGUgZGV2aWNlIHNjcmVlbiBzaXplIHdoaWNoIGlz
IG9idGFpbmVkCisgICAgYXV0b21hdGljYWxseS4gRm9yIHRlc3RpbmcgcHVycG9zZXMgdGhlIHNp
emUgY2FuIGJlIG92ZXJyaWRkZW4gYnkgc2V0dGluZyB0d28KKyAgICBlbnZpcm9ubWVudCB2YXJp
YWJsZXMgUVRXRUJLSVRfREVWSUNFX1dJRFRIIGFuZCBRVFdFQktJVF9ERVZJQ0VfSEVJR0hULCB3
aGljaAorICAgIGJvdGggbmVlZHMgdG8gYmUgc2V0LgorCisgICAgVGhlIFZpZXdwb3J0QXR0cmli
dXRlcyBpbmNsdWRlcyBhIHBpeGVsIGRlbnNpdHkgcmF0aW8sIHdoaWNoIHdpbGwgYWxzbyBiZSBl
eHBvc2VkIHRvCisgICAgdGhlIHdlYiBhdXRob3IgdGhvdWdoIHRoZSAtd2Via2l0LXBpeGVsLXJh
dGlvIG1lZGlhIGZlYXR1cmUuIFRoaXMgaXMgdGhlIHJhdGlvCisgICAgYmV0d2VlbiAxIGRlbnNp
dHktaW5kZXBlbmRlbnQgcGl4ZWwgKERQSSkgYW5kIHBoeXNpY2FsIHBpeGVscy4KKworICAgIEEg
ZGVuc2l0eS1pbmRlcGVuZGVudCBwaXhlbCBpcyBlcXVpdmFsZW50IHRvIG9uZSBwaHlzaWNhbCBw
aXhlbCBvbiBhIDE2MCBEUEkgc2NyZWVuLAorICAgIHNvIG9uIG91ciBwbGF0Zm9ybSBhc3N1bWVz
IHRoYXQgYXMgdGhlIGJhc2VsaW5lIGRlbnNpdHkuCisKKyAgICBUaGUgY29udmVyc2lvbiBvZiBE
SVAgdW5pdHMgdG8gc2NyZWVuIHBpeGVscyBpcyBxdWl0ZSBzaW1wbGU6CisKKyAgICBwaXhlbHMg
PSBESVBzICogKGRlbnNpdHkgLyAxNjApLgorCisgICAgVGh1cywgb24gYSAyNDAgRFBJIHNjcmVl
biwgMSBESVBzIHdvdWxkIGVxdWFsIDEuNSBwaHlzaWNhbCBwaXhlbHMuCisKKyAgICBBbiBpbnZh
bGlkIGluc3RhbmNlIHdpbGwgYmUgcmV0dXJuZWQgaW4gdGhlIGNhc2UgYW4gZW1wdHkgc2l6ZSBp
cyBwYXNzZWQgdG8gdGhlCisgICAgbWV0aG9kLgorCisgICAgXG5vdGUgVGhlIGRlbnNpdHkgaXMg
YXV0b21hdGljYWxseSBvYnRhaW5lZCBmcm9tIHRoZSBEUEkgb2YgdGhlIHNjcmVlbiB3aGVyZSB0
aGUgcGFnZQorICAgIGlzIGJlaW5nIHNob3duLCBidXQgYXMgbWFueSBYMTEgc2VydmVycyBhcmUg
cmVwb3J0aW5nIHdyb25nIERQSSwgaXQgaXMgcG9zc2libGUgdG8KKyAgICBvdmVycmlkZSBpdCB1
c2luZyBRWDExSW5mbzo6c2V0QXBwRHBpWSgpLgorKi8KKworUVdlYlBhZ2U6OlZpZXdwb3J0QXR0
cmlidXRlcyBRV2ViUGFnZTo6dmlld3BvcnRBdHRyaWJ1dGVzRm9yU2l6ZShjb25zdCBRU2l6ZSYg
YXZhaWxhYmxlU2l6ZSkgY29uc3QKK3sKKyAgICBWaWV3cG9ydEF0dHJpYnV0ZXMgcmVzdWx0Owor
CisgICAgaWYgKGF2YWlsYWJsZVNpemUuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gcmVzdWx0
OyAvLyBSZXR1cm5zIGFuIGludmFsaWQgaW5zdGFuY2UuCisKKyAgICBRU2l6ZSBkZXZpY2VTaXpl
KGdldGludGVudigiUVRXRUJLSVRfREVWSUNFX1dJRFRIIiksIGdldGludGVudigiUVRXRUJLSVRf
REVWSUNFX0hFSUdIVCIpKTsKKworICAgIC8vIEJvdGggZW52aXJvbm1lbnQgdmFyaWFibGVzIG5l
ZWQgdG8gYmUgc2V0IC0gb3IgdGhleSB3aWxsIGJlIGlnbm9yZWQuCisgICAgaWYgKGRldmljZVNp
emUuaXNOdWxsKCkpCisgICAgICAgIGRldmljZVNpemUgPSBxdWVyeURldmljZVNpemVGb3JTY3Jl
ZW5Db250YWluaW5nV2lkZ2V0KHZpZXcoKSk7CisgICAgUVdlYlBhZ2VBZGFwdGVyOjpWaWV3cG9y
dEF0dHJpYnV0ZXMgYXR0ciA9IGQtPnZpZXdwb3J0QXR0cmlidXRlc0ZvclNpemUoYXZhaWxhYmxl
U2l6ZSwgZGV2aWNlU2l6ZSk7CisKKyAgICByZXN1bHQubV9pc1ZhbGlkID0gdHJ1ZTsKKyAgICBy
ZXN1bHQubV9zaXplID0gYXR0ci5zaXplOworICAgIHJlc3VsdC5tX2luaXRpYWxTY2FsZUZhY3Rv
ciA9IGF0dHIuaW5pdGlhbFNjYWxlRmFjdG9yOworICAgIHJlc3VsdC5tX21pbmltdW1TY2FsZUZh
Y3RvciA9IGF0dHIubWluaW11bVNjYWxlRmFjdG9yOworICAgIHJlc3VsdC5tX21heGltdW1TY2Fs
ZUZhY3RvciA9IGF0dHIubWF4aW11bVNjYWxlRmFjdG9yOworICAgIHJlc3VsdC5tX2RldmljZVBp
eGVsUmF0aW8gPSBhdHRyLmRldmljZVBpeGVsUmF0aW87CisgICAgcmVzdWx0Lm1faXNVc2VyU2Nh
bGFibGUgPSBhdHRyLmlzVXNlclNjYWxhYmxlOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwor
UVNpemUgUVdlYlBhZ2U6OnByZWZlcnJlZENvbnRlbnRzU2l6ZSgpIGNvbnN0Cit7CisgICAgUVdl
YkZyYW1lQWRhcHRlciogbWFpbkZyYW1lID0gZC0+bWFpbkZyYW1lID8gZC0+bWFpbkZyYW1lLT5k
IDogMDsKKyAgICBRU2l6ZSBjdXN0b21TaXplOworICAgIGlmIChtYWluRnJhbWUgJiYgbWFpbkZy
YW1lLT5oYXNWaWV3KCkpCisgICAgICAgIGN1c3RvbVNpemUgPSBtYWluRnJhbWUtPmN1c3RvbUxh
eW91dFNpemUoKTsKKworICAgIHJldHVybiBjdXN0b21TaXplLmlzTnVsbCgpID8gZC0+Zml4ZWRM
YXlvdXRTaXplIDogY3VzdG9tU2l6ZTsKK30KKworLyohCisgICAgXHByb3BlcnR5IFFXZWJQYWdl
OjpwcmVmZXJyZWRDb250ZW50c1NpemUKKyAgICBcc2luY2UgNC42CisgICAgXGJyaWVmIGEgY3Vz
dG9tIHNpemUgdXNlZCBmb3IgbGF5aW5nIG91dCB0aGUgcGFnZSBjb250ZW50cy4KKworICAgIEJ5
IGRlZmF1bHQgYWxsIHBhZ2VzIGFyZSBsYWlkIG91dCB1c2luZyB0aGUgdmlld3BvcnQgb2YgdGhl
IHBhZ2UgYXMgdGhlIGJhc2UuCisKKyAgICBBcyBwYWdlcyBtb3N0bHkgYXJlIGRlc2lnbmVkIGZv
ciBkZXNrdG9wIHVzYWdlLCB0aGV5IG9mdGVuIGRvIG5vdCBsYXlvdXQgcHJvcGVybHkKKyAgICBv
biBzbWFsbCBkZXZpY2VzIGFzIHRoZSBjb250ZW50cyByZXF1aXJlIGEgY2VydGFpbiB2aWV3IHdp
ZHRoLiBGb3IgdGhpcyByZWFzb24KKyAgICBpdCBpcyBjb21tb24gdG8gdXNlIGEgZGlmZmVyZW50
IGxheW91dCBzaXplIGFuZCB0aGVuIHNjYWxlIHRoZSBjb250ZW50cyB0byBmaXQKKyAgICB3aXRo
aW4gdGhlIGFjdHVhbCB2aWV3LgorCisgICAgSWYgdGhpcyBwcm9wZXJ0eSBpcyBzZXQgdG8gYSB2
YWxpZCBzaXplLCB0aGlzIHNpemUgaXMgdXNlZCBmb3IgYWxsIGxheW91dCBuZWVkcworICAgIGlu
c3RlYWQgb2YgdGhlIHNpemUgb2YgdGhlIHZpZXdwb3J0LgorCisgICAgU2V0dGluZyBhbiBpbnZh
bGlkIHNpemUsIG1ha2VzIHRoZSBwYWdlIGZhbGwgYmFjayB0byB1c2luZyB0aGUgdmlld3BvcnQg
c2l6ZSBmb3IgbGF5b3V0LgorCisgICAgXHNhIHZpZXdwb3J0U2l6ZQorKi8KK3ZvaWQgUVdlYlBh
Z2U6OnNldFByZWZlcnJlZENvbnRlbnRzU2l6ZShjb25zdCBRU2l6ZSYgc2l6ZSkgY29uc3QKK3sK
KyAgICAvLyBGSVhNRTogUmVuYW1lIHRoaXMgbWV0aG9kIHRvIHNldEN1c3RvbUxheW91dFNpemUK
KworICAgIGQtPmZpeGVkTGF5b3V0U2l6ZSA9IHNpemU7CisKKyAgICBRV2ViRnJhbWVBZGFwdGVy
KiBtYWluRnJhbWUgPSBkLT5tYWluRnJhbWVBZGFwdGVyKCk7CisgICAgaWYgKCFtYWluRnJhbWUt
Pmhhc1ZpZXcoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbWFpbkZyYW1lLT5zZXRDdXN0b21M
YXlvdXRTaXplKHNpemUpOworfQorCisvKgorICAgIFRoaXMgZnVuY3Rpb24gaXMgdG8gYmUgY2Fs
bGVkIGFmdGVyIGFueSAoYW5pbWF0ZWQpIHNjcm9sbC9wYW4gaGFzIGVuZGVkLCBpbiB0aGUgY2Fz
ZSB0aGUgYXBwbGljYXRpb24gaGFuZGxlcyB0aGUKKyAgICBzY3JvbGxpbmcvcGFubmluZyBvZiB0
aGUgd2ViIGNvbnRlbnRzLiBUaGlzIGlzIGNvbW1vbmx5IHVzZWQgaW4gY29tYmluYXRpb24gd2l0
aCB0aWxpbmcgd2hlcmUgaXMgaXQgY29tbW9uIGZvcgorICAgIHRoZSBhcHBsaWNhdGlvbiB0byBw
YW4gdGhlIGFjdHVhbCB2aWV3LCB3aGljaCB0aGVuIHJlc2l6ZXMgaXRzZWxmIHRvIHRoZSBzaXpl
IG9mIHRoZSBjb250ZW50cy4KKworICAgIFxub3RlIENhbGxpbmcgdGhpcyBmdW5jdGlvbiBtYWtl
cyBXZWJLaXQgc3RvcCB0cnlpbmcgdG8gY2FsY3VsYXRlIHRoZSB2aXNpYmxlQ29udGVudFJlY3Qu
IFRvIHR1cm4gdGhhdCBvbgorICAgIGFnYWluLCBjYWxsIHRoaXMgbWV0aG9kIHdpdGggYW4gZW1w
dHkgcmVjdC4KKworICAgIFxzYSBRR3JhcGhpY3NXZWJWaWV3OjpyZXNpemVzVG9Db250ZW50cywg
UVdlYlNldHRpbmdzOjpUaWxlZEJhY2tpbmdTdG9yZUVuYWJsZWQKKyovCit2b2lkIFFXZWJQYWdl
OjpzZXRBY3R1YWxWaXNpYmxlQ29udGVudFJlY3QoY29uc3QgUVJlY3QmIHJlY3QpIGNvbnN0Cit7
CisgICAgUVdlYkZyYW1lQWRhcHRlciogbWFpbkZyYW1lID0gZC0+bWFpbkZyYW1lQWRhcHRlcigp
OworICAgIGlmICghbWFpbkZyYW1lLT5oYXNWaWV3KCkpCisgICAgICAgIHJldHVybjsKKworICAg
IG1haW5GcmFtZS0+c2V0Rml4ZWRWaXNpYmxlQ29udGVudFJlY3QocmVjdCk7Cit9CisKKy8qIQor
ICAgIFxmbiBib29sIFFXZWJQYWdlOjphY2NlcHROYXZpZ2F0aW9uUmVxdWVzdChRV2ViRnJhbWUg
KmZyYW1lLCBjb25zdCBRTmV0d29ya1JlcXVlc3QgJnJlcXVlc3QsIFFXZWJQYWdlOjpOYXZpZ2F0
aW9uVHlwZSB0eXBlKQorCisgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbmV2ZXIgV2Vi
S2l0IHJlcXVlc3RzIHRvIG5hdmlnYXRlIFxhIGZyYW1lIHRvIHRoZSByZXNvdXJjZSBzcGVjaWZp
ZWQgYnkgXGEgcmVxdWVzdCBieSBtZWFucyBvZgorICAgIHRoZSBzcGVjaWZpZWQgbmF2aWdhdGlv
biB0eXBlIFxhIHR5cGUuCisKKyAgICBJZiBcYSBmcmFtZSBpcyBhIG51bGwgcG9pbnRlciB0aGVu
IG5hdmlnYXRpb24gdG8gYSBuZXcgd2luZG93IGlzIHJlcXVlc3RlZC4gSWYgdGhlIHJlcXVlc3Qg
aXMKKyAgICBhY2NlcHRlZCBjcmVhdGVXaW5kb3coKSB3aWxsIGJlIGNhbGxlZC4KKworICAgIFRo
ZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGludGVycHJldHMgdGhlIHBhZ2UncyBsaW5rRGVsZWdh
dGlvblBvbGljeSBhbmQgZW1pdHMgbGlua0NsaWNrZWQgYWNjb3JkaW5nbHkgb3IgcmV0dXJucyB0
cnVlCisgICAgdG8gbGV0IFFXZWJQYWdlIGhhbmRsZSB0aGUgbmF2aWdhdGlvbiBpdHNlbGYuCisK
KyAgICBcc2EgY3JlYXRlV2luZG93KCkKKyovCitib29sIFFXZWJQYWdlOjphY2NlcHROYXZpZ2F0
aW9uUmVxdWVzdChRV2ViRnJhbWUgKmZyYW1lLCBjb25zdCBRTmV0d29ya1JlcXVlc3QgJnJlcXVl
c3QsIFFXZWJQYWdlOjpOYXZpZ2F0aW9uVHlwZSB0eXBlKQoreworICAgIFFfVU5VU0VEKGZyYW1l
KTsKKyAgICBpZiAodHlwZSA9PSBOYXZpZ2F0aW9uVHlwZUxpbmtDbGlja2VkKSB7CisgICAgICAg
IHN3aXRjaCAoZC0+bGlua1BvbGljeSkgeworICAgICAgICBjYXNlIERvbnREZWxlZ2F0ZUxpbmtz
OgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgY2FzZSBEZWxlZ2F0ZUV4dGVy
bmFsTGlua3M6CisgICAgICAgICAgICBpZiAoUVdlYlBhZ2VBZGFwdGVyOjp0cmVhdFNjaGVtZUFz
TG9jYWwocmVxdWVzdC51cmwoKS5zY2hlbWUoKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgICAgICAgICBlbWl0IGxpbmtDbGlja2VkKHJlcXVlc3QudXJsKCkpOworICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGNhc2UgRGVsZWdhdGVBbGxMaW5rczoKKyAg
ICAgICAgICAgIGVtaXQgbGlua0NsaWNrZWQocmVxdWVzdC51cmwoKSk7CisgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8q
IQorICAgIFxwcm9wZXJ0eSBRV2ViUGFnZTo6aGFzU2VsZWN0aW9uCisgICAgXGJyaWVmIHdoZXRo
ZXIgdGhpcyBwYWdlIGNvbnRhaW5zIHNlbGVjdGVkIGNvbnRlbnQgb3Igbm90LgorCisgICAgXHNh
IHNlbGVjdGlvbkNoYW5nZWQoKQorKi8KK2Jvb2wgUVdlYlBhZ2U6Omhhc1NlbGVjdGlvbigpIGNv
bnN0Cit7CisgICAgZC0+Y3JlYXRlTWFpbkZyYW1lKCk7CisgICAgcmV0dXJuIGQtPmhhc1NlbGVj
dGlvbigpOworfQorCisvKiEKKyAgICBccHJvcGVydHkgUVdlYlBhZ2U6OnNlbGVjdGVkVGV4dAor
ICAgIFxicmllZiB0aGUgdGV4dCBjdXJyZW50bHkgc2VsZWN0ZWQKKworICAgIEJ5IGRlZmF1bHQs
IHRoaXMgcHJvcGVydHkgY29udGFpbnMgYW4gZW1wdHkgc3RyaW5nLgorCisgICAgXHNhIHNlbGVj
dGlvbkNoYW5nZWQoKSwgc2VsZWN0ZWRIdG1sKCkKKyovCitRU3RyaW5nIFFXZWJQYWdlOjpzZWxl
Y3RlZFRleHQoKSBjb25zdAoreworICAgIGQtPmNyZWF0ZU1haW5GcmFtZSgpOworICAgIHJldHVy
biBkLT5zZWxlY3RlZFRleHQoKTsKK30KKworLyohCisgICAgXHNpbmNlIDQuOAorICAgIFxwcm9w
ZXJ0eSBRV2ViUGFnZTo6c2VsZWN0ZWRIdG1sCisgICAgXGJyaWVmIHRoZSBIVE1MIGN1cnJlbnRs
eSBzZWxlY3RlZAorCisgICAgQnkgZGVmYXVsdCwgdGhpcyBwcm9wZXJ0eSBjb250YWlucyBhbiBl
bXB0eSBzdHJpbmcuCisKKyAgICBcc2Egc2VsZWN0aW9uQ2hhbmdlZCgpLCBzZWxlY3RlZFRleHQo
KQorKi8KK1FTdHJpbmcgUVdlYlBhZ2U6OnNlbGVjdGVkSHRtbCgpIGNvbnN0Cit7CisgICAgZC0+
Y3JlYXRlTWFpbkZyYW1lKCk7CisgICAgcmV0dXJuIGQtPnNlbGVjdGVkSHRtbCgpOworfQorCisj
aWZuZGVmIFFUX05PX0FDVElPTgorLyohCisgICBSZXR1cm5zIGEgUUFjdGlvbiBmb3IgdGhlIHNw
ZWNpZmllZCBXZWJBY3Rpb24gXGEgYWN0aW9uLgorCisgICBUaGUgYWN0aW9uIGlzIG93bmVkIGJ5
IHRoZSBRV2ViUGFnZSBidXQgeW91IGNhbiBjdXN0b21pemUgdGhlIGxvb2sgYnkKKyAgIGNoYW5n
aW5nIGl0cyBwcm9wZXJ0aWVzLgorCisgICBRV2ViUGFnZSBhbHNvIHRha2VzIGNhcmUgb2YgaW1w
bGVtZW50aW5nIHRoZSBhY3Rpb24sIHNvIHRoYXQgdXBvbgorICAgdHJpZ2dlcmluZyB0aGUgY29y
cmVzcG9uZGluZyBhY3Rpb24gaXMgcGVyZm9ybWVkIG9uIHRoZSBwYWdlLgorCisgICBcc2EgdHJp
Z2dlckFjdGlvbigpCisqLworUUFjdGlvbiAqUVdlYlBhZ2U6OmFjdGlvbihXZWJBY3Rpb24gYWN0
aW9uKSBjb25zdAoreworICAgIGlmIChhY3Rpb24gPT0gUVdlYlBhZ2U6Ok5vV2ViQWN0aW9uKQor
ICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoZC0+YWN0aW9uc1thY3Rpb25dKQorICAgICAgICBy
ZXR1cm4gZC0+YWN0aW9uc1thY3Rpb25dOworCisgICAgUVN0cmluZyB0ZXh0OworICAgIFFJY29u
IGljb247CisgICAgUVN0eWxlICpzdHlsZSA9IGQtPmNsaWVudCA/IGQtPmNsaWVudC0+c3R5bGUo
KSA6IHFBcHAtPnN0eWxlKCk7CisgICAgYm9vbCBjaGVja2FibGUgPSBmYWxzZTsKKyAgICBRV2Vi
UGFnZUFkYXB0ZXI6Ok1lbnVBY3Rpb24gbWFwcGVkQWN0aW9uID0gUVdlYlBhZ2VBZGFwdGVyOjpO
b0FjdGlvbjsKKworICAgIHN3aXRjaCAoYWN0aW9uKSB7CisgICAgLy8gdG8gYmUgZmV0Y2hlZCBm
cm9tIExvY2FsaXplZFN0cmluZ3NRdCB2aWEgdGhlIHBhZ2UgYWRhcHRlcgorICAgIGNhc2UgT3Bl
bkxpbms6CisgICAgY2FzZSBPcGVuTGlua0luTmV3V2luZG93OgorICAgIGNhc2UgT3BlbkZyYW1l
SW5OZXdXaW5kb3c6CisgICAgY2FzZSBPcGVuTGlua0luVGhpc1dpbmRvdzoKKyAgICBjYXNlIERv
d25sb2FkTGlua1RvRGlzazoKKyAgICBjYXNlIENvcHlMaW5rVG9DbGlwYm9hcmQ6CisgICAgY2Fz
ZSBPcGVuSW1hZ2VJbk5ld1dpbmRvdzoKKyAgICBjYXNlIERvd25sb2FkSW1hZ2VUb0Rpc2s6Cisg
ICAgY2FzZSBDb3B5SW1hZ2VUb0NsaXBib2FyZDoKKyAgICBjYXNlIENvcHlJbWFnZVVybFRvQ2xp
cGJvYXJkOgorICAgIGNhc2UgQ3V0OgorICAgIGNhc2UgQ29weToKKyAgICBjYXNlIFBhc3RlOgor
ICAgIGNhc2UgU2VsZWN0QWxsOgorICAgIGNhc2UgU2V0VGV4dERpcmVjdGlvbkRlZmF1bHQ6Cisg
ICAgY2FzZSBTZXRUZXh0RGlyZWN0aW9uTGVmdFRvUmlnaHQ6CisgICAgY2FzZSBTZXRUZXh0RGly
ZWN0aW9uUmlnaHRUb0xlZnQ6CisgICAgY2FzZSBUb2dnbGVCb2xkOgorICAgIGNhc2UgVG9nZ2xl
SXRhbGljOgorICAgIGNhc2UgVG9nZ2xlVW5kZXJsaW5lOgorICAgICAgICBtYXBwZWRBY3Rpb24g
PSBhZGFwdGVyTWVudUFjdGlvbkZvcldlYkFjdGlvbihhY3Rpb24pOworICAgICAgICBicmVhazsK
KyAgICBjYXNlIEluc3BlY3RFbGVtZW50OgorI2lmIEVOQUJMRShJTlNQRUNUT1IpCisgICAgICAg
IG1hcHBlZEFjdGlvbiA9IFFXZWJQYWdlQWRhcHRlcjo6SW5zcGVjdEVsZW1lbnQ7CisjZW5kaWYK
KyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLy8gaWNvbiBuZWVkZWQgYXMgd2VsbCwgbWFwIGJ5
IGhhbmQuCisgICAgY2FzZSBCYWNrOgorICAgICAgICBtYXBwZWRBY3Rpb24gPSBRV2ViUGFnZUFk
YXB0ZXI6OkJhY2s7CisgICAgICAgIGljb24gPSBzdHlsZS0+c3RhbmRhcmRJY29uKFFTdHlsZTo6
U1BfQXJyb3dCYWNrKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGb3J3YXJkOgorICAgICAg
ICBtYXBwZWRBY3Rpb24gPSBRV2ViUGFnZUFkYXB0ZXI6OkZvcndhcmQ7CisgICAgICAgIGljb24g
PSBzdHlsZS0+c3RhbmRhcmRJY29uKFFTdHlsZTo6U1BfQXJyb3dGb3J3YXJkKTsKKyAgICAgICAg
YnJlYWs7CisgICAgY2FzZSBTdG9wOgorICAgICAgICBtYXBwZWRBY3Rpb24gPSBRV2ViUGFnZUFk
YXB0ZXI6OlN0b3A7CisgICAgICAgIGljb24gPSBzdHlsZS0+c3RhbmRhcmRJY29uKFFTdHlsZTo6
U1BfQnJvd3NlclN0b3ApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJlbG9hZDoKKyAgICAg
ICAgbWFwcGVkQWN0aW9uID0gUVdlYlBhZ2VBZGFwdGVyOjpSZWxvYWQ7CisgICAgICAgIGljb24g
PSBzdHlsZS0+c3RhbmRhcmRJY29uKFFTdHlsZTo6U1BfQnJvd3NlclJlbG9hZCk7CisgICAgICAg
IGJyZWFrOworCisjaWZuZGVmIFFUX05PX1VORE9TVEFDSworICAgIGNhc2UgVW5kbzogeworICAg
ICAgICBRQWN0aW9uICphID0gdW5kb1N0YWNrKCktPmNyZWF0ZVVuZG9BY3Rpb24oZC0+cSk7Cisg
ICAgICAgIGQtPmFjdGlvbnNbYWN0aW9uXSA9IGE7CisgICAgICAgIHJldHVybiBhOworICAgIH0K
KyAgICBjYXNlIFJlZG86IHsKKyAgICAgICAgUUFjdGlvbiAqYSA9IHVuZG9TdGFjaygpLT5jcmVh
dGVSZWRvQWN0aW9uKGQtPnEpOworICAgICAgICBkLT5hY3Rpb25zW2FjdGlvbl0gPSBhOworICAg
ICAgICByZXR1cm4gYTsKKyAgICB9CisjZW5kaWYgLy8gUVRfTk9fVU5ET1NUQUNLCisgICAgICAg
IC8vIGluIHBsYWNlIGwxMG4KKyAgICAgICAgY2FzZSBNb3ZlVG9OZXh0Q2hhcjoKKyAgICAgICAg
ICAgIHRleHQgPSB0cigiTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBuZXh0IGNoYXJhY3RlciIpOwor
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTW92ZVRvUHJldmlvdXNDaGFyOgorICAg
ICAgICAgICAgdGV4dCA9IHRyKCJNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIHByZXZpb3VzIGNoYXJh
Y3RlciIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTW92ZVRvTmV4dFdvcmQ6
CisgICAgICAgICAgICB0ZXh0ID0gdHIoIk1vdmUgdGhlIGN1cnNvciB0byB0aGUgbmV4dCB3b3Jk
Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNb3ZlVG9QcmV2aW91c1dvcmQ6
CisgICAgICAgICAgICB0ZXh0ID0gdHIoIk1vdmUgdGhlIGN1cnNvciB0byB0aGUgcHJldmlvdXMg
d29yZCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTW92ZVRvTmV4dExpbmU6
CisgICAgICAgICAgICB0ZXh0ID0gdHIoIk1vdmUgdGhlIGN1cnNvciB0byB0aGUgbmV4dCBsaW5l
Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNb3ZlVG9QcmV2aW91c0xpbmU6
CisgICAgICAgICAgICB0ZXh0ID0gdHIoIk1vdmUgdGhlIGN1cnNvciB0byB0aGUgcHJldmlvdXMg
bGluZSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTW92ZVRvU3RhcnRPZkxp
bmU6CisgICAgICAgICAgICB0ZXh0ID0gdHIoIk1vdmUgdGhlIGN1cnNvciB0byB0aGUgc3RhcnQg
b2YgdGhlIGxpbmUiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1vdmVUb0Vu
ZE9mTGluZToKKyAgICAgICAgICAgIHRleHQgPSB0cigiTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBl
bmQgb2YgdGhlIGxpbmUiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1vdmVU
b1N0YXJ0T2ZCbG9jazoKKyAgICAgICAgICAgIHRleHQgPSB0cigiTW92ZSB0aGUgY3Vyc29yIHRv
IHRoZSBzdGFydCBvZiB0aGUgYmxvY2siKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBj
YXNlIE1vdmVUb0VuZE9mQmxvY2s6CisgICAgICAgICAgICB0ZXh0ID0gdHIoIk1vdmUgdGhlIGN1
cnNvciB0byB0aGUgZW5kIG9mIHRoZSBibG9jayIpOworICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgIGNhc2UgTW92ZVRvU3RhcnRPZkRvY3VtZW50OgorICAgICAgICAgICAgdGV4dCA9IHRyKCJN
b3ZlIHRoZSBjdXJzb3IgdG8gdGhlIHN0YXJ0IG9mIHRoZSBkb2N1bWVudCIpOworICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIGNhc2UgTW92ZVRvRW5kT2ZEb2N1bWVudDoKKyAgICAgICAgICAg
IHRleHQgPSB0cigiTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50Iik7
CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTZWxlY3ROZXh0Q2hhcjoKKyAgICAg
ICAgICAgIHRleHQgPSB0cigiU2VsZWN0IHRvIHRoZSBuZXh0IGNoYXJhY3RlciIpOworICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2VsZWN0UHJldmlvdXNDaGFyOgorICAgICAgICAg
ICAgdGV4dCA9IHRyKCJTZWxlY3QgdG8gdGhlIHByZXZpb3VzIGNoYXJhY3RlciIpOworICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2VsZWN0TmV4dFdvcmQ6CisgICAgICAgICAgICB0
ZXh0ID0gdHIoIlNlbGVjdCB0byB0aGUgbmV4dCB3b3JkIik7CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgY2FzZSBTZWxlY3RQcmV2aW91c1dvcmQ6CisgICAgICAgICAgICB0ZXh0ID0gdHIo
IlNlbGVjdCB0byB0aGUgcHJldmlvdXMgd29yZCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgIGNhc2UgU2VsZWN0TmV4dExpbmU6CisgICAgICAgICAgICB0ZXh0ID0gdHIoIlNlbGVjdCB0
byB0aGUgbmV4dCBsaW5lIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTZWxl
Y3RQcmV2aW91c0xpbmU6CisgICAgICAgICAgICB0ZXh0ID0gdHIoIlNlbGVjdCB0byB0aGUgcHJl
dmlvdXMgbGluZSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2VsZWN0U3Rh
cnRPZkxpbmU6CisgICAgICAgICAgICB0ZXh0ID0gdHIoIlNlbGVjdCB0byB0aGUgc3RhcnQgb2Yg
dGhlIGxpbmUiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNlbGVjdEVuZE9m
TGluZToKKyAgICAgICAgICAgIHRleHQgPSB0cigiU2VsZWN0IHRvIHRoZSBlbmQgb2YgdGhlIGxp
bmUiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNlbGVjdFN0YXJ0T2ZCbG9j
azoKKyAgICAgICAgICAgIHRleHQgPSB0cigiU2VsZWN0IHRvIHRoZSBzdGFydCBvZiB0aGUgYmxv
Y2siKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNlbGVjdEVuZE9mQmxvY2s6
CisgICAgICAgICAgICB0ZXh0ID0gdHIoIlNlbGVjdCB0byB0aGUgZW5kIG9mIHRoZSBibG9jayIp
OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2VsZWN0U3RhcnRPZkRvY3VtZW50
OgorICAgICAgICAgICAgdGV4dCA9IHRyKCJTZWxlY3QgdG8gdGhlIHN0YXJ0IG9mIHRoZSBkb2N1
bWVudCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2VsZWN0RW5kT2ZEb2N1
bWVudDoKKyAgICAgICAgICAgIHRleHQgPSB0cigiU2VsZWN0IHRvIHRoZSBlbmQgb2YgdGhlIGRv
Y3VtZW50Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEZWxldGVTdGFydE9m
V29yZDoKKyAgICAgICAgICAgIHRleHQgPSB0cigiRGVsZXRlIHRvIHRoZSBzdGFydCBvZiB0aGUg
d29yZCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRGVsZXRlRW5kT2ZXb3Jk
OgorICAgICAgICAgICAgdGV4dCA9IHRyKCJEZWxldGUgdG8gdGhlIGVuZCBvZiB0aGUgd29yZCIp
OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBJbnNlcnRQYXJhZ3JhcGhTZXBh
cmF0b3I6CisgICAgICAgICAgICB0ZXh0ID0gdHIoIkluc2VydCBhIG5ldyBwYXJhZ3JhcGgiKTsK
KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEluc2VydExpbmVTZXBhcmF0b3I6Cisg
ICAgICAgICAgICB0ZXh0ID0gdHIoIkluc2VydCBhIG5ldyBsaW5lIik7CisgICAgICAgICAgICBi
cmVhazsKKworICAgICAgICBjYXNlIFBhc3RlQW5kTWF0Y2hTdHlsZToKKyAgICAgICAgICAgIHRl
eHQgPSB0cigiUGFzdGUgYW5kIE1hdGNoIFN0eWxlIik7CisgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgY2FzZSBSZW1vdmVGb3JtYXQ6CisgICAgICAgICAgICB0ZXh0ID0gdHIoIlJlbW92ZSBm
b3JtYXR0aW5nIik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFRvZ2dsZVN0
cmlrZXRocm91Z2g6CisgICAgICAgICAgICB0ZXh0ID0gdHIoIlN0cmlrZXRocm91Z2giKTsKKyAg
ICAgICAgICAgIGNoZWNrYWJsZSA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
Y2FzZSBUb2dnbGVTdWJzY3JpcHQ6CisgICAgICAgICAgICB0ZXh0ID0gdHIoIlN1YnNjcmlwdCIp
OworICAgICAgICAgICAgY2hlY2thYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICBjYXNlIFRvZ2dsZVN1cGVyc2NyaXB0OgorICAgICAgICAgICAgdGV4dCA9IHRyKCJTdXBl
cnNjcmlwdCIpOworICAgICAgICAgICAgY2hlY2thYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICBjYXNlIEluc2VydFVub3JkZXJlZExpc3Q6CisgICAgICAgICAgICB0ZXh0
ID0gdHIoIkluc2VydCBCdWxsZXRlZCBMaXN0Iik7CisgICAgICAgICAgICBjaGVja2FibGUgPSB0
cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSW5zZXJ0T3JkZXJlZExpc3Q6
CisgICAgICAgICAgICB0ZXh0ID0gdHIoIkluc2VydCBOdW1iZXJlZCBMaXN0Iik7CisgICAgICAg
ICAgICBjaGVja2FibGUgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Ug
SW5kZW50OgorICAgICAgICAgICAgdGV4dCA9IHRyKCJJbmRlbnQiKTsKKyAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICBjYXNlIE91dGRlbnQ6CisgICAgICAgICAgICB0ZXh0ID0gdHIoIk91dGRl
bnQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFsaWduQ2VudGVyOgorICAg
ICAgICAgICAgdGV4dCA9IHRyKCJDZW50ZXIiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICBjYXNlIEFsaWduSnVzdGlmaWVkOgorICAgICAgICAgICAgdGV4dCA9IHRyKCJKdXN0aWZ5Iik7
CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBbGlnbkxlZnQ6CisgICAgICAgICAg
ICB0ZXh0ID0gdHIoIkFsaWduIExlZnQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBj
YXNlIEFsaWduUmlnaHQ6CisgICAgICAgICAgICB0ZXh0ID0gdHIoIkFsaWduIFJpZ2h0Iik7Cisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBOb1dlYkFjdGlvbjoKKyAgICAgICAgICAg
IHJldHVybiAwOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQor
ICAgIGlmIChtYXBwZWRBY3Rpb24gIT0gUVdlYlBhZ2VBZGFwdGVyOjpOb0FjdGlvbikKKyAgICAg
ICAgdGV4dCA9IGQtPmNvbnRleHRNZW51SXRlbVRhZ0ZvckFjdGlvbihtYXBwZWRBY3Rpb24sICZj
aGVja2FibGUpOworCisgICAgaWYgKHRleHQuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gMDsK
KworICAgIFFBY3Rpb24gKmEgPSBuZXcgUUFjdGlvbihkLT5xKTsKKyAgICBhLT5zZXRUZXh0KHRl
eHQpOworICAgIGEtPnNldERhdGEoYWN0aW9uKTsKKyAgICBhLT5zZXRDaGVja2FibGUoY2hlY2th
YmxlKTsKKyAgICBhLT5zZXRJY29uKGljb24pOworCisgICAgY29ubmVjdChhLCBTSUdOQUwodHJp
Z2dlcmVkKGJvb2wpKSwKKyAgICAgICAgdGhpcywgU0xPVChfcV93ZWJBY3Rpb25UcmlnZ2VyZWQo
Ym9vbCkpKTsKKworICAgIGQtPmFjdGlvbnNbYWN0aW9uXSA9IGE7CisgICAgZC0+dXBkYXRlQWN0
aW9uKGFjdGlvbik7CisgICAgcmV0dXJuIGE7Cit9CisjZW5kaWYgLy8gUVRfTk9fQUNUSU9OCisK
Ky8qIQorICAgIFxwcm9wZXJ0eSBRV2ViUGFnZTo6bW9kaWZpZWQKKyAgICBcYnJpZWYgd2hldGhl
ciB0aGUgcGFnZSBjb250YWlucyB1bnN1Ym1pdHRlZCBmb3JtIGRhdGEsIG9yIHRoZSBjb250ZW50
cyBoYXZlIGJlZW4gY2hhbmdlZC4KKworICAgIEJ5IGRlZmF1bHQsIHRoaXMgcHJvcGVydHkgaXMg
ZmFsc2UuCisKKyAgICBcc2EgY29udGVudHNDaGFuZ2VkKCksIGNvbnRlbnRFZGl0YWJsZSwgdW5k
b1N0YWNrKCkKKyovCitib29sIFFXZWJQYWdlOjppc01vZGlmaWVkKCkgY29uc3QKK3sKKyNpZmRl
ZiBRVF9OT19VTkRPU1RBQ0sKKyAgICByZXR1cm4gZmFsc2U7CisjZWxzZQorICAgIGlmICghZC0+
dW5kb1N0YWNrKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIGQtPnVuZG9TdGFj
ay0+Y2FuVW5kbygpOworI2VuZGlmIC8vIFFUX05PX1VORE9TVEFDSworfQorCisjaWZuZGVmIFFU
X05PX1VORE9TVEFDSworLyohCisgICAgUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHVuZG8gc3Rh
Y2sgdXNlZCBmb3IgZWRpdGFibGUgY29udGVudC4KKworICAgIFxzYSBtb2RpZmllZAorKi8KK1FV
bmRvU3RhY2sgKlFXZWJQYWdlOjp1bmRvU3RhY2soKSBjb25zdAoreworICAgIGlmICghZC0+dW5k
b1N0YWNrKQorICAgICAgICBkLT51bmRvU3RhY2sgPSBuZXcgUVVuZG9TdGFjayhjb25zdF9jYXN0
PFFXZWJQYWdlICo+KHRoaXMpKTsKKworICAgIHJldHVybiBkLT51bmRvU3RhY2s7Cit9CisjZW5k
aWYgLy8gUVRfTk9fVU5ET1NUQUNLCisKKy8qISBccmVpbXAKKyovCitib29sIFFXZWJQYWdlOjpl
dmVudChRRXZlbnQgKmV2KQoreworICAgIHN3aXRjaCAoZXYtPnR5cGUoKSkgeworICAgIGNhc2Ug
UUV2ZW50OjpUaW1lcjoKKyAgICAgICAgZC0+dGltZXJFdmVudChzdGF0aWNfY2FzdDxRVGltZXJF
dmVudCo+KGV2KSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUV2ZW50OjpNb3VzZU1vdmU6
CisgICAgICAgIGQtPm1vdXNlTW92ZUV2ZW50KHN0YXRpY19jYXN0PFFNb3VzZUV2ZW50Kj4oZXYp
KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRRXZlbnQ6Ok1vdXNlQnV0dG9uUHJlc3M6Cisg
ICAgICAgIGQtPm1vdXNlUHJlc3NFdmVudChzdGF0aWNfY2FzdDxRTW91c2VFdmVudCo+KGV2KSk7
CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUV2ZW50OjpNb3VzZUJ1dHRvbkRibENsaWNrOgor
ICAgICAgICBkLT5tb3VzZURvdWJsZUNsaWNrRXZlbnQoc3RhdGljX2Nhc3Q8UU1vdXNlRXZlbnQq
PihldikpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFFFdmVudDo6TW91c2VCdXR0b25SZWxl
YXNlOgorICAgICAgICBkLT5tb3VzZVJlbGVhc2VFdmVudChzdGF0aWNfY2FzdDxRTW91c2VFdmVu
dCo+KGV2KSk7CisgICAgICAgIGJyZWFrOworI2lmICFkZWZpbmVkKFFUX05PX0dSQVBISUNTVklF
VykKKyAgICBjYXNlIFFFdmVudDo6R3JhcGhpY3NTY2VuZU1vdXNlTW92ZTogeworICAgICAgICBR
R3JhcGhpY3NTY2VuZU1vdXNlRXZlbnQgKmdzRXYgPSBzdGF0aWNfY2FzdDxRR3JhcGhpY3NTY2Vu
ZU1vdXNlRXZlbnQqPihldik7CisgICAgICAgIFFNb3VzZUV2ZW50IGR1bW15RXZlbnQoUUV2ZW50
OjpNb3VzZU1vdmUsIGdzRXYtPnBvcygpLCBnc0V2LT5zY3JlZW5Qb3MoKSwgZ3NFdi0+YnV0dG9u
KCksIGdzRXYtPmJ1dHRvbnMoKSwgZ3NFdi0+bW9kaWZpZXJzKCkpOworICAgICAgICBkLT5tb3Vz
ZU1vdmVFdmVudCgmZHVtbXlFdmVudCk7CisgICAgICAgIGV2LT5zZXRBY2NlcHRlZChkdW1teUV2
ZW50LmlzQWNjZXB0ZWQoKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFFFdmVu
dDo6R3JhcGhpY3NTY2VuZU1vdXNlUmVsZWFzZTogeworICAgICAgICBRR3JhcGhpY3NTY2VuZU1v
dXNlRXZlbnQgKmdzRXYgPSBzdGF0aWNfY2FzdDxRR3JhcGhpY3NTY2VuZU1vdXNlRXZlbnQqPihl
dik7CisgICAgICAgIFFNb3VzZUV2ZW50IGR1bW15RXZlbnQoUUV2ZW50OjpNb3VzZUJ1dHRvblJl
bGVhc2UsIGdzRXYtPnBvcygpLCBnc0V2LT5zY3JlZW5Qb3MoKSwgZ3NFdi0+YnV0dG9uKCksIGdz
RXYtPmJ1dHRvbnMoKSwgZ3NFdi0+bW9kaWZpZXJzKCkpOworICAgICAgICBkLT5hZGp1c3RQb2lu
dEZvckNsaWNraW5nKCZkdW1teUV2ZW50KTsKKyAgICAgICAgZC0+bW91c2VSZWxlYXNlRXZlbnQo
JmR1bW15RXZlbnQpOworICAgICAgICBldi0+c2V0QWNjZXB0ZWQoZHVtbXlFdmVudC5pc0FjY2Vw
dGVkKCkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBRRXZlbnQ6OkdyYXBoaWNz
U2NlbmVNb3VzZVByZXNzOiB7CisgICAgICAgIFFHcmFwaGljc1NjZW5lTW91c2VFdmVudCAqZ3NF
diA9IHN0YXRpY19jYXN0PFFHcmFwaGljc1NjZW5lTW91c2VFdmVudCo+KGV2KTsKKyAgICAgICAg
UU1vdXNlRXZlbnQgZHVtbXlFdmVudChRRXZlbnQ6Ok1vdXNlQnV0dG9uUHJlc3MsIGdzRXYtPnBv
cygpLCBnc0V2LT5zY3JlZW5Qb3MoKSwgZ3NFdi0+YnV0dG9uKCksIGdzRXYtPmJ1dHRvbnMoKSwg
Z3NFdi0+bW9kaWZpZXJzKCkpOworICAgICAgICBkLT5hZGp1c3RQb2ludEZvckNsaWNraW5nKCZk
dW1teUV2ZW50KTsKKyAgICAgICAgZC0+bW91c2VQcmVzc0V2ZW50KCZkdW1teUV2ZW50KTsKKyAg
ICAgICAgZXYtPnNldEFjY2VwdGVkKGR1bW15RXZlbnQuaXNBY2NlcHRlZCgpKTsKKyAgICAgICAg
YnJlYWs7CisgICAgfQorICAgIGNhc2UgUUV2ZW50OjpHcmFwaGljc1NjZW5lTW91c2VEb3VibGVD
bGljazogeworICAgICAgICBRR3JhcGhpY3NTY2VuZU1vdXNlRXZlbnQgKmdzRXYgPSBzdGF0aWNf
Y2FzdDxRR3JhcGhpY3NTY2VuZU1vdXNlRXZlbnQqPihldik7CisgICAgICAgIFFNb3VzZUV2ZW50
IGR1bW15RXZlbnQoUUV2ZW50OjpNb3VzZUJ1dHRvbkRibENsaWNrLCBnc0V2LT5wb3MoKSwgZ3NF
di0+c2NyZWVuUG9zKCksIGdzRXYtPmJ1dHRvbigpLCBnc0V2LT5idXR0b25zKCksIGdzRXYtPm1v
ZGlmaWVycygpKTsKKyAgICAgICAgZC0+YWRqdXN0UG9pbnRGb3JDbGlja2luZygmZHVtbXlFdmVu
dCk7CisgICAgICAgIGQtPm1vdXNlRG91YmxlQ2xpY2tFdmVudCgmZHVtbXlFdmVudCk7CisgICAg
ICAgIGV2LT5zZXRBY2NlcHRlZChkdW1teUV2ZW50LmlzQWNjZXB0ZWQoKSk7CisgICAgICAgIGJy
ZWFrOworICAgIH0KKyNlbmRpZgorI2lmbmRlZiBRVF9OT19DT05URVhUTUVOVQorICAgIGNhc2Ug
UUV2ZW50OjpDb250ZXh0TWVudToKKyAgICAgICAgZC0+Y29udGV4dE1lbnVFdmVudChzdGF0aWNf
Y2FzdDxRQ29udGV4dE1lbnVFdmVudCo+KGV2KS0+Z2xvYmFsUG9zKCkpOworICAgICAgICBicmVh
azsKKyNpZiAhZGVmaW5lZChRVF9OT19HUkFQSElDU1ZJRVcpCisgICAgY2FzZSBRRXZlbnQ6Okdy
YXBoaWNzU2NlbmVDb250ZXh0TWVudToKKyAgICAgICAgZC0+Y29udGV4dE1lbnVFdmVudChzdGF0
aWNfY2FzdDxRR3JhcGhpY3NTY2VuZUNvbnRleHRNZW51RXZlbnQqPihldiktPnNjcmVlblBvcygp
KTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBRVF9OT19XSEVFTEVW
RU5UCisgICAgY2FzZSBRRXZlbnQ6OldoZWVsOgorICAgICAgICBkLT53aGVlbEV2ZW50KHN0YXRp
Y19jYXN0PFFXaGVlbEV2ZW50Kj4oZXYpLCBRQXBwbGljYXRpb246OndoZWVsU2Nyb2xsTGluZXMo
KSk7CisgICAgICAgIGJyZWFrOworI2lmICFkZWZpbmVkKFFUX05PX0dSQVBISUNTVklFVykKKyAg
ICBjYXNlIFFFdmVudDo6R3JhcGhpY3NTY2VuZVdoZWVsOiB7CisgICAgICAgIFFHcmFwaGljc1Nj
ZW5lV2hlZWxFdmVudCAqZ3NFdiA9IHN0YXRpY19jYXN0PFFHcmFwaGljc1NjZW5lV2hlZWxFdmVu
dCo+KGV2KTsKKyAgICAgICAgUVdoZWVsRXZlbnQgZHVtbXlFdmVudChnc0V2LT5wb3MoKSwgZ3NF
di0+c2NyZWVuUG9zKCksIGdzRXYtPmRlbHRhKCksIGdzRXYtPmJ1dHRvbnMoKSwgZ3NFdi0+bW9k
aWZpZXJzKCksIGdzRXYtPm9yaWVudGF0aW9uKCkpOworICAgICAgICBkLT53aGVlbEV2ZW50KCZk
dW1teUV2ZW50LCBRQXBwbGljYXRpb246OndoZWVsU2Nyb2xsTGluZXMoKSk7CisgICAgICAgIGV2
LT5zZXRBY2NlcHRlZChkdW1teUV2ZW50LmlzQWNjZXB0ZWQoKSk7CisgICAgICAgIGJyZWFrOwor
ICAgIH0KKyNlbmRpZgorI2VuZGlmCisgICAgY2FzZSBRRXZlbnQ6OktleVByZXNzOgorICAgICAg
ICBkLT5rZXlQcmVzc0V2ZW50KHN0YXRpY19jYXN0PFFLZXlFdmVudCo+KGV2KSk7CisgICAgICAg
IGJyZWFrOworICAgIGNhc2UgUUV2ZW50OjpLZXlSZWxlYXNlOgorICAgICAgICBkLT5rZXlSZWxl
YXNlRXZlbnQoc3RhdGljX2Nhc3Q8UUtleUV2ZW50Kj4oZXYpKTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgY2FzZSBRRXZlbnQ6OkZvY3VzSW46CisgICAgICAgIGQtPmZvY3VzSW5FdmVudChzdGF0aWNf
Y2FzdDxRRm9jdXNFdmVudCo+KGV2KSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUV2ZW50
OjpGb2N1c091dDoKKyAgICAgICAgZC0+Zm9jdXNPdXRFdmVudChzdGF0aWNfY2FzdDxRRm9jdXNF
dmVudCo+KGV2KSk7CisgICAgICAgIGJyZWFrOworI2lmbmRlZiBRVF9OT19EUkFHQU5ERFJPUAor
ICAgIGNhc2UgUUV2ZW50OjpEcmFnRW50ZXI6CisgICAgICAgIGQtPmRyYWdFbnRlckV2ZW50KHN0
YXRpY19jYXN0PFFEcmFnRW50ZXJFdmVudCo+KGV2KSk7CisgICAgICAgIGJyZWFrOworICAgIGNh
c2UgUUV2ZW50OjpEcmFnTGVhdmU6CisgICAgICAgIGQtPmRyYWdMZWF2ZUV2ZW50KCk7CisgICAg
ICAgIGV2LT5hY2NlcHQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRRXZlbnQ6OkRyYWdN
b3ZlOgorICAgICAgICBkLT5kcmFnTW92ZUV2ZW50KHN0YXRpY19jYXN0PFFEcmFnTW92ZUV2ZW50
Kj4oZXYpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRRXZlbnQ6OkRyb3A6CisgICAgICAg
IGQtPmRyb3BFdmVudChzdGF0aWNfY2FzdDxRRHJvcEV2ZW50Kj4oZXYpKTsKKyAgICAgICAgYnJl
YWs7CisjaWYgIWRlZmluZWQoUVRfTk9fR1JBUEhJQ1NWSUVXKQorICAgIGNhc2UgUUV2ZW50OjpH
cmFwaGljc1NjZW5lRHJhZ0VudGVyOgorICAgICAgICBkLT5kcmFnRW50ZXJFdmVudChzdGF0aWNf
Y2FzdDxRR3JhcGhpY3NTY2VuZURyYWdEcm9wRXZlbnQqPihldikpOworICAgICAgICBicmVhazsK
KyAgICBjYXNlIFFFdmVudDo6R3JhcGhpY3NTY2VuZURyYWdNb3ZlOgorICAgICAgICBkLT5kcmFn
TW92ZUV2ZW50KHN0YXRpY19jYXN0PFFHcmFwaGljc1NjZW5lRHJhZ0Ryb3BFdmVudCo+KGV2KSk7
CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUV2ZW50OjpHcmFwaGljc1NjZW5lRHJhZ0xlYXZl
OgorICAgICAgICBkLT5kcmFnTGVhdmVFdmVudCgpOworICAgICAgICBldi0+YWNjZXB0KCk7Cisg
ICAgICAgIGJyZWFrOworICAgIGNhc2UgUUV2ZW50OjpHcmFwaGljc1NjZW5lRHJvcDoKKyAgICAg
ICAgZC0+ZHJvcEV2ZW50KHN0YXRpY19jYXN0PFFHcmFwaGljc1NjZW5lRHJhZ0Ryb3BFdmVudCo+
KGV2KSk7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisKKyNlbmRpZgorICAgIGNhc2UgUUV2ZW50
OjpJbnB1dE1ldGhvZDoKKyAgICAgICAgZC0+aW5wdXRNZXRob2RFdmVudChzdGF0aWNfY2FzdDxR
SW5wdXRNZXRob2RFdmVudCo+KGV2KSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUUV2ZW50
OjpTaG9ydGN1dE92ZXJyaWRlOgorICAgICAgICBkLT5zaG9ydGN1dE92ZXJyaWRlRXZlbnQoc3Rh
dGljX2Nhc3Q8UUtleUV2ZW50Kj4oZXYpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBRRXZl
bnQ6OkxlYXZlOgorICAgICAgICBkLT5sZWF2ZUV2ZW50KGV2KTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgY2FzZSBRRXZlbnQ6OlRvdWNoQmVnaW46CisgICAgY2FzZSBRRXZlbnQ6OlRvdWNoVXBkYXRl
OgorICAgIGNhc2UgUUV2ZW50OjpUb3VjaEVuZDoKKyAgICBjYXNlIFFFdmVudDo6VG91Y2hDYW5j
ZWw6CisgICAgICAgIC8vIFJldHVybiB3aGV0aGVyIHRoZSBkZWZhdWx0IGFjdGlvbiB3YXMgY2Fu
Y2VsbGVkIGluIHRoZSBKUyBldmVudCBoYW5kbGVyCisgICAgICAgIHJldHVybiBkLT50b3VjaEV2
ZW50KHN0YXRpY19jYXN0PFFUb3VjaEV2ZW50Kj4oZXYpKTsKKyNpZm5kZWYgUVRfTk9fR0VTVFVS
RVMKKyAgICBjYXNlIFFFdmVudDo6R2VzdHVyZToKKyAgICAgICAgZC0+Z2VzdHVyZUV2ZW50KHN0
YXRpY19jYXN0PFFHZXN0dXJlRXZlbnQqPihldikpOworICAgICAgICBicmVhazsKKyNlbmRpZgor
I2lmbmRlZiBRVF9OT19QUk9QRVJUSUVTCisgICAgY2FzZSBRRXZlbnQ6OkR5bmFtaWNQcm9wZXJ0
eUNoYW5nZToKKyAgICAgICAgZC0+ZHluYW1pY1Byb3BlcnR5Q2hhbmdlRXZlbnQodGhpcywgc3Rh
dGljX2Nhc3Q8UUR5bmFtaWNQcm9wZXJ0eUNoYW5nZUV2ZW50Kj4oZXYpKTsKKyAgICAgICAgYnJl
YWs7CisjZW5kaWYKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gUU9iamVjdDo6ZXZlbnQo
ZXYpOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCisvKiEKKyAgICBTaW1pbGFyIHRv
IFFXaWRnZXQ6OmZvY3VzTmV4dFByZXZDaGlsZCgpIGl0IGZvY3VzZXMgdGhlIG5leHQgZm9jdXNh
YmxlIHdlYiBlbGVtZW50CisgICAgaWYgXGEgbmV4dCBpcyB0cnVlOyBvdGhlcndpc2UgdGhlIHBy
ZXZpb3VzIGVsZW1lbnQgaXMgZm9jdXNlZC4KKworICAgIFJldHVybnMgdHJ1ZSBpZiBpdCBjYW4g
ZmluZCBhIG5ldyBmb2N1c2FibGUgZWxlbWVudCwgb3IgZmFsc2UgaWYgaXQgY2FuJ3QuCisqLwor
Ym9vbCBRV2ViUGFnZTo6Zm9jdXNOZXh0UHJldkNoaWxkKGJvb2wgbmV4dCkKK3sKKyAgICBRS2V5
RXZlbnQgZXYoUUV2ZW50OjpLZXlQcmVzcywgUXQ6OktleV9UYWIsIFF0OjpLZXlib2FyZE1vZGlm
aWVycyhuZXh0ID8gUXQ6Ok5vTW9kaWZpZXIgOiBRdDo6U2hpZnRNb2RpZmllcikpOworICAgIGQt
PmtleVByZXNzRXZlbnQoJmV2KTsKKyAgICByZXR1cm4gZC0+aGFzRm9jdXNlZE5vZGUoKTsKK30K
KworLyohCisgICAgXHByb3BlcnR5IFFXZWJQYWdlOjpjb250ZW50RWRpdGFibGUKKyAgICBcYnJp
ZWYgd2hldGhlciB0aGUgY29udGVudCBpbiB0aGlzIFFXZWJQYWdlIGlzIGVkaXRhYmxlIG9yIG5v
dAorICAgIFxzaW5jZSA0LjUKKworICAgIElmIHRoaXMgcHJvcGVydHkgaXMgZW5hYmxlZCB0aGUg
Y29udGVudHMgb2YgdGhlIHBhZ2UgY2FuIGJlIGVkaXRlZCBieSB0aGUgdXNlciB0aHJvdWdoIGEg
dmlzaWJsZQorICAgIGN1cnNvci4gSWYgZGlzYWJsZWQgKHRoZSBkZWZhdWx0KSBvbmx5IEhUTUwg
ZWxlbWVudHMgaW4gdGhlIHdlYiBwYWdlIHdpdGggdGhlaXIKKyAgICBcY3tjb250ZW50ZWRpdGFi
bGV9IGF0dHJpYnV0ZSBzZXQgYXJlIGVkaXRhYmxlLgorCisgICAgXHNhIG1vZGlmaWVkLCBjb250
ZW50c0NoYW5nZWQoKSwgV2ViQWN0aW9uCisqLwordm9pZCBRV2ViUGFnZTo6c2V0Q29udGVudEVk
aXRhYmxlKGJvb2wgZWRpdGFibGUpCit7CisgICAgaWYgKGlzQ29udGVudEVkaXRhYmxlKCkgIT0g
ZWRpdGFibGUpIHsKKyAgICAgICAgZC0+c2V0Q29udGVudEVkaXRhYmxlKGVkaXRhYmxlKTsKKyAg
ICAgICAgZC0+dXBkYXRlRWRpdG9yQWN0aW9ucygpOworICAgIH0KK30KKworYm9vbCBRV2ViUGFn
ZTo6aXNDb250ZW50RWRpdGFibGUoKSBjb25zdAoreworICAgIHJldHVybiBkLT5pc0NvbnRlbnRF
ZGl0YWJsZSgpOworfQorCisvKiEKKyAgICBccHJvcGVydHkgUVdlYlBhZ2U6OmZvcndhcmRVbnN1
cHBvcnRlZENvbnRlbnQKKyAgICBcYnJpZWYgd2hldGhlciBRV2ViUGFnZSBzaG91bGQgZm9yd2Fy
ZCB1bnN1cHBvcnRlZCBjb250ZW50CisKKyAgICBJZiBlbmFibGVkLCB0aGUgdW5zdXBwb3J0ZWRD
b250ZW50KCkgc2lnbmFsIGlzIGVtaXR0ZWQgd2l0aCBhIG5ldHdvcmsgcmVwbHkgdGhhdAorICAg
IGNhbiBiZSB1c2VkIHRvIHJlYWQgdGhlIGNvbnRlbnQuCisKKyAgICBJZiBkaXNhYmxlZCwgdGhl
IGRvd25sb2FkIG9mIHN1Y2ggY29udGVudCBpcyBhYm9ydGVkIGltbWVkaWF0ZWx5LgorCisgICAg
QnkgZGVmYXVsdCB1bnN1cHBvcnRlZCBjb250ZW50IGlzIG5vdCBmb3J3YXJkZWQuCisqLworCit2
b2lkIFFXZWJQYWdlOjpzZXRGb3J3YXJkVW5zdXBwb3J0ZWRDb250ZW50KGJvb2wgZm9yd2FyZCkK
K3sKKyAgICBkLT5mb3J3YXJkVW5zdXBwb3J0ZWRDb250ZW50ID0gZm9yd2FyZDsKK30KKworYm9v
bCBRV2ViUGFnZTo6Zm9yd2FyZFVuc3VwcG9ydGVkQ29udGVudCgpIGNvbnN0Cit7CisgICAgcmV0
dXJuIGQtPmZvcndhcmRVbnN1cHBvcnRlZENvbnRlbnQ7Cit9CisKKy8qIQorICAgIFxwcm9wZXJ0
eSBRV2ViUGFnZTo6bGlua0RlbGVnYXRpb25Qb2xpY3kKKyAgICBcYnJpZWYgaG93IFFXZWJQYWdl
IHNob3VsZCBkZWxlZ2F0ZSB0aGUgaGFuZGxpbmcgb2YgbGlua3MgdGhyb3VnaCB0aGUKKyAgICBs
aW5rQ2xpY2tlZCgpIHNpZ25hbAorCisgICAgVGhlIGRlZmF1bHQgaXMgdG8gZGVsZWdhdGUgbm8g
bGlua3MuCisqLworCit2b2lkIFFXZWJQYWdlOjpzZXRMaW5rRGVsZWdhdGlvblBvbGljeShMaW5r
RGVsZWdhdGlvblBvbGljeSBwb2xpY3kpCit7CisgICAgZC0+bGlua1BvbGljeSA9IHBvbGljeTsK
K30KKworUVdlYlBhZ2U6OkxpbmtEZWxlZ2F0aW9uUG9saWN5IFFXZWJQYWdlOjpsaW5rRGVsZWdh
dGlvblBvbGljeSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGQtPmxpbmtQb2xpY3k7Cit9CisKKyNp
Zm5kZWYgUVRfTk9fQ09OVEVYVE1FTlUKKworYm9vbCBRV2ViUGFnZVByaXZhdGU6OmhhbmRsZVNj
cm9sbGJhckNvbnRleHRNZW51RXZlbnQoUUNvbnRleHRNZW51RXZlbnQqIGV2ZW50LCBib29sIGhv
cml6b250YWwsIFFXZWJQYWdlQWRhcHRlcjo6U2Nyb2xsRGlyZWN0aW9uKiBkaXJlY3Rpb24sIFFX
ZWJQYWdlQWRhcHRlcjo6U2Nyb2xsR3JhbnVsYXJpdHkqIGdyYW51bGFyaXR5KQoreworICAgIGlm
ICghUUFwcGxpY2F0aW9uOjpzdHlsZSgpLT5zdHlsZUhpbnQoUVN0eWxlOjpTSF9TY3JvbGxCYXJf
Q29udGV4dE1lbnUpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBRTWVudSBtZW51Owor
ICAgIFFBY3Rpb24qIGFjdFNjcm9sbEhlcmUgPSBtZW51LmFkZEFjdGlvbihRQ29yZUFwcGxpY2F0
aW9uOjp0cmFuc2xhdGUoIlFXZWJQYWdlIiwgIlNjcm9sbCBoZXJlIikpOworICAgIG1lbnUuYWRk
U2VwYXJhdG9yKCk7CisKKyAgICBRQWN0aW9uKiBhY3RTY3JvbGxUb3AgPSBtZW51LmFkZEFjdGlv
bihob3Jpem9udGFsID8gUUNvcmVBcHBsaWNhdGlvbjo6dHJhbnNsYXRlKCJRV2ViUGFnZSIsICJM
ZWZ0IGVkZ2UiKSA6IFFDb3JlQXBwbGljYXRpb246OnRyYW5zbGF0ZSgiUVdlYlBhZ2UiLCAiVG9w
IikpOworICAgIFFBY3Rpb24qIGFjdFNjcm9sbEJvdHRvbSA9IG1lbnUuYWRkQWN0aW9uKGhvcml6
b250YWwgPyBRQ29yZUFwcGxpY2F0aW9uOjp0cmFuc2xhdGUoIlFXZWJQYWdlIiwgIlJpZ2h0IGVk
Z2UiKSA6IFFDb3JlQXBwbGljYXRpb246OnRyYW5zbGF0ZSgiUVdlYlBhZ2UiLCAiQm90dG9tIikp
OworICAgIG1lbnUuYWRkU2VwYXJhdG9yKCk7CisKKyAgICBRQWN0aW9uKiBhY3RQYWdlVXAgPSBt
ZW51LmFkZEFjdGlvbihob3Jpem9udGFsID8gUUNvcmVBcHBsaWNhdGlvbjo6dHJhbnNsYXRlKCJR
V2ViUGFnZSIsICJQYWdlIGxlZnQiKSA6IFFDb3JlQXBwbGljYXRpb246OnRyYW5zbGF0ZSgiUVdl
YlBhZ2UiLCAiUGFnZSB1cCIpKTsKKyAgICBRQWN0aW9uKiBhY3RQYWdlRG93biA9IG1lbnUuYWRk
QWN0aW9uKGhvcml6b250YWwgPyBRQ29yZUFwcGxpY2F0aW9uOjp0cmFuc2xhdGUoIlFXZWJQYWdl
IiwgIlBhZ2UgcmlnaHQiKSA6IFFDb3JlQXBwbGljYXRpb246OnRyYW5zbGF0ZSgiUVdlYlBhZ2Ui
LCAiUGFnZSBkb3duIikpOworICAgIG1lbnUuYWRkU2VwYXJhdG9yKCk7CisKKyAgICBRQWN0aW9u
KiBhY3RTY3JvbGxVcCA9IG1lbnUuYWRkQWN0aW9uKGhvcml6b250YWwgPyBRQ29yZUFwcGxpY2F0
aW9uOjp0cmFuc2xhdGUoIlFXZWJQYWdlIiwgIlNjcm9sbCBsZWZ0IikgOiBRQ29yZUFwcGxpY2F0
aW9uOjp0cmFuc2xhdGUoIlFXZWJQYWdlIiwgIlNjcm9sbCB1cCIpKTsKKyAgICBRQWN0aW9uKiBh
Y3RTY3JvbGxEb3duID0gbWVudS5hZGRBY3Rpb24oaG9yaXpvbnRhbCA/IFFDb3JlQXBwbGljYXRp
b246OnRyYW5zbGF0ZSgiUVdlYlBhZ2UiLCAiU2Nyb2xsIHJpZ2h0IikgOiBRQ29yZUFwcGxpY2F0
aW9uOjp0cmFuc2xhdGUoIlFXZWJQYWdlIiwgIlNjcm9sbCBkb3duIikpOworCisgICAgUUFjdGlv
biogYWN0aW9uU2VsZWN0ZWQgPSBtZW51LmV4ZWMoZXZlbnQtPmdsb2JhbFBvcygpKTsKKworICAg
IGlmIChhY3Rpb25TZWxlY3RlZCA9PSBhY3RTY3JvbGxIZXJlKQorICAgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICBpZiAoYWN0aW9uU2VsZWN0ZWQgPT0gYWN0U2Nyb2xsVG9wKSB7CisgICAgICAgICpk
aXJlY3Rpb24gPSBob3Jpem9udGFsID8gU2Nyb2xsTGVmdCA6IFNjcm9sbFVwOworICAgICAgICAq
Z3JhbnVsYXJpdHkgPSBTY3JvbGxCeURvY3VtZW50OworICAgIH0gZWxzZSBpZiAoYWN0aW9uU2Vs
ZWN0ZWQgPT0gYWN0U2Nyb2xsQm90dG9tKSB7CisgICAgICAgICpkaXJlY3Rpb24gPWhvcml6b250
YWwgPyBTY3JvbGxSaWdodCA6IFNjcm9sbERvd247CisgICAgICAgICpncmFudWxhcml0eSA9IFNj
cm9sbEJ5RG9jdW1lbnQ7CisgICAgfSBlbHNlIGlmIChhY3Rpb25TZWxlY3RlZCA9PSBhY3RQYWdl
VXApIHsKKyAgICAgICAgKmRpcmVjdGlvbiA9IGhvcml6b250YWwgPyBTY3JvbGxMZWZ0IDogU2Ny
b2xsVXA7CisgICAgICAgICpncmFudWxhcml0eSA9IFNjcm9sbEJ5UGFnZTsKKyAgICB9IGVsc2Ug
aWYgKGFjdGlvblNlbGVjdGVkID09IGFjdFBhZ2VEb3duKSB7CisgICAgICAgICpkaXJlY3Rpb24g
PWhvcml6b250YWwgPyBTY3JvbGxSaWdodCA6IFNjcm9sbERvd247CisgICAgICAgICpncmFudWxh
cml0eSA9IFNjcm9sbEJ5UGFnZTsKKyAgICB9IGVsc2UgaWYgKGFjdGlvblNlbGVjdGVkID09IGFj
dFNjcm9sbFVwKSB7CisgICAgICAgICpkaXJlY3Rpb24gPSBob3Jpem9udGFsID8gU2Nyb2xsTGVm
dCA6IFNjcm9sbFVwOworICAgICAgICAqZ3JhbnVsYXJpdHkgPSBTY3JvbGxCeUxpbmU7CisgICAg
fSBlbHNlIGlmIChhY3Rpb25TZWxlY3RlZCA9PSBhY3RTY3JvbGxEb3duKSB7CisgICAgICAgICpk
aXJlY3Rpb24gPWhvcml6b250YWwgPyBTY3JvbGxSaWdodCA6IFNjcm9sbERvd247CisgICAgICAg
ICpncmFudWxhcml0eSA9IFNjcm9sbEJ5TGluZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9
CisKKy8qIQorICAgIEZpbHRlcnMgdGhlIGNvbnRleHQgbWVudSBldmVudCwgXGEgZXZlbnQsIHRo
cm91Z2ggaGFuZGxlcnMgZm9yIHNjcm9sbGJhcnMgYW5kCisgICAgY3VzdG9tIGV2ZW50IGhhbmRs
ZXJzIGluIHRoZSB3ZWIgcGFnZS4gUmV0dXJucyB0cnVlIGlmIHRoZSBldmVudCB3YXMgaGFuZGxl
ZDsKKyAgICBvdGhlcndpc2UgZmFsc2UuCisKKyAgICBBIHdlYiBwYWdlIG1heSBzd2FsbG93IGEg
Y29udGV4dCBtZW51IGV2ZW50IHRocm91Z2ggYSBjdXN0b20gZXZlbnQgaGFuZGxlciwgYWxsb3dp
bmcgZm9yIGNvbnRleHQKKyAgICBtZW51cyB0byBiZSBpbXBsZW1lbnRlZCBpbiBIVE1ML0phdmFT
Y3JpcHQuIFRoaXMgaXMgdXNlZCBieSBcbHtodHRwOi8vbWFwcy5nb29nbGUuY29tL317R29vZ2xl
CisgICAgTWFwc30sIGZvciBleGFtcGxlLgorKi8KK2Jvb2wgUVdlYlBhZ2U6OnN3YWxsb3dDb250
ZXh0TWVudUV2ZW50KFFDb250ZXh0TWVudUV2ZW50ICpldmVudCkKK3sKKyAgICBRV2ViRnJhbWUq
IHdlYkZyYW1lID0gZnJhbWVBdChldmVudC0+cG9zKCkpOworICAgIHJldHVybiBkLT5zd2FsbG93
Q29udGV4dE1lbnVFdmVudChldmVudCwgd2ViRnJhbWUgPyB3ZWJGcmFtZS0+ZCA6IDApOworfQor
I2VuZGlmIC8vIFFUX05PX0NPTlRFWFRNRU5VCisKKy8qIQorICAgIFVwZGF0ZXMgdGhlIHBhZ2Un
cyBhY3Rpb25zIGRlcGVuZGluZyBvbiB0aGUgcG9zaXRpb24gXGEgcG9zLiBGb3IgZXhhbXBsZSBp
ZiBcYSBwb3MgaXMgb3ZlciBhbiBpbWFnZQorICAgIGVsZW1lbnQgdGhlIENvcHlJbWFnZVRvQ2xp
cGJvYXJkIGFjdGlvbiBpcyBlbmFibGVkLgorKi8KK3ZvaWQgUVdlYlBhZ2U6OnVwZGF0ZVBvc2l0
aW9uRGVwZW5kZW50QWN0aW9ucyhjb25zdCBRUG9pbnQgJnBvcykKK3sKKyNpZm5kZWYgUVRfTk9f
QUNUSU9OCisgICAgLy8gRmlyc3Qgd2UgZGlzYWJsZSBhbGwgYWN0aW9ucywgYnV0IGtlZXAgdHJh
Y2sgb2Ygd2hpY2ggb25lcyB3ZXJlIG9yaWdpbmFsbHkgZW5hYmxlZC4KKyAgICBRQml0QXJyYXkg
b3JpZ2luYWxseUVuYWJsZWRXZWJBY3Rpb25zKFFXZWJQYWdlOjpXZWJBY3Rpb25Db3VudCk7Cisg
ICAgZm9yIChpbnQgaSA9IFFXZWJQYWdlQWRhcHRlcjo6Tm9BY3Rpb24gKyAxOyBpIDwgUVdlYlBh
Z2VBZGFwdGVyOjpBY3Rpb25Db3VudDsgKytpKSB7CisgICAgICAgIFFXZWJQYWdlOjpXZWJBY3Rp
b24gYWN0aW9uID0gd2ViQWN0aW9uRm9yQWRhcHRlck1lbnVBY3Rpb24oUVdlYlBhZ2VBZGFwdGVy
OjpNZW51QWN0aW9uKGkpKTsKKyAgICAgICAgaWYgKFFBY3Rpb24gKmEgPSB0aGlzLT5hY3Rpb24o
YWN0aW9uKSkgeworICAgICAgICAgICAgb3JpZ2luYWxseUVuYWJsZWRXZWJBY3Rpb25zLnNldEJp
dChhY3Rpb24sIGEtPmlzRW5hYmxlZCgpKTsKKyAgICAgICAgICAgIGEtPnNldEVuYWJsZWQoZmFs
c2UpOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8vIFFUX05PX0FDVElPTgorCisgICAgUUJp
dEFycmF5IHZpc2l0ZWRXZWJBY3Rpb25zKFFXZWJQYWdlOjpXZWJBY3Rpb25Db3VudCk7CisgICAg
ZC0+Y3JlYXRlTWFpbkZyYW1lKCk7CisgICAgLy8gVGhlbiB3ZSBsZXQgdXBkYXRlUG9zaXRpb25E
ZXBlbmRhbnRNZW51QWN0aW9ucygpIGVuYWJsZSB0aGUgYWN0aW9ucyB0aGF0IGFyZSBwdXQgaW50
byB0aGUgbWVudQorICAgIFFXZWJIaXRUZXN0UmVzdWx0UHJpdmF0ZSogcmVzdWx0ID0gZC0+dXBk
YXRlUG9zaXRpb25EZXBlbmRlbnRNZW51QWN0aW9ucyhwb3MsICZ2aXNpdGVkV2ViQWN0aW9ucyk7
CisgICAgaWYgKCFyZXN1bHQpCisgICAgICAgIGQtPmhpdFRlc3RSZXN1bHQgPSBRV2ViSGl0VGVz
dFJlc3VsdCgpOworICAgIGVsc2UKKyAgICAgICAgZC0+aGl0VGVzdFJlc3VsdCA9IFFXZWJIaXRU
ZXN0UmVzdWx0KHJlc3VsdCk7CisKKyNpZm5kZWYgUVRfTk9fQUNUSU9OCisgICAgLy8gRmluYWxs
eSwgd2UgcmVzdG9yZSB0aGUgb3JpZ2luYWwgZW5hYmxlbWVudCBmb3IgdGhlIGFjdGlvbnMgdGhh
dCB3ZXJlIG5vdCBwdXQgaW50byB0aGUgbWVudS4KKyAgICBvcmlnaW5hbGx5RW5hYmxlZFdlYkFj
dGlvbnMgJj0gfnZpc2l0ZWRXZWJBY3Rpb25zOyAvLyBNYXNrIG91dCB2aXNpdGVkIGFjdGlvbnMg
KHRoZXkncmUgcGFydCBvZiB0aGUgbWVudSkKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IFFXZWJQ
YWdlOjpXZWJBY3Rpb25Db3VudDsgKytpKSB7CisgICAgICAgIGlmIChvcmlnaW5hbGx5RW5hYmxl
ZFdlYkFjdGlvbnMuYXQoaSkpIHsKKyAgICAgICAgICAgIGlmIChRQWN0aW9uICphID0gdGhpcy0+
YWN0aW9uKFFXZWJQYWdlOjpXZWJBY3Rpb24oaSkpKQorICAgICAgICAgICAgICAgIGEtPnNldEVu
YWJsZWQodHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLy8gUVRfTk9fQUNUSU9OCisK
KyAgICAvLyBUaGlzIHdob2xlIHByb2Nlc3MgZW5zdXJlcyB0aGF0IGFueSBhY3Rpb25zIHB1dCBp
bnRvIHRvIHRoZSBjb250ZXh0IG1lbnUgaGFzIHRoZSByaWdodAorICAgIC8vIGVuYWJsZW1lbnQs
IHdoaWxlIGFsc28ga2VlcGluZyB0aGUgY29ycmVjdCBlbmFibGVtZW50IGZvciBhY3Rpb25zIHRo
YXQgd2VyZSBsZWZ0IG91dCBvZgorICAgIC8vIHRoZSBtZW51LgorCit9CisKKworCisvKiEKKyAg
ICBcZW51bSBRV2ViUGFnZTo6RXh0ZW5zaW9uCisKKyAgICBUaGlzIGVudW0gZGVzY3JpYmVzIHRo
ZSB0eXBlcyBvZiBleHRlbnNpb25zIHRoYXQgdGhlIHBhZ2UgY2FuIHN1cHBvcnQuIEJlZm9yZSB1
c2luZyB0aGVzZSBleHRlbnNpb25zLCB5b3UKKyAgICBzaG91bGQgdmVyaWZ5IHRoYXQgdGhlIGV4
dGVuc2lvbiBpcyBzdXBwb3J0ZWQgYnkgY2FsbGluZyBzdXBwb3J0c0V4dGVuc2lvbigpLgorCisg
ICAgXHZhbHVlIENob29zZU11bHRpcGxlRmlsZXNFeHRlbnNpb24gV2hldGhlciB0aGUgd2ViIHBh
Z2Ugc3VwcG9ydHMgbXVsdGlwbGUgZmlsZSBzZWxlY3Rpb24uCisgICAgVGhpcyBleHRlbnNpb24g
aXMgaW52b2tlZCB3aGVuIHRoZSB3ZWIgY29udGVudCByZXF1ZXN0cyBvbmUgb3IgbW9yZSBmaWxl
IG5hbWVzLCBmb3IgZXhhbXBsZQorICAgIGFzIGEgcmVzdWx0IG9mIHRoZSB1c2VyIGNsaWNraW5n
IG9uIGEgImZpbGUgdXBsb2FkIiBidXR0b24gaW4gYSBIVE1MIGZvcm0gd2hlcmUgbXVsdGlwbGUK
KyAgICBmaWxlIHNlbGVjdGlvbiBpcyBhbGxvd2VkLgorCisgICAgXHZhbHVlIEVycm9yUGFnZUV4
dGVuc2lvbiBXaGV0aGVyIHRoZSB3ZWIgcGFnZSBjYW4gcHJvdmlkZSBhbiBlcnJvciBwYWdlIHdo
ZW4gbG9hZGluZyBmYWlscy4KKyAgICAoaW50cm9kdWNlZCBpbiBRdCA0LjYpCisKKyAgICBcc2Eg
Q2hvb3NlTXVsdGlwbGVGaWxlc0V4dGVuc2lvbk9wdGlvbiwgQ2hvb3NlTXVsdGlwbGVGaWxlc0V4
dGVuc2lvblJldHVybiwgRXJyb3JQYWdlRXh0ZW5zaW9uT3B0aW9uLCBFcnJvclBhZ2VFeHRlbnNp
b25SZXR1cm4KKyovCisKKy8qIQorICAgIFxlbnVtIFFXZWJQYWdlOjpFcnJvckRvbWFpbgorICAg
IFxzaW5jZSA0LjYKKworICAgIFRoaXMgZW51bSBkZXNjcmliZXMgdGhlIGRvbWFpbiBvZiBhbiBF
cnJvclBhZ2VFeHRlbnNpb25PcHRpb24gb2JqZWN0IChpLmUuIHRoZSBsYXllciBpbiB3aGljaCB0
aGUgZXJyb3Igb2NjdXJyZWQpLgorCisgICAgXHZhbHVlIFF0TmV0d29yayBUaGUgZXJyb3Igb2Nj
dXJyZWQgaW4gdGhlIFF0TmV0d29yayBsYXllcjsgdGhlIGVycm9yIGNvZGUgaXMgb2YgdHlwZSBR
TmV0d29ya1JlcGx5OjpOZXR3b3JrRXJyb3IuCisgICAgXHZhbHVlIEh0dHAgVGhlIGVycm9yIG9j
Y3VycmVkIGluIHRoZSBIVFRQIGxheWVyOyB0aGUgZXJyb3IgY29kZSBpcyBhIEhUVFAgc3RhdHVz
IGNvZGUgKHNlZSBRTmV0d29ya1JlcXVlc3Q6Okh0dHBTdGF0dXNDb2RlQXR0cmlidXRlKS4KKyAg
ICBcdmFsdWUgV2ViS2l0IFRoZSBlcnJvciBpcyBhbiBpbnRlcm5hbCBXZWJLaXQgZXJyb3IuCisq
LworCisvKiEKKyAgICBcY2xhc3MgUVdlYlBhZ2U6OkV4dGVuc2lvbk9wdGlvbgorICAgIFxzaW5j
ZSA0LjQKKyAgICBcYnJpZWYgVGhlIEV4dGVuc2lvbk9wdGlvbiBjbGFzcyBwcm92aWRlcyBhbiBl
eHRlbmRlZCBpbnB1dCBhcmd1bWVudCB0byBRV2ViUGFnZSdzIGV4dGVuc2lvbiBzdXBwb3J0Lgor
CisgICAgXGlubW9kdWxlIFF0V2ViS2l0CisKKyAgICBcc2EgUVdlYlBhZ2U6OmV4dGVuc2lvbigp
LCBRV2ViUGFnZTo6RXh0ZW5zaW9uUmV0dXJuCisqLworCisKKy8qIQorICAgIFxjbGFzcyBRV2Vi
UGFnZTo6RXh0ZW5zaW9uUmV0dXJuCisgICAgXHNpbmNlIDQuNAorICAgIFxicmllZiBUaGUgRXh0
ZW5zaW9uUmV0dXJuIGNsYXNzIHByb3ZpZGVzIGFuIG91dHB1dCByZXN1bHQgZnJvbSBhIFFXZWJQ
YWdlJ3MgZXh0ZW5zaW9uLgorCisgICAgXGlubW9kdWxlIFF0V2ViS2l0CisKKyAgICBcc2EgUVdl
YlBhZ2U6OmV4dGVuc2lvbigpLCBRV2ViUGFnZTo6RXh0ZW5zaW9uT3B0aW9uCisqLworCisvKiEK
KyAgICBcY2xhc3MgUVdlYlBhZ2U6OkVycm9yUGFnZUV4dGVuc2lvbk9wdGlvbgorICAgIFxzaW5j
ZSA0LjYKKyAgICBcYnJpZWYgVGhlIEVycm9yUGFnZUV4dGVuc2lvbk9wdGlvbiBjbGFzcyBkZXNj
cmliZXMgdGhlIG9wdGlvbgorICAgIGZvciB0aGUgZXJyb3IgcGFnZSBleHRlbnNpb24uCisKKyAg
ICBcaW5tb2R1bGUgUXRXZWJLaXQKKworICAgIFRoZSBFcnJvclBhZ2VFeHRlbnNpb25PcHRpb24g
Y2xhc3MgaG9sZHMgdGhlIFxhIHVybCBmb3Igd2hpY2ggYW4gZXJyb3Igb2NjdXJyZWQgYXMgd2Vs
bCBhcworICAgIHRoZSBhc3NvY2lhdGVkIFxhIGZyYW1lLgorCisgICAgVGhlIGVycm9yIGl0c2Vs
ZiBpcyByZXBvcnRlZCBieSBhbiBlcnJvciBcYSBkb21haW4sIHRoZSBcYSBlcnJvciBjb2RlIGFz
IHdlbGwgYXMgXGEgZXJyb3JTdHJpbmcuCisKKyAgICBcc2EgUVdlYlBhZ2U6OmV4dGVuc2lvbigp
LCBRV2ViUGFnZTo6RXJyb3JQYWdlRXh0ZW5zaW9uUmV0dXJuCisqLworCisvKiEKKyAgICBcdmFy
aWFibGUgUVdlYlBhZ2U6OkVycm9yUGFnZUV4dGVuc2lvbk9wdGlvbjo6dXJsCisgICAgXGJyaWVm
IHRoZSB1cmwgZm9yIHdoaWNoIGFuIGVycm9yIG9jY3VycmVkCisqLworCisvKiEKKyAgICBcdmFy
aWFibGUgUVdlYlBhZ2U6OkVycm9yUGFnZUV4dGVuc2lvbk9wdGlvbjo6ZnJhbWUKKyAgICBcYnJp
ZWYgdGhlIGZyYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXJyb3IKKyovCisKKy8qIQorICAgIFx2
YXJpYWJsZSBRV2ViUGFnZTo6RXJyb3JQYWdlRXh0ZW5zaW9uT3B0aW9uOjpkb21haW4KKyAgICBc
YnJpZWYgdGhlIGRvbWFpbiB0aGF0IHJlcG9ydGVkIHRoZSBlcnJvcgorKi8KKworLyohCisgICAg
XHZhcmlhYmxlIFFXZWJQYWdlOjpFcnJvclBhZ2VFeHRlbnNpb25PcHRpb246OmVycm9yCisgICAg
XGJyaWVmIHRoZSBlcnJvciBjb2RlLiBJbnRlcnByZXRhdGlvbiBvZiB0aGUgdmFsdWUgZGVwZW5k
cyBvbiB0aGUgXGEgZG9tYWluCisgICAgXHNhIFFXZWJQYWdlOjpFcnJvckRvbWFpbgorKi8KKwor
LyohCisgICAgXHZhcmlhYmxlIFFXZWJQYWdlOjpFcnJvclBhZ2VFeHRlbnNpb25PcHRpb246OmVy
cm9yU3RyaW5nCisgICAgXGJyaWVmIGEgc3RyaW5nIHRoYXQgZGVzY3JpYmVzIHRoZSBlcnJvcgor
Ki8KKworLyohCisgICAgXGNsYXNzIFFXZWJQYWdlOjpFcnJvclBhZ2VFeHRlbnNpb25SZXR1cm4K
KyAgICBcc2luY2UgNC42CisgICAgXGJyaWVmIFRoZSBFcnJvclBhZ2VFeHRlbnNpb25SZXR1cm4g
ZGVzY3JpYmVzIHRoZSBlcnJvciBwYWdlLCB3aGljaCB3aWxsIGJlIHNob3duIGZvciB0aGUKKyAg
ICBmcmFtZSBmb3Igd2hpY2ggdGhlIGVycm9yIG9jY3VyZWQuCisKKyAgICBcaW5tb2R1bGUgUXRX
ZWJLaXQKKworICAgIFRoZSBFcnJvclBhZ2VFeHRlbnNpb25SZXR1cm4gY2xhc3MgaG9sZHMgdGhl
IGRhdGEgbmVlZGVkIGZvciBjcmVhdGluZyBhbiBlcnJvciBwYWdlLiBTb21lIGFyZQorICAgIG9w
dGlvbmFsIHN1Y2ggYXMgXGEgY29udGVudFR5cGUsIHdoaWNoIGRlZmF1bHRzIHRvICJ0ZXh0L2h0
bWwiLCBhcyB3ZWxsIGFzIHRoZSBcYSBlbmNvZGluZywgd2hpY2gKKyAgICBpcyBhc3N1bWVkIHRv
IGJlIFVURi04IGlmIG5vdCBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgorCisgICAgVGhlIGVycm9yIHBh
Z2UgaXMgc3RvcmVkIGluIHRoZSBcYSBjb250ZW50IGJ5dGUgYXJyYXksIGFzIEhUTUwgY29udGVu
dC4gSW4gb3JkZXIgdG8gY29udmVydCBhCisgICAgUVN0cmluZyB0byBhIGJ5dGUgYXJyYXksIHRo
ZSBRU3RyaW5nOjp0b1V0ZjgoKSBtZXRob2QgY2FuIGJlIHVzZWQuCisKKyAgICBFeHRlcm5hbCBv
YmplY3RzIHN1Y2ggYXMgc3R5bGVzaGVldHMgb3IgaW1hZ2VzIHJlZmVyZW5jZWQgaW4gdGhlIEhU
TUwgYXJlIGxvY2F0ZWQgcmVsYXRpdmUgdG8KKyAgICBcYSBiYXNlVXJsLgorCisgICAgXHNhIFFX
ZWJQYWdlOjpleHRlbnNpb24oKSwgUVdlYlBhZ2U6OkVycm9yUGFnZUV4dGVuc2lvbk9wdGlvbiwg
UVN0cmluZzo6dG9VdGY4KCkKKyovCisKKy8qIQorICAgIFxmbiBRV2ViUGFnZTo6RXJyb3JQYWdl
RXh0ZW5zaW9uUmV0dXJuOjpFcnJvclBhZ2VFeHRlbnNpb25SZXR1cm4oKQorCisgICAgQ29uc3Ry
dWN0cyBhIG5ldyBlcnJvciBwYWdlIG9iamVjdC4KKyovCisKKworLyohCisgICAgXHZhcmlhYmxl
IFFXZWJQYWdlOjpFcnJvclBhZ2VFeHRlbnNpb25SZXR1cm46OmNvbnRlbnRUeXBlCisgICAgXGJy
aWVmIHRoZSBlcnJvciBwYWdlJ3MgY29udGVudCB0eXBlCisqLworCisvKiEKKyAgICBcdmFyaWFi
bGUgUVdlYlBhZ2U6OkVycm9yUGFnZUV4dGVuc2lvblJldHVybjo6ZW5jb2RpbmcKKyAgICBcYnJp
ZWYgdGhlIGVycm9yIHBhZ2UgZW5jb2RpbmcKKyovCisKKy8qIQorICAgIFx2YXJpYWJsZSBRV2Vi
UGFnZTo6RXJyb3JQYWdlRXh0ZW5zaW9uUmV0dXJuOjpiYXNlVXJsCisgICAgXGJyaWVmIHRoZSBi
YXNlIHVybAorCisgICAgRXh0ZXJuYWwgb2JqZWN0cyBzdWNoIGFzIHN0eWxlc2hlZXRzIG9yIGlt
YWdlcyByZWZlcmVuY2VkIGluIHRoZSBIVE1MIGFyZSBsb2NhdGVkIHJlbGF0aXZlIHRvIHRoaXMg
dXJsLgorKi8KKworLyohCisgICAgXHZhcmlhYmxlIFFXZWJQYWdlOjpFcnJvclBhZ2VFeHRlbnNp
b25SZXR1cm46OmNvbnRlbnQKKyAgICBcYnJpZWYgdGhlIEhUTUwgY29udGVudCBvZiB0aGUgZXJy
b3IgcGFnZQorKi8KKworLyohCisgICAgXGNsYXNzIFFXZWJQYWdlOjpDaG9vc2VNdWx0aXBsZUZp
bGVzRXh0ZW5zaW9uT3B0aW9uCisgICAgXHNpbmNlIDQuNQorICAgIFxicmllZiBUaGUgQ2hvb3Nl
TXVsdGlwbGVGaWxlc0V4dGVuc2lvbk9wdGlvbiBjbGFzcyBkZXNjcmliZXMgdGhlIG9wdGlvbgor
ICAgIGZvciB0aGUgbXVsdGlwbGUgZmlsZXMgc2VsZWN0aW9uIGV4dGVuc2lvbi4KKworICAgIFxp
bm1vZHVsZSBRdFdlYktpdAorCisgICAgVGhlIENob29zZU11bHRpcGxlRmlsZXNFeHRlbnNpb25P
cHRpb24gY2xhc3MgaG9sZHMgdGhlIGZyYW1lIG9yaWdpbmF0aW5nIHRoZSByZXF1ZXN0CisgICAg
YW5kIHRoZSBzdWdnZXN0ZWQgZmlsZW5hbWVzIHdoaWNoIG1pZ2h0IGJlIHByb3ZpZGVkLgorCisg
ICAgXHNhIFFXZWJQYWdlOjpleHRlbnNpb24oKSwgUVdlYlBhZ2U6OmNob29zZUZpbGUoKSwgUVdl
YlBhZ2U6OkNob29zZU11bHRpcGxlRmlsZXNFeHRlbnNpb25SZXR1cm4KKyovCisKKy8qIQorICAg
IFx2YXJpYWJsZSBRV2ViUGFnZTo6Q2hvb3NlTXVsdGlwbGVGaWxlc0V4dGVuc2lvbk9wdGlvbjo6
cGFyZW50RnJhbWUKKyAgICBcYnJpZWYgVGhlIGZyYW1lIGluIHdoaWNoIHRoZSByZXF1ZXN0IG9y
aWdpbmF0ZWQKKyovCisKKy8qIQorICAgIFx2YXJpYWJsZSBRV2ViUGFnZTo6Q2hvb3NlTXVsdGlw
bGVGaWxlc0V4dGVuc2lvbk9wdGlvbjo6c3VnZ2VzdGVkRmlsZU5hbWVzCisgICAgXGJyaWVmIFRo
ZSBzdWdnZXN0ZWQgZmlsZW5hbWVzCisqLworCisvKiEKKyAgICBcdmFyaWFibGUgUVdlYlBhZ2U6
OkNob29zZU11bHRpcGxlRmlsZXNFeHRlbnNpb25SZXR1cm46OmZpbGVOYW1lcworICAgIFxicmll
ZiBUaGUgc2VsZWN0ZWQgZmlsZW5hbWVzCisqLworCisvKiEKKyAgICBcY2xhc3MgUVdlYlBhZ2U6
OkNob29zZU11bHRpcGxlRmlsZXNFeHRlbnNpb25SZXR1cm4KKyAgICBcc2luY2UgNC41CisgICAg
XGJyaWVmIFRoZSBDaG9vc2VNdWx0aXBsZUZpbGVzRXh0ZW5zaW9uUmV0dXJuIGRlc2NyaWJlcyB0
aGUgcmV0dXJuIHZhbHVlCisgICAgZm9yIHRoZSBtdWx0aXBsZSBmaWxlcyBzZWxlY3Rpb24gZXh0
ZW5zaW9uLgorCisgICAgXGlubW9kdWxlIFF0V2ViS2l0CisKKyAgICBUaGUgQ2hvb3NlTXVsdGlw
bGVGaWxlc0V4dGVuc2lvblJldHVybiBjbGFzcyBob2xkcyB0aGUgZmlsZW5hbWVzIHNlbGVjdGVk
IGJ5IHRoZSB1c2VyCisgICAgd2hlbiB0aGUgZXh0ZW5zaW9uIGlzIGludm9rZWQuCisKKyAgICBc
c2EgUVdlYlBhZ2U6OmV4dGVuc2lvbigpLCBRV2ViUGFnZTo6Q2hvb3NlTXVsdGlwbGVGaWxlc0V4
dGVuc2lvbk9wdGlvbgorKi8KKworLyohCisgICAgVGhpcyB2aXJ0dWFsIGZ1bmN0aW9uIGNhbiBi
ZSByZWltcGxlbWVudGVkIGluIGEgUVdlYlBhZ2Ugc3ViY2xhc3MgdG8gcHJvdmlkZSBzdXBwb3J0
IGZvciBleHRlbnNpb25zLiBUaGUgXGEgb3B0aW9uCisgICAgYXJndW1lbnQgaXMgcHJvdmlkZWQg
YXMgaW5wdXQgdG8gdGhlIGV4dGVuc2lvbjsgdGhlIG91dHB1dCByZXN1bHRzIGNhbiBiZSBzdG9y
ZWQgaW4gXGEgb3V0cHV0LgorCisgICAgVGhlIGJlaGF2aW9yIG9mIHRoaXMgZnVuY3Rpb24gaXMg
ZGV0ZXJtaW5lZCBieSBcYSBleHRlbnNpb24uIFRoZSBcYSBvcHRpb24KKyAgICBhbmQgXGEgb3V0
cHV0IHZhbHVlcyBhcmUgdHlwaWNhbGx5IGNhc3RlZCB0byB0aGUgY29ycmVzcG9uZGluZyB0eXBl
cyAoZm9yCisgICAgZXhhbXBsZSwgQ2hvb3NlTXVsdGlwbGVGaWxlc0V4dGVuc2lvbk9wdGlvbiBh
bmQKKyAgICBDaG9vc2VNdWx0aXBsZUZpbGVzRXh0ZW5zaW9uUmV0dXJuIGZvciBDaG9vc2VNdWx0
aXBsZUZpbGVzRXh0ZW5zaW9uKS4KKworICAgIFlvdSBjYW4gY2FsbCBzdXBwb3J0c0V4dGVuc2lv
bigpIHRvIGNoZWNrIGlmIGFuIGV4dGVuc2lvbiBpcyBzdXBwb3J0ZWQgYnkgdGhlIHBhZ2UuCisK
KyAgICBSZXR1cm5zIHRydWUgaWYgdGhlIGV4dGVuc2lvbiB3YXMgY2FsbGVkIHN1Y2Nlc3NmdWxs
eTsgb3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuCisKKyAgICBcc2Egc3VwcG9ydHNFeHRlbnNpb24o
KSwgRXh0ZW5zaW9uCisqLworYm9vbCBRV2ViUGFnZTo6ZXh0ZW5zaW9uKEV4dGVuc2lvbiBleHRl
bnNpb24sIGNvbnN0IEV4dGVuc2lvbk9wdGlvbiAqb3B0aW9uLCBFeHRlbnNpb25SZXR1cm4gKm91
dHB1dCkKK3sKKyNpZm5kZWYgUVRfTk9fRklMRURJQUxPRworICAgIGlmIChleHRlbnNpb24gPT0g
Q2hvb3NlTXVsdGlwbGVGaWxlc0V4dGVuc2lvbikgeworICAgICAgICAvLyBGSVhNRTogZG8gbm90
IGlnbm9yZSBzdWdnZXN0ZWRGaWxlcworICAgICAgICBRU3RyaW5nTGlzdCBzdWdnZXN0ZWRGaWxl
cyA9IHN0YXRpY19jYXN0PGNvbnN0IENob29zZU11bHRpcGxlRmlsZXNFeHRlbnNpb25PcHRpb24q
PihvcHRpb24pLT5zdWdnZXN0ZWRGaWxlTmFtZXM7CisgICAgICAgIFFTdHJpbmdMaXN0IG5hbWVz
ID0gUUZpbGVEaWFsb2c6OmdldE9wZW5GaWxlTmFtZXModmlldygpLCBRU3RyaW5nOjpudWxsKTsK
KyAgICAgICAgc3RhdGljX2Nhc3Q8Q2hvb3NlTXVsdGlwbGVGaWxlc0V4dGVuc2lvblJldHVybio+
KG91dHB1dCktPmZpbGVOYW1lcyA9IG5hbWVzOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9
CisjZW5kaWYKKworICAgIHJldHVybiBmYWxzZTsKK30KKworLyohCisgICAgVGhpcyB2aXJ0dWFs
IGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGUgd2ViIHBhZ2Ugc3VwcG9ydHMgXGEgZXh0ZW5z
aW9uOyBvdGhlcndpc2UgZmFsc2UgaXMgcmV0dXJuZWQuCisKKyAgICBcc2EgZXh0ZW5zaW9uKCkK
KyovCitib29sIFFXZWJQYWdlOjpzdXBwb3J0c0V4dGVuc2lvbihFeHRlbnNpb24gZXh0ZW5zaW9u
KSBjb25zdAoreworI2lmbmRlZiBRVF9OT19GSUxFRElBTE9HCisgICAgcmV0dXJuIGV4dGVuc2lv
biA9PSBDaG9vc2VNdWx0aXBsZUZpbGVzRXh0ZW5zaW9uOworI2Vsc2UKKyAgICBRX1VOVVNFRChl
eHRlbnNpb24pOworICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorfQorCisvKiEKKyAqIFxpbnRl
cm5hbAorICovCitRV2ViUGFnZUFkYXB0ZXIgKlFXZWJQYWdlOjpoYW5kbGUoKSBjb25zdAorewor
ICAgIHJldHVybiBkOworfQorCisvKiEKKyAgICBGaW5kcyB0aGUgc3BlY2lmaWVkIHN0cmluZywg
XGEgc3ViU3RyaW5nLCBpbiB0aGUgcGFnZSwgdXNpbmcgdGhlIGdpdmVuIFxhIG9wdGlvbnMuCisK
KyAgICBJZiB0aGUgSGlnaGxpZ2h0QWxsT2NjdXJyZW5jZXMgZmxhZyBpcyBwYXNzZWQsIHRoZSBm
dW5jdGlvbiB3aWxsIGhpZ2hsaWdodCBhbGwgb2NjdXJyZW5jZXMKKyAgICB0aGF0IGV4aXN0IGlu
IHRoZSBwYWdlLiBBbGwgc3Vic2VxdWVudCBjYWxscyB3aWxsIGV4dGVuZCB0aGUgaGlnaGxpZ2h0
LCByYXRoZXIgdGhhbgorICAgIHJlcGxhY2UgaXQsIHdpdGggb2NjdXJyZW5jZXMgb2YgdGhlIG5l
dyBzdHJpbmcuCisKKyAgICBJZiB0aGUgSGlnaGxpZ2h0QWxsT2NjdXJyZW5jZXMgZmxhZyBpcyBu
b3QgcGFzc2VkLCB0aGUgZnVuY3Rpb24gd2lsbCBzZWxlY3QgYW4gb2NjdXJyZW5jZQorICAgIGFu
ZCBhbGwgc3Vic2VxdWVudCBjYWxscyB3aWxsIHJlcGxhY2UgdGhlIGN1cnJlbnQgb2NjdXJyZW5j
ZSB3aXRoIHRoZSBuZXh0IG9uZS4KKworICAgIFRvIGNsZWFyIHRoZSBzZWxlY3Rpb24sIGp1c3Qg
cGFzcyBhbiBlbXB0eSBzdHJpbmcuCisKKyAgICBSZXR1cm5zIHRydWUgaWYgXGEgc3ViU3RyaW5n
IHdhcyBmb3VuZDsgb3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuCisqLworYm9vbCBRV2ViUGFnZTo6
ZmluZFRleHQoY29uc3QgUVN0cmluZyAmc3ViU3RyaW5nLCBGaW5kRmxhZ3Mgb3B0aW9ucykKK3sK
KyAgICByZXR1cm4gZC0+ZmluZFRleHQoc3ViU3RyaW5nLCBzdGF0aWNfY2FzdDxRV2ViUGFnZUFk
YXB0ZXI6OkZpbmRGbGFnPihvcHRpb25zLm9wZXJhdG9yIGludCgpKSk7Cit9CisKKy8qIQorICAg
IFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBwYWdlJ3Mgc2V0dGluZ3Mgb2JqZWN0LgorCisgICAg
XHNhIFFXZWJTZXR0aW5nczo6Z2xvYmFsU2V0dGluZ3MoKQorKi8KK1FXZWJTZXR0aW5ncyAqUVdl
YlBhZ2U6OnNldHRpbmdzKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZC0+c2V0dGluZ3M7Cit9CisK
Ky8qIQorICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlIHdlYiBjb250ZW50IHJl
cXVlc3RzIGEgZmlsZSBuYW1lLCBmb3IgZXhhbXBsZQorICAgIGFzIGEgcmVzdWx0IG9mIHRoZSB1
c2VyIGNsaWNraW5nIG9uIGEgImZpbGUgdXBsb2FkIiBidXR0b24gaW4gYSBIVE1MIGZvcm0uCisK
KyAgICBBIHN1Z2dlc3RlZCBmaWxlbmFtZSBtYXkgYmUgcHJvdmlkZWQgaW4gXGEgc3VnZ2VzdGVk
RmlsZS4gVGhlIGZyYW1lIG9yaWdpbmF0aW5nIHRoZQorICAgIHJlcXVlc3QgaXMgcHJvdmlkZWQg
YXMgXGEgcGFyZW50RnJhbWUuCisKKyAgICBcc2EgQ2hvb3NlTXVsdGlwbGVGaWxlc0V4dGVuc2lv
bgorKi8KK1FTdHJpbmcgUVdlYlBhZ2U6OmNob29zZUZpbGUoUVdlYkZyYW1lICpwYXJlbnRGcmFt
ZSwgY29uc3QgUVN0cmluZyYgc3VnZ2VzdGVkRmlsZSkKK3sKKyAgICBRX1VOVVNFRChwYXJlbnRG
cmFtZSk7CisjaWZuZGVmIFFUX05PX0ZJTEVESUFMT0cKKyAgICByZXR1cm4gUUZpbGVEaWFsb2c6
OmdldE9wZW5GaWxlTmFtZSh2aWV3KCksIFFTdHJpbmc6Om51bGwsIHN1Z2dlc3RlZEZpbGUpOwor
I2Vsc2UKKyAgICByZXR1cm4gUVN0cmluZzo6bnVsbDsKKyNlbmRpZgorfQorCisvKiEKKyAgICBT
ZXRzIHRoZSBRTmV0d29ya0FjY2Vzc01hbmFnZXIgXGEgbWFuYWdlciByZXNwb25zaWJsZSBmb3Ig
c2VydmluZyBuZXR3b3JrIHJlcXVlc3RzIGZvciB0aGlzCisgICAgUVdlYlBhZ2UuCisKKyAgICBc
bm90ZSBJdCBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCB0byBjaGFuZ2UgdGhlIG5ldHdvcmsg
YWNjZXNzIG1hbmFnZXIgYWZ0ZXIgdGhlCisgICAgUVdlYlBhZ2UgaGFzIHVzZWQgaXQuIFRoZSBy
ZXN1bHRzIG9mIGRvaW5nIHRoaXMgYXJlIHVuZGVmaW5lZC4KKworICAgIFxzYSBuZXR3b3JrQWNj
ZXNzTWFuYWdlcigpCisqLwordm9pZCBRV2ViUGFnZTo6c2V0TmV0d29ya0FjY2Vzc01hbmFnZXIo
UU5ldHdvcmtBY2Nlc3NNYW5hZ2VyICptYW5hZ2VyKQoreworICAgIGQtPnNldE5ldHdvcmtBY2Nl
c3NNYW5hZ2VyKG1hbmFnZXIpOworfQorCisvKiEKKyAgICBSZXR1cm5zIHRoZSBRTmV0d29ya0Fj
Y2Vzc01hbmFnZXIgdGhhdCBpcyByZXNwb25zaWJsZSBmb3Igc2VydmluZyBuZXR3b3JrCisgICAg
cmVxdWVzdHMgZm9yIHRoaXMgUVdlYlBhZ2UuCisKKyAgICBcc2Egc2V0TmV0d29ya0FjY2Vzc01h
bmFnZXIoKQorKi8KK1FOZXR3b3JrQWNjZXNzTWFuYWdlciAqUVdlYlBhZ2U6Om5ldHdvcmtBY2Nl
c3NNYW5hZ2VyKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZC0+bmV0d29ya0FjY2Vzc01hbmFnZXIo
KTsKK30KKworLyohCisgICAgU2V0cyB0aGUgUVdlYlBsdWdpbkZhY3RvcnkgXGEgZmFjdG9yeSBy
ZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgcGx1Z2lucyBlbWJlZGRlZCBpbnRvIHRoaXMKKyAgICBR
V2ViUGFnZS4KKworICAgIE5vdGU6IFRoZSBwbHVnaW4gZmFjdG9yeSBpcyBvbmx5IHVzZWQgaWYg
dGhlIFFXZWJTZXR0aW5nczo6UGx1Z2luc0VuYWJsZWQgYXR0cmlidXRlIGlzIGVuYWJsZWQuCisK
KyAgICBcc2EgcGx1Z2luRmFjdG9yeSgpCisqLwordm9pZCBRV2ViUGFnZTo6c2V0UGx1Z2luRmFj
dG9yeShRV2ViUGx1Z2luRmFjdG9yeSAqZmFjdG9yeSkKK3sKKyAgICBkLT5wbHVnaW5GYWN0b3J5
ID0gZmFjdG9yeTsKK30KKworLyohCisgICAgUmV0dXJucyB0aGUgUVdlYlBsdWdpbkZhY3Rvcnkg
dGhhdCBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgcGx1Z2lucyBlbWJlZGRlZCBpbnRvCisg
ICAgdGhpcyBRV2ViUGFnZS4gSWYgbm8gcGx1Z2luIGZhY3RvcnkgaXMgaW5zdGFsbGVkIGEgbnVs
bCBwb2ludGVyIGlzIHJldHVybmVkLgorCisgICAgXHNhIHNldFBsdWdpbkZhY3RvcnkoKQorKi8K
K1FXZWJQbHVnaW5GYWN0b3J5ICpRV2ViUGFnZTo6cGx1Z2luRmFjdG9yeSgpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIGQtPnBsdWdpbkZhY3Rvcnk7Cit9CisKKy8qIQorICAgIFRoaXMgZnVuY3Rpb24g
aXMgY2FsbGVkIHdoZW4gYSB1c2VyIGFnZW50IGZvciBIVFRQIHJlcXVlc3RzIGlzIG5lZWRlZC4g
WW91IGNhbiByZWltcGxlbWVudCB0aGlzCisgICAgZnVuY3Rpb24gdG8gZHluYW1pY2FsbHkgcmV0
dXJuIGRpZmZlcmVudCB1c2VyIGFnZW50cyBmb3IgZGlmZmVyZW50IFVSTHMsIGJhc2VkIG9uIHRo
ZSBcYSB1cmwgcGFyYW1ldGVyLgorCisgICAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0
dXJucyB0aGUgZm9sbG93aW5nIHZhbHVlOgorCisgICAgIk1vemlsbGEvNS4wICglUGxhdGZvcm0l
JVNlY3VyaXR5JSVTdWJwbGF0Zm9ybSUpIEFwcGxlV2ViS2l0LyVXZWJLaXRWZXJzaW9uJSAoS0hU
TUwsIGxpa2UgR2Vja28pICVBcHBWZXJzaW9uIFNhZmFyaS8lV2ViS2l0VmVyc2lvbiUiCisKKyAg
ICBJbiB0aGlzIHN0cmluZyB0aGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgcmVwbGFjZWQgYXQgcnVu
LXRpbWU6CisgICAgXGxpc3QKKyAgICBcbGkgJVBsYXRmb3JtJSBleHBhbmRzIHRvIHRoZSB3aW5k
b3dpbmcgc3lzdGVtIGZvbGxvd2VkIGJ5ICI7ICIgaWYgaXQgaXMgbm90IFdpbmRvd3MgKGUuZy4g
IlgxMTsgIikuCisgICAgXGxpICVTZWN1cml0eSUgZXhwYW5kcyB0byAiTjsgIiBpZiBTU0wgaXMg
ZGlzYWJsZWQuCisgICAgXGxpICVTdWJwbGF0Zm9ybSUgZXhwYW5kcyB0byB0aGUgb3BlcmF0aW5n
IHN5c3RlbSB2ZXJzaW9uIChlLmcuICJXaW5kb3dzIE5UIDYuMSIgb3IgIkludGVsIE1hYyBPUyBY
IDEwLjUiKS4KKyAgICBcbGkgJVdlYktpdFZlcnNpb24lIGlzIHRoZSB2ZXJzaW9uIG9mIFdlYktp
dCB0aGUgYXBwbGljYXRpb24gd2FzIGNvbXBpbGVkIGFnYWluc3QuCisgICAgXGxpICVBcHBWZXJz
aW9uJSBleHBhbmRzIHRvIFFDb3JlQXBwbGljYXRpb246OmFwcGxpY2F0aW9uTmFtZSgpL1FDb3Jl
QXBwbGljYXRpb246OmFwcGxpY2F0aW9uVmVyc2lvbigpIGlmIHRoZXkncmUgc2V0OyBvdGhlcndp
c2UgZGVmYXVsdGluZyB0byBRdCBhbmQgdGhlIGN1cnJlbnQgUXQgdmVyc2lvbi4KKyAgICBcZW5k
bGlzdAorKi8KK1FTdHJpbmcgUVdlYlBhZ2U6OnVzZXJBZ2VudEZvclVybChjb25zdCBRVXJsJikg
Y29uc3QKK3sKKyAgICByZXR1cm4gUVdlYlBhZ2VBZGFwdGVyOjpkZWZhdWx0VXNlckFnZW50U3Ry
aW5nKCk7Cit9CisKKworLyohCisgICAgUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVz
IHRoYXQgd2VyZSByZWNlaXZlZCBmcm9tIHRoZSBuZXR3b3JrIHRvIHJlbmRlciB0aGUgY3VycmVu
dCBwYWdlLAorICAgIGluY2x1ZGluZyBleHRyYSBjb250ZW50IHN1Y2ggYXMgZW1iZWRkZWQgaW1h
Z2VzLgorCisgICAgXHNhIGJ5dGVzUmVjZWl2ZWQoKQorKi8KK3F1aW50NjQgUVdlYlBhZ2U6OnRv
dGFsQnl0ZXMoKSBjb25zdAoreworICAgIHJldHVybiBkLT5tX3RvdGFsQnl0ZXM7Cit9CisKKwor
LyohCisgICAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd2VyZSByZWNlaXZlZCBm
cm9tIHRoZSBuZXR3b3JrIHRvIHJlbmRlciB0aGUgY3VycmVudCBwYWdlLgorCisgICAgXHNhIHRv
dGFsQnl0ZXMoKSwgbG9hZFByb2dyZXNzKCkKKyovCitxdWludDY0IFFXZWJQYWdlOjpieXRlc1Jl
Y2VpdmVkKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZC0+bV9ieXRlc1JlY2VpdmVkOworfQorCisv
KiEKKyAgICBcc2luY2UgNC44CisgICAgXGZuIHZvaWQgUVdlYlBhZ2U6OnZpZXdwb3J0Q2hhbmdl
UmVxdWVzdGVkKCkKKworICAgIFBhZ2UgYXV0aG9ycyBjYW4gcHJvdmlkZSB0aGUgc3VwcGxpZWQg
dmFsdWVzIGJ5IHVzaW5nIHRoZSB2aWV3cG9ydCBtZXRhIHRhZy4gTW9yZSBpbmZvcm1hdGlvbgor
ICAgIGFib3V0IHRoaXMgY2FuIGJlIGZvdW5kIGF0IFxse2h0dHA6Ly9kZXZlbG9wZXIuYXBwbGUu
Y29tL3NhZmFyaS9saWJyYXJ5L2RvY3VtZW50YXRpb24vYXBwbGVhcHBsaWNhdGlvbnMvcmVmZXJl
bmNlL3NhZmFyaXdlYmNvbnRlbnQvdXNpbmd0aGV2aWV3cG9ydC91c2luZ3RoZXZpZXdwb3J0Lmh0
bWx9e1NhZmFyaSBSZWZlcmVuY2UgTGlicmFyeTogVXNpbmcgdGhlIFZpZXdwb3J0IE1ldGEgVGFn
fS4KKworICAgIFxzYSBRV2ViUGFnZTo6Vmlld3BvcnRBdHRyaWJ1dGVzLCBzZXRQcmVmZXJyZWRD
b250ZW50c1NpemUoKSwgUUdyYXBoaWNzV2ViVmlldzo6c2V0U2NhbGUoKQorKi8KKworLyohCisg
ICAgXGZuIHZvaWQgUVdlYlBhZ2U6OmxvYWRTdGFydGVkKCkKKworICAgIFRoaXMgc2lnbmFsIGlz
IGVtaXR0ZWQgd2hlbiBhIHBhZ2Ugc3RhcnRzIGxvYWRpbmcgY29udGVudC4KKworICAgIFxzYSBs
b2FkRmluaXNoZWQoKQorKi8KKworLyohCisgICAgXGZuIHZvaWQgUVdlYlBhZ2U6OmxvYWRQcm9n
cmVzcyhpbnQgcHJvZ3Jlc3MpCisKKyAgICBUaGlzIHNpZ25hbCBpcyBlbWl0dGVkIHdoZW4gdGhl
IGdsb2JhbCBwcm9ncmVzcyBzdGF0dXMgY2hhbmdlcy4KKyAgICBUaGUgY3VycmVudCB2YWx1ZSBp
cyBwcm92aWRlZCBieSBcYSBwcm9ncmVzcyBhbmQgc2NhbGVzIGZyb20gMCB0byAxMDAsCisgICAg
d2hpY2ggaXMgdGhlIGRlZmF1bHQgcmFuZ2Ugb2YgUVByb2dyZXNzQmFyLgorICAgIEl0IGFjY3Vt
dWxhdGVzIGNoYW5nZXMgZnJvbSBhbGwgdGhlIGNoaWxkIGZyYW1lcy4KKworICAgIFxzYSBieXRl
c1JlY2VpdmVkKCkKKyovCisKKy8qIQorICAgIFxmbiB2b2lkIFFXZWJQYWdlOjpsb2FkRmluaXNo
ZWQoYm9vbCBvaykKKworICAgIFRoaXMgc2lnbmFsIGlzIGVtaXR0ZWQgd2hlbiB0aGUgcGFnZSBm
aW5pc2hlcyBsb2FkaW5nIGNvbnRlbnQuIFRoaXMgc2lnbmFsCisgICAgaXMgaW5kZXBlbmRhbnQg
b2Ygc2NyaXB0IGV4ZWN1dGlvbiBvciBwYWdlIHJlbmRlcmluZy4KKyAgICBcYSBvayB3aWxsIGlu
ZGljYXRlIHdoZXRoZXIgdGhlIGxvYWQgd2FzIHN1Y2Nlc3NmdWwgb3IgYW55IGVycm9yIG9jY3Vy
cmVkLgorCisgICAgXHNhIGxvYWRTdGFydGVkKCksIEVycm9yUGFnZUV4dGVuc2lvbgorKi8KKwor
LyohCisgICAgXGZuIHZvaWQgUVdlYlBhZ2U6OmxpbmtIb3ZlcmVkKGNvbnN0IFFTdHJpbmcgJmxp
bmssIGNvbnN0IFFTdHJpbmcgJnRpdGxlLCBjb25zdCBRU3RyaW5nICZ0ZXh0Q29udGVudCkKKwor
ICAgIFRoaXMgc2lnbmFsIGlzIGVtaXR0ZWQgd2hlbiB0aGUgbW91c2UgaG92ZXJzIG92ZXIgYSBs
aW5rLgorCisgICAgXGEgbGluayBjb250YWlucyB0aGUgbGluayB1cmwuCisgICAgXGEgdGl0bGUg
aXMgdGhlIGxpbmsgZWxlbWVudCdzIHRpdGxlLCBpZiBpdCBpcyBzcGVjaWZpZWQgaW4gdGhlIG1h
cmt1cC4KKyAgICBcYSB0ZXh0Q29udGVudCBwcm92aWRlcyB0ZXh0IHdpdGhpbiB0aGUgbGluayBl
bGVtZW50LCBlLmcuLCB0ZXh0IGluc2lkZSBhbiBIVE1MIGFuY2hvciB0YWcuCisKKyAgICBXaGVu
IHRoZSBtb3VzZSBsZWF2ZXMgdGhlIGxpbmsgZWxlbWVudCB0aGUgc2lnbmFsIGlzIGVtaXR0ZWQg
d2l0aCBlbXB0eSBwYXJhbWV0ZXJzLgorCisgICAgXHNhIGxpbmtDbGlja2VkKCkKKyovCisKKy8q
IQorICAgIFxmbiB2b2lkIFFXZWJQYWdlOjpzdGF0dXNCYXJNZXNzYWdlKGNvbnN0IFFTdHJpbmcm
IHRleHQpCisKKyAgICBUaGlzIHNpZ25hbCBpcyBlbWl0dGVkIHdoZW4gdGhlIHN0YXR1c2JhciBc
YSB0ZXh0IGlzIGNoYW5nZWQgYnkgdGhlIHBhZ2UuCisqLworCisvKiEKKyAgICBcZm4gdm9pZCBR
V2ViUGFnZTo6ZnJhbWVDcmVhdGVkKFFXZWJGcmFtZSAqZnJhbWUpCisKKyAgICBUaGlzIHNpZ25h
bCBpcyBlbWl0dGVkIHdoZW5ldmVyIHRoZSBwYWdlIGNyZWF0ZXMgYSBuZXcgXGEgZnJhbWUuCisK
KyAgICBcc2EgY3VycmVudEZyYW1lKCkKKyovCisKKy8qIQorICAgIFxmbiB2b2lkIFFXZWJQYWdl
OjpzZWxlY3Rpb25DaGFuZ2VkKCkKKworICAgIFRoaXMgc2lnbmFsIGlzIGVtaXR0ZWQgd2hlbmV2
ZXIgdGhlIHNlbGVjdGlvbiBjaGFuZ2VzLCBlaXRoZXIgaW50ZXJhY3RpdmVseQorICAgIG9yIHBy
b2dyYW1tYXRpY2FsbHkgKGUuZy4gYnkgY2FsbGluZyB0cmlnZ2VyQWN0aW9uKCkgd2l0aCBhIHNl
bGVjdGlvbiBhY3Rpb24pLgorCisgICAgXHNhIHNlbGVjdGVkVGV4dCgpCisqLworCisvKiEKKyAg
ICBcZm4gdm9pZCBRV2ViUGFnZTo6Y29udGVudHNDaGFuZ2VkKCkKKyAgICBcc2luY2UgNC41CisK
KyAgICBUaGlzIHNpZ25hbCBpcyBlbWl0dGVkIHdoZW5ldmVyIHRoZSB0ZXh0IGluIGZvcm0gZWxl
bWVudHMgY2hhbmdlcworICAgIGFzIHdlbGwgYXMgb3RoZXIgZWRpdGFibGUgY29udGVudC4KKwor
ICAgIFxzYSBjb250ZW50RWRpdGFibGUsIG1vZGlmaWVkLCBRV2ViRnJhbWU6OnRvSHRtbCgpLCBR
V2ViRnJhbWU6OnRvUGxhaW5UZXh0KCkKKyovCisKKy8qIQorICAgIFxmbiB2b2lkIFFXZWJQYWdl
OjpnZW9tZXRyeUNoYW5nZVJlcXVlc3RlZChjb25zdCBRUmVjdCYgZ2VvbSkKKworICAgIFRoaXMg
c2lnbmFsIGlzIGVtaXR0ZWQgd2hlbmV2ZXIgdGhlIGRvY3VtZW50IHdhbnRzIHRvIGNoYW5nZSB0
aGUgcG9zaXRpb24gYW5kIHNpemUgb2YgdGhlCisgICAgcGFnZSB0byBcYSBnZW9tLiBUaGlzIGNh
biBoYXBwZW4gZm9yIGV4YW1wbGUgdGhyb3VnaCBKYXZhU2NyaXB0LgorKi8KKworLyohCisgICAg
XGZuIHZvaWQgUVdlYlBhZ2U6OnJlcGFpbnRSZXF1ZXN0ZWQoY29uc3QgUVJlY3QmIGRpcnR5UmVj
dCkKKworICAgIFRoaXMgc2lnbmFsIGlzIGVtaXR0ZWQgd2hlbmV2ZXIgdGhpcyBRV2ViUGFnZSBz
aG91bGQgYmUgdXBkYXRlZC4gSXQncyB1c2VmdWwKKyAgICB3aGVuIHJlbmRlcmluZyBhIFFXZWJQ
YWdlIHdpdGhvdXQgYSBRV2ViVmlldyBvciBRR3JhcGhpY3NXZWJWaWV3LgorICAgIFxhIGRpcnR5
UmVjdCBjb250YWlucyB0aGUgYXJlYSB0aGF0IG5lZWRzIHRvIGJlIHVwZGF0ZWQuIFRvIHBhaW50
IHRoZSBRV2ViUGFnZSBnZXQKKyAgICB0aGUgbWFpbkZyYW1lKCkgYW5kIGNhbGwgdGhlIHJlbmRl
cihRUGFpbnRlciosIGNvbnN0IFFSZWdpb24mKSBtZXRob2Qgd2l0aCB0aGUKKyAgICBcYSBkaXJ0
eVJlY3QgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIuCisKKyAgICBcc2EgbWFpbkZyYW1lKCkKKyAg
ICBcc2EgdmlldygpCisqLworCisvKiEKKyAgICBcZm4gdm9pZCBRV2ViUGFnZTo6c2Nyb2xsUmVx
dWVzdGVkKGludCBkeCwgaW50IGR5LCBjb25zdCBRUmVjdCYgcmVjdFRvU2Nyb2xsKQorCisgICAg
VGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuZXZlciB0aGUgY29udGVudCBnaXZlbiBieSBcYSBy
ZWN0VG9TY3JvbGwgbmVlZHMKKyAgICB0byBiZSBzY3JvbGxlZCBcYSBkeCBhbmQgXGEgZHkgZG93
bndhcmRzIGFuZCBubyB2aWV3IHdhcyBzZXQuCisKKyAgICBcc2EgdmlldygpCisqLworCisvKiEK
KyAgICBcZm4gdm9pZCBRV2ViUGFnZTo6d2luZG93Q2xvc2VSZXF1ZXN0ZWQoKQorCisgICAgVGhp
cyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuZXZlciB0aGUgcGFnZSByZXF1ZXN0cyB0aGUgd2ViIGJy
b3dzZXIgd2luZG93IHRvIGJlIGNsb3NlZCwKKyAgICBmb3IgZXhhbXBsZSB0aHJvdWdoIHRoZSBK
YXZhU2NyaXB0IFxje3dpbmRvdy5jbG9zZSgpfSBjYWxsLgorKi8KKworLyohCisgICAgXGZuIHZv
aWQgUVdlYlBhZ2U6OnByaW50UmVxdWVzdGVkKFFXZWJGcmFtZSAqZnJhbWUpCisKKyAgICBUaGlz
IHNpZ25hbCBpcyBlbWl0dGVkIHdoZW5ldmVyIHRoZSBwYWdlIHJlcXVlc3RzIHRoZSB3ZWIgYnJv
d3NlciB0byBwcmludCBcYSBmcmFtZSwKKyAgICBmb3IgZXhhbXBsZSB0aHJvdWdoIHRoZSBKYXZh
U2NyaXB0IFxje3dpbmRvdy5wcmludCgpfSBjYWxsLgorCisgICAgXHNhIFFXZWJGcmFtZTo6cHJp
bnQoKSwgUVByaW50UHJldmlld0RpYWxvZworKi8KKworLyohCisgICAgXGZuIHZvaWQgUVdlYlBh
Z2U6OnVuc3VwcG9ydGVkQ29udGVudChRTmV0d29ya1JlcGx5ICpyZXBseSkKKworICAgIFRoaXMg
c2lnbmFsIGlzIGVtaXR0ZWQgd2hlbiBXZWJLaXQgY2Fubm90IGhhbmRsZSBhIGxpbmsgdGhlIHVz
ZXIgbmF2aWdhdGVkIHRvIG9yIGEKKyAgICB3ZWIgc2VydmVyJ3MgcmVzcG9uc2UgaW5jbHVkZXMg
YSAiQ29udGVudC1EaXNwb3NpdGlvbiIgaGVhZGVyIHdpdGggdGhlICdhdHRhY2htZW50JyAKKyAg
ICBkaXJlY3RpdmUuIElmICJDb250ZW50LURpc3Bvc2l0aW9uIiBpcyBwcmVzZW50IGluIFxhIHJl
cGx5LCB0aGUgd2ViIHNlcnZlciBpcyBpbmRpY2F0aW5nCisgICAgdGhhdCB0aGUgY2xpZW50IHNo
b3VsZCBwcm9tcHQgdGhlIHVzZXIgdG8gc2F2ZSB0aGUgY29udGVudCByZWdhcmRsZXNzIG9mIGNv
bnRlbnQtdHlwZS4gCisgICAgU2VlIFJGQyAyNjE2IHNlY3Rpb25zIDE5LjUuMSBmb3IgZGV0YWls
cyBhYm91dCBDb250ZW50LURpc3Bvc2l0aW9uLgorCisgICAgQXQgc2lnbmFsIGVtaXNzaW9uIHRp
bWUgdGhlIG1ldGEtZGF0YSBvZiB0aGUgUU5ldHdvcmtSZXBseSBcYSByZXBseSBpcyBhdmFpbGFi
bGUuCisKKyAgICBcbm90ZSBUaGUgcmVjZWl2aW5nIHNsb3QgaXMgcmVzcG9uc2libGUgZm9yIGRl
bGV0aW5nIHRoZSBRTmV0d29ya1JlcGx5IFxhIHJlcGx5LgorCisgICAgXG5vdGUgVGhpcyBzaWdu
YWwgaXMgb25seSBlbWl0dGVkIGlmIHRoZSBmb3J3YXJkVW5zdXBwb3J0ZWRDb250ZW50IHByb3Bl
cnR5IGlzIHNldCB0byB0cnVlLgorCisgICAgXHNhIGRvd25sb2FkUmVxdWVzdGVkKCkKKyovCisK
Ky8qIQorICAgIFxmbiB2b2lkIFFXZWJQYWdlOjpkb3dubG9hZFJlcXVlc3RlZChjb25zdCBRTmV0
d29ya1JlcXVlc3QgJnJlcXVlc3QpCisKKyAgICBUaGlzIHNpZ25hbCBpcyBlbWl0dGVkIHdoZW4g
dGhlIHVzZXIgZGVjaWRlcyB0byBkb3dubG9hZCBhIGxpbmsuIFRoZSB1cmwgb2YKKyAgICB0aGUg
bGluayBhcyB3ZWxsIGFzIGFkZGl0aW9uYWwgbWV0YS1pbmZvcm1hdGlvbiBpcyBjb250YWluZWQg
aW4gXGEgcmVxdWVzdC4KKworICAgIFxzYSB1bnN1cHBvcnRlZENvbnRlbnQoKQorKi8KKworLyoh
CisgICAgXGZuIHZvaWQgUVdlYlBhZ2U6Om1pY3JvRm9jdXNDaGFuZ2VkKCkKKworICAgIFRoaXMg
c2lnbmFsIGlzIGVtaXR0ZWQgd2hlbiBmb3IgZXhhbXBsZSB0aGUgcG9zaXRpb24gb2YgdGhlIGN1
cnNvciBpbiBhbiBlZGl0YWJsZSBmb3JtCisgICAgZWxlbWVudCBjaGFuZ2VzLiBJdCBpcyB1c2Vk
IHRvIGluZm9ybSBpbnB1dCBtZXRob2RzIGFib3V0IHRoZSBuZXcgb24tc2NyZWVuIHBvc2l0aW9u
IHdoZXJlCisgICAgdGhlIHVzZXIgaXMgYWJsZSB0byBlbnRlciB0ZXh0LiBUaGlzIHNpZ25hbCBp
cyB1c3VhbGx5IGNvbm5lY3RlZCB0byB0aGUKKyAgICBRV2lkZ2V0Ojp1cGRhdGVNaWNyb0ZvY3Vz
KCkgc2xvdC4KKyovCisKKy8qIQorICAgIFxmbiB2b2lkIFFXZWJQYWdlOjpsaW5rQ2xpY2tlZChj
b25zdCBRVXJsICZ1cmwpCisKKyAgICBUaGlzIHNpZ25hbCBpcyBlbWl0dGVkIHdoZW5ldmVyIHRo
ZSB1c2VyIGNsaWNrcyBvbiBhIGxpbmsgYW5kIHRoZSBwYWdlJ3MgbGlua0RlbGVnYXRpb25Qb2xp
Y3kKKyAgICBwcm9wZXJ0eSBpcyBzZXQgdG8gZGVsZWdhdGUgdGhlIGxpbmsgaGFuZGxpbmcgZm9y
IHRoZSBzcGVjaWZpZWQgXGEgdXJsLgorCisgICAgQnkgZGVmYXVsdCBubyBsaW5rcyBhcmUgZGVs
ZWdhdGVkIGFuZCBhcmUgaGFuZGxlZCBieSBRV2ViUGFnZSBpbnN0ZWFkLgorCisgICAgXG5vdGUg
VGhpcyBzaWduYWwgcG9zc2libHkgd29uJ3QgYmUgZW1pdHRlZCBmb3IgY2xpY2tlZCBsaW5rcyB3
aGljaCB1c2UKKyAgICBKYXZhU2NyaXB0IHRvIHRyaWdnZXIgbmF2aWdhdGlvbi4KKworICAgIFxz
YSBsaW5rSG92ZXJlZCgpCisqLworCisvKiEKKyAgICBcZm4gdm9pZCBRV2ViUGFnZTo6dG9vbEJh
clZpc2liaWxpdHlDaGFuZ2VSZXF1ZXN0ZWQoYm9vbCB2aXNpYmxlKQorCisgICAgVGhpcyBzaWdu
YWwgaXMgZW1pdHRlZCB3aGVuZXZlciB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgdG9vbGJhciBpbiBh
IHdlYiBicm93c2VyCisgICAgd2luZG93IHRoYXQgaG9zdHMgUVdlYlBhZ2Ugc2hvdWxkIGJlIGNo
YW5nZWQgdG8gXGEgdmlzaWJsZS4KKyovCisKKy8qIQorICAgIFxmbiB2b2lkIFFXZWJQYWdlOjpz
dGF0dXNCYXJWaXNpYmlsaXR5Q2hhbmdlUmVxdWVzdGVkKGJvb2wgdmlzaWJsZSkKKworICAgIFRo
aXMgc2lnbmFsIGlzIGVtaXR0ZWQgd2hlbmV2ZXIgdGhlIHZpc2liaWxpdHkgb2YgdGhlIHN0YXR1
c2JhciBpbiBhIHdlYiBicm93c2VyCisgICAgd2luZG93IHRoYXQgaG9zdHMgUVdlYlBhZ2Ugc2hv
dWxkIGJlIGNoYW5nZWQgdG8gXGEgdmlzaWJsZS4KKyovCisKKy8qIQorICAgIFxmbiB2b2lkIFFX
ZWJQYWdlOjptZW51QmFyVmlzaWJpbGl0eUNoYW5nZVJlcXVlc3RlZChib29sIHZpc2libGUpCisK
KyAgICBUaGlzIHNpZ25hbCBpcyBlbWl0dGVkIHdoZW5ldmVyIHRoZSB2aXNpYmlsaXR5IG9mIHRo
ZSBtZW51YmFyIGluIGEgd2ViIGJyb3dzZXIKKyAgICB3aW5kb3cgdGhhdCBob3N0cyBRV2ViUGFn
ZSBzaG91bGQgYmUgY2hhbmdlZCB0byBcYSB2aXNpYmxlLgorKi8KKworLyohCisgICAgXGZuIHZv
aWQgUVdlYlBhZ2U6OmRhdGFiYXNlUXVvdGFFeGNlZWRlZChRV2ViRnJhbWUqIGZyYW1lLCBRU3Ry
aW5nIGRhdGFiYXNlTmFtZSk7CisgICAgXHNpbmNlIDQuNQorCisgICAgVGhpcyBzaWduYWwgaXMg
ZW1pdHRlZCB3aGVuZXZlciB0aGUgd2ViIHNpdGUgc2hvd24gaW4gXGEgZnJhbWUgaXMgYXNraW5n
IHRvIHN0b3JlIGRhdGEKKyAgICB0byB0aGUgZGF0YWJhc2UgXGEgZGF0YWJhc2VOYW1lIGFuZCB0
aGUgcXVvdGEgYWxsb2NhdGVkIHRvIHRoYXQgd2ViIHNpdGUgaXMgZXhjZWVkZWQuCisKKyAgICBc
c2EgUVdlYkRhdGFiYXNlCisqLworLyohCisgICAgXGZuIHZvaWQgUVdlYlBhZ2U6OmFwcGxpY2F0
aW9uQ2FjaGVRdW90YUV4Y2VlZGVkKFFXZWJTZWN1cml0eU9yaWdpbiogb3JpZ2luLCBxdWludDY0
IGRlZmF1bHRPcmlnaW5RdW90YSwgcXVpbnQ2NCB0b3RhbFNwYWNlTmVlZGVkKTsKKworICAgIFRo
aXMgc2lnbmFsIGlzIGVtaXR0ZWQgd2hlbmV2ZXIgdGhlIHdlYiBzaXRlIGlzIGFza2luZyB0byBz
dG9yZSBkYXRhIHRvIHRoZSBhcHBsaWNhdGlvbiBjYWNoZQorICAgIGRhdGFiYXNlIGRhdGFiYXNl
TmFtZSBhbmQgdGhlIHF1b3RhIGFsbG9jYXRlZCB0byB0aGF0IHdlYiBzaXRlIGlzIGV4Y2VlZGVk
LgorCisqLworCisvKiEKKyAgXHNpbmNlIDQuNQorICBcZm4gdm9pZCBRV2ViUGFnZTo6c2F2ZUZy
YW1lU3RhdGVSZXF1ZXN0ZWQoUVdlYkZyYW1lKiBmcmFtZSwgUVdlYkhpc3RvcnlJdGVtKiBpdGVt
KTsKKworICBUaGlzIHNpZ25hbCBpcyBlbWl0dGVkIHNob3J0bHkgYmVmb3JlIHRoZSBoaXN0b3J5
IG9mIG5hdmlnYXRlZCBwYWdlcworICBpbiBcYSBmcmFtZSBpcyBjaGFuZ2VkLCBmb3IgZXhhbXBs
ZSB3aGVuIG5hdmlnYXRpbmcgYmFjayBpbiB0aGUgaGlzdG9yeS4KKworICBUaGUgcHJvdmlkZWQg
UVdlYkhpc3RvcnlJdGVtLCBcYSBpdGVtLCBob2xkcyB0aGUgaGlzdG9yeSBlbnRyeSBvZiB0aGUg
ZnJhbWUgYmVmb3JlCisgIHRoZSBjaGFuZ2UuCisKKyAgQSBwb3RlbnRpYWwgdXNlLWNhc2UgZm9y
IHRoaXMgc2lnbmFsIGlzIHRvIHN0b3JlIGN1c3RvbSBkYXRhIGluCisgIHRoZSBRV2ViSGlzdG9y
eUl0ZW0gYXNzb2NpYXRlZCB0byB0aGUgZnJhbWUsIHVzaW5nIFFXZWJIaXN0b3J5SXRlbTo6c2V0
VXNlckRhdGEoKS4KKyovCisKKy8qIQorICBcc2luY2UgNC41CisgIFxmbiB2b2lkIFFXZWJQYWdl
OjpyZXN0b3JlRnJhbWVTdGF0ZVJlcXVlc3RlZChRV2ViRnJhbWUqIGZyYW1lKTsKKworICBUaGlz
IHNpZ25hbCBpcyBlbWl0dGVkIHdoZW4gdGhlIGxvYWQgb2YgXGEgZnJhbWUgaXMgZmluaXNoZWQg
YW5kIHRoZSBhcHBsaWNhdGlvbiBtYXkgbm93IHVwZGF0ZSBpdHMgc3RhdGUgYWNjb3JkaW5nbHku
CisqLworCisvKiEKKyAgXGZuIFFXZWJQYWdlUHJpdmF0ZSogUVdlYlBhZ2U6OmhhbmRsZSgpIGNv
bnN0CisgIFxpbnRlcm5hbAorKi8KKworI2luY2x1ZGUgIm1vY19xd2VicGFnZS5jcHAiCmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldEFwaS9xd2VicGFnZS5oIGIvU291cmNlL1dl
YktpdC9xdC9XaWRnZXRBcGkvcXdlYnBhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi41NjI0YjQ5OWJkN2VjYTlk
NGNiMDVkMTBkYzM5MTA1ZjM0YjU1YTQxCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktp
dC9xdC9XaWRnZXRBcGkvcXdlYnBhZ2UuaApAQCAtMCwwICsxLDQ0OCBAQAorLyoKKyAgICBDb3B5
cmlnaHQgKEMpIDIwMDggTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1p
ZXMpCisgICAgQ29weXJpZ2h0IChDKSAyMDA3IFN0YWlrb3MgQ29tcHV0aW5nIFNlcnZpY2VzIElu
Yy4KKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJp
YnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg
TGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBG
cmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGlj
ZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMg
bGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVs
LAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVk
IHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExp
Y2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBh
IGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9u
ZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3
cml0ZSB0bworICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5r
bGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgICAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0Eu
CisqLworCisjaWZuZGVmIFFXRUJQQUdFX0gKKyNkZWZpbmUgUVdFQlBBR0VfSAorCisjaW5jbHVk
ZSA8UXRXZWJLaXQvcXdlYmtpdGdsb2JhbC5oPgorI2luY2x1ZGUgPFF0V2ViS2l0L3F3ZWJzZXR0
aW5ncy5oPgorCisjaW5jbHVkZSA8UXRDb3JlL3FvYmplY3QuaD4KKyNpbmNsdWRlIDxRdENvcmUv
cXVybC5oPgorI2luY2x1ZGUgPFF0V2lkZ2V0cy9xd2lkZ2V0Lmg+CisKK1FUX0JFR0lOX05BTUVT
UEFDRQorY2xhc3MgUU5ldHdvcmtQcm94eTsKK2NsYXNzIFFVbmRvU3RhY2s7CitjbGFzcyBRTWVu
dTsKK2NsYXNzIFFOZXR3b3JrUmVxdWVzdDsKK2NsYXNzIFFOZXR3b3JrUmVwbHk7CitjbGFzcyBR
TmV0d29ya0FjY2Vzc01hbmFnZXI7CitRVF9FTkRfTkFNRVNQQUNFCisKK2NsYXNzIFFXZWJFbGVt
ZW50OworY2xhc3MgUVdlYkZyYW1lOworY2xhc3MgUVdlYk5ldHdvcmtSZXF1ZXN0OworY2xhc3Mg
UVdlYkhpc3Rvcnk7CisKK2NsYXNzIFFXZWJGcmFtZURhdGE7CitjbGFzcyBRV2ViSGlzdG9yeUl0
ZW07CitjbGFzcyBRV2ViSGl0VGVzdFJlc3VsdDsKK2NsYXNzIFFXZWJOZXR3b3JrSW50ZXJmYWNl
OworY2xhc3MgUVdlYlBhZ2VBZGFwdGVyOworY2xhc3MgUVdlYlBhZ2VQcml2YXRlOworY2xhc3Mg
UVdlYlBsdWdpbkZhY3Rvcnk7CitjbGFzcyBRV2ViU2VjdXJpdHlPcmlnaW47CitjbGFzcyBRdFZp
ZXdwb3J0QXR0cmlidXRlc1ByaXZhdGU7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKyAgICBjbGFz
cyBDaHJvbWVDbGllbnRRdDsKKyAgICBjbGFzcyBFZGl0b3JDbGllbnRRdDsKKyAgICBjbGFzcyBG
cmFtZUxvYWRlckNsaWVudFF0OworICAgIGNsYXNzIEluc3BlY3RvckNsaWVudFF0OworICAgIGNs
YXNzIEluc3BlY3RvclNlcnZlclJlcXVlc3RIYW5kbGVyUXQ7CisgICAgY2xhc3MgSW5zcGVjdG9y
RnJvbnRlbmRDbGllbnRRdDsKKyAgICBjbGFzcyBSZXNvdXJjZUhhbmRsZTsKKyAgICBjbGFzcyBR
TmV0d29ya1JlcGx5SGFuZGxlcjsKKworICAgIHN0cnVjdCBGcmFtZUxvYWRSZXF1ZXN0OworfQor
CitjbGFzcyBRV0VCS0lUX0VYUE9SVCBRV2ViUGFnZSA6IHB1YmxpYyBRT2JqZWN0IHsKKyAgICBR
X09CSkVDVAorCisgICAgUV9QUk9QRVJUWShib29sIG1vZGlmaWVkIFJFQUQgaXNNb2RpZmllZCkK
KyAgICBRX1BST1BFUlRZKFFTdHJpbmcgc2VsZWN0ZWRUZXh0IFJFQUQgc2VsZWN0ZWRUZXh0KQor
ICAgIFFfUFJPUEVSVFkoUVN0cmluZyBzZWxlY3RlZEh0bWwgUkVBRCBzZWxlY3RlZEh0bWwpCisg
ICAgUV9QUk9QRVJUWShib29sIGhhc1NlbGVjdGlvbiBSRUFEIGhhc1NlbGVjdGlvbikKKyAgICBR
X1BST1BFUlRZKFFTaXplIHZpZXdwb3J0U2l6ZSBSRUFEIHZpZXdwb3J0U2l6ZSBXUklURSBzZXRW
aWV3cG9ydFNpemUpCisgICAgUV9QUk9QRVJUWShRU2l6ZSBwcmVmZXJyZWRDb250ZW50c1NpemUg
UkVBRCBwcmVmZXJyZWRDb250ZW50c1NpemUgV1JJVEUgc2V0UHJlZmVycmVkQ29udGVudHNTaXpl
KQorICAgIFFfUFJPUEVSVFkoYm9vbCBmb3J3YXJkVW5zdXBwb3J0ZWRDb250ZW50IFJFQUQgZm9y
d2FyZFVuc3VwcG9ydGVkQ29udGVudCBXUklURSBzZXRGb3J3YXJkVW5zdXBwb3J0ZWRDb250ZW50
KQorICAgIFFfUFJPUEVSVFkoTGlua0RlbGVnYXRpb25Qb2xpY3kgbGlua0RlbGVnYXRpb25Qb2xp
Y3kgUkVBRCBsaW5rRGVsZWdhdGlvblBvbGljeSBXUklURSBzZXRMaW5rRGVsZWdhdGlvblBvbGlj
eSkKKyAgICBRX1BST1BFUlRZKFFQYWxldHRlIHBhbGV0dGUgUkVBRCBwYWxldHRlIFdSSVRFIHNl
dFBhbGV0dGUpCisgICAgUV9QUk9QRVJUWShib29sIGNvbnRlbnRFZGl0YWJsZSBSRUFEIGlzQ29u
dGVudEVkaXRhYmxlIFdSSVRFIHNldENvbnRlbnRFZGl0YWJsZSkKKyAgICBRX0VOVU1TKExpbmtE
ZWxlZ2F0aW9uUG9saWN5IE5hdmlnYXRpb25UeXBlIFdlYkFjdGlvbikKK3B1YmxpYzoKKyAgICBl
bnVtIE5hdmlnYXRpb25UeXBlIHsKKyAgICAgICAgTmF2aWdhdGlvblR5cGVMaW5rQ2xpY2tlZCwK
KyAgICAgICAgTmF2aWdhdGlvblR5cGVGb3JtU3VibWl0dGVkLAorICAgICAgICBOYXZpZ2F0aW9u
VHlwZUJhY2tPckZvcndhcmQsCisgICAgICAgIE5hdmlnYXRpb25UeXBlUmVsb2FkLAorICAgICAg
ICBOYXZpZ2F0aW9uVHlwZUZvcm1SZXN1Ym1pdHRlZCwKKyAgICAgICAgTmF2aWdhdGlvblR5cGVP
dGhlcgorICAgIH07CisKKyAgICBlbnVtIFdlYkFjdGlvbiB7CisgICAgICAgIE5vV2ViQWN0aW9u
ID0gLSAxLAorCisgICAgICAgIE9wZW5MaW5rLAorCisgICAgICAgIE9wZW5MaW5rSW5OZXdXaW5k
b3csCisgICAgICAgIE9wZW5GcmFtZUluTmV3V2luZG93LAorCisgICAgICAgIERvd25sb2FkTGlu
a1RvRGlzaywKKyAgICAgICAgQ29weUxpbmtUb0NsaXBib2FyZCwKKworICAgICAgICBPcGVuSW1h
Z2VJbk5ld1dpbmRvdywKKyAgICAgICAgRG93bmxvYWRJbWFnZVRvRGlzaywKKyAgICAgICAgQ29w
eUltYWdlVG9DbGlwYm9hcmQsCisKKyAgICAgICAgQmFjaywKKyAgICAgICAgRm9yd2FyZCwKKyAg
ICAgICAgU3RvcCwKKyAgICAgICAgUmVsb2FkLAorCisgICAgICAgIEN1dCwKKyAgICAgICAgQ29w
eSwKKyAgICAgICAgUGFzdGUsCisKKyAgICAgICAgVW5kbywKKyAgICAgICAgUmVkbywKKyAgICAg
ICAgTW92ZVRvTmV4dENoYXIsCisgICAgICAgIE1vdmVUb1ByZXZpb3VzQ2hhciwKKyAgICAgICAg
TW92ZVRvTmV4dFdvcmQsCisgICAgICAgIE1vdmVUb1ByZXZpb3VzV29yZCwKKyAgICAgICAgTW92
ZVRvTmV4dExpbmUsCisgICAgICAgIE1vdmVUb1ByZXZpb3VzTGluZSwKKyAgICAgICAgTW92ZVRv
U3RhcnRPZkxpbmUsCisgICAgICAgIE1vdmVUb0VuZE9mTGluZSwKKyAgICAgICAgTW92ZVRvU3Rh
cnRPZkJsb2NrLAorICAgICAgICBNb3ZlVG9FbmRPZkJsb2NrLAorICAgICAgICBNb3ZlVG9TdGFy
dE9mRG9jdW1lbnQsCisgICAgICAgIE1vdmVUb0VuZE9mRG9jdW1lbnQsCisgICAgICAgIFNlbGVj
dE5leHRDaGFyLAorICAgICAgICBTZWxlY3RQcmV2aW91c0NoYXIsCisgICAgICAgIFNlbGVjdE5l
eHRXb3JkLAorICAgICAgICBTZWxlY3RQcmV2aW91c1dvcmQsCisgICAgICAgIFNlbGVjdE5leHRM
aW5lLAorICAgICAgICBTZWxlY3RQcmV2aW91c0xpbmUsCisgICAgICAgIFNlbGVjdFN0YXJ0T2ZM
aW5lLAorICAgICAgICBTZWxlY3RFbmRPZkxpbmUsCisgICAgICAgIFNlbGVjdFN0YXJ0T2ZCbG9j
aywKKyAgICAgICAgU2VsZWN0RW5kT2ZCbG9jaywKKyAgICAgICAgU2VsZWN0U3RhcnRPZkRvY3Vt
ZW50LAorICAgICAgICBTZWxlY3RFbmRPZkRvY3VtZW50LAorICAgICAgICBEZWxldGVTdGFydE9m
V29yZCwKKyAgICAgICAgRGVsZXRlRW5kT2ZXb3JkLAorCisgICAgICAgIFNldFRleHREaXJlY3Rp
b25EZWZhdWx0LAorICAgICAgICBTZXRUZXh0RGlyZWN0aW9uTGVmdFRvUmlnaHQsCisgICAgICAg
IFNldFRleHREaXJlY3Rpb25SaWdodFRvTGVmdCwKKworICAgICAgICBUb2dnbGVCb2xkLAorICAg
ICAgICBUb2dnbGVJdGFsaWMsCisgICAgICAgIFRvZ2dsZVVuZGVybGluZSwKKworICAgICAgICBJ
bnNwZWN0RWxlbWVudCwKKworICAgICAgICBJbnNlcnRQYXJhZ3JhcGhTZXBhcmF0b3IsCisgICAg
ICAgIEluc2VydExpbmVTZXBhcmF0b3IsCisKKyAgICAgICAgU2VsZWN0QWxsLAorICAgICAgICBS
ZWxvYWRBbmRCeXBhc3NDYWNoZSwKKworICAgICAgICBQYXN0ZUFuZE1hdGNoU3R5bGUsCisgICAg
ICAgIFJlbW92ZUZvcm1hdCwKKworICAgICAgICBUb2dnbGVTdHJpa2V0aHJvdWdoLAorICAgICAg
ICBUb2dnbGVTdWJzY3JpcHQsCisgICAgICAgIFRvZ2dsZVN1cGVyc2NyaXB0LAorICAgICAgICBJ
bnNlcnRVbm9yZGVyZWRMaXN0LAorICAgICAgICBJbnNlcnRPcmRlcmVkTGlzdCwKKyAgICAgICAg
SW5kZW50LAorICAgICAgICBPdXRkZW50LAorCisgICAgICAgIEFsaWduQ2VudGVyLAorICAgICAg
ICBBbGlnbkp1c3RpZmllZCwKKyAgICAgICAgQWxpZ25MZWZ0LAorICAgICAgICBBbGlnblJpZ2h0
LAorCisgICAgICAgIFN0b3BTY2hlZHVsZWRQYWdlUmVmcmVzaCwKKworICAgICAgICBDb3B5SW1h
Z2VVcmxUb0NsaXBib2FyZCwKKworICAgICAgICBPcGVuTGlua0luVGhpc1dpbmRvdywKKworICAg
ICAgICBXZWJBY3Rpb25Db3VudAorICAgIH07CisKKyAgICBlbnVtIEZpbmRGbGFnIHsKKyAgICAg
ICAgRmluZEJhY2t3YXJkID0gMSwKKyAgICAgICAgRmluZENhc2VTZW5zaXRpdmVseSA9IDIsCisg
ICAgICAgIEZpbmRXcmFwc0Fyb3VuZERvY3VtZW50ID0gNCwKKyAgICAgICAgSGlnaGxpZ2h0QWxs
T2NjdXJyZW5jZXMgPSA4CisgICAgfTsKKyAgICBRX0RFQ0xBUkVfRkxBR1MoRmluZEZsYWdzLCBG
aW5kRmxhZykKKworICAgIGVudW0gTGlua0RlbGVnYXRpb25Qb2xpY3kgeworICAgICAgICBEb250
RGVsZWdhdGVMaW5rcywKKyAgICAgICAgRGVsZWdhdGVFeHRlcm5hbExpbmtzLAorICAgICAgICBE
ZWxlZ2F0ZUFsbExpbmtzCisgICAgfTsKKworICAgIGVudW0gV2ViV2luZG93VHlwZSB7CisgICAg
ICAgIFdlYkJyb3dzZXJXaW5kb3csCisgICAgICAgIFdlYk1vZGFsRGlhbG9nCisgICAgfTsKKwor
ICAgIGVudW0gUGVybWlzc2lvblBvbGljeSB7CisgICAgICAgIFBlcm1pc3Npb25Vbmtub3duLAor
ICAgICAgICBQZXJtaXNzaW9uR3JhbnRlZEJ5VXNlciwKKyAgICAgICAgUGVybWlzc2lvbkRlbmll
ZEJ5VXNlcgorICAgIH07CisKKyAgICBlbnVtIEZlYXR1cmUgeworICAgICAgICBOb3RpZmljYXRp
b25zLAorICAgICAgICBHZW9sb2NhdGlvbgorICAgIH07CisKKyAgICBjbGFzcyBRV0VCS0lUX0VY
UE9SVCBWaWV3cG9ydEF0dHJpYnV0ZXMgeworICAgIHB1YmxpYzoKKyAgICAgICAgVmlld3BvcnRB
dHRyaWJ1dGVzKCk7CisgICAgICAgIFZpZXdwb3J0QXR0cmlidXRlcyhjb25zdCBRV2ViUGFnZTo6
Vmlld3BvcnRBdHRyaWJ1dGVzJiBvdGhlcik7CisKKyAgICAgICAgflZpZXdwb3J0QXR0cmlidXRl
cygpOworCisgICAgICAgIFFXZWJQYWdlOjpWaWV3cG9ydEF0dHJpYnV0ZXMmIG9wZXJhdG9yPShj
b25zdCBRV2ViUGFnZTo6Vmlld3BvcnRBdHRyaWJ1dGVzJiBvdGhlcik7CisKKyAgICAgICAgaW5s
aW5lIHFyZWFsIGluaXRpYWxTY2FsZUZhY3RvcigpIGNvbnN0IHsgcmV0dXJuIG1faW5pdGlhbFNj
YWxlRmFjdG9yOyB9CisgICAgICAgIGlubGluZSBxcmVhbCBtaW5pbXVtU2NhbGVGYWN0b3IoKSBj
b25zdCB7IHJldHVybiBtX21pbmltdW1TY2FsZUZhY3RvcjsgfQorICAgICAgICBpbmxpbmUgcXJl
YWwgbWF4aW11bVNjYWxlRmFjdG9yKCkgY29uc3QgeyByZXR1cm4gbV9tYXhpbXVtU2NhbGVGYWN0
b3I7IH0KKyAgICAgICAgaW5saW5lIHFyZWFsIGRldmljZVBpeGVsUmF0aW8oKSBjb25zdCB7IHJl
dHVybiBtX2RldmljZVBpeGVsUmF0aW87IH0KKyAgICAgICAgaW5saW5lIGJvb2wgaXNVc2VyU2Nh
bGFibGUoKSBjb25zdCB7IHJldHVybiBtX2lzVXNlclNjYWxhYmxlOyB9CisgICAgICAgIGlubGlu
ZSBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBtX2lzVmFsaWQ7IH0KKyAgICAgICAgaW5s
aW5lIFFTaXplRiBzaXplKCkgY29uc3QgeyByZXR1cm4gbV9zaXplOyB9CisKKyAgICBwcml2YXRl
OgorICAgICAgICBRU2hhcmVkRGF0YVBvaW50ZXI8UXRWaWV3cG9ydEF0dHJpYnV0ZXNQcml2YXRl
PiBkOworICAgICAgICBxcmVhbCBtX2luaXRpYWxTY2FsZUZhY3RvcjsKKyAgICAgICAgcXJlYWwg
bV9taW5pbXVtU2NhbGVGYWN0b3I7CisgICAgICAgIHFyZWFsIG1fbWF4aW11bVNjYWxlRmFjdG9y
OworICAgICAgICBxcmVhbCBtX2RldmljZVBpeGVsUmF0aW87CisgICAgICAgIGJvb2wgbV9pc1Vz
ZXJTY2FsYWJsZTsKKyAgICAgICAgYm9vbCBtX2lzVmFsaWQ7CisgICAgICAgIFFTaXplRiBtX3Np
emU7CisKKyAgICAgICAgZnJpZW5kIGNsYXNzIFdlYkNvcmU6OkNocm9tZUNsaWVudFF0OworICAg
ICAgICBmcmllbmQgY2xhc3MgUVdlYlBhZ2U7CisgICAgfTsKKworCisgICAgZXhwbGljaXQgUVdl
YlBhZ2UoUU9iamVjdCAqcGFyZW50ID0gMCk7CisgICAgflFXZWJQYWdlKCk7CisKKyAgICBRV2Vi
RnJhbWUgKm1haW5GcmFtZSgpIGNvbnN0OworICAgIFFXZWJGcmFtZSAqY3VycmVudEZyYW1lKCkg
Y29uc3Q7CisgICAgUVdlYkZyYW1lKiBmcmFtZUF0KGNvbnN0IFFQb2ludCYgcG9zKSBjb25zdDsK
KworICAgIFFXZWJIaXN0b3J5ICpoaXN0b3J5KCkgY29uc3Q7CisgICAgUVdlYlNldHRpbmdzICpz
ZXR0aW5ncygpIGNvbnN0OworCisgICAgdm9pZCBzZXRWaWV3KFFXaWRnZXQgKnZpZXcpOworICAg
IFFXaWRnZXQgKnZpZXcoKSBjb25zdDsKKworICAgIGJvb2wgaXNNb2RpZmllZCgpIGNvbnN0Owor
I2lmbmRlZiBRVF9OT19VTkRPU1RBQ0sKKyAgICBRVW5kb1N0YWNrICp1bmRvU3RhY2soKSBjb25z
dDsKKyNlbmRpZgorCisgICAgdm9pZCBzZXROZXR3b3JrQWNjZXNzTWFuYWdlcihRTmV0d29ya0Fj
Y2Vzc01hbmFnZXIgKm1hbmFnZXIpOworICAgIFFOZXR3b3JrQWNjZXNzTWFuYWdlciAqbmV0d29y
a0FjY2Vzc01hbmFnZXIoKSBjb25zdDsKKworICAgIHZvaWQgc2V0UGx1Z2luRmFjdG9yeShRV2Vi
UGx1Z2luRmFjdG9yeSAqZmFjdG9yeSk7CisgICAgUVdlYlBsdWdpbkZhY3RvcnkgKnBsdWdpbkZh
Y3RvcnkoKSBjb25zdDsKKworICAgIHF1aW50NjQgdG90YWxCeXRlcygpIGNvbnN0OworICAgIHF1
aW50NjQgYnl0ZXNSZWNlaXZlZCgpIGNvbnN0OworCisgICAgYm9vbCBoYXNTZWxlY3Rpb24oKSBj
b25zdDsKKyAgICBRU3RyaW5nIHNlbGVjdGVkVGV4dCgpIGNvbnN0OworICAgIFFTdHJpbmcgc2Vs
ZWN0ZWRIdG1sKCkgY29uc3Q7CisKKyNpZm5kZWYgUVRfTk9fQUNUSU9OCisgICAgUUFjdGlvbiAq
YWN0aW9uKFdlYkFjdGlvbiBhY3Rpb24pIGNvbnN0OworI2VuZGlmCisgICAgdmlydHVhbCB2b2lk
IHRyaWdnZXJBY3Rpb24oV2ViQWN0aW9uIGFjdGlvbiwgYm9vbCBjaGVja2VkID0gZmFsc2UpOwor
CisgICAgUVNpemUgdmlld3BvcnRTaXplKCkgY29uc3Q7CisgICAgdm9pZCBzZXRWaWV3cG9ydFNp
emUoY29uc3QgUVNpemUgJnNpemUpIGNvbnN0OworICAgIFZpZXdwb3J0QXR0cmlidXRlcyB2aWV3
cG9ydEF0dHJpYnV0ZXNGb3JTaXplKGNvbnN0IFFTaXplJiBhdmFpbGFibGVTaXplKSBjb25zdDsK
KworICAgIFFTaXplIHByZWZlcnJlZENvbnRlbnRzU2l6ZSgpIGNvbnN0OworICAgIHZvaWQgc2V0
UHJlZmVycmVkQ29udGVudHNTaXplKGNvbnN0IFFTaXplICZzaXplKSBjb25zdDsKKyAgICB2b2lk
IHNldEFjdHVhbFZpc2libGVDb250ZW50UmVjdChjb25zdCBRUmVjdCYgcmVjdCkgY29uc3Q7CisK
KyAgICB2aXJ0dWFsIGJvb2wgZXZlbnQoUUV2ZW50Kik7CisgICAgYm9vbCBmb2N1c05leHRQcmV2
Q2hpbGQoYm9vbCBuZXh0KTsKKworICAgIFFWYXJpYW50IGlucHV0TWV0aG9kUXVlcnkoUXQ6Oklu
cHV0TWV0aG9kUXVlcnkgcHJvcGVydHkpIGNvbnN0OworCisgICAgYm9vbCBmaW5kVGV4dChjb25z
dCBRU3RyaW5nICZzdWJTdHJpbmcsIEZpbmRGbGFncyBvcHRpb25zID0gMCk7CisKKyAgICB2b2lk
IHNldEZvcndhcmRVbnN1cHBvcnRlZENvbnRlbnQoYm9vbCBmb3J3YXJkKTsKKyAgICBib29sIGZv
cndhcmRVbnN1cHBvcnRlZENvbnRlbnQoKSBjb25zdDsKKworICAgIHZvaWQgc2V0TGlua0RlbGVn
YXRpb25Qb2xpY3koTGlua0RlbGVnYXRpb25Qb2xpY3kgcG9saWN5KTsKKyAgICBMaW5rRGVsZWdh
dGlvblBvbGljeSBsaW5rRGVsZWdhdGlvblBvbGljeSgpIGNvbnN0OworCisgICAgdm9pZCBzZXRQ
YWxldHRlKGNvbnN0IFFQYWxldHRlICZwYWxldHRlKTsKKyAgICBRUGFsZXR0ZSBwYWxldHRlKCkg
Y29uc3Q7CisKKyAgICB2b2lkIHNldENvbnRlbnRFZGl0YWJsZShib29sIGVkaXRhYmxlKTsKKyAg
ICBib29sIGlzQ29udGVudEVkaXRhYmxlKCkgY29uc3Q7CisKKyNpZm5kZWYgUVRfTk9fQ09OVEVY
VE1FTlUKKyAgICBib29sIHN3YWxsb3dDb250ZXh0TWVudUV2ZW50KFFDb250ZXh0TWVudUV2ZW50
ICpldmVudCk7CisjZW5kaWYKKyAgICB2b2lkIHVwZGF0ZVBvc2l0aW9uRGVwZW5kZW50QWN0aW9u
cyhjb25zdCBRUG9pbnQgJnBvcyk7CisKKyAgICBRTWVudSAqY3JlYXRlU3RhbmRhcmRDb250ZXh0
TWVudSgpOworCisgICAgdm9pZCBzZXRGZWF0dXJlUGVybWlzc2lvbihRV2ViRnJhbWUqIGZyYW1l
LCBGZWF0dXJlIGZlYXR1cmUsIFBlcm1pc3Npb25Qb2xpY3kgcG9saWN5KTsKKworICAgIFFTdHJp
bmdMaXN0IHN1cHBvcnRlZENvbnRlbnRUeXBlcygpIGNvbnN0OworICAgIGJvb2wgc3VwcG9ydHND
b250ZW50VHlwZShjb25zdCBRU3RyaW5nJiBtaW1lVHlwZSkgY29uc3Q7CisKKyAgICBlbnVtIEV4
dGVuc2lvbiB7CisgICAgICAgIENob29zZU11bHRpcGxlRmlsZXNFeHRlbnNpb24sCisgICAgICAg
IEVycm9yUGFnZUV4dGVuc2lvbgorICAgIH07CisgICAgY2xhc3MgRXh0ZW5zaW9uT3B0aW9uCisg
ICAge307CisgICAgY2xhc3MgRXh0ZW5zaW9uUmV0dXJuCisgICAge307CisKKyAgICBjbGFzcyBD
aG9vc2VNdWx0aXBsZUZpbGVzRXh0ZW5zaW9uT3B0aW9uIDogcHVibGljIEV4dGVuc2lvbk9wdGlv
biB7CisgICAgcHVibGljOgorICAgICAgICBRV2ViRnJhbWUgKnBhcmVudEZyYW1lOworICAgICAg
ICBRU3RyaW5nTGlzdCBzdWdnZXN0ZWRGaWxlTmFtZXM7CisgICAgfTsKKworICAgIGNsYXNzIENo
b29zZU11bHRpcGxlRmlsZXNFeHRlbnNpb25SZXR1cm4gOiBwdWJsaWMgRXh0ZW5zaW9uUmV0dXJu
IHsKKyAgICBwdWJsaWM6CisgICAgICAgIFFTdHJpbmdMaXN0IGZpbGVOYW1lczsKKyAgICB9Owor
CisgICAgZW51bSBFcnJvckRvbWFpbiB7IFF0TmV0d29yaywgSHR0cCwgV2ViS2l0IH07CisgICAg
Y2xhc3MgRXJyb3JQYWdlRXh0ZW5zaW9uT3B0aW9uIDogcHVibGljIEV4dGVuc2lvbk9wdGlvbiB7
CisgICAgcHVibGljOgorICAgICAgICBRVXJsIHVybDsKKyAgICAgICAgUVdlYkZyYW1lKiBmcmFt
ZTsKKyAgICAgICAgRXJyb3JEb21haW4gZG9tYWluOworICAgICAgICBpbnQgZXJyb3I7CisgICAg
ICAgIFFTdHJpbmcgZXJyb3JTdHJpbmc7CisgICAgfTsKKworICAgIGNsYXNzIEVycm9yUGFnZUV4
dGVuc2lvblJldHVybiA6IHB1YmxpYyBFeHRlbnNpb25SZXR1cm4geworICAgIHB1YmxpYzoKKyAg
ICAgICAgRXJyb3JQYWdlRXh0ZW5zaW9uUmV0dXJuKCkgOiBjb250ZW50VHlwZShRTGF0aW4xU3Ry
aW5nKCJ0ZXh0L2h0bWwiKSksIGVuY29kaW5nKFFMYXRpbjFTdHJpbmcoInV0Zi04IikpIHt9Owor
ICAgICAgICBRU3RyaW5nIGNvbnRlbnRUeXBlOworICAgICAgICBRU3RyaW5nIGVuY29kaW5nOwor
ICAgICAgICBRVXJsIGJhc2VVcmw7CisgICAgICAgIFFCeXRlQXJyYXkgY29udGVudDsKKyAgICB9
OworCisKKyAgICB2aXJ0dWFsIGJvb2wgZXh0ZW5zaW9uKEV4dGVuc2lvbiBleHRlbnNpb24sIGNv
bnN0IEV4dGVuc2lvbk9wdGlvbiAqb3B0aW9uID0gMCwgRXh0ZW5zaW9uUmV0dXJuICpvdXRwdXQg
PSAwKTsKKyAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydHNFeHRlbnNpb24oRXh0ZW5zaW9uIGV4dGVu
c2lvbikgY29uc3Q7CisKKyAgICBRV2ViUGFnZUFkYXB0ZXIqIGhhbmRsZSgpIGNvbnN0OworCisg
ICAgdmlydHVhbCBib29sIHNob3VsZEludGVycnVwdEphdmFTY3JpcHQoKTsKKworUV9TSUdOQUxT
OgorICAgIHZvaWQgbG9hZFN0YXJ0ZWQoKTsKKyAgICB2b2lkIGxvYWRQcm9ncmVzcyhpbnQgcHJv
Z3Jlc3MpOworICAgIHZvaWQgbG9hZEZpbmlzaGVkKGJvb2wgb2spOworCisgICAgdm9pZCBsaW5r
SG92ZXJlZChjb25zdCBRU3RyaW5nICZsaW5rLCBjb25zdCBRU3RyaW5nICZ0aXRsZSwgY29uc3Qg
UVN0cmluZyAmdGV4dENvbnRlbnQpOworICAgIHZvaWQgc3RhdHVzQmFyTWVzc2FnZShjb25zdCBR
U3RyaW5nJiB0ZXh0KTsKKyAgICB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoKTsKKyAgICB2b2lkIGZy
YW1lQ3JlYXRlZChRV2ViRnJhbWUgKmZyYW1lKTsKKyAgICB2b2lkIGdlb21ldHJ5Q2hhbmdlUmVx
dWVzdGVkKGNvbnN0IFFSZWN0JiBnZW9tKTsKKyAgICB2b2lkIHJlcGFpbnRSZXF1ZXN0ZWQoY29u
c3QgUVJlY3QmIGRpcnR5UmVjdCk7CisgICAgdm9pZCBzY3JvbGxSZXF1ZXN0ZWQoaW50IGR4LCBp
bnQgZHksIGNvbnN0IFFSZWN0JiBzY3JvbGxWaWV3UmVjdCk7CisgICAgdm9pZCB3aW5kb3dDbG9z
ZVJlcXVlc3RlZCgpOworICAgIHZvaWQgcHJpbnRSZXF1ZXN0ZWQoUVdlYkZyYW1lICpmcmFtZSk7
CisgICAgdm9pZCBsaW5rQ2xpY2tlZChjb25zdCBRVXJsICZ1cmwpOworCisgICAgdm9pZCB0b29s
QmFyVmlzaWJpbGl0eUNoYW5nZVJlcXVlc3RlZChib29sIHZpc2libGUpOworICAgIHZvaWQgc3Rh
dHVzQmFyVmlzaWJpbGl0eUNoYW5nZVJlcXVlc3RlZChib29sIHZpc2libGUpOworICAgIHZvaWQg
bWVudUJhclZpc2liaWxpdHlDaGFuZ2VSZXF1ZXN0ZWQoYm9vbCB2aXNpYmxlKTsKKworICAgIHZv
aWQgdW5zdXBwb3J0ZWRDb250ZW50KFFOZXR3b3JrUmVwbHkgKnJlcGx5KTsKKyAgICB2b2lkIGRv
d25sb2FkUmVxdWVzdGVkKGNvbnN0IFFOZXR3b3JrUmVxdWVzdCAmcmVxdWVzdCk7CisKKyAgICB2
b2lkIG1pY3JvRm9jdXNDaGFuZ2VkKCk7CisgICAgdm9pZCBjb250ZW50c0NoYW5nZWQoKTsKKyAg
ICB2b2lkIGRhdGFiYXNlUXVvdGFFeGNlZWRlZChRV2ViRnJhbWUqIGZyYW1lLCBRU3RyaW5nIGRh
dGFiYXNlTmFtZSk7CisgICAgdm9pZCBhcHBsaWNhdGlvbkNhY2hlUXVvdGFFeGNlZWRlZChRV2Vi
U2VjdXJpdHlPcmlnaW4qIG9yaWdpbiwgcXVpbnQ2NCBkZWZhdWx0T3JpZ2luUXVvdGEsIHF1aW50
NjQgdG90YWxTcGFjZU5lZWRlZCk7CisKKyAgICB2b2lkIHNhdmVGcmFtZVN0YXRlUmVxdWVzdGVk
KFFXZWJGcmFtZSogZnJhbWUsIFFXZWJIaXN0b3J5SXRlbSogaXRlbSk7CisgICAgdm9pZCByZXN0
b3JlRnJhbWVTdGF0ZVJlcXVlc3RlZChRV2ViRnJhbWUqIGZyYW1lKTsKKworICAgIHZvaWQgdmll
d3BvcnRDaGFuZ2VSZXF1ZXN0ZWQoKTsKKworICAgIHZvaWQgZmVhdHVyZVBlcm1pc3Npb25SZXF1
ZXN0ZWQoUVdlYkZyYW1lKiBmcmFtZSwgUVdlYlBhZ2U6OkZlYXR1cmUgZmVhdHVyZSk7CisgICAg
dm9pZCBmZWF0dXJlUGVybWlzc2lvblJlcXVlc3RDYW5jZWxlZChRV2ViRnJhbWUqIGZyYW1lLCBR
V2ViUGFnZTo6RmVhdHVyZSBmZWF0dXJlKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgUVdl
YlBhZ2UgKmNyZWF0ZVdpbmRvdyhXZWJXaW5kb3dUeXBlIHR5cGUpOworICAgIHZpcnR1YWwgUU9i
amVjdCAqY3JlYXRlUGx1Z2luKGNvbnN0IFFTdHJpbmcgJmNsYXNzaWQsIGNvbnN0IFFVcmwgJnVy
bCwgY29uc3QgUVN0cmluZ0xpc3QgJnBhcmFtTmFtZXMsIGNvbnN0IFFTdHJpbmdMaXN0ICZwYXJh
bVZhbHVlcyk7CisKKyAgICB2aXJ0dWFsIGJvb2wgYWNjZXB0TmF2aWdhdGlvblJlcXVlc3QoUVdl
YkZyYW1lICpmcmFtZSwgY29uc3QgUU5ldHdvcmtSZXF1ZXN0ICZyZXF1ZXN0LCBOYXZpZ2F0aW9u
VHlwZSB0eXBlKTsKKyAgICB2aXJ0dWFsIFFTdHJpbmcgY2hvb3NlRmlsZShRV2ViRnJhbWUgKm9y
aWdpbmF0aW5nRnJhbWUsIGNvbnN0IFFTdHJpbmcmIG9sZEZpbGUpOworICAgIHZpcnR1YWwgdm9p
ZCBqYXZhU2NyaXB0QWxlcnQoUVdlYkZyYW1lICpvcmlnaW5hdGluZ0ZyYW1lLCBjb25zdCBRU3Ry
aW5nJiBtc2cpOworICAgIHZpcnR1YWwgYm9vbCBqYXZhU2NyaXB0Q29uZmlybShRV2ViRnJhbWUg
Km9yaWdpbmF0aW5nRnJhbWUsIGNvbnN0IFFTdHJpbmcmIG1zZyk7CisgICAgdmlydHVhbCBib29s
IGphdmFTY3JpcHRQcm9tcHQoUVdlYkZyYW1lICpvcmlnaW5hdGluZ0ZyYW1lLCBjb25zdCBRU3Ry
aW5nJiBtc2csIGNvbnN0IFFTdHJpbmcmIGRlZmF1bHRWYWx1ZSwgUVN0cmluZyogcmVzdWx0KTsK
KyAgICB2aXJ0dWFsIHZvaWQgamF2YVNjcmlwdENvbnNvbGVNZXNzYWdlKGNvbnN0IFFTdHJpbmcm
IG1lc3NhZ2UsIGludCBsaW5lTnVtYmVyLCBjb25zdCBRU3RyaW5nJiBzb3VyY2VJRCk7CisKKyAg
ICB2aXJ0dWFsIFFTdHJpbmcgdXNlckFnZW50Rm9yVXJsKGNvbnN0IFFVcmwmIHVybCkgY29uc3Q7
CisKK3ByaXZhdGU6CisgICAgUV9QUklWQVRFX1NMT1QoZCwgdm9pZCBfcV9vbkxvYWRQcm9ncmVz
c0NoYW5nZWQoaW50KSkKKyNpZm5kZWYgUVRfTk9fQUNUSU9OCisgICAgUV9QUklWQVRFX1NMT1Qo
ZCwgdm9pZCBfcV93ZWJBY3Rpb25UcmlnZ2VyZWQoYm9vbCBjaGVja2VkKSkKKyNlbmRpZgorICAg
IFFfUFJJVkFURV9TTE9UKGQsIHZvaWQgX3FfY2xlYW51cExlYWtNZXNzYWdlcygpKQorCisgICAg
UVdlYlBhZ2VQcml2YXRlICpkOworCisgICAgZnJpZW5kIGNsYXNzIFFXZWJGcmFtZTsKKyAgICBm
cmllbmQgY2xhc3MgUVdlYlBhZ2VQcml2YXRlOworICAgIGZyaWVuZCBjbGFzcyBRV2ViVmlldzsK
KyAgICBmcmllbmQgY2xhc3MgUVdlYlZpZXdQcml2YXRlOworICAgIGZyaWVuZCBjbGFzcyBRR3Jh
cGhpY3NXZWJWaWV3OworICAgIGZyaWVuZCBjbGFzcyBRR3JhcGhpY3NXZWJWaWV3UHJpdmF0ZTsK
KyAgICBmcmllbmQgY2xhc3MgUVdlYkluc3BlY3RvcjsKKyAgICBmcmllbmQgY2xhc3MgV2ViQ29y
ZTo6Q2hyb21lQ2xpZW50UXQ7CisgICAgZnJpZW5kIGNsYXNzIFdlYkNvcmU6OkVkaXRvckNsaWVu
dFF0OworICAgIGZyaWVuZCBjbGFzcyBXZWJDb3JlOjpGcmFtZUxvYWRlckNsaWVudFF0OworICAg
IGZyaWVuZCBjbGFzcyBXZWJDb3JlOjpJbnNwZWN0b3JDbGllbnRRdDsKKyAgICBmcmllbmQgY2xh
c3MgV2ViQ29yZTo6SW5zcGVjdG9yU2VydmVyUmVxdWVzdEhhbmRsZXJRdDsKKyAgICBmcmllbmQg
Y2xhc3MgV2ViQ29yZTo6SW5zcGVjdG9yRnJvbnRlbmRDbGllbnRRdDsKKyAgICBmcmllbmQgY2xh
c3MgV2ViQ29yZTo6UmVzb3VyY2VIYW5kbGU7CisgICAgZnJpZW5kIGNsYXNzIFdlYkNvcmU6OlFO
ZXR3b3JrUmVwbHlIYW5kbGVyOworICAgIGZyaWVuZCBjbGFzcyBEdW1wUmVuZGVyVHJlZVN1cHBv
cnRRdDsKK307CisKK1FfREVDTEFSRV9PUEVSQVRPUlNfRk9SX0ZMQUdTKFFXZWJQYWdlOjpGaW5k
RmxhZ3MpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9XaWRnZXRBcGkv
cXdlYnBhZ2VfcC5oIGIvU291cmNlL1dlYktpdC9xdC9XaWRnZXRBcGkvcXdlYnBhZ2VfcC5oCm5l
dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAuLmIzNWNmMmUxOTU1NTIzY2YxNjFlOGMzOTRkZDVhZjJjYTYwNGZiYWIKLS0tIC9k
ZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldEFwaS9xd2VicGFnZV9wLmgKQEAg
LTAsMCArMSwyMDQgQEAKKy8qCisgICAgQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5IE5va2lhIENv
cnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQorICAgIENvcHlyaWdodCAoQykg
MjAwOCBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlcgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZy
ZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBp
dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAg
TGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0
aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFu
eSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRo
ZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJB
TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFC
SUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQor
ICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisg
ICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2Vu
ZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhl
IGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgICAgdGhlIEZyZWUgU29mdHdh
cmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAg
ICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyovCisKKyNpZm5kZWYgcXdlYnBhZ2VfcF9o
CisjZGVmaW5lIHF3ZWJwYWdlX3BfaAorCisjaW5jbHVkZSAiUVdlYlBhZ2VBZGFwdGVyLmgiCisK
KyNpbmNsdWRlICJxd2ViZnJhbWUuaCIKKyNpbmNsdWRlICJxd2VicGFnZS5oIgorCisjaW5jbHVk
ZSA8UVBvaW50ZXI+CisjaW5jbHVkZSA8cWV2ZW50Lmg+CisjaW5jbHVkZSA8cWdlc3R1cmUuaD4K
KyNpbmNsdWRlIDxxZ3JhcGhpY3NzY2VuZWV2ZW50Lmg+CisjaW5jbHVkZSA8cWdyYXBoaWNzd2lk
Z2V0Lmg+CisjaW5jbHVkZSA8cW5ldHdvcmtwcm94eS5oPgorCisKK25hbWVzcGFjZSBXZWJDb3Jl
IHsKK2NsYXNzIENvbnRleHRNZW51Q2xpZW50UXQ7CitjbGFzcyBDb250ZXh0TWVudUl0ZW07Citj
bGFzcyBDb250ZXh0TWVudTsKK2NsYXNzIERvY3VtZW50OworY2xhc3MgRWRpdG9yQ2xpZW50UXQ7
CitjbGFzcyBFbGVtZW50OworY2xhc3MgSW50UmVjdDsKK2NsYXNzIE5vZGU7CitjbGFzcyBOb2Rl
TGlzdDsKK2NsYXNzIEZyYW1lOworfQorCitRVF9CRUdJTl9OQU1FU1BBQ0UKK2NsYXNzIFFVbmRv
U3RhY2s7CitjbGFzcyBRTWVudTsKK2NsYXNzIFFCaXRBcnJheTsKK1FUX0VORF9OQU1FU1BBQ0UK
KworY2xhc3MgUXRQbHVnaW5XaWRnZXRBZGFwdGVyOworY2xhc3MgUVdlYkluc3BlY3RvcjsKK2Ns
YXNzIFFXZWJGcmFtZUFkYXB0ZXI7CitjbGFzcyBVbmRvU3RlcFF0OworCitjbGFzcyBRdFZpZXdw
b3J0QXR0cmlidXRlc1ByaXZhdGUgOiBwdWJsaWMgUVNoYXJlZERhdGEgeworcHVibGljOgorICAg
IFF0Vmlld3BvcnRBdHRyaWJ1dGVzUHJpdmF0ZShRV2ViUGFnZTo6Vmlld3BvcnRBdHRyaWJ1dGVz
KiBxcSkKKyAgICAgICAgOiBxKHFxKQorICAgIHsgfQorCisgICAgUVdlYlBhZ2U6OlZpZXdwb3J0
QXR0cmlidXRlcyogcTsKK307CisKK2NsYXNzIFFXZWJQYWdlUHJpdmF0ZSA6IHB1YmxpYyBRV2Vi
UGFnZUFkYXB0ZXIgeworcHVibGljOgorICAgIFFXZWJQYWdlUHJpdmF0ZShRV2ViUGFnZSopOwor
ICAgIH5RV2ViUGFnZVByaXZhdGUoKTsKKworICAgIHN0YXRpYyBXZWJDb3JlOjpQYWdlKiBjb3Jl
KGNvbnN0IFFXZWJQYWdlKik7CisKKyAgICAvLyBBZGFwdGVyIGltcGxlbWVudGF0aW9uCisgICAg
dmlydHVhbCB2b2lkIHNob3coKSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0Rm9jdXMo
KSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIHZvaWQgdW5mb2N1cygpIE9WRVJSSURFOworICAgIHZp
cnR1YWwgdm9pZCBzZXRXaW5kb3dSZWN0KGNvbnN0IFFSZWN0ICYpIE9WRVJSSURFOworICAgIHZp
cnR1YWwgUVNpemUgdmlld3BvcnRTaXplKCkgY29uc3QgT1ZFUlJJREU7CisgICAgdmlydHVhbCBR
V2ViUGFnZUFkYXB0ZXIqIGNyZWF0ZVdpbmRvdyhib29sIC8qZGlhbG9nKi8pIE9WRVJSSURFOwor
ICAgIHZpcnR1YWwgUU9iamVjdCogaGFuZGxlKCkgT1ZFUlJJREUgeyByZXR1cm4gcTsgfQorICAg
IHZpcnR1YWwgdm9pZCBqYXZhU2NyaXB0Q29uc29sZU1lc3NhZ2UoY29uc3QgUVN0cmluZyYgbWVz
c2FnZSwgaW50IGxpbmVOdW1iZXIsIGNvbnN0IFFTdHJpbmcmIHNvdXJjZUlEKSBPVkVSUklERTsK
KyAgICB2aXJ0dWFsIHZvaWQgamF2YVNjcmlwdEFsZXJ0KFFXZWJGcmFtZUFkYXB0ZXIqLCBjb25z
dCBRU3RyaW5nJiBtc2cpIE9WRVJSSURFOworICAgIHZpcnR1YWwgYm9vbCBqYXZhU2NyaXB0Q29u
ZmlybShRV2ViRnJhbWVBZGFwdGVyKiwgY29uc3QgUVN0cmluZyYgbXNnKSBPVkVSUklERTsKKyAg
ICB2aXJ0dWFsIGJvb2wgamF2YVNjcmlwdFByb21wdChRV2ViRnJhbWVBZGFwdGVyKiwgY29uc3Qg
UVN0cmluZyYgbXNnLCBjb25zdCBRU3RyaW5nJiBkZWZhdWx0VmFsdWUsIFFTdHJpbmcqIHJlc3Vs
dCkgT1ZFUlJJREU7CisgICAgdmlydHVhbCBib29sIHNob3VsZEludGVycnVwdEphdmFTY3JpcHQo
KSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIHZvaWQgcHJpbnRSZXF1ZXN0ZWQoUVdlYkZyYW1lQWRh
cHRlciopIE9WRVJSSURFOworICAgIHZpcnR1YWwgdm9pZCBkYXRhYmFzZVF1b3RhRXhjZWVkZWQo
UVdlYkZyYW1lQWRhcHRlciosIGNvbnN0IFFTdHJpbmcmIGRhdGFiYXNlTmFtZSkgT1ZFUlJJREU7
CisgICAgdmlydHVhbCB2b2lkIGFwcGxpY2F0aW9uQ2FjaGVRdW90YUV4Y2VlZGVkKFFXZWJTZWN1
cml0eU9yaWdpbiosIHF1aW50NjQgZGVmYXVsdE9yaWdpblF1b3RhLCBxdWludDY0IHRvdGFsU3Bh
Y2VOZWVkZWQpIE9WRVJSSURFOworICAgIHZpcnR1YWwgdm9pZCBzZXRUb29sVGlwKGNvbnN0IFFT
dHJpbmcmKSBPVkVSUklERTsKKyNpZiBVU0UoUVRfTVVMVElNRURJQSkKKyAgICB2aXJ0dWFsIFFX
ZWJGdWxsU2NyZWVuVmlkZW9IYW5kbGVyKiBjcmVhdGVGdWxsU2NyZWVuVmlkZW9IYW5kbGVyKCkg
T1ZFUlJJREU7CisjZW5kaWYKKyAgICB2aXJ0dWFsIFFXZWJGcmFtZUFkYXB0ZXIqIG1haW5GcmFt
ZUFkYXB0ZXIoKSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIFFTdHJpbmdMaXN0IGNob29zZUZpbGVz
KFFXZWJGcmFtZUFkYXB0ZXIqLCBib29sIGFsbG93TXVsdGlwbGUsIGNvbnN0IFFTdHJpbmdMaXN0
JiBzdWdnZXN0ZWRGaWxlTmFtZXMpIE9WRVJSSURFOworICAgIHZpcnR1YWwgUUNvbG9yIGNvbG9y
U2VsZWN0aW9uUmVxdWVzdGVkKGNvbnN0IFFDb2xvciYgc2VsZWN0ZWRDb2xvcikgT1ZFUlJJREU7
CisgICAgdmlydHVhbCBRV2ViU2VsZWN0TWV0aG9kKiBjcmVhdGVTZWxlY3RQb3B1cCgpIE9WRVJS
SURFOworICAgIHZpcnR1YWwgUVJlY3Qgdmlld1JlY3RSZWxhdGl2ZVRvV2luZG93KCkgT1ZFUlJJ
REU7CisgICAgdmlydHVhbCB2b2lkIGdlb2xvY2F0aW9uUGVybWlzc2lvblJlcXVlc3RlZChRV2Vi
RnJhbWVBZGFwdGVyKikgT1ZFUlJJREU7CisgICAgdmlydHVhbCB2b2lkIGdlb2xvY2F0aW9uUGVy
bWlzc2lvblJlcXVlc3RDYW5jZWxsZWQoUVdlYkZyYW1lQWRhcHRlciopIE9WRVJSSURFOworICAg
IHZpcnR1YWwgdm9pZCBub3RpZmljYXRpb25zUGVybWlzc2lvblJlcXVlc3RlZChRV2ViRnJhbWVB
ZGFwdGVyKikgT1ZFUlJJREU7CisgICAgdmlydHVhbCB2b2lkIG5vdGlmaWNhdGlvbnNQZXJtaXNz
aW9uUmVxdWVzdENhbmNlbGxlZChRV2ViRnJhbWVBZGFwdGVyKikgT1ZFUlJJREU7CisKKyAgICB2
aXJ0dWFsIHZvaWQgcmVzcG9uZFRvQ2hhbmdlZENvbnRlbnRzKCkgT1ZFUlJJREU7CisgICAgdmly
dHVhbCB2b2lkIHJlc3BvbmRUb0NoYW5nZWRTZWxlY3Rpb24oKSBPVkVSUklERTsKKyAgICB2aXJ0
dWFsIHZvaWQgbWljcm9Gb2N1c0NoYW5nZWQoKSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIHZvaWQg
dHJpZ2dlckNvcHlBY3Rpb24oKSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIHZvaWQgdHJpZ2dlckFj
dGlvbkZvcktleUV2ZW50KFFLZXlFdmVudCopIE9WRVJSSURFOworICAgIHZpcnR1YWwgdm9pZCBj
bGVhclVuZG9TdGFjaygpIE9WRVJSSURFOworICAgIHZpcnR1YWwgYm9vbCBjYW5VbmRvKCkgY29u
c3QgT1ZFUlJJREU7CisgICAgdmlydHVhbCBib29sIGNhblJlZG8oKSBjb25zdCBPVkVSUklERTsK
KyAgICB2aXJ0dWFsIHZvaWQgdW5kbygpIE9WRVJSSURFOworICAgIHZpcnR1YWwgdm9pZCByZWRv
KCkgT1ZFUlJJREU7CisgICAgdmlydHVhbCB2b2lkIGNyZWF0ZVVuZG9TdGVwKFFTaGFyZWRQb2lu
dGVyPFVuZG9TdGVwUXQ+KSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIGVkaXRv
ckNvbW1hbmRGb3JLZXlFdmVudChRS2V5RXZlbnQqKSBPVkVSUklERTsKKworICAgIHZvaWQgdXBk
YXRlTmF2aWdhdGlvbkFjdGlvbnMoKSBPVkVSUklERTsKKworICAgIHZpcnR1YWwgUU9iamVjdCog
aW5zcGVjdG9ySGFuZGxlKCkgT1ZFUlJJREU7CisgICAgdmlydHVhbCB2b2lkIHNldEluc3BlY3Rv
ckZyb250ZW5kKFFPYmplY3QqKSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0SW5zcGVj
dG9yV2luZG93VGl0bGUoY29uc3QgUVN0cmluZyYpIE9WRVJSSURFOworICAgIHZpcnR1YWwgdm9p
ZCBjcmVhdGVXZWJJbnNwZWN0b3IoUU9iamVjdCoqIGluc3BlY3RvclZpZXcsIFFXZWJQYWdlQWRh
cHRlcioqIGluc3BlY3RvclBhZ2UpIE9WRVJSSURFOworICAgIHZpcnR1YWwgUVN0cmluZ0xpc3Qg
bWVudUFjdGlvbnNBc1RleHQoKSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIHZvaWQgZW1pdFZpZXdw
b3J0Q2hhbmdlUmVxdWVzdGVkKCkgT1ZFUlJJREU7CisgICAgdmlydHVhbCBib29sIGFjY2VwdE5h
dmlnYXRpb25SZXF1ZXN0KFFXZWJGcmFtZUFkYXB0ZXIqLCBjb25zdCBRTmV0d29ya1JlcXVlc3Qm
LCBpbnQgdHlwZSkgT1ZFUlJJREU7CisgICAgdmlydHVhbCB2b2lkIGVtaXRSZXN0b3JlRnJhbWVT
dGF0ZVJlcXVlc3RlZChRV2ViRnJhbWVBZGFwdGVyKikgT1ZFUlJJREU7CisgICAgdmlydHVhbCB2
b2lkIGVtaXRTYXZlRnJhbWVTdGF0ZVJlcXVlc3RlZChRV2ViRnJhbWVBZGFwdGVyKiwgUVdlYkhp
c3RvcnlJdGVtKikgT1ZFUlJJREU7CisgICAgdmlydHVhbCB2b2lkIGVtaXREb3dubG9hZFJlcXVl
c3RlZChjb25zdCBRTmV0d29ya1JlcXVlc3QmKSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIHZvaWQg
ZW1pdEZyYW1lQ3JlYXRlZChRV2ViRnJhbWVBZGFwdGVyKikgT1ZFUlJJREU7CisgICAgdmlydHVh
bCBRU3RyaW5nIHVzZXJBZ2VudEZvclVybChjb25zdCBRVXJsICZ1cmwpIGNvbnN0IE9WRVJSSURF
IHsgcmV0dXJuIHEtPnVzZXJBZ2VudEZvclVybCh1cmwpOyB9CisgICAgdmlydHVhbCBib29sIHN1
cHBvcnRzRXJyb3JQYWdlRXh0ZW5zaW9uKCkgY29uc3QgT1ZFUlJJREUgeyByZXR1cm4gcS0+c3Vw
cG9ydHNFeHRlbnNpb24oUVdlYlBhZ2U6OkVycm9yUGFnZUV4dGVuc2lvbik7IH0KKyAgICB2aXJ0
dWFsIGJvb2wgZXJyb3JQYWdlRXh0ZW5zaW9uKEVycm9yUGFnZU9wdGlvbiAqLCBFcnJvclBhZ2VS
ZXR1cm4gKikgT1ZFUlJJREU7CisgICAgdmlydHVhbCBRdFBsdWdpbldpZGdldEFkYXB0ZXIqIGNy
ZWF0ZVBsdWdpbihjb25zdCBRU3RyaW5nICYsIGNvbnN0IFFVcmwgJiwgY29uc3QgUVN0cmluZ0xp
c3QgJiwgY29uc3QgUVN0cmluZ0xpc3QgJikgT1ZFUlJJREU7CisgICAgdmlydHVhbCBRdFBsdWdp
bldpZGdldEFkYXB0ZXIqIGFkYXB0ZXJGb3JXaWRnZXQoUU9iamVjdCAqKSBjb25zdCBPVkVSUklE
RTsKKyAgICB2aXJ0dWFsIGJvb2wgcmVxdWVzdFNvZnR3YXJlSW5wdXRQYW5lbCgpIGNvbnN0IE9W
RVJSSURFOworICAgIHZpcnR1YWwgdm9pZCBjcmVhdGVBbmRTZXRDdXJyZW50Q29udGV4dE1lbnUo
Y29uc3QgUUxpc3Q8TWVudUl0ZW1EZXNjcmlwdGlvbj4mLCBRQml0QXJyYXkqKSBPVkVSUklERTsK
KyAgICB2aXJ0dWFsIGJvb2wgaGFuZGxlU2Nyb2xsYmFyQ29udGV4dE1lbnVFdmVudChRQ29udGV4
dE1lbnVFdmVudCosIGJvb2wsIFNjcm9sbERpcmVjdGlvbiosIFNjcm9sbEdyYW51bGFyaXR5Kikg
T1ZFUlJJREU7CisKKworICAgIHZvaWQgY3JlYXRlTWFpbkZyYW1lKCk7CisKKyAgICB2b2lkIF9x
X3dlYkFjdGlvblRyaWdnZXJlZChib29sIGNoZWNrZWQpOworICAgIHZvaWQgdXBkYXRlQWN0aW9u
KFFXZWJQYWdlOjpXZWJBY3Rpb24pOworICAgIHZvaWQgdXBkYXRlRWRpdG9yQWN0aW9ucygpOwor
CisgICAgdm9pZCB0aW1lckV2ZW50KFFUaW1lckV2ZW50Kik7CisKKyNpZm5kZWYgUVRfTk9fQ09O
VEVYVE1FTlUKKyAgICB2b2lkIGNvbnRleHRNZW51RXZlbnQoY29uc3QgUVBvaW50JiBnbG9iYWxQ
b3MpOworI2VuZGlmCisgICAgdm9pZCBrZXlQcmVzc0V2ZW50KFFLZXlFdmVudCopOworICAgIHZv
aWQga2V5UmVsZWFzZUV2ZW50KFFLZXlFdmVudCopOworCisgICAgdGVtcGxhdGU8Y2xhc3MgVD4g
dm9pZCBkcmFnRW50ZXJFdmVudChUKik7CisgICAgdGVtcGxhdGU8Y2xhc3MgVD4gdm9pZCBkcmFn
TW92ZUV2ZW50KFQqKTsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBUPiB2b2lkIGRyb3BFdmVudChUKik7
CisKKyAgICB2b2lkIHNob3J0Y3V0T3ZlcnJpZGVFdmVudChRS2V5RXZlbnQqKTsKKyAgICB2b2lk
IGxlYXZlRXZlbnQoUUV2ZW50Kik7CisKKyAgICBib29sIGdlc3R1cmVFdmVudChRR2VzdHVyZUV2
ZW50Kik7CisKKworICAgIHZvaWQgc2V0SW5zcGVjdG9yKFFXZWJJbnNwZWN0b3IqKTsKKyAgICBR
V2ViSW5zcGVjdG9yKiBnZXRPckNyZWF0ZUluc3BlY3RvcigpOworCisjaWZuZGVmIFFUX05PX1NI
T1JUQ1VUCisgICAgc3RhdGljIFFXZWJQYWdlOjpXZWJBY3Rpb24gZWRpdG9yQWN0aW9uRm9yS2V5
RXZlbnQoUUtleUV2ZW50Kik7CisjZW5kaWYKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZWRpdG9y
Q29tbWFuZEZvcldlYkFjdGlvbnMoUVdlYlBhZ2U6OldlYkFjdGlvbik7CisKKyAgICBRV2ViUGFn
ZSAqcTsKKyAgICBRUG9pbnRlcjxRV2ViRnJhbWU+IG1haW5GcmFtZTsKKworI2lmbmRlZiBRVF9O
T19VTkRPU1RBQ0sKKyAgICBRVW5kb1N0YWNrICp1bmRvU3RhY2s7CisjZW5kaWYKKworICAgIFFQ
b2ludGVyPFFXaWRnZXQ+IHZpZXc7CisKKyAgICBRV2ViUGFnZTo6TGlua0RlbGVnYXRpb25Qb2xp
Y3kgbGlua1BvbGljeTsKKworICAgIFFTaXplIG1fdmlld3BvcnRTaXplOworICAgIFFTaXplIGZp
eGVkTGF5b3V0U2l6ZTsKKworICAgIFFXZWJIaXRUZXN0UmVzdWx0IGhpdFRlc3RSZXN1bHQ7Cisj
aWZuZGVmIFFUX05PX0NPTlRFWFRNRU5VCisgICAgUVBvaW50ZXI8UU1lbnU+IGN1cnJlbnRDb250
ZXh0TWVudTsKKyNlbmRpZgorICAgIFFQYWxldHRlIHBhbGV0dGU7CisgICAgYm9vbCB1c2VGaXhl
ZExheW91dDsKKworICAgIFFBY3Rpb24gKmFjdGlvbnNbUVdlYlBhZ2U6OldlYkFjdGlvbkNvdW50
XTsKKworICAgIFFXaWRnZXQqIGluc3BlY3RvckZyb250ZW5kOworICAgIFFXZWJJbnNwZWN0b3Iq
IGluc3BlY3RvcjsKKyAgICBib29sIGluc3BlY3RvcklzSW50ZXJuYWxPbmx5OyAvLyBUcnVlIGlm
IGNyZWF0ZWQgdGhyb3VnaCB0aGUgSW5zcGVjdCBjb250ZXh0IG1lbnUgYWN0aW9uCisgICAgUXQ6
OkRyb3BBY3Rpb24gbV9sYXN0RHJvcEFjdGlvbjsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYktpdC9xdC9XaWRnZXRBcGkvcXdlYnZpZXcuY3BwIGIvU291cmNlL1dlYktpdC9x
dC9XaWRnZXRBcGkvcXdlYnZpZXcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmZjZmM5MzRiZTljNGQwZGFmNzVh
MjQ1YzVmYmIyMjM4MTBiZmNlZTYKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L3F0
L1dpZGdldEFwaS9xd2Vidmlldy5jcHAKQEAgLTAsMCArMSwxMTI0IEBACisvKgorICAgIENvcHly
aWdodCAoQykgMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWll
cykKKyAgICBDb3B5cmlnaHQgKEMpIDIwMDggSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIKKyAg
ICBDb3B5cmlnaHQgKEMpIDIwMDkgR2lyaXNoIFJhbWFrcmlzaG5hbiA8Z2lyaXNoQGZvcndhcmRi
aWFzLmluPgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVk
aXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhl
IEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkg
dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRo
ZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAg
VGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1
c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGlt
cGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJs
aWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2Vp
dmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAg
IGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBu
b3QsIHdyaXRlIHRvCisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEg
RnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAgICBCb3N0b24sIE1BIDAyMTEwLTEzMDEs
IFVTQS4KKyovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJxd2Vidmlldy5oIgor
CisjaW5jbHVkZSAiUVdlYlBhZ2VDbGllbnQuaCIKKyNpbmNsdWRlICJxd2ViZnJhbWUuaCIKKyNp
bmNsdWRlICJxd2VicGFnZV9wLmgiCisjaWZuZGVmIFFUX05PX0FDQ0VTU0lCSUxJVFkKKyNpbmNs
dWRlICJxd2Vidmlld2FjY2Vzc2libGVfcC5oIgorI2VuZGlmCisjaW5jbHVkZSA8cWJpdG1hcC5o
PgorI2luY2x1ZGUgPHFkaXIuaD4KKyNpbmNsdWRlIDxxZXZlbnQuaD4KKyNpbmNsdWRlIDxxZmls
ZS5oPgorI2luY2x1ZGUgPHFwYWludGVyLmg+CisjaWYgSEFWRShRVFBSSU5UU1VQUE9SVCkKKyNp
bmNsdWRlIDxxcHJpbnRlci5oPgorI2VuZGlmCisKK2NsYXNzIFFXZWJWaWV3UHJpdmF0ZSB7Citw
dWJsaWM6CisgICAgUVdlYlZpZXdQcml2YXRlKFFXZWJWaWV3ICp2aWV3KQorICAgICAgICA6IHZp
ZXcodmlldykKKyAgICAgICAgLCBwYWdlKDApCisgICAgICAgICwgcmVuZGVySGludHMoUVBhaW50
ZXI6OlRleHRBbnRpYWxpYXNpbmcgfCBRUGFpbnRlcjo6U21vb3RoUGl4bWFwVHJhbnNmb3JtKQor
ICAgIHsKKyAgICAgICAgUV9BU1NFUlQodmlldyk7CisgICAgfQorCisgICAgdmlydHVhbCB+UVdl
YlZpZXdQcml2YXRlKCk7CisKKyAgICB2b2lkIF9xX3BhZ2VEZXN0cm95ZWQoKTsKKyAgICB2b2lk
IGRldGFjaEN1cnJlbnRQYWdlKCk7CisKKyAgICBRV2ViVmlldyAqdmlldzsKKyAgICBRV2ViUGFn
ZSAqcGFnZTsKKworICAgIFFQYWludGVyOjpSZW5kZXJIaW50cyByZW5kZXJIaW50czsKK307CisK
K1FXZWJWaWV3UHJpdmF0ZTo6flFXZWJWaWV3UHJpdmF0ZSgpCit7CisgICAgZGV0YWNoQ3VycmVu
dFBhZ2UoKTsKK30KKwordm9pZCBRV2ViVmlld1ByaXZhdGU6Ol9xX3BhZ2VEZXN0cm95ZWQoKQor
eworICAgIHBhZ2UgPSAwOworICAgIHZpZXctPnNldFBhZ2UoMCk7Cit9CisKKy8qIQorICAgIFxj
bGFzcyBRV2ViVmlldworICAgIFxzaW5jZSA0LjQKKyAgICBcYnJpZWYgVGhlIFFXZWJWaWV3IGNs
YXNzIHByb3ZpZGVzIGEgd2lkZ2V0IHRoYXQgaXMgdXNlZCB0byB2aWV3IGFuZCBlZGl0CisgICAg
d2ViIGRvY3VtZW50cy4KKyAgICBcaW5ncm91cCBhZHZhbmNlZAorCisgICAgXGlubW9kdWxlIFF0
V2ViS2l0CisKKyAgICBRV2ViVmlldyBpcyB0aGUgbWFpbiB3aWRnZXQgY29tcG9uZW50IG9mIHRo
ZSBRdFdlYktpdCB3ZWIgYnJvd3NpbmcgbW9kdWxlLgorICAgIEl0IGNhbiBiZSB1c2VkIGluIHZh
cmlvdXMgYXBwbGljYXRpb25zIHRvIGRpc3BsYXkgd2ViIGNvbnRlbnQgbGl2ZSBmcm9tIHRoZQor
ICAgIEludGVybmV0LgorCisgICAgVGhlIGltYWdlIGJlbG93IHNob3dzIFFXZWJWaWV3IHByZXZp
ZXdlZCBpbiBcUUQgd2l0aCBhIE5va2lhIHdlYnNpdGUuCisKKyAgICBcaW1hZ2UgcXdlYnZpZXct
dXJsLnBuZworCisgICAgQSB3ZWIgc2l0ZSBjYW4gYmUgbG9hZGVkIG9udG8gUVdlYlZpZXcgd2l0
aCB0aGUgbG9hZCgpIGZ1bmN0aW9uLiBMaWtlIGFsbAorICAgIFF0IHdpZGdldHMsIHRoZSBzaG93
KCkgZnVuY3Rpb24gbXVzdCBiZSBpbnZva2VkIGluIG9yZGVyIHRvIGRpc3BsYXkKKyAgICBRV2Vi
Vmlldy4gVGhlIHNuaXBwZXQgYmVsb3cgaWxsdXN0cmF0ZXMgdGhpczoKKworICAgIFxzbmlwcGV0
IHdlYmtpdHNuaXBwZXRzL3NpbXBsZS9tYWluLmNwcCBVc2luZyBRV2ViVmlldworCisgICAgQWx0
ZXJuYXRpdmVseSwgc2V0VXJsKCkgY2FuIGFsc28gYmUgdXNlZCB0byBsb2FkIGEgd2ViIHNpdGUu
IElmIHlvdSBoYXZlCisgICAgdGhlIEhUTUwgY29udGVudCByZWFkaWx5IGF2YWlsYWJsZSwgeW91
IGNhbiB1c2Ugc2V0SHRtbCgpIGluc3RlYWQuCisKKyAgICBUaGUgbG9hZFN0YXJ0ZWQoKSBzaWdu
YWwgaXMgZW1pdHRlZCB3aGVuIHRoZSB2aWV3IGJlZ2lucyBsb2FkaW5nLiBUaGUKKyAgICBsb2Fk
UHJvZ3Jlc3MoKSBzaWduYWwsIG9uIHRoZSBvdGhlciBoYW5kLCBpcyBlbWl0dGVkIHdoZW5ldmVy
IGFuIGVsZW1lbnQgb2YKKyAgICB0aGUgd2ViIHZpZXcgY29tcGxldGVzIGxvYWRpbmcsIHN1Y2gg
YXMgYW4gZW1iZWRkZWQgaW1hZ2UsIGEgc2NyaXB0LCBldGMuCisgICAgRmluYWxseSwgdGhlIGxv
YWRGaW5pc2hlZCgpIHNpZ25hbCBpcyBlbWl0dGVkIHdoZW4gdGhlIHZpZXcgaGFzIGxvYWRlZAor
ICAgIGNvbXBsZXRlbHkuIEl0J3MgYXJndW1lbnQgLSBlaXRoZXIgXGMgdHJ1ZSBvciBcYyBmYWxz
ZSAtIGluZGljYXRlcworICAgIGxvYWQgc3VjY2VzcyBvciBmYWlsdXJlLgorCisgICAgVGhlIHBh
Z2UoKSBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgd2ViIHBhZ2Ugb2JqZWN0LiBT
ZWUKKyAgICBcbHtFbGVtZW50cyBvZiBRV2ViVmlld30gZm9yIGFuIGV4cGxhbmF0aW9uIG9mIGhv
dyB0aGUgd2ViIHBhZ2UKKyAgICBpcyByZWxhdGVkIHRvIHRoZSB2aWV3LiBUbyBtb2RpZnkgeW91
ciB3ZWIgdmlldydzIHNldHRpbmdzLCB5b3UgY2FuIGFjY2VzcworICAgIHRoZSBRV2ViU2V0dGlu
Z3Mgb2JqZWN0IHdpdGggdGhlIHNldHRpbmdzKCkgZnVuY3Rpb24uIFdpdGggUVdlYlNldHRpbmdz
LAorICAgIHlvdSBjYW4gY2hhbmdlIHRoZSBkZWZhdWx0IGZvbnRzLCBlbmFibGUgb3IgZGlzYWJs
ZSBmZWF0dXJlcyBzdWNoIGFzCisgICAgSmF2YVNjcmlwdCBhbmQgcGx1Z2lucy4KKworICAgIFRo
ZSB0aXRsZSBvZiBhbiBIVE1MIGRvY3VtZW50IGNhbiBiZSBhY2Nlc3NlZCB3aXRoIHRoZSB0aXRs
ZSgpIHByb3BlcnR5LgorICAgIEFkZGl0aW9uYWxseSwgYSB3ZWIgc2l0ZSBtYXkgYWxzbyBzcGVj
aWZ5IGFuIGljb24sIHdoaWNoIGNhbiBiZSBhY2Nlc3NlZAorICAgIHVzaW5nIHRoZSBpY29uKCkg
cHJvcGVydHkuIElmIHRoZSB0aXRsZSBvciB0aGUgaWNvbiBjaGFuZ2VzLCB0aGUgY29ycmVzcG9u
ZGluZworICAgIHRpdGxlQ2hhbmdlZCgpIGFuZCBpY29uQ2hhbmdlZCgpIHNpZ25hbHMgd2lsbCBi
ZSBlbWl0dGVkLiBUaGUKKyAgICB0ZXh0U2l6ZU11bHRpcGxpZXIoKSBwcm9wZXJ0eSBjYW4gYmUg
dXNlZCB0byBjaGFuZ2UgdGhlIG92ZXJhbGwgc2l6ZSBvZgorICAgIHRoZSB0ZXh0IGRpc3BsYXll
ZCBpbiB0aGUgd2ViIHZpZXcuCisKKyAgICBJZiB5b3UgcmVxdWlyZSBhIGN1c3RvbSBjb250ZXh0
IG1lbnUsIHlvdSBjYW4gaW1wbGVtZW50IGl0IGJ5IHJlaW1wbGVtZW50aW5nCisgICAgXGx7UVdp
ZGdldDo6fXtjb250ZXh0TWVudUV2ZW50KCl9IGFuZCBwb3B1bGF0aW5nIHlvdXIgUU1lbnUgd2l0
aCB0aGUgYWN0aW9ucworICAgIG9idGFpbmVkIGZyb20gcGFnZUFjdGlvbigpLiBNb3JlIGZ1bmN0
aW9uYWxpdHkgc3VjaCBhcyByZWxvYWRpbmcgdGhlIHZpZXcsCisgICAgY29weWluZyBzZWxlY3Rl
ZCB0ZXh0IHRvIHRoZSBjbGlwYm9hcmQsIG9yIHBhc3RpbmcgaW50byB0aGUgdmlldywgaXMgYWxz
bworICAgIGVuY2Fwc3VsYXRlZCB3aXRoaW4gdGhlIFFBY3Rpb24gb2JqZWN0cyByZXR1cm5lZCBi
eSBwYWdlQWN0aW9uKCkuIFRoZXNlCisgICAgYWN0aW9ucyBjYW4gYmUgcHJvZ3JhbW1hdGljYWxs
eSB0cmlnZ2VyZWQgdXNpbmcgdHJpZ2dlclBhZ2VBY3Rpb24oKS4KKyAgICBBbHRlcm5hdGl2ZWx5
LCB0aGUgYWN0aW9ucyBjYW4gYmUgYWRkZWQgdG8gYSB0b29sYmFyIG9yIGEgbWVudSBkaXJlY3Rs
eS4KKyAgICBRV2ViVmlldyBtYWludGFpbnMgdGhlIHN0YXRlIG9mIHRoZSByZXR1cm5lZCBhY3Rp
b25zIGJ1dCBhbGxvd3MKKyAgICBtb2RpZmljYXRpb24gb2YgYWN0aW9uIHByb3BlcnRpZXMgc3Vj
aCBhcyBcbHtRQWN0aW9uOjp9e3RleHR9IG9yCisgICAgXGx7UUFjdGlvbjo6fXtpY29ufS4KKwor
ICAgIEEgUVdlYlZpZXcgY2FuIGJlIHByaW50ZWQgb250byBhIFFQcmludGVyIHVzaW5nIHRoZSBw
cmludCgpIGZ1bmN0aW9uLgorICAgIFRoaXMgZnVuY3Rpb24gaXMgbWFya2VkIGFzIGEgc2xvdCBh
bmQgY2FuIGJlIGNvbnZlbmllbnRseSBjb25uZWN0ZWQgdG8KKyAgICBcbHtRUHJpbnRQcmV2aWV3
RGlhbG9nfSdzIFxse1FQcmludFByZXZpZXdEaWFsb2c6On17cGFpbnRSZXF1ZXN0ZWQoKX0KKyAg
ICBzaWduYWwuCisKKyAgICBJZiB5b3Ugd2FudCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIHdlYiBz
aXRlcyB0aGF0IGFsbG93IHRoZSB1c2VyIHRvIG9wZW4KKyAgICBuZXcgd2luZG93cywgc3VjaCBh
cyBwb3AtdXAgd2luZG93cywgeW91IGNhbiBzdWJjbGFzcyBRV2ViVmlldyBhbmQKKyAgICByZWlt
cGxlbWVudCB0aGUgY3JlYXRlV2luZG93KCkgZnVuY3Rpb24uCisKKyAgICBcc2VjdGlvbjEgRWxl
bWVudHMgb2YgUVdlYlZpZXcKKworICAgIFFXZWJWaWV3IGNvbnNpc3RzIG9mIG90aGVyIG9iamVj
dHMgc3VjaCBhcyBRV2ViRnJhbWUgYW5kIFFXZWJQYWdlLiBUaGUKKyAgICBmbG93Y2hhcnQgYmVs
b3cgc2hvd3MgdGhlc2UgZWxlbWVudHMgYXJlIHJlbGF0ZWQuCisKKyAgICBcaW1hZ2UgcXdlYnZp
ZXctZGlhZ3JhbS5wbmcKKworICAgIFxub3RlIEl0IGlzIHBvc3NpYmxlIHRvIHVzZSBRV2ViUGFn
ZSBhbmQgUVdlYkZyYW1lLCB3aXRob3V0IHVzaW5nIFFXZWJWaWV3LAorICAgIGlmIHlvdSBkbyBu
b3QgcmVxdWlyZSBRV2lkZ2V0IGF0dHJpYnV0ZXMuIE5ldmVydGhlbGVzcywgUXRXZWJLaXQgZGVw
ZW5kcworICAgIG9uIFF0R3VpLCBzbyB5b3Ugc2hvdWxkIHVzZSBhIFFBcHBsaWNhdGlvbiBpbnN0
ZWFkIG9mIFFDb3JlQXBwbGljYXRpb24uCisKKyAgICBcc2Ege1ByZXZpZXdlciBFeGFtcGxlfSwg
e1dlYiBCcm93c2VyfSwge0Zvcm0gRXh0cmFjdG9yIEV4YW1wbGV9LAorICAgIHtHb29nbGUgQ2hh
dCBFeGFtcGxlfSwge0ZhbmN5IEJyb3dzZXIgRXhhbXBsZX0KKyovCisKKyNpZm5kZWYgUVRfTk9f
QUNDRVNTSUJJTElUWQorc3RhdGljIFFBY2Nlc3NpYmxlSW50ZXJmYWNlKiBhY2Nlc3NpYmxlSW50
ZXJmYWNlRmFjdG9yeShjb25zdCBRU3RyaW5nJiBrZXksIFFPYmplY3QqIG9iamVjdCkKK3sKKyAg
ICBRX1VOVVNFRChrZXkpCisKKyAgICBpZiAoUVdlYlBhZ2UqIHBhZ2UgPSBxb2JqZWN0X2Nhc3Q8
UVdlYlBhZ2UqPihvYmplY3QpKQorICAgICAgICByZXR1cm4gbmV3IFFXZWJQYWdlQWNjZXNzaWJs
ZShwYWdlKTsKKyAgICBpZiAoUVdlYlZpZXcqIHZpZXcgPSBxb2JqZWN0X2Nhc3Q8UVdlYlZpZXcq
PihvYmplY3QpKQorICAgICAgICByZXR1cm4gbmV3IFFXZWJWaWV3QWNjZXNzaWJsZSh2aWV3KTsK
KyAgICBpZiAoUVdlYkZyYW1lKiBmcmFtZSA9IHFvYmplY3RfY2FzdDxRV2ViRnJhbWUqPihvYmpl
Y3QpKQorICAgICAgICByZXR1cm4gbmV3IFFXZWJGcmFtZUFjY2Vzc2libGUoZnJhbWUpOworICAg
IHJldHVybiAwOworfQorI2VuZGlmCisKKy8qIQorICAgIENvbnN0cnVjdHMgYW4gZW1wdHkgUVdl
YlZpZXcgd2l0aCBwYXJlbnQgXGEgcGFyZW50LgorCisgICAgXHNhIGxvYWQoKQorKi8KK1FXZWJW
aWV3OjpRV2ViVmlldyhRV2lkZ2V0ICpwYXJlbnQpCisgICAgOiBRV2lkZ2V0KHBhcmVudCkKK3sK
KyAgICBkID0gbmV3IFFXZWJWaWV3UHJpdmF0ZSh0aGlzKTsKKworI2lmICFkZWZpbmVkKFFfV1Nf
UVdTKQorICAgIHNldEF0dHJpYnV0ZShRdDo6V0FfSW5wdXRNZXRob2RFbmFibGVkKTsKKyNlbmRp
ZgorCisgICAgc2V0QXR0cmlidXRlKFF0OjpXQV9BY2NlcHRUb3VjaEV2ZW50cyk7CisgICAgc2V0
QWNjZXB0RHJvcHModHJ1ZSk7CisKKyAgICBzZXRNb3VzZVRyYWNraW5nKHRydWUpOworICAgIHNl
dEZvY3VzUG9saWN5KFF0OjpXaGVlbEZvY3VzKTsKKworI2lmbmRlZiBRVF9OT19BQ0NFU1NJQklM
SVRZCisgICAgUUFjY2Vzc2libGU6Omluc3RhbGxGYWN0b3J5KGFjY2Vzc2libGVJbnRlcmZhY2VG
YWN0b3J5KTsKKyNlbmRpZgorfQorCisvKiEKKyAgICBEZXN0cm95cyB0aGUgd2ViIHZpZXcuCisq
LworUVdlYlZpZXc6On5RV2ViVmlldygpCit7CisgICAgZGVsZXRlIGQ7Cit9CisKKy8qIQorICAg
IFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSB1bmRlcmx5aW5nIHdlYiBwYWdlLgorCisgICAgXHNh
IHNldFBhZ2UoKQorKi8KK1FXZWJQYWdlICpRV2ViVmlldzo6cGFnZSgpIGNvbnN0Cit7CisgICAg
aWYgKCFkLT5wYWdlKSB7CisgICAgICAgIFFXZWJWaWV3ICp0aGF0ID0gY29uc3RfY2FzdDxRV2Vi
VmlldyAqPih0aGlzKTsKKyAgICAgICAgdGhhdC0+c2V0UGFnZShuZXcgUVdlYlBhZ2UodGhhdCkp
OworICAgIH0KKyAgICByZXR1cm4gZC0+cGFnZTsKK30KKwordm9pZCBRV2ViVmlld1ByaXZhdGU6
OmRldGFjaEN1cnJlbnRQYWdlKCkKK3sKKyAgICBpZiAoIXBhZ2UpCisgICAgICAgIHJldHVybjsK
KworICAgIHBhZ2UtPmQtPnZpZXcgPSAwOworCisgICAgLy8gaWYgdGhlIHBhZ2UgY2xpZW50IGlz
IHRoZSBzcGVjaWFsIGNsaWVudCBjb25zdHJ1Y3RlZCBmb3IKKyAgICAvLyBkZWxlZ2F0aW5nIHRo
ZSByZXNwb25zaWJpbGl0aWVzIHRvIGEgUVdpZGdldCwgd2UgbmVlZAorICAgIC8vIHRvIGRlc3Ry
b3kgaXQuCisKKyAgICBpZiAocGFnZS0+ZC0+Y2xpZW50ICYmIHBhZ2UtPmQtPmNsaWVudC0+aXNR
V2lkZ2V0Q2xpZW50KCkpCisgICAgICAgIHBhZ2UtPmQtPmNsaWVudC5yZXNldCgpOworCisgICAg
cGFnZS0+ZC0+Y2xpZW50LnRha2UoKTsKKworICAgIC8vIGlmIHRoZSBwYWdlIHdhcyBjcmVhdGVk
IGJ5IHVzLCB3ZSBvd24gaXQgYW5kIG5lZWQgdG8KKyAgICAvLyBkZXN0cm95IGl0IGFzIHdlbGwu
CisKKyAgICBpZiAocGFnZS0+cGFyZW50KCkgPT0gdmlldykKKyAgICAgICAgZGVsZXRlIHBhZ2U7
CisgICAgZWxzZQorICAgICAgICBwYWdlLT5kaXNjb25uZWN0KHZpZXcpOworCisgICAgcGFnZSA9
IDA7Cit9CisKKy8qIQorICAgIE1ha2VzIFxhIHBhZ2UgdGhlIG5ldyB3ZWIgcGFnZSBvZiB0aGUg
d2ViIHZpZXcuCisKKyAgICBUaGUgcGFyZW50IFFPYmplY3Qgb2YgdGhlIHByb3ZpZGVkIHBhZ2Ug
cmVtYWlucyB0aGUgb3duZXIKKyAgICBvZiB0aGUgb2JqZWN0LiBJZiB0aGUgY3VycmVudCBwYWdl
IGlzIGEgY2hpbGQgb2YgdGhlIHdlYgorICAgIHZpZXcsIGl0IHdpbGwgYmUgZGVsZXRlZC4KKwor
ICAgIFxzYSBwYWdlKCkKKyovCit2b2lkIFFXZWJWaWV3OjpzZXRQYWdlKFFXZWJQYWdlKiBwYWdl
KQoreworICAgIGlmIChkLT5wYWdlID09IHBhZ2UpCisgICAgICAgIHJldHVybjsKKworICAgIGQt
PmRldGFjaEN1cnJlbnRQYWdlKCk7CisgICAgZC0+cGFnZSA9IHBhZ2U7CisKKyAgICBpZiAoZC0+
cGFnZSkgeworICAgICAgICBkLT5wYWdlLT5zZXRWaWV3KHRoaXMpOworICAgICAgICBkLT5wYWdl
LT5zZXRQYWxldHRlKHBhbGV0dGUoKSk7CisgICAgICAgIC8vICMjIyMgY29ubmVjdCBzaWduYWxz
CisgICAgICAgIFFXZWJGcmFtZSAqbWFpbkZyYW1lID0gZC0+cGFnZS0+bWFpbkZyYW1lKCk7Cisg
ICAgICAgIGNvbm5lY3QobWFpbkZyYW1lLCBTSUdOQUwodGl0bGVDaGFuZ2VkKFFTdHJpbmcpKSwK
KyAgICAgICAgICAgIHRoaXMsIFNJR05BTCh0aXRsZUNoYW5nZWQoUVN0cmluZykpKTsKKyAgICAg
ICAgY29ubmVjdChtYWluRnJhbWUsIFNJR05BTChpY29uQ2hhbmdlZCgpKSwKKyAgICAgICAgICAg
IHRoaXMsIFNJR05BTChpY29uQ2hhbmdlZCgpKSk7CisgICAgICAgIGNvbm5lY3QobWFpbkZyYW1l
LCBTSUdOQUwodXJsQ2hhbmdlZChRVXJsKSksCisgICAgICAgICAgICB0aGlzLCBTSUdOQUwodXJs
Q2hhbmdlZChRVXJsKSkpOworCisgICAgICAgIGNvbm5lY3QoZC0+cGFnZSwgU0lHTkFMKGxvYWRT
dGFydGVkKCkpLAorICAgICAgICAgICAgdGhpcywgU0lHTkFMKGxvYWRTdGFydGVkKCkpKTsKKyAg
ICAgICAgY29ubmVjdChkLT5wYWdlLCBTSUdOQUwobG9hZFByb2dyZXNzKGludCkpLAorICAgICAg
ICAgICAgdGhpcywgU0lHTkFMKGxvYWRQcm9ncmVzcyhpbnQpKSk7CisgICAgICAgIGNvbm5lY3Qo
ZC0+cGFnZSwgU0lHTkFMKGxvYWRGaW5pc2hlZChib29sKSksCisgICAgICAgICAgICB0aGlzLCBT
SUdOQUwobG9hZEZpbmlzaGVkKGJvb2wpKSk7CisgICAgICAgIGNvbm5lY3QoZC0+cGFnZSwgU0lH
TkFMKHN0YXR1c0Jhck1lc3NhZ2UoUVN0cmluZykpLAorICAgICAgICAgICAgdGhpcywgU0lHTkFM
KHN0YXR1c0Jhck1lc3NhZ2UoUVN0cmluZykpKTsKKyAgICAgICAgY29ubmVjdChkLT5wYWdlLCBT
SUdOQUwobGlua0NsaWNrZWQoUVVybCkpLAorICAgICAgICAgICAgdGhpcywgU0lHTkFMKGxpbmtD
bGlja2VkKFFVcmwpKSk7CisgICAgICAgIGNvbm5lY3QoZC0+cGFnZSwgU0lHTkFMKHNlbGVjdGlv
bkNoYW5nZWQoKSksCisgICAgICAgICAgICB0aGlzLCBTSUdOQUwoc2VsZWN0aW9uQ2hhbmdlZCgp
KSk7CisKKyAgICAgICAgY29ubmVjdChkLT5wYWdlLCBTSUdOQUwobWljcm9Gb2N1c0NoYW5nZWQo
KSksCisgICAgICAgICAgICB0aGlzLCBTTE9UKHVwZGF0ZU1pY3JvRm9jdXMoKSkpOworICAgICAg
ICBjb25uZWN0KGQtPnBhZ2UsIFNJR05BTChkZXN0cm95ZWQoKSksCisgICAgICAgICAgICB0aGlz
LCBTTE9UKF9xX3BhZ2VEZXN0cm95ZWQoKSkpOworICAgIH0KKyAgICBzZXRBdHRyaWJ1dGUoUXQ6
OldBX09wYXF1ZVBhaW50RXZlbnQsIGQtPnBhZ2UpOworICAgIHVwZGF0ZSgpOworfQorCisvKiEK
KyAgICBMb2FkcyB0aGUgc3BlY2lmaWVkIFxhIHVybCBhbmQgZGlzcGxheXMgaXQuCisKKyAgICBc
bm90ZSBUaGUgdmlldyByZW1haW5zIHRoZSBzYW1lIHVudGlsIGVub3VnaCBkYXRhIGhhcyBhcnJp
dmVkIHRvIGRpc3BsYXkgdGhlIG5ldyBcYSB1cmwuCisKKyAgICBcc2Egc2V0VXJsKCksIHVybCgp
LCB1cmxDaGFuZ2VkKCksIFFVcmw6OmZyb21Vc2VySW5wdXQoKQorKi8KK3ZvaWQgUVdlYlZpZXc6
OmxvYWQoY29uc3QgUVVybCAmdXJsKQoreworICAgIHBhZ2UoKS0+bWFpbkZyYW1lKCktPmxvYWQo
dXJsKTsKK30KKworLyohCisgICAgXGZuIHZvaWQgUVdlYlZpZXc6OmxvYWQoY29uc3QgUU5ldHdv
cmtSZXF1ZXN0ICZyZXF1ZXN0LCBRTmV0d29ya0FjY2Vzc01hbmFnZXI6Ok9wZXJhdGlvbiBvcGVy
YXRpb24sIGNvbnN0IFFCeXRlQXJyYXkgJmJvZHkpCisKKyAgICBMb2FkcyBhIG5ldHdvcmsgcmVx
dWVzdCwgXGEgcmVxdWVzdCwgdXNpbmcgdGhlIG1ldGhvZCBzcGVjaWZpZWQgaW4gXGEgb3BlcmF0
aW9uLgorCisgICAgXGEgYm9keSBpcyBvcHRpb25hbCBhbmQgaXMgb25seSB1c2VkIGZvciBQT1NU
IG9wZXJhdGlvbnMuCisKKyAgICBcbm90ZSBUaGUgdmlldyByZW1haW5zIHRoZSBzYW1lIHVudGls
IGVub3VnaCBkYXRhIGhhcyBhcnJpdmVkIHRvIGRpc3BsYXkgdGhlIG5ldyB1cmwuCisKKyAgICBc
c2EgdXJsKCksIHVybENoYW5nZWQoKQorKi8KKwordm9pZCBRV2ViVmlldzo6bG9hZChjb25zdCBR
TmV0d29ya1JlcXVlc3QgJnJlcXVlc3QsIFFOZXR3b3JrQWNjZXNzTWFuYWdlcjo6T3BlcmF0aW9u
IG9wZXJhdGlvbiwgY29uc3QgUUJ5dGVBcnJheSAmYm9keSkKK3sKKyAgICBwYWdlKCktPm1haW5G
cmFtZSgpLT5sb2FkKHJlcXVlc3QsIG9wZXJhdGlvbiwgYm9keSk7Cit9CisKKy8qIQorICAgIFNl
dHMgdGhlIGNvbnRlbnQgb2YgdGhlIHdlYiB2aWV3IHRvIHRoZSBzcGVjaWZpZWQgXGEgaHRtbC4K
KworICAgIEV4dGVybmFsIG9iamVjdHMgc3VjaCBhcyBzdHlsZXNoZWV0cyBvciBpbWFnZXMgcmVm
ZXJlbmNlZCBpbiB0aGUgSFRNTAorICAgIGRvY3VtZW50IGFyZSBsb2NhdGVkIHJlbGF0aXZlIHRv
IFxhIGJhc2VVcmwuCisKKyAgICBUaGUgXGEgaHRtbCBpcyBsb2FkZWQgaW1tZWRpYXRlbHk7IGV4
dGVybmFsIG9iamVjdHMgYXJlIGxvYWRlZCBhc3luY2hyb25vdXNseS4KKworICAgIFdoZW4gdXNp
bmcgdGhpcyBtZXRob2QsIFdlYktpdCBhc3N1bWVzIHRoYXQgZXh0ZXJuYWwgcmVzb3VyY2VzIHN1
Y2ggYXMKKyAgICBKYXZhU2NyaXB0IHByb2dyYW1zIG9yIHN0eWxlIHNoZWV0cyBhcmUgZW5jb2Rl
ZCBpbiBVVEYtOCB1bmxlc3Mgb3RoZXJ3aXNlCisgICAgc3BlY2lmaWVkLiBGb3IgZXhhbXBsZSwg
dGhlIGVuY29kaW5nIG9mIGFuIGV4dGVybmFsIHNjcmlwdCBjYW4gYmUgc3BlY2lmaWVkCisgICAg
dGhyb3VnaCB0aGUgY2hhcnNldCBhdHRyaWJ1dGUgb2YgdGhlIEhUTUwgc2NyaXB0IHRhZy4gQWx0
ZXJuYXRpdmVseSwgdGhlCisgICAgZW5jb2RpbmcgY2FuIGFsc28gYmUgc3BlY2lmaWVkIGJ5IHRo
ZSB3ZWIgc2VydmVyLgorCisgICAgVGhpcyBpcyBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIGVxdWl2
YWxlbnQgdG8gc2V0Q29udGVudChodG1sLCAidGV4dC9odG1sIiwgYmFzZVVybCkuCisKKyAgICBc
d2FybmluZyBUaGlzIGZ1bmN0aW9uIHdvcmtzIG9ubHkgZm9yIEhUTUwsIGZvciBvdGhlciBtaW1l
IHR5cGVzIChpLmUuIFhIVE1MLCBTVkcpCisgICAgc2V0Q29udGVudCgpIHNob3VsZCBiZSB1c2Vk
IGluc3RlYWQuCisKKyAgICBcc2EgbG9hZCgpLCBzZXRDb250ZW50KCksIFFXZWJGcmFtZTo6dG9I
dG1sKCksIFFXZWJGcmFtZTo6c2V0Q29udGVudCgpCisqLwordm9pZCBRV2ViVmlldzo6c2V0SHRt
bChjb25zdCBRU3RyaW5nICZodG1sLCBjb25zdCBRVXJsICZiYXNlVXJsKQoreworICAgIHBhZ2Uo
KS0+bWFpbkZyYW1lKCktPnNldEh0bWwoaHRtbCwgYmFzZVVybCk7Cit9CisKKy8qIQorICAgIFNl
dHMgdGhlIGNvbnRlbnQgb2YgdGhlIHdlYiB2aWV3IHRvIHRoZSBzcGVjaWZpZWQgY29udGVudCBc
YSBkYXRhLiBJZiB0aGUgXGEgbWltZVR5cGUgYXJndW1lbnQKKyAgICBpcyBlbXB0eSBpdCBpcyBj
dXJyZW50bHkgYXNzdW1lZCB0aGF0IHRoZSBjb250ZW50IGlzIEhUTUwgYnV0IGluIGZ1dHVyZSB2
ZXJzaW9ucyB3ZSBtYXkgaW50cm9kdWNlCisgICAgYXV0by1kZXRlY3Rpb24uCisKKyAgICBFeHRl
cm5hbCBvYmplY3RzIHJlZmVyZW5jZWQgaW4gdGhlIGNvbnRlbnQgYXJlIGxvY2F0ZWQgcmVsYXRp
dmUgdG8gXGEgYmFzZVVybC4KKworICAgIFRoZSBcYSBkYXRhIGlzIGxvYWRlZCBpbW1lZGlhdGVs
eTsgZXh0ZXJuYWwgb2JqZWN0cyBhcmUgbG9hZGVkIGFzeW5jaHJvbm91c2x5LgorCisgICAgXHNh
IGxvYWQoKSwgc2V0SHRtbCgpLCBRV2ViRnJhbWU6OnRvSHRtbCgpCisqLwordm9pZCBRV2ViVmll
dzo6c2V0Q29udGVudChjb25zdCBRQnl0ZUFycmF5ICZkYXRhLCBjb25zdCBRU3RyaW5nICZtaW1l
VHlwZSwgY29uc3QgUVVybCAmYmFzZVVybCkKK3sKKyAgICBwYWdlKCktPm1haW5GcmFtZSgpLT5z
ZXRDb250ZW50KGRhdGEsIG1pbWVUeXBlLCBiYXNlVXJsKTsKK30KKworLyohCisgICAgUmV0dXJu
cyBhIHBvaW50ZXIgdG8gdGhlIHZpZXcncyBoaXN0b3J5IG9mIG5hdmlnYXRlZCB3ZWIgcGFnZXMu
CisKKyAgICBJdCBpcyBlcXVpdmFsZW50IHRvCisKKyAgICBcc25pcHBldCB3ZWJraXRzbmlwcGV0
cy9xdHdlYmtpdF9xd2Vidmlld19zbmlwcGV0LmNwcCAwCisqLworUVdlYkhpc3RvcnkgKlFXZWJW
aWV3OjpoaXN0b3J5KCkgY29uc3QKK3sKKyAgICByZXR1cm4gcGFnZSgpLT5oaXN0b3J5KCk7Cit9
CisKKy8qIQorICAgIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSB2aWV3L3BhZ2Ugc3BlY2lmaWMg
c2V0dGluZ3Mgb2JqZWN0LgorCisgICAgSXQgaXMgZXF1aXZhbGVudCB0bworCisgICAgXHNuaXBw
ZXQgd2Via2l0c25pcHBldHMvcXR3ZWJraXRfcXdlYnZpZXdfc25pcHBldC5jcHAgMQorCisgICAg
XHNhIFFXZWJTZXR0aW5nczo6Z2xvYmFsU2V0dGluZ3MoKQorKi8KK1FXZWJTZXR0aW5ncyAqUVdl
YlZpZXc6OnNldHRpbmdzKCkgY29uc3QKK3sKKyAgICByZXR1cm4gcGFnZSgpLT5zZXR0aW5ncygp
OworfQorCisvKiEKKyAgICBccHJvcGVydHkgUVdlYlZpZXc6OnRpdGxlCisgICAgXGJyaWVmIHRo
ZSB0aXRsZSBvZiB0aGUgd2ViIHBhZ2UgY3VycmVudGx5IHZpZXdlZAorCisgICAgQnkgZGVmYXVs
dCwgdGhpcyBwcm9wZXJ0eSBjb250YWlucyBhbiBlbXB0eSBzdHJpbmcuCisKKyAgICBcc2EgdGl0
bGVDaGFuZ2VkKCkKKyovCitRU3RyaW5nIFFXZWJWaWV3Ojp0aXRsZSgpIGNvbnN0Cit7CisgICAg
aWYgKGQtPnBhZ2UpCisgICAgICAgIHJldHVybiBkLT5wYWdlLT5tYWluRnJhbWUoKS0+dGl0bGUo
KTsKKyAgICByZXR1cm4gUVN0cmluZygpOworfQorCisvKiEKKyAgICBccHJvcGVydHkgUVdlYlZp
ZXc6OnVybAorICAgIFxicmllZiB0aGUgdXJsIG9mIHRoZSB3ZWIgcGFnZSBjdXJyZW50bHkgdmll
d2VkCisKKyAgICBTZXR0aW5nIHRoaXMgcHJvcGVydHkgY2xlYXJzIHRoZSB2aWV3IGFuZCBsb2Fk
cyB0aGUgVVJMLgorCisgICAgQnkgZGVmYXVsdCwgdGhpcyBwcm9wZXJ0eSBjb250YWlucyBhbiBl
bXB0eSwgaW52YWxpZCBVUkwuCisKKyAgICBcc2EgbG9hZCgpLCB1cmxDaGFuZ2VkKCkKKyovCisK
K3ZvaWQgUVdlYlZpZXc6OnNldFVybChjb25zdCBRVXJsICZ1cmwpCit7CisgICAgcGFnZSgpLT5t
YWluRnJhbWUoKS0+c2V0VXJsKHVybCk7Cit9CisKK1FVcmwgUVdlYlZpZXc6OnVybCgpIGNvbnN0
Cit7CisgICAgaWYgKGQtPnBhZ2UpCisgICAgICAgIHJldHVybiBkLT5wYWdlLT5tYWluRnJhbWUo
KS0+dXJsKCk7CisgICAgcmV0dXJuIFFVcmwoKTsKK30KKworLyohCisgICAgXHByb3BlcnR5IFFX
ZWJWaWV3OjppY29uCisgICAgXGJyaWVmIHRoZSBpY29uIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2Vi
IHBhZ2UgY3VycmVudGx5IHZpZXdlZAorCisgICAgQnkgZGVmYXVsdCwgdGhpcyBwcm9wZXJ0eSBj
b250YWlucyBhIG51bGwgaWNvbi4KKworICAgIFxzYSBpY29uQ2hhbmdlZCgpLCBRV2ViU2V0dGlu
Z3M6Omljb25Gb3JVcmwoKQorKi8KK1FJY29uIFFXZWJWaWV3OjppY29uKCkgY29uc3QKK3sKKyAg
ICBpZiAoZC0+cGFnZSkKKyAgICAgICAgcmV0dXJuIGQtPnBhZ2UtPm1haW5GcmFtZSgpLT5pY29u
KCk7CisgICAgcmV0dXJuIFFJY29uKCk7Cit9CisKKy8qIQorICAgIFxwcm9wZXJ0eSBRV2ViVmll
dzo6aGFzU2VsZWN0aW9uCisgICAgXGJyaWVmIHdoZXRoZXIgdGhpcyBwYWdlIGNvbnRhaW5zIHNl
bGVjdGVkIGNvbnRlbnQgb3Igbm90LgorCisgICAgQnkgZGVmYXVsdCwgdGhpcyBwcm9wZXJ0eSBp
cyBmYWxzZS4KKworICAgIFxzYSBzZWxlY3Rpb25DaGFuZ2VkKCkKKyovCitib29sIFFXZWJWaWV3
OjpoYXNTZWxlY3Rpb24oKSBjb25zdAoreworICAgIGlmIChkLT5wYWdlKQorICAgICAgICByZXR1
cm4gZC0+cGFnZS0+aGFzU2VsZWN0aW9uKCk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKiEK
KyAgICBccHJvcGVydHkgUVdlYlZpZXc6OnNlbGVjdGVkVGV4dAorICAgIFxicmllZiB0aGUgdGV4
dCBjdXJyZW50bHkgc2VsZWN0ZWQKKworICAgIEJ5IGRlZmF1bHQsIHRoaXMgcHJvcGVydHkgY29u
dGFpbnMgYW4gZW1wdHkgc3RyaW5nLgorCisgICAgXHNhIGZpbmRUZXh0KCksIHNlbGVjdGlvbkNo
YW5nZWQoKSwgc2VsZWN0ZWRIdG1sKCkKKyovCitRU3RyaW5nIFFXZWJWaWV3OjpzZWxlY3RlZFRl
eHQoKSBjb25zdAoreworICAgIGlmIChkLT5wYWdlKQorICAgICAgICByZXR1cm4gZC0+cGFnZS0+
c2VsZWN0ZWRUZXh0KCk7CisgICAgcmV0dXJuIFFTdHJpbmcoKTsKK30KKworLyohCisgICAgXHNp
bmNlIDQuOAorICAgIFxwcm9wZXJ0eSBRV2ViVmlldzo6c2VsZWN0ZWRIdG1sCisgICAgXGJyaWVm
IHRoZSBIVE1MIGN1cnJlbnRseSBzZWxlY3RlZAorCisgICAgQnkgZGVmYXVsdCwgdGhpcyBwcm9w
ZXJ0eSBjb250YWlucyBhbiBlbXB0eSBzdHJpbmcuCisKKyAgICBcc2EgZmluZFRleHQoKSwgc2Vs
ZWN0aW9uQ2hhbmdlZCgpLCBzZWxlY3RlZFRleHQoKQorKi8KK1FTdHJpbmcgUVdlYlZpZXc6OnNl
bGVjdGVkSHRtbCgpIGNvbnN0Cit7CisgICAgaWYgKGQtPnBhZ2UpCisgICAgICAgIHJldHVybiBk
LT5wYWdlLT5zZWxlY3RlZEh0bWwoKTsKKyAgICByZXR1cm4gUVN0cmluZygpOworfQorCisjaWZu
ZGVmIFFUX05PX0FDVElPTgorLyohCisgICAgUmV0dXJucyBhIHBvaW50ZXIgdG8gYSBRQWN0aW9u
IHRoYXQgZW5jYXBzdWxhdGVzIHRoZSBzcGVjaWZpZWQgd2ViIGFjdGlvbiBcYSBhY3Rpb24uCisq
LworUUFjdGlvbiAqUVdlYlZpZXc6OnBhZ2VBY3Rpb24oUVdlYlBhZ2U6OldlYkFjdGlvbiBhY3Rp
b24pIGNvbnN0Cit7CisgICAgcmV0dXJuIHBhZ2UoKS0+YWN0aW9uKGFjdGlvbik7Cit9CisjZW5k
aWYKKworLyohCisgICAgVHJpZ2dlcnMgdGhlIHNwZWNpZmllZCBcYSBhY3Rpb24uIElmIGl0IGlz
IGEgY2hlY2thYmxlIGFjdGlvbiB0aGUgc3BlY2lmaWVkCisgICAgXGEgY2hlY2tlZCBzdGF0ZSBp
cyBhc3N1bWVkLgorCisgICAgVGhlIGZvbGxvd2luZyBleGFtcGxlIHRyaWdnZXJzIHRoZSBjb3B5
IGFjdGlvbiBhbmQgdGhlcmVmb3JlIGNvcGllcyBhbnkKKyAgICBzZWxlY3RlZCB0ZXh0IHRvIHRo
ZSBjbGlwYm9hcmQuCisKKyAgICBcc25pcHBldCB3ZWJraXRzbmlwcGV0cy9xdHdlYmtpdF9xd2Vi
dmlld19zbmlwcGV0LmNwcCAyCisKKyAgICBcc2EgcGFnZUFjdGlvbigpCisqLwordm9pZCBRV2Vi
Vmlldzo6dHJpZ2dlclBhZ2VBY3Rpb24oUVdlYlBhZ2U6OldlYkFjdGlvbiBhY3Rpb24sIGJvb2wg
Y2hlY2tlZCkKK3sKKyAgICBwYWdlKCktPnRyaWdnZXJBY3Rpb24oYWN0aW9uLCBjaGVja2VkKTsK
K30KKworLyohCisgICAgXHByb3BlcnR5IFFXZWJWaWV3Ojptb2RpZmllZAorICAgIFxicmllZiB3
aGV0aGVyIHRoZSBkb2N1bWVudCB3YXMgbW9kaWZpZWQgYnkgdGhlIHVzZXIKKworICAgIFBhcnRz
IG9mIEhUTUwgZG9jdW1lbnRzIGNhbiBiZSBlZGl0YWJsZSBmb3IgZXhhbXBsZSB0aHJvdWdoIHRo
ZQorICAgIFxje2NvbnRlbnRlZGl0YWJsZX0gYXR0cmlidXRlIG9uIEhUTUwgZWxlbWVudHMuCisK
KyAgICBCeSBkZWZhdWx0LCB0aGlzIHByb3BlcnR5IGlzIGZhbHNlLgorKi8KK2Jvb2wgUVdlYlZp
ZXc6OmlzTW9kaWZpZWQoKSBjb25zdAoreworICAgIGlmIChkLT5wYWdlKQorICAgICAgICByZXR1
cm4gZC0+cGFnZS0+aXNNb2RpZmllZCgpOworICAgIHJldHVybiBmYWxzZTsKK30KKworLyoKK1F0
OjpUZXh0SW50ZXJhY3Rpb25GbGFncyBRV2ViVmlldzo6dGV4dEludGVyYWN0aW9uRmxhZ3MoKSBj
b25zdAoreworICAgIC8vICMjIyBGSVhNRSAoYWRkIHRvIHBhZ2UpCisgICAgcmV0dXJuIFF0OjpU
ZXh0SW50ZXJhY3Rpb25GbGFncygpOworfQorKi8KKworLyoKKyAgICBccHJvcGVydHkgUVdlYlZp
ZXc6OnRleHRJbnRlcmFjdGlvbkZsYWdzCisgICAgXGJyaWVmIGhvdyB0aGUgdmlldyBzaG91bGQg
aGFuZGxlIHVzZXIgaW5wdXQKKworICAgIFNwZWNpZmllcyBob3cgdGhlIHVzZXIgY2FuIGludGVy
YWN0IHdpdGggdGhlIHRleHQgb24gdGhlIHBhZ2UuCisqLworCisvKgordm9pZCBRV2ViVmlldzo6
c2V0VGV4dEludGVyYWN0aW9uRmxhZ3MoUXQ6OlRleHRJbnRlcmFjdGlvbkZsYWdzIGZsYWdzKQor
eworICAgIFFfVU5VU0VEKGZsYWdzKQorICAgIC8vICMjIyBGSVhNRSAoYWRkIHRvIHBhZ2UpCit9
CisqLworCisvKiEKKyAgICBccmVpbXAKKyovCitRU2l6ZSBRV2ViVmlldzo6c2l6ZUhpbnQoKSBj
b25zdAoreworICAgIHJldHVybiBRU2l6ZSg4MDAsIDYwMCk7IC8vICMjIyMuLi4KK30KKworLyoh
CisgICAgXHByb3BlcnR5IFFXZWJWaWV3Ojp6b29tRmFjdG9yCisgICAgXHNpbmNlIDQuNQorICAg
IFxicmllZiB0aGUgem9vbSBmYWN0b3IgZm9yIHRoZSB2aWV3CisqLworCit2b2lkIFFXZWJWaWV3
OjpzZXRab29tRmFjdG9yKHFyZWFsIGZhY3RvcikKK3sKKyAgICBwYWdlKCktPm1haW5GcmFtZSgp
LT5zZXRab29tRmFjdG9yKGZhY3Rvcik7Cit9CisKK3FyZWFsIFFXZWJWaWV3Ojp6b29tRmFjdG9y
KCkgY29uc3QKK3sKKyAgICByZXR1cm4gcGFnZSgpLT5tYWluRnJhbWUoKS0+em9vbUZhY3Rvcigp
OworfQorCisvKiEKKyAgXHByb3BlcnR5IFFXZWJWaWV3Ojp0ZXh0U2l6ZU11bHRpcGxpZXIKKyAg
XGJyaWVmIHRoZSBzY2FsaW5nIGZhY3RvciBmb3IgYWxsIHRleHQgaW4gdGhlIGZyYW1lCisgIFxv
YnNvbGV0ZQorCisgIFVzZSBzZXRab29tRmFjdG9yIGluc3RlYWQsIGluIGNvbWJpbmF0aW9uIHdp
dGggdGhlCisgIFpvb21UZXh0T25seSBhdHRyaWJ1dGUgaW4gUVdlYlNldHRpbmdzLgorCisgIFxu
b3RlIFNldHRpbmcgdGhpcyBwcm9wZXJ0eSBhbHNvIGVuYWJsZXMgdGhlCisgIFpvb21UZXh0T25s
eSBhdHRyaWJ1dGUgaW4gUVdlYlNldHRpbmdzLgorCisgIEJ5IGRlZmF1bHQsIHRoaXMgcHJvcGVy
dHkgY29udGFpbnMgYSB2YWx1ZSBvZiAxLjAuCisqLworCisvKiEKKyAgICBTZXRzIHRoZSB2YWx1
ZSBvZiB0aGUgbXVsdGlwbGllciB1c2VkIHRvIHNjYWxlIHRoZSB0ZXh0IGluIGEgV2ViIHBhZ2Ug
dG8KKyAgICB0aGUgXGEgZmFjdG9yIHNwZWNpZmllZC4KKyovCit2b2lkIFFXZWJWaWV3OjpzZXRU
ZXh0U2l6ZU11bHRpcGxpZXIocXJlYWwgZmFjdG9yKQoreworICAgIHBhZ2UoKS0+bWFpbkZyYW1l
KCktPnNldFRleHRTaXplTXVsdGlwbGllcihmYWN0b3IpOworfQorCisvKiEKKyAgICBSZXR1cm5z
IHRoZSB2YWx1ZSBvZiB0aGUgbXVsdGlwbGllciB1c2VkIHRvIHNjYWxlIHRoZSB0ZXh0IGluIGEg
V2ViIHBhZ2UuCisqLworcXJlYWwgUVdlYlZpZXc6OnRleHRTaXplTXVsdGlwbGllcigpIGNvbnN0
Cit7CisgICAgcmV0dXJuIHBhZ2UoKS0+bWFpbkZyYW1lKCktPnRleHRTaXplTXVsdGlwbGllcigp
OworfQorCisvKiEKKyAgICBccHJvcGVydHkgUVdlYlZpZXc6OnJlbmRlckhpbnRzCisgICAgXHNp
bmNlIDQuNgorICAgIFxicmllZiB0aGUgZGVmYXVsdCByZW5kZXIgaGludHMgZm9yIHRoZSB2aWV3
CisKKyAgICBUaGVzZSBoaW50cyBhcmUgdXNlZCB0byBpbml0aWFsaXplIFFQYWludGVyIGJlZm9y
ZSBwYWludGluZyB0aGUgV2ViIHBhZ2UuCisKKyAgICBRUGFpbnRlcjo6VGV4dEFudGlhbGlhc2lu
ZyBhbmQgUVBhaW50ZXI6OlNtb290aFBpeG1hcFRyYW5zZm9ybSBhcmUgZW5hYmxlZCBieSBkZWZh
dWx0LgorCisgICAgXHNhIFFQYWludGVyOjpyZW5kZXJIaW50cygpCisqLworCisvKiEKKyAgICBc
c2luY2UgNC42CisgICAgUmV0dXJucyB0aGUgcmVuZGVyIGhpbnRzIHVzZWQgYnkgdGhlIHZpZXcg
dG8gcmVuZGVyIGNvbnRlbnQuCisKKyAgICBcc2EgUVBhaW50ZXI6OnJlbmRlckhpbnRzKCkKKyov
CitRUGFpbnRlcjo6UmVuZGVySGludHMgUVdlYlZpZXc6OnJlbmRlckhpbnRzKCkgY29uc3QKK3sK
KyAgICByZXR1cm4gZC0+cmVuZGVySGludHM7Cit9CisKKy8qIQorICAgIFxzaW5jZSA0LjYKKyAg
ICBTZXRzIHRoZSByZW5kZXIgaGludHMgdXNlZCBieSB0aGUgdmlldyB0byB0aGUgc3BlY2lmaWVk
IFxhIGhpbnRzLgorCisgICAgXHNhIFFQYWludGVyOjpzZXRSZW5kZXJIaW50cygpCisqLwordm9p
ZCBRV2ViVmlldzo6c2V0UmVuZGVySGludHMoUVBhaW50ZXI6OlJlbmRlckhpbnRzIGhpbnRzKQor
eworICAgIGlmIChoaW50cyA9PSBkLT5yZW5kZXJIaW50cykKKyAgICAgICAgcmV0dXJuOworICAg
IGQtPnJlbmRlckhpbnRzID0gaGludHM7CisgICAgdXBkYXRlKCk7Cit9CisKKy8qIQorICAgIFxz
aW5jZSA0LjYKKyAgICBJZiBcYSBlbmFibGVkIGlzIHRydWUsIGVuYWJsZXMgdGhlIHNwZWNpZmll
ZCByZW5kZXIgXGEgaGludDsgb3RoZXJ3aXNlCisgICAgZGlzYWJsZXMgaXQuCisKKyAgICBcc2Eg
cmVuZGVySGludHMsIFFQYWludGVyOjpyZW5kZXJIaW50cygpCisqLwordm9pZCBRV2ViVmlldzo6
c2V0UmVuZGVySGludChRUGFpbnRlcjo6UmVuZGVySGludCBoaW50LCBib29sIGVuYWJsZWQpCit7
CisgICAgUVBhaW50ZXI6OlJlbmRlckhpbnRzIG9sZEhpbnRzID0gZC0+cmVuZGVySGludHM7Cisg
ICAgaWYgKGVuYWJsZWQpCisgICAgICAgIGQtPnJlbmRlckhpbnRzIHw9IGhpbnQ7CisgICAgZWxz
ZQorICAgICAgICBkLT5yZW5kZXJIaW50cyAmPSB+aGludDsKKyAgICBpZiAob2xkSGludHMgIT0g
ZC0+cmVuZGVySGludHMpCisgICAgICAgIHVwZGF0ZSgpOworfQorCisKKy8qIQorICAgIEZpbmRz
IHRoZSBzcGVjaWZpZWQgc3RyaW5nLCBcYSBzdWJTdHJpbmcsIGluIHRoZSBwYWdlLCB1c2luZyB0
aGUgZ2l2ZW4gXGEgb3B0aW9ucy4KKworICAgIElmIHRoZSBIaWdobGlnaHRBbGxPY2N1cnJlbmNl
cyBmbGFnIGlzIHBhc3NlZCwgdGhlIGZ1bmN0aW9uIHdpbGwgaGlnaGxpZ2h0IGFsbCBvY2N1cnJl
bmNlcworICAgIHRoYXQgZXhpc3QgaW4gdGhlIHBhZ2UuIEFsbCBzdWJzZXF1ZW50IGNhbGxzIHdp
bGwgZXh0ZW5kIHRoZSBoaWdobGlnaHQsIHJhdGhlciB0aGFuCisgICAgcmVwbGFjZSBpdCwgd2l0
aCBvY2N1cnJlbmNlcyBvZiB0aGUgbmV3IHN0cmluZy4KKworICAgIElmIHRoZSBIaWdobGlnaHRB
bGxPY2N1cnJlbmNlcyBmbGFnIGlzIG5vdCBwYXNzZWQsIHRoZSBmdW5jdGlvbiB3aWxsIHNlbGVj
dCBhbiBvY2N1cnJlbmNlCisgICAgYW5kIGFsbCBzdWJzZXF1ZW50IGNhbGxzIHdpbGwgcmVwbGFj
ZSB0aGUgY3VycmVudCBvY2N1cnJlbmNlIHdpdGggdGhlIG5leHQgb25lLgorCisgICAgVG8gY2xl
YXIgdGhlIHNlbGVjdGlvbiwganVzdCBwYXNzIGFuIGVtcHR5IHN0cmluZy4KKworICAgIFJldHVy
bnMgdHJ1ZSBpZiBcYSBzdWJTdHJpbmcgd2FzIGZvdW5kOyBvdGhlcndpc2UgcmV0dXJucyBmYWxz
ZS4KKworICAgIFxzYSBzZWxlY3RlZFRleHQoKSwgc2VsZWN0aW9uQ2hhbmdlZCgpCisqLworYm9v
bCBRV2ViVmlldzo6ZmluZFRleHQoY29uc3QgUVN0cmluZyAmc3ViU3RyaW5nLCBRV2ViUGFnZTo6
RmluZEZsYWdzIG9wdGlvbnMpCit7CisgICAgaWYgKGQtPnBhZ2UpCisgICAgICAgIHJldHVybiBk
LT5wYWdlLT5maW5kVGV4dChzdWJTdHJpbmcsIG9wdGlvbnMpOworICAgIHJldHVybiBmYWxzZTsK
K30KKworLyohIFxyZWltcAorKi8KK2Jvb2wgUVdlYlZpZXc6OmV2ZW50KFFFdmVudCAqZSkKK3sK
KyAgICBpZiAoZC0+cGFnZSkgeworI2lmbmRlZiBRVF9OT19DT05URVhUTUVOVQorICAgICAgICBp
ZiAoZS0+dHlwZSgpID09IFFFdmVudDo6Q29udGV4dE1lbnUpIHsKKyAgICAgICAgICAgIGlmICgh
aXNFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAg
UUNvbnRleHRNZW51RXZlbnQgKmV2ZW50ID0gc3RhdGljX2Nhc3Q8UUNvbnRleHRNZW51RXZlbnQg
Kj4oZSk7CisgICAgICAgICAgICBpZiAoZC0+cGFnZS0+c3dhbGxvd0NvbnRleHRNZW51RXZlbnQo
ZXZlbnQpKSB7CisgICAgICAgICAgICAgICAgZS0+YWNjZXB0KCk7CisgICAgICAgICAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkLT5wYWdlLT51cGRhdGVQ
b3NpdGlvbkRlcGVuZGVudEFjdGlvbnMoZXZlbnQtPnBvcygpKTsKKyAgICAgICAgfSBlbHNlCisj
ZW5kaWYgLy8gUVRfTk9fQ09OVEVYVE1FTlUKKyAgICAgICAgaWYgKGUtPnR5cGUoKSA9PSBRRXZl
bnQ6OlNob3J0Y3V0T3ZlcnJpZGUpIHsKKyAgICAgICAgICAgIGQtPnBhZ2UtPmV2ZW50KGUpOwor
I2lmbmRlZiBRVF9OT19DVVJTT1IKKyAgICAgICAgfSBlbHNlIGlmIChlLT50eXBlKCkgPT0gUUV2
ZW50OjpDdXJzb3JDaGFuZ2UpIHsKKyAgICAgICAgICAgIC8vIEFuIHVuc2V0Q3Vyc29yIHdpbGwg
c2V0IHRoZSBjdXJzb3IgdG8gUXQ6OkFycm93Q3Vyc29yLgorICAgICAgICAgICAgLy8gVGh1cyB0
aGlzIGN1cnNvciBjaGFuZ2UgbWlnaHQgYmUgYSBRV2lkZ2V0Ojp1bnNldEN1cnNvcigpCisgICAg
ICAgICAgICAvLyBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSBhbmQgaXQgY2FtZSBmcm9tIFdlYkNv
cmUsIHRoZQorICAgICAgICAgICAgLy8gUVdlYlBhZ2VDbGllbnQgYWxyZWFkeSBoYXMgc2V0IGl0
cyBjdXJzb3IgaW50ZXJuYWxseQorICAgICAgICAgICAgLy8gdG8gUXQ6OkFycm93Q3Vyc29yLCBz
byB1cGRhdGluZyB0aGUgY3Vyc29yIGlzIGFsd2F5cworICAgICAgICAgICAgLy8gcmlnaHQsIGFz
IGl0IGZhbGxzIGJhY2sgdG8gdGhlIGxhc3QgY3Vyc29yIHNldCBieQorICAgICAgICAgICAgLy8g
V2ViQ29yZS4KKyAgICAgICAgICAgIC8vIEZJWE1FOiBBZGQgYSBRRXZlbnQ6OkN1cnNvclVuc2V0
IG9yIHNpbWlsYXIgdG8gUXQuCisgICAgICAgICAgICBpZiAoY3Vyc29yKCkuc2hhcGUoKSA9PSBR
dDo6QXJyb3dDdXJzb3IpCisgICAgICAgICAgICAgICAgZC0+cGFnZS0+ZC0+Y2xpZW50LT5yZXNl
dEN1cnNvcigpOworI2VuZGlmCisgICAgICAgIH0gZWxzZSBpZiAoZS0+dHlwZSgpID09IFFFdmVu
dDo6VG91Y2hCZWdpbiAKKyAgICAgICAgICAgIHx8IGUtPnR5cGUoKSA9PSBRRXZlbnQ6OlRvdWNo
RW5kCisgICAgICAgICAgICB8fCBlLT50eXBlKCkgPT0gUUV2ZW50OjpUb3VjaFVwZGF0ZQorICAg
ICAgICAgICAgfHwgZS0+dHlwZSgpID09IFFFdmVudDo6VG91Y2hDYW5jZWwpIHsKKyAgICAgICAg
ICAgIGQtPnBhZ2UtPmV2ZW50KGUpOworCisgICAgICAgICAgICAvLyBBbHdheXMgcmV0dXJuIHRy
dWUgc28gdGhhdCB3ZSdsbCByZWNlaXZlIGFsc28gVG91Y2hVcGRhdGUgYW5kIFRvdWNoRW5kIGV2
ZW50cworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoZS0+dHlw
ZSgpID09IFFFdmVudDo6TGVhdmUpCisgICAgICAgICAgICBkLT5wYWdlLT5ldmVudChlKTsKKyAg
ICB9CisKKyAgICByZXR1cm4gUVdpZGdldDo6ZXZlbnQoZSk7Cit9CisKKy8qIQorICAgIFByaW50
cyB0aGUgbWFpbiBmcmFtZSB0byB0aGUgZ2l2ZW4gXGEgcHJpbnRlci4KKworICAgIFxzYSBRV2Vi
RnJhbWU6OnByaW50KCksIFFQcmludFByZXZpZXdEaWFsb2cKKyovCit2b2lkIFFXZWJWaWV3Ojpw
cmludChRUHJpbnRlciAqcHJpbnRlcikgY29uc3QKK3sKKyNpZiAhZGVmaW5lZChRVF9OT19QUklO
VEVSKSAmJiBIQVZFKFFUUFJJTlRTVVBQT1JUKQorICAgIHBhZ2UoKS0+bWFpbkZyYW1lKCktPnBy
aW50KHByaW50ZXIpOworI2VuZGlmCit9CisKKy8qIQorICAgIENvbnZlbmllbmNlIHNsb3QgdGhh
dCBzdG9wcyBsb2FkaW5nIHRoZSBkb2N1bWVudC4KKworICAgIEl0IGlzIGVxdWl2YWxlbnQgdG8K
KworICAgIFxzbmlwcGV0IHdlYmtpdHNuaXBwZXRzL3F0d2Via2l0X3F3ZWJ2aWV3X3NuaXBwZXQu
Y3BwIDMKKworICAgIFxzYSByZWxvYWQoKSwgcGFnZUFjdGlvbigpLCBsb2FkRmluaXNoZWQoKQor
Ki8KK3ZvaWQgUVdlYlZpZXc6OnN0b3AoKQoreworICAgIGlmIChkLT5wYWdlKQorICAgICAgICBk
LT5wYWdlLT50cmlnZ2VyQWN0aW9uKFFXZWJQYWdlOjpTdG9wKTsKK30KKworLyohCisgICAgQ29u
dmVuaWVuY2Ugc2xvdCB0aGF0IGxvYWRzIHRoZSBwcmV2aW91cyBkb2N1bWVudCBpbiB0aGUgbGlz
dCBvZiBkb2N1bWVudHMKKyAgICBidWlsdCBieSBuYXZpZ2F0aW5nIGxpbmtzLiBEb2VzIG5vdGhp
bmcgaWYgdGhlcmUgaXMgbm8gcHJldmlvdXMgZG9jdW1lbnQuCisKKyAgICBJdCBpcyBlcXVpdmFs
ZW50IHRvCisKKyAgICBcc25pcHBldCB3ZWJraXRzbmlwcGV0cy9xdHdlYmtpdF9xd2Vidmlld19z
bmlwcGV0LmNwcCA0CisKKyAgICBcc2EgZm9yd2FyZCgpLCBwYWdlQWN0aW9uKCkKKyovCit2b2lk
IFFXZWJWaWV3OjpiYWNrKCkKK3sKKyAgICBpZiAoZC0+cGFnZSkKKyAgICAgICAgZC0+cGFnZS0+
dHJpZ2dlckFjdGlvbihRV2ViUGFnZTo6QmFjayk7Cit9CisKKy8qIQorICAgIENvbnZlbmllbmNl
IHNsb3QgdGhhdCBsb2FkcyB0aGUgbmV4dCBkb2N1bWVudCBpbiB0aGUgbGlzdCBvZiBkb2N1bWVu
dHMKKyAgICBidWlsdCBieSBuYXZpZ2F0aW5nIGxpbmtzLiBEb2VzIG5vdGhpbmcgaWYgdGhlcmUg
aXMgbm8gbmV4dCBkb2N1bWVudC4KKworICAgIEl0IGlzIGVxdWl2YWxlbnQgdG8KKworICAgIFxz
bmlwcGV0IHdlYmtpdHNuaXBwZXRzL3F0d2Via2l0X3F3ZWJ2aWV3X3NuaXBwZXQuY3BwIDUKKwor
ICAgIFxzYSBiYWNrKCksIHBhZ2VBY3Rpb24oKQorKi8KK3ZvaWQgUVdlYlZpZXc6OmZvcndhcmQo
KQoreworICAgIGlmIChkLT5wYWdlKQorICAgICAgICBkLT5wYWdlLT50cmlnZ2VyQWN0aW9uKFFX
ZWJQYWdlOjpGb3J3YXJkKTsKK30KKworLyohCisgICAgUmVsb2FkcyB0aGUgY3VycmVudCBkb2N1
bWVudC4KKworICAgIFxzYSBzdG9wKCksIHBhZ2VBY3Rpb24oKSwgbG9hZFN0YXJ0ZWQoKQorKi8K
K3ZvaWQgUVdlYlZpZXc6OnJlbG9hZCgpCit7CisgICAgaWYgKGQtPnBhZ2UpCisgICAgICAgIGQt
PnBhZ2UtPnRyaWdnZXJBY3Rpb24oUVdlYlBhZ2U6OlJlbG9hZCk7Cit9CisKKy8qISBccmVpbXAK
KyovCit2b2lkIFFXZWJWaWV3OjpyZXNpemVFdmVudChRUmVzaXplRXZlbnQgKmUpCit7CisgICAg
aWYgKGQtPnBhZ2UpCisgICAgICAgIGQtPnBhZ2UtPnNldFZpZXdwb3J0U2l6ZShlLT5zaXplKCkp
OworfQorCisvKiEgXHJlaW1wCisqLwordm9pZCBRV2ViVmlldzo6cGFpbnRFdmVudChRUGFpbnRF
dmVudCAqZXYpCit7CisgICAgaWYgKCFkLT5wYWdlKQorICAgICAgICByZXR1cm47CisjaWZkZWYg
UVdFQktJVF9USU1FX1JFTkRFUklORworICAgIFFUaW1lIHRpbWU7CisgICAgdGltZS5zdGFydCgp
OworI2VuZGlmCisKKyAgICBRV2ViRnJhbWUgKmZyYW1lID0gZC0+cGFnZS0+bWFpbkZyYW1lKCk7
CisgICAgUVBhaW50ZXIgcCh0aGlzKTsKKyAgICBwLnNldFJlbmRlckhpbnRzKGQtPnJlbmRlckhp
bnRzKTsKKworICAgIGZyYW1lLT5yZW5kZXIoJnAsIGV2LT5yZWdpb24oKSk7CisKKyNpZmRlZiAg
ICBRV0VCS0lUX1RJTUVfUkVOREVSSU5HCisgICAgaW50IGVsYXBzZWQgPSB0aW1lLmVsYXBzZWQo
KTsKKyAgICBxRGVidWcoKSA8PCAicGFpbnQgZXZlbnQgb24gIiA8PCBldi0+cmVnaW9uKCkgPDwg
IiwgdG9vayB0byByZW5kZXIgPSAgIiA8PCBlbGFwc2VkOworI2VuZGlmCit9CisKKy8qIQorICAg
IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdGhlIGNyZWF0ZVdpbmRvdygpIG1ldGhvZCBv
ZiB0aGUgYXNzb2NpYXRlZCBRV2ViUGFnZSwKKyAgICBlYWNoIHRpbWUgdGhlIHBhZ2Ugd2FudHMg
dG8gY3JlYXRlIGEgbmV3IHdpbmRvdyBvZiB0aGUgZ2l2ZW4gXGEgdHlwZS4gVGhpcyBtaWdodAor
ICAgIGJlIHRoZSByZXN1bHQsIGZvciBleGFtcGxlLCBvZiBhIEphdmFTY3JpcHQgcmVxdWVzdCB0
byBvcGVuIGEgZG9jdW1lbnQgaW4gYSBuZXcgd2luZG93LgorCisgICAgXG5vdGUgSWYgdGhlIGNy
ZWF0ZVdpbmRvdygpIG1ldGhvZCBvZiB0aGUgYXNzb2NpYXRlZCBwYWdlIGlzIHJlaW1wbGVtZW50
ZWQsIHRoaXMKKyAgICBtZXRob2QgaXMgbm90IGNhbGxlZCwgdW5sZXNzIGV4cGxpY2l0bHkgZG9u
ZSBzbyBpbiB0aGUgcmVpbXBsZW1lbnRhdGlvbi4KKworICAgIFxub3RlIEluIHRoZSBjYXNlcyB3
aGVuIHRoZSB3aW5kb3cgY3JlYXRpb24gaXMgYmVpbmcgdHJpZ2dlcmVkIGJ5IEphdmFTY3JpcHQs
IGFwYXJ0IGZyb20KKyAgICByZWltcGxlbWVudGluZyB0aGlzIG1ldGhvZCBhcHBsaWNhdGlvbiBt
dXN0IGFsc28gc2V0IHRoZSBKYXZhU2NyaXB0Q2FuT3BlbldpbmRvd3MgYXR0cmlidXRlCisgICAg
b2YgUVdlYlNldHRpbmdzIHRvIHRydWUgaW4gb3JkZXIgZm9yIGl0IHRvIGdldCBjYWxsZWQuCisK
KyAgICBcc2EgUVdlYlBhZ2U6OmNyZWF0ZVdpbmRvdygpLCBRV2ViUGFnZTo6YWNjZXB0TmF2aWdh
dGlvblJlcXVlc3QoKQorKi8KK1FXZWJWaWV3ICpRV2ViVmlldzo6Y3JlYXRlV2luZG93KFFXZWJQ
YWdlOjpXZWJXaW5kb3dUeXBlIHR5cGUpCit7CisgICAgUV9VTlVTRUQodHlwZSkKKyAgICByZXR1
cm4gMDsKK30KKworLyohIFxyZWltcAorKi8KK3ZvaWQgUVdlYlZpZXc6Om1vdXNlTW92ZUV2ZW50
KFFNb3VzZUV2ZW50KiBldikKK3sKKyAgICBpZiAoZC0+cGFnZSkgeworICAgICAgICBjb25zdCBi
b29sIGFjY2VwdGVkID0gZXYtPmlzQWNjZXB0ZWQoKTsKKyAgICAgICAgZC0+cGFnZS0+ZXZlbnQo
ZXYpOworICAgICAgICBldi0+c2V0QWNjZXB0ZWQoYWNjZXB0ZWQpOworICAgIH0KK30KKworLyoh
IFxyZWltcAorKi8KK3ZvaWQgUVdlYlZpZXc6Om1vdXNlUHJlc3NFdmVudChRTW91c2VFdmVudCog
ZXYpCit7CisgICAgaWYgKGQtPnBhZ2UpIHsKKyAgICAgICAgY29uc3QgYm9vbCBhY2NlcHRlZCA9
IGV2LT5pc0FjY2VwdGVkKCk7CisgICAgICAgIGQtPnBhZ2UtPmV2ZW50KGV2KTsKKyAgICAgICAg
ZXYtPnNldEFjY2VwdGVkKGFjY2VwdGVkKTsKKyAgICB9Cit9CisKKy8qISBccmVpbXAKKyovCit2
b2lkIFFXZWJWaWV3Ojptb3VzZURvdWJsZUNsaWNrRXZlbnQoUU1vdXNlRXZlbnQqIGV2KQorewor
ICAgIGlmIChkLT5wYWdlKSB7CisgICAgICAgIGNvbnN0IGJvb2wgYWNjZXB0ZWQgPSBldi0+aXNB
Y2NlcHRlZCgpOworICAgICAgICBkLT5wYWdlLT5ldmVudChldik7CisgICAgICAgIGV2LT5zZXRB
Y2NlcHRlZChhY2NlcHRlZCk7CisgICAgfQorfQorCisvKiEgXHJlaW1wCisqLwordm9pZCBRV2Vi
Vmlldzo6bW91c2VSZWxlYXNlRXZlbnQoUU1vdXNlRXZlbnQqIGV2KQoreworICAgIGlmIChkLT5w
YWdlKSB7CisgICAgICAgIGNvbnN0IGJvb2wgYWNjZXB0ZWQgPSBldi0+aXNBY2NlcHRlZCgpOwor
ICAgICAgICBkLT5wYWdlLT5ldmVudChldik7CisgICAgICAgIGV2LT5zZXRBY2NlcHRlZChhY2Nl
cHRlZCk7CisgICAgfQorfQorCisjaWZuZGVmIFFUX05PX0NPTlRFWFRNRU5VCisvKiEgXHJlaW1w
CisqLwordm9pZCBRV2ViVmlldzo6Y29udGV4dE1lbnVFdmVudChRQ29udGV4dE1lbnVFdmVudCog
ZXYpCit7CisgICAgaWYgKGQtPnBhZ2UpIHsKKyAgICAgICAgY29uc3QgYm9vbCBhY2NlcHRlZCA9
IGV2LT5pc0FjY2VwdGVkKCk7CisgICAgICAgIGQtPnBhZ2UtPmV2ZW50KGV2KTsKKyAgICAgICAg
ZXYtPnNldEFjY2VwdGVkKGFjY2VwdGVkKTsKKyAgICB9Cit9CisjZW5kaWYgLy8gUVRfTk9fQ09O
VEVYVE1FTlUKKworI2lmbmRlZiBRVF9OT19XSEVFTEVWRU5UCisvKiEgXHJlaW1wCisqLwordm9p
ZCBRV2ViVmlldzo6d2hlZWxFdmVudChRV2hlZWxFdmVudCogZXYpCit7CisgICAgaWYgKGQtPnBh
Z2UpIHsKKyAgICAgICAgY29uc3QgYm9vbCBhY2NlcHRlZCA9IGV2LT5pc0FjY2VwdGVkKCk7Cisg
ICAgICAgIGQtPnBhZ2UtPmV2ZW50KGV2KTsKKyAgICAgICAgZXYtPnNldEFjY2VwdGVkKGFjY2Vw
dGVkKTsKKyAgICB9Cit9CisjZW5kaWYgLy8gUVRfTk9fV0hFRUxFVkVOVAorCisvKiEgXHJlaW1w
CisqLwordm9pZCBRV2ViVmlldzo6a2V5UHJlc3NFdmVudChRS2V5RXZlbnQqIGV2KQoreworICAg
IGlmIChkLT5wYWdlKQorICAgICAgICBkLT5wYWdlLT5ldmVudChldik7CisgICAgaWYgKCFldi0+
aXNBY2NlcHRlZCgpKQorICAgICAgICBRV2lkZ2V0OjprZXlQcmVzc0V2ZW50KGV2KTsKK30KKwor
LyohIFxyZWltcAorKi8KK3ZvaWQgUVdlYlZpZXc6OmtleVJlbGVhc2VFdmVudChRS2V5RXZlbnQq
IGV2KQoreworICAgIGlmIChkLT5wYWdlKQorICAgICAgICBkLT5wYWdlLT5ldmVudChldik7Cisg
ICAgaWYgKCFldi0+aXNBY2NlcHRlZCgpKQorICAgICAgICBRV2lkZ2V0OjprZXlSZWxlYXNlRXZl
bnQoZXYpOworfQorCisvKiEgXHJlaW1wCisqLwordm9pZCBRV2ViVmlldzo6Zm9jdXNJbkV2ZW50
KFFGb2N1c0V2ZW50KiBldikKK3sKKyAgICBpZiAoZC0+cGFnZSkKKyAgICAgICAgZC0+cGFnZS0+
ZXZlbnQoZXYpOworICAgIGVsc2UKKyAgICAgICAgUVdpZGdldDo6Zm9jdXNJbkV2ZW50KGV2KTsK
K30KKworLyohIFxyZWltcAorKi8KK3ZvaWQgUVdlYlZpZXc6OmZvY3VzT3V0RXZlbnQoUUZvY3Vz
RXZlbnQqIGV2KQoreworICAgIGlmIChkLT5wYWdlKQorICAgICAgICBkLT5wYWdlLT5ldmVudChl
dik7CisgICAgZWxzZQorICAgICAgICBRV2lkZ2V0Ojpmb2N1c091dEV2ZW50KGV2KTsKK30KKwor
LyohIFxyZWltcAorKi8KK3ZvaWQgUVdlYlZpZXc6OmRyYWdFbnRlckV2ZW50KFFEcmFnRW50ZXJF
dmVudCogZXYpCit7CisjaWZuZGVmIFFUX05PX0RSQUdBTkREUk9QCisgICAgaWYgKGQtPnBhZ2Up
CisgICAgICAgIGQtPnBhZ2UtPmV2ZW50KGV2KTsKKyNlbmRpZgorfQorCisvKiEgXHJlaW1wCisq
Lwordm9pZCBRV2ViVmlldzo6ZHJhZ0xlYXZlRXZlbnQoUURyYWdMZWF2ZUV2ZW50KiBldikKK3sK
KyNpZm5kZWYgUVRfTk9fRFJBR0FORERST1AKKyAgICBpZiAoZC0+cGFnZSkKKyAgICAgICAgZC0+
cGFnZS0+ZXZlbnQoZXYpOworI2VuZGlmCit9CisKKy8qISBccmVpbXAKKyovCit2b2lkIFFXZWJW
aWV3OjpkcmFnTW92ZUV2ZW50KFFEcmFnTW92ZUV2ZW50KiBldikKK3sKKyNpZm5kZWYgUVRfTk9f
RFJBR0FORERST1AKKyAgICBpZiAoZC0+cGFnZSkKKyAgICAgICAgZC0+cGFnZS0+ZXZlbnQoZXYp
OworI2VuZGlmCit9CisKKy8qISBccmVpbXAKKyovCit2b2lkIFFXZWJWaWV3Ojpkcm9wRXZlbnQo
UURyb3BFdmVudCogZXYpCit7CisjaWZuZGVmIFFUX05PX0RSQUdBTkREUk9QCisgICAgaWYgKGQt
PnBhZ2UpCisgICAgICAgIGQtPnBhZ2UtPmV2ZW50KGV2KTsKKyNlbmRpZgorfQorCisvKiEgXHJl
aW1wCisqLworYm9vbCBRV2ViVmlldzo6Zm9jdXNOZXh0UHJldkNoaWxkKGJvb2wgbmV4dCkKK3sK
KyAgICBpZiAoZC0+cGFnZSAmJiBkLT5wYWdlLT5mb2N1c05leHRQcmV2Q2hpbGQobmV4dCkpCisg
ICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBRV2lkZ2V0Ojpmb2N1c05leHRQcmV2Q2hp
bGQobmV4dCk7Cit9CisKKy8qIVxyZWltcAorKi8KK1FWYXJpYW50IFFXZWJWaWV3OjppbnB1dE1l
dGhvZFF1ZXJ5KFF0OjpJbnB1dE1ldGhvZFF1ZXJ5IHByb3BlcnR5KSBjb25zdAoreworICAgIGlm
IChkLT5wYWdlKQorICAgICAgICByZXR1cm4gZC0+cGFnZS0+aW5wdXRNZXRob2RRdWVyeShwcm9w
ZXJ0eSk7CisgICAgcmV0dXJuIFFWYXJpYW50KCk7Cit9CisKKy8qIVxyZWltcAorKi8KK3ZvaWQg
UVdlYlZpZXc6OmlucHV0TWV0aG9kRXZlbnQoUUlucHV0TWV0aG9kRXZlbnQgKmUpCit7CisgICAg
aWYgKGQtPnBhZ2UpCisgICAgICAgIGQtPnBhZ2UtPmV2ZW50KGUpOworfQorCisvKiFccmVpbXAK
KyovCit2b2lkIFFXZWJWaWV3OjpjaGFuZ2VFdmVudChRRXZlbnQgKmUpCit7CisgICAgaWYgKGQt
PnBhZ2UgJiYgZS0+dHlwZSgpID09IFFFdmVudDo6UGFsZXR0ZUNoYW5nZSkKKyAgICAgICAgZC0+
cGFnZS0+c2V0UGFsZXR0ZShwYWxldHRlKCkpOworICAgIFFXaWRnZXQ6OmNoYW5nZUV2ZW50KGUp
OworfQorCisvKiEKKyAgICBcZm4gdm9pZCBRV2ViVmlldzo6dGl0bGVDaGFuZ2VkKGNvbnN0IFFT
dHJpbmcgJnRpdGxlKQorCisgICAgVGhpcyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuZXZlciB0aGUg
XGEgdGl0bGUgb2YgdGhlIG1haW4gZnJhbWUgY2hhbmdlcy4KKworICAgIFxzYSB0aXRsZSgpCisq
LworCisvKiEKKyAgICBcZm4gdm9pZCBRV2ViVmlldzo6dXJsQ2hhbmdlZChjb25zdCBRVXJsICZ1
cmwpCisKKyAgICBUaGlzIHNpZ25hbCBpcyBlbWl0dGVkIHdoZW4gdGhlIFxhIHVybCBvZiB0aGUg
dmlldyBjaGFuZ2VzLgorCisgICAgXHNhIHVybCgpLCBsb2FkKCkKKyovCisKKy8qIQorICAgIFxm
biB2b2lkIFFXZWJWaWV3OjpzdGF0dXNCYXJNZXNzYWdlKGNvbnN0IFFTdHJpbmcmIHRleHQpCisK
KyAgICBUaGlzIHNpZ25hbCBpcyBlbWl0dGVkIHdoZW4gdGhlIHN0YXR1cyBiYXIgXGEgdGV4dCBp
cyBjaGFuZ2VkIGJ5IHRoZSBwYWdlLgorKi8KKworLyohCisgICAgXGZuIHZvaWQgUVdlYlZpZXc6
Omljb25DaGFuZ2VkKCkKKworICAgIFRoaXMgc2lnbmFsIGlzIGVtaXR0ZWQgd2hlbmV2ZXIgdGhl
IGljb24gb2YgdGhlIHBhZ2UgaXMgbG9hZGVkIG9yIGNoYW5nZXMuCisKKyAgICBJbiBvcmRlciBm
b3IgaWNvbnMgdG8gYmUgbG9hZGVkLCB5b3Ugd2lsbCBuZWVkIHRvIHNldCBhbiBpY29uIGRhdGFi
YXNlIHBhdGgKKyAgICB1c2luZyBRV2ViU2V0dGluZ3M6OnNldEljb25EYXRhYmFzZVBhdGgoKS4K
KworICAgIFxzYSBpY29uKCksIFFXZWJTZXR0aW5nczo6c2V0SWNvbkRhdGFiYXNlUGF0aCgpCisq
LworCisvKiEKKyAgICBcZm4gdm9pZCBRV2ViVmlldzo6bG9hZFN0YXJ0ZWQoKQorCisgICAgVGhp
cyBzaWduYWwgaXMgZW1pdHRlZCB3aGVuIGEgbmV3IGxvYWQgb2YgdGhlIHBhZ2UgaXMgc3RhcnRl
ZC4KKworICAgIFxzYSBsb2FkUHJvZ3Jlc3MoKSwgbG9hZEZpbmlzaGVkKCkKKyovCisKKy8qIQor
ICAgIFxmbiB2b2lkIFFXZWJWaWV3Ojpsb2FkRmluaXNoZWQoYm9vbCBvaykKKworICAgIFRoaXMg
c2lnbmFsIGlzIGVtaXR0ZWQgd2hlbiBhIGxvYWQgb2YgdGhlIHBhZ2UgaXMgZmluaXNoZWQuCisg
ICAgXGEgb2sgd2lsbCBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBsb2FkIHdhcyBzdWNjZXNzZnVsIG9y
IGFueSBlcnJvciBvY2N1cnJlZC4KKworICAgIFxzYSBsb2FkU3RhcnRlZCgpCisqLworCisvKiEK
KyAgICBcZm4gdm9pZCBRV2ViVmlldzo6c2VsZWN0aW9uQ2hhbmdlZCgpCisKKyAgICBUaGlzIHNp
Z25hbCBpcyBlbWl0dGVkIHdoZW5ldmVyIHRoZSBzZWxlY3Rpb24gY2hhbmdlcy4KKworICAgIFxz
YSBzZWxlY3RlZFRleHQoKQorKi8KKworLyohCisgICAgXGZuIHZvaWQgUVdlYlZpZXc6OmxvYWRQ
cm9ncmVzcyhpbnQgcHJvZ3Jlc3MpCisKKyAgICBUaGlzIHNpZ25hbCBpcyBlbWl0dGVkIGV2ZXJ5
IHRpbWUgYW4gZWxlbWVudCBpbiB0aGUgd2ViIHBhZ2UKKyAgICBjb21wbGV0ZXMgbG9hZGluZyBh
bmQgdGhlIG92ZXJhbGwgbG9hZGluZyBwcm9ncmVzcyBhZHZhbmNlcy4KKworICAgIFRoaXMgc2ln
bmFsIHRyYWNrcyB0aGUgcHJvZ3Jlc3Mgb2YgYWxsIGNoaWxkIGZyYW1lcy4KKworICAgIFRoZSBj
dXJyZW50IHZhbHVlIGlzIHByb3ZpZGVkIGJ5IFxhIHByb2dyZXNzIGFuZCBzY2FsZXMgZnJvbSAw
IHRvIDEwMCwKKyAgICB3aGljaCBpcyB0aGUgZGVmYXVsdCByYW5nZSBvZiBRUHJvZ3Jlc3NCYXIu
CisKKyAgICBcc2EgbG9hZFN0YXJ0ZWQoKSwgbG9hZEZpbmlzaGVkKCkKKyovCisKKy8qIQorICAg
IFxmbiB2b2lkIFFXZWJWaWV3OjpsaW5rQ2xpY2tlZChjb25zdCBRVXJsICZ1cmwpCisKKyAgICBU
aGlzIHNpZ25hbCBpcyBlbWl0dGVkIHdoZW5ldmVyIHRoZSB1c2VyIGNsaWNrcyBvbiBhIGxpbmsg
YW5kIHRoZSBwYWdlJ3MgbGlua0RlbGVnYXRpb25Qb2xpY3kKKyAgICBwcm9wZXJ0eSBpcyBzZXQg
dG8gZGVsZWdhdGUgdGhlIGxpbmsgaGFuZGxpbmcgZm9yIHRoZSBzcGVjaWZpZWQgXGEgdXJsLgor
CisgICAgXHNhIFFXZWJQYWdlOjpsaW5rRGVsZWdhdGlvblBvbGljeSgpCisqLworCisjaW5jbHVk
ZSAibW9jX3F3ZWJ2aWV3LmNwcCIKKwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9XaWRn
ZXRBcGkvcXdlYnZpZXcuaCBiL1NvdXJjZS9XZWJLaXQvcXQvV2lkZ2V0QXBpL3F3ZWJ2aWV3LmgK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMC4uNzAxZmIzNmMyNDYzMThmOGI2OTRlMDhmM2Y4N2Y5NWMxYjgyYmZhNQotLS0g
L2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvcXQvV2lkZ2V0QXBpL3F3ZWJ2aWV3LmgKQEAg
LTAsMCArMSwxNjUgQEAKKy8qCisgICAgQ29weXJpZ2h0IChDKSAyMDA4IE5va2lhIENvcnBvcmF0
aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQorICAgIENvcHlyaWdodCAoQykgMjAwNyBT
dGFpa29zIENvbXB1dGluZyBTZXJ2aWNlcyBJbmMuCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJl
ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0
IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBM
aWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRo
ZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55
IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhl
IGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFO
VFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJ
TElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisg
ICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAg
ICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5l
cmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUg
ZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAgICB0aGUgRnJlZSBTb2Z0d2Fy
ZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICAg
IEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorKi8KKworI2lmbmRlZiBRV0VCVklFV19ICisj
ZGVmaW5lIFFXRUJWSUVXX0gKKworI2luY2x1ZGUgPFF0V2ViS2l0L3F3ZWJraXRnbG9iYWwuaD4K
KyNpbmNsdWRlIDxRdFdlYktpdFdpZGdldHMvcXdlYnBhZ2UuaD4KKyNpbmNsdWRlIDxRdENvcmUv
cXVybC5oPgorI2luY2x1ZGUgPFF0R3VpL3FpY29uLmg+CisjaW5jbHVkZSA8UXRHdWkvcXBhaW50
ZXIuaD4KKyNpbmNsdWRlIDxRdE5ldHdvcmsvcW5ldHdvcmthY2Nlc3NtYW5hZ2VyLmg+CisjaW5j
bHVkZSA8UXRXaWRnZXRzL3F3aWRnZXQuaD4KKworUVRfQkVHSU5fTkFNRVNQQUNFCitjbGFzcyBR
TmV0d29ya1JlcXVlc3Q7CitjbGFzcyBRUHJpbnRlcjsKK1FUX0VORF9OQU1FU1BBQ0UKKworY2xh
c3MgUVdlYlBhZ2U7CitjbGFzcyBRV2ViVmlld1ByaXZhdGU7CitjbGFzcyBRV2ViTmV0d29ya1Jl
cXVlc3Q7CisKK2NsYXNzIFFXRUJLSVRfRVhQT1JUIFFXZWJWaWV3IDogcHVibGljIFFXaWRnZXQg
eworICAgIFFfT0JKRUNUCisgICAgUV9QUk9QRVJUWShRU3RyaW5nIHRpdGxlIFJFQUQgdGl0bGUp
CisgICAgUV9QUk9QRVJUWShRVXJsIHVybCBSRUFEIHVybCBXUklURSBzZXRVcmwpCisgICAgUV9Q
Uk9QRVJUWShRSWNvbiBpY29uIFJFQUQgaWNvbikKKyAgICBRX1BST1BFUlRZKFFTdHJpbmcgc2Vs
ZWN0ZWRUZXh0IFJFQUQgc2VsZWN0ZWRUZXh0KQorICAgIFFfUFJPUEVSVFkoUVN0cmluZyBzZWxl
Y3RlZEh0bWwgUkVBRCBzZWxlY3RlZEh0bWwpCisgICAgUV9QUk9QRVJUWShib29sIGhhc1NlbGVj
dGlvbiBSRUFEIGhhc1NlbGVjdGlvbikKKyAgICBRX1BST1BFUlRZKGJvb2wgbW9kaWZpZWQgUkVB
RCBpc01vZGlmaWVkKQorICAgIC8vUV9QUk9QRVJUWShRdDo6VGV4dEludGVyYWN0aW9uRmxhZ3Mg
dGV4dEludGVyYWN0aW9uRmxhZ3MgUkVBRCB0ZXh0SW50ZXJhY3Rpb25GbGFncyBXUklURSBzZXRU
ZXh0SW50ZXJhY3Rpb25GbGFncykKKyAgICBRX1BST1BFUlRZKHFyZWFsIHRleHRTaXplTXVsdGlw
bGllciBSRUFEIHRleHRTaXplTXVsdGlwbGllciBXUklURSBzZXRUZXh0U2l6ZU11bHRpcGxpZXIg
REVTSUdOQUJMRSBmYWxzZSkKKyAgICBRX1BST1BFUlRZKHFyZWFsIHpvb21GYWN0b3IgUkVBRCB6
b29tRmFjdG9yIFdSSVRFIHNldFpvb21GYWN0b3IpCisKKyAgICBRX1BST1BFUlRZKFFQYWludGVy
OjpSZW5kZXJIaW50cyByZW5kZXJIaW50cyBSRUFEIHJlbmRlckhpbnRzIFdSSVRFIHNldFJlbmRl
ckhpbnRzKQorICAgIFFfRkxBR1MoUVBhaW50ZXI6OlJlbmRlckhpbnRzKQorcHVibGljOgorICAg
IGV4cGxpY2l0IFFXZWJWaWV3KFFXaWRnZXQqIHBhcmVudCA9IDApOworICAgIHZpcnR1YWwgflFX
ZWJWaWV3KCk7CisKKyAgICBRV2ViUGFnZSogcGFnZSgpIGNvbnN0OworICAgIHZvaWQgc2V0UGFn
ZShRV2ViUGFnZSogcGFnZSk7CisKKyAgICB2b2lkIGxvYWQoY29uc3QgUVVybCYgdXJsKTsKKyAg
ICB2b2lkIGxvYWQoY29uc3QgUU5ldHdvcmtSZXF1ZXN0JiByZXF1ZXN0LCBRTmV0d29ya0FjY2Vz
c01hbmFnZXI6Ok9wZXJhdGlvbiBvcGVyYXRpb24gPSBRTmV0d29ya0FjY2Vzc01hbmFnZXI6Okdl
dE9wZXJhdGlvbiwgY29uc3QgUUJ5dGVBcnJheSAmYm9keSA9IFFCeXRlQXJyYXkoKSk7CisgICAg
dm9pZCBzZXRIdG1sKGNvbnN0IFFTdHJpbmcmIGh0bWwsIGNvbnN0IFFVcmwmIGJhc2VVcmwgPSBR
VXJsKCkpOworICAgIHZvaWQgc2V0Q29udGVudChjb25zdCBRQnl0ZUFycmF5JiBkYXRhLCBjb25z
dCBRU3RyaW5nJiBtaW1lVHlwZSA9IFFTdHJpbmcoKSwgY29uc3QgUVVybCYgYmFzZVVybCA9IFFV
cmwoKSk7CisKKyAgICBRV2ViSGlzdG9yeSogaGlzdG9yeSgpIGNvbnN0OworICAgIFFXZWJTZXR0
aW5ncyogc2V0dGluZ3MoKSBjb25zdDsKKworICAgIFFTdHJpbmcgdGl0bGUoKSBjb25zdDsKKyAg
ICB2b2lkIHNldFVybChjb25zdCBRVXJsICZ1cmwpOworICAgIFFVcmwgdXJsKCkgY29uc3Q7Cisg
ICAgUUljb24gaWNvbigpIGNvbnN0OworCisgICAgYm9vbCBoYXNTZWxlY3Rpb24oKSBjb25zdDsK
KyAgICBRU3RyaW5nIHNlbGVjdGVkVGV4dCgpIGNvbnN0OworICAgIFFTdHJpbmcgc2VsZWN0ZWRI
dG1sKCkgY29uc3Q7CisKKyNpZm5kZWYgUVRfTk9fQUNUSU9OCisgICAgUUFjdGlvbiogcGFnZUFj
dGlvbihRV2ViUGFnZTo6V2ViQWN0aW9uIGFjdGlvbikgY29uc3Q7CisjZW5kaWYKKyAgICB2b2lk
IHRyaWdnZXJQYWdlQWN0aW9uKFFXZWJQYWdlOjpXZWJBY3Rpb24gYWN0aW9uLCBib29sIGNoZWNr
ZWQgPSBmYWxzZSk7CisKKyAgICBib29sIGlzTW9kaWZpZWQoKSBjb25zdDsKKworICAgIC8qCisg
ICAgUXQ6OlRleHRJbnRlcmFjdGlvbkZsYWdzIHRleHRJbnRlcmFjdGlvbkZsYWdzKCkgY29uc3Q7
CisgICAgdm9pZCBzZXRUZXh0SW50ZXJhY3Rpb25GbGFncyhRdDo6VGV4dEludGVyYWN0aW9uRmxh
Z3MgZmxhZ3MpOworICAgIHZvaWQgc2V0VGV4dEludGVyYWN0aW9uRmxhZyhRdDo6VGV4dEludGVy
YWN0aW9uRmxhZyBmbGFnKTsKKyAgICAqLworCisgICAgUVZhcmlhbnQgaW5wdXRNZXRob2RRdWVy
eShRdDo6SW5wdXRNZXRob2RRdWVyeSBwcm9wZXJ0eSkgY29uc3Q7CisKKyAgICBRU2l6ZSBzaXpl
SGludCgpIGNvbnN0OworCisgICAgcXJlYWwgem9vbUZhY3RvcigpIGNvbnN0OworICAgIHZvaWQg
c2V0Wm9vbUZhY3RvcihxcmVhbCBmYWN0b3IpOworCisgICAgdm9pZCBzZXRUZXh0U2l6ZU11bHRp
cGxpZXIocXJlYWwgZmFjdG9yKTsKKyAgICBxcmVhbCB0ZXh0U2l6ZU11bHRpcGxpZXIoKSBjb25z
dDsKKworICAgIFFQYWludGVyOjpSZW5kZXJIaW50cyByZW5kZXJIaW50cygpIGNvbnN0OworICAg
IHZvaWQgc2V0UmVuZGVySGludHMoUVBhaW50ZXI6OlJlbmRlckhpbnRzIGhpbnRzKTsKKyAgICB2
b2lkIHNldFJlbmRlckhpbnQoUVBhaW50ZXI6OlJlbmRlckhpbnQgaGludCwgYm9vbCBlbmFibGVk
ID0gdHJ1ZSk7CisKKyAgICBib29sIGZpbmRUZXh0KGNvbnN0IFFTdHJpbmcmIHN1YlN0cmluZywg
UVdlYlBhZ2U6OkZpbmRGbGFncyBvcHRpb25zID0gMCk7CisKKyAgICB2aXJ0dWFsIGJvb2wgZXZl
bnQoUUV2ZW50Kik7CisKK3B1YmxpYyBRX1NMT1RTOgorICAgIHZvaWQgc3RvcCgpOworICAgIHZv
aWQgYmFjaygpOworICAgIHZvaWQgZm9yd2FyZCgpOworICAgIHZvaWQgcmVsb2FkKCk7CisKKyAg
ICB2b2lkIHByaW50KFFQcmludGVyKikgY29uc3Q7CisKK1FfU0lHTkFMUzoKKyAgICB2b2lkIGxv
YWRTdGFydGVkKCk7CisgICAgdm9pZCBsb2FkUHJvZ3Jlc3MoaW50IHByb2dyZXNzKTsKKyAgICB2
b2lkIGxvYWRGaW5pc2hlZChib29sKTsKKyAgICB2b2lkIHRpdGxlQ2hhbmdlZChjb25zdCBRU3Ry
aW5nJiB0aXRsZSk7CisgICAgdm9pZCBzdGF0dXNCYXJNZXNzYWdlKGNvbnN0IFFTdHJpbmcmIHRl
eHQpOworICAgIHZvaWQgbGlua0NsaWNrZWQoY29uc3QgUVVybCYpOworICAgIHZvaWQgc2VsZWN0
aW9uQ2hhbmdlZCgpOworICAgIHZvaWQgaWNvbkNoYW5nZWQoKTsKKyAgICB2b2lkIHVybENoYW5n
ZWQoY29uc3QgUVVybCYpOworCitwcm90ZWN0ZWQ6CisgICAgdm9pZCByZXNpemVFdmVudChRUmVz
aXplRXZlbnQqKTsKKyAgICB2b2lkIHBhaW50RXZlbnQoUVBhaW50RXZlbnQqKTsKKworICAgIHZp
cnR1YWwgUVdlYlZpZXcgKmNyZWF0ZVdpbmRvdyhRV2ViUGFnZTo6V2ViV2luZG93VHlwZSB0eXBl
KTsKKworICAgIHZpcnR1YWwgdm9pZCBjaGFuZ2VFdmVudChRRXZlbnQqKTsKKyAgICB2aXJ0dWFs
IHZvaWQgbW91c2VNb3ZlRXZlbnQoUU1vdXNlRXZlbnQqKTsKKyAgICB2aXJ0dWFsIHZvaWQgbW91
c2VQcmVzc0V2ZW50KFFNb3VzZUV2ZW50Kik7CisgICAgdmlydHVhbCB2b2lkIG1vdXNlRG91Ymxl
Q2xpY2tFdmVudChRTW91c2VFdmVudCopOworICAgIHZpcnR1YWwgdm9pZCBtb3VzZVJlbGVhc2VF
dmVudChRTW91c2VFdmVudCopOworI2lmbmRlZiBRVF9OT19DT05URVhUTUVOVQorICAgIHZpcnR1
YWwgdm9pZCBjb250ZXh0TWVudUV2ZW50KFFDb250ZXh0TWVudUV2ZW50Kik7CisjZW5kaWYKKyNp
Zm5kZWYgUVRfTk9fV0hFRUxFVkVOVAorICAgIHZpcnR1YWwgdm9pZCB3aGVlbEV2ZW50KFFXaGVl
bEV2ZW50Kik7CisjZW5kaWYKKyAgICB2aXJ0dWFsIHZvaWQga2V5UHJlc3NFdmVudChRS2V5RXZl
bnQqKTsKKyAgICB2aXJ0dWFsIHZvaWQga2V5UmVsZWFzZUV2ZW50KFFLZXlFdmVudCopOworICAg
IHZpcnR1YWwgdm9pZCBkcmFnRW50ZXJFdmVudChRRHJhZ0VudGVyRXZlbnQqKTsKKyAgICB2aXJ0
dWFsIHZvaWQgZHJhZ0xlYXZlRXZlbnQoUURyYWdMZWF2ZUV2ZW50Kik7CisgICAgdmlydHVhbCB2
b2lkIGRyYWdNb3ZlRXZlbnQoUURyYWdNb3ZlRXZlbnQqKTsKKyAgICB2aXJ0dWFsIHZvaWQgZHJv
cEV2ZW50KFFEcm9wRXZlbnQqKTsKKyAgICB2aXJ0dWFsIHZvaWQgZm9jdXNJbkV2ZW50KFFGb2N1
c0V2ZW50Kik7CisgICAgdmlydHVhbCB2b2lkIGZvY3VzT3V0RXZlbnQoUUZvY3VzRXZlbnQqKTsK
KyAgICB2aXJ0dWFsIHZvaWQgaW5wdXRNZXRob2RFdmVudChRSW5wdXRNZXRob2RFdmVudCopOwor
CisgICAgdmlydHVhbCBib29sIGZvY3VzTmV4dFByZXZDaGlsZChib29sIG5leHQpOworCitwcml2
YXRlOgorICAgIGZyaWVuZCBjbGFzcyBRV2ViUGFnZTsKKyAgICBRV2ViVmlld1ByaXZhdGUqIGQ7
CisgICAgUV9QUklWQVRFX1NMT1QoZCwgdm9pZCBfcV9wYWdlRGVzdHJveWVkKCkpCit9OworCisj
ZW5kaWYgLy8gUVdFQlZJRVdfSApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9XaWRnZXRB
cGkvcXdlYnZpZXdhY2Nlc3NpYmxlLmNwcCBiL1NvdXJjZS9XZWJLaXQvcXQvV2lkZ2V0QXBpL3F3
ZWJ2aWV3YWNjZXNzaWJsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uN2NhZTE5YTFhNDIyMTRiZGE0MjkxZTg3
YWIxMTQ2YjdiNTM3ZGEyMAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvcXQvV2lk
Z2V0QXBpL3F3ZWJ2aWV3YWNjZXNzaWJsZS5jcHAKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTIgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5
KC1pZXMpCisKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlz
dHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO
VSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUg
RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGlj
ZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICogVGhpcyBs
aWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWws
CisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3
YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5
IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRo
IHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0
bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3Ry
ZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJxd2Vidmlld2FjY2Vzc2libGVfcC5oIgor
CisjaW5jbHVkZSAicXdlYmZyYW1lLmgiCisjaW5jbHVkZSAicXdlYmZyYW1lX3AuaCIKKyNpbmNs
dWRlICJxd2VicGFnZS5oIgorI2luY2x1ZGUgInF3ZWJ2aWV3LmgiCisKK1FXZWJGcmFtZUFjY2Vz
c2libGU6OlFXZWJGcmFtZUFjY2Vzc2libGUoUVdlYkZyYW1lKiBmcmFtZSkKKyAgICA6IFFBY2Nl
c3NpYmxlT2JqZWN0KGZyYW1lKQoreworfQorCitRV2ViRnJhbWUqIFFXZWJGcmFtZUFjY2Vzc2li
bGU6OmZyYW1lKCkgY29uc3QKK3sKKyAgICByZXR1cm4gcW9iamVjdF9jYXN0PFFXZWJGcmFtZSo+
KG9iamVjdCgpKTsKK30KKworUUFjY2Vzc2libGVJbnRlcmZhY2UqIFFXZWJGcmFtZUFjY2Vzc2li
bGU6OnBhcmVudCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIFFBY2Nlc3NpYmxlOjpxdWVyeUFjY2Vz
c2libGVJbnRlcmZhY2Uob2JqZWN0KCktPnBhcmVudCgpKTsKK30KKworUVN0cmluZyBRV2ViRnJh
bWVBY2Nlc3NpYmxlOjp0ZXh0KFFBY2Nlc3NpYmxlOjpUZXh0KSBjb25zdAoreworICAgIHJldHVy
biBRU3RyaW5nKCk7Cit9CisKK2ludCBRV2ViRnJhbWVBY2Nlc3NpYmxlOjpjaGlsZENvdW50KCkg
Y29uc3QKK3sKKyAgICByZXR1cm4gMDsKK30KKworUUFjY2Vzc2libGVJbnRlcmZhY2UqIFFXZWJG
cmFtZUFjY2Vzc2libGU6OmNoaWxkKGludCBpbmRleCkgY29uc3QKK3sKKyAgICByZXR1cm4gMDsK
K30KKworaW50IFFXZWJGcmFtZUFjY2Vzc2libGU6OmluZGV4T2ZDaGlsZChjb25zdCBRQWNjZXNz
aWJsZUludGVyZmFjZSopIGNvbnN0Cit7CisgICAgcmV0dXJuIDA7Cit9CisKK1FBY2Nlc3NpYmxl
OjpTdGF0ZSBRV2ViRnJhbWVBY2Nlc3NpYmxlOjpzdGF0ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJu
IFFBY2Nlc3NpYmxlOjpTdGF0ZSgpOworfQorCitRQWNjZXNzaWJsZTo6Um9sZSBRV2ViRnJhbWVB
Y2Nlc3NpYmxlOjpyb2xlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gUUFjY2Vzc2libGU6OkNsaWVu
dDsKK30KKworaW50IFFXZWJGcmFtZUFjY2Vzc2libGU6Om5hdmlnYXRlKFFBY2Nlc3NpYmxlOjpS
ZWxhdGlvbkZsYWcsIGludCwgUUFjY2Vzc2libGVJbnRlcmZhY2UqKiB0YXJnZXQpIGNvbnN0Cit7
CisgICAgKnRhcmdldCA9IDA7CisgICAgcmV0dXJuIC0xOworfQorCitRV2ViUGFnZUFjY2Vzc2li
bGU6OlFXZWJQYWdlQWNjZXNzaWJsZShRV2ViUGFnZSogcGFnZSkKKyAgICA6IFFBY2Nlc3NpYmxl
T2JqZWN0KHBhZ2UpCit7Cit9CisKK1FXZWJQYWdlKiBRV2ViUGFnZUFjY2Vzc2libGU6OnBhZ2Uo
KSBjb25zdAoreworICAgIHJldHVybiBxb2JqZWN0X2Nhc3Q8UVdlYlBhZ2UqPihvYmplY3QoKSk7
Cit9CisKK1FTdHJpbmcgUVdlYlBhZ2VBY2Nlc3NpYmxlOjp0ZXh0KFFBY2Nlc3NpYmxlOjpUZXh0
IHQpIGNvbnN0Cit7CisgICAgcmV0dXJuIFFTdHJpbmcoKTsKK30KKworUUFjY2Vzc2libGVJbnRl
cmZhY2UqIFFXZWJQYWdlQWNjZXNzaWJsZTo6cGFyZW50KCkgY29uc3QKK3sKKyAgICByZXR1cm4g
UUFjY2Vzc2libGU6OnF1ZXJ5QWNjZXNzaWJsZUludGVyZmFjZShvYmplY3QoKS0+cGFyZW50KCkp
OworfQorCitRQWNjZXNzaWJsZUludGVyZmFjZSogUVdlYlBhZ2VBY2Nlc3NpYmxlOjpjaGlsZChp
bnQgaW5kZXgpIGNvbnN0Cit7CisgICAgaWYgKCFpbmRleCAmJiBwYWdlKCktPm1haW5GcmFtZSgp
KQorICAgICAgICByZXR1cm4gbmV3IFFXZWJGcmFtZUFjY2Vzc2libGUocGFnZSgpLT5tYWluRnJh
bWUoKSk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBRV2ViUGFnZUFjY2Vzc2libGU6OmNoaWxk
Q291bnQoKSBjb25zdAoreworICAgIHJldHVybiBwYWdlKCktPm1haW5GcmFtZSgpID8gMSA6IDA7
Cit9CisKK2ludCBRV2ViUGFnZUFjY2Vzc2libGU6OmluZGV4T2ZDaGlsZChjb25zdCBRQWNjZXNz
aWJsZUludGVyZmFjZSopIGNvbnN0Cit7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBRV2ViUGFn
ZUFjY2Vzc2libGU6Om5hdmlnYXRlKFFBY2Nlc3NpYmxlOjpSZWxhdGlvbkZsYWcsIGludCwgUUFj
Y2Vzc2libGVJbnRlcmZhY2UqKiB0YXJnZXQpIGNvbnN0Cit7CisgICAgKnRhcmdldCA9IDA7Cisg
ICAgcmV0dXJuIC0xOworfQorCitRQWNjZXNzaWJsZTo6Um9sZSBRV2ViUGFnZUFjY2Vzc2libGU6
OnJvbGUoKSBjb25zdAoreworICAgIHJldHVybiBRQWNjZXNzaWJsZTo6Q2xpZW50OworfQorCitR
QWNjZXNzaWJsZTo6U3RhdGUgUVdlYlBhZ2VBY2Nlc3NpYmxlOjpzdGF0ZSgpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIFFBY2Nlc3NpYmxlOjpTdGF0ZSgpOworfQorCitRV2ViVmlld0FjY2Vzc2libGU6
OlFXZWJWaWV3QWNjZXNzaWJsZShRV2ViVmlldyogdmlldykKKyAgICA6IFFBY2Nlc3NpYmxlV2lk
Z2V0KHZpZXcsIFFBY2Nlc3NpYmxlOjpEb2N1bWVudCkKK3sKK30KKworUVdlYlZpZXcqIFFXZWJW
aWV3QWNjZXNzaWJsZTo6dmlldygpIGNvbnN0Cit7CisgICAgcmV0dXJuIHFvYmplY3RfY2FzdDxR
V2ViVmlldyo+KG9iamVjdCgpKTsKK30KKworaW50IFFXZWJWaWV3QWNjZXNzaWJsZTo6Y2hpbGRD
b3VudCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIHZpZXcoKS0+cGFnZSgpID8gMSA6IDA7Cit9CisK
K1FBY2Nlc3NpYmxlSW50ZXJmYWNlKiBRV2ViVmlld0FjY2Vzc2libGU6OmNoaWxkKGludCBpbmRl
eCkgY29uc3QKK3sKKyAgICBpZiAoIWluZGV4ICYmIHZpZXcoKS0+cGFnZSgpKQorICAgICAgICBy
ZXR1cm4gbmV3IFFXZWJQYWdlQWNjZXNzaWJsZSh2aWV3KCktPnBhZ2UoKSk7CisgICAgcmV0dXJu
IDA7Cit9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldEFwaS9xd2Vidmlld2Fj
Y2Vzc2libGVfcC5oIGIvU291cmNlL1dlYktpdC9xdC9XaWRnZXRBcGkvcXdlYnZpZXdhY2Nlc3Np
YmxlX3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwLi43Y2JmNDQ4NzA3M2Y2NmJlZGY4MWI1NTRhNGFlZWQxOWZiNGRi
MzYzCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9xdC9XaWRnZXRBcGkvcXdlYnZp
ZXdhY2Nlc3NpYmxlX3AuaApAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDEyIE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQorCisgKiBU
aGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5k
L29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5l
cmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUg
Rm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5
b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0
cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhP
VVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAq
IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNl
ZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0
YWlscy4KKworICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7
IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVl
IFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxv
b3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIHF3ZWJ2
aWV3YWNjZXNzaWJsZV9wX2gKKyNkZWZpbmUgcXdlYnZpZXdhY2Nlc3NpYmxlX3BfaAorCisjaW5j
bHVkZSA8cWFjY2Vzc2libGUuaD4KKyNpbmNsdWRlIDxxYWNjZXNzaWJsZW9iamVjdC5oPgorI2lu
Y2x1ZGUgPHFhY2Nlc3NpYmxld2lkZ2V0Lmg+CisKK2NsYXNzIFFXZWJGcmFtZTsKK2NsYXNzIFFX
ZWJQYWdlOworY2xhc3MgUVdlYlZpZXc7CisKKy8qCisgKiBDbGFzc2VzIHJlcHJlc2VudGluZyBh
Y2Nlc3NpYmxlIG9iamVjdHMgZm9yIFZpZXcsIEZyYW1lIGFuZCBQYWdlLgorICoKKyAqIEVhY2gg
b2YgdGhlc2UganVzdCByZXR1cm5zIG9uZSBjaGlsZCB3aGljaCBsZXRzIHRoZSBhY2Nlc3NpYmls
aXR5CisgKiBmcmFtd29yayBuYXZpZ2F0ZSB0b3dhcmRzIHRoZSBhY3R1YWwgY29udGVudHMgaW4g
dGhlIGZyYW1lLgorICovCisKK2NsYXNzIFFXZWJGcmFtZUFjY2Vzc2libGUgOiBwdWJsaWMgUUFj
Y2Vzc2libGVPYmplY3QgeworcHVibGljOgorICAgIFFXZWJGcmFtZUFjY2Vzc2libGUoUVdlYkZy
YW1lKik7CisKKyAgICBRV2ViRnJhbWUqIGZyYW1lKCkgY29uc3Q7CisKKyAgICBRQWNjZXNzaWJs
ZUludGVyZmFjZSogcGFyZW50KCkgY29uc3Q7CisgICAgaW50IGNoaWxkQ291bnQoKSBjb25zdDsK
KyAgICBRQWNjZXNzaWJsZUludGVyZmFjZSogY2hpbGQoaW50IGluZGV4KSBjb25zdDsKKyAgICBp
bnQgaW5kZXhPZkNoaWxkKGNvbnN0IFFBY2Nlc3NpYmxlSW50ZXJmYWNlKikgY29uc3Q7CisgICAg
aW50IG5hdmlnYXRlKFFBY2Nlc3NpYmxlOjpSZWxhdGlvbkZsYWcsIGludCwgUUFjY2Vzc2libGVJ
bnRlcmZhY2UqKiB0YXJnZXQpIGNvbnN0OworCisgICAgUVN0cmluZyB0ZXh0KFFBY2Nlc3NpYmxl
OjpUZXh0KSBjb25zdDsKKyAgICBRQWNjZXNzaWJsZTo6Um9sZSByb2xlKCkgY29uc3Q7CisgICAg
UUFjY2Vzc2libGU6OlN0YXRlIHN0YXRlKCkgY29uc3Q7Cit9OworCitjbGFzcyBRV2ViUGFnZUFj
Y2Vzc2libGUgOiBwdWJsaWMgUUFjY2Vzc2libGVPYmplY3QgeworcHVibGljOgorICAgIFFXZWJQ
YWdlQWNjZXNzaWJsZShRV2ViUGFnZSopOworCisgICAgUVdlYlBhZ2UqIHBhZ2UoKSBjb25zdDsK
KworICAgIFFBY2Nlc3NpYmxlSW50ZXJmYWNlKiBwYXJlbnQoKSBjb25zdDsKKyAgICBpbnQgY2hp
bGRDb3VudCgpIGNvbnN0OworICAgIFFBY2Nlc3NpYmxlSW50ZXJmYWNlKiBjaGlsZChpbnQgaW5k
ZXgpIGNvbnN0OworICAgIGludCBpbmRleE9mQ2hpbGQoY29uc3QgUUFjY2Vzc2libGVJbnRlcmZh
Y2UqKSBjb25zdDsKKyAgICBpbnQgbmF2aWdhdGUoUUFjY2Vzc2libGU6OlJlbGF0aW9uRmxhZywg
aW50LCBRQWNjZXNzaWJsZUludGVyZmFjZSoqIHRhcmdldCkgY29uc3Q7CisKKyAgICBRU3RyaW5n
IHRleHQoUUFjY2Vzc2libGU6OlRleHQpIGNvbnN0OworICAgIFFBY2Nlc3NpYmxlOjpSb2xlIHJv
bGUoKSBjb25zdDsKKyAgICBRQWNjZXNzaWJsZTo6U3RhdGUgc3RhdGUoKSBjb25zdDsKK307CisK
K2NsYXNzIFFXZWJWaWV3QWNjZXNzaWJsZSA6IHB1YmxpYyBRQWNjZXNzaWJsZVdpZGdldCB7Citw
dWJsaWM6CisgICAgUVdlYlZpZXdBY2Nlc3NpYmxlKFFXZWJWaWV3Kik7CisKKyAgICBRV2ViVmll
dyogdmlldygpIGNvbnN0OworCisgICAgaW50IGNoaWxkQ291bnQoKSBjb25zdDsKKyAgICBRQWNj
ZXNzaWJsZUludGVyZmFjZSogY2hpbGQoaW50IGluZGV4KSBjb25zdDsKK307CisKKyNlbmRpZgpk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9XaWRnZXRTdXBwb3J0L0RlZmF1bHRGdWxsU2Ny
ZWVuVmlkZW9IYW5kbGVyLmNwcCBiL1NvdXJjZS9XZWJLaXQvcXQvV2lkZ2V0U3VwcG9ydC9EZWZh
dWx0RnVsbFNjcmVlblZpZGVvSGFuZGxlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMGZlMjRlOGJkNTIzNTI1
YmFjOWJhODIyNDk4N2EzYjZjNmNlMTdkOQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJL
aXQvcXQvV2lkZ2V0U3VwcG9ydC9EZWZhdWx0RnVsbFNjcmVlblZpZGVvSGFuZGxlci5jcHAKQEAg
LTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBEaWdpYSBQbGMgYW5kL29y
IGl0cyBzdWJzaWRpYXJ5KC1pZXMpLgorICogQ29weXJpZ2h0IChDKSAyMDExIE5va2lhIENvcnBv
cmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKS4KKyAqCisgKiBUaGlzIGxpYnJhcnkg
aXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2Rp
ZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwor
ICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsg
ZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikg
YW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGlu
IHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FS
UkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRB
QklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUK
KyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoK
KyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhl
IGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2Fy
ZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICog
Qm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgor
I2luY2x1ZGUgIkRlZmF1bHRGdWxsU2NyZWVuVmlkZW9IYW5kbGVyLmgiCisKKyNpZiBVU0UoUVRf
TVVMVElNRURJQSkKKworI2luY2x1ZGUgIkZ1bGxTY3JlZW5WaWRlb1dpZGdldC5oIgorCit1c2lu
ZyBuYW1lc3BhY2UgV2ViS2l0OworCitib29sIERlZmF1bHRGdWxsU2NyZWVuVmlkZW9IYW5kbGVy
OjpzX3Nob3VsZEZvcmNlRnVsbFNjcmVlblZpZGVvUGxheWJhY2sgPSBmYWxzZTsKKworRGVmYXVs
dEZ1bGxTY3JlZW5WaWRlb0hhbmRsZXI6OkRlZmF1bHRGdWxsU2NyZWVuVmlkZW9IYW5kbGVyKCkK
KyAgICA6IFFXZWJGdWxsU2NyZWVuVmlkZW9IYW5kbGVyKCkKKyAgICAsIG1fZnVsbFNjcmVlbldp
ZGdldChuZXcgRnVsbFNjcmVlblZpZGVvV2lkZ2V0KQoreworICAgIGNvbm5lY3QobV9mdWxsU2Ny
ZWVuV2lkZ2V0LCBTSUdOQUwoZGlkRXhpdEZ1bGxTY3JlZW4oKSksIHRoaXMsIFNJR05BTChmdWxs
U2NyZWVuQ2xvc2VkKCkpKTsKKyAgICBtX2Z1bGxTY3JlZW5XaWRnZXQtPmhpZGUoKTsKKworICAg
IG1fZnVsbFNjcmVlbldpZGdldC0+Y2xvc2UoKTsKK30KKworRGVmYXVsdEZ1bGxTY3JlZW5WaWRl
b0hhbmRsZXI6On5EZWZhdWx0RnVsbFNjcmVlblZpZGVvSGFuZGxlcigpCit7CisgICAgZGVsZXRl
IG1fZnVsbFNjcmVlbldpZGdldDsKK30KKworYm9vbCBEZWZhdWx0RnVsbFNjcmVlblZpZGVvSGFu
ZGxlcjo6cmVxdWlyZXNGdWxsU2NyZWVuRm9yVmlkZW9QbGF5YmFjaygpIGNvbnN0Cit7CisgICAg
c3RhdGljIGJvb2wgaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICBpZiAoIWluaXRpYWxpemVkKSB7
CisgICAgICAgIFFCeXRlQXJyYXkgZm9yY2VGdWxsU2NyZWVuID0gcWdldGVudigiUVRfV0VCS0lU
X0ZPUkNFX0ZVTExTQ1JFRU5fVklERU8iKTsKKyAgICAgICAgaWYgKCFmb3JjZUZ1bGxTY3JlZW4u
aXNFbXB0eSgpKQorICAgICAgICAgICAgc19zaG91bGRGb3JjZUZ1bGxTY3JlZW5WaWRlb1BsYXli
YWNrID0gdHJ1ZTsKKworICAgICAgICBpbml0aWFsaXplZCA9IHRydWU7CisgICAgfQorCisgICAg
cmV0dXJuIHNfc2hvdWxkRm9yY2VGdWxsU2NyZWVuVmlkZW9QbGF5YmFjazsKK30KKwordm9pZCBE
ZWZhdWx0RnVsbFNjcmVlblZpZGVvSGFuZGxlcjo6ZW50ZXJGdWxsU2NyZWVuKFFNZWRpYVBsYXll
ciogcGxheWVyKQoreworICAgIG1fZnVsbFNjcmVlbldpZGdldC0+c2hvdyhwbGF5ZXIpOworfQor
Cit2b2lkIERlZmF1bHRGdWxsU2NyZWVuVmlkZW9IYW5kbGVyOjpleGl0RnVsbFNjcmVlbigpCit7
CisgICAgbV9mdWxsU2NyZWVuV2lkZ2V0LT5jbG9zZSgpOworfQorI2VuZGlmCisKKwpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYktpdC9xdC9XaWRnZXRTdXBwb3J0L0RlZmF1bHRGdWxsU2NyZWVuVmlk
ZW9IYW5kbGVyLmggYi9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldFN1cHBvcnQvRGVmYXVsdEZ1bGxT
Y3JlZW5WaWRlb0hhbmRsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5lOTQzYzU1ZTQ0MDA4MjI1MDg1ZjNhMTY4
OWU0OWRmMjM4OWY0YWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9xdC9XaWRn
ZXRTdXBwb3J0L0RlZmF1bHRGdWxsU2NyZWVuVmlkZW9IYW5kbGVyLmgKQEAgLTAsMCArMSw1MCBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBEaWdpYSBQbGMgYW5kL29yIGl0cyBzdWJzaWRp
YXJ5KC1pZXMpLgorICogQ29weXJpZ2h0IChDKSAyMDExIE5va2lhIENvcnBvcmF0aW9uIGFuZC9v
ciBpdHMgc3Vic2lkaWFyeSgtaWVzKS4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0
d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIg
dGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBh
cyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2
ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZl
cnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRo
YXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhv
dXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91
bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlO
Ry5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
LCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAw
MjExMC0xMzAxLCBVU0EuCisgKi8KKyNpZm5kZWYgRGVmYXVsdEZ1bGxTY3JlZW5WaWRlb0hhbmRs
ZXJfaAorI2RlZmluZSBEZWZhdWx0RnVsbFNjcmVlblZpZGVvSGFuZGxlcl9oCisKKyNpbmNsdWRl
ICJxd2Via2l0cGxhdGZvcm1wbHVnaW4uaCIKKworbmFtZXNwYWNlIFdlYktpdCB7CisKK2NsYXNz
IEZ1bGxTY3JlZW5WaWRlb1dpZGdldDsKKworLy8gV2UgZG8gbm90IHVzZSBFTkFCTEUgb3IgVVNF
IGJlY2F1c2UgbW9jIGRvZXMgbm90IGV4cGFuZCB0aGVzZSBtYWNyb3MuCisjaWYgZGVmaW5lZChX
VEZfVVNFX1FUX01VTFRJTUVESUEpICYmIFdURl9VU0VfUVRfTVVMVElNRURJQQorY2xhc3MgRGVm
YXVsdEZ1bGxTY3JlZW5WaWRlb0hhbmRsZXIgOiBwdWJsaWMgUVdlYkZ1bGxTY3JlZW5WaWRlb0hh
bmRsZXIgeworICAgIFFfT0JKRUNUCitwdWJsaWM6CisgICAgRGVmYXVsdEZ1bGxTY3JlZW5WaWRl
b0hhbmRsZXIoKTsKKyAgICB2aXJ0dWFsIH5EZWZhdWx0RnVsbFNjcmVlblZpZGVvSGFuZGxlcigp
OworICAgIGJvb2wgcmVxdWlyZXNGdWxsU2NyZWVuRm9yVmlkZW9QbGF5YmFjaygpIGNvbnN0Owor
CitwdWJsaWMgUV9TTE9UUzoKKyAgICB2b2lkIGVudGVyRnVsbFNjcmVlbihRTWVkaWFQbGF5ZXIq
KTsKKyAgICB2b2lkIGV4aXRGdWxsU2NyZWVuKCk7CisKK3ByaXZhdGU6CisgICAgc3RhdGljIGJv
b2wgc19zaG91bGRGb3JjZUZ1bGxTY3JlZW5WaWRlb1BsYXliYWNrOworICAgIEZ1bGxTY3JlZW5W
aWRlb1dpZGdldCAqbV9mdWxsU2NyZWVuV2lkZ2V0OworfTsKKyNlbmRpZgorCit9IC8vIG5hbWVz
cGFjZSBXZWJLaXQKKworI2VuZGlmIC8vIERlZmF1bHRGdWxsU2NyZWVuVmlkZW9IYW5kbGVyX2gK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvcXQvV2lkZ2V0U3VwcG9ydC9GdWxsU2NyZWVuVmlk
ZW9XaWRnZXQuY3BwIGIvU291cmNlL1dlYktpdC9xdC9XaWRnZXRTdXBwb3J0L0Z1bGxTY3JlZW5W
aWRlb1dpZGdldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNDEwNWQwMmM2MjI1N2M1NDk5MDZmZWM1MTVmNGY3
NmQ0ZWE4YjdkMQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvcXQvV2lkZ2V0U3Vw
cG9ydC9GdWxsU2NyZWVuVmlkZW9XaWRnZXQuY3BwCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDEwIE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFy
eSgtaWVzKS4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycn
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAq
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJj
b25maWcuaCIKKyNpbmNsdWRlICJGdWxsU2NyZWVuVmlkZW9XaWRnZXQuaCIKKworI2luY2x1ZGUg
PFFBcHBsaWNhdGlvbj4KKyNpbmNsdWRlIDxRQ2xvc2VFdmVudD4KKyNpbmNsdWRlIDxRRGVza3Rv
cFdpZGdldD4KKyNpbmNsdWRlIDxRS2V5RXZlbnQ+CisjaW5jbHVkZSA8UU1lZGlhUGxheWVyPgor
CitzdGF0aWMgY29uc3QgaW50IGdIaWRlTW91c2VDdXJzb3JEZWxheSA9IDMwMDA7CisKK25hbWVz
cGFjZSBXZWJLaXQgeworCitGdWxsU2NyZWVuVmlkZW9XaWRnZXQ6OkZ1bGxTY3JlZW5WaWRlb1dp
ZGdldCgpCisgICAgOiBRVmlkZW9XaWRnZXQoKQorICAgICwgbV9tZWRpYVBsYXllcigwKQorewor
ICAgIFFQYWxldHRlIHBhbGV0dGUodGhpcy0+cGFsZXR0ZSgpKTsKKyAgICBwYWxldHRlLnNldENv
bG9yKFFQYWxldHRlOjpCYXNlLCBRdDo6YmxhY2spOworICAgIHBhbGV0dGUuc2V0Q29sb3IoUVBh
bGV0dGU6OkJhY2tncm91bmQsIFF0OjpibGFjayk7CisgICAgc2V0UGFsZXR0ZShwYWxldHRlKTsK
KworICAgIHNldFdpbmRvd01vZGFsaXR5KFF0OjpBcHBsaWNhdGlvbk1vZGFsKTsKKyAgICBzZXRX
aW5kb3dGbGFncyh3aW5kb3dGbGFncygpIHwgUXQ6OkZyYW1lbGVzc1dpbmRvd0hpbnQpOworCisg
ICAgc2V0R2VvbWV0cnkoUUFwcGxpY2F0aW9uOjpkZXNrdG9wKCktPnNjcmVlbkdlb21ldHJ5KCkp
OworCisgICAgbV9jdXJzb3JUaW1lci5zZXRTaW5nbGVTaG90KHRydWUpOworICAgIGNvbm5lY3Qo
Jm1fY3Vyc29yVGltZXIsIFNJR05BTCh0aW1lb3V0KCkpLCB0aGlzLCBTTE9UKGhpZGVDdXJzb3Io
KSkpOworfQorCitGdWxsU2NyZWVuVmlkZW9XaWRnZXQ6On5GdWxsU2NyZWVuVmlkZW9XaWRnZXQo
KQoreworfQorCit2b2lkIEZ1bGxTY3JlZW5WaWRlb1dpZGdldDo6c2hvdyhRTWVkaWFQbGF5ZXIq
IHBsYXllcikKK3sKKyAgICBtX21lZGlhUGxheWVyID0gcGxheWVyOworICAgIHNob3dGdWxsU2Ny
ZWVuKCk7CisgICAgc2V0TW91c2VUcmFja2luZyh0cnVlKTsKKyAgICByYWlzZSgpOworICAgIG1f
bWVkaWFQbGF5ZXItPnNldFZpZGVvT3V0cHV0KHRoaXMpOworICAgIHNldEZvY3VzKCk7CisgICAg
Z3JhYk1vdXNlKCk7CisgICAgaGlkZUN1cnNvcigpOworfQorCit2b2lkIEZ1bGxTY3JlZW5WaWRl
b1dpZGdldDo6Y2xvc2VFdmVudChRQ2xvc2VFdmVudCogZXZlbnQpCit7CisgICAgbV9tZWRpYVBs
YXllciA9IDA7CisgICAgbV9jdXJzb3JUaW1lci5zdG9wKCk7CisgICAgc2V0TW91c2VUcmFja2lu
ZyhmYWxzZSk7CisgICAgcmVsZWFzZU1vdXNlKCk7CisgICAgUUFwcGxpY2F0aW9uOjpyZXN0b3Jl
T3ZlcnJpZGVDdXJzb3IoKTsKKyAgICBldmVudC0+aWdub3JlKCk7CisgICAgaGlkZSgpOworICAg
IGVtaXQgZGlkRXhpdEZ1bGxTY3JlZW4oKTsKK30KKworYm9vbCBGdWxsU2NyZWVuVmlkZW9XaWRn
ZXQ6OmV2ZW50KFFFdmVudCogZXYpCit7CisgICAgc3dpdGNoIChldi0+dHlwZSgpKSB7CisgICAg
Y2FzZSBRRXZlbnQ6Ok1vdXNlTW92ZToKKyAgICAgICAgc2hvd0N1cnNvcigpOworICAgICAgICBl
di0+YWNjZXB0KCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIGNhc2UgUUV2ZW50OjpNb3Vz
ZUJ1dHRvbkRibENsaWNrOgorICAgICAgICBjbG9zZSgpOworICAgICAgICBldi0+YWNjZXB0KCk7
CisgICAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBRVmlk
ZW9XaWRnZXQ6OmV2ZW50KGV2KTsKKyAgICB9Cit9CisKK3ZvaWQgRnVsbFNjcmVlblZpZGVvV2lk
Z2V0OjprZXlQcmVzc0V2ZW50KFFLZXlFdmVudCogZXYpCit7CisgICAgaWYgKG1fbWVkaWFQbGF5
ZXIgJiYgZXYtPmtleSgpID09IFF0OjpLZXlfU3BhY2UpIHsKKyAgICAgICAgaWYgKG1fbWVkaWFQ
bGF5ZXItPnN0YXRlKCkgPT0gUU1lZGlhUGxheWVyOjpQbGF5aW5nU3RhdGUpCisgICAgICAgICAg
ICBtX21lZGlhUGxheWVyLT5wYXVzZSgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtX21l
ZGlhUGxheWVyLT5wbGF5KCk7CisgICAgfSBlbHNlIGlmIChldi0+a2V5KCkgPT0gUXQ6OktleV9F
c2NhcGUpCisgICAgICAgIGNsb3NlKCk7Cit9CisKK3ZvaWQgRnVsbFNjcmVlblZpZGVvV2lkZ2V0
OjpoaWRlQ3Vyc29yKCkKK3sKKyAgICBRQXBwbGljYXRpb246OnNldE92ZXJyaWRlQ3Vyc29yKFFD
dXJzb3IoUXQ6OkJsYW5rQ3Vyc29yKSk7Cit9CisKK3ZvaWQgRnVsbFNjcmVlblZpZGVvV2lkZ2V0
OjpzaG93Q3Vyc29yKCkKK3sKKyAgICBRQXBwbGljYXRpb246OnJlc3RvcmVPdmVycmlkZUN1cnNv
cigpOworICAgIG1fY3Vyc29yVGltZXIuc3RhcnQoZ0hpZGVNb3VzZUN1cnNvckRlbGF5KTsKK30K
KworfQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9XaWRnZXRTdXBwb3J0L0Z1bGxTY3Jl
ZW5WaWRlb1dpZGdldC5oIGIvU291cmNlL1dlYktpdC9xdC9XaWRnZXRTdXBwb3J0L0Z1bGxTY3Jl
ZW5WaWRlb1dpZGdldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjIwMWNjNDlkMWU0MTJlOTg3YjZlNDFjYzUwM2Rk
MjJlM2Q0NzZhMTcKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldFN1
cHBvcnQvRnVsbFNjcmVlblZpZGVvV2lkZ2V0LmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxMCBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnko
LWllcykuCisgKgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIEZ1bGxT
Y3JlZW5WaWRlb1dpZGdldF9oCisjZGVmaW5lIEZ1bGxTY3JlZW5WaWRlb1dpZGdldF9oCisKKyNp
bmNsdWRlIDxRVGltZXI+CisjaW5jbHVkZSA8UVZpZGVvV2lkZ2V0PgorCitRVF9CRUdJTl9OQU1F
U1BBQ0UKK2NsYXNzIFFNZWRpYVBsYXllcjsKK1FUX0VORF9OQU1FU1BBQ0UKKworbmFtZXNwYWNl
IFdlYktpdCB7CisKK2NsYXNzIEZ1bGxTY3JlZW5WaWRlb1dpZGdldCA6IHB1YmxpYyBRVmlkZW9X
aWRnZXQgeworICAgIFFfT0JKRUNUCitwdWJsaWM6CisgICAgRnVsbFNjcmVlblZpZGVvV2lkZ2V0
KCk7CisgICAgdmlydHVhbCB+RnVsbFNjcmVlblZpZGVvV2lkZ2V0KCk7CisgICAgdm9pZCBzaG93
KFFNZWRpYVBsYXllciopOworCitRX1NJR05BTFM6CisgICAgdm9pZCBkaWRFeGl0RnVsbFNjcmVl
bigpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB2b2lkIGNsb3NlRXZlbnQoUUNsb3NlRXZl
bnQqKTsKKyAgICB2aXJ0dWFsIGJvb2wgZXZlbnQoUUV2ZW50Kik7CisgICAgdmlydHVhbCB2b2lk
IGtleVByZXNzRXZlbnQoUUtleUV2ZW50Kik7CisKK3ByaXZhdGUgUV9TTE9UUzoKKyAgICB2b2lk
IGhpZGVDdXJzb3IoKTsKKworcHJpdmF0ZToKKyAgICB2b2lkIHNob3dDdXJzb3IoKTsKKyAgICBR
TWVkaWFQbGF5ZXIqIG1fbWVkaWFQbGF5ZXI7CisgICAgUVRpbWVyIG1fY3Vyc29yVGltZXI7Cit9
OworCit9CisKKyNlbmRpZiAvLyBGdWxsU2NyZWVuVmlkZW9XaWRnZXRfaApkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYktpdC9xdC9XaWRnZXRTdXBwb3J0L0luaXRXZWJLaXRRdC5jcHAgYi9Tb3VyY2Uv
V2ViS2l0L3F0L1dpZGdldFN1cHBvcnQvSW5pdFdlYktpdFF0LmNwcApuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi43MTg4
NjAzN2RhNWY4YzEyNWY2NTA1NGNmZThjZmYxNzcxNGRlNGUwCi0tLSAvZGV2L251bGwKKysrIGIv
U291cmNlL1dlYktpdC9xdC9XaWRnZXRTdXBwb3J0L0luaXRXZWJLaXRRdC5jcHAKQEAgLTAsMCAr
MSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBEaWdpYSBQbGMgYW5kL29yIGl0cyBz
dWJzaWRpYXJ5KC1pZXMpLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5
b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVy
bXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxp
c2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24g
MiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4K
KyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3
aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVu
IHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZl
IHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4g
IElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4s
IDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEz
MDEsIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkluaXRX
ZWJLaXRRdC5oIgorCisjaW5jbHVkZSAiSW5pdFdlYkNvcmVRdC5oIgorCisjaW5jbHVkZSAiUVN0
eWxlRmFjYWRlSW1wLmgiCisKKyNpbmNsdWRlIDxRQXBwbGljYXRpb24+CisjaW5jbHVkZSA8UVN0
eWxlPgorCituYW1lc3BhY2UgV2ViS2l0IHsKKworUV9ERUNMX0VYUE9SVCB2b2lkIGluaXRpYWxp
emVXZWJLaXRXaWRnZXRzKCkKK3sKKyAgICBzdGF0aWMgYm9vbCBpbml0aWFsaXplZCA9IGZhbHNl
OworICAgIGlmIChpbml0aWFsaXplZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgc2V0V2ViS2l0
V2lkZ2V0c0luaXRDYWxsYmFjayhRU3R5bGVGYWNhZGVJbXA6OmNyZWF0ZSk7CisgICAgaW5pdGlh
bGl6ZVdlYktpdFF0KCk7CisKKyAgICAvLyBRV2ViU2V0dGluZ3M6OlNlYXJjaENhbmNlbEJ1dHRv
bkdyYXBoaWMKKyAgICBzZXRJbWFnZVBsYXRmb3JtUmVzb3VyY2UoInNlYXJjaENhbmNlbEJ1dHRv
biIsIFFBcHBsaWNhdGlvbjo6c3R5bGUoKS0+c3RhbmRhcmRQaXhtYXAoUVN0eWxlOjpTUF9EaWFs
b2dDbG9zZUJ1dHRvbikpOworICAgIC8vIFFXZWJTZXR0aW5nczo6U2VhcmNoQ2FuY2VsQnV0dG9u
UHJlc3NlZEdyYXBoaWMKKyAgICBzZXRJbWFnZVBsYXRmb3JtUmVzb3VyY2UoInNlYXJjaENhbmNl
bEJ1dHRvblByZXNzZWQiLCBRQXBwbGljYXRpb246OnN0eWxlKCktPnN0YW5kYXJkUGl4bWFwKFFT
dHlsZTo6U1BfRGlhbG9nQ2xvc2VCdXR0b24pKTsKKworICAgIGluaXRpYWxpemVkID0gdHJ1ZTsK
K30KKworfQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9XaWRnZXRTdXBwb3J0L0luaXRX
ZWJLaXRRdC5oIGIvU291cmNlL1dlYktpdC9xdC9XaWRnZXRTdXBwb3J0L0luaXRXZWJLaXRRdC5o
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAuLmZiYjJkMThmNzNkNzcxZjA4NzE4YzZjYmViMTRiOTk1NzllZDU4YTEKLS0t
IC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldFN1cHBvcnQvSW5pdFdlYktp
dFF0LmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBEaWdpYSBQ
bGMgYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBm
cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBp
dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBM
aWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRo
ZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkg
bGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhl
IGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5U
WTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJ
VFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICog
TGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICog
WW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmls
ZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZv
dW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0
b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBJbml0V2ViS2l0UXRf
aAorI2RlZmluZSBJbml0V2ViS2l0UXRfaAorCituYW1lc3BhY2UgV2ViS2l0IHsKKworUV9ERUNM
X0VYUE9SVCB2b2lkIGluaXRpYWxpemVXZWJLaXRXaWRnZXRzKCk7CisKK30KKyNlbmRpZgpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9XaWRnZXRTdXBwb3J0L0luc3BlY3RvckNsaWVudFdl
YlBhZ2UuY3BwIGIvU291cmNlL1dlYktpdC9xdC9XaWRnZXRTdXBwb3J0L0luc3BlY3RvckNsaWVu
dFdlYlBhZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmRjNDczMGIzMjk1ODU4NzhjMDUyZTRhZmIxOTg1YmEw
NGJlMzc0M2QKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldFN1cHBv
cnQvSW5zcGVjdG9yQ2xpZW50V2ViUGFnZS5jcHAKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29w
eXJpZ2h0IChDKSAyMDA4IE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgt
aWVzKQorICogQ29weXJpZ2h0IChDKSAyMDA4IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTIgRGlnaWEgUGxjIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVz
KQorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEu
ICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29t
cHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJp
YnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVk
CisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRl
biBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
QU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVE
CisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBP
TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJJbnNwZWN0b3JDbGllbnRXZWJQYWdlLmgi
CisKKyNpbmNsdWRlIDxxd2ViZnJhbWUuaD4KKwordXNpbmcgbmFtZXNwYWNlIFdlYktpdDsKKwor
SW5zcGVjdG9yQ2xpZW50V2ViUGFnZTo6SW5zcGVjdG9yQ2xpZW50V2ViUGFnZSgpCit7CisgICAg
UVdlYlZpZXcqIHZpZXcgPSBuZXcgUVdlYlZpZXc7CisgICAgdmlldy0+c2V0UGFnZSh0aGlzKTsK
KyAgICBzZXRQYXJlbnQodmlldyk7CisgICAgY29ubmVjdChtYWluRnJhbWUoKSwgU0lHTkFMKGph
dmFTY3JpcHRXaW5kb3dPYmplY3RDbGVhcmVkKCkpLCBTTE9UKGphdmFTY3JpcHRXaW5kb3dPYmpl
Y3RDbGVhcmVkKCkpKTsKK30KKworUVdlYlBhZ2UqIEluc3BlY3RvckNsaWVudFdlYlBhZ2U6OmNy
ZWF0ZVdpbmRvdyhRV2ViUGFnZTo6V2ViV2luZG93VHlwZSkKK3sKKyAgICBRV2ViVmlldyogdmll
dyA9IG5ldyBRV2ViVmlldzsKKyAgICBRV2ViUGFnZSogcGFnZSA9IG5ldyBRV2ViUGFnZTsKKyAg
ICB2aWV3LT5zZXRQYWdlKHBhZ2UpOworICAgIHZpZXctPnNldEF0dHJpYnV0ZShRdDo6V0FfRGVs
ZXRlT25DbG9zZSk7CisgICAgcmV0dXJuIHBhZ2U7Cit9CisKK3ZvaWQgSW5zcGVjdG9yQ2xpZW50
V2ViUGFnZTo6amF2YVNjcmlwdFdpbmRvd09iamVjdENsZWFyZWQoKQoreworICAgIFFWYXJpYW50
IGluc3BlY3RvckphdmFTY3JpcHRXaW5kb3dPYmplY3RzID0gcHJvcGVydHkoIl9xX2luc3BlY3Rv
ckphdmFTY3JpcHRXaW5kb3dPYmplY3RzIik7CisgICAgaWYgKCFpbnNwZWN0b3JKYXZhU2NyaXB0
V2luZG93T2JqZWN0cy5pc1ZhbGlkKCkpCisgICAgICAgIHJldHVybjsKKyAgICBRTWFwPFFTdHJp
bmcsIFFWYXJpYW50PiBqYXZhU2NyaXB0TmFtZU9iamVjdE1hcCA9IGluc3BlY3RvckphdmFTY3Jp
cHRXaW5kb3dPYmplY3RzLnRvTWFwKCk7CisgICAgUVdlYkZyYW1lKiBmcmFtZSA9IG1haW5GcmFt
ZSgpOworICAgIFFNYXA8UVN0cmluZywgUVZhcmlhbnQ+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGph
dmFTY3JpcHROYW1lT2JqZWN0TWFwLmNvbnN0QmVnaW4oKTsKKyAgICBmb3IgKCA7IGl0ICE9IGph
dmFTY3JpcHROYW1lT2JqZWN0TWFwLmNvbnN0RW5kKCk7ICsraXQpIHsKKyAgICAgICAgUVN0cmlu
ZyBuYW1lID0gaXQua2V5KCk7CisgICAgICAgIFFWYXJpYW50IHZhbHVlID0gaXQudmFsdWUoKTsK
KyAgICAgICAgUU9iamVjdCogb2JqID0gdmFsdWUudmFsdWU8UU9iamVjdCo+KCk7CisgICAgICAg
IGZyYW1lLT5hZGRUb0phdmFTY3JpcHRXaW5kb3dPYmplY3QobmFtZSwgb2JqKTsKKyAgICB9Cit9
CisKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvcXQvV2lkZ2V0U3VwcG9ydC9JbnNwZWN0b3JD
bGllbnRXZWJQYWdlLmggYi9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldFN1cHBvcnQvSW5zcGVjdG9y
Q2xpZW50V2ViUGFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjg4N2YyOWIwY2Y1MjE5ZGZhYTA0ZmIzZThmYzU3
OGZkZGFlYTA4YWMKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldFN1
cHBvcnQvSW5zcGVjdG9yQ2xpZW50V2ViUGFnZS5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENv
cHlyaWdodCAoQykgMjAwOCBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnko
LWllcykKKyAqIENvcHlyaWdodCAoQykgMjAwOCBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlcgor
ICogQ29weXJpZ2h0IChDKSAyMDEyIERpZ2lhIFBsYyBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWll
cykKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAx
LiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENv
bXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRy
aWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZl
ZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0
ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElF
RAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICog
T04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLwor
I2lmbmRlZiBJbnNwZWN0b3JDbGllbnRXZWJQYWdlX2gKKyNkZWZpbmUgSW5zcGVjdG9yQ2xpZW50
V2ViUGFnZV9oCisKKyNpbmNsdWRlIDxxd2VicGFnZS5oPgorI2luY2x1ZGUgPHF3ZWJ2aWV3Lmg+
CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitjbGFzcyBJbnNwZWN0b3JDbGllbnRXZWJQYWdlIDog
cHVibGljIFFXZWJQYWdlIHsKKyAgICBRX09CSkVDVAorICAgIGZyaWVuZCBjbGFzcyBJbnNwZWN0
b3JDbGllbnRRdDsKK3B1YmxpYzoKKyAgICBJbnNwZWN0b3JDbGllbnRXZWJQYWdlKCk7CisKKyAg
ICBRV2ViUGFnZSogY3JlYXRlV2luZG93KFFXZWJQYWdlOjpXZWJXaW5kb3dUeXBlKTsKKworcHVi
bGljIFFfU0xPVFM6CisgICAgdm9pZCBqYXZhU2NyaXB0V2luZG93T2JqZWN0Q2xlYXJlZCgpOwor
fTsKKworfSAvLyBuYW1lc3BhY2UgV2ViS2l0CisKKyNlbmRpZiAvLyBJbnNwZWN0b3JDbGllbnRX
ZWJQYWdlX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvcXQvV2lkZ2V0U3VwcG9ydC9QYWdl
Q2xpZW50UXQuY3BwIGIvU291cmNlL1dlYktpdC9xdC9XaWRnZXRTdXBwb3J0L1BhZ2VDbGllbnRR
dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMC4uMDk1ZjllNTgyOWQxZWFjMGM3YWU5MGU1NGM0MGRlY2ZhMTQ4ZDlm
ZgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvcXQvV2lkZ2V0U3VwcG9ydC9QYWdl
Q2xpZW50UXQuY3BwCkBAIC0wLDAgKzEsMjk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEw
IE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQorICoKKyAqIFRo
aXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQv
b3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVy
YWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBG
b3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlv
dXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlz
dHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRI
T1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisg
KiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBT
ZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRl
dGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05V
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJh
cnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBG
cmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGgg
Rmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlBhZ2VDbGllbnRRdC5oIgorCisjaW5jbHVkZSA8UUdy
YXBoaWNzU2NlbmU+CisjaW5jbHVkZSA8UUdyYXBoaWNzVmlldz4KKworI2lmIGRlZmluZWQoUV9X
U19YMTEpCisjaW5jbHVkZSA8UVgxMUluZm8+CisjZW5kaWYKKworI2lmZGVmIFFUX09QRU5HTF9M
SUIKKyNpbmNsdWRlIDxRR0xXaWRnZXQ+CisjZW5kaWYKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9D
T01QT1NJVElORykKKyNpbmNsdWRlICJUZXh0dXJlTWFwcGVyLmgiCisjaW5jbHVkZSAidGV4bWFw
L1RleHR1cmVNYXBwZXJMYXllci5oIgorI2VuZGlmCisKK1FXaW5kb3cqIFFXZWJQYWdlQ2xpZW50
Ojpvd25lcldpbmRvdygpIGNvbnN0Cit7CisgICAgUVdpZGdldCogd2lkZ2V0ID0gcW9iamVjdF9j
YXN0PFFXaWRnZXQqPihvd25lcldpZGdldCgpKTsKKyAgICBpZiAoIXdpZGdldCkKKyAgICAgICAg
cmV0dXJuIDA7CisgICAgaWYgKFFXaW5kb3cgKndpbmRvdyA9IHdpZGdldC0+d2luZG93SGFuZGxl
KCkpCisgICAgICAgIHJldHVybiB3aW5kb3c7CisgICAgaWYgKGNvbnN0IFFXaWRnZXQgKm5hdGl2
ZVBhcmVudCA9IHdpZGdldC0+bmF0aXZlUGFyZW50V2lkZ2V0KCkpCisgICAgICAgIHJldHVybiBu
YXRpdmVQYXJlbnQtPndpbmRvd0hhbmRsZSgpOworICAgIHJldHVybiAwOworfQorCituYW1lc3Bh
Y2UgV2ViQ29yZSB7CisKK3ZvaWQgUGFnZUNsaWVudFFXaWRnZXQ6OnNjcm9sbChpbnQgZHgsIGlu
dCBkeSwgY29uc3QgUVJlY3QmIHJlY3RUb1Njcm9sbCkKK3sKKyAgICB2aWV3LT5zY3JvbGwocXJl
YWwoZHgpLCBxcmVhbChkeSksIHJlY3RUb1Njcm9sbCk7Cit9CisKK3ZvaWQgUGFnZUNsaWVudFFX
aWRnZXQ6OnVwZGF0ZShjb25zdCBRUmVjdCAmIGRpcnR5UmVjdCkKK3sKKyAgICB2aWV3LT51cGRh
dGUoZGlydHlSZWN0KTsKK30KKwordm9pZCBQYWdlQ2xpZW50UVdpZGdldDo6cmVwYWludFZpZXdw
b3J0KCkKK3sKKyAgICB1cGRhdGUodmlldy0+cmVjdCgpKTsKK30KKwordm9pZCBQYWdlQ2xpZW50
UVdpZGdldDo6c2V0SW5wdXRNZXRob2RFbmFibGVkKGJvb2wgZW5hYmxlKQoreworICAgIHZpZXct
PnNldEF0dHJpYnV0ZShRdDo6V0FfSW5wdXRNZXRob2RFbmFibGVkLCBlbmFibGUpOworfQorCiti
b29sIFBhZ2VDbGllbnRRV2lkZ2V0OjppbnB1dE1ldGhvZEVuYWJsZWQoKSBjb25zdAoreworICAg
IHJldHVybiB2aWV3LT50ZXN0QXR0cmlidXRlKFF0OjpXQV9JbnB1dE1ldGhvZEVuYWJsZWQpOwor
fQorCit2b2lkIFBhZ2VDbGllbnRRV2lkZ2V0OjpzZXRJbnB1dE1ldGhvZEhpbnRzKFF0OjpJbnB1
dE1ldGhvZEhpbnRzIGhpbnRzKQoreworICAgIHZpZXctPnNldElucHV0TWV0aG9kSGludHMoaGlu
dHMpOworfQorCitQYWdlQ2xpZW50UVdpZGdldDo6flBhZ2VDbGllbnRRV2lkZ2V0KCkKK3sKK30K
KworI2lmbmRlZiBRVF9OT19DVVJTT1IKK1FDdXJzb3IgUGFnZUNsaWVudFFXaWRnZXQ6OmN1cnNv
cigpIGNvbnN0Cit7CisgICAgcmV0dXJuIHZpZXctPmN1cnNvcigpOworfQorCit2b2lkIFBhZ2VD
bGllbnRRV2lkZ2V0Ojp1cGRhdGVDdXJzb3IoY29uc3QgUUN1cnNvciYgY3Vyc29yKQoreworICAg
IHZpZXctPnNldEN1cnNvcihjdXJzb3IpOworfQorI2VuZGlmCisKK1FQYWxldHRlIFBhZ2VDbGll
bnRRV2lkZ2V0OjpwYWxldHRlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gdmlldy0+cGFsZXR0ZSgp
OworfQorCitpbnQgUGFnZUNsaWVudFFXaWRnZXQ6OnNjcmVlbk51bWJlcigpIGNvbnN0Cit7Cisj
aWYgZGVmaW5lZChRX1dTX1gxMSkKKyAgICByZXR1cm4gdmlldy0+eDExSW5mbygpLnNjcmVlbigp
OworI2VuZGlmCisgICAgcmV0dXJuIDA7Cit9CisKK1FPYmplY3QqIFBhZ2VDbGllbnRRV2lkZ2V0
Ojpvd25lcldpZGdldCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIHZpZXc7Cit9CisKK1FSZWN0IFBh
Z2VDbGllbnRRV2lkZ2V0OjpnZW9tZXRyeVJlbGF0aXZlVG9Pd25lcldpZGdldCgpIGNvbnN0Cit7
CisgICAgcmV0dXJuIHZpZXctPmdlb21ldHJ5KCk7Cit9CisKK1FPYmplY3QqIFBhZ2VDbGllbnRR
V2lkZ2V0OjpwbHVnaW5QYXJlbnQoKSBjb25zdAoreworICAgIHJldHVybiB2aWV3OworfQorCitR
U3R5bGUqIFBhZ2VDbGllbnRRV2lkZ2V0OjpzdHlsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIHZp
ZXctPnN0eWxlKCk7Cit9CisKK1FSZWN0RiBQYWdlQ2xpZW50UVdpZGdldDo6d2luZG93UmVjdCgp
IGNvbnN0Cit7CisgICAgcmV0dXJuIFFSZWN0Rih2aWV3LT53aW5kb3coKS0+Z2VvbWV0cnkoKSk7
Cit9CisKK3ZvaWQgUGFnZUNsaWVudFFXaWRnZXQ6OnNldFdpZGdldFZpc2libGUoV2lkZ2V0KiB3
aWRnZXQsIGJvb2wgdmlzaWJsZSkKK3sKKyAgICBRV2lkZ2V0KiBxdFdpZGdldCA9IHFvYmplY3Rf
Y2FzdDxRV2lkZ2V0Kj4od2lkZ2V0LT5wbGF0Zm9ybVdpZGdldCgpKTsKKyAgICBpZiAoIXF0V2lk
Z2V0KQorICAgICAgICByZXR1cm47CisgICAgcXRXaWRnZXQtPnNldFZpc2libGUodmlzaWJsZSk7
Cit9CisKKyNpZiAhZGVmaW5lZChRVF9OT19HUkFQSElDU1ZJRVcpCitQYWdlQ2xpZW50UUdyYXBo
aWNzV2lkZ2V0Ojp+UGFnZUNsaWVudFFHcmFwaGljc1dpZGdldCgpCit7CisgICAgZGVsZXRlIG92
ZXJsYXk7Cit9CisKK3ZvaWQgUGFnZUNsaWVudFFHcmFwaGljc1dpZGdldDo6c2Nyb2xsKGludCBk
eCwgaW50IGR5LCBjb25zdCBRUmVjdCYgcmVjdFRvU2Nyb2xsKQoreworICAgIHZpZXctPnNjcm9s
bChxcmVhbChkeCksIHFyZWFsKGR5KSwgcmVjdFRvU2Nyb2xsKTsKK30KKwordm9pZCBQYWdlQ2xp
ZW50UUdyYXBoaWNzV2lkZ2V0Ojp1cGRhdGUoY29uc3QgUVJlY3QmIGRpcnR5UmVjdCkKK3sKKyAg
ICB2aWV3LT51cGRhdGUoZGlydHlSZWN0KTsKKworICAgIGlmIChvdmVybGF5KQorICAgICAgICBv
dmVybGF5LT51cGRhdGUoUVJlY3RGKGRpcnR5UmVjdCkpOworfQorCit2b2lkIFBhZ2VDbGllbnRR
R3JhcGhpY3NXaWRnZXQ6OnJlcGFpbnRWaWV3cG9ydCgpCit7CisgICAgdXBkYXRlKHZpZXctPmJv
dW5kaW5nUmVjdCgpLnRvQWxpZ25lZFJlY3QoKSk7Cit9CisKK2Jvb2wgUGFnZUNsaWVudFFHcmFw
aGljc1dpZGdldDo6bWFrZU9wZW5HTENvbnRleHRDdXJyZW50SWZBdmFpbGFibGUoKQoreworI2lm
IFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykgJiYgVVNFKFRFWFRVUkVfTUFQUEVSX0dMKSAm
JiBkZWZpbmVkKFFUX09QRU5HTF9MSUIpCisgICAgUUdyYXBoaWNzVmlldyogZ3JhcGhpY3NWaWV3
ID0gdmlldy0+c2NlbmUoKS0+dmlld3MoKVswXTsKKyAgICBpZiAoZ3JhcGhpY3NWaWV3ICYmIGdy
YXBoaWNzVmlldy0+dmlld3BvcnQoKSkgeworICAgICAgICBRR0xXaWRnZXQqIGdsV2lkZ2V0ID0g
cW9iamVjdF9jYXN0PFFHTFdpZGdldCo+KGdyYXBoaWNzVmlldy0+dmlld3BvcnQoKSk7CisgICAg
ICAgIGlmIChnbFdpZGdldCkgeworICAgICAgICAgICAgLy8gVGhlIEdMIGNvbnRleHQgYmVsb25n
aW5nIHRvIHRoZSBRR0xXaWRnZXQgdmlld3BvcnQgbXVzdCBiZSBjdXJyZW50IHdoZW4gVGV4dHVy
ZU1hcHBlciBpcyBiZWluZyBjcmVhdGVkLgorICAgICAgICAgICAgZ2xXaWRnZXQtPm1ha2VDdXJy
ZW50KCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRp
ZgorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBQYWdlQ2xpZW50UUdyYXBoaWNzV2lkZ2V0
OjpzZXRJbnB1dE1ldGhvZEVuYWJsZWQoYm9vbCBlbmFibGUpCit7CisgICAgdmlldy0+c2V0Rmxh
ZyhRR3JhcGhpY3NJdGVtOjpJdGVtQWNjZXB0c0lucHV0TWV0aG9kLCBlbmFibGUpOworfQorCiti
b29sIFBhZ2VDbGllbnRRR3JhcGhpY3NXaWRnZXQ6OmlucHV0TWV0aG9kRW5hYmxlZCgpIGNvbnN0
Cit7CisgICAgcmV0dXJuIHZpZXctPmZsYWdzKCkgJiBRR3JhcGhpY3NJdGVtOjpJdGVtQWNjZXB0
c0lucHV0TWV0aG9kOworfQorCit2b2lkIFBhZ2VDbGllbnRRR3JhcGhpY3NXaWRnZXQ6OnNldElu
cHV0TWV0aG9kSGludHMoUXQ6OklucHV0TWV0aG9kSGludHMgaGludHMpCit7CisgICAgdmlldy0+
c2V0SW5wdXRNZXRob2RIaW50cyhoaW50cyk7Cit9CisKKyNpZm5kZWYgUVRfTk9fQ1VSU09SCitR
Q3Vyc29yIFBhZ2VDbGllbnRRR3JhcGhpY3NXaWRnZXQ6OmN1cnNvcigpIGNvbnN0Cit7CisgICAg
cmV0dXJuIHZpZXctPmN1cnNvcigpOworfQorCit2b2lkIFBhZ2VDbGllbnRRR3JhcGhpY3NXaWRn
ZXQ6OnVwZGF0ZUN1cnNvcihjb25zdCBRQ3Vyc29yJiBjdXJzb3IpCit7CisgICAgdmlldy0+c2V0
Q3Vyc29yKGN1cnNvcik7Cit9CisjZW5kaWYKKworUVBhbGV0dGUgUGFnZUNsaWVudFFHcmFwaGlj
c1dpZGdldDo6cGFsZXR0ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIHZpZXctPnBhbGV0dGUoKTsK
K30KKworaW50IFBhZ2VDbGllbnRRR3JhcGhpY3NXaWRnZXQ6OnNjcmVlbk51bWJlcigpIGNvbnN0
Cit7CisjaWYgZGVmaW5lZChRX1dTX1gxMSkKKyAgICBpZiAoUUdyYXBoaWNzU2NlbmUqIHNjZW5l
ID0gdmlldy0+c2NlbmUoKSkgeworICAgICAgICBjb25zdCBRTGlzdDxRR3JhcGhpY3NWaWV3Kj4g
dmlld3MgPSBzY2VuZS0+dmlld3MoKTsKKworICAgICAgICBpZiAoIXZpZXdzLmlzRW1wdHkoKSkK
KyAgICAgICAgICAgIHJldHVybiB2aWV3cy5hdCgwKS0+eDExSW5mbygpLnNjcmVlbigpOworICAg
IH0KKyNlbmRpZgorCisgICAgcmV0dXJuIDA7Cit9CisKK1FPYmplY3QqIFBhZ2VDbGllbnRRR3Jh
cGhpY3NXaWRnZXQ6Om93bmVyV2lkZ2V0KCkgY29uc3QKK3sKKyAgICBpZiAoUUdyYXBoaWNzU2Nl
bmUqIHNjZW5lID0gdmlldy0+c2NlbmUoKSkgeworICAgICAgICBjb25zdCBRTGlzdDxRR3JhcGhp
Y3NWaWV3Kj4gdmlld3MgPSBzY2VuZS0+dmlld3MoKTsKKyAgICAgICAgcmV0dXJuIHZpZXdzLnZh
bHVlKDApOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworUVJlY3QgUGFnZUNsaWVudFFHcmFw
aGljc1dpZGdldDo6Z2VvbWV0cnlSZWxhdGl2ZVRvT3duZXJXaWRnZXQoKSBjb25zdAoreworICAg
IGlmICghdmlldy0+c2NlbmUoKSkKKyAgICAgICAgcmV0dXJuIFFSZWN0KCk7CisKKyAgICBRTGlz
dDxRR3JhcGhpY3NWaWV3Kj4gdmlld3MgPSB2aWV3LT5zY2VuZSgpLT52aWV3cygpOworICAgIGlm
ICh2aWV3cy5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBRUmVjdCgpOworCisgICAgUUdyYXBo
aWNzVmlldyogZ3JhcGhpY3NWaWV3ID0gdmlld3MuYXQoMCk7CisgICAgcmV0dXJuIGdyYXBoaWNz
Vmlldy0+bWFwRnJvbVNjZW5lKHZpZXctPmJvdW5kaW5nUmVjdCgpKS5ib3VuZGluZ1JlY3QoKTsK
K30KKworI2lmIFVTRShUSUxFRF9CQUNLSU5HX1NUT1JFKQorUVJlY3RGIFBhZ2VDbGllbnRRR3Jh
cGhpY3NXaWRnZXQ6OmdyYXBoaWNzSXRlbVZpc2libGVSZWN0KCkgY29uc3QKK3sKKyAgICBpZiAo
IXZpZXctPnNjZW5lKCkpCisgICAgICAgIHJldHVybiBRUmVjdEYoKTsKKworICAgIFFMaXN0PFFH
cmFwaGljc1ZpZXcqPiB2aWV3cyA9IHZpZXctPnNjZW5lKCktPnZpZXdzKCk7CisgICAgaWYgKHZp
ZXdzLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIFFSZWN0RigpOworCisgICAgUUdyYXBoaWNz
VmlldyogZ3JhcGhpY3NWaWV3ID0gdmlld3MuYXQoMCk7CisgICAgaW50IHhPZmZzZXQgPSBncmFw
aGljc1ZpZXctPmhvcml6b250YWxTY3JvbGxCYXIoKS0+dmFsdWUoKTsKKyAgICBpbnQgeU9mZnNl
dCA9IGdyYXBoaWNzVmlldy0+dmVydGljYWxTY3JvbGxCYXIoKS0+dmFsdWUoKTsKKyAgICByZXR1
cm4gdmlldy0+bWFwUmVjdEZyb21TY2VuZShRUmVjdEYoUVBvaW50Rih4T2Zmc2V0LCB5T2Zmc2V0
KSwgZ3JhcGhpY3NWaWV3LT52aWV3cG9ydCgpLT5zaXplKCkpKTsKK30KKyNlbmRpZgorCitRT2Jq
ZWN0KiBQYWdlQ2xpZW50UUdyYXBoaWNzV2lkZ2V0OjpwbHVnaW5QYXJlbnQoKSBjb25zdAorewor
ICAgIHJldHVybiB2aWV3OworfQorCitRU3R5bGUqIFBhZ2VDbGllbnRRR3JhcGhpY3NXaWRnZXQ6
OnN0eWxlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gdmlldy0+c3R5bGUoKTsKK30KKwordm9pZCBQ
YWdlQ2xpZW50UUdyYXBoaWNzV2lkZ2V0OjpzZXRXaWRnZXRWaXNpYmxlKFdpZGdldCosIGJvb2wp
Cit7CisgICAgLy8gRG9lc24ndCBtYWtlIHNlbnNlLCBkb2VzIGl0PworfQorCitRUmVjdEYgUGFn
ZUNsaWVudFFHcmFwaGljc1dpZGdldDo6d2luZG93UmVjdCgpIGNvbnN0Cit7CisgICAgaWYgKCF2
aWV3LT5zY2VuZSgpKQorICAgICAgICByZXR1cm4gUVJlY3RGKCk7CisKKyAgICAvLyBUaGUgc2Nl
bmVSZWN0IGlzIGEgZ29vZCBhcHByb3hpbWF0aW9uIG9mIHRoZSBzaXplIG9mIHRoZSBhcHBsaWNh
dGlvbiwgaW5kZXBlbmRlbnQgb2YgdGhlIHZpZXcuCisgICAgcmV0dXJuIHZpZXctPnNjZW5lKCkt
PnNjZW5lUmVjdCgpOworfQorI2VuZGlmIC8vIFFUX05PX0dSQVBISUNTVklFVworCit9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCisKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvcXQvV2lkZ2V0U3Vw
cG9ydC9QYWdlQ2xpZW50UXQuaCBiL1NvdXJjZS9XZWJLaXQvcXQvV2lkZ2V0U3VwcG9ydC9QYWdl
Q2xpZW50UXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwLi42M2E4MGFkMDM5MjFlNzFkOTE0ODMzY2U0Zjg3ZmY0YTAz
NDc2YmFmCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9xdC9XaWRnZXRTdXBwb3J0
L1BhZ2VDbGllbnRRdC5oCkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDEwIE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQorICoKKyAq
IFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBh
bmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2Fy
ZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0
IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMg
ZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBX
SVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9m
CisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Uu
ICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3Jl
IGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUg
R05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxp
YnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlm
dGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2lm
bmRlZiBQYWdlQ2xpZW50UXRfaAorI2RlZmluZSBQYWdlQ2xpZW50UXRfaAorCisjaW5jbHVkZSAi
RnJhbWVWaWV3LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiSW50
UmVjdC5oIgorI2luY2x1ZGUgIlFXZWJQYWdlQ2xpZW50LmgiCisjaW5jbHVkZSAiVGV4dHVyZU1h
cHBlckxheWVyQ2xpZW50UXQuaCIKKyNpbmNsdWRlICJUaWxlZEJhY2tpbmdTdG9yZS5oIgorI2lu
Y2x1ZGUgInFncmFwaGljc3dlYnZpZXcuaCIKKyNpbmNsdWRlICJxd2ViZnJhbWUuaCIKKyNpbmNs
dWRlICJxd2ViZnJhbWVfcC5oIgorI2luY2x1ZGUgInF3ZWJwYWdlLmgiCisjaW5jbHVkZSAicXdl
YnBhZ2VfcC5oIgorI2luY2x1ZGUgPFNldHRpbmdzLmg+CisjaW5jbHVkZSA8cWdyYXBoaWNzc2Nl
bmUuaD4KKyNpbmNsdWRlIDxxZ3JhcGhpY3N2aWV3Lmg+CisjaW5jbHVkZSA8cWdyYXBoaWNzd2lk
Z2V0Lmg+CisjaW5jbHVkZSA8cW1ldGFvYmplY3QuaD4KKyNpbmNsdWRlIDxxc2Nyb2xsYmFyLmg+
CisjaW5jbHVkZSA8cXN0eWxlb3B0aW9uLmg+CisjaW5jbHVkZSA8cXRpbWVyLmg+CisjaW5jbHVk
ZSA8cXdpZGdldC5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIFBhZ2VDbGllbnRR
V2lkZ2V0IDogcHVibGljIFFXZWJQYWdlQ2xpZW50IHsKK3B1YmxpYzoKKyAgICBQYWdlQ2xpZW50
UVdpZGdldChRV2lkZ2V0KiBuZXdWaWV3LCBRV2ViUGFnZSogbmV3UGFnZSkKKyAgICAgICAgOiB2
aWV3KG5ld1ZpZXcpCisgICAgICAgICwgcGFnZShuZXdQYWdlKQorICAgIHsKKyAgICAgICAgUV9B
U1NFUlQodmlldyk7CisgICAgfQorICAgIHZpcnR1YWwgflBhZ2VDbGllbnRRV2lkZ2V0KCk7CisK
KyAgICB2aXJ0dWFsIGJvb2wgaXNRV2lkZ2V0Q2xpZW50KCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsg
fQorCisgICAgdmlydHVhbCB2b2lkIHNjcm9sbChpbnQgZHgsIGludCBkeSwgY29uc3QgUVJlY3Qm
KTsKKyAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlKGNvbnN0IFFSZWN0JiBkaXJ0eVJlY3QpOworICAg
IHZpcnR1YWwgdm9pZCByZXBhaW50Vmlld3BvcnQoKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0SW5w
dXRNZXRob2RFbmFibGVkKGJvb2wpOworICAgIHZpcnR1YWwgYm9vbCBpbnB1dE1ldGhvZEVuYWJs
ZWQoKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0SW5wdXRNZXRob2RIaW50cyhRdDo6SW5w
dXRNZXRob2RIaW50cyk7CisKKyNpZm5kZWYgUVRfTk9fQ1VSU09SCisgICAgdmlydHVhbCBRQ3Vy
c29yIGN1cnNvcigpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVDdXJzb3IoY29uc3Qg
UUN1cnNvciYpOworI2VuZGlmCisKKyAgICB2aXJ0dWFsIFFQYWxldHRlIHBhbGV0dGUoKSBjb25z
dDsKKyAgICB2aXJ0dWFsIGludCBzY3JlZW5OdW1iZXIoKSBjb25zdDsKKyAgICB2aXJ0dWFsIFFP
YmplY3QqIG93bmVyV2lkZ2V0KCkgY29uc3Q7CisgICAgdmlydHVhbCBRUmVjdCBnZW9tZXRyeVJl
bGF0aXZlVG9Pd25lcldpZGdldCgpIGNvbnN0OworCisgICAgdmlydHVhbCBRT2JqZWN0KiBwbHVn
aW5QYXJlbnQoKSBjb25zdDsKKworICAgIHZpcnR1YWwgUVN0eWxlKiBzdHlsZSgpIGNvbnN0Owor
CisgICAgdmlydHVhbCBib29sIHZpZXdSZXNpemVzVG9Db250ZW50c0VuYWJsZWQoKSBjb25zdCB7
IHJldHVybiBmYWxzZTsgfQorCisgICAgdmlydHVhbCBRUmVjdEYgd2luZG93UmVjdCgpIGNvbnN0
OworCisgICAgdmlydHVhbCB2b2lkIHNldFdpZGdldFZpc2libGUoV2lkZ2V0KiwgYm9vbCB2aXNp
YmxlKTsKKworICAgIFFXaWRnZXQqIHZpZXc7CisgICAgUVdlYlBhZ2UqIHBhZ2U7Cit9OworCisj
aWYgIWRlZmluZWQoUVRfTk9fR1JBUEhJQ1NWSUVXKQorLy8gdGhlIG92ZXJsYXkgaXMgaGVyZSBm
b3Igb25lIHJlYXNvbiBvbmx5OiB0byBoYXZlIHRoZSBzY3JvbGwtYmFycyBhbmQgb3RoZXIKKy8v
IGV4dHJhIFVJIGVsZW1lbnRzIGFwcGVhciBvbiB0b3Agb2YgYW55IFFHcmFwaGljc0l0ZW1zIGNy
ZWF0ZWQgYnkgQ1NTIGNvbXBvc2l0aW5nIGxheWVycworY2xhc3MgUUdyYXBoaWNzSXRlbU92ZXJs
YXkgOiBwdWJsaWMgUUdyYXBoaWNzT2JqZWN0IHsKKyAgICBwdWJsaWM6CisgICAgUUdyYXBoaWNz
SXRlbU92ZXJsYXkoUUdyYXBoaWNzV2lkZ2V0KiB2aWV3LCBRV2ViUGFnZSogcCkKKyAgICAgICAg
OiBRR3JhcGhpY3NPYmplY3QodmlldykKKyAgICAgICAgLCBxKHZpZXcpCisgICAgICAgICwgcGFn
ZShwKQorICAgIHsKKyAgICAgICAgc2V0UG9zKDAsIDApOworICAgICAgICBzZXRGbGFnKFFHcmFw
aGljc0l0ZW06Okl0ZW1Vc2VzRXh0ZW5kZWRTdHlsZU9wdGlvbiwgdHJ1ZSk7CisgICAgICAgIHNl
dENhY2hlTW9kZShRR3JhcGhpY3NJdGVtOjpEZXZpY2VDb29yZGluYXRlQ2FjaGUpOworICAgIH0K
KworICAgIFFSZWN0RiBib3VuZGluZ1JlY3QoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJu
IHEtPmJvdW5kaW5nUmVjdCgpOworICAgIH0KKworICAgIHZvaWQgcGFpbnQoUVBhaW50ZXIqIHBh
aW50ZXIsIGNvbnN0IFFTdHlsZU9wdGlvbkdyYXBoaWNzSXRlbSogb3B0aW9ucywgUVdpZGdldCop
CisgICAgeworICAgICAgICBwYWdlLT5tYWluRnJhbWUoKS0+cmVuZGVyKHBhaW50ZXIsIHN0YXRp
Y19jYXN0PFFXZWJGcmFtZTo6UmVuZGVyTGF5ZXI+KFFXZWJGcmFtZTo6QWxsTGF5ZXJzJih+UVdl
YkZyYW1lOjpDb250ZW50c0xheWVyKSksIG9wdGlvbnMtPmV4cG9zZWRSZWN0LnRvUmVjdCgpKTsK
KyAgICB9CisKKyAgICB2b2lkIHByZXBhcmVHcmFwaGljc0l0ZW1HZW9tZXRyeUNoYW5nZSgpCisg
ICAgeworICAgICAgICBwcmVwYXJlR2VvbWV0cnlDaGFuZ2UoKTsKKyAgICB9CisKKyAgICBRR3Jh
cGhpY3NXaWRnZXQqIHE7CisgICAgUVdlYlBhZ2UqIHBhZ2U7Cit9OworCisKK2NsYXNzIFBhZ2VD
bGllbnRRR3JhcGhpY3NXaWRnZXQgOiBwdWJsaWMgUVdlYlBhZ2VDbGllbnQgeworcHVibGljOgor
ICAgIFBhZ2VDbGllbnRRR3JhcGhpY3NXaWRnZXQoUUdyYXBoaWNzV2ViVmlldyogbmV3Vmlldywg
UVdlYlBhZ2UqIG5ld1BhZ2UpCisgICAgICAgIDogdmlldyhuZXdWaWV3KQorICAgICAgICAsIHBh
Z2UobmV3UGFnZSkKKyAgICAgICAgLCB2aWV3UmVzaXplc1RvQ29udGVudHMoZmFsc2UpCisgICAg
ICAgICwgb3ZlcmxheSgwKQorICAgIHsKKyAgICAgICAgUV9BU1NFUlQodmlldyk7CisjaWYgVVNF
KEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgICAgICAvLyB0aGUgb3ZlcmxheSBhbmQgc3Rh
eXMgYWxpdmUgZm9yIHRoZSBsaWZldGltZSBvZgorICAgICAgICAvLyB0aGlzIFFHcmFwaGljc1dl
YlZpZXcgYXMgdGhlIHNjcm9sbGJhcnMgYXJlIG5lZWRlZCB3aGVuIHRoZXJlJ3Mgbm8gY29tcG9z
aXRpbmcKKyAgICAgICAgdmlldy0+c2V0RmxhZyhRR3JhcGhpY3NJdGVtOjpJdGVtVXNlc0V4dGVu
ZGVkU3R5bGVPcHRpb24pOworI2VuZGlmCisgICAgfQorCisgICAgdmlydHVhbCB+UGFnZUNsaWVu
dFFHcmFwaGljc1dpZGdldCgpOworCisgICAgdmlydHVhbCBib29sIGlzUVdpZGdldENsaWVudCgp
IGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICB2aXJ0dWFsIHZvaWQgc2Nyb2xsKGludCBk
eCwgaW50IGR5LCBjb25zdCBRUmVjdCYpOworICAgIHZpcnR1YWwgdm9pZCB1cGRhdGUoY29uc3Qg
UVJlY3QmIGRpcnR5UmVjdCk7CisgICAgdmlydHVhbCB2b2lkIHJlcGFpbnRWaWV3cG9ydCgpOwor
ICAgIHZpcnR1YWwgdm9pZCBzZXRJbnB1dE1ldGhvZEVuYWJsZWQoYm9vbCk7CisgICAgdmlydHVh
bCBib29sIGlucHV0TWV0aG9kRW5hYmxlZCgpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBzZXRJ
bnB1dE1ldGhvZEhpbnRzKFF0OjpJbnB1dE1ldGhvZEhpbnRzKTsKKworI2lmbmRlZiBRVF9OT19D
VVJTT1IKKyAgICB2aXJ0dWFsIFFDdXJzb3IgY3Vyc29yKCkgY29uc3Q7CisgICAgdmlydHVhbCB2
b2lkIHVwZGF0ZUN1cnNvcihjb25zdCBRQ3Vyc29yJik7CisjZW5kaWYKKworICAgIHZpcnR1YWwg
UVBhbGV0dGUgcGFsZXR0ZSgpIGNvbnN0OworICAgIHZpcnR1YWwgaW50IHNjcmVlbk51bWJlcigp
IGNvbnN0OworICAgIHZpcnR1YWwgUU9iamVjdCogb3duZXJXaWRnZXQoKSBjb25zdDsKKyAgICB2
aXJ0dWFsIFFSZWN0IGdlb21ldHJ5UmVsYXRpdmVUb093bmVyV2lkZ2V0KCkgY29uc3Q7CisKKyAg
ICB2aXJ0dWFsIFFPYmplY3QqIHBsdWdpblBhcmVudCgpIGNvbnN0OworCisgICAgdmlydHVhbCBR
U3R5bGUqIHN0eWxlKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIGJvb2wgdmlld1Jlc2l6ZXNUb0Nv
bnRlbnRzRW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIHZpZXdSZXNpemVzVG9Db250ZW50czsgfQor
CisgICAgdmlydHVhbCB2b2lkIHNldFdpZGdldFZpc2libGUoV2lkZ2V0KiwgYm9vbCk7CisKKyNp
ZiBVU0UoVElMRURfQkFDS0lOR19TVE9SRSkKKyAgICB2aXJ0dWFsIFFSZWN0RiBncmFwaGljc0l0
ZW1WaXNpYmxlUmVjdCgpIGNvbnN0OworI2VuZGlmCisKKyAgICB2aXJ0dWFsIGJvb2wgbWFrZU9w
ZW5HTENvbnRleHRDdXJyZW50SWZBdmFpbGFibGUoKTsKKworICAgIHZpcnR1YWwgUVJlY3RGIHdp
bmRvd1JlY3QoKSBjb25zdDsKKworICAgIFFHcmFwaGljc1dlYlZpZXcqIHZpZXc7CisgICAgUVdl
YlBhZ2UqIHBhZ2U7CisgICAgYm9vbCB2aWV3UmVzaXplc1RvQ29udGVudHM7CisKKyAgICAvLyB0
aGUgb3ZlcmxheSBnZXRzIGluc3RhbnRpYXRlZCB3aGVuIHRoZSByb290IGxheWVyIGlzIGF0dGFj
aGVkLCBhbmQgZ2V0IGRlbGV0ZWQgd2hlbiBpdCdzIGRldGFjaGVkCisgICAgUUdyYXBoaWNzSXRl
bU92ZXJsYXkqIG92ZXJsYXk7CisKKyAgICAvLyB3ZSBuZWVkIHRvIHB1dCB0aGUgcm9vdCBncmFw
aGljcyBsYXllciBiZWhpbmQgdGhlIG92ZXJsYXkgKHdoaWNoIGNvbnRhaW5zIHRoZSBzY3JvbGxi
YXIpCisgICAgZW51bSB7IFJvb3RHcmFwaGljc0xheWVyWlZhbHVlLCBPdmVybGF5WlZhbHVlIH07
Cit9OworI2VuZGlmIC8vIFFUX05PX0dSQVBISUNTVklFVworCit9CisjZW5kaWYgLy8gUGFnZUNs
aWVudFF0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldFN1cHBvcnQvUUdyYXBo
aWNzV2lkZ2V0UGx1Z2luSW1wbC5jcHAgYi9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldFN1cHBvcnQv
UUdyYXBoaWNzV2lkZ2V0UGx1Z2luSW1wbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNTEzNzkzM2EwZmFhZTc0
ZDUyN2UxOTc3MzM4ZGUzNjVhMjM3NTVkZgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJL
aXQvcXQvV2lkZ2V0U3VwcG9ydC9RR3JhcGhpY3NXaWRnZXRQbHVnaW5JbXBsLmNwcApAQCAtMCww
ICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIERpZ2lhIFBsYyBhbmQvb3IgaXRz
IHN1YnNpZGlhcnkoLWllcykuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7
IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0
ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVi
bGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lv
biAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9u
LgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0
IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2
ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVy
YWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhh
dmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNl
bnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElC
LiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5j
LiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAt
MTMwMSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUUdy
YXBoaWNzV2lkZ2V0UGx1Z2luSW1wbC5oIgorCisjaW5jbHVkZSA8UUdyYXBoaWNzU2NlbmU+Cisj
aW5jbHVkZSA8UUdyYXBoaWNzV2lkZ2V0PgorCisjaWZuZGVmIFFUX05PX0dSQVBISUNTVklFVwor
CitRR3JhcGhpY3NXaWRnZXRQbHVnaW5JbXBsOjp+UUdyYXBoaWNzV2lkZ2V0UGx1Z2luSW1wbCgp
Cit7CisgICAgbV9ncmFwaGljc1dpZGdldC0+ZGVsZXRlTGF0ZXIoKTsKK30KKwordm9pZCBRR3Jh
cGhpY3NXaWRnZXRQbHVnaW5JbXBsOjp1cGRhdGUoY29uc3QgUVJlY3QgJnJlY3QpCit7CisgICAg
UUdyYXBoaWNzU2NlbmUqIHNjZW5lID0gbV9ncmFwaGljc1dpZGdldC0+c2NlbmUoKTsKKyAgICBp
ZiAoc2NlbmUpCisgICAgICAgIHNjZW5lLT51cGRhdGUocmVjdCk7Cit9CisKK3ZvaWQgUUdyYXBo
aWNzV2lkZ2V0UGx1Z2luSW1wbDo6c2V0R2VvbWV0cnlBbmRDbGlwKGNvbnN0IFFSZWN0ICZnZW9t
ZXRyeSwgY29uc3QgUVJlY3QgJiwgYm9vbCkKK3sKKyAgICBtX2dyYXBoaWNzV2lkZ2V0LT5zZXRH
ZW9tZXRyeShnZW9tZXRyeSk7CisgICAgLy8gRklYTUU6IE1ha2UgdGhlIGNvZGUgaGFuZGxlIGNs
aXBwaW5nIG9mIGdyYXBoaWNzIHdpZGdldHMuCit9CisKK3ZvaWQgUUdyYXBoaWNzV2lkZ2V0UGx1
Z2luSW1wbDo6c2V0VmlzaWJsZShib29sIHZpc2libGUpCit7CisgICAgbV9ncmFwaGljc1dpZGdl
dC0+c2V0VmlzaWJsZSh2aXNpYmxlKTsKK30KKwordm9pZCBRR3JhcGhpY3NXaWRnZXRQbHVnaW5J
bXBsOjpzZXRXaWRnZXRQYXJlbnQoUU9iamVjdCogcGFyZW50KQoreworICAgIFFHcmFwaGljc09i
amVjdCogcGFyZW50SXRlbSA9IHFvYmplY3RfY2FzdDxRR3JhcGhpY3NPYmplY3QqPihwYXJlbnQp
OworICAgIGlmIChwYXJlbnRJdGVtKQorICAgICAgICBtX2dyYXBoaWNzV2lkZ2V0LT5zZXRQYXJl
bnRJdGVtKHBhcmVudEl0ZW0pOworfQorCitRT2JqZWN0KiBRR3JhcGhpY3NXaWRnZXRQbHVnaW5J
bXBsOjpoYW5kbGUoKSBjb25zdAoreworICAgIHJldHVybiBtX2dyYXBoaWNzV2lkZ2V0OworfQor
CisjaW5jbHVkZSAibW9jX1FHcmFwaGljc1dpZGdldFBsdWdpbkltcGwuY3BwIgorCisjZW5kaWYg
Ly8gIWRlZmluZWQoUVRfTk9fR1JBUEhJQ1NWSUVXKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktp
dC9xdC9XaWRnZXRTdXBwb3J0L1FHcmFwaGljc1dpZGdldFBsdWdpbkltcGwuaCBiL1NvdXJjZS9X
ZWJLaXQvcXQvV2lkZ2V0U3VwcG9ydC9RR3JhcGhpY3NXaWRnZXRQbHVnaW5JbXBsLmgKbmV3IGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMC4uN2Y3NTgyMjZjNGY4MGYzYmY0MGE1NWRmYjY5OWM1ZTg0ZmJhOTIzZQotLS0gL2Rldi9u
dWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvcXQvV2lkZ2V0U3VwcG9ydC9RR3JhcGhpY3NXaWRnZXRQ
bHVnaW5JbXBsLmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBE
aWdpYSBQbGMgYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpLgorICoKKyAqIFRoaXMgbGlicmFy
eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1v
ZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
CisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
OyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9u
KSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQg
aW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBX
QVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFO
VEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdO
VQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisg
KgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0
aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisg
KiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKyNpZm5kZWYgUUdyYXBoaWNz
V2lkZ2V0UGx1Z2luSW1wbF9oCisjZGVmaW5lIFFHcmFwaGljc1dpZGdldFBsdWdpbkltcGxfaAor
CisjaWZuZGVmIFFUX05PX0dSQVBISUNTVklFVworCisjaW5jbHVkZSAiUXRQbHVnaW5XaWRnZXRB
ZGFwdGVyLmgiCisKK1FUX0JFR0lOX05BTUVTUEFDRQorY2xhc3MgUUdyYXBoaWNzV2lkZ2V0Owor
UVRfRU5EX05BTUVTUEFDRQorCitjbGFzcyBRR3JhcGhpY3NXaWRnZXRQbHVnaW5JbXBsIDogcHVi
bGljIFF0UGx1Z2luV2lkZ2V0QWRhcHRlciB7CisgICAgUV9PQkpFQ1QKK3B1YmxpYzoKKyAgICBR
R3JhcGhpY3NXaWRnZXRQbHVnaW5JbXBsKFFHcmFwaGljc1dpZGdldCAqdykgOiBtX2dyYXBoaWNz
V2lkZ2V0KHcpIHsgfQorICAgIHZpcnR1YWwgflFHcmFwaGljc1dpZGdldFBsdWdpbkltcGwoKTsK
KyAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlKGNvbnN0IFFSZWN0ICYpIE9WRVJSSURFOworICAgIHZp
cnR1YWwgdm9pZCBzZXRHZW9tZXRyeUFuZENsaXAoY29uc3QgUVJlY3QmLCBjb25zdCBRUmVjdCYs
IGJvb2wpIE9WRVJSSURFOworICAgIHZpcnR1YWwgdm9pZCBzZXRWaXNpYmxlKGJvb2wpOworICAg
IHZpcnR1YWwgdm9pZCBzZXRTdHlsZVNoZWV0KGNvbnN0IFFTdHJpbmcmKSBPVkVSUklERSB7IH0K
KyAgICB2aXJ0dWFsIHZvaWQgc2V0V2lkZ2V0UGFyZW50KFFPYmplY3QqKSBPVkVSUklERTsKKyAg
ICB2aXJ0dWFsIFFPYmplY3QqIGhhbmRsZSgpIGNvbnN0IE9WRVJSSURFOworcHJpdmF0ZToKKyAg
ICBRR3JhcGhpY3NXaWRnZXQgKm1fZ3JhcGhpY3NXaWRnZXQ7Cit9OworI2VuZGlmIC8vICFkZWZp
bmVkKFFUX05PX0dSQVBISUNTVklFVykKKworI2VuZGlmIC8vIFFHcmFwaGljc1dpZGdldFBsdWdp
bkltcGxfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9XaWRnZXRTdXBwb3J0L1FTdHls
ZUZhY2FkZUltcC5jcHAgYi9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldFN1cHBvcnQvUVN0eWxlRmFj
YWRlSW1wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5iZDZiZTFlNDc2YTk3NDM2N2ViYjJhMjliZjlkMWRkYzg5
MDZhMTM0Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9xdC9XaWRnZXRTdXBwb3J0
L1FTdHlsZUZhY2FkZUltcC5jcHAKQEAgLTAsMCArMSw1MDIgQEAKKy8qCisgKiBUaGlzIGZpbGUg
aXMgcGFydCBvZiB0aGUgdGhlbWUgaW1wbGVtZW50YXRpb24gZm9yIGZvcm0gY29udHJvbHMgaW4g
V2ViQ29yZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgRGlnaWEgUGxjIGFuZC9vciBpdHMg
c3Vic2lkaWFyeSgtaWVzKS4KKyAqIENvcHlyaWdodCAoQykgMjAxMS0yMDEyIE5va2lhIENvcnBv
cmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKS4KKyAqCisgKiBUaGlzIGxpYnJhcnkg
aXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2Rp
ZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwor
ICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsg
ZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikg
YW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGlu
IHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FS
UkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRB
QklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUK
KyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoK
KyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhl
IGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2Fy
ZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICog
Qm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlICJjb25maWcu
aCIKKworI2luY2x1ZGUgIlFTdHlsZUZhY2FkZUltcC5oIgorCisjaW5jbHVkZSA8UUFwcGxpY2F0
aW9uPgorI2luY2x1ZGUgPFFMaW5lRWRpdD4KKyNpbmNsdWRlIDxRUGFpbnRlcj4KKyNpbmNsdWRl
IDxRUHVzaEJ1dHRvbj4KKyNpbmNsdWRlIDxRU3R5bGVGYWN0b3J5PgorI2luY2x1ZGUgPFFTdHls
ZU9wdGlvbj4KKworI2luY2x1ZGUgPFFXZWJQYWdlQWRhcHRlci5oPgorI2luY2x1ZGUgPFFXZWJQ
YWdlQ2xpZW50Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOworCituYW1lc3BhY2UgV2Vi
S2l0IHsKKworc3RhdGljIFFTdHlsZTo6U3RhdGUgY29udmVydFRvUVN0eWxlU3RhdGUoUVN0eWxl
RmFjYWRlOjpTdGF0ZSBzdGF0ZSkKK3sKKyAgICBRU3R5bGU6OlN0YXRlIHJlc3VsdDsKKyNkZWZp
bmUgQ09OVkVSVF9TVEFURShQcm94aWVkU3RhdGUsIFZhbHVlKSBcCisgICAgaWYgKHN0YXRlICYg
UVN0eWxlRmFjYWRlOjpQcm94aWVkU3RhdGUpIFwKKyAgICAgICAgcmVzdWx0IHw9IFFTdHlsZTo6
UHJveGllZFN0YXRlOworCisgICAgRk9SX0VBQ0hfTUFQUEVEX1NUQVRFKENPTlZFUlRfU1RBVEUs
ICkKKworI3VuZGVmIENPTlZFUlRfU1RBVEUKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0
YXRpYyBRU3R5bGU6OlN1YkNvbnRyb2wgY29udmVydFRvUVN0eWxlU3ViQ29udHJvbChRU3R5bGVG
YWNhZGU6OlN1YkNvbnRyb2wgc2MpCit7CisjZGVmaW5lIENPTlZFUlRfU1VCQ09OVFJPTChGLCBW
YWx1ZSkgXAorICAgIGNhc2UgUVN0eWxlRmFjYWRlOjpGOiByZXR1cm4gUVN0eWxlOjpGCisKKyAg
ICBzd2l0Y2ggKHNjKSB7CisgICAgICAgIEZPUl9FQUNIX1NVQkNPTlRST0woQ09OVkVSVF9TVUJD
T05UUk9MLCBTRU1JQ09MT04pOworICAgIH0KKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAg
ICByZXR1cm4gUVN0eWxlOjpTQ19Ob25lOworI3VuZGVmIENPTlZFUlRfU1VCQ09OVFJPTAorfQor
CitzdGF0aWMgdm9pZCBpbml0R2VuZXJpY1N0eWxlT3B0aW9uKFFTdHlsZU9wdGlvbiogb3B0aW9u
LCBRV2lkZ2V0KiB3aWRnZXQsIGNvbnN0IFFTdHlsZUZhY2FkZU9wdGlvbiYgZmFjYWRlT3B0aW9u
KQoreworICAgIGlmICh3aWRnZXQpCisgICAgICAgIG9wdGlvbi0+aW5pdCh3aWRnZXQpOworICAg
IGVsc2UKKyAgICAgICAgLy8gSWYgYSB3aWRnZXQgaXMgbm90IGRpcmVjdGx5IGF2YWlsYWJsZSBm
b3IgcmVuZGVyaW5nLCB3ZSBmYWxsYmFjayB0byBkZWZhdWx0CisgICAgICAgIC8vIHZhbHVlIGZv
ciBhbiBhY3RpdmUgd2lkZ2V0LgorICAgICAgICBvcHRpb24tPnN0YXRlID0gUVN0eWxlOjpTdGF0
ZV9BY3RpdmUgfCBRU3R5bGU6OlN0YXRlX0VuYWJsZWQ7CisKKyAgICBvcHRpb24tPnJlY3QgPSBm
YWNhZGVPcHRpb24ucmVjdDsKKyAgICBvcHRpb24tPnN0YXRlID0gY29udmVydFRvUVN0eWxlU3Rh
dGUoZmFjYWRlT3B0aW9uLnN0YXRlKTsKKyAgICBvcHRpb24tPmRpcmVjdGlvbiA9IGZhY2FkZU9w
dGlvbi5kaXJlY3Rpb247CisgICAgb3B0aW9uLT5wYWxldHRlID0gZmFjYWRlT3B0aW9uLnBhbGV0
dGU7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRTcGVjaWZpY1N0eWxlT3B0aW9uKFFTdHlsZU9wdGlv
biosIGNvbnN0IFFTdHlsZUZhY2FkZU9wdGlvbiYpCit7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRT
cGVjaWZpY1N0eWxlT3B0aW9uKFFTdHlsZU9wdGlvblNsaWRlciogc2xpZGVyT3B0aW9uLCBjb25z
dCBRU3R5bGVGYWNhZGVPcHRpb24mIGZhY2FkZU9wdGlvbikKK3sKKyAgICBzbGlkZXJPcHRpb24t
Pm9yaWVudGF0aW9uID0gZmFjYWRlT3B0aW9uLnNsaWRlci5vcmllbnRhdGlvbjsKKyAgICBzbGlk
ZXJPcHRpb24tPnVwc2lkZURvd24gPSBmYWNhZGVPcHRpb24uc2xpZGVyLnVwc2lkZURvd247Cisg
ICAgc2xpZGVyT3B0aW9uLT5taW5pbXVtID0gZmFjYWRlT3B0aW9uLnNsaWRlci5taW5pbXVtOwor
ICAgIHNsaWRlck9wdGlvbi0+bWF4aW11bSA9IGZhY2FkZU9wdGlvbi5zbGlkZXIubWF4aW11bTsK
KyAgICBzbGlkZXJPcHRpb24tPnNsaWRlclBvc2l0aW9uID0gZmFjYWRlT3B0aW9uLnNsaWRlci5w
b3NpdGlvbjsKKyAgICBzbGlkZXJPcHRpb24tPnNsaWRlclZhbHVlID0gZmFjYWRlT3B0aW9uLnNs
aWRlci52YWx1ZTsKKyAgICBzbGlkZXJPcHRpb24tPnNpbmdsZVN0ZXAgPSBmYWNhZGVPcHRpb24u
c2xpZGVyLnNpbmdsZVN0ZXA7CisgICAgc2xpZGVyT3B0aW9uLT5wYWdlU3RlcCA9IGZhY2FkZU9w
dGlvbi5zbGlkZXIucGFnZVN0ZXA7CisgICAgc2xpZGVyT3B0aW9uLT5hY3RpdmVTdWJDb250cm9s
cyA9IGNvbnZlcnRUb1FTdHlsZVN1YkNvbnRyb2woZmFjYWRlT3B0aW9uLnNsaWRlci5hY3RpdmVT
dWJDb250cm9scyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTdHlsZU9wdGlvbj4KK2NsYXNz
IE1hcHBlZFN0eWxlT3B0aW9uIDogcHVibGljIFN0eWxlT3B0aW9uIHsKKworcHVibGljOgorICAg
IE1hcHBlZFN0eWxlT3B0aW9uKFFXaWRnZXQqIHdpZGdldCwgY29uc3QgUVN0eWxlRmFjYWRlT3B0
aW9uJiBmYWNhZGVPcHRpb24pCisgICAgeworICAgICAgICBpbml0R2VuZXJpY1N0eWxlT3B0aW9u
KHRoaXMsIHdpZGdldCwgZmFjYWRlT3B0aW9uKTsKKyAgICAgICAgaW5pdFNwZWNpZmljU3R5bGVP
cHRpb24odGhpcywgZmFjYWRlT3B0aW9uKTsKKyAgICB9Cit9OworCitzdGF0aWMgUVN0eWxlOjpQ
aXhlbE1ldHJpYyBjb252ZXJ0UGl4ZWxNZXRyaWMoUVN0eWxlRmFjYWRlOjpQaXhlbE1ldHJpYyBz
dGF0ZSkKK3sKKyNkZWZpbmUgQ09OVkVSVF9NRVRSSUMoTWV0cmljKSBcCisgICAgY2FzZSBRU3R5
bGVGYWNhZGU6Ok1ldHJpYzogcmV0dXJuIFFTdHlsZTo6TWV0cmljCisKKyAgICBzd2l0Y2ggKHN0
YXRlKSB7CisgICAgICAgIEZPUl9FQUNIX01BUFBFRF9NRVRSSUMoQ09OVkVSVF9NRVRSSUMsIFNF
TUlDT0xPTik7CisgICAgfQorICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiBR
U3R5bGU6OlBNX0N1c3RvbUJhc2U7CisKKyN1bmRlZiBDT05WRVJUX01FVFJJQworfQorCitzdGF0
aWMgUVN0eWxlRmFjYWRlOjpTdWJDb250cm9sIGNvbnZlcnRUb1FTdHlsZUZhY2FkZVN1YkNvbnRy
b2woUVN0eWxlOjpTdWJDb250cm9sIHNjKQoreworI2RlZmluZSBDT05WRVJUX1NVQkNPTlRST0wo
RiwgVmFsdWUpIFwKKyAgICBjYXNlIFFTdHlsZTo6RjogcmV0dXJuIFFTdHlsZUZhY2FkZTo6Rgor
CisgICAgc3dpdGNoIChzYykgeworICAgICAgICBGT1JfRUFDSF9TVUJDT05UUk9MKENPTlZFUlRf
U1VCQ09OVFJPTCwgU0VNSUNPTE9OKTsKKyAgICB9CisgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7
CisgICAgcmV0dXJuIFFTdHlsZUZhY2FkZTo6U0NfTm9uZTsKKyN1bmRlZiBDT05WRVJUX1NVQkNP
TlRST0wKK30KKworUVN0eWxlRmFjYWRlSW1wOjpRU3R5bGVGYWNhZGVJbXAoUVdlYlBhZ2VBZGFw
dGVyKiBwYWdlKQorICAgIDogbV9wYWdlKHBhZ2UpCisgICAgLCBtX3N0eWxlKDApCit7CisgICAg
bV9mYWxsYmFja1N0eWxlID0gUVN0eWxlRmFjdG9yeTo6Y3JlYXRlKFFMYXRpbjFTdHJpbmcoIndp
bmRvd3MiKSk7CisgICAgbV9vd25GYWxsYmFja1N0eWxlID0gdHJ1ZTsKKyAgICBpZiAoIW1fZmFs
bGJhY2tTdHlsZSkgeworICAgICAgICBtX2ZhbGxiYWNrU3R5bGUgPSBRQXBwbGljYXRpb246OnN0
eWxlKCk7CisgICAgICAgIG1fb3duRmFsbGJhY2tTdHlsZSA9IGZhbHNlOworICAgIH0KK30KKwor
UVN0eWxlRmFjYWRlSW1wOjp+UVN0eWxlRmFjYWRlSW1wKCkKK3sKKyAgICBpZiAobV9vd25GYWxs
YmFja1N0eWxlKQorICAgICAgICBkZWxldGUgbV9mYWxsYmFja1N0eWxlOworfQorCitRUmVjdCBR
U3R5bGVGYWNhZGVJbXA6OmJ1dHRvblN1YkVsZW1lbnRSZWN0KFFTdHlsZUZhY2FkZTo6QnV0dG9u
U3ViRWxlbWVudCBidXR0b25FbGVtZW50LCBTdGF0ZSBzdGF0ZSwgY29uc3QgUVJlY3QmIG9yaWdp
bmFsUmVjdCkgY29uc3QKK3sKKyAgICBRU3R5bGVPcHRpb25CdXR0b24gb3B0aW9uOworICAgIG9w
dGlvbi5zdGF0ZSA9IGNvbnZlcnRUb1FTdHlsZVN0YXRlKHN0YXRlKTsKKyAgICBvcHRpb24ucmVj
dCA9IG9yaWdpbmFsUmVjdDsKKworICAgIFFTdHlsZTo6U3ViRWxlbWVudCBzdWJFbGVtZW50ID0g
UVN0eWxlOjpTRV9DdXN0b21CYXNlOworICAgIHN3aXRjaCAoYnV0dG9uRWxlbWVudCkgeworICAg
IGNhc2UgUHVzaEJ1dHRvbkxheW91dEl0ZW06IHN1YkVsZW1lbnQgPSBRU3R5bGU6OlNFX1B1c2hC
dXR0b25MYXlvdXRJdGVtOyBicmVhazsKKyAgICBjYXNlIFB1c2hCdXR0b25Db250ZW50czogc3Vi
RWxlbWVudCA9IFFTdHlsZTo6U0VfUHVzaEJ1dHRvbkNvbnRlbnRzOyBicmVhazsKKyAgICBkZWZh
dWx0OiBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICB9CisgICAgcmV0dXJuIHN0eWxlKCktPnN1
YkVsZW1lbnRSZWN0KHN1YkVsZW1lbnQsICZvcHRpb24pOworfQorCitpbnQgUVN0eWxlRmFjYWRl
SW1wOjpmaW5kRnJhbWVMaW5lV2lkdGgoKSBjb25zdAoreworICAgIGlmICghbV9saW5lRWRpdCkK
KyAgICAgICAgbV9saW5lRWRpdC5yZXNldChuZXcgUUxpbmVFZGl0KCkpOworCisgICAgcmV0dXJu
IHN0eWxlKCktPnBpeGVsTWV0cmljKFFTdHlsZTo6UE1fRGVmYXVsdEZyYW1lV2lkdGgsIDAsIG1f
bGluZUVkaXQuZGF0YSgpKTsKK30KKworaW50IFFTdHlsZUZhY2FkZUltcDo6c2ltcGxlUGl4ZWxN
ZXRyaWMoUVN0eWxlRmFjYWRlOjpQaXhlbE1ldHJpYyBtZXRyaWMsIFN0YXRlIHN0YXRlKSBjb25z
dAoreworICAgIFFTdHlsZU9wdGlvbiBvcHQ7CisgICAgb3B0LnN0YXRlID0gY29udmVydFRvUVN0
eWxlU3RhdGUoc3RhdGUpOworICAgIHJldHVybiBzdHlsZSgpLT5waXhlbE1ldHJpYyhjb252ZXJ0
UGl4ZWxNZXRyaWMobWV0cmljKSwgJm9wdCwgMCk7Cit9CisKK2ludCBRU3R5bGVGYWNhZGVJbXA6
OmJ1dHRvbk1hcmdpbihTdGF0ZSBzdGF0ZSwgY29uc3QgUVJlY3QmIG9yaWdpbmFsUmVjdCkgY29u
c3QKK3sKKyAgICBRU3R5bGVPcHRpb25CdXR0b24gc3R5bGVPcHRpb247CisgICAgc3R5bGVPcHRp
b24uc3RhdGUgPSBjb252ZXJ0VG9RU3R5bGVTdGF0ZShzdGF0ZSk7CisgICAgc3R5bGVPcHRpb24u
cmVjdCA9IG9yaWdpbmFsUmVjdDsKKyAgICByZXR1cm4gc3R5bGUoKS0+cGl4ZWxNZXRyaWMoUVN0
eWxlOjpQTV9CdXR0b25NYXJnaW4sICZzdHlsZU9wdGlvbiwgMCk7Cit9CisKK2ludCBRU3R5bGVG
YWNhZGVJbXA6OnNsaWRlckxlbmd0aChRdDo6T3JpZW50YXRpb24gb3JpZW50YXRpb24pIGNvbnN0
Cit7CisgICAgUVN0eWxlT3B0aW9uU2xpZGVyIG9wdDsKKyAgICBvcHQub3JpZW50YXRpb24gPSBv
cmllbnRhdGlvbjsKKyAgICByZXR1cm4gc3R5bGUoKS0+cGl4ZWxNZXRyaWMoUVN0eWxlOjpQTV9T
bGlkZXJMZW5ndGgsICZvcHQpOworfQorCitpbnQgUVN0eWxlRmFjYWRlSW1wOjpzbGlkZXJUaGlj
a25lc3MoUXQ6Ok9yaWVudGF0aW9uIG9yaWVudGF0aW9uKSBjb25zdAoreworICAgIFFTdHlsZU9w
dGlvblNsaWRlciBvcHQ7CisgICAgb3B0Lm9yaWVudGF0aW9uID0gb3JpZW50YXRpb247CisgICAg
cmV0dXJuIHN0eWxlKCktPnBpeGVsTWV0cmljKFFTdHlsZTo6UE1fU2xpZGVyVGhpY2tuZXNzLCAm
b3B0KTsKK30KKworaW50IFFTdHlsZUZhY2FkZUltcDo6cHJvZ3Jlc3NCYXJDaHVua1dpZHRoKGNv
bnN0IFFTaXplJiBzaXplKSBjb25zdAoreworICAgIFFTdHlsZU9wdGlvblByb2dyZXNzQmFyVjIg
b3B0aW9uOworICAgIG9wdGlvbi5yZWN0LnNldFNpemUoc2l6ZSk7CisgICAgLy8gRklYTUU6IFVu
dGlsIGh0dHA6Ly9idWdyZXBvcnRzLnF0Lm5va2lhLmNvbS9icm93c2UvUVRCVUctOTE3MSBpcyBm
aXhlZCwKKyAgICAvLyB3ZSBzaW11bGF0ZSBvbmUgc3F1YXJlIGFuaW1hdGluZyBhY3Jvc3MgdGhl
IHByb2dyZXNzIGJhci4KKyAgICByZXR1cm4gc3R5bGUoKS0+cGl4ZWxNZXRyaWMoUVN0eWxlOjpQ
TV9Qcm9ncmVzc0JhckNodW5rV2lkdGgsICZvcHRpb24pOworfQorCit2b2lkIFFTdHlsZUZhY2Fk
ZUltcDo6Z2V0QnV0dG9uTWV0cmljcyhRU3RyaW5nICpidXR0b25Gb250RmFtaWx5LCBpbnQgKmJ1
dHRvbkZvbnRQaXhlbFNpemUpIGNvbnN0Cit7CisgICAgUVB1c2hCdXR0b24gYnV0dG9uOworICAg
IFFGb250IGRlZmF1bHRCdXR0b25Gb250ID0gUUFwcGxpY2F0aW9uOjpmb250KCZidXR0b24pOwor
ICAgICpidXR0b25Gb250RmFtaWx5ID0gZGVmYXVsdEJ1dHRvbkZvbnQuZmFtaWx5KCk7CisgICAg
KmJ1dHRvbkZvbnRQaXhlbFNpemUgPSAwOworI2lmZGVmIFFfT1NfTUFDCisgICAgYnV0dG9uLnNl
dEF0dHJpYnV0ZShRdDo6V0FfTWFjU21hbGxTaXplKTsKKyAgICBRRm9udEluZm8gZm9udEluZm8o
ZGVmYXVsdEJ1dHRvbkZvbnQpOworICAgICpidXR0b25Gb250UGl4ZWxTaXplID0gZm9udEluZm8u
cGl4ZWxTaXplKCk7CisjZW5kaWYKK30KKworUVNpemUgUVN0eWxlRmFjYWRlSW1wOjpjb21ib0Jv
eFNpemVGcm9tQ29udGVudHMoU3RhdGUgc3RhdGUsIGNvbnN0IFFTaXplJiBjb250ZW50c1NpemUp
IGNvbnN0Cit7CisgICAgUVN0eWxlT3B0aW9uQ29tYm9Cb3ggb3B0OworICAgIG9wdC5zdGF0ZSA9
IGNvbnZlcnRUb1FTdHlsZVN0YXRlKHN0YXRlKTsKKyAgICByZXR1cm4gc3R5bGUoKS0+c2l6ZUZy
b21Db250ZW50cyhRU3R5bGU6OkNUX0NvbWJvQm94LCAmb3B0LCBjb250ZW50c1NpemUpOworfQor
CitRU2l6ZSBRU3R5bGVGYWNhZGVJbXA6OnB1c2hCdXR0b25TaXplRnJvbUNvbnRlbnRzKFN0YXRl
IHN0YXRlLCBjb25zdCBRU2l6ZSYgY29udGVudHNTaXplKSBjb25zdAoreworICAgIFFTdHlsZU9w
dGlvbkJ1dHRvbiBvcHQ7CisgICAgb3B0LnN0YXRlID0gY29udmVydFRvUVN0eWxlU3RhdGUoc3Rh
dGUpOworICAgIHJldHVybiBzdHlsZSgpLT5zaXplRnJvbUNvbnRlbnRzKFFTdHlsZTo6Q1RfUHVz
aEJ1dHRvbiwgJm9wdCwgY29udGVudHNTaXplKTsKK30KKwordm9pZCBRU3R5bGVGYWNhZGVJbXA6
OnBhaW50QnV0dG9uKFFQYWludGVyKiBwYWludGVyLCBRU3R5bGVGYWNhZGU6OkJ1dHRvblR5cGUg
dHlwZSwgY29uc3QgUVN0eWxlRmFjYWRlT3B0aW9uICZwcm94eU9wdGlvbikKK3sKKyAgICBRV2lk
Z2V0KiB3aWRnZXQgPSBxb2JqZWN0X2Nhc3Q8UVdpZGdldCo+KHdpZGdldEZvclBhaW50ZXIocGFp
bnRlcikpOworICAgIE1hcHBlZFN0eWxlT3B0aW9uPFFTdHlsZU9wdGlvbkJ1dHRvbj4gb3B0aW9u
KHdpZGdldCwgcHJveHlPcHRpb24pOworCisgICAgaWYgKHR5cGUgPT0gUHVzaEJ1dHRvbikKKyAg
ICAgICAgc3R5bGUoKS0+ZHJhd0NvbnRyb2woUVN0eWxlOjpDRV9QdXNoQnV0dG9uLCAmb3B0aW9u
LCBwYWludGVyLCB3aWRnZXQpOworICAgIGVsc2UgaWYgKHR5cGUgPT0gUmFkaW9CdXR0b24pCisg
ICAgICAgIHN0eWxlKCktPmRyYXdDb250cm9sKFFTdHlsZTo6Q0VfUmFkaW9CdXR0b24sICZvcHRp
b24sIHBhaW50ZXIsIHdpZGdldCk7CisgICAgZWxzZSBpZiAodHlwZSA9PSBDaGVja0JveCkKKyAg
ICAgICAgc3R5bGUoKS0+ZHJhd0NvbnRyb2woUVN0eWxlOjpDRV9DaGVja0JveCwgJm9wdGlvbiwg
cGFpbnRlciwgd2lkZ2V0KTsKK30KKwordm9pZCBRU3R5bGVGYWNhZGVJbXA6OnBhaW50VGV4dEZp
ZWxkKFFQYWludGVyICpwYWludGVyLCBjb25zdCBRU3R5bGVGYWNhZGVPcHRpb24gJnByb3h5T3B0
aW9uKQoreworICAgIFFXaWRnZXQqIHdpZGdldCA9IHFvYmplY3RfY2FzdDxRV2lkZ2V0Kj4od2lk
Z2V0Rm9yUGFpbnRlcihwYWludGVyKSk7CisKKyAgICBNYXBwZWRTdHlsZU9wdGlvbjxRU3R5bGVP
cHRpb25GcmFtZVYyPiBwYW5lbCh3aWRnZXQsIHByb3h5T3B0aW9uKTsKKworICAgIHBhbmVsLmxp
bmVXaWR0aCA9IGZpbmRGcmFtZUxpbmVXaWR0aCgpOworICAgIHBhbmVsLmZlYXR1cmVzID0gUVN0
eWxlT3B0aW9uRnJhbWVWMjo6Tm9uZTsKKworICAgIHN0eWxlKCktPmRyYXdQcmltaXRpdmUoUVN0
eWxlOjpQRV9QYW5lbExpbmVFZGl0LCAmcGFuZWwsIHBhaW50ZXIsIHdpZGdldCk7Cit9CisKK3Zv
aWQgUVN0eWxlRmFjYWRlSW1wOjpwYWludENvbWJvQm94KFFQYWludGVyICpwYWludGVyLCBjb25z
dCBRU3R5bGVGYWNhZGVPcHRpb24gJnByb3h5T3B0aW9uKQoreworICAgIFFXaWRnZXQqIHdpZGdl
dCA9IHFvYmplY3RfY2FzdDxRV2lkZ2V0Kj4od2lkZ2V0Rm9yUGFpbnRlcihwYWludGVyKSk7CisK
KyAgICBNYXBwZWRTdHlsZU9wdGlvbjxRU3R5bGVPcHRpb25Db21ib0JveD4gb3B0KHdpZGdldCwg
cHJveHlPcHRpb24pOworCisgICAgUVJlY3QgcmVjdCA9IG9wdC5yZWN0OworCisjaWYgZGVmaW5l
ZChRX09TX01BQykgJiYgIWRlZmluZWQoUVRfTk9fU1RZTEVfTUFDKQorICAgIC8vIFFNYWNTdHls
ZSBtYWtlcyB0aGUgY29tYm8gYm94ZXMgYSBsaXR0bGUgYml0IHNtYWxsZXIgdG8gbGVhdmUgc3Bh
Y2UgZm9yIHRoZSBmb2N1cyByZWN0LgorICAgIC8vIEJlY2F1c2Ugb2YgaXQsIHRoZSBjb21ibyBi
dXR0b24gaXMgZHJhd24gYXQgYSBwb2ludCB0byB0aGUgbGVmdCBvZiB3aGVyZSBpdCB3YXMgZXhw
ZWN0IHRvIGJlIGFuZCBtYXkgZW5kIHVwCisgICAgLy8gb3ZlcmxhcHBlZCB3aXRoIHRoZSB0ZXh0
LiBUaGlzIHdpbGwgZm9yY2UgUU1hY1N0eWxlIHRvIGRyYXcgdGhlIGNvbWJvIGJveCB3aXRoIHRo
ZSBleHBlY3RlZCB3aWR0aC4KKyAgICBpZiAobV9zdHlsZS0+aW5oZXJpdHMoIlFNYWNTdHlsZSIp
KSB7CisgICAgICAgIHJlY3Quc2V0WChyZWN0LngoKSAtIDMpOworICAgICAgICByZWN0LnNldFdp
ZHRoKHJlY3Qud2lkdGgoKSArIDIgKiAzKTsKKyAgICB9CisjZW5kaWYKKworICAgIHBhaW50ZXIt
PnRyYW5zbGF0ZShyZWN0LnRvcExlZnQoKSk7CisgICAgb3B0LnJlY3QubW92ZVRvKFFQb2ludCgw
LCAwKSk7CisgICAgb3B0LnJlY3Quc2V0U2l6ZShyZWN0LnNpemUoKSk7CisKKyAgICBzdHlsZSgp
LT5kcmF3Q29tcGxleENvbnRyb2woUVN0eWxlOjpDQ19Db21ib0JveCwgJm9wdCwgcGFpbnRlciwg
d2lkZ2V0KTsKKyAgICBwYWludGVyLT50cmFuc2xhdGUoLXJlY3QudG9wTGVmdCgpKTsKK30KKwor
dm9pZCBRU3R5bGVGYWNhZGVJbXA6OnBhaW50Q29tYm9Cb3hBcnJvdyhRUGFpbnRlciAqcGFpbnRl
ciwgY29uc3QgUVN0eWxlRmFjYWRlT3B0aW9uICZwcm94eU9wdGlvbikKK3sKKyAgICBRV2lkZ2V0
KiB3aWRnZXQgPSBxb2JqZWN0X2Nhc3Q8UVdpZGdldCo+KHdpZGdldEZvclBhaW50ZXIocGFpbnRl
cikpOworCisgICAgTWFwcGVkU3R5bGVPcHRpb248UVN0eWxlT3B0aW9uQ29tYm9Cb3g+IG9wdCh3
aWRnZXQsIHByb3h5T3B0aW9uKTsKKyAgICBvcHQuc3ViQ29udHJvbHMgPSBRU3R5bGU6OlNDX0Nv
bWJvQm94QXJyb3c7CisgICAgLy8gZm9yIGRyYXdpbmcgdGhlIGNvbWJvIGJveCBhcnJvdywgcmVs
eSBvbmx5IG9uIHRoZSBmYWxsYmFjayBzdHlsZQorICAgIG1fZmFsbGJhY2tTdHlsZS0+ZHJhd0Nv
bXBsZXhDb250cm9sKFFTdHlsZTo6Q0NfQ29tYm9Cb3gsICZvcHQsIHBhaW50ZXIsIHdpZGdldCk7
Cit9CisKK3ZvaWQgUVN0eWxlRmFjYWRlSW1wOjpwYWludFNsaWRlclRyYWNrKFFQYWludGVyKiBw
YWludGVyLCBjb25zdCBRU3R5bGVGYWNhZGVPcHRpb24mIHByb3h5T3B0aW9uKQoreworICAgIFFX
aWRnZXQqIHdpZGdldCA9IHFvYmplY3RfY2FzdDxRV2lkZ2V0Kj4od2lkZ2V0Rm9yUGFpbnRlcihw
YWludGVyKSk7CisKKyAgICBNYXBwZWRTdHlsZU9wdGlvbjxRU3R5bGVPcHRpb25TbGlkZXI+IG9w
dGlvbih3aWRnZXQsIHByb3h5T3B0aW9uKTsKKyAgICBvcHRpb24uc3ViQ29udHJvbHMgPSBRU3R5
bGU6OlNDX1NsaWRlckdyb292ZTsKKworICAgIG9wdGlvbi51cHNpZGVEb3duID0gcHJveHlPcHRp
b24uc2xpZGVyLnVwc2lkZURvd247CisgICAgb3B0aW9uLm1pbmltdW0gPSBwcm94eU9wdGlvbi5z
bGlkZXIubWluaW11bTsKKyAgICBvcHRpb24ubWF4aW11bSA9IHByb3h5T3B0aW9uLnNsaWRlci5t
YXhpbXVtOworICAgIG9wdGlvbi5zbGlkZXJQb3NpdGlvbiA9IHByb3h5T3B0aW9uLnNsaWRlci5w
b3NpdGlvbjsKKyAgICBvcHRpb24ub3JpZW50YXRpb24gPSBwcm94eU9wdGlvbi5zbGlkZXIub3Jp
ZW50YXRpb247CisKKyAgICBzdHlsZSgpLT5kcmF3Q29tcGxleENvbnRyb2woUVN0eWxlOjpDQ19T
bGlkZXIsICZvcHRpb24sIHBhaW50ZXIsIHdpZGdldCk7CisKKyAgICBpZiAob3B0aW9uLnN0YXRl
ICYgUVN0eWxlOjpTdGF0ZV9IYXNGb2N1cykgeworICAgICAgICBRU3R5bGVPcHRpb25Gb2N1c1Jl
Y3QgZm9jdXNPcHRpb247CisgICAgICAgIGZvY3VzT3B0aW9uLnJlY3QgPSBvcHRpb24ucmVjdDsK
KyAgICAgICAgc3R5bGUoKS0+ZHJhd1ByaW1pdGl2ZShRU3R5bGU6OlBFX0ZyYW1lRm9jdXNSZWN0
LCAmZm9jdXNPcHRpb24sIHBhaW50ZXIsIHdpZGdldCk7CisgICAgfQorfQorCit2b2lkIFFTdHls
ZUZhY2FkZUltcDo6cGFpbnRTbGlkZXJUaHVtYihRUGFpbnRlciogcGFpbnRlciwgY29uc3QgUVN0
eWxlRmFjYWRlT3B0aW9uJiBwcm94eU9wdGlvbikKK3sKKyAgICBRV2lkZ2V0KiB3aWRnZXQgPSBx
b2JqZWN0X2Nhc3Q8UVdpZGdldCo+KHdpZGdldEZvclBhaW50ZXIocGFpbnRlcikpOworCisgICAg
TWFwcGVkU3R5bGVPcHRpb248UVN0eWxlT3B0aW9uU2xpZGVyPiBvcHRpb24od2lkZ2V0LCBwcm94
eU9wdGlvbik7CisKKyAgICBvcHRpb24uc3ViQ29udHJvbHMgPSBRU3R5bGU6OlNDX1NsaWRlckhh
bmRsZTsKKyAgICBpZiAob3B0aW9uLnN0YXRlICYgUVN0eWxlOjpTdGF0ZV9TdW5rZW4pCisgICAg
ICAgIG9wdGlvbi5hY3RpdmVTdWJDb250cm9scyA9IFFTdHlsZTo6U0NfU2xpZGVySGFuZGxlOwor
CisgICAgc3R5bGUoKS0+ZHJhd0NvbXBsZXhDb250cm9sKFFTdHlsZTo6Q0NfU2xpZGVyLCAmb3B0
aW9uLCBwYWludGVyLCB3aWRnZXQpOworfQorCit2b2lkIFFTdHlsZUZhY2FkZUltcDo6cGFpbnRJ
bm5lclNwaW5CdXR0b24oUVBhaW50ZXIqIHBhaW50ZXIsIGNvbnN0IFFTdHlsZUZhY2FkZU9wdGlv
biYgcHJveHlPcHRpb24sIGJvb2wgc3BpbkJveFVwKQoreworICAgIFFXaWRnZXQqIHdpZGdldCA9
IHFvYmplY3RfY2FzdDxRV2lkZ2V0Kj4od2lkZ2V0Rm9yUGFpbnRlcihwYWludGVyKSk7CisKKyAg
ICBNYXBwZWRTdHlsZU9wdGlvbjxRU3R5bGVPcHRpb25TcGluQm94PiBvcHRpb24od2lkZ2V0LCBw
cm94eU9wdGlvbik7CisKKyAgICBvcHRpb24uc3ViQ29udHJvbHMgPSBRU3R5bGU6OlNDX1NwaW5C
b3hVcCB8IFFTdHlsZTo6U0NfU3BpbkJveERvd247CisgICAgaWYgKCEob3B0aW9uLnN0YXRlICYg
UVN0eWxlOjpTdGF0ZV9SZWFkT25seSkpIHsKKyAgICAgICAgaWYgKG9wdGlvbi5zdGF0ZSAmIFFT
dHlsZTo6U3RhdGVfRW5hYmxlZCkKKyAgICAgICAgICAgIG9wdGlvbi5zdGVwRW5hYmxlZCA9IFFB
YnN0cmFjdFNwaW5Cb3g6OlN0ZXBVcEVuYWJsZWQgfCBRQWJzdHJhY3RTcGluQm94OjpTdGVwRG93
bkVuYWJsZWQ7CisgICAgICAgIGlmIChvcHRpb24uc3RhdGUgJiBRU3R5bGU6OlN0YXRlX1N1bmtl
bikgeworICAgICAgICAgICAgaWYgKHNwaW5Cb3hVcCkKKyAgICAgICAgICAgICAgICBvcHRpb24u
YWN0aXZlU3ViQ29udHJvbHMgPSBRU3R5bGU6OlNDX1NwaW5Cb3hVcDsKKyAgICAgICAgICAgIGVs
c2UKKyAgICAgICAgICAgICAgICBvcHRpb24uYWN0aXZlU3ViQ29udHJvbHMgPSBRU3R5bGU6OlND
X1NwaW5Cb3hEb3duOworICAgICAgICB9CisgICAgfQorCisgICAgUVJlY3QgYnV0dG9uUmVjdCA9
IG9wdGlvbi5yZWN0OworICAgIC8vIERlZmF1bHQgdG8gbW92aW5nIHRoZSBidXR0b25zIGEgbGl0
dGxlIGJpdCB3aXRoaW4gdGhlIGVkaXRvciBmcmFtZS4KKyAgICBpbnQgaW5mbGF0ZVggPSAtMjsK
KyAgICBpbnQgaW5mbGF0ZVkgPSAtMjsKKyNpZiBkZWZpbmVkKFFfT1NfTUFDKSAmJiAhZGVmaW5l
ZChRVF9OT19TVFlMRV9NQUMpCisgICAgLy8gUU1hY1N0eWxlIHdpbGwgcG9zaXRpb24gdGhlIGFx
dWEgYnV0dG9ucyBmbHVzaCB0byB0aGUgcmlnaHQuCisgICAgLy8gVGhpcyB3aWxsIG1vdmUgdGhl
bSBtb3JlIHdpdGhpbiB0aGUgY29udHJvbCBmb3IgYmV0dGVyIHN0eWxlLCBhIGxhCisgICAgLy8g
Q2hyb21pdW0gbG9vayAmIGZlZWwuCisgICAgaWYgKG1fc3R5bGUtPmluaGVyaXRzKCJRTWFjU3R5
bGUiKSkgeworICAgICAgICBpbmZsYXRlWCA9IC00OworICAgICAgICAvLyBSZW5kZXIgbWluaSBh
cXVhIHNwaW4gYnV0dG9ucyBmb3IgUU1hY1N0eWxlIHRvIGZpdCBuaWNlbHkgaW50bworICAgICAg
ICAvLyB0aGUgZWRpdG9yIGFyZWEsIGxpa2UgQ2hyb21pdW0uCisgICAgICAgIG9wdGlvbi5zdGF0
ZSB8PSBRU3R5bGU6OlN0YXRlX01pbmk7CisgICAgfQorI2VuZGlmCisKKyAgICBidXR0b25SZWN0
LnNldFgoYnV0dG9uUmVjdC54KCkgLSBpbmZsYXRlWCk7CisgICAgYnV0dG9uUmVjdC5zZXRXaWR0
aChidXR0b25SZWN0LndpZHRoKCkgKyAyICogaW5mbGF0ZVgpOworICAgIGJ1dHRvblJlY3Quc2V0
WShidXR0b25SZWN0LnkoKSAtIGluZmxhdGVZKTsKKyAgICBidXR0b25SZWN0LnNldEhlaWdodChi
dXR0b25SZWN0LmhlaWdodCgpICsgMiAqIGluZmxhdGVZKTsKKyAgICBvcHRpb24ucmVjdCA9IGJ1
dHRvblJlY3Q7CisKKyAgICBzdHlsZSgpLT5kcmF3Q29tcGxleENvbnRyb2woUVN0eWxlOjpDQ19T
cGluQm94LCAmb3B0aW9uLCBwYWludGVyLCB3aWRnZXQpOworfQorCit2b2lkIFFTdHlsZUZhY2Fk
ZUltcDo6cGFpbnRQcm9ncmVzc0JhcihRUGFpbnRlciogcGFpbnRlciwgY29uc3QgUVN0eWxlRmFj
YWRlT3B0aW9uJiBwcm94eU9wdGlvbiwgZG91YmxlIHByb2dyZXNzLCBkb3VibGUgYW5pbWF0aW9u
UHJvZ3Jlc3MpCit7CisgICAgUVdpZGdldCogd2lkZ2V0ID0gcW9iamVjdF9jYXN0PFFXaWRnZXQq
Pih3aWRnZXRGb3JQYWludGVyKHBhaW50ZXIpKTsKKworICAgIE1hcHBlZFN0eWxlT3B0aW9uPFFT
dHlsZU9wdGlvblByb2dyZXNzQmFyVjI+IG9wdGlvbih3aWRnZXQsIHByb3h5T3B0aW9uKTsKKwor
ICAgIG9wdGlvbi5tYXhpbXVtID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKTsKKyAg
ICBvcHRpb24ubWluaW11bSA9IDA7CisgICAgb3B0aW9uLnByb2dyZXNzID0gcHJvZ3Jlc3MgKiBz
dGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCgpOworCisgICAgY29uc3QgUVBvaW50IHRvcExl
ZnQgPSBvcHRpb24ucmVjdC50b3BMZWZ0KCk7CisgICAgcGFpbnRlci0+dHJhbnNsYXRlKHRvcExl
ZnQpOworICAgIG9wdGlvbi5yZWN0Lm1vdmVUbyhRUG9pbnQoMCwgMCkpOworCisgICAgaWYgKHBy
b2dyZXNzIDwgMCkgeworICAgICAgICAvLyBGSVhNRTogVW50aWwgaHR0cDovL2J1Z3JlcG9ydHMu
cXQubm9raWEuY29tL2Jyb3dzZS9RVEJVRy05MTcxIGlzIGZpeGVkLAorICAgICAgICAvLyB3ZSBz
aW11bGF0ZSBvbmUgc3F1YXJlIGFuaW1hdGluZyBhY3Jvc3MgdGhlIHByb2dyZXNzIGJhci4KKyAg
ICAgICAgc3R5bGUoKS0+ZHJhd0NvbnRyb2woUVN0eWxlOjpDRV9Qcm9ncmVzc0Jhckdyb292ZSwg
Jm9wdGlvbiwgcGFpbnRlciwgd2lkZ2V0KTsKKyAgICAgICAgaW50IGNodW5rV2lkdGggPSBzdHls
ZSgpLT5waXhlbE1ldHJpYyhRU3R5bGU6OlBNX1Byb2dyZXNzQmFyQ2h1bmtXaWR0aCwgJm9wdGlv
bik7CisgICAgICAgIFFDb2xvciBjb2xvciA9IChvcHRpb24ucGFsZXR0ZS5oaWdobGlnaHQoKSA9
PSBvcHRpb24ucGFsZXR0ZS5iYWNrZ3JvdW5kKCkpID8gb3B0aW9uLnBhbGV0dGUuY29sb3IoUVBh
bGV0dGU6OkFjdGl2ZSwgUVBhbGV0dGU6OkhpZ2hsaWdodCkgOiBvcHRpb24ucGFsZXR0ZS5jb2xv
cihRUGFsZXR0ZTo6SGlnaGxpZ2h0KTsKKyAgICAgICAgaWYgKG9wdGlvbi5kaXJlY3Rpb24gPT0g
UXQ6OlJpZ2h0VG9MZWZ0KQorICAgICAgICAgICAgcGFpbnRlci0+ZmlsbFJlY3Qob3B0aW9uLnJl
Y3QucmlnaHQoKSAtIGNodW5rV2lkdGggIC0gYW5pbWF0aW9uUHJvZ3Jlc3MgKiBvcHRpb24ucmVj
dC53aWR0aCgpLCAwLCBjaHVua1dpZHRoLCBvcHRpb24ucmVjdC5oZWlnaHQoKSwgY29sb3IpOwor
ICAgICAgICBlbHNlCisgICAgICAgICAgICBwYWludGVyLT5maWxsUmVjdChhbmltYXRpb25Qcm9n
cmVzcyAqIG9wdGlvbi5yZWN0LndpZHRoKCksIDAsIGNodW5rV2lkdGgsIG9wdGlvbi5yZWN0Lmhl
aWdodCgpLCBjb2xvcik7CisgICAgfSBlbHNlCisgICAgICAgIHN0eWxlKCktPmRyYXdDb250cm9s
KFFTdHlsZTo6Q0VfUHJvZ3Jlc3NCYXIsICZvcHRpb24sIHBhaW50ZXIsIHdpZGdldCk7CisKKyAg
ICBwYWludGVyLT50cmFuc2xhdGUoLXRvcExlZnQpOworfQorCitpbnQgUVN0eWxlRmFjYWRlSW1w
OjpzY3JvbGxCYXJFeHRlbnQoYm9vbCBtaW5pKQoreworICAgIFFTdHlsZU9wdGlvblNsaWRlciBv
OworICAgIG8ub3JpZW50YXRpb24gPSBRdDo6VmVydGljYWw7CisgICAgby5zdGF0ZSAmPSB+UVN0
eWxlOjpTdGF0ZV9Ib3Jpem9udGFsOworICAgIGlmIChtaW5pKQorICAgICAgICBvLnN0YXRlIHw9
IFFTdHlsZTo6U3RhdGVfTWluaTsKKyAgICByZXR1cm4gc3R5bGUoKS0+cGl4ZWxNZXRyaWMoUVN0
eWxlOjpQTV9TY3JvbGxCYXJFeHRlbnQsICZvLCAwKTsKK30KKworYm9vbCBRU3R5bGVGYWNhZGVJ
bXA6OnNjcm9sbEJhck1pZGRsZUNsaWNrQWJzb2x1dGVQb3NpdGlvblN0eWxlSGludCgpIGNvbnN0
Cit7CisgICAgcmV0dXJuIHN0eWxlKCktPnN0eWxlSGludChRU3R5bGU6OlNIX1Njcm9sbEJhcl9N
aWRkbGVDbGlja0Fic29sdXRlUG9zaXRpb24pOworfQorCit2b2lkIFFTdHlsZUZhY2FkZUltcDo6
cGFpbnRTY3JvbGxDb3JuZXIoUVBhaW50ZXIqIHBhaW50ZXIsIGNvbnN0IFFSZWN0JiByZWN0KQor
eworICAgIFFXaWRnZXQqIHdpZGdldCA9IHFvYmplY3RfY2FzdDxRV2lkZ2V0Kj4od2lkZ2V0Rm9y
UGFpbnRlcihwYWludGVyKSk7CisKKyAgICBRU3R5bGVPcHRpb24gb3B0aW9uOworICAgIG9wdGlv
bi5yZWN0ID0gcmVjdDsKKyAgICBzdHlsZSgpLT5kcmF3UHJpbWl0aXZlKFFTdHlsZTo6UEVfUGFu
ZWxTY3JvbGxBcmVhQ29ybmVyLCAmb3B0aW9uLCBwYWludGVyLCB3aWRnZXQpOworfQorCitRU3R5
bGVGYWNhZGU6OlN1YkNvbnRyb2wgUVN0eWxlRmFjYWRlSW1wOjpoaXRUZXN0U2Nyb2xsQmFyKGNv
bnN0IFFTdHlsZUZhY2FkZU9wdGlvbiAmcHJveHlPcHRpb24sIGNvbnN0IFFQb2ludCAmcG9zKQor
eworICAgIE1hcHBlZFN0eWxlT3B0aW9uPFFTdHlsZU9wdGlvblNsaWRlcj4gb3B0KDAsIHByb3h5
T3B0aW9uKTsKKyAgICBRU3R5bGU6OlN1YkNvbnRyb2wgc2MgPSBzdHlsZSgpLT5oaXRUZXN0Q29t
cGxleENvbnRyb2woUVN0eWxlOjpDQ19TY3JvbGxCYXIsICZvcHQsIHBvcywgMCk7CisgICAgcmV0
dXJuIGNvbnZlcnRUb1FTdHlsZUZhY2FkZVN1YkNvbnRyb2woc2MpOworfQorCitRUmVjdCBRU3R5
bGVGYWNhZGVJbXA6OnNjcm9sbEJhclN1YkNvbnRyb2xSZWN0KGNvbnN0IFFTdHlsZUZhY2FkZU9w
dGlvbiAmcHJveHlPcHRpb24sIFFTdHlsZUZhY2FkZTo6U3ViQ29udHJvbCBzdWJDb250cm9sKQor
eworICAgIE1hcHBlZFN0eWxlT3B0aW9uPFFTdHlsZU9wdGlvblNsaWRlcj4gb3B0KDAsIHByb3h5
T3B0aW9uKTsKKyAgICByZXR1cm4gc3R5bGUoKS0+c3ViQ29udHJvbFJlY3QoUVN0eWxlOjpDQ19T
Y3JvbGxCYXIsICZvcHQsIGNvbnZlcnRUb1FTdHlsZVN1YkNvbnRyb2woc3ViQ29udHJvbCksIDAp
OworfQorCit2b2lkIFFTdHlsZUZhY2FkZUltcDo6cGFpbnRTY3JvbGxCYXIoUVBhaW50ZXIgKnBh
aW50ZXIsIGNvbnN0IFFTdHlsZUZhY2FkZU9wdGlvbiAmcHJveHlPcHRpb24pCit7CisgICAgUVdp
ZGdldCogd2lkZ2V0ID0gcW9iamVjdF9jYXN0PFFXaWRnZXQqPih3aWRnZXRGb3JQYWludGVyKHBh
aW50ZXIpKTsKKworICAgIE1hcHBlZFN0eWxlT3B0aW9uPFFTdHlsZU9wdGlvblNsaWRlcj4gb3B0
KHdpZGdldCwgcHJveHlPcHRpb24pOworCisjaWZkZWYgUV9PU19NQUMKKyAgICAvLyBGSVhNRTog
V2UgYWxzbyBuZWVkIHRvIGNoZWNrIHRoZSB3aWRnZXQgc3R5bGUgYnV0IHRvZGF5IFNjcm9sbGJh
clRoZW1lIGlzIG5vdCBhd2FyZSBvZiB0aGUgcGFnZSBzbyB3ZQorICAgIC8vIGNhbid0IGdldCB0
aGUgd2lkZ2V0LgorICAgIGlmIChtX3N0eWxlLT5pbmhlcml0cygiUU1hY1N0eWxlIikpCisgICAg
ICAgIG1fc3R5bGUtPmRyYXdDb21wbGV4Q29udHJvbChRU3R5bGU6OkNDX1Njcm9sbEJhciwgJm9w
dCwgcGFpbnRlciwgd2lkZ2V0KTsKKyAgICBlbHNlCisjZW5kaWYKKyAgICB7CisgICAgICAgIC8v
IFRoZSBRU3R5bGUgZXhwZWN0cyB0aGUgYmFja2dyb3VuZCB0byBiZSBhbHJlYWR5IGZpbGxlZC4K
KyAgICAgICAgcGFpbnRlci0+ZmlsbFJlY3Qob3B0LnJlY3QsIG9wdC5wYWxldHRlLmJhY2tncm91
bmQoKSk7CisKKyAgICAgICAgY29uc3QgUVBvaW50IHRvcExlZnQgPSBvcHQucmVjdC50b3BMZWZ0
KCk7CisgICAgICAgIHBhaW50ZXItPnRyYW5zbGF0ZSh0b3BMZWZ0KTsKKyAgICAgICAgb3B0LnJl
Y3QubW92ZVRvKFFQb2ludCgwLCAwKSk7CisgICAgICAgIHN0eWxlKCktPmRyYXdDb21wbGV4Q29u
dHJvbChRU3R5bGU6OkNDX1Njcm9sbEJhciwgJm9wdCwgcGFpbnRlciwgd2lkZ2V0KTsKKyAgICAg
ICAgb3B0LnJlY3QubW92ZVRvKHRvcExlZnQpOworICAgIH0KK30KKworUU9iamVjdCogUVN0eWxl
RmFjYWRlSW1wOjp3aWRnZXRGb3JQYWludGVyKFFQYWludGVyKiBwYWludGVyKQoreworICAgIFFQ
YWludERldmljZSogZGV2ID0gMDsKKyAgICBpZiAocGFpbnRlcikKKyAgICAgICAgZGV2ID0gcGFp
bnRlci0+ZGV2aWNlKCk7CisgICAgaWYgKGRldiAmJiBkZXYtPmRldlR5cGUoKSA9PSBRSW50ZXJu
YWw6OldpZGdldCkKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFFXaWRnZXQqPihkZXYpOwor
ICAgIHJldHVybiAwOworfQorCitRU3R5bGUqIFFTdHlsZUZhY2FkZUltcDo6c3R5bGUoKSBjb25z
dAoreworICAgIGlmIChtX3N0eWxlKQorICAgICAgICByZXR1cm4gbV9zdHlsZTsKKworICAgIGlm
IChtX3BhZ2UpIHsKKyAgICAgICAgaWYgKFFXZWJQYWdlQ2xpZW50KiBwYWdlQ2xpZW50ID0gbV9w
YWdlLT5jbGllbnQuZGF0YSgpKQorICAgICAgICAgICAgbV9zdHlsZSA9IHBhZ2VDbGllbnQtPnN0
eWxlKCk7CisgICAgfQorCisgICAgaWYgKCFtX3N0eWxlKQorICAgICAgICBtX3N0eWxlID0gUUFw
cGxpY2F0aW9uOjpzdHlsZSgpOworCisgICAgcmV0dXJuIG1fc3R5bGU7Cit9CisKK30KZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJLaXQvcXQvV2lkZ2V0U3VwcG9ydC9RU3R5bGVGYWNhZGVJbXAuaCBi
L1NvdXJjZS9XZWJLaXQvcXQvV2lkZ2V0U3VwcG9ydC9RU3R5bGVGYWNhZGVJbXAuaApuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwLi4zZTY3N2FlZWZmYmFjNjQ2NzA5OGNhZTI2NGM3NDRiMWRmM2NjODY1Ci0tLSAvZGV2L251
bGwKKysrIGIvU291cmNlL1dlYktpdC9xdC9XaWRnZXRTdXBwb3J0L1FTdHlsZUZhY2FkZUltcC5o
CkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgdGhlbWUg
aW1wbGVtZW50YXRpb24gZm9yIGZvcm0gY29udHJvbHMgaW4gV2ViQ29yZS4KKyAqCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTIgRGlnaWEgUGxjIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKS4KKyAq
IENvcHlyaWdodCAoQykgMjAxMS0yMDEyIE5va2lhIENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vi
c2lkaWFyeSgtaWVzKS4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91
IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1z
IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNo
ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIg
b2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisg
KgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2ls
bCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0
aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSBy
ZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UK
KyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJ
ZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1
MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAx
LCBVU0EuCisgKgorICovCisjaWZuZGVmIFFTdHlsZUZhY2FkZUltcF9oCisjZGVmaW5lIFFTdHls
ZUZhY2FkZUltcF9oCisKKyNpbmNsdWRlIDxRUG9pbnRlcj4KKyNpbmNsdWRlIDxRU3R5bGVGYWNh
ZGUuaD4KKworUVRfQkVHSU5fTkFNRVNQQUNFCitjbGFzcyBRU3R5bGU7CitjbGFzcyBRTGluZUVk
aXQ7CitjbGFzcyBRU3R5bGVPcHRpb247CitjbGFzcyBRU3R5bGVPcHRpb25TbGlkZXI7CitjbGFz
cyBRUGFpbnRlcjsKK2NsYXNzIFFPYmplY3Q7CitRVF9FTkRfTkFNRVNQQUNFCisKK2NsYXNzIFFX
ZWJQYWdlQWRhcHRlcjsKKworbmFtZXNwYWNlIFdlYktpdCB7CisKK2NsYXNzIFFTdHlsZUZhY2Fk
ZUltcCA6IHB1YmxpYyBXZWJDb3JlOjpRU3R5bGVGYWNhZGUgeworcHVibGljOgorICAgIFFTdHls
ZUZhY2FkZUltcChRV2ViUGFnZUFkYXB0ZXIqID0gMCk7CisgICAgdmlydHVhbCB+UVN0eWxlRmFj
YWRlSW1wKCk7CisKKyAgICBzdGF0aWMgV2ViQ29yZTo6UVN0eWxlRmFjYWRlKiBjcmVhdGUoUVdl
YlBhZ2VBZGFwdGVyKiBwYWdlKQorICAgIHsgcmV0dXJuIG5ldyBRU3R5bGVGYWNhZGVJbXAocGFn
ZSk7IH0KKworICAgIHZpcnR1YWwgUVJlY3QgYnV0dG9uU3ViRWxlbWVudFJlY3QoQnV0dG9uU3Vi
RWxlbWVudCwgU3RhdGUsIGNvbnN0IFFSZWN0JiBvcmlnaW5hbFJlY3QpIGNvbnN0OworCisgICAg
dmlydHVhbCBpbnQgZmluZEZyYW1lTGluZVdpZHRoKCkgY29uc3Q7CisgICAgdmlydHVhbCBpbnQg
c2ltcGxlUGl4ZWxNZXRyaWMoUGl4ZWxNZXRyaWMsIFN0YXRlID0gU3RhdGVfTm9uZSkgY29uc3Q7
CisgICAgdmlydHVhbCBpbnQgYnV0dG9uTWFyZ2luKFN0YXRlLCBjb25zdCBRUmVjdCYgb3JpZ2lu
YWxSZWN0KSBjb25zdDsKKyAgICB2aXJ0dWFsIGludCBzbGlkZXJMZW5ndGgoUXQ6Ok9yaWVudGF0
aW9uKSBjb25zdDsKKyAgICB2aXJ0dWFsIGludCBzbGlkZXJUaGlja25lc3MoUXQ6Ok9yaWVudGF0
aW9uKSBjb25zdDsKKyAgICB2aXJ0dWFsIGludCBwcm9ncmVzc0JhckNodW5rV2lkdGgoY29uc3Qg
UVNpemUmKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0QnV0dG9uTWV0cmljcyhRU3RyaW5n
KiBidXR0b25Gb250RmFtaWx5LCBpbnQqIGJ1dHRvbkZvbnRQaXhlbFNpemUpIGNvbnN0OworCisg
ICAgdmlydHVhbCBRU2l6ZSBjb21ib0JveFNpemVGcm9tQ29udGVudHMoU3RhdGUsIGNvbnN0IFFT
aXplJiBjb250ZW50c1NpemUpIGNvbnN0OworICAgIHZpcnR1YWwgUVNpemUgcHVzaEJ1dHRvblNp
emVGcm9tQ29udGVudHMoU3RhdGUsIGNvbnN0IFFTaXplJiBjb250ZW50c1NpemUpIGNvbnN0Owor
CisgICAgdmlydHVhbCB2b2lkIHBhaW50QnV0dG9uKFFQYWludGVyKiwgQnV0dG9uVHlwZSwgY29u
c3QgV2ViQ29yZTo6UVN0eWxlRmFjYWRlT3B0aW9uICZwcm94eU9wdGlvbik7CisgICAgdmlydHVh
bCB2b2lkIHBhaW50VGV4dEZpZWxkKFFQYWludGVyKiwgY29uc3QgV2ViQ29yZTo6UVN0eWxlRmFj
YWRlT3B0aW9uJik7CisgICAgdmlydHVhbCB2b2lkIHBhaW50Q29tYm9Cb3goUVBhaW50ZXIqLCBj
b25zdCBXZWJDb3JlOjpRU3R5bGVGYWNhZGVPcHRpb24mKTsKKyAgICB2aXJ0dWFsIHZvaWQgcGFp
bnRDb21ib0JveEFycm93KFFQYWludGVyKiwgY29uc3QgV2ViQ29yZTo6UVN0eWxlRmFjYWRlT3B0
aW9uJik7CisKKyAgICB2aXJ0dWFsIHZvaWQgcGFpbnRTbGlkZXJUcmFjayhRUGFpbnRlciosIGNv
bnN0IFdlYkNvcmU6OlFTdHlsZUZhY2FkZU9wdGlvbiYpOworICAgIHZpcnR1YWwgdm9pZCBwYWlu
dFNsaWRlclRodW1iKFFQYWludGVyKiwgY29uc3QgV2ViQ29yZTo6UVN0eWxlRmFjYWRlT3B0aW9u
Jik7CisgICAgdmlydHVhbCB2b2lkIHBhaW50SW5uZXJTcGluQnV0dG9uKFFQYWludGVyKiwgY29u
c3QgV2ViQ29yZTo6UVN0eWxlRmFjYWRlT3B0aW9uJiwgYm9vbCBzcGluQm94VXApOworICAgIHZp
cnR1YWwgdm9pZCBwYWludFByb2dyZXNzQmFyKFFQYWludGVyKiwgY29uc3QgV2ViQ29yZTo6UVN0
eWxlRmFjYWRlT3B0aW9uJiwgZG91YmxlIHByb2dyZXNzLCBkb3VibGUgYW5pbWF0aW9uUHJvZ3Jl
c3MpOworCisgICAgdmlydHVhbCBpbnQgc2Nyb2xsQmFyRXh0ZW50KGJvb2wgbWluaSk7CisgICAg
dmlydHVhbCBib29sIHNjcm9sbEJhck1pZGRsZUNsaWNrQWJzb2x1dGVQb3NpdGlvblN0eWxlSGlu
dCgpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBwYWludFNjcm9sbENvcm5lcihRUGFpbnRlcios
IGNvbnN0IFFSZWN0Jik7CisKKyAgICB2aXJ0dWFsIFN1YkNvbnRyb2wgaGl0VGVzdFNjcm9sbEJh
cihjb25zdCBXZWJDb3JlOjpRU3R5bGVGYWNhZGVPcHRpb24mLCBjb25zdCBRUG9pbnQmIHBvcyk7
CisgICAgdmlydHVhbCBRUmVjdCBzY3JvbGxCYXJTdWJDb250cm9sUmVjdChjb25zdCBXZWJDb3Jl
OjpRU3R5bGVGYWNhZGVPcHRpb24mLCBTdWJDb250cm9sKTsKKyAgICB2aXJ0dWFsIHZvaWQgcGFp
bnRTY3JvbGxCYXIoUVBhaW50ZXIqLCBjb25zdCBXZWJDb3JlOjpRU3R5bGVGYWNhZGVPcHRpb24m
KTsKKworICAgIHZpcnR1YWwgUU9iamVjdCogd2lkZ2V0Rm9yUGFpbnRlcihRUGFpbnRlciopOwor
CisgICAgdmlydHVhbCBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBzdHlsZSgpOyB9CisK
K3ByaXZhdGU6CisgICAgUVN0eWxlKiBzdHlsZSgpIGNvbnN0OworCisgICAgUVdlYlBhZ2VBZGFw
dGVyKiBtX3BhZ2U7CisgICAgbXV0YWJsZSBRUG9pbnRlcjxRU3R5bGU+IG1fc3R5bGU7CisgICAg
UVN0eWxlKiBtX2ZhbGxiYWNrU3R5bGU7CisgICAgYm9vbCBtX293bkZhbGxiYWNrU3R5bGU7Cisg
ICAgbXV0YWJsZSBRU2NvcGVkUG9pbnRlcjxRTGluZUVkaXQ+IG1fbGluZUVkaXQ7Cit9OworCit9
CisKKyNlbmRpZiAvLyBRU3R5bGVGYWNhZGVJbXBfaApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktp
dC9xdC9XaWRnZXRTdXBwb3J0L1FXZWJVbmRvQ29tbWFuZC5jcHAgYi9Tb3VyY2UvV2ViS2l0L3F0
L1dpZGdldFN1cHBvcnQvUVdlYlVuZG9Db21tYW5kLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5hMTk2ZGY1MGQ3
NDVkMDQ2OTI5ODliMDg0ZGQ3OGU0ZmFiYzZkZDNmCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNl
L1dlYktpdC9xdC9XaWRnZXRTdXBwb3J0L1FXZWJVbmRvQ29tbWFuZC5jcHAKQEAgLTAsMCArMSw0
NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBEaWdpYSBQbGMgYW5kL29yIGl0cyBzdWJz
aWRpYXJ5KC1pZXMpLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3Ug
Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMg
b2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hl
ZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBv
ZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAq
CisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxs
IGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRo
ZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1
YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJl
Y2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQor
ICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElm
IG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUx
IEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEs
IFVTQS4KKyAqCisgKi8KKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJRV2ViVW5kb0Nv
bW1hbmQuaCIKKworI2luY2x1ZGUgIlVuZG9TdGVwUXQuaCIKKworI2lmbmRlZiBRVF9OT19VTkRP
Q09NTUFORAorUVdlYlVuZG9Db21tYW5kOjpRV2ViVW5kb0NvbW1hbmQoUVNoYXJlZFBvaW50ZXI8
VW5kb1N0ZXBRdD4gdW5kb1N0ZXAsIFFVbmRvQ29tbWFuZCogcGFyZW50KQorICAgIDogUVVuZG9D
b21tYW5kKHBhcmVudCkKKyAgICAsIG1fc3RlcCh1bmRvU3RlcCkKK3sKKyAgICBRX0FTU0VSVCh1
bmRvU3RlcCk7CisgICAgc2V0VGV4dChtX3N0ZXAtPnRleHQoKSk7Cit9CisKK3ZvaWQgUVdlYlVu
ZG9Db21tYW5kOjp1bmRvKCkKK3sKKyAgICBtX3N0ZXAtPnVuZG8oKTsKK30KKwordm9pZCBRV2Vi
VW5kb0NvbW1hbmQ6OnJlZG8oKQoreworICAgIG1fc3RlcC0+cmVkbygpOworfQorCisjZW5kaWYg
Ly8gUVRfTk9fVU5ET0NPTU1BTkQKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvcXQvV2lkZ2V0
U3VwcG9ydC9RV2ViVW5kb0NvbW1hbmQuaCBiL1NvdXJjZS9XZWJLaXQvcXQvV2lkZ2V0U3VwcG9y
dC9RV2ViVW5kb0NvbW1hbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi42ZTYxMjFhZGMyOTExMGJmMDM0OTE3ZjJm
MGRjYWFjZDRjZTY0ZmQzCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9xdC9XaWRn
ZXRTdXBwb3J0L1FXZWJVbmRvQ29tbWFuZC5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTIgRGlnaWEgUGxjIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKS4KKyAq
CisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUg
aXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFy
eSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29m
dHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9y
IChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5
IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBi
dXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50
eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ
T1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3Ig
bW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg
dGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhp
cyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisg
KiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQs
IEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisj
aWZuZGVmIFFXZWJVbmRvQ29tbWFuZF9oCisjZGVmaW5lIFFXZWJVbmRvQ29tbWFuZF9oCisKKyNp
bmNsdWRlIDxxc2hhcmVkcG9pbnRlci5oPgorI2luY2x1ZGUgPHF1bmRvc3RhY2suaD4KKworY2xh
c3MgVW5kb1N0ZXBRdDsKKworI2lmbmRlZiBRVF9OT19VTkRPQ09NTUFORAorCitjbGFzcyBRV2Vi
VW5kb0NvbW1hbmQgOiBwdWJsaWMgUVVuZG9Db21tYW5kIHsKK3B1YmxpYzoKKyAgICBRV2ViVW5k
b0NvbW1hbmQoUVNoYXJlZFBvaW50ZXI8VW5kb1N0ZXBRdD4sIFFVbmRvQ29tbWFuZCAqcGFyZW50
ID0gMCk7CisKKyAgICB2b2lkIHVuZG8oKTsKKyAgICB2b2lkIHJlZG8oKTsKKworcHJpdmF0ZToK
KyAgICBRU2hhcmVkUG9pbnRlcjxVbmRvU3RlcFF0PiBtX3N0ZXA7Cit9OworCisjZW5kaWYgLy8g
UVRfTk9fVU5ET0NPTU1BTkQKKworI2VuZGlmIC8vIFFXZWJVbmRvQ29tbWFuZF9oCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldFN1cHBvcnQvUVdpZGdldFBsdWdpbkltcGwuY3Bw
IGIvU291cmNlL1dlYktpdC9xdC9XaWRnZXRTdXBwb3J0L1FXaWRnZXRQbHVnaW5JbXBsLmNwcApu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwLi4yYmVhYmYxZDA4NTg2Y2Q1NTM0MzhiNzIwOGZhOGEzMTVmYmUxOWIzCi0tLSAv
ZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9xdC9XaWRnZXRTdXBwb3J0L1FXaWRnZXRQbHVn
aW5JbXBsLmNwcApAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIERp
Z2lhIFBsYyBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykuCisgKgorICogVGhpcyBsaWJyYXJ5
IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9k
aWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMK
KyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247
IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24p
IGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBp
biB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdB
UlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5U
QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05V
CisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAq
CisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRo
ZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdh
cmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAq
IEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSAiY29uZmln
LmgiCisjaW5jbHVkZSAiUVdpZGdldFBsdWdpbkltcGwuaCIKKworI2luY2x1ZGUgPFFXaWRnZXQ+
CisKK1FXaWRnZXRQbHVnaW5JbXBsOjp+UVdpZGdldFBsdWdpbkltcGwoKQoreworICAgIG1fd2lk
Z2V0LT5kZWxldGVMYXRlcigpOworfQorCit2b2lkIFFXaWRnZXRQbHVnaW5JbXBsOjp1cGRhdGUo
Y29uc3QgUVJlY3QgJnJlY3QpCit7CisgICAgbV93aWRnZXQtPnVwZGF0ZShyZWN0KTsKK30KKwor
dm9pZCBRV2lkZ2V0UGx1Z2luSW1wbDo6c2V0R2VvbWV0cnlBbmRDbGlwKGNvbnN0IFFSZWN0ICZn
ZW9tZXRyeSwgY29uc3QgUVJlY3QgJmNsaXBSZWN0LCBib29sIGlzVmlzaWJsZSkKK3sKKyAgICBt
X3dpZGdldC0+c2V0R2VvbWV0cnkoZ2VvbWV0cnkpOworICAgIGlmICghY2xpcFJlY3QuaXNOdWxs
KCkpIHsKKyAgICAgICAgUVJlY3QgY2xpcChjbGlwUmVjdC5pbnRlcnNlY3RlZChtX3dpZGdldC0+
cmVjdCgpKSk7CisgICAgICAgIG1fd2lkZ2V0LT5zZXRNYXNrKFFSZWdpb24oY2xpcCkpOworICAg
IH0KKyAgICBtX3dpZGdldC0+dXBkYXRlKCk7CisgICAgc2V0VmlzaWJsZShpc1Zpc2libGUpOwor
fQorCit2b2lkIFFXaWRnZXRQbHVnaW5JbXBsOjpzZXRWaXNpYmxlKGJvb2wgdmlzaWJsZSkKK3sK
KyAgICAvLyBJZiBzZXRNYXNrIGlzIHNldCB3aXRoIGFuIGVtcHR5IFFSZWdpb24sIG5vIGNsaXBw
aW5nIHdpbGwKKyAgICAvLyBiZSBwZXJmb3JtZWQsIHNvIGluIHRoYXQgY2FzZSB3ZSBoaWRlIHRo
ZSBwbGF0Zm9ybVdpZGdldC4KKyAgICBRUmVnaW9uIG1hc2sgPSBtX3dpZGdldC0+bWFzaygpOwor
ICAgIG1fd2lkZ2V0LT5zZXRWaXNpYmxlKHZpc2libGUgJiYgIW1hc2suaXNFbXB0eSgpKTsKK30K
Kwordm9pZCBRV2lkZ2V0UGx1Z2luSW1wbDo6c2V0U3R5bGVTaGVldChjb25zdCBRU3RyaW5nICZz
dHlsZXNoZWV0KQoreworICAgIG1fd2lkZ2V0LT5zZXRTdHlsZVNoZWV0KHN0eWxlc2hlZXQpOwor
fQorCit2b2lkIFFXaWRnZXRQbHVnaW5JbXBsOjpzZXRXaWRnZXRQYXJlbnQoUU9iamVjdCAqcGFy
ZW50KQoreworICAgIGlmICghcGFyZW50LT5pc1dpZGdldFR5cGUoKSkKKyAgICAgICAgcmV0dXJu
OworICAgIG1fd2lkZ2V0LT5zZXRQYXJlbnQocW9iamVjdF9jYXN0PFFXaWRnZXQqPihwYXJlbnQp
KTsKK30KKworUU9iamVjdCogUVdpZGdldFBsdWdpbkltcGw6OmhhbmRsZSgpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIG1fd2lkZ2V0OworfQorCisjaW5jbHVkZSAibW9jX1FXaWRnZXRQbHVnaW5JbXBs
LmNwcCIKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvcXQvV2lkZ2V0U3VwcG9ydC9RV2lkZ2V0
UGx1Z2luSW1wbC5oIGIvU291cmNlL1dlYktpdC9xdC9XaWRnZXRTdXBwb3J0L1FXaWRnZXRQbHVn
aW5JbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMC4uNzQ1OWI3ZWZmNTg3MDEzZjNhZjI0OGY3YzJjOTEyODZjZjc0
OTllZQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvcXQvV2lkZ2V0U3VwcG9ydC9R
V2lkZ2V0UGx1Z2luSW1wbC5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTIgRGlnaWEgUGxjIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKS4KKyAqCisgKiBUaGlz
IGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y
CisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFs
IFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91
bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3Vy
IG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3Ry
aWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9V
VCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICog
TUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2Vl
IHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRh
aWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBM
aWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5
OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJl
ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZs
b29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisjaWZuZGVmIFFX
aWRnZXRQbHVnaW5JbXBsX2gKKyNkZWZpbmUgUVdpZGdldFBsdWdpbkltcGxfaAorCisjaW5jbHVk
ZSAiUXRQbHVnaW5XaWRnZXRBZGFwdGVyLmgiCisKK1FUX0JFR0lOX05BTUVTUEFDRQorY2xhc3Mg
UVdpZGdldDsKK1FUX0VORF9OQU1FU1BBQ0UKKworY2xhc3MgUVdpZGdldFBsdWdpbkltcGwgOiBw
dWJsaWMgUXRQbHVnaW5XaWRnZXRBZGFwdGVyIHsKKyAgICBRX09CSkVDVAorcHVibGljOgorICAg
IFFXaWRnZXRQbHVnaW5JbXBsKFFXaWRnZXQgKncpIDogbV93aWRnZXQodykgeyB9CisgICAgdmly
dHVhbCB+UVdpZGdldFBsdWdpbkltcGwoKTsKKyAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlKGNvbnN0
IFFSZWN0ICYpIE9WRVJSSURFOworICAgIHZpcnR1YWwgdm9pZCBzZXRHZW9tZXRyeUFuZENsaXAo
Y29uc3QgUVJlY3QmLCBjb25zdCBRUmVjdCYsIGJvb2wgaXNWaXNpYmxlKSBPVkVSUklERTsKKyAg
ICB2aXJ0dWFsIHZvaWQgc2V0VmlzaWJsZShib29sKSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIHZv
aWQgc2V0U3R5bGVTaGVldChjb25zdCBRU3RyaW5nJikgT1ZFUlJJREU7CisgICAgdmlydHVhbCB2
b2lkIHNldFdpZGdldFBhcmVudChRT2JqZWN0ICopIE9WRVJSSURFOworICAgIHZpcnR1YWwgUU9i
amVjdCogaGFuZGxlKCkgY29uc3QgT1ZFUlJJREU7Citwcml2YXRlOgorICAgIFFXaWRnZXQgKm1f
d2lkZ2V0OworfTsKKworI2VuZGlmIC8vIFFXaWRnZXRQbHVnaW5JbXBsX2gKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJLaXQvcXQvV2lkZ2V0U3VwcG9ydC9RdEZhbGxiYWNrV2ViUG9wdXAuY3BwIGIv
U291cmNlL1dlYktpdC9xdC9XaWRnZXRTdXBwb3J0L1F0RmFsbGJhY2tXZWJQb3B1cC5jcHAKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMC4uYjJmYmY2MjRhYTk1YmFkZDA0ODBhZjUzN2I1YTRmZGEyZDkyNzBlMQotLS0gL2Rl
di9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvcXQvV2lkZ2V0U3VwcG9ydC9RdEZhbGxiYWNrV2Vi
UG9wdXAuY3BwCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdp
cmlzaCBSYW1ha3Jpc2huYW4gPGdpcmlzaEBmb3J3YXJkYmlhcy5pbj4KKyAqIENvcHlyaWdodCAo
QykgMjAwOSBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykKKyAq
CisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUg
aXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFy
eSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29m
dHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9y
IChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5
IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBi
dXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50
eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ
T1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3Ig
bW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg
dGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhp
cyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisg
KiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQs
IEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUXRGYWxsYmFja1dlYlBvcHVwLmgiCisKKyNp
Zm5kZWYgUVRfTk9fQ09NQk9CT1gKKworI2luY2x1ZGUgIlFXZWJQYWdlQWRhcHRlci5oIgorI2lu
Y2x1ZGUgIlFXZWJQYWdlQ2xpZW50LmgiCisjaW5jbHVkZSAiUXRXZWJDb21ib0JveC5oIgorI2lu
Y2x1ZGUgInFncmFwaGljc3dlYnZpZXcuaCIKKyNpbmNsdWRlIDxRR3JhcGhpY3NQcm94eVdpZGdl
dD4KKyNpbmNsdWRlIDxRdEd1aS9RU3RhbmRhcmRJdGVtTW9kZWw+CisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKKworUXRGYWxsYmFja1dlYlBvcHVwOjpRdEZhbGxiYWNrV2ViUG9wdXAoY29uc3QgUVdl
YlBhZ2VBZGFwdGVyKiBwYWdlKQorICAgIDogbV9jb21ibygwKQorICAgICwgbV9wYWdlKHBhZ2Up
Cit7Cit9CisKK1F0RmFsbGJhY2tXZWJQb3B1cDo6flF0RmFsbGJhY2tXZWJQb3B1cCgpCit7Cisg
ICAgZGVsZXRlQ29tYm9Cb3goKTsKK30KKwordm9pZCBRdEZhbGxiYWNrV2ViUG9wdXA6OnNob3co
Y29uc3QgUVdlYlNlbGVjdERhdGEmIGRhdGEpCit7CisgICAgaWYgKCFwYWdlQ2xpZW50KCkpCisg
ICAgICAgIHJldHVybjsKKworICAgIGRlbGV0ZUNvbWJvQm94KCk7CisKKyAgICBtX2NvbWJvID0g
bmV3IFF0V2ViQ29tYm9Cb3goKTsKKyAgICBjb25uZWN0KG1fY29tYm8sIFNJR05BTChhY3RpdmF0
ZWQoaW50KSksIFNMT1QoYWN0aXZlQ2hhbmdlZChpbnQpKSwgUXQ6OlF1ZXVlZENvbm5lY3Rpb24p
OworICAgIGNvbm5lY3QobV9jb21ibywgU0lHTkFMKGRpZEhpZGUoKSksIFNMT1QoZGVsZXRlQ29t
Ym9Cb3goKSkpOworICAgIGNvbm5lY3QobV9jb21ibywgU0lHTkFMKGRpZEhpZGUoKSksIFNJR05B
TChkaWRIaWRlKCkpKTsKKworICAgIHBvcHVsYXRlKGRhdGEpOworCisgICAgUVJlY3QgcmVjdCA9
IGdlb21ldHJ5KCk7CisgICAgaWYgKFFHcmFwaGljc1dlYlZpZXcgKndlYlZpZXcgPSBxb2JqZWN0
X2Nhc3Q8UUdyYXBoaWNzV2ViVmlldyo+KHBhZ2VDbGllbnQoKS0+cGx1Z2luUGFyZW50KCkpKSB7
CisgICAgICAgIFFHcmFwaGljc1Byb3h5V2lkZ2V0KiBwcm94eSA9IG5ldyBRR3JhcGhpY3NQcm94
eVdpZGdldCh3ZWJWaWV3KTsKKyAgICAgICAgcHJveHktPnNldFdpZGdldChtX2NvbWJvKTsKKyAg
ICAgICAgcHJveHktPnNldEdlb21ldHJ5KHJlY3QpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1f
Y29tYm8tPnNldFBhcmVudChxb2JqZWN0X2Nhc3Q8UVdpZGdldCo+KHBhZ2VDbGllbnQoKS0+b3du
ZXJXaWRnZXQoKSkpOworICAgICAgICBtX2NvbWJvLT5zZXRHZW9tZXRyeShRUmVjdChyZWN0Lmxl
ZnQoKSwgcmVjdC50b3AoKSwgcmVjdC53aWR0aCgpLCBtX2NvbWJvLT5zaXplSGludCgpLmhlaWdo
dCgpKSk7CisgICAgfQorCisgICAgbV9jb21iby0+c2hvd1BvcHVwQXRDdXJzb3JQb3NpdGlvbigp
OworfQorCit2b2lkIFF0RmFsbGJhY2tXZWJQb3B1cDo6aGlkZSgpCit7CisgICAgLy8gRGVzdHJv
eWluZyB0aGUgUUNvbWJvQm94IGhlcmUgY2F1c2UgcHJvYmxlbXMgaWYgdGhlIHBvcHVwIGlzIGlu
IHRoZQorICAgIC8vIG1pZGRsZSBvZiBpdHMgc2hvdyBhbmltYXRpb24uIEluc3RlYWQgd2UgcmVs
eSBvbiB0aGUgZmFjdCB0aGF0IHRoZQorICAgIC8vIFF0OjpQb3B1cCB3aW5kb3cgd2lsbCBoaWRl
IGl0c2VsZiBvbiBtb3VzZSBldmVudHMgb3V0c2lkZSBpdHMgd2luZG93LgorfQorCit2b2lkIFF0
RmFsbGJhY2tXZWJQb3B1cDo6cG9wdWxhdGUoY29uc3QgUVdlYlNlbGVjdERhdGEmIGRhdGEpCit7
CisgICAgUVN0YW5kYXJkSXRlbU1vZGVsKiBtb2RlbCA9IHFvYmplY3RfY2FzdDxRU3RhbmRhcmRJ
dGVtTW9kZWwqPihtX2NvbWJvLT5tb2RlbCgpKTsKKyAgICBRX0FTU0VSVChtb2RlbCk7CisKKyAg
ICBtX2NvbWJvLT5zZXRGb250KGZvbnQoKSk7CisKKyAgICBpbnQgY3VycmVudEluZGV4ID0gLTE7
CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLml0ZW1Db3VudCgpOyArK2kpIHsKKyAgICAg
ICAgc3dpdGNoIChkYXRhLml0ZW1UeXBlKGkpKSB7CisgICAgICAgIGNhc2UgUVdlYlNlbGVjdERh
dGE6OlNlcGFyYXRvcjoKKyAgICAgICAgICAgIG1fY29tYm8tPmluc2VydFNlcGFyYXRvcihpKTsK
KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFFXZWJTZWxlY3REYXRhOjpHcm91cDoK
KyAgICAgICAgICAgIG1fY29tYm8tPmluc2VydEl0ZW0oaSwgZGF0YS5pdGVtVGV4dChpKSk7Cisg
ICAgICAgICAgICBtb2RlbC0+aXRlbShpKS0+c2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgY2FzZSBRV2ViU2VsZWN0RGF0YTo6T3B0aW9uOgorICAgICAgICAg
ICAgbV9jb21iby0+aW5zZXJ0SXRlbShpLCBkYXRhLml0ZW1UZXh0KGkpKTsKKyAgICAgICAgICAg
IG1vZGVsLT5pdGVtKGkpLT5zZXRFbmFibGVkKGRhdGEuaXRlbUlzRW5hYmxlZChpKSk7CisjaWZu
ZGVmIFFUX05PX1RPT0xUSVAKKyAgICAgICAgICAgIG1vZGVsLT5pdGVtKGkpLT5zZXRUb29sVGlw
KGRhdGEuaXRlbVRvb2xUaXAoaSkpOworI2VuZGlmCisgICAgICAgICAgICBtb2RlbC0+aXRlbShp
KS0+c2V0QmFja2dyb3VuZChkYXRhLml0ZW1CYWNrZ3JvdW5kQ29sb3IoaSkpOworICAgICAgICAg
ICAgbW9kZWwtPml0ZW0oaSktPnNldEZvcmVncm91bmQoZGF0YS5pdGVtRm9yZWdyb3VuZENvbG9y
KGkpKTsKKyAgICAgICAgICAgIGlmIChkYXRhLml0ZW1Jc1NlbGVjdGVkKGkpKQorICAgICAgICAg
ICAgICAgIGN1cnJlbnRJbmRleCA9IGk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQor
ICAgIH0KKworICAgIGlmIChjdXJyZW50SW5kZXggPj0gMCkKKyAgICAgICAgbV9jb21iby0+c2V0
Q3VycmVudEluZGV4KGN1cnJlbnRJbmRleCk7Cit9CisKK3ZvaWQgUXRGYWxsYmFja1dlYlBvcHVw
OjphY3RpdmVDaGFuZ2VkKGludCBpbmRleCkKK3sKKyAgICBpZiAoaW5kZXggPCAwKQorICAgICAg
ICByZXR1cm47CisKKyAgICBlbWl0IHNlbGVjdEl0ZW0oaW5kZXgsIGZhbHNlLCBmYWxzZSk7Cit9
CisKK3ZvaWQgUXRGYWxsYmFja1dlYlBvcHVwOjpkZWxldGVDb21ib0JveCgpCit7CisgICAgaWYg
KCFtX2NvbWJvKQorICAgICAgICByZXR1cm47CisgICAgbV9jb21iby0+ZGVsZXRlTGF0ZXIoKTsK
KyAgICBtX2NvbWJvID0gMDsKK30KKworUVdlYlBhZ2VDbGllbnQqIFF0RmFsbGJhY2tXZWJQb3B1
cDo6cGFnZUNsaWVudCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcGFnZS0+Y2xpZW50LmRhdGEo
KTsKK30KKworfQorCisjZW5kaWYgLy8gUVRfTk9fQ09NQk9CT1gKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJLaXQvcXQvV2lkZ2V0U3VwcG9ydC9RdEZhbGxiYWNrV2ViUG9wdXAuaCBiL1NvdXJjZS9X
ZWJLaXQvcXQvV2lkZ2V0U3VwcG9ydC9RdEZhbGxiYWNrV2ViUG9wdXAuaApuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi42
OWI0OWJkYmY4ODUxODZhZjU0NWY2ZWRiYTM5MGM2NTc1NTVmMDVkCi0tLSAvZGV2L251bGwKKysr
IGIvU291cmNlL1dlYktpdC9xdC9XaWRnZXRTdXBwb3J0L1F0RmFsbGJhY2tXZWJQb3B1cC5oCkBA
IC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgTm9raWEgQ29ycG9yYXRp
b24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZy
ZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0
IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExp
Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl
cgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBs
YXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUg
aG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZ
OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElU
WSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBM
aWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZ
b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxl
IENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91
bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3Rv
biwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworI2lmbmRlZiBRdEZhbGxiYWNrV2ViUG9w
dXBfaAorI2RlZmluZSBRdEZhbGxiYWNrV2ViUG9wdXBfaAorCisjaW5jbHVkZSAicXdlYmtpdHBs
YXRmb3JtcGx1Z2luLmgiCisjaW5jbHVkZSA8d3RmL1BsYXRmb3JtLmg+CisKKyNpZm5kZWYgUVRf
Tk9fQ09NQk9CT1gKKworUVRfQkVHSU5fTkFNRVNQQUNFCitjbGFzcyBRR3JhcGhpY3NQcm94eVdp
ZGdldDsKK1FUX0VORF9OQU1FU1BBQ0UKKworY2xhc3MgUVdlYlBhZ2VDbGllbnQ7CitjbGFzcyBR
V2ViUGFnZUFkYXB0ZXI7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgUXRXZWJDb21i
b0JveDsKKworY2xhc3MgUXRGYWxsYmFja1dlYlBvcHVwIDogcHVibGljIFFXZWJTZWxlY3RNZXRo
b2QgeworICAgIFFfT0JKRUNUCitwdWJsaWM6CisgICAgUXRGYWxsYmFja1dlYlBvcHVwKGNvbnN0
IFFXZWJQYWdlQWRhcHRlciopOworICAgIH5RdEZhbGxiYWNrV2ViUG9wdXAoKTsKKworICAgIHZp
cnR1YWwgdm9pZCBzaG93KGNvbnN0IFFXZWJTZWxlY3REYXRhJik7CisgICAgdmlydHVhbCB2b2lk
IGhpZGUoKTsKKworICAgIHZvaWQgc2V0R2VvbWV0cnkoY29uc3QgUVJlY3QmIHJlY3QpIHsgbV9n
ZW9tZXRyeSA9IHJlY3Q7IH0KKyAgICBRUmVjdCBnZW9tZXRyeSgpIGNvbnN0IHsgcmV0dXJuIG1f
Z2VvbWV0cnk7IH0KKworICAgIHZvaWQgc2V0Rm9udChjb25zdCBRRm9udCYgZm9udCkgeyBtX2Zv
bnQgPSBmb250OyB9CisgICAgUUZvbnQgZm9udCgpIGNvbnN0IHsgcmV0dXJuIG1fZm9udDsgfQor
Citwcml2YXRlIFFfU0xPVFM6CisgICAgdm9pZCBhY3RpdmVDaGFuZ2VkKGludCk7CisgICAgdm9p
ZCBkZWxldGVDb21ib0JveCgpOworCitwcml2YXRlOgorICAgIFF0V2ViQ29tYm9Cb3gqIG1fY29t
Ym87CisgICAgY29uc3QgUVdlYlBhZ2VBZGFwdGVyKiBtX3BhZ2U7CisgICAgUVJlY3QgbV9nZW9t
ZXRyeTsKKyAgICBRRm9udCBtX2ZvbnQ7CisKKyAgICBRV2ViUGFnZUNsaWVudCogcGFnZUNsaWVu
dCgpIGNvbnN0OworCisgICAgdm9pZCBwb3B1bGF0ZShjb25zdCBRV2ViU2VsZWN0RGF0YSYpOwor
fTsKKworfQorCisjZW5kaWYgLy8gUVRfTk9fQ09NQk9CT1gKKworI2VuZGlmIC8vIFF0RmFsbGJh
Y2tXZWJQb3B1cF9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldFN1cHBvcnQv
UXRXZWJDb21ib0JveC5jcHAgYi9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldFN1cHBvcnQvUXRXZWJD
b21ib0JveC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMmMyMmNkNDc2YzZkNTliMzgwMjBiZmJkMzAyZDU3NTJk
MDIzZTdlMAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvcXQvV2lkZ2V0U3VwcG9y
dC9RdFdlYkNvbWJvQm94LmNwcApAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDEwIEdpcmlzaCBSYW1ha3Jpc2huYW4gPGdpcmlzaEBmb3J3YXJkYmlhcy5pbj4KKyAqIENv
cHlyaWdodCAoQykgMjAwOSwgMjAxMSBOb2tpYSBDb3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNp
ZGlhcnkoLWllcykKKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh
biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9m
IHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQg
YnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2Yg
dGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgor
ICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBi
ZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUg
aW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJs
aWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNl
aXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAq
IGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBu
b3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBG
cmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBV
U0EuCisgKgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJRdFdlYkNvbWJv
Qm94LmgiCisKKyNpZm5kZWYgUVRfTk9fQ09NQk9CT1gKKworI2luY2x1ZGUgPFFBYnN0cmFjdEl0
ZW1WaWV3PgorI2luY2x1ZGUgPFFDb3JlQXBwbGljYXRpb24+CisjaW5jbHVkZSA8UXRHdWkvUU1v
dXNlRXZlbnQ+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworUXRXZWJDb21ib0JveDo6UXRXZWJD
b21ib0JveCgpCisgICAgOiBRQ29tYm9Cb3goKQoreworICAgIC8vIEluc3RhbGwgYW4gZXZlbnQg
ZmlsdGVyIG9uIHRoZSB2aWV3IGluc2lkZSB0aGUgY29tYm8gYm94IHBvcHVwIHRvIG1ha2Ugc3Vy
ZSB3ZSBrbm93CisgICAgLy8gd2hlbiB0aGUgcG9wdXAgZ290IGNsb3NlZC4gRS5nLiBRQ29tYm9C
b3g6OmhpZGVQb3B1cCgpIHdvbid0IGJlIGNhbGxlZCB3aGVuIHRoZSBwb3B1cAorICAgIC8vIGlz
IGNsb3NlZCBieSBhIG1vdXNlIHdoZWVsIGV2ZW50IG91dHNpZGUgaXRzIHdpbmRvdy4KKyAgICB2
aWV3KCktPmluc3RhbGxFdmVudEZpbHRlcih0aGlzKTsKK30KKwordm9pZCBRdFdlYkNvbWJvQm94
OjpzaG93UG9wdXBBdEN1cnNvclBvc2l0aW9uKCkKK3sKKyAgICBRTW91c2VFdmVudCBldmVudChR
RXZlbnQ6Ok1vdXNlQnV0dG9uUHJlc3MsIFFDdXJzb3I6OnBvcygpLCBRdDo6TGVmdEJ1dHRvbiwg
UXQ6OkxlZnRCdXR0b24sIFF0OjpOb01vZGlmaWVyKTsKKyAgICBRQ29yZUFwcGxpY2F0aW9uOjpz
ZW5kRXZlbnQodGhpcywgJmV2ZW50KTsKK30KKworYm9vbCBRdFdlYkNvbWJvQm94OjpldmVudEZp
bHRlcihRT2JqZWN0KiB3YXRjaGVkLCBRRXZlbnQqIGV2ZW50KQoreworICAgIFFfQVNTRVJUKHdh
dGNoZWQgPT0gdmlldygpKTsKKyAgICBpZiAoZXZlbnQtPnR5cGUoKSA9PSBRRXZlbnQ6OkhpZGUp
CisgICAgICAgIGVtaXQgZGlkSGlkZSgpOworICAgIHJldHVybiBmYWxzZTsKK30KKworfQorCisj
ZW5kaWYgLy8gUVRfTk9fQ09NQk9CT1gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvcXQvV2lk
Z2V0U3VwcG9ydC9RdFdlYkNvbWJvQm94LmggYi9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdldFN1cHBv
cnQvUXRXZWJDb21ib0JveC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmUzMjQyN2VkZjRkNGI3Zjk3ZGVkZWI4ZThl
ZTRlMDI2MDRlZGM3NjIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L3F0L1dpZGdl
dFN1cHBvcnQvUXRXZWJDb21ib0JveC5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTEgTm9raWEgQ29ycG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMp
CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli
dXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVl
IFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNl
LCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGli
cmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAor
ICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2Fy
cmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug
Zm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5
IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRo
IHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0
bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3Ry
ZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAq
LworCisjaWZuZGVmIFF0V2ViQ29tYm9Cb3hfaAorI2RlZmluZSBRdFdlYkNvbWJvQm94X2gKKwor
I2luY2x1ZGUgPFFDb21ib0JveD4KKyNpbmNsdWRlIDx3dGYvUGxhdGZvcm0uaD4KKworI2lmbmRl
ZiBRVF9OT19DT01CT0JPWAorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIFF0V2ViQ29t
Ym9Cb3ggOiBwdWJsaWMgUUNvbWJvQm94IHsKKyAgICBRX09CSkVDVAorcHVibGljOgorICAgIFF0
V2ViQ29tYm9Cb3goKTsKKworICAgIHZvaWQgc2hvd1BvcHVwQXRDdXJzb3JQb3NpdGlvbigpOwor
ICAgIHZpcnR1YWwgYm9vbCBldmVudEZpbHRlcihRT2JqZWN0KiB3YXRjaGVkLCBRRXZlbnQqKTsK
KworUV9TSUdOQUxTOgorICAgIHZvaWQgZGlkSGlkZSgpOworfTsKKworfQorCisjZW5kaWYgLy8g
UVRfTk9fQ09NQk9CT1gKKworI2VuZGlmIC8vIFF0V2ViQ29tYm9Cb3hfaApkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYktpdC9xdC9kZWNsYXJhdGl2ZS9leHBlcmltZW50YWwvZXhwZXJpbWVudGFsLnBy
aSBiL1NvdXJjZS9XZWJLaXQvcXQvZGVjbGFyYXRpdmUvZXhwZXJpbWVudGFsL2V4cGVyaW1lbnRh
bC5wcmkKaW5kZXggMzc3NTA1NmFhZTVhMTZhNTVkZDQwM2RiNGFlMGFhOGQ2NmRiYjg2YS4uZmE2
MWFkZTI1Y2U5MjM4NWZhZjk4MDg4NTg3YTdmYjFiYjAzMWRmNCAxMDA2NDQKLS0tIGEvU291cmNl
L1dlYktpdC9xdC9kZWNsYXJhdGl2ZS9leHBlcmltZW50YWwvZXhwZXJpbWVudGFsLnByaQorKysg
Yi9Tb3VyY2UvV2ViS2l0L3F0L2RlY2xhcmF0aXZlL2V4cGVyaW1lbnRhbC9leHBlcmltZW50YWwu
cHJpCkBAIC0yNCw3ICsyNCw3IEBAIGNvbnRhaW5zKFFUX0NPTkZJRywgcmVkdWNlX2V4cG9ydHMp
OkNPTkZJRyArPSBoaWRlX3N5bWJvbHMKIAogd2luY2UqOkxJQlMgKz0gJCRRTUFLRV9MSUJTX0dV
SQogCi1RVCArPSBuZXR3b3JrIHF1aWNrIHF1aWNrLXByaXZhdGUgd2Via2l0d2lkZ2V0cyB3ZWJr
aXR3aWRnZXRzLXByaXZhdGUKK1FUICs9IG5ldHdvcmsgcXVpY2sgcXVpY2stcHJpdmF0ZSB3ZWJr
aXQgd2Via2l0LXByaXZhdGUKIAogREVTVERJUiA9ICQke1JPT1RfQlVJTERfRElSfS9pbXBvcnRz
LyQke1RBUkdFVC5tb2R1bGVfbmFtZX0KIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9xdC9k
ZWNsYXJhdGl2ZS9wdWJsaWMucHJpIGIvU291cmNlL1dlYktpdC9xdC9kZWNsYXJhdGl2ZS9wdWJs
aWMucHJpCmluZGV4IDkyMTZhOGI2NDUxNWFhYzRmN2Y3M2VlYTlhMWFiN2UwYTQ3YTk0MDguLjQ2
YjFhODNjOWNkNjI3NDZhNWUyZTFlYTg1YTA5MTVmMzk5OWUxZGUgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJLaXQvcXQvZGVjbGFyYXRpdmUvcHVibGljLnByaQorKysgYi9Tb3VyY2UvV2ViS2l0L3F0
L2RlY2xhcmF0aXZlL3B1YmxpYy5wcmkKQEAgLTI0LDcgKzI0LDcgQEAgY29udGFpbnMoUVRfQ09O
RklHLCByZWR1Y2VfZXhwb3J0cyk6Q09ORklHICs9IGhpZGVfc3ltYm9scwogCiB3aW5jZSo6TElC
UyArPSAkJFFNQUtFX0xJQlNfR1VJCiAKLVFUICs9IHdlYmtpdHdpZGdldHMgd2Via2l0d2lkZ2V0
cy1wcml2YXRlIHF1aWNrIHF1aWNrLXByaXZhdGUKK1FUICs9IHdlYmtpdCB3ZWJraXQtcHJpdmF0
ZSBxdWljayBxdWljay1wcml2YXRlCiAKIFdFQktJVCArPSB3dGYKIApkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYktpdC9xdC90ZXN0cy9xd2Vidmlldy90c3RfcXdlYnZpZXcuY3BwIGIvU291cmNlL1dl
YktpdC9xdC90ZXN0cy9xd2Vidmlldy90c3RfcXdlYnZpZXcuY3BwCmluZGV4IDhlNjQ2ZTE5NmNk
Mjc3ZTk5MWFjNTZmZjM2MmQzMTc0NTA0M2VlYjguLjZmZjJkMWZmNTE0YjhjODhmZDYzMGE1MGIz
YjJhNmRhMzZmMTllNTAgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvcXQvdGVzdHMvcXdlYnZp
ZXcvdHN0X3F3ZWJ2aWV3LmNwcAorKysgYi9Tb3VyY2UvV2ViS2l0L3F0L3Rlc3RzL3F3ZWJ2aWV3
L3RzdF9xd2Vidmlldy5jcHAKQEAgLTI3LDcgKzI3LDYgQEAKICNpbmNsdWRlIDxxd2VicGFnZS5o
PgogI2luY2x1ZGUgPHFuZXR3b3JrcmVxdWVzdC5oPgogI2luY2x1ZGUgPHFkaXJpdGVyYXRvci5o
PgotI2luY2x1ZGUgPHF3ZWJraXR2ZXJzaW9uLmg+CiAjaW5jbHVkZSA8cXdlYmVsZW1lbnQuaD4K
ICNpbmNsdWRlIDxxd2ViZnJhbWUuaD4KIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdDIvVUlQ
cm9jZXNzL0FQSS9xdC90ZXN0cy9pbnNwZWN0b3JzZXJ2ZXIvaW5zcGVjdG9yc2VydmVyLnBybyBi
L1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvcXQvdGVzdHMvaW5zcGVjdG9yc2VydmVyL2lu
c3BlY3RvcnNlcnZlci5wcm8KaW5kZXggYmM1MzA3ZjJkYzNhNTdlZGYyYmFjOGFlOTVkYjAxNjhl
MmQ1YmUyOS4uNGE4ZDg2ZjgwODk3ZDdlZTEyYzEwODliYzFkZjk0OWYzMTgwMzM4MCAxMDA2NDQK
LS0tIGEvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9xdC90ZXN0cy9pbnNwZWN0b3JzZXJ2
ZXIvaW5zcGVjdG9yc2VydmVyLnBybworKysgYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJ
L3F0L3Rlc3RzL2luc3BlY3RvcnNlcnZlci9pbnNwZWN0b3JzZXJ2ZXIucHJvCkBAIC0xLDQgKzEs
NCBAQAogaW5jbHVkZSguLi90ZXN0cy5wcmkpCiBTT1VSQ0VTICs9ICQke1RBUkdFVH0uY3BwCi1R
VCArPSB3ZWJraXR3aWRnZXRzLXByaXZhdGUKK1FUICs9IHdlYmtpdC1wcml2YXRlCiBERUZJTkVT
ICs9IElNUE9SVF9ESVI9XCJcXFwiJCR7Uk9PVF9CVUlMRF9ESVJ9JCR7UU1BS0VfRElSX1NFUH1p
bXBvcnRzXFxcIlwiCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL3F0
L3Rlc3RzL3B1YmxpY2FwaS9wdWJsaWNhcGkucHJvIGIvU291cmNlL1dlYktpdDIvVUlQcm9jZXNz
L0FQSS9xdC90ZXN0cy9wdWJsaWNhcGkvcHVibGljYXBpLnBybwppbmRleCBiYThmNGNlYTM0MzQ5
NjU2YjRhMmQ3NzVhZmIxOGIyMGU0YWVmNGZiLi4wMmRjMTk3Yzc5ZTc2NzBlMTNiNTJmOGFmYWU0
ZDY3MmVmMjFiN2I4IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL3F0
L3Rlc3RzL3B1YmxpY2FwaS9wdWJsaWNhcGkucHJvCisrKyBiL1NvdXJjZS9XZWJLaXQyL1VJUHJv
Y2Vzcy9BUEkvcXQvdGVzdHMvcHVibGljYXBpL3B1YmxpY2FwaS5wcm8KQEAgLTEsMyArMSwzIEBA
CiBpbmNsdWRlKC4uL3Rlc3RzLnByaSkKIFNPVVJDRVMgKz0gJCR7VEFSR0VUfS5jcHAKLVFUICs9
IHdlYmtpdHdpZGdldHMtcHJpdmF0ZQorUVQgKz0gd2Via2l0LXByaXZhdGUKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvcXQvdGVzdHMvcW1sdGVzdHMvRGVza3RvcEJl
aGF2aW9yLnBybyBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvcXQvdGVzdHMvcW1sdGVz
dHMvRGVza3RvcEJlaGF2aW9yLnBybwppbmRleCA3YzcyZmQyZjE1YjAzYzNhNjNmNTFmNDFhMGEz
ZTYyOWQ4NzBjYzZmLi4zZmQzZDQ1ODMzMzVhN2E0NmRhOGRmZmE1Njc2ZGExZTkwNjI4MTI5IDEw
MDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL3F0L3Rlc3RzL3FtbHRlc3Rz
L0Rlc2t0b3BCZWhhdmlvci5wcm8KKysrIGIvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9x
dC90ZXN0cy9xbWx0ZXN0cy9EZXNrdG9wQmVoYXZpb3IucHJvCkBAIC0zLDcgKzMsNyBAQCBTT1VS
Q0VTICs9IHRzdF9xbWx0ZXN0cy5jcHAKIFRBUkdFVCA9IHRzdF9xbWx0ZXN0c19EZXNrdG9wQmVo
YXZpb3IKIE9CSkVDVFNfRElSID0gb2JqX0Rlc2t0b3BCZWhhdmlvci8kJGFjdGl2ZUJ1aWxkQ29u
ZmlnKCkKIAotUVQgKz0gd2Via2l0d2lkZ2V0cy1wcml2YXRlCitRVCArPSB3ZWJraXQtcHJpdmF0
ZQogQ09ORklHICs9IHdhcm5fb24gdGVzdGNhc2UKIAogUVQgKz0gcW1sdGVzdApkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9xdC90ZXN0cy9xbWx0ZXN0cy9XZWJWaWV3
LnBybyBiL1NvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvcXQvdGVzdHMvcW1sdGVzdHMvV2Vi
Vmlldy5wcm8KaW5kZXggM2UyMTdiMzY5NWRlNGY5OTRkNTZmNjUzOTg0MTc1YWFlNTViNTBhOS4u
YjM0MDIzNWU0NzRhMDkzYmY5MjZkMmMyNGZhNTUyNGUzZjY5ZWQyYiAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9xdC90ZXN0cy9xbWx0ZXN0cy9XZWJWaWV3LnBybwor
KysgYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL3F0L3Rlc3RzL3FtbHRlc3RzL1dlYlZp
ZXcucHJvCkBAIC0zLDcgKzMsNyBAQCBTT1VSQ0VTICs9IHRzdF9xbWx0ZXN0cy5jcHAKIFRBUkdF
VCA9IHRzdF9xbWx0ZXN0c19XZWJWaWV3CiBPQkpFQ1RTX0RJUiA9IG9ial9XZWJWaWV3LyQkYWN0
aXZlQnVpbGRDb25maWcoKQogCi1RVCArPSB3ZWJraXR3aWRnZXRzLXByaXZhdGUKK1FUICs9IHdl
YmtpdC1wcml2YXRlCiBDT05GSUcgKz0gd2Fybl9vbiB0ZXN0Y2FzZQogCiBRVCArPSBxbWx0ZXN0
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL3F0L3Rlc3RzL3FxdWlj
a3dlYnZpZXcvcXF1aWNrd2Vidmlldy5wcm8gYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJ
L3F0L3Rlc3RzL3FxdWlja3dlYnZpZXcvcXF1aWNrd2Vidmlldy5wcm8KaW5kZXggYmM1MzA3ZjJk
YzNhNTdlZGYyYmFjOGFlOTVkYjAxNjhlMmQ1YmUyOS4uNGE4ZDg2ZjgwODk3ZDdlZTEyYzEwODli
YzFkZjk0OWYzMTgwMzM4MCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQ
SS9xdC90ZXN0cy9xcXVpY2t3ZWJ2aWV3L3FxdWlja3dlYnZpZXcucHJvCisrKyBiL1NvdXJjZS9X
ZWJLaXQyL1VJUHJvY2Vzcy9BUEkvcXQvdGVzdHMvcXF1aWNrd2Vidmlldy9xcXVpY2t3ZWJ2aWV3
LnBybwpAQCAtMSw0ICsxLDQgQEAKIGluY2x1ZGUoLi4vdGVzdHMucHJpKQogU09VUkNFUyArPSAk
JHtUQVJHRVR9LmNwcAotUVQgKz0gd2Via2l0d2lkZ2V0cy1wcml2YXRlCitRVCArPSB3ZWJraXQt
cHJpdmF0ZQogREVGSU5FUyArPSBJTVBPUlRfRElSPVwiXFxcIiQke1JPT1RfQlVJTERfRElSfSQk
e1FNQUtFX0RJUl9TRVB9aW1wb3J0c1xcXCJcIgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdDIv
VUlQcm9jZXNzL0FQSS9xdC90ZXN0cy9xcmF3d2Vidmlldy9xcmF3d2Vidmlldy5wcm8gYi9Tb3Vy
Y2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL3F0L3Rlc3RzL3FyYXd3ZWJ2aWV3L3FyYXd3ZWJ2aWV3
LnBybwppbmRleCBiYThmNGNlYTM0MzQ5NjU2YjRhMmQ3NzVhZmIxOGIyMGU0YWVmNGZiLi4wMmRj
MTk3Yzc5ZTc2NzBlMTNiNTJmOGFmYWU0ZDY3MmVmMjFiN2I4IDEwMDY0NAotLS0gYS9Tb3VyY2Uv
V2ViS2l0Mi9VSVByb2Nlc3MvQVBJL3F0L3Rlc3RzL3FyYXd3ZWJ2aWV3L3FyYXd3ZWJ2aWV3LnBy
bworKysgYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL3F0L3Rlc3RzL3FyYXd3ZWJ2aWV3
L3FyYXd3ZWJ2aWV3LnBybwpAQCAtMSwzICsxLDMgQEAKIGluY2x1ZGUoLi4vdGVzdHMucHJpKQog
U09VUkNFUyArPSAkJHtUQVJHRVR9LmNwcAotUVQgKz0gd2Via2l0d2lkZ2V0cy1wcml2YXRlCitR
VCArPSB3ZWJraXQtcHJpdmF0ZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdDIvVUlQcm9jZXNz
L0FQSS9xdC90ZXN0cy90ZXN0cy5wcmkgYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL3F0
L3Rlc3RzL3Rlc3RzLnByaQppbmRleCAxMjNiMjVjZTIwZGNlODAwMzhmMjZhYWYyNDFjYmRiYjVj
ODliM2ZmLi5hMTEzMzUzMGRhYWU5YWZlNmJlMjIyZjMxZTczZjM2ODI3MmNlZDgwIDEwMDY0NAot
LS0gYS9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL3F0L3Rlc3RzL3Rlc3RzLnByaQorKysg
Yi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL3F0L3Rlc3RzL3Rlc3RzLnByaQpAQCAtNiw3
ICs2LDcgQEAgVEFSR0VUID0gdHN0XyQkVEFSR0VUCiBJTkNMVURFUEFUSCArPSAkJFBXRAogU09V
UkNFUyArPSAgLi4vdXRpbC5jcHAKIAotUVQgKz0gdGVzdGxpYiB3ZWJraXR3aWRnZXRzCitRVCAr
PSB0ZXN0bGliIHdlYmtpdAogaGF2ZT8oUVRRVUlDSykgewogICAgIFFUICs9IHFtbCBxdWljayBx
dWljay1wcml2YXRlCiAgICAgSEVBREVSUyArPSAuLi9ieXRlYXJyYXl0ZXN0ZGF0YS5oIFwKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9hcGkucHJpIGIvU291cmNlL2FwaS5wcmkKaW5kZXggZTU2ZDY3ZmNl
YmIwZWQyY2ZiMWRjYjkzZjMwYmMxMTU2NGViZjY4NC4uMDEwMzk2MTY5NzZiZDNlYTU2YzdlYzkx
ZDQzOWIzNDRlYTcyNjQxNiAxMDA2NDQKLS0tIGEvU291cmNlL2FwaS5wcmkKKysrIGIvU291cmNl
L2FwaS5wcmkKQEAgLTgsMzEgKzgsMzAgQEAKIGxvYWQocXRfYnVpbGRfY29uZmlnKQogCiBURU1Q
TEFURSA9IGxpYgotVEFSR0VUID0gUXRXZWJLaXRXaWRnZXRzCitUQVJHRVQgPSBRdFdlYktpdAog
CiBXRUJLSVRfREVTVERJUiA9ICQke1JPT1RfQlVJTERfRElSfS9saWIKIAogV0VCS0lUICs9IHd0
ZiBqYXZhc2NyaXB0Y29yZSB3ZWJjb3JlCiAKLWJ1aWxkPyh3ZWJraXQxKTogV0VCS0lUICs9IHdl
YmtpdHdpZGdldHMgd2Via2l0MQorYnVpbGQ/KHdlYmtpdDEpOiBXRUJLSVQgKz0gd2Via2l0MQog
YnVpbGQ/KHdlYmtpdDIpOiBXRUJLSVQgKz0gd2Via2l0MgogCiAjIEVuc3VyZSB0aGF0IGNoYW5n
ZXMgdG8gdGhlIFdlYktpdDEgYW5kIFdlYktpdDIgQVBJIHdpbGwgdHJpZ2dlciBhIHFtYWtlIG9m
IHRoaXMKICMgZmlsZSwgd2hpY2ggaW4gdHVybiBydW5zIHN5bmNxdCB0byB1cGRhdGUgdGhlIGZv
cndhcmRpbmcgaGVhZGVycy4KIGJ1aWxkPyh3ZWJraXQxKTogewogICAgIFFNQUtFX0lOVEVSTkFM
X0lOQ0xVREVEX0ZJTEVTICo9IFdlYktpdC9XZWJLaXQxLnBybwotICAgIFFNQUtFX0lOVEVSTkFM
X0lOQ0xVREVEX0ZJTEVTICo9IFdlYktpdC9XZWJLaXRXaWRnZXRzLnBybwogfQogYnVpbGQ/KHdl
YmtpdDIpOiBRTUFLRV9JTlRFUk5BTF9JTkNMVURFRF9GSUxFUyAqPSBXZWJLaXQyL1RhcmdldC5w
cmkKIAogdXNlPygzRF9HUkFQSElDUyk6IFdFQktJVCArPSBhbmdsZQogCi1NT0RVTEUgPSB3ZWJr
aXR3aWRnZXRzCitNT0RVTEUgPSB3ZWJraXQKK0NPTkZJRyArPSBjcmVhdGluZ19tb2R1bGUKIAog
IyBUaGlzIGlzIHRoZSBjYW5vbmljYWwgbGlzdCBvZiBkZXBlbmRlbmNpZXMgZm9yIHRoZSBwdWJs
aWMgQVBJIG9mCiAjIHRoZSBRdFdlYktpdCBsaWJyYXJ5LCBhbmQgd2lsbCBlbmQgdXAgaW4gdGhl
IGxpYnJhcnkncyBwcmwgZmlsZS4KIFFUX0FQSV9ERVBFTkRTID0gY29yZSBndWkgbmV0d29yawot
YnVpbGQ/KHdlYmtpdDEpOiBRVF9BUElfREVQRU5EUyArPSB3aWRnZXRzCiAKICMgV2Ugd2FudCB0
aGUgUXRXZWJLaXQgQVBJIGZvcndhcmRpbmcgaW5jbHVkZXMgdG8gbGl2ZSBpbiB0aGUgcm9vdCBi
dWlsZCBkaXIuCiBNT0RVTEVfQkFTRV9ESVIgPSAkJF9QUk9fRklMRV9QV0RfCmRpZmYgLS1naXQg
YS9Tb3VyY2Uvc3luYy5wcm9maWxlIGIvU291cmNlL3N5bmMucHJvZmlsZQppbmRleCA4NjAzMTQy
NWU3ZmQwMmU4ZTA3ZDY2MmQ4MjlhMDRjYWE0OGM3MDQ3Li4yMDgzNWY0ZmE2ZTIxNTk0Zjg3MDlj
MTFjMGIwMWNjM2EyYmY1YTU1IDEwMDY0NAotLS0gYS9Tb3VyY2Uvc3luYy5wcm9maWxlCisrKyBi
L1NvdXJjZS9zeW5jLnByb2ZpbGUKQEAgLTEsOCArMSwxMCBAQAogJW1vZHVsZXMgPSAoICMgcGF0
aCB0byBtb2R1bGUgbmFtZSBtYXAKKyAgICAiUXRXZWJLaXQiID0+ICIkYmFzZWRpciIsCiAgICAg
IlF0V2ViS2l0V2lkZ2V0cyIgPT4gIiRiYXNlZGlyIgogKTsKICVtb2R1bGVoZWFkZXJzID0gKCAj
IHJlc3RyaWN0IHRoZSBtb2R1bGUgaGVhZGVycyB0byB0aG9zZSBmb3VuZCBpbiByZWxhdGl2ZSBw
YXRoCi0gICAgIlF0V2ViS2l0V2lkZ2V0cyIgPT4gIldlYktpdC9xdC9BcGk7V2ViS2l0Mi9VSVBy
b2Nlc3MvQVBJL3F0IiwKKyAgICAiUXRXZWJLaXQiID0+ICJXZWJLaXQvcXQvQXBpO1dlYktpdDIv
VUlQcm9jZXNzL0FQSS9xdCIsCisgICAgIlF0V2ViS2l0V2lkZ2V0cyIgPT4gIldlYktpdC9xdC9X
aWRnZXRBcGkiLAogKTsKICVjbGFzc25hbWVzID0gKAogKTsKZGlmZiAtLWdpdCBhL1NvdXJjZS93
aWRnZXRzYXBpLnByaSBiL1NvdXJjZS93aWRnZXRzYXBpLnByaQpuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5iNTRiYzFk
NTMzODQ0MzA3NWQzMzE5NmI3MmIyYjQ5N2M0MTRlNjlkCi0tLSAvZGV2L251bGwKKysrIGIvU291
cmNlL3dpZGdldHNhcGkucHJpCkBAIC0wLDAgKzEsMTMwIEBACisjIC0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGFy
Z2V0IGZpbGUgZm9yIHRoZSBRdFdlYktpdFdpZGdldHMgZHluYW1pYyBsaWJyYXJ5CisjCisjIFNl
ZSAnVG9vbHMvcW1ha2UvUkVBRE1FJyBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIGJ1aWxkIHN5c3Rl
bQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tCisKKyMgVXNlIFF0NSdzIG1vZHVsZSBzeXN0ZW0KK2xvYWQocXRfYnVp
bGRfY29uZmlnKQorCitURU1QTEFURSA9IGxpYgorVEFSR0VUID0gUXRXZWJLaXRXaWRnZXRzCisK
K1dFQktJVF9ERVNURElSID0gJCR7Uk9PVF9CVUlMRF9ESVJ9L2xpYgorCitTT1VSQ0VfRElSID0g
JCR7Uk9PVF9XRUJLSVRfRElSfS9Tb3VyY2UvV2ViS2l0CisKK0lOQ0xVREVQQVRIICs9IFwKKyAg
ICAkJFNPVVJDRV9ESVIvcXQvQXBpIFwKKyAgICAkJFNPVVJDRV9ESVIvcXQvV2lkZ2V0QXBpIFwK
KyAgICAkJFNPVVJDRV9ESVIvcXQvV2ViQ29yZVN1cHBvcnQgXAorICAgICQkU09VUkNFX0RJUi9x
dC9XaWRnZXRTdXBwb3J0IFwKKyAgICAkJFJPT1RfV0VCS0lUX0RJUi9Tb3VyY2UvV1RGL3d0Zi9x
dAorCitlbmFibGU/KERFVklDRV9PUklFTlRBVElPTil8ZW5hYmxlPyhPUklFTlRBVElPTl9FVkVO
VFMpIHsKKyAgICBRVCArPSBzZW5zb3JzCit9CisKK2VuYWJsZT8oR0VPTE9DQVRJT04pOiBRVCAr
PSBsb2NhdGlvbgorCit1c2U/KFFUX01VTFRJTUVESUEpOiBRVCAqPSBtdWx0aW1lZGlhd2lkZ2V0
cworCitjb250YWlucyhDT05GSUcsIHRleG1hcCk6IERFRklORVMgKz0gV1RGX1VTRV9URVhUVVJF
X01BUFBFUj0xCisKK3VzZT8oUExVR0lOX0JBQ0tFTkRfWExJQik6IFBLR0NPTkZJRyArPSB4MTEK
KworUVQgKz0gbmV0d29yayB3aWRnZXRzCitoYXZlPyhRVFFVSUNLKTogUVQgKz0gcXVpY2sKK2hh
dmU/KFFUUFJJTlRTVVBQT1JUKTogUVQgKz0gcHJpbnRzdXBwb3J0CisKK3VzZT8oVEVYVFVSRV9N
QVBQRVJfR0wpfGVuYWJsZT8oV0VCR0wpIHsKKyAgICBRVCAqPSBvcGVuZ2wKK30KK1FUICs9IHdl
YmtpdAorCit1c2U/KDNEX0dSQVBISUNTKTogV0VCS0lUICs9IEFOR0xFCisKK1dFQktJVCArPSBq
YXZhc2NyaXB0Y29yZSB3dGYgd2ViY29yZQorCitNT0RVTEUgPSB3ZWJraXR3aWRnZXRzCisKKyMg
V2Ugd2FudCB0aGUgUXRXZWJLaXQgQVBJIGZvcndhcmRpbmcgaW5jbHVkZXMgdG8gbGl2ZSBpbiB0
aGUgcm9vdCBidWlsZCBkaXIuCitNT0RVTEVfQkFTRV9ESVIgPSAkJF9QUk9fRklMRV9QV0RfCitN
T0RVTEVfQkFTRV9PVVRESVIgPSAkJFJPT1RfQlVJTERfRElSCisKKyMgVGhpcyBpcyB0aGUgY2Fu
b25pY2FsIGxpc3Qgb2YgZGVwZW5kZW5jaWVzIGZvciB0aGUgcHVibGljIEFQSSBvZgorIyB0aGUg
UXRXZWJLaXRXaWRnZXRzIGxpYnJhcnksIGFuZCB3aWxsIGVuZCB1cCBpbiB0aGUgbGlicmFyeSdz
IHBybCBmaWxlLgorUVRfQVBJX0RFUEVORFMgPSBjb3JlIGd1aSB3aWRnZXRzIG5ldHdvcmsgd2Vi
a2l0CisKKyMgLS0tLS0tLS0tLS0tLS0tLSBDdXN0b20gZGV2ZWxvcGVyLWJ1aWxkIGhhbmRsaW5n
IC0tLS0tLS0tLS0tLS0tLS0tLS0KKyMKKyMgVGhlIGFzc3VtcHRpb24gZm9yIFF0IGRldmVsb3Bl
ciBidWlsZHMgaXMgdGhhdCB0aGUgbW9kdWxlIGZpbGUKKyMgd2lsbCBiZSBwdXQgaW50byBxdGJh
c2UvbWtzcGVjcy9tb2R1bGVzLCBhbmQgdGhlIGxpYnJhcmllcyBpbnRvCisjIHF0YmFzZS9saWIs
IHdpdGggcnBhdGgvaW5zdGFsbF9uYW1lIHNldCB0byB0aGUgUXQgbGliIGRpci4KKyMKKyMgRm9y
IFdlYktpdCB3ZSBkb24ndCB3YW50IHRoYXQgYmVoYXZpb3IgZm9yIHRoZSBsaWJyYXJpZXMsIGFz
IHdlIHdhbnQKKyMgdGhlbSB0byBiZSBzZWxmLWNvbnRhaW5lZCBpbiB0aGUgV2ViS2l0IGJ1aWxk
IGRpci4KKyMKKyFwcm9kdWN0aW9uX2J1aWxkOiBDT05GSUcgKz0gZm9yY2VfaW5kZXBlbmRlbnQK
KworQkFTRV9UQVJHRVQgPSAkJFRBUkdFVAorCitsb2FkKHF0X21vZHVsZSkKKworIyBBbGxvdyBk
b2luZyBhIGRlYnVnLW9ubHkgYnVpbGQgb2YgV2ViS2l0IChub3Qgc3VwcG9ydGVkIGJ5IFF0KQor
bWFjeDohZGVidWdfYW5kX3JlbGVhc2U6ZGVidWc6IFRBUkdFVCA9ICQkQkFTRV9UQVJHRVQKKwor
U09VUkNFUyArPSBcCisgICAgJCRQV0QvV2ViS2l0L3F0L1dpZGdldEFwaS9xZ3JhcGhpY3N3ZWJ2
aWV3LmNwcCBcCisgICAgJCRQV0QvV2ViS2l0L3F0L1dpZGdldEFwaS9xd2ViZnJhbWUuY3BwIFwK
KyAgICAkJFBXRC9XZWJLaXQvcXQvV2lkZ2V0QXBpL3F3ZWJwYWdlLmNwcCBcCisgICAgJCRQV0Qv
V2ViS2l0L3F0L1dpZGdldEFwaS9xd2Vidmlldy5jcHAgXAorICAgICQkUFdEL1dlYktpdC9xdC9X
aWRnZXRBcGkvcXdlYmluc3BlY3Rvci5jcHAgXAorICAgICQkUFdEL1dlYktpdC9xdC9XaWRnZXRT
dXBwb3J0L1F0RmFsbGJhY2tXZWJQb3B1cC5jcHAgXAorICAgICQkUFdEL1dlYktpdC9xdC9XaWRn
ZXRTdXBwb3J0L1F0V2ViQ29tYm9Cb3guY3BwIFwKKyAgICAkJFBXRC9XZWJLaXQvcXQvV2lkZ2V0
U3VwcG9ydC9RV2ViVW5kb0NvbW1hbmQuY3BwIFwKKyAgICAkJFBXRC9XZWJLaXQvcXQvV2lkZ2V0
U3VwcG9ydC9EZWZhdWx0RnVsbFNjcmVlblZpZGVvSGFuZGxlci5jcHAgXAorICAgICQkUFdEL1dl
YktpdC9xdC9XaWRnZXRTdXBwb3J0L0luaXRXZWJLaXRRdC5jcHAgXAorICAgICQkUFdEL1dlYktp
dC9xdC9XaWRnZXRTdXBwb3J0L0luc3BlY3RvckNsaWVudFdlYlBhZ2UuY3BwIFwKKyAgICAkJFBX
RC9XZWJLaXQvcXQvV2lkZ2V0U3VwcG9ydC9QYWdlQ2xpZW50UXQuY3BwIFwKKyAgICAkJFBXRC9X
ZWJLaXQvcXQvV2lkZ2V0U3VwcG9ydC9RU3R5bGVGYWNhZGVJbXAuY3BwIFwKKyAgICAkJFBXRC9X
ZWJLaXQvcXQvV2lkZ2V0U3VwcG9ydC9RR3JhcGhpY3NXaWRnZXRQbHVnaW5JbXBsLmNwcCBcCisg
ICAgJCRQV0QvV2ViS2l0L3F0L1dpZGdldFN1cHBvcnQvUVdpZGdldFBsdWdpbkltcGwuY3BwCisK
K0hFQURFUlMgKz0gXAorICAgICQkUFdEL1dlYktpdC9xdC9XaWRnZXRBcGkvcWdyYXBoaWNzd2Vi
dmlldy5oIFwKKyAgICAkJFBXRC9XZWJLaXQvcXQvV2lkZ2V0QXBpL3F3ZWJmcmFtZS5oIFwKKyAg
ICAkJFBXRC9XZWJLaXQvcXQvV2lkZ2V0QXBpL3F3ZWJmcmFtZV9wLmggXAorICAgICQkUFdEL1dl
YktpdC9xdC9XaWRnZXRBcGkvcXdlYnBhZ2UuaCBcCisgICAgJCRQV0QvV2ViS2l0L3F0L1dpZGdl
dEFwaS9xd2VicGFnZV9wLmggXAorICAgICQkUFdEL1dlYktpdC9xdC9XaWRnZXRBcGkvcXdlYnZp
ZXcuaCBcCisgICAgJCRQV0QvV2ViS2l0L3F0L1dpZGdldEFwaS9xd2ViaW5zcGVjdG9yLmggXAor
ICAgICQkUFdEL1dlYktpdC9xdC9XaWRnZXRBcGkvcXdlYmluc3BlY3Rvcl9wLmggXAorICAgICQk
UFdEL1dlYktpdC9xdC9BcGkvcXdlYmtpdHBsYXRmb3JtcGx1Z2luLmggXAorICAgICQkUFdEL1dl
YktpdC9xdC9XaWRnZXRTdXBwb3J0L0luaXRXZWJLaXRRdC5oIFwKKyAgICAkJFBXRC9XZWJLaXQv
cXQvV2lkZ2V0U3VwcG9ydC9JbnNwZWN0b3JDbGllbnRXZWJQYWdlLmggXAorICAgICQkUFdEL1dl
YktpdC9xdC9XaWRnZXRTdXBwb3J0L0RlZmF1bHRGdWxsU2NyZWVuVmlkZW9IYW5kbGVyLmggXAor
ICAgICQkUFdEL1dlYktpdC9xdC9XaWRnZXRTdXBwb3J0L1F0RmFsbGJhY2tXZWJQb3B1cC5oIFwK
KyAgICAkJFBXRC9XZWJLaXQvcXQvV2lkZ2V0U3VwcG9ydC9RdFdlYkNvbWJvQm94LmggXAorICAg
ICQkUFdEL1dlYktpdC9xdC9XaWRnZXRTdXBwb3J0L1FXZWJVbmRvQ29tbWFuZC5oIFwKKyAgICAk
JFBXRC9XZWJLaXQvcXQvV2lkZ2V0U3VwcG9ydC9QYWdlQ2xpZW50UXQuaCBcCisgICAgJCRQV0Qv
V2ViS2l0L3F0L1dpZGdldFN1cHBvcnQvUUdyYXBoaWNzV2lkZ2V0UGx1Z2luSW1wbC5oIFwKKyAg
ICAkJFBXRC9XZWJLaXQvcXQvV2lkZ2V0U3VwcG9ydC9RU3R5bGVGYWNhZGVJbXAuaCBcCisgICAg
JCRQV0QvV2ViS2l0L3F0L1dpZGdldFN1cHBvcnQvUVdpZGdldFBsdWdpbkltcGwuaCBcCisKK2Nv
bnRhaW5zKFFUX0NPTkZJRywgYWNjZXNzaWJpbGl0eSkgeworICAgIFNPVVJDRVMgKz0gJCRQV0Qv
V2ViS2l0L3F0L1dpZGdldEFwaS9xd2Vidmlld2FjY2Vzc2libGUuY3BwCisgICAgSEVBREVSUyAr
PSAkJFBXRC9XZWJLaXQvcXQvV2lkZ2V0QXBpL3F3ZWJ2aWV3YWNjZXNzaWJsZV9wLmggCit9CisK
K0lOQ0xVREVQQVRIICs9IFwKKyAgICAkJFBXRC9xdC9BcGkgXAorICAgICQkUFdEL3F0L1dlYkNv
cmVTdXBwb3J0CisKK2VuYWJsZT8oVklERU8pIHsKKyAgICAhdXNlPyhRVEtJVCk6IXVzZT8oR1NU
UkVBTUVSKTp1c2U/KFFUX01VTFRJTUVESUEpIHsKKyAgICAgICAgSEVBREVSUyArPSAkJFBXRC9X
ZWJLaXQvcXQvV2lkZ2V0U3VwcG9ydC9GdWxsU2NyZWVuVmlkZW9XaWRnZXQuaAorICAgICAgICBT
T1VSQ0VTICs9ICQkUFdEL1dlYktpdC9xdC9XaWRnZXRTdXBwb3J0L0Z1bGxTY3JlZW5WaWRlb1dp
ZGdldC5jcHAKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL1Rvb2xzL0R1bXBSZW5kZXJUcmVlL3F0
L0R1bXBSZW5kZXJUcmVlLnBybyBiL1Rvb2xzL0R1bXBSZW5kZXJUcmVlL3F0L0R1bXBSZW5kZXJU
cmVlLnBybwppbmRleCAwYmQwYjE2YTY3Y2FiZDllNWMzMzMwZThjZWM1Zjg5NmM4NTk0NzVlLi5m
ZjY5NmQzOThiYzc4MGU4YWM2YTdjOTczNTY5N2Y1MGJkN2RmZWY2IDEwMDY0NAotLS0gYS9Ub29s
cy9EdW1wUmVuZGVyVHJlZS9xdC9EdW1wUmVuZGVyVHJlZS5wcm8KKysrIGIvVG9vbHMvRHVtcFJl
bmRlclRyZWUvcXQvRHVtcFJlbmRlclRyZWUucHJvCkBAIC0xNiw2ICsxNiw3IEBAIElOQ0xVREVQ
QVRIICs9IFwKICAgICAkJFBXRC8uLiBcCiAgICAgJCR7Uk9PVF9XRUJLSVRfRElSfS9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9xdCBcCiAgICAgJCR7Uk9PVF9XRUJLSVRfRElSfS9Tb3VyY2UvV2Vi
S2l0L3F0L1dlYkNvcmVTdXBwb3J0IFwKKyAgICAkJHtST09UX1dFQktJVF9ESVJ9L1NvdXJjZS9X
ZWJLaXQvcXQvV2lkZ2V0U3VwcG9ydCBcCiAgICAgJCR7Uk9PVF9XRUJLSVRfRElSfS9Tb3VyY2Uv
V1RGCiAKIFFUID0gY29yZSBndWkgbmV0d29yayB0ZXN0bGliIHdlYmtpdHdpZGdldHMgd2lkZ2V0
cwpkaWZmIC0tZ2l0IGEvVG9vbHMvRHVtcFJlbmRlclRyZWUvcXQvRHVtcFJlbmRlclRyZWVRdC5j
cHAgYi9Ub29scy9EdW1wUmVuZGVyVHJlZS9xdC9EdW1wUmVuZGVyVHJlZVF0LmNwcAppbmRleCA4
OGQ4YWU3NTJkZTNmN2NkNmYwMTI4ZTkxNGNiZTQ3NzUyNjQwYzQwLi5kZWEwZWRiYzAzYzI5NzA4
YTlkMGRhOWYwZjNlMzViYmM0MjQ2YWUwIDEwMDc1NQotLS0gYS9Ub29scy9EdW1wUmVuZGVyVHJl
ZS9xdC9EdW1wUmVuZGVyVHJlZVF0LmNwcAorKysgYi9Ub29scy9EdW1wUmVuZGVyVHJlZS9xdC9E
dW1wUmVuZGVyVHJlZVF0LmNwcApAQCAtOTE1LDcgKzkxNSw3IEBAIHZvaWQgRHVtcFJlbmRlclRy
ZWU6OmR1bXAoKQogICAgIGlmIChtX2NvbnRyb2xsZXItPnNob3VsZER1bXBBc1RleHQoKSkKICAg
ICAgICAgcmVzdWx0U3RyaW5nID0gZHVtcEZyYW1lc0FzVGV4dChtYWluRnJhbWUpOwogICAgIGVs
c2UgewotICAgICAgICByZXN1bHRTdHJpbmcgPSBtYWluRnJhbWUtPnJlbmRlclRyZWVEdW1wKCk7
CisgICAgICAgIHJlc3VsdFN0cmluZyA9IER1bXBSZW5kZXJUcmVlU3VwcG9ydFF0OjpmcmFtZVJl
bmRlclRyZWVEdW1wKG1haW5GcmFtZS0+aGFuZGxlKCkpOwogICAgICAgICByZXN1bHRTdHJpbmcg
Kz0gZHVtcEZyYW1lU2Nyb2xsUG9zaXRpb24obWFpbkZyYW1lKTsKICAgICB9CiAgICAgaWYgKCFy
ZXN1bHRTdHJpbmcuaXNFbXB0eSgpKSB7CmRpZmYgLS1naXQgYS9Ub29scy9NaW5pQnJvd3Nlci9x
dC9NaW5pQnJvd3Nlci5wcm8gYi9Ub29scy9NaW5pQnJvd3Nlci9xdC9NaW5pQnJvd3Nlci5wcm8K
aW5kZXggMGZiZGRiZTEzMzMwMDMyYTcwY2RiZjY1ZDM0M2UyYTJkMDhlNWMzMi4uM2RiMWM3ODg3
YzQyOWYwM2E1YjM2OTAxZWViZmNkYmU2YmI1MWE2OCAxMDA2NDQKLS0tIGEvVG9vbHMvTWluaUJy
b3dzZXIvcXQvTWluaUJyb3dzZXIucHJvCisrKyBiL1Rvb2xzL01pbmlCcm93c2VyL3F0L01pbmlC
cm93c2VyLnBybwpAQCAtMzAsNyArMzAsNyBAQCBERVNURElSID0gJCR7Uk9PVF9CVUlMRF9ESVJ9
L2JpbgogCiBoYXZlPyhGT05UQ09ORklHKTogUEtHQ09ORklHICs9IGZvbnRjb25maWcKIAotUVQg
Kz0gbmV0d29yayBndWktcHJpdmF0ZSBxdWljayBxdWljay1wcml2YXRlIHdlYmtpdHdpZGdldHMg
d2Via2l0d2lkZ2V0cy1wcml2YXRlCitRVCArPSBuZXR3b3JrIGd1aS1wcml2YXRlIHF1aWNrIHF1
aWNrLXByaXZhdGUgd2Via2l0IHdlYmtpdC1wcml2YXRlCiBtYWN4OiBRVCArPSB4bWwKIAogUkVT
T1VSQ0VTICs9IE1pbmlCcm93c2VyLnFyYwpkaWZmIC0tZ2l0IGEvVG9vbHMvU2NyaXB0cy93ZWJr
aXRweS9zdHlsZS9jaGVja2VyLnB5IGIvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9zdHlsZS9jaGVj
a2VyLnB5CmluZGV4IDI4MmMzM2I3MDM5MTkxOWRkNWI5ODdlMGEyZmE1ODU0ZDdjZThmMGUuLjdh
MTUxOGI1YmM5NDNmZWM4MjRmYzE5MDgxZDk0NjRjZjUyMjJkMDcgMTAwNjQ0Ci0tLSBhL1Rvb2xz
L1NjcmlwdHMvd2Via2l0cHkvc3R5bGUvY2hlY2tlci5weQorKysgYi9Ub29scy9TY3JpcHRzL3dl
YmtpdHB5L3N0eWxlL2NoZWNrZXIucHkKQEAgLTE0OSw3ICsxNDksOCBAQCBfUEFUSF9SVUxFU19T
UEVDSUZJRVIgPSBbCiAKICAgICAoWyMgVGhlIFF0IEFQSXMgdXNlIFF0IGRlY2xhcmF0aW9uIHN0
eWxlLCBpdCBwdXRzIHRoZSAqIHRvCiAgICAgICAjIHRoZSB2YXJpYWJsZSBuYW1lLCBub3QgdG8g
dGhlIGNsYXNzLgotICAgICAgIlNvdXJjZS9XZWJLaXQvcXQvQXBpLyJdLAorICAgICAgIlNvdXJj
ZS9XZWJLaXQvcXQvQXBpLyIsCisgICAgICAiU291cmNlL1dlYktpdC9xdC9XaWRnZXRBcGkvIl0s
CiAgICAgIFsiLXJlYWRhYmlsaXR5L25hbWluZyIsCiAgICAgICAiLXdoaXRlc3BhY2UvZGVjbGFy
YXRpb24iXSksCiAKZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvc3R5bGUvY2hl
Y2tlcl91bml0dGVzdC5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvc3R5bGUvY2hlY2tlcl91
bml0dGVzdC5weQppbmRleCAzZGUzOWViYjBhODdjYzlkYTFkMmIyYTAxYmQ4MDhjMWJjNmJkYWNk
Li4zYjdkOTRjMDIxMzJmOTMyY2RmOTk2OWNmNzJjMGEzNjQzMWIwNWVmIDEwMDc1NQotLS0gYS9U
b29scy9TY3JpcHRzL3dlYmtpdHB5L3N0eWxlL2NoZWNrZXJfdW5pdHRlc3QucHkKKysrIGIvVG9v
bHMvU2NyaXB0cy93ZWJraXRweS9zdHlsZS9jaGVja2VyX3VuaXR0ZXN0LnB5CkBAIC0yMjcsNyAr
MjI3LDcgQEAgY2xhc3MgR2xvYmFsVmFyaWFibGVzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAg
ICAgICAgICAgICAgICAgICAgICAgInJlYWRhYmlsaXR5L25hbWluZyIpCiAKICAgICAgICAgIyBU
ZXN0IGlmIFF0IGV4Y2VwdGlvbnMgYXJlIGluZGVlZCB3b3JraW5nCi0gICAgICAgIGFzc2VydENo
ZWNrKCJTb3VyY2UvV2ViS2l0L3F0L0FwaS9xd2VicGFnZS5jcHAiLAorICAgICAgICBhc3NlcnRD
aGVjaygiU291cmNlL1dlYktpdC9xdC9XaWRnZXRBcGkvcXdlYnBhZ2UuY3BwIiwKICAgICAgICAg
ICAgICAgICAgICAgInJlYWRhYmlsaXR5L2JyYWNlcyIpCiAgICAgICAgIGFzc2VydENoZWNrKCJT
b3VyY2UvV2ViS2l0L3F0L3Rlc3RzL3F3ZWJlbGVtZW50L3RzdF9xd2ViZWxlbWVudC5jcHAiLAog
ICAgICAgICAgICAgICAgICAgICAicmVhZGFiaWxpdHkvYnJhY2VzIikKQEAgLTIzNSw3ICsyMzUs
NyBAQCBjbGFzcyBHbG9iYWxWYXJpYWJsZXNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICAg
ICAgICAgICAgICAgICAgInJlYWRhYmlsaXR5L2JyYWNlcyIpCiAgICAgICAgIGFzc2VydENoZWNr
KCJTb3VyY2UvV2ViS2l0L3F0L2V4YW1wbGVzL3BsYXRmb3JtcGx1Z2luL1dlYlBsdWdpbi5jcHAi
LAogICAgICAgICAgICAgICAgICAgICAicmVhZGFiaWxpdHkvYnJhY2VzIikKLSAgICAgICAgYXNz
ZXJ0Tm9DaGVjaygiU291cmNlL1dlYktpdC9xdC9BcGkvcXdlYnBhZ2UuY3BwIiwKKyAgICAgICAg
YXNzZXJ0Tm9DaGVjaygiU291cmNlL1dlYktpdC9xdC9XaWRnZXRBcGkvcXdlYnBhZ2UuY3BwIiwK
ICAgICAgICAgICAgICAgICAgICAgICAicmVhZGFiaWxpdHkvbmFtaW5nIikKICAgICAgICAgYXNz
ZXJ0Tm9DaGVjaygiU291cmNlL1dlYktpdC9xdC90ZXN0cy9xd2ViZWxlbWVudC90c3RfcXdlYmVs
ZW1lbnQuY3BwIiwKICAgICAgICAgICAgICAgICAgICAgICAicmVhZGFiaWxpdHkvbmFtaW5nIikK
ZGlmZiAtLWdpdCBhL1Rvb2xzL1dlYktpdFRlc3RSdW5uZXIvSW5qZWN0ZWRCdW5kbGUvVGFyZ2V0
LnByaSBiL1Rvb2xzL1dlYktpdFRlc3RSdW5uZXIvSW5qZWN0ZWRCdW5kbGUvVGFyZ2V0LnByaQpp
bmRleCBkNzMwNWUzYWNlMjFkOTA5NTA2ZjY5YzMzZmU4MDkyZTIwNDQwZTY4Li5iMDA5MTE5NGE2
NzVjYTNhNmEzYzVlOTlkZjc1NDdjYTFmMGJhYjU5IDEwMDY0NAotLS0gYS9Ub29scy9XZWJLaXRU
ZXN0UnVubmVyL0luamVjdGVkQnVuZGxlL1RhcmdldC5wcmkKKysrIGIvVG9vbHMvV2ViS2l0VGVz
dFJ1bm5lci9JbmplY3RlZEJ1bmRsZS9UYXJnZXQucHJpCkBAIC00OCw3ICs0OCw3IEBAIEhFQURF
UlMgKz0gXAogCiBERVNURElSID0gJCR7Uk9PVF9CVUlMRF9ESVJ9L2xpYgogCi1RVCArPSB3aWRn
ZXRzIHdlYmtpdHdpZGdldHMKK1FUICs9IHdpZGdldHMgd2Via2l0CiAKIFdFQktJVCArPSB3dGYg
amF2YXNjcmlwdGNvcmUgd2ViY29yZQogCmRpZmYgLS1naXQgYS9Ub29scy9xbWFrZS9ta3NwZWNz
L2ZlYXR1cmVzL2RlZmF1bHRfcG9zdC5wcmYgYi9Ub29scy9xbWFrZS9ta3NwZWNzL2ZlYXR1cmVz
L2RlZmF1bHRfcG9zdC5wcmYKaW5kZXggMGMzMGQ1YTlkODlmYzE4ZDdmZWMyYzRhZGNmNmNhZTRi
N2ZiNzgwMy4uNTg5NjcxODgzYWU1ZTk2YTBiNWZjNWE2NzczOGQzNjhkY2I1MWFhMyAxMDA2NDQK
LS0tIGEvVG9vbHMvcW1ha2UvbWtzcGVjcy9mZWF0dXJlcy9kZWZhdWx0X3Bvc3QucHJmCisrKyBi
L1Rvb2xzL3FtYWtlL21rc3BlY3MvZmVhdHVyZXMvZGVmYXVsdF9wb3N0LnByZgpAQCAtMTU2LDcg
KzE1Niw3IEBAIGNvbnRhaW5zKFRFTVBMQVRFLCBsaWIpIHsKICAgICBERUZJTkVTICs9IEJVSUxE
SU5HXyQke1RBUkdFVH0KIAogICAgICMgVHJpZ2dlcnMgdGhlIHJpZ2h0IGV4cG9ydCBtYWNybyBm
b3IgdGhlIFF0V2ViS2l0IEFQSSAoc2VlIHF3ZWJraXRnbG9iYWwuaCkKLSAgICAhY29udGFpbnMo
UVQsIHdlYmtpdHdpZGdldHMpOiBERUZJTkVTICs9IEJVSUxESU5HX1dFQktJVAorICAgICFjb250
YWlucyhRVCwgd2Via2l0KXxlcXVhbHMoTU9EVUxFLCB3ZWJraXR3aWRnZXRzKTogREVGSU5FUyAr
PSBCVUlMRElOR19XRUJLSVQKIAogICAgICMgUHJldmVudCBuYW1lIGNsYXNoZXMgd2hlbiBidWls
ZGluZyBib3RoIGRlYnVnIGFuZCByZWxlYXNlLiBRdDUncyBtb2R1bGUKICAgICAjIHN5c3RlbSBh
bHJlYWR5IHRha2VzIGNhcmUgb2YgdGhpcyBmb3IgdGhlIHRvcCBsZXZlbCBRdFdlYktpdCBsaWJy
YXJ5LgpAQCAtMTcyLDEyICsxNzIsMTIgQEAgY29udGFpbnMoVEVNUExBVEUsIGxpYikgewogICAg
IH0KIH0KIAotY29udGFpbnMoUVQsIHdlYmtpdHdpZGdldHMpIHsKK2NvbnRhaW5zKFFULCB3ZWJr
aXQpfGNvbnRhaW5zKFFULCB3ZWJraXR3aWRnZXRzKSB7CiAgICAgIyBJbiBhZGRpdGlvbiB0byB0
aGUgbWFpbiBzaGFyZWQgUXRXZWJLaXQgbGlicmFyeSB3ZSBhbHNvCiAgICAgIyBuZWVkIHRvIGxp
bmsgdG8gYW55IGludGVybWVkaWF0ZSBzaGFyZWQgbGlicmFyaWVzLgogICAgIGZvcmNlX3N0YXRp
Y19saWJzX2FzX3NoYXJlZCB7CiAgICAgICAgIFdFQktJVCArPSB3dGYgamF2YXNjcmlwdGNvcmUg
d2ViY29yZQotICAgICAgICBidWlsZD8od2Via2l0MSk6IFdFQktJVCArPSB3ZWJraXR3aWRnZXRz
IHdlYmtpdDEKKyAgICAgICAgYnVpbGQ/KHdlYmtpdDEpOiBXRUJLSVQgKz0gd2Via2l0MQogICAg
ICAgICBidWlsZD8od2Via2l0Mik6IFdFQktJVCArPSB3ZWJraXQyCiAgICAgfQogCkBAIC0xOTMs
MTIgKzE5MywxMiBAQCBkZWZpbmVUZXN0KG5lZWRUb0xpbmspIHsKICAgICAgICAgY29udGFpbnMo
bGlicmFyaWVzLCAkJFRBUkdFVCk6IHJldHVybih0cnVlKQogCiAgICAgICAgICMgT3IgYW55dGhp
bmcgdGhhdCB1c2VzIFF0V2ViS2l0IGluIHRoaXMgc3BlY2lhbCBjb25maWcKLSAgICAgICAgY29u
dGFpbnMoUVQsIHdlYmtpdHdpZGdldHMpOiByZXR1cm4odHJ1ZSkKKyAgICAgICAgY29udGFpbnMo
UVQsIHdlYmtpdCk6IHJldHVybih0cnVlKQogICAgIH0KIAogICAgICMgTGFzdGx5LCB3ZSBhbGxv
dyBhcHBzIChqc2MpIHRvIGxpbmsgZGlyZWN0bHkgdG8gdGhlIGludGVybWVkaWF0ZQogICAgICMg
bGlicmFyaWVzIGludGVhZCBvZiB1c2luZyB0aGUgZXhwb3J0ZWQgc3ltYm9scyBmcm9tIFF0V2Vi
S2l0LgotICAgIGNvbnRhaW5zKFRFTVBMQVRFLCBhcHApOiFjb250YWlucyhRVCwgd2Via2l0d2lk
Z2V0cyk6IHJldHVybih0cnVlKQorICAgIGNvbnRhaW5zKFRFTVBMQVRFLCBhcHApOiFjb250YWlu
cyhRVCwgd2Via2l0KTohY29udGFpbnMoUVQsIHdlYmtpdHdpZGdldHMpOiByZXR1cm4odHJ1ZSkK
IAogICAgICMgQW55dGhpbmcgZWxzZSBzaG91bGQganVzdCBnZXQgaW5jbHVkZSBwYXRocywgZXRj
LCBub3QgbGluawogICAgIHJldHVybihmYWxzZSkKZGlmZiAtLWdpdCBhL1Rvb2xzL3FtYWtlL21r
c3BlY3MvZmVhdHVyZXMvd2Via2l0X21vZHVsZXMucHJmIGIvVG9vbHMvcW1ha2UvbWtzcGVjcy9m
ZWF0dXJlcy93ZWJraXRfbW9kdWxlcy5wcmYKaW5kZXggNTA1YjgyNjU4ZTIxOGQ2MjY2MGZkMjgx
YmY1NmFlOWIxNzY5MzBhMy4uMTg5Mzg3ODM1MjcwYzczZTU2OTc0MTZhNzkwN2IyNDBhNTNmYWJi
OCAxMDA2NDQKLS0tIGEvVG9vbHMvcW1ha2UvbWtzcGVjcy9mZWF0dXJlcy93ZWJraXRfbW9kdWxl
cy5wcmYKKysrIGIvVG9vbHMvcW1ha2UvbWtzcGVjcy9mZWF0dXJlcy93ZWJraXRfbW9kdWxlcy5w
cmYKQEAgLTcsNyArNyw3IEBACiAKICMgUmVvcmRlciBsaWJyYXJpZXMgc28gdGhhdCB0aGUgbGlu
ayBhbmQgaW5jbHVkZSBvcmRlciBpcyBjb3JyZWN0LAogIyBhbmQgbWFrZSBzdXJlIHRoZSBjYXNl
IG1hdGNoZXMgdGhlIG9yaWdpbmFsIGNhc2UuCi1saWJyYXJpZXMgPSBXZWJLaXRXaWRnZXRzIFdl
YktpdDEgV2ViS2l0MiBXZWJDb3JlIEFOR0xFIEphdmFTY3JpcHRDb3JlIFdURgorbGlicmFyaWVz
ID0gV2ViS2l0MSBXZWJLaXQyIFdlYkNvcmUgQU5HTEUgSmF2YVNjcmlwdENvcmUgV1RGCiBmb3Io
bGlicmFyeSwgbGlicmFyaWVzKSB7CiAgICAgY29udGFpbnMoV0VCS0lULCAkJGxvd2VyKCQkbGli
cmFyeSkpIHsKICAgICAgICAgV0VCS0lUIC09ICQkbG93ZXIoJCRsaWJyYXJ5KQpAQCAtMzQsMTEg
KzM0LDkgQEAgZm9yKGxpYnJhcnksIFdFQktJVCkgewogCiAgICAgIyBBbnl0aGluZyBub3QgbGlu
a2luZyBkeW5hbWljYWxseSB0byBRdFdlYktpdCBzaG91bGQgbWFrZSBzdXJlIHRvIGhhdmUgaXRz
IGV4cG9ydAogICAgICMgbWFjcm9zIHN5bmNocm9uaXplZCB3aXRoIHRoZSBjb2RlIHRoYXQgaXQg
d2lsbCBiZSBsaW5rZWQgd2l0aCBzdGF0aWNhbGx5LgotICAgICFjb250YWlucyhRVCwgd2Via2l0
d2lkZ2V0cyk6IERFRklORVMgKz0gU1RBVElDQUxMWV9MSU5LRURfV0lUSF8kJGxpYnJhcnkKKyAg
ICAhY29udGFpbnMoUVQsIHdlYmtpdCk6IERFRklORVMgKz0gU1RBVElDQUxMWV9MSU5LRURfV0lU
SF8kJGxpYnJhcnkKIH0KIAotIWlzRW1wdHkoTU9EVUxFKTogQ09ORklHICs9IGNyZWF0aW5nX21v
ZHVsZQotCiBjcmVhdGluZ19tb2R1bGUgewogICAgICMgU2FuaXRpemUgUEtHQ09ORklHIGFzIHdl
IGRvbid0IHdhbnQgYW55IG9mIHRoZXNlIGxpYnJhcmllcwogICAgICMgdG8gZW5kIHVwIGluIGFz
IHB1YmxpYyBBUEkgZGVwZW5kZW5pY2VzIGluIHRoZSBRdFdlYktpdCBwcmwgZmlsZS4KZGlmZiAt
LWdpdCBhL1Rvb2xzL3FtYWtlL21rc3BlY3MvbW9kdWxlcy93ZWJraXR3aWRnZXRzLnByZiBiL1Rv
b2xzL3FtYWtlL21rc3BlY3MvbW9kdWxlcy93ZWJraXR3aWRnZXRzLnByZgpkZWxldGVkIGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggY2ExNjQzYzhkZjAwMTBkZmFkMjc1YTM0ZDNiNjE4YjlhZmZiZDFk
Yy4uMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAotLS0gYS9Ub29scy9x
bWFrZS9ta3NwZWNzL21vZHVsZXMvd2Via2l0d2lkZ2V0cy5wcmYKKysrIC9kZXYvbnVsbApAQCAt
MSw5ICswLDAgQEAKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBNb2R1bGUgZmlsZSBmb3IgV2ViS2l0V2lkZ2V0
LCB1c2VkIGJ5IHRhcmdldHMgdGhhdCBkZXBlbmQgb24gV2ViS2l0V2lkZ2V0Ci0jCi0jIFNlZSAn
VG9vbHMvcW1ha2UvUkVBRE1FJyBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIGJ1aWxkIHN5c3RlbQot
IyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tCi0KLVdFQktJVC53ZWJraXR3aWRnZXRzLnJvb3Rfc291cmNlX2RpciA9ICQk
e1JPT1RfV0VCS0lUX0RJUn0vU291cmNlL1dlYktpdAotCi1pbmNsdWRlKCQke1dFQktJVC53ZWJr
aXR3aWRnZXRzLnJvb3Rfc291cmNlX2Rpcn0vV2ViS2l0V2lkZ2V0cy5wcmkpCmRpZmYgLS1naXQg
YS9XZWJLaXQucHJvIGIvV2ViS2l0LnBybwppbmRleCBmYmE1Yjk5N2FjN2IzMjQxODZkZTc3NTk3
MWUzZDNkMGI5YTFjMDQ2Li44NzZkNTU0MTI2NjM4YjhhYmRhN2ZkZThlOTExNDZkMWM1N2VlZjZj
IDEwMDY0NAotLS0gYS9XZWJLaXQucHJvCisrKyBiL1dlYktpdC5wcm8KQEAgLTMyLDEwICszMiw2
IEBAIGJ1aWxkPyh3ZWJraXQxKSB7CiAgICAgd2Via2l0MS5maWxlID0gU291cmNlL1dlYktpdC9X
ZWJLaXQxLnBybwogICAgIHdlYmtpdDEubWFrZWZpbGUgPSBNYWtlZmlsZS5XZWJLaXQxCiAgICAg
U1VCRElSUyArPSB3ZWJraXQxCi0KLSAgICB3ZWJraXR3aWRnZXRzLmZpbGUgPSBTb3VyY2UvV2Vi
S2l0L1dlYktpdFdpZGdldHMucHJvCi0gICAgd2Via2l0d2lkZ2V0cy5tYWtlZmlsZSA9IE1ha2Vm
aWxlLldlYktpdFdpZGdldHMKLSAgICBTVUJESVJTICs9IHdlYmtpdHdpZGdldHMKIH0KIAogYnVp
bGQ/KHdlYmtpdDIpIHsK
</data>

          </attachment>
      

    </bug>

</bugzilla>