<?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>21239</bug_id>
          
          <creation_ts>2008-09-30 03:59:39 -0700</creation_ts>
          <short_desc>[CURL] Add on-disk file cache</short_desc>
          <delta_ts>2010-08-19 08:44:00 -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>NEW</bug_status>
          <resolution></resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>Curl</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Marco Barisione">marco.barisione</reporter>
          <assigned_to name="Marco Barisione">marco.barisione</assigned_to>
          <cc>a.butenka</cc>
    
    <cc>ben</cc>
    
    <cc>bugzilla</cc>
    
    <cc>christian</cc>
    
    <cc>denis.cheremisov</cc>
    
    <cc>ht990332</cc>
    
    <cc>louis</cc>
    
    <cc>svillar</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>93354</commentid>
    <comment_count>0</comment_count>
    <who name="Marco Barisione">marco.barisione</who>
    <bug_when>2008-09-30 03:59:39 -0700</bug_when>
    <thetext>At the moment the GTK port doesn&apos;t support on-disk cache.
I&apos;m implementing it in a generic way that can be easily used by both the CURL and soup backend.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>105527</commentid>
    <comment_count>1</comment_count>
      <attachid>26675</attachid>
    <who name="Marco Barisione">marco.barisione</who>
    <bug_when>2009-01-13 11:16:53 -0800</bug_when>
    <thetext>Created attachment 26675
Implement on-disk cache

This is an old patch that I didn&apos;t have time to finish and propose for review.

In the patch I paid attention to make it possible to have more processes accessing the cache at the same time without race, corruptions, etc.

From a quick look the obvious problems are:
- Too many .utf8().data() calls, they were only meant as a temporary workaround as the patch to do a proper conversion was not merged yet.
- Tons of g_print for debugging.
- The cache is saved in the current directory and not in a proper location for testing reasons
- The cache should be nester, the cache entry with hash aabbccdd.. should be saved in aa/bbccdd...
- Not completely portable to windows, I have some ideas on how to do that.

ATM there&apos;s no way to know the total size of the cache or to remove files but I had some ideas on how to implement it, so ping me on IRC if you want to discuss it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>106031</commentid>
    <comment_count>2</comment_count>
    <who name="Alexander Butenko">a.butenka</who>
    <bug_when>2009-01-15 23:16:34 -0800</bug_when>
    <thetext>ok. here is an update of Marco patch. There is some issues which i was to discuss here. 

- Too many .utf8().data() calls, they were only meant as a temporary workaround
as the patch to do a proper conversion was not merged yet.
 
i switched most of the String vars into char*. 

- Tons of g_print for debugging.

Thanks, debug is very nice. Patch still have them. What should we do with it? Add ifdef(DEBUG)? 
 
- The cache is saved in the current directory and not in a proper location for
testing reasons

fixed. Current location is $HOME/.cache/webkit/. Do we need any api to redefine this location from applications? From one point, unified cache directory should be a nice way to handle it. Once user have few webkit based applications, he will be able to use all cache from all his applications. From other point its a lack of configuration for advanced. users. 

- The cache should be nester, the cache entry with hash aabbccdd.. should be
saved in aa/bbccdd...

fixed. 

- Not completely portable to windows, I have some ideas on how to do that.

Sorry, no idea here. I have no idea about development for windows plus i dont have any for test. 


- CURL support is broken in mine patch. What should we do here. Marco and I is using GIO way of sending data to client. Is this way will be portable to all OS that webkit supports? What can be done, is that i can move GIO stuff out from soup file into separate file and reuse it for curl. </thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>106033</commentid>
    <comment_count>3</comment_count>
    <who name="Alexander Butenko">a.butenka</who>
    <bug_when>2009-01-15 23:19:34 -0800</bug_when>
    <thetext>- Cookies have an &apos;Expire&apos; field. should we honor it and send non expired files from cache without confirmation from the server that it not out outdated?  </thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>106034</commentid>
    <comment_count>4</comment_count>
      <attachid>26786</attachid>
    <who name="Alexander Butenko">a.butenka</who>
    <bug_when>2009-01-15 23:33:10 -0800</bug_when>
    <thetext>Created attachment 26786
Updated patch v0.1

