@sapui5/sap.fe.test 1.95.0 → 1.98.0

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.
Files changed (74) hide show
  1. package/package.json +4 -3
  2. package/src/sap/fe/test/.library +1 -1
  3. package/src/sap/fe/test/BaseActions.js +1 -1
  4. package/src/sap/fe/test/BaseArrangements.js +1 -1
  5. package/src/sap/fe/test/BaseAssertions.js +1 -1
  6. package/src/sap/fe/test/ConfirmDialog.js +1 -1
  7. package/src/sap/fe/test/FCLView.js +1 -7
  8. package/src/sap/fe/test/Flexibility.js +46 -12
  9. package/src/sap/fe/test/FlexibleColumnLayout.js +1 -1
  10. package/src/sap/fe/test/JestTemplatingHelper.js +99 -6
  11. package/src/sap/fe/test/JestTemplatingHelper.ts +65 -3
  12. package/src/sap/fe/test/JourneyRunner.js +9 -4
  13. package/src/sap/fe/test/ListReport.js +9 -15
  14. package/src/sap/fe/test/LocationUtil.js +1 -1
  15. package/src/sap/fe/test/ObjectPage.js +60 -50
  16. package/src/sap/fe/test/Shell.js +17 -12
  17. package/src/sap/fe/test/Stubs.js +1 -1
  18. package/src/sap/fe/test/TemplatePage.js +1 -13
  19. package/src/sap/fe/test/TemplatingTestUtils.js +2 -2
  20. package/src/sap/fe/test/UI5MockHelper.js +405 -0
  21. package/src/sap/fe/test/UI5MockHelper.ts +246 -0
  22. package/src/sap/fe/test/Utils.js +6 -14
  23. package/src/sap/fe/test/api/APIHelper.js +1 -1
  24. package/src/sap/fe/test/api/BaseAPI.js +23 -8
  25. package/src/sap/fe/test/api/ChartActions.js +1 -1
  26. package/src/sap/fe/test/api/ChartAssertions.js +6 -2
  27. package/src/sap/fe/test/api/DialogAPI.js +10 -6
  28. package/src/sap/fe/test/api/DialogActions.js +19 -6
  29. package/src/sap/fe/test/api/DialogAssertions.js +26 -6
  30. package/src/sap/fe/test/api/DialogCreateActions.js +1 -1
  31. package/src/sap/fe/test/api/DialogCreateAssertions.js +1 -1
  32. package/src/sap/fe/test/api/DialogMessageActions.js +1 -1
  33. package/src/sap/fe/test/api/DialogMessageAssertions.js +1 -1
  34. package/src/sap/fe/test/api/DialogType.js +1 -1
  35. package/src/sap/fe/test/api/DialogValueHelpActions.js +1 -1
  36. package/src/sap/fe/test/api/DialogValueHelpAssertions.js +1 -1
  37. package/src/sap/fe/test/api/EditState.js +10 -1
  38. package/src/sap/fe/test/api/FilterBarAPI.js +1 -1
  39. package/src/sap/fe/test/api/FilterBarActions.js +39 -5
  40. package/src/sap/fe/test/api/FilterBarAssertions.js +1 -1
  41. package/src/sap/fe/test/api/FooterAPI.js +1 -1
  42. package/src/sap/fe/test/api/FooterActionsBase.js +1 -1
  43. package/src/sap/fe/test/api/FooterActionsOP.js +1 -1
  44. package/src/sap/fe/test/api/FooterAssertionsBase.js +1 -1
  45. package/src/sap/fe/test/api/FooterAssertionsOP.js +1 -1
  46. package/src/sap/fe/test/api/FormAPI.js +1 -1
  47. package/src/sap/fe/test/api/FormActions.js +1 -1
  48. package/src/sap/fe/test/api/FormAssertions.js +34 -5
  49. package/src/sap/fe/test/api/HeaderAPI.js +1 -1
  50. package/src/sap/fe/test/api/HeaderActions.js +1 -1
  51. package/src/sap/fe/test/api/HeaderActionsLR.js +1 -1
  52. package/src/sap/fe/test/api/HeaderAssertions.js +1 -1
  53. package/src/sap/fe/test/api/HeaderAssertionsLR.js +1 -1
  54. package/src/sap/fe/test/api/HeaderLR.js +1 -1
  55. package/src/sap/fe/test/api/KPICardAPI.js +1 -1
  56. package/src/sap/fe/test/api/KPICardActions.js +42 -0
  57. package/src/sap/fe/test/api/KPICardAssertions.js +42 -16
  58. package/src/sap/fe/test/api/TableAPI.js +1 -1
  59. package/src/sap/fe/test/api/TableActions.js +2 -2
  60. package/src/sap/fe/test/api/TableAssertions.js +12 -1
  61. package/src/sap/fe/test/builder/DialogBuilder.js +1 -1
  62. package/src/sap/fe/test/builder/FEBuilder.js +1 -1
  63. package/src/sap/fe/test/builder/KPIBuilder.js +28 -3
  64. package/src/sap/fe/test/builder/MacroFieldBuilder.js +1 -1
  65. package/src/sap/fe/test/builder/MdcFieldBuilder.js +1 -1
  66. package/src/sap/fe/test/builder/MdcFilterBarBuilder.js +1 -1
  67. package/src/sap/fe/test/builder/MdcFilterFieldBuilder.js +1 -1
  68. package/src/sap/fe/test/builder/MdcTableBuilder.js +23 -1
  69. package/src/sap/fe/test/builder/OverflowToolbarBuilder.js +1 -1
  70. package/src/sap/fe/test/builder/VMBuilder.js +1 -1
  71. package/src/sap/fe/test/internal/FEArrangements.js +1 -1
  72. package/src/sap/fe/test/internal/FEJourneyRunner.js +1 -1
  73. package/src/sap/fe/test/library.js +2 -2
  74. package/src/sap/fe/test/massEdit.js +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sapui5/sap.fe.test",
3
- "version": "1.95.0",
3
+ "version": "1.98.0",
4
4
  "description": "SAPUI5 Library sap.fe.test",
5
5
  "license": "SEE LICENSE IN LICENSE.txt",
6
6
  "author": "SAP SE (https://www.sap.com)",
@@ -17,8 +17,9 @@
17
17
  ],
18
18
  "devDependencies": {
19
19
  "@babel/cli": "^7.14.8",
20
- "@ui5/cli": "^2.10.0",
20
+ "@ui5/cli": "^2.14.0",
21
21
  "copyfiles": "2.2.0",
22
- "xpath": "0.0.27"
22
+ "xpath": "0.0.27",
23
+ "xml-formatter": "2.4.0"
23
24
  }
24
25
  }
@@ -6,7 +6,7 @@
6
6
  <copyright>SAP UI development toolkit for HTML5 (SAPUI5)
7
7
  (c) Copyright 2009-2021 SAP SE. All rights reserved
8
8
  </copyright>
9
- <version>1.95.0</version>
9
+ <version>1.98.0</version>
10
10
 
11
11
  <documentation>UI5 library: sap.fe.test</documentation>
12
12
 
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  * ! SAPUI5
3
- * (c) Copyright 2009-2021 SAP SE. All rights reserved.
3
+ * (c) Copyright 2009-2022 SAP SE. All rights reserved.
4
4
  */
