<?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>216305</bug_id>
          
          <creation_ts>2020-09-08 23:58:30 -0700</creation_ts>
          <short_desc>Node flags should be an OptionSet</short_desc>
          <delta_ts>2020-09-09 17:48:16 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>DOM</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          <see_also>https://bugs.webkit.org/show_bug.cgi?id=216335</see_also>
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>216264</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Ryosuke Niwa">rniwa</reporter>
          <assigned_to name="Ryosuke Niwa">rniwa</assigned_to>
          <cc>benjamin</cc>
    
    <cc>cdumez</cc>
    
    <cc>cmarcelo</cc>
    
    <cc>darin</cc>
    
    <cc>esprehn+autocc</cc>
    
    <cc>ews-watchlist</cc>
    
    <cc>kangil.han</cc>
    
    <cc>keith_miller</cc>
    
    <cc>koivisto</cc>
    
    <cc>sabouhallawa</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>webkit-bug-importer</cc>
    
    <cc>ysuzuki</cc>
    
    <cc>zalan</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1686917</commentid>
    <comment_count>0</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2020-09-08 23:58:30 -0700</bug_when>
    <thetext>Node::m_nodeFlags is currently uint32_t. We should turn it into an OptionSet
since there is no states stored there after https://trac.webkit.org/r266769.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1686920</commentid>
    <comment_count>1</comment_count>
      <attachid>408317</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2020-09-09 00:15:18 -0700</bug_when>
    <thetext>Created attachment 408317
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1686927</commentid>
    <comment_count>2</comment_count>
      <attachid>408317</attachid>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2020-09-09 02:01:56 -0700</bug_when>
    <thetext>Comment on attachment 408317
Patch