patch not for a commit yet, but will be nice if somebody will check it.
There is some things is missing, i will update it soon.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>109777</commentid>
    <comment_count>5</comment_count>
    <who name="Christian Dywan">christian</who>
    <bug_when>2009-02-14 08:25:45 -0800</bug_when>
    <thetext>(In reply to comment #4)
&gt; Created an attachment (id=26786) [review]
&gt; Updated patch v0.1
&gt; 
&gt; patch not for a commit yet, but will be nice if somebody will check it.
&gt; There is some things is missing, i will update it soon.

It was mentioned in discussions on IRC that cache as a libSoup session feature makes much more sense than a WebKit internal implementation. We are only going to support libSoup in the future, and being part of the network interface makes it usable outside of WebKit.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>111332</commentid>
    <comment_count>6</comment_count>
    <who name="Gustavo Noronha (kov)">gustavo</who>
    <bug_when>2009-02-26 15:34:54 -0800</bug_when>
    <thetext>Leaving only Curl as keyword, as this may still be useful for Curl; see Christian Dywan&apos;s comments regarding GTK+/Soup.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>112501</commentid>
    <comment_count>7</comment_count>
    <who name="Gustavo Noronha (kov)">gustavo</who>
    <bug_when>2009-03-05 18:14:36 -0800</bug_when>
    <thetext>Moving away from WebKitGTK</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>116458</commentid>
    <comment_count>8</comment_count>
    <who name="Denis Cheremisov">denis.cheremisov</who>
    <bug_when>2009-04-03 11:36:18 -0700</bug_when>
    <thetext>So, what the situation with this issue now? I&apos;m using latest webkit, and it seems both Epiphany-Webkit and Midori use disk too intensive (compared to Opera, Firefox, Chromium, etc)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>116486</commentid>
    <comment_count>9</comment_count>
    <who name="Christian Dywan">christian</who>
    <bug_when>2009-04-03 14:21:09 -0700</bug_when>
    <thetext>(In reply to comment #8)
&gt; So, what the situation with this issue now? I&apos;m using latest webkit, and it
&gt; seems both Epiphany-Webkit and Midori use disk too intensive (compared to
&gt; Opera, Firefox, Chromium, etc)

Xan is working on a SoupSessionFeature for this, ie. a cache that is implemented in libSoup and can be used by all WebKit applications.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>140229</commentid>
    <comment_count>10</comment_count>
    <who name="Benjamin Meyer">ben</who>
    <bug_when>2009-08-14 07:38:34 -0700</bug_when>
    <thetext>The location of the cache should be configurable and should not point to $HOME/.cache/webkit/ as this is not webkit http cache, but curl/soup cache and a specific implementation at that.  Not to mention that it is really gtkwebkit and not webkit.  As it is the cache patch is not shared with chromium or arora (both on linux and both using webkit, not to say we couldn&apos;t improve our cache&apos;s to all work together)  If in a year someone comes along and comes up with a better way to store the curl/soup cache they might not want to have both cache&apos;s in the same directory. 

On Linux $HOME/.cache should not be used, but the location should be determined from the environment variable $XDG_CACHE_HOME falling back to $HOME/.cache when it is empty.  See http://standards.freedesktop.org/basedir-spec/basedir-spec-0.6.html  One OS X and Windows of course this is also different and not $HOME/.cache.

Lastly although I do not see it in the xdg spec looking at my .cache I see that the way that the .cache directory is being used is $XDG_CACHE_HOME/$COMPANY_NAME/$APPLICATION_NAME/ for example $HOME/.cache/midori/ or $HOME/.cache/Trolltech/demobrowser  Different applications have different needs for cache.  One application might hit the same few website(s) for years such as an rss reader.  For that application it is very valuable that the cache not be deleted, but a web browser cache usage is different and could completely change every hour.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>140297</commentid>
    <comment_count>11</comment_count>
    <who name="Christian Dywan">christian</who>
    <bug_when>2009-08-14 12:16:16 -0700</bug_when>
    <thetext>To make this clear: WebKitGTK+ is not using CURL anymore and hence this feature request is obsolete as far as WebKitGTK+ is concerned.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>266718</commentid>
    <comment_count>12</comment_count>
    <who name="Sergio Villar Senin">svillar</who>
    <bug_when>2010-08-19 07:20:39 -0700</bug_when>
    <thetext>I guess it&apos;s better to close this now that we have https://bugs.webkit.org/show_bug.cgi?id=44261</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>266755</commentid>
    <comment_count>13</comment_count>
    <who name="Benjamin Meyer">ben</who>
    <bug_when>2010-08-19 08:25:55 -0700</bug_when>
    <thetext>Shouldn&apos;t you leave the old bug with lots of useful information open and close the new duplicate bug that contains one link and move that link here?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>266763</commentid>
    <comment_count>14</comment_count>
    <who name="Sergio Villar Senin">svillar</who>
    <bug_when>2010-08-19 08:44:00 -0700</bug_when>
    <thetext>(In reply to comment #13)
&gt; Shouldn&apos;t you leave the old bug with lots of useful information open and close the new duplicate bug that contains one link and move that link here?

I don&apos;t think so. Mainly because although they both target the same feature they are based on very different implementations. The new one is just for discussing that other implementation.

As kov said curl cache won&apos;t be integrated in webkitgtk+ I thought it could be useful for other people to know about new plans. Anyway this can be left open, not strong opinion about it.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>26675</attachid>
            <date>2009-01-13 11:16:53 -0800</date>
            <delta_ts>2010-06-10 19:18:26 -0700</delta_ts>
            <desc>Implement on-disk cache</desc>
            <filename>cache.patch</filename>
            <type>text/plain</type>
            <size>33389</size>
            <attacher name="Marco Barisione">marco.barisione</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvR05VbWFrZWZpbGUuYW0gYi9XZWJDb3JlL0dOVW1ha2VmaWxl
LmFtCmluZGV4IDNkYzdhOTMuLmE4OGY3OWIgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvR05VbWFrZWZp
bGUuYW0KKysrIGIvV2ViQ29yZS9HTlVtYWtlZmlsZS5hbQpAQCAtMzUsNiArMzUsNyBAQCB3ZWJj
b3JlX2NwcGZsYWdzICs9IFwKIAktSSQoc3JjZGlyKS9XZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRl
Y29kZXJzL3BuZyBcCiAJLUkkKHNyY2RpcikvV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVy
cy94Ym0gXAogCS1JJChzcmNkaXIpL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yayBcCisJLUkkKHNy
Y2RpcikvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2ZpbGVjYWNoZSBcCiAJLUkkKHNyY2Rpcikv
V2ViQ29yZS9wbGF0Zm9ybS90ZXh0IFwKIAktSSQoc3JjZGlyKS9XZWJDb3JlL3BsdWdpbnMgXAog
CS1JJChzcmNkaXIpL1dlYkNvcmUvcmVuZGVyaW5nIFwKQEAgLTE2ODEsNiArMTY4Miw4IEBAIHdl
YmNvcmVfc291cmNlcyArPSBcCiAJV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL1Jlc291cmNlUmVx
dWVzdEJhc2UuaCBcCiAJV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL1Jlc291cmNlUmVzcG9uc2VC
YXNlLmNwcCBcCiAJV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL1Jlc291cmNlUmVzcG9uc2VCYXNl
LmggXAorCVdlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9maWxlY2FjaGUvRmlsZUNhY2hlLmNwcCBc
CisJV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2ZpbGVjYWNoZS9GaWxlQ2FjaGUuaCBcCiAJV2Vi
Q29yZS9wbGF0Zm9ybS90ZXh0L0F0b21pY1N0cmluZy5jcHAgXAogCVdlYkNvcmUvcGxhdGZvcm0v
dGV4dC9BdG9taWNTdHJpbmcuaCBcCiAJV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L0F0b21pY1N0cmlu
Z0ltcGwuaCBcCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvUmVzb3VyY2VI
YW5kbGVJbnRlcm5hbC5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL1Jlc291cmNlSGFuZGxl
SW50ZXJuYWwuaAppbmRleCA4YTZkMjBlLi40ZjUzYjQ5IDEwMDY0NAotLS0gYS9XZWJDb3JlL3Bs
YXRmb3JtL25ldHdvcmsvUmVzb3VyY2VIYW5kbGVJbnRlcm5hbC5oCisrKyBiL1dlYkNvcmUvcGxh
dGZvcm0vbmV0d29yay9SZXNvdXJjZUhhbmRsZUludGVybmFsLmgKQEAgLTQ5LDYgKzQ5LDExIEBA
CiAjaW5jbHVkZSA8bGlic291cC9zb3VwLmg+CiAjZW5kaWYKIAorI2lmIFVTRShDVVJMKQorI2lu
Y2x1ZGUgIkZpbGVDYWNoZS5oIgorI2luY2x1ZGUgIk93blB0ci5oIgorI2VuZGlmCisKICNpZiBQ
TEFURk9STShRVCkKIGNsYXNzIFFXZWJGcmFtZTsKIGNsYXNzIFFXZWJOZXR3b3JrSm9iOwpAQCAt
MTE1LDYgKzEyMCw5IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgICAgICwgbV9idWZz
aXplKDApCiAgICAgICAgICAgICAsIG1fdG90YWwoMCkKICNlbmRpZgorI2lmIFVTRShDVVJMKQor
ICAgICAgICAgICAgLCBtX2NhY2hlKDApCisjZW5kaWYKICNpZiBQTEFURk9STShRVCkKICAgICAg
ICAgICAgICwgbV9qb2IoMCkKICAgICAgICAgICAgICwgbV9mcmFtZSgwKQpAQCAtMTg0LDYgKzE5
Miw5IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgY2hhciogbV9idWZmZXI7CiAgICAg
ICAgIGdzaXplIG1fYnVmc2l6ZSwgbV90b3RhbDsKICNlbmRpZgorI2lmIFVTRShDVVJMKQorICAg
ICAgICBPd25QdHI8V2ViQ29yZTo6RmlsZUNhY2hlPiBtX2NhY2hlOworI2VuZGlmCiAjaWYgUExB
VEZPUk0oUVQpCiAjaWYgUVRfVkVSU0lPTiA8IDB4MDQwNDAwCiAgICAgICAgIFFXZWJOZXR3b3Jr
Sm9iKiBtX2pvYjsKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL1Jl
c291cmNlSGFuZGxlTWFuYWdlci5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvY3VybC9S
ZXNvdXJjZUhhbmRsZU1hbmFnZXIuY3BwCmluZGV4IDJmZmM3OGYuLmUyYjJkNjYgMTAwNjQ0Ci0t
LSBhL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL1Jlc291cmNlSGFuZGxlTWFuYWdlci5j
cHAKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1cmwvUmVzb3VyY2VIYW5kbGVNYW5h
Z2VyLmNwcApAQCAtMyw2ICszLDcgQEAKICAqIENvcHlyaWdodCAoQykgMjAwNiBNaWNoYWVsIEVt
bWVsIG1pa2UuZW1tZWxAZ21haWwuY29tCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQWxwIFRva2Vy
IDxhbHAudG9rZXJAY29sbGFib3JhLmNvLnVrPgogICogQ29weXJpZ2h0IChDKSAyMDA3IEhvbGdl
ciBIYW5zIFBldGVyIEZyZXl0aGVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggQ29sbGFib3JhIEx0
ZC4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0zMSw2ICsz
Miw3IEBACiAjaW5jbHVkZSAiUmVzb3VyY2VIYW5kbGVNYW5hZ2VyLmgiCiAKICNpbmNsdWRlICJD
U3RyaW5nLmgiCisjaW5jbHVkZSAiRmlsZUNhY2hlLmgiCiAjaW5jbHVkZSAiTUlNRVR5cGVSZWdp
c3RyeS5oIgogI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCiAjaW5jbHVkZSAiUmVzb3VyY2VF
cnJvci5oIgpAQCAtMTIwLDYgKzEyMiw3IEBAIHN0YXRpYyBzaXplX3Qgd3JpdGVDYWxsYmFjayh2
b2lkKiBwdHIsIHNpemVfdCBzaXplLCBzaXplX3Qgbm1lbWIsIHZvaWQqIGRhdGEpCiAgICAgLy8g
UnVuIHRoZSBjb2RlIGhlcmUgZm9yIGxvY2FsIGZpbGVzIHRvIHJlc29sdmUgdGhlIGlzc3VlLgog
ICAgIC8vIFRPRE86IFNlZSBpZiB0aGVyZSBpcyBhIGJldHRlciBhcHByb2FjaCBmb3IgaGFuZGxp
bmcgdGhpcy4KICAgICBpZiAoIWQtPm1fcmVzcG9uc2UucmVzcG9uc2VGaXJlZCgpKSB7CisgICAg
ICAgIEFTU0VSVCghZC0+bV9jYWNoZSk7CiAgICAgICAgIGNvbnN0IGNoYXIqIGhkcjsKICAgICAg
ICAgZXJyID0gY3VybF9lYXN5X2dldGluZm8oaCwgQ1VSTElORk9fRUZGRUNUSVZFX1VSTCwgJmhk
cik7CiAgICAgICAgIGQtPm1fcmVzcG9uc2Uuc2V0VXJsKEtVUkwoaGRyKSk7CkBAIC0xMzAsNiAr
MTMzLDggQEAgc3RhdGljIHNpemVfdCB3cml0ZUNhbGxiYWNrKHZvaWQqIHB0ciwgc2l6ZV90IHNp
emUsIHNpemVfdCBubWVtYiwgdm9pZCogZGF0YSkKIAogICAgIGlmIChkLT5jbGllbnQoKSkKICAg
ICAgICAgZC0+Y2xpZW50KCktPmRpZFJlY2VpdmVEYXRhKGpvYiwgc3RhdGljX2Nhc3Q8Y2hhcio+
KHB0ciksIHRvdGFsU2l6ZSwgMCk7CisgICAgaWYgKGQtPm1fY2FjaGUpCisgICAgICAgIGQtPm1f
Y2FjaGUtPmRpZFJlY2VpdmVEYXRhKGpvYiwgc3RhdGljX2Nhc3Q8Y2hhcio+KHB0ciksIHRvdGFs
U2l6ZSwgMCk7CiAgICAgcmV0dXJuIHRvdGFsU2l6ZTsKIH0KIApAQCAtMTg3LDcgKzE5Miw3IEBA
IHN0YXRpYyBzaXplX3QgaGVhZGVyQ2FsbGJhY2soY2hhciogcHRyLCBzaXplX3Qgc2l6ZSwgc2l6
ZV90IG5tZW1iLCB2b2lkKiBkYXRhKQogICAgICAgICBkLT5tX3Jlc3BvbnNlLnNldFN1Z2dlc3Rl
ZEZpbGVuYW1lKGZpbGVuYW1lRnJvbUhUVFBDb250ZW50RGlzcG9zaXRpb24oZC0+bV9yZXNwb25z
ZS5odHRwSGVhZGVyRmllbGQoIkNvbnRlbnQtRGlzcG9zaXRpb24iKSkpOwogCiAgICAgICAgIC8v
IEhUVFAgcmVkaXJlY3Rpb24KLSAgICAgICAgaWYgKGh0dHBDb2RlID49IDMwMCAmJiBodHRwQ29k
ZSA8IDQwMCkgeworICAgICAgICBpZiAoaHR0cENvZGUgPj0gMzAwICYmIGh0dHBDb2RlIDwgNDAw
ICYmIGh0dHBDb2RlICE9IDMwNCkgewogICAgICAgICAgICAgU3RyaW5nIGxvY2F0aW9uID0gZC0+
bV9yZXNwb25zZS5odHRwSGVhZGVyRmllbGQoImxvY2F0aW9uIik7CiAgICAgICAgICAgICBpZiAo
IWxvY2F0aW9uLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIEtVUkwgbmV3VVJMID0gS1VS
TChqb2ItPnJlcXVlc3QoKS51cmwoKSwgbG9jYXRpb24pOwpAQCAtMjAzLDkgKzIwOCwxMyBAQCBz
dGF0aWMgc2l6ZV90IGhlYWRlckNhbGxiYWNrKGNoYXIqIHB0ciwgc2l6ZV90IHNpemUsIHNpemVf
dCBubWVtYiwgdm9pZCogZGF0YSkKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAg
IGlmIChkLT5tX2NhY2hlKQorICAgICAgICAgICAgZC0+bV9jYWNoZS0+ZGlkUmVjZWl2ZVJlc3Bv
bnNlKGQtPm1fcmVzcG9uc2UpOwogICAgICAgICBpZiAoY2xpZW50KQogICAgICAgICAgICAgY2xp
ZW50LT5kaWRSZWNlaXZlUmVzcG9uc2Uoam9iLCBkLT5tX3Jlc3BvbnNlKTsKICAgICAgICAgZC0+
bV9yZXNwb25zZS5zZXRSZXNwb25zZUZpcmVkKHRydWUpOworICAgICAgICBpZiAoZC0+bV9jYWNo
ZSAmJiBkLT5tX2NhY2hlLT5oYXNGcmVzaERhdGEoKSAmJiBjbGllbnQpCisgICAgICAgICAgICBk
LT5tX2NhY2hlLT5zZW5kQ2FjaGVkRGF0YShqb2IsIGNsaWVudCk7CiAKICAgICB9IGVsc2Ugewog
ICAgICAgICBpbnQgc3BsaXRQb3MgPSBoZWFkZXIuZmluZCgiOiIpOwpAQCAtMzEyLDE0ICszMjEs
MjMgQEAgdm9pZCBSZXNvdXJjZUhhbmRsZU1hbmFnZXI6OmRvd25sb2FkVGltZXJDYWxsYmFjayhU
aW1lcjxSZXNvdXJjZUhhbmRsZU1hbmFnZXI+KgogICAgICAgICAgICAgY29udGludWU7CiAKICAg
ICAgICAgaWYgKENVUkxFX09LID09IG1zZy0+ZGF0YS5yZXN1bHQpIHsKLSAgICAgICAgICAgIGlm
IChkLT5jbGllbnQoKSkKLSAgICAgICAgICAgICAgICBkLT5jbGllbnQoKS0+ZGlkRmluaXNoTG9h
ZGluZyhqb2IpOworICAgICAgICAgICAgLy8gSWYgd2UgcmVjZWl2ZWQgYSAzMDQgdGhlbiB0aGUg
Y2FjaGUgaXMgc3RpbGwgcmVhZGluZyBkYXRhCisgICAgICAgICAgICAvLyBmcm9tIHRoZSBkaXNr
IGFuZCBzZW5kaW5nIGl0IHRvIHRoZSBjbGllbnQsIHNvIGRvbid0IHN0b3AgaXQuCisgICAgICAg
ICAgICBib29sIGNhY2hlSXNTZW5kaW5nRGF0YSA9IGQtPm1fY2FjaGUgJiYgZC0+bV9jYWNoZS0+
aGFzRnJlc2hEYXRhKCk7CisgICAgICAgICAgICBpZiAoIWNhY2hlSXNTZW5kaW5nRGF0YSkgewor
ICAgICAgICAgICAgICBpZiAoZC0+bV9jYWNoZSAmJiAhZC0+bV9yZXNwb25zZS5sb2FkZWRGcm9t
Q2FjaGUoKSkKKyAgICAgICAgICAgICAgICAgIGQtPm1fY2FjaGUtPmRpZEZpbmlzaExvYWRpbmco
KTsKKyAgICAgICAgICAgICAgaWYgKGQtPmNsaWVudCgpKQorICAgICAgICAgICAgICAgICAgZC0+
Y2xpZW50KCktPmRpZEZpbmlzaExvYWRpbmcoam9iKTsKKyAgICAgICAgICAgIH0KICAgICAgICAg
fSBlbHNlIHsKICNpZm5kZWYgTkRFQlVHCiAgICAgICAgICAgICBjaGFyKiB1cmwgPSAwOwogICAg
ICAgICAgICAgY3VybF9lYXN5X2dldGluZm8oZC0+bV9oYW5kbGUsIENVUkxJTkZPX0VGRkVDVElW
RV9VUkwsICZ1cmwpOwogICAgICAgICAgICAgcHJpbnRmKCJDdXJsIEVSUk9SIGZvciB1cmw9JyVz
JywgZXJyb3I6ICclcydcbiIsIHVybCwgY3VybF9lYXN5X3N0cmVycm9yKG1zZy0+ZGF0YS5yZXN1
bHQpKTsKICNlbmRpZgorICAgICAgICAgICAgaWYgKGQtPm1fY2FjaGUpCisgICAgICAgICAgICAg
ICAgZC0+bV9jYWNoZS0+ZGlkRmFpbCgpOwogICAgICAgICAgICAgaWYgKGQtPmNsaWVudCgpKQog
ICAgICAgICAgICAgICAgIGQtPmNsaWVudCgpLT5kaWRGYWlsKGpvYiwgUmVzb3VyY2VFcnJvcigp
KTsKICAgICAgICAgfQpAQCAtNTAzLDYgKzUyMSw3IEBAIHN0YXRpYyB2b2lkIHBhcnNlRGF0YVVy
bChSZXNvdXJjZUhhbmRsZSogaGFuZGxlKQogICAgICAgICByZXNwb25zZS5zZXRFeHBlY3RlZENv
bnRlbnRMZW5ndGgoZGF0YS5sZW5ndGgoKSk7CiAgICAgcmVzcG9uc2Uuc2V0SFRUUFN0YXR1c0Nv
ZGUoMjAwKTsKIAorICAgIEFTU0VSVCghaGFuZGxlLT5nZXRJbnRlcm5hbCgpLT5tX2NhY2hlKTsK
ICAgICBjbGllbnQtPmRpZFJlY2VpdmVSZXNwb25zZShoYW5kbGUsIHJlc3BvbnNlKTsKIAogICAg
IGlmIChvdXREYXRhKQpAQCAtNTI3LDYgKzU0Niw5IEBAIHZvaWQgUmVzb3VyY2VIYW5kbGVNYW5h
Z2VyOjpkaXNwYXRjaFN5bmNocm9ub3VzSm9iKFJlc291cmNlSGFuZGxlKiBqb2IpCiAgICAgfQog
CiAgICAgUmVzb3VyY2VIYW5kbGVJbnRlcm5hbCogaGFuZGxlID0gam9iLT5nZXRJbnRlcm5hbCgp
OworICAgIC8vIElmIHRoZSBkYXRhIGluIHRoZSBjYWNoZSBpcyBmcmVzaCB0aGUgQ1VSTCBoYW5k
bGUgaXMgbm90IGNyZWF0ZWQuCisgICAgaWYgKCFoYW5kbGUtPm1faGFuZGxlKQorICAgICAgICBy
ZXR1cm47CiAKICNpZiBMSUJDVVJMX1ZFUlNJT05fTlVNID4gMHgwNzEyMDAKICAgICAvLyBJZiBk
ZWZlcnNMb2FkaW5nIGlzIHRydWUgYW5kIHdlIGNhbGwgY3VybF9lYXN5X3BlcmZvcm0KQEAgLTU0
MSw2ICs1NjMsOCBAQCB2b2lkIFJlc291cmNlSGFuZGxlTWFuYWdlcjo6ZGlzcGF0Y2hTeW5jaHJv
bm91c0pvYihSZXNvdXJjZUhhbmRsZSogam9iKQogICAgIENVUkxjb2RlIHJldCA9ICBjdXJsX2Vh
c3lfcGVyZm9ybShoYW5kbGUtPm1faGFuZGxlKTsKIAogICAgIGlmIChyZXQgIT0gMCkgeworICAg
ICAgICBpZiAoaGFuZGxlLT5tX2NhY2hlKQorICAgICAgICAgICAgaGFuZGxlLT5tX2NhY2hlLT5k
aWRGYWlsKCk7CiAgICAgICAgIFJlc291cmNlRXJyb3IgZXJyb3IoU3RyaW5nKGhhbmRsZS0+bV91
cmwpLCByZXQsIFN0cmluZyhoYW5kbGUtPm1fdXJsKSwgU3RyaW5nKGN1cmxfZWFzeV9zdHJlcnJv
cihyZXQpKSk7CiAgICAgICAgIGhhbmRsZS0+Y2xpZW50KCktPmRpZEZhaWwoam9iLCBlcnJvcik7
CiAgICAgfQpAQCAtNTU4LDYgKzU4Miw5IEBAIHZvaWQgUmVzb3VyY2VIYW5kbGVNYW5hZ2VyOjpz
dGFydEpvYihSZXNvdXJjZUhhbmRsZSogam9iKQogICAgIH0KIAogICAgIGluaXRpYWxpemVIYW5k
bGUoam9iKTsKKyAgICAvLyBJZiB0aGUgZGF0YSBpbiB0aGUgY2FjaGUgaXMgZnJlc2ggdGhlIENV
UkwgaGFuZGxlIGlzIG5vdCBjcmVhdGVkLgorICAgIGlmICgham9iLT5nZXRJbnRlcm5hbCgpLT5t
X2hhbmRsZSkKKyAgICAgICAgcmV0dXJuOwogCiAgICAgbV9ydW5uaW5nSm9icysrOwogICAgIENV
UkxNY29kZSByZXQgPSBjdXJsX211bHRpX2FkZF9oYW5kbGUobV9jdXJsTXVsdGlIYW5kbGUsIGpv
Yi0+Z2V0SW50ZXJuYWwoKS0+bV9oYW5kbGUpOwpAQCAtNTkxLDYgKzYxOCwzMCBAQCB2b2lkIFJl
c291cmNlSGFuZGxlTWFuYWdlcjo6aW5pdGlhbGl6ZUhhbmRsZShSZXNvdXJjZUhhbmRsZSogam9i
KQogICAgICAgICBkLT5tX3Jlc3BvbnNlLnNldE1pbWVUeXBlKE1JTUVUeXBlUmVnaXN0cnk6Omdl
dE1JTUVUeXBlRm9yUGF0aCh1cmwpKTsKICAgICB9CiAKKyAgICBkLT5tX2NhY2hlLnNldChGaWxl
Q2FjaGU6OmNyZWF0ZShkLT5tX3JlcXVlc3QpKTsKKworICAgIC8vIERvbid0IHNlbmQgdGhlIHJl
cXVlc3QgaWYgd2UgaGF2ZSBhIGZyZXNoIGNhY2hlIGVudHJ5CisgICAgaWYgKGQtPm1fY2FjaGUg
JiYgZC0+bV9jYWNoZS0+aGFzRnJlc2hEYXRhKCkpIHsKKyAgICAgICAgZC0+bV9jYWNoZS0+dXBk
YXRlUmVzcG9uc2VGcm9tQ2FjaGUoZC0+bV9yZXNwb25zZSk7CisgICAgICAgIFJlc291cmNlSGFu
ZGxlQ2xpZW50KiBjbGllbnQgPSBkLT5jbGllbnQoKTsKKyAgICAgICAgaWYgKGNsaWVudCkKKyAg
ICAgICAgICAgIGNsaWVudC0+ZGlkUmVjZWl2ZVJlc3BvbnNlKGpvYiwgZC0+bV9yZXNwb25zZSk7
CisgICAgICAgIGQtPm1fcmVzcG9uc2Uuc2V0UmVzcG9uc2VGaXJlZCh0cnVlKTsKKyAgICAgICAg
aWYgKGNsaWVudCkKKyAgICAgICAgICAgIGQtPm1fY2FjaGUtPnNlbmRDYWNoZWREYXRhKGpvYiwg
Y2xpZW50KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChkLT5tX3JlcXVlc3Qu
Y2FjaGVQb2xpY3koKSA9PSBSZXR1cm5DYWNoZURhdGFEb250TG9hZCkgeworICAgICAgICAvLyBU
aGUgZGF0YSBzaG91bGQgb25seSBiZSBsb2FkZWQgZnJvbSB0aGUgY2FjaGUgYnV0IHdlIGRvbid0
IGhhdmUgYW55dGhpbmcsCisgICAgICAgIC8vIHNvIHRoZSBsb2FkaW5nIHNob3VsZCBmYWlsLgor
ICAgICAgICBpZiAoZC0+Y2xpZW50KCkpIHsKKyAgICAgICAgICAgIFJlc291cmNlRXJyb3IgZXJy
b3IoU3RyaW5nKGQtPm1fdXJsKSwgMCwgU3RyaW5nKGQtPm1fdXJsKSwgU3RyaW5nKCJGaWxlIG5v
dCBhdmFpbGFibGUgZnJvbSB0aGUgY2FjaGUiKSk7CisgICAgICAgICAgICBkLT5jbGllbnQoKS0+
ZGlkRmFpbChqb2IsIGVycm9yKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQor
CiAgICAgZC0+bV9oYW5kbGUgPSBjdXJsX2Vhc3lfaW5pdCgpOwogCiAjaWYgTElCQ1VSTF9WRVJT
SU9OX05VTSA+IDB4MDcxMjAwCkBAIC02NTEsNiArNzAyLDIwIEBAIHZvaWQgUmVzb3VyY2VIYW5k
bGVNYW5hZ2VyOjppbml0aWFsaXplSGFuZGxlKFJlc291cmNlSGFuZGxlKiBqb2IpCiAgICAgICAg
IH0KICAgICB9CiAKKyAgICBpZiAoZC0+bV9jYWNoZSkgeworICAgICAgICBIVFRQSGVhZGVyTWFw
IGNhY2hlSGVhZGVycyA9IGQtPm1fY2FjaGUtPmhlYWRlcnNGb3JSZXF1ZXN0KCk7CisgICAgICAg
IEhUVFBIZWFkZXJNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IGNhY2hlSGVhZGVycy5lbmQoKTsK
KyAgICAgICAgZm9yIChIVFRQSGVhZGVyTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IGNhY2hlSGVh
ZGVycy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgICAgIFN0cmluZyBrZXkg
PSBpdC0+Zmlyc3Q7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBpdC0+c2Vjb25kOworICAg
ICAgICAgICAgU3RyaW5nIGhlYWRlclN0cmluZyhrZXkpOworICAgICAgICAgICAgaGVhZGVyU3Ry
aW5nLmFwcGVuZCgiOiAiKTsKKyAgICAgICAgICAgIGhlYWRlclN0cmluZy5hcHBlbmQodmFsdWUp
OworICAgICAgICAgICAgQ1N0cmluZyBoZWFkZXJMYXRpbjEgPSBoZWFkZXJTdHJpbmcubGF0aW4x
KCk7CisgICAgICAgICAgICBoZWFkZXJzID0gY3VybF9zbGlzdF9hcHBlbmQoaGVhZGVycywgaGVh
ZGVyTGF0aW4xLmRhdGEoKSk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBpZiAoIkdFVCIgPT0g
am9iLT5yZXF1ZXN0KCkuaHR0cE1ldGhvZCgpKQogICAgICAgICBjdXJsX2Vhc3lfc2V0b3B0KGQt
Pm1faGFuZGxlLCBDVVJMT1BUX0hUVFBHRVQsIFRSVUUpOwogICAgIGVsc2UgaWYgKCJQT1NUIiA9
PSBqb2ItPnJlcXVlc3QoKS5odHRwTWV0aG9kKCkpCkBAIC02NzMsNiArNzM4LDggQEAgdm9pZCBS
ZXNvdXJjZUhhbmRsZU1hbmFnZXI6OmNhbmNlbChSZXNvdXJjZUhhbmRsZSogam9iKQogCiAgICAg
UmVzb3VyY2VIYW5kbGVJbnRlcm5hbCogZCA9IGpvYi0+Z2V0SW50ZXJuYWwoKTsKICAgICBkLT5t
X2NhbmNlbGxlZCA9IHRydWU7CisgICAgaWYgKGQtPm1fY2FjaGUpCisgICAgICAgIGQtPm1fY2Fj
aGUtPmNhbmNlbCgpOwogICAgIGlmICghbV9kb3dubG9hZFRpbWVyLmlzQWN0aXZlKCkpCiAgICAg
ICAgIG1fZG93bmxvYWRUaW1lci5zdGFydE9uZVNob3QocG9sbFRpbWVTZWNvbmRzKTsKIH0KZGlm
ZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL1Jlc291cmNlUmVzcG9uc2Uu
aCBiL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9jdXJsL1Jlc291cmNlUmVzcG9uc2UuaAppbmRl
eCA2MTk1ZjYxLi40NGYyNDA5IDEwMDY0NAotLS0gYS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsv
Y3VybC9SZXNvdXJjZVJlc3BvbnNlLmgKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2N1
cmwvUmVzb3VyY2VSZXNwb25zZS5oCkBAIC0zNCwyMCArMzQsMjYgQEAgY2xhc3MgUmVzb3VyY2VS
ZXNwb25zZSA6IHB1YmxpYyBSZXNvdXJjZVJlc3BvbnNlQmFzZSB7CiBwdWJsaWM6CiAgICAgUmVz
b3VyY2VSZXNwb25zZSgpCiAgICAgICAgIDogbV9yZXNwb25zZUZpcmVkKGZhbHNlKQorICAgICAg
ICAsIG1fbG9hZGVkRnJvbUNhY2hlKGZhbHNlKQogICAgIHsKICAgICB9CiAKICAgICBSZXNvdXJj
ZVJlc3BvbnNlKGNvbnN0IEtVUkwmIHVybCwgY29uc3QgU3RyaW5nJiBtaW1lVHlwZSwgbG9uZyBs
b25nIGV4cGVjdGVkTGVuZ3RoLCBjb25zdCBTdHJpbmcmIHRleHRFbmNvZGluZ05hbWUsIGNvbnN0
IFN0cmluZyYgZmlsZW5hbWUpCi0gICAgICAgIDogUmVzb3VyY2VSZXNwb25zZUJhc2UodXJsLCBt
aW1lVHlwZSwgZXhwZWN0ZWRMZW5ndGgsIHRleHRFbmNvZGluZ05hbWUsIGZpbGVuYW1lKSwKLSAg
ICAgICAgICBtX3Jlc3BvbnNlRmlyZWQoZmFsc2UpCisgICAgICAgIDogUmVzb3VyY2VSZXNwb25z
ZUJhc2UodXJsLCBtaW1lVHlwZSwgZXhwZWN0ZWRMZW5ndGgsIHRleHRFbmNvZGluZ05hbWUsIGZp
bGVuYW1lKQorICAgICAgICAsIG1fcmVzcG9uc2VGaXJlZChmYWxzZSkKKyAgICAgICAgLCBtX2xv
YWRlZEZyb21DYWNoZShmYWxzZSkKICAgICB7CiAgICAgfQogCiAgICAgdm9pZCBzZXRSZXNwb25z
ZUZpcmVkKGJvb2wgZmlyZWQpIHsgbV9yZXNwb25zZUZpcmVkID0gZmlyZWQ7IH0KICAgICBib29s
IHJlc3BvbnNlRmlyZWQoKSB7IHJldHVybiBtX3Jlc3BvbnNlRmlyZWQ7IH0KIAorICAgIHZvaWQg
c2V0TG9hZGVkRnJvbUNhY2hlKGJvb2wgbG9hZGVkRnJvbUNhY2hlKSB7IG1fbG9hZGVkRnJvbUNh
Y2hlID0gbG9hZGVkRnJvbUNhY2hlOyB9CisgICAgYm9vbCBsb2FkZWRGcm9tQ2FjaGUoKSB7IHJl
dHVybiBtX2xvYWRlZEZyb21DYWNoZTsgfQorCiBwcml2YXRlOgogICAgIGJvb2wgbV9yZXNwb25z
ZUZpcmVkOworICAgIGJvb2wgbV9sb2FkZWRGcm9tQ2FjaGU7CiB9OwogCiB9IC8vIG5hbWVzcGFj
ZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvZmlsZWNhY2hl
L0ZpbGVDYWNoZS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvZmlsZWNhY2hlL0ZpbGVD
YWNoZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIxMmM4NQotLS0g
L2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9maWxlY2FjaGUvRmlsZUNh
Y2hlLmNwcApAQCAtMCwwICsxLDU2NiBAQAorLy8gLSotIG1vZGU6IGMrKzsgYy1iYXNpYy1vZmZz
ZXQ6IDQgLSotCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IENvbGxhYm9yYSBMdGQuCisgKgor
ICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0
IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAo
YXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBp
cyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0
IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkg
b2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1v
cmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRo
ZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMg
bGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICog
dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBG
aWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJGaWxlQ2FjaGUuaCIKKworI2lmIFBMQVRGT1JNKEdU
SykgJiYgIVBMQVRGT1JNKFdJTikKKyAgICAjaW5jbHVkZSA8Z2xpYi5oPgorICAgICNpZiBHTElC
X0NIRUNLX1ZFUlNJT04oMiwxNiwwKQorICAgICAgICAjZGVmaW5lIEhBVkVfV0VCQ09SRV9GSUxF
X0NBQ0hFCisgICAgI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEhBVkVfV0VCQ09SRV9GSUxFX0NB
Q0hFCisjaW5jbHVkZSAiQ1N0cmluZy5oIgorI2luY2x1ZGUgIkhUVFBQYXJzZXJzLmgiCisjaW5j
bHVkZSAiUmVzb3VyY2VIYW5kbGVJbnRlcm5hbC5oIgorI2luY2x1ZGUgPHd0Zi9Mb2NrZXIuaD4K
KworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KKyNpbmNsdWRlIDxz
eXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgor
I2VuZGlmCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworI2lmZGVmIEhBVkVfV0VCQ09SRV9GSUxF
X0NBQ0hFCisKKyNkZWZpbmUgQ0FDSEVfRk9STUFUX1ZFUlNJT04gInZlcnNpb24gMSIKKyNkZWZp
bmUgQ0FDSEVfTUVUQV9FWFRFTlNJT04gIi5tZXRhIgorI2RlZmluZSBDQUNIRV9EQVRBX0VYVEVO
U0lPTiAiLmNhY2hlIgorI2RlZmluZSBDQUNIRV9MT0NLX0VYVEVOU0lPTiAiLmxvY2siCisjZGVm
aW5lIENBQ0hFX1RFTVBfRVhURU5TSU9OICIudG1wIgorCisjZGVmaW5lIENBQ0hFX0ZJTEVfUEVS
TUlTU0lPTlMgMDYwMAorI2RlZmluZSBDQUNIRV9ESVJfUEVSTUlTU0lPTlMgMDcwMAorCit2b2lk
IEZpbGVMb2NrOjpsb2NrKCkKK3sKKyAgICBtX2xvY2tDb3VudCsrOworICAgIGlmIChtX2xvY2tD
b3VudCA+IDEpCisgICAgICAgIHJldHVybjsKKworICAgIG1fZmQgPSBvcGVuKChtX2ZpbGVuYW1l
UHJlZml4ICsgQ0FDSEVfTE9DS19FWFRFTlNJT04pLnV0ZjgoKS5kYXRhKCksIE9fQ1JFQVQgfCBP
X1dST05MWSwgQ0FDSEVfRklMRV9QRVJNSVNTSU9OUyk7CisgICAgaWYgKG1fZmQgPCAwKSB7Cisg
ICAgICAgIGdfd2FybmluZygiRmFpbGVkIHRvIGxvY2sgdGhlIGNhY2hlXG4iKTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKworICAgIGludCByZXQgPSAwOworI2lmIGRlZmluZWQoSEFWRV9GTE9D
SykKKyAgICByZXQgPSBmbG9jayhtX2ZkLCBMT0NLX0VYKTsKKyNlbGlmIGRlZmluZWQoSEFWRV9M
T0NLRikKKyAgICByZXQgPSBsb2NrZihtX2ZkLCBGX0xPQ0ssIDApOworI2Vsc2UKKyAgICBnX3dh
cm5pbmcoIk5vIGxvY2tpbmcgZnVuY3Rpb25zIGF2YWlsYWJsZSIpOworI2VuZGlmCisKKyAgICBp
ZiAocmV0IDwgMCkKKyAgICAgICAgZ193YXJuaW5nKCJGYWlsZWQgdG8gbG9jayB0aGUgY2FjaGUi
KTsKK30KKwordm9pZCBGaWxlTG9jazo6dW5sb2NrKCkKK3sKKyAgICBBU1NFUlQobV9sb2NrQ291
bnQgPiAwKTsKKworICAgIG1fbG9ja0NvdW50LS07CisgICAgaWYgKG1fbG9ja0NvdW50ID4gMCkK
KyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKG1fZmQgPCAwKQorICAgICAgICByZXR1cm47CisK
KyAgICB1bmxpbmsoKG1fZmlsZW5hbWVQcmVmaXggKyBDQUNIRV9MT0NLX0VYVEVOU0lPTikudXRm
OCgpLmRhdGEoKSk7CisgICAgY2xvc2UobV9mZCk7CisgICAgbV9mZCA9IC0xOworfQorCisKK1N0
cmluZyBGaWxlQ2FjaGU6OmdldENhY2hlUHJlZml4KEtVUkwgdXJsKQoreworICAgIHVybC5zZXRV
c2VyKCIiKTsKKyAgICB1cmwuc2V0UGFzcygiIik7CisgICAgdXJsLnNldFF1ZXJ5KFN0cmluZygp
KTsKKyAgICB1cmwucmVtb3ZlUmVmKCk7CisKKyAgICBHQ2hlY2tzdW0gKmNoZWNrc3VtID0gZ19j
aGVja3N1bV9uZXcoR19DSEVDS1NVTV9TSEExKTsKKyAgICBnX2NoZWNrc3VtX3VwZGF0ZShjaGVj
a3N1bSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBndWNoYXIqPih1cmwuc3RyaW5nKCkudXRmOCgp
LmRhdGEoKSksIC0xKTsKKyAgICBjb25zdCBnY2hhciAqZGlnZXN0ID0gZ19jaGVja3N1bV9nZXRf
c3RyaW5nKGNoZWNrc3VtKTsKKyAgICAvLyBGSVhNRSBjYWNoZS94eXpqay5mb28gLT4gfi8uY2Fj
aGUvd2Via2l0L3h5L3pqay5mb28KKyAgICBTdHJpbmcgY2FjaGVGaWxlUHJlZml4ID0gU3RyaW5n
KCJjYWNoZS8iKSArIGRpZ2VzdDsKKyAgICBnX2NoZWNrc3VtX2ZyZWUgKGNoZWNrc3VtKTsKKwor
ICAgIHJldHVybiBjYWNoZUZpbGVQcmVmaXg7Cit9CisKK0ZpbGVDYWNoZTo6RmlsZUNhY2hlKFJl
c291cmNlUmVxdWVzdCYgcmVxdWVzdCkKKyAgICA6IG1fcmVxdWVzdChyZXF1ZXN0KQorICAgICwg
bV9maWxlTG9jaygpCisgICAgLCBtX21ldGFGaWxlKFN0cmluZygpKQorICAgICwgbV9kYXRhRmls
ZShTdHJpbmcoKSkKKyAgICAsIG1fbWV0YVRlbXBvcmFyeUZpbGUoU3RyaW5nKCkpCisgICAgLCBt
X2RhdGFUZW1wb3JhcnlGaWxlKFN0cmluZygpKQorICAgICwgbV91cmwocmVxdWVzdC51cmwoKSkK
KyAgICAsIG1fb3JpZ2luYWxVcmwocmVxdWVzdC51cmwoKSkKKyAgICAsIG1fZXhwZWN0ZWRDb250
ZW50TGVuZ3RoKDApCisgICAgLCBtX2NhY2hlZEhlYWRlcnMoKQorICAgICwgbV9oYXNEYXRhKGZh
bHNlKQorICAgICwgbV9oYXNGcmVzaERhdGEoZmFsc2UpCisgICAgLCBtX3Nob3VsZFdyaXRlRGF0
YVRvQ2FjaGUoZmFsc2UpCisgICAgLCBtX2NhY2hlRmlsZVByZWZpeChnZXRDYWNoZVByZWZpeChy
ZXF1ZXN0LnVybCgpKSkKKyAgICAsIG1fZGF0YU91dEZkKC0xKQorICAgICwgbV9yZWFkQ2hhbm5l
bFdhdGNoKDApCit7CisgICAgZ19wcmludCgiWyVzXSBjcmVhdGluZyBjYWNoZSBvYmplY3QsIGZp
bGUgcHJlZml4IGlzICVzXG4iLCBtX3JlcXVlc3QudXJsKCkuc3RyaW5nKCkudXRmOCgpLmRhdGEo
KSwgbV9jYWNoZUZpbGVQcmVmaXgudXRmOCgpLmRhdGEoKSk7CisKKyAgICBtX2ZpbGVMb2NrLnNl
dEZpbGVuYW1lUHJlZml4KG1fY2FjaGVGaWxlUHJlZml4KTsKKyAgICBtX21ldGFGaWxlID0gbV9j
YWNoZUZpbGVQcmVmaXggKyBDQUNIRV9NRVRBX0VYVEVOU0lPTjsKKyAgICBtX2RhdGFGaWxlID0g
bV9jYWNoZUZpbGVQcmVmaXggKyBDQUNIRV9EQVRBX0VYVEVOU0lPTjsKKyAgICBzZXR1cFRlbXBv
cmFyeUZpbGVzKCk7CisKKyAgICBSZXNvdXJjZVJlcXVlc3RDYWNoZVBvbGljeSBwb2xpY3kgPSBt
X3JlcXVlc3QuY2FjaGVQb2xpY3koKTsKKyAgICBpZiAocG9saWN5ICE9IFJlbG9hZElnbm9yaW5n
Q2FjaGVEYXRhKQorICAgICAgICByZWFkTWV0YWRhdGEoKTsKKworICAgIGlmIChtX2hhc0RhdGEg
JiYgKHBvbGljeSA9PSBSZXR1cm5DYWNoZURhdGFEb250TG9hZCB8fCBwb2xpY3kgPT0gUmV0dXJu
Q2FjaGVEYXRhRWxzZUxvYWQpKQorICAgICAgICBtX2hhc0ZyZXNoRGF0YSA9IHRydWU7CisKKyAg
ICBnX3ByaW50KCJbJXNdIGhhcyBkYXRhOiAlc1xuIiwgbV9yZXF1ZXN0LnVybCgpLnN0cmluZygp
LnV0ZjgoKS5kYXRhKCksIG1faGFzRGF0YSA/ICJ5ZXMiIDogIm5vIik7CisgICAgZ19wcmludCgi
WyVzXSBoYXMgZnJlc2ggZGF0YTogJXNcbiIsIG1fcmVxdWVzdC51cmwoKS5zdHJpbmcoKS51dGY4
KCkuZGF0YSgpLCBtX2hhc0ZyZXNoRGF0YSA/ICJ5ZXMiIDogIm5vIik7Cit9CisKK0ZpbGVDYWNo
ZSogRmlsZUNhY2hlOjpjcmVhdGUoUmVzb3VyY2VSZXF1ZXN0JiByZXF1ZXN0KQoreworICAgIGlm
ICghcmVxdWVzdC51cmwoKS5wcm90b2NvbElzKCJodHRwIikpCisgICAgICAgIHJldHVybiAwOwor
CisgICAgaWYgKCJHRVQiICE9IHJlcXVlc3QuaHR0cE1ldGhvZCgpKQorICAgICAgICByZXR1cm4g
MDsKKworICAgIHJldHVybiBuZXcgRmlsZUNhY2hlKHJlcXVlc3QpOworfQorCit2b2lkIEZpbGVD
YWNoZTo6c2V0dXBUZW1wb3JhcnlGaWxlcygpCit7CisgICAgZW5zdXJlRGlyZWN0b3J5RXhpc3Rz
KCk7CisgICAgTG9ja2VyPEZpbGVMb2NrPiBsb2NrZXIobV9maWxlTG9jayk7CisgICAgbV9tZXRh
VGVtcG9yYXJ5RmlsZSA9IGNyZWF0ZVRlbXBvcmFyeUZpbGUobV9tZXRhRmlsZSk7CisgICAgbV9k
YXRhVGVtcG9yYXJ5RmlsZSA9IGNyZWF0ZVRlbXBvcmFyeUZpbGUobV9kYXRhRmlsZSk7CisgICAg
Z19wcmludCgiWyVzXSBjcmVhdGVkIHRlbXBvcmFyeSBmaWxlcyAlcyBhbmQgJXNcbiIsIG1fcmVx
dWVzdC51cmwoKS5zdHJpbmcoKS51dGY4KCkuZGF0YSgpLAorICAgICAgICAgICAgbV9tZXRhVGVt
cG9yYXJ5RmlsZS51dGY4KCkuZGF0YSgpLCBtX2RhdGFUZW1wb3JhcnlGaWxlLnV0ZjgoKS5kYXRh
KCkpOworfQorCit2b2lkIEZpbGVDYWNoZTo6ZW5zdXJlRGlyZWN0b3J5RXhpc3RzKCkKK3sKKyAg
ICBnY2hhciogZGlyID0gZ19wYXRoX2dldF9kaXJuYW1lKG1fY2FjaGVGaWxlUHJlZml4LnV0Zjgo
KS5kYXRhKCkpOworICAgIGdfbWtkaXJfd2l0aF9wYXJlbnRzIChkaXIsIENBQ0hFX0RJUl9QRVJN
SVNTSU9OUyk7CisgICAgZ19mcmVlKGRpcik7Cit9CisKK1N0cmluZyBGaWxlQ2FjaGU6OmNyZWF0
ZVRlbXBvcmFyeUZpbGUoU3RyaW5nIG9yaWdGaWxlTmFtZSkKK3sKKyAgICBMb2NrZXI8RmlsZUxv
Y2s+IGxvY2tlcihtX2ZpbGVMb2NrKTsKKworICAgIGZvciAoaW50IGkgPSAwOzsgaSsrKSB7Cisg
ICAgICAgIFN0cmluZyB0bXBGaWxlbmFtZSA9IG1fY2FjaGVGaWxlUHJlZml4ICsgIi0iICsgU3Ry
aW5nOjpudW1iZXIoaSkgKyBDQUNIRV9URU1QX0VYVEVOU0lPTjsKKyAgICAgICAgaWYgKGFjY2Vz
cyh0bXBGaWxlbmFtZS51dGY4KCkuZGF0YSgpLCBGX09LKSAhPSAwKSB7CisgICAgICAgICAgICBp
ZiAobGluayhvcmlnRmlsZU5hbWUudXRmOCgpLmRhdGEoKSwgdG1wRmlsZW5hbWUudXRmOCgpLmRh
dGEoKSkgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIFRoZSB0ZW1wb3JhcnkgZmlsZSBpcyBu
b3cgYSBoYXJkIGxpbmsgdG8gdGhlIG9yaWdpbmFsIG9uZS4KKyAgICAgICAgICAgICAgICByZXR1
cm4gdG1wRmlsZW5hbWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBUaGVyZSBpcyBu
byBlbnRyeSBpbiB0aGUgY2FjaGUgZm9yIG5vdywgc28gd2UgY3JlYXRlIGFuIGVtcHR5CisgICAg
ICAgICAgICAvLyB0ZW1wb3JhcnkgZmlsZSB0byBhdm9pZCBvdGhlciBwcm9jZXNzZXMgdG8gcGlj
ayB0aGUgc2FtZSB0ZW1wb3JhcnkKKyAgICAgICAgICAgIC8vIGZpbGUgbmFtZS4KKyAgICAgICAg
ICAgIGludCBmZCA9IG9wZW4odG1wRmlsZW5hbWUudXRmOCgpLmRhdGEoKSwgT19DUkVBVCB8IE9f
V1JPTkxZLCBDQUNIRV9GSUxFX1BFUk1JU1NJT05TKTsKKyAgICAgICAgICAgIGlmIChmZCA+PSAw
KSB7CisgICAgICAgICAgICAgICAgY2xvc2UgKGZkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4g
dG1wRmlsZW5hbWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ludCBG
aWxlQ2FjaGU6Om9wZW5Gb3JXcml0aW5nQnJlYWtpbmdMaW5rcyhTdHJpbmcgZmlsZW5hbWUpCit7
CisgICAgTG9ja2VyPEZpbGVMb2NrPiBsb2NrZXIobV9maWxlTG9jayk7CisKKyAgICBpbnQgZmQg
PSAtMTsKKyAgICBpZiAodW5saW5rKGZpbGVuYW1lLnV0ZjgoKS5kYXRhKCkpID09IDApCisgICAg
ICAgIGZkID0gb3BlbihmaWxlbmFtZS51dGY4KCkuZGF0YSgpLCBPX0NSRUFUIHwgT19XUk9OTFks
IENBQ0hFX0ZJTEVfUEVSTUlTU0lPTlMpOworCisgICAgcmV0dXJuIGZkOworfQorCit2b2lkIEZp
bGVDYWNoZTo6cmVhZE1ldGFkYXRhKCkKK3sKKyAgICBnX3ByaW50KCJbJXNdIGxvYWRpbmcgbWV0
YWRhdGEgZnJvbSBkaXNrXG4iLCBtX3JlcXVlc3QudXJsKCkuc3RyaW5nKCkudXRmOCgpLmRhdGEo
KSk7CisKKyAgICBpbnQgZmQgPSBvcGVuKG1fbWV0YVRlbXBvcmFyeUZpbGUudXRmOCgpLmRhdGEo
KSwgT19SRE9OTFkpOworICAgIGlmIChmZCA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBzdHJ1
Y3Qgc3RhdCBzdGF0QnVmZjsKKyAgICBpZiAoZnN0YXQgKGZkLCAmc3RhdEJ1ZmYpIDwgMCkgewor
ICAgICAgICBjbG9zZShmZCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgT3duUHRyPGNo
YXI+IGJ1ZmYobmV3IGNoYXJbc3RhdEJ1ZmYuc3Rfc2l6ZSArIDFdKTsKKyAgICBidWZmLmdldCgp
W3N0YXRCdWZmLnN0X3NpemVdID0gJ1wwJzsKKyAgICBjaGFyICpidWZmUG9zaXRpb24gPSBidWZm
LmdldCgpOworICAgIGludCBieXRlc1JlYWQ7CisgICAgd2hpbGUgKChieXRlc1JlYWQgPSByZWFk
KGZkLCBidWZmUG9zaXRpb24sIHN0YXRCdWZmLnN0X3NpemUgLSAoYnVmZlBvc2l0aW9uIC0gYnVm
Zi5nZXQoKSkpKSA+IDApIHsKKyAgICAgICAgaWYgKGJ5dGVzUmVhZCA8IDApIHsKKyAgICAgICAg
ICAgIGNsb3NlKGZkKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBi
dWZmUG9zaXRpb24gKz0gYnl0ZXNSZWFkOworICAgIH0KKyAgICBjbG9zZShmZCk7CisKKyAgICBT
dHJpbmcgZmlsZUNvbnRlbnQgPSBTdHJpbmcoYnVmZi5nZXQoKSk7CisgICAgVmVjdG9yPFN0cmlu
Zz4gbGluZXM7CisgICAgZmlsZUNvbnRlbnQuc3BsaXQoIlxuIiwgbGluZXMpOworCisgICAgVmVj
dG9yPFN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbGluZXMuYmVnaW4oKTsKKyAgICBWZWN0
b3I8U3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbGluZXMuZW5kKCk7CisKKyAgICAvLyBW
ZXJzaW9uCisgICAgaWYgKGl0ID09IGVuZCkKKyAgICAgICAgcmV0dXJuOworICAgIGlmICgqaXQg
IT0gQ0FDSEVfRk9STUFUX1ZFUlNJT04pCisgICAgICAgIHJldHVybjsKKyAgICBpdCsrOworCisg
ICAgLy8gVVJMCisgICAgaWYgKGl0ID09IGVuZCkKKyAgICAgICAgcmV0dXJuOworICAgIG1fdXJs
ID0gS1VSTCgqaXQpOworICAgIGl0Kys7CisKKyAgICAvLyBDb250ZW50IGxlbmd0aAorICAgIGlm
IChpdCA9PSBlbmQpCisgICAgICAgIHJldHVybjsKKyAgICBtX2V4cGVjdGVkQ29udGVudExlbmd0
aCA9IGl0LT50b0ludDY0U3RyaWN0KCk7CisgICAgaXQrKzsKKworICAgIC8vIEhlYWRlcnMKKyAg
ICBmb3IgKDsgaXQgIT0gZW5kOyBpdCsrKSB7CisgICAgICAgIGludCBzcGxpdFBvcyA9IGl0LT5m
aW5kKCI6Iik7CisgICAgICAgIGlmIChzcGxpdFBvcyAhPSAtMSkKKyAgICAgICAgICAgIG1fY2Fj
aGVkSGVhZGVycy5zZXQoaXQtPmxlZnQoc3BsaXRQb3MpLCBpdC0+c3Vic3RyaW5nKHNwbGl0UG9z
KzEpLnN0cmlwV2hpdGVTcGFjZSgpKTsKKyAgICB9CisKKyAgICBtX2hhc0RhdGEgPSB0cnVlOwor
ICAgIGdfcHJpbnQoIlslc10gbWV0YWRhdGEgb2tcbiIsIG1fcmVxdWVzdC51cmwoKS5zdHJpbmco
KS51dGY4KCkuZGF0YSgpKTsKK30KKwordm9pZCBGaWxlQ2FjaGU6OmludmFsaWRhdGUoYm9vbCBp
bnZhbGlkYXRlTm9uVGVtcG9yYXJ5RW50cnkpCit7CisgICAgbV9oYXNEYXRhID0gZmFsc2U7Cisg
ICAgbV9oYXNGcmVzaERhdGEgPSBmYWxzZTsKKworICAgIGdfcHJpbnQoIlslc10gaW52YWxpZGF0
aW5nIHRlbXBvcmFyeSBlbnRyeVxuIiwgbV9yZXF1ZXN0LnVybCgpLnN0cmluZygpLnV0ZjgoKS5k
YXRhKCkpOworCisgICAgdW5saW5rKG1fbWV0YVRlbXBvcmFyeUZpbGUudXRmOCgpLmRhdGEoKSk7
CisgICAgdW5saW5rKG1fZGF0YVRlbXBvcmFyeUZpbGUudXRmOCgpLmRhdGEoKSk7CisgICAgLy8g
U2V0IHRvIHRoZSBudWxsIHN0cmluZyB0byBtYWtlIGRlYnVnZ2luZyBlYXNpZXIgaWYgdGhlcmUg
aXMgYW4KKyAgICAvLyBhdHRlbXB0IHRvIHVzZSB0aGUgY2FjaGUgYWZ0ZXIgYSBjYWxsIHRvIHRo
aXMgZnVuY3Rpb24uCisgICAgbV9tZXRhVGVtcG9yYXJ5RmlsZSA9IFN0cmluZygpOworICAgIG1f
ZGF0YVRlbXBvcmFyeUZpbGUgPSBTdHJpbmcoKTsKKworICAgIGlmIChpbnZhbGlkYXRlTm9uVGVt
cG9yYXJ5RW50cnkpIHsKKyAgICAgICAgZ19wcmludCgiWyVzXSBpbnZhbGlkYXRpbmcgZW50cnlc
biIsIG1fcmVxdWVzdC51cmwoKS5zdHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKyAgICAgICAgTG9j
a2VyPEZpbGVMb2NrPiBsb2NrZXIobV9maWxlTG9jayk7CisgICAgICAgIHVubGluayhtX21ldGFG
aWxlLnV0ZjgoKS5kYXRhKCkpOworICAgICAgICB1bmxpbmsobV9kYXRhRmlsZS51dGY4KCkuZGF0
YSgpKTsKKyAgICAgICAgbV9tZXRhRmlsZSA9IFN0cmluZygpOworICAgICAgICBtX2RhdGFGaWxl
ID0gU3RyaW5nKCk7CisgICAgfQorfQorCitIVFRQSGVhZGVyTWFwIEZpbGVDYWNoZTo6aGVhZGVy
c0ZvclJlcXVlc3QoKQoreworICAgIEhUVFBIZWFkZXJNYXAgaGVhZGVyczsKKyAgICBTdHJpbmcg
ZXRhZyA9IG1fY2FjaGVkSGVhZGVycy5nZXQoIkVUYWciKTsKKyAgICBpZiAoIWV0YWcuaXNOdWxs
KCkpCisgICAgICAgIGhlYWRlcnMuc2V0KCJJZi1Ob25lLU1hdGNoIiwgZXRhZyk7CisKKyAgICBT
dHJpbmcgbGFzdE1vZGlmaWVkID0gbV9jYWNoZWRIZWFkZXJzLmdldCgiTGFzdC1Nb2RpZmllZCIp
OworICAgIGlmICghbGFzdE1vZGlmaWVkLmlzTnVsbCgpKQorICAgICAgICBoZWFkZXJzLnNldCgi
SWYtTW9kaWZpZWQtU2luY2UiLCBsYXN0TW9kaWZpZWQpOworCisgICAgcmV0dXJuIGhlYWRlcnM7
Cit9CisKK3ZvaWQgRmlsZUNhY2hlOjp3cml0ZU1ldGFkYXRhRnJvbVJlc3BvbnNlKFJlc291cmNl
UmVzcG9uc2UmIHJlc3BvbnNlKQoreworICAgIGdfcHJpbnQoIlslc10gc2F2aW5nIG1ldGFkYXRh
IHRvIGRpc2tcbiIsIG1fcmVxdWVzdC51cmwoKS5zdHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKwor
ICAgIGludCBmZCA9IG9wZW5Gb3JXcml0aW5nQnJlYWtpbmdMaW5rcyhtX21ldGFUZW1wb3JhcnlG
aWxlKTsKKyAgICBpZiAoZmQgPCAwKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBWZXJzaW9u
IGluZm8KKyAgICB3cml0ZShmZCwgQ0FDSEVfRk9STUFUX1ZFUlNJT04gIlxuIiwgc3RybGVuKENB
Q0hFX0ZPUk1BVF9WRVJTSU9OKSArIDEpOworCisgICAgLy8gVVJMCisgICAgbV91cmwgPSByZXNw
b25zZS51cmwoKTsKKyAgICBTdHJpbmcgdXJsID0gbV91cmwuc3RyaW5nKCkgKyAiXG4iOworICAg
IENTdHJpbmcgdXJsTGF0aW4xID0gdXJsLmxhdGluMSgpOworICAgIHdyaXRlKGZkLCB1cmxMYXRp
bjEuZGF0YSgpLCB1cmxMYXRpbjEubGVuZ3RoKCkpOworCisgICAgLy8gQ29udGVudCBsZW5ndGgK
KyAgICBtX2V4cGVjdGVkQ29udGVudExlbmd0aCA9IHJlc3BvbnNlLmV4cGVjdGVkQ29udGVudExl
bmd0aCgpOworICAgIFN0cmluZyBjb250ZW50TGVuZ3RoU3RyaW5nID0gU3RyaW5nOjpudW1iZXIo
bV9leHBlY3RlZENvbnRlbnRMZW5ndGgpICsgIlxuIjsKKyAgICBDU3RyaW5nIGNvbnRlbnRMZW5n
dGhTdHJpbmdMYXRpbjEgPSBjb250ZW50TGVuZ3RoU3RyaW5nLmxhdGluMSgpOworICAgIHdyaXRl
KGZkLCBjb250ZW50TGVuZ3RoU3RyaW5nTGF0aW4xLmRhdGEoKSwgY29udGVudExlbmd0aFN0cmlu
Z0xhdGluMS5sZW5ndGgoKSk7CisKKyAgICAvLyBIZWFkZXJzCisgICAgSFRUUEhlYWRlck1hcDo6
Y29uc3RfaXRlcmF0b3IgZW5kID0gcmVzcG9uc2UuaHR0cEhlYWRlckZpZWxkcygpLmVuZCgpOwor
ICAgIGZvciAoSFRUUEhlYWRlck1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSByZXNwb25zZS5odHRw
SGVhZGVyRmllbGRzKCkuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgIFN0cmlu
ZyBoZWFkZXJTdHJpbmcoaXQtPmZpcnN0KTsKKyAgICAgICAgaGVhZGVyU3RyaW5nLmFwcGVuZCgi
OiAiKTsKKyAgICAgICAgaGVhZGVyU3RyaW5nLmFwcGVuZChpdC0+c2Vjb25kKTsKKyAgICAgICAg
aGVhZGVyU3RyaW5nLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgQ1N0cmluZyBoZWFkZXJMYXRpbjEg
PSBoZWFkZXJTdHJpbmcubGF0aW4xKCk7CisgICAgICAgIHdyaXRlKGZkLCBoZWFkZXJMYXRpbjEu
ZGF0YSgpLCBoZWFkZXJMYXRpbjEubGVuZ3RoKCkpOworICAgIH0KKworICAgIGNsb3NlKGZkKTsK
K30KKwordm9pZCBGaWxlQ2FjaGU6OnVwZGF0ZVJlc3BvbnNlRnJvbUNhY2hlKFJlc291cmNlUmVz
cG9uc2UmIHJlc3BvbnNlKQoreworICAgIHJlc3BvbnNlLnNldEhUVFBTdGF0dXNDb2RlKDIwMCk7
CisgICAgcmVzcG9uc2Uuc2V0TG9hZGVkRnJvbUNhY2hlKHRydWUpOworCisgICAgLy8gSW50ZWdy
YXRlIHRoZSBoZWFkZXJzIGluIHRoZSByZXNwb25zZSB3aXRoIHRoZSBvbmVzIHJlY2VpdmVkIGZy
b20gdGhlIHNlcnZlci4KKyAgICBIVFRQSGVhZGVyTWFwOjpjb25zdF9pdGVyYXRvciBlbmQgPSBt
X2NhY2hlZEhlYWRlcnMuZW5kKCk7CisgICAgZm9yIChIVFRQSGVhZGVyTWFwOjpjb25zdF9pdGVy
YXRvciBpdCA9IG1fY2FjaGVkSGVhZGVycy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpCisgICAg
ICAgIGlmIChyZXNwb25zZS5odHRwSGVhZGVyRmllbGQoaXQtPmZpcnN0KS5pc051bGwoKSkKKyAg
ICAgICAgICAgIHJlc3BvbnNlLnNldEhUVFBIZWFkZXJGaWVsZChpdC0+Zmlyc3QsIGl0LT5zZWNv
bmQpOworCisgICAgcmVzcG9uc2Uuc2V0RXhwZWN0ZWRDb250ZW50TGVuZ3RoKG1fZXhwZWN0ZWRD
b250ZW50TGVuZ3RoKTsKKyAgICByZXNwb25zZS5zZXRNaW1lVHlwZShleHRyYWN0TUlNRVR5cGVG
cm9tTWVkaWFUeXBlKHJlc3BvbnNlLmh0dHBIZWFkZXJGaWVsZCgiQ29udGVudC1UeXBlIikpKTsK
KyAgICByZXNwb25zZS5zZXRUZXh0RW5jb2RpbmdOYW1lKGV4dHJhY3RDaGFyc2V0RnJvbU1lZGlh
VHlwZShyZXNwb25zZS5odHRwSGVhZGVyRmllbGQoIkNvbnRlbnQtVHlwZSIpKSk7CisgICAgcmVz
cG9uc2Uuc2V0U3VnZ2VzdGVkRmlsZW5hbWUoZmlsZW5hbWVGcm9tSFRUUENvbnRlbnREaXNwb3Np
dGlvbihyZXNwb25zZS5odHRwSGVhZGVyRmllbGQoIkNvbnRlbnQtRGlzcG9zaXRpb24iKSkpOwor
fQorCit2b2lkIEZpbGVDYWNoZTo6ZGlkUmVjZWl2ZVJlc3BvbnNlKFJlc291cmNlUmVzcG9uc2Um
IHJlc3BvbnNlKQoreworICAgIGlmIChyZXNwb25zZS5odHRwU3RhdHVzQ29kZSgpID09IDMwNCkg
eworICAgICAgICBnX3ByaW50KCJbJXNdIHJlY2VpdmVkIDMwNCAtPiB3aWxsIHVzZSBjYWNoZWQg
ZGF0YVxuIiwgbV9yZXF1ZXN0LnVybCgpLnN0cmluZygpLnV0ZjgoKS5kYXRhKCkpOworICAgICAg
ICB1cGRhdGVSZXNwb25zZUZyb21DYWNoZShyZXNwb25zZSk7CisgICAgICAgIHdyaXRlTWV0YWRh
dGFGcm9tUmVzcG9uc2UocmVzcG9uc2UpOworICAgICAgICBtX2hhc0ZyZXNoRGF0YSA9IHRydWU7
CisgICAgfSBlbHNlIGlmIChyZXNwb25zZS5odHRwU3RhdHVzQ29kZSgpID09IDIwMCkgeworICAg
ICAgICBnX3ByaW50KCJbJXNdIHJlY2VpdmVkIDIwMFxuIiwgbV9yZXF1ZXN0LnVybCgpLnN0cmlu
ZygpLnV0ZjgoKS5kYXRhKCkpOworICAgICAgICBTdHJpbmcgZXRhZyA9IHJlc3BvbnNlLmh0dHBI
ZWFkZXJGaWVsZCgiRVRhZyIpOworICAgICAgICBTdHJpbmcgbGFzdE1vZGlmaWVkID0gcmVzcG9u
c2UuaHR0cEhlYWRlckZpZWxkKCJMYXN0LU1vZGlmaWVkIik7CisgICAgICAgIG1fc2hvdWxkV3Jp
dGVEYXRhVG9DYWNoZSA9ICFldGFnLmlzTnVsbCgpIHx8ICFsYXN0TW9kaWZpZWQuaXNOdWxsKCk7
CisgICAgICAgIGlmIChtX3Nob3VsZFdyaXRlRGF0YVRvQ2FjaGUpCisgICAgICAgICAgICB3cml0
ZU1ldGFkYXRhRnJvbVJlc3BvbnNlKHJlc3BvbnNlKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAg
ICAgICBpbnZhbGlkYXRlKHRydWUpOworICAgICAgICAgICAgZ19wcmludCgiWyVzXSBub24gY2Fj
aGVhYmxlXG4iLCBtX3JlcXVlc3QudXJsKCkuc3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7CisgICAg
ICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBnX3ByaW50KCJbJXNdIHJlY2VpdmVkICVkIC0+
IGludmFsaWRhdGluZyB0ZW1wb3JhcnkgY2FjaGUgZW50cnlcbiIsIG1fcmVxdWVzdC51cmwoKS5z
dHJpbmcoKS51dGY4KCkuZGF0YSgpLCByZXNwb25zZS5odHRwU3RhdHVzQ29kZSgpKTsKKyAgICAg
ICAgaW52YWxpZGF0ZSgpOworICAgIH0KK30KKwordm9pZCBzYXZlVGVtcG9yYXJ5RGF0YUhlbHBl
cihGaWxlQ2FjaGUqIGNhY2hlKQoreworICAgIGNhY2hlLT5zYXZlVGVtcG9yYXJ5RGF0YSgpOwor
fQorCit2b2lkIGludmFsaWRhdGVIZWxwZXIoRmlsZUNhY2hlKiBjYWNoZSkKK3sKKyAgICBjYWNo
ZS0+aW52YWxpZGF0ZSgpOworfQorCitzdHJ1Y3QgRmlsZVJlYWRhYmxlRGF0YSB7CisgICAgRmls
ZVJlYWRhYmxlRGF0YShSZXNvdXJjZUhhbmRsZSogaCwgRmlsZUNhY2hlKiBjKQorICAgICAgICA6
IGhhbmRsZShoKQorICAgICAgICAsIGNhY2hlKGMpIHt9CisKKyAgICBSZXNvdXJjZUhhbmRsZSog
aGFuZGxlOworICAgIEZpbGVDYWNoZSogY2FjaGU7Cit9OworCitzdGF0aWMgZ2Jvb2xlYW4KK2Rh
dGFfZmlsZV9yZWFkYWJsZV9jYihHSU9DaGFubmVsKiBzb3VyY2UsIEdJT0NvbmRpdGlvbiBjb25k
aXRpb24sIGdwb2ludGVyIHVzZXJEYXRhKQoreworICAgIGlmIChjb25kaXRpb24gJiBHX0lPX0lO
KSB7CisgICAgICAgIGdjaGFyIGJ1ZmZbNDA5Nl07CisgICAgICAgIGdzaXplIGJ5dGVzUmVhZDsK
KyAgICAgICAgR0lPU3RhdHVzIHN0YXR1cyA9IGdfaW9fY2hhbm5lbF9yZWFkX2NoYXJzIChzb3Vy
Y2UsIGJ1ZmYsIEdfTl9FTEVNRU5UUyhidWZmKSwgJmJ5dGVzUmVhZCwgTlVMTCk7CisgICAgICAg
IEZpbGVSZWFkYWJsZURhdGEqIGRhdGEgPSByZWludGVycHJldF9jYXN0PEZpbGVSZWFkYWJsZURh
dGEqPih1c2VyRGF0YSk7CisgICAgICAgIFJlc291cmNlSGFuZGxlKiBoYW5kbGUgPSBkYXRhLT5o
YW5kbGU7CisgICAgICAgIEZpbGVDYWNoZSogY2FjaGUgPSBkYXRhLT5jYWNoZTsKKyAgICAgICAg
UmVzb3VyY2VIYW5kbGVDbGllbnQqIGNsaWVudCA9IGhhbmRsZS0+Z2V0SW50ZXJuYWwoKS0+Y2xp
ZW50KCk7CisgICAgICAgIHN3aXRjaCAoc3RhdHVzKSB7CisgICAgICAgICAgICBjYXNlIEdfSU9f
U1RBVFVTX05PUk1BTDoKKyAgICAgICAgICAgICAgICBjbGllbnQtPmRpZFJlY2VpdmVEYXRhKGhh
bmRsZSwgYnVmZiwgYnl0ZXNSZWFkLCAwKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsK
KyAgICAgICAgICAgIGNhc2UgR19JT19TVEFUVVNfRU9GOgorICAgICAgICAgICAgICAgIGNsaWVu
dC0+ZGlkRmluaXNoTG9hZGluZyhoYW5kbGUpOworICAgICAgICAgICAgICAgIHNhdmVUZW1wb3Jh
cnlEYXRhSGVscGVyKGNhY2hlKTsKKyAgICAgICAgICAgICAgICBkZWxldGUgZGF0YTsKKyAgICAg
ICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAg
ICAgICAgIFN0cmluZyB1cmwgPSBoYW5kbGUtPnJlcXVlc3QoKS51cmwoKS5zdHJpbmcoKTsKKyAg
ICAgICAgICAgICAgICBSZXNvdXJjZUVycm9yIGVycm9yKHVybCwgMCwgdXJsLCAiSW1wb3NzaWJs
ZSB0byByZWFkIGZyb20gdGhlIGNhY2hlIik7CisgICAgICAgICAgICAgICAgY2xpZW50LT5kaWRG
YWlsKGhhbmRsZSwgZXJyb3IpOworICAgICAgICAgICAgICAgIGludmFsaWRhdGVIZWxwZXIoY2Fj
aGUpOworICAgICAgICAgICAgICAgIGRlbGV0ZSBkYXRhOworICAgICAgICAgICAgICAgIHJldHVy
biBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCit2b2lk
IEZpbGVDYWNoZTo6c2VuZENhY2hlZERhdGEoUmVzb3VyY2VIYW5kbGUqIGhhbmRsZSwgUmVzb3Vy
Y2VIYW5kbGVDbGllbnQqIGNsaWVudCkKK3sKKyAgICBBU1NFUlQoY2xpZW50KTsKKyAgICBBU1NF
UlQoaGFuZGxlLT5nZXRJbnRlcm5hbCgpLT5jbGllbnQoKSA9PSBjbGllbnQpOworCisgICAgZ19w
cmludCgiWyVzXSBzZW5kaW5nIGNhY2hlZCBkYXRhIHRvIGFwcGxpY2F0aW9uXG4iLCBtX3JlcXVl
c3QudXJsKCkuc3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7CisKKyAgICBHSU9DaGFubmVsKiBjaGFu
bmVsID0gZ19pb19jaGFubmVsX25ld19maWxlIChtX2RhdGFUZW1wb3JhcnlGaWxlLnV0ZjgoKS5k
YXRhKCksICJyIiwgMCk7CisgICAgaWYgKCFjaGFubmVsKSB7CisgICAgICAgIFN0cmluZyB1cmwg
PSBoYW5kbGUtPnJlcXVlc3QoKS51cmwoKS5zdHJpbmcoKTsKKyAgICAgICAgUmVzb3VyY2VFcnJv
ciBlcnJvcih1cmwsIDAsIHVybCwgIkltcG9zc2libGUgdG8gcmVhZCBmcm9tIHRoZSBjYWNoZSIp
OworICAgICAgICBoYW5kbGUtPmdldEludGVybmFsKCktPmNsaWVudCgpLT5kaWRGYWlsKGhhbmRs
ZSwgZXJyb3IpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGdfaW9fY2hhbm5lbF9zZXRf
ZW5jb2RpbmcgKGNoYW5uZWwsIE5VTEwsIE5VTEwpOworICAgIEZpbGVSZWFkYWJsZURhdGEgKmRh
dGEgPSBuZXcgRmlsZVJlYWRhYmxlRGF0YShoYW5kbGUsIHRoaXMpOworICAgIG1fcmVhZENoYW5u
ZWxXYXRjaCA9IGdfaW9fYWRkX3dhdGNoIChjaGFubmVsLCAoR0lPQ29uZGl0aW9uKShHX0lPX0lO
IHwgR19JT19IVVApLCBkYXRhX2ZpbGVfcmVhZGFibGVfY2IsIGRhdGEpOworfQorCit2b2lkIEZp
bGVDYWNoZTo6Y2FuY2VsKCkKK3sKKyAgICBpZiAobV9yZWFkQ2hhbm5lbFdhdGNoID4gMCkgewor
ICAgICAgICBnX3NvdXJjZV9yZW1vdmUobV9yZWFkQ2hhbm5lbFdhdGNoKTsKKyAgICAgICAgbV9y
ZWFkQ2hhbm5lbFdhdGNoID0gMDsKKyAgICB9CisgICAgaW52YWxpZGF0ZSgpOworfQorCit2b2lk
IEZpbGVDYWNoZTo6ZGlkUmVjZWl2ZURhdGEoUmVzb3VyY2VIYW5kbGUqIGhhbmRsZSwgY29uc3Qg
Y2hhciogZGF0YSwgaW50IHNpemUsIGludCBsZW5ndGhSZWNlaXZlZCkKK3sKKyAgICBpZiAoIW1f
c2hvdWxkV3JpdGVEYXRhVG9DYWNoZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKG1fZGF0
YU91dEZkIDwgMCkgeworICAgICAgICBtX2RhdGFPdXRGZCA9IG9wZW5Gb3JXcml0aW5nQnJlYWtp
bmdMaW5rcyhtX2RhdGFUZW1wb3JhcnlGaWxlLnV0ZjgoKS5kYXRhKCkpOworICAgICAgICBpZiAo
bV9kYXRhT3V0RmQgPCAwKSB7CisgICAgICAgICAgICBtX3Nob3VsZFdyaXRlRGF0YVRvQ2FjaGUg
PSBmYWxzZTsKKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIHJldHVybjsK
KyAgICAgICAgfQorICAgIH0KKworICAgIHdyaXRlKG1fZGF0YU91dEZkLCBkYXRhLCBzaXplKTsK
K30KKwordm9pZCBGaWxlQ2FjaGU6OnNhdmVUZW1wb3JhcnlEYXRhKCkKK3sKKyAgICBMb2NrZXI8
RmlsZUxvY2s+IGxvY2tlcihtX2ZpbGVMb2NrKTsKKworICAgIC8vIElmIHRoZSBkZXN0aW5hdGlv
biBwYXRoIGV4aXN0cyBhbmQgaXQgcG9pbnRzIHRvIHRoZSBzYW1lIGZpbGUgYXMgdGhlIHNvdXJj
ZSB0aGVuCisgICAgLy8gcmVuYW1lIGRvZXMgbm90aGluZyBhbmQgcmV0dXJucyAwLCBzbyB3ZSBy
ZW1vdmUgdGhlIGRlc3RpbmF0aW9uIGZpbGVzLgorICAgIHVubGluayhtX2RhdGFGaWxlLnV0Zjgo
KS5kYXRhKCkpOworICAgIHVubGluayhtX21ldGFGaWxlLnV0ZjgoKS5kYXRhKCkpOworCisgICAg
aW50IHJldERhdGEgPSByZW5hbWUobV9kYXRhVGVtcG9yYXJ5RmlsZS51dGY4KCkuZGF0YSgpLCBt
X2RhdGFGaWxlLnV0ZjgoKS5kYXRhKCkpOworICAgIGludCByZXRNZXRhID0gcmVuYW1lKG1fbWV0
YVRlbXBvcmFyeUZpbGUudXRmOCgpLmRhdGEoKSwgbV9tZXRhRmlsZS51dGY4KCkuZGF0YSgpKTsK
KyAgICBpZiAocmV0TWV0YSA8IDAgfHwgcmV0RGF0YSA8IDApIHsKKyAgICAgICAgaW52YWxpZGF0
ZSh0cnVlKTsKKyAgICAgICAgbV9oYXNEYXRhID0gZmFsc2U7CisgICAgICAgIG1faGFzRnJlc2hE
YXRhID0gZmFsc2U7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgZ19wcmludCgiWyVzXSBjYWNo
ZWQgZGF0YSB3cml0dGVuIG9uIGRpc2tcbiIsIG1fcmVxdWVzdC51cmwoKS5zdHJpbmcoKS51dGY4
KCkuZGF0YSgpKTsKK30KKwordm9pZCBGaWxlQ2FjaGU6OmRpZEZpbmlzaExvYWRpbmcoKQorewor
ICAgIGlmICghbV9zaG91bGRXcml0ZURhdGFUb0NhY2hlKQorICAgICAgICByZXR1cm47CisKKyAg
ICBBU1NFUlQgKG1fZGF0YU91dEZkID49IDApOworICAgIGNsb3NlKG1fZGF0YU91dEZkKTsKKwor
ICAgIGlmIChtX3VybCAhPSBtX29yaWdpbmFsVXJsKSB7CisgICAgICAgIFN0cmluZyByZWRpcmVj
dFByZWZpeCA9IGdldENhY2hlUHJlZml4KG1fdXJsKTsKKyAgICAgICAgaWYgKHJlZGlyZWN0UHJl
Zml4ICE9IG1fY2FjaGVGaWxlUHJlZml4KSB7CisgICAgICAgICAgICBGaWxlTG9jayByZWRpcmVj
dExvY2s7CisgICAgICAgICAgICByZWRpcmVjdExvY2suc2V0RmlsZW5hbWVQcmVmaXgocmVkaXJl
Y3RQcmVmaXgpOworICAgICAgICAgICAgTG9ja2VyPEZpbGVMb2NrPiBsb2NrZXIocmVkaXJlY3RM
b2NrKTsKKworICAgICAgICAgICAgLy8gRGVsZXRlIHRoZSBvbGQgZmlsZXMgKGlmIHRoZXkgZXhp
c3QpIGFzIGxpbmsgZG9lc24ndAorICAgICAgICAgICAgLy8gb3ZlcndyaXRlIHRoZW0uCisgICAg
ICAgICAgICBTdHJpbmcgcmVkaXJlY3REYXRhRmlsZSA9IHJlZGlyZWN0UHJlZml4ICsgQ0FDSEVf
REFUQV9FWFRFTlNJT047CisgICAgICAgICAgICB1bmxpbmsocmVkaXJlY3REYXRhRmlsZS51dGY4
KCkuZGF0YSgpKTsKKyAgICAgICAgICAgIFN0cmluZyByZWRpcmVjdE1ldGFGaWxlID0gcmVkaXJl
Y3RQcmVmaXggKyBDQUNIRV9NRVRBX0VYVEVOU0lPTjsKKyAgICAgICAgICAgIHVubGluayhyZWRp
cmVjdE1ldGFGaWxlLnV0ZjgoKS5kYXRhKCkpOworCisgICAgICAgICAgICBpbnQgcmV0RGF0YSA9
IGxpbmsobV9kYXRhVGVtcG9yYXJ5RmlsZS51dGY4KCkuZGF0YSgpLCByZWRpcmVjdERhdGFGaWxl
LnV0ZjgoKS5kYXRhKCkpOworICAgICAgICAgICAgaW50IHJldE1ldGEgPSBsaW5rKG1fbWV0YVRl
bXBvcmFyeUZpbGUudXRmOCgpLmRhdGEoKSwgcmVkaXJlY3RNZXRhRmlsZS51dGY4KCkuZGF0YSgp
KTsKKyAgICAgICAgICAgIGlmIChyZXREYXRhIDwgMCB8fCByZXRNZXRhIDwgMCkgeworICAgICAg
ICAgICAgICAgIHVubGluayhyZWRpcmVjdERhdGFGaWxlLnV0ZjgoKS5kYXRhKCkpOworICAgICAg
ICAgICAgICAgIHVubGluayhyZWRpcmVjdE1ldGFGaWxlLnV0ZjgoKS5kYXRhKCkpOworICAgICAg
ICAgICAgfQorCisgICAgICAgICAgICBnX3ByaW50KCJbJXNdIHJlZGlyZWN0IHdyaXR0ZW4gb24g
ZGlzaywgcHJlZml4IGlzOiAlc1xuIiwgbV9yZXF1ZXN0LnVybCgpLnN0cmluZygpLnV0ZjgoKS5k
YXRhKCksIHJlZGlyZWN0UHJlZml4LnV0ZjgoKS5kYXRhKCkpOworICAgICAgICB9CisgICAgfQor
CisgICAgc2F2ZVRlbXBvcmFyeURhdGEoKTsKKworICAgIG1faGFzRGF0YSA9IHRydWU7CisgICAg
bV9oYXNGcmVzaERhdGEgPSB0cnVlOworfQorCit2b2lkIEZpbGVDYWNoZTo6ZGlkRmFpbCgpCit7
CisgICAgaWYgKCFtX3Nob3VsZFdyaXRlRGF0YVRvQ2FjaGUpCisgICAgICAgIHJldHVybjsKKwor
ICAgIEFTU0VSVChtX2RhdGFPdXRGZCA+PSAwKTsKKyAgICBjbG9zZShtX2RhdGFPdXRGZCk7CisK
KyAgICBpbnZhbGlkYXRlKCk7CisgICAgZ19wcmludCgiWyVzXSBjYWNoZWQgZGF0YSBub3Qgd3Jp
dHRlbiBvbiBkaXNrXG4iLCBtX3JlcXVlc3QudXJsKCkuc3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7
Cit9CisKKyNlbHNlIC8vICNpZmRlZiBIQVZFX1dFQkNPUkVfRklMRV9DQUNIRQorCisjZXJyb3Ig
IkNvbXBpbGluZyB3aXRob3V0IHRoZSBmaWxlIGNhY2hlIGlzIG5vdCBzdXBwb3J0ZWQgeWV0Igor
CisjZW5kaWYgLy8gI2lmZGVmIEhBVkVfV0VCQ09SRV9GSUxFX0NBQ0hFCisKK30gLy8gbmFtZXNw
YWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9maWxlY2Fj
aGUvRmlsZUNhY2hlLmggYi9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvZmlsZWNhY2hlL0ZpbGVD
YWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YzczMmQKLS0tIC9k
ZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvZmlsZWNhY2hlL0ZpbGVDYWNo
ZS5oCkBAIC0wLDAgKzEsMTE0IEBACisvLyAtKi0gbW9kZTogYysrOyBjLWJhc2ljLW9mZnNldDog
NCAtKi0KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggQ29sbGFib3JhIEx0ZC4KKyAqCisgKiBU
aGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5k
L29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5l
cmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUg
Rm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5
b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRp
c3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lU
SE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgor
ICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAg
U2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBk
ZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdO
VSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJy
YXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUg
RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRo
IEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBG
aWxlQ2FjaGVfaAorI2RlZmluZSBGaWxlQ2FjaGVfaAorCisjaW5jbHVkZSAiSFRUUEhlYWRlck1h
cC5oIgorI2luY2x1ZGUgIktVUkwuaCIKKyNpbmNsdWRlICJOb25jb3B5YWJsZS5oIgorI2luY2x1
ZGUgIlJlc291cmNlSGFuZGxlLmgiCisjaW5jbHVkZSAiUmVzb3VyY2VIYW5kbGVDbGllbnQuaCIK
KyNpbmNsdWRlICJSZXNvdXJjZVJlcXVlc3QuaCIKKyNpbmNsdWRlICJSZXNvdXJjZVJlc3BvbnNl
LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgRmlsZUxvY2sgeworICAgIHB1Ymxp
YzoKKyAgICAgICAgRmlsZUxvY2soKQorICAgICAgICAgIDogbV9sb2NrQ291bnQoMCkKKyAgICAg
ICAgICAsIG1fZmlsZW5hbWVQcmVmaXgoKQorICAgICAgICAgICwgbV9mZCgtMSkKKyAgICAgICAg
eworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzZXRGaWxlbmFtZVByZWZpeChTdHJpbmcgZmls
ZW5hbWVQcmVmaXgpIHsgbV9maWxlbmFtZVByZWZpeCA9IGZpbGVuYW1lUHJlZml4OyB9CisKKyAg
ICAgICAgdm9pZCBsb2NrKCk7CisgICAgICAgIHZvaWQgdW5sb2NrKCk7CisKKyAgICBwcml2YXRl
OgorICAgICAgICBpbnQgbV9sb2NrQ291bnQ7CisgICAgICAgIFN0cmluZyBtX2ZpbGVuYW1lUHJl
Zml4OworICAgICAgICBpbnQgbV9mZDsKK307CisKKworLyogVGhpcyBjbGFzcyBpcyBpbnRlbmRl
ZCBmb3IgdGhvc2UgYmFja2VuZHMsIGxpa2UgY3VybCBhbmQgc291cCwgdGhhdCBkbyBub3QKKyAq
IG5hdGl2ZWx5IHN1cHBvcnQgZmlsZSBjYWNoaW5nLiAqLworY2xhc3MgRmlsZUNhY2hlIDogTm9u
Y29weWFibGUgeworcHVibGljOgorICAgIHN0YXRpYyBGaWxlQ2FjaGUqIGNyZWF0ZShSZXNvdXJj
ZVJlcXVlc3QmIHJlcXVlc3QpOworCisgICAgYm9vbCBoYXNEYXRhKCkgeyByZXR1cm4gbV9oYXNE
YXRhOyB9CisgICAgYm9vbCBoYXNGcmVzaERhdGEoKSB7IHJldHVybiBtX2hhc0ZyZXNoRGF0YTsg
fQorCisgICAgSFRUUEhlYWRlck1hcCBoZWFkZXJzRm9yUmVxdWVzdCgpOworCisgICAgdm9pZCB1
cGRhdGVSZXNwb25zZUZyb21DYWNoZShSZXNvdXJjZVJlc3BvbnNlJiApOworCisgICAgdm9pZCBz
ZW5kQ2FjaGVkRGF0YShSZXNvdXJjZUhhbmRsZSosIFJlc291cmNlSGFuZGxlQ2xpZW50Kik7Cisg
ICAgdm9pZCBjYW5jZWwoKTsKKworICAgIHZvaWQgZGlkUmVjZWl2ZVJlc3BvbnNlKFJlc291cmNl
UmVzcG9uc2UmICk7CisgICAgdm9pZCBkaWRSZWNlaXZlRGF0YShSZXNvdXJjZUhhbmRsZSosIGNv
bnN0IGNoYXIqLCBpbnQsIGludCBsZW5ndGhSZWNlaXZlZCk7CisgICAgdm9pZCBkaWRGaW5pc2hM
b2FkaW5nKCk7CisgICAgdm9pZCBkaWRGYWlsKCk7CisKK3ByaXZhdGU6CisgICAgRmlsZUNhY2hl
KFJlc291cmNlUmVxdWVzdCYpOworCisgICAgdm9pZCBzZXR1cFRlbXBvcmFyeUZpbGVzKCk7Cisg
ICAgdm9pZCBlbnN1cmVEaXJlY3RvcnlFeGlzdHMoKTsKKyAgICBTdHJpbmcgY3JlYXRlVGVtcG9y
YXJ5RmlsZShTdHJpbmcgb3JpZ0ZpbGVOYW1lKTsKKyAgICBpbnQgb3BlbkZvcldyaXRpbmdCcmVh
a2luZ0xpbmtzKFN0cmluZyBmaWxlbmFtZSk7CisgICAgdm9pZCByZWFkTWV0YWRhdGEoKTsKKyAg
ICB2b2lkIHdyaXRlTWV0YWRhdGFGcm9tUmVzcG9uc2UoUmVzb3VyY2VSZXNwb25zZSYgcmVzcG9u
c2UpOworCisgICAgc3RhdGljIFN0cmluZyBnZXRDYWNoZVByZWZpeChLVVJMIHVybCk7CisKKyAg
ICBmcmllbmQgdm9pZCBzYXZlVGVtcG9yYXJ5RGF0YUhlbHBlcihGaWxlQ2FjaGUqKTs7CisgICAg
dm9pZCBzYXZlVGVtcG9yYXJ5RGF0YSgpOworCisgICAgZnJpZW5kIHZvaWQgaW52YWxpZGF0ZUhl
bHBlcihGaWxlQ2FjaGUqKTs7CisgICAgdm9pZCBpbnZhbGlkYXRlKGJvb2wgaW52YWxpZGF0ZU5v
blRlbXBvcmFyeUVudHJ5PWZhbHNlKTsKKworICAgIFJlc291cmNlUmVxdWVzdCYgbV9yZXF1ZXN0
OworICAgIEZpbGVMb2NrIG1fZmlsZUxvY2s7CisgICAgU3RyaW5nIG1fbWV0YUZpbGU7CisgICAg
U3RyaW5nIG1fZGF0YUZpbGU7CisgICAgU3RyaW5nIG1fbWV0YVRlbXBvcmFyeUZpbGU7CisgICAg
U3RyaW5nIG1fZGF0YVRlbXBvcmFyeUZpbGU7CisgICAgS1VSTCBtX3VybDsKKyAgICBLVVJMIG1f
b3JpZ2luYWxVcmw7CisgICAgbG9uZyBsb25nIGludCBtX2V4cGVjdGVkQ29udGVudExlbmd0aDsK
KyAgICBIVFRQSGVhZGVyTWFwIG1fY2FjaGVkSGVhZGVyczsKKyAgICBib29sIG1faGFzRGF0YTsK
KyAgICBib29sIG1faGFzRnJlc2hEYXRhOworICAgIGJvb2wgbV9zaG91bGRXcml0ZURhdGFUb0Nh
Y2hlOworICAgIFN0cmluZyBtX2NhY2hlRmlsZVByZWZpeDsKKyAgICBpbnQgbV9kYXRhT3V0RmQ7
CisgICAgdW5zaWduZWQgaW50IG1fcmVhZENoYW5uZWxXYXRjaDsKK307CisKK30gLy8gbmFtZXNw
YWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIEZpbGVDYWNoZV9oCmRpZmYgLS1naXQgYS9jb25maWd1
cmUuYWMgYi9jb25maWd1cmUuYWMKaW5kZXggNGMwMzMyNC4uZGRiZDk4ZiAxMDA2NDQKLS0tIGEv
Y29uZmlndXJlLmFjCisrKyBiL2NvbmZpZ3VyZS5hYwpAQCAtMTQ0LDYgKzE0NCw5IEBAIEFDX0Nf
Vk9MQVRJTEUKIEFDX0hFQURFUl9TVERDCiBBQ19IRUFERVJfU1REQk9PTAogCisjIENoZWNrIGZv
ciBmaWxlIGxvY2tpbmcgZnVuY3Rpb25zCitBQ19DSEVDS19GVU5DUyhbZmxvY2sgbG9ja2ZdKQor
CiAjIHB0aHJlYWQgKG5vdCBuZWVkZWQgb24gV2luZG93cykKIGlmIHRlc3QgIiRvc193aW4zMiIg
PSAibm8iOyB0aGVuCiBBQ19DSEVDS19IRUFERVJTKFtwdGhyZWFkLmhdLAo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>26786</attachid>
            <date>2009-01-15 23:33:10 -0800</date>
            <delta_ts>2009-01-15 23:33:10 -0800</delta_ts>
            <desc>Updated patch v0.1</desc>
            <filename>diskcache.patch</filename>
            <type>text/plain</type>
            <size>29259</size>
            <attacher name="Alexander Butenko">a.butenka</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvR05VbWFrZWZpbGUuYW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9HTlVt
YWtlZmlsZS5hbQkocmV2aXNpb24gMzk4NzgpCisrKyBXZWJDb3JlL0dOVW1ha2VmaWxlLmFtCSh3
b3JraW5nIGNvcHkpCkBAIC0zOCw2ICszOCw3IEBACiAJLUkkKHNyY2RpcikvV2ViQ29yZS9wbGF0
Zm9ybS9pbWFnZS1kZWNvZGVycy9wbmcgXAogCS1JJChzcmNkaXIpL1dlYkNvcmUvcGxhdGZvcm0v
aW1hZ2UtZGVjb2RlcnMveGJtIFwKIAktSSQoc3JjZGlyKS9XZWJDb3JlL3BsYXRmb3JtL25ldHdv
cmsgXAorCS1JJChzcmNkaXIpL1dlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9maWxlY2FjaGUgXAog
CS1JJChzcmNkaXIpL1dlYkNvcmUvcGxhdGZvcm0vdGV4dCBcCiAJLUkkKHNyY2RpcikvV2ViQ29y
ZS9wbHVnaW5zIFwKIAktSSQoc3JjZGlyKS9XZWJDb3JlL3JlbmRlcmluZyBcCkBAIC0xMzgyLDYg
KzEzODMsOCBAQAogCVdlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9SZXNvdXJjZVJlcXVlc3RCYXNl
LmggXAogCVdlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9SZXNvdXJjZVJlc3BvbnNlQmFzZS5jcHAg
XAogCVdlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9SZXNvdXJjZVJlc3BvbnNlQmFzZS5oIFwKKwlX
ZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvZmlsZWNhY2hlL0ZpbGVDYWNoZS5jcHAgXAorCVdlYkNv
cmUvcGxhdGZvcm0vbmV0d29yay9maWxlY2FjaGUvRmlsZUNhY2hlLmggXAogCVdlYkNvcmUvcGxh
dGZvcm0vdGV4dC9BdG9taWNTdHJpbmcuY3BwIFwKIAlXZWJDb3JlL3BsYXRmb3JtL3RleHQvQXRv
bWljU3RyaW5nLmggXAogCVdlYkNvcmUvcGxhdGZvcm0vdGV4dC9BdG9taWNTdHJpbmdIYXNoLmgg
XApJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL1Jlc291cmNlSGFuZGxlSW50ZXJuYWwu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvUmVzb3VyY2VIYW5kbGVJ
bnRlcm5hbC5oCShyZXZpc2lvbiAzOTg3OCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9S
ZXNvdXJjZUhhbmRsZUludGVybmFsLmgJKHdvcmtpbmcgY29weSkKQEAgLTQ5LDYgKzQ5LDExIEBA
CiAjaW5jbHVkZSA8bGlic291cC9zb3VwLmg+CiAjZW5kaWYKIAorI2lmIFVTRShDVVJMKSB8fCBV
U0UgKFNPVVApCisjaW5jbHVkZSAiRmlsZUNhY2hlLmgiCisjaW5jbHVkZSAiT3duUHRyLmgiCisj
ZW5kaWYKKwogI2lmIFBMQVRGT1JNKFFUKQogY2xhc3MgUVdlYkZyYW1lOwogY2xhc3MgUVdlYk5l
dHdvcmtKb2I7CkBAIC0xMTgsNiArMTIzLDkgQEAKICAgICAgICAgICAgICwgbV90b3RhbCgwKQog
ICAgICAgICAgICAgLCBtX2lkbGVIYW5kbGVyKDApCiAjZW5kaWYKKyNpZiBVU0UoQ1VSTCkgfHwg
VVNFKFNPVVApCisgICAgICAgICAgICAsIG1fY2FjaGUoMCkKKyNlbmRpZgogI2lmIFBMQVRGT1JN
KFFUKQogICAgICAgICAgICAgLCBtX2pvYigwKQogICAgICAgICAgICAgLCBtX2ZyYW1lKDApCkBA
IC0xODgsNiArMTk2LDkgQEAKICAgICAgICAgZ3NpemUgbV9idWZzaXplLCBtX3RvdGFsOwogICAg
ICAgICBndWludCBtX2lkbGVIYW5kbGVyOwogI2VuZGlmCisjaWYgVVNFKENVUkwpIHx8IFVTRShT
T1VQKQorICAgICAgICBPd25QdHI8V2ViQ29yZTo6RmlsZUNhY2hlPiBtX2NhY2hlOworI2VuZGlm
CiAjaWYgUExBVEZPUk0oUVQpCiAjaWYgUVRfVkVSU0lPTiA8IDB4MDQwNDAwCiAgICAgICAgIFFX
ZWJOZXR3b3JrSm9iKiBtX2pvYjsKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9zb3Vw
L1Jlc291cmNlSGFuZGxlU291cC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9u
ZXR3b3JrL3NvdXAvUmVzb3VyY2VIYW5kbGVTb3VwLmNwcAkocmV2aXNpb24gMzk4ODQpCisrKyBX
ZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvc291cC9SZXNvdXJjZUhhbmRsZVNvdXAuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSAiUmVzb3VyY2VIYW5kbGVJbnRl
cm5hbC5oIgogI2luY2x1ZGUgIlJlc291cmNlUmVzcG9uc2UuaCIKICNpbmNsdWRlICJUZXh0RW5j
b2RpbmcuaCIKKyNpbmNsdWRlICJGaWxlQ2FjaGUuaCIKIAogI2luY2x1ZGUgPGdpby9naW8uaD4K
ICNpbmNsdWRlIDxsaWJzb3VwL3NvdXAuaD4KQEAgLTEyNyw5ICsxMjgsOCBAQAogCiBzdGF0aWMg
dm9pZCBnb3RIZWFkZXJzQ2FsbGJhY2soU291cE1lc3NhZ2UqIG1zZywgZ3BvaW50ZXIgZGF0YSkK
IHsKLSAgICBpZiAoIVNPVVBfU1RBVFVTX0lTX1NVQ0NFU1NGVUwobXNnLT5zdGF0dXNfY29kZSkp
CisgICAgaWYgKCFTT1VQX1NUQVRVU19JU19TVUNDRVNTRlVMKG1zZy0+c3RhdHVzX2NvZGUpICYm
IG1zZy0+c3RhdHVzX2NvZGUhPVNPVVBfU1RBVFVTX05PVF9NT0RJRklFRCkKICAgICAgICAgcmV0
dXJuOwotCiAgICAgUmVzb3VyY2VIYW5kbGUqIGhhbmRsZSA9IHN0YXRpY19jYXN0PFJlc291cmNl
SGFuZGxlKj4oZGF0YSk7CiAgICAgaWYgKCFoYW5kbGUpCiAgICAgICAgIHJldHVybjsKQEAgLTE0
MSw3ICsxNDEsMTMgQEAKICAgICAgICAgcmV0dXJuOwogCiAgICAgZmlsbFJlc3BvbnNlRnJvbU1l
c3NhZ2UobXNnLCAmZC0+bV9yZXNwb25zZSk7Ci0gICAgY2xpZW50LT5kaWRSZWNlaXZlUmVzcG9u
c2UoaGFuZGxlLCBkLT5tX3Jlc3BvbnNlKTsKKworICAgIGlmIChkLT5tX2NhY2hlKQorICAgICAg
ICBkLT5tX2NhY2hlLT5kaWRSZWNlaXZlUmVzcG9uc2UoZC0+bV9yZXNwb25zZSk7CisgICAgaWYg
KGNsaWVudCkgCisgICAgICAgIGNsaWVudC0+ZGlkUmVjZWl2ZVJlc3BvbnNlKGhhbmRsZSwgZC0+
bV9yZXNwb25zZSk7CisgICAgaWYgKGQtPm1fY2FjaGUgJiYgZC0+bV9jYWNoZS0+aGFzRnJlc2hE
YXRhKCkgJiYgZC0+Y2xpZW50KCkpCisgICAgCWQtPm1fY2FjaGUtPnNlbmRDYWNoZWREYXRhKGhh
bmRsZSwgZC0+Y2xpZW50KCkpOwogICAgIHNvdXBfbWVzc2FnZV9zZXRfZmxhZ3MobXNnLCBTT1VQ
X01FU1NBR0VfT1ZFUldSSVRFX0NIVU5LUyk7CiB9CiAKQEAgLTE2MSw2ICsxNjcsOSBAQAogICAg
ICAgICByZXR1cm47CiAKICAgICBjbGllbnQtPmRpZFJlY2VpdmVEYXRhKGhhbmRsZSwgY2h1bmst
PmRhdGEsIGNodW5rLT5sZW5ndGgsIGZhbHNlKTsKKworICAgIGlmIChkLT5tX2NhY2hlKQorICAg
ICAgICBkLT5tX2NhY2hlLT5kaWRSZWNlaXZlRGF0YShoYW5kbGUsIGNodW5rLT5kYXRhLCBjaHVu
ay0+bGVuZ3RoLCBmYWxzZSk7CiB9CiAKIC8vIENhbGxlZCBhdCB0aGUgZW5kIG9mIHRoZSBtZXNz
YWdlLCB3aXRoIGFsbCB0aGUgbmVjZXNzYXJ5IGFib3V0IHRoZSBsYXN0IGluZm9ybWF0aW9ucy4K
QEAgLTE4NSw5ICsxOTQsMTIgQEAKICAgICAgICAgY2hhciogdXJpID0gc291cF91cmlfdG9fc3Ry
aW5nKHNvdXBfbWVzc2FnZV9nZXRfdXJpKG1zZyksIEZBTFNFKTsKICAgICAgICAgUmVzb3VyY2VF
cnJvciBlcnJvcigid2Via2l0LW5ldHdvcmstZXJyb3IiLCBFUlJPUl9UUkFOU1BPUlQsIHVyaSwg
U3RyaW5nOjpmcm9tVVRGOChtc2ctPnJlYXNvbl9waHJhc2UpKTsKICAgICAgICAgZ19mcmVlKHVy
aSk7Ci0gICAgICAgIGNsaWVudC0+ZGlkRmFpbChoYW5kbGUsIGVycm9yKTsKKwkgaWYgKGQtPm1f
Y2FjaGUpCisgICAgICAgICAgICBkLT5tX2NhY2hlLT5kaWRGYWlsKCk7CisJIGlmIChjbGllbnQp
CisgICAgICAgICAgICBjbGllbnQtPmRpZEZhaWwoaGFuZGxlLCBlcnJvcik7CiAgICAgICAgIHJl
dHVybjsKLSAgICB9IGVsc2UgaWYgKCFTT1VQX1NUQVRVU19JU19TVUNDRVNTRlVMKG1zZy0+c3Rh
dHVzX2NvZGUpKSB7CisgICAgfSBlbHNlIGlmICghU09VUF9TVEFUVVNfSVNfU1VDQ0VTU0ZVTCht
c2ctPnN0YXR1c19jb2RlKSAmJiBtc2ctPnN0YXR1c19jb2RlIT1TT1VQX1NUQVRVU19OT1RfTU9E
SUZJRUQpIHsKICAgICAgICAgZmlsbFJlc3BvbnNlRnJvbU1lc3NhZ2UobXNnLCAmZC0+bV9yZXNw
b25zZSk7CiAgICAgICAgIGNsaWVudC0+ZGlkUmVjZWl2ZVJlc3BvbnNlKGhhbmRsZSwgZC0+bV9y
ZXNwb25zZSk7CiAKQEAgLTE5Nyw5ICsyMDksMTYgQEAKIAogICAgICAgICBpZiAobXNnLT5yZXNw
b25zZV9ib2R5LT5kYXRhKQogICAgICAgICAgICAgY2xpZW50LT5kaWRSZWNlaXZlRGF0YShoYW5k
bGUsIG1zZy0+cmVzcG9uc2VfYm9keS0+ZGF0YSwgbXNnLT5yZXNwb25zZV9ib2R5LT5sZW5ndGgs
IHRydWUpOworICAgIH0gZWxzZSBpZiAoU09VUF9TVEFUVVNfSVNfU1VDQ0VTU0ZVTChtc2ctPnN0
YXR1c19jb2RlKSkgeworCWlmIChtc2ctPnN0YXR1c19jb2RlID09IFNPVVBfU1RBVFVTX05PX0NP
TlRFTlQpCisJICAgIGlmIChkLT5tX2NhY2hlKQorCSAgICAgICAgZC0+bV9jYWNoZS0+ZGlkRmFp
bCgpOworCWVsc2UKKwkgICAgaWYgKGQtPm1fY2FjaGUpCisJICAgICAgICBkLT5tX2NhY2hlLT5k
aWRGaW5pc2hMb2FkaW5nKCk7CisgICAgICAgIGlmIChjbGllbnQpCisgICAgICAgICAgICBjbGll
bnQtPmRpZEZpbmlzaExvYWRpbmcoaGFuZGxlKTsKICAgICB9Ci0KLSAgICBjbGllbnQtPmRpZEZp
bmlzaExvYWRpbmcoaGFuZGxlKTsKIH0KIAogLy8gcGFyc2VEYXRhVXJsKCkgaXMgdGFrZW4gZnJv
bSB0aGUgQ1VSTCBodHRwIGJhY2tlbmQuCkBAIC0zMDAsOSArMzE5LDIwIEBACiAgICAgfQogCiAg
ICAgU291cE1lc3NhZ2UqIG1zZzsKKworICAgIGQtPm1fY2FjaGUuc2V0KEZpbGVDYWNoZTo6Y3Jl
YXRlKGQtPm1fcmVxdWVzdCkpOworLyogICAgaWYgKGQtPm1fY2FjaGUgJiYgZC0+bV9jYWNoZS0+
aGFzRnJlc2hEYXRhKCkpIHsKKyAgICAJZC0+bV9jYWNoZS0+dXBkYXRlUmVzcG9uc2VGcm9tQ2Fj
aGUoZC0+bV9yZXNwb25zZSk7CisgICAgICAgIFJlc291cmNlSGFuZGxlQ2xpZW50KiBjbGllbnQg
PSBkLT5jbGllbnQoKTsKKyAgICAgICAgaWYgKGQtPmNsaWVudCgpKQorICAgICAgICAgICAgZC0+
Y2xpZW50KCktPmRpZFJlY2VpdmVSZXNwb25zZSh0aGlzLCBkLT5tX3Jlc3BvbnNlKTsKKwlpZiAo
ZC0+bV9jYWNoZSkKKyAgICAgICAgICAgIGQtPm1fY2FjaGUtPnNlbmRDYWNoZWREYXRhKHRoaXMs
IGNsaWVudCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyovCiAgICAgbXNnID0gc291
cF9tZXNzYWdlX25ldyhyZXF1ZXN0KCkuaHR0cE1ldGhvZCgpLnV0ZjgoKS5kYXRhKCksIHVybFN0
cmluZy51dGY4KCkuZGF0YSgpKTsKICAgICBnX3NpZ25hbF9jb25uZWN0KG1zZywgInJlc3RhcnRl
ZCIsIEdfQ0FMTEJBQ0socmVzdGFydGVkQ2FsbGJhY2spLCB0aGlzKTsKLQogICAgIGdfc2lnbmFs
X2Nvbm5lY3QobXNnLCAiZ290LWhlYWRlcnMiLCBHX0NBTExCQUNLKGdvdEhlYWRlcnNDYWxsYmFj
ayksIHRoaXMpOwogICAgIGdfc2lnbmFsX2Nvbm5lY3QobXNnLCAiZ290LWNodW5rIiwgR19DQUxM
QkFDSyhnb3RDaHVua0NhbGxiYWNrKSwgdGhpcyk7CiAKQEAgLTMxMyw2ICszNDMsMTQgQEAKICAg
ICAgICAgICAgIHNvdXBfbWVzc2FnZV9oZWFkZXJzX2FwcGVuZChtc2ctPnJlcXVlc3RfaGVhZGVy
cywgaXQtPmZpcnN0LnN0cmluZygpLnV0ZjgoKS5kYXRhKCksIGl0LT5zZWNvbmQudXRmOCgpLmRh
dGEoKSk7CiAgICAgfQogCisgICAgaWYgKGQtPm1fY2FjaGUpIHsKKyAgICAgICAgSFRUUEhlYWRl
ck1hcCBjYWNoZUhlYWRlcnMgPSBkLT5tX2NhY2hlLT5oZWFkZXJzRm9yUmVxdWVzdCgpOworICAg
ICAgICBIVFRQSGVhZGVyTWFwOjpjb25zdF9pdGVyYXRvciBlbmQgPSBjYWNoZUhlYWRlcnMuZW5k
KCk7CisgICAgICAgIGZvciAoSFRUUEhlYWRlck1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBjYWNo
ZUhlYWRlcnMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgICAgICBzb3VwX21l
c3NhZ2VfaGVhZGVyc19hcHBlbmQobXNnLT5yZXF1ZXN0X2hlYWRlcnMsIGl0LT5maXJzdC5zdHJp
bmcoKS51dGY4KCkuZGF0YSgpLCBpdC0+c2Vjb25kLnV0ZjgoKS5kYXRhKCkpOworICAgICAgICB9
CisgICAgfQorICAgIAogICAgIEZvcm1EYXRhKiBodHRwQm9keSA9IGQtPm1fcmVxdWVzdC5odHRw
Qm9keSgpOwogICAgIGlmIChodHRwQm9keSAmJiAhaHR0cEJvZHktPmlzRW1wdHkoKSkgewogICAg
ICAgICAvLyBNYWtpbmcgYSBjb3B5IG9mIHRoZSByZXF1ZXN0IGJvZHkgaXNuJ3QgdGhlIG1vc3Qg
ZWZmaWNpZW50IHdheSB0bwpAQCAtMzcwLDExICs0MDgsMTYgQEAKICAgICBpZiAoZC0+bV9tc2cp
IHsKICAgICAgICAgc291cF9zZXNzaW9uX2NhbmNlbF9tZXNzYWdlKHNlc3Npb24sIGQtPm1fbXNn
LCBTT1VQX1NUQVRVU19DQU5DRUxMRUQpOwogICAgICAgICAvLyBGb3IgcmUtZW50cmFuY3kgdHJv
dWJsZXMgd2UgY2FsbCBkaWRGaW5pc2hMb2FkaW5nIHdoZW4gdGhlIG1lc3NhZ2UgaGFzbid0IGJl
ZW4gaGFuZGxlZCB5ZXQuCi0gICAgICAgIGQtPmNsaWVudCgpLT5kaWRGaW5pc2hMb2FkaW5nKHRo
aXMpOworICAgICAgICBpZiAoY2xpZW50KCkpCisgICAgICAgICAgICBjbGllbnQoKS0+ZGlkRmlu
aXNoTG9hZGluZyh0aGlzKTsKICAgICB9IGVsc2UgaWYgKGQtPm1fY2FuY2VsbGFibGUpIHsKICAg
ICAgICAgZ19jYW5jZWxsYWJsZV9jYW5jZWwoZC0+bV9jYW5jZWxsYWJsZSk7Ci0gICAgICAgIGQt
PmNsaWVudCgpLT5kaWRGaW5pc2hMb2FkaW5nKHRoaXMpOworICAgICAgICBpZiAoY2xpZW50KCkp
CisJICAgIGNsaWVudCgpLT5kaWRGaW5pc2hMb2FkaW5nKHRoaXMpOwogICAgIH0KKyAgICBpZiAo
ZC0+bV9jYWNoZSkKKyAgICAgICAgZC0+bV9jYWNoZS0+ZGlkRmFpbCgpOworCiB9CiAKIFBhc3NS
ZWZQdHI8U2hhcmVkQnVmZmVyPiBSZXNvdXJjZUhhbmRsZTo6YnVmZmVyZWREYXRhKCkKSW5kZXg6
IFdlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9zb3VwL1Jlc291cmNlUmVzcG9uc2UuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL25ldHdvcmsvc291cC9SZXNvdXJjZVJlc3BvbnNlLmgJ
KHJldmlzaW9uIDM5ODc4KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL3NvdXAvUmVzb3Vy
Y2VSZXNwb25zZS5oCSh3b3JraW5nIGNvcHkpCkBAIC00MiwxMiArNDIsMTcgQEAKICAgICB7CiAg
ICAgfQogCisgICAgdm9pZCBzZXRMb2FkZWRGcm9tQ2FjaGUoYm9vbCBsb2FkZWRGcm9tQ2FjaGUp
IHsgbV9sb2FkZWRGcm9tQ2FjaGUgPSBsb2FkZWRGcm9tQ2FjaGU7IH0KKyAgICBib29sIGxvYWRl
ZEZyb21DYWNoZSgpIHsgcmV0dXJuIG1fbG9hZGVkRnJvbUNhY2hlOyB9CisKKwogcHJpdmF0ZToK
ICAgICBmcmllbmQgY2xhc3MgUmVzb3VyY2VSZXNwb25zZUJhc2U7CiAKICAgICB2b2lkIGRvVXBk
YXRlUmVzb3VyY2VSZXNwb25zZSgpCiAgICAgewogICAgIH0KKyAgICBib29sIG1fbG9hZGVkRnJv
bUNhY2hlOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0
Zm9ybS9uZXR3b3JrL1Jlc291cmNlSGFuZGxlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0
Zm9ybS9uZXR3b3JrL1Jlc291cmNlSGFuZGxlLmgJKHJldmlzaW9uIDM5ODc4KQorKysgV2ViQ29y
ZS9wbGF0Zm9ybS9uZXR3b3JrL1Jlc291cmNlSGFuZGxlLmgJKHdvcmtpbmcgY29weSkKQEAgLTE1
OSw2ICsxNTksMTAgQEAKICAgICBSZXNvdXJjZUhhbmRsZUludGVybmFsKiBnZXRJbnRlcm5hbCgp
IHsgcmV0dXJuIGQuZ2V0KCk7IH0KICNlbmRpZgogCisjaWYgVVNFKFNPVVApCisgICAgYm9vbCBz
dGFydEdpbyhTdHJpbmcgdXJsU3RyaW5nKTsKKyNlbmRpZgorCiAgICAgLy8gVXNlZCB0byB3b3Jr
IGFyb3VuZCB0aGUgZmFjdCB0aGF0IHlvdSBkb24ndCBnZXQgYW55IG1vcmUgTlNVUkxDb25uZWN0
aW9uIGNhbGxiYWNrcyB1bnRpbCB5b3UgcmV0dXJuIGZyb20gdGhlIG9uZSB5b3UncmUgaW4uCiAg
ICAgc3RhdGljIGJvb2wgbG9hZHNCbG9ja2VkKCk7ICAgIAogICAgIApAQCAtMTc5LDcgKzE4Myw2
IEBACiAjaWYgVVNFKFNPVVApCiAgICAgYm9vbCBzdGFydERhdGEoU3RyaW5nIHVybFN0cmluZyk7
CiAgICAgYm9vbCBzdGFydEh0dHAoU3RyaW5nIHVybFN0cmluZyk7Ci0gICAgYm9vbCBzdGFydEdp
byhTdHJpbmcgdXJsU3RyaW5nKTsKICNlbmRpZgogCiAgICAgdm9pZCBzY2hlZHVsZUZhaWx1cmUo
RmFpbHVyZVR5cGUpOwpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2ZpbGVjYWNoZS9G
aWxlQ2FjaGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9maWxl
Y2FjaGUvRmlsZUNhY2hlLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vbmV0
d29yay9maWxlY2FjaGUvRmlsZUNhY2hlLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw1MTYg
QEAKKy8vIC0qLSBtb2RlOiBjKys7IGMtYmFzaWMtb2Zmc2V0OiA0IC0qLQorLyoKKyAqIENvcHly
aWdodCAoQykgMjAwOCBDb2xsYWJvcmEgTHRkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVl
IHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1
bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNl
bnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIK
KyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0
ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhv
cGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsg
d2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkg
b3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGli
cmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91
IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBD
T1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k
YXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24s
IE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVk
ZSAiRmlsZUNhY2hlLmgiCisKKyNpZiBQTEFURk9STShHVEspICYmICFQTEFURk9STShXSU4pCisg
ICAgI2luY2x1ZGUgPGdsaWIuaD4KKyAgICAjaWYgR0xJQl9DSEVDS19WRVJTSU9OKDIsMTYsMCkK
KyAgICAgICAgI2RlZmluZSBIQVZFX1dFQkNPUkVfRklMRV9DQUNIRQorICAgICNlbmRpZgorI2Vu
ZGlmCisKKyNpZmRlZiBIQVZFX1dFQkNPUkVfRklMRV9DQUNIRQorI2luY2x1ZGUgIkNTdHJpbmcu
aCIKKyNpbmNsdWRlICJIVFRQUGFyc2Vycy5oIgorI2luY2x1ZGUgIlJlc291cmNlSGFuZGxlSW50
ZXJuYWwuaCIKKyNpbmNsdWRlIDx3dGYvTG9ja2VyLmg+CisKKyNpbmNsdWRlIDxmY250bC5oPgor
I2luY2x1ZGUgPHN5cy9maWxlLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8
c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2Vu
ZGlmCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworI2lmZGVmIEhBVkVfV0VCQ09SRV9GSUxFX0NB
Q0hFCisKKyNkZWZpbmUgQ0FDSEVfRk9STUFUX1ZFUlNJT04gInZlcnNpb24gMSIKKyNkZWZpbmUg
Q0FDSEVfTUVUQV9FWFRFTlNJT04gIi5tZXRhIgorI2RlZmluZSBDQUNIRV9EQVRBX0VYVEVOU0lP
TiAiLmNhY2hlIgorI2RlZmluZSBDQUNIRV9MT0NLX0VYVEVOU0lPTiAiLmxvY2siCisjZGVmaW5l
IENBQ0hFX1RFTVBfRVhURU5TSU9OICIudG1wIgorCisjZGVmaW5lIENBQ0hFX0ZJTEVfUEVSTUlT
U0lPTlMgMDYwMAorI2RlZmluZSBDQUNIRV9ESVJfUEVSTUlTU0lPTlMgMDcwMAorCit2b2lkIEZp
bGVMb2NrOjpsb2NrKCkKK3sKKyAgICBtX2xvY2tDb3VudCsrOworICAgIGlmIChtX2xvY2tDb3Vu
dCA+IDEpCisgICAgICAgIHJldHVybjsKKworICAgIG1fZmQgPSBvcGVuKChtX2ZpbGVuYW1lUHJl
Zml4ICsgQ0FDSEVfTE9DS19FWFRFTlNJT04pLnV0ZjgoKS5kYXRhKCksIE9fQ1JFQVQgfCBPX1dS
T05MWSwgQ0FDSEVfRklMRV9QRVJNSVNTSU9OUyk7CisgICAgaWYgKG1fZmQgPCAwKSB7CisgICAg
ICAgIGdfd2FybmluZygiRmFpbGVkIHRvIGxvY2sgdGhlIGNhY2hlXG4iKTsKKyAgICAgICAgcmV0
dXJuOworICAgIH0KKworICAgIGludCByZXQgPSAwOworI2lmIGRlZmluZWQoSEFWRV9GTE9DSykK
KyAgICByZXQgPSBmbG9jayhtX2ZkLCBMT0NLX0VYKTsKKyNlbGlmIGRlZmluZWQoSEFWRV9MT0NL
RikKKyAgICByZXQgPSBsb2NrZihtX2ZkLCBGX0xPQ0ssIDApOworI2Vsc2UKKyAgICBnX3dhcm5p
bmcoIk5vIGxvY2tpbmcgZnVuY3Rpb25zIGF2YWlsYWJsZSIpOworI2VuZGlmCisKKyAgICBpZiAo
cmV0IDwgMCkKKyAgICAgICAgZ193YXJuaW5nKCJGYWlsZWQgdG8gbG9jayB0aGUgY2FjaGUiKTsK
K30KKwordm9pZCBGaWxlTG9jazo6dW5sb2NrKCkKK3sKKyAgICBBU1NFUlQobV9sb2NrQ291bnQg
PiAwKTsKKworICAgIG1fbG9ja0NvdW50LS07CisgICAgaWYgKG1fbG9ja0NvdW50ID4gMCkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgaWYgKG1fZmQgPCAwKQorICAgICAgICByZXR1cm47CisKKyAg
ICB1bmxpbmsoKG1fZmlsZW5hbWVQcmVmaXggKyBDQUNIRV9MT0NLX0VYVEVOU0lPTikudXRmOCgp
LmRhdGEoKSk7CisgICAgY2xvc2UobV9mZCk7CisgICAgbV9mZCA9IC0xOworfQorCit2b2lkIEZp
bGVDYWNoZTo6c2V0Q2FjaGVEaXIoKQoreworCS8vIEZJWE1FIHNob3VsZCBiZSBkbyBraW5kYSBv
ZiBleHRlcm5hbCBBUEkgdG8gZGVmaW5lIHRoaXM/CisgICAgICAgIG1fY2FjaGVEaXIgPSBTdHJp
bmcoZ19idWlsZF9wYXRoIChHX0RJUl9TRVBBUkFUT1JfUywgZ19nZXRfdXNlcl9jYWNoZV9kaXIo
KSwgIndlYmtpdCIsIEdfRElSX1NFUEFSQVRPUl9TLCBOVUxMKSk7Cit9CisKK1N0cmluZyBGaWxl
Q2FjaGU6OmdldENhY2hlUHJlZml4KEtVUkwgdXJsKQoreworICAgIHVybC5zZXRVc2VyKCIiKTsK
KyAgICB1cmwuc2V0UGFzcygiIik7CisgICAgdXJsLnNldFF1ZXJ5KFN0cmluZygpKTsKKyAgICB1
cmwucmVtb3ZlUmVmKCk7CisKKyAgICBHQ2hlY2tzdW0gKmNoZWNrc3VtID0gZ19jaGVja3N1bV9u
ZXcoR19DSEVDS1NVTV9TSEExKTsKKyAgICBnX2NoZWNrc3VtX3VwZGF0ZShjaGVja3N1bSwgcmVp
bnRlcnByZXRfY2FzdDxjb25zdCBndWNoYXIqPih1cmwuc3RyaW5nKCkudXRmOCgpLmRhdGEoKSks
IC0xKTsKKyAgICBjb25zdCBnY2hhciAqY19kaWdlc3QgPSBnX2NoZWNrc3VtX2dldF9zdHJpbmco
Y2hlY2tzdW0pOworICAgIHNldENhY2hlRGlyKCk7CisgICAgU3RyaW5nIGRpZ2VzdD1TdHJpbmco
Y19kaWdlc3QpOworICAgIGRpZ2VzdC5pbnNlcnQoR19ESVJfU0VQQVJBVE9SX1MsMik7CisgICAg
U3RyaW5nIGNhY2hlRmlsZVByZWZpeCA9IG1fY2FjaGVEaXIgKyBkaWdlc3Q7CisgICAgZ19jaGVj
a3N1bV9mcmVlIChjaGVja3N1bSk7CisgICAgcmV0dXJuIGNhY2hlRmlsZVByZWZpeDsKK30KKwor
RmlsZUNhY2hlOjpGaWxlQ2FjaGUoUmVzb3VyY2VSZXF1ZXN0JiByZXF1ZXN0KQorICAgIDogbV9y
ZXF1ZXN0KHJlcXVlc3QpCisgICAgLCBtX2ZpbGVMb2NrKCkKKyAgICAsIG1fbWV0YUZpbGUoKQor
ICAgICwgbV9kYXRhRmlsZSgpCisgICAgLCBtX21ldGFUZW1wb3JhcnlGaWxlKCkKKyAgICAsIG1f
ZGF0YVRlbXBvcmFyeUZpbGUoKQorICAgICwgbV91cmwocmVxdWVzdC51cmwoKSkKKyAgICAsIG1f
b3JpZ2luYWxVcmwocmVxdWVzdC51cmwoKSkKKyAgICAsIG1fZXhwZWN0ZWRDb250ZW50TGVuZ3Ro
KDApCisgICAgLCBtX2NhY2hlZEhlYWRlcnMoKQorICAgICwgbV9oYXNEYXRhKGZhbHNlKQorICAg
ICwgbV9oYXNGcmVzaERhdGEoZmFsc2UpCisgICAgLCBtX3Nob3VsZFdyaXRlRGF0YVRvQ2FjaGUo
ZmFsc2UpCisgICAgLCBtX2NhY2hlRmlsZVByZWZpeChnZXRDYWNoZVByZWZpeChyZXF1ZXN0LnVy
bCgpKSkKKyAgICAsIG1fZGF0YU91dEZkKC0xKQoreworICAgIGdfcHJpbnQoIlslc10gY3JlYXRp
bmcgY2FjaGUgb2JqZWN0LCBmaWxlIHByZWZpeCBpcyAlc1xuIiwgbV9yZXF1ZXN0LnVybCgpLnN0
cmluZygpLnV0ZjgoKS5kYXRhKCksIG1fY2FjaGVGaWxlUHJlZml4LnV0ZjgoKS5kYXRhKCkpOwor
CisgICAgbV9maWxlTG9jay5zZXRGaWxlbmFtZVByZWZpeChtX2NhY2hlRmlsZVByZWZpeCk7Cisg
ICAgbV9tZXRhRmlsZSA9IGdfc3RyZHVwX3ByaW50ZiAoIiVzJXMiLCBtX2NhY2hlRmlsZVByZWZp
eC51dGY4KCkuZGF0YSgpLCBDQUNIRV9NRVRBX0VYVEVOU0lPTik7CisgICAgbV9kYXRhRmlsZSA9
IGdfc3RyZHVwX3ByaW50ZiAoIiVzJXMiLCBtX2NhY2hlRmlsZVByZWZpeC51dGY4KCkuZGF0YSgp
LCBDQUNIRV9EQVRBX0VYVEVOU0lPTik7CisgICAgc2V0dXBUZW1wb3JhcnlGaWxlcygpOworCisg
ICAgUmVzb3VyY2VSZXF1ZXN0Q2FjaGVQb2xpY3kgcG9saWN5ID0gbV9yZXF1ZXN0LmNhY2hlUG9s
aWN5KCk7CisgICAgaWYgKHBvbGljeSAhPSBSZWxvYWRJZ25vcmluZ0NhY2hlRGF0YSkKKyAgICAg
ICAgcmVhZE1ldGFkYXRhKCk7CisKKyAgICBpZiAobV9oYXNEYXRhICYmIChwb2xpY3kgPT0gUmV0
dXJuQ2FjaGVEYXRhRG9udExvYWQgfHwgcG9saWN5ID09IFJldHVybkNhY2hlRGF0YUVsc2VMb2Fk
KSkKKyAgICAgICAgbV9oYXNGcmVzaERhdGEgPSB0cnVlOworCisgICAgZ19wcmludCgiWyVzXSBo
YXMgZGF0YTogJXNcbiIsIG1fcmVxdWVzdC51cmwoKS5zdHJpbmcoKS51dGY4KCkuZGF0YSgpLCBt
X2hhc0RhdGEgPyAieWVzIiA6ICJubyIpOworICAgIGdfcHJpbnQoIlslc10gaGFzIGZyZXNoIGRh
dGE6ICVzXG4iLCBtX3JlcXVlc3QudXJsKCkuc3RyaW5nKCkudXRmOCgpLmRhdGEoKSwgbV9oYXNG
cmVzaERhdGEgPyAieWVzIiA6ICJubyIpOworfQorCitGaWxlQ2FjaGUqIEZpbGVDYWNoZTo6Y3Jl
YXRlKFJlc291cmNlUmVxdWVzdCYgcmVxdWVzdCkKK3sKKyAgICBpZiAoIXJlcXVlc3QudXJsKCku
cHJvdG9jb2xJcygiaHR0cCIpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmICgiR0VUIiAh
PSByZXF1ZXN0Lmh0dHBNZXRob2QoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4g
bmV3IEZpbGVDYWNoZShyZXF1ZXN0KTsKK30KKwordm9pZCBGaWxlQ2FjaGU6OnNldHVwVGVtcG9y
YXJ5RmlsZXMoKQoreworICAgIGVuc3VyZURpcmVjdG9yeUV4aXN0cygpOworICAgIExvY2tlcjxG
aWxlTG9jaz4gbG9ja2VyKG1fZmlsZUxvY2spOworICAgIG1fbWV0YVRlbXBvcmFyeUZpbGUgPSBj
cmVhdGVUZW1wb3JhcnlGaWxlKG1fbWV0YUZpbGUpOworICAgIG1fZGF0YVRlbXBvcmFyeUZpbGUg
PSBjcmVhdGVUZW1wb3JhcnlGaWxlKG1fZGF0YUZpbGUpOworICAgIGdfcHJpbnQoIlslc10gY3Jl
YXRlZCB0ZW1wb3JhcnkgZmlsZXMgJXMgYW5kICVzXG4iLCBtX3JlcXVlc3QudXJsKCkuc3RyaW5n
KCkudXRmOCgpLmRhdGEoKSwKKyAgICAgICAgICAgIG1fbWV0YVRlbXBvcmFyeUZpbGUsIG1fZGF0
YVRlbXBvcmFyeUZpbGUpOworfQorCit2b2lkIEZpbGVDYWNoZTo6ZW5zdXJlRGlyZWN0b3J5RXhp
c3RzKCkKK3sKKyAgICBnY2hhciogZGlyID0gZ19wYXRoX2dldF9kaXJuYW1lKG1fY2FjaGVGaWxl
UHJlZml4LnV0ZjgoKS5kYXRhKCkpOworICAgIGdfbWtkaXJfd2l0aF9wYXJlbnRzIChkaXIsIENB
Q0hFX0RJUl9QRVJNSVNTSU9OUyk7CisgICAgZ19mcmVlKGRpcik7Cit9CisKK2NoYXIgKkZpbGVD
YWNoZTo6Y3JlYXRlVGVtcG9yYXJ5RmlsZShjaGFyKiBvcmlnRmlsZU5hbWUpCit7CisgICAgTG9j
a2VyPEZpbGVMb2NrPiBsb2NrZXIobV9maWxlTG9jayk7CisKKyAgICBmb3IgKGludCBpID0gMDs7
IGkrKykgeworICAgICAgICBjaGFyICp0bXBGaWxlbmFtZSA9IGdfc3RyZHVwX3ByaW50ZigiJXMt
JWQlcyIsbV9jYWNoZUZpbGVQcmVmaXgudXRmOCgpLmRhdGEoKSxpLENBQ0hFX1RFTVBfRVhURU5T
SU9OKTsKKwlnX3ByaW50KCJ0bXA6ICVzXG4iLHRtcEZpbGVuYW1lKTsKKyAgICAgICAgaWYgKGFj
Y2Vzcyh0bXBGaWxlbmFtZSwgRl9PSykgIT0gMCkgeworICAgICAgICAgICAgaWYgKGxpbmsob3Jp
Z0ZpbGVOYW1lLCB0bXBGaWxlbmFtZSkgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIFRoZSB0
ZW1wb3JhcnkgZmlsZSBpcyBub3cgYSBoYXJkIGxpbmsgdG8gdGhlIG9yaWdpbmFsIG9uZS4KKyAg
ICAgICAgICAgICAgICByZXR1cm4gdG1wRmlsZW5hbWU7CisgICAgICAgICAgICB9CisgICAgICAg
ICAgICAvLyBUaGVyZSBpcyBubyBlbnRyeSBpbiB0aGUgY2FjaGUgZm9yIG5vdywgc28gd2UgY3Jl
YXRlIGFuIGVtcHR5CisgICAgICAgICAgICAvLyB0ZW1wb3JhcnkgZmlsZSB0byBhdm9pZCBvdGhl
ciBwcm9jZXNzZXMgdG8gcGljayB0aGUgc2FtZSB0ZW1wb3JhcnkKKyAgICAgICAgICAgIC8vIGZp
bGUgbmFtZS4KKyAgICAgICAgICAgIGludCBmZCA9IG9wZW4odG1wRmlsZW5hbWUsIE9fQ1JFQVQg
fCBPX1dST05MWSwgQ0FDSEVfRklMRV9QRVJNSVNTSU9OUyk7CisgICAgICAgICAgICBpZiAoZmQg
Pj0gMCkgeworICAgICAgICAgICAgICAgIGNsb3NlIChmZCk7CisgICAgICAgICAgICAgICAgcmV0
dXJuIHRtcEZpbGVuYW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitp
bnQgRmlsZUNhY2hlOjpvcGVuRm9yV3JpdGluZ0JyZWFraW5nTGlua3MoY2hhciogZmlsZW5hbWUp
Cit7CisgICAgTG9ja2VyPEZpbGVMb2NrPiBsb2NrZXIobV9maWxlTG9jayk7CisKKyAgICBpbnQg
ZmQgPSAtMTsKKyAgICBpZiAodW5saW5rKGZpbGVuYW1lKSA9PSAwKQorICAgICAgICBmZCA9IG9w
ZW4oZmlsZW5hbWUsIE9fQ1JFQVQgfCBPX1dST05MWSwgQ0FDSEVfRklMRV9QRVJNSVNTSU9OUyk7
CisKKyAgICByZXR1cm4gZmQ7Cit9CisKK3ZvaWQgRmlsZUNhY2hlOjpyZWFkTWV0YWRhdGEoKQor
eworICAgIGdfcHJpbnQoIlslc10gbG9hZGluZyBtZXRhZGF0YSBmcm9tIGRpc2tcbiIsIG1fcmVx
dWVzdC51cmwoKS5zdHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKworICAgIGludCBmZCA9IG9wZW4o
bV9tZXRhVGVtcG9yYXJ5RmlsZSwgT19SRE9OTFkpOworICAgIGlmIChmZCA8IDApCisgICAgICAg
IHJldHVybjsKKyAgICBzdHJ1Y3Qgc3RhdCBzdGF0QnVmZjsKKyAgICBpZiAoZnN0YXQgKGZkLCAm
c3RhdEJ1ZmYpIDwgMCkgeworICAgICAgICBjbG9zZShmZCk7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CisgICAgT3duUHRyPGNoYXI+IGJ1ZmYobmV3IGNoYXJbc3RhdEJ1ZmYuc3Rfc2l6ZSArIDFd
KTsKKyAgICBidWZmLmdldCgpW3N0YXRCdWZmLnN0X3NpemVdID0gJ1wwJzsKKyAgICBjaGFyICpi
dWZmUG9zaXRpb24gPSBidWZmLmdldCgpOworICAgIGludCBieXRlc1JlYWQ7CisgICAgd2hpbGUg
KChieXRlc1JlYWQgPSByZWFkKGZkLCBidWZmUG9zaXRpb24sIHN0YXRCdWZmLnN0X3NpemUgLSAo
YnVmZlBvc2l0aW9uIC0gYnVmZi5nZXQoKSkpKSA+IDApIHsKKyAgICAgICAgaWYgKGJ5dGVzUmVh
ZCA8IDApIHsKKyAgICAgICAgICAgIGNsb3NlKGZkKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAg
ICAgICAgfQorICAgICAgICBidWZmUG9zaXRpb24gKz0gYnl0ZXNSZWFkOworICAgIH0KKyAgICBj
bG9zZShmZCk7CisKKyAgICBTdHJpbmcgZmlsZUNvbnRlbnQgPSBTdHJpbmcoYnVmZi5nZXQoKSk7
CisgICAgVmVjdG9yPFN0cmluZz4gbGluZXM7CisgICAgZmlsZUNvbnRlbnQuc3BsaXQoIlxuIiwg
bGluZXMpOworCisgICAgVmVjdG9yPFN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbGluZXMu
YmVnaW4oKTsKKyAgICBWZWN0b3I8U3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbGluZXMu
ZW5kKCk7CisKKyAgICAvLyBWZXJzaW9uCisgICAgaWYgKGl0ID09IGVuZCkKKyAgICAgICAgcmV0
dXJuOworICAgIGlmICgqaXQgIT0gQ0FDSEVfRk9STUFUX1ZFUlNJT04pCisgICAgICAgIHJldHVy
bjsKKyAgICBpdCsrOworCisgICAgLy8gVVJMCisgICAgaWYgKGl0ID09IGVuZCkKKyAgICAgICAg
cmV0dXJuOworICAgIG1fdXJsID0gS1VSTCgqaXQpOworICAgIGl0Kys7CisKKyAgICAvLyBDb250
ZW50IGxlbmd0aAorICAgIGlmIChpdCA9PSBlbmQpCisgICAgICAgIHJldHVybjsKKyAgICBtX2V4
cGVjdGVkQ29udGVudExlbmd0aCA9IGl0LT50b0ludDY0U3RyaWN0KCk7CisgICAgaXQrKzsKKwor
ICAgIC8vIEhlYWRlcnMKKyAgICBmb3IgKDsgaXQgIT0gZW5kOyBpdCsrKSB7CisgICAgICAgIGlu
dCBzcGxpdFBvcyA9IGl0LT5maW5kKCI6Iik7CisgICAgICAgIGlmIChzcGxpdFBvcyAhPSAtMSkK
KyAgICAgICAgICAgIG1fY2FjaGVkSGVhZGVycy5zZXQoaXQtPmxlZnQoc3BsaXRQb3MpLCBpdC0+
c3Vic3RyaW5nKHNwbGl0UG9zKzEpLnN0cmlwV2hpdGVTcGFjZSgpKTsKKyAgICB9CisKKyAgICBt
X2hhc0RhdGEgPSB0cnVlOworICAgIGdfcHJpbnQoIlslc10gbWV0YWRhdGEgb2tcbiIsIG1fcmVx
dWVzdC51cmwoKS5zdHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKK30KKwordm9pZCBGaWxlQ2FjaGU6
OmludmFsaWRhdGUoYm9vbCBpbnZhbGlkYXRlTm9uVGVtcG9yYXJ5RW50cnkpCit7CisgICAgbV9o
YXNEYXRhID0gZmFsc2U7CisgICAgbV9oYXNGcmVzaERhdGEgPSBmYWxzZTsKKworICAgIGdfcHJp
bnQoIlslc10gaW52YWxpZGF0aW5nIHRlbXBvcmFyeSBlbnRyeVxuIiwgbV9yZXF1ZXN0LnVybCgp
LnN0cmluZygpLnV0ZjgoKS5kYXRhKCkpOworCisgICAgdW5saW5rKG1fbWV0YVRlbXBvcmFyeUZp
bGUpOworICAgIHVubGluayhtX2RhdGFUZW1wb3JhcnlGaWxlKTsKKyAgICAvLyBTZXQgdG8gdGhl
IG51bGwgc3RyaW5nIHRvIG1ha2UgZGVidWdnaW5nIGVhc2llciBpZiB0aGVyZSBpcyBhbgorICAg
IC8vIGF0dGVtcHQgdG8gdXNlIHRoZSBjYWNoZSBhZnRlciBhIGNhbGwgdG8gdGhpcyBmdW5jdGlv
bi4KKyAgICBtX21ldGFUZW1wb3JhcnlGaWxlID0gTlVMTDsKKyAgICBtX2RhdGFUZW1wb3JhcnlG
aWxlID0gTlVMTDsKKworICAgIGlmIChpbnZhbGlkYXRlTm9uVGVtcG9yYXJ5RW50cnkpIHsKKyAg
ICAgICAgZ19wcmludCgiWyVzXSBpbnZhbGlkYXRpbmcgZW50cnlcbiIsIG1fcmVxdWVzdC51cmwo
KS5zdHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKyAgICAgICAgTG9ja2VyPEZpbGVMb2NrPiBsb2Nr
ZXIobV9maWxlTG9jayk7CisgICAgICAgIHVubGluayhtX21ldGFGaWxlKTsKKyAgICAgICAgdW5s
aW5rKG1fZGF0YUZpbGUpOworICAgICAgICBtX21ldGFGaWxlID0gTlVMTDsKKyAgICAgICAgbV9k
YXRhRmlsZSA9IE5VTEw7CisgICAgfQorfQorCitIVFRQSGVhZGVyTWFwIEZpbGVDYWNoZTo6aGVh
ZGVyc0ZvclJlcXVlc3QoKQoreworICAgIEhUVFBIZWFkZXJNYXAgaGVhZGVyczsKKyAgICBTdHJp
bmcgZXRhZyA9IG1fY2FjaGVkSGVhZGVycy5nZXQoIkVUYWciKTsKKyAgICBpZiAoIWV0YWcuaXNO
dWxsKCkpCisgICAgICAgIGhlYWRlcnMuc2V0KCJJZi1Ob25lLU1hdGNoIiwgZXRhZyk7CisKKyAg
ICBTdHJpbmcgbGFzdE1vZGlmaWVkID0gbV9jYWNoZWRIZWFkZXJzLmdldCgiTGFzdC1Nb2RpZmll
ZCIpOworICAgIGlmICghbGFzdE1vZGlmaWVkLmlzTnVsbCgpKQorICAgICAgICBoZWFkZXJzLnNl
dCgiSWYtTW9kaWZpZWQtU2luY2UiLCBsYXN0TW9kaWZpZWQpOworCisgICAgcmV0dXJuIGhlYWRl
cnM7Cit9CisKK3ZvaWQgRmlsZUNhY2hlOjp3cml0ZU1ldGFkYXRhRnJvbVJlc3BvbnNlKFJlc291
cmNlUmVzcG9uc2UmIHJlc3BvbnNlKQoreworICAgIGludCByZXREYXRhOworICAgIGdfcHJpbnQo
Ilslc10gc2F2aW5nIG1ldGFkYXRhIHRvIGRpc2tcbiIsIG1fcmVxdWVzdC51cmwoKS5zdHJpbmco
KS51dGY4KCkuZGF0YSgpKTsKKworICAgIGludCBmZCA9IG9wZW5Gb3JXcml0aW5nQnJlYWtpbmdM
aW5rcyhtX21ldGFUZW1wb3JhcnlGaWxlKTsKKyAgICBpZiAoZmQgPCAwKQorICAgICAgICByZXR1
cm47CisKKyAgICAvLyBWZXJzaW9uIGluZm8KKyAgICByZXREYXRhID0gd3JpdGUoZmQsIENBQ0hF
X0ZPUk1BVF9WRVJTSU9OICJcbiIsIHN0cmxlbihDQUNIRV9GT1JNQVRfVkVSU0lPTikgKyAxKTsK
KworICAgIC8vIFVSTAorICAgIG1fdXJsID0gcmVzcG9uc2UudXJsKCk7CisgICAgU3RyaW5nIHVy
bCA9IG1fdXJsLnN0cmluZygpICsgIlxuIjsKKyAgICBDU3RyaW5nIHVybExhdGluMSA9IHVybC5s
YXRpbjEoKTsKKyAgICByZXREYXRhID0gd3JpdGUoZmQsIHVybExhdGluMS5kYXRhKCksIHVybExh
dGluMS5sZW5ndGgoKSk7CisKKyAgICAvLyBDb250ZW50IGxlbmd0aAorICAgIG1fZXhwZWN0ZWRD
b250ZW50TGVuZ3RoID0gcmVzcG9uc2UuZXhwZWN0ZWRDb250ZW50TGVuZ3RoKCk7CisgICAgU3Ry
aW5nIGNvbnRlbnRMZW5ndGhTdHJpbmcgPSBTdHJpbmc6Om51bWJlcihtX2V4cGVjdGVkQ29udGVu
dExlbmd0aCkgKyAiXG4iOworICAgIENTdHJpbmcgY29udGVudExlbmd0aFN0cmluZ0xhdGluMSA9
IGNvbnRlbnRMZW5ndGhTdHJpbmcubGF0aW4xKCk7CisgICAgcmV0RGF0YSA9IHdyaXRlKGZkLCBj
b250ZW50TGVuZ3RoU3RyaW5nTGF0aW4xLmRhdGEoKSwgY29udGVudExlbmd0aFN0cmluZ0xhdGlu
MS5sZW5ndGgoKSk7CisKKyAgICAvLyBIZWFkZXJzCisgICAgSFRUUEhlYWRlck1hcDo6Y29uc3Rf
aXRlcmF0b3IgZW5kID0gcmVzcG9uc2UuaHR0cEhlYWRlckZpZWxkcygpLmVuZCgpOworICAgIGZv
ciAoSFRUUEhlYWRlck1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSByZXNwb25zZS5odHRwSGVhZGVy
RmllbGRzKCkuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgIFN0cmluZyBoZWFk
ZXJTdHJpbmcgPSBpdC0+Zmlyc3Q7CisgICAgICAgIGhlYWRlclN0cmluZy5hcHBlbmQoIjogIik7
CisgICAgICAgIGhlYWRlclN0cmluZy5hcHBlbmQoaXQtPnNlY29uZCk7CisgICAgICAgIGhlYWRl
clN0cmluZy5hcHBlbmQoIlxuIik7CisgICAgICAgIENTdHJpbmcgaGVhZGVyTGF0aW4xID0gaGVh
ZGVyU3RyaW5nLmxhdGluMSgpOworICAgICAgICByZXREYXRhID0gd3JpdGUoZmQsIGhlYWRlckxh
dGluMS5kYXRhKCksIGhlYWRlckxhdGluMS5sZW5ndGgoKSk7CisgICAgfQorCisgICAgY2xvc2Uo
ZmQpOworfQorCit2b2lkIEZpbGVDYWNoZTo6dXBkYXRlUmVzcG9uc2VGcm9tQ2FjaGUoUmVzb3Vy
Y2VSZXNwb25zZSYgcmVzcG9uc2UpCit7CisgICAgcmVzcG9uc2Uuc2V0SFRUUFN0YXR1c0NvZGUo
MjAwKTsKKyAgICByZXNwb25zZS5zZXRMb2FkZWRGcm9tQ2FjaGUodHJ1ZSk7CisKKyAgICAvLyBJ
bnRlZ3JhdGUgdGhlIGhlYWRlcnMgaW4gdGhlIHJlc3BvbnNlIHdpdGggdGhlIG9uZXMgcmVjZWl2
ZWQgZnJvbSB0aGUgc2VydmVyLgorICAgIEhUVFBIZWFkZXJNYXA6OmNvbnN0X2l0ZXJhdG9yIGVu
ZCA9IG1fY2FjaGVkSGVhZGVycy5lbmQoKTsKKyAgICBmb3IgKEhUVFBIZWFkZXJNYXA6OmNvbnN0
X2l0ZXJhdG9yIGl0ID0gbV9jYWNoZWRIZWFkZXJzLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkK
KyAgICAgICAgaWYgKHJlc3BvbnNlLmh0dHBIZWFkZXJGaWVsZChpdC0+Zmlyc3QpLmlzTnVsbCgp
KQorICAgICAgICAgICAgcmVzcG9uc2Uuc2V0SFRUUEhlYWRlckZpZWxkKGl0LT5maXJzdCwgaXQt
PnNlY29uZCk7CisKKyAgICByZXNwb25zZS5zZXRFeHBlY3RlZENvbnRlbnRMZW5ndGgobV9leHBl
Y3RlZENvbnRlbnRMZW5ndGgpOworICAgIHJlc3BvbnNlLnNldE1pbWVUeXBlKGV4dHJhY3RNSU1F
VHlwZUZyb21NZWRpYVR5cGUocmVzcG9uc2UuaHR0cEhlYWRlckZpZWxkKCJDb250ZW50LVR5cGUi
KSkpOworICAgIHJlc3BvbnNlLnNldFRleHRFbmNvZGluZ05hbWUoZXh0cmFjdENoYXJzZXRGcm9t
TWVkaWFUeXBlKHJlc3BvbnNlLmh0dHBIZWFkZXJGaWVsZCgiQ29udGVudC1UeXBlIikpKTsKKyAg
ICByZXNwb25zZS5zZXRTdWdnZXN0ZWRGaWxlbmFtZShmaWxlbmFtZUZyb21IVFRQQ29udGVudERp
c3Bvc2l0aW9uKHJlc3BvbnNlLmh0dHBIZWFkZXJGaWVsZCgiQ29udGVudC1EaXNwb3NpdGlvbiIp
KSk7Cit9CisKK3ZvaWQgRmlsZUNhY2hlOjpkaWRSZWNlaXZlUmVzcG9uc2UoUmVzb3VyY2VSZXNw
b25zZSYgcmVzcG9uc2UpCit7CisgICAgaWYgKHJlc3BvbnNlLmh0dHBTdGF0dXNDb2RlKCkgPT0g
MzA0KSB7CisgICAgICAgIGdfcHJpbnQoIlslc10gcmVjZWl2ZWQgMzA0IC0+IHdpbGwgdXNlIGNh
Y2hlZCBkYXRhXG4iLCBtX3JlcXVlc3QudXJsKCkuc3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7Cisg
ICAgICAgIHVwZGF0ZVJlc3BvbnNlRnJvbUNhY2hlKHJlc3BvbnNlKTsKKyAgICAgICAgd3JpdGVN
ZXRhZGF0YUZyb21SZXNwb25zZShyZXNwb25zZSk7CisgICAgICAgIG1faGFzRnJlc2hEYXRhID0g
dHJ1ZTsKKyAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLmh0dHBTdGF0dXNDb2RlKCkgPT0gMjAwKSB7
CisgICAgICAgIGdfcHJpbnQoIlslc10gcmVjZWl2ZWQgMjAwXG4iLCBtX3JlcXVlc3QudXJsKCku
c3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7CisgICAgICAgIFN0cmluZyBldGFnID0gcmVzcG9uc2Uu
aHR0cEhlYWRlckZpZWxkKCJFVGFnIik7CisgICAgICAgIFN0cmluZyBsYXN0TW9kaWZpZWQgPSBy
ZXNwb25zZS5odHRwSGVhZGVyRmllbGQoIkxhc3QtTW9kaWZpZWQiKTsKKyAgICAgICAgbV9zaG91
bGRXcml0ZURhdGFUb0NhY2hlID0gIWV0YWcuaXNOdWxsKCkgfHwgIWxhc3RNb2RpZmllZC5pc051
bGwoKTsKKyAgICAgICAgaWYgKG1fc2hvdWxkV3JpdGVEYXRhVG9DYWNoZSkKKyAgICAgICAgICAg
IHdyaXRlTWV0YWRhdGFGcm9tUmVzcG9uc2UocmVzcG9uc2UpOworICAgICAgICBlbHNlIHsKKyAg
ICAgICAgICAgIGludmFsaWRhdGUodHJ1ZSk7CisgICAgICAgICAgICBnX3ByaW50KCJbJXNdIG5v
biBjYWNoZWFibGVcbiIsIG1fcmVxdWVzdC51cmwoKS5zdHJpbmcoKS51dGY4KCkuZGF0YSgpKTsK
KyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGdfcHJpbnQoIlslc10gcmVjZWl2ZWQg
JWQgLT4gaW52YWxpZGF0aW5nIHRlbXBvcmFyeSBjYWNoZSBlbnRyeVxuIiwgbV9yZXF1ZXN0LnVy
bCgpLnN0cmluZygpLnV0ZjgoKS5kYXRhKCksIHJlc3BvbnNlLmh0dHBTdGF0dXNDb2RlKCkpOwor
ICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgfQorfQorCit2b2lkIHNhdmVUZW1wb3JhcnlEYXRh
SGVscGVyKEZpbGVDYWNoZSogY2FjaGUpCit7CisgICAgY2FjaGUtPnNhdmVUZW1wb3JhcnlEYXRh
KCk7Cit9CisKK3ZvaWQgaW52YWxpZGF0ZUhlbHBlcihGaWxlQ2FjaGUqIGNhY2hlKQoreworICAg
IGNhY2hlLT5pbnZhbGlkYXRlKCk7Cit9CisKK3N0cnVjdCBGaWxlUmVhZGFibGVEYXRhIHsKKyAg
ICBGaWxlUmVhZGFibGVEYXRhKFJlc291cmNlSGFuZGxlKiBoLCBGaWxlQ2FjaGUqIGMpCisgICAg
ICAgIDogaGFuZGxlKGgpCisgICAgICAgICwgY2FjaGUoYykge30KKworICAgIFJlc291cmNlSGFu
ZGxlKiBoYW5kbGU7CisgICAgRmlsZUNhY2hlKiBjYWNoZTsKK307CisKK3ZvaWQgRmlsZUNhY2hl
OjpzZW5kQ2FjaGVkRGF0YShSZXNvdXJjZUhhbmRsZSogaGFuZGxlLCBSZXNvdXJjZUhhbmRsZUNs
aWVudCogY2xpZW50KQoreworICAgIEFTU0VSVChjbGllbnQpOworICAgIEFTU0VSVChoYW5kbGUt
PmdldEludGVybmFsKCktPmNsaWVudCgpID09IGNsaWVudCk7CisKKyAgICBnX3ByaW50KCJbJXNd
IHNlbmRpbmcgY2FjaGVkIGRhdGEgdG8gYXBwbGljYXRpb25cbiIsIG1fcmVxdWVzdC51cmwoKS5z
dHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKyAgICBoYW5kbGUtPnN0YXJ0R2lvKFN0cmluZygiZmls
ZTovLyIpICttX2RhdGFUZW1wb3JhcnlGaWxlKTsKK30KKwordm9pZCBGaWxlQ2FjaGU6OmRpZFJl
Y2VpdmVEYXRhKFJlc291cmNlSGFuZGxlKiBoYW5kbGUsIGNvbnN0IGNoYXIqIGRhdGEsIGludCBz
aXplLCBpbnQgbGVuZ3RoUmVjZWl2ZWQpCit7CisgICAgaW50IHJldERhdGE7CisgICAgaWYgKCFt
X3Nob3VsZFdyaXRlRGF0YVRvQ2FjaGUpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChtX2Rh
dGFPdXRGZCA8IDApIHsKKyAgICAgICAgbV9kYXRhT3V0RmQgPSBvcGVuRm9yV3JpdGluZ0JyZWFr
aW5nTGlua3MobV9kYXRhVGVtcG9yYXJ5RmlsZSk7CisgICAgICAgIGlmIChtX2RhdGFPdXRGZCA8
IDApIHsKKyAgICAgICAgICAgIG1fc2hvdWxkV3JpdGVEYXRhVG9DYWNoZSA9IGZhbHNlOworICAg
ICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9Cisg
ICAgfQorICAgIHJldERhdGEgPSB3cml0ZShtX2RhdGFPdXRGZCwgZGF0YSwgc2l6ZSk7Cit9CisK
K3ZvaWQgRmlsZUNhY2hlOjpzYXZlVGVtcG9yYXJ5RGF0YSgpCit7CisgICAgTG9ja2VyPEZpbGVM
b2NrPiBsb2NrZXIobV9maWxlTG9jayk7CisgICAgLy8gSWYgdGhlIGRlc3RpbmF0aW9uIHBhdGgg
ZXhpc3RzIGFuZCBpdCBwb2ludHMgdG8gdGhlIHNhbWUgZmlsZSBhcyB0aGUgc291cmNlIHRoZW4K
KyAgICAvLyByZW5hbWUgZG9lcyBub3RoaW5nIGFuZCByZXR1cm5zIDAsIHNvIHdlIHJlbW92ZSB0
aGUgZGVzdGluYXRpb24gZmlsZXMuCisgICAgdW5saW5rKG1fZGF0YUZpbGUpOworICAgIHVubGlu
ayhtX21ldGFGaWxlKTsKKworICAgIGludCByZXREYXRhID0gcmVuYW1lKG1fZGF0YVRlbXBvcmFy
eUZpbGUsIG1fZGF0YUZpbGUpOworICAgIGludCByZXRNZXRhID0gcmVuYW1lKG1fbWV0YVRlbXBv
cmFyeUZpbGUsIG1fbWV0YUZpbGUpOworICAgIGlmIChyZXRNZXRhIDwgMCB8fCByZXREYXRhIDwg
MCkgeworICAgICAgICBpbnZhbGlkYXRlKHRydWUpOworICAgICAgICBtX2hhc0RhdGEgPSBmYWxz
ZTsKKyAgICAgICAgbV9oYXNGcmVzaERhdGEgPSBmYWxzZTsKKyAgICB9CisgICAgZWxzZQorICAg
ICAgICBnX3ByaW50KCJbJXNdIGNhY2hlZCBkYXRhIHdyaXR0ZW4gb24gZGlza1xuIiwgbV9yZXF1
ZXN0LnVybCgpLnN0cmluZygpLnV0ZjgoKS5kYXRhKCkpOworfQorCit2b2lkIEZpbGVDYWNoZTo6
ZGlkRmluaXNoTG9hZGluZygpCit7CisgICAgaWYgKCFtX3Nob3VsZFdyaXRlRGF0YVRvQ2FjaGUp
CisgICAgICAgIHJldHVybjsKKyAgICBBU1NFUlQgKG1fZGF0YU91dEZkID49IDApOworICAgIGNs
b3NlKG1fZGF0YU91dEZkKTsKKyAgICBpZiAobV91cmwgIT0gbV9vcmlnaW5hbFVybCkgeworICAg
ICAgICBTdHJpbmcgcmVkaXJlY3RQcmVmaXggPSBnZXRDYWNoZVByZWZpeChtX3VybCk7CisgICAg
ICAgIGlmIChyZWRpcmVjdFByZWZpeCAhPSBtX2NhY2hlRmlsZVByZWZpeCkgeworICAgICAgICAg
ICAgRmlsZUxvY2sgcmVkaXJlY3RMb2NrOworICAgICAgICAgICAgcmVkaXJlY3RMb2NrLnNldEZp
bGVuYW1lUHJlZml4KHJlZGlyZWN0UHJlZml4KTsKKyAgICAgICAgICAgIExvY2tlcjxGaWxlTG9j
az4gbG9ja2VyKHJlZGlyZWN0TG9jayk7CisgICAgICAgICAgICAvLyBEZWxldGUgdGhlIG9sZCBm
aWxlcyAoaWYgdGhleSBleGlzdCkgYXMgbGluayBkb2Vzbid0CisgICAgICAgICAgICAvLyBvdmVy
d3JpdGUgdGhlbS4KKyAgICAgICAgICAgIFN0cmluZyByZWRpcmVjdERhdGFGaWxlID0gZ19zdHJk
dXBfcHJpbnRmICgiJXMlcyIsIHJlZGlyZWN0UHJlZml4LnV0ZjgoKS5kYXRhKCksIENBQ0hFX0RB
VEFfRVhURU5TSU9OKTsKKyAgICAgICAgICAgIHVubGluayhyZWRpcmVjdERhdGFGaWxlKTsKKyAg
ICAgICAgICAgIFN0cmluZyByZWRpcmVjdE1ldGFGaWxlID0gZ19zdHJkdXBfcHJpbnRmICgiJXMl
cyIsIHJlZGlyZWN0UHJlZml4LnV0ZjgoKS5kYXRhKCksIENBQ0hFX01FVEFfRVhURU5TSU9OKTsK
KyAgICAgICAgICAgIHVubGluayhyZWRpcmVjdE1ldGFGaWxlKTsKKworICAgICAgICAgICAgaW50
IHJldERhdGEgPSBsaW5rKG1fZGF0YVRlbXBvcmFyeUZpbGUsIHJlZGlyZWN0RGF0YUZpbGUpOwor
ICAgICAgICAgICAgaW50IHJldE1ldGEgPSBsaW5rKG1fbWV0YVRlbXBvcmFyeUZpbGUsIHJlZGly
ZWN0TWV0YUZpbGUpOworICAgICAgICAgICAgaWYgKHJldERhdGEgPCAwIHx8IHJldE1ldGEgPCAw
KSB7CisgICAgICAgICAgICAgICAgdW5saW5rKHJlZGlyZWN0RGF0YUZpbGUpOworICAgICAgICAg
ICAgICAgIHVubGluayhyZWRpcmVjdE1ldGFGaWxlKTsKKyAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgZ19wcmludCgiWyVzXSByZWRpcmVjdCB3cml0dGVuIG9uIGRpc2ssIHByZWZpeCBpczog
JXNcbiIsIG1fcmVxdWVzdC51cmwoKS5zdHJpbmcoKS51dGY4KCkuZGF0YSgpLCByZWRpcmVjdFBy
ZWZpeC51dGY4KCkuZGF0YSgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzYXZlVGVtcG9yYXJ5
RGF0YSgpOworICAgIG1faGFzRGF0YSA9IHRydWU7CisgICAgbV9oYXNGcmVzaERhdGEgPSB0cnVl
OworfQorCit2b2lkIEZpbGVDYWNoZTo6ZGlkRmFpbCgpCit7CisgICAgaWYgKCFtX3Nob3VsZFdy
aXRlRGF0YVRvQ2FjaGUpCisgICAgICAgIHJldHVybjsKKworICAgIEFTU0VSVChtX2RhdGFPdXRG
ZCA+PSAwKTsKKyAgICBjbG9zZShtX2RhdGFPdXRGZCk7CisKKyAgICBpbnZhbGlkYXRlKCk7Cisg
ICAgZ19wcmludCgiWyVzXSBjYWNoZWQgZGF0YSBub3Qgd3JpdHRlbiBvbiBkaXNrXG4iLCBtX3Jl
cXVlc3QudXJsKCkuc3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7Cit9CisKKyNlbHNlIC8vICNpZmRl
ZiBIQVZFX1dFQkNPUkVfRklMRV9DQUNIRQorCisjZXJyb3IgIkNvbXBpbGluZyB3aXRob3V0IHRo
ZSBmaWxlIGNhY2hlIGlzIG5vdCBzdXBwb3J0ZWQgeWV0IgorCisjZW5kaWYgLy8gI2lmZGVmIEhB
VkVfV0VCQ09SRV9GSUxFX0NBQ0hFCisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdl
YkNvcmUvcGxhdGZvcm0vbmV0d29yay9maWxlY2FjaGUvRmlsZUNhY2hlLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9wbGF0Zm9ybS9uZXR3b3JrL2ZpbGVjYWNoZS9GaWxlQ2FjaGUuaAkocmV2aXNp
b24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vbmV0d29yay9maWxlY2FjaGUvRmlsZUNhY2hlLmgJ
KHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTE2IEBACisvLyAtKi0gbW9kZTogYysrOyBjLWJhc2lj
LW9mZnNldDogNCAtKi0KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggQ29sbGFib3JhIEx0ZC4K
KyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1
dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGli
cmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUg
U29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2Us
IG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJy
YXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisg
KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJy
YW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ
VVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBm
b3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkg
b2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGgg
dGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRv
CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJl
ZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKwor
I2lmbmRlZiBGaWxlQ2FjaGVfaAorI2RlZmluZSBGaWxlQ2FjaGVfaAorCisjaW5jbHVkZSAiSFRU
UEhlYWRlck1hcC5oIgorI2luY2x1ZGUgIktVUkwuaCIKKyNpbmNsdWRlICJOb25jb3B5YWJsZS5o
IgorI2luY2x1ZGUgIlJlc291cmNlSGFuZGxlLmgiCisjaW5jbHVkZSAiUmVzb3VyY2VIYW5kbGVD
bGllbnQuaCIKKyNpbmNsdWRlICJSZXNvdXJjZVJlcXVlc3QuaCIKKyNpbmNsdWRlICJSZXNvdXJj
ZVJlc3BvbnNlLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgRmlsZUxvY2sgewor
ICAgIHB1YmxpYzoKKyAgICAgICAgRmlsZUxvY2soKQorICAgICAgICAgIDogbV9sb2NrQ291bnQo
MCkKKyAgICAgICAgICAsIG1fZmlsZW5hbWVQcmVmaXgoKQorICAgICAgICAgICwgbV9mZCgtMSkK
KyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzZXRGaWxlbmFtZVByZWZpeChT
dHJpbmcgZmlsZW5hbWVQcmVmaXgpIHsgbV9maWxlbmFtZVByZWZpeCA9IGZpbGVuYW1lUHJlZml4
OyB9CisKKyAgICAgICAgdm9pZCBsb2NrKCk7CisgICAgICAgIHZvaWQgdW5sb2NrKCk7CisKKyAg
ICBwcml2YXRlOgorICAgIAlTdHJpbmcgZ2V0RGVmYXVsdFByZWZpeCgpOworICAgICAgICBpbnQg
bV9sb2NrQ291bnQ7CisgICAgICAgIFN0cmluZyBtX2ZpbGVuYW1lUHJlZml4OworICAgICAgICBp
bnQgbV9mZDsKK307CisKKworLyogVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCBmb3IgdGhvc2UgYmFj
a2VuZHMsIGxpa2UgY3VybCBhbmQgc291cCwgdGhhdCBkbyBub3QKKyAqIG5hdGl2ZWx5IHN1cHBv
cnQgZmlsZSBjYWNoaW5nLiAqLworY2xhc3MgRmlsZUNhY2hlIDogTm9uY29weWFibGUgeworcHVi
bGljOgorICAgIHN0YXRpYyBGaWxlQ2FjaGUqIGNyZWF0ZShSZXNvdXJjZVJlcXVlc3QmIHJlcXVl
c3QpOworCisgICAgYm9vbCBoYXNEYXRhKCkgeyByZXR1cm4gbV9oYXNEYXRhOyB9CisgICAgYm9v
bCBoYXNGcmVzaERhdGEoKSB7IHJldHVybiBtX2hhc0ZyZXNoRGF0YTsgfQorCisgICAgSFRUUEhl
YWRlck1hcCBoZWFkZXJzRm9yUmVxdWVzdCgpOworCisgICAgdm9pZCB1cGRhdGVSZXNwb25zZUZy
b21DYWNoZShSZXNvdXJjZVJlc3BvbnNlJiApOworCisgICAgdm9pZCBzZW5kQ2FjaGVkRGF0YShS
ZXNvdXJjZUhhbmRsZSosIFJlc291cmNlSGFuZGxlQ2xpZW50Kik7CisKKyAgICB2b2lkIGRpZFJl
Y2VpdmVSZXNwb25zZShSZXNvdXJjZVJlc3BvbnNlJiApOworICAgIHZvaWQgZGlkUmVjZWl2ZURh
dGEoUmVzb3VyY2VIYW5kbGUqLCBjb25zdCBjaGFyKiwgaW50LCBpbnQgbGVuZ3RoUmVjZWl2ZWQp
OworICAgIHZvaWQgZGlkRmluaXNoTG9hZGluZygpOworICAgIHZvaWQgZGlkRmFpbCgpOworCitw
cml2YXRlOgorICAgIEZpbGVDYWNoZShSZXNvdXJjZVJlcXVlc3QmKTsKKworICAgIHZvaWQgc2V0
dXBUZW1wb3JhcnlGaWxlcygpOworICAgIHZvaWQgZW5zdXJlRGlyZWN0b3J5RXhpc3RzKCk7Cisg
ICAgY2hhciAqY3JlYXRlVGVtcG9yYXJ5RmlsZShjaGFyICpvcmlnRmlsZU5hbWUpOworICAgIGlu
dCBvcGVuRm9yV3JpdGluZ0JyZWFraW5nTGlua3MoY2hhciogZmlsZW5hbWUpOworICAgIHZvaWQg
cmVhZE1ldGFkYXRhKCk7CisgICAgdm9pZCB3cml0ZU1ldGFkYXRhRnJvbVJlc3BvbnNlKFJlc291
cmNlUmVzcG9uc2UmIHJlc3BvbnNlKTsKKworICAgIHZvaWQgc2V0Q2FjaGVEaXIoKTsKKyAgICBT
dHJpbmcgZ2V0Q2FjaGVQcmVmaXgoS1VSTCB1cmwpOworCisgICAgZnJpZW5kIHZvaWQgc2F2ZVRl
bXBvcmFyeURhdGFIZWxwZXIoRmlsZUNhY2hlKik7OworICAgIHZvaWQgc2F2ZVRlbXBvcmFyeURh
dGEoKTsKKworICAgIGZyaWVuZCB2b2lkIGludmFsaWRhdGVIZWxwZXIoRmlsZUNhY2hlKik7Owor
ICAgIHZvaWQgaW52YWxpZGF0ZShib29sIGludmFsaWRhdGVOb25UZW1wb3JhcnlFbnRyeT1mYWxz
ZSk7CisKKyAgICBSZXNvdXJjZVJlcXVlc3QmIG1fcmVxdWVzdDsKKyAgICBGaWxlTG9jayBtX2Zp
bGVMb2NrOworICAgIGNoYXIgKm1fbWV0YUZpbGU7CisgICAgY2hhciAqbV9kYXRhRmlsZTsKKyAg
ICBjaGFyICptX21ldGFUZW1wb3JhcnlGaWxlOworICAgIGNoYXIgKm1fZGF0YVRlbXBvcmFyeUZp
bGU7CisgICAgS1VSTCBtX3VybDsKKyAgICBLVVJMIG1fb3JpZ2luYWxVcmw7CisgICAgbG9uZyBs
b25nIGludCBtX2V4cGVjdGVkQ29udGVudExlbmd0aDsKKyAgICBIVFRQSGVhZGVyTWFwIG1fY2Fj
aGVkSGVhZGVyczsKKyAgICBib29sIG1faGFzRGF0YTsKKyAgICBib29sIG1faGFzRnJlc2hEYXRh
OworICAgIGJvb2wgbV9zaG91bGRXcml0ZURhdGFUb0NhY2hlOworICAgIFN0cmluZyBtX2NhY2hl
RGlyOworICAgIFN0cmluZyBtX2NhY2hlRmlsZVByZWZpeDsKKyAgICBpbnQgbV9kYXRhT3V0RmQ7
CisgICAgdW5zaWduZWQgaW50IG1fcmVhZENoYW5uZWxXYXRjaDsKK307CisKK30gLy8gbmFtZXNw
YWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIEZpbGVDYWNoZV9oCkluZGV4OiBjb25maWd1cmUuYWMK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gY29uZmlndXJlLmFjCShyZXZpc2lvbiAzOTg3OCkKKysrIGNvbmZpZ3Vy
ZS5hYwkod29ya2luZyBjb3B5KQpAQCAtMTUyLDYgKzE1Miw5IEBACiBBQ19IRUFERVJfU1REQwog
QUNfSEVBREVSX1NUREJPT0wKIAorIyBDaGVjayBmb3IgZmlsZSBsb2NraW5nIGZ1bmN0aW9ucwor
QUNfQ0hFQ0tfRlVOQ1MoW2Zsb2NrIGxvY2tmXSkKKwogIyBwdGhyZWFkIChub3QgbmVlZGVkIG9u
IFdpbmRvd3MpCiBpZiB0ZXN0ICIkb3Nfd2luMzIiID0gIm5vIjsgdGhlbgogQUNfQ0hFQ0tfSEVB
REVSUyhbcHRocmVhZC5oXSwK
</data>

          </attachment>
      

    </bug>

</bugzilla>