<?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>52968</bug_id>
          
          <creation_ts>2011-01-22 14:37:53 -0800</creation_ts>
          <short_desc>Use a separate NSView for printing</short_desc>
          <delta_ts>2011-01-23 14:28:15 -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>WebKit2</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Mac</rep_platform>
          <op_sys>OS X 10.6</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>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Alexey Proskuryakov">ap</reporter>
          <assigned_to name="Alexey Proskuryakov">ap</assigned_to>
          <cc>andersca</cc>
    
    <cc>commit-queue</cc>
    
    <cc>eric</cc>
    
    <cc>mitz</cc>
    
    <cc>sam</cc>
    
    <cc>tkent</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>338634</commentid>
    <comment_count>0</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2011-01-22 14:37:53 -0800</bug_when>
    <thetext>Printing an actual WKView means that we need to check for destination all the time, making code slower and more complicated. Also, it will be more difficult to get right when we start printing from a separate thread.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>338635</commentid>
    <comment_count>1</comment_count>
      <attachid>79857</attachid>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2011-01-22 14:42:23 -0800</bug_when>
    <thetext>Created attachment 79857
proposed patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>338637</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-01-22 14:43:57 -0800</bug_when>
    <thetext>Attachment 79857 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebKit2/ChangeLog&apos;, u&apos;Source/WebKit...&quot; exit_code: 1

Source/WebKit2/UIProcess/API/mac/WKPrintingView.h:33:  Code inside a namespace should not be indented.  [whitespace/indent] [4]
Total errors found: 1 in 5 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>338642</commentid>
    <comment_count>3</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-01-22 15:02:37 -0800</bug_when>
    <thetext>IIRC the Japan office is working on printing for Chromium and might be curious to see this go by.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>338663</commentid>
    <comment_count>4</comment_count>
      <attachid>79857</attachid>
    <who name="">mitz</who>
    <bug_when>2011-01-22 20:10:35 -0800</bug_when>
    <thetext>Comment on attachment 79857
proposed patch

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

&gt; Source/WebKit2/UIProcess/API/mac/WKPrintingView.h:26
&gt; +#import &lt;Cocoa/Cocoa.h&gt;

I see this imported from WebKit2Prefix.h. Isn’t that enough?

&gt; Source/WebKit2/UIProcess/API/mac/WKPrintingView.h:40
&gt; +    Vector&lt;WebCore::IntRect&gt; _webPrintingPageRects;
&gt; +    double _webTotalScaleFactorForPrinting;

Any reason for the “web” prefix in these two? Should this be a CGFloat instead of a double?

&gt; Source/WebKit2/UIProcess/API/mac/WKPrintingView.mm:32
&gt; +@interface NSView (Details)

In WebKit1, the convention for a category name like this is (WebNSViewDetails).

&gt; Source/WebKit2/UIProcess/API/mac/WKPrintingView.mm:42
&gt; +static float currentPrintOperationScale()

Seems like callers to this function already have the current operation, so this could have been a function that takes an NSPrintOperation * or simply an instance method in an NSOperation category. But I see that you’re just moving this code around.

&gt; Source/WebKit2/UIProcess/API/mac/WKPrintingView.mm:83
&gt; +        originalTopMargin = [info topMargin];
&gt; +        originalBottomMargin = [info bottomMargin];

-topMargin and -bottomMargin return CGFloats. Maybe this code should use more CGFloats (or doubles) and fewer floats.

&gt; Source/WebKit2/UIProcess/API/mac/WKPrintingView.mm:99
&gt; +// Return the number of pages available for printing
&gt; +- (BOOL)knowsPageRange:(NSRangePointer)range

Actually, it returns YES. I’m not sure the comment helps.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>338668</commentid>
    <comment_count>5</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2011-01-22 21:10:33 -0800</bug_when>
    <thetext>&gt; +    Vector&lt;WebCore::IntRect&gt; _webPrintingPageRects;
&gt; +    double _webTotalScaleFactorForPrinting;
&gt;
&gt; Any reason for the “web” prefix in these two? 

Just consistency with the third one.

&gt; Should this be a CGFloat instead of a double?

Not sure, why? I need a double for total scale factor in cross-platform code, and using a standard type as much as possible seems preferable.

&gt; In WebKit1, the convention for a category name like this is (WebNSViewDetails).

It doesn&apos;t seem like WebKit2 follows this convention, and I&apos;m not sure if there is any difference. But I&apos;ve changed it to WebNSViewDetails.

&gt; Seems like callers to this function already have the current operation, so this could have been
&gt; a function that takes an NSPrintOperation * or simply an instance method in an NSOperation
&gt; category. But I see that you’re just moving this code around.

I now see that starting with 10.6, NSPrintInfo has a proper scalingFactor method.

&gt; -topMargin and -bottomMargin return CGFloats. Maybe this code should use more CGFloats (or doubles) and fewer floats.

I felt uncomfortable using CGFloats with -doubleValue and +numberWithDouble, so changed to double.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>338669</commentid>
    <comment_count>6</comment_count>
      <attachid>79863</attachid>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2011-01-22 21:11:02 -0800</bug_when>
    <thetext>Created attachment 79863