Nice!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1686928</commentid>
    <comment_count>3</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2020-09-09 02:02:40 -0700</bug_when>
    <thetext>(In reply to Antti Koivisto from comment #2)
&gt; Comment on attachment 408317 [details]
&gt; Patch
&gt; 
&gt; Nice!

Indeed! SO MUCH CLEANER!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1686929</commentid>
    <comment_count>4</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2020-09-09 02:03:50 -0700</bug_when>
    <thetext>Committed r266776: &lt;https://trac.webkit.org/changeset/266776&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1686930</commentid>
    <comment_count>5</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2020-09-09 02:04:20 -0700</bug_when>
    <thetext>&lt;rdar://problem/68559434&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1687151</commentid>
    <comment_count>6</comment_count>
      <attachid>408317</attachid>
    <who name="Said Abou-Hallawa">sabouhallawa</who>
    <bug_when>2020-09-09 15:18:47 -0700</bug_when>
    <thetext>Comment on attachment 408317
Patch

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

&gt; Source/WTF/wtf/OptionSet.h:198
&gt; +        m_storage = (m_storage &amp; ~optionSet.m_storage) | (-static_cast&lt;StorageType&gt;(value) &amp; optionSet.m_storage);

I think this can be written also like this:

    value ? add(optionSet) : remove(optionSet);

This will require one COMPARISON and either OR and ASSIGNMENT (m_storage |= optionSet.m_storage) or NEGATION, AND and ASSIGNMENT (m_storage &amp;= ~optionSet.m_storage). So the maximum is 4 operations

But the solution of this patch would require: NEGATION, AND, CASTING, SUBTRACT, AND, OR and ASSIGNMENT. So the  the maximum is 7 operations. Besides it is harder to read.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1687177</commentid>
    <comment_count>7</comment_count>
      <attachid>408317</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2020-09-09 15:54:28 -0700</bug_when>
    <thetext>Comment on attachment 408317
Patch

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

&gt;&gt; Source/WTF/wtf/OptionSet.h:198
&gt;&gt; +        m_storage = (m_storage &amp; ~optionSet.m_storage) | (-static_cast&lt;StorageType&gt;(value) &amp; optionSet.m_storage);
&gt; 
&gt; I think this can be written also like this:
&gt; 
&gt;     value ? add(optionSet) : remove(optionSet);
&gt; 
&gt; This will require one COMPARISON and either OR and ASSIGNMENT (m_storage |= optionSet.m_storage) or NEGATION, AND and ASSIGNMENT (m_storage &amp;= ~optionSet.m_storage). So the maximum is 4 operations
&gt; 
&gt; But the solution of this patch would require: NEGATION, AND, CASTING, SUBTRACT, AND, OR and ASSIGNMENT. So the  the maximum is 7 operations. Besides it is harder to read.

We can prove whether it’s more efficient or not by testing. (On some architectures, branching is much more expensive than logical operations.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1687182</commentid>
    <comment_count>8</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2020-09-09 16:00:23 -0700</bug_when>
    <thetext>(In reply to Said Abou-Hallawa from comment #6)
&gt; Comment on attachment 408317 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=408317&amp;action=review
&gt; 
&gt; &gt; Source/WTF/wtf/OptionSet.h:198
&gt; &gt; +        m_storage = (m_storage &amp; ~optionSet.m_storage) | (-static_cast&lt;StorageType&gt;(value) &amp; optionSet.m_storage);
&gt; 
&gt; I think this can be written also like this:
&gt; 
&gt;     value ? add(optionSet) : remove(optionSet);
&gt; 
&gt; This will require one COMPARISON and either OR and ASSIGNMENT (m_storage |=
&gt; optionSet.m_storage) or NEGATION, AND and ASSIGNMENT (m_storage &amp;=
&gt; ~optionSet.m_storage). So the maximum is 4 operations
&gt; 
&gt; But the solution of this patch would require: NEGATION, AND, CASTING,
&gt; SUBTRACT, AND, OR and ASSIGNMENT. So the  the maximum is 7 operations.
&gt; Besides it is harder to read.

Counting the number of operations like that is hardly useful in modern CPU. The issue here is branching. Branchless code utilizes CPU pipeline better &amp; doesn&apos;t evict other things in the branch predictor.

Having said that, it looks like clang 10.0 can optimize both of these code pretty well with cmovne.

Here&apos;s output with the branch: https://godbolt.org/z/qqeb5K 
Here&apos;s output with the copy I moved from Node.h: https://godbolt.org/z/jvsoE7</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1687186</commentid>
    <comment_count>9</comment_count>
      <attachid>408317</attachid>
    <who name="Keith Miller">keith_miller</who>
    <bug_when>2020-09-09 16:08:42 -0700</bug_when>
    <thetext>Comment on attachment 408317
Patch

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

&gt;&gt;&gt;&gt; Source/WTF/wtf/OptionSet.h:198
&gt;&gt;&gt;&gt; +        m_storage = (m_storage &amp; ~optionSet.m_storage) | (-static_cast&lt;StorageType&gt;(value) &amp; optionSet.m_storage);
&gt;&gt;&gt; 
&gt;&gt;&gt; I think this can be written also like this:
&gt;&gt;&gt; 
&gt;&gt;&gt;     value ? add(optionSet) : remove(optionSet);
&gt;&gt;&gt; 
&gt;&gt;&gt; This will require one COMPARISON and either OR and ASSIGNMENT (m_storage |= optionSet.m_storage) or NEGATION, AND and ASSIGNMENT (m_storage &amp;= ~optionSet.m_storage). So the maximum is 4 operations
&gt;&gt;&gt; 
&gt;&gt;&gt; But the solution of this patch would require: NEGATION, AND, CASTING, SUBTRACT, AND, OR and ASSIGNMENT. So the  the maximum is 7 operations. Besides it is harder to read.
&gt;&gt; 
&gt;&gt; We can prove whether it’s more efficient or not by testing. (On some architectures, branching is much more expensive than logical operations.)
&gt; 
&gt; Counting the number of operations like that is hardly useful in modern CPU. The issue here is branching. Branchless code utilizes CPU pipeline better &amp; doesn&apos;t evict other things in the branch predictor.
&gt; 
&gt; Having said that, it looks like clang 10.0 can optimize both of these code pretty well with cmovne.
&gt; 
&gt; Here&apos;s output with the branch: https://godbolt.org/z/qqeb5K 
&gt; Here&apos;s output with the copy I moved from Node.h: https://godbolt.org/z/jvsoE7

Branches that are predictable are cheaper than more instructions in my experience. Generally branches are cheaper than a conditional move because conditional moves are not speculated by the CPU. That said if you know the result of the cmov is not feeding into a branch then it might be better than filling the branch predictor.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1687188</commentid>
    <comment_count>10</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2020-09-09 16:10:24 -0700</bug_when>
    <thetext>Hm... ARM outputs are interesting. I couldn&apos;t get clang to work so I only have gcc output but x86 output was basically same between clang &amp; gcc so I&apos;d imagine this is going to be similar.

Here, the one which uses branch ends up generating 3 instructions: https://godbolt.org/z/8b5c1s
Whereas the one which avoids the branch results in 4 instructions:
https://godbolt.org/z/GfPjox</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1687206</commentid>
    <comment_count>11</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2020-09-09 17:35:03 -0700</bug_when>
    <thetext>Alright, this is confusing so I&apos;m generating ARM64 Node::insertedIntoAncestor and Node::removedFromAncestor. This is what we get with the current code:

__ZN7WebCore4Node20insertedIntoAncestorENS0_13InsertionTypeERNS_13ContainerNodeE:
0000000001031c00	stp	x29, x30, [sp, #-0x10]!
0000000001031c04	mov	x29, sp
0000000001031c08	tbnz	w1, #0x0, 0x1031c28
0000000001031c0c	ldr	w8, [x0, #0x1c]
0000000001031c10	ldrb	w9, [x2, #0x1d]
0000000001031c14	tbnz	w9, #0x3, 0x1031c40
0000000001031c18	tbnz	w8, #0xa, 0x1031c4c
0000000001031c1c	mov	w0, #0x0
0000000001031c20	ldp	x29, x30, [sp], #0x10
0000000001031c24	ret
0000000001031c28	ldr	w8, [x0, #0x1c]
0000000001031c2c	orr	w8, w8, #0x400
0000000001031c30	str	w8, [x0, #0x1c]
0000000001031c34	mov	w8, w8
0000000001031c38	ldrb	w9, [x2, #0x1d]
0000000001031c3c	tbz	w9, #0x3, 0x1031c18
0000000001031c40	orr	w8, w8, #0x800
0000000001031c44	str	w8, [x0, #0x1c]
0000000001031c48	tbz	w8, #0xa, 0x1031c1c
0000000001031c4c	ldr	x8, [x0, #0x28]
0000000001031c50	ldr	x8, [x8, #0x8]
0000000001031c54	ldr	x9, [x8, #0x5d0]
0000000001031c58	cbz	x9, 0x1031c1c
0000000001031c5c	ldrb	w9, [x8, #0x96a]
0000000001031c60	cbnz	w9, 0x1031c1c
0000000001031c64	ldrb	w8, [x8, #0x960]
0000000001031c68	cbnz	w8, 0x1031c1c
0000000001031c6c	ldr	x8, [x0, #0x40]
0000000001031c70	mvn	x9, x8
0000000001031c74	tst	x9, #0x3000000000000
0000000001031c78	b.eq	0x1031c84
0000000001031c7c	orr	x8, x8, #0x3000000000000
0000000001031c80	str	x8, [x0, #0x40]
0000000001031c84	bl	0x102fc54
0000000001031c88	mov	w0, #0x0
0000000001031c8c	ldp	x29, x30, [sp], #0x10
0000000001031c90	ret
__ZN7WebCore4Node19removedFromAncestorENS0_11RemovalTypeERNS_13ContainerNodeE:
0000000001031c94	stp	x20, x19, [sp, #-0x20]!
0000000001031c98	stp	x29, x30, [sp, #0x10]
0000000001031c9c	add	x29, sp, #0x10
0000000001031ca0	mov	x19, x0
0000000001031ca4	ldr	w8, [x0, #0x1c]
0000000001031ca8	tbz	w1, #0x0, 0x1031cb4
0000000001031cac	and	w8, w8, #0xfffffbff
0000000001031cb0	str	w8, [x19, #0x1c]
0000000001031cb4	tbz	w8, #0xb, 0x1031cd0
0000000001031cb8	ldr	x9, [x19, #0x28]
0000000001031cbc	ldr	x9, [x9]
0000000001031cc0	ldrb	w9, [x9, #0x1d]
0000000001031cc4	tbnz	w9, #0x1, 0x1031cd0
0000000001031cc8	and	w8, w8, #0xfffff7ff
0000000001031ccc	str	w8, [x19, #0x1c]
0000000001031cd0	and	x8, x1, #0x1
0000000001031cd4	adrp	x9, 5090 ; 0x2413000
0000000001031cd8	add	x9, x9, #0xaf8
0000000001031cdc	ldrb	w9, [x9]
0000000001031ce0	cmp	w9, #0x0
0000000001031ce4	ccmp	x8, #0x0, #0x4, ne
0000000001031ce8	b.eq	0x1031d0c
0000000001031cec	ldr	x8, [x2, #0x28]
0000000001031cf0	ldr	x0, [x8, #0x8]
0000000001031cf4	bl	0xfb60a8
0000000001031cf8	cbz	x0, 0x1031d0c
0000000001031cfc	mov	x1, x19
0000000001031d00	ldp	x29, x30, [sp, #0x10]
0000000001031d04	ldp	x20, x19, [sp], #0x20
0000000001031d08	b	0xcd69f0
0000000001031d0c	ldp	x29, x30, [sp, #0x10]
0000000001031d10	ldp	x20, x19, [sp], #0x20
0000000001031d14	ret

Looks like we generate the identical code from the conditional version:
__ZN7WebCore4Node20insertedIntoAncestorENS0_13InsertionTypeERNS_13ContainerNodeE:
0000000001031be8	stp	x29, x30, [sp, #-0x10]!
0000000001031bec	mov	x29, sp
0000000001031bf0	tbnz	w1, #0x0, 0x1031c10
0000000001031bf4	ldr	w8, [x0, #0x1c]
0000000001031bf8	ldrb	w9, [x2, #0x1d]
0000000001031bfc	tbnz	w9, #0x3, 0x1031c28
0000000001031c00	tbnz	w8, #0xa, 0x1031c34
0000000001031c04	mov	w0, #0x0
0000000001031c08	ldp	x29, x30, [sp], #0x10
0000000001031c0c	ret
0000000001031c10	ldr	w8, [x0, #0x1c]
0000000001031c14	orr	w8, w8, #0x400
0000000001031c18	str	w8, [x0, #0x1c]
0000000001031c1c	mov	w8, w8
0000000001031c20	ldrb	w9, [x2, #0x1d]
0000000001031c24	tbz	w9, #0x3, 0x1031c00
0000000001031c28	orr	w8, w8, #0x800
0000000001031c2c	str	w8, [x0, #0x1c]
0000000001031c30	tbz	w8, #0xa, 0x1031c04
0000000001031c34	ldr	x8, [x0, #0x28]
0000000001031c38	ldr	x8, [x8, #0x8]
0000000001031c3c	ldr	x9, [x8, #0x5d0]
0000000001031c40	cbz	x9, 0x1031c04
0000000001031c44	ldrb	w9, [x8, #0x96a]
0000000001031c48	cbnz	w9, 0x1031c04
0000000001031c4c	ldrb	w8, [x8, #0x960]
0000000001031c50	cbnz	w8, 0x1031c04
0000000001031c54	ldr	x8, [x0, #0x40]
0000000001031c58	mvn	x9, x8
0000000001031c5c	tst	x9, #0x3000000000000
0000000001031c60	b.eq	0x1031c6c
0000000001031c64	orr	x8, x8, #0x3000000000000
0000000001031c68	str	x8, [x0, #0x40]
0000000001031c6c	bl	0x102fc3c
0000000001031c70	mov	w0, #0x0
0000000001031c74	ldp	x29, x30, [sp], #0x10
0000000001031c78	ret
__ZN7WebCore4Node19removedFromAncestorENS0_11RemovalTypeERNS_13ContainerNodeE:
0000000001031c7c	stp	x20, x19, [sp, #-0x20]!
0000000001031c80	stp	x29, x30, [sp, #0x10]
0000000001031c84	add	x29, sp, #0x10
0000000001031c88	mov	x19, x0
0000000001031c8c	ldr	w8, [x0, #0x1c]
0000000001031c90	tbz	w1, #0x0, 0x1031c9c
0000000001031c94	and	w8, w8, #0xfffffbff
0000000001031c98	str	w8, [x19, #0x1c]
0000000001031c9c	tbz	w8, #0xb, 0x1031cb8
0000000001031ca0	ldr	x9, [x19, #0x28]
0000000001031ca4	ldr	x9, [x9]
0000000001031ca8	ldrb	w9, [x9, #0x1d]
0000000001031cac	tbnz	w9, #0x1, 0x1031cb8
0000000001031cb0	and	w8, w8, #0xfffff7ff
0000000001031cb4	str	w8, [x19, #0x1c]
0000000001031cb8	and	x8, x1, #0x1
0000000001031cbc	adrp	x9, 5090 ; 0x2413000
0000000001031cc0	add	x9, x9, #0xaf8
0000000001031cc4	ldrb	w9, [x9]
0000000001031cc8	cmp	w9, #0x0
0000000001031ccc	ccmp	x8, #0x0, #0x4, ne
0000000001031cd0	b.eq	0x1031cf4
0000000001031cd4	ldr	x8, [x2, #0x28]
0000000001031cd8	ldr	x0, [x8, #0x8]
0000000001031cdc	bl	0xfb6098
0000000001031ce0	cbz	x0, 0x1031cf4
0000000001031ce4	mov	x1, x19
0000000001031ce8	ldp	x29, x30, [sp, #0x10]
0000000001031cec	ldp	x20, x19, [sp], #0x20
0000000001031cf0	b	0xcd69e0
0000000001031cf4	ldp	x29, x30, [sp, #0x10]
0000000001031cf8	ldp	x20, x19, [sp], #0x20
0000000001031cfc	ret</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1687208</commentid>
    <comment_count>12</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2020-09-09 17:39:18 -0700</bug_when>
    <thetext>Tracking the simplification in https://bugs.webkit.org/show_bug.cgi?id=216335.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1687209</commentid>
    <comment_count>13</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2020-09-09 17:48:16 -0700</bug_when>
    <thetext>Generating identical code for both of those makes me feel good about compilers! That should be their goal in a case like this.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>408317</attachid>
            <date>2020-09-09 00:15:18 -0700</date>
            <delta_ts>2020-09-09 02:01:56 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-216305-20200909001517.patch</filename>
            <type>text/plain</type>
            <size>30133</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XVEYvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XVEYvQ2hh
bmdlTG9nCShyZXZpc2lvbiAyNjY3NjgpCisrKyBTb3VyY2UvV1RGL0NoYW5nZUxvZwkod29ya2lu
ZyBjb3B5KQpAQCAtMSwzICsxLDEzIEBACisyMDIwLTA5LTA4ICBSeW9zdWtlIE5pd2EgIDxybml3
YUB3ZWJraXQub3JnPgorCisgICAgICAgIE5vZGUgZmxhZ3Mgc2hvdWxkIGJlIGFuIE9wdGlvblNl
dAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjE2MzA1
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiB3dGYv
T3B0aW9uU2V0Lmg6CisgICAgICAgIChXVEY6Ok9wdGlvblNldDo6c2V0KTogQWRkZWQuCisKIDIw
MjAtMDktMDYgIFJ5b3N1a2UgTml3YSAgPHJuaXdhQHdlYmtpdC5vcmc+CiAKICAgICAgICAgTWFr
ZSBDb21wYWN0VW5pcXVlUHRyVHVwbGUgYWN0dWFsbHkgd29yayB3aXRoIHN1YmNsYXNzaW5nIGFu
ZCBjdXN0b20gZGVsZXRlcgpJbmRleDogU291cmNlL1dURi93dGYvT3B0aW9uU2V0LmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dURi93dGYvT3B0aW9uU2V0LmgJKHJldmlzaW9uIDI2Njc2OCkKKysr
IFNvdXJjZS9XVEYvd3RmL09wdGlvblNldC5oCSh3b3JraW5nIGNvcHkpCkBAIC0xOTMsNiArMTkz
LDExIEBAIHB1YmxpYzoKICAgICAgICAgbV9zdG9yYWdlICY9IH5vcHRpb25TZXQubV9zdG9yYWdl
OwogICAgIH0KIAorICAgIGNvbnN0ZXhwciB2b2lkIHNldChPcHRpb25TZXQgb3B0aW9uU2V0LCBi
b29sIHZhbHVlKQorICAgIHsKKyAgICAgICAgbV9zdG9yYWdlID0gKG1fc3RvcmFnZSAmIH5vcHRp
b25TZXQubV9zdG9yYWdlKSB8ICgtc3RhdGljX2Nhc3Q8U3RvcmFnZVR5cGU+KHZhbHVlKSAmIG9w
dGlvblNldC5tX3N0b3JhZ2UpOworICAgIH0KKwogICAgIGNvbnN0ZXhwciBib29sIGhhc0V4YWN0
bHlPbmVCaXRTZXQoKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fc3RvcmFnZSAmJiAh
KG1fc3RvcmFnZSAmIChtX3N0b3JhZ2UgLSAxKSk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9DaGFu
Z2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCShyZXZpc2lvbiAy
NjY3NjkpCisrKyBTb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEs
MyArMSw5MyBAQAorMjAyMC0wOS0wOCAgUnlvc3VrZSBOaXdhICA8cm5pd2FAd2Via2l0Lm9yZz4K
KworICAgICAgICBOb2RlIGZsYWdzIHNob3VsZCBiZSBhbiBPcHRpb25TZXQKKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIxNjMwNQorCisgICAgICAgIFJl
dmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFRoaXMgcGF0Y2ggcmVuYW1lcyBO
b2RlRmxhZ3MgdG8gTm9kZUZsYWcgYW5kIHR1cm5zIGludG8gYW4gZW51bSBjbGFzcyBhbmQgY2hh
bmdlcyB0aGUgdHlwZSBvZgorICAgICAgICBtX25vZGVGbGFncyBmcm9tIHVpbnQzMl90IHRvIE9w
dGlvblNldDxOb2RlRmxhZz4gYXMgdGhlcmUgaXMgbm8gc3RhdGUgc3RvcmVkIHRoZXJlIGFmdGVy
IHIyNjY3NjkuCisKKyAgICAgICAgVGhpcyBwYXRjaCBhbHNvIGludHJvZHVjZXMgdHdvIG5ldyBO
b2RlRmxhZyBmb3IgaWRlbnRpZnlpbmcgQ2hhcmFjdGVyRGF0YSBhbmQgRG9jdW1lbnRGcmFnbWVu
dAorICAgICAgICB0byBzaW1wbGlmeSB0aGUgdHlwZSBjaGVjayBjb25kaXRpb25zIGZvciB0aGVz
ZSBub2RlcyBub3cgdGhhdCB3ZSBoYXZlIHBsZW50eSBvZiBmcmVlIGJpdHMuCisKKyAgICAgICAg
Tm8gbmV3IHRlc3RzIHNpbmNlIHRoZXJlIHNob3VsZCBiZSBubyBiZWhhdmlvcmFsIGNoYW5nZS4K
KworICAgICAgICAqIGRvbS9DaGFyYWN0ZXJEYXRhLmg6CisgICAgICAgIChXZWJDb3JlOjpDaGFy
YWN0ZXJEYXRhOjpDaGFyYWN0ZXJEYXRhKTogU2V0cyBOb2RlRmxhZzo6SXNDb250YWluZXJOb2Rl
IHZpYSBDcmVhdGVDaGFyYWN0ZXJEYXRhLgorICAgICAgICAoV2ViQ29yZTo6Q2hhcmFjdGVyRGF0
YTo6dmlydHVhbElzQ2hhcmFjdGVyRGF0YSk6IERlbGV0ZWQuCisgICAgICAgICogZG9tL0NvbW1l
bnQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Q29tbWVudDo6Q29tbWVudCk6IERpdHRvLgorICAg
ICAgICAqIGRvbS9FbGVtZW50LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnQ6OnNldEhh
c0ZvY3VzV2l0aGluKToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnQ6OnJlbW92ZWRGcm9tQW5j
ZXN0b3IpOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudDo6c2V0Q29udGFpbnNGdWxsU2NyZWVu
RWxlbWVudCk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50OjpjcmVhdGVFbGVtZW50SWRlbnRp
Zmllcik6CisgICAgICAgICogZG9tL0VsZW1lbnQuaDoKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1l
bnQ6Omhhc0ZvY3VzV2l0aGluIGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnQ6Omhh
c1BlbmRpbmdSZXNvdXJjZXMgY29uc3QpOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudDo6c2V0
SGFzUGVuZGluZ1Jlc291cmNlcyk6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50OjpjbGVhckhh
c1BlbmRpbmdSZXNvdXJjZXMpOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudDo6aGFzQ1NTQW5p
bWF0aW9uIGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnQ6OnNldEhhc0NTU0FuaW1h
dGlvbik6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50OjpjbGVhckhhc0NTU0FuaW1hdGlvbik6
CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50Ojpjb250YWluc0Z1bGxTY3JlZW5FbGVtZW50IGNv
bnN0KToKKyAgICAgICAgKiBkb20vTm9kZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpOb2RlOjpp
bnNlcnRlZEludG9BbmNlc3Rvcik6CisgICAgICAgIChXZWJDb3JlOjpOb2RlOjpyZW1vdmVkRnJv
bUFuY2VzdG9yKToKKyAgICAgICAgKiBkb20vTm9kZS5oOgorICAgICAgICAoV2ViQ29yZTo6Tm9k
ZTo6aXNFbGVtZW50Tm9kZSBjb25zdCk6CisgICAgICAgIChXZWJDb3JlOjpOb2RlOjppc0NvbnRh
aW5lck5vZGUgY29uc3QpOgorICAgICAgICAoV2ViQ29yZTo6Tm9kZTo6aXNUZXh0Tm9kZSBjb25z
dCk6CisgICAgICAgIChXZWJDb3JlOjpOb2RlOjppc0hUTUxFbGVtZW50IGNvbnN0KToKKyAgICAg
ICAgKFdlYkNvcmU6Ok5vZGU6OmlzU1ZHRWxlbWVudCBjb25zdCk6CisgICAgICAgIChXZWJDb3Jl
OjpOb2RlOjppc01hdGhNTEVsZW1lbnQgY29uc3QpOgorICAgICAgICAoV2ViQ29yZTo6Tm9kZTo6
aXNTdHlsZWRFbGVtZW50IGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6Ok5vZGU6OmlzQ2hhcmFj
dGVyRGF0YU5vZGUgY29uc3QpOiBDaGVjayB0aGUgbmV3bHkgYWRkZWQgTm9kZUZsYWc6OklzQ29u
dGFpbmVyTm9kZS4KKyAgICAgICAgKFdlYkNvcmU6Ok5vZGU6OmlzRG9jdW1lbnROb2RlIGNvbnN0
KToKKyAgICAgICAgKFdlYkNvcmU6Ok5vZGU6OmlzVHJlZVNjb3BlIGNvbnN0KToKKyAgICAgICAg
KFdlYkNvcmU6Ok5vZGU6OmlzRG9jdW1lbnRGcmFnbWVudCBjb25zdCk6OiBDaGVjayB0aGUgbmV3
bHkgYWRkZWQgTm9kZUZsYWc6OklzRG9jdW1lbnRGcmFnbWVudC4KKyAgICAgICAgKFdlYkNvcmU6
Ok5vZGU6OmlzU2hhZG93Um9vdCBjb25zdCk6CisgICAgICAgIChXZWJDb3JlOjpOb2RlOjpoYXND
dXN0b21TdHlsZVJlc29sdmVDYWxsYmFja3MgY29uc3QpOgorICAgICAgICAoV2ViQ29yZTo6Tm9k
ZTo6aGFzU3ludGhldGljQXR0ckNoaWxkTm9kZXMgY29uc3QpOgorICAgICAgICAoV2ViQ29yZTo6
Tm9kZTo6c2V0SGFzU3ludGhldGljQXR0ckNoaWxkTm9kZXMpOgorICAgICAgICAoV2ViQ29yZTo6
Tm9kZTo6c2VsZk9yQW5jZXN0b3JIYXNEaXJBdXRvQXR0cmlidXRlIGNvbnN0KToKKyAgICAgICAg
KFdlYkNvcmU6Ok5vZGU6OnNldFNlbGZPckFuY2VzdG9ySGFzRGlyQXV0b0F0dHJpYnV0ZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpOb2RlOjppc1VzZXJBY3Rpb25FbGVtZW50IGNvbnN0KToKKyAgICAg
ICAgKFdlYkNvcmU6Ok5vZGU6OnNldFVzZXJBY3Rpb25FbGVtZW50KToKKyAgICAgICAgKFdlYkNv
cmU6Ok5vZGU6OmlzRWRpdGluZ1RleHQgY29uc3QpOiBSZW1vdmVkIHRoZSBjaGVjayBmb3IgSXNU
ZXh0RmxhZyBzaW5jZSB0aGlzIGlzIG5vIGxvbmdlciBuZWVkZWQKKyAgICAgICAgYWZ0ZXIgcjI2
Njc2OSBhcyBubyBsb25nZXIgc2hhcmUgdGhlIGJpdCBmb3IgSXNFZGl0aW5nVGV4dCB3aXRoIGFu
IHVua25vd24gY3VzdG9tIGVsZW1lbnQuCisgICAgICAgIChXZWJDb3JlOjpOb2RlOjppc0xpbmsg
Y29uc3QpOgorICAgICAgICAoV2ViQ29yZTo6Tm9kZTo6c2V0SXNMaW5rKToKKyAgICAgICAgKFdl
YkNvcmU6Ok5vZGU6Omhhc0V2ZW50VGFyZ2V0RGF0YSBjb25zdCk6CisgICAgICAgIChXZWJDb3Jl
OjpOb2RlOjpzZXRIYXNFdmVudFRhcmdldERhdGEpOgorICAgICAgICAoV2ViQ29yZTo6Tm9kZTo6
aXNDb25uZWN0ZWQgY29uc3QpOgorICAgICAgICAoV2ViQ29yZTo6Tm9kZTo6aXNJblNoYWRvd1Ry
ZWUgY29uc3QpOgorICAgICAgICAoV2ViQ29yZTo6Tm9kZTo6aXNJblRyZWVTY29wZSBjb25zdCk6
CisgICAgICAgIChXZWJDb3JlOjpOb2RlOjpmbGFnSXNUZXh0KToKKyAgICAgICAgKFdlYkNvcmU6
Ok5vZGU6OmZsYWdJc0NvbnRhaW5lcik6CisgICAgICAgIChXZWJDb3JlOjpOb2RlOjpmbGFnSXNF
bGVtZW50KToKKyAgICAgICAgKFdlYkNvcmU6Ok5vZGU6OmZsYWdJc1NoYWRvd1Jvb3QpOgorICAg
ICAgICAoV2ViQ29yZTo6Tm9kZTo6ZmxhZ0lzSFRNTCk6CisgICAgICAgIChXZWJDb3JlOjpOb2Rl
OjpmbGFnSXNMaW5rKToKKyAgICAgICAgKFdlYkNvcmU6Ok5vZGU6OmZsYWdIYXNGb2N1c1dpdGhp
bik6CisgICAgICAgIChXZWJDb3JlOjpOb2RlOjpmbGFnSXNQYXJzaW5nQ2hpbGRyZW5GaW5pc2hl
ZCk6CisgICAgICAgIChXZWJDb3JlOjpOb2RlOjpOb2RlRmxhZyk6IFJlbmFtZWQgZnJvbSBOb2Rl
RmxhZ3MgYW5kIG1hZGUgaXQgYW4gZW51bSBjbGFzcywgYW5kIGludHJvZHVjZWQgSXNDaGFyYWN0
ZXJEYXRhCisgICAgICAgIGFuZCBJc0RvY3VtZW50RnJhZ21lbnQgYW5kIHJlbW92ZWQgIkZsYWci
IHN1ZmZpeCBmcm9tIHZhcmlvdXMgZmxhZ3MuCisgICAgICAgIChXZWJDb3JlOjpOb2RlOjpoYXNO
b2RlRmxhZyBjb25zdCk6IFJlbmFtZWQgZnJvbSBnZXRGbGFnIGZvciBjbGFyaXR5LgorICAgICAg
ICAoV2ViQ29yZTo6Tm9kZTo6c2V0Tm9kZUZsYWcgY29uc3QpOiBEaXR0byBmcm9tIHNldEZsYWcu
IEFsc28gbWVyZ2UgdGhlIHR3byB2ZXJzaW9ucyBvZiBzZXRGbGFnIG9uZSBvZiB3aGljaAorICAg
ICAgICB0b29rIGEgYm9vbGVhbiBhcnVnbWVudCBhcyB0aGUgZmlyc3QgYXJndW1lbnQgYnkgbWFr
aW5nIHRoaXMgYSBzZWNvbmQgb3B0aW9uYWwgYXJndW1lbnQuCisgICAgICAgIChXZWJDb3JlOjpO
b2RlOjpjbGVhck5vZGVGbGFnIGNvbnN0KTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpOb2Rl
Ojppc1BhcnNpbmdDaGlsZHJlbkZpbmlzaGVkIGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6Ok5v
ZGU6OnNldElzUGFyc2luZ0NoaWxkcmVuRmluaXNoZWQpOgorICAgICAgICAoV2ViQ29yZTo6Tm9k
ZTo6Y2xlYXJJc1BhcnNpbmdDaGlsZHJlbkZpbmlzaGVkKToKKyAgICAgICAgKFdlYkNvcmU6Ok5v
ZGU6OkNvbnN0cnVjdGlvblR5cGUpOiBUaGlzIGlzIG5vdyBhbiBhbGlhcyB0byBPcHRpb25TZXQ8
Tm9kZUZsYWc+IGluc3RlYWQgb2YgYSBzZXBhcmF0ZSBlbnVtLgorICAgICAgICAoV2ViQ29yZTo6
Tm9kZTo6c2V0SGFzQ3VzdG9tU3R5bGVSZXNvbHZlQ2FsbGJhY2tzKToKKyAgICAgICAgKFdlYkNv
cmU6Ok5vZGU6OnZpcnR1YWxJc0NoYXJhY3RlckRhdGEgY29uc3QpOiBEZWxldGVkLgorICAgICAg
ICAqIGRvbS9Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb24uY3BwOgorICAgICAgICAoV2ViQ29yZTo6UHJv
Y2Vzc2luZ0luc3RydWN0aW9uOjpQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pOiBTZXRzIE5vZGVGbGFn
OjpJc0NvbnRhaW5lck5vZGUgdmlhIENoYXJhY3RlckRhdGEncworICAgICAgICBjb25zdHJ1Y3Rv
cidzIGRlZmF1bHQgYXJndW1lbnQgdmFsdWUuCisKIDIwMjAtMDktMDggIFJ5b3N1a2UgTml3YSAg
PHJuaXdhQHdlYmtpdC5vcmc+CiAKICAgICAgICAgSGF2aW5nIGFuIGlmcmFtZSBhcyBhIGRlc2Nl
bmRlbnQgbm9kZSBzaG91bGRuJ3QgcmVxdWlyZSBFbGVtZW50UmFyZURhdGEKSW5kZXg6IFNvdXJj
ZS9XZWJDb3JlL2RvbS9DaGFyYWN0ZXJEYXRhLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNv
cmUvZG9tL0NoYXJhY3RlckRhdGEuaAkocmV2aXNpb24gMjY2NzY4KQorKysgU291cmNlL1dlYkNv
cmUvZG9tL0NoYXJhY3RlckRhdGEuaAkod29ya2luZyBjb3B5KQpAQCAtNDYsMTEgKzQ2LDExIEBA
IHB1YmxpYzoKICAgICB1bnNpZ25lZCBwYXJzZXJBcHBlbmREYXRhKGNvbnN0IFN0cmluZyYgc3Ry
aW5nLCB1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIGxlbmd0aExpbWl0KTsKIAogcHJvdGVjdGVk
OgotICAgIENoYXJhY3RlckRhdGEoRG9jdW1lbnQmIGRvY3VtZW50LCBjb25zdCBTdHJpbmcmIHRl
eHQsIENvbnN0cnVjdGlvblR5cGUgdHlwZSkKKyAgICBDaGFyYWN0ZXJEYXRhKERvY3VtZW50JiBk
b2N1bWVudCwgY29uc3QgU3RyaW5nJiB0ZXh0LCBDb25zdHJ1Y3Rpb25UeXBlIHR5cGUgPSBDcmVh
dGVDaGFyYWN0ZXJEYXRhKQogICAgICAgICA6IE5vZGUoZG9jdW1lbnQsIHR5cGUpCiAgICAgICAg
ICwgbV9kYXRhKCF0ZXh0LmlzTnVsbCgpID8gdGV4dCA6IGVtcHR5U3RyaW5nKCkpCiAgICAgewot
ICAgICAgICBBU1NFUlQodHlwZSA9PSBDcmVhdGVPdGhlciB8fCB0eXBlID09IENyZWF0ZVRleHQg
fHwgdHlwZSA9PSBDcmVhdGVFZGl0aW5nVGV4dCk7CisgICAgICAgIEFTU0VSVCh0eXBlID09IENy
ZWF0ZUNoYXJhY3RlckRhdGEgfHwgdHlwZSA9PSBDcmVhdGVUZXh0IHx8IHR5cGUgPT0gQ3JlYXRl
RWRpdGluZ1RleHQpOwogICAgIH0KIAogICAgIHZvaWQgc2V0RGF0YVdpdGhvdXRVcGRhdGUoY29u
c3QgU3RyaW5nJiBkYXRhKQpAQCAtNjMsNyArNjMsNiBAQCBwcm90ZWN0ZWQ6CiBwcml2YXRlOgog
ICAgIFN0cmluZyBub2RlVmFsdWUoKSBjb25zdCBmaW5hbDsKICAgICBFeGNlcHRpb25Pcjx2b2lk
PiBzZXROb2RlVmFsdWUoY29uc3QgU3RyaW5nJikgZmluYWw7Ci0gICAgYm9vbCB2aXJ0dWFsSXND
aGFyYWN0ZXJEYXRhKCkgY29uc3QgZmluYWwgeyByZXR1cm4gdHJ1ZTsgfQogICAgIHZvaWQgbm90
aWZ5UGFyZW50QWZ0ZXJDaGFuZ2UoQ29udGFpbmVyTm9kZTo6Q2hpbGRDaGFuZ2VTb3VyY2UpOwog
CiAgICAgU3RyaW5nIG1fZGF0YTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2RvbS9Db21tZW50LmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9kb20vQ29tbWVudC5jcHAJKHJldmlzaW9u
IDI2Njc2OCkKKysrIFNvdXJjZS9XZWJDb3JlL2RvbS9Db21tZW50LmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMzAsNyArMzAsNyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiBXVEZfTUFLRV9JU09fQUxM
T0NBVEVEX0lNUEwoQ29tbWVudCk7CiAKIGlubGluZSBDb21tZW50OjpDb21tZW50KERvY3VtZW50
JiBkb2N1bWVudCwgY29uc3QgU3RyaW5nJiB0ZXh0KQotICAgIDogQ2hhcmFjdGVyRGF0YShkb2N1
bWVudCwgdGV4dCwgQ3JlYXRlT3RoZXIpCisgICAgOiBDaGFyYWN0ZXJEYXRhKGRvY3VtZW50LCB0
ZXh0KQogewogfQogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9kb20vRWxlbWVudC5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dlYkNvcmUvZG9tL0VsZW1lbnQuY3BwCShyZXZpc2lvbiAyNjY3Njkp
CisrKyBTb3VyY2UvV2ViQ29yZS9kb20vRWxlbWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTc0
MSw3ICs3NDEsNyBAQCB2b2lkIEVsZW1lbnQ6OnNldEhhc0ZvY3VzV2l0aGluKGJvb2wgZmxhCiAg
ICAgICAgIHJldHVybjsKICAgICB7CiAgICAgICAgIFN0eWxlOjpQc2V1ZG9DbGFzc0NoYW5nZUlu
dmFsaWRhdGlvbiBzdHlsZUludmFsaWRhdGlvbigqdGhpcywgQ1NTU2VsZWN0b3I6OlBzZXVkb0Ns
YXNzRm9jdXNXaXRoaW4pOwotICAgICAgICBzZXRGbGFnKGZsYWcsIEhhc0ZvY3VzV2l0aGluKTsK
KyAgICAgICAgc2V0Tm9kZUZsYWcoTm9kZUZsYWc6Okhhc0ZvY3VzV2l0aGluLCBmbGFnKTsKICAg
ICB9CiB9CiAKQEAgLTIyOTEsOSArMjI5MSw5IEBAIHZvaWQgRWxlbWVudDo6cmVtb3ZlZEZyb21B
bmNlc3RvcihSZW1vdmEKICAgICB9CiAjZW5kaWYKIAotICAgIGlmIChnZXRGbGFnKEhhc0VsZW1l
bnRJZGVudGlmaWVyRmxhZykpIHsKKyAgICBpZiAoaGFzTm9kZUZsYWcoTm9kZUZsYWc6Okhhc0Vs
ZW1lbnRJZGVudGlmaWVyKSkgewogICAgICAgICBkb2N1bWVudCgpLmlkZW50aWZpZWRFbGVtZW50
V2FzUmVtb3ZlZEZyb21Eb2N1bWVudCgqdGhpcyk7Ci0gICAgICAgIGNsZWFyRmxhZyhIYXNFbGVt
ZW50SWRlbnRpZmllckZsYWcpOworICAgICAgICBjbGVhck5vZGVGbGFnKE5vZGVGbGFnOjpIYXNF
bGVtZW50SWRlbnRpZmllcik7CiAgICAgfQogfQogCkBAIC0zNzQ5LDkgKzM3NDksOSBAQCB2b2lk
IEVsZW1lbnQ6OndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuKCkKIHZvaWQgRWxlbWVudDo6c2V0Q29u
dGFpbnNGdWxsU2NyZWVuRWxlbWVudChib29sIGZsYWcpCiB7CiAgICAgaWYgKGZsYWcpCi0gICAg
ICAgIHNldEZsYWcoQ29udGFpbnNGdWxsU2NyZWVuRWxlbWVudEZsYWcpOworICAgICAgICBzZXRO
b2RlRmxhZyhOb2RlRmxhZzo6Q29udGFpbnNGdWxsU2NyZWVuRWxlbWVudCk7CiAgICAgZWxzZQot
ICAgICAgICBjbGVhckZsYWcoQ29udGFpbnNGdWxsU2NyZWVuRWxlbWVudEZsYWcpOworICAgICAg
ICBjbGVhck5vZGVGbGFnKE5vZGVGbGFnOjpDb250YWluc0Z1bGxTY3JlZW5FbGVtZW50KTsKICAg
ICBpbnZhbGlkYXRlU3R5bGVBbmRMYXllckNvbXBvc2l0aW9uKCk7CiB9CiAKQEAgLTQ2MDUsOCAr
NDYwNSw4IEBAIFZlY3RvcjxSZWZQdHI8V2ViQW5pbWF0aW9uPj4gRWxlbWVudDo6Z2UKIAogRWxl
bWVudElkZW50aWZpZXIgRWxlbWVudDo6Y3JlYXRlRWxlbWVudElkZW50aWZpZXIoKQogewotICAg
IEFTU0VSVCghZ2V0RmxhZyhIYXNFbGVtZW50SWRlbnRpZmllckZsYWcpKTsKLSAgICBzZXRGbGFn
KEhhc0VsZW1lbnRJZGVudGlmaWVyRmxhZyk7CisgICAgQVNTRVJUKCFoYXNOb2RlRmxhZyhOb2Rl
RmxhZzo6SGFzRWxlbWVudElkZW50aWZpZXIpKTsKKyAgICBzZXROb2RlRmxhZyhOb2RlRmxhZzo6
SGFzRWxlbWVudElkZW50aWZpZXIpOwogICAgIHJldHVybiBFbGVtZW50SWRlbnRpZmllcjo6Z2Vu
ZXJhdGUoKTsKIH0KIApJbmRleDogU291cmNlL1dlYkNvcmUvZG9tL0VsZW1lbnQuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9kb20vRWxlbWVudC5oCShyZXZpc2lvbiAyNjY3NjgpCisr
KyBTb3VyY2UvV2ViQ29yZS9kb20vRWxlbWVudC5oCSh3b3JraW5nIGNvcHkpCkBAIC0zMjAsNyAr
MzIwLDcgQEAgcHVibGljOgogICAgIGJvb2wgaG92ZXJlZCgpIGNvbnN0IHsgcmV0dXJuIGlzVXNl
ckFjdGlvbkVsZW1lbnQoKSAmJiBpc1VzZXJBY3Rpb25FbGVtZW50SG92ZXJlZCgpOyB9CiAgICAg
Ym9vbCBmb2N1c2VkKCkgY29uc3QgeyByZXR1cm4gaXNVc2VyQWN0aW9uRWxlbWVudCgpICYmIGlz
VXNlckFjdGlvbkVsZW1lbnRGb2N1c2VkKCk7IH0KICAgICBib29sIGlzQmVpbmdEcmFnZ2VkKCkg
Y29uc3QgeyByZXR1cm4gaXNVc2VyQWN0aW9uRWxlbWVudCgpICYmIGlzVXNlckFjdGlvbkVsZW1l
bnREcmFnZ2VkKCk7IH0KLSAgICBib29sIGhhc0ZvY3VzV2l0aGluKCkgY29uc3QgeyByZXR1cm4g
Z2V0RmxhZyhIYXNGb2N1c1dpdGhpbik7IH07CisgICAgYm9vbCBoYXNGb2N1c1dpdGhpbigpIGNv
bnN0IHsgcmV0dXJuIGhhc05vZGVGbGFnKE5vZGVGbGFnOjpIYXNGb2N1c1dpdGhpbik7IH07CiAK
ICAgICB2aXJ0dWFsIHZvaWQgc2V0QWN0aXZlKGJvb2wgPSB0cnVlLCBib29sIHBhdXNlID0gZmFs
c2UpOwogICAgIHZpcnR1YWwgdm9pZCBzZXRIb3ZlcmVkKGJvb2wgPSB0cnVlKTsKQEAgLTQ4MSwx
NCArNDgxLDE0IEBAIHB1YmxpYzoKIAogICAgIHZpcnR1YWwgYm9vbCBjaGlsZFNob3VsZENyZWF0
ZVJlbmRlcmVyKGNvbnN0IE5vZGUmKSBjb25zdDsKIAotICAgIGJvb2wgaGFzUGVuZGluZ1Jlc291
cmNlcygpIGNvbnN0IHsgcmV0dXJuIGdldEZsYWcoSGFzUGVuZGluZ1Jlc291cmNlc0ZsYWcpOyB9
Ci0gICAgdm9pZCBzZXRIYXNQZW5kaW5nUmVzb3VyY2VzKCkgeyBzZXRGbGFnKEhhc1BlbmRpbmdS
ZXNvdXJjZXNGbGFnKTsgfQotICAgIHZvaWQgY2xlYXJIYXNQZW5kaW5nUmVzb3VyY2VzKCkgeyBj
bGVhckZsYWcoSGFzUGVuZGluZ1Jlc291cmNlc0ZsYWcpOyB9CisgICAgYm9vbCBoYXNQZW5kaW5n
UmVzb3VyY2VzKCkgY29uc3QgeyByZXR1cm4gaGFzTm9kZUZsYWcoTm9kZUZsYWc6Okhhc1BlbmRp
bmdSZXNvdXJjZXMpOyB9CisgICAgdm9pZCBzZXRIYXNQZW5kaW5nUmVzb3VyY2VzKCkgeyBzZXRO
b2RlRmxhZyhOb2RlRmxhZzo6SGFzUGVuZGluZ1Jlc291cmNlcyk7IH0KKyAgICB2b2lkIGNsZWFy
SGFzUGVuZGluZ1Jlc291cmNlcygpIHsgY2xlYXJOb2RlRmxhZyhOb2RlRmxhZzo6SGFzUGVuZGlu
Z1Jlc291cmNlcyk7IH0KICAgICB2aXJ0dWFsIHZvaWQgYnVpbGRQZW5kaW5nUmVzb3VyY2UoKSB7
IH07CiAKLSAgICBib29sIGhhc0NTU0FuaW1hdGlvbigpIGNvbnN0IHsgcmV0dXJuIGdldEZsYWco
SGFzQ1NTQW5pbWF0aW9uRmxhZyk7IH0KLSAgICB2b2lkIHNldEhhc0NTU0FuaW1hdGlvbigpIHsg
c2V0RmxhZyhIYXNDU1NBbmltYXRpb25GbGFnKTsgfQotICAgIHZvaWQgY2xlYXJIYXNDU1NBbmlt
YXRpb24oKSB7IGNsZWFyRmxhZyhIYXNDU1NBbmltYXRpb25GbGFnKTsgfQorICAgIGJvb2wgaGFz
Q1NTQW5pbWF0aW9uKCkgY29uc3QgeyByZXR1cm4gaGFzTm9kZUZsYWcoTm9kZUZsYWc6Okhhc0NT
U0FuaW1hdGlvbik7IH0KKyAgICB2b2lkIHNldEhhc0NTU0FuaW1hdGlvbigpIHsgc2V0Tm9kZUZs
YWcoTm9kZUZsYWc6Okhhc0NTU0FuaW1hdGlvbik7IH0KKyAgICB2b2lkIGNsZWFySGFzQ1NTQW5p
bWF0aW9uKCkgeyBjbGVhck5vZGVGbGFnKE5vZGVGbGFnOjpIYXNDU1NBbmltYXRpb24pOyB9CiAK
ICAgICBLZXlmcmFtZUVmZmVjdFN0YWNrKiBrZXlmcmFtZUVmZmVjdFN0YWNrKCkgY29uc3Q7CiAg
ICAgS2V5ZnJhbWVFZmZlY3RTdGFjayYgZW5zdXJlS2V5ZnJhbWVFZmZlY3RTdGFjaygpOwpAQCAt
NTEzLDcgKzUxMyw3IEBAIHB1YmxpYzoKICAgICB2b2lkIHNldExhc3RTdHlsZUNoYW5nZUV2ZW50
U3R5bGUoc3RkOjp1bmlxdWVfcHRyPGNvbnN0IFJlbmRlclN0eWxlPiYmKTsKIAogI2lmIEVOQUJM
RShGVUxMU0NSRUVOX0FQSSkKLSAgICBib29sIGNvbnRhaW5zRnVsbFNjcmVlbkVsZW1lbnQoKSBj
b25zdCB7IHJldHVybiBnZXRGbGFnKENvbnRhaW5zRnVsbFNjcmVlbkVsZW1lbnRGbGFnKTsgfQor
ICAgIGJvb2wgY29udGFpbnNGdWxsU2NyZWVuRWxlbWVudCgpIGNvbnN0IHsgcmV0dXJuIGhhc05v
ZGVGbGFnKE5vZGVGbGFnOjpDb250YWluc0Z1bGxTY3JlZW5FbGVtZW50KTsgfQogICAgIHZvaWQg
c2V0Q29udGFpbnNGdWxsU2NyZWVuRWxlbWVudChib29sKTsKICAgICB2b2lkIHNldENvbnRhaW5z
RnVsbFNjcmVlbkVsZW1lbnRPbkFuY2VzdG9yc0Nyb3NzaW5nRnJhbWVCb3VuZGFyaWVzKGJvb2wp
OwogICAgIFdFQkNPUkVfRVhQT1JUIHZpcnR1YWwgdm9pZCB3ZWJraXRSZXF1ZXN0RnVsbHNjcmVl
bigpOwpJbmRleDogU291cmNlL1dlYkNvcmUvZG9tL05vZGUuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJDb3JlL2RvbS9Ob2RlLmNwcAkocmV2aXNpb24gMjY2NzY5KQorKysgU291cmNlL1dl
YkNvcmUvZG9tL05vZGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMjk4LDkgKzEyOTgsOSBAQCBO
b2RlJiBOb2RlOjpnZXRSb290Tm9kZShjb25zdCBHZXRSb290Tm9kCiBOb2RlOjpJbnNlcnRlZElu
dG9BbmNlc3RvclJlc3VsdCBOb2RlOjppbnNlcnRlZEludG9BbmNlc3RvcihJbnNlcnRpb25UeXBl
IGluc2VydGlvblR5cGUsIENvbnRhaW5lck5vZGUmIHBhcmVudE9mSW5zZXJ0ZWRUcmVlKQogewog
ICAgIGlmIChpbnNlcnRpb25UeXBlLmNvbm5lY3RlZFRvRG9jdW1lbnQpCi0gICAgICAgIHNldEZs
YWcoSXNDb25uZWN0ZWRGbGFnKTsKKyAgICAgICAgc2V0Tm9kZUZsYWcoTm9kZUZsYWc6OklzQ29u
bmVjdGVkKTsKICAgICBpZiAocGFyZW50T2ZJbnNlcnRlZFRyZWUuaXNJblNoYWRvd1RyZWUoKSkK
LSAgICAgICAgc2V0RmxhZyhJc0luU2hhZG93VHJlZUZsYWcpOworICAgICAgICBzZXROb2RlRmxh
ZyhOb2RlRmxhZzo6SXNJblNoYWRvd1RyZWUpOwogCiAgICAgaW52YWxpZGF0ZVN0eWxlKFN0eWxl
OjpWYWxpZGl0eTo6U3VidHJlZUFuZFJlbmRlcmVyc0ludmFsaWQpOwogCkBAIC0xMzEwLDkgKzEz
MTAsOSBAQCBOb2RlOjpJbnNlcnRlZEludG9BbmNlc3RvclJlc3VsdCBOb2RlOjppCiB2b2lkIE5v
ZGU6OnJlbW92ZWRGcm9tQW5jZXN0b3IoUmVtb3ZhbFR5cGUgcmVtb3ZhbFR5cGUsIENvbnRhaW5l
ck5vZGUmIG9sZFBhcmVudE9mUmVtb3ZlZFRyZWUpCiB7CiAgICAgaWYgKHJlbW92YWxUeXBlLmRp
c2Nvbm5lY3RlZEZyb21Eb2N1bWVudCkKLSAgICAgICAgY2xlYXJGbGFnKElzQ29ubmVjdGVkRmxh
Zyk7CisgICAgICAgIGNsZWFyTm9kZUZsYWcoTm9kZUZsYWc6OklzQ29ubmVjdGVkKTsKICAgICBp
ZiAoaXNJblNoYWRvd1RyZWUoKSAmJiAhdHJlZVNjb3BlKCkucm9vdE5vZGUoKS5pc1NoYWRvd1Jv
b3QoKSkKLSAgICAgICAgY2xlYXJGbGFnKElzSW5TaGFkb3dUcmVlRmxhZyk7CisgICAgICAgIGNs
ZWFyTm9kZUZsYWcoTm9kZUZsYWc6OklzSW5TaGFkb3dUcmVlKTsKICAgICBpZiAocmVtb3ZhbFR5
cGUuZGlzY29ubmVjdGVkRnJvbURvY3VtZW50KSB7CiAgICAgICAgIGlmIChhdXRvKiBjYWNoZSA9
IG9sZFBhcmVudE9mUmVtb3ZlZFRyZWUuZG9jdW1lbnQoKS5leGlzdGluZ0FYT2JqZWN0Q2FjaGUo
KSkKICAgICAgICAgICAgIGNhY2hlLT5yZW1vdmUoKnRoaXMpOwpJbmRleDogU291cmNlL1dlYkNv
cmUvZG9tL05vZGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9kb20vTm9kZS5oCShy
ZXZpc2lvbiAyNjY3NjkpCisrKyBTb3VyY2UvV2ViQ29yZS9kb20vTm9kZS5oCSh3b3JraW5nIGNv
cHkpCkBAIC0xODYsMTIgKzE4NiwxMiBAQCBwdWJsaWM6CiAKICAgICAvLyBPdGhlciBtZXRob2Rz
IChub3QgcGFydCBvZiBET00pCiAKLSAgICBib29sIGlzRWxlbWVudE5vZGUoKSBjb25zdCB7IHJl
dHVybiBnZXRGbGFnKElzRWxlbWVudEZsYWcpOyB9Ci0gICAgYm9vbCBpc0NvbnRhaW5lck5vZGUo
KSBjb25zdCB7IHJldHVybiBnZXRGbGFnKElzQ29udGFpbmVyRmxhZyk7IH0KLSAgICBib29sIGlz
VGV4dE5vZGUoKSBjb25zdCB7IHJldHVybiBnZXRGbGFnKElzVGV4dEZsYWcpOyB9Ci0gICAgYm9v
bCBpc0hUTUxFbGVtZW50KCkgY29uc3QgeyByZXR1cm4gZ2V0RmxhZyhJc0hUTUxGbGFnKTsgfQot
ICAgIGJvb2wgaXNTVkdFbGVtZW50KCkgY29uc3QgeyByZXR1cm4gZ2V0RmxhZyhJc1NWR0ZsYWcp
OyB9Ci0gICAgYm9vbCBpc01hdGhNTEVsZW1lbnQoKSBjb25zdCB7IHJldHVybiBnZXRGbGFnKElz
TWF0aE1MRmxhZyk7IH0KKyAgICBib29sIGlzRWxlbWVudE5vZGUoKSBjb25zdCB7IHJldHVybiBo
YXNOb2RlRmxhZyhOb2RlRmxhZzo6SXNFbGVtZW50KTsgfQorICAgIGJvb2wgaXNDb250YWluZXJO
b2RlKCkgY29uc3QgeyByZXR1cm4gaGFzTm9kZUZsYWcoTm9kZUZsYWc6OklzQ29udGFpbmVyTm9k
ZSk7IH0KKyAgICBib29sIGlzVGV4dE5vZGUoKSBjb25zdCB7IHJldHVybiBoYXNOb2RlRmxhZyhO
b2RlRmxhZzo6SXNUZXh0KTsgfQorICAgIGJvb2wgaXNIVE1MRWxlbWVudCgpIGNvbnN0IHsgcmV0
dXJuIGhhc05vZGVGbGFnKE5vZGVGbGFnOjpJc0hUTUxFbGVtZW50KTsgfQorICAgIGJvb2wgaXNT
VkdFbGVtZW50KCkgY29uc3QgeyByZXR1cm4gaGFzTm9kZUZsYWcoTm9kZUZsYWc6OklzU1ZHRWxl
bWVudCk7IH0KKyAgICBib29sIGlzTWF0aE1MRWxlbWVudCgpIGNvbnN0IHsgcmV0dXJuIGhhc05v
ZGVGbGFnKE5vZGVGbGFnOjpJc01hdGhNTEVsZW1lbnQpOyB9CiAKICAgICBib29sIGlzUHNldWRv
RWxlbWVudCgpIGNvbnN0IHsgcmV0dXJuIHBzZXVkb0lkKCkgIT0gUHNldWRvSWQ6Ok5vbmU7IH0K
ICAgICBib29sIGlzQmVmb3JlUHNldWRvRWxlbWVudCgpIGNvbnN0IHsgcmV0dXJuIHBzZXVkb0lk
KCkgPT0gUHNldWRvSWQ6OkJlZm9yZTsgfQpAQCAtMjAxLDkgKzIwMSw5IEBAIHB1YmxpYzoKICNp
ZiBFTkFCTEUoVklERU8pCiAgICAgdmlydHVhbCBib29sIGlzV2ViVlRURWxlbWVudCgpIGNvbnN0
IHsgcmV0dXJuIGZhbHNlOyB9CiAjZW5kaWYKLSAgICBib29sIGlzU3R5bGVkRWxlbWVudCgpIGNv
bnN0IHsgcmV0dXJuIGdldEZsYWcoSXNIVE1MRmxhZykgfHwgZ2V0RmxhZyhJc1NWR0ZsYWcpIHx8
IGdldEZsYWcoSXNNYXRoTUxGbGFnKTsgfQorICAgIGJvb2wgaXNTdHlsZWRFbGVtZW50KCkgY29u
c3QgeyByZXR1cm4gaGFzTm9kZUZsYWcoTm9kZUZsYWc6OklzSFRNTEVsZW1lbnQpIHx8IGhhc05v
ZGVGbGFnKE5vZGVGbGFnOjpJc1NWR0VsZW1lbnQpIHx8IGhhc05vZGVGbGFnKE5vZGVGbGFnOjpJ
c01hdGhNTEVsZW1lbnQpOyB9CiAgICAgdmlydHVhbCBib29sIGlzQXR0cmlidXRlTm9kZSgpIGNv
bnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgYm9vbCBpc0NoYXJhY3RlckRhdGFOb2RlKCkgY29u
c3QgeyByZXR1cm4gIWlzQ29udGFpbmVyTm9kZSgpICYmIChpc1RleHROb2RlKCkgfHwgdmlydHVh
bElzQ2hhcmFjdGVyRGF0YSgpKTsgfQorICAgIGJvb2wgaXNDaGFyYWN0ZXJEYXRhTm9kZSgpIGNv
bnN0IHsgcmV0dXJuIGhhc05vZGVGbGFnKE5vZGVGbGFnOjpJc0NoYXJhY3RlckRhdGEpOyB9CiAg
ICAgdmlydHVhbCBib29sIGlzRnJhbWVPd25lckVsZW1lbnQoKSBjb25zdCB7IHJldHVybiBmYWxz
ZTsgfQogICAgIHZpcnR1YWwgYm9vbCBpc1BsdWdpbkVsZW1lbnQoKSBjb25zdCB7IHJldHVybiBm
YWxzZTsgfQogI2lmIEVOQUJMRShTRVJWSUNFX0NPTlRST0xTKQpAQCAtMjExLDE1ICsyMTEsMTUg
QEAgcHVibGljOgogICAgIHZpcnR1YWwgYm9vbCBpc0ltYWdlQ29udHJvbHNCdXR0b25FbGVtZW50
KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KICNlbmRpZgogCi0gICAgYm9vbCBpc0RvY3VtZW50
Tm9kZSgpIGNvbnN0IHsgcmV0dXJuIGdldEZsYWcoSXNEb2N1bWVudE5vZGVGbGFnKTsgfQotICAg
IGJvb2wgaXNUcmVlU2NvcGUoKSBjb25zdCB7IHJldHVybiBnZXRGbGFnKElzRG9jdW1lbnROb2Rl
RmxhZykgfHwgZ2V0RmxhZyhJc1NoYWRvd1Jvb3RGbGFnKTsgfQotICAgIGJvb2wgaXNEb2N1bWVu
dEZyYWdtZW50KCkgY29uc3QgeyByZXR1cm4gZ2V0RmxhZyhJc0NvbnRhaW5lckZsYWcpICYmICEo
Z2V0RmxhZyhJc0VsZW1lbnRGbGFnKSB8fCBnZXRGbGFnKElzRG9jdW1lbnROb2RlRmxhZykpOyB9
Ci0gICAgYm9vbCBpc1NoYWRvd1Jvb3QoKSBjb25zdCB7IHJldHVybiBnZXRGbGFnKElzU2hhZG93
Um9vdEZsYWcpOyB9CisgICAgYm9vbCBpc0RvY3VtZW50Tm9kZSgpIGNvbnN0IHsgcmV0dXJuIGhh
c05vZGVGbGFnKE5vZGVGbGFnOjpJc0RvY3VtZW50Tm9kZSk7IH0KKyAgICBib29sIGlzVHJlZVNj
b3BlKCkgY29uc3QgeyByZXR1cm4gaGFzTm9kZUZsYWcoTm9kZUZsYWc6OklzRG9jdW1lbnROb2Rl
KSB8fCBoYXNOb2RlRmxhZyhOb2RlRmxhZzo6SXNTaGFkb3dSb290KTsgfQorICAgIGJvb2wgaXNE
b2N1bWVudEZyYWdtZW50KCkgY29uc3QgeyByZXR1cm4gaGFzTm9kZUZsYWcoTm9kZUZsYWc6Oklz
RG9jdW1lbnRGcmFnbWVudCk7IH0KKyAgICBib29sIGlzU2hhZG93Um9vdCgpIGNvbnN0IHsgcmV0
dXJuIGhhc05vZGVGbGFnKE5vZGVGbGFnOjpJc1NoYWRvd1Jvb3QpOyB9CiAKLSAgICBib29sIGhh
c0N1c3RvbVN0eWxlUmVzb2x2ZUNhbGxiYWNrcygpIGNvbnN0IHsgcmV0dXJuIGdldEZsYWcoSGFz
Q3VzdG9tU3R5bGVSZXNvbHZlQ2FsbGJhY2tzRmxhZyk7IH0KKyAgICBib29sIGhhc0N1c3RvbVN0
eWxlUmVzb2x2ZUNhbGxiYWNrcygpIGNvbnN0IHsgcmV0dXJuIGhhc05vZGVGbGFnKE5vZGVGbGFn
OjpIYXNDdXN0b21TdHlsZVJlc29sdmVDYWxsYmFja3MpOyB9CiAKLSAgICBib29sIGhhc1N5bnRo
ZXRpY0F0dHJDaGlsZE5vZGVzKCkgY29uc3QgeyByZXR1cm4gZ2V0RmxhZyhIYXNTeW50aGV0aWNB
dHRyQ2hpbGROb2Rlc0ZsYWcpOyB9Ci0gICAgdm9pZCBzZXRIYXNTeW50aGV0aWNBdHRyQ2hpbGRO
b2Rlcyhib29sIGZsYWcpIHsgc2V0RmxhZyhmbGFnLCBIYXNTeW50aGV0aWNBdHRyQ2hpbGROb2Rl
c0ZsYWcpOyB9CisgICAgYm9vbCBoYXNTeW50aGV0aWNBdHRyQ2hpbGROb2RlcygpIGNvbnN0IHsg
cmV0dXJuIGhhc05vZGVGbGFnKE5vZGVGbGFnOjpIYXNTeW50aGV0aWNBdHRyQ2hpbGROb2Rlcyk7
IH0KKyAgICB2b2lkIHNldEhhc1N5bnRoZXRpY0F0dHJDaGlsZE5vZGVzKGJvb2wgZmxhZykgeyBz
ZXROb2RlRmxhZyhOb2RlRmxhZzo6SGFzU3ludGhldGljQXR0ckNoaWxkTm9kZXMsIGZsYWcpOyB9
CiAKICAgICAvLyBJZiB0aGlzIG5vZGUgaXMgaW4gYSBzaGFkb3cgdHJlZSwgcmV0dXJucyBpdHMg
c2hhZG93IGhvc3QuIE90aGVyd2lzZSwgcmV0dXJucyBudWxsLgogICAgIFdFQkNPUkVfRVhQT1JU
IEVsZW1lbnQqIHNoYWRvd0hvc3QoKSBjb25zdDsKQEAgLTI2MCw4ICsyNjAsOCBAQCBwdWJsaWM6
CiAgICAgLy8gUmV0dXJucyB0aGUgcGFyZW50IG5vZGUsIGJ1dCBudWxsIGlmIHRoZSBwYXJlbnQg
bm9kZSBpcyBhIFNoYWRvd1Jvb3QuCiAgICAgQ29udGFpbmVyTm9kZSogbm9uU2hhZG93Qm91bmRh
cnlQYXJlbnROb2RlKCkgY29uc3Q7CiAKLSAgICBib29sIHNlbGZPckFuY2VzdG9ySGFzRGlyQXV0
b0F0dHJpYnV0ZSgpIGNvbnN0IHsgcmV0dXJuIGdldEZsYWcoU2VsZk9yQW5jZXN0b3JIYXNEaXJB
dXRvRmxhZyk7IH0KLSAgICB2b2lkIHNldFNlbGZPckFuY2VzdG9ySGFzRGlyQXV0b0F0dHJpYnV0
ZShib29sIGZsYWcpIHsgc2V0RmxhZyhmbGFnLCBTZWxmT3JBbmNlc3Rvckhhc0RpckF1dG9GbGFn
KTsgfQorICAgIGJvb2wgc2VsZk9yQW5jZXN0b3JIYXNEaXJBdXRvQXR0cmlidXRlKCkgY29uc3Qg
eyByZXR1cm4gaGFzTm9kZUZsYWcoTm9kZUZsYWc6OlNlbGZPckFuY2VzdG9ySGFzRGlyQXV0byk7
IH0KKyAgICB2b2lkIHNldFNlbGZPckFuY2VzdG9ySGFzRGlyQXV0b0F0dHJpYnV0ZShib29sIGZs
YWcpIHsgc2V0Tm9kZUZsYWcoTm9kZUZsYWc6OlNlbGZPckFuY2VzdG9ySGFzRGlyQXV0bywgZmxh
Zyk7IH0KIAogICAgIC8vIFJldHVybnMgdGhlIGVuY2xvc2luZyBldmVudCBwYXJlbnQgRWxlbWVu
dCAob3Igc2VsZikgdGhhdCwgd2hlbiBjbGlja2VkLCB3b3VsZCB0cmlnZ2VyIGEgbmF2aWdhdGlv
bi4KICAgICBFbGVtZW50KiBlbmNsb3NpbmdMaW5rRXZlbnRQYXJlbnRPclNlbGYoKTsKQEAgLTI4
OSwyNiArMjg5LDI2IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5TG9hZGVkU2hl
ZXRBbmRBbGxDcml0aWNhbFN1YnJlc291cmNlcyhib29sIC8qIGVycm9yIGxvYWRpbmcgc3VicmVz
b3VyY2UgKi8pIHsgfQogICAgIHZpcnR1YWwgdm9pZCBzdGFydExvYWRpbmdEeW5hbWljU2hlZXQo
KSB7IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOyB9CiAKLSAgICBib29sIGlzVXNlckFjdGlvbkVsZW1l
bnQoKSBjb25zdCB7IHJldHVybiBnZXRGbGFnKElzVXNlckFjdGlvbkVsZW1lbnQpOyB9Ci0gICAg
dm9pZCBzZXRVc2VyQWN0aW9uRWxlbWVudChib29sIGZsYWcpIHsgc2V0RmxhZyhmbGFnLCBJc1Vz
ZXJBY3Rpb25FbGVtZW50KTsgfQorICAgIGJvb2wgaXNVc2VyQWN0aW9uRWxlbWVudCgpIGNvbnN0
IHsgcmV0dXJuIGhhc05vZGVGbGFnKE5vZGVGbGFnOjpJc1VzZXJBY3Rpb25FbGVtZW50KTsgfQor
ICAgIHZvaWQgc2V0VXNlckFjdGlvbkVsZW1lbnQoYm9vbCBmbGFnKSB7IHNldE5vZGVGbGFnKE5v
ZGVGbGFnOjpJc1VzZXJBY3Rpb25FbGVtZW50LCBmbGFnKTsgfQogCiAgICAgYm9vbCBpblJlbmRl
cmVkRG9jdW1lbnQoKSBjb25zdDsKICAgICBib29sIG5lZWRzU3R5bGVSZWNhbGMoKSBjb25zdCB7
IHJldHVybiBzdHlsZVZhbGlkaXR5KCkgIT0gU3R5bGU6OlZhbGlkaXR5OjpWYWxpZDsgfQogICAg
IFN0eWxlOjpWYWxpZGl0eSBzdHlsZVZhbGlkaXR5KCkgY29uc3QgeyByZXR1cm4gc3R5bGVCaXRm
aWVsZHMoKS5zdHlsZVZhbGlkaXR5KCk7IH0KICAgICBib29sIHN0eWxlUmVzb2x1dGlvblNob3Vs
ZFJlY29tcG9zaXRlTGF5ZXIoKSBjb25zdCB7IHJldHVybiBoYXNTdHlsZUZsYWcoTm9kZVN0eWxl
RmxhZzo6U3R5bGVSZXNvbHV0aW9uU2hvdWxkUmVjb21wb3NpdGVMYXllcik7IH0KICAgICBib29s
IGNoaWxkTmVlZHNTdHlsZVJlY2FsYygpIGNvbnN0IHsgcmV0dXJuIGhhc1N0eWxlRmxhZyhOb2Rl
U3R5bGVGbGFnOjpEZXNjZW5kYW50TmVlZHNTdHlsZVJlc29sdXRpb24pOyB9Ci0gICAgYm9vbCBp
c0VkaXRpbmdUZXh0KCkgY29uc3QgeyByZXR1cm4gZ2V0RmxhZyhJc1RleHRGbGFnKSAmJiBnZXRG
bGFnKElzRWRpdGluZ1RleHQpOyB9CisgICAgYm9vbCBpc0VkaXRpbmdUZXh0KCkgY29uc3QgeyBy
ZXR1cm4gaGFzTm9kZUZsYWcoTm9kZUZsYWc6OklzRWRpdGluZ1RleHQpOyB9CiAKICAgICB2b2lk
IHNldENoaWxkTmVlZHNTdHlsZVJlY2FsYygpIHsgc2V0U3R5bGVGbGFnKE5vZGVTdHlsZUZsYWc6
OkRlc2NlbmRhbnROZWVkc1N0eWxlUmVzb2x1dGlvbik7IH0KICAgICB2b2lkIGNsZWFyQ2hpbGRO
ZWVkc1N0eWxlUmVjYWxjKCk7CiAKICAgICB2b2lkIHNldEhhc1ZhbGlkU3R5bGUoKTsKIAotICAg
IGJvb2wgaXNMaW5rKCkgY29uc3QgeyByZXR1cm4gZ2V0RmxhZyhJc0xpbmtGbGFnKTsgfQotICAg
IHZvaWQgc2V0SXNMaW5rKGJvb2wgZmxhZykgeyBzZXRGbGFnKGZsYWcsIElzTGlua0ZsYWcpOyB9
CisgICAgYm9vbCBpc0xpbmsoKSBjb25zdCB7IHJldHVybiBoYXNOb2RlRmxhZyhOb2RlRmxhZzo6
SXNMaW5rKTsgfQorICAgIHZvaWQgc2V0SXNMaW5rKGJvb2wgZmxhZykgeyBzZXROb2RlRmxhZyhO
b2RlRmxhZzo6SXNMaW5rLCBmbGFnKTsgfQogCi0gICAgYm9vbCBoYXNFdmVudFRhcmdldERhdGEo
KSBjb25zdCB7IHJldHVybiBnZXRGbGFnKEhhc0V2ZW50VGFyZ2V0RGF0YUZsYWcpOyB9Ci0gICAg
dm9pZCBzZXRIYXNFdmVudFRhcmdldERhdGEoYm9vbCBmbGFnKSB7IHNldEZsYWcoZmxhZywgSGFz
RXZlbnRUYXJnZXREYXRhRmxhZyk7IH0KKyAgICBib29sIGhhc0V2ZW50VGFyZ2V0RGF0YSgpIGNv
bnN0IHsgcmV0dXJuIGhhc05vZGVGbGFnKE5vZGVGbGFnOjpIYXNFdmVudFRhcmdldERhdGEpOyB9
CisgICAgdm9pZCBzZXRIYXNFdmVudFRhcmdldERhdGEoYm9vbCBmbGFnKSB7IHNldE5vZGVGbGFn
KE5vZGVGbGFnOjpIYXNFdmVudFRhcmdldERhdGEsIGZsYWcpOyB9CiAKICAgICBXRUJDT1JFX0VY
UE9SVCBib29sIGlzQ29udGVudEVkaXRhYmxlKCk7CiAgICAgYm9vbCBpc0NvbnRlbnRSaWNobHlF
ZGl0YWJsZSgpOwpAQCAtMzU2LDEwICszNTYsMTAgQEAgcHVibGljOgogCiAgICAgLy8gUmV0dXJu
cyB0cnVlIGlmIHRoaXMgbm9kZSBpcyBhc3NvY2lhdGVkIHdpdGggYSBkb2N1bWVudCBhbmQgaXMg
aW4gaXRzIGFzc29jaWF0ZWQgZG9jdW1lbnQncwogICAgIC8vIG5vZGUgdHJlZSwgZmFsc2Ugb3Ro
ZXJ3aXNlIChodHRwczovL2RvbS5zcGVjLndoYXR3Zy5vcmcvI2Nvbm5lY3RlZCkuCi0gICAgYm9v
bCBpc0Nvbm5lY3RlZCgpIGNvbnN0IHsgcmV0dXJuIGdldEZsYWcoSXNDb25uZWN0ZWRGbGFnKTsg
fQorICAgIGJvb2wgaXNDb25uZWN0ZWQoKSBjb25zdCB7IHJldHVybiBoYXNOb2RlRmxhZyhOb2Rl
RmxhZzo6SXNDb25uZWN0ZWQpOyB9CiAgICAgYm9vbCBpc0luVXNlckFnZW50U2hhZG93VHJlZSgp
IGNvbnN0OwotICAgIGJvb2wgaXNJblNoYWRvd1RyZWUoKSBjb25zdCB7IHJldHVybiBnZXRGbGFn
KElzSW5TaGFkb3dUcmVlRmxhZyk7IH0KLSAgICBib29sIGlzSW5UcmVlU2NvcGUoKSBjb25zdCB7
IHJldHVybiBnZXRGbGFnKHN0YXRpY19jYXN0PE5vZGVGbGFncz4oSXNDb25uZWN0ZWRGbGFnIHwg
SXNJblNoYWRvd1RyZWVGbGFnKSk7IH0KKyAgICBib29sIGlzSW5TaGFkb3dUcmVlKCkgY29uc3Qg
eyByZXR1cm4gaGFzTm9kZUZsYWcoTm9kZUZsYWc6OklzSW5TaGFkb3dUcmVlKTsgfQorICAgIGJv
b2wgaXNJblRyZWVTY29wZSgpIGNvbnN0IHsgcmV0dXJuIGhhc05vZGVGbGFnKE5vZGVGbGFnOjpJ
c0Nvbm5lY3RlZCkgfHwgaGFzTm9kZUZsYWcoTm9kZUZsYWc6OklzSW5TaGFkb3dUcmVlKTsgfQog
CiAgICAgYm9vbCBpc0RvY3VtZW50VHlwZU5vZGUoKSBjb25zdCB7IHJldHVybiBub2RlVHlwZSgp
ID09IERPQ1VNRU5UX1RZUEVfTk9ERTsgfQogICAgIHZpcnR1YWwgYm9vbCBjaGlsZFR5cGVBbGxv
d2VkKE5vZGVUeXBlKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQpAQCAtNTA2LDMxICs1MDYsMzEg
QEAgcHVibGljOgogI2Vsc2UKICAgICBzdGF0aWMgdWludDMyX3QgcmFyZURhdGFQb2ludGVyTWFz
aygpIHsgcmV0dXJuIC0xOyB9CiAjZW5kaWYKLSAgICBzdGF0aWMgaW50MzJfdCBmbGFnSXNUZXh0
KCkgeyByZXR1cm4gSXNUZXh0RmxhZzsgfQotICAgIHN0YXRpYyBpbnQzMl90IGZsYWdJc0NvbnRh
aW5lcigpIHsgcmV0dXJuIElzQ29udGFpbmVyRmxhZzsgfQotICAgIHN0YXRpYyBpbnQzMl90IGZs
YWdJc0VsZW1lbnQoKSB7IHJldHVybiBJc0VsZW1lbnRGbGFnOyB9Ci0gICAgc3RhdGljIGludDMy
X3QgZmxhZ0lzU2hhZG93Um9vdCgpIHsgcmV0dXJuIElzU2hhZG93Um9vdEZsYWc7IH0KLSAgICBz
dGF0aWMgaW50MzJfdCBmbGFnSXNIVE1MKCkgeyByZXR1cm4gSXNIVE1MRmxhZzsgfQotICAgIHN0
YXRpYyBpbnQzMl90IGZsYWdJc0xpbmsoKSB7IHJldHVybiBJc0xpbmtGbGFnOyB9Ci0gICAgc3Rh
dGljIGludDMyX3QgZmxhZ0hhc0ZvY3VzV2l0aGluKCkgeyByZXR1cm4gSGFzRm9jdXNXaXRoaW47
IH0KLSAgICBzdGF0aWMgaW50MzJfdCBmbGFnSXNQYXJzaW5nQ2hpbGRyZW5GaW5pc2hlZCgpIHsg
cmV0dXJuIElzUGFyc2luZ0NoaWxkcmVuRmluaXNoZWRGbGFnOyB9CisgICAgc3RhdGljIGludDMy
X3QgZmxhZ0lzVGV4dCgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KE5vZGVGbGFnOjpJ
c1RleHQpOyB9CisgICAgc3RhdGljIGludDMyX3QgZmxhZ0lzQ29udGFpbmVyKCkgeyByZXR1cm4g
c3RhdGljX2Nhc3Q8aW50MzJfdD4oTm9kZUZsYWc6OklzQ29udGFpbmVyTm9kZSk7IH0KKyAgICBz
dGF0aWMgaW50MzJfdCBmbGFnSXNFbGVtZW50KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJf
dD4oTm9kZUZsYWc6OklzRWxlbWVudCk7IH0KKyAgICBzdGF0aWMgaW50MzJfdCBmbGFnSXNTaGFk
b3dSb290KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4oTm9kZUZsYWc6OklzU2hhZG93
Um9vdCk7IH0KKyAgICBzdGF0aWMgaW50MzJfdCBmbGFnSXNIVE1MKCkgeyByZXR1cm4gc3RhdGlj
X2Nhc3Q8aW50MzJfdD4oTm9kZUZsYWc6OklzSFRNTEVsZW1lbnQpOyB9CisgICAgc3RhdGljIGlu
dDMyX3QgZmxhZ0lzTGluaygpIHsgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KE5vZGVGbGFn
OjpJc0xpbmspOyB9CisgICAgc3RhdGljIGludDMyX3QgZmxhZ0hhc0ZvY3VzV2l0aGluKCkgeyBy
ZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4oTm9kZUZsYWc6Okhhc0ZvY3VzV2l0aGluKTsgfQor
ICAgIHN0YXRpYyBpbnQzMl90IGZsYWdJc1BhcnNpbmdDaGlsZHJlbkZpbmlzaGVkKCkgeyByZXR1
cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4oTm9kZUZsYWc6OklzUGFyc2luZ0NoaWxkcmVuRmluaXNo
ZWQpOyB9CiAjZW5kaWYgLy8gRU5BQkxFKEpJVCkKIAogcHJvdGVjdGVkOgotICAgIGVudW0gTm9k
ZUZsYWdzIHsKLSAgICAgICAgSXNUZXh0RmxhZyA9IDEsCi0gICAgICAgIElzQ29udGFpbmVyRmxh
ZyA9IDEgPDwgMSwKLSAgICAgICAgSXNFbGVtZW50RmxhZyA9IDEgPDwgMiwKLSAgICAgICAgSXNI
VE1MRmxhZyA9IDEgPDwgMywKLSAgICAgICAgSXNTVkdGbGFnID0gMSA8PCA0LAotICAgICAgICBJ
c01hdGhNTEZsYWcgPSAxIDw8IDUsCi0gICAgICAgIElzRG9jdW1lbnROb2RlRmxhZyA9IDEgPDwg
NiwKLSAgICAgICAgSXNTaGFkb3dSb290RmxhZyA9IDEgPDwgNywKLSAgICAgICAgSXNDb25uZWN0
ZWRGbGFnID0gMSA8PCA4LAotICAgICAgICBJc0luU2hhZG93VHJlZUZsYWcgPSAxIDw8IDksCi0g
ICAgICAgIC8vIFVudXNlZEZsYWcgPSAxIDw8IDEwLAotICAgICAgICBIYXNFdmVudFRhcmdldERh
dGFGbGFnID0gMSA8PCAxMSwKLSAgICAgICAgLy8gVW51c2VkRmxhZyA9IDEgPDwgMTIsCisgICAg
ZW51bSBjbGFzcyBOb2RlRmxhZyA6IHVpbnQzMl90IHsKKyAgICAgICAgSXNDaGFyYWN0ZXJEYXRh
ID0gMSA8PCAwLAorICAgICAgICBJc1RleHQgPSAxIDw8IDEsCisgICAgICAgIElzQ29udGFpbmVy
Tm9kZSA9IDEgPDwgMiwKKyAgICAgICAgSXNFbGVtZW50ID0gMSA8PCAzLAorICAgICAgICBJc0hU
TUxFbGVtZW50ID0gMSA8PCA0LAorICAgICAgICBJc1NWR0VsZW1lbnQgPSAxIDw8IDUsCisgICAg
ICAgIElzTWF0aE1MRWxlbWVudCA9IDEgPDwgNiwKKyAgICAgICAgSXNEb2N1bWVudE5vZGUgPSAx
IDw8IDcsCisgICAgICAgIElzRG9jdW1lbnRGcmFnbWVudCA9IDEgPDwgOCwKKyAgICAgICAgSXNT
aGFkb3dSb290ID0gMSA8PCA5LAorICAgICAgICBJc0Nvbm5lY3RlZCA9IDEgPDwgMTAsCisgICAg
ICAgIElzSW5TaGFkb3dUcmVlID0gMSA8PCAxMSwKKyAgICAgICAgSGFzRXZlbnRUYXJnZXREYXRh
ID0gMSA8PCAxMiwKICAgICAgICAgLy8gVW51c2VkRmxhZyA9IDEgPDwgMTMsCiAgICAgICAgIC8v
IFVudXNlZEZsYWcgPSAxIDw8IDE0LAogCkBAIC01MzgsMjQgKzUzOCwyMiBAQCBwcm90ZWN0ZWQ6
CiAgICAgICAgIC8vIGJlIHN0b3JlZCBpbiB0aGUgc2FtZSBtZW1vcnkgd29yZCBhcyB0aGUgTm9k
ZSBiaXRzIGFib3ZlLgogICAgICAgICBJc0VkaXRpbmdUZXh0ID0gMSA8PCAxNSwgLy8gVGV4dAog
ICAgICAgICBIYXNGb2N1c1dpdGhpbiA9IDEgPDwgMTYsIC8vIEVsZW1lbnQKLSAgICAgICAgSXNM
aW5rRmxhZyA9IDEgPDwgMTcsCisgICAgICAgIElzTGluayA9IDEgPDwgMTcsCiAgICAgICAgIElz
VXNlckFjdGlvbkVsZW1lbnQgPSAxIDw8IDE4LAotICAgICAgICBJc1BhcnNpbmdDaGlsZHJlbkZp
bmlzaGVkRmxhZyA9IDEgPDwgMTksCi0gICAgICAgIEhhc1N5bnRoZXRpY0F0dHJDaGlsZE5vZGVz
RmxhZyA9IDEgPDwgMjAsCi0gICAgICAgIFNlbGZPckFuY2VzdG9ySGFzRGlyQXV0b0ZsYWcgPSAx
IDw8IDIxLAotCi0gICAgICAgIEhhc0N1c3RvbVN0eWxlUmVzb2x2ZUNhbGxiYWNrc0ZsYWcgPSAx
IDw8IDIyLAotCi0gICAgICAgIEhhc1BlbmRpbmdSZXNvdXJjZXNGbGFnID0gMSA8PCAyMywKLSAg
ICAgICAgSGFzQ1NTQW5pbWF0aW9uRmxhZyA9IDEgPDwgMjQsCi0gICAgICAgIEhhc0VsZW1lbnRJ
ZGVudGlmaWVyRmxhZyA9IDEgPDwgMjUsCisgICAgICAgIElzUGFyc2luZ0NoaWxkcmVuRmluaXNo
ZWQgPSAxIDw8IDE5LAorICAgICAgICBIYXNTeW50aGV0aWNBdHRyQ2hpbGROb2RlcyA9IDEgPDwg
MjAsCisgICAgICAgIFNlbGZPckFuY2VzdG9ySGFzRGlyQXV0byA9IDEgPDwgMjEsCisKKyAgICAg
ICAgSGFzQ3VzdG9tU3R5bGVSZXNvbHZlQ2FsbGJhY2tzID0gMSA8PCAyMiwKKworICAgICAgICBI
YXNQZW5kaW5nUmVzb3VyY2VzID0gMSA8PCAyMywKKyAgICAgICAgSGFzQ1NTQW5pbWF0aW9uID0g
MSA8PCAyNCwKKyAgICAgICAgSGFzRWxlbWVudElkZW50aWZpZXIgPSAxIDw8IDI1LAogI2lmIEVO
QUJMRShGVUxMU0NSRUVOX0FQSSkKLSAgICAgICAgQ29udGFpbnNGdWxsU2NyZWVuRWxlbWVudEZs
YWcgPSAxIDw8IDI2LAorICAgICAgICBDb250YWluc0Z1bGxTY3JlZW5FbGVtZW50ID0gMSA8PCAy
NiwKICNlbmRpZgogCiAgICAgICAgIC8vIEJpdHMgMjctMzEgYXJlIGZyZWUuCi0KLSAgICAgICAg
RGVmYXVsdE5vZGVGbGFncyA9IElzUGFyc2luZ0NoaWxkcmVuRmluaXNoZWRGbGFnCiAgICAgfTsK
IAogICAgIGVudW0gY2xhc3MgVGFiSW5kZXhTdGF0ZSA6IHVpbnQ4X3QgewpAQCAtNTc4LDEwICs1
NzYsOSBAQCBwcm90ZWN0ZWQ6CiAgICAgICAgIHVpbnQxNl90IGN1c3RvbUVsZW1lbnRTdGF0ZSA6
IDI7CiAgICAgfTsKIAotICAgIGJvb2wgZ2V0RmxhZyhOb2RlRmxhZ3MgbWFzaykgY29uc3QgeyBy
ZXR1cm4gbV9ub2RlRmxhZ3MgJiBtYXNrOyB9Ci0gICAgdm9pZCBzZXRGbGFnKGJvb2wgZiwgTm9k
ZUZsYWdzIG1hc2spIGNvbnN0IHsgbV9ub2RlRmxhZ3MgPSAobV9ub2RlRmxhZ3MgJiB+bWFzaykg
fCAoLShpbnQzMl90KWYgJiBtYXNrKTsgfSAKLSAgICB2b2lkIHNldEZsYWcoTm9kZUZsYWdzIG1h
c2spIGNvbnN0IHsgbV9ub2RlRmxhZ3MgfD0gbWFzazsgfSAKLSAgICB2b2lkIGNsZWFyRmxhZyhO
b2RlRmxhZ3MgbWFzaykgY29uc3QgeyBtX25vZGVGbGFncyAmPSB+bWFzazsgfQorICAgIGJvb2wg
aGFzTm9kZUZsYWcoTm9kZUZsYWcgZmxhZykgY29uc3QgeyByZXR1cm4gbV9ub2RlRmxhZ3MuY29u
dGFpbnMoZmxhZyk7IH0KKyAgICB2b2lkIHNldE5vZGVGbGFnKE5vZGVGbGFnIGZsYWcsIGJvb2wg
dmFsdWUgPSB0cnVlKSBjb25zdCB7IG1fbm9kZUZsYWdzLnNldChmbGFnLCB2YWx1ZSk7IH0KKyAg
ICB2b2lkIGNsZWFyTm9kZUZsYWcoTm9kZUZsYWcgZmxhZykgY29uc3QgeyBtX25vZGVGbGFncy5y
ZW1vdmUoZmxhZyk7IH0KIAogICAgIFJhcmVEYXRhQml0RmllbGRzIHJhcmVEYXRhQml0ZmllbGRz
KCkgY29uc3QgeyByZXR1cm4gYml0d2lzZV9jYXN0PFJhcmVEYXRhQml0RmllbGRzPihtX3JhcmVE
YXRhV2l0aEJpdGZpZWxkcy50eXBlKCkpOyB9CiAgICAgdm9pZCBzZXRSYXJlRGF0YUJpdGZpZWxk
cyhSYXJlRGF0YUJpdEZpZWxkcyBiaXRmaWVsZHMpIHsgbV9yYXJlRGF0YVdpdGhCaXRmaWVsZHMu
c2V0VHlwZShiaXR3aXNlX2Nhc3Q8dWludDE2X3Q+KGJpdGZpZWxkcykpOyB9CkBAIC01OTIsMjQg
KzU4OSwyNSBAQCBwcm90ZWN0ZWQ6CiAgICAgQ3VzdG9tRWxlbWVudFN0YXRlIGN1c3RvbUVsZW1l
bnRTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PEN1c3RvbUVsZW1lbnRTdGF0ZT4o
cmFyZURhdGFCaXRmaWVsZHMoKS5jdXN0b21FbGVtZW50U3RhdGUpOyB9CiAgICAgdm9pZCBzZXRD
dXN0b21FbGVtZW50U3RhdGUoQ3VzdG9tRWxlbWVudFN0YXRlKTsKIAotICAgIGJvb2wgaXNQYXJz
aW5nQ2hpbGRyZW5GaW5pc2hlZCgpIGNvbnN0IHsgcmV0dXJuIGdldEZsYWcoSXNQYXJzaW5nQ2hp
bGRyZW5GaW5pc2hlZEZsYWcpOyB9Ci0gICAgdm9pZCBzZXRJc1BhcnNpbmdDaGlsZHJlbkZpbmlz
aGVkKCkgeyBzZXRGbGFnKElzUGFyc2luZ0NoaWxkcmVuRmluaXNoZWRGbGFnKTsgfQotICAgIHZv
aWQgY2xlYXJJc1BhcnNpbmdDaGlsZHJlbkZpbmlzaGVkKCkgeyBjbGVhckZsYWcoSXNQYXJzaW5n
Q2hpbGRyZW5GaW5pc2hlZEZsYWcpOyB9Ci0KLSAgICBlbnVtIENvbnN0cnVjdGlvblR5cGUgewot
ICAgICAgICBDcmVhdGVPdGhlciA9IERlZmF1bHROb2RlRmxhZ3MsCi0gICAgICAgIENyZWF0ZVRl
eHQgPSBEZWZhdWx0Tm9kZUZsYWdzIHwgSXNUZXh0RmxhZywKLSAgICAgICAgQ3JlYXRlQ29udGFp
bmVyID0gRGVmYXVsdE5vZGVGbGFncyB8IElzQ29udGFpbmVyRmxhZywgCi0gICAgICAgIENyZWF0
ZUVsZW1lbnQgPSBDcmVhdGVDb250YWluZXIgfCBJc0VsZW1lbnRGbGFnLCAKLSAgICAgICAgQ3Jl
YXRlUHNldWRvRWxlbWVudCA9ICBDcmVhdGVFbGVtZW50IHwgSXNDb25uZWN0ZWRGbGFnLAotICAg
ICAgICBDcmVhdGVTaGFkb3dSb290ID0gQ3JlYXRlQ29udGFpbmVyIHwgSXNTaGFkb3dSb290Rmxh
ZyB8IElzSW5TaGFkb3dUcmVlRmxhZywKLSAgICAgICAgQ3JlYXRlRG9jdW1lbnRGcmFnbWVudCA9
IENyZWF0ZUNvbnRhaW5lciwKLSAgICAgICAgQ3JlYXRlSFRNTEVsZW1lbnQgPSBDcmVhdGVFbGVt
ZW50IHwgSXNIVE1MRmxhZywKLSAgICAgICAgQ3JlYXRlU1ZHRWxlbWVudCA9IENyZWF0ZUVsZW1l
bnQgfCBJc1NWR0ZsYWcgfCBIYXNDdXN0b21TdHlsZVJlc29sdmVDYWxsYmFja3NGbGFnLAotICAg
ICAgICBDcmVhdGVNYXRoTUxFbGVtZW50ID0gQ3JlYXRlRWxlbWVudCB8IElzTWF0aE1MRmxhZywK
LSAgICAgICAgQ3JlYXRlRG9jdW1lbnQgPSBDcmVhdGVDb250YWluZXIgfCBJc0RvY3VtZW50Tm9k
ZUZsYWcgfCBJc0Nvbm5lY3RlZEZsYWcsCi0gICAgICAgIENyZWF0ZUVkaXRpbmdUZXh0ID0gQ3Jl
YXRlVGV4dCB8IElzRWRpdGluZ1RleHQsCi0gICAgfTsKKyAgICBib29sIGlzUGFyc2luZ0NoaWxk
cmVuRmluaXNoZWQoKSBjb25zdCB7IHJldHVybiBoYXNOb2RlRmxhZyhOb2RlRmxhZzo6SXNQYXJz
aW5nQ2hpbGRyZW5GaW5pc2hlZCk7IH0KKyAgICB2b2lkIHNldElzUGFyc2luZ0NoaWxkcmVuRmlu
aXNoZWQoKSB7IHNldE5vZGVGbGFnKE5vZGVGbGFnOjpJc1BhcnNpbmdDaGlsZHJlbkZpbmlzaGVk
KTsgfQorICAgIHZvaWQgY2xlYXJJc1BhcnNpbmdDaGlsZHJlbkZpbmlzaGVkKCkgeyBjbGVhck5v
ZGVGbGFnKE5vZGVGbGFnOjpJc1BhcnNpbmdDaGlsZHJlbkZpbmlzaGVkKTsgfQorCisgICAgY29u
c3RleHByIHN0YXRpYyBhdXRvIERlZmF1bHROb2RlRmxhZ3MgPSBPcHRpb25TZXQ8Tm9kZUZsYWc+
KE5vZGVGbGFnOjpJc1BhcnNpbmdDaGlsZHJlbkZpbmlzaGVkKTsKKyAgICBjb25zdGV4cHIgc3Rh
dGljIGF1dG8gQ3JlYXRlT3RoZXIgPSBEZWZhdWx0Tm9kZUZsYWdzOworICAgIGNvbnN0ZXhwciBz
dGF0aWMgYXV0byBDcmVhdGVDaGFyYWN0ZXJEYXRhID0gRGVmYXVsdE5vZGVGbGFncyB8IE5vZGVG
bGFnOjpJc0NoYXJhY3RlckRhdGE7CisgICAgY29uc3RleHByIHN0YXRpYyBhdXRvIENyZWF0ZVRl
eHQgPSBDcmVhdGVDaGFyYWN0ZXJEYXRhIHwgTm9kZUZsYWc6OklzVGV4dDsKKyAgICBjb25zdGV4
cHIgc3RhdGljIGF1dG8gQ3JlYXRlQ29udGFpbmVyID0gRGVmYXVsdE5vZGVGbGFncyB8IE5vZGVG
bGFnOjpJc0NvbnRhaW5lck5vZGU7CisgICAgY29uc3RleHByIHN0YXRpYyBhdXRvIENyZWF0ZUVs
ZW1lbnQgPSBDcmVhdGVDb250YWluZXIgfCBOb2RlRmxhZzo6SXNFbGVtZW50OworICAgIGNvbnN0
ZXhwciBzdGF0aWMgYXV0byBDcmVhdGVQc2V1ZG9FbGVtZW50ID0gQ3JlYXRlRWxlbWVudCB8IE5v
ZGVGbGFnOjpJc0Nvbm5lY3RlZDsKKyAgICBjb25zdGV4cHIgc3RhdGljIGF1dG8gQ3JlYXRlRG9j
dW1lbnRGcmFnbWVudCA9IENyZWF0ZUNvbnRhaW5lciB8IE5vZGVGbGFnOjpJc0RvY3VtZW50RnJh
Z21lbnQ7CisgICAgY29uc3RleHByIHN0YXRpYyBhdXRvIENyZWF0ZVNoYWRvd1Jvb3QgPSBDcmVh
dGVEb2N1bWVudEZyYWdtZW50IHwgTm9kZUZsYWc6OklzU2hhZG93Um9vdCB8IE5vZGVGbGFnOjpJ
c0luU2hhZG93VHJlZTsKKyAgICBjb25zdGV4cHIgc3RhdGljIGF1dG8gQ3JlYXRlSFRNTEVsZW1l
bnQgPSBDcmVhdGVFbGVtZW50IHwgTm9kZUZsYWc6OklzSFRNTEVsZW1lbnQ7CisgICAgY29uc3Rl
eHByIHN0YXRpYyBhdXRvIENyZWF0ZVNWR0VsZW1lbnQgPSBDcmVhdGVFbGVtZW50IHwgTm9kZUZs
YWc6OklzU1ZHRWxlbWVudCB8IE5vZGVGbGFnOjpIYXNDdXN0b21TdHlsZVJlc29sdmVDYWxsYmFj
a3M7CisgICAgY29uc3RleHByIHN0YXRpYyBhdXRvIENyZWF0ZU1hdGhNTEVsZW1lbnQgPSBDcmVh
dGVFbGVtZW50IHwgTm9kZUZsYWc6OklzTWF0aE1MRWxlbWVudDsKKyAgICBjb25zdGV4cHIgc3Rh
dGljIGF1dG8gQ3JlYXRlRG9jdW1lbnQgPSBDcmVhdGVDb250YWluZXIgfCBOb2RlRmxhZzo6SXNE
b2N1bWVudE5vZGUgfCBOb2RlRmxhZzo6SXNDb25uZWN0ZWQ7CisgICAgY29uc3RleHByIHN0YXRp
YyBhdXRvIENyZWF0ZUVkaXRpbmdUZXh0ID0gQ3JlYXRlVGV4dCB8IE5vZGVGbGFnOjpJc0VkaXRp
bmdUZXh0OworICAgIHVzaW5nIENvbnN0cnVjdGlvblR5cGUgPSBPcHRpb25TZXQ8Tm9kZUZsYWc+
OwogICAgIE5vZGUoRG9jdW1lbnQmLCBDb25zdHJ1Y3Rpb25UeXBlKTsKIAogICAgIHN0YXRpYyBj
b25zdGV4cHIgdWludDMyX3Qgc19yZWZDb3VudEluY3JlbWVudCA9IDI7CkBAIC02NzcsNyArNjc1
LDcgQEAgcHJvdGVjdGVkOgogCiAgICAgdm9pZCBjbGVhckV2ZW50VGFyZ2V0RGF0YSgpOwogCi0g
ICAgdm9pZCBzZXRIYXNDdXN0b21TdHlsZVJlc29sdmVDYWxsYmFja3MoKSB7IHNldEZsYWcodHJ1
ZSwgSGFzQ3VzdG9tU3R5bGVSZXNvbHZlQ2FsbGJhY2tzRmxhZyk7IH0KKyAgICB2b2lkIHNldEhh
c0N1c3RvbVN0eWxlUmVzb2x2ZUNhbGxiYWNrcygpIHsgc2V0Tm9kZUZsYWcoTm9kZUZsYWc6Okhh
c0N1c3RvbVN0eWxlUmVzb2x2ZUNhbGxiYWNrcyk7IH0KIAogICAgIHZvaWQgc2V0VHJlZVNjb3Bl
KFRyZWVTY29wZSYgc2NvcGUpIHsgbV90cmVlU2NvcGUgPSAmc2NvcGU7IH0KIApAQCAtNjkzLDgg
KzY5MSw2IEBAIHByaXZhdGU6CiAgICAgICAgIHJldHVybiBQc2V1ZG9JZDo6Tm9uZTsKICAgICB9
CiAKLSAgICB2aXJ0dWFsIGJvb2wgdmlydHVhbElzQ2hhcmFjdGVyRGF0YSgpIGNvbnN0IHsgcmV0
dXJuIGZhbHNlOyB9Ci0KICAgICBXRUJDT1JFX0VYUE9SVCB2b2lkIHJlbW92ZWRMYXN0UmVmKCk7
CiAKICAgICB2b2lkIHJlZkV2ZW50VGFyZ2V0KCkgZmluYWw7CkBAIC03MjAsNyArNzE2LDcgQEAg
cHJpdmF0ZToKICAgICB9OwogCiAgICAgbXV0YWJsZSB1aW50MzJfdCBtX3JlZkNvdW50QW5kUGFy
ZW50Qml0IHsgc19yZWZDb3VudEluY3JlbWVudCB9OwotICAgIG11dGFibGUgdWludDMyX3QgbV9u
b2RlRmxhZ3M7CisgICAgbXV0YWJsZSBPcHRpb25TZXQ8Tm9kZUZsYWc+IG1fbm9kZUZsYWdzOwog
CiAgICAgQ29udGFpbmVyTm9kZSogbV9wYXJlbnROb2RlIHsgbnVsbHB0ciB9OwogICAgIFRyZWVT
Y29wZSogbV90cmVlU2NvcGUgeyBudWxscHRyIH07CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9kb20v
UHJvY2Vzc2luZ0luc3RydWN0aW9uLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9k
b20vUHJvY2Vzc2luZ0luc3RydWN0aW9uLmNwcAkocmV2aXNpb24gMjY2NzY4KQorKysgU291cmNl
L1dlYkNvcmUvZG9tL1Byb2Nlc3NpbmdJbnN0cnVjdGlvbi5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTQ0LDcgKzQ0LDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogV1RGX01BS0VfSVNPX0FMTE9DQVRF
RF9JTVBMKFByb2Nlc3NpbmdJbnN0cnVjdGlvbik7CiAKIGlubGluZSBQcm9jZXNzaW5nSW5zdHJ1
Y3Rpb246OlByb2Nlc3NpbmdJbnN0cnVjdGlvbihEb2N1bWVudCYgZG9jdW1lbnQsIGNvbnN0IFN0
cmluZyYgdGFyZ2V0LCBjb25zdCBTdHJpbmcmIGRhdGEpCi0gICAgOiBDaGFyYWN0ZXJEYXRhKGRv
Y3VtZW50LCBkYXRhLCBDcmVhdGVPdGhlcikKKyAgICA6IENoYXJhY3RlckRhdGEoZG9jdW1lbnQs
IGRhdGEpCiAgICAgLCBtX3RhcmdldCh0YXJnZXQpCiB7CiB9Cg==
</data>
<flag name="review"
          id="423705"
          type_id="1"
          status="+"
          setter="koivisto"
    />
          </attachment>
      

    </bug>

</bugzilla>