<?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>25858</bug_id>
          
          <creation_ts>2009-05-18 16:15:52 -0700</creation_ts>
          <short_desc>Upstream V8 bindings for CanvasRenderingContext2D</short_desc>
          <delta_ts>2009-05-19 13:54:02 -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>WebCore Misc.</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Nate Chapin">japhet</reporter>
          <assigned_to name="Nate Chapin">japhet</assigned_to>
          <cc>dglazkov</cc>
    
    <cc>fishd</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>121831</commentid>
    <comment_count>0</comment_count>
    <who name="Nate Chapin">japhet</who>
    <bug_when>2009-05-18 16:15:52 -0700</bug_when>
    <thetext>See summary.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>121832</commentid>
    <comment_count>1</comment_count>
      <attachid>30452</attachid>
    <who name="Nate Chapin">japhet</who>
    <bug_when>2009-05-18 16:21:34 -0700</bug_when>
    <thetext>Created attachment 30452
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>121912</commentid>
    <comment_count>2</comment_count>
      <attachid>30452</attachid>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2009-05-19 08:58:41 -0700</bug_when>
    <thetext>Comment on attachment 30452
patch

&gt; Index: WebCore/bindings/v8/custom/V8CanvasRenderingContext2DCustom.cpp

&gt; +// Helper macro for converting v8 values into floats (expected by many of the
&gt; +// canvas functions).
&gt; +#define TO_FLOAT(a) static_cast&lt;float&gt;((a)-&gt;NumberValue())

Can this be rewritten as an inline function instead?  It is best to
avoid macros whenever possible.

Can you use toFloat from V8Binding.h?


&gt; +CALLBACK_FUNC_DECL(CanvasRenderingContext2DPutImageData)
...
&gt; +    if (V8Proxy::IsWrapperOfType(args[0], V8ClassIndex::IMAGEDATA)) {
&gt; +        imageData = V8Proxy::ToNativeObject&lt;ImageData&gt;(V8ClassIndex::IMAGEDATA, args[0]);
&gt; +    }

style nit: no brackets around single lines</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>121926</commentid>
    <comment_count>3</comment_count>
      <attachid>30476</attachid>
    <who name="Nate Chapin">japhet</who>
    <bug_when>2009-05-19 09:37:35 -0700</bug_when>
    <thetext>Created attachment 30476
patch2</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>121930</commentid>
    <comment_count>4</comment_count>
    <who name="Nate Chapin">japhet</who>
    <bug_when>2009-05-19 09:53:46 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 30452 [review])
&gt; &gt; Index: WebCore/bindings/v8/custom/V8CanvasRenderingContext2DCustom.cpp
&gt; 
&gt; &gt; +// Helper macro for converting v8 values into floats (expected by many of the
&gt; &gt; +// canvas functions).
&gt; &gt; +#define TO_FLOAT(a) static_cast&lt;float&gt;((a)-&gt;NumberValue())
&gt; 
&gt; Can this be rewritten as an inline function instead?  It is best to
&gt; avoid macros whenever possible.
&gt; 
&gt; Can you use toFloat from V8Binding.h?
Wasn&apos;t aware of that one, thanks.

&gt; 
&gt; 
&gt; &gt; +CALLBACK_FUNC_DECL(CanvasRenderingContext2DPutImageData)
&gt; ...
&gt; &gt; +    if (V8Proxy::IsWrapperOfType(args[0], V8ClassIndex::IMAGEDATA)) {
&gt; &gt; +        imageData = V8Proxy::ToNativeObject&lt;ImageData&gt;(V8ClassIndex::IMAGEDATA, args[0]);
&gt; &gt; +    }
&gt; 
&gt; style nit: no brackets around single lines
&gt; 
Doh, missed one.  Done.

</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>121966</commentid>
    <comment_count>5</comment_count>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2009-05-19 13:54:02 -0700</bug_when>
    <thetext>Landed as:  http://trac.webkit.org/changeset/43871</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>30452</attachid>
            <date>2009-05-18 16:21:34 -0700</date>
            <delta_ts>2009-05-19 09:37:35 -0700</delta_ts>
            <desc>patch</desc>
            <filename>patch.txt</filename>
            <type>text/plain</type>
            <size>14875</size>
            <attacher name="Nate Chapin">japhet</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0Mzg0MSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTIgQEAKKzIwMDktMDUtMTggIE5hdGUgQ2hhcGluICA8amFwaGV0QGdvb2dsZS5j
