<?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>55025</bug_id>
          
          <creation_ts>2011-02-23 01:44:48 -0800</creation_ts>
          <short_desc>Refactor HTMLEquivalent into a hierachy of classes</short_desc>
          <delta_ts>2011-02-24 00:20:32 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>HTML Editing</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>Enhancement</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>49956</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Ryosuke Niwa">rniwa</reporter>
          <assigned_to name="Ryosuke Niwa">rniwa</assigned_to>
          <cc>darin</cc>
    
    <cc>eric</cc>
    
    <cc>ojan</cc>
    
    <cc>tony</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>355941</commentid>
    <comment_count>0</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-02-23 01:44:48 -0800</bug_when>
    <thetext>As a part of EditingStyle deployment effort, much of logic in ApplyStyleCommand::removeImplicitlyStyledElement needs to be extracted into EditingStyle.  In order to do this, we need to first refactor removeImplicitlyStyledElement and HTMLEquivalents table.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>355944</commentid>
    <comment_count>1</comment_count>
      <attachid>83457</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-02-23 01:58:47 -0800</bug_when>
    <thetext>Created attachment 83457
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>355945</commentid>
    <comment_count>2</comment_count>
      <attachid>83457</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-02-23 02:01:17 -0800</bug_when>
    <thetext>Comment on attachment 83457
Patch

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

&gt; Source/WebCore/ChangeLog:24
&gt; +        (WebCore::HTMLEquivalent::matches): Returns true if the element is an equivalent, meaning that
&gt; +        the element&apos;s implicit style affects the property of this equivalence.
&gt; +        (WebCore::HTMLEquivalent::hasAttribute): Returns true if this equivalence requires attribute;
&gt; +        e.g. color, size, dir.
&gt; +        (WebCore::HTMLEquivalent::propertyExistsInStyle): Returns true if the specified style has
&gt; +        the property of this equivalence; for example, if the current equivalence is about size attribute,
&gt; +        then it&apos;ll return true if the specified style has font-size property set.
&gt; +        (WebCore::HTMLEquivalent::valueIsPresentInStyle): Returns true if the specified style has
&gt; +        the implicit style of the specified element dictated by this equivalence.
&gt; +        (WebCore::HTMLEquivalent::addToStyle): Adds the implicit style of the element dictated by this
&gt; +        equivalence to the specified mutable style.

I&apos;m sorry these descriptions don&apos;t make sense.  I&apos;ll try to revise them when my brain is functioning.