5
5
  sap.ui.define(["sap/ui/test/Opa5", "sap/ui/test/OpaBuilder", "sap/fe/test/builder/FEBuilder", "sap/fe/test/Utils"], function(
6
6
  Opa5,
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  * ! SAPUI5
3
- * (c) Copyright 2009-2021 SAP SE. All rights reserved.
3
+ * (c) Copyright 2009-2022 SAP SE. All rights reserved.
4
4
  */
5
5
  sap.ui.define(
6
6
  ["sap/ui/test/Opa5", "sap/ui/test/OpaBuilder", "sap/ui/thirdparty/jquery", "sap/base/util/UriParameters", "./Utils", "./Stubs"],
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  * ! SAPUI5
3
- * (c) Copyright 2009-2021 SAP SE. All rights reserved.
3
+ * (c) Copyright 2009-2022 SAP SE. All rights reserved.
4
4
  */
5
5
  sap.ui.define(["sap/ui/test/Opa5", "sap/ui/test/OpaBuilder", "sap/fe/test/builder/FEBuilder", "sap/fe/test/Utils"], function(
6
6
  Opa5,
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  * ! SAPUI5
3
- * (c) Copyright 2009-2021 SAP SE. All rights reserved.
3
+ * (c) Copyright 2009-2022 SAP SE. All rights reserved.
4
4
  */
5
5
  sap.ui.define(["sap/ui/test/OpaBuilder", "sap/ui/test/Opa5", "sap/fe/test/Utils"], function(OpaBuilder, Opa5, Utils) {
6
6
  "use strict";
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  * ! SAPUI5
3
- * (c) Copyright 2009-2021 SAP SE. All rights reserved.
3
+ * (c) Copyright 2009-2022 SAP SE. All rights reserved.
4
4
  */
5
5
  /**
6
6
  * Actions and assertions to be used with a page hosted in an FCL
@@ -14,9 +14,6 @@ sap.ui.define(["sap/ui/test/OpaBuilder"], function(OpaBuilder) {
14
14
  .hasType("sap.m.OverflowToolbarButton")
15
15
  .hasProperties({ icon: "sap-icon://full-screen" })
16
16
  .description("Entering the FullScreen Button")
17
- .do(function(oButton) {
18
- oButton.fireHover();
19
- })
20
17
  .doPress()
21
18
  .execute();
22
19
  },
@@ -25,9 +22,6 @@ sap.ui.define(["sap/ui/test/OpaBuilder"], function(OpaBuilder) {
25
22
  .hasType("sap.m.OverflowToolbarButton")
26
23
  .hasProperties({ icon: "sap-icon://exit-full-screen" })
27
24
  .description("Exiting Full screen mode")
28
- .do(function(oButton) {
29
- oButton.fireHover();
30
- })
31
25
  .doPress()
32
26
  .execute();
33
27
  },
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  * ! SAPUI5
3
- * (c) Copyright 2009-2021 SAP SE. All rights reserved.
3
+ * (c) Copyright 2009-2022 SAP SE. All rights reserved.
4
4
  */
5
5
  sap.ui.define(["sap/ui/test/Opa5", "sap/ui/test/OpaBuilder", "sap/ui/qunit/QUnitUtils"], function(Opa5, OpaBuilder, QUnitUtils) {
6
6
  "use strict";
@@ -220,7 +220,7 @@ sap.ui.define(["sap/ui/test/Opa5", "sap/ui/test/OpaBuilder", "sap/ui/qunit/QUnit
220
220
  iExecutePopOverActionByIcon: function(sIcon, sDescription) {
221
221
  return OpaBuilder.create(this)
222
222
  .viewId(null)
223
- .hasType("sap.m.Button")
223
+ .hasType("sap.ui.unified.MenuItem")
224
224
  .hasProperties({ icon: "sap-icon://" + sIcon }) // e.g. edit, add, rename, less (=remove), scissors (=cut), paste
225
225
  .isDialogElement()
226
226
  .doPress()
@@ -228,6 +228,17 @@ sap.ui.define(["sap/ui/test/Opa5", "sap/ui/test/OpaBuilder", "sap/ui/qunit/QUnit
228
228
  .execute();
229
229
  },
230
230
 
231
+ iExecutePopOverButtonByIcon: function(sIcon, sDescription) {
232
+ return OpaBuilder.create(this)
233
+ .viewId(null)
234
+ .hasType("sap.m.Button")
235
+ .hasProperties({ icon: "sap-icon://" + sIcon })
236
+ .isDialogElement()
237
+ .doPress()
238
+ .description(sDescription)
239
+ .execute();
240
+ },
241
+
231
242
  iExecutePopOverActionRename: function(sId) {
232
243
  return this.iExecutePopOverActionByIcon("edit", "Press rename on " + sId);
233
244
  },
@@ -261,7 +272,7 @@ sap.ui.define(["sap/ui/test/Opa5", "sap/ui/test/OpaBuilder", "sap/ui/qunit/QUnit
261
272
  },
262
273
 
263
274
  iSwitchToGroupViewInTheFilterBarDialog: function() {
264
- return this.iExecutePopOverActionByIcon("group-2", "Switch to grouped view in filter bar dialog");
275
+ return this.iExecutePopOverButtonByIcon("group-2", "Switch to grouped view in filter bar dialog");
265
276
  },
266
277
 
267
278
  iSelectExpandFiltersgroupInTheFilterBarDialog: function(sFiltersgroupName) {
@@ -577,7 +588,7 @@ sap.ui.define(["sap/ui/test/Opa5", "sap/ui/test/OpaBuilder", "sap/ui/qunit/QUnit
577
588
 
578
589
  iSeeThePopover: function() {
579
590
  return OpaBuilder.create(this)
580
- .hasType("sap.m.Popover")
591
+ .hasType("sap.ui.unified.Menu")
581
592
  .description("Seeing the Popover")
582
593
  .execute();
583
594
  },
@@ -591,6 +602,15 @@ sap.ui.define(["sap/ui/test/Opa5", "sap/ui/test/OpaBuilder", "sap/ui/qunit/QUnit
591
602
  .execute();
592
603
  },
593
604
 
605
+ iSeeTheMenuItemByIcon: function(sIcon, sDescription) {
606
+ return OpaBuilder.create(this)
607
+ .hasType("sap.ui.unified.MenuItem")
608
+ .isDialogElement()
609
+ .hasProperties({ icon: sIcon })
610
+ .description("Seeing " + sDescription)
611
+ .execute();
612
+ },
613
+
594
614
  iDoNotSeeTheButtonByIcon: function(sIcon, sDescription) {
595
615
  return OpaBuilder.create(this)
596
616
  .hasType("sap.m.Button")
@@ -605,36 +625,50 @@ sap.ui.define(["sap/ui/test/Opa5", "sap/ui/test/OpaBuilder", "sap/ui/qunit/QUnit
605
625
  .execute();
606
626
  },
607
627
 
628
+ iDoNotSeeTheMenuItemByIcon: function(sIcon, sDescription) {
629
+ return OpaBuilder.create(this)
630
+ .hasType("sap.ui.unified.MenuItem")
631
+ .isDialogElement()
632
+ .check(function(aButtons) {
633
+ var bFound = aButtons.some(function(oButton) {
634
+ return oButton.getProperty("icon") === sIcon;
635
+ });
636
+ return bFound === false;
637
+ }, true)
638
+ .description("Not seeing " + sDescription)
639
+ .execute();
640
+ },
641
+
608
642
  iSeeTheVariantManagementPopover: function() {
609
- return this.iSeeTheButtonByIcon("sap-icon://duplicate", "The Popover");
643
+ return this.iSeeTheMenuItemByIcon("sap-icon://duplicate", "The Popover");
610
644
  },
611
645
 
612
646
  iSeeTheRTAPopover: function() {
613
- return this.iSeeTheButtonByIcon("sap-icon://key-user-settings", "The RTAPopover");
647
+ return this.iSeeTheMenuItemByIcon("sap-icon://key-user-settings", "The RTAPopover");
614
648
  },
615
649
 
616
650
  iSeeTheRenameButton: function() {
617
- return this.iSeeTheButtonByIcon("sap-icon://edit", "the button 'rename'");
651
+ return this.iSeeTheMenuItemByIcon("sap-icon://edit", "the button 'rename'");
618
652
  },
619
653
 
620
654
  iSeeTheAddButton: function() {
621
- return this.iSeeTheButtonByIcon("sap-icon://add", "the button 'add'");
655
+ return this.iSeeTheMenuItemByIcon("sap-icon://add", "the button 'add'");
622
656
  },
623
657
 
624
658
  iSeeTheCreateGroupButton: function() {
625
- return this.iSeeTheButtonByIcon("sap-icon://add-folder", "the button 'create group'");
659
+ return this.iSeeTheMenuItemByIcon("sap-icon://add-folder", "the button 'create group'");
626
660
  },
627
661
 
628
662
  iDoNotSeeTheRenameButton: function() {
629
- return this.iDoNotSeeTheButtonByIcon("sap-icon://edit", "the button 'rename'");
663
+ return this.iDoNotSeeTheMenuItemByIcon("sap-icon://edit", "the button 'rename'");
630
664
  },
631
665
 
632
666
  iDoNotSeeTheAddButton: function() {
633
- return this.iDoNotSeeTheButtonByIcon("sap-icon://add", "the button 'add'");
667
+ return this.iDoNotSeeTheMenuItemByIcon("sap-icon://add", "the button 'add'");
634
668
  },
635
669
 
636
670
  iDoNotSeeTheRemoveButton: function() {
637
- return this.iDoNotSeeTheButtonByIcon("sap-icon://less", "the button 'remove'");
671
+ return this.iDoNotSeeTheMenuItemByIcon("sap-icon://less", "the button 'remove'");
638
672
  },
639
673
 
640
674
  iSeeThePopoverDialog: function() {
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  * ! SAPUI5
3
- * (c) Copyright 2009-2021 SAP SE. All rights reserved.
3
+ * (c) Copyright 2009-2022 SAP SE. All rights reserved.
4
4
  */
5
5
  sap.ui.define(["sap/base/util/merge", "./TemplatePage", "sap/ui/test/OpaBuilder", "sap/m/library"], function(
6
6
  mergeObjects,
@@ -2,14 +2,85 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/fe/macros/PhantomUtil", "sap/ui/model/odata/v4/lib/_MetadataRequestor", "sap/ui/model/odata/v4/ODataMetaModel", "sap/ui/core/util/XMLPreprocessor", "sap/base/Log", "xpath", "fs", "@sap/cds-compiler", "prettier", "sap/ui/base/BindingParser", "sap/ui/model/json/JSONModel", "sap/ui/core/InvisibleText", "sap/base/util/merge", "path", "sap/fe/core/converters/ConverterContext", "sap/fe/core/services/SideEffectsServiceFactory"], function (PhantomUtil, _MetadataRequestor, ODataMetaModel, XMLPreprocessor, Log, xpath, fs, cds_compiler, prettier, BindingParser, JSONModel, InvisibleText, merge, path, ConverterContext, SideEffectsFactory) {
5
+ sap.ui.define(["sap/fe/macros/PhantomUtil", "sap/ui/model/odata/v4/lib/_MetadataRequestor", "sap/ui/model/odata/v4/ODataMetaModel", "sap/ui/core/util/XMLPreprocessor", "sap/base/Log", "xpath", "fs", "@sap/cds-compiler", "prettier", "sap/ui/base/BindingParser", "sap/ui/model/json/JSONModel", "sap/ui/core/InvisibleText", "sap/base/util/merge", "path", "sap/fe/core/converters/ConverterContext", "sap/fe/core/services/SideEffectsServiceFactory", "sap/fe/core/TemplateModel"], function (PhantomUtil, _MetadataRequestor, ODataMetaModel, XMLPreprocessor, Log, xpath, fs, cds_compiler, prettier, BindingParser, JSONModel, InvisibleText, merge, path, ConverterContext, SideEffectsFactory, TemplateModel) {
6
6
  "use strict";
7
7
 
8
8
  var _exports = {};
9
9
  var format = prettier.format;
10
10
  var to = cds_compiler.to;
11
11
  var compileSources = cds_compiler.compileSources;
12
- var compactModel = cds_compiler.compactModel;
12
+
13
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function () {}; return { s: F, n: function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function (e) { throw e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function () { it = it.call(o); }, n: function () { var step = it.next(); normalCompletion = step.done; return step; }, e: function (e) { didErr = true; err = e; }, f: function () { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
14
+
15
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
16
+
17
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
18
+
19
+ /**
20
+ * Process the requested XML fragment with the provided data.
21
+ *
22
+ * @param {string} name Fully qualified name of the fragment to be tested.
23
+ * @param {object} testData Test data consisting
24
+ * @returns Tempalted fragment as string
25
+ */
26
+ var processFragment = function (name, testData) {
27
+ try {
28
+ var inputXml = "<root><core:Fragment fragmentName=\"".concat(name, "\" type=\"XML\" xmlns:core=\"sap.ui.core\" /></root>");
29
+ var parser = new window.DOMParser();
30
+ var inputDoc = parser.parseFromString(inputXml, "text/xml"); // build model and bindings for given test data
31
+
32
+ var settings = {
33
+ models: {},
34
+ bindingContexts: {}
35
+ };
36
+
37
+ for (var _model in testData) {
38
+ var jsonModel = new JSONModel();
39
+ jsonModel.setData(testData[_model]);
40
+ settings.models[_model] = jsonModel;
41
+ settings.bindingContexts[_model] = settings.models[_model].createBindingContext("/");
42
+ } // execute the pre-processor
43
+
44
+
45
+ return Promise.resolve(XMLPreprocessor.process(inputDoc.firstElementChild, {
46
+ name: name
47
+ }, settings)).then(function (resultDoc) {
48
+ // exclude nested fragments from test snapshots
49
+ var fragments = resultDoc.getElementsByTagName("core:Fragment");
50
+
51
+ if ((fragments === null || fragments === void 0 ? void 0 : fragments.length) > 0) {
52
+ var _iterator = _createForOfIteratorHelper(fragments),
53
+ _step;
54
+
55
+ try {
56
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
57
+ var fragment = _step.value;
58
+ fragment.innerHTML = "";
59
+ }
60
+ } catch (err) {
61
+ _iterator.e(err);
62
+ } finally {
63
+ _iterator.f();
64
+ }
65
+ }
66
+
67
+ return formatXml(resultDoc.innerHTML, {
68
+ filter: function (node) {
69
+ return node.type !== "Comment";
70
+ }
71
+ });
72
+ });
73
+ } catch (e) {
74
+ return Promise.reject(e);
75
+ }
76
+ };
77
+
78
+ _exports.processFragment = processFragment;
79
+
80
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
81
+ var formatXml = require("xml-formatter"); // eslint-disable-next-line @typescript-eslint/ban-ts-comment
82
+ // @ts-ignore
83
+
13
84
 
14
85
  Log.setLevel(1, "sap.ui.core.util.XMLPreprocessor");
15
86
  jest.setTimeout(40000);
@@ -37,6 +108,16 @@ sap.ui.define(["sap/fe/macros/PhantomUtil", "sap/ui/model/odata/v4/lib/_Metadata
37
108
 
38
109
  _exports.registerMacro = registerMacro;
39
110
 
111
+ var unregisterMacro = function (macroMetadata) {
112
+ XMLPreprocessor.plugIn(null, macroMetadata.namespace, macroMetadata.name);
113
+
114
+ if (macroMetadata.publicName) {
115
+ XMLPreprocessor.plugIn(null, macroMetadata.publicNamespace, macroMetadata.publicName);
116
+ }
117
+ };
118
+
119
+ _exports.unregisterMacro = unregisterMacro;
120
+
40
121
  var runXPathQuery = function (selector, xmldom) {
41
122
  return select(selector, xmldom);
42
123
  };
@@ -95,8 +176,7 @@ sap.ui.define(["sap/fe/macros/PhantomUtil", "sap/ui/model/odata/v4/lib/_Metadata
95
176
  var csn = compileSources({
96
177
  "string.cds": cdsString
97
178
  }, {});
98
- var csnModel = compactModel(csn);
99
- var edmxContent = to.edmx(csnModel, {
179
+ var edmxContent = to.edmx(csn, {
100
180
  service: "sap.fe.test.JestService"
101
181
  });
102
182
  var dir = path.resolve(sCDSUrl, "..", "gen");
@@ -246,8 +326,21 @@ sap.ui.define(["sap/fe/macros/PhantomUtil", "sap/ui/model/odata/v4/lib/_Metadata
246
326
  try {
247
327
  var templatedXml = "<root>".concat(xmlInput, "</root>");
248
328
  var parser = new window.DOMParser();
249
- var xmlDoc = parser.parseFromString(templatedXml, "text/xml");
329
+ var xmlDoc = parser.parseFromString(templatedXml, "text/xml"); // To ensure our macro can use #setBindingContext we ensure there is a pre existing JSONModel for converterContext
330
+ // if not already passed to teh templating
331
+
250
332
  return Promise.resolve(getMetaModel(sMetadataUrl)).then(function (oMetaModel) {
333
+ if (!mModels.hasOwnProperty("converterContext")) {
334
+ mModels = Object.assign(mModels, {
335
+ "converterContext": new TemplateModel({}, oMetaModel)
336
+ });
337
+ }
338
+
339
+ Object.keys(mModels).forEach(function (sModelName) {
340
+ if (mModels[sModelName] && mModels[sModelName].isTemplateModel) {
341
+ mModels[sModelName] = new TemplateModel(mModels[sModelName].data, oMetaModel);
342
+ }
343
+ });
251
344
  var oPreprocessorSettings = {
252
345
  models: Object.assign({
253
346
  metaModel: oMetaModel
@@ -290,4 +383,4 @@ sap.ui.define(["sap/fe/macros/PhantomUtil", "sap/ui/model/odata/v4/lib/_Metadata
290
383
  _exports.getTemplatedXML = getTemplatedXML;
291
384
  return _exports;
292
385
  }, false);
293
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkplc3RUZW1wbGF0aW5nSGVscGVyLnRzIl0sIm5hbWVzIjpbIkxvZyIsInNldExldmVsIiwiamVzdCIsInNldFRpbWVvdXQiLCJuYW1lU3BhY2VNYXAiLCJzZWxlY3QiLCJ4cGF0aCIsInVzZU5hbWVzcGFjZXMiLCJyZWdpc3Rlck1hY3JvIiwibWFjcm9NZXRhZGF0YSIsIlBoYW50b21VdGlsIiwicmVnaXN0ZXIiLCJydW5YUGF0aFF1ZXJ5Iiwic2VsZWN0b3IiLCJ4bWxkb20iLCJleHBlY3QiLCJleHRlbmQiLCJ0b0hhdmVDb250cm9sIiwibm9kZXMiLCJtZXNzYWdlIiwib3V0cHV0WG1sIiwic2VyaWFsaXplWE1MIiwicGFzcyIsImxlbmd0aCIsInRvTm90SGF2ZUNvbnRyb2wiLCJnZXRDb250cm9sQXR0cmlidXRlIiwiY29udHJvbFNlbGVjdG9yIiwiYXR0cmlidXRlTmFtZSIsInhtbERvbSIsInNlcmlhbGl6ZXIiLCJ3aW5kb3ciLCJYTUxTZXJpYWxpemVyIiwieG1sU3RyaW5nIiwic2VyaWFsaXplVG9TdHJpbmciLCJyZXBsYWNlIiwiZm9ybWF0IiwicGFyc2VyIiwiY29tcGlsZUNEUyIsInNDRFNVcmwiLCJjZHNTdHJpbmciLCJmcyIsInJlYWRGaWxlU3luYyIsImNzbiIsImNvbXBpbGVTb3VyY2VzIiwiY3NuTW9kZWwiLCJjb21wYWN0TW9kZWwiLCJlZG14Q29udGVudCIsInRvIiwiZWRteCIsInNlcnZpY2UiLCJkaXIiLCJwYXRoIiwicmVzb2x2ZSIsImVkbXhVcmwiLCJiYXNlbmFtZSIsImV4aXN0c1N5bmMiLCJta2RpclN5bmMiLCJ3cml0ZUZpbGVTeW5jIiwiZ2V0RmFrZVNpZGVFZmZlY3RzU2VydmljZSIsIm9NZXRhTW9kZWwiLCJvU2VydmljZUNvbnRleHQiLCJzY29wZU9iamVjdCIsInNjb3BlVHlwZSIsInNldHRpbmdzIiwiU2lkZUVmZmVjdHNGYWN0b3J5IiwiY3JlYXRlSW5zdGFuY2UiLCJ0aGVuIiwib1NlcnZpY2VJbnN0YW5jZSIsIm9KZXN0U2lkZUVmZmVjdHNTZXJ2aWNlIiwiZ2V0SW50ZXJmYWNlIiwiZ2V0Q29udGV4dCIsImdldE1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwiZ2V0RmFrZURpYWdub3N0aWNzIiwiaXNzdWVzIiwiYWRkSXNzdWUiLCJpc3N1ZUNhdGVnb3J5IiwiaXNzdWVTZXZlcml0eSIsImRldGFpbHMiLCJwdXNoIiwiZ2V0SXNzdWVzIiwiY2hlY2tJZklzc3VlRXhpc3RzIiwiZmluZCIsImlzc3VlIiwiZ2V0Q29udmVydGVyQ29udGV4dEZvclRlc3QiLCJjb252ZXJ0ZWRUeXBlcyIsIm1hbmlmZXN0U2V0dGluZ3MiLCJlbnRpdHlTZXQiLCJlbnRpdHlTZXRzIiwiZXMiLCJuYW1lIiwiZGF0YU1vZGVsUGF0aCIsImdldERhdGFNb2RlbE9iamVjdFBhdGhGb3JQcm9wZXJ0eSIsIkNvbnZlcnRlckNvbnRleHQiLCJtZXJnZSIsIm1ldGFNb2RlbENhY2hlIiwic01ldGFkYXRhVXJsIiwib1JlcXVlc3RvciIsIl9NZXRhZGF0YVJlcXVlc3RvciIsImNyZWF0ZSIsIk9EYXRhTWV0YU1vZGVsIiwidW5kZWZpbmVkIiwiZmV0Y2hFbnRpdHlDb250YWluZXIiLCJwcm9wZXJ0eSIsInRhcmdldFBhdGgiLCJzdGFydGluZ0VudGl0eVNldCIsIm5hdmlnYXRpb25Qcm9wZXJ0aWVzIiwidGFyZ2V0T2JqZWN0IiwidGFyZ2V0RW50aXR5U2V0IiwidGFyZ2V0RW50aXR5VHlwZSIsImVudGl0eVR5cGUiLCJjb250ZXh0TG9jYXRpb24iLCJldmFsdWF0ZUJpbmRpbmciLCJiaW5kaW5nU3RyaW5nIiwiYmluZGluZ0VsZW1lbnQiLCJCaW5kaW5nUGFyc2VyIiwiY29tcGxleFBhcnNlciIsImFyZ3MiLCJmb3JtYXR0ZXIiLCJhcHBseSIsImV2YWx1YXRlQmluZGluZ1dpdGhNb2RlbCIsIm1vZGVsQ29udGVudCIsImpzb25Nb2RlbCIsIkpTT05Nb2RlbCIsInRleHQiLCJJbnZpc2libGVUZXh0IiwiYmluZFByb3BlcnR5Iiwic2V0TW9kZWwiLCJzZXRCaW5kaW5nQ29udGV4dCIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwiZ2V0VGV4dCIsImdldFRlbXBsYXRpbmdSZXN1bHQiLCJ4bWxJbnB1dCIsIm1CaW5kaW5nQ29udGV4dHMiLCJtTW9kZWxzIiwidGVtcGxhdGVkWG1sIiwiRE9NUGFyc2VyIiwieG1sRG9jIiwicGFyc2VGcm9tU3RyaW5nIiwib1ByZXByb2Nlc3NvclNldHRpbmdzIiwibW9kZWxzIiwiT2JqZWN0IiwiYXNzaWduIiwibWV0YU1vZGVsIiwiYmluZGluZ0NvbnRleHRzIiwia2V5cyIsImZvckVhY2giLCJzS2V5IiwiZ2V0T2JqZWN0IiwidG9CZURlZmluZWQiLCJvTW9kZWwiLCJYTUxQcmVwcm9jZXNzb3IiLCJwcm9jZXNzIiwiZmlyc3RFbGVtZW50Q2hpbGQiLCJnZXRUZW1wbGF0ZWRYTUwiXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7QUFvQkFBLEVBQUFBLEdBQUcsQ0FBQ0MsUUFBSixDQUFhLENBQWIsRUFBdUIsa0NBQXZCO0FBQ0FDLEVBQUFBLElBQUksQ0FBQ0MsVUFBTCxDQUFnQixLQUFoQjtBQUVBLE1BQU1DLFlBQVksR0FBRztBQUNwQixjQUFVLGVBRFU7QUFFcEIsYUFBUyxlQUZXO0FBR3BCLGlCQUFhLGtFQUhPO0FBSXBCLFdBQU8sa0VBSmE7QUFLcEIsZ0JBQVksMEVBTFE7QUFNcEIsZUFBVyxzQkFOUztBQU9wQixZQUFRLGFBUFk7QUFRcEIsU0FBSyxPQVJlO0FBU3BCLFNBQUssb0JBVGU7QUFVcEIsV0FBTyxZQVZhO0FBV3BCLGdCQUFZLGtCQVhRO0FBWXBCLFNBQUssZ0JBWmU7QUFhcEIsdUJBQW1CLDBCQWJDO0FBY3BCLGtCQUFjO0FBZE0sR0FBckI7QUFnQkEsTUFBTUMsTUFBTSxHQUFHQyxLQUFLLENBQUNDLGFBQU4sQ0FBb0JILFlBQXBCLENBQWY7O0FBRU8sTUFBTUksYUFBYSxHQUFHLFVBQVNDLGFBQVQsRUFBNkI7QUFDekRDLElBQUFBLFdBQVcsQ0FBQ0MsUUFBWixDQUFx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RCxFQUFXcEMsWUFBWCxFQUF5QnFDLGdCQUF6QixFQUEyQ0MsT0FBM0MsQ0FEN0MsT0FFTWpILFlBRk47QUFHRCxLQVIyQjtBQUFBO0FBQUE7QUFBQSxHQUFyQiIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGhhbnRvbVV0aWwgfSBmcm9tIFwic2FwL2ZlL21hY3Jvc1wiO1xuaW1wb3J0IHsgX01ldGFkYXRhUmVxdWVzdG9yIH0gZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9saWJcIjtcbmltcG9ydCB7IE9EYXRhTWV0YU1vZGVsIH0gZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NFwiO1xuaW1wb3J0IHsgWE1MUHJlcHJvY2Vzc29yIH0gZnJvbSBcInNhcC91aS9jb3JlL3V0aWxcIjtcbmltcG9ydCB7IExvZyB9IGZyb20gXCJzYXAvYmFzZVwiO1xuaW1wb3J0IHhwYXRoIGZyb20gXCJ4cGF0aFwiO1xuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgeyBjb21wYWN0TW9kZWwsIGNvbXBpbGVTb3VyY2VzLCB0byB9IGZyb20gXCJAc2FwL2Nkcy1jb21waWxlclwiO1xuaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSBcInByZXR0aWVyXCI7XG5pbXBvcnQgeyBCaW5kaW5nUGFyc2VyIH0gZnJvbSBcInNhcC91aS9iYXNlXCI7XG5pbXBvcnQgeyBBbnlBbm5vdGF0aW9uLCBDb252ZXJ0ZXJPdXRwdXQsIEVudGl0eVNldCwgUHJvcGVydHkgfSBmcm9tIFwiQHNhcC11eC9hbm5vdGF0aW9uLWNvbnZlcnRlclwiO1xuaW1wb3J0IHsgRGF0YU1vZGVsT2JqZWN0UGF0aCB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCB7IEpTT05Nb2RlbCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvanNvblwiO1xuaW1wb3J0IHsgSW52aXNpYmxlVGV4dCB9IGZyb20gXCJzYXAvdWkvY29yZVwiO1xuaW1wb3J0IHsgTGlzdFJlcG9ydE1hbmlmZXN0U2V0dGluZ3MsIE9iamVjdFBhZ2VNYW5pZmVzdFNldHRpbmdzIH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvTWFuaWZlc3RTZXR0aW5nc1wiO1xuaW1wb3J0IHsgSXNzdWVDYXRlZ29yeSwgSXNzdWVTZXZlcml0eSB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL2hlbHBlcnMvSXNzdWVNYW5hZ2VyXCI7XG5pbXBvcnQgeyBJRGlhZ25vc3RpY3MgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9UZW1wbGF0ZUNvbnZlcnRlclwiO1xuaW1wb3J0IHsgbWVyZ2UgfSBmcm9tIFwic2FwL2Jhc2UvdXRpbFwiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IENvbnZlcnRlckNvbnRleHQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvQ29udmVydGVyQ29udGV4dFwiO1xuaW1wb3J0IFNpZGVFZmZlY3RzRmFjdG9yeSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeVwiO1xuXG5Mb2cuc2V0TGV2ZWwoMSBhcyBhbnksIFwic2FwLnVpLmNvcmUudXRpbC5YTUxQcmVwcm9jZXNzb3JcIik7XG5qZXN0LnNldFRpbWVvdXQoNDAwMDApO1xuXG5jb25zdCBuYW1lU3BhY2VNYXAgPSB7XG5cdFwibWFjcm9zXCI6IFwic2FwLmZlLm1hY3Jvc1wiLFxuXHRcIm1hY3JvXCI6IFwic2FwLmZlLm1hY3Jvc1wiLFxuXHRcIm1hY3JvZGF0YVwiOiBcImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L2V4dGVuc2lvbi9zYXAudWkuY29yZS5DdXN0b21EYXRhLzFcIixcblx0XCJsb2dcIjogXCJodHRwOi8vc2NoZW1hcy5zYXAuY29tL3NhcHVpNS9leHRlbnNpb24vc2FwLnVpLmNvcmUuQ3VzdG9tRGF0YS8xXCIsXG5cdFwidW5pdHRlc3RcIjogXCJodHRwOi8vc2NoZW1hcy5zYXAuY29tL3NhcHVpNS9wcmVwcm9jZXNzb3JleHRlbnNpb24vc2FwLmZlLnVuaXR0ZXN0aW5nLzFcIixcblx0XCJjb250cm9sXCI6IFwic2FwLmZlLmNvcmUuY29udHJvbHNcIixcblx0XCJjb3JlXCI6IFwic2FwLnVpLmNvcmVcIixcblx0XCJtXCI6IFwic2FwLm1cIixcblx0XCJmXCI6IFwic2FwLnVpLmxheW91dC5mb3JtXCIsXG5cdFwibWRjXCI6IFwic2FwLnVpLm1kY1wiLFxuXHRcIm1kY0ZpZWxkXCI6IFwic2FwLnVpLm1kYy5maWVsZFwiLFxuXHRcInVcIjogXCJzYXAudWkudW5pZmllZFwiLFxuXHRcIm1hY3JvTWljcm9DaGFydFwiOiBcInNhcC5mZS5tYWNyb3MubWljcm9jaGFydFwiLFxuXHRcIm1pY3JvQ2hhcnRcIjogXCJzYXAuc3VpdGUudWkubWljcm9jaGFydFwiXG59O1xuY29uc3Qgc2VsZWN0ID0geHBhdGgudXNlTmFtZXNwYWNlcyhuYW1lU3BhY2VNYXApO1xuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJNYWNybyA9IGZ1bmN0aW9uKG1hY3JvTWV0YWRhdGE6IGFueSkge1xuXHRQaGFudG9tVXRpbC5yZWdpc3RlcihtYWNyb01ldGFkYXRhKTtcbn07XG5leHBvcnQgY29uc3QgcnVuWFBhdGhRdWVyeSA9IGZ1bmN0aW9uKHNlbGVjdG9yOiBzdHJpbmcsIHhtbGRvbTogTm9kZSB8IHVuZGVmaW5lZCkge1xuXHRyZXR1cm4gc2VsZWN0KHNlbGVjdG9yLCB4bWxkb20pO1xufTtcblxuZXhwZWN0LmV4dGVuZCh7XG5cdHRvSGF2ZUNvbnRyb2woeG1sZG9tLCBzZWxlY3Rvcikge1xuXHRcdGNvbnN0IG5vZGVzID0gcnVuWFBhdGhRdWVyeShgL3Jvb3Qke3NlbGVjdG9yfWAsIHhtbGRvbSk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdG1lc3NhZ2U6ICgpID0+IHtcblx0XHRcdFx0Y29uc3Qgb3V0cHV0WG1sID0gc2VyaWFsaXplWE1MKHhtbGRvbSk7XG5cdFx0XHRcdHJldHVybiBgZGlkIG5vdCBmaW5kIGNvbnRyb2xzIG1hdGNoaW5nICR7c2VsZWN0b3J9IGluIGdlbmVyYXRlZCB4bWw6XFxuICR7b3V0cHV0WG1sfWA7XG5cdFx0XHR9LFxuXHRcdFx0cGFzczogbm9kZXMgJiYgbm9kZXMubGVuZ3RoID49IDFcblx0XHR9O1xuXHR9LFxuXHR0b05vdEhhdmVDb250cm9sKHhtbGRvbSwgc2VsZWN0b3IpIHtcblx0XHRjb25zdCBub2RlcyA9IHJ1blhQYXRoUXVlcnkoYC9yb290JHtzZWxlY3Rvcn1gLCB4bWxkb20pO1xuXHRcdHJldHVybiB7XG5cdFx0XHRtZXNzYWdlOiAoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IG91dHB1dFhtbCA9IHNlcmlhbGl6ZVhNTCh4bWxkb20pO1xuXHRcdFx0XHRyZXR1cm4gYFRoZXJlIGlzIGEgY29udHJvbCBtYXRjaGluZyAke3NlbGVjdG9yfSBpbiBnZW5lcmF0ZWQgeG1sOlxcbiAke291dHB1dFhtbH1gO1xuXHRcdFx0fSxcblx0XHRcdHBhc3M6IG5vZGVzICYmIG5vZGVzLmxlbmd0aCA9PT0gMFxuXHRcdH07XG5cdH1cbn0pO1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udHJvbEF0dHJpYnV0ZSA9IGZ1bmN0aW9uKGNvbnRyb2xTZWxlY3Rvcjogc3RyaW5nLCBhdHRyaWJ1dGVOYW1lOiBzdHJpbmcsIHhtbERvbTogTm9kZSkge1xuXHRjb25zdCBzZWxlY3RvciA9IGBzdHJpbmcoL3Jvb3Qke2NvbnRyb2xTZWxlY3Rvcn0vQCR7YXR0cmlidXRlTmFtZX0pYDtcblx0cmV0dXJuIHJ1blhQYXRoUXVlcnkoc2VsZWN0b3IsIHhtbERvbSk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2VyaWFsaXplWE1MID0gZnVuY3Rpb24oeG1sRG9tOiBOb2RlKSB7XG5cdGNvbnN0IHNlcmlhbGl6ZXIgPSBuZXcgd2luZG93LlhNTFNlcmlhbGl6ZXIoKTtcblx0Y29uc3QgeG1sU3RyaW5nID0gc2VyaWFsaXplclxuXHRcdC5zZXJpYWxpemVUb1N0cmluZyh4bWxEb20pXG5cdFx0LnJlcGxhY2UoLyg/OltcXHQgXSooPzpcXHI/XFxufFxccikpKy9nLCBcIlxcblwiKVxuXHRcdC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJyk7XG5cdHJldHVybiBmb3JtYXQoeG1sU3RyaW5nLCB7IHBhcnNlcjogXCJodG1sXCIgfSk7XG59O1xuXG4vKipcbiAqIENvbXBpbGUgYSBDRFMgZmlsZSBpbnRvIGFuIEVETVggZmlsZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc0NEU1VybCBUaGUgcGF0aCB0byB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBDRFMgZGVmaW5pdGlvbi4gVGhpcyBmaWxlIE1VU1QgZGVjbGFyZSB0aGUgbmFtZXNwYWNlXG4gKiBzYXAuZmUudGVzdCBhbmQgYSBzZXJ2aWNlIEplc3RTZXJ2aWNlXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgcGF0aCBvZiB0aGUgZ2VuZXJhdGVkIEVETVhcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbXBpbGVDRFMgPSBmdW5jdGlvbihzQ0RTVXJsOiBzdHJpbmcpIHtcblx0Y29uc3QgY2RzU3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKHNDRFNVcmwsIFwidXRmLThcIik7XG5cdGNvbnN0IGNzbiA9IGNvbXBpbGVTb3VyY2VzKHsgXCJzdHJpbmcuY2RzXCI6IGNkc1N0cmluZyB9LCB7fSk7XG5cdGNvbnN0IGNzbk1vZGVsID0gY29tcGFjdE1vZGVsKGNzbik7XG5cdGNvbnN0IGVkbXhDb250ZW50ID0gdG8uZWRteChjc25Nb2RlbCwgeyBzZXJ2aWNlOiBcInNhcC5mZS50ZXN0Lkplc3RTZXJ2aWNlXCIgfSk7XG5cdGNvbnN0IGRpciA9IHBhdGgucmVzb2x2ZShzQ0RTVXJsLCBcIi4uXCIsIFwiZ2VuXCIpO1xuXHRjb25zdCBlZG14VXJsID0gcGF0aC5yZXNvbHZlKGRpciwgcGF0aC5iYXNlbmFtZShzQ0RTVXJsKS5yZXBsYWNlKFwiLmNkc1wiLCBcIi54bWxcIikpO1xuXG5cdGlmICghZnMuZXhpc3RzU3luYyhkaXIpKSB7XG5cdFx0ZnMubWtkaXJTeW5jKGRpcik7XG5cdH1cblxuXHRmcy53cml0ZUZpbGVTeW5jKGVkbXhVcmwsIGVkbXhDb250ZW50KTtcblx0cmV0dXJuIGVkbXhVcmw7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RmFrZVNpZGVFZmZlY3RzU2VydmljZSA9IGFzeW5jIGZ1bmN0aW9uKG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsKTogUHJvbWlzZTxhbnk+IHtcblx0Y29uc3Qgb1NlcnZpY2VDb250ZXh0ID0geyBzY29wZU9iamVjdDoge30sIHNjb3BlVHlwZTogXCJcIiwgc2V0dGluZ3M6IHt9IH07XG5cdHJldHVybiBuZXcgU2lkZUVmZmVjdHNGYWN0b3J5KCkuY3JlYXRlSW5zdGFuY2Uob1NlcnZpY2VDb250ZXh0KS50aGVuKGZ1bmN0aW9uKG9TZXJ2aWNlSW5zdGFuY2U6IGFueSkge1xuXHRcdGNvbnN0IG9KZXN0U2lkZUVmZmVjdHNTZXJ2aWNlID0gb1NlcnZpY2VJbnN0YW5jZS5nZXRJbnRlcmZhY2UoKTtcblx0XHRvSmVzdFNpZGVFZmZlY3RzU2VydmljZS5nZXRDb250ZXh0ID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRzY29wZU9iamVjdDoge1xuXHRcdFx0XHRcdGdldE1vZGVsOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdGdldE1ldGFNb2RlbDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIG9NZXRhTW9kZWw7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdH07XG5cdFx0cmV0dXJuIG9KZXN0U2lkZUVmZmVjdHNTZXJ2aWNlO1xuXHR9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRGYWtlRGlhZ25vc3RpY3MgPSBmdW5jdGlvbigpOiBJRGlhZ25vc3RpY3Mge1xuXHRjb25zdCBpc3N1ZXM6IGFueVtdID0gW107XG5cdHJldHVybiB7XG5cdFx0YWRkSXNzdWUoaXNzdWVDYXRlZ29yeTogSXNzdWVDYXRlZ29yeSwgaXNzdWVTZXZlcml0eTogSXNzdWVTZXZlcml0eSwgZGV0YWlsczogc3RyaW5nKTogdm9pZCB7XG5cdFx0XHRpc3N1ZXMucHVzaCh7XG5cdFx0XHRcdGlzc3VlQ2F0ZWdvcnksXG5cdFx0XHRcdGlzc3VlU2V2ZXJpdHksXG5cdFx0XHRcdGRldGFpbHNcblx0XHRcdH0pO1xuXHRcdH0sXG5cdFx0Z2V0SXNzdWVzKCk6IGFueVtdIHtcblx0XHRcdHJldHVybiBpc3N1ZXM7XG5cdFx0fSxcblx0XHRjaGVja0lmSXNzdWVFeGlzdHMoaXNzdWVDYXRlZ29yeTogSXNzdWVDYXRlZ29yeSwgaXNzdWVTZXZlcml0eTogSXNzdWVTZXZlcml0eSwgZGV0YWlsczogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0XHRyZXR1cm4gaXNzdWVzLmZpbmQoaXNzdWUgPT4ge1xuXHRcdFx0XHRpc3N1ZS5pc3N1ZUNhdGVnb3J5ID09PSBpc3N1ZUNhdGVnb3J5ICYmIGlzc3VlLmlzc3VlU2V2ZXJpdHkgPT09IGlzc3VlU2V2ZXJpdHkgJiYgaXNzdWUuZGV0YWlscyA9PT0gZGV0YWlscztcblx0XHRcdH0pO1xuXHRcdH1cblx0fTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb252ZXJ0ZXJDb250ZXh0Rm9yVGVzdCA9IGZ1bmN0aW9uKFxuXHRjb252ZXJ0ZWRUeXBlczogQ29udmVydGVyT3V0cHV0LFxuXHRtYW5pZmVzdFNldHRpbmdzOiBMaXN0UmVwb3J0TWFuaWZlc3RTZXR0aW5ncyB8IE9iamVjdFBhZ2VNYW5pZmVzdFNldHRpbmdzXG4pIHtcblx0Y29uc3QgZW50aXR5U2V0ID0gY29udmVydGVkVHlwZXMuZW50aXR5U2V0cy5maW5kKGVzID0+IGVzLm5hbWUgPT09IG1hbmlmZXN0U2V0dGluZ3MuZW50aXR5U2V0KTtcblx0Y29uc3QgZGF0YU1vZGVsUGF0aCA9IGdldERhdGFNb2RlbE9iamVjdFBhdGhGb3JQcm9wZXJ0eShlbnRpdHlTZXQgYXMgRW50aXR5U2V0LCBlbnRpdHlTZXQpO1xuXHRyZXR1cm4gbmV3IENvbnZlcnRlckNvbnRleHQoY29udmVydGVkVHlwZXMsIG1hbmlmZXN0U2V0dGluZ3MsIGdldEZha2VEaWFnbm9zdGljcygpLCBtZXJnZSwgZGF0YU1vZGVsUGF0aCk7XG59O1xuY29uc3QgbWV0YU1vZGVsQ2FjaGU6IGFueSA9IHt9O1xuZXhwb3J0IGNvbnN0IGdldE1ldGFNb2RlbCA9IGFzeW5jIGZ1bmN0aW9uKHNNZXRhZGF0YVVybDogc3RyaW5nKSB7XG5cdGNvbnN0IG9SZXF1ZXN0b3IgPSBfTWV0YWRhdGFSZXF1ZXN0b3IuY3JlYXRlKHt9LCBcIjQuMFwiLCB7fSk7XG5cdGlmICghbWV0YU1vZGVsQ2FjaGVbc01ldGFkYXRhVXJsXSkge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBuZXcgT0RhdGFNZXRhTW9kZWwob1JlcXVlc3Rvciwgc01ldGFkYXRhVXJsLCB1bmRlZmluZWQsIG51bGwpO1xuXHRcdGF3YWl0IG9NZXRhTW9kZWwuZmV0Y2hFbnRpdHlDb250YWluZXIoKTtcblx0XHRtZXRhTW9kZWxDYWNoZVtzTWV0YWRhdGFVcmxdID0gb01ldGFNb2RlbDtcblx0fVxuXG5cdHJldHVybiBtZXRhTW9kZWxDYWNoZVtzTWV0YWRhdGFVcmxdO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldERhdGFNb2RlbE9iamVjdFBhdGhGb3JQcm9wZXJ0eSA9IGZ1bmN0aW9uKFxuXHRlbnRpdHlTZXQ6IEVudGl0eVNldCxcblx0cHJvcGVydHk/OiBQcm9wZXJ0eSB8IEVudGl0eVNldCB8IEFueUFubm90YXRpb25cbik6IERhdGFNb2RlbE9iamVjdFBhdGgge1xuXHRjb25zdCB0YXJnZXRQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoID0ge1xuXHRcdHN0YXJ0aW5nRW50aXR5U2V0OiBlbnRpdHlTZXQsXG5cdFx0bmF2aWdhdGlvblByb3BlcnRpZXM6IFtdLFxuXHRcdHRhcmdldE9iamVjdDogcHJvcGVydHksXG5cdFx0dGFyZ2V0RW50aXR5U2V0OiBlbnRpdHlTZXQsXG5cdFx0dGFyZ2V0RW50aXR5VHlwZTogZW50aXR5U2V0LmVudGl0eVR5cGVcblx0fTtcblx0dGFyZ2V0UGF0aC5jb250ZXh0TG9jYXRpb24gPSB0YXJnZXRQYXRoO1xuXHRyZXR1cm4gdGFyZ2V0UGF0aDtcbn07XG5cbmV4cG9ydCBjb25zdCBldmFsdWF0ZUJpbmRpbmcgPSBmdW5jdGlvbihiaW5kaW5nU3RyaW5nOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG5cdGNvbnN0IGJpbmRpbmdFbGVtZW50ID0gQmluZGluZ1BhcnNlci5jb21wbGV4UGFyc2VyKGJpbmRpbmdTdHJpbmcpO1xuXHRyZXR1cm4gYmluZGluZ0VsZW1lbnQuZm9ybWF0dGVyLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7XG59O1xuXG5leHBvcnQgY29uc3QgZXZhbHVhdGVCaW5kaW5nV2l0aE1vZGVsID0gZnVuY3Rpb24oYmluZGluZ1N0cmluZzogc3RyaW5nIHwgdW5kZWZpbmVkLCBtb2RlbENvbnRlbnQ6IGFueSkge1xuXHRjb25zdCBiaW5kaW5nRWxlbWVudCA9IEJpbmRpbmdQYXJzZXIuY29tcGxleFBhcnNlcihiaW5kaW5nU3RyaW5nKTtcblx0Y29uc3QganNvbk1vZGVsID0gbmV3IEpTT05Nb2RlbChtb2RlbENvbnRlbnQpO1xuXHRjb25zdCB0ZXh0ID0gbmV3IEludmlzaWJsZVRleHQoKTtcblx0dGV4dC5iaW5kUHJvcGVydHkoXCJ0ZXh0XCIsIGJpbmRpbmdFbGVtZW50KTtcblx0dGV4dC5zZXRNb2RlbChqc29uTW9kZWwpO1xuXHR0ZXh0LnNldEJpbmRpbmdDb250ZXh0KGpzb25Nb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIikpO1xuXHRyZXR1cm4gdGV4dC5nZXRUZXh0KCk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VGVtcGxhdGluZ1Jlc3VsdCA9IGFzeW5jIGZ1bmN0aW9uKFxuXHR4bWxJbnB1dDogc3RyaW5nLFxuXHRzTWV0YWRhdGFVcmw6IHN0cmluZyxcblx0bUJpbmRpbmdDb250ZXh0czogeyBbeDogc3RyaW5nXTogYW55OyBlbnRpdHlTZXQ/OiBzdHJpbmcgfSxcblx0bU1vZGVsczogeyBbeDogc3RyaW5nXTogYW55IH1cbikge1xuXHRjb25zdCB0ZW1wbGF0ZWRYbWwgPSBgPHJvb3Q+JHt4bWxJbnB1dH08L3Jvb3Q+YDtcblx0Y29uc3QgcGFyc2VyID0gbmV3IHdpbmRvdy5ET01QYXJzZXIoKTtcblx0Y29uc3QgeG1sRG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyh0ZW1wbGF0ZWRYbWwsIFwidGV4dC94bWxcIik7XG5cblx0Y29uc3Qgb01ldGFNb2RlbCA9IGF3YWl0IGdldE1ldGFNb2RlbChzTWV0YWRhdGFVcmwpO1xuXHRjb25zdCBvUHJlcHJvY2Vzc29yU2V0dGluZ3M6IGFueSA9IHtcblx0XHRtb2RlbHM6IE9iamVjdC5hc3NpZ24oXG5cdFx0XHR7XG5cdFx0XHRcdG1ldGFNb2RlbDogb01ldGFNb2RlbFxuXHRcdFx0fSxcblx0XHRcdG1Nb2RlbHNcblx0XHQpLFxuXHRcdGJpbmRpbmdDb250ZXh0czoge31cblx0fTtcblxuXHQvL0luamVjdCBtb2RlbHMgYW5kIGJpbmRpbmdDb250ZXh0c1xuXHRPYmplY3Qua2V5cyhtQmluZGluZ0NvbnRleHRzKS5mb3JFYWNoKGZ1bmN0aW9uKHNLZXkpIHtcblx0XHQvKiBBc3NlcnQgdG8gbWFrZSBzdXJlIHRoZSBhbm5vdGF0aW9ucyBhcmUgaW4gdGhlIHRlc3QgbWV0YWRhdGEgLT4gYXZvaWQgbWlzbGVhZGluZyB0ZXN0cyAqL1xuXHRcdGV4cGVjdCh0eXBlb2Ygb01ldGFNb2RlbC5nZXRPYmplY3QobUJpbmRpbmdDb250ZXh0c1tzS2V5XSkpLnRvQmVEZWZpbmVkKCk7XG5cdFx0Y29uc3Qgb01vZGVsID0gbU1vZGVsc1tzS2V5XSB8fCBvTWV0YU1vZGVsO1xuXHRcdG9QcmVwcm9jZXNzb3JTZXR0aW5ncy5iaW5kaW5nQ29udGV4dHNbc0tleV0gPSBvTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQobUJpbmRpbmdDb250ZXh0c1tzS2V5XSk7IC8vVmFsdWUgaXMgc1BhdGhcblx0XHRvUHJlcHJvY2Vzc29yU2V0dGluZ3MubW9kZWxzW3NLZXldID0gb01vZGVsO1xuXHR9KTtcblxuXHQvL1RoaXMgY29udGV4dCBmb3IgbWFjcm8gdGVzdGluZ1xuXHRpZiAob1ByZXByb2Nlc3NvclNldHRpbmdzLm1vZGVsc1tcInRoaXNcIl0pIHtcblx0XHRvUHJlcHJvY2Vzc29yU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzW1widGhpc1wiXSA9IG9QcmVwcm9jZXNzb3JTZXR0aW5ncy5tb2RlbHNbXCJ0aGlzXCJdLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKTtcblx0fVxuXG5cdHJldHVybiBYTUxQcmVwcm9jZXNzb3IucHJvY2Vzcyh4bWxEb2MuZmlyc3RFbGVtZW50Q2hpbGQhLCB7IG5hbWU6IFwiVGVzdCBGcmFnbWVudFwiIH0sIG9QcmVwcm9jZXNzb3JTZXR0aW5ncyk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VGVtcGxhdGVkWE1MID0gYXN5bmMgZnVuY3Rpb24oXG5cdHhtbElucHV0OiBzdHJpbmcsXG5cdHNNZXRhZGF0YVVybDogc3RyaW5nLFxuXHRtQmluZGluZ0NvbnRleHRzOiB7IFt4OiBzdHJpbmddOiBhbnk7IGVudGl0eVNldD86IHN0cmluZyB9LFxuXHRtTW9kZWxzOiB7IFt4OiBzdHJpbmddOiBhbnkgfVxuKSB7XG5cdGNvbnN0IHRlbXBsYXRlZFhNTCA9IGF3YWl0IGdldFRlbXBsYXRpbmdSZXN1bHQoeG1sSW5wdXQsIHNNZXRhZGF0YVVybCwgbUJpbmRpbmdDb250ZXh0cywgbU1vZGVscyk7XG5cdHJldHVybiBzZXJpYWxpemVYTUwodGVtcGxhdGVkWE1MKTtcbn07XG4iXX0=
386
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkplc3RUZW1wbGF0aW5nSGVscGVyLnRzIl0sIm5hbWVzIjpbInByb2Nlc3NGcmFnbWVudCIsIm5hbWUiLCJ0ZXN0RGF0YSIsImlucHV0WG1sIiwicGFyc2VyIiwid2luZG93IiwiRE9NUGFyc2VyIiwiaW5wdXREb2MiLCJwYXJzZUZyb21TdHJpbmciLCJzZXR0aW5ncyIsIm1vZGVscyIsImJpbmRpbmdDb250ZXh0cyIsIm1vZGVsIiwianNvbk1vZGVsIiwiSlNPTk1vZGVsIiwic2V0RGF0YSIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwiWE1MUHJlcHJvY2Vzc29yIiwicHJvY2VzcyIsImZpcnN0RWxlbWVudENoaWxkIiwicmVzdWx0RG9jIiwiZnJhZ21lbnRzIiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJsZW5ndGgiLCJmcmFnbWVudCIsImlubmVySFRNTCIsImZvcm1hdFhtbCIsImZpbHRlciIsIm5vZGUiLCJ0eXBlIiwicmVxdWlyZSIsIkxvZyIsInNldExldmVsIiwiamVzdCIsInNldFRpbWVvdXQiLCJuYW1lU3BhY2VNYXAiLCJzZWxlY3QiLCJ4cGF0aCIsInVzZU5hbWVzcGFjZXMiLCJyZWdpc3Rlck1hY3JvIiwibWFjcm9NZXRhZGF0YSIsIlBoYW50b21VdGlsIiwicmVnaXN0ZXIiLCJ1bnJlZ2lzdGVyTWFjcm8iLCJwbHVnSW4iLCJuYW1lc3BhY2UiLCJwdWJsaWNOYW1lIiwicHVibGljTmFtZXNwYWNlIiwicnVuWFBhdGhRdWVyeSIsInNlbGVjdG9yIiwieG1sZG9tIiwiZXhwZWN0IiwiZXh0ZW5kIiwidG9IYXZlQ29udHJvbCIsIm5vZGVzIiwibWVzc2FnZSIsIm91dHB1dFhtbCIsInNlcmlhbGl6ZVhNTCIsInBhc3MiLCJ0b05vdEhhdmVDb250cm9sIiwiZ2V0Q29udHJvbEF0dHJpYnV0ZSIsImNvbnRyb2xTZWxlY3RvciIsImF0dHJpYnV0ZU5hbWUiLCJ4bWxEb20iLCJzZXJpYWxpemVyIiwiWE1MU2VyaWFsaXplciIsInhtbFN0cmluZyIsInNlcmlhbGl6ZVRvU3RyaW5nIiwicmVwbGFjZSIsImZvcm1hdCIsImNvbXBpbGVDRFMiLCJzQ0RTVXJsIiwiY2RzU3RyaW5nIiwiZnMiLCJyZWFkRmlsZVN5bmMiLCJjc24iLCJjb21waWxlU291cmNlcyIsImVkbXhDb250ZW50IiwidG8iLCJlZG14Iiwic2VydmljZSIsImRpciIsInBhdGgiLCJyZXNvbHZlIiwiZWRteFVybCIsImJhc2VuYW1lIiwiZXhpc3RzU3luYyIsIm1rZGlyU3luYyIsIndyaXRlRmlsZVN5bmMiLCJnZXRGYWtlU2lkZUVmZmVjdHNTZXJ2aWNlIiwib01ldGFNb2RlbCIsIm9TZXJ2aWNlQ29udGV4dCIsInNjb3BlT2JqZWN0Iiwic2NvcGVUeXBlIiwiU2lkZUVmZmVjdHNGYWN0b3J5IiwiY3JlYXRlSW5zdGFuY2UiLCJ0aGVuIiwib1NlcnZpY2VJbnN0YW5jZSIsIm9KZXN0U2lkZUVmZmVjdHNTZXJ2aWNlIiwiZ2V0SW50ZXJmYWNlIiwiZ2V0Q29udGV4dCIsImdldE1vZGVsIiwiZ2V0TWV0YU1vZGVsIiwiZ2V0RmFrZURpYWdub3N0aWNzIiwiaXNzdWVzIiwiYWRkSXNzdWUiLCJpc3N1ZUNhdGVnb3J5IiwiaXNzdWVTZXZlcml0eSIsImRldGFpbHMiLCJwdXNoIiwiZ2V0SXNzdWVzIiwiY2hlY2tJZklzc3VlRXhpc3RzIiwiZmluZCIsImlzc3VlIiwiZ2V0Q29udmVydGVyQ29udGV4dEZvclRlc3QiLCJjb252ZXJ0ZWRUeXBlcyIsIm1hbmlmZXN0U2V0dGluZ3MiLCJlbnRpdHlTZXQiLCJlbnRpdHlTZXRzIiwiZXMiLCJkYXRhTW9kZWxQYXRoIiwiZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aEZvclByb3BlcnR5IiwiQ29udmVydGVyQ29udGV4dCIsIm1lcmdlIiwibWV0YU1vZGVsQ2FjaGUiLCJzTWV0YWRhdGFVcmwiLCJvUmVxdWVzdG9yIiwiX01ldGFkYXRhUmVxdWVzdG9yIiwiY3JlYXRlIiwiT0RhdGFNZXRhTW9kZWwiLCJ1bmRlZmluZWQiLCJmZXRjaEVudGl0eUNvbnRhaW5lciIsInByb3BlcnR5IiwidGFyZ2V0UGF0aCIsInN0YXJ0aW5nRW50aXR5U2V0IiwibmF2aWdhdGlvblByb3BlcnRpZXMiLCJ0YXJnZXRPYmplY3QiLCJ0YXJnZXRFbnRpdHlTZXQiLCJ0YXJnZXRFbnRpdHlUeXBlIiwiZW50aXR5VHlwZSIsImNvbnRleHRMb2NhdGlvbiIsImV2YWx1YXRlQmluZGluZyIsImJpbmRpbmdTdHJpbmciLCJiaW5kaW5nRWxlbWVudCIsIkJpbmRpbmdQYXJzZXIiLCJjb21wbGV4UGFyc2VyIiwiYXJncyIsImZvcm1hdHRlciIsImFwcGx5IiwiZXZhbHVhdGVCaW5kaW5nV2l0aE1vZGVsIiwibW9kZWxDb250ZW50IiwidGV4dCIsIkludmlzaWJsZVRleHQiLCJiaW5kUHJvcGVydHkiLCJzZXRNb2RlbCIsInNldEJpbmRpbmdDb250ZXh0IiwiZ2V0VGV4dCIsImdldFRlbXBsYXRpbmdSZXN1bHQiLCJ4bWxJbnB1dCIsIm1CaW5kaW5nQ29udGV4dHMiLCJtTW9kZWxzIiwidGVtcGxhdGVkWG1sIiwieG1sRG9jIiwiaGFzT3duUHJvcGVydHkiLCJPYmplY3QiLCJhc3NpZ24iLCJUZW1wbGF0ZU1vZGVsIiwia2V5cyIsImZvckVhY2giLCJzTW9kZWxOYW1lIiwiaXNUZW1wbGF0ZU1vZGVsIiwiZGF0YSIsIm9QcmVwcm9jZXNzb3JTZXR0aW5ncyIsIm1ldGFNb2RlbCIsInNLZXkiLCJnZXRPYmplY3QiLCJ0b0JlRGVmaW5lZCIsIm9Nb2RlbCIsImdldFRlbXBsYXRlZFhNTCJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FBOFFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO01BQ3NCQSxlLGFBQWdCQyxJLEVBQWNDLFE7UUFBd0Q7QUFDM0csVUFBTUMsUUFBUSxpREFBeUNGLElBQXpDLHlEQUFkO0FBQ0EsVUFBTUcsTUFBTSxHQUFHLElBQUlDLE1BQU0sQ0FBQ0MsU0FBWCxFQUFmO0FBQ0EsVUFBTUMsUUFBUSxHQUFHSCxNQUFNLENB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QUFDbkdGLFVBQUFBLHFCQUFxQixDQUFDbEssTUFBdEIsQ0FBNkJvSyxJQUE3QixJQUFxQ0csTUFBckM7QUFDQSxTQU5ELEVBN0JDLENBcUNEOztBQUNBLFlBQUlMLHFCQUFxQixDQUFDbEssTUFBdEIsQ0FBNkIsTUFBN0IsQ0FBSixFQUEwQztBQUN6Q2tLLFVBQUFBLHFCQUFxQixDQUFDakssZUFBdEIsQ0FBc0MsTUFBdEMsSUFBZ0RpSyxxQkFBcUIsQ0FBQ2xLLE1BQXRCLENBQTZCLE1BQTdCLEVBQXFDTSxvQkFBckMsQ0FBMEQsR0FBMUQsQ0FBaEQ7QUFDQTs7QUFFRCxlQUFPQyxlQUFlLENBQUNDLE9BQWhCLENBQXdCZ0osTUFBTSxDQUFDL0ksaUJBQS9CLEVBQW1EO0FBQUVsQixVQUFBQSxJQUFJLEVBQUU7QUFBUixTQUFuRCxFQUE4RTJLLHFCQUE5RSxDQUFQO0FBMUNDO0FBMkNELEtBaEQrQjtBQUFBO0FBQUE7QUFBQSxHQUF6Qjs7OztBQWtEQSxNQUFNTSxlQUFlLGFBQzNCcEIsUUFEMkIsRUFFM0JqQyxZQUYyQixFQUczQmtDLGdCQUgyQixFQUkzQkMsT0FKMkI7QUFBQSxRQUsxQjtBQUFBLDZCQUMwQkgsbUJBQW1CLENBQUNDLFFBQUQsRUFBV2pDLFlBQVgsRUFBeUJrQyxnQkFBekIsRUFBMkNDLE9BQTNDLENBRDdDLE9BRU12RyxZQUZOO0FBR0QsS0FSMkI7QUFBQTtBQUFBO0FBQUEsR0FBckIiLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBoYW50b21VdGlsIH0gZnJvbSBcInNhcC9mZS9tYWNyb3NcIjtcbmltcG9ydCB7IF9NZXRhZGF0YVJlcXVlc3RvciB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvbGliXCI7XG5pbXBvcnQgeyBPRGF0YU1ldGFNb2RlbCB9IGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjRcIjtcbmltcG9ydCB7IFhNTFByZXByb2Nlc3NvciB9IGZyb20gXCJzYXAvdWkvY29yZS91dGlsXCI7XG5pbXBvcnQgeyBMb2cgfSBmcm9tIFwic2FwL2Jhc2VcIjtcbmltcG9ydCB4cGF0aCBmcm9tIFwieHBhdGhcIjtcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgY29tcGlsZVNvdXJjZXMsIHRvIH0gZnJvbSBcIkBzYXAvY2RzLWNvbXBpbGVyXCI7XG5pbXBvcnQgeyBmb3JtYXQgfSBmcm9tIFwicHJldHRpZXJcIjtcbmltcG9ydCB7IEJpbmRpbmdQYXJzZXIgfSBmcm9tIFwic2FwL3VpL2Jhc2VcIjtcbmltcG9ydCB7IEFueUFubm90YXRpb24sIENvbnZlcnRlck91dHB1dCwgRW50aXR5U2V0LCBQcm9wZXJ0eSB9IGZyb20gXCJAc2FwLXV4L2Fubm90YXRpb24tY29udmVydGVyXCI7XG5pbXBvcnQgeyBEYXRhTW9kZWxPYmplY3RQYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHsgSlNPTk1vZGVsIH0gZnJvbSBcInNhcC91aS9tb2RlbC9qc29uXCI7XG5pbXBvcnQgeyBJbnZpc2libGVUZXh0IH0gZnJvbSBcInNhcC91aS9jb3JlXCI7XG5pbXBvcnQgeyBMaXN0UmVwb3J0TWFuaWZlc3RTZXR0aW5ncywgT2JqZWN0UGFnZU1hbmlmZXN0U2V0dGluZ3MgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgeyBJc3N1ZUNhdGVnb3J5LCBJc3N1ZVNldmVyaXR5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Jc3N1ZU1hbmFnZXJcIjtcbmltcG9ydCB7IElEaWFnbm9zdGljcyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL1RlbXBsYXRlQ29udmVydGVyXCI7XG5pbXBvcnQgeyBtZXJnZSB9IGZyb20gXCJzYXAvYmFzZS91dGlsXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgQ29udmVydGVyQ29udGV4dCBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9Db252ZXJ0ZXJDb250ZXh0XCI7XG5pbXBvcnQgU2lkZUVmZmVjdHNGYWN0b3J5IGZyb20gXCJzYXAvZmUvY29yZS9zZXJ2aWNlcy9TaWRlRWZmZWN0c1NlcnZpY2VGYWN0b3J5XCI7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlc1xuY29uc3QgZm9ybWF0WG1sID0gcmVxdWlyZShcInhtbC1mb3JtYXR0ZXJcIik7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgKiBhcyBUZW1wbGF0ZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9UZW1wbGF0ZU1vZGVsXCI7XG5cbkxvZy5zZXRMZXZlbCgxIGFzIGFueSwgXCJzYXAudWkuY29yZS51dGlsLlhNTFByZXByb2Nlc3NvclwiKTtcbmplc3Quc2V0VGltZW91dCg0MDAwMCk7XG5cbmNvbnN0IG5hbWVTcGFjZU1hcCA9IHtcblx0XCJtYWNyb3NcIjogXCJzYXAuZmUubWFjcm9zXCIsXG5cdFwibWFjcm9cIjogXCJzYXAuZmUubWFjcm9zXCIsXG5cdFwibWFjcm9kYXRhXCI6IFwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvZXh0ZW5zaW9uL3NhcC51aS5jb3JlLkN1c3RvbURhdGEvMVwiLFxuXHRcImxvZ1wiOiBcImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L2V4dGVuc2lvbi9zYXAudWkuY29yZS5DdXN0b21EYXRhLzFcIixcblx0XCJ1bml0dGVzdFwiOiBcImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L3ByZXByb2Nlc3NvcmV4dGVuc2lvbi9zYXAuZmUudW5pdHRlc3RpbmcvMVwiLFxuXHRcImNvbnRyb2xcIjogXCJzYXAuZmUuY29yZS5jb250cm9sc1wiLFxuXHRcImNvcmVcIjogXCJzYXAudWkuY29yZVwiLFxuXHRcIm1cIjogXCJzYXAubVwiLFxuXHRcImZcIjogXCJzYXAudWkubGF5b3V0LmZvcm1cIixcblx0XCJtZGNcIjogXCJzYXAudWkubWRjXCIsXG5cdFwibWRjRmllbGRcIjogXCJzYXAudWkubWRjLmZpZWxkXCIsXG5cdFwidVwiOiBcInNhcC51aS51bmlmaWVkXCIsXG5cdFwibWFjcm9NaWNyb0NoYXJ0XCI6IFwic2FwLmZlLm1hY3Jvcy5taWNyb2NoYXJ0XCIsXG5cdFwibWljcm9DaGFydFwiOiBcInNhcC5zdWl0ZS51aS5taWNyb2NoYXJ0XCJcbn07XG5jb25zdCBzZWxlY3QgPSB4cGF0aC51c2VOYW1lc3BhY2VzKG5hbWVTcGFjZU1hcCk7XG5cbmV4cG9ydCBjb25zdCByZWdpc3Rlck1hY3JvID0gZnVuY3Rpb24obWFjcm9NZXRhZGF0YTogYW55KSB7XG5cdFBoYW50b21VdGlsLnJlZ2lzdGVyKG1hY3JvTWV0YWRhdGEpO1xufTtcbmV4cG9ydCBjb25zdCB1bnJlZ2lzdGVyTWFjcm8gPSBmdW5jdGlvbihtYWNyb01ldGFkYXRhOiBhbnkpIHtcblx0WE1MUHJlcHJvY2Vzc29yLnBsdWdJbihudWxsLCBtYWNyb01ldGFkYXRhLm5hbWVzcGFjZSwgbWFjcm9NZXRhZGF0YS5uYW1lKTtcblx0aWYgKG1hY3JvTWV0YWRhdGEucHVibGljTmFtZSkge1xuXHRcdFhNTFByZXByb2Nlc3Nvci5wbHVnSW4obnVsbCwgbWFjcm9NZXRhZGF0YS5wdWJsaWNOYW1lc3BhY2UsIG1hY3JvTWV0YWRhdGEucHVibGljTmFtZSk7XG5cdH1cbn07XG5leHBvcnQgY29uc3QgcnVuWFBhdGhRdWVyeSA9IGZ1bmN0aW9uKHNlbGVjdG9yOiBzdHJpbmcsIHhtbGRvbTogTm9kZSB8IHVuZGVmaW5lZCkge1xuXHRyZXR1cm4gc2VsZWN0KHNlbGVjdG9yLCB4bWxkb20pO1xufTtcblxuZXhwZWN0LmV4dGVuZCh7XG5cdHRvSGF2ZUNvbnRyb2woeG1sZG9tLCBzZWxlY3Rvcikge1xuXHRcdGNvbnN0IG5vZGVzID0gcnVuWFBhdGhRdWVyeShgL3Jvb3Qke3NlbGVjdG9yfWAsIHhtbGRvbSk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdG1lc3NhZ2U6ICgpID0+IHtcblx0XHRcdFx0Y29uc3Qgb3V0cHV0WG1sID0gc2VyaWFsaXplWE1MKHhtbGRvbSk7XG5cdFx0XHRcdHJldHVybiBgZGlkIG5vdCBmaW5kIGNvbnRyb2xzIG1hdGNoaW5nICR7c2VsZWN0b3J9IGluIGdlbmVyYXRlZCB4bWw6XFxuICR7b3V0cHV0WG1sfWA7XG5cdFx0XHR9LFxuXHRcdFx0cGFzczogbm9kZXMgJiYgbm9kZXMubGVuZ3RoID49IDFcblx0XHR9O1xuXHR9LFxuXHR0b05vdEhhdmVDb250cm9sKHhtbGRvbSwgc2VsZWN0b3IpIHtcblx0XHRjb25zdCBub2RlcyA9IHJ1blhQYXRoUXVlcnkoYC9yb290JHtzZWxlY3Rvcn1gLCB4bWxkb20pO1xuXHRcdHJldHVybiB7XG5cdFx0XHRtZXNzYWdlOiAoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IG91dHB1dFhtbCA9IHNlcmlhbGl6ZVhNTCh4bWxkb20pO1xuXHRcdFx0XHRyZXR1cm4gYFRoZXJlIGlzIGEgY29udHJvbCBtYXRjaGluZyAke3NlbGVjdG9yfSBpbiBnZW5lcmF0ZWQgeG1sOlxcbiAke291dHB1dFhtbH1gO1xuXHRcdFx0fSxcblx0XHRcdHBhc3M6IG5vZGVzICYmIG5vZGVzLmxlbmd0aCA9PT0gMFxuXHRcdH07XG5cdH1cbn0pO1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udHJvbEF0dHJpYnV0ZSA9IGZ1bmN0aW9uKGNvbnRyb2xTZWxlY3Rvcjogc3RyaW5nLCBhdHRyaWJ1dGVOYW1lOiBzdHJpbmcsIHhtbERvbTogTm9kZSkge1xuXHRjb25zdCBzZWxlY3RvciA9IGBzdHJpbmcoL3Jvb3Qke2NvbnRyb2xTZWxlY3Rvcn0vQCR7YXR0cmlidXRlTmFtZX0pYDtcblx0cmV0dXJuIHJ1blhQYXRoUXVlcnkoc2VsZWN0b3IsIHhtbERvbSk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2VyaWFsaXplWE1MID0gZnVuY3Rpb24oeG1sRG9tOiBOb2RlKSB7XG5cdGNvbnN0IHNlcmlhbGl6ZXIgPSBuZXcgd2luZG93LlhNTFNlcmlhbGl6ZXIoKTtcblx0Y29uc3QgeG1sU3RyaW5nID0gc2VyaWFsaXplclxuXHRcdC5zZXJpYWxpemVUb1N0cmluZyh4bWxEb20pXG5cdFx0LnJlcGxhY2UoLyg/OltcXHQgXSooPzpcXHI/XFxufFxccikpKy9nLCBcIlxcblwiKVxuXHRcdC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJyk7XG5cdHJldHVybiBmb3JtYXQoeG1sU3RyaW5nLCB7IHBhcnNlcjogXCJodG1sXCIgfSk7XG59O1xuXG4vKipcbiAqIENvbXBpbGUgYSBDRFMgZmlsZSBpbnRvIGFuIEVETVggZmlsZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc0NEU1VybCBUaGUgcGF0aCB0byB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBDRFMgZGVmaW5pdGlvbi4gVGhpcyBmaWxlIE1VU1QgZGVjbGFyZSB0aGUgbmFtZXNwYWNlXG4gKiBzYXAuZmUudGVzdCBhbmQgYSBzZXJ2aWNlIEplc3RTZXJ2aWNlXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgcGF0aCBvZiB0aGUgZ2VuZXJhdGVkIEVETVhcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbXBpbGVDRFMgPSBmdW5jdGlvbihzQ0RTVXJsOiBzdHJpbmcpIHtcblx0Y29uc3QgY2RzU3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKHNDRFNVcmwsIFwidXRmLThcIik7XG5cdGNvbnN0IGNzbiA9IGNvbXBpbGVTb3VyY2VzKHsgXCJzdHJpbmcuY2RzXCI6IGNkc1N0cmluZyB9LCB7fSk7XG5cdGNvbnN0IGVkbXhDb250ZW50ID0gdG8uZWRteChjc24sIHsgc2VydmljZTogXCJzYXAuZmUudGVzdC5KZXN0U2VydmljZVwiIH0pO1xuXHRjb25zdCBkaXIgPSBwYXRoLnJlc29sdmUoc0NEU1VybCwgXCIuLlwiLCBcImdlblwiKTtcblx0Y29uc3QgZWRteFVybCA9IHBhdGgucmVzb2x2ZShkaXIsIHBhdGguYmFzZW5hbWUoc0NEU1VybCkucmVwbGFjZShcIi5jZHNcIiwgXCIueG1sXCIpKTtcblxuXHRpZiAoIWZzLmV4aXN0c1N5bmMoZGlyKSkge1xuXHRcdGZzLm1rZGlyU3luYyhkaXIpO1xuXHR9XG5cblx0ZnMud3JpdGVGaWxlU3luYyhlZG14VXJsLCBlZG14Q29udGVudCk7XG5cdHJldHVybiBlZG14VXJsO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEZha2VTaWRlRWZmZWN0c1NlcnZpY2UgPSBhc3luYyBmdW5jdGlvbihvTWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCk6IFByb21pc2U8YW55PiB7XG5cdGNvbnN0IG9TZXJ2aWNlQ29udGV4dCA9IHsgc2NvcGVPYmplY3Q6IHt9LCBzY29wZVR5cGU6IFwiXCIsIHNldHRpbmdzOiB7fSB9O1xuXHRyZXR1cm4gbmV3IFNpZGVFZmZlY3RzRmFjdG9yeSgpLmNyZWF0ZUluc3RhbmNlKG9TZXJ2aWNlQ29udGV4dCkudGhlbihmdW5jdGlvbihvU2VydmljZUluc3RhbmNlOiBhbnkpIHtcblx0XHRjb25zdCBvSmVzdFNpZGVFZmZlY3RzU2VydmljZSA9IG9TZXJ2aWNlSW5zdGFuY2UuZ2V0SW50ZXJmYWNlKCk7XG5cdFx0b0plc3RTaWRlRWZmZWN0c1NlcnZpY2UuZ2V0Q29udGV4dCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0c2NvcGVPYmplY3Q6IHtcblx0XHRcdFx0XHRnZXRNb2RlbDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0XHRnZXRNZXRhTW9kZWw6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBvTWV0YU1vZGVsO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHR9O1xuXHRcdHJldHVybiBvSmVzdFNpZGVFZmZlY3RzU2VydmljZTtcblx0fSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RmFrZURpYWdub3N0aWNzID0gZnVuY3Rpb24oKTogSURpYWdub3N0aWNzIHtcblx0Y29uc3QgaXNzdWVzOiBhbnlbXSA9IFtdO1xuXHRyZXR1cm4ge1xuXHRcdGFkZElzc3VlKGlzc3VlQ2F0ZWdvcnk6IElzc3VlQ2F0ZWdvcnksIGlzc3VlU2V2ZXJpdHk6IElzc3VlU2V2ZXJpdHksIGRldGFpbHM6IHN0cmluZyk6IHZvaWQge1xuXHRcdFx0aXNzdWVzLnB1c2goe1xuXHRcdFx0XHRpc3N1ZUNhdGVnb3J5LFxuXHRcdFx0XHRpc3N1ZVNldmVyaXR5LFxuXHRcdFx0XHRkZXRhaWxzXG5cdFx0XHR9KTtcblx0XHR9LFxuXHRcdGdldElzc3VlcygpOiBhbnlbXSB7XG5cdFx0XHRyZXR1cm4gaXNzdWVzO1xuXHRcdH0sXG5cdFx0Y2hlY2tJZklzc3VlRXhpc3RzKGlzc3VlQ2F0ZWdvcnk6IElzc3VlQ2F0ZWdvcnksIGlzc3VlU2V2ZXJpdHk6IElzc3VlU2V2ZXJpdHksIGRldGFpbHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdFx0cmV0dXJuIGlzc3Vlcy5maW5kKGlzc3VlID0+IHtcblx0XHRcdFx0aXNzdWUuaXNzdWVDYXRlZ29yeSA9PT0gaXNzdWVDYXRlZ29yeSAmJiBpc3N1ZS5pc3N1ZVNldmVyaXR5ID09PSBpc3N1ZVNldmVyaXR5ICYmIGlzc3VlLmRldGFpbHMgPT09IGRldGFpbHM7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udmVydGVyQ29udGV4dEZvclRlc3QgPSBmdW5jdGlvbihcblx0Y29udmVydGVkVHlwZXM6IENvbnZlcnRlck91dHB1dCxcblx0bWFuaWZlc3RTZXR0aW5nczogTGlzdFJlcG9ydE1hbmlmZXN0U2V0dGluZ3MgfCBPYmplY3RQYWdlTWFuaWZlc3RTZXR0aW5nc1xuKSB7XG5cdGNvbnN0IGVudGl0eVNldCA9IGNvbnZlcnRlZFR5cGVzLmVudGl0eVNldHMuZmluZChlcyA9PiBlcy5uYW1lID09PSBtYW5pZmVzdFNldHRpbmdzLmVudGl0eVNldCk7XG5cdGNvbnN0IGRhdGFNb2RlbFBhdGggPSBnZXREYXRhTW9kZWxPYmplY3RQYXRoRm9yUHJvcGVydHkoZW50aXR5U2V0IGFzIEVudGl0eVNldCwgZW50aXR5U2V0KTtcblx0cmV0dXJuIG5ldyBDb252ZXJ0ZXJDb250ZXh0KGNvbnZlcnRlZFR5cGVzLCBtYW5pZmVzdFNldHRpbmdzLCBnZXRGYWtlRGlhZ25vc3RpY3MoKSwgbWVyZ2UsIGRhdGFNb2RlbFBhdGgpO1xufTtcbmNvbnN0IG1ldGFNb2RlbENhY2hlOiBhbnkgPSB7fTtcbmV4cG9ydCBjb25zdCBnZXRNZXRhTW9kZWwgPSBhc3luYyBmdW5jdGlvbihzTWV0YWRhdGFVcmw6IHN0cmluZykge1xuXHRjb25zdCBvUmVxdWVzdG9yID0gX01ldGFkYXRhUmVxdWVzdG9yLmNyZWF0ZSh7fSwgXCI0LjBcIiwge30pO1xuXHRpZiAoIW1ldGFNb2RlbENhY2hlW3NNZXRhZGF0YVVybF0pIHtcblx0XHRjb25zdCBvTWV0YU1vZGVsID0gbmV3IE9EYXRhTWV0YU1vZGVsKG9SZXF1ZXN0b3IsIHNNZXRhZGF0YVVybCwgdW5kZWZpbmVkLCBudWxsKTtcblx0XHRhd2FpdCBvTWV0YU1vZGVsLmZldGNoRW50aXR5Q29udGFpbmVyKCk7XG5cdFx0bWV0YU1vZGVsQ2FjaGVbc01ldGFkYXRhVXJsXSA9IG9NZXRhTW9kZWw7XG5cdH1cblxuXHRyZXR1cm4gbWV0YU1vZGVsQ2FjaGVbc01ldGFkYXRhVXJsXTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXREYXRhTW9kZWxPYmplY3RQYXRoRm9yUHJvcGVydHkgPSBmdW5jdGlvbihcblx0ZW50aXR5U2V0OiBFbnRpdHlTZXQsXG5cdHByb3BlcnR5PzogUHJvcGVydHkgfCBFbnRpdHlTZXQgfCBBbnlBbm5vdGF0aW9uXG4pOiBEYXRhTW9kZWxPYmplY3RQYXRoIHtcblx0Y29uc3QgdGFyZ2V0UGF0aDogRGF0YU1vZGVsT2JqZWN0UGF0aCA9IHtcblx0XHRzdGFydGluZ0VudGl0eVNldDogZW50aXR5U2V0LFxuXHRcdG5hdmlnYXRpb25Qcm9wZXJ0aWVzOiBbXSxcblx0XHR0YXJnZXRPYmplY3Q6IHByb3BlcnR5LFxuXHRcdHRhcmdldEVudGl0eVNldDogZW50aXR5U2V0LFxuXHRcdHRhcmdldEVudGl0eVR5cGU6IGVudGl0eVNldC5lbnRpdHlUeXBlXG5cdH07XG5cdHRhcmdldFBhdGguY29udGV4dExvY2F0aW9uID0gdGFyZ2V0UGF0aDtcblx0cmV0dXJuIHRhcmdldFBhdGg7XG59O1xuXG5leHBvcnQgY29uc3QgZXZhbHVhdGVCaW5kaW5nID0gZnVuY3Rpb24oYmluZGluZ1N0cmluZzogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSkge1xuXHRjb25zdCBiaW5kaW5nRWxlbWVudCA9IEJpbmRpbmdQYXJzZXIuY29tcGxleFBhcnNlcihiaW5kaW5nU3RyaW5nKTtcblx0cmV0dXJuIGJpbmRpbmdFbGVtZW50LmZvcm1hdHRlci5hcHBseSh1bmRlZmluZWQsIGFyZ3MpO1xufTtcblxuZXhwb3J0IGNvbnN0IGV2YWx1YXRlQmluZGluZ1dpdGhNb2RlbCA9IGZ1bmN0aW9uKGJpbmRpbmdTdHJpbmc6IHN0cmluZyB8IHVuZGVmaW5lZCwgbW9kZWxDb250ZW50OiBhbnkpIHtcblx0Y29uc3QgYmluZGluZ0VsZW1lbnQgPSBCaW5kaW5nUGFyc2VyLmNvbXBsZXhQYXJzZXIoYmluZGluZ1N0cmluZyk7XG5cdGNvbnN0IGpzb25Nb2RlbCA9IG5ldyBKU09OTW9kZWwobW9kZWxDb250ZW50KTtcblx0Y29uc3QgdGV4dCA9IG5ldyBJbnZpc2libGVUZXh0KCk7XG5cdHRleHQuYmluZFByb3BlcnR5KFwidGV4dFwiLCBiaW5kaW5nRWxlbWVudCk7XG5cdHRleHQuc2V0TW9kZWwoanNvbk1vZGVsKTtcblx0dGV4dC5zZXRCaW5kaW5nQ29udGV4dChqc29uTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpKTtcblx0cmV0dXJuIHRleHQuZ2V0VGV4dCgpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFRlbXBsYXRpbmdSZXN1bHQgPSBhc3luYyBmdW5jdGlvbihcblx0eG1sSW5wdXQ6IHN0cmluZyxcblx0c01ldGFkYXRhVXJsOiBzdHJpbmcsXG5cdG1CaW5kaW5nQ29udGV4dHM6IHsgW3g6IHN0cmluZ106IGFueTsgZW50aXR5U2V0Pzogc3RyaW5nIH0sXG5cdG1Nb2RlbHM6IHsgW3g6IHN0cmluZ106IGFueSB9XG4pIHtcblx0Y29uc3QgdGVtcGxhdGVkWG1sID0gYDxyb290PiR7eG1sSW5wdXR9PC9yb290PmA7XG5cdGNvbnN0IHBhcnNlciA9IG5ldyB3aW5kb3cuRE9NUGFyc2VyKCk7XG5cdGNvbnN0IHhtbERvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcodGVtcGxhdGVkWG1sLCBcInRleHQveG1sXCIpO1xuXHQvLyBUbyBlbnN1cmUgb3VyIG1hY3JvIGNhbiB1c2UgI3NldEJpbmRpbmdDb250ZXh0IHdlIGVuc3VyZSB0aGVyZSBpcyBhIHByZSBleGlzdGluZyBKU09OTW9kZWwgZm9yIGNvbnZlcnRlckNvbnRleHRcblx0Ly8gaWYgbm90IGFscmVhZHkgcGFzc2VkIHRvIHRlaCB0ZW1wbGF0aW5nXG5cblx0Y29uc3Qgb01ldGFNb2RlbCA9IGF3YWl0IGdldE1ldGFNb2RlbChzTWV0YWRhdGFVcmwpO1xuXHRpZiAoIW1Nb2RlbHMuaGFzT3duUHJvcGVydHkoXCJjb252ZXJ0ZXJDb250ZXh0XCIpKSB7XG5cdFx0bU1vZGVscyA9IE9iamVjdC5hc3NpZ24obU1vZGVscywgeyBcImNvbnZlcnRlckNvbnRleHRcIjogbmV3IFRlbXBsYXRlTW9kZWwoe30sIG9NZXRhTW9kZWwpIH0pO1xuXHR9XG5cblx0T2JqZWN0LmtleXMobU1vZGVscykuZm9yRWFjaChmdW5jdGlvbihzTW9kZWxOYW1lKSB7XG5cdFx0aWYgKG1Nb2RlbHNbc01vZGVsTmFtZV0gJiYgbU1vZGVsc1tzTW9kZWxOYW1lXS5pc1RlbXBsYXRlTW9kZWwpIHtcblx0XHRcdG1Nb2RlbHNbc01vZGVsTmFtZV0gPSBuZXcgVGVtcGxhdGVNb2RlbChtTW9kZWxzW3NNb2RlbE5hbWVdLmRhdGEsIG9NZXRhTW9kZWwpO1xuXHRcdH1cblx0fSk7XG5cblx0Y29uc3Qgb1ByZXByb2Nlc3NvclNldHRpbmdzOiBhbnkgPSB7XG5cdFx0bW9kZWxzOiBPYmplY3QuYXNzaWduKFxuXHRcdFx0e1xuXHRcdFx0XHRtZXRhTW9kZWw6IG9NZXRhTW9kZWxcblx0XHRcdH0sXG5cdFx0XHRtTW9kZWxzXG5cdFx0KSxcblx0XHRiaW5kaW5nQ29udGV4dHM6IHt9XG5cdH07XG5cblx0Ly9JbmplY3QgbW9kZWxzIGFuZCBiaW5kaW5nQ29udGV4dHNcblx0T2JqZWN0LmtleXMobUJpbmRpbmdDb250ZXh0cykuZm9yRWFjaChmdW5jdGlvbihzS2V5KSB7XG5cdFx0LyogQXNzZXJ0IHRvIG1ha2Ugc3VyZSB0aGUgYW5ub3RhdGlvbnMgYXJlIGluIHRoZSB0ZXN0IG1ldGFkYXRhIC0+IGF2b2lkIG1pc2xlYWRpbmcgdGVzdHMgKi9cblx0XHRleHBlY3QodHlwZW9mIG9NZXRhTW9kZWwuZ2V0T2JqZWN0KG1CaW5kaW5nQ29udGV4dHNbc0tleV0pKS50b0JlRGVmaW5lZCgpO1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG1Nb2RlbHNbc0tleV0gfHwgb01ldGFNb2RlbDtcblx0XHRvUHJlcHJvY2Vzc29yU2V0dGluZ3MuYmluZGluZ0NvbnRleHRzW3NLZXldID0gb01vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KG1CaW5kaW5nQ29udGV4dHNbc0tleV0pOyAvL1ZhbHVlIGlzIHNQYXRoXG5cdFx0b1ByZXByb2Nlc3NvclNldHRpbmdzLm1vZGVsc1tzS2V5XSA9IG9Nb2RlbDtcblx0fSk7XG5cblx0Ly9UaGlzIGNvbnRleHQgZm9yIG1hY3JvIHRlc3Rpbmdcblx0aWYgKG9QcmVwcm9jZXNzb3JTZXR0aW5ncy5tb2RlbHNbXCJ0aGlzXCJdKSB7XG5cdFx0b1ByZXByb2Nlc3NvclNldHRpbmdzLmJpbmRpbmdDb250ZXh0c1tcInRoaXNcIl0gPSBvUHJlcHJvY2Vzc29yU2V0dGluZ3MubW9kZWxzW1widGhpc1wiXS5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIik7XG5cdH1cblxuXHRyZXR1cm4gWE1MUHJlcHJvY2Vzc29yLnByb2Nlc3MoeG1sRG9jLmZpcnN0RWxlbWVudENoaWxkISwgeyBuYW1lOiBcIlRlc3QgRnJhZ21lbnRcIiB9LCBvUHJlcHJvY2Vzc29yU2V0dGluZ3MpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFRlbXBsYXRlZFhNTCA9IGFzeW5jIGZ1bmN0aW9uKFxuXHR4bWxJbnB1dDogc3RyaW5nLFxuXHRzTWV0YWRhdGFVcmw6IHN0cmluZyxcblx0bUJpbmRpbmdDb250ZXh0czogeyBbeDogc3RyaW5nXTogYW55OyBlbnRpdHlTZXQ/OiBzdHJpbmcgfSxcblx0bU1vZGVsczogeyBbeDogc3RyaW5nXTogYW55IH1cbikge1xuXHRjb25zdCB0ZW1wbGF0ZWRYTUwgPSBhd2FpdCBnZXRUZW1wbGF0aW5nUmVzdWx0KHhtbElucHV0LCBzTWV0YWRhdGFVcmwsIG1CaW5kaW5nQ29udGV4dHMsIG1Nb2RlbHMpO1xuXHRyZXR1cm4gc2VyaWFsaXplWE1MKHRlbXBsYXRlZFhNTCk7XG59O1xuXG4vKipcbiAqIFByb2Nlc3MgdGhlIHJlcXVlc3RlZCBYTUwgZnJhZ21lbnQgd2l0aCB0aGUgcHJvdmlkZWQgZGF0YS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBGdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgZnJhZ21lbnQgdG8gYmUgdGVzdGVkLlxuICogQHBhcmFtIHtvYmplY3R9IHRlc3REYXRhIFRlc3QgZGF0YSBjb25zaXN0aW5nXG4gKiBAcmV0dXJucyBUZW1wYWx0ZWQgZnJhZ21lbnQgYXMgc3RyaW5nXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzRnJhZ21lbnQobmFtZTogc3RyaW5nLCB0ZXN0RGF0YTogeyBbbW9kZWw6IHN0cmluZ106IG9iamVjdCB9KTogUHJvbWlzZTxzdHJpbmc+IHtcblx0Y29uc3QgaW5wdXRYbWwgPSBgPHJvb3Q+PGNvcmU6RnJhZ21lbnQgZnJhZ21lbnROYW1lPVwiJHtuYW1lfVwiIHR5cGU9XCJYTUxcIiB4bWxuczpjb3JlPVwic2FwLnVpLmNvcmVcIiAvPjwvcm9vdD5gO1xuXHRjb25zdCBwYXJzZXIgPSBuZXcgd2luZG93LkRPTVBhcnNlcigpO1xuXHRjb25zdCBpbnB1dERvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoaW5wdXRYbWwsIFwidGV4dC94bWxcIik7XG5cblx0Ly8gYnVpbGQgbW9kZWwgYW5kIGJpbmRpbmdzIGZvciBnaXZlbiB0ZXN0IGRhdGFcblx0Y29uc3Qgc2V0dGluZ3MgPSB7XG5cdFx0bW9kZWxzOiB7fSBhcyB7IFtuYW1lOiBzdHJpbmddOiBKU09OTW9kZWw8b2JqZWN0PiB9LFxuXHRcdGJpbmRpbmdDb250ZXh0czoge30gYXMgeyBbbmFtZTogc3RyaW5nXTogb2JqZWN0IH1cblx0fTtcblx0Zm9yIChjb25zdCBtb2RlbCBpbiB0ZXN0RGF0YSkge1xuXHRcdGNvbnN0IGpzb25Nb2RlbCA9IG5ldyBKU09OTW9kZWw8b2JqZWN0PigpO1xuXHRcdGpzb25Nb2RlbC5zZXREYXRhKHRlc3REYXRhW21vZGVsXSk7XG5cdFx0c2V0dGluZ3MubW9kZWxzW21vZGVsXSA9IGpzb25Nb2RlbDtcblx0XHRzZXR0aW5ncy5iaW5kaW5nQ29udGV4dHNbbW9kZWxdID0gc2V0dGluZ3MubW9kZWxzW21vZGVsXS5jcmVhdGVCaW5kaW5nQ29udGV4dChcIi9cIik7XG5cdH1cblxuXHQvLyBleGVjdXRlIHRoZSBwcmUtcHJvY2Vzc29yXG5cdGNvbnN0IHJlc3VsdERvYyA9IGF3YWl0IFhNTFByZXByb2Nlc3Nvci5wcm9jZXNzKGlucHV0RG9jLmZpcnN0RWxlbWVudENoaWxkLCB7IG5hbWUgfSwgc2V0dGluZ3MpO1xuXG5cdC8vIGV4Y2x1ZGUgbmVzdGVkIGZyYWdtZW50cyBmcm9tIHRlc3Qgc25hcHNob3RzXG5cdGNvbnN0IGZyYWdtZW50cyA9IHJlc3VsdERvYy5nZXRFbGVtZW50c0J5VGFnTmFtZShcImNvcmU6RnJhZ21lbnRcIik7XG5cdGlmIChmcmFnbWVudHM/Lmxlbmd0aCA+IDApIHtcblx0XHRmb3IgKGNvbnN0IGZyYWdtZW50IG9mIGZyYWdtZW50cykge1xuXHRcdFx0ZnJhZ21lbnQuaW5uZXJIVE1MID0gXCJcIjtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZm9ybWF0WG1sKHJlc3VsdERvYy5pbm5lckhUTUwsIHtcblx0XHRmaWx0ZXI6IChub2RlOiBhbnkpID0+IG5vZGUudHlwZSAhPT0gXCJDb21tZW50XCJcblx0fSk7XG59XG4iXX0=
@@ -5,7 +5,7 @@ import { XMLPreprocessor } from "sap/ui/core/util";
5
5
  import { Log } from "sap/base";
6
6
  import xpath from "xpath";
7
7
  import * as fs from "fs";
8
- import { compactModel, compileSources, to } from "@sap/cds-compiler";
8
+ import { compileSources, to } from "@sap/cds-compiler";
9
9
  import { format } from "prettier";
10
10
  import { BindingParser } from "sap/ui/base";
11
11
  import { AnyAnnotation, ConverterOutput, EntitySet, Property } from "@sap-ux/annotation-converter";
@@ -19,6 +19,11 @@ import { merge } from "sap/base/util";
19
19
  import * as path from "path";
20
20
  import ConverterContext from "sap/fe/core/converters/ConverterContext";
21
21
  import SideEffectsFactory from "sap/fe/core/services/SideEffectsServiceFactory";
22
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
23
+ const formatXml = require("xml-formatter");
24
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
25
+ // @ts-ignore
26
+ import * as TemplateModel from "sap/fe/core/TemplateModel";
22
27
 
23
28
  Log.setLevel(1 as any, "sap.ui.core.util.XMLPreprocessor");
24
29
  jest.setTimeout(40000);
@@ -44,6 +49,12 @@ const select = xpath.useNamespaces(nameSpaceMap);
44
49
  export const registerMacro = function(macroMetadata: any) {
45
50
  PhantomUtil.register(macroMetadata);
46
51
  };
52
+ export const unregisterMacro = function(macroMetadata: any) {
53
+ XMLPreprocessor.plugIn(null, macroMetadata.namespace, macroMetadata.name);
54
+ if (macroMetadata.publicName) {
55
+ XMLPreprocessor.plugIn(null, macroMetadata.publicNamespace, macroMetadata.publicName);
56
+ }
57
+ };
47
58
  export const runXPathQuery = function(selector: string, xmldom: Node | undefined) {
48
59
  return select(selector, xmldom);
49
60
  };
@@ -95,8 +106,7 @@ export const serializeXML = function(xmlDom: Node) {
95
106
  export const compileCDS = function(sCDSUrl: string) {
96
107
  const cdsString = fs.readFileSync(sCDSUrl, "utf-8");
97
108
  const csn = compileSources({ "string.cds": cdsString }, {});
98
- const csnModel = compactModel(csn);
99
- const edmxContent = to.edmx(csnModel, { service: "sap.fe.test.JestService" });
109
+ const edmxContent = to.edmx(csn, { service: "sap.fe.test.JestService" });
100
110
  const dir = path.resolve(sCDSUrl, "..", "gen");
101
111
  const edmxUrl = path.resolve(dir, path.basename(sCDSUrl).replace(".cds", ".xml"));
102
112
 
@@ -209,8 +219,20 @@ export const getTemplatingResult = async function(
209
219
  const templatedXml = `<root>${xmlInput}</root>`;
210
220
  const parser = new window.DOMParser();
211
221
  const xmlDoc = parser.parseFromString(templatedXml, "text/xml");
222
+ // To ensure our macro can use #setBindingContext we ensure there is a pre existing JSONModel for converterContext
223
+ // if not already passed to teh templating
212
224
 
213
225
  const oMetaModel = await getMetaModel(sMetadataUrl);
226
+ if (!mModels.hasOwnProperty("converterContext")) {
227
+ mModels = Object.assign(mModels, { "converterContext": new TemplateModel({}, oMetaModel) });
228
+ }
229
+
230
+ Object.keys(mModels).forEach(function(sModelName) {
231
+ if (mModels[sModelName] && mModels[sModelName].isTemplateModel) {
232
+ mModels[sModelName] = new TemplateModel(mModels[sModelName].data, oMetaModel);
233
+ }
234
+ });
235
+
214
236
  const oPreprocessorSettings: any = {
215
237
  models: Object.assign(
216
238
  {
@@ -247,3 +269,43 @@ export const getTemplatedXML = async function(
247
269
  const templatedXML = await getTemplatingResult(xmlInput, sMetadataUrl, mBindingContexts, mModels);
248
270
  return serializeXML(templatedXML);
249
271
  };
272
+
273
+ /**
274
+ * Process the requested XML fragment with the provided data.
275
+ *
276
+ * @param {string} name Fully qualified name of the fragment to be tested.
277
+ * @param {object} testData Test data consisting
278
+ * @returns Tempalted fragment as string
279
+ */
280
+ export async function processFragment(name: string, testData: { [model: string]: object }): Promise<string> {
281
+ const inputXml = `<root><core:Fragment fragmentName="${name}" type="XML" xmlns:core="sap.ui.core" /></root>`;
282
+ const parser = new window.DOMParser();
283
+ const inputDoc = parser.parseFromString(inputXml, "text/xml");
284
+
285
+ // build model and bindings for given test data
286
+ const settings = {
287
+ models: {} as { [name: string]: JSONModel<object> },
288
+ bindingContexts: {} as { [name: string]: object }
289
+ };
290
+ for (const model in testData) {
291
+ const jsonModel = new JSONModel<object>();
292
+ jsonModel.setData(testData[model]);
293
+ settings.models[model] = jsonModel;
294
+ settings.bindingContexts[model] = settings.models[model].createBindingContext("/");
295
+ }
296
+
297
+ // execute the pre-processor
298
+ const resultDoc = await XMLPreprocessor.process(inputDoc.firstElementChild, { name }, settings);
299
+
300
+ // exclude nested fragments from test snapshots
301
+ const fragments = resultDoc.getElementsByTagName("core:Fragment");
302
+ if (fragments?.length > 0) {
303
+ for (const fragment of fragments) {
304
+ fragment.innerHTML = "";
305
+ }
306
+ }
307
+
308
+ return formatXml(resultDoc.innerHTML, {
309
+ filter: (node: any) => node.type !== "Comment"
310
+ });
311
+ }
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  * ! SAPUI5
3
- * (c) Copyright 2009-2021 SAP SE. All rights reserved.
3
+ * (c) Copyright 2009-2022 SAP SE. All rights reserved.
4
4
  */
5
5
  /* global QUnit */
6
6
  sap.ui.define(
@@ -70,7 +70,9 @@ sap.ui.define(
70
70
  * @param {object} [mSettings.launchParameters] The URL launch parameters
71
71
  * @param {boolean} [mSettings.async] If false (default), only one JourneyRunner is executed at a time
72
72
  * @param {Function[] | string[]} vJourneys The journeys to be executed. If a journey is represented as a string, it will be interpreted
73
- * as a module path to the file that should be loaded. Else it is expected to be a function
73
+ * as a module path to the file that should be loaded. Else it is expected to be a function.
74
+ * Alternatively, instead of being wrapped in an array, the journeys can also be given as separate parameters:
75
+ * <pre>.run(mSettings, Journey1, Journey2, ...)</pre>
74
76
  * @returns {object} A <code>Promise</code> that is resolved after all tests have been executed
75
77
  *
76
78
  * @function
@@ -86,8 +88,11 @@ sap.ui.define(
86
88
  mSettings = Utils.mergeObjects(this._mInstanceSettings, mSettings);
87
89
  }
88
90
 
89
- var aJourneys = Utils.getParametersArray(iJourneyParameterIndex, arguments),
90
- bAsync = mSettings.async,
91
+ var aJourneys = Array.prototype.slice.call(arguments, iJourneyParameterIndex); // journey-related parameter(s) as array
92
+ if (aJourneys && aJourneys.length && Array.isArray(aJourneys[0])) { // if the first journey parameter is an array...
93
+ aJourneys = aJourneys[0]; // ...then unwrap it, to use this array itself
94
+ }
95
+ var bAsync = mSettings.async,
91
96
  pSyncPromise;
92
97
 
93
98
  if (bAsync) {