@sapui5/sap.fe.test 1.132.0 → 1.133.1

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sapui5/sap.fe.test",
3
- "version": "1.132.0",
3
+ "version": "1.133.1",
4
4
  "description": "SAPUI5 Library sap.fe.test",
5
5
  "keywords": [
6
6
  "sapui5",
@@ -6,7 +6,7 @@
6
6
  SAP UI development toolkit for HTML5 (SAPUI5)
7
7
  (c) Copyright 2009-2021 SAP SE. All rights reserved
8
8
  </copyright>
9
- <version>1.132.0</version>
9
+ <version>1.133.1</version>
10
10
 
11
11
  <documentation>UI5 library: sap.fe.test</documentation>
12
12
 
@@ -2,7 +2,7 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2024 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["@sap/cds-compiler", "fs", "htmljs-parser", "path", "sap/base/Log", "sap/base/util/LoaderExtensions", "sap/base/util/merge", "sap/base/util/uid", "sap/fe/base/jsx-runtime/jsx", "sap/fe/core/AppComponent", "sap/fe/core/PageController", "sap/fe/core/TemplateModel", "sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor", "sap/fe/core/converters/ConverterContext", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/services/SideEffectsServiceFactory", "sap/fe/test/UI5MockHelper", "sap/m/Page", "sap/ui/base/BindingParser", "sap/ui/base/ManagedObject", "sap/ui/base/ManagedObjectMetadata", "sap/ui/core/Component", "sap/ui/core/InvisibleText", "sap/ui/core/XMLTemplateProcessor", "sap/ui/core/util/XMLPreprocessor", "sap/ui/core/util/serializer/Serializer", "sap/ui/fl/Utils", "sap/ui/fl/apply/_internal/flexState/FlexState", "sap/ui/fl/apply/_internal/flexState/Loader", "sap/ui/fl/apply/_internal/preprocessors/XmlPreprocessor", "sap/ui/fl/initial/_internal/Storage", "sap/ui/model/json/JSONModel", "sap/ui/model/odata/v4/ODataMetaModel", "sap/ui/model/odata/v4/lib/_MetadataRequestor", "xpath", "./JestFlexibilityHelper", "sap/fe/base/jsx-runtime/jsx"], function (compiler, fs, htmljs_parser, path, Log, LoaderExtensions, merge, uid, jsx, AppComponent, PageController, TemplateModel, BuildingBlockTemplateProcessor, ConverterContext, MetaModelConverter, SideEffectsFactory, UI5MockHelper, Page, BindingParser, ManagedObject, ManagedObjectMetadata, Component, InvisibleText, XMLTemplateProcessor, XMLPreprocessor, Serializer, Utils, FlexState, Loader, XmlPreprocessor, AppStorage, JSONModel, ODataMetaModel, _MetadataRequestor, xpath, JestFlexibilityHelper, _jsx) {
5
+ sap.ui.define(["@sap/cds-compiler", "fs", "htmljs-parser", "path", "sap/base/Log", "sap/base/util/LoaderExtensions", "sap/base/util/merge", "sap/base/util/uid", "sap/fe/base/jsx-runtime/jsx", "sap/fe/core/AppComponent", "sap/fe/core/PageController", "sap/fe/core/TemplateModel", "sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor", "sap/fe/core/converters/ConverterContext", "sap/fe/core/converters/ManifestWrapper", "sap/fe/core/converters/MetaModelConverter", "sap/fe/core/services/SideEffectsServiceFactory", "sap/fe/test/UI5MockHelper", "sap/m/Page", "sap/ui/base/BindingParser", "sap/ui/base/ManagedObject", "sap/ui/base/ManagedObjectMetadata", "sap/ui/core/Component", "sap/ui/core/InvisibleText", "sap/ui/core/XMLTemplateProcessor", "sap/ui/core/util/XMLPreprocessor", "sap/ui/core/util/serializer/Serializer", "sap/ui/fl/Utils", "sap/ui/fl/apply/_internal/flexState/FlexState", "sap/ui/fl/apply/_internal/flexState/Loader", "sap/ui/fl/apply/_internal/preprocessors/XmlPreprocessor", "sap/ui/fl/initial/_internal/Storage", "sap/ui/model/json/JSONModel", "sap/ui/model/odata/v4/ODataMetaModel", "sap/ui/model/odata/v4/lib/_MetadataRequestor", "xpath", "./JestFlexibilityHelper", "sap/fe/base/jsx-runtime/jsx"], function (compiler, fs, htmljs_parser, path, Log, LoaderExtensions, merge, uid, jsx, AppComponent, PageController, TemplateModel, BuildingBlockTemplateProcessor, ConverterContext, ManifestWrapper, MetaModelConverter, SideEffectsFactory, UI5MockHelper, Page, BindingParser, ManagedObject, ManagedObjectMetadata, Component, InvisibleText, XMLTemplateProcessor, XMLPreprocessor, Serializer, Utils, FlexState, Loader, XmlPreprocessor, AppStorage, JSONModel, ODataMetaModel, _MetadataRequestor, xpath, JestFlexibilityHelper, _jsx) {
6
6
  "use strict";
7
7
 
8
8
  var _exports = {};
@@ -399,7 +399,7 @@ sap.ui.define(["@sap/cds-compiler", "fs", "htmljs-parser", "path", "sap/base/Log
399
399
  const getConverterContextForTest = function (metaModel, manifestSettings) {
400
400
  const convertedTypes = convertTypes(metaModel);
401
401
  const dataModelPath = manifestSettings.contextPath ? getInvolvedDataModelObjects(metaModel.createBindingContext(manifestSettings.contextPath)) : getInvolvedDataModelObjects(metaModel.createBindingContext(`/${manifestSettings.entitySet}`));
402
- return new ConverterContext(convertedTypes, manifestSettings, getFakeDiagnostics(), merge, dataModelPath);
402
+ return new ConverterContext(convertedTypes, new ManifestWrapper(manifestSettings, merge), getFakeDiagnostics(), dataModelPath);
403
403
  };
404
404
  _exports.getConverterContextForTest = getConverterContextForTest;
405
405
  const metaModelCache = {};
@@ -1021,7 +1021,8 @@ sap.ui.define(["@sap/cds-compiler", "fs", "htmljs-parser", "path", "sap/base/Log
1021
1021
  target: "Default"
1022
1022
  }]
1023
1023
  }
1024
- }
1024
+ },
1025
+ "sap.fe": options?.feManifestSettings ?? {}
1025
1026
  }
1026
1027
  }
1027
1028
  });
@@ -1081,4 +1082,4 @@ sap.ui.define(["@sap/cds-compiler", "fs", "htmljs-parser", "path", "sap/base/Log
1081
1082
  _exports.keepBindingStringForTest = keepBindingStringForTest;
1082
1083
  return _exports;
1083
1084
  }, false);
1084
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJMb2ciLCJzZXRMZXZlbCIsImplc3QiLCJzZXRUaW1lb3V0IiwibmFtZVNwYWNlTWFwIiwibWFjcm8iLCJtYWNyb3MiLCJmZUJCIiwibWFjcm9GaWVsZCIsIm1hY3JvZGF0YSIsImxvZyIsImN1c3RvbURhdGEiLCJjb250cm9sIiwiY29udHJvbHMiLCJjb3JlIiwiZHQiLCJtIiwiZiIsImZsIiwiaW50ZXJuYWxNYWNybyIsIm1kYyIsImFjdGlvbnRvb2xiYXIiLCJtZGNGaWVsZCIsIm1kY1RhYmxlIiwidSIsInV4YXAiLCJtYWNyb01pY3JvQ2hhcnQiLCJtaWNyb0NoYXJ0IiwibWFjcm9UYWJsZSIsIm1kY3ZjIiwibWRjdiIsInZhbHVlSGVscCIsImNvbnRlbnRTd2l0Y2hlciIsImZpbHRlckJhciIsImZiQ29udHJvbHMiLCJkcmFmdEluZGljYXRvciIsInJldmVzZU5hbWVzcGFjZU1hcCIsIk9iamVjdCIsImtleXMiLCJyZWR1Y2UiLCJyZXZlcnNlTWFwIiwiY3VycmVudE5hbWUiLCJzZWxlY3QiLCJ4cGF0aCIsInVzZU5hbWVzcGFjZXMiLCJkZWZhdWx0RmFrZVNpZGVFZmZlY3RTZXJ2aWNlIiwiY29tcHV0ZUZpZWxkR3JvdXBJZHMiLCJfZ2V0VGVtcGxhdGVkU2VsZWN0b3IiLCJ4bWxkb20iLCJzZWxlY3RvciIsInJvb3RQYXRoIiwibm9kZU5hbWUiLCJzdGFydHNXaXRoIiwiX2J1aWxkUHJlUHJvY2Vzc29yU2V0dGluZ3MiLCJzTWV0YWRhdGFVcmwiLCJtQmluZGluZ0NvbnRleHRzIiwibU1vZGVscyIsImZha2VTaWRlRWZmZWN0U2VydmljZSIsIm9NZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJoYXNPd25Qcm9wZXJ0eSIsImFzc2lnbiIsImNvbnZlcnRlckNvbnRleHQiLCJUZW1wbGF0ZU1vZGVsIiwiZm9yRWFjaCIsInNNb2RlbE5hbWUiLCJpc1RlbXBsYXRlTW9kZWwiLCJkYXRhIiwic2V0dGluZ3MiLCJtb2RlbHMiLCJtZXRhTW9kZWwiLCJiaW5kaW5nQ29udGV4dHMiLCJhcHBDb21wb25lbnQiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJmbiIsImdldERpYWdub3N0aWNzIiwidW5kZWZpbmVkIiwiZ2V0U2hlbGxTZXJ2aWNlcyIsIm1vY2tSZXR1cm5WYWx1ZSIsInNLZXkiLCJleHBlY3QiLCJnZXRPYmplY3QiLCJ0b0JlRGVmaW5lZCIsIm9Nb2RlbCIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwiX2xvYWRSZXNvdXJjZVZpZXciLCJ2aWV3TmFtZSIsIm5hbWUiLCJyZXBsYWNlIiwidmlldyIsIkxvYWRlckV4dGVuc2lvbnMiLCJsb2FkUmVzb3VyY2UiLCJkb2N1bWVudEVsZW1lbnQiLCJydW5YUGF0aFF1ZXJ5IiwiZXh0ZW5kIiwidG9IYXZlQ29udHJvbCIsIm5vZGVzIiwibWVzc2FnZSIsIm91dHB1dFhtbCIsInNlcmlhbGl6ZVhNTCIsInBhc3MiLCJsZW5ndGgiLCJ0b05vdEhhdmVDb250cm9sIiwidG9IYXZlVGVtcGxhdGluZ0Vycm9ycyIsInhtbCIsInhtbFRleHQiLCJiYXNlNjRFbnRyaWVzIiwibWF0Y2giLCJlcnJvck1lc3NhZ2VzIiwibWFwIiwiYXRvYiIsInNsaWNlIiwiam9pbiIsIl9leHBvcnRzIiwiZm9ybWF0QnVpbGRpbmdCbG9ja1hNTCIsInhtbFN0cmluZyIsIkFycmF5IiwiaXNBcnJheSIsImZvcm1hdFhNTCIsImdldENvbnRyb2xBdHRyaWJ1dGUiLCJjb250cm9sU2VsZWN0b3IiLCJhdHRyaWJ1dGVOYW1lIiwieG1sRG9tIiwic2VyaWFsaXplciIsIndpbmRvdyIsIlhNTFNlcmlhbGl6ZXIiLCJub2RlIiwic2VyaWFsaXplVG9TdHJpbmciLCJTVEFSVCIsIkVORCIsIlVJRCIsIlVJRDIiLCJsaW5lcyIsImN1cnJlbnRMaW5lIiwibGV2ZWwiLCJhdHRyaWJ1dGVzIiwibmV3bGluZSIsInB1c2giLCJyZXBlYXQiLCJhcHBlbmRBdHRyaWJ1dGVzIiwic29ydCIsImEiLCJiIiwibG9jYWxlQ29tcGFyZSIsImluY2x1ZGVzIiwiYXR0cmlidXRlIiwidmFsdWUiLCJhcHBlbmQiLCJwYXJzZXIiLCJyZWFkIiwiY3JlYXRlUGFyc2VyIiwib25PcGVuVGFnU3RhcnQiLCJvbk9wZW5UYWdOYW1lIiwib25BdHRyTmFtZSIsInVuc2hpZnQiLCJvbkF0dHJWYWx1ZSIsIm9uT3BlblRhZ0VuZCIsInNlbGZDbG9zZWQiLCJvbkNsb3NlVGFnU3RhcnQiLCJvbkNsb3NlVGFnTmFtZSIsIm9uQ2xvc2VUYWdFbmQiLCJwYXJzZSIsInRyaW0iLCJjb21waWxlQ0RTIiwiY2RzVXJsIiwib3B0aW9ucyIsImFyZ3VtZW50cyIsImNkc1N0cmluZyIsImZzIiwicmVhZEZpbGVTeW5jIiwiZWRteENvbnRlbnQiLCJjZHMyZWRteCIsImRpciIsInBhdGgiLCJyZXNvbHZlIiwiYWxsT3B0aW9ucyIsImVudHJpZXMiLCJlZG14RmlsZU5hbWUiLCJmaWxlbmFtZSIsIl9yZWYiLCJvcHRpb25LZXkiLCJvcHRpb25WYWx1ZSIsInRvU3RyaW5nIiwiYmFzZW5hbWUiLCJlZG14RmlsZVBhdGgiLCJta2RpclN5bmMiLCJyZWN1cnNpdmUiLCJ3cml0ZUZpbGVTeW5jIiwiY2RzIiwic2VydmljZSIsInNvdXJjZXMiLCJyZXF1aXJlIiwiY3NuIiwiY29tcGlsZXIiLCJjb21waWxlU291cmNlcyIsImVkbXhPcHRpb25zIiwib2RhdGFGb3JlaWduS2V5cyIsIm9kYXRhRm9ybWF0Iiwib2RhdGFDb250YWlubWVudCIsImVkbXgiLCJ0byIsIkVycm9yIiwiZ2V0RmFrZVNpZGVFZmZlY3RzU2VydmljZSIsImNsYXNzTmFtZU9EYXRhTW9kZWwiLCJzY29wZU9iamVjdCIsImdldE1vZGVsIiwiaXNBIiwiZ2V0U2VydmljZVVybCIsImdldFNlcnZpY2UiLCJnZXRDYXBhYmlsaXRpZXMiLCJzZXJ2aWNlSW5zdGFuY2UiLCJTaWRlRWZmZWN0c0ZhY3RvcnkiLCJjcmVhdGVJbnN0YW5jZSIsInNjb3BlVHlwZSIsImdldEludGVyZmFjZSIsImdldEZha2VEaWFnbm9zdGljcyIsImlzc3VlcyIsImFkZElzc3VlIiwiaXNzdWVDYXRlZ29yeSIsImlzc3VlU2V2ZXJpdHkiLCJkZXRhaWxzIiwiZ2V0SXNzdWVzIiwiY2hlY2tJZklzc3VlRXhpc3RzIiwiZmluZCIsImlzc3VlIiwiZ2V0Q29udmVydGVyQ29udGV4dEZvclRlc3QiLCJtYW5pZmVzdFNldHRpbmdzIiwiY29udmVydGVkVHlwZXMiLCJjb252ZXJ0VHlwZXMiLCJkYXRhTW9kZWxQYXRoIiwiY29udGV4dFBhdGgiLCJnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMiLCJlbnRpdHlTZXQiLCJDb252ZXJ0ZXJDb250ZXh0IiwibWVyZ2UiLCJtZXRhTW9kZWxDYWNoZSIsIm9SZXF1ZXN0b3IiLCJfTWV0YWRhdGFSZXF1ZXN0b3IiLCJjcmVhdGUiLCJPRGF0YU1ldGFNb2RlbCIsIl9yZXF1ZXN0QW5ub3RhdGlvbkNoYW5nZXMiLCJmZXRjaEVudGl0eUNvbnRhaW5lciIsImdldERhdGFNb2RlbE9iamVjdFBhdGhGb3JQcm9wZXJ0eSIsInByb3BlcnR5IiwidGFyZ2V0UGF0aCIsInN0YXJ0aW5nRW50aXR5U2V0IiwibmF2aWdhdGlvblByb3BlcnRpZXMiLCJ0YXJnZXRPYmplY3QiLCJ0YXJnZXRFbnRpdHlTZXQiLCJ0YXJnZXRFbnRpdHlUeXBlIiwiZW50aXR5VHlwZSIsImNvbnRleHRMb2NhdGlvbiIsImV2YWx1YXRlQmluZGluZyIsImJpbmRpbmdTdHJpbmciLCJiaW5kaW5nRWxlbWVudCIsIkJpbmRpbmdQYXJzZXIiLCJjb21wbGV4UGFyc2VyIiwiX2xlbiIsImFyZ3MiLCJfa2V5IiwiZm9ybWF0dGVyIiwiYXBwbHkiLCJldmFsdWF0ZUJpbmRpbmdXaXRoTW9kZWwiLCJtb2RlbENvbnRlbnQiLCJuYW1lZE1vZGVsc0NvbnRlbnQiLCJ0ZXh0IiwiSW52aXNpYmxlVGV4dCIsImJpbmRQcm9wZXJ0eSIsImRlZmF1bHRNb2RlbCIsIkpTT05Nb2RlbCIsInNldE1vZGVsIiwic2V0QmluZGluZ0NvbnRleHQiLCJjb250ZW50IiwibW9kZWwiLCJnZXRUZXh0IiwiVEVTVFZJRVdJRCIsImFwcGx5RmxleENoYW5nZXMiLCJmbGV4Q2hhbmdlcyIsInJlc3VsdFhNTCIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJpZCIsImNoYW5nZXMiLCJjcmVhdGVGbGV4aWJpbGl0eUNoYW5nZXNPYmplY3QiLCJhcHBJZCIsIm9NYW5pZmVzdCIsInR5cGUiLCJjcm9zc05hdmlnYXRpb24iLCJvdXRib3VuZHMiLCJvQXBwQ29tcG9uZW50IiwiZ2V0Q29tcG9uZW50RGF0YSIsImdldE1hbmlmZXN0T2JqZWN0IiwiZ2V0RW50cnkiLCJnZXRMb2NhbElkIiwic0lkIiwic3B5T24iLCJBcHBTdG9yYWdlIiwiUHJvbWlzZSIsIkxvYWRlciIsIkNvbXBvbmVudCIsIlV0aWxzIiwiRmxleFN0YXRlIiwiaW5pdGlhbGl6ZSIsImNvbXBvbmVudElkIiwiWG1sUHJlcHJvY2Vzc29yIiwicHJvY2VzcyIsImNoYW5nZXNBcHBsaWVkIiwiZ2V0Q2hhbmdlc0Zyb21YTUwiLCJ0b0JlIiwidmFyaWFudERlcGVuZGVudENvbnRyb2xDaGFuZ2VzIiwiZmxhdE1hcCIsImUiLCJmaWx0ZXIiLCJhdHRyIiwiZ2V0VGVtcGxhdGluZ1Jlc3VsdCIsInhtbElucHV0IiwiY3JlYXRlTW9ja1Jlc291cmNlTW9kZWwiLCJ0ZW1wbGF0ZWRYbWwiLCJET01QYXJzZXIiLCJ4bWxEb2MiLCJwYXJzZUZyb21TdHJpbmciLCJvUHJlcHJvY2Vzc29yU2V0dGluZ3MiLCJYTUxQcmVwcm9jZXNzb3IiLCJmaXJzdEVsZW1lbnRDaGlsZCIsImdldFRlbXBsYXRlZFhNTCIsImpzeCIsImRlZmluZVhNTE5hbWVzcGFjZU1hcCIsInRlbXBsYXRlZFhNTCIsInNlcmlhbGllZFhNTCIsIm5vdCIsInByb2Nlc3NWaWV3Iiwib1ZpZXdEb2N1bWVudCIsIm9QcmVwcm9jZXNzZWRWaWV3IiwiYXNFbGVtZW50IiwiYXNTdHJpbmciLCJvdXRlckhUTUwiLCJwcm9jZXNzRnJhZ21lbnQiLCJ0ZXN0RGF0YSIsImlucHV0WG1sIiwiaW5wdXREb2MiLCJqc29uTW9kZWwiLCJzZXREYXRhIiwicmVzdWx0RG9jIiwiZnJhZ21lbnRzIiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJmcmFnbWVudCIsImlubmVySFRNTCIsInhtbFJlc3VsdCIsImNoaWxkcmVuIiwic2VyaWFsaXplQ29udHJvbCIsImNvbnRyb2xUb1NlcmlhbGl6ZSIsInNob3dDdXN0b21TdHlsZUNsYXNzZXMiLCJ0YWJDb3VudCIsIkNPTlRST0xJRCIsImdldFRhYiIsInRvQWRkIiwidGFiIiwiaSIsInNlcmlhbGl6ZURlbGVnYXRlIiwic3RhcnQiLCJzQWdncmVnYXRpb25OYW1lIiwiY29udHJvbERldGFpbCIsImdldFBhcmVudCIsImluZGV4SW5QYXJlbnQiLCJnZXRBZ2dyZWdhdGlvbiIsImluZGV4T2YiLCJnZXRNZXRhZGF0YSIsImdldE5hbWUiLCJlbmQiLCJtaWRkbGUiLCJnZXRJZCIsIk1hbmFnZWRPYmplY3RNZXRhZGF0YSIsImlzR2VuZXJhdGVkSWQiLCJvQ29udHJvbEtleSIsIm1Qcm9wZXJ0aWVzIiwicHJvcGVydHlWYWx1ZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJtQmluZGluZ0luZm9zIiwiYmluZGluZ0RldGFpbCIsIm9PdXRwdXRGb3JtYXQiLCJiaW5kaW5nIiwibUFzc29jaWF0aW9ucyIsImFzc29jaWF0aW9uVmFsdWUiLCJhc3NvY2lhdGlvblZhbHVlRWxlbWVudCIsImFDdXN0b21TdHlsZUNsYXNzZXMiLCJtRXZlbnRSZWdpc3RyeSIsInN0YXJ0QWdncmVnYXRpb24iLCJzTmFtZSIsIm91dCIsImVuZEFnZ3JlZ2F0aW9uIiwiY29udHJvbFRvUmVuZGVyIiwiU2VyaWFsaXplciIsInNlcmlhbGl6ZSIsInNlcmlhbGl6ZUNvbnRyb2xBc1hNTCIsImRlZmluZWROYW1lc3BhY2VzIiwiZ2V0TmFtZXNwYWNlQWxpYXMiLCJjbGFzc05hbWUiLCJuYW1lc1NwbGl0Iiwic3BsaXQiLCJuYW1lc3BhY2UiLCJuYW1lc3BhY2VBbGlhcyIsIm5hbWVGdWxsIiwiaGFzQWdncmVnYXRpb24iLCJtQWdncmVnYXRpb25zS2V5IiwibUFnZ3JlZ2F0aW9ucyIsImNvbmNhdCIsInVuaXF1ZUtleXMiLCJTZXQiLCJmcm9tIiwidGVtcGxhdGUiLCJmRnVuY3Rpb24iLCJvdXRYTUwiLCJjcmVhdGVBd2FpdGVyIiwiZm5SZXNvbHZlIiwibXlQcm9taXNlIiwicHJvbWlzZSIsInJlbmRlckJ1aWxkaW5nQmxvY2tXaXRoTW9kZWxzIiwiYnVpbGRpbmdCbG9jayIsIk1hbmFnZWRPYmplY3QiLCJydW5XaXRoUHJlcHJvY2Vzc29ycyIsImdldENvbnRlbnQiLCJjb250cm9sU2V0dGluZ3MiLCJyZWdpc3Rlck1vY2tGcmFnbWVudHMiLCJfbGVuMiIsIl9rZXkyIiwib3JpZ2luYWxMb2FkVGVtcGxhdGUiLCJYTUxUZW1wbGF0ZVByb2Nlc3NvciIsImxvYWRUZW1wbGF0ZVByb21pc2UiLCJsb2FkVGVtcGxhdGVTdHViIiwibW9ja0ltcGxlbWVudGF0aW9uIiwidGVtcGxhdGVOYW1lIiwiZXh0ZW5zaW9uIiwicGFyc2VYTUxTdHJpbmciLCJpbml0aWFsaXplQXBwQ29tcG9uZW50Iiwidmlld0xldmVsIiwiY2RzRmlsZSIsIl9fZGlybmFtZSIsImd1aWQiLCJ1aWQiLCJjZHNDb250ZW50Iiwic2FwIiwicmVnaXN0ZXJGYWtlRnJhZ21lbnQiLCJEZWZhdWx0UGFnZUNvbnRlbnQiLCJfUGFnZUNvbnRyb2xsZXIiLCJfaW5oZXJpdHNMb29zZSIsIl9wcm90byIsInByb3RvdHlwZSIsInJlbmRlciIsIl9qc3giLCJQYWdlIiwiUGFnZUNvbnRyb2xsZXIiLCJ1aSIsImRlZmluZSIsIl9BcHBDb21wb25lbnQiLCJBcHBDb21wb25lbnQiLCJtZXRhZGF0YSIsIm1hbmlmZXN0IiwiZGF0YVNvdXJjZXMiLCJtYWluU2VydmljZSIsInVyaSIsIm9kYXRhVmVyc2lvbiIsImRhdGFTb3VyY2UiLCJyb3V0aW5nIiwidGFyZ2V0cyIsIkRlZmF1bHQiLCJtYWluQ29udGV4dFBhdGgiLCJ2aWV3VHlwZSIsInZpZXdDb250ZW50IiwicGFnZUNvbnRlbnQiLCJyb3V0ZXMiLCJwYXR0ZXJuIiwidGFyZ2V0IiwibW9ja0FwcENvbXBvbmVudCIsImluaXRpYWxpemVkIiwidiIsImdldFJvdXRlciIsImdldFRhcmdldCIsImxvYWQiLCJ0ZW1wbGF0ZUNvbXBvbmVudCIsIm9iamVjdCIsImZpbmRFbGVtZW50IiwiY29sbGVjdGlvbiIsImVsZW1lbnQiLCJpdGVtIiwid2FpdEZvckV2ZW50IiwiZXZlbnROYW1lIiwiYXR0YWNoRXZlbnRPbmNlIiwiZXZlbnQiLCJrZWVwQmluZGluZ1N0cmluZ0ZvclRlc3QiLCJlbmFibGVkIiwiX2tlZXBCaW5kaW5nU3RyaW5ncyJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiSmVzdFRlbXBsYXRpbmdIZWxwZXIudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQW55QW5ub3RhdGlvbiwgQ29udmVydGVkTWV0YWRhdGEsIEVudGl0eVNldCwgUHJvcGVydHkgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCBjb21waWxlciBmcm9tIFwiQHNhcC9jZHMtY29tcGlsZXJcIjtcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHR5cGUgeyBSYW5nZSwgUmFuZ2VzIH0gZnJvbSBcImh0bWxqcy1wYXJzZXJcIjtcbmltcG9ydCB7IGNyZWF0ZVBhcnNlciB9IGZyb20gXCJodG1sanMtcGFyc2VyXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBMb2FkZXJFeHRlbnNpb25zIGZyb20gXCJzYXAvYmFzZS91dGlsL0xvYWRlckV4dGVuc2lvbnNcIjtcbmltcG9ydCBtZXJnZSBmcm9tIFwic2FwL2Jhc2UvdXRpbC9tZXJnZVwiO1xuaW1wb3J0IHVpZCBmcm9tIFwic2FwL2Jhc2UvdXRpbC91aWRcIjtcbmltcG9ydCBqc3ggZnJvbSBcInNhcC9mZS9iYXNlL2pzeC1ydW50aW1lL2pzeFwiO1xuaW1wb3J0IEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSBUZW1wbGF0ZUNvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvVGVtcGxhdGVDb21wb25lbnRcIjtcbmltcG9ydCBUZW1wbGF0ZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9UZW1wbGF0ZU1vZGVsXCI7XG5pbXBvcnQgeyBwYXJzZVhNTFN0cmluZyB9IGZyb20gXCJzYXAvZmUvY29yZS9idWlsZGluZ0Jsb2Nrcy90ZW1wbGF0aW5nL0J1aWxkaW5nQmxvY2tUZW1wbGF0ZVByb2Nlc3NvclwiO1xuaW1wb3J0IENvbnZlcnRlckNvbnRleHQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvQ29udmVydGVyQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBMaXN0UmVwb3J0TWFuaWZlc3RTZXR0aW5ncywgT2JqZWN0UGFnZU1hbmlmZXN0U2V0dGluZ3MgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgeyBjb252ZXJ0VHlwZXMsIGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0cyB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01ldGFNb2RlbENvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUgeyBJRGlhZ25vc3RpY3MsIFBhZ2VDb250ZXh0UGF0aFRhcmdldCB9IGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL1RlbXBsYXRlQ29udmVydGVyXCI7XG5pbXBvcnQgdHlwZSB7IElzc3VlQ2F0ZWdvcnksIElzc3VlU2V2ZXJpdHkgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9oZWxwZXJzL0lzc3VlTWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBTaWRlRWZmZWN0c1NlcnZpY2UgfSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IFNpZGVFZmZlY3RzRmFjdG9yeSBmcm9tIFwic2FwL2ZlL2NvcmUvc2VydmljZXMvU2lkZUVmZmVjdHNTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IHR5cGUgeyBEYXRhTW9kZWxPYmplY3RQYXRoIH0gZnJvbSBcInNhcC9mZS9jb3JlL3RlbXBsYXRpbmcvRGF0YU1vZGVsUGF0aEhlbHBlclwiO1xuaW1wb3J0IHsgY3JlYXRlTW9ja1Jlc291cmNlTW9kZWwgfSBmcm9tIFwic2FwL2ZlL3Rlc3QvVUk1TW9ja0hlbHBlclwiO1xuaW1wb3J0IFBhZ2UgZnJvbSBcInNhcC9tL1BhZ2VcIjtcbmltcG9ydCBCaW5kaW5nUGFyc2VyIGZyb20gXCJzYXAvdWkvYmFzZS9CaW5kaW5nUGFyc2VyXCI7XG5pbXBvcnQgdHlwZSBFdmVudFByb3ZpZGVyIGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFByb3ZpZGVyXCI7XG5pbXBvcnQgdHlwZSB7IEJhc2VBZ2dyZWdhdGlvbkJpbmRpbmdJbmZvIH0gZnJvbSBcInNhcC91aS9iYXNlL01hbmFnZWRPYmplY3RcIjtcbmltcG9ydCBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgTWFuYWdlZE9iamVjdE1ldGFkYXRhIGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0TWV0YWRhdGFcIjtcbmltcG9ydCBDb21wb25lbnQgZnJvbSBcInNhcC91aS9jb3JlL0NvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgVUk1RWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IEludmlzaWJsZVRleHQgZnJvbSBcInNhcC91aS9jb3JlL0ludmlzaWJsZVRleHRcIjtcbmltcG9ydCBYTUxUZW1wbGF0ZVByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvWE1MVGVtcGxhdGVQcm9jZXNzb3JcIjtcbmltcG9ydCBYTUxQcmVwcm9jZXNzb3IgZnJvbSBcInNhcC91aS9jb3JlL3V0aWwvWE1MUHJlcHJvY2Vzc29yXCI7XG5pbXBvcnQgU2VyaWFsaXplciBmcm9tIFwic2FwL3VpL2NvcmUvdXRpbC9zZXJpYWxpemVyL1NlcmlhbGl6ZXJcIjtcbmltcG9ydCBVdGlscyBmcm9tIFwic2FwL3VpL2ZsL1V0aWxzXCI7XG5pbXBvcnQgRmxleFN0YXRlIGZyb20gXCJzYXAvdWkvZmwvYXBwbHkvX2ludGVybmFsL2ZsZXhTdGF0ZS9GbGV4U3RhdGVcIjtcbmltcG9ydCBMb2FkZXIgZnJvbSBcInNhcC91aS9mbC9hcHBseS9faW50ZXJuYWwvZmxleFN0YXRlL0xvYWRlclwiO1xuaW1wb3J0IFhtbFByZXByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2ZsL2FwcGx5L19pbnRlcm5hbC9wcmVwcm9jZXNzb3JzL1htbFByZXByb2Nlc3NvclwiO1xuaW1wb3J0IEFwcFN0b3JhZ2UgZnJvbSBcInNhcC91aS9mbC9pbml0aWFsL19pbnRlcm5hbC9TdG9yYWdlXCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvbWRjL0NvbnRyb2xcIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSBNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9NZXRhTW9kZWxcIjtcbmltcG9ydCB0eXBlIE1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvTW9kZWxcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuaW1wb3J0IE9EYXRhTWV0YU1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvb2RhdGEvdjQvT0RhdGFNZXRhTW9kZWxcIjtcbmltcG9ydCBfTWV0YWRhdGFSZXF1ZXN0b3IgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9saWIvX01ldGFkYXRhUmVxdWVzdG9yXCI7XG5pbXBvcnQgeHBhdGggZnJvbSBcInhwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IE1hbmFnZWRPYmplY3RFeCB9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi8uLi90eXBlcy9leHRlbnNpb25fdHlwZXNcIjtcbmltcG9ydCB7IGNyZWF0ZUZsZXhpYmlsaXR5Q2hhbmdlc09iamVjdCB9IGZyb20gXCIuL0plc3RGbGV4aWJpbGl0eUhlbHBlclwiO1xuXG50eXBlIFByZVByb2Nlc3NvclNldHRpbmdzVHlwZSA9IHtcblx0bW9kZWxzOiB7XG5cdFx0W25hbWU6IHN0cmluZ106IEpTT05Nb2RlbCB8IE9EYXRhTWV0YU1vZGVsO1xuXHR9O1xuXHRiaW5kaW5nQ29udGV4dHM6IHtcblx0XHRbbmFtZTogc3RyaW5nXTogQ29udGV4dCB8IHVuZGVmaW5lZDtcblx0fTtcbn07XG50eXBlIE1vY2tGcmFnbWVudCA9IHtcblx0bmFtZTogc3RyaW5nO1xuXHRjb250ZW50OiBzdHJpbmc7XG59O1xuXG50eXBlIEplc3RUZW1wbGF0ZWRWaWV3ID0ge1xuXHRhc0VsZW1lbnQ6IEVsZW1lbnQgfCB1bmRlZmluZWQ7XG5cdGFzU3RyaW5nOiBzdHJpbmc7XG59O1xuXG5Mb2cuc2V0TGV2ZWwoMSBhcyBhbnksIFwic2FwLnVpLmNvcmUudXRpbC5YTUxQcmVwcm9jZXNzb3JcIik7XG5qZXN0LnNldFRpbWVvdXQoNDAwMDApO1xuXG5jb25zdCBuYW1lU3BhY2VNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG5cdG1hY3JvOiBcInNhcC5mZS5tYWNyb3NcIixcblx0bWFjcm9zOiBcInNhcC5mZS5tYWNyb3NcIixcblx0ZmVCQjogXCJzYXAuZmUuY29yZS5idWlsZGluZ0Jsb2Nrcy50ZW1wbGF0aW5nXCIsXG5cdG1hY3JvRmllbGQ6IFwic2FwLmZlLm1hY3Jvcy5maWVsZFwiLFxuXHRtYWNyb2RhdGE6IFwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvZXh0ZW5zaW9uL3NhcC51aS5jb3JlLkN1c3RvbURhdGEvMVwiLFxuXHRsb2c6IFwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvZXh0ZW5zaW9uL3NhcC51aS5jb3JlLkN1c3RvbURhdGEvMVwiLFxuXHRjdXN0b21EYXRhOiBcImh0dHA6Ly9zY2hlbWFzLnNhcC5jb20vc2FwdWk1L2V4dGVuc2lvbi9zYXAudWkuY29yZS5DdXN0b21EYXRhLzFcIixcblx0Y29udHJvbDogXCJzYXAuZmUuY29yZS5jb250cm9sc1wiLFxuXHRjb250cm9sczogXCJzYXAuZmUubWFjcm9zLmNvbnRyb2xzXCIsXG5cdGNvcmU6IFwic2FwLnVpLmNvcmVcIixcblx0ZHQ6IFwic2FwLnVpLmR0XCIsXG5cdG06IFwic2FwLm1cIixcblx0ZjogXCJzYXAudWkubGF5b3V0LmZvcm1cIixcblx0Zmw6IFwic2FwLnVpLmZsXCIsXG5cdGludGVybmFsTWFjcm86IFwic2FwLmZlLm1hY3Jvcy5pbnRlcm5hbFwiLFxuXHRtZGM6IFwic2FwLnVpLm1kY1wiLFxuXHRhY3Rpb250b29sYmFyOiBcInNhcC51aS5tZGMuYWN0aW9udG9vbGJhclwiLFxuXHRtZGNGaWVsZDogXCJzYXAudWkubWRjLmZpZWxkXCIsXG5cdG1kY1RhYmxlOiBcInNhcC51aS5tZGMudGFibGVcIixcblx0dTogXCJzYXAudWkudW5pZmllZFwiLFxuXHR1eGFwOiBcInNhcC51eGFwXCIsXG5cdG1hY3JvTWljcm9DaGFydDogXCJzYXAuZmUubWFjcm9zLm1pY3JvY2hhcnRcIixcblx0bWljcm9DaGFydDogXCJzYXAuc3VpdGUudWkubWljcm9jaGFydFwiLFxuXHRtYWNyb1RhYmxlOiBcInNhcC5mZS5tYWNyb3MudGFibGVcIixcblx0bWRjdmM6IFwic2FwLnVpLm1kYy52YWx1ZWhlbHAuY29udGVudFwiLFxuXHRtZGN2OiBcInNhcC51aS5tZGMudmFsdWVoZWxwXCIsXG5cdHZhbHVlSGVscDogXCJzYXAuZmUubWFjcm9zLnZhbHVlSGVscFwiLFxuXHRjb250ZW50U3dpdGNoZXI6IFwic2FwLmZlLm1hY3Jvcy5jb250ZW50U3dpdGNoZXJcIixcblx0ZmlsdGVyQmFyOiBcInNhcC5mZS5tYWNyb3MuZmlsdGVyQmFyXCIsXG5cdGZiQ29udHJvbHM6IFwic2FwLmZlLm1hY3Jvcy5jb250cm9scy5maWx0ZXJiYXJcIixcblx0ZHJhZnRJbmRpY2F0b3I6IFwic2FwLmZlLm1hY3Jvcy5kcmFmdEluZGljYXRvclwiXG59O1xuY29uc3QgcmV2ZXNlTmFtZXNwYWNlTWFwID0gT2JqZWN0LmtleXMobmFtZVNwYWNlTWFwKS5yZWR1Y2UoKHJldmVyc2VNYXA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIGN1cnJlbnROYW1lKSA9PiB7XG5cdHJldmVyc2VNYXBbbmFtZVNwYWNlTWFwW2N1cnJlbnROYW1lXV0gPSBjdXJyZW50TmFtZTtcblx0cmV0dXJuIHJldmVyc2VNYXA7XG59LCB7fSk7XG5jb25zdCBzZWxlY3QgPSB4cGF0aC51c2VOYW1lc3BhY2VzKG5hbWVTcGFjZU1hcCk7XG5cbmNvbnN0IGRlZmF1bHRGYWtlU2lkZUVmZmVjdFNlcnZpY2UgPSB7IGNvbXB1dGVGaWVsZEdyb3VwSWRzOiAoKSA9PiBbXSB9O1xuXG5mdW5jdGlvbiBfZ2V0VGVtcGxhdGVkU2VsZWN0b3IoeG1sZG9tOiBOb2RlLCBzZWxlY3Rvcjogc3RyaW5nKTogc3RyaW5nIHtcblx0LyoqXG5cdCAqIGlmIGEgcm9vdCBlbGVtZW50IGhhcyBiZWVuIGFkZGVkIGR1cmluZyB0aGUgdGVtcGxhdGluZyBieSBvdXIgSmVzdCBUZW1wbGF0aW5nIG1ldGhvZHNcblx0ICogdGhlIHJvb3QgZWxlbWVudCBpcyBhZGRlZCB0byB0aGUgc2VsZWN0b3IgcGF0aC5cblx0ICovXG5cdGNvbnN0IHJvb3RQYXRoID0gXCIvcm9vdFwiO1xuXHRyZXR1cm4gYCR7eG1sZG9tLm5vZGVOYW1lID09PSBcInJvb3RcIiAmJiAhc2VsZWN0b3Iuc3RhcnRzV2l0aChyb290UGF0aCkgPyByb290UGF0aCA6IFwiXCJ9JHtzZWxlY3Rvcn1gO1xufVxuXG5hc3luYyBmdW5jdGlvbiBfYnVpbGRQcmVQcm9jZXNzb3JTZXR0aW5ncyhcblx0c01ldGFkYXRhVXJsOiBzdHJpbmcgfCB1bmRlZmluZWQsXG5cdG1CaW5kaW5nQ29udGV4dHM6IHsgW3g6IHN0cmluZ106IHN0cmluZyB9LFxuXHRtTW9kZWxzOiB7IFt4OiBzdHJpbmddOiBhbnkgfSxcblx0ZmFrZVNpZGVFZmZlY3RTZXJ2aWNlPzogdW5rbm93blxuKTogUHJvbWlzZTxQcmVQcm9jZXNzb3JTZXR0aW5nc1R5cGU+IHtcblx0bGV0IG9NZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsIHwgdW5kZWZpbmVkO1xuXHRpZiAoc01ldGFkYXRhVXJsKSB7XG5cdFx0b01ldGFNb2RlbCA9IGF3YWl0IGdldE1ldGFNb2RlbChzTWV0YWRhdGFVcmwpO1xuXHRcdC8vIFRvIGVuc3VyZSBvdXIgbWFjcm8gY2FuIHVzZSAjc2V0QmluZGluZ0NvbnRleHQgd2UgZW5zdXJlIHRoZXJlIGlzIGEgcHJlIGV4aXN0aW5nIEpTT05Nb2RlbCBmb3IgY29udmVydGVyQ29udGV4dFxuXHRcdC8vIGlmIG5vdCBhbHJlYWR5IHBhc3NlZCB0byB0ZWggdGVtcGxhdGluZ1xuXHRcdGlmICghbU1vZGVscy5oYXNPd25Qcm9wZXJ0eShcImNvbnZlcnRlckNvbnRleHRcIikpIHtcblx0XHRcdG1Nb2RlbHMgPSBPYmplY3QuYXNzaWduKG1Nb2RlbHMsIHsgY29udmVydGVyQ29udGV4dDogbmV3IFRlbXBsYXRlTW9kZWwoe30sIG9NZXRhTW9kZWwhKSB9KTtcblx0XHR9XG5cblx0XHRPYmplY3Qua2V5cyhtTW9kZWxzKS5mb3JFYWNoKGZ1bmN0aW9uIChzTW9kZWxOYW1lKSB7XG5cdFx0XHRpZiAobU1vZGVsc1tzTW9kZWxOYW1lXSAmJiBtTW9kZWxzW3NNb2RlbE5hbWVdLmlzVGVtcGxhdGVNb2RlbCkge1xuXHRcdFx0XHRtTW9kZWxzW3NNb2RlbE5hbWVdID0gbmV3IFRlbXBsYXRlTW9kZWwobU1vZGVsc1tzTW9kZWxOYW1lXS5kYXRhLCBvTWV0YU1vZGVsISk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRjb25zdCBzZXR0aW5nczogYW55ID0ge1xuXHRcdG1vZGVsczogT2JqZWN0LmFzc2lnbihcblx0XHRcdHtcblx0XHRcdFx0bWV0YU1vZGVsOiBvTWV0YU1vZGVsXG5cdFx0XHR9LFxuXHRcdFx0bU1vZGVsc1xuXHRcdCksXG5cdFx0YmluZGluZ0NvbnRleHRzOiB7fSxcblx0XHRhcHBDb21wb25lbnQ6IHsgZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlOiBqZXN0LmZuKCksIGdldERpYWdub3N0aWNzOiAoKSA9PiB1bmRlZmluZWQsIGdldFNoZWxsU2VydmljZXM6IGplc3QuZm4oKSB9XG5cdH07XG5cblx0c2V0dGluZ3MuYXBwQ29tcG9uZW50LmdldFNpZGVFZmZlY3RzU2VydmljZS5tb2NrUmV0dXJuVmFsdWUoZmFrZVNpZGVFZmZlY3RTZXJ2aWNlID8/IGRlZmF1bHRGYWtlU2lkZUVmZmVjdFNlcnZpY2UpO1xuXHQvL0luamVjdCBtb2RlbHMgYW5kIGJpbmRpbmdDb250ZXh0c1xuXHRPYmplY3Qua2V5cyhtQmluZGluZ0NvbnRleHRzKS5mb3JFYWNoKGZ1bmN0aW9uIChzS2V5KSB7XG5cdFx0LyogQXNzZXJ0IHRvIG1ha2Ugc3VyZSB0aGUgYW5ub3RhdGlvbnMgYXJlIGluIHRoZSB0ZXN0IG1ldGFkYXRhIC0+IGF2b2lkIG1pc2xlYWRpbmcgdGVzdHMgKi9cblx0XHRleHBlY3QodHlwZW9mIG9NZXRhTW9kZWw/LmdldE9iamVjdChtQmluZGluZ0NvbnRleHRzW3NLZXldKSkudG9CZURlZmluZWQoKTtcblx0XHRjb25zdCBvTW9kZWwgPSBtTW9kZWxzW3NLZXldIHx8IG9NZXRhTW9kZWw7XG5cdFx0c2V0dGluZ3MuYmluZGluZ0NvbnRleHRzW3NLZXldID0gb01vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KG1CaW5kaW5nQ29udGV4dHNbc0tleV0pOyAvL1ZhbHVlIGlzIHNQYXRoXG5cdFx0c2V0dGluZ3MubW9kZWxzW3NLZXldID0gb01vZGVsO1xuXHR9KTtcblx0cmV0dXJuIHNldHRpbmdzO1xufVxuXG5mdW5jdGlvbiBfbG9hZFJlc291cmNlVmlldyh2aWV3TmFtZTogc3RyaW5nKTogRWxlbWVudCB7XG5cdGNvbnN0IG5hbWUgPSB2aWV3TmFtZS5yZXBsYWNlKC9cXC4vZywgXCIvXCIpICsgXCIudmlldy54bWxcIjtcblx0Y29uc3QgdmlldyA9IExvYWRlckV4dGVuc2lvbnMubG9hZFJlc291cmNlKG5hbWUpO1xuXHRyZXR1cm4gdmlldy5kb2N1bWVudEVsZW1lbnQ7XG59XG5cbmV4cG9ydCBjb25zdCBydW5YUGF0aFF1ZXJ5ID0gZnVuY3Rpb24gKHNlbGVjdG9yOiBzdHJpbmcsIHhtbGRvbTogTm9kZSB8IHVuZGVmaW5lZCkge1xuXHRyZXR1cm4gc2VsZWN0KHNlbGVjdG9yLCB4bWxkb20pO1xufTtcblxuZXhwZWN0LmV4dGVuZCh7XG5cdHRvSGF2ZUNvbnRyb2woeG1sZG9tLCBzZWxlY3Rvcikge1xuXHRcdGNvbnN0IG5vZGVzID0gcnVuWFBhdGhRdWVyeShfZ2V0VGVtcGxhdGVkU2VsZWN0b3IoeG1sZG9tLCBzZWxlY3RvciksIHhtbGRvbSk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdG1lc3NhZ2U6ICgpID0+IHtcblx0XHRcdFx0Y29uc3Qgb3V0cHV0WG1sID0gc2VyaWFsaXplWE1MKHhtbGRvbSk7XG5cdFx0XHRcdHJldHVybiBgZGlkIG5vdCBmaW5kIGNvbnRyb2xzIG1hdGNoaW5nICR7c2VsZWN0b3J9IGluIGdlbmVyYXRlZCB4bWw6XFxuICR7b3V0cHV0WG1sfWA7XG5cdFx0XHR9LFxuXHRcdFx0cGFzczogbm9kZXMgJiYgbm9kZXMubGVuZ3RoID49IDFcblx0XHR9O1xuXHR9LFxuXHR0b05vdEhhdmVDb250cm9sKHhtbGRvbSwgc2VsZWN0b3IpIHtcblx0XHRjb25zdCBub2RlcyA9IHJ1blhQYXRoUXVlcnkoX2dldFRlbXBsYXRlZFNlbGVjdG9yKHhtbGRvbSwgc2VsZWN0b3IpLCB4bWxkb20pO1xuXHRcdHJldHVybiB7XG5cdFx0XHRtZXNzYWdlOiAoKSA9PiB7XG5cdFx0XHRcdGNvbnN0IG91dHB1dFhtbCA9IHNlcmlhbGl6ZVhNTCh4bWxkb20pO1xuXHRcdFx0XHRyZXR1cm4gYFRoZXJlIGlzIGEgY29udHJvbCBtYXRjaGluZyAke3NlbGVjdG9yfSBpbiBnZW5lcmF0ZWQgeG1sOlxcbiAke291dHB1dFhtbH1gO1xuXHRcdFx0fSxcblx0XHRcdHBhc3M6IG5vZGVzICYmIG5vZGVzLmxlbmd0aCA9PT0gMFxuXHRcdH07XG5cdH0sXG5cdC8qKlxuXHQgKiBDaGVja3MgZm9yIGVycm9ycyBpbiBgeG1sYCBjcmVhdGVkIGR1cmluZyB0ZW1wbGF0aW5nIG9mIGFuIFhNTCBzdHJpbmcgb3Jcblx0ICogYW4gWE1MIG5vZGUuXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gY2hlY2tlcyBmb3IgdGhlIHhtbCBlcnJvcnMgY3JlYXRlZCBieSB0aGVcblx0ICogZnVuY3Rpb24gW0J1aWxkaW5nQmxvY2tUZW1wbGF0ZVByb2Nlc3Nvci5jcmVhdGVFcnJvclhNTF17QGxpbmsgc2FwLmZlLmNvcmUuYnVpbGRpbmdCbG9ja3MudGVtcGxhdGluZy5CdWlsZGluZ0Jsb2NrVGVtcGxhdGVQcm9jZXNzb3IjY3JlYXRlRXJyb3JYTUx9LlxuXHQgKiBAcGFyYW0geG1sIFhNTCBTdHJpbmcgb3IgWE1MIE5vZGUgdG8gYmUgdGVzdGVkIGZvciBlcnJvcnNcblx0ICogQHJldHVybnMgSmVzdCBNYXRjaGVyIHJlc3VsdCBvYmplY3Rcblx0ICovXG5cdHRvSGF2ZVRlbXBsYXRpbmdFcnJvcnMoeG1sOiBzdHJpbmcgfCBOb2RlKSB7XG5cdFx0Y29uc3QgeG1sVGV4dCA9IHR5cGVvZiB4bWwgPT09IFwic3RyaW5nXCIgPyB4bWwgOiBzZXJpYWxpemVYTUwoeG1sKTtcblx0XHRjb25zdCBiYXNlNjRFbnRyaWVzOiBzdHJpbmdbXSA9IHhtbFRleHQubWF0Y2goL0JCRlxcLmJhc2U2NERlY29kZVxcKCcoW14nXSopJ1xcKS9nbSkgfHwgKFtdIGFzIHN0cmluZ1tdKTtcblx0XHRjb25zdCBlcnJvck1lc3NhZ2VzOiBzdHJpbmdbXSA9IGJhc2U2NEVudHJpZXMubWFwKChtZXNzYWdlOiBzdHJpbmcpID0+IHtcblx0XHRcdGlmIChtZXNzYWdlICYmIG1lc3NhZ2UubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRyZXR1cm4gYXRvYihtZXNzYWdlLm1hdGNoKC8oJ1teJ10qKS8pPy5bMF0/LnNsaWNlKDEpIHx8IFwiXCIpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIFwiXCI7XG5cdFx0fSk7XG5cdFx0aWYgKGVycm9yTWVzc2FnZXMubGVuZ3RoIDw9IDApIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdG1lc3NhZ2U6ICgpID0+IGBYTUwgVGVtcGxhdGluZyB3aXRob3V0IGVycm9yc2AsXG5cdFx0XHRcdHBhc3M6IGZhbHNlXG5cdFx0XHR9O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRtZXNzYWdlOiAoKSA9PiBlcnJvck1lc3NhZ2VzLmpvaW4oXCJcXG5cIiksXG5cdFx0XHRcdHBhc3M6IHRydWVcblx0XHRcdH07XG5cdFx0fVxuXHR9XG59KTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdEJ1aWxkaW5nQmxvY2tYTUwgPSBmdW5jdGlvbiAoeG1sU3RyaW5nOiBzdHJpbmcgfCBzdHJpbmdbXSk6IHN0cmluZyB7XG5cdGlmIChBcnJheS5pc0FycmF5KHhtbFN0cmluZykpIHtcblx0XHR4bWxTdHJpbmcgPSB4bWxTdHJpbmcuam9pbihcIlwiKTtcblx0fVxuXHRyZXR1cm4gZm9ybWF0WE1MKHhtbFN0cmluZyk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udHJvbEF0dHJpYnV0ZSA9IGZ1bmN0aW9uIChjb250cm9sU2VsZWN0b3I6IHN0cmluZywgYXR0cmlidXRlTmFtZTogc3RyaW5nLCB4bWxEb206IE5vZGUpIHtcblx0Y29uc3Qgc2VsZWN0b3IgPSBgc3RyaW5nKCR7X2dldFRlbXBsYXRlZFNlbGVjdG9yKHhtbERvbSwgY29udHJvbFNlbGVjdG9yKX0vQCR7YXR0cmlidXRlTmFtZX0pYDtcblx0cmV0dXJuIHJ1blhQYXRoUXVlcnkoc2VsZWN0b3IsIHhtbERvbSk7XG59O1xuXG4vKipcbiAqIFNlcmlhbGl6ZSB0aGUgcGFydHMgb3IgdGhlIGNvbXBsZXRlIGdpdmVuIFhNTCBET00gdG8gc3RyaW5nLlxuICogQHBhcmFtIHhtbERvbSBET00gbm9kZSB0aGF0IGlzIHRvIGJlIHNlcmlhbGl6ZWQuXG4gKiBAcGFyYW0gc2VsZWN0b3IgT3B0aW9uYWwgc2VsZWN0b3Igb2Ygc3ViIG5vZGVzXG4gKiBAcmV0dXJucyBYTUwgc3RyaW5nXG4gKi9cbmV4cG9ydCBjb25zdCBzZXJpYWxpemVYTUwgPSBmdW5jdGlvbiAoeG1sRG9tOiBOb2RlLCBzZWxlY3Rvcj86IHN0cmluZykge1xuXHRjb25zdCBzZXJpYWxpemVyID0gbmV3IHdpbmRvdy5YTUxTZXJpYWxpemVyKCk7XG5cdGxldCB4bWxTdHJpbmc6IHN0cmluZztcblx0aWYgKHNlbGVjdG9yKSB7XG5cdFx0Y29uc3Qgbm9kZXMgPSBydW5YUGF0aFF1ZXJ5KHNlbGVjdG9yLCB4bWxEb20pIGFzIE5vZGVbXTtcblx0XHR4bWxTdHJpbmcgPSBub2Rlcy5tYXAoKG5vZGUpID0+IHNlcmlhbGl6ZXIuc2VyaWFsaXplVG9TdHJpbmcobm9kZSkpLmpvaW4oXCJcXG5cIik7XG5cdH0gZWxzZSB7XG5cdFx0eG1sU3RyaW5nID0gc2VyaWFsaXplci5zZXJpYWxpemVUb1N0cmluZyh4bWxEb20pO1xuXHR9XG5cdHJldHVybiBmb3JtYXRYTUwoeG1sU3RyaW5nKTtcbn07XG5cbi8qKlxuICogRm9ybWF0cyBhIHN0cmluZyBjb250YWluaW5nIGFuIFhNTCBkb2N1bWVudC5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIG9ubHkgY29uc2lkZXJzIFhNTCB0YWdzIGFuZCBhdHRyaWJ1dGVzLCBpZ25vcmluZyBldmVyeXRoaW5nIGVsc2UgKHRleHQsIGNvbW1lbnRzKS4gQWRkaXRpb25hbGx5LFxuICogYXR0cmlidXRlIHZhbHVlcyBjb250YWluaW5nIGEgdmFyeWluZyBVSUQgYXJlIHJlcGxhY2VkIHdpdGggYSBjb25zdGFudCB2YWx1ZS5cbiAqXG4gKiBBbiBcIlhNTFwiIHN0cmluZyBjb250YWluaW5nIG11bHRpcGxlIHJvb3QgZWxlbWVudHMgY2FuIGJlLlxuICogQHBhcmFtIHhtbFN0cmluZyAgVGhlIGlucHV0IFhNTCBzdHJpbmcuIFRoaXMgZnVuY3Rpb24gYWxzbyBhY2NlcHRzIFwiWE1MXCIgc3RyaW5ncyB3aXRoIG11bHRpcGxlIHJvb3QgZWxlbWVudHMuXG4gKiBAcmV0dXJucyBUaGUgZm9ybWF0dGVkIFhNTCBzdHJpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBmb3JtYXRYTUwgPSBmdW5jdGlvbiAoeG1sU3RyaW5nOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRjb25zdCBTVEFSVCA9IFwiPF9fWE1MX18+XCIsXG5cdFx0RU5EID0gXCI8L19fWE1MX18+XCIsXG5cdFx0VUlEID0gL3VpZC0taWQtXFxkezEzfS1cXGR7MSwzfS8sXG5cdFx0VUlEMiA9IC9pZC1cXGR7MTN9LVxcZHsxLDN9Lyxcblx0XHRsaW5lczogc3RyaW5nW10gPSBbXTtcblxuXHRsZXQgY3VycmVudExpbmUgPSBcIlwiLFxuXHRcdGxldmVsID0gLTEsXG5cdFx0YXR0cmlidXRlczogeyBuYW1lOiBzdHJpbmc7IHZhbHVlPzogc3RyaW5nIH1bXSA9IFtdO1xuXG5cdGZ1bmN0aW9uIG5ld2xpbmUoKSB7XG5cdFx0aWYgKGN1cnJlbnRMaW5lICYmIGN1cnJlbnRMaW5lICE9PSBTVEFSVCkge1xuXHRcdFx0bGluZXMucHVzaChjdXJyZW50TGluZSk7XG5cdFx0fVxuXG5cdFx0Y3VycmVudExpbmUgPSBsZXZlbCA+IDAgPyBcIiAgXCIucmVwZWF0KGxldmVsKSA6IFwiXCI7XG5cdH1cblxuXHRmdW5jdGlvbiBhcHBlbmRBdHRyaWJ1dGVzKCkge1xuXHRcdGlmIChhdHRyaWJ1dGVzLmxlbmd0aCA+IDApIHtcblx0XHRcdGF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzLnNvcnQoKGEsIGIpID0+IHtcblx0XHRcdFx0aWYgKGEubmFtZS5zdGFydHNXaXRoKFwieG1sbnNcIikgJiYgIWIubmFtZS5zdGFydHNXaXRoKFwieG1sbnNcIikpIHtcblx0XHRcdFx0XHRyZXR1cm4gLTE7XG5cdFx0XHRcdH0gZWxzZSBpZiAoIWEubmFtZS5zdGFydHNXaXRoKFwieG1sbnNcIikgJiYgYi5uYW1lLnN0YXJ0c1dpdGgoXCJ4bWxuc1wiKSkge1xuXHRcdFx0XHRcdHJldHVybiAxO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGEubmFtZS5zdGFydHNXaXRoKFwieG1sbnNcIikgJiYgYi5uYW1lLnN0YXJ0c1dpdGgoXCJ4bWxuc1wiKSkge1xuXHRcdFx0XHRcdHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGEubmFtZS5pbmNsdWRlcyhcIjpcIikgJiYgIWIubmFtZS5pbmNsdWRlcyhcIjpcIikpIHtcblx0XHRcdFx0XHRyZXR1cm4gLTE7XG5cdFx0XHRcdH0gZWxzZSBpZiAoIWEubmFtZS5pbmNsdWRlcyhcIjpcIikgJiYgYi5uYW1lLmluY2x1ZGVzKFwiOlwiKSkge1xuXHRcdFx0XHRcdHJldHVybiAxO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHVybiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0bGV2ZWwrKztcblx0XHRcdGZvciAoY29uc3QgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZXMpIHtcblx0XHRcdFx0bmV3bGluZSgpO1xuXHRcdFx0XHRjdXJyZW50TGluZSArPSBhdHRyaWJ1dGUubmFtZTtcblx0XHRcdFx0aWYgKGF0dHJpYnV0ZS52YWx1ZSkgY3VycmVudExpbmUgKz0gYXR0cmlidXRlLnZhbHVlO1xuXHRcdFx0fVxuXHRcdFx0bGV2ZWwtLTtcblx0XHRcdGF0dHJpYnV0ZXMgPSBbXTtcblx0XHRcdG5ld2xpbmUoKTtcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBhcHBlbmQoZGF0YTogUmFuZ2UpIHtcblx0XHRjdXJyZW50TGluZSArPSBwYXJzZXIucmVhZChkYXRhKTtcblx0fVxuXG5cdGNvbnN0IHBhcnNlciA9IGNyZWF0ZVBhcnNlcih7XG5cdFx0b25PcGVuVGFnU3RhcnQoZGF0YTogUmFuZ2UpIHtcblx0XHRcdG5ld2xpbmUoKTtcblx0XHRcdGFwcGVuZChkYXRhKTtcblx0XHR9LFxuXG5cdFx0b25PcGVuVGFnTmFtZTogYXBwZW5kLFxuXG5cdFx0b25BdHRyTmFtZShkYXRhOiBSYW5nZSkge1xuXHRcdFx0YXR0cmlidXRlcy51bnNoaWZ0KHsgbmFtZTogcGFyc2VyLnJlYWQoZGF0YSkgfSk7XG5cdFx0fSxcblxuXHRcdG9uQXR0clZhbHVlKGRhdGE6IFJhbmdlcy5BdHRyVmFsdWUpIHtcblx0XHRcdGF0dHJpYnV0ZXNbMF0udmFsdWUgPSBwYXJzZXIucmVhZChkYXRhKS5yZXBsYWNlKFVJRCwgXCJ1aWQtLWlkXCIpOyAvLyByZXBsYWNlIHZhcnlpbmcgVUlEcyB3aXRoIGEgY29uc3RhbnQgdmFsdWVcblx0XHRcdGF0dHJpYnV0ZXNbMF0udmFsdWUgPSBwYXJzZXIucmVhZChkYXRhKS5yZXBsYWNlKFVJRDIsIFwiaWRcIik7IC8vIHJlcGxhY2UgdmFyeWluZyBVSURzIHdpdGggYSBjb25zdGFudCB2YWx1ZVxuXHRcdH0sXG5cblx0XHRvbk9wZW5UYWdFbmQoZGF0YTogUmFuZ2VzLk9wZW5UYWdFbmQpIHtcblx0XHRcdGFwcGVuZEF0dHJpYnV0ZXMoKTtcblx0XHRcdGFwcGVuZChkYXRhKTtcblx0XHRcdGlmICghZGF0YS5zZWxmQ2xvc2VkKSBsZXZlbCsrO1xuXHRcdH0sXG5cblx0XHRvbkNsb3NlVGFnU3RhcnQoZGF0YTogUmFuZ2UpIHtcblx0XHRcdGxldmVsLS07XG5cdFx0XHRuZXdsaW5lKCk7XG5cdFx0XHRhcHBlbmQoZGF0YSk7XG5cdFx0fSxcblxuXHRcdG9uQ2xvc2VUYWdOYW1lOiBhcHBlbmQsXG5cdFx0b25DbG9zZVRhZ0VuZDogYXBwZW5kXG5cdH0pO1xuXG5cdHBhcnNlci5wYXJzZShTVEFSVCArIHhtbFN0cmluZyArIEVORCk7XG5cdHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpLnRyaW0oKTtcbn07XG5cbi8qKlxuICogQ29tcGlsZSBhIENEUyBmaWxlIGludG8gYW4gRURNWCBmaWxlLlxuICogQHBhcmFtIGNkc1VybCBUaGUgcGF0aCB0byB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBDRFMgZGVmaW5pdGlvbi4gVGhpcyBmaWxlIG11c3QgZGVjbGFyZSB0aGUgbmFtZXNwYWNlXG4gKiBzYXAuZmUudGVzdCBhbmQgYSBzZXJ2aWNlIEplc3RTZXJ2aWNlXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciBjcmVhdGluZyB0aGUgRURNWCBvdXRwdXRcbiAqIEByZXR1cm5zIFRoZSBwYXRoIG9mIHRoZSBnZW5lcmF0ZWQgRURNWFxuICovXG5leHBvcnQgY29uc3QgY29tcGlsZUNEUyA9IGZ1bmN0aW9uIChjZHNVcmw6IHN0cmluZywgb3B0aW9uczogY29tcGlsZXIuT0RhdGFPcHRpb25zID0ge30pIHtcblx0Y29uc3QgY2RzU3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKGNkc1VybCwgXCJ1dGYtOFwiKTtcblx0Y29uc3QgZWRteENvbnRlbnQgPSBjZHMyZWRteChjZHNTdHJpbmcsIFwic2FwLmZlLnRlc3QuSmVzdFNlcnZpY2VcIiwgb3B0aW9ucyk7XG5cdGNvbnN0IGRpciA9IHBhdGgucmVzb2x2ZShjZHNVcmwsIFwiLi5cIiwgXCJnZW5cIik7XG5cblx0Ly8gSWYgdGhlIGNhbGxlciBwcm92aWRlZCBDRFMgY29tcGlsZXIgb3B0aW9uczogSW5jbHVkZSB0aGVtIGluIHRoZSBmaWxlbmFtZS4gVGhpcyBwcmV2ZW50cyB1bnByZWRpY3RhYmxlIHJlc3VsdHMgaWYgdGhlIHNhbWUgQ0RTIHNvdXJjZVxuXHQvLyBmaWxlIGlzIHVzZWQgc2ltdWx0YW5lb3VzbHkgd2l0aCBhIGRpZmZlcmVudCBzZXQgb2Ygb3B0aW9ucyAoZS5nLiBpbiBhIHRlc3QgcnVubmluZyBpbiBwYXJhbGxlbClcblx0Y29uc3QgYWxsT3B0aW9ucyA9IE9iamVjdC5lbnRyaWVzKG9wdGlvbnMpO1xuXHRhbGxPcHRpb25zLnNvcnQoKGEsIGIpID0+IGJbMF0ubG9jYWxlQ29tcGFyZShhWzBdKSk7XG5cblx0Y29uc3QgZWRteEZpbGVOYW1lID1cblx0XHRhbGxPcHRpb25zLnJlZHVjZShcblx0XHRcdChmaWxlbmFtZSwgW29wdGlvbktleSwgb3B0aW9uVmFsdWVdKSA9PiBgJHtmaWxlbmFtZX0jJHtvcHRpb25LZXl9PSR7b3B0aW9uVmFsdWUudG9TdHJpbmcoKX0jYCxcblx0XHRcdHBhdGguYmFzZW5hbWUoY2RzVXJsKS5yZXBsYWNlKFwiLmNkc1wiLCBcIlwiKVxuXHRcdCkgKyBcIi54bWxcIjtcblxuXHRjb25zdCBlZG14RmlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlyLCBlZG14RmlsZU5hbWUpO1xuXG5cdGZzLm1rZGlyU3luYyhkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG5cdGZzLndyaXRlRmlsZVN5bmMoZWRteEZpbGVQYXRoLCBlZG14Q29udGVudCk7XG5cdHJldHVybiBlZG14RmlsZVBhdGg7XG59O1xuXG4vKipcbiAqIENvbXBpbGUgQ0RTIHRvIEVETVguXG4gKiBAcGFyYW0gY2RzIFRoZSBDRFMgbW9kZWwuIEl0IG11c3QgZGVmaW5lIGF0IGxlYXN0IG9uZSBzZXJ2aWNlLlxuICogQHBhcmFtIHNlcnZpY2UgVGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBzZXJ2aWNlIHRvIGJlIGNvbXBpbGVkLiBEZWZhdWx0cyB0byBcInNhcC5mZS50ZXN0Lkplc3RTZXJ2aWNlXCIuXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciBjcmVhdGluZyB0aGUgRURNWCBvdXRwdXRcbiAqIEByZXR1cm5zIFRoZSBjb21waWxlZCBzZXJ2aWNlIG1vZGVsIGFzIEVETVguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjZHMyZWRteChjZHM6IHN0cmluZywgc2VydmljZSA9IFwic2FwLmZlLnRlc3QuSmVzdFNlcnZpY2VcIiwgb3B0aW9uczogY29tcGlsZXIuT0RhdGFPcHRpb25zID0ge30pIHtcblx0Y29uc3Qgc291cmNlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsgXCJzb3VyY2UuY2RzXCI6IGNkcyB9O1xuXG5cdC8vIGFsbG93IHRvIGluY2x1ZGUgc3R1ZmYgZnJvbSBAc2FwL2Nkcy9jb21tb25cblx0aWYgKGNkcy5pbmNsdWRlcyhcIidAc2FwL2Nkcy9jb21tb24nXCIpKSB7XG5cdFx0c291cmNlc1tcImNvbW1vbi5jZHNcIl0gPSBmcy5yZWFkRmlsZVN5bmMocmVxdWlyZS5yZXNvbHZlKFwiQHNhcC9jZHMvY29tbW9uLmNkc1wiKSwgXCJ1dGYtOFwiKTtcblx0fVxuXG5cdGNvbnN0IGNzbiA9IGNvbXBpbGVyLmNvbXBpbGVTb3VyY2VzKHNvdXJjZXMsIHt9KTtcblxuXHRjb25zdCBlZG14T3B0aW9uczogY29tcGlsZXIuT0RhdGFPcHRpb25zID0ge1xuXHRcdG9kYXRhRm9yZWlnbktleXM6IHRydWUsXG5cdFx0b2RhdGFGb3JtYXQ6IFwic3RydWN0dXJlZFwiLFxuXHRcdG9kYXRhQ29udGFpbm1lbnQ6IHRydWUsXG5cdFx0Li4ub3B0aW9ucyxcblx0XHRzZXJ2aWNlOiBzZXJ2aWNlXG5cdH07XG5cblx0Y29uc3QgZWRteCA9IGNvbXBpbGVyLnRvLmVkbXgoY3NuLCBlZG14T3B0aW9ucyk7XG5cdGlmICghZWRteCkge1xuXHRcdHRocm93IG5ldyBFcnJvcihgQ29tcGlsYXRpb24gZmFpbGVkLiBIaW50OiBNYWtlIHN1cmUgdGhhdCB0aGUgQ0RTIG1vZGVsIGRlZmluZXMgc2VydmljZSAke3NlcnZpY2V9LmApO1xuXHR9XG5cdHJldHVybiBlZG14O1xufVxuXG5leHBvcnQgY29uc3QgZ2V0RmFrZVNpZGVFZmZlY3RzU2VydmljZSA9IGFzeW5jIGZ1bmN0aW9uIChcblx0bWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCxcblx0Y2xhc3NOYW1lT0RhdGFNb2RlbCA9IFwic2FwLnVpLm1vZGVsLm9kYXRhLnY0Lk9EYXRhTW9kZWxcIlxuKTogUHJvbWlzZTxTaWRlRWZmZWN0c1NlcnZpY2U+IHtcblx0Y29uc3Qgc2NvcGVPYmplY3QgPSB7XG5cdFx0Z2V0TW9kZWw6ICgpID0+IHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGlzQTogKCkgPT4gY2xhc3NOYW1lT0RhdGFNb2RlbCA9PT0gXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbFwiLFxuXHRcdFx0XHRnZXRNZXRhTW9kZWw6ICgpID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gbWV0YU1vZGVsO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRnZXRTZXJ2aWNlVXJsOiAoKSA9PiB1bmRlZmluZWRcblx0XHRcdH07XG5cdFx0fSxcblx0XHRnZXRTZXJ2aWNlOiAoKSA9PiB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRnZXRDYXBhYmlsaXRpZXM6ICgpID0+IHVuZGVmaW5lZFxuXHRcdFx0fTtcblx0XHR9XG5cdH07XG5cdGNvbnN0IHNlcnZpY2VJbnN0YW5jZSA9IGF3YWl0IG5ldyBTaWRlRWZmZWN0c0ZhY3RvcnkoKS5jcmVhdGVJbnN0YW5jZSh7IHNjb3BlT2JqZWN0LCBzY29wZVR5cGU6IFwiXCIsIHNldHRpbmdzOiB7fSB9KTtcblx0cmV0dXJuIHNlcnZpY2VJbnN0YW5jZS5nZXRJbnRlcmZhY2UoKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRGYWtlRGlhZ25vc3RpY3MgPSBmdW5jdGlvbiAoKTogSURpYWdub3N0aWNzIHtcblx0Y29uc3QgaXNzdWVzOiBhbnlbXSA9IFtdO1xuXHRyZXR1cm4ge1xuXHRcdGFkZElzc3VlKGlzc3VlQ2F0ZWdvcnk6IElzc3VlQ2F0ZWdvcnksIGlzc3VlU2V2ZXJpdHk6IElzc3VlU2V2ZXJpdHksIGRldGFpbHM6IHN0cmluZyk6IHZvaWQge1xuXHRcdFx0aXNzdWVzLnB1c2goe1xuXHRcdFx0XHRpc3N1ZUNhdGVnb3J5LFxuXHRcdFx0XHRpc3N1ZVNldmVyaXR5LFxuXHRcdFx0XHRkZXRhaWxzXG5cdFx0XHR9KTtcblx0XHR9LFxuXHRcdGdldElzc3VlcygpOiBhbnlbXSB7XG5cdFx0XHRyZXR1cm4gaXNzdWVzO1xuXHRcdH0sXG5cdFx0Y2hlY2tJZklzc3VlRXhpc3RzKGlzc3VlQ2F0ZWdvcnk6IElzc3VlQ2F0ZWdvcnksIGlzc3VlU2V2ZXJpdHk6IElzc3VlU2V2ZXJpdHksIGRldGFpbHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdFx0cmV0dXJuIGlzc3Vlcy5maW5kKChpc3N1ZSkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gaXNzdWUuaXNzdWVDYXRlZ29yeSA9PT0gaXNzdWVDYXRlZ29yeSAmJiBpc3N1ZS5pc3N1ZVNldmVyaXR5ID09PSBpc3N1ZVNldmVyaXR5ICYmIGlzc3VlLmRldGFpbHMgPT09IGRldGFpbHM7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udmVydGVyQ29udGV4dEZvclRlc3QgPSBmdW5jdGlvbiAoXG5cdG1ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwsXG5cdG1hbmlmZXN0U2V0dGluZ3M6IExpc3RSZXBvcnRNYW5pZmVzdFNldHRpbmdzIHwgT2JqZWN0UGFnZU1hbmlmZXN0U2V0dGluZ3Ncbikge1xuXHRjb25zdCBjb252ZXJ0ZWRUeXBlcyA9IGNvbnZlcnRUeXBlcyhtZXRhTW9kZWwpO1xuXHRjb25zdCBkYXRhTW9kZWxQYXRoID0gbWFuaWZlc3RTZXR0aW5ncy5jb250ZXh0UGF0aFxuXHRcdD8gZ2V0SW52b2x2ZWREYXRhTW9kZWxPYmplY3RzPFBhZ2VDb250ZXh0UGF0aFRhcmdldD4obWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KG1hbmlmZXN0U2V0dGluZ3MuY29udGV4dFBhdGgpIGFzIENvbnRleHQpXG5cdFx0OiBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHM8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PihtZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoYC8ke21hbmlmZXN0U2V0dGluZ3MuZW50aXR5U2V0fWApKTtcblx0cmV0dXJuIG5ldyBDb252ZXJ0ZXJDb250ZXh0PFBhZ2VDb250ZXh0UGF0aFRhcmdldD4oY29udmVydGVkVHlwZXMsIG1hbmlmZXN0U2V0dGluZ3MsIGdldEZha2VEaWFnbm9zdGljcygpLCBtZXJnZSwgZGF0YU1vZGVsUGF0aCk7XG59O1xuY29uc3QgbWV0YU1vZGVsQ2FjaGU6IGFueSA9IHt9O1xuZXhwb3J0IGNvbnN0IGdldE1ldGFNb2RlbCA9IGFzeW5jIGZ1bmN0aW9uIChzTWV0YWRhdGFVcmw6IHN0cmluZykge1xuXHRjb25zdCBvUmVxdWVzdG9yID0gX01ldGFkYXRhUmVxdWVzdG9yLmNyZWF0ZSh7fSwgXCI0LjBcIiwgdW5kZWZpbmVkLCB7fSwge30sIGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fSk7XG5cdGlmICghbWV0YU1vZGVsQ2FjaGVbc01ldGFkYXRhVXJsXSkge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBuZXcgKE9EYXRhTWV0YU1vZGVsIGFzIGFueSkob1JlcXVlc3Rvciwgc01ldGFkYXRhVXJsLCB1bmRlZmluZWQsIHsgX3JlcXVlc3RBbm5vdGF0aW9uQ2hhbmdlczogKCkgPT4gW10gfSk7XG5cdFx0YXdhaXQgb01ldGFNb2RlbC5mZXRjaEVudGl0eUNvbnRhaW5lcigpO1xuXHRcdG1ldGFNb2RlbENhY2hlW3NNZXRhZGF0YVVybF0gPSBvTWV0YU1vZGVsO1xuXHR9XG5cblx0cmV0dXJuIG1ldGFNb2RlbENhY2hlW3NNZXRhZGF0YVVybF07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aEZvclByb3BlcnR5ID0gZnVuY3Rpb24gPFQgPSBQcm9wZXJ0eSB8IEVudGl0eVNldCB8IEFueUFubm90YXRpb24+KFxuXHRlbnRpdHlTZXQ6IEVudGl0eVNldCxcblx0Y29udmVydGVkVHlwZXM6IENvbnZlcnRlZE1ldGFkYXRhLFxuXHRwcm9wZXJ0eT86IFRcbik6IERhdGFNb2RlbE9iamVjdFBhdGg8VD4ge1xuXHRjb25zdCB0YXJnZXRQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPFQ+ID0ge1xuXHRcdHN0YXJ0aW5nRW50aXR5U2V0OiBlbnRpdHlTZXQsXG5cdFx0bmF2aWdhdGlvblByb3BlcnRpZXM6IFtdLFxuXHRcdHRhcmdldE9iamVjdDogcHJvcGVydHksXG5cdFx0dGFyZ2V0RW50aXR5U2V0OiBlbnRpdHlTZXQsXG5cdFx0dGFyZ2V0RW50aXR5VHlwZTogZW50aXR5U2V0LmVudGl0eVR5cGUsXG5cdFx0Y29udmVydGVkVHlwZXM6IGNvbnZlcnRlZFR5cGVzXG5cdH07XG5cdHRhcmdldFBhdGguY29udGV4dExvY2F0aW9uID0gdGFyZ2V0UGF0aCBhcyBEYXRhTW9kZWxPYmplY3RQYXRoPEVudGl0eVNldD47XG5cdHJldHVybiB0YXJnZXRQYXRoO1xufTtcblxuZXhwb3J0IGNvbnN0IGV2YWx1YXRlQmluZGluZyA9IGZ1bmN0aW9uIChiaW5kaW5nU3RyaW5nOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG5cdGNvbnN0IGJpbmRpbmdFbGVtZW50ID0gQmluZGluZ1BhcnNlci5jb21wbGV4UGFyc2VyKGJpbmRpbmdTdHJpbmcpO1xuXHRyZXR1cm4gYmluZGluZ0VsZW1lbnQuZm9ybWF0dGVyLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7XG59O1xuXG50eXBlIE1vZGVsQ29udGVudCA9IHtcblx0W25hbWU6IHN0cmluZ106IGFueTtcbn07XG5cbi8qKlxuICogRXZhbHVhdGUgYSBiaW5kaW5nIGFnYWluc3QgYSBtb2RlbC5cbiAqIEBwYXJhbSBiaW5kaW5nU3RyaW5nIFRoZSBiaW5kaW5nIHN0cmluZy5cbiAqIEBwYXJhbSBtb2RlbENvbnRlbnQgQ29udGVudCBvZiB0aGUgZGVmYXVsdCBtb2RlbCB0byB1c2UgZm9yIGV2YWx1YXRpb24uXG4gKiBAcGFyYW0gbmFtZWRNb2RlbHNDb250ZW50IENvbnRlbnRzIG9mIGFkZGl0aW9uYWwsIG5hbWVkIG1vZGVscyB0byB1c2UuXG4gKiBAcmV0dXJucyBUaGUgZXZhbHVhdGVkIGJpbmRpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBldmFsdWF0ZUJpbmRpbmdXaXRoTW9kZWwoXG5cdGJpbmRpbmdTdHJpbmc6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0bW9kZWxDb250ZW50OiBNb2RlbENvbnRlbnQsXG5cdG5hbWVkTW9kZWxzQ29udGVudD86IHsgW21vZGVsTmFtZTogc3RyaW5nXTogTW9kZWxDb250ZW50IH1cbik6IHN0cmluZyB7XG5cdGNvbnN0IGJpbmRpbmdFbGVtZW50ID0gQmluZGluZ1BhcnNlci5jb21wbGV4UGFyc2VyKGJpbmRpbmdTdHJpbmcpO1xuXHRjb25zdCB0ZXh0ID0gbmV3IEludmlzaWJsZVRleHQoKTtcblx0dGV4dC5iaW5kUHJvcGVydHkoXCJ0ZXh0XCIsIGJpbmRpbmdFbGVtZW50KTtcblxuXHRjb25zdCBkZWZhdWx0TW9kZWwgPSBuZXcgSlNPTk1vZGVsKG1vZGVsQ29udGVudCk7XG5cdHRleHQuc2V0TW9kZWwoZGVmYXVsdE1vZGVsKTtcblx0dGV4dC5zZXRCaW5kaW5nQ29udGV4dChkZWZhdWx0TW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpKTtcblxuXHRpZiAobmFtZWRNb2RlbHNDb250ZW50KSB7XG5cdFx0Zm9yIChjb25zdCBbbmFtZSwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMobmFtZWRNb2RlbHNDb250ZW50KSkge1xuXHRcdFx0Y29uc3QgbW9kZWwgPSBuZXcgSlNPTk1vZGVsKGNvbnRlbnQpO1xuXHRcdFx0dGV4dC5zZXRNb2RlbChtb2RlbCwgbmFtZSk7XG5cdFx0XHR0ZXh0LnNldEJpbmRpbmdDb250ZXh0KG1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKSwgbmFtZSk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHRleHQuZ2V0VGV4dCgpO1xufVxuXG5jb25zdCBURVNUVklFV0lEID0gXCJ0ZXN0Vmlld0lkXCI7XG5cbmNvbnN0IGFwcGx5RmxleENoYW5nZXMgPSBhc3luYyBmdW5jdGlvbiAoZmxleENoYW5nZXM6IHsgW3g6IHN0cmluZ106IG9iamVjdFtdIH0sIG9NZXRhTW9kZWw6IE1ldGFNb2RlbCwgcmVzdWx0WE1MOiBhbnkpIHtcblx0Ly8gcHJlZml4IElkc1xuXHRbLi4ucmVzdWx0WE1MLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbaWRdXCIpXS5mb3JFYWNoKChub2RlKSA9PiB7XG5cdFx0bm9kZS5pZCA9IGAke1RFU1RWSUVXSUR9LS0ke25vZGUuaWR9YDtcblx0fSk7XG5cdGNvbnN0IGNoYW5nZXMgPSBjcmVhdGVGbGV4aWJpbGl0eUNoYW5nZXNPYmplY3QoVEVTVFZJRVdJRCwgZmxleENoYW5nZXMpO1xuXHRjb25zdCBhcHBJZCA9IFwic29tZUNvbXBvbmVudFwiO1xuXHRjb25zdCBvTWFuaWZlc3QgPSB7XG5cdFx0XCJzYXAuYXBwXCI6IHtcblx0XHRcdGlkOiBhcHBJZCxcblx0XHRcdHR5cGU6IFwiYXBwbGljYXRpb25cIixcblx0XHRcdGNyb3NzTmF2aWdhdGlvbjoge1xuXHRcdFx0XHRvdXRib3VuZHM6IFtdXG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQgPSB7XG5cdFx0Z2V0RGlhZ25vc3RpY3M6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoZ2V0RmFrZURpYWdub3N0aWNzKCkpLFxuXHRcdGdldE1vZGVsOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKHtcblx0XHRcdGdldE1ldGFNb2RlbDogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZShvTWV0YU1vZGVsKVxuXHRcdH0pLFxuXHRcdGdldENvbXBvbmVudERhdGE6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoe30pLFxuXHRcdGdldE1hbmlmZXN0T2JqZWN0OiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKHtcblx0XHRcdGdldEVudHJ5OiBmdW5jdGlvbiAobmFtZTogc3RyaW5nKSB7XG5cdFx0XHRcdHJldHVybiAob01hbmlmZXN0IGFzIGFueSlbbmFtZV07XG5cdFx0XHR9XG5cdFx0fSksXG5cdFx0Z2V0TG9jYWxJZDogamVzdC5mbigoc0lkKSA9PiBzSWQpXG5cdH0gYXMgdW5rbm93biBhcyBBcHBDb21wb25lbnQ7XG5cdC8vZmFrZSBjaGFuZ2VzXG5cdGplc3Quc3B5T24oQXBwU3RvcmFnZSwgXCJsb2FkRmxleERhdGFcIikubW9ja1JldHVyblZhbHVlKFByb21pc2UucmVzb2x2ZShjaGFuZ2VzKSk7XG5cdGplc3Quc3B5T24oTG9hZGVyLCBcImxvYWRGbGV4RGF0YVwiKS5tb2NrUmV0dXJuVmFsdWUoUHJvbWlzZS5yZXNvbHZlKGNoYW5nZXMpKTtcblxuXHRqZXN0LnNweU9uKENvbXBvbmVudCBhcyB1bmtub3duIGFzIHsgZ2V0Q29tcG9uZW50QnlJZDogKCkgPT4gQXBwQ29tcG9uZW50IH0sIFwiZ2V0Q29tcG9uZW50QnlJZFwiKS5tb2NrUmV0dXJuVmFsdWUob0FwcENvbXBvbmVudCk7XG5cdGplc3Quc3B5T24oVXRpbHMsIFwiZ2V0QXBwQ29tcG9uZW50Rm9yQ29udHJvbFwiKS5tb2NrUmV0dXJuVmFsdWUob0FwcENvbXBvbmVudCk7XG5cdGF3YWl0IEZsZXhTdGF0ZS5pbml0aWFsaXplKHtcblx0XHRjb21wb25lbnRJZDogYXBwSWRcblx0fSk7XG5cdHJlc3VsdFhNTCA9IGF3YWl0IFhtbFByZXByb2Nlc3Nvci5wcm9jZXNzKHJlc3VsdFhNTCwgeyBuYW1lOiBcIlRlc3QgRnJhZ21lbnRcIiwgY29tcG9uZW50SWQ6IGFwcElkLCBpZDogVEVTVFZJRVdJRCB9KTtcblxuXHQvL0Fzc2VydCB0aGF0IGFsbCBjaGFuZ2VzIGhhdmUgYmVlbiBhcHBsaWVkXG5cdGNvbnN0IGNoYW5nZXNBcHBsaWVkID0gZ2V0Q2hhbmdlc0Zyb21YTUwocmVzdWx0WE1MKTtcblx0ZXhwZWN0KGNoYW5nZXNBcHBsaWVkLmxlbmd0aCkudG9CZShmbGV4Q2hhbmdlcz8uY2hhbmdlcz8ubGVuZ3RoID8/IDAgKyBmbGV4Q2hhbmdlcz8udmFyaWFudERlcGVuZGVudENvbnRyb2xDaGFuZ2VzPy5sZW5ndGggPz8gMCk7XG5cdHJldHVybiByZXN1bHRYTUw7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q2hhbmdlc0Zyb21YTUwgPSAoeG1sOiBhbnkpID0+XG5cdFsuLi54bWwucXVlcnlTZWxlY3RvckFsbChcIipcIildXG5cdFx0LmZsYXRNYXAoKGUpID0+IFsuLi5lLmF0dHJpYnV0ZXNdLm1hcCgoYSkgPT4gYS5uYW1lKSlcblx0XHQuZmlsdGVyKChhdHRyKSA9PiBhdHRyLmluY2x1ZGVzKFwic2FwLnVpLmZsLmFwcGxpZWRDaGFuZ2VzXCIpKTtcblxuZXhwb3J0IGNvbnN0IGdldFRlbXBsYXRpbmdSZXN1bHQgPSBhc3luYyBmdW5jdGlvbiAoXG5cdHhtbElucHV0OiBzdHJpbmcsXG5cdHNNZXRhZGF0YVVybDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRtQmluZGluZ0NvbnRleHRzOiB7IFt4OiBzdHJpbmddOiBhbnk7IGVudGl0eVNldD86IHN0cmluZyB9LFxuXHRtTW9kZWxzOiB7IFt4OiBzdHJpbmddOiBhbnkgfSxcblx0ZmxleENoYW5nZXM/OiB7IFt4OiBzdHJpbmddOiBvYmplY3RbXSB9LFxuXHRmYWtlU2lkZUVmZmVjdFNlcnZpY2U/OiB1bmtub3duXG4pIHtcblx0aWYgKCFtTW9kZWxzW1wic2FwLmZlLmkxOG5cIl0pIHtcblx0XHRtTW9kZWxzW1wic2FwLmZlLmkxOG5cIl0gPSBjcmVhdGVNb2NrUmVzb3VyY2VNb2RlbCgpO1xuXHR9XG5cblx0Y29uc3QgdGVtcGxhdGVkWG1sID0gYDxyb290PiR7eG1sSW5wdXR9PC9yb290PmA7XG5cdGNvbnN0IHBhcnNlciA9IG5ldyB3aW5kb3cuRE9NUGFyc2VyKCk7XG5cdGNvbnN0IHhtbERvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcodGVtcGxhdGVkWG1sLCBcInRleHQveG1sXCIpO1xuXHQvLyBUbyBlbnN1cmUgb3VyIG1hY3JvIGNhbiB1c2UgI3NldEJpbmRpbmdDb250ZXh0IHdlIGVuc3VyZSB0aGVyZSBpcyBhIHByZSBleGlzdGluZyBKU09OTW9kZWwgZm9yIGNvbnZlcnRlckNvbnRleHRcblx0Ly8gaWYgbm90IGFscmVhZHkgcGFzc2VkIHRvIHRlaCB0ZW1wbGF0aW5nXG5cblx0Y29uc3Qgb1ByZXByb2Nlc3NvclNldHRpbmdzID0gYXdhaXQgX2J1aWxkUHJlUHJvY2Vzc29yU2V0dGluZ3Moc01ldGFkYXRhVXJsLCBtQmluZGluZ0NvbnRleHRzLCBtTW9kZWxzLCBmYWtlU2lkZUVmZmVjdFNlcnZpY2UpO1xuXG5cdC8vVGhpcyBjb250ZXh0IGZvciBtYWNybyB0ZXN0aW5nXG5cdGlmIChvUHJlcHJvY2Vzc29yU2V0dGluZ3MubW9kZWxzW1widGhpc1wiXSkge1xuXHRcdG9QcmVwcm9jZXNzb3JTZXR0aW5ncy5iaW5kaW5nQ29udGV4dHNbXCJ0aGlzXCJdID0gb1ByZXByb2Nlc3NvclNldHRpbmdzLm1vZGVsc1tcInRoaXNcIl0uY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpO1xuXHR9XG5cblx0bGV0IHJlc3VsdFhNTCA9IChhd2FpdCBYTUxQcmVwcm9jZXNzb3IucHJvY2Vzcyh4bWxEb2MuZmlyc3RFbGVtZW50Q2hpbGQhLCB7IG5hbWU6IFwiVGVzdCBGcmFnbWVudFwiIH0sIG9QcmVwcm9jZXNzb3JTZXR0aW5ncykpIGFzIGFueTtcblxuXHRpZiAoc01ldGFkYXRhVXJsICYmIGZsZXhDaGFuZ2VzKSB7XG5cdFx0Ly8gYXBwbHkgZmxleCBjaGFuZ2VzXG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IGF3YWl0IGdldE1ldGFNb2RlbChzTWV0YWRhdGFVcmwpO1xuXHRcdHJlc3VsdFhNTCA9IGF3YWl0IGFwcGx5RmxleENoYW5nZXMoZmxleENoYW5nZXMsIG9NZXRhTW9kZWwsIHJlc3VsdFhNTCk7XG5cdH1cblx0cmV0dXJuIHJlc3VsdFhNTDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUZW1wbGF0ZWRYTUwgPSBhc3luYyBmdW5jdGlvbiAoXG5cdHhtbElucHV0OiBzdHJpbmcsXG5cdHNNZXRhZGF0YVVybDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRtQmluZGluZ0NvbnRleHRzOiB7IFt4OiBzdHJpbmddOiBzdHJpbmcgfSxcblx0bU1vZGVsczogeyBbeDogc3RyaW5nXTogYW55IH0sXG5cdGZsZXhDaGFuZ2VzPzogeyBbeDogc3RyaW5nXTogb2JqZWN0W10gfSxcblx0ZmFrZVNpZGVFZmZlY3RTZXJ2aWNlPzogdW5rbm93blxuKTogUHJvbWlzZTxzdHJpbmc+IHtcblx0cmV0dXJuIGpzeC5kZWZpbmVYTUxOYW1lc3BhY2VNYXAocmV2ZXNlTmFtZXNwYWNlTWFwLCBhc3luYyAoKSA9PiB7XG5cdFx0Y29uc3QgdGVtcGxhdGVkWE1MID0gYXdhaXQgZ2V0VGVtcGxhdGluZ1Jlc3VsdChcblx0XHRcdHhtbElucHV0LFxuXHRcdFx0c01ldGFkYXRhVXJsLFxuXHRcdFx0bUJpbmRpbmdDb250ZXh0cyxcblx0XHRcdG1Nb2RlbHMsXG5cdFx0XHRmbGV4Q2hhbmdlcyxcblx0XHRcdGZha2VTaWRlRWZmZWN0U2VydmljZVxuXHRcdCk7XG5cdFx0Y29uc3Qgc2VyaWFsaWVkWE1MID0gc2VyaWFsaXplWE1MKHRlbXBsYXRlZFhNTCwgdW5kZWZpbmVkKTtcblx0XHRleHBlY3Qoc2VyaWFsaWVkWE1MKS5ub3QudG9IYXZlVGVtcGxhdGluZ0Vycm9ycygpO1xuXHRcdHJldHVybiBzZXJpYWxpZWRYTUw7XG5cdH0pIGFzIHVua25vd24gYXMgUHJvbWlzZTxzdHJpbmc+O1xufTtcblxuLyoqXG4gKiBQcm9jZXNzIHRoZSByZXF1ZXN0ZWQgdmlldyB3aXRoIHRoZSBwcm92aWRlZCBkYXRhLlxuICogQHBhcmFtIG5hbWUgRnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHZpZXcgdG8gYmUgdGVzdGVkLlxuICogQHBhcmFtIHNNZXRhZGF0YVVybCBVcmwgb2YgdGhlIG1ldGFkYXRhLlxuICogQHBhcmFtIG1CaW5kaW5nQ29udGV4dHMgTWFwIG9mIHRoZSBiaW5kaW5nQ29udGV4dHMgdG8gc2V0IG9uIHRoZSBtb2RlbHMuXG4gKiBAcGFyYW0gbU1vZGVscyBNYXAgb2YgdGhlIG1vZGVscy5cbiAqIEBwYXJhbSBmbGV4Q2hhbmdlcyBPYmplY3Qgd2l0aCBVSSBjaGFuZ2VzIGxpa2UgJ2NoYW5nZXMnIG9yICd2YXJpYW50RGVwZW5kZW50Q29udHJvbENoYW5nZXMnXG4gKiBAcmV0dXJucyBUZW1wbGF0ZWQgdmlldyBhcyBzdHJpbmdcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NWaWV3KFxuXHRuYW1lOiBzdHJpbmcsXG5cdHNNZXRhZGF0YVVybDogc3RyaW5nLFxuXHRtQmluZGluZ0NvbnRleHRzOiB7IFt4OiBzdHJpbmddOiBzdHJpbmcgfSxcblx0bU1vZGVsczogeyBbeDogc3RyaW5nXTogYW55IH0sXG5cdGZsZXhDaGFuZ2VzPzogeyBbeDogc3RyaW5nXTogb2JqZWN0W10gfVxuKTogUHJvbWlzZTxKZXN0VGVtcGxhdGVkVmlldz4ge1xuXHRjb25zdCBvTWV0YU1vZGVsID0gYXdhaXQgZ2V0TWV0YU1vZGVsKHNNZXRhZGF0YVVybCk7XG5cdGNvbnN0IG9WaWV3RG9jdW1lbnQgPSBfbG9hZFJlc291cmNlVmlldyhuYW1lKTtcblx0Y29uc3Qgb1ByZXByb2Nlc3NvclNldHRpbmdzID0gYXdhaXQgX2J1aWxkUHJlUHJvY2Vzc29yU2V0dGluZ3Moc01ldGFkYXRhVXJsLCBtQmluZGluZ0NvbnRleHRzLCBtTW9kZWxzKTtcblx0bGV0IG9QcmVwcm9jZXNzZWRWaWV3ID0gYXdhaXQgWE1MUHJlcHJvY2Vzc29yLnByb2Nlc3Mob1ZpZXdEb2N1bWVudCwgeyBuYW1lOiBuYW1lIH0sIG9QcmVwcm9jZXNzb3JTZXR0aW5ncyk7XG5cdGlmIChmbGV4Q2hhbmdlcykge1xuXHRcdG9QcmVwcm9jZXNzZWRWaWV3ID0gYXdhaXQgYXBwbHlGbGV4Q2hhbmdlcyhmbGV4Q2hhbmdlcyA/PyBbXSwgb01ldGFNb2RlbCwgb1ByZXByb2Nlc3NlZFZpZXcpO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0YXNFbGVtZW50OiBvUHJlcHJvY2Vzc2VkVmlldyxcblx0XHRhc1N0cmluZzogZm9ybWF0WE1MKG9QcmVwcm9jZXNzZWRWaWV3Py5vdXRlckhUTUwgfHwgXCJcIilcblx0fTtcbn1cblxuLyoqXG4gKiBQcm9jZXNzIHRoZSByZXF1ZXN0ZWQgWE1MIGZyYWdtZW50IHdpdGggdGhlIHByb3ZpZGVkIGRhdGEuXG4gKiBAcGFyYW0gbmFtZSBGdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgZnJhZ21lbnQgdG8gYmUgdGVzdGVkLlxuICogQHBhcmFtIHRlc3REYXRhIFRlc3QgZGF0YSBjb25zaXN0aW5nXG4gKiBAcmV0dXJucyBUZW1wbGF0ZWQgZnJhZ21lbnQgYXMgc3RyaW5nXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzRnJhZ21lbnQobmFtZTogc3RyaW5nLCB0ZXN0RGF0YTogeyBbbW9kZWw6IHN0cmluZ106IG9iamVjdCB9KTogUHJvbWlzZTxzdHJpbmc+IHtcblx0Y29uc3QgaW5wdXRYbWwgPSBgPHJvb3Q+PGNvcmU6RnJhZ21lbnQgZnJhZ21lbnROYW1lPVwiJHtuYW1lfVwiIHR5cGU9XCJYTUxcIiB4bWxuczpjb3JlPVwic2FwLnVpLmNvcmVcIiAvPjwvcm9vdD5gO1xuXHRjb25zdCBwYXJzZXIgPSBuZXcgd2luZG93LkRPTVBhcnNlcigpO1xuXG5cdGNvbnN0IGlucHV0RG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhpbnB1dFhtbCwgXCJ0ZXh0L3htbFwiKTtcblxuXHQvLyBidWlsZCBtb2RlbCBhbmQgYmluZGluZ3MgZm9yIGdpdmVuIHRlc3QgZGF0YVxuXHRjb25zdCBzZXR0aW5ncyA9IHtcblx0XHRtb2RlbHM6IHt9IGFzIHsgW25hbWU6IHN0cmluZ106IEpTT05Nb2RlbCB9LFxuXHRcdGJpbmRpbmdDb250ZXh0czoge30gYXMgeyBbbmFtZTogc3RyaW5nXTogb2JqZWN0IH0sXG5cdFx0YXBwQ29tcG9uZW50OiB7IGdldFNpZGVFZmZlY3RzU2VydmljZTogamVzdC5mbigpLCBnZXREaWFnbm9zdGljczogKCkgPT4gdW5kZWZpbmVkIH1cblx0fTtcblx0Zm9yIChjb25zdCBtb2RlbCBpbiB0ZXN0RGF0YSkge1xuXHRcdGNvbnN0IGpzb25Nb2RlbCA9IG5ldyBKU09OTW9kZWwoKTtcblx0XHRqc29uTW9kZWwuc2V0RGF0YSh0ZXN0RGF0YVttb2RlbF0pO1xuXHRcdHNldHRpbmdzLm1vZGVsc1ttb2RlbF0gPSBqc29uTW9kZWw7XG5cdFx0c2V0dGluZ3MuYmluZGluZ0NvbnRleHRzW21vZGVsXSA9IHNldHRpbmdzLm1vZGVsc1ttb2RlbF0uY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpO1xuXHR9XG5cdHNldHRpbmdzLmFwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UubW9ja1JldHVyblZhbHVlKGRlZmF1bHRGYWtlU2lkZUVmZmVjdFNlcnZpY2UpO1xuXG5cdC8vIGV4ZWN1dGUgdGhlIHByZS1wcm9jZXNzb3Jcblx0Y29uc3QgcmVzdWx0RG9jID0gYXdhaXQgWE1MUHJlcHJvY2Vzc29yLnByb2Nlc3MoaW5wdXREb2MuZmlyc3RFbGVtZW50Q2hpbGQsIHsgbmFtZSB9LCBzZXR0aW5ncyk7XG5cblx0Ly8gZXhjbHVkZSBuZXN0ZWQgZnJhZ21lbnRzIGZyb20gdGVzdCBzbmFwc2hvdHNcblx0Y29uc3QgZnJhZ21lbnRzID0gcmVzdWx0RG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiY29yZTpGcmFnbWVudFwiKSBhcyBhbnk7XG5cdGlmIChmcmFnbWVudHM/Lmxlbmd0aCA+IDApIHtcblx0XHRmb3IgKGNvbnN0IGZyYWdtZW50IG9mIGZyYWdtZW50cykge1xuXHRcdFx0ZnJhZ21lbnQuaW5uZXJIVE1MID0gXCJcIjtcblx0XHR9XG5cdH1cblxuXHQvLyBLZWVwIHRoZSBmcmFnbWVudCByZXN1bHQgYXMgY2hpbGQgb2Ygcm9vdCBub2RlIHdoZW4gZnJhZ21lbnQgZ2VuZXJhdGVzIG11bHRpcGxlIHJvb3QgY29udHJvbHNcblx0Y29uc3QgeG1sUmVzdWx0ID0gcmVzdWx0RG9jLmNoaWxkcmVuLmxlbmd0aCA+IDEgPyByZXN1bHREb2Mub3V0ZXJIVE1MIDogcmVzdWx0RG9jLmlubmVySFRNTDtcblxuXHRyZXR1cm4gZm9ybWF0WE1MKHhtbFJlc3VsdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVDb250cm9sKGNvbnRyb2xUb1NlcmlhbGl6ZT86IFVJNUVsZW1lbnQgfCBVSTVFbGVtZW50W10sIHNob3dDdXN0b21TdHlsZUNsYXNzZXMgPSBmYWxzZSkge1xuXHRsZXQgdGFiQ291bnQgPSAwO1xuXHRjb25zdCBVSUQgPSAvdWlkLS1pZC1cXGR7MTN9LVxcZHsxLDN9Lztcblx0Y29uc3QgQ09OVFJPTElEID0gL2lkLVxcZHsxM30tXFxkezEsM30vO1xuXHRmdW5jdGlvbiBnZXRUYWIodG9BZGQgPSAwKSB7XG5cdFx0bGV0IHRhYiA9IFwiXCI7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0YWJDb3VudCArIHRvQWRkOyBpKyspIHtcblx0XHRcdHRhYiArPSBcIlxcdFwiO1xuXHRcdH1cblx0XHRyZXR1cm4gdGFiO1xuXHR9XG5cdGNvbnN0IHNlcmlhbGl6ZURlbGVnYXRlID0ge1xuXHRcdHN0YXJ0OiBmdW5jdGlvbiAoY29udHJvbDogYW55LCBzQWdncmVnYXRpb25OYW1lOiBzdHJpbmcpIHtcblx0XHRcdGxldCBjb250cm9sRGV0YWlsID0gXCJcIjtcblx0XHRcdGlmIChzQWdncmVnYXRpb25OYW1lKSB7XG5cdFx0XHRcdGlmIChjb250cm9sLmdldFBhcmVudCgpKSB7XG5cdFx0XHRcdFx0Y29uc3QgaW5kZXhJblBhcmVudCA9IChjb250cm9sLmdldFBhcmVudCgpLmdldEFnZ3JlZ2F0aW9uKHNBZ2dyZWdhdGlvbk5hbWUpIGFzIE1hbmFnZWRPYmplY3RbXSk/LmluZGV4T2Y/Lihjb250cm9sKTtcblx0XHRcdFx0XHRpZiAoaW5kZXhJblBhcmVudCA+IDApIHtcblx0XHRcdFx0XHRcdGNvbnRyb2xEZXRhaWwgKz0gYCxcXG4ke2dldFRhYigpfWA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRjb250cm9sRGV0YWlsICs9IGAke2NvbnRyb2wuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCl9KGA7XG5cdFx0XHRyZXR1cm4gY29udHJvbERldGFpbDtcblx0XHR9LFxuXHRcdGVuZDogZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIFwifSlcIjtcblx0XHR9LFxuXHRcdG1pZGRsZTogZnVuY3Rpb24gKGNvbnRyb2w6IGFueSkge1xuXHRcdFx0bGV0IGlkID0gY29udHJvbC5nZXRJZCgpO1xuXHRcdFx0aWQgPSB0eXBlb2YgaWQgPT09IFwic3RyaW5nXCIgPyBpZD8ucmVwbGFjZT8uKENPTlRST0xJRCwgXCJpZFwiKSA6IGlkO1xuXHRcdFx0bGV0IGRhdGEgPSBge2lkOiAke01hbmFnZWRPYmplY3RNZXRhZGF0YS5pc0dlbmVyYXRlZElkKGlkKSA/IFwiX19keW5hbWljSWRcIiA6IGlkfWA7XG5cdFx0XHRmb3IgKGNvbnN0IG9Db250cm9sS2V5IGluIGNvbnRyb2wubVByb3BlcnRpZXMpIHtcblx0XHRcdFx0aWYgKGNvbnRyb2wubVByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkob0NvbnRyb2xLZXkpKSB7XG5cdFx0XHRcdFx0bGV0IHByb3BlcnR5VmFsdWUgPSBjb250cm9sLm1Qcm9wZXJ0aWVzW29Db250cm9sS2V5XTtcblx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gdHlwZW9mIHByb3BlcnR5VmFsdWUgPT09IFwic3RyaW5nXCIgPyBwcm9wZXJ0eVZhbHVlPy5yZXBsYWNlPy4oVUlELCBcInVpZC0taWRcIikgOiBwcm9wZXJ0eVZhbHVlO1xuXHRcdFx0XHRcdHByb3BlcnR5VmFsdWUgPSB0eXBlb2YgcHJvcGVydHlWYWx1ZSA9PT0gXCJzdHJpbmdcIiA/IHByb3BlcnR5VmFsdWU/LnJlcGxhY2U/LihDT05UUk9MSUQsIFwiaWRcIikgOiBwcm9wZXJ0eVZhbHVlO1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gdHlwZW9mIHByb3BlcnR5VmFsdWUgPT09IFwib2JqZWN0XCIgPyBKU09OLnN0cmluZ2lmeShwcm9wZXJ0eVZhbHVlKSA6IHByb3BlcnR5VmFsdWU7XG5cdFx0XHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRcdFx0Ly8gU3RyaW5naWZ5IG1heSBmYWlsIGZvciBjaXJjdWxhciByZWZlcmVuY2VzIGJ1dCBpdCdzIG5vdCB0aGUgZW5kIG9mIHRoZSB3b3JsZFxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGRhdGEgKz0gYCxcXG4ke2dldFRhYigpfSAke29Db250cm9sS2V5fTogJHtwcm9wZXJ0eVZhbHVlfWA7XG5cdFx0XHRcdH0gZWxzZSBpZiAoY29udHJvbC5tQmluZGluZ0luZm9zLmhhc093blByb3BlcnR5KG9Db250cm9sS2V5KSkge1xuXHRcdFx0XHRcdGNvbnN0IGJpbmRpbmdEZXRhaWwgPSB7IC4uLmNvbnRyb2wubUJpbmRpbmdJbmZvc1tvQ29udHJvbEtleV0gfTtcblx0XHRcdFx0XHRpZiAoYmluZGluZ0RldGFpbC50eXBlPy5vT3V0cHV0Rm9ybWF0KSB7XG5cdFx0XHRcdFx0XHRkZWxldGUgYmluZGluZ0RldGFpbC50eXBlLm9PdXRwdXRGb3JtYXQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChiaW5kaW5nRGV0YWlsLmJpbmRpbmcpIHtcblx0XHRcdFx0XHRcdGRlbGV0ZSBiaW5kaW5nRGV0YWlsLmJpbmRpbmc7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGRhdGEgKz0gYCxcXG4ke2dldFRhYigpfSAke29Db250cm9sS2V5fTogJHtKU09OLnN0cmluZ2lmeShiaW5kaW5nRGV0YWlsKX1gO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRmb3IgKGNvbnN0IG9Db250cm9sS2V5IGluIGNvbnRyb2wubUFzc29jaWF0aW9ucykge1xuXHRcdFx0XHRpZiAoY29udHJvbC5tQXNzb2NpYXRpb25zLmhhc093blByb3BlcnR5KG9Db250cm9sS2V5KSkge1xuXHRcdFx0XHRcdGxldCBhc3NvY2lhdGlvblZhbHVlID0gY29udHJvbC5tQXNzb2NpYXRpb25zW29Db250cm9sS2V5XTtcblx0XHRcdFx0XHRpZiAoIUFycmF5LmlzQXJyYXkoYXNzb2NpYXRpb25WYWx1ZSkpIHtcblx0XHRcdFx0XHRcdGFzc29jaWF0aW9uVmFsdWUgPSBbYXNzb2NpYXRpb25WYWx1ZV07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGFzc29jaWF0aW9uVmFsdWUgPSBhc3NvY2lhdGlvblZhbHVlLm1hcCgoYXNzb2NpYXRpb25WYWx1ZUVsZW1lbnQ6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHR5cGVvZiBhc3NvY2lhdGlvblZhbHVlRWxlbWVudCA9PT0gXCJzdHJpbmdcIlxuXHRcdFx0XHRcdFx0XHQ/IGFzc29jaWF0aW9uVmFsdWVFbGVtZW50Py5yZXBsYWNlPy4oQ09OVFJPTElELCBcImlkXCIpXG5cdFx0XHRcdFx0XHRcdDogYXNzb2NpYXRpb25WYWx1ZUVsZW1lbnQ7XG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRkYXRhICs9IGAsXFxuJHtnZXRUYWIoKX0gJHtvQ29udHJvbEtleX06ICR7KGFzc29jaWF0aW9uVmFsdWU/LmpvaW4/LihcIixcIikgPz8gYXNzb2NpYXRpb25WYWx1ZSkgfHwgdW5kZWZpbmVkfWA7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChzaG93Q3VzdG9tU3R5bGVDbGFzc2VzICYmIGNvbnRyb2wuYUN1c3RvbVN0eWxlQ2xhc3Nlcz8ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRkYXRhICs9IGAsXFxuJHtnZXRUYWIoKX0gY3VzdG9tU3R5bGVDbGFzc2VzIDogJHtjb250cm9sLmFDdXN0b21TdHlsZUNsYXNzZXMuam9pbihcIiwgXCIpfWA7XG5cdFx0XHR9XG5cdFx0XHRmb3IgKGNvbnN0IG9Db250cm9sS2V5IGluIGNvbnRyb2wubUV2ZW50UmVnaXN0cnkpIHtcblx0XHRcdFx0aWYgKGNvbnRyb2wubUV2ZW50UmVnaXN0cnkuaGFzT3duUHJvcGVydHkob0NvbnRyb2xLZXkpKSB7XG5cdFx0XHRcdFx0ZGF0YSArPSBgLFxcbiR7Z2V0VGFiKCl9ICR7b0NvbnRyb2xLZXl9OiB0cnVlYDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0ZGF0YSArPSBgYDtcblx0XHRcdHJldHVybiBkYXRhO1xuXHRcdH0sXG5cdFx0c3RhcnRBZ2dyZWdhdGlvbjogZnVuY3Rpb24gKGNvbnRyb2w6IHsgbUJpbmRpbmdJbmZvczogUmVjb3JkPHN0cmluZywgQmFzZUFnZ3JlZ2F0aW9uQmluZGluZ0luZm8+IH0sIHNOYW1lOiBzdHJpbmcpIHtcblx0XHRcdGxldCBvdXQgPSBgLFxcbiR7Z2V0VGFiKCl9JHtzTmFtZX1gO1xuXHRcdFx0dGFiQ291bnQrKztcblxuXHRcdFx0aWYgKGNvbnRyb2wubUJpbmRpbmdJbmZvc1tzTmFtZV0pIHtcblx0XHRcdFx0b3V0ICs9IGA9eyBwYXRoOicke2NvbnRyb2wubUJpbmRpbmdJbmZvc1tzTmFtZV0ucGF0aH0nLCB0ZW1wbGF0ZTpcXG4ke2dldFRhYigpfWA7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvdXQgKz0gYD1bXFxuJHtnZXRUYWIoKX1gO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG91dDtcblx0XHR9LFxuXHRcdGVuZEFnZ3JlZ2F0aW9uOiBmdW5jdGlvbiAoY29udHJvbDogYW55LCBzTmFtZTogc3RyaW5nKSB7XG5cdFx0XHR0YWJDb3VudC0tO1xuXHRcdFx0aWYgKGNvbnRyb2wubUJpbmRpbmdJbmZvc1tzTmFtZV0pIHtcblx0XHRcdFx0cmV0dXJuIGBcXG4ke2dldFRhYigpfX1gO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIGBcXG4ke2dldFRhYigpfV1gO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0aWYgKEFycmF5LmlzQXJyYXkoY29udHJvbFRvU2VyaWFsaXplKSkge1xuXHRcdHJldHVybiBjb250cm9sVG9TZXJpYWxpemUubWFwKChjb250cm9sVG9SZW5kZXI6IFVJNUVsZW1lbnQpID0+IHtcblx0XHRcdHJldHVybiBuZXcgU2VyaWFsaXplcihjb250cm9sVG9SZW5kZXIsIHNlcmlhbGl6ZURlbGVnYXRlKS5zZXJpYWxpemUoKTtcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gbmV3IFNlcmlhbGl6ZXIoY29udHJvbFRvU2VyaWFsaXplLCBzZXJpYWxpemVEZWxlZ2F0ZSkuc2VyaWFsaXplKCk7XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZUNvbnRyb2xBc1hNTChjb250cm9sVG9TZXJpYWxpemU/OiBVSTVFbGVtZW50IHwgVUk1RWxlbWVudFtdLCBzaG93Q3VzdG9tU3R5bGVDbGFzc2VzID0gZmFsc2UpIHtcblx0bGV0IHRhYkNvdW50ID0gMDtcblx0Y29uc3QgVUlEID0gL3VpZC0taWQtXFxkezEzfS1cXGR7MSwzfS87XG5cdGNvbnN0IENPTlRST0xJRCA9IC9pZC1cXGR7MTN9LVxcZHsxLDN9Lztcblx0Y29uc3QgZGVmaW5lZE5hbWVzcGFjZXM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XG5cblx0ZnVuY3Rpb24gZ2V0TmFtZXNwYWNlQWxpYXMoY2xhc3NOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdGNvbnN0IG5hbWVzU3BsaXQgPSBjbGFzc05hbWUuc3BsaXQoXCIuXCIpO1xuXHRcdGNvbnN0IG5hbWVzcGFjZSA9IG5hbWVzU3BsaXQuc2xpY2UoMCwgLTEpO1xuXHRcdGNvbnN0IG5hbWUgPSBuYW1lc1NwbGl0W25hbWVzU3BsaXQubGVuZ3RoIC0gMV07XG5cdFx0bGV0IG5hbWVzcGFjZUFsaWFzID0gbmFtZXNwYWNlW25hbWVzcGFjZS5sZW5ndGggLSAxXTtcblx0XHRpZiAocmV2ZXNlTmFtZXNwYWNlTWFwW25hbWVzcGFjZS5qb2luKFwiLlwiKV0pIHtcblx0XHRcdG5hbWVzcGFjZUFsaWFzID0gcmV2ZXNlTmFtZXNwYWNlTWFwW25hbWVzcGFjZS5qb2luKFwiLlwiKV07XG5cdFx0fVxuXHRcdGlmIChuYW1lc3BhY2VBbGlhcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRuYW1lc3BhY2VBbGlhcyA9IFwidGVzdFwiO1xuXHRcdH1cblx0XHRyZXR1cm4gbmFtZXNwYWNlQWxpYXM7XG5cdH1cblxuXHRmdW5jdGlvbiBnZXRUYWIodG9BZGQgPSAwKSB7XG5cdFx0bGV0IHRhYiA9IFwiXCI7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0YWJDb3VudCArIHRvQWRkOyBpKyspIHtcblx0XHRcdHRhYiArPSBcIlxcdFwiO1xuXHRcdH1cblx0XHRyZXR1cm4gdGFiO1xuXHR9XG5cdGNvbnN0IHNlcmlhbGl6ZURlbGVnYXRlID0ge1xuXHRcdHN0YXJ0OiBmdW5jdGlvbiAoY29udHJvbDogYW55LCBzQWdncmVnYXRpb25OYW1lOiBzdHJpbmcpIHtcblx0XHRcdGxldCBjb250cm9sRGV0YWlsID0gXCJcIjtcblx0XHRcdGlmIChzQWdncmVnYXRpb25OYW1lKSB7XG5cdFx0XHRcdGlmIChjb250cm9sLmdldFBhcmVudCgpKSB7XG5cdFx0XHRcdFx0Y29uc3QgaW5kZXhJblBhcmVudCA9IChjb250cm9sLmdldFBhcmVudCgpLmdldEFnZ3JlZ2F0aW9uKHNBZ2dyZWdhdGlvbk5hbWUpIGFzIE1hbmFnZWRPYmplY3RbXSk/LmluZGV4T2Y/Lihjb250cm9sKTtcblx0XHRcdFx0XHRpZiAoaW5kZXhJblBhcmVudCA+IDApIHtcblx0XHRcdFx0XHRcdGNvbnRyb2xEZXRhaWwgKz0gYFxcbiR7Z2V0VGFiKCl9YDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGNvbnN0IG5hbWVGdWxsID0gY29udHJvbC5nZXRNZXRhZGF0YSgpLmdldE5hbWUoKTtcblx0XHRcdGNvbnN0IG5hbWVzU3BsaXQgPSBuYW1lRnVsbC5zcGxpdChcIi5cIik7XG5cdFx0XHRjb25zdCBuYW1lID0gbmFtZXNTcGxpdFtuYW1lc1NwbGl0Lmxlbmd0aCAtIDFdO1xuXHRcdFx0Y29uc3QgbmFtZXNwYWNlQWxpYXMgPSBnZXROYW1lc3BhY2VBbGlhcyhuYW1lRnVsbCk7XG5cdFx0XHRjb250cm9sRGV0YWlsICs9IGA8JHtuYW1lc3BhY2VBbGlhc306JHtuYW1lfVxcbmA7XG5cdFx0XHRpZiAoIWRlZmluZWROYW1lc3BhY2VzW25hbWVzcGFjZUFsaWFzXSkge1xuXHRcdFx0XHRkZWZpbmVkTmFtZXNwYWNlc1tuYW1lc3BhY2VBbGlhc10gPSB0cnVlO1xuXHRcdFx0XHRjb250cm9sRGV0YWlsICs9IGAke2dldFRhYigpfXhtbG5zOiR7bmFtZXNwYWNlQWxpYXN9PVwiJHtuYW1lU3BhY2VNYXBbbmFtZXNwYWNlQWxpYXNdfVwiYDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBjb250cm9sRGV0YWlsO1xuXHRcdH0sXG5cdFx0ZW5kOiBmdW5jdGlvbiAoY29udHJvbDogYW55KSB7XG5cdFx0XHRjb25zdCBuYW1lRnVsbCA9IGNvbnRyb2wuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCk7XG5cdFx0XHRjb25zdCBuYW1lc1NwbGl0ID0gbmFtZUZ1bGwuc3BsaXQoXCIuXCIpO1xuXHRcdFx0Y29uc3QgbmFtZSA9IG5hbWVzU3BsaXRbbmFtZXNTcGxpdC5sZW5ndGggLSAxXTtcblx0XHRcdGNvbnN0IG5hbWVzcGFjZUFsaWFzID0gZ2V0TmFtZXNwYWNlQWxpYXMobmFtZUZ1bGwpO1xuXHRcdFx0bGV0IGhhc0FnZ3JlZ2F0aW9uID0gZmFsc2U7XG5cdFx0XHRmb3IgKGNvbnN0IG1BZ2dyZWdhdGlvbnNLZXkgaW4gY29udHJvbC5tQWdncmVnYXRpb25zKSB7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHQoIUFycmF5LmlzQXJyYXkoY29udHJvbC5tQWdncmVnYXRpb25zW21BZ2dyZWdhdGlvbnNLZXldKSAmJlxuXHRcdFx0XHRcdFx0Y29udHJvbC5tQWdncmVnYXRpb25zW21BZ2dyZWdhdGlvbnNLZXldICE9PSBudWxsICYmXG5cdFx0XHRcdFx0XHRjb250cm9sLm1BZ2dyZWdhdGlvbnNbbUFnZ3JlZ2F0aW9uc0tleV0gIT09IHVuZGVmaW5lZCkgfHxcblx0XHRcdFx0XHQoQXJyYXkuaXNBcnJheShjb250cm9sLm1BZ2dyZWdhdGlvbnNbbUFnZ3JlZ2F0aW9uc0tleV0pICYmIGNvbnRyb2wubUFnZ3JlZ2F0aW9uc1ttQWdncmVnYXRpb25zS2V5XS5sZW5ndGggPiAwKVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRoYXNBZ2dyZWdhdGlvbiA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChoYXNBZ2dyZWdhdGlvbikge1xuXHRcdFx0XHRyZXR1cm4gYDwvJHtuYW1lc3BhY2VBbGlhc306JHtuYW1lfT5gO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIGAvPmA7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRtaWRkbGU6IGZ1bmN0aW9uIChjb250cm9sOiBhbnkpIHtcblx0XHRcdGxldCBpZCA9IGNvbnRyb2wuZ2V0SWQoKTtcblx0XHRcdGlkID0gdHlwZW9mIGlkID09PSBcInN0cmluZ1wiID8gaWQ/LnJlcGxhY2U/LihDT05UUk9MSUQsIFwiaWRcIikgOiBpZDtcblx0XHRcdGxldCBkYXRhID0gXCJcIjtcblx0XHRcdGlmICghTWFuYWdlZE9iamVjdE1ldGFkYXRhLmlzR2VuZXJhdGVkSWQoaWQpKSB7XG5cdFx0XHRcdGRhdGEgPSBgaWQ9XCIke2lkfVwiYDtcblx0XHRcdH1cblx0XHRcdGxldCBrZXlzID0gT2JqZWN0LmtleXMoY29udHJvbC5tUHJvcGVydGllcylcblx0XHRcdFx0LmNvbmNhdChPYmplY3Qua2V5cyhjb250cm9sLm1CaW5kaW5nSW5mb3MpKVxuXHRcdFx0XHQuY29uY2F0KE9iamVjdC5rZXlzKGNvbnRyb2wubUFzc29jaWF0aW9ucykpXG5cdFx0XHRcdC5jb25jYXQoT2JqZWN0LmtleXMoY29udHJvbC5tRXZlbnRSZWdpc3RyeSkpO1xuXHRcdFx0a2V5cyA9IGtleXMuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKTtcblx0XHRcdGNvbnN0IHVuaXF1ZUtleXMgPSBuZXcgU2V0KGtleXMpO1xuXHRcdFx0a2V5cyA9IEFycmF5LmZyb20odW5pcXVlS2V5cyk7XG5cdFx0XHRmb3IgKGNvbnN0IG9Db250cm9sS2V5IG9mIGtleXMpIHtcblx0XHRcdFx0aWYgKGNvbnRyb2wubUJpbmRpbmdJbmZvcy5oYXNPd25Qcm9wZXJ0eShvQ29udHJvbEtleSkpIHtcblx0XHRcdFx0XHRjb25zdCBiaW5kaW5nRGV0YWlsID0geyAuLi5jb250cm9sLm1CaW5kaW5nSW5mb3Nbb0NvbnRyb2xLZXldIH07XG5cdFx0XHRcdFx0aWYgKGJpbmRpbmdEZXRhaWwuYmluZGluZ1N0cmluZykge1xuXHRcdFx0XHRcdFx0ZGF0YSArPSBgXFxuJHtnZXRUYWIoKX0ke29Db250cm9sS2V5fT1cIiR7YmluZGluZ0RldGFpbC5iaW5kaW5nU3RyaW5nLnJlcGxhY2UoXCI+XCIsIFwiJmd0O1wiKX1cImA7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGlmIChiaW5kaW5nRGV0YWlsLnR5cGU/Lm9PdXRwdXRGb3JtYXQpIHtcblx0XHRcdFx0XHRcdFx0ZGVsZXRlIGJpbmRpbmdEZXRhaWwudHlwZS5vT3V0cHV0Rm9ybWF0O1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAoYmluZGluZ0RldGFpbC5iaW5kaW5nKSB7XG5cdFx0XHRcdFx0XHRcdGRlbGV0ZSBiaW5kaW5nRGV0YWlsLmJpbmRpbmc7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoYmluZGluZ0RldGFpbC50ZW1wbGF0ZSkge1xuXHRcdFx0XHRcdFx0XHRkZWxldGUgYmluZGluZ0RldGFpbC50ZW1wbGF0ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGRhdGEgKz0gYFxcbiR7Z2V0VGFiKCl9JHtvQ29udHJvbEtleX09JyR7SlNPTi5zdHJpbmdpZnkoYmluZGluZ0RldGFpbCl9J2A7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKGNvbnRyb2wubVByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkob0NvbnRyb2xLZXkpICYmIGNvbnRyb2wubVByb3BlcnRpZXNbb0NvbnRyb2xLZXldICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRsZXQgcHJvcGVydHlWYWx1ZSA9IGNvbnRyb2wubVByb3BlcnRpZXNbb0NvbnRyb2xLZXldO1xuXHRcdFx0XHRcdHByb3BlcnR5VmFsdWUgPSB0eXBlb2YgcHJvcGVydHlWYWx1ZSA9PT0gXCJzdHJpbmdcIiA/IHByb3BlcnR5VmFsdWU/LnJlcGxhY2U/LihVSUQsIFwidWlkLS1pZFwiKSA6IHByb3BlcnR5VmFsdWU7XG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZSA9IHR5cGVvZiBwcm9wZXJ0eVZhbHVlID09PSBcInN0cmluZ1wiID8gcHJvcGVydHlWYWx1ZT8ucmVwbGFjZT8uKENPTlRST0xJRCwgXCJpZFwiKSA6IHByb3BlcnR5VmFsdWU7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdHByb3BlcnR5VmFsdWUgPSB0eXBlb2YgcHJvcGVydHlWYWx1ZSA9PT0gXCJvYmplY3RcIiA/IEpTT04uc3RyaW5naWZ5KHByb3BlcnR5VmFsdWUpIDogcHJvcGVydHlWYWx1ZTtcblx0XHRcdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdFx0XHQvLyBTdHJpbmdpZnkgbWF5IGZhaWwgZm9yIGNpcmN1bGFyIHJlZmVyZW5jZXMgYnV0IGl0J3Mgbm90IHRoZSBlbmQgb2YgdGhlIHdvcmxkXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0ZGF0YSArPSBgXFxuJHtnZXRUYWIoKX0gJHtvQ29udHJvbEtleX09XCIke3Byb3BlcnR5VmFsdWV9XCJgO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGNvbnRyb2wubUFzc29jaWF0aW9ucy5oYXNPd25Qcm9wZXJ0eShvQ29udHJvbEtleSkpIHtcblx0XHRcdFx0XHRsZXQgYXNzb2NpYXRpb25WYWx1ZSA9IGNvbnRyb2wubUFzc29jaWF0aW9uc1tvQ29udHJvbEtleV07XG5cdFx0XHRcdFx0aWYgKCFBcnJheS5pc0FycmF5KGFzc29jaWF0aW9uVmFsdWUpKSB7XG5cdFx0XHRcdFx0XHRhc3NvY2lhdGlvblZhbHVlID0gW2Fzc29jaWF0aW9uVmFsdWVdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRhc3NvY2lhdGlvblZhbHVlID0gYXNzb2NpYXRpb25WYWx1ZS5tYXAoKGFzc29jaWF0aW9uVmFsdWVFbGVtZW50OiBzdHJpbmcpID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiB0eXBlb2YgYXNzb2NpYXRpb25WYWx1ZUVsZW1lbnQgPT09IFwic3RyaW5nXCJcblx0XHRcdFx0XHRcdFx0PyBhc3NvY2lhdGlvblZhbHVlRWxlbWVudD8ucmVwbGFjZT8uKENPTlRST0xJRCwgXCJpZFwiKVxuXHRcdFx0XHRcdFx0XHQ6IGFzc29jaWF0aW9uVmFsdWVFbGVtZW50O1xuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0ZGF0YSArPSBgXFxuJHtnZXRUYWIoKX0gJHtvQ29udHJvbEtleX09XCIkeyhhc3NvY2lhdGlvblZhbHVlPy5qb2luPy4oXCIsXCIpID8/IGFzc29jaWF0aW9uVmFsdWUpIHx8IHVuZGVmaW5lZH1cImA7XG5cdFx0XHRcdH0gZWxzZSBpZiAoY29udHJvbC5tRXZlbnRSZWdpc3RyeS5oYXNPd25Qcm9wZXJ0eShvQ29udHJvbEtleSkpIHtcblx0XHRcdFx0XHRpZiAoY29udHJvbC5tRXZlbnRSZWdpc3RyeVtvQ29udHJvbEtleV1bMF0/LmZGdW5jdGlvbj8ubmFtZSkge1xuXHRcdFx0XHRcdFx0ZGF0YSArPSBgXFxuJHtnZXRUYWIoKX0gJHtvQ29udHJvbEtleX09XCIke2NvbnRyb2wubUV2ZW50UmVnaXN0cnlbb0NvbnRyb2xLZXldWzBdPy5mRnVuY3Rpb24/Lm5hbWV9XCJgO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRkYXRhICs9IGBcXG4ke2dldFRhYigpfSAke29Db250cm9sS2V5fT1cInNvbWVFdmVudEhhbmRsZXJcImA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoc2hvd0N1c3RvbVN0eWxlQ2xhc3NlcyAmJiBjb250cm9sLmFDdXN0b21TdHlsZUNsYXNzZXM/Lmxlbmd0aCA+IDApIHtcblx0XHRcdFx0ZGF0YSArPSBgXFxuJHtnZXRUYWIoKX0gY3VzdG9tU3R5bGVDbGFzc2VzIDogJHtjb250cm9sLmFDdXN0b21TdHlsZUNsYXNzZXMuam9pbihcIiwgXCIpfWA7XG5cdFx0XHR9XG5cdFx0XHRkYXRhICs9IGBcXG5gO1xuXHRcdFx0bGV0IGhhc0FnZ3JlZ2F0aW9uID0gZmFsc2U7XG5cdFx0XHRmb3IgKGNvbnN0IG1BZ2dyZWdhdGlvbnNLZXkgaW4gY29udHJvbC5tQWdncmVnYXRpb25zKSB7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHQoIUFycmF5LmlzQXJyYXkoY29udHJvbC5tQWdncmVnYXRpb25zW21BZ2dyZWdhdGlvbnNLZXldKSAmJlxuXHRcdFx0XHRcdFx0Y29udHJvbC5tQWdncmVnYXRpb25zW21BZ2dyZWdhdGlvbnNLZXldICE9PSBudWxsICYmXG5cdFx0XHRcdFx0XHRjb250cm9sLm1BZ2dyZWdhdGlvbnNbbUFnZ3JlZ2F0aW9uc0tleV0gIT09IHVuZGVmaW5lZCkgfHxcblx0XHRcdFx0XHQoQXJyYXkuaXNBcnJheShjb250cm9sLm1BZ2dyZWdhdGlvbnNbbUFnZ3JlZ2F0aW9uc0tleV0pICYmIGNvbnRyb2wubUFnZ3JlZ2F0aW9uc1ttQWdncmVnYXRpb25zS2V5XS5sZW5ndGggPiAwKVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRoYXNBZ2dyZWdhdGlvbiA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChoYXNBZ2dyZWdhdGlvbikge1xuXHRcdFx0XHRkYXRhICs9IFwiPlwiO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0fSxcblx0XHRzdGFydEFnZ3JlZ2F0aW9uOiBmdW5jdGlvbiAoY29udHJvbDogYW55LCBzTmFtZTogc3RyaW5nKSB7XG5cdFx0XHRjb25zdCBuYW1lc3BhY2VBbGlhcyA9IGdldE5hbWVzcGFjZUFsaWFzKGNvbnRyb2wuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCkpO1xuXHRcdFx0bGV0IG91dCA9IGBcXG4ke2dldFRhYigpfTwke25hbWVzcGFjZUFsaWFzfToke3NOYW1lfT5gO1xuXHRcdFx0dGFiQ291bnQrKztcblx0XHRcdG91dCArPSBgXFxuJHtnZXRUYWIoKX1gO1xuXHRcdFx0cmV0dXJuIG91dDtcblx0XHR9LFxuXHRcdGVuZEFnZ3JlZ2F0aW9uOiBmdW5jdGlvbiAoY29udHJvbDogYW55LCBzTmFtZTogc3RyaW5nKSB7XG5cdFx0XHR0YWJDb3VudC0tO1xuXHRcdFx0Y29uc3QgbmFtZXNwYWNlQWxpYXMgPSBnZXROYW1lc3BhY2VBbGlhcyhjb250cm9sLmdldE1ldGFkYXRhKCkuZ2V0TmFtZSgpKTtcblx0XHRcdGlmIChjb250cm9sLm1CaW5kaW5nSW5mb3Nbc05hbWVdKSB7XG5cdFx0XHRcdHJldHVybiBgXFxuJHtnZXRUYWIoKX08LyR7bmFtZXNwYWNlQWxpYXN9OiR7c05hbWV9PlxcbmA7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gYFxcbiR7Z2V0VGFiKCl9PC8ke25hbWVzcGFjZUFsaWFzfToke3NOYW1lfT5cXG5gO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0bGV0IG91dFhNTDtcblx0aWYgKEFycmF5LmlzQXJyYXkoY29udHJvbFRvU2VyaWFsaXplKSkge1xuXHRcdG91dFhNTCA9IGNvbnRyb2xUb1NlcmlhbGl6ZS5tYXAoKGNvbnRyb2xUb1JlbmRlcjogVUk1RWxlbWVudCkgPT4ge1xuXHRcdFx0cmV0dXJuIG5ldyBTZXJpYWxpemVyKGNvbnRyb2xUb1JlbmRlciwgc2VyaWFsaXplRGVsZWdhdGUpLnNlcmlhbGl6ZSgpO1xuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdG91dFhNTCA9IG5ldyBTZXJpYWxpemVyKGNvbnRyb2xUb1NlcmlhbGl6ZSwgc2VyaWFsaXplRGVsZWdhdGUpLnNlcmlhbGl6ZSgpO1xuXHR9XG5cdHJldHVybiBmb3JtYXRYTUwoYDxyb290PiR7b3V0WE1MfTwvcm9vdD5gKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUF3YWl0ZXIoKSB7XG5cdGxldCBmblJlc29sdmUhOiBGdW5jdGlvbjtcblx0Y29uc3QgbXlQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcblx0XHRmblJlc29sdmUgPSByZXNvbHZlO1xuXHR9KTtcblx0cmV0dXJuIHsgcHJvbWlzZTogbXlQcm9taXNlLCByZXNvbHZlOiBmblJlc29sdmUgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckJ1aWxkaW5nQmxvY2tXaXRoTW9kZWxzKGJ1aWxkaW5nQmxvY2s6IHsgZ2V0Q29udGVudDogRnVuY3Rpb24gfSwgbW9kZWxzOiB7IFtrZXk6IHN0cmluZ106IE1vZGVsIH0pOiBDb250cm9sIHtcblx0cmV0dXJuIChNYW5hZ2VkT2JqZWN0IGFzIE1hbmFnZWRPYmplY3RFeCkucnVuV2l0aFByZXByb2Nlc3NvcnMoXG5cdFx0KCkgPT4ge1xuXHRcdFx0cmV0dXJuIGJ1aWxkaW5nQmxvY2suZ2V0Q29udGVudCgpO1xuXHRcdH0sXG5cdFx0e1xuXHRcdFx0c2V0dGluZ3M6IGZ1bmN0aW9uIChjb250cm9sU2V0dGluZ3M6IHsgbW9kZWxzOiB1bmtub3duIH0pIHtcblx0XHRcdFx0Y29udHJvbFNldHRpbmdzLm1vZGVscyA9IG1vZGVscztcblx0XHRcdFx0cmV0dXJuIGNvbnRyb2xTZXR0aW5ncztcblx0XHRcdH1cblx0XHR9XG5cdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3Rlck1vY2tGcmFnbWVudHMoLi4uZnJhZ21lbnRzOiBNb2NrRnJhZ21lbnRbXSk6IGplc3QuU3B5SW5zdGFuY2Uge1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuXHRjb25zdCBvcmlnaW5hbExvYWRUZW1wbGF0ZSA9IChYTUxUZW1wbGF0ZVByb2Nlc3NvciBhcyBhbnkpLmxvYWRUZW1wbGF0ZVByb21pc2U7XG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5cdGNvbnN0IGxvYWRUZW1wbGF0ZVN0dWIgPSBqZXN0LnNweU9uKFhNTFRlbXBsYXRlUHJvY2Vzc29yIGFzIGFueSwgXCJsb2FkVGVtcGxhdGVQcm9taXNlXCIpO1xuXHRsb2FkVGVtcGxhdGVTdHViLm1vY2tJbXBsZW1lbnRhdGlvbigoKHRlbXBsYXRlTmFtZTogc3RyaW5nLCBleHRlbnNpb246IHN0cmluZykgPT4ge1xuXHRcdGZvciAoY29uc3QgZnJhZ21lbnQgb2YgZnJhZ21lbnRzKSB7XG5cdFx0XHRpZiAoZnJhZ21lbnQubmFtZSA9PT0gdGVtcGxhdGVOYW1lKSB7XG5cdFx0XHRcdHJldHVybiBwYXJzZVhNTFN0cmluZyhmcmFnbWVudC5jb250ZW50KVswXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG9yaWdpbmFsTG9hZFRlbXBsYXRlKHRlbXBsYXRlTmFtZSwgZXh0ZW5zaW9uKTtcblx0fSkgYXMgKCgpID0+IEVsZW1lbnQpIHwgdW5kZWZpbmVkKTtcblx0cmV0dXJuIGxvYWRUZW1wbGF0ZVN0dWI7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBhbiBhcHBDb21wb25lbnQgYW5kIHRlbXBsYXRlQ29tcG9uZW50IHdpdGggdGhlIGdpdmVuIG9wdGlvbnMuXG4gKiBAcGFyYW0gb3B0aW9uc1xuICogQHBhcmFtIG9wdGlvbnMuY2RzRmlsZSBUaGUgcGF0aCB0byB0aGUgQ0RTIGZpbGUgdG8gdXNlIGZvciB0aGUgYXBwQ29tcG9uZW50XG4gKiBAcGFyYW0gb3B0aW9ucy5tYWluQ29udGV4dFBhdGggVGhlIG1haW4gY29udGV4dCBwYXRoIHRvIHVzZSBmb3IgdGhlIGFwcENvbXBvbmVudFxuICogQHBhcmFtIG9wdGlvbnMucGFnZUNvbnRlbnQgVGhlIHBhZ2UgY29udGVudCB0byB1c2UgZm9yIHRoZSBhcHBDb21wb25lbnRcbiAqIEBwYXJhbSBvcHRpb25zLmNvbnRlbnQgVGhlIGNvbnRlbnQgdG8gdXNlIGZvciB0aGUgYXBwIENvbXBvbmVudFxuICogQHBhcmFtIG9wdGlvbnMuY29tcG9uZW50SWRcbiAqIEBwYXJhbSBvcHRpb25zLm1hbmlmZXN0U2V0dGluZ3NcbiAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHRvIHVzZSBmb3IgdGhlIGFwcENvbXBvbmVudFxuICogQHBhcmFtIHZpZXdMZXZlbCBUaGUgdmlldyBsZXZlbCB0byB1c2UgZm9yIHRoZSBhcHBDb21wb25lbnRcbiAqIEByZXR1cm5zIFRoZSBhcHBjb21wb25lbnQgYW5kIHRlbXBsYXRlQ29tcG9uZW50IHRvIHVzZSBmb3IgdGVzdGluZ1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5pdGlhbGl6ZUFwcENvbXBvbmVudChcblx0b3B0aW9ucz86IHtcblx0XHRjZHNGaWxlPzogc3RyaW5nO1xuXHRcdGNvbXBvbmVudElkPzogc3RyaW5nO1xuXHRcdG1haW5Db250ZXh0UGF0aD86IHN0cmluZztcblx0XHRwYWdlQ29udGVudD86IEZ1bmN0aW9uO1xuXHRcdG1hbmlmZXN0U2V0dGluZ3M/OiBQYXJ0aWFsPExpc3RSZXBvcnRNYW5pZmVzdFNldHRpbmdzIHwgT2JqZWN0UGFnZU1hbmlmZXN0U2V0dGluZ3M+O1xuXHRcdGNvbnRlbnQ/OiB7fTtcblx0fSxcblx0bmFtZT86IHN0cmluZyxcblx0dmlld0xldmVsPzogbnVtYmVyXG4pOiBQcm9taXNlPHsgYXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQ7IHRlbXBsYXRlQ29tcG9uZW50OiBUZW1wbGF0ZUNvbXBvbmVudCB9PiB7XG5cdGxldCBjZHNGaWxlID0gb3B0aW9ucz8uY2RzRmlsZTtcblx0aWYgKCFjZHNGaWxlKSB7XG5cdFx0Y2RzRmlsZSA9IGNvbXBpbGVDRFMocGF0aC5qb2luKF9fZGlybmFtZSwgXCIuL2RhdGEvUHJvZHVjdHMuY2RzXCIpKTtcblx0fVxuXHRjb25zdCBndWlkID0gdWlkKCk7XG5cdGNvbnN0IGlkID0gb3B0aW9ucz8uY29tcG9uZW50SWQgPz8gYHNhcC5mZS50ZXN0LiR7Z3VpZH1gO1xuXHRjb25zdCBjZHNDb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGNkc0ZpbGUpLnRvU3RyaW5nKCk7XG5cdHNhcC5qZXN0LnJlZ2lzdGVyRmFrZUZyYWdtZW50KGAvc2FwL2ZlL2NvcmUvbW9jay8ke2d1aWR9LyRtZXRhZGF0YT9zYXAtbGFuZ3VhZ2U9RU5gLCBjZHNDb250ZW50KTtcblx0Y2xhc3MgRGVmYXVsdFBhZ2VDb250ZW50IGV4dGVuZHMgUGFnZUNvbnRyb2xsZXIge1xuXHRcdHJlbmRlcigpIHtcblx0XHRcdHJldHVybiA8UGFnZT48L1BhZ2U+O1xuXHRcdH1cblx0fVxuXHRzYXAudWkuZGVmaW5lKGBzYXAvZmUvdGVzdC8ke2d1aWR9L0NvbXBvbmVudGAsIFtcInNhcC9mZS9jb3JlL0FwcENvbXBvbmVudFwiXSwgZnVuY3Rpb24gKF9BcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudCkge1xuXHRcdFwidXNlIHN0cmljdFwiO1xuXG5cdFx0cmV0dXJuIEFwcENvbXBvbmVudC5leHRlbmQoYHNhcC5mZS50ZXN0LiR7Z3VpZH0uQ29tcG9uZW50YCwge1xuXHRcdFx0bWV0YWRhdGE6IHtcblx0XHRcdFx0bWFuaWZlc3Q6IHtcblx0XHRcdFx0XHRcInNhcC5hcHBcIjoge1xuXHRcdFx0XHRcdFx0aWQ6IGB0ZXN0JHtndWlkfWAsXG5cdFx0XHRcdFx0XHRkYXRhU291cmNlczoge1xuXHRcdFx0XHRcdFx0XHRtYWluU2VydmljZToge1xuXHRcdFx0XHRcdFx0XHRcdHVyaTogYC9zYXAvZmUvY29yZS9tb2NrLyR7Z3VpZH0vYCxcblx0XHRcdFx0XHRcdFx0XHR0eXBlOiBcIk9EYXRhXCIsXG5cdFx0XHRcdFx0XHRcdFx0c2V0dGluZ3M6IHtcblx0XHRcdFx0XHRcdFx0XHRcdG9kYXRhVmVyc2lvbjogXCI0LjBcIlxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XCJzYXAudWk1XCI6IHtcblx0XHRcdFx0XHRcdG1vZGVsczoge1xuXHRcdFx0XHRcdFx0XHRcIlwiOiB7XG5cdFx0XHRcdFx0XHRcdFx0ZGF0YVNvdXJjZTogXCJtYWluU2VydmljZVwiLFxuXHRcdFx0XHRcdFx0XHRcdHNldHRpbmdzOiB7fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0cm91dGluZzoge1xuXHRcdFx0XHRcdFx0XHR0YXJnZXRzOiB7XG5cdFx0XHRcdFx0XHRcdFx0RGVmYXVsdDoge1xuXHRcdFx0XHRcdFx0XHRcdFx0dHlwZTogXCJDb21wb25lbnRcIixcblx0XHRcdFx0XHRcdFx0XHRcdG5hbWU6IG5hbWUgPz8gXCJzYXAuZmUuY29yZS5mcG1cIixcblx0XHRcdFx0XHRcdFx0XHRcdGlkOiBcIkRlZmF1bHRcIixcblx0XHRcdFx0XHRcdFx0XHRcdHZpZXdMZXZlbDogdmlld0xldmVsLFxuXHRcdFx0XHRcdFx0XHRcdFx0b3B0aW9uczoge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRzZXR0aW5nczoge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC4uLihvcHRpb25zPy5tYW5pZmVzdFNldHRpbmdzID8/IHt9KSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb250ZXh0UGF0aDogb3B0aW9ucz8ubWFpbkNvbnRleHRQYXRoID8/IFwiL1Byb2R1Y3RzXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dmlld1R5cGU6IFwiSlNYXCIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dmlld0NvbnRlbnQ6IG9wdGlvbnM/LnBhZ2VDb250ZW50ID8/IERlZmF1bHRQYWdlQ29udGVudCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb250ZW50OiBvcHRpb25zPy5jb250ZW50XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHJvdXRlczogW1xuXHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdHBhdHRlcm46IFwiOj9xdWVyeTpcIixcblx0XHRcdFx0XHRcdFx0XHRcdG5hbWU6IFwiRGVmYXVsdFwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0dGFyZ2V0OiBcIkRlZmF1bHRcIlxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9KTtcblx0Y29uc3QgbW9ja0FwcENvbXBvbmVudCA9IChhd2FpdCBDb21wb25lbnQuY3JlYXRlKHsgbmFtZTogYHNhcC5mZS50ZXN0LiR7Z3VpZH1gLCBpZDogaWQgfSkpIGFzIEFwcENvbXBvbmVudDtcblxuXHRhd2FpdCBtb2NrQXBwQ29tcG9uZW50LmluaXRpYWxpemVkO1xuXHRjb25zdCB2ID0gYXdhaXQgKG1vY2tBcHBDb21wb25lbnQuZ2V0Um91dGVyKCkuZ2V0VGFyZ2V0KFwiRGVmYXVsdFwiKSBhcyB7IGxvYWQ/OiBGdW5jdGlvbiB9KS5sb2FkPy4oKTtcblx0cmV0dXJuIHsgYXBwQ29tcG9uZW50OiBtb2NrQXBwQ29tcG9uZW50LCB0ZW1wbGF0ZUNvbXBvbmVudDogdi5vYmplY3QgfTtcbn1cblxuLyoqXG4gKiBGaW5kIGFuIGVsZW1lbnQgaW4gYSBjb2xsZWN0aW9uIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gc2VsZWN0b3IuXG4gKiBAcGFyYW0gY29sbGVjdGlvblxuICogQHBhcmFtIHNlbGVjdG9yXG4gKiBAcmV0dXJucyBUaGUgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIHNlbGVjdG9yIG9yIHVuZGVmaW5lZCBpZiBubyBlbGVtZW50IG1hdGNoZXMgdGhlIHNlbGVjdG9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRWxlbWVudChjb2xsZWN0aW9uOiBIVE1MQ29sbGVjdGlvbiwgc2VsZWN0b3I6IChlbGVtZW50OiBIVE1MRWxlbWVudCkgPT4gYm9vbGVhbik6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkIHtcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBjb2xsZWN0aW9uLmxlbmd0aDsgaSsrKSB7XG5cdFx0Y29uc3QgZWxlbWVudCA9IGNvbGxlY3Rpb24uaXRlbShpKSBhcyBIVE1MRWxlbWVudDtcblx0XHRpZiAoc2VsZWN0b3IoZWxlbWVudCkpIHtcblx0XHRcdHJldHVybiBlbGVtZW50O1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFdhaXQgZm9yIGFuIGV2ZW50IHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nLlxuICogQHBhcmFtIGNvbnRyb2xcbiAqIEBwYXJhbSBldmVudE5hbWVcbiAqIEByZXR1cm5zIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGV2ZW50IGlzIHJlY2VpdmVkXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3YWl0Rm9yRXZlbnQoY29udHJvbDogRXZlbnRQcm92aWRlciwgZXZlbnROYW1lOiBzdHJpbmcpOiBQcm9taXNlPEV2ZW50PiB7XG5cdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXHRcdGNvbnRyb2wuYXR0YWNoRXZlbnRPbmNlKGV2ZW50TmFtZSwgKGV2ZW50OiBFdmVudCkgPT4ge1xuXHRcdFx0cmVzb2x2ZShldmVudCk7XG5cdFx0fSk7XG5cdH0pO1xufVxuXG4vKipcbiAqIFRlbGwgdGhlIGJpbmRpbmcgcGFyc2VyIHRvIGtlZXAgdGhlIGJpbmRpbmcgc3RyaW5ncyBmb3IgdGVzdGluZy5cbiAqIEBwYXJhbSBlbmFibGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBrZWVwQmluZGluZ1N0cmluZ0ZvclRlc3QoZW5hYmxlZDogYm9vbGVhbik6IHZvaWQge1xuXHRCaW5kaW5nUGFyc2VyLl9rZWVwQmluZGluZ1N0cmluZ3MgPSBlbmFibGVkO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0VBdUVBQSxHQUFHLENBQUNDLFFBQVEsQ0FBQyxDQUFDLEVBQVMsa0NBQWtDLENBQUM7RUFDMURDLElBQUksQ0FBQ0MsVUFBVSxDQUFDLEtBQUssQ0FBQztFQUV0QixNQUFNQyxZQUFvQyxHQUFHO0lBQzVDQyxLQUFLLEVBQUUsZUFBZTtJQUN0QkMsTUFBTSxFQUFFLGVBQWU7SUFDdkJDLElBQUksRUFBRSx1Q0FBdUM7SUFDN0NDLFVBQVUsRUFBRSxxQkFBcUI7SUFDakNDLFNBQVMsRUFBRSxrRUFBa0U7SUFDN0VDLEdBQUcsRUFBRSxrRUFBa0U7SUFDdkVDLFVBQVUsRUFBRSxrRUFBa0U7SUFDOUVDLE9BQU8sRUFBRSxzQkFBc0I7SUFDL0JDLFFBQVEsRUFBRSx3QkFBd0I7SUFDbENDLElBQUksRUFBRSxhQUFhO0lBQ25CQyxFQUFFLEVBQUUsV0FBVztJQUNmQyxDQUFDLEVBQUUsT0FBTztJQUNWQyxDQUFDLEVBQUUsb0JBQW9CO0lBQ3ZCQyxFQUFFLEVBQUUsV0FBVztJQUNmQyxhQUFhLEVBQUUsd0JBQXdCO0lBQ3ZDQyxHQUFHLEVBQUUsWUFBWTtJQUNqQkMsYUFBYSxFQUFFLDBCQUEwQjtJQUN6Q0MsUUFBUSxFQUFFLGtCQUFrQjtJQUM1QkMsUUFBUSxFQUFFLGtCQUFrQjtJQUM1QkMsQ0FBQyxFQUFFLGdCQUFnQjtJQUNuQkMsSUFBSSxFQUFFLFVBQVU7SUFDaEJDLGVBQWUsRUFBRSwwQkFBMEI7SUFDM0NDLFVBQVUsRUFBRSx5QkFBeUI7SUFDckNDLFVBQVUsRUFBRSxxQkFBcUI7SUFDakNDLEtBQUssRUFBRSw4QkFBOEI7SUFDckNDLElBQUksRUFBRSxzQkFBc0I7SUFDNUJDLFNBQVMsRUFBRSx5QkFBeUI7SUFDcENDLGVBQWUsRUFBRSwrQkFBK0I7SUFDaERDLFNBQVMsRUFBRSx5QkFBeUI7SUFDcENDLFVBQVUsRUFBRSxrQ0FBa0M7SUFDOUNDLGNBQWMsRUFBRTtFQUNqQixDQUFDO0VBQ0QsTUFBTUMsa0JBQWtCLEdBQUdDLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDbEMsWUFBWSxDQUFDLENBQUNtQyxNQUFNLENBQUMsQ0FBQ0MsVUFBa0MsRUFBRUMsV0FBVyxLQUFLO0lBQ2hIRCxVQUFVLENBQUNwQyxZQUFZLENBQUNxQyxXQUFXLENBQUMsQ0FBQyxHQUFHQSxXQUFXO0lBQ25ELE9BQU9ELFVBQVU7RUFDbEIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0VBQ04sTUFBTUUsTUFBTSxHQUFHQyxLQUFLLENBQUNDLGFBQWEsQ0FBQ3hDLFlBQVksQ0FBQztFQUVoRCxNQUFNeUMsNEJBQTRCLEdBQUc7SUFBRUMsb0JBQW9CLEVBQUVBLENBQUEsS0FBTTtFQUFHLENBQUM7RUFFdkUsU0FBU0MscUJBQXFCQSxDQUFDQyxNQUFZLEVBQUVDLFFBQWdCLEVBQVU7SUFDdEU7QUFDRDtBQUNBO0FBQ0E7SUFDQyxNQUFNQyxRQUFRLEdBQUcsT0FBTztJQUN4QixPQUFPLEdBQUdGLE1BQU0sQ0FBQ0csUUFBUSxLQUFLLE1BQU0sSUFBSSxDQUFDRixRQUFRLENBQUNHLFVBQVUsQ0FBQ0YsUUFBUSxDQUFDLEdBQUdBLFFBQVEsR0FBRyxFQUFFLEdBQUdELFFBQVEsRUFBRTtFQUNwRztFQUVBLGVBQWVJLDBCQUEwQkEsQ0FDeENDLFlBQWdDLEVBQ2hDQyxnQkFBeUMsRUFDekNDLE9BQTZCLEVBQzdCQyxxQkFBK0IsRUFDSztJQUNwQyxJQUFJQyxVQUFzQztJQUMxQyxJQUFJSixZQUFZLEVBQUU7TUFDakJJLFVBQVUsR0FBRyxNQUFNQyxZQUFZLENBQUNMLFlBQVksQ0FBQztNQUM3QztNQUNBO01BQ0EsSUFBSSxDQUFDRSxPQUFPLENBQUNJLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFO1FBQ2hESixPQUFPLEdBQUduQixNQUFNLENBQUN3QixNQUFNLENBQUNMLE9BQU8sRUFBRTtVQUFFTSxnQkFBZ0IsRUFBRSxJQUFJQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUVMLFVBQVc7UUFBRSxDQUFDLENBQUM7TUFDM0Y7TUFFQXJCLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDa0IsT0FBTyxDQUFDLENBQUNRLE9BQU8sQ0FBQyxVQUFVQyxVQUFVLEVBQUU7UUFDbEQsSUFBSVQsT0FBTyxDQUFDUyxVQUFVLENBQUMsSUFBSVQsT0FBTyxDQUFDUyxVQUFVLENBQUMsQ0FBQ0MsZUFBZSxFQUFFO1VBQy9EVixPQUFPLENBQUNTLFVBQVUsQ0FBQyxHQUFHLElBQUlGLGFBQWEsQ0FBQ1AsT0FBTyxDQUFDUyxVQUFVLENBQUMsQ0FBQ0UsSUFBSSxFQUFFVCxVQUFXLENBQUM7UUFDL0U7TUFDRCxDQUFDLENBQUM7SUFDSDtJQUVBLE1BQU1VLFFBQWEsR0FBRztNQUNyQkMsTUFBTSxFQUFFaEMsTUFBTSxDQUFDd0IsTUFBTSxDQUNwQjtRQUNDUyxTQUFTLEVBQUVaO01BQ1osQ0FBQyxFQUNERixPQUNELENBQUM7TUFDRGUsZUFBZSxFQUFFLENBQUMsQ0FBQztNQUNuQkMsWUFBWSxFQUFFO1FBQUVDLHFCQUFxQixFQUFFdkUsSUFBSSxDQUFDd0UsRUFBRSxDQUFDLENBQUM7UUFBRUMsY0FBYyxFQUFFQSxDQUFBLEtBQU1DLFNBQVM7UUFBRUMsZ0JBQWdCLEVBQUUzRSxJQUFJLENBQUN3RSxFQUFFLENBQUM7TUFBRTtJQUNoSCxDQUFDO0lBRUROLFFBQVEsQ0FBQ0ksWUFBWSxDQUFDQyxxQkFBcUIsQ0FBQ0ssZUFBZSxDQUFDckIscUJBQXFCLElBQUlaLDRCQUE0QixDQUFDO0lBQ2xIO0lBQ0FSLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDaUIsZ0JBQWdCLENBQUMsQ0FBQ1MsT0FBTyxDQUFDLFVBQVVlLElBQUksRUFBRTtNQUNyRDtNQUNBQyxNQUFNLENBQUMsT0FBT3RCLFVBQVUsRUFBRXVCLFNBQVMsQ0FBQzFCLGdCQUFnQixDQUFDd0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDRyxXQUFXLENBQUMsQ0FBQztNQUMxRSxNQUFNQyxNQUFNLEdBQUczQixPQUFPLENBQUN1QixJQUFJLENBQUMsSUFBSXJCLFVBQVU7TUFDMUNVLFFBQVEsQ0FBQ0csZUFBZSxDQUFDUSxJQUFJLENBQUMsR0FBR0ksTUFBTSxDQUFDQyxvQkFBb0IsQ0FBQzdCLGdCQUFnQixDQUFDd0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO01BQ3RGWCxRQUFRLENBQUNDLE1BQU0sQ0FBQ1UsSUFBSSxDQUFDLEdBQUdJLE1BQU07SUFDL0IsQ0FBQyxDQUFDO0lBQ0YsT0FBT2YsUUFBUTtFQUNoQjtFQUVBLFNBQVNpQixpQkFBaUJBLENBQUNDLFFBQWdCLEVBQVc7SUFDckQsTUFBTUMsSUFBSSxHQUFHRCxRQUFRLENBQUNFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsV0FBVztJQUN2RCxNQUFNQyxJQUFJLEdBQUdDLGdCQUFnQixDQUFDQyxZQUFZLENBQUNKLElBQUksQ0FBQztJQUNoRCxPQUFPRSxJQUFJLENBQUNHLGVBQWU7RUFDNUI7RUFFTyxNQUFNQyxhQUFhLEdBQUcsU0FBQUEsQ0FBVTVDLFFBQWdCLEVBQUVELE1BQXdCLEVBQUU7SUFDbEYsT0FBT04sTUFBTSxDQUFDTyxRQUFRLEVBQUVELE1BQU0sQ0FBQztFQUNoQyxDQUFDO0VBRURnQyxNQUFNLENBQUNjLE1BQU0sQ0FBQztJQUNiQyxhQUFhQSxDQUFDL0MsTUFBTSxFQUFFQyxRQUFRLEVBQUU7TUFDL0IsTUFBTStDLEtBQUssR0FBR0gsYUFBYSxDQUFDOUMscUJBQXFCLENBQUNDLE1BQU0sRUFBRUMsUUFBUSxDQUFDLEVBQUVELE1BQU0sQ0FBQztNQUM1RSxPQUFPO1FBQ05pRCxPQUFPLEVBQUVBLENBQUEsS0FBTTtVQUNkLE1BQU1DLFNBQVMsR0FBR0MsWUFBWSxDQUFDbkQsTUFBTSxDQUFDO1VBQ3RDLE9BQU8sa0NBQWtDQyxRQUFRLHdCQUF3QmlELFNBQVMsRUFBRTtRQUNyRixDQUFDO1FBQ0RFLElBQUksRUFBRUosS0FBSyxJQUFJQSxLQUFLLENBQUNLLE1BQU0sSUFBSTtNQUNoQyxDQUFDO0lBQ0YsQ0FBQztJQUNEQyxnQkFBZ0JBLENBQUN0RCxNQUFNLEVBQUVDLFFBQVEsRUFBRTtNQUNsQyxNQUFNK0MsS0FBSyxHQUFHSCxhQUFhLENBQUM5QyxxQkFBcUIsQ0FBQ0MsTUFBTSxFQUFFQyxRQUFRLENBQUMsRUFBRUQsTUFBTSxDQUFDO01BQzVFLE9BQU87UUFDTmlELE9BQU8sRUFBRUEsQ0FBQSxLQUFNO1VBQ2QsTUFBTUMsU0FBUyxHQUFHQyxZQUFZLENBQUNuRCxNQUFNLENBQUM7VUFDdEMsT0FBTywrQkFBK0JDLFFBQVEsd0JBQXdCaUQsU0FBUyxFQUFFO1FBQ2xGLENBQUM7UUFDREUsSUFBSSxFQUFFSixLQUFLLElBQUlBLEtBQUssQ0FBQ0ssTUFBTSxLQUFLO01BQ2pDLENBQUM7SUFDRixDQUFDO0lBQ0Q7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0lBQ0NFLHNCQUFzQkEsQ0FBQ0MsR0FBa0IsRUFBRTtNQUMxQyxNQUFNQyxPQUFPLEdBQUcsT0FBT0QsR0FBRyxLQUFLLFFBQVEsR0FBR0EsR0FBRyxHQUFHTCxZQUFZLENBQUNLLEdBQUcsQ0FBQztNQUNqRSxNQUFNRSxhQUF1QixHQUFHRCxPQUFPLENBQUNFLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxJQUFLLEVBQWU7TUFDckcsTUFBTUMsYUFBdUIsR0FBR0YsYUFBYSxDQUFDRyxHQUFHLENBQUVaLE9BQWUsSUFBSztRQUN0RSxJQUFJQSxPQUFPLElBQUlBLE9BQU8sQ0FBQ0ksTUFBTSxHQUFHLENBQUMsRUFBRTtVQUNsQyxPQUFPUyxJQUFJLENBQUNiLE9BQU8sQ0FBQ1UsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFSSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzVEO1FBQ0EsT0FBTyxFQUFFO01BQ1YsQ0FBQyxDQUFDO01BQ0YsSUFBSUgsYUFBYSxDQUFDUCxNQUFNLElBQUksQ0FBQyxFQUFFO1FBQzlCLE9BQU87VUFDTkosT0FBTyxFQUFFQSxDQUFBLEtBQU0sK0JBQStCO1VBQzlDRyxJQUFJLEVBQUU7UUFDUCxDQUFDO01BQ0YsQ0FBQyxNQUFNO1FBQ04sT0FBTztVQUNOSCxPQUFPLEVBQUVBLENBQUEsS0FBTVcsYUFBYSxDQUFDSSxJQUFJLENBQUMsSUFBSSxDQUFDO1VBQ3ZDWixJQUFJLEVBQUU7UUFDUCxDQUFDO01BQ0Y7SUFDRDtFQUNELENBQUMsQ0FBQztFQUFDYSxRQUFBLENBQUFwQixhQUFBLEdBQUFBLGFBQUE7RUFFSSxNQUFNcUIsc0JBQXNCLEdBQUcsU0FBQUEsQ0FBVUMsU0FBNEIsRUFBVTtJQUNyRixJQUFJQyxLQUFLLENBQUNDLE9BQU8sQ0FBQ0YsU0FBUyxDQUFDLEVBQUU7TUFDN0JBLFNBQVMsR0FBR0EsU0FBUyxDQUFDSCxJQUFJLENBQUMsRUFBRSxDQUFDO0lBQy9CO0lBQ0EsT0FBT00sU0FBUyxDQUFDSCxTQUFTLENBQUM7RUFDNUIsQ0FBQztFQUFDRixRQUFBLENBQUFDLHNCQUFBLEdBQUFBLHNCQUFBO0VBRUssTUFBTUssbUJBQW1CLEdBQUcsU0FBQUEsQ0FBVUMsZUFBdUIsRUFBRUMsYUFBcUIsRUFBRUMsTUFBWSxFQUFFO0lBQzFHLE1BQU16RSxRQUFRLEdBQUcsVUFBVUYscUJBQXFCLENBQUMyRSxNQUFNLEVBQUVGLGVBQWUsQ0FBQyxLQUFLQyxhQUFhLEdBQUc7SUFDOUYsT0FBTzVCLGFBQWEsQ0FBQzVDLFFBQVEsRUFBRXlFLE1BQU0sQ0FBQztFQUN2QyxDQUFDOztFQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUxBVCxRQUFBLENBQUFNLG1CQUFBLEdBQUFBLG1CQUFBO0VBTU8sTUFBTXBCLFlBQVksR0FBRyxTQUFBQSxDQUFVdUIsTUFBWSxFQUFFekUsUUFBaUIsRUFBRTtJQUN0RSxNQUFNMEUsVUFBVSxHQUFHLElBQUlDLE1BQU0sQ0FBQ0MsYUFBYSxDQUFDLENBQUM7SUFDN0MsSUFBSVYsU0FBaUI7SUFDckIsSUFBSWxFLFFBQVEsRUFBRTtNQUNiLE1BQU0rQyxLQUFLLEdBQUdILGFBQWEsQ0FBQzVDLFFBQVEsRUFBRXlFLE1BQU0sQ0FBVztNQUN2RFAsU0FBUyxHQUFHbkIsS0FBSyxDQUFDYSxHQUFHLENBQUVpQixJQUFJLElBQUtILFVBQVUsQ0FBQ0ksaUJBQWlCLENBQUNELElBQUksQ0FBQyxDQUFDLENBQUNkLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDL0UsQ0FBQyxNQUFNO01BQ05HLFNBQVMsR0FBR1EsVUFBVSxDQUFDSSxpQkFBaUIsQ0FBQ0wsTUFBTSxDQUFDO0lBQ2pEO0lBQ0EsT0FBT0osU0FBUyxDQUFDSCxTQUFTLENBQUM7RUFDNUIsQ0FBQzs7RUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQVRBRixRQUFBLENBQUFkLFlBQUEsR0FBQUEsWUFBQTtFQVVPLE1BQU1tQixTQUFTLEdBQUcsU0FBQUEsQ0FBVUgsU0FBaUIsRUFBVTtJQUM3RCxNQUFNYSxLQUFLLEdBQUcsV0FBVztNQUN4QkMsR0FBRyxHQUFHLFlBQVk7TUFDbEJDLEdBQUcsR0FBRyx3QkFBd0I7TUFDOUJDLElBQUksR0FBRyxtQkFBbUI7TUFDMUJDLEtBQWUsR0FBRyxFQUFFO0lBRXJCLElBQUlDLFdBQVcsR0FBRyxFQUFFO01BQ25CQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO01BQ1ZDLFVBQThDLEdBQUcsRUFBRTtJQUVwRCxTQUFTQyxPQUFPQSxDQUFBLEVBQUc7TUFDbEIsSUFBSUgsV0FBVyxJQUFJQSxXQUFXLEtBQUtMLEtBQUssRUFBRTtRQUN6Q0ksS0FBSyxDQUFDSyxJQUFJLENBQUNKLFdBQVcsQ0FBQztNQUN4QjtNQUVBQSxXQUFXLEdBQUdDLEtBQUssR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDSSxNQUFNLENBQUNKLEtBQUssQ0FBQyxHQUFHLEVBQUU7SUFDbEQ7SUFFQSxTQUFTSyxnQkFBZ0JBLENBQUEsRUFBRztNQUMzQixJQUFJSixVQUFVLENBQUNsQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQzFCa0MsVUFBVSxHQUFHQSxVQUFVLENBQUNLLElBQUksQ0FBQyxDQUFDQyxDQUFDLEVBQUVDLENBQUMsS0FBSztVQUN0QyxJQUFJRCxDQUFDLENBQUN0RCxJQUFJLENBQUNuQyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQzBGLENBQUMsQ0FBQ3ZELElBQUksQ0FBQ25DLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUM5RCxPQUFPLENBQUMsQ0FBQztVQUNWLENBQUMsTUFBTSxJQUFJLENBQUN5RixDQUFDLENBQUN0RCxJQUFJLENBQUNuQyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUkwRixDQUFDLENBQUN2RCxJQUFJLENBQUNuQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDckUsT0FBTyxDQUFDO1VBQ1QsQ0FBQyxNQUFNLElBQUl5RixDQUFDLENBQUN0RCxJQUFJLENBQUNuQyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUkwRixDQUFDLENBQUN2RCxJQUFJLENBQUNuQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDcEUsT0FBT3lGLENBQUMsQ0FBQ3RELElBQUksQ0FBQ3dELGFBQWEsQ0FBQ0QsQ0FBQyxDQUFDdkQsSUFBSSxDQUFDO1VBQ3BDLENBQUMsTUFBTSxJQUFJc0QsQ0FBQyxDQUFDdEQsSUFBSSxDQUFDeUQsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUNGLENBQUMsQ0FBQ3ZELElBQUksQ0FBQ3lELFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUN6RCxPQUFPLENBQUMsQ0FBQztVQUNWLENBQUMsTUFBTSxJQUFJLENBQUNILENBQUMsQ0FBQ3RELElBQUksQ0FBQ3lELFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSUYsQ0FBQyxDQUFDdkQsSUFBSSxDQUFDeUQsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3pELE9BQU8sQ0FBQztVQUNULENBQUMsTUFBTTtZQUNOLE9BQU9ILENBQUMsQ0FBQ3RELElBQUksQ0FBQ3dELGFBQWEsQ0FBQ0QsQ0FBQyxDQUFDdkQsSUFBSSxDQUFDO1VBQ3BDO1FBQ0QsQ0FBQyxDQUFDO1FBRUYrQyxLQUFLLEVBQUU7UUFDUCxLQUFLLE1BQU1XLFNBQVMsSUFBSVYsVUFBVSxFQUFFO1VBQ25DQyxPQUFPLENBQUMsQ0FBQztVQUNUSCxXQUFXLElBQUlZLFNBQVMsQ0FBQzFELElBQUk7VUFDN0IsSUFBSTBELFNBQVMsQ0FBQ0MsS0FBSyxFQUFFYixXQUFXLElBQUlZLFNBQVMsQ0FBQ0MsS0FBSztRQUNwRDtRQUNBWixLQUFLLEVBQUU7UUFDUEMsVUFBVSxHQUFHLEVBQUU7UUFDZkMsT0FBTyxDQUFDLENBQUM7TUFDVjtJQUNEO0lBRUEsU0FBU1csTUFBTUEsQ0FBQ2hGLElBQVcsRUFBRTtNQUM1QmtFLFdBQVcsSUFBSWUsTUFBTSxDQUFDQyxJQUFJLENBQUNsRixJQUFJLENBQUM7SUFDakM7SUFFQSxNQUFNaUYsTUFBTSxHQUFHRSxZQUFZLENBQUM7TUFDM0JDLGNBQWNBLENBQUNwRixJQUFXLEVBQUU7UUFDM0JxRSxPQUFPLENBQUMsQ0FBQztRQUNUVyxNQUFNLENBQUNoRixJQUFJLENBQUM7TUFDYixDQUFDO01BRURxRixhQUFhLEVBQUVMLE1BQU07TUFFckJNLFVBQVVBLENBQUN0RixJQUFXLEVBQUU7UUFDdkJvRSxVQUFVLENBQUNtQixPQUFPLENBQUM7VUFBRW5FLElBQUksRUFBRTZELE1BQU0sQ0FBQ0MsSUFBSSxDQUFDbEYsSUFBSTtRQUFFLENBQUMsQ0FBQztNQUNoRCxDQUFDO01BRUR3RixXQUFXQSxDQUFDeEYsSUFBc0IsRUFBRTtRQUNuQ29FLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQ1csS0FBSyxHQUFHRSxNQUFNLENBQUNDLElBQUksQ0FBQ2xGLElBQUksQ0FBQyxDQUFDcUIsT0FBTyxDQUFDMEMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDakVLLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQ1csS0FBSyxHQUFHRSxNQUFNLENBQUNDLElBQUksQ0FBQ2xGLElBQUksQ0FBQyxDQUFDcUIsT0FBTyxDQUFDMkMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7TUFDOUQsQ0FBQztNQUVEeUIsWUFBWUEsQ0FBQ3pGLElBQXVCLEVBQUU7UUFDckN3RSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2xCUSxNQUFNLENBQUNoRixJQUFJLENBQUM7UUFDWixJQUFJLENBQUNBLElBQUksQ0FBQzBGLFVBQVUsRUFBRXZCLEtBQUssRUFBRTtNQUM5QixDQUFDO01BRUR3QixlQUFlQSxDQUFDM0YsSUFBVyxFQUFFO1FBQzVCbUUsS0FBSyxFQUFFO1FBQ1BFLE9BQU8sQ0FBQyxDQUFDO1FBQ1RXLE1BQU0sQ0FBQ2hGLElBQUksQ0FBQztNQUNiLENBQUM7TUFFRDRGLGNBQWMsRUFBRVosTUFBTTtNQUN0QmEsYUFBYSxFQUFFYjtJQUNoQixDQUFDLENBQUM7SUFFRkMsTUFBTSxDQUFDYSxLQUFLLENBQUNqQyxLQUFLLEdBQUdiLFNBQVMsR0FBR2MsR0FBRyxDQUFDO0lBQ3JDLE9BQU9HLEtBQUssQ0FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQ2tELElBQUksQ0FBQyxDQUFDO0VBQy9CLENBQUM7O0VBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFOQWpELFFBQUEsQ0FBQUssU0FBQSxHQUFBQSxTQUFBO0VBT08sTUFBTTZDLFVBQVUsR0FBRyxTQUFBQSxDQUFVQyxNQUFjLEVBQXVDO0lBQUEsSUFBckNDLE9BQThCLEdBQUFDLFNBQUEsQ0FBQWpFLE1BQUEsUUFBQWlFLFNBQUEsUUFBQTFGLFNBQUEsR0FBQTBGLFNBQUEsTUFBRyxDQUFDLENBQUM7SUFDdEYsTUFBTUMsU0FBUyxHQUFHQyxFQUFFLENBQUNDLFlBQVksQ0FBQ0wsTUFBTSxFQUFFLE9BQU8sQ0FBQztJQUNsRCxNQUFNTSxXQUFXLEdBQUdDLFFBQVEsQ0FBQ0osU0FBUyxFQUFFLHlCQUF5QixFQUFFRixPQUFPLENBQUM7SUFDM0UsTUFBTU8sR0FBRyxHQUFHQyxJQUFJLENBQUNDLE9BQU8sQ0FBQ1YsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUM7O0lBRTdDO0lBQ0E7SUFDQSxNQUFNVyxVQUFVLEdBQUcxSSxNQUFNLENBQUMySSxPQUFPLENBQUNYLE9BQU8sQ0FBQztJQUMxQ1UsVUFBVSxDQUFDbkMsSUFBSSxDQUFDLENBQUNDLENBQUMsRUFBRUMsQ0FBQyxLQUFLQSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUNDLGFBQWEsQ0FBQ0YsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFbkQsTUFBTW9DLFlBQVksR0FDakJGLFVBQVUsQ0FBQ3hJLE1BQU0sQ0FDaEIsQ0FBQzJJLFFBQVEsRUFBQUMsSUFBQTtNQUFBLElBQUUsQ0FBQ0MsU0FBUyxFQUFFQyxXQUFXLENBQUMsR0FBQUYsSUFBQTtNQUFBLE9BQUssR0FBR0QsUUFBUSxJQUFJRSxTQUFTLElBQUlDLFdBQVcsQ0FBQ0MsUUFBUSxDQUFDLENBQUMsR0FBRztJQUFBLEdBQzdGVCxJQUFJLENBQUNVLFFBQVEsQ0FBQ25CLE1BQU0sQ0FBQyxDQUFDNUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQ3pDLENBQUMsR0FBRyxNQUFNO0lBRVgsTUFBTWdHLFlBQVksR0FBR1gsSUFBSSxDQUFDQyxPQUFPLENBQUNGLEdBQUcsRUFBRUssWUFBWSxDQUFDO0lBRXBEVCxFQUFFLENBQUNpQixTQUFTLENBQUNiLEdBQUcsRUFBRTtNQUFFYyxTQUFTLEVBQUU7SUFBSyxDQUFDLENBQUM7SUFFdENsQixFQUFFLENBQUNtQixhQUFhLENBQUNILFlBQVksRUFBRWQsV0FBVyxDQUFDO0lBQzNDLE9BQU9jLFlBQVk7RUFDcEIsQ0FBQzs7RUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQU5BdkUsUUFBQSxDQUFBa0QsVUFBQSxHQUFBQSxVQUFBO0VBT08sU0FBU1EsUUFBUUEsQ0FBQ2lCLEdBQVcsRUFBNEU7SUFBQSxJQUExRUMsT0FBTyxHQUFBdkIsU0FBQSxDQUFBakUsTUFBQSxRQUFBaUUsU0FBQSxRQUFBMUYsU0FBQSxHQUFBMEYsU0FBQSxNQUFHLHlCQUF5QjtJQUFBLElBQUVELE9BQThCLEdBQUFDLFNBQUEsQ0FBQWpFLE1BQUEsUUFBQWlFLFNBQUEsUUFBQTFGLFNBQUEsR0FBQTBGLFNBQUEsTUFBRyxDQUFDLENBQUM7SUFDN0csTUFBTXdCLE9BQStCLEdBQUc7TUFBRSxZQUFZLEVBQUVGO0lBQUksQ0FBQzs7SUFFN0Q7SUFDQSxJQUFJQSxHQUFHLENBQUM1QyxRQUFRLENBQUMsbUJBQW1CLENBQUMsRUFBRTtNQUN0QzhDLE9BQU8sQ0FBQyxZQUFZLENBQUMsR0FBR3RCLEVBQUUsQ0FBQ0MsWUFBWSxDQUFDc0IsT0FBTyxDQUFDakIsT0FBTyxDQUFDLHFCQUFxQixDQUFDLEVBQUUsT0FBTyxDQUFDO0lBQ3pGO0lBRUEsTUFBTWtCLEdBQUcsR0FBR0MsUUFBUSxDQUFDQyxjQUFjLENBQUNKLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUVoRCxNQUFNSyxXQUFrQyxHQUFHO01BQzFDQyxnQkFBZ0IsRUFBRSxJQUFJO01BQ3RCQyxXQUFXLEVBQUUsWUFBWTtNQUN6QkMsZ0JBQWdCLEVBQUUsSUFBSTtNQUN0QixHQUFHakMsT0FBTztNQUNWd0IsT0FBTyxFQUFFQTtJQUNWLENBQUM7SUFFRCxNQUFNVSxJQUFJLEdBQUdOLFFBQVEsQ0FBQ08sRUFBRSxDQUFDRCxJQUFJLENBQUNQLEdBQUcsRUFBRUcsV0FBVyxDQUFDO0lBQy9DLElBQUksQ0FBQ0ksSUFBSSxFQUFFO01BQ1YsTUFBTSxJQUFJRSxLQUFLLENBQUMsMEVBQTBFWixPQUFPLEdBQUcsQ0FBQztJQUN0RztJQUNBLE9BQU9VLElBQUk7RUFDWjtFQUFDdEYsUUFBQSxDQUFBMEQsUUFBQSxHQUFBQSxRQUFBO0VBRU0sTUFBTStCLHlCQUF5QixHQUFHLGVBQUFBLENBQ3hDcEksU0FBeUIsRUFFSztJQUFBLElBRDlCcUksbUJBQW1CLEdBQUFyQyxTQUFBLENBQUFqRSxNQUFBLFFBQUFpRSxTQUFBLFFBQUExRixTQUFBLEdBQUEwRixTQUFBLE1BQUcsa0NBQWtDO0lBRXhELE1BQU1zQyxXQUFXLEdBQUc7TUFDbkJDLFFBQVEsRUFBRUEsQ0FBQSxLQUFNO1FBQ2YsT0FBTztVQUNOQyxHQUFHLEVBQUVBLENBQUEsS0FBTUgsbUJBQW1CLEtBQUssa0NBQWtDO1VBQ3JFaEosWUFBWSxFQUFFQSxDQUFBLEtBQU07WUFDbkIsT0FBT1csU0FBUztVQUNqQixDQUFDO1VBQ0R5SSxhQUFhLEVBQUVBLENBQUEsS0FBTW5JO1FBQ3RCLENBQUM7TUFDRixDQUFDO01BQ0RvSSxVQUFVLEVBQUVBLENBQUEsS0FBTTtRQUNqQixPQUFPO1VBQ05DLGVBQWUsRUFBRUEsQ0FBQSxLQUFNckk7UUFDeEIsQ0FBQztNQUNGO0lBQ0QsQ0FBQztJQUNELE1BQU1zSSxlQUFlLEdBQUcsTUFBTSxJQUFJQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUNDLGNBQWMsQ0FBQztNQUFFUixXQUFXO01BQUVTLFNBQVMsRUFBRSxFQUFFO01BQUVqSixRQUFRLEVBQUUsQ0FBQztJQUFFLENBQUMsQ0FBQztJQUNuSCxPQUFPOEksZUFBZSxDQUFDSSxZQUFZLENBQUMsQ0FBQztFQUN0QyxDQUFDO0VBQUNyRyxRQUFBLENBQUF5Rix5QkFBQSxHQUFBQSx5QkFBQTtFQUVLLE1BQU1hLGtCQUFrQixHQUFHLFNBQUFBLENBQUEsRUFBMEI7SUFDM0QsTUFBTUMsTUFBYSxHQUFHLEVBQUU7SUFDeEIsT0FBTztNQUNOQyxRQUFRQSxDQUFDQyxhQUE0QixFQUFFQyxhQUE0QixFQUFFQyxPQUFlLEVBQVE7UUFDM0ZKLE1BQU0sQ0FBQy9FLElBQUksQ0FBQztVQUNYaUYsYUFBYTtVQUNiQyxhQUFhO1VBQ2JDO1FBQ0QsQ0FBQyxDQUFDO01BQ0gsQ0FBQztNQUNEQyxTQUFTQSxDQUFBLEVBQVU7UUFDbEIsT0FBT0wsTUFBTTtNQUNkLENBQUM7TUFDRE0sa0JBQWtCQSxDQUFDSixhQUE0QixFQUFFQyxhQUE0QixFQUFFQyxPQUFlLEVBQVc7UUFDeEcsT0FBT0osTUFBTSxDQUFDTyxJQUFJLENBQUVDLEtBQUssSUFBSztVQUM3QixPQUFPQSxLQUFLLENBQUNOLGFBQWEsS0FBS0EsYUFBYSxJQUFJTSxLQUFLLENBQUNMLGFBQWEsS0FBS0EsYUFBYSxJQUFJSyxLQUFLLENBQUNKLE9BQU8sS0FBS0EsT0FBTztRQUNuSCxDQUFDLENBQUM7TUFDSDtJQUNELENBQUM7RUFDRixDQUFDO0VBQUMzRyxRQUFBLENBQUFzRyxrQkFBQSxHQUFBQSxrQkFBQTtFQUVLLE1BQU1VLDBCQUEwQixHQUFHLFNBQUFBLENBQ3pDM0osU0FBeUIsRUFDekI0SixnQkFBeUUsRUFDeEU7SUFDRCxNQUFNQyxjQUFjLEdBQUdDLFlBQVksQ0FBQzlKLFNBQVMsQ0FBQztJQUM5QyxNQUFNK0osYUFBYSxHQUFHSCxnQkFBZ0IsQ0FBQ0ksV0FBVyxHQUMvQ0MsMkJBQTJCLENBQXdCakssU0FBUyxDQUFDYyxvQkFBb0IsQ0FBQzhJLGdCQUFnQixDQUFDSSxXQUFXLENBQVksQ0FBQyxHQUMzSEMsMkJBQTJCLENBQXdCakssU0FBUyxDQUFDYyxvQkFBb0IsQ0FBQyxJQUFJOEksZ0JBQWdCLENBQUNNLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDdkgsT0FBTyxJQUFJQyxnQkFBZ0IsQ0FBd0JOLGNBQWMsRUFBRUQsZ0JBQWdCLEVBQUVYLGtCQUFrQixDQUFDLENBQUMsRUFBRW1CLEtBQUssRUFBRUwsYUFBYSxDQUFDO0VBQ2pJLENBQUM7RUFBQ3BILFFBQUEsQ0FBQWdILDBCQUFBLEdBQUFBLDBCQUFBO0VBQ0YsTUFBTVUsY0FBbUIsR0FBRyxDQUFDLENBQUM7RUFDdkIsTUFBTWhMLFlBQVksR0FBRyxlQUFBQSxDQUFnQkwsWUFBb0IsRUFBRTtJQUNqRSxNQUFNc0wsVUFBVSxHQUFHQyxrQkFBa0IsQ0FBQ0MsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRWxLLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxZQUFZO01BQ3RGLE9BQU8sSUFBSTtJQUNaLENBQUMsQ0FBQztJQUNGLElBQUksQ0FBQytKLGNBQWMsQ0FBQ3JMLFlBQVksQ0FBQyxFQUFFO01BQ2xDLE1BQU1JLFVBQVUsR0FBRyxJQUFLcUwsY0FBYyxDQUFTSCxVQUFVLEVBQUV0TCxZQUFZLEVBQUVzQixTQUFTLEVBQUU7UUFBRW9LLHlCQUF5QixFQUFFQSxDQUFBLEtBQU07TUFBRyxDQUFDLENBQUM7TUFDNUgsTUFBTXRMLFVBQVUsQ0FBQ3VMLG9CQUFvQixDQUFDLENBQUM7TUFDdkNOLGNBQWMsQ0FBQ3JMLFlBQVksQ0FBQyxHQUFHSSxVQUFVO0lBQzFDO0lBRUEsT0FBT2lMLGNBQWMsQ0FBQ3JMLFlBQVksQ0FBQztFQUNwQyxDQUFDO0VBQUMyRCxRQUFBLENBQUF0RCxZQUFBLEdBQUFBLFlBQUE7RUFFSyxNQUFNdUwsaUNBQWlDLEdBQUcsU0FBQUEsQ0FDaERWLFNBQW9CLEVBQ3BCTCxjQUFpQyxFQUNqQ2dCLFFBQVksRUFDYTtJQUN6QixNQUFNQyxVQUFrQyxHQUFHO01BQzFDQyxpQkFBaUIsRUFBRWIsU0FBUztNQUM1QmMsb0JBQW9CLEVBQUUsRUFBRTtNQUN4QkMsWUFBWSxFQUFFSixRQUFRO01BQ3RCSyxlQUFlLEVBQUVoQixTQUFTO01BQzFCaUIsZ0JBQWdCLEVBQUVqQixTQUFTLENBQUNrQixVQUFVO01BQ3RDdkIsY0FBYyxFQUFFQTtJQUNqQixDQUFDO0lBQ0RpQixVQUFVLENBQUNPLGVBQWUsR0FBR1AsVUFBNEM7SUFDekUsT0FBT0EsVUFBVTtFQUNsQixDQUFDO0VBQUNuSSxRQUFBLENBQUFpSSxpQ0FBQSxHQUFBQSxpQ0FBQTtFQUVLLE1BQU1VLGVBQWUsR0FBRyxTQUFBQSxDQUFVQyxhQUFxQixFQUFrQjtJQUMvRSxNQUFNQyxjQUFjLEdBQUdDLGFBQWEsQ0FBQ0MsYUFBYSxDQUFDSCxhQUFhLENBQUM7SUFBQyxTQUFBSSxJQUFBLEdBQUEzRixTQUFBLENBQUFqRSxNQUFBLEVBREE2SixJQUFJLE9BQUE5SSxLQUFBLENBQUE2SSxJQUFBLE9BQUFBLElBQUEsV0FBQUUsSUFBQSxNQUFBQSxJQUFBLEdBQUFGLElBQUEsRUFBQUUsSUFBQTtNQUFKRCxJQUFJLENBQUFDLElBQUEsUUFBQTdGLFNBQUEsQ0FBQTZGLElBQUE7SUFBQTtJQUV0RSxPQUFPTCxjQUFjLENBQUNNLFNBQVMsQ0FBQ0MsS0FBSyxDQUFDekwsU0FBUyxFQUFFc0wsSUFBSSxDQUFDO0VBQ3ZELENBQUM7RUFBQ2pKLFFBQUEsQ0FBQTJJLGVBQUEsR0FBQUEsZUFBQTtFQU1GO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ08sU0FBU1Usd0JBQXdCQSxDQUN2Q1QsYUFBaUMsRUFDakNVLFlBQTBCLEVBQzFCQyxrQkFBMEQsRUFDakQ7SUFDVCxNQUFNVixjQUFjLEdBQUdDLGFBQWEsQ0FBQ0MsYUFBYSxDQUFDSCxhQUFhLENBQUM7SUFDakUsTUFBTVksSUFBSSxHQUFHLElBQUlDLGFBQWEsQ0FBQyxDQUFDO0lBQ2hDRCxJQUFJLENBQUNFLFlBQVksQ0FBQyxNQUFNLEVBQUViLGNBQWMsQ0FBQztJQUV6QyxNQUFNYyxZQUFZLEdBQUcsSUFBSUMsU0FBUyxDQUFDTixZQUFZLENBQUM7SUFDaERFLElBQUksQ0FBQ0ssUUFBUSxDQUFDRixZQUFZLENBQUM7SUFDM0JILElBQUksQ0FBQ00saUJBQWlCLENBQUNILFlBQVksQ0FBQ3hMLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRTlELElBQUlvTCxrQkFBa0IsRUFBRTtNQUN2QixLQUFLLE1BQU0sQ0FBQ2pMLElBQUksRUFBRXlMLE9BQU8sQ0FBQyxJQUFJM08sTUFBTSxDQUFDMkksT0FBTyxDQUFDd0Ysa0JBQWtCLENBQUMsRUFBRTtRQUNqRSxNQUFNUyxLQUFLLEdBQUcsSUFBSUosU0FBUyxDQUFDRyxPQUFPLENBQUM7UUFDcENQLElBQUksQ0FBQ0ssUUFBUSxDQUFDRyxLQUFLLEVBQUUxTCxJQUFJLENBQUM7UUFDMUJrTCxJQUFJLENBQUNNLGlCQUFpQixDQUFDRSxLQUFLLENBQUM3TCxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsRUFBRUcsSUFBSSxDQUFDO01BQzlEO0lBQ0Q7SUFFQSxPQUFPa0wsSUFBSSxDQUFDUyxPQUFPLENBQUMsQ0FBQztFQUN0QjtFQUFDakssUUFBQSxDQUFBcUosd0JBQUEsR0FBQUEsd0JBQUE7RUFFRCxNQUFNYSxVQUFVLEdBQUcsWUFBWTtFQUUvQixNQUFNQyxnQkFBZ0IsR0FBRyxlQUFBQSxDQUFnQkMsV0FBc0MsRUFBRTNOLFVBQXFCLEVBQUU0TixTQUFjLEVBQUU7SUFDdkg7SUFDQSxDQUFDLEdBQUdBLFNBQVMsQ0FBQ0MsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQ3ZOLE9BQU8sQ0FBRThELElBQUksSUFBSztNQUN6REEsSUFBSSxDQUFDMEosRUFBRSxHQUFHLEdBQUdMLFVBQVUsS0FBS3JKLElBQUksQ0FBQzBKLEVBQUUsRUFBRTtJQUN0QyxDQUFDLENBQUM7SUFDRixNQUFNQyxPQUFPLEdBQUdDLDhCQUE4QixDQUFDUCxVQUFVLEVBQUVFLFdBQVcsQ0FBQztJQUN2RSxNQUFNTSxLQUFLLEdBQUcsZUFBZTtJQUM3QixNQUFNQyxTQUFTLEdBQUc7TUFDakIsU0FBUyxFQUFFO1FBQ1ZKLEVBQUUsRUFBRUcsS0FBSztRQUNURSxJQUFJLEVBQUUsYUFBYTtRQUNuQkMsZUFBZSxFQUFFO1VBQ2hCQyxTQUFTLEVBQUU7UUFDWjtNQUNEO0lBQ0QsQ0FBQztJQUNELE1BQU1DLGFBQTJCLEdBQUc7TUFDbkNyTixjQUFjLEVBQUV6RSxJQUFJLENBQUN3RSxFQUFFLENBQUMsQ0FBQyxDQUFDSSxlQUFlLENBQUN5SSxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7TUFDL0RWLFFBQVEsRUFBRTNNLElBQUksQ0FBQ3dFLEVBQUUsQ0FBQyxDQUFDLENBQUNJLGVBQWUsQ0FBQztRQUNuQ25CLFlBQVksRUFBRXpELElBQUksQ0FBQ3dFLEVBQUUsQ0FBQyxDQUFDLENBQUNJLGVBQWUsQ0FBQ3BCLFVBQVU7TUFDbkQsQ0FBQyxDQUFDO01BQ0Z1TyxnQkFBZ0IsRUFBRS9SLElBQUksQ0FBQ3dFLEVBQUUsQ0FBQyxDQUFDLENBQUNJLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUMvQ29OLGlCQUFpQixFQUFFaFMsSUFBSSxDQUFDd0UsRUFBRSxDQUFDLENBQUMsQ0FBQ0ksZUFBZSxDQUFDO1FBQzVDcU4sUUFBUSxFQUFFLFNBQUFBLENBQVU1TSxJQUFZLEVBQUU7VUFDakMsT0FBUXFNLFNBQVMsQ0FBU3JNLElBQUksQ0FBQztRQUNoQztNQUNELENBQUMsQ0FBQztNQUNGNk0sVUFBVSxFQUFFbFMsSUFBSSxDQUFDd0UsRUFBRSxDQUFFMk4sR0FBRyxJQUFLQSxHQUFHO0lBQ2pDLENBQTRCO0lBQzVCO0lBQ0FuUyxJQUFJLENBQUNvUyxLQUFLLENBQUNDLFVBQVUsRUFBRSxjQUFjLENBQUMsQ0FBQ3pOLGVBQWUsQ0FBQzBOLE9BQU8sQ0FBQzFILE9BQU8sQ0FBQzJHLE9BQU8sQ0FBQyxDQUFDO0lBQ2hGdlIsSUFBSSxDQUFDb1MsS0FBSyxDQUFDRyxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUMzTixlQUFlLENBQUMwTixPQUFPLENBQUMxSCxPQUFPLENBQUMyRyxPQUFPLENBQUMsQ0FBQztJQUU1RXZSLElBQUksQ0FBQ29TLEtBQUssQ0FBQ0ksU0FBUyxFQUF5RCxrQkFBa0IsQ0FBQyxDQUFDNU4sZUFBZSxDQUFDa04sYUFBYSxDQUFDO0lBQy9IOVIsSUFBSSxDQUFDb1MsS0FBSyxDQUFDSyxLQUFLLEVBQUUsMkJBQTJCLENBQUMsQ0FBQzdOLGVBQWUsQ0FBQ2tOLGFBQWEsQ0FBQztJQUM3RSxNQUFNWSxTQUFTLENBQUNDLFVBQVUsQ0FBQztNQUMxQkMsV0FBVyxFQUFFbkI7SUFDZCxDQUFDLENBQUM7SUFDRkwsU0FBUyxHQUFHLE1BQU15QixlQUFlLENBQUNDLE9BQU8sQ0FBQzFCLFNBQVMsRUFBRTtNQUFFL0wsSUFBSSxFQUFFLGVBQWU7TUFBRXVOLFdBQVcsRUFBRW5CLEtBQUs7TUFBRUgsRUFBRSxFQUFFTDtJQUFXLENBQUMsQ0FBQzs7SUFFbkg7SUFDQSxNQUFNOEIsY0FBYyxHQUFHQyxpQkFBaUIsQ0FBQzVCLFNBQVMsQ0FBQztJQUNuRHRNLE1BQU0sQ0FBQ2lPLGNBQWMsQ0FBQzVNLE1BQU0sQ0FBQyxDQUFDOE0sSUFBSSxDQUFDOUIsV0FBVyxFQUFFSSxPQUFPLEVBQUVwTCxNQUFNLElBQUksQ0FBQyxHQUFHZ0wsV0FBVyxFQUFFK0IsOEJBQThCLEVBQUUvTSxNQUFNLElBQUksQ0FBQyxDQUFDO0lBQ2hJLE9BQU9pTCxTQUFTO0VBQ2pCLENBQUM7RUFFTSxNQUFNNEIsaUJBQWlCLEdBQUkxTSxHQUFRLElBQ3pDLENBQUMsR0FBR0EsR0FBRyxDQUFDK0ssZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FDNUI4QixPQUFPLENBQUVDLENBQUMsSUFBSyxDQUFDLEdBQUdBLENBQUMsQ0FBQy9LLFVBQVUsQ0FBQyxDQUFDMUIsR0FBRyxDQUFFZ0MsQ0FBQyxJQUFLQSxDQUFDLENBQUN0RCxJQUFJLENBQUMsQ0FBQyxDQUNwRGdPLE1BQU0sQ0FBRUMsSUFBSSxJQUFLQSxJQUFJLENBQUN4SyxRQUFRLENBQUMsMEJBQTBCLENBQUMsQ0FBQztFQUFDL0IsUUFBQSxDQUFBaU0saUJBQUEsR0FBQUEsaUJBQUE7RUFFeEQsTUFBTU8sbUJBQW1CLEdBQUcsZUFBQUEsQ0FDbENDLFFBQWdCLEVBQ2hCcFEsWUFBZ0MsRUFDaENDLGdCQUEwRCxFQUMxREMsT0FBNkIsRUFDN0I2TixXQUF1QyxFQUN2QzVOLHFCQUErQixFQUM5QjtJQUNELElBQUksQ0FBQ0QsT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFO01BQzVCQSxPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUdtUSx1QkFBdUIsQ0FBQyxDQUFDO0lBQ25EO0lBRUEsTUFBTUMsWUFBWSxHQUFHLFNBQVNGLFFBQVEsU0FBUztJQUMvQyxNQUFNdEssTUFBTSxHQUFHLElBQUl4QixNQUFNLENBQUNpTSxTQUFTLENBQUMsQ0FBQztJQUNyQyxNQUFNQyxNQUFNLEdBQUcxSyxNQUFNLENBQUMySyxlQUFlLENBQUNILFlBQVksRUFBRSxVQUFVLENBQUM7SUFDL0Q7SUFDQTs7SUFFQSxNQUFNSSxxQkFBcUIsR0FBRyxNQUFNM1EsMEJBQTBCLENBQUNDLFlBQVksRUFBRUMsZ0JBQWdCLEVBQUVDLE9BQU8sRUFBRUMscUJBQXFCLENBQUM7O0lBRTlIO0lBQ0EsSUFBSXVRLHFCQUFxQixDQUFDM1AsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFO01BQ3pDMlAscUJBQXFCLENBQUN6UCxlQUFlLENBQUMsTUFBTSxDQUFDLEdBQUd5UCxxQkFBcUIsQ0FBQzNQLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQ2Usb0JBQW9CLENBQUMsR0FBRyxDQUFDO0lBQy9HO0lBRUEsSUFBSWtNLFNBQVMsR0FBSSxNQUFNMkMsZUFBZSxDQUFDakIsT0FBTyxDQUFDYyxNQUFNLENBQUNJLGlCQUFpQixFQUFHO01BQUUzTyxJQUFJLEVBQUU7SUFBZ0IsQ0FBQyxFQUFFeU8scUJBQXFCLENBQVM7SUFFbkksSUFBSTFRLFlBQVksSUFBSStOLFdBQVcsRUFBRTtNQUNoQztNQUNBLE1BQU0zTixVQUFVLEdBQUcsTUFBTUMsWUFBWSxDQUFDTCxZQUFZLENBQUM7TUFDbkRnTyxTQUFTLEdBQUcsTUFBTUYsZ0JBQWdCLENBQUNDLFdBQVcsRUFBRTNOLFVBQVUsRUFBRTROLFNBQVMsQ0FBQztJQUN2RTtJQUNBLE9BQU9BLFNBQVM7RUFDakIsQ0FBQztFQUFDckssUUFBQSxDQUFBd00sbUJBQUEsR0FBQUEsbUJBQUE7RUFFSyxNQUFNVSxlQUFlLEdBQUcsZUFBQUEsQ0FDOUJULFFBQWdCLEVBQ2hCcFEsWUFBZ0MsRUFDaENDLGdCQUF5QyxFQUN6Q0MsT0FBNkIsRUFDN0I2TixXQUF1QyxFQUN2QzVOLHFCQUErQixFQUNiO0lBQ2xCLE9BQU8yUSxHQUFHLENBQUNDLHFCQUFxQixDQUFDalMsa0JBQWtCLEVBQUUsWUFBWTtNQUNoRSxNQUFNa1MsWUFBWSxHQUFHLE1BQU1iLG1CQUFtQixDQUM3Q0MsUUFBUSxFQUNScFEsWUFBWSxFQUNaQyxnQkFBZ0IsRUFDaEJDLE9BQU8sRUFDUDZOLFdBQVcsRUFDWDVOLHFCQUNELENBQUM7TUFDRCxNQUFNOFEsWUFBWSxHQUFHcE8sWUFBWSxDQUFDbU8sWUFBWSxFQUFFMVAsU0FBUyxDQUFDO01BQzFESSxNQUFNLENBQUN1UCxZQUFZLENBQUMsQ0FBQ0MsR0FBRyxDQUFDak8sc0JBQXNCLENBQUMsQ0FBQztNQUNqRCxPQUFPZ08sWUFBWTtJQUNwQixDQUFDLENBQUM7RUFDSCxDQUFDOztFQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQVJBdE4sUUFBQSxDQUFBa04sZUFBQSxHQUFBQSxlQUFBO0VBU08sZUFBZU0sV0FBV0EsQ0FDaENsUCxJQUFZLEVBQ1pqQyxZQUFvQixFQUNwQkMsZ0JBQXlDLEVBQ3pDQyxPQUE2QixFQUM3QjZOLFdBQXVDLEVBQ1Y7SUFDN0IsTUFBTTNOLFVBQVUsR0FBRyxNQUFNQyxZQUFZLENBQUNMLFlBQVksQ0FBQztJQUNuRCxNQUFNb1IsYUFBYSxHQUFHclAsaUJBQWlCLENBQUNFLElBQUksQ0FBQztJQUM3QyxNQUFNeU8scUJBQXFCLEdBQUcsTUFBTTNRLDBCQUEwQixDQUFDQyxZQUFZLEVBQUVDLGdCQUFnQixFQUFFQyxPQUFPLENBQUM7SUFDdkcsSUFBSW1SLGlCQUFpQixHQUFHLE1BQU1WLGVBQWUsQ0FBQ2pCLE9BQU8sQ0FBQzBCLGFBQWEsRUFBRTtNQUFFblAsSUFBSSxFQUFFQTtJQUFLLENBQUMsRUFBRXlPLHFCQUFxQixDQUFDO0lBQzNHLElBQUkzQyxXQUFXLEVBQUU7TUFDaEJzRCxpQkFBaUIsR0FBRyxNQUFNdkQsZ0JBQWdCLENBQUNDLFdBQVcsSUFBSSxFQUFFLEVBQUUzTixVQUFVLEVBQUVpUixpQkFBaUIsQ0FBQztJQUM3RjtJQUNBLE9BQU87TUFDTkMsU0FBUyxFQUFFRCxpQkFBaUI7TUFDNUJFLFFBQVEsRUFBRXZOLFNBQVMsQ0FBQ3FOLGlCQUFpQixFQUFFRyxTQUFTLElBQUksRUFBRTtJQUN2RCxDQUFDO0VBQ0Y7O0VBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBTEE3TixRQUFBLENBQUF3TixXQUFBLEdBQUFBLFdBQUE7RUFNTyxlQUFlTSxlQUFlQSxDQUFDeFAsSUFBWSxFQUFFeVAsUUFBcUMsRUFBbUI7SUFDM0csTUFBTUMsUUFBUSxHQUFHLHNDQUFzQzFQLElBQUksaURBQWlEO0lBQzVHLE1BQU02RCxNQUFNLEdBQUcsSUFBSXhCLE1BQU0sQ0FBQ2lNLFNBQVMsQ0FBQyxDQUFDO0lBRXJDLE1BQU1xQixRQUFRLEdBQUc5TCxNQUFNLENBQUMySyxlQUFlLENBQUNrQixRQUFRLEVBQUUsVUFBVSxDQUFDOztJQUU3RDtJQUNBLE1BQU03USxRQUFRLEdBQUc7TUFDaEJDLE1BQU0sRUFBRSxDQUFDLENBQWtDO01BQzNDRSxlQUFlLEVBQUUsQ0FBQyxDQUErQjtNQUNqREMsWUFBWSxFQUFFO1FBQUVDLHFCQUFxQixFQUFFdkUsSUFBSSxDQUFDd0UsRUFBRSxDQUFDLENBQUM7UUFBRUMsY0FBYyxFQUFFQSxDQUFBLEtBQU1DO01BQVU7SUFDbkYsQ0FBQztJQUNELEtBQUssTUFBTXFNLEtBQUssSUFBSStELFFBQVEsRUFBRTtNQUM3QixNQUFNRyxTQUFTLEdBQUcsSUFBSXRFLFNBQVMsQ0FBQyxDQUFDO01BQ2pDc0UsU0FBUyxDQUFDQyxPQUFPLENBQUNKLFFBQVEsQ0FBQy9ELEtBQUssQ0FBQyxDQUFDO01BQ2xDN00sUUFBUSxDQUFDQyxNQUFNLENBQUM0TSxLQUFLLENBQUMsR0FBR2tFLFNBQVM7TUFDbEMvUSxRQUFRLENBQUNHLGVBQWUsQ0FBQzBNLEtBQUssQ0FBQyxHQUFHN00sUUFBUSxDQUFDQyxNQUFNLENBQUM0TSxLQUFLLENBQUMsQ0FBQzdMLG9CQUFvQixDQUFDLEdBQUcsQ0FBQztJQUNuRjtJQUNBaEIsUUFBUSxDQUFDSSxZQUFZLENBQUNDLHFCQUFxQixDQUFDSyxlQUFlLENBQUNqQyw0QkFBNEIsQ0FBQzs7SUFFekY7SUFDQSxNQUFNd1MsU0FBUyxHQUFHLE1BQU1wQixlQUFlLENBQUNqQixPQUFPLENBQUNrQyxRQUFRLENBQUNoQixpQkFBaUIsRUFBRTtNQUFFM087SUFBSyxDQUFDLEVBQUVuQixRQUFRLENBQUM7O0lBRS9GO0lBQ0EsTUFBTWtSLFNBQVMsR0FBR0QsU0FBUyxDQUFDRSxvQkFBb0IsQ0FBQyxlQUFlLENBQVE7SUFDeEUsSUFBSUQsU0FBUyxFQUFFalAsTUFBTSxHQUFHLENBQUMsRUFBRTtNQUMxQixLQUFLLE1BQU1tUCxRQUFRLElBQUlGLFNBQVMsRUFBRTtRQUNqQ0UsUUFBUSxDQUFDQyxTQUFTLEdBQUcsRUFBRTtNQUN4QjtJQUNEOztJQUVBO0lBQ0EsTUFBTUMsU0FBUyxHQUFHTCxTQUFTLENBQUNNLFFBQVEsQ0FBQ3RQLE1BQU0sR0FBRyxDQUFDLEdBQUdnUCxTQUFTLENBQUNQLFNBQVMsR0FBR08sU0FBUyxDQUFDSSxTQUFTO0lBRTNGLE9BQU9uTyxTQUFTLENBQUNvTyxTQUFTLENBQUM7RUFDNUI7RUFBQ3pPLFFBQUEsQ0FBQThOLGVBQUEsR0FBQUEsZUFBQTtFQUVNLFNBQVNhLGdCQUFnQkEsQ0FBQ0Msa0JBQThDLEVBQWtDO0lBQUEsSUFBaENDLHNCQUFzQixHQUFBeEwsU0FBQSxDQUFBakUsTUFBQSxRQUFBaUUsU0FBQSxRQUFBMUYsU0FBQSxHQUFBMEYsU0FBQSxNQUFHLEtBQUs7SUFDOUcsSUFBSXlMLFFBQVEsR0FBRyxDQUFDO0lBQ2hCLE1BQU03TixHQUFHLEdBQUcsd0JBQXdCO0lBQ3BDLE1BQU04TixTQUFTLEdBQUcsbUJBQW1CO0lBQ3JDLFNBQVNDLE1BQU1BLENBQUEsRUFBWTtNQUFBLElBQVhDLEtBQUssR0FBQTVMLFNBQUEsQ0FBQWpFLE1BQUEsUUFBQWlFLFNBQUEsUUFBQTFGLFNBQUEsR0FBQTBGLFNBQUEsTUFBRyxDQUFDO01BQ3hCLElBQUk2TCxHQUFHLEdBQUcsRUFBRTtNQUNaLEtBQUssSUFBSUMsQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHTCxRQUFRLEdBQUdHLEtBQUssRUFBRUUsQ0FBQyxFQUFFLEVBQUU7UUFDMUNELEdBQUcsSUFBSSxJQUFJO01BQ1o7TUFDQSxPQUFPQSxHQUFHO0lBQ1g7SUFDQSxNQUFNRSxpQkFBaUIsR0FBRztNQUN6QkMsS0FBSyxFQUFFLFNBQUFBLENBQVUxVixPQUFZLEVBQUUyVixnQkFBd0IsRUFBRTtRQUN4RCxJQUFJQyxhQUFhLEdBQUcsRUFBRTtRQUN0QixJQUFJRCxnQkFBZ0IsRUFBRTtVQUNyQixJQUFJM1YsT0FBTyxDQUFDNlYsU0FBUyxDQUFDLENBQUMsRUFBRTtZQUN4QixNQUFNQyxhQUFhLEdBQUk5VixPQUFPLENBQUM2VixTQUFTLENBQUMsQ0FBQyxDQUFDRSxjQUFjLENBQUNKLGdCQUFnQixDQUFDLEVBQXNCSyxPQUFPLEdBQUdoVyxPQUFPLENBQUM7WUFDbkgsSUFBSThWLGFBQWEsR0FBRyxDQUFDLEVBQUU7Y0FDdEJGLGFBQWEsSUFBSSxNQUFNUCxNQUFNLENBQUMsQ0FBQyxFQUFFO1lBQ2xDO1VBQ0Q7UUFDRDtRQUNBTyxhQUFhLElBQUksR0FBRzVWLE9BQU8sQ0FBQ2lXLFdBQVcsQ0FBQyxDQUFDLENBQUNDLE9BQU8sQ0FBQyxDQUFDLEdBQUc7UUFDdEQsT0FBT04sYUFBYTtNQUNyQixDQUFDO01BQ0RPLEdBQUcsRUFBRSxTQUFBQSxDQUFBLEVBQVk7UUFDaEIsT0FBTyxJQUFJO01BQ1osQ0FBQztNQUNEQyxNQUFNLEVBQUUsU0FBQUEsQ0FBVXBXLE9BQVksRUFBRTtRQUMvQixJQUFJNFEsRUFBRSxHQUFHNVEsT0FBTyxDQUFDcVcsS0FBSyxDQUFDLENBQUM7UUFDeEJ6RixFQUFFLEdBQUcsT0FBT0EsRUFBRSxLQUFLLFFBQVEsR0FBR0EsRUFBRSxFQUFFaE0sT0FBTyxHQUFHd1EsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHeEUsRUFBRTtRQUNqRSxJQUFJck4sSUFBSSxHQUFHLFFBQVErUyxxQkFBcUIsQ0FBQ0MsYUFBYSxDQUFDM0YsRUFBRSxDQUFDLEdBQUcsYUFBYSxHQUFHQSxFQUFFLEVBQUU7UUFDakYsS0FBSyxNQUFNNEYsV0FBVyxJQUFJeFcsT0FBTyxDQUFDeVcsV0FBVyxFQUFFO1VBQzlDLElBQUl6VyxPQUFPLENBQUN5VyxXQUFXLENBQUN6VCxjQUFjLENBQUN3VCxXQUFXLENBQUMsRUFBRTtZQUNwRCxJQUFJRSxhQUFhLEdBQUcxVyxPQUFPLENBQUN5VyxXQUFXLENBQUNELFdBQVcsQ0FBQztZQUNwREUsYUFBYSxHQUFHLE9BQU9BLGFBQWEsS0FBSyxRQUFRLEdBQUdBLGFBQWEsRUFBRTlSLE9BQU8sR0FBRzBDLEdBQUcsRUFBRSxTQUFTLENBQUMsR0FBR29QLGFBQWE7WUFDNUdBLGFBQWEsR0FBRyxPQUFPQSxhQUFhLEtBQUssUUFBUSxHQUFHQSxhQUFhLEVBQUU5UixPQUFPLEdBQUd3USxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUdzQixhQUFhO1lBQzdHLElBQUk7Y0FDSEEsYUFBYSxHQUFHLE9BQU9BLGFBQWEsS0FBSyxRQUFRLEdBQUdDLElBQUksQ0FBQ0MsU0FBUyxDQUFDRixhQUFhLENBQUMsR0FBR0EsYUFBYTtZQUNsRyxDQUFDLENBQUMsT0FBT2hFLENBQUMsRUFBRTtjQUNYO1lBQUE7WUFHRG5QLElBQUksSUFBSSxNQUFNOFIsTUFBTSxDQUFDLENBQUMsSUFBSW1CLFdBQVcsS0FBS0UsYUFBYSxFQUFFO1VBQzFELENBQUMsTUFBTSxJQUFJMVcsT0FBTyxDQUFDNlcsYUFBYSxDQUFDN1QsY0FBYyxDQUFDd1QsV0FBVyxDQUFDLEVBQUU7WUFDN0QsTUFBTU0sYUFBYSxHQUFHO2NBQUUsR0FBRzlXLE9BQU8sQ0FBQzZXLGFBQWEsQ0FBQ0wsV0FBVztZQUFFLENBQUM7WUFDL0QsSUFBSU0sYUFBYSxDQUFDN0YsSUFBSSxFQUFFOEYsYUFBYSxFQUFFO2NBQ3RDLE9BQU9ELGFBQWEsQ0FBQzdGLElBQUksQ0FBQzhGLGFBQWE7WUFDeEM7WUFDQSxJQUFJRCxhQUFhLENBQUNFLE9BQU8sRUFBRTtjQUMxQixPQUFPRixhQUFhLENBQUNFLE9BQU87WUFDN0I7WUFDQXpULElBQUksSUFBSSxNQUFNOFIsTUFBTSxDQUFDLENBQUMsSUFBSW1CLFdBQVcsS0FBS0csSUFBSSxDQUFDQyxTQUFTLENBQUNFLGFBQWEsQ0FBQyxFQUFFO1VBQzFFO1FBQ0Q7UUFDQSxLQUFLLE1BQU1OLFdBQVcsSUFBSXhXLE9BQU8sQ0FBQ2lYLGFBQWEsRUFBRTtVQUNoRCxJQUFJalgsT0FBTyxDQUFDaVgsYUFBYSxDQUFDalUsY0FBYyxDQUFDd1QsV0FBVyxDQUFDLEVBQUU7WUFDdEQsSUFBSVUsZ0JBQWdCLEdBQUdsWCxPQUFPLENBQUNpWCxhQUFhLENBQUNULFdBQVcsQ0FBQztZQUN6RCxJQUFJLENBQUNoUSxLQUFLLENBQUNDLE9BQU8sQ0FBQ3lRLGdCQUFnQixDQUFDLEVBQUU7Y0FDckNBLGdCQUFnQixHQUFHLENBQUNBLGdCQUFnQixDQUFDO1lBQ3RDO1lBQ0FBLGdCQUFnQixHQUFHQSxnQkFBZ0IsQ0FBQ2pSLEdBQUcsQ0FBRWtSLHVCQUErQixJQUFLO2NBQzVFLE9BQU8sT0FBT0EsdUJBQXVCLEtBQUssUUFBUSxHQUMvQ0EsdUJBQXVCLEVBQUV2UyxPQUFPLEdBQUd3USxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQ25EK0IsdUJBQXVCO1lBQzNCLENBQUMsQ0FBQztZQUVGNVQsSUFBSSxJQUFJLE1BQU04UixNQUFNLENBQUMsQ0FBQyxJQUFJbUIsV0FBVyxLQUFLLENBQUNVLGdCQUFnQixFQUFFOVEsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJOFEsZ0JBQWdCLEtBQUtsVCxTQUFTLEVBQUU7VUFDN0c7UUFDRDtRQUNBLElBQUlrUixzQkFBc0IsSUFBSWxWLE9BQU8sQ0FBQ29YLG1CQUFtQixFQUFFM1IsTUFBTSxHQUFHLENBQUMsRUFBRTtVQUN0RWxDLElBQUksSUFBSSxNQUFNOFIsTUFBTSxDQUFDLENBQUMseUJBQXlCclYsT0FBTyxDQUFDb1gsbUJBQW1CLENBQUNoUixJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDeEY7UUFDQSxLQUFLLE1BQU1vUSxXQUFXLElBQUl4VyxPQUFPLENBQUNxWCxjQUFjLEVBQUU7VUFDakQsSUFBSXJYLE9BQU8sQ0FBQ3FYLGNBQWMsQ0FBQ3JVLGNBQWMsQ0FBQ3dULFdBQVcsQ0FBQyxFQUFFO1lBQ3ZEalQsSUFBSSxJQUFJLE1BQU04UixNQUFNLENBQUMsQ0FBQyxJQUFJbUIsV0FBVyxRQUFRO1VBQzlDO1FBQ0Q7UUFDQWpULElBQUksSUFBSSxFQUFFO1FBQ1YsT0FBT0EsSUFBSTtNQUNaLENBQUM7TUFDRCtULGdCQUFnQixFQUFFLFNBQUFBLENBQVV0WCxPQUFzRSxFQUFFdVgsS0FBYSxFQUFFO1FBQ2xILElBQUlDLEdBQUcsR0FBRyxNQUFNbkMsTUFBTSxDQUFDLENBQUMsR0FBR2tDLEtBQUssRUFBRTtRQUNsQ3BDLFFBQVEsRUFBRTtRQUVWLElBQUluVixPQUFPLENBQUM2VyxhQUFhLENBQUNVLEtBQUssQ0FBQyxFQUFFO1VBQ2pDQyxHQUFHLElBQUksWUFBWXhYLE9BQU8sQ0FBQzZXLGFBQWEsQ0FBQ1UsS0FBSyxDQUFDLENBQUN0TixJQUFJLGlCQUFpQm9MLE1BQU0sQ0FBQyxDQUFDLEVBQUU7UUFDaEYsQ0FBQyxNQUFNO1VBQ05tQyxHQUFHLElBQUksT0FBT25DLE1BQU0sQ0FBQyxDQUFDLEVBQUU7UUFDekI7UUFDQSxPQUFPbUMsR0FBRztNQUNYLENBQUM7TUFDREMsY0FBYyxFQUFFLFNBQUFBLENBQVV6WCxPQUFZLEVBQUV1WCxLQUFhLEVBQUU7UUFDdERwQyxRQUFRLEVBQUU7UUFDVixJQUFJblYsT0FBTyxDQUFDNlcsYUFBYSxDQUFDVSxLQUFLLENBQUMsRUFBRTtVQUNqQyxPQUFPLEtBQUtsQyxNQUFNLENBQUMsQ0FBQyxHQUFHO1FBQ3hCLENBQUMsTUFBTTtVQUNOLE9BQU8sS0FBS0EsTUFBTSxDQUFDLENBQUMsR0FBRztRQUN4QjtNQUNEO0lBQ0QsQ0FBQztJQUNELElBQUk3TyxLQUFLLENBQUNDLE9BQU8sQ0FBQ3dPLGtCQUFrQixDQUFDLEVBQUU7TUFDdEMsT0FBT0Esa0JBQWtCLENBQUNoUCxHQUFHLENBQUV5UixlQUEyQixJQUFLO1FBQzlELE9BQU8sSUFBSUMsVUFBVSxDQUFDRCxlQUFlLEVBQUVqQyxpQkFBaUIsQ0FBQyxDQUFDbUMsU0FBUyxDQUFDLENBQUM7TUFDdEUsQ0FBQyxDQUFDO0lBQ0gsQ0FBQyxNQUFNO01BQ04sT0FBTyxJQUFJRCxVQUFVLENBQUMxQyxrQkFBa0IsRUFBRVEsaUJBQWlCLENBQUMsQ0FBQ21DLFNBQVMsQ0FBQyxDQUFDO0lBQ3pFO0VBQ0Q7RUFBQ3ZSLFFBQUEsQ0FBQTJPLGdCQUFBLEdBQUFBLGdCQUFBO0VBRU0sU0FBUzZDLHFCQUFxQkEsQ0FBQzVDLGtCQUE4QyxFQUFrQztJQUFBLElBQWhDQyxzQkFBc0IsR0FBQXhMLFNBQUEsQ0FBQWpFLE1BQUEsUUFBQWlFLFNBQUEsUUFBQTFGLFNBQUEsR0FBQTBGLFNBQUEsTUFBRyxLQUFLO0lBQ25ILElBQUl5TCxRQUFRLEdBQUcsQ0FBQztJQUNoQixNQUFNN04sR0FBRyxHQUFHLHdCQUF3QjtJQUNwQyxNQUFNOE4sU0FBUyxHQUFHLG1CQUFtQjtJQUNyQyxNQUFNMEMsaUJBQTBDLEdBQUcsQ0FBQyxDQUFDO0lBRXJELFNBQVNDLGlCQUFpQkEsQ0FBQ0MsU0FBaUIsRUFBVTtNQUNyRCxNQUFNQyxVQUFVLEdBQUdELFNBQVMsQ0FBQ0UsS0FBSyxDQUFDLEdBQUcsQ0FBQztNQUN2QyxNQUFNQyxTQUFTLEdBQUdGLFVBQVUsQ0FBQzlSLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7TUFDekMsTUFBTXhCLElBQUksR0FBR3NULFVBQVUsQ0FBQ0EsVUFBVSxDQUFDeFMsTUFBTSxHQUFHLENBQUMsQ0FBQztNQUM5QyxJQUFJMlMsY0FBYyxHQUFHRCxTQUFTLENBQUNBLFNBQVMsQ0FBQzFTLE1BQU0sR0FBRyxDQUFDLENBQUM7TUFDcEQsSUFBSWpFLGtCQUFrQixDQUFDMlcsU0FBUyxDQUFDL1IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7UUFDNUNnUyxjQUFjLEdBQUc1VyxrQkFBa0IsQ0FBQzJXLFNBQVMsQ0FBQy9SLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztNQUN6RDtNQUNBLElBQUlnUyxjQUFjLEtBQUtwVSxTQUFTLEVBQUU7UUFDakNvVSxjQUFjLEdBQUcsTUFBTTtNQUN4QjtNQUNBLE9BQU9BLGNBQWM7SUFDdEI7SUFFQSxTQUFTL0MsTUFBTUEsQ0FBQSxFQUFZO01BQUEsSUFBWEMsS0FBSyxHQUFBNUwsU0FBQSxDQUFBakUsTUFBQSxRQUFBaUUsU0FBQSxRQUFBMUYsU0FBQSxHQUFBMEYsU0FBQSxNQUFHLENBQUM7TUFDeEIsSUFBSTZMLEdBQUcsR0FBRyxFQUFFO01BQ1osS0FBSyxJQUFJQyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUdMLFFBQVEsR0FBR0csS0FBSyxFQUFFRSxDQUFDLEVBQUUsRUFBRTtRQUMxQ0QsR0FBRyxJQUFJLElBQUk7TUFDWjtNQUNBLE9BQU9BLEdBQUc7SUFDWDtJQUNBLE1BQU1FLGlCQUFpQixHQUFHO01BQ3pCQyxLQUFLLEVBQUUsU0FBQUEsQ0FBVTFWLE9BQVksRUFBRTJWLGdCQUF3QixFQUFFO1FBQ3hELElBQUlDLGFBQWEsR0FBRyxFQUFFO1FBQ3RCLElBQUlELGdCQUFnQixFQUFFO1VBQ3JCLElBQUkzVixPQUFPLENBQUM2VixTQUFTLENBQUMsQ0FBQyxFQUFFO1lBQ3hCLE1BQU1DLGFBQWEsR0FBSTlWLE9BQU8sQ0FBQzZWLFNBQVMsQ0FBQyxDQUFDLENBQUNFLGNBQWMsQ0FBQ0osZ0JBQWdCLENBQUMsRUFBc0JLLE9BQU8sR0FBR2hXLE9BQU8sQ0FBQztZQUNuSCxJQUFJOFYsYUFBYSxHQUFHLENBQUMsRUFBRTtjQUN0QkYsYUFBYSxJQUFJLEtBQUtQLE1BQU0sQ0FBQyxDQUFDLEVBQUU7WUFDakM7VUFDRDtRQUNEO1FBQ0EsTUFBTWdELFFBQVEsR0FBR3JZLE9BQU8sQ0FBQ2lXLFdBQVcsQ0FBQyxDQUFDLENBQUNDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hELE1BQU0rQixVQUFVLEdBQUdJLFFBQVEsQ0FBQ0gsS0FBSyxDQUFDLEdBQUcsQ0FBQztRQUN0QyxNQUFNdlQsSUFBSSxHQUFHc1QsVUFBVSxDQUFDQSxVQUFVLENBQUN4UyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQzlDLE1BQU0yUyxjQUFjLEdBQUdMLGlCQUFpQixDQUFDTSxRQUFRLENBQUM7UUFDbER6QyxhQUFhLElBQUksSUFBSXdDLGNBQWMsSUFBSXpULElBQUksSUFBSTtRQUMvQyxJQUFJLENBQUNtVCxpQkFBaUIsQ0FBQ00sY0FBYyxDQUFDLEVBQUU7VUFDdkNOLGlCQUFpQixDQUFDTSxjQUFjLENBQUMsR0FBRyxJQUFJO1VBQ3hDeEMsYUFBYSxJQUFJLEdBQUdQLE1BQU0sQ0FBQyxDQUFDLFNBQVMrQyxjQUFjLEtBQUs1WSxZQUFZLENBQUM0WSxjQUFjLENBQUMsR0FBRztRQUN4RjtRQUNBLE9BQU94QyxhQUFhO01BQ3JCLENBQUM7TUFDRE8sR0FBRyxFQUFFLFNBQUFBLENBQVVuVyxPQUFZLEVBQUU7UUFDNUIsTUFBTXFZLFFBQVEsR0FBR3JZLE9BQU8sQ0FBQ2lXLFdBQVcsQ0FBQyxDQUFDLENBQUNDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hELE1BQU0rQixVQUFVLEdBQUdJLFFBQVEsQ0FBQ0gsS0FBSyxDQUFDLEdBQUcsQ0FBQztRQUN0QyxNQUFNdlQsSUFBSSxHQUFHc1QsVUFBVSxDQUFDQSxVQUFVLENBQUN4UyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQzlDLE1BQU0yUyxjQUFjLEdBQUdMLGlCQUFpQixDQUFDTSxRQUFRLENBQUM7UUFDbEQsSUFBSUMsY0FBYyxHQUFHLEtBQUs7UUFDMUIsS0FBSyxNQUFNQyxnQkFBZ0IsSUFBSXZZLE9BQU8sQ0FBQ3dZLGFBQWEsRUFBRTtVQUNyRCxJQUNFLENBQUNoUyxLQUFLLENBQUNDLE9BQU8sQ0FBQ3pHLE9BQU8sQ0FBQ3dZLGFBQWEsQ0FBQ0QsZ0JBQWdCLENBQUMsQ0FBQyxJQUN2RHZZLE9BQU8sQ0FBQ3dZLGFBQWEsQ0FBQ0QsZ0JBQWdCLENBQUMsS0FBSyxJQUFJLElBQ2hEdlksT0FBTyxDQUFDd1ksYUFBYSxDQUFDRCxnQkFBZ0IsQ0FBQyxLQUFLdlUsU0FBUyxJQUNyRHdDLEtBQUssQ0FBQ0MsT0FBTyxDQUFDekcsT0FBTyxDQUFDd1ksYUFBYSxDQUFDRCxnQkFBZ0IsQ0FBQyxDQUFDLElBQUl2WSxPQUFPLENBQUN3WSxhQUFhLENBQUNELGdCQUFnQixDQUFDLENBQUM5UyxNQUFNLEdBQUcsQ0FBRSxFQUM3RztZQUNENlMsY0FBYyxHQUFHLElBQUk7VUFDdEI7UUFDRDtRQUNBLElBQUlBLGNBQWMsRUFBRTtVQUNuQixPQUFPLEtBQUtGLGNBQWMsSUFBSXpULElBQUksR0FBRztRQUN0QyxDQUFDLE1BQU07VUFDTixPQUFPLElBQUk7UUFDWjtNQUNELENBQUM7TUFDRHlSLE1BQU0sRUFBRSxTQUFBQSxDQUFVcFcsT0FBWSxFQUFFO1FBQy9CLElBQUk0USxFQUFFLEdBQUc1USxPQUFPLENBQUNxVyxLQUFLLENBQUMsQ0FBQztRQUN4QnpGLEVBQUUsR0FBRyxPQUFPQSxFQUFFLEtBQUssUUFBUSxHQUFHQSxFQUFFLEVBQUVoTSxPQUFPLEdBQUd3USxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUd4RSxFQUFFO1FBQ2pFLElBQUlyTixJQUFJLEdBQUcsRUFBRTtRQUNiLElBQUksQ0FBQytTLHFCQUFxQixDQUFDQyxhQUFhLENBQUMzRixFQUFFLENBQUMsRUFBRTtVQUM3Q3JOLElBQUksR0FBRyxPQUFPcU4sRUFBRSxHQUFHO1FBQ3BCO1FBQ0EsSUFBSWxQLElBQUksR0FBR0QsTUFBTSxDQUFDQyxJQUFJLENBQUMxQixPQUFPLENBQUN5VyxXQUFXLENBQUMsQ0FDekNnQyxNQUFNLENBQUNoWCxNQUFNLENBQUNDLElBQUksQ0FBQzFCLE9BQU8sQ0FBQzZXLGFBQWEsQ0FBQyxDQUFDLENBQzFDNEIsTUFBTSxDQUFDaFgsTUFBTSxDQUFDQyxJQUFJLENBQUMxQixPQUFPLENBQUNpWCxhQUFhLENBQUMsQ0FBQyxDQUMxQ3dCLE1BQU0sQ0FBQ2hYLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDMUIsT0FBTyxDQUFDcVgsY0FBYyxDQUFDLENBQUM7UUFDN0MzVixJQUFJLEdBQUdBLElBQUksQ0FBQ3NHLElBQUksQ0FBQyxDQUFDQyxDQUFDLEVBQUVDLENBQUMsS0FBS0QsQ0FBQyxDQUFDRSxhQUFhLENBQUNELENBQUMsQ0FBQyxDQUFDO1FBQzlDLE1BQU13USxVQUFVLEdBQUcsSUFBSUMsR0FBRyxDQUFDalgsSUFBSSxDQUFDO1FBQ2hDQSxJQUFJLEdBQUc4RSxLQUFLLENBQUNvUyxJQUFJLENBQUNGLFVBQVUsQ0FBQztRQUM3QixLQUFLLE1BQU1sQyxXQUFXLElBQUk5VSxJQUFJLEVBQUU7VUFDL0IsSUFBSTFCLE9BQU8sQ0FBQzZXLGFBQWEsQ0FBQzdULGNBQWMsQ0FBQ3dULFdBQVcsQ0FBQyxFQUFFO1lBQ3RELE1BQU1NLGFBQWEsR0FBRztjQUFFLEdBQUc5VyxPQUFPLENBQUM2VyxhQUFhLENBQUNMLFdBQVc7WUFBRSxDQUFDO1lBQy9ELElBQUlNLGFBQWEsQ0FBQzdILGFBQWEsRUFBRTtjQUNoQzFMLElBQUksSUFBSSxLQUFLOFIsTUFBTSxDQUFDLENBQUMsR0FBR21CLFdBQVcsS0FBS00sYUFBYSxDQUFDN0gsYUFBYSxDQUFDckssT0FBTyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRztZQUM1RixDQUFDLE1BQU07Y0FDTixJQUFJa1MsYUFBYSxDQUFDN0YsSUFBSSxFQUFFOEYsYUFBYSxFQUFFO2dCQUN0QyxPQUFPRCxhQUFhLENBQUM3RixJQUFJLENBQUM4RixhQUFhO2NBQ3hDO2NBRUEsSUFBSUQsYUFBYSxDQUFDRSxPQUFPLEVBQUU7Z0JBQzFCLE9BQU9GLGFBQWEsQ0FBQ0UsT0FBTztjQUM3QjtjQUNBLElBQUlGLGFBQWEsQ0FBQytCLFFBQVEsRUFBRTtnQkFDM0IsT0FBTy9CLGFBQWEsQ0FBQytCLFFBQVE7Y0FDOUI7Y0FDQXRWLElBQUksSUFBSSxLQUFLOFIsTUFBTSxDQUFDLENBQUMsR0FBR21CLFdBQVcsS0FBS0csSUFBSSxDQUFDQyxTQUFTLENBQUNFLGFBQWEsQ0FBQyxHQUFHO1lBQ3pFO1VBQ0QsQ0FBQyxNQUFNLElBQUk5VyxPQUFPLENBQUN5VyxXQUFXLENBQUN6VCxjQUFjLENBQUN3VCxXQUFXLENBQUMsSUFBSXhXLE9BQU8sQ0FBQ3lXLFdBQVcsQ0FBQ0QsV0FBVyxDQUFDLEtBQUt4UyxTQUFTLEVBQUU7WUFDN0csSUFBSTBTLGFBQWEsR0FBRzFXLE9BQU8sQ0FBQ3lXLFdBQVcsQ0FBQ0QsV0FBVyxDQUFDO1lBQ3BERSxhQUFhLEdBQUcsT0FBT0EsYUFBYSxLQUFLLFFBQVEsR0FBR0EsYUFBYSxFQUFFOVIsT0FBTyxHQUFHMEMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxHQUFHb1AsYUFBYTtZQUM1R0EsYUFBYSxHQUFHLE9BQU9BLGFBQWEsS0FBSyxRQUFRLEdBQUdBLGFBQWEsRUFBRTlSLE9BQU8sR0FBR3dRLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBR3NCLGFBQWE7WUFDN0csSUFBSTtjQUNIQSxhQUFhLEdBQUcsT0FBT0EsYUFBYSxLQUFLLFFBQVEsR0FBR0MsSUFBSSxDQUFDQyxTQUFTLENBQUNGLGFBQWEsQ0FBQyxHQUFHQSxhQUFhO1lBQ2xHLENBQUMsQ0FBQyxPQUFPaEUsQ0FBQyxFQUFFO2NBQ1g7WUFBQTtZQUdEblAsSUFBSSxJQUFJLEtBQUs4UixNQUFNLENBQUMsQ0FBQyxJQUFJbUIsV0FBVyxLQUFLRSxhQUFhLEdBQUc7VUFDMUQsQ0FBQyxNQUFNLElBQUkxVyxPQUFPLENBQUNpWCxhQUFhLENBQUNqVSxjQUFjLENBQUN3VCxXQUFXLENBQUMsRUFBRTtZQUM3RCxJQUFJVSxnQkFBZ0IsR0FBR2xYLE9BQU8sQ0FBQ2lYLGFBQWEsQ0FBQ1QsV0FBVyxDQUFDO1lBQ3pELElBQUksQ0FBQ2hRLEtBQUssQ0FBQ0MsT0FBTyxDQUFDeVEsZ0JBQWdCLENBQUMsRUFBRTtjQUNyQ0EsZ0JBQWdCLEdBQUcsQ0FBQ0EsZ0JBQWdCLENBQUM7WUFDdEM7WUFDQUEsZ0JBQWdCLEdBQUdBLGdCQUFnQixDQUFDalIsR0FBRyxDQUFFa1IsdUJBQStCLElBQUs7Y0FDNUUsT0FBTyxPQUFPQSx1QkFBdUIsS0FBSyxRQUFRLEdBQy9DQSx1QkFBdUIsRUFBRXZTLE9BQU8sR0FBR3dRLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FDbkQrQix1QkFBdUI7WUFDM0IsQ0FBQyxDQUFDO1lBRUY1VCxJQUFJLElBQUksS0FBSzhSLE1BQU0sQ0FBQyxDQUFDLElBQUltQixXQUFXLEtBQUssQ0FBQ1UsZ0JBQWdCLEVBQUU5USxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUk4USxnQkFBZ0IsS0FBS2xULFNBQVMsR0FBRztVQUM3RyxDQUFDLE1BQU0sSUFBSWhFLE9BQU8sQ0FBQ3FYLGNBQWMsQ0FBQ3JVLGNBQWMsQ0FBQ3dULFdBQVcsQ0FBQyxFQUFFO1lBQzlELElBQUl4VyxPQUFPLENBQUNxWCxjQUFjLENBQUNiLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFc0MsU0FBUyxFQUFFblUsSUFBSSxFQUFFO2NBQzVEcEIsSUFBSSxJQUFJLEtBQUs4UixNQUFNLENBQUMsQ0FBQyxJQUFJbUIsV0FBVyxLQUFLeFcsT0FBTyxDQUFDcVgsY0FBYyxDQUFDYixXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRXNDLFNBQVMsRUFBRW5VLElBQUksR0FBRztZQUNwRyxDQUFDLE1BQU07Y0FDTnBCLElBQUksSUFBSSxLQUFLOFIsTUFBTSxDQUFDLENBQUMsSUFBSW1CLFdBQVcscUJBQXFCO1lBQzFEO1VBQ0Q7UUFDRDtRQUNBLElBQUl0QixzQkFBc0IsSUFBSWxWLE9BQU8sQ0FBQ29YLG1CQUFtQixFQUFFM1IsTUFBTSxHQUFHLENBQUMsRUFBRTtVQUN0RWxDLElBQUksSUFBSSxLQUFLOFIsTUFBTSxDQUFDLENBQUMseUJBQXlCclYsT0FBTyxDQUFDb1gsbUJBQW1CLENBQUNoUixJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDdkY7UUFDQTdDLElBQUksSUFBSSxJQUFJO1FBQ1osSUFBSStVLGNBQWMsR0FBRyxLQUFLO1FBQzFCLEtBQUssTUFBTUMsZ0JBQWdCLElBQUl2WSxPQUFPLENBQUN3WSxhQUFhLEVBQUU7VUFDckQsSUFDRSxDQUFDaFMsS0FBSyxDQUFDQyxPQUFPLENBQUN6RyxPQUFPLENBQUN3WSxhQUFhLENBQUNELGdCQUFnQixDQUFDLENBQUMsSUFDdkR2WSxPQUFPLENBQUN3WSxhQUFhLENBQUNELGdCQUFnQixDQUFDLEtBQUssSUFBSSxJQUNoRHZZLE9BQU8sQ0FBQ3dZLGFBQWEsQ0FBQ0QsZ0JBQWdCLENBQUMsS0FBS3ZVLFNBQVMsSUFDckR3QyxLQUFLLENBQUNDLE9BQU8sQ0FBQ3pHLE9BQU8sQ0FBQ3dZLGFBQWEsQ0FBQ0QsZ0JBQWdCLENBQUMsQ0FBQyxJQUFJdlksT0FBTyxDQUFDd1ksYUFBYSxDQUFDRCxnQkFBZ0IsQ0FBQyxDQUFDOVMsTUFBTSxHQUFHLENBQUUsRUFDN0c7WUFDRDZTLGNBQWMsR0FBRyxJQUFJO1VBQ3RCO1FBQ0Q7UUFDQSxJQUFJQSxjQUFjLEVBQUU7VUFDbkIvVSxJQUFJLElBQUksR0FBRztRQUNaO1FBQ0EsT0FBT0EsSUFBSTtNQUNaLENBQUM7TUFDRCtULGdCQUFnQixFQUFFLFNBQUFBLENBQVV0WCxPQUFZLEVBQUV1WCxLQUFhLEVBQUU7UUFDeEQsTUFBTWEsY0FBYyxHQUFHTCxpQkFBaUIsQ0FBQy9YLE9BQU8sQ0FBQ2lXLFdBQVcsQ0FBQyxDQUFDLENBQUNDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDekUsSUFBSXNCLEdBQUcsR0FBRyxLQUFLbkMsTUFBTSxDQUFDLENBQUMsSUFBSStDLGNBQWMsSUFBSWIsS0FBSyxHQUFHO1FBQ3JEcEMsUUFBUSxFQUFFO1FBQ1ZxQyxHQUFHLElBQUksS0FBS25DLE1BQU0sQ0FBQyxDQUFDLEVBQUU7UUFDdEIsT0FBT21DLEdBQUc7TUFDWCxDQUFDO01BQ0RDLGNBQWMsRUFBRSxTQUFBQSxDQUFVelgsT0FBWSxFQUFFdVgsS0FBYSxFQUFFO1FBQ3REcEMsUUFBUSxFQUFFO1FBQ1YsTUFBTWlELGNBQWMsR0FBR0wsaUJBQWlCLENBQUMvWCxPQUFPLENBQUNpVyxXQUFXLENBQUMsQ0FBQyxDQUFDQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLElBQUlsVyxPQUFPLENBQUM2VyxhQUFhLENBQUNVLEtBQUssQ0FBQyxFQUFFO1VBQ2pDLE9BQU8sS0FBS2xDLE1BQU0sQ0FBQyxDQUFDLEtBQUsrQyxjQUFjLElBQUliLEtBQUssS0FBSztRQUN0RCxDQUFDLE1BQU07VUFDTixPQUFPLEtBQUtsQyxNQUFNLENBQUMsQ0FBQyxLQUFLK0MsY0FBYyxJQUFJYixLQUFLLEtBQUs7UUFDdEQ7TUFDRDtJQUNELENBQUM7SUFDRCxJQUFJd0IsTUFBTTtJQUNWLElBQUl2UyxLQUFLLENBQUNDLE9BQU8sQ0FBQ3dPLGtCQUFrQixDQUFDLEVBQUU7TUFDdEM4RCxNQUFNLEdBQUc5RCxrQkFBa0IsQ0FBQ2hQLEdBQUcsQ0FBRXlSLGVBQTJCLElBQUs7UUFDaEUsT0FBTyxJQUFJQyxVQUFVLENBQUNELGVBQWUsRUFBRWpDLGlCQUFpQixDQUFDLENBQUNtQyxTQUFTLENBQUMsQ0FBQztNQUN0RSxDQUFDLENBQUM7SUFDSCxDQUFDLE1BQU07TUFDTm1CLE1BQU0sR0FBRyxJQUFJcEIsVUFBVSxDQUFDMUMsa0JBQWtCLEVBQUVRLGlCQUFpQixDQUFDLENBQUNtQyxTQUFTLENBQUMsQ0FBQztJQUMzRTtJQUNBLE9BQU9sUixTQUFTLENBQUMsU0FBU3FTLE1BQU0sU0FBUyxDQUFDO0VBQzNDO0VBQUMxUyxRQUFBLENBQUF3UixxQkFBQSxHQUFBQSxxQkFBQTtFQUVNLFNBQVNtQixhQUFhQSxDQUFBLEVBQUc7SUFDL0IsSUFBSUMsU0FBb0I7SUFDeEIsTUFBTUMsU0FBUyxHQUFHLElBQUl0SCxPQUFPLENBQUUxSCxPQUFPLElBQUs7TUFDMUMrTyxTQUFTLEdBQUcvTyxPQUFPO0lBQ3BCLENBQUMsQ0FBQztJQUNGLE9BQU87TUFBRWlQLE9BQU8sRUFBRUQsU0FBUztNQUFFaFAsT0FBTyxFQUFFK087SUFBVSxDQUFDO0VBQ2xEO0VBQUM1UyxRQUFBLENBQUEyUyxhQUFBLEdBQUFBLGFBQUE7RUFFTSxTQUFTSSw2QkFBNkJBLENBQUNDLGFBQXVDLEVBQUU1VixNQUFnQyxFQUFXO0lBQ2pJLE9BQVE2VixhQUFhLENBQXFCQyxvQkFBb0IsQ0FDN0QsTUFBTTtNQUNMLE9BQU9GLGFBQWEsQ0FBQ0csVUFBVSxDQUFDLENBQUM7SUFDbEMsQ0FBQyxFQUNEO01BQ0NoVyxRQUFRLEVBQUUsU0FBQUEsQ0FBVWlXLGVBQW9DLEVBQUU7UUFDekRBLGVBQWUsQ0FBQ2hXLE1BQU0sR0FBR0EsTUFBTTtRQUMvQixPQUFPZ1csZUFBZTtNQUN2QjtJQUNELENBQ0QsQ0FBQztFQUNGO0VBQUNwVCxRQUFBLENBQUErUyw2QkFBQSxHQUFBQSw2QkFBQTtFQUVNLFNBQVNNLHFCQUFxQkEsQ0FBQSxFQUFpRDtJQUFBLFNBQUFDLEtBQUEsR0FBQWpRLFNBQUEsQ0FBQWpFLE1BQUEsRUFBN0NpUCxTQUFTLE9BQUFsTyxLQUFBLENBQUFtVCxLQUFBLEdBQUFDLEtBQUEsTUFBQUEsS0FBQSxHQUFBRCxLQUFBLEVBQUFDLEtBQUE7TUFBVGxGLFNBQVMsQ0FBQWtGLEtBQUEsSUFBQWxRLFNBQUEsQ0FBQWtRLEtBQUE7SUFBQTtJQUNqRDtJQUNBLE1BQU1DLG9CQUFvQixHQUFJQyxvQkFBb0IsQ0FBU0MsbUJBQW1CO0lBQzlFO0lBQ0EsTUFBTUMsZ0JBQWdCLEdBQUcxYSxJQUFJLENBQUNvUyxLQUFLLENBQUNvSSxvQkFBb0IsRUFBUyxxQkFBcUIsQ0FBQztJQUN2RkUsZ0JBQWdCLENBQUNDLGtCQUFrQixDQUFFLENBQUNDLFlBQW9CLEVBQUVDLFNBQWlCLEtBQUs7TUFDakYsS0FBSyxNQUFNdkYsUUFBUSxJQUFJRixTQUFTLEVBQUU7UUFDakMsSUFBSUUsUUFBUSxDQUFDalEsSUFBSSxLQUFLdVYsWUFBWSxFQUFFO1VBQ25DLE9BQU9FLGNBQWMsQ0FBQ3hGLFFBQVEsQ0FBQ3hFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQztNQUNEO01BQ0EsT0FBT3lKLG9CQUFvQixDQUFDSyxZQUFZLEVBQUVDLFNBQVMsQ0FBQztJQUNyRCxDQUFpQyxDQUFDO0lBQ2xDLE9BQU9ILGdCQUFnQjtFQUN4Qjs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQVpBM1QsUUFBQSxDQUFBcVQscUJBQUEsR0FBQUEscUJBQUE7RUFhTyxlQUFlVyxzQkFBc0JBLENBQzNDNVEsT0FPQyxFQUNEOUUsSUFBYSxFQUNiMlYsU0FBa0IsRUFDOEQ7SUFDaEYsSUFBSUMsT0FBTyxHQUFHOVEsT0FBTyxFQUFFOFEsT0FBTztJQUM5QixJQUFJLENBQUNBLE9BQU8sRUFBRTtNQUNiQSxPQUFPLEdBQUdoUixVQUFVLENBQUNVLElBQUksQ0FBQzdELElBQUksQ0FBQ29VLFNBQVMsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0lBQ2xFO0lBQ0EsTUFBTUMsSUFBSSxHQUFHQyxHQUFHLENBQUMsQ0FBQztJQUNsQixNQUFNOUosRUFBRSxHQUFHbkgsT0FBTyxFQUFFeUksV0FBVyxJQUFJLGVBQWV1SSxJQUFJLEVBQUU7SUFDeEQsTUFBTUUsVUFBVSxHQUFHL1EsRUFBRSxDQUFDQyxZQUFZLENBQUMwUSxPQUFPLENBQUMsQ0FBQzdQLFFBQVEsQ0FBQyxDQUFDO0lBQ3REa1EsR0FBRyxDQUFDdGIsSUFBSSxDQUFDdWIsb0JBQW9CLENBQUMscUJBQXFCSixJQUFJLDRCQUE0QixFQUFFRSxVQUFVLENBQUM7SUFBQyxJQUMzRkcsa0JBQWtCLDBCQUFBQyxlQUFBO01BQUEsU0FBQUQsbUJBQUE7UUFBQSxPQUFBQyxlQUFBLENBQUF0TCxLQUFBLE9BQUEvRixTQUFBO01BQUE7TUFBQXNSLGNBQUEsQ0FBQUYsa0JBQUEsRUFBQUMsZUFBQTtNQUFBLElBQUFFLE1BQUEsR0FBQUgsa0JBQUEsQ0FBQUksU0FBQTtNQUFBRCxNQUFBLENBQ3ZCRSxNQUFNLEdBQU4sU0FBQUEsTUFBTUEsQ0FBQSxFQUFHO1FBQ1IsT0FBT0MsSUFBQSxDQUFDQyxJQUFJLElBQU8sQ0FBQztNQUNyQixDQUFDO01BQUEsT0FBQVAsa0JBQUE7SUFBQSxFQUgrQlEsY0FBYztJQUsvQ1YsR0FBRyxDQUFDVyxFQUFFLENBQUNDLE1BQU0sQ0FBQyxlQUFlZixJQUFJLFlBQVksRUFBRSxDQUFDLDBCQUEwQixDQUFDLEVBQUUsVUFBVWdCLGFBQTJCLEVBQUU7TUFDbkgsWUFBWTs7TUFFWixPQUFPQyxZQUFZLENBQUN4VyxNQUFNLENBQUMsZUFBZXVWLElBQUksWUFBWSxFQUFFO1FBQzNEa0IsUUFBUSxFQUFFO1VBQ1RDLFFBQVEsRUFBRTtZQUNULFNBQVMsRUFBRTtjQUNWaEwsRUFBRSxFQUFFLE9BQU82SixJQUFJLEVBQUU7Y0FDakJvQixXQUFXLEVBQUU7Z0JBQ1pDLFdBQVcsRUFBRTtrQkFDWkMsR0FBRyxFQUFFLHFCQUFxQnRCLElBQUksR0FBRztrQkFDakN4SixJQUFJLEVBQUUsT0FBTztrQkFDYnpOLFFBQVEsRUFBRTtvQkFDVHdZLFlBQVksRUFBRTtrQkFDZjtnQkFDRDtjQUNEO1lBQ0QsQ0FBQztZQUNELFNBQVMsRUFBRTtjQUNWdlksTUFBTSxFQUFFO2dCQUNQLEVBQUUsRUFBRTtrQkFDSHdZLFVBQVUsRUFBRSxhQUFhO2tCQUN6QnpZLFFBQVEsRUFBRSxDQUFDO2dCQUNaO2NBQ0QsQ0FBQztjQUNEMFksT0FBTyxFQUFFO2dCQUNSQyxPQUFPLEVBQUU7a0JBQ1JDLE9BQU8sRUFBRTtvQkFDUm5MLElBQUksRUFBRSxXQUFXO29CQUNqQnRNLElBQUksRUFBRUEsSUFBSSxJQUFJLGlCQUFpQjtvQkFDL0JpTSxFQUFFLEVBQUUsU0FBUztvQkFDYjBKLFNBQVMsRUFBRUEsU0FBUztvQkFDcEI3USxPQUFPLEVBQUU7c0JBQ1JqRyxRQUFRLEVBQUU7d0JBQ1QsSUFBSWlHLE9BQU8sRUFBRTZELGdCQUFnQixJQUFJLENBQUMsQ0FBQyxDQUFDO3dCQUNwQ0ksV0FBVyxFQUFFakUsT0FBTyxFQUFFNFMsZUFBZSxJQUFJLFdBQVc7d0JBQ3BEQyxRQUFRLEVBQUUsS0FBSzt3QkFDZkMsV0FBVyxFQUFFOVMsT0FBTyxFQUFFK1MsV0FBVyxJQUFJMUIsa0JBQWtCO3dCQUN2RDFLLE9BQU8sRUFBRTNHLE9BQU8sRUFBRTJHO3NCQUNuQjtvQkFDRDtrQkFDRDtnQkFDRCxDQUFDO2dCQUNEcU0sTUFBTSxFQUFFLENBQ1A7a0JBQ0NDLE9BQU8sRUFBRSxVQUFVO2tCQUNuQi9YLElBQUksRUFBRSxTQUFTO2tCQUNmZ1ksTUFBTSxFQUFFO2dCQUNULENBQUM7Y0FFSDtZQUNEO1VBQ0Q7UUFDRDtNQUNELENBQUMsQ0FBQztJQUNILENBQUMsQ0FBQztJQUNGLE1BQU1DLGdCQUFnQixHQUFJLE1BQU05SyxTQUFTLENBQUM1RCxNQUFNLENBQUM7TUFBRXZKLElBQUksRUFBRSxlQUFlOFYsSUFBSSxFQUFFO01BQUU3SixFQUFFLEVBQUVBO0lBQUcsQ0FBQyxDQUFrQjtJQUUxRyxNQUFNZ00sZ0JBQWdCLENBQUNDLFdBQVc7SUFDbEMsTUFBTUMsQ0FBQyxHQUFHLE1BQU9GLGdCQUFnQixDQUFDRyxTQUFTLENBQUMsQ0FBQyxDQUFDQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQXlCQyxJQUFJLEdBQUcsQ0FBQztJQUNuRyxPQUFPO01BQUVyWixZQUFZLEVBQUVnWixnQkFBZ0I7TUFBRU0saUJBQWlCLEVBQUVKLENBQUMsQ0FBQ0s7SUFBTyxDQUFDO0VBQ3ZFOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUxBOVcsUUFBQSxDQUFBZ1Usc0JBQUEsR0FBQUEsc0JBQUE7RUFNTyxTQUFTK0MsV0FBV0EsQ0FBQ0MsVUFBMEIsRUFBRWhiLFFBQTJDLEVBQTJCO0lBQzdILEtBQUssSUFBSW1ULENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBRzZILFVBQVUsQ0FBQzVYLE1BQU0sRUFBRStQLENBQUMsRUFBRSxFQUFFO01BQzNDLE1BQU04SCxPQUFPLEdBQUdELFVBQVUsQ0FBQ0UsSUFBSSxDQUFDL0gsQ0FBQyxDQUFnQjtNQUNqRCxJQUFJblQsUUFBUSxDQUFDaWIsT0FBTyxDQUFDLEVBQUU7UUFDdEIsT0FBT0EsT0FBTztNQUNmO0lBQ0Q7SUFDQSxPQUFPdFosU0FBUztFQUNqQjs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFMQXFDLFFBQUEsQ0FBQStXLFdBQUEsR0FBQUEsV0FBQTtFQU1PLGVBQWVJLFlBQVlBLENBQUN4ZCxPQUFzQixFQUFFeWQsU0FBaUIsRUFBa0I7SUFDN0YsT0FBTyxJQUFJN0wsT0FBTyxDQUFFMUgsT0FBTyxJQUFLO01BQy9CbEssT0FBTyxDQUFDMGQsZUFBZSxDQUFDRCxTQUFTLEVBQUdFLEtBQVksSUFBSztRQUNwRHpULE9BQU8sQ0FBQ3lULEtBQUssQ0FBQztNQUNmLENBQUMsQ0FBQztJQUNILENBQUMsQ0FBQztFQUNIOztFQUVBO0FBQ0E7QUFDQTtBQUNBO0VBSEF0WCxRQUFBLENBQUFtWCxZQUFBLEdBQUFBLFlBQUE7RUFJTyxTQUFTSSx3QkFBd0JBLENBQUNDLE9BQWdCLEVBQVE7SUFDaEUxTyxhQUFhLENBQUMyTyxtQkFBbUIsR0FBR0QsT0FBTztFQUM1QztFQUFDeFgsUUFBQSxDQUFBdVgsd0JBQUEsR0FBQUEsd0JBQUE7RUFBQSxPQUFBdlgsUUFBQTtBQUFBIiwiaWdub3JlTGlzdCI6W119
1085
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJMb2ciLCJzZXRMZXZlbCIsImplc3QiLCJzZXRUaW1lb3V0IiwibmFtZVNwYWNlTWFwIiwibWFjcm8iLCJtYWNyb3MiLCJmZUJCIiwibWFjcm9GaWVsZCIsIm1hY3JvZGF0YSIsImxvZyIsImN1c3RvbURhdGEiLCJjb250cm9sIiwiY29udHJvbHMiLCJjb3JlIiwiZHQiLCJtIiwiZiIsImZsIiwiaW50ZXJuYWxNYWNybyIsIm1kYyIsImFjdGlvbnRvb2xiYXIiLCJtZGNGaWVsZCIsIm1kY1RhYmxlIiwidSIsInV4YXAiLCJtYWNyb01pY3JvQ2hhcnQiLCJtaWNyb0NoYXJ0IiwibWFjcm9UYWJsZSIsIm1kY3ZjIiwibWRjdiIsInZhbHVlSGVscCIsImNvbnRlbnRTd2l0Y2hlciIsImZpbHRlckJhciIsImZiQ29udHJvbHMiLCJkcmFmdEluZGljYXRvciIsInJldmVzZU5hbWVzcGFjZU1hcCIsIk9iamVjdCIsImtleXMiLCJyZWR1Y2UiLCJyZXZlcnNlTWFwIiwiY3VycmVudE5hbWUiLCJzZWxlY3QiLCJ4cGF0aCIsInVzZU5hbWVzcGFjZXMiLCJkZWZhdWx0RmFrZVNpZGVFZmZlY3RTZXJ2aWNlIiwiY29tcHV0ZUZpZWxkR3JvdXBJZHMiLCJfZ2V0VGVtcGxhdGVkU2VsZWN0b3IiLCJ4bWxkb20iLCJzZWxlY3RvciIsInJvb3RQYXRoIiwibm9kZU5hbWUiLCJzdGFydHNXaXRoIiwiX2J1aWxkUHJlUHJvY2Vzc29yU2V0dGluZ3MiLCJzTWV0YWRhdGFVcmwiLCJtQmluZGluZ0NvbnRleHRzIiwibU1vZGVscyIsImZha2VTaWRlRWZmZWN0U2VydmljZSIsIm9NZXRhTW9kZWwiLCJnZXRNZXRhTW9kZWwiLCJoYXNPd25Qcm9wZXJ0eSIsImFzc2lnbiIsImNvbnZlcnRlckNvbnRleHQiLCJUZW1wbGF0ZU1vZGVsIiwiZm9yRWFjaCIsInNNb2RlbE5hbWUiLCJpc1RlbXBsYXRlTW9kZWwiLCJkYXRhIiwic2V0dGluZ3MiLCJtb2RlbHMiLCJtZXRhTW9kZWwiLCJiaW5kaW5nQ29udGV4dHMiLCJhcHBDb21wb25lbnQiLCJnZXRTaWRlRWZmZWN0c1NlcnZpY2UiLCJmbiIsImdldERpYWdub3N0aWNzIiwidW5kZWZpbmVkIiwiZ2V0U2hlbGxTZXJ2aWNlcyIsIm1vY2tSZXR1cm5WYWx1ZSIsInNLZXkiLCJleHBlY3QiLCJnZXRPYmplY3QiLCJ0b0JlRGVmaW5lZCIsIm9Nb2RlbCIsImNyZWF0ZUJpbmRpbmdDb250ZXh0IiwiX2xvYWRSZXNvdXJjZVZpZXciLCJ2aWV3TmFtZSIsIm5hbWUiLCJyZXBsYWNlIiwidmlldyIsIkxvYWRlckV4dGVuc2lvbnMiLCJsb2FkUmVzb3VyY2UiLCJkb2N1bWVudEVsZW1lbnQiLCJydW5YUGF0aFF1ZXJ5IiwiZXh0ZW5kIiwidG9IYXZlQ29udHJvbCIsIm5vZGVzIiwibWVzc2FnZSIsIm91dHB1dFhtbCIsInNlcmlhbGl6ZVhNTCIsInBhc3MiLCJsZW5ndGgiLCJ0b05vdEhhdmVDb250cm9sIiwidG9IYXZlVGVtcGxhdGluZ0Vycm9ycyIsInhtbCIsInhtbFRleHQiLCJiYXNlNjRFbnRyaWVzIiwibWF0Y2giLCJlcnJvck1lc3NhZ2VzIiwibWFwIiwiYXRvYiIsInNsaWNlIiwiam9pbiIsIl9leHBvcnRzIiwiZm9ybWF0QnVpbGRpbmdCbG9ja1hNTCIsInhtbFN0cmluZyIsIkFycmF5IiwiaXNBcnJheSIsImZvcm1hdFhNTCIsImdldENvbnRyb2xBdHRyaWJ1dGUiLCJjb250cm9sU2VsZWN0b3IiLCJhdHRyaWJ1dGVOYW1lIiwieG1sRG9tIiwic2VyaWFsaXplciIsIndpbmRvdyIsIlhNTFNlcmlhbGl6ZXIiLCJub2RlIiwic2VyaWFsaXplVG9TdHJpbmciLCJTVEFSVCIsIkVORCIsIlVJRCIsIlVJRDIiLCJsaW5lcyIsImN1cnJlbnRMaW5lIiwibGV2ZWwiLCJhdHRyaWJ1dGVzIiwibmV3bGluZSIsInB1c2giLCJyZXBlYXQiLCJhcHBlbmRBdHRyaWJ1dGVzIiwic29ydCIsImEiLCJiIiwibG9jYWxlQ29tcGFyZSIsImluY2x1ZGVzIiwiYXR0cmlidXRlIiwidmFsdWUiLCJhcHBlbmQiLCJwYXJzZXIiLCJyZWFkIiwiY3JlYXRlUGFyc2VyIiwib25PcGVuVGFnU3RhcnQiLCJvbk9wZW5UYWdOYW1lIiwib25BdHRyTmFtZSIsInVuc2hpZnQiLCJvbkF0dHJWYWx1ZSIsIm9uT3BlblRhZ0VuZCIsInNlbGZDbG9zZWQiLCJvbkNsb3NlVGFnU3RhcnQiLCJvbkNsb3NlVGFnTmFtZSIsIm9uQ2xvc2VUYWdFbmQiLCJwYXJzZSIsInRyaW0iLCJjb21waWxlQ0RTIiwiY2RzVXJsIiwib3B0aW9ucyIsImFyZ3VtZW50cyIsImNkc1N0cmluZyIsImZzIiwicmVhZEZpbGVTeW5jIiwiZWRteENvbnRlbnQiLCJjZHMyZWRteCIsImRpciIsInBhdGgiLCJyZXNvbHZlIiwiYWxsT3B0aW9ucyIsImVudHJpZXMiLCJlZG14RmlsZU5hbWUiLCJmaWxlbmFtZSIsIl9yZWYiLCJvcHRpb25LZXkiLCJvcHRpb25WYWx1ZSIsInRvU3RyaW5nIiwiYmFzZW5hbWUiLCJlZG14RmlsZVBhdGgiLCJta2RpclN5bmMiLCJyZWN1cnNpdmUiLCJ3cml0ZUZpbGVTeW5jIiwiY2RzIiwic2VydmljZSIsInNvdXJjZXMiLCJyZXF1aXJlIiwiY3NuIiwiY29tcGlsZXIiLCJjb21waWxlU291cmNlcyIsImVkbXhPcHRpb25zIiwib2RhdGFGb3JlaWduS2V5cyIsIm9kYXRhRm9ybWF0Iiwib2RhdGFDb250YWlubWVudCIsImVkbXgiLCJ0byIsIkVycm9yIiwiZ2V0RmFrZVNpZGVFZmZlY3RzU2VydmljZSIsImNsYXNzTmFtZU9EYXRhTW9kZWwiLCJzY29wZU9iamVjdCIsImdldE1vZGVsIiwiaXNBIiwiZ2V0U2VydmljZVVybCIsImdldFNlcnZpY2UiLCJnZXRDYXBhYmlsaXRpZXMiLCJzZXJ2aWNlSW5zdGFuY2UiLCJTaWRlRWZmZWN0c0ZhY3RvcnkiLCJjcmVhdGVJbnN0YW5jZSIsInNjb3BlVHlwZSIsImdldEludGVyZmFjZSIsImdldEZha2VEaWFnbm9zdGljcyIsImlzc3VlcyIsImFkZElzc3VlIiwiaXNzdWVDYXRlZ29yeSIsImlzc3VlU2V2ZXJpdHkiLCJkZXRhaWxzIiwiZ2V0SXNzdWVzIiwiY2hlY2tJZklzc3VlRXhpc3RzIiwiZmluZCIsImlzc3VlIiwiZ2V0Q29udmVydGVyQ29udGV4dEZvclRlc3QiLCJtYW5pZmVzdFNldHRpbmdzIiwiY29udmVydGVkVHlwZXMiLCJjb252ZXJ0VHlwZXMiLCJkYXRhTW9kZWxQYXRoIiwiY29udGV4dFBhdGgiLCJnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMiLCJlbnRpdHlTZXQiLCJDb252ZXJ0ZXJDb250ZXh0IiwiTWFuaWZlc3RXcmFwcGVyIiwibWVyZ2UiLCJtZXRhTW9kZWxDYWNoZSIsIm9SZXF1ZXN0b3IiLCJfTWV0YWRhdGFSZXF1ZXN0b3IiLCJjcmVhdGUiLCJPRGF0YU1ldGFNb2RlbCIsIl9yZXF1ZXN0QW5ub3RhdGlvbkNoYW5nZXMiLCJmZXRjaEVudGl0eUNvbnRhaW5lciIsImdldERhdGFNb2RlbE9iamVjdFBhdGhGb3JQcm9wZXJ0eSIsInByb3BlcnR5IiwidGFyZ2V0UGF0aCIsInN0YXJ0aW5nRW50aXR5U2V0IiwibmF2aWdhdGlvblByb3BlcnRpZXMiLCJ0YXJnZXRPYmplY3QiLCJ0YXJnZXRFbnRpdHlTZXQiLCJ0YXJnZXRFbnRpdHlUeXBlIiwiZW50aXR5VHlwZSIsImNvbnRleHRMb2NhdGlvbiIsImV2YWx1YXRlQmluZGluZyIsImJpbmRpbmdTdHJpbmciLCJiaW5kaW5nRWxlbWVudCIsIkJpbmRpbmdQYXJzZXIiLCJjb21wbGV4UGFyc2VyIiwiX2xlbiIsImFyZ3MiLCJfa2V5IiwiZm9ybWF0dGVyIiwiYXBwbHkiLCJldmFsdWF0ZUJpbmRpbmdXaXRoTW9kZWwiLCJtb2RlbENvbnRlbnQiLCJuYW1lZE1vZGVsc0NvbnRlbnQiLCJ0ZXh0IiwiSW52aXNpYmxlVGV4dCIsImJpbmRQcm9wZXJ0eSIsImRlZmF1bHRNb2RlbCIsIkpTT05Nb2RlbCIsInNldE1vZGVsIiwic2V0QmluZGluZ0NvbnRleHQiLCJjb250ZW50IiwibW9kZWwiLCJnZXRUZXh0IiwiVEVTVFZJRVdJRCIsImFwcGx5RmxleENoYW5nZXMiLCJmbGV4Q2hhbmdlcyIsInJlc3VsdFhNTCIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJpZCIsImNoYW5nZXMiLCJjcmVhdGVGbGV4aWJpbGl0eUNoYW5nZXNPYmplY3QiLCJhcHBJZCIsIm9NYW5pZmVzdCIsInR5cGUiLCJjcm9zc05hdmlnYXRpb24iLCJvdXRib3VuZHMiLCJvQXBwQ29tcG9uZW50IiwiZ2V0Q29tcG9uZW50RGF0YSIsImdldE1hbmlmZXN0T2JqZWN0IiwiZ2V0RW50cnkiLCJnZXRMb2NhbElkIiwic0lkIiwic3B5T24iLCJBcHBTdG9yYWdlIiwiUHJvbWlzZSIsIkxvYWRlciIsIkNvbXBvbmVudCIsIlV0aWxzIiwiRmxleFN0YXRlIiwiaW5pdGlhbGl6ZSIsImNvbXBvbmVudElkIiwiWG1sUHJlcHJvY2Vzc29yIiwicHJvY2VzcyIsImNoYW5nZXNBcHBsaWVkIiwiZ2V0Q2hhbmdlc0Zyb21YTUwiLCJ0b0JlIiwidmFyaWFudERlcGVuZGVudENvbnRyb2xDaGFuZ2VzIiwiZmxhdE1hcCIsImUiLCJmaWx0ZXIiLCJhdHRyIiwiZ2V0VGVtcGxhdGluZ1Jlc3VsdCIsInhtbElucHV0IiwiY3JlYXRlTW9ja1Jlc291cmNlTW9kZWwiLCJ0ZW1wbGF0ZWRYbWwiLCJET01QYXJzZXIiLCJ4bWxEb2MiLCJwYXJzZUZyb21TdHJpbmciLCJvUHJlcHJvY2Vzc29yU2V0dGluZ3MiLCJYTUxQcmVwcm9jZXNzb3IiLCJmaXJzdEVsZW1lbnRDaGlsZCIsImdldFRlbXBsYXRlZFhNTCIsImpzeCIsImRlZmluZVhNTE5hbWVzcGFjZU1hcCIsInRlbXBsYXRlZFhNTCIsInNlcmlhbGllZFhNTCIsIm5vdCIsInByb2Nlc3NWaWV3Iiwib1ZpZXdEb2N1bWVudCIsIm9QcmVwcm9jZXNzZWRWaWV3IiwiYXNFbGVtZW50IiwiYXNTdHJpbmciLCJvdXRlckhUTUwiLCJwcm9jZXNzRnJhZ21lbnQiLCJ0ZXN0RGF0YSIsImlucHV0WG1sIiwiaW5wdXREb2MiLCJqc29uTW9kZWwiLCJzZXREYXRhIiwicmVzdWx0RG9jIiwiZnJhZ21lbnRzIiwiZ2V0RWxlbWVudHNCeVRhZ05hbWUiLCJmcmFnbWVudCIsImlubmVySFRNTCIsInhtbFJlc3VsdCIsImNoaWxkcmVuIiwic2VyaWFsaXplQ29udHJvbCIsImNvbnRyb2xUb1NlcmlhbGl6ZSIsInNob3dDdXN0b21TdHlsZUNsYXNzZXMiLCJ0YWJDb3VudCIsIkNPTlRST0xJRCIsImdldFRhYiIsInRvQWRkIiwidGFiIiwiaSIsInNlcmlhbGl6ZURlbGVnYXRlIiwic3RhcnQiLCJzQWdncmVnYXRpb25OYW1lIiwiY29udHJvbERldGFpbCIsImdldFBhcmVudCIsImluZGV4SW5QYXJlbnQiLCJnZXRBZ2dyZWdhdGlvbiIsImluZGV4T2YiLCJnZXRNZXRhZGF0YSIsImdldE5hbWUiLCJlbmQiLCJtaWRkbGUiLCJnZXRJZCIsIk1hbmFnZWRPYmplY3RNZXRhZGF0YSIsImlzR2VuZXJhdGVkSWQiLCJvQ29udHJvbEtleSIsIm1Qcm9wZXJ0aWVzIiwicHJvcGVydHlWYWx1ZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJtQmluZGluZ0luZm9zIiwiYmluZGluZ0RldGFpbCIsIm9PdXRwdXRGb3JtYXQiLCJiaW5kaW5nIiwibUFzc29jaWF0aW9ucyIsImFzc29jaWF0aW9uVmFsdWUiLCJhc3NvY2lhdGlvblZhbHVlRWxlbWVudCIsImFDdXN0b21TdHlsZUNsYXNzZXMiLCJtRXZlbnRSZWdpc3RyeSIsInN0YXJ0QWdncmVnYXRpb24iLCJzTmFtZSIsIm91dCIsImVuZEFnZ3JlZ2F0aW9uIiwiY29udHJvbFRvUmVuZGVyIiwiU2VyaWFsaXplciIsInNlcmlhbGl6ZSIsInNlcmlhbGl6ZUNvbnRyb2xBc1hNTCIsImRlZmluZWROYW1lc3BhY2VzIiwiZ2V0TmFtZXNwYWNlQWxpYXMiLCJjbGFzc05hbWUiLCJuYW1lc1NwbGl0Iiwic3BsaXQiLCJuYW1lc3BhY2UiLCJuYW1lc3BhY2VBbGlhcyIsIm5hbWVGdWxsIiwiaGFzQWdncmVnYXRpb24iLCJtQWdncmVnYXRpb25zS2V5IiwibUFnZ3JlZ2F0aW9ucyIsImNvbmNhdCIsInVuaXF1ZUtleXMiLCJTZXQiLCJmcm9tIiwidGVtcGxhdGUiLCJmRnVuY3Rpb24iLCJvdXRYTUwiLCJjcmVhdGVBd2FpdGVyIiwiZm5SZXNvbHZlIiwibXlQcm9taXNlIiwicHJvbWlzZSIsInJlbmRlckJ1aWxkaW5nQmxvY2tXaXRoTW9kZWxzIiwiYnVpbGRpbmdCbG9jayIsIk1hbmFnZWRPYmplY3QiLCJydW5XaXRoUHJlcHJvY2Vzc29ycyIsImdldENvbnRlbnQiLCJjb250cm9sU2V0dGluZ3MiLCJyZWdpc3Rlck1vY2tGcmFnbWVudHMiLCJfbGVuMiIsIl9rZXkyIiwib3JpZ2luYWxMb2FkVGVtcGxhdGUiLCJYTUxUZW1wbGF0ZVByb2Nlc3NvciIsImxvYWRUZW1wbGF0ZVByb21pc2UiLCJsb2FkVGVtcGxhdGVTdHViIiwibW9ja0ltcGxlbWVudGF0aW9uIiwidGVtcGxhdGVOYW1lIiwiZXh0ZW5zaW9uIiwicGFyc2VYTUxTdHJpbmciLCJpbml0aWFsaXplQXBwQ29tcG9uZW50Iiwidmlld0xldmVsIiwiY2RzRmlsZSIsIl9fZGlybmFtZSIsImd1aWQiLCJ1aWQiLCJjZHNDb250ZW50Iiwic2FwIiwicmVnaXN0ZXJGYWtlRnJhZ21lbnQiLCJEZWZhdWx0UGFnZUNvbnRlbnQiLCJfUGFnZUNvbnRyb2xsZXIiLCJfaW5oZXJpdHNMb29zZSIsIl9wcm90byIsInByb3RvdHlwZSIsInJlbmRlciIsIl9qc3giLCJQYWdlIiwiUGFnZUNvbnRyb2xsZXIiLCJ1aSIsImRlZmluZSIsIl9BcHBDb21wb25lbnQiLCJBcHBDb21wb25lbnQiLCJtZXRhZGF0YSIsIm1hbmlmZXN0IiwiZGF0YVNvdXJjZXMiLCJtYWluU2VydmljZSIsInVyaSIsIm9kYXRhVmVyc2lvbiIsImRhdGFTb3VyY2UiLCJyb3V0aW5nIiwidGFyZ2V0cyIsIkRlZmF1bHQiLCJtYWluQ29udGV4dFBhdGgiLCJ2aWV3VHlwZSIsInZpZXdDb250ZW50IiwicGFnZUNvbnRlbnQiLCJyb3V0ZXMiLCJwYXR0ZXJuIiwidGFyZ2V0IiwiZmVNYW5pZmVzdFNldHRpbmdzIiwibW9ja0FwcENvbXBvbmVudCIsImluaXRpYWxpemVkIiwidiIsImdldFJvdXRlciIsImdldFRhcmdldCIsImxvYWQiLCJ0ZW1wbGF0ZUNvbXBvbmVudCIsIm9iamVjdCIsImZpbmRFbGVtZW50IiwiY29sbGVjdGlvbiIsImVsZW1lbnQiLCJpdGVtIiwid2FpdEZvckV2ZW50IiwiZXZlbnROYW1lIiwiYXR0YWNoRXZlbnRPbmNlIiwiZXZlbnQiLCJrZWVwQmluZGluZ1N0cmluZ0ZvclRlc3QiLCJlbmFibGVkIiwiX2tlZXBCaW5kaW5nU3RyaW5ncyJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiSmVzdFRlbXBsYXRpbmdIZWxwZXIudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQW55QW5ub3RhdGlvbiwgQ29udmVydGVkTWV0YWRhdGEsIEVudGl0eVNldCwgUHJvcGVydHkgfSBmcm9tIFwiQHNhcC11eC92b2NhYnVsYXJpZXMtdHlwZXNcIjtcbmltcG9ydCBjb21waWxlciBmcm9tIFwiQHNhcC9jZHMtY29tcGlsZXJcIjtcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHR5cGUgeyBSYW5nZSwgUmFuZ2VzIH0gZnJvbSBcImh0bWxqcy1wYXJzZXJcIjtcbmltcG9ydCB7IGNyZWF0ZVBhcnNlciB9IGZyb20gXCJodG1sanMtcGFyc2VyXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCBMb2FkZXJFeHRlbnNpb25zIGZyb20gXCJzYXAvYmFzZS91dGlsL0xvYWRlckV4dGVuc2lvbnNcIjtcbmltcG9ydCBtZXJnZSBmcm9tIFwic2FwL2Jhc2UvdXRpbC9tZXJnZVwiO1xuaW1wb3J0IHVpZCBmcm9tIFwic2FwL2Jhc2UvdXRpbC91aWRcIjtcbmltcG9ydCBqc3ggZnJvbSBcInNhcC9mZS9iYXNlL2pzeC1ydW50aW1lL2pzeFwiO1xuaW1wb3J0IEFwcENvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCI7XG5pbXBvcnQgUGFnZUNvbnRyb2xsZXIgZnJvbSBcInNhcC9mZS9jb3JlL1BhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgdHlwZSBUZW1wbGF0ZUNvbXBvbmVudCBmcm9tIFwic2FwL2ZlL2NvcmUvVGVtcGxhdGVDb21wb25lbnRcIjtcbmltcG9ydCBUZW1wbGF0ZU1vZGVsIGZyb20gXCJzYXAvZmUvY29yZS9UZW1wbGF0ZU1vZGVsXCI7XG5pbXBvcnQgeyBwYXJzZVhNTFN0cmluZyB9IGZyb20gXCJzYXAvZmUvY29yZS9idWlsZGluZ0Jsb2Nrcy90ZW1wbGF0aW5nL0J1aWxkaW5nQmxvY2tUZW1wbGF0ZVByb2Nlc3NvclwiO1xuaW1wb3J0IENvbnZlcnRlckNvbnRleHQgZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvQ29udmVydGVyQ29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBMaXN0UmVwb3J0TWFuaWZlc3RTZXR0aW5ncywgT2JqZWN0UGFnZU1hbmlmZXN0U2V0dGluZ3MgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NYW5pZmVzdFNldHRpbmdzXCI7XG5pbXBvcnQgTWFuaWZlc3RXcmFwcGVyIGZyb20gXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL01hbmlmZXN0V3JhcHBlclwiO1xuaW1wb3J0IHsgY29udmVydFR5cGVzLCBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHMgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIjtcbmltcG9ydCB0eXBlIHsgSURpYWdub3N0aWNzLCBQYWdlQ29udGV4dFBhdGhUYXJnZXQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9UZW1wbGF0ZUNvbnZlcnRlclwiO1xuaW1wb3J0IHR5cGUgeyBJc3N1ZUNhdGVnb3J5LCBJc3N1ZVNldmVyaXR5IH0gZnJvbSBcInNhcC9mZS9jb3JlL2NvbnZlcnRlcnMvaGVscGVycy9Jc3N1ZU1hbmFnZXJcIjtcbmltcG9ydCB0eXBlIHsgU2lkZUVmZmVjdHNTZXJ2aWNlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1NpZGVFZmZlY3RzU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCBTaWRlRWZmZWN0c0ZhY3RvcnkgZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL1NpZGVFZmZlY3RzU2VydmljZUZhY3RvcnlcIjtcbmltcG9ydCB0eXBlIHsgRGF0YU1vZGVsT2JqZWN0UGF0aCB9IGZyb20gXCJzYXAvZmUvY29yZS90ZW1wbGF0aW5nL0RhdGFNb2RlbFBhdGhIZWxwZXJcIjtcbmltcG9ydCB7IGNyZWF0ZU1vY2tSZXNvdXJjZU1vZGVsIH0gZnJvbSBcInNhcC9mZS90ZXN0L1VJNU1vY2tIZWxwZXJcIjtcbmltcG9ydCBQYWdlIGZyb20gXCJzYXAvbS9QYWdlXCI7XG5pbXBvcnQgQmluZGluZ1BhcnNlciBmcm9tIFwic2FwL3VpL2Jhc2UvQmluZGluZ1BhcnNlclwiO1xuaW1wb3J0IHR5cGUgRXZlbnRQcm92aWRlciBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRQcm92aWRlclwiO1xuaW1wb3J0IHR5cGUgeyBCYXNlQWdncmVnYXRpb25CaW5kaW5nSW5mbyB9IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgTWFuYWdlZE9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IE1hbmFnZWRPYmplY3RNZXRhZGF0YSBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdE1ldGFkYXRhXCI7XG5pbXBvcnQgQ29tcG9uZW50IGZyb20gXCJzYXAvdWkvY29yZS9Db21wb25lbnRcIjtcbmltcG9ydCB0eXBlIFVJNUVsZW1lbnQgZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCBJbnZpc2libGVUZXh0IGZyb20gXCJzYXAvdWkvY29yZS9JbnZpc2libGVUZXh0XCI7XG5pbXBvcnQgdHlwZSB7IE1hbmlmZXN0Q29udGVudCB9IGZyb20gXCJzYXAvdWkvY29yZS9NYW5pZmVzdFwiO1xuaW1wb3J0IFhNTFRlbXBsYXRlUHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvY29yZS9YTUxUZW1wbGF0ZVByb2Nlc3NvclwiO1xuaW1wb3J0IFhNTFByZXByb2Nlc3NvciBmcm9tIFwic2FwL3VpL2NvcmUvdXRpbC9YTUxQcmVwcm9jZXNzb3JcIjtcbmltcG9ydCBTZXJpYWxpemVyIGZyb20gXCJzYXAvdWkvY29yZS91dGlsL3NlcmlhbGl6ZXIvU2VyaWFsaXplclwiO1xuaW1wb3J0IFV0aWxzIGZyb20gXCJzYXAvdWkvZmwvVXRpbHNcIjtcbmltcG9ydCBGbGV4U3RhdGUgZnJvbSBcInNhcC91aS9mbC9hcHBseS9faW50ZXJuYWwvZmxleFN0YXRlL0ZsZXhTdGF0ZVwiO1xuaW1wb3J0IExvYWRlciBmcm9tIFwic2FwL3VpL2ZsL2FwcGx5L19pbnRlcm5hbC9mbGV4U3RhdGUvTG9hZGVyXCI7XG5pbXBvcnQgWG1sUHJlcHJvY2Vzc29yIGZyb20gXCJzYXAvdWkvZmwvYXBwbHkvX2ludGVybmFsL3ByZXByb2Nlc3NvcnMvWG1sUHJlcHJvY2Vzc29yXCI7XG5pbXBvcnQgQXBwU3RvcmFnZSBmcm9tIFwic2FwL3VpL2ZsL2luaXRpYWwvX2ludGVybmFsL1N0b3JhZ2VcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9tZGMvQ29udHJvbFwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCB0eXBlIE1ldGFNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL01ldGFNb2RlbFwiO1xuaW1wb3J0IHR5cGUgTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9Nb2RlbFwiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5pbXBvcnQgT0RhdGFNZXRhTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9vZGF0YS92NC9PRGF0YU1ldGFNb2RlbFwiO1xuaW1wb3J0IF9NZXRhZGF0YVJlcXVlc3RvciBmcm9tIFwic2FwL3VpL21vZGVsL29kYXRhL3Y0L2xpYi9fTWV0YWRhdGFSZXF1ZXN0b3JcIjtcbmltcG9ydCB4cGF0aCBmcm9tIFwieHBhdGhcIjtcbmltcG9ydCB0eXBlIHsgTWFuYWdlZE9iamVjdEV4IH0gZnJvbSBcIi4uLy4uLy4uLy4uLy4uLy4uL3R5cGVzL2V4dGVuc2lvbl90eXBlc1wiO1xuaW1wb3J0IHsgY3JlYXRlRmxleGliaWxpdHlDaGFuZ2VzT2JqZWN0IH0gZnJvbSBcIi4vSmVzdEZsZXhpYmlsaXR5SGVscGVyXCI7XG5cbnR5cGUgUHJlUHJvY2Vzc29yU2V0dGluZ3NUeXBlID0ge1xuXHRtb2RlbHM6IHtcblx0XHRbbmFtZTogc3RyaW5nXTogSlNPTk1vZGVsIHwgT0RhdGFNZXRhTW9kZWw7XG5cdH07XG5cdGJpbmRpbmdDb250ZXh0czoge1xuXHRcdFtuYW1lOiBzdHJpbmddOiBDb250ZXh0IHwgdW5kZWZpbmVkO1xuXHR9O1xufTtcbnR5cGUgTW9ja0ZyYWdtZW50ID0ge1xuXHRuYW1lOiBzdHJpbmc7XG5cdGNvbnRlbnQ6IHN0cmluZztcbn07XG5cbnR5cGUgSmVzdFRlbXBsYXRlZFZpZXcgPSB7XG5cdGFzRWxlbWVudDogRWxlbWVudCB8IHVuZGVmaW5lZDtcblx0YXNTdHJpbmc6IHN0cmluZztcbn07XG5cbkxvZy5zZXRMZXZlbCgxIGFzIGFueSwgXCJzYXAudWkuY29yZS51dGlsLlhNTFByZXByb2Nlc3NvclwiKTtcbmplc3Quc2V0VGltZW91dCg0MDAwMCk7XG5cbmNvbnN0IG5hbWVTcGFjZU1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcblx0bWFjcm86IFwic2FwLmZlLm1hY3Jvc1wiLFxuXHRtYWNyb3M6IFwic2FwLmZlLm1hY3Jvc1wiLFxuXHRmZUJCOiBcInNhcC5mZS5jb3JlLmJ1aWxkaW5nQmxvY2tzLnRlbXBsYXRpbmdcIixcblx0bWFjcm9GaWVsZDogXCJzYXAuZmUubWFjcm9zLmZpZWxkXCIsXG5cdG1hY3JvZGF0YTogXCJodHRwOi8vc2NoZW1hcy5zYXAuY29tL3NhcHVpNS9leHRlbnNpb24vc2FwLnVpLmNvcmUuQ3VzdG9tRGF0YS8xXCIsXG5cdGxvZzogXCJodHRwOi8vc2NoZW1hcy5zYXAuY29tL3NhcHVpNS9leHRlbnNpb24vc2FwLnVpLmNvcmUuQ3VzdG9tRGF0YS8xXCIsXG5cdGN1c3RvbURhdGE6IFwiaHR0cDovL3NjaGVtYXMuc2FwLmNvbS9zYXB1aTUvZXh0ZW5zaW9uL3NhcC51aS5jb3JlLkN1c3RvbURhdGEvMVwiLFxuXHRjb250cm9sOiBcInNhcC5mZS5jb3JlLmNvbnRyb2xzXCIsXG5cdGNvbnRyb2xzOiBcInNhcC5mZS5tYWNyb3MuY29udHJvbHNcIixcblx0Y29yZTogXCJzYXAudWkuY29yZVwiLFxuXHRkdDogXCJzYXAudWkuZHRcIixcblx0bTogXCJzYXAubVwiLFxuXHRmOiBcInNhcC51aS5sYXlvdXQuZm9ybVwiLFxuXHRmbDogXCJzYXAudWkuZmxcIixcblx0aW50ZXJuYWxNYWNybzogXCJzYXAuZmUubWFjcm9zLmludGVybmFsXCIsXG5cdG1kYzogXCJzYXAudWkubWRjXCIsXG5cdGFjdGlvbnRvb2xiYXI6IFwic2FwLnVpLm1kYy5hY3Rpb250b29sYmFyXCIsXG5cdG1kY0ZpZWxkOiBcInNhcC51aS5tZGMuZmllbGRcIixcblx0bWRjVGFibGU6IFwic2FwLnVpLm1kYy50YWJsZVwiLFxuXHR1OiBcInNhcC51aS51bmlmaWVkXCIsXG5cdHV4YXA6IFwic2FwLnV4YXBcIixcblx0bWFjcm9NaWNyb0NoYXJ0OiBcInNhcC5mZS5tYWNyb3MubWljcm9jaGFydFwiLFxuXHRtaWNyb0NoYXJ0OiBcInNhcC5zdWl0ZS51aS5taWNyb2NoYXJ0XCIsXG5cdG1hY3JvVGFibGU6IFwic2FwLmZlLm1hY3Jvcy50YWJsZVwiLFxuXHRtZGN2YzogXCJzYXAudWkubWRjLnZhbHVlaGVscC5jb250ZW50XCIsXG5cdG1kY3Y6IFwic2FwLnVpLm1kYy52YWx1ZWhlbHBcIixcblx0dmFsdWVIZWxwOiBcInNhcC5mZS5tYWNyb3MudmFsdWVIZWxwXCIsXG5cdGNvbnRlbnRTd2l0Y2hlcjogXCJzYXAuZmUubWFjcm9zLmNvbnRlbnRTd2l0Y2hlclwiLFxuXHRmaWx0ZXJCYXI6IFwic2FwLmZlLm1hY3Jvcy5maWx0ZXJCYXJcIixcblx0ZmJDb250cm9sczogXCJzYXAuZmUubWFjcm9zLmNvbnRyb2xzLmZpbHRlcmJhclwiLFxuXHRkcmFmdEluZGljYXRvcjogXCJzYXAuZmUubWFjcm9zLmRyYWZ0SW5kaWNhdG9yXCJcbn07XG5jb25zdCByZXZlc2VOYW1lc3BhY2VNYXAgPSBPYmplY3Qua2V5cyhuYW1lU3BhY2VNYXApLnJlZHVjZSgocmV2ZXJzZU1hcDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgY3VycmVudE5hbWUpID0+IHtcblx0cmV2ZXJzZU1hcFtuYW1lU3BhY2VNYXBbY3VycmVudE5hbWVdXSA9IGN1cnJlbnROYW1lO1xuXHRyZXR1cm4gcmV2ZXJzZU1hcDtcbn0sIHt9KTtcbmNvbnN0IHNlbGVjdCA9IHhwYXRoLnVzZU5hbWVzcGFjZXMobmFtZVNwYWNlTWFwKTtcblxuY29uc3QgZGVmYXVsdEZha2VTaWRlRWZmZWN0U2VydmljZSA9IHsgY29tcHV0ZUZpZWxkR3JvdXBJZHM6ICgpID0+IFtdIH07XG5cbmZ1bmN0aW9uIF9nZXRUZW1wbGF0ZWRTZWxlY3Rvcih4bWxkb206IE5vZGUsIHNlbGVjdG9yOiBzdHJpbmcpOiBzdHJpbmcge1xuXHQvKipcblx0ICogaWYgYSByb290IGVsZW1lbnQgaGFzIGJlZW4gYWRkZWQgZHVyaW5nIHRoZSB0ZW1wbGF0aW5nIGJ5IG91ciBKZXN0IFRlbXBsYXRpbmcgbWV0aG9kc1xuXHQgKiB0aGUgcm9vdCBlbGVtZW50IGlzIGFkZGVkIHRvIHRoZSBzZWxlY3RvciBwYXRoLlxuXHQgKi9cblx0Y29uc3Qgcm9vdFBhdGggPSBcIi9yb290XCI7XG5cdHJldHVybiBgJHt4bWxkb20ubm9kZU5hbWUgPT09IFwicm9vdFwiICYmICFzZWxlY3Rvci5zdGFydHNXaXRoKHJvb3RQYXRoKSA/IHJvb3RQYXRoIDogXCJcIn0ke3NlbGVjdG9yfWA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIF9idWlsZFByZVByb2Nlc3NvclNldHRpbmdzKFxuXHRzTWV0YWRhdGFVcmw6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0bUJpbmRpbmdDb250ZXh0czogeyBbeDogc3RyaW5nXTogc3RyaW5nIH0sXG5cdG1Nb2RlbHM6IHsgW3g6IHN0cmluZ106IGFueSB9LFxuXHRmYWtlU2lkZUVmZmVjdFNlcnZpY2U/OiB1bmtub3duXG4pOiBQcm9taXNlPFByZVByb2Nlc3NvclNldHRpbmdzVHlwZT4ge1xuXHRsZXQgb01ldGFNb2RlbDogT0RhdGFNZXRhTW9kZWwgfCB1bmRlZmluZWQ7XG5cdGlmIChzTWV0YWRhdGFVcmwpIHtcblx0XHRvTWV0YU1vZGVsID0gYXdhaXQgZ2V0TWV0YU1vZGVsKHNNZXRhZGF0YVVybCk7XG5cdFx0Ly8gVG8gZW5zdXJlIG91ciBtYWNybyBjYW4gdXNlICNzZXRCaW5kaW5nQ29udGV4dCB3ZSBlbnN1cmUgdGhlcmUgaXMgYSBwcmUgZXhpc3RpbmcgSlNPTk1vZGVsIGZvciBjb252ZXJ0ZXJDb250ZXh0XG5cdFx0Ly8gaWYgbm90IGFscmVhZHkgcGFzc2VkIHRvIHRlaCB0ZW1wbGF0aW5nXG5cdFx0aWYgKCFtTW9kZWxzLmhhc093blByb3BlcnR5KFwiY29udmVydGVyQ29udGV4dFwiKSkge1xuXHRcdFx0bU1vZGVscyA9IE9iamVjdC5hc3NpZ24obU1vZGVscywgeyBjb252ZXJ0ZXJDb250ZXh0OiBuZXcgVGVtcGxhdGVNb2RlbCh7fSwgb01ldGFNb2RlbCEpIH0pO1xuXHRcdH1cblxuXHRcdE9iamVjdC5rZXlzKG1Nb2RlbHMpLmZvckVhY2goZnVuY3Rpb24gKHNNb2RlbE5hbWUpIHtcblx0XHRcdGlmIChtTW9kZWxzW3NNb2RlbE5hbWVdICYmIG1Nb2RlbHNbc01vZGVsTmFtZV0uaXNUZW1wbGF0ZU1vZGVsKSB7XG5cdFx0XHRcdG1Nb2RlbHNbc01vZGVsTmFtZV0gPSBuZXcgVGVtcGxhdGVNb2RlbChtTW9kZWxzW3NNb2RlbE5hbWVdLmRhdGEsIG9NZXRhTW9kZWwhKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXG5cdGNvbnN0IHNldHRpbmdzOiBhbnkgPSB7XG5cdFx0bW9kZWxzOiBPYmplY3QuYXNzaWduKFxuXHRcdFx0e1xuXHRcdFx0XHRtZXRhTW9kZWw6IG9NZXRhTW9kZWxcblx0XHRcdH0sXG5cdFx0XHRtTW9kZWxzXG5cdFx0KSxcblx0XHRiaW5kaW5nQ29udGV4dHM6IHt9LFxuXHRcdGFwcENvbXBvbmVudDogeyBnZXRTaWRlRWZmZWN0c1NlcnZpY2U6IGplc3QuZm4oKSwgZ2V0RGlhZ25vc3RpY3M6ICgpID0+IHVuZGVmaW5lZCwgZ2V0U2hlbGxTZXJ2aWNlczogamVzdC5mbigpIH1cblx0fTtcblxuXHRzZXR0aW5ncy5hcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlLm1vY2tSZXR1cm5WYWx1ZShmYWtlU2lkZUVmZmVjdFNlcnZpY2UgPz8gZGVmYXVsdEZha2VTaWRlRWZmZWN0U2VydmljZSk7XG5cdC8vSW5qZWN0IG1vZGVscyBhbmQgYmluZGluZ0NvbnRleHRzXG5cdE9iamVjdC5rZXlzKG1CaW5kaW5nQ29udGV4dHMpLmZvckVhY2goZnVuY3Rpb24gKHNLZXkpIHtcblx0XHQvKiBBc3NlcnQgdG8gbWFrZSBzdXJlIHRoZSBhbm5vdGF0aW9ucyBhcmUgaW4gdGhlIHRlc3QgbWV0YWRhdGEgLT4gYXZvaWQgbWlzbGVhZGluZyB0ZXN0cyAqL1xuXHRcdGV4cGVjdCh0eXBlb2Ygb01ldGFNb2RlbD8uZ2V0T2JqZWN0KG1CaW5kaW5nQ29udGV4dHNbc0tleV0pKS50b0JlRGVmaW5lZCgpO1xuXHRcdGNvbnN0IG9Nb2RlbCA9IG1Nb2RlbHNbc0tleV0gfHwgb01ldGFNb2RlbDtcblx0XHRzZXR0aW5ncy5iaW5kaW5nQ29udGV4dHNbc0tleV0gPSBvTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQobUJpbmRpbmdDb250ZXh0c1tzS2V5XSk7IC8vVmFsdWUgaXMgc1BhdGhcblx0XHRzZXR0aW5ncy5tb2RlbHNbc0tleV0gPSBvTW9kZWw7XG5cdH0pO1xuXHRyZXR1cm4gc2V0dGluZ3M7XG59XG5cbmZ1bmN0aW9uIF9sb2FkUmVzb3VyY2VWaWV3KHZpZXdOYW1lOiBzdHJpbmcpOiBFbGVtZW50IHtcblx0Y29uc3QgbmFtZSA9IHZpZXdOYW1lLnJlcGxhY2UoL1xcLi9nLCBcIi9cIikgKyBcIi52aWV3LnhtbFwiO1xuXHRjb25zdCB2aWV3ID0gTG9hZGVyRXh0ZW5zaW9ucy5sb2FkUmVzb3VyY2UobmFtZSk7XG5cdHJldHVybiB2aWV3LmRvY3VtZW50RWxlbWVudDtcbn1cblxuZXhwb3J0IGNvbnN0IHJ1blhQYXRoUXVlcnkgPSBmdW5jdGlvbiAoc2VsZWN0b3I6IHN0cmluZywgeG1sZG9tOiBOb2RlIHwgdW5kZWZpbmVkKSB7XG5cdHJldHVybiBzZWxlY3Qoc2VsZWN0b3IsIHhtbGRvbSk7XG59O1xuXG5leHBlY3QuZXh0ZW5kKHtcblx0dG9IYXZlQ29udHJvbCh4bWxkb20sIHNlbGVjdG9yKSB7XG5cdFx0Y29uc3Qgbm9kZXMgPSBydW5YUGF0aFF1ZXJ5KF9nZXRUZW1wbGF0ZWRTZWxlY3Rvcih4bWxkb20sIHNlbGVjdG9yKSwgeG1sZG9tKTtcblx0XHRyZXR1cm4ge1xuXHRcdFx0bWVzc2FnZTogKCkgPT4ge1xuXHRcdFx0XHRjb25zdCBvdXRwdXRYbWwgPSBzZXJpYWxpemVYTUwoeG1sZG9tKTtcblx0XHRcdFx0cmV0dXJuIGBkaWQgbm90IGZpbmQgY29udHJvbHMgbWF0Y2hpbmcgJHtzZWxlY3Rvcn0gaW4gZ2VuZXJhdGVkIHhtbDpcXG4gJHtvdXRwdXRYbWx9YDtcblx0XHRcdH0sXG5cdFx0XHRwYXNzOiBub2RlcyAmJiBub2Rlcy5sZW5ndGggPj0gMVxuXHRcdH07XG5cdH0sXG5cdHRvTm90SGF2ZUNvbnRyb2woeG1sZG9tLCBzZWxlY3Rvcikge1xuXHRcdGNvbnN0IG5vZGVzID0gcnVuWFBhdGhRdWVyeShfZ2V0VGVtcGxhdGVkU2VsZWN0b3IoeG1sZG9tLCBzZWxlY3RvciksIHhtbGRvbSk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdG1lc3NhZ2U6ICgpID0+IHtcblx0XHRcdFx0Y29uc3Qgb3V0cHV0WG1sID0gc2VyaWFsaXplWE1MKHhtbGRvbSk7XG5cdFx0XHRcdHJldHVybiBgVGhlcmUgaXMgYSBjb250cm9sIG1hdGNoaW5nICR7c2VsZWN0b3J9IGluIGdlbmVyYXRlZCB4bWw6XFxuICR7b3V0cHV0WG1sfWA7XG5cdFx0XHR9LFxuXHRcdFx0cGFzczogbm9kZXMgJiYgbm9kZXMubGVuZ3RoID09PSAwXG5cdFx0fTtcblx0fSxcblx0LyoqXG5cdCAqIENoZWNrcyBmb3IgZXJyb3JzIGluIGB4bWxgIGNyZWF0ZWQgZHVyaW5nIHRlbXBsYXRpbmcgb2YgYW4gWE1MIHN0cmluZyBvclxuXHQgKiBhbiBYTUwgbm9kZS5cblx0ICpcblx0ICogVGhpcyBmdW5jdGlvbiBjaGVja2VzIGZvciB0aGUgeG1sIGVycm9ycyBjcmVhdGVkIGJ5IHRoZVxuXHQgKiBmdW5jdGlvbiBbQnVpbGRpbmdCbG9ja1RlbXBsYXRlUHJvY2Vzc29yLmNyZWF0ZUVycm9yWE1MXXtAbGluayBzYXAuZmUuY29yZS5idWlsZGluZ0Jsb2Nrcy50ZW1wbGF0aW5nLkJ1aWxkaW5nQmxvY2tUZW1wbGF0ZVByb2Nlc3NvciNjcmVhdGVFcnJvclhNTH0uXG5cdCAqIEBwYXJhbSB4bWwgWE1MIFN0cmluZyBvciBYTUwgTm9kZSB0byBiZSB0ZXN0ZWQgZm9yIGVycm9yc1xuXHQgKiBAcmV0dXJucyBKZXN0IE1hdGNoZXIgcmVzdWx0IG9iamVjdFxuXHQgKi9cblx0dG9IYXZlVGVtcGxhdGluZ0Vycm9ycyh4bWw6IHN0cmluZyB8IE5vZGUpIHtcblx0XHRjb25zdCB4bWxUZXh0ID0gdHlwZW9mIHhtbCA9PT0gXCJzdHJpbmdcIiA/IHhtbCA6IHNlcmlhbGl6ZVhNTCh4bWwpO1xuXHRcdGNvbnN0IGJhc2U2NEVudHJpZXM6IHN0cmluZ1tdID0geG1sVGV4dC5tYXRjaCgvQkJGXFwuYmFzZTY0RGVjb2RlXFwoJyhbXiddKiknXFwpL2dtKSB8fCAoW10gYXMgc3RyaW5nW10pO1xuXHRcdGNvbnN0IGVycm9yTWVzc2FnZXM6IHN0cmluZ1tdID0gYmFzZTY0RW50cmllcy5tYXAoKG1lc3NhZ2U6IHN0cmluZykgPT4ge1xuXHRcdFx0aWYgKG1lc3NhZ2UgJiYgbWVzc2FnZS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHJldHVybiBhdG9iKG1lc3NhZ2UubWF0Y2goLygnW14nXSopLyk/LlswXT8uc2xpY2UoMSkgfHwgXCJcIik7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gXCJcIjtcblx0XHR9KTtcblx0XHRpZiAoZXJyb3JNZXNzYWdlcy5sZW5ndGggPD0gMCkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0bWVzc2FnZTogKCkgPT4gYFhNTCBUZW1wbGF0aW5nIHdpdGhvdXQgZXJyb3JzYCxcblx0XHRcdFx0cGFzczogZmFsc2Vcblx0XHRcdH07XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdG1lc3NhZ2U6ICgpID0+IGVycm9yTWVzc2FnZXMuam9pbihcIlxcblwiKSxcblx0XHRcdFx0cGFzczogdHJ1ZVxuXHRcdFx0fTtcblx0XHR9XG5cdH1cbn0pO1xuXG5leHBvcnQgY29uc3QgZm9ybWF0QnVpbGRpbmdCbG9ja1hNTCA9IGZ1bmN0aW9uICh4bWxTdHJpbmc6IHN0cmluZyB8IHN0cmluZ1tdKTogc3RyaW5nIHtcblx0aWYgKEFycmF5LmlzQXJyYXkoeG1sU3RyaW5nKSkge1xuXHRcdHhtbFN0cmluZyA9IHhtbFN0cmluZy5qb2luKFwiXCIpO1xuXHR9XG5cdHJldHVybiBmb3JtYXRYTUwoeG1sU3RyaW5nKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb250cm9sQXR0cmlidXRlID0gZnVuY3Rpb24gKGNvbnRyb2xTZWxlY3Rvcjogc3RyaW5nLCBhdHRyaWJ1dGVOYW1lOiBzdHJpbmcsIHhtbERvbTogTm9kZSkge1xuXHRjb25zdCBzZWxlY3RvciA9IGBzdHJpbmcoJHtfZ2V0VGVtcGxhdGVkU2VsZWN0b3IoeG1sRG9tLCBjb250cm9sU2VsZWN0b3IpfS9AJHthdHRyaWJ1dGVOYW1lfSlgO1xuXHRyZXR1cm4gcnVuWFBhdGhRdWVyeShzZWxlY3RvciwgeG1sRG9tKTtcbn07XG5cbi8qKlxuICogU2VyaWFsaXplIHRoZSBwYXJ0cyBvciB0aGUgY29tcGxldGUgZ2l2ZW4gWE1MIERPTSB0byBzdHJpbmcuXG4gKiBAcGFyYW0geG1sRG9tIERPTSBub2RlIHRoYXQgaXMgdG8gYmUgc2VyaWFsaXplZC5cbiAqIEBwYXJhbSBzZWxlY3RvciBPcHRpb25hbCBzZWxlY3RvciBvZiBzdWIgbm9kZXNcbiAqIEByZXR1cm5zIFhNTCBzdHJpbmdcbiAqL1xuZXhwb3J0IGNvbnN0IHNlcmlhbGl6ZVhNTCA9IGZ1bmN0aW9uICh4bWxEb206IE5vZGUsIHNlbGVjdG9yPzogc3RyaW5nKSB7XG5cdGNvbnN0IHNlcmlhbGl6ZXIgPSBuZXcgd2luZG93LlhNTFNlcmlhbGl6ZXIoKTtcblx0bGV0IHhtbFN0cmluZzogc3RyaW5nO1xuXHRpZiAoc2VsZWN0b3IpIHtcblx0XHRjb25zdCBub2RlcyA9IHJ1blhQYXRoUXVlcnkoc2VsZWN0b3IsIHhtbERvbSkgYXMgTm9kZVtdO1xuXHRcdHhtbFN0cmluZyA9IG5vZGVzLm1hcCgobm9kZSkgPT4gc2VyaWFsaXplci5zZXJpYWxpemVUb1N0cmluZyhub2RlKSkuam9pbihcIlxcblwiKTtcblx0fSBlbHNlIHtcblx0XHR4bWxTdHJpbmcgPSBzZXJpYWxpemVyLnNlcmlhbGl6ZVRvU3RyaW5nKHhtbERvbSk7XG5cdH1cblx0cmV0dXJuIGZvcm1hdFhNTCh4bWxTdHJpbmcpO1xufTtcblxuLyoqXG4gKiBGb3JtYXRzIGEgc3RyaW5nIGNvbnRhaW5pbmcgYW4gWE1MIGRvY3VtZW50LlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gb25seSBjb25zaWRlcnMgWE1MIHRhZ3MgYW5kIGF0dHJpYnV0ZXMsIGlnbm9yaW5nIGV2ZXJ5dGhpbmcgZWxzZSAodGV4dCwgY29tbWVudHMpLiBBZGRpdGlvbmFsbHksXG4gKiBhdHRyaWJ1dGUgdmFsdWVzIGNvbnRhaW5pbmcgYSB2YXJ5aW5nIFVJRCBhcmUgcmVwbGFjZWQgd2l0aCBhIGNvbnN0YW50IHZhbHVlLlxuICpcbiAqIEFuIFwiWE1MXCIgc3RyaW5nIGNvbnRhaW5pbmcgbXVsdGlwbGUgcm9vdCBlbGVtZW50cyBjYW4gYmUuXG4gKiBAcGFyYW0geG1sU3RyaW5nICBUaGUgaW5wdXQgWE1MIHN0cmluZy4gVGhpcyBmdW5jdGlvbiBhbHNvIGFjY2VwdHMgXCJYTUxcIiBzdHJpbmdzIHdpdGggbXVsdGlwbGUgcm9vdCBlbGVtZW50cy5cbiAqIEByZXR1cm5zIFRoZSBmb3JtYXR0ZWQgWE1MIHN0cmluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IGZvcm1hdFhNTCA9IGZ1bmN0aW9uICh4bWxTdHJpbmc6IHN0cmluZyk6IHN0cmluZyB7XG5cdGNvbnN0IFNUQVJUID0gXCI8X19YTUxfXz5cIixcblx0XHRFTkQgPSBcIjwvX19YTUxfXz5cIixcblx0XHRVSUQgPSAvdWlkLS1pZC1cXGR7MTN9LVxcZHsxLDN9Lyxcblx0XHRVSUQyID0gL2lkLVxcZHsxM30tXFxkezEsM30vLFxuXHRcdGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG5cdGxldCBjdXJyZW50TGluZSA9IFwiXCIsXG5cdFx0bGV2ZWwgPSAtMSxcblx0XHRhdHRyaWJ1dGVzOiB7IG5hbWU6IHN0cmluZzsgdmFsdWU/OiBzdHJpbmcgfVtdID0gW107XG5cblx0ZnVuY3Rpb24gbmV3bGluZSgpIHtcblx0XHRpZiAoY3VycmVudExpbmUgJiYgY3VycmVudExpbmUgIT09IFNUQVJUKSB7XG5cdFx0XHRsaW5lcy5wdXNoKGN1cnJlbnRMaW5lKTtcblx0XHR9XG5cblx0XHRjdXJyZW50TGluZSA9IGxldmVsID4gMCA/IFwiICBcIi5yZXBlYXQobGV2ZWwpIDogXCJcIjtcblx0fVxuXG5cdGZ1bmN0aW9uIGFwcGVuZEF0dHJpYnV0ZXMoKSB7XG5cdFx0aWYgKGF0dHJpYnV0ZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0YXR0cmlidXRlcyA9IGF0dHJpYnV0ZXMuc29ydCgoYSwgYikgPT4ge1xuXHRcdFx0XHRpZiAoYS5uYW1lLnN0YXJ0c1dpdGgoXCJ4bWxuc1wiKSAmJiAhYi5uYW1lLnN0YXJ0c1dpdGgoXCJ4bWxuc1wiKSkge1xuXHRcdFx0XHRcdHJldHVybiAtMTtcblx0XHRcdFx0fSBlbHNlIGlmICghYS5uYW1lLnN0YXJ0c1dpdGgoXCJ4bWxuc1wiKSAmJiBiLm5hbWUuc3RhcnRzV2l0aChcInhtbG5zXCIpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIDE7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYS5uYW1lLnN0YXJ0c1dpdGgoXCJ4bWxuc1wiKSAmJiBiLm5hbWUuc3RhcnRzV2l0aChcInhtbG5zXCIpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoYS5uYW1lLmluY2x1ZGVzKFwiOlwiKSAmJiAhYi5uYW1lLmluY2x1ZGVzKFwiOlwiKSkge1xuXHRcdFx0XHRcdHJldHVybiAtMTtcblx0XHRcdFx0fSBlbHNlIGlmICghYS5uYW1lLmluY2x1ZGVzKFwiOlwiKSAmJiBiLm5hbWUuaW5jbHVkZXMoXCI6XCIpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIDE7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cmV0dXJuIGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRsZXZlbCsrO1xuXHRcdFx0Zm9yIChjb25zdCBhdHRyaWJ1dGUgb2YgYXR0cmlidXRlcykge1xuXHRcdFx0XHRuZXdsaW5lKCk7XG5cdFx0XHRcdGN1cnJlbnRMaW5lICs9IGF0dHJpYnV0ZS5uYW1lO1xuXHRcdFx0XHRpZiAoYXR0cmlidXRlLnZhbHVlKSBjdXJyZW50TGluZSArPSBhdHRyaWJ1dGUudmFsdWU7XG5cdFx0XHR9XG5cdFx0XHRsZXZlbC0tO1xuXHRcdFx0YXR0cmlidXRlcyA9IFtdO1xuXHRcdFx0bmV3bGluZSgpO1xuXHRcdH1cblx0fVxuXG5cdGZ1bmN0aW9uIGFwcGVuZChkYXRhOiBSYW5nZSkge1xuXHRcdGN1cnJlbnRMaW5lICs9IHBhcnNlci5yZWFkKGRhdGEpO1xuXHR9XG5cblx0Y29uc3QgcGFyc2VyID0gY3JlYXRlUGFyc2VyKHtcblx0XHRvbk9wZW5UYWdTdGFydChkYXRhOiBSYW5nZSkge1xuXHRcdFx0bmV3bGluZSgpO1xuXHRcdFx0YXBwZW5kKGRhdGEpO1xuXHRcdH0sXG5cblx0XHRvbk9wZW5UYWdOYW1lOiBhcHBlbmQsXG5cblx0XHRvbkF0dHJOYW1lKGRhdGE6IFJhbmdlKSB7XG5cdFx0XHRhdHRyaWJ1dGVzLnVuc2hpZnQoeyBuYW1lOiBwYXJzZXIucmVhZChkYXRhKSB9KTtcblx0XHR9LFxuXG5cdFx0b25BdHRyVmFsdWUoZGF0YTogUmFuZ2VzLkF0dHJWYWx1ZSkge1xuXHRcdFx0YXR0cmlidXRlc1swXS52YWx1ZSA9IHBhcnNlci5yZWFkKGRhdGEpLnJlcGxhY2UoVUlELCBcInVpZC0taWRcIik7IC8vIHJlcGxhY2UgdmFyeWluZyBVSURzIHdpdGggYSBjb25zdGFudCB2YWx1ZVxuXHRcdFx0YXR0cmlidXRlc1swXS52YWx1ZSA9IHBhcnNlci5yZWFkKGRhdGEpLnJlcGxhY2UoVUlEMiwgXCJpZFwiKTsgLy8gcmVwbGFjZSB2YXJ5aW5nIFVJRHMgd2l0aCBhIGNvbnN0YW50IHZhbHVlXG5cdFx0fSxcblxuXHRcdG9uT3BlblRhZ0VuZChkYXRhOiBSYW5nZXMuT3BlblRhZ0VuZCkge1xuXHRcdFx0YXBwZW5kQXR0cmlidXRlcygpO1xuXHRcdFx0YXBwZW5kKGRhdGEpO1xuXHRcdFx0aWYgKCFkYXRhLnNlbGZDbG9zZWQpIGxldmVsKys7XG5cdFx0fSxcblxuXHRcdG9uQ2xvc2VUYWdTdGFydChkYXRhOiBSYW5nZSkge1xuXHRcdFx0bGV2ZWwtLTtcblx0XHRcdG5ld2xpbmUoKTtcblx0XHRcdGFwcGVuZChkYXRhKTtcblx0XHR9LFxuXG5cdFx0b25DbG9zZVRhZ05hbWU6IGFwcGVuZCxcblx0XHRvbkNsb3NlVGFnRW5kOiBhcHBlbmRcblx0fSk7XG5cblx0cGFyc2VyLnBhcnNlKFNUQVJUICsgeG1sU3RyaW5nICsgRU5EKTtcblx0cmV0dXJuIGxpbmVzLmpvaW4oXCJcXG5cIikudHJpbSgpO1xufTtcblxuLyoqXG4gKiBDb21waWxlIGEgQ0RTIGZpbGUgaW50byBhbiBFRE1YIGZpbGUuXG4gKiBAcGFyYW0gY2RzVXJsIFRoZSBwYXRoIHRvIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIENEUyBkZWZpbml0aW9uLiBUaGlzIGZpbGUgbXVzdCBkZWNsYXJlIHRoZSBuYW1lc3BhY2VcbiAqIHNhcC5mZS50ZXN0IGFuZCBhIHNlcnZpY2UgSmVzdFNlcnZpY2VcbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIGNyZWF0aW5nIHRoZSBFRE1YIG91dHB1dFxuICogQHJldHVybnMgVGhlIHBhdGggb2YgdGhlIGdlbmVyYXRlZCBFRE1YXG4gKi9cbmV4cG9ydCBjb25zdCBjb21waWxlQ0RTID0gZnVuY3Rpb24gKGNkc1VybDogc3RyaW5nLCBvcHRpb25zOiBjb21waWxlci5PRGF0YU9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCBjZHNTdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoY2RzVXJsLCBcInV0Zi04XCIpO1xuXHRjb25zdCBlZG14Q29udGVudCA9IGNkczJlZG14KGNkc1N0cmluZywgXCJzYXAuZmUudGVzdC5KZXN0U2VydmljZVwiLCBvcHRpb25zKTtcblx0Y29uc3QgZGlyID0gcGF0aC5yZXNvbHZlKGNkc1VybCwgXCIuLlwiLCBcImdlblwiKTtcblxuXHQvLyBJZiB0aGUgY2FsbGVyIHByb3ZpZGVkIENEUyBjb21waWxlciBvcHRpb25zOiBJbmNsdWRlIHRoZW0gaW4gdGhlIGZpbGVuYW1lLiBUaGlzIHByZXZlbnRzIHVucHJlZGljdGFibGUgcmVzdWx0cyBpZiB0aGUgc2FtZSBDRFMgc291cmNlXG5cdC8vIGZpbGUgaXMgdXNlZCBzaW11bHRhbmVvdXNseSB3aXRoIGEgZGlmZmVyZW50IHNldCBvZiBvcHRpb25zIChlLmcuIGluIGEgdGVzdCBydW5uaW5nIGluIHBhcmFsbGVsKVxuXHRjb25zdCBhbGxPcHRpb25zID0gT2JqZWN0LmVudHJpZXMob3B0aW9ucyk7XG5cdGFsbE9wdGlvbnMuc29ydCgoYSwgYikgPT4gYlswXS5sb2NhbGVDb21wYXJlKGFbMF0pKTtcblxuXHRjb25zdCBlZG14RmlsZU5hbWUgPVxuXHRcdGFsbE9wdGlvbnMucmVkdWNlKFxuXHRcdFx0KGZpbGVuYW1lLCBbb3B0aW9uS2V5LCBvcHRpb25WYWx1ZV0pID0+IGAke2ZpbGVuYW1lfSMke29wdGlvbktleX09JHtvcHRpb25WYWx1ZS50b1N0cmluZygpfSNgLFxuXHRcdFx0cGF0aC5iYXNlbmFtZShjZHNVcmwpLnJlcGxhY2UoXCIuY2RzXCIsIFwiXCIpXG5cdFx0KSArIFwiLnhtbFwiO1xuXG5cdGNvbnN0IGVkbXhGaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShkaXIsIGVkbXhGaWxlTmFtZSk7XG5cblx0ZnMubWtkaXJTeW5jKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cblx0ZnMud3JpdGVGaWxlU3luYyhlZG14RmlsZVBhdGgsIGVkbXhDb250ZW50KTtcblx0cmV0dXJuIGVkbXhGaWxlUGF0aDtcbn07XG5cbi8qKlxuICogQ29tcGlsZSBDRFMgdG8gRURNWC5cbiAqIEBwYXJhbSBjZHMgVGhlIENEUyBtb2RlbC4gSXQgbXVzdCBkZWZpbmUgYXQgbGVhc3Qgb25lIHNlcnZpY2UuXG4gKiBAcGFyYW0gc2VydmljZSBUaGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHNlcnZpY2UgdG8gYmUgY29tcGlsZWQuIERlZmF1bHRzIHRvIFwic2FwLmZlLnRlc3QuSmVzdFNlcnZpY2VcIi5cbiAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIGNyZWF0aW5nIHRoZSBFRE1YIG91dHB1dFxuICogQHJldHVybnMgVGhlIGNvbXBpbGVkIHNlcnZpY2UgbW9kZWwgYXMgRURNWC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNkczJlZG14KGNkczogc3RyaW5nLCBzZXJ2aWNlID0gXCJzYXAuZmUudGVzdC5KZXN0U2VydmljZVwiLCBvcHRpb25zOiBjb21waWxlci5PRGF0YU9wdGlvbnMgPSB7fSkge1xuXHRjb25zdCBzb3VyY2VzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyBcInNvdXJjZS5jZHNcIjogY2RzIH07XG5cblx0Ly8gYWxsb3cgdG8gaW5jbHVkZSBzdHVmZiBmcm9tIEBzYXAvY2RzL2NvbW1vblxuXHRpZiAoY2RzLmluY2x1ZGVzKFwiJ0BzYXAvY2RzL2NvbW1vbidcIikpIHtcblx0XHRzb3VyY2VzW1wiY29tbW9uLmNkc1wiXSA9IGZzLnJlYWRGaWxlU3luYyhyZXF1aXJlLnJlc29sdmUoXCJAc2FwL2Nkcy9jb21tb24uY2RzXCIpLCBcInV0Zi04XCIpO1xuXHR9XG5cblx0Y29uc3QgY3NuID0gY29tcGlsZXIuY29tcGlsZVNvdXJjZXMoc291cmNlcywge30pO1xuXG5cdGNvbnN0IGVkbXhPcHRpb25zOiBjb21waWxlci5PRGF0YU9wdGlvbnMgPSB7XG5cdFx0b2RhdGFGb3JlaWduS2V5czogdHJ1ZSxcblx0XHRvZGF0YUZvcm1hdDogXCJzdHJ1Y3R1cmVkXCIsXG5cdFx0b2RhdGFDb250YWlubWVudDogdHJ1ZSxcblx0XHQuLi5vcHRpb25zLFxuXHRcdHNlcnZpY2U6IHNlcnZpY2Vcblx0fTtcblxuXHRjb25zdCBlZG14ID0gY29tcGlsZXIudG8uZWRteChjc24sIGVkbXhPcHRpb25zKTtcblx0aWYgKCFlZG14KSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGBDb21waWxhdGlvbiBmYWlsZWQuIEhpbnQ6IE1ha2Ugc3VyZSB0aGF0IHRoZSBDRFMgbW9kZWwgZGVmaW5lcyBzZXJ2aWNlICR7c2VydmljZX0uYCk7XG5cdH1cblx0cmV0dXJuIGVkbXg7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRGYWtlU2lkZUVmZmVjdHNTZXJ2aWNlID0gYXN5bmMgZnVuY3Rpb24gKFxuXHRtZXRhTW9kZWw6IE9EYXRhTWV0YU1vZGVsLFxuXHRjbGFzc05hbWVPRGF0YU1vZGVsID0gXCJzYXAudWkubW9kZWwub2RhdGEudjQuT0RhdGFNb2RlbFwiXG4pOiBQcm9taXNlPFNpZGVFZmZlY3RzU2VydmljZT4ge1xuXHRjb25zdCBzY29wZU9iamVjdCA9IHtcblx0XHRnZXRNb2RlbDogKCkgPT4ge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0aXNBOiAoKSA9PiBjbGFzc05hbWVPRGF0YU1vZGVsID09PSBcInNhcC51aS5tb2RlbC5vZGF0YS52NC5PRGF0YU1vZGVsXCIsXG5cdFx0XHRcdGdldE1ldGFNb2RlbDogKCkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiBtZXRhTW9kZWw7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGdldFNlcnZpY2VVcmw6ICgpID0+IHVuZGVmaW5lZFxuXHRcdFx0fTtcblx0XHR9LFxuXHRcdGdldFNlcnZpY2U6ICgpID0+IHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGdldENhcGFiaWxpdGllczogKCkgPT4gdW5kZWZpbmVkXG5cdFx0XHR9O1xuXHRcdH1cblx0fTtcblx0Y29uc3Qgc2VydmljZUluc3RhbmNlID0gYXdhaXQgbmV3IFNpZGVFZmZlY3RzRmFjdG9yeSgpLmNyZWF0ZUluc3RhbmNlKHsgc2NvcGVPYmplY3QsIHNjb3BlVHlwZTogXCJcIiwgc2V0dGluZ3M6IHt9IH0pO1xuXHRyZXR1cm4gc2VydmljZUluc3RhbmNlLmdldEludGVyZmFjZSgpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEZha2VEaWFnbm9zdGljcyA9IGZ1bmN0aW9uICgpOiBJRGlhZ25vc3RpY3Mge1xuXHRjb25zdCBpc3N1ZXM6IGFueVtdID0gW107XG5cdHJldHVybiB7XG5cdFx0YWRkSXNzdWUoaXNzdWVDYXRlZ29yeTogSXNzdWVDYXRlZ29yeSwgaXNzdWVTZXZlcml0eTogSXNzdWVTZXZlcml0eSwgZGV0YWlsczogc3RyaW5nKTogdm9pZCB7XG5cdFx0XHRpc3N1ZXMucHVzaCh7XG5cdFx0XHRcdGlzc3VlQ2F0ZWdvcnksXG5cdFx0XHRcdGlzc3VlU2V2ZXJpdHksXG5cdFx0XHRcdGRldGFpbHNcblx0XHRcdH0pO1xuXHRcdH0sXG5cdFx0Z2V0SXNzdWVzKCk6IGFueVtdIHtcblx0XHRcdHJldHVybiBpc3N1ZXM7XG5cdFx0fSxcblx0XHRjaGVja0lmSXNzdWVFeGlzdHMoaXNzdWVDYXRlZ29yeTogSXNzdWVDYXRlZ29yeSwgaXNzdWVTZXZlcml0eTogSXNzdWVTZXZlcml0eSwgZGV0YWlsczogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0XHRyZXR1cm4gaXNzdWVzLmZpbmQoKGlzc3VlKSA9PiB7XG5cdFx0XHRcdHJldHVybiBpc3N1ZS5pc3N1ZUNhdGVnb3J5ID09PSBpc3N1ZUNhdGVnb3J5ICYmIGlzc3VlLmlzc3VlU2V2ZXJpdHkgPT09IGlzc3VlU2V2ZXJpdHkgJiYgaXNzdWUuZGV0YWlscyA9PT0gZGV0YWlscztcblx0XHRcdH0pO1xuXHRcdH1cblx0fTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb252ZXJ0ZXJDb250ZXh0Rm9yVGVzdCA9IGZ1bmN0aW9uIChcblx0bWV0YU1vZGVsOiBPRGF0YU1ldGFNb2RlbCxcblx0bWFuaWZlc3RTZXR0aW5nczogTGlzdFJlcG9ydE1hbmlmZXN0U2V0dGluZ3MgfCBPYmplY3RQYWdlTWFuaWZlc3RTZXR0aW5nc1xuKSB7XG5cdGNvbnN0IGNvbnZlcnRlZFR5cGVzID0gY29udmVydFR5cGVzKG1ldGFNb2RlbCk7XG5cdGNvbnN0IGRhdGFNb2RlbFBhdGggPSBtYW5pZmVzdFNldHRpbmdzLmNvbnRleHRQYXRoXG5cdFx0PyBnZXRJbnZvbHZlZERhdGFNb2RlbE9iamVjdHM8UGFnZUNvbnRleHRQYXRoVGFyZ2V0PihtZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQobWFuaWZlc3RTZXR0aW5ncy5jb250ZXh0UGF0aCkgYXMgQ29udGV4dClcblx0XHQ6IGdldEludm9sdmVkRGF0YU1vZGVsT2JqZWN0czxQYWdlQ29udGV4dFBhdGhUYXJnZXQ+KG1ldGFNb2RlbC5jcmVhdGVCaW5kaW5nQ29udGV4dChgLyR7bWFuaWZlc3RTZXR0aW5ncy5lbnRpdHlTZXR9YCkpO1xuXHRyZXR1cm4gbmV3IENvbnZlcnRlckNvbnRleHQ8UGFnZUNvbnRleHRQYXRoVGFyZ2V0Pihcblx0XHRjb252ZXJ0ZWRUeXBlcyxcblx0XHRuZXcgTWFuaWZlc3RXcmFwcGVyKG1hbmlmZXN0U2V0dGluZ3MsIG1lcmdlKSxcblx0XHRnZXRGYWtlRGlhZ25vc3RpY3MoKSxcblx0XHRkYXRhTW9kZWxQYXRoXG5cdCk7XG59O1xuY29uc3QgbWV0YU1vZGVsQ2FjaGU6IGFueSA9IHt9O1xuZXhwb3J0IGNvbnN0IGdldE1ldGFNb2RlbCA9IGFzeW5jIGZ1bmN0aW9uIChzTWV0YWRhdGFVcmw6IHN0cmluZykge1xuXHRjb25zdCBvUmVxdWVzdG9yID0gX01ldGFkYXRhUmVxdWVzdG9yLmNyZWF0ZSh7fSwgXCI0LjBcIiwgdW5kZWZpbmVkLCB7fSwge30sIGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fSk7XG5cdGlmICghbWV0YU1vZGVsQ2FjaGVbc01ldGFkYXRhVXJsXSkge1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBuZXcgKE9EYXRhTWV0YU1vZGVsIGFzIGFueSkob1JlcXVlc3Rvciwgc01ldGFkYXRhVXJsLCB1bmRlZmluZWQsIHsgX3JlcXVlc3RBbm5vdGF0aW9uQ2hhbmdlczogKCkgPT4gW10gfSk7XG5cdFx0YXdhaXQgb01ldGFNb2RlbC5mZXRjaEVudGl0eUNvbnRhaW5lcigpO1xuXHRcdG1ldGFNb2RlbENhY2hlW3NNZXRhZGF0YVVybF0gPSBvTWV0YU1vZGVsO1xuXHR9XG5cblx0cmV0dXJuIG1ldGFNb2RlbENhY2hlW3NNZXRhZGF0YVVybF07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RGF0YU1vZGVsT2JqZWN0UGF0aEZvclByb3BlcnR5ID0gZnVuY3Rpb24gPFQgPSBQcm9wZXJ0eSB8IEVudGl0eVNldCB8IEFueUFubm90YXRpb24+KFxuXHRlbnRpdHlTZXQ6IEVudGl0eVNldCxcblx0Y29udmVydGVkVHlwZXM6IENvbnZlcnRlZE1ldGFkYXRhLFxuXHRwcm9wZXJ0eT86IFRcbik6IERhdGFNb2RlbE9iamVjdFBhdGg8VD4ge1xuXHRjb25zdCB0YXJnZXRQYXRoOiBEYXRhTW9kZWxPYmplY3RQYXRoPFQ+ID0ge1xuXHRcdHN0YXJ0aW5nRW50aXR5U2V0OiBlbnRpdHlTZXQsXG5cdFx0bmF2aWdhdGlvblByb3BlcnRpZXM6IFtdLFxuXHRcdHRhcmdldE9iamVjdDogcHJvcGVydHksXG5cdFx0dGFyZ2V0RW50aXR5U2V0OiBlbnRpdHlTZXQsXG5cdFx0dGFyZ2V0RW50aXR5VHlwZTogZW50aXR5U2V0LmVudGl0eVR5cGUsXG5cdFx0Y29udmVydGVkVHlwZXM6IGNvbnZlcnRlZFR5cGVzXG5cdH07XG5cdHRhcmdldFBhdGguY29udGV4dExvY2F0aW9uID0gdGFyZ2V0UGF0aCBhcyBEYXRhTW9kZWxPYmplY3RQYXRoPEVudGl0eVNldD47XG5cdHJldHVybiB0YXJnZXRQYXRoO1xufTtcblxuZXhwb3J0IGNvbnN0IGV2YWx1YXRlQmluZGluZyA9IGZ1bmN0aW9uIChiaW5kaW5nU3RyaW5nOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKSB7XG5cdGNvbnN0IGJpbmRpbmdFbGVtZW50ID0gQmluZGluZ1BhcnNlci5jb21wbGV4UGFyc2VyKGJpbmRpbmdTdHJpbmcpO1xuXHRyZXR1cm4gYmluZGluZ0VsZW1lbnQuZm9ybWF0dGVyLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7XG59O1xuXG50eXBlIE1vZGVsQ29udGVudCA9IHtcblx0W25hbWU6IHN0cmluZ106IGFueTtcbn07XG5cbi8qKlxuICogRXZhbHVhdGUgYSBiaW5kaW5nIGFnYWluc3QgYSBtb2RlbC5cbiAqIEBwYXJhbSBiaW5kaW5nU3RyaW5nIFRoZSBiaW5kaW5nIHN0cmluZy5cbiAqIEBwYXJhbSBtb2RlbENvbnRlbnQgQ29udGVudCBvZiB0aGUgZGVmYXVsdCBtb2RlbCB0byB1c2UgZm9yIGV2YWx1YXRpb24uXG4gKiBAcGFyYW0gbmFtZWRNb2RlbHNDb250ZW50IENvbnRlbnRzIG9mIGFkZGl0aW9uYWwsIG5hbWVkIG1vZGVscyB0byB1c2UuXG4gKiBAcmV0dXJucyBUaGUgZXZhbHVhdGVkIGJpbmRpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBldmFsdWF0ZUJpbmRpbmdXaXRoTW9kZWwoXG5cdGJpbmRpbmdTdHJpbmc6IHN0cmluZyB8IHVuZGVmaW5lZCxcblx0bW9kZWxDb250ZW50OiBNb2RlbENvbnRlbnQsXG5cdG5hbWVkTW9kZWxzQ29udGVudD86IHsgW21vZGVsTmFtZTogc3RyaW5nXTogTW9kZWxDb250ZW50IH1cbik6IHN0cmluZyB7XG5cdGNvbnN0IGJpbmRpbmdFbGVtZW50ID0gQmluZGluZ1BhcnNlci5jb21wbGV4UGFyc2VyKGJpbmRpbmdTdHJpbmcpO1xuXHRjb25zdCB0ZXh0ID0gbmV3IEludmlzaWJsZVRleHQoKTtcblx0dGV4dC5iaW5kUHJvcGVydHkoXCJ0ZXh0XCIsIGJpbmRpbmdFbGVtZW50KTtcblxuXHRjb25zdCBkZWZhdWx0TW9kZWwgPSBuZXcgSlNPTk1vZGVsKG1vZGVsQ29udGVudCk7XG5cdHRleHQuc2V0TW9kZWwoZGVmYXVsdE1vZGVsKTtcblx0dGV4dC5zZXRCaW5kaW5nQ29udGV4dChkZWZhdWx0TW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpKTtcblxuXHRpZiAobmFtZWRNb2RlbHNDb250ZW50KSB7XG5cdFx0Zm9yIChjb25zdCBbbmFtZSwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMobmFtZWRNb2RlbHNDb250ZW50KSkge1xuXHRcdFx0Y29uc3QgbW9kZWwgPSBuZXcgSlNPTk1vZGVsKGNvbnRlbnQpO1xuXHRcdFx0dGV4dC5zZXRNb2RlbChtb2RlbCwgbmFtZSk7XG5cdFx0XHR0ZXh0LnNldEJpbmRpbmdDb250ZXh0KG1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiKSwgbmFtZSk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHRleHQuZ2V0VGV4dCgpO1xufVxuXG5jb25zdCBURVNUVklFV0lEID0gXCJ0ZXN0Vmlld0lkXCI7XG5cbmNvbnN0IGFwcGx5RmxleENoYW5nZXMgPSBhc3luYyBmdW5jdGlvbiAoZmxleENoYW5nZXM6IHsgW3g6IHN0cmluZ106IG9iamVjdFtdIH0sIG9NZXRhTW9kZWw6IE1ldGFNb2RlbCwgcmVzdWx0WE1MOiBhbnkpIHtcblx0Ly8gcHJlZml4IElkc1xuXHRbLi4ucmVzdWx0WE1MLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbaWRdXCIpXS5mb3JFYWNoKChub2RlKSA9PiB7XG5cdFx0bm9kZS5pZCA9IGAke1RFU1RWSUVXSUR9LS0ke25vZGUuaWR9YDtcblx0fSk7XG5cdGNvbnN0IGNoYW5nZXMgPSBjcmVhdGVGbGV4aWJpbGl0eUNoYW5nZXNPYmplY3QoVEVTVFZJRVdJRCwgZmxleENoYW5nZXMpO1xuXHRjb25zdCBhcHBJZCA9IFwic29tZUNvbXBvbmVudFwiO1xuXHRjb25zdCBvTWFuaWZlc3QgPSB7XG5cdFx0XCJzYXAuYXBwXCI6IHtcblx0XHRcdGlkOiBhcHBJZCxcblx0XHRcdHR5cGU6IFwiYXBwbGljYXRpb25cIixcblx0XHRcdGNyb3NzTmF2aWdhdGlvbjoge1xuXHRcdFx0XHRvdXRib3VuZHM6IFtdXG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRjb25zdCBvQXBwQ29tcG9uZW50OiBBcHBDb21wb25lbnQgPSB7XG5cdFx0Z2V0RGlhZ25vc3RpY3M6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoZ2V0RmFrZURpYWdub3N0aWNzKCkpLFxuXHRcdGdldE1vZGVsOiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKHtcblx0XHRcdGdldE1ldGFNb2RlbDogamVzdC5mbigpLm1vY2tSZXR1cm5WYWx1ZShvTWV0YU1vZGVsKVxuXHRcdH0pLFxuXHRcdGdldENvbXBvbmVudERhdGE6IGplc3QuZm4oKS5tb2NrUmV0dXJuVmFsdWUoe30pLFxuXHRcdGdldE1hbmlmZXN0T2JqZWN0OiBqZXN0LmZuKCkubW9ja1JldHVyblZhbHVlKHtcblx0XHRcdGdldEVudHJ5OiBmdW5jdGlvbiAobmFtZTogc3RyaW5nKSB7XG5cdFx0XHRcdHJldHVybiAob01hbmlmZXN0IGFzIGFueSlbbmFtZV07XG5cdFx0XHR9XG5cdFx0fSksXG5cdFx0Z2V0TG9jYWxJZDogamVzdC5mbigoc0lkKSA9PiBzSWQpXG5cdH0gYXMgdW5rbm93biBhcyBBcHBDb21wb25lbnQ7XG5cdC8vZmFrZSBjaGFuZ2VzXG5cdGplc3Quc3B5T24oQXBwU3RvcmFnZSwgXCJsb2FkRmxleERhdGFcIikubW9ja1JldHVyblZhbHVlKFByb21pc2UucmVzb2x2ZShjaGFuZ2VzKSk7XG5cdGplc3Quc3B5T24oTG9hZGVyLCBcImxvYWRGbGV4RGF0YVwiKS5tb2NrUmV0dXJuVmFsdWUoUHJvbWlzZS5yZXNvbHZlKGNoYW5nZXMpKTtcblxuXHRqZXN0LnNweU9uKENvbXBvbmVudCBhcyB1bmtub3duIGFzIHsgZ2V0Q29tcG9uZW50QnlJZDogKCkgPT4gQXBwQ29tcG9uZW50IH0sIFwiZ2V0Q29tcG9uZW50QnlJZFwiKS5tb2NrUmV0dXJuVmFsdWUob0FwcENvbXBvbmVudCk7XG5cdGplc3Quc3B5T24oVXRpbHMsIFwiZ2V0QXBwQ29tcG9uZW50Rm9yQ29udHJvbFwiKS5tb2NrUmV0dXJuVmFsdWUob0FwcENvbXBvbmVudCk7XG5cdGF3YWl0IEZsZXhTdGF0ZS5pbml0aWFsaXplKHtcblx0XHRjb21wb25lbnRJZDogYXBwSWRcblx0fSk7XG5cdHJlc3VsdFhNTCA9IGF3YWl0IFhtbFByZXByb2Nlc3Nvci5wcm9jZXNzKHJlc3VsdFhNTCwgeyBuYW1lOiBcIlRlc3QgRnJhZ21lbnRcIiwgY29tcG9uZW50SWQ6IGFwcElkLCBpZDogVEVTVFZJRVdJRCB9KTtcblxuXHQvL0Fzc2VydCB0aGF0IGFsbCBjaGFuZ2VzIGhhdmUgYmVlbiBhcHBsaWVkXG5cdGNvbnN0IGNoYW5nZXNBcHBsaWVkID0gZ2V0Q2hhbmdlc0Zyb21YTUwocmVzdWx0WE1MKTtcblx0ZXhwZWN0KGNoYW5nZXNBcHBsaWVkLmxlbmd0aCkudG9CZShmbGV4Q2hhbmdlcz8uY2hhbmdlcz8ubGVuZ3RoID8/IDAgKyBmbGV4Q2hhbmdlcz8udmFyaWFudERlcGVuZGVudENvbnRyb2xDaGFuZ2VzPy5sZW5ndGggPz8gMCk7XG5cdHJldHVybiByZXN1bHRYTUw7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q2hhbmdlc0Zyb21YTUwgPSAoeG1sOiBhbnkpID0+XG5cdFsuLi54bWwucXVlcnlTZWxlY3RvckFsbChcIipcIildXG5cdFx0LmZsYXRNYXAoKGUpID0+IFsuLi5lLmF0dHJpYnV0ZXNdLm1hcCgoYSkgPT4gYS5uYW1lKSlcblx0XHQuZmlsdGVyKChhdHRyKSA9PiBhdHRyLmluY2x1ZGVzKFwic2FwLnVpLmZsLmFwcGxpZWRDaGFuZ2VzXCIpKTtcblxuZXhwb3J0IGNvbnN0IGdldFRlbXBsYXRpbmdSZXN1bHQgPSBhc3luYyBmdW5jdGlvbiAoXG5cdHhtbElucHV0OiBzdHJpbmcsXG5cdHNNZXRhZGF0YVVybDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRtQmluZGluZ0NvbnRleHRzOiB7IFt4OiBzdHJpbmddOiBhbnk7IGVudGl0eVNldD86IHN0cmluZyB9LFxuXHRtTW9kZWxzOiB7IFt4OiBzdHJpbmddOiBhbnkgfSxcblx0ZmxleENoYW5nZXM/OiB7IFt4OiBzdHJpbmddOiBvYmplY3RbXSB9LFxuXHRmYWtlU2lkZUVmZmVjdFNlcnZpY2U/OiB1bmtub3duXG4pIHtcblx0aWYgKCFtTW9kZWxzW1wic2FwLmZlLmkxOG5cIl0pIHtcblx0XHRtTW9kZWxzW1wic2FwLmZlLmkxOG5cIl0gPSBjcmVhdGVNb2NrUmVzb3VyY2VNb2RlbCgpO1xuXHR9XG5cblx0Y29uc3QgdGVtcGxhdGVkWG1sID0gYDxyb290PiR7eG1sSW5wdXR9PC9yb290PmA7XG5cdGNvbnN0IHBhcnNlciA9IG5ldyB3aW5kb3cuRE9NUGFyc2VyKCk7XG5cdGNvbnN0IHhtbERvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcodGVtcGxhdGVkWG1sLCBcInRleHQveG1sXCIpO1xuXHQvLyBUbyBlbnN1cmUgb3VyIG1hY3JvIGNhbiB1c2UgI3NldEJpbmRpbmdDb250ZXh0IHdlIGVuc3VyZSB0aGVyZSBpcyBhIHByZSBleGlzdGluZyBKU09OTW9kZWwgZm9yIGNvbnZlcnRlckNvbnRleHRcblx0Ly8gaWYgbm90IGFscmVhZHkgcGFzc2VkIHRvIHRlaCB0ZW1wbGF0aW5nXG5cblx0Y29uc3Qgb1ByZXByb2Nlc3NvclNldHRpbmdzID0gYXdhaXQgX2J1aWxkUHJlUHJvY2Vzc29yU2V0dGluZ3Moc01ldGFkYXRhVXJsLCBtQmluZGluZ0NvbnRleHRzLCBtTW9kZWxzLCBmYWtlU2lkZUVmZmVjdFNlcnZpY2UpO1xuXG5cdC8vVGhpcyBjb250ZXh0IGZvciBtYWNybyB0ZXN0aW5nXG5cdGlmIChvUHJlcHJvY2Vzc29yU2V0dGluZ3MubW9kZWxzW1widGhpc1wiXSkge1xuXHRcdG9QcmVwcm9jZXNzb3JTZXR0aW5ncy5iaW5kaW5nQ29udGV4dHNbXCJ0aGlzXCJdID0gb1ByZXByb2Nlc3NvclNldHRpbmdzLm1vZGVsc1tcInRoaXNcIl0uY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpO1xuXHR9XG5cblx0bGV0IHJlc3VsdFhNTCA9IChhd2FpdCBYTUxQcmVwcm9jZXNzb3IucHJvY2Vzcyh4bWxEb2MuZmlyc3RFbGVtZW50Q2hpbGQhLCB7IG5hbWU6IFwiVGVzdCBGcmFnbWVudFwiIH0sIG9QcmVwcm9jZXNzb3JTZXR0aW5ncykpIGFzIGFueTtcblxuXHRpZiAoc01ldGFkYXRhVXJsICYmIGZsZXhDaGFuZ2VzKSB7XG5cdFx0Ly8gYXBwbHkgZmxleCBjaGFuZ2VzXG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IGF3YWl0IGdldE1ldGFNb2RlbChzTWV0YWRhdGFVcmwpO1xuXHRcdHJlc3VsdFhNTCA9IGF3YWl0IGFwcGx5RmxleENoYW5nZXMoZmxleENoYW5nZXMsIG9NZXRhTW9kZWwsIHJlc3VsdFhNTCk7XG5cdH1cblx0cmV0dXJuIHJlc3VsdFhNTDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUZW1wbGF0ZWRYTUwgPSBhc3luYyBmdW5jdGlvbiAoXG5cdHhtbElucHV0OiBzdHJpbmcsXG5cdHNNZXRhZGF0YVVybDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuXHRtQmluZGluZ0NvbnRleHRzOiB7IFt4OiBzdHJpbmddOiBzdHJpbmcgfSxcblx0bU1vZGVsczogeyBbeDogc3RyaW5nXTogYW55IH0sXG5cdGZsZXhDaGFuZ2VzPzogeyBbeDogc3RyaW5nXTogb2JqZWN0W10gfSxcblx0ZmFrZVNpZGVFZmZlY3RTZXJ2aWNlPzogdW5rbm93blxuKTogUHJvbWlzZTxzdHJpbmc+IHtcblx0cmV0dXJuIGpzeC5kZWZpbmVYTUxOYW1lc3BhY2VNYXAocmV2ZXNlTmFtZXNwYWNlTWFwLCBhc3luYyAoKSA9PiB7XG5cdFx0Y29uc3QgdGVtcGxhdGVkWE1MID0gYXdhaXQgZ2V0VGVtcGxhdGluZ1Jlc3VsdChcblx0XHRcdHhtbElucHV0LFxuXHRcdFx0c01ldGFkYXRhVXJsLFxuXHRcdFx0bUJpbmRpbmdDb250ZXh0cyxcblx0XHRcdG1Nb2RlbHMsXG5cdFx0XHRmbGV4Q2hhbmdlcyxcblx0XHRcdGZha2VTaWRlRWZmZWN0U2VydmljZVxuXHRcdCk7XG5cdFx0Y29uc3Qgc2VyaWFsaWVkWE1MID0gc2VyaWFsaXplWE1MKHRlbXBsYXRlZFhNTCwgdW5kZWZpbmVkKTtcblx0XHRleHBlY3Qoc2VyaWFsaWVkWE1MKS5ub3QudG9IYXZlVGVtcGxhdGluZ0Vycm9ycygpO1xuXHRcdHJldHVybiBzZXJpYWxpZWRYTUw7XG5cdH0pIGFzIHVua25vd24gYXMgUHJvbWlzZTxzdHJpbmc+O1xufTtcblxuLyoqXG4gKiBQcm9jZXNzIHRoZSByZXF1ZXN0ZWQgdmlldyB3aXRoIHRoZSBwcm92aWRlZCBkYXRhLlxuICogQHBhcmFtIG5hbWUgRnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHZpZXcgdG8gYmUgdGVzdGVkLlxuICogQHBhcmFtIHNNZXRhZGF0YVVybCBVcmwgb2YgdGhlIG1ldGFkYXRhLlxuICogQHBhcmFtIG1CaW5kaW5nQ29udGV4dHMgTWFwIG9mIHRoZSBiaW5kaW5nQ29udGV4dHMgdG8gc2V0IG9uIHRoZSBtb2RlbHMuXG4gKiBAcGFyYW0gbU1vZGVscyBNYXAgb2YgdGhlIG1vZGVscy5cbiAqIEBwYXJhbSBmbGV4Q2hhbmdlcyBPYmplY3Qgd2l0aCBVSSBjaGFuZ2VzIGxpa2UgJ2NoYW5nZXMnIG9yICd2YXJpYW50RGVwZW5kZW50Q29udHJvbENoYW5nZXMnXG4gKiBAcmV0dXJucyBUZW1wbGF0ZWQgdmlldyBhcyBzdHJpbmdcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NWaWV3KFxuXHRuYW1lOiBzdHJpbmcsXG5cdHNNZXRhZGF0YVVybDogc3RyaW5nLFxuXHRtQmluZGluZ0NvbnRleHRzOiB7IFt4OiBzdHJpbmddOiBzdHJpbmcgfSxcblx0bU1vZGVsczogeyBbeDogc3RyaW5nXTogYW55IH0sXG5cdGZsZXhDaGFuZ2VzPzogeyBbeDogc3RyaW5nXTogb2JqZWN0W10gfVxuKTogUHJvbWlzZTxKZXN0VGVtcGxhdGVkVmlldz4ge1xuXHRjb25zdCBvTWV0YU1vZGVsID0gYXdhaXQgZ2V0TWV0YU1vZGVsKHNNZXRhZGF0YVVybCk7XG5cdGNvbnN0IG9WaWV3RG9jdW1lbnQgPSBfbG9hZFJlc291cmNlVmlldyhuYW1lKTtcblx0Y29uc3Qgb1ByZXByb2Nlc3NvclNldHRpbmdzID0gYXdhaXQgX2J1aWxkUHJlUHJvY2Vzc29yU2V0dGluZ3Moc01ldGFkYXRhVXJsLCBtQmluZGluZ0NvbnRleHRzLCBtTW9kZWxzKTtcblx0bGV0IG9QcmVwcm9jZXNzZWRWaWV3ID0gYXdhaXQgWE1MUHJlcHJvY2Vzc29yLnByb2Nlc3Mob1ZpZXdEb2N1bWVudCwgeyBuYW1lOiBuYW1lIH0sIG9QcmVwcm9jZXNzb3JTZXR0aW5ncyk7XG5cdGlmIChmbGV4Q2hhbmdlcykge1xuXHRcdG9QcmVwcm9jZXNzZWRWaWV3ID0gYXdhaXQgYXBwbHlGbGV4Q2hhbmdlcyhmbGV4Q2hhbmdlcyA/PyBbXSwgb01ldGFNb2RlbCwgb1ByZXByb2Nlc3NlZFZpZXcpO1xuXHR9XG5cdHJldHVybiB7XG5cdFx0YXNFbGVtZW50OiBvUHJlcHJvY2Vzc2VkVmlldyxcblx0XHRhc1N0cmluZzogZm9ybWF0WE1MKG9QcmVwcm9jZXNzZWRWaWV3Py5vdXRlckhUTUwgfHwgXCJcIilcblx0fTtcbn1cblxuLyoqXG4gKiBQcm9jZXNzIHRoZSByZXF1ZXN0ZWQgWE1MIGZyYWdtZW50IHdpdGggdGhlIHByb3ZpZGVkIGRhdGEuXG4gKiBAcGFyYW0gbmFtZSBGdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgZnJhZ21lbnQgdG8gYmUgdGVzdGVkLlxuICogQHBhcmFtIHRlc3REYXRhIFRlc3QgZGF0YSBjb25zaXN0aW5nXG4gKiBAcmV0dXJucyBUZW1wbGF0ZWQgZnJhZ21lbnQgYXMgc3RyaW5nXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzRnJhZ21lbnQobmFtZTogc3RyaW5nLCB0ZXN0RGF0YTogeyBbbW9kZWw6IHN0cmluZ106IG9iamVjdCB9KTogUHJvbWlzZTxzdHJpbmc+IHtcblx0Y29uc3QgaW5wdXRYbWwgPSBgPHJvb3Q+PGNvcmU6RnJhZ21lbnQgZnJhZ21lbnROYW1lPVwiJHtuYW1lfVwiIHR5cGU9XCJYTUxcIiB4bWxuczpjb3JlPVwic2FwLnVpLmNvcmVcIiAvPjwvcm9vdD5gO1xuXHRjb25zdCBwYXJzZXIgPSBuZXcgd2luZG93LkRPTVBhcnNlcigpO1xuXG5cdGNvbnN0IGlucHV0RG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhpbnB1dFhtbCwgXCJ0ZXh0L3htbFwiKTtcblxuXHQvLyBidWlsZCBtb2RlbCBhbmQgYmluZGluZ3MgZm9yIGdpdmVuIHRlc3QgZGF0YVxuXHRjb25zdCBzZXR0aW5ncyA9IHtcblx0XHRtb2RlbHM6IHt9IGFzIHsgW25hbWU6IHN0cmluZ106IEpTT05Nb2RlbCB9LFxuXHRcdGJpbmRpbmdDb250ZXh0czoge30gYXMgeyBbbmFtZTogc3RyaW5nXTogb2JqZWN0IH0sXG5cdFx0YXBwQ29tcG9uZW50OiB7IGdldFNpZGVFZmZlY3RzU2VydmljZTogamVzdC5mbigpLCBnZXREaWFnbm9zdGljczogKCkgPT4gdW5kZWZpbmVkIH1cblx0fTtcblx0Zm9yIChjb25zdCBtb2RlbCBpbiB0ZXN0RGF0YSkge1xuXHRcdGNvbnN0IGpzb25Nb2RlbCA9IG5ldyBKU09OTW9kZWwoKTtcblx0XHRqc29uTW9kZWwuc2V0RGF0YSh0ZXN0RGF0YVttb2RlbF0pO1xuXHRcdHNldHRpbmdzLm1vZGVsc1ttb2RlbF0gPSBqc29uTW9kZWw7XG5cdFx0c2V0dGluZ3MuYmluZGluZ0NvbnRleHRzW21vZGVsXSA9IHNldHRpbmdzLm1vZGVsc1ttb2RlbF0uY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpO1xuXHR9XG5cdHNldHRpbmdzLmFwcENvbXBvbmVudC5nZXRTaWRlRWZmZWN0c1NlcnZpY2UubW9ja1JldHVyblZhbHVlKGRlZmF1bHRGYWtlU2lkZUVmZmVjdFNlcnZpY2UpO1xuXG5cdC8vIGV4ZWN1dGUgdGhlIHByZS1wcm9jZXNzb3Jcblx0Y29uc3QgcmVzdWx0RG9jID0gYXdhaXQgWE1MUHJlcHJvY2Vzc29yLnByb2Nlc3MoaW5wdXREb2MuZmlyc3RFbGVtZW50Q2hpbGQsIHsgbmFtZSB9LCBzZXR0aW5ncyk7XG5cblx0Ly8gZXhjbHVkZSBuZXN0ZWQgZnJhZ21lbnRzIGZyb20gdGVzdCBzbmFwc2hvdHNcblx0Y29uc3QgZnJhZ21lbnRzID0gcmVzdWx0RG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiY29yZTpGcmFnbWVudFwiKSBhcyBhbnk7XG5cdGlmIChmcmFnbWVudHM/Lmxlbmd0aCA+IDApIHtcblx0XHRmb3IgKGNvbnN0IGZyYWdtZW50IG9mIGZyYWdtZW50cykge1xuXHRcdFx0ZnJhZ21lbnQuaW5uZXJIVE1MID0gXCJcIjtcblx0XHR9XG5cdH1cblxuXHQvLyBLZWVwIHRoZSBmcmFnbWVudCByZXN1bHQgYXMgY2hpbGQgb2Ygcm9vdCBub2RlIHdoZW4gZnJhZ21lbnQgZ2VuZXJhdGVzIG11bHRpcGxlIHJvb3QgY29udHJvbHNcblx0Y29uc3QgeG1sUmVzdWx0ID0gcmVzdWx0RG9jLmNoaWxkcmVuLmxlbmd0aCA+IDEgPyByZXN1bHREb2Mub3V0ZXJIVE1MIDogcmVzdWx0RG9jLmlubmVySFRNTDtcblxuXHRyZXR1cm4gZm9ybWF0WE1MKHhtbFJlc3VsdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVDb250cm9sKGNvbnRyb2xUb1NlcmlhbGl6ZT86IFVJNUVsZW1lbnQgfCBVSTVFbGVtZW50W10sIHNob3dDdXN0b21TdHlsZUNsYXNzZXMgPSBmYWxzZSkge1xuXHRsZXQgdGFiQ291bnQgPSAwO1xuXHRjb25zdCBVSUQgPSAvdWlkLS1pZC1cXGR7MTN9LVxcZHsxLDN9Lztcblx0Y29uc3QgQ09OVFJPTElEID0gL2lkLVxcZHsxM30tXFxkezEsM30vO1xuXHRmdW5jdGlvbiBnZXRUYWIodG9BZGQgPSAwKSB7XG5cdFx0bGV0IHRhYiA9IFwiXCI7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0YWJDb3VudCArIHRvQWRkOyBpKyspIHtcblx0XHRcdHRhYiArPSBcIlxcdFwiO1xuXHRcdH1cblx0XHRyZXR1cm4gdGFiO1xuXHR9XG5cdGNvbnN0IHNlcmlhbGl6ZURlbGVnYXRlID0ge1xuXHRcdHN0YXJ0OiBmdW5jdGlvbiAoY29udHJvbDogYW55LCBzQWdncmVnYXRpb25OYW1lOiBzdHJpbmcpIHtcblx0XHRcdGxldCBjb250cm9sRGV0YWlsID0gXCJcIjtcblx0XHRcdGlmIChzQWdncmVnYXRpb25OYW1lKSB7XG5cdFx0XHRcdGlmIChjb250cm9sLmdldFBhcmVudCgpKSB7XG5cdFx0XHRcdFx0Y29uc3QgaW5kZXhJblBhcmVudCA9IChjb250cm9sLmdldFBhcmVudCgpLmdldEFnZ3JlZ2F0aW9uKHNBZ2dyZWdhdGlvbk5hbWUpIGFzIE1hbmFnZWRPYmplY3RbXSk/LmluZGV4T2Y/Lihjb250cm9sKTtcblx0XHRcdFx0XHRpZiAoaW5kZXhJblBhcmVudCA+IDApIHtcblx0XHRcdFx0XHRcdGNvbnRyb2xEZXRhaWwgKz0gYCxcXG4ke2dldFRhYigpfWA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRjb250cm9sRGV0YWlsICs9IGAke2NvbnRyb2wuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCl9KGA7XG5cdFx0XHRyZXR1cm4gY29udHJvbERldGFpbDtcblx0XHR9LFxuXHRcdGVuZDogZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIFwifSlcIjtcblx0XHR9LFxuXHRcdG1pZGRsZTogZnVuY3Rpb24gKGNvbnRyb2w6IGFueSkge1xuXHRcdFx0bGV0IGlkID0gY29udHJvbC5nZXRJZCgpO1xuXHRcdFx0aWQgPSB0eXBlb2YgaWQgPT09IFwic3RyaW5nXCIgPyBpZD8ucmVwbGFjZT8uKENPTlRST0xJRCwgXCJpZFwiKSA6IGlkO1xuXHRcdFx0bGV0IGRhdGEgPSBge2lkOiAke01hbmFnZWRPYmplY3RNZXRhZGF0YS5pc0dlbmVyYXRlZElkKGlkKSA/IFwiX19keW5hbWljSWRcIiA6IGlkfWA7XG5cdFx0XHRmb3IgKGNvbnN0IG9Db250cm9sS2V5IGluIGNvbnRyb2wubVByb3BlcnRpZXMpIHtcblx0XHRcdFx0aWYgKGNvbnRyb2wubVByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkob0NvbnRyb2xLZXkpKSB7XG5cdFx0XHRcdFx0bGV0IHByb3BlcnR5VmFsdWUgPSBjb250cm9sLm1Qcm9wZXJ0aWVzW29Db250cm9sS2V5XTtcblx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gdHlwZW9mIHByb3BlcnR5VmFsdWUgPT09IFwic3RyaW5nXCIgPyBwcm9wZXJ0eVZhbHVlPy5yZXBsYWNlPy4oVUlELCBcInVpZC0taWRcIikgOiBwcm9wZXJ0eVZhbHVlO1xuXHRcdFx0XHRcdHByb3BlcnR5VmFsdWUgPSB0eXBlb2YgcHJvcGVydHlWYWx1ZSA9PT0gXCJzdHJpbmdcIiA/IHByb3BlcnR5VmFsdWU/LnJlcGxhY2U/LihDT05UUk9MSUQsIFwiaWRcIikgOiBwcm9wZXJ0eVZhbHVlO1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRwcm9wZXJ0eVZhbHVlID0gdHlwZW9mIHByb3BlcnR5VmFsdWUgPT09IFwib2JqZWN0XCIgPyBKU09OLnN0cmluZ2lmeShwcm9wZXJ0eVZhbHVlKSA6IHByb3BlcnR5VmFsdWU7XG5cdFx0XHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRcdFx0Ly8gU3RyaW5naWZ5IG1heSBmYWlsIGZvciBjaXJjdWxhciByZWZlcmVuY2VzIGJ1dCBpdCdzIG5vdCB0aGUgZW5kIG9mIHRoZSB3b3JsZFxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGRhdGEgKz0gYCxcXG4ke2dldFRhYigpfSAke29Db250cm9sS2V5fTogJHtwcm9wZXJ0eVZhbHVlfWA7XG5cdFx0XHRcdH0gZWxzZSBpZiAoY29udHJvbC5tQmluZGluZ0luZm9zLmhhc093blByb3BlcnR5KG9Db250cm9sS2V5KSkge1xuXHRcdFx0XHRcdGNvbnN0IGJpbmRpbmdEZXRhaWwgPSB7IC4uLmNvbnRyb2wubUJpbmRpbmdJbmZvc1tvQ29udHJvbEtleV0gfTtcblx0XHRcdFx0XHRpZiAoYmluZGluZ0RldGFpbC50eXBlPy5vT3V0cHV0Rm9ybWF0KSB7XG5cdFx0XHRcdFx0XHRkZWxldGUgYmluZGluZ0RldGFpbC50eXBlLm9PdXRwdXRGb3JtYXQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChiaW5kaW5nRGV0YWlsLmJpbmRpbmcpIHtcblx0XHRcdFx0XHRcdGRlbGV0ZSBiaW5kaW5nRGV0YWlsLmJpbmRpbmc7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGRhdGEgKz0gYCxcXG4ke2dldFRhYigpfSAke29Db250cm9sS2V5fTogJHtKU09OLnN0cmluZ2lmeShiaW5kaW5nRGV0YWlsKX1gO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRmb3IgKGNvbnN0IG9Db250cm9sS2V5IGluIGNvbnRyb2wubUFzc29jaWF0aW9ucykge1xuXHRcdFx0XHRpZiAoY29udHJvbC5tQXNzb2NpYXRpb25zLmhhc093blByb3BlcnR5KG9Db250cm9sS2V5KSkge1xuXHRcdFx0XHRcdGxldCBhc3NvY2lhdGlvblZhbHVlID0gY29udHJvbC5tQXNzb2NpYXRpb25zW29Db250cm9sS2V5XTtcblx0XHRcdFx0XHRpZiAoIUFycmF5LmlzQXJyYXkoYXNzb2NpYXRpb25WYWx1ZSkpIHtcblx0XHRcdFx0XHRcdGFzc29jaWF0aW9uVmFsdWUgPSBbYXNzb2NpYXRpb25WYWx1ZV07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGFzc29jaWF0aW9uVmFsdWUgPSBhc3NvY2lhdGlvblZhbHVlLm1hcCgoYXNzb2NpYXRpb25WYWx1ZUVsZW1lbnQ6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHR5cGVvZiBhc3NvY2lhdGlvblZhbHVlRWxlbWVudCA9PT0gXCJzdHJpbmdcIlxuXHRcdFx0XHRcdFx0XHQ/IGFzc29jaWF0aW9uVmFsdWVFbGVtZW50Py5yZXBsYWNlPy4oQ09OVFJPTElELCBcImlkXCIpXG5cdFx0XHRcdFx0XHRcdDogYXNzb2NpYXRpb25WYWx1ZUVsZW1lbnQ7XG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRkYXRhICs9IGAsXFxuJHtnZXRUYWIoKX0gJHtvQ29udHJvbEtleX06ICR7KGFzc29jaWF0aW9uVmFsdWU/LmpvaW4/LihcIixcIikgPz8gYXNzb2NpYXRpb25WYWx1ZSkgfHwgdW5kZWZpbmVkfWA7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChzaG93Q3VzdG9tU3R5bGVDbGFzc2VzICYmIGNvbnRyb2wuYUN1c3RvbVN0eWxlQ2xhc3Nlcz8ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRkYXRhICs9IGAsXFxuJHtnZXRUYWIoKX0gY3VzdG9tU3R5bGVDbGFzc2VzIDogJHtjb250cm9sLmFDdXN0b21TdHlsZUNsYXNzZXMuam9pbihcIiwgXCIpfWA7XG5cdFx0XHR9XG5cdFx0XHRmb3IgKGNvbnN0IG9Db250cm9sS2V5IGluIGNvbnRyb2wubUV2ZW50UmVnaXN0cnkpIHtcblx0XHRcdFx0aWYgKGNvbnRyb2wubUV2ZW50UmVnaXN0cnkuaGFzT3duUHJvcGVydHkob0NvbnRyb2xLZXkpKSB7XG5cdFx0XHRcdFx0ZGF0YSArPSBgLFxcbiR7Z2V0VGFiKCl9ICR7b0NvbnRyb2xLZXl9OiB0cnVlYDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0ZGF0YSArPSBgYDtcblx0XHRcdHJldHVybiBkYXRhO1xuXHRcdH0sXG5cdFx0c3RhcnRBZ2dyZWdhdGlvbjogZnVuY3Rpb24gKGNvbnRyb2w6IHsgbUJpbmRpbmdJbmZvczogUmVjb3JkPHN0cmluZywgQmFzZUFnZ3JlZ2F0aW9uQmluZGluZ0luZm8+IH0sIHNOYW1lOiBzdHJpbmcpIHtcblx0XHRcdGxldCBvdXQgPSBgLFxcbiR7Z2V0VGFiKCl9JHtzTmFtZX1gO1xuXHRcdFx0dGFiQ291bnQrKztcblxuXHRcdFx0aWYgKGNvbnRyb2wubUJpbmRpbmdJbmZvc1tzTmFtZV0pIHtcblx0XHRcdFx0b3V0ICs9IGA9eyBwYXRoOicke2NvbnRyb2wubUJpbmRpbmdJbmZvc1tzTmFtZV0ucGF0aH0nLCB0ZW1wbGF0ZTpcXG4ke2dldFRhYigpfWA7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvdXQgKz0gYD1bXFxuJHtnZXRUYWIoKX1gO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG91dDtcblx0XHR9LFxuXHRcdGVuZEFnZ3JlZ2F0aW9uOiBmdW5jdGlvbiAoY29udHJvbDogYW55LCBzTmFtZTogc3RyaW5nKSB7XG5cdFx0XHR0YWJDb3VudC0tO1xuXHRcdFx0aWYgKGNvbnRyb2wubUJpbmRpbmdJbmZvc1tzTmFtZV0pIHtcblx0XHRcdFx0cmV0dXJuIGBcXG4ke2dldFRhYigpfX1gO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIGBcXG4ke2dldFRhYigpfV1gO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0aWYgKEFycmF5LmlzQXJyYXkoY29udHJvbFRvU2VyaWFsaXplKSkge1xuXHRcdHJldHVybiBjb250cm9sVG9TZXJpYWxpemUubWFwKChjb250cm9sVG9SZW5kZXI6IFVJNUVsZW1lbnQpID0+IHtcblx0XHRcdHJldHVybiBuZXcgU2VyaWFsaXplcihjb250cm9sVG9SZW5kZXIsIHNlcmlhbGl6ZURlbGVnYXRlKS5zZXJpYWxpemUoKTtcblx0XHR9KTtcblx0fSBlbHNlIHtcblx0XHRyZXR1cm4gbmV3IFNlcmlhbGl6ZXIoY29udHJvbFRvU2VyaWFsaXplLCBzZXJpYWxpemVEZWxlZ2F0ZSkuc2VyaWFsaXplKCk7XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZUNvbnRyb2xBc1hNTChjb250cm9sVG9TZXJpYWxpemU/OiBVSTVFbGVtZW50IHwgVUk1RWxlbWVudFtdLCBzaG93Q3VzdG9tU3R5bGVDbGFzc2VzID0gZmFsc2UpIHtcblx0bGV0IHRhYkNvdW50ID0gMDtcblx0Y29uc3QgVUlEID0gL3VpZC0taWQtXFxkezEzfS1cXGR7MSwzfS87XG5cdGNvbnN0IENPTlRST0xJRCA9IC9pZC1cXGR7MTN9LVxcZHsxLDN9Lztcblx0Y29uc3QgZGVmaW5lZE5hbWVzcGFjZXM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XG5cblx0ZnVuY3Rpb24gZ2V0TmFtZXNwYWNlQWxpYXMoY2xhc3NOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdGNvbnN0IG5hbWVzU3BsaXQgPSBjbGFzc05hbWUuc3BsaXQoXCIuXCIpO1xuXHRcdGNvbnN0IG5hbWVzcGFjZSA9IG5hbWVzU3BsaXQuc2xpY2UoMCwgLTEpO1xuXHRcdGNvbnN0IG5hbWUgPSBuYW1lc1NwbGl0W25hbWVzU3BsaXQubGVuZ3RoIC0gMV07XG5cdFx0bGV0IG5hbWVzcGFjZUFsaWFzID0gbmFtZXNwYWNlW25hbWVzcGFjZS5sZW5ndGggLSAxXTtcblx0XHRpZiAocmV2ZXNlTmFtZXNwYWNlTWFwW25hbWVzcGFjZS5qb2luKFwiLlwiKV0pIHtcblx0XHRcdG5hbWVzcGFjZUFsaWFzID0gcmV2ZXNlTmFtZXNwYWNlTWFwW25hbWVzcGFjZS5qb2luKFwiLlwiKV07XG5cdFx0fVxuXHRcdGlmIChuYW1lc3BhY2VBbGlhcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRuYW1lc3BhY2VBbGlhcyA9IFwidGVzdFwiO1xuXHRcdH1cblx0XHRyZXR1cm4gbmFtZXNwYWNlQWxpYXM7XG5cdH1cblxuXHRmdW5jdGlvbiBnZXRUYWIodG9BZGQgPSAwKSB7XG5cdFx0bGV0IHRhYiA9IFwiXCI7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCB0YWJDb3VudCArIHRvQWRkOyBpKyspIHtcblx0XHRcdHRhYiArPSBcIlxcdFwiO1xuXHRcdH1cblx0XHRyZXR1cm4gdGFiO1xuXHR9XG5cdGNvbnN0IHNlcmlhbGl6ZURlbGVnYXRlID0ge1xuXHRcdHN0YXJ0OiBmdW5jdGlvbiAoY29udHJvbDogYW55LCBzQWdncmVnYXRpb25OYW1lOiBzdHJpbmcpIHtcblx0XHRcdGxldCBjb250cm9sRGV0YWlsID0gXCJcIjtcblx0XHRcdGlmIChzQWdncmVnYXRpb25OYW1lKSB7XG5cdFx0XHRcdGlmIChjb250cm9sLmdldFBhcmVudCgpKSB7XG5cdFx0XHRcdFx0Y29uc3QgaW5kZXhJblBhcmVudCA9IChjb250cm9sLmdldFBhcmVudCgpLmdldEFnZ3JlZ2F0aW9uKHNBZ2dyZWdhdGlvbk5hbWUpIGFzIE1hbmFnZWRPYmplY3RbXSk/LmluZGV4T2Y/Lihjb250cm9sKTtcblx0XHRcdFx0XHRpZiAoaW5kZXhJblBhcmVudCA+IDApIHtcblx0XHRcdFx0XHRcdGNvbnRyb2xEZXRhaWwgKz0gYFxcbiR7Z2V0VGFiKCl9YDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGNvbnN0IG5hbWVGdWxsID0gY29udHJvbC5nZXRNZXRhZGF0YSgpLmdldE5hbWUoKTtcblx0XHRcdGNvbnN0IG5hbWVzU3BsaXQgPSBuYW1lRnVsbC5zcGxpdChcIi5cIik7XG5cdFx0XHRjb25zdCBuYW1lID0gbmFtZXNTcGxpdFtuYW1lc1NwbGl0Lmxlbmd0aCAtIDFdO1xuXHRcdFx0Y29uc3QgbmFtZXNwYWNlQWxpYXMgPSBnZXROYW1lc3BhY2VBbGlhcyhuYW1lRnVsbCk7XG5cdFx0XHRjb250cm9sRGV0YWlsICs9IGA8JHtuYW1lc3BhY2VBbGlhc306JHtuYW1lfVxcbmA7XG5cdFx0XHRpZiAoIWRlZmluZWROYW1lc3BhY2VzW25hbWVzcGFjZUFsaWFzXSkge1xuXHRcdFx0XHRkZWZpbmVkTmFtZXNwYWNlc1tuYW1lc3BhY2VBbGlhc10gPSB0cnVlO1xuXHRcdFx0XHRjb250cm9sRGV0YWlsICs9IGAke2dldFRhYigpfXhtbG5zOiR7bmFtZXNwYWNlQWxpYXN9PVwiJHtuYW1lU3BhY2VNYXBbbmFtZXNwYWNlQWxpYXNdfVwiYDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBjb250cm9sRGV0YWlsO1xuXHRcdH0sXG5cdFx0ZW5kOiBmdW5jdGlvbiAoY29udHJvbDogYW55KSB7XG5cdFx0XHRjb25zdCBuYW1lRnVsbCA9IGNvbnRyb2wuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCk7XG5cdFx0XHRjb25zdCBuYW1lc1NwbGl0ID0gbmFtZUZ1bGwuc3BsaXQoXCIuXCIpO1xuXHRcdFx0Y29uc3QgbmFtZSA9IG5hbWVzU3BsaXRbbmFtZXNTcGxpdC5sZW5ndGggLSAxXTtcblx0XHRcdGNvbnN0IG5hbWVzcGFjZUFsaWFzID0gZ2V0TmFtZXNwYWNlQWxpYXMobmFtZUZ1bGwpO1xuXHRcdFx0bGV0IGhhc0FnZ3JlZ2F0aW9uID0gZmFsc2U7XG5cdFx0XHRmb3IgKGNvbnN0IG1BZ2dyZWdhdGlvbnNLZXkgaW4gY29udHJvbC5tQWdncmVnYXRpb25zKSB7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHQoIUFycmF5LmlzQXJyYXkoY29udHJvbC5tQWdncmVnYXRpb25zW21BZ2dyZWdhdGlvbnNLZXldKSAmJlxuXHRcdFx0XHRcdFx0Y29udHJvbC5tQWdncmVnYXRpb25zW21BZ2dyZWdhdGlvbnNLZXldICE9PSBudWxsICYmXG5cdFx0XHRcdFx0XHRjb250cm9sLm1BZ2dyZWdhdGlvbnNbbUFnZ3JlZ2F0aW9uc0tleV0gIT09IHVuZGVmaW5lZCkgfHxcblx0XHRcdFx0XHQoQXJyYXkuaXNBcnJheShjb250cm9sLm1BZ2dyZWdhdGlvbnNbbUFnZ3JlZ2F0aW9uc0tleV0pICYmIGNvbnRyb2wubUFnZ3JlZ2F0aW9uc1ttQWdncmVnYXRpb25zS2V5XS5sZW5ndGggPiAwKVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRoYXNBZ2dyZWdhdGlvbiA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChoYXNBZ2dyZWdhdGlvbikge1xuXHRcdFx0XHRyZXR1cm4gYDwvJHtuYW1lc3BhY2VBbGlhc306JHtuYW1lfT5gO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIGAvPmA7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRtaWRkbGU6IGZ1bmN0aW9uIChjb250cm9sOiBhbnkpIHtcblx0XHRcdGxldCBpZCA9IGNvbnRyb2wuZ2V0SWQoKTtcblx0XHRcdGlkID0gdHlwZW9mIGlkID09PSBcInN0cmluZ1wiID8gaWQ/LnJlcGxhY2U/LihDT05UUk9MSUQsIFwiaWRcIikgOiBpZDtcblx0XHRcdGxldCBkYXRhID0gXCJcIjtcblx0XHRcdGlmICghTWFuYWdlZE9iamVjdE1ldGFkYXRhLmlzR2VuZXJhdGVkSWQoaWQpKSB7XG5cdFx0XHRcdGRhdGEgPSBgaWQ9XCIke2lkfVwiYDtcblx0XHRcdH1cblx0XHRcdGxldCBrZXlzID0gT2JqZWN0LmtleXMoY29udHJvbC5tUHJvcGVydGllcylcblx0XHRcdFx0LmNvbmNhdChPYmplY3Qua2V5cyhjb250cm9sLm1CaW5kaW5nSW5mb3MpKVxuXHRcdFx0XHQuY29uY2F0KE9iamVjdC5rZXlzKGNvbnRyb2wubUFzc29jaWF0aW9ucykpXG5cdFx0XHRcdC5jb25jYXQoT2JqZWN0LmtleXMoY29udHJvbC5tRXZlbnRSZWdpc3RyeSkpO1xuXHRcdFx0a2V5cyA9IGtleXMuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKTtcblx0XHRcdGNvbnN0IHVuaXF1ZUtleXMgPSBuZXcgU2V0KGtleXMpO1xuXHRcdFx0a2V5cyA9IEFycmF5LmZyb20odW5pcXVlS2V5cyk7XG5cdFx0XHRmb3IgKGNvbnN0IG9Db250cm9sS2V5IG9mIGtleXMpIHtcblx0XHRcdFx0aWYgKGNvbnRyb2wubUJpbmRpbmdJbmZvcy5oYXNPd25Qcm9wZXJ0eShvQ29udHJvbEtleSkpIHtcblx0XHRcdFx0XHRjb25zdCBiaW5kaW5nRGV0YWlsID0geyAuLi5jb250cm9sLm1CaW5kaW5nSW5mb3Nbb0NvbnRyb2xLZXldIH07XG5cdFx0XHRcdFx0aWYgKGJpbmRpbmdEZXRhaWwuYmluZGluZ1N0cmluZykge1xuXHRcdFx0XHRcdFx0ZGF0YSArPSBgXFxuJHtnZXRUYWIoKX0ke29Db250cm9sS2V5fT1cIiR7YmluZGluZ0RldGFpbC5iaW5kaW5nU3RyaW5nLnJlcGxhY2UoXCI+XCIsIFwiJmd0O1wiKX1cImA7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGlmIChiaW5kaW5nRGV0YWlsLnR5cGU/Lm9PdXRwdXRGb3JtYXQpIHtcblx0XHRcdFx0XHRcdFx0ZGVsZXRlIGJpbmRpbmdEZXRhaWwudHlwZS5vT3V0cHV0Rm9ybWF0O1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAoYmluZGluZ0RldGFpbC5iaW5kaW5nKSB7XG5cdFx0XHRcdFx0XHRcdGRlbGV0ZSBiaW5kaW5nRGV0YWlsLmJpbmRpbmc7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoYmluZGluZ0RldGFpbC50ZW1wbGF0ZSkge1xuXHRcdFx0XHRcdFx0XHRkZWxldGUgYmluZGluZ0RldGFpbC50ZW1wbGF0ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGRhdGEgKz0gYFxcbiR7Z2V0VGFiKCl9JHtvQ29udHJvbEtleX09JyR7SlNPTi5zdHJpbmdpZnkoYmluZGluZ0RldGFpbCl9J2A7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKGNvbnRyb2wubVByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkob0NvbnRyb2xLZXkpICYmIGNvbnRyb2wubVByb3BlcnRpZXNbb0NvbnRyb2xLZXldICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRsZXQgcHJvcGVydHlWYWx1ZSA9IGNvbnRyb2wubVByb3BlcnRpZXNbb0NvbnRyb2xLZXldO1xuXHRcdFx0XHRcdHByb3BlcnR5VmFsdWUgPSB0eXBlb2YgcHJvcGVydHlWYWx1ZSA9PT0gXCJzdHJpbmdcIiA/IHByb3BlcnR5VmFsdWU/LnJlcGxhY2U/LihVSUQsIFwidWlkLS1pZFwiKSA6IHByb3BlcnR5VmFsdWU7XG5cdFx0XHRcdFx0cHJvcGVydHlWYWx1ZSA9IHR5cGVvZiBwcm9wZXJ0eVZhbHVlID09PSBcInN0cmluZ1wiID8gcHJvcGVydHlWYWx1ZT8ucmVwbGFjZT8uKENPTlRST0xJRCwgXCJpZFwiKSA6IHByb3BlcnR5VmFsdWU7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdHByb3BlcnR5VmFsdWUgPSB0eXBlb2YgcHJvcGVydHlWYWx1ZSA9PT0gXCJvYmplY3RcIiA/IEpTT04uc3RyaW5naWZ5KHByb3BlcnR5VmFsdWUpIDogcHJvcGVydHlWYWx1ZTtcblx0XHRcdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdFx0XHQvLyBTdHJpbmdpZnkgbWF5IGZhaWwgZm9yIGNpcmN1bGFyIHJlZmVyZW5jZXMgYnV0IGl0J3Mgbm90IHRoZSBlbmQgb2YgdGhlIHdvcmxkXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0ZGF0YSArPSBgXFxuJHtnZXRUYWIoKX0gJHtvQ29udHJvbEtleX09XCIke3Byb3BlcnR5VmFsdWV9XCJgO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGNvbnRyb2wubUFzc29jaWF0aW9ucy5oYXNPd25Qcm9wZXJ0eShvQ29udHJvbEtleSkpIHtcblx0XHRcdFx0XHRsZXQgYXNzb2NpYXRpb25WYWx1ZSA9IGNvbnRyb2wubUFzc29jaWF0aW9uc1tvQ29udHJvbEtleV07XG5cdFx0XHRcdFx0aWYgKCFBcnJheS5pc0FycmF5KGFzc29jaWF0aW9uVmFsdWUpKSB7XG5cdFx0XHRcdFx0XHRhc3NvY2lhdGlvblZhbHVlID0gW2Fzc29jaWF0aW9uVmFsdWVdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRhc3NvY2lhdGlvblZhbHVlID0gYXNzb2NpYXRpb25WYWx1ZS5tYXAoKGFzc29jaWF0aW9uVmFsdWVFbGVtZW50OiBzdHJpbmcpID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiB0eXBlb2YgYXNzb2NpYXRpb25WYWx1ZUVsZW1lbnQgPT09IFwic3RyaW5nXCJcblx0XHRcdFx0XHRcdFx0PyBhc3NvY2lhdGlvblZhbHVlRWxlbWVudD8ucmVwbGFjZT8uKENPTlRST0xJRCwgXCJpZFwiKVxuXHRcdFx0XHRcdFx0XHQ6IGFzc29jaWF0aW9uVmFsdWVFbGVtZW50O1xuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0ZGF0YSArPSBgXFxuJHtnZXRUYWIoKX0gJHtvQ29udHJvbEtleX09XCIkeyhhc3NvY2lhdGlvblZhbHVlPy5qb2luPy4oXCIsXCIpID8/IGFzc29jaWF0aW9uVmFsdWUpIHx8IHVuZGVmaW5lZH1cImA7XG5cdFx0XHRcdH0gZWxzZSBpZiAoY29udHJvbC5tRXZlbnRSZWdpc3RyeS5oYXNPd25Qcm9wZXJ0eShvQ29udHJvbEtleSkpIHtcblx0XHRcdFx0XHRpZiAoY29udHJvbC5tRXZlbnRSZWdpc3RyeVtvQ29udHJvbEtleV1bMF0/LmZGdW5jdGlvbj8ubmFtZSkge1xuXHRcdFx0XHRcdFx0ZGF0YSArPSBgXFxuJHtnZXRUYWIoKX0gJHtvQ29udHJvbEtleX09XCIke2NvbnRyb2wubUV2ZW50UmVnaXN0cnlbb0NvbnRyb2xLZXldWzBdPy5mRnVuY3Rpb24/Lm5hbWV9XCJgO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRkYXRhICs9IGBcXG4ke2dldFRhYigpfSAke29Db250cm9sS2V5fT1cInNvbWVFdmVudEhhbmRsZXJcImA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoc2hvd0N1c3RvbVN0eWxlQ2xhc3NlcyAmJiBjb250cm9sLmFDdXN0b21TdHlsZUNsYXNzZXM/Lmxlbmd0aCA+IDApIHtcblx0XHRcdFx0ZGF0YSArPSBgXFxuJHtnZXRUYWIoKX0gY3VzdG9tU3R5bGVDbGFzc2VzIDogJHtjb250cm9sLmFDdXN0b21TdHlsZUNsYXNzZXMuam9pbihcIiwgXCIpfWA7XG5cdFx0XHR9XG5cdFx0XHRkYXRhICs9IGBcXG5gO1xuXHRcdFx0bGV0IGhhc0FnZ3JlZ2F0aW9uID0gZmFsc2U7XG5cdFx0XHRmb3IgKGNvbnN0IG1BZ2dyZWdhdGlvbnNLZXkgaW4gY29udHJvbC5tQWdncmVnYXRpb25zKSB7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHQoIUFycmF5LmlzQXJyYXkoY29udHJvbC5tQWdncmVnYXRpb25zW21BZ2dyZWdhdGlvbnNLZXldKSAmJlxuXHRcdFx0XHRcdFx0Y29udHJvbC5tQWdncmVnYXRpb25zW21BZ2dyZWdhdGlvbnNLZXldICE9PSBudWxsICYmXG5cdFx0XHRcdFx0XHRjb250cm9sLm1BZ2dyZWdhdGlvbnNbbUFnZ3JlZ2F0aW9uc0tleV0gIT09IHVuZGVmaW5lZCkgfHxcblx0XHRcdFx0XHQoQXJyYXkuaXNBcnJheShjb250cm9sLm1BZ2dyZWdhdGlvbnNbbUFnZ3JlZ2F0aW9uc0tleV0pICYmIGNvbnRyb2wubUFnZ3JlZ2F0aW9uc1ttQWdncmVnYXRpb25zS2V5XS5sZW5ndGggPiAwKVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRoYXNBZ2dyZWdhdGlvbiA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmIChoYXNBZ2dyZWdhdGlvbikge1xuXHRcdFx0XHRkYXRhICs9IFwiPlwiO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0fSxcblx0XHRzdGFydEFnZ3JlZ2F0aW9uOiBmdW5jdGlvbiAoY29udHJvbDogYW55LCBzTmFtZTogc3RyaW5nKSB7XG5cdFx0XHRjb25zdCBuYW1lc3BhY2VBbGlhcyA9IGdldE5hbWVzcGFjZUFsaWFzKGNvbnRyb2wuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCkpO1xuXHRcdFx0bGV0IG91dCA9IGBcXG4ke2dldFRhYigpfTwke25hbWVzcGFjZUFsaWFzfToke3NOYW1lfT5gO1xuXHRcdFx0dGFiQ291bnQrKztcblx0XHRcdG91dCArPSBgXFxuJHtnZXRUYWIoKX1gO1xuXHRcdFx0cmV0dXJuIG91dDtcblx0XHR9LFxuXHRcdGVuZEFnZ3JlZ2F0aW9uOiBmdW5jdGlvbiAoY29udHJvbDogYW55LCBzTmFtZTogc3RyaW5nKSB7XG5cdFx0XHR0YWJDb3VudC0tO1xuXHRcdFx0Y29uc3QgbmFtZXNwYWNlQWxpYXMgPSBnZXROYW1lc3BhY2VBbGlhcyhjb250cm9sLmdldE1ldGFkYXRhKCkuZ2V0TmFtZSgpKTtcblx0XHRcdGlmIChjb250cm9sLm1CaW5kaW5nSW5mb3Nbc05hbWVdKSB7XG5cdFx0XHRcdHJldHVybiBgXFxuJHtnZXRUYWIoKX08LyR7bmFtZXNwYWNlQWxpYXN9OiR7c05hbWV9PlxcbmA7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gYFxcbiR7Z2V0VGFiKCl9PC8ke25hbWVzcGFjZUFsaWFzfToke3NOYW1lfT5cXG5gO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0bGV0IG91dFhNTDtcblx0aWYgKEFycmF5LmlzQXJyYXkoY29udHJvbFRvU2VyaWFsaXplKSkge1xuXHRcdG91dFhNTCA9IGNvbnRyb2xUb1NlcmlhbGl6ZS5tYXAoKGNvbnRyb2xUb1JlbmRlcjogVUk1RWxlbWVudCkgPT4ge1xuXHRcdFx0cmV0dXJuIG5ldyBTZXJpYWxpemVyKGNvbnRyb2xUb1JlbmRlciwgc2VyaWFsaXplRGVsZWdhdGUpLnNlcmlhbGl6ZSgpO1xuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdG91dFhNTCA9IG5ldyBTZXJpYWxpemVyKGNvbnRyb2xUb1NlcmlhbGl6ZSwgc2VyaWFsaXplRGVsZWdhdGUpLnNlcmlhbGl6ZSgpO1xuXHR9XG5cdHJldHVybiBmb3JtYXRYTUwoYDxyb290PiR7b3V0WE1MfTwvcm9vdD5gKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUF3YWl0ZXIoKSB7XG5cdGxldCBmblJlc29sdmUhOiBGdW5jdGlvbjtcblx0Y29uc3QgbXlQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcblx0XHRmblJlc29sdmUgPSByZXNvbHZlO1xuXHR9KTtcblx0cmV0dXJuIHsgcHJvbWlzZTogbXlQcm9taXNlLCByZXNvbHZlOiBmblJlc29sdmUgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckJ1aWxkaW5nQmxvY2tXaXRoTW9kZWxzKGJ1aWxkaW5nQmxvY2s6IHsgZ2V0Q29udGVudDogRnVuY3Rpb24gfSwgbW9kZWxzOiB7IFtrZXk6IHN0cmluZ106IE1vZGVsIH0pOiBDb250cm9sIHtcblx0cmV0dXJuIChNYW5hZ2VkT2JqZWN0IGFzIE1hbmFnZWRPYmplY3RFeCkucnVuV2l0aFByZXByb2Nlc3NvcnMoXG5cdFx0KCkgPT4ge1xuXHRcdFx0cmV0dXJuIGJ1aWxkaW5nQmxvY2suZ2V0Q29udGVudCgpO1xuXHRcdH0sXG5cdFx0e1xuXHRcdFx0c2V0dGluZ3M6IGZ1bmN0aW9uIChjb250cm9sU2V0dGluZ3M6IHsgbW9kZWxzOiB1bmtub3duIH0pIHtcblx0XHRcdFx0Y29udHJvbFNldHRpbmdzLm1vZGVscyA9IG1vZGVscztcblx0XHRcdFx0cmV0dXJuIGNvbnRyb2xTZXR0aW5ncztcblx0XHRcdH1cblx0XHR9XG5cdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3Rlck1vY2tGcmFnbWVudHMoLi4uZnJhZ21lbnRzOiBNb2NrRnJhZ21lbnRbXSk6IGplc3QuU3B5SW5zdGFuY2Uge1xuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuXHRjb25zdCBvcmlnaW5hbExvYWRUZW1wbGF0ZSA9IChYTUxUZW1wbGF0ZVByb2Nlc3NvciBhcyBhbnkpLmxvYWRUZW1wbGF0ZVByb21pc2U7XG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5cdGNvbnN0IGxvYWRUZW1wbGF0ZVN0dWIgPSBqZXN0LnNweU9uKFhNTFRlbXBsYXRlUHJvY2Vzc29yIGFzIGFueSwgXCJsb2FkVGVtcGxhdGVQcm9taXNlXCIpO1xuXHRsb2FkVGVtcGxhdGVTdHViLm1vY2tJbXBsZW1lbnRhdGlvbigoKHRlbXBsYXRlTmFtZTogc3RyaW5nLCBleHRlbnNpb246IHN0cmluZykgPT4ge1xuXHRcdGZvciAoY29uc3QgZnJhZ21lbnQgb2YgZnJhZ21lbnRzKSB7XG5cdFx0XHRpZiAoZnJhZ21lbnQubmFtZSA9PT0gdGVtcGxhdGVOYW1lKSB7XG5cdFx0XHRcdHJldHVybiBwYXJzZVhNTFN0cmluZyhmcmFnbWVudC5jb250ZW50KVswXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG9yaWdpbmFsTG9hZFRlbXBsYXRlKHRlbXBsYXRlTmFtZSwgZXh0ZW5zaW9uKTtcblx0fSkgYXMgKCgpID0+IEVsZW1lbnQpIHwgdW5kZWZpbmVkKTtcblx0cmV0dXJuIGxvYWRUZW1wbGF0ZVN0dWI7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBhbiBhcHBDb21wb25lbnQgYW5kIHRlbXBsYXRlQ29tcG9uZW50IHdpdGggdGhlIGdpdmVuIG9wdGlvbnMuXG4gKiBAcGFyYW0gb3B0aW9uc1xuICogQHBhcmFtIG9wdGlvbnMuY2RzRmlsZSBUaGUgcGF0aCB0byB0aGUgQ0RTIGZpbGUgdG8gdXNlIGZvciB0aGUgYXBwQ29tcG9uZW50XG4gKiBAcGFyYW0gb3B0aW9ucy5tYWluQ29udGV4dFBhdGggVGhlIG1haW4gY29udGV4dCBwYXRoIHRvIHVzZSBmb3IgdGhlIGFwcENvbXBvbmVudFxuICogQHBhcmFtIG9wdGlvbnMucGFnZUNvbnRlbnQgVGhlIHBhZ2UgY29udGVudCB0byB1c2UgZm9yIHRoZSBhcHBDb21wb25lbnRcbiAqIEBwYXJhbSBvcHRpb25zLmNvbnRlbnQgVGhlIGNvbnRlbnQgdG8gdXNlIGZvciB0aGUgYXBwIENvbXBvbmVudFxuICogQHBhcmFtIG9wdGlvbnMuY29tcG9uZW50SWRcbiAqIEBwYXJhbSBvcHRpb25zLm1hbmlmZXN0U2V0dGluZ3NcbiAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIHRvIHVzZSBmb3IgdGhlIGFwcENvbXBvbmVudFxuICogQHBhcmFtIHZpZXdMZXZlbCBUaGUgdmlldyBsZXZlbCB0byB1c2UgZm9yIHRoZSBhcHBDb21wb25lbnRcbiAqIEByZXR1cm5zIFRoZSBhcHBjb21wb25lbnQgYW5kIHRlbXBsYXRlQ29tcG9uZW50IHRvIHVzZSBmb3IgdGVzdGluZ1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5pdGlhbGl6ZUFwcENvbXBvbmVudChcblx0b3B0aW9ucz86IHtcblx0XHRjZHNGaWxlPzogc3RyaW5nO1xuXHRcdGNvbXBvbmVudElkPzogc3RyaW5nO1xuXHRcdG1haW5Db250ZXh0UGF0aD86IHN0cmluZztcblx0XHRwYWdlQ29udGVudD86IEZ1bmN0aW9uO1xuXHRcdG1hbmlmZXN0U2V0dGluZ3M/OiBQYXJ0aWFsPExpc3RSZXBvcnRNYW5pZmVzdFNldHRpbmdzIHwgT2JqZWN0UGFnZU1hbmlmZXN0U2V0dGluZ3M+O1xuXHRcdGZlTWFuaWZlc3RTZXR0aW5ncz86IFBhcnRpYWw8TWFuaWZlc3RDb250ZW50W1wic2FwLmZlXCJdPjtcblx0XHRjb250ZW50PzogUGFydGlhbDxMaXN0UmVwb3J0TWFuaWZlc3RTZXR0aW5nc1tcImNvbnRlbnRcIl0gfCBPYmplY3RQYWdlTWFuaWZlc3RTZXR0aW5nc1tcImNvbnRlbnRcIl0+O1xuXHR9LFxuXHRuYW1lPzogc3RyaW5nLFxuXHR2aWV3TGV2ZWw/OiBudW1iZXJcbik6IFByb21pc2U8eyBhcHBDb21wb25lbnQ6IEFwcENvbXBvbmVudDsgdGVtcGxhdGVDb21wb25lbnQ6IFRlbXBsYXRlQ29tcG9uZW50IH0+IHtcblx0bGV0IGNkc0ZpbGUgPSBvcHRpb25zPy5jZHNGaWxlO1xuXHRpZiAoIWNkc0ZpbGUpIHtcblx0XHRjZHNGaWxlID0gY29tcGlsZUNEUyhwYXRoLmpvaW4oX19kaXJuYW1lLCBcIi4vZGF0YS9Qcm9kdWN0cy5jZHNcIikpO1xuXHR9XG5cdGNvbnN0IGd1aWQgPSB1aWQoKTtcblx0Y29uc3QgaWQgPSBvcHRpb25zPy5jb21wb25lbnRJZCA/PyBgc2FwLmZlLnRlc3QuJHtndWlkfWA7XG5cdGNvbnN0IGNkc0NvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoY2RzRmlsZSkudG9TdHJpbmcoKTtcblx0c2FwLmplc3QucmVnaXN0ZXJGYWtlRnJhZ21lbnQoYC9zYXAvZmUvY29yZS9tb2NrLyR7Z3VpZH0vJG1ldGFkYXRhP3NhcC1sYW5ndWFnZT1FTmAsIGNkc0NvbnRlbnQpO1xuXHRjbGFzcyBEZWZhdWx0UGFnZUNvbnRlbnQgZXh0ZW5kcyBQYWdlQ29udHJvbGxlciB7XG5cdFx0cmVuZGVyKCkge1xuXHRcdFx0cmV0dXJuIDxQYWdlPjwvUGFnZT47XG5cdFx0fVxuXHR9XG5cdHNhcC51aS5kZWZpbmUoYHNhcC9mZS90ZXN0LyR7Z3VpZH0vQ29tcG9uZW50YCwgW1wic2FwL2ZlL2NvcmUvQXBwQ29tcG9uZW50XCJdLCBmdW5jdGlvbiAoX0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50KSB7XG5cdFx0XCJ1c2Ugc3RyaWN0XCI7XG5cblx0XHRyZXR1cm4gQXBwQ29tcG9uZW50LmV4dGVuZChgc2FwLmZlLnRlc3QuJHtndWlkfS5Db21wb25lbnRgLCB7XG5cdFx0XHRtZXRhZGF0YToge1xuXHRcdFx0XHRtYW5pZmVzdDoge1xuXHRcdFx0XHRcdFwic2FwLmFwcFwiOiB7XG5cdFx0XHRcdFx0XHRpZDogYHRlc3Qke2d1aWR9YCxcblx0XHRcdFx0XHRcdGRhdGFTb3VyY2VzOiB7XG5cdFx0XHRcdFx0XHRcdG1haW5TZXJ2aWNlOiB7XG5cdFx0XHRcdFx0XHRcdFx0dXJpOiBgL3NhcC9mZS9jb3JlL21vY2svJHtndWlkfS9gLFxuXHRcdFx0XHRcdFx0XHRcdHR5cGU6IFwiT0RhdGFcIixcblx0XHRcdFx0XHRcdFx0XHRzZXR0aW5nczoge1xuXHRcdFx0XHRcdFx0XHRcdFx0b2RhdGFWZXJzaW9uOiBcIjQuMFwiXG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcInNhcC51aTVcIjoge1xuXHRcdFx0XHRcdFx0bW9kZWxzOiB7XG5cdFx0XHRcdFx0XHRcdFwiXCI6IHtcblx0XHRcdFx0XHRcdFx0XHRkYXRhU291cmNlOiBcIm1haW5TZXJ2aWNlXCIsXG5cdFx0XHRcdFx0XHRcdFx0c2V0dGluZ3M6IHt9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRyb3V0aW5nOiB7XG5cdFx0XHRcdFx0XHRcdHRhcmdldHM6IHtcblx0XHRcdFx0XHRcdFx0XHREZWZhdWx0OiB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0eXBlOiBcIkNvbXBvbmVudFwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0bmFtZTogbmFtZSA/PyBcInNhcC5mZS5jb3JlLmZwbVwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0aWQ6IFwiRGVmYXVsdFwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0dmlld0xldmVsOiB2aWV3TGV2ZWwsXG5cdFx0XHRcdFx0XHRcdFx0XHRvcHRpb25zOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHNldHRpbmdzOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Li4uKG9wdGlvbnM/Lm1hbmlmZXN0U2V0dGluZ3MgPz8ge30pLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnRleHRQYXRoOiBvcHRpb25zPy5tYWluQ29udGV4dFBhdGggPz8gXCIvUHJvZHVjdHNcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2aWV3VHlwZTogXCJKU1hcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2aWV3Q29udGVudDogb3B0aW9ucz8ucGFnZUNvbnRlbnQgPz8gRGVmYXVsdFBhZ2VDb250ZW50LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnRlbnQ6IG9wdGlvbnM/LmNvbnRlbnRcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0cm91dGVzOiBbXG5cdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0cGF0dGVybjogXCI6P3F1ZXJ5OlwiLFxuXHRcdFx0XHRcdFx0XHRcdFx0bmFtZTogXCJEZWZhdWx0XCIsXG5cdFx0XHRcdFx0XHRcdFx0XHR0YXJnZXQ6IFwiRGVmYXVsdFwiXG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcInNhcC5mZVwiOiBvcHRpb25zPy5mZU1hbmlmZXN0U2V0dGluZ3MgPz8ge31cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0pO1xuXHR9KTtcblx0Y29uc3QgbW9ja0FwcENvbXBvbmVudCA9IChhd2FpdCBDb21wb25lbnQuY3JlYXRlKHsgbmFtZTogYHNhcC5mZS50ZXN0LiR7Z3VpZH1gLCBpZDogaWQgfSkpIGFzIEFwcENvbXBvbmVudDtcblxuXHRhd2FpdCBtb2NrQXBwQ29tcG9uZW50LmluaXRpYWxpemVkO1xuXHRjb25zdCB2ID0gYXdhaXQgKG1vY2tBcHBDb21wb25lbnQuZ2V0Um91dGVyKCkuZ2V0VGFyZ2V0KFwiRGVmYXVsdFwiKSBhcyB7IGxvYWQ/OiBGdW5jdGlvbiB9KS5sb2FkPy4oKTtcblx0cmV0dXJuIHsgYXBwQ29tcG9uZW50OiBtb2NrQXBwQ29tcG9uZW50LCB0ZW1wbGF0ZUNvbXBvbmVudDogdi5vYmplY3QgfTtcbn1cblxuLyoqXG4gKiBGaW5kIGFuIGVsZW1lbnQgaW4gYSBjb2xsZWN0aW9uIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gc2VsZWN0b3IuXG4gKiBAcGFyYW0gY29sbGVjdGlvblxuICogQHBhcmFtIHNlbGVjdG9yXG4gKiBAcmV0dXJucyBUaGUgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIHNlbGVjdG9yIG9yIHVuZGVmaW5lZCBpZiBubyBlbGVtZW50IG1hdGNoZXMgdGhlIHNlbGVjdG9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRWxlbWVudChjb2xsZWN0aW9uOiBIVE1MQ29sbGVjdGlvbiwgc2VsZWN0b3I6IChlbGVtZW50OiBIVE1MRWxlbWVudCkgPT4gYm9vbGVhbik6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkIHtcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBjb2xsZWN0aW9uLmxlbmd0aDsgaSsrKSB7XG5cdFx0Y29uc3QgZWxlbWVudCA9IGNvbGxlY3Rpb24uaXRlbShpKSBhcyBIVE1MRWxlbWVudDtcblx0XHRpZiAoc2VsZWN0b3IoZWxlbWVudCkpIHtcblx0XHRcdHJldHVybiBlbGVtZW50O1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFdhaXQgZm9yIGFuIGV2ZW50IHRvIGJlIHJlc29sdmVkIGJlZm9yZSBjb250aW51aW5nLlxuICogQHBhcmFtIGNvbnRyb2xcbiAqIEBwYXJhbSBldmVudE5hbWVcbiAqIEByZXR1cm5zIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGV2ZW50IGlzIHJlY2VpdmVkXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3YWl0Rm9yRXZlbnQoY29udHJvbDogRXZlbnRQcm92aWRlciwgZXZlbnROYW1lOiBzdHJpbmcpOiBQcm9taXNlPEV2ZW50PiB7XG5cdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXHRcdGNvbnRyb2wuYXR0YWNoRXZlbnRPbmNlKGV2ZW50TmFtZSwgKGV2ZW50OiBFdmVudCkgPT4ge1xuXHRcdFx0cmVzb2x2ZShldmVudCk7XG5cdFx0fSk7XG5cdH0pO1xufVxuXG4vKipcbiAqIFRlbGwgdGhlIGJpbmRpbmcgcGFyc2VyIHRvIGtlZXAgdGhlIGJpbmRpbmcgc3RyaW5ncyBmb3IgdGVzdGluZy5cbiAqIEBwYXJhbSBlbmFibGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBrZWVwQmluZGluZ1N0cmluZ0ZvclRlc3QoZW5hYmxlZDogYm9vbGVhbik6IHZvaWQge1xuXHRCaW5kaW5nUGFyc2VyLl9rZWVwQmluZGluZ1N0cmluZ3MgPSBlbmFibGVkO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0VBeUVBQSxHQUFHLENBQUNDLFFBQVEsQ0FBQyxDQUFDLEVBQVMsa0NBQWtDLENBQUM7RUFDMURDLElBQUksQ0FBQ0MsVUFBVSxDQUFDLEtBQUssQ0FBQztFQUV0QixNQUFNQyxZQUFvQyxHQUFHO0lBQzVDQyxLQUFLLEVBQUUsZUFBZTtJQUN0QkMsTUFBTSxFQUFFLGVBQWU7SUFDdkJDLElBQUksRUFBRSx1Q0FBdUM7SUFDN0NDLFVBQVUsRUFBRSxxQkFBcUI7SUFDakNDLFNBQVMsRUFBRSxrRUFBa0U7SUFDN0VDLEdBQUcsRUFBRSxrRUFBa0U7SUFDdkVDLFVBQVUsRUFBRSxrRUFBa0U7SUFDOUVDLE9BQU8sRUFBRSxzQkFBc0I7SUFDL0JDLFFBQVEsRUFBRSx3QkFBd0I7SUFDbENDLElBQUksRUFBRSxhQUFhO0lBQ25CQyxFQUFFLEVBQUUsV0FBVztJQUNmQyxDQUFDLEVBQUUsT0FBTztJQUNWQyxDQUFDLEVBQUUsb0JBQW9CO0lBQ3ZCQyxFQUFFLEVBQUUsV0FBVztJQUNmQyxhQUFhLEVBQUUsd0JBQXdCO0lBQ3ZDQyxHQUFHLEVBQUUsWUFBWTtJQUNqQkMsYUFBYSxFQUFFLDBCQUEwQjtJQUN6Q0MsUUFBUSxFQUFF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
@@ -16,6 +16,7 @@ import TemplateModel from "sap/fe/core/TemplateModel";
16
16
  import { parseXMLString } from "sap/fe/core/buildingBlocks/templating/BuildingBlockTemplateProcessor";
17
17
  import ConverterContext from "sap/fe/core/converters/ConverterContext";
18
18
  import type { ListReportManifestSettings, ObjectPageManifestSettings } from "sap/fe/core/converters/ManifestSettings";
19
+ import ManifestWrapper from "sap/fe/core/converters/ManifestWrapper";
19
20
  import { convertTypes, getInvolvedDataModelObjects } from "sap/fe/core/converters/MetaModelConverter";
20
21
  import type { IDiagnostics, PageContextPathTarget } from "sap/fe/core/converters/TemplateConverter";
21
22
  import type { IssueCategory, IssueSeverity } from "sap/fe/core/converters/helpers/IssueManager";
@@ -32,6 +33,7 @@ import ManagedObjectMetadata from "sap/ui/base/ManagedObjectMetadata";
32
33
  import Component from "sap/ui/core/Component";
33
34
  import type UI5Element from "sap/ui/core/Element";
34
35
  import InvisibleText from "sap/ui/core/InvisibleText";
36
+ import type { ManifestContent } from "sap/ui/core/Manifest";
35
37
  import XMLTemplateProcessor from "sap/ui/core/XMLTemplateProcessor";
36
38
  import XMLPreprocessor from "sap/ui/core/util/XMLPreprocessor";
37
39
  import Serializer from "sap/ui/core/util/serializer/Serializer";
@@ -476,7 +478,12 @@ export const getConverterContextForTest = function (
476
478
  const dataModelPath = manifestSettings.contextPath
477
479
  ? getInvolvedDataModelObjects<PageContextPathTarget>(metaModel.createBindingContext(manifestSettings.contextPath) as Context)
478
480
  : getInvolvedDataModelObjects<PageContextPathTarget>(metaModel.createBindingContext(`/${manifestSettings.entitySet}`));
479
- return new ConverterContext<PageContextPathTarget>(convertedTypes, manifestSettings, getFakeDiagnostics(), merge, dataModelPath);
481
+ return new ConverterContext<PageContextPathTarget>(
482
+ convertedTypes,
483
+ new ManifestWrapper(manifestSettings, merge),
484
+ getFakeDiagnostics(),
485
+ dataModelPath
486
+ );
480
487
  };
481
488
  const metaModelCache: any = {};
482
489
  export const getMetaModel = async function (sMetadataUrl: string) {
@@ -1082,7 +1089,8 @@ export async function initializeAppComponent(
1082
1089
  mainContextPath?: string;
1083
1090
  pageContent?: Function;
1084
1091
  manifestSettings?: Partial<ListReportManifestSettings | ObjectPageManifestSettings>;
1085
- content?: {};
1092
+ feManifestSettings?: Partial<ManifestContent["sap.fe"]>;
1093
+ content?: Partial<ListReportManifestSettings["content"] | ObjectPageManifestSettings["content"]>;
1086
1094
  },
1087
1095
  name?: string,
1088
1096
  viewLevel?: number
@@ -1151,7 +1159,8 @@ export async function initializeAppComponent(
1151
1159
  }
1152
1160
  ]
1153
1161
  }
1154
- }
1162
+ },
1163
+ "sap.fe": options?.feManifestSettings ?? {}
1155
1164
  }
1156
1165
  }
1157
1166
  });
@@ -9,6 +9,25 @@ sap.ui.define(
9
9
  function (OpaBuilder, Opa5, Utils, Press) {
10
10
  "use strict";
11
11
 
12
+ function hasTargetURL(shellControl, targetURL) {
13
+ var currentControl = shellControl,
14
+ targetFound = false;
15
+
16
+ do {
17
+ if (currentControl.getTargetURL) {
18
+ targetFound = currentControl.getTargetURL() === targetURL;
19
+ }
20
+ if (!targetFound) {
21
+ currentControl = currentControl.getParent();
22
+ }
23
+ } while (
24
+ !targetFound &&
25
+ !(currentControl.isA("sap.f.GridContainer") || currentControl.isA("sap.ushell.ui.launchpad.TileContainer"))
26
+ );
27
+
28
+ return targetFound;
29
+ }
30
+
12
31
  /**
13
32
  * Constructs a test page definition for the shell.
14
33
  * @class Provides a test page definition for the shell.
@@ -102,9 +121,9 @@ sap.ui.define(
102
121
  */
103
122
  iPressTile: function (sTarget) {
104
123
  return this.waitFor({
105
- controlType: "sap.ushell.ui.launchpad.VizInstanceCdm",
124
+ controlType: "sap.m.GenericTile",
106
125
  matchers: function (oTile) {
107
- return oTile.getTargetURL() === "#" + sTarget;
126
+ return hasTargetURL(oTile, "#" + sTarget);
108
127
  },
109
128
  actions: new Press(),
110
129
  success: function () {
@@ -176,9 +195,15 @@ sap.ui.define(
176
195
  },
177
196
  iShouldSeeTheAppTile: function (sTitle) {
178
197
  return OpaBuilder.create(this)
179
- .hasType("sap.ushell.ui.launchpad.VizInstanceCdm")
180
- .hasProperties({
181
- targetURL: sTitle
198
+ .hasType("sap.m.GenericTile")
199
+ .check(function (aTile) {
200
+ var targetFound = false;
201
+ aTile.forEach(function (oTile) {
202
+ if (hasTargetURL(oTile, sTitle)) {
203
+ targetFound = true;
204
+ }
205
+ });
206
+ return targetFound;
182
207
  })
183
208
  .description("Seeing Tile " + sTitle)
184
209
  .execute();
@@ -468,30 +468,26 @@ sap.ui.define(
468
468
  .description("Seeing Analytical Popover with title " + title)
469
469
  .execute();
470
470
  },
471
- iSeeListOfCurrenciesWithValues: function (listOfCurrencies) {
471
+ iSeeListOfCurrenciesWithValues: function (contentCurrenciesList) {
472
472
  return OpaBuilder.create(this)
473
- .hasType("sap.m.List")
474
- .check(function (aControls) {
475
- var customListItems = aControls[0] && aControls[0].getAggregation("items");
476
- var currency;
477
- var checkCurrencies = false;
478
- for (var i = 0; i < customListItems.length; customListItems++) {
479
- currency = customListItems[i].getContent()[0].getItems()[0];
480
- if (
481
- currency.getStringValue() === listOfCurrencies[i].stringValue &&
482
- currency.getCurrency() === listOfCurrencies[i].currency &&
483
- currency.getMaxPrecision() === listOfCurrencies[i].maxPrecision
484
- ) {
485
- checkCurrencies = true;
486
- } else {
487
- checkCurrencies = false;
488
- }
489
- }
490
- return checkCurrencies;
491
- }, true)
492
- .description("Seeing list of currencies")
473
+ .isDialogElement()
474
+ .hasType("sap.m.CustomListItem")
475
+ .hasChildren(
476
+ OpaBuilder.create(this)
477
+ .hasType("sap.m.Text")
478
+ .has(function (myObj) {
479
+ if (myObj.getText() === contentCurrenciesList) {
480
+ return true;
481
+ } else {
482
+ return false;
483
+ }
484
+ }),
485
+ false
486
+ )
487
+ .description("Checking content of currencies list: '" + contentCurrenciesList + "' is found")
493
488
  .execute();
494
489
  },
490
+
495
491
  iSeeQuickViewPopover: function () {
496
492
  return OpaBuilder.create(this)
497
493
  .hasType("sap.ui.mdc.link.Panel")
@@ -702,20 +702,18 @@ sap.ui.define(
702
702
  * @param {string | sap.fe.test.api.ColumnIdentifier | number} vColumnIdentifier The identifier of the column field, its label or index
703
703
  * @param {string} [sFieldLabel] The target field for sorting in case the field label differs from the column label or in case of a complex property
704
704
  * @param {boolean} [bDescending] Sorting (true=descending, false=ascending (default))
705
- * @param {boolean} [bClearFirst] Set to <code>true</code> to clear previously set sortings (default), otherwise all previously set sorting fields will be kept.
706
705
  * @returns {object} The result of the {@link sap.ui.test.Opa5#waitFor} function, to be used for chained statements
707
706
  * @public
708
707
  */
709
- Actions.prototype.iSortByColumn = function (vColumnIdentifier, sFieldLabel, bDescending, bClearFirst) {
708
+ Actions.prototype.iSortByColumn = function (vColumnIdentifier, sFieldLabel, bDescending) {
710
709
  var oTableBuilder = this.getBuilder(),
711
710
  vColumn = Utils.isOfType(vColumnIdentifier, Object) ? vColumnIdentifier.name : vColumnIdentifier,
712
- bClear = bClearFirst || bClearFirst === undefined,
713
711
  sFieldName = !sFieldLabel ? vColumn : sFieldLabel,
714
712
  sSorting = bDescending ? SortOrder.Descending : SortOrder.Ascending;
715
713
 
716
714
  return this.prepareResult(
717
715
  oTableBuilder
718
- .doSortByColumn(vColumn, sFieldName, sSorting, bClear)
716
+ .doSortByColumn(vColumn, sFieldName, sSorting)
719
717
  .description(
720
718
  Utils.formatMessage(
721
719
  "Sorting column '{1}{2}' of table '{0}'",
@@ -13,8 +13,22 @@ sap.ui.define(
13
13
  if (oControl.isA("sap.ui.mdc.Field")) {
14
14
  return FieldBuilder.Matchers.value(vExpectedValue);
15
15
  }
16
- if (oControl.isA("sap.ui.unified.Currency")) {
17
- return OpaBuilder.Matchers.properties({ stringValue: vExpectedValue.stringValue, currency: vExpectedValue.description });
16
+ if (
17
+ oControl.isA("sap.m.HBox") &&
18
+ oControl.aCustomStyleClasses &&
19
+ oControl.aCustomStyleClasses.includes("sapFeControlsUnitCurrencyHbox")
20
+ ) {
21
+ return function (oSubControl) {
22
+ const currencyOrUnitMatcher = OpaBuilder.Matchers.childrenMatcher(
23
+ FEBuilder.create(this)
24
+ .hasType("sap.m.Text")
25
+ .hasProperties({ width: "3.3em", text: vExpectedValue.currency || vExpectedValue.unit })
26
+ );
27
+ const amountMatcher = OpaBuilder.Matchers.childrenMatcher(
28
+ FEBuilder.create(this).hasType("sap.m.Text").hasProperties({ text: vExpectedValue.value })
29
+ );
30
+ return FEBuilder.Matchers.match([currencyOrUnitMatcher, amountMatcher])(oSubControl);
31
+ };
18
32
  }
19
33
  var sExpectedValue = vExpectedValue;
20
34
  // we should avoid using the value description syntax when using non MDC controls but this is a workaround to have it working
@@ -79,10 +93,12 @@ sap.ui.define(
79
93
  oContent.isA("sap.m.ObjectStatus") ||
80
94
  oContent.isA("sap.m.InputBase") ||
81
95
  oContent.isA("sap.m.Avatar") ||
82
- oContent.isA("sap.ui.unified.Currency") ||
83
96
  oContent.isA("sap.m.ObjectIdentifier") ||
84
97
  oContent.isA("sap.m.RatingIndicator") ||
85
- oContent.isA("sap.m.ProgressIndicator")
98
+ oContent.isA("sap.m.ProgressIndicator") ||
99
+ (oContent.isA("sap.m.HBox") &&
100
+ oContent.aCustomStyleClasses &&
101
+ oContent.aCustomStyleClasses.includes("sapFeControlsUnitCurrencyHbox"))
86
102
  ? [oContent]
87
103
  : OpaBuilder.Matchers.children(
88
104
  OpaBuilder.create().hasSome(
@@ -95,7 +111,6 @@ sap.ui.define(
95
111
  FEBuilder.Matchers.state("controlType", "sap.m.ObjectStatus"),
96
112
  FEBuilder.Matchers.state("controlType", "sap.m.InputBase"),
97
113
  FEBuilder.Matchers.state("controlType", "sap.m.Avatar"),
98
- FEBuilder.Matchers.state("controlType", "sap.ui.unified.Currency"),
99
114
  FEBuilder.Matchers.state("controlType", "sap.m.ObjectIdentifier"),
100
115
  FEBuilder.Matchers.state("controlType", "sap.m.RatingIndicator"),
101
116
  FEBuilder.Matchers.state("controlType", "sap.m.ProgressIndicator")
@@ -293,9 +293,14 @@ sap.ui.define(
293
293
  function _getColumnContextToggleBuilder(ToggleButtonLabel, ToggleType) {
294
294
  return OpaBuilder.create()
295
295
  .isDialogElement()
296
- .hasType("sap.m.ToggleButton")
297
- .hasProperties({ text: ToggleButtonLabel })
298
- .doPress()
296
+ .hasType("sap.m.Switch")
297
+ .success(function (aSwitchButtons) {
298
+ const fnFindSwitchButton = function (oItem) {
299
+ return oItem.getParent().getCategory() === ToggleType && oItem.getParent().getLabel() === ToggleButtonLabel;
300
+ };
301
+ const switchButton = aSwitchButtons.find(fnFindSwitchButton);
302
+ switchButton.fireChange();
303
+ })
299
304
  .description(Utils.formatMessage(ToggleType + " column '{0}'", ToggleButtonLabel));
300
305
  }
301
306
 
@@ -476,110 +481,35 @@ sap.ui.define(
476
481
  return this.has(TableBuilder.Matchers.columnControl(vColumn)).has(FEBuilder.Matchers.singleElement()).doPress();
477
482
  };
478
483
 
479
- TableBuilder.prototype.doColumnHeaderSorting = function (vColumn, sFieldName, sSortOrder, sIcon, bClearFirst) {
484
+ TableBuilder.prototype.doColumnHeaderSorting = function (vColumn, sFieldName, sSortOrder) {
480
485
  var SortingIcon = sSortOrder === SortOrder.Ascending ? "sap-icon://sort-ascending" : "sap-icon://sort-descending";
481
-
482
- var TriggerSortOK = OpaBuilder.create()
483
- .isDialogElement()
484
- .hasType("sap.m.Button")
485
- .hasProperties({ text: "OK" })
486
- .doPress()
487
- .description("Confirming the Sorting dialog");
488
-
489
- // Builder to clear existing sorting entries
490
- var DeclineSortingBuilder = OpaBuilder.create()
491
- .isDialogElement()
492
- .hasType("sap.m.Button")
493
- .hasProperties({ icon: "sap-icon://decline" })
494
- .doPress()
495
- .description("Removing all previous sortings");
496
-
497
- // Builder to check for a specific sorting entry
498
- var CheckSortingFieldBuilder = OpaBuilder.create(this)
499
- .isDialogElement()
500
- .hasType("sap.m.ComboBox")
501
- .hasProperties({ value: sFieldName });
502
-
503
- // Builder for changing existing sorting entries
504
- var ExistingSortingFieldBuilder = OpaBuilder.create(this)
486
+ var TriggerSortBuilder = OpaBuilder.create()
505
487
  .isDialogElement()
506
- .hasType("sap.m.CustomListItem")
507
- .hasChildren(OpaBuilder.create(this).hasType("sap.m.ComboBox").hasProperties({ value: sFieldName }))
508
- .doOnChildren(OpaBuilder.create(this).hasType("sap.m.Button").hasProperties({ icon: SortingIcon }).doPress())
509
- .description(Utils.formatMessage("Change existing sorting field '{0}': {1}", sFieldName, sSortOrder))
510
- .success(TriggerSortOK);
511
-
512
- // Builder for new sorting entries
513
- var NewSortingFieldBuilder = OpaBuilder.create(this)
514
- .isDialogElement()
515
- .hasType("sap.m.CustomListItem")
516
- .hasChildren(
517
- OpaBuilder.create(this).hasType("sap.m.ComboBox").hasProperties({ placeholder: "Sort By" }).hasProperties({ value: "" })
518
- )
519
- .doOnChildren(
520
- OpaBuilder.create(this)
521
- .hasType("sap.m.ComboBox")
522
- .hasProperties({ placeholder: "Sort By" })
523
- .hasProperties({ value: "" })
524
- .doEnterText(sFieldName, true, false, true)
525
- )
526
- .doOnChildren(OpaBuilder.create(this).hasType("sap.m.Button").hasProperties({ icon: SortingIcon }).doPress())
527
- .description(Utils.formatMessage("Insert new sorting field '{0}': {1}", sFieldName, sSortOrder))
528
- .success(TriggerSortOK);
529
-
530
- // Builder to distinguish between inserting a new entry or changing an existing entry
531
- var CheckSortingPanelBuilder = OpaBuilder.create()
532
- .isDialogElement()
533
- .hasType("sap.m.p13n.SortPanel")
534
- .do(function () {
535
- if (bClearFirst) {
536
- DeclineSortingBuilder.execute();
537
- }
538
- if (!FEBuilder.controlsExist(CheckSortingFieldBuilder) || bClearFirst) {
539
- return NewSortingFieldBuilder.execute();
540
- } else {
541
- return ExistingSortingFieldBuilder.execute();
542
- }
543
- });
544
-
545
- // Opens the Sorting panel within the table column header context menu
546
- var TriggerSortingPanelBuilder = OpaBuilder.create()
547
- .isDialogElement()
548
- .hasType("sap.m.StandardListItem")
549
- .hasProperties({ icon: sIcon })
550
- .doPress()
551
- .description("Opening the Sorting dialog")
552
- .success(CheckSortingPanelBuilder);
553
-
554
- // Triggers the sorting by using the toggle buttons on the context menu
555
- var TriggerToggleBuilder = OpaBuilder.create()
556
- .isDialogElement()
557
- .hasType("sap.m.ToggleButton")
558
- .hasProperties({ text: sSortOrder })
559
- .has(function (oButton) {
560
- if (typeof oButton.getParent().getLabel === "function") {
561
- return (
562
- oButton.getParent().getLabel() ===
563
- Utils.formatMessage(oSAPMResourceBundle.getText("table.COLUMNMENU_QUICK_SORT"), sFieldName)
564
- );
565
- }
566
- return false;
488
+ .hasType("sap.m.SegmentedButton")
489
+ .success(function (aSegmButtons) {
490
+ const fnFindSegmButton = function (oItem) {
491
+ return oItem.getParent().getCategory() === "Sort" && oItem.getParent().getLabel() === sFieldName;
492
+ };
493
+ const fnFindSortButton = function (oItem) {
494
+ return oItem.getIcon() === SortingIcon;
495
+ };
496
+ const segmButton = aSegmButtons.find(fnFindSegmButton);
497
+ const sortButton = segmButton.getAggregation("buttons").find(fnFindSortButton);
498
+ sortButton.firePress();
567
499
  })
568
- .doPress()
569
500
  .description(Utils.formatMessage("Sorting column '{0}': {1}", vColumn, sSortOrder));
570
501
 
571
- // return this.doPressColumnHeader(vColumn).success(!sFieldName ? TriggerToggleBuilder : TriggerSortingPanelBuilder);
572
- return this.doPressColumnHeader(vColumn).success(bClearFirst ? TriggerToggleBuilder : TriggerSortingPanelBuilder);
502
+ return this.doPressColumnHeader(vColumn).success(TriggerSortBuilder);
573
503
  };
574
- TableBuilder.prototype.doSortByColumn = function (vColumn, sFieldName, sSortOrder, bClearFirst) {
575
- var sIcon = "sap-icon://sort";
576
- return this.doColumnHeaderSorting(vColumn, sFieldName, sSortOrder, sIcon, bClearFirst);
504
+
505
+ TableBuilder.prototype.doSortByColumn = function (vColumn, sFieldName, sSortOrder) {
506
+ return this.doColumnHeaderSorting(vColumn, sFieldName, sSortOrder);
577
507
  };
578
508
 
579
509
  TableBuilder.prototype.doColumnHeaderGrouping = function (vColumn, sFieldName) {
580
510
  var sGroupingField = !sFieldName ? vColumn : sFieldName,
581
511
  // Triggers the grouping by using the toggle buttons on the context menu
582
- TriggerToggleBuilder = _getColumnContextToggleBuilder(sGroupingField, "Grouping");
512
+ TriggerToggleBuilder = _getColumnContextToggleBuilder(sGroupingField, "Group");
583
513
 
584
514
  return this.doPressColumnHeader(vColumn).success(TriggerToggleBuilder);
585
515
  };
@@ -589,8 +519,8 @@ sap.ui.define(
589
519
 
590
520
  TableBuilder.prototype.doColumnHeaderAggregating = function (vColumn, sFieldName) {
591
521
  var sAggregationField = !sFieldName ? vColumn : sFieldName,
592
- // Triggers the grouping by using the toggle buttons on the context menu
593
- TriggerToggleBuilder = _getColumnContextToggleBuilder(sAggregationField, "Aggregating");
522
+ // Triggers the aggregation by using the toggle buttons on the context menu
523
+ TriggerToggleBuilder = _getColumnContextToggleBuilder(sAggregationField, "Aggregate");
594
524
 
595
525
  return this.doPressColumnHeader(vColumn).success(TriggerToggleBuilder);
596
526
  };
@@ -619,55 +549,34 @@ sap.ui.define(
619
549
  };
620
550
 
621
551
  TableBuilder.prototype.checkColumnHeaderAction = function (vColumn, sActionIconName, sFieldName, iExpectedNumber, sGroupTotals) {
622
- var TriggerGroupingCancel = OpaBuilder.create()
623
- .isDialogElement()
624
- .hasType("sap.m.Button")
625
- .hasProperties({ text: "Cancel" })
626
- .doPress()
627
- .description("Cancelling the dialog");
628
-
629
- // Opens the Grouping panel within the table column header context menu to successfully leave the context dialog with cancel button
630
- var TriggerGroupingPanelBuilder = OpaBuilder.create()
631
- .isDialogElement()
632
- .hasType("sap.m.StandardListItem")
633
- .hasProperties({ icon: sActionIconName })
634
- .doPress()
635
- .success(TriggerGroupingCancel);
636
-
637
- var CheckMultipleGroupingBuilder = OpaBuilder.create()
638
- .isDialogElement()
639
- .hasType("sap.m.ToggleButton")
640
- .has(function (oButton) {
641
- if (typeof oButton.getParent().getLabel === "function") {
642
- return oButton.getParent().getLabel() === sGroupTotals;
643
- }
644
- return false;
645
- })
646
- .checkNumberOfMatches(iExpectedNumber)
647
- .success(TriggerGroupingPanelBuilder);
552
+ var TriggerKeyboardEscapeBuilder = FEBuilder.create(this.getOpaInstance())
553
+ .doPressKeyboardShortcut("Escape")
554
+ .description("Closing dialog");
648
555
 
649
556
  var CheckSingleGroupingBuilder = OpaBuilder.create()
650
557
  .isDialogElement()
651
- .hasType("sap.m.ToggleButton")
652
- .hasProperties({ text: sFieldName })
653
- .has(function (oButton) {
654
- if (typeof oButton.getParent().getLabel === "function") {
655
- return oButton.getParent().getLabel() === sGroupTotals;
656
- }
657
- return false;
658
- })
659
- .checkNumberOfMatches(iExpectedNumber)
660
- .success(TriggerGroupingPanelBuilder);
558
+ .hasType("sap.m.List")
559
+ .hasChildren(OpaBuilder.create(this).hasType("sap.m.Title").hasProperties({ text: sGroupTotals }), false)
560
+ .success(function (aMListItems) {
561
+ const fnFindFildNameItem = function (item) {
562
+ return item.getLabel() === sFieldName;
563
+ };
661
564
 
662
- return this.doPressColumnHeader(vColumn).success(sFieldName ? CheckSingleGroupingBuilder : CheckMultipleGroupingBuilder);
565
+ return sFieldName
566
+ ? aMListItems[0].getAggregation("items").find(fnFindFildNameItem)
567
+ : aMListItems[0].getAggregation("items").length === iExpectedNumber;
568
+ });
569
+
570
+ return this.doPressColumnHeader(vColumn).success(CheckSingleGroupingBuilder).do(TriggerKeyboardEscapeBuilder);
663
571
  };
572
+
664
573
  TableBuilder.prototype.hasGroupByColumn = function (vColumn, sFieldName, iExpectedNumber) {
665
574
  return this.checkColumnHeaderAction(
666
575
  vColumn,
667
576
  "sap-icon://group-2",
668
577
  sFieldName,
669
578
  iExpectedNumber,
670
- oSAPMResourceBundle.getText("table.COLUMNMENU_QUICK_GROUP")
579
+ oSAPMResourceBundle.getText("table.COLUMNMENU_QUICK_GROUP_TITLE")
671
580
  );
672
581
  };
673
582
 
@@ -22,7 +22,7 @@ sap.ui.define(["sap/ui/core/Lib", "sap/ui/core/library"], function (Library, _li
22
22
  controls: [],
23
23
  elements: [],
24
24
  // eslint-disable-next-line no-template-curly-in-string
25
- version: "1.132.0",
25
+ version: "1.133.1",
26
26
  noLibraryCSS: true
27
27
  });
28
28
  return thisLib;