<?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>111153</bug_id>
          
          <creation_ts>2013-03-01 01:41:15 -0800</creation_ts>
          <short_desc>[BlackBerry] New files for BlackBerry::Platform::Graphics::GraphicsContext integration</short_desc>
          <delta_ts>2013-03-04 03:12:04 -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 BlackBerry</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>
          
          <blocked>73144</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Arvid Nilsson">anilsson</reporter>
          <assigned_to name="Arvid Nilsson">anilsson</assigned_to>
          <cc>berto</cc>
    
    <cc>cgarcia</cc>
    
    <cc>mifenton</cc>
    
    <cc>rwlbuis</cc>
    
    <cc>tonikitoo</cc>
    
    <cc>webkit.review.bot</cc>
    
    <cc>xan.lopez</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>844924</commentid>
    <comment_count>0</comment_count>
    <who name="Arvid Nilsson">anilsson</who>
    <bug_when>2013-03-01 01:41:15 -0800</bug_when>
    <thetext>See also bug #111072. Internal PR 293208</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>845301</commentid>
    <comment_count>1</comment_count>
      <attachid>190987</attachid>
    <who name="Arvid Nilsson">anilsson</who>
    <bug_when>2013-03-01 10:46:48 -0800</bug_when>
    <thetext>Created attachment 190987
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>845304</commentid>
    <comment_count>2</comment_count>
      <attachid>190987</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2013-03-01 10:51:52 -0800</bug_when>
    <thetext>Comment on attachment 190987
Patch

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

LGTM.

&gt; Source/WebCore/platform/graphics/blackberry/FontCacheBlackBerry.cpp:23
&gt; +

Nit: we do the amount of spacing between licensing and includes inconsistently. I personally would not do two, not zero, but likely one empty line.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>845324</commentid>
    <comment_count>3</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2013-03-01 11:07:59 -0800</bug_when>
    <thetext>Attachment 190987 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCore/platform/graphics/blackberry/FontBlackBerry.cpp&apos;, u&apos;Source/WebCore/platform/graphics/blackberry/FontCacheBlackBerry.cpp&apos;, u&apos;Source/WebCore/platform/graphics/blackberry/FontCustomPlatformData.h&apos;, u&apos;Source/WebCore/platform/graphics/blackberry/FontCustomPlatformDataBlackBerry.cpp&apos;, u&apos;Source/WebCore/platform/graphics/blackberry/FontPlatformDataBlackBerry.cpp&apos;, u&apos;Source/WebCore/platform/graphics/blackberry/GlyphPageTreeNodeBlackBerry.cpp&apos;, u&apos;Source/WebCore/platform/graphics/blackberry/GradientBlackBerry.cpp&apos;, u&apos;Source/WebCore/platform/graphics/blackberry/GraphicsContextBlackBerry.cpp&apos;, u&apos;Source/WebCore/platform/graphics/blackberry/ITypeUtils.h&apos;, u&apos;Source/WebCore/platform/graphics/blackberry/ImageBufferBlackBerry.cpp&apos;, u&apos;Source/WebCore/platform/graphics/blackberry/ImageBufferDataBlackBerry.h&apos;, u&apos;Source/WebCore/platform/graphics/blackberry/PathBlackBerry.cpp&apos;, u&apos;Source/WebCore/platform/graphics/blackberry/PatternBlackBerry.cpp&apos;, u&apos;Source/WebCore/platform/graphics/blackberry/PlatformSupport.cpp&apos;, u&apos;Source/WebCore/platform/graphics/blackberry/PlatformSupport.h&apos;, u&apos;Source/WebCore/platform/graphics/blackberry/SimpleFontDataBlackBerry.cpp&apos;]&quot; exit_code: 1
Source/WebCore/platform/graphics/blackberry/ImageBufferBlackBerry.cpp:289:  enum members should use InterCaps with an initial capital letter.  [readability/enum_casing] [4]
Source/WebCore/platform/graphics/blackberry/ImageBufferBlackBerry.cpp:290:  enum members should use InterCaps with an initial capital letter.  [readability/enum_casing] [4]
Source/WebCore/platform/graphics/blackberry/ImageBufferBlackBerry.cpp:291:  enum members should use InterCaps with an initial capital letter.  [readability/enum_casing] [4]
Source/WebCore/platform/graphics/blackberry/ImageBufferBlackBerry.cpp:292:  enum members should use InterCaps with an initial capital letter.  [readability/enum_casing] [4]
Source/WebCore/platform/graphics/blackberry/ImageBufferBlackBerry.cpp:293:  enum members should use InterCaps with an initial capital letter.  [readability/enum_casing] [4]
Source/WebCore/platform/graphics/blackberry/ImageBufferBlackBerry.cpp:295:  enum members should use InterCaps with an initial capital letter.  [readability/enum_casing] [4]
Source/WebCore/platform/graphics/blackberry/ImageBufferBlackBerry.cpp:296:  enum members should use InterCaps with an initial capital letter.  [readability/enum_casing] [4]
Source/WebCore/platform/graphics/blackberry/ImageBufferBlackBerry.cpp:297:  enum members should use InterCaps with an initial capital letter.  [readability/enum_casing] [4]
Source/WebCore/platform/graphics/blackberry/ImageBufferBlackBerry.cpp:301:  enum members should use InterCaps with an initial capital letter.  [readability/enum_casing] [4]
Source/WebCore/platform/graphics/blackberry/ImageBufferBlackBerry.cpp:303:  enum members should use InterCaps with an initial capital letter.  [readability/enum_casing] [4]
Source/WebCore/platform/graphics/blackberry/ImageBufferBlackBerry.cpp:306:  enum members should use InterCaps with an initial capital letter.  [readability/enum_casing] [4]
Source/WebCore/platform/graphics/blackberry/ImageBufferBlackBerry.cpp:307:  enum members should use InterCaps with an initial capital letter.  [readability/enum_casing] [4]
Source/WebCore/platform/graphics/blackberry/ImageBufferBlackBerry.cpp:309:  enum members should use InterCaps with an initial capital letter.  [readability/enum_casing] [4]
Total errors found: 13 in 17 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>846280</commentid>
    <comment_count>4</comment_count>
    <who name="Arvid Nilsson">anilsson</who>
    <bug_when>2013-03-04 03:03:53 -0800</bug_when>
    <thetext>(In reply to comment #3)
&gt; Attachment 190987 [details] did not pass style-queue:
&gt; 
&gt; Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCore/platform/graphics/blackberry/FontBlackBerry.cpp&apos;, u&apos;Source/WebCore/platform/graphics/blackberry/FontCacheBlackBerry.cpp&apos;, u&apos;Source/WebCore/platform/graphics/blackberry/FontCustomPlatformData.h&apos;, u&apos;Source/WebCore/platform/graphics/blackberry/FontCustomPlatformDataBlackBerry.cpp&apos;, u&apos;Source/WebCore/platform/graphics/blackberry/FontPlatformDataBlackBerry.cpp&apos;, u&apos;Source/WebCore/platform/graphics/blackberry/GlyphPageTreeNodeBlackBerry.cpp&apos;, u&apos;Source/WebCore/platform/graphics/blackberry/GradientBlackBerry.cpp&apos;, u&apos;Source/WebCore/platform/graphics/blackberry/GraphicsContextBlackBerry.cpp&apos;, u&apos;Source/WebCore/platform/graphics/blackberry/ITypeUtils.h&apos;, u&apos;Source/WebCore/platform/graphics/blackberry/ImageBufferBlackBerry.cpp&apos;, u&apos;Source/WebCore/platform/graphics/blackberry/ImageBufferDataBlackBerry.h&apos;, u&apos;Source/WebCore/platform/graphics/blackberry/PathBlackBerry.cpp&apos;, u&apos;Source/WebCore/platform/graphics/blackberry/PatternBlackBerry.cpp&apos;, u&apos;Source/WebCore/platform/graphics/blackberry/PlatformSupport.cpp&apos;, u&apos;Source/WebCore/platform/graphics/blackberry/PlatformSupport.h&apos;, u&apos;Source/WebCore/platform/graphics/blackberry/SimpleFontDataBlackBerry.cpp&apos;]&quot; exit_code: 1
&gt; Source/WebCore/platform/graphics/blackberry/ImageBufferBlackBerry.cpp:289:  enum members should use InterCaps with an initial capital letter.  [readability/enum_casing] [4]
&gt; Source/WebCore/platform/graphics/blackberry/ImageBufferBlackBerry.cpp:290:  enum members should use InterCaps with an initial capital letter.  [readability/enum_casing] [4]
&gt; Source/WebCore/platform/graphics/blackberry/ImageBufferBlackBerry.cpp:291:  enum members should use InterCaps with an initial capital letter.  [readability/enum_casing] [4]
&gt; Source/WebCore/platform/graphics/blackberry/ImageBufferBlackBerry.cpp:292:  enum members should use InterCaps with an initial capital letter.  [readability/enum_casing] [4]
&gt; Source/WebCore/platform/graphics/blackberry/ImageBufferBlackBerry.cpp:293:  enum members should use InterCaps with an initial capital letter.  [readability/enum_casing] [4]
&gt; Source/WebCore/platform/graphics/blackberry/ImageBufferBlackBerry.cpp:295:  enum members should use InterCaps with an initial capital letter.  [readability/enum_casing] [4]
&gt; Source/WebCore/platform/graphics/blackberry/ImageBufferBlackBerry.cpp:296:  enum members should use InterCaps with an initial capital letter.  [readability/enum_casing] [4]
&gt; Source/WebCore/platform/graphics/blackberry/ImageBufferBlackBerry.cpp:297:  enum members should use InterCaps with an initial capital letter.  [readability/enum_casing] [4]
&gt; Source/WebCore/platform/graphics/blackberry/ImageBufferBlackBerry.cpp:301:  enum members should use InterCaps with an initial capital letter.  [readability/enum_casing] [4]
&gt; Source/WebCore/platform/graphics/blackberry/ImageBufferBlackBerry.cpp:303:  enum members should use InterCaps with an initial capital letter.  [readability/enum_casing] [4]
&gt; Source/WebCore/platform/graphics/blackberry/ImageBufferBlackBerry.cpp:306:  enum members should use InterCaps with an initial capital letter.  [readability/enum_casing] [4]
&gt; Source/WebCore/platform/graphics/blackberry/ImageBufferBlackBerry.cpp:307:  enum members should use InterCaps with an initial capital letter.  [readability/enum_casing] [4]
&gt; Source/WebCore/platform/graphics/blackberry/ImageBufferBlackBerry.cpp:309:  enum members should use InterCaps with an initial capital letter.  [readability/enum_casing] [4]
&gt; Total errors found: 13 in 17 files
&gt; 
&gt; 
&gt; If any of these errors are false positives, please file a bug against check-webkit-style.

These are expected failures, we&apos;ll leave it as is.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>846281</commentid>
    <comment_count>5</comment_count>
    <who name="Arvid Nilsson">anilsson</who>
    <bug_when>2013-03-04 03:04:32 -0800</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 190987 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=190987&amp;action=review
&gt; 
&gt; LGTM.
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/blackberry/FontCacheBlackBerry.cpp:23
&gt; &gt; +
&gt; 
&gt; Nit: we do the amount of spacing between licensing and includes inconsistently. I personally would not do two, not zero, but likely one empty line.

I agree, but lets get this landed and then fix it up. Thanks for the review =)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>846290</commentid>
    <comment_count>6</comment_count>
      <attachid>190987</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2013-03-04 03:12:00 -0800</bug_when>
    <thetext>Comment on attachment 190987
Patch

Clearing flags on attachment: 190987

Committed r144612: &lt;http://trac.webkit.org/changeset/144612&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>846291</commentid>
    <comment_count>7</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2013-03-04 03:12:04 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>190987</attachid>
            <date>2013-03-01 10:46:48 -0800</date>
            <delta_ts>2013-03-04 03:12:00 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-111153-20130301194258.patch</filename>
            <type>text/plain</type>
            <size>111281</size>
            <attacher name="Arvid Nilsson">anilsson</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTQ0MjkxCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNzQ2NTM4OTM3ZWQxYWM1