&gt; Source/WebCore/editing/ApplyStyleCommand.cpp:1300
&gt; +    static const HTMLEquivalent* HTMLEquivalents[] = {
&gt; +        adoptPtr(new HTMLEquivalent(CSSPropertyFontWeight, CSSValueBold, bTag)).leakPtr(),
&gt; +        adoptPtr(new HTMLEquivalent(CSSPropertyFontWeight, CSSValueBold, strongTag)).leakPtr(),
&gt; +        adoptPtr(new HTMLEquivalent(CSSPropertyVerticalAlign, CSSValueSub, subTag)).leakPtr(),
&gt; +        adoptPtr(new HTMLEquivalent(CSSPropertyVerticalAlign, CSSValueSuper, supTag)).leakPtr(),
&gt; +        adoptPtr(new HTMLEquivalent(CSSPropertyFontStyle, CSSValueItalic, iTag)).leakPtr(),
&gt; +        adoptPtr(new HTMLEquivalent(CSSPropertyFontStyle, CSSValueItalic, emTag)).leakPtr(),

I don&apos;t know the proper way to construct this table :(  Any suggestions?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>355960</commentid>
    <comment_count>3</comment_count>
      <attachid>83457</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-02-23 02:35:05 -0800</bug_when>
    <thetext>Comment on attachment 83457
Patch

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

&gt;&gt; Source/WebCore/editing/ApplyStyleCommand.cpp:1300
&gt;&gt; +        adoptPtr(new HTMLEquivalent(CSSPropertyFontStyle, CSSValueItalic, emTag)).leakPtr(),
&gt; 
&gt; I don&apos;t know the proper way to construct this table :(  Any suggestions?

With an init() method and a bunch of addEquivalent() calls, would be the way I&apos;d go.  You&apos;ve already moved it to the heap this way, might as well make the code look clean.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>356027</commentid>
    <comment_count>4</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-02-23 04:48:20 -0800</bug_when>
    <thetext>(In reply to comment #3)
&gt; (From update of attachment 83457 [details])
&gt; With an init() method and a bunch of addEquivalent() calls, would be the way I&apos;d go.  You&apos;ve already moved it to the heap this way, might as well make the code look clean.

Would HTMLEquivalents be a vector/list of OwnPtr&lt;HTMLEquivalent&gt; in that case?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>356175</commentid>
    <comment_count>5</comment_count>
      <attachid>83457</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2011-02-23 10:26:22 -0800</bug_when>
    <thetext>Comment on attachment 83457
Patch

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

&gt; Source/WebCore/editing/ApplyStyleCommand.cpp:1170
&gt; +class HTMLEquivalent {
&gt; +public:
&gt; +    HTMLEquivalent(CSSPropertyID id)

I think you’re slightly overdoing it with putting function definitions inside the class definition. Separate inline functions can make the class definition easier to read, and so makes it easier to understand the purpose of the class for people who come to the code later.

&gt; Source/WebCore/editing/ApplyStyleCommand.cpp:1206
&gt; +    const QualifiedName* m_tagName;

I think you need a comment about why it’s OK to use a pointer to something reference-counted here. I presume that’s because these are all global immortal tag names.

&gt; Source/WebCore/editing/ApplyStyleCommand.cpp:1254
&gt; +        RefPtr&lt;CSSValue&gt; value = attributeValueAsCSSValue(element);
&gt; +        if (value)
&gt; +            style-&gt;setProperty(m_propertyID, value-&gt;cssText());

Either an early return or putting the definition inside the if would be good here.

&gt; Source/WebCore/editing/ApplyStyleCommand.cpp:1270
&gt; +    const QualifiedName&amp; m_attrName;

Same comment as above. You need to state why it’s OK to have a reference here.

&gt;&gt;&gt; Source/WebCore/editing/ApplyStyleCommand.cpp:1300
&gt;&gt;&gt; +        adoptPtr(new HTMLEquivalent(CSSPropertyFontStyle, CSSValueItalic, emTag)).leakPtr(),
&gt;&gt; 
&gt;&gt; I don&apos;t know the proper way to construct this table :(  Any suggestions?
&gt; 
&gt; With an init() method and a bunch of addEquivalent() calls, would be the way I&apos;d go.  You&apos;ve already moved it to the heap this way, might as well make the code look clean.

I think this is already fine. I’d probably suggest create functions instead of putting the adoptPtr/new here, even if the create functions aren’t used much.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>356695</commentid>
    <comment_count>6</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-02-23 23:08:38 -0800</bug_when>
    <thetext>&gt; (From update of attachment 83457 [details])
&gt; I&apos;m sorry these descriptions don&apos;t make sense.  I&apos;ll try to revise them when my brain is functioning.

I tried and failed:

(WebCore::HTMLEquivalent::create): Added.
(WebCore::HTMLEquivalent::~HTMLEquivalent): Added.
(WebCore::HTMLEquivalent::matches): Returns true if the element is an equivalent, meaning that
the element&apos;s implicit style affects the property of this equivalence.
(WebCore::HTMLEquivalent::hasAttribute): Returns true if this equivalence requires attributes;
e.g. color, size, dir.
(WebCore::HTMLEquivalent::propertyExistsInStyle): Returns true if the property of this equivalence
exists in the specified style. e.g. if this equivalence is for size attribute and font-size property,
this function returns true if the specified style has font-size property set.
(WebCore::HTMLEquivalent::HTMLEquivalent): Added.
(WebCore::HTMLEquivalent::valueIsPresentInStyle): Returns true if the specified style has the
implicit style of the specified element of this equivalence.
(WebCore::HTMLEquivalent::addToStyle): Adds the implicit style of the element of this equivalence
to the specified mutable style.(In reply to comment #2)

These functions are incredibly hard to understand &amp; explain conceptually.  I&apos;ll land as stated above because the code itself is self-explanatory in my opinion.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>356723</commentid>
    <comment_count>7</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-02-24 00:20:32 -0800</bug_when>
    <thetext>Committed r79521: &lt;http://trac.webkit.org/changeset/79521&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>83457</attachid>
            <date>2011-02-23 01:58:47 -0800</date>
            <delta_ts>2011-02-23 10:26:21 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-55025-20110223185845.patch</filename>
            <type>text/plain</type>
            <size>15080</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDc5NDI1KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNDAgQEAKKzIwMTEtMDItMjMgIFJ5b3N1a2Ug
Tml3YSAgPHJuaXdhQHdlYmtpdC5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgUmVmYWN0b3IgSFRNTEVxdWl2YWxlbnQgaW50byBhIGhpZXJhY2h5
IG9mIGNsYXNzZXMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTU1MDI1CisgICAgICAgIAorICAgICAgICBDb252ZXJ0ZWQgSFRNTEVxdWl2YWxlbnQgaW50
byBhIGNsYXNzLiAgU29tZSBsb2dpYyBpbiByZW1vdmVJbXBsaWNpdGx5U3R5bGVkRWxlbWVudCBp
cyBleHRyYWN0ZWQKKyAgICAgICAgYXMgbWVtYmVyIGZ1bmN0aW9ucyBvZiBIVE1MRXF1aXZhbGVu
dCBhbmQgaXRzIHN1YmNsYXNzZXMuCisKKyAgICAgICAgKiBlZGl0aW5nL0FwcGx5U3R5bGVDb21t
YW5kLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxFcXVpdmFsZW50OjpIVE1MRXF1aXZhbGVu
dCk6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6SFRNTEVxdWl2YWxlbnQ6On5IVE1MRXF1aXZh
bGVudCk6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6SFRNTEVxdWl2YWxlbnQ6Om1hdGNoZXMp
OiBSZXR1cm5zIHRydWUgaWYgdGhlIGVsZW1lbnQgaXMgYW4gZXF1aXZhbGVudCwgbWVhbmluZyB0
aGF0CisgICAgICAgIHRoZSBlbGVtZW50J3MgaW1wbGljaXQgc3R5bGUgYWZmZWN0cyB0aGUgcHJv
cGVydHkgb2YgdGhpcyBlcXVpdmFsZW5jZS4KKyAgICAgICAgKFdlYkNvcmU6OkhUTUxFcXVpdmFs
ZW50OjpoYXNBdHRyaWJ1dGUpOiBSZXR1cm5zIHRydWUgaWYgdGhpcyBlcXVpdmFsZW5jZSByZXF1
aXJlcyBhdHRyaWJ1dGU7CisgICAgICAgIGUuZy4gY29sb3IsIHNpemUsIGRpci4KKyAgICAgICAg
KFdlYkNvcmU6OkhUTUxFcXVpdmFsZW50Ojpwcm9wZXJ0eUV4aXN0c0luU3R5bGUpOiBSZXR1cm5z
IHRydWUgaWYgdGhlIHNwZWNpZmllZCBzdHlsZSBoYXMKKyAgICAgICAgdGhlIHByb3BlcnR5IG9m
IHRoaXMgZXF1aXZhbGVuY2U7IGZvciBleGFtcGxlLCBpZiB0aGUgY3VycmVudCBlcXVpdmFsZW5j
ZSBpcyBhYm91dCBzaXplIGF0dHJpYnV0ZSwKKyAgICAgICAgdGhlbiBpdCdsbCByZXR1cm4gdHJ1
ZSBpZiB0aGUgc3BlY2lmaWVkIHN0eWxlIGhhcyBmb250LXNpemUgcHJvcGVydHkgc2V0LgorICAg
ICAgICAoV2ViQ29yZTo6SFRNTEVxdWl2YWxlbnQ6OnZhbHVlSXNQcmVzZW50SW5TdHlsZSk6IFJl
dHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHN0eWxlIGhhcworICAgICAgICB0aGUgaW1wbGlj
aXQgc3R5bGUgb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50IGRpY3RhdGVkIGJ5IHRoaXMgZXF1aXZh
bGVuY2UuCisgICAgICAgIChXZWJDb3JlOjpIVE1MRXF1aXZhbGVudDo6YWRkVG9TdHlsZSk6IEFk
ZHMgdGhlIGltcGxpY2l0IHN0eWxlIG9mIHRoZSBlbGVtZW50IGRpY3RhdGVkIGJ5IHRoaXMKKyAg
ICAgICAgZXF1aXZhbGVuY2UgdG8gdGhlIHNwZWNpZmllZCBtdXRhYmxlIHN0eWxlLgorICAgICAg
ICAoV2ViQ29yZTo6SFRNTEVxdWl2YWxlbnRWYWx1ZUxpc3Q6OkhUTUxFcXVpdmFsZW50VmFsdWVM
aXN0KTogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpIVE1MRXF1aXZhbGVudFZhbHVlTGlzdDo6
dmFsdWVJc1ByZXNlbnRJblN0eWxlKTogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpIVE1MRXF1
aXZhbGVudEF0dHJpYnV0ZTo6SFRNTEVxdWl2YWxlbnRBdHRyaWJ1dGUpOiBBZGRlZC4KKyAgICAg
ICAgKFdlYkNvcmU6OkhUTUxFcXVpdmFsZW50QXR0cmlidXRlOjptYXRjaGVzKTogQWRkZWQuCisg
ICAgICAgIChXZWJDb3JlOjpIVE1MRXF1aXZhbGVudEF0dHJpYnV0ZTo6aGFzQXR0cmlidXRlKTog
QWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpIVE1MRXF1aXZhbGVudEF0dHJpYnV0ZTo6dmFsdWVJ
c1ByZXNlbnRJblN0eWxlKTogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpIVE1MRXF1aXZhbGVu
dEF0dHJpYnV0ZTo6YWRkVG9TdHlsZSk6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6SFRNTEVx
dWl2YWxlbnRBdHRyaWJ1dGU6OmF0dHJpYnV0ZVZhbHVlQXNDU1NWYWx1ZSk6IEFkZGVkLgorICAg
ICAgICAoV2ViQ29yZTo6SFRNTEVxdWl2YWxlbnRBdHRyaWJ1dGU6OmF0dHJpYnV0ZU5hbWUpOiBB
ZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkhUTUxFcXVpdmFsZW50Rm9udFNpemVBdHRyaWJ1dGU6
OkhUTUxFcXVpdmFsZW50Rm9udFNpemVBdHRyaWJ1dGUpOiBBZGRlZC4KKyAgICAgICAgKFdlYkNv
cmU6OkhUTUxFcXVpdmFsZW50Rm9udFNpemVBdHRyaWJ1dGU6OmF0dHJpYnV0ZVZhbHVlQXNDU1NW
YWx1ZSk6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6QXBwbHlTdHlsZUNvbW1hbmQ6OnJlbW92
ZUltcGxpY2l0bHlTdHlsZWRFbGVtZW50KTogQWRkZWQuCisKIDIwMTEtMDItMjMgIERvbWluaWMg
TWF6em9uaSAgPGRtYXp6b25pQGdvb2dsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgS2Vu
bmV0aCBSdXNzZWxsLgpJbmRleDogU291cmNlL1dlYkNvcmUvZWRpdGluZy9BcHBseVN0eWxlQ29t
bWFuZC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZWRpdGluZy9BcHBseVN0eWxl
Q29tbWFuZC5jcHAJKHJldmlzaW9uIDc5NDAxKQorKysgU291cmNlL1dlYkNvcmUvZWRpdGluZy9B
cHBseVN0eWxlQ29tbWFuZC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTExNjQsMTAxICsxMTY0LDE4
MSBAQCBib29sIEFwcGx5U3R5bGVDb21tYW5kOjpyZW1vdmVJbmxpbmVTdHlsCiAKICAgICByZXR1
cm4gcmVtb3ZlZDsKIH0KLSAgICAKLWVudW0gRVB1c2hEb3duVHlwZSB7IFNob3VsZEJlUHVzaGVk
RG93biwgU2hvdWxkTm90QmVQdXNoZWREb3duIH07Ci1zdHJ1Y3QgSFRNTEVxdWl2YWxlbnQgewot
ICAgIGludCBwcm9wZXJ0eUlEOwotICAgIGJvb2wgaXNWYWx1ZUxpc3Q7Ci0gICAgaW50IHByaW1p
dGl2ZUlkOwotICAgIGNvbnN0IFF1YWxpZmllZE5hbWUqIGVsZW1lbnQ7Ci0gICAgY29uc3QgUXVh
bGlmaWVkTmFtZSogYXR0cmlidXRlOwotICAgIFBhc3NSZWZQdHI8Q1NTVmFsdWU+ICgqYXR0cmli
dXRlVG9DU1NWYWx1ZSkoaW50IHByb3BlcnR5SUQsIGNvbnN0IFN0cmluZyYpOwotICAgIEVQdXNo
RG93blR5cGUgcHVzaERvd25UeXBlOworCitjbGFzcyBIVE1MRXF1aXZhbGVudCB7CitwdWJsaWM6
CisgICAgSFRNTEVxdWl2YWxlbnQoQ1NTUHJvcGVydHlJRCBpZCkKKyAgICAgICAgOiBtX3Byb3Bl
cnR5SUQoaWQpCisgICAgICAgICwgbV90YWdOYW1lKDApCisgICAgeworICAgIH0KKworICAgIEhU
TUxFcXVpdmFsZW50KENTU1Byb3BlcnR5SUQgaWQsIGNvbnN0IFF1YWxpZmllZE5hbWUmIHRhZ05h
bWUpCisgICAgICAgIDogbV9wcm9wZXJ0eUlEKGlkKQorICAgICAgICAsIG1fdGFnTmFtZSgmdGFn
TmFtZSkKKyAgICB7CisgICAgfQorCisgICAgSFRNTEVxdWl2YWxlbnQoQ1NTUHJvcGVydHlJRCBp
ZCwgaW50IHByaW1pdGl2ZVZhbHVlLCBjb25zdCBRdWFsaWZpZWROYW1lJiB0YWdOYW1lKQorICAg
ICAgICA6IG1fcHJvcGVydHlJRChpZCkKKyAgICAgICAgLCBtX3ByaW1pdGl2ZVZhbHVlKENTU1By
aW1pdGl2ZVZhbHVlOjpjcmVhdGVJZGVudGlmaWVyKHByaW1pdGl2ZVZhbHVlKSkKKyAgICAgICAg
LCBtX3RhZ05hbWUoJnRhZ05hbWUpCisgICAgeworICAgICAgICBBU1NFUlQocHJpbWl0aXZlVmFs
dWUgIT0gQ1NTVmFsdWVJbnZhbGlkKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5IVE1MRXF1aXZh
bGVudCgpIHsgfQorICAgIHZpcnR1YWwgYm9vbCBtYXRjaGVzKEVsZW1lbnQqIGVsZW1lbnQpIGNv
bnN0IHsgcmV0dXJuICFtX3RhZ05hbWUgfHwgZWxlbWVudC0+aGFzVGFnTmFtZSgqbV90YWdOYW1l
KTsgfQorICAgIHZpcnR1YWwgYm9vbCBoYXNBdHRyaWJ1dGUoKSBjb25zdCB7IHJldHVybiBmYWxz
ZTsgfQorICAgIGJvb2wgcHJvcGVydHlFeGlzdHNJblN0eWxlKENTU1N0eWxlRGVjbGFyYXRpb24q
IHN0eWxlKSBjb25zdCB7IHJldHVybiBzdHlsZS0+Z2V0UHJvcGVydHlDU1NWYWx1ZShtX3Byb3Bl
cnR5SUQpOyB9CisgICAgdmlydHVhbCBib29sIHZhbHVlSXNQcmVzZW50SW5TdHlsZShFbGVtZW50
KiBlbGVtZW50LCBDU1NTdHlsZURlY2xhcmF0aW9uKiBzdHlsZSkgY29uc3QKKyAgICB7CisgICAg
ICAgIFJlZlB0cjxDU1NWYWx1ZT4gdmFsdWUgPSBzdHlsZS0+Z2V0UHJvcGVydHlDU1NWYWx1ZSht
X3Byb3BlcnR5SUQpOworICAgICAgICByZXR1cm4gbWF0Y2hlcyhlbGVtZW50KSAmJiB2YWx1ZSAm
JiB2YWx1ZS0+aXNQcmltaXRpdmVWYWx1ZSgpICYmIHN0YXRpY19jYXN0PENTU1ByaW1pdGl2ZVZh
bHVlKj4odmFsdWUuZ2V0KCkpLT5nZXRJZGVudCgpID09IG1fcHJpbWl0aXZlVmFsdWUtPmdldElk
ZW50KCk7CisgICAgfQorICAgIHZpcnR1YWwgdm9pZCBhZGRUb1N0eWxlKEVsZW1lbnQqLCBDU1NN
dXRhYmxlU3R5bGVEZWNsYXJhdGlvbiogc3R5bGUpIGNvbnN0CisgICAgeworICAgICAgICBzdHls
ZS0+c2V0UHJvcGVydHkobV9wcm9wZXJ0eUlELCBtX3ByaW1pdGl2ZVZhbHVlLT5jc3NUZXh0KCkp
OworICAgIH0KK3Byb3RlY3RlZDoKKyAgICBjb25zdCBpbnQgbV9wcm9wZXJ0eUlEOworICAgIGNv
bnN0IFJlZlB0cjxDU1NQcmltaXRpdmVWYWx1ZT4gbV9wcmltaXRpdmVWYWx1ZTsKKyAgICBjb25z
dCBRdWFsaWZpZWROYW1lKiBtX3RhZ05hbWU7CiB9OwogCi1zdGF0aWMgUGFzc1JlZlB0cjxDU1NW
YWx1ZT4gc3RyaW5nVG9DU1NWYWx1ZShpbnQgcHJvcGVydHlJRCwgY29uc3QgU3RyaW5nJiB2YWx1
ZSkKK2NsYXNzIEhUTUxFcXVpdmFsZW50VmFsdWVMaXN0IDogcHVibGljIEhUTUxFcXVpdmFsZW50
CiB7Ci0gICAgUmVmUHRyPENTU011dGFibGVTdHlsZURlY2xhcmF0aW9uPiBkdW1teVN0eWxlOwot
ICAgIGR1bW15U3R5bGUgPSBDU1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlvbjo6Y3JlYXRlKCk7Ci0g
ICAgZHVtbXlTdHlsZS0+c2V0UHJvcGVydHkocHJvcGVydHlJRCwgdmFsdWUpOwotICAgIHJldHVy
biBkdW1teVN0eWxlLT5nZXRQcm9wZXJ0eUNTU1ZhbHVlKHByb3BlcnR5SUQpOwotfQorcHVibGlj
OgorICAgIEhUTUxFcXVpdmFsZW50VmFsdWVMaXN0KENTU1Byb3BlcnR5SUQgaWQsIGludCBwcmlt
aXRpdmVWYWx1ZSwgY29uc3QgUXVhbGlmaWVkTmFtZSYgdGFnTmFtZSkKKyAgICAgICAgOiBIVE1M
RXF1aXZhbGVudChpZCwgcHJpbWl0aXZlVmFsdWUsIHRhZ05hbWUpCisgICAgeworICAgIH0KIAot
c3RhdGljIFBhc3NSZWZQdHI8Q1NTVmFsdWU+IGZvbnRTaXplVG9DU1NWYWx1ZShpbnQgcHJvcGVy
dHlJRCwgY29uc3QgU3RyaW5nJiB2YWx1ZSkKKyAgICB2aXJ0dWFsIGJvb2wgdmFsdWVJc1ByZXNl
bnRJblN0eWxlKEVsZW1lbnQqIGVsZW1lbnQsIENTU1N0eWxlRGVjbGFyYXRpb24qIHN0eWxlKSBj
b25zdAorICAgIHsKKyAgICAgICAgUmVmUHRyPENTU1ZhbHVlPiBzdHlsZVZhbHVlID0gc3R5bGUt
PmdldFByb3BlcnR5Q1NTVmFsdWUobV9wcm9wZXJ0eUlEKTsKKyAgICAgICAgcmV0dXJuIG1hdGNo
ZXMoZWxlbWVudCkgJiYgc3R5bGVWYWx1ZSAmJiBzdHlsZVZhbHVlLT5pc1ZhbHVlTGlzdCgpICYm
IHN0YXRpY19jYXN0PENTU1ZhbHVlTGlzdCo+KHN0eWxlVmFsdWUuZ2V0KCkpLT5oYXNWYWx1ZSht
X3ByaW1pdGl2ZVZhbHVlLmdldCgpKTsKKyAgICB9Cit9OworCitjbGFzcyBIVE1MRXF1aXZhbGVu
dEF0dHJpYnV0ZSA6IHB1YmxpYyBIVE1MRXF1aXZhbGVudAogewotICAgIFVOVVNFRF9QQVJBTShw
cm9wZXJ0eUlEKTsKLSAgICBBU1NFUlQocHJvcGVydHlJRCA9PSBDU1NQcm9wZXJ0eUZvbnRTaXpl
KTsKLSAgICBpbnQgc2l6ZTsKLSAgICBpZiAoIUhUTUxGb250RWxlbWVudDo6Y3NzVmFsdWVGcm9t
Rm9udFNpemVOdW1iZXIodmFsdWUsIHNpemUpKQotICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1
cm4gQ1NTUHJpbWl0aXZlVmFsdWU6OmNyZWF0ZUlkZW50aWZpZXIoc2l6ZSk7Ci19CitwdWJsaWM6
CisgICAgSFRNTEVxdWl2YWxlbnRBdHRyaWJ1dGUoQ1NTUHJvcGVydHlJRCBpZCwgY29uc3QgUXVh
bGlmaWVkTmFtZSYgdGFnTmFtZSwgY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0ck5hbWUpCisgICAg
ICAgIDogSFRNTEVxdWl2YWxlbnQoaWQsIHRhZ05hbWUpCisgICAgICAgICwgbV9hdHRyTmFtZShh
dHRyTmFtZSkKKyAgICB7CisgICAgfQorCisgICAgSFRNTEVxdWl2YWxlbnRBdHRyaWJ1dGUoQ1NT
UHJvcGVydHlJRCBpZCwgY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0ck5hbWUpCisgICAgICAgIDog
SFRNTEVxdWl2YWxlbnQoaWQpCisgICAgICAgICwgbV9hdHRyTmFtZShhdHRyTmFtZSkKKyAgICB7
CisgICAgfQorCisgICAgYm9vbCBtYXRjaGVzKEVsZW1lbnQqIGVsZW0pIGNvbnN0IHsgcmV0dXJu
IEhUTUxFcXVpdmFsZW50OjptYXRjaGVzKGVsZW0pICYmIGVsZW0tPmhhc0F0dHJpYnV0ZShtX2F0
dHJOYW1lKTsgfQorICAgIHZpcnR1YWwgYm9vbCBoYXNBdHRyaWJ1dGUoKSBjb25zdCB7IHJldHVy
biB0cnVlOyB9CisgICAgdmlydHVhbCBib29sIHZhbHVlSXNQcmVzZW50SW5TdHlsZShFbGVtZW50
KiBlbGVtZW50LCBDU1NTdHlsZURlY2xhcmF0aW9uKiBzdHlsZSkgY29uc3QKKyAgICB7CisgICAg
ICAgIFJlZlB0cjxDU1NWYWx1ZT4gdmFsdWUgPSBhdHRyaWJ1dGVWYWx1ZUFzQ1NTVmFsdWUoZWxl
bWVudCk7CisgICAgICAgIFJlZlB0cjxDU1NWYWx1ZT4gc3R5bGVWYWx1ZSA9IHN0eWxlLT5nZXRQ
cm9wZXJ0eUNTU1ZhbHVlKG1fcHJvcGVydHlJRCk7CisKKyAgICAgICAgLy8gRklYTUU6IFRoaXMg
aXMgdmVyeSBpbmVmZmljaWVudCB3YXkgb2YgY29tcGFyaW5nIHZhbHVlcworICAgICAgICAvLyBi
dXQgd2UgY2FuJ3Qgc3RyaW5nIGNvbXBhcmUgYXR0cmlidXRlIHZhbHVlIGFuZCBDU1MgcHJvcGVy
dHkgdmFsdWUuCisgICAgICAgIHJldHVybiB2YWx1ZSAmJiBzdHlsZVZhbHVlICYmIHZhbHVlLT5j
c3NUZXh0KCkgPT0gc3R5bGVWYWx1ZS0+Y3NzVGV4dCgpOworICAgIH0KKyAgICB2aXJ0dWFsIHZv
aWQgYWRkVG9TdHlsZShFbGVtZW50KiBlbGVtZW50LCBDU1NNdXRhYmxlU3R5bGVEZWNsYXJhdGlv
biogc3R5bGUpIGNvbnN0CisgICAgeworICAgICAgICBSZWZQdHI8Q1NTVmFsdWU+IHZhbHVlID0g
YXR0cmlidXRlVmFsdWVBc0NTU1ZhbHVlKGVsZW1lbnQpOworICAgICAgICBpZiAodmFsdWUpCisg
ICAgICAgICAgICBzdHlsZS0+c2V0UHJvcGVydHkobV9wcm9wZXJ0eUlELCB2YWx1ZS0+Y3NzVGV4
dCgpKTsKKyAgICB9CisgICAgdmlydHVhbCBQYXNzUmVmUHRyPENTU1ZhbHVlPiBhdHRyaWJ1dGVW
YWx1ZUFzQ1NTVmFsdWUoRWxlbWVudCogZWxlbWVudCkgY29uc3QKKyAgICB7CisgICAgICAgIEFT
U0VSVChlbGVtZW50KTsKKyAgICAgICAgaWYgKCFlbGVtZW50LT5oYXNBdHRyaWJ1dGUobV9hdHRy
TmFtZSkpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBSZWZQdHI8Q1NTTXV0YWJs
ZVN0eWxlRGVjbGFyYXRpb24+IGR1bW15U3R5bGU7CisgICAgICAgIGR1bW15U3R5bGUgPSBDU1NN
dXRhYmxlU3R5bGVEZWNsYXJhdGlvbjo6Y3JlYXRlKCk7CisgICAgICAgIGR1bW15U3R5bGUtPnNl
dFByb3BlcnR5KG1fcHJvcGVydHlJRCwgZWxlbWVudC0+Z2V0QXR0cmlidXRlKG1fYXR0ck5hbWUp
KTsKKyAgICAgICAgcmV0dXJuIGR1bW15U3R5bGUtPmdldFByb3BlcnR5Q1NTVmFsdWUobV9wcm9w
ZXJ0eUlEKTsKKyAgICB9CisgICAgaW5saW5lIGNvbnN0IFF1YWxpZmllZE5hbWUmIGF0dHJpYnV0
ZU5hbWUoKSBjb25zdCB7IHJldHVybiBtX2F0dHJOYW1lOyB9CiAKLXN0YXRpYyBjb25zdCBIVE1M
RXF1aXZhbGVudCBIVE1MRXF1aXZhbGVudHNbXSA9IHsKLSAgICB7IENTU1Byb3BlcnR5Rm9udFdl
aWdodCwgZmFsc2UsIENTU1ZhbHVlQm9sZCwgJmJUYWcsIDAsIDAsIFNob3VsZEJlUHVzaGVkRG93
biB9LAotICAgIHsgQ1NTUHJvcGVydHlGb250V2VpZ2h0LCBmYWxzZSwgQ1NTVmFsdWVCb2xkLCAm
c3Ryb25nVGFnLCAwLCAwLCBTaG91bGRCZVB1c2hlZERvd24gfSwKLSAgICB7IENTU1Byb3BlcnR5
VmVydGljYWxBbGlnbiwgZmFsc2UsIENTU1ZhbHVlU3ViLCAmc3ViVGFnLCAwLCAwLCBTaG91bGRC
ZVB1c2hlZERvd24gfSwKLSAgICB7IENTU1Byb3BlcnR5VmVydGljYWxBbGlnbiwgZmFsc2UsIENT
U1ZhbHVlU3VwZXIsICZzdXBUYWcsIDAsIDAsIFNob3VsZEJlUHVzaGVkRG93biB9LAotICAgIHsg
Q1NTUHJvcGVydHlGb250U3R5bGUsIGZhbHNlLCBDU1NWYWx1ZUl0YWxpYywgJmlUYWcsIDAsIDAs
IFNob3VsZEJlUHVzaGVkRG93biB9LAotICAgIHsgQ1NTUHJvcGVydHlGb250U3R5bGUsIGZhbHNl
LCBDU1NWYWx1ZUl0YWxpYywgJmVtVGFnLCAwLCAwLCBTaG91bGRCZVB1c2hlZERvd24gfSwKLQot
ICAgIC8vIHRleHQtZGVjb3JhdGlvbnMgc2hvdWxkIGJlIENTU1ZhbHVlTGlzdAotICAgIHsgQ1NT
UHJvcGVydHlUZXh0RGVjb3JhdGlvbiwgdHJ1ZSwgQ1NTVmFsdWVVbmRlcmxpbmUsICZ1VGFnLCAw
LCAwLCBTaG91bGRCZVB1c2hlZERvd24gfSwKLSAgICB7IENTU1Byb3BlcnR5VGV4dERlY29yYXRp
b24sIHRydWUsIENTU1ZhbHVlTGluZVRocm91Z2gsICZzVGFnLCAwLCAwLCBTaG91bGRCZVB1c2hl
ZERvd24gfSwKLSAgICB7IENTU1Byb3BlcnR5VGV4dERlY29yYXRpb24sIHRydWUsIENTU1ZhbHVl
TGluZVRocm91Z2gsICZzdHJpa2VUYWcsIDAsIDAsIFNob3VsZEJlUHVzaGVkRG93biB9LAotCi0g
ICAgLy8gRklYTUU6IGZvbnQgYXR0cmlidXRlcyBzaG91bGQgb25seSBiZSByZW1vdmVkIGlmIHZh
bHVlcyB3ZXJlIGRpZmZlcmVudAotICAgIHsgQ1NTUHJvcGVydHlDb2xvciwgZmFsc2UsIENTU1Zh
bHVlSW52YWxpZCwgJmZvbnRUYWcsICZjb2xvckF0dHIsIHN0cmluZ1RvQ1NTVmFsdWUsIFNob3Vs
ZEJlUHVzaGVkRG93biB9LAotICAgIHsgQ1NTUHJvcGVydHlGb250RmFtaWx5LCBmYWxzZSwgQ1NT
VmFsdWVJbnZhbGlkLCAmZm9udFRhZywgJmZhY2VBdHRyLCBzdHJpbmdUb0NTU1ZhbHVlLCBTaG91
bGRCZVB1c2hlZERvd24gfSwKLSAgICB7IENTU1Byb3BlcnR5Rm9udFNpemUsIGZhbHNlLCBDU1NW
YWx1ZUludmFsaWQsICZmb250VGFnLCAmc2l6ZUF0dHIsIGZvbnRTaXplVG9DU1NWYWx1ZSwgU2hv
dWxkQmVQdXNoZWREb3duIH0sCi0KLSAgICAvLyB1bmljb2RlLWJpZGkgYW5kIGRpcmVjdGlvbiBh
cmUgcHVzaGVkIGRvd24gc2VwYXJhdGVseSBzbyBkb24ndCBwdXNoIGRvd24gd2l0aCBvdGhlciBz
dHlsZXMuCi0gICAgeyBDU1NQcm9wZXJ0eURpcmVjdGlvbiwgZmFsc2UsIENTU1ZhbHVlSW52YWxp
ZCwgMCwgJmRpckF0dHIsIHN0cmluZ1RvQ1NTVmFsdWUsIFNob3VsZE5vdEJlUHVzaGVkRG93biB9
LAotICAgIHsgQ1NTUHJvcGVydHlVbmljb2RlQmlkaSwgZmFsc2UsIENTU1ZhbHVlSW52YWxpZCwg
MCwgJmRpckF0dHIsIHN0cmluZ1RvQ1NTVmFsdWUsIFNob3VsZE5vdEJlUHVzaGVkRG93biB9LAor
cHJvdGVjdGVkOgorICAgIGNvbnN0IFF1YWxpZmllZE5hbWUmIG1fYXR0ck5hbWU7Cit9OworCitj
bGFzcyBIVE1MRXF1aXZhbGVudEZvbnRTaXplQXR0cmlidXRlIDogcHVibGljIEhUTUxFcXVpdmFs
ZW50QXR0cmlidXRlIHsKK3B1YmxpYzoKKyAgICBIVE1MRXF1aXZhbGVudEZvbnRTaXplQXR0cmli
dXRlKCkKKyAgICAgICAgOiBIVE1MRXF1aXZhbGVudEF0dHJpYnV0ZShDU1NQcm9wZXJ0eUZvbnRT
aXplLCBmb250VGFnLCBzaXplQXR0cikKKyAgICB7CisgICAgfQorCisgICAgdmlydHVhbCBQYXNz
UmVmUHRyPENTU1ZhbHVlPiBhdHRyaWJ1dGVWYWx1ZUFzQ1NTVmFsdWUoRWxlbWVudCogZWxlbWVu
dCkgY29uc3QKKyAgICB7CisgICAgICAgIEFTU0VSVChlbGVtZW50KTsKKyAgICAgICAgaWYgKCFl
bGVtZW50LT5oYXNBdHRyaWJ1dGUobV9hdHRyTmFtZSkpCisgICAgICAgICAgICByZXR1cm4gMDsK
KyAgICAgICAgaW50IHNpemU7CisgICAgICAgIGlmICghSFRNTEZvbnRFbGVtZW50Ojpjc3NWYWx1
ZUZyb21Gb250U2l6ZU51bWJlcihlbGVtZW50LT5nZXRBdHRyaWJ1dGUobV9hdHRyTmFtZSksIHNp
emUpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBDU1NQcmltaXRpdmVW
YWx1ZTo6Y3JlYXRlSWRlbnRpZmllcihzaXplKTsKKyAgICB9CiB9OwogCiBib29sIEFwcGx5U3R5
bGVDb21tYW5kOjpyZW1vdmVJbXBsaWNpdGx5U3R5bGVkRWxlbWVudChDU1NNdXRhYmxlU3R5bGVE
ZWNsYXJhdGlvbiogc3R5bGUsIEhUTUxFbGVtZW50KiBlbGVtZW50LCBJbmxpbmVTdHlsZVJlbW92
YWxNb2RlIG1vZGUsIENTU011dGFibGVTdHlsZURlY2xhcmF0aW9uKiBleHRyYWN0ZWRTdHlsZSkK
IHsKKyAgICBzdGF0aWMgY29uc3QgSFRNTEVxdWl2YWxlbnQqIEhUTUxFcXVpdmFsZW50c1tdID0g
eworICAgICAgICBhZG9wdFB0cihuZXcgSFRNTEVxdWl2YWxlbnQoQ1NTUHJvcGVydHlGb250V2Vp
Z2h0LCBDU1NWYWx1ZUJvbGQsIGJUYWcpKS5sZWFrUHRyKCksCisgICAgICAgIGFkb3B0UHRyKG5l
dyBIVE1MRXF1aXZhbGVudChDU1NQcm9wZXJ0eUZvbnRXZWlnaHQsIENTU1ZhbHVlQm9sZCwgc3Ry
b25nVGFnKSkubGVha1B0cigpLAorICAgICAgICBhZG9wdFB0cihuZXcgSFRNTEVxdWl2YWxlbnQo
Q1NTUHJvcGVydHlWZXJ0aWNhbEFsaWduLCBDU1NWYWx1ZVN1Yiwgc3ViVGFnKSkubGVha1B0cigp
LAorICAgICAgICBhZG9wdFB0cihuZXcgSFRNTEVxdWl2YWxlbnQoQ1NTUHJvcGVydHlWZXJ0aWNh
bEFsaWduLCBDU1NWYWx1ZVN1cGVyLCBzdXBUYWcpKS5sZWFrUHRyKCksCisgICAgICAgIGFkb3B0
UHRyKG5ldyBIVE1MRXF1aXZhbGVudChDU1NQcm9wZXJ0eUZvbnRTdHlsZSwgQ1NTVmFsdWVJdGFs
aWMsIGlUYWcpKS5sZWFrUHRyKCksCisgICAgICAgIGFkb3B0UHRyKG5ldyBIVE1MRXF1aXZhbGVu
dChDU1NQcm9wZXJ0eUZvbnRTdHlsZSwgQ1NTVmFsdWVJdGFsaWMsIGVtVGFnKSkubGVha1B0cigp
LAorCisgICAgICAgIC8vIHRleHQtZGVjb3JhdGlvbnMgc2hvdWxkIGJlIENTU1ZhbHVlTGlzdAor
ICAgICAgICBhZG9wdFB0cihuZXcgSFRNTEVxdWl2YWxlbnRWYWx1ZUxpc3QoQ1NTUHJvcGVydHlU
ZXh0RGVjb3JhdGlvbiwgQ1NTVmFsdWVVbmRlcmxpbmUsIHVUYWcpKS5sZWFrUHRyKCksCisgICAg
ICAgIGFkb3B0UHRyKG5ldyBIVE1MRXF1aXZhbGVudFZhbHVlTGlzdChDU1NQcm9wZXJ0eVRleHRE
ZWNvcmF0aW9uLCBDU1NWYWx1ZUxpbmVUaHJvdWdoLCBzVGFnKSkubGVha1B0cigpLAorICAgICAg
ICBhZG9wdFB0cihuZXcgSFRNTEVxdWl2YWxlbnRWYWx1ZUxpc3QoQ1NTUHJvcGVydHlUZXh0RGVj
b3JhdGlvbiwgQ1NTVmFsdWVMaW5lVGhyb3VnaCwgc3RyaWtlVGFnKSkubGVha1B0cigpLAorCisg
ICAgICAgIC8vIEZJWE1FOiBmb250IGF0dHJpYnV0ZXMgc2hvdWxkIG9ubHkgYmUgcmVtb3ZlZCBp
ZiB2YWx1ZXMgd2VyZSBkaWZmZXJlbnQKKyAgICAgICAgYWRvcHRQdHIobmV3IEhUTUxFcXVpdmFs
ZW50QXR0cmlidXRlKENTU1Byb3BlcnR5Q29sb3IsIGZvbnRUYWcsIGNvbG9yQXR0cikpLmxlYWtQ
dHIoKSwKKyAgICAgICAgYWRvcHRQdHIobmV3IEhUTUxFcXVpdmFsZW50QXR0cmlidXRlKENTU1By
b3BlcnR5Rm9udEZhbWlseSwgZm9udFRhZywgZmFjZUF0dHIpKS5sZWFrUHRyKCksCisgICAgICAg
IGFkb3B0UHRyKG5ldyBIVE1MRXF1aXZhbGVudEZvbnRTaXplQXR0cmlidXRlKCkpLmxlYWtQdHIo
KSwKKworICAgICAgICBhZG9wdFB0cihuZXcgSFRNTEVxdWl2YWxlbnRBdHRyaWJ1dGUoQ1NTUHJv
cGVydHlEaXJlY3Rpb24sIGRpckF0dHIpKS5sZWFrUHRyKCksCisgICAgICAgIGFkb3B0UHRyKG5l
dyBIVE1MRXF1aXZhbGVudEF0dHJpYnV0ZShDU1NQcm9wZXJ0eVVuaWNvZGVCaWRpLCBkaXJBdHRy
KSkubGVha1B0cigpLAorICAgIH07CisKICAgICAvLyBDdXJyZW50IGltcGxlbWVudGF0aW9uIGRv
ZXMgbm90IHN1cHBvcnQgc3R5bGVQdXNoZWREb3duIHdoZW4gbW9kZSA9PSBSZW1vdmVOb25lIGJl
Y2F1c2Ugb2YgZWFybHkgZXhpdC4KICAgICBBU1NFUlQoc3R5bGUpOwogICAgIEFTU0VSVCghZXh0
cmFjdGVkU3R5bGUgfHwgbW9kZSAhPSBSZW1vdmVOb25lKTsKICAgICBib29sIHJlbW92ZWQgPSBm
YWxzZTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IFdURl9BUlJBWV9MRU5HVEgoSFRNTEVx
dWl2YWxlbnRzKTsgKytpKSB7Ci0gICAgICAgIGNvbnN0IEhUTUxFcXVpdmFsZW50JiBlcXVpdmFs
ZW50ID0gSFRNTEVxdWl2YWxlbnRzW2ldOwotICAgICAgICBBU1NFUlQoZXF1aXZhbGVudC5lbGVt
ZW50IHx8IGVxdWl2YWxlbnQuYXR0cmlidXRlKTsKLSAgICAgICAgaWYgKChleHRyYWN0ZWRTdHls
ZSAmJiBlcXVpdmFsZW50LnB1c2hEb3duVHlwZSA9PSBTaG91bGROb3RCZVB1c2hlZERvd24pCi0g
ICAgICAgICAgICB8fCAoZXF1aXZhbGVudC5lbGVtZW50ICYmICFlbGVtZW50LT5oYXNUYWdOYW1l
KCplcXVpdmFsZW50LmVsZW1lbnQpKQotICAgICAgICAgICAgfHwgKGVxdWl2YWxlbnQuYXR0cmli
dXRlICYmICFlbGVtZW50LT5oYXNBdHRyaWJ1dGUoKmVxdWl2YWxlbnQuYXR0cmlidXRlKSkpCi0g
ICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgY29uc3QgSFRNTEVxdWl2YWxlbnQqIGVxdWl2
YWxlbnQgPSBIVE1MRXF1aXZhbGVudHNbaV07CiAKLSAgICAgICAgUmVmUHRyPENTU1ZhbHVlPiBz
dHlsZVZhbHVlID0gc3R5bGUtPmdldFByb3BlcnR5Q1NTVmFsdWUoZXF1aXZhbGVudC5wcm9wZXJ0
eUlEKTsKLSAgICAgICAgaWYgKCFzdHlsZVZhbHVlKQorICAgICAgICAvLyB1bmljb2RlLWJpZGkg
YW5kIGRpcmVjdGlvbiBhcmUgcHVzaGVkIGRvd24gc2VwYXJhdGVseSBzbyBkb24ndCBwdXNoIGRv
d24gd2l0aCBvdGhlciBzdHlsZXMuCisgICAgICAgIGlmICgoZXh0cmFjdGVkU3R5bGUgJiYgZXF1
aXZhbGVudC0+aGFzQXR0cmlidXRlKCkgJiYgc3RhdGljX2Nhc3Q8Y29uc3QgSFRNTEVxdWl2YWxl
bnRBdHRyaWJ1dGUqPihlcXVpdmFsZW50KS0+YXR0cmlidXRlTmFtZSgpID09IGRpckF0dHIpCisg
ICAgICAgICAgICB8fCAhZXF1aXZhbGVudC0+bWF0Y2hlcyhlbGVtZW50KSB8fCAhZXF1aXZhbGVu
dC0+cHJvcGVydHlFeGlzdHNJblN0eWxlKHN0eWxlKQorICAgICAgICAgICAgfHwgKG1vZGUgIT0g
UmVtb3ZlQWx3YXlzICYmIGVxdWl2YWxlbnQtPnZhbHVlSXNQcmVzZW50SW5TdHlsZShlbGVtZW50
LCBzdHlsZSkpKQogICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIFJlZlB0cjxDU1NWYWx1
ZT4gbWFwVmFsdWU7Ci0gICAgICAgIGlmIChlcXVpdmFsZW50LmF0dHJpYnV0ZSkKLSAgICAgICAg
ICAgIG1hcFZhbHVlID0gZXF1aXZhbGVudC5hdHRyaWJ1dGVUb0NTU1ZhbHVlKGVxdWl2YWxlbnQu
cHJvcGVydHlJRCwgZWxlbWVudC0+Z2V0QXR0cmlidXRlKCplcXVpdmFsZW50LmF0dHJpYnV0ZSkp
OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBtYXBWYWx1ZSA9IENTU1ByaW1pdGl2ZVZhbHVl
OjpjcmVhdGVJZGVudGlmaWVyKGVxdWl2YWxlbnQucHJpbWl0aXZlSWQpLmdldCgpOwotCi0gICAg
ICAgIGlmIChtb2RlICE9IFJlbW92ZUFsd2F5cykgewotICAgICAgICAgICAgaWYgKGVxdWl2YWxl
bnQuaXNWYWx1ZUxpc3QgJiYgc3R5bGVWYWx1ZS0+aXNWYWx1ZUxpc3QoKSAmJiBzdGF0aWNfY2Fz
dDxDU1NWYWx1ZUxpc3QqPihzdHlsZVZhbHVlLmdldCgpKS0+aGFzVmFsdWUobWFwVmFsdWUuZ2V0
KCkpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBJZiBDU1MgdmFsdWUgYXNzdW1lcyBD
U1NWYWx1ZUxpc3QsIHRoZW4gb25seSBza2lwIGlmIHRoZSB2YWx1ZSB3YXMgcHJlc2VudCBpbiBz
dHlsZSB0byBhcHBseS4KLSAgICAgICAgICAgIGVsc2UgaWYgKG1hcFZhbHVlICYmIHN0eWxlVmFs
dWUtPmNzc1RleHQoKSA9PSBtYXBWYWx1ZS0+Y3NzVGV4dCgpKQotICAgICAgICAgICAgICAgIGNv
bnRpbnVlOyAvLyBJZiBDU1MgdmFsdWUgaXMgcHJpbWl0aXZlLCB0aGVuIHNraXAgaWYgdGhleSBh
cmUgZXF1YWwuCi0gICAgICAgIH0KIAotICAgICAgICBpZiAoZXh0cmFjdGVkU3R5bGUgJiYgbWFw
VmFsdWUpCi0gICAgICAgICAgICBleHRyYWN0ZWRTdHlsZS0+c2V0UHJvcGVydHkoZXF1aXZhbGVu
dC5wcm9wZXJ0eUlELCBtYXBWYWx1ZS0+Y3NzVGV4dCgpKTsKKyAgICAgICAgaWYgKGV4dHJhY3Rl
ZFN0eWxlKQorICAgICAgICAgICAgZXF1aXZhbGVudC0+YWRkVG9TdHlsZShlbGVtZW50LCBleHRy
YWN0ZWRTdHlsZSk7CiAKICAgICAgICAgaWYgKG1vZGUgPT0gUmVtb3ZlTm9uZSkKICAgICAgICAg
ICAgIHJldHVybiB0cnVlOwogCi0gICAgICAgIHJlbW92ZWQgPSB0cnVlOwotICAgICAgICBpZiAo
IWVxdWl2YWxlbnQuYXR0cmlidXRlKSB7CisgICAgICAgIGlmICghZXF1aXZhbGVudC0+aGFzQXR0
cmlidXRlKCkpIHsKICAgICAgICAgICAgIHJlcGxhY2VXaXRoU3Bhbk9yUmVtb3ZlSWZXaXRob3V0
QXR0cmlidXRlcyhlbGVtZW50KTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcmV0
dXJuIHRydWU7CiAgICAgICAgIH0KLSAgICAgICAgcmVtb3ZlTm9kZUF0dHJpYnV0ZShlbGVtZW50
LCAqZXF1aXZhbGVudC5hdHRyaWJ1dGUpOworCisgICAgICAgIHJlbW92ZWQgPSB0cnVlOworICAg
ICAgICByZW1vdmVOb2RlQXR0cmlidXRlKGVsZW1lbnQsIHN0YXRpY19jYXN0PGNvbnN0IEhUTUxF
cXVpdmFsZW50QXR0cmlidXRlKj4oZXF1aXZhbGVudCktPmF0dHJpYnV0ZU5hbWUoKSk7CiAgICAg
ICAgIGlmIChpc0VtcHR5Rm9udFRhZyhlbGVtZW50KSB8fCBpc1NwYW5XaXRob3V0QXR0cmlidXRl
c09yVW5zdHlsZVN0eWxlU3BhbihlbGVtZW50KSkKICAgICAgICAgICAgIHJlbW92ZU5vZGVQcmVz
ZXJ2aW5nQ2hpbGRyZW4oZWxlbWVudCk7CiAgICAgfQo=
</data>
<flag name="review"
          id="75280"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>