<?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>116378</bug_id>
          
          <creation_ts>2013-05-17 19:33:46 -0700</creation_ts>
          <short_desc>[GTK] [CMake] Add a &quot;make dist&quot; target</short_desc>
          <delta_ts>2014-01-30 14:31:26 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebKitGTK</component>
          <version>528+ (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></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>115966</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Martin Robinson">mrobinson</reporter>
          <assigned_to name="Martin Robinson">mrobinson</assigned_to>
          <cc>bunhere</cc>
    
    <cc>cgarcia</cc>
    
    <cc>commit-queue</cc>
    
    <cc>gustavo</cc>
    
    <cc>gyuyoung.kim</cc>
    
    <cc>rakuco</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>890784</commentid>
    <comment_count>0</comment_count>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2013-05-17 19:33:46 -0700</bug_when>
    <thetext>We just need to ensure that CPack includes all the necessary files.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>965672</commentid>
    <comment_count>1</comment_count>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2014-01-08 15:57:42 -0800</bug_when>
    <thetext>CPack doesn&apos;t look like a great option for WebKitGTK+:

1. It doesn&apos;t have support for LZMA.
2. It doesn&apos;t easily handle including files from the build directory into the tarball.
3. I don&apos;t see a way to rename files for the tarball.

Unfortunately, because of these issues, it probably makes sense to create our own &apos;make-dist&apos; script.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>965691</commentid>
    <comment_count>2</comment_count>
      <attachid>220678</attachid>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2014-01-08 17:10:08 -0800</bug_when>
    <thetext>Created attachment 220678
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>965824</commentid>
    <comment_count>3</comment_count>
      <attachid>220678</attachid>
    <who name="Peter Gal">galpeter</who>
    <bug_when>2014-01-09 02:52:30 -0800</bug_when>
    <thetext>Comment on attachment 220678
Patch

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

Just a few nits.

&gt; Tools/gtk/make-dist.py:42
&gt; +        if not(self.pattern.search(file)):

no need for the parentheses after the &apos;not&apos;. Simply: &apos;if not self.patt...&apos;

&gt; Tools/gtk/make-dist.py:129
&gt; +        if self.tarball_root[-1] != &apos;/&apos;:
&gt; +            self.tarball_root = self.tarball_root + &apos;/&apos;
&gt; +        if self.tarball_root[0] != &apos;/&apos;:
&gt; +            self.tarball_root = &apos;/&apos; + self.tarball_root

Why is this needed? We could use os.path.join(..) to correctly build paths so there is no need to add the &apos;/&apos;. Still if we really need to do this a (imho) a better way is to check the start/end &apos;/&apos; character with the .startswith/.endswith methods.

&gt; Tools/gtk/make-dist.py:154
&gt; +        elif string.find(&apos;$build&apos;) != -1:

A more pythonic way would be to use the &apos;in&apos; operator: elif &apos;$build&apos; not in string

&gt; Tools/gtk/make-dist.py:168
&gt; +        return self.tarball_root + path

The os.path.join could be used here to build the path.

&gt; Tools/gtk/make-dist.py:206
&gt; +            for file in self.get_files():
&gt; +                files_tarred = files_tarred + 1

Instead of counting the number of files by &apos;hand&apos; we could use the enumerate(..) function to count for us. (see http://docs.python.org/2/library/functions.html#enumerate) (this also applies to the code above in the line range 199-201)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>965880</commentid>
    <comment_count>4</comment_count>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2014-01-09 07:04:57 -0800</bug_when>
    <thetext>(In reply to comment #3)
&gt; (From update of attachment 220678 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=220678&amp;action=review
&gt; 
&gt; Just a few nits.

Thanks for the pointers. 

&gt; &gt; Tools/gtk/make-dist.py:129
&gt; &gt; +        if self.tarball_root[-1] != &apos;/&apos;:
&gt; &gt; +            self.tarball_root = self.tarball_root + &apos;/&apos;
&gt; &gt; +        if self.tarball_root[0] != &apos;/&apos;:
&gt; &gt; +            self.tarball_root = &apos;/&apos; + self.tarball_root
&gt; 
&gt; Why is this needed? We could use os.path.join(..) to correctly build paths so there is no need to add the &apos;/&apos;. Still if we really need to do this a (imho) a better way is to check the start/end &apos;/&apos; character with the .startswith/.endswith methods.

While right now our CMake build doesn&apos;t work outside Cygwin on Windows, I don&apos;t see any reason to make our tools platform specific if we can avoid it. os.path.join will use the platform directory separator.
 
 
&gt; &gt; Tools/gtk/make-dist.py:206
&gt; &gt; +            for file in self.get_files():
&gt; &gt; +                files_tarred = files_tarred + 1
&gt; 
&gt; Instead of counting the number of files by &apos;hand&apos; we could use the enumerate(..) function to count for us. (see http://docs.python.org/2/library/functions.html#enumerate) (this also applies to the code above in the line range 199-201)

It makes a lot of sense to user enumerate for this loop, though for the one before I don&apos;t think there&apos;s a lot of benefit. I could use sum(1 for i in files) but that would create a giant list, I believe.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>967359</commentid>
    <comment_count>5</comment_count>
      <attachid>221053</attachid>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2014-01-13 09:11:27 -0800</bug_when>
    <thetext>Created attachment 221053
Make the script more pythonic</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>971214</commentid>
    <comment_count>6</comment_count>
      <attachid>221053</attachid>
    <who name="Carlos Garcia Campos">cgarcia</who>
    <bug_when>2014-01-23 10:10:58 -0800</bug_when>
    <thetext>Comment on attachment 221053
Make the script more pythonic

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

&gt; Tools/gtk/make-dist.py:23
&gt; +import os.path

Why do you need this? aren&apos;t you using os.path.foo anyway?

&gt; Tools/gtk/make-dist.py:33
&gt; +class Rule(object):

I don&apos;t think you need to specify the parent when it&apos;s object, that&apos;s implicit.

&gt; Tools/gtk/make-dist.py:54
&gt; +        self.rules = []
&gt; +
&gt; +        # By default, accept all files.
&gt; +        self.add_rule(Rule(Rule.Result.INCLUDE, &apos;.*&apos;))

I guess this could be just:

self.rules = [ Rule(Rule.Result.INCLUDE, &apos;.*&apos;) ]

&gt; Tools/gtk/make-dist.py:58
&gt; +        if not(cls._global_rules):

do you need the parentheses?

&gt; Tools/gtk/make-dist.py:108
&gt; +            del dirs[:]
&gt; +            dirs.extend(to_keep)

I don&apos;t understand this.

&gt; Tools/gtk/make-dist.py:136
&gt; +        if self.current_directory:

if self.current_directory is not None:

&gt; Tools/gtk/make-dist.py:149
&gt; +            string = string.replace(&apos;$source&apos;, &apos;&apos;)
&gt; +            string = string.replace(&apos;$build&apos;, &apos;&apos;)
&gt; +            return string

return string.replace(&apos;$source&apos;, &apos;&apos;).replace(&apos;$build&apos;, &apos;&apos;)

&gt; Tools/gtk/make-dist.py:180
&gt; +        if not len(parts) or not len(parts[0]):

This could be just if not parts. You don&apos;t need to use len, an empty list evaluates as false. Same for the empty string

&gt; Tools/gtk/make-dist.py:182
&gt; +        elif parts[0][0] == &quot;#&quot;:

Do not use else after a return

&gt; Tools/gtk/make-dist.py:184
&gt; +        elif parts[0] == &quot;directory&quot; and len(parts) &gt; 1:

Ditto.

&gt; Tools/gtk/make-dist.py:196
&gt; +            for file in directory.get_files():
&gt; +                yield file

I would call this fileTuple or something like that, it confused me that this returns a file, but then you use file[0] and file[1] in create_tarfile

&gt; Tools/gtk/make-dist.py:201
&gt; +        count = 0
&gt; +        for file in self.get_files():
&gt; +            count = count + 1

Why not returning a list instead of a generator? so that you can do count = len(self.get_files()) and it will be generated only once instead of twice (once to count and then to enumerate it)

&gt; Tools/gtk/make-dist.py:205
&gt; +            for i, file in enumerate(self.get_files(), start=1):

You could do:

for i, (file, tarball_path) in enumerate(self.get_files(), start=1):

and use those names instead file[0] and file[1]

&gt; Tools/gtk/make-dist.py:230
&gt; +    manifest = Manifest(manifest_filename=arguments.manifest_filename,
&gt; +                        source_root=arguments.source_directory,
&gt; +                        build_root=arguments.build_directory,
&gt; +                        tarball_root=arguments.tarball_root)

You don&apos;t need to specify the name of the paramas, when you are passing all of them and in the right order, I think it would be easier to read.

manifest = Manifest(arguments.manifest_filename, arguments.source_directory, arguments.build_directory, arguments.tarball_root);</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>972735</commentid>
    <comment_count>7</comment_count>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2014-01-27 18:44:07 -0800</bug_when>
    <thetext>(In reply to comment #6)
&gt; (From update of attachment 221053 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=221053&amp;action=review
&gt; 
&gt; &gt; Tools/gtk/make-dist.py:23
&gt; &gt; +import os.path
&gt; 
&gt; Why do you need this? aren&apos;t you using os.path.foo anyway?

I guess not! Removed.

&gt; 
&gt; &gt; Tools/gtk/make-dist.py:33
&gt; &gt; +class Rule(object):
&gt; 
&gt; I don&apos;t think you need to specify the parent when it&apos;s object, that&apos;s implicit.

Specifying object as the parent means this is a new-style class, versus old-style: http://stackoverflow.com/questions/13816849/old-style-and-new-style-classes-in-python-2-7
&gt; 
&gt; &gt; Tools/gtk/make-dist.py:54
&gt; &gt; +        self.rules = []
&gt; &gt; +
&gt; &gt; +        # By default, accept all files.
&gt; &gt; +        self.add_rule(Rule(Rule.Result.INCLUDE, &apos;.*&apos;))
&gt; 
&gt; I guess this could be just:
&gt; 
&gt; self.rules = [ Rule(Rule.Result.INCLUDE, &apos;.*&apos;) ]

It could be. My thought was that this would make the code safe if add_rule ever did anything extra, but it&apos;s not a big deal.

&gt; 
&gt; &gt; Tools/gtk/make-dist.py:58
&gt; &gt; +        if not(cls._global_rules):
&gt; 
&gt; do you need the parentheses?

Nope!

&gt; &gt; Tools/gtk/make-dist.py:108
&gt; &gt; +            del dirs[:]
&gt; &gt; +            dirs.extend(to_keep)
&gt; 
&gt; I don&apos;t understand this.

I&apos;m trying to modify dirs in place, because it seems that&apos;s what walk requires.

&gt; 
&gt; &gt; Tools/gtk/make-dist.py:136
&gt; &gt; +        if self.current_directory:
&gt; 
&gt; if self.current_directory is not None:

Okay.

&gt; &gt; Tools/gtk/make-dist.py:149
&gt; &gt; +            string = string.replace(&apos;$source&apos;, &apos;&apos;)
&gt; &gt; +            string = string.replace(&apos;$build&apos;, &apos;&apos;)
&gt; &gt; +            return string
&gt; 
&gt; return string.replace(&apos;$source&apos;, &apos;&apos;).replace(&apos;$build&apos;, &apos;&apos;)

Okay.

&gt; 
&gt; &gt; Tools/gtk/make-dist.py:180
&gt; &gt; +        if not len(parts) or not len(parts[0]):
&gt; 
&gt; This could be just if not parts. You don&apos;t need to use len, an empty list evaluates as false. Same for the empty string

Okay.

&gt; 
&gt; &gt; Tools/gtk/make-dist.py:182
&gt; &gt; +        elif parts[0][0] == &quot;#&quot;:
&gt; 
&gt; Do not use else after a return

Okay.
&gt; 
&gt; &gt; Tools/gtk/make-dist.py:184
&gt; &gt; +        elif parts[0] == &quot;directory&quot; and len(parts) &gt; 1:
&gt; 
&gt; Ditto.
&gt; 
&gt; &gt; Tools/gtk/make-dist.py:196
&gt; &gt; +            for file in directory.get_files():
&gt; &gt; +                yield file
&gt; 
&gt; I would call this fileTuple or something like that, it confused me that this returns a file, but then you use file[0] and file[1] in create_tarfile

Sure.

&gt; &gt; Tools/gtk/make-dist.py:201
&gt; &gt; +        count = 0
&gt; &gt; +        for file in self.get_files():
&gt; &gt; +            count = count + 1
&gt; 
&gt; Why not returning a list instead of a generator? so that you can do count = len(self.get_files()) and it will be generated only once instead of twice (once to count and then to enumerate it)

I didn&apos;t want to keep the entire list in memory. The process of iterating the files isn&apos;t noticeable, so I hope this is okay.

&gt; &gt; Tools/gtk/make-dist.py:205
&gt; &gt; +            for i, file in enumerate(self.get_files(), start=1):
&gt; 
&gt; You could do:
&gt; 
&gt; for i, (file, tarball_path) in enumerate(self.get_files(), start=1):
&gt; 
&gt; and use those names instead file[0] and file[1]

This is a lot nicer!

&gt; 
&gt; &gt; Tools/gtk/make-dist.py:230
&gt; &gt; +    manifest = Manifest(manifest_filename=arguments.manifest_filename,
&gt; &gt; +                        source_root=arguments.source_directory,
&gt; &gt; +                        build_root=arguments.build_directory,
&gt; &gt; +                        tarball_root=arguments.tarball_root)
&gt; 
&gt; You don&apos;t need to specify the name of the paramas, when you are passing all of them and in the right order, I think it would be easier to read.
&gt; 
&gt; manifest = Manifest(arguments.manifest_filename, arguments.source_directory, arguments.build_directory, arguments.tarball_root);

Sure. I personally prefer the more explicit style, but I don&apos;t really care in the end.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>972736</commentid>
    <comment_count>8</comment_count>
      <attachid>222393</attachid>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2014-01-27 18:45:57 -0800</bug_when>
    <thetext>Created attachment 222393
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>973756</commentid>
    <comment_count>9</comment_count>
      <attachid>222393</attachid>
    <who name="Gustavo Noronha (kov)">gustavo</who>
    <bug_when>2014-01-30 09:29:19 -0800</bug_when>
    <thetext>Comment on attachment 222393
Patch

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

Great stuff!

&gt; Tools/gtk/make-dist.py:82
&gt; +        yield (self.source_root, self.tarball_root)

Why use yield here? Doesn&apos;t look like we&apos;re returning something different ever.

&gt; Tools/gtk/make-dist.py:126
&gt; +        if self.tarball_root[-1] != &apos;/&apos;:
&gt; +            self.tarball_root = self.tarball_root + &apos;/&apos;
&gt; +        if self.tarball_root[0] != &apos;/&apos;:
&gt; +            self.tarball_root = &apos;/&apos; + self.tarball_root

It was suggested before that we should use .startswith/.endswith, I think that would be more readable indeed.

&gt; Tools/gtk/make-dist.py:177
&gt; +        if parts[0][0] == &quot;#&quot;:

parts[0].startswith()?

&gt; Tools/gtk/manifest.txt:74
&gt; +directory $build/Documentation/webkit2gtk/html Documentation/webkit2gtk/html
&gt; +directory $build/Documentation/webkit2gtk/html Documentation/webkit2gtk/html
&gt; +directory $build/Documentation/webkitgtk/tmpl Documentation/webkitgtk/tmpl
&gt; +directory $build/Documentation/webkitgtk/tmpl Documentation/webkitgtk/tmpl

Shipping generated files has been frowned upon by some people before - mainly because you can&apos;t make dist if you haven&apos;t made a full build with the appropriate configuration options before that. I don&apos;t think it&apos;s a problem, and I really like having pre-build documentation in the tarball, but just thought I&apos;d share this here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>974007</commentid>
    <comment_count>10</comment_count>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2014-01-30 14:29:35 -0800</bug_when>
    <thetext>Committed r163114: &lt;http://trac.webkit.org/changeset/163114&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>974008</commentid>
    <comment_count>11</comment_count>
      <attachid>222393</attachid>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2014-01-30 14:31:08 -0800</bug_when>
    <thetext>Comment on attachment 222393
Patch

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

Thanks for the review!

&gt;&gt; Tools/gtk/make-dist.py:82
&gt;&gt; +        yield (self.source_root, self.tarball_root)
&gt; 
&gt; Why use yield here? Doesn&apos;t look like we&apos;re returning something different ever.

This is a generator so that it has the same interface as Directory and can just live in the list of directories as a member of manifest.

&gt;&gt; Tools/gtk/make-dist.py:126
&gt;&gt; +            self.tarball_root = &apos;/&apos; + self.tarball_root
&gt; 
&gt; It was suggested before that we should use .startswith/.endswith, I think that would be more readable indeed.

Fixed!

&gt;&gt; Tools/gtk/make-dist.py:177
&gt;&gt; +        if parts[0][0] == &quot;#&quot;:
&gt; 
&gt; parts[0].startswith()?

Fixed!

&gt;&gt; Tools/gtk/manifest.txt:74
&gt;&gt; +directory $build/Documentation/webkitgtk/tmpl Documentation/webkitgtk/tmpl
&gt; 
&gt; Shipping generated files has been frowned upon by some people before - mainly because you can&apos;t make dist if you haven&apos;t made a full build with the appropriate configuration options before that. I don&apos;t think it&apos;s a problem, and I really like having pre-build documentation in the tarball, but just thought I&apos;d share this here.

Yeah, I&apos;m similarly conflicted.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>220678</attachid>
            <date>2014-01-08 17:10:08 -0800</date>
            <delta_ts>2014-01-13 09:11:23 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-116378-20140108171007.patch</filename>
            <type>text/plain</type>
            <size>16421</size>
            <attacher name="Martin Robinson">mrobinson</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTYxNDU4CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZjliNWY4MWQ4ZmEyODA2
OTJlYjNlNmFhNTdhMjA5MzM0ODFlZjkxNy4uNWNkMjU0YjIwMDZhZGZkNzgwZjc5ZTUwOWEyNjk5
YjJlMDcxNzg1NyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDEzIEBACisyMDE0LTAxLTA4ICBNYXJ0
aW4gUm9iaW5zb24gIDxtcm9iaW5zb25AaWdhbGlhLmNvbT4KKworICAgICAgICBbR1RLXSBbQ01h
a2VdIEFkZCBhICJtYWtlIGRpc3QiIHRhcmdldAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0
Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTE2Mzc4CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZ
IChPT1BTISkuCisKKyAgICAgICAgKiBDTWFrZUxpc3RzLnR4dDogRG9uJ3QgYnVpbGQgV2ViS2l0
VmVyc2lvbi5oIGZvciBXZWJLaXRHVEsrLiBXZSBkb24ndCB1c2UgaXQKKyAgICAgICAgYW5kIHdl
IGRvbid0IHdhbnQgdG8gZGlzdHJpYnV0ZSB0aGUgZGVwZW5kZW5jeS4KKwogMjAxNC0wMS0wNyAg
SmVyIE5vYmxlICA8amVyLm5vYmxlQGFwcGxlLmNvbT4KIAogICAgICAgICBQbGF0Zm9ybUxheWVy
IGNvbnRhaW5pbmcgc2Nyb2xsYmFycyBkb2VzIG5vdCBkaXNhcHBlYXIgd2hlbiBzZXR0aW5nIG92
ZXJmbG93OmhpZGRlbiBvbiBwYWdlIHJvb3QsIHVudGlsIHJlc2l6ZS4KZGlmZiAtLWdpdCBhL1Nv
dXJjZS9QbGF0Zm9ybUdUSy5jbWFrZSBiL1NvdXJjZS9QbGF0Zm9ybUdUSy5jbWFrZQppbmRleCBi
ODE5MjQ2NTNhZTY4ZmYxYzZhZTg4MDVkY2M0MmMwMDRmNjBlMGIyLi45MWVlYjM4NTIzM2E3YjJj
ZTJhZGY4YzBmNzA5YWUyMzljYjg1ZjVhIDEwMDY0NAotLS0gYS9Tb3VyY2UvUGxhdGZvcm1HVEsu
Y21ha2UKKysrIGIvU291cmNlL1BsYXRmb3JtR1RLLmNtYWtlCkBAIC00OCwzICs0OCwzMCBAQCBl
bmRpZiAoKQogaWYgKEVOQUJMRV9XRUJLSVQyKQogICAgIGFkZF9kZXBlbmRlbmNpZXMoZmFrZS1k
b2NzLXRhcmdldCBXZWJLaXQyKQogZW5kaWYgKCkKKworaWYgKEVOQUJMRV9XRUJLSVQgQU5EIEVO
QUJMRV9XRUJLSVQyKQorICAgIGFkZF9jdXN0b21fY29tbWFuZCgKKyAgICAgICAgT1VUUFVUICR7
Q01BS0VfQklOQVJZX0RJUn0vd2Via2l0Z3RrLSR7UFJPSkVDVF9WRVJTSU9OfS50YXIKKyAgICAg
ICAgREVQRU5EUyAke1RPT0xTX0RJUn0vZ3RrL21ha2UtZGlzdC5weQorICAgICAgICBERVBFTkRT
ICR7VE9PTFNfRElSfS9ndGsvbWFuaWZlc3QudHh0CisgICAgICAgIERFUEVORFMgV2ViS2l0Cisg
ICAgICAgIERFUEVORFMgV2ViS2l0MgorICAgICAgICBDT01NQU5EICR7VE9PTFNfRElSfS9ndGsv
bWFrZS1kaXN0LnB5CisgICAgICAgICAgICAgICAgLS1zb3VyY2UtZGlyPSR7Q01BS0VfU09VUkNF
X0RJUn0KKyAgICAgICAgICAgICAgICAtLWJ1aWxkLWRpcj0ke0NNQUtFX0JJTkFSWV9ESVJ9Cisg
ICAgICAgICAgICAgICAgLS10YXJiYWxsLXJvb3Q9L3dlYmtpdGd0ay0ke1BST0pFQ1RfVkVSU0lP
Tn0KKyAgICAgICAgICAgICAgICAtbyAke0NNQUtFX0JJTkFSWV9ESVJ9L3dlYmtpdGd0ay0ke1BS
T0pFQ1RfVkVSU0lPTn0udGFyCisgICAgICAgICAgICAgICAgJHtUT09MU19ESVJ9L2d0ay9tYW5p
ZmVzdC50eHQKKyAgICApCisKKyAgICBhZGRfY3VzdG9tX2NvbW1hbmQoCisgICAgICAgIE9VVFBV
VCAke0NNQUtFX0JJTkFSWV9ESVJ9L3dlYmtpdGd0ay0ke1BST0pFQ1RfVkVSU0lPTn0udGFyLnh6
CisgICAgICAgIERFUEVORFMgJHtDTUFLRV9CSU5BUllfRElSfS93ZWJraXRndGstJHtQUk9KRUNU
X1ZFUlNJT059LnRhcgorICAgICAgICBDT01NQU5EIHh6IC1mICR7Q01BS0VfQklOQVJZX0RJUn0v
d2Via2l0Z3RrLSR7UFJPSkVDVF9WRVJTSU9OfS50YXIKKyAgICApCisKKyAgICBhZGRfY3VzdG9t
X3RhcmdldChkaXN0CisgICAgICAgIERFUEVORFMgJHtDTUFLRV9CSU5BUllfRElSfS93ZWJraXRn
dGstJHtQUk9KRUNUX1ZFUlNJT059LnRhci54egorICAgICkKK2VuZGlmICgpCisKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL0NNYWtlTGlzdHMudHh0IGIvU291cmNlL1dlYkNvcmUvQ01ha2VM
aXN0cy50eHQKaW5kZXggNDFlYmNiNGYzM2JiZWI5NDY5NjFiMzViN2I3Mjk4OTZiNTQ4ODcyMi4u
YWE5NzNiZjM3ZTUxMjFjNWUyODM2YWQ4NDdkYTJjMDRlZGRiNzQ4YiAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYkNvcmUvQ01ha2VMaXN0cy50eHQKKysrIGIvU291cmNlL1dlYkNvcmUvQ01ha2VMaXN0
cy50eHQKQEAgLTMyNzYsMTMgKzMyNzYsMTUgQEAgbGlzdChBUFBFTkQgV2ViQ29yZV9TT1VSQ0VT
ICR7REVSSVZFRF9TT1VSQ0VTX1dFQkNPUkVfRElSfS9YTUxOU05hbWVzLmNwcCkKIEdFTkVSQVRF
X0RPTV9OQU1FUyhYTUwgJHtXRUJDT1JFX0RJUn0veG1sL3htbGF0dHJzLmluKQogbGlzdChBUFBF
TkQgV2ViQ29yZV9TT1VSQ0VTICR7REVSSVZFRF9TT1VSQ0VTX1dFQkNPUkVfRElSfS9YTUxOYW1l
cy5jcHApCiAKLWFkZF9jdXN0b21fY29tbWFuZCgKLSAgICBPVVRQVVQgJHtERVJJVkVEX1NPVVJD
RVNfV0VCQ09SRV9ESVJ9L1dlYktpdFZlcnNpb24uaAotICAgIE1BSU5fREVQRU5ERU5DWSAke1dF
QktJVF9ESVJ9L3NjcmlwdHMvZ2VuZXJhdGUtd2Via2l0dmVyc2lvbi5wbAotICAgIERFUEVORFMg
JHtXRUJLSVRfRElSfS9tYWMvQ29uZmlndXJhdGlvbnMvVmVyc2lvbi54Y2NvbmZpZwotICAgIENP
TU1BTkQgJHtQRVJMX0VYRUNVVEFCTEV9ICR7V0VCS0lUX0RJUn0vc2NyaXB0cy9nZW5lcmF0ZS13
ZWJraXR2ZXJzaW9uLnBsIC0tY29uZmlnICR7V0VCS0lUX0RJUn0vbWFjL0NvbmZpZ3VyYXRpb25z
L1ZlcnNpb24ueGNjb25maWcgLS1vdXRwdXREaXIgJHtERVJJVkVEX1NPVVJDRVNfV0VCQ09SRV9E
SVJ9Ci0gICAgVkVSQkFUSU0pCi1saXN0KEFQUEVORCBXZWJDb3JlX1NPVVJDRVMgJHtERVJJVkVE
X1NPVVJDRVNfV0VCQ09SRV9ESVJ9L1dlYktpdFZlcnNpb24uaCkKK2lmIChOT1QgUE9SVCBTVFJF
UVVBTCAiR1RLIikKKyAgICBhZGRfY3VzdG9tX2NvbW1hbmQoCisgICAgICAgIE9VVFBVVCAke0RF
UklWRURfU09VUkNFU19XRUJDT1JFX0RJUn0vV2ViS2l0VmVyc2lvbi5oCisgICAgICAgIE1BSU5f
REVQRU5ERU5DWSAke1dFQktJVF9ESVJ9L3NjcmlwdHMvZ2VuZXJhdGUtd2Via2l0dmVyc2lvbi5w
bAorICAgICAgICBERVBFTkRTICR7V0VCS0lUX0RJUn0vbWFjL0NvbmZpZ3VyYXRpb25zL1ZlcnNp
b24ueGNjb25maWcKKyAgICAgICAgQ09NTUFORCAke1BFUkxfRVhFQ1VUQUJMRX0gJHtXRUJLSVRf
RElSfS9zY3JpcHRzL2dlbmVyYXRlLXdlYmtpdHZlcnNpb24ucGwgLS1jb25maWcgJHtXRUJLSVRf
RElSfS9tYWMvQ29uZmlndXJhdGlvbnMvVmVyc2lvbi54Y2NvbmZpZyAtLW91dHB1dERpciAke0RF
UklWRURfU09VUkNFU19XRUJDT1JFX0RJUn0KKyAgICAgICAgVkVSQkFUSU0pCisgICAgbGlzdChB
UFBFTkQgV2ViQ29yZV9TT1VSQ0VTICR7REVSSVZFRF9TT1VSQ0VTX1dFQkNPUkVfRElSfS9XZWJL
aXRWZXJzaW9uLmgpCitlbmRpZiAoKQogCiBXRUJLSVRfV1JBUF9TT1VSQ0VMSVNUKCR7V2ViQ29y
ZV9JRExfRklMRVN9ICR7V2ViQ29yZV9TT1VSQ0VTfSkKIFdFQktJVF9XUkFQX1NPVVJDRUxJU1Qo
JHtXZWJDb3JlVGVzdFN1cHBvcnRfSURMX0ZJTEVTfSAke1dlYkNvcmVUZXN0U3VwcG9ydF9TT1VS
Q0VTfSkKZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBiL1Rvb2xzL0NoYW5nZUxvZwppbmRl
eCA1YjViNDZiZDRlMmI5ODU0ZTY5ZDcyOTU2Y2M3ZjQwOWE4ZDAyMzc0Li4zMzc0MjYyMTA3MTc5
YzU1YTVjZDExMGJmYjUwNGYyNDBiZDUyZGE2IDEwMDY0NAotLS0gYS9Ub29scy9DaGFuZ2VMb2cK
KysrIGIvVG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTYgQEAKKzIwMTQtMDEtMDggIE1hcnRp
biBSb2JpbnNvbiAgPG1yb2JpbnNvbkBpZ2FsaWEuY29tPgorCisgICAgICAgIFtHVEtdIFtDTWFr
ZV0gQWRkIGEgIm1ha2UgZGlzdCIgdGFyZ2V0CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQu
b3JnL3Nob3dfYnVnLmNnaT9pZD0xMTYzNzgKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBBZGRlZCBhIHNjcmlwdCB0aGF0IHJlYWRzIGEgbWFuaWZlc3Qg
ZmlsZSBhbiBwcm9kdWNlcyBhIHRhcmJhbGwuIEFsc28gYWRkCisgICAgICAgIHRoZSBtYW5pZmVz
dC4KKworICAgICAgICAqIGd0ay9tYWtlLWRpc3QucHk6IEFkZGVkLgorICAgICAgICAqIGd0ay9t
YW5pZmVzdC50eHQ6IEFkZGVkLgorCiAyMDE0LTAxLTA3ICBBbGV4ZXkgUHJvc2t1cnlha292ICA8
YXBAYXBwbGUuY29tPgogCiAgICAgICAgIFBvcG92ZXJzIGF0IGJ1aWxkLndlYmtpdC5vcmcvZGFz
aGJvYXJkIGNvdWxkIGhhdmUgdGl0bGVzCmRpZmYgLS1naXQgYS9Ub29scy9ndGsvbWFrZS1kaXN0
LnB5IGIvVG9vbHMvZ3RrL21ha2UtZGlzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4yNzQ5MmE5YmQ2NTRhZGJi
ZDJjZjU4OTJmZGEzYTVjYzkwMDE4ZjA1Ci0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvZ3RrL21h
a2UtZGlzdC5weQpAQCAtMCwwICsxLDIzMiBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIENv
cHlyaWdodCAoQykgMjAxNCBJZ2FsaWEgUy5MLgorIworIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBz
b2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRl
ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZSBh
cyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisjIHZl
cnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVy
c2lvbi4KKyMKKyMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQg
aXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBl
dmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjIExlc3NlciBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSBy
ZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5z
ZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0
d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29y
LCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBw
cmludF9mdW5jdGlvbgorZnJvbSBjb250ZXh0bGliIGltcG9ydCBjbG9zaW5nCisKK2ltcG9ydCBh
cmdwYXJzZQoraW1wb3J0IG9zCitpbXBvcnQgb3MucGF0aAoraW1wb3J0IHJlCitpbXBvcnQgc3lz
CitpbXBvcnQgdGFyZmlsZQorCisKK2RlZiBlbnVtKCoqZW51bXMpOgorICAgIHJldHVybiB0eXBl
KCdFbnVtJywgKCksIGVudW1zKQorCisKK2NsYXNzIFJ1bGUob2JqZWN0KToKKyAgICBSZXN1bHQg
PSBlbnVtKElOQ0xVREU9MSwgRVhDTFVERT0yLCBOT19NQVRDSD0zKQorCisgICAgZGVmIF9faW5p
dF9fKHNlbGYsIHR5cGUsIHBhdHRlcm4pOgorICAgICAgICBzZWxmLnR5cGUgPSB0eXBlCisgICAg
ICAgIHNlbGYub3JpZ2luYWxfcGF0dGVybiA9IHBhdHRlcm4KKyAgICAgICAgc2VsZi5wYXR0ZXJu
ID0gcmUuY29tcGlsZShwYXR0ZXJuKQorCisgICAgZGVmIHRlc3Qoc2VsZiwgZmlsZSk6CisgICAg
ICAgIGlmIG5vdChzZWxmLnBhdHRlcm4uc2VhcmNoKGZpbGUpKToKKyAgICAgICAgICAgIHJldHVy
biBSdWxlLlJlc3VsdC5OT19NQVRDSAorICAgICAgICByZXR1cm4gc2VsZi50eXBlCisKKworY2xh
c3MgUnVsZXNldChvYmplY3QpOgorICAgIF9nbG9iYWxfcnVsZXMgPSBOb25lCisKKyAgICBkZWYg
X19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYucnVsZXMgPSBbXQorCisgICAgICAgICMgQnkg
ZGVmYXVsdCwgYWNjZXB0IGFsbCBmaWxlcy4KKyAgICAgICAgc2VsZi5hZGRfcnVsZShSdWxlKFJ1
bGUuUmVzdWx0LklOQ0xVREUsICcuKicpKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGds
b2JhbF9ydWxlcyhjbHMpOgorICAgICAgICBpZiBub3QoY2xzLl9nbG9iYWxfcnVsZXMpOgorICAg
ICAgICAgICAgY2xzLl9nbG9iYWxfcnVsZXMgPSBSdWxlc2V0KCkKKyAgICAgICAgcmV0dXJuIGNs
cy5fZ2xvYmFsX3J1bGVzCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgYWRkX2dsb2JhbF9y
dWxlKGNscywgcnVsZSk6CisgICAgICAgIGNscy5nbG9iYWxfcnVsZXMoKS5hZGRfcnVsZShydWxl
KQorCisgICAgZGVmIGFkZF9ydWxlKHNlbGYsIHJ1bGUpOgorICAgICAgICBzZWxmLnJ1bGVzLmFw
cGVuZChydWxlKQorCisgICAgZGVmIHBhc3NlcyhzZWxmLCBmaWxlKToKKyAgICAgICAgYWxsb3dl
ZCA9IEZhbHNlCisgICAgICAgIGZvciBydWxlIGluIHNlbGYucnVsZXM6CisgICAgICAgICAgICBy
ZXN1bHQgPSBydWxlLnRlc3QoZmlsZSkKKyAgICAgICAgICAgIGlmIHJlc3VsdCA9PSBSdWxlLlJl
c3VsdC5OT19NQVRDSDoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgYWxs
b3dlZCA9IFJ1bGUuUmVzdWx0LklOQ0xVREUgPT0gcmVzdWx0CisgICAgICAgIHJldHVybiBhbGxv
d2VkCisKKworY2xhc3MgRmlsZShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzb3Vy
Y2Vfcm9vdCwgdGFyYmFsbF9yb290KToKKyAgICAgICAgc2VsZi5zb3VyY2Vfcm9vdCA9IHNvdXJj
ZV9yb290CisgICAgICAgIHNlbGYudGFyYmFsbF9yb290ID0gdGFyYmFsbF9yb290CisKKyAgICBk
ZWYgZ2V0X2ZpbGVzKHNlbGYpOgorICAgICAgICB5aWVsZCAoc2VsZi5zb3VyY2Vfcm9vdCwgc2Vs
Zi50YXJiYWxsX3Jvb3QpCisKKworY2xhc3MgRGlyZWN0b3J5KG9iamVjdCk6CisgICAgZGVmIF9f
aW5pdF9fKHNlbGYsIHNvdXJjZV9yb290LCB0YXJiYWxsX3Jvb3QpOgorICAgICAgICBzZWxmLnNv
dXJjZV9yb290ID0gc291cmNlX3Jvb3QKKyAgICAgICAgc2VsZi50YXJiYWxsX3Jvb3QgPSB0YXJi
YWxsX3Jvb3QKKyAgICAgICAgc2VsZi5ydWxlcyA9IFJ1bGVzZXQoKQorCisgICAgZGVmIGFkZF9y
dWxlKHNlbGYsIHJ1bGUpOgorICAgICAgICBzZWxmLnJ1bGVzLmFkZF9ydWxlKHJ1bGUpCisKKyAg
ICBkZWYgZ2V0X3RhcmJhbGxfcGF0aChzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIHJldHVybiBm
aWxlbmFtZS5yZXBsYWNlKHNlbGYuc291cmNlX3Jvb3QsIHNlbGYudGFyYmFsbF9yb290LCAxKQor
CisgICAgZGVmIGdldF9maWxlcyhzZWxmKToKKyAgICAgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVz
IGluIG9zLndhbGsoc2VsZi5zb3VyY2Vfcm9vdCk6CisKKyAgICAgICAgICAgIGRlZiBwYXNzZXNf
YWxsX3J1bGVzKGVudHJ5KToKKyAgICAgICAgICAgICAgICByZXR1cm4gUnVsZXNldC5nbG9iYWxf
cnVsZXMoKS5wYXNzZXMoZW50cnkpIGFuZCBzZWxmLnJ1bGVzLnBhc3NlcyhlbnRyeSkKKworICAg
ICAgICAgICAgdG9fa2VlcCA9IGZpbHRlcihwYXNzZXNfYWxsX3J1bGVzLCBkaXJzKQorICAgICAg
ICAgICAgZGVsIGRpcnNbOl0KKyAgICAgICAgICAgIGRpcnMuZXh0ZW5kKHRvX2tlZXApCisKKyAg
ICAgICAgICAgIGZvciBmaWxlIGluIGZpbGVzOgorICAgICAgICAgICAgICAgIGZpbGUgPSBvcy5w
YXRoLmpvaW4ocm9vdCwgZmlsZSkKKyAgICAgICAgICAgICAgICBpZiBub3QgcGFzc2VzX2FsbF9y
dWxlcyhmaWxlKToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAg
ICB5aWVsZCAoZmlsZSwgc2VsZi5nZXRfdGFyYmFsbF9wYXRoKGZpbGUpKQorCisKK2NsYXNzIE1h
bmlmZXN0KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hbmlmZXN0X2ZpbGVuYW1l
LCBzb3VyY2Vfcm9vdCwgYnVpbGRfcm9vdCwgdGFyYmFsbF9yb290PScvJyk6CisgICAgICAgIHNl
bGYuY3VycmVudF9kaXJlY3RvcnkgPSBOb25lCisgICAgICAgIHNlbGYuZGlyZWN0b3JpZXMgPSBb
XQorICAgICAgICBzZWxmLnRhcmJhbGxfcm9vdCA9IHRhcmJhbGxfcm9vdAorICAgICAgICBzZWxm
LnNvdXJjZV9yb290ID0gb3MucGF0aC5hYnNwYXRoKHNvdXJjZV9yb290KQorICAgICAgICBzZWxm
LmJ1aWxkX3Jvb3QgPSBvcy5wYXRoLmFic3BhdGgoYnVpbGRfcm9vdCkKKworICAgICAgICAjIE5v
cm1hbGl6ZSB0aGUgdGFyYmFsbCByb290IHNvIHRoYXQgaXQgc3RhcnRzIGFuZCBlbmRzIHdpdGgg
YSBzbGFzaC4KKyAgICAgICAgaWYgc2VsZi50YXJiYWxsX3Jvb3RbLTFdICE9ICcvJzoKKyAgICAg
ICAgICAgIHNlbGYudGFyYmFsbF9yb290ID0gc2VsZi50YXJiYWxsX3Jvb3QgKyAnLycKKyAgICAg
ICAgaWYgc2VsZi50YXJiYWxsX3Jvb3RbMF0gIT0gJy8nOgorICAgICAgICAgICAgc2VsZi50YXJi
YWxsX3Jvb3QgPSAnLycgKyBzZWxmLnRhcmJhbGxfcm9vdAorCisgICAgICAgIHdpdGggb3Blbiht
YW5pZmVzdF9maWxlbmFtZSwgJ3InKSBhcyBmaWxlOgorICAgICAgICAgICAgZm9yIGxpbmUgaW4g
ZmlsZS5yZWFkbGluZXMoKToKKyAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3NfbGluZShsaW5l
KQorCisgICAgZGVmIGFkZF9ydWxlKHNlbGYsIHJ1bGUpOgorICAgICAgICBpZiBzZWxmLmN1cnJl
bnRfZGlyZWN0b3J5OgorICAgICAgICAgICAgc2VsZi5jdXJyZW50X2RpcmVjdG9yeS5hZGRfcnVs
ZShydWxlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgUnVsZXNldC5hZGRfZ2xvYmFsX3J1
bGUocnVsZSkKKworICAgIGRlZiBhZGRfZGlyZWN0b3J5KHNlbGYsIGRpcmVjdG9yeSk6CisgICAg
ICAgIHNlbGYuY3VycmVudF9kaXJlY3RvcnkgPSBkaXJlY3RvcnkKKyAgICAgICAgc2VsZi5kaXJl
Y3Rvcmllcy5hcHBlbmQoZGlyZWN0b3J5KQorCisgICAgZGVmIHJlc29sdmVfdmFyaWFibGVzKHNl
bGYsIHN0cmluZywgc3RyaXA9RmFsc2UpOgorICAgICAgICBpZiBzdHJpcDoKKyAgICAgICAgICAg
IHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKCckc291cmNlJywgJycpCisgICAgICAgICAgICBzdHJp
bmcgPSBzdHJpbmcucmVwbGFjZSgnJGJ1aWxkJywgJycpCisgICAgICAgICAgICByZXR1cm4gc3Ry
aW5nCisKKyAgICAgICAgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UoJyRzb3VyY2UnLCBzZWxmLnNv
dXJjZV9yb290KQorICAgICAgICBpZiBzZWxmLmJ1aWxkX3Jvb3Q6CisgICAgICAgICAgICBzdHJp
bmcgPSBzdHJpbmcucmVwbGFjZSgnJGJ1aWxkJywgc2VsZi5idWlsZF9yb290KQorICAgICAgICBl
bGlmIHN0cmluZy5maW5kKCckYnVpbGQnKSAhPSAtMToKKyAgICAgICAgICAgIHJhaXNlIEV4Y2Vw
dGlvbignTWFuaWZlc3QgaGFzICRidWlsZCBidXQgYnVpbGQgcm9vdCBub3QgZ2l2ZW4uJykKKyAg
ICAgICAgcmV0dXJuIHN0cmluZworCisgICAgZGVmIGdldF9mdWxsX3NvdXJjZV9wYXRoKHNlbGYs
IHNvdXJjZV9wYXRoKToKKyAgICAgICAgZnVsbF9zb3VyY2VfcGF0aCA9IHNlbGYucmVzb2x2ZV92
YXJpYWJsZXMoc291cmNlX3BhdGgpCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhmdWxs
X3NvdXJjZV9wYXRoKToKKyAgICAgICAgICAgIGZ1bGxfc291cmNlX3BhdGggPSBvcy5wYXRoLmpv
aW4oc2VsZi5zb3VyY2Vfcm9vdCwgc291cmNlX3BhdGgpCisgICAgICAgIGlmIG5vdCBvcy5wYXRo
LmV4aXN0cyhmdWxsX3NvdXJjZV9wYXRoKToKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbign
Q291bGQgbm90IGZpbmQgZGlyZWN0b3J5ICVzJyAlIGZ1bGxfc291cmNlX3BhdGgpCisgICAgICAg
IHJldHVybiBmdWxsX3NvdXJjZV9wYXRoCisKKyAgICBkZWYgZ2V0X2Z1bGxfdGFyYmFsbF9wYXRo
KHNlbGYsIHBhdGgpOgorICAgICAgICBwYXRoID0gc2VsZi5yZXNvbHZlX3ZhcmlhYmxlcyhwYXRo
LCBzdHJpcD1UcnVlKQorICAgICAgICByZXR1cm4gc2VsZi50YXJiYWxsX3Jvb3QgKyBwYXRoCisK
KyAgICBkZWYgZ2V0X3NvdXJjZV9hbmRfdGFyYmFsbF9wYXRoc19mcm9tX3BhcnRzKHNlbGYsIHBh
cnRzKToKKyAgICAgICAgZnVsbF9zb3VyY2VfcGF0aCA9IHNlbGYuZ2V0X2Z1bGxfc291cmNlX3Bh
dGgocGFydHNbMV0pCisgICAgICAgIGlmIGxlbihwYXJ0cykgPiAyOgorICAgICAgICAgICAgZnVs
bF90YXJiYWxsX3BhdGggPSBzZWxmLmdldF9mdWxsX3RhcmJhbGxfcGF0aChwYXJ0c1syXSkKKyAg
ICAgICAgZWxzZToKKyAgICAgICAgICAgIGZ1bGxfdGFyYmFsbF9wYXRoID0gc2VsZi5nZXRfZnVs
bF90YXJiYWxsX3BhdGgocGFydHNbMV0pCisgICAgICAgIHJldHVybiAoZnVsbF9zb3VyY2VfcGF0
aCwgZnVsbF90YXJiYWxsX3BhdGgpCisKKyAgICBkZWYgcHJvY2Vzc19saW5lKHNlbGYsIGxpbmUp
OgorICAgICAgICBwYXJ0cyA9IGxpbmUuc3BsaXQoKQorICAgICAgICBpZiBub3QgbGVuKHBhcnRz
KSBvciBub3QgbGVuKHBhcnRzWzBdKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbGlm
IHBhcnRzWzBdWzBdID09ICIjIjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbGlmIHBh
cnRzWzBdID09ICJkaXJlY3RvcnkiIGFuZCBsZW4ocGFydHMpID4gMToKKyAgICAgICAgICAgIHNl
bGYuYWRkX2RpcmVjdG9yeShEaXJlY3RvcnkoKnNlbGYuZ2V0X3NvdXJjZV9hbmRfdGFyYmFsbF9w
YXRoc19mcm9tX3BhcnRzKHBhcnRzKSkpCisgICAgICAgIGVsaWYgcGFydHNbMF0gPT0gImZpbGUi
IGFuZCBsZW4ocGFydHMpID4gMToKKyAgICAgICAgICAgIHNlbGYuYWRkX2RpcmVjdG9yeShGaWxl
KCpzZWxmLmdldF9zb3VyY2VfYW5kX3RhcmJhbGxfcGF0aHNfZnJvbV9wYXJ0cyhwYXJ0cykpKQor
ICAgICAgICBlbGlmIHBhcnRzWzBdID09ICJleGNsdWRlIiBhbmQgbGVuKHBhcnRzKSA+IDE6Cisg
ICAgICAgICAgICBzZWxmLmFkZF9ydWxlKFJ1bGUoUnVsZS5SZXN1bHQuRVhDTFVERSwgc2VsZi5y
ZXNvbHZlX3ZhcmlhYmxlcyhwYXJ0c1sxXSkpKQorICAgICAgICBlbGlmIHBhcnRzWzBdID09ICJp
bmNsdWRlIiBhbmQgbGVuKHBhcnRzKSA+IDE6CisgICAgICAgICAgICBzZWxmLmFkZF9ydWxlKFJ1
bGUoUnVsZS5SZXN1bHQuSU5DTFVERSwgc2VsZi5yZXNvbHZlX3ZhcmlhYmxlcyhwYXJ0c1sxXSkp
KQorCisgICAgZGVmIGdldF9maWxlcyhzZWxmKToKKyAgICAgICAgZm9yIGRpcmVjdG9yeSBpbiBz
ZWxmLmRpcmVjdG9yaWVzOgorICAgICAgICAgICAgZm9yIGZpbGUgaW4gZGlyZWN0b3J5LmdldF9m
aWxlcygpOgorICAgICAgICAgICAgICAgIHlpZWxkIGZpbGUKKworICAgIGRlZiBjcmVhdGVfdGFy
ZmlsZShzZWxmLCBvdXRwdXQpOgorICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgZm9yIGZpbGUg
aW4gc2VsZi5nZXRfZmlsZXMoKToKKyAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyAxCisKKyAg
ICAgICAgZmlsZXNfdGFycmVkID0gMAorICAgICAgICB3aXRoIGNsb3NpbmcodGFyZmlsZS5vcGVu
KG91dHB1dCwgJ3cnKSkgYXMgdGFyYmFsbDoKKyAgICAgICAgICAgIGZvciBmaWxlIGluIHNlbGYu
Z2V0X2ZpbGVzKCk6CisgICAgICAgICAgICAgICAgZmlsZXNfdGFycmVkID0gZmlsZXNfdGFycmVk
ICsgMQorICAgICAgICAgICAgICAgIHByaW50KCdUYXJyaW5nIGZpbGUgezB9IG9mIHsxfScuZm9y
bWF0KGZpbGVzX3RhcnJlZCwgY291bnQpLmxqdXN0KDQwKSwgZW5kPSdccicpCisgICAgICAgICAg
ICAgICAgdGFyYmFsbC5hZGQoZmlsZVswXSwgZmlsZVsxXSkKKyAgICAgICAgcHJpbnQoIldyb3Rl
IHswfSIuZm9ybWF0KG91dHB1dCkubGp1c3QoNDApKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21h
aW5fXyI6CisgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoZGVzY3JpcHRpb249
J0J1aWxkIGEgZGlzdHJpYnV0aW9uIGJ1bmRsZS4nKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQo
Jy1zJywgJy0tc291cmNlLWRpcmVjdG9yeScsIHR5cGU9c3RyLCBkZWZhdWx0PW9zLmdldGN3ZCgp
LAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nVGhlIHRvcC1sZXZlbCBkaXJlY3Rvcnkg
b2YgdGhlIHNvdXJjZSBkaXN0cmlidXRpb24uICcgKyBcCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAnRGlyZWN0b3J5IGZvciByZWxhdGl2ZSBwYXRocy4gRGVmYXVsdHMgdG8gY3VycmVu
dCBkaXJlY3RvcnkuJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXRhcmJhbGwtcm9vdCcs
IHR5cGU9c3RyLCBkZWZhdWx0PScvJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1Ro
ZSB0b3AtbGV2ZWwgcGF0aCBvZiB0aGUgdGFyYmFsbC4gQnkgZGVmYXVsdCBmaWxlcyBhcmUgYWRk
ZWQgdG8gdGhlIHJvb3Qgb2YgdGhlIHRhcmJhbGwuJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50
KCctYicsICctLWJ1aWxkLWRpcmVjdG9yeScsIHR5cGU9c3RyLCBkZWZhdWx0PU5vbmUsCisgICAg
ICAgICAgICAgICAgICAgICAgICBoZWxwPSdUaGUgdG9wLWxldmVsIHBhdGggb2YgZGlyZWN0b3J5
IG9mIHRoZSBidWlsZCByb290LiAnICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
J0J5IGRlZmF1bHQgdGhlcmUgaXMgbm8gYnVpbGQgcm9vdC4nKQorICAgIHBhcnNlci5hZGRfYXJn
dW1lbnQoJy1vJywgdHlwZT1zdHIsIGRlZmF1bHQ9J291dC50YXInLCBkZXN0PSJvdXRwdXRfZmls
ZW5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nVGhlIHRhcmZpbGUgdG8gcHJv
ZHVjZS4gQnkgZGVmYXVsdCB0aGlzIGlzICJvdXQudGFyIicpCisgICAgcGFyc2VyLmFkZF9hcmd1
bWVudCgnbWFuaWZlc3RfZmlsZW5hbWUnLCBtZXRhdmFyPSJtYW5pZmVzdCIsIHR5cGU9c3RyLCBo
ZWxwPSdUaGUgcGF0aCB0byB0aGUgbWFuaWZlc3QgZmlsZS4nKQorCisgICAgYXJndW1lbnRzID0g
cGFyc2VyLnBhcnNlX2FyZ3MoKQorCisgICAgbWFuaWZlc3QgPSBNYW5pZmVzdChtYW5pZmVzdF9m
aWxlbmFtZT1hcmd1bWVudHMubWFuaWZlc3RfZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAg
ICAgICBzb3VyY2Vfcm9vdD1hcmd1bWVudHMuc291cmNlX2RpcmVjdG9yeSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGJ1aWxkX3Jvb3Q9YXJndW1lbnRzLmJ1aWxkX2RpcmVjdG9yeSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgIHRhcmJhbGxfcm9vdD1hcmd1bWVudHMudGFyYmFsbF9yb290KQor
ICAgIG1hbmlmZXN0LmNyZWF0ZV90YXJmaWxlKGFyZ3VtZW50cy5vdXRwdXRfZmlsZW5hbWUpCmRp
ZmYgLS1naXQgYS9Ub29scy9ndGsvbWFuaWZlc3QudHh0IGIvVG9vbHMvZ3RrL21hbmlmZXN0LnR4
dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwLi44YzYxZGYzNjMzZTM5MTE0OTdkNjlmMmM0MWZiYWIwMjFmYWQzYTk1Ci0t
LSAvZGV2L251bGwKKysrIGIvVG9vbHMvZ3RrL21hbmlmZXN0LnR4dApAQCAtMCwwICsxLDc0IEBA
CisjIEdsb2JhbCBydWxlcworZXhjbHVkZSAjJAorZXhjbHVkZSBDaGFuZ2VMb2cKK2V4Y2x1ZGUg
R05VbWFrZWZpbGUKK2V4Y2x1ZGUgTWFrZWZpbGUKK2V4Y2x1ZGUgdGFncyQKK2V4Y2x1ZGUgfiQK
K2V4Y2x1ZGUgXC4jJAorZXhjbHVkZSBcLmJhayQKK2V4Y2x1ZGUgXC5jcHJvamVjdCQKK2V4Y2x1
ZGUgXC5naXQkCitleGNsdWRlIFwuZ2l0YXR0cmlidXRlcyQKK2V4Y2x1ZGUgXC5naXRpZ25vcmUk
CitleGNsdWRlIFwuZ3lwJAorZXhjbHVkZSBcLmljbnMkCitleGNsdWRlIFwubHByb2okCitleGNs
dWRlIFwubmliJAorZXhjbHVkZSBcLm8kCitleGNsdWRlIFwub3JkZXIkCitleGNsdWRlIFwucGRm
JAorZXhjbHVkZSBcLnBsaXN0JAorZXhsdWNkZSBcLnByb1wudXNlciQKK2V4Y2x1ZGUgXC5wcm9q
ZWN0JAorZXhjbHVkZSBcLnByb3BzJAorZXhjbHVkZSBcLnB5YyQKK2V4Y2x1ZGUgXC5weW8kCitl
eGNsdWRlIFwuc2V0dGluZ3MkCitleGNsdWRlIFwuc3ZuJAorZXhjbHVkZSBcLnN3W2EtcF0kCitl
eGNsdWRlIFwudmN4cHJvaiQKK2V4Y2x1ZGUgXC54Y2NvbmZpZyQKK2V4Y2x1ZGUgXC54Y29kZXBy
b2okCisKK2RpcmVjdG9yeSBTb3VyY2UKK2V4Y2x1ZGUgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
YXVkaW8vcmVzb3VyY2VzL0lSQ19Db21wb3NpdGVfLipcLndhdiQKK2V4Y2x1ZGUgU291cmNlL1dl
YkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0CitleGNsdWRlIFNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2VmbC9EZWZhdWx0VGhlbWUKK2V4Y2x1ZGUgU291cmNlL2F1dG90b29scyQKKworIyBNb3N0
IG9mIHRoZSBmaWxlcyBpbiBTb3VyY2UvV2ViS2l0IGFyZSBub3QgbmVjZXNzYXJ5IHRvIGJ1aWxk
IEdUSysgYW5kCisjIHRoZSBkaXJlY3RvcnkgaW5jbHVkZXMgbG90cyBvZiBpbWFnZXMsIHNvIHdl
J3JlIGEgYml0IG1vcmUgcGlja3kgaGVyZS4KK2V4Y2x1ZGUgU291cmNlL1dlYktpdC8uKgoraW5j
bHVkZSBTb3VyY2UvV2ViS2l0L0NNYWtlTGlzdHMudHh0CitpbmNsdWRlIFNvdXJjZS9XZWJLaXQv
UGxhdGZvcm1HVEsuY21ha2UKK2luY2x1ZGUgU291cmNlL1dlYktpdC9ndGsKK2V4Y2x1ZGUgU291
cmNlL1dlYktpdC9ndGsvTkVXUyQKKworIyBXZSBkbyB3YW50IHRvIGluY2x1ZGUgdGhlIE5FV1Ms
IGJ1dCB3ZSB3YW50IGl0IHRvIGJlIGluIHRoZSByb290IG9mIHRoZSBhcmNoaXZlLgorZmlsZSBT
b3VyY2UvV2ViS2l0L2d0ay9ORVdTIE5FV1MKKworZGlyZWN0b3J5IFRvb2xzL2d0aworZGlyZWN0
b3J5IFRvb2xzL0d0a0xhdW5jaGVyCitkaXJlY3RvcnkgVG9vbHMvSW1hZ2VEaWZmCitkaXJlY3Rv
cnkgVG9vbHMvTWluaUJyb3dzZXIKK2RpcmVjdG9yeSBUb29scy9UZXN0V2ViS2l0QVBJCisKK2Rp
cmVjdG9yeSBUb29scy9EdW1wUmVuZGVyVHJlZQorZXhjbHVkZSBUb29scy9EdW1wUmVuZGVyVHJl
ZS9mb250cworCitkaXJlY3RvcnkgVG9vbHMvV2ViS2l0VGVzdFJ1bm5lcgorZXhjbHVkZSBUb29s
cy9XZWJLaXRUZXN0UnVubmVyL2ZvbnRzLworCitmaWxlIENNYWtlTGlzdHMudHh0CitmaWxlIFRv
b2xzL0NNYWtlTGlzdHMudHh0CitmaWxlIFRvb2xzL1NjcmlwdHMvVkNTVXRpbHMucG0KK2ZpbGUg
VG9vbHMvU2NyaXB0cy9ydW4tZ3RrLXRlc3RzCitmaWxlIFRvb2xzL1NjcmlwdHMvd2Via2l0LWJ1
aWxkLWRpcmVjdG9yeQorZmlsZSBUb29scy9TY3JpcHRzL3dlYmtpdGRpcnMucG0KK2ZpbGUgVG9v
bHMvamhidWlsZC9qaGJ1aWxkdXRpbHMucHkKKworZGlyZWN0b3J5ICRidWlsZC9Eb2N1bWVudGF0
aW9uL3dlYmtpdDJndGsvaHRtbCBEb2N1bWVudGF0aW9uL3dlYmtpdDJndGsvaHRtbAorZGlyZWN0
b3J5ICRidWlsZC9Eb2N1bWVudGF0aW9uL3dlYmtpdDJndGsvaHRtbCBEb2N1bWVudGF0aW9uL3dl
YmtpdDJndGsvaHRtbAorZGlyZWN0b3J5ICRidWlsZC9Eb2N1bWVudGF0aW9uL3dlYmtpdGd0ay90
bXBsIERvY3VtZW50YXRpb24vd2Via2l0Z3RrL3RtcGwKK2RpcmVjdG9yeSAkYnVpbGQvRG9jdW1l
bnRhdGlvbi93ZWJraXRndGsvdG1wbCBEb2N1bWVudGF0aW9uL3dlYmtpdGd0ay90bXBsCmRpZmYg
LS1naXQgYS9DaGFuZ2VMb2cgYi9DaGFuZ2VMb2cKaW5kZXggZWIyOWFmMjU2NzljYjRkYjkwNzRi
MWMyY2ZkODZlNjI5NjgxMDlkMi4uNDdjYjBiZDQzNWY1ZWE0NTA5YTYwMGM2NDhjYTFkZDFmMjU5
YzNkOSAxMDA2NDQKLS0tIGEvQ2hhbmdlTG9nCisrKyBiL0NoYW5nZUxvZwpAQCAtMSwzICsxLDEz
IEBACisyMDE0LTAxLTA4ICBNYXJ0aW4gUm9iaW5zb24gIDxtcm9iaW5zb25AaWdhbGlhLmNvbT4K
KworICAgICAgICBbR1RLXSBbQ01ha2VdIEFkZCBhICJtYWtlIGRpc3QiIHRhcmdldAorICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTE2Mzc4CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBTb3VyY2UvUGxhdGZv
cm1HVEsuY21ha2U6IEEgQ01ha2Ugc3VwcG9ydCBmb3IgZXhlY3V0aW5nIHRoZSBtYWtlLWRpc3QK
KyAgICAgICAgc2NyaXB0IGFuZCB0aGVuIHR1cm5pbmcgdGhlIHRhcmZpbGUgaW50byBhIExaTUEg
Y29tcHJlc3NlZCBmaWxlLgorCiAyMDE0LTAxLTA3ICBHdXN0YXZvIE5vcm9uaGEgU2lsdmEgIDxn
dXN0YXZvLm5vcm9uaGFAY29sbGFib3JhLmNvbT4KIAogICAgICAgICBVbnJldmlld2VkIEdUSy9D
TWFrZSBidWlsZCBmaXg6IHVzZSB0aGUgY29ycmVjdCBsb2NhdGlvbiBmb3IgZG9jcy1idWlsZC5z
dGFtcAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>221053</attachid>
            <date>2014-01-13 09:11:27 -0800</date>
            <delta_ts>2014-01-27 18:45:54 -0800</delta_ts>
            <desc>Make the script more pythonic</desc>
            <filename>bug-116378-20140113091125.patch</filename>
            <type>text/plain</type>
            <size>16298</size>
            <attacher name="Martin Robinson">mrobinson</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTYxNTg5CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZmMwYmI1NWJlOGMxODgx
OWI5ODViYTZmYjU0ZjJjNWU3MGFhMDQ0MS4uNjQzNzE1OTUzNzJjNmNlNzI1ZThiMTUxZjFlMGM3
YjhkZjdhZTQ4OSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDEzIEBACisyMDE0LTAxLTA5ICBNYXJ0
aW4gUm9iaW5zb24gIDxtcm9iaW5zb25AaWdhbGlhLmNvbT4KKworICAgICAgICBbR1RLXSBbQ01h
a2VdIEFkZCBhICJtYWtlIGRpc3QiIHRhcmdldAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0
Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTE2Mzc4CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZ
IChPT1BTISkuCisKKyAgICAgICAgKiBDTWFrZUxpc3RzLnR4dDogRG9uJ3QgYnVpbGQgV2ViS2l0
VmVyc2lvbi5oIGZvciBXZWJLaXRHVEsrLiBXZSBkb24ndCB1c2UgaXQKKyAgICAgICAgYW5kIHdl
IGRvbid0IHdhbnQgdG8gZGlzdHJpYnV0ZSB0aGUgZGVwZW5kZW5jeS4KKwogMjAxNC0wMS0wOSAg
RGFuaWVsIEJhdGVzICA8ZGFiYXRlc0BhcHBsZS5jb20+CiAKICAgICAgICAgW2lPU10gVXBzdHJl
YW0gV2ViQ29yZS9wbGF0Zm9ybSBjaGFuZ2VzCmRpZmYgLS1naXQgYS9Tb3VyY2UvUGxhdGZvcm1H
VEsuY21ha2UgYi9Tb3VyY2UvUGxhdGZvcm1HVEsuY21ha2UKaW5kZXggYjgxOTI0NjUzYWU2OGZm
MWM2YWU4ODA1ZGNjNDJjMDA0ZjYwZTBiMi4uOTFlZWIzODUyMzNhN2IyY2UyYWRmOGMwZjcwOWFl
MjM5Y2I4NWY1YSAxMDA2NDQKLS0tIGEvU291cmNlL1BsYXRmb3JtR1RLLmNtYWtlCisrKyBiL1Nv
dXJjZS9QbGF0Zm9ybUdUSy5jbWFrZQpAQCAtNDgsMyArNDgsMzAgQEAgZW5kaWYgKCkKIGlmIChF
TkFCTEVfV0VCS0lUMikKICAgICBhZGRfZGVwZW5kZW5jaWVzKGZha2UtZG9jcy10YXJnZXQgV2Vi
S2l0MikKIGVuZGlmICgpCisKK2lmIChFTkFCTEVfV0VCS0lUIEFORCBFTkFCTEVfV0VCS0lUMikK
KyAgICBhZGRfY3VzdG9tX2NvbW1hbmQoCisgICAgICAgIE9VVFBVVCAke0NNQUtFX0JJTkFSWV9E
SVJ9L3dlYmtpdGd0ay0ke1BST0pFQ1RfVkVSU0lPTn0udGFyCisgICAgICAgIERFUEVORFMgJHtU
T09MU19ESVJ9L2d0ay9tYWtlLWRpc3QucHkKKyAgICAgICAgREVQRU5EUyAke1RPT0xTX0RJUn0v
Z3RrL21hbmlmZXN0LnR4dAorICAgICAgICBERVBFTkRTIFdlYktpdAorICAgICAgICBERVBFTkRT
IFdlYktpdDIKKyAgICAgICAgQ09NTUFORCAke1RPT0xTX0RJUn0vZ3RrL21ha2UtZGlzdC5weQor
ICAgICAgICAgICAgICAgIC0tc291cmNlLWRpcj0ke0NNQUtFX1NPVVJDRV9ESVJ9CisgICAgICAg
ICAgICAgICAgLS1idWlsZC1kaXI9JHtDTUFLRV9CSU5BUllfRElSfQorICAgICAgICAgICAgICAg
IC0tdGFyYmFsbC1yb290PS93ZWJraXRndGstJHtQUk9KRUNUX1ZFUlNJT059CisgICAgICAgICAg
ICAgICAgLW8gJHtDTUFLRV9CSU5BUllfRElSfS93ZWJraXRndGstJHtQUk9KRUNUX1ZFUlNJT059
LnRhcgorICAgICAgICAgICAgICAgICR7VE9PTFNfRElSfS9ndGsvbWFuaWZlc3QudHh0CisgICAg
KQorCisgICAgYWRkX2N1c3RvbV9jb21tYW5kKAorICAgICAgICBPVVRQVVQgJHtDTUFLRV9CSU5B
UllfRElSfS93ZWJraXRndGstJHtQUk9KRUNUX1ZFUlNJT059LnRhci54egorICAgICAgICBERVBF
TkRTICR7Q01BS0VfQklOQVJZX0RJUn0vd2Via2l0Z3RrLSR7UFJPSkVDVF9WRVJTSU9OfS50YXIK
KyAgICAgICAgQ09NTUFORCB4eiAtZiAke0NNQUtFX0JJTkFSWV9ESVJ9L3dlYmtpdGd0ay0ke1BS
T0pFQ1RfVkVSU0lPTn0udGFyCisgICAgKQorCisgICAgYWRkX2N1c3RvbV90YXJnZXQoZGlzdAor
ICAgICAgICBERVBFTkRTICR7Q01BS0VfQklOQVJZX0RJUn0vd2Via2l0Z3RrLSR7UFJPSkVDVF9W
RVJTSU9OfS50YXIueHoKKyAgICApCitlbmRpZiAoKQorCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9DTWFrZUxpc3RzLnR4dCBiL1NvdXJjZS9XZWJDb3JlL0NNYWtlTGlzdHMudHh0CmluZGV4
IGYxM2JlOGFhZjQ1NGEwZjJmNjMyMmVlMjcxMzhjZGE3NjI0NDNiYTcuLjJhYTIzYTBjOWEwMWNi
MWUxZWYxYjQzYTM0NmJkYWY0OTI3OThlZTMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL0NN
YWtlTGlzdHMudHh0CisrKyBiL1NvdXJjZS9XZWJDb3JlL0NNYWtlTGlzdHMudHh0CkBAIC0zMjYz
LDEzICszMjYzLDE1IEBAIGxpc3QoQVBQRU5EIFdlYkNvcmVfU09VUkNFUyAke0RFUklWRURfU09V
UkNFU19XRUJDT1JFX0RJUn0vWE1MTlNOYW1lcy5jcHApCiBHRU5FUkFURV9ET01fTkFNRVMoWE1M
ICR7V0VCQ09SRV9ESVJ9L3htbC94bWxhdHRycy5pbikKIGxpc3QoQVBQRU5EIFdlYkNvcmVfU09V
UkNFUyAke0RFUklWRURfU09VUkNFU19XRUJDT1JFX0RJUn0vWE1MTmFtZXMuY3BwKQogCi1hZGRf
Y3VzdG9tX2NvbW1hbmQoCi0gICAgT1VUUFVUICR7REVSSVZFRF9TT1VSQ0VTX1dFQkNPUkVfRElS
fS9XZWJLaXRWZXJzaW9uLmgKLSAgICBNQUlOX0RFUEVOREVOQ1kgJHtXRUJLSVRfRElSfS9zY3Jp
cHRzL2dlbmVyYXRlLXdlYmtpdHZlcnNpb24ucGwKLSAgICBERVBFTkRTICR7V0VCS0lUX0RJUn0v
bWFjL0NvbmZpZ3VyYXRpb25zL1ZlcnNpb24ueGNjb25maWcKLSAgICBDT01NQU5EICR7UEVSTF9F
WEVDVVRBQkxFfSAke1dFQktJVF9ESVJ9L3NjcmlwdHMvZ2VuZXJhdGUtd2Via2l0dmVyc2lvbi5w
bCAtLWNvbmZpZyAke1dFQktJVF9ESVJ9L21hYy9Db25maWd1cmF0aW9ucy9WZXJzaW9uLnhjY29u
ZmlnIC0tb3V0cHV0RGlyICR7REVSSVZFRF9TT1VSQ0VTX1dFQkNPUkVfRElSfQotICAgIFZFUkJB
VElNKQotbGlzdChBUFBFTkQgV2ViQ29yZV9TT1VSQ0VTICR7REVSSVZFRF9TT1VSQ0VTX1dFQkNP
UkVfRElSfS9XZWJLaXRWZXJzaW9uLmgpCitpZiAoTk9UIFBPUlQgU1RSRVFVQUwgIkdUSyIpCisg
ICAgYWRkX2N1c3RvbV9jb21tYW5kKAorICAgICAgICBPVVRQVVQgJHtERVJJVkVEX1NPVVJDRVNf
V0VCQ09SRV9ESVJ9L1dlYktpdFZlcnNpb24uaAorICAgICAgICBNQUlOX0RFUEVOREVOQ1kgJHtX
RUJLSVRfRElSfS9zY3JpcHRzL2dlbmVyYXRlLXdlYmtpdHZlcnNpb24ucGwKKyAgICAgICAgREVQ
RU5EUyAke1dFQktJVF9ESVJ9L21hYy9Db25maWd1cmF0aW9ucy9WZXJzaW9uLnhjY29uZmlnCisg
ICAgICAgIENPTU1BTkQgJHtQRVJMX0VYRUNVVEFCTEV9ICR7V0VCS0lUX0RJUn0vc2NyaXB0cy9n
ZW5lcmF0ZS13ZWJraXR2ZXJzaW9uLnBsIC0tY29uZmlnICR7V0VCS0lUX0RJUn0vbWFjL0NvbmZp
Z3VyYXRpb25zL1ZlcnNpb24ueGNjb25maWcgLS1vdXRwdXREaXIgJHtERVJJVkVEX1NPVVJDRVNf
V0VCQ09SRV9ESVJ9CisgICAgICAgIFZFUkJBVElNKQorICAgIGxpc3QoQVBQRU5EIFdlYkNvcmVf
U09VUkNFUyAke0RFUklWRURfU09VUkNFU19XRUJDT1JFX0RJUn0vV2ViS2l0VmVyc2lvbi5oKQor
ZW5kaWYgKCkKIAogV0VCS0lUX1dSQVBfU09VUkNFTElTVCgke1dlYkNvcmVfSURMX0ZJTEVTfSAk
e1dlYkNvcmVfU09VUkNFU30pCiBXRUJLSVRfV1JBUF9TT1VSQ0VMSVNUKCR7V2ViQ29yZVRlc3RT
dXBwb3J0X0lETF9GSUxFU30gJHtXZWJDb3JlVGVzdFN1cHBvcnRfU09VUkNFU30pCmRpZmYgLS1n
aXQgYS9Ub29scy9DaGFuZ2VMb2cgYi9Ub29scy9DaGFuZ2VMb2cKaW5kZXggYmExNDMzODA2Yjg2
ZDdkZjk1Y2FiZDNlYWNmNTI2MWY1MTExMTI0Ni4uOGNmMWZmMzRiNDU3MjM2OGM2MjhiNTIzNDIx
YTc1ZjYyYmNiMGM1NSAxMDA2NDQKLS0tIGEvVG9vbHMvQ2hhbmdlTG9nCisrKyBiL1Rvb2xzL0No
YW5nZUxvZwpAQCAtMSwzICsxLDE2IEBACisyMDE0LTAxLTA5ICBNYXJ0aW4gUm9iaW5zb24gIDxt
cm9iaW5zb25AaWdhbGlhLmNvbT4KKworICAgICAgICBbR1RLXSBbQ01ha2VdIEFkZCBhICJtYWtl
IGRpc3QiIHRhcmdldAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9MTE2Mzc4CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAg
ICAgICAgQWRkZWQgYSBzY3JpcHQgdGhhdCByZWFkcyBhIG1hbmlmZXN0IGZpbGUgYW4gcHJvZHVj
ZXMgYSB0YXJiYWxsLiBBbHNvIGFkZAorICAgICAgICB0aGUgbWFuaWZlc3QuCisKKyAgICAgICAg
KiBndGsvbWFrZS1kaXN0LnB5OiBBZGRlZC4KKyAgICAgICAgKiBndGsvbWFuaWZlc3QudHh0OiBB
ZGRlZC4KKwogMjAxNC0wMS0wOSAgRGFuIEJlcm5zdGVpbiAgPG1pdHpAYXBwbGUuY29tPgogCiAg
ICAgICAgIFtDb2NvYV0gUHJvbW90ZSBXS0JhY2tGb3J3YXJkTGlzdHssSXRlbX0uaCB0byBwdWJs
aWMKZGlmZiAtLWdpdCBhL1Rvb2xzL2d0ay9tYWtlLWRpc3QucHkgYi9Ub29scy9ndGsvbWFrZS1k
aXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAuLjU3ZjA2MDIyY2JjNDBkMDQyZGVmODA2MzlkOWFiYjMwMGNhYWQy
NzMKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9ndGsvbWFrZS1kaXN0LnB5CkBAIC0wLDAgKzEs
MjMxIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgQ29weXJpZ2h0IChDKSAyMDE0IElnYWxp
YSBTLkwuCisjCisjIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlz
dHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V
IExlc3NlciBHZW5lcmFsIFB1YmxpYworIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJl
ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyMgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNl
LCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIGxpYnJh
cnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMg
YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu
dHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ
T1NFLiAgU2VlIHRoZSBHTlUKKyMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1v
cmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUg
R05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJy
YXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIElu
Yy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEz
MDEgIFVTQQorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCitmcm9tIGNv
bnRleHRsaWIgaW1wb3J0IGNsb3NpbmcKKworaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgb3MKK2lt
cG9ydCBvcy5wYXRoCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKK2ltcG9ydCB0YXJmaWxlCisKKwor
ZGVmIGVudW0oKiplbnVtcyk6CisgICAgcmV0dXJuIHR5cGUoJ0VudW0nLCAoKSwgZW51bXMpCisK
KworY2xhc3MgUnVsZShvYmplY3QpOgorICAgIFJlc3VsdCA9IGVudW0oSU5DTFVERT0xLCBFWENM
VURFPTIsIE5PX01BVENIPTMpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZSwgcGF0dGVy
bik6CisgICAgICAgIHNlbGYudHlwZSA9IHR5cGUKKyAgICAgICAgc2VsZi5vcmlnaW5hbF9wYXR0
ZXJuID0gcGF0dGVybgorICAgICAgICBzZWxmLnBhdHRlcm4gPSByZS5jb21waWxlKHBhdHRlcm4p
CisKKyAgICBkZWYgdGVzdChzZWxmLCBmaWxlKToKKyAgICAgICAgaWYgbm90IHNlbGYucGF0dGVy
bi5zZWFyY2goZmlsZSk6CisgICAgICAgICAgICByZXR1cm4gUnVsZS5SZXN1bHQuTk9fTUFUQ0gK
KyAgICAgICAgcmV0dXJuIHNlbGYudHlwZQorCisKK2NsYXNzIFJ1bGVzZXQob2JqZWN0KToKKyAg
ICBfZ2xvYmFsX3J1bGVzID0gTm9uZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAg
ICBzZWxmLnJ1bGVzID0gW10KKworICAgICAgICAjIEJ5IGRlZmF1bHQsIGFjY2VwdCBhbGwgZmls
ZXMuCisgICAgICAgIHNlbGYuYWRkX3J1bGUoUnVsZShSdWxlLlJlc3VsdC5JTkNMVURFLCAnLion
KSkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBnbG9iYWxfcnVsZXMoY2xzKToKKyAgICAg
ICAgaWYgbm90KGNscy5fZ2xvYmFsX3J1bGVzKToKKyAgICAgICAgICAgIGNscy5fZ2xvYmFsX3J1
bGVzID0gUnVsZXNldCgpCisgICAgICAgIHJldHVybiBjbHMuX2dsb2JhbF9ydWxlcworCisgICAg
QGNsYXNzbWV0aG9kCisgICAgZGVmIGFkZF9nbG9iYWxfcnVsZShjbHMsIHJ1bGUpOgorICAgICAg
ICBjbHMuZ2xvYmFsX3J1bGVzKCkuYWRkX3J1bGUocnVsZSkKKworICAgIGRlZiBhZGRfcnVsZShz
ZWxmLCBydWxlKToKKyAgICAgICAgc2VsZi5ydWxlcy5hcHBlbmQocnVsZSkKKworICAgIGRlZiBw
YXNzZXMoc2VsZiwgZmlsZSk6CisgICAgICAgIGFsbG93ZWQgPSBGYWxzZQorICAgICAgICBmb3Ig
cnVsZSBpbiBzZWxmLnJ1bGVzOgorICAgICAgICAgICAgcmVzdWx0ID0gcnVsZS50ZXN0KGZpbGUp
CisgICAgICAgICAgICBpZiByZXN1bHQgPT0gUnVsZS5SZXN1bHQuTk9fTUFUQ0g6CisgICAgICAg
ICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGFsbG93ZWQgPSBSdWxlLlJlc3VsdC5JTkNM
VURFID09IHJlc3VsdAorICAgICAgICByZXR1cm4gYWxsb3dlZAorCisKK2NsYXNzIEZpbGUob2Jq
ZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc291cmNlX3Jvb3QsIHRhcmJhbGxfcm9vdCk6
CisgICAgICAgIHNlbGYuc291cmNlX3Jvb3QgPSBzb3VyY2Vfcm9vdAorICAgICAgICBzZWxmLnRh
cmJhbGxfcm9vdCA9IHRhcmJhbGxfcm9vdAorCisgICAgZGVmIGdldF9maWxlcyhzZWxmKToKKyAg
ICAgICAgeWllbGQgKHNlbGYuc291cmNlX3Jvb3QsIHNlbGYudGFyYmFsbF9yb290KQorCisKK2Ns
YXNzIERpcmVjdG9yeShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzb3VyY2Vfcm9v
dCwgdGFyYmFsbF9yb290KToKKyAgICAgICAgc2VsZi5zb3VyY2Vfcm9vdCA9IHNvdXJjZV9yb290
CisgICAgICAgIHNlbGYudGFyYmFsbF9yb290ID0gdGFyYmFsbF9yb290CisgICAgICAgIHNlbGYu
cnVsZXMgPSBSdWxlc2V0KCkKKworICAgIGRlZiBhZGRfcnVsZShzZWxmLCBydWxlKToKKyAgICAg
ICAgc2VsZi5ydWxlcy5hZGRfcnVsZShydWxlKQorCisgICAgZGVmIGdldF90YXJiYWxsX3BhdGgo
c2VsZiwgZmlsZW5hbWUpOgorICAgICAgICByZXR1cm4gZmlsZW5hbWUucmVwbGFjZShzZWxmLnNv
dXJjZV9yb290LCBzZWxmLnRhcmJhbGxfcm9vdCwgMSkKKworICAgIGRlZiBnZXRfZmlsZXMoc2Vs
Zik6CisgICAgICAgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHNlbGYuc291cmNl
X3Jvb3QpOgorCisgICAgICAgICAgICBkZWYgcGFzc2VzX2FsbF9ydWxlcyhlbnRyeSk6CisgICAg
ICAgICAgICAgICAgcmV0dXJuIFJ1bGVzZXQuZ2xvYmFsX3J1bGVzKCkucGFzc2VzKGVudHJ5KSBh
bmQgc2VsZi5ydWxlcy5wYXNzZXMoZW50cnkpCisKKyAgICAgICAgICAgIHRvX2tlZXAgPSBmaWx0
ZXIocGFzc2VzX2FsbF9ydWxlcywgZGlycykKKyAgICAgICAgICAgIGRlbCBkaXJzWzpdCisgICAg
ICAgICAgICBkaXJzLmV4dGVuZCh0b19rZWVwKQorCisgICAgICAgICAgICBmb3IgZmlsZSBpbiBm
aWxlczoKKyAgICAgICAgICAgICAgICBmaWxlID0gb3MucGF0aC5qb2luKHJvb3QsIGZpbGUpCisg
ICAgICAgICAgICAgICAgaWYgbm90IHBhc3Nlc19hbGxfcnVsZXMoZmlsZSk6CisgICAgICAgICAg
ICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgeWllbGQgKGZpbGUsIHNlbGYuZ2V0
X3RhcmJhbGxfcGF0aChmaWxlKSkKKworCitjbGFzcyBNYW5pZmVzdChvYmplY3QpOgorICAgIGRl
ZiBfX2luaXRfXyhzZWxmLCBtYW5pZmVzdF9maWxlbmFtZSwgc291cmNlX3Jvb3QsIGJ1aWxkX3Jv
b3QsIHRhcmJhbGxfcm9vdD0nLycpOgorICAgICAgICBzZWxmLmN1cnJlbnRfZGlyZWN0b3J5ID0g
Tm9uZQorICAgICAgICBzZWxmLmRpcmVjdG9yaWVzID0gW10KKyAgICAgICAgc2VsZi50YXJiYWxs
X3Jvb3QgPSB0YXJiYWxsX3Jvb3QKKyAgICAgICAgc2VsZi5zb3VyY2Vfcm9vdCA9IG9zLnBhdGgu
YWJzcGF0aChzb3VyY2Vfcm9vdCkKKyAgICAgICAgc2VsZi5idWlsZF9yb290ID0gb3MucGF0aC5h
YnNwYXRoKGJ1aWxkX3Jvb3QpCisKKyAgICAgICAgIyBOb3JtYWxpemUgdGhlIHRhcmJhbGwgcm9v
dCBzbyB0aGF0IGl0IHN0YXJ0cyBhbmQgZW5kcyB3aXRoIGEgc2xhc2guCisgICAgICAgIGlmIG5v
dCBzZWxmLnRhcmJhbGxfcm9vdC5lbmRzd2l0aCgnLycpOgorICAgICAgICAgICAgc2VsZi50YXJi
YWxsX3Jvb3QgPSBzZWxmLnRhcmJhbGxfcm9vdCArICcvJworICAgICAgICBpZiBub3Qgc2VsZi50
YXJiYWxsX3Jvb3Quc3RhcnRzd2l0aCgnLycpOgorICAgICAgICAgICAgc2VsZi50YXJiYWxsX3Jv
b3QgPSAnLycgKyBzZWxmLnRhcmJhbGxfcm9vdAorCisgICAgICAgIHdpdGggb3BlbihtYW5pZmVz
dF9maWxlbmFtZSwgJ3InKSBhcyBmaWxlOgorICAgICAgICAgICAgZm9yIGxpbmUgaW4gZmlsZS5y
ZWFkbGluZXMoKToKKyAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3NfbGluZShsaW5lKQorCisg
ICAgZGVmIGFkZF9ydWxlKHNlbGYsIHJ1bGUpOgorICAgICAgICBpZiBzZWxmLmN1cnJlbnRfZGly
ZWN0b3J5OgorICAgICAgICAgICAgc2VsZi5jdXJyZW50X2RpcmVjdG9yeS5hZGRfcnVsZShydWxl
KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgUnVsZXNldC5hZGRfZ2xvYmFsX3J1bGUocnVs
ZSkKKworICAgIGRlZiBhZGRfZGlyZWN0b3J5KHNlbGYsIGRpcmVjdG9yeSk6CisgICAgICAgIHNl
bGYuY3VycmVudF9kaXJlY3RvcnkgPSBkaXJlY3RvcnkKKyAgICAgICAgc2VsZi5kaXJlY3Rvcmll
cy5hcHBlbmQoZGlyZWN0b3J5KQorCisgICAgZGVmIHJlc29sdmVfdmFyaWFibGVzKHNlbGYsIHN0
cmluZywgc3RyaXA9RmFsc2UpOgorICAgICAgICBpZiBzdHJpcDoKKyAgICAgICAgICAgIHN0cmlu
ZyA9IHN0cmluZy5yZXBsYWNlKCckc291cmNlJywgJycpCisgICAgICAgICAgICBzdHJpbmcgPSBz
dHJpbmcucmVwbGFjZSgnJGJ1aWxkJywgJycpCisgICAgICAgICAgICByZXR1cm4gc3RyaW5nCisK
KyAgICAgICAgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UoJyRzb3VyY2UnLCBzZWxmLnNvdXJjZV9y
b290KQorICAgICAgICBpZiBzZWxmLmJ1aWxkX3Jvb3Q6CisgICAgICAgICAgICBzdHJpbmcgPSBz
dHJpbmcucmVwbGFjZSgnJGJ1aWxkJywgc2VsZi5idWlsZF9yb290KQorICAgICAgICBlbGlmICck
YnVpbGQnIGluIHN0cmluZzoKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbignTWFuaWZlc3Qg
aGFzICRidWlsZCBidXQgYnVpbGQgcm9vdCBub3QgZ2l2ZW4uJykKKyAgICAgICAgcmV0dXJuIHN0
cmluZworCisgICAgZGVmIGdldF9mdWxsX3NvdXJjZV9wYXRoKHNlbGYsIHNvdXJjZV9wYXRoKToK
KyAgICAgICAgZnVsbF9zb3VyY2VfcGF0aCA9IHNlbGYucmVzb2x2ZV92YXJpYWJsZXMoc291cmNl
X3BhdGgpCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhmdWxsX3NvdXJjZV9wYXRoKToK
KyAgICAgICAgICAgIGZ1bGxfc291cmNlX3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5zb3VyY2Vf
cm9vdCwgc291cmNlX3BhdGgpCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhmdWxsX3Nv
dXJjZV9wYXRoKToKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbignQ291bGQgbm90IGZpbmQg
ZGlyZWN0b3J5ICVzJyAlIGZ1bGxfc291cmNlX3BhdGgpCisgICAgICAgIHJldHVybiBmdWxsX3Nv
dXJjZV9wYXRoCisKKyAgICBkZWYgZ2V0X2Z1bGxfdGFyYmFsbF9wYXRoKHNlbGYsIHBhdGgpOgor
ICAgICAgICBwYXRoID0gc2VsZi5yZXNvbHZlX3ZhcmlhYmxlcyhwYXRoLCBzdHJpcD1UcnVlKQor
ICAgICAgICByZXR1cm4gc2VsZi50YXJiYWxsX3Jvb3QgKyBwYXRoCisKKyAgICBkZWYgZ2V0X3Nv
dXJjZV9hbmRfdGFyYmFsbF9wYXRoc19mcm9tX3BhcnRzKHNlbGYsIHBhcnRzKToKKyAgICAgICAg
ZnVsbF9zb3VyY2VfcGF0aCA9IHNlbGYuZ2V0X2Z1bGxfc291cmNlX3BhdGgocGFydHNbMV0pCisg
ICAgICAgIGlmIGxlbihwYXJ0cykgPiAyOgorICAgICAgICAgICAgZnVsbF90YXJiYWxsX3BhdGgg
PSBzZWxmLmdldF9mdWxsX3RhcmJhbGxfcGF0aChwYXJ0c1syXSkKKyAgICAgICAgZWxzZToKKyAg
ICAgICAgICAgIGZ1bGxfdGFyYmFsbF9wYXRoID0gc2VsZi5nZXRfZnVsbF90YXJiYWxsX3BhdGgo
cGFydHNbMV0pCisgICAgICAgIHJldHVybiAoZnVsbF9zb3VyY2VfcGF0aCwgZnVsbF90YXJiYWxs
X3BhdGgpCisKKyAgICBkZWYgcHJvY2Vzc19saW5lKHNlbGYsIGxpbmUpOgorICAgICAgICBwYXJ0
cyA9IGxpbmUuc3BsaXQoKQorICAgICAgICBpZiBub3QgbGVuKHBhcnRzKSBvciBub3QgbGVuKHBh
cnRzWzBdKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbGlmIHBhcnRzWzBdWzBdID09
ICIjIjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbGlmIHBhcnRzWzBdID09ICJkaXJl
Y3RvcnkiIGFuZCBsZW4ocGFydHMpID4gMToKKyAgICAgICAgICAgIHNlbGYuYWRkX2RpcmVjdG9y
eShEaXJlY3RvcnkoKnNlbGYuZ2V0X3NvdXJjZV9hbmRfdGFyYmFsbF9wYXRoc19mcm9tX3BhcnRz
KHBhcnRzKSkpCisgICAgICAgIGVsaWYgcGFydHNbMF0gPT0gImZpbGUiIGFuZCBsZW4ocGFydHMp
ID4gMToKKyAgICAgICAgICAgIHNlbGYuYWRkX2RpcmVjdG9yeShGaWxlKCpzZWxmLmdldF9zb3Vy
Y2VfYW5kX3RhcmJhbGxfcGF0aHNfZnJvbV9wYXJ0cyhwYXJ0cykpKQorICAgICAgICBlbGlmIHBh
cnRzWzBdID09ICJleGNsdWRlIiBhbmQgbGVuKHBhcnRzKSA+IDE6CisgICAgICAgICAgICBzZWxm
LmFkZF9ydWxlKFJ1bGUoUnVsZS5SZXN1bHQuRVhDTFVERSwgc2VsZi5yZXNvbHZlX3ZhcmlhYmxl
cyhwYXJ0c1sxXSkpKQorICAgICAgICBlbGlmIHBhcnRzWzBdID09ICJpbmNsdWRlIiBhbmQgbGVu
KHBhcnRzKSA+IDE6CisgICAgICAgICAgICBzZWxmLmFkZF9ydWxlKFJ1bGUoUnVsZS5SZXN1bHQu
SU5DTFVERSwgc2VsZi5yZXNvbHZlX3ZhcmlhYmxlcyhwYXJ0c1sxXSkpKQorCisgICAgZGVmIGdl
dF9maWxlcyhzZWxmKToKKyAgICAgICAgZm9yIGRpcmVjdG9yeSBpbiBzZWxmLmRpcmVjdG9yaWVz
OgorICAgICAgICAgICAgZm9yIGZpbGUgaW4gZGlyZWN0b3J5LmdldF9maWxlcygpOgorICAgICAg
ICAgICAgICAgIHlpZWxkIGZpbGUKKworICAgIGRlZiBjcmVhdGVfdGFyZmlsZShzZWxmLCBvdXRw
dXQpOgorICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgZm9yIGZpbGUgaW4gc2VsZi5nZXRfZmls
ZXMoKToKKyAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyAxCisKKyAgICAgICAgZmlsZXNfdGFy
cmVkID0gMAorICAgICAgICB3aXRoIGNsb3NpbmcodGFyZmlsZS5vcGVuKG91dHB1dCwgJ3cnKSkg
YXMgdGFyYmFsbDoKKyAgICAgICAgICAgIGZvciBpLCBmaWxlIGluIGVudW1lcmF0ZShzZWxmLmdl
dF9maWxlcygpLCBzdGFydD0xKToKKyAgICAgICAgICAgICAgICBwcmludCgnVGFycmluZyBmaWxl
IHswfSBvZiB7MX0nLmZvcm1hdChpLCBjb3VudCkubGp1c3QoNDApLCBlbmQ9J1xyJykKKyAgICAg
ICAgICAgICAgICB0YXJiYWxsLmFkZChmaWxlWzBdLCBmaWxlWzFdKQorICAgICAgICBwcmludCgi
V3JvdGUgezB9Ii5mb3JtYXQob3V0cHV0KS5sanVzdCg0MCkpCisKKworaWYgX19uYW1lX18gPT0g
Il9fbWFpbl9fIjoKKyAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihkZXNjcmlw
dGlvbj0nQnVpbGQgYSBkaXN0cmlidXRpb24gYnVuZGxlLicpCisgICAgcGFyc2VyLmFkZF9hcmd1
bWVudCgnLXMnLCAnLS1zb3VyY2UtZGlyZWN0b3J5JywgdHlwZT1zdHIsIGRlZmF1bHQ9b3MuZ2V0
Y3dkKCksCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdUaGUgdG9wLWxldmVsIGRpcmVj
dG9yeSBvZiB0aGUgc291cmNlIGRpc3RyaWJ1dGlvbi4gJyArIFwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICdEaXJlY3RvcnkgZm9yIHJlbGF0aXZlIHBhdGhzLiBEZWZhdWx0cyB0byBj
dXJyZW50IGRpcmVjdG9yeS4nKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tdGFyYmFsbC1y
b290JywgdHlwZT1zdHIsIGRlZmF1bHQ9Jy8nLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVs
cD0nVGhlIHRvcC1sZXZlbCBwYXRoIG9mIHRoZSB0YXJiYWxsLiBCeSBkZWZhdWx0IGZpbGVzIGFy
ZSBhZGRlZCB0byB0aGUgcm9vdCBvZiB0aGUgdGFyYmFsbC4nKQorICAgIHBhcnNlci5hZGRfYXJn
dW1lbnQoJy1iJywgJy0tYnVpbGQtZGlyZWN0b3J5JywgdHlwZT1zdHIsIGRlZmF1bHQ9Tm9uZSwK
KyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1RoZSB0b3AtbGV2ZWwgcGF0aCBvZiBkaXJl
Y3Rvcnkgb2YgdGhlIGJ1aWxkIHJvb3QuICcgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAnQnkgZGVmYXVsdCB0aGVyZSBpcyBubyBidWlsZCByb290LicpCisgICAgcGFyc2VyLmFk
ZF9hcmd1bWVudCgnLW8nLCB0eXBlPXN0ciwgZGVmYXVsdD0nb3V0LnRhcicsIGRlc3Q9Im91dHB1
dF9maWxlbmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdUaGUgdGFyZmlsZSB0
byBwcm9kdWNlLiBCeSBkZWZhdWx0IHRoaXMgaXMgIm91dC50YXIiJykKKyAgICBwYXJzZXIuYWRk
X2FyZ3VtZW50KCdtYW5pZmVzdF9maWxlbmFtZScsIG1ldGF2YXI9Im1hbmlmZXN0IiwgdHlwZT1z
dHIsIGhlbHA9J1RoZSBwYXRoIHRvIHRoZSBtYW5pZmVzdCBmaWxlLicpCisKKyAgICBhcmd1bWVu
dHMgPSBwYXJzZXIucGFyc2VfYXJncygpCisKKyAgICBtYW5pZmVzdCA9IE1hbmlmZXN0KG1hbmlm
ZXN0X2ZpbGVuYW1lPWFyZ3VtZW50cy5tYW5pZmVzdF9maWxlbmFtZSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgIHNvdXJjZV9yb290PWFyZ3VtZW50cy5zb3VyY2VfZGlyZWN0b3J5LAorICAgICAg
ICAgICAgICAgICAgICAgICAgYnVpbGRfcm9vdD1hcmd1bWVudHMuYnVpbGRfZGlyZWN0b3J5LAor
ICAgICAgICAgICAgICAgICAgICAgICAgdGFyYmFsbF9yb290PWFyZ3VtZW50cy50YXJiYWxsX3Jv
b3QpCisgICAgbWFuaWZlc3QuY3JlYXRlX3RhcmZpbGUoYXJndW1lbnRzLm91dHB1dF9maWxlbmFt
ZSkKZGlmZiAtLWdpdCBhL1Rvb2xzL2d0ay9tYW5pZmVzdC50eHQgYi9Ub29scy9ndGsvbWFuaWZl
c3QudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAuLjhjNjFkZjM2MzNlMzkxMTQ5N2Q2OWYyYzQxZmJhYjAyMWZhZDNh
OTUKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9ndGsvbWFuaWZlc3QudHh0CkBAIC0wLDAgKzEs
NzQgQEAKKyMgR2xvYmFsIHJ1bGVzCitleGNsdWRlICMkCitleGNsdWRlIENoYW5nZUxvZworZXhj
bHVkZSBHTlVtYWtlZmlsZQorZXhjbHVkZSBNYWtlZmlsZQorZXhjbHVkZSB0YWdzJAorZXhjbHVk
ZSB+JAorZXhjbHVkZSBcLiMkCitleGNsdWRlIFwuYmFrJAorZXhjbHVkZSBcLmNwcm9qZWN0JAor
ZXhjbHVkZSBcLmdpdCQKK2V4Y2x1ZGUgXC5naXRhdHRyaWJ1dGVzJAorZXhjbHVkZSBcLmdpdGln
bm9yZSQKK2V4Y2x1ZGUgXC5neXAkCitleGNsdWRlIFwuaWNucyQKK2V4Y2x1ZGUgXC5scHJvaiQK
K2V4Y2x1ZGUgXC5uaWIkCitleGNsdWRlIFwubyQKK2V4Y2x1ZGUgXC5vcmRlciQKK2V4Y2x1ZGUg
XC5wZGYkCitleGNsdWRlIFwucGxpc3QkCitleGx1Y2RlIFwucHJvXC51c2VyJAorZXhjbHVkZSBc
LnByb2plY3QkCitleGNsdWRlIFwucHJvcHMkCitleGNsdWRlIFwucHljJAorZXhjbHVkZSBcLnB5
byQKK2V4Y2x1ZGUgXC5zZXR0aW5ncyQKK2V4Y2x1ZGUgXC5zdm4kCitleGNsdWRlIFwuc3dbYS1w
XSQKK2V4Y2x1ZGUgXC52Y3hwcm9qJAorZXhjbHVkZSBcLnhjY29uZmlnJAorZXhjbHVkZSBcLnhj
b2RlcHJvaiQKKworZGlyZWN0b3J5IFNvdXJjZQorZXhjbHVkZSBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9hdWRpby9yZXNvdXJjZXMvSVJDX0NvbXBvc2l0ZV8uKlwud2F2JAorZXhjbHVkZSBTb3Vy
Y2UvV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL3Rlc3QKK2V4Y2x1ZGUgU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZWZsL0RlZmF1bHRUaGVtZQorZXhjbHVkZSBTb3VyY2UvYXV0b3Rvb2xzJAorCisj
IE1vc3Qgb2YgdGhlIGZpbGVzIGluIFNvdXJjZS9XZWJLaXQgYXJlIG5vdCBuZWNlc3NhcnkgdG8g
YnVpbGQgR1RLKyBhbmQKKyMgdGhlIGRpcmVjdG9yeSBpbmNsdWRlcyBsb3RzIG9mIGltYWdlcywg
c28gd2UncmUgYSBiaXQgbW9yZSBwaWNreSBoZXJlLgorZXhjbHVkZSBTb3VyY2UvV2ViS2l0Ly4q
CitpbmNsdWRlIFNvdXJjZS9XZWJLaXQvQ01ha2VMaXN0cy50eHQKK2luY2x1ZGUgU291cmNlL1dl
YktpdC9QbGF0Zm9ybUdUSy5jbWFrZQoraW5jbHVkZSBTb3VyY2UvV2ViS2l0L2d0aworZXhjbHVk
ZSBTb3VyY2UvV2ViS2l0L2d0ay9ORVdTJAorCisjIFdlIGRvIHdhbnQgdG8gaW5jbHVkZSB0aGUg
TkVXUywgYnV0IHdlIHdhbnQgaXQgdG8gYmUgaW4gdGhlIHJvb3Qgb2YgdGhlIGFyY2hpdmUuCitm
aWxlIFNvdXJjZS9XZWJLaXQvZ3RrL05FV1MgTkVXUworCitkaXJlY3RvcnkgVG9vbHMvZ3RrCitk
aXJlY3RvcnkgVG9vbHMvR3RrTGF1bmNoZXIKK2RpcmVjdG9yeSBUb29scy9JbWFnZURpZmYKK2Rp
cmVjdG9yeSBUb29scy9NaW5pQnJvd3NlcgorZGlyZWN0b3J5IFRvb2xzL1Rlc3RXZWJLaXRBUEkK
KworZGlyZWN0b3J5IFRvb2xzL0R1bXBSZW5kZXJUcmVlCitleGNsdWRlIFRvb2xzL0R1bXBSZW5k
ZXJUcmVlL2ZvbnRzCisKK2RpcmVjdG9yeSBUb29scy9XZWJLaXRUZXN0UnVubmVyCitleGNsdWRl
IFRvb2xzL1dlYktpdFRlc3RSdW5uZXIvZm9udHMvCisKK2ZpbGUgQ01ha2VMaXN0cy50eHQKK2Zp
bGUgVG9vbHMvQ01ha2VMaXN0cy50eHQKK2ZpbGUgVG9vbHMvU2NyaXB0cy9WQ1NVdGlscy5wbQor
ZmlsZSBUb29scy9TY3JpcHRzL3J1bi1ndGstdGVzdHMKK2ZpbGUgVG9vbHMvU2NyaXB0cy93ZWJr
aXQtYnVpbGQtZGlyZWN0b3J5CitmaWxlIFRvb2xzL1NjcmlwdHMvd2Via2l0ZGlycy5wbQorZmls
ZSBUb29scy9qaGJ1aWxkL2poYnVpbGR1dGlscy5weQorCitkaXJlY3RvcnkgJGJ1aWxkL0RvY3Vt
ZW50YXRpb24vd2Via2l0Mmd0ay9odG1sIERvY3VtZW50YXRpb24vd2Via2l0Mmd0ay9odG1sCitk
aXJlY3RvcnkgJGJ1aWxkL0RvY3VtZW50YXRpb24vd2Via2l0Mmd0ay9odG1sIERvY3VtZW50YXRp
b24vd2Via2l0Mmd0ay9odG1sCitkaXJlY3RvcnkgJGJ1aWxkL0RvY3VtZW50YXRpb24vd2Via2l0
Z3RrL3RtcGwgRG9jdW1lbnRhdGlvbi93ZWJraXRndGsvdG1wbAorZGlyZWN0b3J5ICRidWlsZC9E
b2N1bWVudGF0aW9uL3dlYmtpdGd0ay90bXBsIERvY3VtZW50YXRpb24vd2Via2l0Z3RrL3RtcGwK
ZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwppbmRleCAxODgyMGZjZDhmMDYyYzAw
ZTBlMGU3ZjI3YjgyYmRjZTBhZmQzODg5Li43Mjg2ODI5ZDdjM2Y4NzY2MTEzM2E4NTg2MTRkMmU1
NGI5ZjI2ZGZjIDEwMDY0NAotLS0gYS9DaGFuZ2VMb2cKKysrIGIvQ2hhbmdlTG9nCkBAIC0xLDMg
KzEsMTMgQEAKKzIwMTQtMDEtMDkgIE1hcnRpbiBSb2JpbnNvbiAgPG1yb2JpbnNvbkBpZ2FsaWEu
Y29tPgorCisgICAgICAgIFtHVEtdIFtDTWFrZV0gQWRkIGEgIm1ha2UgZGlzdCIgdGFyZ2V0Cisg
ICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMTYzNzgKKwor
ICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIFNvdXJjZS9Q
bGF0Zm9ybUdUSy5jbWFrZTogQSBDTWFrZSBzdXBwb3J0IGZvciBleGVjdXRpbmcgdGhlIG1ha2Ut
ZGlzdAorICAgICAgICBzY3JpcHQgYW5kIHRoZW4gdHVybmluZyB0aGUgdGFyZmlsZSBpbnRvIGEg
TFpNQSBjb21wcmVzc2VkIGZpbGUuCisKIDIwMTQtMDEtMDggIE1hcnRpbiBSb2JpbnNvbiAgPG1y
b2JpbnNvbkBpZ2FsaWEuY29tPgogCiAgICAgICAgIFtHVEtdIFtDTWFrZV0gU3BlY2lmeSB0aGUg
ZXhlY3V0YWJsZSBhbmQgbGlicmFyeSBvdXRwdXQgbG9jYXRpb25zIGluIHRoZSBidWlsZAo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>222393</attachid>
            <date>2014-01-27 18:45:57 -0800</date>
            <delta_ts>2014-01-30 14:31:26 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-116378-20140127184557.patch</filename>
            <type>text/plain</type>
            <size>16047</size>
            <attacher name="Martin Robinson">mrobinson</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTYyODcyCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMjU3ZTczY2U4MTE5MzQz
YTQyZWE4MTNhMzZhNzAxMTRlNDQwMWFkYy4uY2JjNzM5YjRiNGIxMWIxMDRlNGQ5ZDM0ZmM2YzVk
MDIwOTdhNzNjZSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDEzIEBACisyMDE0LTAxLTA4ICBNYXJ0
aW4gUm9iaW5zb24gIDxtcm9iaW5zb25AaWdhbGlhLmNvbT4KKworICAgICAgICBbR1RLXSBbQ01h
a2VdIEFkZCBhICJtYWtlIGRpc3QiIHRhcmdldAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0
Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTE2Mzc4CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZ
IChPT1BTISkuCisKKyAgICAgICAgKiBDTWFrZUxpc3RzLnR4dDogRG9uJ3QgYnVpbGQgV2ViS2l0
VmVyc2lvbi5oIGZvciBXZWJLaXRHVEsrLiBXZSBkb24ndCB1c2UgaXQKKyAgICAgICAgYW5kIHdl
IGRvbid0IHdhbnQgdG8gZGlzdHJpYnV0ZSB0aGUgZGVwZW5kZW5jeS4KKwogMjAxNC0wMS0yNyAg
QW5keSBFc3RlcyAgPGFlc3Rlc0BhcHBsZS5jb20+CiAKICAgICAgICAgU3RvcCB0aGUgY29kZSBn
ZW5lcmF0b3IgZnJvbSBhZGRpbmcgRU5BQkxFKCkgbWFjcm9zIHRvIE9iamVjdGl2ZS1DIERPTSBo
ZWFkZXJzCmRpZmYgLS1naXQgYS9Tb3VyY2UvUGxhdGZvcm1HVEsuY21ha2UgYi9Tb3VyY2UvUGxh
dGZvcm1HVEsuY21ha2UKaW5kZXggY2QwYmQ3ZGVkYzU1Y2NlZTY2YjQxZGZmZWIwNGMzZGJkZWZl
ZDllYy4uOTZhMjdlMWZmM2NmMGJiMWU1YTg2ODIyODBkYTU1MGYwZGI3ZjRlYSAxMDA2NDQKLS0t
IGEvU291cmNlL1BsYXRmb3JtR1RLLmNtYWtlCisrKyBiL1NvdXJjZS9QbGF0Zm9ybUdUSy5jbWFr
ZQpAQCAtNTIsMyArNTIsMjkgQEAgZW5kaWYgKCkKIGFkZF9jdXN0b21fdGFyZ2V0KGNoZWNrCiAg
ICAgQ09NTUFORCAiJHtUT09MU19ESVJ9L1NjcmlwdHMvcnVuLWd0ay10ZXN0cyIKICkKKworaWYg
KEVOQUJMRV9XRUJLSVQgQU5EIEVOQUJMRV9XRUJLSVQyKQorICAgIGFkZF9jdXN0b21fY29tbWFu
ZCgKKyAgICAgICAgT1VUUFVUICR7Q01BS0VfQklOQVJZX0RJUn0vd2Via2l0Z3RrLSR7UFJPSkVD
VF9WRVJTSU9OfS50YXIKKyAgICAgICAgREVQRU5EUyAke1RPT0xTX0RJUn0vZ3RrL21ha2UtZGlz
dC5weQorICAgICAgICBERVBFTkRTICR7VE9PTFNfRElSfS9ndGsvbWFuaWZlc3QudHh0CisgICAg
ICAgIERFUEVORFMgV2ViS2l0CisgICAgICAgIERFUEVORFMgV2ViS2l0MgorICAgICAgICBDT01N
QU5EICR7VE9PTFNfRElSfS9ndGsvbWFrZS1kaXN0LnB5CisgICAgICAgICAgICAgICAgLS1zb3Vy
Y2UtZGlyPSR7Q01BS0VfU09VUkNFX0RJUn0KKyAgICAgICAgICAgICAgICAtLWJ1aWxkLWRpcj0k
e0NNQUtFX0JJTkFSWV9ESVJ9CisgICAgICAgICAgICAgICAgLS10YXJiYWxsLXJvb3Q9L3dlYmtp
dGd0ay0ke1BST0pFQ1RfVkVSU0lPTn0KKyAgICAgICAgICAgICAgICAtbyAke0NNQUtFX0JJTkFS
WV9ESVJ9L3dlYmtpdGd0ay0ke1BST0pFQ1RfVkVSU0lPTn0udGFyCisgICAgICAgICAgICAgICAg
JHtUT09MU19ESVJ9L2d0ay9tYW5pZmVzdC50eHQKKyAgICApCisKKyAgICBhZGRfY3VzdG9tX2Nv
bW1hbmQoCisgICAgICAgIE9VVFBVVCAke0NNQUtFX0JJTkFSWV9ESVJ9L3dlYmtpdGd0ay0ke1BS
T0pFQ1RfVkVSU0lPTn0udGFyLnh6CisgICAgICAgIERFUEVORFMgJHtDTUFLRV9CSU5BUllfRElS
fS93ZWJraXRndGstJHtQUk9KRUNUX1ZFUlNJT059LnRhcgorICAgICAgICBDT01NQU5EIHh6IC1m
ICR7Q01BS0VfQklOQVJZX0RJUn0vd2Via2l0Z3RrLSR7UFJPSkVDVF9WRVJTSU9OfS50YXIKKyAg
ICApCisKKyAgICBhZGRfY3VzdG9tX3RhcmdldChkaXN0CisgICAgICAgIERFUEVORFMgJHtDTUFL
RV9CSU5BUllfRElSfS93ZWJraXRndGstJHtQUk9KRUNUX1ZFUlNJT059LnRhci54egorICAgICkK
K2VuZGlmICgpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9DTWFrZUxpc3RzLnR4dCBiL1Nv
dXJjZS9XZWJDb3JlL0NNYWtlTGlzdHMudHh0CmluZGV4IDJlZjQ3YTQwOTAzOTZhZTc4YTU2MGQy
YjkzYjExYjAyYmY4NWJiMGEuLmRmMDE0MjE5MDYzZjEzZGM1NmFlZjY3MjdjMDAzZmRlYTg1NzE1
YjUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL0NNYWtlTGlzdHMudHh0CisrKyBiL1NvdXJj
ZS9XZWJDb3JlL0NNYWtlTGlzdHMudHh0CkBAIC0zMjI5LDEzICszMjI5LDE1IEBAIGxpc3QoQVBQ
RU5EIFdlYkNvcmVfU09VUkNFUyAke0RFUklWRURfU09VUkNFU19XRUJDT1JFX0RJUn0vWE1MTlNO
YW1lcy5jcHApCiBHRU5FUkFURV9ET01fTkFNRVMoWE1MICR7V0VCQ09SRV9ESVJ9L3htbC94bWxh
dHRycy5pbikKIGxpc3QoQVBQRU5EIFdlYkNvcmVfU09VUkNFUyAke0RFUklWRURfU09VUkNFU19X
RUJDT1JFX0RJUn0vWE1MTmFtZXMuY3BwKQogCi1hZGRfY3VzdG9tX2NvbW1hbmQoCi0gICAgT1VU
UFVUICR7REVSSVZFRF9TT1VSQ0VTX1dFQkNPUkVfRElSfS9XZWJLaXRWZXJzaW9uLmgKLSAgICBN
QUlOX0RFUEVOREVOQ1kgJHtXRUJLSVRfRElSfS9zY3JpcHRzL2dlbmVyYXRlLXdlYmtpdHZlcnNp
b24ucGwKLSAgICBERVBFTkRTICR7V0VCS0lUX0RJUn0vbWFjL0NvbmZpZ3VyYXRpb25zL1ZlcnNp
b24ueGNjb25maWcKLSAgICBDT01NQU5EICR7UEVSTF9FWEVDVVRBQkxFfSAke1dFQktJVF9ESVJ9
L3NjcmlwdHMvZ2VuZXJhdGUtd2Via2l0dmVyc2lvbi5wbCAtLWNvbmZpZyAke1dFQktJVF9ESVJ9
L21hYy9Db25maWd1cmF0aW9ucy9WZXJzaW9uLnhjY29uZmlnIC0tb3V0cHV0RGlyICR7REVSSVZF
RF9TT1VSQ0VTX1dFQkNPUkVfRElSfQotICAgIFZFUkJBVElNKQotbGlzdChBUFBFTkQgV2ViQ29y
ZV9TT1VSQ0VTICR7REVSSVZFRF9TT1VSQ0VTX1dFQkNPUkVfRElSfS9XZWJLaXRWZXJzaW9uLmgp
CitpZiAoTk9UIFBPUlQgU1RSRVFVQUwgIkdUSyIpCisgICAgYWRkX2N1c3RvbV9jb21tYW5kKAor
ICAgICAgICBPVVRQVVQgJHtERVJJVkVEX1NPVVJDRVNfV0VCQ09SRV9ESVJ9L1dlYktpdFZlcnNp
b24uaAorICAgICAgICBNQUlOX0RFUEVOREVOQ1kgJHtXRUJLSVRfRElSfS9zY3JpcHRzL2dlbmVy
YXRlLXdlYmtpdHZlcnNpb24ucGwKKyAgICAgICAgREVQRU5EUyAke1dFQktJVF9ESVJ9L21hYy9D
b25maWd1cmF0aW9ucy9WZXJzaW9uLnhjY29uZmlnCisgICAgICAgIENPTU1BTkQgJHtQRVJMX0VY
RUNVVEFCTEV9ICR7V0VCS0lUX0RJUn0vc2NyaXB0cy9nZW5lcmF0ZS13ZWJraXR2ZXJzaW9uLnBs
IC0tY29uZmlnICR7V0VCS0lUX0RJUn0vbWFjL0NvbmZpZ3VyYXRpb25zL1ZlcnNpb24ueGNjb25m
aWcgLS1vdXRwdXREaXIgJHtERVJJVkVEX1NPVVJDRVNfV0VCQ09SRV9ESVJ9CisgICAgICAgIFZF
UkJBVElNKQorICAgIGxpc3QoQVBQRU5EIFdlYkNvcmVfU09VUkNFUyAke0RFUklWRURfU09VUkNF
U19XRUJDT1JFX0RJUn0vV2ViS2l0VmVyc2lvbi5oKQorZW5kaWYgKCkKIAogV0VCS0lUX1dSQVBf
U09VUkNFTElTVCgke1dlYkNvcmVfSURMX0ZJTEVTfSAke1dlYkNvcmVfU09VUkNFU30pCiBXRUJL
SVRfV1JBUF9TT1VSQ0VMSVNUKCR7V2ViQ29yZVRlc3RTdXBwb3J0X0lETF9GSUxFU30gJHtXZWJD
b3JlVGVzdFN1cHBvcnRfU09VUkNFU30pCmRpZmYgLS1naXQgYS9Ub29scy9DaGFuZ2VMb2cgYi9U
b29scy9DaGFuZ2VMb2cKaW5kZXggZDU2YWQ4NjRmMzdlOGJjNTZhNjQ0YTUwYzZmNDViNjc3MDlh
NTlhZi4uMjcyZDE0MjcwMjlkYzVhYjI1NWVlZmZlOGIzZmQyODk1MTAzZDI1YiAxMDA2NDQKLS0t
IGEvVG9vbHMvQ2hhbmdlTG9nCisrKyBiL1Rvb2xzL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE2IEBA
CisyMDE0LTAxLTA4ICBNYXJ0aW4gUm9iaW5zb24gIDxtcm9iaW5zb25AaWdhbGlhLmNvbT4KKwor
ICAgICAgICBbR1RLXSBbQ01ha2VdIEFkZCBhICJtYWtlIGRpc3QiIHRhcmdldAorICAgICAgICBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTE2Mzc4CisKKyAgICAgICAg
UmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQWRkZWQgYSBzY3JpcHQgdGhh
dCByZWFkcyBhIG1hbmlmZXN0IGZpbGUgYW4gcHJvZHVjZXMgYSB0YXJiYWxsLiBBbHNvIGFkZAor
ICAgICAgICB0aGUgbWFuaWZlc3QuCisKKyAgICAgICAgKiBndGsvbWFrZS1kaXN0LnB5OiBBZGRl
ZC4KKyAgICAgICAgKiBndGsvbWFuaWZlc3QudHh0OiBBZGRlZC4KKwogMjAxNC0wMS0yNyAgQ29t
bWl0IFF1ZXVlICA8Y29tbWl0LXF1ZXVlQHdlYmtpdC5vcmc+CiAKICAgICAgICAgVW5yZXZpZXdl
ZCwgcm9sbGluZyBvdXQgcjE2Mjg0Ni4KZGlmZiAtLWdpdCBhL1Rvb2xzL2d0ay9tYWtlLWRpc3Qu
cHkgYi9Ub29scy9ndGsvbWFrZS1kaXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjcyYmYzNjM0ZDFlOGI3YTAx
YjI0YzBmNWE2YjU1OWQyYTY1ZjA2MjcKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9ndGsvbWFr
ZS1kaXN0LnB5CkBAIC0wLDAgKzEsMjIzIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgQ29w
eXJpZ2h0IChDKSAyMDE0IElnYWxpYSBTLkwuCisjCisjIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNv
ZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVy
IHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworIyBMaWNlbnNlIGFz
IHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyMgdmVy
c2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJz
aW9uLgorIworIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBp
dCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2
ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgTGVzc2VyIEdlbmVyYWwg
UHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJl
Y2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworIyBMaWNlbnNl
IGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3
YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3Is
IEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHBy
aW50X2Z1bmN0aW9uCitmcm9tIGNvbnRleHRsaWIgaW1wb3J0IGNsb3NpbmcKKworaW1wb3J0IGFy
Z3BhcnNlCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHN5cworaW1wb3J0IHRhcmZpbGUK
KworCitkZWYgZW51bSgqKmVudW1zKToKKyAgICByZXR1cm4gdHlwZSgnRW51bScsICgpLCBlbnVt
cykKKworCitjbGFzcyBSdWxlKG9iamVjdCk6CisgICAgUmVzdWx0ID0gZW51bShJTkNMVURFPTEs
IEVYQ0xVREU9MiwgTk9fTUFUQ0g9MykKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlLCBw
YXR0ZXJuKToKKyAgICAgICAgc2VsZi50eXBlID0gdHlwZQorICAgICAgICBzZWxmLm9yaWdpbmFs
X3BhdHRlcm4gPSBwYXR0ZXJuCisgICAgICAgIHNlbGYucGF0dGVybiA9IHJlLmNvbXBpbGUocGF0
dGVybikKKworICAgIGRlZiB0ZXN0KHNlbGYsIGZpbGUpOgorICAgICAgICBpZiBub3Qoc2VsZi5w
YXR0ZXJuLnNlYXJjaChmaWxlKSk6CisgICAgICAgICAgICByZXR1cm4gUnVsZS5SZXN1bHQuTk9f
TUFUQ0gKKyAgICAgICAgcmV0dXJuIHNlbGYudHlwZQorCisKK2NsYXNzIFJ1bGVzZXQob2JqZWN0
KToKKyAgICBfZ2xvYmFsX3J1bGVzID0gTm9uZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgor
ICAgICAgICAjIEJ5IGRlZmF1bHQsIGFjY2VwdCBhbGwgZmlsZXMuCisgICAgICAgIHNlbGYucnVs
ZXMgPSBbUnVsZShSdWxlLlJlc3VsdC5JTkNMVURFLCAnLionKV0KKworICAgIEBjbGFzc21ldGhv
ZAorICAgIGRlZiBnbG9iYWxfcnVsZXMoY2xzKToKKyAgICAgICAgaWYgbm90IGNscy5fZ2xvYmFs
X3J1bGVzOgorICAgICAgICAgICAgY2xzLl9nbG9iYWxfcnVsZXMgPSBSdWxlc2V0KCkKKyAgICAg
ICAgcmV0dXJuIGNscy5fZ2xvYmFsX3J1bGVzCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYg
YWRkX2dsb2JhbF9ydWxlKGNscywgcnVsZSk6CisgICAgICAgIGNscy5nbG9iYWxfcnVsZXMoKS5h
ZGRfcnVsZShydWxlKQorCisgICAgZGVmIGFkZF9ydWxlKHNlbGYsIHJ1bGUpOgorICAgICAgICBz
ZWxmLnJ1bGVzLmFwcGVuZChydWxlKQorCisgICAgZGVmIHBhc3NlcyhzZWxmLCBmaWxlKToKKyAg
ICAgICAgYWxsb3dlZCA9IEZhbHNlCisgICAgICAgIGZvciBydWxlIGluIHNlbGYucnVsZXM6Cisg
ICAgICAgICAgICByZXN1bHQgPSBydWxlLnRlc3QoZmlsZSkKKyAgICAgICAgICAgIGlmIHJlc3Vs
dCA9PSBSdWxlLlJlc3VsdC5OT19NQVRDSDoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAg
ICAgICAgICAgYWxsb3dlZCA9IFJ1bGUuUmVzdWx0LklOQ0xVREUgPT0gcmVzdWx0CisgICAgICAg
IHJldHVybiBhbGxvd2VkCisKKworY2xhc3MgRmlsZShvYmplY3QpOgorICAgIGRlZiBfX2luaXRf
XyhzZWxmLCBzb3VyY2Vfcm9vdCwgdGFyYmFsbF9yb290KToKKyAgICAgICAgc2VsZi5zb3VyY2Vf
cm9vdCA9IHNvdXJjZV9yb290CisgICAgICAgIHNlbGYudGFyYmFsbF9yb290ID0gdGFyYmFsbF9y
b290CisKKyAgICBkZWYgZ2V0X2ZpbGVzKHNlbGYpOgorICAgICAgICB5aWVsZCAoc2VsZi5zb3Vy
Y2Vfcm9vdCwgc2VsZi50YXJiYWxsX3Jvb3QpCisKKworY2xhc3MgRGlyZWN0b3J5KG9iamVjdCk6
CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNvdXJjZV9yb290LCB0YXJiYWxsX3Jvb3QpOgorICAg
ICAgICBzZWxmLnNvdXJjZV9yb290ID0gc291cmNlX3Jvb3QKKyAgICAgICAgc2VsZi50YXJiYWxs
X3Jvb3QgPSB0YXJiYWxsX3Jvb3QKKyAgICAgICAgc2VsZi5ydWxlcyA9IFJ1bGVzZXQoKQorCisg
ICAgZGVmIGFkZF9ydWxlKHNlbGYsIHJ1bGUpOgorICAgICAgICBzZWxmLnJ1bGVzLmFkZF9ydWxl
KHJ1bGUpCisKKyAgICBkZWYgZ2V0X3RhcmJhbGxfcGF0aChzZWxmLCBmaWxlbmFtZSk6CisgICAg
ICAgIHJldHVybiBmaWxlbmFtZS5yZXBsYWNlKHNlbGYuc291cmNlX3Jvb3QsIHNlbGYudGFyYmFs
bF9yb290LCAxKQorCisgICAgZGVmIGdldF9maWxlcyhzZWxmKToKKyAgICAgICAgZm9yIHJvb3Qs
IGRpcnMsIGZpbGVzIGluIG9zLndhbGsoc2VsZi5zb3VyY2Vfcm9vdCk6CisKKyAgICAgICAgICAg
IGRlZiBwYXNzZXNfYWxsX3J1bGVzKGVudHJ5KToKKyAgICAgICAgICAgICAgICByZXR1cm4gUnVs
ZXNldC5nbG9iYWxfcnVsZXMoKS5wYXNzZXMoZW50cnkpIGFuZCBzZWxmLnJ1bGVzLnBhc3Nlcyhl
bnRyeSkKKworICAgICAgICAgICAgdG9fa2VlcCA9IGZpbHRlcihwYXNzZXNfYWxsX3J1bGVzLCBk
aXJzKQorICAgICAgICAgICAgZGVsIGRpcnNbOl0KKyAgICAgICAgICAgIGRpcnMuZXh0ZW5kKHRv
X2tlZXApCisKKyAgICAgICAgICAgIGZvciBmaWxlIGluIGZpbGVzOgorICAgICAgICAgICAgICAg
IGZpbGUgPSBvcy5wYXRoLmpvaW4ocm9vdCwgZmlsZSkKKyAgICAgICAgICAgICAgICBpZiBub3Qg
cGFzc2VzX2FsbF9ydWxlcyhmaWxlKToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAg
ICAgICAgICAgICAgICB5aWVsZCAoZmlsZSwgc2VsZi5nZXRfdGFyYmFsbF9wYXRoKGZpbGUpKQor
CisKK2NsYXNzIE1hbmlmZXN0KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hbmlm
ZXN0X2ZpbGVuYW1lLCBzb3VyY2Vfcm9vdCwgYnVpbGRfcm9vdCwgdGFyYmFsbF9yb290PScvJyk6
CisgICAgICAgIHNlbGYuY3VycmVudF9kaXJlY3RvcnkgPSBOb25lCisgICAgICAgIHNlbGYuZGly
ZWN0b3JpZXMgPSBbXQorICAgICAgICBzZWxmLnRhcmJhbGxfcm9vdCA9IHRhcmJhbGxfcm9vdAor
ICAgICAgICBzZWxmLnNvdXJjZV9yb290ID0gb3MucGF0aC5hYnNwYXRoKHNvdXJjZV9yb290KQor
ICAgICAgICBzZWxmLmJ1aWxkX3Jvb3QgPSBvcy5wYXRoLmFic3BhdGgoYnVpbGRfcm9vdCkKKwor
ICAgICAgICAjIE5vcm1hbGl6ZSB0aGUgdGFyYmFsbCByb290IHNvIHRoYXQgaXQgc3RhcnRzIGFu
ZCBlbmRzIHdpdGggYSBzbGFzaC4KKyAgICAgICAgaWYgc2VsZi50YXJiYWxsX3Jvb3RbLTFdICE9
ICcvJzoKKyAgICAgICAgICAgIHNlbGYudGFyYmFsbF9yb290ID0gc2VsZi50YXJiYWxsX3Jvb3Qg
KyAnLycKKyAgICAgICAgaWYgc2VsZi50YXJiYWxsX3Jvb3RbMF0gIT0gJy8nOgorICAgICAgICAg
ICAgc2VsZi50YXJiYWxsX3Jvb3QgPSAnLycgKyBzZWxmLnRhcmJhbGxfcm9vdAorCisgICAgICAg
IHdpdGggb3BlbihtYW5pZmVzdF9maWxlbmFtZSwgJ3InKSBhcyBmaWxlOgorICAgICAgICAgICAg
Zm9yIGxpbmUgaW4gZmlsZS5yZWFkbGluZXMoKToKKyAgICAgICAgICAgICAgICBzZWxmLnByb2Nl
c3NfbGluZShsaW5lKQorCisgICAgZGVmIGFkZF9ydWxlKHNlbGYsIHJ1bGUpOgorICAgICAgICBp
ZiBzZWxmLmN1cnJlbnRfZGlyZWN0b3J5IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5j
dXJyZW50X2RpcmVjdG9yeS5hZGRfcnVsZShydWxlKQorICAgICAgICBlbHNlOgorICAgICAgICAg
ICAgUnVsZXNldC5hZGRfZ2xvYmFsX3J1bGUocnVsZSkKKworICAgIGRlZiBhZGRfZGlyZWN0b3J5
KHNlbGYsIGRpcmVjdG9yeSk6CisgICAgICAgIHNlbGYuY3VycmVudF9kaXJlY3RvcnkgPSBkaXJl
Y3RvcnkKKyAgICAgICAgc2VsZi5kaXJlY3Rvcmllcy5hcHBlbmQoZGlyZWN0b3J5KQorCisgICAg
ZGVmIHJlc29sdmVfdmFyaWFibGVzKHNlbGYsIHN0cmluZywgc3RyaXA9RmFsc2UpOgorICAgICAg
ICBpZiBzdHJpcDoKKyAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgnJHNvdXJjZScs
ICcnKS5yZXBsYWNlKCckYnVpbGQnLCAnJykKKworICAgICAgICBzdHJpbmcgPSBzdHJpbmcucmVw
bGFjZSgnJHNvdXJjZScsIHNlbGYuc291cmNlX3Jvb3QpCisgICAgICAgIGlmIHNlbGYuYnVpbGRf
cm9vdDoKKyAgICAgICAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKCckYnVpbGQnLCBzZWxm
LmJ1aWxkX3Jvb3QpCisgICAgICAgIGVsaWYgc3RyaW5nLmZpbmQoJyRidWlsZCcpICE9IC0xOgor
ICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCdNYW5pZmVzdCBoYXMgJGJ1aWxkIGJ1dCBidWls
ZCByb290IG5vdCBnaXZlbi4nKQorICAgICAgICByZXR1cm4gc3RyaW5nCisKKyAgICBkZWYgZ2V0
X2Z1bGxfc291cmNlX3BhdGgoc2VsZiwgc291cmNlX3BhdGgpOgorICAgICAgICBmdWxsX3NvdXJj
ZV9wYXRoID0gc2VsZi5yZXNvbHZlX3ZhcmlhYmxlcyhzb3VyY2VfcGF0aCkKKyAgICAgICAgaWYg
bm90IG9zLnBhdGguZXhpc3RzKGZ1bGxfc291cmNlX3BhdGgpOgorICAgICAgICAgICAgZnVsbF9z
b3VyY2VfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLnNvdXJjZV9yb290LCBzb3VyY2VfcGF0aCkK
KyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGZ1bGxfc291cmNlX3BhdGgpOgorICAgICAg
ICAgICAgcmFpc2UgRXhjZXB0aW9uKCdDb3VsZCBub3QgZmluZCBkaXJlY3RvcnkgJXMnICUgZnVs
bF9zb3VyY2VfcGF0aCkKKyAgICAgICAgcmV0dXJuIGZ1bGxfc291cmNlX3BhdGgKKworICAgIGRl
ZiBnZXRfZnVsbF90YXJiYWxsX3BhdGgoc2VsZiwgcGF0aCk6CisgICAgICAgIHBhdGggPSBzZWxm
LnJlc29sdmVfdmFyaWFibGVzKHBhdGgsIHN0cmlwPVRydWUpCisgICAgICAgIHJldHVybiBzZWxm
LnRhcmJhbGxfcm9vdCArIHBhdGgKKworICAgIGRlZiBnZXRfc291cmNlX2FuZF90YXJiYWxsX3Bh
dGhzX2Zyb21fcGFydHMoc2VsZiwgcGFydHMpOgorICAgICAgICBmdWxsX3NvdXJjZV9wYXRoID0g
c2VsZi5nZXRfZnVsbF9zb3VyY2VfcGF0aChwYXJ0c1sxXSkKKyAgICAgICAgaWYgbGVuKHBhcnRz
KSA+IDI6CisgICAgICAgICAgICBmdWxsX3RhcmJhbGxfcGF0aCA9IHNlbGYuZ2V0X2Z1bGxfdGFy
YmFsbF9wYXRoKHBhcnRzWzJdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZnVsbF90YXJi
YWxsX3BhdGggPSBzZWxmLmdldF9mdWxsX3RhcmJhbGxfcGF0aChwYXJ0c1sxXSkKKyAgICAgICAg
cmV0dXJuIChmdWxsX3NvdXJjZV9wYXRoLCBmdWxsX3RhcmJhbGxfcGF0aCkKKworICAgIGRlZiBw
cm9jZXNzX2xpbmUoc2VsZiwgbGluZSk6CisgICAgICAgIHBhcnRzID0gbGluZS5zcGxpdCgpCisg
ICAgICAgIGlmIG5vdCBwYXJ0czoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBwYXJ0
c1swXVswXSA9PSAiIyI6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBwYXJ0c1sw
XSA9PSAiZGlyZWN0b3J5IiBhbmQgbGVuKHBhcnRzKSA+IDE6CisgICAgICAgICAgICBzZWxmLmFk
ZF9kaXJlY3RvcnkoRGlyZWN0b3J5KCpzZWxmLmdldF9zb3VyY2VfYW5kX3RhcmJhbGxfcGF0aHNf
ZnJvbV9wYXJ0cyhwYXJ0cykpKQorICAgICAgICBlbGlmIHBhcnRzWzBdID09ICJmaWxlIiBhbmQg
bGVuKHBhcnRzKSA+IDE6CisgICAgICAgICAgICBzZWxmLmFkZF9kaXJlY3RvcnkoRmlsZSgqc2Vs
Zi5nZXRfc291cmNlX2FuZF90YXJiYWxsX3BhdGhzX2Zyb21fcGFydHMocGFydHMpKSkKKyAgICAg
ICAgZWxpZiBwYXJ0c1swXSA9PSAiZXhjbHVkZSIgYW5kIGxlbihwYXJ0cykgPiAxOgorICAgICAg
ICAgICAgc2VsZi5hZGRfcnVsZShSdWxlKFJ1bGUuUmVzdWx0LkVYQ0xVREUsIHNlbGYucmVzb2x2
ZV92YXJpYWJsZXMocGFydHNbMV0pKSkKKyAgICAgICAgZWxpZiBwYXJ0c1swXSA9PSAiaW5jbHVk
ZSIgYW5kIGxlbihwYXJ0cykgPiAxOgorICAgICAgICAgICAgc2VsZi5hZGRfcnVsZShSdWxlKFJ1
bGUuUmVzdWx0LklOQ0xVREUsIHNlbGYucmVzb2x2ZV92YXJpYWJsZXMocGFydHNbMV0pKSkKKwor
ICAgIGRlZiBnZXRfZmlsZXMoc2VsZik6CisgICAgICAgIGZvciBkaXJlY3RvcnkgaW4gc2VsZi5k
aXJlY3RvcmllczoKKyAgICAgICAgICAgIGZvciBmaWxlX3R1cGxlIGluIGRpcmVjdG9yeS5nZXRf
ZmlsZXMoKToKKyAgICAgICAgICAgICAgICB5aWVsZCBmaWxlX3R1cGxlCisKKyAgICBkZWYgY3Jl
YXRlX3RhcmZpbGUoc2VsZiwgb3V0cHV0KToKKyAgICAgICAgY291bnQgPSAwCisgICAgICAgIGZv
ciBmaWxlX3R1cGxlIGluIHNlbGYuZ2V0X2ZpbGVzKCk6CisgICAgICAgICAgICBjb3VudCA9IGNv
dW50ICsgMQorCisgICAgICAgIHdpdGggY2xvc2luZyh0YXJmaWxlLm9wZW4ob3V0cHV0LCAndycp
KSBhcyB0YXJiYWxsOgorICAgICAgICAgICAgZm9yIGksIChmaWxlX3BhdGgsIHRhcmJhbGxfcGF0
aCkgaW4gZW51bWVyYXRlKHNlbGYuZ2V0X2ZpbGVzKCksIHN0YXJ0PTEpOgorICAgICAgICAgICAg
ICAgIHByaW50KCdUYXJyaW5nIGZpbGUgezB9IG9mIHsxfScuZm9ybWF0KGksIGNvdW50KS5sanVz
dCg0MCksIGVuZD0nXHInKQorICAgICAgICAgICAgICAgIHRhcmJhbGwuYWRkKGZpbGVfcGF0aCwg
dGFyYmFsbF9wYXRoKQorICAgICAgICBwcmludCgiV3JvdGUgezB9Ii5mb3JtYXQob3V0cHV0KS5s
anVzdCg0MCkpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBwYXJzZXIgPSBh
cmdwYXJzZS5Bcmd1bWVudFBhcnNlcihkZXNjcmlwdGlvbj0nQnVpbGQgYSBkaXN0cmlidXRpb24g
YnVuZGxlLicpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXMnLCAnLS1zb3VyY2UtZGlyZWN0
b3J5JywgdHlwZT1zdHIsIGRlZmF1bHQ9b3MuZ2V0Y3dkKCksCisgICAgICAgICAgICAgICAgICAg
ICAgICBoZWxwPSdUaGUgdG9wLWxldmVsIGRpcmVjdG9yeSBvZiB0aGUgc291cmNlIGRpc3RyaWJ1
dGlvbi4gJyArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEaXJlY3RvcnkgZm9y
IHJlbGF0aXZlIHBhdGhzLiBEZWZhdWx0cyB0byBjdXJyZW50IGRpcmVjdG9yeS4nKQorICAgIHBh
cnNlci5hZGRfYXJndW1lbnQoJy0tdGFyYmFsbC1yb290JywgdHlwZT1zdHIsIGRlZmF1bHQ9Jy8n
LAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nVGhlIHRvcC1sZXZlbCBwYXRoIG9mIHRo
ZSB0YXJiYWxsLiBCeSBkZWZhdWx0IGZpbGVzIGFyZSBhZGRlZCB0byB0aGUgcm9vdCBvZiB0aGUg
dGFyYmFsbC4nKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1iJywgJy0tYnVpbGQtZGlyZWN0
b3J5JywgdHlwZT1zdHIsIGRlZmF1bHQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhl
bHA9J1RoZSB0b3AtbGV2ZWwgcGF0aCBvZiBkaXJlY3Rvcnkgb2YgdGhlIGJ1aWxkIHJvb3QuICcg
KyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQnkgZGVmYXVsdCB0aGVyZSBpcyBu
byBidWlsZCByb290LicpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLW8nLCB0eXBlPXN0ciwg
ZGVmYXVsdD0nb3V0LnRhcicsIGRlc3Q9Im91dHB1dF9maWxlbmFtZSIsCisgICAgICAgICAgICAg
ICAgICAgICAgICBoZWxwPSdUaGUgdGFyZmlsZSB0byBwcm9kdWNlLiBCeSBkZWZhdWx0IHRoaXMg
aXMgIm91dC50YXIiJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCdtYW5pZmVzdF9maWxlbmFt
ZScsIG1ldGF2YXI9Im1hbmlmZXN0IiwgdHlwZT1zdHIsIGhlbHA9J1RoZSBwYXRoIHRvIHRoZSBt
YW5pZmVzdCBmaWxlLicpCisKKyAgICBhcmd1bWVudHMgPSBwYXJzZXIucGFyc2VfYXJncygpCisK
KyAgICBtYW5pZmVzdCA9IE1hbmlmZXN0KGFyZ3VtZW50cy5tYW5pZmVzdF9maWxlbmFtZSwgYXJn
dW1lbnRzLnNvdXJjZV9kaXJlY3RvcnksIGFyZ3VtZW50cy5idWlsZF9kaXJlY3RvcnksIGFyZ3Vt
ZW50cy50YXJiYWxsX3Jvb3QpCisgICAgbWFuaWZlc3QuY3JlYXRlX3RhcmZpbGUoYXJndW1lbnRz
Lm91dHB1dF9maWxlbmFtZSkKZGlmZiAtLWdpdCBhL1Rvb2xzL2d0ay9tYW5pZmVzdC50eHQgYi9U
b29scy9ndGsvbWFuaWZlc3QudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjhjNjFkZjM2MzNlMzkxMTQ5N2Q2OWYy
YzQxZmJhYjAyMWZhZDNhOTUKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9ndGsvbWFuaWZlc3Qu
dHh0CkBAIC0wLDAgKzEsNzQgQEAKKyMgR2xvYmFsIHJ1bGVzCitleGNsdWRlICMkCitleGNsdWRl
IENoYW5nZUxvZworZXhjbHVkZSBHTlVtYWtlZmlsZQorZXhjbHVkZSBNYWtlZmlsZQorZXhjbHVk
ZSB0YWdzJAorZXhjbHVkZSB+JAorZXhjbHVkZSBcLiMkCitleGNsdWRlIFwuYmFrJAorZXhjbHVk
ZSBcLmNwcm9qZWN0JAorZXhjbHVkZSBcLmdpdCQKK2V4Y2x1ZGUgXC5naXRhdHRyaWJ1dGVzJAor
ZXhjbHVkZSBcLmdpdGlnbm9yZSQKK2V4Y2x1ZGUgXC5neXAkCitleGNsdWRlIFwuaWNucyQKK2V4
Y2x1ZGUgXC5scHJvaiQKK2V4Y2x1ZGUgXC5uaWIkCitleGNsdWRlIFwubyQKK2V4Y2x1ZGUgXC5v
cmRlciQKK2V4Y2x1ZGUgXC5wZGYkCitleGNsdWRlIFwucGxpc3QkCitleGx1Y2RlIFwucHJvXC51
c2VyJAorZXhjbHVkZSBcLnByb2plY3QkCitleGNsdWRlIFwucHJvcHMkCitleGNsdWRlIFwucHlj
JAorZXhjbHVkZSBcLnB5byQKK2V4Y2x1ZGUgXC5zZXR0aW5ncyQKK2V4Y2x1ZGUgXC5zdm4kCitl
eGNsdWRlIFwuc3dbYS1wXSQKK2V4Y2x1ZGUgXC52Y3hwcm9qJAorZXhjbHVkZSBcLnhjY29uZmln
JAorZXhjbHVkZSBcLnhjb2RlcHJvaiQKKworZGlyZWN0b3J5IFNvdXJjZQorZXhjbHVkZSBTb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9yZXNvdXJjZXMvSVJDX0NvbXBvc2l0ZV8uKlwud2F2
JAorZXhjbHVkZSBTb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL3Rlc3QKK2V4Y2x1ZGUg
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZWZsL0RlZmF1bHRUaGVtZQorZXhjbHVkZSBTb3VyY2Uv
YXV0b3Rvb2xzJAorCisjIE1vc3Qgb2YgdGhlIGZpbGVzIGluIFNvdXJjZS9XZWJLaXQgYXJlIG5v
dCBuZWNlc3NhcnkgdG8gYnVpbGQgR1RLKyBhbmQKKyMgdGhlIGRpcmVjdG9yeSBpbmNsdWRlcyBs
b3RzIG9mIGltYWdlcywgc28gd2UncmUgYSBiaXQgbW9yZSBwaWNreSBoZXJlLgorZXhjbHVkZSBT
b3VyY2UvV2ViS2l0Ly4qCitpbmNsdWRlIFNvdXJjZS9XZWJLaXQvQ01ha2VMaXN0cy50eHQKK2lu
Y2x1ZGUgU291cmNlL1dlYktpdC9QbGF0Zm9ybUdUSy5jbWFrZQoraW5jbHVkZSBTb3VyY2UvV2Vi
S2l0L2d0aworZXhjbHVkZSBTb3VyY2UvV2ViS2l0L2d0ay9ORVdTJAorCisjIFdlIGRvIHdhbnQg
dG8gaW5jbHVkZSB0aGUgTkVXUywgYnV0IHdlIHdhbnQgaXQgdG8gYmUgaW4gdGhlIHJvb3Qgb2Yg
dGhlIGFyY2hpdmUuCitmaWxlIFNvdXJjZS9XZWJLaXQvZ3RrL05FV1MgTkVXUworCitkaXJlY3Rv
cnkgVG9vbHMvZ3RrCitkaXJlY3RvcnkgVG9vbHMvR3RrTGF1bmNoZXIKK2RpcmVjdG9yeSBUb29s
cy9JbWFnZURpZmYKK2RpcmVjdG9yeSBUb29scy9NaW5pQnJvd3NlcgorZGlyZWN0b3J5IFRvb2xz
L1Rlc3RXZWJLaXRBUEkKKworZGlyZWN0b3J5IFRvb2xzL0R1bXBSZW5kZXJUcmVlCitleGNsdWRl
IFRvb2xzL0R1bXBSZW5kZXJUcmVlL2ZvbnRzCisKK2RpcmVjdG9yeSBUb29scy9XZWJLaXRUZXN0
UnVubmVyCitleGNsdWRlIFRvb2xzL1dlYktpdFRlc3RSdW5uZXIvZm9udHMvCisKK2ZpbGUgQ01h
a2VMaXN0cy50eHQKK2ZpbGUgVG9vbHMvQ01ha2VMaXN0cy50eHQKK2ZpbGUgVG9vbHMvU2NyaXB0
cy9WQ1NVdGlscy5wbQorZmlsZSBUb29scy9TY3JpcHRzL3J1bi1ndGstdGVzdHMKK2ZpbGUgVG9v
bHMvU2NyaXB0cy93ZWJraXQtYnVpbGQtZGlyZWN0b3J5CitmaWxlIFRvb2xzL1NjcmlwdHMvd2Vi
a2l0ZGlycy5wbQorZmlsZSBUb29scy9qaGJ1aWxkL2poYnVpbGR1dGlscy5weQorCitkaXJlY3Rv
cnkgJGJ1aWxkL0RvY3VtZW50YXRpb24vd2Via2l0Mmd0ay9odG1sIERvY3VtZW50YXRpb24vd2Vi
a2l0Mmd0ay9odG1sCitkaXJlY3RvcnkgJGJ1aWxkL0RvY3VtZW50YXRpb24vd2Via2l0Mmd0ay9o
dG1sIERvY3VtZW50YXRpb24vd2Via2l0Mmd0ay9odG1sCitkaXJlY3RvcnkgJGJ1aWxkL0RvY3Vt
ZW50YXRpb24vd2Via2l0Z3RrL3RtcGwgRG9jdW1lbnRhdGlvbi93ZWJraXRndGsvdG1wbAorZGly
ZWN0b3J5ICRidWlsZC9Eb2N1bWVudGF0aW9uL3dlYmtpdGd0ay90bXBsIERvY3VtZW50YXRpb24v
d2Via2l0Z3RrL3RtcGwKZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwppbmRleCA4
OTk3ZjRkZDA2NjA5ZGJlMmMwZTgyMDU2MDY5YTc3MTFlZGZjYjQ5Li40MGExZTRkNWY5ZmMyZGUw
ZjhlY2Y5ZTRmMzk4NzI1NDM4Y2EyYTM4IDEwMDY0NAotLS0gYS9DaGFuZ2VMb2cKKysrIGIvQ2hh
bmdlTG9nCkBAIC0xLDMgKzEsMTMgQEAKKzIwMTQtMDEtMDggIE1hcnRpbiBSb2JpbnNvbiAgPG1y
b2JpbnNvbkBpZ2FsaWEuY29tPgorCisgICAgICAgIFtHVEtdIFtDTWFrZV0gQWRkIGEgIm1ha2Ug
ZGlzdCIgdGFyZ2V0CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD0xMTYzNzgKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAg
ICAgICAqIFNvdXJjZS9QbGF0Zm9ybUdUSy5jbWFrZTogQSBDTWFrZSBzdXBwb3J0IGZvciBleGVj
dXRpbmcgdGhlIG1ha2UtZGlzdAorICAgICAgICBzY3JpcHQgYW5kIHRoZW4gdHVybmluZyB0aGUg
dGFyZmlsZSBpbnRvIGEgTFpNQSBjb21wcmVzc2VkIGZpbGUuCisKIDIwMTQtMDEtMjUgIERhcmlu
IEFkbGVyICA8ZGFyaW5AYXBwbGUuY29tPgogCiAgICAgICAgIEdldCByaWQgb2YgSUNVX1VOSUNP
REUgYW5kIFdDSEFSX1VOSUNPREUgcmVtbmFudHMK
</data>

          </attachment>
      

    </bug>

</bugzilla>