b20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVXBz
dHJlYW0gVjggYmluZGluZ3MgZm9yIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC4KKyAgICAgICAg
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI1ODU4CisKKyAgICAgICAg
KiBiaW5kaW5ncy92OC9jdXN0b20vVjhDYW52YXNSZW5kZXJpbmdDb250ZXh0MkRDdXN0b20uY3Bw
OiBNb3ZlZCBiaW5kaW5ncyBmcm9tIHY4X2N1c3RvbS5jcHAuCisKIDIwMDktMDUtMTggIE1hcmsg
Um93ZSAgPG1yb3dlQGFwcGxlLmNvbT4KIAogICAgICAgICBGaXggdGhlIGJ1aWxkLgpJbmRleDog
V2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDYW52YXNSZW5kZXJpbmdDb250ZXh0MkRDdXN0
b20uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4Q2FudmFz
UmVuZGVyaW5nQ29udGV4dDJEQ3VzdG9tLmNwcAkocmV2aXNpb24gNDM4NDEpCisrKyBXZWJDb3Jl
L2JpbmRpbmdzL3Y4L2N1c3RvbS9WOENhbnZhc1JlbmRlcmluZ0NvbnRleHQyREN1c3RvbS5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTM0LDE1ICszNCwyMyBAQAogI2luY2x1ZGUgIkNhbnZhc0dyYWRp
ZW50LmgiCiAjaW5jbHVkZSAiQ2FudmFzUGF0dGVybi5oIgogI2luY2x1ZGUgIkNhbnZhc1N0eWxl
LmgiCisjaW5jbHVkZSAiRXhjZXB0aW9uQ29kZS5oIgorI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgog
CiAjaW5jbHVkZSAiVjhCaW5kaW5nLmgiCiAjaW5jbHVkZSAiVjhDYW52YXNHcmFkaWVudC5oIgog
I2luY2x1ZGUgIlY4Q2FudmFzUGF0dGVybi5oIgogI2luY2x1ZGUgIlY4Q3VzdG9tQmluZGluZy5o
IgorI2luY2x1ZGUgIlY4SFRNTENhbnZhc0VsZW1lbnQuaCIKKyNpbmNsdWRlICJWOEhUTUxJbWFn
ZUVsZW1lbnQuaCIKICNpbmNsdWRlICJWOFByb3h5LmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsK
IAorLy8gSGVscGVyIG1hY3JvIGZvciBjb252ZXJ0aW5nIHY4IHZhbHVlcyBpbnRvIGZsb2F0cyAo
ZXhwZWN0ZWQgYnkgbWFueSBvZiB0aGUKKy8vIGNhbnZhcyBmdW5jdGlvbnMpLgorI2RlZmluZSBU
T19GTE9BVChhKSBzdGF0aWNfY2FzdDxmbG9hdD4oKGEpLT5OdW1iZXJWYWx1ZSgpKQorCiBzdGF0
aWMgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHRvVjgoQ2FudmFzU3R5bGUqIHN0eWxlKQogewogICAg
IGlmIChzdHlsZS0+Y2FudmFzR3JhZGllbnQoKSkKQEAgLTkyLDQgKzEwMCwzMjUgQEAgQUNDRVNT
T1JfU0VUVEVSKENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRAogICAgIGltcGwtPnNldEZpbGxTdHls
ZSh0b0NhbnZhc1N0eWxlKHZhbHVlKSk7CiB9CiAKKy8vIFRPRE86IFNldFN0cm9rZUNvbG9yIGFu
ZCBTZXRGaWxsQ29sb3IgYXJlIHNpbWlsYXIgZXhjZXB0IGZ1bmN0aW9uIG5hbWVzLAorLy8gY29u
c29saWRhdGUgdGhlbSBpbnRvIG9uZS4KK0NBTExCQUNLX0ZVTkNfREVDTChDYW52YXNSZW5kZXJp
bmdDb250ZXh0MkRTZXRTdHJva2VDb2xvcikKK3sKKyAgICBJTkNfU1RBVFMoIkRPTS5DYW52YXNS
ZW5kZXJpbmdDb250ZXh0MkQuc2V0U3Ryb2tlQ29sb3IoKSIpOworICAgIENhbnZhc1JlbmRlcmlu
Z0NvbnRleHQyRCogY29udGV4dCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PENhbnZhc1JlbmRl
cmluZ0NvbnRleHQyRD4oVjhDbGFzc0luZGV4OjpDQU5WQVNSRU5ERVJJTkdDT05URVhUMkQsIGFy
Z3MuSG9sZGVyKCkpOworICAgIHN3aXRjaCAoYXJncy5MZW5ndGgoKSkgeworICAgIGNhc2UgMToK
KyAgICAgICAgaWYgKGFyZ3NbMF0tPklzU3RyaW5nKCkpCisgICAgICAgICAgICBjb250ZXh0LT5z
ZXRTdHJva2VDb2xvcihUb1dlYkNvcmVTdHJpbmcoYXJnc1swXSkpOworICAgICAgICBlbHNlCisg
ICAgICAgICAgICBjb250ZXh0LT5zZXRTdHJva2VDb2xvcihUT19GTE9BVChhcmdzWzBdKSk7Cisg
ICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKGFyZ3NbMF0tPklzU3RyaW5n
KCkpCisgICAgICAgICAgICBjb250ZXh0LT5zZXRTdHJva2VDb2xvcihUb1dlYkNvcmVTdHJpbmco
YXJnc1swXSksIFRPX0ZMT0FUKGFyZ3NbMV0pKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAg
Y29udGV4dC0+c2V0U3Ryb2tlQ29sb3IoVE9fRkxPQVQoYXJnc1swXSksIFRPX0ZMT0FUKGFyZ3Nb
MV0pKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgICBjb250ZXh0LT5zZXRT
dHJva2VDb2xvcihUT19GTE9BVChhcmdzWzBdKSwgVE9fRkxPQVQoYXJnc1sxXSksIFRPX0ZMT0FU
KGFyZ3NbMl0pLCBUT19GTE9BVChhcmdzWzNdKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ug
NToKKyAgICAgICAgY29udGV4dC0+c2V0U3Ryb2tlQ29sb3IoVE9fRkxPQVQoYXJnc1swXSksIFRP
X0ZMT0FUKGFyZ3NbMV0pLCBUT19GTE9BVChhcmdzWzJdKSwgVE9fRkxPQVQoYXJnc1szXSksIFRP
X0ZMT0FUKGFyZ3NbNF0pKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAg
VjhQcm94eTo6VGhyb3dFcnJvcihWOFByb3h5OjpTWU5UQVhfRVJST1IsICJzZXRTdHJva2VDb2xv
cjogSW52YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzIik7CisgICAgICAgIGJyZWFrOworICAgIH0K
KyAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOworfQorCitDQUxMQkFDS19GVU5DX0RFQ0woQ2Fu
dmFzUmVuZGVyaW5nQ29udGV4dDJEU2V0RmlsbENvbG9yKQoreworICAgIElOQ19TVEFUUygiRE9N
LkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5zZXRGaWxsQ29sb3IoKSIpOworICAgIENhbnZhc1Jl
bmRlcmluZ0NvbnRleHQyRCogY29udGV4dCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PENhbnZh
c1JlbmRlcmluZ0NvbnRleHQyRD4oVjhDbGFzc0luZGV4OjpDQU5WQVNSRU5ERVJJTkdDT05URVhU
MkQsIGFyZ3MuSG9sZGVyKCkpOworICAgIHN3aXRjaCAoYXJncy5MZW5ndGgoKSkgeworICAgIGNh
c2UgMToKKyAgICAgICAgaWYgKGFyZ3NbMF0tPklzU3RyaW5nKCkpCisgICAgICAgICAgICBjb250
ZXh0LT5zZXRGaWxsQ29sb3IoVG9XZWJDb3JlU3RyaW5nKGFyZ3NbMF0pKTsKKyAgICAgICAgZWxz
ZSAKKyAgICAgICAgICAgIGNvbnRleHQtPnNldEZpbGxDb2xvcihUT19GTE9BVChhcmdzWzBdKSk7
CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKGFyZ3NbMF0tPklzU3Ry
aW5nKCkpCisgICAgICAgICAgICBjb250ZXh0LT5zZXRGaWxsQ29sb3IoVG9XZWJDb3JlU3RyaW5n
KGFyZ3NbMF0pLCBUT19GTE9BVChhcmdzWzFdKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAg
IGNvbnRleHQtPnNldEZpbGxDb2xvcihUT19GTE9BVChhcmdzWzBdKSwgVE9fRkxPQVQoYXJnc1sx
XSkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICAgIGNvbnRleHQtPnNldEZp
bGxDb2xvcihUT19GTE9BVChhcmdzWzBdKSwgVE9fRkxPQVQoYXJnc1sxXSksIFRPX0ZMT0FUKGFy
Z3NbMl0pLCBUT19GTE9BVChhcmdzWzNdKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNToK
KyAgICAgICAgY29udGV4dC0+c2V0RmlsbENvbG9yKFRPX0ZMT0FUKGFyZ3NbMF0pLCBUT19GTE9B
VChhcmdzWzFdKSwgVE9fRkxPQVQoYXJnc1syXSksIFRPX0ZMT0FUKGFyZ3NbM10pLCBUT19GTE9B
VChhcmdzWzRdKSk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIFY4UHJv
eHk6OlRocm93RXJyb3IoVjhQcm94eTo6U1lOVEFYX0VSUk9SLCAic2V0RmlsbENvbG9yOiBJbnZh
bGlkIG51bWJlciBvZiBhcmd1bWVudHMiKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJl
dHVybiB2ODo6VW5kZWZpbmVkKCk7Cit9CisKK0NBTExCQUNLX0ZVTkNfREVDTChDYW52YXNSZW5k
ZXJpbmdDb250ZXh0MkRTdHJva2VSZWN0KQoreworICAgIElOQ19TVEFUUygiRE9NLkNhbnZhc1Jl
bmRlcmluZ0NvbnRleHQyRC5zdHJva2VSZWN0KCkiKTsKKyAgICBDYW52YXNSZW5kZXJpbmdDb250
ZXh0MkQqIGNvbnRleHQgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxDYW52YXNSZW5kZXJpbmdD
b250ZXh0MkQ+KFY4Q2xhc3NJbmRleDo6Q0FOVkFTUkVOREVSSU5HQ09OVEVYVDJELCBhcmdzLkhv
bGRlcigpKTsKKyAgICBpZiAoYXJncy5MZW5ndGgoKSA9PSA1KQorICAgICAgICBjb250ZXh0LT5z
dHJva2VSZWN0KFRPX0ZMT0FUKGFyZ3NbMF0pLCBUT19GTE9BVChhcmdzWzFdKSwgVE9fRkxPQVQo
YXJnc1syXSksIFRPX0ZMT0FUKGFyZ3NbM10pLCBUT19GTE9BVChhcmdzWzRdKSk7CisgICAgZWxz
ZSBpZiAoYXJncy5MZW5ndGgoKSA9PSA0KQorICAgICAgICBjb250ZXh0LT5zdHJva2VSZWN0KFRP
X0ZMT0FUKGFyZ3NbMF0pLCBUT19GTE9BVChhcmdzWzFdKSwgVE9fRkxPQVQoYXJnc1syXSksIFRP
X0ZMT0FUKGFyZ3NbM10pKTsKKyAgICBlbHNlIHsKKyAgICAgICAgVjhQcm94eTo6U2V0RE9NRXhj
ZXB0aW9uKElOREVYX1NJWkVfRVJSKTsKKyAgICAgICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVy
Y2VwdG9yKCk7CisgICAgfQorICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7Cit9CisKK0NBTExC
QUNLX0ZVTkNfREVDTChDYW52YXNSZW5kZXJpbmdDb250ZXh0MkRTZXRTaGFkb3cpCit7CisgICAg
SU5DX1NUQVRTKCJET00uQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELnNldFNoYWRvdygpIik7Cisg
ICAgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKiBjb250ZXh0ID0gVjhQcm94eTo6VG9OYXRpdmVP
YmplY3Q8Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEPihWOENsYXNzSW5kZXg6OkNBTlZBU1JFTkRF
UklOR0NPTlRFWFQyRCwgYXJncy5Ib2xkZXIoKSk7CisKKyAgICBzd2l0Y2ggKGFyZ3MuTGVuZ3Ro
KCkpIHsKKyAgICBjYXNlIDM6CisgICAgICAgIGNvbnRleHQtPnNldFNoYWRvdyhUT19GTE9BVChh
cmdzWzBdKSwgVE9fRkxPQVQoYXJnc1sxXSksIFRPX0ZMT0FUKGFyZ3NbMl0pKTsKKyAgICAgICAg
YnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgICBpZiAoYXJnc1szXS0+SXNTdHJpbmcoKSkKKyAg
ICAgICAgICAgIGNvbnRleHQtPnNldFNoYWRvdyhUT19GTE9BVChhcmdzWzBdKSwgVE9fRkxPQVQo
YXJnc1sxXSksIFRPX0ZMT0FUKGFyZ3NbMl0pLCBUb1dlYkNvcmVTdHJpbmcoYXJnc1szXSkpOwor
ICAgICAgICBlbHNlCisgICAgICAgICAgICBjb250ZXh0LT5zZXRTaGFkb3coVE9fRkxPQVQoYXJn
c1swXSksIFRPX0ZMT0FUKGFyZ3NbMV0pLCBUT19GTE9BVChhcmdzWzJdKSwgVE9fRkxPQVQoYXJn
c1szXSkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDU6CisgICAgICAgIGlmIChhcmdzWzNd
LT5Jc1N0cmluZygpKQorICAgICAgICAgICAgY29udGV4dC0+c2V0U2hhZG93KFRPX0ZMT0FUKGFy
Z3NbMF0pLCBUT19GTE9BVChhcmdzWzFdKSwgVE9fRkxPQVQoYXJnc1syXSksIFRvV2ViQ29yZVN0
cmluZyhhcmdzWzNdKSwgVE9fRkxPQVQoYXJnc1s0XSkpOworICAgICAgICBlbHNlCisgICAgICAg
ICAgICBjb250ZXh0LT5zZXRTaGFkb3coVE9fRkxPQVQoYXJnc1swXSksIFRPX0ZMT0FUKGFyZ3Nb
MV0pLCBUT19GTE9BVChhcmdzWzJdKSwgVE9fRkxPQVQoYXJnc1szXSksIFRPX0ZMT0FUKGFyZ3Nb
NF0pKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA3OgorICAgICAgICBjb250ZXh0LT5zZXRT
aGFkb3coVE9fRkxPQVQoYXJnc1swXSksIFRPX0ZMT0FUKGFyZ3NbMV0pLCBUT19GTE9BVChhcmdz
WzJdKSwgVE9fRkxPQVQoYXJnc1szXSksIFRPX0ZMT0FUKGFyZ3NbNF0pLCBUT19GTE9BVChhcmdz
WzVdKSwgVE9fRkxPQVQoYXJnc1s2XSkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDg6Cisg
ICAgICAgIGNvbnRleHQtPnNldFNoYWRvdyhUT19GTE9BVChhcmdzWzBdKSwgVE9fRkxPQVQoYXJn
c1sxXSksIFRPX0ZMT0FUKGFyZ3NbMl0pLCBUT19GTE9BVChhcmdzWzNdKSwgVE9fRkxPQVQoYXJn
c1s0XSksIFRPX0ZMT0FUKGFyZ3NbNV0pLCBUT19GTE9BVChhcmdzWzZdKSwgVE9fRkxPQVQoYXJn
c1s3XSkpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBWOFByb3h5OjpU
aHJvd0Vycm9yKFY4UHJveHk6OlNZTlRBWF9FUlJPUiwgInNldFNoYWRvdzogSW52YWxpZCBudW1i
ZXIgb2YgYXJndW1lbnRzIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiB2
ODo6VW5kZWZpbmVkKCk7Cit9CisKK0NBTExCQUNLX0ZVTkNfREVDTChDYW52YXNSZW5kZXJpbmdD
b250ZXh0MkREcmF3SW1hZ2UpCit7CisgICAgSU5DX1NUQVRTKCJET00uQ2FudmFzUmVuZGVyaW5n
Q29udGV4dDJELmRyYXdJbWFnZSgpIik7CisgICAgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKiBj
b250ZXh0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJE
PihWOENsYXNzSW5kZXg6OkNBTlZBU1JFTkRFUklOR0NPTlRFWFQyRCwgYXJncy5Ib2xkZXIoKSk7
CisKKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gYXJnID0gYXJnc1swXTsKKworICAgIGlmIChW
OEhUTUxJbWFnZUVsZW1lbnQ6Okhhc0luc3RhbmNlKGFyZykpIHsKKyAgICAgICAgRXhjZXB0aW9u
Q29kZSBlYyA9IDA7CisgICAgICAgIEhUTUxJbWFnZUVsZW1lbnQqIGltYWdlX2VsZW1lbnQgPSBW
OFByb3h5OjpET01XcmFwcGVyVG9Ob2RlPEhUTUxJbWFnZUVsZW1lbnQ+KGFyZyk7CisgICAgICAg
IHN3aXRjaCAoYXJncy5MZW5ndGgoKSkgeworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBj
b250ZXh0LT5kcmF3SW1hZ2UoaW1hZ2VfZWxlbWVudCwgVE9fRkxPQVQoYXJnc1sxXSksIFRPX0ZM
T0FUKGFyZ3NbMl0pKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU6CisgICAg
ICAgICAgICBjb250ZXh0LT5kcmF3SW1hZ2UoaW1hZ2VfZWxlbWVudCwgVE9fRkxPQVQoYXJnc1sx
XSksIFRPX0ZMT0FUKGFyZ3NbMl0pLCBUT19GTE9BVChhcmdzWzNdKSwgVE9fRkxPQVQoYXJnc1s0
XSksIGVjKTsKKyAgICAgICAgICAgIGlmIChlYyAhPSAwKSB7CisgICAgICAgICAgICAgICAgVjhQ
cm94eTo6U2V0RE9NRXhjZXB0aW9uKGVjKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbm90SGFu
ZGxlZEJ5SW50ZXJjZXB0b3IoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICBjYXNlIDk6CisgICAgICAgICAgICBjb250ZXh0LT5kcmF3SW1hZ2UoaW1hZ2VfZWxl
bWVudCwgRmxvYXRSZWN0KFRPX0ZMT0FUKGFyZ3NbMV0pLCBUT19GTE9BVChhcmdzWzJdKSwgVE9f
RkxPQVQoYXJnc1szXSksIFRPX0ZMT0FUKGFyZ3NbNF0pKSwgRmxvYXRSZWN0KFRPX0ZMT0FUKGFy
Z3NbNV0pLCBUT19GTE9BVChhcmdzWzZdKSwgVE9fRkxPQVQoYXJnc1s3XSksIFRPX0ZMT0FUKGFy
Z3NbOF0pKSwgZWMpOworICAgICAgICAgICAgaWYgKGVjICE9IDApIHsKKyAgICAgICAgICAgICAg
ICBWOFByb3h5OjpTZXRET01FeGNlcHRpb24oZWMpOworICAgICAgICAgICAgICAgIHJldHVybiBu
b3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBWOFByb3h5OjpUaHJvd0Vycm9yKFY4
UHJveHk6OlNZTlRBWF9FUlJPUiwgImRyYXdJbWFnZTogSW52YWxpZCBudW1iZXIgb2YgYXJndW1l
bnRzIik7CisgICAgICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOworICAgICAgICB9Cisg
ICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CisgICAgfQorCisgICAgLy8gSFRNTENhbnZh
c0VsZW1lbnQKKyAgICBpZiAoVjhIVE1MQ2FudmFzRWxlbWVudDo6SGFzSW5zdGFuY2UoYXJnKSkg
eworICAgICAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKKyAgICAgICAgSFRNTENhbnZhc0VsZW1l
bnQqIGNhbnZhc19lbGVtZW50ID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxIVE1MQ2FudmFz
RWxlbWVudD4oYXJnKTsKKyAgICAgICAgc3dpdGNoIChhcmdzLkxlbmd0aCgpKSB7CisgICAgICAg
IGNhc2UgMzoKKyAgICAgICAgICAgIGNvbnRleHQtPmRyYXdJbWFnZShjYW52YXNfZWxlbWVudCwg
VE9fRkxPQVQoYXJnc1sxXSksIFRPX0ZMT0FUKGFyZ3NbMl0pKTsKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICBjb250ZXh0LT5kcmF3SW1hZ2UoY2FudmFz
X2VsZW1lbnQsIFRPX0ZMT0FUKGFyZ3NbMV0pLCBUT19GTE9BVChhcmdzWzJdKSwgVE9fRkxPQVQo
YXJnc1szXSksIFRPX0ZMT0FUKGFyZ3NbNF0pLCBlYyk7CisgICAgICAgICAgICBpZiAoZWMgIT0g
MCkgeworICAgICAgICAgICAgICAgIFY4UHJveHk6OlNldERPTUV4Y2VwdGlvbihlYyk7CisgICAg
ICAgICAgICAgICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgY29u
dGV4dC0+ZHJhd0ltYWdlKGNhbnZhc19lbGVtZW50LCBGbG9hdFJlY3QoVE9fRkxPQVQoYXJnc1sx
XSksIFRPX0ZMT0FUKGFyZ3NbMl0pLCBUT19GTE9BVChhcmdzWzNdKSwgVE9fRkxPQVQoYXJnc1s0
XSkpLCBGbG9hdFJlY3QoVE9fRkxPQVQoYXJnc1s1XSksIFRPX0ZMT0FUKGFyZ3NbNl0pLCBUT19G
TE9BVChhcmdzWzddKSwgVE9fRkxPQVQoYXJnc1s4XSkpLCBlYyk7CisgICAgICAgICAgICBpZiAo
ZWMgIT0gMCkgeworICAgICAgICAgICAgICAgIFY4UHJveHk6OlNldERPTUV4Y2VwdGlvbihlYyk7
CisgICAgICAgICAgICAgICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CisgICAg
ICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAg
ICAgIFY4UHJveHk6OlRocm93RXJyb3IoVjhQcm94eTo6U1lOVEFYX0VSUk9SLCAiZHJhd0ltYWdl
OiBJbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMiKTsKKyAgICAgICAgICAgIHJldHVybiB2ODo6
VW5kZWZpbmVkKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsK
KyAgICB9CisKKyAgICBWOFByb3h5OjpTZXRET01FeGNlcHRpb24oVFlQRV9NSVNNQVRDSF9FUlIp
OworICAgIHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOworfQorCitDQUxMQkFDS19G
VU5DX0RFQ0woQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJERHJhd0ltYWdlRnJvbVJlY3QpCit7Cisg
ICAgSU5DX1NUQVRTKCJET00uQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELmRyYXdJbWFnZUZyb21S
ZWN0KCkiKTsKKyAgICBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQqIGNvbnRleHQgPSBWOFByb3h5
OjpUb05hdGl2ZU9iamVjdDxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ+KFY4Q2xhc3NJbmRleDo6
Q0FOVkFTUkVOREVSSU5HQ09OVEVYVDJELCBhcmdzLkhvbGRlcigpKTsKKworICAgIHY4OjpIYW5k
bGU8djg6OlZhbHVlPiBhcmcgPSBhcmdzWzBdOworCisgICAgaWYgKFY4SFRNTEltYWdlRWxlbWVu
dDo6SGFzSW5zdGFuY2UoYXJnKSkgeworICAgICAgICBIVE1MSW1hZ2VFbGVtZW50KiBpbWFnZV9l
bGVtZW50ID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxIVE1MSW1hZ2VFbGVtZW50Pihhcmcp
OworICAgICAgICBjb250ZXh0LT5kcmF3SW1hZ2VGcm9tUmVjdChpbWFnZV9lbGVtZW50LCAgVE9f
RkxPQVQoYXJnc1sxXSksIFRPX0ZMT0FUKGFyZ3NbMl0pLCBUT19GTE9BVChhcmdzWzNdKSwgVE9f
RkxPQVQoYXJnc1s0XSksIFRPX0ZMT0FUKGFyZ3NbNV0pLCBUT19GTE9BVChhcmdzWzZdKSwgVE9f
RkxPQVQoYXJnc1s3XSksIFRPX0ZMT0FUKGFyZ3NbOF0pLCBUb1dlYkNvcmVTdHJpbmcoYXJnc1s5
XSkpOworICAgIH0gZWxzZQorICAgICAgICBWOFByb3h5OjpUaHJvd0Vycm9yKFY4UHJveHk6OlRZ
UEVfRVJST1IsICJkcmF3SW1hZ2VGcm9tUmVjdDogSW52YWxpZCB0eXBlIG9mIGFyZ3VtZW50cyIp
OworCisgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKK30KKworQ0FMTEJBQ0tfRlVOQ19ERUNM
KENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRENyZWF0ZVBhdHRlcm4pCit7CisgICAgSU5DX1NUQVRT
KCJET00uQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELmNyZWF0ZVBhdHRlcm4oKSIpOworICAgIENh
bnZhc1JlbmRlcmluZ0NvbnRleHQyRCogY29udGV4dCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0
PENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRD4oVjhDbGFzc0luZGV4OjpDQU5WQVNSRU5ERVJJTkdD
T05URVhUMkQsIGFyZ3MuSG9sZGVyKCkpOworCisgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGFy
ZyA9IGFyZ3NbMF07CisKKyAgICBpZiAoVjhIVE1MSW1hZ2VFbGVtZW50OjpIYXNJbnN0YW5jZShh
cmcpKSB7CisgICAgICAgIEhUTUxJbWFnZUVsZW1lbnQqIGltYWdlX2VsZW1lbnQgPSBWOFByb3h5
OjpET01XcmFwcGVyVG9Ob2RlPEhUTUxJbWFnZUVsZW1lbnQ+KGFyZyk7CisgICAgICAgIEV4Y2Vw
dGlvbkNvZGUgZWMgPSAwOworICAgICAgICBSZWZQdHI8Q2FudmFzUGF0dGVybj4gcGF0dGVybiA9
IGNvbnRleHQtPmNyZWF0ZVBhdHRlcm4oaW1hZ2VfZWxlbWVudCwgdmFsdWVUb1N0cmluZ1dpdGhO
dWxsQ2hlY2soYXJnc1sxXSksIGVjKTsKKyAgICAgICAgaWYgKGVjICE9IDApIHsKKyAgICAgICAg
ICAgIFY4UHJveHk6OlNldERPTUV4Y2VwdGlvbihlYyk7CisgICAgICAgICAgICByZXR1cm4gbm90
SGFuZGxlZEJ5SW50ZXJjZXB0b3IoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVjhQcm94
eTo6VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OkNBTlZBU1BBVFRFUk4sIHBhdHRlcm4uZ2V0KCkp
OworICAgIH0KKworICAgIGlmIChWOEhUTUxDYW52YXNFbGVtZW50OjpIYXNJbnN0YW5jZShhcmcp
KSB7CisgICAgICAgIEhUTUxDYW52YXNFbGVtZW50KiBjYW52YXNfZWxlbWVudCA9IFY4UHJveHk6
OkRPTVdyYXBwZXJUb05vZGU8SFRNTENhbnZhc0VsZW1lbnQ+KGFyZyk7CisgICAgICAgIEV4Y2Vw
dGlvbkNvZGUgZWMgPSAwOworICAgICAgICBSZWZQdHI8Q2FudmFzUGF0dGVybj4gcGF0dGVybiA9
IGNvbnRleHQtPmNyZWF0ZVBhdHRlcm4oY2FudmFzX2VsZW1lbnQsIHZhbHVlVG9TdHJpbmdXaXRo
TnVsbENoZWNrKGFyZ3NbMV0pLCBlYyk7CisgICAgICAgIGlmIChlYyAhPSAwKSB7CisgICAgICAg
ICAgICBWOFByb3h5OjpTZXRET01FeGNlcHRpb24oZWMpOworICAgICAgICAgICAgcmV0dXJuIG5v
dEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFY4UHJv
eHk6OlRvVjhPYmplY3QoVjhDbGFzc0luZGV4OjpDQU5WQVNQQVRURVJOLCBwYXR0ZXJuLmdldCgp
KTsKKyAgICB9CisKKyAgICBWOFByb3h5OjpTZXRET01FeGNlcHRpb24oVFlQRV9NSVNNQVRDSF9F
UlIpOworICAgIHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOworfQorCitDQUxMQkFD
S19GVU5DX0RFQ0woQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJERmlsbFRleHQpCit7CisgICAgSU5D
X1NUQVRTKCJET00uQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELmZpbGxUZXh0KCkiKTsKKworICAg
IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCogY29udGV4dCA9IFY4UHJveHk6OlRvTmF0aXZlT2Jq
ZWN0PENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRD4oVjhDbGFzc0luZGV4OjpDQU5WQVNSRU5ERVJJ
TkdDT05URVhUMkQsIGFyZ3MuSG9sZGVyKCkpOworCisgICAgLy8gVHdvIGZvcm1zOgorICAgIC8v
ICogZmlsbFRleHQodGV4dCwgeCwgeSkKKyAgICAvLyAqIGZpbGxUZXh0KHRleHQsIHgsIHksIG1h
eFdpZHRoKQorICAgIGlmIChhcmdzLkxlbmd0aCgpIDwgMyB8fCBhcmdzLkxlbmd0aCgpID4gNCkg
eworICAgICAgICBWOFByb3h5OjpTZXRET01FeGNlcHRpb24oU1lOVEFYX0VSUik7CisgICAgICAg
IHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOworICAgIH0KKworICAgIFN0cmluZyB0
ZXh0ID0gVG9XZWJDb3JlU3RyaW5nKGFyZ3NbMF0pOworICAgIGZsb2F0IHggPSBUT19GTE9BVChh
cmdzWzFdKTsKKyAgICBmbG9hdCB5ID0gVE9fRkxPQVQoYXJnc1syXSk7CisKKyAgICBpZiAoYXJn
cy5MZW5ndGgoKSA9PSA0KSB7CisgICAgICAgIGZsb2F0IG1heFdpZHRoID0gVE9fRkxPQVQoYXJn
c1szXSk7CisgICAgICAgIGNvbnRleHQtPmZpbGxUZXh0KHRleHQsIHgsIHksIG1heFdpZHRoKTsK
KyAgICB9IGVsc2UKKyAgICAgICAgY29udGV4dC0+ZmlsbFRleHQodGV4dCwgeCwgeSk7CisKKyAg
ICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOworfQorCitDQUxMQkFDS19GVU5DX0RFQ0woQ2FudmFz
UmVuZGVyaW5nQ29udGV4dDJEU3Ryb2tlVGV4dCkKK3sKKyAgICBJTkNfU1RBVFMoIkRPTS5DYW52
YXNSZW5kZXJpbmdDb250ZXh0MkQuc3Ryb2tlVGV4dCgpIik7CisgICAgQ2FudmFzUmVuZGVyaW5n
Q29udGV4dDJEKiBjb250ZXh0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8Q2FudmFzUmVuZGVy
aW5nQ29udGV4dDJEPihWOENsYXNzSW5kZXg6OkNBTlZBU1JFTkRFUklOR0NPTlRFWFQyRCwgYXJn
cy5Ib2xkZXIoKSk7CisKKyAgICAvLyBUd28gZm9ybXM6CisgICAgLy8gKiBzdHJva2VUZXh0KHRl
eHQsIHgsIHkpCisgICAgLy8gKiBzdHJva2VUZXh0KHRleHQsIHgsIHksIG1heFdpZHRoKQorICAg
IGlmIChhcmdzLkxlbmd0aCgpIDwgMyB8fCBhcmdzLkxlbmd0aCgpID4gNCkgeworICAgICAgICBW
OFByb3h5OjpTZXRET01FeGNlcHRpb24oU1lOVEFYX0VSUik7CisgICAgICAgIHJldHVybiBub3RI
YW5kbGVkQnlJbnRlcmNlcHRvcigpOworICAgIH0KKworICAgIFN0cmluZyB0ZXh0ID0gVG9XZWJD
b3JlU3RyaW5nKGFyZ3NbMF0pOworICAgIGZsb2F0IHggPSBUT19GTE9BVChhcmdzWzFdKTsKKyAg
ICBmbG9hdCB5ID0gVE9fRkxPQVQoYXJnc1syXSk7CisKKyAgICBpZiAoYXJncy5MZW5ndGgoKSA9
PSA0KSB7CisgICAgICAgIGZsb2F0IG1heFdpZHRoID0gVE9fRkxPQVQoYXJnc1szXSk7CisgICAg
ICAgIGNvbnRleHQtPnN0cm9rZVRleHQodGV4dCwgeCwgeSwgbWF4V2lkdGgpOworICAgIH0gZWxz
ZQorICAgICAgICBjb250ZXh0LT5zdHJva2VUZXh0KHRleHQsIHgsIHkpOworCisgICAgcmV0dXJu
IHY4OjpVbmRlZmluZWQoKTsKK30KKworQ0FMTEJBQ0tfRlVOQ19ERUNMKENhbnZhc1JlbmRlcmlu
Z0NvbnRleHQyRFB1dEltYWdlRGF0YSkKK3sKKyAgICBJTkNfU1RBVFMoIkRPTS5DYW52YXNSZW5k
ZXJpbmdDb250ZXh0MkQucHV0SW1hZ2VEYXRhKCkiKTsKKworICAgIC8vIFR3byBmcm9tczoKKyAg
ICAvLyAqIHB1dEltYWdlRGF0YShJbWFnZURhdGEsIHgsIHkpCisgICAgLy8gKiBwdXRJbWFnZURh
dGEoSW1hZ2VEYXRhLCB4LCB5LCBkaXJ0eVgsIGRpcnR5WSwgZGlydHlXaWR0aCwgZGlydHlIZWln
aHQpCisgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgIT0gMyAmJiBhcmdzLkxlbmd0aCgpICE9IDcpIHsK
KyAgICAgICAgVjhQcm94eTo6U2V0RE9NRXhjZXB0aW9uKFNZTlRBWF9FUlIpOworICAgICAgICBy
ZXR1cm4gbm90SGFuZGxlZEJ5SW50ZXJjZXB0b3IoKTsKKyAgICB9CisKKyAgICBDYW52YXNSZW5k
ZXJpbmdDb250ZXh0MkQqIGNvbnRleHQgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxDYW52YXNS
ZW5kZXJpbmdDb250ZXh0MkQ+KFY4Q2xhc3NJbmRleDo6Q0FOVkFTUkVOREVSSU5HQ09OVEVYVDJE
LCBhcmdzLkhvbGRlcigpKTsKKworICAgIEltYWdlRGF0YSogaW1hZ2VEYXRhID0gMDsKKworICAg
IC8vIE5lZWQgdG8gY2hlY2sgdGhhdCB0aGUgYXJndW1lbnQgaXMgb2YgdGhlIGNvcnJlY3QgdHlw
ZSwgc2luY2UKKyAgICAvLyBUb05hdGl2ZU9iamVjdCgpIGV4cGVjdHMgaXQgdG8gYmUgY29ycmVj
dC4gSWYgdGhlIGFyZ3VtZW50IHdhcyBpbmNvcnJlY3QKKyAgICAvLyB3ZSBsZWF2ZSBpdCBudWxs
LCBhbmQgcHV0SW1hZ2VEYXRhKCkgd2lsbCB0aHJvdyB0aGUgY29ycmVjdCBleGNlcHRpb24KKyAg
ICAvLyAoVFlQRV9NSVNNQVRDSF9FUlIpLgorICAgIGlmIChWOFByb3h5OjpJc1dyYXBwZXJPZlR5
cGUoYXJnc1swXSwgVjhDbGFzc0luZGV4OjpJTUFHRURBVEEpKSB7CisgICAgICAgIGltYWdlRGF0
YSA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PEltYWdlRGF0YT4oVjhDbGFzc0luZGV4OjpJTUFH
RURBVEEsIGFyZ3NbMF0pOworICAgIH0KKworICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOworCisg
ICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPT0gNykKKyAgICAgICAgY29udGV4dC0+cHV0SW1hZ2VEYXRh
KGltYWdlRGF0YSwgVE9fRkxPQVQoYXJnc1sxXSksIFRPX0ZMT0FUKGFyZ3NbMl0pLCBUT19GTE9B
VChhcmdzWzNdKSwgVE9fRkxPQVQoYXJnc1s0XSksIFRPX0ZMT0FUKGFyZ3NbNV0pLCBUT19GTE9B
VChhcmdzWzZdKSwgZWMpOworICAgIGVsc2UKKyAgICAgICAgY29udGV4dC0+cHV0SW1hZ2VEYXRh
KGltYWdlRGF0YSwgVE9fRkxPQVQoYXJnc1sxXSksIFRPX0ZMT0FUKGFyZ3NbMl0pLCBlYyk7CisK
KyAgICBpZiAoZWMgIT0gMCkgeworICAgICAgICBWOFByb3h5OjpTZXRET01FeGNlcHRpb24oZWMp
OworICAgICAgICByZXR1cm4gbm90SGFuZGxlZEJ5SW50ZXJjZXB0b3IoKTsKKyAgICB9CisKKyAg
ICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOworfQorCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCg==
</data>
<flag name="review"
          id="15363"
          type_id="1"
          status="-"
          setter="fishd"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>30476</attachid>
            <date>2009-05-19 09:37:35 -0700</date>
            <delta_ts>2009-05-19 12:14:41 -0700</delta_ts>
            <desc>patch2</desc>
            <filename>patch2.txt</filename>
            <type>text/plain</type>
            <size>14616</size>
            <attacher name="Nate Chapin">japhet</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0Mzg1OSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTIgQEAKKzIwMDktMDUtMTkgIE5hdGUgQ2hhcGluICA8amFwaGV0QGdvb2dsZS5j