patch for landing</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>338670</commentid>
    <comment_count>7</comment_count>
    <who name="">mitz</who>
    <bug_when>2011-01-22 21:15:40 -0800</bug_when>
    <thetext>(In reply to comment #5)
&gt; &gt; +    Vector&lt;WebCore::IntRect&gt; _webPrintingPageRects;
&gt; &gt; +    double _webTotalScaleFactorForPrinting;
&gt; &gt;
&gt; &gt; Any reason for the “web” prefix in these two? 
&gt; 
&gt; Just consistency with the third one.

The first one is “webFrame” because “frame” has a different meaning in the context of NSViews.

&gt; &gt; Should this be a CGFloat instead of a double?
&gt; 
&gt; Not sure, why? I need a double for total scale factor in cross-platform code, and using a standard type as much as possible seems preferable.

Agreed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>338753</commentid>
    <comment_count>8</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2011-01-23 14:27:29 -0800</bug_when>
    <thetext>The commit-queue encountered the following flaky tests while processing attachment 79863:

animations/suspend-resume-animation.html bug 48161 (author: cmarrin@apple.com)
The commit-queue is continuing to process your patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>338754</commentid>
    <comment_count>9</comment_count>
      <attachid>79863</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2011-01-23 14:28:09 -0800</bug_when>
    <thetext>Comment on attachment 79863
patch for landing

Clearing flags on attachment: 79863

Committed r76470: &lt;http://trac.webkit.org/changeset/76470&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>338755</commentid>
    <comment_count>10</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2011-01-23 14:28:15 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>79857</attachid>
            <date>2011-01-22 14:42:23 -0800</date>
            <delta_ts>2011-01-22 21:11:02 -0800</delta_ts>
            <desc>proposed patch</desc>
            <filename>PrintingView.txt</filename>
            <type>text/plain</type>
            <size>29948</size>
            <attacher name="Alexey Proskuryakov">ap</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
S2l0Mi9DaGFuZ2VMb2cJKHJldmlzaW9uIDc2NDU1KQorKysgU291cmNlL1dlYktpdDIvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzIgQEAKKzIwMTEtMDEtMjIgIEFsZXhleSBQ
cm9za3VyeWFrb3YgIDxhcEBhcHBsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZ
IChPT1BTISkuCisKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTUyOTY4CisgICAgICAgIFVzZSBhIHNlcGFyYXRlIE5TVmlldyBmb3IgcHJpbnRpbmcKKwor
ICAgICAgICBBbHNvIGFkZHJlc3NlcyA8cmRhcjovL3Byb2JsZW0vODkwMDE0OD4gSW1wcm9wZXIg
Y2hlY2sgZm9yIAorICAgICAgICAtW05TR3JhcGhpY3NDb250ZXh0IGN1cnJlbnRDb250ZXh0RHJh
d2luZ1RvU2NyZWVuXQorCisgICAgICAgICogVUlQcm9jZXNzL0FQSS9tYWMvV0tQcmludGluZ1Zp
ZXcuaDogQWRkZWQuCisgICAgICAgICogVUlQcm9jZXNzL0FQSS9tYWMvV0tQcmludGluZ1ZpZXcu
bW06IEFkZGVkLgorICAgICAgICAoY3VycmVudFByaW50T3BlcmF0aW9uU2NhbGUpOgorICAgICAg
ICAoLVtXS1ByaW50aW5nVmlldyBpbml0V2l0aEZyYW1lUHJveHk6XSk6CisgICAgICAgICgtW1dL
UHJpbnRpbmdWaWV3IGlzRmxpcHBlZF0pOgorICAgICAgICAoLVtXS1ByaW50aW5nVmlldyBfYWRq
dXN0UHJpbnRpbmdNYXJnaW5zRm9ySGVhZGVyQW5kRm9vdGVyXSk6CisgICAgICAgICgtW1dLUHJp
bnRpbmdWaWV3IGtub3dzUGFnZVJhbmdlOl0pOgorICAgICAgICAoLVtXS1ByaW50aW5nVmlldyBf
cmVjdXJzaXZlRGlzcGxheVJlY3RJZk5lZWRlZElnbm9yaW5nT3BhY2l0eTppc1Zpc2libGVSZWN0
OnJlY3RJc1Zpc2libGVSZWN0Rm9yVmlldzp0b3BWaWV3Ol0pOgorICAgICAgICAoLVtXS1ByaW50
aW5nVmlldyBkcmF3UGFnZUJvcmRlcldpdGhTaXplOl0pOgorICAgICAgICAoLVtXS1ByaW50aW5n
VmlldyBfcHJvdmlkZVRvdGFsU2NhbGVGYWN0b3JGb3JQcmludE9wZXJhdGlvbjpdKToKKyAgICAg
ICAgKC1bV0tQcmludGluZ1ZpZXcgcmVjdEZvclBhZ2U6XSk6CisgICAgICAgICogVUlQcm9jZXNz
L0FQSS9tYWMvV0tWaWV3Lm1tOgorICAgICAgICAoLVtXS1ZpZXcgZHJhd1JlY3Q6XSk6CisgICAg
ICAgICgtW1dLVmlldyBjYW5DaGFuZ2VGcmFtZUxheW91dDpdKToKKyAgICAgICAgKC1bV0tWaWV3
IHByaW50T3BlcmF0aW9uV2l0aFByaW50SW5mbzpmb3JGcmFtZTpdKToKKyAgICAgICAgKiBXZWJL
aXQyLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2o6CisgICAgICAgIE1vdmVkIHByaW50aW5nIGNv
ZGUgdG8gYSBzZXBhcmF0ZSB2aWV3LCBzaW1wbGlmeWluZyBhcyBhcHByb3ByaWF0ZS4gVGhlIHZp
ZXcgaXMgY3VycmVudGx5IG5vdAorICAgICAgICByZWZlcmVuY2VkIGJ5IGFueXRoaW5nIGluIFdl
YktpdDIgZGlyZWN0bHksIGJlaW5nIG93bmVkIGJ5IE5TUHJpbnRPcGVyYXRpb24uCisKIDIwMTEt
MDEtMjIgIEFuZGVycyBDYXJsc3NvbiAgPGFuZGVyc2NhQGFwcGxlLmNvbT4KIAogICAgICAgICBS
ZXZpZXdlZCBieSBTYW0gV2VpbmlnLgpJbmRleDogU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQ
SS9tYWMvV0tQcmludGluZ1ZpZXcuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9VSVBy
b2Nlc3MvQVBJL21hYy9XS1ByaW50aW5nVmlldy5oCShyZXZpc2lvbiAwKQorKysgU291cmNlL1dl
YktpdDIvVUlQcm9jZXNzL0FQSS9tYWMvV0tQcmludGluZ1ZpZXcuaAkocmV2aXNpb24gMCkKQEAg
LTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJworICogQU5EIEFO
WSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMKKyAqIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbXBvcnQgPENvY29hL0NvY29hLmg+CisjaW1w
b3J0IDxXZWJDb3JlL0ludFJlY3QuaD4KKyNpbXBvcnQgPHd0Zi9SZWZQdHIuaD4KKworQGNsYXNz
IFdLUHJpbnRpbmdWaWV3RGF0YTsKKworbmFtZXNwYWNlIFdlYktpdCB7CisgICAgY2xhc3MgV2Vi
RnJhbWVQcm94eTsKK30KKworQGludGVyZmFjZSBXS1ByaW50aW5nVmlldyA6IE5TVmlldyB7CitA
cHVibGljCisgICAgUmVmUHRyPFdlYktpdDo6V2ViRnJhbWVQcm94eT4gX3dlYkZyYW1lOworICAg
IFZlY3RvcjxXZWJDb3JlOjpJbnRSZWN0PiBfd2ViUHJpbnRpbmdQYWdlUmVjdHM7CisgICAgZG91
YmxlIF93ZWJUb3RhbFNjYWxlRmFjdG9yRm9yUHJpbnRpbmc7Cit9CisKKy0gKGlkKWluaXRXaXRo
RnJhbWVQcm94eTooV2ViS2l0OjpXZWJGcmFtZVByb3h5KilmcmFtZTsKKworQGVuZApJbmRleDog
U291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9tYWMvV0tQcmludGluZ1ZpZXcubW0KPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9tYWMvV0tQcmludGluZ1ZpZXcu
bW0JKHJldmlzaW9uIDApCisrKyBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL21hYy9XS1By
aW50aW5nVmlldy5tbQkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxODkgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENP
TlRSSUJVVE9SUyBgYEFTIElTJycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UiBJVFMgQ09OVFJJQlVUT1JTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICog
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAq
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLwor
CisjaW1wb3J0ICJXS1ByaW50aW5nVmlldy5oIgorCisjaW1wb3J0ICJMb2dnaW5nLmgiCisjaW1w
b3J0ICJQcmludEluZm8uaCIKKyNpbXBvcnQgIldlYlBhZ2VQcm94eS5oIgorCitAaW50ZXJmYWNl
IE5TVmlldyAoRGV0YWlscykKKy0gKHZvaWQpX3JlY3Vyc2l2ZURpc3BsYXlSZWN0SWZOZWVkZWRJ
Z25vcmluZ09wYWNpdHk6KE5TUmVjdClyZWN0IGlzVmlzaWJsZVJlY3Q6KEJPT0wpaXNWaXNpYmxl
UmVjdCByZWN0SXNWaXNpYmxlUmVjdEZvclZpZXc6KE5TVmlldyAqKXZpc2libGVWaWV3IHRvcFZp
ZXc6KEJPT0wpdG9wVmlldzsKK0BlbmQKKwordXNpbmcgbmFtZXNwYWNlIFdlYktpdDsKK3VzaW5n
IG5hbWVzcGFjZSBXZWJDb3JlOworCitOU1N0cmluZyAqIGNvbnN0IFdlYktpdE9yaWdpbmFsVG9w
UHJpbnRpbmdNYXJnaW5LZXkgPSBAIldlYktpdE9yaWdpbmFsVG9wTWFyZ2luIjsKK05TU3RyaW5n
ICogY29uc3QgV2ViS2l0T3JpZ2luYWxCb3R0b21QcmludGluZ01hcmdpbktleSA9IEAiV2ViS2l0
T3JpZ2luYWxCb3R0b21NYXJnaW4iOworCitzdGF0aWMgZmxvYXQgY3VycmVudFByaW50T3BlcmF0
aW9uU2NhbGUoKQoreworICAgIEFTU0VSVChbTlNQcmludE9wZXJhdGlvbiBjdXJyZW50T3BlcmF0
aW9uXSk7CisgICAgQVNTRVJUKFtbW1tOU1ByaW50T3BlcmF0aW9uIGN1cnJlbnRPcGVyYXRpb25d
IHByaW50SW5mb10gZGljdGlvbmFyeV0gb2JqZWN0Rm9yS2V5Ok5TUHJpbnRTY2FsaW5nRmFjdG9y
XSk7CisgICAgcmV0dXJuIFtbW1tbTlNQcmludE9wZXJhdGlvbiBjdXJyZW50T3BlcmF0aW9uXSBw
cmludEluZm9dIGRpY3Rpb25hcnldIG9iamVjdEZvcktleTpOU1ByaW50U2NhbGluZ0ZhY3Rvcl0g
ZmxvYXRWYWx1ZV07Cit9CisKK0BpbXBsZW1lbnRhdGlvbiBXS1ByaW50aW5nVmlldworCistIChp
ZClpbml0V2l0aEZyYW1lUHJveHk6KFdlYkZyYW1lUHJveHkqKWZyYW1lCit7CisgICAgc2VsZiA9
IFtzdXBlciBpbml0XTsgLy8gTm8gZnJhbWUgcmVjdCB0byBwYXNzIHRvIE5TVmlldy4KKyAgICBp
ZiAoIXNlbGYpCisgICAgICAgIHJldHVybiBuaWw7CisKKyAgICBfd2ViRnJhbWUgPSBmcmFtZTsK
KworICAgIHJldHVybiBzZWxmOworfQorCistIChCT09MKWlzRmxpcHBlZAoreworICAgIHJldHVy
biBZRVM7Cit9CisKKy0gKHZvaWQpX2FkanVzdFByaW50aW5nTWFyZ2luc0ZvckhlYWRlckFuZEZv
b3RlcgoreworICAgIE5TUHJpbnRPcGVyYXRpb24gKnByaW50T3BlcmF0aW9uID0gW05TUHJpbnRP
cGVyYXRpb24gY3VycmVudE9wZXJhdGlvbl07CisgICAgTlNQcmludEluZm8gKmluZm8gPSBbcHJp
bnRPcGVyYXRpb24gcHJpbnRJbmZvXTsKKyAgICBOU011dGFibGVEaWN0aW9uYXJ5ICppbmZvRGlj
dGlvbmFyeSA9IFtpbmZvIGRpY3Rpb25hcnldOworCisgICAgLy8gV2UgbmVlZCB0byBtb2RpZnkg
dGhlIHRvcCBhbmQgYm90dG9tIG1hcmdpbnMgaW4gdGhlIE5TUHJpbnRJbmZvIHRvIGFjY291bnQg
Zm9yIHRoZSBzcGFjZSBuZWVkZWQgYnkgdGhlCisgICAgLy8gaGVhZGVyIGFuZCBmb290ZXIuIEJl
Y2F1c2UgdGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgc2Ft
ZSBOU1ByaW50SW5mbyAoc2VlIDUwMzgwODcpLAorICAgIC8vIHdlIHN0YXNoIGF3YXkgdGhlIHVu
bW9kaWZpZWQgdG9wIGFuZCBib3R0b20gbWFyZ2lucyB0aGUgZmlyc3QgdGltZSB0aGlzIG1ldGhv
ZCBpcyBjYWxsZWQsIGFuZCB3ZSByZWFkIGZyb20KKyAgICAvLyB0aG9zZSBzdGFzaGVkLWF3YXkg
dmFsdWVzIG9uIHN1YnNlcXVlbnQgY2FsbHMuCisgICAgZmxvYXQgb3JpZ2luYWxUb3BNYXJnaW47
CisgICAgZmxvYXQgb3JpZ2luYWxCb3R0b21NYXJnaW47CisgICAgTlNOdW1iZXIgKm9yaWdpbmFs
VG9wTWFyZ2luTnVtYmVyID0gW2luZm9EaWN0aW9uYXJ5IG9iamVjdEZvcktleTpXZWJLaXRPcmln
aW5hbFRvcFByaW50aW5nTWFyZ2luS2V5XTsKKyAgICBpZiAoIW9yaWdpbmFsVG9wTWFyZ2luTnVt
YmVyKSB7CisgICAgICAgIEFTU0VSVCghW2luZm9EaWN0aW9uYXJ5IG9iamVjdEZvcktleTpXZWJL
aXRPcmlnaW5hbEJvdHRvbVByaW50aW5nTWFyZ2luS2V5XSk7CisgICAgICAgIG9yaWdpbmFsVG9w
TWFyZ2luID0gW2luZm8gdG9wTWFyZ2luXTsKKyAgICAgICAgb3JpZ2luYWxCb3R0b21NYXJnaW4g
PSBbaW5mbyBib3R0b21NYXJnaW5dOworICAgICAgICBbaW5mb0RpY3Rpb25hcnkgc2V0T2JqZWN0
OltOU051bWJlciBudW1iZXJXaXRoRmxvYXQ6b3JpZ2luYWxUb3BNYXJnaW5dIGZvcktleTpXZWJL
aXRPcmlnaW5hbFRvcFByaW50aW5nTWFyZ2luS2V5XTsKKyAgICAgICAgW2luZm9EaWN0aW9uYXJ5
IHNldE9iamVjdDpbTlNOdW1iZXIgbnVtYmVyV2l0aEZsb2F0Om9yaWdpbmFsQm90dG9tTWFyZ2lu
XSBmb3JLZXk6V2ViS2l0T3JpZ2luYWxCb3R0b21QcmludGluZ01hcmdpbktleV07CisgICAgfSBl
bHNlIHsKKyAgICAgICAgQVNTRVJUKFtvcmlnaW5hbFRvcE1hcmdpbk51bWJlciBpc0tpbmRPZkNs
YXNzOltOU051bWJlciBjbGFzc11dKTsKKyAgICAgICAgQVNTRVJUKFtbaW5mb0RpY3Rpb25hcnkg
b2JqZWN0Rm9yS2V5OldlYktpdE9yaWdpbmFsQm90dG9tUHJpbnRpbmdNYXJnaW5LZXldIGlzS2lu
ZE9mQ2xhc3M6W05TTnVtYmVyIGNsYXNzXV0pOworICAgICAgICBvcmlnaW5hbFRvcE1hcmdpbiA9
IFtvcmlnaW5hbFRvcE1hcmdpbk51bWJlciBmbG9hdFZhbHVlXTsKKyAgICAgICAgb3JpZ2luYWxC
b3R0b21NYXJnaW4gPSBbW2luZm9EaWN0aW9uYXJ5IG9iamVjdEZvcktleTpXZWJLaXRPcmlnaW5h
bEJvdHRvbVByaW50aW5nTWFyZ2luS2V5XSBmbG9hdFZhbHVlXTsKKyAgICB9CisgICAgCisgICAg
ZmxvYXQgc2NhbGUgPSBjdXJyZW50UHJpbnRPcGVyYXRpb25TY2FsZSgpOworICAgIFtpbmZvIHNl
dFRvcE1hcmdpbjpvcmlnaW5hbFRvcE1hcmdpbiArIF93ZWJGcmFtZS0+cGFnZSgpLT5oZWFkZXJI
ZWlnaHQoX3dlYkZyYW1lLmdldCgpKSAqIHNjYWxlXTsKKyAgICBbaW5mbyBzZXRCb3R0b21NYXJn
aW46b3JpZ2luYWxCb3R0b21NYXJnaW4gKyBfd2ViRnJhbWUtPnBhZ2UoKS0+Zm9vdGVySGVpZ2h0
KF93ZWJGcmFtZS5nZXQoKSkgKiBzY2FsZV07Cit9CisKKy8vIFJldHVybiB0aGUgbnVtYmVyIG9m
IHBhZ2VzIGF2YWlsYWJsZSBmb3IgcHJpbnRpbmcKKy0gKEJPT0wpa25vd3NQYWdlUmFuZ2U6KE5T
UmFuZ2VQb2ludGVyKXJhbmdlCit7CisgICAgTE9HKFZpZXcsICJrbm93c1BhZ2VSYW5nZToiKTsK
KyAgICBbc2VsZiBfYWRqdXN0UHJpbnRpbmdNYXJnaW5zRm9ySGVhZGVyQW5kRm9vdGVyXTsKKwor
ICAgIF93ZWJGcmFtZS0+cGFnZSgpLT5jb21wdXRlUGFnZXNGb3JQcmludGluZyhfd2ViRnJhbWUu
Z2V0KCksIFByaW50SW5mbyhbW05TUHJpbnRPcGVyYXRpb24gY3VycmVudE9wZXJhdGlvbl0gcHJp
bnRJbmZvXSksIF93ZWJQcmludGluZ1BhZ2VSZWN0cywgX3dlYlRvdGFsU2NhbGVGYWN0b3JGb3JQ
cmludGluZyk7CisKKyAgICAqcmFuZ2UgPSBOU01ha2VSYW5nZSgxLCBfd2ViUHJpbnRpbmdQYWdl
UmVjdHMuc2l6ZSgpKTsKKyAgICByZXR1cm4gWUVTOworfQorCisvLyBUYWtlIG92ZXIgcHJpbnRp
bmcuIEFwcEtpdCBhcHBsaWVzIGluY29ycmVjdCBjbGlwcGluZywgYW5kIGRvZXNuJ3QgcHJpbnQg
cGFnZXMgYmV5b25kIHRoZSBmaXJzdCBvbmUuCistICh2b2lkKV9yZWN1cnNpdmVEaXNwbGF5UmVj
dElmTmVlZGVkSWdub3JpbmdPcGFjaXR5OihOU1JlY3QpcmVjdCBpc1Zpc2libGVSZWN0OihCT09M
KWlzVmlzaWJsZVJlY3QgcmVjdElzVmlzaWJsZVJlY3RGb3JWaWV3OihOU1ZpZXcgKil2aXNpYmxl
VmlldyB0b3BWaWV3OihCT09MKXRvcFZpZXcKK3sKKyAgICBMT0coVmlldywgIlByaW50aW5nIHJl
Y3QgeDolZywgeTolZywgd2lkdGg6JWcsIGhlaWdodDolZyIsIHJlY3Qub3JpZ2luLngsIHJlY3Qu
b3JpZ2luLnksIHJlY3Quc2l6ZS53aWR0aCwgcmVjdC5zaXplLmhlaWdodCk7CisKKyAgICBBU1NF
UlQoc2VsZiA9PSB2aXNpYmxlVmlldyk7CisKKyAgICBfd2ViRnJhbWUtPnBhZ2UoKS0+YmVnaW5Q
cmludGluZyhfd2ViRnJhbWUuZ2V0KCksIFByaW50SW5mbyhbW05TUHJpbnRPcGVyYXRpb24gY3Vy
cmVudE9wZXJhdGlvbl0gcHJpbnRJbmZvXSkpOworCisgICAgLy8gRklYTUU6IFRoaXMgaXMgb3B0
aW1pemVkIGZvciBwcmludCBwcmV2aWV3LiBHZXQgdGhlIHdob2xlIGRvY3VtZW50IGF0IG9uY2Ug
d2hlbiBhY3R1YWxseSBwcmludGluZy4KKyAgICBWZWN0b3I8dWludDhfdD4gcGRmRGF0YTsKKyAg
ICBfd2ViRnJhbWUtPnBhZ2UoKS0+ZHJhd1JlY3RUb1BERihfd2ViRnJhbWUuZ2V0KCksIEludFJl
Y3QocmVjdCksIHBkZkRhdGEpOworCisgICAgUmV0YWluUHRyPENHRGF0YVByb3ZpZGVyUmVmPiBw
ZGZEYXRhUHJvdmlkZXIoQWRvcHRDRiwgQ0dEYXRhUHJvdmlkZXJDcmVhdGVXaXRoRGF0YSgwLCBw
ZGZEYXRhLmRhdGEoKSwgcGRmRGF0YS5zaXplKCksIDApKTsKKyAgICBSZXRhaW5QdHI8Q0dQREZE
b2N1bWVudFJlZj4gcGRmRG9jdW1lbnQoQWRvcHRDRiwgQ0dQREZEb2N1bWVudENyZWF0ZVdpdGhQ
cm92aWRlcihwZGZEYXRhUHJvdmlkZXIuZ2V0KCkpKTsKKyAgICBpZiAoIXBkZkRvY3VtZW50KSB7
CisgICAgICAgIExPR19FUlJPUigiQ291bGRuJ3QgY3JlYXRlIGEgUERGIGRvY3VtZW50IHdpdGgg
ZGF0YSBwYXNzZWQgZm9yIHByaW50aW5nIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAg
ICBDR1BERlBhZ2VSZWYgcGRmUGFnZSA9IENHUERGRG9jdW1lbnRHZXRQYWdlKHBkZkRvY3VtZW50
LmdldCgpLCAxKTsKKyAgICBpZiAoIXBkZlBhZ2UpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJQcmlu
dGluZyBkYXRhIGRvZXNuJ3QgaGF2ZSBwYWdlIDEiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0K
KworICAgIE5TR3JhcGhpY3NDb250ZXh0ICpuc0dyYXBoaWNzQ29udGV4dCA9IFtOU0dyYXBoaWNz
Q29udGV4dCBjdXJyZW50Q29udGV4dF07CisgICAgQ0dDb250ZXh0UmVmIGNvbnRleHQgPSBzdGF0
aWNfY2FzdDxDR0NvbnRleHRSZWY+KFtuc0dyYXBoaWNzQ29udGV4dCBncmFwaGljc1BvcnRdKTsK
KworICAgIENHQ29udGV4dFNhdmVHU3RhdGUoY29udGV4dCk7CisgICAgLy8gRmxpcCB0aGUgZGVz
dGluYXRpb24uCisgICAgQ0dDb250ZXh0U2NhbGVDVE0oY29udGV4dCwgMSwgLTEpOworICAgIENH
Q29udGV4dFRyYW5zbGF0ZUNUTShjb250ZXh0LCAwLCAtQ0dQREZQYWdlR2V0Qm94UmVjdChwZGZQ
YWdlLCBrQ0dQREZNZWRpYUJveCkuc2l6ZS5oZWlnaHQpOworICAgIENHQ29udGV4dERyYXdQREZQ
YWdlKGNvbnRleHQsIHBkZlBhZ2UpOworICAgIENHQ29udGV4dFJlc3RvcmVHU3RhdGUoY29udGV4
dCk7Cit9CisKKy0gKHZvaWQpZHJhd1BhZ2VCb3JkZXJXaXRoU2l6ZTooTlNTaXplKWJvcmRlclNp
emUKK3sKKyAgICBBU1NFUlQoTlNFcXVhbFNpemVzKGJvcmRlclNpemUsIFtbW05TUHJpbnRPcGVy
YXRpb24gY3VycmVudE9wZXJhdGlvbl0gcHJpbnRJbmZvXSBwYXBlclNpemVdKSk7ICAgIAorCisg
ICAgLy8gVGhlIGhlYWRlciBhbmQgZm9vdGVyIHJlY3QgaGVpZ2h0IHNjYWxlcyB3aXRoIHRoZSBw
YWdlLCBidXQgdGhlIHdpZHRoIGlzIGFsd2F5cworICAgIC8vIGFsbCB0aGUgd2F5IGFjcm9zcyB0
aGUgcHJpbnRlZCBwYWdlIChpbnNldCBieSBwcmludGluZyBtYXJnaW5zKS4KKyAgICBOU1ByaW50
T3BlcmF0aW9uICpwcmludE9wZXJhdGlvbiA9IFtOU1ByaW50T3BlcmF0aW9uIGN1cnJlbnRPcGVy
YXRpb25dOworICAgIE5TUHJpbnRJbmZvICpwcmludEluZm8gPSBbcHJpbnRPcGVyYXRpb24gcHJp
bnRJbmZvXTsKKyAgICBmbG9hdCBzY2FsZSA9IGN1cnJlbnRQcmludE9wZXJhdGlvblNjYWxlKCk7
CisgICAgTlNTaXplIHBhcGVyU2l6ZSA9IFtwcmludEluZm8gcGFwZXJTaXplXTsKKyAgICBmbG9h
dCBoZWFkZXJGb290ZXJMZWZ0ID0gW3ByaW50SW5mbyBsZWZ0TWFyZ2luXSAvIHNjYWxlOworICAg
IGZsb2F0IGhlYWRlckZvb3RlcldpZHRoID0gKHBhcGVyU2l6ZS53aWR0aCAtIChbcHJpbnRJbmZv
IGxlZnRNYXJnaW5dICsgW3ByaW50SW5mbyByaWdodE1hcmdpbl0pKSAvIHNjYWxlOworICAgIE5T
UmVjdCBmb290ZXJSZWN0ID0gTlNNYWtlUmVjdChoZWFkZXJGb290ZXJMZWZ0LCBbcHJpbnRJbmZv
IGJvdHRvbU1hcmdpbl0gLyBzY2FsZSAtIF93ZWJGcmFtZS0+cGFnZSgpLT5mb290ZXJIZWlnaHQo
X3dlYkZyYW1lLmdldCgpKSwgaGVhZGVyRm9vdGVyV2lkdGgsIF93ZWJGcmFtZS0+cGFnZSgpLT5m
b290ZXJIZWlnaHQoX3dlYkZyYW1lLmdldCgpKSk7CisgICAgTlNSZWN0IGhlYWRlclJlY3QgPSBO
U01ha2VSZWN0KGhlYWRlckZvb3RlckxlZnQsIChwYXBlclNpemUuaGVpZ2h0IC0gW3ByaW50SW5m
byB0b3BNYXJnaW5dKSAvIHNjYWxlLCBoZWFkZXJGb290ZXJXaWR0aCwgX3dlYkZyYW1lLT5wYWdl
KCktPmhlYWRlckhlaWdodChfd2ViRnJhbWUuZ2V0KCkpKTsKKworICAgIE5TR3JhcGhpY3NDb250
ZXh0ICpjdXJyZW50Q29udGV4dCA9IFtOU0dyYXBoaWNzQ29udGV4dCBjdXJyZW50Q29udGV4dF07
CisgICAgW2N1cnJlbnRDb250ZXh0IHNhdmVHcmFwaGljc1N0YXRlXTsKKyAgICBOU1JlY3RDbGlw
KGhlYWRlclJlY3QpOworICAgIF93ZWJGcmFtZS0+cGFnZSgpLT5kcmF3SGVhZGVyKF93ZWJGcmFt
ZS5nZXQoKSwgaGVhZGVyUmVjdCk7CisgICAgW2N1cnJlbnRDb250ZXh0IHJlc3RvcmVHcmFwaGlj
c1N0YXRlXTsKKworICAgIFtjdXJyZW50Q29udGV4dCBzYXZlR3JhcGhpY3NTdGF0ZV07CisgICAg
TlNSZWN0Q2xpcChmb290ZXJSZWN0KTsKKyAgICBfd2ViRnJhbWUtPnBhZ2UoKS0+ZHJhd0Zvb3Rl
cihfd2ViRnJhbWUuZ2V0KCksIGZvb3RlclJlY3QpOworICAgIFtjdXJyZW50Q29udGV4dCByZXN0
b3JlR3JhcGhpY3NTdGF0ZV07Cit9CisKKy8vIEZJWE1FIDM0OTEzNDQ6IFRoaXMgaXMgYW4gQXBw
S2l0LWludGVybmFsIG1ldGhvZCB0aGF0IHdlIG5lZWQgdG8gb3ZlcnJpZGUgaW4gb3JkZXIKKy8v
IHRvIGdldCBvdXIgc2hyaW5rLXRvLWZpdCB0byB3b3JrIHdpdGggYSBjdXN0b20gcGFnaW5hdGlv
biBzY2hlbWUuIFdlIGNhbiBkbyB0aGlzIGJldHRlcgorLy8gaWYgQXBwS2l0IG1ha2VzIGl0IFNQ
SS9BUEkuCistIChDR0Zsb2F0KV9wcm92aWRlVG90YWxTY2FsZUZhY3RvckZvclByaW50T3BlcmF0
aW9uOihOU1ByaW50T3BlcmF0aW9uICopcHJpbnRPcGVyYXRpb24gCit7CisgICAgcmV0dXJuIF93
ZWJUb3RhbFNjYWxlRmFjdG9yRm9yUHJpbnRpbmc7Cit9CisKKy8vIFJldHVybiB0aGUgZHJhd2lu
ZyByZWN0YW5nbGUgZm9yIGEgcGFydGljdWxhciBwYWdlIG51bWJlcgorLSAoTlNSZWN0KXJlY3RG
b3JQYWdlOihOU0ludGVnZXIpcGFnZQoreworICAgIExPRyhWaWV3LCAicmVjdEZvclBhZ2U6JWQg
LT4geCAlZCwgeSAlZCwgd2lkdGggJWQsIGhlaWdodCAlZFxuIiwgKGludClwYWdlLCBfd2ViUHJp
bnRpbmdQYWdlUmVjdHNbcGFnZSAtIDFdLngoKSwgX3dlYlByaW50aW5nUGFnZVJlY3RzW3BhZ2Ug
LSAxXS55KCksIF93ZWJQcmludGluZ1BhZ2VSZWN0c1twYWdlIC0gMV0ud2lkdGgoKSwgX3dlYlBy
aW50aW5nUGFnZVJlY3RzW3BhZ2UgLSAxXS5oZWlnaHQoKSk7CisgICAgcmV0dXJuIF93ZWJQcmlu
dGluZ1BhZ2VSZWN0c1twYWdlIC0gMV07Cit9CisKK0BlbmQKSW5kZXg6IFNvdXJjZS9XZWJLaXQy
L1VJUHJvY2Vzcy9BUEkvbWFjL1dLVmlldy5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0
Mi9VSVByb2Nlc3MvQVBJL21hYy9XS1ZpZXcubW0JKHJldmlzaW9uIDc2NDUxKQorKysgU291cmNl
L1dlYktpdDIvVUlQcm9jZXNzL0FQSS9tYWMvV0tWaWV3Lm1tCSh3b3JraW5nIGNvcHkpCkBAIC0z
NiwxMiArMzYsMTIgQEAKICNpbXBvcnQgIlBERlZpZXdDb250cm9sbGVyLmgiCiAjaW1wb3J0ICJQ
YWdlQ2xpZW50SW1wbC5oIgogI2ltcG9ydCAiUGFzdGVib2FyZFR5cGVzLmgiCi0jaW1wb3J0ICJQ
cmludEluZm8uaCIKICNpbXBvcnQgIlJlZ2lvbi5oIgogI2ltcG9ydCAiUnVuTG9vcC5oIgogI2lt
cG9ydCAiVGV4dENoZWNrZXIuaCIKICNpbXBvcnQgIlRleHRDaGVja2VyU3RhdGUuaCIKICNpbXBv
cnQgIldLQVBJQ2FzdC5oIgorI2ltcG9ydCAiV0tQcmludGluZ1ZpZXcuaCIKICNpbXBvcnQgIldL
U3RyaW5nQ0YuaCIKICNpbXBvcnQgIldLVGV4dElucHV0V2luZG93Q29udHJvbGxlci5oIgogI2lt
cG9ydCAiV2ViQ29udGV4dC5oIgpAQCAtNzEsMTAgKzcxLDYgQEAgQGludGVyZmFjZSBOU0FwcGxp
Y2F0aW9uIChEZXRhaWxzKQogLSAodm9pZClzcGVha1N0cmluZzooTlNTdHJpbmcgKilzdHJpbmc7
CiBAZW5kCiAKLUBpbnRlcmZhY2UgTlNWaWV3IChEZXRhaWxzKQotLSAodm9pZClfcmVjdXJzaXZl
RGlzcGxheVJlY3RJZk5lZWRlZElnbm9yaW5nT3BhY2l0eTooTlNSZWN0KXJlY3QgaXNWaXNpYmxl
UmVjdDooQk9PTClpc1Zpc2libGVSZWN0IHJlY3RJc1Zpc2libGVSZWN0Rm9yVmlldzooTlNWaWV3
ICopdmlzaWJsZVZpZXcgdG9wVmlldzooQk9PTCl0b3BWaWV3OwotQGVuZAotCiBAaW50ZXJmYWNl
IE5TV2luZG93IChEZXRhaWxzKQogLSAoTlNSZWN0KV9ncm93Qm94UmVjdDsKIC0gKEJPT0wpX3Vw
ZGF0ZUdyb3dCb3hGb3JXaW5kb3dGcmFtZUNoYW5nZTsKQEAgLTk3LDkgKzkzLDYgQEAgdHlwZWRl
ZiBIYXNoTWFwPFN0cmluZywgVmFsaWRhdGlvblZlY3RvcgogCiB9CiAKLU5TU3RyaW5nKiBjb25z
dCBXZWJLaXRPcmlnaW5hbFRvcFByaW50aW5nTWFyZ2luS2V5ID0gQCJXZWJLaXRPcmlnaW5hbFRv
cE1hcmdpbiI7Ci1OU1N0cmluZyogY29uc3QgV2ViS2l0T3JpZ2luYWxCb3R0b21QcmludGluZ01h
cmdpbktleSA9IEAiV2ViS2l0T3JpZ2luYWxCb3R0b21NYXJnaW4iOwotCiBAaW50ZXJmYWNlIFdL
Vmlld0RhdGEgOiBOU09iamVjdCB7CiBAcHVibGljCiAgICAgT3duUHRyPFBhZ2VDbGllbnRJbXBs
PiBfcGFnZUNsaWVudDsKQEAgLTEzNSw5ICsxMjgsNiBAQCBAaW50ZXJmYWNlIFdLVmlld0RhdGEg
OiBOU09iamVjdCB7CiAgICAgdW5zaWduZWQgX3NlbGVjdGlvblN0YXJ0OwogICAgIHVuc2lnbmVk
IF9zZWxlY3Rpb25FbmQ7CiAKLSAgICBWZWN0b3I8SW50UmVjdD4gX3ByaW50aW5nUGFnZVJlY3Rz
OwotICAgIGRvdWJsZSBfdG90YWxTY2FsZUZhY3RvckZvclByaW50aW5nOwotCiAgICAgYm9vbCBf
aW5CZWNvbWVGaXJzdFJlc3BvbmRlcjsKICAgICBib29sIF9pblJlc2lnbkZpcnN0UmVzcG9uZGVy
OwogICAgIE5TRXZlbnQgKl9tb3VzZURvd25FdmVudDsKQEAgLTE0OSwzNiArMTM5LDYgQEAgQGlu
dGVyZmFjZSBXS1ZpZXdEYXRhIDogTlNPYmplY3QgewogQGltcGxlbWVudGF0aW9uIFdLVmlld0Rh
dGEKIEBlbmQKIAotQGludGVyZmFjZSBXZWJGcmFtZVdyYXBwZXIgOiBOU09iamVjdCB7Ci1AcHVi
bGljCi0gICAgUmVmUHRyPFdlYkZyYW1lUHJveHk+IF9mcmFtZTsKLX0KLQotLSAoaWQpaW5pdFdp
dGhGcmFtZVByb3h5OihXZWJGcmFtZVByb3h5KilmcmFtZTsKLS0gKFdlYkZyYW1lUHJveHkqKXdl
YkZyYW1lOwotQGVuZAotCi1AaW1wbGVtZW50YXRpb24gV2ViRnJhbWVXcmFwcGVyCi0KLS0gKGlk
KWluaXRXaXRoRnJhbWVQcm94eTooV2ViRnJhbWVQcm94eSopZnJhbWUKLXsKLSAgICBzZWxmID0g
W3N1cGVyIGluaXRdOwotICAgIGlmICghc2VsZikKLSAgICAgICAgcmV0dXJuIG5pbDsKLQotICAg
IF9mcmFtZSA9IGZyYW1lOwotICAgIHJldHVybiBzZWxmOwotfQotCi0tIChXZWJGcmFtZVByb3h5
Kil3ZWJGcmFtZQotewotICAgIHJldHVybiBfZnJhbWUuZ2V0KCk7Ci19Ci0KLUBlbmQKLQotTlNT
dHJpbmcgKiBjb25zdCBQcmludGVkRnJhbWVLZXkgPSBAIldlYktpdFByaW50ZWRGcmFtZUtleSI7
Ci0KIEBpbnRlcmZhY2UgTlNPYmplY3QgKE5TVGV4dElucHV0Q29udGV4dERldGFpbHMpCiAtIChC
T09MKXdhbnRzVG9IYW5kbGVNb3VzZUV2ZW50czsKIC0gKEJPT0wpaGFuZGxlTW91c2VFdmVudDoo
TlNFdmVudCAqKWV2ZW50OwpAQCAtMTI2Nyw2ICsxMjI3LDcgQEAgLSAodm9pZClfd2luZG93RnJh
bWVEaWRDaGFuZ2U6KE5TTm90aWZpYwogLSAodm9pZClkcmF3UmVjdDooTlNSZWN0KXJlY3QKIHsK
ICAgICBMT0coVmlldywgImRyYXdSZWN0OiB4OiVnLCB5OiVnLCB3aWR0aDolZywgaGVpZ2h0OiVn
IiwgcmVjdC5vcmlnaW4ueCwgcmVjdC5vcmlnaW4ueSwgcmVjdC5zaXplLndpZHRoLCByZWN0LnNp
emUuaGVpZ2h0KTsKKyAgICBfZGF0YS0+X3BhZ2UtPmVuZFByaW50aW5nKCk7CiAgICAgaWYgKHVz
ZU5ld0RyYXdpbmdBcmVhKCkpIHsKICAgICAgICAgaWYgKERyYXdpbmdBcmVhUHJveHlJbXBsKiBk
cmF3aW5nQXJlYSA9IHN0YXRpY19jYXN0PERyYXdpbmdBcmVhUHJveHlJbXBsKj4oX2RhdGEtPl9w
YWdlLT5kcmF3aW5nQXJlYSgpKSkgewogICAgICAgICAgICAgQ0dDb250ZXh0UmVmIGNvbnRleHQg
PSBzdGF0aWNfY2FzdDxDR0NvbnRleHRSZWY+KFtbTlNHcmFwaGljc0NvbnRleHQgY3VycmVudENv
bnRleHRdIGdyYXBoaWNzUG9ydF0pOwpAQCAtMTM2NSwxOTAgKzEzMjYsMjcgQEAgLSAoTlNJbnRl
Z2VyKWNvbnZlcnNhdGlvbklkZW50aWZpZXIKICAgICByZXR1cm4gKE5TSW50ZWdlcilzZWxmOwog
fQogCi1zdGF0aWMgdm9pZCBzZXRGcmFtZUJlaW5nUHJpbnRlZChOU1ByaW50T3BlcmF0aW9uICpw
cmludE9wZXJhdGlvbiwgV2ViRnJhbWVQcm94eSogZnJhbWUpCi17Ci0gICAgUmV0YWluUHRyPFdl
YkZyYW1lV3JhcHBlcj4gZnJhbWVXcmFwcGVyKEFkb3B0TlMsIFtbV2ViRnJhbWVXcmFwcGVyIGFs
bG9jXSBpbml0V2l0aEZyYW1lUHJveHk6ZnJhbWVdKTsKLSAgICBbW1twcmludE9wZXJhdGlvbiBw
cmludEluZm9dIGRpY3Rpb25hcnldIHNldE9iamVjdDpmcmFtZVdyYXBwZXIuZ2V0KCkgZm9yS2V5
OlByaW50ZWRGcmFtZUtleV07Ci19Ci0KLXN0YXRpYyBXZWJGcmFtZVByb3h5KiBmcmFtZUJlaW5n
UHJpbnRlZCgpCi17Ci0gICAgcmV0dXJuIFtbW1tbTlNQcmludE9wZXJhdGlvbiBjdXJyZW50T3Bl
cmF0aW9uXSBwcmludEluZm9dIGRpY3Rpb25hcnldIG9iamVjdEZvcktleTpQcmludGVkRnJhbWVL
ZXldIHdlYkZyYW1lXTsKLX0KIAotc3RhdGljIGZsb2F0IGN1cnJlbnRQcmludE9wZXJhdGlvblNj
YWxlKCkKLXsKLSAgICBBU1NFUlQoW05TUHJpbnRPcGVyYXRpb24gY3VycmVudE9wZXJhdGlvbl0p
OwotICAgIEFTU0VSVChbW1tbTlNQcmludE9wZXJhdGlvbiBjdXJyZW50T3BlcmF0aW9uXSBwcmlu
dEluZm9dIGRpY3Rpb25hcnldIG9iamVjdEZvcktleTpOU1ByaW50U2NhbGluZ0ZhY3Rvcl0pOwot
ICAgIHJldHVybiBbW1tbW05TUHJpbnRPcGVyYXRpb24gY3VycmVudE9wZXJhdGlvbl0gcHJpbnRJ
bmZvXSBkaWN0aW9uYXJ5XSBvYmplY3RGb3JLZXk6TlNQcmludFNjYWxpbmdGYWN0b3JdIGZsb2F0
VmFsdWVdOwotfQotCi0tICh2b2lkKV9hZGp1c3RQcmludGluZ01hcmdpbnNGb3JIZWFkZXJBbmRG
b290ZXIKKy0gKEJPT0wpY2FuQ2hhbmdlRnJhbWVMYXlvdXQ6KFdLRnJhbWVSZWYpZnJhbWVSZWYK
IHsKLSAgICBOU1ByaW50T3BlcmF0aW9uICpwcmludE9wZXJhdGlvbiA9IFtOU1ByaW50T3BlcmF0
aW9uIGN1cnJlbnRPcGVyYXRpb25dOwotICAgIE5TUHJpbnRJbmZvICppbmZvID0gW3ByaW50T3Bl
cmF0aW9uIHByaW50SW5mb107Ci0gICAgTlNNdXRhYmxlRGljdGlvbmFyeSAqaW5mb0RpY3Rpb25h
cnkgPSBbaW5mbyBkaWN0aW9uYXJ5XTsKLQotICAgIC8vIFdlIG5lZWQgdG8gbW9kaWZ5IHRoZSB0
b3AgYW5kIGJvdHRvbSBtYXJnaW5zIGluIHRoZSBOU1ByaW50SW5mbyB0byBhY2NvdW50IGZvciB0
aGUgc3BhY2UgbmVlZGVkIGJ5IHRoZQotICAgIC8vIGhlYWRlciBhbmQgZm9vdGVyLiBCZWNhdXNl
IHRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2Ugb24gdGhlIHNhbWUgTlNQ
cmludEluZm8gKHNlZSA1MDM4MDg3KSwKLSAgICAvLyB3ZSBzdGFzaCBhd2F5IHRoZSB1bm1vZGlm
aWVkIHRvcCBhbmQgYm90dG9tIG1hcmdpbnMgdGhlIGZpcnN0IHRpbWUgdGhpcyBtZXRob2QgaXMg
Y2FsbGVkLCBhbmQgd2UgcmVhZCBmcm9tCi0gICAgLy8gdGhvc2Ugc3Rhc2hlZC1hd2F5IHZhbHVl
cyBvbiBzdWJzZXF1ZW50IGNhbGxzLgotICAgIGZsb2F0IG9yaWdpbmFsVG9wTWFyZ2luOwotICAg
IGZsb2F0IG9yaWdpbmFsQm90dG9tTWFyZ2luOwotICAgIE5TTnVtYmVyICpvcmlnaW5hbFRvcE1h
cmdpbk51bWJlciA9IFtpbmZvRGljdGlvbmFyeSBvYmplY3RGb3JLZXk6V2ViS2l0T3JpZ2luYWxU
b3BQcmludGluZ01hcmdpbktleV07Ci0gICAgaWYgKCFvcmlnaW5hbFRvcE1hcmdpbk51bWJlcikg
ewotICAgICAgICBBU1NFUlQoIVtpbmZvRGljdGlvbmFyeSBvYmplY3RGb3JLZXk6V2ViS2l0T3Jp
Z2luYWxCb3R0b21QcmludGluZ01hcmdpbktleV0pOwotICAgICAgICBvcmlnaW5hbFRvcE1hcmdp
biA9IFtpbmZvIHRvcE1hcmdpbl07Ci0gICAgICAgIG9yaWdpbmFsQm90dG9tTWFyZ2luID0gW2lu
Zm8gYm90dG9tTWFyZ2luXTsKLSAgICAgICAgW2luZm9EaWN0aW9uYXJ5IHNldE9iamVjdDpbTlNO
dW1iZXIgbnVtYmVyV2l0aEZsb2F0Om9yaWdpbmFsVG9wTWFyZ2luXSBmb3JLZXk6V2ViS2l0T3Jp
Z2luYWxUb3BQcmludGluZ01hcmdpbktleV07Ci0gICAgICAgIFtpbmZvRGljdGlvbmFyeSBzZXRP
YmplY3Q6W05TTnVtYmVyIG51bWJlcldpdGhGbG9hdDpvcmlnaW5hbEJvdHRvbU1hcmdpbl0gZm9y
S2V5OldlYktpdE9yaWdpbmFsQm90dG9tUHJpbnRpbmdNYXJnaW5LZXldOwotICAgIH0gZWxzZSB7
Ci0gICAgICAgIEFTU0VSVChbb3JpZ2luYWxUb3BNYXJnaW5OdW1iZXIgaXNLaW5kT2ZDbGFzczpb
TlNOdW1iZXIgY2xhc3NdXSk7Ci0gICAgICAgIEFTU0VSVChbW2luZm9EaWN0aW9uYXJ5IG9iamVj
dEZvcktleTpXZWJLaXRPcmlnaW5hbEJvdHRvbVByaW50aW5nTWFyZ2luS2V5XSBpc0tpbmRPZkNs
YXNzOltOU051bWJlciBjbGFzc11dKTsKLSAgICAgICAgb3JpZ2luYWxUb3BNYXJnaW4gPSBbb3Jp
Z2luYWxUb3BNYXJnaW5OdW1iZXIgZmxvYXRWYWx1ZV07Ci0gICAgICAgIG9yaWdpbmFsQm90dG9t
TWFyZ2luID0gW1tpbmZvRGljdGlvbmFyeSBvYmplY3RGb3JLZXk6V2ViS2l0T3JpZ2luYWxCb3R0
b21QcmludGluZ01hcmdpbktleV0gZmxvYXRWYWx1ZV07Ci0gICAgfQotICAgIAotICAgIGZsb2F0
IHNjYWxlID0gY3VycmVudFByaW50T3BlcmF0aW9uU2NhbGUoKTsKLSAgICBbaW5mbyBzZXRUb3BN
YXJnaW46b3JpZ2luYWxUb3BNYXJnaW4gKyBfZGF0YS0+X3BhZ2UtPmhlYWRlckhlaWdodChmcmFt
ZUJlaW5nUHJpbnRlZCgpKSAqIHNjYWxlXTsKLSAgICBbaW5mbyBzZXRCb3R0b21NYXJnaW46b3Jp
Z2luYWxCb3R0b21NYXJnaW4gKyBfZGF0YS0+X3BhZ2UtPmZvb3RlckhlaWdodChmcmFtZUJlaW5n
UHJpbnRlZCgpKSAqIHNjYWxlXTsKKyAgICAvLyBQREYgZG9jdW1lbnRzIGFyZSBhbHJlYWR5IHBh
Z2luYXRlZCwgc28gd2UgY2FuJ3QgY2hhbmdlIHRoZW0gdG8gYWRkIGhlYWRlcnMgYW5kIGZvb3Rl
cnMuCisgICAgcmV0dXJuICF0b0ltcGwoZnJhbWVSZWYpLT5pc01haW5GcmFtZSgpIHx8ICFfZGF0
YS0+X3BkZlZpZXdDb250cm9sbGVyOwogfQogCiAtIChOU1ByaW50T3BlcmF0aW9uICopcHJpbnRP
cGVyYXRpb25XaXRoUHJpbnRJbmZvOihOU1ByaW50SW5mbyAqKXByaW50SW5mbyBmb3JGcmFtZToo
V0tGcmFtZVJlZilmcmFtZVJlZgogewogICAgIExPRyhWaWV3LCAiQ3JlYXRpbmcgYW4gTlNQcmlu
dE9wZXJhdGlvbiBmb3IgZnJhbWUgJyVzJyIsIHRvSW1wbChmcmFtZVJlZiktPnVybCgpLnV0Zjgo
KS5kYXRhKCkpOwotICAgIE5TUHJpbnRPcGVyYXRpb24gKnByaW50T3BlcmF0aW9uOwogCiAgICAg
Ly8gT25seSB0aGUgdG9wIGZyYW1lIGNhbiBjdXJyZW50bHkgY29udGFpbiBhIFBERiB2aWV3Lgog
ICAgIGlmIChfZGF0YS0+X3BkZlZpZXdDb250cm9sbGVyKSB7Ci0gICAgICAgIEFTU0VSVCh0b0lt
cGwoZnJhbWVSZWYpLT5pc01haW5GcmFtZSgpKTsKLSAgICAgICAgcHJpbnRPcGVyYXRpb24gPSBf
ZGF0YS0+X3BkZlZpZXdDb250cm9sbGVyLT5tYWtlUHJpbnRPcGVyYXRpb24ocHJpbnRJbmZvKTsK
LSAgICB9IGVsc2UKLSAgICAgICAgcHJpbnRPcGVyYXRpb24gPSBbTlNQcmludE9wZXJhdGlvbiBw
cmludE9wZXJhdGlvbldpdGhWaWV3OnNlbGYgcHJpbnRJbmZvOnByaW50SW5mb107Ci0KLSAgICBz
ZXRGcmFtZUJlaW5nUHJpbnRlZChwcmludE9wZXJhdGlvbiwgdG9JbXBsKGZyYW1lUmVmKSk7Ci0g
ICAgcmV0dXJuIHByaW50T3BlcmF0aW9uOwotfQotCi0tIChCT09MKWNhbkNoYW5nZUZyYW1lTGF5
b3V0OihXS0ZyYW1lUmVmKWZyYW1lUmVmCi17Ci0gICAgLy8gUERGIGRvY3VtZW50cyBhcmUgYWxy
ZWFkeSBwYWdpbmF0ZWQsIHNvIHdlIGNhbid0IGNoYW5nZSB0aGVtIHRvIGFkZCBoZWFkZXJzIGFu
ZCBmb290ZXJzLgotICAgIHJldHVybiAhdG9JbXBsKGZyYW1lUmVmKS0+aXNNYWluRnJhbWUoKSB8
fCAhX2RhdGEtPl9wZGZWaWV3Q29udHJvbGxlcjsKLX0KLQotLy8gUmV0dXJuIHRoZSBudW1iZXIg
b2YgcGFnZXMgYXZhaWxhYmxlIGZvciBwcmludGluZwotLSAoQk9PTClrbm93c1BhZ2VSYW5nZToo
TlNSYW5nZVBvaW50ZXIpcmFuZ2UKLXsKLSAgICBMT0coVmlldywgImtub3dzUGFnZVJhbmdlOiIp
OwotICAgIFdlYkZyYW1lUHJveHkqIGZyYW1lID0gZnJhbWVCZWluZ1ByaW50ZWQoKTsKLSAgICBB
U1NFUlQoZnJhbWUpOwotCi0gICAgaWYgKGZyYW1lLT5pc01haW5GcmFtZSgpICYmIF9kYXRhLT5f
cGRmVmlld0NvbnRyb2xsZXIpCi0gICAgICAgIHJldHVybiBbc3VwZXIga25vd3NQYWdlUmFuZ2U6
cmFuZ2VdOwotCi0gICAgW3NlbGYgX2FkanVzdFByaW50aW5nTWFyZ2luc0ZvckhlYWRlckFuZEZv
b3Rlcl07Ci0KLSAgICBfZGF0YS0+X3BhZ2UtPmNvbXB1dGVQYWdlc0ZvclByaW50aW5nKGZyYW1l
LCBQcmludEluZm8oW1tOU1ByaW50T3BlcmF0aW9uIGN1cnJlbnRPcGVyYXRpb25dIHByaW50SW5m
b10pLCBfZGF0YS0+X3ByaW50aW5nUGFnZVJlY3RzLCBfZGF0YS0+X3RvdGFsU2NhbGVGYWN0b3JG
b3JQcmludGluZyk7Ci0KLSAgICAqcmFuZ2UgPSBOU01ha2VSYW5nZSgxLCBfZGF0YS0+X3ByaW50
aW5nUGFnZVJlY3RzLnNpemUoKSk7Ci0gICAgcmV0dXJuIFlFUzsKLX0KLQotLy8gVGFrZSBvdmVy
IHByaW50aW5nLiBBcHBLaXQgYXBwbGllcyBpbmNvcnJlY3QgY2xpcHBpbmcsIGFuZCBkb2Vzbid0
IHByaW50IHBhZ2VzIGJleW9uZCB0aGUgZmlyc3Qgb25lLgotLSAodm9pZClfcmVjdXJzaXZlRGlz
cGxheVJlY3RJZk5lZWRlZElnbm9yaW5nT3BhY2l0eTooTlNSZWN0KXJlY3QgaXNWaXNpYmxlUmVj
dDooQk9PTClpc1Zpc2libGVSZWN0IHJlY3RJc1Zpc2libGVSZWN0Rm9yVmlldzooTlNWaWV3ICop
dmlzaWJsZVZpZXcgdG9wVmlldzooQk9PTCl0b3BWaWV3Ci17Ci0gICAgLy8gRklYTUU6IFRoaXMg
Y2hlY2sgaXNuJ3QgcmlnaHQgZm9yIHNvbWUgbm9uLXByaW50aW5nIGNhc2VzLCBzdWNoIGFzIGNh
cHR1cmluZyBpbnRvIGEgYnVmZmVyIHVzaW5nIGNhY2hlRGlzcGxheUluUmVjdDp0b0JpdG1hcElt
YWdlUmVwOi4KLSAgICBpZiAoW05TR3JhcGhpY3NDb250ZXh0IGN1cnJlbnRDb250ZXh0RHJhd2lu
Z1RvU2NyZWVuXSkgewotICAgICAgICBfZGF0YS0+X3BhZ2UtPmVuZFByaW50aW5nKCk7Ci0gICAg
ICAgIFtzdXBlciBfcmVjdXJzaXZlRGlzcGxheVJlY3RJZk5lZWRlZElnbm9yaW5nT3BhY2l0eTpy
ZWN0IGlzVmlzaWJsZVJlY3Q6aXNWaXNpYmxlUmVjdCByZWN0SXNWaXNpYmxlUmVjdEZvclZpZXc6
dmlzaWJsZVZpZXcgdG9wVmlldzp0b3BWaWV3XTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQot
ICAgIExPRyhWaWV3LCAiUHJpbnRpbmcgcmVjdCB4OiVnLCB5OiVnLCB3aWR0aDolZywgaGVpZ2h0
OiVnIiwgcmVjdC5vcmlnaW4ueCwgcmVjdC5vcmlnaW4ueSwgcmVjdC5zaXplLndpZHRoLCByZWN0
LnNpemUuaGVpZ2h0KTsKLQotICAgIEFTU0VSVChzZWxmID09IHZpc2libGVWaWV3KTsKLSAgICBB
U1NFUlQoZnJhbWVCZWluZ1ByaW50ZWQoKSk7Ci0KLSAgICBXZWJGcmFtZVByb3h5KiBmcmFtZSA9
IGZyYW1lQmVpbmdQcmludGVkKCk7Ci0gICAgQVNTRVJUKGZyYW1lKTsKLQotICAgIF9kYXRhLT5f
cGFnZS0+YmVnaW5QcmludGluZyhmcmFtZSwgUHJpbnRJbmZvKFtbTlNQcmludE9wZXJhdGlvbiBj
dXJyZW50T3BlcmF0aW9uXSBwcmludEluZm9dKSk7Ci0KLSAgICAvLyBGSVhNRTogVGhpcyBpcyBv
cHRpbWl6ZWQgZm9yIHByaW50IHByZXZpZXcuIEdldCB0aGUgd2hvbGUgZG9jdW1lbnQgYXQgb25j
ZSB3aGVuIGFjdHVhbGx5IHByaW50aW5nLgotICAgIFZlY3Rvcjx1aW50OF90PiBwZGZEYXRhOwot
ICAgIF9kYXRhLT5fcGFnZS0+ZHJhd1JlY3RUb1BERihmcmFtZSwgSW50UmVjdChyZWN0KSwgcGRm
RGF0YSk7Ci0KLSAgICBSZXRhaW5QdHI8Q0dEYXRhUHJvdmlkZXJSZWY+IHBkZkRhdGFQcm92aWRl
cihBZG9wdENGLCBDR0RhdGFQcm92aWRlckNyZWF0ZVdpdGhEYXRhKDAsIHBkZkRhdGEuZGF0YSgp
LCBwZGZEYXRhLnNpemUoKSwgMCkpOwotICAgIFJldGFpblB0cjxDR1BERkRvY3VtZW50UmVmPiBw
ZGZEb2N1bWVudChBZG9wdENGLCBDR1BERkRvY3VtZW50Q3JlYXRlV2l0aFByb3ZpZGVyKHBkZkRh
dGFQcm92aWRlci5nZXQoKSkpOwotICAgIGlmICghcGRmRG9jdW1lbnQpIHsKLSAgICAgICAgTE9H
X0VSUk9SKCJDb3VsZG4ndCBjcmVhdGUgYSBQREYgZG9jdW1lbnQgd2l0aCBkYXRhIHBhc3NlZCBm
b3IgcHJpbnRpbmciKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIENHUERGUGFnZVJl
ZiBwZGZQYWdlID0gQ0dQREZEb2N1bWVudEdldFBhZ2UocGRmRG9jdW1lbnQuZ2V0KCksIDEpOwot
ICAgIGlmICghcGRmUGFnZSkgewotICAgICAgICBMT0dfRVJST1IoIlByaW50aW5nIGRhdGEgZG9l
c24ndCBoYXZlIHBhZ2UgMSIpOwotICAgICAgICByZXR1cm47CisgICAgICAgIGlmICghdG9JbXBs
KGZyYW1lUmVmKS0+aXNNYWluRnJhbWUoKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAg
ICByZXR1cm4gX2RhdGEtPl9wZGZWaWV3Q29udHJvbGxlci0+bWFrZVByaW50T3BlcmF0aW9uKHBy
aW50SW5mbyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUmV0YWluUHRyPFdLUHJpbnRpbmdWaWV3
PiBwcmludGluZ1ZpZXcoQWRvcHROUywgW1tXS1ByaW50aW5nVmlldyBhbGxvY10gaW5pdFdpdGhG
cmFtZVByb3h5OnRvSW1wbChmcmFtZVJlZildKTsKKyAgICAgICAgLy8gTlNQcmludE9wZXJhdGlv
biB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIHZpZXcuCisgICAgICAgIHJldHVybiBbTlNQcmludE9w
ZXJhdGlvbiBwcmludE9wZXJhdGlvbldpdGhWaWV3OnByaW50aW5nVmlldy5nZXQoKV07CiAgICAg
fQotCi0gICAgTlNHcmFwaGljc0NvbnRleHQgKm5zR3JhcGhpY3NDb250ZXh0ID0gW05TR3JhcGhp
Y3NDb250ZXh0IGN1cnJlbnRDb250ZXh0XTsKLSAgICBDR0NvbnRleHRSZWYgY29udGV4dCA9IHN0
YXRpY19jYXN0PENHQ29udGV4dFJlZj4oW25zR3JhcGhpY3NDb250ZXh0IGdyYXBoaWNzUG9ydF0p
OwotCi0gICAgQ0dDb250ZXh0U2F2ZUdTdGF0ZShjb250ZXh0KTsKLSAgICAvLyBGbGlwIHRoZSBk
ZXN0aW5hdGlvbi4KLSAgICBDR0NvbnRleHRTY2FsZUNUTShjb250ZXh0LCAxLCAtMSk7Ci0gICAg
Q0dDb250ZXh0VHJhbnNsYXRlQ1RNKGNvbnRleHQsIDAsIC1DR1BERlBhZ2VHZXRCb3hSZWN0KHBk
ZlBhZ2UsIGtDR1BERk1lZGlhQm94KS5zaXplLmhlaWdodCk7Ci0gICAgQ0dDb250ZXh0RHJhd1BE
RlBhZ2UoY29udGV4dCwgcGRmUGFnZSk7Ci0gICAgQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZShjb250
ZXh0KTsKLX0KLQotLSAodm9pZClkcmF3UGFnZUJvcmRlcldpdGhTaXplOihOU1NpemUpYm9yZGVy
U2l6ZQotewotICAgIEFTU0VSVChOU0VxdWFsU2l6ZXMoYm9yZGVyU2l6ZSwgW1tbTlNQcmludE9w
ZXJhdGlvbiBjdXJyZW50T3BlcmF0aW9uXSBwcmludEluZm9dIHBhcGVyU2l6ZV0pKTsgICAgCi0K
LSAgICAvLyBUaGUgaGVhZGVyIGFuZCBmb290ZXIgcmVjdCBoZWlnaHQgc2NhbGVzIHdpdGggdGhl
IHBhZ2UsIGJ1dCB0aGUgd2lkdGggaXMgYWx3YXlzCi0gICAgLy8gYWxsIHRoZSB3YXkgYWNyb3Nz
IHRoZSBwcmludGVkIHBhZ2UgKGluc2V0IGJ5IHByaW50aW5nIG1hcmdpbnMpLgotICAgIE5TUHJp
bnRPcGVyYXRpb24gKnByaW50T3BlcmF0aW9uID0gW05TUHJpbnRPcGVyYXRpb24gY3VycmVudE9w
ZXJhdGlvbl07Ci0gICAgTlNQcmludEluZm8gKnByaW50SW5mbyA9IFtwcmludE9wZXJhdGlvbiBw
cmludEluZm9dOwotICAgIGZsb2F0IHNjYWxlID0gY3VycmVudFByaW50T3BlcmF0aW9uU2NhbGUo
KTsKLSAgICBOU1NpemUgcGFwZXJTaXplID0gW3ByaW50SW5mbyBwYXBlclNpemVdOwotICAgIGZs
b2F0IGhlYWRlckZvb3RlckxlZnQgPSBbcHJpbnRJbmZvIGxlZnRNYXJnaW5dIC8gc2NhbGU7Ci0g
ICAgZmxvYXQgaGVhZGVyRm9vdGVyV2lkdGggPSAocGFwZXJTaXplLndpZHRoIC0gKFtwcmludElu
Zm8gbGVmdE1hcmdpbl0gKyBbcHJpbnRJbmZvIHJpZ2h0TWFyZ2luXSkpIC8gc2NhbGU7Ci0gICAg
V2ViRnJhbWVQcm94eSogZnJhbWUgPSBmcmFtZUJlaW5nUHJpbnRlZCgpOwotICAgIE5TUmVjdCBm
b290ZXJSZWN0ID0gTlNNYWtlUmVjdChoZWFkZXJGb290ZXJMZWZ0LCBbcHJpbnRJbmZvIGJvdHRv
bU1hcmdpbl0gLyBzY2FsZSAtIF9kYXRhLT5fcGFnZS0+Zm9vdGVySGVpZ2h0KGZyYW1lKSwgaGVh
ZGVyRm9vdGVyV2lkdGgsIF9kYXRhLT5fcGFnZS0+Zm9vdGVySGVpZ2h0KGZyYW1lKSk7Ci0gICAg
TlNSZWN0IGhlYWRlclJlY3QgPSBOU01ha2VSZWN0KGhlYWRlckZvb3RlckxlZnQsIChwYXBlclNp
emUuaGVpZ2h0IC0gW3ByaW50SW5mbyB0b3BNYXJnaW5dKSAvIHNjYWxlLCBoZWFkZXJGb290ZXJX
aWR0aCwgX2RhdGEtPl9wYWdlLT5oZWFkZXJIZWlnaHQoZnJhbWUpKTsKLQotICAgIE5TR3JhcGhp
Y3NDb250ZXh0ICpjdXJyZW50Q29udGV4dCA9IFtOU0dyYXBoaWNzQ29udGV4dCBjdXJyZW50Q29u
dGV4dF07Ci0gICAgW2N1cnJlbnRDb250ZXh0IHNhdmVHcmFwaGljc1N0YXRlXTsKLSAgICBOU1Jl
Y3RDbGlwKGhlYWRlclJlY3QpOwotICAgIF9kYXRhLT5fcGFnZS0+ZHJhd0hlYWRlcihmcmFtZSwg
aGVhZGVyUmVjdCk7Ci0gICAgW2N1cnJlbnRDb250ZXh0IHJlc3RvcmVHcmFwaGljc1N0YXRlXTsK
LQotICAgIFtjdXJyZW50Q29udGV4dCBzYXZlR3JhcGhpY3NTdGF0ZV07Ci0gICAgTlNSZWN0Q2xp
cChmb290ZXJSZWN0KTsKLSAgICBfZGF0YS0+X3BhZ2UtPmRyYXdGb290ZXIoZnJhbWUsIGZvb3Rl
clJlY3QpOwotICAgIFtjdXJyZW50Q29udGV4dCByZXN0b3JlR3JhcGhpY3NTdGF0ZV07Ci19Ci0K
LS8vIEZJWE1FIDM0OTEzNDQ6IFRoaXMgaXMgYW4gQXBwS2l0LWludGVybmFsIG1ldGhvZCB0aGF0
IHdlIG5lZWQgdG8gb3ZlcnJpZGUgaW4gb3JkZXIKLS8vIHRvIGdldCBvdXIgc2hyaW5rLXRvLWZp
dCB0byB3b3JrIHdpdGggYSBjdXN0b20gcGFnaW5hdGlvbiBzY2hlbWUuIFdlIGNhbiBkbyB0aGlz
IGJldHRlcgotLy8gaWYgQXBwS2l0IG1ha2VzIGl0IFNQSS9BUEkuCi0tIChDR0Zsb2F0KV9wcm92
aWRlVG90YWxTY2FsZUZhY3RvckZvclByaW50T3BlcmF0aW9uOihOU1ByaW50T3BlcmF0aW9uICop
cHJpbnRPcGVyYXRpb24gCi17Ci0gICAgcmV0dXJuIF9kYXRhLT5fdG90YWxTY2FsZUZhY3RvckZv
clByaW50aW5nOwotfQotCi0vLyBSZXR1cm4gdGhlIGRyYXdpbmcgcmVjdGFuZ2xlIGZvciBhIHBh
cnRpY3VsYXIgcGFnZSBudW1iZXIKLS0gKE5TUmVjdClyZWN0Rm9yUGFnZTooTlNJbnRlZ2VyKXBh
Z2UKLXsKLSAgICBXZWJGcmFtZVByb3h5KiBmcmFtZSA9IGZyYW1lQmVpbmdQcmludGVkKCk7Ci0g
ICAgQVNTRVJUKGZyYW1lKTsKLQotICAgIGlmIChmcmFtZS0+aXNNYWluRnJhbWUoKSAmJiBfZGF0
YS0+X3BkZlZpZXdDb250cm9sbGVyKQotICAgICAgICByZXR1cm4gW3N1cGVyIHJlY3RGb3JQYWdl
OnBhZ2VdOwotCi0gICAgTE9HKFZpZXcsICJyZWN0Rm9yUGFnZTolZCAtPiB4ICVkLCB5ICVkLCB3
aWR0aCAlZCwgaGVpZ2h0ICVkXG4iLCAoaW50KXBhZ2UsIF9kYXRhLT5fcHJpbnRpbmdQYWdlUmVj
dHNbcGFnZSAtIDFdLngoKSwgX2RhdGEtPl9wcmludGluZ1BhZ2VSZWN0c1twYWdlIC0gMV0ueSgp
LCBfZGF0YS0+X3ByaW50aW5nUGFnZVJlY3RzW3BhZ2UgLSAxXS53aWR0aCgpLCBfZGF0YS0+X3By
aW50aW5nUGFnZVJlY3RzW3BhZ2UgLSAxXS5oZWlnaHQoKSk7Ci0gICAgcmV0dXJuIF9kYXRhLT5f
cHJpbnRpbmdQYWdlUmVjdHNbcGFnZSAtIDFdOwogfQogCiBAZW5kCkluZGV4OiBTb3VyY2UvV2Vi
S2l0Mi9XZWJLaXQyLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYktpdDIvV2ViS2l0Mi54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShyZXZpc2lvbiA3
NjQ1MSkKKysrIFNvdXJjZS9XZWJLaXQyL1dlYktpdDIueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJv
agkod29ya2luZyBjb3B5KQpAQCAtNjY4LDYgKzY2OCw4IEBACiAJCUQzQjk0ODQ3MTFGRjRCNjUw
MDAzMkIzOSAvKiBXZWJQb3B1cE1lbnUuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IEQzQjk0ODQzMTFGRjRCNjUwMDAzMkIzOSAvKiBXZWJQb3B1cE1lbnUu
aCAqLzsgfTsKIAkJRDNCOTQ4NDgxMUZGNEI2NTAwMDMyQjM5IC8qIFdlYlNlYXJjaFBvcHVwTWVu
dS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBEM0I5
NDg0NDExRkY0QjY1MDAwMzJCMzkgLyogV2ViU2VhcmNoUG9wdXBNZW51LmNwcCAqLzsgfTsKIAkJ
RDNCOTQ4NDkxMUZGNEI2NTAwMDMyQjM5IC8qIFdlYlNlYXJjaFBvcHVwTWVudS5oIGluIEhlYWRl
cnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRDNCOTQ4NDUxMUZGNEI2NTAw
MDMyQjM5IC8qIFdlYlNlYXJjaFBvcHVwTWVudS5oICovOyB9OworCQlFMTM0RjAxNzEyRUE1RDMz
MDA0RUM1OEQgLyogV0tQcmludGluZ1ZpZXcuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1
aWxkRmlsZTsgZmlsZVJlZiA9IEUxMzRGMDE1MTJFQTVEMTEwMDRFQzU4RCAvKiBXS1ByaW50aW5n
Vmlldy5oICovOyB9OworCQlFMTM0RjAxQTEyRUE1RDk5MDA0RUM1OEQgLyogV0tQcmludGluZ1Zp
ZXcubW0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFMTM0
RjAxOTEyRUE1RDk5MDA0RUM1OEQgLyogV0tQcmludGluZ1ZpZXcubW0gKi87IH07CiAJCUUxOEM5
MkY0MTJEQjlFNzEwMENGMkFFQiAvKiBQcmludEluZm8uY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNh
ID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRTE4QzkyRjMxMkRCOUU3MTAwQ0YyQUVCIC8qIFBy
aW50SW5mby5jcHAgKi87IH07CiAJCUUxOEM5MkY1MTJEQjlFN0EwMENGMkFFQiAvKiBQcmludElu
Zm8uY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRTE4
QzkyRjMxMkRCOUU3MTAwQ0YyQUVCIC8qIFByaW50SW5mby5jcHAgKi87IH07CiAJCUUxOEM5MkY2
MTJEQjlFOTQwMENGMkFFQiAvKiBQcmludEluZm9NYWMubW0gaW4gU291cmNlcyAqLyA9IHtpc2Eg
PSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFMUNDMUI4RjEyRDdFQURGMDA2MjU4MzggLyogUHJp
bnRJbmZvTWFjLm1tICovOyB9OwpAQCAtMTQzMSw2ICsxNDMzLDggQEAKIAkJRDNCOTQ4NDMxMUZG
NEI2NTAwMDMyQjM5IC8qIFdlYlBvcHVwTWVudS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7
IHBhdGggPSBXZWJQb3B1cE1lbnUuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRDNC
OTQ4NDQxMUZGNEI2NTAwMDMyQjM5IC8qIFdlYlNlYXJjaFBvcHVwTWVudS5jcHAgKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUg
PSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBXZWJTZWFyY2hQb3B1cE1lbnUuY3BwOyBzb3Vy
Y2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlEM0I5NDg0NTExRkY0QjY1MDAwMzJCMzkgLyogV2Vi
U2VhcmNoUG9wdXBNZW51LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29k
aW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFdlYlNl
YXJjaFBvcHVwTWVudS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlFMTM0RjAxNTEy
RUE1RDExMDA0RUM1OEQgLyogV0tQcmludGluZ1ZpZXcuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUu
Yy5oOyBwYXRoID0gV0tQcmludGluZ1ZpZXcuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsK
KwkJRTEzNEYwMTkxMkVBNUQ5OTAwNEVDNThEIC8qIFdLUHJpbnRpbmdWaWV3Lm1tICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jcHAub2JqY3BwOyBwYXRoID0gV0tQcmludGluZ1ZpZXcubW07IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUUxOEM5MkYzMTJEQjlFNzEwMENGMkFFQiAvKiBQcmlu
dEluZm8uY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7
IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gUHJpbnRJbmZv
LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRTFDQzFCOEUxMkQ3RUFERjAwNjI1
ODM4IC8qIFByaW50SW5mby5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNv
ZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBQcmlu
dEluZm8uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRTFDQzFCOEYxMkQ3RUFERjAw
NjI1ODM4IC8qIFByaW50SW5mb01hYy5tbSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBm
aWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLm9iamNw
cDsgcGF0aCA9IFByaW50SW5mb01hYy5tbTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAg
LTIzMTcsNiArMjMyMSw4IEBACiAJCQkJMUFBRjA2MTMxMkIwMTEzMTAwOEU0OUUyIC8qIFBERlZp
ZXdDb250cm9sbGVyLm1tICovLAogCQkJCUJDMTExQjRCMTEyRjYxOTIwMDMzN0JBQiAvKiBQYWdl
Q2xpZW50SW1wbC5oICovLAogCQkJCUJDMTExQjRDMTEyRjYxOTIwMDMzN0JBQiAvKiBQYWdlQ2xp
ZW50SW1wbC5tbSAqLywKKwkJCQlFMTM0RjAxNTEyRUE1RDExMDA0RUM1OEQgLyogV0tQcmludGlu
Z1ZpZXcuaCAqLywKKwkJCQlFMTM0RjAxOTEyRUE1RDk5MDA0RUM1OEQgLyogV0tQcmludGluZ1Zp
ZXcubW0gKi8sCiAJCQkJMUE0QTlBQTYxMkI3RTc5NjAwOEZFOTg0IC8qIFdLVGV4dElucHV0V2lu
ZG93Q29udHJvbGxlci5oICovLAogCQkJCTFBNEE5QUE3MTJCN0U3OTYwMDhGRTk4NCAvKiBXS1Rl
eHRJbnB1dFdpbmRvd0NvbnRyb2xsZXIubW0gKi8sCiAJCQkJQkM4Njk5QjIxMTZBQURBQTAwMkE5
MjVCIC8qIFdLVmlldy5oICovLApAQCAtMzA2OSw2ICszMDc1LDcgQEAKIAkJCQlDNTE3Mzg4MTEy
REY4RjRGMDBFRTNGNDcgLyogRHJhZ0NvbnRyb2xsZXJBY3Rpb24uaCBpbiBIZWFkZXJzICovLAog
CQkJCTFBQTJFNTFEMTJFNEMwNUUwMEJDNDk2NiAvKiBDR1V0aWxpdGllcy5oIGluIEhlYWRlcnMg
Ki8sCiAJCQkJQzU3NEE1ODExMkU2NjY4MTAwMkRGRTk4IC8qIFBhc3RlYm9hcmRUeXBlcy5oIGlu
IEhlYWRlcnMgKi8sCisJCQkJRTEzNEYwMTcxMkVBNUQzMzAwNEVDNThEIC8qIFdLUHJpbnRpbmdW
aWV3LmggaW4gSGVhZGVycyAqLywKIAkJCSk7CiAJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rw
cm9jZXNzaW5nID0gMDsKIAkJfTsKQEAgLTM1MzIsNiArMzUzOSw3IEBACiAJCQkJMUFBMkU1MUUx
MkU0QzA1RTAwQkM0OTY2IC8qIENHVXRpbGl0aWVzLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUM1
NzRBMzc3MTJFNjA5OUQwMDJERkU5OCAvKiBXZWJEcmFnQ2xpZW50TWFjLm1tIGluIFNvdXJjZXMg
Ki8sCiAJCQkJQzU3NEE1ODIxMkU2NjY4MTAwMkRGRTk4IC8qIFBhc3RlYm9hcmRUeXBlcy5tbSBp
biBTb3VyY2VzICovLAorCQkJCUUxMzRGMDFBMTJFQTVEOTkwMDRFQzU4RCAvKiBXS1ByaW50aW5n
Vmlldy5tbSBpbiBTb3VyY2VzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9z
dHByb2Nlc3NpbmcgPSAwOwogCQl9Owo=
</data>
<flag name="review"
          id="71301"
          type_id="1"
          status="+"
          setter="mitz"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>79863</attachid>
            <date>2011-01-22 21:11:02 -0800</date>
            <delta_ts>2011-01-23 14:28:09 -0800</delta_ts>
            <desc>patch for landing</desc>
            <filename>PrintingView.txt</filename>
            <type>text/plain</type>
            <size>29506</size>
            <attacher name="Alexey Proskuryakov">ap</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
S2l0Mi9DaGFuZ2VMb2cJKHJldmlzaW9uIDc2NDU1KQorKysgU291cmNlL1dlYktpdDIvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzEgQEAKKzIwMTEtMDEtMjIgIEFsZXhleSBQ
cm9za3VyeWFrb3YgIDxhcEBhcHBsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgRGFuIEJl
cm5zdGVpbi4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9NTI5NjgKKyAgICAgICAgVXNlIGEgc2VwYXJhdGUgTlNWaWV3IGZvciBwcmludGluZworCisg
ICAgICAgIEFsc28gYWRkcmVzc2VzIDxyZGFyOi8vcHJvYmxlbS84OTAwMTQ4PiBJbXByb3BlciBj
aGVjayBmb3IgCisgICAgICAgIC1bTlNHcmFwaGljc0NvbnRleHQgY3VycmVudENvbnRleHREcmF3
aW5nVG9TY3JlZW5dCisKKyAgICAgICAgKiBVSVByb2Nlc3MvQVBJL21hYy9XS1ByaW50aW5nVmll
dy5oOiBBZGRlZC4KKyAgICAgICAgKiBVSVByb2Nlc3MvQVBJL21hYy9XS1ByaW50aW5nVmlldy5t
bTogQWRkZWQuCisgICAgICAgICgtW1dLUHJpbnRpbmdWaWV3IGluaXRXaXRoRnJhbWVQcm94eTpd
KToKKyAgICAgICAgKC1bV0tQcmludGluZ1ZpZXcgaXNGbGlwcGVkXSk6CisgICAgICAgICgtW1dL
UHJpbnRpbmdWaWV3IF9hZGp1c3RQcmludGluZ01hcmdpbnNGb3JIZWFkZXJBbmRGb290ZXJdKToK
KyAgICAgICAgKC1bV0tQcmludGluZ1ZpZXcga25vd3NQYWdlUmFuZ2U6XSk6CisgICAgICAgICgt
W1dLUHJpbnRpbmdWaWV3IF9yZWN1cnNpdmVEaXNwbGF5UmVjdElmTmVlZGVkSWdub3JpbmdPcGFj
aXR5OmlzVmlzaWJsZVJlY3Q6cmVjdElzVmlzaWJsZVJlY3RGb3JWaWV3OnRvcFZpZXc6XSk6Cisg
ICAgICAgICgtW1dLUHJpbnRpbmdWaWV3IGRyYXdQYWdlQm9yZGVyV2l0aFNpemU6XSk6CisgICAg
ICAgICgtW1dLUHJpbnRpbmdWaWV3IF9wcm92aWRlVG90YWxTY2FsZUZhY3RvckZvclByaW50T3Bl
cmF0aW9uOl0pOgorICAgICAgICAoLVtXS1ByaW50aW5nVmlldyByZWN0Rm9yUGFnZTpdKToKKyAg
ICAgICAgKiBVSVByb2Nlc3MvQVBJL21hYy9XS1ZpZXcubW06CisgICAgICAgICgtW1dLVmlldyBk
cmF3UmVjdDpdKToKKyAgICAgICAgKC1bV0tWaWV3IGNhbkNoYW5nZUZyYW1lTGF5b3V0Ol0pOgor
ICAgICAgICAoLVtXS1ZpZXcgcHJpbnRPcGVyYXRpb25XaXRoUHJpbnRJbmZvOmZvckZyYW1lOl0p
OgorICAgICAgICAqIFdlYktpdDIueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvajoKKyAgICAgICAg
TW92ZWQgcHJpbnRpbmcgY29kZSB0byBhIHNlcGFyYXRlIHZpZXcsIHNpbXBsaWZ5aW5nIGFzIGFw
cHJvcHJpYXRlLiBUaGUgdmlldyBpcyBjdXJyZW50bHkgbm90CisgICAgICAgIHJlZmVyZW5jZWQg
YnkgYW55dGhpbmcgaW4gV2ViS2l0MiBkaXJlY3RseSwgYmVpbmcgb3duZWQgYnkgTlNQcmludE9w
ZXJhdGlvbi4KKwogMjAxMS0wMS0yMiAgQW5kZXJzIENhcmxzc29uICA8YW5kZXJzY2FAYXBwbGUu
Y29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IFNhbSBXZWluaWcuCkluZGV4OiBTb3VyY2UvV2Vi
S2l0Mi9VSVByb2Nlc3MvQVBJL21hYy9XS1ByaW50aW5nVmlldy5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvbWFjL1dLUHJpbnRpbmdWaWV3LmgJKHJldmlzaW9u
IDApCisrKyBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL21hYy9XS1ByaW50aW5nVmlldy5o
CShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEx
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBB
UyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJV
VE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
CisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2ltcG9ydCA8V2Vi
Q29yZS9JbnRSZWN0Lmg+CisjaW1wb3J0IDx3dGYvUmVmUHRyLmg+CisKK0BjbGFzcyBXS1ByaW50
aW5nVmlld0RhdGE7CisKK25hbWVzcGFjZSBXZWJLaXQgeworICAgIGNsYXNzIFdlYkZyYW1lUHJv
eHk7Cit9CisKK0BpbnRlcmZhY2UgV0tQcmludGluZ1ZpZXcgOiBOU1ZpZXcgeworQHB1YmxpYwor
ICAgIFJlZlB0cjxXZWJLaXQ6OldlYkZyYW1lUHJveHk+IF93ZWJGcmFtZTsKKyAgICBWZWN0b3I8
V2ViQ29yZTo6SW50UmVjdD4gX3dlYlByaW50aW5nUGFnZVJlY3RzOworICAgIGRvdWJsZSBfd2Vi
VG90YWxTY2FsZUZhY3RvckZvclByaW50aW5nOworfQorCistIChpZClpbml0V2l0aEZyYW1lUHJv
eHk6KFdlYktpdDo6V2ViRnJhbWVQcm94eSopZnJhbWU7CisKK0BlbmQKSW5kZXg6IFNvdXJjZS9X
ZWJLaXQyL1VJUHJvY2Vzcy9BUEkvbWFjL1dLUHJpbnRpbmdWaWV3Lm1tCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvbWFjL1dLUHJpbnRpbmdWaWV3Lm1tCShyZXZp
c2lvbiAwKQorKysgU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9tYWMvV0tQcmludGluZ1Zp
ZXcubW0JKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTgxIEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDExIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRP
UlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENP
TlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC
VVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2ltcG9y
dCAiV0tQcmludGluZ1ZpZXcuaCIKKworI2ltcG9ydCAiTG9nZ2luZy5oIgorI2ltcG9ydCAiUHJp
bnRJbmZvLmgiCisjaW1wb3J0ICJXZWJQYWdlUHJveHkuaCIKKworQGludGVyZmFjZSBOU1ZpZXcg
KFdlYk5TVmlld0RldGFpbHMpCistICh2b2lkKV9yZWN1cnNpdmVEaXNwbGF5UmVjdElmTmVlZGVk
SWdub3JpbmdPcGFjaXR5OihOU1JlY3QpcmVjdCBpc1Zpc2libGVSZWN0OihCT09MKWlzVmlzaWJs
ZVJlY3QgcmVjdElzVmlzaWJsZVJlY3RGb3JWaWV3OihOU1ZpZXcgKil2aXNpYmxlVmlldyB0b3BW
aWV3OihCT09MKXRvcFZpZXc7CitAZW5kCisKK3VzaW5nIG5hbWVzcGFjZSBXZWJLaXQ7Cit1c2lu
ZyBuYW1lc3BhY2UgV2ViQ29yZTsKKworTlNTdHJpbmcgKiBjb25zdCBXZWJLaXRPcmlnaW5hbFRv
cFByaW50aW5nTWFyZ2luS2V5ID0gQCJXZWJLaXRPcmlnaW5hbFRvcE1hcmdpbiI7CitOU1N0cmlu
ZyAqIGNvbnN0IFdlYktpdE9yaWdpbmFsQm90dG9tUHJpbnRpbmdNYXJnaW5LZXkgPSBAIldlYktp
dE9yaWdpbmFsQm90dG9tTWFyZ2luIjsKKworQGltcGxlbWVudGF0aW9uIFdLUHJpbnRpbmdWaWV3
CisKKy0gKGlkKWluaXRXaXRoRnJhbWVQcm94eTooV2ViRnJhbWVQcm94eSopZnJhbWUKK3sKKyAg
ICBzZWxmID0gW3N1cGVyIGluaXRdOyAvLyBObyBmcmFtZSByZWN0IHRvIHBhc3MgdG8gTlNWaWV3
LgorICAgIGlmICghc2VsZikKKyAgICAgICAgcmV0dXJuIG5pbDsKKworICAgIF93ZWJGcmFtZSA9
IGZyYW1lOworCisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy0gKEJPT0wpaXNGbGlwcGVkCit7Cisg
ICAgcmV0dXJuIFlFUzsKK30KKworLSAodm9pZClfYWRqdXN0UHJpbnRpbmdNYXJnaW5zRm9ySGVh
ZGVyQW5kRm9vdGVyCit7CisgICAgTlNQcmludE9wZXJhdGlvbiAqcHJpbnRPcGVyYXRpb24gPSBb
TlNQcmludE9wZXJhdGlvbiBjdXJyZW50T3BlcmF0aW9uXTsKKyAgICBOU1ByaW50SW5mbyAqaW5m
byA9IFtwcmludE9wZXJhdGlvbiBwcmludEluZm9dOworICAgIE5TTXV0YWJsZURpY3Rpb25hcnkg
KmluZm9EaWN0aW9uYXJ5ID0gW2luZm8gZGljdGlvbmFyeV07CisKKyAgICAvLyBXZSBuZWVkIHRv
IG1vZGlmeSB0aGUgdG9wIGFuZCBib3R0b20gbWFyZ2lucyBpbiB0aGUgTlNQcmludEluZm8gdG8g
YWNjb3VudCBmb3IgdGhlIHNwYWNlIG5lZWRlZCBieSB0aGUKKyAgICAvLyBoZWFkZXIgYW5kIGZv
b3Rlci4gQmVjYXVzZSB0aGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIG9u
IHRoZSBzYW1lIE5TUHJpbnRJbmZvIChzZWUgNTAzODA4NyksCisgICAgLy8gd2Ugc3Rhc2ggYXdh
eSB0aGUgdW5tb2RpZmllZCB0b3AgYW5kIGJvdHRvbSBtYXJnaW5zIHRoZSBmaXJzdCB0aW1lIHRo
aXMgbWV0aG9kIGlzIGNhbGxlZCwgYW5kIHdlIHJlYWQgZnJvbQorICAgIC8vIHRob3NlIHN0YXNo
ZWQtYXdheSB2YWx1ZXMgb24gc3Vic2VxdWVudCBjYWxscy4KKyAgICBkb3VibGUgb3JpZ2luYWxU
b3BNYXJnaW47CisgICAgZG91YmxlIG9yaWdpbmFsQm90dG9tTWFyZ2luOworICAgIE5TTnVtYmVy
ICpvcmlnaW5hbFRvcE1hcmdpbk51bWJlciA9IFtpbmZvRGljdGlvbmFyeSBvYmplY3RGb3JLZXk6
V2ViS2l0T3JpZ2luYWxUb3BQcmludGluZ01hcmdpbktleV07CisgICAgaWYgKCFvcmlnaW5hbFRv
cE1hcmdpbk51bWJlcikgeworICAgICAgICBBU1NFUlQoIVtpbmZvRGljdGlvbmFyeSBvYmplY3RG
b3JLZXk6V2ViS2l0T3JpZ2luYWxCb3R0b21QcmludGluZ01hcmdpbktleV0pOworICAgICAgICBv
cmlnaW5hbFRvcE1hcmdpbiA9IFtpbmZvIHRvcE1hcmdpbl07CisgICAgICAgIG9yaWdpbmFsQm90
dG9tTWFyZ2luID0gW2luZm8gYm90dG9tTWFyZ2luXTsKKyAgICAgICAgW2luZm9EaWN0aW9uYXJ5
IHNldE9iamVjdDpbTlNOdW1iZXIgbnVtYmVyV2l0aERvdWJsZTpvcmlnaW5hbFRvcE1hcmdpbl0g
Zm9yS2V5OldlYktpdE9yaWdpbmFsVG9wUHJpbnRpbmdNYXJnaW5LZXldOworICAgICAgICBbaW5m
b0RpY3Rpb25hcnkgc2V0T2JqZWN0OltOU051bWJlciBudW1iZXJXaXRoRG91YmxlOm9yaWdpbmFs
Qm90dG9tTWFyZ2luXSBmb3JLZXk6V2ViS2l0T3JpZ2luYWxCb3R0b21QcmludGluZ01hcmdpbktl
eV07CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUKFtvcmlnaW5hbFRvcE1hcmdpbk51bWJl
ciBpc0tpbmRPZkNsYXNzOltOU051bWJlciBjbGFzc11dKTsKKyAgICAgICAgQVNTRVJUKFtbaW5m
b0RpY3Rpb25hcnkgb2JqZWN0Rm9yS2V5OldlYktpdE9yaWdpbmFsQm90dG9tUHJpbnRpbmdNYXJn
aW5LZXldIGlzS2luZE9mQ2xhc3M6W05TTnVtYmVyIGNsYXNzXV0pOworICAgICAgICBvcmlnaW5h
bFRvcE1hcmdpbiA9IFtvcmlnaW5hbFRvcE1hcmdpbk51bWJlciBkb3VibGVWYWx1ZV07CisgICAg
ICAgIG9yaWdpbmFsQm90dG9tTWFyZ2luID0gW1tpbmZvRGljdGlvbmFyeSBvYmplY3RGb3JLZXk6
V2ViS2l0T3JpZ2luYWxCb3R0b21QcmludGluZ01hcmdpbktleV0gZG91YmxlVmFsdWVdOworICAg
IH0KKyAgICAKKyAgICBDR0Zsb2F0IHNjYWxlID0gW2luZm8gc2NhbGluZ0ZhY3Rvcl07CisgICAg
W2luZm8gc2V0VG9wTWFyZ2luOm9yaWdpbmFsVG9wTWFyZ2luICsgX3dlYkZyYW1lLT5wYWdlKCkt
PmhlYWRlckhlaWdodChfd2ViRnJhbWUuZ2V0KCkpICogc2NhbGVdOworICAgIFtpbmZvIHNldEJv
dHRvbU1hcmdpbjpvcmlnaW5hbEJvdHRvbU1hcmdpbiArIF93ZWJGcmFtZS0+cGFnZSgpLT5mb290
ZXJIZWlnaHQoX3dlYkZyYW1lLmdldCgpKSAqIHNjYWxlXTsKK30KKworLSAoQk9PTClrbm93c1Bh
Z2VSYW5nZTooTlNSYW5nZVBvaW50ZXIpcmFuZ2UKK3sKKyAgICBMT0coVmlldywgImtub3dzUGFn
ZVJhbmdlOiIpOworICAgIFtzZWxmIF9hZGp1c3RQcmludGluZ01hcmdpbnNGb3JIZWFkZXJBbmRG
b290ZXJdOworCisgICAgX3dlYkZyYW1lLT5wYWdlKCktPmNvbXB1dGVQYWdlc0ZvclByaW50aW5n
KF93ZWJGcmFtZS5nZXQoKSwgUHJpbnRJbmZvKFtbTlNQcmludE9wZXJhdGlvbiBjdXJyZW50T3Bl
cmF0aW9uXSBwcmludEluZm9dKSwgX3dlYlByaW50aW5nUGFnZVJlY3RzLCBfd2ViVG90YWxTY2Fs
ZUZhY3RvckZvclByaW50aW5nKTsKKworICAgICpyYW5nZSA9IE5TTWFrZVJhbmdlKDEsIF93ZWJQ
cmludGluZ1BhZ2VSZWN0cy5zaXplKCkpOworICAgIHJldHVybiBZRVM7Cit9CisKKy8vIFRha2Ug
b3ZlciBwcmludGluZy4gQXBwS2l0IGFwcGxpZXMgaW5jb3JyZWN0IGNsaXBwaW5nLCBhbmQgZG9l
c24ndCBwcmludCBwYWdlcyBiZXlvbmQgdGhlIGZpcnN0IG9uZS4KKy0gKHZvaWQpX3JlY3Vyc2l2
ZURpc3BsYXlSZWN0SWZOZWVkZWRJZ25vcmluZ09wYWNpdHk6KE5TUmVjdClyZWN0IGlzVmlzaWJs
ZVJlY3Q6KEJPT0wpaXNWaXNpYmxlUmVjdCByZWN0SXNWaXNpYmxlUmVjdEZvclZpZXc6KE5TVmll
dyAqKXZpc2libGVWaWV3IHRvcFZpZXc6KEJPT0wpdG9wVmlldworeworICAgIExPRyhWaWV3LCAi
UHJpbnRpbmcgcmVjdCB4OiVnLCB5OiVnLCB3aWR0aDolZywgaGVpZ2h0OiVnIiwgcmVjdC5vcmln
aW4ueCwgcmVjdC5vcmlnaW4ueSwgcmVjdC5zaXplLndpZHRoLCByZWN0LnNpemUuaGVpZ2h0KTsK
KworICAgIEFTU0VSVChzZWxmID09IHZpc2libGVWaWV3KTsKKworICAgIF93ZWJGcmFtZS0+cGFn
ZSgpLT5iZWdpblByaW50aW5nKF93ZWJGcmFtZS5nZXQoKSwgUHJpbnRJbmZvKFtbTlNQcmludE9w
ZXJhdGlvbiBjdXJyZW50T3BlcmF0aW9uXSBwcmludEluZm9dKSk7CisKKyAgICAvLyBGSVhNRTog
VGhpcyBpcyBvcHRpbWl6ZWQgZm9yIHByaW50IHByZXZpZXcuIEdldCB0aGUgd2hvbGUgZG9jdW1l
bnQgYXQgb25jZSB3aGVuIGFjdHVhbGx5IHByaW50aW5nLgorICAgIFZlY3Rvcjx1aW50OF90PiBw
ZGZEYXRhOworICAgIF93ZWJGcmFtZS0+cGFnZSgpLT5kcmF3UmVjdFRvUERGKF93ZWJGcmFtZS5n
ZXQoKSwgSW50UmVjdChyZWN0KSwgcGRmRGF0YSk7CisKKyAgICBSZXRhaW5QdHI8Q0dEYXRhUHJv
dmlkZXJSZWY+IHBkZkRhdGFQcm92aWRlcihBZG9wdENGLCBDR0RhdGFQcm92aWRlckNyZWF0ZVdp
dGhEYXRhKDAsIHBkZkRhdGEuZGF0YSgpLCBwZGZEYXRhLnNpemUoKSwgMCkpOworICAgIFJldGFp
blB0cjxDR1BERkRvY3VtZW50UmVmPiBwZGZEb2N1bWVudChBZG9wdENGLCBDR1BERkRvY3VtZW50
Q3JlYXRlV2l0aFByb3ZpZGVyKHBkZkRhdGFQcm92aWRlci5nZXQoKSkpOworICAgIGlmICghcGRm
RG9jdW1lbnQpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJDb3VsZG4ndCBjcmVhdGUgYSBQREYgZG9j
dW1lbnQgd2l0aCBkYXRhIHBhc3NlZCBmb3IgcHJpbnRpbmciKTsKKyAgICAgICAgcmV0dXJuOwor
ICAgIH0KKworICAgIENHUERGUGFnZVJlZiBwZGZQYWdlID0gQ0dQREZEb2N1bWVudEdldFBhZ2Uo
cGRmRG9jdW1lbnQuZ2V0KCksIDEpOworICAgIGlmICghcGRmUGFnZSkgeworICAgICAgICBMT0df
RVJST1IoIlByaW50aW5nIGRhdGEgZG9lc24ndCBoYXZlIHBhZ2UgMSIpOworICAgICAgICByZXR1
cm47CisgICAgfQorCisgICAgTlNHcmFwaGljc0NvbnRleHQgKm5zR3JhcGhpY3NDb250ZXh0ID0g
W05TR3JhcGhpY3NDb250ZXh0IGN1cnJlbnRDb250ZXh0XTsKKyAgICBDR0NvbnRleHRSZWYgY29u
dGV4dCA9IHN0YXRpY19jYXN0PENHQ29udGV4dFJlZj4oW25zR3JhcGhpY3NDb250ZXh0IGdyYXBo
aWNzUG9ydF0pOworCisgICAgQ0dDb250ZXh0U2F2ZUdTdGF0ZShjb250ZXh0KTsKKyAgICAvLyBG
bGlwIHRoZSBkZXN0aW5hdGlvbi4KKyAgICBDR0NvbnRleHRTY2FsZUNUTShjb250ZXh0LCAxLCAt
MSk7CisgICAgQ0dDb250ZXh0VHJhbnNsYXRlQ1RNKGNvbnRleHQsIDAsIC1DR1BERlBhZ2VHZXRC
b3hSZWN0KHBkZlBhZ2UsIGtDR1BERk1lZGlhQm94KS5zaXplLmhlaWdodCk7CisgICAgQ0dDb250
ZXh0RHJhd1BERlBhZ2UoY29udGV4dCwgcGRmUGFnZSk7CisgICAgQ0dDb250ZXh0UmVzdG9yZUdT
dGF0ZShjb250ZXh0KTsKK30KKworLSAodm9pZClkcmF3UGFnZUJvcmRlcldpdGhTaXplOihOU1Np
emUpYm9yZGVyU2l6ZQoreworICAgIEFTU0VSVChOU0VxdWFsU2l6ZXMoYm9yZGVyU2l6ZSwgW1tb
TlNQcmludE9wZXJhdGlvbiBjdXJyZW50T3BlcmF0aW9uXSBwcmludEluZm9dIHBhcGVyU2l6ZV0p
KTsgICAgCisKKyAgICAvLyBUaGUgaGVhZGVyIGFuZCBmb290ZXIgcmVjdCBoZWlnaHQgc2NhbGVz
IHdpdGggdGhlIHBhZ2UsIGJ1dCB0aGUgd2lkdGggaXMgYWx3YXlzCisgICAgLy8gYWxsIHRoZSB3
YXkgYWNyb3NzIHRoZSBwcmludGVkIHBhZ2UgKGluc2V0IGJ5IHByaW50aW5nIG1hcmdpbnMpLgor
ICAgIE5TUHJpbnRPcGVyYXRpb24gKnByaW50T3BlcmF0aW9uID0gW05TUHJpbnRPcGVyYXRpb24g
Y3VycmVudE9wZXJhdGlvbl07CisgICAgTlNQcmludEluZm8gKnByaW50SW5mbyA9IFtwcmludE9w
ZXJhdGlvbiBwcmludEluZm9dOworICAgIENHRmxvYXQgc2NhbGUgPSBbcHJpbnRJbmZvIHNjYWxp
bmdGYWN0b3JdOworICAgIE5TU2l6ZSBwYXBlclNpemUgPSBbcHJpbnRJbmZvIHBhcGVyU2l6ZV07
CisgICAgQ0dGbG9hdCBoZWFkZXJGb290ZXJMZWZ0ID0gW3ByaW50SW5mbyBsZWZ0TWFyZ2luXSAv
IHNjYWxlOworICAgIENHRmxvYXQgaGVhZGVyRm9vdGVyV2lkdGggPSAocGFwZXJTaXplLndpZHRo
IC0gKFtwcmludEluZm8gbGVmdE1hcmdpbl0gKyBbcHJpbnRJbmZvIHJpZ2h0TWFyZ2luXSkpIC8g
c2NhbGU7CisgICAgTlNSZWN0IGZvb3RlclJlY3QgPSBOU01ha2VSZWN0KGhlYWRlckZvb3Rlckxl
ZnQsIFtwcmludEluZm8gYm90dG9tTWFyZ2luXSAvIHNjYWxlIC0gX3dlYkZyYW1lLT5wYWdlKCkt
PmZvb3RlckhlaWdodChfd2ViRnJhbWUuZ2V0KCkpLCBoZWFkZXJGb290ZXJXaWR0aCwgX3dlYkZy
YW1lLT5wYWdlKCktPmZvb3RlckhlaWdodChfd2ViRnJhbWUuZ2V0KCkpKTsKKyAgICBOU1JlY3Qg
aGVhZGVyUmVjdCA9IE5TTWFrZVJlY3QoaGVhZGVyRm9vdGVyTGVmdCwgKHBhcGVyU2l6ZS5oZWln
aHQgLSBbcHJpbnRJbmZvIHRvcE1hcmdpbl0pIC8gc2NhbGUsIGhlYWRlckZvb3RlcldpZHRoLCBf
d2ViRnJhbWUtPnBhZ2UoKS0+aGVhZGVySGVpZ2h0KF93ZWJGcmFtZS5nZXQoKSkpOworCisgICAg
TlNHcmFwaGljc0NvbnRleHQgKmN1cnJlbnRDb250ZXh0ID0gW05TR3JhcGhpY3NDb250ZXh0IGN1
cnJlbnRDb250ZXh0XTsKKyAgICBbY3VycmVudENvbnRleHQgc2F2ZUdyYXBoaWNzU3RhdGVdOwor
ICAgIE5TUmVjdENsaXAoaGVhZGVyUmVjdCk7CisgICAgX3dlYkZyYW1lLT5wYWdlKCktPmRyYXdI
ZWFkZXIoX3dlYkZyYW1lLmdldCgpLCBoZWFkZXJSZWN0KTsKKyAgICBbY3VycmVudENvbnRleHQg
cmVzdG9yZUdyYXBoaWNzU3RhdGVdOworCisgICAgW2N1cnJlbnRDb250ZXh0IHNhdmVHcmFwaGlj
c1N0YXRlXTsKKyAgICBOU1JlY3RDbGlwKGZvb3RlclJlY3QpOworICAgIF93ZWJGcmFtZS0+cGFn
ZSgpLT5kcmF3Rm9vdGVyKF93ZWJGcmFtZS5nZXQoKSwgZm9vdGVyUmVjdCk7CisgICAgW2N1cnJl
bnRDb250ZXh0IHJlc3RvcmVHcmFwaGljc1N0YXRlXTsKK30KKworLy8gRklYTUUgMzQ5MTM0NDog
VGhpcyBpcyBhbiBBcHBLaXQtaW50ZXJuYWwgbWV0aG9kIHRoYXQgd2UgbmVlZCB0byBvdmVycmlk
ZSBpbiBvcmRlcgorLy8gdG8gZ2V0IG91ciBzaHJpbmstdG8tZml0IHRvIHdvcmsgd2l0aCBhIGN1
c3RvbSBwYWdpbmF0aW9uIHNjaGVtZS4gV2UgY2FuIGRvIHRoaXMgYmV0dGVyCisvLyBpZiBBcHBL
aXQgbWFrZXMgaXQgU1BJL0FQSS4KKy0gKENHRmxvYXQpX3Byb3ZpZGVUb3RhbFNjYWxlRmFjdG9y
Rm9yUHJpbnRPcGVyYXRpb246KE5TUHJpbnRPcGVyYXRpb24gKilwcmludE9wZXJhdGlvbiAKK3sK
KyAgICByZXR1cm4gX3dlYlRvdGFsU2NhbGVGYWN0b3JGb3JQcmludGluZzsKK30KKworLy8gUmV0
dXJuIHRoZSBkcmF3aW5nIHJlY3RhbmdsZSBmb3IgYSBwYXJ0aWN1bGFyIHBhZ2UgbnVtYmVyCist
IChOU1JlY3QpcmVjdEZvclBhZ2U6KE5TSW50ZWdlcilwYWdlCit7CisgICAgTE9HKFZpZXcsICJy
ZWN0Rm9yUGFnZTolZCAtPiB4ICVkLCB5ICVkLCB3aWR0aCAlZCwgaGVpZ2h0ICVkXG4iLCAoaW50
KXBhZ2UsIF93ZWJQcmludGluZ1BhZ2VSZWN0c1twYWdlIC0gMV0ueCgpLCBfd2ViUHJpbnRpbmdQ
YWdlUmVjdHNbcGFnZSAtIDFdLnkoKSwgX3dlYlByaW50aW5nUGFnZVJlY3RzW3BhZ2UgLSAxXS53
aWR0aCgpLCBfd2ViUHJpbnRpbmdQYWdlUmVjdHNbcGFnZSAtIDFdLmhlaWdodCgpKTsKKyAgICBy
ZXR1cm4gX3dlYlByaW50aW5nUGFnZVJlY3RzW3BhZ2UgLSAxXTsKK30KKworQGVuZApJbmRleDog
U291cmNlL1dlYktpdDIvVUlQcm9jZXNzL0FQSS9tYWMvV0tWaWV3Lm1tCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJLaXQyL1VJUHJvY2Vzcy9BUEkvbWFjL1dLVmlldy5tbQkocmV2aXNpb24gNzY0
NTEpCisrKyBTb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvQVBJL21hYy9XS1ZpZXcubW0JKHdvcmtp
bmcgY29weSkKQEAgLTM2LDEyICszNiwxMiBAQAogI2ltcG9ydCAiUERGVmlld0NvbnRyb2xsZXIu
aCIKICNpbXBvcnQgIlBhZ2VDbGllbnRJbXBsLmgiCiAjaW1wb3J0ICJQYXN0ZWJvYXJkVHlwZXMu
aCIKLSNpbXBvcnQgIlByaW50SW5mby5oIgogI2ltcG9ydCAiUmVnaW9uLmgiCiAjaW1wb3J0ICJS
dW5Mb29wLmgiCiAjaW1wb3J0ICJUZXh0Q2hlY2tlci5oIgogI2ltcG9ydCAiVGV4dENoZWNrZXJT
dGF0ZS5oIgogI2ltcG9ydCAiV0tBUElDYXN0LmgiCisjaW1wb3J0ICJXS1ByaW50aW5nVmlldy5o
IgogI2ltcG9ydCAiV0tTdHJpbmdDRi5oIgogI2ltcG9ydCAiV0tUZXh0SW5wdXRXaW5kb3dDb250
cm9sbGVyLmgiCiAjaW1wb3J0ICJXZWJDb250ZXh0LmgiCkBAIC03MSwxMCArNzEsNiBAQCBAaW50
ZXJmYWNlIE5TQXBwbGljYXRpb24gKERldGFpbHMpCiAtICh2b2lkKXNwZWFrU3RyaW5nOihOU1N0
cmluZyAqKXN0cmluZzsKIEBlbmQKIAotQGludGVyZmFjZSBOU1ZpZXcgKERldGFpbHMpCi0tICh2
b2lkKV9yZWN1cnNpdmVEaXNwbGF5UmVjdElmTmVlZGVkSWdub3JpbmdPcGFjaXR5OihOU1JlY3Qp
cmVjdCBpc1Zpc2libGVSZWN0OihCT09MKWlzVmlzaWJsZVJlY3QgcmVjdElzVmlzaWJsZVJlY3RG
b3JWaWV3OihOU1ZpZXcgKil2aXNpYmxlVmlldyB0b3BWaWV3OihCT09MKXRvcFZpZXc7Ci1AZW5k
Ci0KIEBpbnRlcmZhY2UgTlNXaW5kb3cgKERldGFpbHMpCiAtIChOU1JlY3QpX2dyb3dCb3hSZWN0
OwogLSAoQk9PTClfdXBkYXRlR3Jvd0JveEZvcldpbmRvd0ZyYW1lQ2hhbmdlOwpAQCAtOTcsOSAr
OTMsNiBAQCB0eXBlZGVmIEhhc2hNYXA8U3RyaW5nLCBWYWxpZGF0aW9uVmVjdG9yCiAKIH0KIAot
TlNTdHJpbmcqIGNvbnN0IFdlYktpdE9yaWdpbmFsVG9wUHJpbnRpbmdNYXJnaW5LZXkgPSBAIldl
YktpdE9yaWdpbmFsVG9wTWFyZ2luIjsKLU5TU3RyaW5nKiBjb25zdCBXZWJLaXRPcmlnaW5hbEJv
dHRvbVByaW50aW5nTWFyZ2luS2V5ID0gQCJXZWJLaXRPcmlnaW5hbEJvdHRvbU1hcmdpbiI7Ci0K
IEBpbnRlcmZhY2UgV0tWaWV3RGF0YSA6IE5TT2JqZWN0IHsKIEBwdWJsaWMKICAgICBPd25QdHI8
UGFnZUNsaWVudEltcGw+IF9wYWdlQ2xpZW50OwpAQCAtMTM1LDkgKzEyOCw2IEBAIEBpbnRlcmZh
Y2UgV0tWaWV3RGF0YSA6IE5TT2JqZWN0IHsKICAgICB1bnNpZ25lZCBfc2VsZWN0aW9uU3RhcnQ7
CiAgICAgdW5zaWduZWQgX3NlbGVjdGlvbkVuZDsKIAotICAgIFZlY3RvcjxJbnRSZWN0PiBfcHJp
bnRpbmdQYWdlUmVjdHM7Ci0gICAgZG91YmxlIF90b3RhbFNjYWxlRmFjdG9yRm9yUHJpbnRpbmc7
Ci0KICAgICBib29sIF9pbkJlY29tZUZpcnN0UmVzcG9uZGVyOwogICAgIGJvb2wgX2luUmVzaWdu
Rmlyc3RSZXNwb25kZXI7CiAgICAgTlNFdmVudCAqX21vdXNlRG93bkV2ZW50OwpAQCAtMTQ5LDM2
ICsxMzksNiBAQCBAaW50ZXJmYWNlIFdLVmlld0RhdGEgOiBOU09iamVjdCB7CiBAaW1wbGVtZW50
YXRpb24gV0tWaWV3RGF0YQogQGVuZAogCi1AaW50ZXJmYWNlIFdlYkZyYW1lV3JhcHBlciA6IE5T
T2JqZWN0IHsKLUBwdWJsaWMKLSAgICBSZWZQdHI8V2ViRnJhbWVQcm94eT4gX2ZyYW1lOwotfQot
Ci0tIChpZClpbml0V2l0aEZyYW1lUHJveHk6KFdlYkZyYW1lUHJveHkqKWZyYW1lOwotLSAoV2Vi
RnJhbWVQcm94eSopd2ViRnJhbWU7Ci1AZW5kCi0KLUBpbXBsZW1lbnRhdGlvbiBXZWJGcmFtZVdy
YXBwZXIKLQotLSAoaWQpaW5pdFdpdGhGcmFtZVByb3h5OihXZWJGcmFtZVByb3h5KilmcmFtZQot
ewotICAgIHNlbGYgPSBbc3VwZXIgaW5pdF07Ci0gICAgaWYgKCFzZWxmKQotICAgICAgICByZXR1
cm4gbmlsOwotCi0gICAgX2ZyYW1lID0gZnJhbWU7Ci0gICAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0g
KFdlYkZyYW1lUHJveHkqKXdlYkZyYW1lCi17Ci0gICAgcmV0dXJuIF9mcmFtZS5nZXQoKTsKLX0K
LQotQGVuZAotCi1OU1N0cmluZyAqIGNvbnN0IFByaW50ZWRGcmFtZUtleSA9IEAiV2ViS2l0UHJp
bnRlZEZyYW1lS2V5IjsKLQogQGludGVyZmFjZSBOU09iamVjdCAoTlNUZXh0SW5wdXRDb250ZXh0
RGV0YWlscykKIC0gKEJPT0wpd2FudHNUb0hhbmRsZU1vdXNlRXZlbnRzOwogLSAoQk9PTCloYW5k
bGVNb3VzZUV2ZW50OihOU0V2ZW50ICopZXZlbnQ7CkBAIC0xMjY3LDYgKzEyMjcsNyBAQCAtICh2
b2lkKV93aW5kb3dGcmFtZURpZENoYW5nZTooTlNOb3RpZmljCiAtICh2b2lkKWRyYXdSZWN0OihO
U1JlY3QpcmVjdAogewogICAgIExPRyhWaWV3LCAiZHJhd1JlY3Q6IHg6JWcsIHk6JWcsIHdpZHRo
OiVnLCBoZWlnaHQ6JWciLCByZWN0Lm9yaWdpbi54LCByZWN0Lm9yaWdpbi55LCByZWN0LnNpemUu
d2lkdGgsIHJlY3Quc2l6ZS5oZWlnaHQpOworICAgIF9kYXRhLT5fcGFnZS0+ZW5kUHJpbnRpbmco
KTsKICAgICBpZiAodXNlTmV3RHJhd2luZ0FyZWEoKSkgewogICAgICAgICBpZiAoRHJhd2luZ0Fy
ZWFQcm94eUltcGwqIGRyYXdpbmdBcmVhID0gc3RhdGljX2Nhc3Q8RHJhd2luZ0FyZWFQcm94eUlt
cGwqPihfZGF0YS0+X3BhZ2UtPmRyYXdpbmdBcmVhKCkpKSB7CiAgICAgICAgICAgICBDR0NvbnRl
eHRSZWYgY29udGV4dCA9IHN0YXRpY19jYXN0PENHQ29udGV4dFJlZj4oW1tOU0dyYXBoaWNzQ29u
dGV4dCBjdXJyZW50Q29udGV4dF0gZ3JhcGhpY3NQb3J0XSk7CkBAIC0xMzY1LDE5MCArMTMyNiwy
NyBAQCAtIChOU0ludGVnZXIpY29udmVyc2F0aW9uSWRlbnRpZmllcgogICAgIHJldHVybiAoTlNJ
bnRlZ2VyKXNlbGY7CiB9CiAKLXN0YXRpYyB2b2lkIHNldEZyYW1lQmVpbmdQcmludGVkKE5TUHJp
bnRPcGVyYXRpb24gKnByaW50T3BlcmF0aW9uLCBXZWJGcmFtZVByb3h5KiBmcmFtZSkKLXsKLSAg
ICBSZXRhaW5QdHI8V2ViRnJhbWVXcmFwcGVyPiBmcmFtZVdyYXBwZXIoQWRvcHROUywgW1tXZWJG
cmFtZVdyYXBwZXIgYWxsb2NdIGluaXRXaXRoRnJhbWVQcm94eTpmcmFtZV0pOwotICAgIFtbW3By
aW50T3BlcmF0aW9uIHByaW50SW5mb10gZGljdGlvbmFyeV0gc2V0T2JqZWN0OmZyYW1lV3JhcHBl
ci5nZXQoKSBmb3JLZXk6UHJpbnRlZEZyYW1lS2V5XTsKLX0KLQotc3RhdGljIFdlYkZyYW1lUHJv
eHkqIGZyYW1lQmVpbmdQcmludGVkKCkKLXsKLSAgICByZXR1cm4gW1tbW1tOU1ByaW50T3BlcmF0
aW9uIGN1cnJlbnRPcGVyYXRpb25dIHByaW50SW5mb10gZGljdGlvbmFyeV0gb2JqZWN0Rm9yS2V5
OlByaW50ZWRGcmFtZUtleV0gd2ViRnJhbWVdOwotfQogCi1zdGF0aWMgZmxvYXQgY3VycmVudFBy
aW50T3BlcmF0aW9uU2NhbGUoKQotewotICAgIEFTU0VSVChbTlNQcmludE9wZXJhdGlvbiBjdXJy
ZW50T3BlcmF0aW9uXSk7Ci0gICAgQVNTRVJUKFtbW1tOU1ByaW50T3BlcmF0aW9uIGN1cnJlbnRP
cGVyYXRpb25dIHByaW50SW5mb10gZGljdGlvbmFyeV0gb2JqZWN0Rm9yS2V5Ok5TUHJpbnRTY2Fs
aW5nRmFjdG9yXSk7Ci0gICAgcmV0dXJuIFtbW1tbTlNQcmludE9wZXJhdGlvbiBjdXJyZW50T3Bl
cmF0aW9uXSBwcmludEluZm9dIGRpY3Rpb25hcnldIG9iamVjdEZvcktleTpOU1ByaW50U2NhbGlu
Z0ZhY3Rvcl0gZmxvYXRWYWx1ZV07Ci19Ci0KLS0gKHZvaWQpX2FkanVzdFByaW50aW5nTWFyZ2lu
c0ZvckhlYWRlckFuZEZvb3RlcgorLSAoQk9PTCljYW5DaGFuZ2VGcmFtZUxheW91dDooV0tGcmFt
ZVJlZilmcmFtZVJlZgogewotICAgIE5TUHJpbnRPcGVyYXRpb24gKnByaW50T3BlcmF0aW9uID0g
W05TUHJpbnRPcGVyYXRpb24gY3VycmVudE9wZXJhdGlvbl07Ci0gICAgTlNQcmludEluZm8gKmlu
Zm8gPSBbcHJpbnRPcGVyYXRpb24gcHJpbnRJbmZvXTsKLSAgICBOU011dGFibGVEaWN0aW9uYXJ5
ICppbmZvRGljdGlvbmFyeSA9IFtpbmZvIGRpY3Rpb25hcnldOwotCi0gICAgLy8gV2UgbmVlZCB0
byBtb2RpZnkgdGhlIHRvcCBhbmQgYm90dG9tIG1hcmdpbnMgaW4gdGhlIE5TUHJpbnRJbmZvIHRv
IGFjY291bnQgZm9yIHRoZSBzcGFjZSBuZWVkZWQgYnkgdGhlCi0gICAgLy8gaGVhZGVyIGFuZCBm
b290ZXIuIEJlY2F1c2UgdGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZSBv
biB0aGUgc2FtZSBOU1ByaW50SW5mbyAoc2VlIDUwMzgwODcpLAotICAgIC8vIHdlIHN0YXNoIGF3
YXkgdGhlIHVubW9kaWZpZWQgdG9wIGFuZCBib3R0b20gbWFyZ2lucyB0aGUgZmlyc3QgdGltZSB0
aGlzIG1ldGhvZCBpcyBjYWxsZWQsIGFuZCB3ZSByZWFkIGZyb20KLSAgICAvLyB0aG9zZSBzdGFz
aGVkLWF3YXkgdmFsdWVzIG9uIHN1YnNlcXVlbnQgY2FsbHMuCi0gICAgZmxvYXQgb3JpZ2luYWxU
b3BNYXJnaW47Ci0gICAgZmxvYXQgb3JpZ2luYWxCb3R0b21NYXJnaW47Ci0gICAgTlNOdW1iZXIg
Km9yaWdpbmFsVG9wTWFyZ2luTnVtYmVyID0gW2luZm9EaWN0aW9uYXJ5IG9iamVjdEZvcktleTpX
ZWJLaXRPcmlnaW5hbFRvcFByaW50aW5nTWFyZ2luS2V5XTsKLSAgICBpZiAoIW9yaWdpbmFsVG9w
TWFyZ2luTnVtYmVyKSB7Ci0gICAgICAgIEFTU0VSVCghW2luZm9EaWN0aW9uYXJ5IG9iamVjdEZv
cktleTpXZWJLaXRPcmlnaW5hbEJvdHRvbVByaW50aW5nTWFyZ2luS2V5XSk7Ci0gICAgICAgIG9y
aWdpbmFsVG9wTWFyZ2luID0gW2luZm8gdG9wTWFyZ2luXTsKLSAgICAgICAgb3JpZ2luYWxCb3R0
b21NYXJnaW4gPSBbaW5mbyBib3R0b21NYXJnaW5dOwotICAgICAgICBbaW5mb0RpY3Rpb25hcnkg
c2V0T2JqZWN0OltOU051bWJlciBudW1iZXJXaXRoRmxvYXQ6b3JpZ2luYWxUb3BNYXJnaW5dIGZv
cktleTpXZWJLaXRPcmlnaW5hbFRvcFByaW50aW5nTWFyZ2luS2V5XTsKLSAgICAgICAgW2luZm9E
aWN0aW9uYXJ5IHNldE9iamVjdDpbTlNOdW1iZXIgbnVtYmVyV2l0aEZsb2F0Om9yaWdpbmFsQm90
dG9tTWFyZ2luXSBmb3JLZXk6V2ViS2l0T3JpZ2luYWxCb3R0b21QcmludGluZ01hcmdpbktleV07
Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQVNTRVJUKFtvcmlnaW5hbFRvcE1hcmdpbk51bWJlciBp
c0tpbmRPZkNsYXNzOltOU051bWJlciBjbGFzc11dKTsKLSAgICAgICAgQVNTRVJUKFtbaW5mb0Rp
Y3Rpb25hcnkgb2JqZWN0Rm9yS2V5OldlYktpdE9yaWdpbmFsQm90dG9tUHJpbnRpbmdNYXJnaW5L
ZXldIGlzS2luZE9mQ2xhc3M6W05TTnVtYmVyIGNsYXNzXV0pOwotICAgICAgICBvcmlnaW5hbFRv
cE1hcmdpbiA9IFtvcmlnaW5hbFRvcE1hcmdpbk51bWJlciBmbG9hdFZhbHVlXTsKLSAgICAgICAg
b3JpZ2luYWxCb3R0b21NYXJnaW4gPSBbW2luZm9EaWN0aW9uYXJ5IG9iamVjdEZvcktleTpXZWJL
aXRPcmlnaW5hbEJvdHRvbVByaW50aW5nTWFyZ2luS2V5XSBmbG9hdFZhbHVlXTsKLSAgICB9Ci0g
ICAgCi0gICAgZmxvYXQgc2NhbGUgPSBjdXJyZW50UHJpbnRPcGVyYXRpb25TY2FsZSgpOwotICAg
IFtpbmZvIHNldFRvcE1hcmdpbjpvcmlnaW5hbFRvcE1hcmdpbiArIF9kYXRhLT5fcGFnZS0+aGVh
ZGVySGVpZ2h0KGZyYW1lQmVpbmdQcmludGVkKCkpICogc2NhbGVdOwotICAgIFtpbmZvIHNldEJv
dHRvbU1hcmdpbjpvcmlnaW5hbEJvdHRvbU1hcmdpbiArIF9kYXRhLT5fcGFnZS0+Zm9vdGVySGVp
Z2h0KGZyYW1lQmVpbmdQcmludGVkKCkpICogc2NhbGVdOworICAgIC8vIFBERiBkb2N1bWVudHMg
YXJlIGFscmVhZHkgcGFnaW5hdGVkLCBzbyB3ZSBjYW4ndCBjaGFuZ2UgdGhlbSB0byBhZGQgaGVh
ZGVycyBhbmQgZm9vdGVycy4KKyAgICByZXR1cm4gIXRvSW1wbChmcmFtZVJlZiktPmlzTWFpbkZy
YW1lKCkgfHwgIV9kYXRhLT5fcGRmVmlld0NvbnRyb2xsZXI7CiB9CiAKIC0gKE5TUHJpbnRPcGVy
YXRpb24gKilwcmludE9wZXJhdGlvbldpdGhQcmludEluZm86KE5TUHJpbnRJbmZvICopcHJpbnRJ
bmZvIGZvckZyYW1lOihXS0ZyYW1lUmVmKWZyYW1lUmVmCiB7CiAgICAgTE9HKFZpZXcsICJDcmVh
dGluZyBhbiBOU1ByaW50T3BlcmF0aW9uIGZvciBmcmFtZSAnJXMnIiwgdG9JbXBsKGZyYW1lUmVm
KS0+dXJsKCkudXRmOCgpLmRhdGEoKSk7Ci0gICAgTlNQcmludE9wZXJhdGlvbiAqcHJpbnRPcGVy
YXRpb247CiAKICAgICAvLyBPbmx5IHRoZSB0b3AgZnJhbWUgY2FuIGN1cnJlbnRseSBjb250YWlu
IGEgUERGIHZpZXcuCiAgICAgaWYgKF9kYXRhLT5fcGRmVmlld0NvbnRyb2xsZXIpIHsKLSAgICAg
ICAgQVNTRVJUKHRvSW1wbChmcmFtZVJlZiktPmlzTWFpbkZyYW1lKCkpOwotICAgICAgICBwcmlu
dE9wZXJhdGlvbiA9IF9kYXRhLT5fcGRmVmlld0NvbnRyb2xsZXItPm1ha2VQcmludE9wZXJhdGlv
bihwcmludEluZm8pOwotICAgIH0gZWxzZQotICAgICAgICBwcmludE9wZXJhdGlvbiA9IFtOU1By
aW50T3BlcmF0aW9uIHByaW50T3BlcmF0aW9uV2l0aFZpZXc6c2VsZiBwcmludEluZm86cHJpbnRJ
bmZvXTsKLQotICAgIHNldEZyYW1lQmVpbmdQcmludGVkKHByaW50T3BlcmF0aW9uLCB0b0ltcGwo
ZnJhbWVSZWYpKTsKLSAgICByZXR1cm4gcHJpbnRPcGVyYXRpb247Ci19Ci0KLS0gKEJPT0wpY2Fu
Q2hhbmdlRnJhbWVMYXlvdXQ6KFdLRnJhbWVSZWYpZnJhbWVSZWYKLXsKLSAgICAvLyBQREYgZG9j
dW1lbnRzIGFyZSBhbHJlYWR5IHBhZ2luYXRlZCwgc28gd2UgY2FuJ3QgY2hhbmdlIHRoZW0gdG8g
YWRkIGhlYWRlcnMgYW5kIGZvb3RlcnMuCi0gICAgcmV0dXJuICF0b0ltcGwoZnJhbWVSZWYpLT5p
c01haW5GcmFtZSgpIHx8ICFfZGF0YS0+X3BkZlZpZXdDb250cm9sbGVyOwotfQotCi0vLyBSZXR1
cm4gdGhlIG51bWJlciBvZiBwYWdlcyBhdmFpbGFibGUgZm9yIHByaW50aW5nCi0tIChCT09MKWtu
b3dzUGFnZVJhbmdlOihOU1JhbmdlUG9pbnRlcilyYW5nZQotewotICAgIExPRyhWaWV3LCAia25v
d3NQYWdlUmFuZ2U6Iik7Ci0gICAgV2ViRnJhbWVQcm94eSogZnJhbWUgPSBmcmFtZUJlaW5nUHJp
bnRlZCgpOwotICAgIEFTU0VSVChmcmFtZSk7Ci0KLSAgICBpZiAoZnJhbWUtPmlzTWFpbkZyYW1l
KCkgJiYgX2RhdGEtPl9wZGZWaWV3Q29udHJvbGxlcikKLSAgICAgICAgcmV0dXJuIFtzdXBlciBr
bm93c1BhZ2VSYW5nZTpyYW5nZV07Ci0KLSAgICBbc2VsZiBfYWRqdXN0UHJpbnRpbmdNYXJnaW5z
Rm9ySGVhZGVyQW5kRm9vdGVyXTsKLQotICAgIF9kYXRhLT5fcGFnZS0+Y29tcHV0ZVBhZ2VzRm9y
UHJpbnRpbmcoZnJhbWUsIFByaW50SW5mbyhbW05TUHJpbnRPcGVyYXRpb24gY3VycmVudE9wZXJh
dGlvbl0gcHJpbnRJbmZvXSksIF9kYXRhLT5fcHJpbnRpbmdQYWdlUmVjdHMsIF9kYXRhLT5fdG90
YWxTY2FsZUZhY3RvckZvclByaW50aW5nKTsKLQotICAgICpyYW5nZSA9IE5TTWFrZVJhbmdlKDEs
IF9kYXRhLT5fcHJpbnRpbmdQYWdlUmVjdHMuc2l6ZSgpKTsKLSAgICByZXR1cm4gWUVTOwotfQot
Ci0vLyBUYWtlIG92ZXIgcHJpbnRpbmcuIEFwcEtpdCBhcHBsaWVzIGluY29ycmVjdCBjbGlwcGlu
ZywgYW5kIGRvZXNuJ3QgcHJpbnQgcGFnZXMgYmV5b25kIHRoZSBmaXJzdCBvbmUuCi0tICh2b2lk
KV9yZWN1cnNpdmVEaXNwbGF5UmVjdElmTmVlZGVkSWdub3JpbmdPcGFjaXR5OihOU1JlY3QpcmVj
dCBpc1Zpc2libGVSZWN0OihCT09MKWlzVmlzaWJsZVJlY3QgcmVjdElzVmlzaWJsZVJlY3RGb3JW
aWV3OihOU1ZpZXcgKil2aXNpYmxlVmlldyB0b3BWaWV3OihCT09MKXRvcFZpZXcKLXsKLSAgICAv
LyBGSVhNRTogVGhpcyBjaGVjayBpc24ndCByaWdodCBmb3Igc29tZSBub24tcHJpbnRpbmcgY2Fz
ZXMsIHN1Y2ggYXMgY2FwdHVyaW5nIGludG8gYSBidWZmZXIgdXNpbmcgY2FjaGVEaXNwbGF5SW5S
ZWN0OnRvQml0bWFwSW1hZ2VSZXA6LgotICAgIGlmIChbTlNHcmFwaGljc0NvbnRleHQgY3VycmVu
dENvbnRleHREcmF3aW5nVG9TY3JlZW5dKSB7Ci0gICAgICAgIF9kYXRhLT5fcGFnZS0+ZW5kUHJp
bnRpbmcoKTsKLSAgICAgICAgW3N1cGVyIF9yZWN1cnNpdmVEaXNwbGF5UmVjdElmTmVlZGVkSWdu
b3JpbmdPcGFjaXR5OnJlY3QgaXNWaXNpYmxlUmVjdDppc1Zpc2libGVSZWN0IHJlY3RJc1Zpc2li
bGVSZWN0Rm9yVmlldzp2aXNpYmxlVmlldyB0b3BWaWV3OnRvcFZpZXddOwotICAgICAgICByZXR1
cm47Ci0gICAgfQotCi0gICAgTE9HKFZpZXcsICJQcmludGluZyByZWN0IHg6JWcsIHk6JWcsIHdp
ZHRoOiVnLCBoZWlnaHQ6JWciLCByZWN0Lm9yaWdpbi54LCByZWN0Lm9yaWdpbi55LCByZWN0LnNp
emUud2lkdGgsIHJlY3Quc2l6ZS5oZWlnaHQpOwotCi0gICAgQVNTRVJUKHNlbGYgPT0gdmlzaWJs
ZVZpZXcpOwotICAgIEFTU0VSVChmcmFtZUJlaW5nUHJpbnRlZCgpKTsKLQotICAgIFdlYkZyYW1l
UHJveHkqIGZyYW1lID0gZnJhbWVCZWluZ1ByaW50ZWQoKTsKLSAgICBBU1NFUlQoZnJhbWUpOwot
Ci0gICAgX2RhdGEtPl9wYWdlLT5iZWdpblByaW50aW5nKGZyYW1lLCBQcmludEluZm8oW1tOU1By
aW50T3BlcmF0aW9uIGN1cnJlbnRPcGVyYXRpb25dIHByaW50SW5mb10pKTsKLQotICAgIC8vIEZJ
WE1FOiBUaGlzIGlzIG9wdGltaXplZCBmb3IgcHJpbnQgcHJldmlldy4gR2V0IHRoZSB3aG9sZSBk
b2N1bWVudCBhdCBvbmNlIHdoZW4gYWN0dWFsbHkgcHJpbnRpbmcuCi0gICAgVmVjdG9yPHVpbnQ4
X3Q+IHBkZkRhdGE7Ci0gICAgX2RhdGEtPl9wYWdlLT5kcmF3UmVjdFRvUERGKGZyYW1lLCBJbnRS
ZWN0KHJlY3QpLCBwZGZEYXRhKTsKLQotICAgIFJldGFpblB0cjxDR0RhdGFQcm92aWRlclJlZj4g
cGRmRGF0YVByb3ZpZGVyKEFkb3B0Q0YsIENHRGF0YVByb3ZpZGVyQ3JlYXRlV2l0aERhdGEoMCwg
cGRmRGF0YS5kYXRhKCksIHBkZkRhdGEuc2l6ZSgpLCAwKSk7Ci0gICAgUmV0YWluUHRyPENHUERG
RG9jdW1lbnRSZWY+IHBkZkRvY3VtZW50KEFkb3B0Q0YsIENHUERGRG9jdW1lbnRDcmVhdGVXaXRo
UHJvdmlkZXIocGRmRGF0YVByb3ZpZGVyLmdldCgpKSk7Ci0gICAgaWYgKCFwZGZEb2N1bWVudCkg
ewotICAgICAgICBMT0dfRVJST1IoIkNvdWxkbid0IGNyZWF0ZSBhIFBERiBkb2N1bWVudCB3aXRo
IGRhdGEgcGFzc2VkIGZvciBwcmludGluZyIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0g
ICAgQ0dQREZQYWdlUmVmIHBkZlBhZ2UgPSBDR1BERkRvY3VtZW50R2V0UGFnZShwZGZEb2N1bWVu
dC5nZXQoKSwgMSk7Ci0gICAgaWYgKCFwZGZQYWdlKSB7Ci0gICAgICAgIExPR19FUlJPUigiUHJp
bnRpbmcgZGF0YSBkb2Vzbid0IGhhdmUgcGFnZSAxIik7Ci0gICAgICAgIHJldHVybjsKKyAgICAg
ICAgaWYgKCF0b0ltcGwoZnJhbWVSZWYpLT5pc01haW5GcmFtZSgpKQorICAgICAgICAgICAgcmV0
dXJuIDA7CisgICAgICAgIHJldHVybiBfZGF0YS0+X3BkZlZpZXdDb250cm9sbGVyLT5tYWtlUHJp
bnRPcGVyYXRpb24ocHJpbnRJbmZvKTsKKyAgICB9IGVsc2UgeworICAgICAgICBSZXRhaW5QdHI8
V0tQcmludGluZ1ZpZXc+IHByaW50aW5nVmlldyhBZG9wdE5TLCBbW1dLUHJpbnRpbmdWaWV3IGFs
bG9jXSBpbml0V2l0aEZyYW1lUHJveHk6dG9JbXBsKGZyYW1lUmVmKV0pOworICAgICAgICAvLyBO
U1ByaW50T3BlcmF0aW9uIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgdmlldy4KKyAgICAgICAgcmV0
dXJuIFtOU1ByaW50T3BlcmF0aW9uIHByaW50T3BlcmF0aW9uV2l0aFZpZXc6cHJpbnRpbmdWaWV3
LmdldCgpXTsKICAgICB9Ci0KLSAgICBOU0dyYXBoaWNzQ29udGV4dCAqbnNHcmFwaGljc0NvbnRl
eHQgPSBbTlNHcmFwaGljc0NvbnRleHQgY3VycmVudENvbnRleHRdOwotICAgIENHQ29udGV4dFJl
ZiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8Q0dDb250ZXh0UmVmPihbbnNHcmFwaGljc0NvbnRleHQg
Z3JhcGhpY3NQb3J0XSk7Ci0KLSAgICBDR0NvbnRleHRTYXZlR1N0YXRlKGNvbnRleHQpOwotICAg
IC8vIEZsaXAgdGhlIGRlc3RpbmF0aW9uLgotICAgIENHQ29udGV4dFNjYWxlQ1RNKGNvbnRleHQs
IDEsIC0xKTsKLSAgICBDR0NvbnRleHRUcmFuc2xhdGVDVE0oY29udGV4dCwgMCwgLUNHUERGUGFn
ZUdldEJveFJlY3QocGRmUGFnZSwga0NHUERGTWVkaWFCb3gpLnNpemUuaGVpZ2h0KTsKLSAgICBD
R0NvbnRleHREcmF3UERGUGFnZShjb250ZXh0LCBwZGZQYWdlKTsKLSAgICBDR0NvbnRleHRSZXN0
b3JlR1N0YXRlKGNvbnRleHQpOwotfQotCi0tICh2b2lkKWRyYXdQYWdlQm9yZGVyV2l0aFNpemU6
KE5TU2l6ZSlib3JkZXJTaXplCi17Ci0gICAgQVNTRVJUKE5TRXF1YWxTaXplcyhib3JkZXJTaXpl
LCBbW1tOU1ByaW50T3BlcmF0aW9uIGN1cnJlbnRPcGVyYXRpb25dIHByaW50SW5mb10gcGFwZXJT
aXplXSkpOyAgICAKLQotICAgIC8vIFRoZSBoZWFkZXIgYW5kIGZvb3RlciByZWN0IGhlaWdodCBz
Y2FsZXMgd2l0aCB0aGUgcGFnZSwgYnV0IHRoZSB3aWR0aCBpcyBhbHdheXMKLSAgICAvLyBhbGwg
dGhlIHdheSBhY3Jvc3MgdGhlIHByaW50ZWQgcGFnZSAoaW5zZXQgYnkgcHJpbnRpbmcgbWFyZ2lu
cykuCi0gICAgTlNQcmludE9wZXJhdGlvbiAqcHJpbnRPcGVyYXRpb24gPSBbTlNQcmludE9wZXJh
dGlvbiBjdXJyZW50T3BlcmF0aW9uXTsKLSAgICBOU1ByaW50SW5mbyAqcHJpbnRJbmZvID0gW3By
aW50T3BlcmF0aW9uIHByaW50SW5mb107Ci0gICAgZmxvYXQgc2NhbGUgPSBjdXJyZW50UHJpbnRP
cGVyYXRpb25TY2FsZSgpOwotICAgIE5TU2l6ZSBwYXBlclNpemUgPSBbcHJpbnRJbmZvIHBhcGVy
U2l6ZV07Ci0gICAgZmxvYXQgaGVhZGVyRm9vdGVyTGVmdCA9IFtwcmludEluZm8gbGVmdE1hcmdp
bl0gLyBzY2FsZTsKLSAgICBmbG9hdCBoZWFkZXJGb290ZXJXaWR0aCA9IChwYXBlclNpemUud2lk
dGggLSAoW3ByaW50SW5mbyBsZWZ0TWFyZ2luXSArIFtwcmludEluZm8gcmlnaHRNYXJnaW5dKSkg
LyBzY2FsZTsKLSAgICBXZWJGcmFtZVByb3h5KiBmcmFtZSA9IGZyYW1lQmVpbmdQcmludGVkKCk7
Ci0gICAgTlNSZWN0IGZvb3RlclJlY3QgPSBOU01ha2VSZWN0KGhlYWRlckZvb3RlckxlZnQsIFtw
cmludEluZm8gYm90dG9tTWFyZ2luXSAvIHNjYWxlIC0gX2RhdGEtPl9wYWdlLT5mb290ZXJIZWln
aHQoZnJhbWUpLCBoZWFkZXJGb290ZXJXaWR0aCwgX2RhdGEtPl9wYWdlLT5mb290ZXJIZWlnaHQo
ZnJhbWUpKTsKLSAgICBOU1JlY3QgaGVhZGVyUmVjdCA9IE5TTWFrZVJlY3QoaGVhZGVyRm9vdGVy
TGVmdCwgKHBhcGVyU2l6ZS5oZWlnaHQgLSBbcHJpbnRJbmZvIHRvcE1hcmdpbl0pIC8gc2NhbGUs
IGhlYWRlckZvb3RlcldpZHRoLCBfZGF0YS0+X3BhZ2UtPmhlYWRlckhlaWdodChmcmFtZSkpOwot
Ci0gICAgTlNHcmFwaGljc0NvbnRleHQgKmN1cnJlbnRDb250ZXh0ID0gW05TR3JhcGhpY3NDb250
ZXh0IGN1cnJlbnRDb250ZXh0XTsKLSAgICBbY3VycmVudENvbnRleHQgc2F2ZUdyYXBoaWNzU3Rh
dGVdOwotICAgIE5TUmVjdENsaXAoaGVhZGVyUmVjdCk7Ci0gICAgX2RhdGEtPl9wYWdlLT5kcmF3
SGVhZGVyKGZyYW1lLCBoZWFkZXJSZWN0KTsKLSAgICBbY3VycmVudENvbnRleHQgcmVzdG9yZUdy
YXBoaWNzU3RhdGVdOwotCi0gICAgW2N1cnJlbnRDb250ZXh0IHNhdmVHcmFwaGljc1N0YXRlXTsK
LSAgICBOU1JlY3RDbGlwKGZvb3RlclJlY3QpOwotICAgIF9kYXRhLT5fcGFnZS0+ZHJhd0Zvb3Rl
cihmcmFtZSwgZm9vdGVyUmVjdCk7Ci0gICAgW2N1cnJlbnRDb250ZXh0IHJlc3RvcmVHcmFwaGlj
c1N0YXRlXTsKLX0KLQotLy8gRklYTUUgMzQ5MTM0NDogVGhpcyBpcyBhbiBBcHBLaXQtaW50ZXJu
YWwgbWV0aG9kIHRoYXQgd2UgbmVlZCB0byBvdmVycmlkZSBpbiBvcmRlcgotLy8gdG8gZ2V0IG91
ciBzaHJpbmstdG8tZml0IHRvIHdvcmsgd2l0aCBhIGN1c3RvbSBwYWdpbmF0aW9uIHNjaGVtZS4g
V2UgY2FuIGRvIHRoaXMgYmV0dGVyCi0vLyBpZiBBcHBLaXQgbWFrZXMgaXQgU1BJL0FQSS4KLS0g
KENHRmxvYXQpX3Byb3ZpZGVUb3RhbFNjYWxlRmFjdG9yRm9yUHJpbnRPcGVyYXRpb246KE5TUHJp
bnRPcGVyYXRpb24gKilwcmludE9wZXJhdGlvbiAKLXsKLSAgICByZXR1cm4gX2RhdGEtPl90b3Rh
bFNjYWxlRmFjdG9yRm9yUHJpbnRpbmc7Ci19Ci0KLS8vIFJldHVybiB0aGUgZHJhd2luZyByZWN0
YW5nbGUgZm9yIGEgcGFydGljdWxhciBwYWdlIG51bWJlcgotLSAoTlNSZWN0KXJlY3RGb3JQYWdl
OihOU0ludGVnZXIpcGFnZQotewotICAgIFdlYkZyYW1lUHJveHkqIGZyYW1lID0gZnJhbWVCZWlu
Z1ByaW50ZWQoKTsKLSAgICBBU1NFUlQoZnJhbWUpOwotCi0gICAgaWYgKGZyYW1lLT5pc01haW5G
cmFtZSgpICYmIF9kYXRhLT5fcGRmVmlld0NvbnRyb2xsZXIpCi0gICAgICAgIHJldHVybiBbc3Vw
ZXIgcmVjdEZvclBhZ2U6cGFnZV07Ci0KLSAgICBMT0coVmlldywgInJlY3RGb3JQYWdlOiVkIC0+
IHggJWQsIHkgJWQsIHdpZHRoICVkLCBoZWlnaHQgJWRcbiIsIChpbnQpcGFnZSwgX2RhdGEtPl9w
cmludGluZ1BhZ2VSZWN0c1twYWdlIC0gMV0ueCgpLCBfZGF0YS0+X3ByaW50aW5nUGFnZVJlY3Rz
W3BhZ2UgLSAxXS55KCksIF9kYXRhLT5fcHJpbnRpbmdQYWdlUmVjdHNbcGFnZSAtIDFdLndpZHRo
KCksIF9kYXRhLT5fcHJpbnRpbmdQYWdlUmVjdHNbcGFnZSAtIDFdLmhlaWdodCgpKTsKLSAgICBy
ZXR1cm4gX2RhdGEtPl9wcmludGluZ1BhZ2VSZWN0c1twYWdlIC0gMV07CiB9CiAKIEBlbmQKSW5k
ZXg6IFNvdXJjZS9XZWJLaXQyL1dlYktpdDIueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvago9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0Mi9XZWJLaXQyLnhjb2RlcHJvai9wcm9qZWN0LnBieHBy
b2oJKHJldmlzaW9uIDc2NDUxKQorKysgU291cmNlL1dlYktpdDIvV2ViS2l0Mi54Y29kZXByb2ov
cHJvamVjdC5wYnhwcm9qCSh3b3JraW5nIGNvcHkpCkBAIC02NjgsNiArNjY4LDggQEAKIAkJRDNC
OTQ4NDcxMUZGNEI2NTAwMDMyQjM5IC8qIFdlYlBvcHVwTWVudS5oIGluIEhlYWRlcnMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRDNCOTQ4NDMxMUZGNEI2NTAwMDMyQjM5IC8q
IFdlYlBvcHVwTWVudS5oICovOyB9OwogCQlEM0I5NDg0ODExRkY0QjY1MDAwMzJCMzkgLyogV2Vi
U2VhcmNoUG9wdXBNZW51LmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IEQzQjk0ODQ0MTFGRjRCNjUwMDAzMkIzOSAvKiBXZWJTZWFyY2hQb3B1cE1lbnUu
Y3BwICovOyB9OwogCQlEM0I5NDg0OTExRkY0QjY1MDAwMzJCMzkgLyogV2ViU2VhcmNoUG9wdXBN
ZW51LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBEM0I5
NDg0NTExRkY0QjY1MDAwMzJCMzkgLyogV2ViU2VhcmNoUG9wdXBNZW51LmggKi87IH07CisJCUUx
MzRGMDE3MTJFQTVEMzMwMDRFQzU4RCAvKiBXS1ByaW50aW5nVmlldy5oIGluIEhlYWRlcnMgKi8g
PSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRTEzNEYwMTUxMkVBNUQxMTAwNEVDNThE
IC8qIFdLUHJpbnRpbmdWaWV3LmggKi87IH07CisJCUUxMzRGMDFBMTJFQTVEOTkwMDRFQzU4RCAv
KiBXS1ByaW50aW5nVmlldy5tbSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IEUxMzRGMDE5MTJFQTVEOTkwMDRFQzU4RCAvKiBXS1ByaW50aW5nVmlldy5tbSAq
LzsgfTsKIAkJRTE4QzkyRjQxMkRCOUU3MTAwQ0YyQUVCIC8qIFByaW50SW5mby5jcHAgaW4gU291
cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFMThDOTJGMzEyREI5RTcx
MDBDRjJBRUIgLyogUHJpbnRJbmZvLmNwcCAqLzsgfTsKIAkJRTE4QzkyRjUxMkRCOUU3QTAwQ0Yy
QUVCIC8qIFByaW50SW5mby5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7
IGZpbGVSZWYgPSBFMThDOTJGMzEyREI5RTcxMDBDRjJBRUIgLyogUHJpbnRJbmZvLmNwcCAqLzsg
fTsKIAkJRTE4QzkyRjYxMkRCOUU5NDAwQ0YyQUVCIC8qIFByaW50SW5mb01hYy5tbSBpbiBTb3Vy
Y2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEUxQ0MxQjhGMTJEN0VBREYw
MDYyNTgzOCAvKiBQcmludEluZm9NYWMubW0gKi87IH07CkBAIC0xNDMxLDYgKzE0MzMsOCBAQAog
CQlEM0I5NDg0MzExRkY0QjY1MDAwMzJCMzkgLyogV2ViUG9wdXBNZW51LmggKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBz
b3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFdlYlBvcHVwTWVudS5oOyBzb3VyY2VUcmVlID0gIjxncm91
cD4iOyB9OwogCQlEM0I5NDg0NDExRkY0QjY1MDAwMzJCMzkgLyogV2ViU2VhcmNoUG9wdXBNZW51
LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0
S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFdlYlNlYXJjaFBvcHVw
TWVudS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUQzQjk0ODQ1MTFGRjRCNjUw
MDAzMkIzOSAvKiBXZWJTZWFyY2hQb3B1cE1lbnUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJl
bmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5o
OyBwYXRoID0gV2ViU2VhcmNoUG9wdXBNZW51Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07
CisJCUUxMzRGMDE1MTJFQTVEMTEwMDRFQzU4RCAvKiBXS1ByaW50aW5nVmlldy5oICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBXS1ByaW50aW5nVmlldy5oOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OworCQlFMTM0RjAxOTEyRUE1RDk5MDA0RUM1OEQgLyogV0tQcmludGluZ1Zp
ZXcubW0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFz
dEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5vYmpjcHA7IHBhdGggPSBXS1ByaW50aW5n
Vmlldy5tbTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRTE4QzkyRjMxMkRCOUU3MTAw
Q0YyQUVCIC8qIFByaW50SW5mby5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBh
dGggPSBQcmludEluZm8uY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlFMUNDMUI4
RTEyRDdFQURGMDA2MjU4MzggLyogUHJpbnRJbmZvLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMu
aDsgcGF0aCA9IFByaW50SW5mby5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlFMUND
MUI4RjEyRDdFQURGMDA2MjU4MzggLyogUHJpbnRJbmZvTWFjLm1tICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jcHAub2JqY3BwOyBwYXRoID0gUHJpbnRJbmZvTWFjLm1tOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OwpAQCAtMjMxNyw2ICsyMzIxLDggQEAKIAkJCQkxQUFGMDYxMzEyQjAxMTMxMDA4
RTQ5RTIgLyogUERGVmlld0NvbnRyb2xsZXIubW0gKi8sCiAJCQkJQkMxMTFCNEIxMTJGNjE5MjAw
MzM3QkFCIC8qIFBhZ2VDbGllbnRJbXBsLmggKi8sCiAJCQkJQkMxMTFCNEMxMTJGNjE5MjAwMzM3
QkFCIC8qIFBhZ2VDbGllbnRJbXBsLm1tICovLAorCQkJCUUxMzRGMDE1MTJFQTVEMTEwMDRFQzU4
RCAvKiBXS1ByaW50aW5nVmlldy5oICovLAorCQkJCUUxMzRGMDE5MTJFQTVEOTkwMDRFQzU4RCAv
KiBXS1ByaW50aW5nVmlldy5tbSAqLywKIAkJCQkxQTRBOUFBNjEyQjdFNzk2MDA4RkU5ODQgLyog
V0tUZXh0SW5wdXRXaW5kb3dDb250cm9sbGVyLmggKi8sCiAJCQkJMUE0QTlBQTcxMkI3RTc5NjAw
OEZFOTg0IC8qIFdLVGV4dElucHV0V2luZG93Q29udHJvbGxlci5tbSAqLywKIAkJCQlCQzg2OTlC
MjExNkFBREFBMDAyQTkyNUIgLyogV0tWaWV3LmggKi8sCkBAIC0zMDY5LDYgKzMwNzUsNyBAQAog
CQkJCUM1MTczODgxMTJERjhGNEYwMEVFM0Y0NyAvKiBEcmFnQ29udHJvbGxlckFjdGlvbi5oIGlu
IEhlYWRlcnMgKi8sCiAJCQkJMUFBMkU1MUQxMkU0QzA1RTAwQkM0OTY2IC8qIENHVXRpbGl0aWVz
LmggaW4gSGVhZGVycyAqLywKIAkJCQlDNTc0QTU4MTEyRTY2NjgxMDAyREZFOTggLyogUGFzdGVi
b2FyZFR5cGVzLmggaW4gSGVhZGVycyAqLywKKwkJCQlFMTM0RjAxNzEyRUE1RDMzMDA0RUM1OEQg
LyogV0tQcmludGluZ1ZpZXcuaCBpbiBIZWFkZXJzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JE
ZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwogCQl9OwpAQCAtMzUzMiw2ICszNTM5LDcgQEAK
IAkJCQkxQUEyRTUxRTEyRTRDMDVFMDBCQzQ5NjYgLyogQ0dVdGlsaXRpZXMuY3BwIGluIFNvdXJj
ZXMgKi8sCiAJCQkJQzU3NEEzNzcxMkU2MDk5RDAwMkRGRTk4IC8qIFdlYkRyYWdDbGllbnRNYWMu
bW0gaW4gU291cmNlcyAqLywKIAkJCQlDNTc0QTU4MjEyRTY2NjgxMDAyREZFOTggLyogUGFzdGVi
b2FyZFR5cGVzLm1tIGluIFNvdXJjZXMgKi8sCisJCQkJRTEzNEYwMUExMkVBNUQ5OTAwNEVDNThE
IC8qIFdLUHJpbnRpbmdWaWV3Lm1tIGluIFNvdXJjZXMgKi8sCiAJCQkpOwogCQkJcnVuT25seUZv
ckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CiAJCX07Cg==
</data>

          </attachment>
      

    </bug>

</bugzilla>