From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 83802 invoked by alias); 29 Apr 2016 14:36:39 -0000 Mailing-List: contact libabigail-help@sourceware.org; run by ezmlm Precedence: bulk List-Post: List-Help: List-Subscribe: Sender: libabigail-owner@sourceware.org Received: (qmail 83770 invoked by uid 89); 29 Apr 2016 14:36:38 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Checked: by ClamAV 0.99.1 on sourceware.org X-Virus-Found: No X-Spam-SWARE-Status: No, score=0.9 required=5.0 tests=BAYES_50,FREEMAIL_FROM,FREEMAIL_REPLYTO,KAM_ASCII_DIVIDERS,RCVD_IN_DNSWL_LOW,RP_MATCHES_RCVD,SPF_PASS autolearn=no version=3.3.2 spammy=abilities, Due, 1111, @file X-Spam-Status: No, score=0.9 required=5.0 tests=BAYES_50,FREEMAIL_FROM,FREEMAIL_REPLYTO,KAM_ASCII_DIVIDERS,RCVD_IN_DNSWL_LOW,RP_MATCHES_RCVD,SPF_PASS autolearn=no version=3.3.2 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on sourceware.org X-Spam-Level: X-HELO: nm48-vm10.bullet.mail.gq1.yahoo.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1461940584; bh=71/GqC3urEkMh5pD2JbiIm2iHykR9g9LzYI/wpYg0Y8=; h=Date:From:Reply-To:To:Cc:In-Reply-To:References:Subject:From:Subject; b=AXNPSsTj/3JVBHJilBrUVomwdLmmBQegDQBgKE8zMSFNy17L6Tnpyubav7gJpmYhOFYtN/NG5TpEOMtEym1bAZZD3FHgSAodsjFWs2ZsxlBipXC/NuhHgfWXsG1Ok4hHICZmpVzwFsvdwF7t69HlbvO5XObd890ODSuwcM7fjiozNMvkFJpsh3vfSrho3+QYZOYlegWKeTfZ3lc6DM+SxqqDlWV3fGOrtx2Cgujbdx8rHZKt6VGg8foKsROpFaKF91BiI+0ijhquL7iy6Cq19te7/RIC9ZfkDNq4q3SqmouFuTJSjz78jF5QTVUONYO+ZPplWa8sALH/vmQ8RF6lkA== X-Yahoo-Newman-Property: ymail-4 X-Yahoo-Newman-Id: 351414.56731.bm@omp1027.mail.sg3.yahoo.com X-YMail-OSG: vApZHisVRDuGoI_hTXoNYQz86gZzza9Je9xI7s9LAU4- Date: Fri, 01 Jan 2016 00:00:00 -0000 From: Chenxiong Qi Reply-To: Chenxiong Qi To: Dodji Seketeli , Chenxiong Qi Cc: "libabigail@sourceware.org" Message-ID: <1620325890.3371217.1461940400376.JavaMail.yahoo@mail.yahoo.com> In-Reply-To: <868u0yzz89.fsf@seketeli.org> References: <868u0yzz89.fsf@seketeli.org> Subject: Re: a new tool fedabipkgdiff MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_3371216_270419124.1461940400376" X-SW-Source: 2016-q2/txt/msg00022.txt.bz2 ------=_Part_3371216_270419124.1461940400376 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Content-length: 25242 > On Thursday, March 31, 2016 7:03 PM, Dodji Seketeli wrote: > > Hello Chenxiong, > > Sorry for my being late to review this. It just felt through the cracks > while I was looking as something else. Oh well. > > So I reviewed it and I must say this is good stuff :-) > > I looked at it in details and the comments I have now are mostly about > documentations and the like. > > Please find my comments below. > >> * autoconf-archive/ax_compare_version.m4: New file copied from the > > Each of these lines should start with a 'tab' character (you know, the > \t character), as specified in the file COMMIT-LOG-GUIDELINES: > > The subsequent lines should have the form of the Body of a GNU ChangeLog > entry, i.e: > > * file1.c (func1): Changed foo in this function. > (func2): Changed blah in that function > * file2.c (func_foo): Changed something here. > > Note that before the '*', there is a tab that is 8 spaces long. > Also > note that right after the '*', there is a space. > > To ease the task, I have edited your ChangeLog. Here is the result, > that you can add to your patch: > > * autoconf-archive/ax_compare_version.m4: New file copied from the > autoconf-archive project. > * autoconf-archive/ax_prog_python_version.m4: Likewise. > * autoconf-archive/ax_python_module.m4: Likewise. > * Makefile.am: Add the new files above to the source distribution. > * configure.ac: Include the new m4 macros from the autoconf > archive. Add a new --enable-fedabipkgdiff option. Update the > report at the end of the configure process to show the status of > the fedabipkgdiff feature. Add check for prerequisite python > modules itertools, shutil, unittest and mock. These are necessary > for the unit test of fedabipkgdiff. Generate > tests/runtestfedabipkgdiff.py into the build directory, from the > tests/runtestfedabipkgdiff.py.in input file. > * tools/Makefile.am: Include the fedabipkgdiff to the source > distribution and install it if the "fedabipkgdiff" feature is > enabled. > * tests/Makefile.am: Rename runtestfedabipkgdiff.sh into > runtestfedabipkgdiff.py. Add the new runtestfedabipkgdiff.py.in > autoconf template file in here. > * tests/runtestfedabipkgdiff.py.in: New unit test file. > * tools/fedabipkgdiff: New tool fedabipkgdiff. > [...] > >> diff --git a/tests/runtestfedabipkgdiff.py.in > b/tests/runtestfedabipkgdiff.py.in >> new file mode 100755 >> index 0000000..3087212 >> --- /dev/null >> +++ b/tests/runtestfedabipkgdiff.py.in >> @@ -0,0 +1,450 @@ >> +#!/usr/bin/python >> +# -*- coding: utf-8 -*- >> +# -*- Mode: Python >> +# >> +# This file is part of the GNU Application Binary Interface Generic >> +# Analysis and Instrumentation Library. This program is free >> +# software; you can redistribute it and/or modify it under the terms >> +# of the GNU General Public License as published by the Free Software >> +# Foundation; either version 3, or (at your option) any later version. >> +# >> +# This program is distributed in the hope that it will be useful, but >> +# WITHOUT ANY WARRANTY; without even the implied warranty of >> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU >> +# General Lesser Public License for more details. >> +# >> +# You should have received a copy of the GNU Lesser General Public >> +# License along with this program; see the file COPYING-LGPLV3. If >> +# not, see . > > This is a program, not a library. In the project, by default, > programs are GPL. It's only the library that is LGPL. So if this is > an oversight, I guess we should fix it and change this license to GPL. > >> +# >> +# Author: Chenxiong Qi >> + >> +import os >> +import itertools >> +import shutil >> +import unittest >> + >> +import koji > > In general, I find that this file lacks comments. There should be a > general comment at the beginning of the file that introduces the kind > of tests that are performed here. For instance, > tests/test-diff-pkg.cc has: > > /// @file > /// > /// This test harness program computes the ABI changes between ELF > /// binaries present inside input packages. Some of the input > /// packages have debuginfo, some don't. The resulting ABI change > /// report is then compared with a reference one. > /// > /// The set of input files and reference reports to consider should be > /// present in the source distribution, which means they must be > /// referenced in tests/data/Makefile.am by the EXTRA_DIST variable. > > And if you look into that file, there are various other comments that > describe how the test is organized etc. I think we should try and do > the same for all the tests that we add. > > For instance: > > [...] > >> +counter = itertools.count(0) > > What is this global variable for? We should have a comment for this. > > >> +class UtilsTest(unittest.TestCase): > > We should have an introductory comment for this, I believe. > >> + >> + def test_is_fedora_distro(self): > > Same for this test. What is the philosophy behind this? What is the > kind of "distro strings" we want to accept? etc. > >> + distro = 'fc5' >> + self.assertTrue(fedabipkgdiff_mod.is_distro_valid(distro)) >> + >> + distro = 'f5' >> + self.assertFalse(fedabipkgdiff_mod.is_distro_valid(distro)) >> + >> + distro = 'fc23' >> + self.assertTrue(fedabipkgdiff_mod.is_distro_valid(distro)) >> + >> + distro = 'fc' >> + self.assertFalse(fedabipkgdiff_mod.is_distro_valid(distro)) >> + >> + distro = 'fc234' >> + self.assertFalse(fedabipkgdiff_mod.is_distro_valid(distro)) >> + >> + distro = 'el7' >> + self.assertTrue(fedabipkgdiff_mod.is_distro_valid(distro)) >> + >> + distro = 'el7_2' >> + self.assertFalse(fedabipkgdiff_mod.is_distro_valid(distro)) >> + >> + >> +class RPMTest(unittest.TestCase): >> + """Test case for RPM class""" > > For instance, I would have expected this comment to say something > introductory about the tests performed on the fedabipkgdiff.RPM > class. > >> + >> + def setUp(self): > > Here, I would have expected a comment about what this > debuginfo_rpm_info data member is, saying that it must be the same > type as the parameter type expected by the constructor of the > fedabipkgdiff.RPM class. So if that constructor's parameter type > changes, this test must be updated. Something like that. > >> + self.debuginfo_rpm_info = { >> + 'arch': 'i686', >> + 'name': 'httpd-debuginfo', >> + 'release': '1.fc22', >> + 'version': '2.4.18' >> + } > > Likewise. > >> + self.rpm_info = { >> + 'arch': 'x86_64', >> + 'name': 'httpd', >> + 'release': '1.fc22', >> + 'version': '2.4.18' >> + } >> + >> + def test_attribute_access(self): > > Please add a comment saying what this test does. At least its > intent. For instance: > > This test enforces the exported interface of the fedabipkgdiff.RPM > class. If a new data member is added to that type, removed or > changed in that class, please update this test accordingly. > > Maybe repeat here that the data members of the RPM class are the same > as the data members of the poorly documented return type of the koji > getRPM request, and so whenever that return type changes, we need to > update this test. You know, something like that. Otherwise, there is > too much implicit knowledge here, and this makes maintenance painful > for anyone would would have to take over tomorrow. And this is > especially true for a program in python where types are so loosely > defined and thus where type mis-matches won't be caught until the > program's runtime. > > etc. > >> + rpm = fedabipkgdiff_mod.RPM(self.debuginfo_rpm_info) >> + self.assertEquals(self.debuginfo_rpm_info['arch'], > rpm.arch) >> + self.assertEquals(self.debuginfo_rpm_info['name'], > rpm.name) >> + self.assertEquals(self.debuginfo_rpm_info['release'], > rpm.release) >> + self.assertEquals(self.debuginfo_rpm_info['version'], > rpm.version) > > [...] > > I think all test cases should be documented similarly. And also, all > the classes that are helper classes for the tests should be > documented. > > >> --- /dev/null >> +++ b/tools/fedabipkgdiff >> @@ -0,0 +1,805 @@ >> +#!/usr/bin/env python >> +# -*- coding: utf-8 -*- >> +# -*- Mode: Python >> +# >> +# This file is part of the GNU Application Binary Interface Generic >> +# Analysis and Instrumentation Library. This program is free >> +# software; you can redistribute it and/or modify it under the terms >> +# of the GNU General Public License as published by the Free Software >> +# Foundation; either version 3, or (at your option) any later version. >> +# >> +# This program is distributed in the hope that it will be useful, but >> +# WITHOUT ANY WARRANTY; without even the implied warranty of >> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU >> +# General Lesser Public License for more details. >> +# >> +# You should have received a copy of the GNU Lesser General Public >> +# License along with this program; see the file COPYING-LGPLV3. If >> +# not, see . > > Likewise, I believe this should be GPL. > >> +# >> +# Author: Chenxiong Qi >> + > > Please add an introductory comment here, explaining the intend of the > tool. Just like what is done for in tools/abidw.cc: > > /// @file > /// > /// This program reads an elf file, try to load its debug info (in > /// DWARF format) and emit it back in a set of "text sections" in > native > /// libabigail XML format. > > > [...] > > Generally speaking, I would like to see all the function parameter > *types* and return values to be documented. > > [...] > >> +def log_call(func): >> + def proxy(*args, **kwargs): > > Please add a comment that says that this is a decorator. And please > tell what we expect *args and **kwargs to be. (the arguments of func, > as well as the key word arguments, if any). > > [...] > > >> +class RPM(object): >> + """Represeting a RPM""" >> + >> + def __init__(self, data): >> + """Initialize a RPM object >> + >> + :param dict data: a dict representing a RPM information got from > koji >> + API, either listRPMs or getRPM > > What are the keys and values expected in that dict? Granted the koji > API is so "lightly" documented, it doesn't really help. But I > think > we could write an example of the dict keys/values that *we* expect > here, to ease maintenance. > > Also, you could say something about the fact that the set of data > members expected by this class is enforced in the unit test case > > [...] > >> + @property >> + def nvra(self): >> + return '%(name)s-%(version)s-%(release)s.%(arch)s' % > self.data >> + >> + @property >> + def filename(self): >> + return '{0}.rpm'.format(self.nvra) >> + >> + @property >> + def is_debuginfo(self): >> + """Check if a RPM is a debuginfo""" > > I would have said: > > "Check if the name of the current RPM denotes a debug info > package" > >> + return koji.is_debuginfo(self.data['name']) >> + >> + @property >> + def download_url(self): >> + """Get the URL from where to download from > koji""" >> + build = session.getBuild(self.build_id) >> + return os.path.join(pathinfo.build(build), > pathinfo.rpm(self.data)) >> + >> + @property >> + def downloaded_file(self): >> + """Get a pridictable downloaded file name with > absolute path""" >> + # arch should be removed from the result returned from > PathInfo.rpm >> + filename = os.path.basename(pathinfo.rpm(self.data)) >> + return os.path.join(get_download_dir(), filename) >> + >> + @property >> + def is_downloaded(self): > > Please add a comment here. > >> + return os.path.exists(self.downloaded_file) >> + >> + >> +class LocalRPM(RPM): >> + """Representing a local RPM >> + >> + Local RPM means the one that could be already downloaded or built from >> + where I can find it >> + """ >> + >> + def __init__(self, filename): > > Please add a comment here. What is the type of the "filename" > parameter etc... > >> + self.local_filename = filename >> + self.data = koji.parse_NVRA(os.path.basename(filename)) >> + >> + @property >> + def downloaded_file(self): > > Comments. > >> + >> +class Brew(object): >> + """Proxy to kojihub XMLRPC with additional extensions > to fedabipkgdiff >> + >> + kojihub XMLRPC APIs are well-documented in koji's source code. For > more >> + details information, please refer to class RootExports within > kojihub.py. >> + """ > > Please add an html link to the koji source code where the XMLRPC APIs > are documented. > >> + >> + def __init__(self, baseurl): >> + """Initialize Brew that is a proxy to > koji.ClientSession""" >> + self.session = koji.ClientSession(baseurl) >> + >> + @log_call >> + def listRPMs(self, selector=None, **kwargs): >> + """Proxy to kojihub.listRPMs >> + >> + :param selector: to adjust if a RPM should be selected >> + :type selector: a callable object >> + :param kwargs: keyword parameters accepted by kojihub.listRPMs > > Here if you could give examples of the keywords (and their arguments) > that we'd pass, it would be good. I know the reader can always go dig > into kojihub.listRPMs, but examples would help. I think redundancy is > good here. > >> + :type kwargs: dict >> + :return: a list of RPMs, each of them is a dict object > > Again, an example of the dict object that we expect would be good. > >> + :rtype: list >> + """ >> + if selector: >> + assert hasattr(selector, '__call__'), 'selector > should be callable' >> + rpms = self.session.listRPMs(**kwargs) >> + if selector: >> + rpms = [rpm for rpm in rpms if selector(rpm)] >> + return rpms >> + >> + @log_call >> + def getRPM(self, *args, **kwargs): > > Comments. > >> + rpm = self.session.getRPM(*args, **kwargs) >> + if rpm is None: >> + raise RpmNotFound('Cannot find RPM > {0}'.format(args[0])) >> + return rpm >> + >> + @log_call >> + def listBuilds(self, topone=None, selector=None, order_by=None, >> + reverse=None, **kwargs): >> + """Proxy to kojihub.listBuilds to list completed > builds > > Please document here (yeah I know it's redundant) the parameters that > kojihub.listBuilds expects. > >> + >> + Suport additional two keyword parameters: >> + >> + :param bool topone: whether to return the top first one >> + :param selector: a callable object used to select specific subset > of >> + builds >> + :type selector: callable object >> + :param str order_by: the attribute name by which to order the > builds, >> + for example, name, version, or nvr. >> + :param bool reverse: whether to order builds reversely >> + :param dict kwargs: keyword parameters accepted by > kojihub.listBuilds >> + :return: a list of builds, even if just return only one build >> + :rtype: list >> + """ >> + if 'state' not in kwargs: >> + kwargs['state'] = > koji.BUILD_STATES['COMPLETE'] >> + >> + if selector is not None and not hasattr(selector, > '__call__'): >> + raise TypeError( >> + '{0} is not a callable > object.'.format(str(selector))) >> + >> + if order_by is not None and not isinstance(order_by, basestring): >> + raise TypeError('order_by {0} is > invalid.'.format(order_by)) >> + >> + builds = self.session.listBuilds(**kwargs) >> + if selector is not None: >> + builds = [build for build in builds if selector(build)] >> + if order_by is not None: >> + # FIXME: is it possible to sort builds by using opts parameter > of >> + # listBuilds >> + builds = sorted(builds, >> + key=lambda item: item[order_by], >> + reverse=reverse) >> + if topone: >> + builds = builds[0:1] >> + >> + return builds >> + >> + @log_call >> + def getPackage(self, name): >> + """Proxy to kojihub.getPackage >> + >> + :param str name: package name > > Please give example of the package name that we expect, so that a user > of this function has an idea of the correct form expected. > >> + :return: a dict object representing a package >> + :rtype: dict >> + """ >> + package = self.session.getPackage(name) >> + if package is None: >> + package = self.session.getPackage(name.rsplit('-', > 1)[0]) >> + if package is None: >> + raise KojiPackageNotFound( >> + 'Cannot find package {0}.'.format(name)) >> + return package >> + >> + @log_call >> + def getBuild(self, *args, **kwargs): >> + """Proxy to kojihub.getBuild""" > > Please describe the (keyword) arguments expected. > >> + return self.session.getBuild(*args, **kwargs) >> + > >> + @log_call >> + def get_rpm_build_id(self, name, version, release, arch=None): >> + """Get build ID that contains a rpm with specific > nvra >> + >> + If arch is omitted, a rpm can be identified easily by its N-V-R-A. >> + >> + If arch is omitted, name is used to get associated package, and > then >> + to get the build. >> + >> + :param str name: name of a rpm >> + :param str version: version of a rpm >> + :param str release: release of a rpm > > I think that here, example of what you expect as release (at least) > would be interesting. > > [...] > >> + >> + @log_call >> + def get_package_latest_build(self, package_name, distro): >> + """Get latest build from a package >> + >> + :param str package_name: from which package to get the latest > build >> + :param str distro: which distro the latest build belongs to > > The form of what is expected as distro would be important too. That > would help to maintain the test suite. > > [...] > > +@log_call > +def get_session(): > > Comments. > > + return Brew(global_config.koji_server) > > [...] > > +def get_download_dir(): > + """Return the directory holding all downloaded > rpms""" > + download_dir = os.path.join(HOME_DIR, 'downloads') > > I would use the standard $XDG_CACHE_HOME place, to store the > downloaded packages: > https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html. > That is, ~/.local/fedabipkgdiff. > > I could also use a fedabipkgdiff --clean-cache option to clean the > cache cache, but we can add that this later, after the patch is in. > > + if not os.path.exists(download_dir): > + os.makedirs(download_dir) > + return download_dir > + > >> +@log_call >> +def abipkgdiff(pkg_info1, pkg_info2): >> + """Run abipkgdiff against found two RPM > packages""" > > Please document the expected types of the parameters here. > > + print 'ABI check on {0} and > {1}'.format(pkg_info1.package.filename, > + pkg_info2.package.filename) > > Please, rather print: > > 'Comparing the ABI of binaries between {0} and {1}:' > > [...] > >> +def magic_construct(rpms): >> + """Construct RPMs into a magic structure >> + >> + Convert list of >> + >> + foo-1.0-1.fc22.i686 >> + foo-debuginfo-1.0-1.fc22.i686 >> + foo-devel-1.0-1.fc22.i686 >> + >> + to list of >> + >> + (foo-1.0-1.fc22.i686, foo-debuginfo-1.0-1.fc22.i686) >> + (foo-devel-1.0-1.fc22.i686, foo-debuginfo-1.0-1.fc22.i686) >> + """ >> + debuginfo = None >> + packages = [] >> + for rpm in rpms: >> + if rpm.is_debuginfo: >> + debuginfo = rpm >> + else: >> + packages.append(rpm) >> + return [PkgInfo(package, debuginfo) for package in packages] >> + >> + >> +@log_call >> +def run_abipkgdiff(pkg1_infos, pkg2_infos): >> + """Run abipkgdiff >> + >> + If one of the executions finds ABI differences, the return code is the >> + return code from abipkgdiff. >> + >> + :param dict pkg1_infos: a dict mapping from arch to list of rpms, that > is >> + returned from method make_rpms_usable_for_abipkgdiff > > Rather than refer to what make_rpms_usable_for_abipkgdiff returns, > please redundantly describe the dict here, giving a real example, so > that a user willing to use this function can see what she should feed > it with. > > [...] > >> +@log_call >> +def diff_local_rpm_with_latest_rpm_from_koji(): >> + """Diff against local rpm and remove latest rpm >> + >> + This operation handles a local rpm and debuginfo rpm and remote ones >> + located in remote Koji server, that has specific distro specificed by >> + argument --from. >> + >> + 1/ Suppose the packager has just locally built a package named >> + foo-3.0.fc24.rpm. To compare the ABI of this locally build package > with the >> + latest stable package from Fedora 23, one would do: >> + >> + fedabipkgdiff --from f23 ./foo-3.0.fc24.rpm >> + """ > > Great comment, thanks. > > [...] > > >> +@log_call >> +def make_rpms_usable_for_abipkgdiff(rpms): >> + """ >> + Construct result that contains mappings from arch to download url and >> + downloaded rpm filename of rpm and debuginfo rpm >> + >> + :return: a mapping from an arch to a list of rpms > > Please give an example of this dict. > > [...] > > >> +@log_call >> +def diff_rpms_with_nvra(name, version, release, arch=None, >> + all_subpackages=None): > > Comments. > >> + build_id = session.get_rpm_build_id(name, version, release, arch) >> + rpms = session.select_rpms_from_a_build(build_id, name, arches=arch, >> + > select_subpackages=all_subpackages) >> + return make_rpms_usable_for_abipkgdiff(rpms) >> + > > Also, I wouldn't call this function "diff_rpms_with_nvra", because > the > function doesn't perform any diffing, does it? Rather, my > understanding is that it constructs the two sets of package > descriptors that would be passed to abipkgdiff. > > >> +@log_call >> +def diff_two_nvras_from_koji(): >> + """Diff two nvras from koji >> + >> + The arch probably omits, that means febabipkgdiff will diff all > arches. If > > I would say "the arch is probably omitted ..." > > [...] > > +def main(): > > [...] > > > + else: > + print >>sys.stderr, 'Unknown arguments. Please refer to > -h.' > + returncode = 1 > > Please, refer to --help, rather -h just like what is done in the other > libabigail tools. > > + > + return returncode > > All in all, I am wondering if we shouldn't add some progress > indication to the user, just like what "dnf" does. You know, saying > things like "we are downloading this package etc, and now we are > comparing these packages, etc." Otherwise, the time taken can seem > quite long. But we can add this later, after the patch has been > committed, I guess. Maybe, a simple way is to use --verbose option to print such information next step. > > Also, we should arrange for the downloads to happen in parallel, > somehow. Again, this can happen after the patch is in. Haha, I know what you mean. Yeah, it's worth to do this. > > Now, the other big thing missing from this patch is a manual. > > That is really important. Every single libabigail tool has a > documentation in docs/manuals. Documentation is in the restructured > text format, and we use python-sphinx to generate html, man and info > variants for it. The manual should also say where the packages are > downloaded. > > If you don't feel like adding a manual for this tool, please tell me, > I'll help. > > I love this patch very much! Thank you for your hard work on this. > This is simply awesome. I cannot wait for it to get in :-) > > Cheers, > > -- > Dodji > This time, the patch is updated - more documentation inside fedabipkgdiff and runtestfedabipkgdiff.py.in - using curl instead of wget to download packages from Koji - a new manual (with Dodji's help, man page can be generated from this manual by sphnix) - rebased, on latest commit fa5a5acbbcb1e Hello, Mr. Dodji, please review. Thanks. Regards, Chenxiong Qi ------=_Part_3371216_270419124.1461940400376 Content-Type: text/x-patch Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=0001-new-tool-of-fedabipkgdiff.patch Content-ID: Content-length: 119239 RnJvbSBhZTVjMmM2NzA0Yzc2NDk0NmU3ZGNhNzQ4YTIwZWRhMzc4ZTE1ZjU2 IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBDaGVueGlvbmcgUWkg PGNxaUByZWRoYXQuY29tPgpEYXRlOiBUdWUsIDkgRmViIDIwMTYgMTg6MDU6 MzMgKzA4MDAKU3ViamVjdDogW1BBVENIXSBuZXcgdG9vbCBvZiBmZWRhYmlw a2dkaWZmCgpmZWRhYmlwa2dkaWZmIGlzIGEgY29udmVuaWVudCB3YXkgZm9y IEZlZG9yYSBwYWNrYWdlcnMgdG8gaW5zcGVjdCBBQkkKY29tcGF0aWJpbGl0 eSBpc3N1ZXMgcXVpY2tseS4KCkN1cnJlbnRseSB3aXRoIHRoZSBmaXJzdCB2 ZXJzaW9uIG9mIGZlZGFiaXBrZ2RpZmYsIHlvdSBjYW4gaW52b2tlIGl0IGlu CmZvbGxvd2luZyB3YXlzLgoKZmVkYWJpcGtnZGlmZiAtLWZyb20gZmMyMyBm b28tMC4xLTEuZmMyMy54ODZfNjQucnBtCmZlZGFiaXBrZ2RpZmYgLS1mcm9t IGZjMjMgLS10byBmYzI0IGZvbwpmZWRhYmlwa2dkaWZmIGZvby0wLjEtMS5m YzIzIGZvby0wLjEtMS5mYzI0CmZlZGFiaXBrZ2RpZmYgZm9vLTAuMS0xLmZj MjMuaTY4NiBmb28tMC4xLTEuZmMyNC5pNjg2CmZlZGFiaXBrZ2RpZmYgLS1h bGwtc3VicGFja2FnZXMgZm9vLTAuMS0xLmZjMjMgZm9vLTAuMS0xLmZjMjQK CgkqIGF1dG9jb25mLWFyY2hpdmUvYXhfY29tcGFyZV92ZXJzaW9uLm00OiBO ZXcgZmlsZSBjb3BpZWQgZnJvbSB0aGUKCWF1dG9jb25mLWFyY2hpdmUgcHJv amVjdC4KCSogYXV0b2NvbmYtYXJjaGl2ZS9heF9wcm9nX3B5dGhvbl92ZXJz aW9uLm00OiBMaWtld2lzZS4KCSogYXV0b2NvbmYtYXJjaGl2ZS9heF9weXRo b25fbW9kdWxlLm00OiBMaWtld2lzZS4KCSogTWFrZWZpbGUuYW06IEFkZCB0 aGUgbmV3IGZpbGVzIGFib3ZlIHRvIHRoZSBzb3VyY2UgZGlzdHJpYnV0aW9u LgoJKiBjb25maWd1cmUuYWM6IEluY2x1ZGUgdGhlIG5ldyBtNCBtYWNyb3Mg ZnJvbSB0aGUgYXV0b2NvbmYKCWFyY2hpdmUuIEFkZCBhIG5ldyAtLWVuYWJs ZS1mZWRhYmlwa2dkaWZmIG9wdGlvbi4gVXBkYXRlIHRoZSByZXBvcnQKCWF0 IHRoZSBlbmQgb2YgdGhlIGNvbmZpZ3VyZSBwcm9jZXNzIHRvIHNob3cgdGhl IHN0YXR1cyBvZiB0aGUKCWZlZGFiaXBrZ2RpZmYgZmVhdHVyZS4gQWRkIGNo ZWNrIGZvciBwcmVyZXF1aXNpdGUgcHl0aG9uIG1vZHVsZXMKCWl0ZXJ0b29s cywgc2h1dGlsLCB1bml0dGVzdCBhbmQgbW9jay4gIFRoZXNlIGFyZSBuZWNl c3NhcnkgZm9yIHRoZQoJdW5pdCB0ZXN0IG9mIGZlZGFiaXBrZ2RpZmYuIEdl bmVyYXRlIHRlc3RzL3J1bnRlc3RmZWRhYmlwa2dkaWZmLnB5CglpbnRvIHRo ZSBidWlsZCBkaXJlY3RvcnksIGZyb20gdGhlIHRlc3RzL3J1bnRlc3RmZWRh Ymlwa2dkaWZmLnB5LmluCglpbnB1dCBmaWxlLgoJKiB0b29scy9NYWtlZmls ZS5hbTogSW5jbHVkZSB0aGUgZmVkYWJpcGtnZGlmZiB0byB0aGUgc291cmNl CglkaXN0cmlidXRpb24gYW5kIGluc3RhbGwgaXQgaWYgdGhlICJmZWRhYmlw a2dkaWZmIiBmZWF0dXJlIGlzCgllbmFibGVkLgoJKiB0ZXN0cy9NYWtlZmls ZS5hbTogUmVuYW1lIHJ1bnRlc3RmZWRhYmlwa2dkaWZmLnNoIGludG8KCXJ1 bnRlc3RmZWRhYmlwa2dkaWZmLnB5LiAgQWRkIHRoZSBuZXcgcnVudGVzdGZl ZGFiaXBrZ2RpZmYucHkuaW4KCWF1dG9jb25mIHRlbXBsYXRlIGZpbGUgaW4g aGVyZS4KCSogdGVzdHMvcnVudGVzdGZlZGFiaXBrZ2RpZmYucHkuaW46IE5l dyB1bml0IHRlc3QgZmlsZS4KCSogdG9vbHMvZmVkYWJpcGtnZGlmZjogTmV3 IHRvb2wgZmVkYWJpcGtnZGlmZi4KCSogZG9jL21hbnVhbHMvZmVkYWJpcGtn ZGlmZi5yc3Q6IE5ldyBtYW51YWwuCgpTaWduZWQtb2ZmLWJ5OiBDaGVueGlv bmcgUWkgPGNxaUByZWRoYXQuY29tPgotLS0KIC5naXRpZ25vcmUgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDYgKwogTWFrZWZpbGUu YW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMyArCiBh dXRvY29uZi1hcmNoaXZlL2F4X2NvbXBhcmVfdmVyc2lvbi5tNCAgICAgfCAg MTc3ICsrKysrCiBhdXRvY29uZi1hcmNoaXZlL2F4X3Byb2dfcHl0aG9uX3Zl cnNpb24ubTQgfCAgIDY2ICsrCiBhdXRvY29uZi1hcmNoaXZlL2F4X3B5dGhv bl9tb2R1bGUubTQgICAgICAgfCAgIDU2ICsrCiBjb25maWd1cmUuYWMgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDg2ICsrLQogZG9jL21h bnVhbHMvTWFrZWZpbGUuYW0gICAgICAgICAgICAgICAgICAgIHwgICAgMyAr LQogZG9jL21hbnVhbHMvY29uZi5weSAgICAgICAgICAgICAgICAgICAgICAg IHwgICAgMSArCiBkb2MvbWFudWFscy9mZWRhYmlwa2dkaWZmLnJzdCAgICAg ICAgICAgICAgfCAgMTA4ICsrKwogZG9jL21hbnVhbHMvbGliYWJpZ2FpbC10 b29scy5yc3QgICAgICAgICAgIHwgICAgMSArCiB0ZXN0cy9NYWtlZmlsZS5h bSAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA2ICstCiB0ZXN0cy9y dW50ZXN0ZmVkYWJpcGtnZGlmZi5weS5pbiAgICAgICAgICAgfCAgNjM0ICsr KysrKysrKysrKysrKysrCiB0b29scy9NYWtlZmlsZS5hbSAgICAgICAgICAg ICAgICAgICAgICAgICAgfCAgICA2ICsKIHRvb2xzL2ZlZGFiaXBrZ2RpZmYg ICAgICAgICAgICAgICAgICAgICAgICB8IDEwNTAgKysrKysrKysrKysrKysr KysrKysrKysrKysrKwogMTQgZmlsZXMgY2hhbmdlZCwgMjIwMCBpbnNlcnRp b25zKCspLCAzIGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGF1 dG9jb25mLWFyY2hpdmUvYXhfY29tcGFyZV92ZXJzaW9uLm00CiBjcmVhdGUg bW9kZSAxMDA2NDQgYXV0b2NvbmYtYXJjaGl2ZS9heF9wcm9nX3B5dGhvbl92 ZXJzaW9uLm00CiBjcmVhdGUgbW9kZSAxMDA2NDQgYXV0b2NvbmYtYXJjaGl2 ZS9heF9weXRob25fbW9kdWxlLm00CiBjcmVhdGUgbW9kZSAxMDA2NDQgZG9j L21hbnVhbHMvZmVkYWJpcGtnZGlmZi5yc3QKIGNyZWF0ZSBtb2RlIDEwMDc1 NSB0ZXN0cy9ydW50ZXN0ZmVkYWJpcGtnZGlmZi5weS5pbgogY3JlYXRlIG1v ZGUgMTAwNzU1IHRvb2xzL2ZlZGFiaXBrZ2RpZmYKCmRpZmYgLS1naXQgYS8u Z2l0aWdub3JlIGIvLmdpdGlnbm9yZQppbmRleCBiYjdjNDJhLi5hNjBjYWRi IDEwMDY0NAotLS0gYS8uZ2l0aWdub3JlCisrKyBiLy5naXRpZ25vcmUKQEAg LTYsNiArNiw3IEBAIE1ha2VmaWxlLmluCiAqLmxvCiAqLm8KICp+CisqLnN3 cAogCiAvYWNsb2NhbC5tNAogL2F1dG9tNHRlLmNhY2hlLwpAQCAtMTcsMyAr MTgsOCBAQCBNYWtlZmlsZS5pbgogCiAvaW5jbHVkZS9hYmctdmVyc2lvbi5o CiAvKi5wYworCisudGFncworYnVpbGQvCitUQUdTCitmZWRhYmlwa2dkaWZm YwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL01h a2VmaWxlLmFtIGIvTWFrZWZpbGUuYW0KaW5kZXggY2RlZTBkYi4uMjliZWQ2 MSAxMDA2NDQKLS0tIGEvTWFrZWZpbGUuYW0KKysrIGIvTWFrZWZpbGUuYW0K QEAgLTEyLDYgKzEyLDkgQEAgcGtnY29uZmlnX0RBVEEgPSBsaWJhYmlnYWls LnBjCiAjZGlzdF9iYXNoY29tcGxldGlvbl9EQVRBID0KIAogRVhUUkFfRElT VCA9IAkJCVwKK2F1dG9jb25mLWFyY2hpdmUvYXhfcHl0aG9uX21vZHVsZS5t NCBcCithdXRvY29uZi1hcmNoaXZlL2F4X3Byb2dfcHl0aG9uX3ZlcnNpb24u bTQgXAorYXV0b2NvbmYtYXJjaGl2ZS9heF9jb21wYXJlX3ZlcnNpb24ubTQg XAogTkVXUyBSRUFETUUgQ09QWUlORyBDaGFuZ2VMb2cJXAogQ09QWUlORy1M R1BMVjIgQ09QWUlORy1MR1BMVjMJXAogQ09QWUlORy1HUExWMyBnZW4tY2hh bmdlbG9nLnB5CVwKZGlmZiAtLWdpdCBhL2F1dG9jb25mLWFyY2hpdmUvYXhf Y29tcGFyZV92ZXJzaW9uLm00IGIvYXV0b2NvbmYtYXJjaGl2ZS9heF9jb21w YXJlX3ZlcnNpb24ubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw MDAwMC4uNzRkYzBmZAotLS0gL2Rldi9udWxsCisrKyBiL2F1dG9jb25mLWFy Y2hpdmUvYXhfY29tcGFyZV92ZXJzaW9uLm00CkBAIC0wLDAgKzEsMTc3IEBA CisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgICBodHRw Oi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9j b21wYXJlX3ZlcnNpb24uaHRtbAorIyA9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT0KKyMKKyMgU1lOT1BTSVMKKyMKKyMgICBBWF9DT01QQVJFX1ZF UlNJT04oVkVSU0lPTl9BLCBPUCwgVkVSU0lPTl9CLCBbQUNUSU9OLUlGLVRS VUVdLCBbQUNUSU9OLUlGLUZBTFNFXSkKKyMKKyMgREVTQ1JJUFRJT04KKyMK KyMgICBUaGlzIG1hY3JvIGNvbXBhcmVzIHR3byB2ZXJzaW9uIHN0cmluZ3Mu IER1ZSB0byB0aGUgdmFyaW91cyBudW1iZXIgb2YKKyMgICBtaW5vci12ZXJz aW9uIG51bWJlcnMgdGhhdCBjYW4gZXhpc3QsIGFuZCB0aGUgZmFjdCB0aGF0 IHN0cmluZworIyAgIGNvbXBhcmlzb25zIGFyZSBub3QgY29tcGF0aWJsZSB3 aXRoIG51bWVyaWMgY29tcGFyaXNvbnMsIHRoaXMgaXMgbm90CisjICAgbmVj ZXNzYXJpbHkgdHJpdmlhbCB0byBkbyBpbiBhIGF1dG9jb25mIHNjcmlwdC4g VGhpcyBtYWNybyBtYWtlcyBkb2luZworIyAgIHRoZXNlIGNvbXBhcmlzb25z IGVhc3kuCisjCisjICAgVGhlIHNpeCBiYXNpYyBjb21wYXJpc29ucyBhcmUg YXZhaWxhYmxlLCBhcyB3ZWxsIGFzIGNoZWNraW5nIGVxdWFsaXR5CisjICAg bGltaXRlZCB0byBhIGNlcnRhaW4gbnVtYmVyIG9mIG1pbm9yLXZlcnNpb24g bGV2ZWxzLgorIworIyAgIFRoZSBvcGVyYXRvciBPUCBkZXRlcm1pbmVzIHdo YXQgdHlwZSBvZiBjb21wYXJpc29uIHRvIGRvLCBhbmQgY2FuIGJlIG9uZQor IyAgIG9mOgorIworIyAgICBlcSAgLSBlcXVhbCAodGVzdCBBID09IEIpCisj ICAgIG5lICAtIG5vdCBlcXVhbCAodGVzdCBBICE9IEIpCisjICAgIGxlICAt IGxlc3MgdGhhbiBvciBlcXVhbCAodGVzdCBBIDw9IEIpCisjICAgIGdlICAt IGdyZWF0ZXIgdGhhbiBvciBlcXVhbCAodGVzdCBBID49IEIpCisjICAgIGx0 ICAtIGxlc3MgdGhhbiAodGVzdCBBIDwgQikKKyMgICAgZ3QgIC0gZ3JlYXRl ciB0aGFuICh0ZXN0IEEgPiBCKQorIworIyAgIEFkZGl0aW9uYWxseSwgdGhl IGVxIGFuZCBuZSBvcGVyYXRvciBjYW4gaGF2ZSBhIG51bWJlciBhZnRlciBp dCB0byBsaW1pdAorIyAgIHRoZSB0ZXN0IHRvIHRoYXQgbnVtYmVyIG9mIG1p bm9yIHZlcnNpb25zLgorIworIyAgICBlcTAgLSBlcXVhbCB1cCB0byB0aGUg bGVuZ3RoIG9mIHRoZSBzaG9ydGVyIHZlcnNpb24KKyMgICAgbmUwIC0gbm90 IGVxdWFsIHVwIHRvIHRoZSBsZW5ndGggb2YgdGhlIHNob3J0ZXIgdmVyc2lv bgorIyAgICBlcU4gLSBlcXVhbCB1cCB0byBOIHN1Yi12ZXJzaW9uIGxldmVs cworIyAgICBuZU4gLSBub3QgZXF1YWwgdXAgdG8gTiBzdWItdmVyc2lvbiBs ZXZlbHMKKyMKKyMgICBXaGVuIHRoZSBjb25kaXRpb24gaXMgdHJ1ZSwgc2hl bGwgY29tbWFuZHMgQUNUSU9OLUlGLVRSVUUgYXJlIHJ1biwKKyMgICBvdGhl cndpc2Ugc2hlbGwgY29tbWFuZHMgQUNUSU9OLUlGLUZBTFNFIGFyZSBydW4u IFRoZSBlbnZpcm9ubWVudAorIyAgIHZhcmlhYmxlICdheF9jb21wYXJlX3Zl cnNpb24nIGlzIGFsd2F5cyBzZXQgdG8gZWl0aGVyICd0cnVlJyBvciAnZmFs c2UnCisjICAgYXMgd2VsbC4KKyMKKyMgICBFeGFtcGxlczoKKyMKKyMgICAg IEFYX0NPTVBBUkVfVkVSU0lPTihbMy4xNS43XSxbbHRdLFszLjE1LjhdKQor IyAgICAgQVhfQ09NUEFSRV9WRVJTSU9OKFszLjE1XSxbbHRdLFszLjE1Ljhd KQorIworIyAgIHdvdWxkIGJvdGggYmUgdHJ1ZS4KKyMKKyMgICAgIEFYX0NP TVBBUkVfVkVSU0lPTihbMy4xNS43XSxbZXFdLFszLjE1LjhdKQorIyAgICAg QVhfQ09NUEFSRV9WRVJTSU9OKFszLjE1XSxbZ3RdLFszLjE1LjhdKQorIwor IyAgIHdvdWxkIGJvdGggYmUgZmFsc2UuCisjCisjICAgICBBWF9DT01QQVJF X1ZFUlNJT04oWzMuMTUuN10sW2VxMl0sWzMuMTUuOF0pCisjCisjICAgd291 bGQgYmUgdHJ1ZSBiZWNhdXNlIGl0IGlzIG9ubHkgY29tcGFyaW5nIHR3byBt aW5vciB2ZXJzaW9ucy4KKyMKKyMgICAgIEFYX0NPTVBBUkVfVkVSU0lPTihb My4xNS43XSxbZXEwXSxbMy4xNV0pCisjCisjICAgd291bGQgYmUgdHJ1ZSBi ZWNhdXNlIGl0IGlzIG9ubHkgY29tcGFyaW5nIHRoZSBsZXNzZXIgbnVtYmVy IG9mIG1pbm9yCisjICAgdmVyc2lvbnMgb2YgdGhlIHR3byB2YWx1ZXMuCisj CisjICAgTm90ZTogVGhlIGNoYXJhY3RlcnMgdGhhdCBzZXBhcmF0ZSB0aGUg dmVyc2lvbiBudW1iZXJzIGRvIG5vdCBtYXR0ZXIuIEFuCisjICAgZW1wdHkg c3RyaW5nIGlzIHRoZSBzYW1lIGFzIHZlcnNpb24gMC4gT1AgaXMgZXZhbHVh dGVkIGJ5IGF1dG9jb25mLCBub3QKKyMgICBjb25maWd1cmUsIHNvIG11c3Qg YmUgYSBzdHJpbmcsIG5vdCBhIHZhcmlhYmxlLgorIworIyAgIFRoZSBhdXRo b3Igd291bGQgbGlrZSB0byBhY2tub3dsZWRnZSBHdWlkbyBEcmFoZWltIHdo b3NlIGFkdmljZSBhYm91dAorIyAgIHRoZSBtNF9jYXNlIGFuZCBtNF9pZnZh bG4gZnVuY3Rpb25zIG1ha2UgdGhpcyBtYWNybyBvbmx5IGluY2x1ZGUgdGhl CisjICAgcG9ydGlvbnMgbmVjZXNzYXJ5IHRvIHBlcmZvcm0gdGhlIHNwZWNp ZmljIGNvbXBhcmlzb24gc3BlY2lmaWVkIGJ5IHRoZQorIyAgIE9QIGFyZ3Vt ZW50IGluIHRoZSBmaW5hbCBjb25maWd1cmUgc2NyaXB0LgorIworIyBMSUNF TlNFCisjCisjICAgQ29weXJpZ2h0IChjKSAyMDA4IFRpbSBUb29sYW4gPHRv b2xhbkBlbGUudXJpLmVkdT4KKyMKKyMgICBDb3B5aW5nIGFuZCBkaXN0cmli dXRpb24gb2YgdGhpcyBmaWxlLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0 aW9uLCBhcmUKKyMgICBwZXJtaXR0ZWQgaW4gYW55IG1lZGl1bSB3aXRob3V0 IHJveWFsdHkgcHJvdmlkZWQgdGhlIGNvcHlyaWdodCBub3RpY2UKKyMgICBh bmQgdGhpcyBub3RpY2UgYXJlIHByZXNlcnZlZC4gVGhpcyBmaWxlIGlzIG9m ZmVyZWQgYXMtaXMsIHdpdGhvdXQgYW55CisjICAgd2FycmFudHkuCisKKyNz ZXJpYWwgMTEKKworZG5sICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMK K0FDX0RFRlVOKFtBWF9DT01QQVJFX1ZFUlNJT05dLCBbCisgIEFDX1JFUVVJ UkUoW0FDX1BST0dfQVdLXSkKKworICAjIFVzZWQgdG8gaW5kaWNhdGUgdHJ1 ZSBvciBmYWxzZSBjb25kaXRpb24KKyAgYXhfY29tcGFyZV92ZXJzaW9uPWZh bHNlCisKKyAgIyBDb252ZXJ0IHRoZSB0d28gdmVyc2lvbiBzdHJpbmdzIHRv IGJlIGNvbXBhcmVkIGludG8gYSBmb3JtYXQgdGhhdAorICAjIGFsbG93cyBh IHNpbXBsZSBzdHJpbmcgY29tcGFyaXNvbi4gIFRoZSBlbmQgcmVzdWx0IGlz IHRoYXQgYSB2ZXJzaW9uCisgICMgc3RyaW5nIG9mIHRoZSBmb3JtIDEuMTIu NS1yNjE3IHdpbGwgYmUgY29udmVydGVkIHRvIHRoZSBmb3JtCisgICMgMDAw MTAwMTIwMDA1MDYxNy4gIEluIG90aGVyIHdvcmRzLCBlYWNoIG51bWJlciBp cyB6ZXJvIHBhZGRlZCB0byBmb3VyCisgICMgZGlnaXRzLCBhbmQgbm9uIGRp Z2l0cyBhcmUgcmVtb3ZlZC4KKyAgQVNfVkFSX1BVU0hERUYoW0FdLFtheF9j b21wYXJlX3ZlcnNpb25fQV0pCisgIEE9YGVjaG8gIiQxIiB8IHNlZCAtZSAn cy9cKFtbMC05XV0qXCkvWlwxWi9nJyBcCisgICAgICAgICAgICAgICAgICAg ICAtZSAncy9aXChbWzAtOV1dXClaL1owXDFaL2cnIFwKKyAgICAgICAgICAg ICAgICAgICAgIC1lICdzL1pcKFtbMC05XV1bWzAtOV1dXClaL1owXDFaL2cn IFwKKyAgICAgICAgICAgICAgICAgICAgIC1lICdzL1pcKFtbMC05XV1bWzAt OV1dW1swLTldXVwpWi9aMFwxWi9nJyBcCisgICAgICAgICAgICAgICAgICAg ICAtZSAncy9bW14wLTldXS8vZydgCisKKyAgQVNfVkFSX1BVU0hERUYoW0Jd LFtheF9jb21wYXJlX3ZlcnNpb25fQl0pCisgIEI9YGVjaG8gIiQzIiB8IHNl ZCAtZSAncy9cKFtbMC05XV0qXCkvWlwxWi9nJyBcCisgICAgICAgICAgICAg ICAgICAgICAtZSAncy9aXChbWzAtOV1dXClaL1owXDFaL2cnIFwKKyAgICAg ICAgICAgICAgICAgICAgIC1lICdzL1pcKFtbMC05XV1bWzAtOV1dXClaL1ow XDFaL2cnIFwKKyAgICAgICAgICAgICAgICAgICAgIC1lICdzL1pcKFtbMC05 XV1bWzAtOV1dW1swLTldXVwpWi9aMFwxWi9nJyBcCisgICAgICAgICAgICAg ICAgICAgICAtZSAncy9bW14wLTldXS8vZydgCisKKyAgZG5sICMgSW4gdGhl IGNhc2Ugb2YgbGUsIGdlLCBsdCwgYW5kIGd0LCB0aGUgc3RyaW5ncyBhcmUg c29ydGVkIGFzIG5lY2Vzc2FyeQorICBkbmwgIyB0aGVuIHRoZSBmaXJzdCBs aW5lIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBjb25kaXRpb24gaXMg dHJ1ZS4KKyAgZG5sICMgVGhlIHNlZCByaWdodCBhZnRlciB0aGUgZWNobyBp cyB0byByZW1vdmUgYW55IGluZGVudGVkIHdoaXRlIHNwYWNlLgorICBtNF9j YXNlKG00X3RvbG93ZXIoJDIpLAorICBbbHRdLFsKKyAgICBheF9jb21wYXJl X3ZlcnNpb249YGVjaG8gIngkQQoreCRCIiB8IHNlZCAncy9eICovLycgfCBz b3J0IC1yIHwgc2VkICJzL3gke0F9L2ZhbHNlLztzL3gke0J9L3RydWUvOzFx ImAKKyAgXSwKKyAgW2d0XSxbCisgICAgYXhfY29tcGFyZV92ZXJzaW9uPWBl Y2hvICJ4JEEKK3gkQiIgfCBzZWQgJ3MvXiAqLy8nIHwgc29ydCB8IHNlZCAi cy94JHtBfS9mYWxzZS87cy94JHtCfS90cnVlLzsxcSJgCisgIF0sCisgIFts ZV0sWworICAgIGF4X2NvbXBhcmVfdmVyc2lvbj1gZWNobyAieCRBCit4JEIi IHwgc2VkICdzL14gKi8vJyB8IHNvcnQgfCBzZWQgInMveCR7QX0vdHJ1ZS87 cy94JHtCfS9mYWxzZS87MXEiYAorICBdLAorICBbZ2VdLFsKKyAgICBheF9j b21wYXJlX3ZlcnNpb249YGVjaG8gIngkQQoreCRCIiB8IHNlZCAncy9eICov LycgfCBzb3J0IC1yIHwgc2VkICJzL3gke0F9L3RydWUvO3MveCR7Qn0vZmFs c2UvOzFxImAKKyAgXSxbCisgICAgZG5sIFNwbGl0IHRoZSBvcGVyYXRvciBm cm9tIHRoZSBzdWJ2ZXJzaW9uIGNvdW50IGlmIHByZXNlbnQuCisgICAgbTRf Ym1hdGNoKG00X3N1YnN0cigkMiwyKSwKKyAgICBbMF0sWworICAgICAgIyBB IGNvdW50IG9mIHplcm8gbWVhbnMgdXNlIHRoZSBsZW5ndGggb2YgdGhlIHNo b3J0ZXIgdmVyc2lvbi4KKyAgICAgICMgRGV0ZXJtaW5lIHRoZSBudW1iZXIg b2YgY2hhcmFjdGVycyBpbiBBIGFuZCBCLgorICAgICAgYXhfY29tcGFyZV92 ZXJzaW9uX2xlbl9BPWBlY2hvICIkQSIgfCAkQVdLICd7cHJpbnQobGVuZ3Ro KX0nYAorICAgICAgYXhfY29tcGFyZV92ZXJzaW9uX2xlbl9CPWBlY2hvICIk QiIgfCAkQVdLICd7cHJpbnQobGVuZ3RoKX0nYAorCisgICAgICAjIFNldCBB IHRvIG5vIG1vcmUgdGhhbiBCJ3MgbGVuZ3RoIGFuZCBCIHRvIG5vIG1vcmUg dGhhbiBBJ3MgbGVuZ3RoLgorICAgICAgQT1gZWNobyAiJEEiIHwgc2VkICJz L1woLlx7JGF4X2NvbXBhcmVfdmVyc2lvbl9sZW5fQlx9XCkuKi9cMS8iYAor ICAgICAgQj1gZWNobyAiJEIiIHwgc2VkICJzL1woLlx7JGF4X2NvbXBhcmVf dmVyc2lvbl9sZW5fQVx9XCkuKi9cMS8iYAorICAgIF0sCisgICAgW1swLTld K10sWworICAgICAgIyBBIGNvdW50IGdyZWF0ZXIgdGhhbiB6ZXJvIG1lYW5z IHVzZSBvbmx5IHRoYXQgbWFueSBzdWJ2ZXJzaW9ucworICAgICAgQT1gZWNo byAiJEEiIHwgc2VkICJzL1woXChbWzAtOV1dXHs0XH1cKVx7bTRfc3Vic3Ry KCQyLDIpXH1cKS4qL1wxLyJgCisgICAgICBCPWBlY2hvICIkQiIgfCBzZWQg InMvXChcKFtbMC05XV1cezRcfVwpXHttNF9zdWJzdHIoJDIsMilcfVwpLiov XDEvImAKKyAgICBdLAorICAgIFsuK10sWworICAgICAgQUNfV0FSTklORygK KyAgICAgICAgW2lsbGVnYWwgT1AgbnVtZXJpYyBwYXJhbWV0ZXI6ICQyXSkK KyAgICBdLFtdKQorCisgICAgIyBQYWQgemVyb3MgYXQgZW5kIG9mIG51bWJl cnMgdG8gbWFrZSBzYW1lIGxlbmd0aC4KKyAgICBheF9jb21wYXJlX3ZlcnNp b25fdG1wX0E9IiRBYGVjaG8gJEIgfCBzZWQgJ3MvLi8wL2cnYCIKKyAgICBC PSIkQmBlY2hvICRBIHwgc2VkICdzLy4vMC9nJ2AiCisgICAgQT0iJGF4X2Nv bXBhcmVfdmVyc2lvbl90bXBfQSIKKworICAgICMgQ2hlY2sgZm9yIGVxdWFs aXR5IG9yIGluZXF1YWxpdHkgYXMgbmVjZXNzYXJ5LgorICAgIG00X2Nhc2Uo bTRfdG9sb3dlcihtNF9zdWJzdHIoJDIsMCwyKSksCisgICAgW2VxXSxbCisg ICAgICB0ZXN0ICJ4JEEiID0gIngkQiIgJiYgYXhfY29tcGFyZV92ZXJzaW9u PXRydWUKKyAgICBdLAorICAgIFtuZV0sWworICAgICAgdGVzdCAieCRBIiAh PSAieCRCIiAmJiBheF9jb21wYXJlX3ZlcnNpb249dHJ1ZQorICAgIF0sWwor ICAgICAgQUNfV0FSTklORyhbaWxsZWdhbCBPUCBwYXJhbWV0ZXI6ICQyXSkK KyAgICBdKQorICBdKQorCisgIEFTX1ZBUl9QT1BERUYoW0FdKWRubAorICBB U19WQVJfUE9QREVGKFtCXSlkbmwKKworICBkbmwgIyBFeGVjdXRlIEFDVElP Ti1JRi1UUlVFIC8gQUNUSU9OLUlGLUZBTFNFLgorICBpZiB0ZXN0ICIkYXhf Y29tcGFyZV92ZXJzaW9uIiA9ICJ0cnVlIiA7IHRoZW4KKyAgICBtNF9pZnZh bG4oWyQ0XSxbJDRdLFs6XSlkbmwKKyAgICBtNF9pZnZhbG4oWyQ1XSxbZWxz ZSAkNV0pZG5sCisgIGZpCitdKSBkbmwgQVhfQ09NUEFSRV9WRVJTSU9OCmRp ZmYgLS1naXQgYS9hdXRvY29uZi1hcmNoaXZlL2F4X3Byb2dfcHl0aG9uX3Zl cnNpb24ubTQgYi9hdXRvY29uZi1hcmNoaXZlL2F4X3Byb2dfcHl0aG9uX3Zl cnNpb24ubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4u NjI4YTNlNAotLS0gL2Rldi9udWxsCisrKyBiL2F1dG9jb25mLWFyY2hpdmUv YXhfcHJvZ19weXRob25fdmVyc2lvbi5tNApAQCAtMCwwICsxLDY2IEBACisj ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAgaHR0cDovL3d3 dy5nbnUub3JnL3NvZnR3YXJlL2F1dG9jb25mLWFyY2hpdmUvYXhfcHJvZ19w eXRob25fdmVyc2lvbi5odG1sCisjID09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PQorIworIyBTWU5PUFNJUworIworIyAgIEFYX1BST0dfUFlUSE9O X1ZFUlNJT04oW1ZFUlNJT05dLFtBQ1RJT04tSUYtVFJVRV0sW0FDVElPTi1J Ri1GQUxTRV0pCisjCisjIERFU0NSSVBUSU9OCisjCisjICAgTWFrZXMgc3Vy ZSB0aGF0IHB5dGhvbiBzdXBwb3J0cyB0aGUgdmVyc2lvbiBpbmRpY2F0ZWQu IElmIHRydWUgdGhlIHNoZWxsCisjICAgY29tbWFuZHMgaW4gQUNUSU9OLUlG LVRSVUUgYXJlIGV4ZWN1dGVkLiBJZiBub3QgdGhlIHNoZWxsIGNvbW1hbmRz IGluCisjICAgQUNUSU9OLUlGLUZBTFNFIGFyZSBydW4uIE5vdGUgaWYgJFBZ VEhPTiBpcyBub3Qgc2V0IChmb3IgZXhhbXBsZSBieQorIyAgIHJ1bm5pbmcg QUNfQ0hFQ0tfUFJPRyBvciBBQ19QQVRIX1BST0cpIHRoZSBtYWNybyB3aWxs IGZhaWwuCisjCisjICAgRXhhbXBsZToKKyMKKyMgICAgIEFDX1BBVEhfUFJP RyhbUFlUSE9OXSxbcHl0aG9uXSkKKyMgICAgIEFYX1BST0dfUFlUSE9OX1ZF UlNJT04oWzIuNC40XSxbIC4uLiBdLFsgLi4uIF0pCisjCisjICAgVGhpcyB3 aWxsIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBweXRob24geW91IGhh dmUgc3VwcG9ydHMgYXQgbGVhc3QKKyMgICB2ZXJzaW9uIDIuNC40LgorIwor IyAgIE5PVEU6IFRoaXMgbWFjcm8gdXNlcyB0aGUgJFBZVEhPTiB2YXJpYWJs ZSB0byBwZXJmb3JtIHRoZSBjaGVjay4KKyMgICBBWF9XSVRIX1BZVEhPTiBj YW4gYmUgdXNlZCB0byBzZXQgdGhhdCB2YXJpYWJsZSBwcmlvciB0byBydW5u aW5nIHRoaXMKKyMgICBtYWNyby4gVGhlICRQWVRIT05fVkVSU0lPTiB2YXJp YWJsZSB3aWxsIGJlIHZhbG9yaXplZCB3aXRoIHRoZSBkZXRlY3RlZAorIyAg IHZlcnNpb24uCisjCisjIExJQ0VOU0UKKyMKKyMgICBDb3B5cmlnaHQgKGMp IDIwMDkgRnJhbmNlc2NvIFNhbHZlc3RyaW5pIDxzYWx2ZXN0cmluaUB1c2Vy cy5zb3VyY2Vmb3JnZS5uZXQ+CisjCisjICAgQ29weWluZyBhbmQgZGlzdHJp YnV0aW9uIG9mIHRoaXMgZmlsZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNh dGlvbiwgYXJlCisjICAgcGVybWl0dGVkIGluIGFueSBtZWRpdW0gd2l0aG91 dCByb3lhbHR5IHByb3ZpZGVkIHRoZSBjb3B5cmlnaHQgbm90aWNlCisjICAg YW5kIHRoaXMgbm90aWNlIGFyZSBwcmVzZXJ2ZWQuIFRoaXMgZmlsZSBpcyBv ZmZlcmVkIGFzLWlzLCB3aXRob3V0IGFueQorIyAgIHdhcnJhbnR5LgorCisj c2VyaWFsIDExCisKK0FDX0RFRlVOKFtBWF9QUk9HX1BZVEhPTl9WRVJTSU9O XSxbCisgICAgQUNfUkVRVUlSRShbQUNfUFJPR19TRURdKQorICAgIEFDX1JF UVVJUkUoW0FDX1BST0dfR1JFUF0pCisKKyAgICBBU19JRihbdGVzdCAtbiAi JFBZVEhPTiJdLFsKKyAgICAgICAgYXhfcHl0aG9uX3ZlcnNpb249IiQxIgor CisgICAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yIHB5dGhvbiB2ZXJzaW9u XSkKKyAgICAgICAgY2hhbmdlcXVvdGUoPDwsPj4pCisgICAgICAgIHB5dGhv bl92ZXJzaW9uPWAkUFlUSE9OIC1WIDI+JjEgfCAkR1JFUCAiXlB5dGhvbiAi IHwgJFNFRCAtZSAncy9eLiogXChbMC05XSpcLlswLTldKlwuWzAtOV0qXCkv XDEvJ2AKKyAgICAgICAgY2hhbmdlcXVvdGUoWyxdKQorICAgICAgICBBQ19N U0dfUkVTVUxUKCRweXRob25fdmVyc2lvbikKKworCUFDX1NVQlNUKFtQWVRI T05fVkVSU0lPTl0sWyRweXRob25fdmVyc2lvbl0pCisKKyAgICAgICAgQVhf Q09NUEFSRV9WRVJTSU9OKFskYXhfcHl0aG9uX3ZlcnNpb25dLFtsZV0sWyRw eXRob25fdmVyc2lvbl0sWworCSAgICA6CisgICAgICAgICAgICAkMgorICAg ICAgICBdLFsKKwkgICAgOgorICAgICAgICAgICAgJDMKKyAgICAgICAgXSkK KyAgICBdLFsKKyAgICAgICAgQUNfTVNHX1dBUk4oW2NvdWxkIG5vdCBmaW5k IHRoZSBweXRob24gaW50ZXJwcmV0ZXJdKQorICAgICAgICAkMworICAgIF0p CitdKQpkaWZmIC0tZ2l0IGEvYXV0b2NvbmYtYXJjaGl2ZS9heF9weXRob25f bW9kdWxlLm00IGIvYXV0b2NvbmYtYXJjaGl2ZS9heF9weXRob25fbW9kdWxl Lm00Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxODJj NDgKLS0tIC9kZXYvbnVsbAorKysgYi9hdXRvY29uZi1hcmNoaXZlL2F4X3B5 dGhvbl9tb2R1bGUubTQKQEAgLTAsMCArMSw1NiBAQAorIyA9PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT0KKyMgICAgIGh0dHA6Ly93d3cuZ251Lm9y Zy9zb2Z0d2FyZS9hdXRvY29uZi1hcmNoaXZlL2F4X3B5dGhvbl9tb2R1bGUu aHRtbAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMg U1lOT1BTSVMKKyMKKyMgICBBWF9QWVRIT05fTU9EVUxFKG1vZG5hbWVbLCBm YXRhbCwgcHl0aG9uXSkKKyMKKyMgREVTQ1JJUFRJT04KKyMKKyMgICBDaGVj a3MgZm9yIFB5dGhvbiBtb2R1bGUuCisjCisjICAgSWYgZmF0YWwgaXMgbm9u LWVtcHR5IHRoZW4gYWJzZW5jZSBvZiBhIG1vZHVsZSB3aWxsIHRyaWdnZXIg YW4gZXJyb3IuCisjICAgVGhlIHRoaXJkIHBhcmFtZXRlciBjYW4gZWl0aGVy IGJlICJweXRob24iIGZvciBQeXRob24gMiBvciAicHl0aG9uMyIgZm9yCisj ICAgUHl0aG9uIDM7IGRlZmF1bHRzIHRvIFB5dGhvbiAzLgorIworIyBMSUNF TlNFCisjCisjICAgQ29weXJpZ2h0IChjKSAyMDA4IEFuZHJldyBDb2xsaWVy CisjCisjICAgQ29weWluZyBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmls ZSwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlCisjICAgcGVy bWl0dGVkIGluIGFueSBtZWRpdW0gd2l0aG91dCByb3lhbHR5IHByb3ZpZGVk IHRoZSBjb3B5cmlnaHQgbm90aWNlCisjICAgYW5kIHRoaXMgbm90aWNlIGFy ZSBwcmVzZXJ2ZWQuIFRoaXMgZmlsZSBpcyBvZmZlcmVkIGFzLWlzLCB3aXRo b3V0IGFueQorIyAgIHdhcnJhbnR5LgorCisjc2VyaWFsIDgKKworQVVfQUxJ QVMoW0FDX1BZVEhPTl9NT0RVTEVdLCBbQVhfUFlUSE9OX01PRFVMRV0pCitB Q19ERUZVTihbQVhfUFlUSE9OX01PRFVMRV0sWworICAgIGlmIHRlc3QgLXog JFBZVEhPTjsKKyAgICB0aGVuCisgICAgICAgIGlmIHRlc3QgLXogIiQzIjsK KyAgICAgICAgdGhlbgorICAgICAgICAgICAgUFlUSE9OPSJweXRob24zIgor ICAgICAgICBlbHNlCisgICAgICAgICAgICBQWVRIT049IiQzIgorICAgICAg ICBmaQorICAgIGZpCisgICAgUFlUSE9OX05BTUU9YGJhc2VuYW1lICRQWVRI T05gCisgICAgQUNfTVNHX0NIRUNLSU5HKCRQWVRIT05fTkFNRSBtb2R1bGU6 ICQxKQorICAgICRQWVRIT04gLWMgImltcG9ydCAkMSIgMj4vZGV2L251bGwK KyAgICBpZiB0ZXN0ICQ/IC1lcSAwOworICAgIHRoZW4KKyAgICAgICAgQUNf TVNHX1JFU1VMVCh5ZXMpCisgICAgICAgIGV2YWwgQVNfVFJfQ1BQKEhBVkVf UFlNT0RfJDEpPXllcworICAgIGVsc2UKKyAgICAgICAgQUNfTVNHX1JFU1VM VChubykKKyAgICAgICAgZXZhbCBBU19UUl9DUFAoSEFWRV9QWU1PRF8kMSk9 bm8KKyAgICAgICAgIworICAgICAgICBpZiB0ZXN0IC1uICIkMiIKKyAgICAg ICAgdGhlbgorICAgICAgICAgICAgQUNfTVNHX0VSUk9SKGZhaWxlZCB0byBm aW5kIHJlcXVpcmVkIG1vZHVsZSAkMSkKKyAgICAgICAgICAgIGV4aXQgMQor ICAgICAgICBmaQorICAgIGZpCitdKQpkaWZmIC0tZ2l0IGEvY29uZmlndXJl LmFjIGIvY29uZmlndXJlLmFjCmluZGV4IGZhODcxMDUuLjlkNjEwNTEgMTAw NjQ0Ci0tLSBhL2NvbmZpZ3VyZS5hYworKysgYi9jb25maWd1cmUuYWMKQEAg LTE0LDYgKzE0LDE4IEBAIEFDX0NPTkZJR19IRUFERVIoW2NvbmZpZy5oXSkK IEFDX0NPTkZJR19TUkNESVIoW1JFQURNRV0pCiBBQ19DT05GSUdfTUFDUk9f RElSKFttNF0pCiAKK2RubCBJbmNsdWRlIHNvbWUgYXV0b2NvbmYgbWFjcm9z IHRvIGNoZWNrIGZvciBweXRob24gbW9kdWxlcy4KK2RubAorZG5sIFRoZXNl IG1hY3JvcyBhcmUgY29taW5nIGZyb20gdGhlIGF1dG9jb25mIGFyY2hpdmUg YXQKK2RubCBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYt YXJjaGl2ZQorCitkbmwgVGhpcyBvbmUgaXMgZm9yIHRoZSBBWF9QWVRIT05f TU9EVUxFKCkgbWFjcm8uCittNF9pbmNsdWRlKFthdXRvY29uZi1hcmNoaXZl L2F4X3B5dGhvbl9tb2R1bGUubTRdKQorCitkbmwgVGhlc2UgdHdvIGJlbG93 IGFyZSBmb3IgdGhlIEFYX1BST0dfUFlUSE9OX1ZFUlNJT04oKSBtb2R1bGUu CittNF9pbmNsdWRlKFthdXRvY29uZi1hcmNoaXZlL2F4X2NvbXBhcmVfdmVy c2lvbi5tNF0pCittNF9pbmNsdWRlKFthdXRvY29uZi1hcmNoaXZlL2F4X3By b2dfcHl0aG9uX3ZlcnNpb24ubTRdKQorCiBBTV9JTklUX0FVVE9NQUtFKFsx LjExLjEgZm9yZWlnbiBzdWJkaXItb2JqZWN0cyB0YXItdXN0YXIgcGFyYWxs ZWwtdGVzdHNdKQogQU1fTUFJTlRBSU5FUl9NT0RFKFtlbmFibGVdKQogCkBA IC03Niw2ICs4OCwxMiBAQCBBQ19BUkdfRU5BQkxFKFtiYXNoLWNvbXBsZXRp b25dLAogCSAgICAgIEVOQUJMRV9CQVNIX0NPTVBMRVRJT049JGVuYWJsZXZh bCwKIAkgICAgICBFTkFCTEVfQkFTSF9DT01QTEVUSU9OPWF1dG8pCiAKK0FD X0FSR19FTkFCTEUoW2ZlZGFiaXBrZ2RpZmZdLAorCSAgICAgIEFTX0hFTFBf U1RSSU5HKFstLWVuYWJsZS1mZWRhYmlwa2dkaWZmPXllc3xub3xhdXRvXSwK KwkJCSAgICAgW2VuYWJsZSB0aGUgZmVkYWJpcGtnZGlmZiB0b29sXSksCisJ ICAgICAgRU5BQkxFX0ZFREFCSVBLR0RJRkY9JGVuYWJsZXZhbCwKKwkgICAg ICBFTkFCTEVfRkVEQUJJUEtHRElGRj1hdXRvKQorCiBkbmwgKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogZG5s IGNoZWNrIGZvciBkZXBlbmRlbmNpZXMKIGRubCAqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yMTksNiAr MjM3LDY4IEBAIGZpCiAKIEFNX0NPTkRJVElPTkFMKEVOQUJMRV9CQVNIX0NP TVBMRVRJT04sIHRlc3QgeCRFTkFCTEVfQkFTSF9DT01QTEVUSU9OID0geHll cykKIAorZG5sIGlmIC0tZW5hYmxlLWZlZGFiaXBrZ2RpZmYgaGFzIHRoZSAn YXV0bycgdmFsdWUsIHRoZW4gY2hlY2sgZm9yIHRoZSByZXF1aXJlZAorZG5s IHB5dGhvbiBtb2R1bGVzLiAgSWYgdGhleSBhcmUgcHJlc2VudCwgdGhlbiBl bmFibGUgdGhlIGZlZGFiaXBrZ2RpZmYgcHJvZ3JhbS4KK2RubCBJZiB0aGV5 IGFyZSBub3QgdGhlbiBkaXNhYmxlIHRoZSBwcm9ncmFtLgorZG5sCitkbmwg SWYgLS1lbmFibGUtZmVkYWJpcGtnZGlmZiBoYXMgdGhlICd5ZXMnIHZhbHVl LCB0aGVuIGNoZWNrIGZvciB0aGUgcmVxdWlyZWQKK2RubCBweXRob24gbW9k dWxlcyBhbmQgd2hhdGV2ZXIgZGVwZW5kZW5jeSBmZWRhYmlwa2dkaWZmIG5l ZWRzLiAgSWYgdGhleSBhcmUKK2RubCBub3QgcHJlc2VudCB0aGVuIHRoZSBj b25maWd1cmUgc2NyaXB0IHdpbGwgZXJyb3Igb3V0LgorCitpZiB0ZXN0IHgk RU5BQkxFX0ZFREFCSVBLR0RJRkYgPSB4YXV0byAtbyB4JEVOQUJMRV9GRURB QklQS0dESUZGID0geHllczsgdGhlbgorICAgQ0hFQ0tfREVQU19GT1JfRkVE QUJJUEtHRElGRj15ZXMKK2Vsc2UKKyAgIENIRUNLX0RFUFNfRk9SX0ZFREFC SVBLR0RJRkY9bm8KK2ZpCisKK2lmIHRlc3QgeCRDSEVDS19ERVBTX0ZPUl9G RURBQklQS0dESUZGID0geHllczsgdGhlbgorICBpZiB0ZXN0IHgkRU5BQkxF X0ZFREFCSVBLR0RJRkYgPSB4eWVzOyB0aGVuCisgICAgIEZBVEFMPXllcwor ICBmaQorCisgIEFDX1BBVEhfUFJPRyhXR0VULCB3Z2V0LCBubykKKworICBp ZiB0ZXN0IHgkV0dFVCA9IHgkbm87IHRoZW4KKyAgICBBQ19NU0dfRVJST1Io Y291bGQgbm90IGZpbmQgdGhlIHdnZXQgcHJvZ3JhbSkKKyAgZmkKKworICAj IFRoZSBtaW5pbWFsIHB5dGhvbiB2ZXJzaW9uIHdlIHdhbnQgdG8gc3VwcG9y dCBpcyAyLjYuNiBiZWNhdXNlIEVMNgorICAjIGRpc3RyaWJ1dGlvbnMgaGF2 ZSB0aGF0IHZlcnNpb24gaW5zdGFsbGVkLgorICBNSU5JTUFMX1BZVEhPTl9W RVJTSU9OPSIyLjYuNiIKKworICBBQ19QQVRIX1BST0coUFlUSE9OLCBweXRo b24sIG5vKQorICBBWF9QUk9HX1BZVEhPTl9WRVJTSU9OKCRNSU5JTUFMX1BZ VEhPTl9WRVJTSU9OLAorCQkJIFtNSU5JTUFMX1BZVEhPTl9WRVJTSU9OX0ZP VU5EPXllc10sCisJCQkgW01JTklNQUxfUFlUSE9OX1ZFUlNJT05fRk9VTkQ9 bm9dKQorCisgIGlmIHRlc3QgeCRNSU5JTUFMX1BZVEhPTl9WRVJTSU9OX0ZP VU5EID0geG5vOyB0aGVuCisgICAgQUNfTVNHX0VSUk9SKFtjb3VsZCBub3Qg ZmluZCBhIHB5dGhvbiBwcm9ncmFtIG9mIHZlcnNpb24gYXQgbGVhc3QgJE1J TklNQUxfUFlUSE9OX1ZFUlNJT05dKQorICBmaQorCisgIEFYX1BZVEhPTl9N T0RVTEUoYXJncGFyc2UsICRGQVRBTCwgcHl0aG9uMikKKyAgQVhfUFlUSE9O X01PRFVMRShnbG9iLCAkRkFUQUwsIHB5dGhvbjIpCisgIEFYX1BZVEhPTl9N T0RVTEUobG9nZ2luZywgJEZBVEFMLCBweXRob24yKQorICBBWF9QWVRIT05f TU9EVUxFKG9zLCAkRkFUQUwsIHB5dGhvbjIpCisgIEFYX1BZVEhPTl9NT0RV TEUocmUsICRGQVRBTCwgcHl0aG9uMikKKyAgQVhfUFlUSE9OX01PRFVMRShz aGxleCwgJEZBVEFMLCBweXRob24yKQorICBBWF9QWVRIT05fTU9EVUxFKHN1 YnByb2Nlc3MsICRGQVRBTCwgcHl0aG9uMikKKyAgQVhfUFlUSE9OX01PRFVM RShzeXMsICRGQVRBTCwgcHl0aG9uMikKKyAgQVhfUFlUSE9OX01PRFVMRShp dGVydG9vbHMsICRGQVRBTCwgcHl0aG9uMikKKyAgQVhfUFlUSE9OX01PRFVM RSh1cmxwYXJzZSwgJEZBVEFMLCBweXRob24yKQorICBBWF9QWVRIT05fTU9E VUxFKGl0ZXJ0b29scywgJEZBVEFMLCBweXRob24yKQorICBBWF9QWVRIT05f TU9EVUxFKHNodXRpbCwgJEZBVEFMLCBweXRob24yKQorICBBWF9QWVRIT05f TU9EVUxFKHVuaXR0ZXN0LCAkRkFUQUwsIHB5dGhvbjIpCisgIEFYX1BZVEhP Tl9NT0RVTEUoa29qaSwgJEZBVEFMLCBweXRob24yKQorICBBWF9QWVRIT05f TU9EVUxFKG1vY2ssICRGQVRBTCwgcHl0aG9uMikKKyAgRU5BQkxFX0ZFREFC SVBLR0RJRkY9eWVzCisKKyAgaWYgdGVzdCB4JEVOQUJMRV9GRURBQklQS0dE SUZGICE9IHh5ZXM7IHRoZW4KKyAgICBFTkFCTEVfRkVEQUJJUEtHRElGRj1u bworICBmaQorZmkKKworQU1fQ09ORElUSU9OQUwoRU5BQkxFX0ZFREFCSVBL R0RJRkYsIHRlc3QgeCRFTkFCTEVfRkVEQUJJUEtHRElGRiA9IHh5ZXMpCisK IGRubCBDaGVjayBmb3IgZGVwZW5kZW5jeTogbGliemlwCiBMSUJaSVBfVkVS U0lPTj0wLjEwLjEKIApAQCAtMzYxLDcgKzQ0MSwxMCBAQCBsaWJhYmlnYWls LnBjCiAgICAgYmFzaC1jb21wbGV0aW9uL01ha2VmaWxlXSkKIAogZG5sIFNv bWUgdGVzdCBzY3JpcHRzIGFyZSBnZW5lcmF0ZWQgYnkgYXV0b2Zvby4KLUFD X0NPTkZJR19GSUxFUyhbdGVzdHMvcnVudGVzdGNhbm9uaWNhbGl6ZXR5cGVz LnNoXSwgW2NobW9kICt4IHRlc3RzL3J1bnRlc3RjYW5vbmljYWxpemV0eXBl cy5zaF0pCitBQ19DT05GSUdfRklMRVMoW3Rlc3RzL3J1bnRlc3RjYW5vbmlj YWxpemV0eXBlcy5zaF0sCisJCVtjaG1vZCAreCB0ZXN0cy9ydW50ZXN0Y2Fu b25pY2FsaXpldHlwZXMuc2hdKQorQUNfQ09ORklHX0ZJTEVTKFt0ZXN0cy9y dW50ZXN0ZmVkYWJpcGtnZGlmZi5weV0sCisJCVtjaG1vZCAreCB0ZXN0cy9y dW50ZXN0ZmVkYWJpcGtnZGlmZi5weV0pCiAKIEFDX09VVFBVVAogCkBAIC0z ODQsNiArNDY3LDcgQEAgQUNfTVNHX05PVElDRShbCiAgICAgRW5hYmxlIGRl YiBzdXBwb3J0IGluIGFiaXBrZ2RpZmYgICAgICAgICAgICAgICA6ICR7RU5B QkxFX0RFQn0KICAgICBFbmFibGUgR05VIHRhciBhcmNoaXZlIHN1cHBvcnQg aW4gYWJpcGtnZGlmZiAgIDogJHtFTkFCTEVfVEFSfQogICAgIEVuYWJsZSBi YXNoIGNvbXBsZXRpb24JICAgICAgICAgICAgICAgICAgIDogJHtFTkFCTEVf QkFTSF9DT01QTEVUSU9OfQorICAgIEVuYWJsZSBmZWRhYmlwa2dkaWZmCQkJ ICAgOiAke0VOQUJMRV9GRURBQklQS0dESUZGfQogICAgIEdlbmVyYXRlIGh0 bWwgYXBpZG9jCSAgICAgICAgICAgICAgICAgICA6ICR7RU5BQkxFX0FQSURP Q30KICAgICBHZW5lcmF0ZSBodG1sIG1hbnVhbAkgICAgICAgICAgICAgICAg ICAgOiAke0VOQUJMRV9NQU5VQUx9CiBdKQpkaWZmIC0tZ2l0IGEvZG9jL21h bnVhbHMvTWFrZWZpbGUuYW0gYi9kb2MvbWFudWFscy9NYWtlZmlsZS5hbQpp bmRleCBmMjNkMWFiLi41MTI4YmMwIDEwMDY0NAotLS0gYS9kb2MvbWFudWFs cy9NYWtlZmlsZS5hbQorKysgYi9kb2MvbWFudWFscy9NYWtlZmlsZS5hbQpA QCAtMTAsNyArMTAsOCBAQCBjb25mLnB5IFwKIGluZGV4LnJzdCBcCiBsaWJh YmlnYWlsLWNvbmNlcHRzLnJzdCBcCiBsaWJhYmlnYWlsLW92ZXJ2aWV3LnJz dCBcCi1saWJhYmlnYWlsLXRvb2xzLnJzdAorbGliYWJpZ2FpbC10b29scy5y c3QgXAorZmVkYWJpcGtnZGlmZgogCiAjIFlvdSBjYW4gc2V0IHRoZXNlIHZh cmlhYmxlcyBmcm9tIHRoZSBjb21tYW5kIGxpbmUuCiBTUEhJTlhPUFRTICAg ID0KZGlmZiAtLWdpdCBhL2RvYy9tYW51YWxzL2NvbmYucHkgYi9kb2MvbWFu dWFscy9jb25mLnB5CmluZGV4IDJhNzAxOWYuLmEwOTY3YTIgMTAwNjQ0Ci0t LSBhL2RvYy9tYW51YWxzL2NvbmYucHkKKysrIGIvZG9jL21hbnVhbHMvY29u Zi5weQpAQCAtMjE5LDYgKzIxOSw3IEBAIG1hbl9wYWdlcyA9IFsKICAgICAo J2FiaWR3JywgJ2FiaWR3JywgdSdzZXJpYWxpemUgdGhlIEFCSSBvZiBhbiBF TEYgZmlsZScsIFt1J0RvZGppIFNla2V0ZWxpJ10sIDEpLAogICAgICgnYWJp bGludCcsICdhYmlsaW50JywgdSd2YWxpZGF0ZSBhbiBhYmlnYWlsIEFCSSBy ZXByZXNlbnRhdGlvbicsIFt1J0RvZGppIFNla2V0ZWxpJ10sIDEpLAogICAg ICgnYWJpY29tcGF0JywgJ2FiaWNvbXBhdCcsIHUnY2hlY2sgQUJJIGNvbXBh dGliaWxpdHknLCBbdSdEb2RqaSBTZWtldGVsaSddLCAxKSwKKyAgICAoJ2Zl ZGFiaXBrZ2RpZmYnLCAnZmVkYWJpcGtnZGlmZicsIHUnY29tcGFyZSBBQklz IG9mIEZlZG9yYSBwYWNrYWdlcycsIFt1J0NoZW54aW9uZyBRaSddLCAxKSwK IF0KIAogIyBJZiB0cnVlLCBzaG93IFVSTCBhZGRyZXNzZXMgYWZ0ZXIgZXh0 ZXJuYWwgbGlua3MuCmRpZmYgLS1naXQgYS9kb2MvbWFudWFscy9mZWRhYmlw a2dkaWZmLnJzdCBiL2RvYy9tYW51YWxzL2ZlZGFiaXBrZ2RpZmYucnN0Cm5l dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZTIzNjgKLS0t IC9kZXYvbnVsbAorKysgYi9kb2MvbWFudWFscy9mZWRhYmlwa2dkaWZmLnJz dApAQCAtMCwwICsxLDEwOCBAQAorLi4gX2ZlZGFiaXBrZ2RpZmZfbGFiZWw6 CisKKz09PT09PT09PT09PT09CitmZWRhYmlwa2dkaWZmCis9PT09PT09PT09 PT09PQorCitgYGZlZGFiaXBrZ2RpZmZgYCBjb21wYXJlcyBBQklzIG9mIEZl ZG9yYSBwYWNrYWdlcy4gSXQncyBhIGNvbnZlbmllbnQgd2F5IGZvcgorRmVk b3JhIHBhY2thZ2VycyB0byBydW4gYGBhYmlwa2dkaWZmYGAgYWdhaW5zdCB0 d28gUlBNIHBhY2thZ2VzIHdpdGggdGhlaXIgZGVidWcKK2luZm9ybWF0aW9u IHBhY2thZ2VzLiBXaXRoIHdlbGwgc3BlY2lmaWVkIG9wdGlvbnMsIGBgZmVk YWJpcGtnZGlmZmBgIGlzIGFibGUgdG8KK2hlbHAgcGFja2FnZXJzIHRvIGZp bmQgY29ycmVzcG9uZGluZyBSUE0gcGFja2FnZXMgZnJvbSBLb2ppLCBhbmQg dGhlbiwgaWYgZm91bmQsCitkb3dubG9hZCB0aGVtLCBhbmQgcnVuIGBgYWJp cGtnZGlmZmBgIGV2ZW50dWFsbHkgdG8gcmVwb3J0IHBvc3NpYmxlIEFCSSBj aGFuZ2VzLgorCisKKy4uIF9mZWRhYmlwa2dkaWZmX2ludm9jYXRpb25fbGFi ZWw6CisKK0ludm9jYXRpb24KKz09PT09PT09PT0KKworOjoKKworICAgZmVk YWJpcGtnZGlmZiBbb3B0aW9uXSA8TlZSPiAuLi4KKworCisuLiBfZmVkYWJp cGtnZGlmZl9vcHRpb25zX2xhYmVsOgorCitPcHRpb25zCis9PT09PT09CisK KyAgKiBgYC0taGVscCB8IC1oYGAKKworICAgIERpc3BsYXkgYSBzaG9ydCBo ZWxwIGFib3V0IHRoZSBjb21tYW5kIGFuZCBleGl0LgorCisgICogYGAtLWRy eS1ydW5gYAorCisgICAgRG9uJ3QgYWN0dWFsbHkgcnVuIGFiaXBrZ2RpZmYu IFRoZSBjb21tYW5kcyB0aGF0IHNob3VsZCBiZSBydW4gd2lsbCBiZSBzZW50 CisgICAgdG8gc3Rkb3V0LgorCisgICogYGAtLWRlYnVnYGAKKworICAgIFJ1 biBpbiBkZWJ1ZyBtb2RlLCB0byBzaG93IHZlcnkgZGV0YWlsIGRlYnVnIG91 dHB1dCBvZiBlYWNoIG1ldGhvZAorICAgIGludm9jYXRpb24gYW5kIGlucHV0 IHBhcmFtdGVycyBhbmQgcmV0dXJuZWQgcmVzdWx0LgorCisgICogYGAtLXRy YWNlYmFja2BgCisKKyAgICBTaG93IHRyYWNlYmFjayB3aGVuIHRoZXJlIGlz IGFuIGV4Y2VwdGlvbiB0aHJvd24uIFRoaXMgY291bGQgYmUgdXNlZnVsIGZv cgorICAgIGRldmVsb3BlcnMgdG8ga25vdyB3aGF0IGFuZCB3aGVyZSB0aGUg ZXJyb3IgaXMuCisKKyAgKiBgYC0tc2VydmVyYGAgPFVSTD4KKworICAgIFVS TCBvZiBrb2ppIFhNTFJQQyBzZXJ2aWNlLiBEZWZhdWx0IGlzIGh0dHA6Ly9r b2ppLmZlZG9yYXByb2plY3Qub3JnL2tvamlodWIKKworICAqIGBgLS10b3Bk aXJgYCA8VVJMPgorCisgICAgVVJMIGZvciBSUE0gZmlsZXMgYWNjZXNzLiBE ZWZhdWx0IGlzIGh0dHBzOi8va29qaXBrZ3MuZmVkb3JhcHJvamVjdC5vcmcK KworICAqIGBgLS1mcm9tYGAgPGRpc3Rybz4KKworICAgIEJhc2VsaW5lIEZl ZG9yYSBkaXN0cm9idXRpb24gZnJvbSB3aGVyZSB0byBmaW5kIHByb3BlciBi dWlsZCB0aGF0IGlzIHVzZWQKKyAgICBmb3IgY29tcGFyaXNvbi4gZGlzdHJv IGNvdWxkIGJlIGFueSB2YWxpZCB2YWx1ZSBvZiBSUE0gbWFjcm8gYGAlez9k aXN0fWBgCisgICAgZm9yIEZlZG9yYSwgZm9yIGV4YW1wbGUsIGBgZmM0YGAs IGBgZmMyM2BgLCBgYGZjMjVgYC4KKworICAqIGBgLS10b2BgIDxkaXN0cm8+ CisKKyAgICBUaGUgRmVkb3JhIGRpc3Ryb2J1dGlvbiBmcm9tIHdoZXJlIHRv IGZpbmQgYSBwcm9wZXIgYnVpbGQgdGhhdCBpcyBjb21wYXJlZAorICAgIHdp dGggdGhlIGJhc2VsaW5lIHNwZWNpZmllZCBieSBvcHRpb24gYGAtLWZyb21g YC4KKworCisuLiBfZmVkYWJpcGtnZGlmZl9yZXR1cm5fdmFsdWVfbGFiZWw6 CisKK1JldHVybiB2YWx1ZQorPT09PT09PT09PT09CisKK1RoZSBleGl0IGNv ZGUgb2YgdGhlIGBgYWJpcGtnZGlmZmBgIGRlcGVuZHMgb24gdGhlIDpyZWY6 YHJldHVybiBjb2RlCis8YWJpcGtnZGlmZl9yZXR1cm5fdmFsdWVfbGFiZWw+ YCBmcm9tIHVuZGVybHlpbmcgYWJpcGtnZGlmZi4gVGhlIGV4aXQgY29kZSBp cworZWl0aGVyIDAgaWYgYWxsIGBgYWJpcGtnZGlmZmBgIGludm9jYXRpb25z IHN1Y2NlZWQgYW5kIG5vIEFCSSBjaGFuZ2VzIGJldHdlZW4KK3BhY2thZ2Vz LCBvciBub24temVybyB0aGF0IGlzIHJldHVybmVkIGJ5IHRoZSBsYXN0IGBg YWJpcGtnZGlmZmBgIGludm9jYXRpb24uCisKKworLi4gX2ZlZGFiaXBrZ2Rp ZmZfdXNhZ2VfZXhhbXBsZV9sYWJlbDoKKworCitVc2UgY2FzZXMKKz09PT09 PT09PQorCitTZXZlcmFsIGNhc2VzIGBgZmVkYWJpcGtnZGlmZmBgIGlzIHN1 cHBvcnRpbmcgY3VycmVjdGx5IGFyZSBzaG93biBoZXJlLgorCisgIDEuIENv bXBhcmUgQUJJcyBvZiBsb2NhbCBwYWNrYWdlIHdpdGggbGF0ZXN0IHN0YWJs ZSBwYWNrYWdlIGZyb20gS29qaS4KKyAgICAgU3VwcG9zZSwgeW91IGhhdmUg YnVpbHQgcGFja2FnZXMgZm9yIGh0dHBkLCBhbmQgeW91IHdvdWxkIGxpa2Ug dG8gY29tcGFyZQorICAgICB0aGUgQUJJIG9mIHRoaXMgbG9jYWxseSBidWls dCBwYWNrYWdlIHdpdGggdGhlIGxhdGVzdCBzdGFibGUgcGFja2FnZQorICAg ICBidWlsdCBmb3IgRmVkb3JhIDIzLiA6OgorCisgICAgICAgJCBmZWRhYmlw a2dkaWZmIC0tZnJvbSBmYzIzIC4vaHR0cGQtMi40LjE4LTIuZmMyNC54ODZf NjQucnBtCisKKyAgMi4gQ29tcGFyZSBBQklzIG9mIHBhY2thZ2UgaHR0cGQg YmV0d2VlbiBGZWRvcmEgMjMgYW5kIDI0LiA6OgorCisgICAgICAgJCBmZWRh Ymlwa2dkaWZmIC0tZnJvbSBmYzIzIC0tdG8gZmMyNCBodHRwZAorCisgIDMu IENvbXBhcmUgQUJJcyBvZiBwYWNrYWdlIGh0dHBkIGRlc2lnbmF0ZWQgYnkg bmFtZSwgdmVyc2lvbiBhbmQgcmVsZWFzZSwKKyAgICAgZXZlbiB3aXRoIGEg c3BlY2lmaWMgYXJjaCwgZm9yIGV4YW1wbGUgeDg2XzY0LiA6OgorCisgICAg ICAgJCBmZWRhYmlwa2dkaWZmIGh0dHBkLTIuOC4xNC5mYzIzIGh0dHBkLTIu OC4xNC5mYzI0CisgICAgICAgJCBmZWRhYmlwa2dkaWZmIGh0dHBkLTIuOC4x NC5mYzIzLng4Nl82NCBodHRwZC0yLjguMTQuZmMyNC54ODZfNjQKKworICA0 LiBXaXRoaW4gY2FzZSAzLCBpbiBhZGRpdGlvbiwgcGFja2FnZXIgaXMgYWxz byBhYmxlIHRvIGNvbXBhcmUgYWxsIHBhY2thZ2VzCisgICAgIHJhdGhlciB0 aGFuIHNwZWNpZmllZCBwYWNrYWdlIG9ubHkuIE9idmlvdXNseSwgYm90aCBu b2FyY2ggYW5kIHNyYyBwYWNrYWdlcworICAgICBhcmUgZXhjbHVkZWQuIDo6 CisKKyAgICAgICAkIGZlZGFiaXBrZ2RpZmYgLS1hbGwtc3VicGFja2FnZXMg aHR0cGQtMi44LjE0LmZjMjMgaHR0cGQtMi44LjE0LmZjMjQKZGlmZiAtLWdp dCBhL2RvYy9tYW51YWxzL2xpYmFiaWdhaWwtdG9vbHMucnN0IGIvZG9jL21h bnVhbHMvbGliYWJpZ2FpbC10b29scy5yc3QKaW5kZXggMmY3ZjRjMS4uZDNk MjQ5MiAxMDA2NDQKLS0tIGEvZG9jL21hbnVhbHMvbGliYWJpZ2FpbC10b29s cy5yc3QKKysrIGIvZG9jL21hbnVhbHMvbGliYWJpZ2FpbC10b29scy5yc3QK QEAgLTIwLDMgKzIwLDQgQEAgVG9vbHMgbWFudWFscwogICAgYWJpY29tcGF0 CiAgICBhYmlkdwogICAgYWJpbGludAorICAgZmVkYWJpcGtnZGlmZgpkaWZm IC0tZ2l0IGEvdGVzdHMvTWFrZWZpbGUuYW0gYi90ZXN0cy9NYWtlZmlsZS5h bQppbmRleCBjYWY0OWU2Li45NTNkZmVmIDEwMDY0NAotLS0gYS90ZXN0cy9N YWtlZmlsZS5hbQorKysgYi90ZXN0cy9NYWtlZmlsZS5hbQpAQCAtMzEsOSAr MzEsMTAgQEAgcnVudGVzdGxvb2t1cHN5bXMJCVwKIHJ1bnRlc3RhbHRkd2Fy ZgkJCVwKIHJ1bnRlc3Rjb3JlZGlmZgkJCVwKIHJ1bnRlc3RhYmlkaWZmZXhp dAkJXAorcnVudGVzdGZlZGFiaXBrZ2RpZmYucHkJCVwKICQoQ1hYMTFfVEVT VFMpCiAKLUVYVFJBX0RJU1QgPSBydW50ZXN0Y2Fub25pY2FsaXpldHlwZXMu c2guaW4KK0VYVFJBX0RJU1QgPSBydW50ZXN0Y2Fub25pY2FsaXpldHlwZXMu c2guaW4gcnVudGVzdGZlZGFiaXBrZ2RpZmYucHkuaW4KIENMRUFORklMRVMg PSBcCiAgcnVudGVzdGNhbm9uaWNhbGl6ZXR5cGVzLm91dHB1dC50eHQgXAog IHJ1bnRlc3RjYW5vbmljYWxpemV0eXBlcy5vdXRwdXQuZmluYWwudHh0CkBA IC0xMTQsNiArMTE1LDkgQEAgcHJpbnRkaWZmdHJlZV9MREFERCA9ICQodG9w X2J1aWxkZGlyKS9zcmMvbGliYWJpZ2FpbC5sYQogcnVudGVzdGNhbm9uaWNh bGl6ZXR5cGVzX3NoX1NPVVJDRVMgPQogcnVudGVzdGNhbm9uaWNhbGl6ZXR5 cGVzLnNoJChFWEVFWFQpOgogCitydW50ZXN0ZmVkYWJpcGtnZGlmZl9weV9T T1VSQ0VTID0KK3J1bnRlc3RmZWRhYmlwa2dkaWZmLnB5JChFWEVFWFQpOgor CiBBTV9DUFBGTEFHUz0tSSR7YWJzX3RvcF9zcmNkaXJ9L2luY2x1ZGUgXAog LUkke2Fic190b3BfYnVpbGRkaXJ9L2luY2x1ZGUgLUkke2Fic190b3Bfc3Jj ZGlyfS90b29scyAtZlBJQwogCmRpZmYgLS1naXQgYS90ZXN0cy9ydW50ZXN0 ZmVkYWJpcGtnZGlmZi5weS5pbiBiL3Rlc3RzL3J1bnRlc3RmZWRhYmlwa2dk aWZmLnB5LmluCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAu Ljg0YTQzMjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9ydW50ZXN0ZmVk YWJpcGtnZGlmZi5weS5pbgpAQCAtMCwwICsxLDYzNCBAQAorIyEvdXNyL2Jp bi9weXRob24KKyMgLSotIGNvZGluZzogdXRmLTggLSotCisjIC0qLSBNb2Rl OiBQeXRob24KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBB cHBsaWNhdGlvbiBCaW5hcnkgSW50ZXJmYWNlIEdlbmVyaWMKKyMgQW5hbHlz aXMgYW5kIEluc3RydW1lbnRhdGlvbiBMaWJyYXJ5IChsaWJhYmlnYWlsKS4g IFRoaXMgbGlicmFyeSBpcworIyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJl ZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZQorIyB0 ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVi bGlzaGVkIGJ5IHRoZQorIyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVp dGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisjIGxh dGVyIHZlcnNpb24uCisjCisjIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRl ZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyMg V0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGll ZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBG T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorIyBHZW5l cmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlv dSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5l cmFsIFB1YmxpYworIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFt OyBzZWUgdGhlIGZpbGUgQ09QWUlORy1HUExWMy4gIElmCisjIG5vdCwgc2Vl IDxodHRwOiN3d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorIworIyBBdXRob3I6 IENoZW54aW9uZyBRaQorCitpbXBvcnQgb3MKK2ltcG9ydCBpdGVydG9vbHMK K2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgc2h1 dGlsCisKK2ltcG9ydCBrb2ppCisKKyIiIgorVGhpcyB0ZXN0IGhhcm5lc3Mg dGVzdHMgdmFyaW91cyBnbG9iYWwgbWV0aG9kcyBhbmQgY2xhc3NlcyB3aXRo aW4KK3Rvb2xzL2ZlZGFiaXBrZ2RpZmYuCisiIiIKKwordHJ5OgorICAgIGZy b20gbW9jayBpbXBvcnQgcGF0Y2gKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAg ICBpbXBvcnQgc3lzCisgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCBcCisgICAg ICAgICdtb2NrIGlzIHJlcXVpcmVkIHRvIHJ1biB0ZXN0cy4gUGxlYXNlIGlu c3RhbGwgYmVmb3JlIHJ1bm5pbmcgdGVzdHMuJworICAgIHN5cy5leGl0KDEp CisKK2ltcG9ydCBpbXAKKyMgSW1wb3J0IHRoZSBmZWRhYmlwa2dkaWZmIHBy b2dyYW0gZmlsZSBmcm9tIHRoZSBzb3VyY2UgZGlyZWN0b3J5LgorZmVkYWJp cGtnZGlmZl9tb2QgPSBpbXAubG9hZF9zb3VyY2UoJ2ZlZGFiaWRpZmYnLAor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0B0b3Bfc3Jj ZGlyQC90b29scy9mZWRhYmlwa2dkaWZmJykKKworIyBVc2VkIHRvIGdlbmVy YXRlIGludGVnZXIgdmFsdWVzIChncmVhdGVyIG9yIGVxdWFsIHRvIHplcm8p IGluCisjIFJ1bkFiaXBrZ2RpZmZUZXN0LnRlc3RfcGFydGlhbF9mYWlsdXJl LCB0aG9zZSB2YWx1ZXMgc2ltdWxhdGUgcmV0dXJuIGNvZGUKKyMgZnJvbSBy dW5fYWJpcGtnZGlmZi4gVG8gcmVwcmVzZW50IHBhcnRpYWwgZmFpbHVyZSwg Y291bnRlciBtdXN0IHN0YXJ0IGZyb20gMC4KK2NvdW50ZXIgPSBpdGVydG9v bHMuY291bnQoMCkKKworIyBwcmVmaXggZm9yIGNyZWF0aW5nIGEgdGVtcG9y YXJ5IGZpbGUgb3IgZGlyZWN0b3J5LiBUaGUgbmFtZSB3b3VsZCBiZQorIyBm ZWRhYmlwa2dkaWZmLXRlc3Qtc2xrdzNrc294Cit0ZW1wX2ZpbGVfb3JfZGly X3ByZWZpeCA9ICdmZWRhYmlwa2dkaWZmLXRlc3QtJworCisKK2NsYXNzIFV0 aWxzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9p c19kaXN0cm9fdmFsaWQoc2VsZik6CisgICAgICAgICIiIlRlc3QgaXNfZmVk b3JhX2Rpc3RybyBtZXRob2QKKworICAgICAgICBpc19mZWRvcmFfZGlzdHJv IGFpbXMgdG8gdGVzdCBpZiBhIHN0cmluZyBpcyBhIHZhbGlkIEZlZG9yYSBk aXN0cm8uIEkKKyAgICAgICAgZG9uJ3Qgc2VlIHRoZXJlIGlzIGEgZ2VuZXJh bCBydWxlIG9yIGZvcm1hdCBkZWZpbml0aW9uIGZvciBzdWNoIGEKKyAgICAg ICAgRmVkb3JhIGRpc3Ryby4gSSByZWZlciB0byBzZWNvbmQgcGFydCBvZiAl e2Rpc3R9IHNwbGl0ZWQgYnkgZG90IGFzIHRoZQorICAgICAgICByZWZlcmVu Y2UuIEdlbmVyYWxseSwgZmM0LCBmYzE5LCBmYzIzIGFyZSB2YWxpZCBvbmVz LCBhbmQgZWw2LCBlbDcgYXJlCisgICAgICAgIGFsc28gdmFsaWQgb25lIGN1 cnJlbnRseS4KKyAgICAgICAgIiIiCisgICAgICAgIGRpc3RybyA9ICdmYzUn CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmZWRhYmlwa2dkaWZmX21vZC5p c19kaXN0cm9fdmFsaWQoZGlzdHJvKSkKKworICAgICAgICBkaXN0cm8gPSAn ZjUnCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZmVkYWJpcGtnZGlmZl9t b2QuaXNfZGlzdHJvX3ZhbGlkKGRpc3RybykpCisKKyAgICAgICAgZGlzdHJv ID0gJ2ZjMjMnCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmZWRhYmlwa2dk aWZmX21vZC5pc19kaXN0cm9fdmFsaWQoZGlzdHJvKSkKKworICAgICAgICBk aXN0cm8gPSAnZmMnCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZmVkYWJp cGtnZGlmZl9tb2QuaXNfZGlzdHJvX3ZhbGlkKGRpc3RybykpCisKKyAgICAg ICAgZGlzdHJvID0gJ2ZjMjM0JworICAgICAgICBzZWxmLmFzc2VydEZhbHNl KGZlZGFiaXBrZ2RpZmZfbW9kLmlzX2Rpc3Ryb192YWxpZChkaXN0cm8pKQor CisgICAgICAgIGRpc3RybyA9ICdlbDcnCisgICAgICAgIHNlbGYuYXNzZXJ0 VHJ1ZShmZWRhYmlwa2dkaWZmX21vZC5pc19kaXN0cm9fdmFsaWQoZGlzdHJv KSkKKworICAgICAgICBkaXN0cm8gPSAnZWw3XzInCisgICAgICAgIHNlbGYu YXNzZXJ0RmFsc2UoZmVkYWJpcGtnZGlmZl9tb2QuaXNfZGlzdHJvX3ZhbGlk KGRpc3RybykpCisKKworY2xhc3MgUlBNVGVzdCh1bml0dGVzdC5UZXN0Q2Fz ZSk6CisgICAgIiIiVGVzdCBjYXNlIGZvciBSUE0gY2xhc3MKKworICAgIFJQ TSBjbGFzcyBpcyBhIGNsYXNzIHdyYXBwaW5nIGEgdW5kZXJseWluZyBkaWN0 IG9iamVjdCByZXByZXNldGluZyBhIFJQTQorICAgIGluZm9ybWF0aW9uLCB0 aGF0IGlzIHJldHVybmVkIGZyb20gS29qaSBYTUxSUEMgQVBJcy4KKworICAg IFRoaXMgdGVzdCBhaW1zIHRvIHRlc3QgdGhlIGNsYXNzIHRvIHNlZSBpZiBS UE0gYXR0cmlidXRlcyBpcyBhY2Nlc3NpYmxlIGluCisgICAgUHl0aG9uIGNs YXNzIGF0dHJpYnV0ZSB3YXksIGFuZCBpZiBhIFJQTSBpcyBzcGVjaWZpYyB0 eXBlIG9mIFJQTSwgZm9yCisgICAgZXhhbXBsZSwgaWYgaXQncyBhIGRlYnVn aW5mby4KKyAgICAiIiIKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAg ICAgIiIiU2V0dXAgdGVzdCBkYXRhIGZvciB0ZXN0aW5nIFJQTSBjbGFzcwor CisgICAgICAgIEFjY29yZGluZyB0byB0aGUgdGVzdHMsIGl0J3MgdW5uZWNl c3NhcnkgdG8gY29udHJ1Y3QgYSBjb21wbGV0ZSBkaWN0CisgICAgICAgIGNv bnRhaW5pbmcgZnVsbCBSUE0gaW5mb3JtYXRpb24uIFNvLCBvbmx5IHBhcnQg b2Ygb2YgdGhlbSBpcworICAgICAgICBlbm91Z2guIFRoaXMgdGVzdCBjYXNl IG9ubHkgbmVlZCBuYW1lLCB2ZXJzaW9uLCByZWxlYXNlLCBhbmQgYXJjaC4K KworICAgICAgICBJbiBjYXNlIEtvamkgY2hhbmdlcyB0aGUgbmFtZSBvZiBu YW1lLCB2ZXJzaW9uLCByZWxlYXNlIG9yIGFyY2ggaW4gdGhlCisgICAgICAg IGZ1dHVyZSB0byBleHByZXNzIHNhbWUgbWVhbmluZyBpbmRpdmlkdWFsbHks IChJIGRvbid0IHRoaW5rIGl0IGNvdWxkCisgICAgICAgIGhhcHBlbiksIHBs ZWFzZSB1cGRhdGUgdGhlcmUgYWxzby4KKyAgICAgICAgIiIiCisKKyAgICAg ICAgIyBBcmd1bWVudCBwYXNzZWQgdG8gUlBNLl9faW5pdF9fIHRvIGNvbnN0 cnVjdCBhIFJQTSBjbGFzcyBvYmplY3QsIHRoYXQKKyAgICAgICAgIyByZXBy ZXNlbnRzIGEgZGVidWdpbmZvIFJQTS4KKyAgICAgICAgc2VsZi5kZWJ1Z2lu Zm9fcnBtX2luZm8gPSB7CisgICAgICAgICAgICAnYXJjaCc6ICdpNjg2JywK KyAgICAgICAgICAgICduYW1lJzogJ2h0dHBkLWRlYnVnaW5mbycsCisgICAg ICAgICAgICAncmVsZWFzZSc6ICcxLmZjMjInLAorICAgICAgICAgICAgJ3Zl cnNpb24nOiAnMi40LjE4JworICAgICAgICAgICAgfQorCisgICAgICAgICMg QXJndW1lbnQgcGFzc2VkIHRvIFJQTS5fX2luaXRfXyB0byBjb25zdHJ1Y3Qg YSBSUE0gY2xhc3Mgb2JqZWN0LCB0aGF0CisgICAgICAgICMgcmVwcmVzZW50 cyBhIFJQTS4KKyAgICAgICAgc2VsZi5ycG1faW5mbyA9IHsKKyAgICAgICAg ICAgICdhcmNoJzogJ3g4Nl82NCcsCisgICAgICAgICAgICAnbmFtZSc6ICdo dHRwZCcsCisgICAgICAgICAgICAncmVsZWFzZSc6ICcxLmZjMjInLAorICAg ICAgICAgICAgJ3ZlcnNpb24nOiAnMi40LjE4JworICAgICAgICAgICAgfQor CisgICAgZGVmIHRlc3RfYXR0cmlidXRlX2FjY2VzcyhzZWxmKToKKyAgICAg ICAgIiIiRW5zdXJlIHdyYXBwZWQgUlBNIGluZm9ybWF0aW9uIGlzIGFjY2Vz c2libGUgdmlhIGF0dHJpYnV0ZSIiIgorICAgICAgICBycG0gPSBmZWRhYmlw a2dkaWZmX21vZC5SUE0oc2VsZi5kZWJ1Z2luZm9fcnBtX2luZm8pCisgICAg ICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNlbGYuZGVidWdpbmZvX3JwbV9pbmZv WydhcmNoJ10sIHJwbS5hcmNoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFs cyhzZWxmLmRlYnVnaW5mb19ycG1faW5mb1snbmFtZSddLCBycG0ubmFtZSkK KyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc2VsZi5kZWJ1Z2luZm9fcnBt X2luZm9bJ3JlbGVhc2UnXSwgcnBtLnJlbGVhc2UpCisgICAgICAgIHNlbGYu YXNzZXJ0RXF1YWxzKHNlbGYuZGVidWdpbmZvX3JwbV9pbmZvWyd2ZXJzaW9u J10sIHJwbS52ZXJzaW9uKQorCisgICAgZGVmIHRlc3RfcmFpc2VfZXJyb3Jf aWZfbmFtZV9ub3RfZXhpc3Qoc2VsZik6CisgICAgICAgICIiIgorICAgICAg ICBFbnN1cmUgQXR0cmlidXRlRXJyb3Igc2hvdWxkIGJlIHJhaXNlZCB3aGVu IGFjY2Vzc2luZyBhIG5vbi1leGlzdGVudAorICAgICAgICBhdHRyaWJ1dGUK KyAgICAgICAgIiIiCisgICAgICAgIHJwbSA9IGZlZGFiaXBrZ2RpZmZfbW9k LlJQTSh7fSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcnBtLnh4eHh4 CisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAg ICMgU3VjY2VlZCwgZXhpdCBub3JtYWxseQorICAgICAgICAgICAgcmV0dXJu CisgICAgICAgIHNlbGYuZmFpbCgnQXR0cmlidXRlRXJyb3Igc2hvdWxkIGJl IHJhaXNlZCwgYnV0IG5vdC4nKQorCisgICAgZGVmIHRlc3RfaXNfZGVidWdp bmZvKHNlbGYpOgorICAgICAgICAiIiJFbnN1cmUgdG8gcmV0dXJuIFRydWUg aWYgYSBSUE0ncyBuYW1lIGNvbnRhaW5zIC1kZWJ1Z2luZm8iIiIKKyAgICAg ICAgcnBtID0gZmVkYWJpcGtnZGlmZl9tb2QuUlBNKHNlbGYuZGVidWdpbmZv X3JwbV9pbmZvKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocnBtLmlzX2Rl YnVnaW5mbykKKworICAgICAgICBycG0gPSBmZWRhYmlwa2dkaWZmX21vZC5S UE0oc2VsZi5ycG1faW5mbykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShy cG0uaXNfZGVidWdpbmZvKQorCisgICAgZGVmIHRlc3RfbnZyYShzZWxmKToK KyAgICAgICAgIiIiCisgICAgICAgIEVuc3VyZSB2YWx1ZSBmcm9tIFJQTS5u dnJhIGlzIHBhcnNhYmxlIGFuZCBjb250YWlucyBjb3JyZWN0IHZhbHVlIGZy b20KKyAgICAgICAgdW5kZXJseWluZyBSUE0gaW5mb3JtYXRpb24KKyAgICAg ICAgIiIiCisgICAgICAgIHJwbSA9IGZlZGFiaXBrZ2RpZmZfbW9kLlJQTShz ZWxmLnJwbV9pbmZvKQorICAgICAgICBudnJhID0ga29qaS5wYXJzZV9OVlJB KHJwbS5udnJhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhudnJhWydu YW1lJ10sIHJwbS5uYW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhu dnJhWyd2ZXJzaW9uJ10sIHJwbS52ZXJzaW9uKQorICAgICAgICBzZWxmLmFz c2VydEVxdWFscyhudnJhWydyZWxlYXNlJ10sIHJwbS5yZWxlYXNlKQorICAg ICAgICBzZWxmLmFzc2VydEVxdWFscyhudnJhWydhcmNoJ10sIHJwbS5hcmNo KQorCisgICAgZGVmIHRlc3Rfc3RyX3JlcHJlc2VudGF0aW9uKHNlbGYpOgor ICAgICAgICAiIiIKKyAgICAgICAgRW5mb3JjZSBhIFJQTSBvYmplY3QgaGFz IHNhbWUgc3RyaW5nIHJlcHJlc2V0YXRpb24gYXMgdW5kZXJseWluZworICAg ICAgICB3cmFwcGVkIHJwbSBpbmZvcm1hdGlvbiB0aGF0IGlzIGEgZGljdCBv YmplY3QuCisgICAgICAgICIiIgorICAgICAgICBycG0gPSBmZWRhYmlwa2dk aWZmX21vZC5SUE0oc2VsZi5ycG1faW5mbykKKyAgICAgICAgc2VsZi5hc3Nl cnRFcXVhbHMoc3RyKHNlbGYucnBtX2luZm8pLCBzdHIocnBtKSkKKworCitj bGFzcyBMb2NhbFJQTVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIi IlRlc3QgY2FzZSBmb3IgTG9jYWxSUE0gY2xhc3MKKworICAgIEJlY2F1c2Ug TG9jYWxSUE0gaW5oZXJpdHMgZnJvbSBSUE0sIGFsbCB0ZXN0cyBhZ2FpbnN0 IFJQTSBjbGFzcyBhcmUgYWxzbworICAgIGFwcGxpZWQgdG8gTG9jYWxSUE0s IHNvIEkgZG9uJ3QgcmVwZWF0IHRoZW0gYWdhaW4gaGVyZS4gVGhpcyB0ZXN0 IGNhc2UKKyAgICBtYWlubHkgZm9jdXMgb24gdGhlIGFiaWxpdGllcyBhZ2Fp bnN0IGZpbGVzIG9uIHRoZSBsb2NhbCBkaXNrLgorICAgICIiIgorCisgICAg ZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAjIEEgUlBNIGZpbGVuYW1lIHRo YXQgc2ltdWxhdGVzIGEgUlBNIGZpbGUgdGhhdCBpcyBzdG9yZWQgc29tZXdo ZXJlIG9uCisgICAgICAgICMgdGhlIGRpc2suCisgICAgICAgICMgVGhpcyBp cyB0aGUgb25seSBhcmd1bWVudCBwYXNzZWQgdG8gTG9jYWxSUE0uX19pbml0 X18gdG8gaW5pdGlhbGl6ZQorICAgICAgICAjIGFuIG9iamVjdC4KKyAgICAg ICAgc2VsZi5maWxlbmFtZSA9ICdodHRwZC0yLjQuMTgtMS5mYzIyLng4Nl82 NC5ycG0nCisKKyAgICBkZWYgdGVzdF9maWxlX3BhcnNlcl93aXRob3V0X3Bh dGgoc2VsZik6CisgICAgICAgICIiIkVuc3VyZSBMb2NhbFJQTSBjYW4gZ2V0 IFJQTSBpbmZvcm1hdGlvbiBmcm9tIGEgZmlsZW5hbWUKKworICAgICAgICBM b2NhbFJQTSBnZXRzIG5hbWUsIHZlcnNpb24sIHJlbGVhc2UsIGFuZCBhcmNo IG9mIGEgUlBNIGJ5IHBhcnNpbmcgdGhlCisgICAgICAgIHBhc3NlZCBmaWxl bmFtZSB0byBfX2luaXRfXyBtZXRob2QuIFRoZW4sIGFsbCB0aGVzZSBpbmZv cm1hdGlvbiBpcworICAgICAgICBhY2Nlc3NpYmxlIHZpYSBMb2NhbFJQTSBu YW1lLCB2ZXJzaW9uLCByZWxlYXNlLCBhbmQgYXJjaCBhdHRyaWJ1dGUuCisK KyAgICAgICAgQSBmaWxlbmFtZSBlaXRoZXIgd2l0aCBhbiBhYnNvbHV0ZSBw YXRoLCByZWxhdGl2ZSBwYXRoLCBvciB3aXRob3V0IGEKKyAgICAgICAgcGF0 aCwgTG9jYWxSUE0gc2hvdWxkIGJlIGFibGUgdG8gZmluZCB0aGVzZSBmaWxl cyBhbmQgZ2V0IGNvcnJlY3QKKyAgICAgICAgaW5mb3JtYXRpb24gYnkgcmVt b3ZpbmcgdGhlIHBvdGVudGlhbCBwcmVzZW50IHBhdGguIEZvciBleGFtcGxl LCBieQorICAgICAgICBnaXZpbmcgZm9sbG93aW5nIGZpbGVuYW1lcywKKwor ICAgICAgICAtIGh0dHBkLTIuNC4xOC0xLmZjMjIueDg2XzY0LnJwbQorICAg ICAgICAtIGFydGlmYWN0cy9odHRwZC0yLjQuMTgtMS5mYzIyLng4Nl82NC5y cG0KKyAgICAgICAgLSAvbW50L2tvamkvcGFja2FnZXMvaHR0cGQvMi40LjE4 LzEuZmMyMi9odHRwZC0yLjQuMTgtMS5mYzIyLng4Nl82NC5ycG0KKworICAg ICAgICBMb2NhbFJQTSBoYXMgdG8gZGV0ZXJtaW5lIHRoZSBuZWNlc3Nhcnkg UlBNIGluZm9ybWF0aW9uIGZyb20KKyAgICAgICAgaHR0cGQtMi40LjE4LTEu ZmMyMi54ODZfNjQucnBtCisKKyAgICAgICAgV2l0aG91dCBzcGVjaWZ5aW5n IHBhdGggaW4gdGhlIGZpbGVuYW1lLCBpdCB1c3VhbGx5IG1lYW5zIExvY2Fs UlBNCisgICAgICAgIHNob3VsZCBmaW5kIHRoZSBSUE0gZmlsZSByZWxhdGl2 ZSB0byBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiBTbywgbm8KKyAgICAg ICAgbmVlZCBvZiBhZGRpdGlvbmFsIHRlc3QgYWdhaW5zdCBhIGZpbGVuYW1l IHdpdGggYSByZWxhdGl2ZSBwYXRoLgorICAgICAgICAiIiIKKyAgICAgICAg cnBtID0gZmVkYWJpcGtnZGlmZl9tb2QuTG9jYWxSUE0oc2VsZi5maWxlbmFt ZSkKKyAgICAgICAgbnZyYSA9IGtvamkucGFyc2VfTlZSQShzZWxmLmZpbGVu YW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhudnJhWyduYW1lJ10s IHJwbS5uYW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhudnJhWyd2 ZXJzaW9uJ10sIHJwbS52ZXJzaW9uKQorICAgICAgICBzZWxmLmFzc2VydEVx dWFscyhudnJhWydyZWxlYXNlJ10sIHJwbS5yZWxlYXNlKQorICAgICAgICBz ZWxmLmFzc2VydEVxdWFscyhudnJhWydhcmNoJ10sIHJwbS5hcmNoKQorCisg ICAgICAgIGZ1bGxfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oJy8nLCAndG1w Jywgc2VsZi5maWxlbmFtZSkKKyAgICAgICAgcnBtID0gZmVkYWJpcGtnZGlm Zl9tb2QuTG9jYWxSUE0oZnVsbF9maWxlbmFtZSkKKyAgICAgICAgbnZyYSA9 IGtvamkucGFyc2VfTlZSQShzZWxmLmZpbGVuYW1lKQorICAgICAgICBzZWxm LmFzc2VydEVxdWFscyhudnJhWyduYW1lJ10sIHJwbS5uYW1lKQorICAgICAg ICBzZWxmLmFzc2VydEVxdWFscyhudnJhWyd2ZXJzaW9uJ10sIHJwbS52ZXJz aW9uKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhudnJhWydyZWxlYXNl J10sIHJwbS5yZWxlYXNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhu dnJhWydhcmNoJ10sIHJwbS5hcmNoKQorICAgICAgICBzZWxmLmFzc2VydEVx dWFscyhmdWxsX2ZpbGVuYW1lLCBycG0uZG93bmxvYWRlZF9maWxlKQorCisg ICAgQHBhdGNoKCdvcy5wYXRoLmV4aXN0cycpCisgICAgZGVmIHRlc3RfZmlu ZF9leGlzdGVudF9kZWJ1Z2luZm8oc2VsZiwgbW9ja19leGlzdHMpOgorICAg ICAgICAiIiJFbnN1cmUgTG9jYWxSUE0gY2FuIGZpbmQgYW4gYXNzb2NpYXRl ZCBleGlzdGVudCBkZWJ1Z2luZm8gUlBNCisKKyAgICAgICAgQ3VycmVudGx5 LCBmaW5kX2RlYnVnaW5mbyBpcyBvbmx5IGFibGUgdG8gZmluZCBhc3NvY2lh dGVkIGRlYnVnaW5mbyBSUE0KKyAgICAgICAgZnJvbSB0aGUgZGlyZWN0b3J5 IHdoZXJlIGxvY2FsIFJQTSByZXNpZGVzLiBUaGlzIHRlc3Qgd29ya3MgZm9y IHRoaXMKKyAgICAgICAgY2FzZSBhdCB0aGlzIG1vbWVudC4gSWYgdGhlcmUg aXMgYSByZXF1aXJlbWVudCB0byBhbGxvdyBmaW5kIGRlYnVnaW5mbworICAg ICAgICBSUE0gZnJvbSBzb21ld2hlcmUgZWxzZSwgYW55IGxldmVsIG9mIHN1 YmRpcmVjdG9yeSBmb3IgaW5zdGFuY2UsIGFkZAorICAgICAgICBuZXcgdGVz dCBjYXNlIGZvciB0aGF0LCBhbmQgdXBkYXRlIHRoZXNlIHdvcmRzIHlvdSBh cmUgcmVhZGluZyA6KQorICAgICAgICAiIiIKKyAgICAgICAgbW9ja19leGlz dHMucmV0dXJuX3ZhbHVlID0gVHJ1ZQorCisgICAgICAgIHJwbSA9IGZlZGFi aXBrZ2RpZmZfbW9kLkxvY2FsUlBNKHNlbGYuZmlsZW5hbWUpCisgICAgICAg IHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHJwbSwgZmVkYWJpcGtnZGlm Zl9tb2QuTG9jYWxSUE0pKQorCisgICAgICAgIG52cmEgPSBrb2ppLnBhcnNl X05WUkEoc2VsZi5maWxlbmFtZSkKKyAgICAgICAgZXhwZWN0ZWRfZGVidWdp bmZvID0gZmVkYWJpcGtnZGlmZl9tb2QuTG9jYWxSUE0oCisgICAgICAgICAg ICAnJShuYW1lKXMtZGVidWdpbmZvLSUodmVyc2lvbilzLSUocmVsZWFzZSlz LiUoYXJjaClzLnJwbScgJSBudnJhKQorICAgICAgICBkZWJ1Z2luZm8gPSBy cG0uZmluZF9kZWJ1Z2luZm8oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFs cyhleHBlY3RlZF9kZWJ1Z2luZm8ubmFtZSwgZGVidWdpbmZvLm5hbWUpCisg ICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGV4cGVjdGVkX2RlYnVnaW5mby52 ZXJzaW9uLCBkZWJ1Z2luZm8udmVyc2lvbikKKyAgICAgICAgc2VsZi5hc3Nl cnRFcXVhbHMoZXhwZWN0ZWRfZGVidWdpbmZvLnJlbGVhc2UsIGRlYnVnaW5m by5yZWxlYXNlKQorCisgICAgZGVmIHRlc3RfZmluZF9ub25fZXhpc3RlbnRf ZGVidWdpbmZvKHNlbGYpOgorICAgICAgICAiIiJFbnN1cmUgdG8gcmV0dXJu IE5vbmUgaWYgY2Fubm90IGZpbmQgYXNzb2NpYXRlZCBkZWJ1Z2luZm8gUlBN CisKKyAgICAgICAgb3MucGF0aC5leGlzdHMgaXMgbm90IG1vY2tlZCwgdGhh dCBpcyBiZWNhdXNlIHRoZSBhc3NvY2lhdGVkIGRlYnVnaW5mbworICAgICAg ICBSUE0gb2YgaHR0cGQtMi40LjE4LTEuZmMyMi54ODZfNjQucnBtIGdpdmVu IGluIHNldFVwIG11c3QgYmUKKyAgICAgICAgbm9uLWV4aXN0ZWQgZHVyaW5n IHRoaXMgdGVzdCdzIHJ1bi4KKyAgICAgICAgIiIiCisgICAgICAgIHJwbSA9 IGZlZGFiaXBrZ2RpZmZfbW9kLkxvY2FsUlBNKHNlbGYuZmlsZW5hbWUpCisg ICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKE5vbmUsIHJwbS5maW5kX2RlYnVn aW5mbygpKQorCisKK2NsYXNzIFJ1bkFiaXBrZ2RpZmZUZXN0KHVuaXR0ZXN0 LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0IGNhc2UgZm9yIG1ldGhvZCBydW5f YWJpcGtnZGlmZgorCisgICAgTWV0aG9kIHJ1bl9hYmlwa2dkaWZmIGFjY2Vw dHMgcGFja2FnZSBpbmZvcm1hdGlvbnMgYW5kIHBhc3NlcyB0aGVtIHRvIGFu ZAorICAgIHJ1biBhYmlwa2dkaWZmIGNvbW1hbmQgbGluZSB1dGlsaXR5LiBT aW5jZSBydW5fYWJpcGtnZGlmZiBkb2VzIG5vdCBjYXRjaAorICAgIG91dHB1 dCB0byBlaXRoZXIgc3RhbmRhcmQgb3V0cHV0IG9yIHN0YW5kYXJkIGVycm9y LCBhbmQgb25seSByZXR1cm5zIHRoZQorICAgIHJldHVybiBjb2RlIHRoYXQg aXMgcmV0dXJuZWQgZnJvbSB1bmRlcmx5aW5nIGFiaXBrZ2RpZmYsIHRoZXNl IHZhcmlvdXMgdGVzdAorICAgIGNhc2VzIHRlc3Qgd2hldGhlciBydW5fYWJp cGtnZGlmZiBpcyBhYmxlIHRvIHJldHVybiB0aGUgcmV0dXJuIGNvZGUKKyAg ICBjb3JyZWN0bHkuCisgICAgIiIiCisKKyAgICBkZWYgc2V0VXAoc2VsZik6 CisgICAgICAgICIiIkRlZmluZSBwYWNrYWdlcyBpbmZvcm1hdGlvbiBmb3Ig Y2FsbGluZyBydW5fYWJpcGtnZGlmZiBtZXRob2QKKworICAgICAgICBEdWUg dG8gdGhlIHRlc3RzIGp1c3QgY2FyZSBhYm91dCB0aGUgcmV0dXJuIGNvZGUg ZnJvbSB1bmRlcmx5aW5nCisgICAgICAgIGFiaXBrZ2RpZmYsIG9ubHkgcGFy dGlhbCBhdHRyaWJ1dGVzIG9mIGEgUlBNIGlzIHJlcXVpcmVkLiBUaGF0IG1l YW5zLAorICAgICAgICBpdCdzIHVubmVjZXNzYXJ5IHRvIGdpdmUgYSBmdWxs IGRpY3QgcmVwcmVzZW50aW5nIGEgY29tcGxldGUgUlBNLCBqdXN0CisgICAg ICAgIGJ1aWxkX2lkLCBuYW1lLCB2ZXJzaW9uLCByZWxlYXNlLCBhbmQgYXJj aC4KKworICAgICAgICBGdWxsIFJQTSBpbmZvcm1hdGlvbiBpcyBub3QgcmVx dWlyZWQuIEZvciB0aGlzIHRlc3QgY2FzZSwgb25seSBwYXJ0aWFsCisgICAg ICAgIGluZm9ybWF0aW9uIGFyY2gsIGJ1aWxkX2lkLCBuYW1lLCByZWxlYXNl LCBhbmQgdmVyc2lvbiBhcmUgZW5vdWdoLgorICAgICAgICAiIiIKKworICAg ICAgICAjIFVzZWQgZm9yIHRlc3RpbmcgdGhlIGNhc2Ugb2YgcnVubmluZyBh Ymlwa2dkaWZmIGFnYWluc3Qgb25lIFJQTQorICAgICAgICBzZWxmLnBrZzFf c2luZ2xlX2luZm8gPSB7CisgICAgICAgICAgICAnaTY4Nic6IFsKKyAgICAg ICAgICAgICAgICBmZWRhYmlwa2dkaWZmX21vZC5SUE0oeydhcmNoJzogJ2k2 ODYnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg J2J1aWxkX2lkJzogNzIwMjIyLAorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgJ25hbWUnOiAnaHR0cGQnLAorICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlbGVhc2UnOiAnMi5mYzI0 JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2 ZXJzaW9uJzogJzIuNC4xOCcsCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgICAgICBmZWRhYmlwa2dk aWZmX21vZC5SUE0oeydhcmNoJzogJ2k2ODYnLAorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgJ2J1aWxkX2lkJzogNzIwMjIyLAor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUn OiAnaHR0cGQtZGVidWdpbmZvJywKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICdyZWxlYXNlJzogJzIuZmMyNCcsCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmVyc2lvbic6ICcy LjQuMTgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgfSkKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgfQorCisg ICAgICAgICMgV2hhdGV2ZXIgdGhlIGNvbmNyZXRlIGNvbnRlbnQgb2YgcGtn Ml9pbmZvcyBpcywgc28ganVzdCBtYWtlIGEgY29weQorICAgICAgICAjIGZy b20gc2VsZi5wa2cxX2luZm9zCisgICAgICAgIHNlbGYucGtnMl9zaW5nbGVf aW5mbyA9IHNlbGYucGtnMV9zaW5nbGVfaW5mby5jb3B5KCkKKworICAgICAg ICAjIFVzZWQgZm9yIHRlc3RpbmcgdGhlIGNhc2Ugb2YgcnVubmluZyBhYmlw a2dkaWZmIGFnYWluc3QgbXVsdGlwbGUgUlBNcworICAgICAgICBzZWxmLnBr ZzFfaW5mb3MgPSB7CisgICAgICAgICAgICAnaTY4Nic6IFsKKyAgICAgICAg ICAgICAgICBmZWRhYmlwa2dkaWZmX21vZC5SUE0oeydhcmNoJzogJ2k2ODYn LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2J1 aWxkX2lkJzogNzIwMjIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgJ25hbWUnOiAnaHR0cGQnLAorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgJ3JlbGVhc2UnOiAnMi5mYzI0JywK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2ZXJz aW9uJzogJzIuNC4xOCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB9KSwKKyAgICAgICAgICAgICAgICBmZWRhYmlwa2dkaWZm X21vZC5SUE0oeydhcmNoJzogJ2k2ODYnLAorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgJ2J1aWxkX2lkJzogNzIwMjIyLAorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAn aHR0cGQtZGVidWdpbmZvJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICdyZWxlYXNlJzogJzIuZmMyNCcsCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmVyc2lvbic6ICcyLjQu MTgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg fSksCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICd4ODZfNjQn OiBbCisgICAgICAgICAgICAgICAgZmVkYWJpcGtnZGlmZl9tb2QuUlBNKHsn YXJjaCc6ICd4ODZfNjQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgJ2J1aWxkX2lkJzogNzIwMjIyLAorICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnaHR0cGQnLAor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlbGVh c2UnOiAnMi5mYzI0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICd2ZXJzaW9uJzogJzIuNC4xOCcsCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgICAg ICBmZWRhYmlwa2dkaWZmX21vZC5SUE0oeydhcmNoJzogJ3g4Nl82NCcsCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnVpbGRf aWQnOiA3MjAyMjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAnbmFtZSc6ICdodHRwZC1kZWJ1Z2luZm8nLAorICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlbGVhc2UnOiAnMi5m YzI0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICd2ZXJzaW9uJzogJzIuNC4xOCcsCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB9KSwKKyAgICAgICAgICAgICAgICBdLAorICAg ICAgICAgICAgJ2FybXY3aGwnOiBbCisgICAgICAgICAgICAgICAgZmVkYWJp cGtnZGlmZl9tb2QuUlBNKHsnYXJjaCc6ICdhcm12N2hsJywKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdidWlsZF9pZCc6IDcy MDIyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICduYW1lJzogJ2h0dHBkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICdyZWxlYXNlJzogJzIuZmMyNCcsCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2ZXJzaW9uJzogJzIuNC4x OCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9 KSwKKyAgICAgICAgICAgICAgICBmZWRhYmlwa2dkaWZmX21vZC5SUE0oeydh cmNoJzogJ2FybXY3aGwnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgJ2J1aWxkX2lkJzogNzIwMjIyLAorICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnaHR0cGQtZGVi dWdpbmZvJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICdyZWxlYXNlJzogJzIuZmMyNCcsCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAndmVyc2lvbic6ICcyLjQuMTgnLAorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksCisgICAg ICAgICAgICAgICAgXSwKKyAgICAgICAgICAgIH0KKworICAgICAgICAjIFdo YXRldmVyIHRoZSBjb25jcmV0ZSBjb250ZW50IG9mIHBrZzJfaW5mb3MgaXMs IHNvIGp1c3QgbWFrZSBhIGNvcHkKKyAgICAgICAgIyBmcm9tIHNlbGYucGtn MV9pbmZvcworICAgICAgICBzZWxmLnBrZzJfaW5mb3MgPSBzZWxmLnBrZzFf aW5mb3MuY29weSgpCisKKyAgICBAcGF0Y2goJ2ZlZGFiaWRpZmYuYWJpcGtn ZGlmZicpCisgICAgZGVmIHRlc3RfYWxsX3N1Y2Nlc3Moc2VsZiwgbW9ja19h Ymlwa2dkaWZmKToKKyAgICAgICAgIiIiCisgICAgICAgIEVuc3VyZSBydW5f YWJpcGtnZGlmZiByZXR1cm5zIDAgd2hlbiBpdCBzdWNjZWVkcyB0byBydW4g YWdhaW5zdCBvbmUgb3IKKyAgICAgICAgbW9yZSBwYWNrYWdlcy4KKyAgICAg ICAgIiIiCisgICAgICAgIG1vY2tfYWJpcGtnZGlmZi5yZXR1cm5fdmFsdWUg PSAwCisKKyAgICAgICAgcmVzdWx0ID0gZmVkYWJpcGtnZGlmZl9tb2QucnVu X2FiaXBrZ2RpZmYoc2VsZi5wa2cxX3NpbmdsZV9pbmZvLAorICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxm LnBrZzJfc2luZ2xlX2luZm8pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxz KDAsIHJlc3VsdCkKKworICAgICAgICByZXN1bHQgPSBmZWRhYmlwa2dkaWZm X21vZC5ydW5fYWJpcGtnZGlmZihzZWxmLnBrZzFfaW5mb3MsCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNl bGYucGtnMl9pbmZvcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMCwg cmVzdWx0KQorCisgICAgQHBhdGNoKCdmZWRhYmlkaWZmLmFiaXBrZ2RpZmYn KQorICAgIGRlZiB0ZXN0X2FsbF9mYWlsdXJlKHNlbGYsIG1vY2tfYWJpcGtn ZGlmZik6CisgICAgICAgICIiIgorICAgICAgICBFbnN1cmUgcnVuX2FiaXBr Z2RpZmYgcmV0dXJucyB0aGUgcmV0dXJuIGNvZGUgZnJvbSB1bmRlcmx5aW5n CisgICAgICAgIGFiaXBrZ2RpZmYgd2hlbiBhbGwgY2FsbHMgdG8gYWJpcGtn ZGlmZiBmYWlscyBhZ2FpbnN0IG9uZSBvciBtb3JlCisgICAgICAgIHBhY2th Z2VzLgorICAgICAgICAiIiIKKyAgICAgICAgbW9ja19hYmlwa2dkaWZmLnJl dHVybl92YWx1ZSA9IDQKKworICAgICAgICByZXN1bHQgPSBmZWRhYmlwa2dk aWZmX21vZC5ydW5fYWJpcGtnZGlmZihzZWxmLnBrZzFfc2luZ2xlX2luZm8s CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHNlbGYucGtnMl9zaW5nbGVfaW5mbykKKyAgICAgICAgc2VsZi5h c3NlcnRFcXVhbHMoNCwgcmVzdWx0KQorCisgICAgICAgIHJlc3VsdCA9IGZl ZGFiaXBrZ2RpZmZfbW9kLnJ1bl9hYmlwa2dkaWZmKHNlbGYucGtnMV9pbmZv cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgc2VsZi5wa2cyX2luZm9zKQorICAgICAgICBzZWxmLmFzc2Vy dEVxdWFscyg0LCByZXN1bHQpCisKKyAgICBAcGF0Y2goJ2ZlZGFiaWRpZmYu YWJpcGtnZGlmZicsIG5ldz1sYW1iZGEgcGFyYW0xLCBwYXJhbTI6IGNvdW50 ZXIubmV4dCgpKQorICAgIGRlZiB0ZXN0X3BhcnRpYWxfZmFpbHVyZShzZWxm KToKKyAgICAgICAgIiIiCisgICAgICAgIEVuc3VyZSBydW5fYWJpcGtnZGlm ZiByZXR1cm5zIG5vbi16ZXJvIHdoZW4gcGFydGlhbCBjYWxscyB0bworICAg ICAgICBydW5fYWJpcGtnZGlmZiBzdWNjZWVkCisKKyAgICAgICAgYWJpcGtn ZGlmZiBpcyBtb2NrZWQgaW4gb3JkZXIgdG8gc2ltdWx0ZSB0aGUgcGFydGlh bCBzdWNjZXNzCisgICAgICAgIGNhbGxzLiBXaHk/IFRoYXQgaXMgYmVjYXVz ZSwgY291bnRlciBzdGFydHMgZnJvbSAwLiBTbywgaXQgd2lsbAorICAgICAg ICBnZW5lcmF0ZSAwLCAxLCAyLCAuLi4KKyAgICAgICAgIiIiCisgICAgICAg IHJlc3VsdCA9IGZlZGFiaXBrZ2RpZmZfbW9kLnJ1bl9hYmlwa2dkaWZmKHNl bGYucGtnMV9pbmZvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgc2VsZi5wa2cyX2luZm9zKQorICAgICAg ICBzZWxmLmFzc2VydFRydWUocmVzdWx0ID4gMCkKKworCitjbGFzcyBEb3du bG9hZFJQTVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3Qg Y2FzZSBmb3IgZG93bmxvYWRfcnBtCisKKyAgICBEb3dubG9hZCBhIHJlbW90 ZSBmaWxlLCB3aGljaCBpcyBhIGxvY2FsIGZpbGUgc2ltdWxhdGluZyBhIHJl bW90ZSBmaWxlIHdpdGgKKyAgICBzY2hlbWUgZmlsZTovLywgZm9yIGV4YW1w bGUgZmlsZTovLy90bXAvYS50eHQsIHRvIGRvd25sb2FkIGRpcmVjdG9yeS4K KyAgICAiIiIKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgIyBD cmVhdGUgYSByZW1vdGUgZmlsZSBmb3IgdGVzdGluZyBkb3dubG9hZCBvZiB0 aGlzIGZpbGUKKyAgICAgICAgc2VsZi5mZCwgc2VsZi5yZW1vdGVfZmlsZW5h bWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKAorICAgICAgICAgICAgcHJlZml4PXRl bXBfZmlsZV9vcl9kaXJfcHJlZml4KQorICAgICAgICAjIFdoYXRldmVyIHRo ZSBjb250ZW50IGlzLCB0aGlzIGNhc2UgZG9lcyBub3QgY2FyZSBhYm91dC4g Q2xvc2UgaXQKKyAgICAgICAgIyBpbW1lZGlhdGVseS4KKyAgICAgICAgb3Mu Y2xvc2Uoc2VsZi5mZCkKKworICAgICAgICAjIFVzZWQgYXMgYSBmYWtlIGRv d25sb2FkIGRpcmVjdG9yeSB0byBtb2NrIGdldF9kb3dubG9hZF9kaXIgbWV0 aG9kCisgICAgICAgIHNlbGYuZG93bmxvYWRfZGlyID0gdGVtcGZpbGUubWtk dGVtcChwcmVmaXg9dGVtcF9maWxlX29yX2Rpcl9wcmVmaXgpCisKKyAgICBk ZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIG9zLnJlbW92ZShzZWxmLnJl bW90ZV9maWxlbmFtZSkKKyAgICAgICAgc2h1dGlsLnJtdHJlZShzZWxmLmRv d25sb2FkX2RpcikKKworICAgIGRlZiBtYWtlX3JlbW90ZV9maWxlX3VybChz ZWxmKToKKyAgICAgICAgIiIiTWFrZSBVUkwgb2YgcmVtb3RlIGZpbGUgdGhh dCBpcyB1c2VkIGZvciBkb3dubG9hZGluZyB0aGlzIGZpbGUiIiIKKyAgICAg ICAgcmV0dXJuICdmaWxlOi8ve30nLmZvcm1hdChzZWxmLnJlbW90ZV9maWxl bmFtZSkKKworICAgIGRlZiBtYWtlX25vbmV4aXN0ZW50X3JlbW90ZV9maWxl X3VybChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIFVSTCB0byBhIG5vbi1l eGlzdGVudCByZW1vdGUgZmlsZSIiIgorICAgICAgICByZXR1cm4gb3MucGF0 aC5qb2luKHNlbGYubWFrZV9yZW1vdGVfZmlsZV91cmwoKSwgJ25vbmV4aXN0 ZW50LWZpbGUnKQorCisgICAgQHBhdGNoKCdfX21haW5fXy5mZWRhYmlwa2dk aWZmX21vZC5nZXRfZG93bmxvYWRfZGlyJykKKyAgICBkZWYgdGVzdF9zdWNj ZWVkX3RvX2Rvd25sb2FkX2FfcnBtKHNlbGYsIG1vY2tfZ2V0X2Rvd25sb2Fk X2Rpcik6CisgICAgICAgICIiIkVudXNyZSBUcnVlIGlzIHJldHVybmVkIGlm IGN1cmwgc3VjY2VlZHMgdG8gZG93bmxvYWQgcmVtb3RlIGZpbGUKKworICAg ICAgICBEb3dubG9hZCByZW1vdGUgZmlsZSB0byBhIGZha2UgZG93bmxvYWQg ZGlyZWN0b3J5LiBFbnN1cmUgZXZlcnl0aGluZyBpcworICAgICAgICBva2F5 LCBhbmQgcmV0dXJuIHZhbHVlIGZyb20gZG93bmxvYWRfcnBtIHNob3VsZCBi ZSB0cnV0aC4KKyAgICAgICAgIiIiCisgICAgICAgIG1vY2tfZ2V0X2Rvd25s b2FkX2Rpci5yZXR1cm5fdmFsdWUgPSBzZWxmLmRvd25sb2FkX2RpcgorCisg ICAgICAgIHVybCA9IHNlbGYubWFrZV9yZW1vdGVfZmlsZV91cmwoKQorICAg ICAgICByZXQgPSBmZWRhYmlwa2dkaWZmX21vZC5kb3dubG9hZF9ycG0odXJs KQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmV0KQorCisgICAgQHBhdGNo KCdfX21haW5fXy5mZWRhYmlwa2dkaWZmX21vZC5nZXRfZG93bmxvYWRfZGly JykKKyAgICBkZWYgdGVzdF9mYWlsZWRfdG9fZG93bmxvYWRfYV9ycG0oc2Vs ZiwgbW9ja19nZXRfZG93bmxvYWRfZGlyKToKKyAgICAgICAgIiIiRW5zdXJl IEZhbHNlIGlzIHJldHVybmVkIGlmIGN1cmwgZmFpbHMgdG8gZG93bmxvYWQg cmVtb3RlIGZpbGUKKworICAgICAgICBEb3dubG9hZCByZW1vdGUgZmlsZSB0 byBhIGZha2UgZG93bmxvYWQgZGlyZWN0b3J5LiBCdXQsIG1ha2luZworICAg ICAgICBzb21ldGhpbmcgd3JvbmcgdG8gY2F1c2UgZG93bmxvYWRfcnBtIHJl dHVybnMgZmFsc2UuCisgICAgICAgICIiIgorICAgICAgICBtb2NrX2dldF9k b3dubG9hZF9kaXIucmV0dXJuX3ZhbHVlID0gc2VsZi5kb3dubG9hZF9kaXIK KworICAgICAgICB1cmwgPSBzZWxmLm1ha2Vfbm9uZXhpc3RlbnRfcmVtb3Rl X2ZpbGVfdXJsKCkKKyAgICAgICAgcmV0ID0gZmVkYWJpcGtnZGlmZl9tb2Qu ZG93bmxvYWRfcnBtKHVybCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShy ZXQpCisKKworY2xhc3MgTW9ja0dsb2JhbENvbmZpZyhvYmplY3QpOgorICAg ICIiIlVzZWQgdG8gbW9jayBnbG9iYWxfY29uZmlnCisKKyAgICBTaW5jZSB0 ZXN0cyBkbyBub3QgcGFyc2Ugb3B0aW9ucyBmcm9tIGNvbW1hbmQgbGluZSwg c28gdGhpcyBjbGFzcyBpcworICAgIGhlbHBmdWwgZm9yIHRlc3RzIHRvIGNv bnRhaW4gYWxsIHBvdGVudGlhbCBwYXJzZWQgKHNpbXVsYXRlZCkKKyAgICBv cHRpb25zLgorCisgICAgQ3VycmVudGx5LCBvbmx5IGtvamlfc2VydmVyIGlz IHJlcXVpcmVkIGZvciBydW5uaW5nIHRlc3RzLiBJZiBhbnkgbmV3IHRlc3QK KyAgICBjYXNlcyBuZWVkIG90aGVycywgcGxlYXNlIGFkZCB0aGVtIGFkZCBh cyBjbGFzcyBhdHRyaWJ1dGUgZGlyZWN0bHkuCisgICAgIiIiCisgICAga29q aV9zZXJ2ZXIgPSBmZWRhYmlwa2dkaWZmX21vZC5ERUZBVUxUX0tPSklfU0VS VkVSCisKKworZGVmIG1vY2tfZ2V0X3Nlc3Npb24oKToKKyAgICAiIiJVc2Vk IHRvIG1vY2sgZ2V0X3Nlc3Npb24gbWV0aG9kIHRvIGdldCBtb2NrZWQgS29q aVNlc3Npb24gaW5zdGFuY2UiIiIKKyAgICByZXR1cm4gTW9ja0tvamlDbGll bnRTZXNzaW9uKGJhc2V1cmw9ZmVkYWJpcGtnZGlmZl9tb2QuREVGQVVMVF9L T0pJX1NFUlZFUikKKworCitjbGFzcyBNb2NrS29qaUNsaWVudFNlc3Npb24o b2JqZWN0KToKKyAgICAiIiJNb2NrIGtvamkuQ2xpZW50U2Vzc2lvbgorCisg ICAgVGhpcyBtb2NrIENsaWVudFNlc3Npb24gYWltcyB0byBhdm9pZCB0b3Vj aGluZyBhIHJlYWwgS29qaSBpbnN0YW5jZSB0bworICAgIGludGVyYWN0IHdp dGggWE1MUlBDIEFQSXMgcmVxdWlyZWQgYnkgZmVkYWJpcGtnZGlmZi4KKwor ICAgIEZvciB0aGUgdGVzdHMgd2l0aGluIHRoaXMgbW9kdWxlLCBtZXRob2Rz IGRvIG5vdCBuZWNlc3NhcmlseSB0byByZXR1cm4KKyAgICBjb21wbGV0ZSBS UE0gYW5kIGJ1aWxkIGluZm9ybWF0aW9uLiBTbywgaWYgeW91IG5lZWQgbW9y ZSBhZGRpdGlvbmFsCisgICAgaW5mb3JtYXRpb24sIGhlcmUgaXMgdGhlIHJp Z2h0IHBsYWNlIHRvIGFkZCB0aGVtLgorICAgICIiIgorCisgICAgZGVmIF9f aW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICIiIkFj Y2VwdCBhcmJpdHJhcnkgcGFyYW1ldGVycyBidXQgZG8gbm90aGluZyBmb3Ig dGhpcyBtb2NrCisKKyAgICAgICAgQWRkIHRoaXMgbWV0aG9kLCBhbHRob3Vn aCBpdCdzIG5vdCB1c2VkIGJ5IHRoaXMgbW9jayBDbGllbnRTZXNzaW9uLgor ICAgICAgICBUaGF0IGlzIGJlY2F1c2UsIHdoZW4gaW5pdGlhdGUgYW4gaW5z dGFuY2Ugb2Yga29qaS5DbGllbnRTZXNzaW9uLAorICAgICAgICBwYXJhbXRl cnMsIGF0IGxlYXN0IFVSTCB0byBrb2ppaHViLCBpcyByZXF1aXJlZCBhbmQg cGFzc2VkLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5hcmdzID0gYXJn cworICAgICAgICBzZWxmLmt3YXJncyA9IGt3YXJncworCisgICAgZGVmIGdl dFBhY2thZ2Uoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0 dXJuIHsKKyAgICAgICAgICAgICdpZCc6IDEsCisgICAgICAgICAgICAnbmFt ZSc6ICd3aGF0ZXZlciBhIG5hbWUgb2YgYSBwYWNrYWdlJywKKyAgICAgICAg fQorCisgICAgZGVmIGxpc3RSUE1zKHNlbGYsICphcmdzLCAqKmt3YXJncyk6 CisgICAgICAgIHJldHVybiBbeydhcmNoJzogJ2k2ODYnLAorICAgICAgICAg ICAgICAgICAnbmFtZSc6ICdodHRwZC1kZWJ1Z2luZm8nLAorICAgICAgICAg ICAgICAgICAnbnZyJzogJ2h0dHBkLWRlYnVnaW5mby0yLjQuMTgtMS5mYzIy JywKKyAgICAgICAgICAgICAgICAgJ3JlbGVhc2UnOiAnMS5mYzIyJywKKyAg ICAgICAgICAgICAgICAgJ3ZlcnNpb24nOiAnMi40LjE4J30sCisgICAgICAg ICAgICAgICAgeydhcmNoJzogJ2k2ODYnLAorICAgICAgICAgICAgICAgICAn bmFtZSc6ICdtb2Rfc2Vzc2lvbicsCisgICAgICAgICAgICAgICAgICdudnIn OiAnbW9kX3Nlc3Npb24tMi40LjE4LTEuZmMyMicsCisgICAgICAgICAgICAg ICAgICdyZWxlYXNlJzogJzEuZmMyMicsCisgICAgICAgICAgICAgICAgICd2 ZXJzaW9uJzogJzIuNC4xOCd9LAorICAgICAgICAgICAgICAgIHsnYXJjaCc6 ICdpNjg2JywKKyAgICAgICAgICAgICAgICAgJ25hbWUnOiAnaHR0cGQnLAor ICAgICAgICAgICAgICAgICAnbnZyJzogJ2h0dHBkLTIuNC4xOC0xLmZjMjIn LAorICAgICAgICAgICAgICAgICAncmVsZWFzZSc6ICcxLmZjMjInLAorICAg ICAgICAgICAgICAgICAndmVyc2lvbic6ICcyLjQuMTgnfSwKKyAgICAgICAg ICAgICAgICB7J2FyY2gnOiAnaTY4NicsCisgICAgICAgICAgICAgICAgICdu YW1lJzogJ21vZF9wcm94eV9odG1sJywKKyAgICAgICAgICAgICAgICAgJ252 cic6ICdtb2RfcHJveHlfaHRtbC0yLjQuMTgtMS5mYzIyJywKKyAgICAgICAg ICAgICAgICAgJ3JlbGVhc2UnOiAnMS5mYzIyJywKKyAgICAgICAgICAgICAg ICAgJ3ZlcnNpb24nOiAnMi40LjE4J30sCisgICAgICAgICAgICAgICAgeydh cmNoJzogJ2k2ODYnLAorICAgICAgICAgICAgICAgICAnbmFtZSc6ICdtb2Rf bGRhcCcsCisgICAgICAgICAgICAgICAgICdudnInOiAnbW9kX2xkYXAtMi40 LjE4LTEuZmMyMicsCisgICAgICAgICAgICAgICAgICdyZWxlYXNlJzogJzEu ZmMyMicsCisgICAgICAgICAgICAgICAgICd2ZXJzaW9uJzogJzIuNC4xOCd9 LAorICAgICAgICAgICAgICAgIHsnYXJjaCc6ICdpNjg2JywKKyAgICAgICAg ICAgICAgICAgJ25hbWUnOiAnbW9kX3NzbCcsCisgICAgICAgICAgICAgICAg ICdudnInOiAnbW9kX3NzbC0yLjQuMTgtMS5mYzIyJywKKyAgICAgICAgICAg ICAgICAgJ3JlbGVhc2UnOiAnMS5mYzIyJywKKyAgICAgICAgICAgICAgICAg J3ZlcnNpb24nOiAnMi40LjE4J31dCisKKyAgICBkZWYgbGlzdEJ1aWxkcyhz ZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gWworICAg ICAgICAgICAgeydidWlsZF9pZCc6IDcyMDIyMiwKKyAgICAgICAgICAgICAn bmFtZSc6ICdodHRwZCcsCisgICAgICAgICAgICAgJ252cic6ICdodHRwZC0y LjQuMTgtMi5mYzI0JywKKyAgICAgICAgICAgICAncmVsZWFzZSc6ICcyLmZj MjQnLAorICAgICAgICAgICAgICd2ZXJzaW9uJzogJzIuNC4xOCd9LAorICAg ICAgICAgICAgeydidWlsZF9pZCc6IDcwODc2OSwKKyAgICAgICAgICAgICAn bmFtZSc6ICdodHRwZCcsCisgICAgICAgICAgICAgJ252cic6ICdodHRwZC0y LjQuMTgtMS5mYzIyJywKKyAgICAgICAgICAgICAncmVsZWFzZSc6ICcxLmZj MjInLAorICAgICAgICAgICAgICd2ZXJzaW9uJzogJzIuNC4xOCd9LAorICAg ICAgICAgICAgeydidWlsZF9pZCc6IDcwODcxMSwKKyAgICAgICAgICAgICAn bmFtZSc6ICdodHRwZCcsCisgICAgICAgICAgICAgJ252cic6ICdodHRwZC0y LjQuMTgtMS5mYzIzJywKKyAgICAgICAgICAgICAncmVsZWFzZSc6ICcxLmZj MjMnLAorICAgICAgICAgICAgICd2ZXJzaW9uJzogJzIuNC4xOCd9LAorICAg ICAgICAgICAgeydidWlsZF9pZCc6IDcwNTMzNSwKKyAgICAgICAgICAgICAn bmFtZSc6ICdodHRwZCcsCisgICAgICAgICAgICAgJ252cic6ICdodHRwZC0y LjQuMTgtMS5mYzI0JywKKyAgICAgICAgICAgICAncmVsZWFzZSc6ICcxLmZj MjQnLAorICAgICAgICAgICAgICd2ZXJzaW9uJzogJzIuNC4xOCd9LAorICAg ICAgICAgICAgeydidWlsZF9pZCc6IDcwNDQzNCwKKyAgICAgICAgICAgICAn bmFtZSc6ICdodHRwZCcsCisgICAgICAgICAgICAgJ252cic6ICdodHRwZC0y LjQuMTctNC5mYzI0JywKKyAgICAgICAgICAgICAncmVsZWFzZSc6ICc0LmZj MjQnLAorICAgICAgICAgICAgICd2ZXJzaW9uJzogJzIuNC4xNyd9LAorICAg ICAgICAgICAgeydidWlsZF9pZCc6IDcwNDQzMywKKyAgICAgICAgICAgICAn bmFtZSc6ICdodHRwZCcsCisgICAgICAgICAgICAgJ252cic6ICdodHRwZC0y LjQuMTctNC5mYzIzJywKKyAgICAgICAgICAgICAncmVsZWFzZSc6ICc0LmZj MjMnLAorICAgICAgICAgICAgICd2ZXJzaW9uJzogJzIuNC4xNyd9LAorICAg ICAgICBdCisKKworY2xhc3MgR2V0UGFja2FnZUxhdGVzdEJ1aWxkVGVzdCh1 bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBjYXNlIGZvciBnZXRf cGFja2FnZV9sYXRlc3RfYnVpbGQiIiIKKworICAgIEBwYXRjaCgnZmVkYWJp ZGlmZi5nbG9iYWxfY29uZmlnJywgbmV3PU1vY2tHbG9iYWxDb25maWcpCisg ICAgQHBhdGNoKCdrb2ppLkNsaWVudFNlc3Npb24nLCBuZXc9TW9ja0tvamlD bGllbnRTZXNzaW9uKQorICAgIGRlZiB0ZXN0X2dldF9sYXRlc3Rfb25lKHNl bGYpOgorICAgICAgICAiIiJFbnN1cmUgdG8gZ2V0IGxhdGVzdCBidWlsZCBv ZiBhIHBhY2thZ2UKKworICAgICAgICBCcmV3Lmxpc3RCdWlsZHMgaXMgbW9j a2VkIHRvIHJldHVybiBhIHNlcmllcyBvZiBidWlsZHMgdGhhdCBjb250YWlu cworICAgICAgICBhIGxhdGVzdCBidWlsZCwgd2hpY2ggaXMgaHR0cGQtMi40 LjE4LTEuZmMyMywgb2YgcGFja2FnZSBodHRwZCBmb3IKKyAgICAgICAgRmVk b3JhIDIzLCBhbmQgdGhhdCBtdXN0IGJlIGZvdW5kIGFuZCByZXR1cm5lZC4K KyAgICAgICAgIiIiCisgICAgICAgIHNlc3Npb24gPSBmZWRhYmlwa2dkaWZm X21vZC5nZXRfc2Vzc2lvbigpCisgICAgICAgIGJ1aWxkID0gc2Vzc2lvbi5n ZXRfcGFja2FnZV9sYXRlc3RfYnVpbGQoJ2h0dHBkJywgJ2ZjMjMnKQorICAg ICAgICBzZWxmLmFzc2VydEVxdWFscygnaHR0cGQtMi40LjE4LTEuZmMyMycs IGJ1aWxkWydudnInXSkKKworICAgIEBwYXRjaCgnZmVkYWJpZGlmZi5nbG9i YWxfY29uZmlnJywgbmV3PU1vY2tHbG9iYWxDb25maWcpCisgICAgQHBhdGNo KCdrb2ppLkNsaWVudFNlc3Npb24nLCBuZXc9TW9ja0tvamlDbGllbnRTZXNz aW9uKQorICAgIGRlZiB0ZXN0X2Nhbm5vdF9maW5kX2FfbGF0ZXN0X2J1aWxk X3dpdGhfaW52YWxpZF9kaXN0cm8oc2VsZik6CisgICAgICAgICIiIgorICAg ICAgICBFbnN1cmUgTm9Db21wbGV0ZUJ1aWxkcyBpcyByYWlzZWQgd2hlbiB0 cnlpbmcgdG8gZmluZCBhIGxhdGVzdCBidWlsZCBvZgorICAgICAgICBhIHBh Y2thZ2UgZm9yIHVua25vd24gRmVkb3JhIGRpc3RyaWJ1dGlvbi4KKyAgICAg ICAgIiIiCisgICAgICAgIHNlc3Npb24gPSBmZWRhYmlwa2dkaWZmX21vZC5n ZXRfc2Vzc2lvbigpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGZlZGFi aXBrZ2RpZmZfbW9kLk5vQ29tcGxldGVCdWlsZHMsCisgICAgICAgICAgICAg ICAgICAgICAgICAgIHNlc3Npb24uZ2V0X3BhY2thZ2VfbGF0ZXN0X2J1aWxk LCAnaHR0cGQnLCAneHh4eCcpCisKKworY2xhc3MgQnJld0xpc3RSUE1zVGVz dCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBjYXNlIGZvciBC cmV3Lmxpc3RSUE1zIiIiCisKKyAgICBAcGF0Y2goJ2ZlZGFiaWRpZmYuZ2xv YmFsX2NvbmZpZycsIG5ldz1Nb2NrR2xvYmFsQ29uZmlnKQorICAgIEBwYXRj aCgnZmVkYWJpZGlmZi5rb2ppLkNsaWVudFNlc3Npb24nLCBuZXc9TW9ja0tv amlDbGllbnRTZXNzaW9uKQorICAgIGRlZiB0ZXN0X3NlbGVjdF9zcGVjaWZp Y19ycG1zKHNlbGYpOgorICAgICAgICAiIiJFbnN1cmUgQnJldy5saXN0UlBN cyBjYW4gc2VsZWN0IFJQTXMgYnkgYSBzcGVjaWZpYyBzZWxlY3RvcgorCisg ICAgICAgIFRoaXMgdGVzdCB3aWxsIHNlbGVjdCBSUE1zIHdob3NlIG5hbWUg c3RhcnRzIHdpdGggaHR0cGQsIHRoYXQgaXMgb25seQorICAgICAgICBodHRw ZCBhbmQgaHR0cGQtZGVidWdpbmZvIFJQTXMgYXJlIHNlbGVjdGVkIGFuZCBy ZXR1cm5lZC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlc3Npb24gPSBmZWRh Ymlwa2dkaWZmX21vZC5nZXRfc2Vzc2lvbigpCisgICAgICAgIHNlbGVjdG9y ID0gbGFtYmRhIHJwbTogcnBtWyduYW1lJ10uc3RhcnRzd2l0aCgnaHR0cGQn KQorICAgICAgICBycG1zID0gc2Vzc2lvbi5saXN0UlBNcyhidWlsZElEPTEw MDAsIHNlbGVjdG9yPXNlbGVjdG9yKQorICAgICAgICBzZWxmLmFzc2VydFRy dWUoCisgICAgICAgICAgICBsZW4ocnBtcykgPiAwLAorICAgICAgICAgICAg J01vcmUgdGhhbiBvbmUgcnBtcyBzaG91bGQgYmUgc2VsZWN0ZWQuIEJ1dCwg aXRcJ3MgZW1wdHkuJykKKyAgICAgICAgZm9yIHJwbSBpbiBycG1zOgorICAg ICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJwbVsnbmFtZSddIGluICgnaHR0 cGQnLCAnaHR0cGQtZGVidWdpbmZvJyksCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgJ3swfSBzaG91bGQgbm90IGJlIHNlbGVjdGVkJy5mb3JtYXQo cnBtWyduYW1lJ10pKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6 CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS90b29scy9NYWtl ZmlsZS5hbSBiL3Rvb2xzL01ha2VmaWxlLmFtCmluZGV4IGI4NTVmNDEuLjBk OTYyMTUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL01ha2VmaWxlLmFtCisrKyBiL3Rv b2xzL01ha2VmaWxlLmFtCkBAIC02LDYgKzYsMTIgQEAgZWxzZQogICBiaW5f UFJPR1JBTVMgPSBhYmlkaWZmIGFiaWxpbnQgYWJpZHcgYWJpY29tcGF0IGFi aXBrZ2RpZmYKIGVuZGlmCiAKK2lmIEVOQUJMRV9GRURBQklQS0dESUZGCisg IGJpbl9TQ1JJUFRTID0gZmVkYWJpcGtnZGlmZgorZWxzZQorICBub2luc3Rf U0NSSVBUUyA9IGZlZGFiaXBrZ2RpZmYKK2VuZGlmCisKIG5vaW5zdF9QUk9H UkFNUyA9IGFiaXN5bSBhYmluaWxpbnQKIAogaWYgRU5BQkxFX1pJUF9BUkNI SVZFCmRpZmYgLS1naXQgYS90b29scy9mZWRhYmlwa2dkaWZmIGIvdG9vbHMv ZmVkYWJpcGtnZGlmZgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAw MDAwLi5lN2M0Nzg1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZmVkYWJp cGtnZGlmZgpAQCAtMCwwICsxLDEwNTAgQEAKKyMhL3Vzci9iaW4vZW52IHB5 dGhvbgorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyMgLSotIE1vZGU6IFB5 dGhvbgorIworIyBDb3B5cmlnaHQgKEMpIDIwMTMtMjAxNiBSZWQgSGF0LCBJ bmMuCisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQXBwbGlj YXRpb24gQmluYXJ5IEludGVyZmFjZSBHZW5lcmljCisjIEFuYWx5c2lzIGFu ZCBJbnN0cnVtZW50YXRpb24gTGlicmFyeSAobGliYWJpZ2FpbCkuICBUaGlz IGxpYnJhcnkgaXMKKyMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry aWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUKKyMgdGVybXMg b2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hl ZCBieSB0aGUKKyMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIg dmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorIyBsYXRlciB2 ZXJzaW9uLgorIworIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4g dGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjIFdJVEhP VVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2Fy cmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEg UEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgR2VuZXJhbCBQ dWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hv dWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQ dWJsaWMKKyMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2Vl IHRoZSBmaWxlIENPUFlJTkctR1BMVjMuICBJZgorIyBub3QsIHNlZSA8aHR0 cDojd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyMKKyMgQXV0aG9yOiBDaGVu eGlvbmcgUWkKKworaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgbG9nZ2luZwor aW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCBzaGxleAoraW1wb3J0IHN1 YnByb2Nlc3MKK2ltcG9ydCBzeXMKKworZnJvbSBjb2xsZWN0aW9ucyBpbXBv cnQgbmFtZWR0dXBsZQorZnJvbSBpdGVydG9vbHMgaW1wb3J0IGdyb3VwYnkK KworaW1wb3J0IHhkZy5CYXNlRGlyZWN0b3J5CisKK2ltcG9ydCBrb2ppCisK KyMgQGZpbGUKKyMKKyMgWW91IG1pZ2h0IGhhdmUga25vd24gdGhhdCBhYmlw a2dkaWZmIGlzIGEgY29tbWFuZCBsaW5lIHRvb2wgdG8gY29tcGFyZSB0d28K KyMgUlBNIHBhY2thZ2VzIHRvIGZpbmQgcG90ZW50aWFsIGRpZmZlcmVuY2Vz IG9mIEFCSS4gVGhpcyBpcyByZWFsbHkgdXNlZnVsIGZvcgorIyBGZWRvcmEg cGFja2FnZXJzIGFuZCBkZXZlbG9wZXJzLiBVc3VhbGx5LCBleGNwZXQgdGhl IFJQTSBwYWNrYWdlcyBidWlsdAorIyBsb2NhbGx5LCBpZiBhIHBhY2thZ2Vy IHdhbnRzIHRvIGNvbXBhcmUgUlBNIHBhY2thZ2VzIGhlIGp1c3QgYnVpbHQg d2l0aAorIyBzcGVjaWZpYyBSUE0gcGFja2FnZXMgdGhhdCB3ZXJlIGFscmVh ZHkgYnVpbHQgYW5kIGF2YWlsYWJlIGluIEtvamksCisjIGZlZGFiaXBrZ2Rp ZmYgaXMgdGhlIHJpZ2h0IHRvb2wgZm9yIGhpbS4KKyMKKyMgV2l0aCBmZWRh Ymlwa2dkaWZmLCBwYWNrYWdlciBpcyBhYmxlIHRvIHNwZWNpZnkgY2VydGFp biBjcml0ZXJpYSB0byB0ZWxsCisjIGZlZGFiaXBrZ2RpZmYgd2hpY2ggUlBN IHBhY2thZ2VzIGhlIHdhbnRzIHRvIGNvbXBhcmUsIHRoZW4gZmVkYWJpcGtn ZGlmZiB3aWxsCisjIGZpbmQgdGhlbSwgZG93bmxvYWQgdGhlbSwgYW5kIGJv b20sIHJ1biB0aGUgYWJpcGtnZGlmZiBmb3IgeW91LgorIworIyBDdXJyZW50 bHksIGZlZGFiaXBrZ2RpZmYgcmV0dXJucyAwIGlmIGV2ZXJ5dGhpbmcgd29y a3Mgd2VsbCwgb3RoZXJ3aXNlLCAxIGlmCisjIHNvbWV0aGluZyB3cm9uZy4K KworCitERUZBVUxUX0tPSklfU0VSVkVSID0gJ2h0dHA6Ly9rb2ppLmZlZG9y YXByb2plY3Qub3JnL2tvamlodWInCitERUZBVUxUX0tPSklfVE9QRElSID0g J2h0dHBzOi8va29qaXBrZ3MuZmVkb3JhcHJvamVjdC5vcmcnCisKKyMgVGhl IHdvcmtpbmcgZGlyZWN0b3J5IHdoZXJlIHRvIGhvbGQgYWxsIGRhdGEgaW5j bHVkaW5nIGRvd25sb2FkZWQgUlBNCisjIHBhY2thZ2VzIEN1cnJlbnRseSwg aXQncyBub3QgY29uZmlndXJhYmxlIGFuZCBoYXJkY29kZSBoZXJlLiBJbiB0 aGUgZnV0dXJlCisjIHZlcnNpb24gb2YgZmVkYWJpcGtnZGlmZiwgSSdsbCBt YWtlIGl0IGNvbmZpZ3VyYWJsZSBieSB1c2Vycy4KK0hPTUVfRElSID0gb3Mu cGF0aC5qb2luKHhkZy5CYXNlRGlyZWN0b3J5LnhkZ19kYXRhX2hvbWUsCisg ICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLnNwbGl0ZXh0KG9zLnBh dGguYmFzZW5hbWUoX19maWxlX18pKVswXSkKKworIyBVc2VkIHRvIGNvbnN0 cnVjdCBhYmlwa2dkaWZmIGNvbW1hbmQgbGluZSBhcmd1bWVudCwgcGFja2Fn ZSBhbmQgYXNzb2NpYXRlZAorIyBkZWJ1Z2luZm8gcGFja2FnZQorIyBmZWRh Ymlwa2dkaWZmIHJ1bnMgYWJpcGtnZGlmZiBpbiB0aGlzIGZvcm0KKyMKKyMg ICBhYmlwa2dkaWZmIFwKKyMgICAgICAgLS1kMSAvcGF0aC90by9wYWNrYWdl MS1kZWJ1Z2luZm8ucnBtIFwKKyMgICAgICAgLS1kMiAvcGF0aC90by9wYWNr YWdlMi1kZWJ1Z2luZm8ucnBtIFwKKyMgICAgICAgL3BhdGgvdG8vcGFja2Fn ZTEucnBtIFwKKyMgICAgICAgL3BhdGgvdG8vcGFja2FnZTIucnBtCisjCisj IFBrZ0luZm8gaXMgYSB0d28tZWxlbWVudHMgdHVwbGUgaW4gZm9ybWF0Cisj CisjICAgKC9wYXRoL3RvL3BhY2thZ2UxLnJwbSwgL3BhdGgvdG8vcGFja2Fn ZTEtZGVidWdpbmZvLnJwbSkKKyMKKyMgU28sIGJlZm9yZSBjYWxsaW5nIGFi aXBrZ2RpZmYsIGZlZGFiaXBrZ2RpZmYgbXVzdCBwcmVwYXJlIGFuZCBwYXNz IGZvbGxvd2luZworIyB0d28gcGFja2FnZSBpbmZvcm1hdGlvbgorIworIyAg ICgvcGF0aC90by9wYWNrYWdlMS5ycG0sIC9wYXRoL3RvL3BhY2thZ2UxLWRl YnVnaW5mby5ycG0pCisjICAgKC9wYXRoL3RvL3BhY2thZ2UyLnJwbSwgL3Bh dGgvdG8vcGFja2FnZTItZGVidWdpbmZvLnJwbSkKKyMKK1BrZ0luZm8gPSBu YW1lZHR1cGxlKCdQa2dJbmZvJywgJ3BhY2thZ2UgZGVidWdpbmZvX3BhY2th Z2UnKQorCisKK2dsb2JhbF9jb25maWcgPSBOb25lCitwYXRoaW5mbyA9IE5v bmUKK3Nlc3Npb24gPSBOb25lCisKKyMgVGhlcmUgaXMgbm8gd2F5IHRvIGNv bmZpZ3VyZSB0aGUgbG9nIGZvcm1hdCBzbyBmYXIuIEkgaG9wZSBJIHdvdWxk IGhhdmUgdGltZQorIyB0byBtYWtlIGl0IGF2YWlsYWJsZSBzbyB0aGF0IGlm IGZlZGFiaXBrZ2RpZmYgaXMgc2NoZWR1bGVkIGFuZCBydW4gYnkgc29tZQor IyBzZXJ2aWNlLCB0aGUgbG9ncyBsb2dnZWQgaW50byBsb2cgZmlsZSBpcyBt dWMgdXNhYmxlLgorbG9nZ2luZy5iYXNpY0NvbmZpZyhmb3JtYXQ9J1slKGxl dmVsbmFtZSlzXSAlKG1lc3NhZ2UpcycsCisgICAgICAgICAgICAgICAgICAg IGxldmVsPWxvZ2dpbmcuQ1JJVElDQUwpCitsb2dnZXIgPSBsb2dnaW5nLmdl dExvZ2dlcihvcy5wYXRoLmJhc2VuYW1lKF9fZmlsZV9fKSkKKworCitjbGFz cyBLb2ppUGFja2FnZU5vdEZvdW5kKEV4Y2VwdGlvbik6CisgICAgIiIiUGFj a2FnZSBpcyBub3QgZm91bmQgaW4gS29qaSIiIgorCisKK2NsYXNzIFBhY2th Z2VOb3RGb3VuZChFeGNlcHRpb24pOgorICAgICIiIlBhY2thZ2UgaXMgbm90 IGZvdW5kIGxvY2FsbHkiIiIKKworCitjbGFzcyBScG1Ob3RGb3VuZChFeGNl cHRpb24pOgorICAgICIiIlJQTSBpcyBub3QgZm91bmQiIiIKKworCitjbGFz cyBOb0J1aWxkc0Vycm9yKEV4Y2VwdGlvbik6CisgICAgIiIiTm8gYnVpbGRz IHJldHVybmVkIGZyb20gYSBtZXRob2QgdG8gc2VsZWN0IHNwZWNpZmljIGJ1 aWxkcyIiIgorCisKK2NsYXNzIE5vQ29tcGxldGVCdWlsZHMoRXhjZXB0aW9u KToKKyAgICAiIiJObyBjb21wbGV0ZSBidWlsZHMgZm9yIGEgcGFja2FnZQor CisgICAgVGhpcyBpcyBhIHNlcmlvdXMgcHJvYmxlbSwgbm90aGluZyBjYW4g YmUgZG9uZSBpZiB0aGVyZSBpcyBubyBjb21wbGV0ZQorICAgIGJ1aWxkcyBm b3IgYSBwYWNrYWdlLgorICAgICIiIgorCisKK2NsYXNzIEludmFsaWREaXN0 cm9FcnJvcihFeGNlcHRpb24pOgorICAgICIiIkludmFsaWQgZGlzdHJvIGVy cm9yIiIiCisKKworY2xhc3MgQ2Fubm90RmluZExhdGVzdEJ1aWxkRXJyb3Io RXhjZXB0aW9uKToKKyAgICAiIiJDYW5ub3QgZmluZCBsYXRlc3QgYnVpbGQg ZnJvbSBhIHBhY2thZ2UiIiIKKworCitkZWYgaXNfZGlzdHJvX3ZhbGlkKGRp c3Rybyk6CisgICAgIiIiQWRqdXN0IGlmIGEgZGlzdHJvIGlzIHZhbGlkCisK KyAgICBDdXJyZW50bHksIGNoZWNrIGZvciBGZWRvcmEgYW5kIFJIRUwuCisK KyAgICA6cGFyYW0gc3RyIGRpc3RybzogYSBzdHJpbmcgcmVwcmVzZW50aW5n IGEgZGlzdHJvIHZhbHVlLgorICAgIDpyZXR1cm46IFRydWUgaWYgZGlzdHJv IGlzIHRoZSBvbmUgc3BlY2lmaWMgdG8gRmVkb3JhLCBsaWtlIGZjMjQsIGVs Ny4KKyAgICAicnR5cGU6IGJvb2wKKyAgICAiIiIKKyAgICByZXR1cm4gcmUu bWF0Y2gocideKGZjfGVsKVxkezEsMn0kJywgZGlzdHJvKSBpcyBub3QgTm9u ZQorCisKK2RlZiBsb2dfY2FsbChmdW5jKToKKyAgICAiIiJBIGRlY29yYXRv ciB0aGF0IGxvZ3MgYSBtZXRob2QgaW52b2NhdGlvbgorCisgICAgTWV0aG9k J3MgbmFtZSBhbmQgYWxsIGFyZ3VtZW50cywgZWl0aGVyIHBvc2l0aW9uYWwg b3Iga2V5d29yZCBhcmd1bWVudHMsCisgICAgd2lsbCBiZSBsb2dnZWQgYnkg bG9nZ2VyLmRlYnVnLiBBbHNvLCByZXR1cm4gdmFsdWUgZnJvbSB0aGUgZGVj b3JhdGVkCisgICAgbWV0aG9kIHdpbGwgYmUgbG9nZ2VkIGp1c3QgYWZ0ZXIg dGhlIGludm9jYXRpb24gaXMgZG9uZS4KKworICAgIFRoaXMgZGVjb3JhdG9y IGRvZXMgbm90IGNhdGNoIGFueSBleGNlcHRpb24gdGhyb3duIGZyb20gdGhl IGRlY29yYXRlZAorICAgIG1ldGhvZC4gSWYgdGhlcmUgaXMgYW55IGV4Y2Vw dGlvbiB0aHJvd24gZnJvbSBkZWNvcmF0ZWQgbWV0aG9kLCB5b3UgY2FuCisg ICAgY2F0Y2ggdGhlbSBpbiB0aGUgY2FsbGVyIGFuZCBvYnZpb3VzbHksIG5v IHJldHVybiB2YWx1ZSBpcyBsb2dnZWQuCisKKyAgICA6cGFyYW0gY2FsbGFi bGUgZnVuYzogYSBjYWxsYWJsZSBvYmplY3QgdG8gZGVjb3JhdGUKKyAgICAi IiIKKyAgICBkZWYgcHJveHkoKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAg bG9nZ2VyLmRlYnVnKCdDYWxsICVzLCBhcmdzOiAlcywga3dhcmdzOiAlcycs CisgICAgICAgICAgICAgICAgICAgICBmdW5jLl9fbmFtZV9fLAorICAgICAg ICAgICAgICAgICAgICAgYXJncyBpZiBhcmdzIGVsc2UgJycsCisgICAgICAg ICAgICAgICAgICAgICBrd2FyZ3MgaWYga3dhcmdzIGVsc2UgJycpCisgICAg ICAgIHJlc3VsdCA9IGZ1bmMoKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICBs b2dnZXIuZGVidWcoJ1Jlc3VsdCBmcm9tICVzOiAlcycsIGZ1bmMuX19uYW1l X18sIHJlc3VsdCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgIHJldHVy biBwcm94eQorCisKK2NsYXNzIFJQTShvYmplY3QpOgorICAgICIiIldyYXBw ZXIgb2YgUlBNIHJlcHJlc2VudGluZyBhIFJQTSBnb3QgZnJvbSBLb2ppCisK KyAgICBBIFJQTSBpcyByZXR1cm5lZCBmcm9tIEtvamkgWE1MUlBDIEFQSSBp cyBpbiBkaWN0IHR5cGUuIFRoaXMgd3JhcHBlciBtYWtlcworICAgIGl0IGVh aXNlciB0byBhY2Nlc3MgYWxsIHRoZXNlIHByb3BlcnRpZXMgaW4gdGhlIHdh eSBvZiBvYmplY3QucHJvcGVydHkuCisgICAgIiIiCisKKyAgICBkZWYgX19p bml0X18oc2VsZiwgcnBtX2luZm8pOgorICAgICAgICAiIiJJbml0aWFsaXpl IGEgUlBNIG9iamVjdAorCisgICAgICAgIDpwYXJhbSBkaWN0IHJwbV9pbmZv OiBhIGRpY3QgcmVwcmVzZW50aW5nIGEgUlBNIGluZm9ybWF0aW9uIGdvdCBm cm9tCisgICAgICAgIGtvamkgQVBJLCBlaXRoZXIgbGlzdFJQTXMgb3IgZ2V0 UlBNCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnJwbV9pbmZvID0gcnBt X2luZm8KKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAiIiJS ZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFJQTQor CisgICAgICAgIFJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9m IFJQTSBpbmZvcm1hdGlvbiByZXR1cm5lZCBmcm9tIEtvamkKKyAgICAgICAg ZGlyZWN0bHkgc28gdGhhdCBSUE0gY2FuIGJlIHRyZWF0ZWQgaW4gc2FtZSB3 YXkuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc3RyKHNlbGYucnBt X2luZm8pCisKKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6Cisg ICAgICAgICIiIkFjY2VzcyBSUE0gaW5mb3JtYXRpb24gaW4gdGhlIHdheSBv ZiBvYmplY3QucHJvcGVydHkKKworICAgICAgICA6cGFyYW0gc3RyIG5hbWU6 IHRoZSBwcm9wZXJ0eSBuYW1lIHRvIGFjY2Vzcy4KKyAgICAgICAgOnJhaXNl cyBBdHRyaWJ1dGVFcnJvcjogaWYgbmFtZSBpcyBub3Qgb25lIG9mIGtleXMg b2YgUlBNIGluZm9ybWF0aW9uLgorICAgICAgICAiIiIKKyAgICAgICAgaWYg bmFtZSBpbiBzZWxmLnJwbV9pbmZvOgorICAgICAgICAgICAgcmV0dXJuIHNl bGYucnBtX2luZm9bbmFtZV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAg IHJhaXNlIEF0dHJpYnV0ZUVycm9yKCdObyBhdHRyaWJ1dGUgbmFtZSB7MH0n LmZvcm1hdChuYW1lKSkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBudnJh KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBSUE0ncyBOLVYtUi1BIHJl cHJlc2VudGF0aW9uCisKKyAgICAgICAgQW4gZXhhbXBsZTogbGliYWJpZ2Fp bC0xLjAtMC44LnJjNC4xLmZjMjMueDg2XzY0CisgICAgICAgICIiIgorICAg ICAgICByZXR1cm4gJyUobmFtZSlzLSUodmVyc2lvbilzLSUocmVsZWFzZSlz LiUoYXJjaClzJyAlIHNlbGYucnBtX2luZm8KKworICAgIEBwcm9wZXJ0eQor ICAgIGRlZiBmaWxlbmFtZShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEg UlBNIGZpbGUgbmFtZQorCisgICAgICAgIEFuIGV4YW1wbGU6IGxpYmFiaWdh aWwtMS4wLTAuOC5yYzQuMS5mYzIzLng4Nl82NC5ycG0KKyAgICAgICAgIiIi CisgICAgICAgIHJldHVybiAnezB9LnJwbScuZm9ybWF0KHNlbGYubnZyYSkK KworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBpc19kZWJ1Z2luZm8oc2VsZik6 CisgICAgICAgICIiIkNoZWNrIGlmIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50 IFJQTSBkZW5vdGVzIGEgZGVidWcgaW5mbyBwYWNrYWdlIiIiCisgICAgICAg IHJldHVybiBrb2ppLmlzX2RlYnVnaW5mbyhzZWxmLnJwbV9pbmZvWyduYW1l J10pCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgZG93bmxvYWRfdXJsKHNl bGYpOgorICAgICAgICAiIiJHZXQgdGhlIFVSTCBmcm9tIHdoZXJlIHRvIGRv d25sb2FkIHRoaXMgUlBNIiIiCisgICAgICAgIGJ1aWxkID0gc2Vzc2lvbi5n ZXRCdWlsZChzZWxmLmJ1aWxkX2lkKQorICAgICAgICByZXR1cm4gb3MucGF0 aC5qb2luKHBhdGhpbmZvLmJ1aWxkKGJ1aWxkKSwgcGF0aGluZm8ucnBtKHNl bGYucnBtX2luZm8pKQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGRvd25s b2FkZWRfZmlsZShzZWxmKToKKyAgICAgICAgIiIiR2V0IGEgcHJpZGljdGFi bGUgZG93bmxvYWRlZCBmaWxlIG5hbWUgd2l0aCBhYnNvbHV0ZSBwYXRoIiIi CisgICAgICAgICMgYXJjaCBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIHRoZSBy ZXN1bHQgcmV0dXJuZWQgZnJvbSBQYXRoSW5mby5ycG0KKyAgICAgICAgZmls ZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHBhdGhpbmZvLnJwbShzZWxmLnJw bV9pbmZvKSkKKyAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihnZXRfZG93 bmxvYWRfZGlyKCksIGZpbGVuYW1lKQorCisgICAgQHByb3BlcnR5CisgICAg ZGVmIGlzX2Rvd25sb2FkZWQoc2VsZik6CisgICAgICAgICIiIkNoZWNrIGlm IHRoaXMgUlBNIHdhcyBhbHJlYWR5IGRvd25sb2FkZWQgdG8gbG9jYWwgZGlz ayIiIgorICAgICAgICByZXR1cm4gb3MucGF0aC5leGlzdHMoc2VsZi5kb3du bG9hZGVkX2ZpbGUpCisKKworY2xhc3MgTG9jYWxSUE0oUlBNKToKKyAgICAi IiJSZXByZXNlbnRpbmcgYSBsb2NhbCBSUE0KKworICAgIExvY2FsIFJQTSBt ZWFucyB0aGUgb25lIHRoYXQgY291bGQgYmUgYWxyZWFkeSBkb3dubG9hZGVk IG9yIGJ1aWx0IGZyb20KKyAgICB3aGVyZSBJIGNhbiBmaW5kIGl0CisgICAg IiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWUpOgorICAg ICAgICAiIiJJbml0aWFsaXplIGxvY2FsIFJQTSB3aXRoIGEgZmlsZW5hbWUK KworICAgICAgICA6cGFyYW0gc3RyIGZpbGVuYW1lOiBhIGZpbGVuYW1lIHBv aW50aW5nIHRvIGEgUlBNIGZpbGUgaW4gbG9jYWwKKyAgICAgICAgZGlzay4g Tm90ZSB0aGF0LCB0aGlzIGZpbGUgbXVzdCBub3QgZXhpc3QgbmVjZXNzYXJp bHkuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmxvY2FsX2ZpbGVuYW1l ID0gZmlsZW5hbWUKKyAgICAgICAgc2VsZi5ycG1faW5mbyA9IGtvamkucGFy c2VfTlZSQShvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSkKKworICAgIEBw cm9wZXJ0eQorICAgIGRlZiBkb3dubG9hZGVkX2ZpbGUoc2VsZik6CisgICAg ICAgICIiIlJldHVybiBmaWxlbmFtZSBvZiB0aGlzIFJQTQorCisgICAgICAg IFJldHVybmVkIGZpbGVuYW1lIGlzIGp1c3QgdGhlIG9uZSBwYXNzZWQgd2hl biBpbml0aWFsaXppbmcgdGhpcyBSUE0uCisKKyAgICAgICAgOnJldHVybjog ZmlsZW5hbWUgb2YgdGhpcyBSUE0KKyAgICAgICAgOnJ0eXBlOiBzdHIKKyAg ICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLmxvY2FsX2ZpbGVuYW1l CisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgZG93bmxvYWRfdXJsKHNlbGYp OgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdMb2NhbFJQ TSBoYXMgbm8gVVJMIHRvIGRvd25sb2FkJykKKworICAgIEBsb2dfY2FsbAor ICAgIGRlZiBmaW5kX2RlYnVnaW5mbyhzZWxmKToKKyAgICAgICAgIiIiRmlu ZCBkZWJ1Z2luZm8gUlBNIHBhY2thZ2UgZnJvbSBhIGRpcmVjdG9yeQorCisg ICAgICAgIDpwYXJhbSBzdHIgcnBtX2ZpbGU6IHRoZSBycG0gZmlsZSBuYW1l CisgICAgICAgIDpyZXR1cm46IHRoZSBhYnNvbHV0ZSBmaWxlIG5hbWUgb2Yg dGhlIGZvdW5kIGRlYnVnaW5mbyBycG0KKyAgICAgICAgOnJ0eXBlOiBzdHIg b3IgTm9uZQorICAgICAgICAiIiIKKyAgICAgICAgc2VhcmNoX2RpciA9IG9z LnBhdGguZGlybmFtZShvcy5wYXRoLmFic3BhdGgoc2VsZi5sb2NhbF9maWxl bmFtZSkpCisgICAgICAgIGZpbGVuYW1lID0gXAorICAgICAgICAgICAgJyUo bmFtZSlzLWRlYnVnaW5mby0lKHZlcnNpb24pcy0lKHJlbGVhc2Upcy4lKGFy Y2gpcy5ycG0nICUgXAorICAgICAgICAgICAgc2VsZi5ycG1faW5mbworICAg ICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihzZWFyY2hfZGlyLCBmaWxl bmFtZSkKKyAgICAgICAgcmV0dXJuIExvY2FsUlBNKGZpbGVuYW1lKSBpZiBv cy5wYXRoLmV4aXN0cyhmaWxlbmFtZSkgZWxzZSBOb25lCisKKworY2xhc3Mg QnJldyhvYmplY3QpOgorICAgICIiIkludGVyZmFjZSB0byBLb2ppIFhNTFJQ QyBBUEkgd2l0aCBlbmhhbmNlbWVudHMgc3BlY2lmaWMgdG8gZmVkYWJpcGtn ZGlmZgorCisgICAga29qaWh1YiBYTUxSUEMgQVBJcyBhcmUgd2VsbC1kb2N1 bWVudGVkIGluIGtvamkncyBzb3VyY2UgY29kZS4gRm9yIG1vcmUKKyAgICBk ZXRhaWxzIGluZm9ybWF0aW9uLCBwbGVhc2UgcmVmZXIgdG8gY2xhc3MgUm9v dEV4cG9ydHMgd2l0aGluIGtvamlodWIucHkuCisKKyAgICBGb3IgZGV0YWls cyBvZiBBUElzIHVzZWQgd2l0aGluIGZlZGFiaXBrZ2RpZmYsIHJlZmVyIHRv IGZyb20gbGluZQorCisgICAgaHR0cHM6Ly9wYWd1cmUuaW8va29qaS9ibG9i L21hc3Rlci9mL2h1Yi9rb2ppaHViLnB5I183ODM1CisgICAgIiIiCisKKyAg ICBkZWYgX19pbml0X18oc2VsZiwgYmFzZXVybCk6CisgICAgICAgICIiIklu aXRpYWxpemUgQnJldworCisgICAgICAgIDpwYXJhbSBzdHIgYmFzZXVybDog dGhlIGtvamlodWIgVVJMIHRvIGluaXRpYWxpemUgYSBzZXNzaW9uLCB0aGF0 IGlzCisgICAgICAgIHVzZWQgdG8gYWNjZXNzIGtvamkgWE1MUlBDIEFQSXMu CisgICAgICAgICIiIgorICAgICAgICBzZWxmLnNlc3Npb24gPSBrb2ppLkNs aWVudFNlc3Npb24oYmFzZXVybCkKKworICAgIEBsb2dfY2FsbAorICAgIGRl ZiBsaXN0UlBNcyhzZWxmLCBidWlsZElEPU5vbmUsIGFyY2hlcz1Ob25lLCBz ZWxlY3Rvcj1Ob25lKToKKyAgICAgICAgIiIiR2V0IGxpc3Qgb2YgUlBNcyBv ZiBhIGJ1aWxkIGZyb20gS29qaQorCisgICAgICAgIENhbGwga29qaWh1Yi5s aXN0UlBNcyB0byBnZXQgbGlzdCBvZiBSUE1zLiBSZXR1cm4gc2VsZWN0ZWQg UlBNcyB3aXRob3V0CisgICAgICAgIGNoYW5naW5nIGVhY2ggUlBNIGluZm9y bWF0aW9uLgorCisgICAgICAgIEEgUlBNIHJldHVybmVkIGZyb20gbGlzdFJQ TXMgY29udGFpbnMgZm9sbG93aW5nIGtleXM6CisKKyAgICAgICAgLSBpZAor ICAgICAgICAtIG5hbWUKKyAgICAgICAgLSB2ZXJzaW9uCisgICAgICAgIC0g cmVsZWFzZQorICAgICAgICAtIG52ciAoc3ludGhlc2l6ZWQgZm9yIHNvcnRp bmcgcHVycG9zZXMpCisgICAgICAgIC0gYXJjaAorICAgICAgICAtIGVwb2No CisgICAgICAgIC0gcGF5bG9hZGhhc2gKKyAgICAgICAgLSBzaXplCisgICAg ICAgIC0gYnVpbGR0aW1lCisgICAgICAgIC0gYnVpbGRfaWQKKyAgICAgICAg LSBidWlsZHJvb3RfaWQKKyAgICAgICAgLSBleHRlcm5hbF9yZXBvX2lkCisg ICAgICAgIC0gZXh0ZXJuYWxfcmVwb19uYW1lCisgICAgICAgIC0gbWV0YWRh dGFfb25seQorICAgICAgICAtIGV4dHJhCisKKyAgICAgICAgOnBhcmFtIGlu dCBidWlsZElEOiBpZCBvZiBhIGJ1aWxkIGZyb20gd2hpY2ggdG8gbGlzdCBS UE1zLgorICAgICAgICA6cGFyYW0gYXJjaGVzOiB0byByZXN0cmljdCB0byBs aXN0IFJQTXMgd2l0aCBzcGVjaWZpZWQgYXJjaGVzLgorICAgICAgICA6dHlw ZSBhcmNoZXM6IGxpc3Qgb3IgdHVwbGUKKyAgICAgICAgOnBhcmFtIHNlbGVj dG9yOiBjYWxsZWQgdG8gZGV0ZXJtaW5lIGlmIGEgUlBNIHNob3VsZCBiZSBz ZWxlY3RlZCBhbmQKKyAgICAgICAgaW5jbHVkZWQgaW4gdGhlIGZpbmFsIHJl dHVybmVkIHJlc3VsdC4gU2VsZWN0b3IgbXVzdCBiZSBhIGNhbGxhYmxlCisg ICAgICAgIG9iamVjdCBhbmQgYWNjZXB0cyBvbmUgcGFyYW1ldGVyIG9mIGEg UlBNLgorICAgICAgICA6dHlwZSBzZWxlY3RvcjogYSBjYWxsYWJsZSBvYmpl Y3QKKyAgICAgICAgOnJldHVybjogYSBsaXN0IG9mIFJQTXMsIGVhY2ggb2Yg dGhlbSBpcyBhIGRpY3Qgb2JqZWN0CisgICAgICAgIDpydHlwZTogbGlzdAor ICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZWN0b3I6CisgICAgICAgICAg ICBhc3NlcnQgaGFzYXR0cihzZWxlY3RvciwgJ19fY2FsbF9fJyksICdzZWxl Y3RvciBtdXN0IGJlIGNhbGxhYmxlLicKKyAgICAgICAgcnBtcyA9IHNlbGYu c2Vzc2lvbi5saXN0UlBNcyhidWlsZElEPWJ1aWxkSUQsIGFyY2hlcz1hcmNo ZXMpCisgICAgICAgIGlmIHNlbGVjdG9yOgorICAgICAgICAgICAgcnBtcyA9 IFtycG0gZm9yIHJwbSBpbiBycG1zIGlmIHNlbGVjdG9yKHJwbSldCisgICAg ICAgIHJldHVybiBycG1zCisKKyAgICBAbG9nX2NhbGwKKyAgICBkZWYgZ2V0 UlBNKHNlbGYsIHJwbWluZm8pOgorICAgICAgICAiIiJHZXQgYSBSUE0gZnJv bSBrb2ppCisKKyAgICAgICAgQ2FsbCBrb2ppaHViLmdldFJQTSwgYW5kIHJl dHVybnMgdGhlIHJlc3VsdCBkaXJlY3RseSB3aXRob3V0IGFueQorICAgICAg ICBjaGFuZ2UuCisKKyAgICAgICAgV2hlbiBub3QgZm91bmQgYSBSUE0sIGtv amkuZ2V0UlBNIHdpbGwgcmV0dXJuIE5vbmUsIHRoZW4KKyAgICAgICAgdGhp cyBtZXRob2Qgd2lsbCByYWlzZSBScG1Ob3RGb3VuZCBlcnJvciBpbW1lZGlh dGVseSB0byBjbGFpbSB3aGF0IGlzCisgICAgICAgIGhhcHBlbmluZy4gSSB3 YW50IHRvIHJhaXNlIGZlZGFiaXBrZ2RpZmYgc3BlY2lmaWMgZXJyb3IgcmF0 aGVyIHRoYW4KKyAgICAgICAga29qaSdzIEdlbmVyaWNFcnJvciBhbmQgdGhl biByYWlzZSBScG1Ob3RGb3VuZCBhZ2Fpbiwgc28gSSBqdXN0IHNpbXBseQor ICAgICAgICBkb24ndCB1c2Ugc3RyaWN0IHBhcmFtZXRlciB0byBjYWxsIGtv amkuZ2V0UlBNLgorCisgICAgICAgIDpwYXJhbSBycG1pbmZvOiBycG1pbmZv IG1heSBiZSBhIE4tVi1SLkEgb3IgYSBtYXAgY29udGFpbmluZyBuYW1lLAor ICAgICAgICB2ZXJzaW9uLCByZWxlYXNlLCBhbmQgYXJjaC4gRm9yIGV4YW1w bGUsIGZpbGUtNS4yNS01LmZjMjQueDg2XzY0LCBhbmQKKyAgICAgICAgYHsn bmFtZSc6ICdmaWxlJywgJ3ZlcnNpb24nOiAnNS4yNScsICdyZWxlYXNlJzog JzUuZmMyNCcsICdhcmNoJzoKKyAgICAgICAgJ3g4Nl82NCd9YC4KKyAgICAg ICAgOnR5cGUgcnBtaW5mbzogc3RyIG9yIGRpY3QKKyAgICAgICAgOnJldHVy bjogYSBtYXAgY29udGFpbmluZyBSUE0gaW5mb3JtYXRpb24sIHRoYXQgY29u dGFpbnMgc2FtZSBrZXlzIGFzCisgICAgICAgIG1ldGhvZCBgQnJldy5saXN0 UlBNc2AuCisgICAgICAgIDpydHlwZTogZGljdAorICAgICAgICA6cmFpc2Vz IFJwbU5vdEZvdW5kOiBpZiBhIFJQTSBjYW5ub3QgYmUgZm91bmQgd2l0aCBy cG1pbmZvLgorICAgICAgICAiIiIKKyAgICAgICAgcnBtID0gc2VsZi5zZXNz aW9uLmdldFJQTShycG1pbmZvKQorICAgICAgICBpZiBycG0gaXMgTm9uZToK KyAgICAgICAgICAgIHJhaXNlIFJwbU5vdEZvdW5kKCdDYW5ub3QgZmluZCBS UE0gezB9Jy5mb3JtYXQoYXJnc1swXSkpCisgICAgICAgIHJldHVybiBycG0K KworICAgIEBsb2dfY2FsbAorICAgIGRlZiBsaXN0QnVpbGRzKHNlbGYsIHBh Y2thZ2VJRCwgc3RhdGU9Tm9uZSwgdG9wb25lPU5vbmUsCisgICAgICAgICAg ICAgICAgICAgc2VsZWN0b3I9Tm9uZSwgb3JkZXJfYnk9Tm9uZSwgcmV2ZXJz ZT1Ob25lKToKKyAgICAgICAgIiIiR2V0IGxpc3Qgb2YgYnVpbGRzIGZyb20g S29qaQorCisgICAgICAgIENhbGwga29qaWh1Yi5saXN0QnVpbGRzLCBhbmQg cmV0dXJuIHNlbGVjdGVkIGJ1aWxkcyB3aXRob3V0IGNoYW5naW5nCisgICAg ICAgIGVhY2ggYnVpbGQgaW5mb3JtYXRpb24uCisKKyAgICAgICAgQnkgZGVm YXVsdCwgb25seSBidWlsZHMgd2l0aCBDT01QTEVURSBzdGF0ZSBhcmUgcXVl cmllZCBhbmQgcmV0dXJucworICAgICAgICBhZnRlcndhcmRzLgorCisgICAg ICAgIDpwYXJhbSBpbnQgcGFja2FnZUlEOiBpZCBvZiBwYWNrYWdlIHRvIGxp c3QgYnVpbGRzIGZyb20uCisgICAgICAgIDpwYXJhbSBpbnQgc3RhdGU6IGJ1 aWxkIHN0YXRlLiBUaGVyZSBhcmUgZml2ZSBzdGF0ZXMgb2YgYSBidWlsZCBp bgorICAgICAgICBLb2ppLiBmZWRhYmlwa2dkaWZmIG9ubHkgY2FyZXMgYWJv dXQgYnVpbGRzIHdpdGggQ09NUExFVEUgc3RhdGUuIElmCisgICAgICAgIHN0 YXRlIGlzIG9taXR0ZWQsIGJ1aWxkcyB3aXRoIENPTVBMRVRFIHN0YXRlIGFy ZSBxdWVyaWVkIGZyb20gS29qaSBieQorICAgICAgICBkZWZhdWx0LgorICAg ICAgICA6cGFyYW0gYm9vbCB0b3BvbmU6IGp1c3QgcmV0dXJuIHRoZSB0b3Ag Zmlyc3QgYnVpbGQuCisgICAgICAgIDpwYXJhbSBzZWxlY3RvcjogYSBjYWxs YWJsZSBvYmplY3QgdXNlZCB0byBzZWxlY3Qgc3BlY2lmaWMgc3Vic2V0IG9m CisgICAgICAgIGJ1aWxkcy4gU2VsZWN0b3Igd2lsbCBiZSBjYWxsZWQgaW1t ZWRpYXRlbHkgYWZ0ZXIgS29qaSByZXR1cm5zIHF1ZXJpZWQKKyAgICAgICAg YnVpbGRzLiBXaGVuIGVhY2ggY2FsbCB0byBzZWxlY3RvciwgYSBidWlsZCBp cyBwYXNzZWQgdG8KKyAgICAgICAgc2VsZWN0b3IuIFJldHVybiBUcnVlIGlm IHNlbGVjdCBjdXJyZW50IGJ1aWxkLCBGYWxzZSBpZiBub3QuCisgICAgICAg IDp0eXBlIHNlbGVjdG9yOiBhIGNhbGxhYmxlIG9iamVjdAorICAgICAgICA6 cGFyYW0gc3RyIG9yZGVyX2J5OiB0aGUgYXR0cmlidXRlIG5hbWUgYnkgd2hp Y2ggdG8gb3JkZXIgdGhlIGJ1aWxkcywKKyAgICAgICAgZm9yIGV4YW1wbGUs IG5hbWUsIHZlcnNpb24sIG9yIG52ci4KKyAgICAgICAgOnBhcmFtIGJvb2wg cmV2ZXJzZTogd2hldGhlciB0byBvcmRlciBidWlsZHMgcmV2ZXJzZWx5Lgor ICAgICAgICA6cmV0dXJuOiBhIGxpc3Qgb2YgYnVpbGRzLCBldmVuIGlmIHRo ZXJlIGlzIG9ubHkgb25lIGJ1aWxkLgorICAgICAgICA6cnR5cGU6IGxpc3QK KyAgICAgICAgOnJhaXNlcyBUeXBlRXJyb3I6IGlmIHNlbGVjdG9yIGlzIG5v dCBjYWxsYWJsZSwgb3IgaWYgb3JkZXJfYnkgaXMgbm90IGEKKyAgICAgICAg c3RyaW5nIHZhbHVlLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc3RhdGUg aXMgTm9uZToKKyAgICAgICAgICAgIHN0YXRlID0ga29qaS5CVUlMRF9TVEFU RVNbJ0NPTVBMRVRFJ10KKworICAgICAgICBpZiBzZWxlY3RvciBpcyBub3Qg Tm9uZSBhbmQgbm90IGhhc2F0dHIoc2VsZWN0b3IsICdfX2NhbGxfXycpOgor ICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKAorICAgICAgICAgICAgICAg ICd7MH0gaXMgbm90IGEgY2FsbGFibGUgb2JqZWN0LicuZm9ybWF0KHN0cihz ZWxlY3RvcikpKQorCisgICAgICAgIGlmIG9yZGVyX2J5IGlzIG5vdCBOb25l IGFuZCBub3QgaXNpbnN0YW5jZShvcmRlcl9ieSwgYmFzZXN0cmluZyk6Cisg ICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ29yZGVyX2J5IHswfSBpcyBp bnZhbGlkLicuZm9ybWF0KG9yZGVyX2J5KSkKKworICAgICAgICBidWlsZHMg PSBzZWxmLnNlc3Npb24ubGlzdEJ1aWxkcyhwYWNrYWdlSWQ9cGFja2FnZUlE LCBzdGF0ZT1zdGF0ZSkKKyAgICAgICAgaWYgc2VsZWN0b3IgaXMgbm90IE5v bmU6CisgICAgICAgICAgICBidWlsZHMgPSBbYnVpbGQgZm9yIGJ1aWxkIGlu IGJ1aWxkcyBpZiBzZWxlY3RvcihidWlsZCldCisgICAgICAgIGlmIG9yZGVy X2J5IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgIyBGSVhNRTogaXMgaXQg cG9zc2libGUgdG8gc29ydCBidWlsZHMgYnkgdXNpbmcgb3B0cyBwYXJhbWV0 ZXIgb2YKKyAgICAgICAgICAgICMgbGlzdEJ1aWxkcworICAgICAgICAgICAg YnVpbGRzID0gc29ydGVkKGJ1aWxkcywKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICBrZXk9bGFtYmRhIGl0ZW06IGl0ZW1bb3JkZXJfYnldLAorICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHJldmVyc2U9cmV2ZXJzZSkKKyAg ICAgICAgaWYgdG9wb25lOgorICAgICAgICAgICAgYnVpbGRzID0gYnVpbGRz WzA6MV0KKworICAgICAgICByZXR1cm4gYnVpbGRzCisKKyAgICBAbG9nX2Nh bGwKKyAgICBkZWYgZ2V0UGFja2FnZShzZWxmLCBuYW1lKToKKyAgICAgICAg IiIiR2V0IGEgcGFja2FnZSBmcm9tIEtvamkKKworICAgICAgICA6cGFyYW0g c3RyIG5hbWU6IGEgcGFja2FnZSBuYW1lLgorICAgICAgICA6cmV0dXJuOiBh IG1hcHBpbmcgY29udGFpbmluZyBwYWNrYWdlIGluZm9ybWF0aW9uLiBGb3Ig ZXhhbXBsZSwKKyAgICAgICAgYHsnaWQnOiAxLCAnbmFtZSc6ICdwYWNrYWdl J31gLgorICAgICAgICA6cnR5cGU6IGRpY3QKKyAgICAgICAgIiIiCisgICAg ICAgIHBhY2thZ2UgPSBzZWxmLnNlc3Npb24uZ2V0UGFja2FnZShuYW1lKQor ICAgICAgICBpZiBwYWNrYWdlIGlzIE5vbmU6CisgICAgICAgICAgICBwYWNr YWdlID0gc2VsZi5zZXNzaW9uLmdldFBhY2thZ2UobmFtZS5yc3BsaXQoJy0n LCAxKVswXSkKKyAgICAgICAgICAgIGlmIHBhY2thZ2UgaXMgTm9uZToKKyAg ICAgICAgICAgICAgICByYWlzZSBLb2ppUGFja2FnZU5vdEZvdW5kKAorICAg ICAgICAgICAgICAgICAgICAnQ2Fubm90IGZpbmQgcGFja2FnZSB7MH0uJy5m b3JtYXQobmFtZSkpCisgICAgICAgIHJldHVybiBwYWNrYWdlCisKKyAgICBA bG9nX2NhbGwKKyAgICBkZWYgZ2V0QnVpbGQoc2VsZiwgYnVpbGRJRCk6Cisg ICAgICAgICIiIkdldCBhIGJ1aWxkIGZyb20gS29qaQorCisgICAgICAgIENh bGwga29qaWh1Yi5nZXRCdWlsZC4gUmV0dXJuIGdvdCBidWlsZCBkaXJlY3Rs eSB3aXRob3V0IGNoYW5nZS4KKworICAgICAgICA6cGFyYW0gaW50IGJ1aWxk SUQ6IGlkIG9mIGJ1aWxkIHRvIGdldCBmcm9tIEtvamkuCisgICAgICAgIDpy ZXR1cm46IHRoZSBmb3VuZCBidWlsZC4gUmV0dXJuIE5vbmUsIGlmIG5vdCBm b3VuZCBhIGJ1aWxkIHdpdGgKKyAgICAgICAgYnVpbGRJRC4KKyAgICAgICAg OnJ0eXBlOiBkaWN0CisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2Vs Zi5zZXNzaW9uLmdldEJ1aWxkKGJ1aWxkSUQpCisKKyAgICBAbG9nX2NhbGwK KyAgICBkZWYgZ2V0X3JwbV9idWlsZF9pZChzZWxmLCBuYW1lLCB2ZXJzaW9u LCByZWxlYXNlLCBhcmNoPU5vbmUpOgorICAgICAgICAiIiJHZXQgYnVpbGQg SUQgdGhhdCBjb250YWlucyBhIFJQTSB3aXRoIHNwZWNpZmljIG52cmEKKwor ICAgICAgICBJZiBhcmNoIGlzIG5vdCBvbWl0dGVkLCBhIFJQTSBjYW4gYmUg aWRlbnRpZmllZCBieSBpdHMgTi1WLVItQS4KKworICAgICAgICBJZiBhcmNo IGlzIG9taXR0ZWQsIG5hbWUgaXMgdXNlZCB0byBnZXQgYXNzb2NpYXRlZCBw YWNrYWdlLCBhbmQgdGhlbgorICAgICAgICB0byBnZXQgdGhlIGJ1aWxkLgor CisgICAgICAgIEV4YW1wbGU6CisKKyAgICAgICAgPj4+IGJyZXcgPSBCcmV3 KCd1cmwgdG8ga29qaWh1YicpCisgICAgICAgID4+PiBicmV3LmdldF9ycG1f YnVpbGRfaWQoJ2h0dHBkJywgJzIuNC4xOCcsICcyLmZjMjQnKQorICAgICAg ICA+Pj4gYnJldy5nZXRfcnBtX2J1aWxkX2lkKCdodHRwZCcsICcyLjQuMTgn LCAnMi5mYzI1JywgJ3g4Nl82NCcpCisKKyAgICAgICAgOnBhcmFtIHN0ciBu YW1lOiBuYW1lIG9mIGEgcnBtCisgICAgICAgIDpwYXJhbSBzdHIgdmVyc2lv bjogdmVyc2lvbiBvZiBhIHJwbQorICAgICAgICA6cGFyYW0gc3RyIHJlbGVh c2U6IHJlbGVhc2Ugb2YgYSBycG0KKyAgICAgICAgOnBhcmFtIGFyY2g6IGFy Y2ggb2YgYSBycG0KKyAgICAgICAgOnR5cGUgYXJjaDogc3RyIG9yIE5vbmUK KyAgICAgICAgOnJldHVybjogaWQgb2YgdGhlIGJ1aWxkIGZyb20gd2hlcmUg dGhlIFJQTSBpcyBidWlsdAorICAgICAgICA6cnR5cGU6IGRpY3QKKyAgICAg ICAgOnJhaXNlcyBLb2ppUGFja2FnZU5vdEZvdW5kOiBpZiBuYW1lIGlzIG5v dCBmb3VuZCBmcm9tIEtvamkgaWYgYXJjaAorICAgICAgICBpcyBOb25lLgor ICAgICAgICAiIiIKKyAgICAgICAgaWYgYXJjaCBpcyBOb25lOgorICAgICAg ICAgICAgcGFja2FnZSA9IHNlbGYuZ2V0UGFja2FnZShuYW1lKQorICAgICAg ICAgICAgc2VsZWN0b3IgPSBsYW1iZGEgaXRlbTogaXRlbVsndmVyc2lvbidd ID09IHZlcnNpb24gYW5kIFwKKyAgICAgICAgICAgICAgICBpdGVtWydyZWxl YXNlJ10gPT0gcmVsZWFzZQorICAgICAgICAgICAgYnVpbGRzID0gc2VsZi5s aXN0QnVpbGRzKHBhY2thZ2VJRD1wYWNrYWdlWydpZCddLAorICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yPXNlbGVjdG9y KQorICAgICAgICAgICAgaWYgbm90IGJ1aWxkczoKKyAgICAgICAgICAgICAg ICByYWlzZSBOb0J1aWxkc0Vycm9yKAorICAgICAgICAgICAgICAgICAgICAn Tm8gYnVpbGRzIGFyZSBzZWxlY3RlZCBmcm9tIHBhY2thZ2UgezB9LicuZm9y bWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZVsnbmFtZSdd KSkKKyAgICAgICAgICAgIHJldHVybiBidWlsZHNbMF1bJ2J1aWxkX2lkJ10K KyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJwbSA9IHNlbGYuZ2V0UlBN KHsnbmFtZSc6IG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgJ3ZlcnNpb24nOiB2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICdyZWxlYXNlJzogcmVsZWFzZSwKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAnYXJjaCc6IGFyY2gsCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgIHJldHVybiBycG1b J2J1aWxkX2lkJ10KKworICAgIEBsb2dfY2FsbAorICAgIGRlZiBnZXRfcGFj a2FnZV9sYXRlc3RfYnVpbGQoc2VsZiwgcGFja2FnZV9uYW1lLCBkaXN0cm8p OgorICAgICAgICAiIiJHZXQgbGF0ZXN0IGJ1aWxkIGZyb20gYSBwYWNrYWdl CisKKyAgICAgICAgRXhhbXBsZToKKworICAgICAgICA+Pj4gYnJldyA9IEJy ZXcoJ3VybCB0byBrb2ppaHViJykKKyAgICAgICAgPj4+IGJyZXcuZ2V0X3Bh Y2thZ2VfbGF0ZXN0X2J1aWxkKCdodHRwZCcsICdmYzI0JykKKworICAgICAg ICA6cGFyYW0gc3RyIHBhY2thZ2VfbmFtZTogZnJvbSB3aGljaCBwYWNrYWdl IHRvIGdldCB0aGUgbGF0ZXN0IGJ1aWxkCisgICAgICAgIDpwYXJhbSBzdHIg ZGlzdHJvOiB3aGljaCBkaXN0cm8gdGhlIGxhdGVzdCBidWlsZCBiZWxvbmdz IHRvCisgICAgICAgIDpyZXR1cm46IHRoZSBmb3VuZCBidWlsZAorICAgICAg ICA6cnR5cGU6IGRpY3Qgb3IgTm9uZQorICAgICAgICA6cmFpc2VzIE5vQ29t cGxldGVCdWlsZHM6IGlmIHRoZXJlIGlzIG5vIGxhdGVzdCBidWlsZCBvZiBh IHBhY2thZ2UuCisgICAgICAgICIiIgorICAgICAgICBwYWNrYWdlID0gc2Vs Zi5nZXRQYWNrYWdlKHBhY2thZ2VfbmFtZSkKKyAgICAgICAgc2VsZWN0b3Ig PSBsYW1iZGEgaXRlbTogaXRlbVsncmVsZWFzZSddLmZpbmQoZGlzdHJvKSA+ IC0xCisKKyAgICAgICAgYnVpbGRzID0gc2VsZi5saXN0QnVpbGRzKHBhY2th Z2VJRD1wYWNrYWdlWydpZCddLAorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgc2VsZWN0b3I9c2VsZWN0b3IsCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBvcmRlcl9ieT0nbnZyJywKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHJldmVyc2U9VHJ1ZSkKKyAgICAgICAg aWYgbm90IGJ1aWxkczoKKyAgICAgICAgICAgIHJhaXNlIE5vQ29tcGxldGVC dWlsZHMoCisgICAgICAgICAgICAgICAgJ05vIGNvbXBsZXRlIGJ1aWxkcyBv ZiBwYWNrYWdlIHswfScuZm9ybWF0KHBhY2thZ2VfbmFtZSkpCisKKyAgICAg ICAgcmV0dXJuIGJ1aWxkc1swXQorCisgICAgQGxvZ19jYWxsCisgICAgZGVm IHNlbGVjdF9ycG1zX2Zyb21fYV9idWlsZChzZWxmLCBidWlsZF9pZCwgcGFj a2FnZV9uYW1lLCBhcmNoZXM9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHNlbGVjdF9zdWJwYWNrYWdlcz1Ob25lKToKKyAgICAg ICAgIiIiU2VsZWN0IHNwZWNpZmljIFJQTXMgd2l0aGluIGEgYnVpbGQKKwor ICAgICAgICBSUE1zIGNvdWxkIGJlIGZpbHRlcmVkIGJlIHNwZWNpZmljIGNy aXRlcmlhcyBieSB0aGUgcGFyYW1ldGVycy4KKworICAgICAgICBCeSBkZWZh dWx0LCBmZWRhYmlwa2dkaWZmIHJlcXVpcmVzIFJQTSBwYWNrYWdlIGFuZCBh c3NvY2lhdGVkIGRlYnVnaW5mbworICAgICAgICBwYWNrYWdlLCBib3RoIG9m IHRoZXNlIHR3byBwYWNrYWdlcyBhcmUgc2VsZWN0ZWQsIGFuZCBub2FyY2gg YW5kIHNyYworICAgICAgICBhcmUgZXhjbHVkZWQuCisKKyAgICAgICAgOnBh cmFtIGludCBidWlsZF9pZDogZnJvbSB3aGljaCBidWlsZCB0byBzZWxlY3Qg cnBtcy4KKyAgICAgICAgOnBhcmFtIHN0ciBwYWNrYWdlX25hbWU6IHdoaWNo IHJwbSB0byBzZWxlY3QgdGhhdCBtYXRjaGVzIHRoaXMgbmFtZS4KKyAgICAg ICAgOnBhcmFtIGFyY2hlczogd2hpY2ggYXJjaGVzIHRvIHNlbGVjdC4gSWYg YXJjaGVzIG9taXRzLCBycG1zIHdpdGggYWxsCisgICAgICAgIGFyY2hlcyBl eGNlcHQgbm9hcmNoIGFuZCBzcmMgd2lsbCBiZSBzZWxlY3RlZC4KKyAgICAg ICAgOnR5cGUgYXJjaGVzOiBsaXN0LCB0dXBsZSBvciBOb25lCisgICAgICAg IDpwYXJhbSBib29sIHNlbGVjdF9zdWJwYWNrYWdlczogaW5kaWNhdGUgd2hl dGhlciB0byBzZWxlY3QgYWxsIFJQTXMKKyAgICAgICAgd2l0aCBzcGVjaWZp YyBhcmNoIGZyb20gYnVpbGQuCisgICAgICAgIDpyZXR1cm46IGEgbGlzdCBv ZiBSUE1zIHJldHVybmVkIGZyb20gbGlzdFJQTXMKKyAgICAgICAgOnJ0eXBl OiBsaXN0CisgICAgICAgICIiIgorICAgICAgICBleGNsdWRlZF9hcmNoZXMg PSAoJ25vYXJjaCcsICdzcmMnKQorCisgICAgICAgIGRlZiBycG1zX3NlbGVj dG9yKHBhY2thZ2VfbmFtZSwgZXhjbHVkZWRfYXJjaGVzKToKKyAgICAgICAg ICAgIHJldHVybiBsYW1iZGEgcnBtOiBcCisgICAgICAgICAgICAgICAgcnBt WydhcmNoJ10gbm90IGluIGV4Y2x1ZGVkX2FyY2hlcyBhbmQgXAorICAgICAg ICAgICAgICAgIChycG1bJ25hbWUnXSA9PSBwYWNrYWdlX25hbWUgb3IKKyAg ICAgICAgICAgICAgICAgcnBtWyduYW1lJ10uZW5kc3dpdGgoJy1kZWJ1Z2lu Zm8nKSkKKworICAgICAgICBpZiBzZWxlY3Rfc3VicGFja2FnZXM6CisgICAg ICAgICAgICBzZWxlY3RvciA9IGxhbWJkYSBycG06IHJwbVsnYXJjaCddIG5v dCBpbiBleGNsdWRlZF9hcmNoZXMKKyAgICAgICAgZWxzZToKKyAgICAgICAg ICAgIHNlbGVjdG9yID0gcnBtc19zZWxlY3RvcihwYWNrYWdlX25hbWUsIGV4 Y2x1ZGVkX2FyY2hlcykKKyAgICAgICAgcnBtX2luZm9zID0gc2VsZi5saXN0 UlBNcyhidWlsZElEPWJ1aWxkX2lkLAorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGFyY2hlcz1hcmNoZXMsCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgc2VsZWN0b3I9c2VsZWN0b3IpCisgICAgICAg IHJldHVybiBbUlBNKHJwbV9pbmZvKSBmb3IgcnBtX2luZm8gaW4gcnBtX2lu Zm9zXQorCisgICAgQGxvZ19jYWxsCisgICAgZGVmIGdldF9sYXRlc3RfYnVp bHRfcnBtcyhzZWxmLCBwYWNrYWdlX25hbWUsIGRpc3RybywgYXJjaGVzPU5v bmUpOgorICAgICAgICAiIiJHZXQgUlBNcyBmcm9tIGxhdGVzdCBidWlsZCBv ZiBhIHBhY2thZ2UKKworICAgICAgICA6cGFyYW0gc3RyIHBhY2thZ2VfbmFt ZTogZnJvbSB3aGljaCBwYWNrYWdlIHRvIGdldCB0aGUgcnBtcworICAgICAg ICA6cGFyYW0gc3RyIGRpc3Rybzogd2hpY2ggZGlzdHJvIHRoZSBycG1zIGJl bG9uZyB0bworICAgICAgICA6cGFyYW0gYXJjaGVzOiB3aGljaCBhcmNoZXMg dGhlIHJwbXMgYmVsb25nIHRvCisgICAgICAgIDp0eXBlIGFyY2hlczogc3Ry IG9yIE5vbmUKKyAgICAgICAgOnJldHVybjogdGhlIHNlbGVjdGVkIFJQTXMK KyAgICAgICAgOnJ0eXBlOiBsaXN0CisgICAgICAgICIiIgorICAgICAgICBs YXRlc3RfYnVpbGQgPSBzZWxmLmdldF9wYWNrYWdlX2xhdGVzdF9idWlsZChw YWNrYWdlX25hbWUsIGRpc3RybykKKyAgICAgICAgIyBHZXQgcnBtIGFuZCBk ZWJ1Z2luZm8gcnBtIGZyb20gZWFjaCBhcmNoCisgICAgICAgIHJldHVybiBz ZWxmLnNlbGVjdF9ycG1zX2Zyb21fYV9idWlsZChsYXRlc3RfYnVpbGRbJ2J1 aWxkX2lkJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBwYWNrYWdlX25hbWUsCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBhcmNoZXM9YXJjaGVzKQorCisK K0Bsb2dfY2FsbAorZGVmIGdldF9zZXNzaW9uKCk6CisgICAgIiIiR2V0IGlu c3RhbmNlIG9mIEJyZXcgdG8gdGFsayB3aXRoIEtvamkiIiIKKyAgICByZXR1 cm4gQnJldyhnbG9iYWxfY29uZmlnLmtvamlfc2VydmVyKQorCisKK0Bsb2df Y2FsbAorZGVmIGdldF9kb3dubG9hZF9kaXIoKToKKyAgICAiIiJSZXR1cm4g dGhlIGRpcmVjdG9yeSBob2xkaW5nIGFsbCBkb3dubG9hZGVkIFJQTXMKKwor ICAgIElmIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCwgaXQgaXMgY3JlYXRl ZCBhdXRvbWF0aWNhbGx5LgorCisgICAgOnJldHVybjogcGF0aCB0byBkaXJl Y3RvcnkgaG9sZGluZyBkb3dubG9hZGVkIFJQTXMuCisgICAgOnJ0eXBlOiBz dHIKKyAgICAiIiIKKyAgICBkb3dubG9hZF9kaXIgPSBvcy5wYXRoLmpvaW4o SE9NRV9ESVIsICdkb3dubG9hZHMnKQorICAgIGlmIG5vdCBvcy5wYXRoLmV4 aXN0cyhkb3dubG9hZF9kaXIpOgorICAgICAgICBvcy5tYWtlZGlycyhkb3du bG9hZF9kaXIpCisgICAgcmV0dXJuIGRvd25sb2FkX2RpcgorCisKK0Bsb2df Y2FsbAorZGVmIGRvd25sb2FkX3JwbSh1cmwpOgorICAgICIiIlVzaW5nIGN1 cmwgdG8gZG93bmxvYWQgYSBSUE0gZnJvbSBLb2ppCisKKyAgICBDdXJyZW50 bHksIGN1cmwgaXMgY2FsbGVkIGFuZCBydW5zIGluIGEgc3Bhd25lZCBwcm9j ZXNzLiBweWN1cmwgd291bGQgYmUgYQorICAgIGdvb2Qgd2F5IGluc3RlYWQu IFRoaXMgd291bGQgYmUgY2hhbmdlZCBpbiB0aGUgZnV0dXJlLgorCisgICAg OnBhcmFtIHN0ciB1cmw6IFVSTCBvZiBhIFJQTSB0byBkb3dubG9hZC4KKyAg ICA6cmV0dXJuOiBUcnVlIGlmIGEgUlBNIGlzIGRvd25sb2FkZWQgc3VjY2Vz c2Z1bGx5LCBGYWxzZSBvdGhlcndpc2UuCisgICAgOnJ0eXBlOiBib29sCisg ICAgIiIiCisgICAgY21kID0gJ2N1cmwgLS1zaWxlbnQgLUMgLSAtTyB7fSA+ IHt9Jy5mb3JtYXQoCisgICAgICAgIHVybCwgb3MucGF0aC5qb2luKGdldF9k b3dubG9hZF9kaXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3Mu cGF0aC5iYXNlbmFtZSh1cmwpKSkKKyAgICByZXR1cm5fY29kZSA9IHN1YnBy b2Nlc3MuY2FsbChjbWQsIHNoZWxsPVRydWUpCisgICAgaWYgcmV0dXJuX2Nv ZGUgPiAwOgorICAgICAgICBsb2dnZXIuZXJyb3IoJ2N1cmwgZmFpbHMgd2l0 aCByZXR1cm5lZCBjb2RlOiAlZC4nLCByZXR1cm5fY29kZSkKKyAgICAgICAg cmV0dXJuIEZhbHNlCisgICAgcmV0dXJuIFRydWUKKworCitAbG9nX2NhbGwK K2RlZiBkb3dubG9hZF9ycG1zKHJwbXMpOgorICAgICIiIkRvd25sb2FkIFJQ TXMKKworICAgIDpwYXJhbSBsaXN0IHJwbXM6IGxpc3Qgb2YgUlBNcyB0byBk b3dubG9hZC4KKyAgICAiIiIKKyAgICBkZWYgX2Rvd25sb2FkKHJwbSk6Cisg ICAgICAgIGlmIHJwbS5pc19kb3dubG9hZGVkOgorICAgICAgICAgICAgbG9n Z2VyLmRlYnVnKCdSZXVzZSAlcycsIHJwbS5kb3dubG9hZGVkX2ZpbGUpCisg ICAgICAgIGVsc2U6CisgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0Rvd25s b2FkICVzJywgcnBtLmRvd25sb2FkX3VybCkKKyAgICAgICAgICAgIGRvd25s b2FkX3JwbShycG0uZG93bmxvYWRfdXJsKQorCisgICAgbWFwKF9kb3dubG9h ZCwgcnBtcykKKworCitAbG9nX2NhbGwKK2RlZiBhYmlwa2dkaWZmKHBrZ19p bmZvMSwgcGtnX2luZm8yKToKKyAgICAiIiJSdW4gYWJpcGtnZGlmZiBhZ2Fp bnN0IGZvdW5kIHR3byBSUE0gcGFja2FnZXMKKworICAgIENvbnN0cnVjdCBh bmQgZXhlY3V0ZSBhYmlwa2dkaWZmIHRvIGdldCBBQkkgZGlmZgorCisgICAg YWJpcGtnZGlmZiBcCisgICAgICAgIC0tZDEgcGFja2FnZTEtZGVidWdpbmZv IC0tZDIgcGFja2FnZTItZGVidWdpbmZvIFwKKyAgICAgICAgcGFja2FnZTEt cnBtIHBhY2thZ2UyLXJwbQorCisgICAgT3V0cHV0IHRvIHN0ZG91dCBvciBz dGRlcnIgZnJvbSBhYmlwa2dkaWZmIGlzIG5vdCBjYXB0dXJlZC4gYWJpcGtn ZGlmZiBpcworICAgIGNhbGxlZCBzeW5jaHJvbm91c2x5LiBmZWRhYmlwa2dk aWZmIGRvZXMgbm90IHJldHVybiB1bnRpbCB1bmRlcmx5aW5nCisgICAgYWJp cGtnZGlmZiBmaW5pc2hlcy4KKworICAgIDpwYXJhbSBQa2dJbmZvIHBrZ19p bmZvMTogdGhlIGZpcnN0IHBhY2thZ2UgaW5mb3JtYXRpb24gcHJvdmlkZWQg Zm9yCisgICAgYWJpcGtnZGlmZiBwYWNrYWdlMSBwYXJhbXRlci4KKyAgICA6 cGFyYW0gUGtnSW5mbyBwa2dfaW5mbzI6IHRoZSBzZWNvbmQgcGFja2FnZSBp bmZvcm1hdGlvbiBwcm92aWRlZCBmb3IKKyAgICBhYmlwa2dkaWZmIHBhY2th Z2UyIHBhcmFtdGVyLgorICAgIDpyZXR1cm46IHJldHVybiBjb2RlIG9mIHVu ZGVybHlpbmcgYWJpcGtnZGlmZiBleGVjdXRpb24uCisgICAgOnJ0eXBlOiBp bnQKKyAgICAiIiIKKyAgICBjbWQgPSAnYWJpcGtnZGlmZiAtLWQxIHswfSAt LWQyIHsxfSB7Mn0gezN9Jy5mb3JtYXQoCisgICAgICAgIHBrZ19pbmZvMS5k ZWJ1Z2luZm9fcGFja2FnZS5kb3dubG9hZGVkX2ZpbGUsCisgICAgICAgIHBr Z19pbmZvMi5kZWJ1Z2luZm9fcGFja2FnZS5kb3dubG9hZGVkX2ZpbGUsCisg ICAgICAgIHBrZ19pbmZvMS5wYWNrYWdlLmRvd25sb2FkZWRfZmlsZSwKKyAg ICAgICAgcGtnX2luZm8yLnBhY2thZ2UuZG93bmxvYWRlZF9maWxlKQorCisg ICAgaWYgZ2xvYmFsX2NvbmZpZy5kcnlfcnVuOgorICAgICAgICBwcmludCAn RFJZLVJVTjonLCBjbWQKKyAgICAgICAgcmV0dXJuCisKKyAgICBsb2dnZXIu ZGVidWcoJ1J1bjogJXMnLCBjbWQpCisKKyAgICBwcmludCAnQ29tcGFyaW5n IHRoZSBBQkkgb2YgYmluYXJpZXMgYmV0d2VlbiB7fSBhbmQge306Jy5mb3Jt YXQoCisgICAgICAgIHBrZ19pbmZvMS5wYWNrYWdlLmZpbGVuYW1lLCBwa2df aW5mbzIucGFja2FnZS5maWxlbmFtZSkKKyAgICBwcmludAorCisgICAgcHJv YyA9IHN1YnByb2Nlc3MuUG9wZW4oc2hsZXguc3BsaXQoY21kKSkKKyAgICBy ZXR1cm4gcHJvYy53YWl0KCkKKworCitkZWYgbWFnaWNfY29uc3RydWN0KHJw bXMpOgorICAgICIiIkNvbnN0cnVjdCBSUE1zIGludG8gYSBtYWdpYyBzdHJ1 Y3R1cmUKKworICAgIENvbnZlcnQgbGlzdCBvZgorCisgICAgZm9vLTEuMC0x LmZjMjIuaTY4NgorICAgIGZvby1kZWJ1Z2luZm8tMS4wLTEuZmMyMi5pNjg2 CisgICAgZm9vLWRldmVsLTEuMC0xLmZjMjIuaTY4NgorCisgICAgdG8gbGlz dCBvZgorCisgICAgKGZvby0xLjAtMS5mYzIyLmk2ODYsIGZvby1kZWJ1Z2lu Zm8tMS4wLTEuZmMyMi5pNjg2KQorICAgIChmb28tZGV2ZWwtMS4wLTEuZmMy Mi5pNjg2LCBmb28tZGVidWdpbmZvLTEuMC0xLmZjMjIuaTY4NikKKworICAg IDpwYXJhbSBycG1zOiBhIHNlcXVlbmNlIG9mIFJQTSBwYWNrYWdlcy4KKyAg ICA6dHlwZSBycG1zOiBsaXN0IG9yIHR1cGxlCisgICAgOnJldHVybjogbGlz dCBvZiB0d28tZWxlbWVudCB0dXBsZSB3aGVyZSB0aGUgZmlyc3QgZWxlbWVu dCBpcyBhIFJQTSBwYWNrYWdlCisgICAgYW5kIHRoZSBzZWNvbmQgb25lIGlz IHRoZSBkZWJ1Z2luZm8gcGFja2FnZS4KKyAgICA6cnR5cGU6IGxpc3QKKyAg ICAiIiIKKyAgICBkZWJ1Z2luZm8gPSBOb25lCisgICAgcGFja2FnZXMgPSBb XQorICAgIGZvciBycG0gaW4gcnBtczoKKyAgICAgICAgaWYgcnBtLmlzX2Rl YnVnaW5mbzoKKyAgICAgICAgICAgIGRlYnVnaW5mbyA9IHJwbQorICAgICAg ICBlbHNlOgorICAgICAgICAgICAgcGFja2FnZXMuYXBwZW5kKHJwbSkKKyAg ICByZXR1cm4gW1BrZ0luZm8ocGFja2FnZSwgZGVidWdpbmZvKSBmb3IgcGFj a2FnZSBpbiBwYWNrYWdlc10KKworCitAbG9nX2NhbGwKK2RlZiBydW5fYWJp cGtnZGlmZihwa2cxX2luZm9zLCBwa2cyX2luZm9zKToKKyAgICAiIiJSdW4g YWJpcGtnZGlmZgorCisgICAgSWYgb25lIG9mIHRoZSBleGVjdXRpb25zIGZp bmRzIEFCSSBkaWZmZXJlbmNlcywgdGhlIHJldHVybiBjb2RlIGlzIHRoZQor ICAgIHJldHVybiBjb2RlIGZyb20gYWJpcGtnZGlmZi4KKworICAgIDpwYXJh bSBkaWN0IHBrZzFfaW5mb3M6IGEgbWFwcGluZyBmcm9tIGFyY2ggdG8gbGlz dCBvZiBSUE1zCisgICAgOnJldHVybjogZXhpdCBjb2RlIG9mIHRoZSBsYXN0 IG5vbi16ZXJvIHJldHVybmVkIGZyb20gdW5kZXJseWluZyBhYmlwa2dkaWZm CisgICAgOnJ0eXBlOiBudW1iZXIKKyAgICAiIiIKKyAgICBhcmNoZXMgPSBw a2cxX2luZm9zLmtleXMoKQorICAgIGFyY2hlcy5zb3J0KCkKKworICAgIHJl dHVybl9jb2RlID0gMAorCisgICAgZm9yIGFyY2ggaW4gYXJjaGVzOgorICAg ICAgICBwa2dfaW5mb3MgPSBtYWdpY19jb25zdHJ1Y3QocGtnMV9pbmZvc1th cmNoXSkKKworICAgICAgICBmb3IgcGtnX2luZm8gaW4gcGtnX2luZm9zOgor ICAgICAgICAgICAgcnBtcyA9IHBrZzJfaW5mb3NbYXJjaF0KKworICAgICAg ICAgICAgcGFja2FnZSA9IFtycG0gZm9yIHJwbSBpbiBycG1zCisgICAgICAg ICAgICAgICAgICAgICAgIGlmIHJwbS5uYW1lID09IHBrZ19pbmZvLnBhY2th Z2UubmFtZV1bMF0KKyAgICAgICAgICAgIGRlYnVnaW5mbyA9IFtycG0gZm9y IHJwbSBpbiBycG1zCisgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcnBt Lm5hbWUgPT0gcGtnX2luZm8uZGVidWdpbmZvX3BhY2thZ2UubmFtZV1bMF0K KworICAgICAgICAgICAgcmV0ID0gYWJpcGtnZGlmZihwa2dfaW5mbywKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgUGtnSW5mbyhwYWNrYWdlPXBh Y2thZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ZGVidWdpbmZvX3BhY2thZ2U9ZGVidWdpbmZvKSkKKyAgICAgICAgICAgIGlm IHJldCA+IDA6CisgICAgICAgICAgICAgICAgcmV0dXJuX2NvZGUgPSByZXQK KworICAgIHJldHVybiByZXR1cm5fY29kZQorCisKK0Bsb2dfY2FsbAorZGVm IGRpZmZfbG9jYWxfcnBtX3dpdGhfbGF0ZXN0X3JwbV9mcm9tX2tvamkoKToK KyAgICAiIiJEaWZmIGFnYWluc3QgbG9jYWwgcnBtIGFuZCByZW1vdmUgbGF0 ZXN0IHJwbQorCisgICAgVGhpcyBvcGVyYXRpb24gaGFuZGxlcyBhIGxvY2Fs IHJwbSBhbmQgZGVidWdpbmZvIHJwbSBhbmQgcmVtb3RlIG9uZXMKKyAgICBs b2NhdGVkIGluIHJlbW90ZSBLb2ppIHNlcnZlciwgdGhhdCBoYXMgc3BlY2lm aWMgZGlzdHJvIHNwZWNpZmljZWQgYnkKKyAgICBhcmd1bWVudCAtLWZyb20u CisKKyAgICAxLyBTdXBwb3NlIHRoZSBwYWNrYWdlciBoYXMganVzdCBsb2Nh bGx5IGJ1aWx0IGEgcGFja2FnZSBuYW1lZAorICAgIGZvby0zLjAuZmMyNC5y cG0uIFRvIGNvbXBhcmUgdGhlIEFCSSBvZiB0aGlzIGxvY2FsbHkgYnVpbGQg cGFja2FnZSB3aXRoIHRoZQorICAgIGxhdGVzdCBzdGFibGUgcGFja2FnZSBm cm9tIEZlZG9yYSAyMywgb25lIHdvdWxkIGRvOgorCisgICAgZmVkYWJpcGtn ZGlmZiAtLWZyb20gZmMyMyAuL2Zvby0zLjAuZmMyNC5ycG0KKyAgICAiIiIK KworICAgIGZyb21fZGlzdHJvID0gZ2xvYmFsX2NvbmZpZy5mcm9tX2Rpc3Ry bworICAgIGlmIG5vdCBpc19kaXN0cm9fdmFsaWQoZnJvbV9kaXN0cm8pOgor ICAgICAgICByYWlzZSBJbnZhbGlkRGlzdHJvRXJyb3IoJ0ludmFsaWQgZGlz dHJvIHswfScuZm9ybWF0KGZyb21fZGlzdHJvKSkKKworICAgIGxvY2FsX3Jw bV9maWxlID0gZ2xvYmFsX2NvbmZpZy5OVlJbMF0KKyAgICBpZiBub3Qgb3Mu cGF0aC5leGlzdHMobG9jYWxfcnBtX2ZpbGUpOgorICAgICAgICByYWlzZSBW YWx1ZUVycm9yKCd7MH0gZG9lcyBub3QgZXhpc3QuJy5mb3JtYXQobG9jYWxf cnBtX2ZpbGUpKQorCisgICAgbG9jYWxfcnBtID0gTG9jYWxSUE0obG9jYWxf cnBtX2ZpbGUpCisgICAgbG9jYWxfZGVidWdpbmZvID0gbG9jYWxfcnBtLmZp bmRfZGVidWdpbmZvKCkKKyAgICBpZiBsb2NhbF9kZWJ1Z2luZm8gaXMgTm9u ZToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICdk ZWJ1Z2luZm8gcnBtIHswfSBkb2VzIG5vdCBleGlzdC4nLmZvcm1hdChsb2Nh bF9kZWJ1Z2luZm8pKQorCisgICAgcnBtcyA9IHNlc3Npb24uZ2V0X2xhdGVz dF9idWlsdF9ycG1zKGxvY2FsX3JwbS5uYW1lLAorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tX2Rpc3RybywKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJjaGVzPWxv Y2FsX3JwbS5hcmNoKQorICAgIGRvd25sb2FkX3JwbXMocnBtcykKKyAgICBw a2dfaW5mb3MgPSBtYWtlX3JwbXNfdXNhYmxlX2Zvcl9hYmlwa2dkaWZmKHJw bXMpCisKKyAgICBycG1zID0gcGtnX2luZm9zLnZhbHVlcygpWzBdCisgICAg cGFja2FnZSwgZGVidWdpbmZvID0gc29ydGVkKHJwbXMsIGtleT1sYW1iZGEg cnBtOiBycG0ubmFtZSkKKyAgICByZXR1cm4gYWJpcGtnZGlmZihQa2dJbmZv KHBhY2thZ2UsIGRlYnVnaW5mbyksCisgICAgICAgICAgICAgICAgICAgICAg UGtnSW5mbyhsb2NhbF9ycG0sIGxvY2FsX2RlYnVnaW5mbykpCisKKworQGxv Z19jYWxsCitkZWYgbWFrZV9ycG1zX3VzYWJsZV9mb3JfYWJpcGtnZGlmZihy cG1zKToKKyAgICAiIiJQcmVwYXJlIHBhY2thZ2UgaW5mb3JtYXRpb24gc3Ry dWN0dXJlIGZvciBydW5uaW5nIGFiaXBrZ2RpZmYKKworICAgIFNvIGZhciwg UlBNcyBpbnB1dCB0byB0aGlzIG1ldGhvZCBhcmUgcXVlcmllZCBmcm9tIEtv amkgYW5kIGFiaXBrZ2RpZmYgd2lsbAorICAgIHJ1biBhZ2FpbnN0IHRoZXNl IFJQTXMuIEZvciBjb252ZW5pZW5jZSwgdGhlc2UgUlBNcyBzaG91bGQgYmUg cmVzdHJ1Y3R1cmVkCisgICAgaW50byBhIG1hcHBpbmcgc28gdGhhdCBzdWJz ZXF1ZW50IG9wZXJhdGlvbnMgY291bGQgZWFzaWx5IGZpbmQgUlBNcyBmcm9t CisgICAgYXJjaC4KKworICAgIEZvciBleGFtcGxlLCBpbnB1dCBSUE1zIGFy ZQorCisgICAgW1JQTShhcmNoPSd4ODZfNjQnLCBuYW1lPSdodHRwZCcpLAor ICAgICBSUE0oYXJjaD0naTY4NicsIG5hbWU9J2h0dHBkJyksCisgICAgIFJQ TShhcmNoPSd4ODZfNjQnLCBuYW1lPSdodHRwZC1kZXZlbCcpLAorICAgICBS UE0oYXJjaD0naTY4NicsIG5hbWU9J2h0dHAtZGVidWdpbmZvJyksCisgICAg IFJQTShhcmNoPSd4ODZfNjQnLCBuYW1lPSdodHRwZC1kZWJ1Z2luZm8nKSwK KyAgICAgXQorCisgICAgaXQgaXMgY29udmVydGVkIGludG8gbWFwcGluZwor CisgICAgeworICAgICAgICAneDg2XzY0JzogW1JQTShhcmNoPSd4ODZfNjQn LCBuYW1lPSdodHRwZCcpLAorICAgICAgICAgICAgICAgICAgIFJQTShhcmNo PSd4ODZfNjQnLCBuYW1lPSdodHRwZC1kZXZlbCcpLAorICAgICAgICAgICAg ICAgICAgIFJQTShhcmNoPSd4ODZfNjQnLCBuYW1lPSdodHRwZC1kZWJ1Z2lu Zm8nKV0sCisgICAgICAgICdpNjg2JzogW1JQTShhcmNoPSdpNjg2JywgbmFt ZT0naHR0cGQnKSwKKyAgICAgICAgICAgICAgICAgUlBNKGFyY2g9J2k2ODYn LCBuYW1lPSdodHRwLWRlYnVnaW5mbycpXSwKKyAgICB9CisKKyAgICBUaGUg b3JkZXIgUlBNcyBpbiB0aGUgbWFwcGluZyBpcyB1bnByZWRpY3RhYmxlLiBT bywgaWYgdGhleSBtdXN0IGJlIGluIGEKKyAgICBwYXJ0aWN1bGFyIG9yZGVy LCBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIHRoaXMuCisKKyAgICA6cGFy YW0gbGlzdCBycG1zOiBhIGxpc3Qgb2YgUlBNcworICAgIDpyZXR1cm46IGEg bWFwcGluZyBmcm9tIGFuIGFyY2ggdG8gY29ycmVzcG9uZGluZyBsaXN0IG9m IFJQTXMKKyAgICA6cnR5cGU6IGRpY3QKKyAgICAiIiIKKyAgICByZXN1bHQg PSB7fQorICAgIHJwbXNfaXRlciA9IGdyb3VwYnkoc29ydGVkKHJwbXMsIGtl eT1sYW1iZGEgcnBtOiBycG0uYXJjaCksCisgICAgICAgICAgICAgICAgICAg ICAgICBrZXk9bGFtYmRhIGl0ZW06IGl0ZW0uYXJjaCkKKyAgICBmb3IgYXJj aCwgcnBtcyBpbiBycG1zX2l0ZXI6CisgICAgICAgIHJlc3VsdFthcmNoXSA9 IGxpc3QocnBtcykKKyAgICByZXR1cm4gcmVzdWx0CisKKworQGxvZ19jYWxs CitkZWYgZGlmZl9sYXRlc3RfcnBtc19iYXNlZF9vbl9kaXN0cm9zKCk6Cisg ICAgIiIiYWJpcGtnZGlmZiBycG1zIGJhc2VkIG9uIHR3byBkaXN0cm9zCisK KyAgICAyLyBTdXBwb3NlIHRoZSBwYWNrYWdlciB3YW50cyB0byBzZWUgaG93 IHRoZSBBQklzIG9mIHRoZSBwYWNrYWdlIGZvbworICAgIGV2b2x2ZWQgYmV0 d2VlbiBmZWRvcmEgMTkgYW5kIGZlZG9yYSAyMi4gU2hlIHdvdWxkIHRodXMg dHlwZSB0aGUgY29tbWFuZDoKKworICAgIGZlZGFiaXBrZ2RpZmYgLS1mcm9t IGZjMTkgLS10byBmYzIyIGZvbworICAgICIiIgorCisgICAgZnJvbV9kaXN0 cm8gPSBnbG9iYWxfY29uZmlnLmZyb21fZGlzdHJvCisgICAgdG9fZGlzdHJv ID0gZ2xvYmFsX2NvbmZpZy50b19kaXN0cm8KKworICAgIGlmIG5vdCBpc19k aXN0cm9fdmFsaWQoZnJvbV9kaXN0cm8pOgorICAgICAgICByYWlzZSBJbnZh bGlkRGlzdHJvRXJyb3IoJ0ludmFsaWQgZGlzdHJvIHswfScuZm9ybWF0KGZy b21fZGlzdHJvKSkKKworICAgIGlmIG5vdCBpc19kaXN0cm9fdmFsaWQodG9f ZGlzdHJvKToKKyAgICAgICAgcmFpc2UgSW52YWxpZERpc3Ryb0Vycm9yKCdJ bnZhbGlkIGRpc3RybyB7MH0nLmZvcm1hdChkaXN0cm8pKQorCisgICAgcGFj a2FnZV9uYW1lID0gZ2xvYmFsX2NvbmZpZy5OVlJbMF0KKworICAgIHJwbXMg PSBzZXNzaW9uLmdldF9sYXRlc3RfYnVpbHRfcnBtcyhwYWNrYWdlX25hbWUs CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRp c3Rybz1nbG9iYWxfY29uZmlnLmZyb21fZGlzdHJvKQorICAgIGRvd25sb2Fk X3JwbXMocnBtcykKKyAgICBwa2cxX2luZm9zID0gbWFrZV9ycG1zX3VzYWJs ZV9mb3JfYWJpcGtnZGlmZihycG1zKQorCisgICAgcnBtcyA9IHNlc3Npb24u Z2V0X2xhdGVzdF9idWlsdF9ycG1zKHBhY2thZ2VfbmFtZSwKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdHJvPWdsb2Jh bF9jb25maWcudG9fZGlzdHJvKQorICAgIGRvd25sb2FkX3JwbXMocnBtcykK KyAgICBwa2cyX2luZm9zID0gbWFrZV9ycG1zX3VzYWJsZV9mb3JfYWJpcGtn ZGlmZihycG1zKQorCisgICAgcmV0dXJuIHJ1bl9hYmlwa2dkaWZmKHBrZzFf aW5mb3MsIHBrZzJfaW5mb3MpCisKKworQGxvZ19jYWxsCitkZWYgZGlmZl90 d29fbnZyYXNfZnJvbV9rb2ppKCk6CisgICAgIiIiRGlmZiB0d28gbnZyYXMg ZnJvbSBrb2ppCisKKyAgICBUaGUgYXJjaCBwcm9iYWJseSBvbWl0cywgdGhh dCBtZWFucyBmZWJhYmlwa2dkaWZmIHdpbGwgZGlmZiBhbGwgYXJjaGVzLiBJ ZgorICAgIHNwZWNpZmljZWQsIHRoZSBzcGVjaWZpYyBhcmNoIHdpbGwgYmUg aGFuZGxlZC4KKworICAgIDMvIFN1cHBvc2UgdGhlIHBhY2thZ2VyIHdhbnRz IHRvIGNvbXBhcmUgdGhlIEFCSSBvZiB0d28gcGFja2FnZXMgZGVzaWduYXRl ZAorICAgIGJ5IHRoZWlyIG5hbWUgYW5kIHZlcnNpb24uIFNoZSB3b3VsZCBp c3N1ZSBhIGNvbW1hbmQgbGlrZSB0aGlzOgorCisgICAgZmVkYWJpcGtnZGlm ZiBmb28tMS4wLmZjMTkgZm9vLTMuMC5mYzI0CisgICAgZmVkYWJpcGtnZGlm ZiBmb28tMS4wLmZjMTkuaTY4NiBmb28tMS4wLmZjMjQuaTY4NgorICAgICIi IgorICAgIGxlZnRfcnBtID0ga29qaS5wYXJzZV9OVlJBKGdsb2JhbF9jb25m aWcuTlZSWzBdKQorICAgIHJpZ2h0X3JwbSA9IGtvamkucGFyc2VfTlZSQShn bG9iYWxfY29uZmlnLk5WUlsxXSkKKworICAgIGlmIGlzX2Rpc3Ryb192YWxp ZChsZWZ0X3JwbVsnYXJjaCddKSBhbmQgXAorICAgICAgICAgICAgaXNfZGlz dHJvX3ZhbGlkKHJpZ2h0X3JwbVsnYXJjaCddKToKKyAgICAgICAgbnZyID0g a29qaS5wYXJzZV9OVlIoZ2xvYmFsX2NvbmZpZy5OVlJbMF0pCisgICAgICAg IHBhcmFtczEgPSAobnZyWyduYW1lJ10sIG52clsndmVyc2lvbiddLCBudnJb J3JlbGVhc2UnXSwgTm9uZSkKKworICAgICAgICBudnIgPSBrb2ppLnBhcnNl X05WUihnbG9iYWxfY29uZmlnLk5WUlsxXSkKKyAgICAgICAgcGFyYW1zMiA9 IChudnJbJ25hbWUnXSwgbnZyWyd2ZXJzaW9uJ10sIG52clsncmVsZWFzZSdd LCBOb25lKQorICAgIGVsc2U6CisgICAgICAgIHBhcmFtczEgPSAobGVmdF9y cG1bJ25hbWUnXSwKKyAgICAgICAgICAgICAgICAgICBsZWZ0X3JwbVsndmVy c2lvbiddLAorICAgICAgICAgICAgICAgICAgIGxlZnRfcnBtWydyZWxlYXNl J10sCisgICAgICAgICAgICAgICAgICAgbGVmdF9ycG1bJ2FyY2gnXSkKKyAg ICAgICAgcGFyYW1zMiA9IChyaWdodF9ycG1bJ25hbWUnXSwKKyAgICAgICAg ICAgICAgICAgICByaWdodF9ycG1bJ3ZlcnNpb24nXSwKKyAgICAgICAgICAg ICAgICAgICByaWdodF9ycG1bJ3JlbGVhc2UnXSwKKyAgICAgICAgICAgICAg ICAgICByaWdodF9ycG1bJ2FyY2gnXSkKKworICAgIGJ1aWxkX2lkID0gc2Vz c2lvbi5nZXRfcnBtX2J1aWxkX2lkKCpwYXJhbXMxKQorICAgIHJwbXMgPSBz ZXNzaW9uLnNlbGVjdF9ycG1zX2Zyb21fYV9idWlsZCgKKyAgICAgICAgYnVp bGRfaWQsIHBhcmFtczFbMF0sIGFyY2hlcz1wYXJhbXMxWzNdLAorICAgICAg ICBzZWxlY3Rfc3VicGFja2FnZXM9Z2xvYmFsX2NvbmZpZy5jaGVja19hbGxf c3VicGFja2FnZXMpCisgICAgZG93bmxvYWRfcnBtcyhycG1zKQorICAgIHBr ZzFfaW5mb3MgPSBtYWtlX3JwbXNfdXNhYmxlX2Zvcl9hYmlwa2dkaWZmKHJw bXMpCisKKyAgICBidWlsZF9pZCA9IHNlc3Npb24uZ2V0X3JwbV9idWlsZF9p ZCgqcGFyYW1zMikKKyAgICBycG1zID0gc2Vzc2lvbi5zZWxlY3RfcnBtc19m cm9tX2FfYnVpbGQoCisgICAgICAgIGJ1aWxkX2lkLCBwYXJhbXMyWzBdLCBh cmNoZXM9cGFyYW1zMlszXSwKKyAgICAgICAgc2VsZWN0X3N1YnBhY2thZ2Vz PWdsb2JhbF9jb25maWcuY2hlY2tfYWxsX3N1YnBhY2thZ2VzKQorICAgIGRv d25sb2FkX3JwbXMocnBtcykKKyAgICBwa2cyX2luZm9zID0gbWFrZV9ycG1z X3VzYWJsZV9mb3JfYWJpcGtnZGlmZihycG1zKQorCisgICAgcmV0dXJuIHJ1 bl9hYmlwa2dkaWZmKHBrZzFfaW5mb3MsIHBrZzJfaW5mb3MpCisKKworZGVm IGJ1aWxkX2NvbW1hbmRsaW5lX2FyZ3NfcGFyc2VyKCk6CisgICAgcGFyc2Vy ID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoCisgICAgICAgIGRlc2NyaXB0 aW9uPSdSdW4gYWJpcGtnZGlmZiBhZ2FpbnN0IFJQTSBwYWNrYWdlcyBmcm9t IGtvamknKQorCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICAg J05WUicsCisgICAgICAgIG5hcmdzPScqJywKKyAgICAgICAgaGVscD0nUlBN IHBhY2thZ2UgTi1WLVIsIE4tVi1SLUEsIE4sIG9yIGEgbG9jYWwgUlBNICcK KyAgICAgICAgICAgICAnZmlsZSBuYW1lIHdpdGggcmVsYXRpdmUgb3IgYWJz b2x1dGUgcGF0aC4nKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAg ICAgICctLWRyeS1ydW4nLAorICAgICAgICByZXF1aXJlZD1GYWxzZSwKKyAg ICAgICAgZGVzdD0nZHJ5X3J1bicsCisgICAgICAgIGFjdGlvbj0nc3RvcmVf dHJ1ZScsCisgICAgICAgIGhlbHA9J0RvblwndCBhY3R1YWxseSBydW4gYWJp cGtnZGlmZi4gVGhlIGNvbW1hbmRzIHRoYXQgc2hvdWxkIGJlICcKKyAgICAg ICAgICAgICAncnVuIHdpbGwgYmUgc2VudCB0byBzdGRvdXQuJykKKyAgICBw YXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgICAnLS1mcm9tJywKKyAgICAg ICAgcmVxdWlyZWQ9RmFsc2UsCisgICAgICAgIG1ldGF2YXI9J0RJU1RSTycs CisgICAgICAgIGRlc3Q9J2Zyb21fZGlzdHJvJywKKyAgICAgICAgaGVscD0n YmFzZWxpbmUgRmVkb3JhIGRpc3RybywgZm9yIGV4YW1wbGUsIGZjMjMnKQor ICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAgICctLXRvJywKKyAg ICAgICAgcmVxdWlyZWQ9RmFsc2UsCisgICAgICAgIG1ldGF2YXI9J0RJU1RS TycsCisgICAgICAgIGRlc3Q9J3RvX2Rpc3RybycsCisgICAgICAgIGhlbHA9 J3doaWNoIEZlZG9yYSBkaXN0cm8gdG8gY29tcGFyZSwgZm9yIGV4YW1wbGUs IGZjMjQnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAgICct YScsCisgICAgICAgICctLWFsbC1zdWJwYWNrYWdlcycsCisgICAgICAgIHJl cXVpcmVkPUZhbHNlLAorICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAor ICAgICAgICBkZXN0PSdjaGVja19hbGxfc3VicGFja2FnZXMnLAorICAgICAg ICBoZWxwPSdDaGVjayBhbGwgc3VicGFja2FnZXMgaW5zdGVhZCBvZiBvbmx5 IHRoZSBwYWNrYWdlIHNwZWNpZmljZWQgaW4gJworICAgICAgICAgICAgICdj b21tYW5kIGxpbmUuJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAg ICAgICAnLS1kZWJ1ZycsCisgICAgICAgIHJlcXVpcmVkPUZhbHNlLAorICAg ICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICBkZXN0PSdkZWJ1 ZycsCisgICAgICAgIGhlbHA9J3Nob3cgZGVidWcgb3V0cHV0JykKKyAgICBw YXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgICAnLS10cmFjZWJhY2snLAor ICAgICAgICByZXF1aXJlZD1GYWxzZSwKKyAgICAgICAgYWN0aW9uPSdzdG9y ZV90cnVlJywKKyAgICAgICAgZGVzdD0nc2hvd190cmFjZWJhY2snLAorICAg ICAgICBoZWxwPSdzaG93IHRyYWNlYmFjayB3aGVuIHRoZXJlIGlzIGFuIGV4 Y2VwdGlvbiB0aHJvd24uJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAor ICAgICAgICAnLS1zZXJ2ZXInLAorICAgICAgICByZXF1aXJlZD1GYWxzZSwK KyAgICAgICAgbWV0YXZhcj0nVVJMJywKKyAgICAgICAgZGVzdD0na29qaV9z ZXJ2ZXInLAorICAgICAgICBkZWZhdWx0PURFRkFVTFRfS09KSV9TRVJWRVIs CisgICAgICAgIGhlbHA9J1VSTCBvZiBrb2ppIFhNTFJQQyBzZXJ2aWNlLiBE ZWZhdWx0IGlzIHswfScuZm9ybWF0KAorICAgICAgICAgICAgREVGQVVMVF9L T0pJX1NFUlZFUikpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAg ICAgJy0tdG9wZGlyJywKKyAgICAgICAgcmVxdWlyZWQ9RmFsc2UsCisgICAg ICAgIG1ldGF2YXI9J1VSTCcsCisgICAgICAgIGRlc3Q9J2tvamlfdG9wZGly JywKKyAgICAgICAgZGVmYXVsdD1ERUZBVUxUX0tPSklfVE9QRElSLAorICAg ICAgICBoZWxwPSdVUkwgZm9yIFJQTSBmaWxlcyBhY2Nlc3MnKQorCisgICAg cmV0dXJuIHBhcnNlcgorCisKK2RlZiBtYWluKCk6CisgICAgcGFyc2VyID0g YnVpbGRfY29tbWFuZGxpbmVfYXJnc19wYXJzZXIoKQorCisgICAgYXJncyA9 IHBhcnNlci5wYXJzZV9hcmdzKCkKKworICAgIGdsb2JhbCBnbG9iYWxfY29u ZmlnCisgICAgZ2xvYmFsX2NvbmZpZyA9IGFyZ3MKKworICAgIGdsb2JhbCBw YXRoaW5mbworICAgIHBhdGhpbmZvID0ga29qaS5QYXRoSW5mbyh0b3BkaXI9 Z2xvYmFsX2NvbmZpZy5rb2ppX3RvcGRpcikKKworICAgIGdsb2JhbCBzZXNz aW9uCisgICAgc2Vzc2lvbiA9IGdldF9zZXNzaW9uKCkKKworICAgIGlmIGds b2JhbF9jb25maWcuZGVidWc6CisgICAgICAgIGxvZ2dlci5zZXRMZXZlbChs b2dnaW5nLkRFQlVHKQorCisgICAgbG9nZ2VyLmRlYnVnKGFyZ3MpCisKKyAg ICBpZiBnbG9iYWxfY29uZmlnLmZyb21fZGlzdHJvIGFuZCBnbG9iYWxfY29u ZmlnLnRvX2Rpc3RybyBpcyBOb25lIGFuZCBcCisgICAgICAgICAgICBnbG9i YWxfY29uZmlnLk5WUjoKKyAgICAgICAgcmV0dXJuY29kZSA9IGRpZmZfbG9j YWxfcnBtX3dpdGhfbGF0ZXN0X3JwbV9mcm9tX2tvamkoKQorCisgICAgZWxp ZiBnbG9iYWxfY29uZmlnLmZyb21fZGlzdHJvIGFuZCBnbG9iYWxfY29uZmln LnRvX2Rpc3RybyBhbmQgXAorICAgICAgICAgICAgZ2xvYmFsX2NvbmZpZy5O VlI6CisgICAgICAgIHJldHVybmNvZGUgPSBkaWZmX2xhdGVzdF9ycG1zX2Jh c2VkX29uX2Rpc3Ryb3MoKQorCisgICAgZWxpZiBnbG9iYWxfY29uZmlnLmZy b21fZGlzdHJvIGlzIE5vbmUgYW5kIFwKKyAgICAgICAgICAgIGdsb2JhbF9j b25maWcudG9fZGlzdHJvIGlzIE5vbmUgYW5kIGxlbihnbG9iYWxfY29uZmln Lk5WUikgPiAxOgorICAgICAgICByZXR1cm5jb2RlID0gZGlmZl90d29fbnZy YXNfZnJvbV9rb2ppKCkKKworICAgIGVsc2U6CisgICAgICAgIHByaW50ID4+ c3lzLnN0ZGVyciwgJ1Vua25vd24gYXJndW1lbnRzLiBQbGVhc2UgcmVmZXIg dG8gLS1oZWxwLicKKyAgICAgICAgcmV0dXJuY29kZSA9IDEKKworICAgIHJl dHVybiByZXR1cm5jb2RlCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9f JzoKKyAgICB0cnk6CisgICAgICAgIG1haW4oKQorICAgIGV4Y2VwdCBLZXli b2FyZEludGVycnVwdDoKKyAgICAgICAgaWYgZ2xvYmFsX2NvbmZpZy5kZWJ1 ZzoKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnVGVybWluYXRlIGJ5IHVz ZXInKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgPj5zeXMu c3RkZXJyLCAnVGVybWluYXRlIGJ5IHVzZXInCisgICAgICAgIGlmIGdsb2Jh bF9jb25maWcuc2hvd190cmFjZWJhY2s6CisgICAgICAgICAgICByYWlzZQor ICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3lzLmV4aXQoMikKKyAgICBl eGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgIGlmIGdsb2JhbF9jb25m aWcuZGVidWc6CisgICAgICAgICAgICBsb2dnZXIuZGVidWcoc3RyKGUpKQor ICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJy LCBzdHIoZSkKKyAgICAgICAgaWYgZ2xvYmFsX2NvbmZpZy5zaG93X3RyYWNl YmFjazoKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGVsc2U6CisgICAg ICAgICAgICBzeXMuZXhpdCgxKQotLSAKMi41LjUKCg== ------=_Part_3371216_270419124.1461940400376--