[merge]problems with committing merges in a dirstate tree with a symlink

Marien Zwart marienz at gentoo.org
Mon Mar 12 03:36:24 GMT 2007


Because I did not read the mailing list reply before sending the
previous bundle that one did not do what was asked there. This one
hopefully does: it moves test_inv tests from
workingtree_implementation to tree_implementation where possible and
adds more symlink-related tests. It also fixes a bug in selftest that
causes tearDown to run twice for skipped tests (and adds tests for
that).
-------------- next part --------------
# Bazaar revision bundle v0.9
#
# message:
#   More tests for symlinks in tree inventories.
# committer: Marien Zwart <marienz at gentoo.org>
# date: Mon 2007-03-12 04:31:12.372999907 +0100

=== added file bzrlib/tests/tree_implementations/test_inv.py // file-id:test_in
... v.py-20070312023226-0cdvk5uwhutis9vg-1
--- /dev/null
+++ bzrlib/tests/tree_implementations/test_inv.py
@@ -0,0 +1,233 @@
+# Copyright (C) 2007 Canonical Ltd
+#
+# 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 2 of the License, 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 Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+"""Tests for interface conformance of inventories of trees."""
+
+
+from cStringIO import StringIO
+import os
+
+from bzrlib.diff import internal_diff
+from bzrlib.mutabletree import MutableTree
+from bzrlib.osutils import (
+    has_symlinks,
+    )
+from bzrlib.tests import TestSkipped
+from bzrlib.tests.tree_implementations import TestCaseWithTree
+from bzrlib.uncommit import uncommit
+
+
+class TestEntryDiffing(TestCaseWithTree):
+
+    def setUp(self):
+        super(TestEntryDiffing, self).setUp()
+        self.wt = self.make_branch_and_tree('.')
+        self.branch = self.wt.branch
+        print >> open('file', 'wb'), 'foo'
+        print >> open('binfile', 'wb'), 'foo'
+        self.wt.add(['file'], ['fileid'])
+        self.wt.add(['binfile'], ['binfileid'])
+        if has_symlinks():
+            os.symlink('target1', 'symlink')
+            self.wt.add(['symlink'], ['linkid'])
+        self.wt.commit('message_1', rev_id = '1')
+        print >> open('file', 'wb'), 'bar'
+        print >> open('binfile', 'wb'), 'x' * 1023 + '\x00'
+        if has_symlinks():
+            os.unlink('symlink')
+            os.symlink('target2', 'symlink')
+        self.tree_1 = self.branch.repository.revision_tree('1')
+        self.inv_1 = self.branch.repository.get_inventory('1')
+        self.file_1 = self.inv_1['fileid']
+        self.file_1b = self.inv_1['binfileid']
+        self.tree_2 = self.workingtree_to_test_tree(self.wt)
+        self.tree_2.lock_read()
+        self.addCleanup(self.tree_2.unlock)
+        self.inv_2 = self.tree_2.inventory
+        self.file_2 = self.inv_2['fileid']
+        self.file_2b = self.inv_2['binfileid']
+        if has_symlinks():
+            self.link_1 = self.inv_1['linkid']
+            self.link_2 = self.inv_2['linkid']
+
+    def test_file_diff_deleted(self):
+        output = StringIO()
+        self.file_1.diff(internal_diff, 
+                          "old_label", self.tree_1,
+                          "/dev/null", None, None,
+                          output)
+        self.assertEqual(output.getvalue(), "--- old_label\n"
+                                            "+++ /dev/null\n"
+                                            "@@ -1,1 +0,0 @@\n"
+                                            "-foo\n"
+                                            "\n")
+
+    def test_file_diff_added(self):
+        output = StringIO()
+        self.file_1.diff(internal_diff, 
+                          "new_label", self.tree_1,
+                          "/dev/null", None, None,
+                          output, reverse=True)
+        self.assertEqual(output.getvalue(), "--- /dev/null\n"
+                                            "+++ new_label\n"
+                                            "@@ -0,0 +1,1 @@\n"
+                                            "+foo\n"
+                                            "\n")
+
+    def test_file_diff_changed(self):
+        output = StringIO()
+        self.file_1.diff(internal_diff, 
+                          "/dev/null", self.tree_1, 
+                          "new_label", self.file_2, self.tree_2,
+                          output)
+        self.assertEqual(output.getvalue(), "--- /dev/null\n"
+                                            "+++ new_label\n"
+                                            "@@ -1,1 +1,1 @@\n"
+                                            "-foo\n"
+                                            "+bar\n"
+                                            "\n")
+        
+    def test_file_diff_binary(self):
+        output = StringIO()
+        self.file_1.diff(internal_diff, 
+                          "/dev/null", self.tree_1, 
+                          "new_label", self.file_2b, self.tree_2,
+                          output)
+        self.assertEqual(output.getvalue(), 
+                         "Binary files /dev/null and new_label differ\n")
+    def test_link_diff_deleted(self):
+        if not has_symlinks():
+            return
+        output = StringIO()
+        self.link_1.diff(internal_diff, 
+                          "old_label", self.tree_1,
+                          "/dev/null", None, None,
+                          output)
+        self.assertEqual(output.getvalue(),
+                         "=== target was 'target1'\n")
+
+    def test_link_diff_added(self):
+        if not has_symlinks():
+            return
+        output = StringIO()
+        self.link_1.diff(internal_diff, 
+                          "new_label", self.tree_1,
+                          "/dev/null", None, None,
+                          output, reverse=True)
+        self.assertEqual(output.getvalue(),
+                         "=== target is 'target1'\n")
+
+    def test_link_diff_changed(self):
+        if not has_symlinks():
+            return
+        output = StringIO()
+        self.link_1.diff(internal_diff, 
+                          "/dev/null", self.tree_1, 
+                          "new_label", self.link_2, self.tree_2,
+                          output)
+        self.assertEqual(output.getvalue(),
+                         "=== target changed 'target1' => 'target2'\n")
+
+
+class TestPreviousHeads(TestCaseWithTree):
+
+    def setUp(self):
+        # we want several inventories, that respectively
+        # give use the following scenarios:
+        # A) fileid not in any inventory (A),
+        # B) fileid present in one inventory (B) and (A,B)
+        # C) fileid present in two inventories, and they
+        #   are not mutual descendents (B, C)
+        # D) fileid present in two inventories and one is
+        #   a descendent of the other. (B, D)
+        super(TestPreviousHeads, self).setUp()
+        self.wt = self.make_branch_and_tree('.')
+        self.branch = self.wt.branch
+        self.build_tree(['file'])
+        self.wt.commit('new branch', allow_pointless=True, rev_id='A')
+        self.inv_A = self.branch.repository.get_inventory('A')
+        self.wt.add(['file'], ['fileid'])
+        self.wt.commit('add file', rev_id='B')
+        self.inv_B = self.branch.repository.get_inventory('B')
+        uncommit(self.branch, tree=self.wt)
+        self.assertEqual(self.branch.revision_history(), ['A'])
+        self.wt.commit('another add of file', rev_id='C')
+        self.inv_C = self.branch.repository.get_inventory('C')
+        self.wt.add_parent_tree_id('B')
+        self.wt.commit('merge in B', rev_id='D')
+        self.inv_D = self.branch.repository.get_inventory('D')
+        self.tree = self.workingtree_to_test_tree(self.wt)
+        self.tree.lock_read()
+        self.addCleanup(self.tree.unlock)
+        self.file_active = self.tree.inventory['fileid']
+        self.weave = self.branch.repository.weave_store.get_weave('fileid',
+            self.branch.repository.get_transaction())
+        
+    def get_previous_heads(self, inventories):
+        return self.file_active.find_previous_heads(
+            inventories, 
+            self.branch.repository.weave_store,
+            self.branch.repository.get_transaction())
+        
+    def test_fileid_in_no_inventory(self):
+        self.assertEqual({}, self.get_previous_heads([self.inv_A]))
+
+    def test_fileid_in_one_inventory(self):
+        self.assertEqual({'B':self.inv_B['fileid']},
+                         self.get_previous_heads([self.inv_B]))
+        self.assertEqual({'B':self.inv_B['fileid']},
+                         self.get_previous_heads([self.inv_A, self.inv_B]))
+        self.assertEqual({'B':self.inv_B['fileid']},
+                         self.get_previous_heads([self.inv_B, self.inv_A]))
+
+    def test_fileid_in_two_inventories_gives_both_entries(self):
+        self.assertEqual({'B':self.inv_B['fileid'],
+                          'C':self.inv_C['fileid']},
+                          self.get_previous_heads([self.inv_B, self.inv_C]))
+        self.assertEqual({'B':self.inv_B['fileid'],
+                          'C':self.inv_C['fileid']},
+                          self.get_previous_heads([self.inv_C, self.inv_B]))
+
+    def test_fileid_in_two_inventories_already_merged_gives_head(self):
+        self.assertEqual({'D':self.inv_D['fileid']},
+                         self.get_previous_heads([self.inv_B, self.inv_D]))
+        self.assertEqual({'D':self.inv_D['fileid']},
+                         self.get_previous_heads([self.inv_D, self.inv_B]))
+
+    # TODO: test two inventories with the same file revision 
+
+
+class TestInventory(TestCaseWithTree):
+
+    def setUp(self):
+        super(TestInventory, self).setUp()
+        self.tree = self.get_tree_with_subdirs_and_all_content_types()
+        self.tree.lock_read()
+        self.addCleanup(self.tree.unlock)
+        # Commenting out the following line still fails.
+        self.inv = self.tree.inventory
+
+    def test_symlink_target(self):
+        if isinstance(self.tree, MutableTree):
+            raise TestSkipped(
+                'symlinks not accurately represented in working trees')
+        entry = self.inv[self.inv.path2id('symlink')]
+        self.assertEqual(entry.symlink_target, 'link-target')
+
+    def test_symlink(self):
+        entry = self.inv[self.inv.path2id('symlink')]
+        self.assertEqual(entry.kind, 'symlink')
+        self.assertEqual(None, entry.text_size)

=== added file bzrlib/tests/workingtree_implementations/test_inv.py // file-id:
... test_inv.py-20070311221604-ighlq8tbn5xq0kuo-1 // last-changed:marienz at gento
... o.org-20070312023543-2ue1egax0wbvl87s
--- /dev/null
+++ bzrlib/tests/workingtree_implementations/test_inv.py
@@ -0,0 +1,126 @@
+# Copyright (C) 2007 Canonical Ltd
+#
+# 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 2 of the License, 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 Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+"""Tests for interface conformance of inventories of working trees."""
+
+
+import os
+import time
+
+from bzrlib import (
+    errors,
+    inventory,
+    )
+from bzrlib.tests.workingtree_implementations import TestCaseWithWorkingTree
+
+
+class TestRevert(TestCaseWithWorkingTree):
+
+    def test_dangling_id(self):
+        wt = self.make_branch_and_tree('b1')
+        wt.lock_tree_write()
+        self.addCleanup(wt.unlock)
+        self.assertEqual(len(wt.inventory), 1)
+        open('b1/a', 'wb').write('a test\n')
+        wt.add('a')
+        self.assertEqual(len(wt.inventory), 2)
+        wt.flush() # workaround revert doing wt._write_inventory for now.
+        os.unlink('b1/a')
+        wt.revert([])
+        self.assertEqual(len(wt.inventory), 1)
+
+
+class TestSnapshot(TestCaseWithWorkingTree):
+
+    def setUp(self):
+        # for full testing we'll need a branch
+        # with a subdir to test parent changes.
+        # and a file, link and dir under that.
+        # but right now I only need one attribute
+        # to change, and then test merge patterns
+        # with fake parent entries.
+        super(TestSnapshot, self).setUp()
+        self.wt = self.make_branch_and_tree('.')
+        self.branch = self.wt.branch
+        self.build_tree(['subdir/', 'subdir/file'], line_endings='binary')
+        self.wt.add(['subdir', 'subdir/file'],
+                                       ['dirid', 'fileid'])
+        self.wt.commit('message_1', rev_id = '1')
+        self.tree_1 = self.branch.repository.revision_tree('1')
+        self.inv_1 = self.branch.repository.get_inventory('1')
+        self.file_1 = self.inv_1['fileid']
+        self.wt.lock_write()
+        self.addCleanup(self.wt.unlock)
+        self.file_active = self.wt.inventory['fileid']
+        self.builder = self.branch.get_commit_builder([], timestamp=time.time(), revision_id='2')
+
+    def test_snapshot_new_revision(self):
+        # This tests that a simple commit with no parents makes a new
+        # revision value in the inventory entry
+        self.file_active.snapshot('2', 'subdir/file', {}, self.wt, self.builder)
+        # expected outcome - file_1 has a revision id of '2', and we can get
+        # its text of 'file contents' out of the weave.
+        self.assertEqual(self.file_1.revision, '1')
+        self.assertEqual(self.file_active.revision, '2')
+        # this should be a separate test probably, but lets check it once..
+        lines = self.branch.repository.weave_store.get_weave(
+            'fileid', 
+            self.branch.get_transaction()).get_lines('2')
+        self.assertEqual(lines, ['contents of subdir/file\n'])
+
+    def test_snapshot_unchanged(self):
+        #This tests that a simple commit does not make a new entry for
+        # an unchanged inventory entry
+        self.file_active.snapshot('2', 'subdir/file', {'1':self.file_1},
+                                  self.wt, self.builder)
+        self.assertEqual(self.file_1.revision, '1')
+        self.assertEqual(self.file_active.revision, '1')
+        vf = self.branch.repository.weave_store.get_weave(
+            'fileid', 
+            self.branch.repository.get_transaction())
+        self.assertRaises(errors.RevisionNotPresent,
+                          vf.get_lines,
+                          '2')
+
+    def test_snapshot_merge_identical_different_revid(self):
+        # This tests that a commit with two identical parents, one of which has
+        # a different revision id, results in a new revision id in the entry.
+        # 1->other, commit a merge of other against 1, results in 2.
+        other_ie = inventory.InventoryFile('fileid', 'newname', self.file_1.parent_id)
+        other_ie = inventory.InventoryFile('fileid', 'file', self.file_1.parent_id)
+        other_ie.revision = '1'
+        other_ie.text_sha1 = self.file_1.text_sha1
+        other_ie.text_size = self.file_1.text_size
+        self.assertEqual(self.file_1, other_ie)
+        other_ie.revision = 'other'
+        self.assertNotEqual(self.file_1, other_ie)
+        versionfile = self.branch.repository.weave_store.get_weave(
+            'fileid', self.branch.repository.get_transaction())
+        versionfile.clone_text('other', '1', ['1'])
+        self.file_active.snapshot('2', 'subdir/file', 
+                                  {'1':self.file_1, 'other':other_ie},
+                                  self.wt, self.builder)
+        self.assertEqual(self.file_active.revision, '2')
+
+    def test_snapshot_changed(self):
+        # This tests that a commit with one different parent results in a new
+        # revision id in the entry.
+        self.wt.rename_one('subdir/file', 'subdir/newname')
+        self.file_active = self.wt.inventory['fileid']
+        self.file_active.snapshot('2', 'subdir/newname', {'1':self.file_1}, 
+                                  self.wt, self.builder)
+        # expected outcome - file_1 has a revision id of '2'
+        self.assertEqual(self.file_active.revision, '2')

=== modified file bzrlib/tests/__init__.py // last-changed:marienz at gentoo.org-2
... 0070312033007-47ci7w0fehb5gqq2
--- bzrlib/tests/__init__.py
+++ bzrlib/tests/__init__.py
@@ -260,14 +260,7 @@
         self.report_skip(test, skip_excinfo)
         # seems best to treat this as success from point-of-view of unittest
         # -- it actually does nothing so it barely matters :)
-        try:
-            test.tearDown()
-        except KeyboardInterrupt:
-            raise
-        except:
-            self.addError(test, test.__exc_info())
-        else:
-            unittest.TestResult.addSuccess(self, test)
+        unittest.TestResult.addSuccess(self, test)
 
     def printErrorList(self, flavour, errors):
         for test, err in errors:

=== modified file bzrlib/tests/test_commit_merge.py // last-changed:marienz at gen
... too.org-20070311221559-mvb05lew4yyogh5y
--- bzrlib/tests/test_commit_merge.py
+++ bzrlib/tests/test_commit_merge.py
@@ -22,6 +22,7 @@
 from bzrlib.branch import Branch
 from bzrlib.errors import PointlessCommit, BzrError
 from bzrlib.tests.test_revision import make_branches
+from bzrlib import osutils
 
 
 class TestCommitMerge(TestCaseWithTransport):
@@ -96,3 +97,20 @@
         by.check()
         bx.repository.check([bx.last_revision()])
         by.repository.check([by.last_revision()])
+
+    def test_merge_with_symlink(self):
+        if not osutils.has_symlinks():
+            raise TestSkipped('Symlinks are not supported on this platform')
+        tree_a = self.make_branch_and_tree('tree_a')
+        os.symlink('target', osutils.pathjoin('tree_a', 'link'))
+        tree_a.add('link')
+        tree_a.commit('added link')
+        tree_b = tree_a.bzrdir.sprout('tree_b').open_workingtree()
+        self.build_tree(['tree_a/file'])
+        tree_a.add('file')
+        tree_a.commit('added file')
+        self.build_tree(['tree_b/another_file'])
+        tree_b.add('another_file')
+        tree_b.commit('add another file')
+        tree_b.merge_from_branch(tree_a.branch)
+        tree_b.commit('merge')

=== modified file bzrlib/tests/test_inv.py // last-changed:marienz at gentoo.org-2
... 0070311230549-rn7jh354jrzq6m1e
--- bzrlib/tests/test_inv.py
+++ bzrlib/tests/test_inv.py
@@ -14,20 +14,12 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
-from cStringIO import StringIO
-import os
-import time
-
 from bzrlib import errors, inventory, osutils
-from bzrlib.branch import Branch
-from bzrlib.diff import internal_diff
 from bzrlib.inventory import (Inventory, ROOT_ID, InventoryFile,
     InventoryDirectory, InventoryEntry, TreeReference)
