@wavemaker/app-ng-runtime 11.15.5-rc.261 → 11.15.5-rc.262

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.
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@wavemaker/app-ng-runtime",
3
- "version": "11.15.5-rc.261",
3
+ "version": "11.15.5-rc.262",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@wavemaker/app-ng-runtime",
9
- "version": "11.15.5-rc.261",
9
+ "version": "11.15.5-rc.262",
10
10
  "license": "MIT",
11
11
  "engines": {
12
12
  "node": ">=18.16.1",
package/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@wavemaker/app-ng-runtime",
3
- "version": "11.15.5-rc.261",
3
+ "version": "11.15.5-rc.262",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@wavemaker/app-ng-runtime",
9
- "version": "11.15.5-rc.261",
9
+ "version": "11.15.5-rc.262",
10
10
  "license": "MIT",
11
11
  "engines": {
12
12
  "node": ">=18.16.1",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wavemaker/app-ng-runtime",
3
- "version": "11.15.5-rc.261",
3
+ "version": "11.15.5-rc.262",
4
4
  "description": "All modules required for a WaveMaker application.",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -1492,6 +1492,12 @@ $.widget('wm.datatable', {
1492
1492
  }
1493
1493
  }
1494
1494
  },
1495
+ refreshColumnWidths: function () {
1496
+ if (this.gridContainer.width() > 0) {
1497
+ this.tableContainer.children('colgroup').children('col').css('width', '');
1498
+ }
1499
+ this.setColGroupWidths();
1500
+ },
1495
1501
  /*Set the default widths for the colgroup*/
1496
1502
  setColGroupWidths: function () {
1497
1503
  var self = this,
@@ -785,7 +785,28 @@
785
785
  value = !lodashEs.isUndefined(value) ? value : obj.value;
786
786
  /* sanity check, user can bind parent nodes to non-object values, so child node bindings may fail */
787
787
  if (targetObj) {
788
- targetObj[targetNodeKey] = value;
788
+ // Multi query params: one slot per binding; rebinds replace that slot (not append).
789
+ // Exception: if the bind expression itself resolved to the complete array
790
+ // (e.g. `bind:['fire', 'water']`), assign it directly instead of treating it
791
+ // as a single slot's value — same as the non-multi assignment below.
792
+ if (obj.collectionFormat === 'multi' && !lodashEs.isArray(value)) {
793
+ let values = targetObj[targetNodeKey];
794
+ if (!lodashEs.isArray(values)) {
795
+ values = targetObj[targetNodeKey] = lodashEs.isUndefined(values) ? [] : [values];
796
+ }
797
+ let slot = obj.multiIndex !== undefined ? obj.multiIndex : obj.__multiSlotIndex;
798
+ if (slot === undefined) {
799
+ slot = obj.__multiSlotIndex = values.length;
800
+ values.push(value);
801
+ }
802
+ else {
803
+ obj.__multiSlotIndex = slot;
804
+ values[slot] = value;
805
+ }
806
+ }
807
+ else {
808
+ targetObj[targetNodeKey] = value;
809
+ }
789
810
  }
790
811
  processVariablePostBindUpdate(targetNodeKey, value, obj.type, variable, noUpdate);
791
812
  };
@@ -894,6 +915,32 @@
894
915
  * for some it can be 'dataSet' and hence will be passed as param
895
916
  * @param {string} bindTarget, the object field in variable where the computed bindings will be set
896
917
  */
918
+ /**
919
+ * In older saved REST/Swagger service variables, duplicate query parameters may not have a
920
+ * collectionFormat, so they are treated as multi-value parameters for backward compatibility:
921
+ * each duplicate target is tagged collectionFormat 'multi' and given a stable multiIndex.
922
+ * Shared by both processBinding implementations (this file and VariablesService).
923
+ */
924
+ const applyMultiIndexForDuplicateBindings = (bindMap) => {
925
+ const targetOccurrences = {};
926
+ bindMap.forEach(function (node) {
927
+ if (node && node.target) {
928
+ targetOccurrences[node.target] = (targetOccurrences[node.target] || 0) + 1;
929
+ }
930
+ });
931
+ const nextMultiIndex = {};
932
+ bindMap.forEach(function (node) {
933
+ if (node && node.target && targetOccurrences[node.target] > 1) {
934
+ if (!node.collectionFormat) {
935
+ node.collectionFormat = 'multi';
936
+ }
937
+ if (node.multiIndex === undefined) {
938
+ nextMultiIndex[node.target] = nextMultiIndex[node.target] || 0;
939
+ node.multiIndex = nextMultiIndex[node.target]++;
940
+ }
941
+ }
942
+ });
943
+ };
897
944
  const processBinding = (variable, context, bindSource, bindTarget) => {
898
945
  bindSource = bindSource || 'dataBinding';
899
946
  bindTarget = bindTarget || 'dataBinding';
@@ -903,6 +950,9 @@
903
950
  if (!bindMap || !lodashEs.isArray(bindMap)) {
904
951
  return;
905
952
  }
953
+ if (variable.category === VARIABLE_CONSTANTS.CATEGORY.SERVICE) {
954
+ applyMultiIndexForDuplicateBindings(bindMap);
955
+ }
906
956
  bindMap.forEach(function (node) {
907
957
  /* for static variable change the binding with target 'dataBinding' to 'dataSet', as the results have to reflect directly in the dataSet */
908
958
  if (variable.category === 'wm.Variable' && node.target === 'dataBinding') {
@@ -2032,6 +2082,24 @@
2032
2082
  const isBodyTypeQueryOrProcedure = (variable) => {
2033
2083
  return (lodashEs.includes(['QueryExecution', 'ProcedureExecution'], variable.controller)) && (lodashEs.includes(['put', 'post'], variable.operationType));
2034
2084
  };
2085
+ const appendQueryParam = (queryParams, paramName, paramValue, preEncoded = false) => {
2086
+ const encodedValue = preEncoded ? paramValue : encodeURIComponent(paramValue);
2087
+ const pair = `${paramName}=${encodedValue}`;
2088
+ return queryParams ? `${queryParams}&${pair}` : `?${pair}`;
2089
+ };
2090
+ const getQueryParamValues = (param, paramValue) => {
2091
+ if (lodashEs.isArray(paramValue)) {
2092
+ // 'multi' (duplicate query-param bindings) repeats the param, e.g. tag=a&tag=b.
2093
+ if (param.collectionFormat === 'multi') {
2094
+ return lodashEs.map(paramValue, (value) => ({ value, preEncoded: false }));
2095
+ }
2096
+ // Otherwise, join into a single comma-separated value, e.g. tag=a,b. Encode each
2097
+ // element individually so the joining commas stay literal (unambiguously the
2098
+ // separator) while a comma inside an element's own value stays escaped as %2C.
2099
+ return [{ value: lodashEs.map(paramValue, (value) => encodeURIComponent(value)).join(','), preEncoded: true }];
2100
+ }
2101
+ return [{ value: paramValue, preEncoded: false }];
2102
+ };
2035
2103
  /**
2036
2104
  * returns true if the variable is a Query service variable
2037
2105
  * @param {string} controller
@@ -2249,12 +2317,12 @@
2249
2317
  if (lodashEs.isNull(paramValue) && isQueryServiceVar(variable.controller, variable.serviceType)) {
2250
2318
  break;
2251
2319
  }
2252
- if (!queryParams) {
2253
- queryParams = '?' + param.name + '=' + encodeURIComponent(paramValue);
2254
- }
2255
- else {
2256
- queryParams += '&' + param.name + '=' + encodeURIComponent(paramValue);
2257
- }
2320
+ getQueryParamValues(param, paramValue).forEach(({ value: queryValue, preEncoded }) => {
2321
+ if (lodashEs.isNull(queryValue) && isQueryServiceVar(variable.controller, variable.serviceType)) {
2322
+ return;
2323
+ }
2324
+ queryParams = appendQueryParam(queryParams, param.name, queryValue, preEncoded);
2325
+ });
2258
2326
  break;
2259
2327
  case 'PATH':
2260
2328
  /* replacing the path param based on the regular expression in the relative path */
@@ -3060,6 +3128,9 @@
3060
3128
  if (!bindMap || !lodashEs.isArray(bindMap)) {
3061
3129
  return;
3062
3130
  }
3131
+ if (variable.category === VARIABLE_CONSTANTS.CATEGORY.SERVICE) {
3132
+ applyMultiIndexForDuplicateBindings(bindMap);
3133
+ }
3063
3134
  bindMap.forEach((node) => {
3064
3135
  /* for static variable change the binding with target 'dataBinding' to 'dataSet', as the results have to reflect directly in the dataSet */
3065
3136
  if (variable.category === 'wm.Variable' && node.target === 'dataBinding') {
@@ -5,10 +5,9 @@ import { OAuthService } from '@wm/oAuth';
5
5
  import { SecurityService } from '@wm/security';
6
6
  import { VariableFactory } from '../factory/variable.factory';
7
7
  import { wmSetDependency, BaseAction, getTarget, setValueToNode, getTargetNodeKey, internalBoundNodeMap } from '@wavemaker/variables';
8
- import { setDependency, simulateFileDownload } from '../util/variable/variables.utils';
8
+ import { appManager, applyMultiIndexForDuplicateBindings, setDependency, simulateFileDownload } from '../util/variable/variables.utils';
9
9
  import { MetadataService } from './metadata-service/metadata.service';
10
10
  import { VARIABLE_CONSTANTS } from '../constants/variables.constants';
11
- import { appManager } from '../util/variable/variables.utils';
12
11
  import { isArray, isFunction, isUndefined, set } from "lodash-es";
13
12
  import * as i0 from "@angular/core";
14
13
  import * as i1 from "@wm/core";
@@ -109,6 +108,9 @@ export class VariablesService {
109
108
  if (!bindMap || !isArray(bindMap)) {
110
109
  return;
111
110
  }
111
+ if (variable.category === VARIABLE_CONSTANTS.CATEGORY.SERVICE) {
112
+ applyMultiIndexForDuplicateBindings(bindMap);
113
+ }
112
114
  bindMap.forEach((node) => {
113
115
  /* for static variable change the binding with target 'dataBinding' to 'dataSet', as the results have to reflect directly in the dataSet */
114
116
  if (variable.category === 'wm.Variable' && node.target === 'dataBinding') {
@@ -207,4 +209,4 @@ export class VariablesService {
207
209
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: VariablesService, decorators: [{
208
210
  type: Injectable
209
211
  }], ctorParameters: () => [{ type: i1.AbstractHttpService }, { type: i2.MetadataService }, { type: i1.AbstractNavigationService }, { type: i3.Router }, { type: i1.AbstractToasterService }, { type: i4.OAuthService }, { type: i5.SecurityService }, { type: i1.AbstractDialogService }] });
210
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFyaWFibGVzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy92YXJpYWJsZXMvc3JjL3NlcnZpY2UvdmFyaWFibGVzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFekMsT0FBTyxFQUNILE1BQU0sRUFDTixXQUFXLEVBQ1gscUJBQXFCLEVBQ3JCLG1CQUFtQixFQUNuQix5QkFBeUIsRUFDekIsc0JBQXNCLEVBQUUsd0JBQXdCLEVBQUUsZUFBZSxFQUNwRSxNQUFNLFVBQVUsQ0FBQztBQUNsQixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFL0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzlELE9BQU8sRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN0SSxPQUFPLEVBQUMsYUFBYSxFQUFFLG9CQUFvQixFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFDckYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3RFLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxrQ0FBa0MsQ0FBQztBQUU1RCxPQUFPLEVBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsR0FBRyxFQUFDLE1BQU0sV0FBVyxDQUFDOzs7Ozs7O0FBRWhFLE1BQU0sT0FBTyxTQUFTO0lBQ2xCLE1BQU0sQ0FBQyxLQUFLLEVBQUUs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O1lBQzFELENBQUM7aUJBQU0sQ0FBQztnQkFDSixpQkFBaUIsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEdBQUcsV0FBVyxDQUFDO1lBQzVELENBQUM7UUFDTCxDQUFDO1FBRUQsaUdBQWlHO1FBQ2pHLElBQUksS0FBSyxDQUFDLHVCQUF1QixFQUFFLENBQUM7WUFDaEMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLEdBQUcsRUFBRTtnQkFDL0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDN0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMvQyxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7UUFFRCxPQUFPLGlCQUFpQixDQUFDO0lBQzdCLENBQUM7SUFFRCxPQUFPO0lBQ1AsQ0FBQztJQUVELGtCQUFrQixDQUFDLElBQUksRUFBRSxHQUFHO1FBQ3hCLGFBQWEsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDekIsZUFBZSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMvQixDQUFDOytHQXRNUSxnQkFBZ0I7bUhBQWhCLGdCQUFnQjs7NEZBQWhCLGdCQUFnQjtrQkFENUIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7XG4gICAgJHdhdGNoLFxuICAgICRwYXJzZUV2ZW50LFxuICAgIEFic3RyYWN0RGlhbG9nU2VydmljZSxcbiAgICBBYnN0cmFjdEh0dHBTZXJ2aWNlLFxuICAgIEFic3RyYWN0TmF2aWdhdGlvblNlcnZpY2UsXG4gICAgQWJzdHJhY3RUb2FzdGVyU2VydmljZSwgcHJvY2Vzc0ZpbHRlckV4cEJpbmROb2RlLCAkaW52b2tlV2F0Y2hlcnMsIGdldENsb25lZE9iamVjdFxufSBmcm9tICdAd20vY29yZSc7XG5pbXBvcnQgeyBPQXV0aFNlcnZpY2UgfSBmcm9tICdAd20vb0F1dGgnO1xuaW1wb3J0IHsgU2VjdXJpdHlTZXJ2aWNlIH0gZnJvbSAnQHdtL3NlY3VyaXR5JztcblxuaW1wb3J0IHsgVmFyaWFibGVGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yeS92YXJpYWJsZS5mYWN0b3J5JztcbmltcG9ydCB7IHdtU2V0RGVwZW5kZW5jeSwgQmFzZUFjdGlvbiwgZ2V0VGFyZ2V0LCBzZXRWYWx1ZVRvTm9kZSwgZ2V0VGFyZ2V0Tm9kZUtleSwgaW50ZXJuYWxCb3VuZE5vZGVNYXAgfSBmcm9tICdAd2F2ZW1ha2VyL3ZhcmlhYmxlcyc7XG5pbXBvcnQge3NldERlcGVuZGVuY3ksIHNpbXVsYXRlRmlsZURvd25sb2FkfSBmcm9tICcuLi91dGlsL3ZhcmlhYmxlL3ZhcmlhYmxlcy51dGlscyc7XG5pbXBvcnQgeyBNZXRhZGF0YVNlcnZpY2UgfSBmcm9tICcuL21ldGFkYXRhLXNlcnZpY2UvbWV0YWRhdGEuc2VydmljZSc7XG5pbXBvcnQgeyBWQVJJQUJMRV9DT05TVEFOVFMgfSBmcm9tICcuLi9jb25zdGFudHMvdmFyaWFibGVzLmNvbnN0YW50cyc7XG5pbXBvcnQge2FwcE1hbmFnZXJ9IGZyb20gJy4uL3V0aWwvdmFyaWFibGUvdmFyaWFibGVzLnV0aWxzJztcbmltcG9ydCB7IERhdGVGb3JtYXR0ZXIgfSBmcm9tICdAd2F2ZW1ha2VyL3ZhcmlhYmxlcyc7XG5pbXBvcnQge2lzQXJyYXksIGlzRnVuY3Rpb24sIGlzVW5kZWZpbmVkLCBzZXR9IGZyb20gXCJsb2Rhc2gtZXNcIjtcblxuZXhwb3J0IGNsYXNzIEZvcm1hdHRlciBpbXBsZW1lbnRzIERhdGVGb3JtYXR0ZXIge1xuICAgIGZvcm1hdCh2YWx1ZSwgZm9ybWF0KSB7XG4gICAgICAgIHJldHVybiAgYXBwTWFuYWdlci5nZXRQaXBlKCdkYXRlJykudHJhbnNmb3JtKHZhbHVlLCBmb3JtYXQpO1xuICAgIH1cbn1cblxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVmFyaWFibGVzU2VydmljZSB7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBodHRwU2VydmljZTogQWJzdHJhY3RIdHRwU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBtZXRhZGF0YVNlcnZpY2U6IE1ldGFkYXRhU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBuYXZpZ2F0aW9uU2VydmljZTogQWJzdHJhY3ROYXZpZ2F0aW9uU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByb3V0ZXJTZXJ2aWNlOiBSb3V0ZXIsXG4gICAgICAgIHByaXZhdGUgdG9hc3RlclNlcnZpY2U6IEFic3RyYWN0VG9hc3RlclNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgb0F1dGhTZXJ2aWNlOiBPQXV0aFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgc2VjdXJpdHlTZXJ2aWNlOiBTZWN1cml0eVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgZGlhbG9nU2VydmljZTogQWJzdHJhY3REaWFsb2dTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIC8vIHNldCBleHRlcm5hbCBkZXBlbmRlbmNpZXMsIHRvIGJlIHVzZWQgYWNyb3NzIHZhcmlhYmxlIGNsYXNzZXMsIG1hbmFnZXJzIGFuZCB1dGlsc1xuICAgICAgICBzZXREZXBlbmRlbmN5KCdodHRwJywgdGhpcy5odHRwU2VydmljZSk7XG4gICAgICAgIHNldERlcGVuZGVuY3koJ21ldGFkYXRhJywgdGhpcy5tZXRhZGF0YVNlcnZpY2UpO1xuICAgICAgICBzZXREZXBlbmRlbmN5KCduYXZpZ2F0aW9uU2VydmljZScsIHRoaXMubmF2aWdhdGlvblNlcnZpY2UpO1xuICAgICAgICBzZXREZXBlbmRlbmN5KCdyb3V0ZXInLCB0aGlzLnJvdXRlclNlcnZpY2UpO1xuICAgICAgICBzZXREZXBlbmRlbmN5KCd0b2FzdGVyJywgdGhpcy50b2FzdGVyU2VydmljZSk7XG4gICAgICAgIHNldERlcGVuZGVuY3koJ29BdXRoJywgdGhpcy5vQXV0aFNlcnZpY2UpO1xuICAgICAgICBzZXREZXBlbmRlbmN5KCdzZWN1cml0eScsIHRoaXMuc2VjdXJpdHlTZXJ2aWNlKTtcbiAgICAgICAgc2V0RGVwZW5kZW5jeSgnZGlhbG9nJywgdGhpcy5kaWFsb2dTZXJ2aWNlKTtcbiAgICAgICAgd21TZXREZXBlbmRlbmN5KCdvQXV0aCcsIHRoaXMub0F1dGhTZXJ2aWNlKTtcbiAgICAgICAgd21TZXREZXBlbmRlbmN5KCdzZWN1cml0eScsIHRoaXMuc2VjdXJpdHlTZXJ2aWNlKTtcbiAgICAgICAgd21TZXREZXBlbmRlbmN5KCdtZXRhZGF0YScsIHRoaXMubWV0YWRhdGFTZXJ2aWNlKTtcbiAgICAgICAgd21TZXREZXBlbmRlbmN5KCdodHRwJywgdGhpcy5odHRwU2VydmljZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogbG9vcCB0aHJvdWdoIGEgY29sbGVjdGlvbiBvZiB2YXJpYWJsZXMvYWN0aW9uc1xuICAgICAqIHRyaWdnZXIgY2FuY2VsIG9uIGVhY2ggKG9mIGV4aXN0cylcbiAgICAgKiBAcGFyYW0gY29sbGVjdGlvblxuICAgICAqL1xuICAgIGJ1bGtDYW5jZWwoY29sbGVjdGlvbikge1xuICAgICAgICBPYmplY3Qua2V5cyhjb2xsZWN0aW9uKS5mb3JFYWNoKG5hbWUgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFyaWFibGUgPSBjb2xsZWN0aW9uW25hbWVdO1xuICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24odmFyaWFibGUuY2FuY2VsKSkge1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlLmNhbmNlbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBsb29wcyBvdmVyIHRoZSB2YXJpYWJsZS9hY3Rpb25zIGNvbGxlY3Rpb24gYW5kIHRyaWdnZXIgaW52b2tlIG9uIGl0IGlmIHN0YXJ0VXBkYXRlIG9uIGl0IGlzIHRydWVcbiAgICAgKiBAcGFyYW0gY29sbGVjdGlvblxuICAgICAqL1xuICAgIHRyaWdnZXJTdGFydFVwZGF0ZShjb2xsZWN0aW9uKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGNvbGxlY3Rpb24pXG4gICAgICAgICAgICAgICAgLm1hcChuYW1lID0+IGNvbGxlY3Rpb25bbmFtZV0pXG4gICAgICAgICAgICAgICAgLmZpbHRlciggdmFyaWFibGUgPT4gdmFyaWFibGU/LnN0YXJ0VXBkYXRlICYmIHZhcmlhYmxlLmludm9rZSlcbiAgICAgICAgICAgICAgICAubWFwKHZhcmlhYmxlID0+IHZhcmlhYmxlLmludm9rZSgpKVxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcm9jZXNzQmluZEV4cChkOiBhbnksIHNjb3BlOiBhbnksIHZhcmlhYmxlKSB7XG4gICAgICAgIGNvbnN0IHJvb3QgPSBnZXRUYXJnZXQodmFyaWFibGUpLFxuICAgICAgICAgICAgdGFyZ2V0Tm9kZUtleSA9IGdldFRhcmdldE5vZGVLZXkoZC50YXJnZXQpLFxuICAgICAgICAgICAgcnVuTW9kZSA9IHRydWU7XG4gICAgICAgIGxldCB2ID0gaXNBcnJheShkLnZhbHVlKSA/IGQudmFsdWVbMF0gOiBkLnZhbHVlO1xuICAgICAgICBpZiAodikge1xuICAgICAgICAgICAgaWYgKHYuc3RhcnRzV2l0aCAmJiB2LnN0YXJ0c1dpdGgoJ2JpbmQ6JykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB3YXRjaEV4cHJlc3Npb24gPSAkd2F0Y2godi5yZXBsYWNlKCdiaW5kOicsICcnKSwgc2NvcGUsIHt9LCB2YXJpYWJsZS5pbnZva2VPblBhcmFtQ2hhbmdlLmJpbmQodmFyaWFibGUsIGQpLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgZCwgKCkgPT4gdmFyaWFibGUuaXNNdXRlZCk7XG4gICAgICAgICAgICAgICAgdiA9IHNjb3BlLnJlZ2lzdGVyRGVzdHJveUxpc3RlbmVyID8gc2NvcGUucmVnaXN0ZXJEZXN0cm95TGlzdGVuZXIod2F0Y2hFeHByZXNzaW9uKSA6IHdhdGNoRXhwcmVzc2lvbjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzVW5kZWZpbmVkKGQudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgc2V0VmFsdWVUb05vZGUoZC50YXJnZXQsIGQsIHJvb3QsIHZhcmlhYmxlLCBkLnZhbHVlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBpZiAocnVuTW9kZSAmJiByb290ICE9PSB0YXJnZXROb2RlS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaW50ZXJuYWxCb3VuZE5vZGVNYXAuaGFzKHZhcmlhYmxlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxCb3VuZE5vZGVNYXAuc2V0KHZhcmlhYmxlLCB7fSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc2V0KGludGVybmFsQm91bmROb2RlTWFwLmdldCh2YXJpYWJsZSksIFt2YXJpYWJsZS5uYW1lLCByb290LCBkLnRhcmdldF0sIGQudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogZC50YXJnZXQsXG4gICAgICAgICAgICB2YWx1ZTogdlxuICAgICAgICB9O1xuICAgIH1cbiAgICBwcm9jZXNzU3Bpbm5lck1lc3NhZ2VCaW5kaW5nKHZhcmlhYmxlOiBhbnksIHNjb3BlOiBhbnkpIHtcbiAgICAgICAgaWYgKCF2YXJpYWJsZS5zcGlubmVyTWVzc2FnZT8uc3RhcnRzV2l0aD8uKCdiaW5kOicpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZXhwciA9IHZhcmlhYmxlLnNwaW5uZXJNZXNzYWdlLnJlcGxhY2UoJ2JpbmQ6JywgJycpO1xuICAgICAgICB2YXJpYWJsZS5zcGlubmVyTWVzc2FnZSA9ICcnO1xuICAgICAgICBjb25zdCB3YXRjaEV4cHJlc3Npb24gPSAkd2F0Y2goZXhwciwgc2NvcGUsIHt9LCBudiA9PiB2YXJpYWJsZS5zcGlubmVyTWVzc2FnZSA9IG52ID8/ICcnKTtcbiAgICAgICAgc2NvcGUucmVnaXN0ZXJEZXN0cm95TGlzdGVuZXI/Lih3YXRjaEV4cHJlc3Npb24pO1xuICAgIH1cblxuICAgIHByb2Nlc3NCaW5kaW5nKHZhcmlhYmxlOiBhbnksIGNvbnRleHQ6IGFueSwgYmluZFNvdXJjZT86IHN0cmluZywgYmluZFRhcmdldD86IHN0cmluZykge1xuICAgICAgICBiaW5kU291cmNlID0gYmluZFNvdXJjZSB8fCAnZGF0YUJpbmRpbmcnO1xuICAgICAgICBiaW5kVGFyZ2V0ID0gYmluZFRhcmdldCB8fCAnZGF0YUJpbmRpbmcnO1xuXG4gICAgICAgIGNvbnN0IGJpbmRNYXAgPSB2YXJpYWJsZVtiaW5kU291cmNlXTtcbiAgICAgICAgdmFyaWFibGVbYmluZFNvdXJjZV0gPSB7fTtcbiAgICAgICAgdmFyaWFibGVbJ19iaW5kJyArIGJpbmRTb3VyY2VdID0gYmluZE1hcDtcbiAgICAgICAgaWYgKCFiaW5kTWFwIHx8ICFpc0FycmF5KGJpbmRNYXApKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYmluZE1hcC5mb3JFYWNoKCAobm9kZSkgPT4ge1xuICAgICAgICAgICAgLyogZm9yIHN0YXRpYyB2YXJpYWJsZSBjaGFuZ2UgdGhlIGJpbmRpbmcgd2l0aCB0YXJnZXQgJ2RhdGFCaW5kaW5nJyB0byAnZGF0YVNldCcsIGFzIHRoZSByZXN1bHRzIGhhdmUgdG8gcmVmbGVjdCBkaXJlY3RseSBpbiB0aGUgZGF0YVNldCAqL1xuICAgICAgICAgICAgaWYgKHZhcmlhYmxlLmNhdGVnb3J5ID09PSAnd20uVmFyaWFibGUnICYmIG5vZGUudGFyZ2V0ID09PSAnZGF0YUJpbmRpbmcnKSB7XG4gICAgICAgICAgICAgICAgbm9kZS50YXJnZXQgPSAnZGF0YVNldCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NCaW5kRXhwKG5vZGUsIGNvbnRleHQsIHZhcmlhYmxlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaXNWYXJpYWJsZVNlcGVyYXRlZCh2YXJpYWJsZXNKc29uLCB2YXJpYWJsZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHZhcmlhYmxlc0pzb25bdmFyaWFibGVOYW1lXS5jYXRlZ29yeSA9PT0gJ3dtLlZhcmlhYmxlJyB8fCB2YXJpYWJsZXNKc29uW3ZhcmlhYmxlTmFtZV0uY2F0ZWdvcnkgPT09ICd3bS5TZXJ2aWNlVmFyaWFibGUnIHx8XG4gICAgICAgICAgICB2YXJpYWJsZXNKc29uW3ZhcmlhYmxlTmFtZV0uY2F0ZWdvcnkgPT09ICd3bS5MaXZlVmFyaWFibGUnIHx8IHZhcmlhYmxlc0pzb25bdmFyaWFibGVOYW1lXS5jYXRlZ29yeSA9PT0gJ3dtLkNydWRWYXJpYWJsZSdcbiAgICB9XG5cbiAgICBnZXRCaW5kU291cmNlVGFyZ2V0KHZhcmlhYmxlKSB7XG4gICAgICAgIGlmICh2YXJpYWJsZS5jYXRlZ29yeSA9PT0gJ3dtLkxpdmVWYXJpYWJsZScpIHtcbiAgICAgICAgICAgIHJldHVybiB2YXJpYWJsZS5vcGVyYXRpb24gPT09ICdyZWFkJyA/ICdmaWx0ZXJGaWVsZHMnIDogJ2lucHV0RmllbGRzJztcbiAgICAgICAgfSBlbHNlIGlmICh2YXJpYWJsZS5jYXRlZ29yeSA9PT0gJ3dtLk1vZGVsVmFyaWFibGUnKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2RhdGFTZXQnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuICdkYXRhQmluZGluZyc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUYWtlcyB0aGUgcmF3IHZhcmlhYmxlcyBhbmQgYWN0aW9ucyBqc29uIGFzIGlucHV0XG4gICAgICogSW5pdGlhbGl6ZSB0aGUgdmFyaWFibGUgYW5kIGFjdGlvbiBpbnN0YW5jZXMgdGhyb3VnaCB0aGUgZmFjdG9yeVxuICAgICAqIGNvbGxlY3QgdGhlIHZhcmlhYmxlcyBhbmQgYWN0aW9ucyBpbiBzZXBhcmF0ZSBtYXBzIGFuZCByZXR1cm4gdGhlIGNvbGxlY3Rpb25cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGFnZVxuICAgICAqIEBwYXJhbSB2YXJpYWJsZXNKc29uXG4gICAgICogQHBhcmFtIHNjb3BlXG4gICAgICogQHJldHVybnMge1ZhcmlhYmxlcyAsIEFjdGlvbnN9XG4gICAgICovXG4gICAgcmVnaXN0ZXIocGFnZTogc3RyaW5nLCB2YXJpYWJsZXNKc29uOiBhbnksIHNjb3BlOiBhbnkpIHtcbiAgICAgICAgY29uc3QgdmFyaWFibGVJbnN0YW5jZXMgPSB7XG4gICAgICAgICAgICBWYXJpYWJsZXM6IHt9LFxuICAgICAgICAgICAgQWN0aW9uczoge30sXG4gICAgICAgICAgICBjYWxsYmFjazogdGhpcy50cmlnZ2VyU3RhcnRVcGRhdGVcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHZhckluc3RhbmNlO1xuXG4gICAgICAgIGZvciAoY29uc3QgdmFyaWFibGVOYW1lIGluIHZhcmlhYmxlc0pzb24pIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtczogYW55ID0ge307XG4gICAgICAgICAgICB2YXJJbnN0YW5jZSA9IFZhcmlhYmxlRmFjdG9yeS5jcmVhdGUodmFyaWFibGVzSnNvblt2YXJpYWJsZU5hbWVdLCBzY29wZSk7XG4gICAgICAgICAgICB2YXJJbnN0YW5jZS5pbml0KCk7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NTcGlubmVyTWVzc2FnZUJpbmRpbmcodmFySW5zdGFuY2UsIHNjb3BlKTtcbiAgICAgICAgICAgaWYgKHRoaXMuaXNWYXJpYWJsZVNlcGVyYXRlZCh2YXJpYWJsZXNKc29uLCB2YXJpYWJsZU5hbWUpKSB7XG4gICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NCaW5kaW5nKHZhckluc3RhbmNlLCBzY29wZSwgJ2RhdGFCaW5kaW5nJywgdGhpcy5nZXRCaW5kU291cmNlVGFyZ2V0KHZhckluc3RhbmNlKSk7XG4gICAgICAgICAgICAgICB2YXJJbnN0YW5jZS5odHRwU2VydmljZSA9IHRoaXMuaHR0cFNlcnZpY2U7XG4gICAgICAgICAgICAgICB2YXJJbnN0YW5jZS5kYXRlRm9ybWF0dGVyID0gbmV3IEZvcm1hdHRlcigpO1xuICAgICAgICAgICAgICAgLy8gTUVNT1JZIExFQUsgRklYOiBTdG9yZSBzdWJzY3JpcHRpb24gdW5zdWJzY3JpYmUgZnVuY3Rpb24gKGNsZWFudXAgaGFuZGxlZCBieSByZWdpc3RlckRlc3Ryb3lMaXN0ZW5lcilcbiAgICAgICAgICAgICAgIGNvbnN0IGFmdGVySW52b2tlVW5zdWJzY3JpYmUgPSB2YXJJbnN0YW5jZS5zdWJzY3JpYmUoJ2FmdGVySW52b2tlJywgKCkgPT4gJGludm9rZVdhdGNoZXJzKHRydWUpKTtcbiAgICAgICAgICAgICAgIC8vIFN0b3JlIG9uIHZhcmlhYmxlIGZvciBwb3RlbnRpYWwgbWFudWFsIGNsZWFudXAgaWYgbmVlZGVkXG4gICAgICAgICAgICAgICBpZiAoIXZhckluc3RhbmNlLl9ldmVudFN1YnNjcmlwdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICB2YXJJbnN0YW5jZS5fZXZlbnRTdWJzY3JpcHRpb25zID0gW107XG4gICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICB2YXJJbnN0YW5jZS5fZXZlbnRTdWJzY3JpcHRpb25zLnB1c2goYWZ0ZXJJbnZva2VVbnN1YnNjcmliZSk7XG4gICAgICAgICAgICAgICBpZiAodmFySW5zdGFuY2UuY2F0ZWdvcnkgPT09ICd3bS5MaXZlVmFyaWFibGUnICYmIHZhckluc3RhbmNlLm9wZXJhdGlvbiA9PT0gJ3JlYWQnKSB7XG4gICAgICAgICAgICAgICAgICAgcHJvY2Vzc0ZpbHRlckV4cEJpbmROb2RlKHZhckluc3RhbmNlLl9jb250ZXh0LCB2YXJJbnN0YW5jZS5maWx0ZXJFeHByZXNzaW9ucywgdmFySW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgaWYgKHZhckluc3RhbmNlLmNhdGVnb3J5ID09PSAnd20uQ3J1ZFZhcmlhYmxlJyB8fCB2YXJJbnN0YW5jZS5jYXRlZ29yeSA9PT0gJ3dtLlNlcnZpY2VWYXJpYWJsZScpIHtcbiAgICAgICAgICAgICAgICAgICB2YXJJbnN0YW5jZS5zaW11bGF0ZUZpbGVEb3dubG9hZCA9IHNpbXVsYXRlRmlsZURvd25sb2FkO1xuICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgIH1cblxuICAgICAgICAgICBpZiAodGhpcy5pc1ZhcmlhYmxlU2VwZXJhdGVkKHZhcmlhYmxlc0pzb24sIHZhcmlhYmxlTmFtZSkgfHwgdmFyaWFibGVzSnNvblt2YXJpYWJsZU5hbWVdLmNhdGVnb3J5ID09PSAnd20uVGltZXJBY3Rpb24nKSB7XG4gICAgICAgICAgICAgICBmb3IgKGNvbnN0IGUgaW4gVkFSSUFCTEVfQ09OU1RBTlRTLkVWRU5UKSB7XG4gICAgICAgICAgICAgICAgICAgaWYgKHZhckluc3RhbmNlW1ZBUklBQkxFX0NPTlNUQU5UUy5FVkVOVFtlXV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgdmFySW5zdGFuY2VbVkFSSUFCTEVfQ09OU1RBTlRTLkVWRU5UW2VdXSA9ICRwYXJzZUV2ZW50KHZhckluc3RhbmNlW1ZBUklBQkxFX0NPTlNUQU5UUy5FVkVOVFtlXV0pO1xuICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIC8vIGlmIGFjdGlvbiB0eXBlLCBwdXQgaXQgaW4gQWN0aW9ucyBuYW1lc3BhY2VcbiAgICAgICAgICAgIGlmICh2YXJJbnN0YW5jZSBpbnN0YW5jZW9mIEJhc2VBY3Rpb24pIHtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZUluc3RhbmNlcy5BY3Rpb25zW3ZhcmlhYmxlTmFtZV0gPSB2YXJJbnN0YW5jZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyaWFibGVJbnN0YW5jZXMuVmFyaWFibGVzW3ZhcmlhYmxlTmFtZV0gPSB2YXJJbnN0YW5jZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIHRoZSBjb250ZXh0IGhhcyBvbkRlc3Ryb3kgbGlzdGVuZXIsIHN1YnNjcmliZSB0aGUgZXZlbnQgYW5kIHRyaWdnZXIgY2FuY2VsIG9uIGFsbCB2YXJpYmFsZXNcbiAgICAgICAgaWYgKHNjb3BlLnJlZ2lzdGVyRGVzdHJveUxpc3RlbmVyKSB7XG4gICAgICAgICAgICBzY29wZS5yZWdpc3RlckRlc3Ryb3lMaXN0ZW5lcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5idWxrQ2FuY2VsKHZhcmlhYmxlSW5zdGFuY2VzLlZhcmlhYmxlcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5idWxrQ2FuY2VsKHZhcmlhYmxlSW5zdGFuY2VzLkFjdGlvbnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdmFyaWFibGVJbnN0YW5jZXM7XG4gICAgfVxuXG4gICAgZGVzdHJveSgpIHtcbiAgICB9XG5cbiAgICByZWdpc3RlckRlcGVuZGVuY3kobmFtZSwgcmVmKSB7XG4gICAgICAgIHNldERlcGVuZGVuY3kobmFtZSwgcmVmKTtcbiAgICAgICAgd21TZXREZXBlbmRlbmN5KG5hbWUsIHJlZik7XG4gICAgfVxufVxuIl19
212
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFyaWFibGVzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy92YXJpYWJsZXMvc3JjL3NlcnZpY2UvdmFyaWFibGVzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFekMsT0FBTyxFQUNILE1BQU0sRUFDTixXQUFXLEVBQ1gscUJBQXFCLEVBQ3JCLG1CQUFtQixFQUNuQix5QkFBeUIsRUFDekIsc0JBQXNCLEVBQUUsd0JBQXdCLEVBQUUsZUFBZSxFQUNwRSxNQUFNLFVBQVUsQ0FBQztBQUNsQixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFL0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzlELE9BQU8sRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsb0JBQW9CLEVBQWlCLE1BQU0sc0JBQXNCLENBQUM7QUFDckosT0FBTyxFQUFFLFVBQVUsRUFBRSxtQ0FBbUMsRUFBRSxhQUFhLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN4SSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDdEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDdEUsT0FBTyxFQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBQyxNQUFNLFdBQVcsQ0FBQzs7Ozs7OztBQUVoRSxNQUFNLE9BQU8sU0FBUztJQUNsQixNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU07UUFDaEIsT0FBUSxVQUFV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QztZQUM5QyxJQUFJLFdBQVcsWUFBWSxVQUFVLEVBQUUsQ0FBQztnQkFDcEMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLFdBQVcsQ0FBQztZQUMxRCxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osaUJBQWlCLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxHQUFHLFdBQVcsQ0FBQztZQUM1RCxDQUFDO1FBQ0wsQ0FBQztRQUVELGlHQUFpRztRQUNqRyxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1lBQ2hDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLEVBQUU7Z0JBQy9CLElBQUksQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDL0MsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO1FBRUQsT0FBTyxpQkFBaUIsQ0FBQztJQUM3QixDQUFDO0lBRUQsT0FBTztJQUNQLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsR0FBRztRQUN4QixhQUFhLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3pCLGVBQWUsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDL0IsQ0FBQzsrR0F6TVEsZ0JBQWdCO21IQUFoQixnQkFBZ0I7OzRGQUFoQixnQkFBZ0I7a0JBRDVCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQge1xuICAgICR3YXRjaCxcbiAgICAkcGFyc2VFdmVudCxcbiAgICBBYnN0cmFjdERpYWxvZ1NlcnZpY2UsXG4gICAgQWJzdHJhY3RIdHRwU2VydmljZSxcbiAgICBBYnN0cmFjdE5hdmlnYXRpb25TZXJ2aWNlLFxuICAgIEFic3RyYWN0VG9hc3RlclNlcnZpY2UsIHByb2Nlc3NGaWx0ZXJFeHBCaW5kTm9kZSwgJGludm9rZVdhdGNoZXJzLCBnZXRDbG9uZWRPYmplY3Rcbn0gZnJvbSAnQHdtL2NvcmUnO1xuaW1wb3J0IHsgT0F1dGhTZXJ2aWNlIH0gZnJvbSAnQHdtL29BdXRoJztcbmltcG9ydCB7IFNlY3VyaXR5U2VydmljZSB9IGZyb20gJ0B3bS9zZWN1cml0eSc7XG5cbmltcG9ydCB7IFZhcmlhYmxlRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3RvcnkvdmFyaWFibGUuZmFjdG9yeSc7XG5pbXBvcnQgeyB3bVNldERlcGVuZGVuY3ksIEJhc2VBY3Rpb24sIGdldFRhcmdldCwgc2V0VmFsdWVUb05vZGUsIGdldFRhcmdldE5vZGVLZXksIGludGVybmFsQm91bmROb2RlTWFwLCBEYXRlRm9ybWF0dGVyIH0gZnJvbSAnQHdhdmVtYWtlci92YXJpYWJsZXMnO1xuaW1wb3J0IHsgYXBwTWFuYWdlciwgYXBwbHlNdWx0aUluZGV4Rm9yRHVwbGljYXRlQmluZGluZ3MsIHNldERlcGVuZGVuY3ksIHNpbXVsYXRlRmlsZURvd25sb2FkIH0gZnJvbSAnLi4vdXRpbC92YXJpYWJsZS92YXJpYWJsZXMudXRpbHMnO1xuaW1wb3J0IHsgTWV0YWRhdGFTZXJ2aWNlIH0gZnJvbSAnLi9tZXRhZGF0YS1zZXJ2aWNlL21ldGFkYXRhLnNlcnZpY2UnO1xuaW1wb3J0IHsgVkFSSUFCTEVfQ09OU1RBTlRTIH0gZnJvbSAnLi4vY29uc3RhbnRzL3ZhcmlhYmxlcy5jb25zdGFudHMnO1xuaW1wb3J0IHtpc0FycmF5LCBpc0Z1bmN0aW9uLCBpc1VuZGVmaW5lZCwgc2V0fSBmcm9tIFwibG9kYXNoLWVzXCI7XG5cbmV4cG9ydCBjbGFzcyBGb3JtYXR0ZXIgaW1wbGVtZW50cyBEYXRlRm9ybWF0dGVyIHtcbiAgICBmb3JtYXQodmFsdWUsIGZvcm1hdCkge1xuICAgICAgICByZXR1cm4gIGFwcE1hbmFnZXIuZ2V0UGlwZSgnZGF0ZScpLnRyYW5zZm9ybSh2YWx1ZSwgZm9ybWF0KTtcbiAgICB9XG59XG5cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFZhcmlhYmxlc1NlcnZpY2Uge1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgaHR0cFNlcnZpY2U6IEFic3RyYWN0SHR0cFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbWV0YWRhdGFTZXJ2aWNlOiBNZXRhZGF0YVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbmF2aWdhdGlvblNlcnZpY2U6IEFic3RyYWN0TmF2aWdhdGlvblNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcm91dGVyU2VydmljZTogUm91dGVyLFxuICAgICAgICBwcml2YXRlIHRvYXN0ZXJTZXJ2aWNlOiBBYnN0cmFjdFRvYXN0ZXJTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIG9BdXRoU2VydmljZTogT0F1dGhTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHNlY3VyaXR5U2VydmljZTogU2VjdXJpdHlTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGRpYWxvZ1NlcnZpY2U6IEFic3RyYWN0RGlhbG9nU2VydmljZVxuICAgICkge1xuICAgICAgICAvLyBzZXQgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLCB0byBiZSB1c2VkIGFjcm9zcyB2YXJpYWJsZSBjbGFzc2VzLCBtYW5hZ2VycyBhbmQgdXRpbHNcbiAgICAgICAgc2V0RGVwZW5kZW5jeSgnaHR0cCcsIHRoaXMuaHR0cFNlcnZpY2UpO1xuICAgICAgICBzZXREZXBlbmRlbmN5KCdtZXRhZGF0YScsIHRoaXMubWV0YWRhdGFTZXJ2aWNlKTtcbiAgICAgICAgc2V0RGVwZW5kZW5jeSgnbmF2aWdhdGlvblNlcnZpY2UnLCB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlKTtcbiAgICAgICAgc2V0RGVwZW5kZW5jeSgncm91dGVyJywgdGhpcy5yb3V0ZXJTZXJ2aWNlKTtcbiAgICAgICAgc2V0RGVwZW5kZW5jeSgndG9hc3RlcicsIHRoaXMudG9hc3RlclNlcnZpY2UpO1xuICAgICAgICBzZXREZXBlbmRlbmN5KCdvQXV0aCcsIHRoaXMub0F1dGhTZXJ2aWNlKTtcbiAgICAgICAgc2V0RGVwZW5kZW5jeSgnc2VjdXJpdHknLCB0aGlzLnNlY3VyaXR5U2VydmljZSk7XG4gICAgICAgIHNldERlcGVuZGVuY3koJ2RpYWxvZycsIHRoaXMuZGlhbG9nU2VydmljZSk7XG4gICAgICAgIHdtU2V0RGVwZW5kZW5jeSgnb0F1dGgnLCB0aGlzLm9BdXRoU2VydmljZSk7XG4gICAgICAgIHdtU2V0RGVwZW5kZW5jeSgnc2VjdXJpdHknLCB0aGlzLnNlY3VyaXR5U2VydmljZSk7XG4gICAgICAgIHdtU2V0RGVwZW5kZW5jeSgnbWV0YWRhdGEnLCB0aGlzLm1ldGFkYXRhU2VydmljZSk7XG4gICAgICAgIHdtU2V0RGVwZW5kZW5jeSgnaHR0cCcsIHRoaXMuaHR0cFNlcnZpY2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGxvb3AgdGhyb3VnaCBhIGNvbGxlY3Rpb24gb2YgdmFyaWFibGVzL2FjdGlvbnNcbiAgICAgKiB0cmlnZ2VyIGNhbmNlbCBvbiBlYWNoIChvZiBleGlzdHMpXG4gICAgICogQHBhcmFtIGNvbGxlY3Rpb25cbiAgICAgKi9cbiAgICBidWxrQ2FuY2VsKGNvbGxlY3Rpb24pIHtcbiAgICAgICAgT2JqZWN0LmtleXMoY29sbGVjdGlvbikuZm9yRWFjaChuYW1lID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhcmlhYmxlID0gY29sbGVjdGlvbltuYW1lXTtcbiAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKHZhcmlhYmxlLmNhbmNlbCkpIHtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZS5jYW5jZWwoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogbG9vcHMgb3ZlciB0aGUgdmFyaWFibGUvYWN0aW9ucyBjb2xsZWN0aW9uIGFuZCB0cmlnZ2VyIGludm9rZSBvbiBpdCBpZiBzdGFydFVwZGF0ZSBvbiBpdCBpcyB0cnVlXG4gICAgICogQHBhcmFtIGNvbGxlY3Rpb25cbiAgICAgKi9cbiAgICB0cmlnZ2VyU3RhcnRVcGRhdGUoY29sbGVjdGlvbikge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhjb2xsZWN0aW9uKVxuICAgICAgICAgICAgICAgIC5tYXAobmFtZSA9PiBjb2xsZWN0aW9uW25hbWVdKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoIHZhcmlhYmxlID0+IHZhcmlhYmxlPy5zdGFydFVwZGF0ZSAmJiB2YXJpYWJsZS5pbnZva2UpXG4gICAgICAgICAgICAgICAgLm1hcCh2YXJpYWJsZSA9PiB2YXJpYWJsZS5pbnZva2UoKSlcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJvY2Vzc0JpbmRFeHAoZDogYW55LCBzY29wZTogYW55LCB2YXJpYWJsZSkge1xuICAgICAgICBjb25zdCByb290ID0gZ2V0VGFyZ2V0KHZhcmlhYmxlKSxcbiAgICAgICAgICAgIHRhcmdldE5vZGVLZXkgPSBnZXRUYXJnZXROb2RlS2V5KGQudGFyZ2V0KSxcbiAgICAgICAgICAgIHJ1bk1vZGUgPSB0cnVlO1xuICAgICAgICBsZXQgdiA9IGlzQXJyYXkoZC52YWx1ZSkgPyBkLnZhbHVlWzBdIDogZC52YWx1ZTtcbiAgICAgICAgaWYgKHYpIHtcbiAgICAgICAgICAgIGlmICh2LnN0YXJ0c1dpdGggJiYgdi5zdGFydHNXaXRoKCdiaW5kOicpKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2F0Y2hFeHByZXNzaW9uID0gJHdhdGNoKHYucmVwbGFjZSgnYmluZDonLCAnJyksIHNjb3BlLCB7fSwgdmFyaWFibGUuaW52b2tlT25QYXJhbUNoYW5nZS5iaW5kKHZhcmlhYmxlLCBkKSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGQsICgpID0+IHZhcmlhYmxlLmlzTXV0ZWQpO1xuICAgICAgICAgICAgICAgIHYgPSBzY29wZS5yZWdpc3RlckRlc3Ryb3lMaXN0ZW5lciA/IHNjb3BlLnJlZ2lzdGVyRGVzdHJveUxpc3RlbmVyKHdhdGNoRXhwcmVzc2lvbikgOiB3YXRjaEV4cHJlc3Npb247XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFpc1VuZGVmaW5lZChkLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHNldFZhbHVlVG9Ob2RlKGQudGFyZ2V0LCBkLCByb290LCB2YXJpYWJsZSwgZC52YWx1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHJ1bk1vZGUgJiYgcm9vdCAhPT0gdGFyZ2V0Tm9kZUtleSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWludGVybmFsQm91bmROb2RlTWFwLmhhcyh2YXJpYWJsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsQm91bmROb2RlTWFwLnNldCh2YXJpYWJsZSwge30pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHNldChpbnRlcm5hbEJvdW5kTm9kZU1hcC5nZXQodmFyaWFibGUpLCBbdmFyaWFibGUubmFtZSwgcm9vdCwgZC50YXJnZXRdLCBkLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IGQudGFyZ2V0LFxuICAgICAgICAgICAgdmFsdWU6IHZcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcHJvY2Vzc1NwaW5uZXJNZXNzYWdlQmluZGluZyh2YXJpYWJsZTogYW55LCBzY29wZTogYW55KSB7XG4gICAgICAgIGlmICghdmFyaWFibGUuc3Bpbm5lck1lc3NhZ2U/LnN0YXJ0c1dpdGg/LignYmluZDonKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGV4cHIgPSB2YXJpYWJsZS5zcGlubmVyTWVzc2FnZS5yZXBsYWNlKCdiaW5kOicsICcnKTtcbiAgICAgICAgdmFyaWFibGUuc3Bpbm5lck1lc3NhZ2UgPSAnJztcbiAgICAgICAgY29uc3Qgd2F0Y2hFeHByZXNzaW9uID0gJHdhdGNoKGV4cHIsIHNjb3BlLCB7fSwgbnYgPT4gdmFyaWFibGUuc3Bpbm5lck1lc3NhZ2UgPSBudiA/PyAnJyk7XG4gICAgICAgIHNjb3BlLnJlZ2lzdGVyRGVzdHJveUxpc3RlbmVyPy4od2F0Y2hFeHByZXNzaW9uKTtcbiAgICB9XG5cbiAgICBwcm9jZXNzQmluZGluZyh2YXJpYWJsZTogYW55LCBjb250ZXh0OiBhbnksIGJpbmRTb3VyY2U/OiBzdHJpbmcsIGJpbmRUYXJnZXQ/OiBzdHJpbmcpIHtcbiAgICAgICAgYmluZFNvdXJjZSA9IGJpbmRTb3VyY2UgfHwgJ2RhdGFCaW5kaW5nJztcbiAgICAgICAgYmluZFRhcmdldCA9IGJpbmRUYXJnZXQgfHwgJ2RhdGFCaW5kaW5nJztcblxuICAgICAgICBjb25zdCBiaW5kTWFwID0gdmFyaWFibGVbYmluZFNvdXJjZV07XG4gICAgICAgIHZhcmlhYmxlW2JpbmRTb3VyY2VdID0ge307XG4gICAgICAgIHZhcmlhYmxlWydfYmluZCcgKyBiaW5kU291cmNlXSA9IGJpbmRNYXA7XG4gICAgICAgIGlmICghYmluZE1hcCB8fCAhaXNBcnJheShiaW5kTWFwKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YXJpYWJsZS5jYXRlZ29yeSA9PT0gVkFSSUFCTEVfQ09OU1RBTlRTLkNBVEVHT1JZLlNFUlZJQ0UpIHtcbiAgICAgICAgICAgIGFwcGx5TXVsdGlJbmRleEZvckR1cGxpY2F0ZUJpbmRpbmdzKGJpbmRNYXApO1xuICAgICAgICB9XG4gICAgICAgIGJpbmRNYXAuZm9yRWFjaCggKG5vZGUpID0+IHtcbiAgICAgICAgICAgIC8qIGZvciBzdGF0aWMgdmFyaWFibGUgY2hhbmdlIHRoZSBiaW5kaW5nIHdpdGggdGFyZ2V0ICdkYXRhQmluZGluZycgdG8gJ2RhdGFTZXQnLCBhcyB0aGUgcmVzdWx0cyBoYXZlIHRvIHJlZmxlY3QgZGlyZWN0bHkgaW4gdGhlIGRhdGFTZXQgKi9cbiAgICAgICAgICAgIGlmICh2YXJpYWJsZS5jYXRlZ29yeSA9PT0gJ3dtLlZhcmlhYmxlJyAmJiBub2RlLnRhcmdldCA9PT0gJ2RhdGFCaW5kaW5nJykge1xuICAgICAgICAgICAgICAgIG5vZGUudGFyZ2V0ID0gJ2RhdGFTZXQnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wcm9jZXNzQmluZEV4cChub2RlLCBjb250ZXh0LCB2YXJpYWJsZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlzVmFyaWFibGVTZXBlcmF0ZWQodmFyaWFibGVzSnNvbiwgdmFyaWFibGVOYW1lKSB7XG4gICAgICAgIHJldHVybiB2YXJpYWJsZXNKc29uW3ZhcmlhYmxlTmFtZV0uY2F0ZWdvcnkgPT09ICd3bS5WYXJpYWJsZScgfHwgdmFyaWFibGVzSnNvblt2YXJpYWJsZU5hbWVdLmNhdGVnb3J5ID09PSAnd20uU2VydmljZVZhcmlhYmxlJyB8fFxuICAgICAgICAgICAgdmFyaWFibGVzSnNvblt2YXJpYWJsZU5hbWVdLmNhdGVnb3J5ID09PSAnd20uTGl2ZVZhcmlhYmxlJyB8fCB2YXJpYWJsZXNKc29uW3ZhcmlhYmxlTmFtZV0uY2F0ZWdvcnkgPT09ICd3bS5DcnVkVmFyaWFibGUnXG4gICAgfVxuXG4gICAgZ2V0QmluZFNvdXJjZVRhcmdldCh2YXJpYWJsZSkge1xuICAgICAgICBpZiAodmFyaWFibGUuY2F0ZWdvcnkgPT09ICd3bS5MaXZlVmFyaWFibGUnKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFyaWFibGUub3BlcmF0aW9uID09PSAncmVhZCcgPyAnZmlsdGVyRmllbGRzJyA6ICdpbnB1dEZpZWxkcyc7XG4gICAgICAgIH0gZWxzZSBpZiAodmFyaWFibGUuY2F0ZWdvcnkgPT09ICd3bS5Nb2RlbFZhcmlhYmxlJykge1xuICAgICAgICAgICAgcmV0dXJuICdkYXRhU2V0JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAnZGF0YUJpbmRpbmcnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGFrZXMgdGhlIHJhdyB2YXJpYWJsZXMgYW5kIGFjdGlvbnMganNvbiBhcyBpbnB1dFxuICAgICAqIEluaXRpYWxpemUgdGhlIHZhcmlhYmxlIGFuZCBhY3Rpb24gaW5zdGFuY2VzIHRocm91Z2ggdGhlIGZhY3RvcnlcbiAgICAgKiBjb2xsZWN0IHRoZSB2YXJpYWJsZXMgYW5kIGFjdGlvbnMgaW4gc2VwYXJhdGUgbWFwcyBhbmQgcmV0dXJuIHRoZSBjb2xsZWN0aW9uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHBhZ2VcbiAgICAgKiBAcGFyYW0gdmFyaWFibGVzSnNvblxuICAgICAqIEBwYXJhbSBzY29wZVxuICAgICAqIEByZXR1cm5zIHtWYXJpYWJsZXMgLCBBY3Rpb25zfVxuICAgICAqL1xuICAgIHJlZ2lzdGVyKHBhZ2U6IHN0cmluZywgdmFyaWFibGVzSnNvbjogYW55LCBzY29wZTogYW55KSB7XG4gICAgICAgIGNvbnN0IHZhcmlhYmxlSW5zdGFuY2VzID0ge1xuICAgICAgICAgICAgVmFyaWFibGVzOiB7fSxcbiAgICAgICAgICAgIEFjdGlvbnM6IHt9LFxuICAgICAgICAgICAgY2FsbGJhY2s6IHRoaXMudHJpZ2dlclN0YXJ0VXBkYXRlXG4gICAgICAgIH07XG4gICAgICAgIGxldCB2YXJJbnN0YW5jZTtcblxuICAgICAgICBmb3IgKGNvbnN0IHZhcmlhYmxlTmFtZSBpbiB2YXJpYWJsZXNKc29uKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJhbXM6IGFueSA9IHt9O1xuICAgICAgICAgICAgdmFySW5zdGFuY2UgPSBWYXJpYWJsZUZhY3RvcnkuY3JlYXRlKHZhcmlhYmxlc0pzb25bdmFyaWFibGVOYW1lXSwgc2NvcGUpO1xuICAgICAgICAgICAgdmFySW5zdGFuY2UuaW5pdCgpO1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzU3Bpbm5lck1lc3NhZ2VCaW5kaW5nKHZhckluc3RhbmNlLCBzY29wZSk7XG4gICAgICAgICAgIGlmICh0aGlzLmlzVmFyaWFibGVTZXBlcmF0ZWQodmFyaWFibGVzSnNvbiwgdmFyaWFibGVOYW1lKSkge1xuICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzQmluZGluZyh2YXJJbnN0YW5jZSwgc2NvcGUsICdkYXRhQmluZGluZycsIHRoaXMuZ2V0QmluZFNvdXJjZVRhcmdldCh2YXJJbnN0YW5jZSkpO1xuICAgICAgICAgICAgICAgdmFySW5zdGFuY2UuaHR0cFNlcnZpY2UgPSB0aGlzLmh0dHBTZXJ2aWNlO1xuICAgICAgICAgICAgICAgdmFySW5zdGFuY2UuZGF0ZUZvcm1hdHRlciA9IG5ldyBGb3JtYXR0ZXIoKTtcbiAgICAgICAgICAgICAgIC8vIE1FTU9SWSBMRUFLIEZJWDogU3RvcmUgc3Vic2NyaXB0aW9uIHVuc3Vic2NyaWJlIGZ1bmN0aW9uIChjbGVhbnVwIGhhbmRsZWQgYnkgcmVnaXN0ZXJEZXN0cm95TGlzdGVuZXIpXG4gICAgICAgICAgICAgICBjb25zdCBhZnRlckludm9rZVVuc3Vic2NyaWJlID0gdmFySW5zdGFuY2Uuc3Vic2NyaWJlKCdhZnRlckludm9rZScsICgpID0+ICRpbnZva2VXYXRjaGVycyh0cnVlKSk7XG4gICAgICAgICAgICAgICAvLyBTdG9yZSBvbiB2YXJpYWJsZSBmb3IgcG90ZW50aWFsIG1hbnVhbCBjbGVhbnVwIGlmIG5lZWRlZFxuICAgICAgICAgICAgICAgaWYgKCF2YXJJbnN0YW5jZS5fZXZlbnRTdWJzY3JpcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgdmFySW5zdGFuY2UuX2V2ZW50U3Vic2NyaXB0aW9ucyA9IFtdO1xuICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgdmFySW5zdGFuY2UuX2V2ZW50U3Vic2NyaXB0aW9ucy5wdXNoKGFmdGVySW52b2tlVW5zdWJzY3JpYmUpO1xuICAgICAgICAgICAgICAgaWYgKHZhckluc3RhbmNlLmNhdGVnb3J5ID09PSAnd20uTGl2ZVZhcmlhYmxlJyAmJiB2YXJJbnN0YW5jZS5vcGVyYXRpb24gPT09ICdyZWFkJykge1xuICAgICAgICAgICAgICAgICAgIHByb2Nlc3NGaWx0ZXJFeHBCaW5kTm9kZSh2YXJJbnN0YW5jZS5fY29udGV4dCwgdmFySW5zdGFuY2UuZmlsdGVyRXhwcmVzc2lvbnMsIHZhckluc3RhbmNlKTtcbiAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgIGlmICh2YXJJbnN0YW5jZS5jYXRlZ29yeSA9PT0gJ3dtLkNydWRWYXJpYWJsZScgfHwgdmFySW5zdGFuY2UuY2F0ZWdvcnkgPT09ICd3bS5TZXJ2aWNlVmFyaWFibGUnKSB7XG4gICAgICAgICAgICAgICAgICAgdmFySW5zdGFuY2Uuc2ltdWxhdGVGaWxlRG93bmxvYWQgPSBzaW11bGF0ZUZpbGVEb3dubG9hZDtcbiAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICB9XG5cbiAgICAgICAgICAgaWYgKHRoaXMuaXNWYXJpYWJsZVNlcGVyYXRlZCh2YXJpYWJsZXNKc29uLCB2YXJpYWJsZU5hbWUpIHx8IHZhcmlhYmxlc0pzb25bdmFyaWFibGVOYW1lXS5jYXRlZ29yeSA9PT0gJ3dtLlRpbWVyQWN0aW9uJykge1xuICAgICAgICAgICAgICAgZm9yIChjb25zdCBlIGluIFZBUklBQkxFX0NPTlNUQU5UUy5FVkVOVCkge1xuICAgICAgICAgICAgICAgICAgIGlmICh2YXJJbnN0YW5jZVtWQVJJQUJMRV9DT05TVEFOVFMuRVZFTlRbZV1dKSB7XG4gICAgICAgICAgICAgICAgICAgICAgIHZhckluc3RhbmNlW1ZBUklBQkxFX0NPTlNUQU5UUy5FVkVOVFtlXV0gPSAkcGFyc2VFdmVudCh2YXJJbnN0YW5jZVtWQVJJQUJMRV9DT05TVEFOVFMuRVZFTlRbZV1dKTtcbiAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICB9XG4gICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAvLyBpZiBhY3Rpb24gdHlwZSwgcHV0IGl0IGluIEFjdGlvbnMgbmFtZXNwYWNlXG4gICAgICAgICAgICBpZiAodmFySW5zdGFuY2UgaW5zdGFuY2VvZiBCYXNlQWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgdmFyaWFibGVJbnN0YW5jZXMuQWN0aW9uc1t2YXJpYWJsZU5hbWVdID0gdmFySW5zdGFuY2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlSW5zdGFuY2VzLlZhcmlhYmxlc1t2YXJpYWJsZU5hbWVdID0gdmFySW5zdGFuY2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiB0aGUgY29udGV4dCBoYXMgb25EZXN0cm95IGxpc3RlbmVyLCBzdWJzY3JpYmUgdGhlIGV2ZW50IGFuZCB0cmlnZ2VyIGNhbmNlbCBvbiBhbGwgdmFyaWJhbGVzXG4gICAgICAgIGlmIChzY29wZS5yZWdpc3RlckRlc3Ryb3lMaXN0ZW5lcikge1xuICAgICAgICAgICAgc2NvcGUucmVnaXN0ZXJEZXN0cm95TGlzdGVuZXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYnVsa0NhbmNlbCh2YXJpYWJsZUluc3RhbmNlcy5WYXJpYWJsZXMpO1xuICAgICAgICAgICAgICAgIHRoaXMuYnVsa0NhbmNlbCh2YXJpYWJsZUluc3RhbmNlcy5BY3Rpb25zKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhcmlhYmxlSW5zdGFuY2VzO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJEZXBlbmRlbmN5KG5hbWUsIHJlZikge1xuICAgICAgICBzZXREZXBlbmRlbmN5KG5hbWUsIHJlZik7XG4gICAgICAgIHdtU2V0RGVwZW5kZW5jeShuYW1lLCByZWYpO1xuICAgIH1cbn1cbiJdfQ==
@@ -15,6 +15,24 @@ import { concat, forEach, get, includes, isArray, isEmpty, isNull, isObject, isU
15
15
  const isBodyTypeQueryOrProcedure = (variable) => {
16
16
  return (includes(['QueryExecution', 'ProcedureExecution'], variable.controller)) && (includes(['put', 'post'], variable.operationType));
17
17
  };
18
+ const appendQueryParam = (queryParams, paramName, paramValue, preEncoded = false) => {
19
+ const encodedValue = preEncoded ? paramValue : encodeURIComponent(paramValue);
20
+ const pair = `${paramName}=${encodedValue}`;
21
+ return queryParams ? `${queryParams}&${pair}` : `?${pair}`;
22
+ };
23
+ const getQueryParamValues = (param, paramValue) => {
24
+ if (isArray(paramValue)) {
25
+ // 'multi' (duplicate query-param bindings) repeats the param, e.g. tag=a&tag=b.
26
+ if (param.collectionFormat === 'multi') {
27
+ return map(paramValue, (value) => ({ value, preEncoded: false }));
28
+ }
29
+ // Otherwise, join into a single comma-separated value, e.g. tag=a,b. Encode each
30
+ // element individually so the joining commas stay literal (unambiguously the
31
+ // separator) while a comma inside an element's own value stays escaped as %2C.
32
+ return [{ value: map(paramValue, (value) => encodeURIComponent(value)).join(','), preEncoded: true }];
33
+ }
34
+ return [{ value: paramValue, preEncoded: false }];
35
+ };
18
36
  /**
19
37
  * returns true if the variable is a Query service variable
20
38
  * @param {string} controller
@@ -232,12 +250,12 @@ export class ServiceVariableUtils {
232
250
  if (isNull(paramValue) && isQueryServiceVar(variable.controller, variable.serviceType)) {
233
251
  break;
234
252
  }
235
- if (!queryParams) {
236
- queryParams = '?' + param.name + '=' + encodeURIComponent(paramValue);
237
- }
238
- else {
239
- queryParams += '&' + param.name + '=' + encodeURIComponent(paramValue);
240
- }
253
+ getQueryParamValues(param, paramValue).forEach(({ value: queryValue, preEncoded }) => {
254
+ if (isNull(queryValue) && isQueryServiceVar(variable.controller, variable.serviceType)) {
255
+ return;
256
+ }
257
+ queryParams = appendQueryParam(queryParams, param.name, queryValue, preEncoded);
258
+ });
241
259
  break;
242
260
  case 'PATH':
243
261
  /* replacing the path param based on the regular expression in the relative path */
@@ -373,4 +391,4 @@ export class ServiceVariableUtils {
373
391
  });
374
392
  }
375
393
  }
376
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS12YXJpYWJsZS51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhcmlhYmxlcy9zcmMvdXRpbC92YXJpYWJsZS9zZXJ2aWNlLXZhcmlhYmxlLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXBGLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2pJLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzFELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDakUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3ZFLE9BQU8sRUFDSCxNQUFNLEVBQ04sT0FBTyxFQUNQLEdBQUcsRUFDSCxRQUFRLEVBQ1IsT0FBTyxFQUNQLE9BQU8sRUFDUCxNQUFNLEVBQ04sUUFBUSxFQUNSLFdBQVcsRUFDWCxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFDakIsT0FBTyxFQUFFLE9BQU8sRUFDbkIsTUFBTSxXQUFXLENBQUM7QUFFbkI7Ozs7OztHQU1HO0FBQ0gsTUFBTSwwQkFBMEIsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFO0lBQzVDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxvQkFBb0IsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxFQUFFLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO0FBQzVJLENBQUMsQ0FBQztBQUVGOzs7OztHQUtHO0FBQ0gsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLFVBQWtCLEVBQUUsV0FBbUIsRUFBRSxFQUFFO0lBQ2xFLE9BQU8sVUFBVSxLQUFLLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxLQUFLLElBQUksV0FBVyxLQUFLLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7QUFDM0gsQ0FBQyxDQUFDO0FBRUY7Ozs7O0dBS0c7QUFDSCxNQUFNLFdBQVcsR0FBRyxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEVBQUU7SUFDaEQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUMxRSxnQkFBZ0IsR0FBRyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQztJQUMvRixJQUFJLHFCQUFxQixFQUFFLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsU0FBUyxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEtBQUssUUFBUSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO1lBQ2pGLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZCLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzVDLENBQUM7WUFDRCxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDNUMsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxTQUFTLEtBQUssTUFBTSxFQUFFLENBQUM7Z0JBQzlDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsVUFBVSxVQUFVO29CQUNwQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxVQUFVLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzVHLENBQUMsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsVUFBVSxFQUFFLGdCQUFnQixDQUFDLEVBQUUsVUFBVSxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0RyxDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ3BCLENBQUM7QUFDTCxDQUFDLENBQUM7QUFFRjs7Ozs7R0FLRztBQUNILE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLEVBQUU7SUFDN0MsTUFBTSxXQUFXLEdBQUcsRUFBRSxFQUNsQixhQUFhLEdBQUcsRUFBRSxDQUFDO0lBQ3ZCLElBQUksVUFBVSxDQUFDO0lBQ2YsT0FBTyxDQUFDLE1BQU0sRUFBRSxVQUFVLEtBQUs7UUFDM0IsVUFBVSxHQUFHLEdBQUcsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksVUFBVSxLQUFLLEVBQUUsSUFBSSxVQUFVLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzFGLFVBQVUsR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO1lBQzFGLGtGQUFrRjtZQUNsRixJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxPQUFPLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUN2RSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN2QyxDQUFDO1lBQ0QsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxVQUFVLENBQUM7UUFDekMsQ0FBQzthQUFNLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3hCLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0MsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTztRQUNILGFBQWEsRUFBRSxXQUFXO1FBQzFCLGVBQWUsRUFBRSxhQUFhO0tBQ2pDLENBQUM7QUFDTixDQUFDLENBQUM7QUFFRjs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFFO0lBQ3JDLE1BQU0sUUFBUSxHQUFHLEVBQUUsRUFDZixpQkFBaUIsR0FBRyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsaUJBQWlCLEVBQ3JFLFlBQVksR0FBRyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDO0lBQzNFLE9BQU8sQ0FBQyxPQUFPLEVBQUUsVUFBVSxHQUFHLEVBQUUsR0FBRztRQUMvQixJQUFJLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ2pELFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDeEIsQ0FBQzthQUFNLENBQUM7WUFDSixRQUFRLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUN2QyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLFFBQVEsQ0FBQztBQUNwQixDQUFDLENBQUM7QUFFRixNQUFNLE9BQU8sb0JBQW9CO0lBQzdCOzs7Ozs7T0FNRztJQUNILE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxPQUFRO1FBQ3hFLFFBQVEsR0FBRyxRQUFRLElBQUksRUFBRSxDQUFDO1FBRTFCLDhEQUE4RDtRQUM5RCxJQUFJLGFBQWEsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUN6QixPQUFPO2dCQUNILE9BQU8sRUFBRztvQkFDTixNQUFNLEVBQUUsa0JBQWtCLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUI7b0JBQ2xFLFNBQVMsRUFBRSxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLGlCQUFpQjtvQkFDcEUsT0FBTyxFQUFFLHlCQUF5QjtpQkFDckM7YUFDSixDQUFDO1FBQ04sQ0FBQzthQUFNLElBQUksT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7WUFDaEMsT0FBTztnQkFDSCxPQUFPLEVBQUc7b0JBQ04sTUFBTSxFQUFFLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCO29CQUNqRSxTQUFTLEVBQUUsa0JBQWtCLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0I7b0JBQ25FLE9BQU8sRUFBRSx5QkFBeUI7aUJBQ3JDO2FBQ0osQ0FBQztRQUNOLENBQUM7YUFBTSxJQUFJLGFBQWEsSUFBSSxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDaEQsT0FBTztnQkFDSCxPQUFPLEVBQUc7b0JBQ04sTUFBTSxFQUFFLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsc0JBQXNCO29CQUN2RSxTQUFTLEVBQUUsa0JBQWtCLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0I7b0JBQ3pFLE9BQU8sRUFBRSx5QkFBeUI7aUJBQ3JDO2FBQ0osQ0FBQztRQUNOLENBQUM7UUFFRCxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsVUFBVSxJQUFJLEVBQUUsRUFDakQsWUFBWSxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxRQUFRLEdBQUcsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLFlBQVksRUFDeEgsd0JBQXdCLEdBQUcsMEJBQTBCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEUsSUFBSSxXQUFXLEdBQUcsRUFBRSxFQUNwQixRQUFRLEVBQ1IsT0FBTyxHQUFHLEVBQUUsRUFDWixXQUFXLEVBQ1gsR0FBRyxFQUNILG9CQUFvQixHQUFHLEVBQUUsRUFDekIsTUFBTSxFQUNOLFlBQVksRUFDWixZQUFZLEVBQ1osV0FBVyxHQUFHLElBQUksRUFDbEIsS0FBSyxFQUNMLElBQUksRUFDSixNQUFNLEVBQ04sUUFBUSxFQUNSLFdBQVcsRUFDWCxjQUFjLEVBQ2QsTUFBTSxFQUNOLGVBQWUsRUFDZixXQUFXLEVBQ1gsZUFBZSxDQUFDO1FBRWhCLFNBQVMsY0FBYztZQUNuQixJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNYLE9BQU8sUUFBUSxDQUFDO1lBQ3BCLENBQUM7WUFDRCxRQUFRLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUMxQixPQUFPLFFBQVEsQ0FBQztRQUNwQixDQUFDO1FBRUQsZUFBZSxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFOUQsSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUNsQixRQUFRLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDM0IsS0FBSyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLE1BQU07b0JBQ3JELFdBQVcsR0FBRyxjQUFjLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO29CQUN4RyxJQUFJLFdBQVcsRUFBRSxDQUFDO3dCQUNkLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLEdBQUcsa0JBQWtCLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxXQUFXLENBQUM7b0JBQzFJLENBQUM7eUJBQU0sQ0FBQzt3QkFDSixPQUFPOzRCQUNILE9BQU8sRUFBRTtnQ0FDTCxNQUFNLEVBQUcsa0JBQWtCLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxjQUFjO2dDQUNoRSxTQUFTLEVBQUcsa0JBQWtCLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxjQUFjOzZCQUNyRTs0QkFDRCxpQkFBaUIsRUFBRSxlQUFlO3lCQUNyQyxDQUFDO29CQUNOLENBQUM7b0JBQ0QsTUFBTTtnQkFDVixLQUFLLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsS0FBSztvQkFDcEQsS0FBSyxHQUFHLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO29CQUN4QyxJQUFJLEdBQUcsV0FBVyxDQUFDLGtCQUFrQixDQUFDLENBQUM7b0JBQ3ZDLElBQUksS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO3dCQUNoQiwyQ0FBMkM7d0JBQzNDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLEdBQUcsa0JBQWtCLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQzt3QkFDbkosV0FBVyxHQUFHOzRCQUNWLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLEtBQUs7eUJBQzFELENBQUM7b0JBQ04sQ0FBQzt5QkFBTSxDQUFDO3dCQUNKLE9BQU87NEJBQ0gsT0FBTyxFQUFFO2dDQUNMLE1BQU0sRUFBRyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLGNBQWM7Z0NBQ2hFLFNBQVMsRUFBRSxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLGNBQWM7NkJBQ3BFOzRCQUNELGlCQUFpQixFQUFFLGVBQWU7eUJBQ3JDLENBQUM7b0JBQ04sQ0FBQztvQkFDRCxNQUFNO1lBQ2QsQ0FBQztRQUNMLENBQUM7UUFDRCwwRkFBMEY7UUFDMUYsZUFBZSxDQUFDLHNCQUFzQixDQUFDLGFBQWEsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFekUsYUFBYSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUMsYUFBYSxJQUFJLEVBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFDLENBQUM7UUFDeEYsTUFBTSxHQUFHLGFBQWEsQ0FBQyxVQUFVLElBQUksYUFBYSxDQUFDLFVBQVUsQ0FBQztRQUM5RCxXQUFXLEdBQUcsQ0FBQztZQUNYLE9BQU8sYUFBYSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUM7UUFDM0MsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNMLGVBQWUsR0FBRyxhQUFhLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQztRQUM5RCxHQUFHLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztRQUU5QyxxQ0FBcUM7UUFDckMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsVUFBVSxLQUFLO1lBQzdDLHdDQUF3QztZQUN4QyxTQUFTLG9CQUFvQjtnQkFDekIsSUFBSSxXQUFXLEVBQUUsQ0FBQztvQkFDZCx5RUFBeUU7b0JBQ3pFLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7d0JBQy9ELGNBQWMsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUM3QyxDQUFDO3lCQUFNLENBQUM7d0JBQ0osY0FBYyxHQUFHLFdBQVcsQ0FBQztvQkFDakMsQ0FBQztvQkFDRCxNQUFNLEdBQUcsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDN0QsQ0FBQztxQkFBTSxDQUFDO29CQUNKLG1CQUFtQjtvQkFDbkIsY0FBYyxHQUFHLFVBQVUsSUFBSSxFQUFFLENBQUM7b0JBQ2xDLE1BQU0sR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO2dCQUM1QixDQUFDO1lBQ0wsQ0FBQztZQUVELElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7WUFFbkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxVQUFVLEtBQUssSUFBSSxJQUFJLFVBQVUsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLHdCQUF3QixJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDN0gsbURBQW1EO2dCQUNuRCxJQUFJLFFBQVEsQ0FBQyxXQUFXLEtBQUssa0JBQWtCLENBQUMsWUFBWSxDQUFDLElBQUksSUFBSSxjQUFjLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0JBQzlGLFVBQVUsR0FBRyxVQUFVLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDcEQsQ0FBQztnQkFDRCxrRkFBa0Y7Z0JBQ2xGLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssUUFBUSxJQUFJLFFBQVEsQ0FBQyxXQUFXLEtBQUssa0JBQWtCLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO29CQUN4SSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDdkMsQ0FBQztnQkFDRCxRQUFRLEtBQUssQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztvQkFDeEMsS0FBSyxPQUFPO3dCQUNSLDREQUE0RDt3QkFDNUQsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksaUJBQWlCLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQzs0QkFDckYsTUFBTTt3QkFDVixDQUFDO3dCQUNELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQzs0QkFDZixXQUFXLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDO3dCQUMxRSxDQUFDOzZCQUFNLENBQUM7NEJBQ0osV0FBVyxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQzt3QkFDM0UsQ0FBQzt3QkFDRCxNQUFNO29CQUNWLEtBQUssTUFBTTt3QkFDUCxtRkFBbUY7d0JBQ25GLFlBQVksR0FBRyxJQUFJLE1BQU0sQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLElBQUksR0FBRyx1QkFBdUIsQ0FBQyxDQUFDO3dCQUNoRixHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDLENBQUM7d0JBQzVDLE1BQU07b0JBQ1YsS0FBSyxRQUFRO3dCQUNULE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDO3dCQUNqQyxNQUFNO29CQUNWLEtBQUssTUFBTTt3QkFDUCw0Q0FBNEM7d0JBQzVDLElBQUksd0JBQXdCLEVBQUUsQ0FBQzs0QkFDM0Isb0JBQW9CLEVBQUUsQ0FBQzs0QkFDdkIsUUFBUSxHQUFHLGtCQUFrQixDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUMsQ0FBQzs0QkFDdEQsV0FBVyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7NEJBQ25DLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsRUFBRSxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUM7d0JBQ2hGLENBQUM7NkJBQU0sQ0FBQzs0QkFDSixXQUFXLEdBQUcsVUFBVSxDQUFDO3dCQUM3QixDQUFDO3dCQUNELE1BQU07b0JBQ1YsS0FBSyxVQUFVO3dCQUNYLElBQUksd0JBQXdCLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQzs0QkFDNUUsb0JBQW9CLEVBQUUsQ0FBQzs0QkFDdkIsMERBQTBEOzRCQUMxRCxRQUFRLEdBQUcsa0JBQWtCLENBQUMsY0FBYyxFQUFFLE1BQU0sQ0FBQyxDQUFDOzRCQUN0RCxXQUFXLEdBQUcsV0FBVyxDQUFDLGNBQWMsRUFBRSxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUM7NEJBQ3pFLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsRUFBRSxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUM7d0JBQ2hGLENBQUM7NkJBQU0sQ0FBQzs0QkFDSixXQUFXLEdBQUcsV0FBVyxDQUFDLGNBQWMsRUFBRSxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQzt3QkFDbkUsQ0FBQzt3QkFDRCxNQUFNO2dCQUNkLENBQUM7WUFDTCxDQUFDO2lCQUFNLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUN4QixvQkFBb0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdEQsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsNENBQTRDO1FBQzVDLElBQUksb0JBQW9CLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDOUIsT0FBTztnQkFDSCxPQUFPLEVBQUU7b0JBQ0wsTUFBTSxFQUFFLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsc0JBQXNCO29CQUN2RSxPQUFPLEVBQUUsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztvQkFDdkMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLHNCQUFzQixFQUFFLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBQ3BILHlCQUF5QixFQUFFLElBQUk7aUJBQ2xDO2FBQ0osQ0FBQztRQUNOLENBQUM7UUFFRCwwRkFBMEY7UUFDMUYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMscUJBQXFCLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNqRSxzSEFBc0g7WUFDdEgsSUFBSSxDQUFDLENBQUMsYUFBYSxDQUFDLFFBQVEsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssWUFBWSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDN0csT0FBTyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLFFBQVEsSUFBSSxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksa0JBQWtCLENBQUM7WUFDMUcsQ0FBQztRQUNMLENBQUM7UUFFRCw0REFBNEQ7UUFDNUQsMkZBQTJGO1FBQzNGLElBQUksUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQztlQUMxRSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ2pGLGlEQUFpRDtZQUNqRCxJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUNkLFdBQVcsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRixDQUFDO1lBQ0QsT0FBTyxDQUFDLGNBQWMsQ0FBQyxHQUFHLFlBQVksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUM7UUFDMUUsQ0FBQzthQUFNLENBQUM7WUFDSixHQUFHLElBQUksV0FBVyxDQUFDO1FBQ3ZCLENBQUM7UUFFRDs7OztXQUlHO1FBQ0gsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNkLDZFQUE2RTtZQUN6RSxPQUFPLEdBQUcsQ0FBQyxRQUFRLENBQUMsV0FBVyxLQUFLLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLFdBQVcsS0FBSyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksYUFBYSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzlOLElBQUksUUFBUSxDQUFDLGFBQWEsRUFBRSxJQUFJLGtCQUFrQixDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDOUcsMkVBQTJFO2dCQUMzRSxHQUFHLEdBQUcsVUFBVSxHQUFHLFFBQVEsQ0FBQyxhQUFhLEVBQUUsR0FBRyxHQUFHLENBQUM7Z0JBQ2xELE1BQU0sR0FBRyx5QkFBeUIsQ0FBQztZQUN2QyxDQUFDO2lCQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQztnQkFDbkMsR0FBRyxHQUFHLFVBQVUsR0FBRyxHQUFHLENBQUM7WUFDM0IsQ0FBQztZQUNELEdBQUcsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUM7UUFDL0MsQ0FBQztRQUVELDJGQUEyRjtRQUMzRixNQUFNLGNBQWMsR0FBRyxlQUFlLENBQUMsaUJBQWlCLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ2xGLElBQUksY0FBYyxJQUFJLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN4QyxNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsa0JBQWtCLENBQUMsY0FBYyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDN0gsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDUCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO29CQUNsQixPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUM5QixDQUFDO3FCQUFNLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7b0JBQzdCLFdBQVcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUE7Z0JBQ3JDLENBQUM7cUJBQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDckIsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtnQkFDckIsQ0FBQztZQUNMLENBQUM7UUFDTCxDQUFDO1FBRUQsK0dBQStHO1FBQy9HLFlBQVksR0FBRztZQUNYLFdBQVcsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDbEMsS0FBSyxFQUFFLEdBQUc7WUFDVixRQUFRLEVBQUUsTUFBTTtZQUNoQixRQUFRLEVBQUUsTUFBTTtZQUNoQixTQUFTLEVBQUUsT0FBTztZQUNsQixNQUFNLEVBQUUsV0FBVztZQUNuQixhQUFhLEVBQUUsV0FBVztZQUMxQixjQUFjLEVBQUUsQ0FBQyxXQUFXO1lBQzVCLFVBQVUsRUFBRSxRQUFRLENBQUMsV0FBVyxLQUFLLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxJQUFJO1lBQ3pFLGlCQUFpQixFQUFFLGVBQWU7U0FDckMsQ0FBQztRQUVGLE9BQU8sWUFBWSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxNQUFNLENBQUMsbUJBQW1CLENBQUMsUUFBUTtRQUMvQixtR0FBbUc7UUFDbkcsT0FBTyxRQUFRLENBQUMsT0FBTyxLQUFLLGFBQWEsSUFBSSxRQUFRLENBQUMsU0FBUyxLQUFLLFlBQVksQ0FBQztJQUNyRixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLHVCQUF1QixDQUFDLE1BQU07UUFDakMsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ2hDLE9BQU8sUUFBUSxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0RSxDQUFDLENBQUMsRUFBRSxVQUFVLEtBQUs7WUFDZixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFDdEIsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleHRyYWN0VHlwZSwgZ2V0QmxvYiwgaXNEYXRlVGltZVR5cGUsIGlzRGVmaW5lZCwgcmVwbGFjZSB9IGZyb20gJ0B3bS9jb3JlJztcblxuaW1wb3J0IHsgJHJvb3RTY29wZSwgQ09OU1RBTlRTLCBTV0FHR0VSX0NPTlNUQU5UUywgVkFSSUFCTEVfQ09OU1RBTlRTLCBXU19DT05TVEFOVFMgfSBmcm9tICcuLi8uLi9jb25zdGFudHMvdmFyaWFibGVzLmNvbnN0YW50cyc7XG5pbXBvcnQgeyBpc0ZpbGVVcGxvYWRTdXBwb3J0ZWQgfSBmcm9tICcuL3ZhcmlhYmxlcy51dGlscyc7XG5pbXBvcnQgeyBnZXRBY2Nlc3NUb2tlbiB9IGZyb20gJy4vLi4vb0F1dGgudXRpbHMnO1xuaW1wb3J0IHsgZm9ybWF0RGF0ZSB9IGZyb20gJy4uLy4uL3V0aWwvdmFyaWFibGUvdmFyaWFibGVzLnV0aWxzJztcbmltcG9ydCB7IFBhZ2luYXRpb25VdGlscyB9IGZyb20gJy4uLy4uL3V0aWwvdmFyaWFibGUvcGFnaW5hdGlvbi51dGlscyc7XG5pbXBvcnQge1xuICAgIGNvbmNhdCxcbiAgICBmb3JFYWNoLFxuICAgIGdldCxcbiAgICBpbmNsdWRlcyxcbiAgICBpc0FycmF5LFxuICAgIGlzRW1wdHksXG4gICAgaXNOdWxsLFxuICAgIGlzT2JqZWN0LFxuICAgIGlzVW5kZWZpbmVkLFxuICAgIGpvaW4sIG1hcCwgcmVqZWN0LFxuICAgIHRvTG93ZXIsIHRvVXBwZXJcbn0gZnJvbSBcImxvZGFzaC1lc1wiO1xuXG4vKipcbiAqIHJldHVybnMgdHJ1ZSBpZiBhIFNlcnZpY2UgdmFyaWFibGUgaXM6XG4gKiAgLSBmb3IgYSBxdWVyeS9wcm9jZWR1cmVcbiAqICAtIHBlcmZvcm1zIGEgUFVUL1BPU1Qgb3BlcmF0aW9uLCBpLmUsIHRha2VzIGEgUmVxdWVzdCBCb2R5IGFzIGlucHV0XG4gKiBAcGFyYW0gdmFyaWFibGVcbiAqIEByZXR1cm5zIHthbnl9XG4gKi9cbmNvbnN0IGlzQm9keVR5cGVRdWVyeU9yUHJvY2VkdXJlID0gKHZhcmlhYmxlKSA9PiB7XG4gICAgcmV0dXJuIChpbmNsdWRlcyhbJ1F1ZXJ5RXhlY3V0aW9uJywgJ1Byb2NlZHVyZUV4ZWN1dGlvbiddLCB2YXJpYWJsZS5jb250cm9sbGVyKSkgJiYgKGluY2x1ZGVzKFsncHV0JywgJ3Bvc3QnXSwgdmFyaWFibGUub3BlcmF0aW9uVHlwZSkpO1xufTtcblxuLyoqXG4gKiByZXR1cm5zIHRydWUgaWYgdGhlIHZhcmlhYmxlIGlzIGEgUXVlcnkgc2VydmljZSB2YXJpYWJsZVxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRyb2xsZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBzZXJ2aWNlVHlwZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGlzUXVlcnlTZXJ2aWNlVmFyID0gKGNvbnRyb2xsZXI6IHN0cmluZywgc2VydmljZVR5cGU6IHN0cmluZykgPT4ge1xuICAgIHJldHVybiBjb250cm9sbGVyID09PSBWQVJJQUJMRV9DT05TVEFOVFMuQ09OVFJPTExFUl9UWVBFLlFVRVJZICYmIHNlcnZpY2VUeXBlID09PSBWQVJJQUJMRV9DT05TVEFOVFMuU0VSVklDRV9UWVBFLkRBVEE7XG59O1xuXG4vKipcbiAqIEFwcGVuZCBnaXZlbiB2YWx1ZSB0byB0aGUgZm9ybWRhdGFcbiAqIEBwYXJhbSBmb3JtRGF0YVxuICogQHBhcmFtIHBhcmFtIC0gUGFyYW0gZnJvbSB3aGljaCB2YWx1ZSBoYXMgdG8gYmUgdGFrZW5cbiAqIEBwYXJhbSBwYXJhbVZhbHVlIC0gVmFsdWUgd2hpY2ggaXMgdG8gYmUgYXBwZW5kZWQgdG8gZm9ybWRhdGFcbiAqL1xuY29uc3QgZ2V0Rm9ybURhdGEgPSAoZm9ybURhdGEsIHBhcmFtLCBwYXJhbVZhbHVlKSA9PiB7XG4gICAgY29uc3QgcGFyYW1UeXBlID0gdG9Mb3dlcihleHRyYWN0VHlwZShnZXQocGFyYW0sICdpdGVtcy50eXBlJykgfHwgcGFyYW0udHlwZSkpLFxuICAgICAgICBwYXJhbUNvbnRlbnRUeXBlID0gQ09OU1RBTlRTLmlzU3R1ZGlvTW9kZSA/IHBhcmFtWyd4LVdNLUNPTlRFTlRfVFlQRSddIDogcGFyYW0uY29udGVudFR5cGU7XG4gICAgaWYgKGlzRmlsZVVwbG9hZFN1cHBvcnRlZCgpKSB7XG4gICAgICAgIGlmICgocGFyYW1UeXBlICE9PSAnZmlsZScpICYmIChwYXJhbUNvbnRlbnRUeXBlID09PSAnc3RyaW5nJyB8fCAhcGFyYW1Db250ZW50VHlwZSkpIHtcbiAgICAgICAgICAgIGlmIChpc09iamVjdChwYXJhbVZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHBhcmFtVmFsdWUgPSBKU09OLnN0cmluZ2lmeShwYXJhbVZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChwYXJhbS5uYW1lLCBwYXJhbVZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChpc0FycmF5KHBhcmFtVmFsdWUpICYmIHBhcmFtVHlwZSA9PT0gJ2ZpbGUnKSB7XG4gICAgICAgICAgICAgICAgZm9yRWFjaChwYXJhbVZhbHVlLCBmdW5jdGlvbiAoZmlsZU9iamVjdCkge1xuICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQocGFyYW0ubmFtZSwgKGZpbGVPYmplY3QgJiYgZmlsZU9iamVjdC5jb250ZW50KSB8fCBnZXRCbG9iKGZpbGVPYmplY3QpLCBmaWxlT2JqZWN0Lm5hbWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQocGFyYW0ubmFtZSwgZ2V0QmxvYihwYXJhbVZhbHVlLCBwYXJhbUNvbnRlbnRUeXBlKSwgcGFyYW1WYWx1ZSAmJiBwYXJhbVZhbHVlLm5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3JtRGF0YTtcbiAgICB9XG59O1xuXG4vKipcbiAqIENoZWNrIGZvciBtaXNzaW5nIHJlcXVpcmVkIHBhcmFtcyBhbmQgZm9ybWF0IHRoZSBkYXRlL3RpbWUgcGFyYW0gdmFsdWVzXG4gKiBAcGFyYW0gaW5wdXREYXRhXG4gKiBAcGFyYW0gcGFyYW1zXG4gKiBAcmV0dXJucyB7e3JlcXVlc3RCb2R5OiB7fTsgbWlzc2luZ1BhcmFtczogYW55W119fVxuICovXG5jb25zdCBwcm9jZXNzUmVxdWVzdEJvZHkgPSAoaW5wdXREYXRhLCBwYXJhbXMpID0+IHtcbiAgICBjb25zdCByZXF1ZXN0Qm9keSA9IHt9LFxuICAgICAgICBtaXNzaW5nUGFyYW1zID0gW107XG4gICAgbGV0IHBhcmFtVmFsdWU7XG4gICAgZm9yRWFjaChwYXJhbXMsIGZ1bmN0aW9uIChwYXJhbSkge1xuICAgICAgICBwYXJhbVZhbHVlID0gZ2V0KGlucHV0RGF0YSwgcGFyYW0ubmFtZSk7XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQocGFyYW1WYWx1ZSkgJiYgcGFyYW1WYWx1ZSAhPT0gJycgJiYgcGFyYW1WYWx1ZSAhPT0gbnVsbCAmJiAhcGFyYW0ucmVhZE9ubHkpIHtcbiAgICAgICAgICAgIHBhcmFtVmFsdWUgPSBpc0RhdGVUaW1lVHlwZShwYXJhbS50eXBlKSA/IGZvcm1hdERhdGUocGFyYW1WYWx1ZSwgcGFyYW0udHlwZSkgOiBwYXJhbVZhbHVlO1xuICAgICAgICAgICAgLy8gQ29uc3RydWN0ICcsJyBzZXBhcmF0ZWQgc3RyaW5nIGlmIHBhcmFtIGlzIG5vdCBhcnJheSB0eXBlIGJ1dCB2YWx1ZSBpcyBhbiBhcnJheVxuICAgICAgICAgICAgaWYgKGlzQXJyYXkocGFyYW1WYWx1ZSkgJiYgdG9Mb3dlcihleHRyYWN0VHlwZShwYXJhbS50eXBlKSkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1WYWx1ZSA9IGpvaW4ocGFyYW1WYWx1ZSwgJywnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlcXVlc3RCb2R5W3BhcmFtLm5hbWVdID0gcGFyYW1WYWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXJhbS5yZXF1aXJlZCkge1xuICAgICAgICAgICAgbWlzc2luZ1BhcmFtcy5wdXNoKHBhcmFtLm5hbWUgfHwgcGFyYW0uaWQpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgJ3JlcXVlc3RCb2R5JzogcmVxdWVzdEJvZHksXG4gICAgICAgICdtaXNzaW5nUGFyYW1zJzogbWlzc2luZ1BhcmFtc1xuICAgIH07XG59O1xuXG4vKipcbiAqIERvbmUgb25seSBmb3IgSFRUUCBjYWxscyBtYWRlIHZpYSB0aGUgcHJveHkgc2VydmVyXG4gKiBHb2VzIHRob3VnaCByZXF1ZXN0IGhlYWRlcnMsIGFwcGVuZHMgJ1gtJyB0byBjZXJ0YWluIGhlYWRlcnNcbiAqIHRoZXNlIGhlYWRlcnMgbmVlZCBub3QgYmUgcHJvY2Vzc2VkIGF0IHByb3h5IHNlcnZlciBhbmQgc2hvdWxkIGRpcmVjdGx5IGJlIHBhc3NlZCB0byB0aGUgc2VydmVyXG4gKiBlLmcuIEF1dGhvcml6YXRpb24sIENvb2tpZSwgZXRjLlxuICogQHBhcmFtIGhlYWRlcnNcbiAqIEByZXR1cm5zIHt7fX1cbiAqL1xuY29uc3QgY2xvYWtIZWFkZXJzRm9yUHJveHkgPSAoaGVhZGVycykgPT4ge1xuICAgIGNvbnN0IF9oZWFkZXJzID0ge30sXG4gICAgICAgIFVOQ0xPQUtFRF9IRUFERVJTID0gVkFSSUFCTEVfQ09OU1RBTlRTLlJFU1RfU0VSVklDRS5VTkNMT0FLRURfSEVBREVSUyxcbiAgICAgICAgQ0xPQUtfUFJFRklYID0gVkFSSUFCTEVfQ09OU1RBTlRTLlJFU1RfU0VSVklDRS5QUkVGSVguQ0xPQUtfSEVBREVSX0tFWTtcbiAgICBmb3JFYWNoKGhlYWRlcnMsIGZ1bmN0aW9uICh2YWwsIGtleSkge1xuICAgICAgICBpZiAoaW5jbHVkZXMoVU5DTE9BS0VEX0hFQURFUlMsIGtleS50b1VwcGVyQ2FzZSgpKSkge1xuICAgICAgICAgICAgX2hlYWRlcnNba2V5XSA9IHZhbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF9oZWFkZXJzW0NMT0FLX1BSRUZJWCArIGtleV0gPSB2YWw7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBfaGVhZGVycztcbn07XG5cbmV4cG9ydCBjbGFzcyBTZXJ2aWNlVmFyaWFibGVVdGlscyB7XG4gICAgLyoqXG4gICAgICogcHJlcGFyZXMgdGhlIEhUVFAgcmVxdWVzdCBpbmZvIGZvciBhIFNlcnZpY2UgVmFyaWFibGVcbiAgICAgKiBAcGFyYW0gdmFyaWFibGVcbiAgICAgKiBAcGFyYW0gb3BlcmF0aW9uSW5mb1xuICAgICAqIEBwYXJhbSBpbnB1dEZpZWxkc1xuICAgICAqIEByZXR1cm5zIHthbnl9XG4gICAgICovXG4gICAgc3RhdGljIGNvbnN0cnVjdFJlcXVlc3RQYXJhbXModmFyaWFibGUsIG9wZXJhdGlvbkluZm8sIGlucHV0RmllbGRzLCBvcHRpb25zPykge1xuICAgICAgICB2YXJpYWJsZSA9IHZhcmlhYmxlIHx8IHt9O1xuXG4gICAgICAgIC8vIG9wZXJhdGlvbkluZm8gaXMgc3BlY2lmaWNhbGx5IG51bGwgZm9yIHVuX2F1dGhvcml6ZWQgYWNjZXNzXG4gICAgICAgIGlmIChvcGVyYXRpb25JbmZvID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICdlcnJvcicgOiB7XG4gICAgICAgICAgICAgICAgICAgICd0eXBlJzogVkFSSUFCTEVfQ09OU1RBTlRTLlJFU1RfU0VSVklDRS5FUlJfVFlQRS5VU0VSX1VOQVVUSE9SSVNFRCxcbiAgICAgICAgICAgICAgICAgICAgJ21lc3NhZ2UnOiBWQVJJQUJMRV9DT05TVEFOVFMuUkVTVF9TRVJWSUNFLkVSUl9NU0cuVVNFUl9VTkFVVEhPUklTRUQsXG4gICAgICAgICAgICAgICAgICAgICdmaWVsZCc6ICdfd21TZXJ2aWNlT3BlcmF0aW9uSW5mbydcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKGlzRW1wdHkob3BlcmF0aW9uSW5mbykpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgJ2Vycm9yJyA6IHtcbiAgICAgICAgICAgICAgICAgICAgJ3R5cGUnOiBWQVJJQUJMRV9DT05TVEFOVFMuUkVTVF9TRVJWSUNFLkVSUl9UWVBFLk1FVEFEQVRBX01JU1NJTkcsXG4gICAgICAgICAgICAgICAgICAgICdtZXNzYWdlJzogVkFSSUFCTEVfQ09OU1RBTlRTLlJFU1RfU0VSVklDRS5FUlJfTVNHLk1FVEFEQVRBX01JU1NJTkcsXG4gICAgICAgICAgICAgICAgICAgICdmaWVsZCc6ICdfd21TZXJ2aWNlT3BlcmF0aW9uSW5mbydcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbkluZm8gJiYgb3BlcmF0aW9uSW5mby5pbnZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICdlcnJvcicgOiB7XG4gICAgICAgICAgICAgICAgICAgICd0eXBlJzogVkFSSUFCTEVfQ09OU1RBTlRTLlJFU1RfU0VSVklDRS5FUlJfVFlQRS5DUlVEX09QRVJBVElPTl9NSVNTSU5HLFxuICAgICAgICAgICAgICAgICAgICAnbWVzc2FnZSc6IFZBUklBQkxFX0NPTlNUQU5UUy5SRVNUX1NFUlZJQ0UuRVJSX01TRy5DUlVEX09QRVJBVElPTl9NSVNTSU5HLFxuICAgICAgICAgICAgICAgICAgICAnZmllbGQnOiAnX3dtU2VydmljZU9wZXJhdGlvbkluZm8nXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRpcmVjdFBhdGggPSBvcGVyYXRpb25JbmZvLmRpcmVjdFBhdGggfHwgJycsXG4gICAgICAgIHJlbGF0aXZlUGF0aCA9IG9wZXJhdGlvbkluZm8uYmFzZVBhdGggPyBvcGVyYXRpb25JbmZvLmJhc2VQYXRoICsgb3BlcmF0aW9uSW5mby5yZWxhdGl2ZVBhdGggOiBvcGVyYXRpb25JbmZvLnJlbGF0aXZlUGF0aCxcbiAgICAgICAgaXNCb2R5VHlwZVF1ZXJ5UHJvY2VkdXJlID0gaXNCb2R5VHlwZVF1ZXJ5T3JQcm9jZWR1cmUodmFyaWFibGUpO1xuICAgICAgICBsZXQgcXVlcnlQYXJhbXMgPSAnJyxcbiAgICAgICAgYm9keUluZm8sXG4gICAgICAgIGhlYWRlcnMgPSB7fSxcbiAgICAgICAgcmVxdWVzdEJvZHksXG4gICAgICAgIHVybCxcbiAgICAgICAgcmVxdWlyZWRQYXJhbU1pc3NpbmcgPSBbXSxcbiAgICAgICAgdGFyZ2V0LFxuICAgICAgICBwYXRoUGFyYW1SZXgsXG4gICAgICAgIGludm9rZVBhcmFtcyxcbiAgICAgICAgYXV0aERldGFpbHMgPSBudWxsLFxuICAgICAgICB1bmFtZSxcbiAgICAgICAgcHN3ZCxcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICBmb3JtRGF0YSxcbiAgICAgICAgaXNQcm94eUNhbGwsXG4gICAgICAgIHBhcmFtVmFsdWVJbmZvLFxuICAgICAgICBwYXJhbXMsXG4gICAgICAgIHNlY3VyaXR5RGVmbk9iaixcbiAgICAgICAgYWNjZXNzVG9rZW4sXG4gICAgICAgIHdpdGhDcmVkZW50aWFscztcblxuICAgICAgICBmdW5jdGlvbiBnZXRGb3JtRGF0YU9iaigpIHtcbiAgICAgICAgICAgIGlmIChmb3JtRGF0YSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmb3JtRGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICAgICAgICByZXR1cm4gZm9ybURhdGE7XG4gICAgICAgIH1cblxuICAgICAgICBzZWN1cml0eURlZm5PYmogPSBnZXQob3BlcmF0aW9uSW5mby5zZWN1cml0eURlZmluaXRpb25zLCAnMCcpO1xuXG4gICAgICAgIGlmIChzZWN1cml0eURlZm5PYmopIHtcbiAgICAgICAgICAgIHN3aXRjaCAoc2VjdXJpdHlEZWZuT2JqLnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFZBUklBQkxFX0NPTlNUQU5UUy5SRVNUX1NFUlZJQ0UuU0VDVVJJVFlfREVGTi5PQVVUSDI6XG4gICAgICAgICAgICAgICAgICAgIGFjY2Vzc1Rva2VuID0gZ2V0QWNjZXNzVG9rZW4oc2VjdXJpdHlEZWZuT2JqW1ZBUklBQkxFX0NPTlNUQU5UUy5SRVNUX1NFUlZJQ0UuT0FVVEhfUFJPVklERVJfS0VZXSwgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3NUb2tlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyc1tWQVJJQUJMRV9DT05TVEFOVFMuUkVTVF9TRVJWSUNFLkFVVEhfSERSX0tFWV0gPSBWQVJJQUJMRV9DT05TVEFOVFMuUkVTVF9TRVJWSUNFLlBSRUZJWC5BVVRIX0hEUl9WQUwuT0FVVEggKyAnICcgKyBhY2Nlc3NUb2tlbjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Vycm9yJzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZScgOiBWQVJJQUJMRV9DT05TVEFOVFMuUkVTVF9TRVJWSUNFLkVSUl9UWVBFLk5PX0FDQ0VTU1RPS0VOLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWVzc2FnZScgOiBWQVJJQUJMRV9DT05TVEFOVFMuUkVTVF9TRVJWSUNFLkVSUl9NU0cuTk9fQUNDRVNTVE9LRU5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZWN1cml0eURlZm5PYmonOiBzZWN1cml0eURlZm5PYmpcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBWQVJJQUJMRV9DT05TVEFOVFMuUkVTVF9TRVJWSUNFLlNFQ1VSSVRZX0RFRk4uQkFTSUM6XG4gICAgICAgICAgICAgICAgICAgIHVuYW1lID0gaW5wdXRGaWVsZHNbJ3dtX2F1dGhfdXNlcm5hbWUnXTtcbiAgICAgICAgICAgICAgICAgICAgcHN3ZCA9IGlucHV0RmllbGRzWyd3bV9hdXRoX3Bhc3N3b3JkJ107XG4gICAgICAgICAgICAgICAgICAgIGlmICh1bmFtZSAmJiBwc3dkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPW1ZJQkhVXTogYmFzNjQgZW5jb2RpbmcgYWx0ZXJuYXRpdmUuXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzW1ZBUklBQkxFX0NPTlNUQU5UUy5SRVNUX1NFUlZJQ0UuQVVUSF9IRFJfS0VZXSA9IFZBUklBQkxFX0NPTlNUQU5UUy5SRVNUX1NFUlZJQ0UuUFJFRklYLkFVVEhfSERSX1ZBTC5CQVNJQyArICcgJyArIGJ0b2EodW5hbWUgKyAnOicgKyBwc3dkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhEZXRhaWxzID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJzogVkFSSUFCTEVfQ09OU1RBTlRTLlJFU1RfU0VSVklDRS5BVVRIX1RZUEUuQkFTSUNcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlcnJvcic6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnIDogVkFSSUFCTEVfQ09OU1RBTlRTLlJFU1RfU0VSVklDRS5FUlJfVFlQRS5OT19DUkVERU5USUFMUyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21lc3NhZ2UnOiBWQVJJQUJMRV9DT05TVEFOVFMuUkVTVF9TRVJWSUNFLkVSUl9NU0cuTk9fQ1JFREVOVElBTFNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZWN1cml0eURlZm5PYmonOiBzZWN1cml0eURlZm5PYmpcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gc2V0IHF1ZXJ5IHBhcmFtcywgaWYgcGFnaW5hdGlvbiBpbmZvIGlzIHByZXNlbnQgYW5kIHRoZSBpbmZvIHNob3VsZCBiZSBwcmVzZW50IGluIHF1ZXJ5XG4gICAgICAgIFBhZ2luYXRpb25VdGlscy5jaGVja1BhZ2luYXRpb25BdFF1ZXJ5KG9wZXJhdGlvbkluZm8sIHZhcmlhYmxlLCBvcHRpb25zKTtcblxuICAgICAgICBvcGVyYXRpb25JbmZvLnByb3h5U2V0dGluZ3MgPSBvcGVyYXRpb25JbmZvLnByb3h5U2V0dGluZ3MgfHwge3dlYjogdHJ1ZSwgbW9iaWxlOiBmYWxzZX07XG4gICAgICAgIG1ldGhvZCA9IG9wZXJhdGlvbkluZm8uaHR0cE1ldGhvZCB8fCBvcGVyYXRpb25JbmZvLm1ldGhvZFR5cGU7XG4gICAgICAgIGlzUHJveHlDYWxsID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBvcGVyYXRpb25JbmZvLnByb3h5U2V0dGluZ3Mud2ViO1xuICAgICAgICB9KCkpO1xuICAgICAgICB3aXRoQ3JlZGVudGlhbHMgPSBvcGVyYXRpb25JbmZvLnByb3h5U2V0dGluZ3Mud2l0aENyZWRlbnRpYWxzO1xuICAgICAgICB1cmwgPSBpc1Byb3h5Q2FsbCA/IHJlbGF0aXZlUGF0aCA6IGRpcmVjdFBhdGg7XG5cbiAgICAgICAgLyogbG9vcCB0aHJvdWdoIGFsbCB0aGUgcGFyYW1ldGVycyAqL1xuICAgICAgICBmb3JFYWNoKG9wZXJhdGlvbkluZm8ucGFyYW1ldGVycywgZnVuY3Rpb24gKHBhcmFtKSB7XG4gICAgICAgICAgICAvLyBTZXQgcGFyYW1zIGJhc2VkIG9uIGN1cnJlbnQgd29ya3NwYWNlXG4gICAgICAgICAgICBmdW5jdGlvbiBzZXRQYXJhbXNPZkNoaWxkTm9kZSgpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXRGaWVsZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lmaWMgY2FzZSBmb3IgYm9keSB0eXBlIHF1ZXJ5L3Byb2NlZHVyZSB2YXJpYWJsZSB3aXRoIHF1ZXJ5IHBhcmFtc1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRGaWVsZHNbcGFyYW0ubmFtZV0gJiYgaXNPYmplY3QoaW5wdXRGaWVsZHNbcGFyYW0ubmFtZV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbVZhbHVlSW5mbyA9IGlucHV0RmllbGRzW3BhcmFtLm5hbWVdO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1WYWx1ZUluZm8gPSBpbnB1dEZpZWxkcztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwYXJhbXMgPSBnZXQob3BlcmF0aW9uSW5mbywgWydkZWZpbml0aW9ucycsIHBhcmFtLnR5cGVdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBGb3IgQXBpIERlc2lnbmVyXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtVmFsdWVJbmZvID0gcGFyYW1WYWx1ZSB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gcGFyYW0uY2hpbGRyZW47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgcGFyYW1WYWx1ZSA9IHBhcmFtLnNhbXBsZVZhbHVlO1xuXG4gICAgICAgICAgICBpZiAoKGlzRGVmaW5lZChwYXJhbVZhbHVlKSAmJiBwYXJhbVZhbHVlICE9PSBudWxsICYmIHBhcmFtVmFsdWUgIT09ICcnKSB8fCAoaXNCb2R5VHlwZVF1ZXJ5UHJvY2VkdXJlICYmIHBhcmFtLnR5cGUgIT09ICdmaWxlJykpIHtcbiAgICAgICAgICAgICAgICAvLyBGb3JtYXQgZGF0ZVRpbWUgcGFyYW1zIGZvciBkYXRhU2VydmljZSB2YXJpYWJsZXNcbiAgICAgICAgICAgICAgICBpZiAodmFyaWFibGUuc2VydmljZVR5cGUgPT09IFZBUklBQkxFX0NPTlNUQU5UUy5TRVJWSUNFX1RZUEUuREFUQSAmJiBpc0RhdGVUaW1lVHlwZShwYXJhbS50eXBlKSkge1xuICAgICAgICAgICAgICAgICAgICBwYXJhbVZhbHVlID0gZm9ybWF0RGF0ZShwYXJhbVZhbHVlLCBwYXJhbS50eXBlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQ29uc3RydWN0ICcsJyBzZXBhcmF0ZWQgc3RyaW5nIGlmIHBhcmFtIGlzIG5vdCBhcnJheSB0eXBlIGJ1dCB2YWx1ZSBpcyBhbiBhcnJheVxuICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KHBhcmFtVmFsdWUpICYmIHRvTG93ZXIoZXh0cmFjdFR5cGUocGFyYW0udHlwZSkpID09PSAnc3RyaW5nJyAmJiB2YXJpYWJsZS5zZXJ2aWNlVHlwZSA9PT0gVkFSSUFCTEVfQ09OU1RBTlRTLlNFUlZJQ0VfVFlQRS5EQVRBKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtVmFsdWUgPSBqb2luKHBhcmFtVmFsdWUsICcsJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN3aXRjaCAocGFyYW0ucGFyYW1ldGVyVHlwZS50b1VwcGVyQ2FzZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ1FVRVJZJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBudWxsIHZhbHVlZCBxdWVyeSBwYXJhbXMgZm9yIHF1ZXJ5U2VydmljZSB2YXJpYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTnVsbChwYXJhbVZhbHVlKSAmJiBpc1F1ZXJ5U2VydmljZVZhcih2YXJpYWJsZS5jb250cm9sbGVyLCB2YXJpYWJsZS5zZXJ2aWNlVHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcXVlcnlQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtcyA9ICc/JyArIHBhcmFtLm5hbWUgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQocGFyYW1WYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zICs9ICcmJyArIHBhcmFtLm5hbWUgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQocGFyYW1WYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnUEFUSCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAvKiByZXBsYWNpbmcgdGhlIHBhdGggcGFyYW0gYmFzZWQgb24gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBpbiB0aGUgcmVsYXRpdmUgcGF0aCAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFBhcmFtUmV4ID0gbmV3IFJlZ0V4cCgnXFxcXHMqXFxcXHtcXFxccyonICsgcGFyYW0ubmFtZSArICcoOlxcXFwuXFxcXCspP1xcXFxzKlxcXFx9XFxcXHMqJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSB1cmwucmVwbGFjZShwYXRoUGFyYW1SZXgsIHBhcmFtVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ0hFQURFUic6XG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzW3BhcmFtLm5hbWVdID0gcGFyYW1WYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdCT0RZJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBwb3N0L3B1dCBxdWVyeSBtZXRob2RzIHdyYXAgdGhlIGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNCb2R5VHlwZVF1ZXJ5UHJvY2VkdXJlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UGFyYW1zT2ZDaGlsZE5vZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5SW5mbyA9IHByb2Nlc3NSZXF1ZXN0Qm9keShwYXJhbVZhbHVlSW5mbywgcGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Qm9keSA9IGJvZHlJbmZvLnJlcXVlc3RCb2R5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkUGFyYW1NaXNzaW5nID0gY29uY2F0KHJlcXVpcmVkUGFyYW1NaXNzaW5nLCBib2R5SW5mby5taXNzaW5nUGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEJvZHkgPSBwYXJhbVZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ0ZPUk1EQVRBJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0JvZHlUeXBlUXVlcnlQcm9jZWR1cmUgJiYgcGFyYW0ubmFtZSA9PT0gU1dBR0dFUl9DT05TVEFOVFMuV01fREFUQV9KU09OKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UGFyYW1zT2ZDaGlsZE5vZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcm9jZXNzIHF1ZXJ5L3Byb2NlZHVyZSBmb3JtRGF0YSBub24tZmlsZSBwYXJhbXMgcGFyYW1zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keUluZm8gPSBwcm9jZXNzUmVxdWVzdEJvZHkocGFyYW1WYWx1ZUluZm8sIHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEJvZHkgPSBnZXRGb3JtRGF0YShnZXRGb3JtRGF0YU9iaigpLCBwYXJhbSwgYm9keUluZm8ucmVxdWVzdEJvZHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkUGFyYW1NaXNzaW5nID0gY29uY2F0KHJlcXVpcmVkUGFyYW1NaXNzaW5nLCBib2R5SW5mby5taXNzaW5nUGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEJvZHkgPSBnZXRGb3JtRGF0YShnZXRGb3JtRGF0YU9iaigpLCBwYXJhbSwgcGFyYW1WYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtLnJlcXVpcmVkKSB7XG4gICAgICAgICAgICAgICAgcmVxdWlyZWRQYXJhbU1pc3NpbmcucHVzaChwYXJhbS5uYW1lIHx8IHBhcmFtLmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gaWYgcmVxdWlyZWQgcGFyYW0gbm90IGZvdW5kLCByZXR1cm4gZXJyb3JcbiAgICAgICAgaWYgKHJlcXVpcmVkUGFyYW1NaXNzaW5nLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAnZXJyb3InOiB7XG4gICAgICAgICAgICAgICAgICAgICd0eXBlJzogVkFSSUFCTEVfQ09OU1RBTlRTLlJFU1RfU0VSVklDRS5FUlJfVFlQRS5SRVFVSVJFRF9GSUVMRF9NSVNTSU5HLFxuICAgICAgICAgICAgICAgICAgICAnZmllbGQnOiByZXF1aXJlZFBhcmFtTWlzc2luZy5qb2luKCcsJyksXG4gICAgICAgICAgICAgICAgICAgICdtZXNzYWdlJzogcmVwbGFjZShWQVJJQUJMRV9DT05TVEFOVFMuUkVTVF9TRVJWSUNFLkVSUl9NU0cuUkVRVUlSRURfRklFTERfTUlTU0lORywgW3JlcXVpcmVkUGFyYW1NaXNzaW5nLmpvaW4oJywnKV0pLFxuICAgICAgICAgICAgICAgICAgICAnc2tpcERlZmF1bHROb3RpZmljYXRpb24nOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldHRpbmcgYXBwcm9wcmlhdGUgY29udGVudC1UeXBlIGZvciByZXF1ZXN0IGFjY2VwdGluZyByZXF1ZXN0IGJvZHkgbGlrZSBQT1NULCBQVVQsIGV0Y1xuICAgICAgICBpZiAoIWluY2x1ZGVzKFdTX0NPTlNUQU5UUy5OT05fQk9EWV9IVFRQX01FVEhPRFMsIHRvVXBwZXIobWV0aG9kKSkpIHtcbiAgICAgICAgICAgIC8qQmFzZWQgb24gdGhlIGZvcm1EYXRhIGJyb3dzZXIgd2lsbCBhdXRvbWF0aWNhbGx5IHNldCB0aGUgY29udGVudCB0eXBlIHRvICdtdWx0aXBhcnQvZm9ybS1kYXRhJyBhbmQgd2Via2l0IGJvdW5kYXJ5Ki9cbiAgICAgICAgICAgIGlmICghKG9wZXJhdGlvbkluZm8uY29uc3VtZXMgJiYgKG9wZXJhdGlvbkluZm8uY29uc3VtZXNbMF0gPT09IFdTX0NPTlNUQU5UUy5DT05URU5UX1RZUEVTLk1VTFRJUEFSVF9GT1JNREFUQSkpKSB7XG4gICAgICAgICAgICAgICAgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAob3BlcmF0aW9uSW5mby5jb25zdW1lcyAmJiBvcGVyYXRpb25JbmZvLmNvbnN1bWVzWzBdKSB8fCAnYXBwbGljYXRpb24vanNvbic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiB0aGUgY29uc3VtZXMgaGFzIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCBhbmRcbiAgICAgICAgLy8gaWYgdGhlIGh0dHAgcmVxdWVzdCBvZiBnaXZlbiBtZXRob2QgdHlwZSBjYW4gaGF2ZSBib2R5IHNlbmQgdGhlIHF1ZXJ5UGFyYW1zIGFzIEZvcm0gRGF0YVxuICAgICAgICBpZiAoaW5jbHVkZXMob3BlcmF0aW9uSW5mby5jb25zdW1lcywgV1NfQ09OU1RBTlRTLkNPTlRFTlRfVFlQRVMuRk9STV9VUkxfRU5DT0RFRClcbiAgICAgICAgICAgICYmICFpbmNsdWRlcyhXU19DT05TVEFOVFMuTk9OX0JPRFlfSFRUUF9NRVRIT0RTLCAobWV0aG9kIHx8ICcnKS50b1VwcGVyQ2FzZSgpKSkge1xuICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSAnPycgYXQgdGhlIHN0YXJ0IG9mIHRoZSBxdWVyeVBhcmFtc1xuICAgICAgICAgICAgaWYgKHF1ZXJ5UGFyYW1zKSB7XG4gICAgICAgICAgICAgICAgcmVxdWVzdEJvZHkgPSAocmVxdWVzdEJvZHkgPyByZXF1ZXN0Qm9keSArICcmJyA6ICcnKSArIHF1ZXJ5UGFyYW1zLnN1YnN0cmluZygxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gV1NfQ09OU1RBTlRTLkNPTlRFTlRfVFlQRVMuRk9STV9VUkxfRU5DT0RFRDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVybCArPSBxdWVyeVBhcmFtcztcbiAgICAgICAgfVxuXG4gICAgICAgIC8qXG4gICAgICAgICAqIGZvciBwcm94eSBjYWxsczpcbiAgICAgICAgICogIC0gY2xvYWsgdGhlIHByb3BlciBoZWFkZXJzIChyZXF1aXJlZCBvbmx5IGZvciBSRVNUIHNlcnZpY2VzKVxuICAgICAgICAgKiAgLSBwcmVwYXJlIGNvbXBsZXRlIHVybCBmcm9tIHJlbGF0aXZlVXJsXG4gICAgICAgICAqL1xuICAgICAgICBpZiAoaXNQcm94eUNhbGwpIHtcbiAgICAgICAgICAgIC8vIGF2b2lkaW5nIGNsb2FrSGVhZGVyc0ZvclByb3h5IHdoZW4gdGhlIG1ldGhvZCBpcyBpbnZva2VkIGZyb20gYXBpZGVzaWduZXIuXG4gICAgICAgICAgICAgICAgaGVhZGVycyA9ICh2YXJpYWJsZS5zZXJ2aWNlVHlwZSAhPT0gVkFSSUFCTEVfQ09OU1RBTlRTLlNFUlZJQ0VfVFlQRS5SRVNUICYmIHZhcmlhYmxlLnNlcnZpY2VUeXBlICE9PSBWQVJJQUJMRV9DT05TVEFOVFMuU0VSVklDRV9UWVBFLk9QRU5BUEkpIHx8IG9wZXJhdGlvbkluZm8uc2tpcENsb2FrSGVhZGVycyA/IGhlYWRlcnMgOiBjbG9ha0hlYWRlcnNGb3JQcm94eShoZWFkZXJzKTtcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZS5nZXRQcmVmYWJOYW1lKCkgJiYgVkFSSUFCTEVfQ09OU1RBTlRTLlJFU1RfU1VQUE9SVEVEX1NFUlZJQ0VTLmluZGV4T2YodmFyaWFibGUuc2VydmljZVR5cGUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIC8qIGlmIGl0IGlzIGEgcHJlZmFiIHZhcmlhYmxlICh1c2VkIGluIGEgbm9ybWFsIHByb2plY3QpLCBtb2RpZnkgdGhlIHVybCAqL1xuICAgICAgICAgICAgICAgIHVybCA9ICdwcmVmYWJzLycgKyB2YXJpYWJsZS5nZXRQcmVmYWJOYW1lKCkgKyB1cmw7XG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gJ2ludm9rZVByZWZhYlJlc3RTZXJ2aWNlJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXZhcmlhYmxlLmdldFByZWZhYk5hbWUoKSkge1xuICAgICAgICAgICAgICAgIHVybCA9ICdzZXJ2aWNlcycgKyB1cmw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1cmwgPSAkcm9vdFNjb3BlLnByb2plY3QuZGVwbG95ZWRVcmwgKyB1cmw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBwYWdpbmF0aW9uIGluZm8gZXhpc3RzLCBwcm9jZXNzIGluZm8gaW4gcmVxdWVzdCBoZWFkZXJzIG9yIGJvZHkgYmFzZWQgb24gdGhlIG1ldGFkYXRhXG4gICAgICAgIGNvbnN0IHBhZ2luYXRpb25JbmZvID0gUGFnaW5hdGlvblV0aWxzLmdldFBhZ2luYXRpb25JbmZvKG9wZXJhdGlvbkluZm8sIHZhcmlhYmxlKTtcbiAgICAgICAgaWYgKHBhZ2luYXRpb25JbmZvICYmIHZhcmlhYmxlLnBhZ2luYXRpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3AgPSBQYWdpbmF0aW9uVXRpbHMuc2V0UGFnaW5hdGlvbkF0UmVxKHBhZ2luYXRpb25JbmZvLCBvcGVyYXRpb25JbmZvLCB2YXJpYWJsZSwgaGVhZGVycywgcmVxdWVzdEJvZHksIHVybCwgb3B0aW9ucyk7XG4gICAgICAgICAgICBpZiAocmVzcCkge1xuICAgICAgICAgICAgICAgIGlmIChyZXNwWydoZWFkZXJzJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVycyA9IHJlc3BbJ2hlYWRlcnMnXTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3BbJ3JlcXVlc3RCb2R5J10pIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEJvZHkgPSByZXNwWydyZXF1ZXN0Qm9keSddXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNwWyd1cmwnXSkge1xuICAgICAgICAgICAgICAgICAgICB1cmwgPSByZXNwWyd1cmwnXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qY3JlYXRpbmcgdGhlIHBhcmFtcyBuZWVkZWQgdG8gaW52b2tlIHRoZSBzZXJ2aWNlLiB1cmwgaXMgZ2VuZXJhdGVkIGZyb20gdGhlIHJlbGF0aXZlIHBhdGggZm9yIHRoZSBvcGVyYXRpb24qL1xuICAgICAgICBpbnZva2VQYXJhbXMgPSB7XG4gICAgICAgICAgICAncHJvamVjdElEJzogJHJvb3RTY29wZS5wcm9qZWN0LmlkLFxuICAgICAgICAgICAgJ3VybCc6IHVybCxcbiAgICAgICAgICAgICd0YXJnZXQnOiB0YXJnZXQsXG4gICAgICAgICAgICAnbWV0aG9kJzogbWV0aG9kLFxuICAgICAgICAgICAgJ2hlYWRlcnMnOiBoZWFkZXJzLFxuICAgICAgICAgICAgJ2RhdGEnOiByZXF1ZXN0Qm9keSxcbiAgICAgICAgICAgICdhdXRoRGV0YWlscyc6IGF1dGhEZXRhaWxzLFxuICAgICAgICAgICAgJ2lzRGlyZWN0Q2FsbCc6ICFpc1Byb3h5Q2FsbCxcbiAgICAgICAgICAgICdpc0V4dFVSTCc6IHZhcmlhYmxlLnNlcnZpY2VUeXBlID09PSBWQVJJQUJMRV9DT05TVEFOVFMuU0VSVklDRV9UWVBFLlJFU1QsXG4gICAgICAgICAgICAnd2l0aENyZWRlbnRpYWxzJzogd2l0aENyZWRlbnRpYWxzXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIGludm9rZVBhcmFtcztcbiAgICB9XG5cbiAgICBzdGF0aWMgaXNGaWxlVXBsb2FkUmVxdWVzdCh2YXJpYWJsZSkge1xuICAgICAgICAvLyB0ZW1wb3JhcnkgZml4LCBoYXZlIHRvIGZpbmQgcHJvcGVyIHNvbHV0aW9uIGZvciBkZWNpZGluZyB3ZWF0aGVyIHRvIHVwbG9hZCBmaWxlIHRocm91Z2ggdmFyaWFibGVcbiAgICAgICAgcmV0dXJuIHZhcmlhYmxlLnNlcnZpY2UgPT09ICdGaWxlU2VydmljZScgJiYgdmFyaWFibGUub3BlcmF0aW9uID09PSAndXBsb2FkRmlsZSc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhcnJheSBvZiBxdWVyeSBwYXJhbSBuYW1lcyBmb3IgdmFyaWFibGUgb3RoZXIgdGhlbiBwYWdlLHNpemUsc29ydFxuICAgICAqIEBwYXJhbXMge3BhcmFtc30gcGFyYW1zIG9mIHRoZSB2YXJpYWJsZVxuICAgICAqL1xuICAgIHN0YXRpYyBleGNsdWRlUGFnaW5hdGlvblBhcmFtcyhwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIG1hcChyZWplY3QocGFyYW1zLCAocGFyYW0pID0+IHtcbiAgICAgICAgICAgIHJldHVybiBpbmNsdWRlcyhWQVJJQUJMRV9DT05TVEFOVFMuUEFHSU5BVElPTl9QQVJBTVMsIHBhcmFtLm5hbWUpO1xuICAgICAgICB9KSwgZnVuY3Rpb24gKHBhcmFtKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyYW0ubmFtZTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl19
394
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS12YXJpYWJsZS51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhcmlhYmxlcy9zcmMvdXRpbC92YXJpYWJsZS9zZXJ2aWNlLXZhcmlhYmxlLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXBGLE9BQU8sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2pJLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzFELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDakUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3ZFLE9BQU8sRUFDSCxNQUFNLEVBQ04sT0FBTyxFQUNQLEdBQUcsRUFDSCxRQUFRLEVBQ1IsT0FBTyxFQUNQLE9BQU8sRUFDUCxNQUFNLEVBQ04sUUFBUSxFQUNSLFdBQVcsRUFDWCxJQUFJLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFDakIsT0FBTyxFQUFFLE9BQU8sRUFDbkIsTUFBTSxXQUFXLENBQUM7QUFFbkI7Ozs7OztHQU1HO0FBQ0gsTUFBTSwwQkFBMEIsR0FBRyxDQUFDLFFBQVEsRUFBRSxFQUFFO0lBQzVDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxvQkFBb0IsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxFQUFFLFFBQVEsQ0FBQyxhQUFh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QUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNoQyxPQUFPLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEUsQ0FBQyxDQUFDLEVBQUUsVUFBVSxLQUFLO1lBQ2YsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXh0cmFjdFR5cGUsIGdldEJsb2IsIGlzRGF0ZVRpbWVUeXBlLCBpc0RlZmluZWQsIHJlcGxhY2UgfSBmcm9tICdAd20vY29yZSc7XG5cbmltcG9ydCB7ICRyb290U2NvcGUsIENPTlNUQU5UUywgU1dBR0dFUl9DT05TVEFOVFMsIFZBUklBQkxFX0NPTlNUQU5UUywgV1NfQ09OU1RBTlRTIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzL3ZhcmlhYmxlcy5jb25zdGFudHMnO1xuaW1wb3J0IHsgaXNGaWxlVXBsb2FkU3VwcG9ydGVkIH0gZnJvbSAnLi92YXJpYWJsZXMudXRpbHMnO1xuaW1wb3J0IHsgZ2V0QWNjZXNzVG9rZW4gfSBmcm9tICcuLy4uL29BdXRoLnV0aWxzJztcbmltcG9ydCB7IGZvcm1hdERhdGUgfSBmcm9tICcuLi8uLi91dGlsL3ZhcmlhYmxlL3ZhcmlhYmxlcy51dGlscyc7XG5pbXBvcnQgeyBQYWdpbmF0aW9uVXRpbHMgfSBmcm9tICcuLi8uLi91dGlsL3ZhcmlhYmxlL3BhZ2luYXRpb24udXRpbHMnO1xuaW1wb3J0IHtcbiAgICBjb25jYXQsXG4gICAgZm9yRWFjaCxcbiAgICBnZXQsXG4gICAgaW5jbHVkZXMsXG4gICAgaXNBcnJheSxcbiAgICBpc0VtcHR5LFxuICAgIGlzTnVsbCxcbiAgICBpc09iamVjdCxcbiAgICBpc1VuZGVmaW5lZCxcbiAgICBqb2luLCBtYXAsIHJlamVjdCxcbiAgICB0b0xvd2VyLCB0b1VwcGVyXG59IGZyb20gXCJsb2Rhc2gtZXNcIjtcblxuLyoqXG4gKiByZXR1cm5zIHRydWUgaWYgYSBTZXJ2aWNlIHZhcmlhYmxlIGlzOlxuICogIC0gZm9yIGEgcXVlcnkvcHJvY2VkdXJlXG4gKiAgLSBwZXJmb3JtcyBhIFBVVC9QT1NUIG9wZXJhdGlvbiwgaS5lLCB0YWtlcyBhIFJlcXVlc3QgQm9keSBhcyBpbnB1dFxuICogQHBhcmFtIHZhcmlhYmxlXG4gKiBAcmV0dXJucyB7YW55fVxuICovXG5jb25zdCBpc0JvZHlUeXBlUXVlcnlPclByb2NlZHVyZSA9ICh2YXJpYWJsZSkgPT4ge1xuICAgIHJldHVybiAoaW5jbHVkZXMoWydRdWVyeUV4ZWN1dGlvbicsICdQcm9jZWR1cmVFeGVjdXRpb24nXSwgdmFyaWFibGUuY29udHJvbGxlcikpICYmIChpbmNsdWRlcyhbJ3B1dCcsICdwb3N0J10sIHZhcmlhYmxlLm9wZXJhdGlvblR5cGUpKTtcbn07XG5cbmNvbnN0IGFwcGVuZFF1ZXJ5UGFyYW0gPSAocXVlcnlQYXJhbXMsIHBhcmFtTmFtZSwgcGFyYW1WYWx1ZSwgcHJlRW5jb2RlZCA9IGZhbHNlKSA9PiB7XG4gICAgY29uc3QgZW5jb2RlZFZhbHVlID0gcHJlRW5jb2RlZCA/IHBhcmFtVmFsdWUgOiBlbmNvZGVVUklDb21wb25lbnQocGFyYW1WYWx1ZSk7XG4gICAgY29uc3QgcGFpciA9IGAke3BhcmFtTmFtZX09JHtlbmNvZGVkVmFsdWV9YDtcbiAgICByZXR1cm4gcXVlcnlQYXJhbXMgPyBgJHtxdWVyeVBhcmFtc30mJHtwYWlyfWAgOiBgPyR7cGFpcn1gO1xufTtcblxuY29uc3QgZ2V0UXVlcnlQYXJhbVZhbHVlcyA9IChwYXJhbSwgcGFyYW1WYWx1ZSkgPT4ge1xuICAgIGlmIChpc0FycmF5KHBhcmFtVmFsdWUpKSB7XG4gICAgICAgIC8vICdtdWx0aScgKGR1cGxpY2F0ZSBxdWVyeS1wYXJhbSBiaW5kaW5ncykgcmVwZWF0cyB0aGUgcGFyYW0sIGUuZy4gdGFnPWEmdGFnPWIuXG4gICAgICAgIGlmIChwYXJhbS5jb2xsZWN0aW9uRm9ybWF0ID09PSAnbXVsdGknKSB7XG4gICAgICAgICAgICByZXR1cm4gbWFwKHBhcmFtVmFsdWUsICh2YWx1ZSkgPT4gKHt2YWx1ZSwgcHJlRW5jb2RlZDogZmFsc2V9KSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCBqb2luIGludG8gYSBzaW5nbGUgY29tbWEtc2VwYXJhdGVkIHZhbHVlLCBlLmcuIHRhZz1hLGIuIEVuY29kZSBlYWNoXG4gICAgICAgIC8vIGVsZW1lbnQgaW5kaXZpZHVhbGx5IHNvIHRoZSBqb2luaW5nIGNvbW1hcyBzdGF5IGxpdGVyYWwgKHVuYW1iaWd1b3VzbHkgdGhlXG4gICAgICAgIC8vIHNlcGFyYXRvcikgd2hpbGUgYSBjb21tYSBpbnNpZGUgYW4gZWxlbWVudCdzIG93biB2YWx1ZSBzdGF5cyBlc2NhcGVkIGFzICUyQy5cbiAgICAgICAgcmV0dXJuIFt7dmFsdWU6IG1hcChwYXJhbVZhbHVlLCAodmFsdWUpID0+IGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkpLmpvaW4oJywnKSwgcHJlRW5jb2RlZDogdHJ1ZX1dO1xuICAgIH1cbiAgICByZXR1cm4gW3t2YWx1ZTogcGFyYW1WYWx1ZSwgcHJlRW5jb2RlZDogZmFsc2V9XTtcbn07XG5cbi8qKlxuICogcmV0dXJucyB0cnVlIGlmIHRoZSB2YXJpYWJsZSBpcyBhIFF1ZXJ5IHNlcnZpY2UgdmFyaWFibGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250cm9sbGVyXG4gKiBAcGFyYW0ge3N0cmluZ30gc2VydmljZVR5cGVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBpc1F1ZXJ5U2VydmljZVZhciA9IChjb250cm9sbGVyOiBzdHJpbmcsIHNlcnZpY2VUeXBlOiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gY29udHJvbGxlciA9PT0gVkFSSUFCTEVfQ09OU1RBTlRTLkNPTlRST0xMRVJfVFlQRS5RVUVSWSAmJiBzZXJ2aWNlVHlwZSA9PT0gVkFSSUFCTEVfQ09OU1RBTlRTLlNFUlZJQ0VfVFlQRS5EQVRBO1xufTtcblxuLyoqXG4gKiBBcHBlbmQgZ2l2ZW4gdmFsdWUgdG8gdGhlIGZvcm1kYXRhXG4gKiBAcGFyYW0gZm9ybURhdGFcbiAqIEBwYXJhbSBwYXJhbSAtIFBhcmFtIGZyb20gd2hpY2ggdmFsdWUgaGFzIHRvIGJlIHRha2VuXG4gKiBAcGFyYW0gcGFyYW1WYWx1ZSAtIFZhbHVlIHdoaWNoIGlzIHRvIGJlIGFwcGVuZGVkIHRvIGZvcm1kYXRhXG4gKi9cbmNvbnN0IGdldEZvcm1EYXRhID0gKGZvcm1EYXRhLCBwYXJhbSwgcGFyYW1WYWx1ZSkgPT4ge1xuICAgIGNvbnN0IHBhcmFtVHlwZSA9IHRvTG93ZXIoZXh0cmFjdFR5cGUoZ2V0KHBhcmFtLCAnaXRlbXMudHlwZScpIHx8IHBhcmFtLnR5cGUpKSxcbiAgICAgICAgcGFyYW1Db250ZW50VHlwZSA9IENPTlNUQU5UUy5pc1N0dWRpb01vZGUgPyBwYXJhbVsneC1XTS1DT05URU5UX1RZUEUnXSA6IHBhcmFtLmNvbnRlbnRUeXBlO1xuICAgIGlmIChpc0ZpbGVVcGxvYWRTdXBwb3J0ZWQoKSkge1xuICAgICAgICBpZiAoKHBhcmFtVHlwZSAhPT0gJ2ZpbGUnKSAmJiAocGFyYW1Db250ZW50VHlwZSA9PT0gJ3N0cmluZycgfHwgIXBhcmFtQ29udGVudFR5cGUpKSB7XG4gICAgICAgICAgICBpZiAoaXNPYmplY3QocGFyYW1WYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBwYXJhbVZhbHVlID0gSlNPTi5zdHJpbmdpZnkocGFyYW1WYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQocGFyYW0ubmFtZSwgcGFyYW1WYWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoaXNBcnJheShwYXJhbVZhbHVlKSAmJiBwYXJhbVR5cGUgPT09ICdmaWxlJykge1xuICAgICAgICAgICAgICAgIGZvckVhY2gocGFyYW1WYWx1ZSwgZnVuY3Rpb24gKGZpbGVPYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKHBhcmFtLm5hbWUsIChmaWxlT2JqZWN0ICYmIGZpbGVPYmplY3QuY29udGVudCkgfHwgZ2V0QmxvYihmaWxlT2JqZWN0KSwgZmlsZU9iamVjdC5uYW1lKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKHBhcmFtLm5hbWUsIGdldEJsb2IocGFyYW1WYWx1ZSwgcGFyYW1Db250ZW50VHlwZSksIHBhcmFtVmFsdWUgJiYgcGFyYW1WYWx1ZS5uYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm9ybURhdGE7XG4gICAgfVxufTtcblxuLyoqXG4gKiBDaGVjayBmb3IgbWlzc2luZyByZXF1aXJlZCBwYXJhbXMgYW5kIGZvcm1hdCB0aGUgZGF0ZS90aW1lIHBhcmFtIHZhbHVlc1xuICogQHBhcmFtIGlucHV0RGF0YVxuICogQHBhcmFtIHBhcmFtc1xuICogQHJldHVybnMge3tyZXF1ZXN0Qm9keToge307IG1pc3NpbmdQYXJhbXM6IGFueVtdfX1cbiAqL1xuY29uc3QgcHJvY2Vzc1JlcXVlc3RCb2R5ID0gKGlucHV0RGF0YSwgcGFyYW1zKSA9PiB7XG4gICAgY29uc3QgcmVxdWVzdEJvZHkgPSB7fSxcbiAgICAgICAgbWlzc2luZ1BhcmFtcyA9IFtdO1xuICAgIGxldCBwYXJhbVZhbHVlO1xuICAgIGZvckVhY2gocGFyYW1zLCBmdW5jdGlvbiAocGFyYW0pIHtcbiAgICAgICAgcGFyYW1WYWx1ZSA9IGdldChpbnB1dERhdGEsIHBhcmFtLm5hbWUpO1xuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKHBhcmFtVmFsdWUpICYmIHBhcmFtVmFsdWUgIT09ICcnICYmIHBhcmFtVmFsdWUgIT09IG51bGwgJiYgIXBhcmFtLnJlYWRPbmx5KSB7XG4gICAgICAgICAgICBwYXJhbVZhbHVlID0gaXNEYXRlVGltZVR5cGUocGFyYW0udHlwZSkgPyBmb3JtYXREYXRlKHBhcmFtVmFsdWUsIHBhcmFtLnR5cGUpIDogcGFyYW1WYWx1ZTtcbiAgICAgICAgICAgIC8vIENvbnN0cnVjdCAnLCcgc2VwYXJhdGVkIHN0cmluZyBpZiBwYXJhbSBpcyBub3QgYXJyYXkgdHlwZSBidXQgdmFsdWUgaXMgYW4gYXJyYXlcbiAgICAgICAgICAgIGlmIChpc0FycmF5KHBhcmFtVmFsdWUpICYmIHRvTG93ZXIoZXh0cmFjdFR5cGUocGFyYW0udHlwZSkpID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHBhcmFtVmFsdWUgPSBqb2luKHBhcmFtVmFsdWUsICcsJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXF1ZXN0Qm9keVtwYXJhbS5uYW1lXSA9IHBhcmFtVmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAocGFyYW0ucmVxdWlyZWQpIHtcbiAgICAgICAgICAgIG1pc3NpbmdQYXJhbXMucHVzaChwYXJhbS5uYW1lIHx8IHBhcmFtLmlkKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICAgICdyZXF1ZXN0Qm9keSc6IHJlcXVlc3RCb2R5LFxuICAgICAgICAnbWlzc2luZ1BhcmFtcyc6IG1pc3NpbmdQYXJhbXNcbiAgICB9O1xufTtcblxuLyoqXG4gKiBEb25lIG9ubHkgZm9yIEhUVFAgY2FsbHMgbWFkZSB2aWEgdGhlIHByb3h5IHNlcnZlclxuICogR29lcyB0aG91Z2ggcmVxdWVzdCBoZWFkZXJzLCBhcHBlbmRzICdYLScgdG8gY2VydGFpbiBoZWFkZXJzXG4gKiB0aGVzZSBoZWFkZXJzIG5lZWQgbm90IGJlIHByb2Nlc3NlZCBhdCBwcm94eSBzZXJ2ZXIgYW5kIHNob3VsZCBkaXJlY3RseSBiZSBwYXNzZWQgdG8gdGhlIHNlcnZlclxuICogZS5nLiBBdXRob3JpemF0aW9uLCBDb29raWUsIGV0Yy5cbiAqIEBwYXJhbSBoZWFkZXJzXG4gKiBAcmV0dXJucyB7e319XG4gKi9cbmNvbnN0IGNsb2FrSGVhZGVyc0ZvclByb3h5ID0gKGhlYWRlcnMpID0+IHtcbiAgICBjb25zdCBfaGVhZGVycyA9IHt9LFxuICAgICAgICBVTkNMT0FLRURfSEVBREVSUyA9IFZBUklBQkxFX0NPTlNUQU5UUy5SRVNUX1NFUlZJQ0UuVU5DTE9BS0VEX0hFQURFUlMsXG4gICAgICAgIENMT0FLX1BSRUZJWCA9IFZBUklBQkxFX0NPTlNUQU5UUy5SRVNUX1NFUlZJQ0UuUFJFRklYLkNMT0FLX0hFQURFUl9LRVk7XG4gICAgZm9yRWFjaChoZWFkZXJzLCBmdW5jdGlvbiAodmFsLCBrZXkpIHtcbiAgICAgICAgaWYgKGluY2x1ZGVzKFVOQ0xPQUtFRF9IRUFERVJTLCBrZXkudG9VcHBlckNhc2UoKSkpIHtcbiAgICAgICAgICAgIF9oZWFkZXJzW2tleV0gPSB2YWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfaGVhZGVyc1tDTE9BS19QUkVGSVggKyBrZXldID0gdmFsO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gX2hlYWRlcnM7XG59O1xuXG5leHBvcnQgY2xhc3MgU2VydmljZVZhcmlhYmxlVXRpbHMge1xuICAgIC8qKlxuICAgICAqIHByZXBhcmVzIHRoZSBIVFRQIHJlcXVlc3QgaW5mbyBmb3IgYSBTZXJ2aWNlIFZhcmlhYmxlXG4gICAgICogQHBhcmFtIHZhcmlhYmxlXG4gICAgICogQHBhcmFtIG9wZXJhdGlvbkluZm9cbiAgICAgKiBAcGFyYW0gaW5wdXRGaWVsZHNcbiAgICAgKiBAcmV0dXJucyB7YW55fVxuICAgICAqL1xuICAgIHN0YXRpYyBjb25zdHJ1Y3RSZXF1ZXN0UGFyYW1zKHZhcmlhYmxlLCBvcGVyYXRpb25JbmZvLCBpbnB1dEZpZWxkcywgb3B0aW9ucz8pIHtcbiAgICAgICAgdmFyaWFibGUgPSB2YXJpYWJsZSB8fCB7fTtcblxuICAgICAgICAvLyBvcGVyYXRpb25JbmZvIGlzIHNwZWNpZmljYWxseSBudWxsIGZvciB1bl9hdXRob3JpemVkIGFjY2Vzc1xuICAgICAgICBpZiAob3BlcmF0aW9uSW5mbyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAnZXJyb3InIDoge1xuICAgICAgICAgICAgICAgICAgICAndHlwZSc6IFZBUklBQkxFX0NPTlNUQU5UUy5SRVNUX1NFUlZJQ0UuRVJSX1RZUEUuVVNFUl9VTkFVVEhPUklTRUQsXG4gICAgICAgICAgICAgICAgICAgICdtZXNzYWdlJzogVkFSSUFCTEVfQ09OU1RBTlRTLlJFU1RfU0VSVklDRS5FUlJfTVNHLlVTRVJfVU5BVVRIT1JJU0VELFxuICAgICAgICAgICAgICAgICAgICAnZmllbGQnOiAnX3dtU2VydmljZU9wZXJhdGlvbkluZm8nXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0VtcHR5KG9wZXJhdGlvbkluZm8pKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICdlcnJvcicgOiB7XG4gICAgICAgICAgICAgICAgICAgICd0eXBlJzogVkFSSUFCTEVfQ09OU1RBTlRTLlJFU1RfU0VSVklDRS5FUlJfVFlQRS5NRVRBREFUQV9NSVNTSU5HLFxuICAgICAgICAgICAgICAgICAgICAnbWVzc2FnZSc6IFZBUklBQkxFX0NPTlNUQU5UUy5SRVNUX1NFUlZJQ0UuRVJSX01TRy5NRVRBREFUQV9NSVNTSU5HLFxuICAgICAgICAgICAgICAgICAgICAnZmllbGQnOiAnX3dtU2VydmljZU9wZXJhdGlvbkluZm8nXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmIChvcGVyYXRpb25JbmZvICYmIG9wZXJhdGlvbkluZm8uaW52YWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAnZXJyb3InIDoge1xuICAgICAgICAgICAgICAgICAgICAndHlwZSc6IFZBUklBQkxFX0NPTlNUQU5UUy5SRVNUX1NFUlZJQ0UuRVJSX1RZUEUuQ1JVRF9PUEVSQVRJT05fTUlTU0lORyxcbiAgICAgICAgICAgICAgICAgICAgJ21lc3NhZ2UnOiBWQVJJQUJMRV9DT05TVEFOVFMuUkVTVF9TRVJWSUNFLkVSUl9NU0cuQ1JVRF9PUEVSQVRJT05fTUlTU0lORyxcbiAgICAgICAgICAgICAgICAgICAgJ2ZpZWxkJzogJ193bVNlcnZpY2VPcGVyYXRpb25JbmZvJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkaXJlY3RQYXRoID0gb3BlcmF0aW9uSW5mby5kaXJlY3RQYXRoIHx8ICcnLFxuICAgICAgICByZWxhdGl2ZVBhdGggPSBvcGVyYXRpb25JbmZvLmJhc2VQYXRoID8gb3BlcmF0aW9uSW5mby5iYXNlUGF0aCArIG9wZXJhdGlvbkluZm8ucmVsYXRpdmVQYXRoIDogb3BlcmF0aW9uSW5mby5yZWxhdGl2ZVBhdGgsXG4gICAgICAgIGlzQm9keVR5cGVRdWVyeVByb2NlZHVyZSA9IGlzQm9keVR5cGVRdWVyeU9yUHJvY2VkdXJlKHZhcmlhYmxlKTtcbiAgICAgICAgbGV0IHF1ZXJ5UGFyYW1zID0gJycsXG4gICAgICAgIGJvZHlJbmZvLFxuICAgICAgICBoZWFkZXJzID0ge30sXG4gICAgICAgIHJlcXVlc3RCb2R5LFxuICAgICAgICB1cmwsXG4gICAgICAgIHJlcXVpcmVkUGFyYW1NaXNzaW5nID0gW10sXG4gICAgICAgIHRhcmdldCxcbiAgICAgICAgcGF0aFBhcmFtUmV4LFxuICAgICAgICBpbnZva2VQYXJhbXMsXG4gICAgICAgIGF1dGhEZXRhaWxzID0gbnVsbCxcbiAgICAgICAgdW5hbWUsXG4gICAgICAgIHBzd2QsXG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgZm9ybURhdGEsXG4gICAgICAgIGlzUHJveHlDYWxsLFxuICAgICAgICBwYXJhbVZhbHVlSW5mbyxcbiAgICAgICAgcGFyYW1zLFxuICAgICAgICBzZWN1cml0eURlZm5PYmosXG4gICAgICAgIGFjY2Vzc1Rva2VuLFxuICAgICAgICB3aXRoQ3JlZGVudGlhbHM7XG5cbiAgICAgICAgZnVuY3Rpb24gZ2V0Rm9ybURhdGFPYmooKSB7XG4gICAgICAgICAgICBpZiAoZm9ybURhdGEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybURhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1EYXRhO1xuICAgICAgICB9XG5cbiAgICAgICAgc2VjdXJpdHlEZWZuT2JqID0gZ2V0KG9wZXJhdGlvbkluZm8uc2VjdXJpdHlEZWZpbml0aW9ucywgJzAnKTtcblxuICAgICAgICBpZiAoc2VjdXJpdHlEZWZuT2JqKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHNlY3VyaXR5RGVmbk9iai50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBWQVJJQUJMRV9DT05TVEFOVFMuUkVTVF9TRVJWSUNFLlNFQ1VSSVRZX0RFRk4uT0FVVEgyOlxuICAgICAgICAgICAgICAgICAgICBhY2Nlc3NUb2tlbiA9IGdldEFjY2Vzc1Rva2VuKHNlY3VyaXR5RGVmbk9ialtWQVJJQUJMRV9DT05TVEFOVFMuUkVTVF9TRVJWSUNFLk9BVVRIX1BST1ZJREVSX0tFWV0sIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXNzVG9rZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnNbVkFSSUFCTEVfQ09OU1RBTlRTLlJFU1RfU0VSVklDRS5BVVRIX0hEUl9LRVldID0gVkFSSUFCTEVfQ09OU1RBTlRTLlJFU1RfU0VSVklDRS5QUkVGSVguQVVUSF9IRFJfVkFMLk9BVVRIICsgJyAnICsgYWNjZXNzVG9rZW47XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlcnJvcic6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUnIDogVkFSSUFCTEVfQ09OU1RBTlRTLlJFU1RfU0VSVklDRS5FUlJfVFlQRS5OT19BQ0NFU1NUT0tFTixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21lc3NhZ2UnIDogVkFSSUFCTEVfQ09OU1RBTlRTLlJFU1RfU0VSVklDRS5FUlJfTVNHLk5PX0FDQ0VTU1RPS0VOXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2VjdXJpdHlEZWZuT2JqJzogc2VjdXJpdHlEZWZuT2JqXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgVkFSSUFCTEVfQ09OU1RBTlRTLlJFU1RfU0VSVklDRS5TRUNVUklUWV9ERUZOLkJBU0lDOlxuICAgICAgICAgICAgICAgICAgICB1bmFtZSA9IGlucHV0RmllbGRzWyd3bV9hdXRoX3VzZXJuYW1lJ107XG4gICAgICAgICAgICAgICAgICAgIHBzd2QgPSBpbnB1dEZpZWxkc1snd21fYXV0aF9wYXNzd29yZCddO1xuICAgICAgICAgICAgICAgICAgICBpZiAodW5hbWUgJiYgcHN3ZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ET1tWSUJIVV06IGJhczY0IGVuY29kaW5nIGFsdGVybmF0aXZlLlxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyc1tWQVJJQUJMRV9DT05TVEFOVFMuUkVTVF9TRVJWSUNFLkFVVEhfSERSX0tFWV0gPSBWQVJJQUJMRV9DT05TVEFOVFMuUkVTVF9TRVJWSUNFLlBSRUZJWC5BVVRIX0hEUl9WQUwuQkFTSUMgKyAnICcgKyBidG9hKHVuYW1lICsgJzonICsgcHN3ZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdXRoRGV0YWlscyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSc6IFZBUklBQkxFX0NPTlNUQU5UUy5SRVNUX1NFUlZJQ0UuQVVUSF9UWVBFLkJBU0lDXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXJyb3InOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJyA6IFZBUklBQkxFX0NPTlNUQU5UUy5SRVNUX1NFUlZJQ0UuRVJSX1RZUEUuTk9fQ1JFREVOVElBTFMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtZXNzYWdlJzogVkFSSUFCTEVfQ09OU1RBTlRTLlJFU1RfU0VSVklDRS5FUlJfTVNHLk5PX0NSRURFTlRJQUxTXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2VjdXJpdHlEZWZuT2JqJzogc2VjdXJpdHlEZWZuT2JqXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHNldCBxdWVyeSBwYXJhbXMsIGlmIHBhZ2luYXRpb24gaW5mbyBpcyBwcmVzZW50IGFuZCB0aGUgaW5mbyBzaG91bGQgYmUgcHJlc2VudCBpbiBxdWVyeVxuICAgICAgICBQYWdpbmF0aW9uVXRpbHMuY2hlY2tQYWdpbmF0aW9uQXRRdWVyeShvcGVyYXRpb25JbmZvLCB2YXJpYWJsZSwgb3B0aW9ucyk7XG5cbiAgICAgICAgb3BlcmF0aW9uSW5mby5wcm94eVNldHRpbmdzID0gb3BlcmF0aW9uSW5mby5wcm94eVNldHRpbmdzIHx8IHt3ZWI6IHRydWUsIG1vYmlsZTogZmFsc2V9O1xuICAgICAgICBtZXRob2QgPSBvcGVyYXRpb25JbmZvLmh0dHBNZXRob2QgfHwgb3BlcmF0aW9uSW5mby5tZXRob2RUeXBlO1xuICAgICAgICBpc1Byb3h5Q2FsbCA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gb3BlcmF0aW9uSW5mby5wcm94eVNldHRpbmdzLndlYjtcbiAgICAgICAgfSgpKTtcbiAgICAgICAgd2l0aENyZWRlbnRpYWxzID0gb3BlcmF0aW9uSW5mby5wcm94eVNldHRpbmdzLndpdGhDcmVkZW50aWFscztcbiAgICAgICAgdXJsID0gaXNQcm94eUNhbGwgPyByZWxhdGl2ZVBhdGggOiBkaXJlY3RQYXRoO1xuXG4gICAgICAgIC8qIGxvb3AgdGhyb3VnaCBhbGwgdGhlIHBhcmFtZXRlcnMgKi9cbiAgICAgICAgZm9yRWFjaChvcGVyYXRpb25JbmZvLnBhcmFtZXRlcnMsIGZ1bmN0aW9uIChwYXJhbSkge1xuICAgICAgICAgICAgLy8gU2V0IHBhcmFtcyBiYXNlZCBvbiBjdXJyZW50IHdvcmtzcGFjZVxuICAgICAgICAgICAgZnVuY3Rpb24gc2V0UGFyYW1zT2ZDaGlsZE5vZGUoKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0RmllbGRzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpZmljIGNhc2UgZm9yIGJvZHkgdHlwZSBxdWVyeS9wcm9jZWR1cmUgdmFyaWFibGUgd2l0aCBxdWVyeSBwYXJhbXNcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0RmllbGRzW3BhcmFtLm5hbWVdICYmIGlzT2JqZWN0KGlucHV0RmllbGRzW3BhcmFtLm5hbWVdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1WYWx1ZUluZm8gPSBpbnB1dEZpZWxkc1twYXJhbS5uYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtVmFsdWVJbmZvID0gaW5wdXRGaWVsZHM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gZ2V0KG9wZXJhdGlvbkluZm8sIFsnZGVmaW5pdGlvbnMnLCBwYXJhbS50eXBlXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIEFwaSBEZXNpZ25lclxuICAgICAgICAgICAgICAgICAgICBwYXJhbVZhbHVlSW5mbyA9IHBhcmFtVmFsdWUgfHwge307XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtLmNoaWxkcmVuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHBhcmFtVmFsdWUgPSBwYXJhbS5zYW1wbGVWYWx1ZTtcblxuICAgICAgICAgICAgaWYgKChpc0RlZmluZWQocGFyYW1WYWx1ZSkgJiYgcGFyYW1WYWx1ZSAhPT0gbnVsbCAmJiBwYXJhbVZhbHVlICE9PSAnJykgfHwgKGlzQm9keVR5cGVRdWVyeVByb2NlZHVyZSAmJiBwYXJhbS50eXBlICE9PSAnZmlsZScpKSB7XG4gICAgICAgICAgICAgICAgLy8gRm9ybWF0IGRhdGVUaW1lIHBhcmFtcyBmb3IgZGF0YVNlcnZpY2UgdmFyaWFibGVzXG4gICAgICAgICAgICAgICAgaWYgKHZhcmlhYmxlLnNlcnZpY2VUeXBlID09PSBWQVJJQUJMRV9DT05TVEFOVFMuU0VSVklDRV9UWVBFLkRBVEEgJiYgaXNEYXRlVGltZVR5cGUocGFyYW0udHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1WYWx1ZSA9IGZvcm1hdERhdGUocGFyYW1WYWx1ZSwgcGFyYW0udHlwZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIENvbnN0cnVjdCAnLCcgc2VwYXJhdGVkIHN0cmluZyBpZiBwYXJhbSBpcyBub3QgYXJyYXkgdHlwZSBidXQgdmFsdWUgaXMgYW4gYXJyYXlcbiAgICAgICAgICAgICAgICBpZiAoaXNBcnJheShwYXJhbVZhbHVlKSAmJiB0b0xvd2VyKGV4dHJhY3RUeXBlKHBhcmFtLnR5cGUpKSA9PT0gJ3N0cmluZycgJiYgdmFyaWFibGUuc2VydmljZVR5cGUgPT09IFZBUklBQkxFX0NPTlNUQU5UUy5TRVJWSUNFX1RZUEUuREFUQSkge1xuICAgICAgICAgICAgICAgICAgICBwYXJhbVZhbHVlID0gam9pbihwYXJhbVZhbHVlLCAnLCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHBhcmFtLnBhcmFtZXRlclR5cGUudG9VcHBlckNhc2UoKSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdRVUVSWSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgbnVsbCB2YWx1ZWQgcXVlcnkgcGFyYW1zIGZvciBxdWVyeVNlcnZpY2UgdmFyaWFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc051bGwocGFyYW1WYWx1ZSkgJiYgaXNRdWVyeVNlcnZpY2VWYXIodmFyaWFibGUuY29udHJvbGxlciwgdmFyaWFibGUuc2VydmljZVR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRRdWVyeVBhcmFtVmFsdWVzKHBhcmFtLCBwYXJhbVZhbHVlKS5mb3JFYWNoKCh7dmFsdWU6IHF1ZXJ5VmFsdWUsIHByZUVuY29kZWR9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTnVsbChxdWVyeVZhbHVlKSAmJiBpc1F1ZXJ5U2VydmljZVZhcih2YXJpYWJsZS5jb250cm9sbGVyLCB2YXJpYWJsZS5zZXJ2aWNlVHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtcyA9IGFwcGVuZFF1ZXJ5UGFyYW0ocXVlcnlQYXJhbXMsIHBhcmFtLm5hbWUsIHF1ZXJ5VmFsdWUsIHByZUVuY29kZWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnUEFUSCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAvKiByZXBsYWNpbmcgdGhlIHBhdGggcGFyYW0gYmFzZWQgb24gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBpbiB0aGUgcmVsYXRpdmUgcGF0aCAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFBhcmFtUmV4ID0gbmV3IFJlZ0V4cCgnXFxcXHMqXFxcXHtcXFxccyonICsgcGFyYW0ubmFtZSArICcoOlxcXFwuXFxcXCspP1xcXFxzKlxcXFx9XFxcXHMqJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSB1cmwucmVwbGFjZShwYXRoUGFyYW1SZXgsIHBhcmFtVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ0hFQURFUic6XG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzW3BhcmFtLm5hbWVdID0gcGFyYW1WYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdCT0RZJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBwb3N0L3B1dCBxdWVyeSBtZXRob2RzIHdyYXAgdGhlIGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNCb2R5VHlwZVF1ZXJ5UHJvY2VkdXJlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UGFyYW1zT2ZDaGlsZE5vZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5SW5mbyA9IHByb2Nlc3NSZXF1ZXN0Qm9keShwYXJhbVZhbHVlSW5mbywgcGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Qm9keSA9IGJvZHlJbmZvLnJlcXVlc3RCb2R5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkUGFyYW1NaXNzaW5nID0gY29uY2F0KHJlcXVpcmVkUGFyYW1NaXNzaW5nLCBib2R5SW5mby5taXNzaW5nUGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEJvZHkgPSBwYXJhbVZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ0ZPUk1EQVRBJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0JvZHlUeXBlUXVlcnlQcm9jZWR1cmUgJiYgcGFyYW0ubmFtZSA9PT0gU1dBR0dFUl9DT05TVEFOVFMuV01fREFUQV9KU09OKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UGFyYW1zT2ZDaGlsZE5vZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcm9jZXNzIHF1ZXJ5L3Byb2NlZHVyZSBmb3JtRGF0YSBub24tZmlsZSBwYXJhbXMgcGFyYW1zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keUluZm8gPSBwcm9jZXNzUmVxdWVzdEJvZHkocGFyYW1WYWx1ZUluZm8sIHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEJvZHkgPSBnZXRGb3JtRGF0YShnZXRGb3JtRGF0YU9iaigpLCBwYXJhbSwgYm9keUluZm8ucmVxdWVzdEJvZHkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkUGFyYW1NaXNzaW5nID0gY29uY2F0KHJlcXVpcmVkUGFyYW1NaXNzaW5nLCBib2R5SW5mby5taXNzaW5nUGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEJvZHkgPSBnZXRGb3JtRGF0YShnZXRGb3JtRGF0YU9iaigpLCBwYXJhbSwgcGFyYW1WYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtLnJlcXVpcmVkKSB7XG4gICAgICAgICAgICAgICAgcmVxdWlyZWRQYXJhbU1pc3NpbmcucHVzaChwYXJhbS5uYW1lIHx8IHBhcmFtLmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gaWYgcmVxdWlyZWQgcGFyYW0gbm90IGZvdW5kLCByZXR1cm4gZXJyb3JcbiAgICAgICAgaWYgKHJlcXVpcmVkUGFyYW1NaXNzaW5nLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAnZXJyb3InOiB7XG4gICAgICAgICAgICAgICAgICAgICd0eXBlJzogVkFSSUFCTEVfQ09OU1RBTlRTLlJFU1RfU0VSVklDRS5FUlJfVFlQRS5SRVFVSVJFRF9GSUVMRF9NSVNTSU5HLFxuICAgICAgICAgICAgICAgICAgICAnZmllbGQnOiByZXF1aXJlZFBhcmFtTWlzc2luZy5qb2luKCcsJyksXG4gICAgICAgICAgICAgICAgICAgICdtZXNzYWdlJzogcmVwbGFjZShWQVJJQUJMRV9DT05TVEFOVFMuUkVTVF9TRVJWSUNFLkVSUl9NU0cuUkVRVUlSRURfRklFTERfTUlTU0lORywgW3JlcXVpcmVkUGFyYW1NaXNzaW5nLmpvaW4oJywnKV0pLFxuICAgICAgICAgICAgICAgICAgICAnc2tpcERlZmF1bHROb3RpZmljYXRpb24nOiB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldHRpbmcgYXBwcm9wcmlhdGUgY29udGVudC1UeXBlIGZvciByZXF1ZXN0IGFjY2VwdGluZyByZXF1ZXN0IGJvZHkgbGlrZSBQT1NULCBQVVQsIGV0Y1xuICAgICAgICBpZiAoIWluY2x1ZGVzKFdTX0NPTlNUQU5UUy5OT05fQk9EWV9IVFRQX01FVEhPRFMsIHRvVXBwZXIobWV0aG9kKSkpIHtcbiAgICAgICAgICAgIC8qQmFzZWQgb24gdGhlIGZvcm1EYXRhIGJyb3dzZXIgd2lsbCBhdXRvbWF0aWNhbGx5IHNldCB0aGUgY29udGVudCB0eXBlIHRvICdtdWx0aXBhcnQvZm9ybS1kYXRhJyBhbmQgd2Via2l0IGJvdW5kYXJ5Ki9cbiAgICAgICAgICAgIGlmICghKG9wZXJhdGlvbkluZm8uY29uc3VtZXMgJiYgKG9wZXJhdGlvbkluZm8uY29uc3VtZXNbMF0gPT09IFdTX0NPTlNUQU5UUy5DT05URU5UX1RZUEVTLk1VTFRJUEFSVF9GT1JNREFUQSkpKSB7XG4gICAgICAgICAgICAgICAgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAob3BlcmF0aW9uSW5mby5jb25zdW1lcyAmJiBvcGVyYXRpb25JbmZvLmNvbnN1bWVzWzBdKSB8fCAnYXBwbGljYXRpb24vanNvbic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiB0aGUgY29uc3VtZXMgaGFzIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCBhbmRcbiAgICAgICAgLy8gaWYgdGhlIGh0dHAgcmVxdWVzdCBvZiBnaXZlbiBtZXRob2QgdHlwZSBjYW4gaGF2ZSBib2R5IHNlbmQgdGhlIHF1ZXJ5UGFyYW1zIGFzIEZvcm0gRGF0YVxuICAgICAgICBpZiAoaW5jbHVkZXMob3BlcmF0aW9uSW5mby5jb25zdW1lcywgV1NfQ09OU1RBTlRTLkNPTlRFTlRfVFlQRVMuRk9STV9VUkxfRU5DT0RFRClcbiAgICAgICAgICAgICYmICFpbmNsdWRlcyhXU19DT05TVEFOVFMuTk9OX0JPRFlfSFRUUF9NRVRIT0RTLCAobWV0aG9kIHx8ICcnKS50b1VwcGVyQ2FzZSgpKSkge1xuICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSAnPycgYXQgdGhlIHN0YXJ0IG9mIHRoZSBxdWVyeVBhcmFtc1xuICAgICAgICAgICAgaWYgKHF1ZXJ5UGFyYW1zKSB7XG4gICAgICAgICAgICAgICAgcmVxdWVzdEJvZHkgPSAocmVxdWVzdEJvZHkgPyByZXF1ZXN0Qm9keSArICcmJyA6ICcnKSArIHF1ZXJ5UGFyYW1zLnN1YnN0cmluZygxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gV1NfQ09OU1RBTlRTLkNPTlRFTlRfVFlQRVMuRk9STV9VUkxfRU5DT0RFRDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVybCArPSBxdWVyeVBhcmFtcztcbiAgICAgICAgfVxuXG4gICAgICAgIC8qXG4gICAgICAgICAqIGZvciBwcm94eSBjYWxsczpcbiAgICAgICAgICogIC0gY2xvYWsgdGhlIHByb3BlciBoZWFkZXJzIChyZXF1aXJlZCBvbmx5IGZvciBSRVNUIHNlcnZpY2VzKVxuICAgICAgICAgKiAgLSBwcmVwYXJlIGNvbXBsZXRlIHVybCBmcm9tIHJlbGF0aXZlVXJsXG4gICAgICAgICAqL1xuICAgICAgICBpZiAoaXNQcm94eUNhbGwpIHtcbiAgICAgICAgICAgIC8vIGF2b2lkaW5nIGNsb2FrSGVhZGVyc0ZvclByb3h5IHdoZW4gdGhlIG1ldGhvZCBpcyBpbnZva2VkIGZyb20gYXBpZGVzaWduZXIuXG4gICAgICAgICAgICAgICAgaGVhZGVycyA9ICh2YXJpYWJsZS5zZXJ2aWNlVHlwZSAhPT0gVkFSSUFCTEVfQ09OU1RBTlRTLlNFUlZJQ0VfVFlQRS5SRVNUICYmIHZhcmlhYmxlLnNlcnZpY2VUeXBlICE9PSBWQVJJQUJMRV9DT05TVEFOVFMuU0VSVklDRV9UWVBFLk9QRU5BUEkpIHx8IG9wZXJhdGlvbkluZm8uc2tpcENsb2FrSGVhZGVycyA/IGhlYWRlcnMgOiBjbG9ha0hlYWRlcnNGb3JQcm94eShoZWFkZXJzKTtcbiAgICAgICAgICAgIGlmICh2YXJpYWJsZS5nZXRQcmVmYWJOYW1lKCkgJiYgVkFSSUFCTEVfQ09OU1RBTlRTLlJFU1RfU1VQUE9SVEVEX1NFUlZJQ0VTLmluZGV4T2YodmFyaWFibGUuc2VydmljZVR5cGUpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIC8qIGlmIGl0IGlzIGEgcHJlZmFiIHZhcmlhYmxlICh1c2VkIGluIGEgbm9ybWFsIHByb2plY3QpLCBtb2RpZnkgdGhlIHVybCAqL1xuICAgICAgICAgICAgICAgIHVybCA9ICdwcmVmYWJzLycgKyB2YXJpYWJsZS5nZXRQcmVmYWJOYW1lKCkgKyB1cmw7XG4gICAgICAgICAgICAgICAgdGFyZ2V0ID0gJ2ludm9rZVByZWZhYlJlc3RTZXJ2aWNlJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXZhcmlhYmxlLmdldFByZWZhYk5hbWUoKSkge1xuICAgICAgICAgICAgICAgIHVybCA9ICdzZXJ2aWNlcycgKyB1cmw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1cmwgPSAkcm9vdFNjb3BlLnByb2plY3QuZGVwbG95ZWRVcmwgKyB1cmw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBwYWdpbmF0aW9uIGluZm8gZXhpc3RzLCBwcm9jZXNzIGluZm8gaW4gcmVxdWVzdCBoZWFkZXJzIG9yIGJvZHkgYmFzZWQgb24gdGhlIG1ldGFkYXRhXG4gICAgICAgIGNvbnN0IHBhZ2luYXRpb25JbmZvID0gUGFnaW5hdGlvblV0aWxzLmdldFBhZ2luYXRpb25JbmZvKG9wZXJhdGlvbkluZm8sIHZhcmlhYmxlKTtcbiAgICAgICAgaWYgKHBhZ2luYXRpb25JbmZvICYmIHZhcmlhYmxlLnBhZ2luYXRpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3AgPSBQYWdpbmF0aW9uVXRpbHMuc2V0UGFnaW5hdGlvbkF0UmVxKHBhZ2luYXRpb25JbmZvLCBvcGVyYXRpb25JbmZvLCB2YXJpYWJsZSwgaGVhZGVycywgcmVxdWVzdEJvZHksIHVybCwgb3B0aW9ucyk7XG4gICAgICAgICAgICBpZiAocmVzcCkge1xuICAgICAgICAgICAgICAgIGlmIChyZXNwWydoZWFkZXJzJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVycyA9IHJlc3BbJ2hlYWRlcnMnXTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3BbJ3JlcXVlc3RCb2R5J10pIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEJvZHkgPSByZXNwWydyZXF1ZXN0Qm9keSddXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNwWyd1cmwnXSkge1xuICAgICAgICAgICAgICAgICAgICB1cmwgPSByZXNwWyd1cmwnXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qY3JlYXRpbmcgdGhlIHBhcmFtcyBuZWVkZWQgdG8gaW52b2tlIHRoZSBzZXJ2aWNlLiB1cmwgaXMgZ2VuZXJhdGVkIGZyb20gdGhlIHJlbGF0aXZlIHBhdGggZm9yIHRoZSBvcGVyYXRpb24qL1xuICAgICAgICBpbnZva2VQYXJhbXMgPSB7XG4gICAgICAgICAgICAncHJvamVjdElEJzogJHJvb3RTY29wZS5wcm9qZWN0LmlkLFxuICAgICAgICAgICAgJ3VybCc6IHVybCxcbiAgICAgICAgICAgICd0YXJnZXQnOiB0YXJnZXQsXG4gICAgICAgICAgICAnbWV0aG9kJzogbWV0aG9kLFxuICAgICAgICAgICAgJ2hlYWRlcnMnOiBoZWFkZXJzLFxuICAgICAgICAgICAgJ2RhdGEnOiByZXF1ZXN0Qm9keSxcbiAgICAgICAgICAgICdhdXRoRGV0YWlscyc6IGF1dGhEZXRhaWxzLFxuICAgICAgICAgICAgJ2lzRGlyZWN0Q2FsbCc6ICFpc1Byb3h5Q2FsbCxcbiAgICAgICAgICAgICdpc0V4dFVSTCc6IHZhcmlhYmxlLnNlcnZpY2VUeXBlID09PSBWQVJJQUJMRV9DT05TVEFOVFMuU0VSVklDRV9UWVBFLlJFU1QsXG4gICAgICAgICAgICAnd2l0aENyZWRlbnRpYWxzJzogd2l0aENyZWRlbnRpYWxzXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIGludm9rZVBhcmFtcztcbiAgICB9XG5cbiAgICBzdGF0aWMgaXNGaWxlVXBsb2FkUmVxdWVzdCh2YXJpYWJsZSkge1xuICAgICAgICAvLyB0ZW1wb3JhcnkgZml4LCBoYXZlIHRvIGZpbmQgcHJvcGVyIHNvbHV0aW9uIGZvciBkZWNpZGluZyB3ZWF0aGVyIHRvIHVwbG9hZCBmaWxlIHRocm91Z2ggdmFyaWFibGVcbiAgICAgICAgcmV0dXJuIHZhcmlhYmxlLnNlcnZpY2UgPT09ICdGaWxlU2VydmljZScgJiYgdmFyaWFibGUub3BlcmF0aW9uID09PSAndXBsb2FkRmlsZSc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhcnJheSBvZiBxdWVyeSBwYXJhbSBuYW1lcyBmb3IgdmFyaWFibGUgb3RoZXIgdGhlbiBwYWdlLHNpemUsc29ydFxuICAgICAqIEBwYXJhbXMge3BhcmFtc30gcGFyYW1zIG9mIHRoZSB2YXJpYWJsZVxuICAgICAqL1xuICAgIHN0YXRpYyBleGNsdWRlUGFnaW5hdGlvblBhcmFtcyhwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIG1hcChyZWplY3QocGFyYW1zLCAocGFyYW0pID0+IHtcbiAgICAgICAgICAgIHJldHVybiBpbmNsdWRlcyhWQVJJQUJMRV9DT05TVEFOVFMuUEFHSU5BVElPTl9QQVJBTVMsIHBhcmFtLm5hbWUpO1xuICAgICAgICB9KSwgZnVuY3Rpb24gKHBhcmFtKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyYW0ubmFtZTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl19