<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>210876</bug_id>
          
          <creation_ts>2020-04-22 14:51:30 -0700</creation_ts>
          <short_desc>Web Inspector: Storage: cannot select multiple local storage entries</short_desc>
          <delta_ts>2020-04-23 18:06:18 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Web Inspector</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          <see_also>https://bugs.webkit.org/show_bug.cgi?id=209867</see_also>
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Jon Lee">jonlee</reporter>
          <assigned_to name="Devin Rousso">hi</assigned_to>
          <cc>bburg</cc>
    
    <cc>darin</cc>
    
    <cc>hi</cc>
    
    <cc>inspector-bugzilla-changes</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1644508</commentid>
    <comment_count>0</comment_count>
    <who name="Jon Lee">jonlee</who>
    <bug_when>2020-04-22 14:51:30 -0700</bug_when>
    <thetext>Split off from bug 209867.

I&apos;d like to be able to delete multiple key/values pairs in local storage in WI.

This bug tracks the following requests:
- Allow selection of multiple rows
- Command-A to select all rows

Devin says:
&gt; These both should be solved if we switch from `WI.DataGrid` to `WI.Table`.  We&apos;d need to either add logic to `WI.Table` to support editing by default, or add custom logic to `WI.DOMStorageContentView` for editing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1644612</commentid>
    <comment_count>1</comment_count>
      <attachid>397299</attachid>
    <who name="Devin Rousso">hi</who>
    <bug_when>2020-04-22 18:22:26 -0700</bug_when>
    <thetext>Created attachment 397299
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1644640</commentid>
    <comment_count>2</comment_count>
      <attachid>397299</attachid>
    <who name="Devin Rousso">hi</who>
    <bug_when>2020-04-22 20:03:14 -0700</bug_when>
    <thetext>Comment on attachment 397299
Patch

