@sapui5/sap.fe.test 1.101.1 → 1.102.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -18,6 +18,7 @@ sap.ui.define([], function () {
18
18
  function MockContext(oValues, oBinding) {
19
19
  var _this = this;
20
20
 
21
+ this.isKeptAlive = false;
21
22
  this.getProperty = jest.fn(function (key) {
22
23
  return _this.oValues[key];
23
24
  });
@@ -54,6 +55,14 @@ sap.ui.define([], function () {
54
55
  return (_this$oBinding = _this.oBinding) === null || _this$oBinding === void 0 ? void 0 : _this$oBinding.getModel();
55
56
  });
56
57
  this.isTransient = jest.fn();
58
+ this.setKeepAlive = jest.fn(function (bool, _fnOnBeforeDestroy, _bRequestMessages) {
59
+ _this.isKeptAlive = bool;
60
+ });
61
+ this.isKeepAlive = jest.fn(function () {
62
+ return _this.isKeptAlive;
63
+ });
64
+ this.requestSideEffects = jest.fn();
65
+ this.requestObject = jest.fn();
57
66
  this.oValues = oValues;
58
67
  this.oBinding = oBinding;
59
68
  }
@@ -94,6 +103,7 @@ sap.ui.define([], function () {
94
103
 
95
104
  _this2 = _MockUI5Element.call.apply(_MockUI5Element, [this].concat(args)) || this;
96
105
  _this2.getBindingContext = jest.fn();
106
+ _this2.getModel = jest.fn();
97
107
  return _this2;
98
108
  }
99
109
 
@@ -140,6 +150,9 @@ sap.ui.define([], function () {
140
150
  this.getModel = jest.fn(function () {
141
151
  return _this4.mockModel;
142
152
  });
153
+ this.getUpdateGroupId = jest.fn(function () {
154
+ return "auto";
155
+ });
143
156
  this.mockModel = mockModel;
144
157
  aContexts = aContexts || [];
145
158
  this.aMockContexts = aContexts.map(function (context) {
@@ -164,33 +177,100 @@ sap.ui.define([], function () {
164
177
 
165
178
  _exports.MockListBinding = MockListBinding;
166
179
 
180
+ var MockPropertyBinding = /*#__PURE__*/function () {
181
+ function MockPropertyBinding(mockModel, mockPath) {
182
+ var _this5 = this;
183
+
184
+ this.getModel = jest.fn(function () {
185
+ return _this5.mockModel;
186
+ });
187
+ this.getPath = jest.fn(function () {
188
+ return _this5.mockPath;
189
+ });
190
+ this.getValue = jest.fn(function () {
191
+ var _this5$mockModel;
192
+
193
+ return _this5 === null || _this5 === void 0 ? void 0 : (_this5$mockModel = _this5.mockModel) === null || _this5$mockModel === void 0 ? void 0 : _this5$mockModel.getProperty("/" + _this5.mockPath);
194
+ });
195
+ this.setModel(mockModel);
196
+ this.setPath(mockPath);
197
+ }
198
+
199
+ _exports.MockPropertyBinding = MockPropertyBinding;
200
+ var _proto3 = MockPropertyBinding.prototype;
201
+
202
+ _proto3.isA = function isA(sClassName) {
203
+ return sClassName === "sap/ui/model/odata/v4/ODataPropertyBinding";
204
+ };
205
+
206
+ _proto3.setModel = function setModel(oModel) {
207
+ this.mockModel = oModel;
208
+ };
209
+
210
+ _proto3.setPath = function setPath(path) {
211
+ this.mockPath = path ? path : "";
212
+ };
213
+
214
+ return MockPropertyBinding;
215
+ }();
216
+
217
+ _exports.MockPropertyBinding = MockPropertyBinding;
218
+
219
+ var MockCompositeBinding = /*#__PURE__*/function () {
220
+ function MockCompositeBinding(aBindings) {
221
+ var _this6 = this;
222
+
223
+ this.getBindings = jest.fn(function () {
224
+ return _this6.aBindings;
225
+ });
226
+ this.getValue = jest.fn(function () {
227
+ return _this6.aBindings.map(function (binding) {
228
+ return binding.getValue();
229
+ });
230
+ });
231
+ this.aBindings = aBindings;
232
+ }
233
+
234
+ _exports.MockCompositeBinding = MockCompositeBinding;
235
+ var _proto4 = MockCompositeBinding.prototype;
236
+
237
+ _proto4.isA = function isA(sClassName) {
238
+ return sClassName === "sap.ui.model.CompositeBinding";
239
+ };
240
+
241
+ return MockCompositeBinding;
242
+ }();
243
+
244
+ _exports.MockCompositeBinding = MockCompositeBinding;
245
+
167
246
  var MockContextBinding = /*#__PURE__*/function () {
168
247
  function MockContextBinding(oContext, mockModel) {
169
- var _this5 = this;
248
+ var _this7 = this;
170
249
 
250
+ this.isKeptAlive = false;
171
251
  this.getBoundContext = jest.fn(function () {
172
- return _this5.oMockContext;
252
+ return _this7.oMockContext;
173
253
  });
174
254
  this.attachEventOnce = jest.fn();
175
255
  this.getModel = jest.fn(function () {
176
- return _this5.mockModel;
256
+ return _this7.mockModel;
177
257
  });
178
258
  this.mockModel = mockModel;
179
259
  this.oMockContext = new MockContext(oContext || {}, this);
180
260
  }
181
261
 
182
262
  _exports.MockContextBinding = MockContextBinding;
183
- var _proto3 = MockContextBinding.prototype;
263
+ var _proto5 = MockContextBinding.prototype;
184
264
 
185
- _proto3.isA = function isA(sClassName) {
265
+ _proto5.isA = function isA(sClassName) {
186
266
  return sClassName === "sap.ui.model.odata.v4.ODataContextBinding";
187
267
  };
188
268
 
189
- _proto3.getInternalMockContext = function getInternalMockContext() {
269
+ _proto5.getInternalMockContext = function getInternalMockContext() {
190
270
  return this.oMockContext;
191
271
  };
192
272
 
193
- _proto3.setModel = function setModel(oModel) {
273
+ _proto5.setModel = function setModel(oModel) {
194
274
  this.mockModel = oModel;
195
275
  } // Mocked API
196
276
  ;
@@ -205,7 +285,7 @@ sap.ui.define([], function () {
205
285
  _exports.MockContextBinding = MockContextBinding;
206
286
 
207
287
  var MockMetaModel = function MockMetaModel(oMetaData) {
208
- var _this6 = this;
288
+ var _this8 = this;
209
289
 
210
290
  this.getMetaContext = jest.fn(function (sPath) {
211
291
  return new MockContext({
@@ -213,7 +293,7 @@ sap.ui.define([], function () {
213
293
  });
214
294
  });
215
295
  this.getObject = jest.fn(function (sPath) {
216
- return _this6.oMetaContext.getProperty(sPath);
296
+ return _this8.oMetaContext.getProperty(sPath);
217
297
  });
218
298
  this.requestObject = jest.fn();
219
299
  this.createBindingContext = jest.fn(function (sPath) {
@@ -238,20 +318,21 @@ sap.ui.define([], function () {
238
318
 
239
319
  var MockModel = /*#__PURE__*/function () {
240
320
  function MockModel(mockListBinding, mockContextBinding) {
241
- var _this7 = this;
321
+ var _this9 = this;
242
322
 
243
323
  this.bindList = jest.fn(function () {
244
- return _this7.mockListBinding;
324
+ return _this9.mockListBinding;
245
325
  });
246
326
  this.bindContext = jest.fn(function () {
247
- return _this7.mockContextBinding;
327
+ return _this9.mockContextBinding;
248
328
  });
249
329
  this.getMetaModel = jest.fn(function () {
250
- return _this7.oMetaModel;
330
+ return _this9.oMetaModel;
251
331
  });
252
332
  this.getProperty = jest.fn();
253
333
  this.setProperty = jest.fn();
254
334
  this.requestObject = jest.fn();
335
+ this.getKeepAliveContext = jest.fn();
255
336
  this.mockListBinding = mockListBinding;
256
337
  this.mockContextBinding = mockContextBinding;
257
338
 
@@ -275,9 +356,9 @@ sap.ui.define([], function () {
275
356
  return new MockModel(undefined, mockContextBinding);
276
357
  };
277
358
 
278
- var _proto4 = MockModel.prototype;
359
+ var _proto6 = MockModel.prototype;
279
360
 
280
- _proto4.setMetaModel = function setMetaModel(oMetaModel) {
361
+ _proto6.setMetaModel = function setMetaModel(oMetaModel) {
281
362
  this.oMetaModel = oMetaModel;
282
363
  } // Mocked API
283
364
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
@@ -298,9 +379,9 @@ sap.ui.define([], function () {
298
379
  }
299
380
 
300
381
  _exports.MockView = MockView;
301
- var _proto5 = MockView.prototype;
382
+ var _proto7 = MockView.prototype;
302
383
 
303
- _proto5.isA = function isA(sClassName) {
384
+ _proto7.isA = function isA(sClassName) {
304
385
  return sClassName === "sap.ui.core.mvc.View";
305
386
  };
306
387
 
@@ -348,4 +429,4 @@ sap.ui.define([], function () {
348
429
  _exports.mockMVC = mockMVC;
349
430
  return _exports;
350
431
  }, false);
351
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlVJNU1vY2tIZWxwZXIudHMiXSwibmFtZXMiOlsiTW9ja0NvbnRleHQiLCJvVmFsdWVzIiwib0JpbmRpbmciLCJnZXRQcm9wZXJ0eSIsImplc3QiLCJmbiIsImtleSIsInJlcXVlc3RQcm9wZXJ0eSIsIlByb21pc2UiLCJyZXNvbHZlIiwic2V0UHJvcGVydHkiLCJ2YWx1ZSIsImdldE9iamVjdCIsInBhdGgiLCJ0aGF0IiwicmVzdWx0IiwiaW5kZXhPZiIsInBhcnRzIiwic3BsaXQiLCJyZWR1Y2UiLCJzdW0iLCJwYXJ0IiwiZ2V0UGF0aCIsImdldEJpbmRpbmciLCJnZXRNb2RlbCIsImlzVHJhbnNpZW50IiwiaXNBIiwic0NsYXNzTmFtZSIsIk1vY2tVSTVFbGVtZW50IiwiYmluZGluZ0NvbnRleHQiLCJnZXRCaW5kaW5nQ29udGV4dCIsIm1vY2tSZXR1cm5WYWx1ZSIsImdldEJpbmRpbmdJbmZvIiwiZGF0YSIsImdldFBhcmVudCIsIk1vY2tDb250cm9sIiwiTW9ja0V2ZW50IiwicGFyYW1zIiwic291cmNlIiwiZ2V0UGFyYW1ldGVyIiwibmFtZSIsImdldFNvdXJjZSIsIk1vY2tMaXN0QmluZGluZyIsImFDb250ZXh0cyIsIm1vY2tNb2RlbCIsInNldEFnZ3JlZ2F0aW9uIiwiZmlsdGVyIiwic29ydCIsInJlcXVlc3RDb250ZXh0cyIsImFNb2NrQ29udGV4dHMiLCJnZXRDdXJyZW50Q29udGV4dHMiLCJtYXAiLCJjb250ZXh0Iiwic2V0TW9kZWwiLCJvTW9kZWwiLCJNb2NrQ29udGV4dEJpbmRpbmciLCJvQ29udGV4dCIsImdldEJvdW5kQ29udGV4dCIsIm9Nb2NrQ29udGV4dCIsImF0dGFjaEV2ZW50T25jZSIsImdldEludGVybmFsTW9ja0NvbnRleHQiLCJNb2NrTWV0YU1vZGVsIiwib01ldGFEYXRhIiwiZ2V0TWV0YUNvbnRleHQiLCJzUGF0aCIsIiRwYXRoIiwib01ldGFDb250ZXh0IiwicmVxdWVzdE9iamVjdCIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwiZ2V0TWV0YVBhdGgiLCJnZXRDb250ZXh0IiwiTW9ja01vZGVsIiwibW9ja0xpc3RCaW5kaW5nIiwibW9ja0NvbnRleHRCaW5kaW5nIiwiYmluZExpc3QiLCJiaW5kQ29udGV4dCIsImdldE1ldGFNb2RlbCIsIm9NZXRhTW9kZWwiLCJtb2RlbEZyb21MaXN0QmluZGluZyIsIm1vZGVsRnJvbUNvbnRleHRCaW5kaW5nIiwidW5kZWZpbmVkIiwic2V0TWV0YU1vZGVsIiwiTW9ja1ZpZXciLCJnZXRDb250cm9sbGVyIiwiZ2V0Vmlld0RhdGEiLCJnZXRJZCIsIk1vY2tDb250cm9sbGVyIiwiZ2V0VmlldyIsIl9yb3V0aW5nIiwibmF2aWdhdGVUb1RhcmdldCIsIl9lZGl0RmxvdyIsInN5bmNUYXNrIiwiX3NpZGVFZmZlY3RzIiwiaGFuZGxlRmllbGRDaGFuZ2UiLCJtb2NrTVZDIiwiZXhpc3RpbmciLCJtb2RlbCIsInZpZXciLCJjb250cm9sbGVyIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTtBQUNBOzs7Ozs7Ozs7O0FBRkE7QUFDQTtBQUNBO01BWWFBLFc7QUFDWix5QkFBMkJDLE9BQTNCLEVBQWtEQyxRQUFsRCxFQUFrRTtBQUFBOztBQUFBLFdBTTNEQyxXQU4yRCxHQU03Q0MsSUFBSSxDQUFDQyxFQUFMLENBQVEsVUFBQ0MsR0FBRCxFQUFpQjtBQUM3QyxlQUFPLEtBQUksQ0FBQ0wsT0FBTCxDQUFhSyxHQUFiLENBQVA7QUFDQSxPQUZvQixDQU42QztBQUFBLFdBUzNEQyxlQVQyRCxHQVN6Q0gsSUFBSSxDQUFDQyxFQUFMLENBQVEsVUFBQ0MsR0FBRCxFQUFpQjtBQUNqRCxlQUFPRSxPQUFPLENBQUNDLE9BQVIsQ0FBZ0IsS0FBSSxDQUFDUixPQUFMLENBQWFLLEdBQWIsQ0FBaEIsQ0FBUDtBQUNBLE9BRndCLENBVHlDO0FBQUEsV0FZM0RJLFdBWjJELEdBWTdDTixJQUFJLENBQUNDLEVBQUwsQ0FBUSxVQUFDQyxHQUFELEVBQWNLLEtBQWQsRUFBNkI7QUFDekQsUUFBQSxLQUFJLENBQUNW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O0FBQ0FELElBQUFBLElBQUksQ0FBQ3pFLFFBQUwsQ0FBY08sZUFBZCxDQUE4QmlFLEtBQTlCO0FBQ0FFLElBQUFBLFVBQVUsQ0FBQ1gsT0FBWCxDQUFtQnhELGVBQW5CLENBQW1Da0UsSUFBbkM7QUFFQSxXQUFPO0FBQUVELE1BQUFBLEtBQUssRUFBTEEsS0FBRjtBQUFTQyxNQUFBQSxJQUFJLEVBQUpBLElBQVQ7QUFBZUMsTUFBQUEsVUFBVSxFQUFWQTtBQUFmLEtBQVA7QUFDQSIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNb2NrIGNsYXNzIGZvciBhIFY0IENvbnRleHRcbiAqL1xuaW1wb3J0IEV2ZW50IGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFwiO1xuaW1wb3J0IENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCBVSTVFbGVtZW50IGZyb20gXCJzYXAvdWkvY29yZS9FbGVtZW50XCI7XG5pbXBvcnQgQ29udHJvbGxlciBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJcIjtcbmltcG9ydCBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgT0RhdGFMaXN0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhTGlzdEJpbmRpbmdcIjtcbmltcG9ydCBPRGF0YUNvbnRleHRCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFDb250ZXh0QmluZGluZ1wiO1xuaW1wb3J0IE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuXG5leHBvcnQgY2xhc3MgTW9ja0NvbnRleHQgaW1wbGVtZW50cyBQYXJ0aWFsPENvbnRleHQ+IHtcblx0cHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgb1ZhbHVlcz86IGFueSwgcHJpdmF0ZSBvQmluZGluZz86IGFueSkge31cblxuXHRwdWJsaWMgaXNBKHNDbGFzc05hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBzQ2xhc3NOYW1lID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0XCI7XG5cdH1cblxuXHRwdWJsaWMgZ2V0UHJvcGVydHkgPSBqZXN0LmZuKChrZXk6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiB0aGlzLm9WYWx1ZXNba2V5XTtcblx0fSk7XG5cdHB1YmxpYyByZXF1ZXN0UHJvcGVydHkgPSBqZXN0LmZuKChrZXk6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5vVmFsdWVzW2tleV0pO1xuXHR9KTtcblx0cHVibGljIHNldFByb3BlcnR5ID0gamVzdC5mbigoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IHtcblx0XHR0aGlzLm9WYWx1ZXNba2V5XSA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzLm9WYWx1ZXNba2V5XTtcblx0fSk7XG5cblx0cHVibGljIGdldE9iamVjdCA9IGplc3QuZm4oKHBhdGg6IHN0cmluZykgPT4ge1xuXHRcdGNvbnN0IHRoYXQgPSB0aGlzIGFzIGFueTtcblx0XHRsZXQgcmVzdWx0ID0gcGF0aCA/IHRoYXQub1ZhbHVlc1twYXRoXSA6IHRoYXQub1ZhbHVlcztcblxuXHRcdGlmICghcmVzdWx0ICYmIHBhdGggJiYgcGF0aC5pbmRleE9mKFwiL1wiKSA+IC0xKSB7XG5cdFx0XHRjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdFx0cmVzdWx0ID0gcGFydHMucmVkdWNlKChzdW0sIHBhcnQ6IGFueSkgPT4ge1xuXHRcdFx0XHRzdW0gPSBwYXJ0ID8gc3VtW3BhcnRdIDogc3VtO1xuXHRcdFx0XHRyZXR1cm4gc3VtO1xuXHRcdFx0fSwgdGhhdC5vVmFsdWVzKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9KTtcblx0cHVibGljIGdldFBhdGggPSBqZXN0LmZuKCgpID0+IHtcblx0XHRyZXR1cm4gdGhpcy5vVmFsdWVzW1wiJHBhdGhcIl07XG5cdH0pO1xuXG5cdHB1YmxpYyBnZXRCaW5kaW5nID0gamVzdC5mbigoKSA9PiB7XG5cdFx0cmV0dXJuIHRoaXMub0JpbmRpbmc7XG5cdH0pO1xuXHRwdWJsaWMgZ2V0TW9kZWwgPSBqZXN0LmZuKCgpID0+IHtcblx0XHRyZXR1cm4gKHRoaXMub0JpbmRpbmc/LmdldE1vZGVsKCkgYXMgYW55KSBhcyBPRGF0YU1vZGVsO1xuXHR9KTtcblx0cHVibGljIGlzVHJhbnNpZW50ID0gamVzdC5mbigpO1xufVxuXG5leHBvcnQgY2xhc3MgTW9ja1VJNUVsZW1lbnQgaW1wbGVtZW50cyBQYXJ0aWFsPFVJNUVsZW1lbnQ+IHtcblx0W2tleTogc3RyaW5nXTogYW55O1xuXHRwdWJsaWMgYmluZGluZ0NvbnRleHQgPSBuZXcgTW9ja0NvbnRleHQoe30pO1xuXHRwdWJsaWMgZ2V0QmluZGluZyA9IGplc3QuZm4oKTtcblx0cHVibGljIGdldEJpbmRpbmdDb250ZXh0ID0gamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSh0aGlzLmJpbmRpbmdDb250ZXh0KTtcblx0cHVibGljIGdldEJpbmRpbmdJbmZvID0gamVzdC5mbigpO1xuXHRwdWJsaWMgZGF0YSA9IGplc3QuZm4oKTtcblx0cHVibGljIGdldE1vZGVsID0gamVzdC5mbigpO1xuXHRwdWJsaWMgZ2V0UGFyZW50ID0gamVzdC5mbigpO1xufVxuXG5leHBvcnQgY2xhc3MgTW9ja0NvbnRyb2wgZXh0ZW5kcyBNb2NrVUk1RWxlbWVudCBpbXBsZW1lbnRzIFBhcnRpYWw8Q29udHJvbD4ge1xuXHRwdWJsaWMgZ2V0QmluZGluZ0NvbnRleHQ6IGplc3QuTW9jazxhbnksIGFueT4gPSBqZXN0LmZuKCk7XG59XG5cbmV4cG9ydCBjbGFzcyBNb2NrRXZlbnQgaW1wbGVtZW50cyBQYXJ0aWFsPEV2ZW50PiB7XG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge30sIHB1YmxpYyBzb3VyY2U6IE1vY2tVSTVFbGVtZW50ID0gbmV3IE1vY2tVSTVFbGVtZW50KCkpIHt9XG5cblx0cHVibGljIGdldFBhcmFtZXRlciA9IGplc3QuZm4obmFtZSA9PiB0aGlzLnBhcmFtc1tuYW1lXSk7XG5cblx0cHVibGljIGdldFNvdXJjZSA9IGplc3QuZm4oKCkgPT4gdGhpcy5zb3VyY2UgYXMgYW55KTtcbn1cblxuLyoqXG4gKiBNb2NrIGNsYXNzIGZvciBPRGF0YSBWNCBMaXN0QmluZGluZ1xuICovXG5leHBvcnQgY2xhc3MgTW9ja0xpc3RCaW5kaW5nIGltcGxlbWVudHMgUGFydGlhbDxPRGF0YUxpc3RCaW5kaW5nPiB7XG5cdHByaXZhdGUgYU1vY2tDb250ZXh0czogTW9ja0NvbnRleHRbXTtcblxuXHRwdWJsaWMgY29uc3RydWN0b3IoYUNvbnRleHRzPzogYW55W10sIHByaXZhdGUgbW9ja01vZGVsPzogTW9ja01vZGVsKSB7XG5cdFx0YUNvbnRleHRzID0gYUNvbnRleHRzIHx8IFtdO1xuXG5cdFx0dGhpcy5hTW9ja0NvbnRleHRzID0gYUNvbnRleHRzLm1hcChjb250ZXh0ID0+IHtcblx0XHRcdHJldHVybiBuZXcgTW9ja0NvbnRleHQoY29udGV4dCwgdGhpcyk7XG5cdFx0fSk7XG5cdH1cblxuXHRwdWJsaWMgaXNBKHNDbGFzc05hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBzQ2xhc3NOYW1lID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCI7XG5cdH1cblxuXHRwdWJsaWMgc2V0TW9kZWwob01vZGVsOiBNb2NrTW9kZWwpIHtcblx0XHR0aGlzLm1vY2tNb2RlbCA9IG9Nb2RlbDtcblx0fVxuXG5cdC8vIE1vY2tlZCBBUElcblx0cHVibGljIHNldEFnZ3JlZ2F0aW9uID0gamVzdC5mbigpO1xuXHRwdWJsaWMgZmlsdGVyID0gamVzdC5mbigpO1xuXHRwdWJsaWMgc29ydCA9IGplc3QuZm4oKTtcblxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdHB1YmxpYyByZXF1ZXN0Q29udGV4dHMgPSBqZXN0LmZuKCguLi5hcmdzKSA9PiB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgodGhpcy5hTW9ja0NvbnRleHRzIGFzIGFueSkgYXMgQ29udGV4dFtdKTtcblx0fSk7XG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0cHVibGljIGdldEN1cnJlbnRDb250ZXh0cyA9IGplc3QuZm4oKC4uLmFyZ3MpID0+IHtcblx0XHRyZXR1cm4gKHRoaXMuYU1vY2tDb250ZXh0cyBhcyBhbnkpIGFzIENvbnRleHRbXTtcblx0fSk7XG5cdHB1YmxpYyBnZXRNb2RlbCA9IGplc3QuZm4oKCkgPT4ge1xuXHRcdHJldHVybiAodGhpcy5tb2NrTW9kZWwgYXMgYW55KSBhcyBPRGF0YU1vZGVsO1xuXHR9KTtcbn1cblxuZXhwb3J0IGNsYXNzIE1vY2tDb250ZXh0QmluZGluZyBpbXBsZW1lbnRzIFBhcnRpYWw8T0RhdGFDb250ZXh0QmluZGluZz4ge1xuXHRwcml2YXRlIG9Nb2NrQ29udGV4dDogTW9ja0NvbnRleHQ7XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKG9Db250ZXh0PzogYW55LCBwcml2YXRlIG1vY2tNb2RlbD86IE1vY2tNb2RlbCkge1xuXHRcdHRoaXMub01vY2tDb250ZXh0ID0gbmV3IE1vY2tDb250ZXh0KG9Db250ZXh0IHx8IHt9LCB0aGlzKTtcblx0fVxuXG5cdHB1YmxpYyBpc0Eoc0NsYXNzTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHNDbGFzc05hbWUgPT09IFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhQ29udGV4dEJpbmRpbmdcIjtcblx0fVxuXHRwdWJsaWMgZ2V0SW50ZXJuYWxNb2NrQ29udGV4dCgpOiBNb2NrQ29udGV4dCB7XG5cdFx0cmV0dXJuIHRoaXMub01vY2tDb250ZXh0O1xuXHR9XG5cdHB1YmxpYyBzZXRNb2RlbChvTW9kZWw6IE1vY2tNb2RlbCkge1xuXHRcdHRoaXMubW9ja01vZGVsID0gb01vZGVsO1xuXHR9XG5cblx0Ly8gTW9ja2VkIEFQSVxuXHRwdWJsaWMgZ2V0Qm91bmRDb250ZXh0ID0gamVzdC5mbigoKSA9PiB7XG5cdFx0cmV0dXJuICh0aGlzLm9Nb2NrQ29udGV4dCBhcyBhbnkpIGFzIENvbnRleHQ7XG5cdH0pO1xuXHRwdWJsaWMgYXR0YWNoRXZlbnRPbmNlID0gamVzdC5mbigpO1xuXHRwdWJsaWMgZ2V0TW9kZWwgPSBqZXN0LmZuKCgpID0+IHtcblx0XHRyZXR1cm4gKHRoaXMubW9ja01vZGVsIGFzIGFueSkgYXMgT0RhdGFNb2RlbDtcblx0fSk7XG59XG5cbi8qKlxuICogTW9jayBjbGFzcyBmb3IgT0RhdGEgVjQgTWV0YU1vZGVsXG4gKi9cbmV4cG9ydCBjbGFzcyBNb2NrTWV0YU1vZGVsIGltcGxlbWVudHMgUGFydGlhbDxPRGF0YU1ldGFNb2RlbD4ge1xuXHRwcml2YXRlIG9NZXRhQ29udGV4dDogTW9ja0NvbnRleHQ7XG5cdHJlcXVlc3RWYWx1ZUxpc3RJbmZvITogamVzdC5Nb2NrPGFueSwgYW55PjtcblxuXHRwdWJsaWMgY29uc3RydWN0b3Iob01ldGFEYXRhPzogYW55KSB7XG5cdFx0dGhpcy5vTWV0YUNvbnRleHQgPSBuZXcgTW9ja0NvbnRleHQob01ldGFEYXRhIHx8IHt9KTtcblx0fVxuXG5cdC8vIE1vY2tlZCBBUElcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRwdWJsaWMgZ2V0TWV0YUNvbnRleHQgPSBqZXN0LmZuKChzUGF0aDogc3RyaW5nKSA9PiB7XG5cdFx0cmV0dXJuIChuZXcgTW9ja0NvbnRleHQoeyAkcGF0aDogc1BhdGggfSkgYXMgYW55KSBhcyBDb250ZXh0O1xuXHR9KTtcblx0cHVibGljIGdldE9iamVjdCA9IGplc3QuZm4oKHNQYXRoOiBzdHJpbmcpID0+IHtcblx0XHRyZXR1cm4gdGhpcy5vTWV0YUNvbnRleHQuZ2V0UHJvcGVydHkoc1BhdGgpO1xuXHR9KTtcblx0cHVibGljIHJlcXVlc3RPYmplY3QgPSBqZXN0LmZuKCk7XG5cdHB1YmxpYyBjcmVhdGVCaW5kaW5nQ29udGV4dCA9IGplc3QuZm4oKHNQYXRoOiBzdHJpbmcpID0+IHtcblx0XHRyZXR1cm4gKG5ldyBNb2NrQ29udGV4dCh7ICRwYXRoOiBzUGF0aCB9KSBhcyBhbnkpIGFzIENvbnRleHQ7XG5cdH0pO1xuXHRwdWJsaWMgZ2V0TWV0YVBhdGggPSBqZXN0LmZuKChzUGF0aDogc3RyaW5nKSA9PiB7XG5cdFx0cmV0dXJuIHNQYXRoO1xuXHR9KTtcblx0cHVibGljIGdldENvbnRleHQgPSBqZXN0LmZuKCk7XG59XG5cbi8qKlxuICogTW9jayBjbGFzcyBmb3IgT0RhdGEgVjQgTW9kZWxcbiAqL1xuXG5leHBvcnQgY2xhc3MgTW9ja01vZGVsIGltcGxlbWVudHMgUGFydGlhbDxPRGF0YU1vZGVsPiB7XG5cdHByaXZhdGUgb01ldGFNb2RlbD86IE1vY2tNZXRhTW9kZWw7XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgbW9ja0xpc3RCaW5kaW5nPzogTW9ja0xpc3RCaW5kaW5nLCBwcml2YXRlIG1vY2tDb250ZXh0QmluZGluZz86IE1vY2tDb250ZXh0QmluZGluZykge1xuXHRcdGlmIChtb2NrTGlzdEJpbmRpbmcpIHtcblx0XHRcdG1vY2tMaXN0QmluZGluZy5zZXRNb2RlbCh0aGlzKTtcblx0XHR9XG5cdFx0aWYgKG1vY2tDb250ZXh0QmluZGluZykge1xuXHRcdFx0bW9ja0NvbnRleHRCaW5kaW5nLnNldE1vZGVsKHRoaXMpO1xuXHRcdH1cblx0fVxuXG5cdC8vIEZhY3Rvcmllc1xuXHRzdGF0aWMgbW9kZWxGcm9tTGlzdEJpbmRpbmcobW9ja0xpc3RCaW5kaW5nOiBNb2NrTGlzdEJpbmRpbmcpOiBNb2NrTW9kZWwge1xuXHRcdHJldHVybiBuZXcgTW9ja01vZGVsKG1vY2tMaXN0QmluZGluZyk7XG5cdH1cblx0c3RhdGljIG1vZGVsRnJvbUNvbnRleHRCaW5kaW5nKG1vY2tDb250ZXh0QmluZGluZzogTW9ja0NvbnRleHRCaW5kaW5nKTogTW9ja01vZGVsIHtcblx0XHRyZXR1cm4gbmV3IE1vY2tNb2RlbCh1bmRlZmluZWQsIG1vY2tDb250ZXh0QmluZGluZyk7XG5cdH1cblxuXHRwdWJsaWMgc2V0TWV0YU1vZGVsKG9NZXRhTW9kZWw6IE1vY2tNZXRhTW9kZWwpIHtcblx0XHR0aGlzLm9NZXRhTW9kZWwgPSBvTWV0YU1vZGVsO1xuXHR9XG5cblx0Ly8gTW9ja2VkIEFQSVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdHB1YmxpYyBiaW5kTGlzdCA9IGplc3QuZm4oKC4uLmFyZ3MpID0+IHtcblx0XHRyZXR1cm4gKHRoaXMubW9ja0xpc3RCaW5kaW5nIGFzIGFueSkgYXMgT0RhdGFMaXN0QmluZGluZztcblx0fSk7XG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0cHVibGljIGJpbmRDb250ZXh0ID0gamVzdC5mbigoLi4uYXJncykgPT4ge1xuXHRcdHJldHVybiAodGhpcy5tb2NrQ29udGV4dEJpbmRpbmcgYXMgYW55KSBhcyBPRGF0YUNvbnRleHRCaW5kaW5nO1xuXHR9KTtcblx0cHVibGljIGdldE1ldGFNb2RlbCA9IGplc3QuZm4oKCkgPT4ge1xuXHRcdHJldHVybiAodGhpcy5vTWV0YU1vZGVsIGFzIGFueSkgYXMgT0RhdGFNZXRhTW9kZWw7XG5cdH0pO1xuXG5cdHB1YmxpYyBnZXRQcm9wZXJ0eSA9IGplc3QuZm4oKTtcblx0cHVibGljIHNldFByb3BlcnR5ID0gamVzdC5mbigpO1xuXHRwdWJsaWMgcmVxdWVzdE9iamVjdCA9IGplc3QuZm4oKTtcbn1cblxuZXhwb3J0IGNsYXNzIE1vY2tWaWV3IGltcGxlbWVudHMgUGFydGlhbDxWaWV3PiB7XG5cdHB1YmxpYyBnZXRDb250cm9sbGVyID0gamVzdC5mbigpO1xuXG5cdHB1YmxpYyBnZXRCaW5kaW5nQ29udGV4dCA9IGplc3QuZm4oKTtcblxuXHRwdWJsaWMgZ2V0TW9kZWwgPSBqZXN0LmZuKCk7XG5cblx0cHVibGljIGdldFZpZXdEYXRhID0gamVzdC5mbigpO1xuXG5cdHB1YmxpYyBpc0Eoc0NsYXNzTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHNDbGFzc05hbWUgPT09IFwic2FwLnVpLmNvcmUubXZjLlZpZXdcIjtcblx0fVxuXG5cdHB1YmxpYyBnZXRJZCA9IGplc3QuZm4oKTtcbn1cblxuZXhwb3J0IGNsYXNzIE1vY2tDb250cm9sbGVyIGltcGxlbWVudHMgUGFydGlhbDxDb250cm9sbGVyPiB7XG5cdHB1YmxpYyBnZXRWaWV3ID0gamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZShuZXcgTW9ja1ZpZXcoKSk7XG5cblx0cHVibGljIF9yb3V0aW5nID0ge1xuXHRcdG5hdmlnYXRlVG9UYXJnZXQ6IGplc3QuZm4oKVxuXHR9O1xuXG5cdHB1YmxpYyBfZWRpdEZsb3cgPSB7XG5cdFx0c3luY1Rhc2s6IGplc3QuZm4oKVxuXHR9O1xuXG5cdHB1YmxpYyBfc2lkZUVmZmVjdHMgPSB7XG5cdFx0aGFuZGxlRmllbGRDaGFuZ2U6IGplc3QuZm4oKVxuXHR9O1xuXG5cdGlzQSA9IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1WQ01vY2sge1xuXHRtb2RlbDogTW9ja01vZGVsO1xuXHR2aWV3OiBNb2NrVmlldztcblx0Y29udHJvbGxlcjogTW9ja0NvbnRyb2xsZXI7XG59XG5cbi8qKlxuICogR2VuZXJhdGUgbW9kZWwsIHZpZXcgYW5kIGNvbnRyb2xsZXIgbW9ja3MgdGhhdCByZWZlciB0byBlYWNoIG90aGVyLlxuICpcbiAqIEBwYXJhbSBleGlzdGluZyBPcHRpb25hbCBleGlzdGluZyBtb2NrZWQgaW5zdGFuY2VzIHRoYXQgc2hvdWxkIGJlIHVzZWRcbiAqIEByZXR1cm5zIE1vY2tlZCBtb2RlbCwgdmlldyBhbmQgY29udHJvbGxlciBpbnN0YW5jZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vY2tNVkMoZXhpc3Rpbmc/OiBQYXJ0aWFsPE1WQ01vY2s+KTogTVZDTW9jayB7XG5cdGNvbnN0IG1vZGVsID0gZXhpc3Rpbmc/Lm1vZGVsIHx8IG5ldyBNb2NrTW9kZWwoKTtcblx0Y29uc3QgdmlldyA9IGV4aXN0aW5nPy52aWV3IHx8IG5ldyBNb2NrVmlldygpO1xuXHRjb25zdCBjb250cm9sbGVyID0gZXhpc3Rpbmc/LmNvbnRyb2xsZXIgfHwgbmV3IE1vY2tDb250cm9sbGVyKCk7XG5cblx0dmlldy5nZXRDb250cm9sbGVyLm1vY2tSZXR1cm5WYWx1ZShjb250cm9sbGVyKTtcblx0dmlldy5nZXRNb2RlbC5tb2NrUmV0dXJuVmFsdWUobW9kZWwpO1xuXHRjb250cm9sbGVyLmdldFZpZXcubW9ja1JldHVyblZhbHVlKHZpZXcpO1xuXG5cdHJldHVybiB7IG1vZGVsLCB2aWV3LCBjb250cm9sbGVyIH07XG59XG4iXX0=
432
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlVJNU1vY2tIZWxwZXIudHMiXSwibmFtZXMiOlsiTW9ja0NvbnRleHQiLCJvVmFsdWVzIiwib0JpbmRpbmciLCJpc0tlcHRBbGl2ZSIsImdldFByb3BlcnR5IiwiamVzdCIsImZuIiwia2V5IiwicmVxdWVzdFByb3BlcnR5IiwiUHJvbWlzZSIsInJlc29sdmUiLCJzZXRQcm9wZXJ0eSIsInZhbHVlIiwiZ2V0T2JqZWN0IiwicGF0aCIsInRoYXQiLCJyZXN1bHQiLCJpbmRleE9mIiwicGFydHMiLCJzcGxpdCIsInJlZHVjZSIsInN1bSIsInBhcnQiLCJnZXRQYXRoIiwiZ2V0QmluZGluZyIsImdldE1vZGVsIiwiaXNUcmFuc2llbnQiLCJzZXRLZWVwQWxpdmUiLCJib29sIiwiX2ZuT25CZWZvcmVEZXN0cm95IiwiX2JSZXF1ZXN0TWVzc2FnZXMiLCJpc0tlZXBBbGl2ZSIsInJlcXVlc3RTaWRlRWZmZWN0cyIsInJlcXVlc3RPYmplY3QiLCJpc0EiLCJzQ2xhc3NOYW1lIiwiTW9ja1VJNUVsZW1lbnQiLCJiaW5kaW5nQ29udGV4dCIsImdldEJpbmRpbmdDb250ZXh0IiwibW9ja1JldHVyblZhbHVlIiwiZ2V0QmluZGluZ0luZm8iLCJkYXRhIiwiZ2V0UGFyZW50IiwiTW9ja0NvbnRyb2wiLCJNb2NrRXZlbnQiLCJwYXJhbXMiLCJzb3VyY2UiLCJnZXRQYXJhbWV0ZXIiLCJuYW1lIiwiZ2V0U291cmNlIiwiTW9ja0xpc3RCaW5kaW5nIiwiYUNvbnRleHRzIiwibW9ja01vZGVsIiwic2V0QWdncmVnYXRpb24iLCJmaWx0ZXIiLCJzb3J0IiwicmVxdWVzdENvbnRleHRzIiwiYU1vY2tDb250ZXh0cyIsImdldEN1cnJlbnRDb250ZXh0cyIsImdldFVwZGF0ZUdyb3VwSWQiLCJtYXAiLCJjb250ZXh0Iiwic2V0TW9kZWwiLCJvTW9kZWwiLCJNb2NrUHJvcGVydHlCaW5kaW5nIiwibW9ja1BhdGgiLCJnZXRWYWx1ZSIsInNldFBhdGgiLCJNb2NrQ29tcG9zaXRlQmluZGluZyIsImFCaW5kaW5ncyIsImdldEJpbmRpbmdzIiwiYmluZGluZyIsIk1vY2tDb250ZXh0QmluZGluZyIsIm9Db250ZXh0IiwiZ2V0Qm91bmRDb250ZXh0Iiwib01vY2tDb250ZXh0IiwiYXR0YWNoRXZlbnRPbmNlIiwiZ2V0SW50ZXJuYWxNb2NrQ29udGV4dCIsIk1vY2tNZXRhTW9kZWwiLCJvTWV0YURhdGEiLCJnZXRNZXRhQ29udGV4dCIsInNQYXRoIiwiJHBhdGgiLCJvTWV0YUNvbnRleHQiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsImdldE1ldGFQYXRoIiwiZ2V0Q29udGV4dCIsIk1vY2tNb2RlbCIsIm1vY2tMaXN0QmluZGluZyIsIm1vY2tDb250ZXh0QmluZGluZyIsImJpbmRMaXN0IiwiYmluZENvbnRleHQiLCJnZXRNZXRhTW9kZWwiLCJvTWV0YU1vZGVsIiwiZ2V0S2VlcEFsaXZlQ29udGV4dCIsIm1vZGVsRnJvbUxpc3RCaW5kaW5nIiwibW9kZWxGcm9tQ29udGV4dEJpbmRpbmciLCJ1bmRlZmluZWQiLCJzZXRNZXRhTW9kZWwiLCJNb2NrVmlldyIsImdldENvbnRyb2xsZXIiLCJnZXRWaWV3RGF0YSIsImdldElkIiwiTW9ja0NvbnRyb2xsZXIiLCJnZXRWaWV3IiwiX3JvdXRpbmciLCJuYXZpZ2F0ZVRvVGFyZ2V0IiwiX2VkaXRGbG93Iiwic3luY1Rhc2siLCJfc2lkZUVmZmVjdHMiLCJoYW5kbGVGaWVsZENoYW5nZSIsIm1vY2tNVkMiLCJleGlzdGluZyIsIm1vZGVsIiwidmlldyIsImNvbnRyb2xsZXIiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7QUFGQTtBQUNBO0FBQ0E7TUFlYUEsVztBQUVaLHlCQUEyQkMsT0FBM0IsRUFBa0RDLFFBQWxELEVBQWtFO0FBQUE7O0FBQUEsV0FEMURDLFdBQzBELEdBRDVDLEtBQzRDO0FBQUEsV0FNM0RDLFdBTjJELEdBTTdDQyxJQUFJLENBQUNDLEVBQUwsQ0FBUSxVQUFDQyxHQUFELEVBQWlCO0FBQzdDLGVBQU8s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QUFRLFNBQVIsSUFBQUEsUUFBUSxXQUFSLFlBQUFBLFFBQVEsQ0FBRUUsSUFBVixLQUFrQixJQUFJZixRQUFKLEVBQS9CO0FBQ0EsUUFBTWdCLFVBQVUsR0FBRyxDQUFBSCxRQUFRLFNBQVIsSUFBQUEsUUFBUSxXQUFSLFlBQUFBLFFBQVEsQ0FBRUcsVUFBVixLQUF3QixJQUFJWixjQUFKLEVBQTNDO0FBRUFXLElBQUFBLElBQUksQ0FBQ2QsYUFBTCxDQUFtQjdELGVBQW5CLENBQW1DNEUsVUFBbkM7QUFDQUQsSUFBQUEsSUFBSSxDQUFDekYsUUFBTCxDQUFjYyxlQUFkLENBQThCMEUsS0FBOUI7QUFDQUUsSUFBQUEsVUFBVSxDQUFDWCxPQUFYLENBQW1CakUsZUFBbkIsQ0FBbUMyRSxJQUFuQztBQUVBLFdBQU87QUFBRUQsTUFBQUEsS0FBSyxFQUFMQSxLQUFGO0FBQVNDLE1BQUFBLElBQUksRUFBSkEsSUFBVDtBQUFlQyxNQUFBQSxVQUFVLEVBQVZBO0FBQWYsS0FBUDtBQUNBIiwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1vY2sgY2xhc3MgZm9yIGEgVjQgQ29udGV4dFxuICovXG5pbXBvcnQgRXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IFVJNUVsZW1lbnQgZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCBDb250cm9sbGVyIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvQ29udHJvbGxlclwiO1xuaW1wb3J0IFZpZXcgZnJvbSBcInNhcC91aS9jb3JlL212Yy9WaWV3XCI7XG5pbXBvcnQgQ29tcG9zaXRlQmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL0NvbXBvc2l0ZUJpbmRpbmdcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9Db250ZXh0XCI7XG5pbXBvcnQgT0RhdGFDb250ZXh0QmluZGluZyBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L09EYXRhQ29udGV4dEJpbmRpbmdcIjtcbmltcG9ydCBPRGF0YUxpc3RCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFMaXN0QmluZGluZ1wiO1xuaW1wb3J0IE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCBPRGF0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNb2RlbFwiO1xuaW1wb3J0IE9EYXRhUHJvcGVydHlCaW5kaW5nIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFQcm9wZXJ0eUJpbmRpbmdcIjtcblxuZXhwb3J0IGNsYXNzIE1vY2tDb250ZXh0IGltcGxlbWVudHMgUGFydGlhbDxDb250ZXh0PiB7XG5cdHByaXZhdGUgaXNLZXB0QWxpdmUgPSBmYWxzZTtcblx0cHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgb1ZhbHVlcz86IGFueSwgcHJpdmF0ZSBvQmluZGluZz86IGFueSkge31cblxuXHRwdWJsaWMgaXNBKHNDbGFzc05hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBzQ2xhc3NOYW1lID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS52NC5Db250ZXh0XCI7XG5cdH1cblxuXHRwdWJsaWMgZ2V0UHJvcGVydHkgPSBqZXN0LmZuKChrZXk6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiB0aGlzLm9WYWx1ZXNba2V5XTtcblx0fSk7XG5cdHB1YmxpYyByZXF1ZXN0UHJvcGVydHkgPSBqZXN0LmZuKChrZXk6IHN0cmluZykgPT4ge1xuXHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5vVmFsdWVzW2tleV0pO1xuXHR9KTtcblx0cHVibGljIHNldFByb3BlcnR5ID0gamVzdC5mbigoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IHtcblx0XHR0aGlzLm9WYWx1ZXNba2V5XSA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzLm9WYWx1ZXNba2V5XTtcblx0fSk7XG5cblx0cHVibGljIGdldE9iamVjdCA9IGplc3QuZm4oKHBhdGg6IHN0cmluZykgPT4ge1xuXHRcdGNvbnN0IHRoYXQgPSB0aGlzIGFzIGFueTtcblx0XHRsZXQgcmVzdWx0ID0gcGF0aCA/IHRoYXQub1ZhbHVlc1twYXRoXSA6IHRoYXQub1ZhbHVlcztcblxuXHRcdGlmICghcmVzdWx0ICYmIHBhdGggJiYgcGF0aC5pbmRleE9mKFwiL1wiKSA+IC0xKSB7XG5cdFx0XHRjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdFx0cmVzdWx0ID0gcGFydHMucmVkdWNlKChzdW0sIHBhcnQ6IGFueSkgPT4ge1xuXHRcdFx0XHRzdW0gPSBwYXJ0ID8gc3VtW3BhcnRdIDogc3VtO1xuXHRcdFx0XHRyZXR1cm4gc3VtO1xuXHRcdFx0fSwgdGhhdC5vVmFsdWVzKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9KTtcblx0cHVibGljIGdldFBhdGggPSBqZXN0LmZuKCgpID0+IHtcblx0XHRyZXR1cm4gdGhpcy5vVmFsdWVzW1wiJHBhdGhcIl07XG5cdH0pO1xuXG5cdHB1YmxpYyBnZXRCaW5kaW5nID0gamVzdC5mbigoKSA9PiB7XG5cdFx0cmV0dXJuIHRoaXMub0JpbmRpbmc7XG5cdH0pO1xuXHRwdWJsaWMgZ2V0TW9kZWwgPSBqZXN0LmZuKCgpID0+IHtcblx0XHRyZXR1cm4gdGhpcy5vQmluZGluZz8uZ2V0TW9kZWwoKSBhcyBhbnkgYXMgT0RhdGFNb2RlbDtcblx0fSk7XG5cdHB1YmxpYyBpc1RyYW5zaWVudCA9IGplc3QuZm4oKTtcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRwdWJsaWMgc2V0S2VlcEFsaXZlID0gamVzdC5mbigoYm9vbDogYm9vbGVhbiwgX2ZuT25CZWZvcmVEZXN0cm95PzogYW55LCBfYlJlcXVlc3RNZXNzYWdlcz86IGJvb2xlYW4pID0+IHtcblx0XHR0aGlzLmlzS2VwdEFsaXZlID0gYm9vbDtcblx0fSk7XG5cdHB1YmxpYyBpc0tlZXBBbGl2ZSA9IGplc3QuZm4oKCkgPT4gdGhpcy5pc0tlcHRBbGl2ZSk7XG5cdHB1YmxpYyByZXF1ZXN0U2lkZUVmZmVjdHMgPSBqZXN0LmZuKCk7XG5cdHB1YmxpYyByZXF1ZXN0T2JqZWN0ID0gamVzdC5mbigpO1xufVxuXG5leHBvcnQgY2xhc3MgTW9ja1VJNUVsZW1lbnQgaW1wbGVtZW50cyBQYXJ0aWFsPFVJNUVsZW1lbnQ+IHtcblx0W2tleTogc3RyaW5nXTogYW55O1xuXHRwdWJsaWMgYmluZGluZ0NvbnRleHQgPSBuZXcgTW9ja0NvbnRleHQoe30pO1xuXHRwdWJsaWMgZ2V0QmluZGluZyA9IGplc3QuZm4oKTtcblx0cHVibGljIGdldEJpbmRpbmdDb250ZXh0ID0gamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZSh0aGlzLmJpbmRpbmdDb250ZXh0KTtcblx0cHVibGljIGdldEJpbmRpbmdJbmZvID0gamVzdC5mbigpO1xuXHRwdWJsaWMgZGF0YSA9IGplc3QuZm4oKTtcblx0cHVibGljIGdldE1vZGVsID0gamVzdC5mbigpO1xuXHRwdWJsaWMgZ2V0UGFyZW50ID0gamVzdC5mbigpO1xufVxuXG5leHBvcnQgY2xhc3MgTW9ja0NvbnRyb2wgZXh0ZW5kcyBNb2NrVUk1RWxlbWVudCBpbXBsZW1lbnRzIFBhcnRpYWw8Q29udHJvbD4ge1xuXHRwdWJsaWMgZ2V0QmluZGluZ0NvbnRleHQ6IGplc3QuTW9jazxhbnksIGFueT4gPSBqZXN0LmZuKCk7XG5cdHB1YmxpYyBnZXRNb2RlbDogamVzdC5Nb2NrPGFueSwgYW55PiA9IGplc3QuZm4oKTtcbn1cblxuZXhwb3J0IGNsYXNzIE1vY2tFdmVudCBpbXBsZW1lbnRzIFBhcnRpYWw8RXZlbnQ+IHtcblx0cHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBwYXJhbXM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fSwgcHVibGljIHNvdXJjZTogTW9ja1VJNUVsZW1lbnQgPSBuZXcgTW9ja1VJNUVsZW1lbnQoKSkge31cblxuXHRwdWJsaWMgZ2V0UGFyYW1ldGVyID0gamVzdC5mbigobmFtZSkgPT4gdGhpcy5wYXJhbXNbbmFtZV0pO1xuXG5cdHB1YmxpYyBnZXRTb3VyY2UgPSBqZXN0LmZuKCgpID0+IHRoaXMuc291cmNlIGFzIGFueSk7XG59XG5cbi8qKlxuICogTW9jayBjbGFzcyBmb3IgT0RhdGEgVjQgTGlzdEJpbmRpbmdcbiAqL1xuZXhwb3J0IGNsYXNzIE1vY2tMaXN0QmluZGluZyBpbXBsZW1lbnRzIFBhcnRpYWw8T0RhdGFMaXN0QmluZGluZz4ge1xuXHRwcml2YXRlIGFNb2NrQ29udGV4dHM6IE1vY2tDb250ZXh0W107XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKGFDb250ZXh0cz86IGFueVtdLCBwcml2YXRlIG1vY2tNb2RlbD86IE1vY2tNb2RlbCkge1xuXHRcdGFDb250ZXh0cyA9IGFDb250ZXh0cyB8fCBbXTtcblxuXHRcdHRoaXMuYU1vY2tDb250ZXh0cyA9IGFDb250ZXh0cy5tYXAoKGNvbnRleHQpID0+IHtcblx0XHRcdHJldHVybiBuZXcgTW9ja0NvbnRleHQoY29udGV4dCwgdGhpcyk7XG5cdFx0fSk7XG5cdH1cblxuXHRwdWJsaWMgaXNBKHNDbGFzc05hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBzQ2xhc3NOYW1lID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUxpc3RCaW5kaW5nXCI7XG5cdH1cblxuXHRwdWJsaWMgc2V0TW9kZWwob01vZGVsOiBNb2NrTW9kZWwpIHtcblx0XHR0aGlzLm1vY2tNb2RlbCA9IG9Nb2RlbDtcblx0fVxuXG5cdC8vIE1vY2tlZCBBUElcblx0cHVibGljIHNldEFnZ3JlZ2F0aW9uID0gamVzdC5mbigpO1xuXHRwdWJsaWMgZmlsdGVyID0gamVzdC5mbigpO1xuXHRwdWJsaWMgc29ydCA9IGplc3QuZm4oKTtcblxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdHB1YmxpYyByZXF1ZXN0Q29udGV4dHMgPSBqZXN0LmZuKCguLi5hcmdzKSA9PiB7XG5cdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmFNb2NrQ29udGV4dHMgYXMgYW55IGFzIENvbnRleHRbXSk7XG5cdH0pO1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG5cdHB1YmxpYyBnZXRDdXJyZW50Q29udGV4dHMgPSBqZXN0LmZuKCguLi5hcmdzKSA9PiB7XG5cdFx0cmV0dXJuIHRoaXMuYU1vY2tDb250ZXh0cyBhcyBhbnkgYXMgQ29udGV4dFtdO1xuXHR9KTtcblx0cHVibGljIGdldE1vZGVsID0gamVzdC5mbigoKSA9PiB7XG5cdFx0cmV0dXJuIHRoaXMubW9ja01vZGVsIGFzIGFueSBhcyBPRGF0YU1vZGVsO1xuXHR9KTtcblx0cHVibGljIGdldFVwZGF0ZUdyb3VwSWQgPSBqZXN0LmZuKCgpID0+IFwiYXV0b1wiKTtcbn1cblxuZXhwb3J0IGNsYXNzIE1vY2tQcm9wZXJ0eUJpbmRpbmcgaW1wbGVtZW50cyBQYXJ0aWFsPE9EYXRhUHJvcGVydHlCaW5kaW5nPiB7XG5cdHByaXZhdGUgbW9ja01vZGVsITogSlNPTk1vZGVsO1xuXHRwcml2YXRlIG1vY2tQYXRoITogc3RyaW5nO1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Rvcihtb2NrTW9kZWw6IEpTT05Nb2RlbCwgbW9ja1BhdGg6IHN0cmluZykge1xuXHRcdHRoaXMuc2V0TW9kZWwobW9ja01vZGVsKTtcblx0XHR0aGlzLnNldFBhdGgobW9ja1BhdGgpO1xuXHR9XG5cblx0cHVibGljIGlzQShzQ2xhc3NOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gc0NsYXNzTmFtZSA9PT0gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFQcm9wZXJ0eUJpbmRpbmdcIjtcblx0fVxuXG5cdHB1YmxpYyBzZXRNb2RlbChvTW9kZWw6IEpTT05Nb2RlbCkge1xuXHRcdHRoaXMubW9ja01vZGVsID0gb01vZGVsO1xuXHR9XG5cdHB1YmxpYyBnZXRNb2RlbCA9IGplc3QuZm4oKCkgPT4ge1xuXHRcdHJldHVybiB0aGlzLm1vY2tNb2RlbCBhcyBhbnkgYXMgT0RhdGFNb2RlbDtcblx0fSk7XG5cblx0cHVibGljIHNldFBhdGgocGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG5cdFx0dGhpcy5tb2NrUGF0aCA9IHBhdGggPyBwYXRoIDogXCJcIjtcblx0fVxuXHRwdWJsaWMgZ2V0UGF0aCA9IGplc3QuZm4oKCkgPT4ge1xuXHRcdHJldHVybiB0aGlzLm1vY2tQYXRoO1xuXHR9KTtcblxuXHRwdWJsaWMgZ2V0VmFsdWUgPSBqZXN0LmZuKCgpID0+IHtcblx0XHRyZXR1cm4gdGhpcz8ubW9ja01vZGVsPy5nZXRQcm9wZXJ0eShcIi9cIiArIHRoaXMubW9ja1BhdGgpO1xuXHR9KTtcbn1cblxuZXhwb3J0IGNsYXNzIE1vY2tDb21wb3NpdGVCaW5kaW5nIGltcGxlbWVudHMgUGFydGlhbDxDb21wb3NpdGVCaW5kaW5nPiB7XG5cdHByaXZhdGUgYUJpbmRpbmdzOiBNb2NrUHJvcGVydHlCaW5kaW5nW107XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKGFCaW5kaW5nczogTW9ja1Byb3BlcnR5QmluZGluZ1tdKSB7XG5cdFx0dGhpcy5hQmluZGluZ3MgPSBhQmluZGluZ3M7XG5cdH1cblxuXHRwdWJsaWMgaXNBKHNDbGFzc05hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBzQ2xhc3NOYW1lID09PSBcInNhcC51aS5tb2RlbC5Db21wb3NpdGVCaW5kaW5nXCI7XG5cdH1cblxuXHRwdWJsaWMgZ2V0QmluZGluZ3MgPSBqZXN0LmZuKCgpID0+IHtcblx0XHRyZXR1cm4gdGhpcy5hQmluZGluZ3M7XG5cdH0pO1xuXG5cdHB1YmxpYyBnZXRWYWx1ZSA9IGplc3QuZm4oKCkgPT4ge1xuXHRcdHJldHVybiB0aGlzLmFCaW5kaW5ncy5tYXAoKGJpbmRpbmcpID0+IGJpbmRpbmcuZ2V0VmFsdWUoKSk7XG5cdH0pO1xufVxuXG5leHBvcnQgY2xhc3MgTW9ja0NvbnRleHRCaW5kaW5nIGltcGxlbWVudHMgUGFydGlhbDxPRGF0YUNvbnRleHRCaW5kaW5nPiB7XG5cdHByaXZhdGUgb01vY2tDb250ZXh0OiBNb2NrQ29udGV4dDtcblx0cHJpdmF0ZSBpc0tlcHRBbGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihvQ29udGV4dD86IGFueSwgcHJpdmF0ZSBtb2NrTW9kZWw/OiBNb2NrTW9kZWwpIHtcblx0XHR0aGlzLm9Nb2NrQ29udGV4dCA9IG5ldyBNb2NrQ29udGV4dChvQ29udGV4dCB8fCB7fSwgdGhpcyk7XG5cdH1cblxuXHRwdWJsaWMgaXNBKHNDbGFzc05hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBzQ2xhc3NOYW1lID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YUNvbnRleHRCaW5kaW5nXCI7XG5cdH1cblx0cHVibGljIGdldEludGVybmFsTW9ja0NvbnRleHQoKTogTW9ja0NvbnRleHQge1xuXHRcdHJldHVybiB0aGlzLm9Nb2NrQ29udGV4dDtcblx0fVxuXHRwdWJsaWMgc2V0TW9kZWwob01vZGVsOiBNb2NrTW9kZWwpIHtcblx0XHR0aGlzLm1vY2tNb2RlbCA9IG9Nb2RlbDtcblx0fVxuXG5cdC8vIE1vY2tlZCBBUElcblx0cHVibGljIGdldEJvdW5kQ29udGV4dCA9IGplc3QuZm4oKCkgPT4ge1xuXHRcdHJldHVybiB0aGlzLm9Nb2NrQ29udGV4dCBhcyBhbnkgYXMgQ29udGV4dDtcblx0fSk7XG5cdHB1YmxpYyBhdHRhY2hFdmVudE9uY2UgPSBqZXN0LmZuKCk7XG5cdHB1YmxpYyBnZXRNb2RlbCA9IGplc3QuZm4oKCkgPT4ge1xuXHRcdHJldHVybiB0aGlzLm1vY2tNb2RlbCBhcyBhbnkgYXMgT0RhdGFNb2RlbDtcblx0fSk7XG59XG5cbi8qKlxuICogTW9jayBjbGFzcyBmb3IgT0RhdGEgVjQgTWV0YU1vZGVsXG4gKi9cbmV4cG9ydCBjbGFzcyBNb2NrTWV0YU1vZGVsIGltcGxlbWVudHMgUGFydGlhbDxPRGF0YU1ldGFNb2RlbD4ge1xuXHRwcml2YXRlIG9NZXRhQ29udGV4dDogTW9ja0NvbnRleHQ7XG5cdHJlcXVlc3RWYWx1ZUxpc3RJbmZvITogamVzdC5Nb2NrPGFueSwgYW55PjtcblxuXHRwdWJsaWMgY29uc3RydWN0b3Iob01ldGFEYXRhPzogYW55KSB7XG5cdFx0dGhpcy5vTWV0YUNvbnRleHQgPSBuZXcgTW9ja0NvbnRleHQob01ldGFEYXRhIHx8IHt9KTtcblx0fVxuXG5cdC8vIE1vY2tlZCBBUElcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuXHRwdWJsaWMgZ2V0TWV0YUNvbnRleHQgPSBqZXN0LmZuKChzUGF0aDogc3RyaW5nKSA9PiB7XG5cdFx0cmV0dXJuIG5ldyBNb2NrQ29udGV4dCh7ICRwYXRoOiBzUGF0aCB9KSBhcyBhbnkgYXMgQ29udGV4dDtcblx0fSk7XG5cdHB1YmxpYyBnZXRPYmplY3QgPSBqZXN0LmZuKChzUGF0aDogc3RyaW5nKSA9PiB7XG5cdFx0cmV0dXJuIHRoaXMub01ldGFDb250ZXh0LmdldFByb3BlcnR5KHNQYXRoKTtcblx0fSk7XG5cdHB1YmxpYyByZXF1ZXN0T2JqZWN0ID0gamVzdC5mbigpO1xuXHRwdWJsaWMgY3JlYXRlQmluZGluZ0NvbnRleHQgPSBqZXN0LmZuKChzUGF0aDogc3RyaW5nKSA9PiB7XG5cdFx0cmV0dXJuIG5ldyBNb2NrQ29udGV4dCh7ICRwYXRoOiBzUGF0aCB9KSBhcyBhbnkgYXMgQ29udGV4dDtcblx0fSk7XG5cdHB1YmxpYyBnZXRNZXRhUGF0aCA9IGplc3QuZm4oKHNQYXRoOiBzdHJpbmcpID0+IHtcblx0XHRyZXR1cm4gc1BhdGg7XG5cdH0pO1xuXHRwdWJsaWMgZ2V0Q29udGV4dCA9IGplc3QuZm4oKTtcbn1cblxuLyoqXG4gKiBNb2NrIGNsYXNzIGZvciBPRGF0YSBWNCBNb2RlbFxuICovXG5cbmV4cG9ydCBjbGFzcyBNb2NrTW9kZWwgaW1wbGVtZW50cyBQYXJ0aWFsPE9EYXRhTW9kZWw+IHtcblx0cHJpdmF0ZSBvTWV0YU1vZGVsPzogTW9ja01ldGFNb2RlbDtcblxuXHRwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBtb2NrTGlzdEJpbmRpbmc/OiBNb2NrTGlzdEJpbmRpbmcsIHByaXZhdGUgbW9ja0NvbnRleHRCaW5kaW5nPzogTW9ja0NvbnRleHRCaW5kaW5nKSB7XG5cdFx0aWYgKG1vY2tMaXN0QmluZGluZykge1xuXHRcdFx0bW9ja0xpc3RCaW5kaW5nLnNldE1vZGVsKHRoaXMpO1xuXHRcdH1cblx0XHRpZiAobW9ja0NvbnRleHRCaW5kaW5nKSB7XG5cdFx0XHRtb2NrQ29udGV4dEJpbmRpbmcuc2V0TW9kZWwodGhpcyk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gRmFjdG9yaWVzXG5cdHN0YXRpYyBtb2RlbEZyb21MaXN0QmluZGluZyhtb2NrTGlzdEJpbmRpbmc6IE1vY2tMaXN0QmluZGluZyk6IE1vY2tNb2RlbCB7XG5cdFx0cmV0dXJuIG5ldyBNb2NrTW9kZWwobW9ja0xpc3RCaW5kaW5nKTtcblx0fVxuXHRzdGF0aWMgbW9kZWxGcm9tQ29udGV4dEJpbmRpbmcobW9ja0NvbnRleHRCaW5kaW5nOiBNb2NrQ29udGV4dEJpbmRpbmcpOiBNb2NrTW9kZWwge1xuXHRcdHJldHVybiBuZXcgTW9ja01vZGVsKHVuZGVmaW5lZCwgbW9ja0NvbnRleHRCaW5kaW5nKTtcblx0fVxuXG5cdHB1YmxpYyBzZXRNZXRhTW9kZWwob01ldGFNb2RlbDogTW9ja01ldGFNb2RlbCkge1xuXHRcdHRoaXMub01ldGFNb2RlbCA9IG9NZXRhTW9kZWw7XG5cdH1cblxuXHQvLyBNb2NrZWQgQVBJXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0cHVibGljIGJpbmRMaXN0ID0gamVzdC5mbigoLi4uYXJncykgPT4ge1xuXHRcdHJldHVybiB0aGlzLm1vY2tMaXN0QmluZGluZyBhcyBhbnkgYXMgT0RhdGFMaXN0QmluZGluZztcblx0fSk7XG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcblx0cHVibGljIGJpbmRDb250ZXh0ID0gamVzdC5mbigoLi4uYXJncykgPT4ge1xuXHRcdHJldHVybiB0aGlzLm1vY2tDb250ZXh0QmluZGluZyBhcyBhbnkgYXMgT0RhdGFDb250ZXh0QmluZGluZztcblx0fSk7XG5cdHB1YmxpYyBnZXRNZXRhTW9kZWwgPSBqZXN0LmZuKCgpID0+IHtcblx0XHRyZXR1cm4gdGhpcy5vTWV0YU1vZGVsIGFzIGFueSBhcyBPRGF0YU1ldGFNb2RlbDtcblx0fSk7XG5cblx0cHVibGljIGdldFByb3BlcnR5ID0gamVzdC5mbigpO1xuXHRwdWJsaWMgc2V0UHJvcGVydHkgPSBqZXN0LmZuKCk7XG5cdHB1YmxpYyByZXF1ZXN0T2JqZWN0ID0gamVzdC5mbigpO1xuXHRwdWJsaWMgZ2V0S2VlcEFsaXZlQ29udGV4dCA9IGplc3QuZm4oKTtcbn1cblxuZXhwb3J0IGNsYXNzIE1vY2tWaWV3IGltcGxlbWVudHMgUGFydGlhbDxWaWV3PiB7XG5cdHB1YmxpYyBnZXRDb250cm9sbGVyID0gamVzdC5mbigpO1xuXG5cdHB1YmxpYyBnZXRCaW5kaW5nQ29udGV4dCA9IGplc3QuZm4oKTtcblxuXHRwdWJsaWMgZ2V0TW9kZWwgPSBqZXN0LmZuKCk7XG5cblx0cHVibGljIGdldFZpZXdEYXRhID0gamVzdC5mbigpO1xuXG5cdHB1YmxpYyBpc0Eoc0NsYXNzTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHNDbGFzc05hbWUgPT09IFwic2FwLnVpLmNvcmUubXZjLlZpZXdcIjtcblx0fVxuXG5cdHB1YmxpYyBnZXRJZCA9IGplc3QuZm4oKTtcbn1cblxuZXhwb3J0IGNsYXNzIE1vY2tDb250cm9sbGVyIGltcGxlbWVudHMgUGFydGlhbDxDb250cm9sbGVyPiB7XG5cdHB1YmxpYyBnZXRWaWV3ID0gamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZShuZXcgTW9ja1ZpZXcoKSk7XG5cblx0cHVibGljIF9yb3V0aW5nID0ge1xuXHRcdG5hdmlnYXRlVG9UYXJnZXQ6IGplc3QuZm4oKVxuXHR9O1xuXG5cdHB1YmxpYyBfZWRpdEZsb3cgPSB7XG5cdFx0c3luY1Rhc2s6IGplc3QuZm4oKVxuXHR9O1xuXG5cdHB1YmxpYyBfc2lkZUVmZmVjdHMgPSB7XG5cdFx0aGFuZGxlRmllbGRDaGFuZ2U6IGplc3QuZm4oKVxuXHR9O1xuXG5cdGlzQSA9IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoZmFsc2UpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1WQ01vY2sge1xuXHRtb2RlbDogTW9ja01vZGVsO1xuXHR2aWV3OiBNb2NrVmlldztcblx0Y29udHJvbGxlcjogTW9ja0NvbnRyb2xsZXI7XG59XG5cbi8qKlxuICogR2VuZXJhdGUgbW9kZWwsIHZpZXcgYW5kIGNvbnRyb2xsZXIgbW9ja3MgdGhhdCByZWZlciB0byBlYWNoIG90aGVyLlxuICpcbiAqIEBwYXJhbSBleGlzdGluZyBPcHRpb25hbCBleGlzdGluZyBtb2NrZWQgaW5zdGFuY2VzIHRoYXQgc2hvdWxkIGJlIHVzZWRcbiAqIEByZXR1cm5zIE1vY2tlZCBtb2RlbCwgdmlldyBhbmQgY29udHJvbGxlciBpbnN0YW5jZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vY2tNVkMoZXhpc3Rpbmc/OiBQYXJ0aWFsPE1WQ01vY2s+KTogTVZDTW9jayB7XG5cdGNvbnN0IG1vZGVsID0gZXhpc3Rpbmc/Lm1vZGVsIHx8IG5ldyBNb2NrTW9kZWwoKTtcblx0Y29uc3QgdmlldyA9IGV4aXN0aW5nPy52aWV3IHx8IG5ldyBNb2NrVmlldygpO1xuXHRjb25zdCBjb250cm9sbGVyID0gZXhpc3Rpbmc/LmNvbnRyb2xsZXIgfHwgbmV3IE1vY2tDb250cm9sbGVyKCk7XG5cblx0dmlldy5nZXRDb250cm9sbGVyLm1vY2tSZXR1cm5WYWx1ZShjb250cm9sbGVyKTtcblx0dmlldy5nZXRNb2RlbC5tb2NrUmV0dXJuVmFsdWUobW9kZWwpO1xuXHRjb250cm9sbGVyLmdldFZpZXcubW9ja1JldHVyblZhbHVlKHZpZXcpO1xuXG5cdHJldHVybiB7IG1vZGVsLCB2aWV3LCBjb250cm9sbGVyIH07XG59XG4iXX0=
@@ -6,13 +6,17 @@ import Control from "sap/ui/core/Control";
6
6
  import UI5Element from "sap/ui/core/Element";
7
7
  import Controller from "sap/ui/core/mvc/Controller";
8
8
  import View from "sap/ui/core/mvc/View";
9
+ import CompositeBinding from "sap/ui/model/CompositeBinding";
10
+ import JSONModel from "sap/ui/model/json/JSONModel";
9
11
  import Context from "sap/ui/model/odata/v4/Context";
10
- import ODataListBinding from "sap/ui/model/odata/v4/ODataListBinding";
11
12
  import ODataContextBinding from "sap/ui/model/odata/v4/ODataContextBinding";
13
+ import ODataListBinding from "sap/ui/model/odata/v4/ODataListBinding";
12
14
  import ODataMetaModel from "sap/ui/model/odata/v4/ODataMetaModel";
13
15
  import ODataModel from "sap/ui/model/odata/v4/ODataModel";
16
+ import ODataPropertyBinding from "sap/ui/model/odata/v4/ODataPropertyBinding";
14
17
 
15
18
  export class MockContext implements Partial<Context> {
19
+ private isKeptAlive = false;
16
20
  public constructor(private oValues?: any, private oBinding?: any) {}
17
21
 
18
22
  public isA(sClassName: string): boolean {
@@ -52,9 +56,16 @@ export class MockContext implements Partial<Context> {
52
56
  return this.oBinding;
53
57
  });
54
58
  public getModel = jest.fn(() => {
55
- return (this.oBinding?.getModel() as any) as ODataModel;
59
+ return this.oBinding?.getModel() as any as ODataModel;
56
60
  });
57
61
  public isTransient = jest.fn();
62
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
63
+ public setKeepAlive = jest.fn((bool: boolean, _fnOnBeforeDestroy?: any, _bRequestMessages?: boolean) => {
64
+ this.isKeptAlive = bool;
65
+ });
66
+ public isKeepAlive = jest.fn(() => this.isKeptAlive);
67
+ public requestSideEffects = jest.fn();
68
+ public requestObject = jest.fn();
58
69
  }
59
70
 
60
71
  export class MockUI5Element implements Partial<UI5Element> {
@@ -70,12 +81,13 @@ export class MockUI5Element implements Partial<UI5Element> {
70
81
 
71
82
  export class MockControl extends MockUI5Element implements Partial<Control> {
72
83
  public getBindingContext: jest.Mock<any, any> = jest.fn();
84
+ public getModel: jest.Mock<any, any> = jest.fn();
73
85
  }
74
86
 
75
87
  export class MockEvent implements Partial<Event> {
76
88
  public constructor(public params: { [key: string]: any } = {}, public source: MockUI5Element = new MockUI5Element()) {}
77
89
 
78
- public getParameter = jest.fn(name => this.params[name]);
90
+ public getParameter = jest.fn((name) => this.params[name]);
79
91
 
80
92
  public getSource = jest.fn(() => this.source as any);
81
93
  }
@@ -89,7 +101,7 @@ export class MockListBinding implements Partial<ODataListBinding> {
89
101
  public constructor(aContexts?: any[], private mockModel?: MockModel) {
90
102
  aContexts = aContexts || [];
91
103
 
92
- this.aMockContexts = aContexts.map(context => {
104
+ this.aMockContexts = aContexts.map((context) => {
93
105
  return new MockContext(context, this);
94
106
  });
95
107
  }
@@ -109,19 +121,73 @@ export class MockListBinding implements Partial<ODataListBinding> {
109
121
 
110
122
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
111
123
  public requestContexts = jest.fn((...args) => {
112
- return Promise.resolve((this.aMockContexts as any) as Context[]);
124
+ return Promise.resolve(this.aMockContexts as any as Context[]);
113
125
  });
114
126
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
115
127
  public getCurrentContexts = jest.fn((...args) => {
116
- return (this.aMockContexts as any) as Context[];
128
+ return this.aMockContexts as any as Context[];
117
129
  });
118
130
  public getModel = jest.fn(() => {
119
- return (this.mockModel as any) as ODataModel;
131
+ return this.mockModel as any as ODataModel;
132
+ });
133
+ public getUpdateGroupId = jest.fn(() => "auto");
134
+ }
135
+
136
+ export class MockPropertyBinding implements Partial<ODataPropertyBinding> {
137
+ private mockModel!: JSONModel;
138
+ private mockPath!: string;
139
+
140
+ public constructor(mockModel: JSONModel, mockPath: string) {
141
+ this.setModel(mockModel);
142
+ this.setPath(mockPath);
143
+ }
144
+
145
+ public isA(sClassName: string): boolean {
146
+ return sClassName === "sap/ui/model/odata/v4/ODataPropertyBinding";
147
+ }
148
+
149
+ public setModel(oModel: JSONModel) {
150
+ this.mockModel = oModel;
151
+ }
152
+ public getModel = jest.fn(() => {
153
+ return this.mockModel as any as ODataModel;
154
+ });
155
+
156
+ public setPath(path: string | undefined) {
157
+ this.mockPath = path ? path : "";
158
+ }
159
+ public getPath = jest.fn(() => {
160
+ return this.mockPath;
161
+ });
162
+
163
+ public getValue = jest.fn(() => {
164
+ return this?.mockModel?.getProperty("/" + this.mockPath);
165
+ });
166
+ }
167
+
168
+ export class MockCompositeBinding implements Partial<CompositeBinding> {
169
+ private aBindings: MockPropertyBinding[];
170
+
171
+ public constructor(aBindings: MockPropertyBinding[]) {
172
+ this.aBindings = aBindings;
173
+ }
174
+
175
+ public isA(sClassName: string): boolean {
176
+ return sClassName === "sap.ui.model.CompositeBinding";
177
+ }
178
+
179
+ public getBindings = jest.fn(() => {
180
+ return this.aBindings;
181
+ });
182
+
183
+ public getValue = jest.fn(() => {
184
+ return this.aBindings.map((binding) => binding.getValue());
120
185
  });
121
186
  }
122
187
 
123
188
  export class MockContextBinding implements Partial<ODataContextBinding> {
124
189
  private oMockContext: MockContext;
190
+ private isKeptAlive: boolean = false;
125
191
 
126
192
  public constructor(oContext?: any, private mockModel?: MockModel) {
127
193
  this.oMockContext = new MockContext(oContext || {}, this);
@@ -139,11 +205,11 @@ export class MockContextBinding implements Partial<ODataContextBinding> {
139
205
 
140
206
  // Mocked API
141
207
  public getBoundContext = jest.fn(() => {
142
- return (this.oMockContext as any) as Context;
208
+ return this.oMockContext as any as Context;
143
209
  });
144
210
  public attachEventOnce = jest.fn();
145
211
  public getModel = jest.fn(() => {
146
- return (this.mockModel as any) as ODataModel;
212
+ return this.mockModel as any as ODataModel;
147
213
  });
148
214
  }
149
215
 
@@ -161,14 +227,14 @@ export class MockMetaModel implements Partial<ODataMetaModel> {
161
227
  // Mocked API
162
228
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
163
229
  public getMetaContext = jest.fn((sPath: string) => {
164
- return (new MockContext({ $path: sPath }) as any) as Context;
230
+ return new MockContext({ $path: sPath }) as any as Context;
165
231
  });
166
232
  public getObject = jest.fn((sPath: string) => {
167
233
  return this.oMetaContext.getProperty(sPath);
168
234
  });
169
235
  public requestObject = jest.fn();
170
236
  public createBindingContext = jest.fn((sPath: string) => {
171
- return (new MockContext({ $path: sPath }) as any) as Context;
237
+ return new MockContext({ $path: sPath }) as any as Context;
172
238
  });
173
239
  public getMetaPath = jest.fn((sPath: string) => {
174
240
  return sPath;
@@ -207,19 +273,20 @@ export class MockModel implements Partial<ODataModel> {
207
273
  // Mocked API
208
274
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
209
275
  public bindList = jest.fn((...args) => {
210
- return (this.mockListBinding as any) as ODataListBinding;
276
+ return this.mockListBinding as any as ODataListBinding;
211
277
  });
212
278
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
213
279
  public bindContext = jest.fn((...args) => {
214
- return (this.mockContextBinding as any) as ODataContextBinding;
280
+ return this.mockContextBinding as any as ODataContextBinding;
215
281
  });
216
282
  public getMetaModel = jest.fn(() => {
217
- return (this.oMetaModel as any) as ODataMetaModel;
283
+ return this.oMetaModel as any as ODataMetaModel;
218
284
  });
219
285
 
220
286
  public getProperty = jest.fn();
221
287
  public setProperty = jest.fn();
222
288
  public requestObject = jest.fn();
289
+ public getKeepAliveContext = jest.fn();
223
290
  }
224
291
 
225
292
  export class MockView implements Partial<View> {