NjYzZDM1MTA1MWM4ZGNjN2ExMjc0NWYwYS4uY2Q2OWMwNDdjNjY3NzRhM2U0YjliNzY1NWUxOGUy
ZjU0NWViYjA3MCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSw1ICsxLDI0MSBAQAogMjAxMy0wMy0wMSAgQXJ2
aWQgTmlsc3NvbiAgPGFuaWxzc29uQHJpbS5jb20+CiAKKyAgICAgICAgW0JsYWNrQmVycnldIE5l
dyBmaWxlcyBmb3IgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpHcmFwaGljc0NvbnRl
eHQgaW50ZWdyYXRpb24KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTExMTE1MworCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgIEJsYWNrQmVycnkgUFIgMjkzMjA4CisKKyAgICAgICAgVGhpcyBwYXRjaCBjb250YWlu
cyBjb250cmlidXRpb25zIGZyb20gbWFueSBtZW1iZXJzIG9mIHRoZSBCbGFja0JlcnJ5CisgICAg
ICAgIFdlYktpdCB0ZWFtOgorCisgICAgICAgIFJvYiBCdWlzCisgICAgICAgIFJvYmluIENhbwor
ICAgICAgICBFbGkgRmlkbGVyCisgICAgICAgIE1pa2UgTGF0dGFuemlvCisgICAgICAgIFlvbmcg
TGkKKyAgICAgICAgTWF4aW0gTW9naWxuaXRza3kKKyAgICAgICAgSm9zaHVhIE5ldHRlcmZpZWxk
CisgICAgICAgIEFydmlkIE5pbHNzb24KKyAgICAgICAgSmFrb2IgUGV0c292aXRzCisgICAgICAg
IEtvbnJhZCBQaWFzY2lrCisgICAgICAgIEplZmYgUm9nZXJzCisgICAgICAgIEFydGVtIFNpbW9u
b3YKKyAgICAgICAgRmlsaXAgU3BhY2VrCisgICAgICAgIEdlb3JnZSBTdGFpa29zCisKKyAgICAg
ICAgQ292ZXJlZCBieSBleGlzdGluZyB0ZXN0cy4KKworICAgICAgICAqIHBsYXRmb3JtL2dyYXBo
aWNzL2JsYWNrYmVycnkvRm9udEJsYWNrQmVycnkuY3BwOiBBZGRlZC4KKyAgICAgICAgKEZTRml4
ZWRUb0Zsb2F0KToKKyAgICAgICAgKEZsb2F0VG9GU0ZpeGVkKToKKyAgICAgICAgKFdlYkNvcmUp
OgorICAgICAgICAoV2ViQ29yZTo6Rm9udDo6ZHJhd0NvbXBsZXhUZXh0KToKKyAgICAgICAgKFdl
YkNvcmU6OkZvbnQ6OmZsb2F0V2lkdGhGb3JDb21wbGV4VGV4dCk6CisgICAgICAgIChXZWJDb3Jl
OjpGb250OjpvZmZzZXRGb3JQb3NpdGlvbkZvckNvbXBsZXhUZXh0KToKKyAgICAgICAgKFdlYkNv
cmU6OkZvbnQ6OnNlbGVjdGlvblJlY3RGb3JDb21wbGV4VGV4dCk6CisgICAgICAgIChXZWJDb3Jl
OjpGb250OjpkcmF3R2x5cGhzKToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnQ6OmNhblJldHVybkZh
bGxiYWNrRm9udHNGb3JDb21wbGV4VGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpGb250OjpkcmF3
RW1waGFzaXNNYXJrc0ZvckNvbXBsZXhUZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnQ6OmNh
bkV4cGFuZEFyb3VuZElkZW9ncmFwaHNJbkNvbXBsZXhUZXh0KToKKyAgICAgICAgKiBwbGF0Zm9y
bS9ncmFwaGljcy9ibGFja2JlcnJ5L0ZvbnRDYWNoZUJsYWNrQmVycnkuY3BwOiBBZGRlZC4KKyAg
ICAgICAgKFdlYkNvcmUpOgorICAgICAgICAoV2ViQ29yZTo6Rm9udENhY2hlOjpwbGF0Zm9ybUlu
aXQpOgorICAgICAgICAoV2ViQ29yZTo6Rm9udENhY2hlOjpnZXRGb250RGF0YUZvckNoYXJhY3Rl
cnMpOgorICAgICAgICAoV2ViQ29yZTo6Rm9udENhY2hlOjpnZXRTaW1pbGFyRm9udFBsYXRmb3Jt
RGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpGb250Q2FjaGU6OmdldExhc3RSZXNvcnRGYWxsYmFj
a0ZvbnQpOgorICAgICAgICAoV2ViQ29yZTo6Rm9udENhY2hlOjpnZXRUcmFpdHNJbkZhbWlseSk6
CisgICAgICAgIChXZWJDb3JlOjpnZXRGYW1pbHlOYW1lU3RyaW5nRnJvbUZvbnREZXNjcmlwdGlv
bkFuZEZhbWlseSk6CisgICAgICAgIChXZWJDb3JlOjpmb250V2VpZ2h0VG9Gb250Y29uZmlnV2Vp
Z2h0KToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRDYWNoZTo6Y3JlYXRlRm9udFBsYXRmb3JtRGF0
YSk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9Gb250Q3VzdG9tUGxh
dGZvcm1EYXRhLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAgIChGb250Q3Vz
dG9tUGxhdGZvcm1EYXRhKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5
L0ZvbnRDdXN0b21QbGF0Zm9ybURhdGFCbGFja0JlcnJ5LmNwcDogQWRkZWQuCisgICAgICAgIChX
ZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRDdXN0b21QbGF0Zm9ybURhdGE6OkZvbnRD
dXN0b21QbGF0Zm9ybURhdGEpOgorICAgICAgICAoV2ViQ29yZTo6Rm9udEN1c3RvbVBsYXRmb3Jt
RGF0YTo6fkZvbnRDdXN0b21QbGF0Zm9ybURhdGEpOgorICAgICAgICAoV2ViQ29yZTo6Rm9udEN1
c3RvbVBsYXRmb3JtRGF0YTo6Zm9udFBsYXRmb3JtRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpG
b250Q3VzdG9tUGxhdGZvcm1EYXRhOjpzdXBwb3J0c0Zvcm1hdCk6CisgICAgICAgIChXZWJDb3Jl
OjpjcmVhdGVGb250Q3VzdG9tUGxhdGZvcm1EYXRhKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFw
aGljcy9ibGFja2JlcnJ5L0ZvbnRQbGF0Zm9ybURhdGFCbGFja0JlcnJ5LmNwcDogQWRkZWQuCisg
ICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRQbGF0Zm9ybURhdGE6OkZv
bnRQbGF0Zm9ybURhdGEpOgorICAgICAgICAoV2ViQ29yZTo6Rm9udFBsYXRmb3JtRGF0YTo6fkZv
bnRQbGF0Zm9ybURhdGEpOgorICAgICAgICAoV2ViQ29yZTo6Rm9udFBsYXRmb3JtRGF0YTo6bmFt
ZSk6CisgICAgICAgIChXZWJDb3JlOjpGb250UGxhdGZvcm1EYXRhOjphcHBseVN0YXRlKToKKyAg
ICAgICAgKFdlYkNvcmU6OkZvbnRQbGF0Zm9ybURhdGE6OnBsYXRmb3JtRGF0YUluaXQpOgorICAg
ICAgICAoV2ViQ29yZTo6Rm9udFBsYXRmb3JtRGF0YTo6cGxhdGZvcm1EYXRhQXNzaWduKToKKyAg
ICAgICAgKFdlYkNvcmU6OkZvbnRQbGF0Zm9ybURhdGE6OnBsYXRmb3JtSXNFcXVhbCk6CisgICAg
ICAgIChXZWJDb3JlOjpGb250UGxhdGZvcm1EYXRhOjpkZXNjcmlwdGlvbik6CisgICAgICAgIChX
ZWJDb3JlOjpGb250UGxhdGZvcm1EYXRhOjpoYXJmYnV6ekZhY2UpOgorICAgICAgICAoV2ViQ29y
ZTo6Rm9udFBsYXRmb3JtRGF0YTo6c2NhbGVkRm9udCk6CisgICAgICAgIChXZWJDb3JlOjpGb250
UGxhdGZvcm1EYXRhOjpzZXRGYWtlQm9sZCk6CisgICAgICAgIChXZWJDb3JlOjpGb250UGxhdGZv
cm1EYXRhOjpzZXRGYWtlSXRhbGljKToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRQbGF0Zm9ybURh
dGE6OnBsYXRmb3JtRm9udEhhbmRsZSk6CisgICAgICAgIChXZWJDb3JlOjpGb250UGxhdGZvcm1E
YXRhOjppc0ZpeGVkUGl0Y2gpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVy
cnkvR2x5cGhQYWdlVHJlZU5vZGVCbGFja0JlcnJ5LmNwcDogQWRkZWQuCisgICAgICAgIChXZWJD
b3JlKToKKyAgICAgICAgKFdvcmxkVHlwZVNjb3BlZFB0cik6CisgICAgICAgIChXZWJDb3JlOjpX
b3JsZFR5cGVTY29wZWRQdHI6OldvcmxkVHlwZVNjb3BlZFB0cik6CisgICAgICAgIChXZWJDb3Jl
OjpXb3JsZFR5cGVTY29wZWRQdHI6On5Xb3JsZFR5cGVTY29wZWRQdHIpOgorICAgICAgICAoV2Vi
Q29yZTo6V29ybGRUeXBlU2NvcGVkUHRyOjpnZXQpOgorICAgICAgICAoV2ViQ29yZTo6R2x5cGhQ
YWdlOjpmaWxsKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L0dyYWRp
ZW50QmxhY2tCZXJyeS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAgIChX
ZWJDb3JlOjp0b3RhbFN0b3BzTmVlZGVkKToKKyAgICAgICAgKFdlYkNvcmU6OmZpbGxTdG9wcyk6
CisgICAgICAgIChXZWJDb3JlOjpHcmFkaWVudDo6cGxhdGZvcm1HcmFkaWVudCk6CisgICAgICAg
IChXZWJDb3JlOjpHcmFkaWVudDo6cGxhdGZvcm1EZXN0cm95KToKKyAgICAgICAgKFdlYkNvcmU6
OkdyYWRpZW50OjpmaWxsKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYWRpZW50OjpzZXRQbGF0Zm9y
bUdyYWRpZW50U3BhY2VUcmFuc2Zvcm0pOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Js
YWNrYmVycnkvR3JhcGhpY3NDb250ZXh0QmxhY2tCZXJyeS5jcHA6IEFkZGVkLgorICAgICAgICAo
V2ViQ29yZSk6CisgICAgICAgIChHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUpOgorICAg
ICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlOjpHcmFwaGljc0Nv
bnRleHRQbGF0Zm9ybVByaXZhdGUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0
OjpwbGF0Zm9ybUluaXQpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpwbGF0
Zm9ybURlc3Ryb3kpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpwbGF0Zm9y
bUNvbnRleHQpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpzYXZlUGxhdGZv
cm1TdGF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OnJlc3RvcmVQbGF0
Zm9ybVN0YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6c2V0SXNBY2Nl
bGVyYXRlZENvbnRleHQpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0Ojppc0Fj
Y2VsZXJhdGVkQ29udGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6Omdl
dENUTSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OmNvbmNhdENUTSk6Cisg
ICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OnNldENUTSk6CisgICAgICAgIChXZWJD
b3JlOjpHcmFwaGljc0NvbnRleHQ6OnNjYWxlKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNz
Q29udGV4dDo6cm90YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6dHJh
bnNsYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6ZHJhd0VsbGlwc2Up
OgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpzdHJva2VBcmMpOgorICAgICAg
ICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpkcmF3Q29udmV4UG9seWdvbik6CisgICAgICAg
IChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OmRyYXdSZWN0KToKKyAgICAgICAgKFdlYkNvcmU6
OkdyYXBoaWNzQ29udGV4dDo6ZmlsbFJlY3QpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3ND
b250ZXh0OjpjbGVhclJlY3QpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0Ojpz
dHJva2VSZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6ZmlsbFJvdW5k
ZWRSZWN0KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6cm91bmRUb0Rldmlj
ZVBpeGVscyk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OnNldFBsYXRmb3Jt
U2hhZG93KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6Y2xlYXJQbGF0Zm9y
bVNoYWRvdyk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OmJlZ2luUGxhdGZv
cm1UcmFuc3BhcmVuY3lMYXllcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6
OmVuZFBsYXRmb3JtVHJhbnNwYXJlbmN5TGF5ZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhp
Y3NDb250ZXh0OjpzdXBwb3J0c1RyYW5zcGFyZW5jeUxheWVycyk6CisgICAgICAgIChXZWJDb3Jl
OjpHcmFwaGljc0NvbnRleHQ6OnNldExpbmVDYXApOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhp
Y3NDb250ZXh0OjpzZXRMaW5lRGFzaCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRl
eHQ6OnNldExpbmVKb2luKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6c2V0
TWl0ZXJMaW1pdCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OnNldEFscGhh
KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6Y2xpcCk6CisgICAgICAgIChX
ZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OmNsaXBPdXQpOgorICAgICAgICAoV2ViQ29yZTo6R3Jh
cGhpY3NDb250ZXh0OjpjbGlwQ29udmV4UG9seWdvbik6CisgICAgICAgIChXZWJDb3JlOjpHcmFw
aGljc0NvbnRleHQ6OmFkZFJvdW5kZWRSZWN0Q2xpcCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFw
aGljc0NvbnRleHQ6OmNsaXBPdXRSb3VuZGVkUmVjdCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFw
aGljc0NvbnRleHQ6OmNsaXBCb3VuZHMpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250
ZXh0OjphZGRJbm5lclJvdW5kZWRSZWN0Q2xpcCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGlj
c0NvbnRleHQ6OnNldFVSTEZvclJlY3QpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250
ZXh0OjpzZXRQbGF0Zm9ybVRleHREcmF3aW5nTW9kZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFw
aGljc0NvbnRleHQ6OnNldFBsYXRmb3JtU3Ryb2tlQ29sb3IpOgorICAgICAgICAoV2ViQ29yZTo6
R3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybVN0cm9rZVN0eWxlKToKKyAgICAgICAgKFdlYkNv
cmU6OkdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZvcm1TdHJva2VUaGlja25lc3MpOgorICAgICAg
ICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybUZpbGxDb2xvcik6CisgICAg
ICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OnNldFBsYXRmb3JtQ29tcG9zaXRlT3BlcmF0
aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZvcm1TaG91
bGRBbnRpYWxpYXMpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpzZXRJbWFn
ZUludGVycG9sYXRpb25RdWFsaXR5KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4
dDo6aW1hZ2VJbnRlcnBvbGF0aW9uUXVhbGl0eSk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhp
Y3MvYmxhY2tiZXJyeS9JVHlwZVV0aWxzLmg6IEFkZGVkLgorICAgICAgICAoZmxvYXRUb0lUeXBl
Rml4ZWQpOgorICAgICAgICAoaW50VG9JVHlwZUZpeGVkKToKKyAgICAgICAgKGlUeXBlRml4ZWRU
b0Zsb2F0KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L0ltYWdlQnVm
ZmVyQmxhY2tCZXJyeS5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAgIChX
ZWJDb3JlOjptYWtlQnVmZmVyQ3VycmVudCk6CisgICAgICAgIChXZWJDb3JlOjpnZXRJbWFnZURh
dGFJbnRlcm5hbCk6CisgICAgICAgIChXZWJDb3JlOjpJbWFnZUJ1ZmZlckRhdGE6OmdldEltYWdl
RGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpmbHVzaEFuZERyYXcpOgorICAgICAgICAoV2ViQ29y
ZTo6SW1hZ2VCdWZmZXJEYXRhOjpkcmF3KToKKyAgICAgICAgKFdlYkNvcmU6OkltYWdlQnVmZmVy
OjpJbWFnZUJ1ZmZlcik6CisgICAgICAgIChXZWJDb3JlOjpJbWFnZUJ1ZmZlcjo6fkltYWdlQnVm
ZmVyKToKKyAgICAgICAgKFdlYkNvcmU6OkltYWdlQnVmZmVyOjpjb250ZXh0KToKKyAgICAgICAg
KFdlYkNvcmU6OkltYWdlQnVmZmVyOjpwbGF0Zm9ybUxheWVyKToKKyAgICAgICAgKFdlYkNvcmU6
OkltYWdlQnVmZmVyOjpjb3B5SW1hZ2UpOgorICAgICAgICAoV2ViQ29yZTo6SW1hZ2VCdWZmZXI6
OmNsaXApOgorICAgICAgICAoV2ViQ29yZTo6SW1hZ2VCdWZmZXI6OmRyYXcpOgorICAgICAgICAo
V2ViQ29yZTo6SW1hZ2VCdWZmZXI6OmRyYXdQYXR0ZXJuKToKKyAgICAgICAgKFdlYkNvcmU6Oklt
YWdlQnVmZmVyOjpwbGF0Zm9ybVRyYW5zZm9ybUNvbG9yU3BhY2UpOgorICAgICAgICAoV2ViQ29y
ZTo6SW1hZ2VCdWZmZXI6OmdldFVubXVsdGlwbGllZEltYWdlRGF0YSk6CisgICAgICAgIChXZWJD
b3JlOjpJbWFnZUJ1ZmZlcjo6Z2V0UHJlbXVsdGlwbGllZEltYWdlRGF0YSk6CisgICAgICAgIChX
ZWJDb3JlOjpJbWFnZUJ1ZmZlcjo6cHV0Qnl0ZUFycmF5KToKKyAgICAgICAgKFdlYkNvcmU6Oklt
YWdlQnVmZmVyOjp0b0RhdGFVUkwpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2JsYWNr
YmVycnkvSW1hZ2VCdWZmZXJEYXRhQmxhY2tCZXJyeS5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNv
cmUpOgorICAgICAgICAoSW1hZ2VCdWZmZXJEYXRhKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFw
aGljcy9ibGFja2JlcnJ5L1BhdGhCbGFja0JlcnJ5LmNwcDogQWRkZWQuCisgICAgICAgIChXZWJD
b3JlKToKKyAgICAgICAgKFdlYkNvcmU6OnNjcmF0Y2hDb250ZXh0KToKKyAgICAgICAgKFdlYkNv
cmU6OlBhdGg6OlBhdGgpOgorICAgICAgICAoV2ViQ29yZTo6UGF0aDo6flBhdGgpOgorICAgICAg
ICAoV2ViQ29yZTo6UGF0aDo6b3BlcmF0b3I9KToKKyAgICAgICAgKFdlYkNvcmU6OlBhdGg6OmN1
cnJlbnRQb2ludCk6CisgICAgICAgIChXZWJDb3JlOjpQYXRoOjpjb250YWlucyk6CisgICAgICAg
IChXZWJDb3JlOjpQYXRoOjpzdHJva2VDb250YWlucyk6CisgICAgICAgIChXZWJDb3JlOjpQYXRo
Ojp0cmFuc2xhdGUpOgorICAgICAgICAoV2ViQ29yZTo6UGF0aDo6Ym91bmRpbmdSZWN0KToKKyAg
ICAgICAgKFdlYkNvcmU6OlBhdGg6OnN0cm9rZUJvdW5kaW5nUmVjdCk6CisgICAgICAgIChXZWJD
b3JlOjpQYXRoOjptb3ZlVG8pOgorICAgICAgICAoV2ViQ29yZTo6UGF0aDo6YWRkTGluZVRvKToK
KyAgICAgICAgKFdlYkNvcmU6OlBhdGg6OmFkZFF1YWRDdXJ2ZVRvKToKKyAgICAgICAgKFdlYkNv
cmU6OlBhdGg6OmFkZEJlemllckN1cnZlVG8pOgorICAgICAgICAoV2ViQ29yZTo6UGF0aDo6YWRk
QXJjVG8pOgorICAgICAgICAoV2ViQ29yZTo6UGF0aDo6Y2xvc2VTdWJwYXRoKToKKyAgICAgICAg
KFdlYkNvcmU6OlBhdGg6OmFkZEFyYyk6CisgICAgICAgIChXZWJDb3JlOjpQYXRoOjphZGRSZWN0
KToKKyAgICAgICAgKFdlYkNvcmU6OlBhdGg6OmFkZEVsbGlwc2UpOgorICAgICAgICAoV2ViQ29y
ZTo6UGF0aDo6cGxhdGZvcm1BZGRQYXRoRm9yUm91bmRlZFJlY3QpOgorICAgICAgICAoV2ViQ29y
ZTo6UGF0aDo6Y2xlYXIpOgorICAgICAgICAoV2ViQ29yZTo6UGF0aDo6aXNFbXB0eSk6CisgICAg
ICAgIChXZWJDb3JlOjpQYXRoOjpoYXNDdXJyZW50UG9pbnQpOgorICAgICAgICAoV2ViQ29yZTo6
UGF0aDo6YXBwbHkpOgorICAgICAgICAoV2ViQ29yZTo6UGF0aDo6dHJhbnNmb3JtKToKKyAgICAg
ICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6ZmlsbFBhdGgpOgorICAgICAgICAoV2ViQ29y
ZTo6R3JhcGhpY3NDb250ZXh0OjpzdHJva2VQYXRoKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBo
aWNzQ29udGV4dDo6ZHJhd0ZvY3VzUmluZyk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0Nv
bnRleHQ6OmRyYXdMaW5lKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDo6ZHJh
d0xpbmVGb3JEb2N1bWVudE1hcmtlcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRl
eHQ6OmRyYXdMaW5lRm9yVGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6
OmNsaXApOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpjbGlwUGF0aCk6Cisg
ICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQ6OmNhbnZhc0NsaXApOgorICAgICAgICAo
V2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpjbGlwT3V0KToKKyAgICAgICAgKiBwbGF0Zm9ybS9n
cmFwaGljcy9ibGFja2JlcnJ5L1BhdHRlcm5CbGFja0JlcnJ5LmNwcDogQWRkZWQuCisgICAgICAg
IChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OlBhdHRlcm46OnBsYXRmb3JtRGVzdHJveSk6
CisgICAgICAgIChXZWJDb3JlOjpQYXR0ZXJuOjpwbGF0Zm9ybVBhdHRlcm4pOgorICAgICAgICAo
V2ViQ29yZTo6UGF0dGVybjo6c2V0UGxhdGZvcm1QYXR0ZXJuU3BhY2VUcmFuc2Zvcm0pOgorICAg
ICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvUGxhdGZvcm1TdXBwb3J0LmNwcDog
QWRkZWQuCisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OlBsYXRmb3JtU3Vw
cG9ydDo6Z2V0Rm9udEZhbWlseUZvckNoYXJhY3RlcnMpOgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL2JsYWNrYmVycnkvUGxhdGZvcm1TdXBwb3J0Lmg6IEFkZGVkLgorICAgICAgICAoV2Vi
Q29yZSk6CisgICAgICAgIChQbGF0Zm9ybVN1cHBvcnQpOgorICAgICAgICAoRm9udEZhbWlseSk6
CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9TaW1wbGVGb250RGF0YUJs
YWNrQmVycnkuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAoV2ViQ29y
ZTo6RlNGaXhlZFRvRmxvYXQpOgorICAgICAgICAoV2ViQ29yZTo6U2ltcGxlRm9udERhdGE6OnBs
YXRmb3JtSW5pdCk6CisgICAgICAgIChXZWJDb3JlOjpTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1D
aGFyV2lkdGhJbml0KToKKyAgICAgICAgKFdlYkNvcmU6OlNpbXBsZUZvbnREYXRhOjpwbGF0Zm9y
bURlc3Ryb3kpOgorICAgICAgICAoV2ViQ29yZTo6U2ltcGxlRm9udERhdGE6OmNyZWF0ZVNjYWxl
ZEZvbnREYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OlNpbXBsZUZvbnREYXRhOjpzbWFsbENhcHNG
b250RGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpTaW1wbGVGb250RGF0YTo6ZW1waGFzaXNNYXJr
Rm9udERhdGEpOgorICAgICAgICAoV2ViQ29yZTo6U2ltcGxlRm9udERhdGE6OmNvbnRhaW5zQ2hh
cmFjdGVycyk6CisgICAgICAgIChXZWJDb3JlOjpTaW1wbGVGb250RGF0YTo6ZGV0ZXJtaW5lUGl0
Y2gpOgorICAgICAgICAoV2ViQ29yZTo6U2ltcGxlRm9udERhdGE6OnBsYXRmb3JtQm91bmRzRm9y
R2x5cGgpOgorICAgICAgICAoV2ViQ29yZTo6U2ltcGxlRm9udERhdGE6OnBsYXRmb3JtV2lkdGhG
b3JHbHlwaCk6CisgICAgICAgIChXZWJDb3JlOjpTaW1wbGVGb250RGF0YTo6Y2FuUmVuZGVyQ29t
YmluaW5nQ2hhcmFjdGVyU2VxdWVuY2UpOgorCisyMDEzLTAzLTAxICBBcnZpZCBOaWxzc29uICA8
YW5pbHNzb25AcmltLmNvbT4KKwogICAgICAgICBbQmxhY2tCZXJyeV0gVXBzdHJlYW0gQmxhY2tC
ZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpHcmFwaGljc0NvbnRleHQgaW50ZWdyYXRpb24gcmVs
YXRlZCBjaGFuZ2VzIGluIHBsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkKICAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTExMTA3MgogCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L0ZvbnRCbGFja0Jl
cnJ5LmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvRm9u
dEJsYWNrQmVycnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmYwNjdhNDBlYWU5ZTZmN2Q1NTQzNjY4MmM4N2Mx
YmY2ZjRiZDZiMWYKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9ibGFja2JlcnJ5L0ZvbnRCbGFja0JlcnJ5LmNwcApAQCAtMCwwICsxLDE1OSBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiwgMjAxMyBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRl
ZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0
d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIg
dGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFz
IHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZl
cnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVy
c2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhh
dCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91
dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdl
bmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxk
IGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisg
KiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBG
cmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZp
ZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworI2luY2x1ZGUgImNv
bmZpZy5oIgorI2luY2x1ZGUgIkZvbnQuaCIKKworI2luY2x1ZGUgIkFmZmluZVRyYW5zZm9ybS5o
IgorI2luY2x1ZGUgIkZsb2F0UG9pbnQuaCIKKyNpbmNsdWRlICJGbG9hdFJlY3QuaCIKKyNpbmNs
dWRlICJGb250Q2FjaGUuaCIKKyNpbmNsdWRlICJHbHlwaEJ1ZmZlci5oIgorI2luY2x1ZGUgIkdy
YXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIkhhcmZCdXp6U2hhcGVyLmgiCisjaW5jbHVkZSAi
U2hhZG93Qmx1ci5oIgorI2luY2x1ZGUgIlRleHRSdW4uaCIKKworI2luY2x1ZGUgPEJsYWNrQmVy
cnlQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dC5oPgorCisjaW5jbHVkZSA8ZnNfYXBpLmg+CisjaW5j
bHVkZSA8d3RmL01hdGhFeHRyYXMuaD4KKworc3RhdGljIGlubGluZSBmbG9hdCBGU0ZpeGVkVG9G
bG9hdChGU19GSVhFRCBuKSB7IHJldHVybiBuIC8gNjU1MzYuMDsgfQorc3RhdGljIGlubGluZSBG
U19GSVhFRCBGbG9hdFRvRlNGaXhlZChmbG9hdCBuKSB7IHJldHVybiBzdGF0aWNfY2FzdDxGU19G
SVhFRD4obiAqIDY1NTM2KTsgfQorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3ZvaWQgRm9udDo6
ZHJhd0NvbXBsZXhUZXh0KEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgY29uc3QgVGV4dFJ1biYg
cnVuLCBjb25zdCBGbG9hdFBvaW50JiBwb2ludCwgaW50IGZyb20sIGludCB0bykgY29uc3QKK3sK
KyAgICBpZiAoIXJ1bi5sZW5ndGgoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgR2x5cGhCdWZm
ZXIgZ2x5cGhCdWZmZXI7CisgICAgSGFyZkJ1enpTaGFwZXIgc2hhcGVyKHRoaXMsIHJ1bik7Cisg
ICAgc2hhcGVyLnNldERyYXdSYW5nZShmcm9tLCB0byk7CisgICAgaWYgKCFzaGFwZXIuc2hhcGUo
JmdseXBoQnVmZmVyKSkKKyAgICAgICAgcmV0dXJuOworICAgIEZsb2F0UG9pbnQgYWRqdXN0ZWRQ
b2ludCA9IHNoYXBlci5hZGp1c3RTdGFydFBvaW50KHBvaW50KTsKKworICAgIGRyYXdHbHlwaEJ1
ZmZlcihjb250ZXh0LCBydW4sIGdseXBoQnVmZmVyLCBhZGp1c3RlZFBvaW50KTsKK30KKworZmxv
YXQgRm9udDo6ZmxvYXRXaWR0aEZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgSGFz
aFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+KiAvKiBmYWxsYmFja0ZvbnRzICovLCBHbHlwaE92
ZXJmbG93KiAvKiBnbHlwaE92ZXJmbG93ICovKSBjb25zdAoreworICAgIEhhcmZCdXp6U2hhcGVy
IHNoYXBlcih0aGlzLCBydW4pOworICAgIGlmICghc2hhcGVyLnNoYXBlKCkpCisgICAgICAgIHJl
dHVybiAwOworICAgIHJldHVybiBzaGFwZXIudG90YWxXaWR0aCgpOworfQorCisvLyBSZXR1cm4g
dGhlIGNvZGUgcG9pbnQgaW5kZXggZm9yIHRoZSBnaXZlbiB8eHwgb2Zmc2V0IGludG8gdGhlIHRl
eHQgcnVuLgoraW50IEZvbnQ6Om9mZnNldEZvclBvc2l0aW9uRm9yQ29tcGxleFRleHQoY29uc3Qg
VGV4dFJ1biYgcnVuLCBmbG9hdCBwb3NpdGlvbiwgYm9vbCBpbmNsdWRlUGFydGlhbEdseXBocykg
Y29uc3QKK3sKKyAgICAvLyBGSVhNRTogVGhpcyB0cnVuY2F0aW9uIGlzIG5vdCBhIHByb2JsZW0g
Zm9yIEhUTUwsIGJ1dCBvbmx5IGFmZmVjdHMgU1ZHLCB3aGljaCBwYXNzZXMgZmxvYXRpbmctcG9p
bnQgbnVtYmVycworICAgIC8vIHRvIEZvbnQ6Om9mZnNldEZvclBvc2l0aW9uKCkuIEJ1ZyBodHRw
Oi8vd2Via2l0Lm9yZy9iLzQwNjczIHRyYWNrcyBmaXhpbmcgdGhpcyBwcm9ibGVtLgorICAgIGlu
dCB0YXJnZXRYID0gc3RhdGljX2Nhc3Q8aW50Pihwb3NpdGlvbik7CisKKyAgICBIYXJmQnV6elNo
YXBlciBzaGFwZXIodGhpcywgcnVuKTsKKyAgICBpZiAoIXNoYXBlci5zaGFwZSgpKQorICAgICAg
ICByZXR1cm4gMDsKKyAgICByZXR1cm4gc2hhcGVyLm9mZnNldEZvclBvc2l0aW9uKHRhcmdldFgp
OworfQorCitGbG9hdFJlY3QgRm9udDo6c2VsZWN0aW9uUmVjdEZvckNvbXBsZXhUZXh0KGNvbnN0
IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQsIGludCBoZWlnaHQsIGludCBm
cm9tLCBpbnQgdG8pIGNvbnN0Cit7CisgICAgSGFyZkJ1enpTaGFwZXIgc2hhcGVyKHRoaXMsIHJ1
bik7CisgICAgaWYgKCFzaGFwZXIuc2hhcGUoKSkKKyAgICAgICAgcmV0dXJuIEZsb2F0UmVjdCgp
OworICAgIHJldHVybiBzaGFwZXIuc2VsZWN0aW9uUmVjdChwb2ludCwgaGVpZ2h0LCBmcm9tLCB0
byk7Cit9CisKK3ZvaWQgRm9udDo6ZHJhd0dseXBocyhHcmFwaGljc0NvbnRleHQqIGNvbnRleHQs
IGNvbnN0IFNpbXBsZUZvbnREYXRhKiBmb250LCBjb25zdCBHbHlwaEJ1ZmZlciYgZ2x5cGhCdWZm
ZXIsIGludCBmcm9tLCBpbnQgbnVtR2x5cGhzLCBjb25zdCBGbG9hdFBvaW50JiBwb2ludCkgY29u
c3QKK3sKKyAgICBGU19TVEFURSogaVR5cGUgPSBmb250LT5wbGF0Zm9ybURhdGEoKS5zY2FsZWRG
b250KGNvbnRleHQtPmdldENUTSgpLnlTY2FsZSgpKTsKKyAgICBpZiAoIWlUeXBlKQorICAgICAg
ICByZXR1cm47CisKKyAgICBGbG9hdFBvaW50IGFkanVzdGVkUG9pbnQgPSBwb2ludDsKKworICAg
IGlmIChmb250LT5wbGF0Zm9ybURhdGEoKS5vcmllbnRhdGlvbigpID09IFZlcnRpY2FsKQorICAg
ICAgICBhZGp1c3RlZFBvaW50Lm1vdmUoLShmb250LT5mb250TWV0cmljcygpLmZsb2F0QXNjZW50
KElkZW9ncmFwaGljQmFzZWxpbmUpIC0gZm9udC0+Zm9udE1ldHJpY3MoKS5mbG9hdEFzY2VudCgp
KSwgMCk7CisKKyAgICBib29sIHNvZnR3YXJlQmx1clJlcXVpcmVkID0gY29udGV4dC0+c3RhdGUo
KS5zaGFkb3dCbHVyIC8gZm9udC0+Zm9udE1ldHJpY3MoKS54SGVpZ2h0KCkgPiAwLjU7CisKKyAg
ICBGbG9hdFNpemUgY3VycmVudFNoYWRvd09mZnNldDsKKyAgICBmbG9hdCBjdXJyZW50U2hhZG93
Qmx1cjsKKyAgICBDb2xvciBjdXJyZW50U2hhZG93Q29sb3I7CisgICAgQ29sb3JTcGFjZSBjdXJy
ZW50Q29sb3JTcGFjZTsKKworICAgIC8vIElmIHdlIGhhdmUgYSBzaGFkb3cgYmx1ciwgYW5kIGl0
IGlzIHRvbyBiaWcgdG8gYXBwbHkgYXQgdGV4dC1yZW5kZXIgdGltZSwgd2UgbXVzdCByZW5kZXIg
aXQgbm93LgorICAgIGlmIChjb250ZXh0LT5oYXNTaGFkb3coKSAmJiBzb2Z0d2FyZUJsdXJSZXF1
aXJlZCkgeworICAgICAgICBjb250ZXh0LT5nZXRTaGFkb3coY3VycmVudFNoYWRvd09mZnNldCwg
Y3VycmVudFNoYWRvd0JsdXIsIGN1cnJlbnRTaGFkb3dDb2xvciwgY3VycmVudENvbG9yU3BhY2Up
OworCisgICAgICAgIGNvbnN0IEdyYXBoaWNzQ29udGV4dFN0YXRlIHN0YXRlID0gY29udGV4dC0+
c3RhdGUoKTsKKyAgICAgICAgRmxvYXRTaXplIG9mZnNldCA9IHN0YXRlLnNoYWRvd09mZnNldDsK
KyAgICAgICAgaWYgKHN0YXRlLnNoYWRvd3NJZ25vcmVUcmFuc2Zvcm1zKQorICAgICAgICAgICAg
b2Zmc2V0LnNldEhlaWdodCgtb2Zmc2V0LmhlaWdodCgpKTsKKyAgICAgICAgU2hhZG93Qmx1ciBz
aGFkb3coRmxvYXRTaXplKHN0YXRlLnNoYWRvd0JsdXIsIHN0YXRlLnNoYWRvd0JsdXIpLCBvZmZz
ZXQsIHN0YXRlLnNoYWRvd0NvbG9yLCBzdGF0ZS5zaGFkb3dDb2xvclNwYWNlKTsKKyAgICAgICAg
RmxvYXRQb2ludCBtaW5Qb2ludChhZGp1c3RlZFBvaW50LngoKSwgYWRqdXN0ZWRQb2ludC55KCkg
LSBmb250TWV0cmljcygpLmFzY2VudCgpKTsKKyAgICAgICAgRmxvYXRQb2ludCBtYXhQb2ludChh
ZGp1c3RlZFBvaW50LngoKSwgYWRqdXN0ZWRQb2ludC55KCkgKyBmb250TWV0cmljcygpLmRlc2Nl
bnQoKSk7CisgICAgICAgIEZsb2F0UG9pbnQgY3VycmVudFBvaW50ID0gYWRqdXN0ZWRQb2ludDsK
KyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1HbHlwaHM7ICsraSkgeworICAgICAgICAg
ICAgY3VycmVudFBvaW50ICs9ICpnbHlwaEJ1ZmZlci5hZHZhbmNlcyhmcm9tICsgaSk7CisgICAg
ICAgICAgICBtaW5Qb2ludC5zZXRYKHN0ZDo6bWluKG1pblBvaW50LngoKSwgY3VycmVudFBvaW50
LngoKSkpOworICAgICAgICAgICAgbWluUG9pbnQuc2V0WShzdGQ6Om1pbihtaW5Qb2ludC55KCks
IGN1cnJlbnRQb2ludC55KCkpKTsKKyAgICAgICAgICAgIG1heFBvaW50ID0gbWF4UG9pbnQuZXhw
YW5kZWRUbyhjdXJyZW50UG9pbnQpOworICAgICAgICB9CisgICAgICAgIGNvbnN0IEZsb2F0UmVj
dCBib3VuZGluZ1JlY3QobWluUG9pbnQueCgpLCBtaW5Qb2ludC55KCksIG1heFBvaW50LngoKSAt
IG1pblBvaW50LngoKSwgbWF4UG9pbnQueSgpIC0gbWluUG9pbnQueSgpKTsKKyAgICAgICAgR3Jh
cGhpY3NDb250ZXh0KiBzaGFkb3dDb250ZXh0ID0gc2hhZG93LmJlZ2luU2hhZG93TGF5ZXIoY29u
dGV4dCwgYm91bmRpbmdSZWN0KTsKKyAgICAgICAgaWYgKHNoYWRvd0NvbnRleHQpIHsKKyAgICAg
ICAgICAgIGlUeXBlID0gZm9udC0+cGxhdGZvcm1EYXRhKCkuc2NhbGVkRm9udChzaGFkb3dDb250
ZXh0LT5nZXRDVE0oKS55U2NhbGUoKSk7CisgICAgICAgICAgICBzaGFkb3dDb250ZXh0LT5wbGF0
Zm9ybUNvbnRleHQoKS0+YWRkR2x5cGhzKGdseXBoQnVmZmVyLmdseXBocyhmcm9tKSwKKyAgICAg
ICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpG
bG9hdFNpemUqPihnbHlwaEJ1ZmZlci5hZHZhbmNlcyhmcm9tKSksCisgICAgICAgICAgICAgICAg
bnVtR2x5cGhzLCBhZGp1c3RlZFBvaW50LCBpVHlwZSwgMCwgMCk7CisgICAgICAgICAgICBpVHlw
ZSA9IGZvbnQtPnBsYXRmb3JtRGF0YSgpLnNjYWxlZEZvbnQoY29udGV4dC0+Z2V0Q1RNKCkueVNj
YWxlKCkpOworICAgICAgICAgICAgc2hhZG93LmVuZFNoYWRvd0xheWVyKGNvbnRleHQpOworICAg
ICAgICB9CisgICAgICAgIGNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLT5jbGVhclNoYWRvdygp
OworICAgIH0KKworICAgIGNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLT5hZGRHbHlwaHMoZ2x5
cGhCdWZmZXIuZ2x5cGhzKGZyb20pLAorICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IEJs
YWNrQmVycnk6OlBsYXRmb3JtOjpGbG9hdFNpemUqPihnbHlwaEJ1ZmZlci5hZHZhbmNlcyhmcm9t
KSksCisgICAgICAgIG51bUdseXBocywgYWRqdXN0ZWRQb2ludCwgaVR5cGUsCisgICAgICAgIGNv
bnRleHQtPmZpbGxHcmFkaWVudCgpID8gY29udGV4dC0+ZmlsbEdyYWRpZW50KCktPnBsYXRmb3Jt
R3JhZGllbnQoKSA6IChjb250ZXh0LT5maWxsUGF0dGVybigpID8gY29udGV4dC0+ZmlsbFBhdHRl
cm4oKS0+cGxhdGZvcm1QYXR0ZXJuKEFmZmluZVRyYW5zZm9ybSgpKSA6IHN0YXRpY19jYXN0PEJs
YWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6UGFpbnQqPigwKSksCisgICAgICAgIGNvbnRl
eHQtPnN0cm9rZUdyYWRpZW50KCkgPyBjb250ZXh0LT5zdHJva2VHcmFkaWVudCgpLT5wbGF0Zm9y
bUdyYWRpZW50KCkgOiAoY29udGV4dC0+c3Ryb2tlUGF0dGVybigpID8gY29udGV4dC0+c3Ryb2tl
UGF0dGVybigpLT5wbGF0Zm9ybVBhdHRlcm4oQWZmaW5lVHJhbnNmb3JtKCkpIDogc3RhdGljX2Nh
c3Q8QmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpQYWludCo+KDApKSk7CisKKyAgICBp
ZiAoc29mdHdhcmVCbHVyUmVxdWlyZWQpCisgICAgICAgIGNvbnRleHQtPnBsYXRmb3JtQ29udGV4
dCgpLT5zZXRTaGFkb3coY3VycmVudFNoYWRvd09mZnNldCwgY3VycmVudFNoYWRvd0JsdXIsIGN1
cnJlbnRTaGFkb3dDb2xvci5pc1ZhbGlkKCkgPyBjdXJyZW50U2hhZG93Q29sb3IucmdiKCkgOiBt
YWtlUkdCQSgwLCAwLCAwLCAweEZGIC8gMyksIGNvbnRleHQtPnN0YXRlKCkuc2hhZG93c0lnbm9y
ZVRyYW5zZm9ybXMpOworfQorCitib29sIEZvbnQ6OmNhblJldHVybkZhbGxiYWNrRm9udHNGb3JD
b21wbGV4VGV4dCgpCit7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEZvbnQ6OmRyYXdF
bXBoYXNpc01hcmtzRm9yQ29tcGxleFRleHQoR3JhcGhpY3NDb250ZXh0KiAvKiBjb250ZXh0ICov
LCBjb25zdCBUZXh0UnVuJiAvKiBydW4gKi8sIGNvbnN0IEF0b21pY1N0cmluZyYgLyogbWFyayAq
LywgY29uc3QgRmxvYXRQb2ludCYgLyogcG9pbnQgKi8sIGludCAvKiBmcm9tICovLCBpbnQgLyog
dG8gKi8pIGNvbnN0Cit7CisgICAgLy8gbm90SW1wbGVtZW50ZWQoKTsKK30KKworYm9vbCBGb250
OjpjYW5FeHBhbmRBcm91bmRJZGVvZ3JhcGhzSW5Db21wbGV4VGV4dCgpCit7CisgICAgcmV0dXJu
IGZhbHNlOworfQorCit9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9ibGFja2JlcnJ5L0ZvbnRDYWNoZUJsYWNrQmVycnkuY3BwIGIvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9Gb250Q2FjaGVCbGFja0JlcnJ5LmNwcApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwLi4wOGQyZjExY2Q2MDIxZjVmOGZmY2M4N2ZiYTViMDkwNTRjZWYxNWM2Ci0tLSAvZGV2
L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9G
b250Q2FjaGVCbGFja0JlcnJ5LmNwcApAQCAtMCwwICsxLDI1MyBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAwOCBBbHAgVG9rZXIgPGFscEBhdG9rZXIuY29tPgorICogQ29weXJpZ2h0IChDKSAy
MDEwIElnYWxpYSBTLkwuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIsIDIwMTMgUmVzZWFyY2ggSW4g
TW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5
IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9k
aWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMK
KyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247
IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24p
IGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBp
biB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdB
UlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5U
QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05V
CisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAq
CisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRo
ZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdh
cmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAq
IEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisKKyNpbmNsdWRlICJjb25m
aWcuaCIKKyNpbmNsdWRlICJGb250Q2FjaGUuaCIKKworI2luY2x1ZGUgIkZvbnQuaCIKKyNpbmNs
dWRlICJGb250RGVzY3JpcHRpb24uaCIKKyNpbmNsdWRlICJGb250UGxhdGZvcm1EYXRhLmgiCisj
aW5jbHVkZSAiSVR5cGVVdGlscy5oIgorI2luY2x1ZGUgIkxvZ2dpbmcuaCIKKyNpbmNsdWRlICJO
b3RJbXBsZW1lbnRlZC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtU3VwcG9ydC5oIgorI2luY2x1ZGUg
IlNpbXBsZUZvbnREYXRhLmgiCisKKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1HcmFwaGlj
c0NvbnRleHQuaD4KKyNpbmNsdWRlIDxmb250Y29uZmlnL2ZvbnRjb25maWcuaD4KKyNpbmNsdWRl
IDxmc19hcGkuaD4KKyNpbmNsdWRlIDx1bmljb2RlL2xvY2lkLmg+CisjaW5jbHVkZSA8d3RmL0Fz
c2VydGlvbnMuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9BdG9taWNTdHJpbmcuaD4KKyNpbmNsdWRl
IDx3dGYvdGV4dC9DU3RyaW5nLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwordm9pZCBGb250
Q2FjaGU6OnBsYXRmb3JtSW5pdCgpCit7CisgICAgLy8gSXQncyBmaW5lIHRvIGNhbGwgRmNJbml0
IG11bHRpcGxlIHRpbWVzIHBlciB0aGUgZG9jdW1lbnRhdGlvbi4KKyAgICBpZiAoIUZjSW5pdCgp
KQorICAgICAgICBDUkFTSCgpOworfQorCitjb25zdCBTaW1wbGVGb250RGF0YSogRm9udENhY2hl
OjpnZXRGb250RGF0YUZvckNoYXJhY3RlcnMoY29uc3QgRm9udCYgZm9udCwgY29uc3QgVUNoYXIq
IGNoYXJhY3RlcnMsIGludCBsZW5ndGgpCit7CisgICAgaWN1OjpMb2NhbGUgbG9jYWxlID0gaWN1
OjpMb2NhbGU6OmdldERlZmF1bHQoKTsKKyAgICBQbGF0Zm9ybVN1cHBvcnQ6OkZvbnRGYW1pbHkg
ZmFtaWx5OworICAgIFBsYXRmb3JtU3VwcG9ydDo6Z2V0Rm9udEZhbWlseUZvckNoYXJhY3RlcnMo
Y2hhcmFjdGVycywgbGVuZ3RoLCBsb2NhbGUuZ2V0TGFuZ3VhZ2UoKSwgZm9udC5mb250RGVzY3Jp
cHRpb24oKSwgJmZhbWlseSk7CisgICAgaWYgKGZhbWlseS5uYW1lLmlzRW1wdHkoKSkKKyAgICAg
ICAgcmV0dXJuIDA7CisKKyAgICBBdG9taWNTdHJpbmcgYXRvbWljRmFtaWx5KGZhbWlseS5uYW1l
KTsKKyAgICAvLyBDaGFuZ2VzIHdlaWdodCBhbmQvb3IgaXRhbGljIG9mIGdpdmVuIEZvbnREZXNj
cmlwdGlvbiBkZXBlbmRzIG9uCisgICAgLy8gdGhlIHJlc3VsdCBvZiBmb250Y29uZmlnIHNvIHRo
YXQga2VlcGluZyB0aGUgY29ycmVjdCBmb250IG1hcHBpbmcKKyAgICAvLyBvZiB0aGUgZ2l2ZW4g
Y2hhcmFjdGVycy4gU2VlIGh0dHA6Ly9jcmJ1Zy5jb20vMzIxMDkgZm9yIGRldGFpbHMuCisgICAg
Ym9vbCBzaG91bGRTZXRGYWtlQm9sZCA9IGZhbHNlOworICAgIGJvb2wgc2hvdWxkU2V0RmFrZUl0
YWxpYyA9IGZhbHNlOworICAgIEZvbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbihmb250LmZvbnRE
ZXNjcmlwdGlvbigpKTsKKyAgICBpZiAoZmFtaWx5LmlzQm9sZCAmJiBkZXNjcmlwdGlvbi53ZWln
aHQoKSA8IEZvbnRXZWlnaHRCb2xkKQorICAgICAgICBkZXNjcmlwdGlvbi5zZXRXZWlnaHQoRm9u
dFdlaWdodEJvbGQpOworICAgIGlmICghZmFtaWx5LmlzQm9sZCAmJiBkZXNjcmlwdGlvbi53ZWln
aHQoKSA+PSBGb250V2VpZ2h0Qm9sZCkgeworICAgICAgICBzaG91bGRTZXRGYWtlQm9sZCA9IHRy
dWU7CisgICAgICAgIGRlc2NyaXB0aW9uLnNldFdlaWdodChGb250V2VpZ2h0Tm9ybWFsKTsKKyAg
ICB9CisgICAgaWYgKGZhbWlseS5pc0l0YWxpYyAmJiBkZXNjcmlwdGlvbi5pdGFsaWMoKSA9PSBG
b250SXRhbGljT2ZmKQorICAgICAgICBkZXNjcmlwdGlvbi5zZXRJdGFsaWMoRm9udEl0YWxpY09u
KTsKKyAgICBpZiAoIWZhbWlseS5pc0l0YWxpYyAmJiBkZXNjcmlwdGlvbi5pdGFsaWMoKSA9PSBG
b250SXRhbGljT24pIHsKKyAgICAgICAgc2hvdWxkU2V0RmFrZUl0YWxpYyA9IHRydWU7CisgICAg
ICAgIGRlc2NyaXB0aW9uLnNldEl0YWxpYyhGb250SXRhbGljT2ZmKTsKKyAgICB9CisKKyAgICBG
b250UGxhdGZvcm1EYXRhKiBzdWJzdGl0dXRlUGxhdGZvcm1EYXRhID0gZ2V0Q2FjaGVkRm9udFBs
YXRmb3JtRGF0YShkZXNjcmlwdGlvbiwgYXRvbWljRmFtaWx5LCBEb05vdFJldGFpbik7CisgICAg
aWYgKCFzdWJzdGl0dXRlUGxhdGZvcm1EYXRhKQorICAgICAgICByZXR1cm4gMDsKKyAgICBGb250
UGxhdGZvcm1EYXRhIHBsYXRmb3JtRGF0YSA9IEZvbnRQbGF0Zm9ybURhdGEoKnN1YnN0aXR1dGVQ
bGF0Zm9ybURhdGEpOworICAgIHBsYXRmb3JtRGF0YS5zZXRGYWtlQm9sZChzaG91bGRTZXRGYWtl
Qm9sZCk7CisgICAgcGxhdGZvcm1EYXRhLnNldEZha2VJdGFsaWMoc2hvdWxkU2V0RmFrZUl0YWxp
Yyk7CisgICAgcmV0dXJuIGdldENhY2hlZEZvbnREYXRhKCZwbGF0Zm9ybURhdGEsIERvTm90UmV0
YWluKTsKK30KKworU2ltcGxlRm9udERhdGEqIEZvbnRDYWNoZTo6Z2V0U2ltaWxhckZvbnRQbGF0
Zm9ybURhdGEoY29uc3QgRm9udCYgZm9udCkKK3sKKyAgICByZXR1cm4gMDsKK30KKworU2ltcGxl
Rm9udERhdGEqIEZvbnRDYWNoZTo6Z2V0TGFzdFJlc29ydEZhbGxiYWNrRm9udChjb25zdCBGb250
RGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uLCBTaG91bGRSZXRhaW4pCit7CisgICAgREVGSU5FX1NU
QVRJQ19MT0NBTChjb25zdCBBdG9taWNTdHJpbmcsIHNhbnNTdHIsICgiU2FucyIpKTsKKyAgICBE
RUZJTkVfU1RBVElDX0xPQ0FMKGNvbnN0IEF0b21pY1N0cmluZywgc2VyaWZTdHIsICgiU2VyaWYi
KSk7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChjb25zdCBBdG9taWNTdHJpbmcsIG1vbm9zcGFj
ZVN0ciwgKCJNb25vc3BhY2UiKSk7CisKKyAgICBGb250UGxhdGZvcm1EYXRhKiBmb250UGxhdGZv
cm1EYXRhID0gMDsKKyAgICBzd2l0Y2ggKGRlc2NyaXB0aW9uLmdlbmVyaWNGYW1pbHkoKSkgewor
ICAgIGNhc2UgRm9udERlc2NyaXB0aW9uOjpTZXJpZkZhbWlseToKKyAgICAgICAgZm9udFBsYXRm
b3JtRGF0YSA9IGdldENhY2hlZEZvbnRQbGF0Zm9ybURhdGEoZGVzY3JpcHRpb24sIHNlcmlmU3Ry
KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGb250RGVzY3JpcHRpb246Ok1vbm9zcGFjZUZh
bWlseToKKyAgICAgICAgZm9udFBsYXRmb3JtRGF0YSA9IGdldENhY2hlZEZvbnRQbGF0Zm9ybURh
dGEoZGVzY3JpcHRpb24sIG1vbm9zcGFjZVN0cik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ug
Rm9udERlc2NyaXB0aW9uOjpTYW5zU2VyaWZGYW1pbHk6CisgICAgZGVmYXVsdDoKKyAgICAgICAg
Zm9udFBsYXRmb3JtRGF0YSA9IGdldENhY2hlZEZvbnRQbGF0Zm9ybURhdGEoZGVzY3JpcHRpb24s
IHNhbnNTdHIpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWZvbnRQbGF0Zm9y
bURhdGEpIHsKKyAgICAgICAgREVGSU5FX1NUQVRJQ19MT0NBTChjb25zdCBBdG9taWNTdHJpbmcs
IGFyaWFsU3RyLCAoIkFyaWFsIikpOworICAgICAgICBmb250UGxhdGZvcm1EYXRhID0gZ2V0Q2Fj
aGVkRm9udFBsYXRmb3JtRGF0YShkZXNjcmlwdGlvbiwgYXJpYWxTdHIpOworICAgIH0KKworICAg
IEFTU0VSVChmb250UGxhdGZvcm1EYXRhKTsKKyAgICByZXR1cm4gZ2V0Q2FjaGVkRm9udERhdGEo
Zm9udFBsYXRmb3JtRGF0YSk7Cit9CisKK3ZvaWQgRm9udENhY2hlOjpnZXRUcmFpdHNJbkZhbWls
eShjb25zdCBBdG9taWNTdHJpbmcmIGZhbWlseU5hbWUsIFZlY3Rvcjx1bnNpZ25lZD4mIHRyYWl0
c01hc2tzKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3N0YXRpYyBTdHJpbmcgZ2V0
RmFtaWx5TmFtZVN0cmluZ0Zyb21Gb250RGVzY3JpcHRpb25BbmRGYW1pbHkoY29uc3QgRm9udERl
c2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24sIGNvbnN0IEF0b21pY1N0cmluZyYgZmFtaWx5KQor
eworICAgIC8vIElmIHdlJ3JlIGNyZWF0aW5nIGEgZmFsbGJhY2sgZm9udCAoZS5nLiAiLXdlYmtp
dC1tb25vc3BhY2UiKSwgY29udmVydCB0aGUgbmFtZSBpbnRvCisgICAgLy8gdGhlIGZhbGxiYWNr
IG5hbWUgKGxpa2UgIm1vbm9zcGFjZSIpIHRoYXQgZm9udGNvbmZpZyB1bmRlcnN0YW5kcy4KKyAg
ICBpZiAoZmFtaWx5Lmxlbmd0aCgpICYmICFmYW1pbHkuc3RhcnRzV2l0aCgiLXdlYmtpdC0iKSkK
KyAgICAgICAgcmV0dXJuIGZhbWlseS5zdHJpbmcoKTsKKworICAgIHN3aXRjaCAoZm9udERlc2Ny
aXB0aW9uLmdlbmVyaWNGYW1pbHkoKSkgeworICAgIGNhc2UgRm9udERlc2NyaXB0aW9uOjpTdGFu
ZGFyZEZhbWlseToKKyAgICBjYXNlIEZvbnREZXNjcmlwdGlvbjo6U2VyaWZGYW1pbHk6CisgICAg
ICAgIHJldHVybiAic2VyaWYiOworICAgIGNhc2UgRm9udERlc2NyaXB0aW9uOjpTYW5zU2VyaWZG
YW1pbHk6CisgICAgICAgIHJldHVybiAic2Fucy1zZXJpZiI7CisgICAgY2FzZSBGb250RGVzY3Jp
cHRpb246Ok1vbm9zcGFjZUZhbWlseToKKyAgICAgICAgcmV0dXJuICJtb25vc3BhY2UiOworICAg
IGNhc2UgRm9udERlc2NyaXB0aW9uOjpDdXJzaXZlRmFtaWx5OgorICAgICAgICByZXR1cm4gImN1
cnNpdmUiOworICAgIGNhc2UgRm9udERlc2NyaXB0aW9uOjpGYW50YXN5RmFtaWx5OgorICAgICAg
ICByZXR1cm4gImZhbnRhc3kiOworICAgIGNhc2UgRm9udERlc2NyaXB0aW9uOjpOb0ZhbWlseToK
KyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gIiI7CisgICAgfQorfQorCitpbnQgZm9udFdl
aWdodFRvRm9udGNvbmZpZ1dlaWdodChGb250V2VpZ2h0IHdlaWdodCkKK3sKKyAgICBzd2l0Y2gg
KHdlaWdodCkgeworICAgIGNhc2UgRm9udFdlaWdodDEwMDoKKyAgICAgICAgcmV0dXJuIEZDX1dF
SUdIVF9USElOOworICAgIGNhc2UgRm9udFdlaWdodDIwMDoKKyAgICAgICAgcmV0dXJuIEZDX1dF
SUdIVF9VTFRSQUxJR0hUOworICAgIGNhc2UgRm9udFdlaWdodDMwMDoKKyAgICAgICAgcmV0dXJu
IEZDX1dFSUdIVF9MSUdIVDsKKyAgICBjYXNlIEZvbnRXZWlnaHQ0MDA6CisgICAgICAgIHJldHVy
biBGQ19XRUlHSFRfUkVHVUxBUjsKKyAgICBjYXNlIEZvbnRXZWlnaHQ1MDA6CisgICAgICAgIHJl
dHVybiBGQ19XRUlHSFRfTUVESVVNOworICAgIGNhc2UgRm9udFdlaWdodDYwMDoKKyAgICAgICAg
cmV0dXJuIEZDX1dFSUdIVF9TRU1JQk9MRDsKKyAgICBjYXNlIEZvbnRXZWlnaHQ3MDA6CisgICAg
ICAgIHJldHVybiBGQ19XRUlHSFRfQk9MRDsKKyAgICBjYXNlIEZvbnRXZWlnaHQ4MDA6CisgICAg
ICAgIHJldHVybiBGQ19XRUlHSFRfRVhUUkFCT0xEOworICAgIGNhc2UgRm9udFdlaWdodDkwMDoK
KyAgICAgICAgcmV0dXJuIEZDX1dFSUdIVF9VTFRSQUJMQUNLOworICAgIGRlZmF1bHQ6CisgICAg
ICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gRkNfV0VJR0hUX1JFR1VM
QVI7CisgICAgfQorfQorCitGb250UGxhdGZvcm1EYXRhKiBGb250Q2FjaGU6OmNyZWF0ZUZvbnRQ
bGF0Zm9ybURhdGEoY29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24sIGNvbnN0
IEF0b21pY1N0cmluZyYgZmFtaWx5KQoreworICAgIC8vIFRoZSBDU1MgZm9udCBtYXRjaGluZyBh
bGdvcml0aG0gKGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtZm9udHMvI2ZvbnQtbWF0Y2hpbmct
YWxnb3JpdGhtKQorICAgIC8vIHNheXMgdGhhdCB3ZSBtdXN0IGZpbmQgYW4gZXhhY3QgbWF0Y2gg
Zm9yIGZvbnQgZmFtaWx5LCBzbGFudCAoaXRhbGljIG9yIG9ibGlxdWUgY2FuIGJlIHVzZWQpCisg
ICAgLy8gYW5kIGZvbnQgd2VpZ2h0ICh3ZSBvbmx5IG1hdGNoIGJvbGQvbm9uLWJvbGQgaGVyZSku
CisgICAgRmNQYXR0ZXJuKiBwYXR0ZXJuID0gRmNQYXR0ZXJuQ3JlYXRlKCk7CisgICAgU3RyaW5n
IGZhbWlseU5hbWVTdHJpbmcoZ2V0RmFtaWx5TmFtZVN0cmluZ0Zyb21Gb250RGVzY3JpcHRpb25B
bmRGYW1pbHkoZm9udERlc2NyaXB0aW9uLCBmYW1pbHkpKTsKKyAgICBpZiAoIUZjUGF0dGVybkFk
ZFN0cmluZyhwYXR0ZXJuLCBGQ19GQU1JTFksIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRmNDaGFy
OCo+KGZhbWlseU5hbWVTdHJpbmcudXRmOCgpLmRhdGEoKSkpKQorICAgICAgICByZXR1cm4gMDsK
KworICAgIGJvb2wgaXRhbGljID0gZm9udERlc2NyaXB0aW9uLml0YWxpYygpOworICAgIGlmICgh
RmNQYXR0ZXJuQWRkSW50ZWdlcihwYXR0ZXJuLCBGQ19TTEFOVCwgaXRhbGljID8gRkNfU0xBTlRf
SVRBTElDIDogRkNfU0xBTlRfUk9NQU4pKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIUZj
UGF0dGVybkFkZEludGVnZXIocGF0dGVybiwgRkNfV0VJR0hULCBmb250V2VpZ2h0VG9Gb250Y29u
ZmlnV2VpZ2h0KGZvbnREZXNjcmlwdGlvbi53ZWlnaHQoKSkpKQorICAgICAgICByZXR1cm4gMDsK
KyAgICBpZiAoIUZjUGF0dGVybkFkZERvdWJsZShwYXR0ZXJuLCBGQ19QSVhFTF9TSVpFLCBmb250
RGVzY3JpcHRpb24uY29tcHV0ZWRQaXhlbFNpemUoKSkpCisgICAgICAgIHJldHVybiAwOworCisg
ICAgLy8gVGhlIHN0cmF0ZWd5IGlzIG9yaWdpbmFsbHkgZnJvbSBTa2lhIChzcmMvcG9ydHMvU2tG
b250SG9zdF9mb250Y29uZmlnLmNwcCk6CisKKyAgICAvLyBBbGxvdyBGb250Y29uZmlnIHRvIGRv
IHByZS1tYXRjaCBzdWJzdGl0dXRpb24uIFVubGVzcyB3ZSBhcmUgYWNjZXNzaW5nIGEgImZhbGxi
YWNrIgorICAgIC8vIGZhbWlseSBsaWtlICJzYW5zLCIgdGhpcyBpcyB0aGUgb25seSB0aW1lIHdl
IGFsbG93IEZvbnRjb25maWcgdG8gc3Vic3RpdHV0ZSBvbmUKKyAgICAvLyBmYW1pbHkgbmFtZSBm
b3IgYW5vdGhlciAoaS5lLiBpZiB0aGUgZm9udHMgYXJlIGFsaWFzZWQgdG8gZWFjaCBvdGhlciku
CisgICAgRmNDb25maWdTdWJzdGl0dXRlKDAsIHBhdHRlcm4sIEZjTWF0Y2hQYXR0ZXJuKTsKKyAg
ICBGY0RlZmF1bHRTdWJzdGl0dXRlKHBhdHRlcm4pOworCisgICAgRmNDaGFyOCogZm9udENvbmZp
Z0ZhbWlseU5hbWVBZnRlckNvbmZpZ3VyYXRpb247CisgICAgRmNQYXR0ZXJuR2V0U3RyaW5nKHBh
dHRlcm4sIEZDX0ZBTUlMWSwgMCwgJmZvbnRDb25maWdGYW1pbHlOYW1lQWZ0ZXJDb25maWd1cmF0
aW9uKTsKKyAgICBTdHJpbmcgZmFtaWx5TmFtZUFmdGVyQ29uZmlndXJhdGlvbiA9IFN0cmluZzo6
ZnJvbVVURjgocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oZm9udENvbmZpZ0ZhbWlseU5hbWVBZnRl
ckNvbmZpZ3VyYXRpb24pKTsKKworICAgIEZjUmVzdWx0IGZvbnRDb25maWdSZXN1bHQ7CisgICAg
RmNQYXR0ZXJuKiByZXN1bHRQYXR0ZXJuID0gRmNGb250TWF0Y2goMCwgcGF0dGVybiwgJmZvbnRD
b25maWdSZXN1bHQpOworICAgIEZjUGF0dGVybkRlc3Ryb3kocGF0dGVybik7CisgICAgaWYgKCFy
ZXN1bHRQYXR0ZXJuKSAvLyBObyBtYXRjaC4KKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBGY0No
YXI4KiBmb250Q29uZmlnRmFtaWx5TmFtZUFmdGVyTWF0Y2hpbmc7CisgICAgRmNQYXR0ZXJuR2V0
U3RyaW5nKHJlc3VsdFBhdHRlcm4sIEZDX0ZBTUlMWSwgMCwgJmZvbnRDb25maWdGYW1pbHlOYW1l
QWZ0ZXJNYXRjaGluZyk7CisgICAgU3RyaW5nIGZhbWlseU5hbWVBZnRlck1hdGNoaW5nID0gU3Ry
aW5nOjpmcm9tVVRGOChyZWludGVycHJldF9jYXN0PGNoYXIqPihmb250Q29uZmlnRmFtaWx5TmFt
ZUFmdGVyTWF0Y2hpbmcpKTsKKworICAgIC8vIElmIEZvbnRjb25maWcgZ2F2ZSB1c2UgYSBkaWZm
ZXJlbnQgZm9udCBmYW1pbHkgdGhhbiB0aGUgb25lIHdlIHJlcXVlc3RlZCwgd2Ugc2hvdWxkIGln
bm9yZSBpdAorICAgIC8vIGFuZCBhbGxvdyBXZWJDb3JlIHRvIGdpdmUgdXMgdGhlIG5leHQgZm9u
dCBvbiB0aGUgQ1NTIGZhbGxiYWNrIGxpc3QuIFRoZSBvbmx5IGV4Y2VwdGlvbiBpcyBpZgorICAg
IC8vIHRoaXMgZmFtaWx5IG5hbWUgaXMgYSBjb21tb25seSB1c2VkIGdlbmVyaWMgZmFtaWx5Lgor
ICAgIGlmICghZXF1YWxJZ25vcmluZ0Nhc2UoZmFtaWx5TmFtZUFmdGVyQ29uZmlndXJhdGlvbiwg
ZmFtaWx5TmFtZUFmdGVyTWF0Y2hpbmcpCisgICAgICAgICYmICEoZXF1YWxJZ25vcmluZ0Nhc2Uo
ZmFtaWx5TmFtZVN0cmluZywgInNhbnMiKSB8fCBlcXVhbElnbm9yaW5nQ2FzZShmYW1pbHlOYW1l
U3RyaW5nLCAic2Fucy1zZXJpZiIpCisgICAgICAgICAgICB8fCBlcXVhbElnbm9yaW5nQ2FzZShm
YW1pbHlOYW1lU3RyaW5nLCAic2VyaWYiKSB8fCBlcXVhbElnbm9yaW5nQ2FzZShmYW1pbHlOYW1l
U3RyaW5nLCAibW9ub3NwYWNlIikKKyAgICAgICAgICAgIHx8IGVxdWFsSWdub3JpbmdDYXNlKGZh
bWlseU5hbWVTdHJpbmcsICJmYW50YXN5IikgfHwgZXF1YWxJZ25vcmluZ0Nhc2UoZmFtaWx5TmFt
ZVN0cmluZywgImN1cnNpdmUiKSkpCisgICAgICAgIHJldHVybiAwOworCisgICAgaW50IGZvbnRX
ZWlnaHQ7CisgICAgRmNQYXR0ZXJuR2V0SW50ZWdlcihyZXN1bHRQYXR0ZXJuLCBGQ19XRUlHSFQs
IDAsICZmb250V2VpZ2h0KTsKKyAgICBib29sIHNob3VsZEZha2VCb2xkID0gZm9udFdlaWdodCA8
IEZDX1dFSUdIVF9CT0xEICYmIGZvbnREZXNjcmlwdGlvbi53ZWlnaHQoKSA+PSBGb250V2VpZ2h0
Qm9sZDsKKworICAgIGludCBmb250U2xhbnQ7CisgICAgRmNQYXR0ZXJuR2V0SW50ZWdlcihyZXN1
bHRQYXR0ZXJuLCBGQ19TTEFOVCwgMCwgJmZvbnRTbGFudCk7CisgICAgYm9vbCBzaG91bGRGYWtl
SXRhbGljID0gZm9udFNsYW50ID09IEZDX1NMQU5UX1JPTUFOICYmIGZvbnREZXNjcmlwdGlvbi5p
dGFsaWMoKSA9PSBGb250SXRhbGljT247CisKKyAgICBGY0NoYXI4KiBmb250RmlsZU5hbWU7Cisg
ICAgRmNQYXR0ZXJuR2V0U3RyaW5nKHJlc3VsdFBhdHRlcm4sIEZDX0ZJTEUsIDAsICZmb250Rmls
ZU5hbWUpOworICAgIC8vIGZwcmludGYoc3RkZXJyLCAiTG9va2luZyBmb3IgJXMgZm91bmQgJXM6
IGk6JWQgYjolZFxuIiwgZmFtaWx5LnN0cmluZygpLmxhdGluMSgpLmRhdGEoKSwgZm9udEZpbGVO
YW1lLCBzaG91bGRGYWtlSXRhbGljLCBzaG91bGRGYWtlQm9sZCk7CisgICAgRmNQYXR0ZXJuRGVz
dHJveShyZXN1bHRQYXR0ZXJuKTsKKworICAgIEZJTEVDSEFSIG5hbWVbTUFYX0ZPTlRfTkFNRV9M
RU4rMV07CisgICAgbWVtc2V0KG5hbWUsIDAsIE1BWF9GT05UX05BTUVfTEVOKzEpOworICAgIC8v
IGZwcmludGYoc3RkZXJyLCAiRlNfbG9hZF9mb250ICVzOiAiLCBmb250RmlsZU5hbWUpOworICAg
IGlmIChGU19sb2FkX2ZvbnQoQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpnZXRJVHlw
ZSgpLCByZWludGVycHJldF9jYXN0PEZJTEVDSEFSKj4oZm9udEZpbGVOYW1lKSwgMCwgMCwgTUFY
X0ZPTlRfTkFNRV9MRU4sIG5hbWUpICE9IFNVQ0NFU1MpCisgICAgICAgIHJldHVybiAwOworICAg
IC8vIGZwcmludGYoc3RkZXJyLCAiICVzXG4iLCBuYW1lKTsKKworICAgIHJldHVybiBuZXcgRm9u
dFBsYXRmb3JtRGF0YShuYW1lLCBmb250RGVzY3JpcHRpb24uY29tcHV0ZWRTaXplKCksIHNob3Vs
ZEZha2VCb2xkLCBzaG91bGRGYWtlSXRhbGljLCBmb250RGVzY3JpcHRpb24ub3JpZW50YXRpb24o
KSwgZm9udERlc2NyaXB0aW9uLnRleHRPcmllbnRhdGlvbigpKTsKK30KKworfSAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
YmxhY2tiZXJyeS9Gb250Q3VzdG9tUGxhdGZvcm1EYXRhLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L0ZvbnRDdXN0b21QbGF0Zm9ybURhdGEuaApuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwLi5jYTJkYWIwMTY5MWJmYzRjNzI2YzNlMTQ4ZTllNjQ5MDdmOWM0MTlmCi0tLSAvZGV2L251
bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9Gb250
Q3VzdG9tUGxhdGZvcm1EYXRhLmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1
dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVz
c2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBT
b2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwg
b3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJh
cnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAq
IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJh
bnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9y
IG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9m
IHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhp
cyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0
aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAw
MjExMC0xMzAxICBVU0EKKyAqLworI2lmbmRlZiBGb250Q3VzdG9tUGxhdGZvcm1EYXRhX2gKKyNk
ZWZpbmUgRm9udEN1c3RvbVBsYXRmb3JtRGF0YV9oCisKKyNpbmNsdWRlICJGb250T3JpZW50YXRp
b24uaCIKKyNpbmNsdWRlICJGb250UmVuZGVyaW5nTW9kZS5oIgorI2luY2x1ZGUgIkZvbnRXaWR0
aFZhcmlhbnQuaCIKKyNpbmNsdWRlICJUZXh0T3JpZW50YXRpb24uaCIKKyNpbmNsdWRlIDx3dGYv
Tm9uY29weWFibGUuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4KKwordHlwZWRl
ZiBjaGFyIEZJTEVDSEFSOworc3RydWN0IEZTX1NUQVRFOworCituYW1lc3BhY2UgV2ViQ29yZSB7
CisKK2NsYXNzIEZvbnRQbGF0Zm9ybURhdGE7CitjbGFzcyBNb25vdHlwZUZvbnQ7CitjbGFzcyBT
aGFyZWRCdWZmZXI7CisKK3N0cnVjdCBGb250Q3VzdG9tUGxhdGZvcm1EYXRhIHsKKyAgICBXVEZf
TUFLRV9OT05DT1BZQUJMRShGb250Q3VzdG9tUGxhdGZvcm1EYXRhKTsKK3B1YmxpYzoKKyAgICBG
b250Q3VzdG9tUGxhdGZvcm1EYXRhKEZJTEVDSEFSKiBmb250TmFtZSwgUGFzc1JlZlB0cjxTaGFy
ZWRCdWZmZXI+KTsKKyAgICB+Rm9udEN1c3RvbVBsYXRmb3JtRGF0YSgpOworCisgICAgRm9udFBs
YXRmb3JtRGF0YSBmb250UGxhdGZvcm1EYXRhKGludCBzaXplLCBib29sIHN5bnRoZXRpY0JvbGQs
IGJvb2wgc3ludGhldGljSXRhbGljLCBGb250T3JpZW50YXRpb24gPSBIb3Jpem9udGFsLCBUZXh0
T3JpZW50YXRpb24gPSBUZXh0T3JpZW50YXRpb25WZXJ0aWNhbFJpZ2h0LAorICAgICAgICBGb250
V2lkdGhWYXJpYW50ID0gUmVndWxhcldpZHRoLCBGb250UmVuZGVyaW5nTW9kZSA9IE5vcm1hbFJl
bmRlcmluZ01vZGUpOworCisgICAgc3RhdGljIGJvb2wgc3VwcG9ydHNGb3JtYXQoY29uc3QgU3Ry
aW5nJik7CisKKyAgICBGSUxFQ0hBUiogbV9mb250TmFtZTsKKyAgICBSZWZQdHI8U2hhcmVkQnVm
ZmVyPiBtX2J1ZmZlcjsKK307CisKK0ZvbnRDdXN0b21QbGF0Zm9ybURhdGEqIGNyZWF0ZUZvbnRD
dXN0b21QbGF0Zm9ybURhdGEoU2hhcmVkQnVmZmVyKik7CisKK30gLy8gbmFtZXNwYWNlIFdlYkNv
cmUKKworI2VuZGlmIC8vIEZvbnRDdXN0b21QbGF0Zm9ybURhdGFfaApkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9Gb250Q3VzdG9tUGxhdGZv
cm1EYXRhQmxhY2tCZXJyeS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9i
bGFja2JlcnJ5L0ZvbnRDdXN0b21QbGF0Zm9ybURhdGFCbGFja0JlcnJ5LmNwcApuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
Li41NjY3ZDhmMjc1MzlhYjVkZjcyNWJiZGNlYzIwZTY4ZTE3ODkxMjI5Ci0tLSAvZGV2L251bGwK
KysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9Gb250Q3Vz
dG9tUGxhdGZvcm1EYXRhQmxhY2tCZXJyeS5jcHAKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxMiwgMjAxMyBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91
IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1z
IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hl
ZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBv
ZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAq
CisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxs
IGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRo
ZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVj
ZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNl
IGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3
YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29y
LCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgi
CisjaW5jbHVkZSAiRm9udEN1c3RvbVBsYXRmb3JtRGF0YS5oIgorCisjaW5jbHVkZSAiRm9udFBs
YXRmb3JtRGF0YS5oIgorI2luY2x1ZGUgIklUeXBlVXRpbHMuaCIKKyNpbmNsdWRlICJPcGVuVHlw
ZVNhbml0aXplci5oIgorI2luY2x1ZGUgIlNoYXJlZEJ1ZmZlci5oIgorCisjaW5jbHVkZSA8Qmxh
Y2tCZXJyeVBsYXRmb3JtR3JhcGhpY3NDb250ZXh0Lmg+CisjaW5jbHVkZSA8ZnNfYXBpLmg+CisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworRm9udEN1c3RvbVBsYXRmb3JtRGF0YTo6Rm9udEN1c3Rv
bVBsYXRmb3JtRGF0YShGSUxFQ0hBUiogZm9udE5hbWUsIFBhc3NSZWZQdHI8U2hhcmVkQnVmZmVy
PiBidWZmZXIpCisgICAgOiBtX2ZvbnROYW1lKHN0cmR1cChmb250TmFtZSkpCisgICAgLCBtX2J1
ZmZlcihidWZmZXIpCit7Cit9CisKK0ZvbnRDdXN0b21QbGF0Zm9ybURhdGE6On5Gb250Q3VzdG9t
UGxhdGZvcm1EYXRhKCkKK3sKKyAgICBGU19MT05HIHJldCA9IEZTX2RlbGV0ZV9mb250KEJsYWNr
QmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6Z2V0SVR5cGUoKSwgY29uc3RfY2FzdDxGSUxFQ0hB
Uio+KG1fZm9udE5hbWUpKTsKKyAgICBBU1NFUlRfVU5VU0VEKHJldCwgcmV0ID09IFNVQ0NFU1Mp
OworICAgIGZyZWUobV9mb250TmFtZSk7Cit9CisKK0ZvbnRQbGF0Zm9ybURhdGEgRm9udEN1c3Rv
bVBsYXRmb3JtRGF0YTo6Zm9udFBsYXRmb3JtRGF0YShpbnQgc2l6ZSwgYm9vbCBzeW50aGV0aWNC
b2xkLCBib29sIHN5bnRoZXRpY0l0YWxpYywgRm9udE9yaWVudGF0aW9uIG9yaWVudGF0aW9uLCBU
ZXh0T3JpZW50YXRpb24gdGV4dE9yaWVudGF0aW9uLCBGb250V2lkdGhWYXJpYW50IHdpZHRoVmFy
aWFudCwgRm9udFJlbmRlcmluZ01vZGUpCit7CisgICAgcmV0dXJuIEZvbnRQbGF0Zm9ybURhdGEo
bV9mb250TmFtZSwgc2l6ZSwgc3ludGhldGljQm9sZCwgc3ludGhldGljSXRhbGljLCBvcmllbnRh
dGlvbiwgdGV4dE9yaWVudGF0aW9uLCB3aWR0aFZhcmlhbnQpOworfQorCitib29sIEZvbnRDdXN0
b21QbGF0Zm9ybURhdGE6OnN1cHBvcnRzRm9ybWF0KGNvbnN0IFN0cmluZyYgZm9ybWF0KQorewor
ICAgIGJvb2wgaXNTdXBwb3J0ZWQgPSBlcXVhbElnbm9yaW5nQ2FzZShmb3JtYXQsICJ0cnVldHlw
ZSIpIHx8IGVxdWFsSWdub3JpbmdDYXNlKGZvcm1hdCwgIm9wZW50eXBlIik7CisjaWYgVVNFKE9Q
RU5UWVBFX1NBTklUSVpFUikKKyAgICBpc1N1cHBvcnRlZCA9IGlzU3VwcG9ydGVkIHx8IGVxdWFs
SWdub3JpbmdDYXNlKGZvcm1hdCwgIndvZmYiKTsKKyNlbmRpZgorICAgIHJldHVybiBpc1N1cHBv
cnRlZDsKK30KKworRm9udEN1c3RvbVBsYXRmb3JtRGF0YSogY3JlYXRlRm9udEN1c3RvbVBsYXRm
b3JtRGF0YShTaGFyZWRCdWZmZXIqIGJ1ZmZlcikKK3sKKyAgICBBU1NFUlRfQVJHKGJ1ZmZlciwg
YnVmZmVyKTsKKworI2lmIFVTRShPUEVOVFlQRV9TQU5JVElaRVIpCisgICAgT3BlblR5cGVTYW5p
dGl6ZXIgc2FuaXRpemVyKGJ1ZmZlcik7CisgICAgUmVmUHRyPFNoYXJlZEJ1ZmZlcj4gdHJhbnNj
b2RlQnVmZmVyID0gc2FuaXRpemVyLnNhbml0aXplKCk7CisgICAgaWYgKCF0cmFuc2NvZGVCdWZm
ZXIpCisgICAgICAgIHJldHVybiAwOyAvLyB2YWxpZGF0aW9uIGZhaWxlZC4KKyAgICBidWZmZXIg
PSB0cmFuc2NvZGVCdWZmZXIuZ2V0KCk7CisjZW5kaWYKKworICAgIEZJTEVDSEFSIG5hbWVbTUFY
X0ZPTlRfTkFNRV9MRU4rMV07CisgICAgbWVtc2V0KG5hbWUsIDAsIE1BWF9GT05UX05BTUVfTEVO
KzEpOworICAgIGlmIChGU19sb2FkX2ZvbnQoQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNz
OjpnZXRJVHlwZSgpLCAwLCBjb25zdF9jYXN0PEZTX0JZVEUqPihyZWludGVycHJldF9jYXN0PGNv
bnN0IEZTX0JZVEUqPihidWZmZXItPmRhdGEoKSkpLCAwLCBNQVhfRk9OVF9OQU1FX0xFTiwgbmFt
ZSkgIT0gU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gbmV3IEZvbnRD
dXN0b21QbGF0Zm9ybURhdGEobmFtZSwgYnVmZmVyKTsKK30KKworfQpkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9Gb250UGxhdGZvcm1EYXRh
QmxhY2tCZXJyeS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ibGFja2Jl
cnJ5L0ZvbnRQbGF0Zm9ybURhdGFCbGFja0JlcnJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi42MDRkMGUxODc0
ZDEwOWJiY2UxODQwMjY5YjM3MmJkMWM4NzY0MTU5Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9Gb250UGxhdGZvcm1EYXRhQmxh
Y2tCZXJyeS5jcHAKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIs
IDIwMTMgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRl
IGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3Nl
ciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29m
dHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9y
IChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5
IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBi
dXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50
eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ
T1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBt
b3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0
aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMg
bGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlv
biwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIx
MTAtMTMwMSAgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkZvbnRQ
bGF0Zm9ybURhdGEuaCIKKworI2luY2x1ZGUgIkhhcmZCdXp6TkdGYWNlLmgiCisjaW5jbHVkZSAi
SVR5cGVVdGlscy5oIgorCisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtR3JhcGhpY3NDb250
ZXh0Lmg+CisjaW5jbHVkZSA8ZnNfYXBpLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvV1RGU3RyaW5n
Lmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworRm9udFBsYXRmb3JtRGF0YTo6Rm9udFBsYXRm
b3JtRGF0YShGSUxFQ0hBUiogbmFtZSwgZmxvYXQgc2l6ZSwgYm9vbCBzeW50aGV0aWNCb2xkLCBi
b29sIHN5bnRoZXRpY09ibGlxdWUsIEZvbnRPcmllbnRhdGlvbiBvcmllbnRhdGlvbiwgVGV4dE9y
aWVudGF0aW9uIHRleHRPcmllbnRhdGlvbiwgRm9udFdpZHRoVmFyaWFudCB3aWR0aFZhcmlhbnQp
CisgICAgOiBtX3N5bnRoZXRpY0JvbGQoc3ludGhldGljQm9sZCkKKyAgICAsIG1fc3ludGhldGlj
T2JsaXF1ZShzeW50aGV0aWNPYmxpcXVlKQorICAgICwgbV9vcmllbnRhdGlvbihvcmllbnRhdGlv
bikKKyAgICAsIG1fdGV4dE9yaWVudGF0aW9uKHRleHRPcmllbnRhdGlvbikKKyAgICAsIG1fc2l6
ZShzaXplKQorICAgICwgbV93aWR0aFZhcmlhbnQod2lkdGhWYXJpYW50KQorICAgICwgbV9mb250
KDApCisgICAgLCBtX25hbWUoZmFzdFN0ckR1cChuYW1lKSkKKyAgICAsIG1fc2NhbGVkRm9udCgw
KQorICAgICwgbV9oYXJmYnV6ekZhY2UoKQorICAgICwgbV9pc0NvbG9yQml0bWFwRm9udChmYWxz
ZSkKK3sKKyAgICBBU1NFUlQobmFtZSk7CisgICAgbV9mb250ID0gRlNfbmV3X2NsaWVudChCbGFj
a0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OmdldElUeXBlKCksIDApOworICAgIEFTU0VSVCht
X2ZvbnQpOworICAgIGFwcGx5U3RhdGUobV9mb250KTsKK30KKworRm9udFBsYXRmb3JtRGF0YTo6
fkZvbnRQbGF0Zm9ybURhdGEoKQoreworICAgIGlmIChtX3NjYWxlZEZvbnQpIHsKKyAgICAgICAg
QmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpjbGVhckdseXBoQ2FjaGVGb3JGb250KG1f
c2NhbGVkRm9udCk7CisgICAgICAgIEZTX2VuZF9jbGllbnQobV9zY2FsZWRGb250KTsKKyAgICB9
CisgICAgaWYgKG1fZm9udCAmJiBtX2ZvbnQgIT0gaGFzaFRhYmxlRGVsZXRlZEZvbnRWYWx1ZSgp
KQorICAgICAgICBGU19lbmRfY2xpZW50KG1fZm9udCk7CisgICAgZmFzdEZyZWUobV9uYW1lKTsK
K30KKworY29uc3QgY2hhciogRm9udFBsYXRmb3JtRGF0YTo6bmFtZSgpIGNvbnN0Cit7CisgICAg
cmV0dXJuIG1fbmFtZTsKK30KKworYm9vbCBGb250UGxhdGZvcm1EYXRhOjphcHBseVN0YXRlKEZT
X1NUQVRFKiBmb250LCBmbG9hdCBzY2FsZSkgY29uc3QKK3sKKyAgICBBU1NFUlQoZm9udCk7Cisg
ICAgQVNTRVJUKG1fbmFtZSk7CisgICAgaWYgKEZTX3NldF9mb250KGZvbnQsIG1fbmFtZSkgIT0g
U1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKEZTX3NldF9jbWFwKGZv
bnQsIDMsIDEwKSAhPSBTVUNDRVNTKSAvLyBGaXJzdCB0cnkgV2luZG93cyBVbmljb2RlIHdpdGgg
c3Vycm9nYXRlcy4uLgorICAgICAgICBpZiAoRlNfc2V0X2NtYXAoZm9udCwgMywgMSkgIT0gU1VD
Q0VTUykgLy8gdHJ5IG5vcm1hbCBXaW5kb3dzIFVuaWNvZGUKKyAgICAgICAgICAgIGlmIChGU19z
ZXRfY21hcChmb250LCAxLCAwKSAhPSBTVUNDRVNTKQorICAgICAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKworICAgIGlmIChtX3N5bnRoZXRpY0JvbGQpIHsKKyAgICAgICAgaWYgKEZTX3NldF9i
b2xkX3BjdChmb250LCBmbG9hdFRvSVR5cGVGaXhlZCgwLjA2KSkgIT0gU1VDQ0VTUykgLy8gNiUg
cHNldWRvIGJvbGQKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgeworICAg
ICAgICBpZiAoRlNfc2V0X2JvbGRfcGN0KGZvbnQsIDApICE9IFNVQ0NFU1MpCisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgRlNfRklYRUQgc2tldyA9IDA7CisgICAgaWYg
KG1fc3ludGhldGljT2JsaXF1ZSkKKyAgICAgICAgc2tldyA9IDEzOTMwOyAvLyAxMiBkZWdyZWVz
CisKKyAgICBGU19GSVhFRCBmaXhlZFNjYWxlID0gc3RkOjptaW4oRml4TXVsKGZsb2F0VG9JVHlw
ZUZpeGVkKHNjYWxlKSwgZmxvYXRUb0lUeXBlRml4ZWQobV9zaXplKSksIE1BWElUWVBFRk9OVFND
QUxFKTsKKyAgICBpZiAoRlNfc2V0X3NjYWxlKGZvbnQsIGZpeGVkU2NhbGUsIEZpeE11bChmaXhl
ZFNjYWxlLCBza2V3KSwgMCwgZml4ZWRTY2FsZSkgIT0gU1VDQ0VTUykKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgaWYgKEZTX3NldF9mbGFncyhmb250LCBGTEFHU19DTUFQX09GRikgIT0g
U1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKEZTX3NldF9mbGFncyhm
b250LCBGTEFHU19ISU5UU19PRkYpICE9IFNVQ0NFU1MpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgIGlmIChGU19zZXRfZmxhZ3MoZm9udCwgRkxBR1NfREVGQVVMVF9DU01fT0ZGKSAhPSBT
VUNDRVNTKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAobV9vcmllbnRhdGlvbiA9
PSBWZXJ0aWNhbCkgeworICAgICAgICBpZiAoRlNfc2V0X2ZsYWdzKGZvbnQsIChtX3RleHRPcmll
bnRhdGlvbiA9PSBUZXh0T3JpZW50YXRpb25WZXJ0aWNhbFJpZ2h0KSA/IEZMQUdTX1ZFUlRJQ0FM
X1JPVEFURV9MRUZUX09OIDogRkxBR1NfVkVSVElDQUxfT04pICE9IFNVQ0NFU1MpCisgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEZv
bnRQbGF0Zm9ybURhdGE6OnBsYXRmb3JtRGF0YUluaXQoY29uc3QgRm9udFBsYXRmb3JtRGF0YSYg
c291cmNlKQoreworICAgIG1faGFyZmJ1enpGYWNlID0gc291cmNlLm1faGFyZmJ1enpGYWNlOwor
ICAgIG1fc2NhbGVkRm9udCA9IDA7CisgICAgaWYgKHNvdXJjZS5tX2ZvbnQgJiYgc291cmNlLm1f
Zm9udCAhPSBoYXNoVGFibGVEZWxldGVkRm9udFZhbHVlKCkpIHsKKyAgICAgICAgbV9mb250ID0g
RlNfbmV3X2NsaWVudChzb3VyY2UubV9mb250LCAwKTsKKyAgICAgICAgbV9uYW1lID0gZmFzdFN0
ckR1cChzb3VyY2UubmFtZSgpKTsKKyAgICAgICAgYm9vbCByZXQgPSBhcHBseVN0YXRlKG1fZm9u
dCk7CisgICAgICAgIEFTU0VSVF9VTlVTRUQocmV0LCByZXQpOworICAgIH0gZWxzZQorICAgICAg
ICBtX2ZvbnQgPSBzb3VyY2UubV9mb250OworfQorCitjb25zdCBGb250UGxhdGZvcm1EYXRhJiBG
b250UGxhdGZvcm1EYXRhOjpwbGF0Zm9ybURhdGFBc3NpZ24oY29uc3QgRm9udFBsYXRmb3JtRGF0
YSYgb3RoZXIpCit7CisgICAgbV9oYXJmYnV6ekZhY2UgPSBvdGhlci5tX2hhcmZidXp6RmFjZTsK
KyAgICBtX3NjYWxlZEZvbnQgPSAwOworICAgIGlmIChvdGhlci5tX2ZvbnQgJiYgb3RoZXIubV9m
b250ICE9IGhhc2hUYWJsZURlbGV0ZWRGb250VmFsdWUoKSkgeworICAgICAgICBtX2ZvbnQgPSBG
U19uZXdfY2xpZW50KG90aGVyLm1fZm9udCwgMCk7CisgICAgICAgIGZhc3RGcmVlKG1fbmFtZSk7
CisgICAgICAgIG1fbmFtZSA9IGZhc3RTdHJEdXAob3RoZXIubmFtZSgpKTsKKyAgICAgICAgYm9v
bCByZXQgPSBhcHBseVN0YXRlKG1fZm9udCk7CisgICAgICAgIEFTU0VSVF9VTlVTRUQocmV0LCBy
ZXQpOworICAgIH0gZWxzZQorICAgICAgICBtX2ZvbnQgPSBvdGhlci5tX2ZvbnQ7CisKKyAgICBy
ZXR1cm4gKnRoaXM7Cit9CisKK2Jvb2wgRm9udFBsYXRmb3JtRGF0YTo6cGxhdGZvcm1Jc0VxdWFs
KGNvbnN0IEZvbnRQbGF0Zm9ybURhdGEmIG90aGVyKSBjb25zdAoreworICAgIGlmIChtX2ZvbnQg
PT0gb3RoZXIubV9mb250KQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGlmICghbV9mb250
IHx8IG1fZm9udCA9PSBoYXNoVGFibGVEZWxldGVkRm9udFZhbHVlKCkgfHwgIW90aGVyLm1fZm9u
dCB8fCBvdGhlci5tX2ZvbnQgPT0gaGFzaFRhYmxlRGVsZXRlZEZvbnRWYWx1ZSgpKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gbV9mb250LT5jdXJfc2ZudCA9PSBvdGhlci5t
X2ZvbnQtPmN1cl9zZm50OworfQorCisjaWZuZGVmIE5ERUJVRworU3RyaW5nIEZvbnRQbGF0Zm9y
bURhdGE6OmRlc2NyaXB0aW9uKCkgY29uc3QKK3sKKyAgICByZXR1cm4gImlUeXBlIEZvbnQgRGF0
YSI7Cit9CisjZW5kaWYKKworSGFyZkJ1enpOR0ZhY2UqIEZvbnRQbGF0Zm9ybURhdGE6OmhhcmZi
dXp6RmFjZSgpCit7CisgICAgaWYgKCFtX2hhcmZidXp6RmFjZSkgeworICAgICAgICB1aW50NjRf
dCB1bmlxdWVJRCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihtX2ZvbnQpOworICAgICAg
ICBtX2hhcmZidXp6RmFjZSA9IEhhcmZCdXp6TkdGYWNlOjpjcmVhdGUoY29uc3RfY2FzdDxGb250
UGxhdGZvcm1EYXRhKj4odGhpcyksIHVuaXF1ZUlEKTsKKyAgICB9CisKKyAgICByZXR1cm4gbV9o
YXJmYnV6ekZhY2UuZ2V0KCk7Cit9CisKK0ZTX1NUQVRFKiBGb250UGxhdGZvcm1EYXRhOjpzY2Fs
ZWRGb250KGZsb2F0IHNjYWxlKSBjb25zdAoreworICAgIEFTU0VSVChzY2FsZSA+IDAuMCk7Cisg
ICAgaWYgKG1fc2NhbGUgPT0gc2NhbGUgJiYgbV9zY2FsZWRGb250KQorICAgICAgICByZXR1cm4g
bV9zY2FsZWRGb250OworCisgICAgLy8gVGhpcyBtdXN0IGJlIGFuIFNWRyBGb250LiBJdCBzZWVt
cyBsaWtlIHRoZXJlIGlzIGFuIHVwc3RyZWFtIGJ1ZyB3aGVyZSB3ZWIgYW5kIFNWRyBmb250cwor
ICAgIC8vIGFyZSB1c2VkIGluIG9uZSBUZXh0UnVuLiBPdGhlciBwb3J0cyBzZWVtIHRvIGJlIGFi
bGUgdG8gZGVhbCB3aXRoIGhhdmluZyBhbiBTVkcgRm9udCBpbgorICAgIC8vIHRoaXMgcGF0aCBz
byBiYWlsIG91dCBpbnN0ZWFkIG9mIGNyYXNoLgorICAgIGlmICghbV9mb250KQorICAgICAgICBy
ZXR1cm4gMDsKKworICAgIGlmIChtX3NjYWxlZEZvbnQpIHsKKyAgICAgICAgQmxhY2tCZXJyeTo6
UGxhdGZvcm06OkdyYXBoaWNzOjpjbGVhckdseXBoQ2FjaGVGb3JGb250KG1fc2NhbGVkRm9udCk7
CisgICAgICAgIGlmIChGU19lbmRfY2xpZW50KG1fc2NhbGVkRm9udCkgIT0gU1VDQ0VTUykKKyAg
ICAgICAgICAgIENSQVNIKCk7CisgICAgfQorCisgICAgbV9zY2FsZWRGb250ID0gRlNfbmV3X2Ns
aWVudChtX2ZvbnQsIDApOworICAgIGlmICghYXBwbHlTdGF0ZShtX3NjYWxlZEZvbnQsIHNjYWxl
KSkgeworICAgICAgICBpZiAoRlNfZW5kX2NsaWVudChtX3NjYWxlZEZvbnQpICE9IFNVQ0NFU1Mp
CisgICAgICAgICAgICBDUkFTSCgpOworICAgICAgICBtX3NjYWxlZEZvbnQgPSAwOworICAgICAg
ICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBtX3NjYWxlID0gc2NhbGU7CisKKyAgICByZXR1cm4g
bV9zY2FsZWRGb250OworfQorCit2b2lkIEZvbnRQbGF0Zm9ybURhdGE6OnNldEZha2VCb2xkKGJv
b2wgZmFrZUJvbGQpCit7CisgICAgbV9zeW50aGV0aWNCb2xkID0gZmFrZUJvbGQ7CisgICAgYXBw
bHlTdGF0ZShtX2ZvbnQpOworfQorCit2b2lkIEZvbnRQbGF0Zm9ybURhdGE6OnNldEZha2VJdGFs
aWMoYm9vbCBmYWtlSXRhbGljKQoreworICAgIG1fc3ludGhldGljT2JsaXF1ZSA9IGZha2VJdGFs
aWM7CisgICAgYXBwbHlTdGF0ZShtX2ZvbnQpOworfQorCitjb25zdCB2b2lkKiBGb250UGxhdGZv
cm1EYXRhOjpwbGF0Zm9ybUZvbnRIYW5kbGUoKSBjb25zdAoreworICAgIEFTU0VSVChtX2ZvbnQp
OworICAgIHJldHVybiBtX2ZvbnQtPmN1cl9zZm50OworfQorCitib29sIEZvbnRQbGF0Zm9ybURh
dGE6OmlzRml4ZWRQaXRjaCgpIGNvbnN0Cit7CisgICAgVFRGX1BPU1QgcG9zdDsKKyAgICBpZiAo
bV9mb250ICYmIEZTX2dldF90YWJsZV9zdHJ1Y3R1cmUobV9mb250LCBUQUdfcG9zdCwgJnBvc3Qp
ID09IFNVQ0NFU1MpCisgICAgICAgIHJldHVybiBwb3N0LmlzRml4ZWRQaXRjaDsKKyAgICByZXR1
cm4gZmFsc2U7Cit9CisKK30KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL2JsYWNrYmVycnkvR2x5cGhQYWdlVHJlZU5vZGVCbGFja0JlcnJ5LmNwcCBiL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvR2x5cGhQYWdlVHJlZU5vZGVC
bGFja0JlcnJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi40MDYwMDNhYjY3ZGMwMDM5NWJkYmIwZjdjYTk3Mjhj
ZDQ1YTMyYjIyCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvYmxhY2tiZXJyeS9HbHlwaFBhZ2VUcmVlTm9kZUJsYWNrQmVycnkuY3BwCkBAIC0wLDAg
KzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExp
bWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUg
c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVu
ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5z
ZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisg
KiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy
IHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl
IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdp
dGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9y
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3Nl
ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNo
b3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1Ymxp
YworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0
aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0
LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkdseXBoUGFnZVRyZWVOb2RlLmgiCisKKyNpbmNsdWRl
ICJTaW1wbGVGb250RGF0YS5oIgorI2luY2x1ZGUgPGZzX2FwaS5oPgorCituYW1lc3BhY2UgV2Vi
Q29yZSB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBXb3JsZFR5cGVTY29wZWRQdHIg
eworcHVibGljOgorICAgIHR5cGVkZWYgdm9pZCAoKkRlc3Ryb3lGdW5jdGlvbikoVCopOworCisg
ICAgV29ybGRUeXBlU2NvcGVkUHRyKFQqIHB0ciwgRGVzdHJveUZ1bmN0aW9uIGRlc3Ryb3kpCisg
ICAgICAgIDogbV9wdHIocHRyKQorICAgICAgICAsIG1fZGVzdHJveShkZXN0cm95KQorICAgIHsK
KyAgICAgICAgQVNTRVJUKG1fZGVzdHJveSk7CisgICAgfQorICAgIH5Xb3JsZFR5cGVTY29wZWRQ
dHIoKQorICAgIHsKKyAgICAgICAgaWYgKG1fcHRyKQorICAgICAgICAgICAgKCptX2Rlc3Ryb3kp
KG1fcHRyKTsKKyAgICB9CisKKyAgICBUKiBnZXQoKSB7IHJldHVybiBtX3B0cjsgfQorcHJpdmF0
ZToKKyAgICBUKiBtX3B0cjsKKyAgICBEZXN0cm95RnVuY3Rpb24gbV9kZXN0cm95OworfTsKKwor
Ym9vbCBHbHlwaFBhZ2U6OmZpbGwodW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBsZW5ndGgsIFVD
aGFyKiBidWZmZXIsIHVuc2lnbmVkIGJ1ZmZlckxlbmd0aCwgY29uc3QgU2ltcGxlRm9udERhdGEq
IGZvbnREYXRhKQoreworICAgIGJvb2wgaGF2ZUdseXBocyA9IGZhbHNlOworICAgIHVuc2lnbmVk
IHBvc2l0aW9uID0gMDsKKyAgICBpbnQgaSA9IDA7CisgICAgd2hpbGUgKHBvc2l0aW9uIDwgYnVm
ZmVyTGVuZ3RoKSB7CisgICAgICAgIFVDaGFyMzIgY2hhcmFjdGVyOworICAgICAgICB1bnNpZ25l
ZCBuZXh0UG9zaXRpb24gPSBwb3NpdGlvbjsKKyAgICAgICAgVTE2X05FWFQoYnVmZmVyLCBuZXh0
UG9zaXRpb24sIGJ1ZmZlckxlbmd0aCwgY2hhcmFjdGVyKTsKKworICAgICAgICBGU19VU0hPUlQg
Z2x5cGggPSBGU19tYXBfY2hhcihmb250RGF0YS0+cGxhdGZvcm1EYXRhKCkuZm9udCgpLCBzdGF0
aWNfY2FzdDxGU19VTE9ORz4oY2hhcmFjdGVyKSk7CisgICAgICAgIGlmICghZ2x5cGgpCisgICAg
ICAgICAgICBzZXRHbHlwaERhdGFGb3JJbmRleChvZmZzZXQgKyBpLCAwLCAwKTsKKyAgICAgICAg
ZWxzZSB7CisgICAgICAgICAgICBoYXZlR2x5cGhzID0gdHJ1ZTsKKyAgICAgICAgICAgIHNldEds
eXBoRGF0YUZvckluZGV4KG9mZnNldCArIGksIGdseXBoLCBmb250RGF0YSk7CisgICAgICAgIH0K
KworICAgICAgICBpKys7CisgICAgICAgIHBvc2l0aW9uID0gbmV4dFBvc2l0aW9uOworICAgIH0K
KworICAgIHJldHVybiBoYXZlR2x5cGhzOworfQorCit9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L0dyYWRpZW50QmxhY2tCZXJyeS5jcHAg
Yi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L0dyYWRpZW50Qmxh
Y2tCZXJyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYTM4NDhmMGY5NGM5ZGMxOGNhYTcxOGQ2ZGQzMjE1N2Zh
MTQ4YWQ2OQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL2JsYWNrYmVycnkvR3JhZGllbnRCbGFja0JlcnJ5LmNwcApAQCAtMCwwICsxLDEzNSBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsg
eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRl
cm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxp
c2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24g
MiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4K
KyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3
aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVu
IHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwg
UHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUg
cmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNl
bnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNv
ZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZs
b29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworI2luY2x1ZGUgImNvbmZpZy5o
IgorI2luY2x1ZGUgIkdyYWRpZW50LmgiCisKKyNpbmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIK
KyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQz
RC5oIgorI2luY2x1ZGUgIktVUkwuaCIKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgorI2lu
Y2x1ZGUgIlRyYW5zZm9ybWF0aW9uTWF0cml4LmgiCisKKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxh
dGZvcm1HcmFwaGljc0NvbnRleHQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHd0
Zi9Bc3NlcnRpb25zLmg+CisjaW5jbHVkZSA8d3RmL01hdGhFeHRyYXMuaD4KKyNpbmNsdWRlIDx3
dGYvVW51c2VkUGFyYW0uaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBX
ZWJDb3JlIHsKKworLy8gRGV0ZXJtaW5lIHRoZSB0b3RhbCBudW1iZXIgb2Ygc3RvcHMgbmVlZGVk
LCBpbmNsdWRpbmcgcHNldWRvLXN0b3BzIGF0IHRoZQorLy8gZW5kcyBhcyBuZWNlc3NhcnkuCitz
dGF0aWMgc2l6ZV90IHRvdGFsU3RvcHNOZWVkZWQoY29uc3QgR3JhZGllbnQ6OkNvbG9yU3RvcCog
c3RvcERhdGEsIHNpemVfdCBjb3VudCkKK3sKKyAgICAvLyBOLkIuOiBUaGUgdGVzdHMgaW4gdGhp
cyBmdW5jdGlvbiBzaG91bGQga2VwdCBpbiBzeW5jIHdpdGggdGhlIG9uZXMgaW4KKyAgICAvLyBm
aWxsU3RvcHMoKSwgb3IgYmFkbmVzcyBoYXBwZW5zLgorICAgIGNvbnN0IEdyYWRpZW50OjpDb2xv
clN0b3AqIHN0b3AgPSBzdG9wRGF0YTsKKyAgICBzaXplX3QgY291bnRVc2VkID0gY291bnQ7Cisg
ICAgaWYgKGNvdW50IDwgMSB8fCBzdG9wLT5zdG9wID4gMC4wKQorICAgICAgICBjb3VudFVzZWQr
KzsKKyAgICBzdG9wICs9IGNvdW50IC0gMTsKKyAgICBpZiAoY291bnQgPCAxIHx8IHN0b3AtPnN0
b3AgPCAxLjApCisgICAgICAgIGNvdW50VXNlZCsrOworICAgIHJldHVybiBjb3VudFVzZWQ7Cit9
CisKKy8vIENvbGxlY3Qgc29ydGVkIHN0b3AgcG9zaXRpb24gYW5kIGNvbG9yIGluZm9ybWF0aW9u
IGludG8gdGhlIHBvcyBhbmQgY29sb3JzCisvLyBidWZmZXJzLCBlbnN1cmluZyBzdG9wcyBhdCBi
b3RoIDAuMCBhbmQgMS4wLiBUaGUgYnVmZmVycyBtdXN0IGJlIGxhcmdlCisvLyBlbm91Z2ggdG8g
aG9sZCBpbmZvcm1hdGlvbiBmb3IgYWxsIHN0b3BzLCBpbmNsdWRpbmcgdGhlIG5ldyBlbmRwb2lu
dHMgaWYKKy8vIHN0b3BzIGF0IDAuMCBhbmQgMS4wIGFyZW4ndCBhbHJlYWR5IGluY2x1ZGVkLgor
c3RhdGljIHZvaWQgZmlsbFN0b3BzKGNvbnN0IEdyYWRpZW50OjpDb2xvclN0b3AqIHN0b3BEYXRh
LCBzaXplX3QgY291bnQsIGZsb2F0KiBwb3MsIHVuc2lnbmVkKiBjb2xvcnMpCit7CisgICAgY29u
c3QgR3JhZGllbnQ6OkNvbG9yU3RvcCogc3RvcCA9IHN0b3BEYXRhOworICAgIHNpemVfdCBzdGFy
dCA9IDA7CisgICAgaWYgKGNvdW50IDwgMSkgeworICAgICAgICAvLyBBIGdyYWRpZW50IHdpdGgg
bm8gc3RvcHMgbXVzdCBiZSB0cmFuc3BhcmVudCBibGFjay4KKyAgICAgICAgcG9zWzBdID0gMC4w
OworICAgICAgICBjb2xvcnNbMF0gPSAwOworICAgICAgICBzdGFydCA9IDE7CisgICAgfSBlbHNl
IGlmIChzdG9wLT5zdG9wID4gMC4wKSB7CisgICAgICAgIC8vIENvcHkgdGhlIGZpcnN0IHN0b3Ag
dG8gMC4wLiBUaGUgZmlyc3Qgc3RvcCBwb3NpdGlvbiBtYXkgaGF2ZSBhIHNsaWdodAorICAgICAg
ICAvLyByb3VuZGluZyBlcnJvciwgYnV0IHdlIGRvbid0IGNhcmUgaW4gdGhpcyBmbG9hdCBjb21w
YXJpc29uLCBzaW5jZQorICAgICAgICAvLyAwLjAgY29tZXMgdGhyb3VnaCBjbGVhbmx5IGFuZCBw
ZW9wbGUgYXJlbid0IGxpa2VseSB0byB3YW50IGEgZ3JhZGllbnQKKyAgICAgICAgLy8gd2l0aCBh
IHN0b3AgYXQgKDAgKyBlcHNpbG9uKS4KKyAgICAgICAgcG9zWzBdID0gMC4wOworICAgICAgICBj
b2xvcnNbMF0gPSBDb2xvcihzdG9wLT5yZWQsIHN0b3AtPmdyZWVuLCBzdG9wLT5ibHVlLCBzdG9w
LT5hbHBoYSkucmdiKCk7CisgICAgICAgIHN0YXJ0ID0gMTsKKyAgICB9CisKKyAgICBmb3IgKHNp
emVfdCBpID0gc3RhcnQ7IGkgPCBzdGFydCArIGNvdW50OyBpKyspIHsKKyAgICAgICAgcG9zW2ld
ID0gc3RvcC0+c3RvcDsKKyAgICAgICAgY29sb3JzW2ldID0gQ29sb3Ioc3RvcC0+cmVkLCBzdG9w
LT5ncmVlbiwgc3RvcC0+Ymx1ZSwgc3RvcC0+YWxwaGEpLnJnYigpOworICAgICAgICArK3N0b3A7
CisgICAgfQorCisgICAgLy8gQ29weSB0aGUgbGFzdCBzdG9wIHRvIDEuMCBpZiBuZWVkZWQuIFNl
ZSBjb21tZW50IGFib3ZlIGFib3V0IHRoaXMgZmxvYXQKKyAgICAvLyBjb21wYXJpc29uLgorICAg
IGlmIChjb3VudCA8IDEgfHwgKC0tc3RvcCktPnN0b3AgPCAxLjApIHsKKyAgICAgICAgcG9zW3N0
YXJ0ICsgY291bnRdID0gMS4wOworICAgICAgICBjb2xvcnNbc3RhcnQgKyBjb3VudF0gPSBjb2xv
cnNbc3RhcnQgKyBjb3VudCAtIDFdOworICAgIH0KK30KKworCitCbGFja0JlcnJ5OjpQbGF0Zm9y
bTo6R3JhcGhpY3M6OkdyYWRpZW50KiBHcmFkaWVudDo6cGxhdGZvcm1HcmFkaWVudCgpCit7Cisg
ICAgaWYgKG1fZ3JhZGllbnQpCisgICAgICAgIHJldHVybiBtX2dyYWRpZW50OworCisgICAgaWYg
KG1fcmFkaWFsKQorICAgICAgICBtX2dyYWRpZW50ID0gQmxhY2tCZXJyeTo6UGxhdGZvcm06Okdy
YXBoaWNzOjpHcmFkaWVudDo6Y3JlYXRlUmFkaWFsR3JhZGllbnQobV9wMCwgbV9wMSwgbV9yMCwg
bV9yMSwgbV9hc3BlY3RSYXRpbywgKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6R3Jh
ZGllbnQ6OlNwcmVhZE1ldGhvZCltX3NwcmVhZE1ldGhvZCk7CisgICAgZWxzZQorICAgICAgICBt
X2dyYWRpZW50ID0gQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpHcmFkaWVudDo6Y3Jl
YXRlTGluZWFyR3JhZGllbnQobV9wMCwgbV9wMSwgKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFw
aGljczo6R3JhZGllbnQ6OlNwcmVhZE1ldGhvZCltX3NwcmVhZE1ldGhvZCk7CisKKyAgICBzb3J0
U3RvcHNJZk5lY2Vzc2FyeSgpOworICAgIEFTU0VSVChtX3N0b3BzU29ydGVkKTsKKworICAgIHNp
emVfdCBjb3VudFVzZWQgPSB0b3RhbFN0b3BzTmVlZGVkKG1fc3RvcHMuZGF0YSgpLCBtX3N0b3Bz
LnNpemUoKSk7CisgICAgQVNTRVJUKGNvdW50VXNlZCA+PSAyKTsKKyAgICBBU1NFUlQoY291bnRV
c2VkID49IG1fc3RvcHMuc2l6ZSgpKTsKKworICAgIFZlY3RvcjxmbG9hdD4gcG9zKGNvdW50VXNl
ZCk7CisgICAgVmVjdG9yPHVuc2lnbmVkPiBjb2xvcnMoY291bnRVc2VkKTsKKyAgICBmaWxsU3Rv
cHMobV9zdG9wcy5kYXRhKCksIG1fc3RvcHMuc2l6ZSgpLCBwb3MuZGF0YSgpLCBjb2xvcnMuZGF0
YSgpKTsKKyAgICBtX2dyYWRpZW50LT5zZXRDb2xvclN0b3BzKHBvcy5kYXRhKCksIGNvbG9ycy5k
YXRhKCksIGNvdW50VXNlZCk7CisKKyAgICBpZiAoIW1fZ3JhZGllbnRTcGFjZVRyYW5zZm9ybWF0
aW9uLmlzSWRlbnRpdHkoKSkKKyAgICAgICAgbV9ncmFkaWVudC0+c2V0TG9jYWxNYXRyaXgocmVp
bnRlcnByZXRfY2FzdDxjb25zdCBkb3VibGUqPigmbV9ncmFkaWVudFNwYWNlVHJhbnNmb3JtYXRp
b24pKTsKKworICAgIHJldHVybiBtX2dyYWRpZW50OworfQorCit2b2lkIEdyYWRpZW50OjpwbGF0
Zm9ybURlc3Ryb3koKQoreworICAgIGRlbGV0ZSBtX2dyYWRpZW50OworICAgIG1fZ3JhZGllbnQg
PSAwOworfQorCit2b2lkIEdyYWRpZW50OjpmaWxsKEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwg
Y29uc3QgRmxvYXRSZWN0JiByZWN0KQoreworICAgIHBsYXRmb3JtR3JhZGllbnQoKS0+ZmlsbChj
b250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKSwgcmVjdCk7Cit9CisKK3ZvaWQgR3JhZGllbnQ6OnNl
dFBsYXRmb3JtR3JhZGllbnRTcGFjZVRyYW5zZm9ybShjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIGdy
YWRpZW50U3BhY2VUcmFuc2Zvcm1hdGlvbikKK3sKKyAgICBwbGF0Zm9ybUdyYWRpZW50KCktPnNl
dExvY2FsTWF0cml4KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZG91YmxlKj4oJmdyYWRpZW50U3Bh
Y2VUcmFuc2Zvcm1hdGlvbikpOworfQorCit9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L0dyYXBoaWNzQ29udGV4dEJsYWNrQmVycnkuY3Bw
IGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9HcmFwaGljc0Nv
bnRleHRCbGFja0JlcnJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5jMjlmODZkNGQ0ZTgwNWVkZTcwMDk3Nzll
MTFjZmY4MjVjZjhjZGU2Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9HcmFwaGljc0NvbnRleHRCbGFja0JlcnJ5LmNwcApAQCAt
MCwwICsxLDQ3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBSZXNlYXJjaCBJbiBNb3Rp
b24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMg
ZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkg
aXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBM
aWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRo
ZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkg
bGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhl
IGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5U
WTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJ
VFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICog
TGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZ
b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwg
UHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRl
IHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBT
dHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworI2lu
Y2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorCisjaW5jbHVk
ZSAiQWZmaW5lVHJhbnNmb3JtLmgiCisjaW5jbHVkZSAiR3JhZGllbnQuaCIKKyNpbmNsdWRlICJH
cmFwaGljc0NvbnRleHQzRC5oIgorI2luY2x1ZGUgIktVUkwuaCIKKyNpbmNsdWRlICJOb3RJbXBs
ZW1lbnRlZC5oIgorI2luY2x1ZGUgIlRyYW5zZm9ybWF0aW9uTWF0cml4LmgiCisKKyNpbmNsdWRl
IDxCbGFja0JlcnJ5UGxhdGZvcm1HcmFwaGljc0NvbnRleHQuaD4KKyNpbmNsdWRlIDxzdGRpby5o
PgorI2luY2x1ZGUgPHd0Zi9Bc3NlcnRpb25zLmg+CisjaW5jbHVkZSA8d3RmL01hdGhFeHRyYXMu
aD4KKyNpbmNsdWRlIDx3dGYvVW51c2VkUGFyYW0uaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+
CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Q
cml2YXRlIHsKK3B1YmxpYzoKKyAgICBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoUGxh
dGZvcm1HcmFwaGljc0NvbnRleHQqIHBsYXRmb3JtQ29udGV4dCkKKyAgICAgICAgOiBtX3BsYXRm
b3JtQ29udGV4dChwbGF0Zm9ybUNvbnRleHQpCisgICAgICAgICwgbV9pc0NvbXBvc2l0ZWQoZmFs
c2UpCisgICAgeworICAgIH0KKworICAgIFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0KiBtX3BsYXRm
b3JtQ29udGV4dDsKKyAgICBib29sIG1faXNDb21wb3NpdGVkOworfTsKKwordm9pZCBHcmFwaGlj
c0NvbnRleHQ6OnBsYXRmb3JtSW5pdChQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dCogcGxhdGZvcm1D
b250ZXh0KQoreworICAgIG1fZGF0YSA9IG5ldyBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZh
dGUocGxhdGZvcm1Db250ZXh0KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnBsYXRmb3Jt
RGVzdHJveSgpCit7CisgICAgZGVsZXRlIG1fZGF0YTsKK30KKworUGxhdGZvcm1HcmFwaGljc0Nv
bnRleHQqIEdyYXBoaWNzQ29udGV4dDo6cGxhdGZvcm1Db250ZXh0KCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gbV9kYXRhLT5tX3BsYXRmb3JtQ29udGV4dDsKK30KKwordm9pZCBHcmFwaGljc0NvbnRl
eHQ6OnNhdmVQbGF0Zm9ybVN0YXRlKCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQor
ICAgICAgICByZXR1cm47CisKKyAgICBwbGF0Zm9ybUNvbnRleHQoKS0+c2F2ZSgpOworfQorCit2
b2lkIEdyYXBoaWNzQ29udGV4dDo6cmVzdG9yZVBsYXRmb3JtU3RhdGUoKQoreworICAgIGlmIChw
YWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIHBsYXRmb3JtQ29udGV4
dCgpLT5yZXN0b3JlKCk7CisgICAgcGxhdGZvcm1Db250ZXh0KCktPnNldEZpbGxDb2xvcihtX3N0
YXRlLmZpbGxDb2xvci5yZ2IoKSk7CisgICAgaWYgKGhhc1NoYWRvdygpKQorICAgICAgICBzZXRQ
bGF0Zm9ybVNoYWRvdyhtX3N0YXRlLnNoYWRvd09mZnNldCwgbV9zdGF0ZS5zaGFkb3dCbHVyLCBt
X3N0YXRlLnNoYWRvd0NvbG9yLCBtX3N0YXRlLnNoYWRvd0NvbG9yU3BhY2UpOworICAgIGVsc2UK
KyAgICAgICAgY2xlYXJQbGF0Zm9ybVNoYWRvdygpOworICAgIHBsYXRmb3JtQ29udGV4dCgpLT5z
ZXRTdHJva2VDb2xvcihtX3N0YXRlLnN0cm9rZUNvbG9yLnJnYigpKTsKKyAgICBwbGF0Zm9ybUNv
bnRleHQoKS0+c2V0U3Ryb2tlU3R5bGUoc3RhdGljX2Nhc3Q8QmxhY2tCZXJyeTo6UGxhdGZvcm06
OkdyYXBoaWNzOjpTdHJva2VTdHlsZT4obV9zdGF0ZS5zdHJva2VTdHlsZSkpOworICAgIHBsYXRm
b3JtQ29udGV4dCgpLT5zZXRTdHJva2VUaGlja25lc3MobV9zdGF0ZS5zdHJva2VUaGlja25lc3Mp
OworICAgIHBsYXRmb3JtQ29udGV4dCgpLT5zZXRUZXh0RHJhd2luZ01vZGUobV9zdGF0ZS50ZXh0
RHJhd2luZ01vZGUpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0SXNBY2NlbGVyYXRl
ZENvbnRleHQoYm9vbCBhY2NlbGVyYXRlZCkKK3sKKyAgICBtX2RhdGEtPm1faXNDb21wb3NpdGVk
ID0gYWNjZWxlcmF0ZWQ7Cit9CisKK2Jvb2wgR3JhcGhpY3NDb250ZXh0Ojppc0FjY2VsZXJhdGVk
Q29udGV4dCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fZGF0YS0+bV9pc0NvbXBvc2l0ZWQ7Cit9
CisKK0FmZmluZVRyYW5zZm9ybSBHcmFwaGljc0NvbnRleHQ6OmdldENUTShJbmNsdWRlRGV2aWNl
U2NhbGUpIGNvbnN0Cit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0
dXJuIEFmZmluZVRyYW5zZm9ybSgpOworCisgICAgQWZmaW5lVHJhbnNmb3JtIHJlc3VsdDsKKyAg
ICBwbGF0Zm9ybUNvbnRleHQoKS0+Z2V0VHJhbnNmb3JtKChkb3VibGUqKSZyZXN1bHQpOworICAg
IHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0Ojpjb25jYXRDVE0oY29u
c3QgQWZmaW5lVHJhbnNmb3JtJiB0cmFuc2Zvcm1hdGlvbikKK3sKKyAgICBpZiAocGFpbnRpbmdE
aXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBBZmZpbmVUcmFuc2Zvcm0gY3VycmVu
dDsKKyAgICBwbGF0Zm9ybUNvbnRleHQoKS0+Z2V0VHJhbnNmb3JtKChkb3VibGUqKSZjdXJyZW50
KTsKKyAgICBjdXJyZW50ICo9IHRyYW5zZm9ybWF0aW9uOworICAgIHBsYXRmb3JtQ29udGV4dCgp
LT5zZXRUcmFuc2Zvcm0oKGRvdWJsZSopJmN1cnJlbnQpOworfQorCit2b2lkIEdyYXBoaWNzQ29u
dGV4dDo6c2V0Q1RNKGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgdHJhbnNmb3JtYXRpb24pCit7Cisg
ICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgcGxhdGZv
cm1Db250ZXh0KCktPnNldFRyYW5zZm9ybSgoY29uc3QgZG91YmxlKikmdHJhbnNmb3JtYXRpb24p
OworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2NhbGUoY29uc3QgRmxvYXRTaXplJiBzY2Fs
ZUZhY3RvcnMpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgQWZmaW5lVHJhbnNmb3JtIGN1cnJlbnQ7CisgICAgcGxhdGZvcm1Db250ZXh0KCkt
PmdldFRyYW5zZm9ybSgoZG91YmxlKikmY3VycmVudCk7CisgICAgY3VycmVudC5zY2FsZU5vblVu
aWZvcm0oc2NhbGVGYWN0b3JzLndpZHRoKCksIHNjYWxlRmFjdG9ycy5oZWlnaHQoKSk7CisgICAg
cGxhdGZvcm1Db250ZXh0KCktPnNldFRyYW5zZm9ybSgoZG91YmxlKikmY3VycmVudCk7Cit9CisK
K3ZvaWQgR3JhcGhpY3NDb250ZXh0Ojpyb3RhdGUoZmxvYXQgcmFkaWFucykKK3sKKyAgICBpZiAo
cGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBBZmZpbmVUcmFuc2Zv
cm0gY3VycmVudDsKKyAgICBwbGF0Zm9ybUNvbnRleHQoKS0+Z2V0VHJhbnNmb3JtKChkb3VibGUq
KSZjdXJyZW50KTsKKyAgICBjdXJyZW50LnJvdGF0ZShyYWQyZGVnKHJhZGlhbnMpKTsKKyAgICBw
bGF0Zm9ybUNvbnRleHQoKS0+c2V0VHJhbnNmb3JtKChkb3VibGUqKSZjdXJyZW50KTsKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQ6OnRyYW5zbGF0ZShmbG9hdCBkeCwgZmxvYXQgZHkpCit7Cisg
ICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgQWZmaW5l
VHJhbnNmb3JtIGN1cnJlbnQ7CisgICAgcGxhdGZvcm1Db250ZXh0KCktPmdldFRyYW5zZm9ybSgo
ZG91YmxlKikmY3VycmVudCk7CisgICAgY3VycmVudC50cmFuc2xhdGUoZHgsIGR5KTsKKyAgICBw
bGF0Zm9ybUNvbnRleHQoKS0+c2V0VHJhbnNmb3JtKChkb3VibGUqKSZjdXJyZW50KTsKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdFbGxpcHNlKGNvbnN0IEludFJlY3QmIHJlY3QpCit7
CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgcGxh
dGZvcm1Db250ZXh0KCktPmFkZEVsbGlwc2UoRmxvYXRSZWN0KHJlY3QpKTsKK30KKwordm9pZCBH
cmFwaGljc0NvbnRleHQ6OnN0cm9rZUFyYyhjb25zdCBJbnRSZWN0JiByZWN0LCBpbnQgc3RhcnRB
bmdsZSwgaW50IGFuZ2xlU3BhbikKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAg
ICAgICByZXR1cm47CisKKyAgICBwbGF0Zm9ybUNvbnRleHQoKS0+YWRkQXJjKHJlY3QsIHN0YXJ0
QW5nbGUsIGFuZ2xlU3Bhbik7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3Q29udmV4
UG9seWdvbihzaXplX3QgbnVtUG9pbnRzLCBjb25zdCBGbG9hdFBvaW50KiBwb2ludHMsIGJvb2wg
c2hvdWxkQW50aWFsaWFzKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAg
IHJldHVybjsKKworICAgIHBsYXRmb3JtQ29udGV4dCgpLT5hZGRDb252ZXhQb2x5Z29uKG51bVBv
aW50cywgKGNvbnN0IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpGbG9hdFBvaW50Kilwb2ludHMpOwor
fQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd1JlY3QoY29uc3QgSW50UmVjdCYgcmVjdCkK
K3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBw
bGF0Zm9ybUNvbnRleHQoKS0+YWRkRHJhd1JlY3QoRmxvYXRSZWN0KHJlY3QpKTsKK30KKwordm9p
ZCBHcmFwaGljc0NvbnRleHQ6OmZpbGxSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKK3sKKyAg
ICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBCbGFja0Jl
cnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OkdyYWRpZW50KiBwbGF0Zm9ybUdyYWRpZW50ID0gZmls
bEdyYWRpZW50KCkgPyBmaWxsR3JhZGllbnQoKS0+cGxhdGZvcm1HcmFkaWVudCgpIDogMDsKKyAg
ICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OlBhdHRlcm4qIHBsYXRmb3JtUGF0dGVy
biA9IGZpbGxQYXR0ZXJuKCkgPyBmaWxsUGF0dGVybigpLT5wbGF0Zm9ybVBhdHRlcm4oQWZmaW5l
VHJhbnNmb3JtKCkpIDogMDsKKyAgICBwbGF0Zm9ybUNvbnRleHQoKS0+YWRkRmlsbFJlY3QocmVj
dCwgcGxhdGZvcm1HcmFkaWVudCwgcGxhdGZvcm1QYXR0ZXJuKTsKK30KKwordm9pZCBHcmFwaGlj
c0NvbnRleHQ6OmZpbGxSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCwgY29uc3QgQ29sb3ImIGNv
bG9yLCBDb2xvclNwYWNlIGNvbG9yU3BhY2UpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQo
KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgcGxhdGZvcm1Db250ZXh0KCktPnNldEZpbGxDb2xv
cihjb2xvci5yZ2IoKSk7CisgICAgcGxhdGZvcm1Db250ZXh0KCktPmFkZEZpbGxSZWN0KHJlY3Qp
OworICAgIHBsYXRmb3JtQ29udGV4dCgpLT5zZXRGaWxsQ29sb3IobV9zdGF0ZS5maWxsQ29sb3Iu
cmdiKCkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xlYXJSZWN0KGNvbnN0IEZsb2F0
UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1
cm47CisKKyAgICBwbGF0Zm9ybUNvbnRleHQoKS0+YWRkQ2xlYXJSZWN0KHJlY3QpOworfQorCit2
b2lkIEdyYXBoaWNzQ29udGV4dDo6c3Ryb2tlUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QsIGZs
b2F0IGxpbmVXaWR0aCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBpZiAoc3Ryb2tlR3JhZGllbnQoKSB8fCBzdHJva2VQYXR0ZXJuKCkpIHsK
KyAgICAgICAgUGF0aCBwYXRoOworICAgICAgICBwYXRoLmFkZFJlY3QocmVjdCk7CisgICAgICAg
IGZsb2F0IG9sZExpbmVXaWR0aCA9IG1fc3RhdGUuc3Ryb2tlVGhpY2tuZXNzOworICAgICAgICBz
ZXRQbGF0Zm9ybVN0cm9rZVRoaWNrbmVzcyhsaW5lV2lkdGgpOworICAgICAgICBzdHJva2VQYXRo
KHBhdGgpOworICAgICAgICBzZXRQbGF0Zm9ybVN0cm9rZVRoaWNrbmVzcyhvbGRMaW5lV2lkdGgp
OworICAgIH0gZWxzZQorICAgICAgICBwbGF0Zm9ybUNvbnRleHQoKS0+YWRkU3Ryb2tlUmVjdChy
ZWN0LCBsaW5lV2lkdGgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZmlsbFJvdW5kZWRS
ZWN0KGNvbnN0IEludFJlY3QmIHJlY3QsIGNvbnN0IEludFNpemUmIHRvcExlZnQsIGNvbnN0IElu
dFNpemUmIHRvcFJpZ2h0LCBjb25zdCBJbnRTaXplJiBib3R0b21MZWZ0LCBjb25zdCBJbnRTaXpl
JiBib3R0b21SaWdodCwgY29uc3QgQ29sb3ImIGNvbG9yLCBDb2xvclNwYWNlIGNvbG9yU3BhY2Up
Cit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
QmxhY2tCZXJyeTo6UGxhdGZvcm06OkZsb2F0Um91bmRlZFJlY3QgciA9IEJsYWNrQmVycnk6OlBs
YXRmb3JtOjpGbG9hdFJvdW5kZWRSZWN0KEZsb2F0UmVjdChyZWN0KSwgRmxvYXRTaXplKHRvcExl
ZnQpLCBGbG9hdFNpemUodG9wUmlnaHQpLCBGbG9hdFNpemUoYm90dG9tTGVmdCksIEZsb2F0U2l6
ZShib3R0b21SaWdodCkpOworICAgIHBsYXRmb3JtQ29udGV4dCgpLT5zZXRGaWxsQ29sb3IoY29s
b3IucmdiKCkpOworICAgIHBsYXRmb3JtQ29udGV4dCgpLT5hZGRSb3VuZGVkUmVjdChyKTsKKyAg
ICBwbGF0Zm9ybUNvbnRleHQoKS0+c2V0RmlsbENvbG9yKG1fc3RhdGUuZmlsbENvbG9yLnJnYigp
KTsKK30KKworRmxvYXRSZWN0IEdyYXBoaWNzQ29udGV4dDo6cm91bmRUb0RldmljZVBpeGVscyhj
b25zdCBGbG9hdFJlY3QmIHJlY3QsIFJvdW5kaW5nTW9kZSByb3VuZGluZ01vZGUpCit7CisgICAg
cmV0dXJuIHJlY3Q7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybVNoYWRv
dyhjb25zdCBGbG9hdFNpemUmIG9mZnNldCwgZmxvYXQgYmx1ciwgY29uc3QgQ29sb3ImIGNvbG9y
LCBDb2xvclNwYWNlIGNvbG9yU3BhY2UpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgRmxvYXRTaXplIGFkanVzdGVkT2Zmc2V0ID0gb2Zmc2V0
OworCisgICAgaWYgKG1fc3RhdGUuc2hhZG93c0lnbm9yZVRyYW5zZm9ybXMpIHsKKyAgICAgICAg
Ly8gTWVhbmluZyB0aGF0IHRoaXMgZ3JhcGhpY3MgY29udGV4dCBpcyBhc3NvY2lhdGVkIHdpdGgg
YSBDYW52YXNSZW5kZXJpbmdDb250ZXh0CisgICAgICAgIC8vIFdlIGZsaXAgdGhlIGhlaWdodCBz
aW5jZSBDRyBhbmQgSFRNTDUgQ2FudmFzIGhhdmUgb3Bwb3NpdGUgWSBheGlzCisgICAgICAgIGFk
anVzdGVkT2Zmc2V0LnNldEhlaWdodCgtb2Zmc2V0LmhlaWdodCgpKTsKKyAgICB9CisKKyAgICAv
LyBpZiB0aGVyZSBpcyBhbiBpbnZhbGlkIHNoYWRvdyBjb2xvciwgd2UncmUgc3VwcG9zZWQgdG8g
dXNlIEFwcGxlJ3MgQ0cgZGVmYXVsdAorICAgIHBsYXRmb3JtQ29udGV4dCgpLT5zZXRTaGFkb3co
YWRqdXN0ZWRPZmZzZXQsIGJsdXIsIGNvbG9yLmlzVmFsaWQoKSA/IGNvbG9yLnJnYigpIDogbWFr
ZVJHQkEoMCwgMCwgMCwgMHhGRiAvIDMpLCBtX3N0YXRlLnNoYWRvd3NJZ25vcmVUcmFuc2Zvcm1z
KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsZWFyUGxhdGZvcm1TaGFkb3coKQorewor
ICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIHBsYXRm
b3JtQ29udGV4dCgpLT5jbGVhclNoYWRvdygpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6
YmVnaW5QbGF0Zm9ybVRyYW5zcGFyZW5jeUxheWVyKGZsb2F0IG9wYWNpdHkpCit7CisgICAgaWYg
KHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgcGxhdGZvcm1Db250
ZXh0KCktPmJlZ2luUGxhdGZvcm1UcmFuc3BhcmVuY3lMYXllcihvcGFjaXR5KTsKK30KKwordm9p
ZCBHcmFwaGljc0NvbnRleHQ6OmVuZFBsYXRmb3JtVHJhbnNwYXJlbmN5TGF5ZXIoKQoreworICAg
IGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIHBsYXRmb3Jt
Q29udGV4dCgpLT5lbmRQbGF0Zm9ybVRyYW5zcGFyZW5jeUxheWVyKCk7Cit9CisKK2Jvb2wgR3Jh
cGhpY3NDb250ZXh0OjpzdXBwb3J0c1RyYW5zcGFyZW5jeUxheWVycygpCit7CisgICAgcmV0dXJu
IHRydWU7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRMaW5lQ2FwKExpbmVDYXAgbGMp
Cit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
cGxhdGZvcm1Db250ZXh0KCktPnNldExpbmVDYXAoKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFw
aGljczo6TGluZUNhcClsYyk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRMaW5lRGFz
aChjb25zdCBEYXNoQXJyYXkmIGRhc2hlcywgZmxvYXQgZGFzaE9mZnNldCkKK3sKKyAgICBpZiAo
cGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBwbGF0Zm9ybUNvbnRl
eHQoKS0+c2V0TGluZURhc2goZGFzaGVzLmRhdGEoKSwgZGFzaGVzLnNpemUoKSwgZGFzaE9mZnNl
dCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRMaW5lSm9pbihMaW5lSm9pbiBsaikK
K3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBw
bGF0Zm9ybUNvbnRleHQoKS0+c2V0TGluZUpvaW4oKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFw
aGljczo6TGluZUpvaW4pbGopOyAvLyBuYW1pbmcgY29pbmNpZGVzCit9CisKK3ZvaWQgR3JhcGhp
Y3NDb250ZXh0OjpzZXRNaXRlckxpbWl0KGZsb2F0IGxpbWl0KQoreworICAgIGlmIChwYWludGlu
Z0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIHBsYXRmb3JtQ29udGV4dCgpLT5z
ZXRNaXRlckxpbWl0KGxpbWl0KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldEFscGhh
KGZsb2F0IG9wYWNpdHkpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgcGxhdGZvcm1Db250ZXh0KCktPnNldEFscGhhKG9wYWNpdHkpOworfQor
CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpjbGlwKGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKK3sK
KyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBwbGF0
Zm9ybUNvbnRleHQoKS0+Y2xpcChyZWN0KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmNs
aXBPdXQoY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgp
KQorICAgICAgICByZXR1cm47CisKKyAgICBwbGF0Zm9ybUNvbnRleHQoKS0+Y2xpcE91dChGbG9h
dFJlY3QocmVjdCkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcENvbnZleFBvbHln
b24oc2l6ZV90IG51bVBvaW50cywgY29uc3QgRmxvYXRQb2ludCogcG9pbnRzLCBib29sIGFudGlh
bGlhcykKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisK
KyAgICBwbGF0Zm9ybUNvbnRleHQoKS0+Y2xpcENvbnZleFBvbHlnb24obnVtUG9pbnRzLCAoY29u
c3QgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkZsb2F0UG9pbnQqKXBvaW50cyk7Cit9CisKK3ZvaWQg
R3JhcGhpY3NDb250ZXh0OjphZGRSb3VuZGVkUmVjdENsaXAoY29uc3QgUm91bmRlZFJlY3QmIHJl
Y3QpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkZsb2F0Um91bmRlZFJlY3QgciA9IEJsYWNrQmVycnk6
OlBsYXRmb3JtOjpGbG9hdFJvdW5kZWRSZWN0KAorICAgICAgICBGbG9hdFJlY3QocmVjdC5yZWN0
KCkpLAorICAgICAgICBGbG9hdFNpemUocmVjdC5yYWRpaSgpLnRvcExlZnQoKSksCisgICAgICAg
IEZsb2F0U2l6ZShyZWN0LnJhZGlpKCkudG9wUmlnaHQoKSksCisgICAgICAgIEZsb2F0U2l6ZShy
ZWN0LnJhZGlpKCkuYm90dG9tTGVmdCgpKSwKKyAgICAgICAgRmxvYXRTaXplKHJlY3QucmFkaWko
KS5ib3R0b21SaWdodCgpKSk7CisgICAgcGxhdGZvcm1Db250ZXh0KCktPmNsaXBSb3VuZGVkUmVj
dChyKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsaXBPdXRSb3VuZGVkUmVjdChjb25z
dCBSb3VuZGVkUmVjdCYgcmVjdCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAg
ICAgICByZXR1cm47CisKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6RmxvYXRSb3VuZGVkUmVj
dCByID0gQmxhY2tCZXJyeTo6UGxhdGZvcm06OkZsb2F0Um91bmRlZFJlY3QoCisgICAgICAgIEZs
b2F0UmVjdChyZWN0LnJlY3QoKSksCisgICAgICAgIEZsb2F0U2l6ZShyZWN0LnJhZGlpKCkudG9w
TGVmdCgpKSwKKyAgICAgICAgRmxvYXRTaXplKHJlY3QucmFkaWkoKS50b3BSaWdodCgpKSwKKyAg
ICAgICAgRmxvYXRTaXplKHJlY3QucmFkaWkoKS5ib3R0b21MZWZ0KCkpLAorICAgICAgICBGbG9h
dFNpemUocmVjdC5yYWRpaSgpLmJvdHRvbVJpZ2h0KCkpKTsKKyAgICBwbGF0Zm9ybUNvbnRleHQo
KS0+Y2xpcE91dFJvdW5kZWRSZWN0KHIpOworfQorCitJbnRSZWN0IEdyYXBoaWNzQ29udGV4dDo6
Y2xpcEJvdW5kcygpIGNvbnN0Cit7CisgICAgLy8gRklYTUU6IHJldHVybiB0aGUgbWF4IEludFJl
Y3QgZm9yIG5vdworICAgIHJldHVybiBJbnRSZWN0KEludFBvaW50KElOVF9NSU4gLyAyLCBJTlRf
TUlOIC8gMiksIEludFNpemUoSU5UX01BWCwgSU5UX01BWCkpOworfQorCisKK3ZvaWQgR3JhcGhp
Y3NDb250ZXh0OjphZGRJbm5lclJvdW5kZWRSZWN0Q2xpcChjb25zdCBJbnRSZWN0JiByZWN0LCBp
bnQgdGhpY2tuZXNzKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIGZwcmludGYoc3RkZXJyLCAiY2xpcCByb3VuZGVkIHJlY3QgJWQsJWQsJWQs
JWQgLSAlZFxuIiwgcmVjdC54KCksIHJlY3QueSgpLCByZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0
KCksIHRoaWNrbmVzcyk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRVUkxGb3JSZWN0
KGNvbnN0IEtVUkwmIGxpbmssIGNvbnN0IEludFJlY3QmIGRlc3RSZWN0KQoreworfQorCit2b2lk
IEdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZvcm1UZXh0RHJhd2luZ01vZGUoVGV4dERyYXdpbmdN
b2RlRmxhZ3MgbW9kZSkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBwbGF0Zm9ybUNvbnRleHQoKS0+c2V0VGV4dERyYXdpbmdNb2RlKG1vZGUp
OworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZvcm1TdHJva2VDb2xvcihjb25z
dCBDb2xvciYgY29sb3IsIENvbG9yU3BhY2UgY29sb3JTcGFjZSkKK3sKKyAgICBpZiAocGFpbnRp
bmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBwbGF0Zm9ybUNvbnRleHQoKS0+
c2V0U3Ryb2tlQ29sb3IoY29sb3IucmdiKCkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6
c2V0UGxhdGZvcm1TdHJva2VTdHlsZShTdHJva2VTdHlsZSBzdHJva2UpCit7CisgICAgaWYgKHBh
aW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgcGxhdGZvcm1Db250ZXh0
KCktPnNldFN0cm9rZVN0eWxlKChCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OlN0cm9r
ZVN0eWxlKXN0cm9rZSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybVN0
cm9rZVRoaWNrbmVzcyhmbG9hdCB0aGlja25lc3MpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJs
ZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgcGxhdGZvcm1Db250ZXh0KCktPnNldFN0cm9r
ZVRoaWNrbmVzcyh0aGlja25lc3MpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0UGxh
dGZvcm1GaWxsQ29sb3IoY29uc3QgQ29sb3ImIGNvbG9yLCBDb2xvclNwYWNlIGNvbG9yU3BhY2Up
Cit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
cGxhdGZvcm1Db250ZXh0KCktPnNldEZpbGxDb2xvcihjb2xvci5yZ2IoKSk7Cit9CisKK3ZvaWQg
R3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybUNvbXBvc2l0ZU9wZXJhdGlvbihDb21wb3NpdGVP
cGVyYXRvciBvcCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1
cm47CisKKyAgICBwbGF0Zm9ybUNvbnRleHQoKS0+c2V0Q29tcG9zaXRlT3BlcmF0aW9uKHN0YXRp
Y19jYXN0PEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6Q29tcG9zaXRlT3BlcmF0b3I+
KG9wKSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybVNob3VsZEFudGlh
bGlhcyhib29sIGVuYWJsZSkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAg
ICByZXR1cm47CisKKyAgICBwbGF0Zm9ybUNvbnRleHQoKS0+c2V0VXNlQW50aWFsaWFzaW5nKGVu
YWJsZSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRJbWFnZUludGVycG9sYXRpb25R
dWFsaXR5KEludGVycG9sYXRpb25RdWFsaXR5IGludGVycG9sYXRpb25RdWFsaXR5KQoreworICAg
IHBsYXRmb3JtQ29udGV4dCgpLT5zZXRIaWdoUXVhbGl0eUZpbHRlcihpbnRlcnBvbGF0aW9uUXVh
bGl0eSAhPSBJbnRlcnBvbGF0aW9uTm9uZSk7Cit9CisKK0ludGVycG9sYXRpb25RdWFsaXR5IEdy
YXBoaWNzQ29udGV4dDo6aW1hZ2VJbnRlcnBvbGF0aW9uUXVhbGl0eSgpIGNvbnN0Cit7CisgICAg
cmV0dXJuIHBsYXRmb3JtQ29udGV4dCgpLT5oaWdoUXVhbGl0eUZpbHRlcigpID8gSW50ZXJwb2xh
dGlvbkRlZmF1bHQgOiBJbnRlcnBvbGF0aW9uTm9uZTsKK30KKworfQpkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9JVHlwZVV0aWxzLmggYi9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L0lUeXBlVXRpbHMuaApu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwLi5mNjE0ZjIyZGJhOTNlZjI4MjZjYTU0YjM4ZWMzYzk5MWE1YTI3Nzc0Ci0tLSAv
ZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJy
eS9JVHlwZVV0aWxzLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
MiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJp
YnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBSZXNlYXJjaCBJbiBNb3Rpb24g
TGltaXRlZCBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2Vk
IHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29m
dHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENP
TlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFS
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQK
KyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAq
LworCisjaWZuZGVmIElUeXBlVXRpbHNfaAorI2RlZmluZSBJVHlwZVV0aWxzX2gKKworI2luY2x1
ZGUgPGZzX2FwaS5oPgorCitzdGF0aWMgaW5saW5lIEZTX0ZJWEVEIGZsb2F0VG9JVHlwZUZpeGVk
KGZsb2F0IGYpIHsgcmV0dXJuIHN0YXRpY19jYXN0PEZTX0ZJWEVEPihmICogNjU1MzYuMCk7IH0K
K3N0YXRpYyBpbmxpbmUgRlNfRklYRUQgaW50VG9JVHlwZUZpeGVkKGludCBpKSB7IHJldHVybiBz
dGF0aWNfY2FzdDxGU19GSVhFRD4oaSA8PCAxNik7IH0KKworc3RhdGljIGlubGluZSBmbG9hdCBp
VHlwZUZpeGVkVG9GbG9hdChGU19GSVhFRCBuKSB7IHJldHVybiBuIC8gNjU1MzYuMDsgfQorCitz
dGF0aWMgY29uc3QgRlNfRklYRUQgTUFYSVRZUEVGT05UU0NBTEUgPSBpbnRUb0lUeXBlRml4ZWQo
MTAwMDApIC0gMTsKKworI2VuZGlmIC8vIElUeXBlVXRpbHNfaApkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9JbWFnZUJ1ZmZlckJsYWNrQmVy
cnkuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9JbWFn
ZUJ1ZmZlckJsYWNrQmVycnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjBhMDliNThmOTBiNTUzNWVhODQ3Mjcz
NTMxMTA3MDAzYmZkNWY0NmUKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L0ltYWdlQnVmZmVyQmxhY2tCZXJyeS5jcHAKQEAgLTAs
MCArMSwzMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAsIDIwMTEsIDIwMTIg
UmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
VGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu
ZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5l
cmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUg
Rm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5
b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRp
c3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lU
SE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgor
ICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAg
U2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRl
dGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05V
IExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFy
eTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5j
LiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMw
MSAgVVNBCisgKi8KKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJJbWFnZUJ1ZmZlci5o
IgorCisjaW5jbHVkZSAiQmFzZTY0LmgiCisjaW5jbHVkZSAiQml0bWFwSW1hZ2UuaCIKKyNpbmNs
dWRlICJIb3N0V2luZG93LmgiCisjaW5jbHVkZSAiSW1hZ2VEYXRhLmgiCisjaW5jbHVkZSAiSlBF
R0ltYWdlRW5jb2Rlci5oIgorI2luY2x1ZGUgIkxheWVyTWVzc2FnZS5oIgorI2luY2x1ZGUgIlBO
R0ltYWdlRW5jb2Rlci5oIgorI2luY2x1ZGUgIlRpbGVkSW1hZ2UuaCIKKworI2luY2x1ZGUgPEJs
YWNrQmVycnlQbGF0Zm9ybUdMRVMyQ29udGV4dFN0YXRlLmg+CisjaW5jbHVkZSA8QmxhY2tCZXJy
eVBsYXRmb3JtR3JhcGhpY3MuaD4KKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1HcmFwaGlj
c0NvbnRleHQuaD4KKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1TZXR0aW5ncy5oPgorI2lu
Y2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybVdpbmRvdy5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1dU
RlN0cmluZy5oPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgV2ViQ29yZSB7
CisKK3N0YXRpYyBib29sIG1ha2VCdWZmZXJDdXJyZW50KEhvc3RXaW5kb3cqIHdpbmRvdykKK3sK
KyAgICBBU1NFUlQoaXNDb21wb3NpdGluZ1RocmVhZCgpKTsKKworICAgIGlmICh3aW5kb3cgJiYg
d2luZG93LT5wbGF0Zm9ybVBhZ2VDbGllbnQoKSkgeworICAgICAgICBpZiAoQmxhY2tCZXJyeTo6
UGxhdGZvcm06OkdyYXBoaWNzOjpXaW5kb3cqIHBsYXRmb3JtV2luZG93ID0gd2luZG93LT5wbGF0
Zm9ybVBhZ2VDbGllbnQoKS0+cGxhdGZvcm1XaW5kb3coKSkgeworICAgICAgICAgICAgaWYgKEJs
YWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6bWFrZUJ1ZmZlckN1cnJlbnQocGxhdGZvcm1X
aW5kb3ctPmJ1ZmZlcigpLCBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OkdMRVMyKSkK
KyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8v
IElmIHdlIGRvbid0IGhhdmUgYSB3aW5kb3cgYnV0IHRoZSBhcHBsaWNhdGlvbiBzdGF0ZSBzYXZl
ciBpcyBlbmFibGVkLAorICAgIC8vIHdlJ3JlIHVzaW5nIGEgQmxhY2tCZXJyeTo6V2ViS2l0OjpX
ZWJQYWdlQ29tcG9zaXRvciBmb3IgcmVuZGVyaW5nLAorICAgIC8vIHRoYXQgbWFrZXMgc3VyZSBh
IGNvbnRleHQgaXMgYWx3YXlzIGN1cnJlbnQgb24gdGhlIGNvbXBvc2l0aW5nIHRocmVhZC4KKyAg
ICBpZiAoQmxhY2tCZXJyeTo6UGxhdGZvcm06OlNldHRpbmdzOjppc0dMRVMyQXBwU3RhdGVTYXZl
ckVuYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBPdGhlcndpc2UsIHdl
J2xsIGhhdmUgdG8gdHJ5IGFuZCBmYWxsIGJhY2sgdG8gb3VyIGxhc3QgaG9wZS4KKyAgICByZXR1
cm4gQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjptYWtlU2hhcmVkUmVzb3VyY2VDb250
ZXh0Q3VycmVudChCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OkdMRVMyKTsKK30KKwor
c3RhdGljIGJvb2wgZ2V0SW1hZ2VEYXRhSW50ZXJuYWwoR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0
LCBjb25zdCBJbnRSZWN0JiByZWN0LCBjb25zdCBJbnRSZWN0JiBzaXplLCB1bnNpZ25lZCBjaGFy
KiByZXN1bHQsIGJvb2wgdW5tdWx0aXBseSwgSG9zdFdpbmRvdyogd2luZG93KQoreworICAgIGlm
ICghbWFrZUJ1ZmZlckN1cnJlbnQod2luZG93KSkgeworICAgICAgICBCbGFja0JlcnJ5OjpQbGF0
Zm9ybTo6bG9nQWx3YXlzKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbFdhcm4sCisgICAg
ICAgICAgICAiSW1hZ2VCdWZmZXJCbGFja0JlcnJ5IGdldEltYWdlRGF0YUludGVybmFsKCkgZXJy
b3I6IGNhbm5vdCBtYWtlIGJ1ZmZlciBjdXJyZW50LCByZXR1cm5pbmcgemVyb2VkLW91dCBwaXhl
bHMuIik7CisgICAgICAgIG1lbXNldChyZXN1bHQsIDAsIHJlY3Qud2lkdGgoKSAqIHJlY3QuaGVp
Z2h0KCkgKiA0KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIHJlYWRQ
aXhlbHMgY2FuIGNhbGwgdXBkYXRlQmFja2luZyB3aGljaCBkcmF3cyB0aGUgZGlzcGxheSBsaXN0
LiBUaGlzIGlzIG91dC1vZi1iYW5kIHJlbmRlcmluZyBhbmQgd2UgbmVlZAorICAgIC8vIHRvIHBy
b3RlY3QgdGhlIGVtYmVkZGVyIGZyb20gc3RhdGUgbXV0YXRpb25zLgorICAgIEJsYWNrQmVycnk6
OlBsYXRmb3JtOjpHcmFwaGljczo6R0xFUzJDb250ZXh0U3RhdGU6OkFwcFN0YXRlU2F2ZXIgYXBw
U3RhdGVTYXZlcjsKKworICAgIC8vIEFueSBwaXhlbHMgb3V0c2lkZSB0aGUgY2FudmFzIGFyZSBy
ZXR1cm5lZCBhcyB0cmFuc3BhcmVudCBibGFjayBpbiB0aGUgcmVzdWx0aW5nIEltYWdlRGF0YSBv
YmplY3QuCisgICAgaWYgKHJlY3QueCgpIDwgMAorICAgICAgICB8fCByZWN0LnkoKSA8IDAKKyAg
ICAgICAgfHwgcmVjdC5tYXhYKCkgPiBzaXplLndpZHRoKCkKKyAgICAgICAgfHwgcmVjdC5tYXhZ
KCkgPiBzaXplLmhlaWdodCgpKQorICAgICAgICBtZW1zZXQocmVzdWx0LCAwLCByZWN0LndpZHRo
KCkgKiByZWN0LmhlaWdodCgpICogNCk7CisKKyAgICBJbnRSZWN0IHN1YnJlY3QgPSByZWN0Owor
ICAgIHN1YnJlY3QuaW50ZXJzZWN0KHNpemUpOworICAgIC8vIG5vdGhpbmcgdG8gZG8gaWYgcmVj
dCBpcyBjb21wbGV0ZWx5IG91dHNpZGUgb2YgdGhlIGltYWdlIGFyZWEKKyAgICBpZiAoc3VicmVj
dC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIC8vIGFkanVzdCBmb3IgbmVn
YXRpdmUgeCBhbmQgeSBpbmRleAorICAgIGlmIChyZWN0LngoKSA8IDApCisgICAgICAgIHJlc3Vs
dCArPSAoLXJlY3QueCgpICogNCk7CisgICAgaWYgKHJlY3QueSgpIDwgMCkKKyAgICAgICAgcmVz
dWx0ICs9ICgtcmVjdC55KCkgKiByZWN0LndpZHRoKCkgKiA0KTsKKworICAgIC8vIEZJWE1FOiBX
ZSBuZWVkIHRvIGltcGxlbWVudCBhIHRpbGVkIGJ1ZmZlci4KKyAgICBjb25zdCBpbnQgbWF4VGls
ZVNpemUgPSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OlRpbGVkSW1hZ2U6OmRlZmF1
bHRUaWxlU2l6ZSgpOworICAgIEludFJlY3QgciA9IHN1YnJlY3Q7CisgICAgSW50UmVjdCB0aWxl
UmVjdCgwLCAwLCBtYXhUaWxlU2l6ZSwgbWF4VGlsZVNpemUpOworICAgIHIuaW50ZXJzZWN0KHRp
bGVSZWN0KTsKKyAgICBpZiAoIXIuaXNFbXB0eSgpKQorICAgICAgICBjb250ZXh0LT5wbGF0Zm9y
bUNvbnRleHQoKS0+cmVhZFBpeGVscyhyLCByZXN1bHQsIHVubXVsdGlwbHkpOworICAgIHJldHVy
biB0cnVlOworfQorCit2b2lkIEltYWdlQnVmZmVyRGF0YTo6Z2V0SW1hZ2VEYXRhKEdyYXBoaWNz
Q29udGV4dCogY29udGV4dCwgY29uc3QgSW50UmVjdCYgcmVjdCwgY29uc3QgSW50UmVjdCYgc2l6
ZSwgdW5zaWduZWQgY2hhciogcmVzdWx0LCBib29sIHVubXVsdGlwbHkpIGNvbnN0Cit7CisgICAg
aWYgKCFpc0NvbXBvc2l0aW5nVGhyZWFkKCkpIHsKKyAgICAgICAgLy8gVXNlIGNyZWF0ZUZ1bmN0
aW9uQ2FsbE1lc3NhZ2UgaW5zdGVhZCBvZiBjcmVhdGVNZXRob2RDYWxsTWVzc2FnZSB0byBhdm9p
ZCBkZWFkbG9jaworICAgICAgICAvLyB3aXRoIEd1YXJkZWQgcG9pbnRlcnMuCisgICAgICAgIGRp
c3BhdGNoU3luY0NvbXBvc2l0aW5nTWVzc2FnZShCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6Y3JlYXRl
RnVuY3Rpb25DYWxsTWVzc2FnZSgKKyAgICAgICAgICAgICZnZXRJbWFnZURhdGFJbnRlcm5hbCwg
Y29udGV4dCwgcmVjdCwgc2l6ZSwgcmVzdWx0LCB1bm11bHRpcGx5LCBtX3dpbmRvdykpOworICAg
ICAgICByZXR1cm47CisgICAgfQorCisgICAgZ2V0SW1hZ2VEYXRhSW50ZXJuYWwoY29udGV4dCwg
cmVjdCwgc2l6ZSwgcmVzdWx0LCB1bm11bHRpcGx5LCBtX3dpbmRvdyk7Cit9CisKK3N0YXRpYyBi
b29sIGZsdXNoQW5kRHJhdyhjb25zdCBJbWFnZUJ1ZmZlckRhdGEqIG9iamVjdCwgR3JhcGhpY3ND
b250ZXh0KiBjb250ZXh0LCBDb2xvclNwYWNlIHN0eWxlQ29sb3JTcGFjZSwgY29uc3QgRmxvYXRS
ZWN0JiBkZXN0UmVjdCwgY29uc3QgRmxvYXRSZWN0JiBzcmNSZWN0LCBDb21wb3NpdGVPcGVyYXRv
ciBvcCwgYm9vbCB1c2VMb3dRdWFsaXR5U2NhbGUpCit7CisgICAgaWYgKCFtYWtlQnVmZmVyQ3Vy
cmVudChvYmplY3QtPm1fd2luZG93KSkgeworICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6
bG9nQWx3YXlzKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbFdhcm4sCisgICAgICAgICAg
ICAiSW1hZ2VCdWZmZXJCbGFja0JlcnJ5IGZsdXNoQW5kRHJhdygpIGVycm9yOiBjYW5ub3QgbWFr
ZSBidWZmZXIgY3VycmVudCwgaWdub3JpbmcgY2FsbC4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgIH0KKworICAgIHVzaW5nIG5hbWVzcGFjZSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3Jh
cGhpY3M7CisKKyAgICAvLyBmbHVzaEFuZERyYXdCdWZmZXIgY2FsbHMgdXBkYXRlQmFja2luZyB3
aGljaCBkcmF3cyB0aGUgZGlzcGxheSBsaXN0LiBUaGlzIGlzIG91dC1vZi1iYW5kIHJlbmRlcmlu
ZyBhbmQgd2UgbmVlZAorICAgIC8vIHRvIHByb3RlY3QgdGhlIGVtYmVkZGVyIGZyb20gc3RhdGUg
bXV0YXRpb25zLgorICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6R0xFUzJDb250
ZXh0U3RhdGU6OkFwcFN0YXRlU2F2ZXIgYXBwU3RhdGVTYXZlcjsKKworICAgIENvbXBvc2l0ZU9w
ZXJhdG9yIG9sZE9wZXJhdG9yID0gY29udGV4dC0+Y29tcG9zaXRlT3BlcmF0aW9uKCk7CisgICAg
Y29udGV4dC0+c2V0Q29tcG9zaXRlT3BlcmF0aW9uKG9wKTsKKyAgICBjb250ZXh0LT5wbGF0Zm9y
bUNvbnRleHQoKS0+Zmx1c2hBbmREcmF3QnVmZmVyKG9iamVjdC0+bV9idWZmZXIsIGRlc3RSZWN0
LCBzcmNSZWN0KTsKKyAgICBjb250ZXh0LT5zZXRDb21wb3NpdGVPcGVyYXRpb24ob2xkT3BlcmF0
b3IpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEltYWdlQnVmZmVyRGF0YTo6ZHJhdyhH
cmFwaGljc0NvbnRleHQqIHRoaXNDb250ZXh0LCBHcmFwaGljc0NvbnRleHQqIG90aGVyQ29udGV4
dCwgQ29sb3JTcGFjZSBzdHlsZUNvbG9yU3BhY2UsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3Qs
IGNvbnN0IEZsb2F0UmVjdCYgc3JjUmVjdCwgQ29tcG9zaXRlT3BlcmF0b3Igb3AsIGJvb2wgdXNl
TG93UXVhbGl0eVNjYWxlKSBjb25zdAoreworICAgIGNvbnN0IEZsb2F0UmVjdCBub3JtRGVzdFJl
Y3QgPSBkZXN0UmVjdC5ub3JtYWxpemVkKCk7CisgICAgY29uc3QgRmxvYXRSZWN0IG5vcm1TcmNS
ZWN0ID0gc3JjUmVjdC5ub3JtYWxpemVkKCk7CisKKyAgICBpZiAobm9ybVNyY1JlY3QuaXNFbXB0
eSgpIHx8IG5vcm1EZXN0UmVjdC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsgLy8gTm90aGlu
ZyB0byBkcmF3LgorCisgICAgaWYgKHRoaXNDb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKS0+aXNF
bXB0eSgpICYmIHBsYXRmb3JtQnVmZmVySGFuZGxlKG1fYnVmZmVyKSkgeworICAgICAgICBDb21w
b3NpdGVPcGVyYXRvciBvbGRPcGVyYXRvciA9IG90aGVyQ29udGV4dC0+Y29tcG9zaXRlT3BlcmF0
aW9uKCk7CisgICAgICAgIG90aGVyQ29udGV4dC0+c2V0Q29tcG9zaXRlT3BlcmF0aW9uKG9wKTsK
KyAgICAgICAgb3RoZXJDb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKS0+ZHJhd0J1ZmZlcihtX2J1
ZmZlciwgbm9ybURlc3RSZWN0LCBub3JtU3JjUmVjdCk7CisgICAgICAgIG90aGVyQ29udGV4dC0+
c2V0Q29tcG9zaXRlT3BlcmF0aW9uKG9sZE9wZXJhdG9yKTsKKyAgICB9IGVsc2UgeworICAgICAg
ICBkaXNwYXRjaFN5bmNDb21wb3NpdGluZ01lc3NhZ2UoQmxhY2tCZXJyeTo6UGxhdGZvcm06OmNy
ZWF0ZUZ1bmN0aW9uQ2FsbE1lc3NhZ2UoCisgICAgICAgICAgICAmZmx1c2hBbmREcmF3LCB0aGlz
LCBvdGhlckNvbnRleHQsIHN0eWxlQ29sb3JTcGFjZSwgbm9ybURlc3RSZWN0LCBub3JtU3JjUmVj
dCwgb3AsIHVzZUxvd1F1YWxpdHlTY2FsZSkpOworICAgIH0KK30KKworSW1hZ2VCdWZmZXI6Oklt
YWdlQnVmZmVyKGNvbnN0IEludFNpemUmIHNpemUsIGZsb2F0IHJlc29sdXRpb25TY2FsZSwgQ29s
b3JTcGFjZSBjb2xvclNwYWNlLCBSZW5kZXJpbmdNb2RlIHJlbmRlcmluZ01vZGUsIERlZmVycmFs
TW9kZSBkZWZlcnJhbE1vZGUsIEhvc3RXaW5kb3cqIHdpbmRvdywgYm9vbCYgc3VjY2VzcykKKyAg
ICA6IG1fc2l6ZShzaXplKQorICAgICwgbV9sb2dpY2FsU2l6ZShzaXplKQorICAgICwgbV9yZXNv
bHV0aW9uU2NhbGUoMSkKK3sKKyAgICBzdWNjZXNzID0gZmFsc2U7CisKKyAgICAvLyBUaGVyZSBp
cyBubyBleHBsaWNpdGx5IGRlZmluZWQgZGVmYXVsdCBjdG9yIGZvciBJbWFnZUJ1ZmZlckRhdGE6
Om1fZGF0YSwKKyAgICAvLyBvbiBwdXJwb3NlIC0gcHJlY2F1dGlvbi4gSGVuY2UgdXBvbiBjcmVh
dGlvbiBtX2RhdGEgd2lsbCBjb250YWluIGdhcmJhZ2UKKyAgICAvLyBsZWFkaW5nIHRvIGNyYXNo
IHVwIGR0b3IuIFRvIGF2b2lkIHRoZSBjYXNlLCBpbml0aWxpemUgaXQgZXhwbGljaXRseS4KKyAg
ICBtX2RhdGEubV9idWZmZXIgPSAwOworICAgIG1fZGF0YS5tX3BsYXRmb3JtTGF5ZXIgPSBudWxs
cHRyOworICAgIG1fZGF0YS5tX3dpbmRvdyA9IDA7CisKKyAgICAvLyBhbnl0aGluZyBiaWdnZXIg
dGhlbiBkZWZhdWx0VGlsZVNpemUgaXMganVzdCBhIHByb2JsZW0gZm9yIHRoZSBIVy4KKyAgICBj
b25zdCBpbnQgbWF4VGlsZVNpemUgPSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OlRp
bGVkSW1hZ2U6OmRlZmF1bHRUaWxlU2l6ZSgpOworICAgIGlmIChtYXhUaWxlU2l6ZSA8PSBzaXpl
LndpZHRoKCkgfHwgbWF4VGlsZVNpemUgPD0gc2l6ZS5oZWlnaHQoKSkgeworICAgICAgICBCbGFj
a0JlcnJ5OjpQbGF0Zm9ybTo6bG9nQWx3YXlzKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZl
bFdhcm4sICJSZXF1ZXN0ZWQgSW1hZ2VCdWZmZXIgc2l6ZSBbJWQgJWRdIGlzIHRvbyBiaWcuIEhX
IGFsbG93cyB1cCB0byBbJWQgJWRdLiIsCisgICAgICAgICAgICBzaXplLndpZHRoKCksIHNpemUu
aGVpZ2h0KCksIG1heFRpbGVTaXplLCBtYXhUaWxlU2l6ZSk7CisgICAgfQorCisgICAgbV9kYXRh
Lm1fYnVmZmVyID0gQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpjcmVhdGVCdWZmZXIo
bV9zaXplLCBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OkFsd2F5c0JhY2tlZCk7Cisg
ICAgbV9kYXRhLm1fcGxhdGZvcm1MYXllciA9IENhbnZhc0xheWVyV2ViS2l0VGhyZWFkOjpjcmVh
dGUobV9kYXRhLm1fYnVmZmVyLCBtX3NpemUpOworICAgIG1fZGF0YS5tX3dpbmRvdyA9IHdpbmRv
dzsKKyAgICBtX2NvbnRleHQgPSBhZG9wdFB0cihuZXcgR3JhcGhpY3NDb250ZXh0KGxvY2tCdWZm
ZXJEcmF3YWJsZShtX2RhdGEubV9idWZmZXIpKSk7CisgICAgbV9jb250ZXh0LT5zY2FsZShGbG9h
dFNpemUobV9yZXNvbHV0aW9uU2NhbGUsIG1fcmVzb2x1dGlvblNjYWxlKSk7CisgICAgbV9jb250
ZXh0LT5zZXRJc0FjY2VsZXJhdGVkQ29udGV4dChyZW5kZXJpbmdNb2RlID09IEFjY2VsZXJhdGVk
KTsKKyAgICBzdWNjZXNzID0gdHJ1ZTsKK30KKworSW1hZ2VCdWZmZXI6On5JbWFnZUJ1ZmZlcigp
Cit7CisgICAgbV9jb250ZXh0LmNsZWFyKCk7CisKKyAgICAvLyBFbnN1cmUgdGhhdCB3ZSBjbGVh
ciB0aGUgYnVmZmVyIGluIHRoZSBjb21wb3NpdGluZyB0aHJlYWQgYmVmb3JlIHRoZSBidWZmZXIg
aXMgZGVzdHJveWVkLgorICAgIGlmIChtX2RhdGEubV9wbGF0Zm9ybUxheWVyKSB7CisgICAgICAg
IGRpc3BhdGNoU3luY0NvbXBvc2l0aW5nTWVzc2FnZShCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6Y3Jl
YXRlRnVuY3Rpb25DYWxsTWVzc2FnZSgKKyAgICAgICAgICAgICZDYW52YXNMYXllcldlYktpdFRo
cmVhZDo6Y2xlYXJCdWZmZXIsIG1fZGF0YS5tX3BsYXRmb3JtTGF5ZXIuZ2V0KCkpKTsKKyAgICB9
CisKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OmRlc3Ryb3lCdWZmZXIobV9k
YXRhLm1fYnVmZmVyKTsKKyAgICBtX2RhdGEubV9idWZmZXIgPSAwOworfQorCitHcmFwaGljc0Nv
bnRleHQqIEltYWdlQnVmZmVyOjpjb250ZXh0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9jb250
ZXh0LmdldCgpOworfQorCitQbGF0Zm9ybUxheWVyKiBJbWFnZUJ1ZmZlcjo6cGxhdGZvcm1MYXll
cigpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fZGF0YS5tX3BsYXRmb3JtTGF5ZXIuZ2V0KCk7Cit9
CisKK1Bhc3NSZWZQdHI8SW1hZ2U+IEltYWdlQnVmZmVyOjpjb3B5SW1hZ2UoQmFja2luZ1N0b3Jl
Q29weSBjb3B5QmVoYXZpb3IpIGNvbnN0Cit7CisgICAgLy8gRklYTUUgcmVzcGVjdCBjb3B5QmVo
YXZpb3VyIGVudW0uCisgICAgdW5zaWduZWQqIGltYWdlRGF0YSA9IG5ldyB1bnNpZ25lZFttX3Np
emUud2lkdGgoKSAqIG1fc2l6ZS5oZWlnaHQoKV07CisgICAgbV9kYXRhLmdldEltYWdlRGF0YSht
X2NvbnRleHQuZ2V0KCksIEludFJlY3QoSW50UG9pbnQoMCwgMCksIG1fc2l6ZSksIEludFJlY3Qo
SW50UG9pbnQoMCwgMCksIG1fc2l6ZSksICh1bnNpZ25lZCBjaGFyKilpbWFnZURhdGEsIGZhbHNl
IC8qIHVubXVsdGlwbHkgKi8pOworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6
VGlsZWRJbWFnZSogbmF0aXZlSW1hZ2UgPSBuZXcgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBo
aWNzOjpUaWxlZEltYWdlKG1fc2l6ZSwgaW1hZ2VEYXRhLCBmYWxzZSAvKiBkYXRhSXNCR1JBICov
KTsKKyAgICByZXR1cm4gQml0bWFwSW1hZ2U6OmNyZWF0ZShuYXRpdmVJbWFnZSk7Cit9CisKK3Zv
aWQgSW1hZ2VCdWZmZXI6OmNsaXAoR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBGbG9h
dFJlY3QmIHJlY3QpIGNvbnN0Cit7CisgICAgV1RGX0FMSUdORUQodW5zaWduZWQgY2hhciosIGlt
YWdlRGF0YSwgNCkgPSBuZXcgdW5zaWduZWQgY2hhclttX3NpemUud2lkdGgoKSAqIG1fc2l6ZS5o
ZWlnaHQoKSAqIDRdOworICAgIG1fZGF0YS5nZXRJbWFnZURhdGEobV9jb250ZXh0LmdldCgpLCBJ
bnRSZWN0KEludFBvaW50KDAsIDApLCBtX3NpemUpLCBJbnRSZWN0KEludFBvaW50KDAsIDApLCBt
X3NpemUpLCBpbWFnZURhdGEsIGZhbHNlIC8qIHVubXVsdGlwbHkgKi8pOworICAgIEJsYWNrQmVy
cnk6OlBsYXRmb3JtOjpHcmFwaGljczo6VGlsZWRJbWFnZSogbmF0aXZlSW1hZ2UgPSBuZXcgQmxh
Y2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpUaWxlZEltYWdlKG1fc2l6ZSwgcmVpbnRlcnBy
ZXRfY2FzdF9wdHI8dW5zaWduZWQqPihpbWFnZURhdGEpLCBmYWxzZSAvKiBkYXRhSXNCR1JBICov
KTsKKyAgICBjb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKS0+YWRkTWFza0xheWVyKHJlY3QsIG5h
dGl2ZUltYWdlKTsKK30KKwordm9pZCBJbWFnZUJ1ZmZlcjo6ZHJhdyhHcmFwaGljc0NvbnRleHQq
IGNvbnRleHQsIENvbG9yU3BhY2Ugc3R5bGVDb2xvclNwYWNlLCBjb25zdCBGbG9hdFJlY3QmIGRl
c3RSZWN0LCBjb25zdCBGbG9hdFJlY3QmIHNyY1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9yIG9wLCBi
b29sIHVzZUxvd1F1YWxpdHlTY2FsZSkKK3sKKyAgICBtX2RhdGEuZHJhdyhtX2NvbnRleHQuZ2V0
KCksIGNvbnRleHQsIHN0eWxlQ29sb3JTcGFjZSwgZGVzdFJlY3QsIHNyY1JlY3QsIG9wLCB1c2VM
b3dRdWFsaXR5U2NhbGUpOworfQorCit2b2lkIEltYWdlQnVmZmVyOjpkcmF3UGF0dGVybihHcmFw
aGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IEZsb2F0UmVjdCYgc3JjUmVjdCwgY29uc3QgQWZm
aW5lVHJhbnNmb3JtJiBwYXR0ZXJuVHJhbnNmb3JtLCBjb25zdCBGbG9hdFBvaW50JiBwaGFzZSwg
Q29sb3JTcGFjZSBzdHlsZUNvbG9yU3BhY2UsIENvbXBvc2l0ZU9wZXJhdG9yIG9wLCBjb25zdCBG
bG9hdFJlY3QmIGRlc3RSZWN0KQoreworICAgIFJlZlB0cjxJbWFnZT4gaW1hZ2UgPSBjb3B5SW1h
Z2UoRG9udENvcHlCYWNraW5nU3RvcmUpOworICAgIGltYWdlLT5kcmF3UGF0dGVybihjb250ZXh0
LCBzcmNSZWN0LCBwYXR0ZXJuVHJhbnNmb3JtLCBwaGFzZSwgc3R5bGVDb2xvclNwYWNlLCBvcCwg
ZGVzdFJlY3QpOworfQorCit2b2lkIEltYWdlQnVmZmVyOjpwbGF0Zm9ybVRyYW5zZm9ybUNvbG9y
U3BhY2UoY29uc3QgVmVjdG9yPGludD4mIGxvb2tVcFRhYmxlKQoreworfQorCitQYXNzUmVmUHRy
PFVpbnQ4Q2xhbXBlZEFycmF5PiBJbWFnZUJ1ZmZlcjo6Z2V0VW5tdWx0aXBsaWVkSW1hZ2VEYXRh
KGNvbnN0IEludFJlY3QmIHJlY3QsIENvb3JkaW5hdGVTeXN0ZW0pIGNvbnN0Cit7CisgICAgUmVm
UHRyPFVpbnQ4Q2xhbXBlZEFycmF5PiByZXN1bHQgPSBVaW50OENsYW1wZWRBcnJheTo6Y3JlYXRl
VW5pbml0aWFsaXplZChyZWN0LndpZHRoKCkgKiByZWN0LmhlaWdodCgpICogNCk7CisgICAgbV9k
YXRhLmdldEltYWdlRGF0YShtX2NvbnRleHQuZ2V0KCksIHJlY3QsIEludFJlY3QoSW50UG9pbnQo
MCwgMCksIG1fc2l6ZSksIHJlc3VsdC0+ZGF0YSgpLCB0cnVlKTsKKyAgICByZXR1cm4gcmVzdWx0
OworfQorCitQYXNzUmVmUHRyPFVpbnQ4Q2xhbXBlZEFycmF5PiBJbWFnZUJ1ZmZlcjo6Z2V0UHJl
bXVsdGlwbGllZEltYWdlRGF0YShjb25zdCBJbnRSZWN0JiByZWN0LCBDb29yZGluYXRlU3lzdGVt
KSBjb25zdAoreworICAgIFJlZlB0cjxVaW50OENsYW1wZWRBcnJheT4gcmVzdWx0ID0gVWludDhD
bGFtcGVkQXJyYXk6OmNyZWF0ZVVuaW5pdGlhbGl6ZWQocmVjdC53aWR0aCgpICogcmVjdC5oZWln
aHQoKSAqIDQpOworICAgIG1fZGF0YS5nZXRJbWFnZURhdGEobV9jb250ZXh0LmdldCgpLCByZWN0
LCBJbnRSZWN0KEludFBvaW50KDAsIDApLCBtX3NpemUpLCByZXN1bHQtPmRhdGEoKSwgZmFsc2Up
OworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgSW1hZ2VCdWZmZXI6OnB1dEJ5dGVBcnJh
eShNdWx0aXBseSBtdWx0aXBsaWVkLCBVaW50OENsYW1wZWRBcnJheSogc291cmNlLCBjb25zdCBJ
bnRTaXplJiBzb3VyY2VTaXplLCBjb25zdCBJbnRSZWN0JiBzb3VyY2VSZWN0LCBjb25zdCBJbnRQ
b2ludCYgZGVzdFBvaW50LCBDb29yZGluYXRlU3lzdGVtKQoreworICAgIEJsYWNrQmVycnk6OlBs
YXRmb3JtOjpHcmFwaGljczo6VGlsZWRJbWFnZSBpbWFnZShzb3VyY2VTaXplLCByZWludGVycHJl
dF9jYXN0X3B0cjx1bnNpZ25lZCo+KHNvdXJjZS0+ZGF0YSgpKSwgZmFsc2UgLyogdGhpcyBkYXRh
IGlzIFJHQkEsIG5vdCBCR1JBICovLCBtdWx0aXBsaWVkID09IFByZW11bHRpcGxpZWQpOworICAg
IG1fY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCktPnNhdmUoKTsKKyAgICBjb25zdCBkb3VibGUg
bWF0cml4W10gPSB7IDEuLCAwLiwgMC4sIDEuLCAwLiwgMC4gfTsKKyAgICBtX2NvbnRleHQtPnBs
YXRmb3JtQ29udGV4dCgpLT5zZXRUcmFuc2Zvcm0obWF0cml4KTsKKyAgICBtX2NvbnRleHQtPnBs
YXRmb3JtQ29udGV4dCgpLT5zZXRBbHBoYSgxLjApOworICAgIG1fY29udGV4dC0+cGxhdGZvcm1D
b250ZXh0KCktPnJlc2V0Q2xpcCgpOworICAgIG1fY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCkt
PnNldENvbXBvc2l0ZU9wZXJhdGlvbihCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OkNv
bXBvc2l0ZUNvcHkpOworICAgIG1fY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCktPmFkZEltYWdl
KEZsb2F0UmVjdChkZXN0UG9pbnQgKyBzb3VyY2VSZWN0LmxvY2F0aW9uKCksIHNvdXJjZVJlY3Qu
c2l6ZSgpKSwgRmxvYXRSZWN0KHNvdXJjZVJlY3QpLCAmaW1hZ2UpOworICAgIG1fY29udGV4dC0+
cGxhdGZvcm1Db250ZXh0KCktPnJlc3RvcmUoKTsKK30KKworU3RyaW5nIEltYWdlQnVmZmVyOjp0
b0RhdGFVUkwoY29uc3QgU3RyaW5nJiBtaW1lVHlwZSwgY29uc3QgZG91YmxlKiBxdWFsaXR5LCBD
b29yZGluYXRlU3lzdGVtKSBjb25zdAoreworICAgIGlmIChtX3NpemUuaXNFbXB0eSgpKQorICAg
ICAgICByZXR1cm4gImRhdGE6LCI7CisKKyAgICBlbnVtIHsKKyAgICAgICAgRW5jb2RlSlBFRywK
KyAgICAgICAgRW5jb2RlUE5HLAorICAgIH0gZW5jb2RlVHlwZSA9IG1pbWVUeXBlLmxvd2VyKCkg
PT0gImltYWdlL3BuZyIgPyBFbmNvZGVQTkcgOiBFbmNvZGVKUEVHOworCisgICAgLy8gQWNjb3Jk
aW5nIHRvIGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw1L3RoZS1jYW52YXMtZWxlbWVudC5odG1s
LAorICAgIC8vICJGb3IgaW1hZ2UgdHlwZXMgdGhhdCBkbyBub3Qgc3VwcG9ydCBhbiBhbHBoYSBj
aGFubmVsLCB0aGUgaW1hZ2UgbXVzdCBiZSIKKyAgICAvLyAiY29tcG9zaXRlZCBvbnRvIGEgc29s
aWQgYmxhY2sgYmFja2dyb3VuZCB1c2luZyB0aGUgc291cmNlLW92ZXIgb3BlcmF0b3IsIgorICAg
IC8vICJhbmQgdGhlIHJlc3VsdGluZyBpbWFnZSBtdXN0IGJlIHRoZSBvbmUgdXNlZCB0byBjcmVh
dGUgdGhlIGRhdGE6IFVSTC4iCisgICAgLy8gSlBFRyBkb2Vzbid0IGhhdmUgYWxwaGEgY2hhbm5l
bCwgc28gd2UgbmVlZCBwcmVtdWx0aXBsaWVkIGRhdGEuCisgICAgUmVmUHRyPFVpbnQ4Q2xhbXBl
ZEFycmF5PiBpbWFnZURhdGEgPSBlbmNvZGVUeXBlID09IEVuY29kZVBORworICAgICAgICA/IGdl
dFVubXVsdGlwbGllZEltYWdlRGF0YShJbnRSZWN0KEludFBvaW50KDAsIDApLCBtX3NpemUpKQor
ICAgICAgICA6IGdldFByZW11bHRpcGxpZWRJbWFnZURhdGEoSW50UmVjdChJbnRQb2ludCgwLCAw
KSwgbV9zaXplKSk7CisKKyAgICBWZWN0b3I8Y2hhcj4gb3V0cHV0OworICAgIGNvbnN0IGNoYXIq
IGhlYWRlcjsKKyAgICBpZiAoZW5jb2RlVHlwZSA9PSBFbmNvZGVQTkcpIHsKKyAgICAgICAgaWYg
KCFjb21wcmVzc1JHQkFCaWdFbmRpYW5Ub1BORyhpbWFnZURhdGEtPmRhdGEoKSwgbV9zaXplLCBv
dXRwdXQpKQorICAgICAgICAgICAgcmV0dXJuICJkYXRhOiwiOworICAgICAgICBoZWFkZXIgPSAi
ZGF0YTppbWFnZS9wbmc7YmFzZTY0LCI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFjb21w
cmVzc1JHQkFCaWdFbmRpYW5Ub0pQRUcoaW1hZ2VEYXRhLT5kYXRhKCksIG1fc2l6ZSwgb3V0cHV0
LCBxdWFsaXR5KSkKKyAgICAgICAgICAgIHJldHVybiAiZGF0YTosIjsKKyAgICAgICAgaGVhZGVy
ID0gImRhdGE6aW1hZ2UvanBlZztiYXNlNjQsIjsKKyAgICB9CisKKyAgICBWZWN0b3I8Y2hhcj4g
YmFzZTY0OworICAgIGJhc2U2NEVuY29kZShvdXRwdXQsIGJhc2U2NCk7CisKKyAgICBvdXRwdXQu
Y2xlYXIoKTsKKworICAgIFZlY3RvcjxjaGFyPiB1cmw7CisgICAgdXJsLmFwcGVuZChoZWFkZXIs
IHN0cmxlbihoZWFkZXIpKTsKKyAgICB1cmwuYXBwZW5kKGJhc2U2NCk7CisKKyAgICByZXR1cm4g
U3RyaW5nKHVybC5kYXRhKCksIHVybC5zaXplKCkpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJD
b3JlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ibGFja2Jl
cnJ5L0ltYWdlQnVmZmVyRGF0YUJsYWNrQmVycnkuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2JsYWNrYmVycnkvSW1hZ2VCdWZmZXJEYXRhQmxhY2tCZXJyeS5oCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAuLjhkYTMzMGU5MzAyMDc0ZTYzZDNhZjg0YTI0ZjEzYWQ1ZGU1MDQyMjgKLS0tIC9kZXYvbnVs
bAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L0ltYWdl
QnVmZmVyRGF0YUJsYWNrQmVycnkuaApAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJp
YnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBM
ZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVl
IFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNl
LCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGli
cmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAor
ICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2Fy
cmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBm
b3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkg
b2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0
aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5k
YXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEg
IDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYgSW1hZ2VCdWZmZXJEYXRhQmxhY2tCZXJy
eV9oCisjZGVmaW5lIEltYWdlQnVmZmVyRGF0YUJsYWNrQmVycnlfaAorCisjaW5jbHVkZSAiQ2Fu
dmFzTGF5ZXJXZWJLaXRUaHJlYWQuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKwor
I2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybUdyYXBoaWNzLmg+CisjaW5jbHVkZSA8QmxhY2tC
ZXJyeVBsYXRmb3JtR3VhcmRlZFBvaW50ZXIuaD4KKyNpbmNsdWRlIDx3dGYvVWludDhDbGFtcGVk
QXJyYXkuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBHcmFwaGljc0NvbnRleHQ7
CitjbGFzcyBJbnRSZWN0OworY2xhc3MgSG9zdFdpbmRvdzsKKworY2xhc3MgSW1hZ2VCdWZmZXJE
YXRhIHsKK3B1YmxpYzoKKyAgICB2b2lkIGdldEltYWdlRGF0YShHcmFwaGljc0NvbnRleHQqLCBj
b25zdCBJbnRSZWN0JiwgY29uc3QgSW50UmVjdCYsIHVuc2lnbmVkIGNoYXIqIHJlc3VsdCwgYm9v
bCB1bm11bHRpcGx5KSBjb25zdDsKKyAgICB2b2lkIGRyYXcoR3JhcGhpY3NDb250ZXh0KiB0aGlz
Q29udGV4dCwgR3JhcGhpY3NDb250ZXh0KiBvdGhlckNvbnRleHQsIENvbG9yU3BhY2Ugc3R5bGVD
b2xvclNwYWNlLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0LCBjb25zdCBGbG9hdFJlY3QmIHNy
Y1JlY3QsIENvbXBvc2l0ZU9wZXJhdG9yLCBib29sIHVzZUxvd1F1YWxpdHlTY2FsZSkgY29uc3Q7
CisKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OkJ1ZmZlciogbV9idWZmZXI7
CisgICAgUmVmUHRyPENhbnZhc0xheWVyV2ViS2l0VGhyZWFkPiBtX3BsYXRmb3JtTGF5ZXI7Cisg
ICAgSG9zdFdpbmRvdyogbV93aW5kb3c7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisK
KyNlbmRpZiAvLyBJbWFnZUJ1ZmZlckRhdGFCbGFja0JlcnJ5X2gKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvUGF0aEJsYWNrQmVycnkuY3Bw
IGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9QYXRoQmxhY2tC
ZXJyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMC4uYmE4ZWExOWQwNmIwZDE4OGMyN2Y3ZjY0YTljYjI4ZWIyZmE5
Nzg2YgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L2JsYWNrYmVycnkvUGF0aEJsYWNrQmVycnkuY3BwCkBAIC0wLDAgKzEsMjgzIEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2Fu
IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2Yg
dGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5
IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRo
ZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAq
IFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUg
dXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGlt
cGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMg
TGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZl
ZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxv
bmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUK
KyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJv
c3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNp
bmNsdWRlICJQYXRoLmgiCisKKyNpbmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIKKyNpbmNsdWRl
ICJGbG9hdFJlY3QuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJO
b3RJbXBsZW1lbnRlZC5oIgorI2luY2x1ZGUgIlN0cm9rZVN0eWxlQXBwbGllci5oIgorCisjaW5j
bHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtR3JhcGhpY3MuaD4KKyNpbmNsdWRlIDxCbGFja0JlcnJ5
UGxhdGZvcm1HcmFwaGljc0NvbnRleHQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUg
PHd0Zi9NYXRoRXh0cmFzLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworc3RhdGljIEdyYXBo
aWNzQ29udGV4dCogc2NyYXRjaENvbnRleHQoKQoreworICAgIHN0YXRpYyBCbGFja0JlcnJ5OjpQ
bGF0Zm9ybTo6R3JhcGhpY3M6OkJ1ZmZlciogYnVmZmVyID0gQmxhY2tCZXJyeTo6UGxhdGZvcm06
OkdyYXBoaWNzOjpjcmVhdGVCdWZmZXIoSW50U2l6ZSgpLCBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6
R3JhcGhpY3M6Ok5ldmVyQmFja2VkKTsKKyAgICBzdGF0aWMgUGxhdGZvcm1HcmFwaGljc0NvbnRl
eHQqIHBnYyA9IGxvY2tCdWZmZXJEcmF3YWJsZShidWZmZXIpOworICAgIHN0YXRpYyBHcmFwaGlj
c0NvbnRleHQgZ2MocGdjKTsKKyAgICByZXR1cm4gJmdjOworfQorCitQYXRoOjpQYXRoKCkgOiBt
X3BhdGgobmV3IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6UGF0aCkKK3sKK30KKwor
UGF0aDo6UGF0aChjb25zdCBQbGF0Zm9ybVBhdGgmIHBhdGgpCisgICAgOiBtX3BhdGgobmV3IEJs
YWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6UGF0aChwYXRoKSkKK3sKK30KKworUGF0aDo6
flBhdGgoKQoreworICAgIGlmIChtX3BhdGgpIHsKKyAgICAgICAgZGVsZXRlIG1fcGF0aDsKKyAg
ICAgICAgbV9wYXRoID0gMDsKKyAgICB9Cit9CisKK1BhdGg6OlBhdGgoY29uc3QgUGF0aCYgb3Ro
ZXIpCit7CisgICAgbV9wYXRoID0gbmV3IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6
UGF0aCgqb3RoZXIubV9wYXRoKTsKK30KKworUGF0aCYgUGF0aDo6b3BlcmF0b3I9KGNvbnN0IFBh
dGgmIG90aGVyKQoreworICAgIGlmIChtX3BhdGgpIHsKKyAgICAgICAgZGVsZXRlIG1fcGF0aDsK
KyAgICAgICAgbV9wYXRoID0gMDsKKyAgICB9CisgICAgbV9wYXRoID0gbmV3IEJsYWNrQmVycnk6
OlBsYXRmb3JtOjpHcmFwaGljczo6UGF0aCgqb3RoZXIubV9wYXRoKTsKKyAgICByZXR1cm4gKnRo
aXM7Cit9CisKK0Zsb2F0UG9pbnQgUGF0aDo6Y3VycmVudFBvaW50KCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gbV9wYXRoLT5jdXJyZW50UG9pbnQoKTsKK30KKworYm9vbCBQYXRoOjpjb250YWlucyhj
b25zdCBGbG9hdFBvaW50JiBwb2ludCwgV2luZFJ1bGUgcnVsZSkgY29uc3QKK3sKKyAgICByZXR1
cm4gbV9wYXRoLT5jb250YWlucyhwb2ludCwgKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGlj
czo6V2luZFJ1bGUpKHJ1bGUpKTsKK30KKworYm9vbCBQYXRoOjpzdHJva2VDb250YWlucyhTdHJv
a2VTdHlsZUFwcGxpZXIqIGFwcGxpZXIsIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KSBjb25zdAor
eworICAgIEdyYXBoaWNzQ29udGV4dCogc2NyYXRjaCA9IHNjcmF0Y2hDb250ZXh0KCk7CisgICAg
c2NyYXRjaC0+c2F2ZSgpOworCisgICAgaWYgKGFwcGxpZXIpCisgICAgICAgIGFwcGxpZXItPnN0
cm9rZVN0eWxlKHNjcmF0Y2gpOworCisgICAgYm9vbCByZXN1bHQgPSBzY3JhdGNoQ29udGV4dCgp
LT5wbGF0Zm9ybUNvbnRleHQoKS0+c3Ryb2tlQ29udGFpbnMoKm1fcGF0aCwgcG9pbnQpOworICAg
IHNjcmF0Y2gtPnJlc3RvcmUoKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIFBhdGg6
OnRyYW5zbGF0ZShjb25zdCBGbG9hdFNpemUmIHNpemUpCit7CisgICAgQWZmaW5lVHJhbnNmb3Jt
IHRyYW5zZm9ybWF0aW9uOworICAgIHRyYW5zZm9ybWF0aW9uLnRyYW5zbGF0ZShzaXplLndpZHRo
KCksIHNpemUuaGVpZ2h0KCkpOworICAgIHRyYW5zZm9ybSh0cmFuc2Zvcm1hdGlvbik7Cit9CisK
K0Zsb2F0UmVjdCBQYXRoOjpib3VuZGluZ1JlY3QoKSBjb25zdAoreworICAgIHJldHVybiBtX3Bh
dGgtPmdldEJvdW5kcygpOworfQorCitGbG9hdFJlY3QgUGF0aDo6c3Ryb2tlQm91bmRpbmdSZWN0
KFN0cm9rZVN0eWxlQXBwbGllciogYXBwbGllcikgY29uc3QKK3sKKyAgICBHcmFwaGljc0NvbnRl
eHQqIHNjcmF0Y2ggPSBzY3JhdGNoQ29udGV4dCgpOworICAgIHNjcmF0Y2gtPnNhdmUoKTsKKwor
ICAgIGlmIChhcHBsaWVyKQorICAgICAgICBhcHBsaWVyLT5zdHJva2VTdHlsZShzY3JhdGNoKTsK
KworICAgIEZsb2F0UmVjdCByZXN1bHQgPSBzY3JhdGNoLT5wbGF0Zm9ybUNvbnRleHQoKS0+Z2V0
U3Ryb2tlQm91bmRzKCptX3BhdGgpOworCisgICAgc2NyYXRjaC0+cmVzdG9yZSgpOworICAgIHJl
dHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgUGF0aDo6bW92ZVRvKGNvbnN0IEZsb2F0UG9pbnQmIHBv
aW50KQoreworICAgIG1fcGF0aC0+bW92ZVRvKHBvaW50KTsKK30KKwordm9pZCBQYXRoOjphZGRM
aW5lVG8oY29uc3QgRmxvYXRQb2ludCYgcG9pbnQpCit7CisgICAgbV9wYXRoLT5hZGRMaW5lVG8o
cG9pbnQpOworfQorCit2b2lkIFBhdGg6OmFkZFF1YWRDdXJ2ZVRvKGNvbnN0IEZsb2F0UG9pbnQm
IGNvbnRyb2xQb2ludCwgY29uc3QgRmxvYXRQb2ludCYgZW5kUG9pbnQpCit7CisgICAgbV9wYXRo
LT5hZGRRdWFkQ3VydmVUbyhjb250cm9sUG9pbnQsIGVuZFBvaW50KTsKK30KKwordm9pZCBQYXRo
OjphZGRCZXppZXJDdXJ2ZVRvKGNvbnN0IEZsb2F0UG9pbnQmIGNvbnRyb2xQb2ludDEsIGNvbnN0
IEZsb2F0UG9pbnQmIGNvbnRyb2xQb2ludDIsIGNvbnN0IEZsb2F0UG9pbnQmIGVuZFBvaW50KQor
eworICAgIG1fcGF0aC0+YWRkQmV6aWVyQ3VydmVUbyhjb250cm9sUG9pbnQxLCBjb250cm9sUG9p
bnQyLCBlbmRQb2ludCk7Cit9CisKK3ZvaWQgUGF0aDo6YWRkQXJjVG8oY29uc3QgRmxvYXRQb2lu
dCYgcG9pbnQxLCBjb25zdCBGbG9hdFBvaW50JiBwb2ludDIsIGZsb2F0IHJhZGl1cykKK3sKKyAg
ICBtX3BhdGgtPmFkZEFyY1RvKHBvaW50MSwgcG9pbnQyLCByYWRpdXMpOworfQorCit2b2lkIFBh
dGg6OmNsb3NlU3VicGF0aCgpCit7CisgICAgbV9wYXRoLT5jbG9zZVN1YnBhdGgoKTsKK30KKwor
dm9pZCBQYXRoOjphZGRBcmMoY29uc3QgRmxvYXRQb2ludCYgY2VudGVyLCBmbG9hdCByYWRpdXMs
IGZsb2F0IHN0YXJ0QW5nbGUsIGZsb2F0IGVuZEFuZ2xlLCBib29sIGFudGljbG9ja3dpc2UpCit7
CisgICAgbV9wYXRoLT5hZGRBcmMoY2VudGVyLCByYWRpdXMsIHN0YXJ0QW5nbGUsIGVuZEFuZ2xl
LCBhbnRpY2xvY2t3aXNlKTsKK30KKwordm9pZCBQYXRoOjphZGRSZWN0KGNvbnN0IEZsb2F0UmVj
dCYgcmVjdCkKK3sKKyAgICBtX3BhdGgtPmFkZFJlY3QocmVjdCk7Cit9CisKK3ZvaWQgUGF0aDo6
YWRkRWxsaXBzZShjb25zdCBGbG9hdFJlY3QmIHJlY3QpCit7CisgICAgbV9wYXRoLT5hZGRFbGxp
cHNlKHJlY3QpOworfQorCit2b2lkIFBhdGg6OnBsYXRmb3JtQWRkUGF0aEZvclJvdW5kZWRSZWN0
KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCwgY29uc3QgRmxvYXRTaXplJiB0b3BMZWZ0UmFkaXVzLCBj
b25zdCBGbG9hdFNpemUmIHRvcFJpZ2h0UmFkaXVzLCBjb25zdCBGbG9hdFNpemUmIGJvdHRvbUxl
ZnRSYWRpdXMsIGNvbnN0IEZsb2F0U2l6ZSYgYm90dG9tUmlnaHRSYWRpdXMpCit7CisgICAgaWYg
KHJlY3QuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAocmVjdC53aWR0aCgp
IDwgdG9wTGVmdFJhZGl1cy53aWR0aCgpICsgdG9wUmlnaHRSYWRpdXMud2lkdGgoKQorICAgICAg
ICB8fCByZWN0LndpZHRoKCkgPCBib3R0b21MZWZ0UmFkaXVzLndpZHRoKCkgKyBib3R0b21SaWdo
dFJhZGl1cy53aWR0aCgpCisgICAgICAgIHx8IHJlY3QuaGVpZ2h0KCkgPCB0b3BMZWZ0UmFkaXVz
LmhlaWdodCgpICsgYm90dG9tTGVmdFJhZGl1cy5oZWlnaHQoKQorICAgICAgICB8fCByZWN0Lmhl
aWdodCgpIDwgdG9wUmlnaHRSYWRpdXMuaGVpZ2h0KCkgKyBib3R0b21SaWdodFJhZGl1cy5oZWln
aHQoKSkgeworICAgICAgICAvLyBJZiBhbGwgdGhlIHJhZGlpIGNhbm5vdCBiZSBhY2NvbW1vZGF0
ZWQsIHJldHVybiBhIHJlY3QuCisgICAgICAgIGFkZFJlY3QocmVjdCk7CisgICAgICAgIHJldHVy
bjsKKyAgICB9CisKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6RmxvYXRSb3VuZGVkUmVjdCBy
cihyZWN0LCB0b3BMZWZ0UmFkaXVzLCB0b3BSaWdodFJhZGl1cywgYm90dG9tTGVmdFJhZGl1cywg
Ym90dG9tUmlnaHRSYWRpdXMpOworICAgIC8vIE1ha2Ugc3VyZSB0aGUgZ2VuZXJpYyBwYXRoIHJl
ZmxlY3RzIHRoZSBjb250ZW50cyBvZiB0aGUgcm91bmRlZCByZWN0cworICAgIG1fcGF0aC0+YWRk
Um91bmRlZFJlY3QocnIpOworfQorCit2b2lkIFBhdGg6OmNsZWFyKCkKK3sKKyAgICBtX3BhdGgt
PnJlc2V0KCk7Cit9CisKK2Jvb2wgUGF0aDo6aXNFbXB0eSgpIGNvbnN0Cit7CisgICAgcmV0dXJu
IG1fcGF0aC0+aXNFbXB0eSgpOworfQorCitib29sIFBhdGg6Omhhc0N1cnJlbnRQb2ludCgpIGNv
bnN0Cit7CisgICAgcmV0dXJuIG1fcGF0aC0+aGFzQ3VycmVudFBvaW50KCk7Cit9CisKK3ZvaWQg
UGF0aDo6YXBwbHkodm9pZCogaW5mbywgUGF0aEFwcGxpZXJGdW5jdGlvbiBmdW5jdGlvbikgY29u
c3QKK3sKKyAgICBtX3BhdGgtPmFwcGx5KGluZm8sICh2b2lkKilmdW5jdGlvbik7Cit9CisKK3Zv
aWQgUGF0aDo6dHJhbnNmb3JtKGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgdHJhbnNmb3JtYXRpb24p
Cit7CisgICAgbV9wYXRoLT50cmFuc2Zvcm0ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBkb3VibGUq
PigmdHJhbnNmb3JtYXRpb24pKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmZpbGxQYXRo
KGNvbnN0IFBhdGgmIHBhdGgpCit7CisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNz
OjpQYXRoKiBwcCA9IHBhdGgucGxhdGZvcm1QYXRoKCk7CisgICAgaWYgKCFwcC0+aXNFbXB0eSgp
KSB7CisgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6R3JhZGllbnQqIHBs
YXRmb3JtR3JhZGllbnQgPSBmaWxsR3JhZGllbnQoKSA/IGZpbGxHcmFkaWVudCgpLT5wbGF0Zm9y
bUdyYWRpZW50KCkgOiAwOworICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6
OlBhdHRlcm4qIHBsYXRmb3JtUGF0dGVybiA9IGZpbGxQYXR0ZXJuKCkgPyBmaWxsUGF0dGVybigp
LT5wbGF0Zm9ybVBhdHRlcm4oQWZmaW5lVHJhbnNmb3JtKCkpIDogMDsKKyAgICAgICAgcGxhdGZv
cm1Db250ZXh0KCktPmFkZEZpbGxQYXRoKCpwcCwgKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFw
aGljczo6V2luZFJ1bGUpbV9zdGF0ZS5maWxsUnVsZSwgcGxhdGZvcm1HcmFkaWVudCwgcGxhdGZv
cm1QYXR0ZXJuKTsKKyAgICB9Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzdHJva2VQYXRo
KGNvbnN0IFBhdGgmIHBhdGgpCit7CisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNz
OjpQYXRoKiBwcCA9IHBhdGgucGxhdGZvcm1QYXRoKCk7CisgICAgaWYgKCFwcC0+aXNFbXB0eSgp
KSB7CisgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6R3JhZGllbnQqIGdy
YWRpZW50ID0gc3Ryb2tlR3JhZGllbnQoKSA/IHN0cm9rZUdyYWRpZW50KCktPnBsYXRmb3JtR3Jh
ZGllbnQoKSA6IDA7CisgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6UGF0
dGVybiogcGF0dGVybiA9IHN0cm9rZVBhdHRlcm4oKSA/IHN0cm9rZVBhdHRlcm4oKS0+cGxhdGZv
cm1QYXR0ZXJuKEFmZmluZVRyYW5zZm9ybSgpKSA6IDA7CisgICAgICAgIHBsYXRmb3JtQ29udGV4
dCgpLT5hZGRTdHJva2VQYXRoKCpwcCwgZ3JhZGllbnQsIHBhdHRlcm4pOworICAgIH0KK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdGb2N1c1JpbmcoY29uc3QgVmVjdG9yPEludFJlY3Q+
JiByZWN0cywgaW50IHdpZHRoLCBpbnQgb2Zmc2V0LCBjb25zdCBDb2xvciYgY29sb3IpCit7Cisg
ICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdGb2N1
c1JpbmcoY29uc3QgUGF0aCYgcGF0aCwgaW50IHdpZHRoLCBpbnQgb2Zmc2V0LCBjb25zdCBDb2xv
ciYgY29sb3IpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBHcmFwaGljc0Nv
bnRleHQ6OmRyYXdMaW5lKGNvbnN0IEludFBvaW50JiBmcm9tLCBjb25zdCBJbnRQb2ludCYgdG8p
Cit7CisgICAgcGxhdGZvcm1Db250ZXh0KCktPmFkZERyYXdMaW5lKGZyb20sIHRvKTsKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdMaW5lRm9yRG9jdW1lbnRNYXJrZXIoY29uc3QgRmxv
YXRQb2ludCYgcHQsIGZsb2F0IHdpZHRoLCBEb2N1bWVudE1hcmtlckxpbmVTdHlsZSBzdHlsZSkK
K3sKKyAgICBwbGF0Zm9ybUNvbnRleHQoKS0+YWRkRHJhd0xpbmVGb3JEb2N1bWVudE1hcmtlcihw
dCwgd2lkdGgsIChCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OkRvY3VtZW50TWFya2Vy
TGluZVN0eWxlKXN0eWxlKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdMaW5lRm9y
VGV4dChjb25zdCBGbG9hdFBvaW50JiBwdCwgZmxvYXQgd2lkdGgsIGJvb2wgcHJpbnRpbmcpCit7
CisgICAgcGxhdGZvcm1Db250ZXh0KCktPmFkZERyYXdMaW5lRm9yVGV4dChwdCwgd2lkdGgsIHBy
aW50aW5nKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsaXAoY29uc3QgUGF0aCYgcGF0
aCkKK3sKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OlBhdGgqIHBwID0gcGF0
aC5wbGF0Zm9ybVBhdGgoKTsKKyAgICBwcC0+YXBwbHlBc0NsaXAocGxhdGZvcm1Db250ZXh0KCkp
OworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcFBhdGgoY29uc3QgUGF0aCYgcGF0aCwg
V2luZFJ1bGUgY2xpcFJ1bGUpCit7CisgICAgaWYgKHBhdGgucGxhdGZvcm1QYXRoKCktPmlzUmVj
dGFuZ3VsYXIoKSkKKyAgICAgICAgcGxhdGZvcm1Db250ZXh0KCktPmNsaXAocGF0aC5ib3VuZGlu
Z1JlY3QoKSk7CisgICAgZWxzZQorICAgICAgICBjbGlwKHBhdGgpOworfQorCit2b2lkIEdyYXBo
aWNzQ29udGV4dDo6Y2FudmFzQ2xpcChjb25zdCBQYXRoJiBwYXRoKQoreworICAgIGNsaXAocGF0
aCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpjbGlwT3V0KGNvbnN0IFBhdGgmIHBhdGgp
Cit7CisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpQYXRoKiBwcCA9IHBhdGgu
cGxhdGZvcm1QYXRoKCk7CisgICAgcHAtPmFwcGx5QXNDbGlwT3V0KHBsYXRmb3JtQ29udGV4dCgp
KTsKK30KKworfQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
YmxhY2tiZXJyeS9QYXR0ZXJuQmxhY2tCZXJyeS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9ibGFja2JlcnJ5L1BhdHRlcm5CbGFja0JlcnJ5LmNwcApuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5k
NjAwZmNkZTVjN2I5YmI4MDllNzI1OTE2OWMyZDdmY2M5ZGU1ZjE1Ci0tLSAvZGV2L251bGwKKysr
IGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9QYXR0ZXJuQmxh
Y2tCZXJyeS5jcHAKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBS
ZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBU
aGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5k
L29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVy
YWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBG
b3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlv
dXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlz
dHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRI
T1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisg
KiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBT
ZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0
YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUg
TGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5
OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMu
LCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAx
ICBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUGF0dGVybi5oIgor
CisjaW5jbHVkZSAiQWZmaW5lVHJhbnNmb3JtLmgiCisjaW5jbHVkZSAiSW1hZ2UuaCIKKyNpbmNs
dWRlICJOYXRpdmVJbWFnZVB0ci5oIgorI2luY2x1ZGUgIlBhdGguaCIKKworI2luY2x1ZGUgPEJs
YWNrQmVycnlQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dC5oPgorCit1c2luZyBuYW1lc3BhY2Ugc3Rk
OworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3ZvaWQgUGF0dGVybjo6cGxhdGZvcm1EZXN0cm95
KCkKK3sKKyAgICBkZWxldGUgbV9wYXR0ZXJuOworICAgIG1fcGF0dGVybiA9IDA7Cit9CisKK1Bs
YXRmb3JtUGF0dGVyblB0ciBQYXR0ZXJuOjpwbGF0Zm9ybVBhdHRlcm4oY29uc3QgQWZmaW5lVHJh
bnNmb3JtJiBwYXR0ZXJuVHJhbnNmb3JtKQoreworICAgIGlmIChtX3BhdHRlcm4pCisgICAgICAg
IHJldHVybiBtX3BhdHRlcm47CisKKyAgICBjb25zdCBOYXRpdmVJbWFnZVB0ciBpbWFnZSA9IG1f
dGlsZUltYWdlLT5uYXRpdmVJbWFnZUZvckN1cnJlbnRGcmFtZSgpOworCisgICAgbV9wYXR0ZXJu
ID0gQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpQYXR0ZXJuOjpjcmVhdGUoKTsKKwor
ICAgIG1fcGF0dGVybi0+c2V0SW1hZ2UoaW1hZ2UsIG1fcmVwZWF0WCwgbV9yZXBlYXRZKTsKKyAg
ICBtX3BhdHRlcm4tPnNldExvY2FsTWF0cml4KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZG91Ymxl
Kj4oJm1fcGF0dGVyblNwYWNlVHJhbnNmb3JtYXRpb24pKTsKKworICAgIHJldHVybiBtX3BhdHRl
cm47Cit9CisKK3ZvaWQgUGF0dGVybjo6c2V0UGxhdGZvcm1QYXR0ZXJuU3BhY2VUcmFuc2Zvcm0o
KQoreworICAgIGlmIChtX3BhdHRlcm4pCisgICAgICAgIG1fcGF0dGVybi0+c2V0TG9jYWxNYXRy
aXgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBkb3VibGUqPigmbV9wYXR0ZXJuU3BhY2VUcmFuc2Zv
cm1hdGlvbikpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L1BsYXRmb3JtU3VwcG9ydC5j
cHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L1BsYXRmb3Jt
U3VwcG9ydC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZGE1OTQ2ODE1ZmIxMTgwN2VlNjJjNWE5YjlkZDY2NjJm
ZmRmMzE0ZQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL2JsYWNrYmVycnkvUGxhdGZvcm1TdXBwb3J0LmNwcApAQCAtMCwwICsxLDEzNSBAQAorLyoK
KyAqIENvcHlyaWdodCAoYykgMjAwOS0yMDEwLCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEyLCAyMDEzIFJlc2VhcmNoIEluIE1vdGlv
biBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAg
KiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
CisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBO
ZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBj
b250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRl
cml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0
ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBD
T1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRF
RCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBM
SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRl
ICJQbGF0Zm9ybVN1cHBvcnQuaCIKKworI2luY2x1ZGUgIkZvbnREZXNjcmlwdGlvbi5oIgorCisj
aW5jbHVkZSA8Zm9udGNvbmZpZy9mb250Y29uZmlnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+Cisj
aW5jbHVkZSA8dW5pY29kZS91dGYxNi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUg
PHd0Zi90ZXh0L0NTdHJpbmcuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit2b2lkIFBsYXRm
b3JtU3VwcG9ydDo6Z2V0Rm9udEZhbWlseUZvckNoYXJhY3RlcnMoY29uc3QgVUNoYXIqIGNoYXJh
Y3RlcnMsIHNpemVfdCBudW1DaGFyYWN0ZXJzLCBjb25zdCBjaGFyKiwgY29uc3QgRm9udERlc2Ny
aXB0aW9uJiBkZXNjcmlwdGlvbiwgRm9udEZhbWlseSogZmFtaWx5KQoreworICAgIEZjQ2hhclNl
dCogY3NldCA9IEZjQ2hhclNldENyZWF0ZSgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwg
bnVtQ2hhcmFjdGVyczsgKytpKSB7CisgICAgICAgIGlmIChVMTZfSVNfU1VSUk9HQVRFKGNoYXJh
Y3RlcnNbaV0pCisgICAgICAgICAgICAmJiBVMTZfSVNfU1VSUk9HQVRFX0xFQUQoY2hhcmFjdGVy
c1tpXSkKKyAgICAgICAgICAgICYmIGkgIT0gbnVtQ2hhcmFjdGVycyAtIDEKKyAgICAgICAgICAg
ICYmIFUxNl9JU19UUkFJTChjaGFyYWN0ZXJzW2kgKyAxXSkpIHsKKyAgICAgICAgICAgIEZjQ2hh
clNldEFkZENoYXIoY3NldCwgVTE2X0dFVF9TVVBQTEVNRU5UQVJZKGNoYXJhY3RlcnNbaV0sIGNo
YXJhY3RlcnNbaSsxXSkpOworICAgICAgICAgICAgaSsrOworICAgICAgICB9IGVsc2UKKyAgICAg
ICAgICAgIEZjQ2hhclNldEFkZENoYXIoY3NldCwgY2hhcmFjdGVyc1tpXSk7CisgICAgfQorICAg
IEZjUGF0dGVybiogcGF0dGVybiA9IEZjUGF0dGVybkNyZWF0ZSgpOworCisgICAgRmNWYWx1ZSBm
Y3ZhbHVlOworICAgIGZjdmFsdWUudHlwZSA9IEZjVHlwZUNoYXJTZXQ7CisgICAgZmN2YWx1ZS51
LmMgPSBjc2V0OworICAgIEZjUGF0dGVybkFkZChwYXR0ZXJuLCBGQ19DSEFSU0VULCBmY3ZhbHVl
LCBGY0ZhbHNlKTsKKworICAgIGZjdmFsdWUudHlwZSA9IEZjVHlwZUJvb2w7CisgICAgZmN2YWx1
ZS51LmIgPSBGY1RydWU7CisgICAgRmNQYXR0ZXJuQWRkKHBhdHRlcm4sIEZDX1NDQUxBQkxFLCBm
Y3ZhbHVlLCBGY0ZhbHNlKTsKKworICAgIGZjdmFsdWUudHlwZSA9IEZjVHlwZUludGVnZXI7Cisg
ICAgZmN2YWx1ZS51LmkgPSAoZGVzY3JpcHRpb24ud2VpZ2h0KCkgPj0gRm9udFdlaWdodEJvbGQp
ID8gRkNfV0VJR0hUX0JPTEQgOiBGQ19XRUlHSFRfTk9STUFMOworICAgIEZjUGF0dGVybkFkZChw
YXR0ZXJuLCBGQ19XRUlHSFQsIGZjdmFsdWUsIEZjRmFsc2UpOworCisgICAgZmN2YWx1ZS50eXBl
ID0gRmNUeXBlSW50ZWdlcjsKKyAgICBmY3ZhbHVlLnUuaSA9IChkZXNjcmlwdGlvbi5pdGFsaWMo
KSA9PSBGb250SXRhbGljT24pID8gRkNfU0xBTlRfSVRBTElDIDogRkNfU0xBTlRfUk9NQU47Cisg
ICAgRmNQYXR0ZXJuQWRkKHBhdHRlcm4sIEZDX1NMQU5ULCBmY3ZhbHVlLCBGY0ZhbHNlKTsKKwor
ICAgIEZjQ29uZmlnU3Vic3RpdHV0ZSgwLCBwYXR0ZXJuLCBGY01hdGNoUGF0dGVybik7CisgICAg
RmNEZWZhdWx0U3Vic3RpdHV0ZShwYXR0ZXJuKTsKKworICAgIEZjUmVzdWx0IHJlc3VsdDsKKyAg
ICBGY0ZvbnRTZXQqIGZvbnRTZXQgPSBGY0ZvbnRTb3J0KDAsIHBhdHRlcm4sIDAsIDAsICZyZXN1
bHQpOworICAgIEZjUGF0dGVybkRlc3Ryb3kocGF0dGVybik7CisgICAgRmNDaGFyU2V0RGVzdHJv
eShjc2V0KTsKKworICAgIGlmICghZm9udFNldCkgeworICAgICAgICBmYW1pbHktPm5hbWUgPSBT
dHJpbmcoKTsKKyAgICAgICAgZmFtaWx5LT5pc0JvbGQgPSBmYWxzZTsKKyAgICAgICAgZmFtaWx5
LT5pc0l0YWxpYyA9IGZhbHNlOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gT2xk
ZXIgdmVyc2lvbnMgb2YgZm9udGNvbmZpZyBoYXZlIGEgYnVnIHdoZXJlIHRoZXkgY2Fubm90IHNl
bGVjdAorICAgIC8vIG9ubHkgc2NhbGFibGUgZm9udHMgc28gd2UgaGF2ZSB0byBtYW51YWxseSBm
aWx0ZXIgdGhlIHJlc3VsdHMuCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmb250U2V0LT5uZm9u
dDsgKytpKSB7CisgICAgICAgIEZjUGF0dGVybiogY3VycmVudCA9IGZvbnRTZXQtPmZvbnRzW2ld
OworICAgICAgICBGY0Jvb2wgaXNTY2FsYWJsZTsKKworICAgICAgICBpZiAoRmNQYXR0ZXJuR2V0
Qm9vbChjdXJyZW50LCBGQ19TQ0FMQUJMRSwgMCwgJmlzU2NhbGFibGUpICE9IEZjUmVzdWx0TWF0
Y2gKKyAgICAgICAgICAgIHx8ICFpc1NjYWxhYmxlKQorICAgICAgICAgICAgY29udGludWU7CisK
KyAgICAgICAgLy8gZm9udGNvbmZpZyBjYW4gYWxzbyByZXR1cm4gZm9udHMgd2hpY2ggYXJlIHVu
cmVhZGFibGUKKyAgICAgICAgRmNDaGFyOCogY0ZpbGVuYW1lOworICAgICAgICBpZiAoRmNQYXR0
ZXJuR2V0U3RyaW5nKGN1cnJlbnQsIEZDX0ZJTEUsIDAsICZjRmlsZW5hbWUpICE9IEZjUmVzdWx0
TWF0Y2gpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAoYWNjZXNzKHJlaW50
ZXJwcmV0X2Nhc3Q8Y2hhcio+KGNGaWxlbmFtZSksIFJfT0spKQorICAgICAgICAgICAgY29udGlu
dWU7CisKKyAgICAgICAgRmNDaGFyOCogZmFtaWx5TmFtZTsKKyAgICAgICAgaWYgKEZjUGF0dGVy
bkdldFN0cmluZyhjdXJyZW50LCBGQ19GQU1JTFksIDAsICZmYW1pbHlOYW1lKSA9PSBGY1Jlc3Vs
dE1hdGNoKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyKiBjaGFyRmFtaWx5ID0gcmVpbnRlcnBy
ZXRfY2FzdDxjaGFyKj4oZmFtaWx5TmFtZSk7CisgICAgICAgICAgICBmYW1pbHktPm5hbWUgPSBT
dHJpbmc6OmZyb21VVEY4KGNoYXJGYW1pbHksIHN0cmxlbihjaGFyRmFtaWx5KSk7CisgICAgICAg
IH0KKworICAgICAgICBpbnQgd2VpZ2h0OworICAgICAgICBpZiAoRmNQYXR0ZXJuR2V0SW50ZWdl
cihjdXJyZW50LCBGQ19XRUlHSFQsIDAsICZ3ZWlnaHQpID09IEZjUmVzdWx0TWF0Y2gpCisgICAg
ICAgICAgICBmYW1pbHktPmlzQm9sZCA9IHdlaWdodCA+PSBGQ19XRUlHSFRfQk9MRDsKKyAgICAg
ICAgZWxzZQorICAgICAgICAgICAgZmFtaWx5LT5pc0JvbGQgPSBmYWxzZTsKKworICAgICAgICBp
bnQgc2xhbnQ7CisgICAgICAgIGlmIChGY1BhdHRlcm5HZXRJbnRlZ2VyKGN1cnJlbnQsIEZDX1NM
QU5ULCAwLCAmc2xhbnQpID09IEZjUmVzdWx0TWF0Y2gpCisgICAgICAgICAgICBmYW1pbHktPmlz
SXRhbGljID0gc2xhbnQgIT0gRkNfU0xBTlRfUk9NQU47CisgICAgICAgIGVsc2UKKyAgICAgICAg
ICAgIGZhbWlseS0+aXNJdGFsaWMgPSBmYWxzZTsKKworICAgICAgICBGY0ZvbnRTZXREZXN0cm95
KGZvbnRTZXQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgRmNGb250U2V0RGVzdHJv
eShmb250U2V0KTsKK30KKworfTsgLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2JsYWNrYmVycnkvUGxhdGZvcm1TdXBwb3J0
LmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9ibGFja2JlcnJ5L1BsYXRmb3Jt
U3VwcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAuLjkxNjZlYTQ4NTQ5NWI4ZjQ0ZmQ0MmQzNDZkYTI4MDliYzk1
NDVjNjQKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9ibGFja2JlcnJ5L1BsYXRmb3JtU3VwcG9ydC5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKGMpIDIwMTAsIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBD
b3B5cmlnaHQgKGMpIDIwMTEsIFJlc2VhcmNoIEluIE1vdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAg
ICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhl
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQor
ICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5j
LiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVu
ZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUg
d2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJV
VE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9X
TkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkK
KyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisj
aWZuZGVmIFBsYXRmb3JtU3VwcG9ydF9oCisjZGVmaW5lIFBsYXRmb3JtU3VwcG9ydF9oCisKKyNp
bmNsdWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitz
dHJ1Y3QgRm9udFJlbmRlclN0eWxlOworY2xhc3MgRm9udERlc2NyaXB0aW9uOworCisvLyBUaGlz
IGlzIGEgbWluaW1hbCB2ZXJzaW9uIG9mIHRoZSBDaHJvbWl1bSBQbGF0Zm9ybVN1cHBvcnQvV2Vi
Rm9udEluZm8gY2xhc3NlcyB1c2VkIGZvciBmb250IHN1cHBvcnQuCitjbGFzcyBQbGF0Zm9ybVN1
cHBvcnQgeworcHVibGljOgorICAgIHN0cnVjdCBGb250RmFtaWx5IHsKKyAgICAgICAgU3RyaW5n
IG5hbWU7CisgICAgICAgIGJvb2wgaXNCb2xkOworICAgICAgICBib29sIGlzSXRhbGljOworICAg
IH07CisgICAgc3RhdGljIHZvaWQgZ2V0Rm9udEZhbWlseUZvckNoYXJhY3RlcnMoY29uc3QgVUNo
YXIqLCBzaXplX3QgbnVtQ2hhcmFjdGVycywgY29uc3QgY2hhciogcHJlZmVycmVkTG9jYWxlLCBj
b25zdCBGb250RGVzY3JpcHRpb24mLCBGb250RmFtaWx5Kik7Cit9OworCit9IC8vIG5hbWVzcGFj
ZSBXZWJDb3JlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvYmxhY2tiZXJyeS9TaW1wbGVGb250RGF0YUJsYWNrQmVycnkuY3BwIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYmxhY2tiZXJyeS9TaW1wbGVGb250RGF0YUJsYWNr
QmVycnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAuLmM2NzAwOWJmMDc0YjVkMDkyZmQzZjA1NDJhYzI2NTVhYzli
ZTZlNTIKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9ibGFja2JlcnJ5L1NpbXBsZUZvbnREYXRhQmxhY2tCZXJyeS5jcHAKQEAgLTAsMCArMSwyMjUg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdh
cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRo
ZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBw
dWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJz
aW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNp
b24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQg
aXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQg
ZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5l
cmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBo
YXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICog
TGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJl
ZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0
aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2luY2x1ZGUgImNv
bmZpZy5oIgorI2luY2x1ZGUgIlNpbXBsZUZvbnREYXRhLmgiCisKKyNpbmNsdWRlICJGbG9hdFJl
Y3QuaCIKKyNpbmNsdWRlICJGb250LmgiCisjaW5jbHVkZSAiRm9udENhY2hlLmgiCisjaW5jbHVk
ZSAiRm9udERlc2NyaXB0aW9uLmgiCisjaW5jbHVkZSAiSVR5cGVVdGlscy5oIgorCisjaW5jbHVk
ZSA8ZnNfYXBpLmg+CisjaW5jbHVkZSA8dW5pY29kZS9ub3JtbHpyLmg+CisKK25hbWVzcGFjZSBX
ZWJDb3JlIHsKKworLy8gU21hbGxjYXBzIHZlcnNpb25zIG9mIGZvbnRzIGFyZSA3MCUgdGhlIHNp
emUgb2YgdGhlIG5vcm1hbCBmb250Lgorc3RhdGljIGNvbnN0IGZsb2F0IHNtYWxsQ2Fwc0ZyYWN0
aW9uID0gMC43ZjsKK3N0YXRpYyBjb25zdCBmbG9hdCBlbXBoYXNpc01hcmtGcmFjdGlvbiA9IC41
OworCitzdGF0aWMgaW5saW5lIGZsb2F0IEZTRml4ZWRUb0Zsb2F0KEZTX0ZJWEVEIG4pIHsgcmV0
dXJuIG4gLyA2NTUzNi4wOyB9CisKKyNkZWZpbmUgb3BlblR5cGVUYWcoYSwgYiwgYywgZCkgKEZT
X1VMT05HKSgoYSA8PCAyNCkgfCAoYiA8PCAxNikgfCAoYyA8PCA4KSB8IGQpCisKK3ZvaWQgU2lt
cGxlRm9udERhdGE6OnBsYXRmb3JtSW5pdCgpCit7CisgICAgRlNfRklYRUQgYXNjZW5kZXIgPSAw
OworICAgIEZTX0ZJWEVEIGRlc2NlbmRlciA9IDA7CisgICAgRlNfRklYRUQgbGVhZGluZyA9IDA7
CisgICAgRnNBc2NEZXNjTGVhZFNvdXJjZSBzb3VyY2U7CisgICAgRlNfTE9ORyByZXN1bHQ7Cisg
ICAgaWYgKG1fcGxhdGZvcm1EYXRhLnNpemUoKSA+IDApIHsKKyAgICAgICAgLy8gRklYTUU6IGhh
Y2shIEZTX2dldF9hc2NlbmRlcl9kZXNjZW5kZXJfbGVhZGluZygpIHJldHVybnMgRVJSX05PX0NV
UlJFTlRfU0ZOVCB3aGVuIHNpemUgaXMgMCwgZXZlbiB0aG91Z2ggd2UgY2FsbGVkIEZTX3NldF9z
Y2FsZSBhbmQgbV9wbGF0Zm9ybURhdGEuZm9udCgpLT5jdXJfc2ZudCBpcyBub3QgMAorICAgICAg
ICByZXN1bHQgPSBGU19nZXRfYXNjZW5kZXJfZGVzY2VuZGVyX2xlYWRpbmcobV9wbGF0Zm9ybURh
dGEuZm9udCgpLCAmYXNjZW5kZXIsICZkZXNjZW5kZXIsICZsZWFkaW5nLCAmc291cmNlKTsKKyAg
ICAgICAgQVNTRVJUX1VOVVNFRChyZXN1bHQsIHJlc3VsdCA9PSBTVUNDRVNTKTsKKyAgICB9CisK
KyAgICBtX2ZvbnRNZXRyaWNzLnNldEFzY2VudChGU19ST1VORChhc2NlbmRlcikpOworICAgIG1f
Zm9udE1ldHJpY3Muc2V0RGVzY2VudChGU19ST1VORChkZXNjZW5kZXIpKTsKKyAgICBtX2ZvbnRN
ZXRyaWNzLnNldExpbmVHYXAoaVR5cGVGaXhlZFRvRmxvYXQobGVhZGluZykpOworICAgIG1fZm9u
dE1ldHJpY3Muc2V0TGluZVNwYWNpbmcobHJvdW5kZihtX2ZvbnRNZXRyaWNzLmFzY2VudCgpKSAr
IGxyb3VuZGYobV9mb250TWV0cmljcy5kZXNjZW50KCkpICsgbHJvdW5kZihtX2ZvbnRNZXRyaWNz
LmxpbmVHYXAoKSkpOworCisgICAgRk9OVF9NRVRSSUNTIG1ldHJpY3M7CisgICAgcmVzdWx0ID0g
RlNfZm9udF9tZXRyaWNzKG1fcGxhdGZvcm1EYXRhLmZvbnQoKSwgJm1ldHJpY3MpOworICAgIEFT
U0VSVF9VTlVTRUQocmVzdWx0LCByZXN1bHQgPT0gU1VDQ0VTUyk7CisKKyAgICAvLyBtX2ZvbnRN
ZXRyaWNzLnNldFVuaXRzUGVyRW0oRlNfZ2V0X2Rlc2lnbl91bml0cyhtX3BsYXRmb3JtRGF0YSgp
LmZvbnQoKSkpOworICAgIG1fZm9udE1ldHJpY3Muc2V0VW5pdHNQZXJFbShtZXRyaWNzLnVuaXRz
UGVyRW0pOworCisgICAgRlNfVVNIT1JUIHhSYW5nZSA9IG1ldHJpY3MuZm9udF9iYm94LnhNYXgg
LSBtZXRyaWNzLmZvbnRfYmJveC54TWluOworICAgIG1fbWF4Q2hhcldpZHRoID0gcm91bmRmKCh4
UmFuZ2UgKiByb3VuZGYobV9wbGF0Zm9ybURhdGEuc2l6ZSgpKSkgLyBtZXRyaWNzLnVuaXRzUGVy
RW0pOworCisgICAgVFRGX09TMiBvczI7CisgICAgaWYgKEZTX2dldF90YWJsZV9zdHJ1Y3R1cmUo
bV9wbGF0Zm9ybURhdGEuZm9udCgpLCBUQUdfT1MyLCAmb3MyKSA9PSBTVUNDRVNTICYmIG9zMi5z
eEhlaWdodCAmJiBvczIueEF2Z0NoYXJXaWR0aCkgeworICAgICAgICBGU19VU0hPUlQgeXBwZW0g
PSBtX3BsYXRmb3JtRGF0YS5mb250KCktPmxwbTsKKyAgICAgICAgbV9mb250TWV0cmljcy5zZXRY
SGVpZ2h0KHN0YXRpY19jYXN0PGZsb2F0PihvczIuc3hIZWlnaHQpICogeXBwZW0gLyBtZXRyaWNz
LnVuaXRzUGVyRW0pOworICAgICAgICBtX2F2Z0NoYXJXaWR0aCA9IHN0YXRpY19jYXN0PGZsb2F0
PihvczIueEF2Z0NoYXJXaWR0aCkgKiB5cHBlbSAvIG1ldHJpY3MudW5pdHNQZXJFbTsKKyAgICB9
IGVsc2UgeworICAgICAgICAvLyBIQUNLCisgICAgICAgIG1fZm9udE1ldHJpY3Muc2V0WEhlaWdo
dChtX2ZvbnRNZXRyaWNzLmFzY2VudCgpICogMC41Nik7CisgICAgICAgIG1fZm9udE1ldHJpY3Mu
c2V0SGFzWEhlaWdodChmYWxzZSk7CisgICAgICAgIG1fYXZnQ2hhcldpZHRoID0gbV9mb250TWV0
cmljcy54SGVpZ2h0KCk7CisKKyAgICAgICAgR2x5cGhQYWdlKiBnbHlwaFBhZ2VaZXJvID0gR2x5
cGhQYWdlVHJlZU5vZGU6OmdldFJvb3RDaGlsZCh0aGlzLCAwKS0+cGFnZSgpOworCisgICAgICAg
IGlmIChnbHlwaFBhZ2VaZXJvKSB7CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgVUNoYXIzMiB4
Q2hhciA9ICd4JzsKKyAgICAgICAgICAgIGNvbnN0IEdseXBoIHhHbHlwaCA9IGdseXBoUGFnZVpl
cm8tPmdseXBoRGF0YUZvckNoYXJhY3Rlcih4Q2hhcikuZ2x5cGg7CisKKyAgICAgICAgICAgIGlm
ICh4R2x5cGgpIHsKKyAgICAgICAgICAgICAgICAvLyBJbiB3aWR0aEZvckdseXBoKCksIHhHbHlw
aCB3aWxsIGJlIGNvbXBhcmVkIHdpdGgKKyAgICAgICAgICAgICAgICAvLyBtX3plcm9XaWR0aFNw
YWNlR2x5cGgsIHdoaWNoIGlzbid0IGluaXRpYWxpemVkIHlldCBoZXJlLgorICAgICAgICAgICAg
ICAgIC8vIEluaXRpYWxpemUgaXQgd2l0aCB6ZXJvIHRvIG1ha2Ugc3VyZSB3aWR0aEZvckdseXBo
KCkgcmV0dXJucworICAgICAgICAgICAgICAgIC8vIHRoZSByaWdodCB3aWR0aC4KKyAgICAgICAg
ICAgICAgICBtX3plcm9XaWR0aFNwYWNlR2x5cGggPSAwOworICAgICAgICAgICAgICAgIG1fYXZn
Q2hhcldpZHRoID0gd2lkdGhGb3JHbHlwaCh4R2x5cGgpOworICAgICAgICAgICAgfQorICAgICAg
ICB9CisgICAgfQorCisgICAgaWYgKG1fcGxhdGZvcm1EYXRhLm9yaWVudGF0aW9uKCkgPT0gVmVy
dGljYWwgJiYgIWlzVGV4dE9yaWVudGF0aW9uRmFsbGJhY2soKSkKKyAgICAgICAgbV9oYXNWZXJ0
aWNhbEdseXBocyA9IEZTX2dldF90YWJsZShtX3BsYXRmb3JtRGF0YS5mb250KCksIG9wZW5UeXBl
VGFnKCd2JywgJ2gnLCAnZScsICdhJyksIFRCTF9RVUVSWSwgMCkKKyAgICAgICAgICAgIHx8IEZT
X2dldF90YWJsZShtX3BsYXRmb3JtRGF0YS5mb250KCksIG9wZW5UeXBlVGFnKCdWJywgJ08nLCAn
UicsICdHJyksIFRCTF9RVUVSWSwgMCk7Cit9CisKK3ZvaWQgU2ltcGxlRm9udERhdGE6OnBsYXRm
b3JtQ2hhcldpZHRoSW5pdCgpCit7Cit9CisKK3ZvaWQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3Jt
RGVzdHJveSgpCit7Cit9CisKK1Bhc3NPd25QdHI8U2ltcGxlRm9udERhdGE+IFNpbXBsZUZvbnRE
YXRhOjpjcmVhdGVTY2FsZWRGb250RGF0YShjb25zdCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNj
cmlwdGlvbiwgZmxvYXQgc2NhbGVGYWN0b3IpIGNvbnN0Cit7CisgICAgY29uc3QgZmxvYXQgc2Nh
bGVkU2l6ZSA9IGxyb3VuZGYoZm9udERlc2NyaXB0aW9uLmNvbXB1dGVkU2l6ZSgpICogc2NhbGVG
YWN0b3IpOworICAgIHJldHVybiBhZG9wdFB0cihuZXcgU2ltcGxlRm9udERhdGEoCisgICAgICAg
IEZvbnRQbGF0Zm9ybURhdGEobV9wbGF0Zm9ybURhdGEuZm9udCgpLT5jdXJfbGZudC0+bmFtZSwK
KyAgICAgICAgICAgIHNjYWxlZFNpemUsCisgICAgICAgICAgICBtX3BsYXRmb3JtRGF0YS5zeW50
aGV0aWNCb2xkKCksCisgICAgICAgICAgICBtX3BsYXRmb3JtRGF0YS5zeW50aGV0aWNPYmxpcXVl
KCksCisgICAgICAgICAgICBtX3BsYXRmb3JtRGF0YS5vcmllbnRhdGlvbigpLAorICAgICAgICAg
ICAgbV9wbGF0Zm9ybURhdGEudGV4dE9yaWVudGF0aW9uKCksCisgICAgICAgICAgICBtX3BsYXRm
b3JtRGF0YS53aWR0aFZhcmlhbnQoKSksCisgICAgICAgIGlzQ3VzdG9tRm9udCgpLCBmYWxzZSkp
OworfQorCitTaW1wbGVGb250RGF0YSogU2ltcGxlRm9udERhdGE6OnNtYWxsQ2Fwc0ZvbnREYXRh
KGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgZm9udERlc2NyaXB0aW9uKSBjb25zdAoreworICAgIGlm
ICghbV9kZXJpdmVkRm9udERhdGEpCisgICAgICAgIG1fZGVyaXZlZEZvbnREYXRhID0gRGVyaXZl
ZEZvbnREYXRhOjpjcmVhdGUoaXNDdXN0b21Gb250KCkpOworICAgIGlmICghbV9kZXJpdmVkRm9u
dERhdGEtPnNtYWxsQ2FwcykKKyAgICAgICAgbV9kZXJpdmVkRm9udERhdGEtPnNtYWxsQ2FwcyA9
IGNyZWF0ZVNjYWxlZEZvbnREYXRhKGZvbnREZXNjcmlwdGlvbiwgc21hbGxDYXBzRnJhY3Rpb24p
OworCisgICAgcmV0dXJuIG1fZGVyaXZlZEZvbnREYXRhLT5zbWFsbENhcHMuZ2V0KCk7Cit9CisK
K1NpbXBsZUZvbnREYXRhKiBTaW1wbGVGb250RGF0YTo6ZW1waGFzaXNNYXJrRm9udERhdGEoY29u
c3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24pIGNvbnN0Cit7CisgICAgaWYgKCFt
X2Rlcml2ZWRGb250RGF0YSkKKyAgICAgICAgbV9kZXJpdmVkRm9udERhdGEgPSBEZXJpdmVkRm9u
dERhdGE6OmNyZWF0ZShpc0N1c3RvbUZvbnQoKSk7CisgICAgaWYgKCFtX2Rlcml2ZWRGb250RGF0
YS0+ZW1waGFzaXNNYXJrKQorICAgICAgICBtX2Rlcml2ZWRGb250RGF0YS0+ZW1waGFzaXNNYXJr
ID0gY3JlYXRlU2NhbGVkRm9udERhdGEoZm9udERlc2NyaXB0aW9uLCBlbXBoYXNpc01hcmtGcmFj
dGlvbik7CisKKyAgICByZXR1cm4gbV9kZXJpdmVkRm9udERhdGEtPmVtcGhhc2lzTWFyay5nZXQo
KTsKK30KKworYm9vbCBTaW1wbGVGb250RGF0YTo6Y29udGFpbnNDaGFyYWN0ZXJzKGNvbnN0IFVD
aGFyKiBjaGFyYWN0ZXJzLCBpbnQgbGVuZ3RoKSBjb25zdAoreworICAgIGludCBwb3NpdGlvbiA9
IDA7CisKKyAgICB3aGlsZSAocG9zaXRpb24gPCBsZW5ndGgpIHsKKyAgICAgICAgLy8gRklYTUU6
IHVzZSBzaGFwZXI/CisgICAgICAgIFVDaGFyMzIgY2hhcmFjdGVyOworICAgICAgICBpbnQgbmV4
dFBvc2l0aW9uID0gcG9zaXRpb247CisgICAgICAgIFUxNl9ORVhUKGNoYXJhY3RlcnMsIG5leHRQ
b3NpdGlvbiwgbGVuZ3RoLCBjaGFyYWN0ZXIpOworCisgICAgICAgIEZTX1VTSE9SVCBnbHlwaCA9
IEZTX21hcF9jaGFyKG1fcGxhdGZvcm1EYXRhLmZvbnQoKSwgc3RhdGljX2Nhc3Q8RlNfVUxPTkc+
KGNoYXJhY3RlcikpOworICAgICAgICBpZiAoIWdseXBoKQorICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgICAgIHBvc2l0aW9uID0gbmV4dFBvc2l0aW9uOworICAgIH0KKworICAgIHJl
dHVybiB0cnVlOworfQorCit2b2lkIFNpbXBsZUZvbnREYXRhOjpkZXRlcm1pbmVQaXRjaCgpCit7
CisgICAgbV90cmVhdEFzRml4ZWRQaXRjaCA9IG1fcGxhdGZvcm1EYXRhLmlzRml4ZWRQaXRjaCgp
OworfQorCitGbG9hdFJlY3QgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtQm91bmRzRm9yR2x5cGgo
R2x5cGggZ2x5cGgpIGNvbnN0Cit7CisgICAgRlNfR0xZUEhNQVAqIGdseXBobWFwID0gRlNfZ2V0
X2dseXBobWFwKG1fcGxhdGZvcm1EYXRhLmZvbnQoKSwgZ2x5cGgsIEZTX01BUF9ESVNUQU5DRUZJ
RUxEIHwgRlNfTUFQX0dSQVlNQVA4KTsKKyAgICBpZiAoIWdseXBobWFwKQorICAgICAgICByZXR1
cm4gRmxvYXRSZWN0KCk7CisKKyAgICBGbG9hdFJlY3QgYm91bmRzKGdseXBobWFwLT5sb194LCBn
bHlwaG1hcC0+aGVpZ2h0IC0gZ2x5cGhtYXAtPmhpX3ksIGdseXBobWFwLT53aWR0aCwgZ2x5cGht
YXAtPmhlaWdodCk7CisgICAgRlNfZnJlZV9jaGFyKG1fcGxhdGZvcm1EYXRhLmZvbnQoKSwgZ2x5
cGhtYXApOworCisgICAgcmV0dXJuIGJvdW5kczsKK30KKworZmxvYXQgU2ltcGxlRm9udERhdGE6
OnBsYXRmb3JtV2lkdGhGb3JHbHlwaChHbHlwaCBnbHlwaCkgY29uc3QKK3sKKyAgICBGU19TSE9S
VCBpZHgsIGlkeTsKKyAgICBGU19GSVhFRCBkeCwgZHk7CisgICAgaWYgKEZTX2dldF9hZHZhbmNl
KG1fcGxhdGZvcm1EYXRhLmZvbnQoKSwgZ2x5cGgsIEZTX01BUF9ESVNUQU5DRUZJRUxEIHwgRlNf
TUFQX0dSQVlNQVA4LCAmaWR4LCAmaWR5LCAmZHgsICZkeSkgIT0gU1VDQ0VTUykKKyAgICAgICAg
cmV0dXJuIDA7CisKKyAgICByZXR1cm4gaVR5cGVGaXhlZFRvRmxvYXQoZHgpOworfQorCitib29s
IFNpbXBsZUZvbnREYXRhOjpjYW5SZW5kZXJDb21iaW5pbmdDaGFyYWN0ZXJTZXF1ZW5jZShjb25z
dCBVQ2hhciogY2hhcmFjdGVycywgc2l6ZV90IGxlbmd0aCkgY29uc3QKK3sKKyAgICBpZiAoIW1f
Y29tYmluaW5nQ2hhcmFjdGVyU2VxdWVuY2VTdXBwb3J0KQorICAgICAgICBtX2NvbWJpbmluZ0No
YXJhY3RlclNlcXVlbmNlU3VwcG9ydCA9IGFkb3B0UHRyKG5ldyBIYXNoTWFwPFN0cmluZywgYm9v
bD4pOworCisgICAgV1RGOjpIYXNoTWFwPFN0cmluZywgYm9vbD46OkFkZFJlc3VsdCBhZGRSZXN1
bHQgPSBtX2NvbWJpbmluZ0NoYXJhY3RlclNlcXVlbmNlU3VwcG9ydC0+YWRkKFN0cmluZyhjaGFy
YWN0ZXJzLCBsZW5ndGgpLCBmYWxzZSk7CisgICAgaWYgKCFhZGRSZXN1bHQuaXNOZXdFbnRyeSkK
KyAgICAgICAgcmV0dXJuIGFkZFJlc3VsdC5pdGVyYXRvci0+dmFsdWU7CisKKyAgICBVRXJyb3JD
b2RlIGVycm9yID0gVV9aRVJPX0VSUk9SOworICAgIFZlY3RvcjxVQ2hhciwgND4gbm9ybWFsaXpl
ZENoYXJhY3RlcnMobGVuZ3RoKTsKKyAgICBpbnQzMl90IG5vcm1hbGl6ZWRMZW5ndGggPSB1bm9y
bV9ub3JtYWxpemUoY2hhcmFjdGVycywgbGVuZ3RoLCBVTk9STV9ORkMsIFVOT1JNX1VOSUNPREVf
M18yLCAmbm9ybWFsaXplZENoYXJhY3RlcnNbMF0sIGxlbmd0aCwgJmVycm9yKTsKKyAgICBpZiAo
VV9GQUlMVVJFKGVycm9yKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaW50IHBvc2l0
aW9uID0gMDsKKyAgICB3aGlsZSAocG9zaXRpb24gPCBub3JtYWxpemVkTGVuZ3RoKSB7CisgICAg
ICAgIFVDaGFyMzIgY2hhcmFjdGVyOworICAgICAgICBpbnQgbmV4dFBvc2l0aW9uID0gcG9zaXRp
b247CisgICAgICAgIFUxNl9ORVhUKG5vcm1hbGl6ZWRDaGFyYWN0ZXJzLCBuZXh0UG9zaXRpb24s
IG5vcm1hbGl6ZWRMZW5ndGgsIGNoYXJhY3Rlcik7CisKKyAgICAgICAgaWYgKCF1X2hhc0JpbmFy
eVByb3BlcnR5KGNoYXJhY3RlciwgVUNIQVJfREVGQVVMVF9JR05PUkFCTEVfQ09ERV9QT0lOVCkp
IHsKKyAgICAgICAgICAgIEZTX1VTSE9SVCBnbHlwaCA9IEZTX21hcF9jaGFyKG1fcGxhdGZvcm1E
YXRhLmZvbnQoKSwgc3RhdGljX2Nhc3Q8RlNfVUxPTkc+KGNoYXJhY3RlcikpOworICAgICAgICAg
ICAgaWYgKCFnbHlwaCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0K
KworICAgICAgICBwb3NpdGlvbiA9IG5leHRQb3NpdGlvbjsKKyAgICB9CisKKyAgICBhZGRSZXN1
bHQuaXRlcmF0b3ItPnZhbHVlID0gdHJ1ZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAvLyBu
YW1lc3BhY2UgV2ViQ29yZQo=
</data>

          </attachment>
      

    </bug>

</bugzilla>