b20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVXBz
dHJlYW0gVjggYmluZGluZ3MgZm9yIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC4KKyAgICAgICAg
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI1ODU4CisKKyAgICAgICAg
KiBiaW5kaW5ncy92OC9jdXN0b20vVjhDYW52YXNSZW5kZXJpbmdDb250ZXh0MkRDdXN0b20uY3Bw
OiBNb3ZlZCBiaW5kaW5ncyBmcm9tIHY4X2N1c3RvbS5jcHAuCisKIDIwMDktMDUtMTkgIFBhdmVs
IEZlbGRtYW4gIDxwZmVsZG1hbkBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkg
VGltb3RoeSBIYXRjaGVyLgpJbmRleDogV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDYW52
YXNSZW5kZXJpbmdDb250ZXh0MkRDdXN0b20uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvYmlu
ZGluZ3MvdjgvY3VzdG9tL1Y4Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEQ3VzdG9tLmNwcAkocmV2
aXNpb24gNDM4NTkpCisrKyBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOENhbnZhc1JlbmRl
cmluZ0NvbnRleHQyREN1c3RvbS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM0LDExICszNCwxNSBA
QAogI2luY2x1ZGUgIkNhbnZhc0dyYWRpZW50LmgiCiAjaW5jbHVkZSAiQ2FudmFzUGF0dGVybi5o
IgogI2luY2x1ZGUgIkNhbnZhc1N0eWxlLmgiCisjaW5jbHVkZSAiRXhjZXB0aW9uQ29kZS5oIgor
I2luY2x1ZGUgIkZsb2F0UmVjdC5oIgogCiAjaW5jbHVkZSAiVjhCaW5kaW5nLmgiCiAjaW5jbHVk
ZSAiVjhDYW52YXNHcmFkaWVudC5oIgogI2luY2x1ZGUgIlY4Q2FudmFzUGF0dGVybi5oIgogI2lu
Y2x1ZGUgIlY4Q3VzdG9tQmluZGluZy5oIgorI2luY2x1ZGUgIlY4SFRNTENhbnZhc0VsZW1lbnQu
aCIKKyNpbmNsdWRlICJWOEhUTUxJbWFnZUVsZW1lbnQuaCIKICNpbmNsdWRlICJWOFByb3h5Lmgi
CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKQEAgLTkyLDQgKzk2LDMzMCBAQCBBQ0NFU1NPUl9TRVRU
RVIoQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJECiAgICAgaW1wbC0+c2V0RmlsbFN0eWxlKHRvQ2Fu
dmFzU3R5bGUodmFsdWUpKTsKIH0KIAorLy8gVE9ETzogU2V0U3Ryb2tlQ29sb3IgYW5kIFNldEZp
bGxDb2xvciBhcmUgc2ltaWxhciBleGNlcHQgZnVuY3Rpb24gbmFtZXMsCisvLyBjb25zb2xpZGF0
ZSB0aGVtIGludG8gb25lLgorQ0FMTEJBQ0tfRlVOQ19ERUNMKENhbnZhc1JlbmRlcmluZ0NvbnRl
eHQyRFNldFN0cm9rZUNvbG9yKQoreworICAgIElOQ19TVEFUUygiRE9NLkNhbnZhc1JlbmRlcmlu
Z0NvbnRleHQyRC5zZXRTdHJva2VDb2xvcigpIik7CisgICAgQ2FudmFzUmVuZGVyaW5nQ29udGV4
dDJEKiBjb250ZXh0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8Q2FudmFzUmVuZGVyaW5nQ29u
dGV4dDJEPihWOENsYXNzSW5kZXg6OkNBTlZBU1JFTkRFUklOR0NPTlRFWFQyRCwgYXJncy5Ib2xk
ZXIoKSk7CisgICAgc3dpdGNoIChhcmdzLkxlbmd0aCgpKSB7CisgICAgY2FzZSAxOgorICAgICAg
ICBpZiAoYXJnc1swXS0+SXNTdHJpbmcoKSkKKyAgICAgICAgICAgIGNvbnRleHQtPnNldFN0cm9r
ZUNvbG9yKFRvV2ViQ29yZVN0cmluZyhhcmdzWzBdKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAg
ICAgIGNvbnRleHQtPnNldFN0cm9rZUNvbG9yKHRvRmxvYXQoYXJnc1swXSkpOworICAgICAgICBi
cmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIGlmIChhcmdzWzBdLT5Jc1N0cmluZygpKQorICAg
ICAgICAgICAgY29udGV4dC0+c2V0U3Ryb2tlQ29sb3IoVG9XZWJDb3JlU3RyaW5nKGFyZ3NbMF0p
LCB0b0Zsb2F0KGFyZ3NbMV0pKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY29udGV4dC0+
c2V0U3Ryb2tlQ29sb3IodG9GbG9hdChhcmdzWzBdKSwgdG9GbG9hdChhcmdzWzFdKSk7CisgICAg
ICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgICAgY29udGV4dC0+c2V0U3Ryb2tlQ29sb3Io
dG9GbG9hdChhcmdzWzBdKSwgdG9GbG9hdChhcmdzWzFdKSwgdG9GbG9hdChhcmdzWzJdKSwgdG9G
bG9hdChhcmdzWzNdKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICAgICAgY29u
dGV4dC0+c2V0U3Ryb2tlQ29sb3IodG9GbG9hdChhcmdzWzBdKSwgdG9GbG9hdChhcmdzWzFdKSwg
dG9GbG9hdChhcmdzWzJdKSwgdG9GbG9hdChhcmdzWzNdKSwgdG9GbG9hdChhcmdzWzRdKSk7Cisg
ICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIFY4UHJveHk6OlRocm93RXJyb3Io
VjhQcm94eTo6U1lOVEFYX0VSUk9SLCAic2V0U3Ryb2tlQ29sb3I6IEludmFsaWQgbnVtYmVyIG9m
IGFyZ3VtZW50cyIpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHY4OjpVbmRl
ZmluZWQoKTsKK30KKworQ0FMTEJBQ0tfRlVOQ19ERUNMKENhbnZhc1JlbmRlcmluZ0NvbnRleHQy
RFNldEZpbGxDb2xvcikKK3sKKyAgICBJTkNfU1RBVFMoIkRPTS5DYW52YXNSZW5kZXJpbmdDb250
ZXh0MkQuc2V0RmlsbENvbG9yKCkiKTsKKyAgICBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQqIGNv
bnRleHQgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ+
KFY4Q2xhc3NJbmRleDo6Q0FOVkFTUkVOREVSSU5HQ09OVEVYVDJELCBhcmdzLkhvbGRlcigpKTsK
KyAgICBzd2l0Y2ggKGFyZ3MuTGVuZ3RoKCkpIHsKKyAgICBjYXNlIDE6CisgICAgICAgIGlmIChh
cmdzWzBdLT5Jc1N0cmluZygpKQorICAgICAgICAgICAgY29udGV4dC0+c2V0RmlsbENvbG9yKFRv
V2ViQ29yZVN0cmluZyhhcmdzWzBdKSk7CisgICAgICAgIGVsc2UgCisgICAgICAgICAgICBjb250
ZXh0LT5zZXRGaWxsQ29sb3IodG9GbG9hdChhcmdzWzBdKSk7CisgICAgICAgIGJyZWFrOworICAg
IGNhc2UgMjoKKyAgICAgICAgaWYgKGFyZ3NbMF0tPklzU3RyaW5nKCkpCisgICAgICAgICAgICBj
b250ZXh0LT5zZXRGaWxsQ29sb3IoVG9XZWJDb3JlU3RyaW5nKGFyZ3NbMF0pLCB0b0Zsb2F0KGFy
Z3NbMV0pKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY29udGV4dC0+c2V0RmlsbENvbG9y
KHRvRmxvYXQoYXJnc1swXSksIHRvRmxvYXQoYXJnc1sxXSkpOworICAgICAgICBicmVhazsKKyAg
ICBjYXNlIDQ6CisgICAgICAgIGNvbnRleHQtPnNldEZpbGxDb2xvcih0b0Zsb2F0KGFyZ3NbMF0p
LCB0b0Zsb2F0KGFyZ3NbMV0pLCB0b0Zsb2F0KGFyZ3NbMl0pLCB0b0Zsb2F0KGFyZ3NbM10pKTsK
KyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgICBjb250ZXh0LT5zZXRGaWxsQ29s
b3IodG9GbG9hdChhcmdzWzBdKSwgdG9GbG9hdChhcmdzWzFdKSwgdG9GbG9hdChhcmdzWzJdKSwg
dG9GbG9hdChhcmdzWzNdKSwgdG9GbG9hdChhcmdzWzRdKSk7CisgICAgICAgIGJyZWFrOworICAg
IGRlZmF1bHQ6CisgICAgICAgIFY4UHJveHk6OlRocm93RXJyb3IoVjhQcm94eTo6U1lOVEFYX0VS
Uk9SLCAic2V0RmlsbENvbG9yOiBJbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMiKTsKKyAgICAg
ICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7Cit9CisKK0NBTExC
QUNLX0ZVTkNfREVDTChDYW52YXNSZW5kZXJpbmdDb250ZXh0MkRTdHJva2VSZWN0KQoreworICAg
IElOQ19TVEFUUygiRE9NLkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5zdHJva2VSZWN0KCkiKTsK
KyAgICBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQqIGNvbnRleHQgPSBWOFByb3h5OjpUb05hdGl2
ZU9iamVjdDxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ+KFY4Q2xhc3NJbmRleDo6Q0FOVkFTUkVO
REVSSU5HQ09OVEVYVDJELCBhcmdzLkhvbGRlcigpKTsKKyAgICBpZiAoYXJncy5MZW5ndGgoKSA9
PSA1KQorICAgICAgICBjb250ZXh0LT5zdHJva2VSZWN0KHRvRmxvYXQoYXJnc1swXSksIHRvRmxv
YXQoYXJnc1sxXSksIHRvRmxvYXQoYXJnc1syXSksIHRvRmxvYXQoYXJnc1szXSksIHRvRmxvYXQo
YXJnc1s0XSkpOworICAgIGVsc2UgaWYgKGFyZ3MuTGVuZ3RoKCkgPT0gNCkKKyAgICAgICAgY29u
dGV4dC0+c3Ryb2tlUmVjdCh0b0Zsb2F0KGFyZ3NbMF0pLCB0b0Zsb2F0KGFyZ3NbMV0pLCB0b0Zs
b2F0KGFyZ3NbMl0pLCB0b0Zsb2F0KGFyZ3NbM10pKTsKKyAgICBlbHNlIHsKKyAgICAgICAgVjhQ
cm94eTo6U2V0RE9NRXhjZXB0aW9uKElOREVYX1NJWkVfRVJSKTsKKyAgICAgICAgcmV0dXJuIG5v
dEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CisgICAgfQorICAgIHJldHVybiB2ODo6VW5kZWZpbmVk
KCk7Cit9CisKK0NBTExCQUNLX0ZVTkNfREVDTChDYW52YXNSZW5kZXJpbmdDb250ZXh0MkRTZXRT
aGFkb3cpCit7CisgICAgSU5DX1NUQVRTKCJET00uQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELnNl
dFNoYWRvdygpIik7CisgICAgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKiBjb250ZXh0ID0gVjhQ
cm94eTo6VG9OYXRpdmVPYmplY3Q8Q2FudmFzUmVuZGVyaW5nQ29udGV4dDJEPihWOENsYXNzSW5k
ZXg6OkNBTlZBU1JFTkRFUklOR0NPTlRFWFQyRCwgYXJncy5Ib2xkZXIoKSk7CisKKyAgICBzd2l0
Y2ggKGFyZ3MuTGVuZ3RoKCkpIHsKKyAgICBjYXNlIDM6CisgICAgICAgIGNvbnRleHQtPnNldFNo
YWRvdyh0b0Zsb2F0KGFyZ3NbMF0pLCB0b0Zsb2F0KGFyZ3NbMV0pLCB0b0Zsb2F0KGFyZ3NbMl0p
KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgICBpZiAoYXJnc1szXS0+SXNT
dHJpbmcoKSkKKyAgICAgICAgICAgIGNvbnRleHQtPnNldFNoYWRvdyh0b0Zsb2F0KGFyZ3NbMF0p
LCB0b0Zsb2F0KGFyZ3NbMV0pLCB0b0Zsb2F0KGFyZ3NbMl0pLCBUb1dlYkNvcmVTdHJpbmcoYXJn
c1szXSkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjb250ZXh0LT5zZXRTaGFkb3codG9G
bG9hdChhcmdzWzBdKSwgdG9GbG9hdChhcmdzWzFdKSwgdG9GbG9hdChhcmdzWzJdKSwgdG9GbG9h
dChhcmdzWzNdKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICAgICAgaWYgKGFy
Z3NbM10tPklzU3RyaW5nKCkpCisgICAgICAgICAgICBjb250ZXh0LT5zZXRTaGFkb3codG9GbG9h
dChhcmdzWzBdKSwgdG9GbG9hdChhcmdzWzFdKSwgdG9GbG9hdChhcmdzWzJdKSwgVG9XZWJDb3Jl
U3RyaW5nKGFyZ3NbM10pLCB0b0Zsb2F0KGFyZ3NbNF0pKTsKKyAgICAgICAgZWxzZQorICAgICAg
ICAgICAgY29udGV4dC0+c2V0U2hhZG93KHRvRmxvYXQoYXJnc1swXSksIHRvRmxvYXQoYXJnc1sx
XSksIHRvRmxvYXQoYXJnc1syXSksIHRvRmxvYXQoYXJnc1szXSksIHRvRmxvYXQoYXJnc1s0XSkp
OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDc6CisgICAgICAgIGNvbnRleHQtPnNldFNoYWRv
dyh0b0Zsb2F0KGFyZ3NbMF0pLCB0b0Zsb2F0KGFyZ3NbMV0pLCB0b0Zsb2F0KGFyZ3NbMl0pLCB0
b0Zsb2F0KGFyZ3NbM10pLCB0b0Zsb2F0KGFyZ3NbNF0pLCB0b0Zsb2F0KGFyZ3NbNV0pLCB0b0Zs
b2F0KGFyZ3NbNl0pKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA4OgorICAgICAgICBjb250
ZXh0LT5zZXRTaGFkb3codG9GbG9hdChhcmdzWzBdKSwgdG9GbG9hdChhcmdzWzFdKSwgdG9GbG9h
dChhcmdzWzJdKSwgdG9GbG9hdChhcmdzWzNdKSwgdG9GbG9hdChhcmdzWzRdKSwgdG9GbG9hdChh
cmdzWzVdKSwgdG9GbG9hdChhcmdzWzZdKSwgdG9GbG9hdChhcmdzWzddKSk7CisgICAgICAgIGJy
ZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIFY4UHJveHk6OlRocm93RXJyb3IoVjhQcm94eTo6
U1lOVEFYX0VSUk9SLCAic2V0U2hhZG93OiBJbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMiKTsK
KyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKK30K
KworQ0FMTEJBQ0tfRlVOQ19ERUNMKENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRERyYXdJbWFnZSkK
K3sKKyAgICBJTkNfU1RBVFMoIkRPTS5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQuZHJhd0ltYWdl
KCkiKTsKKyAgICBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQqIGNvbnRleHQgPSBWOFByb3h5OjpU
b05hdGl2ZU9iamVjdDxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ+KFY4Q2xhc3NJbmRleDo6Q0FO
VkFTUkVOREVSSU5HQ09OVEVYVDJELCBhcmdzLkhvbGRlcigpKTsKKworICAgIHY4OjpIYW5kbGU8
djg6OlZhbHVlPiBhcmcgPSBhcmdzWzBdOworCisgICAgaWYgKFY4SFRNTEltYWdlRWxlbWVudDo6
SGFzSW5zdGFuY2UoYXJnKSkgeworICAgICAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKKyAgICAg
ICAgSFRNTEltYWdlRWxlbWVudCogaW1hZ2VfZWxlbWVudCA9IFY4UHJveHk6OkRPTVdyYXBwZXJU
b05vZGU8SFRNTEltYWdlRWxlbWVudD4oYXJnKTsKKyAgICAgICAgc3dpdGNoIChhcmdzLkxlbmd0
aCgpKSB7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIGNvbnRleHQtPmRyYXdJbWFnZShp
bWFnZV9lbGVtZW50LCB0b0Zsb2F0KGFyZ3NbMV0pLCB0b0Zsb2F0KGFyZ3NbMl0pKTsKKyAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICBjb250ZXh0LT5kcmF3
SW1hZ2UoaW1hZ2VfZWxlbWVudCwgdG9GbG9hdChhcmdzWzFdKSwgdG9GbG9hdChhcmdzWzJdKSwg
dG9GbG9hdChhcmdzWzNdKSwgdG9GbG9hdChhcmdzWzRdKSwgZWMpOworICAgICAgICAgICAgaWYg
KGVjICE9IDApIHsKKyAgICAgICAgICAgICAgICBWOFByb3h5OjpTZXRET01FeGNlcHRpb24oZWMp
OworICAgICAgICAgICAgICAgIHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOworICAg
ICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgOToKKyAgICAgICAg
ICAgIGNvbnRleHQtPmRyYXdJbWFnZShpbWFnZV9lbGVtZW50LCAKKyAgICAgICAgICAgICAgICBG
bG9hdFJlY3QodG9GbG9hdChhcmdzWzFdKSwgdG9GbG9hdChhcmdzWzJdKSwgdG9GbG9hdChhcmdz
WzNdKSwgdG9GbG9hdChhcmdzWzRdKSksIAorICAgICAgICAgICAgICAgIEZsb2F0UmVjdCh0b0Zs
b2F0KGFyZ3NbNV0pLCB0b0Zsb2F0KGFyZ3NbNl0pLCB0b0Zsb2F0KGFyZ3NbN10pLCB0b0Zsb2F0
KGFyZ3NbOF0pKSwKKyAgICAgICAgICAgICAgICBlYyk7CisgICAgICAgICAgICBpZiAoZWMgIT0g
MCkgeworICAgICAgICAgICAgICAgIFY4UHJveHk6OlNldERPTUV4Y2VwdGlvbihlYyk7CisgICAg
ICAgICAgICAgICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFY4
UHJveHk6OlRocm93RXJyb3IoVjhQcm94eTo6U1lOVEFYX0VSUk9SLCAiZHJhd0ltYWdlOiBJbnZh
bGlkIG51bWJlciBvZiBhcmd1bWVudHMiKTsKKyAgICAgICAgICAgIHJldHVybiB2ODo6VW5kZWZp
bmVkKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKKyAgICB9
CisKKyAgICAvLyBIVE1MQ2FudmFzRWxlbWVudAorICAgIGlmIChWOEhUTUxDYW52YXNFbGVtZW50
OjpIYXNJbnN0YW5jZShhcmcpKSB7CisgICAgICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOworICAg
ICAgICBIVE1MQ2FudmFzRWxlbWVudCogY2FudmFzX2VsZW1lbnQgPSBWOFByb3h5OjpET01XcmFw
cGVyVG9Ob2RlPEhUTUxDYW52YXNFbGVtZW50PihhcmcpOworICAgICAgICBzd2l0Y2ggKGFyZ3Mu
TGVuZ3RoKCkpIHsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgY29udGV4dC0+ZHJhd0lt
YWdlKGNhbnZhc19lbGVtZW50LCB0b0Zsb2F0KGFyZ3NbMV0pLCB0b0Zsb2F0KGFyZ3NbMl0pKTsK
KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICBjb250ZXh0
LT5kcmF3SW1hZ2UoY2FudmFzX2VsZW1lbnQsIHRvRmxvYXQoYXJnc1sxXSksIHRvRmxvYXQoYXJn
c1syXSksIHRvRmxvYXQoYXJnc1szXSksIHRvRmxvYXQoYXJnc1s0XSksIGVjKTsKKyAgICAgICAg
ICAgIGlmIChlYyAhPSAwKSB7CisgICAgICAgICAgICAgICAgVjhQcm94eTo6U2V0RE9NRXhjZXB0
aW9uKGVjKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbm90SGFuZGxlZEJ5SW50ZXJjZXB0b3Io
KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDk6Cisg
ICAgICAgICAgICBjb250ZXh0LT5kcmF3SW1hZ2UoY2FudmFzX2VsZW1lbnQsCisgICAgICAgICAg
ICAgICAgRmxvYXRSZWN0KHRvRmxvYXQoYXJnc1sxXSksIHRvRmxvYXQoYXJnc1syXSksIHRvRmxv
YXQoYXJnc1szXSksIHRvRmxvYXQoYXJnc1s0XSkpLAorICAgICAgICAgICAgICAgIEZsb2F0UmVj
dCh0b0Zsb2F0KGFyZ3NbNV0pLCB0b0Zsb2F0KGFyZ3NbNl0pLCB0b0Zsb2F0KGFyZ3NbN10pLCB0
b0Zsb2F0KGFyZ3NbOF0pKSwKKyAgICAgICAgICAgICAgICBlYyk7CisgICAgICAgICAgICBpZiAo
ZWMgIT0gMCkgeworICAgICAgICAgICAgICAgIFY4UHJveHk6OlNldERPTUV4Y2VwdGlvbihlYyk7
CisgICAgICAgICAgICAgICAgcmV0dXJuIG5vdEhhbmRsZWRCeUludGVyY2VwdG9yKCk7CisgICAg
ICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAg
ICAgIFY4UHJveHk6OlRocm93RXJyb3IoVjhQcm94eTo6U1lOVEFYX0VSUk9SLCAiZHJhd0ltYWdl
OiBJbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMiKTsKKyAgICAgICAgICAgIHJldHVybiB2ODo6
VW5kZWZpbmVkKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsK
KyAgICB9CisKKyAgICBWOFByb3h5OjpTZXRET01FeGNlcHRpb24oVFlQRV9NSVNNQVRDSF9FUlIp
OworICAgIHJldHVybiBub3RIYW5kbGVkQnlJbnRlcmNlcHRvcigpOworfQorCitDQUxMQkFDS19G
VU5DX0RFQ0woQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJERHJhd0ltYWdlRnJvbVJlY3QpCit7Cisg
ICAgSU5DX1NUQVRTKCJET00uQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELmRyYXdJbWFnZUZyb21S
ZWN0KCkiKTsKKyAgICBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQqIGNvbnRleHQgPSBWOFByb3h5
OjpUb05hdGl2ZU9iamVjdDxDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ+KFY4Q2xhc3NJbmRleDo6
Q0FOVkFTUkVOREVSSU5HQ09OVEVYVDJELCBhcmdzLkhvbGRlcigpKTsKKworICAgIHY4OjpIYW5k
bGU8djg6OlZhbHVlPiBhcmcgPSBhcmdzWzBdOworCisgICAgaWYgKFY4SFRNTEltYWdlRWxlbWVu
dDo6SGFzSW5zdGFuY2UoYXJnKSkgeworICAgICAgICBIVE1MSW1hZ2VFbGVtZW50KiBpbWFnZV9l
bGVtZW50ID0gVjhQcm94eTo6RE9NV3JhcHBlclRvTm9kZTxIVE1MSW1hZ2VFbGVtZW50Pihhcmcp
OworICAgICAgICBjb250ZXh0LT5kcmF3SW1hZ2VGcm9tUmVjdChpbWFnZV9lbGVtZW50LCAgdG9G
bG9hdChhcmdzWzFdKSwgdG9GbG9hdChhcmdzWzJdKSwgdG9GbG9hdChhcmdzWzNdKSwgdG9GbG9h
dChhcmdzWzRdKSwgdG9GbG9hdChhcmdzWzVdKSwgdG9GbG9hdChhcmdzWzZdKSwgdG9GbG9hdChh
cmdzWzddKSwgdG9GbG9hdChhcmdzWzhdKSwgVG9XZWJDb3JlU3RyaW5nKGFyZ3NbOV0pKTsKKyAg
ICB9IGVsc2UKKyAgICAgICAgVjhQcm94eTo6VGhyb3dFcnJvcihWOFByb3h5OjpUWVBFX0VSUk9S
LCAiZHJhd0ltYWdlRnJvbVJlY3Q6IEludmFsaWQgdHlwZSBvZiBhcmd1bWVudHMiKTsKKworICAg
IHJldHVybiB2ODo6VW5kZWZpbmVkKCk7Cit9CisKK0NBTExCQUNLX0ZVTkNfREVDTChDYW52YXNS
ZW5kZXJpbmdDb250ZXh0MkRDcmVhdGVQYXR0ZXJuKQoreworICAgIElOQ19TVEFUUygiRE9NLkNh
bnZhc1JlbmRlcmluZ0NvbnRleHQyRC5jcmVhdGVQYXR0ZXJuKCkiKTsKKyAgICBDYW52YXNSZW5k
ZXJpbmdDb250ZXh0MkQqIGNvbnRleHQgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxDYW52YXNS
ZW5kZXJpbmdDb250ZXh0MkQ+KFY4Q2xhc3NJbmRleDo6Q0FOVkFTUkVOREVSSU5HQ09OVEVYVDJE
LCBhcmdzLkhvbGRlcigpKTsKKworICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBhcmcgPSBhcmdz
WzBdOworCisgICAgaWYgKFY4SFRNTEltYWdlRWxlbWVudDo6SGFzSW5zdGFuY2UoYXJnKSkgewor
ICAgICAgICBIVE1MSW1hZ2VFbGVtZW50KiBpbWFnZV9lbGVtZW50ID0gVjhQcm94eTo6RE9NV3Jh
cHBlclRvTm9kZTxIVE1MSW1hZ2VFbGVtZW50PihhcmcpOworICAgICAgICBFeGNlcHRpb25Db2Rl
IGVjID0gMDsKKyAgICAgICAgUmVmUHRyPENhbnZhc1BhdHRlcm4+IHBhdHRlcm4gPSBjb250ZXh0
LT5jcmVhdGVQYXR0ZXJuKGltYWdlX2VsZW1lbnQsIHZhbHVlVG9TdHJpbmdXaXRoTnVsbENoZWNr
KGFyZ3NbMV0pLCBlYyk7CisgICAgICAgIGlmIChlYyAhPSAwKSB7CisgICAgICAgICAgICBWOFBy
b3h5OjpTZXRET01FeGNlcHRpb24oZWMpOworICAgICAgICAgICAgcmV0dXJuIG5vdEhhbmRsZWRC
eUludGVyY2VwdG9yKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFY4UHJveHk6OlRvVjhP
YmplY3QoVjhDbGFzc0luZGV4OjpDQU5WQVNQQVRURVJOLCBwYXR0ZXJuLmdldCgpKTsKKyAgICB9
CisKKyAgICBpZiAoVjhIVE1MQ2FudmFzRWxlbWVudDo6SGFzSW5zdGFuY2UoYXJnKSkgeworICAg
ICAgICBIVE1MQ2FudmFzRWxlbWVudCogY2FudmFzX2VsZW1lbnQgPSBWOFByb3h5OjpET01XcmFw
cGVyVG9Ob2RlPEhUTUxDYW52YXNFbGVtZW50PihhcmcpOworICAgICAgICBFeGNlcHRpb25Db2Rl
IGVjID0gMDsKKyAgICAgICAgUmVmUHRyPENhbnZhc1BhdHRlcm4+IHBhdHRlcm4gPSBjb250ZXh0
LT5jcmVhdGVQYXR0ZXJuKGNhbnZhc19lbGVtZW50LCB2YWx1ZVRvU3RyaW5nV2l0aE51bGxDaGVj
ayhhcmdzWzFdKSwgZWMpOworICAgICAgICBpZiAoZWMgIT0gMCkgeworICAgICAgICAgICAgVjhQ
cm94eTo6U2V0RE9NRXhjZXB0aW9uKGVjKTsKKyAgICAgICAgICAgIHJldHVybiBub3RIYW5kbGVk
QnlJbnRlcmNlcHRvcigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBWOFByb3h5OjpUb1Y4
T2JqZWN0KFY4Q2xhc3NJbmRleDo6Q0FOVkFTUEFUVEVSTiwgcGF0dGVybi5nZXQoKSk7CisgICAg
fQorCisgICAgVjhQcm94eTo6U2V0RE9NRXhjZXB0aW9uKFRZUEVfTUlTTUFUQ0hfRVJSKTsKKyAg
ICByZXR1cm4gbm90SGFuZGxlZEJ5SW50ZXJjZXB0b3IoKTsKK30KKworQ0FMTEJBQ0tfRlVOQ19E
RUNMKENhbnZhc1JlbmRlcmluZ0NvbnRleHQyREZpbGxUZXh0KQoreworICAgIElOQ19TVEFUUygi
RE9NLkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5maWxsVGV4dCgpIik7CisKKyAgICBDYW52YXNS
ZW5kZXJpbmdDb250ZXh0MkQqIGNvbnRleHQgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVjdDxDYW52
YXNSZW5kZXJpbmdDb250ZXh0MkQ+KFY4Q2xhc3NJbmRleDo6Q0FOVkFTUkVOREVSSU5HQ09OVEVY
VDJELCBhcmdzLkhvbGRlcigpKTsKKworICAgIC8vIFR3byBmb3JtczoKKyAgICAvLyAqIGZpbGxU
ZXh0KHRleHQsIHgsIHkpCisgICAgLy8gKiBmaWxsVGV4dCh0ZXh0LCB4LCB5LCBtYXhXaWR0aCkK
KyAgICBpZiAoYXJncy5MZW5ndGgoKSA8IDMgfHwgYXJncy5MZW5ndGgoKSA+IDQpIHsKKyAgICAg
ICAgVjhQcm94eTo6U2V0RE9NRXhjZXB0aW9uKFNZTlRBWF9FUlIpOworICAgICAgICByZXR1cm4g
bm90SGFuZGxlZEJ5SW50ZXJjZXB0b3IoKTsKKyAgICB9CisKKyAgICBTdHJpbmcgdGV4dCA9IFRv
V2ViQ29yZVN0cmluZyhhcmdzWzBdKTsKKyAgICBmbG9hdCB4ID0gdG9GbG9hdChhcmdzWzFdKTsK
KyAgICBmbG9hdCB5ID0gdG9GbG9hdChhcmdzWzJdKTsKKworICAgIGlmIChhcmdzLkxlbmd0aCgp
ID09IDQpIHsKKyAgICAgICAgZmxvYXQgbWF4V2lkdGggPSB0b0Zsb2F0KGFyZ3NbM10pOworICAg
ICAgICBjb250ZXh0LT5maWxsVGV4dCh0ZXh0LCB4LCB5LCBtYXhXaWR0aCk7CisgICAgfSBlbHNl
CisgICAgICAgIGNvbnRleHQtPmZpbGxUZXh0KHRleHQsIHgsIHkpOworCisgICAgcmV0dXJuIHY4
OjpVbmRlZmluZWQoKTsKK30KKworQ0FMTEJBQ0tfRlVOQ19ERUNMKENhbnZhc1JlbmRlcmluZ0Nv
bnRleHQyRFN0cm9rZVRleHQpCit7CisgICAgSU5DX1NUQVRTKCJET00uQ2FudmFzUmVuZGVyaW5n
Q29udGV4dDJELnN0cm9rZVRleHQoKSIpOworICAgIENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCog
Y29udGV4dCA9IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PENhbnZhc1JlbmRlcmluZ0NvbnRleHQy
RD4oVjhDbGFzc0luZGV4OjpDQU5WQVNSRU5ERVJJTkdDT05URVhUMkQsIGFyZ3MuSG9sZGVyKCkp
OworCisgICAgLy8gVHdvIGZvcm1zOgorICAgIC8vICogc3Ryb2tlVGV4dCh0ZXh0LCB4LCB5KQor
ICAgIC8vICogc3Ryb2tlVGV4dCh0ZXh0LCB4LCB5LCBtYXhXaWR0aCkKKyAgICBpZiAoYXJncy5M
ZW5ndGgoKSA8IDMgfHwgYXJncy5MZW5ndGgoKSA+IDQpIHsKKyAgICAgICAgVjhQcm94eTo6U2V0
RE9NRXhjZXB0aW9uKFNZTlRBWF9FUlIpOworICAgICAgICByZXR1cm4gbm90SGFuZGxlZEJ5SW50
ZXJjZXB0b3IoKTsKKyAgICB9CisKKyAgICBTdHJpbmcgdGV4dCA9IFRvV2ViQ29yZVN0cmluZyhh
cmdzWzBdKTsKKyAgICBmbG9hdCB4ID0gdG9GbG9hdChhcmdzWzFdKTsKKyAgICBmbG9hdCB5ID0g
dG9GbG9hdChhcmdzWzJdKTsKKworICAgIGlmIChhcmdzLkxlbmd0aCgpID09IDQpIHsKKyAgICAg
ICAgZmxvYXQgbWF4V2lkdGggPSB0b0Zsb2F0KGFyZ3NbM10pOworICAgICAgICBjb250ZXh0LT5z
dHJva2VUZXh0KHRleHQsIHgsIHksIG1heFdpZHRoKTsKKyAgICB9IGVsc2UKKyAgICAgICAgY29u
dGV4dC0+c3Ryb2tlVGV4dCh0ZXh0LCB4LCB5KTsKKworICAgIHJldHVybiB2ODo6VW5kZWZpbmVk
KCk7Cit9CisKK0NBTExCQUNLX0ZVTkNfREVDTChDYW52YXNSZW5kZXJpbmdDb250ZXh0MkRQdXRJ
bWFnZURhdGEpCit7CisgICAgSU5DX1NUQVRTKCJET00uQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJE
LnB1dEltYWdlRGF0YSgpIik7CisKKyAgICAvLyBUd28gZnJvbXM6CisgICAgLy8gKiBwdXRJbWFn
ZURhdGEoSW1hZ2VEYXRhLCB4LCB5KQorICAgIC8vICogcHV0SW1hZ2VEYXRhKEltYWdlRGF0YSwg
eCwgeSwgZGlydHlYLCBkaXJ0eVksIGRpcnR5V2lkdGgsIGRpcnR5SGVpZ2h0KQorICAgIGlmIChh
cmdzLkxlbmd0aCgpICE9IDMgJiYgYXJncy5MZW5ndGgoKSAhPSA3KSB7CisgICAgICAgIFY4UHJv
eHk6OlNldERPTUV4Y2VwdGlvbihTWU5UQVhfRVJSKTsKKyAgICAgICAgcmV0dXJuIG5vdEhhbmRs
ZWRCeUludGVyY2VwdG9yKCk7CisgICAgfQorCisgICAgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJE
KiBjb250ZXh0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8Q2FudmFzUmVuZGVyaW5nQ29udGV4
dDJEPihWOENsYXNzSW5kZXg6OkNBTlZBU1JFTkRFUklOR0NPTlRFWFQyRCwgYXJncy5Ib2xkZXIo
KSk7CisKKyAgICBJbWFnZURhdGEqIGltYWdlRGF0YSA9IDA7CisKKyAgICAvLyBOZWVkIHRvIGNo
ZWNrIHRoYXQgdGhlIGFyZ3VtZW50IGlzIG9mIHRoZSBjb3JyZWN0IHR5cGUsIHNpbmNlCisgICAg
Ly8gVG9OYXRpdmVPYmplY3QoKSBleHBlY3RzIGl0IHRvIGJlIGNvcnJlY3QuIElmIHRoZSBhcmd1
bWVudCB3YXMgaW5jb3JyZWN0CisgICAgLy8gd2UgbGVhdmUgaXQgbnVsbCwgYW5kIHB1dEltYWdl
RGF0YSgpIHdpbGwgdGhyb3cgdGhlIGNvcnJlY3QgZXhjZXB0aW9uCisgICAgLy8gKFRZUEVfTUlT
TUFUQ0hfRVJSKS4KKyAgICBpZiAoVjhQcm94eTo6SXNXcmFwcGVyT2ZUeXBlKGFyZ3NbMF0sIFY4
Q2xhc3NJbmRleDo6SU1BR0VEQVRBKSkKKyAgICAgICAgaW1hZ2VEYXRhID0gVjhQcm94eTo6VG9O
YXRpdmVPYmplY3Q8SW1hZ2VEYXRhPihWOENsYXNzSW5kZXg6OklNQUdFREFUQSwgYXJnc1swXSk7
CisKKyAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKKworICAgIGlmIChhcmdzLkxlbmd0aCgpID09
IDcpCisgICAgICAgIGNvbnRleHQtPnB1dEltYWdlRGF0YShpbWFnZURhdGEsIHRvRmxvYXQoYXJn
c1sxXSksIHRvRmxvYXQoYXJnc1syXSksIHRvRmxvYXQoYXJnc1szXSksIHRvRmxvYXQoYXJnc1s0
XSksIHRvRmxvYXQoYXJnc1s1XSksIHRvRmxvYXQoYXJnc1s2XSksIGVjKTsKKyAgICBlbHNlCisg
ICAgICAgIGNvbnRleHQtPnB1dEltYWdlRGF0YShpbWFnZURhdGEsIHRvRmxvYXQoYXJnc1sxXSks
IHRvRmxvYXQoYXJnc1syXSksIGVjKTsKKworICAgIGlmIChlYyAhPSAwKSB7CisgICAgICAgIFY4
UHJveHk6OlNldERPTUV4Y2VwdGlvbihlYyk7CisgICAgICAgIHJldHVybiBub3RIYW5kbGVkQnlJ
bnRlcmNlcHRvcigpOworICAgIH0KKworICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7Cit9CisK
IH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
</data>
<flag name="review"
          id="15381"
          type_id="1"
          status="+"
          setter="fishd"
    />
          </attachment>
      

    </bug>

</bugzilla>