-from bzrlib.osutils import (has_symlinks, rename, pathjoin, is_inside_any, 
+from bzrlib.osutils import (pathjoin, is_inside_any, 
     is_inside_or_parent_of_any)
-from bzrlib.tests import TestCase, TestCaseWithTransport
-from bzrlib.transform import TreeTransform
-from bzrlib.uncommit import uncommit
+from bzrlib.tests import TestCase
 
 
 class TestInventory(TestCase):
@@ -282,270 +274,6 @@
             osutils.normalized_filename = orig_normalized_filename
 
 
-class TestEntryDiffing(TestCaseWithTransport):
-
-    def setUp(self):
-        super(TestEntryDiffing, self).setUp()
-        self.wt = self.make_branch_and_tree('.')
-        self.branch = self.wt.branch
-        print >> open('file', 'wb'), 'foo'
-        print >> open('binfile', 'wb'), 'foo'
-        self.wt.add(['file'], ['fileid'])
-        self.wt.add(['binfile'], ['binfileid'])
-        if has_symlinks():
-            os.symlink('target1', 'symlink')
-            self.wt.add(['symlink'], ['linkid'])
-        self.wt.commit('message_1', rev_id = '1')
-        print >> open('file', 'wb'), 'bar'
-        print >> open('binfile', 'wb'), 'x' * 1023 + '\x00'
-        if has_symlinks():
-            os.unlink('symlink')
-            os.symlink('target2', 'symlink')
-        self.tree_1 = self.branch.repository.revision_tree('1')
-        self.inv_1 = self.branch.repository.get_inventory('1')
-        self.file_1 = self.inv_1['fileid']
-        self.file_1b = self.inv_1['binfileid']
-        self.tree_2 = self.wt
-        self.tree_2.lock_read()
-        self.addCleanup(self.tree_2.unlock)
-        self.inv_2 = self.tree_2.read_working_inventory()
-        self.file_2 = self.inv_2['fileid']
-        self.file_2b = self.inv_2['binfileid']
-        if has_symlinks():
-            self.link_1 = self.inv_1['linkid']
-            self.link_2 = self.inv_2['linkid']
-
-    def test_file_diff_deleted(self):
-        output = StringIO()
-        self.file_1.diff(internal_diff, 
-                          "old_label", self.tree_1,
-                          "/dev/null", None, None,
-                          output)
-        self.assertEqual(output.getvalue(), "--- old_label\n"
-                                            "+++ /dev/null\n"
-                                            "@@ -1,1 +0,0 @@\n"
-                                            "-foo\n"
-                                            "\n")
-
-    def test_file_diff_added(self):
-        output = StringIO()
-        self.file_1.diff(internal_diff, 
-                          "new_label", self.tree_1,
-                          "/dev/null", None, None,
-                          output, reverse=True)
-        self.assertEqual(output.getvalue(), "--- /dev/null\n"
-                                            "+++ new_label\n"
-                                            "@@ -0,0 +1,1 @@\n"
-                                            "+foo\n"
-                                            "\n")
-
-    def test_file_diff_changed(self):
-        output = StringIO()
-        self.file_1.diff(internal_diff, 
-                          "/dev/null", self.tree_1, 
-                          "new_label", self.file_2, self.tree_2,
-                          output)
-        self.assertEqual(output.getvalue(), "--- /dev/null\n"
-                                            "+++ new_label\n"
-                                            "@@ -1,1 +1,1 @@\n"
-                                            "-foo\n"
-                                            "+bar\n"
-                                            "\n")
-        
-    def test_file_diff_binary(self):
-        output = StringIO()
-        self.file_1.diff(internal_diff, 
-                          "/dev/null", self.tree_1, 
-                          "new_label", self.file_2b, self.tree_2,
-                          output)
-        self.assertEqual(output.getvalue(), 
-                         "Binary files /dev/null and new_label differ\n")
-    def test_link_diff_deleted(self):
-        if not has_symlinks():
-            return
-        output = StringIO()
-        self.link_1.diff(internal_diff, 
-                          "old_label", self.tree_1,
-                          "/dev/null", None, None,
-                          output)
-        self.assertEqual(output.getvalue(),
-                         "=== target was 'target1'\n")
-
-    def test_link_diff_added(self):
-        if not has_symlinks():
-            return
-        output = StringIO()
-        self.link_1.diff(internal_diff, 
-                          "new_label", self.tree_1,
-                          "/dev/null", None, None,
-                          output, reverse=True)
-        self.assertEqual(output.getvalue(),
-                         "=== target is 'target1'\n")
-
-    def test_link_diff_changed(self):
-        if not has_symlinks():
-            return
-        output = StringIO()
-        self.link_1.diff(internal_diff, 
-                          "/dev/null", self.tree_1, 
-                          "new_label", self.link_2, self.tree_2,
-                          output)
-        self.assertEqual(output.getvalue(),
-                         "=== target changed 'target1' => 'target2'\n")
-
-
-class TestSnapshot(TestCaseWithTransport):
-
-    def setUp(self):
-        # for full testing we'll need a branch
-        # with a subdir to test parent changes.
-        # and a file, link and dir under that.
-        # but right now I only need one attribute
-        # to change, and then test merge patterns
-        # with fake parent entries.
-        super(TestSnapshot, self).setUp()
-        self.wt = self.make_branch_and_tree('.')
-        self.branch = self.wt.branch
-        self.build_tree(['subdir/', 'subdir/file'], line_endings='binary')
-        self.wt.add(['subdir', 'subdir/file'],
-                                       ['dirid', 'fileid'])
-        if has_symlinks():
-            pass
-        self.wt.commit('message_1', rev_id = '1')
-        self.tree_1 = self.branch.repository.revision_tree('1')
-        self.inv_1 = self.branch.repository.get_inventory('1')
-        self.file_1 = self.inv_1['fileid']
-        self.wt.lock_write()
-        self.addCleanup(self.wt.unlock)
-        self.file_active = self.wt.inventory['fileid']
-        self.builder = self.branch.get_commit_builder([], timestamp=time.time(), revision_id='2')
-
-    def test_snapshot_new_revision(self):
-        # This tests that a simple commit with no parents makes a new
-        # revision value in the inventory entry
-        self.file_active.snapshot('2', 'subdir/file', {}, self.wt, self.builder)
-        # expected outcome - file_1 has a revision id of '2', and we can get
-        # its text of 'file contents' out of the weave.
-        self.assertEqual(self.file_1.revision, '1')
-        self.assertEqual(self.file_active.revision, '2')
-        # this should be a separate test probably, but lets check it once..
-        lines = self.branch.repository.weave_store.get_weave(
-            'fileid', 
-            self.branch.get_transaction()).get_lines('2')
-        self.assertEqual(lines, ['contents of subdir/file\n'])
-
-    def test_snapshot_unchanged(self):
-        #This tests that a simple commit does not make a new entry for
-        # an unchanged inventory entry
-        self.file_active.snapshot('2', 'subdir/file', {'1':self.file_1},
-                                  self.wt, self.builder)
-        self.assertEqual(self.file_1.revision, '1')
-        self.assertEqual(self.file_active.revision, '1')
-        vf = self.branch.repository.weave_store.get_weave(
-            'fileid', 
-            self.branch.repository.get_transaction())
-        self.assertRaises(errors.RevisionNotPresent,
-                          vf.get_lines,
-                          '2')
-
-    def test_snapshot_merge_identical_different_revid(self):
-        # This tests that a commit with two identical parents, one of which has
-        # a different revision id, results in a new revision id in the entry.
-        # 1->other, commit a merge of other against 1, results in 2.
-        other_ie = inventory.InventoryFile('fileid', 'newname', self.file_1.parent_id)
-        other_ie = inventory.InventoryFile('fileid', 'file', self.file_1.parent_id)
-        other_ie.revision = '1'
-        other_ie.text_sha1 = self.file_1.text_sha1
-        other_ie.text_size = self.file_1.text_size
-        self.assertEqual(self.file_1, other_ie)
-        other_ie.revision = 'other'
-        self.assertNotEqual(self.file_1, other_ie)
-        versionfile = self.branch.repository.weave_store.get_weave(
-            'fileid', self.branch.repository.get_transaction())
-        versionfile.clone_text('other', '1', ['1'])
-        self.file_active.snapshot('2', 'subdir/file', 
-                                  {'1':self.file_1, 'other':other_ie},
-                                  self.wt, self.builder)
-        self.assertEqual(self.file_active.revision, '2')
-
-    def test_snapshot_changed(self):
-        # This tests that a commit with one different parent results in a new
-        # revision id in the entry.
-        self.wt.rename_one('subdir/file', 'subdir/newname')
-        self.file_active = self.wt.inventory['fileid']
-        self.file_active.snapshot('2', 'subdir/newname', {'1':self.file_1}, 
-                                  self.wt, self.builder)
-        # expected outcome - file_1 has a revision id of '2'
-        self.assertEqual(self.file_active.revision, '2')
-
-
-class TestPreviousHeads(TestCaseWithTransport):
-
-    def setUp(self):
-        # we want several inventories, that respectively
-        # give use the following scenarios:
-        # A) fileid not in any inventory (A),
-        # B) fileid present in one inventory (B) and (A,B)
-        # C) fileid present in two inventories, and they
-        #   are not mutual descendents (B, C)
-        # D) fileid present in two inventories and one is
-        #   a descendent of the other. (B, D)
-        super(TestPreviousHeads, self).setUp()
-        self.wt = self.make_branch_and_tree('.')
-        self.branch = self.wt.branch
-        self.build_tree(['file'])
-        self.wt.commit('new branch', allow_pointless=True, rev_id='A')
-        self.inv_A = self.branch.repository.get_inventory('A')
-        self.wt.add(['file'], ['fileid'])
-        self.wt.commit('add file', rev_id='B')
-        self.inv_B = self.branch.repository.get_inventory('B')
-        uncommit(self.branch, tree=self.wt)
-        self.assertEqual(self.branch.revision_history(), ['A'])
-        self.wt.commit('another add of file', rev_id='C')
-        self.inv_C = self.branch.repository.get_inventory('C')
-        self.wt.add_parent_tree_id('B')
-        self.wt.commit('merge in B', rev_id='D')
-        self.inv_D = self.branch.repository.get_inventory('D')
-        self.wt.lock_read()
-        self.addCleanup(self.wt.unlock)
-        self.file_active = self.wt.inventory['fileid']
-        self.weave = self.branch.repository.weave_store.get_weave('fileid',
-            self.branch.repository.get_transaction())
-        
-    def get_previous_heads(self, inventories):
-        return self.file_active.find_previous_heads(
-            inventories, 
-            self.branch.repository.weave_store,
-            self.branch.repository.get_transaction())
-        
-    def test_fileid_in_no_inventory(self):
-        self.assertEqual({}, self.get_previous_heads([self.inv_A]))
-
-    def test_fileid_in_one_inventory(self):
-        self.assertEqual({'B':self.inv_B['fileid']},
-                         self.get_previous_heads([self.inv_B]))
-        self.assertEqual({'B':self.inv_B['fileid']},
-                         self.get_previous_heads([self.inv_A, self.inv_B]))
-        self.assertEqual({'B':self.inv_B['fileid']},
-                         self.get_previous_heads([self.inv_B, self.inv_A]))
-
-    def test_fileid_in_two_inventories_gives_both_entries(self):
-        self.assertEqual({'B':self.inv_B['fileid'],
-                          'C':self.inv_C['fileid']},
-                          self.get_previous_heads([self.inv_B, self.inv_C]))
-        self.assertEqual({'B':self.inv_B['fileid'],
-                          'C':self.inv_C['fileid']},
-                          self.get_previous_heads([self.inv_C, self.inv_B]))
-
-    def test_fileid_in_two_inventories_already_merged_gives_head(self):
-        self.assertEqual({'D':self.inv_D['fileid']},
-                         self.get_previous_heads([self.inv_B, self.inv_D]))
-        self.assertEqual({'D':self.inv_D['fileid']},
-                         self.get_previous_heads([self.inv_D, self.inv_B]))
-
-    # TODO: test two inventories with the same file revision 
-
-
 class TestDescribeChanges(TestCase):
 
     def test_describe_change(self):
@@ -604,22 +332,6 @@
         self.assertEqual(expected_change, change)
 
 
-class TestRevert(TestCaseWithTransport):
-
-    def test_dangling_id(self):
-        wt = self.make_branch_and_tree('b1')
-        wt.lock_tree_write()
-        self.addCleanup(wt.unlock)
-        self.assertEqual(len(wt.inventory), 1)
-        open('b1/a', 'wb').write('a test\n')
-        wt.add('a')
-        self.assertEqual(len(wt.inventory), 2)
-        wt.flush() # workaround revert doing wt._write_inventory for now.
-        os.unlink('b1/a')
-        wt.revert([])
-        self.assertEqual(len(wt.inventory), 1)
-
-
 class TestIsRoot(TestCase):
     """Ensure our root-checking code is accurate."""
 

=== modified file bzrlib/tests/test_selftest.py // last-changed:marienz at gentoo.
... org-20070312033007-47ci7w0fehb5gqq2
--- bzrlib/tests/test_selftest.py
+++ bzrlib/tests/test_selftest.py
@@ -718,10 +718,41 @@
         # skipping_test must be hidden in here so it's not run as a real test
         def skipping_test():
             raise TestSkipped('test intentionally skipped')
+
+        class SkippedSetupTest(unittest.TestCase):
+
+            def setUp(self):
+                raise TestSkipped('skipped setup')
+
+            def test_skip(self):
+                self.fail('test reached')
+
+            def tearDown(self):
+                self.fail('teardown reached')
+
+        class SkippedTest(unittest.TestCase):
+
+            def setUp(self):
+                self.counter = 1
+
+            def test_skip(self):
+                raise TestSkipped('skipped test')
+
+            def tearDown(self):
+                self.counter -= 1
+
         runner = TextTestRunner(stream=self._log_file, keep_output=True)
         test = unittest.FunctionTestCase(skipping_test)
         result = self.run_test_runner(runner, test)
         self.assertTrue(result.wasSuccessful())
+        test = SkippedSetupTest('test_skip')
+        result = self.run_test_runner(runner, test)
+        self.assertTrue(result.wasSuccessful())
+        test = SkippedTest('test_skip')
+        result = self.run_test_runner(runner, test)
+        self.assertTrue(result.wasSuccessful())
+        # Check if tearDown was called the right number of times.
+        self.assertEqual(0, test.counter)
 
     def test_bench_history(self):
         # tests that the running the benchmark produces a history file

=== modified file bzrlib/tests/tree_implementations/__init__.py // last-changed
... :marienz at gentoo.org-20070312023523-h4bhx3oyqmbd27tf
--- bzrlib/tests/tree_implementations/__init__.py
+++ bzrlib/tests/tree_implementations/__init__.py
@@ -309,6 +309,7 @@
     test_tree_implementations = [
         'bzrlib.tests.tree_implementations.test_get_file_mtime',
         'bzrlib.tests.tree_implementations.test_get_symlink_target',
+        'bzrlib.tests.tree_implementations.test_inv',
         'bzrlib.tests.tree_implementations.test_list_files',
         'bzrlib.tests.tree_implementations.test_revision_tree',
         'bzrlib.tests.tree_implementations.test_test_trees',

=== modified file bzrlib/tests/tree_implementations/test_tree.py
--- bzrlib/tests/tree_implementations/test_tree.py
+++ bzrlib/tests/tree_implementations/test_tree.py
@@ -18,6 +18,7 @@
     errors,
     tests,
     )
+from bzrlib.tests import TestSkipped
 from bzrlib.tests.tree_implementations import TestCaseWithTree
 
 class TestAnnotate(TestCaseWithTree):

=== modified file bzrlib/tests/workingtree_implementations/__init__.py // last-
... changed:marienz at gentoo.org-20070311230549-rn7jh354jrzq6m1e
--- bzrlib/tests/workingtree_implementations/__init__.py
+++ bzrlib/tests/workingtree_implementations/__init__.py
@@ -59,6 +59,7 @@
         'bzrlib.tests.workingtree_implementations.test_executable',
         'bzrlib.tests.workingtree_implementations.test_flush',
         'bzrlib.tests.workingtree_implementations.test_get_parent_ids',
+        'bzrlib.tests.workingtree_implementations.test_inv',
         'bzrlib.tests.workingtree_implementations.test_is_control_filename',
         'bzrlib.tests.workingtree_implementations.test_is_ignored',
         'bzrlib.tests.workingtree_implementations.test_locking',

=== modified file bzrlib/workingtree_4.py // last-changed:marienz at gentoo.org-20
... 070312010216-j6u0y6v75nk071me
--- bzrlib/workingtree_4.py
+++ bzrlib/workingtree_4.py
@@ -364,8 +364,8 @@
                 elif kind == 'tree-reference':
                     assert self._repo_supports_tree_reference
                     inv_entry.reference_revision = link_or_sha1 or None
-                else:
-                    assert 'unknown kind'
+                elif kind != 'symlink':
+                    assert False, 'unknown kind'
                 # These checks cost us around 40ms on a 55k entry tree
                 assert file_id not in inv_byid, ('file_id %s already in'
                     ' inventory as %s' % (file_id, inv_byid[file_id]))
@@ -1400,7 +1400,7 @@
                     parent_ies[(dirname + '/' + name).strip('/')] = inv_entry
                 elif kind == 'symlink':
                     inv_entry.executable = False
-                    inv_entry.text_size = size
+                    inv_entry.text_size = None
                     inv_entry.symlink_target = utf8_decode(fingerprint)[0]
                 elif kind == 'tree-reference':
                     inv_entry.reference_revision = fingerprint or None

=== modified directory  // last-changed:marienz at gentoo.org-20070312033112-q8h6b
... 0wwzc7ew4d8
# revision id: marienz at gentoo.org-20070312033112-q8h6b0wwzc7ew4d8
# sha1: b1e7cdce0171dd30ffaf32d4c7fcffe5dcdcd87e
# inventory sha1: 08a29d96cf0e2c7b931d3ed1f99d3b0cb999b7c0
# parent ids:
#   marienz at gentoo.org-20070312033007-47ci7w0fehb5gqq2
# base id: pqm at pqm.ubuntu.com-20070311211206-0fd0176ac1e77ef7
# properties:
#   branch-nick: bzr-dirstate-symlinks

# message:
#   Fix a bug in selftest causing tearDown to run twice for skipped tests.
# committer: Marien Zwart <marienz at gentoo.org>
# date: Mon 2007-03-12 04:30:07.203999996 +0100

=== modified file bzrlib/tests/__init__.py // encoding:base64
LS0tIGJ6cmxpYi90ZXN0cy9fX2luaXRfXy5weQorKysgYnpybGliL3Rlc3RzL19faW5pdF9fLnB5
CkBAIC0yNjAsMTQgKzI2MCw3IEBACiAgICAgICAgIHNlbGYucmVwb3J0X3NraXAodGVzdCwgc2tp
cF9leGNpbmZvKQogICAgICAgICAjIHNlZW1zIGJlc3QgdG8gdHJlYXQgdGhpcyBhcyBzdWNjZXNz
IGZyb20gcG9pbnQtb2YtdmlldyBvZiB1bml0dGVzdAogICAgICAgICAjIC0tIGl0IGFjdHVhbGx5
IGRvZXMgbm90aGluZyBzbyBpdCBiYXJlbHkgbWF0dGVycyA6KQotICAgICAgICB0cnk6Ci0gICAg
ICAgICAgICB0ZXN0LnRlYXJEb3duKCkKLSAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0
OgotICAgICAgICAgICAgcmFpc2UKLSAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgc2VsZi5h
ZGRFcnJvcih0ZXN0LCB0ZXN0Ll9fZXhjX2luZm8oKSkKLSAgICAgICAgZWxzZToKLSAgICAgICAg
ICAgIHVuaXR0ZXN0LlRlc3RSZXN1bHQuYWRkU3VjY2VzcyhzZWxmLCB0ZXN0KQorICAgICAgICB1
bml0dGVzdC5UZXN0UmVzdWx0LmFkZFN1Y2Nlc3Moc2VsZiwgdGVzdCkKIAogICAgIGRlZiBwcmlu
dEVycm9yTGlzdChzZWxmLCBmbGF2b3VyLCBlcnJvcnMpOgogICAgICAgICBmb3IgdGVzdCwgZXJy
IGluIGVycm9yczoKCg==

=== modified file bzrlib/tests/test_selftest.py // encoding:base64
LS0tIGJ6cmxpYi90ZXN0cy90ZXN0X3NlbGZ0ZXN0LnB5CisrKyBienJsaWIvdGVzdHMvdGVzdF9z
ZWxmdGVzdC5weQpAQCAtNzE4LDEwICs3MTgsNDEgQEAKICAgICAgICAgIyBza2lwcGluZ190ZXN0
IG11c3QgYmUgaGlkZGVuIGluIGhlcmUgc28gaXQncyBub3QgcnVuIGFzIGEgcmVhbCB0ZXN0CiAg
ICAgICAgIGRlZiBza2lwcGluZ190ZXN0KCk6CiAgICAgICAgICAgICByYWlzZSBUZXN0U2tpcHBl
ZCgndGVzdCBpbnRlbnRpb25hbGx5IHNraXBwZWQnKQorCisgICAgICAgIGNsYXNzIFNraXBwZWRT
ZXR1cFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgICAgICAgICBkZWYgc2V0VXAoc2Vs
Zik6CisgICAgICAgICAgICAgICAgcmFpc2UgVGVzdFNraXBwZWQoJ3NraXBwZWQgc2V0dXAnKQor
CisgICAgICAgICAgICBkZWYgdGVzdF9za2lwKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYu
ZmFpbCgndGVzdCByZWFjaGVkJykKKworICAgICAgICAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgor
ICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgndGVhcmRvd24gcmVhY2hlZCcpCisKKyAgICAgICAg
Y2xhc3MgU2tpcHBlZFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgICAgICAgICBkZWYg
c2V0VXAoc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5jb3VudGVyID0gMQorCisgICAgICAg
ICAgICBkZWYgdGVzdF9za2lwKHNlbGYpOgorICAgICAgICAgICAgICAgIHJhaXNlIFRlc3RTa2lw
cGVkKCdza2lwcGVkIHRlc3QnKQorCisgICAgICAgICAgICBkZWYgdGVhckRvd24oc2VsZik6Cisg
ICAgICAgICAgICAgICAgc2VsZi5jb3VudGVyIC09IDEKKwogICAgICAgICBydW5uZXIgPSBUZXh0
VGVzdFJ1bm5lcihzdHJlYW09c2VsZi5fbG9nX2ZpbGUsIGtlZXBfb3V0cHV0PVRydWUpCiAgICAg
ICAgIHRlc3QgPSB1bml0dGVzdC5GdW5jdGlvblRlc3RDYXNlKHNraXBwaW5nX3Rlc3QpCiAgICAg
ICAgIHJlc3VsdCA9IHNlbGYucnVuX3Rlc3RfcnVubmVyKHJ1bm5lciwgdGVzdCkKICAgICAgICAg
c2VsZi5hc3NlcnRUcnVlKHJlc3VsdC53YXNTdWNjZXNzZnVsKCkpCisgICAgICAgIHRlc3QgPSBT
a2lwcGVkU2V0dXBUZXN0KCd0ZXN0X3NraXAnKQorICAgICAgICByZXN1bHQgPSBzZWxmLnJ1bl90
ZXN0X3J1bm5lcihydW5uZXIsIHRlc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHQu
d2FzU3VjY2Vzc2Z1bCgpKQorICAgICAgICB0ZXN0ID0gU2tpcHBlZFRlc3QoJ3Rlc3Rfc2tpcCcp
CisgICAgICAgIHJlc3VsdCA9IHNlbGYucnVuX3Rlc3RfcnVubmVyKHJ1bm5lciwgdGVzdCkKKyAg
ICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3VsdC53YXNTdWNjZXNzZnVsKCkpCisgICAgICAgICMg
Q2hlY2sgaWYgdGVhckRvd24gd2FzIGNhbGxlZCB0aGUgcmlnaHQgbnVtYmVyIG9mIHRpbWVzLgor
ICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHRlc3QuY291bnRlcikKIAogICAgIGRlZiB0ZXN0
X2JlbmNoX2hpc3Rvcnkoc2VsZik6CiAgICAgICAgICMgdGVzdHMgdGhhdCB0aGUgcnVubmluZyB0
aGUgYmVuY2htYXJrIHByb2R1Y2VzIGEgaGlzdG9yeSBmaWxlCgo=

=== modified directory  // last-changed:marienz at gentoo.org-20070312033007-47ci7
... w0fehb5gqq2
# revision id: marienz at gentoo.org-20070312033007-47ci7w0fehb5gqq2
# sha1: fc3a78b9db4f040cbb239a52dc73efef838c1c34
# inventory sha1: 5582d03e3261f03a186db9177713d782bb211d71
# parent ids:
#   marienz at gentoo.org-20070312023543-2ue1egax0wbvl87s
# properties:
#   branch-nick: bzr-dirstate-symlinks

# message:
#   Remove dead code.
# committer: Marien Zwart <marienz at gentoo.org>
# date: Mon 2007-03-12 03:35:43.479000092 +0100

=== modified file bzrlib/tests/workingtree_implementations/test_inv.py // encod
... ing:base64
LS0tIGJ6cmxpYi90ZXN0cy93b3JraW5ndHJlZV9pbXBsZW1lbnRhdGlvbnMvdGVzdF9pbnYucHkK
KysrIGJ6cmxpYi90ZXN0cy93b3JraW5ndHJlZV9pbXBsZW1lbnRhdGlvbnMvdGVzdF9pbnYucHkK
QEAgLTI0LDkgKzI0LDYgQEAKICAgICBlcnJvcnMsCiAgICAgaW52ZW50b3J5LAogICAgICkKLWZy
b20gYnpybGliLm9zdXRpbHMgaW1wb3J0ICgKLSAgICBoYXNfc3ltbGlua3MsCi0gICAgKQogZnJv
bSBienJsaWIudGVzdHMud29ya2luZ3RyZWVfaW1wbGVtZW50YXRpb25zIGltcG9ydCBUZXN0Q2Fz
ZVdpdGhXb3JraW5nVHJlZQogCiAKQEAgLTYxLDggKzU4LDYgQEAKICAgICAgICAgc2VsZi5idWls
ZF90cmVlKFsnc3ViZGlyLycsICdzdWJkaXIvZmlsZSddLCBsaW5lX2VuZGluZ3M9J2JpbmFyeScp
CiAgICAgICAgIHNlbGYud3QuYWRkKFsnc3ViZGlyJywgJ3N1YmRpci9maWxlJ10sCiAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ2RpcmlkJywgJ2ZpbGVpZCddKQotICAg
ICAgICBpZiBoYXNfc3ltbGlua3MoKToKLSAgICAgICAgICAgIHBhc3MKICAgICAgICAgc2VsZi53
dC5jb21taXQoJ21lc3NhZ2VfMScsIHJldl9pZCA9ICcxJykKICAgICAgICAgc2VsZi50cmVlXzEg
PSBzZWxmLmJyYW5jaC5yZXBvc2l0b3J5LnJldmlzaW9uX3RyZWUoJzEnKQogICAgICAgICBzZWxm
Lmludl8xID0gc2VsZi5icmFuY2gucmVwb3NpdG9yeS5nZXRfaW52ZW50b3J5KCcxJykKCg==

=== modified directory  // last-changed:marienz at gentoo.org-20070312023543-2ue1e
... gax0wbvl87s
# revision id: marienz at gentoo.org-20070312023543-2ue1egax0wbvl87s
# sha1: 0914e68f884198d80787efba1ac699c88670242e
# inventory sha1: e92f5cfa0f581ed79ac5b3f05045bf8b84cf6b95
# parent ids:
#   marienz at gentoo.org-20070312023523-h4bhx3oyqmbd27tf
# properties:
#   branch-nick: bzr-dirstate-symlinks

# message:
#   Move some tests that do not need a working tree from workingtree_implementations to tree_implementations.
# committer: Marien Zwart <marienz at gentoo.org>
# date: Mon 2007-03-12 03:35:23.433000088 +0100

=== added file bzrlib/tests/tree_implementations/test_inv.py // file-id:test_in
... v.py-20070312023226-0cdvk5uwhutis9vg-1 // encoding:base64
LS0tIC9kZXYvbnVsbAorKysgYnpybGliL3Rlc3RzL3RyZWVfaW1wbGVtZW50YXRpb25zL3Rlc3Rf
aW52LnB5CkBAIC0wLDAgKzEsMjA4IEBACisjIENvcHlyaWdodCAoQykgMjAwNyBDYW5vbmljYWwg
THRkCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJp
YnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdl
bmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJl
IEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5
b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0
cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9V
VCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBN
RVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUg
dGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisj
IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1Ymxp
YyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRo
ZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3Vp
dGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworIiIiVGVzdHMgZm9yIGludGVy
ZmFjZSBjb25mb3JtYW5jZSBvZiBpbnZlbnRvcmllcyBvZiB0cmVlcy4iIiIKKworCitmcm9tIGNT
dHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2ltcG9ydCBvcworCitmcm9tIGJ6cmxpYi5kaWZmIGlt
cG9ydCBpbnRlcm5hbF9kaWZmCitmcm9tIGJ6cmxpYi5vc3V0aWxzIGltcG9ydCAoCisgICAgaGFz
X3N5bWxpbmtzLAorICAgICkKK2Zyb20gYnpybGliLnRlc3RzLnRyZWVfaW1wbGVtZW50YXRpb25z
IGltcG9ydCBUZXN0Q2FzZVdpdGhUcmVlCitmcm9tIGJ6cmxpYi51bmNvbW1pdCBpbXBvcnQgdW5j
b21taXQKKworCitjbGFzcyBUZXN0RW50cnlEaWZmaW5nKFRlc3RDYXNlV2l0aFRyZWUpOgorCisg
ICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBlcihUZXN0RW50cnlEaWZmaW5nLCBzZWxm
KS5zZXRVcCgpCisgICAgICAgIHNlbGYud3QgPSBzZWxmLm1ha2VfYnJhbmNoX2FuZF90cmVlKCcu
JykKKyAgICAgICAgc2VsZi5icmFuY2ggPSBzZWxmLnd0LmJyYW5jaAorICAgICAgICBwcmludCA+
PiBvcGVuKCdmaWxlJywgJ3diJyksICdmb28nCisgICAgICAgIHByaW50ID4+IG9wZW4oJ2JpbmZp
bGUnLCAnd2InKSwgJ2ZvbycKKyAgICAgICAgc2VsZi53dC5hZGQoWydmaWxlJ10sIFsnZmlsZWlk
J10pCisgICAgICAgIHNlbGYud3QuYWRkKFsnYmluZmlsZSddLCBbJ2JpbmZpbGVpZCddKQorICAg
ICAgICBpZiBoYXNfc3ltbGlua3MoKToKKyAgICAgICAgICAgIG9zLnN5bWxpbmsoJ3RhcmdldDEn
LCAnc3ltbGluaycpCisgICAgICAgICAgICBzZWxmLnd0LmFkZChbJ3N5bWxpbmsnXSwgWydsaW5r
aWQnXSkKKyAgICAgICAgc2VsZi53dC5jb21taXQoJ21lc3NhZ2VfMScsIHJldl9pZCA9ICcxJykK
KyAgICAgICAgcHJpbnQgPj4gb3BlbignZmlsZScsICd3YicpLCAnYmFyJworICAgICAgICBwcmlu
dCA+PiBvcGVuKCdiaW5maWxlJywgJ3diJyksICd4JyAqIDEwMjMgKyAnXHgwMCcKKyAgICAgICAg
aWYgaGFzX3N5bWxpbmtzKCk6CisgICAgICAgICAgICBvcy51bmxpbmsoJ3N5bWxpbmsnKQorICAg
ICAgICAgICAgb3Muc3ltbGluaygndGFyZ2V0MicsICdzeW1saW5rJykKKyAgICAgICAgc2VsZi50
cmVlXzEgPSBzZWxmLmJyYW5jaC5yZXBvc2l0b3J5LnJldmlzaW9uX3RyZWUoJzEnKQorICAgICAg
ICBzZWxmLmludl8xID0gc2VsZi5icmFuY2gucmVwb3NpdG9yeS5nZXRfaW52ZW50b3J5KCcxJykK
KyAgICAgICAgc2VsZi5maWxlXzEgPSBzZWxmLmludl8xWydmaWxlaWQnXQorICAgICAgICBzZWxm
LmZpbGVfMWIgPSBzZWxmLmludl8xWydiaW5maWxlaWQnXQorICAgICAgICBzZWxmLnRyZWVfMiA9
IHNlbGYud29ya2luZ3RyZWVfdG9fdGVzdF90cmVlKHNlbGYud3QpCisgICAgICAgIHNlbGYudHJl
ZV8yLmxvY2tfcmVhZCgpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzZWxmLnRyZWVfMi51bmxv
Y2spCisgICAgICAgIHNlbGYuaW52XzIgPSBzZWxmLnRyZWVfMi5pbnZlbnRvcnkKKyAgICAgICAg
c2VsZi5maWxlXzIgPSBzZWxmLmludl8yWydmaWxlaWQnXQorICAgICAgICBzZWxmLmZpbGVfMmIg
PSBzZWxmLmludl8yWydiaW5maWxlaWQnXQorICAgICAgICBpZiBoYXNfc3ltbGlua3MoKToKKyAg
ICAgICAgICAgIHNlbGYubGlua18xID0gc2VsZi5pbnZfMVsnbGlua2lkJ10KKyAgICAgICAgICAg
IHNlbGYubGlua18yID0gc2VsZi5pbnZfMlsnbGlua2lkJ10KKworICAgIGRlZiB0ZXN0X2ZpbGVf
ZGlmZl9kZWxldGVkKHNlbGYpOgorICAgICAgICBvdXRwdXQgPSBTdHJpbmdJTygpCisgICAgICAg
IHNlbGYuZmlsZV8xLmRpZmYoaW50ZXJuYWxfZGlmZiwgCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICJvbGRfbGFiZWwiLCBzZWxmLnRyZWVfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
Ii9kZXYvbnVsbCIsIE5vbmUsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1
dCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXRwdXQuZ2V0dmFsdWUoKSwgIi0tLSBvbGRf
bGFiZWxcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIisr
KyAvZGV2L251bGxcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIkBAIC0xLDEgKzAsMCBAQFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAiLWZvb1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAiXG4iKQorCisgICAgZGVmIHRlc3RfZmlsZV9kaWZmX2FkZGVkKHNlbGYpOgorICAg
ICAgICBvdXRwdXQgPSBTdHJpbmdJTygpCisgICAgICAgIHNlbGYuZmlsZV8xLmRpZmYoaW50ZXJu
YWxfZGlmZiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXdfbGFiZWwiLCBzZWxmLnRy
ZWVfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIi9kZXYvbnVsbCIsIE5vbmUsIE5vbmUs
CisgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwgcmV2ZXJzZT1UcnVlKQorICAgICAg
ICBzZWxmLmFzc2VydEVxdWFsKG91dHB1dC5nZXR2YWx1ZSgpLCAiLS0tIC9kZXYvbnVsbFxuIgor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKysrIG5ld19sYWJl
bFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQEAgLTAs
MCArMSwxIEBAXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICIrZm9vXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJc
biIpCisKKyAgICBkZWYgdGVzdF9maWxlX2RpZmZfY2hhbmdlZChzZWxmKToKKyAgICAgICAgb3V0
cHV0ID0gU3RyaW5nSU8oKQorICAgICAgICBzZWxmLmZpbGVfMS5kaWZmKGludGVybmFsX2RpZmYs
IAorICAgICAgICAgICAgICAgICAgICAgICAgICAiL2Rldi9udWxsIiwgc2VsZi50cmVlXzEsIAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAibmV3X2xhYmVsIiwgc2VsZi5maWxlXzIsIHNlbGYu
dHJlZV8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQpCisgICAgICAgIHNlbGYu
YXNzZXJ0RXF1YWwob3V0cHV0LmdldHZhbHVlKCksICItLS0gL2Rldi9udWxsXG4iCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIrKysgbmV3X2xhYmVsXG4iCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJAQCAtMSwxICsxLDEg
QEBcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi1mb29c
biIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIitiYXJcbiIK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIikKKyAgICAg
ICAgCisgICAgZGVmIHRlc3RfZmlsZV9kaWZmX2JpbmFyeShzZWxmKToKKyAgICAgICAgb3V0cHV0
ID0gU3RyaW5nSU8oKQorICAgICAgICBzZWxmLmZpbGVfMS5kaWZmKGludGVybmFsX2RpZmYsIAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAiL2Rldi9udWxsIiwgc2VsZi50cmVlXzEsIAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAibmV3X2xhYmVsIiwgc2VsZi5maWxlXzJiLCBzZWxmLnRy
ZWVfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0KQorICAgICAgICBzZWxmLmFz
c2VydEVxdWFsKG91dHB1dC5nZXR2YWx1ZSgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAi
QmluYXJ5IGZpbGVzIC9kZXYvbnVsbCBhbmQgbmV3X2xhYmVsIGRpZmZlclxuIikKKyAgICBkZWYg
dGVzdF9saW5rX2RpZmZfZGVsZXRlZChzZWxmKToKKyAgICAgICAgaWYgbm90IGhhc19zeW1saW5r
cygpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIG91dHB1dCA9IFN0cmluZ0lPKCkKKyAg
ICAgICAgc2VsZi5saW5rXzEuZGlmZihpbnRlcm5hbF9kaWZmLCAKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgIm9sZF9sYWJlbCIsIHNlbGYudHJlZV8xLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAiL2Rldi9udWxsIiwgTm9uZSwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
b3V0cHV0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dHB1dC5nZXR2YWx1ZSgpLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICI9PT0gdGFyZ2V0IHdhcyAndGFyZ2V0MSdcbiIpCisKKyAg
ICBkZWYgdGVzdF9saW5rX2RpZmZfYWRkZWQoc2VsZik6CisgICAgICAgIGlmIG5vdCBoYXNfc3lt
bGlua3MoKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBvdXRwdXQgPSBTdHJpbmdJTygp
CisgICAgICAgIHNlbGYubGlua18xLmRpZmYoaW50ZXJuYWxfZGlmZiwgCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICJuZXdfbGFiZWwiLCBzZWxmLnRyZWVfMSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgIi9kZXYvbnVsbCIsIE5vbmUsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgIG91dHB1dCwgcmV2ZXJzZT1UcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dHB1
dC5nZXR2YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICI9PT0gdGFyZ2V0IGlzICd0
YXJnZXQxJ1xuIikKKworICAgIGRlZiB0ZXN0X2xpbmtfZGlmZl9jaGFuZ2VkKHNlbGYpOgorICAg
ICAgICBpZiBub3QgaGFzX3N5bWxpbmtzKCk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAg
b3V0cHV0ID0gU3RyaW5nSU8oKQorICAgICAgICBzZWxmLmxpbmtfMS5kaWZmKGludGVybmFsX2Rp
ZmYsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAiL2Rldi9udWxsIiwgc2VsZi50cmVlXzEs
IAorICAgICAgICAgICAgICAgICAgICAgICAgICAibmV3X2xhYmVsIiwgc2VsZi5saW5rXzIsIHNl
bGYudHJlZV8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQpCisgICAgICAgIHNl
bGYuYXNzZXJ0RXF1YWwob3V0cHV0LmdldHZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAg
ICAgIj09PSB0YXJnZXQgY2hhbmdlZCAndGFyZ2V0MScgPT4gJ3RhcmdldDInXG4iKQorCisKK2Ns
YXNzIFRlc3RQcmV2aW91c0hlYWRzKFRlc3RDYXNlV2l0aFRyZWUpOgorCisgICAgZGVmIHNldFVw
KHNlbGYpOgorICAgICAgICAjIHdlIHdhbnQgc2V2ZXJhbCBpbnZlbnRvcmllcywgdGhhdCByZXNw
ZWN0aXZlbHkKKyAgICAgICAgIyBnaXZlIHVzZSB0aGUgZm9sbG93aW5nIHNjZW5hcmlvczoKKyAg
ICAgICAgIyBBKSBmaWxlaWQgbm90IGluIGFueSBpbnZlbnRvcnkgKEEpLAorICAgICAgICAjIEIp
IGZpbGVpZCBwcmVzZW50IGluIG9uZSBpbnZlbnRvcnkgKEIpIGFuZCAoQSxCKQorICAgICAgICAj
IEMpIGZpbGVpZCBwcmVzZW50IGluIHR3byBpbnZlbnRvcmllcywgYW5kIHRoZXkKKyAgICAgICAg
IyAgIGFyZSBub3QgbXV0dWFsIGRlc2NlbmRlbnRzIChCLCBDKQorICAgICAgICAjIEQpIGZpbGVp
ZCBwcmVzZW50IGluIHR3byBpbnZlbnRvcmllcyBhbmQgb25lIGlzCisgICAgICAgICMgICBhIGRl
c2NlbmRlbnQgb2YgdGhlIG90aGVyLiAoQiwgRCkKKyAgICAgICAgc3VwZXIoVGVzdFByZXZpb3Vz
SGVhZHMsIHNlbGYpLnNldFVwKCkKKyAgICAgICAgc2VsZi53dCA9IHNlbGYubWFrZV9icmFuY2hf
YW5kX3RyZWUoJy4nKQorICAgICAgICBzZWxmLmJyYW5jaCA9IHNlbGYud3QuYnJhbmNoCisgICAg
ICAgIHNlbGYuYnVpbGRfdHJlZShbJ2ZpbGUnXSkKKyAgICAgICAgc2VsZi53dC5jb21taXQoJ25l
dyBicmFuY2gnLCBhbGxvd19wb2ludGxlc3M9VHJ1ZSwgcmV2X2lkPSdBJykKKyAgICAgICAgc2Vs
Zi5pbnZfQSA9IHNlbGYuYnJhbmNoLnJlcG9zaXRvcnkuZ2V0X2ludmVudG9yeSgnQScpCisgICAg
ICAgIHNlbGYud3QuYWRkKFsnZmlsZSddLCBbJ2ZpbGVpZCddKQorICAgICAgICBzZWxmLnd0LmNv
bW1pdCgnYWRkIGZpbGUnLCByZXZfaWQ9J0InKQorICAgICAgICBzZWxmLmludl9CID0gc2VsZi5i
cmFuY2gucmVwb3NpdG9yeS5nZXRfaW52ZW50b3J5KCdCJykKKyAgICAgICAgdW5jb21taXQoc2Vs
Zi5icmFuY2gsIHRyZWU9c2VsZi53dCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmJy
YW5jaC5yZXZpc2lvbl9oaXN0b3J5KCksIFsnQSddKQorICAgICAgICBzZWxmLnd0LmNvbW1pdCgn
YW5vdGhlciBhZGQgb2YgZmlsZScsIHJldl9pZD0nQycpCisgICAgICAgIHNlbGYuaW52X0MgPSBz
ZWxmLmJyYW5jaC5yZXBvc2l0b3J5LmdldF9pbnZlbnRvcnkoJ0MnKQorICAgICAgICBzZWxmLnd0
LmFkZF9wYXJlbnRfdHJlZV9pZCgnQicpCisgICAgICAgIHNlbGYud3QuY29tbWl0KCdtZXJnZSBp
biBCJywgcmV2X2lkPSdEJykKKyAgICAgICAgc2VsZi5pbnZfRCA9IHNlbGYuYnJhbmNoLnJlcG9z
aXRvcnkuZ2V0X2ludmVudG9yeSgnRCcpCisgICAgICAgIHNlbGYudHJlZSA9IHNlbGYud29ya2lu
Z3RyZWVfdG9fdGVzdF90cmVlKHNlbGYud3QpCisgICAgICAgIHNlbGYudHJlZS5sb2NrX3JlYWQo
KQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc2VsZi50cmVlLnVubG9jaykKKyAgICAgICAgc2Vs
Zi5maWxlX2FjdGl2ZSA9IHNlbGYudHJlZS5pbnZlbnRvcnlbJ2ZpbGVpZCddCisgICAgICAgIHNl
bGYud2VhdmUgPSBzZWxmLmJyYW5jaC5yZXBvc2l0b3J5LndlYXZlX3N0b3JlLmdldF93ZWF2ZSgn
ZmlsZWlkJywKKyAgICAgICAgICAgIHNlbGYuYnJhbmNoLnJlcG9zaXRvcnkuZ2V0X3RyYW5zYWN0
aW9uKCkpCisgICAgICAgIAorICAgIGRlZiBnZXRfcHJldmlvdXNfaGVhZHMoc2VsZiwgaW52ZW50
b3JpZXMpOgorICAgICAgICByZXR1cm4gc2VsZi5maWxlX2FjdGl2ZS5maW5kX3ByZXZpb3VzX2hl
YWRzKAorICAgICAgICAgICAgaW52ZW50b3JpZXMsIAorICAgICAgICAgICAgc2VsZi5icmFuY2gu
cmVwb3NpdG9yeS53ZWF2ZV9zdG9yZSwKKyAgICAgICAgICAgIHNlbGYuYnJhbmNoLnJlcG9zaXRv
cnkuZ2V0X3RyYW5zYWN0aW9uKCkpCisgICAgICAgIAorICAgIGRlZiB0ZXN0X2ZpbGVpZF9pbl9u
b19pbnZlbnRvcnkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoe30sIHNlbGYuZ2V0
X3ByZXZpb3VzX2hlYWRzKFtzZWxmLmludl9BXSkpCisKKyAgICBkZWYgdGVzdF9maWxlaWRfaW5f
b25lX2ludmVudG9yeShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh7J0InOnNlbGYu
aW52X0JbJ2ZpbGVpZCddfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdldF9wcmV2
aW91c19oZWFkcyhbc2VsZi5pbnZfQl0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHsnQic6
c2VsZi5pbnZfQlsnZmlsZWlkJ119LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0
X3ByZXZpb3VzX2hlYWRzKFtzZWxmLmludl9BLCBzZWxmLmludl9CXSkpCisgICAgICAgIHNlbGYu
YXNzZXJ0RXF1YWwoeydCJzpzZWxmLmludl9CWydmaWxlaWQnXX0sCisgICAgICAgICAgICAgICAg
ICAgICAgICAgc2VsZi5nZXRfcHJldmlvdXNfaGVhZHMoW3NlbGYuaW52X0IsIHNlbGYuaW52X0Fd
KSkKKworICAgIGRlZiB0ZXN0X2ZpbGVpZF9pbl90d29faW52ZW50b3JpZXNfZ2l2ZXNfYm90aF9l
bnRyaWVzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHsnQic6c2VsZi5pbnZfQlsn
ZmlsZWlkJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICdDJzpzZWxmLmludl9DWydmaWxl
aWQnXX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0X3ByZXZpb3VzX2hlYWRz
KFtzZWxmLmludl9CLCBzZWxmLmludl9DXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeydC
JzpzZWxmLmludl9CWydmaWxlaWQnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ0MnOnNl
bGYuaW52X0NbJ2ZpbGVpZCddfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRf
cHJldmlvdXNfaGVhZHMoW3NlbGYuaW52X0MsIHNlbGYuaW52X0JdKSkKKworICAgIGRlZiB0ZXN0
X2ZpbGVpZF9pbl90d29faW52ZW50b3JpZXNfYWxyZWFkeV9tZXJnZWRfZ2l2ZXNfaGVhZChzZWxm
KToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh7J0QnOnNlbGYuaW52X0RbJ2ZpbGVpZCddfSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdldF9wcmV2aW91c19oZWFkcyhbc2VsZi5p
bnZfQiwgc2VsZi5pbnZfRF0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHsnRCc6c2VsZi5p
bnZfRFsnZmlsZWlkJ119LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0X3ByZXZp
b3VzX2hlYWRzKFtzZWxmLmludl9ELCBzZWxmLmludl9CXSkpCisKKyAgICAjIFRPRE86IHRlc3Qg
dHdvIGludmVudG9yaWVzIHdpdGggdGhlIHNhbWUgZmlsZSByZXZpc2lvbiAKCg==

=== modified file bzrlib/tests/tree_implementations/__init__.py // encoding:bas
... e64
LS0tIGJ6cmxpYi90ZXN0cy90cmVlX2ltcGxlbWVudGF0aW9ucy9fX2luaXRfXy5weQorKysgYnpy
bGliL3Rlc3RzL3RyZWVfaW1wbGVtZW50YXRpb25zL19faW5pdF9fLnB5CkBAIC0zMDksNiArMzA5
LDcgQEAKICAgICB0ZXN0X3RyZWVfaW1wbGVtZW50YXRpb25zID0gWwogICAgICAgICAnYnpybGli
LnRlc3RzLnRyZWVfaW1wbGVtZW50YXRpb25zLnRlc3RfZ2V0X2ZpbGVfbXRpbWUnLAogICAgICAg
ICAnYnpybGliLnRlc3RzLnRyZWVfaW1wbGVtZW50YXRpb25zLnRlc3RfZ2V0X3N5bWxpbmtfdGFy
Z2V0JywKKyAgICAgICAgJ2J6cmxpYi50ZXN0cy50cmVlX2ltcGxlbWVudGF0aW9ucy50ZXN0X2lu
dicsCiAgICAgICAgICdienJsaWIudGVzdHMudHJlZV9pbXBsZW1lbnRhdGlvbnMudGVzdF9saXN0
X2ZpbGVzJywKICAgICAgICAgJ2J6cmxpYi50ZXN0cy50cmVlX2ltcGxlbWVudGF0aW9ucy50ZXN0
X3JldmlzaW9uX3RyZWUnLAogICAgICAgICAnYnpybGliLnRlc3RzLnRyZWVfaW1wbGVtZW50YXRp
b25zLnRlc3RfdGVzdF90cmVlcycsCgo=

=== modified file bzrlib/tests/workingtree_implementations/test_inv.py // encod
... ing:base64
LS0tIGJ6cmxpYi90ZXN0cy93b3JraW5ndHJlZV9pbXBsZW1lbnRhdGlvbnMvdGVzdF9pbnYucHkK
KysrIGJ6cmxpYi90ZXN0cy93b3JraW5ndHJlZV9pbXBsZW1lbnRhdGlvbnMvdGVzdF9pbnYucHkK
QEAgLTE0LDEwICsxNCw5IEBACiAjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdy
aXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAjIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQ
bGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKIAotIiIiVGVzdHMg
Zm9yIGludGVyZmFjZSBjb25mb3JtYW5jZSBvZiBYWFggVE9BREQiIiIKLQotCi1mcm9tIGNTdHJp
bmdJTyBpbXBvcnQgU3RyaW5nSU8KKyIiIlRlc3RzIGZvciBpbnRlcmZhY2UgY29uZm9ybWFuY2Ug
b2YgaW52ZW50b3JpZXMgb2Ygd29ya2luZyB0cmVlcy4iIiIKKworCiBpbXBvcnQgb3MKIGltcG9y
dCB0aW1lCiAKQEAgLTI1LDEyNCArMjQsMTAgQEAKICAgICBlcnJvcnMsCiAgICAgaW52ZW50b3J5
LAogICAgICkKLWZyb20gYnpybGliLmRpZmYgaW1wb3J0IGludGVybmFsX2RpZmYKIGZyb20gYnpy
bGliLm9zdXRpbHMgaW1wb3J0ICgKICAgICBoYXNfc3ltbGlua3MsCiAgICAgKQogZnJvbSBienJs
aWIudGVzdHMud29ya2luZ3RyZWVfaW1wbGVtZW50YXRpb25zIGltcG9ydCBUZXN0Q2FzZVdpdGhX
b3JraW5nVHJlZQotZnJvbSBienJsaWIudW5jb21taXQgaW1wb3J0IHVuY29tbWl0Ci0KLQotY2xh
c3MgVGVzdEVudHJ5RGlmZmluZyhUZXN0Q2FzZVdpdGhXb3JraW5nVHJlZSk6Ci0KLSAgICBkZWYg
c2V0VXAoc2VsZik6Ci0gICAgICAgIHN1cGVyKFRlc3RFbnRyeURpZmZpbmcsIHNlbGYpLnNldFVw
KCkKLSAgICAgICAgc2VsZi53dCA9IHNlbGYubWFrZV9icmFuY2hfYW5kX3RyZWUoJy4nKQotICAg
ICAgICBzZWxmLmJyYW5jaCA9IHNlbGYud3QuYnJhbmNoCi0gICAgICAgIHByaW50ID4+IG9wZW4o
J2ZpbGUnLCAnd2InKSwgJ2ZvbycKLSAgICAgICAgcHJpbnQgPj4gb3BlbignYmluZmlsZScsICd3
YicpLCAnZm9vJwotICAgICAgICBzZWxmLnd0LmFkZChbJ2ZpbGUnXSwgWydmaWxlaWQnXSkKLSAg
ICAgICAgc2VsZi53dC5hZGQoWydiaW5maWxlJ10sIFsnYmluZmlsZWlkJ10pCi0gICAgICAgIGlm
IGhhc19zeW1saW5rcygpOgotICAgICAgICAgICAgb3Muc3ltbGluaygndGFyZ2V0MScsICdzeW1s
aW5rJykKLSAgICAgICAgICAgIHNlbGYud3QuYWRkKFsnc3ltbGluayddLCBbJ2xpbmtpZCddKQot
ICAgICAgICBzZWxmLnd0LmNvbW1pdCgnbWVzc2FnZV8xJywgcmV2X2lkID0gJzEnKQotICAgICAg
ICBwcmludCA+PiBvcGVuKCdmaWxlJywgJ3diJyksICdiYXInCi0gICAgICAgIHByaW50ID4+IG9w
ZW4oJ2JpbmZpbGUnLCAnd2InKSwgJ3gnICogMTAyMyArICdceDAwJwotICAgICAgICBpZiBoYXNf
c3ltbGlua3MoKToKLSAgICAgICAgICAgIG9zLnVubGluaygnc3ltbGluaycpCi0gICAgICAgICAg
ICBvcy5zeW1saW5rKCd0YXJnZXQyJywgJ3N5bWxpbmsnKQotICAgICAgICBzZWxmLnRyZWVfMSA9
IHNlbGYuYnJhbmNoLnJlcG9zaXRvcnkucmV2aXNpb25fdHJlZSgnMScpCi0gICAgICAgIHNlbGYu
aW52XzEgPSBzZWxmLmJyYW5jaC5yZXBvc2l0b3J5LmdldF9pbnZlbnRvcnkoJzEnKQotICAgICAg
ICBzZWxmLmZpbGVfMSA9IHNlbGYuaW52XzFbJ2ZpbGVpZCddCi0gICAgICAgIHNlbGYuZmlsZV8x
YiA9IHNlbGYuaW52XzFbJ2JpbmZpbGVpZCddCi0gICAgICAgIHNlbGYudHJlZV8yID0gc2VsZi53
dAotICAgICAgICBzZWxmLnRyZWVfMi5sb2NrX3JlYWQoKQotICAgICAgICBzZWxmLmFkZENsZWFu
dXAoc2VsZi50cmVlXzIudW5sb2NrKQotICAgICAgICBzZWxmLmludl8yID0gc2VsZi50cmVlXzIu
cmVhZF93b3JraW5nX2ludmVudG9yeSgpCi0gICAgICAgIHNlbGYuZmlsZV8yID0gc2VsZi5pbnZf
MlsnZmlsZWlkJ10KLSAgICAgICAgc2VsZi5maWxlXzJiID0gc2VsZi5pbnZfMlsnYmluZmlsZWlk
J10KLSAgICAgICAgaWYgaGFzX3N5bWxpbmtzKCk6Ci0gICAgICAgICAgICBzZWxmLmxpbmtfMSA9
IHNlbGYuaW52XzFbJ2xpbmtpZCddCi0gICAgICAgICAgICBzZWxmLmxpbmtfMiA9IHNlbGYuaW52
XzJbJ2xpbmtpZCddCi0KLSAgICBkZWYgdGVzdF9maWxlX2RpZmZfZGVsZXRlZChzZWxmKToKLSAg
ICAgICAgb3V0cHV0ID0gU3RyaW5nSU8oKQotICAgICAgICBzZWxmLmZpbGVfMS5kaWZmKGludGVy
bmFsX2RpZmYsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAib2xkX2xhYmVsIiwgc2VsZi50
cmVlXzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIvZGV2L251bGwiLCBOb25lLCBOb25l
LAotICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQpCi0gICAgICAgIHNlbGYuYXNzZXJ0
RXF1YWwob3V0cHV0LmdldHZhbHVlKCksICItLS0gb2xkX2xhYmVsXG4iCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIrKysgL2Rldi9udWxsXG4iCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJAQCAtMSwxICswLDAgQEBcbiIK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi1mb29cbiIKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIikKLQotICAgIGRl
ZiB0ZXN0X2ZpbGVfZGlmZl9hZGRlZChzZWxmKToKLSAgICAgICAgb3V0cHV0ID0gU3RyaW5nSU8o
KQotICAgICAgICBzZWxmLmZpbGVfMS5kaWZmKGludGVybmFsX2RpZmYsIAotICAgICAgICAgICAg
ICAgICAgICAgICAgICAibmV3X2xhYmVsIiwgc2VsZi50cmVlXzEsCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICIvZGV2L251bGwiLCBOb25lLCBOb25lLAotICAgICAgICAgICAgICAgICAgICAg
ICAgICBvdXRwdXQsIHJldmVyc2U9VHJ1ZSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXRw
dXQuZ2V0dmFsdWUoKSwgIi0tLSAvZGV2L251bGxcbiIKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIisrKyBuZXdfbGFiZWxcbiIKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIkBAIC0wLDAgKzEsMSBAQFxuIgotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiK2Zvb1xuIgotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG4iKQotCi0gICAgZGVmIHRlc3RfZmls
ZV9kaWZmX2NoYW5nZWQoc2VsZik6Ci0gICAgICAgIG91dHB1dCA9IFN0cmluZ0lPKCkKLSAgICAg
ICAgc2VsZi5maWxlXzEuZGlmZihpbnRlcm5hbF9kaWZmLCAKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgIi9kZXYvbnVsbCIsIHNlbGYudHJlZV8xLCAKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgIm5ld19sYWJlbCIsIHNlbGYuZmlsZV8yLCBzZWxmLnRyZWVfMiwKLSAgICAgICAgICAgICAg
ICAgICAgICAgICAgb3V0cHV0KQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dHB1dC5nZXR2
YWx1ZSgpLCAiLS0tIC9kZXYvbnVsbFxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAiKysrIG5ld19sYWJlbFxuIgotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAiQEAgLTEsMSArMSwxIEBAXG4iCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICItZm9vXG4iCi0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICIrYmFyXG4iCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICJcbiIpCi0gICAgICAgIAotICAgIGRlZiB0ZXN0X2ZpbGVf
ZGlmZl9iaW5hcnkoc2VsZik6Ci0gICAgICAgIG91dHB1dCA9IFN0cmluZ0lPKCkKLSAgICAgICAg
c2VsZi5maWxlXzEuZGlmZihpbnRlcm5hbF9kaWZmLCAKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgIi9kZXYvbnVsbCIsIHNlbGYudHJlZV8xLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
Im5ld19sYWJlbCIsIHNlbGYuZmlsZV8yYiwgc2VsZi50cmVlXzIsCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgIG91dHB1dCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXRwdXQuZ2V0dmFs
dWUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIkJpbmFyeSBmaWxlcyAvZGV2L251bGwg
YW5kIG5ld19sYWJlbCBkaWZmZXJcbiIpCi0gICAgZGVmIHRlc3RfbGlua19kaWZmX2RlbGV0ZWQo
c2VsZik6Ci0gICAgICAgIGlmIG5vdCBoYXNfc3ltbGlua3MoKToKLSAgICAgICAgICAgIHJldHVy
bgotICAgICAgICBvdXRwdXQgPSBTdHJpbmdJTygpCi0gICAgICAgIHNlbGYubGlua18xLmRpZmYo
aW50ZXJuYWxfZGlmZiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJvbGRfbGFiZWwiLCBz
ZWxmLnRyZWVfMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIi9kZXYvbnVsbCIsIE5vbmUs
IE5vbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCkKLSAgICAgICAgc2VsZi5h
c3NlcnRFcXVhbChvdXRwdXQuZ2V0dmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAi
PT09IHRhcmdldCB3YXMgJ3RhcmdldDEnXG4iKQotCi0gICAgZGVmIHRlc3RfbGlua19kaWZmX2Fk
ZGVkKHNlbGYpOgotICAgICAgICBpZiBub3QgaGFzX3N5bWxpbmtzKCk6Ci0gICAgICAgICAgICBy
ZXR1cm4KLSAgICAgICAgb3V0cHV0ID0gU3RyaW5nSU8oKQotICAgICAgICBzZWxmLmxpbmtfMS5k
aWZmKGludGVybmFsX2RpZmYsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAibmV3X2xhYmVs
Iiwgc2VsZi50cmVlXzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIvZGV2L251bGwiLCBO
b25lLCBOb25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsIHJldmVyc2U9VHJ1
ZSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXRwdXQuZ2V0dmFsdWUoKSwKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAiPT09IHRhcmdldCBpcyAndGFyZ2V0MSdcbiIpCi0KLSAgICBkZWYg
dGVzdF9saW5rX2RpZmZfY2hhbmdlZChzZWxmKToKLSAgICAgICAgaWYgbm90IGhhc19zeW1saW5r
cygpOgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIG91dHB1dCA9IFN0cmluZ0lPKCkKLSAg
ICAgICAgc2VsZi5saW5rXzEuZGlmZihpbnRlcm5hbF9kaWZmLCAKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgIi9kZXYvbnVsbCIsIHNlbGYudHJlZV8xLCAKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgIm5ld19sYWJlbCIsIHNlbGYubGlua18yLCBzZWxmLnRyZWVfMiwKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgb3V0cHV0KQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dHB1dC5n
ZXR2YWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICI9PT0gdGFyZ2V0IGNoYW5nZWQg
J3RhcmdldDEnID0+ICd0YXJnZXQyJ1xuIikKIAogCiBjbGFzcyBUZXN0UmV2ZXJ0KFRlc3RDYXNl
V2l0aFdvcmtpbmdUcmVlKToKQEAgLTE2MSw3MyArNDYsNiBAQAogICAgICAgICBzZWxmLmFzc2Vy
dEVxdWFsKGxlbih3dC5pbnZlbnRvcnkpLCAxKQogCiAKLWNsYXNzIFRlc3RQcmV2aW91c0hlYWRz
KFRlc3RDYXNlV2l0aFdvcmtpbmdUcmVlKToKLQotICAgIGRlZiBzZXRVcChzZWxmKToKLSAgICAg
ICAgIyB3ZSB3YW50IHNldmVyYWwgaW52ZW50b3JpZXMsIHRoYXQgcmVzcGVjdGl2ZWx5Ci0gICAg
ICAgICMgZ2l2ZSB1c2UgdGhlIGZvbGxvd2luZyBzY2VuYXJpb3M6Ci0gICAgICAgICMgQSkgZmls
ZWlkIG5vdCBpbiBhbnkgaW52ZW50b3J5IChBKSwKLSAgICAgICAgIyBCKSBmaWxlaWQgcHJlc2Vu
dCBpbiBvbmUgaW52ZW50b3J5IChCKSBhbmQgKEEsQikKLSAgICAgICAgIyBDKSBmaWxlaWQgcHJl
c2VudCBpbiB0d28gaW52ZW50b3JpZXMsIGFuZCB0aGV5Ci0gICAgICAgICMgICBhcmUgbm90IG11
dHVhbCBkZXNjZW5kZW50cyAoQiwgQykKLSAgICAgICAgIyBEKSBmaWxlaWQgcHJlc2VudCBpbiB0
d28gaW52ZW50b3JpZXMgYW5kIG9uZSBpcwotICAgICAgICAjICAgYSBkZXNjZW5kZW50IG9mIHRo
ZSBvdGhlci4gKEIsIEQpCi0gICAgICAgIHN1cGVyKFRlc3RQcmV2aW91c0hlYWRzLCBzZWxmKS5z
ZXRVcCgpCi0gICAgICAgIHNlbGYud3QgPSBzZWxmLm1ha2VfYnJhbmNoX2FuZF90cmVlKCcuJykK
LSAgICAgICAgc2VsZi5icmFuY2ggPSBzZWxmLnd0LmJyYW5jaAotICAgICAgICBzZWxmLmJ1aWxk
X3RyZWUoWydmaWxlJ10pCi0gICAgICAgIHNlbGYud3QuY29tbWl0KCduZXcgYnJhbmNoJywgYWxs
b3dfcG9pbnRsZXNzPVRydWUsIHJldl9pZD0nQScpCi0gICAgICAgIHNlbGYuaW52X0EgPSBzZWxm
LmJyYW5jaC5yZXBvc2l0b3J5LmdldF9pbnZlbnRvcnkoJ0EnKQotICAgICAgICBzZWxmLnd0LmFk
ZChbJ2ZpbGUnXSwgWydmaWxlaWQnXSkKLSAgICAgICAgc2VsZi53dC5jb21taXQoJ2FkZCBmaWxl
JywgcmV2X2lkPSdCJykKLSAgICAgICAgc2VsZi5pbnZfQiA9IHNlbGYuYnJhbmNoLnJlcG9zaXRv
cnkuZ2V0X2ludmVudG9yeSgnQicpCi0gICAgICAgIHVuY29tbWl0KHNlbGYuYnJhbmNoLCB0cmVl
PXNlbGYud3QpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5icmFuY2gucmV2aXNpb25f
aGlzdG9yeSgpLCBbJ0EnXSkKLSAgICAgICAgc2VsZi53dC5jb21taXQoJ2Fub3RoZXIgYWRkIG9m
IGZpbGUnLCByZXZfaWQ9J0MnKQotICAgICAgICBzZWxmLmludl9DID0gc2VsZi5icmFuY2gucmVw
b3NpdG9yeS5nZXRfaW52ZW50b3J5KCdDJykKLSAgICAgICAgc2VsZi53dC5hZGRfcGFyZW50X3Ry
ZWVfaWQoJ0InKQotICAgICAgICBzZWxmLnd0LmNvbW1pdCgnbWVyZ2UgaW4gQicsIHJldl9pZD0n
RCcpCi0gICAgICAgIHNlbGYuaW52X0QgPSBzZWxmLmJyYW5jaC5yZXBvc2l0b3J5LmdldF9pbnZl
bnRvcnkoJ0QnKQotICAgICAgICBzZWxmLnd0LmxvY2tfcmVhZCgpCi0gICAgICAgIHNlbGYuYWRk
Q2xlYW51cChzZWxmLnd0LnVubG9jaykKLSAgICAgICAgc2VsZi5maWxlX2FjdGl2ZSA9IHNlbGYu
d3QuaW52ZW50b3J5WydmaWxlaWQnXQotICAgICAgICBzZWxmLndlYXZlID0gc2VsZi5icmFuY2gu
cmVwb3NpdG9yeS53ZWF2ZV9zdG9yZS5nZXRfd2VhdmUoJ2ZpbGVpZCcsCi0gICAgICAgICAgICBz
ZWxmLmJyYW5jaC5yZXBvc2l0b3J5LmdldF90cmFuc2FjdGlvbigpKQotICAgICAgICAKLSAgICBk
ZWYgZ2V0X3ByZXZpb3VzX2hlYWRzKHNlbGYsIGludmVudG9yaWVzKToKLSAgICAgICAgcmV0dXJu
IHNlbGYuZmlsZV9hY3RpdmUuZmluZF9wcmV2aW91c19oZWFkcygKLSAgICAgICAgICAgIGludmVu
dG9yaWVzLCAKLSAgICAgICAgICAgIHNlbGYuYnJhbmNoLnJlcG9zaXRvcnkud2VhdmVfc3RvcmUs
Ci0gICAgICAgICAgICBzZWxmLmJyYW5jaC5yZXBvc2l0b3J5LmdldF90cmFuc2FjdGlvbigpKQot
ICAgICAgICAKLSAgICBkZWYgdGVzdF9maWxlaWRfaW5fbm9faW52ZW50b3J5KHNlbGYpOgotICAg
ICAgICBzZWxmLmFzc2VydEVxdWFsKHt9LCBzZWxmLmdldF9wcmV2aW91c19oZWFkcyhbc2VsZi5p
bnZfQV0pKQotCi0gICAgZGVmIHRlc3RfZmlsZWlkX2luX29uZV9pbnZlbnRvcnkoc2VsZik6Ci0g
ICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeydCJzpzZWxmLmludl9CWydmaWxlaWQnXX0sCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRfcHJldmlvdXNfaGVhZHMoW3NlbGYuaW52X0Jd
KSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh7J0InOnNlbGYuaW52X0JbJ2ZpbGVpZCddfSwK
LSAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdldF9wcmV2aW91c19oZWFkcyhbc2VsZi5p
bnZfQSwgc2VsZi5pbnZfQl0pKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHsnQic6c2VsZi5p
bnZfQlsnZmlsZWlkJ119LAotICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0X3ByZXZp
b3VzX2hlYWRzKFtzZWxmLmludl9CLCBzZWxmLmludl9BXSkpCi0KLSAgICBkZWYgdGVzdF9maWxl
aWRfaW5fdHdvX2ludmVudG9yaWVzX2dpdmVzX2JvdGhfZW50cmllcyhzZWxmKToKLSAgICAgICAg
c2VsZi5hc3NlcnRFcXVhbCh7J0InOnNlbGYuaW52X0JbJ2ZpbGVpZCddLAotICAgICAgICAgICAg
ICAgICAgICAgICAgICAnQyc6c2VsZi5pbnZfQ1snZmlsZWlkJ119LAotICAgICAgICAgICAgICAg
ICAgICAgICAgICBzZWxmLmdldF9wcmV2aW91c19oZWFkcyhbc2VsZi5pbnZfQiwgc2VsZi5pbnZf
Q10pKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHsnQic6c2VsZi5pbnZfQlsnZmlsZWlkJ10s
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICdDJzpzZWxmLmludl9DWydmaWxlaWQnXX0sCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0X3ByZXZpb3VzX2hlYWRzKFtzZWxmLmlu
dl9DLCBzZWxmLmludl9CXSkpCi0KLSAgICBkZWYgdGVzdF9maWxlaWRfaW5fdHdvX2ludmVudG9y
aWVzX2FscmVhZHlfbWVyZ2VkX2dpdmVzX2hlYWQoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0
RXF1YWwoeydEJzpzZWxmLmludl9EWydmaWxlaWQnXX0sCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgc2VsZi5nZXRfcHJldmlvdXNfaGVhZHMoW3NlbGYuaW52X0IsIHNlbGYuaW52X0RdKSkKLSAg
ICAgICAgc2VsZi5hc3NlcnRFcXVhbCh7J0QnOnNlbGYuaW52X0RbJ2ZpbGVpZCddfSwKLSAgICAg
ICAgICAgICAgICAgICAgICAgICBzZWxmLmdldF9wcmV2aW91c19oZWFkcyhbc2VsZi5pbnZfRCwg
c2VsZi5pbnZfQl0pKQotCi0gICAgIyBUT0RPOiB0ZXN0IHR3byBpbnZlbnRvcmllcyB3aXRoIHRo
ZSBzYW1lIGZpbGUgcmV2aXNpb24gCi0KLQogY2xhc3MgVGVzdFNuYXBzaG90KFRlc3RDYXNlV2l0
aFdvcmtpbmdUcmVlKToKIAogICAgIGRlZiBzZXRVcChzZWxmKToKCg==

=== modified directory  // last-changed:marienz at gentoo.org-20070312023523-h4bhx
... 3oyqmbd27tf
# revision id: marienz at gentoo.org-20070312023523-h4bhx3oyqmbd27tf
# sha1: dda0401cef12e4e8dcff9ec7f00068bc3a4cac5d
# inventory sha1: a009ba1b58c3217f5e37a9142c20e5db2254750f
# parent ids:
#   marienz at gentoo.org-20070312010216-j6u0y6v75nk071me
# properties:
#   branch-nick: bzr-dirstate-symlinks

# message:
#   Make an assert actually assert something.
# committer: Marien Zwart <marienz at gentoo.org>
# date: Mon 2007-03-12 02:02:16.905999899 +0100

=== modified file bzrlib/workingtree_4.py // encoding:base64
LS0tIGJ6cmxpYi93b3JraW5ndHJlZV80LnB5CisrKyBienJsaWIvd29ya2luZ3RyZWVfNC5weQpA
QCAtMzY0LDggKzM2NCw4IEBACiAgICAgICAgICAgICAgICAgZWxpZiBraW5kID09ICd0cmVlLXJl
ZmVyZW5jZSc6CiAgICAgICAgICAgICAgICAgICAgIGFzc2VydCBzZWxmLl9yZXBvX3N1cHBvcnRz
X3RyZWVfcmVmZXJlbmNlCiAgICAgICAgICAgICAgICAgICAgIGludl9lbnRyeS5yZWZlcmVuY2Vf
cmV2aXNpb24gPSBsaW5rX29yX3NoYTEgb3IgTm9uZQotICAgICAgICAgICAgICAgIGVsc2U6Ci0g
ICAgICAgICAgICAgICAgICAgIGFzc2VydCAndW5rbm93biBraW5kJworICAgICAgICAgICAgICAg
IGVsaWYga2luZCAhPSAnc3ltbGluayc6CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCBGYWxz
ZSwgJ3Vua25vd24ga2luZCcKICAgICAgICAgICAgICAgICAjIFRoZXNlIGNoZWNrcyBjb3N0IHVz
IGFyb3VuZCA0MG1zIG9uIGEgNTVrIGVudHJ5IHRyZWUKICAgICAgICAgICAgICAgICBhc3NlcnQg
ZmlsZV9pZCBub3QgaW4gaW52X2J5aWQsICgnZmlsZV9pZCAlcyBhbHJlYWR5IGluJwogICAgICAg
ICAgICAgICAgICAgICAnIGludmVudG9yeSBhcyAlcycgJSAoZmlsZV9pZCwgaW52X2J5aWRbZmls
ZV9pZF0pKQoK

=== modified directory  // last-changed:marienz at gentoo.org-20070312010216-j6u0y
... 6v75nk071me
# revision id: marienz at gentoo.org-20070312010216-j6u0y6v75nk071me
# sha1: 8dec366b58f2b7a239d996fd903405dbee6f62fe
# inventory sha1: 1a2c0100ca5aebb571f7ae85c2f1505acc500634
# parent ids:
#   marienz at gentoo.org-20070312003752-luxbjn7ty2mr3pyj
# properties:
#   branch-nick: bzr-dirstate-symlinks

# message:
#   Increase test coverage.
# committer: Marien Zwart <marienz at gentoo.org>
# date: Mon 2007-03-12 01:37:52.733000040 +0100

=== modified file bzrlib/tests/tree_implementations/test_tree.py // encoding:ba
... se64
LS0tIGJ6cmxpYi90ZXN0cy90cmVlX2ltcGxlbWVudGF0aW9ucy90ZXN0X3RyZWUucHkKKysrIGJ6
cmxpYi90ZXN0cy90cmVlX2ltcGxlbWVudGF0aW9ucy90ZXN0X3RyZWUucHkKQEAgLTE3LDcgKzE3
LDkgQEAKIGZyb20gYnpybGliIGltcG9ydCAoCiAgICAgZXJyb3JzLAogICAgIHRlc3RzLAorICAg
IG11dGFibGV0cmVlLAogICAgICkKK2Zyb20gYnpybGliLnRlc3RzIGltcG9ydCBUZXN0U2tpcHBl
ZAogZnJvbSBienJsaWIudGVzdHMudHJlZV9pbXBsZW1lbnRhdGlvbnMgaW1wb3J0IFRlc3RDYXNl
V2l0aFRyZWUKIAogY2xhc3MgVGVzdEFubm90YXRlKFRlc3RDYXNlV2l0aFRyZWUpOgpAQCAtOTAs
MyArOTIsMTggQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGVycm9ycy5Ob1N1Y2hJ
ZCwgdHJlZS5pZDJwYXRoLCAnYScpCiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICB0cmVl
LnVubG9jaygpCisKKworY2xhc3MgVGVzdEludmVudG9yeShUZXN0Q2FzZVdpdGhUcmVlKToKKwor
ICAgIGRlZiB0ZXN0X3N5bWxpbmsoc2VsZik6CisgICAgICAgIHRyZWUgPSBzZWxmLmdldF90cmVl
X3dpdGhfc3ViZGlyc19hbmRfYWxsX2NvbnRlbnRfdHlwZXMoKQorICAgICAgICBpZiBpc2luc3Rh
bmNlKHRyZWUsIG11dGFibGV0cmVlLk11dGFibGVUcmVlKToKKyAgICAgICAgICAgIHJhaXNlIFRl
c3RTa2lwcGVkKAorICAgICAgICAgICAgICAgICdzeW1saW5rcyBub3QgYWNjdXJhdGVseSByZXBy
ZXNlbnRlZCBpbiB3b3JraW5nIHRyZWVzJykKKyAgICAgICAgdHJlZS5sb2NrX3JlYWQoKQorICAg
ICAgICBzZWxmLmFkZENsZWFudXAodHJlZS51bmxvY2spCisgICAgICAgIGludiA9IHRyZWUuaW52
ZW50b3J5CisgICAgICAgIGVudHJ5ID0gaW52W2ludi5wYXRoMmlkKCdzeW1saW5rJyldCisgICAg
ICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW50cnkua2luZCwgJ3N5bWxpbmsnKQorICAgICAgICBzZWxm
LmFzc2VydEVxdWFsKGVudHJ5LnN5bWxpbmtfdGFyZ2V0LCAnbGluay10YXJnZXQnKQoK

=== modified directory  // last-changed:marienz at gentoo.org-20070312003752-luxbj
... n7ty2mr3pyj
# revision id: marienz at gentoo.org-20070312003752-luxbjn7ty2mr3pyj
# sha1: 25d9ec00d126d3c97f6abc0e022d4db2332db2f1
# inventory sha1: 0f62c2b4790097c63b641b7f2b0b7d15cee6c087
# parent ids:
#   marienz at gentoo.org-20070311232335-wpymm3pagwdtasjn
# properties:
#   branch-nick: bzr-dirstate-symlinks

# message:
#   Make the workingtree inventory tests actually use the different workingtree implementations.
# committer: Marien Zwart <marienz at gentoo.org>
# date: Mon 2007-03-12 00:23:35.549000025 +0100

=== modified file bzrlib/tests/workingtree_implementations/test_inv.py // encod
... ing:base64
LS0tIGJ6cmxpYi90ZXN0cy93b3JraW5ndHJlZV9pbXBsZW1lbnRhdGlvbnMvdGVzdF9pbnYucHkK
KysrIGJ6cmxpYi90ZXN0cy93b3JraW5ndHJlZV9pbXBsZW1lbnRhdGlvbnMvdGVzdF9pbnYucHkK
QEAgLTI5LDExICsyOSwxMSBAQAogZnJvbSBienJsaWIub3N1dGlscyBpbXBvcnQgKAogICAgIGhh
c19zeW1saW5rcywKICAgICApCi1mcm9tIGJ6cmxpYi50ZXN0cyBpbXBvcnQgVGVzdENhc2VXaXRo
VHJhbnNwb3J0Citmcm9tIGJ6cmxpYi50ZXN0cy53b3JraW5ndHJlZV9pbXBsZW1lbnRhdGlvbnMg
aW1wb3J0IFRlc3RDYXNlV2l0aFdvcmtpbmdUcmVlCiBmcm9tIGJ6cmxpYi51bmNvbW1pdCBpbXBv
cnQgdW5jb21taXQKIAogCi1jbGFzcyBUZXN0RW50cnlEaWZmaW5nKFRlc3RDYXNlV2l0aFRyYW5z
cG9ydCk6CitjbGFzcyBUZXN0RW50cnlEaWZmaW5nKFRlc3RDYXNlV2l0aFdvcmtpbmdUcmVlKToK
IAogICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgc3VwZXIoVGVzdEVudHJ5RGlmZmluZywg
c2VsZikuc2V0VXAoKQpAQCAtMTQ1LDcgKzE0NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAg
ICAgIj09PSB0YXJnZXQgY2hhbmdlZCAndGFyZ2V0MScgPT4gJ3RhcmdldDInXG4iKQogCiAKLWNs
YXNzIFRlc3RSZXZlcnQoVGVzdENhc2VXaXRoVHJhbnNwb3J0KToKK2NsYXNzIFRlc3RSZXZlcnQo
VGVzdENhc2VXaXRoV29ya2luZ1RyZWUpOgogCiAgICAgZGVmIHRlc3RfZGFuZ2xpbmdfaWQoc2Vs
Zik6CiAgICAgICAgIHd0ID0gc2VsZi5tYWtlX2JyYW5jaF9hbmRfdHJlZSgnYjEnKQpAQCAtMTYx
LDcgKzE2MSw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHd0LmludmVudG9yeSks
IDEpCiAKIAotY2xhc3MgVGVzdFByZXZpb3VzSGVhZHMoVGVzdENhc2VXaXRoVHJhbnNwb3J0KToK
K2NsYXNzIFRlc3RQcmV2aW91c0hlYWRzKFRlc3RDYXNlV2l0aFdvcmtpbmdUcmVlKToKIAogICAg
IGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgIyB3ZSB3YW50IHNldmVyYWwgaW52ZW50b3JpZXMs
IHRoYXQgcmVzcGVjdGl2ZWx5CkBAIC0yMjgsNyArMjI4LDcgQEAKICAgICAjIFRPRE86IHRlc3Qg
dHdvIGludmVudG9yaWVzIHdpdGggdGhlIHNhbWUgZmlsZSByZXZpc2lvbiAKIAogCi1jbGFzcyBU
ZXN0U25hcHNob3QoVGVzdENhc2VXaXRoVHJhbnNwb3J0KToKK2NsYXNzIFRlc3RTbmFwc2hvdChU
ZXN0Q2FzZVdpdGhXb3JraW5nVHJlZSk6CiAKICAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAg
ICMgZm9yIGZ1bGwgdGVzdGluZyB3ZSdsbCBuZWVkIGEgYnJhbmNoCgo=

=== modified directory  // last-changed:marienz at gentoo.org-20070311232335-wpymm
... 3pagwdtasjn
# revision id: marienz at gentoo.org-20070311232335-wpymm3pagwdtasjn
# sha1: c0f9bb97b0ad85eebe03421055252f388a172b3d
# inventory sha1: 99a585dc58ae64a41be4eb2a09e9651df706817d
# parent ids:
#   marienz at gentoo.org-20070311230549-rn7jh354jrzq6m1e
# properties:
#   branch-nick: bzr-dirstate-symlinks

# message:
#   Move the workingtree-related inventory tests to a separate file.
# committer: Marien Zwart <marienz at gentoo.org>
# date: Mon 2007-03-12 00:05:49.868999958 +0100

=== added file bzrlib/tests/workingtree_implementations/test_inv.py // file-id:
... test_inv.py-20070311221604-ighlq8tbn5xq0kuo-1 // encoding:base64
LS0tIC9kZXYvbnVsbAorKysgYnpybGliL3Rlc3RzL3dvcmtpbmd0cmVlX2ltcGxlbWVudGF0aW9u
cy90ZXN0X2ludi5weQpAQCAtMCwwICsxLDMxMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDcgQ2Fu
b25pY2FsIEx0ZAorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy
ZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhl
IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBT
b2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgor
IyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0g
aXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0
IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkg
b2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF
LiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxz
LgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJh
bCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0
ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxh
Y2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyIiIlRlc3RzIGZv
ciBpbnRlcmZhY2UgY29uZm9ybWFuY2Ugb2YgWFhYIFRPQUREIiIiCisKKworZnJvbSBjU3RyaW5n
SU8gaW1wb3J0IFN0cmluZ0lPCitpbXBvcnQgb3MKK2ltcG9ydCB0aW1lCisKK2Zyb20gYnpybGli
IGltcG9ydCAoCisgICAgZXJyb3JzLAorICAgIGludmVudG9yeSwKKyAgICApCitmcm9tIGJ6cmxp
Yi5kaWZmIGltcG9ydCBpbnRlcm5hbF9kaWZmCitmcm9tIGJ6cmxpYi5vc3V0aWxzIGltcG9ydCAo
CisgICAgaGFzX3N5bWxpbmtzLAorICAgICkKK2Zyb20gYnpybGliLnRlc3RzIGltcG9ydCBUZXN0
Q2FzZVdpdGhUcmFuc3BvcnQKK2Zyb20gYnpybGliLnVuY29tbWl0IGltcG9ydCB1bmNvbW1pdAor
CisKK2NsYXNzIFRlc3RFbnRyeURpZmZpbmcoVGVzdENhc2VXaXRoVHJhbnNwb3J0KToKKworICAg
IGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc3VwZXIoVGVzdEVudHJ5RGlmZmluZywgc2VsZiku
c2V0VXAoKQorICAgICAgICBzZWxmLnd0ID0gc2VsZi5tYWtlX2JyYW5jaF9hbmRfdHJlZSgnLicp
CisgICAgICAgIHNlbGYuYnJhbmNoID0gc2VsZi53dC5icmFuY2gKKyAgICAgICAgcHJpbnQgPj4g
b3BlbignZmlsZScsICd3YicpLCAnZm9vJworICAgICAgICBwcmludCA+PiBvcGVuKCdiaW5maWxl
JywgJ3diJyksICdmb28nCisgICAgICAgIHNlbGYud3QuYWRkKFsnZmlsZSddLCBbJ2ZpbGVpZCdd
KQorICAgICAgICBzZWxmLnd0LmFkZChbJ2JpbmZpbGUnXSwgWydiaW5maWxlaWQnXSkKKyAgICAg
ICAgaWYgaGFzX3N5bWxpbmtzKCk6CisgICAgICAgICAgICBvcy5zeW1saW5rKCd0YXJnZXQxJywg
J3N5bWxpbmsnKQorICAgICAgICAgICAgc2VsZi53dC5hZGQoWydzeW1saW5rJ10sIFsnbGlua2lk
J10pCisgICAgICAgIHNlbGYud3QuY29tbWl0KCdtZXNzYWdlXzEnLCByZXZfaWQgPSAnMScpCisg
ICAgICAgIHByaW50ID4+IG9wZW4oJ2ZpbGUnLCAnd2InKSwgJ2JhcicKKyAgICAgICAgcHJpbnQg
Pj4gb3BlbignYmluZmlsZScsICd3YicpLCAneCcgKiAxMDIzICsgJ1x4MDAnCisgICAgICAgIGlm
IGhhc19zeW1saW5rcygpOgorICAgICAgICAgICAgb3MudW5saW5rKCdzeW1saW5rJykKKyAgICAg
ICAgICAgIG9zLnN5bWxpbmsoJ3RhcmdldDInLCAnc3ltbGluaycpCisgICAgICAgIHNlbGYudHJl
ZV8xID0gc2VsZi5icmFuY2gucmVwb3NpdG9yeS5yZXZpc2lvbl90cmVlKCcxJykKKyAgICAgICAg
c2VsZi5pbnZfMSA9IHNlbGYuYnJhbmNoLnJlcG9zaXRvcnkuZ2V0X2ludmVudG9yeSgnMScpCisg
ICAgICAgIHNlbGYuZmlsZV8xID0gc2VsZi5pbnZfMVsnZmlsZWlkJ10KKyAgICAgICAgc2VsZi5m
aWxlXzFiID0gc2VsZi5pbnZfMVsnYmluZmlsZWlkJ10KKyAgICAgICAgc2VsZi50cmVlXzIgPSBz
ZWxmLnd0CisgICAgICAgIHNlbGYudHJlZV8yLmxvY2tfcmVhZCgpCisgICAgICAgIHNlbGYuYWRk
Q2xlYW51cChzZWxmLnRyZWVfMi51bmxvY2spCisgICAgICAgIHNlbGYuaW52XzIgPSBzZWxmLnRy
ZWVfMi5yZWFkX3dvcmtpbmdfaW52ZW50b3J5KCkKKyAgICAgICAgc2VsZi5maWxlXzIgPSBzZWxm
Lmludl8yWydmaWxlaWQnXQorICAgICAgICBzZWxmLmZpbGVfMmIgPSBzZWxmLmludl8yWydiaW5m
aWxlaWQnXQorICAgICAgICBpZiBoYXNfc3ltbGlua3MoKToKKyAgICAgICAgICAgIHNlbGYubGlu
a18xID0gc2VsZi5pbnZfMVsnbGlua2lkJ10KKyAgICAgICAgICAgIHNlbGYubGlua18yID0gc2Vs
Zi5pbnZfMlsnbGlua2lkJ10KKworICAgIGRlZiB0ZXN0X2ZpbGVfZGlmZl9kZWxldGVkKHNlbGYp
OgorICAgICAgICBvdXRwdXQgPSBTdHJpbmdJTygpCisgICAgICAgIHNlbGYuZmlsZV8xLmRpZmYo
aW50ZXJuYWxfZGlmZiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICJvbGRfbGFiZWwiLCBz
ZWxmLnRyZWVfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIi9kZXYvbnVsbCIsIE5vbmUs
IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCkKKyAgICAgICAgc2VsZi5h
c3NlcnRFcXVhbChvdXRwdXQuZ2V0dmFsdWUoKSwgIi0tLSBvbGRfbGFiZWxcbiIKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIisrKyAvZGV2L251bGxcbiIKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkBAIC0xLDEgKzAsMCBA
QFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLWZvb1xu
IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG4iKQorCisg
ICAgZGVmIHRlc3RfZmlsZV9kaWZmX2FkZGVkKHNlbGYpOgorICAgICAgICBvdXRwdXQgPSBTdHJp
bmdJTygpCisgICAgICAgIHNlbGYuZmlsZV8xLmRpZmYoaW50ZXJuYWxfZGlmZiwgCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICJuZXdfbGFiZWwiLCBzZWxmLnRyZWVfMSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgIi9kZXYvbnVsbCIsIE5vbmUsIE5vbmUsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgIG91dHB1dCwgcmV2ZXJzZT1UcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFs
KG91dHB1dC5nZXR2YWx1ZSgpLCAiLS0tIC9kZXYvbnVsbFxuIgorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAiKysrIG5ld19sYWJlbFxuIgorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQEAgLTAsMCArMSwxIEBAXG4iCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIrZm9vXG4iCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiIpCisKKyAgICBkZWYgdGVz
dF9maWxlX2RpZmZfY2hhbmdlZChzZWxmKToKKyAgICAgICAgb3V0cHV0ID0gU3RyaW5nSU8oKQor
ICAgICAgICBzZWxmLmZpbGVfMS5kaWZmKGludGVybmFsX2RpZmYsIAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAiL2Rldi9udWxsIiwgc2VsZi50cmVlXzEsIAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAibmV3X2xhYmVsIiwgc2VsZi5maWxlXzIsIHNlbGYudHJlZV8yLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICBvdXRwdXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0cHV0
LmdldHZhbHVlKCksICItLS0gL2Rldi9udWxsXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICIrKysgbmV3X2xhYmVsXG4iCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICJAQCAtMSwxICsxLDEgQEBcbiIKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi1mb29cbiIKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIitiYXJcbiIKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIikKKyAgICAgICAgCisgICAgZGVmIHRlc3Rf
ZmlsZV9kaWZmX2JpbmFyeShzZWxmKToKKyAgICAgICAgb3V0cHV0ID0gU3RyaW5nSU8oKQorICAg
ICAgICBzZWxmLmZpbGVfMS5kaWZmKGludGVybmFsX2RpZmYsIAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAiL2Rldi9udWxsIiwgc2VsZi50cmVlXzEsIAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAibmV3X2xhYmVsIiwgc2VsZi5maWxlXzJiLCBzZWxmLnRyZWVfMiwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgb3V0cHV0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dHB1dC5n
ZXR2YWx1ZSgpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAiQmluYXJ5IGZpbGVzIC9kZXYv
bnVsbCBhbmQgbmV3X2xhYmVsIGRpZmZlclxuIikKKyAgICBkZWYgdGVzdF9saW5rX2RpZmZfZGVs
ZXRlZChzZWxmKToKKyAgICAgICAgaWYgbm90IGhhc19zeW1saW5rcygpOgorICAgICAgICAgICAg
cmV0dXJuCisgICAgICAgIG91dHB1dCA9IFN0cmluZ0lPKCkKKyAgICAgICAgc2VsZi5saW5rXzEu
ZGlmZihpbnRlcm5hbF9kaWZmLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm9sZF9sYWJl
bCIsIHNlbGYudHJlZV8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiL2Rldi9udWxsIiwg
Tm9uZSwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0KQorICAgICAgICBz
ZWxmLmFzc2VydEVxdWFsKG91dHB1dC5nZXR2YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICI9PT0gdGFyZ2V0IHdhcyAndGFyZ2V0MSdcbiIpCisKKyAgICBkZWYgdGVzdF9saW5rX2Rp
ZmZfYWRkZWQoc2VsZik6CisgICAgICAgIGlmIG5vdCBoYXNfc3ltbGlua3MoKToKKyAgICAgICAg
ICAgIHJldHVybgorICAgICAgICBvdXRwdXQgPSBTdHJpbmdJTygpCisgICAgICAgIHNlbGYubGlu
a18xLmRpZmYoaW50ZXJuYWxfZGlmZiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXdf
bGFiZWwiLCBzZWxmLnRyZWVfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIi9kZXYvbnVs
bCIsIE5vbmUsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwgcmV2ZXJz
ZT1UcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dHB1dC5nZXR2YWx1ZSgpLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICI9PT0gdGFyZ2V0IGlzICd0YXJnZXQxJ1xuIikKKworICAg
IGRlZiB0ZXN0X2xpbmtfZGlmZl9jaGFuZ2VkKHNlbGYpOgorICAgICAgICBpZiBub3QgaGFzX3N5
bWxpbmtzKCk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgb3V0cHV0ID0gU3RyaW5nSU8o
KQorICAgICAgICBzZWxmLmxpbmtfMS5kaWZmKGludGVybmFsX2RpZmYsIAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAiL2Rldi9udWxsIiwgc2VsZi50cmVlXzEsIAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAibmV3X2xhYmVsIiwgc2VsZi5saW5rXzIsIHNlbGYudHJlZV8yLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICBvdXRwdXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0
cHV0LmdldHZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIj09PSB0YXJnZXQgY2hh
bmdlZCAndGFyZ2V0MScgPT4gJ3RhcmdldDInXG4iKQorCisKK2NsYXNzIFRlc3RSZXZlcnQoVGVz
dENhc2VXaXRoVHJhbnNwb3J0KToKKworICAgIGRlZiB0ZXN0X2RhbmdsaW5nX2lkKHNlbGYpOgor
ICAgICAgICB3dCA9IHNlbGYubWFrZV9icmFuY2hfYW5kX3RyZWUoJ2IxJykKKyAgICAgICAgd3Qu
bG9ja190cmVlX3dyaXRlKCkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHd0LnVubG9jaykKKyAg
ICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4od3QuaW52ZW50b3J5KSwgMSkKKyAgICAgICAgb3Bl
bignYjEvYScsICd3YicpLndyaXRlKCdhIHRlc3RcbicpCisgICAgICAgIHd0LmFkZCgnYScpCisg
ICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHd0LmludmVudG9yeSksIDIpCisgICAgICAgIHd0
LmZsdXNoKCkgIyB3b3JrYXJvdW5kIHJldmVydCBkb2luZyB3dC5fd3JpdGVfaW52ZW50b3J5IGZv
ciBub3cuCisgICAgICAgIG9zLnVubGluaygnYjEvYScpCisgICAgICAgIHd0LnJldmVydChbXSkK
KyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4od3QuaW52ZW50b3J5KSwgMSkKKworCitjbGFz
cyBUZXN0UHJldmlvdXNIZWFkcyhUZXN0Q2FzZVdpdGhUcmFuc3BvcnQpOgorCisgICAgZGVmIHNl
dFVwKHNlbGYpOgorICAgICAgICAjIHdlIHdhbnQgc2V2ZXJhbCBpbnZlbnRvcmllcywgdGhhdCBy
ZXNwZWN0aXZlbHkKKyAgICAgICAgIyBnaXZlIHVzZSB0aGUgZm9sbG93aW5nIHNjZW5hcmlvczoK
KyAgICAgICAgIyBBKSBmaWxlaWQgbm90IGluIGFueSBpbnZlbnRvcnkgKEEpLAorICAgICAgICAj
IEIpIGZpbGVpZCBwcmVzZW50IGluIG9uZSBpbnZlbnRvcnkgKEIpIGFuZCAoQSxCKQorICAgICAg
ICAjIEMpIGZpbGVpZCBwcmVzZW50IGluIHR3byBpbnZlbnRvcmllcywgYW5kIHRoZXkKKyAgICAg
ICAgIyAgIGFyZSBub3QgbXV0dWFsIGRlc2NlbmRlbnRzIChCLCBDKQorICAgICAgICAjIEQpIGZp
bGVpZCBwcmVzZW50IGluIHR3byBpbnZlbnRvcmllcyBhbmQgb25lIGlzCisgICAgICAgICMgICBh
IGRlc2NlbmRlbnQgb2YgdGhlIG90aGVyLiAoQiwgRCkKKyAgICAgICAgc3VwZXIoVGVzdFByZXZp
b3VzSGVhZHMsIHNlbGYpLnNldFVwKCkKKyAgICAgICAgc2VsZi53dCA9IHNlbGYubWFrZV9icmFu
Y2hfYW5kX3RyZWUoJy4nKQorICAgICAgICBzZWxmLmJyYW5jaCA9IHNlbGYud3QuYnJhbmNoCisg
ICAgICAgIHNlbGYuYnVpbGRfdHJlZShbJ2ZpbGUnXSkKKyAgICAgICAgc2VsZi53dC5jb21taXQo
J25ldyBicmFuY2gnLCBhbGxvd19wb2ludGxlc3M9VHJ1ZSwgcmV2X2lkPSdBJykKKyAgICAgICAg
c2VsZi5pbnZfQSA9IHNlbGYuYnJhbmNoLnJlcG9zaXRvcnkuZ2V0X2ludmVudG9yeSgnQScpCisg
ICAgICAgIHNlbGYud3QuYWRkKFsnZmlsZSddLCBbJ2ZpbGVpZCddKQorICAgICAgICBzZWxmLnd0
LmNvbW1pdCgnYWRkIGZpbGUnLCByZXZfaWQ9J0InKQorICAgICAgICBzZWxmLmludl9CID0gc2Vs
Zi5icmFuY2gucmVwb3NpdG9yeS5nZXRfaW52ZW50b3J5KCdCJykKKyAgICAgICAgdW5jb21taXQo
c2VsZi5icmFuY2gsIHRyZWU9c2VsZi53dCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxm
LmJyYW5jaC5yZXZpc2lvbl9oaXN0b3J5KCksIFsnQSddKQorICAgICAgICBzZWxmLnd0LmNvbW1p
dCgnYW5vdGhlciBhZGQgb2YgZmlsZScsIHJldl9pZD0nQycpCisgICAgICAgIHNlbGYuaW52X0Mg
PSBzZWxmLmJyYW5jaC5yZXBvc2l0b3J5LmdldF9pbnZlbnRvcnkoJ0MnKQorICAgICAgICBzZWxm
Lnd0LmFkZF9wYXJlbnRfdHJlZV9pZCgnQicpCisgICAgICAgIHNlbGYud3QuY29tbWl0KCdtZXJn
ZSBpbiBCJywgcmV2X2lkPSdEJykKKyAgICAgICAgc2VsZi5pbnZfRCA9IHNlbGYuYnJhbmNoLnJl
cG9zaXRvcnkuZ2V0X2ludmVudG9yeSgnRCcpCisgICAgICAgIHNlbGYud3QubG9ja19yZWFkKCkK
KyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHNlbGYud3QudW5sb2NrKQorICAgICAgICBzZWxmLmZp
bGVfYWN0aXZlID0gc2VsZi53dC5pbnZlbnRvcnlbJ2ZpbGVpZCddCisgICAgICAgIHNlbGYud2Vh
dmUgPSBzZWxmLmJyYW5jaC5yZXBvc2l0b3J5LndlYXZlX3N0b3JlLmdldF93ZWF2ZSgnZmlsZWlk
JywKKyAgICAgICAgICAgIHNlbGYuYnJhbmNoLnJlcG9zaXRvcnkuZ2V0X3RyYW5zYWN0aW9uKCkp
CisgICAgICAgIAorICAgIGRlZiBnZXRfcHJldmlvdXNfaGVhZHMoc2VsZiwgaW52ZW50b3JpZXMp
OgorICAgICAgICByZXR1cm4gc2VsZi5maWxlX2FjdGl2ZS5maW5kX3ByZXZpb3VzX2hlYWRzKAor
ICAgICAgICAgICAgaW52ZW50b3JpZXMsIAorICAgICAgICAgICAgc2VsZi5icmFuY2gucmVwb3Np
dG9yeS53ZWF2ZV9zdG9yZSwKKyAgICAgICAgICAgIHNlbGYuYnJhbmNoLnJlcG9zaXRvcnkuZ2V0
X3RyYW5zYWN0aW9uKCkpCisgICAgICAgIAorICAgIGRlZiB0ZXN0X2ZpbGVpZF9pbl9ub19pbnZl
bnRvcnkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoe30sIHNlbGYuZ2V0X3ByZXZp
b3VzX2hlYWRzKFtzZWxmLmludl9BXSkpCisKKyAgICBkZWYgdGVzdF9maWxlaWRfaW5fb25lX2lu
dmVudG9yeShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh7J0InOnNlbGYuaW52X0Jb
J2ZpbGVpZCddfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdldF9wcmV2aW91c19o
ZWFkcyhbc2VsZi5pbnZfQl0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHsnQic6c2VsZi5p
bnZfQlsnZmlsZWlkJ119LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0X3ByZXZp
b3VzX2hlYWRzKFtzZWxmLmludl9BLCBzZWxmLmludl9CXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0
RXF1YWwoeydCJzpzZWxmLmludl9CWydmaWxlaWQnXX0sCisgICAgICAgICAgICAgICAgICAgICAg
ICAgc2VsZi5nZXRfcHJldmlvdXNfaGVhZHMoW3NlbGYuaW52X0IsIHNlbGYuaW52X0FdKSkKKwor
ICAgIGRlZiB0ZXN0X2ZpbGVpZF9pbl90d29faW52ZW50b3JpZXNfZ2l2ZXNfYm90aF9lbnRyaWVz
KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHsnQic6c2VsZi5pbnZfQlsnZmlsZWlk
J10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICdDJzpzZWxmLmludl9DWydmaWxlaWQnXX0s
CisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0X3ByZXZpb3VzX2hlYWRzKFtzZWxm
Lmludl9CLCBzZWxmLmludl9DXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeydCJzpzZWxm
Lmludl9CWydmaWxlaWQnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ0MnOnNlbGYuaW52
X0NbJ2ZpbGVpZCddfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRfcHJldmlv
dXNfaGVhZHMoW3NlbGYuaW52X0MsIHNlbGYuaW52X0JdKSkKKworICAgIGRlZiB0ZXN0X2ZpbGVp
ZF9pbl90d29faW52ZW50b3JpZXNfYWxyZWFkeV9tZXJnZWRfZ2l2ZXNfaGVhZChzZWxmKToKKyAg
ICAgICAgc2VsZi5hc3NlcnRFcXVhbCh7J0QnOnNlbGYuaW52X0RbJ2ZpbGVpZCddfSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICBzZWxmLmdldF9wcmV2aW91c19oZWFkcyhbc2VsZi5pbnZfQiwg
c2VsZi5pbnZfRF0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHsnRCc6c2VsZi5pbnZfRFsn
ZmlsZWlkJ119LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0X3ByZXZpb3VzX2hl
YWRzKFtzZWxmLmludl9ELCBzZWxmLmludl9CXSkpCisKKyAgICAjIFRPRE86IHRlc3QgdHdvIGlu
dmVudG9yaWVzIHdpdGggdGhlIHNhbWUgZmlsZSByZXZpc2lvbiAKKworCitjbGFzcyBUZXN0U25h
cHNob3QoVGVzdENhc2VXaXRoVHJhbnNwb3J0KToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAg
ICAgICAgIyBmb3IgZnVsbCB0ZXN0aW5nIHdlJ2xsIG5lZWQgYSBicmFuY2gKKyAgICAgICAgIyB3
aXRoIGEgc3ViZGlyIHRvIHRlc3QgcGFyZW50IGNoYW5nZXMuCisgICAgICAgICMgYW5kIGEgZmls
ZSwgbGluayBhbmQgZGlyIHVuZGVyIHRoYXQuCisgICAgICAgICMgYnV0IHJpZ2h0IG5vdyBJIG9u
bHkgbmVlZCBvbmUgYXR0cmlidXRlCisgICAgICAgICMgdG8gY2hhbmdlLCBhbmQgdGhlbiB0ZXN0
IG1lcmdlIHBhdHRlcm5zCisgICAgICAgICMgd2l0aCBmYWtlIHBhcmVudCBlbnRyaWVzLgorICAg
ICAgICBzdXBlcihUZXN0U25hcHNob3QsIHNlbGYpLnNldFVwKCkKKyAgICAgICAgc2VsZi53dCA9
IHNlbGYubWFrZV9icmFuY2hfYW5kX3RyZWUoJy4nKQorICAgICAgICBzZWxmLmJyYW5jaCA9IHNl
bGYud3QuYnJhbmNoCisgICAgICAgIHNlbGYuYnVpbGRfdHJlZShbJ3N1YmRpci8nLCAnc3ViZGly
L2ZpbGUnXSwgbGluZV9lbmRpbmdzPSdiaW5hcnknKQorICAgICAgICBzZWxmLnd0LmFkZChbJ3N1
YmRpcicsICdzdWJkaXIvZmlsZSddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgWydkaXJpZCcsICdmaWxlaWQnXSkKKyAgICAgICAgaWYgaGFzX3N5bWxpbmtzKCk6Cisg
ICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYud3QuY29tbWl0KCdtZXNzYWdlXzEnLCByZXZf
aWQgPSAnMScpCisgICAgICAgIHNlbGYudHJlZV8xID0gc2VsZi5icmFuY2gucmVwb3NpdG9yeS5y
ZXZpc2lvbl90cmVlKCcxJykKKyAgICAgICAgc2VsZi5pbnZfMSA9IHNlbGYuYnJhbmNoLnJlcG9z
aXRvcnkuZ2V0X2ludmVudG9yeSgnMScpCisgICAgICAgIHNlbGYuZmlsZV8xID0gc2VsZi5pbnZf
MVsnZmlsZWlkJ10KKyAgICAgICAgc2VsZi53dC5sb2NrX3dyaXRlKCkKKyAgICAgICAgc2VsZi5h
ZGRDbGVhbnVwKHNlbGYud3QudW5sb2NrKQorICAgICAgICBzZWxmLmZpbGVfYWN0aXZlID0gc2Vs
Zi53dC5pbnZlbnRvcnlbJ2ZpbGVpZCddCisgICAgICAgIHNlbGYuYnVpbGRlciA9IHNlbGYuYnJh
bmNoLmdldF9jb21taXRfYnVpbGRlcihbXSwgdGltZXN0YW1wPXRpbWUudGltZSgpLCByZXZpc2lv
bl9pZD0nMicpCisKKyAgICBkZWYgdGVzdF9zbmFwc2hvdF9uZXdfcmV2aXNpb24oc2VsZik6Cisg
ICAgICAgICMgVGhpcyB0ZXN0cyB0aGF0IGEgc2ltcGxlIGNvbW1pdCB3aXRoIG5vIHBhcmVudHMg
bWFrZXMgYSBuZXcKKyAgICAgICAgIyByZXZpc2lvbiB2YWx1ZSBpbiB0aGUgaW52ZW50b3J5IGVu
dHJ5CisgICAgICAgIHNlbGYuZmlsZV9hY3RpdmUuc25hcHNob3QoJzInLCAnc3ViZGlyL2ZpbGUn
LCB7fSwgc2VsZi53dCwgc2VsZi5idWlsZGVyKQorICAgICAgICAjIGV4cGVjdGVkIG91dGNvbWUg
LSBmaWxlXzEgaGFzIGEgcmV2aXNpb24gaWQgb2YgJzInLCBhbmQgd2UgY2FuIGdldAorICAgICAg
ICAjIGl0cyB0ZXh0IG9mICdmaWxlIGNvbnRlbnRzJyBvdXQgb2YgdGhlIHdlYXZlLgorICAgICAg
ICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZmlsZV8xLnJldmlzaW9uLCAnMScpCisgICAgICAgIHNl
bGYuYXNzZXJ0RXF1YWwoc2VsZi5maWxlX2FjdGl2ZS5yZXZpc2lvbiwgJzInKQorICAgICAgICAj
IHRoaXMgc2hvdWxkIGJlIGEgc2VwYXJhdGUgdGVzdCBwcm9iYWJseSwgYnV0IGxldHMgY2hlY2sg
aXQgb25jZS4uCisgICAgICAgIGxpbmVzID0gc2VsZi5icmFuY2gucmVwb3NpdG9yeS53ZWF2ZV9z
dG9yZS5nZXRfd2VhdmUoCisgICAgICAgICAgICAnZmlsZWlkJywgCisgICAgICAgICAgICBzZWxm
LmJyYW5jaC5nZXRfdHJhbnNhY3Rpb24oKSkuZ2V0X2xpbmVzKCcyJykKKyAgICAgICAgc2VsZi5h
c3NlcnRFcXVhbChsaW5lcywgWydjb250ZW50cyBvZiBzdWJkaXIvZmlsZVxuJ10pCisKKyAgICBk
ZWYgdGVzdF9zbmFwc2hvdF91bmNoYW5nZWQoc2VsZik6CisgICAgICAgICNUaGlzIHRlc3RzIHRo
YXQgYSBzaW1wbGUgY29tbWl0IGRvZXMgbm90IG1ha2UgYSBuZXcgZW50cnkgZm9yCisgICAgICAg
ICMgYW4gdW5jaGFuZ2VkIGludmVudG9yeSBlbnRyeQorICAgICAgICBzZWxmLmZpbGVfYWN0aXZl
LnNuYXBzaG90KCcyJywgJ3N1YmRpci9maWxlJywgeycxJzpzZWxmLmZpbGVfMX0sCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53dCwgc2VsZi5idWlsZGVyKQorICAgICAg
ICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZmlsZV8xLnJldmlzaW9uLCAnMScpCisgICAgICAgIHNl
bGYuYXNzZXJ0RXF1YWwoc2VsZi5maWxlX2FjdGl2ZS5yZXZpc2lvbiwgJzEnKQorICAgICAgICB2
ZiA9IHNlbGYuYnJhbmNoLnJlcG9zaXRvcnkud2VhdmVfc3RvcmUuZ2V0X3dlYXZlKAorICAgICAg
ICAgICAgJ2ZpbGVpZCcsIAorICAgICAgICAgICAgc2VsZi5icmFuY2gucmVwb3NpdG9yeS5nZXRf
dHJhbnNhY3Rpb24oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZXJyb3JzLlJldmlzaW9u
Tm90UHJlc2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdmYuZ2V0X2xpbmVzLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAnMicpCisKKyAgICBkZWYgdGVzdF9zbmFwc2hvdF9tZXJn
ZV9pZGVudGljYWxfZGlmZmVyZW50X3JldmlkKHNlbGYpOgorICAgICAgICAjIFRoaXMgdGVzdHMg
dGhhdCBhIGNvbW1pdCB3aXRoIHR3byBpZGVudGljYWwgcGFyZW50cywgb25lIG9mIHdoaWNoIGhh
cworICAgICAgICAjIGEgZGlmZmVyZW50IHJldmlzaW9uIGlkLCByZXN1bHRzIGluIGEgbmV3IHJl
dmlzaW9uIGlkIGluIHRoZSBlbnRyeS4KKyAgICAgICAgIyAxLT5vdGhlciwgY29tbWl0IGEgbWVy
Z2Ugb2Ygb3RoZXIgYWdhaW5zdCAxLCByZXN1bHRzIGluIDIuCisgICAgICAgIG90aGVyX2llID0g
aW52ZW50b3J5LkludmVudG9yeUZpbGUoJ2ZpbGVpZCcsICduZXduYW1lJywgc2VsZi5maWxlXzEu
cGFyZW50X2lkKQorICAgICAgICBvdGhlcl9pZSA9IGludmVudG9yeS5JbnZlbnRvcnlGaWxlKCdm
aWxlaWQnLCAnZmlsZScsIHNlbGYuZmlsZV8xLnBhcmVudF9pZCkKKyAgICAgICAgb3RoZXJfaWUu
cmV2aXNpb24gPSAnMScKKyAgICAgICAgb3RoZXJfaWUudGV4dF9zaGExID0gc2VsZi5maWxlXzEu
dGV4dF9zaGExCisgICAgICAgIG90aGVyX2llLnRleHRfc2l6ZSA9IHNlbGYuZmlsZV8xLnRleHRf
c2l6ZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZmlsZV8xLCBvdGhlcl9pZSkKKyAg
ICAgICAgb3RoZXJfaWUucmV2aXNpb24gPSAnb3RoZXInCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90
RXF1YWwoc2VsZi5maWxlXzEsIG90aGVyX2llKQorICAgICAgICB2ZXJzaW9uZmlsZSA9IHNlbGYu
YnJhbmNoLnJlcG9zaXRvcnkud2VhdmVfc3RvcmUuZ2V0X3dlYXZlKAorICAgICAgICAgICAgJ2Zp
bGVpZCcsIHNlbGYuYnJhbmNoLnJlcG9zaXRvcnkuZ2V0X3RyYW5zYWN0aW9uKCkpCisgICAgICAg
IHZlcnNpb25maWxlLmNsb25lX3RleHQoJ290aGVyJywgJzEnLCBbJzEnXSkKKyAgICAgICAgc2Vs
Zi5maWxlX2FjdGl2ZS5zbmFwc2hvdCgnMicsICdzdWJkaXIvZmlsZScsIAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHsnMSc6c2VsZi5maWxlXzEsICdvdGhlcic6b3RoZXJfaWV9
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud3QsIHNlbGYuYnVpbGRl
cikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZpbGVfYWN0aXZlLnJldmlzaW9uLCAn
MicpCisKKyAgICBkZWYgdGVzdF9zbmFwc2hvdF9jaGFuZ2VkKHNlbGYpOgorICAgICAgICAjIFRo
aXMgdGVzdHMgdGhhdCBhIGNvbW1pdCB3aXRoIG9uZSBkaWZmZXJlbnQgcGFyZW50IHJlc3VsdHMg
aW4gYSBuZXcKKyAgICAgICAgIyByZXZpc2lvbiBpZCBpbiB0aGUgZW50cnkuCisgICAgICAgIHNl
bGYud3QucmVuYW1lX29uZSgnc3ViZGlyL2ZpbGUnLCAnc3ViZGlyL25ld25hbWUnKQorICAgICAg
ICBzZWxmLmZpbGVfYWN0aXZlID0gc2VsZi53dC5pbnZlbnRvcnlbJ2ZpbGVpZCddCisgICAgICAg
IHNlbGYuZmlsZV9hY3RpdmUuc25hcHNob3QoJzInLCAnc3ViZGlyL25ld25hbWUnLCB7JzEnOnNl
bGYuZmlsZV8xfSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53dCwg
c2VsZi5idWlsZGVyKQorICAgICAgICAjIGV4cGVjdGVkIG91dGNvbWUgLSBmaWxlXzEgaGFzIGEg
cmV2aXNpb24gaWQgb2YgJzInCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5maWxlX2Fj
dGl2ZS5yZXZpc2lvbiwgJzInKQoK

=== modified file bzrlib/tests/test_inv.py // encoding:base64
LS0tIGJ6cmxpYi90ZXN0cy90ZXN0X2ludi5weQorKysgYnpybGliL3Rlc3RzL3Rlc3RfaW52LnB5
CkBAIC0xNCwyMCArMTQsMTIgQEAKICMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwg
d3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxl
IFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogCi1mcm9tIGNT
dHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KLWltcG9ydCBvcwotaW1wb3J0IHRpbWUKLQogZnJvbSBi
enJsaWIgaW1wb3J0IGVycm9ycywgaW52ZW50b3J5LCBvc3V0aWxzCi1mcm9tIGJ6cmxpYi5icmFu
Y2ggaW1wb3J0IEJyYW5jaAotZnJvbSBienJsaWIuZGlmZiBpbXBvcnQgaW50ZXJuYWxfZGlmZgog
ZnJvbSBienJsaWIuaW52ZW50b3J5IGltcG9ydCAoSW52ZW50b3J5LCBST09UX0lELCBJbnZlbnRv
cnlGaWxlLAogICAgIEludmVudG9yeURpcmVjdG9yeSwgSW52ZW50b3J5RW50cnksIFRyZWVSZWZl
cmVuY2UpCi1mcm9tIGJ6cmxpYi5vc3V0aWxzIGltcG9ydCAoaGFzX3N5bWxpbmtzLCByZW5hbWUs
IHBhdGhqb2luLCBpc19pbnNpZGVfYW55LCAKK2Zyb20gYnpybGliLm9zdXRpbHMgaW1wb3J0IChw
YXRoam9pbiwgaXNfaW5zaWRlX2FueSwgCiAgICAgaXNfaW5zaWRlX29yX3BhcmVudF9vZl9hbnkp
Ci1mcm9tIGJ6cmxpYi50ZXN0cyBpbXBvcnQgVGVzdENhc2UsIFRlc3RDYXNlV2l0aFRyYW5zcG9y
dAotZnJvbSBienJsaWIudHJhbnNmb3JtIGltcG9ydCBUcmVlVHJhbnNmb3JtCi1mcm9tIGJ6cmxp
Yi51bmNvbW1pdCBpbXBvcnQgdW5jb21taXQKK2Zyb20gYnpybGliLnRlc3RzIGltcG9ydCBUZXN0
Q2FzZQogCiAKIGNsYXNzIFRlc3RJbnZlbnRvcnkoVGVzdENhc2UpOgpAQCAtMjgyLDI3MCArMjc0
LDYgQEAKICAgICAgICAgICAgIG9zdXRpbHMubm9ybWFsaXplZF9maWxlbmFtZSA9IG9yaWdfbm9y
bWFsaXplZF9maWxlbmFtZQogCiAKLWNsYXNzIFRlc3RFbnRyeURpZmZpbmcoVGVzdENhc2VXaXRo
VHJhbnNwb3J0KToKLQotICAgIGRlZiBzZXRVcChzZWxmKToKLSAgICAgICAgc3VwZXIoVGVzdEVu
dHJ5RGlmZmluZywgc2VsZikuc2V0VXAoKQotICAgICAgICBzZWxmLnd0ID0gc2VsZi5tYWtlX2Jy
YW5jaF9hbmRfdHJlZSgnLicpCi0gICAgICAgIHNlbGYuYnJhbmNoID0gc2VsZi53dC5icmFuY2gK
LSAgICAgICAgcHJpbnQgPj4gb3BlbignZmlsZScsICd3YicpLCAnZm9vJwotICAgICAgICBwcmlu
dCA+PiBvcGVuKCdiaW5maWxlJywgJ3diJyksICdmb28nCi0gICAgICAgIHNlbGYud3QuYWRkKFsn
ZmlsZSddLCBbJ2ZpbGVpZCddKQotICAgICAgICBzZWxmLnd0LmFkZChbJ2JpbmZpbGUnXSwgWydi
aW5maWxlaWQnXSkKLSAgICAgICAgaWYgaGFzX3N5bWxpbmtzKCk6Ci0gICAgICAgICAgICBvcy5z
eW1saW5rKCd0YXJnZXQxJywgJ3N5bWxpbmsnKQotICAgICAgICAgICAgc2VsZi53dC5hZGQoWydz
eW1saW5rJ10sIFsnbGlua2lkJ10pCi0gICAgICAgIHNlbGYud3QuY29tbWl0KCdtZXNzYWdlXzEn
LCByZXZfaWQgPSAnMScpCi0gICAgICAgIHByaW50ID4+IG9wZW4oJ2ZpbGUnLCAnd2InKSwgJ2Jh
cicKLSAgICAgICAgcHJpbnQgPj4gb3BlbignYmluZmlsZScsICd3YicpLCAneCcgKiAxMDIzICsg
J1x4MDAnCi0gICAgICAgIGlmIGhhc19zeW1saW5rcygpOgotICAgICAgICAgICAgb3MudW5saW5r
KCdzeW1saW5rJykKLSAgICAgICAgICAgIG9zLnN5bWxpbmsoJ3RhcmdldDInLCAnc3ltbGluaycp
Ci0gICAgICAgIHNlbGYudHJlZV8xID0gc2VsZi5icmFuY2gucmVwb3NpdG9yeS5yZXZpc2lvbl90
cmVlKCcxJykKLSAgICAgICAgc2VsZi5pbnZfMSA9IHNlbGYuYnJhbmNoLnJlcG9zaXRvcnkuZ2V0
X2ludmVudG9yeSgnMScpCi0gICAgICAgIHNlbGYuZmlsZV8xID0gc2VsZi5pbnZfMVsnZmlsZWlk
J10KLSAgICAgICAgc2VsZi5maWxlXzFiID0gc2VsZi5pbnZfMVsnYmluZmlsZWlkJ10KLSAgICAg
ICAgc2VsZi50cmVlXzIgPSBzZWxmLnd0Ci0gICAgICAgIHNlbGYudHJlZV8yLmxvY2tfcmVhZCgp
Ci0gICAgICAgIHNlbGYuYWRkQ2xlYW51cChzZWxmLnRyZWVfMi51bmxvY2spCi0gICAgICAgIHNl
bGYuaW52XzIgPSBzZWxmLnRyZWVfMi5yZWFkX3dvcmtpbmdfaW52ZW50b3J5KCkKLSAgICAgICAg
c2VsZi5maWxlXzIgPSBzZWxmLmludl8yWydmaWxlaWQnXQotICAgICAgICBzZWxmLmZpbGVfMmIg
PSBzZWxmLmludl8yWydiaW5maWxlaWQnXQotICAgICAgICBpZiBoYXNfc3ltbGlua3MoKToKLSAg
ICAgICAgICAgIHNlbGYubGlua18xID0gc2VsZi5pbnZfMVsnbGlua2lkJ10KLSAgICAgICAgICAg
IHNlbGYubGlua18yID0gc2VsZi5pbnZfMlsnbGlua2lkJ10KLQotICAgIGRlZiB0ZXN0X2ZpbGVf
ZGlmZl9kZWxldGVkKHNlbGYpOgotICAgICAgICBvdXRwdXQgPSBTdHJpbmdJTygpCi0gICAgICAg
IHNlbGYuZmlsZV8xLmRpZmYoaW50ZXJuYWxfZGlmZiwgCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICJvbGRfbGFiZWwiLCBzZWxmLnRyZWVfMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
Ii9kZXYvbnVsbCIsIE5vbmUsIE5vbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1
dCkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXRwdXQuZ2V0dmFsdWUoKSwgIi0tLSBvbGRf
bGFiZWxcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIisr
KyAvZGV2L251bGxcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIkBAIC0xLDEgKzAsMCBAQFxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAiLWZvb1xuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAiXG4iKQotCi0gICAgZGVmIHRlc3RfZmlsZV9kaWZmX2FkZGVkKHNlbGYpOgotICAg
ICAgICBvdXRwdXQgPSBTdHJpbmdJTygpCi0gICAgICAgIHNlbGYuZmlsZV8xLmRpZmYoaW50ZXJu
YWxfZGlmZiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJuZXdfbGFiZWwiLCBzZWxmLnRy
ZWVfMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIi9kZXYvbnVsbCIsIE5vbmUsIE5vbmUs
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwgcmV2ZXJzZT1UcnVlKQotICAgICAg
ICBzZWxmLmFzc2VydEVxdWFsKG91dHB1dC5nZXR2YWx1ZSgpLCAiLS0tIC9kZXYvbnVsbFxuIgot
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKysrIG5ld19sYWJl
bFxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQEAgLTAs
MCArMSwxIEBAXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICIrZm9vXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJc
biIpCi0KLSAgICBkZWYgdGVzdF9maWxlX2RpZmZfY2hhbmdlZChzZWxmKToKLSAgICAgICAgb3V0
cHV0ID0gU3RyaW5nSU8oKQotICAgICAgICBzZWxmLmZpbGVfMS5kaWZmKGludGVybmFsX2RpZmYs
IAotICAgICAgICAgICAgICAgICAgICAgICAgICAiL2Rldi9udWxsIiwgc2VsZi50cmVlXzEsIAot
ICAgICAgICAgICAgICAgICAgICAgICAgICAibmV3X2xhYmVsIiwgc2VsZi5maWxlXzIsIHNlbGYu
dHJlZV8yLAotICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQpCi0gICAgICAgIHNlbGYu
YXNzZXJ0RXF1YWwob3V0cHV0LmdldHZhbHVlKCksICItLS0gL2Rldi9udWxsXG4iCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIrKysgbmV3X2xhYmVsXG4iCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJAQCAtMSwxICsxLDEg
QEBcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi1mb29c
biIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIitiYXJcbiIK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIikKLSAgICAg
ICAgCi0gICAgZGVmIHRlc3RfZmlsZV9kaWZmX2JpbmFyeShzZWxmKToKLSAgICAgICAgb3V0cHV0
ID0gU3RyaW5nSU8oKQotICAgICAgICBzZWxmLmZpbGVfMS5kaWZmKGludGVybmFsX2RpZmYsIAot
ICAgICAgICAgICAgICAgICAgICAgICAgICAiL2Rldi9udWxsIiwgc2VsZi50cmVlXzEsIAotICAg
ICAgICAgICAgICAgICAgICAgICAgICAibmV3X2xhYmVsIiwgc2VsZi5maWxlXzJiLCBzZWxmLnRy
ZWVfMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0KQotICAgICAgICBzZWxmLmFz
c2VydEVxdWFsKG91dHB1dC5nZXR2YWx1ZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAi
QmluYXJ5IGZpbGVzIC9kZXYvbnVsbCBhbmQgbmV3X2xhYmVsIGRpZmZlclxuIikKLSAgICBkZWYg
dGVzdF9saW5rX2RpZmZfZGVsZXRlZChzZWxmKToKLSAgICAgICAgaWYgbm90IGhhc19zeW1saW5r
cygpOgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIG91dHB1dCA9IFN0cmluZ0lPKCkKLSAg
ICAgICAgc2VsZi5saW5rXzEuZGlmZihpbnRlcm5hbF9kaWZmLCAKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgIm9sZF9sYWJlbCIsIHNlbGYudHJlZV8xLAotICAgICAgICAgICAgICAgICAgICAg
ICAgICAiL2Rldi9udWxsIiwgTm9uZSwgTm9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
b3V0cHV0KQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dHB1dC5nZXR2YWx1ZSgpLAotICAg
ICAgICAgICAgICAgICAgICAgICAgICI9PT0gdGFyZ2V0IHdhcyAndGFyZ2V0MSdcbiIpCi0KLSAg
ICBkZWYgdGVzdF9saW5rX2RpZmZfYWRkZWQoc2VsZik6Ci0gICAgICAgIGlmIG5vdCBoYXNfc3lt
bGlua3MoKToKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBvdXRwdXQgPSBTdHJpbmdJTygp
Ci0gICAgICAgIHNlbGYubGlua18xLmRpZmYoaW50ZXJuYWxfZGlmZiwgCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICJuZXdfbGFiZWwiLCBzZWxmLnRyZWVfMSwKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgIi9kZXYvbnVsbCIsIE5vbmUsIE5vbmUsCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgIG91dHB1dCwgcmV2ZXJzZT1UcnVlKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dHB1
dC5nZXR2YWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICI9PT0gdGFyZ2V0IGlzICd0
YXJnZXQxJ1xuIikKLQotICAgIGRlZiB0ZXN0X2xpbmtfZGlmZl9jaGFuZ2VkKHNlbGYpOgotICAg
ICAgICBpZiBub3QgaGFzX3N5bWxpbmtzKCk6Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAg
b3V0cHV0ID0gU3RyaW5nSU8oKQotICAgICAgICBzZWxmLmxpbmtfMS5kaWZmKGludGVybmFsX2Rp
ZmYsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAiL2Rldi9udWxsIiwgc2VsZi50cmVlXzEs
IAotICAgICAgICAgICAgICAgICAgICAgICAgICAibmV3X2xhYmVsIiwgc2VsZi5saW5rXzIsIHNl
bGYudHJlZV8yLAotICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQpCi0gICAgICAgIHNl
bGYuYXNzZXJ0RXF1YWwob3V0cHV0LmdldHZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgIj09PSB0YXJnZXQgY2hhbmdlZCAndGFyZ2V0MScgPT4gJ3RhcmdldDInXG4iKQotCi0KLWNs
YXNzIFRlc3RTbmFwc2hvdChUZXN0Q2FzZVdpdGhUcmFuc3BvcnQpOgotCi0gICAgZGVmIHNldFVw
KHNlbGYpOgotICAgICAgICAjIGZvciBmdWxsIHRlc3Rpbmcgd2UnbGwgbmVlZCBhIGJyYW5jaAot
ICAgICAgICAjIHdpdGggYSBzdWJkaXIgdG8gdGVzdCBwYXJlbnQgY2hhbmdlcy4KLSAgICAgICAg
IyBhbmQgYSBmaWxlLCBsaW5rIGFuZCBkaXIgdW5kZXIgdGhhdC4KLSAgICAgICAgIyBidXQgcmln
aHQgbm93IEkgb25seSBuZWVkIG9uZSBhdHRyaWJ1dGUKLSAgICAgICAgIyB0byBjaGFuZ2UsIGFu
ZCB0aGVuIHRlc3QgbWVyZ2UgcGF0dGVybnMKLSAgICAgICAgIyB3aXRoIGZha2UgcGFyZW50IGVu
dHJpZXMuCi0gICAgICAgIHN1cGVyKFRlc3RTbmFwc2hvdCwgc2VsZikuc2V0VXAoKQotICAgICAg
ICBzZWxmLnd0ID0gc2VsZi5tYWtlX2JyYW5jaF9hbmRfdHJlZSgnLicpCi0gICAgICAgIHNlbGYu
YnJhbmNoID0gc2VsZi53dC5icmFuY2gKLSAgICAgICAgc2VsZi5idWlsZF90cmVlKFsnc3ViZGly
LycsICdzdWJkaXIvZmlsZSddLCBsaW5lX2VuZGluZ3M9J2JpbmFyeScpCi0gICAgICAgIHNlbGYu
d3QuYWRkKFsnc3ViZGlyJywgJ3N1YmRpci9maWxlJ10sCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBbJ2RpcmlkJywgJ2ZpbGVpZCddKQotICAgICAgICBpZiBoYXNfc3lt
bGlua3MoKToKLSAgICAgICAgICAgIHBhc3MKLSAgICAgICAgc2VsZi53dC5jb21taXQoJ21lc3Nh
Z2VfMScsIHJldl9pZCA9ICcxJykKLSAgICAgICAgc2VsZi50cmVlXzEgPSBzZWxmLmJyYW5jaC5y
ZXBvc2l0b3J5LnJldmlzaW9uX3RyZWUoJzEnKQotICAgICAgICBzZWxmLmludl8xID0gc2VsZi5i
cmFuY2gucmVwb3NpdG9yeS5nZXRfaW52ZW50b3J5KCcxJykKLSAgICAgICAgc2VsZi5maWxlXzEg
PSBzZWxmLmludl8xWydmaWxlaWQnXQotICAgICAgICBzZWxmLnd0LmxvY2tfd3JpdGUoKQotICAg
ICAgICBzZWxmLmFkZENsZWFudXAoc2VsZi53dC51bmxvY2spCi0gICAgICAgIHNlbGYuZmlsZV9h
Y3RpdmUgPSBzZWxmLnd0LmludmVudG9yeVsnZmlsZWlkJ10KLSAgICAgICAgc2VsZi5idWlsZGVy
ID0gc2VsZi5icmFuY2guZ2V0X2NvbW1pdF9idWlsZGVyKFtdLCB0aW1lc3RhbXA9dGltZS50aW1l
KCksIHJldmlzaW9uX2lkPScyJykKLQotICAgIGRlZiB0ZXN0X3NuYXBzaG90X25ld19yZXZpc2lv
bihzZWxmKToKLSAgICAgICAgIyBUaGlzIHRlc3RzIHRoYXQgYSBzaW1wbGUgY29tbWl0IHdpdGgg
bm8gcGFyZW50cyBtYWtlcyBhIG5ldwotICAgICAgICAjIHJldmlzaW9uIHZhbHVlIGluIHRoZSBp
bnZlbnRvcnkgZW50cnkKLSAgICAgICAgc2VsZi5maWxlX2FjdGl2ZS5zbmFwc2hvdCgnMicsICdz
dWJkaXIvZmlsZScsIHt9LCBzZWxmLnd0LCBzZWxmLmJ1aWxkZXIpCi0gICAgICAgICMgZXhwZWN0
ZWQgb3V0Y29tZSAtIGZpbGVfMSBoYXMgYSByZXZpc2lvbiBpZCBvZiAnMicsIGFuZCB3ZSBjYW4g
Z2V0Ci0gICAgICAgICMgaXRzIHRleHQgb2YgJ2ZpbGUgY29udGVudHMnIG91dCBvZiB0aGUgd2Vh
dmUuCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5maWxlXzEucmV2aXNpb24sICcxJykK
LSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZpbGVfYWN0aXZlLnJldmlzaW9uLCAnMicp
Ci0gICAgICAgICMgdGhpcyBzaG91bGQgYmUgYSBzZXBhcmF0ZSB0ZXN0IHByb2JhYmx5LCBidXQg
bGV0cyBjaGVjayBpdCBvbmNlLi4KLSAgICAgICAgbGluZXMgPSBzZWxmLmJyYW5jaC5yZXBvc2l0
b3J5LndlYXZlX3N0b3JlLmdldF93ZWF2ZSgKLSAgICAgICAgICAgICdmaWxlaWQnLCAKLSAgICAg
ICAgICAgIHNlbGYuYnJhbmNoLmdldF90cmFuc2FjdGlvbigpKS5nZXRfbGluZXMoJzInKQotICAg
ICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmVzLCBbJ2NvbnRlbnRzIG9mIHN1YmRpci9maWxlXG4n
XSkKLQotICAgIGRlZiB0ZXN0X3NuYXBzaG90X3VuY2hhbmdlZChzZWxmKToKLSAgICAgICAgI1Ro
aXMgdGVzdHMgdGhhdCBhIHNpbXBsZSBjb21taXQgZG9lcyBub3QgbWFrZSBhIG5ldyBlbnRyeSBm
b3IKLSAgICAgICAgIyBhbiB1bmNoYW5nZWQgaW52ZW50b3J5IGVudHJ5Ci0gICAgICAgIHNlbGYu
ZmlsZV9hY3RpdmUuc25hcHNob3QoJzInLCAnc3ViZGlyL2ZpbGUnLCB7JzEnOnNlbGYuZmlsZV8x
fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnd0LCBzZWxmLmJ1aWxk
ZXIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5maWxlXzEucmV2aXNpb24sICcxJykK
LSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZpbGVfYWN0aXZlLnJldmlzaW9uLCAnMScp
Ci0gICAgICAgIHZmID0gc2VsZi5icmFuY2gucmVwb3NpdG9yeS53ZWF2ZV9zdG9yZS5nZXRfd2Vh
dmUoCi0gICAgICAgICAgICAnZmlsZWlkJywgCi0gICAgICAgICAgICBzZWxmLmJyYW5jaC5yZXBv
c2l0b3J5LmdldF90cmFuc2FjdGlvbigpKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhlcnJv
cnMuUmV2aXNpb25Ob3RQcmVzZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICB2Zi5nZXRf
bGluZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICcyJykKLQotICAgIGRlZiB0ZXN0X3Nu
YXBzaG90X21lcmdlX2lkZW50aWNhbF9kaWZmZXJlbnRfcmV2aWQoc2VsZik6Ci0gICAgICAgICMg
VGhpcyB0ZXN0cyB0aGF0IGEgY29tbWl0IHdpdGggdHdvIGlkZW50aWNhbCBwYXJlbnRzLCBvbmUg
b2Ygd2hpY2ggaGFzCi0gICAgICAgICMgYSBkaWZmZXJlbnQgcmV2aXNpb24gaWQsIHJlc3VsdHMg
aW4gYSBuZXcgcmV2aXNpb24gaWQgaW4gdGhlIGVudHJ5LgotICAgICAgICAjIDEtPm90aGVyLCBj
b21taXQgYSBtZXJnZSBvZiBvdGhlciBhZ2FpbnN0IDEsIHJlc3VsdHMgaW4gMi4KLSAgICAgICAg
b3RoZXJfaWUgPSBpbnZlbnRvcnkuSW52ZW50b3J5RmlsZSgnZmlsZWlkJywgJ25ld25hbWUnLCBz
ZWxmLmZpbGVfMS5wYXJlbnRfaWQpCi0gICAgICAgIG90aGVyX2llID0gaW52ZW50b3J5LkludmVu
dG9yeUZpbGUoJ2ZpbGVpZCcsICdmaWxlJywgc2VsZi5maWxlXzEucGFyZW50X2lkKQotICAgICAg
ICBvdGhlcl9pZS5yZXZpc2lvbiA9ICcxJwotICAgICAgICBvdGhlcl9pZS50ZXh0X3NoYTEgPSBz
ZWxmLmZpbGVfMS50ZXh0X3NoYTEKLSAgICAgICAgb3RoZXJfaWUudGV4dF9zaXplID0gc2VsZi5m
aWxlXzEudGV4dF9zaXplCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5maWxlXzEsIG90
aGVyX2llKQotICAgICAgICBvdGhlcl9pZS5yZXZpc2lvbiA9ICdvdGhlcicKLSAgICAgICAgc2Vs
Zi5hc3NlcnROb3RFcXVhbChzZWxmLmZpbGVfMSwgb3RoZXJfaWUpCi0gICAgICAgIHZlcnNpb25m
aWxlID0gc2VsZi5icmFuY2gucmVwb3NpdG9yeS53ZWF2ZV9zdG9yZS5nZXRfd2VhdmUoCi0gICAg
ICAgICAgICAnZmlsZWlkJywgc2VsZi5icmFuY2gucmVwb3NpdG9yeS5nZXRfdHJhbnNhY3Rpb24o
KSkKLSAgICAgICAgdmVyc2lvbmZpbGUuY2xvbmVfdGV4dCgnb3RoZXInLCAnMScsIFsnMSddKQot
ICAgICAgICBzZWxmLmZpbGVfYWN0aXZlLnNuYXBzaG90KCcyJywgJ3N1YmRpci9maWxlJywgCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeycxJzpzZWxmLmZpbGVfMSwgJ290aGVy
JzpvdGhlcl9pZX0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53dCwg
c2VsZi5idWlsZGVyKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZmlsZV9hY3RpdmUu
cmV2aXNpb24sICcyJykKLQotICAgIGRlZiB0ZXN0X3NuYXBzaG90X2NoYW5nZWQoc2VsZik6Ci0g
ICAgICAgICMgVGhpcyB0ZXN0cyB0aGF0IGEgY29tbWl0IHdpdGggb25lIGRpZmZlcmVudCBwYXJl
bnQgcmVzdWx0cyBpbiBhIG5ldwotICAgICAgICAjIHJldmlzaW9uIGlkIGluIHRoZSBlbnRyeS4K
LSAgICAgICAgc2VsZi53dC5yZW5hbWVfb25lKCdzdWJkaXIvZmlsZScsICdzdWJkaXIvbmV3bmFt
ZScpCi0gICAgICAgIHNlbGYuZmlsZV9hY3RpdmUgPSBzZWxmLnd0LmludmVudG9yeVsnZmlsZWlk
J10KLSAgICAgICAgc2VsZi5maWxlX2FjdGl2ZS5zbmFwc2hvdCgnMicsICdzdWJkaXIvbmV3bmFt
ZScsIHsnMSc6c2VsZi5maWxlXzF9LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBzZWxmLnd0LCBzZWxmLmJ1aWxkZXIpCi0gICAgICAgICMgZXhwZWN0ZWQgb3V0Y29tZSAtIGZp
bGVfMSBoYXMgYSByZXZpc2lvbiBpZCBvZiAnMicKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChz
ZWxmLmZpbGVfYWN0aXZlLnJldmlzaW9uLCAnMicpCi0KLQotY2xhc3MgVGVzdFByZXZpb3VzSGVh
ZHMoVGVzdENhc2VXaXRoVHJhbnNwb3J0KToKLQotICAgIGRlZiBzZXRVcChzZWxmKToKLSAgICAg
ICAgIyB3ZSB3YW50IHNldmVyYWwgaW52ZW50b3JpZXMsIHRoYXQgcmVzcGVjdGl2ZWx5Ci0gICAg
ICAgICMgZ2l2ZSB1c2UgdGhlIGZvbGxvd2luZyBzY2VuYXJpb3M6Ci0gICAgICAgICMgQSkgZmls
ZWlkIG5vdCBpbiBhbnkgaW52ZW50b3J5IChBKSwKLSAgICAgICAgIyBCKSBmaWxlaWQgcHJlc2Vu
dCBpbiBvbmUgaW52ZW50b3J5IChCKSBhbmQgKEEsQikKLSAgICAgICAgIyBDKSBmaWxlaWQgcHJl
c2VudCBpbiB0d28gaW52ZW50b3JpZXMsIGFuZCB0aGV5Ci0gICAgICAgICMgICBhcmUgbm90IG11
dHVhbCBkZXNjZW5kZW50cyAoQiwgQykKLSAgICAgICAgIyBEKSBmaWxlaWQgcHJlc2VudCBpbiB0
d28gaW52ZW50b3JpZXMgYW5kIG9uZSBpcwotICAgICAgICAjICAgYSBkZXNjZW5kZW50IG9mIHRo
ZSBvdGhlci4gKEIsIEQpCi0gICAgICAgIHN1cGVyKFRlc3RQcmV2aW91c0hlYWRzLCBzZWxmKS5z
ZXRVcCgpCi0gICAgICAgIHNlbGYud3QgPSBzZWxmLm1ha2VfYnJhbmNoX2FuZF90cmVlKCcuJykK
LSAgICAgICAgc2VsZi5icmFuY2ggPSBzZWxmLnd0LmJyYW5jaAotICAgICAgICBzZWxmLmJ1aWxk
X3RyZWUoWydmaWxlJ10pCi0gICAgICAgIHNlbGYud3QuY29tbWl0KCduZXcgYnJhbmNoJywgYWxs
b3dfcG9pbnRsZXNzPVRydWUsIHJldl9pZD0nQScpCi0gICAgICAgIHNlbGYuaW52X0EgPSBzZWxm
LmJyYW5jaC5yZXBvc2l0b3J5LmdldF9pbnZlbnRvcnkoJ0EnKQotICAgICAgICBzZWxmLnd0LmFk
ZChbJ2ZpbGUnXSwgWydmaWxlaWQnXSkKLSAgICAgICAgc2VsZi53dC5jb21taXQoJ2FkZCBmaWxl
JywgcmV2X2lkPSdCJykKLSAgICAgICAgc2VsZi5pbnZfQiA9IHNlbGYuYnJhbmNoLnJlcG9zaXRv
cnkuZ2V0X2ludmVudG9yeSgnQicpCi0gICAgICAgIHVuY29tbWl0KHNlbGYuYnJhbmNoLCB0cmVl
PXNlbGYud3QpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5icmFuY2gucmV2aXNpb25f
aGlzdG9yeSgpLCBbJ0EnXSkKLSAgICAgICAgc2VsZi53dC5jb21taXQoJ2Fub3RoZXIgYWRkIG9m
IGZpbGUnLCByZXZfaWQ9J0MnKQotICAgICAgICBzZWxmLmludl9DID0gc2VsZi5icmFuY2gucmVw
b3NpdG9yeS5nZXRfaW52ZW50b3J5KCdDJykKLSAgICAgICAgc2VsZi53dC5hZGRfcGFyZW50X3Ry
ZWVfaWQoJ0InKQotICAgICAgICBzZWxmLnd0LmNvbW1pdCgnbWVyZ2UgaW4gQicsIHJldl9pZD0n
RCcpCi0gICAgICAgIHNlbGYuaW52X0QgPSBzZWxmLmJyYW5jaC5yZXBvc2l0b3J5LmdldF9pbnZl
bnRvcnkoJ0QnKQotICAgICAgICBzZWxmLnd0LmxvY2tfcmVhZCgpCi0gICAgICAgIHNlbGYuYWRk
Q2xlYW51cChzZWxmLnd0LnVubG9jaykKLSAgICAgICAgc2VsZi5maWxlX2FjdGl2ZSA9IHNlbGYu
d3QuaW52ZW50b3J5WydmaWxlaWQnXQotICAgICAgICBzZWxmLndlYXZlID0gc2VsZi5icmFuY2gu
cmVwb3NpdG9yeS53ZWF2ZV9zdG9yZS5nZXRfd2VhdmUoJ2ZpbGVpZCcsCi0gICAgICAgICAgICBz
ZWxmLmJyYW5jaC5yZXBvc2l0b3J5LmdldF90cmFuc2FjdGlvbigpKQotICAgICAgICAKLSAgICBk
ZWYgZ2V0X3ByZXZpb3VzX2hlYWRzKHNlbGYsIGludmVudG9yaWVzKToKLSAgICAgICAgcmV0dXJu
IHNlbGYuZmlsZV9hY3RpdmUuZmluZF9wcmV2aW91c19oZWFkcygKLSAgICAgICAgICAgIGludmVu
dG9yaWVzLCAKLSAgICAgICAgICAgIHNlbGYuYnJhbmNoLnJlcG9zaXRvcnkud2VhdmVfc3RvcmUs
Ci0gICAgICAgICAgICBzZWxmLmJyYW5jaC5yZXBvc2l0b3J5LmdldF90cmFuc2FjdGlvbigpKQot
ICAgICAgICAKLSAgICBkZWYgdGVzdF9maWxlaWRfaW5fbm9faW52ZW50b3J5KHNlbGYpOgotICAg
ICAgICBzZWxmLmFzc2VydEVxdWFsKHt9LCBzZWxmLmdldF9wcmV2aW91c19oZWFkcyhbc2VsZi5p
bnZfQV0pKQotCi0gICAgZGVmIHRlc3RfZmlsZWlkX2luX29uZV9pbnZlbnRvcnkoc2VsZik6Ci0g
ICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeydCJzpzZWxmLmludl9CWydmaWxlaWQnXX0sCi0gICAg
ICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRfcHJldmlvdXNfaGVhZHMoW3NlbGYuaW52X0Jd
KSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh7J0InOnNlbGYuaW52X0JbJ2ZpbGVpZCddfSwK
LSAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdldF9wcmV2aW91c19oZWFkcyhbc2VsZi5p
bnZfQSwgc2VsZi5pbnZfQl0pKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHsnQic6c2VsZi5p
bnZfQlsnZmlsZWlkJ119LAotICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0X3ByZXZp
b3VzX2hlYWRzKFtzZWxmLmludl9CLCBzZWxmLmludl9BXSkpCi0KLSAgICBkZWYgdGVzdF9maWxl
aWRfaW5fdHdvX2ludmVudG9yaWVzX2dpdmVzX2JvdGhfZW50cmllcyhzZWxmKToKLSAgICAgICAg
c2VsZi5hc3NlcnRFcXVhbCh7J0InOnNlbGYuaW52X0JbJ2ZpbGVpZCddLAotICAgICAgICAgICAg
ICAgICAgICAgICAgICAnQyc6c2VsZi5pbnZfQ1snZmlsZWlkJ119LAotICAgICAgICAgICAgICAg
ICAgICAgICAgICBzZWxmLmdldF9wcmV2aW91c19oZWFkcyhbc2VsZi5pbnZfQiwgc2VsZi5pbnZf
Q10pKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHsnQic6c2VsZi5pbnZfQlsnZmlsZWlkJ10s
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICdDJzpzZWxmLmludl9DWydmaWxlaWQnXX0sCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0X3ByZXZpb3VzX2hlYWRzKFtzZWxmLmlu
dl9DLCBzZWxmLmludl9CXSkpCi0KLSAgICBkZWYgdGVzdF9maWxlaWRfaW5fdHdvX2ludmVudG9y
aWVzX2FscmVhZHlfbWVyZ2VkX2dpdmVzX2hlYWQoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0
RXF1YWwoeydEJzpzZWxmLmludl9EWydmaWxlaWQnXX0sCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgc2VsZi5nZXRfcHJldmlvdXNfaGVhZHMoW3NlbGYuaW52X0IsIHNlbGYuaW52X0RdKSkKLSAg
ICAgICAgc2VsZi5hc3NlcnRFcXVhbCh7J0QnOnNlbGYuaW52X0RbJ2ZpbGVpZCddfSwKLSAgICAg
ICAgICAgICAgICAgICAgICAgICBzZWxmLmdldF9wcmV2aW91c19oZWFkcyhbc2VsZi5pbnZfRCwg
c2VsZi5pbnZfQl0pKQotCi0gICAgIyBUT0RPOiB0ZXN0IHR3byBpbnZlbnRvcmllcyB3aXRoIHRo
ZSBzYW1lIGZpbGUgcmV2aXNpb24gCi0KLQogY2xhc3MgVGVzdERlc2NyaWJlQ2hhbmdlcyhUZXN0
Q2FzZSk6CiAKICAgICBkZWYgdGVzdF9kZXNjcmliZV9jaGFuZ2Uoc2VsZik6CkBAIC02MDQsMjIg
KzMzMiw2IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfY2hhbmdlLCBjaGFu
Z2UpCiAKIAotY2xhc3MgVGVzdFJldmVydChUZXN0Q2FzZVdpdGhUcmFuc3BvcnQpOgotCi0gICAg
ZGVmIHRlc3RfZGFuZ2xpbmdfaWQoc2VsZik6Ci0gICAgICAgIHd0ID0gc2VsZi5tYWtlX2JyYW5j
aF9hbmRfdHJlZSgnYjEnKQotICAgICAgICB3dC5sb2NrX3RyZWVfd3JpdGUoKQotICAgICAgICBz
ZWxmLmFkZENsZWFudXAod3QudW5sb2NrKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3
dC5pbnZlbnRvcnkpLCAxKQotICAgICAgICBvcGVuKCdiMS9hJywgJ3diJykud3JpdGUoJ2EgdGVz
dFxuJykKLSAgICAgICAgd3QuYWRkKCdhJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4o
d3QuaW52ZW50b3J5KSwgMikKLSAgICAgICAgd3QuZmx1c2goKSAjIHdvcmthcm91bmQgcmV2ZXJ0
IGRvaW5nIHd0Ll93cml0ZV9pbnZlbnRvcnkgZm9yIG5vdy4KLSAgICAgICAgb3MudW5saW5rKCdi
MS9hJykKLSAgICAgICAgd3QucmV2ZXJ0KFtdKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxl
bih3dC5pbnZlbnRvcnkpLCAxKQotCi0KIGNsYXNzIFRlc3RJc1Jvb3QoVGVzdENhc2UpOgogICAg
ICIiIkVuc3VyZSBvdXIgcm9vdC1jaGVja2luZyBjb2RlIGlzIGFjY3VyYXRlLiIiIgogCgo=

=== modified file bzrlib/tests/workingtree_implementations/__init__.py // encod
... ing:base64
LS0tIGJ6cmxpYi90ZXN0cy93b3JraW5ndHJlZV9pbXBsZW1lbnRhdGlvbnMvX19pbml0X18ucHkK
KysrIGJ6cmxpYi90ZXN0cy93b3JraW5ndHJlZV9pbXBsZW1lbnRhdGlvbnMvX19pbml0X18ucHkK
QEAgLTU5LDYgKzU5LDcgQEAKICAgICAgICAgJ2J6cmxpYi50ZXN0cy53b3JraW5ndHJlZV9pbXBs
ZW1lbnRhdGlvbnMudGVzdF9leGVjdXRhYmxlJywKICAgICAgICAgJ2J6cmxpYi50ZXN0cy53b3Jr
aW5ndHJlZV9pbXBsZW1lbnRhdGlvbnMudGVzdF9mbHVzaCcsCiAgICAgICAgICdienJsaWIudGVz
dHMud29ya2luZ3RyZWVfaW1wbGVtZW50YXRpb25zLnRlc3RfZ2V0X3BhcmVudF9pZHMnLAorICAg
ICAgICAnYnpybGliLnRlc3RzLndvcmtpbmd0cmVlX2ltcGxlbWVudGF0aW9ucy50ZXN0X2ludics
CiAgICAgICAgICdienJsaWIudGVzdHMud29ya2luZ3RyZWVfaW1wbGVtZW50YXRpb25zLnRlc3Rf
aXNfY29udHJvbF9maWxlbmFtZScsCiAgICAgICAgICdienJsaWIudGVzdHMud29ya2luZ3RyZWVf
aW1wbGVtZW50YXRpb25zLnRlc3RfaXNfaWdub3JlZCcsCiAgICAgICAgICdienJsaWIudGVzdHMu
d29ya2luZ3RyZWVfaW1wbGVtZW50YXRpb25zLnRlc3RfbG9ja2luZycsCgo=

=== modified directory  // last-changed:marienz at gentoo.org-20070311230549-rn7jh
... 354jrzq6m1e
# revision id: marienz at gentoo.org-20070311230549-rn7jh354jrzq6m1e
# sha1: 6fa7c40720121639e9cb1631a9e580ed511ab806
# inventory sha1: 94e25d6f8979cac647342e1a2f2d7da89093894c
# parent ids:
#   marienz at gentoo.org-20070311221559-mvb05lew4yyogh5y
# properties:
#   branch-nick: bzr-dirstate-symlinks

# message:
#   Fix committing merges in a dirstate tree with a symlink.
# committer: Marien Zwart <marienz at gentoo.org>
# date: Sun 2007-03-11 23:15:59.312999964 +0100

=== modified file bzrlib/tests/test_commit_merge.py // encoding:base64
LS0tIGJ6cmxpYi90ZXN0cy90ZXN0X2NvbW1pdF9tZXJnZS5weQorKysgYnpybGliL3Rlc3RzL3Rl
c3RfY29tbWl0X21lcmdlLnB5CkBAIC0yMiw2ICsyMiw3IEBACiBmcm9tIGJ6cmxpYi5icmFuY2gg
aW1wb3J0IEJyYW5jaAogZnJvbSBienJsaWIuZXJyb3JzIGltcG9ydCBQb2ludGxlc3NDb21taXQs
IEJ6ckVycm9yCiBmcm9tIGJ6cmxpYi50ZXN0cy50ZXN0X3JldmlzaW9uIGltcG9ydCBtYWtlX2Jy
YW5jaGVzCitmcm9tIGJ6cmxpYiBpbXBvcnQgb3N1dGlscwogCiAKIGNsYXNzIFRlc3RDb21taXRN
ZXJnZShUZXN0Q2FzZVdpdGhUcmFuc3BvcnQpOgpAQCAtOTYsMyArOTcsMjAgQEAKICAgICAgICAg
YnkuY2hlY2soKQogICAgICAgICBieC5yZXBvc2l0b3J5LmNoZWNrKFtieC5sYXN0X3JldmlzaW9u
KCldKQogICAgICAgICBieS5yZXBvc2l0b3J5LmNoZWNrKFtieS5sYXN0X3JldmlzaW9uKCldKQor
CisgICAgZGVmIHRlc3RfbWVyZ2Vfd2l0aF9zeW1saW5rKHNlbGYpOgorICAgICAgICBpZiBub3Qg
b3N1dGlscy5oYXNfc3ltbGlua3MoKToKKyAgICAgICAgICAgIHJhaXNlIFRlc3RTa2lwcGVkKCdT
eW1saW5rcyBhcmUgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtJykKKyAgICAgICAgdHJl
ZV9hID0gc2VsZi5tYWtlX2JyYW5jaF9hbmRfdHJlZSgndHJlZV9hJykKKyAgICAgICAgb3Muc3lt
bGluaygndGFyZ2V0Jywgb3N1dGlscy5wYXRoam9pbigndHJlZV9hJywgJ2xpbmsnKSkKKyAgICAg
ICAgdHJlZV9hLmFkZCgnbGluaycpCisgICAgICAgIHRyZWVfYS5jb21taXQoJ2FkZGVkIGxpbmsn
KQorICAgICAgICB0cmVlX2IgPSB0cmVlX2EuYnpyZGlyLnNwcm91dCgndHJlZV9iJykub3Blbl93
b3JraW5ndHJlZSgpCisgICAgICAgIHNlbGYuYnVpbGRfdHJlZShbJ3RyZWVfYS9maWxlJ10pCisg
ICAgICAgIHRyZWVfYS5hZGQoJ2ZpbGUnKQorICAgICAgICB0cmVlX2EuY29tbWl0KCdhZGRlZCBm
aWxlJykKKyAgICAgICAgc2VsZi5idWlsZF90cmVlKFsndHJlZV9iL2Fub3RoZXJfZmlsZSddKQor
ICAgICAgICB0cmVlX2IuYWRkKCdhbm90aGVyX2ZpbGUnKQorICAgICAgICB0cmVlX2IuY29tbWl0
KCdhZGQgYW5vdGhlciBmaWxlJykKKyAgICAgICAgdHJlZV9iLm1lcmdlX2Zyb21fYnJhbmNoKHRy
ZWVfYS5icmFuY2gpCisgICAgICAgIHRyZWVfYi5jb21taXQoJ21lcmdlJykKCg==

=== modified file bzrlib/workingtree_4.py // encoding:base64
LS0tIGJ6cmxpYi93b3JraW5ndHJlZV80LnB5CisrKyBienJsaWIvd29ya2luZ3RyZWVfNC5weQpA
QCAtMTQwMCw3ICsxNDAwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgcGFyZW50X2llc1soZGly
bmFtZSArICcvJyArIG5hbWUpLnN0cmlwKCcvJyldID0gaW52X2VudHJ5CiAgICAgICAgICAgICAg
ICAgZWxpZiBraW5kID09ICdzeW1saW5rJzoKICAgICAgICAgICAgICAgICAgICAgaW52X2VudHJ5
LmV4ZWN1dGFibGUgPSBGYWxzZQotICAgICAgICAgICAgICAgICAgICBpbnZfZW50cnkudGV4dF9z
aXplID0gc2l6ZQorICAgICAgICAgICAgICAgICAgICBpbnZfZW50cnkudGV4dF9zaXplID0gTm9u
ZQogICAgICAgICAgICAgICAgICAgICBpbnZfZW50cnkuc3ltbGlua190YXJnZXQgPSB1dGY4X2Rl
Y29kZShmaW5nZXJwcmludClbMF0KICAgICAgICAgICAgICAgICBlbGlmIGtpbmQgPT0gJ3RyZWUt
cmVmZXJlbmNlJzoKICAgICAgICAgICAgICAgICAgICAgaW52X2VudHJ5LnJlZmVyZW5jZV9yZXZp
c2lvbiA9IGZpbmdlcnByaW50IG9yIE5vbmUKCg==

=== modified directory  // last-changed:marienz at gentoo.org-20070311221559-mvb05
... lew4yyogh5y
# revision id: marienz at gentoo.org-20070311221559-mvb05lew4yyogh5y
# sha1: 3fa9d4a5b6328f980ed62f2e167da6dc89268da8
# inventory sha1: 7efbe3162a308de2dedcf7f8ea167d921ee676b2
# parent ids:
#   pqm at pqm.ubuntu.com-20070311211206-0fd0176ac1e77ef7
# properties:
#   branch-nick: bzr-dirstate-symlinks

-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
Url : https://lists.ubuntu.com/archives/bazaar/attachments/20070312/df0ab2e9/attachment-0001.pgp 


More information about the bazaar mailing list