&gt;diff --git a/Source/WebInspectorUI/ChangeLog b/Source/WebInspectorUI/ChangeLog
&gt;index 773117f5462c7f2a5074eea64fa1687b0c0a143e..9f69ab78771905448fb61a6b79643b30c7c332a8 100644
&gt;--- a/Source/WebInspectorUI/ChangeLog
&gt;+++ b/Source/WebInspectorUI/ChangeLog
&gt;@@ -1,3 +1,82 @@
&gt;+2020-04-22  Devin Rousso  &lt;drousso@apple.com&gt;
&gt;+
&gt;+        Web Inspector: Storage: cannot select multiple local storage entries
&gt;+        https://bugs.webkit.org/show_bug.cgi?id=210876
&gt;+
&gt;+        Reviewed by NOBODY (OOPS!).
&gt;+
&gt;+        Support multiple selection using `WI.DataGrid`.
&gt;+
&gt;+        * UserInterface/Views/DataGrid.js:
&gt;+        (WI.DataGrid):
&gt;+        (WI.DataGrid.prototype.get allowsMultipleSelection): Added.
&gt;+        (WI.DataGrid.prototype.set allowsMultipleSelection): Added.
&gt;+        (WI.DataGrid.prototype.get selectedNode):
&gt;+        (WI.DataGrid.prototype.set selectedNode):
&gt;+        (WI.DataGrid.prototype.get selectedDataGridNodes): Added.
&gt;+        (WI.DataGrid.prototype._keyDown):
&gt;+        (WI.DataGrid.prototype.selectNodes):
&gt;+        (WI.DataGrid.prototype._mouseDownInDataTable):
&gt;+        (WI.DataGrid.prototype._contextMenuInDataTable):
&gt;+        (WI.DataGrid.prototype.handleCopyEvent):
&gt;+        (WI.DataGrid.prototype._copyRow):
&gt;+        (WI.DataGrid.prototype._copyTable):
&gt;+        (WI.DataGrid.prototype._hasCopyableData):
&gt;+        (WI.DataGrid.prototype.selectDataGridNodeInternal): Added.
&gt;+        (WI.DataGrid.prototype.deselectDataGridNodeInternal): Added.
&gt;+        (WI.DataGrid.prototype._dispatchSelectedNodeChangedEvent): Added.
&gt;+        (WI.DataGrid.prototype.dataGridNodeForSelectionItem): Added.
&gt;+        (WI.DataGrid.prototype.selectionItemForDataGridNode): Added.
&gt;+        (WI.DataGrid.prototype.selectionControllerSelectionDidChange): Added.
&gt;+        (WI.DataGrid.prototype.selectionControllerFirstSelectableItem): Added.
&gt;+        (WI.DataGrid.prototype.selectionControllerLastSelectableItem): Added.
&gt;+        (WI.DataGrid.prototype.selectionControllerPreviousSelectableItem): Added.
&gt;+        (WI.DataGrid.prototype.selectionControllerNextSelectableItem): Added.
&gt;+        * UserInterface/Views/DataGridNode.js:
&gt;+        (WI.DataGridNode.prototype.select):
&gt;+        (WI.DataGridNode.prototype.deselect):
&gt;+        Replace `selectedNode` with a `WI.SelectionController` that behaves like a `WI.TreeOutline`.
&gt;+        Use the `WI.SelectionController.Reason` to ensure that `WI.PlaceholderDataGridNode` are not
&gt;+        selected when selecting all nodes. Ensure that `WI.PlaceholderDataGridNode` are not copied.
&gt;+        Prefer to use `_rows` instead of `children` as the latter is not sorted/filtered.
&gt;+
&gt;+        * UserInterface/Controllers/SelectionController.js:
&gt;+        (WI.SelectionController.createTreeComparator): Added.
&gt;+        (WI.SelectionController.createListComparator): Added.
&gt;+        Create `static` helper functions for common comparators.
&gt;+
&gt;+        (WI.SelectionController.prototype.deselectItem):
&gt;+        (WI.SelectionController.prototype.selectAll):
&gt;+        (WI.SelectionController.prototype.removeSelectedItems):
&gt;+        (WI.SelectionController.prototype.handleItemMouseDown):
&gt;+        (WI.SelectionController.prototype._selectItemsFromArrowKey):
&gt;+        (WI.SelectionController.prototype._firstSelectableItem):
&gt;+        (WI.SelectionController.prototype._lastSelectableItem):
&gt;+        (WI.SelectionController.prototype._previousSelectableItem):
&gt;+        (WI.SelectionController.prototype._nextSelectableItem):
&gt;+        (WI.SelectionController.prototype._addRange):
&gt;+        (WI.SelectionController.prototype._deleteRange):
&gt;+        Introduce a `WI.SelectionController.Reason` which is used to tell the `_delegate` about why
&gt;+        it&apos;s being asked for information.
&gt;+
&gt;+        * UserInterface/Views/DOMStorageContentView.js:
&gt;+        (WI.DOMStorageContentView):
&gt;+        (WI.DOMStorageContentView.prototype._deleteCallback):
&gt;+        Support multiple selection, including deleting multiple rows at once.
&gt;+
&gt;+        * UserInterface/Views/Table.js:
&gt;+        (WI.Table):
&gt;+        * UserInterface/Views/TreeOutline.js:
&gt;+        (WI.TreeOutline):
&gt;+        (WI.TreeOutline.prototype.selectionControllerNumberOfItems): Deleted.
&gt;+        Removed unused `selectionControllerNumberOfItems`.
&gt;+
&gt;+        * UserInterface/Views/ProfileView.js:
&gt;+        (WI.ProfileView):
&gt;+        (WI.ProfileView.prototype._dataGridNodeSelected):
&gt;+        Maintain a `_selectedDataGridNode` so that `oldSelectedNode` doesn&apos;t have to be included
&gt;+        when dispatching `WI.DataGrid.Event.SelectedNodeChanged`.
&gt;+
&gt; 2020-04-22  Devin Rousso  &lt;drousso@apple.com&gt;
&gt; 
&gt;         Web Inspector: Storage: unable to filter cookies
&gt;diff --git a/Source/WebInspectorUI/UserInterface/Controllers/SelectionController.js b/Source/WebInspectorUI/UserInterface/Controllers/SelectionController.js
&gt;index dbb0ae7081e4ac4f386a1e6ef351d9181c022cff..9409204956f2dd250e1c59ab9085868fdc5b5131 100644
&gt;--- a/Source/WebInspectorUI/UserInterface/Controllers/SelectionController.js
&gt;+++ b/Source/WebInspectorUI/UserInterface/Controllers/SelectionController.js
&gt;@@ -48,6 +48,66 @@ WI.SelectionController = class SelectionController extends WI.Object
&gt;         console.assert(this._delegate.selectionControllerPreviousSelectableItem, &quot;SelectionController delegate must implement selectionControllerPreviousSelectableItem.&quot;);
&gt;     }
&gt; 
&gt;+    // Static
&gt;+
&gt;+    static createTreeComparator(itemForRepresentedObject)
&gt;+    {
&gt;+        return (a, b) =&gt; {
&gt;+            // Translate represented objects to TreeElements, which have the
&gt;+            // hierarchical information needed to perform the comparison.
&gt;+            a = itemForRepresentedObject(a);
&gt;+            b = itemForRepresentedObject(b);
&gt;+            if (!a || !b)
&gt;+                return 0;
&gt;+
&gt;+            let getLevel = (item) =&gt; {
&gt;+                let level = 0;
&gt;+                while (item = item.parent)
&gt;+                    level++;
&gt;+                return level;
&gt;+            };
&gt;+
&gt;+            let compareSiblings = (s, t) =&gt; {
&gt;+                return s.parent.children.indexOf(s) - s.parent.children.indexOf(t);
&gt;+            };
&gt;+
&gt;+            if (a.parent === b.parent)
&gt;+                return compareSiblings(a, b);
&gt;+
&gt;+            let aLevel = getLevel(a);
&gt;+            let bLevel = getLevel(b);
&gt;+            while (aLevel &gt; bLevel) {
&gt;+                if (a.parent === b)
&gt;+                    return 1;
&gt;+                a = a.parent;
&gt;+                aLevel--;
&gt;+            }
&gt;+            while (bLevel &gt; aLevel) {
&gt;+                if (b.parent === a)
&gt;+                    return -1;
&gt;+                b = b.parent;
&gt;+                bLevel--;
&gt;+            }
&gt;+
&gt;+            while (a.parent !== b.parent) {
&gt;+                a = a.parent;
&gt;+                b = b.parent;
&gt;+            }
&gt;+
&gt;+            console.assert(a.parent === b.parent, &quot;Missing common ancestor for TreeElements.&quot;, a, b);
&gt;+            return compareSiblings(a, b);
&gt;+        };
&gt;+    }
&gt;+
&gt;+    static createListComparator(indexForRepresentedObject)
&gt;+    {
&gt;+        console.assert(indexForRepresentedObject);
&gt;+
&gt;+        return (a, b) =&gt; {
&gt;+            return indexForRepresentedObject(a) - indexForRepresentedObject(b);
&gt;+        };
&gt;+    }
&gt;+
&gt;     // Public
&gt; 
&gt;     get delegate() { return this._delegate; }
&gt;@@ -129,17 +189,19 @@ WI.SelectionController = class SelectionController extends WI.Object
&gt;             this._lastSelectedItem = null;
&gt; 
&gt;             if (newItems.size) {
&gt;+                const reason = WI.SelectionController.Reason.Extend;
&gt;+
&gt;                 // Find selected item closest to deselected item.
&gt;                 let previous = item;
&gt;                 let next = item;
&gt;                 while (!this._lastSelectedItem &amp;&amp; previous &amp;&amp; next) {
&gt;-                    previous = this._previousSelectableItem(previous);
&gt;+                    previous = this._previousSelectableItem(previous, reason);
&gt;                     if (this.hasSelectedItem(previous)) {
&gt;                         this._lastSelectedItem = previous;
&gt;                         break;
&gt;                     }
&gt; 
&gt;-                    next = this._nextSelectableItem(next);
&gt;+                    next = this._nextSelectableItem(next, reason);
&gt;                     if (this.hasSelectedItem(next)) {
&gt;                         this._lastSelectedItem = next;
&gt;                         break;
&gt;@@ -159,10 +221,10 @@ WI.SelectionController = class SelectionController extends WI.Object
&gt;         if (!this._allowsMultipleSelection)
&gt;             return;
&gt; 
&gt;-        this.reset();
&gt;+        const reason = WI.SelectionController.Reason.All;
&gt; 
&gt;         let newItems = new Set;
&gt;-        this._addRange(newItems, this._firstSelectableItem(), this._lastSelectableItem());
&gt;+        this._addRange(newItems, this._firstSelectableItem(reason), this._lastSelectableItem(reason));
&gt;         this.selectItems(newItems);
&gt;     }
&gt; 
&gt;@@ -176,22 +238,24 @@ WI.SelectionController = class SelectionController extends WI.Object
&gt;         if (!this._selectedItems.size)
&gt;             return;
&gt; 
&gt;+        const reason = WI.SelectionController.Reason.Extend;
&gt;+
&gt;         let orderedSelection = Array.from(this._selectedItems).sort(this._comparator);
&gt; 
&gt;         // Try selecting the item preceding the selection.
&gt;         let firstSelectedItem = orderedSelection[0];
&gt;-        let itemToSelect = this._previousSelectableItem(firstSelectedItem);
&gt;+        let itemToSelect = this._previousSelectableItem(firstSelectedItem, reason);
&gt;         if (!itemToSelect) {
&gt;             // If no item exists before the first item in the selection, try selecting
&gt;             // a deselected item (hole) within the selection.
&gt;             itemToSelect = firstSelectedItem;
&gt;             while (itemToSelect &amp;&amp; this.hasSelectedItem(itemToSelect))
&gt;-                itemToSelect = this._nextSelectableItem(itemToSelect);
&gt;+                itemToSelect = this._nextSelectableItem(itemToSelect, reason);
&gt; 
&gt;             if (!itemToSelect || this.hasSelectedItem(itemToSelect)) {
&gt;                 // If the selection contains no holes, try selecting the item
&gt;                 // following the selection.
&gt;-                itemToSelect = this._nextSelectableItem(orderedSelection.lastValue);
&gt;+                itemToSelect = this._nextSelectableItem(orderedSelection.lastValue, reason);
&gt;             }
&gt;         }
&gt; 
&gt;@@ -265,7 +329,7 @@ WI.SelectionController = class SelectionController extends WI.Object
&gt;         // through the clicked item to be selected.
&gt;         if (!newItems.size) {
&gt;             this._lastSelectedItem = item;
&gt;-            this._shiftAnchorItem = this._firstSelectableItem();
&gt;+            this._shiftAnchorItem = this._firstSelectableItem(WI.SelectionController.Reason.Direct);
&gt; 
&gt;             this._addRange(newItems, this._shiftAnchorItem, this._lastSelectedItem);
&gt;             this._updateSelectedItems(newItems);
&gt;@@ -320,16 +384,18 @@ WI.SelectionController = class SelectionController extends WI.Object
&gt; 
&gt;     _selectItemsFromArrowKey(goingUp, shiftKey)
&gt;     {
&gt;+        let extendSelection = shiftKey &amp;&amp; this._allowsMultipleSelection;
&gt;+        let reason = (extendSelection &amp;&amp; this._selectedItems.size) ? WI.SelectionController.Reason.Extend : WI.SelectionController.Reason.Direct;
&gt;+
&gt;         if (!this._selectedItems.size) {
&gt;-            this.selectItem(goingUp ? this._lastSelectableItem() : this._firstSelectableItem());
&gt;+            this.selectItem(goingUp ? this._lastSelectableItem(reason) : this._firstSelectableItem(reason));
&gt;             return;
&gt;         }
&gt; 
&gt;-        let item = goingUp ? this._previousSelectableItem(this._lastSelectedItem) : this._nextSelectableItem(this._lastSelectedItem);
&gt;+        let item = goingUp ? this._previousSelectableItem(this._lastSelectedItem, reason) : this._nextSelectableItem(this._lastSelectedItem, reason);
&gt;         if (!item)
&gt;             return;
&gt; 
&gt;-        let extendSelection = shiftKey &amp;&amp; this._allowsMultipleSelection;
&gt;         if (!extendSelection || !this.hasSelectedItem(item)) {
&gt;             this.selectItem(item, extendSelection);
&gt;             return;
&gt;@@ -338,7 +404,7 @@ WI.SelectionController = class SelectionController extends WI.Object
&gt;         // Since the item in the direction of movement is selected, we are either
&gt;         // extending the selection into the item, or deselecting. Determine which
&gt;         // by checking whether the item opposite the anchor item is selected.
&gt;-        let priorItem = goingUp ? this._nextSelectableItem(this._lastSelectedItem) : this._previousSelectableItem(this._lastSelectedItem);
&gt;+        let priorItem = goingUp ? this._nextSelectableItem(this._lastSelectedItem, reason) : this._previousSelectableItem(this._lastSelectedItem, reason);
&gt;         if (!priorItem || !this.hasSelectedItem(priorItem)) {
&gt;             this.deselectItem(this._lastSelectedItem);
&gt;             return;
&gt;@@ -354,28 +420,28 @@ WI.SelectionController = class SelectionController extends WI.Object
&gt;             }
&gt; 
&gt;             this._lastSelectedItem = item;
&gt;-            item = goingUp ? this._previousSelectableItem(item) : this._nextSelectableItem(item);
&gt;+            item = goingUp ? this._previousSelectableItem(item, reason) : this._nextSelectableItem(item, reason);
&gt;         }
&gt;     }
&gt; 
&gt;-    _firstSelectableItem()
&gt;+    _firstSelectableItem(reason)
&gt;     {
&gt;-        return this._delegate.selectionControllerFirstSelectableItem(this);
&gt;+        return this._delegate.selectionControllerFirstSelectableItem(this, reason);
&gt;     }
&gt; 
&gt;-    _lastSelectableItem()
&gt;+    _lastSelectableItem(reason)
&gt;     {
&gt;-        return this._delegate.selectionControllerLastSelectableItem(this);
&gt;+        return this._delegate.selectionControllerLastSelectableItem(this, reason);
&gt;     }
&gt; 
&gt;-    _previousSelectableItem(item)
&gt;+    _previousSelectableItem(item, reason)
&gt;     {
&gt;-        return this._delegate.selectionControllerPreviousSelectableItem(this, item);
&gt;+        return this._delegate.selectionControllerPreviousSelectableItem(this, item, reason);
&gt;     }
&gt; 
&gt;-    _nextSelectableItem(item)
&gt;+    _nextSelectableItem(item, reason)
&gt;     {
&gt;-        return this._delegate.selectionControllerNextSelectableItem(this, item);
&gt;+        return this._delegate.selectionControllerNextSelectableItem(this, item, reason);
&gt;     }
&gt; 
&gt;     _updateSelectedItems(items)
&gt;@@ -394,12 +460,14 @@ WI.SelectionController = class SelectionController extends WI.Object
&gt; 
&gt;     _addRange(items, firstItem, lastItem)
&gt;     {
&gt;+        const reason = WI.SelectionController.Reason.Extend;
&gt;+
&gt;         let current = firstItem;
&gt;         while (current) {
&gt;             items.add(current);
&gt;             if (current === lastItem)
&gt;                 break;
&gt;-            current = this._nextSelectableItem(current);
&gt;+            current = this._nextSelectableItem(current, reason);
&gt;         }
&gt; 
&gt;         console.assert(!lastItem || items.has(lastItem), &quot;End of range could not be reached.&quot;);
&gt;@@ -407,14 +475,22 @@ WI.SelectionController = class SelectionController extends WI.Object
&gt; 
&gt;     _deleteRange(items, firstItem, lastItem)
&gt;     {
&gt;+        const reason = WI.SelectionController.Reason.Extend;
&gt;+
&gt;         let current = firstItem;
&gt;         while (current) {
&gt;             items.delete(current);
&gt;             if (current === lastItem)
&gt;                 break;
&gt;-            current = this._nextSelectableItem(current);
&gt;+            current = this._nextSelectableItem(current, reason);
&gt;         }
&gt; 
&gt;         console.assert(!lastItem || !items.has(lastItem), &quot;End of range could not be reached.&quot;);
&gt;     }
&gt; };
&gt;+
&gt;+WI.SelectionController.Reason = {
&gt;+    Direct: Symbol(&quot;selection-reason-direct&quot;),
&gt;+    Extend: Symbol(&quot;selection-reason-extend&quot;),
&gt;+    All: Symbol(&quot;selection-reason-all&quot;),
&gt;+};
&gt;diff --git a/Source/WebInspectorUI/UserInterface/Views/DOMStorageContentView.js b/Source/WebInspectorUI/UserInterface/Views/DOMStorageContentView.js
&gt;index 57599a7db6d2edd5c609e61ddf8bfcdf3a6c41ef..35e4bb4b0e8620ec633b16dab9ef3719e07d1101 100644
&gt;--- a/Source/WebInspectorUI/UserInterface/Views/DOMStorageContentView.js
&gt;+++ b/Source/WebInspectorUI/UserInterface/Views/DOMStorageContentView.js
&gt;@@ -48,6 +48,7 @@ WI.DOMStorageContentView = class DOMStorageContentView extends WI.ContentView
&gt;         });
&gt;         this._dataGrid.sortOrder = WI.DataGrid.SortOrder.Ascending;
&gt;         this._dataGrid.sortColumnIdentifier = &quot;key&quot;;
&gt;+        this._dataGrid.allowsMultipleSelection = true;
&gt;         this._dataGrid.createSettings(&quot;dom-storage-content-view&quot;);
&gt;         this._dataGrid.addEventListener(WI.DataGrid.Event.SortChanged, this._sortDataGrid, this);
&gt;         this.addSubview(this._dataGrid);
&gt;@@ -193,13 +194,14 @@ WI.DOMStorageContentView = class DOMStorageContentView extends WI.ContentView
&gt;         this._dataGrid.sortNodesImmediately(comparator);
&gt;     }
&gt; 
&gt;-    _deleteCallback(node)
&gt;+    _deleteCallback()
&gt;     {
&gt;-        if (!node || node.isPlaceholderNode)
&gt;-            return;
&gt;-
&gt;-        this._dataGrid.removeChild(node);
&gt;-        this.representedObject.removeItem(node.data[&quot;key&quot;]);
&gt;+        for (let dataGridNode of this._dataGrid.selectedDataGridNodes) {
&gt;+            if (dataGridNode.isPlaceholderNode)
&gt;+                continue;
&gt;+            this._dataGrid.removeChild(dataGridNode);
&gt;+            this.representedObject.removeItem(dataGridNode.data[&quot;key&quot;]);
&gt;+        }
&gt;     }
&gt; 
&gt;     _editingCallback(editingNode, columnIdentifier, oldText, newText, moveDirection)
&gt;diff --git a/Source/WebInspectorUI/UserInterface/Views/DataGrid.js b/Source/WebInspectorUI/UserInterface/Views/DataGrid.js
&gt;index bc5ba75fb5412a1549e3253e6c827ce51c87b343..8b126288ab4bcb7a2a106acec82029dab3f8f60b 100644
&gt;--- a/Source/WebInspectorUI/UserInterface/Views/DataGrid.js
&gt;+++ b/Source/WebInspectorUI/UserInterface/Views/DataGrid.js
&gt;@@ -44,7 +44,6 @@ WI.DataGrid = class DataGrid extends WI.View
&gt;         this._rows = [];
&gt; 
&gt;         this.children = [];
&gt;-        this.selectedNode = null;
&gt;         this.expandNodesWhenArrowing = false;
&gt;         this.root = true;
&gt;         this.hasChildren = false;
&gt;@@ -68,6 +67,13 @@ WI.DataGrid = class DataGrid extends WI.View
&gt;         this._filterDelegate = null;
&gt;         this._filterDidModifyNodeWhileProcessingItems = false;
&gt; 
&gt;+        let itemForRepresentedObject = this.dataGridNodeForSelectionItem.bind(this);
&gt;+        let selectionComparator = WI.SelectionController.createTreeComparator(itemForRepresentedObject);
&gt;+        this._selectionController = new WI.SelectionController(this, selectionComparator);
&gt;+
&gt;+        this._processingSelectionChange = false;
&gt;+        this._suppressNextSelectionDidChangeEvent = false;
&gt;+
&gt;         this.element.className = &quot;data-grid&quot;;
&gt;         this.element.tabIndex = 0;
&gt;         this.element.addEventListener(&quot;keydown&quot;, this._keyDown.bind(this), false);
&gt;@@ -318,6 +324,45 @@ WI.DataGrid = class DataGrid extends WI.View
&gt;         this._updateScrollListeners();
&gt;     }
&gt; 
&gt;+    get allowsMultipleSelection()
&gt;+    {
&gt;+        return this._selectionController.allowsMultipleSelection;
&gt;+    }
&gt;+
&gt;+    set allowsMultipleSelection(flag)
&gt;+    {
&gt;+        this._selectionController.allowsMultipleSelection = flag;
&gt;+    }
&gt;+
&gt;+    get selectedNode()
&gt;+    {
&gt;+        return this.dataGridNodeForSelectionItem(this._selectionController.lastSelectedItem);
&gt;+    }
&gt;+
&gt;+    set selectedNode(dataGridNode)
&gt;+    {
&gt;+        if (dataGridNode)
&gt;+            this._selectionController.selectItem(this.selectionItemForDataGridNode(dataGridNode));
&gt;+        else
&gt;+            this._selectionController.deselectAll();
&gt;+    }
&gt;+
&gt;+    get selectedDataGridNodes()
&gt;+    {
&gt;+        if (this.allowsMultipleSelection) {
&gt;+            let selectedDataGridNodes = [];
&gt;+            for (let item of this._selectionController.selectedItems)
&gt;+                selectedDataGridNodes.push(this.dataGridNodeForSelectionItem(item));
&gt;+            return selectedDataGridNodes;
&gt;+        }
&gt;+
&gt;+        let selectedNode = this.selectedNode;
&gt;+        if (selectedNode)
&gt;+            return [selectedNode];
&gt;+
&gt;+        return [];
&gt;+    }
&gt;+
&gt;     get filterText() { return this._filterText; }
&gt; 
&gt;     set filterText(x)
&gt;@@ -1366,64 +1411,70 @@ WI.DataGrid = class DataGrid extends WI.View
&gt; 
&gt;     _keyDown(event)
&gt;     {
&gt;-        if (!this.selectedNode || event.shiftKey || event.metaKey || event.ctrlKey || this._editing)
&gt;+        if (this._editing)
&gt;             return;
&gt; 
&gt;-        let isRTL = WI.resolvedLayoutDirection() === WI.LayoutDirection.RTL;
&gt;+        let isRTL = WI.resolveLayoutDirectionForElement(this.element) === WI.LayoutDirection.RTL;
&gt;+        let expandKeyIdentifier = isRTL ? &quot;Left&quot; : &quot;Right&quot;;
&gt;+        let collapseKeyIdentifier = isRTL ? &quot;Right&quot; : &quot;Left&quot;;
&gt; 
&gt;         var handled = false;
&gt;         var nextSelectedNode;
&gt;-        if (event.keyIdentifier === &quot;Up&quot; &amp;&amp; !event.altKey) {
&gt;-            nextSelectedNode = this.selectedNode.traversePreviousNode(true);
&gt;-            while (nextSelectedNode &amp;&amp; !nextSelectedNode.selectable)
&gt;-                nextSelectedNode = nextSelectedNode.traversePreviousNode(true);
&gt;-            handled = nextSelectedNode ? true : false;
&gt;-        } else if (event.keyIdentifier === &quot;Down&quot; &amp;&amp; !event.altKey) {
&gt;-            nextSelectedNode = this.selectedNode.traverseNextNode(true);
&gt;-            while (nextSelectedNode &amp;&amp; !nextSelectedNode.selectable)
&gt;-                nextSelectedNode = nextSelectedNode.traverseNextNode(true);
&gt;-            handled = nextSelectedNode ? true : false;
&gt;-        } else if ((!isRTL &amp;&amp; event.keyIdentifier === &quot;Left&quot;) || (isRTL &amp;&amp; event.keyIdentifier === &quot;Right&quot;)) {
&gt;-            if (this.selectedNode.expanded) {
&gt;-                if (event.altKey)
&gt;-                    this.selectedNode.collapseRecursively();
&gt;-                else
&gt;-                    this.selectedNode.collapse();
&gt;-                handled = true;
&gt;-            } else if (this.selectedNode.parent &amp;&amp; !this.selectedNode.parent.root) {
&gt;-                handled = true;
&gt;-                if (this.selectedNode.parent.selectable) {
&gt;-                    nextSelectedNode = this.selectedNode.parent;
&gt;-                    handled = nextSelectedNode ? true : false;
&gt;-                } else if (this.selectedNode.parent)
&gt;-                    this.selectedNode.parent.collapse();
&gt;-            }
&gt;-        } else if ((!isRTL &amp;&amp; event.keyIdentifier === &quot;Right&quot;) || (isRTL &amp;&amp; event.keyIdentifier === &quot;Left&quot;)) {
&gt;-            if (!this.selectedNode.revealed) {
&gt;-                this.selectedNode.reveal();
&gt;-                handled = true;
&gt;-            } else if (this.selectedNode.hasChildren) {
&gt;-                handled = true;
&gt;+
&gt;+        if (this.selectedNode) {
&gt;+            if (event.keyIdentifier === collapseKeyIdentifier) {
&gt;                 if (this.selectedNode.expanded) {
&gt;-                    nextSelectedNode = this.selectedNode.children[0];
&gt;-                    handled = nextSelectedNode ? true : false;
&gt;-                } else {
&gt;                     if (event.altKey)
&gt;-                        this.selectedNode.expandRecursively();
&gt;+                        this.selectedNode.collapseRecursively();
&gt;                     else
&gt;-                        this.selectedNode.expand();
&gt;+                        this.selectedNode.collapse();
&gt;+                    handled = true;
&gt;+                } else if (this.selectedNode.parent &amp;&amp; !this.selectedNode.parent.root) {
&gt;+                    handled = true;
&gt;+                    if (this.selectedNode.parent.selectable) {
&gt;+                        nextSelectedNode = this.selectedNode.parent;
&gt;+                        while (nextSelectedNode &amp;&amp; !nextSelectedNode.selectable)
&gt;+                            nextSelectedNode = nextSelectedNode.parent;
&gt;+                        handled = nextSelectedNode ? true : false;
&gt;+                    } else if (this.selectedNode.parent)
&gt;+                        this.selectedNode.parent.collapse();
&gt;+                }
&gt;+            } else if (event.keyIdentifier === expandKeyIdentifier) {
&gt;+                if (!this.selectedNode.revealed) {
&gt;+                    this.selectedNode.reveal();
&gt;+                    handled = true;
&gt;+                } else if (this.selectedNode.hasChildren) {
&gt;+                    handled = true;
&gt;+                    if (this.selectedNode.expanded) {
&gt;+                        nextSelectedNode = this.selectedNode.children[0];
&gt;+                        while (nextSelectedNode &amp;&amp; !nextSelectedNode.selectable)
&gt;+                            nextSelectedNode = nextSelectedNode.nextSibling;
&gt;+                        handled = nextSelectedNode ? true : false;
&gt;+                    } else {
&gt;+                        if (event.altKey)
&gt;+                            this.selectedNode.expandRecursively();
&gt;+                        else
&gt;+                            this.selectedNode.expand();
&gt;+                    }
&gt;+                }
&gt;+            } else if (event.keyCode === 8 /* Backspace */ || event.keyCode === 46 /* Delete */) {
&gt;+                if (this._deleteCallback) {
&gt;+                    handled = true;
&gt;+                    this._deleteCallback(this.selectedNode);
&gt;+                }
&gt;+            } else if (isEnterKey(event)) {
&gt;+                if (this._editCallback) {
&gt;+                    handled = true;
&gt;+                    this._startEditing(this.selectedNode.element.children[0]);
&gt;                 }
&gt;             }
&gt;-        } else if (event.keyCode === 8 || event.keyCode === 46) {
&gt;-            if (this._deleteCallback) {
&gt;-                handled = true;
&gt;-                this._deleteCallback(this.selectedNode);
&gt;-            }
&gt;-        } else if (isEnterKey(event)) {
&gt;-            if (this._editCallback) {
&gt;-                handled = true;
&gt;-                this._startEditing(this.selectedNode.element.children[0]);
&gt;-            }
&gt;+        }
&gt;+
&gt;+        if (!handled) {
&gt;+            handled = this._selectionController.handleKeyDown(event);
&gt;+
&gt;+            if (handled)
&gt;+                nextSelectedNode = this.selectedNode;
&gt;         }
&gt; 
&gt;         if (nextSelectedNode) {
&gt;@@ -1462,6 +1513,24 @@ WI.DataGrid = class DataGrid extends WI.View
&gt;         // This is the root, do nothing.
&gt;     }
&gt; 
&gt;+    selectNodes(nodes)
&gt;+    {
&gt;+        if (!nodes.length)
&gt;+            return;
&gt;+
&gt;+        if (nodes.length === 1) {
&gt;+            this.selectedNode = nodes[0];
&gt;+            return;
&gt;+        }
&gt;+
&gt;+        console.assert(this.allowsMultipleSelection, &quot;Cannot select multiple DataGridNode with multiple selection disabled.&quot;);
&gt;+        if (!this.allowsMultipleSelection)
&gt;+            return;
&gt;+
&gt;+        let selectableObjects = nodes.map((node) =&gt; this.selectionItemForDataGridNode(node));
&gt;+        this._selectionController.selectItems(new Set(selectableObjects));
&gt;+    }
&gt;+
&gt;     dataGridNodeFromNode(target)
&gt;     {
&gt;         var rowElement = target.closest(&quot;tr&quot;);
&gt;@@ -1578,23 +1647,16 @@ WI.DataGrid = class DataGrid extends WI.View
&gt; 
&gt;     _mouseDownInDataTable(event)
&gt;     {
&gt;-        var gridNode = this.dataGridNodeFromNode(event.target);
&gt;-        if (!gridNode) {
&gt;-            if (this.selectedNode)
&gt;-                this.selectedNode.deselect();
&gt;+        let dataGridNode = this.dataGridNodeFromNode(event.target);
&gt;+        if (!dataGridNode) {
&gt;+            this._selectionController.deselectAll();
&gt;             return;
&gt;         }
&gt; 
&gt;-        if (!gridNode.selectable || gridNode.isEventWithinDisclosureTriangle(event))
&gt;+        if (!dataGridNode.selectable || dataGridNode.isEventWithinDisclosureTriangle(event))
&gt;             return;
&gt; 
&gt;-        if (event.metaKey) {
&gt;-            if (gridNode.selected)
&gt;-                gridNode.deselect();
&gt;-            else
&gt;-                gridNode.select();
&gt;-        } else
&gt;-            gridNode.select();
&gt;+        this._selectionController.handleItemMouseDown(this.selectionItemForDataGridNode(dataGridNode), event);
&gt;     }
&gt; 
&gt;     _contextMenuInHeader(event)
&gt;@@ -1666,7 +1728,7 @@ WI.DataGrid = class DataGrid extends WI.View
&gt; 
&gt;         if (gridNode) {
&gt;             if (gridNode.selectable &amp;&amp; gridNode.copyable &amp;&amp; !gridNode.isEventWithinDisclosureTriangle(event)) {
&gt;-                contextMenu.appendItem(WI.UIString(&quot;Copy Row&quot;), this._copyRow.bind(this, event.target));
&gt;+                contextMenu.appendItem(WI.UIString(&quot;Copy Row&quot;), this._copyRow.bind(this, gridNode));
&gt;                 contextMenu.appendItem(WI.UIString(&quot;Copy Table&quot;), this._copyTable.bind(this));
&gt; 
&gt;                 if (this.dataGrid._editCallback) {
&gt;@@ -1746,22 +1808,30 @@ WI.DataGrid = class DataGrid extends WI.View
&gt; 
&gt;     handleCopyEvent(event)
&gt;     {
&gt;-        if (!this.selectedNode || !window.getSelection().isCollapsed)
&gt;+        if (!window.getSelection().isCollapsed)
&gt;             return;
&gt; 
&gt;-        var copyText = this._copyTextForDataGridNode(this.selectedNode);
&gt;-        event.clipboardData.setData(&quot;text/plain&quot;, copyText);
&gt;+        let copyData = [];
&gt;+        for (let dataGridNode of this.selectedDataGridNodes) {
&gt;+            if (!dataGridNode.copyable || dataGridNode.isPlaceholderNode)
&gt;+                continue;
&gt;+            copyData.push(this._copyTextForDataGridNode(dataGridNode));
&gt;+        }
&gt;+
&gt;+        if (!copyData.length)
&gt;+            return;
&gt;+
&gt;+        event.clipboardData.setData(&quot;text/plain&quot;, copyData.join(&quot;\n&quot;));
&gt;         event.stopPropagation();
&gt;         event.preventDefault();
&gt;     }
&gt; 
&gt;-    _copyRow(target)
&gt;+    _copyRow(dataGridNode)
&gt;     {
&gt;-        var gridNode = this.dataGridNodeFromNode(target);
&gt;-        if (!gridNode)
&gt;+        if (!dataGridNode.copyable || dataGridNode.isPlaceholderNode)
&gt;             return;
&gt; 
&gt;-        var copyText = this._copyTextForDataGridNode(gridNode);
&gt;+        let copyText = this._copyTextForDataGridNode(dataGridNode);
&gt;         InspectorFrontendHost.copyText(copyText);
&gt;     }
&gt; 
&gt;@@ -1769,19 +1839,28 @@ WI.DataGrid = class DataGrid extends WI.View
&gt;     {
&gt;         let copyData = [];
&gt;         copyData.push(this._copyTextForDataGridHeaders());
&gt;-        for (let gridNode of this.children) {
&gt;-            if (!gridNode.copyable)
&gt;+        for (let dataGridNode of this._rows) {
&gt;+            if (!dataGridNode.copyable || dataGridNode.isPlaceholderNode)
&gt;                 continue;
&gt;-            copyData.push(this._copyTextForDataGridNode(gridNode));
&gt;+            copyData.push(this._copyTextForDataGridNode(dataGridNode));
&gt;         }
&gt; 
&gt;+        if (!copyData.length)
&gt;+            return;
&gt;+
&gt;         InspectorFrontendHost.copyText(copyData.join(&quot;\n&quot;));
&gt;     }
&gt; 
&gt;     _hasCopyableData()
&gt;     {
&gt;-        let gridNode = this.children[0];
&gt;-        return gridNode &amp;&amp; gridNode.selectable &amp;&amp; gridNode.copyable;
&gt;+        const skipHidden = true;
&gt;+        const stayWithin = null;
&gt;+        const dontPopulate = true;
&gt;+
&gt;+        let dataGridNode = this._rows[0];
&gt;+        while (dataGridNode &amp;&amp; (!dataGridNode.selectable || !dataGridNode.copyable || dataGridNode.isPlaceholderNode))
&gt;+            dataGridNode = dataGridNode.traverseNextNode(skipHidden, stayWithin, dontPopulate);
&gt;+        return !!dataGridNode;
&gt;     }
&gt; 
&gt;     resizerDragStarted(resizer)
&gt;@@ -1904,6 +1983,36 @@ WI.DataGrid = class DataGrid extends WI.View
&gt;         this._applyFilterToNodesTask.start();
&gt;     }
&gt; 
&gt;+    selectDataGridNodeInternal(dataGridNode, suppressSelectedEvent)
&gt;+    {
&gt;+        if (this._processingSelectionChange)
&gt;+            return;
&gt;+
&gt;+        this._suppressNextSelectionDidChangeEvent = suppressSelectedEvent;
&gt;+
&gt;+        this._selectionController.selectItem(this.selectionItemForDataGridNode(dataGridNode));
&gt;+    }
&gt;+
&gt;+    deselectDataGridNodeInternal(dataGridNode, suppressDeselectedEvent)
&gt;+    {
&gt;+        if (this._processingSelectionChange)
&gt;+            return;
&gt;+
&gt;+        this._suppressNextSelectionDidChangeEvent = suppressDeselectedEvent;
&gt;+
&gt;+        this._selectionController.deselectItem(this.selectionItemForDataGridNode(dataGridNode));
&gt;+    }
&gt;+
&gt;+    _dispatchSelectedNodeChangedEvent()
&gt;+    {
&gt;+        if (this._suppressNextSelectionDidChangeEvent) {
&gt;+            this._suppressNextSelectionDidChangeEvent = false;
&gt;+            return;
&gt;+        }
&gt;+
&gt;+        this.dispatchEventToListeners(WI.DataGrid.Event.SelectedNodeChanged);
&gt;+    }
&gt;+
&gt;     // YieldableTask delegate
&gt; 
&gt;     yieldableTaskWillProcessItem(task, node)
&gt;@@ -1927,6 +2036,95 @@ WI.DataGrid = class DataGrid extends WI.View
&gt;     {
&gt;         this._applyFilterToNodesTask = null;
&gt;     }
&gt;+
&gt;+    // SelectionController delegate
&gt;+
&gt;+    dataGridNodeForSelectionItem(item)
&gt;+    {
&gt;+        console.assert(!item || item instanceof WI.DataGridNode);
&gt;+        return item;
&gt;+    }
&gt;+
&gt;+    selectionItemForDataGridNode(dataGridNode)
&gt;+    {
&gt;+        console.assert(!dataGridNode || dataGridNode instanceof WI.DataGridNode);
&gt;+        return dataGridNode;
&gt;+    }
&gt;+
&gt;+    selectionControllerSelectionDidChange(selectionController, deselectedItems, selectedItems)
&gt;+    {
&gt;+        this._processingSelectionChange = true;
&gt;+
&gt;+        for (let item of deselectedItems) {
&gt;+            let dataGridNode = this.dataGridNodeForSelectionItem(item);
&gt;+            dataGridNode?.deselect();
&gt;+        }
&gt;+
&gt;+        for (let item of selectedItems) {
&gt;+            let dataGridNode = this.dataGridNodeForSelectionItem(item);
&gt;+            dataGridNode?.select();
&gt;+        }
&gt;+
&gt;+        this._dispatchSelectedNodeChangedEvent();
&gt;+
&gt;+        this._processingSelectionChange = false;
&gt;+    }
&gt;+
&gt;+    selectionControllerFirstSelectableItem(controller, reason)
&gt;+    {
&gt;+        let firstChild = this._rows[0];
&gt;+        let item = this.selectionItemForDataGridNode(firstChild);
&gt;+        if (firstChild.selectable &amp;&amp; (!firstChild.isPlaceholderNode || reason !== WI.SelectionController.Reason.All))
&gt;+            return item;
&gt;+        return this.selectionControllerNextSelectableItem(controller, item, reason);
&gt;+    }
&gt;+
&gt;+    selectionControllerLastSelectableItem(controller, reason)
&gt;+    {
&gt;+        let lastChild = this._rows.lastValue;
&gt;+        while (lastChild.expanded &amp;&amp; lastChild.children.length)
&gt;+            lastChild = lastChild.children.lastValue;
&gt;+
&gt;+        let item = this.selectionItemForDataGridNode(lastChild);
&gt;+        if (lastChild.selectable &amp;&amp; (!lastChild.isPlaceholderNode || reason !== WI.SelectionController.Reason.All))
&gt;+            return item;
&gt;+        return this.selectionControllerPreviousSelectableItem(controller, item, reason);
&gt;+    }
&gt;+
&gt;+    selectionControllerPreviousSelectableItem(controller, item, reason)
&gt;+    {
&gt;+        let dataGridNode = this.dataGridNodeForSelectionItem(item);
&gt;+        console.assert(dataGridNode, &quot;Missing DataGridNode for selection item.&quot;, item);
&gt;+        if (!dataGridNode)
&gt;+            return null;
&gt;+
&gt;+        const skipUnrevealed = true;
&gt;+        const dontPopulate = true;
&gt;+        while (dataGridNode = dataGridNode.traversePreviousNode(skipUnrevealed, dontPopulate)) {
&gt;+            if (dataGridNode.selectable &amp;&amp; (!dataGridNode.isPlaceholderNode || reason !== WI.SelectionController.Reason.All))
&gt;+                return this.selectionItemForDataGridNode(dataGridNode);
&gt;+        }
&gt;+
&gt;+        return null;
&gt;+    }
&gt;+
&gt;+    selectionControllerNextSelectableItem(controller, item, reason)
&gt;+    {
&gt;+        let dataGridNode = this.dataGridNodeForSelectionItem(item);
&gt;+        console.assert(dataGridNode, &quot;Missing DataGridNode for selection item.&quot;, item);
&gt;+        if (!dataGridNode)
&gt;+            return null;
&gt;+
&gt;+        const skipUnrevealed = true;
&gt;+        const stayWithin = null;
&gt;+        const dontPopulate = true;
&gt;+        while (dataGridNode = dataGridNode.traverseNextNode(skipUnrevealed, stayWithin, dontPopulate)) {
&gt;+            if (dataGridNode.selectable &amp;&amp; (!dataGridNode.isPlaceholderNode || reason !== WI.SelectionController.Reason.All))
&gt;+                return this.selectionItemForDataGridNode(dataGridNode);
&gt;+        }
&gt;+
&gt;+        return null;
&gt;+    }
&gt; };
&gt; 
&gt; WI.DataGrid.Event = {
&gt;diff --git a/Source/WebInspectorUI/UserInterface/Views/DataGridNode.js b/Source/WebInspectorUI/UserInterface/Views/DataGridNode.js
&gt;index 640601145c1666ca6826eac4d5a1d1bc7d6969b4..acf8de3cef8cd51aa78e2a1b90531ebb368786c2 100644
&gt;--- a/Source/WebInspectorUI/UserInterface/Views/DataGridNode.js
&gt;+++ b/Source/WebInspectorUI/UserInterface/Views/DataGridNode.js
&gt;@@ -566,18 +566,10 @@ WI.DataGridNode = class DataGridNode extends WI.Object
&gt;         if (!this.dataGrid || !this.selectable || this.selected)
&gt;             return;
&gt; 
&gt;-        let oldSelectedNode = this.dataGrid.selectedNode;
&gt;-        if (oldSelectedNode)
&gt;-            oldSelectedNode.deselect(true);
&gt;-
&gt;         this._selected = true;
&gt;-        this.dataGrid.selectedNode = this;
&gt;+        this._element?.classList.add(&quot;selected&quot;);
&gt; 
&gt;-        if (this._element)
&gt;-            this._element.classList.add(&quot;selected&quot;);
&gt;-
&gt;-        if (!suppressSelectedEvent)
&gt;-            this.dataGrid.dispatchEventToListeners(WI.DataGrid.Event.SelectedNodeChanged, {oldSelectedNode});
&gt;+        this.dataGrid.selectDataGridNodeInternal(this, suppressSelectedEvent);
&gt;     }
&gt; 
&gt;     revealAndSelect(suppressSelectedEvent)
&gt;@@ -588,17 +580,13 @@ WI.DataGridNode = class DataGridNode extends WI.Object
&gt; 
&gt;     deselect(suppressDeselectedEvent)
&gt;     {
&gt;-        if (!this.dataGrid || this.dataGrid.selectedNode !== this || !this.selected)
&gt;+        if (!this.dataGrid || !this.selectable || !this.selected)
&gt;             return;
&gt; 
&gt;         this._selected = false;
&gt;-        this.dataGrid.selectedNode = null;
&gt;+        this._element?.classList.remove(&quot;selected&quot;);
&gt; 
&gt;-        if (this._element)
&gt;-            this._element.classList.remove(&quot;selected&quot;);
&gt;-
&gt;-        if (!suppressDeselectedEvent)
&gt;-            this.dataGrid.dispatchEventToListeners(WI.DataGrid.Event.SelectedNodeChanged, {oldSelectedNode: this});
&gt;+        this.dataGrid.deselectDataGridNodeInternal(this, suppressDeselectedEvent);
&gt;     }
&gt; 
&gt;     traverseNextNode(skipHidden, stayWithin, dontPopulate, info)
&gt;diff --git a/Source/WebInspectorUI/UserInterface/Views/ProfileView.js b/Source/WebInspectorUI/UserInterface/Views/ProfileView.js
&gt;index a23c5157f61fcacb465f09b8b7fe22da22306391..224d051fee494abafc1c05de64649020b7691505 100644
&gt;--- a/Source/WebInspectorUI/UserInterface/Views/ProfileView.js
&gt;+++ b/Source/WebInspectorUI/UserInterface/Views/ProfileView.js
&gt;@@ -69,6 +69,8 @@ WI.ProfileView = class ProfileView extends WI.ContentView
&gt;         this._dataGrid.sortOrder = WI.DataGrid.SortOrder.Descending;
&gt;         this._dataGrid.createSettings(&quot;profile-view&quot;);
&gt; 
&gt;+        this._selectedDataGridNode = null;
&gt;+
&gt;         // Currently we create a new ProfileView for each CallingContextTree, so
&gt;         // to share state between them, use a common shared data object.
&gt;         this._sharedData = extraArguments;
&gt;@@ -211,18 +213,19 @@ WI.ProfileView = class ProfileView extends WI.ContentView
&gt; 
&gt;     _dataGridNodeSelected(event)
&gt;     {
&gt;-        let oldSelectedNode = event.data.oldSelectedNode;
&gt;-        if (oldSelectedNode) {
&gt;-            this._removeGuidanceElement(WI.ProfileView.GuidanceType.Selected, oldSelectedNode);
&gt;-            oldSelectedNode.forEachChildInSubtree((node) =&gt; this._removeGuidanceElement(WI.ProfileView.GuidanceType.Selected, node));
&gt;+        if (this._selectedDataGridNode) {
&gt;+            this._removeGuidanceElement(WI.ProfileView.GuidanceType.Selected, this._selectedDataGridNode);
&gt;+            this._selectedDataGridNode.forEachChildInSubtree((node) =&gt; this._removeGuidanceElement(WI.ProfileView.GuidanceType.Selected, node));
&gt;         }
&gt; 
&gt;-        let newSelectedNode = this._dataGrid.selectedNode;
&gt;-        if (newSelectedNode) {
&gt;-            this._removeGuidanceElement(WI.ProfileView.GuidanceType.Selected, newSelectedNode);
&gt;-            newSelectedNode.forEachChildInSubtree((node) =&gt; this._appendGuidanceElement(WI.ProfileView.GuidanceType.Selected, node, newSelectedNode));
&gt;+        this._selectedDataGridNode = this._dataGrid.selectedNode;
&gt; 
&gt;-            this._sharedData.selectedNodeHash = newSelectedNode.callingContextTreeNode.hash;
&gt;+
&gt;+        if (this._selectedDataGridNode) {
&gt;+            this._removeGuidanceElement(WI.ProfileView.GuidanceType.Selected, this._selectedDataGridNode);
&gt;+            this._selectedDataGridNode.forEachChildInSubtree((node) =&gt; this._appendGuidanceElement(WI.ProfileView.GuidanceType.Selected, node, this._selectedDataGridNode));
&gt;+
&gt;+            this._sharedData.selectedNodeHash = this._selectedDataGridNode.callingContextTreeNode.hash;
&gt;         }
&gt;     }
&gt; 
&gt;diff --git a/Source/WebInspectorUI/UserInterface/Views/Table.js b/Source/WebInspectorUI/UserInterface/Views/Table.js
&gt;index 8833df73068c7a7346217b900e673f7ab89179b9..28f432629ea4ad87752750618829f9dd0f920d49 100644
&gt;--- a/Source/WebInspectorUI/UserInterface/Views/Table.js
&gt;+++ b/Source/WebInspectorUI/UserInterface/Views/Table.js
&gt;@@ -86,7 +86,8 @@ WI.Table = class Table extends WI.View
&gt;         this._columnWidths = null; // Calculated in _resizeColumnsAndFiller.
&gt;         this._fillerHeight = 0; // Calculated in _resizeColumnsAndFiller.
&gt; 
&gt;-        this._selectionController = new WI.SelectionController(this, (a, b) =&gt; this._indexForRepresentedObject(a) - this._indexForRepresentedObject(b));
&gt;+        let selectionComparator = WI.SelectionController.createListComparator(this._indexForRepresentedObject.bind(this));
&gt;+        this._selectionController = new WI.SelectionController(this, selectionComparator);
&gt; 
&gt;         this._resizers = [];
&gt;         this._currentResizer = null;
&gt;diff --git a/Source/WebInspectorUI/UserInterface/Views/TreeOutline.js b/Source/WebInspectorUI/UserInterface/Views/TreeOutline.js
&gt;index 8120cd15b55369a5cf8236c4aa55b07f8c4c6a14..507a178d54be17c3699338f57bb1c6caa8c4c255 100644
&gt;--- a/Source/WebInspectorUI/UserInterface/Views/TreeOutline.js
&gt;+++ b/Source/WebInspectorUI/UserInterface/Views/TreeOutline.js
&gt;@@ -57,53 +57,9 @@ WI.TreeOutline = class TreeOutline extends WI.Object
&gt; 
&gt;         this._cachedNumberOfDescendants = 0;
&gt; 
&gt;-        let comparator = (a, b) =&gt; {
&gt;-            function getLevel(treeElement) {
&gt;-                let level = 0;
&gt;-                while (treeElement = treeElement.parent)
&gt;-                    level++;
&gt;-                return level;
&gt;-            }
&gt;-
&gt;-            function compareSiblings(s, t) {
&gt;-                return s.parent.children.indexOf(s) - s.parent.children.indexOf(t);
&gt;-            }
&gt;-
&gt;-            // Translate represented objects to TreeElements, which have the
&gt;-            // hierarchical information needed to perform the comparison.
&gt;-            a = this.getCachedTreeElement(a);
&gt;-            b = this.getCachedTreeElement(b);
&gt;-            if (!a || !b)
&gt;-                return 0;
&gt;-
&gt;-            if (a.parent === b.parent)
&gt;-                return compareSiblings(a, b);
&gt;-
&gt;-            let aLevel = getLevel(a);
&gt;-            let bLevel = getLevel(b);
&gt;-            while (aLevel &gt; bLevel) {
&gt;-                if (a.parent === b)
&gt;-                    return 1;
&gt;-                a = a.parent;
&gt;-                aLevel--;
&gt;-            }
&gt;-            while (bLevel &gt; aLevel) {
&gt;-                if (b.parent === a)
&gt;-                    return -1;
&gt;-                b = b.parent;
&gt;-                bLevel--;
&gt;-            }
&gt;-
&gt;-            while (a.parent !== b.parent) {
&gt;-                a = a.parent;
&gt;-                b = b.parent;
&gt;-            }
&gt;-
&gt;-            console.assert(a.parent === b.parent, &quot;Missing common ancestor for TreeElements.&quot;, a, b);
&gt;-            return compareSiblings(a, b);
&gt;-        };
&gt;-
&gt;-        this._selectionController = new WI.SelectionController(this, comparator);
&gt;+        let itemForRepresentedObject = this.getCachedTreeElement.bind(this);
&gt;+        let selectionComparator = WI.SelectionController.createTreeComparator(itemForRepresentedObject);
&gt;+        this._selectionController = new WI.SelectionController(this, selectionComparator);
&gt; 
&gt;         this._itemWasSelectedByUser = false;
&gt;         this._processingSelectionChange = false;
&gt;@@ -770,11 +726,6 @@ WI.TreeOutline = class TreeOutline extends WI.Object
&gt; 
&gt;     // SelectionController delegate
&gt; 
&gt;-    selectionControllerNumberOfItems(controller)
&gt;-    {
&gt;-        return this._cachedNumberOfDescendants;
&gt;-    }
&gt;-
&gt;     selectionControllerSelectionDidChange(controller, deselectedItems, selectedItems)
&gt;     {
&gt;         this._processingSelectionChange = true;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1644902</commentid>
    <comment_count>3</comment_count>
      <attachid>397299</attachid>
    <who name="Blaze Burg">bburg</who>
    <bug_when>2020-04-23 12:22:00 -0700</bug_when>
    <thetext>Comment on attachment 397299
Patch

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

r=me, nice work!

&gt; Source/WebInspectorUI/ChangeLog:59
&gt; +        Introduce a `WI.SelectionController.Reason` which is used to tell the `_delegate` about why

I think this should be called Operation not reason. It&apos;s possible to select new elements in 3 operations: direct selection, all, and range extension.

&gt; Source/WebInspectorUI/UserInterface/Controllers/SelectionController.js:53
&gt; +
&gt; +    static createTreeComparator(itemForRepresentedObject)

This comparator is begging to be tested somehow. At the very least, I&apos;d like a comment to explain the general heuristic, which seems to be to &quot;find the first common ancestor and compare the ordinal of a and b under the common parent&quot;.

&gt; Source/WebInspectorUI/UserInterface/Controllers/SelectionController.js:63
&gt; +            let getLevel = (item) =&gt; {

Nit: depth?

&gt; Source/WebInspectorUI/UserInterface/Controllers/SelectionController.js:192
&gt; +                const reason = WI.SelectionController.Reason.Extend;

So.. Reason.Extend also covers shrinking the range?

&gt; Source/WebInspectorUI/UserInterface/Controllers/SelectionController.js:224
&gt; +        const reason = WI.SelectionController.Reason.All;

Why no reset()?

&gt; Source/WebInspectorUI/UserInterface/Views/DataGrid.js:71
&gt; +        let selectionComparator = WI.SelectionController.createTreeComparator(itemForRepresentedObject);

This is elegant. Good job.

&gt; Source/WebInspectorUI/UserInterface/Views/DataGrid.js:1419
&gt; +        let collapseKeyIdentifier = isRTL ? &quot;Right&quot; : &quot;Left&quot;;

I&apos;m unsure if this is correct. Does Mac system UI reverse the keys for collapsing when in RTL?

&gt; Source/WebInspectorUI/UserInterface/Views/DataGrid.js:1438
&gt; +                        handled = nextSelectedNode ? true : false;

Nit: !!nextSelectedNode (I realise it&apos;s moved from earlier)

&gt; Source/WebInspectorUI/UserInterface/Views/DataGrid.js:2051
&gt; +        return dataGridNode;

lol @ this code</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1644920</commentid>
    <comment_count>4</comment_count>
      <attachid>397299</attachid>
    <who name="Devin Rousso">hi</who>
    <bug_when>2020-04-23 12:42:23 -0700</bug_when>
    <thetext>Comment on attachment 397299
Patch

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

&gt;&gt; Source/WebInspectorUI/ChangeLog:59
&gt;&gt; +        Introduce a `WI.SelectionController.Reason` which is used to tell the `_delegate` about why
&gt; 
&gt; I think this should be called Operation not reason. It&apos;s possible to select new elements in 3 operations: direct selection, all, and range extension.

Yeah that&apos;s a better name :)

&gt;&gt; Source/WebInspectorUI/UserInterface/Controllers/SelectionController.js:53
&gt;&gt; +    static createTreeComparator(itemForRepresentedObject)
&gt; 
&gt; This comparator is begging to be tested somehow. At the very least, I&apos;d like a comment to explain the general heuristic, which seems to be to &quot;find the first common ancestor and compare the ordinal of a and b under the common parent&quot;.

This code has just been moved from `WI.TreeOutline` (and from `WI.Table` below) so the logic hasn&apos;t changed at all.

I can add some test cases to LayoutTests/inspector/tree-outline/tree-outline-selection.html for the parent/child cases.

&gt;&gt; Source/WebInspectorUI/UserInterface/Controllers/SelectionController.js:192
&gt;&gt; +                const reason = WI.SelectionController.Reason.Extend;
&gt; 
&gt; So.. Reason.Extend also covers shrinking the range?

Yeah.  I consider that to be a kind of &quot;negative&quot; extension.

&gt;&gt; Source/WebInspectorUI/UserInterface/Controllers/SelectionController.js:224
&gt;&gt; +        const reason = WI.SelectionController.Reason.All;
&gt; 
&gt; Why no reset()?

`reset` will clear the list of selected items, meaning that we won&apos;t deselect any previously selected items.  This wasn&apos;t a problem before as `selectAll` would always select everything, whereas now we ignore `WI.PlaceholderDataGridNode` when `selectAll`-ing.

&gt;&gt; Source/WebInspectorUI/UserInterface/Views/DataGrid.js:1419
&gt;&gt; +        let collapseKeyIdentifier = isRTL ? &quot;Right&quot; : &quot;Left&quot;;
&gt; 
&gt; I&apos;m unsure if this is correct. Does Mac system UI reverse the keys for collapsing when in RTL?

Yes, I believe so.  Keep in mind that the UI is also reversed, so the disclosure arrow will point in the other direction :)

&gt;&gt; Source/WebInspectorUI/UserInterface/Views/DataGrid.js:1438
&gt;&gt; +                        handled = nextSelectedNode ? true : false;
&gt; 
&gt; Nit: !!nextSelectedNode (I realise it&apos;s moved from earlier)

lol sure :P

&gt;&gt; Source/WebInspectorUI/UserInterface/Views/DataGrid.js:2051
&gt;&gt; +        return dataGridNode;
&gt; 
&gt; lol @ this code

I did this just in case we make a change in the future.  Plus I think it makes the code easier to read/follow, instead of having to implicitly know that the `WI.DataGridNode` is its own `representedObject`.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1645025</commentid>
    <comment_count>5</comment_count>
      <attachid>397403</attachid>
    <who name="Devin Rousso">hi</who>
    <bug_when>2020-04-23 17:32:22 -0700</bug_when>
    <thetext>Created attachment 397403
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1645041</commentid>
    <comment_count>6</comment_count>
    <who name="EWS">ews-feeder</who>
    <bug_when>2020-04-23 18:05:38 -0700</bug_when>
    <thetext>Committed r260613: &lt;https://trac.webkit.org/changeset/260613&gt;

All reviewed patches have been landed. Closing bug and clearing flags on attachment 397403.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1645042</commentid>
    <comment_count>7</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2020-04-23 18:06:18 -0700</bug_when>
    <thetext>&lt;rdar://problem/62273396&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>397299</attachid>
            <date>2020-04-22 18:22:26 -0700</date>
            <delta_ts>2020-04-23 17:32:20 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-210876-20200422192226.patch</filename>
            <type>text/plain</type>
            <size>43565</size>
            <attacher name="Devin Rousso">hi</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJJbnNwZWN0b3JVSS9DaGFuZ2VMb2cgYi9Tb3VyY2UvV2Vi
SW5zcGVjdG9yVUkvQ2hhbmdlTG9nCmluZGV4IDc3MzExN2Y1NDYyYzdmMmE1MDc0ZWVhNjRmYTE2
ODdiMGMwYTE0M2UuLjlmNjlhYjc4NzcxOTA1NDQ4ZmI2MWE2Yjc5NjQzYjMwYzdjMzMyYTggMTAw
NjQ0Ci0tLSBhL1NvdXJjZS9XZWJJbnNwZWN0b3JVSS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dl
Ykluc3BlY3RvclVJL0NoYW5nZUxvZwpAQCAtMSwzICsxLDgyIEBACisyMDIwLTA0LTIyICBEZXZp
biBSb3Vzc28gIDxkcm91c3NvQGFwcGxlLmNvbT4KKworICAgICAgICBXZWIgSW5zc3BlY3Rvcjog
U3RvcmFnZTogY2Fubm90IHNlbGVjdCBtdWx0aXBsZSBsb2NhbCBzdG9yYWdlIGVudHJpZXMKKyAg
ICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIxMDg3NgorCisg
ICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFN1cHBvcnQgbXVs
dGlwbGUgc2VsZWN0aW9uIHVzaW5nIGBXSS5EYXRhR3JpZGAuCisKKyAgICAgICAgKiBVc2VySW50
ZXJmYWNlL1ZpZXdzL0RhdGFHcmlkLmpzOgorICAgICAgICAoV0kuRGF0YUdyaWQpOgorICAgICAg
ICAoV0kuRGF0YUdyaWQucHJvdG90eXBlLmdldCBhbGxvd3NNdWx0aXBsZVNlbGVjdGlvbik6IEFk
ZGVkLgorICAgICAgICAoV0kuRGF0YUdyaWQucHJvdG90eXBlLnNldCBhbGxvd3NNdWx0aXBsZVNl
bGVjdGlvbik6IEFkZGVkLgorICAgICAgICAoV0kuRGF0YUdyaWQucHJvdG90eXBlLmdldCBzZWxl
Y3RlZE5vZGUpOgorICAgICAgICAoV0kuRGF0YUdyaWQucHJvdG90eXBlLnNldCBzZWxlY3RlZE5v
ZGUpOgorICAgICAgICAoV0kuRGF0YUdyaWQucHJvdG90eXBlLmdldCBzZWxlY3RlZERhdGFHcmlk
Tm9kZXMpOiBBZGRlZC4KKyAgICAgICAgKFdJLkRhdGFHcmlkLnByb3RvdHlwZS5fa2V5RG93bik6
CisgICAgICAgIChXSS5EYXRhR3JpZC5wcm90b3R5cGUuc2VsZWN0Tm9kZXMpOgorICAgICAgICAo
V0kuRGF0YUdyaWQucHJvdG90eXBlLl9tb3VzZURvd25JbkRhdGFUYWJsZSk6CisgICAgICAgIChX
SS5EYXRhR3JpZC5wcm90b3R5cGUuX2NvbnRleHRNZW51SW5EYXRhVGFibGUpOgorICAgICAgICAo
V0kuRGF0YUdyaWQucHJvdG90eXBlLmhhbmRsZUNvcHlFdmVudCk6CisgICAgICAgIChXSS5EYXRh
R3JpZC5wcm90b3R5cGUuX2NvcHlSb3cpOgorICAgICAgICAoV0kuRGF0YUdyaWQucHJvdG90eXBl
Ll9jb3B5VGFibGUpOgorICAgICAgICAoV0kuRGF0YUdyaWQucHJvdG90eXBlLl9oYXNDb3B5YWJs
ZURhdGEpOgorICAgICAgICAoV0kuRGF0YUdyaWQucHJvdG90eXBlLnNlbGVjdERhdGFHcmlkTm9k
ZUludGVybmFsKTogQWRkZWQuCisgICAgICAgIChXSS5EYXRhR3JpZC5wcm90b3R5cGUuZGVzZWxl
Y3REYXRhR3JpZE5vZGVJbnRlcm5hbCk6IEFkZGVkLgorICAgICAgICAoV0kuRGF0YUdyaWQucHJv
dG90eXBlLl9kaXNwYXRjaFNlbGVjdGVkTm9kZUNoYW5nZWRFdmVudCk6IEFkZGVkLgorICAgICAg
ICAoV0kuRGF0YUdyaWQucHJvdG90eXBlLmRhdGFHcmlkTm9kZUZvclNlbGVjdGlvbkl0ZW0pOiBB
ZGRlZC4KKyAgICAgICAgKFdJLkRhdGFHcmlkLnByb3RvdHlwZS5zZWxlY3Rpb25JdGVtRm9yRGF0
YUdyaWROb2RlKTogQWRkZWQuCisgICAgICAgIChXSS5EYXRhR3JpZC5wcm90b3R5cGUuc2VsZWN0
aW9uQ29udHJvbGxlclNlbGVjdGlvbkRpZENoYW5nZSk6IEFkZGVkLgorICAgICAgICAoV0kuRGF0
YUdyaWQucHJvdG90eXBlLnNlbGVjdGlvbkNvbnRyb2xsZXJGaXJzdFNlbGVjdGFibGVJdGVtKTog
QWRkZWQuCisgICAgICAgIChXSS5EYXRhR3JpZC5wcm90b3R5cGUuc2VsZWN0aW9uQ29udHJvbGxl
ckxhc3RTZWxlY3RhYmxlSXRlbSk6IEFkZGVkLgorICAgICAgICAoV0kuRGF0YUdyaWQucHJvdG90
eXBlLnNlbGVjdGlvbkNvbnRyb2xsZXJQcmV2aW91c1NlbGVjdGFibGVJdGVtKTogQWRkZWQuCisg
ICAgICAgIChXSS5EYXRhR3JpZC5wcm90b3R5cGUuc2VsZWN0aW9uQ29udHJvbGxlck5leHRTZWxl
Y3RhYmxlSXRlbSk6IEFkZGVkLgorICAgICAgICAqIFVzZXJJbnRlcmZhY2UvVmlld3MvRGF0YUdy
aWROb2RlLmpzOgorICAgICAgICAoV0kuRGF0YUdyaWROb2RlLnByb3RvdHlwZS5zZWxlY3QpOgor
ICAgICAgICAoV0kuRGF0YUdyaWROb2RlLnByb3RvdHlwZS5kZXNlbGVjdCk6CisgICAgICAgIFJl
cGxhY2UgYHNlbGVjdGVkTm9kZWAgd2l0aCBhIGBXSS5TZWxlY3Rpb25Db250cm9sbGVyYCB0aGF0
IGJlaGF2ZXMgbGlrZSBhIGBXSS5UcmVlT3V0bGluZWAuCisgICAgICAgIFVzZSB0aGUgYFdJLlNl
bGVjdGlvbkNvbnRyb2xsZXIuUmVhc29uYCB0byBlbnN1cmUgdGhhdCBgV0kuUGxhY2Vob2xkZXJE
YXRhR3JpZE5vZGVgIGFyZSBub3QKKyAgICAgICAgc2VsZWN0ZWQgd2hlbiBzZWxlY3RpbmcgYWxs
IG5vZGVzLiBFbnN1cmUgdGhhdCBgV0kuUGxhY2Vob2xkZXJEYXRhR3JpZE5vZGVgIGFyZSBub3Qg
Y29waWVkLgorICAgICAgICBQcmVmZXIgdG8gdXNlIGBfcm93c2AgaW5zdGVhZCBvZiBgY2hpbGRy
ZW5gIGFzIHRoZSBsYXR0ZXIgaXMgbm90IHNvcnRlZC9maWx0ZXJlZC4KKworICAgICAgICAqIFVz
ZXJJbnRlcmZhY2UvQ29udHJvbGxlcnMvU2VsZWN0aW9uQ29udHJvbGxlci5qczoKKyAgICAgICAg
KFdJLlNlbGVjdGlvbkNvbnRyb2xsZXIuY3JlYXRlVHJlZUNvbXBhcmF0b3IpOiBBZGRlZC4KKyAg
ICAgICAgKFdJLlNlbGVjdGlvbkNvbnRyb2xsZXIuY3JlYXRlTGlzdENvbXBhcmF0b3IpOiBBZGRl
ZC4KKyAgICAgICAgQ3JlYXRlIGBzdGF0aWNgIGhlbHBlciBmdW5jdGlvbnMgZm9yIGNvbW1vbiBj
b21wYXJhdG9ycy4KKworICAgICAgICAoV0kuU2VsZWN0aW9uQ29udHJvbGxlci5wcm90b3R5cGUu
ZGVzZWxlY3RJdGVtKToKKyAgICAgICAgKFdJLlNlbGVjdGlvbkNvbnRyb2xsZXIucHJvdG90eXBl
LnNlbGVjdEFsbCk6CisgICAgICAgIChXSS5TZWxlY3Rpb25Db250cm9sbGVyLnByb3RvdHlwZS5y
ZW1vdmVTZWxlY3RlZEl0ZW1zKToKKyAgICAgICAgKFdJLlNlbGVjdGlvbkNvbnRyb2xsZXIucHJv
dG90eXBlLmhhbmRsZUl0ZW1Nb3VzZURvd24pOgorICAgICAgICAoV0kuU2VsZWN0aW9uQ29udHJv
bGxlci5wcm90b3R5cGUuX3NlbGVjdEl0ZW1zRnJvbUFycm93S2V5KToKKyAgICAgICAgKFdJLlNl
bGVjdGlvbkNvbnRyb2xsZXIucHJvdG90eXBlLl9maXJzdFNlbGVjdGFibGVJdGVtKToKKyAgICAg
ICAgKFdJLlNlbGVjdGlvbkNvbnRyb2xsZXIucHJvdG90eXBlLl9sYXN0U2VsZWN0YWJsZUl0ZW0p
OgorICAgICAgICAoV0kuU2VsZWN0aW9uQ29udHJvbGxlci5wcm90b3R5cGUuX3ByZXZpb3VzU2Vs
ZWN0YWJsZUl0ZW0pOgorICAgICAgICAoV0kuU2VsZWN0aW9uQ29udHJvbGxlci5wcm90b3R5cGUu
X25leHRTZWxlY3RhYmxlSXRlbSk6CisgICAgICAgIChXSS5TZWxlY3Rpb25Db250cm9sbGVyLnBy
b3RvdHlwZS5fYWRkUmFuZ2UpOgorICAgICAgICAoV0kuU2VsZWN0aW9uQ29udHJvbGxlci5wcm90
b3R5cGUuX2RlbGV0ZVJhbmdlKToKKyAgICAgICAgSW50cm9kdWNlIGEgYFdJLlNlbGVjdGlvbkNv
bnRyb2xsZXIuUmVhc29uYCB3aGljaCBpcyB1c2VkIHRvIHRlbGwgdGhlIGBfZGVsZWdhdGVgIGFi
b3V0IHdoeQorICAgICAgICBpdCdzIGJlaW5nIGFza2VkIGZvciBpbmZvcm1hdGlvbi4KKworICAg
ICAgICAqIFVzZXJJbnRlcmZhY2UvVmlld3MvRE9NU3RvcmFnZUNvbnRlbnRWaWV3LmpzOgorICAg
ICAgICAoV0kuRE9NU3RvcmFnZUNvbnRlbnRWaWV3KToKKyAgICAgICAgKFdJLkRPTVN0b3JhZ2VD
b250ZW50Vmlldy5wcm90b3R5cGUuX2RlbGV0ZUNhbGxiYWNrKToKKyAgICAgICAgU3VwcG9ydCBt
dWx0aXBsZSBzZWxlY3Rpb24sIGluY2x1ZGluZyBkZWxldGluZyBtdWx0aXBsZSByb3dzIGF0IG9u
Y2UuCisKKyAgICAgICAgKiBVc2VySW50ZXJmYWNlL1ZpZXdzL1RhYmxlLmpzOgorICAgICAgICAo
V0kuVGFibGUpOgorICAgICAgICAqIFVzZXJJbnRlcmZhY2UvVmlld3MvVHJlZU91dGxpbmUuanM6
CisgICAgICAgIChXSS5UcmVlT3V0bGluZSk6CisgICAgICAgIChXSS5UcmVlT3V0bGluZS5wcm90
b3R5cGUuc2VsZWN0aW9uQ29udHJvbGxlck51bWJlck9mSXRlbXMpOiBEZWxldGVkLgorICAgICAg
ICBSZW1vdmVkIHVudXNlZCBgc2VsZWN0aW9uQ29udHJvbGxlck51bWJlck9mSXRlbXNgLgorCisg
ICAgICAgICogVXNlckludGVyZmFjZS9WaWV3cy9Qcm9maWxlVmlldy5qczoKKyAgICAgICAgKFdJ
LlByb2ZpbGVWaWV3KToKKyAgICAgICAgKFdJLlByb2ZpbGVWaWV3LnByb3RvdHlwZS5fZGF0YUdy
aWROb2RlU2VsZWN0ZWQpOgorICAgICAgICBNYWludGFpbiBhIGBfc2VsZWN0ZWREYXRhR3JpZE5v
ZGVgIHNvIHRoYXQgYG9sZFNlbGVjdGVkTm9kZWAgZG9lc24ndCBoYXZlIHRvIGJlIGluY2x1ZGVk
CisgICAgICAgIHdoZW4gZGlzcGF0Y2hpbmcgYFdJLkRhdGFHcmlkLkV2ZW50LlNlbGVjdGVkTm9k
ZUNoYW5nZWRgLgorCiAyMDIwLTA0LTIyICBEZXZpbiBSb3Vzc28gIDxkcm91c3NvQGFwcGxlLmNv
bT4KIAogICAgICAgICBXZWIgSW5zcGVjdG9yOiBTdG9yYWdlOiB1bmFibGUgdG8gZmlsdGVyIGNv
b2tpZXMKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL0Nv
bnRyb2xsZXJzL1NlbGVjdGlvbkNvbnRyb2xsZXIuanMgYi9Tb3VyY2UvV2ViSW5zcGVjdG9yVUkv
VXNlckludGVyZmFjZS9Db250cm9sbGVycy9TZWxlY3Rpb25Db250cm9sbGVyLmpzCmluZGV4IGRi
YjBhZTcwODFlNGFjNGYzODZhMWU2ZWYzNTFkOTE4MWMwMjJjZmYuLjk0MDkyMDQ5NTZmMmRkMjUw
ZTFjNTlhYjkwODU4NjhmZGM1YjUxMzEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJJbnNwZWN0b3JV
SS9Vc2VySW50ZXJmYWNlL0NvbnRyb2xsZXJzL1NlbGVjdGlvbkNvbnRyb2xsZXIuanMKKysrIGIv
U291cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2UvQ29udHJvbGxlcnMvU2VsZWN0aW9u
Q29udHJvbGxlci5qcwpAQCAtNDgsNiArNDgsNjYgQEAgV0kuU2VsZWN0aW9uQ29udHJvbGxlciA9
IGNsYXNzIFNlbGVjdGlvbkNvbnRyb2xsZXIgZXh0ZW5kcyBXSS5PYmplY3QKICAgICAgICAgY29u
c29sZS5hc3NlcnQodGhpcy5fZGVsZWdhdGUuc2VsZWN0aW9uQ29udHJvbGxlclByZXZpb3VzU2Vs
ZWN0YWJsZUl0ZW0sICJTZWxlY3Rpb25Db250cm9sbGVyIGRlbGVnYXRlIG11c3QgaW1wbGVtZW50
IHNlbGVjdGlvbkNvbnRyb2xsZXJQcmV2aW91c1NlbGVjdGFibGVJdGVtLiIpOwogICAgIH0KIAor
ICAgIC8vIFN0YXRpYworCisgICAgc3RhdGljIGNyZWF0ZVRyZWVDb21wYXJhdG9yKGl0ZW1Gb3JS
ZXByZXNlbnRlZE9iamVjdCkKKyAgICB7CisgICAgICAgIHJldHVybiAoYSwgYikgPT4geworICAg
ICAgICAgICAgLy8gVHJhbnNsYXRlIHJlcHJlc2VudGVkIG9iamVjdHMgdG8gVHJlZUVsZW1lbnRz
LCB3aGljaCBoYXZlIHRoZQorICAgICAgICAgICAgLy8gaGllcmFyY2hpY2FsIGluZm9ybWF0aW9u
IG5lZWRlZCB0byBwZXJmb3JtIHRoZSBjb21wYXJpc29uLgorICAgICAgICAgICAgYSA9IGl0ZW1G
b3JSZXByZXNlbnRlZE9iamVjdChhKTsKKyAgICAgICAgICAgIGIgPSBpdGVtRm9yUmVwcmVzZW50
ZWRPYmplY3QoYik7CisgICAgICAgICAgICBpZiAoIWEgfHwgIWIpCisgICAgICAgICAgICAgICAg
cmV0dXJuIDA7CisKKyAgICAgICAgICAgIGxldCBnZXRMZXZlbCA9IChpdGVtKSA9PiB7CisgICAg
ICAgICAgICAgICAgbGV0IGxldmVsID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaXRlbSA9
IGl0ZW0ucGFyZW50KQorICAgICAgICAgICAgICAgICAgICBsZXZlbCsrOworICAgICAgICAgICAg
ICAgIHJldHVybiBsZXZlbDsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGxldCBjb21w
YXJlU2libGluZ3MgPSAocywgdCkgPT4geworICAgICAgICAgICAgICAgIHJldHVybiBzLnBhcmVu
dC5jaGlsZHJlbi5pbmRleE9mKHMpIC0gcy5wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZih0KTsKKyAg
ICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGlmIChhLnBhcmVudCA9PT0gYi5wYXJlbnQpCisg
ICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVTaWJsaW5ncyhhLCBiKTsKKworICAgICAgICAg
ICAgbGV0IGFMZXZlbCA9IGdldExldmVsKGEpOworICAgICAgICAgICAgbGV0IGJMZXZlbCA9IGdl
dExldmVsKGIpOworICAgICAgICAgICAgd2hpbGUgKGFMZXZlbCA+IGJMZXZlbCkgeworICAgICAg
ICAgICAgICAgIGlmIChhLnBhcmVudCA9PT0gYikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJu
IDE7CisgICAgICAgICAgICAgICAgYSA9IGEucGFyZW50OworICAgICAgICAgICAgICAgIGFMZXZl
bC0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKGJMZXZlbCA+IGFMZXZlbCkg
eworICAgICAgICAgICAgICAgIGlmIChiLnBhcmVudCA9PT0gYSkKKyAgICAgICAgICAgICAgICAg
ICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIGIgPSBiLnBhcmVudDsKKyAgICAgICAgICAg
ICAgICBiTGV2ZWwtLTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd2hpbGUgKGEucGFy
ZW50ICE9PSBiLnBhcmVudCkgeworICAgICAgICAgICAgICAgIGEgPSBhLnBhcmVudDsKKyAgICAg
ICAgICAgICAgICBiID0gYi5wYXJlbnQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNv
bnNvbGUuYXNzZXJ0KGEucGFyZW50ID09PSBiLnBhcmVudCwgIk1pc3NpbmcgY29tbW9uIGFuY2Vz
dG9yIGZvciBUcmVlRWxlbWVudHMuIiwgYSwgYik7CisgICAgICAgICAgICByZXR1cm4gY29tcGFy
ZVNpYmxpbmdzKGEsIGIpOworICAgICAgICB9OworICAgIH0KKworICAgIHN0YXRpYyBjcmVhdGVM
aXN0Q29tcGFyYXRvcihpbmRleEZvclJlcHJlc2VudGVkT2JqZWN0KQorICAgIHsKKyAgICAgICAg
Y29uc29sZS5hc3NlcnQoaW5kZXhGb3JSZXByZXNlbnRlZE9iamVjdCk7CisKKyAgICAgICAgcmV0
dXJuIChhLCBiKSA9PiB7CisgICAgICAgICAgICByZXR1cm4gaW5kZXhGb3JSZXByZXNlbnRlZE9i
amVjdChhKSAtIGluZGV4Rm9yUmVwcmVzZW50ZWRPYmplY3QoYik7CisgICAgICAgIH07CisgICAg
fQorCiAgICAgLy8gUHVibGljCiAKICAgICBnZXQgZGVsZWdhdGUoKSB7IHJldHVybiB0aGlzLl9k
ZWxlZ2F0ZTsgfQpAQCAtMTI5LDE3ICsxODksMTkgQEAgV0kuU2VsZWN0aW9uQ29udHJvbGxlciA9
IGNsYXNzIFNlbGVjdGlvbkNvbnRyb2xsZXIgZXh0ZW5kcyBXSS5PYmplY3QKICAgICAgICAgICAg
IHRoaXMuX2xhc3RTZWxlY3RlZEl0ZW0gPSBudWxsOwogCiAgICAgICAgICAgICBpZiAobmV3SXRl
bXMuc2l6ZSkgeworICAgICAgICAgICAgICAgIGNvbnN0IHJlYXNvbiA9IFdJLlNlbGVjdGlvbkNv
bnRyb2xsZXIuUmVhc29uLkV4dGVuZDsKKwogICAgICAgICAgICAgICAgIC8vIEZpbmQgc2VsZWN0
ZWQgaXRlbSBjbG9zZXN0IHRvIGRlc2VsZWN0ZWQgaXRlbS4KICAgICAgICAgICAgICAgICBsZXQg
cHJldmlvdXMgPSBpdGVtOwogICAgICAgICAgICAgICAgIGxldCBuZXh0ID0gaXRlbTsKICAgICAg
ICAgICAgICAgICB3aGlsZSAoIXRoaXMuX2xhc3RTZWxlY3RlZEl0ZW0gJiYgcHJldmlvdXMgJiYg
bmV4dCkgewotICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyA9IHRoaXMuX3ByZXZpb3VzU2Vs
ZWN0YWJsZUl0ZW0ocHJldmlvdXMpOworICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyA9IHRo
aXMuX3ByZXZpb3VzU2VsZWN0YWJsZUl0ZW0ocHJldmlvdXMsIHJlYXNvbik7CiAgICAgICAgICAg
ICAgICAgICAgIGlmICh0aGlzLmhhc1NlbGVjdGVkSXRlbShwcmV2aW91cykpIHsKICAgICAgICAg
ICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RTZWxlY3RlZEl0ZW0gPSBwcmV2aW91czsKICAgICAg
ICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAg
ICAgICAgICAgICAgICAgbmV4dCA9IHRoaXMuX25leHRTZWxlY3RhYmxlSXRlbShuZXh0KTsKKyAg
ICAgICAgICAgICAgICAgICAgbmV4dCA9IHRoaXMuX25leHRTZWxlY3RhYmxlSXRlbShuZXh0LCBy
ZWFzb24pOwogICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNTZWxlY3RlZEl0ZW0obmV4
dCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RTZWxlY3RlZEl0ZW0gPSBu
ZXh0OwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xNTksMTAgKzIyMSwxMCBA
QCBXSS5TZWxlY3Rpb25Db250cm9sbGVyID0gY2xhc3MgU2VsZWN0aW9uQ29udHJvbGxlciBleHRl
bmRzIFdJLk9iamVjdAogICAgICAgICBpZiAoIXRoaXMuX2FsbG93c011bHRpcGxlU2VsZWN0aW9u
KQogICAgICAgICAgICAgcmV0dXJuOwogCi0gICAgICAgIHRoaXMucmVzZXQoKTsKKyAgICAgICAg
Y29uc3QgcmVhc29uID0gV0kuU2VsZWN0aW9uQ29udHJvbGxlci5SZWFzb24uQWxsOwogCiAgICAg
ICAgIGxldCBuZXdJdGVtcyA9IG5ldyBTZXQ7Ci0gICAgICAgIHRoaXMuX2FkZFJhbmdlKG5ld0l0
ZW1zLCB0aGlzLl9maXJzdFNlbGVjdGFibGVJdGVtKCksIHRoaXMuX2xhc3RTZWxlY3RhYmxlSXRl
bSgpKTsKKyAgICAgICAgdGhpcy5fYWRkUmFuZ2UobmV3SXRlbXMsIHRoaXMuX2ZpcnN0U2VsZWN0
YWJsZUl0ZW0ocmVhc29uKSwgdGhpcy5fbGFzdFNlbGVjdGFibGVJdGVtKHJlYXNvbikpOwogICAg
ICAgICB0aGlzLnNlbGVjdEl0ZW1zKG5ld0l0ZW1zKTsKICAgICB9CiAKQEAgLTE3NiwyMiArMjM4
LDI0IEBAIFdJLlNlbGVjdGlvbkNvbnRyb2xsZXIgPSBjbGFzcyBTZWxlY3Rpb25Db250cm9sbGVy
IGV4dGVuZHMgV0kuT2JqZWN0CiAgICAgICAgIGlmICghdGhpcy5fc2VsZWN0ZWRJdGVtcy5zaXpl
KQogICAgICAgICAgICAgcmV0dXJuOwogCisgICAgICAgIGNvbnN0IHJlYXNvbiA9IFdJLlNlbGVj
dGlvbkNvbnRyb2xsZXIuUmVhc29uLkV4dGVuZDsKKwogICAgICAgICBsZXQgb3JkZXJlZFNlbGVj
dGlvbiA9IEFycmF5LmZyb20odGhpcy5fc2VsZWN0ZWRJdGVtcykuc29ydCh0aGlzLl9jb21wYXJh
dG9yKTsKIAogICAgICAgICAvLyBUcnkgc2VsZWN0aW5nIHRoZSBpdGVtIHByZWNlZGluZyB0aGUg
c2VsZWN0aW9uLgogICAgICAgICBsZXQgZmlyc3RTZWxlY3RlZEl0ZW0gPSBvcmRlcmVkU2VsZWN0
aW9uWzBdOwotICAgICAgICBsZXQgaXRlbVRvU2VsZWN0ID0gdGhpcy5fcHJldmlvdXNTZWxlY3Rh
YmxlSXRlbShmaXJzdFNlbGVjdGVkSXRlbSk7CisgICAgICAgIGxldCBpdGVtVG9TZWxlY3QgPSB0
aGlzLl9wcmV2aW91c1NlbGVjdGFibGVJdGVtKGZpcnN0U2VsZWN0ZWRJdGVtLCByZWFzb24pOwog
ICAgICAgICBpZiAoIWl0ZW1Ub1NlbGVjdCkgewogICAgICAgICAgICAgLy8gSWYgbm8gaXRlbSBl
eGlzdHMgYmVmb3JlIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBzZWxlY3Rpb24sIHRyeSBzZWxlY3Rp
bmcKICAgICAgICAgICAgIC8vIGEgZGVzZWxlY3RlZCBpdGVtIChob2xlKSB3aXRoaW4gdGhlIHNl
bGVjdGlvbi4KICAgICAgICAgICAgIGl0ZW1Ub1NlbGVjdCA9IGZpcnN0U2VsZWN0ZWRJdGVtOwog
ICAgICAgICAgICAgd2hpbGUgKGl0ZW1Ub1NlbGVjdCAmJiB0aGlzLmhhc1NlbGVjdGVkSXRlbShp
dGVtVG9TZWxlY3QpKQotICAgICAgICAgICAgICAgIGl0ZW1Ub1NlbGVjdCA9IHRoaXMuX25leHRT
ZWxlY3RhYmxlSXRlbShpdGVtVG9TZWxlY3QpOworICAgICAgICAgICAgICAgIGl0ZW1Ub1NlbGVj
dCA9IHRoaXMuX25leHRTZWxlY3RhYmxlSXRlbShpdGVtVG9TZWxlY3QsIHJlYXNvbik7CiAKICAg
ICAgICAgICAgIGlmICghaXRlbVRvU2VsZWN0IHx8IHRoaXMuaGFzU2VsZWN0ZWRJdGVtKGl0ZW1U
b1NlbGVjdCkpIHsKICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2VsZWN0aW9uIGNvbnRhaW5z
IG5vIGhvbGVzLCB0cnkgc2VsZWN0aW5nIHRoZSBpdGVtCiAgICAgICAgICAgICAgICAgLy8gZm9s
bG93aW5nIHRoZSBzZWxlY3Rpb24uCi0gICAgICAgICAgICAgICAgaXRlbVRvU2VsZWN0ID0gdGhp
cy5fbmV4dFNlbGVjdGFibGVJdGVtKG9yZGVyZWRTZWxlY3Rpb24ubGFzdFZhbHVlKTsKKyAgICAg
ICAgICAgICAgICBpdGVtVG9TZWxlY3QgPSB0aGlzLl9uZXh0U2VsZWN0YWJsZUl0ZW0ob3JkZXJl
ZFNlbGVjdGlvbi5sYXN0VmFsdWUsIHJlYXNvbik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0K
IApAQCAtMjY1LDcgKzMyOSw3IEBAIFdJLlNlbGVjdGlvbkNvbnRyb2xsZXIgPSBjbGFzcyBTZWxl
Y3Rpb25Db250cm9sbGVyIGV4dGVuZHMgV0kuT2JqZWN0CiAgICAgICAgIC8vIHRocm91Z2ggdGhl
IGNsaWNrZWQgaXRlbSB0byBiZSBzZWxlY3RlZC4KICAgICAgICAgaWYgKCFuZXdJdGVtcy5zaXpl
KSB7CiAgICAgICAgICAgICB0aGlzLl9sYXN0U2VsZWN0ZWRJdGVtID0gaXRlbTsKLSAgICAgICAg
ICAgIHRoaXMuX3NoaWZ0QW5jaG9ySXRlbSA9IHRoaXMuX2ZpcnN0U2VsZWN0YWJsZUl0ZW0oKTsK
KyAgICAgICAgICAgIHRoaXMuX3NoaWZ0QW5jaG9ySXRlbSA9IHRoaXMuX2ZpcnN0U2VsZWN0YWJs
ZUl0ZW0oV0kuU2VsZWN0aW9uQ29udHJvbGxlci5SZWFzb24uRGlyZWN0KTsKIAogICAgICAgICAg
ICAgdGhpcy5fYWRkUmFuZ2UobmV3SXRlbXMsIHRoaXMuX3NoaWZ0QW5jaG9ySXRlbSwgdGhpcy5f
bGFzdFNlbGVjdGVkSXRlbSk7CiAgICAgICAgICAgICB0aGlzLl91cGRhdGVTZWxlY3RlZEl0ZW1z
KG5ld0l0ZW1zKTsKQEAgLTMyMCwxNiArMzg0LDE4IEBAIFdJLlNlbGVjdGlvbkNvbnRyb2xsZXIg
PSBjbGFzcyBTZWxlY3Rpb25Db250cm9sbGVyIGV4dGVuZHMgV0kuT2JqZWN0CiAKICAgICBfc2Vs
ZWN0SXRlbXNGcm9tQXJyb3dLZXkoZ29pbmdVcCwgc2hpZnRLZXkpCiAgICAgeworICAgICAgICBs
ZXQgZXh0ZW5kU2VsZWN0aW9uID0gc2hpZnRLZXkgJiYgdGhpcy5fYWxsb3dzTXVsdGlwbGVTZWxl
Y3Rpb247CisgICAgICAgIGxldCByZWFzb24gPSAoZXh0ZW5kU2VsZWN0aW9uICYmIHRoaXMuX3Nl
bGVjdGVkSXRlbXMuc2l6ZSkgPyBXSS5TZWxlY3Rpb25Db250cm9sbGVyLlJlYXNvbi5FeHRlbmQg
OiBXSS5TZWxlY3Rpb25Db250cm9sbGVyLlJlYXNvbi5EaXJlY3Q7CisKICAgICAgICAgaWYgKCF0
aGlzLl9zZWxlY3RlZEl0ZW1zLnNpemUpIHsKLSAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbShn
b2luZ1VwID8gdGhpcy5fbGFzdFNlbGVjdGFibGVJdGVtKCkgOiB0aGlzLl9maXJzdFNlbGVjdGFi
bGVJdGVtKCkpOworICAgICAgICAgICAgdGhpcy5zZWxlY3RJdGVtKGdvaW5nVXAgPyB0aGlzLl9s
YXN0U2VsZWN0YWJsZUl0ZW0ocmVhc29uKSA6IHRoaXMuX2ZpcnN0U2VsZWN0YWJsZUl0ZW0ocmVh
c29uKSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBsZXQgaXRl
bSA9IGdvaW5nVXAgPyB0aGlzLl9wcmV2aW91c1NlbGVjdGFibGVJdGVtKHRoaXMuX2xhc3RTZWxl
Y3RlZEl0ZW0pIDogdGhpcy5fbmV4dFNlbGVjdGFibGVJdGVtKHRoaXMuX2xhc3RTZWxlY3RlZEl0
ZW0pOworICAgICAgICBsZXQgaXRlbSA9IGdvaW5nVXAgPyB0aGlzLl9wcmV2aW91c1NlbGVjdGFi
bGVJdGVtKHRoaXMuX2xhc3RTZWxlY3RlZEl0ZW0sIHJlYXNvbikgOiB0aGlzLl9uZXh0U2VsZWN0
YWJsZUl0ZW0odGhpcy5fbGFzdFNlbGVjdGVkSXRlbSwgcmVhc29uKTsKICAgICAgICAgaWYgKCFp
dGVtKQogICAgICAgICAgICAgcmV0dXJuOwogCi0gICAgICAgIGxldCBleHRlbmRTZWxlY3Rpb24g
PSBzaGlmdEtleSAmJiB0aGlzLl9hbGxvd3NNdWx0aXBsZVNlbGVjdGlvbjsKICAgICAgICAgaWYg
KCFleHRlbmRTZWxlY3Rpb24gfHwgIXRoaXMuaGFzU2VsZWN0ZWRJdGVtKGl0ZW0pKSB7CiAgICAg
ICAgICAgICB0aGlzLnNlbGVjdEl0ZW0oaXRlbSwgZXh0ZW5kU2VsZWN0aW9uKTsKICAgICAgICAg
ICAgIHJldHVybjsKQEAgLTMzOCw3ICs0MDQsNyBAQCBXSS5TZWxlY3Rpb25Db250cm9sbGVyID0g
Y2xhc3MgU2VsZWN0aW9uQ29udHJvbGxlciBleHRlbmRzIFdJLk9iamVjdAogICAgICAgICAvLyBT
aW5jZSB0aGUgaXRlbSBpbiB0aGUgZGlyZWN0aW9uIG9mIG1vdmVtZW50IGlzIHNlbGVjdGVkLCB3
ZSBhcmUgZWl0aGVyCiAgICAgICAgIC8vIGV4dGVuZGluZyB0aGUgc2VsZWN0aW9uIGludG8gdGhl
IGl0ZW0sIG9yIGRlc2VsZWN0aW5nLiBEZXRlcm1pbmUgd2hpY2gKICAgICAgICAgLy8gYnkgY2hl
Y2tpbmcgd2hldGhlciB0aGUgaXRlbSBvcHBvc2l0ZSB0aGUgYW5jaG9yIGl0ZW0gaXMgc2VsZWN0
ZWQuCi0gICAgICAgIGxldCBwcmlvckl0ZW0gPSBnb2luZ1VwID8gdGhpcy5fbmV4dFNlbGVjdGFi
bGVJdGVtKHRoaXMuX2xhc3RTZWxlY3RlZEl0ZW0pIDogdGhpcy5fcHJldmlvdXNTZWxlY3RhYmxl
SXRlbSh0aGlzLl9sYXN0U2VsZWN0ZWRJdGVtKTsKKyAgICAgICAgbGV0IHByaW9ySXRlbSA9IGdv
aW5nVXAgPyB0aGlzLl9uZXh0U2VsZWN0YWJsZUl0ZW0odGhpcy5fbGFzdFNlbGVjdGVkSXRlbSwg
cmVhc29uKSA6IHRoaXMuX3ByZXZpb3VzU2VsZWN0YWJsZUl0ZW0odGhpcy5fbGFzdFNlbGVjdGVk
SXRlbSwgcmVhc29uKTsKICAgICAgICAgaWYgKCFwcmlvckl0ZW0gfHwgIXRoaXMuaGFzU2VsZWN0
ZWRJdGVtKHByaW9ySXRlbSkpIHsKICAgICAgICAgICAgIHRoaXMuZGVzZWxlY3RJdGVtKHRoaXMu
X2xhc3RTZWxlY3RlZEl0ZW0pOwogICAgICAgICAgICAgcmV0dXJuOwpAQCAtMzU0LDI4ICs0MjAs
MjggQEAgV0kuU2VsZWN0aW9uQ29udHJvbGxlciA9IGNsYXNzIFNlbGVjdGlvbkNvbnRyb2xsZXIg
ZXh0ZW5kcyBXSS5PYmplY3QKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdGhpcy5fbGFz
dFNlbGVjdGVkSXRlbSA9IGl0ZW07Ci0gICAgICAgICAgICBpdGVtID0gZ29pbmdVcCA/IHRoaXMu
X3ByZXZpb3VzU2VsZWN0YWJsZUl0ZW0oaXRlbSkgOiB0aGlzLl9uZXh0U2VsZWN0YWJsZUl0ZW0o
aXRlbSk7CisgICAgICAgICAgICBpdGVtID0gZ29pbmdVcCA/IHRoaXMuX3ByZXZpb3VzU2VsZWN0
YWJsZUl0ZW0oaXRlbSwgcmVhc29uKSA6IHRoaXMuX25leHRTZWxlY3RhYmxlSXRlbShpdGVtLCBy
ZWFzb24pOwogICAgICAgICB9CiAgICAgfQogCi0gICAgX2ZpcnN0U2VsZWN0YWJsZUl0ZW0oKQor
ICAgIF9maXJzdFNlbGVjdGFibGVJdGVtKHJlYXNvbikKICAgICB7Ci0gICAgICAgIHJldHVybiB0
aGlzLl9kZWxlZ2F0ZS5zZWxlY3Rpb25Db250cm9sbGVyRmlyc3RTZWxlY3RhYmxlSXRlbSh0aGlz
KTsKKyAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLnNlbGVjdGlvbkNvbnRyb2xsZXJGaXJz
dFNlbGVjdGFibGVJdGVtKHRoaXMsIHJlYXNvbik7CiAgICAgfQogCi0gICAgX2xhc3RTZWxlY3Rh
YmxlSXRlbSgpCisgICAgX2xhc3RTZWxlY3RhYmxlSXRlbShyZWFzb24pCiAgICAgewotICAgICAg
ICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuc2VsZWN0aW9uQ29udHJvbGxlckxhc3RTZWxlY3RhYmxl
SXRlbSh0aGlzKTsKKyAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLnNlbGVjdGlvbkNvbnRy
b2xsZXJMYXN0U2VsZWN0YWJsZUl0ZW0odGhpcywgcmVhc29uKTsKICAgICB9CiAKLSAgICBfcHJl
dmlvdXNTZWxlY3RhYmxlSXRlbShpdGVtKQorICAgIF9wcmV2aW91c1NlbGVjdGFibGVJdGVtKGl0
ZW0sIHJlYXNvbikKICAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5zZWxlY3Rp
b25Db250cm9sbGVyUHJldmlvdXNTZWxlY3RhYmxlSXRlbSh0aGlzLCBpdGVtKTsKKyAgICAgICAg
cmV0dXJuIHRoaXMuX2RlbGVnYXRlLnNlbGVjdGlvbkNvbnRyb2xsZXJQcmV2aW91c1NlbGVjdGFi
bGVJdGVtKHRoaXMsIGl0ZW0sIHJlYXNvbik7CiAgICAgfQogCi0gICAgX25leHRTZWxlY3RhYmxl
SXRlbShpdGVtKQorICAgIF9uZXh0U2VsZWN0YWJsZUl0ZW0oaXRlbSwgcmVhc29uKQogICAgIHsK
LSAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLnNlbGVjdGlvbkNvbnRyb2xsZXJOZXh0U2Vs
ZWN0YWJsZUl0ZW0odGhpcywgaXRlbSk7CisgICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5z
ZWxlY3Rpb25Db250cm9sbGVyTmV4dFNlbGVjdGFibGVJdGVtKHRoaXMsIGl0ZW0sIHJlYXNvbik7
CiAgICAgfQogCiAgICAgX3VwZGF0ZVNlbGVjdGVkSXRlbXMoaXRlbXMpCkBAIC0zOTQsMTIgKzQ2
MCwxNCBAQCBXSS5TZWxlY3Rpb25Db250cm9sbGVyID0gY2xhc3MgU2VsZWN0aW9uQ29udHJvbGxl
ciBleHRlbmRzIFdJLk9iamVjdAogCiAgICAgX2FkZFJhbmdlKGl0ZW1zLCBmaXJzdEl0ZW0sIGxh
c3RJdGVtKQogICAgIHsKKyAgICAgICAgY29uc3QgcmVhc29uID0gV0kuU2VsZWN0aW9uQ29udHJv
bGxlci5SZWFzb24uRXh0ZW5kOworCiAgICAgICAgIGxldCBjdXJyZW50ID0gZmlyc3RJdGVtOwog
ICAgICAgICB3aGlsZSAoY3VycmVudCkgewogICAgICAgICAgICAgaXRlbXMuYWRkKGN1cnJlbnQp
OwogICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT09IGxhc3RJdGVtKQogICAgICAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICAgICAgY3VycmVudCA9IHRoaXMuX25leHRTZWxlY3RhYmxlSXRlbShj
dXJyZW50KTsKKyAgICAgICAgICAgIGN1cnJlbnQgPSB0aGlzLl9uZXh0U2VsZWN0YWJsZUl0ZW0o
Y3VycmVudCwgcmVhc29uKTsKICAgICAgICAgfQogCiAgICAgICAgIGNvbnNvbGUuYXNzZXJ0KCFs
YXN0SXRlbSB8fCBpdGVtcy5oYXMobGFzdEl0ZW0pLCAiRW5kIG9mIHJhbmdlIGNvdWxkIG5vdCBi
ZSByZWFjaGVkLiIpOwpAQCAtNDA3LDE0ICs0NzUsMjIgQEAgV0kuU2VsZWN0aW9uQ29udHJvbGxl
ciA9IGNsYXNzIFNlbGVjdGlvbkNvbnRyb2xsZXIgZXh0ZW5kcyBXSS5PYmplY3QKIAogICAgIF9k
ZWxldGVSYW5nZShpdGVtcywgZmlyc3RJdGVtLCBsYXN0SXRlbSkKICAgICB7CisgICAgICAgIGNv
bnN0IHJlYXNvbiA9IFdJLlNlbGVjdGlvbkNvbnRyb2xsZXIuUmVhc29uLkV4dGVuZDsKKwogICAg
ICAgICBsZXQgY3VycmVudCA9IGZpcnN0SXRlbTsKICAgICAgICAgd2hpbGUgKGN1cnJlbnQpIHsK
ICAgICAgICAgICAgIGl0ZW1zLmRlbGV0ZShjdXJyZW50KTsKICAgICAgICAgICAgIGlmIChjdXJy
ZW50ID09PSBsYXN0SXRlbSkKICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGN1
cnJlbnQgPSB0aGlzLl9uZXh0U2VsZWN0YWJsZUl0ZW0oY3VycmVudCk7CisgICAgICAgICAgICBj
dXJyZW50ID0gdGhpcy5fbmV4dFNlbGVjdGFibGVJdGVtKGN1cnJlbnQsIHJlYXNvbik7CiAgICAg
ICAgIH0KIAogICAgICAgICBjb25zb2xlLmFzc2VydCghbGFzdEl0ZW0gfHwgIWl0ZW1zLmhhcyhs
YXN0SXRlbSksICJFbmQgb2YgcmFuZ2UgY291bGQgbm90IGJlIHJlYWNoZWQuIik7CiAgICAgfQog
fTsKKworV0kuU2VsZWN0aW9uQ29udHJvbGxlci5SZWFzb24gPSB7CisgICAgRGlyZWN0OiBTeW1i
b2woInNlbGVjdGlvbi1yZWFzb24tZGlyZWN0IiksCisgICAgRXh0ZW5kOiBTeW1ib2woInNlbGVj
dGlvbi1yZWFzb24tZXh0ZW5kIiksCisgICAgQWxsOiBTeW1ib2woInNlbGVjdGlvbi1yZWFzb24t
YWxsIiksCit9OwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJbnRlcmZh
Y2UvVmlld3MvRE9NU3RvcmFnZUNvbnRlbnRWaWV3LmpzIGIvU291cmNlL1dlYkluc3BlY3RvclVJ
L1VzZXJJbnRlcmZhY2UvVmlld3MvRE9NU3RvcmFnZUNvbnRlbnRWaWV3LmpzCmluZGV4IDU3NTk5
YTdkYjZkMmVkZDVjNjA5ZTYxZGRmOGJmY2RmM2E2YzQxZWYuLjM1ZTRiYjRiMGU4NjIwZWM2MzNi
MTZkYWI5ZWYzNzE5ZTA3ZDExMDEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJJbnNwZWN0b3JVSS9V
c2VySW50ZXJmYWNlL1ZpZXdzL0RPTVN0b3JhZ2VDb250ZW50Vmlldy5qcworKysgYi9Tb3VyY2Uv
V2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9WaWV3cy9ET01TdG9yYWdlQ29udGVudFZpZXcu
anMKQEAgLTQ4LDYgKzQ4LDcgQEAgV0kuRE9NU3RvcmFnZUNvbnRlbnRWaWV3ID0gY2xhc3MgRE9N
U3RvcmFnZUNvbnRlbnRWaWV3IGV4dGVuZHMgV0kuQ29udGVudFZpZXcKICAgICAgICAgfSk7CiAg
ICAgICAgIHRoaXMuX2RhdGFHcmlkLnNvcnRPcmRlciA9IFdJLkRhdGFHcmlkLlNvcnRPcmRlci5B
c2NlbmRpbmc7CiAgICAgICAgIHRoaXMuX2RhdGFHcmlkLnNvcnRDb2x1bW5JZGVudGlmaWVyID0g
ImtleSI7CisgICAgICAgIHRoaXMuX2RhdGFHcmlkLmFsbG93c011bHRpcGxlU2VsZWN0aW9uID0g
dHJ1ZTsKICAgICAgICAgdGhpcy5fZGF0YUdyaWQuY3JlYXRlU2V0dGluZ3MoImRvbS1zdG9yYWdl
LWNvbnRlbnQtdmlldyIpOwogICAgICAgICB0aGlzLl9kYXRhR3JpZC5hZGRFdmVudExpc3RlbmVy
KFdJLkRhdGFHcmlkLkV2ZW50LlNvcnRDaGFuZ2VkLCB0aGlzLl9zb3J0RGF0YUdyaWQsIHRoaXMp
OwogICAgICAgICB0aGlzLmFkZFN1YnZpZXcodGhpcy5fZGF0YUdyaWQpOwpAQCAtMTkzLDEzICsx
OTQsMTQgQEAgV0kuRE9NU3RvcmFnZUNvbnRlbnRWaWV3ID0gY2xhc3MgRE9NU3RvcmFnZUNvbnRl
bnRWaWV3IGV4dGVuZHMgV0kuQ29udGVudFZpZXcKICAgICAgICAgdGhpcy5fZGF0YUdyaWQuc29y
dE5vZGVzSW1tZWRpYXRlbHkoY29tcGFyYXRvcik7CiAgICAgfQogCi0gICAgX2RlbGV0ZUNhbGxi
YWNrKG5vZGUpCisgICAgX2RlbGV0ZUNhbGxiYWNrKCkKICAgICB7Ci0gICAgICAgIGlmICghbm9k
ZSB8fCBub2RlLmlzUGxhY2Vob2xkZXJOb2RlKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAg
ICAgIHRoaXMuX2RhdGFHcmlkLnJlbW92ZUNoaWxkKG5vZGUpOwotICAgICAgICB0aGlzLnJlcHJl
c2VudGVkT2JqZWN0LnJlbW92ZUl0ZW0obm9kZS5kYXRhWyJrZXkiXSk7CisgICAgICAgIGZvciAo
bGV0IGRhdGFHcmlkTm9kZSBvZiB0aGlzLl9kYXRhR3JpZC5zZWxlY3RlZERhdGFHcmlkTm9kZXMp
IHsKKyAgICAgICAgICAgIGlmIChkYXRhR3JpZE5vZGUuaXNQbGFjZWhvbGRlck5vZGUpCisgICAg
ICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB0aGlzLl9kYXRhR3JpZC5yZW1vdmVD
aGlsZChkYXRhR3JpZE5vZGUpOworICAgICAgICAgICAgdGhpcy5yZXByZXNlbnRlZE9iamVjdC5y
ZW1vdmVJdGVtKGRhdGFHcmlkTm9kZS5kYXRhWyJrZXkiXSk7CisgICAgICAgIH0KICAgICB9CiAK
ICAgICBfZWRpdGluZ0NhbGxiYWNrKGVkaXRpbmdOb2RlLCBjb2x1bW5JZGVudGlmaWVyLCBvbGRU
ZXh0LCBuZXdUZXh0LCBtb3ZlRGlyZWN0aW9uKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkluc3Bl
Y3RvclVJL1VzZXJJbnRlcmZhY2UvVmlld3MvRGF0YUdyaWQuanMgYi9Tb3VyY2UvV2ViSW5zcGVj
dG9yVUkvVXNlckludGVyZmFjZS9WaWV3cy9EYXRhR3JpZC5qcwppbmRleCBiYzViYTc1ZmI1NDEy
YTE1NDllMzI1M2U2YzgyN2NlNTFjODdiMzQzLi44YjEyNjI4OGFiNGJjYjdhMmExMDZhY2VjODIw
MjlkYWIzZjhmNjBiIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVy
ZmFjZS9WaWV3cy9EYXRhR3JpZC5qcworKysgYi9Tb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlcklu
dGVyZmFjZS9WaWV3cy9EYXRhR3JpZC5qcwpAQCAtNDQsNyArNDQsNiBAQCBXSS5EYXRhR3JpZCA9
IGNsYXNzIERhdGFHcmlkIGV4dGVuZHMgV0kuVmlldwogICAgICAgICB0aGlzLl9yb3dzID0gW107
CiAKICAgICAgICAgdGhpcy5jaGlsZHJlbiA9IFtdOwotICAgICAgICB0aGlzLnNlbGVjdGVkTm9k
ZSA9IG51bGw7CiAgICAgICAgIHRoaXMuZXhwYW5kTm9kZXNXaGVuQXJyb3dpbmcgPSBmYWxzZTsK
ICAgICAgICAgdGhpcy5yb290ID0gdHJ1ZTsKICAgICAgICAgdGhpcy5oYXNDaGlsZHJlbiA9IGZh
bHNlOwpAQCAtNjgsNiArNjcsMTMgQEAgV0kuRGF0YUdyaWQgPSBjbGFzcyBEYXRhR3JpZCBleHRl
bmRzIFdJLlZpZXcKICAgICAgICAgdGhpcy5fZmlsdGVyRGVsZWdhdGUgPSBudWxsOwogICAgICAg
ICB0aGlzLl9maWx0ZXJEaWRNb2RpZnlOb2RlV2hpbGVQcm9jZXNzaW5nSXRlbXMgPSBmYWxzZTsK
IAorICAgICAgICBsZXQgaXRlbUZvclJlcHJlc2VudGVkT2JqZWN0ID0gdGhpcy5kYXRhR3JpZE5v
ZGVGb3JTZWxlY3Rpb25JdGVtLmJpbmQodGhpcyk7CisgICAgICAgIGxldCBzZWxlY3Rpb25Db21w
YXJhdG9yID0gV0kuU2VsZWN0aW9uQ29udHJvbGxlci5jcmVhdGVUcmVlQ29tcGFyYXRvcihpdGVt
Rm9yUmVwcmVzZW50ZWRPYmplY3QpOworICAgICAgICB0aGlzLl9zZWxlY3Rpb25Db250cm9sbGVy
ID0gbmV3IFdJLlNlbGVjdGlvbkNvbnRyb2xsZXIodGhpcywgc2VsZWN0aW9uQ29tcGFyYXRvcik7
CisKKyAgICAgICAgdGhpcy5fcHJvY2Vzc2luZ1NlbGVjdGlvbkNoYW5nZSA9IGZhbHNlOworICAg
ICAgICB0aGlzLl9zdXBwcmVzc05leHRTZWxlY3Rpb25EaWRDaGFuZ2VFdmVudCA9IGZhbHNlOwor
CiAgICAgICAgIHRoaXMuZWxlbWVudC5jbGFzc05hbWUgPSAiZGF0YS1ncmlkIjsKICAgICAgICAg
dGhpcy5lbGVtZW50LnRhYkluZGV4ID0gMDsKICAgICAgICAgdGhpcy5lbGVtZW50LmFkZEV2ZW50
TGlzdGVuZXIoImtleWRvd24iLCB0aGlzLl9rZXlEb3duLmJpbmQodGhpcyksIGZhbHNlKTsKQEAg
LTMxOCw2ICszMjQsNDUgQEAgV0kuRGF0YUdyaWQgPSBjbGFzcyBEYXRhR3JpZCBleHRlbmRzIFdJ
LlZpZXcKICAgICAgICAgdGhpcy5fdXBkYXRlU2Nyb2xsTGlzdGVuZXJzKCk7CiAgICAgfQogCisg
ICAgZ2V0IGFsbG93c011bHRpcGxlU2VsZWN0aW9uKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0
aGlzLl9zZWxlY3Rpb25Db250cm9sbGVyLmFsbG93c011bHRpcGxlU2VsZWN0aW9uOworICAgIH0K
KworICAgIHNldCBhbGxvd3NNdWx0aXBsZVNlbGVjdGlvbihmbGFnKQorICAgIHsKKyAgICAgICAg
dGhpcy5fc2VsZWN0aW9uQ29udHJvbGxlci5hbGxvd3NNdWx0aXBsZVNlbGVjdGlvbiA9IGZsYWc7
CisgICAgfQorCisgICAgZ2V0IHNlbGVjdGVkTm9kZSgpCisgICAgeworICAgICAgICByZXR1cm4g
dGhpcy5kYXRhR3JpZE5vZGVGb3JTZWxlY3Rpb25JdGVtKHRoaXMuX3NlbGVjdGlvbkNvbnRyb2xs
ZXIubGFzdFNlbGVjdGVkSXRlbSk7CisgICAgfQorCisgICAgc2V0IHNlbGVjdGVkTm9kZShkYXRh
R3JpZE5vZGUpCisgICAgeworICAgICAgICBpZiAoZGF0YUdyaWROb2RlKQorICAgICAgICAgICAg
dGhpcy5fc2VsZWN0aW9uQ29udHJvbGxlci5zZWxlY3RJdGVtKHRoaXMuc2VsZWN0aW9uSXRlbUZv
ckRhdGFHcmlkTm9kZShkYXRhR3JpZE5vZGUpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAg
dGhpcy5fc2VsZWN0aW9uQ29udHJvbGxlci5kZXNlbGVjdEFsbCgpOworICAgIH0KKworICAgIGdl
dCBzZWxlY3RlZERhdGFHcmlkTm9kZXMoKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMuYWxsb3dz
TXVsdGlwbGVTZWxlY3Rpb24pIHsKKyAgICAgICAgICAgIGxldCBzZWxlY3RlZERhdGFHcmlkTm9k
ZXMgPSBbXTsKKyAgICAgICAgICAgIGZvciAobGV0IGl0ZW0gb2YgdGhpcy5fc2VsZWN0aW9uQ29u
dHJvbGxlci5zZWxlY3RlZEl0ZW1zKQorICAgICAgICAgICAgICAgIHNlbGVjdGVkRGF0YUdyaWRO
b2Rlcy5wdXNoKHRoaXMuZGF0YUdyaWROb2RlRm9yU2VsZWN0aW9uSXRlbShpdGVtKSk7CisgICAg
ICAgICAgICByZXR1cm4gc2VsZWN0ZWREYXRhR3JpZE5vZGVzOworICAgICAgICB9CisKKyAgICAg
ICAgbGV0IHNlbGVjdGVkTm9kZSA9IHRoaXMuc2VsZWN0ZWROb2RlOworICAgICAgICBpZiAoc2Vs
ZWN0ZWROb2RlKQorICAgICAgICAgICAgcmV0dXJuIFtzZWxlY3RlZE5vZGVdOworCisgICAgICAg
IHJldHVybiBbXTsKKyAgICB9CisKICAgICBnZXQgZmlsdGVyVGV4dCgpIHsgcmV0dXJuIHRoaXMu
X2ZpbHRlclRleHQ7IH0KIAogICAgIHNldCBmaWx0ZXJUZXh0KHgpCkBAIC0xMzY2LDY0ICsxNDEx
LDcwIEBAIFdJLkRhdGFHcmlkID0gY2xhc3MgRGF0YUdyaWQgZXh0ZW5kcyBXSS5WaWV3CiAKICAg
ICBfa2V5RG93bihldmVudCkKICAgICB7Ci0gICAgICAgIGlmICghdGhpcy5zZWxlY3RlZE5vZGUg
fHwgZXZlbnQuc2hpZnRLZXkgfHwgZXZlbnQubWV0YUtleSB8fCBldmVudC5jdHJsS2V5IHx8IHRo
aXMuX2VkaXRpbmcpCisgICAgICAgIGlmICh0aGlzLl9lZGl0aW5nKQogICAgICAgICAgICAgcmV0
dXJuOwogCi0gICAgICAgIGxldCBpc1JUTCA9IFdJLnJlc29sdmVkTGF5b3V0RGlyZWN0aW9uKCkg
PT09IFdJLkxheW91dERpcmVjdGlvbi5SVEw7CisgICAgICAgIGxldCBpc1JUTCA9IFdJLnJlc29s
dmVMYXlvdXREaXJlY3Rpb25Gb3JFbGVtZW50KHRoaXMuZWxlbWVudCkgPT09IFdJLkxheW91dERp
cmVjdGlvbi5SVEw7CisgICAgICAgIGxldCBleHBhbmRLZXlJZGVudGlmaWVyID0gaXNSVEwgPyAi
TGVmdCIgOiAiUmlnaHQiOworICAgICAgICBsZXQgY29sbGFwc2VLZXlJZGVudGlmaWVyID0gaXNS
VEwgPyAiUmlnaHQiIDogIkxlZnQiOwogCiAgICAgICAgIHZhciBoYW5kbGVkID0gZmFsc2U7CiAg
ICAgICAgIHZhciBuZXh0U2VsZWN0ZWROb2RlOwotICAgICAgICBpZiAoZXZlbnQua2V5SWRlbnRp
ZmllciA9PT0gIlVwIiAmJiAhZXZlbnQuYWx0S2V5KSB7Ci0gICAgICAgICAgICBuZXh0U2VsZWN0
ZWROb2RlID0gdGhpcy5zZWxlY3RlZE5vZGUudHJhdmVyc2VQcmV2aW91c05vZGUodHJ1ZSk7Ci0g
ICAgICAgICAgICB3aGlsZSAobmV4dFNlbGVjdGVkTm9kZSAmJiAhbmV4dFNlbGVjdGVkTm9kZS5z
ZWxlY3RhYmxlKQotICAgICAgICAgICAgICAgIG5leHRTZWxlY3RlZE5vZGUgPSBuZXh0U2VsZWN0
ZWROb2RlLnRyYXZlcnNlUHJldmlvdXNOb2RlKHRydWUpOwotICAgICAgICAgICAgaGFuZGxlZCA9
IG5leHRTZWxlY3RlZE5vZGUgPyB0cnVlIDogZmFsc2U7Ci0gICAgICAgIH0gZWxzZSBpZiAoZXZl
bnQua2V5SWRlbnRpZmllciA9PT0gIkRvd24iICYmICFldmVudC5hbHRLZXkpIHsKLSAgICAgICAg
ICAgIG5leHRTZWxlY3RlZE5vZGUgPSB0aGlzLnNlbGVjdGVkTm9kZS50cmF2ZXJzZU5leHROb2Rl
KHRydWUpOwotICAgICAgICAgICAgd2hpbGUgKG5leHRTZWxlY3RlZE5vZGUgJiYgIW5leHRTZWxl
Y3RlZE5vZGUuc2VsZWN0YWJsZSkKLSAgICAgICAgICAgICAgICBuZXh0U2VsZWN0ZWROb2RlID0g
bmV4dFNlbGVjdGVkTm9kZS50cmF2ZXJzZU5leHROb2RlKHRydWUpOwotICAgICAgICAgICAgaGFu
ZGxlZCA9IG5leHRTZWxlY3RlZE5vZGUgPyB0cnVlIDogZmFsc2U7Ci0gICAgICAgIH0gZWxzZSBp
ZiAoKCFpc1JUTCAmJiBldmVudC5rZXlJZGVudGlmaWVyID09PSAiTGVmdCIpIHx8IChpc1JUTCAm
JiBldmVudC5rZXlJZGVudGlmaWVyID09PSAiUmlnaHQiKSkgewotICAgICAgICAgICAgaWYgKHRo
aXMuc2VsZWN0ZWROb2RlLmV4cGFuZGVkKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmFs
dEtleSkKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE5vZGUuY29sbGFwc2VSZWN1
cnNpdmVseSgpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgdGhp
cy5zZWxlY3RlZE5vZGUuY29sbGFwc2UoKTsKLSAgICAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1
ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZE5vZGUucGFyZW50ICYmICF0
aGlzLnNlbGVjdGVkTm9kZS5wYXJlbnQucm9vdCkgewotICAgICAgICAgICAgICAgIGhhbmRsZWQg
PSB0cnVlOwotICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkTm9kZS5wYXJlbnQuc2Vs
ZWN0YWJsZSkgewotICAgICAgICAgICAgICAgICAgICBuZXh0U2VsZWN0ZWROb2RlID0gdGhpcy5z
ZWxlY3RlZE5vZGUucGFyZW50OwotICAgICAgICAgICAgICAgICAgICBoYW5kbGVkID0gbmV4dFNl
bGVjdGVkTm9kZSA/IHRydWUgOiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRo
aXMuc2VsZWN0ZWROb2RlLnBhcmVudCkKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rl
ZE5vZGUucGFyZW50LmNvbGxhcHNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBp
ZiAoKCFpc1JUTCAmJiBldmVudC5rZXlJZGVudGlmaWVyID09PSAiUmlnaHQiKSB8fCAoaXNSVEwg
JiYgZXZlbnQua2V5SWRlbnRpZmllciA9PT0gIkxlZnQiKSkgewotICAgICAgICAgICAgaWYgKCF0
aGlzLnNlbGVjdGVkTm9kZS5yZXZlYWxlZCkgewotICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0
ZWROb2RlLnJldmVhbCgpOwotICAgICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwotICAgICAg
ICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkTm9kZS5oYXNDaGlsZHJlbikgewotICAgICAg
ICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOworCisgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkTm9k
ZSkgeworICAgICAgICAgICAgaWYgKGV2ZW50LmtleUlkZW50aWZpZXIgPT09IGNvbGxhcHNlS2V5
SWRlbnRpZmllcikgewogICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkTm9kZS5leHBh
bmRlZCkgewotICAgICAgICAgICAgICAgICAgICBuZXh0U2VsZWN0ZWROb2RlID0gdGhpcy5zZWxl
Y3RlZE5vZGUuY2hpbGRyZW5bMF07Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZWQgPSBuZXh0
U2VsZWN0ZWROb2RlID8gdHJ1ZSA6IGZhbHNlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAg
ICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5hbHRLZXkpCi0gICAgICAgICAgICAgICAgICAg
ICAgICB0aGlzLnNlbGVjdGVkTm9kZS5leHBhbmRSZWN1cnNpdmVseSgpOworICAgICAgICAgICAg
ICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE5vZGUuY29sbGFwc2VSZWN1cnNpdmVseSgpOwogICAg
ICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVj
dGVkTm9kZS5leHBhbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRO
b2RlLmNvbGxhcHNlKCk7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOworICAg
ICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZE5vZGUucGFyZW50ICYmICF0aGlz
LnNlbGVjdGVkTm9kZS5wYXJlbnQucm9vdCkgeworICAgICAgICAgICAgICAgICAgICBoYW5kbGVk
ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWROb2RlLnBhcmVu
dC5zZWxlY3RhYmxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U2VsZWN0ZWROb2Rl
ID0gdGhpcy5zZWxlY3RlZE5vZGUucGFyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgd2hp
bGUgKG5leHRTZWxlY3RlZE5vZGUgJiYgIW5leHRTZWxlY3RlZE5vZGUuc2VsZWN0YWJsZSkKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U2VsZWN0ZWROb2RlID0gbmV4dFNlbGVjdGVk
Tm9kZS5wYXJlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVkID0gbmV4dFNlbGVj
dGVkTm9kZSA/IHRydWUgOiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0
aGlzLnNlbGVjdGVkTm9kZS5wYXJlbnQpCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNl
bGVjdGVkTm9kZS5wYXJlbnQuY29sbGFwc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleUlkZW50aWZpZXIgPT09IGV4cGFuZEtleUlkZW50aWZp
ZXIpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWROb2RlLnJldmVhbGVkKSB7
CisgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWROb2RlLnJldmVhbCgpOworICAgICAg
ICAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYg
KHRoaXMuc2VsZWN0ZWROb2RlLmhhc0NoaWxkcmVuKSB7CisgICAgICAgICAgICAgICAgICAgIGhh
bmRsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZE5vZGUu
ZXhwYW5kZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHRTZWxlY3RlZE5vZGUgPSB0
aGlzLnNlbGVjdGVkTm9kZS5jaGlsZHJlblswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdo
aWxlIChuZXh0U2VsZWN0ZWROb2RlICYmICFuZXh0U2VsZWN0ZWROb2RlLnNlbGVjdGFibGUpCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFNlbGVjdGVkTm9kZSA9IG5leHRTZWxlY3Rl
ZE5vZGUubmV4dFNpYmxpbmc7CisgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVkID0gbmV4
dFNlbGVjdGVkTm9kZSA/IHRydWUgOiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNl
IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5hbHRLZXkpCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE5vZGUuZXhwYW5kUmVjdXJzaXZlbHkoKTsK
KyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICB0aGlzLnNlbGVjdGVkTm9kZS5leHBhbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5Q29kZSA9PT0g
OCAvKiBCYWNrc3BhY2UgKi8gfHwgZXZlbnQua2V5Q29kZSA9PT0gNDYgLyogRGVsZXRlICovKSB7
CisgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2RlbGV0ZUNhbGxiYWNrKSB7CisgICAgICAgICAg
ICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZWxl
dGVDYWxsYmFjayh0aGlzLnNlbGVjdGVkTm9kZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAg
ICAgICAgfSBlbHNlIGlmIChpc0VudGVyS2V5KGV2ZW50KSkgeworICAgICAgICAgICAgICAgIGlm
ICh0aGlzLl9lZGl0Q2FsbGJhY2spIHsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlZCA9IHRy
dWU7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0YXJ0RWRpdGluZyh0aGlzLnNlbGVjdGVk
Tm9kZS5lbGVtZW50LmNoaWxkcmVuWzBdKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAg
ICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5Q29kZSA9PT0gOCB8fCBldmVudC5rZXlD
b2RlID09PSA0NikgewotICAgICAgICAgICAgaWYgKHRoaXMuX2RlbGV0ZUNhbGxiYWNrKSB7Ci0g
ICAgICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgdGhpcy5fZGVs
ZXRlQ2FsbGJhY2sodGhpcy5zZWxlY3RlZE5vZGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9
IGVsc2UgaWYgKGlzRW50ZXJLZXkoZXZlbnQpKSB7Ci0gICAgICAgICAgICBpZiAodGhpcy5fZWRp
dENhbGxiYWNrKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7Ci0gICAgICAgICAg
ICAgICAgdGhpcy5fc3RhcnRFZGl0aW5nKHRoaXMuc2VsZWN0ZWROb2RlLmVsZW1lbnQuY2hpbGRy
ZW5bMF0pOwotICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFoYW5kbGVk
KSB7CisgICAgICAgICAgICBoYW5kbGVkID0gdGhpcy5fc2VsZWN0aW9uQ29udHJvbGxlci5oYW5k
bGVLZXlEb3duKGV2ZW50KTsKKworICAgICAgICAgICAgaWYgKGhhbmRsZWQpCisgICAgICAgICAg
ICAgICAgbmV4dFNlbGVjdGVkTm9kZSA9IHRoaXMuc2VsZWN0ZWROb2RlOwogICAgICAgICB9CiAK
ICAgICAgICAgaWYgKG5leHRTZWxlY3RlZE5vZGUpIHsKQEAgLTE0NjIsNiArMTUxMywyNCBAQCBX
SS5EYXRhR3JpZCA9IGNsYXNzIERhdGFHcmlkIGV4dGVuZHMgV0kuVmlldwogICAgICAgICAvLyBU
aGlzIGlzIHRoZSByb290LCBkbyBub3RoaW5nLgogICAgIH0KIAorICAgIHNlbGVjdE5vZGVzKG5v
ZGVzKQorICAgIHsKKyAgICAgICAgaWYgKCFub2Rlcy5sZW5ndGgpCisgICAgICAgICAgICByZXR1
cm47CisKKyAgICAgICAgaWYgKG5vZGVzLmxlbmd0aCA9PT0gMSkgeworICAgICAgICAgICAgdGhp
cy5zZWxlY3RlZE5vZGUgPSBub2Rlc1swXTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
fQorCisgICAgICAgIGNvbnNvbGUuYXNzZXJ0KHRoaXMuYWxsb3dzTXVsdGlwbGVTZWxlY3Rpb24s
ICJDYW5ub3Qgc2VsZWN0IG11bHRpcGxlIERhdGFHcmlkTm9kZSB3aXRoIG11bHRpcGxlIHNlbGVj
dGlvbiBkaXNhYmxlZC4iKTsKKyAgICAgICAgaWYgKCF0aGlzLmFsbG93c011bHRpcGxlU2VsZWN0
aW9uKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGxldCBzZWxlY3RhYmxlT2JqZWN0
cyA9IG5vZGVzLm1hcCgobm9kZSkgPT4gdGhpcy5zZWxlY3Rpb25JdGVtRm9yRGF0YUdyaWROb2Rl
KG5vZGUpKTsKKyAgICAgICAgdGhpcy5fc2VsZWN0aW9uQ29udHJvbGxlci5zZWxlY3RJdGVtcyhu
ZXcgU2V0KHNlbGVjdGFibGVPYmplY3RzKSk7CisgICAgfQorCiAgICAgZGF0YUdyaWROb2RlRnJv
bU5vZGUodGFyZ2V0KQogICAgIHsKICAgICAgICAgdmFyIHJvd0VsZW1lbnQgPSB0YXJnZXQuY2xv
c2VzdCgidHIiKTsKQEAgLTE1NzgsMjMgKzE2NDcsMTYgQEAgV0kuRGF0YUdyaWQgPSBjbGFzcyBE
YXRhR3JpZCBleHRlbmRzIFdJLlZpZXcKIAogICAgIF9tb3VzZURvd25JbkRhdGFUYWJsZShldmVu
dCkKICAgICB7Ci0gICAgICAgIHZhciBncmlkTm9kZSA9IHRoaXMuZGF0YUdyaWROb2RlRnJvbU5v
ZGUoZXZlbnQudGFyZ2V0KTsKLSAgICAgICAgaWYgKCFncmlkTm9kZSkgewotICAgICAgICAgICAg
aWYgKHRoaXMuc2VsZWN0ZWROb2RlKQotICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWROb2Rl
LmRlc2VsZWN0KCk7CisgICAgICAgIGxldCBkYXRhR3JpZE5vZGUgPSB0aGlzLmRhdGFHcmlkTm9k
ZUZyb21Ob2RlKGV2ZW50LnRhcmdldCk7CisgICAgICAgIGlmICghZGF0YUdyaWROb2RlKSB7Cisg
ICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb25Db250cm9sbGVyLmRlc2VsZWN0QWxsKCk7CiAgICAg
ICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIWdyaWROb2RlLnNlbGVj
dGFibGUgfHwgZ3JpZE5vZGUuaXNFdmVudFdpdGhpbkRpc2Nsb3N1cmVUcmlhbmdsZShldmVudCkp
CisgICAgICAgIGlmICghZGF0YUdyaWROb2RlLnNlbGVjdGFibGUgfHwgZGF0YUdyaWROb2RlLmlz
RXZlbnRXaXRoaW5EaXNjbG9zdXJlVHJpYW5nbGUoZXZlbnQpKQogICAgICAgICAgICAgcmV0dXJu
OwogCi0gICAgICAgIGlmIChldmVudC5tZXRhS2V5KSB7Ci0gICAgICAgICAgICBpZiAoZ3JpZE5v
ZGUuc2VsZWN0ZWQpCi0gICAgICAgICAgICAgICAgZ3JpZE5vZGUuZGVzZWxlY3QoKTsKLSAgICAg
ICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBncmlkTm9kZS5zZWxlY3QoKTsKLSAgICAgICAg
fSBlbHNlCi0gICAgICAgICAgICBncmlkTm9kZS5zZWxlY3QoKTsKKyAgICAgICAgdGhpcy5fc2Vs
ZWN0aW9uQ29udHJvbGxlci5oYW5kbGVJdGVtTW91c2VEb3duKHRoaXMuc2VsZWN0aW9uSXRlbUZv
ckRhdGFHcmlkTm9kZShkYXRhR3JpZE5vZGUpLCBldmVudCk7CiAgICAgfQogCiAgICAgX2NvbnRl
eHRNZW51SW5IZWFkZXIoZXZlbnQpCkBAIC0xNjY2LDcgKzE3MjgsNyBAQCBXSS5EYXRhR3JpZCA9
IGNsYXNzIERhdGFHcmlkIGV4dGVuZHMgV0kuVmlldwogCiAgICAgICAgIGlmIChncmlkTm9kZSkg
ewogICAgICAgICAgICAgaWYgKGdyaWROb2RlLnNlbGVjdGFibGUgJiYgZ3JpZE5vZGUuY29weWFi
bGUgJiYgIWdyaWROb2RlLmlzRXZlbnRXaXRoaW5EaXNjbG9zdXJlVHJpYW5nbGUoZXZlbnQpKSB7
Ci0gICAgICAgICAgICAgICAgY29udGV4dE1lbnUuYXBwZW5kSXRlbShXSS5VSVN0cmluZygiQ29w
eSBSb3ciKSwgdGhpcy5fY29weVJvdy5iaW5kKHRoaXMsIGV2ZW50LnRhcmdldCkpOworICAgICAg
ICAgICAgICAgIGNvbnRleHRNZW51LmFwcGVuZEl0ZW0oV0kuVUlTdHJpbmcoIkNvcHkgUm93Iiks
IHRoaXMuX2NvcHlSb3cuYmluZCh0aGlzLCBncmlkTm9kZSkpOwogICAgICAgICAgICAgICAgIGNv
bnRleHRNZW51LmFwcGVuZEl0ZW0oV0kuVUlTdHJpbmcoIkNvcHkgVGFibGUiKSwgdGhpcy5fY29w
eVRhYmxlLmJpbmQodGhpcykpOwogCiAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YUdyaWQu
X2VkaXRDYWxsYmFjaykgewpAQCAtMTc0NiwyMiArMTgwOCwzMCBAQCBXSS5EYXRhR3JpZCA9IGNs
YXNzIERhdGFHcmlkIGV4dGVuZHMgV0kuVmlldwogCiAgICAgaGFuZGxlQ29weUV2ZW50KGV2ZW50
KQogICAgIHsKLSAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkTm9kZSB8fCAhd2luZG93LmdldFNl
bGVjdGlvbigpLmlzQ29sbGFwc2VkKQorICAgICAgICBpZiAoIXdpbmRvdy5nZXRTZWxlY3Rpb24o
KS5pc0NvbGxhcHNlZCkKICAgICAgICAgICAgIHJldHVybjsKIAotICAgICAgICB2YXIgY29weVRl
eHQgPSB0aGlzLl9jb3B5VGV4dEZvckRhdGFHcmlkTm9kZSh0aGlzLnNlbGVjdGVkTm9kZSk7Ci0g
ICAgICAgIGV2ZW50LmNsaXBib2FyZERhdGEuc2V0RGF0YSgidGV4dC9wbGFpbiIsIGNvcHlUZXh0
KTsKKyAgICAgICAgbGV0IGNvcHlEYXRhID0gW107CisgICAgICAgIGZvciAobGV0IGRhdGFHcmlk
Tm9kZSBvZiB0aGlzLnNlbGVjdGVkRGF0YUdyaWROb2RlcykgeworICAgICAgICAgICAgaWYgKCFk
YXRhR3JpZE5vZGUuY29weWFibGUgfHwgZGF0YUdyaWROb2RlLmlzUGxhY2Vob2xkZXJOb2RlKQor
ICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgY29weURhdGEucHVzaCh0aGlz
Ll9jb3B5VGV4dEZvckRhdGFHcmlkTm9kZShkYXRhR3JpZE5vZGUpKTsKKyAgICAgICAgfQorCisg
ICAgICAgIGlmICghY29weURhdGEubGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAg
ICAgIGV2ZW50LmNsaXBib2FyZERhdGEuc2V0RGF0YSgidGV4dC9wbGFpbiIsIGNvcHlEYXRhLmpv
aW4oIlxuIikpOwogICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgZXZl
bnQucHJldmVudERlZmF1bHQoKTsKICAgICB9CiAKLSAgICBfY29weVJvdyh0YXJnZXQpCisgICAg
X2NvcHlSb3coZGF0YUdyaWROb2RlKQogICAgIHsKLSAgICAgICAgdmFyIGdyaWROb2RlID0gdGhp
cy5kYXRhR3JpZE5vZGVGcm9tTm9kZSh0YXJnZXQpOwotICAgICAgICBpZiAoIWdyaWROb2RlKQor
ICAgICAgICBpZiAoIWRhdGFHcmlkTm9kZS5jb3B5YWJsZSB8fCBkYXRhR3JpZE5vZGUuaXNQbGFj
ZWhvbGRlck5vZGUpCiAgICAgICAgICAgICByZXR1cm47CiAKLSAgICAgICAgdmFyIGNvcHlUZXh0
ID0gdGhpcy5fY29weVRleHRGb3JEYXRhR3JpZE5vZGUoZ3JpZE5vZGUpOworICAgICAgICBsZXQg
Y29weVRleHQgPSB0aGlzLl9jb3B5VGV4dEZvckRhdGFHcmlkTm9kZShkYXRhR3JpZE5vZGUpOwog
ICAgICAgICBJbnNwZWN0b3JGcm9udGVuZEhvc3QuY29weVRleHQoY29weVRleHQpOwogICAgIH0K
IApAQCAtMTc2OSwxOSArMTgzOSwyOCBAQCBXSS5EYXRhR3JpZCA9IGNsYXNzIERhdGFHcmlkIGV4
dGVuZHMgV0kuVmlldwogICAgIHsKICAgICAgICAgbGV0IGNvcHlEYXRhID0gW107CiAgICAgICAg
IGNvcHlEYXRhLnB1c2godGhpcy5fY29weVRleHRGb3JEYXRhR3JpZEhlYWRlcnMoKSk7Ci0gICAg
ICAgIGZvciAobGV0IGdyaWROb2RlIG9mIHRoaXMuY2hpbGRyZW4pIHsKLSAgICAgICAgICAgIGlm
ICghZ3JpZE5vZGUuY29weWFibGUpCisgICAgICAgIGZvciAobGV0IGRhdGFHcmlkTm9kZSBvZiB0
aGlzLl9yb3dzKSB7CisgICAgICAgICAgICBpZiAoIWRhdGFHcmlkTm9kZS5jb3B5YWJsZSB8fCBk
YXRhR3JpZE5vZGUuaXNQbGFjZWhvbGRlck5vZGUpCiAgICAgICAgICAgICAgICAgY29udGludWU7
Ci0gICAgICAgICAgICBjb3B5RGF0YS5wdXNoKHRoaXMuX2NvcHlUZXh0Rm9yRGF0YUdyaWROb2Rl
KGdyaWROb2RlKSk7CisgICAgICAgICAgICBjb3B5RGF0YS5wdXNoKHRoaXMuX2NvcHlUZXh0Rm9y
RGF0YUdyaWROb2RlKGRhdGFHcmlkTm9kZSkpOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKCFj
b3B5RGF0YS5sZW5ndGgpCisgICAgICAgICAgICByZXR1cm47CisKICAgICAgICAgSW5zcGVjdG9y
RnJvbnRlbmRIb3N0LmNvcHlUZXh0KGNvcHlEYXRhLmpvaW4oIlxuIikpOwogICAgIH0KIAogICAg
IF9oYXNDb3B5YWJsZURhdGEoKQogICAgIHsKLSAgICAgICAgbGV0IGdyaWROb2RlID0gdGhpcy5j
aGlsZHJlblswXTsKLSAgICAgICAgcmV0dXJuIGdyaWROb2RlICYmIGdyaWROb2RlLnNlbGVjdGFi
bGUgJiYgZ3JpZE5vZGUuY29weWFibGU7CisgICAgICAgIGNvbnN0IHNraXBIaWRkZW4gPSB0cnVl
OworICAgICAgICBjb25zdCBzdGF5V2l0aGluID0gbnVsbDsKKyAgICAgICAgY29uc3QgZG9udFBv
cHVsYXRlID0gdHJ1ZTsKKworICAgICAgICBsZXQgZGF0YUdyaWROb2RlID0gdGhpcy5fcm93c1sw
XTsKKyAgICAgICAgd2hpbGUgKGRhdGFHcmlkTm9kZSAmJiAoIWRhdGFHcmlkTm9kZS5zZWxlY3Rh
YmxlIHx8ICFkYXRhR3JpZE5vZGUuY29weWFibGUgfHwgZGF0YUdyaWROb2RlLmlzUGxhY2Vob2xk
ZXJOb2RlKSkKKyAgICAgICAgICAgIGRhdGFHcmlkTm9kZSA9IGRhdGFHcmlkTm9kZS50cmF2ZXJz
ZU5leHROb2RlKHNraXBIaWRkZW4sIHN0YXlXaXRoaW4sIGRvbnRQb3B1bGF0ZSk7CisgICAgICAg
IHJldHVybiAhIWRhdGFHcmlkTm9kZTsKICAgICB9CiAKICAgICByZXNpemVyRHJhZ1N0YXJ0ZWQo
cmVzaXplcikKQEAgLTE5MDQsNiArMTk4MywzNiBAQCBXSS5EYXRhR3JpZCA9IGNsYXNzIERhdGFH
cmlkIGV4dGVuZHMgV0kuVmlldwogICAgICAgICB0aGlzLl9hcHBseUZpbHRlclRvTm9kZXNUYXNr
LnN0YXJ0KCk7CiAgICAgfQogCisgICAgc2VsZWN0RGF0YUdyaWROb2RlSW50ZXJuYWwoZGF0YUdy
aWROb2RlLCBzdXBwcmVzc1NlbGVjdGVkRXZlbnQpCisgICAgeworICAgICAgICBpZiAodGhpcy5f
cHJvY2Vzc2luZ1NlbGVjdGlvbkNoYW5nZSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAg
ICB0aGlzLl9zdXBwcmVzc05leHRTZWxlY3Rpb25EaWRDaGFuZ2VFdmVudCA9IHN1cHByZXNzU2Vs
ZWN0ZWRFdmVudDsKKworICAgICAgICB0aGlzLl9zZWxlY3Rpb25Db250cm9sbGVyLnNlbGVjdEl0
ZW0odGhpcy5zZWxlY3Rpb25JdGVtRm9yRGF0YUdyaWROb2RlKGRhdGFHcmlkTm9kZSkpOworICAg
IH0KKworICAgIGRlc2VsZWN0RGF0YUdyaWROb2RlSW50ZXJuYWwoZGF0YUdyaWROb2RlLCBzdXBw
cmVzc0Rlc2VsZWN0ZWRFdmVudCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLl9wcm9jZXNzaW5n
U2VsZWN0aW9uQ2hhbmdlKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHRoaXMuX3N1
cHByZXNzTmV4dFNlbGVjdGlvbkRpZENoYW5nZUV2ZW50ID0gc3VwcHJlc3NEZXNlbGVjdGVkRXZl
bnQ7CisKKyAgICAgICAgdGhpcy5fc2VsZWN0aW9uQ29udHJvbGxlci5kZXNlbGVjdEl0ZW0odGhp
cy5zZWxlY3Rpb25JdGVtRm9yRGF0YUdyaWROb2RlKGRhdGFHcmlkTm9kZSkpOworICAgIH0KKwor
ICAgIF9kaXNwYXRjaFNlbGVjdGVkTm9kZUNoYW5nZWRFdmVudCgpCisgICAgeworICAgICAgICBp
ZiAodGhpcy5fc3VwcHJlc3NOZXh0U2VsZWN0aW9uRGlkQ2hhbmdlRXZlbnQpIHsKKyAgICAgICAg
ICAgIHRoaXMuX3N1cHByZXNzTmV4dFNlbGVjdGlvbkRpZENoYW5nZUV2ZW50ID0gZmFsc2U7Cisg
ICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmRpc3BhdGNoRXZl
bnRUb0xpc3RlbmVycyhXSS5EYXRhR3JpZC5FdmVudC5TZWxlY3RlZE5vZGVDaGFuZ2VkKTsKKyAg
ICB9CisKICAgICAvLyBZaWVsZGFibGVUYXNrIGRlbGVnYXRlCiAKICAgICB5aWVsZGFibGVUYXNr
V2lsbFByb2Nlc3NJdGVtKHRhc2ssIG5vZGUpCkBAIC0xOTI3LDYgKzIwMzYsOTUgQEAgV0kuRGF0
YUdyaWQgPSBjbGFzcyBEYXRhR3JpZCBleHRlbmRzIFdJLlZpZXcKICAgICB7CiAgICAgICAgIHRo
aXMuX2FwcGx5RmlsdGVyVG9Ob2Rlc1Rhc2sgPSBudWxsOwogICAgIH0KKworICAgIC8vIFNlbGVj
dGlvbkNvbnRyb2xsZXIgZGVsZWdhdGUKKworICAgIGRhdGFHcmlkTm9kZUZvclNlbGVjdGlvbkl0
ZW0oaXRlbSkKKyAgICB7CisgICAgICAgIGNvbnNvbGUuYXNzZXJ0KCFpdGVtIHx8IGl0ZW0gaW5z
dGFuY2VvZiBXSS5EYXRhR3JpZE5vZGUpOworICAgICAgICByZXR1cm4gaXRlbTsKKyAgICB9CisK
KyAgICBzZWxlY3Rpb25JdGVtRm9yRGF0YUdyaWROb2RlKGRhdGFHcmlkTm9kZSkKKyAgICB7Cisg
ICAgICAgIGNvbnNvbGUuYXNzZXJ0KCFkYXRhR3JpZE5vZGUgfHwgZGF0YUdyaWROb2RlIGluc3Rh
bmNlb2YgV0kuRGF0YUdyaWROb2RlKTsKKyAgICAgICAgcmV0dXJuIGRhdGFHcmlkTm9kZTsKKyAg
ICB9CisKKyAgICBzZWxlY3Rpb25Db250cm9sbGVyU2VsZWN0aW9uRGlkQ2hhbmdlKHNlbGVjdGlv
bkNvbnRyb2xsZXIsIGRlc2VsZWN0ZWRJdGVtcywgc2VsZWN0ZWRJdGVtcykKKyAgICB7CisgICAg
ICAgIHRoaXMuX3Byb2Nlc3NpbmdTZWxlY3Rpb25DaGFuZ2UgPSB0cnVlOworCisgICAgICAgIGZv
ciAobGV0IGl0ZW0gb2YgZGVzZWxlY3RlZEl0ZW1zKSB7CisgICAgICAgICAgICBsZXQgZGF0YUdy
aWROb2RlID0gdGhpcy5kYXRhR3JpZE5vZGVGb3JTZWxlY3Rpb25JdGVtKGl0ZW0pOworICAgICAg
ICAgICAgZGF0YUdyaWROb2RlPy5kZXNlbGVjdCgpOworICAgICAgICB9CisKKyAgICAgICAgZm9y
IChsZXQgaXRlbSBvZiBzZWxlY3RlZEl0ZW1zKSB7CisgICAgICAgICAgICBsZXQgZGF0YUdyaWRO
b2RlID0gdGhpcy5kYXRhR3JpZE5vZGVGb3JTZWxlY3Rpb25JdGVtKGl0ZW0pOworICAgICAgICAg
ICAgZGF0YUdyaWROb2RlPy5zZWxlY3QoKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuX2Rp
c3BhdGNoU2VsZWN0ZWROb2RlQ2hhbmdlZEV2ZW50KCk7CisKKyAgICAgICAgdGhpcy5fcHJvY2Vz
c2luZ1NlbGVjdGlvbkNoYW5nZSA9IGZhbHNlOworICAgIH0KKworICAgIHNlbGVjdGlvbkNvbnRy
b2xsZXJGaXJzdFNlbGVjdGFibGVJdGVtKGNvbnRyb2xsZXIsIHJlYXNvbikKKyAgICB7CisgICAg
ICAgIGxldCBmaXJzdENoaWxkID0gdGhpcy5fcm93c1swXTsKKyAgICAgICAgbGV0IGl0ZW0gPSB0
aGlzLnNlbGVjdGlvbkl0ZW1Gb3JEYXRhR3JpZE5vZGUoZmlyc3RDaGlsZCk7CisgICAgICAgIGlm
IChmaXJzdENoaWxkLnNlbGVjdGFibGUgJiYgKCFmaXJzdENoaWxkLmlzUGxhY2Vob2xkZXJOb2Rl
IHx8IHJlYXNvbiAhPT0gV0kuU2VsZWN0aW9uQ29udHJvbGxlci5SZWFzb24uQWxsKSkKKyAgICAg
ICAgICAgIHJldHVybiBpdGVtOworICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb25Db250cm9s
bGVyTmV4dFNlbGVjdGFibGVJdGVtKGNvbnRyb2xsZXIsIGl0ZW0sIHJlYXNvbik7CisgICAgfQor
CisgICAgc2VsZWN0aW9uQ29udHJvbGxlckxhc3RTZWxlY3RhYmxlSXRlbShjb250cm9sbGVyLCBy
ZWFzb24pCisgICAgeworICAgICAgICBsZXQgbGFzdENoaWxkID0gdGhpcy5fcm93cy5sYXN0VmFs
dWU7CisgICAgICAgIHdoaWxlIChsYXN0Q2hpbGQuZXhwYW5kZWQgJiYgbGFzdENoaWxkLmNoaWxk
cmVuLmxlbmd0aCkKKyAgICAgICAgICAgIGxhc3RDaGlsZCA9IGxhc3RDaGlsZC5jaGlsZHJlbi5s
YXN0VmFsdWU7CisKKyAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLnNlbGVjdGlvbkl0ZW1Gb3JEYXRh
R3JpZE5vZGUobGFzdENoaWxkKTsKKyAgICAgICAgaWYgKGxhc3RDaGlsZC5zZWxlY3RhYmxlICYm
ICghbGFzdENoaWxkLmlzUGxhY2Vob2xkZXJOb2RlIHx8IHJlYXNvbiAhPT0gV0kuU2VsZWN0aW9u
Q29udHJvbGxlci5SZWFzb24uQWxsKSkKKyAgICAgICAgICAgIHJldHVybiBpdGVtOworICAgICAg
ICByZXR1cm4gdGhpcy5zZWxlY3Rpb25Db250cm9sbGVyUHJldmlvdXNTZWxlY3RhYmxlSXRlbShj
b250cm9sbGVyLCBpdGVtLCByZWFzb24pOworICAgIH0KKworICAgIHNlbGVjdGlvbkNvbnRyb2xs
ZXJQcmV2aW91c1NlbGVjdGFibGVJdGVtKGNvbnRyb2xsZXIsIGl0ZW0sIHJlYXNvbikKKyAgICB7
CisgICAgICAgIGxldCBkYXRhR3JpZE5vZGUgPSB0aGlzLmRhdGFHcmlkTm9kZUZvclNlbGVjdGlv
bkl0ZW0oaXRlbSk7CisgICAgICAgIGNvbnNvbGUuYXNzZXJ0KGRhdGFHcmlkTm9kZSwgIk1pc3Np
bmcgRGF0YUdyaWROb2RlIGZvciBzZWxlY3Rpb24gaXRlbS4iLCBpdGVtKTsKKyAgICAgICAgaWYg
KCFkYXRhR3JpZE5vZGUpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBjb25z
dCBza2lwVW5yZXZlYWxlZCA9IHRydWU7CisgICAgICAgIGNvbnN0IGRvbnRQb3B1bGF0ZSA9IHRy
dWU7CisgICAgICAgIHdoaWxlIChkYXRhR3JpZE5vZGUgPSBkYXRhR3JpZE5vZGUudHJhdmVyc2VQ
cmV2aW91c05vZGUoc2tpcFVucmV2ZWFsZWQsIGRvbnRQb3B1bGF0ZSkpIHsKKyAgICAgICAgICAg
IGlmIChkYXRhR3JpZE5vZGUuc2VsZWN0YWJsZSAmJiAoIWRhdGFHcmlkTm9kZS5pc1BsYWNlaG9s
ZGVyTm9kZSB8fCByZWFzb24gIT09IFdJLlNlbGVjdGlvbkNvbnRyb2xsZXIuUmVhc29uLkFsbCkp
CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uSXRlbUZvckRhdGFHcmlkTm9k
ZShkYXRhR3JpZE5vZGUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAg
fQorCisgICAgc2VsZWN0aW9uQ29udHJvbGxlck5leHRTZWxlY3RhYmxlSXRlbShjb250cm9sbGVy
LCBpdGVtLCByZWFzb24pCisgICAgeworICAgICAgICBsZXQgZGF0YUdyaWROb2RlID0gdGhpcy5k
YXRhR3JpZE5vZGVGb3JTZWxlY3Rpb25JdGVtKGl0ZW0pOworICAgICAgICBjb25zb2xlLmFzc2Vy
dChkYXRhR3JpZE5vZGUsICJNaXNzaW5nIERhdGFHcmlkTm9kZSBmb3Igc2VsZWN0aW9uIGl0ZW0u
IiwgaXRlbSk7CisgICAgICAgIGlmICghZGF0YUdyaWROb2RlKQorICAgICAgICAgICAgcmV0dXJu
IG51bGw7CisKKyAgICAgICAgY29uc3Qgc2tpcFVucmV2ZWFsZWQgPSB0cnVlOworICAgICAgICBj
b25zdCBzdGF5V2l0aGluID0gbnVsbDsKKyAgICAgICAgY29uc3QgZG9udFBvcHVsYXRlID0gdHJ1
ZTsKKyAgICAgICAgd2hpbGUgKGRhdGFHcmlkTm9kZSA9IGRhdGFHcmlkTm9kZS50cmF2ZXJzZU5l
eHROb2RlKHNraXBVbnJldmVhbGVkLCBzdGF5V2l0aGluLCBkb250UG9wdWxhdGUpKSB7CisgICAg
ICAgICAgICBpZiAoZGF0YUdyaWROb2RlLnNlbGVjdGFibGUgJiYgKCFkYXRhR3JpZE5vZGUuaXNQ
bGFjZWhvbGRlck5vZGUgfHwgcmVhc29uICE9PSBXSS5TZWxlY3Rpb25Db250cm9sbGVyLlJlYXNv
bi5BbGwpKQorICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbkl0ZW1Gb3JEYXRh
R3JpZE5vZGUoZGF0YUdyaWROb2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxs
OworICAgIH0KIH07CiAKIFdJLkRhdGFHcmlkLkV2ZW50ID0gewpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2UvVmlld3MvRGF0YUdyaWROb2RlLmpzIGIvU291
cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2UvVmlld3MvRGF0YUdyaWROb2RlLmpzCmlu
ZGV4IDY0MDYwMTE0NWMxNjY2Y2E2ODI2ZWFjNGQ1YTFkMWJjN2Q2OTY5YjQuLmFjZjhkZTNjZWY4
Y2Q1MWFhNzhlMmExYjkwNTMxZWJiMzY4Nzg2YzIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJJbnNw
ZWN0b3JVSS9Vc2VySW50ZXJmYWNlL1ZpZXdzL0RhdGFHcmlkTm9kZS5qcworKysgYi9Tb3VyY2Uv
V2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9WaWV3cy9EYXRhR3JpZE5vZGUuanMKQEAgLTU2
NiwxOCArNTY2LDEwIEBAIFdJLkRhdGFHcmlkTm9kZSA9IGNsYXNzIERhdGFHcmlkTm9kZSBleHRl
bmRzIFdJLk9iamVjdAogICAgICAgICBpZiAoIXRoaXMuZGF0YUdyaWQgfHwgIXRoaXMuc2VsZWN0
YWJsZSB8fCB0aGlzLnNlbGVjdGVkKQogICAgICAgICAgICAgcmV0dXJuOwogCi0gICAgICAgIGxl
dCBvbGRTZWxlY3RlZE5vZGUgPSB0aGlzLmRhdGFHcmlkLnNlbGVjdGVkTm9kZTsKLSAgICAgICAg
aWYgKG9sZFNlbGVjdGVkTm9kZSkKLSAgICAgICAgICAgIG9sZFNlbGVjdGVkTm9kZS5kZXNlbGVj
dCh0cnVlKTsKLQogICAgICAgICB0aGlzLl9zZWxlY3RlZCA9IHRydWU7Ci0gICAgICAgIHRoaXMu
ZGF0YUdyaWQuc2VsZWN0ZWROb2RlID0gdGhpczsKKyAgICAgICAgdGhpcy5fZWxlbWVudD8uY2xh
c3NMaXN0LmFkZCgic2VsZWN0ZWQiKTsKIAotICAgICAgICBpZiAodGhpcy5fZWxlbWVudCkKLSAg
ICAgICAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZCgic2VsZWN0ZWQiKTsKLQotICAg
ICAgICBpZiAoIXN1cHByZXNzU2VsZWN0ZWRFdmVudCkKLSAgICAgICAgICAgIHRoaXMuZGF0YUdy
aWQuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFdJLkRhdGFHcmlkLkV2ZW50LlNlbGVjdGVkTm9k
ZUNoYW5nZWQsIHtvbGRTZWxlY3RlZE5vZGV9KTsKKyAgICAgICAgdGhpcy5kYXRhR3JpZC5zZWxl
Y3REYXRhR3JpZE5vZGVJbnRlcm5hbCh0aGlzLCBzdXBwcmVzc1NlbGVjdGVkRXZlbnQpOwogICAg
IH0KIAogICAgIHJldmVhbEFuZFNlbGVjdChzdXBwcmVzc1NlbGVjdGVkRXZlbnQpCkBAIC01ODgs
MTcgKzU4MCwxMyBAQCBXSS5EYXRhR3JpZE5vZGUgPSBjbGFzcyBEYXRhR3JpZE5vZGUgZXh0ZW5k
cyBXSS5PYmplY3QKIAogICAgIGRlc2VsZWN0KHN1cHByZXNzRGVzZWxlY3RlZEV2ZW50KQogICAg
IHsKLSAgICAgICAgaWYgKCF0aGlzLmRhdGFHcmlkIHx8IHRoaXMuZGF0YUdyaWQuc2VsZWN0ZWRO
b2RlICE9PSB0aGlzIHx8ICF0aGlzLnNlbGVjdGVkKQorICAgICAgICBpZiAoIXRoaXMuZGF0YUdy
aWQgfHwgIXRoaXMuc2VsZWN0YWJsZSB8fCAhdGhpcy5zZWxlY3RlZCkKICAgICAgICAgICAgIHJl
dHVybjsKIAogICAgICAgICB0aGlzLl9zZWxlY3RlZCA9IGZhbHNlOwotICAgICAgICB0aGlzLmRh
dGFHcmlkLnNlbGVjdGVkTm9kZSA9IG51bGw7CisgICAgICAgIHRoaXMuX2VsZW1lbnQ/LmNsYXNz
TGlzdC5yZW1vdmUoInNlbGVjdGVkIik7CiAKLSAgICAgICAgaWYgKHRoaXMuX2VsZW1lbnQpCi0g
ICAgICAgICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoInNlbGVjdGVkIik7Ci0K
LSAgICAgICAgaWYgKCFzdXBwcmVzc0Rlc2VsZWN0ZWRFdmVudCkKLSAgICAgICAgICAgIHRoaXMu
ZGF0YUdyaWQuZGlzcGF0Y2hFdmVudFRvTGlzdGVuZXJzKFdJLkRhdGFHcmlkLkV2ZW50LlNlbGVj
dGVkTm9kZUNoYW5nZWQsIHtvbGRTZWxlY3RlZE5vZGU6IHRoaXN9KTsKKyAgICAgICAgdGhpcy5k
YXRhR3JpZC5kZXNlbGVjdERhdGFHcmlkTm9kZUludGVybmFsKHRoaXMsIHN1cHByZXNzRGVzZWxl
Y3RlZEV2ZW50KTsKICAgICB9CiAKICAgICB0cmF2ZXJzZU5leHROb2RlKHNraXBIaWRkZW4sIHN0
YXlXaXRoaW4sIGRvbnRQb3B1bGF0ZSwgaW5mbykKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJJbnNw
ZWN0b3JVSS9Vc2VySW50ZXJmYWNlL1ZpZXdzL1Byb2ZpbGVWaWV3LmpzIGIvU291cmNlL1dlYklu
c3BlY3RvclVJL1VzZXJJbnRlcmZhY2UvVmlld3MvUHJvZmlsZVZpZXcuanMKaW5kZXggYTIzYzUx
NTdmNjFmY2FjYjQ2NWYwOWI4YjdmZTIyZGEyMjMwNjM5MS4uMjI0ZDA1MWZlZTQ5NGFiYWZjMWMw
NWRlNjQ2NDkwMjBiNzY5MTUwNSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkluc3BlY3RvclVJL1Vz
ZXJJbnRlcmZhY2UvVmlld3MvUHJvZmlsZVZpZXcuanMKKysrIGIvU291cmNlL1dlYkluc3BlY3Rv
clVJL1VzZXJJbnRlcmZhY2UvVmlld3MvUHJvZmlsZVZpZXcuanMKQEAgLTY5LDYgKzY5LDggQEAg
V0kuUHJvZmlsZVZpZXcgPSBjbGFzcyBQcm9maWxlVmlldyBleHRlbmRzIFdJLkNvbnRlbnRWaWV3
CiAgICAgICAgIHRoaXMuX2RhdGFHcmlkLnNvcnRPcmRlciA9IFdJLkRhdGFHcmlkLlNvcnRPcmRl
ci5EZXNjZW5kaW5nOwogICAgICAgICB0aGlzLl9kYXRhR3JpZC5jcmVhdGVTZXR0aW5ncygicHJv
ZmlsZS12aWV3Iik7CiAKKyAgICAgICAgdGhpcy5fc2VsZWN0ZWREYXRhR3JpZE5vZGUgPSBudWxs
OworCiAgICAgICAgIC8vIEN1cnJlbnRseSB3ZSBjcmVhdGUgYSBuZXcgUHJvZmlsZVZpZXcgZm9y
IGVhY2ggQ2FsbGluZ0NvbnRleHRUcmVlLCBzbwogICAgICAgICAvLyB0byBzaGFyZSBzdGF0ZSBi
ZXR3ZWVuIHRoZW0sIHVzZSBhIGNvbW1vbiBzaGFyZWQgZGF0YSBvYmplY3QuCiAgICAgICAgIHRo
aXMuX3NoYXJlZERhdGEgPSBleHRyYUFyZ3VtZW50czsKQEAgLTIxMSwxOCArMjEzLDE5IEBAIFdJ
LlByb2ZpbGVWaWV3ID0gY2xhc3MgUHJvZmlsZVZpZXcgZXh0ZW5kcyBXSS5Db250ZW50Vmlldwog
CiAgICAgX2RhdGFHcmlkTm9kZVNlbGVjdGVkKGV2ZW50KQogICAgIHsKLSAgICAgICAgbGV0IG9s
ZFNlbGVjdGVkTm9kZSA9IGV2ZW50LmRhdGEub2xkU2VsZWN0ZWROb2RlOwotICAgICAgICBpZiAo
b2xkU2VsZWN0ZWROb2RlKSB7Ci0gICAgICAgICAgICB0aGlzLl9yZW1vdmVHdWlkYW5jZUVsZW1l
bnQoV0kuUHJvZmlsZVZpZXcuR3VpZGFuY2VUeXBlLlNlbGVjdGVkLCBvbGRTZWxlY3RlZE5vZGUp
OwotICAgICAgICAgICAgb2xkU2VsZWN0ZWROb2RlLmZvckVhY2hDaGlsZEluU3VidHJlZSgobm9k
ZSkgPT4gdGhpcy5fcmVtb3ZlR3VpZGFuY2VFbGVtZW50KFdJLlByb2ZpbGVWaWV3Lkd1aWRhbmNl
VHlwZS5TZWxlY3RlZCwgbm9kZSkpOworICAgICAgICBpZiAodGhpcy5fc2VsZWN0ZWREYXRhR3Jp
ZE5vZGUpIHsKKyAgICAgICAgICAgIHRoaXMuX3JlbW92ZUd1aWRhbmNlRWxlbWVudChXSS5Qcm9m
aWxlVmlldy5HdWlkYW5jZVR5cGUuU2VsZWN0ZWQsIHRoaXMuX3NlbGVjdGVkRGF0YUdyaWROb2Rl
KTsKKyAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkRGF0YUdyaWROb2RlLmZvckVhY2hDaGlsZElu
U3VidHJlZSgobm9kZSkgPT4gdGhpcy5fcmVtb3ZlR3VpZGFuY2VFbGVtZW50KFdJLlByb2ZpbGVW
aWV3Lkd1aWRhbmNlVHlwZS5TZWxlY3RlZCwgbm9kZSkpOwogICAgICAgICB9CiAKLSAgICAgICAg
bGV0IG5ld1NlbGVjdGVkTm9kZSA9IHRoaXMuX2RhdGFHcmlkLnNlbGVjdGVkTm9kZTsKLSAgICAg
ICAgaWYgKG5ld1NlbGVjdGVkTm9kZSkgewotICAgICAgICAgICAgdGhpcy5fcmVtb3ZlR3VpZGFu
Y2VFbGVtZW50KFdJLlByb2ZpbGVWaWV3Lkd1aWRhbmNlVHlwZS5TZWxlY3RlZCwgbmV3U2VsZWN0
ZWROb2RlKTsKLSAgICAgICAgICAgIG5ld1NlbGVjdGVkTm9kZS5mb3JFYWNoQ2hpbGRJblN1YnRy
ZWUoKG5vZGUpID0+IHRoaXMuX2FwcGVuZEd1aWRhbmNlRWxlbWVudChXSS5Qcm9maWxlVmlldy5H
dWlkYW5jZVR5cGUuU2VsZWN0ZWQsIG5vZGUsIG5ld1NlbGVjdGVkTm9kZSkpOworICAgICAgICB0
aGlzLl9zZWxlY3RlZERhdGFHcmlkTm9kZSA9IHRoaXMuX2RhdGFHcmlkLnNlbGVjdGVkTm9kZTsK
IAotICAgICAgICAgICAgdGhpcy5fc2hhcmVkRGF0YS5zZWxlY3RlZE5vZGVIYXNoID0gbmV3U2Vs
ZWN0ZWROb2RlLmNhbGxpbmdDb250ZXh0VHJlZU5vZGUuaGFzaDsKKworICAgICAgICBpZiAodGhp
cy5fc2VsZWN0ZWREYXRhR3JpZE5vZGUpIHsKKyAgICAgICAgICAgIHRoaXMuX3JlbW92ZUd1aWRh
bmNlRWxlbWVudChXSS5Qcm9maWxlVmlldy5HdWlkYW5jZVR5cGUuU2VsZWN0ZWQsIHRoaXMuX3Nl
bGVjdGVkRGF0YUdyaWROb2RlKTsKKyAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkRGF0YUdyaWRO
b2RlLmZvckVhY2hDaGlsZEluU3VidHJlZSgobm9kZSkgPT4gdGhpcy5fYXBwZW5kR3VpZGFuY2VF
bGVtZW50KFdJLlByb2ZpbGVWaWV3Lkd1aWRhbmNlVHlwZS5TZWxlY3RlZCwgbm9kZSwgdGhpcy5f
c2VsZWN0ZWREYXRhR3JpZE5vZGUpKTsKKworICAgICAgICAgICAgdGhpcy5fc2hhcmVkRGF0YS5z
ZWxlY3RlZE5vZGVIYXNoID0gdGhpcy5fc2VsZWN0ZWREYXRhR3JpZE5vZGUuY2FsbGluZ0NvbnRl
eHRUcmVlTm9kZS5oYXNoOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9WaWV3cy9UYWJsZS5qcyBiL1NvdXJjZS9XZWJJ
bnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL1ZpZXdzL1RhYmxlLmpzCmluZGV4IDg4MzNkZjczMDY4
YzdhNzM0NjIxN2I5MDBlNjczZjdhYjg5MTc5YjkuLjI4ZjQzMjYyOWVhNGFkODc3NTI3NTA2MTg4
MjlmOWRkMGY5MjBkNDkgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50
ZXJmYWNlL1ZpZXdzL1RhYmxlLmpzCisrKyBiL1NvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50
ZXJmYWNlL1ZpZXdzL1RhYmxlLmpzCkBAIC04Niw3ICs4Niw4IEBAIFdJLlRhYmxlID0gY2xhc3Mg
VGFibGUgZXh0ZW5kcyBXSS5WaWV3CiAgICAgICAgIHRoaXMuX2NvbHVtbldpZHRocyA9IG51bGw7
IC8vIENhbGN1bGF0ZWQgaW4gX3Jlc2l6ZUNvbHVtbnNBbmRGaWxsZXIuCiAgICAgICAgIHRoaXMu
X2ZpbGxlckhlaWdodCA9IDA7IC8vIENhbGN1bGF0ZWQgaW4gX3Jlc2l6ZUNvbHVtbnNBbmRGaWxs
ZXIuCiAKLSAgICAgICAgdGhpcy5fc2VsZWN0aW9uQ29udHJvbGxlciA9IG5ldyBXSS5TZWxlY3Rp
b25Db250cm9sbGVyKHRoaXMsIChhLCBiKSA9PiB0aGlzLl9pbmRleEZvclJlcHJlc2VudGVkT2Jq
ZWN0KGEpIC0gdGhpcy5faW5kZXhGb3JSZXByZXNlbnRlZE9iamVjdChiKSk7CisgICAgICAgIGxl
dCBzZWxlY3Rpb25Db21wYXJhdG9yID0gV0kuU2VsZWN0aW9uQ29udHJvbGxlci5jcmVhdGVMaXN0
Q29tcGFyYXRvcih0aGlzLl9pbmRleEZvclJlcHJlc2VudGVkT2JqZWN0LmJpbmQodGhpcykpOwor
ICAgICAgICB0aGlzLl9zZWxlY3Rpb25Db250cm9sbGVyID0gbmV3IFdJLlNlbGVjdGlvbkNvbnRy
b2xsZXIodGhpcywgc2VsZWN0aW9uQ29tcGFyYXRvcik7CiAKICAgICAgICAgdGhpcy5fcmVzaXpl
cnMgPSBbXTsKICAgICAgICAgdGhpcy5fY3VycmVudFJlc2l6ZXIgPSBudWxsOwpkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2UvVmlld3MvVHJlZU91dGxpbmUu
anMgYi9Tb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9WaWV3cy9UcmVlT3V0bGlu
ZS5qcwppbmRleCA4MTIwY2QxNWI1NTM2OWE1Y2Y4MjM2YzRhYTU1YjA3ZjhjNGM2YTE0Li41MDdh
MTc4ZDU0YmUxN2MzNjk5MzM4ZjU3YmIxYzZjYWE4YzRjMjU1IDEwMDY0NAotLS0gYS9Tb3VyY2Uv
V2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9WaWV3cy9UcmVlT3V0bGluZS5qcworKysgYi9T
b3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9WaWV3cy9UcmVlT3V0bGluZS5qcwpA
QCAtNTcsNTMgKzU3LDkgQEAgV0kuVHJlZU91dGxpbmUgPSBjbGFzcyBUcmVlT3V0bGluZSBleHRl
bmRzIFdJLk9iamVjdAogCiAgICAgICAgIHRoaXMuX2NhY2hlZE51bWJlck9mRGVzY2VuZGFudHMg
PSAwOwogCi0gICAgICAgIGxldCBjb21wYXJhdG9yID0gKGEsIGIpID0+IHsKLSAgICAgICAgICAg
IGZ1bmN0aW9uIGdldExldmVsKHRyZWVFbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgbGV0IGxl
dmVsID0gMDsKLSAgICAgICAgICAgICAgICB3aGlsZSAodHJlZUVsZW1lbnQgPSB0cmVlRWxlbWVu
dC5wYXJlbnQpCi0gICAgICAgICAgICAgICAgICAgIGxldmVsKys7Ci0gICAgICAgICAgICAgICAg
cmV0dXJuIGxldmVsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmdW5jdGlvbiBjb21w
YXJlU2libGluZ3MocywgdCkgewotICAgICAgICAgICAgICAgIHJldHVybiBzLnBhcmVudC5jaGls
ZHJlbi5pbmRleE9mKHMpIC0gcy5wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZih0KTsKLSAgICAgICAg
ICAgIH0KLQotICAgICAgICAgICAgLy8gVHJhbnNsYXRlIHJlcHJlc2VudGVkIG9iamVjdHMgdG8g
VHJlZUVsZW1lbnRzLCB3aGljaCBoYXZlIHRoZQotICAgICAgICAgICAgLy8gaGllcmFyY2hpY2Fs
IGluZm9ybWF0aW9uIG5lZWRlZCB0byBwZXJmb3JtIHRoZSBjb21wYXJpc29uLgotICAgICAgICAg
ICAgYSA9IHRoaXMuZ2V0Q2FjaGVkVHJlZUVsZW1lbnQoYSk7Ci0gICAgICAgICAgICBiID0gdGhp
cy5nZXRDYWNoZWRUcmVlRWxlbWVudChiKTsKLSAgICAgICAgICAgIGlmICghYSB8fCAhYikKLSAg
ICAgICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICAgICAgaWYgKGEucGFyZW50ID09PSBi
LnBhcmVudCkKLSAgICAgICAgICAgICAgICByZXR1cm4gY29tcGFyZVNpYmxpbmdzKGEsIGIpOwot
Ci0gICAgICAgICAgICBsZXQgYUxldmVsID0gZ2V0TGV2ZWwoYSk7Ci0gICAgICAgICAgICBsZXQg
YkxldmVsID0gZ2V0TGV2ZWwoYik7Ci0gICAgICAgICAgICB3aGlsZSAoYUxldmVsID4gYkxldmVs
KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGEucGFyZW50ID09PSBiKQotICAgICAgICAgICAgICAg
ICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgICAgICBhID0gYS5wYXJlbnQ7Ci0gICAgICAgICAg
ICAgICAgYUxldmVsLS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3aGlsZSAoYkxldmVs
ID4gYUxldmVsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGIucGFyZW50ID09PSBhKQotICAgICAg
ICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgYiA9IGIucGFyZW50Owot
ICAgICAgICAgICAgICAgIGJMZXZlbC0tOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB3
aGlsZSAoYS5wYXJlbnQgIT09IGIucGFyZW50KSB7Ci0gICAgICAgICAgICAgICAgYSA9IGEucGFy
ZW50OwotICAgICAgICAgICAgICAgIGIgPSBiLnBhcmVudDsKLSAgICAgICAgICAgIH0KLQotICAg
ICAgICAgICAgY29uc29sZS5hc3NlcnQoYS5wYXJlbnQgPT09IGIucGFyZW50LCAiTWlzc2luZyBj
b21tb24gYW5jZXN0b3IgZm9yIFRyZWVFbGVtZW50cy4iLCBhLCBiKTsKLSAgICAgICAgICAgIHJl
dHVybiBjb21wYXJlU2libGluZ3MoYSwgYik7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgdGhpcy5f
c2VsZWN0aW9uQ29udHJvbGxlciA9IG5ldyBXSS5TZWxlY3Rpb25Db250cm9sbGVyKHRoaXMsIGNv
bXBhcmF0b3IpOworICAgICAgICBsZXQgaXRlbUZvclJlcHJlc2VudGVkT2JqZWN0ID0gdGhpcy5n
ZXRDYWNoZWRUcmVlRWxlbWVudC5iaW5kKHRoaXMpOworICAgICAgICBsZXQgc2VsZWN0aW9uQ29t
cGFyYXRvciA9IFdJLlNlbGVjdGlvbkNvbnRyb2xsZXIuY3JlYXRlVHJlZUNvbXBhcmF0b3IoaXRl
bUZvclJlcHJlc2VudGVkT2JqZWN0KTsKKyAgICAgICAgdGhpcy5fc2VsZWN0aW9uQ29udHJvbGxl
ciA9IG5ldyBXSS5TZWxlY3Rpb25Db250cm9sbGVyKHRoaXMsIHNlbGVjdGlvbkNvbXBhcmF0b3Ip
OwogCiAgICAgICAgIHRoaXMuX2l0ZW1XYXNTZWxlY3RlZEJ5VXNlciA9IGZhbHNlOwogICAgICAg
ICB0aGlzLl9wcm9jZXNzaW5nU2VsZWN0aW9uQ2hhbmdlID0gZmFsc2U7CkBAIC03NzAsMTEgKzcy
Niw2IEBAIFdJLlRyZWVPdXRsaW5lID0gY2xhc3MgVHJlZU91dGxpbmUgZXh0ZW5kcyBXSS5PYmpl
Y3QKIAogICAgIC8vIFNlbGVjdGlvbkNvbnRyb2xsZXIgZGVsZWdhdGUKIAotICAgIHNlbGVjdGlv
bkNvbnRyb2xsZXJOdW1iZXJPZkl0ZW1zKGNvbnRyb2xsZXIpCi0gICAgewotICAgICAgICByZXR1
cm4gdGhpcy5fY2FjaGVkTnVtYmVyT2ZEZXNjZW5kYW50czsKLSAgICB9Ci0KICAgICBzZWxlY3Rp
b25Db250cm9sbGVyU2VsZWN0aW9uRGlkQ2hhbmdlKGNvbnRyb2xsZXIsIGRlc2VsZWN0ZWRJdGVt
cywgc2VsZWN0ZWRJdGVtcykKICAgICB7CiAgICAgICAgIHRoaXMuX3Byb2Nlc3NpbmdTZWxlY3Rp
b25DaGFuZ2UgPSB0cnVlOwo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>397403</attachid>
            <date>2020-04-23 17:32:22 -0700</date>
            <delta_ts>2020-04-23 18:05:38 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-210876-20200423183221.patch</filename>
            <type>text/plain</type>
            <size>51785</size>
            <attacher name="Devin Rousso">hi</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJJbnNwZWN0b3JVSS9DaGFuZ2VMb2cgYi9Tb3VyY2UvV2Vi
SW5zcGVjdG9yVUkvQ2hhbmdlTG9nCmluZGV4IDc3MzExN2Y1NDYyYzdmMmE1MDc0ZWVhNjRmYTE2
ODdiMGMwYTE0M2UuLmJmYTRiODUwNmMwYTY1MzgzMzc0YTE3YmIxM2E0MDViZmEyNjc5N2EgMTAw
NjQ0Ci0tLSBhL1NvdXJjZS9XZWJJbnNwZWN0b3JVSS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dl
Ykluc3BlY3RvclVJL0NoYW5nZUxvZwpAQCAtMSwzICsxLDgzIEBACisyMDIwLTA0LTIzICBEZXZp
biBSb3Vzc28gIDxkcm91c3NvQGFwcGxlLmNvbT4KKworICAgICAgICBXZWIgSW5zc3BlY3Rvcjog
U3RvcmFnZTogY2Fubm90IHNlbGVjdCBtdWx0aXBsZSBsb2NhbCBzdG9yYWdlIGVudHJpZXMKKyAg
ICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIxMDg3NgorCisg
ICAgICAgIFJldmlld2VkIGJ5IEJyaWFuIEJ1cmcuCisKKyAgICAgICAgU3VwcG9ydCBtdWx0aXBs
ZSBzZWxlY3Rpb24gdXNpbmcgYFdJLkRhdGFHcmlkYC4KKworICAgICAgICAqIFVzZXJJbnRlcmZh
Y2UvVmlld3MvRGF0YUdyaWQuanM6CisgICAgICAgIChXSS5EYXRhR3JpZCk6CisgICAgICAgIChX
SS5EYXRhR3JpZC5wcm90b3R5cGUuZ2V0IGFsbG93c011bHRpcGxlU2VsZWN0aW9uKTogQWRkZWQu
CisgICAgICAgIChXSS5EYXRhR3JpZC5wcm90b3R5cGUuc2V0IGFsbG93c011bHRpcGxlU2VsZWN0
aW9uKTogQWRkZWQuCisgICAgICAgIChXSS5EYXRhR3JpZC5wcm90b3R5cGUuZ2V0IHNlbGVjdGVk
Tm9kZSk6CisgICAgICAgIChXSS5EYXRhR3JpZC5wcm90b3R5cGUuc2V0IHNlbGVjdGVkTm9kZSk6
CisgICAgICAgIChXSS5EYXRhR3JpZC5wcm90b3R5cGUuZ2V0IHNlbGVjdGVkRGF0YUdyaWROb2Rl
cyk6IEFkZGVkLgorICAgICAgICAoV0kuRGF0YUdyaWQucHJvdG90eXBlLl9rZXlEb3duKToKKyAg
ICAgICAgKFdJLkRhdGFHcmlkLnByb3RvdHlwZS5zZWxlY3ROb2Rlcyk6CisgICAgICAgIChXSS5E
YXRhR3JpZC5wcm90b3R5cGUuX21vdXNlRG93bkluRGF0YVRhYmxlKToKKyAgICAgICAgKFdJLkRh
dGFHcmlkLnByb3RvdHlwZS5fY29udGV4dE1lbnVJbkRhdGFUYWJsZSk6CisgICAgICAgIChXSS5E
YXRhR3JpZC5wcm90b3R5cGUuaGFuZGxlQ29weUV2ZW50KToKKyAgICAgICAgKFdJLkRhdGFHcmlk
LnByb3RvdHlwZS5fY29weVJvdyk6CisgICAgICAgIChXSS5EYXRhR3JpZC5wcm90b3R5cGUuX2Nv
cHlUYWJsZSk6CisgICAgICAgIChXSS5EYXRhR3JpZC5wcm90b3R5cGUuX2hhc0NvcHlhYmxlRGF0
YSk6CisgICAgICAgIChXSS5EYXRhR3JpZC5wcm90b3R5cGUuc2VsZWN0RGF0YUdyaWROb2RlSW50
ZXJuYWwpOiBBZGRlZC4KKyAgICAgICAgKFdJLkRhdGFHcmlkLnByb3RvdHlwZS5kZXNlbGVjdERh
dGFHcmlkTm9kZUludGVybmFsKTogQWRkZWQuCisgICAgICAgIChXSS5EYXRhR3JpZC5wcm90b3R5
cGUuX2Rpc3BhdGNoU2VsZWN0ZWROb2RlQ2hhbmdlZEV2ZW50KTogQWRkZWQuCisgICAgICAgIChX
SS5EYXRhR3JpZC5wcm90b3R5cGUuZGF0YUdyaWROb2RlRm9yU2VsZWN0aW9uSXRlbSk6IEFkZGVk
LgorICAgICAgICAoV0kuRGF0YUdyaWQucHJvdG90eXBlLnNlbGVjdGlvbkl0ZW1Gb3JEYXRhR3Jp
ZE5vZGUpOiBBZGRlZC4KKyAgICAgICAgKFdJLkRhdGFHcmlkLnByb3RvdHlwZS5zZWxlY3Rpb25D
b250cm9sbGVyU2VsZWN0aW9uRGlkQ2hhbmdlKTogQWRkZWQuCisgICAgICAgIChXSS5EYXRhR3Jp
ZC5wcm90b3R5cGUuc2VsZWN0aW9uQ29udHJvbGxlckZpcnN0U2VsZWN0YWJsZUl0ZW0pOiBBZGRl
ZC4KKyAgICAgICAgKFdJLkRhdGFHcmlkLnByb3RvdHlwZS5zZWxlY3Rpb25Db250cm9sbGVyTGFz
dFNlbGVjdGFibGVJdGVtKTogQWRkZWQuCisgICAgICAgIChXSS5EYXRhR3JpZC5wcm90b3R5cGUu
c2VsZWN0aW9uQ29udHJvbGxlclByZXZpb3VzU2VsZWN0YWJsZUl0ZW0pOiBBZGRlZC4KKyAgICAg
ICAgKFdJLkRhdGFHcmlkLnByb3RvdHlwZS5zZWxlY3Rpb25Db250cm9sbGVyTmV4dFNlbGVjdGFi
bGVJdGVtKTogQWRkZWQuCisgICAgICAgICogVXNlckludGVyZmFjZS9WaWV3cy9EYXRhR3JpZE5v
ZGUuanM6CisgICAgICAgIChXSS5EYXRhR3JpZE5vZGUucHJvdG90eXBlLnNlbGVjdCk6CisgICAg
ICAgIChXSS5EYXRhR3JpZE5vZGUucHJvdG90eXBlLmRlc2VsZWN0KToKKyAgICAgICAgUmVwbGFj
ZSBgc2VsZWN0ZWROb2RlYCB3aXRoIGEgYFdJLlNlbGVjdGlvbkNvbnRyb2xsZXJgIHRoYXQgYmVo
YXZlcyBsaWtlIGEgYFdJLlRyZWVPdXRsaW5lYC4KKyAgICAgICAgVXNlIHRoZSBgV0kuU2VsZWN0
aW9uQ29udHJvbGxlci5PcGVyYXRpb25gIHRvIGVuc3VyZSB0aGF0IGBXSS5QbGFjZWhvbGRlckRh
dGFHcmlkTm9kZWAgYXJlCisgICAgICAgIG5vdCBzZWxlY3RlZCB1bmxlc3MgZGlyZWN0bHkgY2hv
c2VuIChpLmUuIG5vdCBkdXJpbmcgc2hpZnQgc2VsZWN0aW9uIG9yIOKMmEEpLiBBZGQgbG9naWMg
c3VjaAorICAgICAgICB0aGF0IGBXSS5QbGFjZWhvbGRlckRhdGFHcmlkTm9kZWAgYXJlIG5vdCBj
b3BpZWQuIFByZWZlciBgX3Jvd3NgIGluc3RlYWQgb2YgYGNoaWxkcmVuYCBhcworICAgICAgICB0
aGUgbGF0dGVyIGlzIG5vdCBzb3J0ZWQvZmlsdGVyZWQuCisKKyAgICAgICAgKiBVc2VySW50ZXJm
YWNlL0NvbnRyb2xsZXJzL1NlbGVjdGlvbkNvbnRyb2xsZXIuanM6CisgICAgICAgIChXSS5TZWxl
Y3Rpb25Db250cm9sbGVyLmNyZWF0ZVRyZWVDb21wYXJhdG9yKTogQWRkZWQuCisgICAgICAgIChX
SS5TZWxlY3Rpb25Db250cm9sbGVyLmNyZWF0ZUxpc3RDb21wYXJhdG9yKTogQWRkZWQuCisgICAg
ICAgIENyZWF0ZSBgc3RhdGljYCBoZWxwZXIgZnVuY3Rpb25zIGZvciBjb21tb24gY29tcGFyYXRv
cnMuCisKKyAgICAgICAgKFdJLlNlbGVjdGlvbkNvbnRyb2xsZXIucHJvdG90eXBlLmRlc2VsZWN0
SXRlbSk6CisgICAgICAgIChXSS5TZWxlY3Rpb25Db250cm9sbGVyLnByb3RvdHlwZS5zZWxlY3RB
bGwpOgorICAgICAgICAoV0kuU2VsZWN0aW9uQ29udHJvbGxlci5wcm90b3R5cGUucmVtb3ZlU2Vs
ZWN0ZWRJdGVtcyk6CisgICAgICAgIChXSS5TZWxlY3Rpb25Db250cm9sbGVyLnByb3RvdHlwZS5o
YW5kbGVJdGVtTW91c2VEb3duKToKKyAgICAgICAgKFdJLlNlbGVjdGlvbkNvbnRyb2xsZXIucHJv
dG90eXBlLl9zZWxlY3RJdGVtc0Zyb21BcnJvd0tleSk6CisgICAgICAgIChXSS5TZWxlY3Rpb25D
b250cm9sbGVyLnByb3RvdHlwZS5fZmlyc3RTZWxlY3RhYmxlSXRlbSk6CisgICAgICAgIChXSS5T
ZWxlY3Rpb25Db250cm9sbGVyLnByb3RvdHlwZS5fbGFzdFNlbGVjdGFibGVJdGVtKToKKyAgICAg
ICAgKFdJLlNlbGVjdGlvbkNvbnRyb2xsZXIucHJvdG90eXBlLl9wcmV2aW91c1NlbGVjdGFibGVJ
dGVtKToKKyAgICAgICAgKFdJLlNlbGVjdGlvbkNvbnRyb2xsZXIucHJvdG90eXBlLl9uZXh0U2Vs
ZWN0YWJsZUl0ZW0pOgorICAgICAgICAoV0kuU2VsZWN0aW9uQ29udHJvbGxlci5wcm90b3R5cGUu
X2FkZFJhbmdlKToKKyAgICAgICAgKFdJLlNlbGVjdGlvbkNvbnRyb2xsZXIucHJvdG90eXBlLl9k
ZWxldGVSYW5nZSk6CisgICAgICAgIEludHJvZHVjZSBhIGBXSS5TZWxlY3Rpb25Db250cm9sbGVy
Lk9wZXJhdGlvbmAgd2hpY2ggaXMgdXNlZCB0byB0ZWxsIHRoZSBgX2RlbGVnYXRlYCBhYm91dAor
ICAgICAgICB3aHkgaXQncyBiZWluZyBhc2tlZCBmb3IgaW5mb3JtYXRpb24uCisKKyAgICAgICAg
KiBVc2VySW50ZXJmYWNlL1ZpZXdzL0RPTVN0b3JhZ2VDb250ZW50Vmlldy5qczoKKyAgICAgICAg
KFdJLkRPTVN0b3JhZ2VDb250ZW50Vmlldyk6CisgICAgICAgIChXSS5ET01TdG9yYWdlQ29udGVu
dFZpZXcucHJvdG90eXBlLl9kZWxldGVDYWxsYmFjayk6CisgICAgICAgIFN1cHBvcnQgbXVsdGlw
bGUgc2VsZWN0aW9uLCBpbmNsdWRpbmcgZGVsZXRpbmcgbXVsdGlwbGUgcm93cyBhdCBvbmNlLgor
CisgICAgICAgICogVXNlckludGVyZmFjZS9WaWV3cy9UYWJsZS5qczoKKyAgICAgICAgKFdJLlRh
YmxlKToKKyAgICAgICAgKiBVc2VySW50ZXJmYWNlL1ZpZXdzL1RyZWVPdXRsaW5lLmpzOgorICAg
ICAgICAoV0kuVHJlZU91dGxpbmUpOgorICAgICAgICAoV0kuVHJlZU91dGxpbmUucHJvdG90eXBl
LnNlbGVjdGlvbkNvbnRyb2xsZXJOdW1iZXJPZkl0ZW1zKTogRGVsZXRlZC4KKyAgICAgICAgUmVt
b3ZlZCB1bnVzZWQgYHNlbGVjdGlvbkNvbnRyb2xsZXJOdW1iZXJPZkl0ZW1zYC4KKworICAgICAg
ICAqIFVzZXJJbnRlcmZhY2UvVmlld3MvUHJvZmlsZVZpZXcuanM6CisgICAgICAgIChXSS5Qcm9m
aWxlVmlldyk6CisgICAgICAgIChXSS5Qcm9maWxlVmlldy5wcm90b3R5cGUuX2RhdGFHcmlkTm9k
ZVNlbGVjdGVkKToKKyAgICAgICAgTWFpbnRhaW4gYSBgX3NlbGVjdGVkRGF0YUdyaWROb2RlYCBz
byB0aGF0IGBvbGRTZWxlY3RlZE5vZGVgIGRvZXNuJ3QgaGF2ZSB0byBiZSBpbmNsdWRlZAorICAg
ICAgICB3aGVuIGRpc3BhdGNoaW5nIGBXSS5EYXRhR3JpZC5FdmVudC5TZWxlY3RlZE5vZGVDaGFu
Z2VkYC4KKwogMjAyMC0wNC0yMiAgRGV2aW4gUm91c3NvICA8ZHJvdXNzb0BhcHBsZS5jb20+CiAK
ICAgICAgICAgV2ViIEluc3BlY3RvcjogU3RvcmFnZTogdW5hYmxlIHRvIGZpbHRlciBjb29raWVz
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9Db250cm9s
bGVycy9TZWxlY3Rpb25Db250cm9sbGVyLmpzIGIvU291cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJ
bnRlcmZhY2UvQ29udHJvbGxlcnMvU2VsZWN0aW9uQ29udHJvbGxlci5qcwppbmRleCBkYmIwYWU3
MDgxZTRhYzRmMzg2YTFlNmVmMzUxZDkxODFjMDIyY2ZmLi5iMGIyZWExODFkZDM2OWYxZjFhNWQw
YjhmZTQwZGFiYjE2ZDE3Y2E1IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNl
ckludGVyZmFjZS9Db250cm9sbGVycy9TZWxlY3Rpb25Db250cm9sbGVyLmpzCisrKyBiL1NvdXJj
ZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL0NvbnRyb2xsZXJzL1NlbGVjdGlvbkNvbnRy
b2xsZXIuanMKQEAgLTQ4LDYgKzQ4LDY0IEBAIFdJLlNlbGVjdGlvbkNvbnRyb2xsZXIgPSBjbGFz
cyBTZWxlY3Rpb25Db250cm9sbGVyIGV4dGVuZHMgV0kuT2JqZWN0CiAgICAgICAgIGNvbnNvbGUu
YXNzZXJ0KHRoaXMuX2RlbGVnYXRlLnNlbGVjdGlvbkNvbnRyb2xsZXJQcmV2aW91c1NlbGVjdGFi
bGVJdGVtLCAiU2VsZWN0aW9uQ29udHJvbGxlciBkZWxlZ2F0ZSBtdXN0IGltcGxlbWVudCBzZWxl
Y3Rpb25Db250cm9sbGVyUHJldmlvdXNTZWxlY3RhYmxlSXRlbS4iKTsKICAgICB9CiAKKyAgICAv
LyBTdGF0aWMKKworICAgIHN0YXRpYyBjcmVhdGVUcmVlQ29tcGFyYXRvcihpdGVtRm9yUmVwcmVz
ZW50ZWRPYmplY3QpCisgICAgeworICAgICAgICByZXR1cm4gKGEsIGIpID0+IHsKKyAgICAgICAg
ICAgIGEgPSBpdGVtRm9yUmVwcmVzZW50ZWRPYmplY3QoYSk7CisgICAgICAgICAgICBiID0gaXRl
bUZvclJlcHJlc2VudGVkT2JqZWN0KGIpOworICAgICAgICAgICAgaWYgKCFhIHx8ICFiKQorICAg
ICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgICAgICBsZXQgZ2V0TGV2ZWwgPSAoaXRl
bSkgPT4geworICAgICAgICAgICAgICAgIGxldCBsZXZlbCA9IDA7CisgICAgICAgICAgICAgICAg
d2hpbGUgKGl0ZW0gPSBpdGVtLnBhcmVudCkKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWwrKzsK
KyAgICAgICAgICAgICAgICByZXR1cm4gbGV2ZWw7CisgICAgICAgICAgICB9OworCisgICAgICAg
ICAgICBsZXQgY29tcGFyZVNpYmxpbmdzID0gKHMsIHQpID0+IHsKKyAgICAgICAgICAgICAgICBy
ZXR1cm4gcy5wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihzKSAtIHMucGFyZW50LmNoaWxkcmVuLmlu
ZGV4T2YodCk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBpZiAoYS5wYXJlbnQgPT09
IGIucGFyZW50KQorICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJlU2libGluZ3MoYSwgYik7
CisKKyAgICAgICAgICAgIGxldCBhTGV2ZWwgPSBnZXRMZXZlbChhKTsKKyAgICAgICAgICAgIGxl
dCBiTGV2ZWwgPSBnZXRMZXZlbChiKTsKKyAgICAgICAgICAgIHdoaWxlIChhTGV2ZWwgPiBiTGV2
ZWwpIHsKKyAgICAgICAgICAgICAgICBpZiAoYS5wYXJlbnQgPT09IGIpCisgICAgICAgICAgICAg
ICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIGEgPSBhLnBhcmVudDsKKyAgICAgICAg
ICAgICAgICBhTGV2ZWwtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChiTGV2
ZWwgPiBhTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICBpZiAoYi5wYXJlbnQgPT09IGEpCisgICAg
ICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICBiID0gYi5wYXJlbnQ7
CisgICAgICAgICAgICAgICAgYkxldmVsLS07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAg
IHdoaWxlIChhLnBhcmVudCAhPT0gYi5wYXJlbnQpIHsKKyAgICAgICAgICAgICAgICBhID0gYS5w
YXJlbnQ7CisgICAgICAgICAgICAgICAgYiA9IGIucGFyZW50OworICAgICAgICAgICAgfQorCisg
ICAgICAgICAgICBjb25zb2xlLmFzc2VydChhLnBhcmVudCA9PT0gYi5wYXJlbnQsICJNaXNzaW5n
IGNvbW1vbiBhbmNlc3Rvci4iLCBhLCBiKTsKKyAgICAgICAgICAgIHJldHVybiBjb21wYXJlU2li
bGluZ3MoYSwgYik7CisgICAgICAgIH07CisgICAgfQorCisgICAgc3RhdGljIGNyZWF0ZUxpc3RD
b21wYXJhdG9yKGluZGV4Rm9yUmVwcmVzZW50ZWRPYmplY3QpCisgICAgeworICAgICAgICBjb25z
b2xlLmFzc2VydChpbmRleEZvclJlcHJlc2VudGVkT2JqZWN0KTsKKworICAgICAgICByZXR1cm4g
KGEsIGIpID0+IHsKKyAgICAgICAgICAgIHJldHVybiBpbmRleEZvclJlcHJlc2VudGVkT2JqZWN0
KGEpIC0gaW5kZXhGb3JSZXByZXNlbnRlZE9iamVjdChiKTsKKyAgICAgICAgfTsKKyAgICB9CisK
ICAgICAvLyBQdWJsaWMKIAogICAgIGdldCBkZWxlZ2F0ZSgpIHsgcmV0dXJuIHRoaXMuX2RlbGVn
YXRlOyB9CkBAIC0xMjksMTcgKzE4NywyMSBAQCBXSS5TZWxlY3Rpb25Db250cm9sbGVyID0gY2xh
c3MgU2VsZWN0aW9uQ29udHJvbGxlciBleHRlbmRzIFdJLk9iamVjdAogICAgICAgICAgICAgdGhp
cy5fbGFzdFNlbGVjdGVkSXRlbSA9IG51bGw7CiAKICAgICAgICAgICAgIGlmIChuZXdJdGVtcy5z
aXplKSB7CisgICAgICAgICAgICAgICAgY29uc29sZS5hc3NlcnQodGhpcy5fYWxsb3dzTXVsdGlw
bGVTZWxlY3Rpb24pOworCisgICAgICAgICAgICAgICAgY29uc3Qgb3BlcmF0aW9uID0gV0kuU2Vs
ZWN0aW9uQ29udHJvbGxlci5PcGVyYXRpb24uRXh0ZW5kOworCiAgICAgICAgICAgICAgICAgLy8g
RmluZCBzZWxlY3RlZCBpdGVtIGNsb3Nlc3QgdG8gZGVzZWxlY3RlZCBpdGVtLgogICAgICAgICAg
ICAgICAgIGxldCBwcmV2aW91cyA9IGl0ZW07CiAgICAgICAgICAgICAgICAgbGV0IG5leHQgPSBp
dGVtOwogICAgICAgICAgICAgICAgIHdoaWxlICghdGhpcy5fbGFzdFNlbGVjdGVkSXRlbSAmJiBw
cmV2aW91cyAmJiBuZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHByZXZpb3VzID0gdGhpcy5f
cHJldmlvdXNTZWxlY3RhYmxlSXRlbShwcmV2aW91cyk7CisgICAgICAgICAgICAgICAgICAgIHBy
ZXZpb3VzID0gdGhpcy5fcHJldmlvdXNTZWxlY3RhYmxlSXRlbShwcmV2aW91cywgb3BlcmF0aW9u
KTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzU2VsZWN0ZWRJdGVtKHByZXZpb3Vz
KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGFzdFNlbGVjdGVkSXRlbSA9IHBy
ZXZpb3VzOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAg
ICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBuZXh0ID0gdGhpcy5fbmV4dFNlbGVjdGFibGVJ
dGVtKG5leHQpOworICAgICAgICAgICAgICAgICAgICBuZXh0ID0gdGhpcy5fbmV4dFNlbGVjdGFi
bGVJdGVtKG5leHQsIG9wZXJhdGlvbik7CiAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhh
c1NlbGVjdGVkSXRlbShuZXh0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGFz
dFNlbGVjdGVkSXRlbSA9IG5leHQ7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAg
LTE1OSwxMCArMjIxLDEwIEBAIFdJLlNlbGVjdGlvbkNvbnRyb2xsZXIgPSBjbGFzcyBTZWxlY3Rp
b25Db250cm9sbGVyIGV4dGVuZHMgV0kuT2JqZWN0CiAgICAgICAgIGlmICghdGhpcy5fYWxsb3dz
TXVsdGlwbGVTZWxlY3Rpb24pCiAgICAgICAgICAgICByZXR1cm47CiAKLSAgICAgICAgdGhpcy5y
ZXNldCgpOworICAgICAgICBjb25zdCBvcGVyYXRpb24gPSBXSS5TZWxlY3Rpb25Db250cm9sbGVy
Lk9wZXJhdGlvbi5FeHRlbmQ7CiAKICAgICAgICAgbGV0IG5ld0l0ZW1zID0gbmV3IFNldDsKLSAg
ICAgICAgdGhpcy5fYWRkUmFuZ2UobmV3SXRlbXMsIHRoaXMuX2ZpcnN0U2VsZWN0YWJsZUl0ZW0o
KSwgdGhpcy5fbGFzdFNlbGVjdGFibGVJdGVtKCkpOworICAgICAgICB0aGlzLl9hZGRSYW5nZShu
ZXdJdGVtcywgdGhpcy5fZmlyc3RTZWxlY3RhYmxlSXRlbShvcGVyYXRpb24pLCB0aGlzLl9sYXN0
U2VsZWN0YWJsZUl0ZW0ob3BlcmF0aW9uKSk7CiAgICAgICAgIHRoaXMuc2VsZWN0SXRlbXMobmV3
SXRlbXMpOwogICAgIH0KIApAQCAtMTc2LDIyICsyMzgsMjQgQEAgV0kuU2VsZWN0aW9uQ29udHJv
bGxlciA9IGNsYXNzIFNlbGVjdGlvbkNvbnRyb2xsZXIgZXh0ZW5kcyBXSS5PYmplY3QKICAgICAg
ICAgaWYgKCF0aGlzLl9zZWxlY3RlZEl0ZW1zLnNpemUpCiAgICAgICAgICAgICByZXR1cm47CiAK
KyAgICAgICAgbGV0IG9wZXJhdGlvbiA9IHRoaXMuX2FsbG93c011bHRpcGxlU2VsZWN0aW9uID8g
V0kuU2VsZWN0aW9uQ29udHJvbGxlci5PcGVyYXRpb24uRXh0ZW5kIDogV0kuU2VsZWN0aW9uQ29u
dHJvbGxlci5PcGVyYXRpb24uRGlyZWN0OworCiAgICAgICAgIGxldCBvcmRlcmVkU2VsZWN0aW9u
ID0gQXJyYXkuZnJvbSh0aGlzLl9zZWxlY3RlZEl0ZW1zKS5zb3J0KHRoaXMuX2NvbXBhcmF0b3Ip
OwogCiAgICAgICAgIC8vIFRyeSBzZWxlY3RpbmcgdGhlIGl0ZW0gcHJlY2VkaW5nIHRoZSBzZWxl
Y3Rpb24uCiAgICAgICAgIGxldCBmaXJzdFNlbGVjdGVkSXRlbSA9IG9yZGVyZWRTZWxlY3Rpb25b
MF07Ci0gICAgICAgIGxldCBpdGVtVG9TZWxlY3QgPSB0aGlzLl9wcmV2aW91c1NlbGVjdGFibGVJ
dGVtKGZpcnN0U2VsZWN0ZWRJdGVtKTsKKyAgICAgICAgbGV0IGl0ZW1Ub1NlbGVjdCA9IHRoaXMu
X3ByZXZpb3VzU2VsZWN0YWJsZUl0ZW0oZmlyc3RTZWxlY3RlZEl0ZW0sIG9wZXJhdGlvbik7CiAg
ICAgICAgIGlmICghaXRlbVRvU2VsZWN0KSB7CiAgICAgICAgICAgICAvLyBJZiBubyBpdGVtIGV4
aXN0cyBiZWZvcmUgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIHNlbGVjdGlvbiwgdHJ5IHNlbGVjdGlu
ZwogICAgICAgICAgICAgLy8gYSBkZXNlbGVjdGVkIGl0ZW0gKGhvbGUpIHdpdGhpbiB0aGUgc2Vs
ZWN0aW9uLgogICAgICAgICAgICAgaXRlbVRvU2VsZWN0ID0gZmlyc3RTZWxlY3RlZEl0ZW07CiAg
ICAgICAgICAgICB3aGlsZSAoaXRlbVRvU2VsZWN0ICYmIHRoaXMuaGFzU2VsZWN0ZWRJdGVtKGl0
ZW1Ub1NlbGVjdCkpCi0gICAgICAgICAgICAgICAgaXRlbVRvU2VsZWN0ID0gdGhpcy5fbmV4dFNl
bGVjdGFibGVJdGVtKGl0ZW1Ub1NlbGVjdCk7CisgICAgICAgICAgICAgICAgaXRlbVRvU2VsZWN0
ID0gdGhpcy5fbmV4dFNlbGVjdGFibGVJdGVtKGl0ZW1Ub1NlbGVjdCwgb3BlcmF0aW9uKTsKIAog
ICAgICAgICAgICAgaWYgKCFpdGVtVG9TZWxlY3QgfHwgdGhpcy5oYXNTZWxlY3RlZEl0ZW0oaXRl
bVRvU2VsZWN0KSkgewogICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzZWxlY3Rpb24gY29udGFp
bnMgbm8gaG9sZXMsIHRyeSBzZWxlY3RpbmcgdGhlIGl0ZW0KICAgICAgICAgICAgICAgICAvLyBm
b2xsb3dpbmcgdGhlIHNlbGVjdGlvbi4KLSAgICAgICAgICAgICAgICBpdGVtVG9TZWxlY3QgPSB0
aGlzLl9uZXh0U2VsZWN0YWJsZUl0ZW0ob3JkZXJlZFNlbGVjdGlvbi5sYXN0VmFsdWUpOworICAg
ICAgICAgICAgICAgIGl0ZW1Ub1NlbGVjdCA9IHRoaXMuX25leHRTZWxlY3RhYmxlSXRlbShvcmRl
cmVkU2VsZWN0aW9uLmxhc3RWYWx1ZSwgb3BlcmF0aW9uKTsKICAgICAgICAgICAgIH0KICAgICAg
ICAgfQogCkBAIC0yNjUsNyArMzI5LDcgQEAgV0kuU2VsZWN0aW9uQ29udHJvbGxlciA9IGNsYXNz
IFNlbGVjdGlvbkNvbnRyb2xsZXIgZXh0ZW5kcyBXSS5PYmplY3QKICAgICAgICAgLy8gdGhyb3Vn
aCB0aGUgY2xpY2tlZCBpdGVtIHRvIGJlIHNlbGVjdGVkLgogICAgICAgICBpZiAoIW5ld0l0ZW1z
LnNpemUpIHsKICAgICAgICAgICAgIHRoaXMuX2xhc3RTZWxlY3RlZEl0ZW0gPSBpdGVtOwotICAg
ICAgICAgICAgdGhpcy5fc2hpZnRBbmNob3JJdGVtID0gdGhpcy5fZmlyc3RTZWxlY3RhYmxlSXRl
bSgpOworICAgICAgICAgICAgdGhpcy5fc2hpZnRBbmNob3JJdGVtID0gdGhpcy5fZmlyc3RTZWxl
Y3RhYmxlSXRlbShXSS5TZWxlY3Rpb25Db250cm9sbGVyLk9wZXJhdGlvbi5FeHRlbmQpOwogCiAg
ICAgICAgICAgICB0aGlzLl9hZGRSYW5nZShuZXdJdGVtcywgdGhpcy5fc2hpZnRBbmNob3JJdGVt
LCB0aGlzLl9sYXN0U2VsZWN0ZWRJdGVtKTsKICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVNlbGVj
dGVkSXRlbXMobmV3SXRlbXMpOwpAQCAtMzIwLDE2ICszODQsMTggQEAgV0kuU2VsZWN0aW9uQ29u
dHJvbGxlciA9IGNsYXNzIFNlbGVjdGlvbkNvbnRyb2xsZXIgZXh0ZW5kcyBXSS5PYmplY3QKIAog
ICAgIF9zZWxlY3RJdGVtc0Zyb21BcnJvd0tleShnb2luZ1VwLCBzaGlmdEtleSkKICAgICB7Cisg
ICAgICAgIGxldCBleHRlbmRTZWxlY3Rpb24gPSBzaGlmdEtleSAmJiB0aGlzLl9hbGxvd3NNdWx0
aXBsZVNlbGVjdGlvbjsKKyAgICAgICAgbGV0IG9wZXJhdGlvbiA9IGV4dGVuZFNlbGVjdGlvbiA/
IFdJLlNlbGVjdGlvbkNvbnRyb2xsZXIuT3BlcmF0aW9uLkV4dGVuZCA6IFdJLlNlbGVjdGlvbkNv
bnRyb2xsZXIuT3BlcmF0aW9uLkRpcmVjdDsKKwogICAgICAgICBpZiAoIXRoaXMuX3NlbGVjdGVk
SXRlbXMuc2l6ZSkgewotICAgICAgICAgICAgdGhpcy5zZWxlY3RJdGVtKGdvaW5nVXAgPyB0aGlz
Ll9sYXN0U2VsZWN0YWJsZUl0ZW0oKSA6IHRoaXMuX2ZpcnN0U2VsZWN0YWJsZUl0ZW0oKSk7Cisg
ICAgICAgICAgICB0aGlzLnNlbGVjdEl0ZW0oZ29pbmdVcCA/IHRoaXMuX2xhc3RTZWxlY3RhYmxl
SXRlbShvcGVyYXRpb24pIDogdGhpcy5fZmlyc3RTZWxlY3RhYmxlSXRlbShvcGVyYXRpb24pKTsK
ICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIGxldCBpdGVtID0gZ29p
bmdVcCA/IHRoaXMuX3ByZXZpb3VzU2VsZWN0YWJsZUl0ZW0odGhpcy5fbGFzdFNlbGVjdGVkSXRl
bSkgOiB0aGlzLl9uZXh0U2VsZWN0YWJsZUl0ZW0odGhpcy5fbGFzdFNlbGVjdGVkSXRlbSk7Cisg
ICAgICAgIGxldCBpdGVtID0gZ29pbmdVcCA/IHRoaXMuX3ByZXZpb3VzU2VsZWN0YWJsZUl0ZW0o
dGhpcy5fbGFzdFNlbGVjdGVkSXRlbSwgb3BlcmF0aW9uKSA6IHRoaXMuX25leHRTZWxlY3RhYmxl
SXRlbSh0aGlzLl9sYXN0U2VsZWN0ZWRJdGVtLCBvcGVyYXRpb24pOwogICAgICAgICBpZiAoIWl0
ZW0pCiAgICAgICAgICAgICByZXR1cm47CiAKLSAgICAgICAgbGV0IGV4dGVuZFNlbGVjdGlvbiA9
IHNoaWZ0S2V5ICYmIHRoaXMuX2FsbG93c011bHRpcGxlU2VsZWN0aW9uOwogICAgICAgICBpZiAo
IWV4dGVuZFNlbGVjdGlvbiB8fCAhdGhpcy5oYXNTZWxlY3RlZEl0ZW0oaXRlbSkpIHsKICAgICAg
ICAgICAgIHRoaXMuc2VsZWN0SXRlbShpdGVtLCBleHRlbmRTZWxlY3Rpb24pOwogICAgICAgICAg
ICAgcmV0dXJuOwpAQCAtMzM4LDcgKzQwNCw3IEBAIFdJLlNlbGVjdGlvbkNvbnRyb2xsZXIgPSBj
bGFzcyBTZWxlY3Rpb25Db250cm9sbGVyIGV4dGVuZHMgV0kuT2JqZWN0CiAgICAgICAgIC8vIFNp
bmNlIHRoZSBpdGVtIGluIHRoZSBkaXJlY3Rpb24gb2YgbW92ZW1lbnQgaXMgc2VsZWN0ZWQsIHdl
IGFyZSBlaXRoZXIKICAgICAgICAgLy8gZXh0ZW5kaW5nIHRoZSBzZWxlY3Rpb24gaW50byB0aGUg
aXRlbSwgb3IgZGVzZWxlY3RpbmcuIERldGVybWluZSB3aGljaAogICAgICAgICAvLyBieSBjaGVj
a2luZyB3aGV0aGVyIHRoZSBpdGVtIG9wcG9zaXRlIHRoZSBhbmNob3IgaXRlbSBpcyBzZWxlY3Rl
ZC4KLSAgICAgICAgbGV0IHByaW9ySXRlbSA9IGdvaW5nVXAgPyB0aGlzLl9uZXh0U2VsZWN0YWJs
ZUl0ZW0odGhpcy5fbGFzdFNlbGVjdGVkSXRlbSkgOiB0aGlzLl9wcmV2aW91c1NlbGVjdGFibGVJ
dGVtKHRoaXMuX2xhc3RTZWxlY3RlZEl0ZW0pOworICAgICAgICBsZXQgcHJpb3JJdGVtID0gZ29p
bmdVcCA/IHRoaXMuX25leHRTZWxlY3RhYmxlSXRlbSh0aGlzLl9sYXN0U2VsZWN0ZWRJdGVtLCBv
cGVyYXRpb24pIDogdGhpcy5fcHJldmlvdXNTZWxlY3RhYmxlSXRlbSh0aGlzLl9sYXN0U2VsZWN0
ZWRJdGVtLCBvcGVyYXRpb24pOwogICAgICAgICBpZiAoIXByaW9ySXRlbSB8fCAhdGhpcy5oYXNT
ZWxlY3RlZEl0ZW0ocHJpb3JJdGVtKSkgewogICAgICAgICAgICAgdGhpcy5kZXNlbGVjdEl0ZW0o
dGhpcy5fbGFzdFNlbGVjdGVkSXRlbSk7CiAgICAgICAgICAgICByZXR1cm47CkBAIC0zNTQsMjgg
KzQyMCwyOCBAQCBXSS5TZWxlY3Rpb25Db250cm9sbGVyID0gY2xhc3MgU2VsZWN0aW9uQ29udHJv
bGxlciBleHRlbmRzIFdJLk9iamVjdAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB0aGlz
Ll9sYXN0U2VsZWN0ZWRJdGVtID0gaXRlbTsKLSAgICAgICAgICAgIGl0ZW0gPSBnb2luZ1VwID8g
dGhpcy5fcHJldmlvdXNTZWxlY3RhYmxlSXRlbShpdGVtKSA6IHRoaXMuX25leHRTZWxlY3RhYmxl
SXRlbShpdGVtKTsKKyAgICAgICAgICAgIGl0ZW0gPSBnb2luZ1VwID8gdGhpcy5fcHJldmlvdXNT
ZWxlY3RhYmxlSXRlbShpdGVtLCBvcGVyYXRpb24pIDogdGhpcy5fbmV4dFNlbGVjdGFibGVJdGVt
KGl0ZW0sIG9wZXJhdGlvbik7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBfZmlyc3RTZWxlY3Rh
YmxlSXRlbSgpCisgICAgX2ZpcnN0U2VsZWN0YWJsZUl0ZW0ob3BlcmF0aW9uKQogICAgIHsKLSAg
ICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLnNlbGVjdGlvbkNvbnRyb2xsZXJGaXJzdFNlbGVj
dGFibGVJdGVtKHRoaXMpOworICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuc2VsZWN0aW9u
Q29udHJvbGxlckZpcnN0U2VsZWN0YWJsZUl0ZW0odGhpcywgb3BlcmF0aW9uKTsKICAgICB9CiAK
LSAgICBfbGFzdFNlbGVjdGFibGVJdGVtKCkKKyAgICBfbGFzdFNlbGVjdGFibGVJdGVtKG9wZXJh
dGlvbikKICAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5zZWxlY3Rpb25Db250
cm9sbGVyTGFzdFNlbGVjdGFibGVJdGVtKHRoaXMpOworICAgICAgICByZXR1cm4gdGhpcy5fZGVs
ZWdhdGUuc2VsZWN0aW9uQ29udHJvbGxlckxhc3RTZWxlY3RhYmxlSXRlbSh0aGlzLCBvcGVyYXRp
b24pOwogICAgIH0KIAotICAgIF9wcmV2aW91c1NlbGVjdGFibGVJdGVtKGl0ZW0pCisgICAgX3By
ZXZpb3VzU2VsZWN0YWJsZUl0ZW0oaXRlbSwgb3BlcmF0aW9uKQogICAgIHsKLSAgICAgICAgcmV0
dXJuIHRoaXMuX2RlbGVnYXRlLnNlbGVjdGlvbkNvbnRyb2xsZXJQcmV2aW91c1NlbGVjdGFibGVJ
dGVtKHRoaXMsIGl0ZW0pOworICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuc2VsZWN0aW9u
Q29udHJvbGxlclByZXZpb3VzU2VsZWN0YWJsZUl0ZW0odGhpcywgaXRlbSwgb3BlcmF0aW9uKTsK
ICAgICB9CiAKLSAgICBfbmV4dFNlbGVjdGFibGVJdGVtKGl0ZW0pCisgICAgX25leHRTZWxlY3Rh
YmxlSXRlbShpdGVtLCBvcGVyYXRpb24pCiAgICAgewotICAgICAgICByZXR1cm4gdGhpcy5fZGVs
ZWdhdGUuc2VsZWN0aW9uQ29udHJvbGxlck5leHRTZWxlY3RhYmxlSXRlbSh0aGlzLCBpdGVtKTsK
KyAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLnNlbGVjdGlvbkNvbnRyb2xsZXJOZXh0U2Vs
ZWN0YWJsZUl0ZW0odGhpcywgaXRlbSwgb3BlcmF0aW9uKTsKICAgICB9CiAKICAgICBfdXBkYXRl
U2VsZWN0ZWRJdGVtcyhpdGVtcykKQEAgLTM5NCwxMiArNDYwLDE2IEBAIFdJLlNlbGVjdGlvbkNv
bnRyb2xsZXIgPSBjbGFzcyBTZWxlY3Rpb25Db250cm9sbGVyIGV4dGVuZHMgV0kuT2JqZWN0CiAK
ICAgICBfYWRkUmFuZ2UoaXRlbXMsIGZpcnN0SXRlbSwgbGFzdEl0ZW0pCiAgICAgeworICAgICAg
ICBjb25zb2xlLmFzc2VydCh0aGlzLl9hbGxvd3NNdWx0aXBsZVNlbGVjdGlvbik7CisKKyAgICAg
ICAgY29uc3Qgb3BlcmF0aW9uID0gV0kuU2VsZWN0aW9uQ29udHJvbGxlci5PcGVyYXRpb24uRXh0
ZW5kOworCiAgICAgICAgIGxldCBjdXJyZW50ID0gZmlyc3RJdGVtOwogICAgICAgICB3aGlsZSAo
Y3VycmVudCkgewogICAgICAgICAgICAgaXRlbXMuYWRkKGN1cnJlbnQpOwogICAgICAgICAgICAg
aWYgKGN1cnJlbnQgPT09IGxhc3RJdGVtKQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICAgICAgY3VycmVudCA9IHRoaXMuX25leHRTZWxlY3RhYmxlSXRlbShjdXJyZW50KTsKKyAgICAg
ICAgICAgIGN1cnJlbnQgPSB0aGlzLl9uZXh0U2VsZWN0YWJsZUl0ZW0oY3VycmVudCwgb3BlcmF0
aW9uKTsKICAgICAgICAgfQogCiAgICAgICAgIGNvbnNvbGUuYXNzZXJ0KCFsYXN0SXRlbSB8fCBp
dGVtcy5oYXMobGFzdEl0ZW0pLCAiRW5kIG9mIHJhbmdlIGNvdWxkIG5vdCBiZSByZWFjaGVkLiIp
OwpAQCAtNDA3LDE0ICs0NzcsMjMgQEAgV0kuU2VsZWN0aW9uQ29udHJvbGxlciA9IGNsYXNzIFNl
bGVjdGlvbkNvbnRyb2xsZXIgZXh0ZW5kcyBXSS5PYmplY3QKIAogICAgIF9kZWxldGVSYW5nZShp
dGVtcywgZmlyc3RJdGVtLCBsYXN0SXRlbSkKICAgICB7CisgICAgICAgIGNvbnNvbGUuYXNzZXJ0
KHRoaXMuX2FsbG93c011bHRpcGxlU2VsZWN0aW9uKTsKKworICAgICAgICBjb25zdCBvcGVyYXRp
b24gPSBXSS5TZWxlY3Rpb25Db250cm9sbGVyLk9wZXJhdGlvbi5FeHRlbmQ7CisKICAgICAgICAg
bGV0IGN1cnJlbnQgPSBmaXJzdEl0ZW07CiAgICAgICAgIHdoaWxlIChjdXJyZW50KSB7CiAgICAg
ICAgICAgICBpdGVtcy5kZWxldGUoY3VycmVudCk7CiAgICAgICAgICAgICBpZiAoY3VycmVudCA9
PT0gbGFzdEl0ZW0pCiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjdXJyZW50
ID0gdGhpcy5fbmV4dFNlbGVjdGFibGVJdGVtKGN1cnJlbnQpOworICAgICAgICAgICAgY3VycmVu
dCA9IHRoaXMuX25leHRTZWxlY3RhYmxlSXRlbShjdXJyZW50LCBvcGVyYXRpb24pOwogICAgICAg
ICB9CiAKICAgICAgICAgY29uc29sZS5hc3NlcnQoIWxhc3RJdGVtIHx8ICFpdGVtcy5oYXMobGFz
dEl0ZW0pLCAiRW5kIG9mIHJhbmdlIGNvdWxkIG5vdCBiZSByZWFjaGVkLiIpOwogICAgIH0KIH07
CisKK1dJLlNlbGVjdGlvbkNvbnRyb2xsZXIuT3BlcmF0aW9uID0geworICAgIERpcmVjdDogU3lt
Ym9sKCJzZWxlY3Rpb24tb3BlcmF0aW9uLWRpcmVjdCIpLAorICAgIEV4dGVuZDogU3ltYm9sKCJz
ZWxlY3Rpb24tb3BlcmF0aW9uLWV4dGVuZCIpLAorfTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJJ
bnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL1ZpZXdzL0RPTVN0b3JhZ2VDb250ZW50Vmlldy5qcyBi
L1NvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL1ZpZXdzL0RPTVN0b3JhZ2VDb250
ZW50Vmlldy5qcwppbmRleCA1NzU5OWE3ZGI2ZDJlZGQ1YzYwOWU2MWRkZjhiZmNkZjNhNmM0MWVm
Li4zNWU0YmI0YjBlODYyMGVjNjMzYjE2ZGFiOWVmMzcxOWUwN2QxMTAxIDEwMDY0NAotLS0gYS9T
b3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9WaWV3cy9ET01TdG9yYWdlQ29udGVu
dFZpZXcuanMKKysrIGIvU291cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2UvVmlld3Mv
RE9NU3RvcmFnZUNvbnRlbnRWaWV3LmpzCkBAIC00OCw2ICs0OCw3IEBAIFdJLkRPTVN0b3JhZ2VD
b250ZW50VmlldyA9IGNsYXNzIERPTVN0b3JhZ2VDb250ZW50VmlldyBleHRlbmRzIFdJLkNvbnRl
bnRWaWV3CiAgICAgICAgIH0pOwogICAgICAgICB0aGlzLl9kYXRhR3JpZC5zb3J0T3JkZXIgPSBX
SS5EYXRhR3JpZC5Tb3J0T3JkZXIuQXNjZW5kaW5nOwogICAgICAgICB0aGlzLl9kYXRhR3JpZC5z
b3J0Q29sdW1uSWRlbnRpZmllciA9ICJrZXkiOworICAgICAgICB0aGlzLl9kYXRhR3JpZC5hbGxv
d3NNdWx0aXBsZVNlbGVjdGlvbiA9IHRydWU7CiAgICAgICAgIHRoaXMuX2RhdGFHcmlkLmNyZWF0
ZVNldHRpbmdzKCJkb20tc3RvcmFnZS1jb250ZW50LXZpZXciKTsKICAgICAgICAgdGhpcy5fZGF0
YUdyaWQuYWRkRXZlbnRMaXN0ZW5lcihXSS5EYXRhR3JpZC5FdmVudC5Tb3J0Q2hhbmdlZCwgdGhp
cy5fc29ydERhdGFHcmlkLCB0aGlzKTsKICAgICAgICAgdGhpcy5hZGRTdWJ2aWV3KHRoaXMuX2Rh
dGFHcmlkKTsKQEAgLTE5MywxMyArMTk0LDE0IEBAIFdJLkRPTVN0b3JhZ2VDb250ZW50VmlldyA9
IGNsYXNzIERPTVN0b3JhZ2VDb250ZW50VmlldyBleHRlbmRzIFdJLkNvbnRlbnRWaWV3CiAgICAg
ICAgIHRoaXMuX2RhdGFHcmlkLnNvcnROb2Rlc0ltbWVkaWF0ZWx5KGNvbXBhcmF0b3IpOwogICAg
IH0KIAotICAgIF9kZWxldGVDYWxsYmFjayhub2RlKQorICAgIF9kZWxldGVDYWxsYmFjaygpCiAg
ICAgewotICAgICAgICBpZiAoIW5vZGUgfHwgbm9kZS5pc1BsYWNlaG9sZGVyTm9kZSkKLSAgICAg
ICAgICAgIHJldHVybjsKLQotICAgICAgICB0aGlzLl9kYXRhR3JpZC5yZW1vdmVDaGlsZChub2Rl
KTsKLSAgICAgICAgdGhpcy5yZXByZXNlbnRlZE9iamVjdC5yZW1vdmVJdGVtKG5vZGUuZGF0YVsi
a2V5Il0pOworICAgICAgICBmb3IgKGxldCBkYXRhR3JpZE5vZGUgb2YgdGhpcy5fZGF0YUdyaWQu
c2VsZWN0ZWREYXRhR3JpZE5vZGVzKSB7CisgICAgICAgICAgICBpZiAoZGF0YUdyaWROb2RlLmlz
UGxhY2Vob2xkZXJOb2RlKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAg
dGhpcy5fZGF0YUdyaWQucmVtb3ZlQ2hpbGQoZGF0YUdyaWROb2RlKTsKKyAgICAgICAgICAgIHRo
aXMucmVwcmVzZW50ZWRPYmplY3QucmVtb3ZlSXRlbShkYXRhR3JpZE5vZGUuZGF0YVsia2V5Il0p
OworICAgICAgICB9CiAgICAgfQogCiAgICAgX2VkaXRpbmdDYWxsYmFjayhlZGl0aW5nTm9kZSwg
Y29sdW1uSWRlbnRpZmllciwgb2xkVGV4dCwgbmV3VGV4dCwgbW92ZURpcmVjdGlvbikKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL1ZpZXdzL0RhdGFHcmlk
LmpzIGIvU291cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2UvVmlld3MvRGF0YUdyaWQu
anMKaW5kZXggYmM1YmE3NWZiNTQxMmExNTQ5ZTMyNTNlNmM4MjdjZTUxYzg3YjM0My4uMjliZmJh
NWNjN2I0NTk4NWZmMzVlZmQyNmZmOTVkYWZkNjE1M2VjOCAxMDA2NDQKLS0tIGEvU291cmNlL1dl
Ykluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2UvVmlld3MvRGF0YUdyaWQuanMKKysrIGIvU291cmNl
L1dlYkluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2UvVmlld3MvRGF0YUdyaWQuanMKQEAgLTQ0LDcg
KzQ0LDYgQEAgV0kuRGF0YUdyaWQgPSBjbGFzcyBEYXRhR3JpZCBleHRlbmRzIFdJLlZpZXcKICAg
ICAgICAgdGhpcy5fcm93cyA9IFtdOwogCiAgICAgICAgIHRoaXMuY2hpbGRyZW4gPSBbXTsKLSAg
ICAgICAgdGhpcy5zZWxlY3RlZE5vZGUgPSBudWxsOwogICAgICAgICB0aGlzLmV4cGFuZE5vZGVz
V2hlbkFycm93aW5nID0gZmFsc2U7CiAgICAgICAgIHRoaXMucm9vdCA9IHRydWU7CiAgICAgICAg
IHRoaXMuaGFzQ2hpbGRyZW4gPSBmYWxzZTsKQEAgLTY4LDYgKzY3LDEzIEBAIFdJLkRhdGFHcmlk
ID0gY2xhc3MgRGF0YUdyaWQgZXh0ZW5kcyBXSS5WaWV3CiAgICAgICAgIHRoaXMuX2ZpbHRlckRl
bGVnYXRlID0gbnVsbDsKICAgICAgICAgdGhpcy5fZmlsdGVyRGlkTW9kaWZ5Tm9kZVdoaWxlUHJv
Y2Vzc2luZ0l0ZW1zID0gZmFsc2U7CiAKKyAgICAgICAgbGV0IGl0ZW1Gb3JSZXByZXNlbnRlZE9i
amVjdCA9IHRoaXMuZGF0YUdyaWROb2RlRm9yU2VsZWN0aW9uSXRlbS5iaW5kKHRoaXMpOworICAg
ICAgICBsZXQgc2VsZWN0aW9uQ29tcGFyYXRvciA9IFdJLlNlbGVjdGlvbkNvbnRyb2xsZXIuY3Jl
YXRlVHJlZUNvbXBhcmF0b3IoaXRlbUZvclJlcHJlc2VudGVkT2JqZWN0KTsKKyAgICAgICAgdGhp
cy5fc2VsZWN0aW9uQ29udHJvbGxlciA9IG5ldyBXSS5TZWxlY3Rpb25Db250cm9sbGVyKHRoaXMs
IHNlbGVjdGlvbkNvbXBhcmF0b3IpOworCisgICAgICAgIHRoaXMuX3Byb2Nlc3NpbmdTZWxlY3Rp
b25DaGFuZ2UgPSBmYWxzZTsKKyAgICAgICAgdGhpcy5fc3VwcHJlc3NOZXh0U2VsZWN0aW9uRGlk
Q2hhbmdlRXZlbnQgPSBmYWxzZTsKKwogICAgICAgICB0aGlzLmVsZW1lbnQuY2xhc3NOYW1lID0g
ImRhdGEtZ3JpZCI7CiAgICAgICAgIHRoaXMuZWxlbWVudC50YWJJbmRleCA9IDA7CiAgICAgICAg
IHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgdGhpcy5fa2V5RG93bi5i
aW5kKHRoaXMpLCBmYWxzZSk7CkBAIC0zMTgsNiArMzI0LDQ1IEBAIFdJLkRhdGFHcmlkID0gY2xh
c3MgRGF0YUdyaWQgZXh0ZW5kcyBXSS5WaWV3CiAgICAgICAgIHRoaXMuX3VwZGF0ZVNjcm9sbExp
c3RlbmVycygpOwogICAgIH0KIAorICAgIGdldCBhbGxvd3NNdWx0aXBsZVNlbGVjdGlvbigpCisg
ICAgeworICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9uQ29udHJvbGxlci5hbGxvd3NNdWx0
aXBsZVNlbGVjdGlvbjsKKyAgICB9CisKKyAgICBzZXQgYWxsb3dzTXVsdGlwbGVTZWxlY3Rpb24o
ZmxhZykKKyAgICB7CisgICAgICAgIHRoaXMuX3NlbGVjdGlvbkNvbnRyb2xsZXIuYWxsb3dzTXVs
dGlwbGVTZWxlY3Rpb24gPSBmbGFnOworICAgIH0KKworICAgIGdldCBzZWxlY3RlZE5vZGUoKQor
ICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZGF0YUdyaWROb2RlRm9yU2VsZWN0aW9uSXRlbSh0
aGlzLl9zZWxlY3Rpb25Db250cm9sbGVyLmxhc3RTZWxlY3RlZEl0ZW0pOworICAgIH0KKworICAg
IHNldCBzZWxlY3RlZE5vZGUoZGF0YUdyaWROb2RlKQorICAgIHsKKyAgICAgICAgaWYgKGRhdGFH
cmlkTm9kZSkKKyAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbkNvbnRyb2xsZXIuc2VsZWN0SXRl
bSh0aGlzLnNlbGVjdGlvbkl0ZW1Gb3JEYXRhR3JpZE5vZGUoZGF0YUdyaWROb2RlKSk7CisgICAg
ICAgIGVsc2UKKyAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbkNvbnRyb2xsZXIuZGVzZWxlY3RB
bGwoKTsKKyAgICB9CisKKyAgICBnZXQgc2VsZWN0ZWREYXRhR3JpZE5vZGVzKCkKKyAgICB7Cisg
ICAgICAgIGlmICh0aGlzLmFsbG93c011bHRpcGxlU2VsZWN0aW9uKSB7CisgICAgICAgICAgICBs
ZXQgc2VsZWN0ZWREYXRhR3JpZE5vZGVzID0gW107CisgICAgICAgICAgICBmb3IgKGxldCBpdGVt
IG9mIHRoaXMuX3NlbGVjdGlvbkNvbnRyb2xsZXIuc2VsZWN0ZWRJdGVtcykKKyAgICAgICAgICAg
ICAgICBzZWxlY3RlZERhdGFHcmlkTm9kZXMucHVzaCh0aGlzLmRhdGFHcmlkTm9kZUZvclNlbGVj
dGlvbkl0ZW0oaXRlbSkpOworICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkRGF0YUdyaWROb2Rl
czsKKyAgICAgICAgfQorCisgICAgICAgIGxldCBzZWxlY3RlZE5vZGUgPSB0aGlzLnNlbGVjdGVk
Tm9kZTsKKyAgICAgICAgaWYgKHNlbGVjdGVkTm9kZSkKKyAgICAgICAgICAgIHJldHVybiBbc2Vs
ZWN0ZWROb2RlXTsKKworICAgICAgICByZXR1cm4gW107CisgICAgfQorCiAgICAgZ2V0IGZpbHRl
clRleHQoKSB7IHJldHVybiB0aGlzLl9maWx0ZXJUZXh0OyB9CiAKICAgICBzZXQgZmlsdGVyVGV4
dCh4KQpAQCAtMTM2Niw2NCArMTQxMSw3MCBAQCBXSS5EYXRhR3JpZCA9IGNsYXNzIERhdGFHcmlk
IGV4dGVuZHMgV0kuVmlldwogCiAgICAgX2tleURvd24oZXZlbnQpCiAgICAgewotICAgICAgICBp
ZiAoIXRoaXMuc2VsZWN0ZWROb2RlIHx8IGV2ZW50LnNoaWZ0S2V5IHx8IGV2ZW50Lm1ldGFLZXkg
fHwgZXZlbnQuY3RybEtleSB8fCB0aGlzLl9lZGl0aW5nKQorICAgICAgICBpZiAodGhpcy5fZWRp
dGluZykKICAgICAgICAgICAgIHJldHVybjsKIAotICAgICAgICBsZXQgaXNSVEwgPSBXSS5yZXNv
bHZlZExheW91dERpcmVjdGlvbigpID09PSBXSS5MYXlvdXREaXJlY3Rpb24uUlRMOworICAgICAg
ICBsZXQgaXNSVEwgPSBXSS5yZXNvbHZlTGF5b3V0RGlyZWN0aW9uRm9yRWxlbWVudCh0aGlzLmVs
ZW1lbnQpID09PSBXSS5MYXlvdXREaXJlY3Rpb24uUlRMOworICAgICAgICBsZXQgZXhwYW5kS2V5
SWRlbnRpZmllciA9IGlzUlRMID8gIkxlZnQiIDogIlJpZ2h0IjsKKyAgICAgICAgbGV0IGNvbGxh
cHNlS2V5SWRlbnRpZmllciA9IGlzUlRMID8gIlJpZ2h0IiA6ICJMZWZ0IjsKIAogICAgICAgICB2
YXIgaGFuZGxlZCA9IGZhbHNlOwogICAgICAgICB2YXIgbmV4dFNlbGVjdGVkTm9kZTsKLSAgICAg
ICAgaWYgKGV2ZW50LmtleUlkZW50aWZpZXIgPT09ICJVcCIgJiYgIWV2ZW50LmFsdEtleSkgewot
ICAgICAgICAgICAgbmV4dFNlbGVjdGVkTm9kZSA9IHRoaXMuc2VsZWN0ZWROb2RlLnRyYXZlcnNl
UHJldmlvdXNOb2RlKHRydWUpOwotICAgICAgICAgICAgd2hpbGUgKG5leHRTZWxlY3RlZE5vZGUg
JiYgIW5leHRTZWxlY3RlZE5vZGUuc2VsZWN0YWJsZSkKLSAgICAgICAgICAgICAgICBuZXh0U2Vs
ZWN0ZWROb2RlID0gbmV4dFNlbGVjdGVkTm9kZS50cmF2ZXJzZVByZXZpb3VzTm9kZSh0cnVlKTsK
LSAgICAgICAgICAgIGhhbmRsZWQgPSBuZXh0U2VsZWN0ZWROb2RlID8gdHJ1ZSA6IGZhbHNlOwot
ICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleUlkZW50aWZpZXIgPT09ICJEb3duIiAmJiAhZXZl
bnQuYWx0S2V5KSB7Ci0gICAgICAgICAgICBuZXh0U2VsZWN0ZWROb2RlID0gdGhpcy5zZWxlY3Rl
ZE5vZGUudHJhdmVyc2VOZXh0Tm9kZSh0cnVlKTsKLSAgICAgICAgICAgIHdoaWxlIChuZXh0U2Vs
ZWN0ZWROb2RlICYmICFuZXh0U2VsZWN0ZWROb2RlLnNlbGVjdGFibGUpCi0gICAgICAgICAgICAg
ICAgbmV4dFNlbGVjdGVkTm9kZSA9IG5leHRTZWxlY3RlZE5vZGUudHJhdmVyc2VOZXh0Tm9kZSh0
cnVlKTsKLSAgICAgICAgICAgIGhhbmRsZWQgPSBuZXh0U2VsZWN0ZWROb2RlID8gdHJ1ZSA6IGZh
bHNlOwotICAgICAgICB9IGVsc2UgaWYgKCghaXNSVEwgJiYgZXZlbnQua2V5SWRlbnRpZmllciA9
PT0gIkxlZnQiKSB8fCAoaXNSVEwgJiYgZXZlbnQua2V5SWRlbnRpZmllciA9PT0gIlJpZ2h0Iikp
IHsKLSAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkTm9kZS5leHBhbmRlZCkgewotICAgICAg
ICAgICAgICAgIGlmIChldmVudC5hbHRLZXkpCi0gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Vs
ZWN0ZWROb2RlLmNvbGxhcHNlUmVjdXJzaXZlbHkoKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0g
ICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWROb2RlLmNvbGxhcHNlKCk7Ci0gICAgICAg
ICAgICAgICAgaGFuZGxlZCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2Vs
ZWN0ZWROb2RlLnBhcmVudCAmJiAhdGhpcy5zZWxlY3RlZE5vZGUucGFyZW50LnJvb3QpIHsKLSAg
ICAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpZiAodGhpcy5z
ZWxlY3RlZE5vZGUucGFyZW50LnNlbGVjdGFibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbmV4
dFNlbGVjdGVkTm9kZSA9IHRoaXMuc2VsZWN0ZWROb2RlLnBhcmVudDsKLSAgICAgICAgICAgICAg
ICAgICAgaGFuZGxlZCA9IG5leHRTZWxlY3RlZE5vZGUgPyB0cnVlIDogZmFsc2U7Ci0gICAgICAg
ICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkTm9kZS5wYXJlbnQpCi0gICAgICAgICAg
ICAgICAgICAgIHRoaXMuc2VsZWN0ZWROb2RlLnBhcmVudC5jb2xsYXBzZSgpOwotICAgICAgICAg
ICAgfQotICAgICAgICB9IGVsc2UgaWYgKCghaXNSVEwgJiYgZXZlbnQua2V5SWRlbnRpZmllciA9
PT0gIlJpZ2h0IikgfHwgKGlzUlRMICYmIGV2ZW50LmtleUlkZW50aWZpZXIgPT09ICJMZWZ0Iikp
IHsKLSAgICAgICAgICAgIGlmICghdGhpcy5zZWxlY3RlZE5vZGUucmV2ZWFsZWQpIHsKLSAgICAg
ICAgICAgICAgICB0aGlzLnNlbGVjdGVkTm9kZS5yZXZlYWwoKTsKLSAgICAgICAgICAgICAgICBo
YW5kbGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZE5vZGUu
aGFzQ2hpbGRyZW4pIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKKworICAgICAg
ICBpZiAodGhpcy5zZWxlY3RlZE5vZGUpIHsKKyAgICAgICAgICAgIGlmIChldmVudC5rZXlJZGVu
dGlmaWVyID09PSBjb2xsYXBzZUtleUlkZW50aWZpZXIpIHsKICAgICAgICAgICAgICAgICBpZiAo
dGhpcy5zZWxlY3RlZE5vZGUuZXhwYW5kZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgbmV4dFNl
bGVjdGVkTm9kZSA9IHRoaXMuc2VsZWN0ZWROb2RlLmNoaWxkcmVuWzBdOwotICAgICAgICAgICAg
ICAgICAgICBoYW5kbGVkID0gbmV4dFNlbGVjdGVkTm9kZSA/IHRydWUgOiBmYWxzZTsKLSAgICAg
ICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQuYWx0S2V5
KQotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE5vZGUuZXhwYW5kUmVjdXJz
aXZlbHkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWROb2RlLmNvbGxh
cHNlUmVjdXJzaXZlbHkoKTsKICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAg
ICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE5vZGUuZXhwYW5kKCk7CisgICAgICAgICAgICAgICAg
ICAgICAgICB0aGlzLnNlbGVjdGVkTm9kZS5jb2xsYXBzZSgpOworICAgICAgICAgICAgICAgICAg
ICBoYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0
ZWROb2RlLnBhcmVudCAmJiAhdGhpcy5zZWxlY3RlZE5vZGUucGFyZW50LnJvb3QpIHsKKyAgICAg
ICAgICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGlmICh0
aGlzLnNlbGVjdGVkTm9kZS5wYXJlbnQuc2VsZWN0YWJsZSkgeworICAgICAgICAgICAgICAgICAg
ICAgICAgbmV4dFNlbGVjdGVkTm9kZSA9IHRoaXMuc2VsZWN0ZWROb2RlLnBhcmVudDsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIHdoaWxlIChuZXh0U2VsZWN0ZWROb2RlICYmICFuZXh0U2VsZWN0
ZWROb2RlLnNlbGVjdGFibGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFNlbGVj
dGVkTm9kZSA9IG5leHRTZWxlY3RlZE5vZGUucGFyZW50OworICAgICAgICAgICAgICAgICAgICAg
ICAgaGFuZGxlZCA9ICEhbmV4dFNlbGVjdGVkTm9kZTsKKyAgICAgICAgICAgICAgICAgICAgfSBl
bHNlIGlmICh0aGlzLnNlbGVjdGVkTm9kZS5wYXJlbnQpCisgICAgICAgICAgICAgICAgICAgICAg
ICB0aGlzLnNlbGVjdGVkTm9kZS5wYXJlbnQuY29sbGFwc2UoKTsKKyAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleUlkZW50aWZpZXIgPT09IGV4cGFuZEtl
eUlkZW50aWZpZXIpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWROb2RlLnJl
dmVhbGVkKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWROb2RlLnJldmVhbCgp
OworICAgICAgICAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9
IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWROb2RlLmhhc0NoaWxkcmVuKSB7CisgICAgICAgICAgICAg
ICAgICAgIGhhbmRsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxl
Y3RlZE5vZGUuZXhwYW5kZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHRTZWxlY3Rl
ZE5vZGUgPSB0aGlzLnNlbGVjdGVkTm9kZS5jaGlsZHJlblswXTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIHdoaWxlIChuZXh0U2VsZWN0ZWROb2RlICYmICFuZXh0U2VsZWN0ZWROb2RlLnNlbGVj
dGFibGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFNlbGVjdGVkTm9kZSA9IG5l
eHRTZWxlY3RlZE5vZGUubmV4dFNpYmxpbmc7CisgICAgICAgICAgICAgICAgICAgICAgICBoYW5k
bGVkID0gISFuZXh0U2VsZWN0ZWROb2RlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugewor
ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmFsdEtleSkKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkTm9kZS5leHBhbmRSZWN1cnNpdmVseSgpOworICAg
ICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRo
aXMuc2VsZWN0ZWROb2RlLmV4cGFuZCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXlDb2RlID09PSA4IC8q
IEJhY2tzcGFjZSAqLyB8fCBldmVudC5rZXlDb2RlID09PSA0NiAvKiBEZWxldGUgKi8pIHsKKyAg
ICAgICAgICAgICAgICBpZiAodGhpcy5fZGVsZXRlQ2FsbGJhY2spIHsKKyAgICAgICAgICAgICAg
ICAgICAgaGFuZGxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlbGV0ZUNh
bGxiYWNrKHRoaXMuc2VsZWN0ZWROb2RlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICB9IGVsc2UgaWYgKGlzRW50ZXJLZXkoZXZlbnQpKSB7CisgICAgICAgICAgICAgICAgaWYgKHRo
aXMuX2VkaXRDYWxsYmFjaykgeworICAgICAgICAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsK
KyAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhcnRFZGl0aW5nKHRoaXMuc2VsZWN0ZWROb2Rl
LmVsZW1lbnQuY2hpbGRyZW5bMF0pOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0K
LSAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXlDb2RlID09PSA4IHx8IGV2ZW50LmtleUNvZGUg
PT09IDQ2KSB7Ci0gICAgICAgICAgICBpZiAodGhpcy5fZGVsZXRlQ2FsbGJhY2spIHsKLSAgICAg
ICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB0aGlzLl9kZWxldGVD
YWxsYmFjayh0aGlzLnNlbGVjdGVkTm9kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxz
ZSBpZiAoaXNFbnRlcktleShldmVudCkpIHsKLSAgICAgICAgICAgIGlmICh0aGlzLl9lZGl0Q2Fs
bGJhY2spIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAg
ICB0aGlzLl9zdGFydEVkaXRpbmcodGhpcy5zZWxlY3RlZE5vZGUuZWxlbWVudC5jaGlsZHJlblsw
XSk7Ci0gICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWhhbmRsZWQpIHsK
KyAgICAgICAgICAgIGhhbmRsZWQgPSB0aGlzLl9zZWxlY3Rpb25Db250cm9sbGVyLmhhbmRsZUtl
eURvd24oZXZlbnQpOworCisgICAgICAgICAgICBpZiAoaGFuZGxlZCkKKyAgICAgICAgICAgICAg
ICBuZXh0U2VsZWN0ZWROb2RlID0gdGhpcy5zZWxlY3RlZE5vZGU7CiAgICAgICAgIH0KIAogICAg
ICAgICBpZiAobmV4dFNlbGVjdGVkTm9kZSkgewpAQCAtMTQ2Miw2ICsxNTEzLDI0IEBAIFdJLkRh
dGFHcmlkID0gY2xhc3MgRGF0YUdyaWQgZXh0ZW5kcyBXSS5WaWV3CiAgICAgICAgIC8vIFRoaXMg
aXMgdGhlIHJvb3QsIGRvIG5vdGhpbmcuCiAgICAgfQogCisgICAgc2VsZWN0Tm9kZXMobm9kZXMp
CisgICAgeworICAgICAgICBpZiAoIW5vZGVzLmxlbmd0aCkKKyAgICAgICAgICAgIHJldHVybjsK
KworICAgICAgICBpZiAobm9kZXMubGVuZ3RoID09PSAxKSB7CisgICAgICAgICAgICB0aGlzLnNl
bGVjdGVkTm9kZSA9IG5vZGVzWzBdOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisK
KyAgICAgICAgY29uc29sZS5hc3NlcnQodGhpcy5hbGxvd3NNdWx0aXBsZVNlbGVjdGlvbiwgIkNh
bm5vdCBzZWxlY3QgbXVsdGlwbGUgRGF0YUdyaWROb2RlIHdpdGggbXVsdGlwbGUgc2VsZWN0aW9u
IGRpc2FibGVkLiIpOworICAgICAgICBpZiAoIXRoaXMuYWxsb3dzTXVsdGlwbGVTZWxlY3Rpb24p
CisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgbGV0IHNlbGVjdGFibGVPYmplY3RzID0g
bm9kZXMubWFwKChub2RlKSA9PiB0aGlzLnNlbGVjdGlvbkl0ZW1Gb3JEYXRhR3JpZE5vZGUobm9k
ZSkpOworICAgICAgICB0aGlzLl9zZWxlY3Rpb25Db250cm9sbGVyLnNlbGVjdEl0ZW1zKG5ldyBT
ZXQoc2VsZWN0YWJsZU9iamVjdHMpKTsKKyAgICB9CisKICAgICBkYXRhR3JpZE5vZGVGcm9tTm9k
ZSh0YXJnZXQpCiAgICAgewogICAgICAgICB2YXIgcm93RWxlbWVudCA9IHRhcmdldC5jbG9zZXN0
KCJ0ciIpOwpAQCAtMTU3OCwyMyArMTY0NywxNiBAQCBXSS5EYXRhR3JpZCA9IGNsYXNzIERhdGFH
cmlkIGV4dGVuZHMgV0kuVmlldwogCiAgICAgX21vdXNlRG93bkluRGF0YVRhYmxlKGV2ZW50KQog
ICAgIHsKLSAgICAgICAgdmFyIGdyaWROb2RlID0gdGhpcy5kYXRhR3JpZE5vZGVGcm9tTm9kZShl
dmVudC50YXJnZXQpOwotICAgICAgICBpZiAoIWdyaWROb2RlKSB7Ci0gICAgICAgICAgICBpZiAo
dGhpcy5zZWxlY3RlZE5vZGUpCi0gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE5vZGUuZGVz
ZWxlY3QoKTsKKyAgICAgICAgbGV0IGRhdGFHcmlkTm9kZSA9IHRoaXMuZGF0YUdyaWROb2RlRnJv
bU5vZGUoZXZlbnQudGFyZ2V0KTsKKyAgICAgICAgaWYgKCFkYXRhR3JpZE5vZGUpIHsKKyAgICAg
ICAgICAgIHRoaXMuX3NlbGVjdGlvbkNvbnRyb2xsZXIuZGVzZWxlY3RBbGwoKTsKICAgICAgICAg
ICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghZ3JpZE5vZGUuc2VsZWN0YWJs
ZSB8fCBncmlkTm9kZS5pc0V2ZW50V2l0aGluRGlzY2xvc3VyZVRyaWFuZ2xlKGV2ZW50KSkKKyAg
ICAgICAgaWYgKCFkYXRhR3JpZE5vZGUuc2VsZWN0YWJsZSB8fCBkYXRhR3JpZE5vZGUuaXNFdmVu
dFdpdGhpbkRpc2Nsb3N1cmVUcmlhbmdsZShldmVudCkpCiAgICAgICAgICAgICByZXR1cm47CiAK
LSAgICAgICAgaWYgKGV2ZW50Lm1ldGFLZXkpIHsKLSAgICAgICAgICAgIGlmIChncmlkTm9kZS5z
ZWxlY3RlZCkKLSAgICAgICAgICAgICAgICBncmlkTm9kZS5kZXNlbGVjdCgpOwotICAgICAgICAg
ICAgZWxzZQotICAgICAgICAgICAgICAgIGdyaWROb2RlLnNlbGVjdCgpOwotICAgICAgICB9IGVs
c2UKLSAgICAgICAgICAgIGdyaWROb2RlLnNlbGVjdCgpOworICAgICAgICB0aGlzLl9zZWxlY3Rp
b25Db250cm9sbGVyLmhhbmRsZUl0ZW1Nb3VzZURvd24odGhpcy5zZWxlY3Rpb25JdGVtRm9yRGF0
YUdyaWROb2RlKGRhdGFHcmlkTm9kZSksIGV2ZW50KTsKICAgICB9CiAKICAgICBfY29udGV4dE1l
bnVJbkhlYWRlcihldmVudCkKQEAgLTE2NjYsNyArMTcyOCw3IEBAIFdJLkRhdGFHcmlkID0gY2xh
c3MgRGF0YUdyaWQgZXh0ZW5kcyBXSS5WaWV3CiAKICAgICAgICAgaWYgKGdyaWROb2RlKSB7CiAg
ICAgICAgICAgICBpZiAoZ3JpZE5vZGUuc2VsZWN0YWJsZSAmJiBncmlkTm9kZS5jb3B5YWJsZSAm
JiAhZ3JpZE5vZGUuaXNFdmVudFdpdGhpbkRpc2Nsb3N1cmVUcmlhbmdsZShldmVudCkpIHsKLSAg
ICAgICAgICAgICAgICBjb250ZXh0TWVudS5hcHBlbmRJdGVtKFdJLlVJU3RyaW5nKCJDb3B5IFJv
dyIpLCB0aGlzLl9jb3B5Um93LmJpbmQodGhpcywgZXZlbnQudGFyZ2V0KSk7CisgICAgICAgICAg
ICAgICAgY29udGV4dE1lbnUuYXBwZW5kSXRlbShXSS5VSVN0cmluZygiQ29weSBSb3ciKSwgdGhp
cy5fY29weVJvdy5iaW5kKHRoaXMsIGdyaWROb2RlKSk7CiAgICAgICAgICAgICAgICAgY29udGV4
dE1lbnUuYXBwZW5kSXRlbShXSS5VSVN0cmluZygiQ29weSBUYWJsZSIpLCB0aGlzLl9jb3B5VGFi
bGUuYmluZCh0aGlzKSk7CiAKICAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhR3JpZC5fZWRp
dENhbGxiYWNrKSB7CkBAIC0xNzQ2LDIyICsxODA4LDMwIEBAIFdJLkRhdGFHcmlkID0gY2xhc3Mg
RGF0YUdyaWQgZXh0ZW5kcyBXSS5WaWV3CiAKICAgICBoYW5kbGVDb3B5RXZlbnQoZXZlbnQpCiAg
ICAgewotICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWROb2RlIHx8ICF3aW5kb3cuZ2V0U2VsZWN0
aW9uKCkuaXNDb2xsYXBzZWQpCisgICAgICAgIGlmICghd2luZG93LmdldFNlbGVjdGlvbigpLmlz
Q29sbGFwc2VkKQogICAgICAgICAgICAgcmV0dXJuOwogCi0gICAgICAgIHZhciBjb3B5VGV4dCA9
IHRoaXMuX2NvcHlUZXh0Rm9yRGF0YUdyaWROb2RlKHRoaXMuc2VsZWN0ZWROb2RlKTsKLSAgICAg
ICAgZXZlbnQuY2xpcGJvYXJkRGF0YS5zZXREYXRhKCJ0ZXh0L3BsYWluIiwgY29weVRleHQpOwor
ICAgICAgICBsZXQgY29weURhdGEgPSBbXTsKKyAgICAgICAgZm9yIChsZXQgZGF0YUdyaWROb2Rl
IG9mIHRoaXMuc2VsZWN0ZWREYXRhR3JpZE5vZGVzKSB7CisgICAgICAgICAgICBpZiAoIWRhdGFH
cmlkTm9kZS5jb3B5YWJsZSB8fCBkYXRhR3JpZE5vZGUuaXNQbGFjZWhvbGRlck5vZGUpCisgICAg
ICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBjb3B5RGF0YS5wdXNoKHRoaXMuX2Nv
cHlUZXh0Rm9yRGF0YUdyaWROb2RlKGRhdGFHcmlkTm9kZSkpOworICAgICAgICB9CisKKyAgICAg
ICAgaWYgKCFjb3B5RGF0YS5sZW5ndGgpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAg
ZXZlbnQuY2xpcGJvYXJkRGF0YS5zZXREYXRhKCJ0ZXh0L3BsYWluIiwgY29weURhdGEuam9pbigi
XG4iKSk7CiAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICBldmVudC5w
cmV2ZW50RGVmYXVsdCgpOwogICAgIH0KIAotICAgIF9jb3B5Um93KHRhcmdldCkKKyAgICBfY29w
eVJvdyhkYXRhR3JpZE5vZGUpCiAgICAgewotICAgICAgICB2YXIgZ3JpZE5vZGUgPSB0aGlzLmRh
dGFHcmlkTm9kZUZyb21Ob2RlKHRhcmdldCk7Ci0gICAgICAgIGlmICghZ3JpZE5vZGUpCisgICAg
ICAgIGlmICghZGF0YUdyaWROb2RlLmNvcHlhYmxlIHx8IGRhdGFHcmlkTm9kZS5pc1BsYWNlaG9s
ZGVyTm9kZSkKICAgICAgICAgICAgIHJldHVybjsKIAotICAgICAgICB2YXIgY29weVRleHQgPSB0
aGlzLl9jb3B5VGV4dEZvckRhdGFHcmlkTm9kZShncmlkTm9kZSk7CisgICAgICAgIGxldCBjb3B5
VGV4dCA9IHRoaXMuX2NvcHlUZXh0Rm9yRGF0YUdyaWROb2RlKGRhdGFHcmlkTm9kZSk7CiAgICAg
ICAgIEluc3BlY3RvckZyb250ZW5kSG9zdC5jb3B5VGV4dChjb3B5VGV4dCk7CiAgICAgfQogCkBA
IC0xNzY5LDE5ICsxODM5LDI4IEBAIFdJLkRhdGFHcmlkID0gY2xhc3MgRGF0YUdyaWQgZXh0ZW5k
cyBXSS5WaWV3CiAgICAgewogICAgICAgICBsZXQgY29weURhdGEgPSBbXTsKICAgICAgICAgY29w
eURhdGEucHVzaCh0aGlzLl9jb3B5VGV4dEZvckRhdGFHcmlkSGVhZGVycygpKTsKLSAgICAgICAg
Zm9yIChsZXQgZ3JpZE5vZGUgb2YgdGhpcy5jaGlsZHJlbikgewotICAgICAgICAgICAgaWYgKCFn
cmlkTm9kZS5jb3B5YWJsZSkKKyAgICAgICAgZm9yIChsZXQgZGF0YUdyaWROb2RlIG9mIHRoaXMu
X3Jvd3MpIHsKKyAgICAgICAgICAgIGlmICghZGF0YUdyaWROb2RlLmNvcHlhYmxlIHx8IGRhdGFH
cmlkTm9kZS5pc1BsYWNlaG9sZGVyTm9kZSkKICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAg
ICAgICAgICAgIGNvcHlEYXRhLnB1c2godGhpcy5fY29weVRleHRGb3JEYXRhR3JpZE5vZGUoZ3Jp
ZE5vZGUpKTsKKyAgICAgICAgICAgIGNvcHlEYXRhLnB1c2godGhpcy5fY29weVRleHRGb3JEYXRh
R3JpZE5vZGUoZGF0YUdyaWROb2RlKSk7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAoIWNvcHlE
YXRhLmxlbmd0aCkKKyAgICAgICAgICAgIHJldHVybjsKKwogICAgICAgICBJbnNwZWN0b3JGcm9u
dGVuZEhvc3QuY29weVRleHQoY29weURhdGEuam9pbigiXG4iKSk7CiAgICAgfQogCiAgICAgX2hh
c0NvcHlhYmxlRGF0YSgpCiAgICAgewotICAgICAgICBsZXQgZ3JpZE5vZGUgPSB0aGlzLmNoaWxk
cmVuWzBdOwotICAgICAgICByZXR1cm4gZ3JpZE5vZGUgJiYgZ3JpZE5vZGUuc2VsZWN0YWJsZSAm
JiBncmlkTm9kZS5jb3B5YWJsZTsKKyAgICAgICAgY29uc3Qgc2tpcEhpZGRlbiA9IHRydWU7Cisg
ICAgICAgIGNvbnN0IHN0YXlXaXRoaW4gPSBudWxsOworICAgICAgICBjb25zdCBkb250UG9wdWxh
dGUgPSB0cnVlOworCisgICAgICAgIGxldCBkYXRhR3JpZE5vZGUgPSB0aGlzLl9yb3dzWzBdOwor
ICAgICAgICB3aGlsZSAoZGF0YUdyaWROb2RlICYmICghZGF0YUdyaWROb2RlLnNlbGVjdGFibGUg
fHwgIWRhdGFHcmlkTm9kZS5jb3B5YWJsZSB8fCBkYXRhR3JpZE5vZGUuaXNQbGFjZWhvbGRlck5v
ZGUpKQorICAgICAgICAgICAgZGF0YUdyaWROb2RlID0gZGF0YUdyaWROb2RlLnRyYXZlcnNlTmV4
dE5vZGUoc2tpcEhpZGRlbiwgc3RheVdpdGhpbiwgZG9udFBvcHVsYXRlKTsKKyAgICAgICAgcmV0
dXJuICEhZGF0YUdyaWROb2RlOwogICAgIH0KIAogICAgIHJlc2l6ZXJEcmFnU3RhcnRlZChyZXNp
emVyKQpAQCAtMTkwNCw2ICsxOTgzLDM2IEBAIFdJLkRhdGFHcmlkID0gY2xhc3MgRGF0YUdyaWQg
ZXh0ZW5kcyBXSS5WaWV3CiAgICAgICAgIHRoaXMuX2FwcGx5RmlsdGVyVG9Ob2Rlc1Rhc2suc3Rh
cnQoKTsKICAgICB9CiAKKyAgICBzZWxlY3REYXRhR3JpZE5vZGVJbnRlcm5hbChkYXRhR3JpZE5v
ZGUsIHN1cHByZXNzU2VsZWN0ZWRFdmVudCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLl9wcm9j
ZXNzaW5nU2VsZWN0aW9uQ2hhbmdlKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHRo
aXMuX3N1cHByZXNzTmV4dFNlbGVjdGlvbkRpZENoYW5nZUV2ZW50ID0gc3VwcHJlc3NTZWxlY3Rl
ZEV2ZW50OworCisgICAgICAgIHRoaXMuX3NlbGVjdGlvbkNvbnRyb2xsZXIuc2VsZWN0SXRlbSh0
aGlzLnNlbGVjdGlvbkl0ZW1Gb3JEYXRhR3JpZE5vZGUoZGF0YUdyaWROb2RlKSk7CisgICAgfQor
CisgICAgZGVzZWxlY3REYXRhR3JpZE5vZGVJbnRlcm5hbChkYXRhR3JpZE5vZGUsIHN1cHByZXNz
RGVzZWxlY3RlZEV2ZW50KQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMuX3Byb2Nlc3NpbmdTZWxl
Y3Rpb25DaGFuZ2UpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgdGhpcy5fc3VwcHJl
c3NOZXh0U2VsZWN0aW9uRGlkQ2hhbmdlRXZlbnQgPSBzdXBwcmVzc0Rlc2VsZWN0ZWRFdmVudDsK
KworICAgICAgICB0aGlzLl9zZWxlY3Rpb25Db250cm9sbGVyLmRlc2VsZWN0SXRlbSh0aGlzLnNl
bGVjdGlvbkl0ZW1Gb3JEYXRhR3JpZE5vZGUoZGF0YUdyaWROb2RlKSk7CisgICAgfQorCisgICAg
X2Rpc3BhdGNoU2VsZWN0ZWROb2RlQ2hhbmdlZEV2ZW50KCkKKyAgICB7CisgICAgICAgIGlmICh0
aGlzLl9zdXBwcmVzc05leHRTZWxlY3Rpb25EaWRDaGFuZ2VFdmVudCkgeworICAgICAgICAgICAg
dGhpcy5fc3VwcHJlc3NOZXh0U2VsZWN0aW9uRGlkQ2hhbmdlRXZlbnQgPSBmYWxzZTsKKyAgICAg
ICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudFRv
TGlzdGVuZXJzKFdJLkRhdGFHcmlkLkV2ZW50LlNlbGVjdGVkTm9kZUNoYW5nZWQpOworICAgIH0K
KwogICAgIC8vIFlpZWxkYWJsZVRhc2sgZGVsZWdhdGUKIAogICAgIHlpZWxkYWJsZVRhc2tXaWxs
UHJvY2Vzc0l0ZW0odGFzaywgbm9kZSkKQEAgLTE5MjcsNiArMjAzNiw5NSBAQCBXSS5EYXRhR3Jp
ZCA9IGNsYXNzIERhdGFHcmlkIGV4dGVuZHMgV0kuVmlldwogICAgIHsKICAgICAgICAgdGhpcy5f
YXBwbHlGaWx0ZXJUb05vZGVzVGFzayA9IG51bGw7CiAgICAgfQorCisgICAgLy8gU2VsZWN0aW9u
Q29udHJvbGxlciBkZWxlZ2F0ZQorCisgICAgZGF0YUdyaWROb2RlRm9yU2VsZWN0aW9uSXRlbShp
dGVtKQorICAgIHsKKyAgICAgICAgY29uc29sZS5hc3NlcnQoIWl0ZW0gfHwgaXRlbSBpbnN0YW5j
ZW9mIFdJLkRhdGFHcmlkTm9kZSk7CisgICAgICAgIHJldHVybiBpdGVtOworICAgIH0KKworICAg
IHNlbGVjdGlvbkl0ZW1Gb3JEYXRhR3JpZE5vZGUoZGF0YUdyaWROb2RlKQorICAgIHsKKyAgICAg
ICAgY29uc29sZS5hc3NlcnQoIWRhdGFHcmlkTm9kZSB8fCBkYXRhR3JpZE5vZGUgaW5zdGFuY2Vv
ZiBXSS5EYXRhR3JpZE5vZGUpOworICAgICAgICByZXR1cm4gZGF0YUdyaWROb2RlOworICAgIH0K
KworICAgIHNlbGVjdGlvbkNvbnRyb2xsZXJTZWxlY3Rpb25EaWRDaGFuZ2Uoc2VsZWN0aW9uQ29u
dHJvbGxlciwgZGVzZWxlY3RlZEl0ZW1zLCBzZWxlY3RlZEl0ZW1zKQorICAgIHsKKyAgICAgICAg
dGhpcy5fcHJvY2Vzc2luZ1NlbGVjdGlvbkNoYW5nZSA9IHRydWU7CisKKyAgICAgICAgZm9yIChs
ZXQgaXRlbSBvZiBkZXNlbGVjdGVkSXRlbXMpIHsKKyAgICAgICAgICAgIGxldCBkYXRhR3JpZE5v
ZGUgPSB0aGlzLmRhdGFHcmlkTm9kZUZvclNlbGVjdGlvbkl0ZW0oaXRlbSk7CisgICAgICAgICAg
ICBkYXRhR3JpZE5vZGU/LmRlc2VsZWN0KCk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGxl
dCBpdGVtIG9mIHNlbGVjdGVkSXRlbXMpIHsKKyAgICAgICAgICAgIGxldCBkYXRhR3JpZE5vZGUg
PSB0aGlzLmRhdGFHcmlkTm9kZUZvclNlbGVjdGlvbkl0ZW0oaXRlbSk7CisgICAgICAgICAgICBk
YXRhR3JpZE5vZGU/LnNlbGVjdCgpOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5fZGlzcGF0
Y2hTZWxlY3RlZE5vZGVDaGFuZ2VkRXZlbnQoKTsKKworICAgICAgICB0aGlzLl9wcm9jZXNzaW5n
U2VsZWN0aW9uQ2hhbmdlID0gZmFsc2U7CisgICAgfQorCisgICAgc2VsZWN0aW9uQ29udHJvbGxl
ckZpcnN0U2VsZWN0YWJsZUl0ZW0oY29udHJvbGxlciwgb3BlcmF0aW9uKQorICAgIHsKKyAgICAg
ICAgbGV0IGZpcnN0Q2hpbGQgPSB0aGlzLl9yb3dzWzBdOworICAgICAgICBsZXQgaXRlbSA9IHRo
aXMuc2VsZWN0aW9uSXRlbUZvckRhdGFHcmlkTm9kZShmaXJzdENoaWxkKTsKKyAgICAgICAgaWYg
KGZpcnN0Q2hpbGQuc2VsZWN0YWJsZSAmJiAoIWZpcnN0Q2hpbGQuaXNQbGFjZWhvbGRlck5vZGUg
fHwgb3BlcmF0aW9uID09PSBXSS5TZWxlY3Rpb25Db250cm9sbGVyLk9wZXJhdGlvbi5EaXJlY3Qp
KQorICAgICAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlv
bkNvbnRyb2xsZXJOZXh0U2VsZWN0YWJsZUl0ZW0oY29udHJvbGxlciwgaXRlbSwgb3BlcmF0aW9u
KTsKKyAgICB9CisKKyAgICBzZWxlY3Rpb25Db250cm9sbGVyTGFzdFNlbGVjdGFibGVJdGVtKGNv
bnRyb2xsZXIsIG9wZXJhdGlvbikKKyAgICB7CisgICAgICAgIGxldCBsYXN0Q2hpbGQgPSB0aGlz
Ll9yb3dzLmxhc3RWYWx1ZTsKKyAgICAgICAgd2hpbGUgKGxhc3RDaGlsZC5leHBhbmRlZCAmJiBs
YXN0Q2hpbGQuY2hpbGRyZW4ubGVuZ3RoKQorICAgICAgICAgICAgbGFzdENoaWxkID0gbGFzdENo
aWxkLmNoaWxkcmVuLmxhc3RWYWx1ZTsKKworICAgICAgICBsZXQgaXRlbSA9IHRoaXMuc2VsZWN0
aW9uSXRlbUZvckRhdGFHcmlkTm9kZShsYXN0Q2hpbGQpOworICAgICAgICBpZiAobGFzdENoaWxk
LnNlbGVjdGFibGUgJiYgKCFsYXN0Q2hpbGQuaXNQbGFjZWhvbGRlck5vZGUgfHwgb3BlcmF0aW9u
ID09PSBXSS5TZWxlY3Rpb25Db250cm9sbGVyLk9wZXJhdGlvbi5EaXJlY3QpKQorICAgICAgICAg
ICAgcmV0dXJuIGl0ZW07CisgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbkNvbnRyb2xsZXJQ
cmV2aW91c1NlbGVjdGFibGVJdGVtKGNvbnRyb2xsZXIsIGl0ZW0sIG9wZXJhdGlvbik7CisgICAg
fQorCisgICAgc2VsZWN0aW9uQ29udHJvbGxlclByZXZpb3VzU2VsZWN0YWJsZUl0ZW0oY29udHJv
bGxlciwgaXRlbSwgb3BlcmF0aW9uKQorICAgIHsKKyAgICAgICAgbGV0IGRhdGFHcmlkTm9kZSA9
IHRoaXMuZGF0YUdyaWROb2RlRm9yU2VsZWN0aW9uSXRlbShpdGVtKTsKKyAgICAgICAgY29uc29s
ZS5hc3NlcnQoZGF0YUdyaWROb2RlLCAiTWlzc2luZyBEYXRhR3JpZE5vZGUgZm9yIHNlbGVjdGlv
biBpdGVtLiIsIGl0ZW0pOworICAgICAgICBpZiAoIWRhdGFHcmlkTm9kZSkKKyAgICAgICAgICAg
IHJldHVybiBudWxsOworCisgICAgICAgIGNvbnN0IHNraXBVbnJldmVhbGVkID0gdHJ1ZTsKKyAg
ICAgICAgY29uc3QgZG9udFBvcHVsYXRlID0gdHJ1ZTsKKyAgICAgICAgd2hpbGUgKGRhdGFHcmlk
Tm9kZSA9IGRhdGFHcmlkTm9kZS50cmF2ZXJzZVByZXZpb3VzTm9kZShza2lwVW5yZXZlYWxlZCwg
ZG9udFBvcHVsYXRlKSkgeworICAgICAgICAgICAgaWYgKGRhdGFHcmlkTm9kZS5zZWxlY3RhYmxl
ICYmICghZGF0YUdyaWROb2RlLmlzUGxhY2Vob2xkZXJOb2RlIHx8IG9wZXJhdGlvbiA9PT0gV0ku
U2VsZWN0aW9uQ29udHJvbGxlci5PcGVyYXRpb24uRGlyZWN0KSkKKyAgICAgICAgICAgICAgICBy
ZXR1cm4gdGhpcy5zZWxlY3Rpb25JdGVtRm9yRGF0YUdyaWROb2RlKGRhdGFHcmlkTm9kZSk7Cisg
ICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBzZWxlY3Rpb25D
b250cm9sbGVyTmV4dFNlbGVjdGFibGVJdGVtKGNvbnRyb2xsZXIsIGl0ZW0sIG9wZXJhdGlvbikK
KyAgICB7CisgICAgICAgIGxldCBkYXRhR3JpZE5vZGUgPSB0aGlzLmRhdGFHcmlkTm9kZUZvclNl
bGVjdGlvbkl0ZW0oaXRlbSk7CisgICAgICAgIGNvbnNvbGUuYXNzZXJ0KGRhdGFHcmlkTm9kZSwg
Ik1pc3NpbmcgRGF0YUdyaWROb2RlIGZvciBzZWxlY3Rpb24gaXRlbS4iLCBpdGVtKTsKKyAgICAg
ICAgaWYgKCFkYXRhR3JpZE5vZGUpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAg
ICBjb25zdCBza2lwVW5yZXZlYWxlZCA9IHRydWU7CisgICAgICAgIGNvbnN0IHN0YXlXaXRoaW4g
PSBudWxsOworICAgICAgICBjb25zdCBkb250UG9wdWxhdGUgPSB0cnVlOworICAgICAgICB3aGls
ZSAoZGF0YUdyaWROb2RlID0gZGF0YUdyaWROb2RlLnRyYXZlcnNlTmV4dE5vZGUoc2tpcFVucmV2
ZWFsZWQsIHN0YXlXaXRoaW4sIGRvbnRQb3B1bGF0ZSkpIHsKKyAgICAgICAgICAgIGlmIChkYXRh
R3JpZE5vZGUuc2VsZWN0YWJsZSAmJiAoIWRhdGFHcmlkTm9kZS5pc1BsYWNlaG9sZGVyTm9kZSB8
fCBvcGVyYXRpb24gPT09IFdJLlNlbGVjdGlvbkNvbnRyb2xsZXIuT3BlcmF0aW9uLkRpcmVjdCkp
CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0aW9uSXRlbUZvckRhdGFHcmlkTm9k
ZShkYXRhR3JpZE5vZGUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAg
fQogfTsKIAogV0kuRGF0YUdyaWQuRXZlbnQgPSB7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViSW5z
cGVjdG9yVUkvVXNlckludGVyZmFjZS9WaWV3cy9EYXRhR3JpZE5vZGUuanMgYi9Tb3VyY2UvV2Vi
SW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9WaWV3cy9EYXRhR3JpZE5vZGUuanMKaW5kZXggNjQw
NjAxMTQ1YzE2NjZjYTY4MjZlYWM0ZDVhMWQxYmM3ZDY5NjliNC4uYWNmOGRlM2NlZjhjZDUxYWE3
OGUyYTFiOTA1MzFlYmIzNjg3ODZjMiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkluc3BlY3RvclVJ
L1VzZXJJbnRlcmZhY2UvVmlld3MvRGF0YUdyaWROb2RlLmpzCisrKyBiL1NvdXJjZS9XZWJJbnNw
ZWN0b3JVSS9Vc2VySW50ZXJmYWNlL1ZpZXdzL0RhdGFHcmlkTm9kZS5qcwpAQCAtNTY2LDE4ICs1
NjYsMTAgQEAgV0kuRGF0YUdyaWROb2RlID0gY2xhc3MgRGF0YUdyaWROb2RlIGV4dGVuZHMgV0ku
T2JqZWN0CiAgICAgICAgIGlmICghdGhpcy5kYXRhR3JpZCB8fCAhdGhpcy5zZWxlY3RhYmxlIHx8
IHRoaXMuc2VsZWN0ZWQpCiAgICAgICAgICAgICByZXR1cm47CiAKLSAgICAgICAgbGV0IG9sZFNl
bGVjdGVkTm9kZSA9IHRoaXMuZGF0YUdyaWQuc2VsZWN0ZWROb2RlOwotICAgICAgICBpZiAob2xk
U2VsZWN0ZWROb2RlKQotICAgICAgICAgICAgb2xkU2VsZWN0ZWROb2RlLmRlc2VsZWN0KHRydWUp
OwotCiAgICAgICAgIHRoaXMuX3NlbGVjdGVkID0gdHJ1ZTsKLSAgICAgICAgdGhpcy5kYXRhR3Jp
ZC5zZWxlY3RlZE5vZGUgPSB0aGlzOworICAgICAgICB0aGlzLl9lbGVtZW50Py5jbGFzc0xpc3Qu
YWRkKCJzZWxlY3RlZCIpOwogCi0gICAgICAgIGlmICh0aGlzLl9lbGVtZW50KQotICAgICAgICAg
ICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKCJzZWxlY3RlZCIpOwotCi0gICAgICAgIGlm
ICghc3VwcHJlc3NTZWxlY3RlZEV2ZW50KQotICAgICAgICAgICAgdGhpcy5kYXRhR3JpZC5kaXNw
YXRjaEV2ZW50VG9MaXN0ZW5lcnMoV0kuRGF0YUdyaWQuRXZlbnQuU2VsZWN0ZWROb2RlQ2hhbmdl
ZCwge29sZFNlbGVjdGVkTm9kZX0pOworICAgICAgICB0aGlzLmRhdGFHcmlkLnNlbGVjdERhdGFH
cmlkTm9kZUludGVybmFsKHRoaXMsIHN1cHByZXNzU2VsZWN0ZWRFdmVudCk7CiAgICAgfQogCiAg
ICAgcmV2ZWFsQW5kU2VsZWN0KHN1cHByZXNzU2VsZWN0ZWRFdmVudCkKQEAgLTU4OCwxNyArNTgw
LDEzIEBAIFdJLkRhdGFHcmlkTm9kZSA9IGNsYXNzIERhdGFHcmlkTm9kZSBleHRlbmRzIFdJLk9i
amVjdAogCiAgICAgZGVzZWxlY3Qoc3VwcHJlc3NEZXNlbGVjdGVkRXZlbnQpCiAgICAgewotICAg
ICAgICBpZiAoIXRoaXMuZGF0YUdyaWQgfHwgdGhpcy5kYXRhR3JpZC5zZWxlY3RlZE5vZGUgIT09
IHRoaXMgfHwgIXRoaXMuc2VsZWN0ZWQpCisgICAgICAgIGlmICghdGhpcy5kYXRhR3JpZCB8fCAh
dGhpcy5zZWxlY3RhYmxlIHx8ICF0aGlzLnNlbGVjdGVkKQogICAgICAgICAgICAgcmV0dXJuOwog
CiAgICAgICAgIHRoaXMuX3NlbGVjdGVkID0gZmFsc2U7Ci0gICAgICAgIHRoaXMuZGF0YUdyaWQu
c2VsZWN0ZWROb2RlID0gbnVsbDsKKyAgICAgICAgdGhpcy5fZWxlbWVudD8uY2xhc3NMaXN0LnJl
bW92ZSgic2VsZWN0ZWQiKTsKIAotICAgICAgICBpZiAodGhpcy5fZWxlbWVudCkKLSAgICAgICAg
ICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgic2VsZWN0ZWQiKTsKLQotICAgICAg
ICBpZiAoIXN1cHByZXNzRGVzZWxlY3RlZEV2ZW50KQotICAgICAgICAgICAgdGhpcy5kYXRhR3Jp
ZC5kaXNwYXRjaEV2ZW50VG9MaXN0ZW5lcnMoV0kuRGF0YUdyaWQuRXZlbnQuU2VsZWN0ZWROb2Rl
Q2hhbmdlZCwge29sZFNlbGVjdGVkTm9kZTogdGhpc30pOworICAgICAgICB0aGlzLmRhdGFHcmlk
LmRlc2VsZWN0RGF0YUdyaWROb2RlSW50ZXJuYWwodGhpcywgc3VwcHJlc3NEZXNlbGVjdGVkRXZl
bnQpOwogICAgIH0KIAogICAgIHRyYXZlcnNlTmV4dE5vZGUoc2tpcEhpZGRlbiwgc3RheVdpdGhp
biwgZG9udFBvcHVsYXRlLCBpbmZvKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkluc3BlY3RvclVJ
L1VzZXJJbnRlcmZhY2UvVmlld3MvUHJvZmlsZVZpZXcuanMgYi9Tb3VyY2UvV2ViSW5zcGVjdG9y
VUkvVXNlckludGVyZmFjZS9WaWV3cy9Qcm9maWxlVmlldy5qcwppbmRleCBhMjNjNTE1N2Y2MWZj
YWNiNDY1ZjA5YjhiN2ZlMjJkYTIyMzA2MzkxLi4yMjRkMDUxZmVlNDk0YWJhZmMxYzA1ZGU2NDY0
OTAyMGI3NjkxNTA1IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVy
ZmFjZS9WaWV3cy9Qcm9maWxlVmlldy5qcworKysgYi9Tb3VyY2UvV2ViSW5zcGVjdG9yVUkvVXNl
ckludGVyZmFjZS9WaWV3cy9Qcm9maWxlVmlldy5qcwpAQCAtNjksNiArNjksOCBAQCBXSS5Qcm9m
aWxlVmlldyA9IGNsYXNzIFByb2ZpbGVWaWV3IGV4dGVuZHMgV0kuQ29udGVudFZpZXcKICAgICAg
ICAgdGhpcy5fZGF0YUdyaWQuc29ydE9yZGVyID0gV0kuRGF0YUdyaWQuU29ydE9yZGVyLkRlc2Nl
bmRpbmc7CiAgICAgICAgIHRoaXMuX2RhdGFHcmlkLmNyZWF0ZVNldHRpbmdzKCJwcm9maWxlLXZp
ZXciKTsKIAorICAgICAgICB0aGlzLl9zZWxlY3RlZERhdGFHcmlkTm9kZSA9IG51bGw7CisKICAg
ICAgICAgLy8gQ3VycmVudGx5IHdlIGNyZWF0ZSBhIG5ldyBQcm9maWxlVmlldyBmb3IgZWFjaCBD
YWxsaW5nQ29udGV4dFRyZWUsIHNvCiAgICAgICAgIC8vIHRvIHNoYXJlIHN0YXRlIGJldHdlZW4g
dGhlbSwgdXNlIGEgY29tbW9uIHNoYXJlZCBkYXRhIG9iamVjdC4KICAgICAgICAgdGhpcy5fc2hh
cmVkRGF0YSA9IGV4dHJhQXJndW1lbnRzOwpAQCAtMjExLDE4ICsyMTMsMTkgQEAgV0kuUHJvZmls
ZVZpZXcgPSBjbGFzcyBQcm9maWxlVmlldyBleHRlbmRzIFdJLkNvbnRlbnRWaWV3CiAKICAgICBf
ZGF0YUdyaWROb2RlU2VsZWN0ZWQoZXZlbnQpCiAgICAgewotICAgICAgICBsZXQgb2xkU2VsZWN0
ZWROb2RlID0gZXZlbnQuZGF0YS5vbGRTZWxlY3RlZE5vZGU7Ci0gICAgICAgIGlmIChvbGRTZWxl
Y3RlZE5vZGUpIHsKLSAgICAgICAgICAgIHRoaXMuX3JlbW92ZUd1aWRhbmNlRWxlbWVudChXSS5Q
cm9maWxlVmlldy5HdWlkYW5jZVR5cGUuU2VsZWN0ZWQsIG9sZFNlbGVjdGVkTm9kZSk7Ci0gICAg
ICAgICAgICBvbGRTZWxlY3RlZE5vZGUuZm9yRWFjaENoaWxkSW5TdWJ0cmVlKChub2RlKSA9PiB0
aGlzLl9yZW1vdmVHdWlkYW5jZUVsZW1lbnQoV0kuUHJvZmlsZVZpZXcuR3VpZGFuY2VUeXBlLlNl
bGVjdGVkLCBub2RlKSk7CisgICAgICAgIGlmICh0aGlzLl9zZWxlY3RlZERhdGFHcmlkTm9kZSkg
eworICAgICAgICAgICAgdGhpcy5fcmVtb3ZlR3VpZGFuY2VFbGVtZW50KFdJLlByb2ZpbGVWaWV3
Lkd1aWRhbmNlVHlwZS5TZWxlY3RlZCwgdGhpcy5fc2VsZWN0ZWREYXRhR3JpZE5vZGUpOworICAg
ICAgICAgICAgdGhpcy5fc2VsZWN0ZWREYXRhR3JpZE5vZGUuZm9yRWFjaENoaWxkSW5TdWJ0cmVl
KChub2RlKSA9PiB0aGlzLl9yZW1vdmVHdWlkYW5jZUVsZW1lbnQoV0kuUHJvZmlsZVZpZXcuR3Vp
ZGFuY2VUeXBlLlNlbGVjdGVkLCBub2RlKSk7CiAgICAgICAgIH0KIAotICAgICAgICBsZXQgbmV3
U2VsZWN0ZWROb2RlID0gdGhpcy5fZGF0YUdyaWQuc2VsZWN0ZWROb2RlOwotICAgICAgICBpZiAo
bmV3U2VsZWN0ZWROb2RlKSB7Ci0gICAgICAgICAgICB0aGlzLl9yZW1vdmVHdWlkYW5jZUVsZW1l
bnQoV0kuUHJvZmlsZVZpZXcuR3VpZGFuY2VUeXBlLlNlbGVjdGVkLCBuZXdTZWxlY3RlZE5vZGUp
OwotICAgICAgICAgICAgbmV3U2VsZWN0ZWROb2RlLmZvckVhY2hDaGlsZEluU3VidHJlZSgobm9k
ZSkgPT4gdGhpcy5fYXBwZW5kR3VpZGFuY2VFbGVtZW50KFdJLlByb2ZpbGVWaWV3Lkd1aWRhbmNl
VHlwZS5TZWxlY3RlZCwgbm9kZSwgbmV3U2VsZWN0ZWROb2RlKSk7CisgICAgICAgIHRoaXMuX3Nl
bGVjdGVkRGF0YUdyaWROb2RlID0gdGhpcy5fZGF0YUdyaWQuc2VsZWN0ZWROb2RlOwogCi0gICAg
ICAgICAgICB0aGlzLl9zaGFyZWREYXRhLnNlbGVjdGVkTm9kZUhhc2ggPSBuZXdTZWxlY3RlZE5v
ZGUuY2FsbGluZ0NvbnRleHRUcmVlTm9kZS5oYXNoOworCisgICAgICAgIGlmICh0aGlzLl9zZWxl
Y3RlZERhdGFHcmlkTm9kZSkgeworICAgICAgICAgICAgdGhpcy5fcmVtb3ZlR3VpZGFuY2VFbGVt
ZW50KFdJLlByb2ZpbGVWaWV3Lkd1aWRhbmNlVHlwZS5TZWxlY3RlZCwgdGhpcy5fc2VsZWN0ZWRE
YXRhR3JpZE5vZGUpOworICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWREYXRhR3JpZE5vZGUuZm9y
RWFjaENoaWxkSW5TdWJ0cmVlKChub2RlKSA9PiB0aGlzLl9hcHBlbmRHdWlkYW5jZUVsZW1lbnQo
V0kuUHJvZmlsZVZpZXcuR3VpZGFuY2VUeXBlLlNlbGVjdGVkLCBub2RlLCB0aGlzLl9zZWxlY3Rl
ZERhdGFHcmlkTm9kZSkpOworCisgICAgICAgICAgICB0aGlzLl9zaGFyZWREYXRhLnNlbGVjdGVk
Tm9kZUhhc2ggPSB0aGlzLl9zZWxlY3RlZERhdGFHcmlkTm9kZS5jYWxsaW5nQ29udGV4dFRyZWVO
b2RlLmhhc2g7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJJbnNw
ZWN0b3JVSS9Vc2VySW50ZXJmYWNlL1ZpZXdzL1RhYmxlLmpzIGIvU291cmNlL1dlYkluc3BlY3Rv
clVJL1VzZXJJbnRlcmZhY2UvVmlld3MvVGFibGUuanMKaW5kZXggODgzM2RmNzMwNjhjN2E3MzQ2
MjE3YjkwMGU2NzNmN2FiODkxNzliOS4uMjhmNDMyNjI5ZWE0YWQ4Nzc1Mjc1MDYxODgyOWY5ZGQw
ZjkyMGQ0OSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2Uv
Vmlld3MvVGFibGUuanMKKysrIGIvU291cmNlL1dlYkluc3BlY3RvclVJL1VzZXJJbnRlcmZhY2Uv
Vmlld3MvVGFibGUuanMKQEAgLTg2LDcgKzg2LDggQEAgV0kuVGFibGUgPSBjbGFzcyBUYWJsZSBl
eHRlbmRzIFdJLlZpZXcKICAgICAgICAgdGhpcy5fY29sdW1uV2lkdGhzID0gbnVsbDsgLy8gQ2Fs
Y3VsYXRlZCBpbiBfcmVzaXplQ29sdW1uc0FuZEZpbGxlci4KICAgICAgICAgdGhpcy5fZmlsbGVy
SGVpZ2h0ID0gMDsgLy8gQ2FsY3VsYXRlZCBpbiBfcmVzaXplQ29sdW1uc0FuZEZpbGxlci4KIAot
ICAgICAgICB0aGlzLl9zZWxlY3Rpb25Db250cm9sbGVyID0gbmV3IFdJLlNlbGVjdGlvbkNvbnRy
b2xsZXIodGhpcywgKGEsIGIpID0+IHRoaXMuX2luZGV4Rm9yUmVwcmVzZW50ZWRPYmplY3QoYSkg
LSB0aGlzLl9pbmRleEZvclJlcHJlc2VudGVkT2JqZWN0KGIpKTsKKyAgICAgICAgbGV0IHNlbGVj
dGlvbkNvbXBhcmF0b3IgPSBXSS5TZWxlY3Rpb25Db250cm9sbGVyLmNyZWF0ZUxpc3RDb21wYXJh
dG9yKHRoaXMuX2luZGV4Rm9yUmVwcmVzZW50ZWRPYmplY3QuYmluZCh0aGlzKSk7CisgICAgICAg
IHRoaXMuX3NlbGVjdGlvbkNvbnRyb2xsZXIgPSBuZXcgV0kuU2VsZWN0aW9uQ29udHJvbGxlcih0
aGlzLCBzZWxlY3Rpb25Db21wYXJhdG9yKTsKIAogICAgICAgICB0aGlzLl9yZXNpemVycyA9IFtd
OwogICAgICAgICB0aGlzLl9jdXJyZW50UmVzaXplciA9IG51bGw7CmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViSW5zcGVjdG9yVUkvVXNlckludGVyZmFjZS9WaWV3cy9UcmVlT3V0bGluZS5qcyBiL1Nv
dXJjZS9XZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL1ZpZXdzL1RyZWVPdXRsaW5lLmpzCmlu
ZGV4IDgxMjBjZDE1YjU1MzY5YTVjZjgyMzZjNGFhNTViMDdmOGM0YzZhMTQuLjUwN2ExNzhkNTRi
ZTE3YzM2OTkzMzhmNTdiYjFjNmNhYThjNGMyNTUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJJbnNw
ZWN0b3JVSS9Vc2VySW50ZXJmYWNlL1ZpZXdzL1RyZWVPdXRsaW5lLmpzCisrKyBiL1NvdXJjZS9X
ZWJJbnNwZWN0b3JVSS9Vc2VySW50ZXJmYWNlL1ZpZXdzL1RyZWVPdXRsaW5lLmpzCkBAIC01Nyw1
MyArNTcsOSBAQCBXSS5UcmVlT3V0bGluZSA9IGNsYXNzIFRyZWVPdXRsaW5lIGV4dGVuZHMgV0ku
T2JqZWN0CiAKICAgICAgICAgdGhpcy5fY2FjaGVkTnVtYmVyT2ZEZXNjZW5kYW50cyA9IDA7CiAK
LSAgICAgICAgbGV0IGNvbXBhcmF0b3IgPSAoYSwgYikgPT4gewotICAgICAgICAgICAgZnVuY3Rp
b24gZ2V0TGV2ZWwodHJlZUVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICBsZXQgbGV2ZWwgPSAw
OwotICAgICAgICAgICAgICAgIHdoaWxlICh0cmVlRWxlbWVudCA9IHRyZWVFbGVtZW50LnBhcmVu
dCkKLSAgICAgICAgICAgICAgICAgICAgbGV2ZWwrKzsKLSAgICAgICAgICAgICAgICByZXR1cm4g
bGV2ZWw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZ1bmN0aW9uIGNvbXBhcmVTaWJs
aW5ncyhzLCB0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHMucGFyZW50LmNoaWxkcmVuLmlu
ZGV4T2YocykgLSBzLnBhcmVudC5jaGlsZHJlbi5pbmRleE9mKHQpOwotICAgICAgICAgICAgfQot
Ci0gICAgICAgICAgICAvLyBUcmFuc2xhdGUgcmVwcmVzZW50ZWQgb2JqZWN0cyB0byBUcmVlRWxl
bWVudHMsIHdoaWNoIGhhdmUgdGhlCi0gICAgICAgICAgICAvLyBoaWVyYXJjaGljYWwgaW5mb3Jt
YXRpb24gbmVlZGVkIHRvIHBlcmZvcm0gdGhlIGNvbXBhcmlzb24uCi0gICAgICAgICAgICBhID0g
dGhpcy5nZXRDYWNoZWRUcmVlRWxlbWVudChhKTsKLSAgICAgICAgICAgIGIgPSB0aGlzLmdldENh
Y2hlZFRyZWVFbGVtZW50KGIpOwotICAgICAgICAgICAgaWYgKCFhIHx8ICFiKQotICAgICAgICAg
ICAgICAgIHJldHVybiAwOwotCi0gICAgICAgICAgICBpZiAoYS5wYXJlbnQgPT09IGIucGFyZW50
KQotICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJlU2libGluZ3MoYSwgYik7Ci0KLSAgICAg
ICAgICAgIGxldCBhTGV2ZWwgPSBnZXRMZXZlbChhKTsKLSAgICAgICAgICAgIGxldCBiTGV2ZWwg
PSBnZXRMZXZlbChiKTsKLSAgICAgICAgICAgIHdoaWxlIChhTGV2ZWwgPiBiTGV2ZWwpIHsKLSAg
ICAgICAgICAgICAgICBpZiAoYS5wYXJlbnQgPT09IGIpCi0gICAgICAgICAgICAgICAgICAgIHJl
dHVybiAxOwotICAgICAgICAgICAgICAgIGEgPSBhLnBhcmVudDsKLSAgICAgICAgICAgICAgICBh
TGV2ZWwtLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdoaWxlIChiTGV2ZWwgPiBhTGV2
ZWwpIHsKLSAgICAgICAgICAgICAgICBpZiAoYi5wYXJlbnQgPT09IGEpCi0gICAgICAgICAgICAg
ICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICBiID0gYi5wYXJlbnQ7Ci0gICAgICAg
ICAgICAgICAgYkxldmVsLS07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHdoaWxlIChh
LnBhcmVudCAhPT0gYi5wYXJlbnQpIHsKLSAgICAgICAgICAgICAgICBhID0gYS5wYXJlbnQ7Ci0g
ICAgICAgICAgICAgICAgYiA9IGIucGFyZW50OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAg
ICBjb25zb2xlLmFzc2VydChhLnBhcmVudCA9PT0gYi5wYXJlbnQsICJNaXNzaW5nIGNvbW1vbiBh
bmNlc3RvciBmb3IgVHJlZUVsZW1lbnRzLiIsIGEsIGIpOwotICAgICAgICAgICAgcmV0dXJuIGNv
bXBhcmVTaWJsaW5ncyhhLCBiKTsKLSAgICAgICAgfTsKLQotICAgICAgICB0aGlzLl9zZWxlY3Rp
b25Db250cm9sbGVyID0gbmV3IFdJLlNlbGVjdGlvbkNvbnRyb2xsZXIodGhpcywgY29tcGFyYXRv
cik7CisgICAgICAgIGxldCBpdGVtRm9yUmVwcmVzZW50ZWRPYmplY3QgPSB0aGlzLmdldENhY2hl
ZFRyZWVFbGVtZW50LmJpbmQodGhpcyk7CisgICAgICAgIGxldCBzZWxlY3Rpb25Db21wYXJhdG9y
ID0gV0kuU2VsZWN0aW9uQ29udHJvbGxlci5jcmVhdGVUcmVlQ29tcGFyYXRvcihpdGVtRm9yUmVw
cmVzZW50ZWRPYmplY3QpOworICAgICAgICB0aGlzLl9zZWxlY3Rpb25Db250cm9sbGVyID0gbmV3
IFdJLlNlbGVjdGlvbkNvbnRyb2xsZXIodGhpcywgc2VsZWN0aW9uQ29tcGFyYXRvcik7CiAKICAg
ICAgICAgdGhpcy5faXRlbVdhc1NlbGVjdGVkQnlVc2VyID0gZmFsc2U7CiAgICAgICAgIHRoaXMu
X3Byb2Nlc3NpbmdTZWxlY3Rpb25DaGFuZ2UgPSBmYWxzZTsKQEAgLTc3MCwxMSArNzI2LDYgQEAg
V0kuVHJlZU91dGxpbmUgPSBjbGFzcyBUcmVlT3V0bGluZSBleHRlbmRzIFdJLk9iamVjdAogCiAg
ICAgLy8gU2VsZWN0aW9uQ29udHJvbGxlciBkZWxlZ2F0ZQogCi0gICAgc2VsZWN0aW9uQ29udHJv
bGxlck51bWJlck9mSXRlbXMoY29udHJvbGxlcikKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlz
Ll9jYWNoZWROdW1iZXJPZkRlc2NlbmRhbnRzOwotICAgIH0KLQogICAgIHNlbGVjdGlvbkNvbnRy
b2xsZXJTZWxlY3Rpb25EaWRDaGFuZ2UoY29udHJvbGxlciwgZGVzZWxlY3RlZEl0ZW1zLCBzZWxl
Y3RlZEl0ZW1zKQogICAgIHsKICAgICAgICAgdGhpcy5fcHJvY2Vzc2luZ1NlbGVjdGlvbkNoYW5n
ZSA9IHRydWU7CmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9DaGFuZ2VMb2cgYi9MYXlvdXRUZXN0
cy9DaGFuZ2VMb2cKaW5kZXggOTNmMTdmNzBhZGE2OTY1ZTIyNjE0MzY3YmIzNTBhMzIyNzYzYTM4
Yi4uODNmNmZjODk3ZDVhMzg2OWI0ZGFkOWU0MWQxMzZiOTc1ZDQxZGViNCAxMDA2NDQKLS0tIGEv
TGF5b3V0VGVzdHMvQ2hhbmdlTG9nCisrKyBiL0xheW91dFRlc3RzL0NoYW5nZUxvZwpAQCAtMSwz
ICsxLDEzIEBACisyMDIwLTA0LTIzICBEZXZpbiBSb3Vzc28gIDxkcm91c3NvQGFwcGxlLmNvbT4K
KworICAgICAgICBXZWIgSW5zc3BlY3RvcjogU3RvcmFnZTogY2Fubm90IHNlbGVjdCBtdWx0aXBs
ZSBsb2NhbCBzdG9yYWdlIGVudHJpZXMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTIxMDg3NgorCisgICAgICAgIFJldmlld2VkIGJ5IEJyaWFuIEJ1cmcu
CisKKyAgICAgICAgKiBpbnNwZWN0b3IvdHJlZS1vdXRsaW5lL3NlbGVjdGlvbi1jb250cm9sbGVy
LXRyZWUtY29tcGFyYXRvci5odG1sOiBBZGRlZC4KKyAgICAgICAgKiBpbnNwZWN0b3IvdHJlZS1v
dXRsaW5lL3NlbGVjdGlvbi1jb250cm9sbGVyLXRyZWUtY29tcGFyYXRvci1leHBlY3RlZC50eHQ6
IEFkZGVkLgorCiAyMDIwLTA0LTIyICBDaHJpcyBEdW1leiAgPGNkdW1lekBhcHBsZS5jb20+CiAK
ICAgICAgICAgWyBNYWMgd2syIF0gaW1wb3J0ZWQvdzNjL3dlYi1wbGF0Zm9ybS10ZXN0cy9ub3Rp
ZmljYXRpb25zL2V2ZW50LW9uY2xvc2UuaHRtbCBpcyBmbGFreSBmYWlsaW5nLgpkaWZmIC0tZ2l0
IGEvTGF5b3V0VGVzdHMvaW5zcGVjdG9yL3RyZWUtb3V0bGluZS9zZWxlY3Rpb24tY29udHJvbGxl
ci10cmVlLWNvbXBhcmF0b3ItZXhwZWN0ZWQudHh0IGIvTGF5b3V0VGVzdHMvaW5zcGVjdG9yL3Ry
ZWUtb3V0bGluZS9zZWxlY3Rpb24tY29udHJvbGxlci10cmVlLWNvbXBhcmF0b3ItZXhwZWN0ZWQu
dHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAuLmM2NDA1YzMwM2QzYTUwZjlhZDRhMTA1OTYxNTI0OTQ2OWEzM2FkNTUK
LS0tIC9kZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0cy9pbnNwZWN0b3IvdHJlZS1vdXRsaW5lL3Nl
bGVjdGlvbi1jb250cm9sbGVyLXRyZWUtY29tcGFyYXRvci1leHBlY3RlZC50eHQKQEAgLTAsMCAr
MSw1MCBAQAorVGVzdHMgZm9yIFdJLlNlbGVjdGlvbkNvbnRyb2xsZXIuY3JlYXRlVHJlZUNvbXBh
cmF0b3IuCisKKworPT0gUnVubmluZyB0ZXN0IHN1aXRlOiBTZWxlY3Rpb25Db250cm9sbGVyLmNy
ZWF0ZVRyZWVDb21wYXJhdG9yCistLSBSdW5uaW5nIHRlc3QgY2FzZTogU2VsZWN0aW9uQ29udHJv
bGxlci5jcmVhdGVUcmVlQ29tcGFyYXRvci5WYWxpZFRyZWUKK0NyZWF0aW5nIHRyZWUuLi4KK1No
dWZmbGluZyB0cmVlLi4uCitTb3J0aW5nIHRyZWUuLi4KKworICByb290CisgIDEKKyAgMSA+IDEK
KyAgMSA+IDEgPiAxCisgIDEgPiAxID4gMgorICAxID4gMSA+IDMKKyAgMSA+IDIKKyAgMSA+IDIg
PiAxCisgIDEgPiAyID4gMgorICAxID4gMiA+IDMKKyAgMSA+IDMKKyAgMSA+IDMgPiAxCisgIDEg
PiAzID4gMgorICAxID4gMyA+IDMKKyAgMgorICAyID4gMQorICAyID4gMSA+IDEKKyAgMiA+IDEg
PiAyCisgIDIgPiAxID4gMworICAyID4gMgorICAyID4gMiA+IDEKKyAgMiA+IDIgPiAyCisgIDIg
PiAyID4gMworICAyID4gMworICAyID4gMyA+IDEKKyAgMiA+IDMgPiAyCisgIDIgPiAzID4gMwor
ICAzCisgIDMgPiAxCisgIDMgPiAxID4gMQorICAzID4gMSA+IDIKKyAgMyA+IDEgPiAzCisgIDMg
PiAyCisgIDMgPiAyID4gMQorICAzID4gMiA+IDIKKyAgMyA+IDIgPiAzCisgIDMgPiAzCisgIDMg
PiAzID4gMQorICAzID4gMyA+IDIKKyAgMyA+IDMgPiAzCisKZGlmZiAtLWdpdCBhL0xheW91dFRl
c3RzL2luc3BlY3Rvci90cmVlLW91dGxpbmUvc2VsZWN0aW9uLWNvbnRyb2xsZXItdHJlZS1jb21w
YXJhdG9yLmh0bWwgYi9MYXlvdXRUZXN0cy9pbnNwZWN0b3IvdHJlZS1vdXRsaW5lL3NlbGVjdGlv
bi1jb250cm9sbGVyLXRyZWUtY29tcGFyYXRvci5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmVhNmIwOTA4NWIy
MzU1Nzg1ZjFhNjEyYTgzMTJlYTk0ODNiNGI5OTYKLS0tIC9kZXYvbnVsbAorKysgYi9MYXlvdXRU
ZXN0cy9pbnNwZWN0b3IvdHJlZS1vdXRsaW5lL3NlbGVjdGlvbi1jb250cm9sbGVyLXRyZWUtY29t
cGFyYXRvci5odG1sCkBAIC0wLDAgKzEsMTYxIEBACis8IURPQ1RZUEUgaHRtbD4KKzxodG1sPgor
PGhlYWQ+Cis8c2NyaXB0IHNyYz0iLi4vLi4vaHR0cC90ZXN0cy9pbnNwZWN0b3IvcmVzb3VyY2Vz
L2luc3BlY3Rvci10ZXN0LmpzIj48L3NjcmlwdD4KKzxzY3JpcHQ+CitmdW5jdGlvbiB0ZXN0KCkK
K3sKKyAgICBmdW5jdGlvbiBpdGVtRm9yUmVwcmVzZW50ZWRPYmplY3QoeCkgeworICAgICAgICBy
ZXR1cm4geDsKKyAgICB9CisKKyAgICBmdW5jdGlvbiBjcmVhdGVUcmVlKGRhdGEpIHsKKyAgICAg
ICAgbGV0IG5vZGUgPSB7CisgICAgICAgICAgICAuLi5kYXRhLAorICAgICAgICAgICAgcGFyZW50
OiBudWxsLAorICAgICAgICAgICAgY2hpbGRyZW46IGRhdGEuY2hpbGRyZW4gfHwgW10sCisgICAg
ICAgIH07CisKKyAgICAgICAgbm9kZS5jaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4ubWFwKChjaGls
ZERhdGEpID0+IHsKKyAgICAgICAgICAgIGxldCBjaGlsZE5vZGUgPSBjcmVhdGVUcmVlKGNoaWxk
RGF0YSk7CisgICAgICAgICAgICBjaGlsZE5vZGUucGFyZW50ID0gbm9kZTsKKyAgICAgICAgICAg
IHJldHVybiBjaGlsZE5vZGU7CisgICAgICAgIH0pOworCisgICAgICAgIHJldHVybiBub2RlOwor
ICAgIH0KKworICAgIGZ1bmN0aW9uIGZsYXR0ZW4obm9kZSkgeworICAgICAgICByZXR1cm4gW25v
ZGUsIC4uLm5vZGUuY2hpbGRyZW4uZmxhdE1hcChmbGF0dGVuKV07CisgICAgfQorCisgICAgZnVu
Y3Rpb24gc2h1ZmZsZShhcnJheSkgeworICAgICAgICBsZXQgc2h1ZmZsZWQgPSBbXTsKKyAgICAg
ICAgd2hpbGUgKGFycmF5Lmxlbmd0aCkKKyAgICAgICAgICAgIHNodWZmbGVkLnB1c2goYXJyYXku
c3BsaWNlKE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGFycmF5Lmxlbmd0aCksIDEpWzBdKTsK
KyAgICAgICAgcmV0dXJuIHNodWZmbGVkOworICAgIH0KKworICAgIGxldCBzdWl0ZSA9IEluc3Bl
Y3RvclRlc3QuY3JlYXRlU3luY1N1aXRlKCJTZWxlY3Rpb25Db250cm9sbGVyLmNyZWF0ZVRyZWVD
b21wYXJhdG9yIik7CisKKyAgICBzdWl0ZS5hZGRUZXN0Q2FzZSh7CisgICAgICAgIG5hbWU6ICJT
ZWxlY3Rpb25Db250cm9sbGVyLmNyZWF0ZVRyZWVDb21wYXJhdG9yLlZhbGlkVHJlZSIsCisgICAg
ICAgIGRlc2NyaXB0aW9uOiAiQ2hlY2sgdGhhdCBjcmVhdGVUcmVlQ29tcGFyYXRvciB3b3JrcyB3
aXRoIGEgdmFsaWQgdHJlZS4iLAorICAgICAgICB0ZXN0KCkgeworICAgICAgICAgICAgbGV0IGNv
bXBhcmF0b3IgPSBXSS5TZWxlY3Rpb25Db250cm9sbGVyLmNyZWF0ZVRyZWVDb21wYXJhdG9yKGl0
ZW1Gb3JSZXByZXNlbnRlZE9iamVjdCk7CisKKyAgICAgICAgICAgIEluc3BlY3RvclRlc3QubG9n
KCJDcmVhdGluZyB0cmVlLi4uIik7CisgICAgICAgICAgICBsZXQgcm9vdCA9IGNyZWF0ZVRyZWUo
eworICAgICAgICAgICAgICAgIGlkOiAicm9vdCIsCisgICAgICAgICAgICAgICAgY2hpbGRyZW46
IFsKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICIx
IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogIjEgPiAx
IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IFsKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpZDogIjEgPiAxID4gMSJ9LAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAge2lkOiAiMSA+IDEgPiAyIn0sCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICB7aWQ6ICIxID4gMSA+IDMifSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgaWQ6ICIxID4gMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxk
cmVuOiBbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aWQ6ICIxID4gMiA+
IDEifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpZDogIjEgPiAyID4g
MiJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2lkOiAiMSA+IDIgPiAz
In0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGlkOiAiMSA+IDMiLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBjaGlsZHJlbjogWworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAge2lkOiAiMSA+IDMgPiAxIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICB7aWQ6ICIxID4gMyA+IDIifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHtpZDogIjEgPiAzID4gMyJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgCisgICAgICAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICAgICB9LAor
ICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZDogIjIiLAor
ICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IFsKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAiMiA+IDEiLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjogWworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAge2lkOiAiMiA+IDEgPiAxIn0sCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICB7aWQ6ICIyID4gMSA+IDIifSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHtpZDogIjIgPiAxID4gMyJ9LAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBpZDogIjIgPiAyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46
IFsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpZDogIjIgPiAyID4gMSJ9
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2lkOiAiMiA+IDIgPiAyIn0s
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aWQ6ICIyID4gMiA+IDMifSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgaWQ6ICIyID4gMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGNoaWxkcmVuOiBbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7
aWQ6ICIyID4gMyA+IDEifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtp
ZDogIjIgPiAzID4gMiJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2lk
OiAiMiA+IDMgPiAzIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIF0sCisg
ICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGlkOiAiMyIsCisgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjog
WworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgaWQ6ICIzID4gMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNo
aWxkcmVuOiBbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aWQ6ICIzID4g
MSA+IDEifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpZDogIjMgPiAx
ID4gMiJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2lkOiAiMyA+IDEg
PiAzIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAiMyA+IDIiLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBjaGlsZHJlbjogWworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAge2lkOiAiMyA+IDIgPiAxIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB7aWQ6ICIzID4gMiA+IDIifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHtpZDogIjMgPiAyID4gMyJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBd
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogIjMgPiAzIiwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW46IFsKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHtpZDogIjMgPiAzID4gMSJ9LAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAge2lkOiAiMyA+IDMgPiAyIn0sCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB7aWQ6ICIzID4gMyA+IDMifSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAg
ICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAg
ICAgICBdLAorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIEluc3BlY3RvclRlc3QubG9n
KCJTaHVmZmxpbmcgdHJlZS4uLiIpOworICAgICAgICAgICAgbGV0IG5vZGVzID0gc2h1ZmZsZShm
bGF0dGVuKHJvb3QpKTsKKworICAgICAgICAgICAgSW5zcGVjdG9yVGVzdC5sb2coIlNvcnRpbmcg
dHJlZS4uLiIpOworICAgICAgICAgICAgbm9kZXMuc29ydChjb21wYXJhdG9yKTsKKworICAgICAg
ICAgICAgSW5zcGVjdG9yVGVzdC5uZXdsaW5lKCk7CisgICAgICAgICAgICBmb3IgKGxldCBub2Rl
IG9mIG5vZGVzKQorICAgICAgICAgICAgICAgIEluc3BlY3RvclRlc3QubG9nKCIgICIgKyBub2Rl
LmlkKTsKKyAgICAgICAgfSwKKyAgICB9KTsKKworICAgIHN1aXRlLnJ1blRlc3RDYXNlc0FuZEZp
bmlzaCgpOworfQorPC9zY3JpcHQ+Cis8L2hlYWQ+Cis8Ym9keSBvbkxvYWQ9InJ1blRlc3QoKSI+
CisgICAgPHA+VGVzdHMgZm9yIFdJLlNlbGVjdGlvbkNvbnRyb2xsZXIuY3JlYXRlVHJlZUNvbXBh
cmF0b3IuPC9wPgorPC9ib2R5PgorPC9odG1sPgo=
</data>

          </attachment>
      

    </bug>

</bugzilla>