<?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>209942</bug_id>
          
          <creation_ts>2020-04-02 17:04:59 -0700</creation_ts>
          <short_desc>[GTK][WPE] Replace fopen/fclose by fopen/fseek functions in MemoryPressureMonitor</short_desc>
          <delta_ts>2020-04-10 23:57:15 -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>WebKit2</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>210345</blocked>
    
    <blocked>210346</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Pablo Saavedra">psaavedra</reporter>
          <assigned_to name="Pablo Saavedra">psaavedra</assigned_to>
          <cc>annulen</cc>
    
    <cc>aperez</cc>
    
    <cc>cgarcia</cc>
    
    <cc>clopez</cc>
    
    <cc>darin</cc>
    
    <cc>mcatanzaro</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1637161</commentid>
    <comment_count>0</comment_count>
    <who name="Pablo Saavedra">psaavedra</who>
    <bug_when>2020-04-02 17:04:59 -0700</bug_when>
    <thetext>The current implementation is executing open/close calls for several files /proc/meminfo, /proc/self/cgroup, ... in a infinite loop.

It could be good idea to explore a refactoring using fseek/rewind/fsetpos to avoid unnecessary those open/close system calls.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1637173</commentid>
    <comment_count>1</comment_count>
      <attachid>395329</attachid>
    <who name="Pablo Saavedra">psaavedra</who>
    <bug_when>2020-04-02 17:32:41 -0700</bug_when>
    <thetext>Created attachment 395329
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1637251</commentid>
    <comment_count>2</comment_count>
    <who name="Pablo Saavedra">psaavedra</who>
    <bug_when>2020-04-02 23:26:57 -0700</bug_when>
    <thetext>(In reply to Pablo Saavedra from comment #0)
&gt; to avoid unnecessary those open/close system calls.

... to avoid those unnecessary  open/close system calls</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1637285</commentid>
    <comment_count>3</comment_count>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2020-04-03 02:12:53 -0700</bug_when>
    <thetext>Do we really want to keep those file descriptors open indefinitely?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1637298</commentid>
    <comment_count>4</comment_count>
    <who name="Pablo Saavedra">psaavedra</who>
    <bug_when>2020-04-03 03:43:41 -0700</bug_when>
    <thetext>(In reply to Carlos Garcia Campos from comment #3)
&gt; Do we really want to keep those file descriptors open indefinitely?

The current logic opens and closes thise files every 5 seconds. In the valance I could make more sense just keep then indefinitely open.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1637315</commentid>
    <comment_count>5</comment_count>
    <who name="Carlos Alberto Lopez Perez">clopez</who>
    <bug_when>2020-04-03 05:24:00 -0700</bug_when>
    <thetext>(In reply to Pablo Saavedra from comment #4)
&gt; (In reply to Carlos Garcia Campos from comment #3)
&gt; &gt; Do we really want to keep those file descriptors open indefinitely?
&gt; 
&gt; The current logic opens and closes thise files every 5 seconds. In the
&gt; valance I could make more sense just keep then indefinitely open.

Yes, my thinking its that its a better idea to keep them open forever than to open/close them forever each few seconds.

However, I realize now that it seems possible to move a running process from a memory cgroup to a different cgroup memory.

 Ex: https://docs.fedoraproject.org/en-US/Fedora/16/html/Resource_Management_Guide/sec-Moving_a_Process_to_a_Control_Group.html

I think that we should check for this and open the cgroup sysfs files of the new memory cgroup if it happens.

Another thing to take into account its that we can start running without memory cgroup (so we start getting the memory info from /proc/meminfo), but then the admin puts the process inside a memory cgroup after some seconds after we have started. So we have started the busy loop of the thread thinking we are not running inside a memory cgroup, but that its not longer true.

So I see no better option than to re-check in each loop iteration if we are now in a memory cgroup or a different one. And for doing that it seems needed to re-check the memory cgroup sysfs related files on each loop.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1637316</commentid>
    <comment_count>6</comment_count>
    <who name="Carlos Alberto Lopez Perez">clopez</who>
    <bug_when>2020-04-03 05:30:14 -0700</bug_when>
    <thetext>(In reply to Carlos Alberto Lopez Perez from comment #5)
&gt; (In reply to Pablo Saavedra from comment #4)
&gt; &gt; (In reply to Carlos Garcia Campos from comment #3)
&gt; &gt; &gt; Do we really want to keep those file descriptors open indefinitely?
&gt; &gt; 
&gt; &gt; The current logic opens and closes thise files every 5 seconds. In the
&gt; &gt; valance I could make more sense just keep then indefinitely open.
&gt; 
&gt; Yes, my thinking its that its a better idea to keep them open forever than
&gt; to open/close them forever each few seconds.
&gt; 

Or maybe its not a better idea.

In the end you are replacing this:

-iteration-loop: fclose()/fopen() syscalls
+iteration-loop: fseek()/fflush() syscalls


So the number of syscalls per loop its the same.

But before you were avoiding having open the descriptors when not needed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1637399</commentid>
    <comment_count>7</comment_count>
    <who name="Pablo Saavedra">psaavedra</who>
    <bug_when>2020-04-03 09:53:07 -0700</bug_when>
    <thetext>(In reply to Carlos Alberto Lopez Perez from comment #5)
&gt; (In reply to Pablo Saavedra from comment #4)
&gt; &gt; (In reply to Carlos Garcia Campos from comment #3)
&gt; &gt; &gt; Do we really want to keep those file descriptors open indefinitely?
&gt; &gt; 
&gt; &gt; The current logic opens and closes thise files every 5 seconds. In the
&gt; &gt; valance I could make more sense just keep then indefinitely open.
&gt; 
&gt; Yes, my thinking its that its a better idea to keep them open forever than
&gt; to open/close them forever each few seconds.
&gt; 
&gt; However, I realize now that it seems possible to move a running process from
&gt; a memory cgroup to a different cgroup memory.
&gt; 
&gt;  Ex:
&gt; https://docs.fedoraproject.org/en-US/Fedora/16/html/
&gt; Resource_Management_Guide/sec-Moving_a_Process_to_a_Control_Group.html
&gt; 
&gt; I think that we should check for this and open the cgroup sysfs files of the
&gt; new memory cgroup if it happens.

yes, this works. When this happens the `memory:` path in the /proc/self/cgroup is updated and the loop reads the new value again then if the memoryControllerPath differs from the m_cgroupMemoryControllerPath the setMemoryControllerPath() disposes the old cgroups files (aka close()) and open the new cgroups memory files from the new memory controller path:

 356void CGroupMemoryController::setMemoryControllerPath(CString memoryControllerPath)
 357{
 358    if (memoryControllerPath == m_cgroupMemoryControllerPath)
 359        return;

&gt; 
&gt; Another thing to take into account its that we can start running without
&gt; memory cgroup (so we start getting the memory info from /proc/meminfo), but
&gt; then the admin puts the process inside a memory cgroup after some seconds
&gt; after we have started. So we have started the busy loop of the thread
&gt; thinking we are not running inside a memory cgroup, but that its not longer
&gt; true.
&gt; 

The same that above ^. Already tested.

&gt; So I see no better option than to re-check in each loop iteration if we are
&gt; now in a memory cgroup or a different one. And for doing that it seems
&gt; needed to re-check the memory cgroup sysfs related files on each loop.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1637496</commentid>
    <comment_count>8</comment_count>
    <who name="Pablo Saavedra">psaavedra</who>
    <bug_when>2020-04-03 12:47:39 -0700</bug_when>
    <thetext>(In reply to Carlos Alberto Lopez Perez from comment #6)
&gt; (In reply to Carlos Alberto Lopez Perez from comment #5)
&gt; &gt; (In reply to Pablo Saavedra from comment #4)
&gt; &gt; &gt; (In reply to Carlos Garcia Campos from comment #3)
&gt; &gt; &gt; &gt; Do we really want to keep those file descriptors open indefinitely?
&gt; &gt; &gt; 
&gt; &gt; &gt; The current logic opens and closes thise files every 5 seconds. In the
&gt; &gt; &gt; valance I could make more sense just keep then indefinitely open.
&gt; &gt; 
&gt; &gt; Yes, my thinking its that its a better idea to keep them open forever than
&gt; &gt; to open/close them forever each few seconds.
&gt; &gt; 
&gt; 
&gt; Or maybe its not a better idea.
&gt; 
&gt; In the end you are replacing this:
&gt; 
&gt; -iteration-loop: fclose()/fopen() syscalls
&gt; +iteration-loop: fseek()/fflush() syscalls
&gt; 
&gt; 
&gt; So the number of syscalls per loop its the same.
&gt; 
&gt; But before you were avoiding having open the descriptors when not needed.

Well, those descriptors are going to be need every 5 seconds so. It is going keep those descriptors open is going to be a problem it is going to be a problem as well at the moment of reopen the files.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1637510</commentid>
    <comment_count>9</comment_count>
    <who name="Adrian Perez">aperez</who>
    <bug_when>2020-04-03 13:31:52 -0700</bug_when>
    <thetext>(In reply to Carlos Alberto Lopez Perez from comment #6)
&gt; (In reply to Carlos Alberto Lopez Perez from comment #5)
&gt; &gt; (In reply to Pablo Saavedra from comment #4)
&gt; &gt; &gt; (In reply to Carlos Garcia Campos from comment #3)
&gt; &gt; &gt; &gt; Do we really want to keep those file descriptors open indefinitely?
&gt; &gt; &gt; 
&gt; &gt; &gt; The current logic opens and closes thise files every 5 seconds. In the
&gt; &gt; &gt; valance I could make more sense just keep then indefinitely open.
&gt; &gt; 
&gt; &gt; Yes, my thinking its that its a better idea to keep them open forever than
&gt; &gt; to open/close them forever each few seconds.
&gt; &gt; 
&gt; 
&gt; Or maybe its not a better idea.
&gt; 
&gt; In the end you are replacing this:
&gt; 
&gt; -iteration-loop: fclose()/fopen() syscalls
&gt; +iteration-loop: fseek()/fflush() syscalls
&gt; 
&gt; 
&gt; So the number of syscalls per loop its the same.

Not quite, the situation is still very favorable towards keeping the files
always open:

 - fflush() only empties the *userspace* buffers maintained by the libc
   for the FILE objects—it does not do any system call.

 - The open() system call —used by fopen()— is more expensive than the
   lseek() system call —used by fseek()— because opening a file needs
   allocating kernel-side resources and checking user credentials and
   file access permissions (none of which is needed for seeking).

 - If we keep the files always open, it is possible to continue checking
   memory status even if the amount of available file descriptors is
   exhausted. If all possible file descriptors are used between closing
   and trying to open files again, opening will fail.

&gt; But before you were avoiding having open the descriptors when not needed.

This is not a particularly good argument. While true, we *know* that the
file descriptors *will be needed again in some seconds*, so they *will*
be needed!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1637511</commentid>
    <comment_count>10</comment_count>
    <who name="Adrian Perez">aperez</who>
    <bug_when>2020-04-03 13:33:04 -0700</bug_when>
    <thetext>(In reply to Adrian Perez from comment #9)
&gt; (In reply to Carlos Alberto Lopez Perez from comment #6)
&gt; &gt; (In reply to Carlos Alberto Lopez Perez from comment #5)
&gt; &gt; &gt; (In reply to Pablo Saavedra from comment #4)
&gt; &gt; &gt; &gt; (In reply to Carlos Garcia Campos from comment #3)
&gt; &gt; &gt; &gt; &gt; Do we really want to keep those file descriptors open indefinitely?
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; The current logic opens and closes thise files every 5 seconds. In the
&gt; &gt; &gt; &gt; valance I could make more sense just keep then indefinitely open.
&gt; &gt; &gt; 
&gt; &gt; &gt; Yes, my thinking its that its a better idea to keep them open forever than
&gt; &gt; &gt; to open/close them forever each few seconds.
&gt; &gt; &gt; 
&gt; &gt; 
&gt; &gt; Or maybe its not a better idea.
&gt; &gt; 
&gt; &gt; In the end you are replacing this:
&gt; &gt; 
&gt; &gt; -iteration-loop: fclose()/fopen() syscalls
&gt; &gt; +iteration-loop: fseek()/fflush() syscalls
&gt; &gt; 
&gt; &gt; 
&gt; &gt; So the number of syscalls per loop its the same.
&gt; 
&gt; Not quite, the situation is still very favorable towards keeping the files
&gt; always open:
&gt; 
&gt;  - fflush() only empties the *userspace* buffers maintained by the libc
&gt;    for the FILE objects—it does not do any system call.
&gt; 
&gt;  - The open() system call —used by fopen()— is more expensive than the
&gt;    lseek() system call —used by fseek()— because opening a file needs
&gt;    allocating kernel-side resources and checking user credentials and
&gt;    file access permissions (none of which is needed for seeking).

Also:

   - The close() system call —used by fclose()­— is slightly more expensive
     that a seek operation because it has to deallocate kernel resources.

&gt;  - If we keep the files always open, it is possible to continue checking
&gt;    memory status even if the amount of available file descriptors is
&gt;    exhausted. If all possible file descriptors are used between closing
&gt;    and trying to open files again, opening will fail.
&gt; 
&gt; &gt; But before you were avoiding having open the descriptors when not needed.
&gt; 
&gt; This is not a particularly good argument. While true, we *know* that the
&gt; file descriptors *will be needed again in some seconds*, so they *will*
&gt; be needed!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1637514</commentid>
    <comment_count>11</comment_count>
      <attachid>395329</attachid>
    <who name="Adrian Perez">aperez</who>
    <bug_when>2020-04-03 13:47:13 -0700</bug_when>
    <thetext>Comment on attachment 395329
patch

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

I think this is a nice incremental improvement to the existing
code, but it needs a bit of work. I am particularly concerned
about the missing error checking when opening files. Could you
please look into the suggestions below?

&gt; Source/WebKit/UIProcess/linux/MemoryPressureMonitor.cpp:67
&gt; +    fflush(zoneInfoFile);

Why do you need to use fflush() here? The fseek() right above is
responsible to arrange whatever is needed internally inside the
libc to make the next read return data starting at the first byte
of the file.

&gt; Source/WebKit/UIProcess/linux/MemoryPressureMonitor.cpp:180
&gt; +    fflush(cgroupControllerFile);

Same here, flushing after seeking shouldn&apos;t be needed.

&gt; Source/WebKit/UIProcess/linux/MemoryPressureMonitor.cpp:212
&gt; +    fflush(memInfoFile);

…and the same here.

&gt; Source/WebKit/UIProcess/linux/MemoryPressureMonitor.cpp:327
&gt; +        FILE* cgroupControllerFile = fopen(s_procSelfCgroup, &quot;r&quot;);

This is missing error checking. If the files cannot be opened
the FILE* variables will be null and trying to read from them
will be undefined behaviour. We need checks here, and do one of:

 1. Disable the memory pressure monitor. Probably not ideal.
 2. Retry opening the files periodically, optionally up to a
    certain maximum amount of attempts.
 3. Retry opening the files with exponential backoff.

For simplicity, I think we could go with option (2.) and retrying
every 5s, which is the same interval at which memory status reports
are gathered.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1637677</commentid>
    <comment_count>12</comment_count>
    <who name="Michael Catanzaro">mcatanzaro</who>
    <bug_when>2020-04-04 07:04:14 -0700</bug_when>
    <thetext>(Would make sense to use GMemoryMonitor on GLib ports if GLib 2.64 is available at build time.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1637684</commentid>
    <comment_count>13</comment_count>
    <who name="Carlos Alberto Lopez Perez">clopez</who>
    <bug_when>2020-04-04 09:02:37 -0700</bug_when>
    <thetext>(In reply to Michael Catanzaro from comment #12)
&gt; (Would make sense to use GMemoryMonitor on GLib ports if GLib 2.64 is
&gt; available at build time.)

That&apos;s interesting. Didn&apos;t know about it. 

I foresaw some problems with it:
 - Requires a daemon (Low Memory Monitor) to be installed 
 - Requires Linux Kernel 5.2 or newer

So maybe it makes sense to use it if available, but i think we should keep the current code at least as a fallback for older systems or for systems without that daemon installed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1637851</commentid>
    <comment_count>14</comment_count>
      <attachid>395496</attachid>
    <who name="Pablo Saavedra">psaavedra</who>
    <bug_when>2020-04-05 02:56:46 -0700</bug_when>
    <thetext>Created attachment 395496
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1637853</commentid>
    <comment_count>15</comment_count>
    <who name="Pablo Saavedra">psaavedra</who>
    <bug_when>2020-04-05 03:04:08 -0700</bug_when>
    <thetext>(In reply to Adrian Perez from comment #11)
&gt; Comment on attachment 395329 [details]
&gt; patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=395329&amp;action=review
&gt; 
&gt; I think this is a nice incremental improvement to the existing
&gt; code, but it needs a bit of work. I am particularly concerned
&gt; about the missing error checking when opening files. Could you
&gt; please look into the suggestions below?
&gt; 
&gt; &gt; Source/WebKit/UIProcess/linux/MemoryPressureMonitor.cpp:67
&gt; &gt; +    fflush(zoneInfoFile);
&gt; 
&gt; Why do you need to use fflush() here? The fseek() right above is
&gt; responsible to arrange whatever is needed internally inside the
&gt; libc to make the next read return data starting at the first byte
&gt; of the file.
&gt; 
&gt; &gt; Source/WebKit/UIProcess/linux/MemoryPressureMonitor.cpp:180
&gt; &gt; +    fflush(cgroupControllerFile);
&gt; 
&gt; Same here, flushing after seeking shouldn&apos;t be needed.
&gt; 
&gt; &gt; Source/WebKit/UIProcess/linux/MemoryPressureMonitor.cpp:212
&gt; &gt; +    fflush(memInfoFile);
&gt; 

Fixed. All files with fopen() are opened with a default allocated buffer (fully buffered) but stderr. I just set a null buffer for those files (setbuf(..., nullptr)). With this change the flush is not needed.

With this change, only the `fseek()` is called (instance of fopen()/fclose() for each iteration). 

&gt; …and the same here.
&gt; 
&gt; &gt; Source/WebKit/UIProcess/linux/MemoryPressureMonitor.cpp:327
&gt; &gt; +        FILE* cgroupControllerFile = fopen(s_procSelfCgroup, &quot;r&quot;);
&gt; 
&gt; This is missing error checking. If the files cannot be opened
&gt; the FILE* variables will be null and trying to read from them
&gt; will be undefined behaviour. We need checks here, and do one of:
&gt; 
&gt;  1. Disable the memory pressure monitor. Probably not ideal.
&gt;  2. Retry opening the files periodically, optionally up to a
&gt;     certain maximum amount of attempts.
&gt;  3. Retry opening the files with exponential backoff.
&gt; 
&gt; For simplicity, I think we could go with option (2.) and retrying
&gt; every 5s, which is the same interval at which memory status reports
&gt; are gathered.

Please, check the new version of the patch. I added the open of those files into the loop also checking the fopen() result.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1637854</commentid>
    <comment_count>16</comment_count>
    <who name="Pablo Saavedra">psaavedra</who>
    <bug_when>2020-04-05 03:11:30 -0700</bug_when>
    <thetext>(In reply to Carlos Alberto Lopez Perez from comment #13)
&gt; (In reply to Michael Catanzaro from comment #12)
&gt; &gt; (Would make sense to use GMemoryMonitor on GLib ports if GLib 2.64 is
&gt; &gt; available at build time.)
&gt; 
&gt; That&apos;s interesting. Didn&apos;t know about it. 
&gt; 
&gt; I foresaw some problems with it:
&gt;  - Requires a daemon (Low Memory Monitor) to be installed 
&gt;  - Requires Linux Kernel 5.2 or newer
&gt; 
&gt; So maybe it makes sense to use it if available, but i think we should keep
&gt; the current code at least as a fallback for older systems or for systems
&gt; without that daemon installed.


I think is a good idea replacement for the data coming from `/proc/memInfo`.

But still I see the monitoring of the cgroup memory controller files necessary. What, I understand GMemoryMonitor monitor memory pressure information coming from the kernel but not deals with the cgroups memory limits.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1638042</commentid>
    <comment_count>17</comment_count>
      <attachid>395550</attachid>
    <who name="Pablo Saavedra">psaavedra</who>
    <bug_when>2020-04-05 23:49:47 -0700</bug_when>
    <thetext>Created attachment 395550
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1639982</commentid>
    <comment_count>18</comment_count>
      <attachid>395550</attachid>
    <who name="Adrian Perez">aperez</who>
    <bug_when>2020-04-09 17:40:33 -0700</bug_when>
    <thetext>Comment on attachment 395550
patch

I have today while re-reviewing this that there is a perfect way of
avoiding strtok(), please check the comments below. Thanks a lot for
your patience providing updates to the patch, it is much appreciated,
and I think we are quite close to be able to land this :)

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

&gt; Source/WebKit/UIProcess/linux/MemoryPressureMonitor.cpp:76
&gt;          if (!strncmp(line, &quot;Node&quot;, 4)) {

I have noticed now that this is only searching for the “low”
value inside the first “Node” section, without taking into
account the kind of the memory zone.

Shouldn&apos;t we be searching for the “Normal” zone node, instead
of the first one seen? In my laptop here the first zone is a
DMA memory area:

  Node 0, zone      DMA
    per-node stats
        nr_inactive_anon 277959
        nr_active_anon 863174
        ...
    pages free      3951
          min       13 
          low       16
          high      19
          ...

…and picking “16” as the “low” value seems wrong. We will want
to fix this to find the node which describes the “Normal” zone:

  Node 0, zone     Normal
    pages free     252746
          min      14907
          low      26572
          high     31069
          ...

Related question: What if there are more multiple nodes which
describe nodes of “Normal” type? Should the “low” values be
added together in that case?

BTW, feel free to handle fixing this in a separate bug :)

&gt; Source/WebKit/UIProcess/linux/MemoryPressureMonitor.cpp:173
&gt;  // 1:name=systemd:/user.slice/user-1000.slice/user@1000.service/gnome-terminal-server.service

These lines look quite suitable to be parsed with fscanf():

  while (!feof(inputFile)) {
      char name[40 + 1];
      char path[PATH_MAX + 1];
      fscanf(&quot;%*u:%40[^:]:%&quot; STRINGIFY(PATH_MAX) &quot;[^\n]&quot;, name, path);
      if (!strcmp(name, &quot;name=systemd&quot;))
          return CString(path);
  }

  // Not found
  return CString();

With the STRINGIFY() macro being the usual preprocessor trick:

  #define STRINGIFY_EXPANDED(val) #val
  #define STRINGIFY(val) STRINGIFY_EXPANDED(val)

&gt; Source/WebKit/UIProcess/linux/MemoryPressureMonitor.cpp:217
&gt; +    while (char* line = fgets(buffer, 128, memInfoFile)) {

Idea: instead of going line-by-line and using evil strtok(), take
advantage of… fscanf() again!

   memoryTotal = memoryFree = activeFile = inactiveFile = slabReclaimable = notSet;
   while (!feof(memInfoFile)) {
       char token[50 + 1];
       size_t amount;
       if (fscanf(memInfoFile, &quot;%50s%zukB&quot;, token, &amp;amount) != 2)
           break;

       if (!strcmp(token, &quot;MemTotal:&quot;))
           memoryTotal = amount;
       else if (!strcmp(token, &quot;MemFree:&quot;))
           memoryFree = amount;
       else ...

      if (memoryTotal != notSet &amp;&amp; memoryFree != notSet &amp;&amp; activeFile != notSet &amp;&amp; inactiveFile != notSet &amp;&amp; slabReclaimable != notSet)
          break;
   }

Note how this avoids needing to manually split the input in tokens
ourselves: instead we let fscanf() do the hard work of parsing the
input and doing numeric conversions.

&gt; Source/WebKit/UIProcess/linux/MemoryPressureMonitor.cpp:420
&gt; +    return value;

This whole function can be implemented as:

  size_t CGroupMemoryController::getCgroupFileValue(FILE* file)
  {
      size_t value;
      return (file &amp;&amp; fscanf(file, &quot;%zu&quot;, &amp;value) == 1) ? value : notSet;
  }</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1640255</commentid>
    <comment_count>19</comment_count>
    <who name="Pablo Saavedra">psaavedra</who>
    <bug_when>2020-04-10 10:36:03 -0700</bug_when>
    <thetext>(In reply to Adrian Perez from comment #18)
&gt; Comment on attachment 395550 [details]


Thanks Adrián for your review and, of course, for your suggestions. I&apos;d prefer avoid the usage this ticket to fix those things. Instance of that I created this 2 new tickets to address the issues described by you:

* [GTK][WPE] lowWatermarkPages() in MemoryPressureMonitor.cpp only searches the &quot;low&quot; value inside the first &quot;Node&quot; section: https://bugs.webkit.org/show_bug.cgi?id=210345

* [GTK][WPE] Replace evil strtok() calls with fscanf() in MemoryPressureMonitor.cpp: https://bugs.webkit.org/show_bug.cgi?id=210346



Let&apos;s keep the scope of this ticket in the replacement of the fopen/fclose logic with fopen/fseek. WDYT?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1640357</commentid>
    <comment_count>20</comment_count>
    <who name="Adrian Perez">aperez</who>
    <bug_when>2020-04-10 14:13:10 -0700</bug_when>
    <thetext>(In reply to Pablo Saavedra from comment #19)
&gt; (In reply to Adrian Perez from comment #18)
&gt; &gt; Comment on attachment 395550 [details]
&gt; 
&gt; 
&gt; Thanks Adrián for your review and, of course, for your suggestions. I&apos;d
&gt; prefer avoid the usage this ticket to fix those things. Instance of that I
&gt; created this 2 new tickets to address the issues described by you:
&gt; 
&gt; * [GTK][WPE] lowWatermarkPages() in MemoryPressureMonitor.cpp only searches
&gt; the &quot;low&quot; value inside the first &quot;Node&quot; section:
&gt; https://bugs.webkit.org/show_bug.cgi?id=210345
&gt; 
&gt; * [GTK][WPE] Replace evil strtok() calls with fscanf() in
&gt; MemoryPressureMonitor.cpp: https://bugs.webkit.org/show_bug.cgi?id=210346
&gt;
&gt; Let&apos;s keep the scope of this ticket in the replacement of the fopen/fclose
&gt; logic with fopen/fseek. WDYT?

Sounds good to me, let&apos;s go ahead and do one step at a time 👍️</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1640493</commentid>
    <comment_count>21</comment_count>
    <who name="EWS">ews-feeder</who>
    <bug_when>2020-04-10 23:56:29 -0700</bug_when>
    <thetext>Committed r259923: &lt;https://trac.webkit.org/changeset/259923&gt;

All reviewed patches have been landed. Closing bug and clearing flags on attachment 395550.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1640494</commentid>
    <comment_count>22</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2020-04-10 23:57:15 -0700</bug_when>
    <thetext>&lt;rdar://problem/61625949&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>395329</attachid>
            <date>2020-04-02 17:32:41 -0700</date>
            <delta_ts>2020-04-05 02:55:58 -0700</delta_ts>
            <desc>patch</desc>
            <filename>bug-209942-20200403023240.patch</filename>
            <type>text/plain</type>
            <size>18145</size>
            <attacher name="Pablo Saavedra">psaavedra</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjU5NDI4CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCmluZGV4IDE1MGZiMGQxMGNiOTUzZWQx
ZGRjY2YyYTI3NmYzOTI5MmU1ZGJiMDQuLmQ2Yzc3NTljMGY3ZmZiMzAzODU3YTI5YWNkNGE4Zjll
OGY4MzY4NWMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCisrKyBiL1NvdXJj
ZS9XZWJLaXQvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNDUgQEAKKzIwMjAtMDQtMDIgIFBhYmxvIFNh
YXZlZHJhICA8cHNhYXZlZHJhQGlnYWxpYS5jb20+CisKKyAgICAgICAgW0dUS11bV1BFXSBSZXBs
YWNlIGZvcGVuL2ZjbG9zZSBieSBmb3Blbi9mc2VlayBmdW5jdGlvbnMgaW4gTWVtb3J5UHJlc3N1
cmVNb25pdG9yCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD0yMDk5NDIKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAg
ICBSZXBsYWNpbmcgdGhlIG9wZW4oKS9jbG9zZSgpIGxvZ2ljIHRvIGdldCB0aGUgZGF0YSBmcm9t
IC9wcm9jL21lbWluZm8sCisgICAgICAgIC9wcm9jL3NlbGYvY2dyb3VwLCAuLi4gd2l0aCBhIG5l
dyBsb2dpYyB3aGVyZSB0aGUgZmlsZXMgYXJlIGp1c3QKKyAgICAgICAgb3BlbmVkIG9uY2UgYW5k
IHdlIGp1c3QgcGVyZm9ybSBhIHNlZWsgdG8gdGhlIGluaXRpYWwgcG9zaXRpb24gb2YKKyAgICAg
ICAgb2YgYSBmbHVzaGVkIGZpbGUuCisKKyAgICAgICAgQWxzbyByZWZhY3RvcmluZyBvZiBzb21l
IGxvZ2ljOgorCisgICAgICAgIC0gQWRkZWQgdGhlIENHcm91cE1lbW9yeUNvbnRyb2xsZXIgY2xh
c3Mgd2hhdCBlbmNhcHN1bGF0ZXMgdGhlIGxvZ2ljCisgICAgICAgICAgdG8gY2FsY3VsYXRlIHRo
ZSB0aGUgdG90YWwgbWVtb3J5IGFuZCB0aGUgbWVtb3J5IHVzYWdlIHdpdGgKKyAgICAgICAgICBj
Z3JvdXBzLgorICAgICAgICAtIENHcm91cE1lbW9yeUNvbnRyb2xsZXIgZW5jcGFzdWxhdGVzIHRo
ZSBGSUxFIHBvaW50ZXJzIHRvIHRoZQorICAgICAgICAgIHJlbGF0aXZlIGZpbGVzIHRvIGNncm91
cHMuCisgICAgICAgIC0gVGhlIG1lbUluZm9GaWxlLCB6b25lSW5mb0ZpbGUgYW5kIGNncm91cENv
bnRyb2xsZXJGaWxlIGFyZSBub3cKKyAgICAgICAgICBvcGVuZWQgb25jZSBpbiB0aGUgVGhyZWFk
OjpjcmVhdGUoKSBpbnZva2VkIGJ5IHRoZQorICAgICAgICAgIE1lbW9yeVByZXNzdXJlTW9uaXRv
cjo6c3RhcnQoKS4KKworICAgICAgICAqIFVJUHJvY2Vzcy9saW51eC9NZW1vcnlQcmVzc3VyZU1v
bml0b3IuY3BwOgorICAgICAgICAoV2ViS2l0Ojpsb3dXYXRlcm1hcmtQYWdlcyk6CisgICAgICAg
IChXZWJLaXQ6OmNhbGN1bGF0ZU1lbW9yeUF2YWlsYWJsZSk6CisgICAgICAgIChXZWJLaXQ6Omdl
dENncm91cEZpbGUpOgorICAgICAgICAoV2ViS2l0OjpnZXRDZ3JvdXBDb250cm9sbGVyUGF0aCk6
CisgICAgICAgIChXZWJLaXQ6OnN5c3RlbU1lbW9yeVVzZWRBc1BlcmNlbnRhZ2UpOgorICAgICAg
ICAoV2ViS2l0OjpNZW1vcnlQcmVzc3VyZU1vbml0b3I6OnN0YXJ0KToKKyAgICAgICAgKFdlYktp
dDo6Q0dyb3VwTWVtb3J5Q29udHJvbGxlcjo6c2V0TWVtb3J5Q29udHJvbGxlclBhdGgpOgorICAg
ICAgICAoV2ViS2l0OjpDR3JvdXBNZW1vcnlDb250cm9sbGVyOjpkaXNwb3NlTWVtb3J5Q29udHJv
bGxlcik6CisgICAgICAgIChXZWJLaXQ6OkNHcm91cE1lbW9yeUNvbnRyb2xsZXI6OmdldENncm91
cEZpbGVWYWx1ZSk6CisgICAgICAgIChXZWJLaXQ6OkNHcm91cE1lbW9yeUNvbnRyb2xsZXI6Omdl
dE1lbW9yeVRvdGFsV2l0aENncm91cCk6CisgICAgICAgIChXZWJLaXQ6OkNHcm91cE1lbW9yeUNv
bnRyb2xsZXI6OmdldE1lbW9yeVVzYWdlV2l0aENncm91cCk6CisgICAgICAgIChXZWJLaXQ6Omdl
dENncm91cEZpbGVWYWx1ZSk6IERlbGV0ZWQuCisgICAgICAgIChXZWJLaXQ6OmdldE1lbW9yeVRv
dGFsV2l0aENncm91cCk6IERlbGV0ZWQuCisgICAgICAgIChXZWJLaXQ6OmdldE1lbW9yeVVzYWdl
V2l0aENncm91cCk6IERlbGV0ZWQuCisgICAgICAgICogVUlQcm9jZXNzL2xpbnV4L01lbW9yeVBy
ZXNzdXJlTW9uaXRvci5oOgorICAgICAgICAoV2ViS2l0OjpDR3JvdXBNZW1vcnlDb250cm9sbGVy
Ojppc0FjdGl2ZSk6CisgICAgICAgIChXZWJLaXQ6OkNHcm91cE1lbW9yeUNvbnRyb2xsZXI6On5D
R3JvdXBNZW1vcnlDb250cm9sbGVyKToKKwogMjAyMC0wNC0wMiAgUGVyIEFybmUgVm9sbGFuICA8
cHZvbGxhbkBhcHBsZS5jb20+CiAKICAgICAgICAgVW5yZXZpZXdlZCBidWlsZCBmaXggYWZ0ZXIg
cjI1OTM5Ni4KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL2xpbnV4L01lbW9y
eVByZXNzdXJlTW9uaXRvci5jcHAgYi9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9saW51eC9NZW1v
cnlQcmVzc3VyZU1vbml0b3IuY3BwCmluZGV4IDRmODhjZDg3NDY0ZDFlYjYzZDU5NGVhYmQzMjFm
MDczMzA5N2E3OWEuLmNkZDJiOWFkNjNjN2ZkYjEzNjM0ZjI5ZTMzZWZmMzhlNTUzZGZhNWIgMTAw
NjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL2xpbnV4L01lbW9yeVByZXNzdXJlTW9u
aXRvci5jcHAKKysrIGIvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvbGludXgvTWVtb3J5UHJlc3N1
cmVNb25pdG9yLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYs
IDIwMTggSWdhbGlhIFMuTC4KKyAqIENvcHlyaWdodCAoQykgMjAxNiwgMjAxOCwgMjAyMCBJZ2Fs
aWEgUy5MLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC01MSwyMCArNTEsMjYg
QEAgc3RhdGljIGNvbnN0IGludCBzX21lbW9yeVByZXN1cmVQZXJjZW50YWdlVGhyZXNob2xkQ3Jp
dGljYWwgPSA5NTsKIC8vIGNncm91cHMuNzogVGhlIHVzdWFsIHBsYWNlIGZvciBzdWNoIG1vdW50
cyBpcyB1bmRlciBhIHRtcGZzKDUpCiAvLyBmaWxlc3lzdGVtIG1vdW50ZWQgYXQgL3N5cy9mcy9j
Z3JvdXAuCiBzdGF0aWMgY29uc3QgY2hhciogc19jZ3JvdXBNZW1vcnlQYXRoID0gIi9zeXMvZnMv
Y2dyb3VwLyVzLyVzLyVzIjsKLXN0YXRpYyBjb25zdCBjaGFyKiBzX2Nncm91cENvbnRyb2xsZXIg
PSAiL3Byb2Mvc2VsZi9jZ3JvdXAiOworc3RhdGljIGNvbnN0IGNoYXIqIHNfcHJvY01lbWluZm8g
PSAiL3Byb2MvbWVtaW5mbyI7CitzdGF0aWMgY29uc3QgY2hhciogc19wcm9jWm9uZWluZm8gPSAi
L3Byb2Mvem9uZWluZm8iOworc3RhdGljIGNvbnN0IGNoYXIqIHNfcHJvY1NlbGZDZ3JvdXAgPSAi
L3Byb2Mvc2VsZi9jZ3JvdXAiOwogc3RhdGljIGNvbnN0IHVuc2lnbmVkIG1heENncm91cFBhdGgg
PSA0MDk2OyAvLyBQQVRIX01BWCA9IDQwOTYgZnJvbSAoTGludXgpIGluY2x1ZGUvdWFwaS9saW51
eC9saW1pdHMuaAogCi1zdGF0aWMgc2l6ZV90IGxvd1dhdGVybWFya1BhZ2VzKCkKK3N0YXRpYyBz
aXplX3QgbG93V2F0ZXJtYXJrUGFnZXMoRklMRSogem9uZUluZm9GaWxlKQogewotICAgIEZJTEUq
IGZpbGUgPSBmb3BlbigiL3Byb2Mvem9uZWluZm8iLCAiciIpOwotICAgIGlmICghZmlsZSkKKyAg
ICBpZiAoIXpvbmVJbmZvRmlsZSkKKyAgICAgICAgcmV0dXJuIG5vdFNldDsKKworICAgIGlmICgh
ZnNlZWsoem9uZUluZm9GaWxlLCAwLCBTRUVLX1NFVCkpCiAgICAgICAgIHJldHVybiBub3RTZXQ7
CiAKKyAgICBmZmx1c2goem9uZUluZm9GaWxlKTsKKwogICAgIHNpemVfdCBsb3cgPSAwOwogICAg
IGJvb2wgaW5ab25lID0gZmFsc2U7CiAgICAgYm9vbCBmb3VuZExvdyA9IGZhbHNlOwogICAgIGNo
YXIgYnVmZmVyWzEyOF07Ci0gICAgd2hpbGUgKGNoYXIqIGxpbmUgPSBmZ2V0cyhidWZmZXIsIDEy
OCwgZmlsZSkpIHsKKyAgICB3aGlsZSAoY2hhciogbGluZSA9IGZnZXRzKGJ1ZmZlciwgMTI4LCB6
b25lSW5mb0ZpbGUpKSB7CiAgICAgICAgIGlmICghc3RybmNtcChsaW5lLCAiTm9kZSIsIDQpKSB7
CiAgICAgICAgICAgICBpblpvbmUgPSB0cnVlOwogICAgICAgICAgICAgZm91bmRMb3cgPSBmYWxz
ZTsKQEAgLTkyLDcgKzk4LDYgQEAgc3RhdGljIHNpemVfdCBsb3dXYXRlcm1hcmtQYWdlcygpCiAg
ICAgICAgICAgICBmb3VuZExvdyA9IHRydWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgZmNsb3Nl
KGZpbGUpOwogCiAgICAgcmV0dXJuIGxvdzsKIH0KQEAgLTEwOCwxMiArMTEzLDEyIEBAIHN0YXRp
YyBpbmxpbmUgc2l6ZV90IHN5c3RlbVBhZ2VTaXplKCkKIC8vIElmIE1lbUF2YWlsYWJsZSB3YXMg
bm90IHByZXNlbnQgaW4gL3Byb2MvbWVtaW5mbywgYmVjYXVzZSBpdCdzIGFuIG9sZCBrZXJuZWwg
dmVyc2lvbiwKIC8vIHdlIGNhbiBkbyB0aGUgc2FtZSBjYWxjdWxhdGlvbiB3aXRoIHRoZSBpbmZv
cm1hdGlvbiB3ZSBoYXZlIGZyb20gbWVtaW5mbyBhbmQgdGhlIGxvdyB3YXRlcm1ha3MuCiAvLyBT
ZWUgaHR0cHM6Ly9naXQua2VybmVsLm9yZy9jZ2l0L2xpbnV4L2tlcm5lbC9naXQvdG9ydmFsZHMv
bGludXguZ2l0L2NvbW1pdC8/aWQ9MzRlNDMxYjBhZTM5OGZjNTRlYTY5ZmY4NWVjNzAwNzIyYzlk
YTc3Mwotc3RhdGljIHNpemVfdCBjYWxjdWxhdGVNZW1vcnlBdmFpbGFibGUoc2l6ZV90IG1lbW9y
eUZyZWUsIHNpemVfdCBhY3RpdmVGaWxlLCBzaXplX3QgaW5hY3RpdmVGaWxlLCBzaXplX3Qgc2xh
YlJlY2xhaW1hYmxlKQorc3RhdGljIHNpemVfdCBjYWxjdWxhdGVNZW1vcnlBdmFpbGFibGUoc2l6
ZV90IG1lbW9yeUZyZWUsIHNpemVfdCBhY3RpdmVGaWxlLCBzaXplX3QgaW5hY3RpdmVGaWxlLCBz
aXplX3Qgc2xhYlJlY2xhaW1hYmxlLCBGSUxFKiB6b25lSW5mb0ZpbGUpCiB7CiAgICAgaWYgKG1l
bW9yeUZyZWUgPT0gbm90U2V0IHx8IGFjdGl2ZUZpbGUgPT0gbm90U2V0IHx8IGluYWN0aXZlRmls
ZSA9PSBub3RTZXQgfHwgc2xhYlJlY2xhaW1hYmxlID09IG5vdFNldCkKICAgICAgICAgcmV0dXJu
IG5vdFNldDsKIAotICAgIHNpemVfdCBsb3dXYXRlcm1hcmsgPSBsb3dXYXRlcm1hcmtQYWdlcygp
OworICAgIHNpemVfdCBsb3dXYXRlcm1hcmsgPSBsb3dXYXRlcm1hcmtQYWdlcyh6b25lSW5mb0Zp
bGUpOwogICAgIGlmIChsb3dXYXRlcm1hcmsgPT0gbm90U2V0KQogICAgICAgICByZXR1cm4gbm90
U2V0OwogCkBAIC0xMzYsNzUgKzE0MSwxMSBAQCBzdGF0aWMgc2l6ZV90IGNhbGN1bGF0ZU1lbW9y
eUF2YWlsYWJsZShzaXplX3QgbWVtb3J5RnJlZSwgc2l6ZV90IGFjdGl2ZUZpbGUsIHNpegogICAg
IHJldHVybiBtZW1vcnlBdmFpbGFibGU7CiB9CiAKLQotc2l6ZV90IGdldENncm91cEZpbGVWYWx1
ZShDU3RyaW5nIGNncm91cENvbnRyb2xsZXJOYW1lLCBDU3RyaW5nIGNncm91cENvbnRyb2xsZXJQ
YXRoLCBDU3RyaW5nIGNncm91cEZpbGVOYW1lKQorRklMRSogZ2V0Q2dyb3VwRmlsZShDU3RyaW5n
IGNncm91cENvbnRyb2xsZXJOYW1lLCBDU3RyaW5nIGNncm91cENvbnRyb2xsZXJQYXRoLCBDU3Ry
aW5nIGNncm91cEZpbGVOYW1lKQogewotICAgIGNoYXIgYnVmZmVyWzEyOF07CiAgICAgY2hhciBj
Z3JvdXBQYXRoW21heENncm91cFBhdGhdOwotICAgIGNoYXIqIHRva2VuOwotICAgIEZJTEUqIGZp
bGU7Ci0gICAgYm9vbCBvayA9IHRydWU7Ci0KICAgICBzbnByaW50ZihjZ3JvdXBQYXRoLCBtYXhD
Z3JvdXBQYXRoLCBzX2Nncm91cE1lbW9yeVBhdGgsIGNncm91cENvbnRyb2xsZXJOYW1lLmRhdGEo
KSwgY2dyb3VwQ29udHJvbGxlclBhdGguZGF0YSgpLCBjZ3JvdXBGaWxlTmFtZS5kYXRhKCkpOwot
ICAgIGZpbGUgPSBmb3BlbihjZ3JvdXBQYXRoLCAiciIpOwotICAgIGlmIChmaWxlKSB7Ci0gICAg
ICAgIHRva2VuID0gZmdldHMoYnVmZmVyLCAxMjgsIGZpbGUpOwotICAgICAgICBmY2xvc2UoZmls
ZSk7Ci0gICAgICAgIHNpemVfdCB2YWx1ZSA9IHRvSW50ZWdyYWxUeXBlPHNpemVfdD4odG9rZW4s
IHN0cmxlbih0b2tlbiksICZvayk7Ci0gICAgICAgIGlmICghb2spCi0gICAgICAgICAgICB2YWx1
ZSA9IG5vdFNldDsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLSAgICByZXR1cm4gbm90
U2V0OwotfQotCi1zaXplX3QgZ2V0TWVtb3J5VG90YWxXaXRoQ2dyb3VwKENTdHJpbmcgbWVtb3J5
Q29udHJvbGxlck5hbWUpCi17Ci0gICAgc2l6ZV90IHZhbHVlID0gbm90U2V0OwotCi0gICAgLy8g
Q2hlY2sgbWVtb3J5IGxpbWl0cyBpbiBjZ3JvdXBWMgotICAgIHZhbHVlID0gZ2V0Q2dyb3VwRmls
ZVZhbHVlKCIvIiwgbWVtb3J5Q29udHJvbGxlck5hbWUsIENTdHJpbmcoIm1lbW9yeS5tZW1zdy5t
YXgiKSk7Ci0gICAgaWYgKHZhbHVlICE9IG5vdFNldCkKLSAgICAgICAgcmV0dXJuIHZhbHVlOwot
Ci0gICAgdmFsdWUgPSBnZXRDZ3JvdXBGaWxlVmFsdWUoIi8iLCBtZW1vcnlDb250cm9sbGVyTmFt
ZSwgQ1N0cmluZygibWVtb3J5Lm1heCIpKTsKLSAgICBzaXplX3QgdmFsdWVIaWdoID0gZ2V0Q2dy
b3VwRmlsZVZhbHVlKCIvIiwgbWVtb3J5Q29udHJvbGxlck5hbWUsIENTdHJpbmcoIm1lbW9yeS5o
aWdoIikpOwotICAgIGlmICh2YWx1ZSAhPSBub3RTZXQgJiYgdmFsdWVIaWdoICE9IG5vdFNldCkg
ewotICAgICAgICB2YWx1ZSA9IHN0ZDo6bWluKHZhbHVlLCB2YWx1ZUhpZ2gpOwotICAgICAgICBy
ZXR1cm4gdmFsdWU7Ci0gICAgfQotICAgIGlmICh2YWx1ZUhpZ2ggIT0gbm90U2V0KQotICAgICAg
ICByZXR1cm4gdmFsdWVIaWdoOwotICAgIGlmICh2YWx1ZSAhPSBub3RTZXQpCi0gICAgICAgIHJl
dHVybiB2YWx1ZTsKLQotICAgIC8vIENoZWNrIG1lbW9yeSBsaW1pdHMgaW4gY2dyb3VwVjEKLSAg
ICB2YWx1ZSA9IGdldENncm91cEZpbGVWYWx1ZSgibWVtb3J5IiwgbWVtb3J5Q29udHJvbGxlck5h
bWUsIENTdHJpbmcoIm1lbW9yeS5tZW1zdy5saW1pdF9pbl9ieXRlcyIpKTsKLSAgICBpZiAodmFs
dWUgIT0gbm90U2V0KQotICAgICAgICByZXR1cm4gdmFsdWU7Ci0KLSAgICB2YWx1ZSA9IGdldENn
cm91cEZpbGVWYWx1ZSgibWVtb3J5IiwgbWVtb3J5Q29udHJvbGxlck5hbWUsIENTdHJpbmcoIm1l
bW9yeS5saW1pdF9pbl9ieXRlcyIpKTsKLSAgICBpZiAodmFsdWUgIT0gbm90U2V0KQotICAgICAg
ICByZXR1cm4gdmFsdWU7Ci0KLSAgICByZXR1cm4gdmFsdWU7Ci19Ci0KLXN0YXRpYyBzaXplX3Qg
Z2V0TWVtb3J5VXNhZ2VXaXRoQ2dyb3VwKENTdHJpbmcgbWVtb3J5Q29udHJvbGxlck5hbWUpCi17
Ci0gICAgc2l6ZV90IHZhbHVlID0gbm90U2V0OwotCi0gICAgLy8gQ2hlY2sgbWVtb3J5IGxpbWl0
cyBpbiBjZ3JvdXBWMgotICAgIHZhbHVlID0gZ2V0Q2dyb3VwRmlsZVZhbHVlKCIvIiwgbWVtb3J5
Q29udHJvbGxlck5hbWUsIENTdHJpbmcoIm1lbW9yeS5jdXJyZW50IikpOwotICAgIGlmICh2YWx1
ZSAhPSBub3RTZXQpCi0gICAgICAgIHJldHVybiB2YWx1ZTsKLQotICAgIC8vIENoZWNrIG1lbW9y
eSBsaW1pdHMgaW4gY2dyb3VwVjEKLSAgICB2YWx1ZSA9IGdldENncm91cEZpbGVWYWx1ZSgibWVt
b3J5IiwgbWVtb3J5Q29udHJvbGxlck5hbWUsIENTdHJpbmcoIm1lbW9yeS51c2FnZV9pbl9ieXRl
cyIpKTsKLSAgICBpZiAodmFsdWUgIT0gbm90U2V0KQotICAgICAgICByZXR1cm4gdmFsdWU7Ci0K
LSAgICByZXR1cm4gbm90U2V0OworICAgIHJldHVybiBmb3BlbihjZ3JvdXBQYXRoLCAiciIpOwog
fQogCiAvLyBUaGlzIGZpbGUgZGVzY3JpYmVzIGNvbnRyb2wgZ3JvdXBzIHRvIHdoaWNoIHRoZSBw
cm9jZXNzIHdpdGgKQEAgLTIyNywxNSArMTY4LDE5IEBAIHN0YXRpYyBzaXplX3QgZ2V0TWVtb3J5
VXNhZ2VXaXRoQ2dyb3VwKENTdHJpbmcgbWVtb3J5Q29udHJvbGxlck5hbWUpCiAvLyAyOmNwdXNl
dDovCiAvLyAxOm5hbWU9c3lzdGVtZDovdXNlci5zbGljZS91c2VyLTEwMDAuc2xpY2UvdXNlckAx
MDAwLnNlcnZpY2UvZ25vbWUtdGVybWluYWwtc2VydmVyLnNlcnZpY2UKIC8vIDA6Oi91c2VyLnNs
aWNlL3VzZXItMTAwMC5zbGljZS91c2VyQDEwMDAuc2VydmljZS9nbm9tZS10ZXJtaW5hbC1zZXJ2
ZXIuc2VydmljZQotc3RhdGljIENTdHJpbmcgZ2V0Q2dyb3VwQ29udHJvbGxlclBhdGgoY29uc3Qg
Y2hhciogY29udHJvbGxlck5hbWUpCitzdGF0aWMgQ1N0cmluZyBnZXRDZ3JvdXBDb250cm9sbGVy
UGF0aChGSUxFKiBjZ3JvdXBDb250cm9sbGVyRmlsZSwgY29uc3QgY2hhciogY29udHJvbGxlck5h
bWUpCiB7Ci0gICAgQ1N0cmluZyBtZW1vcnlDb250cm9sbGVyUGF0aDsKLSAgICBGSUxFKiBmaWxl
ID0gZm9wZW4oc19jZ3JvdXBDb250cm9sbGVyLCAiciIpOwotICAgIGlmICghZmlsZSkKKyAgICBD
U3RyaW5nIGNncm91cE1lbW9yeUNvbnRyb2xsZXJQYXRoOworICAgIGlmICghY2dyb3VwQ29udHJv
bGxlckZpbGUpCisgICAgICAgIHJldHVybiBDU3RyaW5nKCk7CisKKyAgICBpZiAoIWZzZWVrKGNn
cm91cENvbnRyb2xsZXJGaWxlLCAwLCBTRUVLX1NFVCkpCiAgICAgICAgIHJldHVybiBDU3RyaW5n
KCk7CiAKKyAgICBmZmx1c2goY2dyb3VwQ29udHJvbGxlckZpbGUpOworCiAgICAgY2hhciBidWZm
ZXJbbWF4Q2dyb3VwUGF0aF07Ci0gICAgd2hpbGUgKGNoYXIqIGxpbmUgPSBmZ2V0cyhidWZmZXIs
IG1heENncm91cFBhdGgsIGZpbGUpKSB7CisgICAgd2hpbGUgKGNoYXIqIGxpbmUgPSBmZ2V0cyhi
dWZmZXIsIG1heENncm91cFBhdGgsIGNncm91cENvbnRyb2xsZXJGaWxlKSkgewogICAgICAgICBj
aGFyKiB0b2tlbiA9IHN0cnRvayhsaW5lLCAiXG4iKTsKICAgICAgICAgaWYgKCF0b2tlbikKICAg
ICAgICAgICAgIGJyZWFrOwpAQCAtMjQ0LDMwICsxODksMzIgQEAgc3RhdGljIENTdHJpbmcgZ2V0
Q2dyb3VwQ29udHJvbGxlclBhdGgoY29uc3QgY2hhciogY29udHJvbGxlck5hbWUpCiAgICAgICAg
IHRva2VuID0gc3RydG9rKG51bGxwdHIsICI6Iik7CiAgICAgICAgIGlmICghc3RyY21wKHRva2Vu
LCBjb250cm9sbGVyTmFtZSkpIHsKICAgICAgICAgICAgIHRva2VuID0gc3RydG9rKG51bGxwdHIs
ICI6Iik7Ci0gICAgICAgICAgICBtZW1vcnlDb250cm9sbGVyUGF0aCA9IENTdHJpbmcodG9rZW4p
OwotICAgICAgICAgICAgZmNsb3NlKGZpbGUpOwotICAgICAgICAgICAgcmV0dXJuIG1lbW9yeUNv
bnRyb2xsZXJQYXRoOworICAgICAgICAgICAgY2dyb3VwTWVtb3J5Q29udHJvbGxlclBhdGggPSBD
U3RyaW5nKHRva2VuKTsKKyAgICAgICAgICAgIHJldHVybiBjZ3JvdXBNZW1vcnlDb250cm9sbGVy
UGF0aDsKICAgICAgICAgfQogICAgICAgICBpZiAoIXN0cm5jbXAodG9rZW4sICJuYW1lPXN5c3Rl
bWQiLCAxMikpIHsKICAgICAgICAgICAgIHRva2VuID0gc3RydG9rKG51bGxwdHIsICI6Iik7Ci0g
ICAgICAgICAgICBtZW1vcnlDb250cm9sbGVyUGF0aCA9IENTdHJpbmcodG9rZW4pOworICAgICAg
ICAgICAgY2dyb3VwTWVtb3J5Q29udHJvbGxlclBhdGggPSBDU3RyaW5nKHRva2VuKTsKICAgICAg
ICAgfQogICAgIH0KLSAgICBmY2xvc2UoZmlsZSk7Ci0gICAgcmV0dXJuIG1lbW9yeUNvbnRyb2xs
ZXJQYXRoOworICAgIHJldHVybiBjZ3JvdXBNZW1vcnlDb250cm9sbGVyUGF0aDsKIH0KIAogCi1z
dGF0aWMgaW50IHN5c3RlbU1lbW9yeVVzZWRBc1BlcmNlbnRhZ2UoKQorc3RhdGljIGludCBzeXN0
ZW1NZW1vcnlVc2VkQXNQZXJjZW50YWdlKEZJTEUqIG1lbUluZm9GaWxlLCBGSUxFKiB6b25lSW5m
b0ZpbGUsIENHcm91cE1lbW9yeUNvbnRyb2xsZXIqIG1lbW9yeUNvbnRyb2xsZXIpCiB7Ci0gICAg
RklMRSogZmlsZSA9IGZvcGVuKCIvcHJvYy9tZW1pbmZvIiwgInIiKTsKLSAgICBpZiAoIWZpbGUp
CisgICAgaWYgKCFtZW1JbmZvRmlsZSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgaWYgKCFm
c2VlayhtZW1JbmZvRmlsZSwgMCwgU0VFS19TRVQpKQogICAgICAgICByZXR1cm4gLTE7CiAKKyAg
ICBmZmx1c2gobWVtSW5mb0ZpbGUpOworCiAgICAgc2l6ZV90IG1lbW9yeUF2YWlsYWJsZSwgbWVt
b3J5VG90YWwsIG1lbW9yeUZyZWUsIGFjdGl2ZUZpbGUsIGluYWN0aXZlRmlsZSwgc2xhYlJlY2xh
aW1hYmxlOwogICAgIG1lbW9yeUF2YWlsYWJsZSA9IG1lbW9yeVRvdGFsID0gbWVtb3J5RnJlZSA9
IGFjdGl2ZUZpbGUgPSBpbmFjdGl2ZUZpbGUgPSBzbGFiUmVjbGFpbWFibGUgPSBub3RTZXQ7CiAg
ICAgY2hhciBidWZmZXJbMTI4XTsKLSAgICB3aGlsZSAoY2hhciogbGluZSA9IGZnZXRzKGJ1ZmZl
ciwgMTI4LCBmaWxlKSkgeworICAgIHdoaWxlIChjaGFyKiBsaW5lID0gZmdldHMoYnVmZmVyLCAx
MjgsIG1lbUluZm9GaWxlKSkgewogICAgICAgICBjaGFyKiB0b2tlbiA9IHN0cnRvayhsaW5lLCAi
ICIpOwogICAgICAgICBib29sIG9rID0gdHJ1ZTsKICAgICAgICAgaWYgKCF0b2tlbikKQEAgLTMy
MSwxMyArMjY4LDEyIEBAIHN0YXRpYyBpbnQgc3lzdGVtTWVtb3J5VXNlZEFzUGVyY2VudGFnZSgp
CiAgICAgICAgIGlmIChtZW1vcnlUb3RhbCAhPSBub3RTZXQgJiYgbWVtb3J5RnJlZSAhPSBub3RT
ZXQgJiYgYWN0aXZlRmlsZSAhPSBub3RTZXQgJiYgaW5hY3RpdmVGaWxlICE9IG5vdFNldCAmJiBz
bGFiUmVjbGFpbWFibGUgIT0gbm90U2V0KQogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQotICAg
IGZjbG9zZShmaWxlKTsKIAogICAgIGlmICghbWVtb3J5VG90YWwgfHwgbWVtb3J5VG90YWwgPT0g
bm90U2V0KQogICAgICAgICByZXR1cm4gLTE7CiAKICAgICBpZiAobWVtb3J5QXZhaWxhYmxlID09
IG5vdFNldCkgewotICAgICAgICBtZW1vcnlBdmFpbGFibGUgPSBjYWxjdWxhdGVNZW1vcnlBdmFp
bGFibGUobWVtb3J5RnJlZSwgYWN0aXZlRmlsZSwgaW5hY3RpdmVGaWxlLCBzbGFiUmVjbGFpbWFi
bGUpOworICAgICAgICBtZW1vcnlBdmFpbGFibGUgPSBjYWxjdWxhdGVNZW1vcnlBdmFpbGFibGUo
bWVtb3J5RnJlZSwgYWN0aXZlRmlsZSwgaW5hY3RpdmVGaWxlLCBzbGFiUmVjbGFpbWFibGUsIHpv
bmVJbmZvRmlsZSk7CiAgICAgICAgIGlmIChtZW1vcnlBdmFpbGFibGUgPT0gbm90U2V0KQogICAg
ICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KQEAgLTMzNiwxMCArMjgyLDkgQEAgc3RhdGljIGlu
dCBzeXN0ZW1NZW1vcnlVc2VkQXNQZXJjZW50YWdlKCkKICAgICAgICAgcmV0dXJuIC0xOwogCiAg
ICAgaW50IG1lbW9yeVVzYWdlUGVyY2VudGFnZSA9ICgobWVtb3J5VG90YWwgLSBtZW1vcnlBdmFp
bGFibGUpICogMTAwKSAvIG1lbW9yeVRvdGFsOwotICAgIENTdHJpbmcgbWVtb3J5Q29udHJvbGxl
clBhdGggPSBnZXRDZ3JvdXBDb250cm9sbGVyUGF0aCgibWVtb3J5Iik7Ci0gICAgaWYgKCFtZW1v
cnlDb250cm9sbGVyUGF0aC5pc051bGwoKSkgewotICAgICAgICBtZW1vcnlUb3RhbCA9IGdldE1l
bW9yeVRvdGFsV2l0aENncm91cChtZW1vcnlDb250cm9sbGVyUGF0aCk7Ci0gICAgICAgIHNpemVf
dCBtZW1vcnlVc2FnZSA9IGdldE1lbW9yeVVzYWdlV2l0aENncm91cChtZW1vcnlDb250cm9sbGVy
UGF0aCk7CisgICAgaWYgKG1lbW9yeUNvbnRyb2xsZXItPmlzQWN0aXZlKCkpIHsKKyAgICAgICAg
bWVtb3J5VG90YWwgPSBtZW1vcnlDb250cm9sbGVyLT5nZXRNZW1vcnlUb3RhbFdpdGhDZ3JvdXAo
KTsKKyAgICAgICAgc2l6ZV90IG1lbW9yeVVzYWdlID0gbWVtb3J5Q29udHJvbGxlci0+Z2V0TWVt
b3J5VXNhZ2VXaXRoQ2dyb3VwKCk7CiAgICAgICAgIGlmIChtZW1vcnlUb3RhbCAhPSBub3RTZXQg
JiYgbWVtb3J5VXNhZ2UgIT0gbm90U2V0KSB7CiAgICAgICAgICAgICBpbnQgbWVtb3J5VXNhZ2VQ
ZXJjZW50YWdlV2l0aENncm91cCA9IDEwMCAqICgoZmxvYXQpIG1lbW9yeVVzYWdlIC8gKGZsb2F0
KSBtZW1vcnlUb3RhbCk7CiAgICAgICAgICAgICBpZiAobWVtb3J5VXNhZ2VQZXJjZW50YWdlV2l0
aENncm91cCA+IG1lbW9yeVVzYWdlUGVyY2VudGFnZSkKQEAgLTM3NywxMSArMzIyLDE4IEBAIHZv
aWQgTWVtb3J5UHJlc3N1cmVNb25pdG9yOjpzdGFydCgpCiAgICAgbV9zdGFydGVkID0gdHJ1ZTsK
IAogICAgIFRocmVhZDo6Y3JlYXRlKCJNZW1vcnlQcmVzc3VyZU1vbml0b3IiLCBbXSB7CisgICAg
ICAgIEZJTEUqIG1lbUluZm9GaWxlID0gZm9wZW4oc19wcm9jTWVtaW5mbywgInIiKTsKKyAgICAg
ICAgRklMRSogem9uZUluZm9GaWxlID0gZm9wZW4oc19wcm9jWm9uZWluZm8sICJyIik7CisgICAg
ICAgIEZJTEUqIGNncm91cENvbnRyb2xsZXJGaWxlID0gZm9wZW4oc19wcm9jU2VsZkNncm91cCwg
InIiKTsKKyAgICAgICAgQ0dyb3VwTWVtb3J5Q29udHJvbGxlciBtZW1vcnlDb250cm9sbGVyID0g
Q0dyb3VwTWVtb3J5Q29udHJvbGxlcigpOworCiAgICAgICAgIFNlY29uZHMgcG9sbEludGVydmFs
ID0gc19tYXhQb2xsaW5nSW50ZXJ2YWw7CiAgICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAg
ICAgICBzbGVlcChwb2xsSW50ZXJ2YWwpOwogCi0gICAgICAgICAgICBpbnQgdXNlZFBlcmNlbnRh
Z2UgPSBzeXN0ZW1NZW1vcnlVc2VkQXNQZXJjZW50YWdlKCk7CisgICAgICAgICAgICBDU3RyaW5n
IGNncm91cE1lbW9yeUNvbnRyb2xsZXJQYXRoID0gZ2V0Q2dyb3VwQ29udHJvbGxlclBhdGgoY2dy
b3VwQ29udHJvbGxlckZpbGUsICJtZW1vcnkiKTsKKyAgICAgICAgICAgIG1lbW9yeUNvbnRyb2xs
ZXIuc2V0TWVtb3J5Q29udHJvbGxlclBhdGgoY2dyb3VwTWVtb3J5Q29udHJvbGxlclBhdGgpOwor
ICAgICAgICAgICAgaW50IHVzZWRQZXJjZW50YWdlID0gc3lzdGVtTWVtb3J5VXNlZEFzUGVyY2Vu
dGFnZShtZW1JbmZvRmlsZSwgem9uZUluZm9GaWxlLCAmbWVtb3J5Q29udHJvbGxlcik7CiAgICAg
ICAgICAgICBpZiAodXNlZFBlcmNlbnRhZ2UgPT0gLTEpIHsKICAgICAgICAgICAgICAgICBXVEZM
b2dBbHdheXMoIkZhaWxlZCB0byBnZXQgdGhlIG1lbW9yeSB1c2FnZSIpOwogICAgICAgICAgICAg
ICAgIGJyZWFrOwpAQCAtMzk0LDkgKzM0NiwxMTcgQEAgdm9pZCBNZW1vcnlQcmVzc3VyZU1vbml0
b3I6OnN0YXJ0KCkKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHBvbGxJbnRlcnZhbCA9IHBv
bGxJbnRlcnZhbEZvclVzZWRNZW1vcnlQZXJjZW50YWdlKHVzZWRQZXJjZW50YWdlKTsKICAgICAg
ICAgfQorCisgICAgICAgIGZjbG9zZShtZW1JbmZvRmlsZSk7CisgICAgICAgIGZjbG9zZSh6b25l
SW5mb0ZpbGUpOworICAgICAgICBmY2xvc2UoY2dyb3VwQ29udHJvbGxlckZpbGUpOwogICAgIH0p
LT5kZXRhY2goKTsKIH0KIAordm9pZCBDR3JvdXBNZW1vcnlDb250cm9sbGVyOjpzZXRNZW1vcnlD
b250cm9sbGVyUGF0aChDU3RyaW5nIG1lbW9yeUNvbnRyb2xsZXJQYXRoKQoreworICAgIGlmICht
ZW1vcnlDb250cm9sbGVyUGF0aCA9PSBtX2Nncm91cE1lbW9yeUNvbnRyb2xsZXJQYXRoKQorICAg
ICAgICByZXR1cm47CisKKyAgICBtX2Nncm91cE1lbW9yeUNvbnRyb2xsZXJQYXRoID0gbWVtb3J5
Q29udHJvbGxlclBhdGg7CisgICAgZGlzcG9zZU1lbW9yeUNvbnRyb2xsZXIoKTsKKworICAgIG1f
Y2dyb3VwVjJNZW1vcnlDdXJyZW50RmlsZSA9IGdldENncm91cEZpbGUoIi8iLCBtZW1vcnlDb250
cm9sbGVyUGF0aCwgQ1N0cmluZygibWVtb3J5LmN1cnJlbnQiKSk7CisgICAgbV9jZ3JvdXBWMk1l
bW9yeU1lbXN3TWF4RmlsZSA9IGdldENncm91cEZpbGUoIi8iLCBtZW1vcnlDb250cm9sbGVyUGF0
aCwgQ1N0cmluZygibWVtb3J5Lm1lbXN3Lm1heCIpKTsKKyAgICBtX2Nncm91cFYyTWVtb3J5TWF4
RmlsZSA9IGdldENncm91cEZpbGUoIi8iLCBtZW1vcnlDb250cm9sbGVyUGF0aCwgQ1N0cmluZygi
bWVtb3J5Lm1heCIpKTsKKyAgICBtX2Nncm91cFYyTWVtb3J5SGlnaEZpbGUgPSBnZXRDZ3JvdXBG
aWxlKCIvIiwgbWVtb3J5Q29udHJvbGxlclBhdGgsIENTdHJpbmcoIm1lbW9yeS5oaWdoIikpOwor
CisgICAgbV9jZ3JvdXBNZW1vcnlNZW1zd0xpbWl0SW5CeXRlc0ZpbGUgPSBnZXRDZ3JvdXBGaWxl
KCJtZW1vcnkiLCBtZW1vcnlDb250cm9sbGVyUGF0aCwgQ1N0cmluZygibWVtb3J5Lm1lbXN3Lmxp
bWl0X2luX2J5dGVzIikpOworICAgIG1fY2dyb3VwTWVtb3J5TGltaXRJbkJ5dGVzRmlsZSA9IGdl
dENncm91cEZpbGUoIm1lbW9yeSIsIG1lbW9yeUNvbnRyb2xsZXJQYXRoLCBDU3RyaW5nKCJtZW1v
cnkubGltaXRfaW5fYnl0ZXMiKSk7CisgICAgbV9jZ3JvdXBNZW1vcnlVc2FnZUluQnl0ZXNGaWxl
ID0gZ2V0Q2dyb3VwRmlsZSgibWVtb3J5IiwgbWVtb3J5Q29udHJvbGxlclBhdGgsIENTdHJpbmco
Im1lbW9yeS51c2FnZV9pbl9ieXRlcyIpKTsKK30KKwordm9pZCBDR3JvdXBNZW1vcnlDb250cm9s
bGVyOjpkaXNwb3NlTWVtb3J5Q29udHJvbGxlcigpCit7CisgICAgaWYgKG1fY2dyb3VwTWVtb3J5
TWVtc3dMaW1pdEluQnl0ZXNGaWxlKQorICAgICAgICBmY2xvc2UobV9jZ3JvdXBNZW1vcnlNZW1z
d0xpbWl0SW5CeXRlc0ZpbGUpOworICAgIGlmIChtX2Nncm91cE1lbW9yeUxpbWl0SW5CeXRlc0Zp
bGUpCisgICAgICAgIGZjbG9zZShtX2Nncm91cE1lbW9yeUxpbWl0SW5CeXRlc0ZpbGUpOworICAg
IGlmIChtX2Nncm91cE1lbW9yeVVzYWdlSW5CeXRlc0ZpbGUpCisgICAgICAgIGZjbG9zZShtX2Nn
cm91cE1lbW9yeVVzYWdlSW5CeXRlc0ZpbGUpOworCisgICAgaWYgKG1fY2dyb3VwVjJNZW1vcnlN
ZW1zd01heEZpbGUpCisgICAgICAgIGZjbG9zZShtX2Nncm91cFYyTWVtb3J5TWVtc3dNYXhGaWxl
KTsKKyAgICBpZiAobV9jZ3JvdXBWMk1lbW9yeU1heEZpbGUpCisgICAgICAgIGZjbG9zZShtX2Nn
cm91cFYyTWVtb3J5TWF4RmlsZSk7CisgICAgaWYgKG1fY2dyb3VwVjJNZW1vcnlIaWdoRmlsZSkK
KyAgICAgICAgZmNsb3NlKG1fY2dyb3VwVjJNZW1vcnlIaWdoRmlsZSk7Cit9CisKK3NpemVfdCBD
R3JvdXBNZW1vcnlDb250cm9sbGVyOjpnZXRDZ3JvdXBGaWxlVmFsdWUoRklMRSAqZmlsZSkKK3sK
KyAgICBjaGFyIGJ1ZmZlclsxMjhdOworICAgIGNoYXIqIHRva2VuOworICAgIGJvb2wgb2sgPSB0
cnVlOworCisgICAgaWYgKCFmaWxlKQorICAgICAgICByZXR1cm4gbm90U2V0OworCisgICAgaWYg
KCFmc2VlayhmaWxlLCAwLCBTRUVLX1NFVCkpCisgICAgICAgIHJldHVybiBub3RTZXQ7CisKKyAg
ICBmZmx1c2goZmlsZSk7CisgICAgdG9rZW4gPSBmZ2V0cyhidWZmZXIsIDEyOCwgZmlsZSk7CisK
KyAgICBzaXplX3QgdmFsdWUgPSB0b0ludGVncmFsVHlwZTxzaXplX3Q+KHRva2VuLCBzdHJsZW4o
dG9rZW4pLCAmb2spOworICAgIGlmICghb2spCisgICAgICAgIHZhbHVlID0gbm90U2V0OworICAg
IHJldHVybiB2YWx1ZTsKK30KKworc2l6ZV90IENHcm91cE1lbW9yeUNvbnRyb2xsZXI6OmdldE1l
bW9yeVRvdGFsV2l0aENncm91cCgpCit7CisgICAgc2l6ZV90IHZhbHVlID0gbm90U2V0OworCisg
ICAgLy8gQ2hlY2sgbWVtb3J5IGxpbWl0cyBpbiBjZ3JvdXBWMgorICAgIHZhbHVlID0gZ2V0Q2dy
b3VwRmlsZVZhbHVlKG1fY2dyb3VwVjJNZW1vcnlNZW1zd01heEZpbGUpOworICAgIGlmICh2YWx1
ZSAhPSBub3RTZXQpCisgICAgICAgIHJldHVybiB2YWx1ZTsKKworICAgIHZhbHVlID0gZ2V0Q2dy
b3VwRmlsZVZhbHVlKG1fY2dyb3VwVjJNZW1vcnlNYXhGaWxlKTsKKyAgICBzaXplX3QgdmFsdWVI
aWdoID0gZ2V0Q2dyb3VwRmlsZVZhbHVlKG1fY2dyb3VwVjJNZW1vcnlIaWdoRmlsZSk7CisgICAg
aWYgKHZhbHVlICE9IG5vdFNldCAmJiB2YWx1ZUhpZ2ggIT0gbm90U2V0KSB7CisgICAgICAgIHZh
bHVlID0gc3RkOjptaW4odmFsdWUsIHZhbHVlSGlnaCk7CisgICAgICAgIHJldHVybiB2YWx1ZTsK
KyAgICB9CisgICAgaWYgKHZhbHVlSGlnaCAhPSBub3RTZXQpCisgICAgICAgIHJldHVybiB2YWx1
ZUhpZ2g7CisgICAgaWYgKHZhbHVlICE9IG5vdFNldCkKKyAgICAgICAgcmV0dXJuIHZhbHVlOwor
CisgICAgLy8gQ2hlY2sgbWVtb3J5IGxpbWl0cyBpbiBjZ3JvdXBWMQorICAgIHZhbHVlID0gZ2V0
Q2dyb3VwRmlsZVZhbHVlKG1fY2dyb3VwTWVtb3J5TWVtc3dMaW1pdEluQnl0ZXNGaWxlKTsKKyAg
ICBpZiAodmFsdWUgIT0gbm90U2V0KQorICAgICAgICByZXR1cm4gdmFsdWU7CisKKyAgICB2YWx1
ZSA9IGdldENncm91cEZpbGVWYWx1ZShtX2Nncm91cE1lbW9yeUxpbWl0SW5CeXRlc0ZpbGUpOwor
ICAgIGlmICh2YWx1ZSAhPSBub3RTZXQpCisgICAgICAgIHJldHVybiB2YWx1ZTsKKworICAgIHJl
dHVybiB2YWx1ZTsKK30KKworc2l6ZV90IENHcm91cE1lbW9yeUNvbnRyb2xsZXI6OmdldE1lbW9y
eVVzYWdlV2l0aENncm91cCgpCit7CisgICAgc2l6ZV90IHZhbHVlID0gbm90U2V0OworCisgICAg
Ly8gQ2hlY2sgbWVtb3J5IGxpbWl0cyBpbiBjZ3JvdXBWMgorICAgIHZhbHVlID0gZ2V0Q2dyb3Vw
RmlsZVZhbHVlKG1fY2dyb3VwVjJNZW1vcnlDdXJyZW50RmlsZSk7CisgICAgaWYgKHZhbHVlICE9
IG5vdFNldCkKKyAgICAgICAgcmV0dXJuIHZhbHVlOworCisgICAgLy8gQ2hlY2sgbWVtb3J5IGxp
bWl0cyBpbiBjZ3JvdXBWMQorICAgIHZhbHVlID0gZ2V0Q2dyb3VwRmlsZVZhbHVlKG1fY2dyb3Vw
TWVtb3J5VXNhZ2VJbkJ5dGVzRmlsZSk7CisgICAgaWYgKHZhbHVlICE9IG5vdFNldCkKKyAgICAg
ICAgcmV0dXJuIHZhbHVlOworCisgICAgcmV0dXJuIG5vdFNldDsKK30KIAogfSAvLyBuYW1lc3Bh
Y2UgV2ViS2l0CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL2xpbnV4L01l
bW9yeVByZXNzdXJlTW9uaXRvci5oIGIvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvbGludXgvTWVt
b3J5UHJlc3N1cmVNb25pdG9yLmgKaW5kZXggNjRjMWQ3ZDc4NjEzYjljZjY5MjQ5ZWE2YzRhZjBk
NjVmNWE3MzkxMy4uOGYzZDY1YzllNjZiZmVlNGFlZDBiYjZjZjVmOTU0Y2JkOGIxNDg3NCAxMDA2
NDQKLS0tIGEvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvbGludXgvTWVtb3J5UHJlc3N1cmVNb25p
dG9yLmgKKysrIGIvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvbGludXgvTWVtb3J5UHJlc3N1cmVN
b25pdG9yLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDE2IElnYWxp
YSBTLkwuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYsIDIwMjAgSWdhbGlhIFMuTC4KICAqCiAgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtNTAsNiArNTAsMzcgQEAgcHJpdmF0ZToKICAgICBi
b29sIG1fc3RhcnRlZCB7IGZhbHNlIH07CiB9OwogCitjbGFzcyBDR3JvdXBNZW1vcnlDb250cm9s
bGVyIHsKK3B1YmxpYzoKKyAgICBDR3JvdXBNZW1vcnlDb250cm9sbGVyKCkgPSBkZWZhdWx0Owor
ICAgIGJvb2wgaXNBY3RpdmUoKSB7IHJldHVybiAhbV9jZ3JvdXBNZW1vcnlDb250cm9sbGVyUGF0
aC5pc051bGwoKTsgfTsKKworICAgIHZvaWQgc2V0TWVtb3J5Q29udHJvbGxlclBhdGgoQ1N0cmlu
Zyk7CisKKyAgICBzaXplX3QgZ2V0TWVtb3J5VG90YWxXaXRoQ2dyb3VwKCk7CisgICAgc2l6ZV90
IGdldE1lbW9yeVVzYWdlV2l0aENncm91cCgpOworCisgICAgfkNHcm91cE1lbW9yeUNvbnRyb2xs
ZXIoKQorICAgIHsKKyAgICAgICAgZGlzcG9zZU1lbW9yeUNvbnRyb2xsZXIoKTsKKyAgICB9CisK
K3ByaXZhdGU6CisgICAgQ1N0cmluZyBtX2Nncm91cE1lbW9yeUNvbnRyb2xsZXJQYXRoOworCisg
ICAgRklMRSogbV9jZ3JvdXBNZW1vcnlNZW1zd0xpbWl0SW5CeXRlc0ZpbGU7CisgICAgRklMRSog
bV9jZ3JvdXBNZW1vcnlMaW1pdEluQnl0ZXNGaWxlOworICAgIEZJTEUqIG1fY2dyb3VwTWVtb3J5
VXNhZ2VJbkJ5dGVzRmlsZTsKKworICAgIEZJTEUqIG1fY2dyb3VwVjJNZW1vcnlNZW1zd01heEZp
bGU7CisgICAgRklMRSogbV9jZ3JvdXBWMk1lbW9yeU1heEZpbGU7CisgICAgRklMRSogbV9jZ3Jv
dXBWMk1lbW9yeUhpZ2hGaWxlOworICAgIEZJTEUqIG1fY2dyb3VwVjJNZW1vcnlDdXJyZW50Rmls
ZTsKKworICAgIHZvaWQgZGlzcG9zZU1lbW9yeUNvbnRyb2xsZXIoKTsKKyAgICBzaXplX3QgZ2V0
Q2dyb3VwRmlsZVZhbHVlKEZJTEUqKTsKK307CisKIH0gLy8gbmFtZXNwYWNlIFdlYktpdAogCiAj
ZW5kaWYgLy8gT1MoTElOVVgpCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>395496</attachid>
            <date>2020-04-05 02:56:46 -0700</date>
            <delta_ts>2020-04-05 23:49:25 -0700</delta_ts>
            <desc>patch</desc>
            <filename>bug-209942-20200405115645.patch</filename>
            <type>text/plain</type>
            <size>18733</size>
            <attacher name="Pablo Saavedra">psaavedra</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjU5NDI4CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCmluZGV4IDE1MGZiMGQxMGNiOTUzZWQx
ZGRjY2YyYTI3NmYzOTI5MmU1ZGJiMDQuLmQ2Yzc3NTljMGY3ZmZiMzAzODU3YTI5YWNkNGE4Zjll
OGY4MzY4NWMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCisrKyBiL1NvdXJj
ZS9XZWJLaXQvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNDUgQEAKKzIwMjAtMDQtMDIgIFBhYmxvIFNh
YXZlZHJhICA8cHNhYXZlZHJhQGlnYWxpYS5jb20+CisKKyAgICAgICAgW0dUS11bV1BFXSBSZXBs
YWNlIGZvcGVuL2ZjbG9zZSBieSBmb3Blbi9mc2VlayBmdW5jdGlvbnMgaW4gTWVtb3J5UHJlc3N1
cmVNb25pdG9yCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD0yMDk5NDIKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAg
ICBSZXBsYWNpbmcgdGhlIG9wZW4oKS9jbG9zZSgpIGxvZ2ljIHRvIGdldCB0aGUgZGF0YSBmcm9t
IC9wcm9jL21lbWluZm8sCisgICAgICAgIC9wcm9jL3NlbGYvY2dyb3VwLCAuLi4gd2l0aCBhIG5l
dyBsb2dpYyB3aGVyZSB0aGUgZmlsZXMgYXJlIGp1c3QKKyAgICAgICAgb3BlbmVkIG9uY2UgYW5k
IHdlIGp1c3QgcGVyZm9ybSBhIHNlZWsgdG8gdGhlIGluaXRpYWwgcG9zaXRpb24gb2YKKyAgICAg
ICAgb2YgYSBmbHVzaGVkIGZpbGUuCisKKyAgICAgICAgQWxzbyByZWZhY3RvcmluZyBvZiBzb21l
IGxvZ2ljOgorCisgICAgICAgIC0gQWRkZWQgdGhlIENHcm91cE1lbW9yeUNvbnRyb2xsZXIgY2xh
c3Mgd2hhdCBlbmNhcHN1bGF0ZXMgdGhlIGxvZ2ljCisgICAgICAgICAgdG8gY2FsY3VsYXRlIHRo
ZSB0aGUgdG90YWwgbWVtb3J5IGFuZCB0aGUgbWVtb3J5IHVzYWdlIHdpdGgKKyAgICAgICAgICBj
Z3JvdXBzLgorICAgICAgICAtIENHcm91cE1lbW9yeUNvbnRyb2xsZXIgZW5jcGFzdWxhdGVzIHRo
ZSBGSUxFIHBvaW50ZXJzIHRvIHRoZQorICAgICAgICAgIHJlbGF0aXZlIGZpbGVzIHRvIGNncm91
cHMuCisgICAgICAgIC0gVGhlIG1lbUluZm9GaWxlLCB6b25lSW5mb0ZpbGUgYW5kIGNncm91cENv
bnRyb2xsZXJGaWxlIGFyZSBub3cKKyAgICAgICAgICBvcGVuZWQgb25jZSBpbiB0aGUgVGhyZWFk
OjpjcmVhdGUoKSBpbnZva2VkIGJ5IHRoZQorICAgICAgICAgIE1lbW9yeVByZXNzdXJlTW9uaXRv
cjo6c3RhcnQoKS4KKworICAgICAgICAqIFVJUHJvY2Vzcy9saW51eC9NZW1vcnlQcmVzc3VyZU1v
bml0b3IuY3BwOgorICAgICAgICAoV2ViS2l0Ojpsb3dXYXRlcm1hcmtQYWdlcyk6CisgICAgICAg
IChXZWJLaXQ6OmNhbGN1bGF0ZU1lbW9yeUF2YWlsYWJsZSk6CisgICAgICAgIChXZWJLaXQ6Omdl
dENncm91cEZpbGUpOgorICAgICAgICAoV2ViS2l0OjpnZXRDZ3JvdXBDb250cm9sbGVyUGF0aCk6
CisgICAgICAgIChXZWJLaXQ6OnN5c3RlbU1lbW9yeVVzZWRBc1BlcmNlbnRhZ2UpOgorICAgICAg
ICAoV2ViS2l0OjpNZW1vcnlQcmVzc3VyZU1vbml0b3I6OnN0YXJ0KToKKyAgICAgICAgKFdlYktp
dDo6Q0dyb3VwTWVtb3J5Q29udHJvbGxlcjo6c2V0TWVtb3J5Q29udHJvbGxlclBhdGgpOgorICAg
ICAgICAoV2ViS2l0OjpDR3JvdXBNZW1vcnlDb250cm9sbGVyOjpkaXNwb3NlTWVtb3J5Q29udHJv
bGxlcik6CisgICAgICAgIChXZWJLaXQ6OkNHcm91cE1lbW9yeUNvbnRyb2xsZXI6OmdldENncm91
cEZpbGVWYWx1ZSk6CisgICAgICAgIChXZWJLaXQ6OkNHcm91cE1lbW9yeUNvbnRyb2xsZXI6Omdl
dE1lbW9yeVRvdGFsV2l0aENncm91cCk6CisgICAgICAgIChXZWJLaXQ6OkNHcm91cE1lbW9yeUNv
bnRyb2xsZXI6OmdldE1lbW9yeVVzYWdlV2l0aENncm91cCk6CisgICAgICAgIChXZWJLaXQ6Omdl
dENncm91cEZpbGVWYWx1ZSk6IERlbGV0ZWQuCisgICAgICAgIChXZWJLaXQ6OmdldE1lbW9yeVRv
dGFsV2l0aENncm91cCk6IERlbGV0ZWQuCisgICAgICAgIChXZWJLaXQ6OmdldE1lbW9yeVVzYWdl
V2l0aENncm91cCk6IERlbGV0ZWQuCisgICAgICAgICogVUlQcm9jZXNzL2xpbnV4L01lbW9yeVBy
ZXNzdXJlTW9uaXRvci5oOgorICAgICAgICAoV2ViS2l0OjpDR3JvdXBNZW1vcnlDb250cm9sbGVy
Ojppc0FjdGl2ZSk6CisgICAgICAgIChXZWJLaXQ6OkNHcm91cE1lbW9yeUNvbnRyb2xsZXI6On5D
R3JvdXBNZW1vcnlDb250cm9sbGVyKToKKwogMjAyMC0wNC0wMiAgUGVyIEFybmUgVm9sbGFuICA8
cHZvbGxhbkBhcHBsZS5jb20+CiAKICAgICAgICAgVW5yZXZpZXdlZCBidWlsZCBmaXggYWZ0ZXIg
cjI1OTM5Ni4KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL2xpbnV4L01lbW9y
eVByZXNzdXJlTW9uaXRvci5jcHAgYi9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9saW51eC9NZW1v
cnlQcmVzc3VyZU1vbml0b3IuY3BwCmluZGV4IDRmODhjZDg3NDY0ZDFlYjYzZDU5NGVhYmQzMjFm
MDczMzA5N2E3OWEuLmJhODA5NjllYmVlZjI1NTZjZGM0ZTFkOGQ1YTNlZjFhODRlNTljMzUgMTAw
NjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL2xpbnV4L01lbW9yeVByZXNzdXJlTW9u
aXRvci5jcHAKKysrIGIvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvbGludXgvTWVtb3J5UHJlc3N1
cmVNb25pdG9yLmNwcApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYs
IDIwMTggSWdhbGlhIFMuTC4KKyAqIENvcHlyaWdodCAoQykgMjAxNiwgMjAxOCwgMjAyMCBJZ2Fs
aWEgUy5MLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC01MSwyMCArNTEsMjgg
QEAgc3RhdGljIGNvbnN0IGludCBzX21lbW9yeVByZXN1cmVQZXJjZW50YWdlVGhyZXNob2xkQ3Jp
dGljYWwgPSA5NTsKIC8vIGNncm91cHMuNzogVGhlIHVzdWFsIHBsYWNlIGZvciBzdWNoIG1vdW50
cyBpcyB1bmRlciBhIHRtcGZzKDUpCiAvLyBmaWxlc3lzdGVtIG1vdW50ZWQgYXQgL3N5cy9mcy9j
Z3JvdXAuCiBzdGF0aWMgY29uc3QgY2hhciogc19jZ3JvdXBNZW1vcnlQYXRoID0gIi9zeXMvZnMv
Y2dyb3VwLyVzLyVzLyVzIjsKLXN0YXRpYyBjb25zdCBjaGFyKiBzX2Nncm91cENvbnRyb2xsZXIg
PSAiL3Byb2Mvc2VsZi9jZ3JvdXAiOworCisvLyAvcHJvYyBmaWxlc3lzdGVtcyBhcmUgZGlyZWN0
bHkgbWFpbnRhaW5lZCBieSB0aGUga2VybmVsLgorLy8gT24gb3BlbiB0aGUga2VybmVsIHdpbGwg
cHJvdmlkZSB0aGUgcHJvY2VzcyBhIHN0YXRpYyBjb3B5IG9mIHRoZSBkYXRhIGlmIHRoZQorLy8g
ZGF0YSBpbiBxdWVzdGlvbiBpcyBkeW5hbWljYWxseSBjaGFuZ2luZy4KK3N0YXRpYyBjb25zdCBj
aGFyKiBzX3Byb2NNZW1pbmZvID0gIi9wcm9jL21lbWluZm8iOworc3RhdGljIGNvbnN0IGNoYXIq
IHNfcHJvY1pvbmVpbmZvID0gIi9wcm9jL3pvbmVpbmZvIjsKK3N0YXRpYyBjb25zdCBjaGFyKiBz
X3Byb2NTZWxmQ2dyb3VwID0gIi9wcm9jL3NlbGYvY2dyb3VwIjsKIHN0YXRpYyBjb25zdCB1bnNp
Z25lZCBtYXhDZ3JvdXBQYXRoID0gNDA5NjsgLy8gUEFUSF9NQVggPSA0MDk2IGZyb20gKExpbnV4
KSBpbmNsdWRlL3VhcGkvbGludXgvbGltaXRzLmgKIAotc3RhdGljIHNpemVfdCBsb3dXYXRlcm1h
cmtQYWdlcygpCitzdGF0aWMgc2l6ZV90IGxvd1dhdGVybWFya1BhZ2VzKEZJTEUqIHpvbmVJbmZv
RmlsZSkKIHsKLSAgICBGSUxFKiBmaWxlID0gZm9wZW4oIi9wcm9jL3pvbmVpbmZvIiwgInIiKTsK
LSAgICBpZiAoIWZpbGUpCisgICAgaWYgKCF6b25lSW5mb0ZpbGUpCisgICAgICAgIHJldHVybiBu
b3RTZXQ7CisKKyAgICBpZiAoZnNlZWsoem9uZUluZm9GaWxlLCAwLCBTRUVLX1NFVCkpCiAgICAg
ICAgIHJldHVybiBub3RTZXQ7CiAKICAgICBzaXplX3QgbG93ID0gMDsKICAgICBib29sIGluWm9u
ZSA9IGZhbHNlOwogICAgIGJvb2wgZm91bmRMb3cgPSBmYWxzZTsKICAgICBjaGFyIGJ1ZmZlclsx
MjhdOwotICAgIHdoaWxlIChjaGFyKiBsaW5lID0gZmdldHMoYnVmZmVyLCAxMjgsIGZpbGUpKSB7
CisgICAgd2hpbGUgKGNoYXIqIGxpbmUgPSBmZ2V0cyhidWZmZXIsIDEyOCwgem9uZUluZm9GaWxl
KSkgewogICAgICAgICBpZiAoIXN0cm5jbXAobGluZSwgIk5vZGUiLCA0KSkgewogICAgICAgICAg
ICAgaW5ab25lID0gdHJ1ZTsKICAgICAgICAgICAgIGZvdW5kTG93ID0gZmFsc2U7CkBAIC05Miw4
ICsxMDAsNiBAQCBzdGF0aWMgc2l6ZV90IGxvd1dhdGVybWFya1BhZ2VzKCkKICAgICAgICAgICAg
IGZvdW5kTG93ID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KLSAgICBmY2xvc2UoZmlsZSk7Ci0K
ICAgICByZXR1cm4gbG93OwogfQogCkBAIC0xMDgsMTIgKzExNCwxMiBAQCBzdGF0aWMgaW5saW5l
IHNpemVfdCBzeXN0ZW1QYWdlU2l6ZSgpCiAvLyBJZiBNZW1BdmFpbGFibGUgd2FzIG5vdCBwcmVz
ZW50IGluIC9wcm9jL21lbWluZm8sIGJlY2F1c2UgaXQncyBhbiBvbGQga2VybmVsIHZlcnNpb24s
CiAvLyB3ZSBjYW4gZG8gdGhlIHNhbWUgY2FsY3VsYXRpb24gd2l0aCB0aGUgaW5mb3JtYXRpb24g
d2UgaGF2ZSBmcm9tIG1lbWluZm8gYW5kIHRoZSBsb3cgd2F0ZXJtYWtzLgogLy8gU2VlIGh0dHBz
Oi8vZ2l0Lmtlcm5lbC5vcmcvY2dpdC9saW51eC9rZXJuZWwvZ2l0L3RvcnZhbGRzL2xpbnV4Lmdp
dC9jb21taXQvP2lkPTM0ZTQzMWIwYWUzOThmYzU0ZWE2OWZmODVlYzcwMDcyMmM5ZGE3NzMKLXN0
YXRpYyBzaXplX3QgY2FsY3VsYXRlTWVtb3J5QXZhaWxhYmxlKHNpemVfdCBtZW1vcnlGcmVlLCBz
aXplX3QgYWN0aXZlRmlsZSwgc2l6ZV90IGluYWN0aXZlRmlsZSwgc2l6ZV90IHNsYWJSZWNsYWlt
YWJsZSkKK3N0YXRpYyBzaXplX3QgY2FsY3VsYXRlTWVtb3J5QXZhaWxhYmxlKHNpemVfdCBtZW1v
cnlGcmVlLCBzaXplX3QgYWN0aXZlRmlsZSwgc2l6ZV90IGluYWN0aXZlRmlsZSwgc2l6ZV90IHNs
YWJSZWNsYWltYWJsZSwgRklMRSogem9uZUluZm9GaWxlKQogewogICAgIGlmIChtZW1vcnlGcmVl
ID09IG5vdFNldCB8fCBhY3RpdmVGaWxlID09IG5vdFNldCB8fCBpbmFjdGl2ZUZpbGUgPT0gbm90
U2V0IHx8IHNsYWJSZWNsYWltYWJsZSA9PSBub3RTZXQpCiAgICAgICAgIHJldHVybiBub3RTZXQ7
CiAKLSAgICBzaXplX3QgbG93V2F0ZXJtYXJrID0gbG93V2F0ZXJtYXJrUGFnZXMoKTsKKyAgICBz
aXplX3QgbG93V2F0ZXJtYXJrID0gbG93V2F0ZXJtYXJrUGFnZXMoem9uZUluZm9GaWxlKTsKICAg
ICBpZiAobG93V2F0ZXJtYXJrID09IG5vdFNldCkKICAgICAgICAgcmV0dXJuIG5vdFNldDsKIApA
QCAtMTM2LDc1ICsxNDIsMTQgQEAgc3RhdGljIHNpemVfdCBjYWxjdWxhdGVNZW1vcnlBdmFpbGFi
bGUoc2l6ZV90IG1lbW9yeUZyZWUsIHNpemVfdCBhY3RpdmVGaWxlLCBzaXoKICAgICByZXR1cm4g
bWVtb3J5QXZhaWxhYmxlOwogfQogCi0KLXNpemVfdCBnZXRDZ3JvdXBGaWxlVmFsdWUoQ1N0cmlu
ZyBjZ3JvdXBDb250cm9sbGVyTmFtZSwgQ1N0cmluZyBjZ3JvdXBDb250cm9sbGVyUGF0aCwgQ1N0
cmluZyBjZ3JvdXBGaWxlTmFtZSkKK0ZJTEUqIGdldENncm91cEZpbGUoQ1N0cmluZyBjZ3JvdXBD
b250cm9sbGVyTmFtZSwgQ1N0cmluZyBjZ3JvdXBDb250cm9sbGVyUGF0aCwgQ1N0cmluZyBjZ3Jv
dXBGaWxlTmFtZSkKIHsKLSAgICBjaGFyIGJ1ZmZlclsxMjhdOwogICAgIGNoYXIgY2dyb3VwUGF0
aFttYXhDZ3JvdXBQYXRoXTsKLSAgICBjaGFyKiB0b2tlbjsKLSAgICBGSUxFKiBmaWxlOwotICAg
IGJvb2wgb2sgPSB0cnVlOwotCiAgICAgc25wcmludGYoY2dyb3VwUGF0aCwgbWF4Q2dyb3VwUGF0
aCwgc19jZ3JvdXBNZW1vcnlQYXRoLCBjZ3JvdXBDb250cm9sbGVyTmFtZS5kYXRhKCksIGNncm91
cENvbnRyb2xsZXJQYXRoLmRhdGEoKSwgY2dyb3VwRmlsZU5hbWUuZGF0YSgpKTsKLSAgICBmaWxl
ID0gZm9wZW4oY2dyb3VwUGF0aCwgInIiKTsKLSAgICBpZiAoZmlsZSkgewotICAgICAgICB0b2tl
biA9IGZnZXRzKGJ1ZmZlciwgMTI4LCBmaWxlKTsKLSAgICAgICAgZmNsb3NlKGZpbGUpOwotICAg
ICAgICBzaXplX3QgdmFsdWUgPSB0b0ludGVncmFsVHlwZTxzaXplX3Q+KHRva2VuLCBzdHJsZW4o
dG9rZW4pLCAmb2spOwotICAgICAgICBpZiAoIW9rKQotICAgICAgICAgICAgdmFsdWUgPSBub3RT
ZXQ7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIG5vdFNldDsKLX0K
LQotc2l6ZV90IGdldE1lbW9yeVRvdGFsV2l0aENncm91cChDU3RyaW5nIG1lbW9yeUNvbnRyb2xs
ZXJOYW1lKQotewotICAgIHNpemVfdCB2YWx1ZSA9IG5vdFNldDsKLQotICAgIC8vIENoZWNrIG1l
bW9yeSBsaW1pdHMgaW4gY2dyb3VwVjIKLSAgICB2YWx1ZSA9IGdldENncm91cEZpbGVWYWx1ZSgi
LyIsIG1lbW9yeUNvbnRyb2xsZXJOYW1lLCBDU3RyaW5nKCJtZW1vcnkubWVtc3cubWF4IikpOwot
ICAgIGlmICh2YWx1ZSAhPSBub3RTZXQpCi0gICAgICAgIHJldHVybiB2YWx1ZTsKLQotICAgIHZh
bHVlID0gZ2V0Q2dyb3VwRmlsZVZhbHVlKCIvIiwgbWVtb3J5Q29udHJvbGxlck5hbWUsIENTdHJp
bmcoIm1lbW9yeS5tYXgiKSk7Ci0gICAgc2l6ZV90IHZhbHVlSGlnaCA9IGdldENncm91cEZpbGVW
YWx1ZSgiLyIsIG1lbW9yeUNvbnRyb2xsZXJOYW1lLCBDU3RyaW5nKCJtZW1vcnkuaGlnaCIpKTsK
LSAgICBpZiAodmFsdWUgIT0gbm90U2V0ICYmIHZhbHVlSGlnaCAhPSBub3RTZXQpIHsKLSAgICAg
ICAgdmFsdWUgPSBzdGQ6Om1pbih2YWx1ZSwgdmFsdWVIaWdoKTsKLSAgICAgICAgcmV0dXJuIHZh
bHVlOwotICAgIH0KLSAgICBpZiAodmFsdWVIaWdoICE9IG5vdFNldCkKLSAgICAgICAgcmV0dXJu
IHZhbHVlSGlnaDsKLSAgICBpZiAodmFsdWUgIT0gbm90U2V0KQotICAgICAgICByZXR1cm4gdmFs
dWU7Ci0KLSAgICAvLyBDaGVjayBtZW1vcnkgbGltaXRzIGluIGNncm91cFYxCi0gICAgdmFsdWUg
PSBnZXRDZ3JvdXBGaWxlVmFsdWUoIm1lbW9yeSIsIG1lbW9yeUNvbnRyb2xsZXJOYW1lLCBDU3Ry
aW5nKCJtZW1vcnkubWVtc3cubGltaXRfaW5fYnl0ZXMiKSk7Ci0gICAgaWYgKHZhbHVlICE9IG5v
dFNldCkKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotCi0gICAgdmFsdWUgPSBnZXRDZ3JvdXBGaWxl
VmFsdWUoIm1lbW9yeSIsIG1lbW9yeUNvbnRyb2xsZXJOYW1lLCBDU3RyaW5nKCJtZW1vcnkubGlt
aXRfaW5fYnl0ZXMiKSk7Ci0gICAgaWYgKHZhbHVlICE9IG5vdFNldCkKLSAgICAgICAgcmV0dXJu
IHZhbHVlOwotCi0gICAgcmV0dXJuIHZhbHVlOwotfQotCi1zdGF0aWMgc2l6ZV90IGdldE1lbW9y
eVVzYWdlV2l0aENncm91cChDU3RyaW5nIG1lbW9yeUNvbnRyb2xsZXJOYW1lKQotewotICAgIHNp
emVfdCB2YWx1ZSA9IG5vdFNldDsKLQotICAgIC8vIENoZWNrIG1lbW9yeSBsaW1pdHMgaW4gY2dy
b3VwVjIKLSAgICB2YWx1ZSA9IGdldENncm91cEZpbGVWYWx1ZSgiLyIsIG1lbW9yeUNvbnRyb2xs
ZXJOYW1lLCBDU3RyaW5nKCJtZW1vcnkuY3VycmVudCIpKTsKLSAgICBpZiAodmFsdWUgIT0gbm90
U2V0KQotICAgICAgICByZXR1cm4gdmFsdWU7Ci0KLSAgICAvLyBDaGVjayBtZW1vcnkgbGltaXRz
IGluIGNncm91cFYxCi0gICAgdmFsdWUgPSBnZXRDZ3JvdXBGaWxlVmFsdWUoIm1lbW9yeSIsIG1l
bW9yeUNvbnRyb2xsZXJOYW1lLCBDU3RyaW5nKCJtZW1vcnkudXNhZ2VfaW5fYnl0ZXMiKSk7Ci0g
ICAgaWYgKHZhbHVlICE9IG5vdFNldCkKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotCi0gICAgcmV0
dXJuIG5vdFNldDsKKyAgICBGSUxFKiBmaWxlID0gZm9wZW4oY2dyb3VwUGF0aCwgInIiKTsKKyAg
ICBpZiAoZmlsZSkKKyAgICAgICAgc2V0YnVmKGZpbGUsIG51bGxwdHIpOworICAgIHJldHVybiBm
aWxlOwogfQogCiAvLyBUaGlzIGZpbGUgZGVzY3JpYmVzIGNvbnRyb2wgZ3JvdXBzIHRvIHdoaWNo
IHRoZSBwcm9jZXNzIHdpdGgKQEAgLTIyNywxNSArMTcyLDE3IEBAIHN0YXRpYyBzaXplX3QgZ2V0
TWVtb3J5VXNhZ2VXaXRoQ2dyb3VwKENTdHJpbmcgbWVtb3J5Q29udHJvbGxlck5hbWUpCiAvLyAy
OmNwdXNldDovCiAvLyAxOm5hbWU9c3lzdGVtZDovdXNlci5zbGljZS91c2VyLTEwMDAuc2xpY2Uv
dXNlckAxMDAwLnNlcnZpY2UvZ25vbWUtdGVybWluYWwtc2VydmVyLnNlcnZpY2UKIC8vIDA6Oi91
c2VyLnNsaWNlL3VzZXItMTAwMC5zbGljZS91c2VyQDEwMDAuc2VydmljZS9nbm9tZS10ZXJtaW5h
bC1zZXJ2ZXIuc2VydmljZQotc3RhdGljIENTdHJpbmcgZ2V0Q2dyb3VwQ29udHJvbGxlclBhdGgo
Y29uc3QgY2hhciogY29udHJvbGxlck5hbWUpCitzdGF0aWMgQ1N0cmluZyBnZXRDZ3JvdXBDb250
cm9sbGVyUGF0aChGSUxFKiBjZ3JvdXBDb250cm9sbGVyRmlsZSwgY29uc3QgY2hhciogY29udHJv
bGxlck5hbWUpCiB7Ci0gICAgQ1N0cmluZyBtZW1vcnlDb250cm9sbGVyUGF0aDsKLSAgICBGSUxF
KiBmaWxlID0gZm9wZW4oc19jZ3JvdXBDb250cm9sbGVyLCAiciIpOwotICAgIGlmICghZmlsZSkK
KyAgICBDU3RyaW5nIGNncm91cE1lbW9yeUNvbnRyb2xsZXJQYXRoOworICAgIGlmICghY2dyb3Vw
Q29udHJvbGxlckZpbGUpCisgICAgICAgIHJldHVybiBDU3RyaW5nKCk7CisKKyAgICBpZiAoZnNl
ZWsoY2dyb3VwQ29udHJvbGxlckZpbGUsIDAsIFNFRUtfU0VUKSkKICAgICAgICAgcmV0dXJuIENT
dHJpbmcoKTsKIAogICAgIGNoYXIgYnVmZmVyW21heENncm91cFBhdGhdOwotICAgIHdoaWxlIChj
aGFyKiBsaW5lID0gZmdldHMoYnVmZmVyLCBtYXhDZ3JvdXBQYXRoLCBmaWxlKSkgeworICAgIHdo
aWxlIChjaGFyKiBsaW5lID0gZmdldHMoYnVmZmVyLCBtYXhDZ3JvdXBQYXRoLCBjZ3JvdXBDb250
cm9sbGVyRmlsZSkpIHsKICAgICAgICAgY2hhciogdG9rZW4gPSBzdHJ0b2sobGluZSwgIlxuIik7
CiAgICAgICAgIGlmICghdG9rZW4pCiAgICAgICAgICAgICBicmVhazsKQEAgLTI0NCwzMCArMTkx
LDMwIEBAIHN0YXRpYyBDU3RyaW5nIGdldENncm91cENvbnRyb2xsZXJQYXRoKGNvbnN0IGNoYXIq
IGNvbnRyb2xsZXJOYW1lKQogICAgICAgICB0b2tlbiA9IHN0cnRvayhudWxscHRyLCAiOiIpOwog
ICAgICAgICBpZiAoIXN0cmNtcCh0b2tlbiwgY29udHJvbGxlck5hbWUpKSB7CiAgICAgICAgICAg
ICB0b2tlbiA9IHN0cnRvayhudWxscHRyLCAiOiIpOwotICAgICAgICAgICAgbWVtb3J5Q29udHJv
bGxlclBhdGggPSBDU3RyaW5nKHRva2VuKTsKLSAgICAgICAgICAgIGZjbG9zZShmaWxlKTsKLSAg
ICAgICAgICAgIHJldHVybiBtZW1vcnlDb250cm9sbGVyUGF0aDsKKyAgICAgICAgICAgIGNncm91
cE1lbW9yeUNvbnRyb2xsZXJQYXRoID0gQ1N0cmluZyh0b2tlbik7CisgICAgICAgICAgICByZXR1
cm4gY2dyb3VwTWVtb3J5Q29udHJvbGxlclBhdGg7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFz
dHJuY21wKHRva2VuLCAibmFtZT1zeXN0ZW1kIiwgMTIpKSB7CiAgICAgICAgICAgICB0b2tlbiA9
IHN0cnRvayhudWxscHRyLCAiOiIpOwotICAgICAgICAgICAgbWVtb3J5Q29udHJvbGxlclBhdGgg
PSBDU3RyaW5nKHRva2VuKTsKKyAgICAgICAgICAgIGNncm91cE1lbW9yeUNvbnRyb2xsZXJQYXRo
ID0gQ1N0cmluZyh0b2tlbik7CiAgICAgICAgIH0KICAgICB9Ci0gICAgZmNsb3NlKGZpbGUpOwot
ICAgIHJldHVybiBtZW1vcnlDb250cm9sbGVyUGF0aDsKKyAgICByZXR1cm4gY2dyb3VwTWVtb3J5
Q29udHJvbGxlclBhdGg7CiB9CiAKIAotc3RhdGljIGludCBzeXN0ZW1NZW1vcnlVc2VkQXNQZXJj
ZW50YWdlKCkKK3N0YXRpYyBpbnQgc3lzdGVtTWVtb3J5VXNlZEFzUGVyY2VudGFnZShGSUxFKiBt
ZW1JbmZvRmlsZSwgRklMRSogem9uZUluZm9GaWxlLCBDR3JvdXBNZW1vcnlDb250cm9sbGVyKiBt
ZW1vcnlDb250cm9sbGVyKQogewotICAgIEZJTEUqIGZpbGUgPSBmb3BlbigiL3Byb2MvbWVtaW5m
byIsICJyIik7Ci0gICAgaWYgKCFmaWxlKQorICAgIGlmICghbWVtSW5mb0ZpbGUpCisgICAgICAg
IHJldHVybiAtMTsKKworICAgIGlmIChmc2VlayhtZW1JbmZvRmlsZSwgMCwgU0VFS19TRVQpKQog
ICAgICAgICByZXR1cm4gLTE7CiAKICAgICBzaXplX3QgbWVtb3J5QXZhaWxhYmxlLCBtZW1vcnlU
b3RhbCwgbWVtb3J5RnJlZSwgYWN0aXZlRmlsZSwgaW5hY3RpdmVGaWxlLCBzbGFiUmVjbGFpbWFi
bGU7CiAgICAgbWVtb3J5QXZhaWxhYmxlID0gbWVtb3J5VG90YWwgPSBtZW1vcnlGcmVlID0gYWN0
aXZlRmlsZSA9IGluYWN0aXZlRmlsZSA9IHNsYWJSZWNsYWltYWJsZSA9IG5vdFNldDsKICAgICBj
aGFyIGJ1ZmZlclsxMjhdOwotICAgIHdoaWxlIChjaGFyKiBsaW5lID0gZmdldHMoYnVmZmVyLCAx
MjgsIGZpbGUpKSB7CisgICAgd2hpbGUgKGNoYXIqIGxpbmUgPSBmZ2V0cyhidWZmZXIsIDEyOCwg
bWVtSW5mb0ZpbGUpKSB7CiAgICAgICAgIGNoYXIqIHRva2VuID0gc3RydG9rKGxpbmUsICIgIik7
CiAgICAgICAgIGJvb2wgb2sgPSB0cnVlOwogICAgICAgICBpZiAoIXRva2VuKQpAQCAtMzIxLDEz
ICsyNjgsMTIgQEAgc3RhdGljIGludCBzeXN0ZW1NZW1vcnlVc2VkQXNQZXJjZW50YWdlKCkKICAg
ICAgICAgaWYgKG1lbW9yeVRvdGFsICE9IG5vdFNldCAmJiBtZW1vcnlGcmVlICE9IG5vdFNldCAm
JiBhY3RpdmVGaWxlICE9IG5vdFNldCAmJiBpbmFjdGl2ZUZpbGUgIT0gbm90U2V0ICYmIHNsYWJS
ZWNsYWltYWJsZSAhPSBub3RTZXQpCiAgICAgICAgICAgICBicmVhazsKICAgICB9Ci0gICAgZmNs
b3NlKGZpbGUpOwogCiAgICAgaWYgKCFtZW1vcnlUb3RhbCB8fCBtZW1vcnlUb3RhbCA9PSBub3RT
ZXQpCiAgICAgICAgIHJldHVybiAtMTsKIAogICAgIGlmIChtZW1vcnlBdmFpbGFibGUgPT0gbm90
U2V0KSB7Ci0gICAgICAgIG1lbW9yeUF2YWlsYWJsZSA9IGNhbGN1bGF0ZU1lbW9yeUF2YWlsYWJs
ZShtZW1vcnlGcmVlLCBhY3RpdmVGaWxlLCBpbmFjdGl2ZUZpbGUsIHNsYWJSZWNsYWltYWJsZSk7
CisgICAgICAgIG1lbW9yeUF2YWlsYWJsZSA9IGNhbGN1bGF0ZU1lbW9yeUF2YWlsYWJsZShtZW1v
cnlGcmVlLCBhY3RpdmVGaWxlLCBpbmFjdGl2ZUZpbGUsIHNsYWJSZWNsYWltYWJsZSwgem9uZUlu
Zm9GaWxlKTsKICAgICAgICAgaWYgKG1lbW9yeUF2YWlsYWJsZSA9PSBub3RTZXQpCiAgICAgICAg
ICAgICByZXR1cm4gLTE7CiAgICAgfQpAQCAtMzM2LDEwICsyODIsOSBAQCBzdGF0aWMgaW50IHN5
c3RlbU1lbW9yeVVzZWRBc1BlcmNlbnRhZ2UoKQogICAgICAgICByZXR1cm4gLTE7CiAKICAgICBp
bnQgbWVtb3J5VXNhZ2VQZXJjZW50YWdlID0gKChtZW1vcnlUb3RhbCAtIG1lbW9yeUF2YWlsYWJs
ZSkgKiAxMDApIC8gbWVtb3J5VG90YWw7Ci0gICAgQ1N0cmluZyBtZW1vcnlDb250cm9sbGVyUGF0
aCA9IGdldENncm91cENvbnRyb2xsZXJQYXRoKCJtZW1vcnkiKTsKLSAgICBpZiAoIW1lbW9yeUNv
bnRyb2xsZXJQYXRoLmlzTnVsbCgpKSB7Ci0gICAgICAgIG1lbW9yeVRvdGFsID0gZ2V0TWVtb3J5
VG90YWxXaXRoQ2dyb3VwKG1lbW9yeUNvbnRyb2xsZXJQYXRoKTsKLSAgICAgICAgc2l6ZV90IG1l
bW9yeVVzYWdlID0gZ2V0TWVtb3J5VXNhZ2VXaXRoQ2dyb3VwKG1lbW9yeUNvbnRyb2xsZXJQYXRo
KTsKKyAgICBpZiAobWVtb3J5Q29udHJvbGxlci0+aXNBY3RpdmUoKSkgeworICAgICAgICBtZW1v
cnlUb3RhbCA9IG1lbW9yeUNvbnRyb2xsZXItPmdldE1lbW9yeVRvdGFsV2l0aENncm91cCgpOwor
ICAgICAgICBzaXplX3QgbWVtb3J5VXNhZ2UgPSBtZW1vcnlDb250cm9sbGVyLT5nZXRNZW1vcnlV
c2FnZVdpdGhDZ3JvdXAoKTsKICAgICAgICAgaWYgKG1lbW9yeVRvdGFsICE9IG5vdFNldCAmJiBt
ZW1vcnlVc2FnZSAhPSBub3RTZXQpIHsKICAgICAgICAgICAgIGludCBtZW1vcnlVc2FnZVBlcmNl
bnRhZ2VXaXRoQ2dyb3VwID0gMTAwICogKChmbG9hdCkgbWVtb3J5VXNhZ2UgLyAoZmxvYXQpIG1l
bW9yeVRvdGFsKTsKICAgICAgICAgICAgIGlmIChtZW1vcnlVc2FnZVBlcmNlbnRhZ2VXaXRoQ2dy
b3VwID4gbWVtb3J5VXNhZ2VQZXJjZW50YWdlKQpAQCAtMzc3LDExICszMjIsMzAgQEAgdm9pZCBN
ZW1vcnlQcmVzc3VyZU1vbml0b3I6OnN0YXJ0KCkKICAgICBtX3N0YXJ0ZWQgPSB0cnVlOwogCiAg
ICAgVGhyZWFkOjpjcmVhdGUoIk1lbW9yeVByZXNzdXJlTW9uaXRvciIsIFtdIHsKKyAgICAgICAg
RklMRSogbWVtSW5mb0ZpbGU7CisgICAgICAgIEZJTEUqIHpvbmVJbmZvRmlsZTsKKyAgICAgICAg
RklMRSogY2dyb3VwQ29udHJvbGxlckZpbGU7CisgICAgICAgIENHcm91cE1lbW9yeUNvbnRyb2xs
ZXIgbWVtb3J5Q29udHJvbGxlciA9IENHcm91cE1lbW9yeUNvbnRyb2xsZXIoKTsKICAgICAgICAg
U2Vjb25kcyBwb2xsSW50ZXJ2YWwgPSBzX21heFBvbGxpbmdJbnRlcnZhbDsKICAgICAgICAgd2hp
bGUgKHRydWUpIHsKICAgICAgICAgICAgIHNsZWVwKHBvbGxJbnRlcnZhbCk7CiAKLSAgICAgICAg
ICAgIGludCB1c2VkUGVyY2VudGFnZSA9IHN5c3RlbU1lbW9yeVVzZWRBc1BlcmNlbnRhZ2UoKTsK
KyAgICAgICAgICAgIG1lbUluZm9GaWxlID0gZm9wZW4oc19wcm9jTWVtaW5mbywgInIiKTsKKyAg
ICAgICAgICAgIGlmIChtZW1JbmZvRmlsZSkKKyAgICAgICAgICAgICAgICBzZXRidWYobWVtSW5m
b0ZpbGUsIG51bGxwdHIpOworICAgICAgICAgICAgem9uZUluZm9GaWxlID0gZm9wZW4oc19wcm9j
Wm9uZWluZm8sICJyIik7CisgICAgICAgICAgICBpZiAoem9uZUluZm9GaWxlKQorICAgICAgICAg
ICAgICAgIHNldGJ1Zih6b25lSW5mb0ZpbGUsIG51bGxwdHIpOworICAgICAgICAgICAgY2dyb3Vw
Q29udHJvbGxlckZpbGUgPSBmb3BlbihzX3Byb2NTZWxmQ2dyb3VwLCAiciIpOworICAgICAgICAg
ICAgaWYgKGNncm91cENvbnRyb2xsZXJGaWxlKQorICAgICAgICAgICAgICAgIHNldGJ1ZihjZ3Jv
dXBDb250cm9sbGVyRmlsZSwgbnVsbHB0cik7CisKKyAgICAgICAgICAgIGlmICghbWVtSW5mb0Zp
bGUgJiYgIXpvbmVJbmZvRmlsZSAmJiAhY2dyb3VwQ29udHJvbGxlckZpbGUpCisgICAgICAgICAg
ICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIENTdHJpbmcgY2dyb3VwTWVtb3J5Q29udHJv
bGxlclBhdGggPSBnZXRDZ3JvdXBDb250cm9sbGVyUGF0aChjZ3JvdXBDb250cm9sbGVyRmlsZSwg
Im1lbW9yeSIpOworICAgICAgICAgICAgbWVtb3J5Q29udHJvbGxlci5zZXRNZW1vcnlDb250cm9s
bGVyUGF0aChjZ3JvdXBNZW1vcnlDb250cm9sbGVyUGF0aCk7CisgICAgICAgICAgICBpbnQgdXNl
ZFBlcmNlbnRhZ2UgPSBzeXN0ZW1NZW1vcnlVc2VkQXNQZXJjZW50YWdlKG1lbUluZm9GaWxlLCB6
b25lSW5mb0ZpbGUsICZtZW1vcnlDb250cm9sbGVyKTsKICAgICAgICAgICAgIGlmICh1c2VkUGVy
Y2VudGFnZSA9PSAtMSkgewogICAgICAgICAgICAgICAgIFdURkxvZ0Fsd2F5cygiRmFpbGVkIHRv
IGdldCB0aGUgbWVtb3J5IHVzYWdlIik7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0zOTQs
OSArMzU4LDExNiBAQCB2b2lkIE1lbW9yeVByZXNzdXJlTW9uaXRvcjo6c3RhcnQoKQogICAgICAg
ICAgICAgfQogICAgICAgICAgICAgcG9sbEludGVydmFsID0gcG9sbEludGVydmFsRm9yVXNlZE1l
bW9yeVBlcmNlbnRhZ2UodXNlZFBlcmNlbnRhZ2UpOwogICAgICAgICB9CisKKyAgICAgICAgZmNs
b3NlKG1lbUluZm9GaWxlKTsKKyAgICAgICAgZmNsb3NlKHpvbmVJbmZvRmlsZSk7CisgICAgICAg
IGZjbG9zZShjZ3JvdXBDb250cm9sbGVyRmlsZSk7CiAgICAgfSktPmRldGFjaCgpOwogfQogCit2
b2lkIENHcm91cE1lbW9yeUNvbnRyb2xsZXI6OnNldE1lbW9yeUNvbnRyb2xsZXJQYXRoKENTdHJp
bmcgbWVtb3J5Q29udHJvbGxlclBhdGgpCit7CisgICAgaWYgKG1lbW9yeUNvbnRyb2xsZXJQYXRo
ID09IG1fY2dyb3VwTWVtb3J5Q29udHJvbGxlclBhdGgpCisgICAgICAgIHJldHVybjsKKworICAg
IG1fY2dyb3VwTWVtb3J5Q29udHJvbGxlclBhdGggPSBtZW1vcnlDb250cm9sbGVyUGF0aDsKKyAg
ICBkaXNwb3NlTWVtb3J5Q29udHJvbGxlcigpOworCisgICAgbV9jZ3JvdXBWMk1lbW9yeUN1cnJl
bnRGaWxlID0gZ2V0Q2dyb3VwRmlsZSgiLyIsIG1lbW9yeUNvbnRyb2xsZXJQYXRoLCBDU3RyaW5n
KCJtZW1vcnkuY3VycmVudCIpKTsKKyAgICBtX2Nncm91cFYyTWVtb3J5TWVtc3dNYXhGaWxlID0g
Z2V0Q2dyb3VwRmlsZSgiLyIsIG1lbW9yeUNvbnRyb2xsZXJQYXRoLCBDU3RyaW5nKCJtZW1vcnku
bWVtc3cubWF4IikpOworICAgIG1fY2dyb3VwVjJNZW1vcnlNYXhGaWxlID0gZ2V0Q2dyb3VwRmls
ZSgiLyIsIG1lbW9yeUNvbnRyb2xsZXJQYXRoLCBDU3RyaW5nKCJtZW1vcnkubWF4IikpOworICAg
IG1fY2dyb3VwVjJNZW1vcnlIaWdoRmlsZSA9IGdldENncm91cEZpbGUoIi8iLCBtZW1vcnlDb250
cm9sbGVyUGF0aCwgQ1N0cmluZygibWVtb3J5LmhpZ2giKSk7CisKKyAgICBtX2Nncm91cE1lbW9y
eU1lbXN3TGltaXRJbkJ5dGVzRmlsZSA9IGdldENncm91cEZpbGUoIm1lbW9yeSIsIG1lbW9yeUNv
bnRyb2xsZXJQYXRoLCBDU3RyaW5nKCJtZW1vcnkubWVtc3cubGltaXRfaW5fYnl0ZXMiKSk7Cisg
ICAgbV9jZ3JvdXBNZW1vcnlMaW1pdEluQnl0ZXNGaWxlID0gZ2V0Q2dyb3VwRmlsZSgibWVtb3J5
IiwgbWVtb3J5Q29udHJvbGxlclBhdGgsIENTdHJpbmcoIm1lbW9yeS5saW1pdF9pbl9ieXRlcyIp
KTsKKyAgICBtX2Nncm91cE1lbW9yeVVzYWdlSW5CeXRlc0ZpbGUgPSBnZXRDZ3JvdXBGaWxlKCJt
ZW1vcnkiLCBtZW1vcnlDb250cm9sbGVyUGF0aCwgQ1N0cmluZygibWVtb3J5LnVzYWdlX2luX2J5
dGVzIikpOworfQorCit2b2lkIENHcm91cE1lbW9yeUNvbnRyb2xsZXI6OmRpc3Bvc2VNZW1vcnlD
b250cm9sbGVyKCkKK3sKKyAgICBpZiAobV9jZ3JvdXBNZW1vcnlNZW1zd0xpbWl0SW5CeXRlc0Zp
bGUpCisgICAgICAgIGZjbG9zZShtX2Nncm91cE1lbW9yeU1lbXN3TGltaXRJbkJ5dGVzRmlsZSk7
CisgICAgaWYgKG1fY2dyb3VwTWVtb3J5TGltaXRJbkJ5dGVzRmlsZSkKKyAgICAgICAgZmNsb3Nl
KG1fY2dyb3VwTWVtb3J5TGltaXRJbkJ5dGVzRmlsZSk7CisgICAgaWYgKG1fY2dyb3VwTWVtb3J5
VXNhZ2VJbkJ5dGVzRmlsZSkKKyAgICAgICAgZmNsb3NlKG1fY2dyb3VwTWVtb3J5VXNhZ2VJbkJ5
dGVzRmlsZSk7CisKKyAgICBpZiAobV9jZ3JvdXBWMk1lbW9yeU1lbXN3TWF4RmlsZSkKKyAgICAg
ICAgZmNsb3NlKG1fY2dyb3VwVjJNZW1vcnlNZW1zd01heEZpbGUpOworICAgIGlmIChtX2Nncm91
cFYyTWVtb3J5TWF4RmlsZSkKKyAgICAgICAgZmNsb3NlKG1fY2dyb3VwVjJNZW1vcnlNYXhGaWxl
KTsKKyAgICBpZiAobV9jZ3JvdXBWMk1lbW9yeUhpZ2hGaWxlKQorICAgICAgICBmY2xvc2UobV9j
Z3JvdXBWMk1lbW9yeUhpZ2hGaWxlKTsKK30KKworc2l6ZV90IENHcm91cE1lbW9yeUNvbnRyb2xs
ZXI6OmdldENncm91cEZpbGVWYWx1ZShGSUxFICpmaWxlKQoreworICAgIGNoYXIgYnVmZmVyWzEy
OF07CisgICAgY2hhciogdG9rZW47CisgICAgYm9vbCBvayA9IHRydWU7CisKKyAgICBpZiAoIWZp
bGUpCisgICAgICAgIHJldHVybiBub3RTZXQ7CisKKyAgICBpZiAoZnNlZWsoZmlsZSwgMCwgU0VF
S19TRVQpKQorICAgICAgICByZXR1cm4gbm90U2V0OworCisgICAgdG9rZW4gPSBmZ2V0cyhidWZm
ZXIsIDEyOCwgZmlsZSk7CisKKyAgICBzaXplX3QgdmFsdWUgPSB0b0ludGVncmFsVHlwZTxzaXpl
X3Q+KHRva2VuLCBzdHJsZW4odG9rZW4pLCAmb2spOworICAgIGlmICghb2spCisgICAgICAgIHZh
bHVlID0gbm90U2V0OworICAgIHJldHVybiB2YWx1ZTsKK30KKworc2l6ZV90IENHcm91cE1lbW9y
eUNvbnRyb2xsZXI6OmdldE1lbW9yeVRvdGFsV2l0aENncm91cCgpCit7CisgICAgc2l6ZV90IHZh
bHVlID0gbm90U2V0OworCisgICAgLy8gQ2hlY2sgbWVtb3J5IGxpbWl0cyBpbiBjZ3JvdXBWMgor
ICAgIHZhbHVlID0gZ2V0Q2dyb3VwRmlsZVZhbHVlKG1fY2dyb3VwVjJNZW1vcnlNZW1zd01heEZp
bGUpOworICAgIGlmICh2YWx1ZSAhPSBub3RTZXQpCisgICAgICAgIHJldHVybiB2YWx1ZTsKKwor
ICAgIHZhbHVlID0gZ2V0Q2dyb3VwRmlsZVZhbHVlKG1fY2dyb3VwVjJNZW1vcnlNYXhGaWxlKTsK
KyAgICBzaXplX3QgdmFsdWVIaWdoID0gZ2V0Q2dyb3VwRmlsZVZhbHVlKG1fY2dyb3VwVjJNZW1v
cnlIaWdoRmlsZSk7CisgICAgaWYgKHZhbHVlICE9IG5vdFNldCAmJiB2YWx1ZUhpZ2ggIT0gbm90
U2V0KSB7CisgICAgICAgIHZhbHVlID0gc3RkOjptaW4odmFsdWUsIHZhbHVlSGlnaCk7CisgICAg
ICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisgICAgaWYgKHZhbHVlSGlnaCAhPSBub3RTZXQpCisg
ICAgICAgIHJldHVybiB2YWx1ZUhpZ2g7CisgICAgaWYgKHZhbHVlICE9IG5vdFNldCkKKyAgICAg
ICAgcmV0dXJuIHZhbHVlOworCisgICAgLy8gQ2hlY2sgbWVtb3J5IGxpbWl0cyBpbiBjZ3JvdXBW
MQorICAgIHZhbHVlID0gZ2V0Q2dyb3VwRmlsZVZhbHVlKG1fY2dyb3VwTWVtb3J5TWVtc3dMaW1p
dEluQnl0ZXNGaWxlKTsKKyAgICBpZiAodmFsdWUgIT0gbm90U2V0KQorICAgICAgICByZXR1cm4g
dmFsdWU7CisKKyAgICB2YWx1ZSA9IGdldENncm91cEZpbGVWYWx1ZShtX2Nncm91cE1lbW9yeUxp
bWl0SW5CeXRlc0ZpbGUpOworICAgIGlmICh2YWx1ZSAhPSBub3RTZXQpCisgICAgICAgIHJldHVy
biB2YWx1ZTsKKworICAgIHJldHVybiB2YWx1ZTsKK30KKworc2l6ZV90IENHcm91cE1lbW9yeUNv
bnRyb2xsZXI6OmdldE1lbW9yeVVzYWdlV2l0aENncm91cCgpCit7CisgICAgc2l6ZV90IHZhbHVl
ID0gbm90U2V0OworCisgICAgLy8gQ2hlY2sgbWVtb3J5IGxpbWl0cyBpbiBjZ3JvdXBWMgorICAg
IHZhbHVlID0gZ2V0Q2dyb3VwRmlsZVZhbHVlKG1fY2dyb3VwVjJNZW1vcnlDdXJyZW50RmlsZSk7
CisgICAgaWYgKHZhbHVlICE9IG5vdFNldCkKKyAgICAgICAgcmV0dXJuIHZhbHVlOworCisgICAg
Ly8gQ2hlY2sgbWVtb3J5IGxpbWl0cyBpbiBjZ3JvdXBWMQorICAgIHZhbHVlID0gZ2V0Q2dyb3Vw
RmlsZVZhbHVlKG1fY2dyb3VwTWVtb3J5VXNhZ2VJbkJ5dGVzRmlsZSk7CisgICAgaWYgKHZhbHVl
ICE9IG5vdFNldCkKKyAgICAgICAgcmV0dXJuIHZhbHVlOworCisgICAgcmV0dXJuIG5vdFNldDsK
K30KIAogfSAvLyBuYW1lc3BhY2UgV2ViS2l0CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQv
VUlQcm9jZXNzL2xpbnV4L01lbW9yeVByZXNzdXJlTW9uaXRvci5oIGIvU291cmNlL1dlYktpdC9V
SVByb2Nlc3MvbGludXgvTWVtb3J5UHJlc3N1cmVNb25pdG9yLmgKaW5kZXggNjRjMWQ3ZDc4NjEz
YjljZjY5MjQ5ZWE2YzRhZjBkNjVmNWE3MzkxMy4uOGYzZDY1YzllNjZiZmVlNGFlZDBiYjZjZjVm
OTU0Y2JkOGIxNDg3NCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvbGludXgv
TWVtb3J5UHJlc3N1cmVNb25pdG9yLmgKKysrIGIvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvbGlu
dXgvTWVtb3J5UHJlc3N1cmVNb25pdG9yLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJp
Z2h0IChDKSAyMDE2IElnYWxpYSBTLkwuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYsIDIwMjAgSWdh
bGlhIFMuTC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtNTAsNiArNTAsMzcg
QEAgcHJpdmF0ZToKICAgICBib29sIG1fc3RhcnRlZCB7IGZhbHNlIH07CiB9OwogCitjbGFzcyBD
R3JvdXBNZW1vcnlDb250cm9sbGVyIHsKK3B1YmxpYzoKKyAgICBDR3JvdXBNZW1vcnlDb250cm9s
bGVyKCkgPSBkZWZhdWx0OworICAgIGJvb2wgaXNBY3RpdmUoKSB7IHJldHVybiAhbV9jZ3JvdXBN
ZW1vcnlDb250cm9sbGVyUGF0aC5pc051bGwoKTsgfTsKKworICAgIHZvaWQgc2V0TWVtb3J5Q29u
dHJvbGxlclBhdGgoQ1N0cmluZyk7CisKKyAgICBzaXplX3QgZ2V0TWVtb3J5VG90YWxXaXRoQ2dy
b3VwKCk7CisgICAgc2l6ZV90IGdldE1lbW9yeVVzYWdlV2l0aENncm91cCgpOworCisgICAgfkNH
cm91cE1lbW9yeUNvbnRyb2xsZXIoKQorICAgIHsKKyAgICAgICAgZGlzcG9zZU1lbW9yeUNvbnRy
b2xsZXIoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQ1N0cmluZyBtX2Nncm91cE1lbW9yeUNv
bnRyb2xsZXJQYXRoOworCisgICAgRklMRSogbV9jZ3JvdXBNZW1vcnlNZW1zd0xpbWl0SW5CeXRl
c0ZpbGU7CisgICAgRklMRSogbV9jZ3JvdXBNZW1vcnlMaW1pdEluQnl0ZXNGaWxlOworICAgIEZJ
TEUqIG1fY2dyb3VwTWVtb3J5VXNhZ2VJbkJ5dGVzRmlsZTsKKworICAgIEZJTEUqIG1fY2dyb3Vw
VjJNZW1vcnlNZW1zd01heEZpbGU7CisgICAgRklMRSogbV9jZ3JvdXBWMk1lbW9yeU1heEZpbGU7
CisgICAgRklMRSogbV9jZ3JvdXBWMk1lbW9yeUhpZ2hGaWxlOworICAgIEZJTEUqIG1fY2dyb3Vw
VjJNZW1vcnlDdXJyZW50RmlsZTsKKworICAgIHZvaWQgZGlzcG9zZU1lbW9yeUNvbnRyb2xsZXIo
KTsKKyAgICBzaXplX3QgZ2V0Q2dyb3VwRmlsZVZhbHVlKEZJTEUqKTsKK307CisKIH0gLy8gbmFt
ZXNwYWNlIFdlYktpdAogCiAjZW5kaWYgLy8gT1MoTElOVVgpCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>395550</attachid>
            <date>2020-04-05 23:49:47 -0700</date>
            <delta_ts>2020-04-10 23:56:29 -0700</delta_ts>
            <desc>patch</desc>
            <filename>bug-209942-20200406084945.patch</filename>
            <type>text/plain</type>
            <size>18741</size>
            <attacher name="Pablo Saavedra">psaavedra</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjU5NDI4CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCmluZGV4IDE1MGZiMGQxMGNiOTUzZWQx
ZGRjY2YyYTI3NmYzOTI5MmU1ZGJiMDQuLjM2MDg0OTRmNjAwZjAxNjVlMWM2NGE4YWI5YzIxZWI5
NzQ5M2E0ODMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCisrKyBiL1NvdXJj
ZS9XZWJLaXQvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNDUgQEAKKzIwMjAtMDQtMDIgIFBhYmxvIFNh
YXZlZHJhICA8cHNhYXZlZHJhQGlnYWxpYS5jb20+CisKKyAgICAgICAgW0dUS11bV1BFXSBSZXBs
YWNlIGZvcGVuL2ZjbG9zZSBieSBmb3Blbi9mc2VlayBmdW5jdGlvbnMgaW4gTWVtb3J5UHJlc3N1
cmVNb25pdG9yCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD0yMDk5NDIKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAg
ICBSZXBsYWNpbmcgdGhlIG9wZW4oKS9jbG9zZSgpIGxvZ2ljIHRvIGdldCB0aGUgZGF0YSBmcm9t
IC9wcm9jL21lbWluZm8sCisgICAgICAgIC9wcm9jL3NlbGYvY2dyb3VwLCAuLi4gd2l0aCBhIG5l
dyBsb2dpYyB3aGVyZSB0aGUgZmlsZXMgYXJlIGp1c3QKKyAgICAgICAgb3BlbmVkIG9uY2UgYW5k
IHdlIGp1c3QgcGVyZm9ybSBhIHNlZWsgdG8gdGhlIGluaXRpYWwgcG9zaXRpb24gb2YKKyAgICAg
ICAgb2YgYW4gdW5idWZmZXJlZCBmaWxlLgorCisgICAgICAgIEFsc28gcmVmYWN0b3Jpbmcgb2Yg
c29tZSBsb2dpYzoKKworICAgICAgICAtIEFkZGVkIHRoZSBDR3JvdXBNZW1vcnlDb250cm9sbGVy
IGNsYXNzIHdoYXQgZW5jYXBzdWxhdGVzIHRoZSBsb2dpYworICAgICAgICAgIHRvIGNhbGN1bGF0
ZSB0aGUgdGhlIHRvdGFsIG1lbW9yeSBhbmQgdGhlIG1lbW9yeSB1c2FnZSB3aXRoCisgICAgICAg
ICAgY2dyb3Vwcy4KKyAgICAgICAgLSBDR3JvdXBNZW1vcnlDb250cm9sbGVyIGVuY3Bhc3VsYXRl
cyB0aGUgRklMRSBwb2ludGVycyB0byB0aGUKKyAgICAgICAgICByZWxhdGl2ZSBmaWxlcyB0byBj
Z3JvdXBzLgorICAgICAgICAtIFRoZSBtZW1JbmZvRmlsZSwgem9uZUluZm9GaWxlIGFuZCBjZ3Jv
dXBDb250cm9sbGVyRmlsZSBhcmUgbm93CisgICAgICAgICAgb3BlbmVkIG9uY2UgaW4gdGhlIFRo
cmVhZDo6Y3JlYXRlKCkgaW52b2tlZCBieSB0aGUKKyAgICAgICAgICBNZW1vcnlQcmVzc3VyZU1v
bml0b3I6OnN0YXJ0KCkuCisKKyAgICAgICAgKiBVSVByb2Nlc3MvbGludXgvTWVtb3J5UHJlc3N1
cmVNb25pdG9yLmNwcDoKKyAgICAgICAgKFdlYktpdDo6bG93V2F0ZXJtYXJrUGFnZXMpOgorICAg
ICAgICAoV2ViS2l0OjpjYWxjdWxhdGVNZW1vcnlBdmFpbGFibGUpOgorICAgICAgICAoV2ViS2l0
OjpnZXRDZ3JvdXBGaWxlKToKKyAgICAgICAgKFdlYktpdDo6Z2V0Q2dyb3VwQ29udHJvbGxlclBh
dGgpOgorICAgICAgICAoV2ViS2l0OjpzeXN0ZW1NZW1vcnlVc2VkQXNQZXJjZW50YWdlKToKKyAg
ICAgICAgKFdlYktpdDo6TWVtb3J5UHJlc3N1cmVNb25pdG9yOjpzdGFydCk6CisgICAgICAgIChX
ZWJLaXQ6OkNHcm91cE1lbW9yeUNvbnRyb2xsZXI6OnNldE1lbW9yeUNvbnRyb2xsZXJQYXRoKToK
KyAgICAgICAgKFdlYktpdDo6Q0dyb3VwTWVtb3J5Q29udHJvbGxlcjo6ZGlzcG9zZU1lbW9yeUNv
bnRyb2xsZXIpOgorICAgICAgICAoV2ViS2l0OjpDR3JvdXBNZW1vcnlDb250cm9sbGVyOjpnZXRD
Z3JvdXBGaWxlVmFsdWUpOgorICAgICAgICAoV2ViS2l0OjpDR3JvdXBNZW1vcnlDb250cm9sbGVy
OjpnZXRNZW1vcnlUb3RhbFdpdGhDZ3JvdXApOgorICAgICAgICAoV2ViS2l0OjpDR3JvdXBNZW1v
cnlDb250cm9sbGVyOjpnZXRNZW1vcnlVc2FnZVdpdGhDZ3JvdXApOgorICAgICAgICAoV2ViS2l0
OjpnZXRDZ3JvdXBGaWxlVmFsdWUpOiBEZWxldGVkLgorICAgICAgICAoV2ViS2l0OjpnZXRNZW1v
cnlUb3RhbFdpdGhDZ3JvdXApOiBEZWxldGVkLgorICAgICAgICAoV2ViS2l0OjpnZXRNZW1vcnlV
c2FnZVdpdGhDZ3JvdXApOiBEZWxldGVkLgorICAgICAgICAqIFVJUHJvY2Vzcy9saW51eC9NZW1v
cnlQcmVzc3VyZU1vbml0b3IuaDoKKyAgICAgICAgKFdlYktpdDo6Q0dyb3VwTWVtb3J5Q29udHJv
bGxlcjo6aXNBY3RpdmUpOgorICAgICAgICAoV2ViS2l0OjpDR3JvdXBNZW1vcnlDb250cm9sbGVy
Ojp+Q0dyb3VwTWVtb3J5Q29udHJvbGxlcik6CisKIDIwMjAtMDQtMDIgIFBlciBBcm5lIFZvbGxh
biAgPHB2b2xsYW5AYXBwbGUuY29tPgogCiAgICAgICAgIFVucmV2aWV3ZWQgYnVpbGQgZml4IGFm
dGVyIHIyNTkzOTYuCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9saW51eC9N
ZW1vcnlQcmVzc3VyZU1vbml0b3IuY3BwIGIvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvbGludXgv
TWVtb3J5UHJlc3N1cmVNb25pdG9yLmNwcAppbmRleCA0Zjg4Y2Q4NzQ2NGQxZWI2M2Q1OTRlYWJk
MzIxZjA3MzMwOTdhNzlhLi4wYTA0ZjA0OGVkYzliMjU3OTE1NzEwODJmYzA2YTFkMzc1ODdmZjJk
IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9saW51eC9NZW1vcnlQcmVzc3Vy
ZU1vbml0b3IuY3BwCisrKyBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL2xpbnV4L01lbW9yeVBy
ZXNzdXJlTW9uaXRvci5jcHAKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAy
MDE2LCAyMDE4IElnYWxpYSBTLkwuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYsIDIwMTgsIDIwMjAg
SWdhbGlhIFMuTC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtNTEsMjAgKzUx
LDI4IEBAIHN0YXRpYyBjb25zdCBpbnQgc19tZW1vcnlQcmVzdXJlUGVyY2VudGFnZVRocmVzaG9s
ZENyaXRpY2FsID0gOTU7CiAvLyBjZ3JvdXBzLjc6IFRoZSB1c3VhbCBwbGFjZSBmb3Igc3VjaCBt
b3VudHMgaXMgdW5kZXIgYSB0bXBmcyg1KQogLy8gZmlsZXN5c3RlbSBtb3VudGVkIGF0IC9zeXMv
ZnMvY2dyb3VwLgogc3RhdGljIGNvbnN0IGNoYXIqIHNfY2dyb3VwTWVtb3J5UGF0aCA9ICIvc3lz
L2ZzL2Nncm91cC8lcy8lcy8lcyI7Ci1zdGF0aWMgY29uc3QgY2hhciogc19jZ3JvdXBDb250cm9s
bGVyID0gIi9wcm9jL3NlbGYvY2dyb3VwIjsKKworLy8gL3Byb2MgZmlsZXN5c3RlbXMgYXJlIGRp
cmVjdGx5IG1haW50YWluZWQgYnkgdGhlIGtlcm5lbC4KKy8vIE9uIG9wZW4gdGhlIGtlcm5lbCB3
aWxsIHByb3ZpZGUgdGhlIHByb2Nlc3MgYSBzdGF0aWMgY29weSBvZiB0aGUgZGF0YSBpZiB0aGUK
Ky8vIGRhdGEgaW4gcXVlc3Rpb24gaXMgZHluYW1pY2FsbHkgY2hhbmdpbmcuCitzdGF0aWMgY29u
c3QgY2hhciogc19wcm9jTWVtaW5mbyA9ICIvcHJvYy9tZW1pbmZvIjsKK3N0YXRpYyBjb25zdCBj
aGFyKiBzX3Byb2Nab25laW5mbyA9ICIvcHJvYy96b25laW5mbyI7CitzdGF0aWMgY29uc3QgY2hh
ciogc19wcm9jU2VsZkNncm91cCA9ICIvcHJvYy9zZWxmL2Nncm91cCI7CiBzdGF0aWMgY29uc3Qg
dW5zaWduZWQgbWF4Q2dyb3VwUGF0aCA9IDQwOTY7IC8vIFBBVEhfTUFYID0gNDA5NiBmcm9tIChM
aW51eCkgaW5jbHVkZS91YXBpL2xpbnV4L2xpbWl0cy5oCiAKLXN0YXRpYyBzaXplX3QgbG93V2F0
ZXJtYXJrUGFnZXMoKQorc3RhdGljIHNpemVfdCBsb3dXYXRlcm1hcmtQYWdlcyhGSUxFKiB6b25l
SW5mb0ZpbGUpCiB7Ci0gICAgRklMRSogZmlsZSA9IGZvcGVuKCIvcHJvYy96b25laW5mbyIsICJy
Iik7Ci0gICAgaWYgKCFmaWxlKQorICAgIGlmICghem9uZUluZm9GaWxlKQorICAgICAgICByZXR1
cm4gbm90U2V0OworCisgICAgaWYgKGZzZWVrKHpvbmVJbmZvRmlsZSwgMCwgU0VFS19TRVQpKQog
ICAgICAgICByZXR1cm4gbm90U2V0OwogCiAgICAgc2l6ZV90IGxvdyA9IDA7CiAgICAgYm9vbCBp
blpvbmUgPSBmYWxzZTsKICAgICBib29sIGZvdW5kTG93ID0gZmFsc2U7CiAgICAgY2hhciBidWZm
ZXJbMTI4XTsKLSAgICB3aGlsZSAoY2hhciogbGluZSA9IGZnZXRzKGJ1ZmZlciwgMTI4LCBmaWxl
KSkgeworICAgIHdoaWxlIChjaGFyKiBsaW5lID0gZmdldHMoYnVmZmVyLCAxMjgsIHpvbmVJbmZv
RmlsZSkpIHsKICAgICAgICAgaWYgKCFzdHJuY21wKGxpbmUsICJOb2RlIiwgNCkpIHsKICAgICAg
ICAgICAgIGluWm9uZSA9IHRydWU7CiAgICAgICAgICAgICBmb3VuZExvdyA9IGZhbHNlOwpAQCAt
OTIsOCArMTAwLDYgQEAgc3RhdGljIHNpemVfdCBsb3dXYXRlcm1hcmtQYWdlcygpCiAgICAgICAg
ICAgICBmb3VuZExvdyA9IHRydWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgZmNsb3NlKGZpbGUp
OwotCiAgICAgcmV0dXJuIGxvdzsKIH0KIApAQCAtMTA4LDEyICsxMTQsMTIgQEAgc3RhdGljIGlu
bGluZSBzaXplX3Qgc3lzdGVtUGFnZVNpemUoKQogLy8gSWYgTWVtQXZhaWxhYmxlIHdhcyBub3Qg
cHJlc2VudCBpbiAvcHJvYy9tZW1pbmZvLCBiZWNhdXNlIGl0J3MgYW4gb2xkIGtlcm5lbCB2ZXJz
aW9uLAogLy8gd2UgY2FuIGRvIHRoZSBzYW1lIGNhbGN1bGF0aW9uIHdpdGggdGhlIGluZm9ybWF0
aW9uIHdlIGhhdmUgZnJvbSBtZW1pbmZvIGFuZCB0aGUgbG93IHdhdGVybWFrcy4KIC8vIFNlZSBo
dHRwczovL2dpdC5rZXJuZWwub3JnL2NnaXQvbGludXgva2VybmVsL2dpdC90b3J2YWxkcy9saW51
eC5naXQvY29tbWl0Lz9pZD0zNGU0MzFiMGFlMzk4ZmM1NGVhNjlmZjg1ZWM3MDA3MjJjOWRhNzcz
Ci1zdGF0aWMgc2l6ZV90IGNhbGN1bGF0ZU1lbW9yeUF2YWlsYWJsZShzaXplX3QgbWVtb3J5RnJl
ZSwgc2l6ZV90IGFjdGl2ZUZpbGUsIHNpemVfdCBpbmFjdGl2ZUZpbGUsIHNpemVfdCBzbGFiUmVj
bGFpbWFibGUpCitzdGF0aWMgc2l6ZV90IGNhbGN1bGF0ZU1lbW9yeUF2YWlsYWJsZShzaXplX3Qg
bWVtb3J5RnJlZSwgc2l6ZV90IGFjdGl2ZUZpbGUsIHNpemVfdCBpbmFjdGl2ZUZpbGUsIHNpemVf
dCBzbGFiUmVjbGFpbWFibGUsIEZJTEUqIHpvbmVJbmZvRmlsZSkKIHsKICAgICBpZiAobWVtb3J5
RnJlZSA9PSBub3RTZXQgfHwgYWN0aXZlRmlsZSA9PSBub3RTZXQgfHwgaW5hY3RpdmVGaWxlID09
IG5vdFNldCB8fCBzbGFiUmVjbGFpbWFibGUgPT0gbm90U2V0KQogICAgICAgICByZXR1cm4gbm90
U2V0OwogCi0gICAgc2l6ZV90IGxvd1dhdGVybWFyayA9IGxvd1dhdGVybWFya1BhZ2VzKCk7Cisg
ICAgc2l6ZV90IGxvd1dhdGVybWFyayA9IGxvd1dhdGVybWFya1BhZ2VzKHpvbmVJbmZvRmlsZSk7
CiAgICAgaWYgKGxvd1dhdGVybWFyayA9PSBub3RTZXQpCiAgICAgICAgIHJldHVybiBub3RTZXQ7
CiAKQEAgLTEzNiw3NSArMTQyLDE0IEBAIHN0YXRpYyBzaXplX3QgY2FsY3VsYXRlTWVtb3J5QXZh
aWxhYmxlKHNpemVfdCBtZW1vcnlGcmVlLCBzaXplX3QgYWN0aXZlRmlsZSwgc2l6CiAgICAgcmV0
dXJuIG1lbW9yeUF2YWlsYWJsZTsKIH0KIAotCi1zaXplX3QgZ2V0Q2dyb3VwRmlsZVZhbHVlKENT
dHJpbmcgY2dyb3VwQ29udHJvbGxlck5hbWUsIENTdHJpbmcgY2dyb3VwQ29udHJvbGxlclBhdGgs
IENTdHJpbmcgY2dyb3VwRmlsZU5hbWUpCitGSUxFKiBnZXRDZ3JvdXBGaWxlKENTdHJpbmcgY2dy
b3VwQ29udHJvbGxlck5hbWUsIENTdHJpbmcgY2dyb3VwQ29udHJvbGxlclBhdGgsIENTdHJpbmcg
Y2dyb3VwRmlsZU5hbWUpCiB7Ci0gICAgY2hhciBidWZmZXJbMTI4XTsKICAgICBjaGFyIGNncm91
cFBhdGhbbWF4Q2dyb3VwUGF0aF07Ci0gICAgY2hhciogdG9rZW47Ci0gICAgRklMRSogZmlsZTsK
LSAgICBib29sIG9rID0gdHJ1ZTsKLQogICAgIHNucHJpbnRmKGNncm91cFBhdGgsIG1heENncm91
cFBhdGgsIHNfY2dyb3VwTWVtb3J5UGF0aCwgY2dyb3VwQ29udHJvbGxlck5hbWUuZGF0YSgpLCBj
Z3JvdXBDb250cm9sbGVyUGF0aC5kYXRhKCksIGNncm91cEZpbGVOYW1lLmRhdGEoKSk7Ci0gICAg
ZmlsZSA9IGZvcGVuKGNncm91cFBhdGgsICJyIik7Ci0gICAgaWYgKGZpbGUpIHsKLSAgICAgICAg
dG9rZW4gPSBmZ2V0cyhidWZmZXIsIDEyOCwgZmlsZSk7Ci0gICAgICAgIGZjbG9zZShmaWxlKTsK
LSAgICAgICAgc2l6ZV90IHZhbHVlID0gdG9JbnRlZ3JhbFR5cGU8c2l6ZV90Pih0b2tlbiwgc3Ry
bGVuKHRva2VuKSwgJm9rKTsKLSAgICAgICAgaWYgKCFvaykKLSAgICAgICAgICAgIHZhbHVlID0g
bm90U2V0OwotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotICAgIHJldHVybiBub3RTZXQ7
Ci19Ci0KLXNpemVfdCBnZXRNZW1vcnlUb3RhbFdpdGhDZ3JvdXAoQ1N0cmluZyBtZW1vcnlDb250
cm9sbGVyTmFtZSkKLXsKLSAgICBzaXplX3QgdmFsdWUgPSBub3RTZXQ7Ci0KLSAgICAvLyBDaGVj
ayBtZW1vcnkgbGltaXRzIGluIGNncm91cFYyCi0gICAgdmFsdWUgPSBnZXRDZ3JvdXBGaWxlVmFs
dWUoIi8iLCBtZW1vcnlDb250cm9sbGVyTmFtZSwgQ1N0cmluZygibWVtb3J5Lm1lbXN3Lm1heCIp
KTsKLSAgICBpZiAodmFsdWUgIT0gbm90U2V0KQotICAgICAgICByZXR1cm4gdmFsdWU7Ci0KLSAg
ICB2YWx1ZSA9IGdldENncm91cEZpbGVWYWx1ZSgiLyIsIG1lbW9yeUNvbnRyb2xsZXJOYW1lLCBD
U3RyaW5nKCJtZW1vcnkubWF4IikpOwotICAgIHNpemVfdCB2YWx1ZUhpZ2ggPSBnZXRDZ3JvdXBG
aWxlVmFsdWUoIi8iLCBtZW1vcnlDb250cm9sbGVyTmFtZSwgQ1N0cmluZygibWVtb3J5LmhpZ2gi
KSk7Ci0gICAgaWYgKHZhbHVlICE9IG5vdFNldCAmJiB2YWx1ZUhpZ2ggIT0gbm90U2V0KSB7Ci0g
ICAgICAgIHZhbHVlID0gc3RkOjptaW4odmFsdWUsIHZhbHVlSGlnaCk7Ci0gICAgICAgIHJldHVy
biB2YWx1ZTsKLSAgICB9Ci0gICAgaWYgKHZhbHVlSGlnaCAhPSBub3RTZXQpCi0gICAgICAgIHJl
dHVybiB2YWx1ZUhpZ2g7Ci0gICAgaWYgKHZhbHVlICE9IG5vdFNldCkKLSAgICAgICAgcmV0dXJu
IHZhbHVlOwotCi0gICAgLy8gQ2hlY2sgbWVtb3J5IGxpbWl0cyBpbiBjZ3JvdXBWMQotICAgIHZh
bHVlID0gZ2V0Q2dyb3VwRmlsZVZhbHVlKCJtZW1vcnkiLCBtZW1vcnlDb250cm9sbGVyTmFtZSwg
Q1N0cmluZygibWVtb3J5Lm1lbXN3LmxpbWl0X2luX2J5dGVzIikpOwotICAgIGlmICh2YWx1ZSAh
PSBub3RTZXQpCi0gICAgICAgIHJldHVybiB2YWx1ZTsKLQotICAgIHZhbHVlID0gZ2V0Q2dyb3Vw
RmlsZVZhbHVlKCJtZW1vcnkiLCBtZW1vcnlDb250cm9sbGVyTmFtZSwgQ1N0cmluZygibWVtb3J5
LmxpbWl0X2luX2J5dGVzIikpOwotICAgIGlmICh2YWx1ZSAhPSBub3RTZXQpCi0gICAgICAgIHJl
dHVybiB2YWx1ZTsKLQotICAgIHJldHVybiB2YWx1ZTsKLX0KLQotc3RhdGljIHNpemVfdCBnZXRN
ZW1vcnlVc2FnZVdpdGhDZ3JvdXAoQ1N0cmluZyBtZW1vcnlDb250cm9sbGVyTmFtZSkKLXsKLSAg
ICBzaXplX3QgdmFsdWUgPSBub3RTZXQ7Ci0KLSAgICAvLyBDaGVjayBtZW1vcnkgbGltaXRzIGlu
IGNncm91cFYyCi0gICAgdmFsdWUgPSBnZXRDZ3JvdXBGaWxlVmFsdWUoIi8iLCBtZW1vcnlDb250
cm9sbGVyTmFtZSwgQ1N0cmluZygibWVtb3J5LmN1cnJlbnQiKSk7Ci0gICAgaWYgKHZhbHVlICE9
IG5vdFNldCkKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotCi0gICAgLy8gQ2hlY2sgbWVtb3J5IGxp
bWl0cyBpbiBjZ3JvdXBWMQotICAgIHZhbHVlID0gZ2V0Q2dyb3VwRmlsZVZhbHVlKCJtZW1vcnki
LCBtZW1vcnlDb250cm9sbGVyTmFtZSwgQ1N0cmluZygibWVtb3J5LnVzYWdlX2luX2J5dGVzIikp
OwotICAgIGlmICh2YWx1ZSAhPSBub3RTZXQpCi0gICAgICAgIHJldHVybiB2YWx1ZTsKLQotICAg
IHJldHVybiBub3RTZXQ7CisgICAgRklMRSogZmlsZSA9IGZvcGVuKGNncm91cFBhdGgsICJyIik7
CisgICAgaWYgKGZpbGUpCisgICAgICAgIHNldGJ1ZihmaWxlLCBudWxscHRyKTsKKyAgICByZXR1
cm4gZmlsZTsKIH0KIAogLy8gVGhpcyBmaWxlIGRlc2NyaWJlcyBjb250cm9sIGdyb3VwcyB0byB3
aGljaCB0aGUgcHJvY2VzcyB3aXRoCkBAIC0yMjcsMTUgKzE3MiwxNyBAQCBzdGF0aWMgc2l6ZV90
IGdldE1lbW9yeVVzYWdlV2l0aENncm91cChDU3RyaW5nIG1lbW9yeUNvbnRyb2xsZXJOYW1lKQog
Ly8gMjpjcHVzZXQ6LwogLy8gMTpuYW1lPXN5c3RlbWQ6L3VzZXIuc2xpY2UvdXNlci0xMDAwLnNs
aWNlL3VzZXJAMTAwMC5zZXJ2aWNlL2dub21lLXRlcm1pbmFsLXNlcnZlci5zZXJ2aWNlCiAvLyAw
OjovdXNlci5zbGljZS91c2VyLTEwMDAuc2xpY2UvdXNlckAxMDAwLnNlcnZpY2UvZ25vbWUtdGVy
bWluYWwtc2VydmVyLnNlcnZpY2UKLXN0YXRpYyBDU3RyaW5nIGdldENncm91cENvbnRyb2xsZXJQ
YXRoKGNvbnN0IGNoYXIqIGNvbnRyb2xsZXJOYW1lKQorc3RhdGljIENTdHJpbmcgZ2V0Q2dyb3Vw
Q29udHJvbGxlclBhdGgoRklMRSogY2dyb3VwQ29udHJvbGxlckZpbGUsIGNvbnN0IGNoYXIqIGNv
bnRyb2xsZXJOYW1lKQogewotICAgIENTdHJpbmcgbWVtb3J5Q29udHJvbGxlclBhdGg7Ci0gICAg
RklMRSogZmlsZSA9IGZvcGVuKHNfY2dyb3VwQ29udHJvbGxlciwgInIiKTsKLSAgICBpZiAoIWZp
bGUpCisgICAgQ1N0cmluZyBjZ3JvdXBNZW1vcnlDb250cm9sbGVyUGF0aDsKKyAgICBpZiAoIWNn
cm91cENvbnRyb2xsZXJGaWxlKQorICAgICAgICByZXR1cm4gQ1N0cmluZygpOworCisgICAgaWYg
KGZzZWVrKGNncm91cENvbnRyb2xsZXJGaWxlLCAwLCBTRUVLX1NFVCkpCiAgICAgICAgIHJldHVy
biBDU3RyaW5nKCk7CiAKICAgICBjaGFyIGJ1ZmZlclttYXhDZ3JvdXBQYXRoXTsKLSAgICB3aGls
ZSAoY2hhciogbGluZSA9IGZnZXRzKGJ1ZmZlciwgbWF4Q2dyb3VwUGF0aCwgZmlsZSkpIHsKKyAg
ICB3aGlsZSAoY2hhciogbGluZSA9IGZnZXRzKGJ1ZmZlciwgbWF4Q2dyb3VwUGF0aCwgY2dyb3Vw
Q29udHJvbGxlckZpbGUpKSB7CiAgICAgICAgIGNoYXIqIHRva2VuID0gc3RydG9rKGxpbmUsICJc
biIpOwogICAgICAgICBpZiAoIXRva2VuKQogICAgICAgICAgICAgYnJlYWs7CkBAIC0yNDQsMzAg
KzE5MSwzMCBAQCBzdGF0aWMgQ1N0cmluZyBnZXRDZ3JvdXBDb250cm9sbGVyUGF0aChjb25zdCBj
aGFyKiBjb250cm9sbGVyTmFtZSkKICAgICAgICAgdG9rZW4gPSBzdHJ0b2sobnVsbHB0ciwgIjoi
KTsKICAgICAgICAgaWYgKCFzdHJjbXAodG9rZW4sIGNvbnRyb2xsZXJOYW1lKSkgewogICAgICAg
ICAgICAgdG9rZW4gPSBzdHJ0b2sobnVsbHB0ciwgIjoiKTsKLSAgICAgICAgICAgIG1lbW9yeUNv
bnRyb2xsZXJQYXRoID0gQ1N0cmluZyh0b2tlbik7Ci0gICAgICAgICAgICBmY2xvc2UoZmlsZSk7
Ci0gICAgICAgICAgICByZXR1cm4gbWVtb3J5Q29udHJvbGxlclBhdGg7CisgICAgICAgICAgICBj
Z3JvdXBNZW1vcnlDb250cm9sbGVyUGF0aCA9IENTdHJpbmcodG9rZW4pOworICAgICAgICAgICAg
cmV0dXJuIGNncm91cE1lbW9yeUNvbnRyb2xsZXJQYXRoOwogICAgICAgICB9CiAgICAgICAgIGlm
ICghc3RybmNtcCh0b2tlbiwgIm5hbWU9c3lzdGVtZCIsIDEyKSkgewogICAgICAgICAgICAgdG9r
ZW4gPSBzdHJ0b2sobnVsbHB0ciwgIjoiKTsKLSAgICAgICAgICAgIG1lbW9yeUNvbnRyb2xsZXJQ
YXRoID0gQ1N0cmluZyh0b2tlbik7CisgICAgICAgICAgICBjZ3JvdXBNZW1vcnlDb250cm9sbGVy
UGF0aCA9IENTdHJpbmcodG9rZW4pOwogICAgICAgICB9CiAgICAgfQotICAgIGZjbG9zZShmaWxl
KTsKLSAgICByZXR1cm4gbWVtb3J5Q29udHJvbGxlclBhdGg7CisgICAgcmV0dXJuIGNncm91cE1l
bW9yeUNvbnRyb2xsZXJQYXRoOwogfQogCiAKLXN0YXRpYyBpbnQgc3lzdGVtTWVtb3J5VXNlZEFz
UGVyY2VudGFnZSgpCitzdGF0aWMgaW50IHN5c3RlbU1lbW9yeVVzZWRBc1BlcmNlbnRhZ2UoRklM
RSogbWVtSW5mb0ZpbGUsIEZJTEUqIHpvbmVJbmZvRmlsZSwgQ0dyb3VwTWVtb3J5Q29udHJvbGxl
ciogbWVtb3J5Q29udHJvbGxlcikKIHsKLSAgICBGSUxFKiBmaWxlID0gZm9wZW4oIi9wcm9jL21l
bWluZm8iLCAiciIpOwotICAgIGlmICghZmlsZSkKKyAgICBpZiAoIW1lbUluZm9GaWxlKQorICAg
ICAgICByZXR1cm4gLTE7CisKKyAgICBpZiAoZnNlZWsobWVtSW5mb0ZpbGUsIDAsIFNFRUtfU0VU
KSkKICAgICAgICAgcmV0dXJuIC0xOwogCiAgICAgc2l6ZV90IG1lbW9yeUF2YWlsYWJsZSwgbWVt
b3J5VG90YWwsIG1lbW9yeUZyZWUsIGFjdGl2ZUZpbGUsIGluYWN0aXZlRmlsZSwgc2xhYlJlY2xh
aW1hYmxlOwogICAgIG1lbW9yeUF2YWlsYWJsZSA9IG1lbW9yeVRvdGFsID0gbWVtb3J5RnJlZSA9
IGFjdGl2ZUZpbGUgPSBpbmFjdGl2ZUZpbGUgPSBzbGFiUmVjbGFpbWFibGUgPSBub3RTZXQ7CiAg
ICAgY2hhciBidWZmZXJbMTI4XTsKLSAgICB3aGlsZSAoY2hhciogbGluZSA9IGZnZXRzKGJ1ZmZl
ciwgMTI4LCBmaWxlKSkgeworICAgIHdoaWxlIChjaGFyKiBsaW5lID0gZmdldHMoYnVmZmVyLCAx
MjgsIG1lbUluZm9GaWxlKSkgewogICAgICAgICBjaGFyKiB0b2tlbiA9IHN0cnRvayhsaW5lLCAi
ICIpOwogICAgICAgICBib29sIG9rID0gdHJ1ZTsKICAgICAgICAgaWYgKCF0b2tlbikKQEAgLTMy
MSwxMyArMjY4LDEyIEBAIHN0YXRpYyBpbnQgc3lzdGVtTWVtb3J5VXNlZEFzUGVyY2VudGFnZSgp
CiAgICAgICAgIGlmIChtZW1vcnlUb3RhbCAhPSBub3RTZXQgJiYgbWVtb3J5RnJlZSAhPSBub3RT
ZXQgJiYgYWN0aXZlRmlsZSAhPSBub3RTZXQgJiYgaW5hY3RpdmVGaWxlICE9IG5vdFNldCAmJiBz
bGFiUmVjbGFpbWFibGUgIT0gbm90U2V0KQogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQotICAg
IGZjbG9zZShmaWxlKTsKIAogICAgIGlmICghbWVtb3J5VG90YWwgfHwgbWVtb3J5VG90YWwgPT0g
bm90U2V0KQogICAgICAgICByZXR1cm4gLTE7CiAKICAgICBpZiAobWVtb3J5QXZhaWxhYmxlID09
IG5vdFNldCkgewotICAgICAgICBtZW1vcnlBdmFpbGFibGUgPSBjYWxjdWxhdGVNZW1vcnlBdmFp
bGFibGUobWVtb3J5RnJlZSwgYWN0aXZlRmlsZSwgaW5hY3RpdmVGaWxlLCBzbGFiUmVjbGFpbWFi
bGUpOworICAgICAgICBtZW1vcnlBdmFpbGFibGUgPSBjYWxjdWxhdGVNZW1vcnlBdmFpbGFibGUo
bWVtb3J5RnJlZSwgYWN0aXZlRmlsZSwgaW5hY3RpdmVGaWxlLCBzbGFiUmVjbGFpbWFibGUsIHpv
bmVJbmZvRmlsZSk7CiAgICAgICAgIGlmIChtZW1vcnlBdmFpbGFibGUgPT0gbm90U2V0KQogICAg
ICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KQEAgLTMzNiwxMCArMjgyLDkgQEAgc3RhdGljIGlu
dCBzeXN0ZW1NZW1vcnlVc2VkQXNQZXJjZW50YWdlKCkKICAgICAgICAgcmV0dXJuIC0xOwogCiAg
ICAgaW50IG1lbW9yeVVzYWdlUGVyY2VudGFnZSA9ICgobWVtb3J5VG90YWwgLSBtZW1vcnlBdmFp
bGFibGUpICogMTAwKSAvIG1lbW9yeVRvdGFsOwotICAgIENTdHJpbmcgbWVtb3J5Q29udHJvbGxl
clBhdGggPSBnZXRDZ3JvdXBDb250cm9sbGVyUGF0aCgibWVtb3J5Iik7Ci0gICAgaWYgKCFtZW1v
cnlDb250cm9sbGVyUGF0aC5pc051bGwoKSkgewotICAgICAgICBtZW1vcnlUb3RhbCA9IGdldE1l
bW9yeVRvdGFsV2l0aENncm91cChtZW1vcnlDb250cm9sbGVyUGF0aCk7Ci0gICAgICAgIHNpemVf
dCBtZW1vcnlVc2FnZSA9IGdldE1lbW9yeVVzYWdlV2l0aENncm91cChtZW1vcnlDb250cm9sbGVy
UGF0aCk7CisgICAgaWYgKG1lbW9yeUNvbnRyb2xsZXItPmlzQWN0aXZlKCkpIHsKKyAgICAgICAg
bWVtb3J5VG90YWwgPSBtZW1vcnlDb250cm9sbGVyLT5nZXRNZW1vcnlUb3RhbFdpdGhDZ3JvdXAo
KTsKKyAgICAgICAgc2l6ZV90IG1lbW9yeVVzYWdlID0gbWVtb3J5Q29udHJvbGxlci0+Z2V0TWVt
b3J5VXNhZ2VXaXRoQ2dyb3VwKCk7CiAgICAgICAgIGlmIChtZW1vcnlUb3RhbCAhPSBub3RTZXQg
JiYgbWVtb3J5VXNhZ2UgIT0gbm90U2V0KSB7CiAgICAgICAgICAgICBpbnQgbWVtb3J5VXNhZ2VQ
ZXJjZW50YWdlV2l0aENncm91cCA9IDEwMCAqICgoZmxvYXQpIG1lbW9yeVVzYWdlIC8gKGZsb2F0
KSBtZW1vcnlUb3RhbCk7CiAgICAgICAgICAgICBpZiAobWVtb3J5VXNhZ2VQZXJjZW50YWdlV2l0
aENncm91cCA+IG1lbW9yeVVzYWdlUGVyY2VudGFnZSkKQEAgLTM3NywxMSArMzIyLDI4IEBAIHZv
aWQgTWVtb3J5UHJlc3N1cmVNb25pdG9yOjpzdGFydCgpCiAgICAgbV9zdGFydGVkID0gdHJ1ZTsK
IAogICAgIFRocmVhZDo6Y3JlYXRlKCJNZW1vcnlQcmVzc3VyZU1vbml0b3IiLCBbXSB7CisgICAg
ICAgIEZJTEUqIG1lbUluZm9GaWxlOworICAgICAgICBGSUxFKiB6b25lSW5mb0ZpbGU7CisgICAg
ICAgIEZJTEUqIGNncm91cENvbnRyb2xsZXJGaWxlOworICAgICAgICBDR3JvdXBNZW1vcnlDb250
cm9sbGVyIG1lbW9yeUNvbnRyb2xsZXIgPSBDR3JvdXBNZW1vcnlDb250cm9sbGVyKCk7CiAgICAg
ICAgIFNlY29uZHMgcG9sbEludGVydmFsID0gc19tYXhQb2xsaW5nSW50ZXJ2YWw7CiAgICAgICAg
IHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgICBzbGVlcChwb2xsSW50ZXJ2YWwpOwogCi0gICAg
ICAgICAgICBpbnQgdXNlZFBlcmNlbnRhZ2UgPSBzeXN0ZW1NZW1vcnlVc2VkQXNQZXJjZW50YWdl
KCk7CisgICAgICAgICAgICBtZW1JbmZvRmlsZSA9IGZvcGVuKHNfcHJvY01lbWluZm8sICJyIik7
CisgICAgICAgICAgICB6b25lSW5mb0ZpbGUgPSBmb3BlbihzX3Byb2Nab25laW5mbywgInIiKTsK
KyAgICAgICAgICAgIGlmICghbWVtSW5mb0ZpbGUgfHwgIXpvbmVJbmZvRmlsZSkKKyAgICAgICAg
ICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIHNldGJ1ZihtZW1JbmZvRmlsZSwgbnVsbHB0
cik7CisgICAgICAgICAgICBzZXRidWYoem9uZUluZm9GaWxlLCBudWxscHRyKTsKKworICAgICAg
ICAgICAgY2dyb3VwQ29udHJvbGxlckZpbGUgPSBmb3BlbihzX3Byb2NTZWxmQ2dyb3VwLCAiciIp
OworICAgICAgICAgICAgaWYgKGNncm91cENvbnRyb2xsZXJGaWxlKQorICAgICAgICAgICAgICAg
IHNldGJ1ZihjZ3JvdXBDb250cm9sbGVyRmlsZSwgbnVsbHB0cik7CisKKyAgICAgICAgICAgIENT
dHJpbmcgY2dyb3VwTWVtb3J5Q29udHJvbGxlclBhdGggPSBnZXRDZ3JvdXBDb250cm9sbGVyUGF0
aChjZ3JvdXBDb250cm9sbGVyRmlsZSwgIm1lbW9yeSIpOworICAgICAgICAgICAgbWVtb3J5Q29u
dHJvbGxlci5zZXRNZW1vcnlDb250cm9sbGVyUGF0aChjZ3JvdXBNZW1vcnlDb250cm9sbGVyUGF0
aCk7CisgICAgICAgICAgICBpbnQgdXNlZFBlcmNlbnRhZ2UgPSBzeXN0ZW1NZW1vcnlVc2VkQXNQ
ZXJjZW50YWdlKG1lbUluZm9GaWxlLCB6b25lSW5mb0ZpbGUsICZtZW1vcnlDb250cm9sbGVyKTsK
ICAgICAgICAgICAgIGlmICh1c2VkUGVyY2VudGFnZSA9PSAtMSkgewogICAgICAgICAgICAgICAg
IFdURkxvZ0Fsd2F5cygiRmFpbGVkIHRvIGdldCB0aGUgbWVtb3J5IHVzYWdlIik7CiAgICAgICAg
ICAgICAgICAgYnJlYWs7CkBAIC0zOTQsOSArMzU2LDExOCBAQCB2b2lkIE1lbW9yeVByZXNzdXJl
TW9uaXRvcjo6c3RhcnQoKQogICAgICAgICAgICAgfQogICAgICAgICAgICAgcG9sbEludGVydmFs
ID0gcG9sbEludGVydmFsRm9yVXNlZE1lbW9yeVBlcmNlbnRhZ2UodXNlZFBlcmNlbnRhZ2UpOwog
ICAgICAgICB9CisgICAgICAgIGlmIChtZW1JbmZvRmlsZSkKKyAgICAgICAgICAgIGZjbG9zZSht
ZW1JbmZvRmlsZSk7CisgICAgICAgIGlmICh6b25lSW5mb0ZpbGUpCisgICAgICAgICAgICBmY2xv
c2Uoem9uZUluZm9GaWxlKTsKKyAgICAgICAgaWYgKGNncm91cENvbnRyb2xsZXJGaWxlKQorICAg
ICAgICAgICAgZmNsb3NlKGNncm91cENvbnRyb2xsZXJGaWxlKTsKICAgICB9KS0+ZGV0YWNoKCk7
CiB9CiAKK3ZvaWQgQ0dyb3VwTWVtb3J5Q29udHJvbGxlcjo6c2V0TWVtb3J5Q29udHJvbGxlclBh
dGgoQ1N0cmluZyBtZW1vcnlDb250cm9sbGVyUGF0aCkKK3sKKyAgICBpZiAobWVtb3J5Q29udHJv
bGxlclBhdGggPT0gbV9jZ3JvdXBNZW1vcnlDb250cm9sbGVyUGF0aCkKKyAgICAgICAgcmV0dXJu
OworCisgICAgbV9jZ3JvdXBNZW1vcnlDb250cm9sbGVyUGF0aCA9IG1lbW9yeUNvbnRyb2xsZXJQ
YXRoOworICAgIGRpc3Bvc2VNZW1vcnlDb250cm9sbGVyKCk7CisKKyAgICBtX2Nncm91cFYyTWVt
b3J5Q3VycmVudEZpbGUgPSBnZXRDZ3JvdXBGaWxlKCIvIiwgbWVtb3J5Q29udHJvbGxlclBhdGgs
IENTdHJpbmcoIm1lbW9yeS5jdXJyZW50IikpOworICAgIG1fY2dyb3VwVjJNZW1vcnlNZW1zd01h
eEZpbGUgPSBnZXRDZ3JvdXBGaWxlKCIvIiwgbWVtb3J5Q29udHJvbGxlclBhdGgsIENTdHJpbmco
Im1lbW9yeS5tZW1zdy5tYXgiKSk7CisgICAgbV9jZ3JvdXBWMk1lbW9yeU1heEZpbGUgPSBnZXRD
Z3JvdXBGaWxlKCIvIiwgbWVtb3J5Q29udHJvbGxlclBhdGgsIENTdHJpbmcoIm1lbW9yeS5tYXgi
KSk7CisgICAgbV9jZ3JvdXBWMk1lbW9yeUhpZ2hGaWxlID0gZ2V0Q2dyb3VwRmlsZSgiLyIsIG1l
bW9yeUNvbnRyb2xsZXJQYXRoLCBDU3RyaW5nKCJtZW1vcnkuaGlnaCIpKTsKKworICAgIG1fY2dy
b3VwTWVtb3J5TWVtc3dMaW1pdEluQnl0ZXNGaWxlID0gZ2V0Q2dyb3VwRmlsZSgibWVtb3J5Iiwg
bWVtb3J5Q29udHJvbGxlclBhdGgsIENTdHJpbmcoIm1lbW9yeS5tZW1zdy5saW1pdF9pbl9ieXRl
cyIpKTsKKyAgICBtX2Nncm91cE1lbW9yeUxpbWl0SW5CeXRlc0ZpbGUgPSBnZXRDZ3JvdXBGaWxl
KCJtZW1vcnkiLCBtZW1vcnlDb250cm9sbGVyUGF0aCwgQ1N0cmluZygibWVtb3J5LmxpbWl0X2lu
X2J5dGVzIikpOworICAgIG1fY2dyb3VwTWVtb3J5VXNhZ2VJbkJ5dGVzRmlsZSA9IGdldENncm91
cEZpbGUoIm1lbW9yeSIsIG1lbW9yeUNvbnRyb2xsZXJQYXRoLCBDU3RyaW5nKCJtZW1vcnkudXNh
Z2VfaW5fYnl0ZXMiKSk7Cit9CisKK3ZvaWQgQ0dyb3VwTWVtb3J5Q29udHJvbGxlcjo6ZGlzcG9z
ZU1lbW9yeUNvbnRyb2xsZXIoKQoreworICAgIGlmIChtX2Nncm91cE1lbW9yeU1lbXN3TGltaXRJ
bkJ5dGVzRmlsZSkKKyAgICAgICAgZmNsb3NlKG1fY2dyb3VwTWVtb3J5TWVtc3dMaW1pdEluQnl0
ZXNGaWxlKTsKKyAgICBpZiAobV9jZ3JvdXBNZW1vcnlMaW1pdEluQnl0ZXNGaWxlKQorICAgICAg
ICBmY2xvc2UobV9jZ3JvdXBNZW1vcnlMaW1pdEluQnl0ZXNGaWxlKTsKKyAgICBpZiAobV9jZ3Jv
dXBNZW1vcnlVc2FnZUluQnl0ZXNGaWxlKQorICAgICAgICBmY2xvc2UobV9jZ3JvdXBNZW1vcnlV
c2FnZUluQnl0ZXNGaWxlKTsKKworICAgIGlmIChtX2Nncm91cFYyTWVtb3J5TWVtc3dNYXhGaWxl
KQorICAgICAgICBmY2xvc2UobV9jZ3JvdXBWMk1lbW9yeU1lbXN3TWF4RmlsZSk7CisgICAgaWYg
KG1fY2dyb3VwVjJNZW1vcnlNYXhGaWxlKQorICAgICAgICBmY2xvc2UobV9jZ3JvdXBWMk1lbW9y
eU1heEZpbGUpOworICAgIGlmIChtX2Nncm91cFYyTWVtb3J5SGlnaEZpbGUpCisgICAgICAgIGZj
bG9zZShtX2Nncm91cFYyTWVtb3J5SGlnaEZpbGUpOworfQorCitzaXplX3QgQ0dyb3VwTWVtb3J5
Q29udHJvbGxlcjo6Z2V0Q2dyb3VwRmlsZVZhbHVlKEZJTEUgKmZpbGUpCit7CisgICAgY2hhciBi
dWZmZXJbMTI4XTsKKyAgICBjaGFyKiB0b2tlbjsKKyAgICBib29sIG9rID0gdHJ1ZTsKKworICAg
IGlmICghZmlsZSkKKyAgICAgICAgcmV0dXJuIG5vdFNldDsKKworICAgIGlmIChmc2VlayhmaWxl
LCAwLCBTRUVLX1NFVCkpCisgICAgICAgIHJldHVybiBub3RTZXQ7CisKKyAgICB0b2tlbiA9IGZn
ZXRzKGJ1ZmZlciwgMTI4LCBmaWxlKTsKKworICAgIHNpemVfdCB2YWx1ZSA9IHRvSW50ZWdyYWxU
eXBlPHNpemVfdD4odG9rZW4sIHN0cmxlbih0b2tlbiksICZvayk7CisgICAgaWYgKCFvaykKKyAg
ICAgICAgdmFsdWUgPSBub3RTZXQ7CisgICAgcmV0dXJuIHZhbHVlOworfQorCitzaXplX3QgQ0dy
b3VwTWVtb3J5Q29udHJvbGxlcjo6Z2V0TWVtb3J5VG90YWxXaXRoQ2dyb3VwKCkKK3sKKyAgICBz
aXplX3QgdmFsdWUgPSBub3RTZXQ7CisKKyAgICAvLyBDaGVjayBtZW1vcnkgbGltaXRzIGluIGNn
cm91cFYyCisgICAgdmFsdWUgPSBnZXRDZ3JvdXBGaWxlVmFsdWUobV9jZ3JvdXBWMk1lbW9yeU1l
bXN3TWF4RmlsZSk7CisgICAgaWYgKHZhbHVlICE9IG5vdFNldCkKKyAgICAgICAgcmV0dXJuIHZh
bHVlOworCisgICAgdmFsdWUgPSBnZXRDZ3JvdXBGaWxlVmFsdWUobV9jZ3JvdXBWMk1lbW9yeU1h
eEZpbGUpOworICAgIHNpemVfdCB2YWx1ZUhpZ2ggPSBnZXRDZ3JvdXBGaWxlVmFsdWUobV9jZ3Jv
dXBWMk1lbW9yeUhpZ2hGaWxlKTsKKyAgICBpZiAodmFsdWUgIT0gbm90U2V0ICYmIHZhbHVlSGln
aCAhPSBub3RTZXQpIHsKKyAgICAgICAgdmFsdWUgPSBzdGQ6Om1pbih2YWx1ZSwgdmFsdWVIaWdo
KTsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKyAgICBpZiAodmFsdWVIaWdoICE9IG5v
dFNldCkKKyAgICAgICAgcmV0dXJuIHZhbHVlSGlnaDsKKyAgICBpZiAodmFsdWUgIT0gbm90U2V0
KQorICAgICAgICByZXR1cm4gdmFsdWU7CisKKyAgICAvLyBDaGVjayBtZW1vcnkgbGltaXRzIGlu
IGNncm91cFYxCisgICAgdmFsdWUgPSBnZXRDZ3JvdXBGaWxlVmFsdWUobV9jZ3JvdXBNZW1vcnlN
ZW1zd0xpbWl0SW5CeXRlc0ZpbGUpOworICAgIGlmICh2YWx1ZSAhPSBub3RTZXQpCisgICAgICAg
IHJldHVybiB2YWx1ZTsKKworICAgIHZhbHVlID0gZ2V0Q2dyb3VwRmlsZVZhbHVlKG1fY2dyb3Vw
TWVtb3J5TGltaXRJbkJ5dGVzRmlsZSk7CisgICAgaWYgKHZhbHVlICE9IG5vdFNldCkKKyAgICAg
ICAgcmV0dXJuIHZhbHVlOworCisgICAgcmV0dXJuIHZhbHVlOworfQorCitzaXplX3QgQ0dyb3Vw
TWVtb3J5Q29udHJvbGxlcjo6Z2V0TWVtb3J5VXNhZ2VXaXRoQ2dyb3VwKCkKK3sKKyAgICBzaXpl
X3QgdmFsdWUgPSBub3RTZXQ7CisKKyAgICAvLyBDaGVjayBtZW1vcnkgbGltaXRzIGluIGNncm91
cFYyCisgICAgdmFsdWUgPSBnZXRDZ3JvdXBGaWxlVmFsdWUobV9jZ3JvdXBWMk1lbW9yeUN1cnJl
bnRGaWxlKTsKKyAgICBpZiAodmFsdWUgIT0gbm90U2V0KQorICAgICAgICByZXR1cm4gdmFsdWU7
CisKKyAgICAvLyBDaGVjayBtZW1vcnkgbGltaXRzIGluIGNncm91cFYxCisgICAgdmFsdWUgPSBn
ZXRDZ3JvdXBGaWxlVmFsdWUobV9jZ3JvdXBNZW1vcnlVc2FnZUluQnl0ZXNGaWxlKTsKKyAgICBp
ZiAodmFsdWUgIT0gbm90U2V0KQorICAgICAgICByZXR1cm4gdmFsdWU7CisKKyAgICByZXR1cm4g
bm90U2V0OworfQogCiB9IC8vIG5hbWVzcGFjZSBXZWJLaXQKIApkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYktpdC9VSVByb2Nlc3MvbGludXgvTWVtb3J5UHJlc3N1cmVNb25pdG9yLmggYi9Tb3VyY2Uv
V2ViS2l0L1VJUHJvY2Vzcy9saW51eC9NZW1vcnlQcmVzc3VyZU1vbml0b3IuaAppbmRleCA2NGMx
ZDdkNzg2MTNiOWNmNjkyNDllYTZjNGFmMGQ2NWY1YTczOTEzLi44ZjNkNjVjOWU2NmJmZWU0YWVk
MGJiNmNmNWY5NTRjYmQ4YjE0ODc0IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vz
cy9saW51eC9NZW1vcnlQcmVzc3VyZU1vbml0b3IuaAorKysgYi9Tb3VyY2UvV2ViS2l0L1VJUHJv
Y2Vzcy9saW51eC9NZW1vcnlQcmVzc3VyZU1vbml0b3IuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0g
KiBDb3B5cmlnaHQgKEMpIDIwMTYgSWdhbGlhIFMuTC4KKyAqIENvcHlyaWdodCAoQykgMjAxNiwg
MjAyMCBJZ2FsaWEgUy5MLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC01MCw2
ICs1MCwzNyBAQCBwcml2YXRlOgogICAgIGJvb2wgbV9zdGFydGVkIHsgZmFsc2UgfTsKIH07CiAK
K2NsYXNzIENHcm91cE1lbW9yeUNvbnRyb2xsZXIgeworcHVibGljOgorICAgIENHcm91cE1lbW9y
eUNvbnRyb2xsZXIoKSA9IGRlZmF1bHQ7CisgICAgYm9vbCBpc0FjdGl2ZSgpIHsgcmV0dXJuICFt
X2Nncm91cE1lbW9yeUNvbnRyb2xsZXJQYXRoLmlzTnVsbCgpOyB9OworCisgICAgdm9pZCBzZXRN
ZW1vcnlDb250cm9sbGVyUGF0aChDU3RyaW5nKTsKKworICAgIHNpemVfdCBnZXRNZW1vcnlUb3Rh
bFdpdGhDZ3JvdXAoKTsKKyAgICBzaXplX3QgZ2V0TWVtb3J5VXNhZ2VXaXRoQ2dyb3VwKCk7CisK
KyAgICB+Q0dyb3VwTWVtb3J5Q29udHJvbGxlcigpCisgICAgeworICAgICAgICBkaXNwb3NlTWVt
b3J5Q29udHJvbGxlcigpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBDU3RyaW5nIG1fY2dyb3Vw
TWVtb3J5Q29udHJvbGxlclBhdGg7CisKKyAgICBGSUxFKiBtX2Nncm91cE1lbW9yeU1lbXN3TGlt
aXRJbkJ5dGVzRmlsZTsKKyAgICBGSUxFKiBtX2Nncm91cE1lbW9yeUxpbWl0SW5CeXRlc0ZpbGU7
CisgICAgRklMRSogbV9jZ3JvdXBNZW1vcnlVc2FnZUluQnl0ZXNGaWxlOworCisgICAgRklMRSog
bV9jZ3JvdXBWMk1lbW9yeU1lbXN3TWF4RmlsZTsKKyAgICBGSUxFKiBtX2Nncm91cFYyTWVtb3J5
TWF4RmlsZTsKKyAgICBGSUxFKiBtX2Nncm91cFYyTWVtb3J5SGlnaEZpbGU7CisgICAgRklMRSog
bV9jZ3JvdXBWMk1lbW9yeUN1cnJlbnRGaWxlOworCisgICAgdm9pZCBkaXNwb3NlTWVtb3J5Q29u
dHJvbGxlcigpOworICAgIHNpemVfdCBnZXRDZ3JvdXBGaWxlVmFsdWUoRklMRSopOworfTsKKwog
fSAvLyBuYW1lc3BhY2UgV2ViS2l0CiAKICNlbmRpZiAvLyBPUyhMSU5VWCkK
</data>

          </attachment>
      

    </bug>

</bugzilla>