oxygen-cli 1.33.5 → 1.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -19,6 +19,14 @@ var _helper = _interopRequireDefault(require("../errors/helper"));
19
19
 
20
20
  var _utils = _interopRequireDefault(require("./utils"));
21
21
 
22
+ var _ntlmUtil = require("./module-http/ntlm-util");
23
+
24
+ var ntlm = _interopRequireWildcard(require("./module-http/ntlm"));
25
+
26
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
27
+
28
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
29
+
22
30
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
31
 
24
32
  /*
@@ -34,6 +42,10 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
34
42
  * @name http
35
43
  * @description Provides methods for working with HTTP(S)
36
44
  */
45
+ const http = require('http');
46
+
47
+ const https = require('https');
48
+
37
49
  const MODULE_NAME = 'http';
38
50
  const RESPONSE_TIMEOUT = 1000 * 60; // in ms
39
51
 
@@ -64,7 +76,10 @@ class HttpModule extends _OxygenModule.default {
64
76
  this._alwaysInitialized = true;
65
77
  this._lastResponse = null;
66
78
  this._baseUrl = null;
67
- this._userHttpOptions = {}; // pre-initialize the module
79
+ this._userHttpOptions = {};
80
+ this._username = undefined;
81
+ this._password = undefined;
82
+ this._domain = undefined; // pre-initialize the module
68
83
 
69
84
  this._isInitialized = true;
70
85
  }
@@ -103,6 +118,27 @@ class HttpModule extends _OxygenModule.default {
103
118
  this._userHttpOptions.decompress = false; // decompress=true in default options so we override it
104
119
  }
105
120
  }
121
+ /**
122
+ * @summary Sets user credentials for NTLM authentication process
123
+ * @function setNtlmUser
124
+ * @param {String} username - NTLM username.
125
+ * @param {String} password - NTLM password.
126
+ * @param {String=} domain - NTLM domain name, if applicable.
127
+ * In addition to the options listed in the linked document, 'deflateRaw' option can be used when server returns Deflate-compressed stream without headers.
128
+ */
129
+
130
+
131
+ setNtlmUser(username, password, domain = undefined) {
132
+ // If username was passed as undefined, then remove previously defined NTLM credentials
133
+ if (username == undefined) {
134
+ this._username = this._password = this._domain = undefined;
135
+ return;
136
+ }
137
+
138
+ this._username = username;
139
+ this._password = password;
140
+ this._domain = domain;
141
+ }
106
142
  /**
107
143
  * @summary Sets proxy url to be used for connections with the service.
108
144
  * @function setProxy
@@ -430,7 +466,9 @@ class HttpModule extends _OxygenModule.default {
430
466
  } // just in case user passed a complex object by mistake
431
467
 
432
468
 
433
- name = name.toString();
469
+ name = name.toString(); // limit the name length (since we can't store values larger than 512B in the database)
470
+
471
+ name = name.slice(0, 512);
434
472
  global._lastTransactionName = name;
435
473
  }
436
474
 
@@ -480,6 +518,10 @@ class HttpModule extends _OxygenModule.default {
480
518
  }
481
519
 
482
520
  _getContentType(headers = {}) {
521
+ if (!headers) {
522
+ return undefined;
523
+ }
524
+
483
525
  const contentType = headers['content-type'];
484
526
 
485
527
  if (!contentType) {
@@ -496,7 +538,7 @@ class HttpModule extends _OxygenModule.default {
496
538
  }
497
539
 
498
540
  _getContentLength(headers = {}) {
499
- if (!headers['content-length']) {
541
+ if (!headers || !headers['content-length']) {
500
542
  return undefined;
501
543
  }
502
544
 
@@ -555,7 +597,7 @@ class HttpModule extends _OxygenModule.default {
555
597
  return dataResolver;
556
598
  }
557
599
 
558
- async _httpRequestSync(httpOpts) {
600
+ async _httpRequestSync(httpOpts, withAuth = false) {
559
601
  if (this._extra.http) {
560
602
  delete this._extra.http;
561
603
  } //this._addRequestExtra(httpOpts);
@@ -603,6 +645,14 @@ class HttpModule extends _OxygenModule.default {
603
645
  }
604
646
  } catch (e) {
605
647
  result = e;
648
+
649
+ if (e.response && e.response.statusCode && e.response.statusCode === 401 && !withAuth) {
650
+ const authReqResult = await this._handleNtlmAuthorization(httpOpts, e.response);
651
+
652
+ if (authReqResult) {
653
+ result = authReqResult;
654
+ }
655
+ }
606
656
  }
607
657
 
608
658
  if (result instanceof Error) {
@@ -654,7 +704,72 @@ class HttpModule extends _OxygenModule.default {
654
704
  return result;
655
705
  }
656
706
 
707
+ async _handleNtlmAuthorization(httpOpts, response) {
708
+ var _authMethods;
709
+
710
+ if (!this._username) {
711
+ return undefined;
712
+ }
713
+
714
+ let authMethods = (0, _ntlmUtil.getAuthenticateMethods)(response);
715
+ const optsWithAuth = { ...httpOpts
716
+ };
717
+
718
+ if (response.statusCode === 401 && (_authMethods = authMethods) !== null && _authMethods !== void 0 && _authMethods.some(m => m.startsWith('basic'))) {
719
+ optsWithAuth.headers['Authorization'] = (0, _ntlmUtil.createBasicMessage)(this._username || '', this._password || '');
720
+ return await this._httpRequestSync(optsWithAuth, true);
721
+ } // Is https?
722
+
723
+
724
+ const reqUrl = require('url').parse(optsWithAuth.url);
725
+
726
+ const isHttps = reqUrl.protocol === 'https:'; // Setup keep-alive agent (otherwise we will get HTTP 401 for message type 3)
727
+
728
+ const keepaliveAgent = isHttps ? new https.Agent({
729
+ keepAlive: true
730
+ }) : new http.Agent({
731
+ keepAlive: true
732
+ });
733
+
734
+ if (isHttps) {
735
+ optsWithAuth.agent = {
736
+ https: keepaliveAgent
737
+ };
738
+ } else {
739
+ optsWithAuth.agent = {
740
+ http: keepaliveAgent
741
+ };
742
+ } // Send Type 1 message
743
+
744
+
745
+ const ntlmOpts = {
746
+ username: this._username,
747
+ password: this._password,
748
+ domain: '',
749
+ workstation: '',
750
+ url: optsWithAuth.url
751
+ };
752
+ optsWithAuth.headers['Authorization'] = ntlm.createType1Message(ntlmOpts);
753
+ optsWithAuth.headers['Connection'] = 'keep-alive';
754
+ optsWithAuth.throwHttpErrors = false;
755
+ let type1MsgResponse = await (0, _got.default)(optsWithAuth);
756
+ authMethods = (0, _ntlmUtil.getAuthenticateMethods)(type1MsgResponse); // Parse Type 2 response
757
+
758
+ if (type1MsgResponse.statusCode === 401 && authMethods.length > 0 && authMethods[0].startsWith('ntlm')) {
759
+ const type2Msg = ntlm.parseType2Message(type1MsgResponse.headers['www-authenticate']);
760
+ optsWithAuth.followRedirect = false;
761
+ optsWithAuth.headers['Connection'] = 'close';
762
+ optsWithAuth.headers['Authorization'] = ntlm.createType3Message(type2Msg, ntlmOpts);
763
+ } else {
764
+ return response;
765
+ }
766
+
767
+ optsWithAuth.throwHttpErrors = true; // Send Type 3 message
768
+
769
+ return await this._httpRequestSync(optsWithAuth, true);
770
+ }
771
+
657
772
  }
658
773
 
659
774
  exports.default = HttpModule;
660
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS1odHRwLmpzIl0sIm5hbWVzIjpbIk1PRFVMRV9OQU1FIiwiUkVTUE9OU0VfVElNRU9VVCIsIkRBRkFVTFRfSFRUUDIiLCJERUZBVUxUX0hUVFBfT1BUSU9OUyIsImRlY29tcHJlc3MiLCJyZXNwb25zZVR5cGUiLCJ0aW1lb3V0IiwibG9va3VwIiwiY29ubmVjdCIsInNlY3VyZUNvbm5lY3QiLCJzb2NrZXQiLCJzZW5kIiwicmVzcG9uc2UiLCJodHRwMiIsImh0dHBzIiwicmVqZWN0VW5hdXRob3JpemVkIiwiZG5zTG9va3VwSXBWZXJzaW9uIiwiQ09OVEVOVF9UWVBFX0hFQURFUiIsIkhUVFBfTUVUSE9EUyIsIkh0dHBNb2R1bGUiLCJPeHlnZW5Nb2R1bGUiLCJjb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJjb250ZXh0IiwicnMiLCJsb2dnZXIiLCJtb2R1bGVzIiwic2VydmljZXMiLCJfYWx3YXlzSW5pdGlhbGl6ZWQiLCJfbGFzdFJlc3BvbnNlIiwiX2Jhc2VVcmwiLCJfdXNlckh0dHBPcHRpb25zIiwiX2lzSW5pdGlhbGl6ZWQiLCJuYW1lIiwibmV3Rm9ybURhdGEiLCJGb3JtRGF0YSIsInNldE9wdGlvbnMiLCJvcHRzIiwiZGVmbGF0ZVJhdyIsInNldFByb3h5IiwidXJsIiwiYm9vdHN0cmFwIiwicmVxdWlyZSIsInBhcnNlIiwicGFyc2VkVXJsIiwiaG9zdG5hbWUiLCJPeEVycm9yIiwiZXJySGVscGVyIiwiZXJyb3JDb2RlIiwiSFRUUF9FUlJPUiIsInBvcnQiLCJwcm90b2NvbCIsImdsb2JhbCIsIkdMT0JBTF9BR0VOVCIsIkhUVFBfUFJPWFkiLCJnZXQiLCJoZWFkZXJzIiwiaHR0cE9wdHMiLCJtZXRob2QiLCJfaHR0cFJlcXVlc3RTeW5jIiwicG9zdCIsImRhdGEiLCJpc0Zvcm1EYXRhIiwicmVzb2x2ZWREYXRhIiwiX3Jlc29sdmVEYXRhIiwicHV0IiwicGF0Y2giLCJkZWxldGUiLCJnZXRSZXNwb25zZSIsImdldFJlc3BvbnNlQm9keSIsImJvZHkiLCJnZXRSZXNwb25zZUhlYWRlcnMiLCJnZXRSZXNwb25zZVVybCIsImFzc2VydFRleHQiLCJwYXR0ZXJuIiwiQVNTRVJUX0VSUk9SIiwicmVzcENvbnRlbnQiLCJKU09OIiwic3RyaW5naWZ5IiwibW9kVXRpbHMiLCJtYXRjaFBhdHRlcm4iLCJhc3NlcnRSZXNwb25zZVRpbWUiLCJtYXhUaW1lIiwiRXJyb3IiLCJhc3NlcnRIZWFkZXIiLCJoZWFkZXJOYW1lIiwiaGVhZGVyVmFsdWVQYXR0ZXJuIiwibGVuZ3RoIiwidG9Mb3dlckNhc2UiLCJhY3R1YWxIZWFkZXJWYWx1ZSIsImFzc2VydENvb2tpZSIsImNvb2tpZU5hbWUiLCJjb29raWVWYWx1ZVBhdHRlcm4iLCJhc3NlcnRTdGF0dXMiLCJjb2RlTGlzdCIsIkFycmF5IiwiaXNBcnJheSIsInN0YXR1c0NvZGUiLCJpbmNsdWRlcyIsImFzc2VydFN0YXR1c09rIiwidHJhbnNhY3Rpb24iLCJ0b1N0cmluZyIsIl9sYXN0VHJhbnNhY3Rpb25OYW1lIiwiZ2V0U3RlcERpc3BsYXlOYW1lIiwibWV0aG9kTmFtZSIsIm1ldGhvZEFyZ3MiLCJyZXR2YWwiLCJlcnJvciIsInVuZGVmaW5lZCIsIl9leHRyYSIsImh0dHAiLCJyZXF1ZXN0IiwidG9VcHBlckNhc2UiLCJwYXRoIiwiX2FkZFJlcXVlc3RFeHRyYSIsInVwZGF0ZWRPcHRpb25zIiwiVVJMIiwicmVxRXh0cmEiLCJwYXRobmFtZSIsInNlYXJjaCIsImhhc2giLCJxdWVyeVBhcmFtcyIsIl9nZXRRdWVyeVBhcmFtcyIsInNlYXJjaFBhcmFtcyIsImNvbnRlbnRUeXBlIiwiX2dldENvbnRlbnRUeXBlIiwiY29udGVudExlbmd0aCIsIl9nZXRDb250ZW50TGVuZ3RoIiwiZm9ybSIsImZvcm1EYXRhIiwianNvbiIsIk9iamVjdCIsImNvbnRlbnQiLCJtYXRjaCIsImxlbmd0aEFzU3RyIiwicGFyc2VJbnQiLCJmcm9tIiwia2V5cyIsInJlZHVjZSIsInJlY29yZCIsImtleSIsInZhbHVlcyIsImdldEFsbCIsImpvaW4iLCJfYWRkUmVzcG9uc2VFeHRyYSIsInJlc0V4dHJhIiwicmVkaXJlY3RVcmxzIiwic3RhdHVzVGV4dCIsInN0YXR1c01lc3NhZ2UiLCJ2ZXJzaW9uIiwiaHR0cFZlcnNpb24iLCJ0aW1pbmdzIiwicGhhc2VzIiwiZGF0YVJlc29sdmVyIiwiYXNzZXJ0Q2lyY3VsYXIiLCJyZXN1bHQiLCJob29rcyIsImJlZm9yZVJlcXVlc3QiLCJ6bGliIiwiZGVjb21wIiwiY3JlYXRlSW5mbGF0ZVJhdyIsIndyaXRlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJvbiIsImUiLCJlcnJvck1lc3NhZ2UiLCJtZXNzYWdlIiwicmF3Qm9keSIsInVwZ3JhZGUiLCJyZXF1ZXN0VXJsIiwiaXNGcm9tQ2FjaGUiLCJpcCIsInJldHJ5Q291bnQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQWFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFRQSxNQUFNQSxXQUFXLEdBQUcsTUFBcEI7QUFDQSxNQUFNQyxnQkFBZ0IsR0FBRyxPQUFPLEVBQWhDLEMsQ0FBc0M7O0FBQ3RDLE1BQU1DLGFBQWEsR0FBRyxLQUF0QjtBQUNBLE1BQU1DLG9CQUFvQixHQUFHO0FBQ3pCQyxFQUFBQSxVQUFVLEVBQUUsSUFEYTtBQUV6QkMsRUFBQUEsWUFBWSxFQUFFLE1BRlc7QUFHekJDLEVBQUFBLE9BQU8sRUFBRTtBQUNMQyxJQUFBQSxNQUFNLEVBQUUsSUFESDtBQUVMQyxJQUFBQSxPQUFPLEVBQUUsR0FGSjtBQUdMQyxJQUFBQSxhQUFhLEVBQUUsR0FIVjtBQUlMQyxJQUFBQSxNQUFNLEVBQUUsTUFKSDtBQUtMQyxJQUFBQSxJQUFJLEVBQUUsTUFMRDtBQU1MQyxJQUFBQSxRQUFRLEVBQUVYO0FBTkwsR0FIZ0I7QUFXekJZLEVBQUFBLEtBQUss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QyxHQUE0QyxJQUxoRDtBQU1MbkcsUUFBQUEsSUFBSSxFQUFFQTtBQU5ELE9BQVQ7QUFRSCxLQXhCRCxNQXdCTztBQUNIcUYsTUFBQUEsTUFBTSxHQUFHO0FBQ0xMLFFBQUFBLFdBQVcsRUFBRUssTUFBTSxDQUFDTCxXQURmO0FBRUw5RixRQUFBQSxPQUFPLEVBQUVtRyxNQUFNLENBQUNuRyxPQUZYO0FBR0xrSCxRQUFBQSxPQUFPLEVBQUVmLE1BQU0sQ0FBQ2UsT0FIWDtBQUlMbEksUUFBQUEsR0FBRyxFQUFFbUgsTUFBTSxDQUFDbkgsR0FKUDtBQUtMa0IsUUFBQUEsTUFBTSxFQUFFaUcsTUFBTSxDQUFDakcsTUFMVjtBQU1MdUMsUUFBQUEsVUFBVSxFQUFFMEQsTUFBTSxDQUFDMUQsVUFOZDtBQU9MbUQsUUFBQUEsYUFBYSxFQUFFTyxNQUFNLENBQUNQLGFBUGpCO0FBUUxHLFFBQUFBLE9BQU8sRUFBRUksTUFBTSxDQUFDSixPQVJYO0FBU0xvQixRQUFBQSxVQUFVLEVBQUVoQixNQUFNLENBQUNnQixVQVRkO0FBVUx6QixRQUFBQSxZQUFZLEVBQUVTLE1BQU0sQ0FBQ1QsWUFWaEI7QUFXTDBCLFFBQUFBLFdBQVcsRUFBRWpCLE1BQU0sQ0FBQ2lCLFdBWGY7QUFZTEMsUUFBQUEsRUFBRSxFQUFFbEIsTUFBTSxDQUFDa0IsRUFaTjtBQWFMQyxRQUFBQSxVQUFVLEVBQUVuQixNQUFNLENBQUNtQixVQWJkO0FBY0x4RyxRQUFBQSxJQUFJLEVBQUVxRixNQUFNLENBQUNyRjtBQWRSLE9BQVQ7QUFnQkg7O0FBQ0QsU0FBSzBFLGlCQUFMLENBQXVCVyxNQUF2QixFQXZGNkIsQ0F3RjdCOzs7QUFDQSxTQUFLOUgsYUFBTCxHQUFxQjhILE1BQXJCO0FBRUEsV0FBT0EsTUFBUDtBQUNIOztBQTloQmdEIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChDKSAyMDE1LXByZXNlbnQgQ2xvdWRCZWF0IExpbWl0ZWRcclxuICpcclxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcclxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcclxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cclxuICovXHJcblxyXG4vKipcclxuICogQG5hbWUgaHR0cFxyXG4gKiBAZGVzY3JpcHRpb24gUHJvdmlkZXMgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIEhUVFAoUylcclxuICovXHJcbmltcG9ydCBnb3QgZnJvbSAnZ290JztcclxuaW1wb3J0IEZvcm1EYXRhIGZyb20gJ2Zvcm0tZGF0YSc7XHJcbmltcG9ydCBPeHlnZW5Nb2R1bGUgZnJvbSAnLi4vY29yZS9PeHlnZW5Nb2R1bGUnO1xyXG5pbXBvcnQgT3hFcnJvciBmcm9tICcuLi9lcnJvcnMvT3h5Z2VuRXJyb3InO1xyXG5pbXBvcnQgZXJySGVscGVyIGZyb20gJy4uL2Vycm9ycy9oZWxwZXInO1xyXG5pbXBvcnQgbW9kVXRpbHMgZnJvbSAnLi91dGlscyc7XHJcblxyXG5jb25zdCBNT0RVTEVfTkFNRSA9ICdodHRwJztcclxuY29uc3QgUkVTUE9OU0VfVElNRU9VVCA9IDEwMDAgKiA2MDsgICAvLyBpbiBtc1xyXG5jb25zdCBEQUZBVUxUX0hUVFAyID0gZmFsc2U7XHJcbmNvbnN0IERFRkFVTFRfSFRUUF9PUFRJT05TID0ge1xyXG4gICAgZGVjb21wcmVzczogdHJ1ZSxcclxuICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnLFxyXG4gICAgdGltZW91dDoge1xyXG4gICAgICAgIGxvb2t1cDogMTAwMCxcclxuICAgICAgICBjb25uZWN0OiA1MDAsXHJcbiAgICAgICAgc2VjdXJlQ29ubmVjdDogNTAwLFxyXG4gICAgICAgIHNvY2tldDogMTAwMDAwLFxyXG4gICAgICAgIHNlbmQ6IDEwMDAwMCxcclxuICAgICAgICByZXNwb25zZTogUkVTUE9OU0VfVElNRU9VVFxyXG4gICAgfSxcclxuICAgIGh0dHAyOiBEQUZBVUxUX0hUVFAyLFxyXG4gICAgaHR0cHM6IHtcclxuICAgICAgICByZWplY3RVbmF1dGhvcml6ZWQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAgZG5zTG9va3VwSXBWZXJzaW9uOiAnaXB2NCdcclxufTtcclxuY29uc3QgQ09OVEVOVF9UWVBFX0hFQURFUiA9ICdjb250ZW50LXR5cGUnO1xyXG5jb25zdCBIVFRQX01FVEhPRFMgPSBbXHJcbiAgICAnZ2V0JyxcclxuICAgICdwb3N0JyxcclxuICAgICdwYXRjaCdcclxuXTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEh0dHBNb2R1bGUgZXh0ZW5kcyBPeHlnZW5Nb2R1bGUge1xyXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucywgY29udGV4dCwgcnMsIGxvZ2dlciwgbW9kdWxlcywgc2VydmljZXMpIHtcclxuICAgICAgICBzdXBlcihvcHRpb25zLCBjb250ZXh0LCBycywgbG9nZ2VyLCBtb2R1bGVzLCBzZXJ2aWNlcyk7XHJcbiAgICAgICAgdGhpcy5fYWx3YXlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2xhc3RSZXNwb25zZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fYmFzZVVybCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fdXNlckh0dHBPcHRpb25zID0ge307XHJcbiAgICAgICAgLy8gcHJlLWluaXRpYWxpemUgdGhlIG1vZHVsZVxyXG4gICAgICAgIHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qXHJcbiAgICAgKiBAc3VtbWFyeSBHZXRzIG1vZHVsZSBuYW1lXHJcbiAgICAgKiBAZnVuY3Rpb24gbmFtZVxyXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBDb25zdGFudCB2YWx1ZSBcImh0dHBcIi5cclxuICAgICAqL1xyXG4gICAgZ2V0IG5hbWUoKSB7XHJcbiAgICAgICAgcmV0dXJuIE1PRFVMRV9OQU1FO1xyXG4gICAgfVxyXG5cclxuICAgIC8qXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIGEgbmV3IEZvcm1EYXRhIG9iamVjdFxyXG4gICAgICogQGZ1bmN0aW9uIG5ld0Zvcm1EYXRhXHJcbiAgICAgKiBAcmV0dXJuIHtGb3JtRGF0YX0gbmV3IEZvcm1EYXRhIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgbmV3Rm9ybURhdGEoKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBGb3JtRGF0YSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgU2V0cyB1c2VyIGRlZmluZWQgSFRUUCBvcHRpb25zIChzdWNoIGFzIHByb3h5LCBkZWNvbXByZXNzIGFuZCBldGMuKVxyXG4gICAgICogQGZ1bmN0aW9uIHNldE9wdGlvbnNcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gSFRUUCByZXF1ZXN0IG9wdGlvbnMgb2JqZWN0LCBzZWUgW1JlcXVlc3QgT3B0aW9uc10oaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9nb3QvYmxvYi9tYWluL2RvY3VtZW50YXRpb24vMi1vcHRpb25zLm1kKS4gXHJcbiAgICAgKiBJbiBhZGRpdGlvbiB0byB0aGUgb3B0aW9ucyBsaXN0ZWQgaW4gdGhlIGxpbmtlZCBkb2N1bWVudCwgJ2RlZmxhdGVSYXcnIG9wdGlvbiBjYW4gYmUgdXNlZCB3aGVuIHNlcnZlciByZXR1cm5zIERlZmxhdGUtY29tcHJlc3NlZCBzdHJlYW0gd2l0aG91dCBoZWFkZXJzLlxyXG4gICAgICovXHJcbiAgICBzZXRPcHRpb25zKG9wdHMpIHtcclxuICAgICAgICB0aGlzLl91c2VySHR0cE9wdGlvbnMgPSBvcHRzO1xyXG4gICAgICAgIGlmIChvcHRzLmRlZmxhdGVSYXcpIHtcclxuICAgICAgICAgICAgdGhpcy5fdXNlckh0dHBPcHRpb25zLmRlY29tcHJlc3MgPSBmYWxzZTsgICAgIC8vIGRlY29tcHJlc3M9dHJ1ZSBpbiBkZWZhdWx0IG9wdGlvbnMgc28gd2Ugb3ZlcnJpZGUgaXRcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBTZXRzIHByb3h5IHVybCB0byBiZSB1c2VkIGZvciBjb25uZWN0aW9ucyB3aXRoIHRoZSBzZXJ2aWNlLlxyXG4gICAgICogQGZ1bmN0aW9uIHNldFByb3h5XHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIC0gUHJveHkgc2VydmVyIFVSTC4gTm90IHBhc3NpbmcgdGhpcyBhcmd1bWVudCB3aWxsIHJlc2V0IHRoZSBwcm94eSBzZXR0aW5ncy5cclxuICAgICAqL1xyXG4gICAgc2V0UHJveHkodXJsKSB7XHJcbiAgICAgICAgaWYgKHVybCkge1xyXG4gICAgICAgICAgICBjb25zdCB7XHJcbiAgICAgICAgICAgICAgICBib290c3RyYXBcclxuICAgICAgICAgICAgfSA9IHJlcXVpcmUoJ2dsb2JhbC1hZ2VudCcpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgeyBwYXJzZSB9ID0gcmVxdWlyZSgndXJsJyk7XHJcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZFVybCA9IHBhcnNlKHVybCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXBhcnNlZFVybC5ob3N0bmFtZSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5IVFRQX0VSUk9SLCAnSG9zdG5hbWUgaW4gdW5kZWZpbmVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFwYXJzZWRVcmwucG9ydCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5IVFRQX0VSUk9SLCAnUG9ydCBpbiB1bmRlZmluZWQnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIXBhcnNlZFVybC5wcm90b2NvbCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5IVFRQX0VSUk9SLCAnUHJvdG9jb2wgaW4gdW5kZWZpbmVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGJvb3RzdHJhcCgpO1xyXG4gICAgICAgICAgICBnbG9iYWwuR0xPQkFMX0FHRU5ULkhUVFBfUFJPWFkgPSB1cmw7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZ2xvYmFsLkdMT0JBTF9BR0VOVC5IVFRQX1BST1hZID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUGVyZm9ybXMgSFRUUCBHRVRcclxuICAgICAqIEBmdW5jdGlvbiBnZXRcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgLSBVUkwuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdD19IGhlYWRlcnMgLSBIVFRQIGhlYWRlcnMuXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJlc3BvbnNlIG9iamVjdC5cclxuICAgICAqIEBleGFtcGxlIDxjYXB0aW9uPltqYXZhc2NyaXB0XSBVc2FnZSBleGFtcGxlPC9jYXB0aW9uPlxyXG4gICAgICogLy8gQmFzaWMgdXNhZ2UgZXhhbXBsZTpcclxuICAgICAqIHZhciByZXNwb25zZSA9IGh0dHAuZ2V0KFxyXG4gICAgICogJ2h0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3Mvb3h5Z2VuaHEvb3h5Z2VuLWlkZS9yZWxlYXNlcycsIFxyXG4gICAgICoge1xyXG4gICAgICogICAnQWNjZXB0LUVuY29kaW5nJzogJ2d6aXAsIGRlZmxhdGUnLFxyXG4gICAgICogICAnVXNlci1BZ2VudCc6ICdNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0OyBydjo4Ni4wKSBHZWNrby8yMDEwMDEwMSBGaXJlZm94Lzg2LjAnXHJcbiAgICAgKiB9KTtcclxuICAgICAqIGxvZy5pbmZvKHJlc3BvbnNlLmJvZHkpO1xyXG4gICAgICpcclxuICAgICAqIC8vIElmIHNlcnZlciByZXR1cm5zIERlZmxhdGUtY29tcHJlc3NlZCBzdHJlYW0gd2l0aG91dCBoZWFkZXJzLCBgZGVmbGF0ZVJhd2AgY2FuIGJlIHVzZWQgdG8gZGVjb21wcmVzcyB0aGUgY29udGVudC5cclxuICAgICAqIGh0dHAuc2V0T3B0aW9ucyh7XHJcbiAgICAgKiAgIGRlZmxhdGVSYXc6IHRydWVcclxuICAgICAqIH0pO1xyXG4gICAgICogdmFyIHJlc3BvbnNlID0gaHR0cC5nZXQoJ2h0dHBzOi8vRk9PLkJBUicpO1xyXG4gICAgICogbG9nLmluZm8ocmVzcG9uc2UuYm9keSk7XHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGdldCh1cmwsIGhlYWRlcnMpIHtcclxuICAgICAgICBjb25zdCBodHRwT3B0cyA9IHtcclxuICAgICAgICAgICAgLi4uREVGQVVMVF9IVFRQX09QVElPTlMsXHJcbiAgICAgICAgICAgIC4uLnRoaXMuX3VzZXJIdHRwT3B0aW9ucyB8fCB7fSxcclxuICAgICAgICAgICAgdXJsOiB1cmwsXHJcbiAgICAgICAgICAgIG1ldGhvZDogJ0dFVCcsXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMgfHwge31cclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9odHRwUmVxdWVzdFN5bmMoaHR0cE9wdHMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUGVyZm9ybXMgSFRUUCBQT1NUXHJcbiAgICAgKiBAZnVuY3Rpb24gcG9zdFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCAtIFVSTC5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gRGF0YS5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gaGVhZGVycyAtIEhUVFAgaGVhZGVycy5cclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbj19IGlzRm9ybURhdGEgLSBJbmRpY2F0ZXMgaWYgXCJkYXRhXCIgcGFyYW1ldGVyIGlzIG9mIFVSTC1lbmNvZGVkIGZvcm0gdHlwZS5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gUmVzcG9uc2Ugb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBhc3luYyBwb3N0KHVybCwgZGF0YSwgaGVhZGVycywgaXNGb3JtRGF0YSA9IGZhbHNlKSB7XHJcbiAgICAgICAgY29uc3QgcmVzb2x2ZWREYXRhID0gdGhpcy5fcmVzb2x2ZURhdGEoZGF0YSwgaGVhZGVycywgaXNGb3JtRGF0YSk7XHJcbiAgICAgICAgY29uc3QgaHR0cE9wdHMgPSB7XHJcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfSFRUUF9PUFRJT05TLFxyXG4gICAgICAgICAgICAuLi50aGlzLl91c2VySHR0cE9wdGlvbnMgfHwge30sXHJcbiAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyB8fCB7fSxcclxuICAgICAgICAgICAgLi4ucmVzb2x2ZWREYXRhXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5faHR0cFJlcXVlc3RTeW5jKGh0dHBPcHRzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFBlcmZvcm1zIEhUVFAgUFVUXHJcbiAgICAgKiBAZnVuY3Rpb24gcHV0XHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIC0gVVJMLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBEYXRhLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3Q9fSBoZWFkZXJzIC0gSFRUUCBoZWFkZXJzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBSZXNwb25zZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHB1dCh1cmwsIGRhdGEsIGhlYWRlcnMpIHtcclxuICAgICAgICBjb25zdCByZXNvbHZlZERhdGEgPSB0aGlzLl9yZXNvbHZlRGF0YShkYXRhKTtcclxuXHJcbiAgICAgICAgY29uc3QgaHR0cE9wdHMgPSB7XHJcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfSFRUUF9PUFRJT05TLFxyXG4gICAgICAgICAgICAuLi50aGlzLl91c2VySHR0cE9wdGlvbnMgfHwge30sXHJcbiAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICBtZXRob2Q6ICdQVVQnLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzIHx8IHt9LFxyXG4gICAgICAgICAgICAuLi5yZXNvbHZlZERhdGFcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9odHRwUmVxdWVzdFN5bmMoaHR0cE9wdHMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUGVyZm9ybXMgSFRUUCBQQVRDSFxyXG4gICAgICogQGZ1bmN0aW9uIHBhdGNoXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIC0gVVJMLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBEYXRhLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3Q9fSBoZWFkZXJzIC0gSFRUUCBoZWFkZXJzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBSZXNwb25zZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHBhdGNoKHVybCwgZGF0YSwgaGVhZGVycykge1xyXG4gICAgICAgIGNvbnN0IHJlc29sdmVkRGF0YSA9IHRoaXMuX3Jlc29sdmVEYXRhKGRhdGEpO1xyXG5cclxuICAgICAgICBjb25zdCBodHRwT3B0cyA9IHtcclxuICAgICAgICAgICAgLi4uREVGQVVMVF9IVFRQX09QVElPTlMsXHJcbiAgICAgICAgICAgIC4uLnRoaXMuX3VzZXJIdHRwT3B0aW9ucyB8fCB7fSxcclxuICAgICAgICAgICAgdXJsOiB1cmwsXHJcbiAgICAgICAgICAgIG1ldGhvZDogJ1BBVENIJyxcclxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyB8fCB7fSxcclxuICAgICAgICAgICAgLi4ucmVzb2x2ZWREYXRhXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5faHR0cFJlcXVlc3RTeW5jKGh0dHBPcHRzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFBlcmZvcm1zIEhUVFAgREVMRVRFXHJcbiAgICAgKiBAZnVuY3Rpb24gZGVsZXRlXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIC0gVVJMLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3Q9fSBoZWFkZXJzIC0gSFRUUCBoZWFkZXJzLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBEYXRhLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBSZXNwb25zZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGRlbGV0ZSh1cmwsIGhlYWRlcnMsIGRhdGEpIHtcclxuICAgICAgICBjb25zdCByZXNvbHZlZERhdGEgPSB0aGlzLl9yZXNvbHZlRGF0YShkYXRhKTtcclxuICAgICAgICBjb25zdCBodHRwT3B0cyA9IHtcclxuICAgICAgICAgICAgLi4uREVGQVVMVF9IVFRQX09QVElPTlMsXHJcbiAgICAgICAgICAgIC4uLnRoaXMuX3VzZXJIdHRwT3B0aW9ucyB8fCB7fSxcclxuICAgICAgICAgICAgdXJsOiB1cmwsXHJcbiAgICAgICAgICAgIG1ldGhvZDogJ0RFTEVURScsXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMgfHwge30sXHJcbiAgICAgICAgICAgIC4uLnJlc29sdmVkRGF0YVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2h0dHBSZXF1ZXN0U3luYyhodHRwT3B0cyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIGxhc3QgcmVzcG9uc2Ugb2JqZWN0XHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0UmVzcG9uc2VcclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gUmVzcG9uc2Ugb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBnZXRSZXNwb25zZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbGFzdFJlc3BvbnNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUmV0dXJucyBsYXN0IHJlc3BvbnNlIGJvZHlcclxuICAgICAqIEBmdW5jdGlvbiBnZXRSZXNwb25zZUJvZHlcclxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gUmVzcG9uc2UgYm9keS5cclxuICAgICAqL1xyXG4gICAgZ2V0UmVzcG9uc2VCb2R5KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9sYXN0UmVzcG9uc2UgJiYgdGhpcy5fbGFzdFJlc3BvbnNlLmJvZHkgPyB0aGlzLl9sYXN0UmVzcG9uc2UuYm9keSA6IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIHJlc3BvbnNlIGhlYWRlcnNcclxuICAgICAqIEBmdW5jdGlvbiBnZXRSZXNwb25zZUhlYWRlcnNcclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gUmVzcG9uc2UgaGVhZGVycy5cclxuICAgICAqL1xyXG4gICAgZ2V0UmVzcG9uc2VIZWFkZXJzKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fbGFzdFJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5fbGFzdFJlc3BvbnNlLmhlYWRlcnM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIHJlc3BvbnNlIFVSTFxyXG4gICAgICogQGZ1bmN0aW9uIGdldFJlc3BvbnNlVXJsXHJcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFJlc3BvbnNlIFVSTC5cclxuICAgICAqL1xyXG4gICAgZ2V0UmVzcG9uc2VVcmwoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9sYXN0UmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9sYXN0UmVzcG9uc2UudXJsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwYXR0ZXJuIGlzIHByZXNlbnQgaW4gdGhlIHJlc3BvbnNlIGJvZHkuXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0VGV4dFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdHRlcm4gLSBQYXR0ZXJuIHRvIGFzc2VydC5cclxuICAgICAqL1xyXG4gICAgYXNzZXJ0VGV4dChwYXR0ZXJuKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9sYXN0UmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuX2xhc3RSZXNwb25zZS5ib2R5KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCAnUmVzcG9uc2UgYm9keSBpcyBlbXB0eScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCByZXNwQ29udGVudCA9IHR5cGVvZiB0aGlzLl9sYXN0UmVzcG9uc2UuYm9keSA9PT0gJ3N0cmluZycgPyB0aGlzLl9sYXN0UmVzcG9uc2UuYm9keSA6IEpTT04uc3RyaW5naWZ5KHRoaXMuX2xhc3RSZXNwb25zZS5ib2R5KTtcclxuICAgICAgICBpZiAoIW1vZFV0aWxzLm1hdGNoUGF0dGVybihyZXNwQ29udGVudCwgcGF0dGVybikpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIGBFeHBlY3RlZCBIVFRQIHJlc3BvbnNlIGNvbnRlbnQgdG8gbWF0Y2g6IFwiJHtwYXR0ZXJufVwiIGJ1dCBnb3Q6IFwiJHtyZXNwQ29udGVudH1cImApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEFzc2VydCByZXNwb25zZSB0aW1lXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0UmVzcG9uc2VUaW1lXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gbWF4VGltZSAtIE1heGltdW0gcmVzcG9uc2UgdGltZSBpbiBtaWxsaXNlY29uZHMuXHJcbiAgICAgKi9cclxuICAgIGFzc2VydFJlc3BvbnNlVGltZShtYXhUaW1lKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEFzc2VydCBpZiBIVFRQIGhlYWRlciBpcyBwcmVzZW50ZWQgaW4gdGhlIHJlc3BvbnNlXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0SGVhZGVyXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaGVhZGVyTmFtZSAtIEEgSFRUUCBoZWFkZXIgbmFtZS5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nPX0gaGVhZGVyVmFsdWVQYXR0ZXJuIC0gQW4gb3B0aW9uYWwgSFRUUCBoZWFkZXIgdmFsdWUgcGF0dGVybi5cclxuICAgICAqL1xyXG4gICAgYXNzZXJ0SGVhZGVyKGhlYWRlck5hbWUsIGhlYWRlclZhbHVlUGF0dGVybiA9IG51bGwpIHtcclxuICAgICAgICBpZiAoIWhlYWRlck5hbWUgfHwgdHlwZW9mIGhlYWRlck5hbWUgIT09ICdzdHJpbmcnIHx8IGhlYWRlck5hbWUubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBoZWFkZXJOYW1lID0gaGVhZGVyTmFtZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLl9sYXN0UmVzcG9uc2UuaGVhZGVycztcclxuICAgICAgICBpZiAoIWhlYWRlcnNbaGVhZGVyTmFtZV0pIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsICdFeHBlY3RlZCBIVFRQIGhlYWRlciBcIiR7aGVhZGVyTmFtZX1cIiB0byBiZSBwcmVzZW50Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGhlYWRlclZhbHVlUGF0dGVybiAmJiB0eXBlb2YgaGVhZGVyVmFsdWVQYXR0ZXJuID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBjb25zdCBhY3R1YWxIZWFkZXJWYWx1ZSA9IGhlYWRlcnNbaGVhZGVyTmFtZV07XHJcbiAgICAgICAgICAgIGlmICghbW9kVXRpbHMubWF0Y2hQYXR0ZXJuKGFjdHVhbEhlYWRlclZhbHVlLCBoZWFkZXJWYWx1ZVBhdHRlcm4pKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgYEV4cGVjdGVkIEhUVFAgaGVhZGVyIFwiJHtoZWFkZXJOYW1lfVwiIHZhbHVlIHRvIG1hdGNoOiBcIiR7aGVhZGVyVmFsdWVQYXR0ZXJufVwiIGJ1dCBnb3Q6IFwiJHthY3R1YWxIZWFkZXJWYWx1ZX1cImApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IGlmIEhUVFAgY29va2llIGlzIHByZXNlbnRlZCBpbiB0aGUgcmVzcG9uc2VcclxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnRDb29raWVcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb29raWVOYW1lIC0gQSBIVFRQIGNvb2tpZSBuYW1lLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBjb29raWVWYWx1ZVBhdHRlcm4gLSBBbiBvcHRpb25hbCBIVFRQIGNvb2tpZSB2YWx1ZSBwYXR0ZXJuLlxyXG4gICAgICovXHJcbiAgICBhc3NlcnRDb29raWUoY29va2llTmFtZSwgY29va2llVmFsdWVQYXR0ZXJuKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEFzc2VydCB0aGUgbGFzdCBIVFRQIHJlc3BvbnNlJ3Mgc3RhdHVzIGNvZGVcclxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnRTdGF0dXNcclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfEFycmF5fSBjb2RlTGlzdCAtIEEgc2luZ2xlIHN0YXR1cyBjb2RlIG9yIGEgbGlzdCBvZiBjb2Rlcy5cclxuICAgICAqL1xyXG4gICAgYXNzZXJ0U3RhdHVzKGNvZGVMaXN0KSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9sYXN0UmVzcG9uc2UgfHwgIWNvZGVMaXN0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWYgd2UgZ290IGEgc2luZ2xlIHZhbHVlLCB0aGVuIGNvbnZlcnQgaXQgdG8gYW4gYXJyYXlcclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29kZUxpc3QpKSB7XHJcbiAgICAgICAgICAgIGNvZGVMaXN0ID0gW2NvZGVMaXN0XTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc3RhdHVzQ29kZSA9IHRoaXMuX2xhc3RSZXNwb25zZS5zdGF0dXNDb2RlO1xyXG4gICAgICAgIGlmICghY29kZUxpc3QuaW5jbHVkZXMoc3RhdHVzQ29kZSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIGBFeHBlY3RlZCBIVFRQIHN0YXR1cyB0byBiZTogXCIke2NvZGVMaXN0fVwiIGJ1dCBnb3Q6IFwiJHtzdGF0dXNDb2RlfVwiYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IEhUVFAgMjAwIE9LIHN0YXR1c1xyXG4gICAgICogQGZ1bmN0aW9uIGFzc2VydFN0YXR1c09rXHJcbiAgICAgKi9cclxuICAgIGFzc2VydFN0YXR1c09rKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFzc2VydFN0YXR1cygyMDApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgT3BlbnMgbmV3IHRyYW5zYWN0aW9uLlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFRoZSB0cmFuc2FjdGlvbiB3aWxsIHBlcnNpc3QgdGlsbCBhIG5ldyBvbmUgaXMgb3BlbmVkLiBUcmFuc2FjdGlvbiBuYW1lcyBtdXN0IGJlIHVuaXF1ZS5cclxuICAgICAqIEBmdW5jdGlvbiB0cmFuc2FjdGlvblxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgLSBUaGUgdHJhbnNhY3Rpb24gbmFtZS5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgdHJhbnNhY3Rpb24obmFtZSkge1xyXG4gICAgICAgIGlmICghbmFtZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGp1c3QgaW4gY2FzZSB1c2VyIHBhc3NlZCBhIGNvbXBsZXggb2JqZWN0IGJ5IG1pc3Rha2VcclxuICAgICAgICBuYW1lID0gbmFtZS50b1N0cmluZygpO1xyXG4gICAgICAgIGdsb2JhbC5fbGFzdFRyYW5zYWN0aW9uTmFtZSA9IG5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U3RlcERpc3BsYXlOYW1lKG1ldGhvZE5hbWUsIG1ldGhvZEFyZ3MsIHJldHZhbCwgZXJyb3IpIHtcclxuICAgICAgICBpZiAoIUhUVFBfTUVUSE9EUy5pbmNsdWRlcyhtZXRob2ROYW1lKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuX2V4dHJhIHx8ICF0aGlzLl9leHRyYS5odHRwIHx8ICF0aGlzLl9leHRyYS5odHRwLnJlcXVlc3QpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGAke21ldGhvZE5hbWUudG9VcHBlckNhc2UoKX0gJHt0aGlzLl9leHRyYS5odHRwLnJlcXVlc3QucGF0aH1gO1xyXG4gICAgfVxyXG5cclxuICAgIF9hZGRSZXF1ZXN0RXh0cmEocmVxdWVzdCwgdXBkYXRlZE9wdGlvbnMpIHtcclxuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcXVlc3QudXJsKTtcclxuICAgICAgICBjb25zdCByZXFFeHRyYSA9IHtcclxuICAgICAgICAgICAgdXJsOiByZXF1ZXN0LnVybCxcclxuICAgICAgICAgICAgcGF0aDogYCR7dXJsLnBhdGhuYW1lfSR7dXJsLnNlYXJjaH0ke3VybC5oYXNofWAsXHJcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB0aGlzLl9nZXRRdWVyeVBhcmFtcyh1cmwuc2VhcmNoUGFyYW1zKSxcclxuICAgICAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcclxuICAgICAgICAgICAgaGVhZGVyczogdXBkYXRlZE9wdGlvbnMuaGVhZGVycyxcclxuICAgICAgICAgICAgY29udGVudFR5cGU6IHRoaXMuX2dldENvbnRlbnRUeXBlKHVwZGF0ZWRPcHRpb25zLmhlYWRlcnMpLFxyXG4gICAgICAgICAgICBjb250ZW50TGVuZ3RoOiB0aGlzLl9nZXRDb250ZW50TGVuZ3RoKHVwZGF0ZWRPcHRpb25zLmhlYWRlcnMpLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKHJlcXVlc3QuZm9ybSkge1xyXG4gICAgICAgICAgICByZXFFeHRyYS5mb3JtRGF0YSA9IHJlcXVlc3QuZm9ybTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAocmVxdWVzdC5qc29uKSB7XHJcbiAgICAgICAgICAgIHJlcUV4dHJhLmNvbnRlbnRUeXBlID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xyXG4gICAgICAgICAgICBpZiAocmVxdWVzdC5qc29uIGluc3RhbmNlb2YgT2JqZWN0KSB7XHJcbiAgICAgICAgICAgICAgICByZXFFeHRyYS5jb250ZW50ID0gSlNPTi5zdHJpbmdpZnkocmVxdWVzdC5qc29uKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJlcUV4dHJhLmNvbnRlbnQgPSByZXF1ZXN0Lmpzb247XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAocmVxdWVzdC5ib2R5KSB7XHJcbiAgICAgICAgICAgIHJlcUV4dHJhLmNvbnRlbnQgPSByZXF1ZXN0LmJvZHk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2V4dHJhLmh0dHApIHtcclxuICAgICAgICAgICAgdGhpcy5fZXh0cmEuaHR0cCA9IHt9O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9leHRyYS5odHRwLnJlcXVlc3QgPSByZXFFeHRyYTtcclxuICAgIH1cclxuXHJcbiAgICBfZ2V0Q29udGVudFR5cGUoaGVhZGVycyA9IHt9KSB7XHJcbiAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSBoZWFkZXJzWydjb250ZW50LXR5cGUnXTtcclxuICAgICAgICBpZiAoIWNvbnRlbnRUeXBlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG1hdGNoID0gY29udGVudFR5cGUubWF0Y2goL14oLis/KSg7fCQpLyk7XHJcbiAgICAgICAgaWYgKCFtYXRjaCB8fCBtYXRjaC5sZW5ndGggPCAyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBtYXRjaFsxXTtcclxuICAgIH1cclxuXHJcbiAgICBfZ2V0Q29udGVudExlbmd0aChoZWFkZXJzID0ge30pIHtcclxuICAgICAgICBpZiAoIWhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ10pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbGVuZ3RoQXNTdHIgPSBoZWFkZXJzWydjb250ZW50LWxlbmd0aCddO1xyXG4gICAgICAgIHJldHVybiBwYXJzZUludChsZW5ndGhBc1N0cik7XHJcbiAgICB9XHJcblxyXG4gICAgX2dldFF1ZXJ5UGFyYW1zKHNlYXJjaFBhcmFtcykge1xyXG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKCBzZWFyY2hQYXJhbXMua2V5cygpICkucmVkdWNlKCAoIHJlY29yZCwga2V5ICkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBzZWFyY2hQYXJhbXMuZ2V0QWxsKGtleSk7XHJcbiAgICAgICAgICAgIHJldHVybiB7IC4uLnJlY29yZCwgWyBrZXkgXTogdmFsdWVzLmxlbmd0aCA+IDEgPyB2YWx1ZXMuam9pbignLCcpIDogdmFsdWVzWzBdIH07XHJcbiAgICAgICAgfSwge30pO1xyXG4gICAgfVxyXG5cclxuICAgIF9hZGRSZXNwb25zZUV4dHJhKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgY29uc3QgcmVzRXh0cmEgPSB7XHJcbiAgICAgICAgICAgIHVybDogcmVzcG9uc2UucmVkaXJlY3RVcmxzICYmIHJlc3BvbnNlLnJlZGlyZWN0VXJscy5sZW5ndGggJiYgcmVzcG9uc2UucmVkaXJlY3RVcmxzWzBdLFxyXG4gICAgICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNNZXNzYWdlLFxyXG4gICAgICAgICAgICBzdGF0dXNDb2RlOiByZXNwb25zZS5zdGF0dXNDb2RlLFxyXG4gICAgICAgICAgICBjb250ZW50VHlwZTogdGhpcy5fZ2V0Q29udGVudFR5cGUocmVzcG9uc2UuaGVhZGVycyksXHJcbiAgICAgICAgICAgIGNvbnRlbnRMZW5ndGg6IHRoaXMuX2dldENvbnRlbnRMZW5ndGgocmVzcG9uc2UuaGVhZGVycyksXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlLmhlYWRlcnMsXHJcbiAgICAgICAgICAgIHZlcnNpb246IHJlc3BvbnNlLmh0dHBWZXJzaW9uLFxyXG4gICAgICAgICAgICBjb250ZW50OiByZXNwb25zZS5ib2R5LFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKCF0aGlzLl9leHRyYS5odHRwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2V4dHJhLmh0dHAgPSB7fTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fZXh0cmEuaHR0cC5yZXNwb25zZSA9IHJlc0V4dHJhO1xyXG4gICAgICAgIGlmIChyZXNwb25zZS50aW1pbmdzICYmIHJlc3BvbnNlLnRpbWluZ3MucGhhc2VzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2V4dHJhLmh0dHAudGltaW5ncyA9IHsgLi4ucmVzcG9uc2UudGltaW5ncy5waGFzZXMgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIF9yZXNvbHZlRGF0YShkYXRhLCBoZWFkZXJzLCBpc0Zvcm1EYXRhID0gZmFsc2UpIHtcclxuICAgICAgICBjb25zdCBkYXRhUmVzb2x2ZXIgPSB7fTtcclxuXHJcbiAgICAgICAgaWYgKGlzRm9ybURhdGEpIHtcclxuICAgICAgICAgICAgZGF0YVJlc29sdmVyLmZvcm0gPSBkYXRhO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChkYXRhIGluc3RhbmNlb2YgRm9ybURhdGEpIHtcclxuICAgICAgICAgICAgZGF0YVJlc29sdmVyLmJvZHkgPSBkYXRhO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChkYXRhIGluc3RhbmNlb2YgT2JqZWN0KSB7XHJcbiAgICAgICAgICAgIG1vZFV0aWxzLmFzc2VydENpcmN1bGFyKGRhdGEpO1xyXG4gICAgICAgICAgICBkYXRhUmVzb2x2ZXIuanNvbiA9IGRhdGE7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZGF0YVJlc29sdmVyLmJvZHkgPSBkYXRhO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGRhdGFSZXNvbHZlcjtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfaHR0cFJlcXVlc3RTeW5jKGh0dHBPcHRzKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2V4dHJhLmh0dHApIHtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2V4dHJhLmh0dHA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vdGhpcy5fYWRkUmVxdWVzdEV4dHJhKGh0dHBPcHRzKTtcclxuICAgICAgICBsZXQgcmVzdWx0O1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXN1bHQgPSBhd2FpdCBnb3QoeyAuLi5odHRwT3B0cywgaG9va3M6IHtcclxuICAgICAgICAgICAgICAgIGJlZm9yZVJlcXVlc3Q6IFtcclxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0+IHsgdGhpcy5fYWRkUmVxdWVzdEV4dHJhKGh0dHBPcHRzLCBvcHRpb25zKTsgfVxyXG4gICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgfX0pO1xyXG4gICAgICAgICAgICBpZiAoaHR0cE9wdHMuZGVmbGF0ZVJhdyAmJiByZXN1bHQuaGVhZGVyc1snY29udGVudC1lbmNvZGluZyddID09PSAnZGVmbGF0ZScpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHpsaWIgPSByZXF1aXJlKCd6bGliJyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkZWNvbXAgPSB6bGliLmNyZWF0ZUluZmxhdGVSYXcoKTtcclxuICAgICAgICAgICAgICAgIGRlY29tcC53cml0ZShyZXN1bHQuYm9keSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCAoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlY29tcC5vbignZGF0YScsIChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYm9keSA9IGRhdGEudG9TdHJpbmcoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaGVhZGVyc1tDT05URU5UX1RZUEVfSEVBREVSXSAmJiByZXN1bHQuaGVhZGVyc1tDT05URU5UX1RZUEVfSEVBREVSXS5pbmNsdWRlcygnYXBwbGljYXRpb24vanNvbicpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmJvZHkgPSBKU09OLnBhcnNlKHJlc3VsdC5ib2R5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHBhcnNpbmcgZmFpbHMganVzdCByZXR1cm4gdGhlIG9yaWdpbmFsIHN0cmluZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9KSgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5oZWFkZXJzW0NPTlRFTlRfVFlQRV9IRUFERVJdICYmIHJlc3VsdC5oZWFkZXJzW0NPTlRFTlRfVFlQRV9IRUFERVJdLmluY2x1ZGVzKCdhcHBsaWNhdGlvbi9qc29uJykpIHtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYm9keSA9IEpTT04ucGFyc2UocmVzdWx0LmJvZHkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgcGFyc2luZyBmYWlscyBqdXN0IHJldHVybiB0aGUgb3JpZ2luYWwgc3RyaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICByZXN1bHQgPSBlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XHJcbiAgICAgICAgICAgIGxldCBib2R5ID0gbnVsbDtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnJlc3BvbnNlICYmXHJcbiAgICAgICAgICAgICAgICByZXN1bHQucmVzcG9uc2UuYm9keVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIGJvZHkgPSByZXN1bHQucmVzcG9uc2UuYm9keTtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5ID0gSlNPTi5wYXJzZShib2R5KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgPSByZXN1bHQucmVzcG9uc2UuYm9keTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHtcclxuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogcmVzdWx0Lm1lc3NhZ2UsXHJcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiByZXN1bHQucmVzcG9uc2UgPyByZXN1bHQucmVzcG9uc2UuaGVhZGVycyA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiByZXN1bHQucmVzcG9uc2UgPyByZXN1bHQucmVzcG9uc2Uuc3RhdHVzQ29kZSA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICBzdGF0dXNNZXNzYWdlOiByZXN1bHQucmVzcG9uc2UgPyByZXN1bHQucmVzcG9uc2Uuc3RhdHVzTWVzc2FnZSA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICByYXdCb2R5OiByZXN1bHQucmVzcG9uc2UgPyByZXN1bHQucmVzcG9uc2UucmF3Qm9keSA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICBib2R5OiBib2R5XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmVzdWx0ID0ge1xyXG4gICAgICAgICAgICAgICAgaHR0cFZlcnNpb246IHJlc3VsdC5odHRwVmVyc2lvbixcclxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlc3VsdC5oZWFkZXJzLFxyXG4gICAgICAgICAgICAgICAgdXBncmFkZTogcmVzdWx0LnVwZ3JhZGUsXHJcbiAgICAgICAgICAgICAgICB1cmw6IHJlc3VsdC51cmwsXHJcbiAgICAgICAgICAgICAgICBtZXRob2Q6IHJlc3VsdC5tZXRob2QsXHJcbiAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiByZXN1bHQuc3RhdHVzQ29kZSxcclxuICAgICAgICAgICAgICAgIHN0YXR1c01lc3NhZ2U6IHJlc3VsdC5zdGF0dXNNZXNzYWdlLFxyXG4gICAgICAgICAgICAgICAgdGltaW5nczogcmVzdWx0LnRpbWluZ3MsXHJcbiAgICAgICAgICAgICAgICByZXF1ZXN0VXJsOiByZXN1bHQucmVxdWVzdFVybCxcclxuICAgICAgICAgICAgICAgIHJlZGlyZWN0VXJsczogcmVzdWx0LnJlZGlyZWN0VXJscyxcclxuICAgICAgICAgICAgICAgIGlzRnJvbUNhY2hlOiByZXN1bHQuaXNGcm9tQ2FjaGUsXHJcbiAgICAgICAgICAgICAgICBpcDogcmVzdWx0LmlwLFxyXG4gICAgICAgICAgICAgICAgcmV0cnlDb3VudDogcmVzdWx0LnJldHJ5Q291bnQsXHJcbiAgICAgICAgICAgICAgICBib2R5OiByZXN1bHQuYm9keVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9hZGRSZXNwb25zZUV4dHJhKHJlc3VsdCk7XHJcbiAgICAgICAgLy8gc3RvcmUgbGFzdCByZXNwb25zZSB0byBhbGxvdyBmdXJ0aGVyIGFzc2VydGlvbnMgYW5kIHZhbGlkYXRpb25zXHJcbiAgICAgICAgdGhpcy5fbGFzdFJlc3BvbnNlID0gcmVzdWx0O1xyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG59Il19
775
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS1odHRwLmpzIl0sIm5hbWVzIjpbImh0dHAiLCJyZXF1aXJlIiwiaHR0cHMiLCJNT0RVTEVfTkFNRSIsIlJFU1BPTlNFX1RJTUVPVVQiLCJEQUZBVUxUX0hUVFAyIiwiREVGQVVMVF9IVFRQX09QVElPTlMiLCJkZWNvbXByZXNzIiwicmVzcG9uc2VUeXBlIiwidGltZW91dCIsImxvb2t1cCIsImNvbm5lY3QiLCJzZWN1cmVDb25uZWN0Iiwic29ja2V0Iiwic2VuZCIsInJlc3BvbnNlIiwiaHR0cDIiLCJyZWplY3RVbmF1dGhvcml6ZWQiLCJkbnNMb29rdXBJcFZlcnNpb24iLCJDT05URU5UX1RZUEVfSEVBREVSIiwiSFRUUF9NRVRIT0RTIiwiSHR0cE1vZHVsZSIsIk94eWdlbk1vZHVsZSIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsImNvbnRleHQiLCJycyIsImxvZ2dlciIsIm1vZHVsZXMiLCJzZXJ2aWNlcyIsIl9hbHdheXNJbml0aWFsaXplZCIsIl9sYXN0UmVzcG9uc2UiLCJfYmFzZVVybCIsIl91c2VySHR0cE9wdGlvbnMiLCJfdXNlcm5hbWUiLCJ1bmRlZmluZWQiLCJfcGFzc3dvcmQiLCJfZG9tYWluIiwiX2lzSW5pdGlhbGl6ZWQiLCJuYW1lIiwibmV3Rm9ybURhdGEiLCJGb3JtRGF0YSIsInNldE9wdGlvbnMiLCJvcHRzIiwiZGVmbGF0ZVJhdyIsInNldE50bG1Vc2VyIiwidXNlcm5hbWUiLCJwYXNzd29yZCIsImRvbWFpbiIsInNldFByb3h5IiwidXJsIiwiYm9vdHN0cmFwIiwicGFyc2UiLCJwYXJzZWRVcmwiLCJob3N0bmFtZSIsIk94RXJyb3IiLCJlcnJIZWxwZXIiLCJlcnJvckNvZGUiLCJIVFRQX0VSUk9SIiwicG9ydCIsInByb3RvY29sIiwiZ2xvYmFsIiwiR0xPQkFMX0FHRU5UIiwiSFRUUF9QUk9YWSIsImdldCIsImhlYWRlcnMiLCJodHRwT3B0cyIsIm1ldGhvZCIsIl9odHRwUmVxdWVzdFN5bmMiLCJwb3N0IiwiZGF0YSIsImlzRm9ybURhdGEiLCJyZXNvbHZlZERhdGEiLCJfcmVzb2x2ZURhdGEiLCJwdXQiLCJwYXRjaCIsImRlbGV0ZSIsImdldFJlc3BvbnNlIiwiZ2V0UmVzcG9uc2VCb2R5IiwiYm9keSIsImdldFJlc3BvbnNlSGVhZGVycyIsImdldFJlc3BvbnNlVXJsIiwiYXNzZXJ0VGV4dCIsInBhdHRlcm4iLCJBU1NFUlRfRVJST1IiLCJyZXNwQ29udGVudCIsIkpTT04iLCJzdHJpbmdpZnkiLCJtb2RVdGlscyIsIm1hdGNoUGF0dGVybiIsImFzc2VydFJlc3BvbnNlVGltZSIsIm1heFRpbWUiLCJFcnJvciIsImFzc2VydEhlYWRlciIsImhlYWRlck5hbWUiLCJoZWFkZXJWYWx1ZVBhdHRlcm4iLCJsZW5ndGgiLCJ0b0xvd2VyQ2FzZSIsImFjdHVhbEhlYWRlclZhbHVlIiwiYXNzZXJ0Q29va2llIiwiY29va2llTmFtZSIsImNvb2tpZVZhbHVlUGF0dGVybiIsImFzc2VydFN0YXR1cyIsImNvZGVMaXN0IiwiQXJyYXkiLCJpc0FycmF5Iiwic3RhdHVzQ29kZSIsImluY2x1ZGVzIiwiYXNzZXJ0U3RhdHVzT2siLCJ0cmFuc2FjdGlvbiIsInRvU3RyaW5nIiwic2xpY2UiLCJfbGFzdFRyYW5zYWN0aW9uTmFtZSIsImdldFN0ZXBEaXNwbGF5TmFtZSIsIm1ldGhvZE5hbWUiLCJtZXRob2RBcmdzIiwicmV0dmFsIiwiZXJyb3IiLCJfZXh0cmEiLCJyZXF1ZXN0IiwidG9VcHBlckNhc2UiLCJwYXRoIiwiX2FkZFJlcXVlc3RFeHRyYSIsInVwZGF0ZWRPcHRpb25zIiwiVVJMIiwicmVxRXh0cmEiLCJwYXRobmFtZSIsInNlYXJjaCIsImhhc2giLCJxdWVyeVBhcmFtcyIsIl9nZXRRdWVyeVBhcmFtcyIsInNlYXJjaFBhcmFtcyIsImNvbnRlbnRUeXBlIiwiX2dldENvbnRlbnRUeXBlIiwiY29udGVudExlbmd0aCIsIl9nZXRDb250ZW50TGVuZ3RoIiwiZm9ybSIsImZvcm1EYXRhIiwianNvbiIsIk9iamVjdCIsImNvbnRlbnQiLCJtYXRjaCIsImxlbmd0aEFzU3RyIiwicGFyc2VJbnQiLCJmcm9tIiwia2V5cyIsInJlZHVjZSIsInJlY29yZCIsImtleSIsInZhbHVlcyIsImdldEFsbCIsImpvaW4iLCJfYWRkUmVzcG9uc2VFeHRyYSIsInJlc0V4dHJhIiwicmVkaXJlY3RVcmxzIiwic3RhdHVzVGV4dCIsInN0YXR1c01lc3NhZ2UiLCJ2ZXJzaW9uIiwiaHR0cFZlcnNpb24iLCJ0aW1pbmdzIiwicGhhc2VzIiwiZGF0YVJlc29sdmVyIiwiYXNzZXJ0Q2lyY3VsYXIiLCJ3aXRoQXV0aCIsInJlc3VsdCIsImhvb2tzIiwiYmVmb3JlUmVxdWVzdCIsInpsaWIiLCJkZWNvbXAiLCJjcmVhdGVJbmZsYXRlUmF3Iiwid3JpdGUiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIm9uIiwiZSIsImF1dGhSZXFSZXN1bHQiLCJfaGFuZGxlTnRsbUF1dGhvcml6YXRpb24iLCJlcnJvck1lc3NhZ2UiLCJtZXNzYWdlIiwicmF3Qm9keSIsInVwZ3JhZGUiLCJyZXF1ZXN0VXJsIiwiaXNGcm9tQ2FjaGUiLCJpcCIsInJldHJ5Q291bnQiLCJhdXRoTWV0aG9kcyIsIm9wdHNXaXRoQXV0aCIsInNvbWUiLCJtIiwic3RhcnRzV2l0aCIsInJlcVVybCIsImlzSHR0cHMiLCJrZWVwYWxpdmVBZ2VudCIsIkFnZW50Iiwia2VlcEFsaXZlIiwiYWdlbnQiLCJudGxtT3B0cyIsIndvcmtzdGF0aW9uIiwibnRsbSIsImNyZWF0ZVR5cGUxTWVzc2FnZSIsInRocm93SHR0cEVycm9ycyIsInR5cGUxTXNnUmVzcG9uc2UiLCJ0eXBlMk1zZyIsInBhcnNlVHlwZTJNZXNzYWdlIiwiZm9sbG93UmVkaXJlY3QiLCJjcmVhdGVUeXBlM01lc3NhZ2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQWFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUlBOzs7Ozs7OztBQXZCQTtBQUNBO0FBQ0E7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R0FBK0IsS0FBL0I7QUFDQSxRQUFJQyxnQkFBZ0IsR0FBRyxNQUFNLGtCQUFJZixZQUFKLENBQTdCO0FBQ0FELElBQUFBLFdBQVcsR0FBRyxzQ0FBdUJnQixnQkFBdkIsQ0FBZCxDQWxDK0MsQ0FtQy9DOztBQUNBLFFBQUlBLGdCQUFnQixDQUFDaEcsVUFBakIsS0FBZ0MsR0FBaEMsSUFBdUNnRixXQUFXLENBQUMxRixNQUFaLEdBQXFCLENBQTVELElBQ0cwRixXQUFXLENBQUMsQ0FBRCxDQUFYLENBQWVJLFVBQWYsQ0FBMEIsTUFBMUIsQ0FEUCxFQUMwQztBQUN0QyxZQUFNYSxRQUFRLEdBQUdKLElBQUksQ0FBQ0ssaUJBQUwsQ0FBdUJGLGdCQUFnQixDQUFDekksT0FBakIsQ0FBeUIsa0JBQXpCLENBQXZCLENBQWpCO0FBQ0EwSCxNQUFBQSxZQUFZLENBQUNrQixjQUFiLEdBQThCLEtBQTlCO0FBQ0FsQixNQUFBQSxZQUFZLENBQUMxSCxPQUFiLENBQXFCLFlBQXJCLElBQXFDLE9BQXJDO0FBQ0EwSCxNQUFBQSxZQUFZLENBQUMxSCxPQUFiLENBQXFCLGVBQXJCLElBQ0lzSSxJQUFJLENBQUNPLGtCQUFMLENBQXdCSCxRQUF4QixFQUFrQ04sUUFBbEMsQ0FESjtBQUVILEtBUEQsTUFRSztBQUNELGFBQU90TCxRQUFQO0FBQ0g7O0FBQ0Q0SyxJQUFBQSxZQUFZLENBQUNjLGVBQWIsR0FBK0IsSUFBL0IsQ0EvQytDLENBZ0QvQzs7QUFDQSxXQUFPLE1BQU0sS0FBS3JJLGdCQUFMLENBQXNCdUgsWUFBdEIsRUFBb0MsSUFBcEMsQ0FBYjtBQUNIOztBQXRuQmdEIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChDKSAyMDE1LXByZXNlbnQgQ2xvdWRCZWF0IExpbWl0ZWRcclxuICpcclxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcclxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcclxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cclxuICovXHJcblxyXG4vKipcclxuICogQG5hbWUgaHR0cFxyXG4gKiBAZGVzY3JpcHRpb24gUHJvdmlkZXMgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIEhUVFAoUylcclxuICovXHJcbmltcG9ydCBnb3QgZnJvbSAnZ290JztcclxuaW1wb3J0IEZvcm1EYXRhIGZyb20gJ2Zvcm0tZGF0YSc7XHJcbmltcG9ydCBPeHlnZW5Nb2R1bGUgZnJvbSAnLi4vY29yZS9PeHlnZW5Nb2R1bGUnO1xyXG5pbXBvcnQgT3hFcnJvciBmcm9tICcuLi9lcnJvcnMvT3h5Z2VuRXJyb3InO1xyXG5pbXBvcnQgZXJySGVscGVyIGZyb20gJy4uL2Vycm9ycy9oZWxwZXInO1xyXG5pbXBvcnQgbW9kVXRpbHMgZnJvbSAnLi91dGlscyc7XHJcbmltcG9ydCB7XHJcbiAgICBnZXRBdXRoZW50aWNhdGVNZXRob2RzLFxyXG4gICAgY3JlYXRlQmFzaWNNZXNzYWdlLFxyXG59IGZyb20gJy4vbW9kdWxlLWh0dHAvbnRsbS11dGlsJztcclxuaW1wb3J0ICogYXMgbnRsbSBmcm9tICcuL21vZHVsZS1odHRwL250bG0nO1xyXG5jb25zdCBodHRwID0gcmVxdWlyZSgnaHR0cCcpO1xyXG5jb25zdCBodHRwcyA9IHJlcXVpcmUoJ2h0dHBzJyk7XHJcblxyXG5jb25zdCBNT0RVTEVfTkFNRSA9ICdodHRwJztcclxuY29uc3QgUkVTUE9OU0VfVElNRU9VVCA9IDEwMDAgKiA2MDsgICAvLyBpbiBtc1xyXG5jb25zdCBEQUZBVUxUX0hUVFAyID0gZmFsc2U7XHJcbmNvbnN0IERFRkFVTFRfSFRUUF9PUFRJT05TID0ge1xyXG4gICAgZGVjb21wcmVzczogdHJ1ZSxcclxuICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnLFxyXG4gICAgdGltZW91dDoge1xyXG4gICAgICAgIGxvb2t1cDogMTAwMCxcclxuICAgICAgICBjb25uZWN0OiA1MDAsXHJcbiAgICAgICAgc2VjdXJlQ29ubmVjdDogNTAwLFxyXG4gICAgICAgIHNvY2tldDogMTAwMDAwLFxyXG4gICAgICAgIHNlbmQ6IDEwMDAwMCxcclxuICAgICAgICByZXNwb25zZTogUkVTUE9OU0VfVElNRU9VVFxyXG4gICAgfSxcclxuICAgIGh0dHAyOiBEQUZBVUxUX0hUVFAyLFxyXG4gICAgaHR0cHM6IHtcclxuICAgICAgICByZWplY3RVbmF1dGhvcml6ZWQ6IGZhbHNlXHJcbiAgICB9LFxyXG4gICAgZG5zTG9va3VwSXBWZXJzaW9uOiAnaXB2NCdcclxufTtcclxuY29uc3QgQ09OVEVOVF9UWVBFX0hFQURFUiA9ICdjb250ZW50LXR5cGUnO1xyXG5jb25zdCBIVFRQX01FVEhPRFMgPSBbXHJcbiAgICAnZ2V0JyxcclxuICAgICdwb3N0JyxcclxuICAgICdwYXRjaCdcclxuXTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEh0dHBNb2R1bGUgZXh0ZW5kcyBPeHlnZW5Nb2R1bGUge1xyXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucywgY29udGV4dCwgcnMsIGxvZ2dlciwgbW9kdWxlcywgc2VydmljZXMpIHtcclxuICAgICAgICBzdXBlcihvcHRpb25zLCBjb250ZXh0LCBycywgbG9nZ2VyLCBtb2R1bGVzLCBzZXJ2aWNlcyk7XHJcbiAgICAgICAgdGhpcy5fYWx3YXlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX2xhc3RSZXNwb25zZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fYmFzZVVybCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fdXNlckh0dHBPcHRpb25zID0ge307XHJcbiAgICAgICAgdGhpcy5fdXNlcm5hbWUgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5fcGFzc3dvcmQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5fZG9tYWluID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIC8vIHByZS1pbml0aWFsaXplIHRoZSBtb2R1bGVcclxuICAgICAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKlxyXG4gICAgICogQHN1bW1hcnkgR2V0cyBtb2R1bGUgbmFtZVxyXG4gICAgICogQGZ1bmN0aW9uIG5hbWVcclxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gQ29uc3RhbnQgdmFsdWUgXCJodHRwXCIuXHJcbiAgICAgKi9cclxuICAgIGdldCBuYW1lKCkge1xyXG4gICAgICAgIHJldHVybiBNT0RVTEVfTkFNRTtcclxuICAgIH1cclxuXHJcbiAgICAvKlxyXG4gICAgICogQHN1bW1hcnkgUmV0dXJucyBhIG5ldyBGb3JtRGF0YSBvYmplY3RcclxuICAgICAqIEBmdW5jdGlvbiBuZXdGb3JtRGF0YVxyXG4gICAgICogQHJldHVybiB7Rm9ybURhdGF9IG5ldyBGb3JtRGF0YSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIG5ld0Zvcm1EYXRhKCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgRm9ybURhdGEoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFNldHMgdXNlciBkZWZpbmVkIEhUVFAgb3B0aW9ucyAoc3VjaCBhcyBwcm94eSwgZGVjb21wcmVzcyBhbmQgZXRjLilcclxuICAgICAqIEBmdW5jdGlvbiBzZXRPcHRpb25zXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIEhUVFAgcmVxdWVzdCBvcHRpb25zIG9iamVjdCwgc2VlIFtSZXF1ZXN0IE9wdGlvbnNdKGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvZ290L2Jsb2IvbWFpbi9kb2N1bWVudGF0aW9uLzItb3B0aW9ucy5tZCkuIFxyXG4gICAgICogSW4gYWRkaXRpb24gdG8gdGhlIG9wdGlvbnMgbGlzdGVkIGluIHRoZSBsaW5rZWQgZG9jdW1lbnQsICdkZWZsYXRlUmF3JyBvcHRpb24gY2FuIGJlIHVzZWQgd2hlbiBzZXJ2ZXIgcmV0dXJucyBEZWZsYXRlLWNvbXByZXNzZWQgc3RyZWFtIHdpdGhvdXQgaGVhZGVycy5cclxuICAgICAqL1xyXG4gICAgc2V0T3B0aW9ucyhvcHRzKSB7XHJcbiAgICAgICAgdGhpcy5fdXNlckh0dHBPcHRpb25zID0gb3B0cztcclxuICAgICAgICBpZiAob3B0cy5kZWZsYXRlUmF3KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3VzZXJIdHRwT3B0aW9ucy5kZWNvbXByZXNzID0gZmFsc2U7ICAgICAvLyBkZWNvbXByZXNzPXRydWUgaW4gZGVmYXVsdCBvcHRpb25zIHNvIHdlIG92ZXJyaWRlIGl0XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgU2V0cyB1c2VyIGNyZWRlbnRpYWxzIGZvciBOVExNIGF1dGhlbnRpY2F0aW9uIHByb2Nlc3NcclxuICAgICAqIEBmdW5jdGlvbiBzZXROdGxtVXNlclxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHVzZXJuYW1lIC0gTlRMTSB1c2VybmFtZS5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwYXNzd29yZCAtIE5UTE0gcGFzc3dvcmQuXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IGRvbWFpbiAtIE5UTE0gZG9tYWluIG5hbWUsIGlmIGFwcGxpY2FibGUuXHJcbiAgICAgKiBJbiBhZGRpdGlvbiB0byB0aGUgb3B0aW9ucyBsaXN0ZWQgaW4gdGhlIGxpbmtlZCBkb2N1bWVudCwgJ2RlZmxhdGVSYXcnIG9wdGlvbiBjYW4gYmUgdXNlZCB3aGVuIHNlcnZlciByZXR1cm5zIERlZmxhdGUtY29tcHJlc3NlZCBzdHJlYW0gd2l0aG91dCBoZWFkZXJzLlxyXG4gICAgICovXHJcbiAgICBzZXROdGxtVXNlcih1c2VybmFtZSwgcGFzc3dvcmQsIGRvbWFpbiA9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIC8vIElmIHVzZXJuYW1lIHdhcyBwYXNzZWQgYXMgdW5kZWZpbmVkLCB0aGVuIHJlbW92ZSBwcmV2aW91c2x5IGRlZmluZWQgTlRMTSBjcmVkZW50aWFsc1xyXG4gICAgICAgIGlmICh1c2VybmFtZSA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fdXNlcm5hbWUgPSB0aGlzLl9wYXNzd29yZCA9IHRoaXMuX2RvbWFpbiA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl91c2VybmFtZSA9IHVzZXJuYW1lO1xyXG4gICAgICAgIHRoaXMuX3Bhc3N3b3JkID0gcGFzc3dvcmQ7XHJcbiAgICAgICAgdGhpcy5fZG9tYWluID0gZG9tYWluO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgU2V0cyBwcm94eSB1cmwgdG8gYmUgdXNlZCBmb3IgY29ubmVjdGlvbnMgd2l0aCB0aGUgc2VydmljZS5cclxuICAgICAqIEBmdW5jdGlvbiBzZXRQcm94eVxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCAtIFByb3h5IHNlcnZlciBVUkwuIE5vdCBwYXNzaW5nIHRoaXMgYXJndW1lbnQgd2lsbCByZXNldCB0aGUgcHJveHkgc2V0dGluZ3MuXHJcbiAgICAgKi9cclxuICAgIHNldFByb3h5KHVybCkge1xyXG4gICAgICAgIGlmICh1cmwpIHtcclxuICAgICAgICAgICAgY29uc3Qge1xyXG4gICAgICAgICAgICAgICAgYm9vdHN0cmFwXHJcbiAgICAgICAgICAgIH0gPSByZXF1aXJlKCdnbG9iYWwtYWdlbnQnKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHsgcGFyc2UgfSA9IHJlcXVpcmUoJ3VybCcpO1xyXG4gICAgICAgICAgICBjb25zdCBwYXJzZWRVcmwgPSBwYXJzZSh1cmwpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFwYXJzZWRVcmwuaG9zdG5hbWUpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuSFRUUF9FUlJPUiwgJ0hvc3RuYW1lIGluIHVuZGVmaW5lZCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghcGFyc2VkVXJsLnBvcnQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuSFRUUF9FUlJPUiwgJ1BvcnQgaW4gdW5kZWZpbmVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFwYXJzZWRVcmwucHJvdG9jb2wpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuSFRUUF9FUlJPUiwgJ1Byb3RvY29sIGluIHVuZGVmaW5lZCcpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBib290c3RyYXAoKTtcclxuICAgICAgICAgICAgZ2xvYmFsLkdMT0JBTF9BR0VOVC5IVFRQX1BST1hZID0gdXJsO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5HTE9CQUxfQUdFTlQuSFRUUF9QUk9YWSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFBlcmZvcm1zIEhUVFAgR0VUXHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0XHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIC0gVVJMLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3Q9fSBoZWFkZXJzIC0gSFRUUCBoZWFkZXJzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBSZXNwb25zZSBvYmplY3QuXHJcbiAgICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5bamF2YXNjcmlwdF0gVXNhZ2UgZXhhbXBsZTwvY2FwdGlvbj5cclxuICAgICAqIC8vIEJhc2ljIHVzYWdlIGV4YW1wbGU6XHJcbiAgICAgKiB2YXIgcmVzcG9uc2UgPSBodHRwLmdldChcclxuICAgICAqICdodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL294eWdlbmhxL294eWdlbi1pZGUvcmVsZWFzZXMnLCBcclxuICAgICAqIHtcclxuICAgICAqICAgJ0FjY2VwdC1FbmNvZGluZyc6ICdnemlwLCBkZWZsYXRlJyxcclxuICAgICAqICAgJ1VzZXItQWdlbnQnOiAnTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NDsgcnY6ODYuMCkgR2Vja28vMjAxMDAxMDEgRmlyZWZveC84Ni4wJ1xyXG4gICAgICogfSk7XHJcbiAgICAgKiBsb2cuaW5mbyhyZXNwb25zZS5ib2R5KTtcclxuICAgICAqXHJcbiAgICAgKiAvLyBJZiBzZXJ2ZXIgcmV0dXJucyBEZWZsYXRlLWNvbXByZXNzZWQgc3RyZWFtIHdpdGhvdXQgaGVhZGVycywgYGRlZmxhdGVSYXdgIGNhbiBiZSB1c2VkIHRvIGRlY29tcHJlc3MgdGhlIGNvbnRlbnQuXHJcbiAgICAgKiBodHRwLnNldE9wdGlvbnMoe1xyXG4gICAgICogICBkZWZsYXRlUmF3OiB0cnVlXHJcbiAgICAgKiB9KTtcclxuICAgICAqIHZhciByZXNwb25zZSA9IGh0dHAuZ2V0KCdodHRwczovL0ZPTy5CQVInKTtcclxuICAgICAqIGxvZy5pbmZvKHJlc3BvbnNlLmJvZHkpO1xyXG4gICAgICovXHJcbiAgICBhc3luYyBnZXQodXJsLCBoZWFkZXJzKSB7XHJcbiAgICAgICAgY29uc3QgaHR0cE9wdHMgPSB7XHJcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfSFRUUF9PUFRJT05TLFxyXG4gICAgICAgICAgICAuLi50aGlzLl91c2VySHR0cE9wdGlvbnMgfHwge30sXHJcbiAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzIHx8IHt9XHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5faHR0cFJlcXVlc3RTeW5jKGh0dHBPcHRzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFBlcmZvcm1zIEhUVFAgUE9TVFxyXG4gICAgICogQGZ1bmN0aW9uIHBvc3RcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgLSBVUkwuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIERhdGEuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdD19IGhlYWRlcnMgLSBIVFRQIGhlYWRlcnMuXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW49fSBpc0Zvcm1EYXRhIC0gSW5kaWNhdGVzIGlmIFwiZGF0YVwiIHBhcmFtZXRlciBpcyBvZiBVUkwtZW5jb2RlZCBmb3JtIHR5cGUuXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJlc3BvbnNlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgcG9zdCh1cmwsIGRhdGEsIGhlYWRlcnMsIGlzRm9ybURhdGEgPSBmYWxzZSkge1xyXG4gICAgICAgIGNvbnN0IHJlc29sdmVkRGF0YSA9IHRoaXMuX3Jlc29sdmVEYXRhKGRhdGEsIGhlYWRlcnMsIGlzRm9ybURhdGEpO1xyXG4gICAgICAgIGNvbnN0IGh0dHBPcHRzID0ge1xyXG4gICAgICAgICAgICAuLi5ERUZBVUxUX0hUVFBfT1BUSU9OUyxcclxuICAgICAgICAgICAgLi4udGhpcy5fdXNlckh0dHBPcHRpb25zIHx8IHt9LFxyXG4gICAgICAgICAgICB1cmw6IHVybCxcclxuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMgfHwge30sXHJcbiAgICAgICAgICAgIC4uLnJlc29sdmVkRGF0YVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2h0dHBSZXF1ZXN0U3luYyhodHRwT3B0cyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBQZXJmb3JtcyBIVFRQIFBVVFxyXG4gICAgICogQGZ1bmN0aW9uIHB1dFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCAtIFVSTC5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gRGF0YS5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gaGVhZGVycyAtIEhUVFAgaGVhZGVycy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gUmVzcG9uc2Ugb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBhc3luYyBwdXQodXJsLCBkYXRhLCBoZWFkZXJzKSB7XHJcbiAgICAgICAgY29uc3QgcmVzb2x2ZWREYXRhID0gdGhpcy5fcmVzb2x2ZURhdGEoZGF0YSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGh0dHBPcHRzID0ge1xyXG4gICAgICAgICAgICAuLi5ERUZBVUxUX0hUVFBfT1BUSU9OUyxcclxuICAgICAgICAgICAgLi4udGhpcy5fdXNlckh0dHBPcHRpb25zIHx8IHt9LFxyXG4gICAgICAgICAgICB1cmw6IHVybCxcclxuICAgICAgICAgICAgbWV0aG9kOiAnUFVUJyxcclxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyB8fCB7fSxcclxuICAgICAgICAgICAgLi4ucmVzb2x2ZWREYXRhXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5faHR0cFJlcXVlc3RTeW5jKGh0dHBPcHRzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFBlcmZvcm1zIEhUVFAgUEFUQ0hcclxuICAgICAqIEBmdW5jdGlvbiBwYXRjaFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCAtIFVSTC5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gRGF0YS5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gaGVhZGVycyAtIEhUVFAgaGVhZGVycy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gUmVzcG9uc2Ugb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBhc3luYyBwYXRjaCh1cmwsIGRhdGEsIGhlYWRlcnMpIHtcclxuICAgICAgICBjb25zdCByZXNvbHZlZERhdGEgPSB0aGlzLl9yZXNvbHZlRGF0YShkYXRhKTtcclxuXHJcbiAgICAgICAgY29uc3QgaHR0cE9wdHMgPSB7XHJcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfSFRUUF9PUFRJT05TLFxyXG4gICAgICAgICAgICAuLi50aGlzLl91c2VySHR0cE9wdGlvbnMgfHwge30sXHJcbiAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICBtZXRob2Q6ICdQQVRDSCcsXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMgfHwge30sXHJcbiAgICAgICAgICAgIC4uLnJlc29sdmVkRGF0YVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2h0dHBSZXF1ZXN0U3luYyhodHRwT3B0cyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBQZXJmb3JtcyBIVFRQIERFTEVURVxyXG4gICAgICogQGZ1bmN0aW9uIGRlbGV0ZVxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCAtIFVSTC5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gaGVhZGVycyAtIEhUVFAgaGVhZGVycy5cclxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIC0gRGF0YS5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gUmVzcG9uc2Ugb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBhc3luYyBkZWxldGUodXJsLCBoZWFkZXJzLCBkYXRhKSB7XHJcbiAgICAgICAgY29uc3QgcmVzb2x2ZWREYXRhID0gdGhpcy5fcmVzb2x2ZURhdGEoZGF0YSk7XHJcbiAgICAgICAgY29uc3QgaHR0cE9wdHMgPSB7XHJcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfSFRUUF9PUFRJT05TLFxyXG4gICAgICAgICAgICAuLi50aGlzLl91c2VySHR0cE9wdGlvbnMgfHwge30sXHJcbiAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICBtZXRob2Q6ICdERUxFVEUnLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzIHx8IHt9LFxyXG4gICAgICAgICAgICAuLi5yZXNvbHZlZERhdGFcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9odHRwUmVxdWVzdFN5bmMoaHR0cE9wdHMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUmV0dXJucyBsYXN0IHJlc3BvbnNlIG9iamVjdFxyXG4gICAgICogQGZ1bmN0aW9uIGdldFJlc3BvbnNlXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJlc3BvbnNlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgZ2V0UmVzcG9uc2UoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhc3RSZXNwb25zZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFJldHVybnMgbGFzdCByZXNwb25zZSBib2R5XHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0UmVzcG9uc2VCb2R5XHJcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFJlc3BvbnNlIGJvZHkuXHJcbiAgICAgKi9cclxuICAgIGdldFJlc3BvbnNlQm9keSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbGFzdFJlc3BvbnNlICYmIHRoaXMuX2xhc3RSZXNwb25zZS5ib2R5ID8gdGhpcy5fbGFzdFJlc3BvbnNlLmJvZHkgOiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUmV0dXJucyByZXNwb25zZSBoZWFkZXJzXHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0UmVzcG9uc2VIZWFkZXJzXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJlc3BvbnNlIGhlYWRlcnMuXHJcbiAgICAgKi9cclxuICAgIGdldFJlc3BvbnNlSGVhZGVycygpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2xhc3RSZXNwb25zZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhc3RSZXNwb25zZS5oZWFkZXJzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUmV0dXJucyByZXNwb25zZSBVUkxcclxuICAgICAqIEBmdW5jdGlvbiBnZXRSZXNwb25zZVVybFxyXG4gICAgICogQHJldHVybiB7U3RyaW5nfSBSZXNwb25zZSBVUkwuXHJcbiAgICAgKi9cclxuICAgIGdldFJlc3BvbnNlVXJsKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fbGFzdFJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5fbGFzdFJlc3BvbnNlLnVybDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEFzc2VydCB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcGF0dGVybiBpcyBwcmVzZW50IGluIHRoZSByZXNwb25zZSBib2R5LlxyXG4gICAgICogQGZ1bmN0aW9uIGFzc2VydFRleHRcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwYXR0ZXJuIC0gUGF0dGVybiB0byBhc3NlcnQuXHJcbiAgICAgKi9cclxuICAgIGFzc2VydFRleHQocGF0dGVybikge1xyXG4gICAgICAgIGlmICghdGhpcy5fbGFzdFJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLl9sYXN0UmVzcG9uc2UuYm9keSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgJ1Jlc3BvbnNlIGJvZHkgaXMgZW1wdHknKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcmVzcENvbnRlbnQgPSB0eXBlb2YgdGhpcy5fbGFzdFJlc3BvbnNlLmJvZHkgPT09ICdzdHJpbmcnID8gdGhpcy5fbGFzdFJlc3BvbnNlLmJvZHkgOiBKU09OLnN0cmluZ2lmeSh0aGlzLl9sYXN0UmVzcG9uc2UuYm9keSk7XHJcbiAgICAgICAgaWYgKCFtb2RVdGlscy5tYXRjaFBhdHRlcm4ocmVzcENvbnRlbnQsIHBhdHRlcm4pKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBgRXhwZWN0ZWQgSFRUUCByZXNwb25zZSBjb250ZW50IHRvIG1hdGNoOiBcIiR7cGF0dGVybn1cIiBidXQgZ290OiBcIiR7cmVzcENvbnRlbnR9XCJgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBBc3NlcnQgcmVzcG9uc2UgdGltZVxyXG4gICAgICogQGZ1bmN0aW9uIGFzc2VydFJlc3BvbnNlVGltZVxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IG1heFRpbWUgLSBNYXhpbXVtIHJlc3BvbnNlIHRpbWUgaW4gbWlsbGlzZWNvbmRzLlxyXG4gICAgICovXHJcbiAgICBhc3NlcnRSZXNwb25zZVRpbWUobWF4VGltZSkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBBc3NlcnQgaWYgSFRUUCBoZWFkZXIgaXMgcHJlc2VudGVkIGluIHRoZSByZXNwb25zZVxyXG4gICAgICogQGZ1bmN0aW9uIGFzc2VydEhlYWRlclxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGhlYWRlck5hbWUgLSBBIEhUVFAgaGVhZGVyIG5hbWUuXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IGhlYWRlclZhbHVlUGF0dGVybiAtIEFuIG9wdGlvbmFsIEhUVFAgaGVhZGVyIHZhbHVlIHBhdHRlcm4uXHJcbiAgICAgKi9cclxuICAgIGFzc2VydEhlYWRlcihoZWFkZXJOYW1lLCBoZWFkZXJWYWx1ZVBhdHRlcm4gPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKCFoZWFkZXJOYW1lIHx8IHR5cGVvZiBoZWFkZXJOYW1lICE9PSAnc3RyaW5nJyB8fCBoZWFkZXJOYW1lLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaGVhZGVyTmFtZSA9IGhlYWRlck5hbWUudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICBjb25zdCBoZWFkZXJzID0gdGhpcy5fbGFzdFJlc3BvbnNlLmhlYWRlcnM7XHJcbiAgICAgICAgaWYgKCFoZWFkZXJzW2hlYWRlck5hbWVdKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCAnRXhwZWN0ZWQgSFRUUCBoZWFkZXIgXCIke2hlYWRlck5hbWV9XCIgdG8gYmUgcHJlc2VudCcpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChoZWFkZXJWYWx1ZVBhdHRlcm4gJiYgdHlwZW9mIGhlYWRlclZhbHVlUGF0dGVybiA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgY29uc3QgYWN0dWFsSGVhZGVyVmFsdWUgPSBoZWFkZXJzW2hlYWRlck5hbWVdO1xyXG4gICAgICAgICAgICBpZiAoIW1vZFV0aWxzLm1hdGNoUGF0dGVybihhY3R1YWxIZWFkZXJWYWx1ZSwgaGVhZGVyVmFsdWVQYXR0ZXJuKSkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIGBFeHBlY3RlZCBIVFRQIGhlYWRlciBcIiR7aGVhZGVyTmFtZX1cIiB2YWx1ZSB0byBtYXRjaDogXCIke2hlYWRlclZhbHVlUGF0dGVybn1cIiBidXQgZ290OiBcIiR7YWN0dWFsSGVhZGVyVmFsdWV9XCJgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEFzc2VydCBpZiBIVFRQIGNvb2tpZSBpcyBwcmVzZW50ZWQgaW4gdGhlIHJlc3BvbnNlXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0Q29va2llXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29va2llTmFtZSAtIEEgSFRUUCBjb29raWUgbmFtZS5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nPX0gY29va2llVmFsdWVQYXR0ZXJuIC0gQW4gb3B0aW9uYWwgSFRUUCBjb29raWUgdmFsdWUgcGF0dGVybi5cclxuICAgICAqL1xyXG4gICAgYXNzZXJ0Q29va2llKGNvb2tpZU5hbWUsIGNvb2tpZVZhbHVlUGF0dGVybikge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBBc3NlcnQgdGhlIGxhc3QgSFRUUCByZXNwb25zZSdzIHN0YXR1cyBjb2RlXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0U3RhdHVzXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcnxBcnJheX0gY29kZUxpc3QgLSBBIHNpbmdsZSBzdGF0dXMgY29kZSBvciBhIGxpc3Qgb2YgY29kZXMuXHJcbiAgICAgKi9cclxuICAgIGFzc2VydFN0YXR1cyhjb2RlTGlzdCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fbGFzdFJlc3BvbnNlIHx8ICFjb2RlTGlzdCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGlmIHdlIGdvdCBhIHNpbmdsZSB2YWx1ZSwgdGhlbiBjb252ZXJ0IGl0IHRvIGFuIGFycmF5XHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvZGVMaXN0KSkge1xyXG4gICAgICAgICAgICBjb2RlTGlzdCA9IFtjb2RlTGlzdF07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHN0YXR1c0NvZGUgPSB0aGlzLl9sYXN0UmVzcG9uc2Uuc3RhdHVzQ29kZTtcclxuICAgICAgICBpZiAoIWNvZGVMaXN0LmluY2x1ZGVzKHN0YXR1c0NvZGUpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBgRXhwZWN0ZWQgSFRUUCBzdGF0dXMgdG8gYmU6IFwiJHtjb2RlTGlzdH1cIiBidXQgZ290OiBcIiR7c3RhdHVzQ29kZX1cImApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEFzc2VydCBIVFRQIDIwMCBPSyBzdGF0dXNcclxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnRTdGF0dXNPa1xyXG4gICAgICovXHJcbiAgICBhc3NlcnRTdGF0dXNPaygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hc3NlcnRTdGF0dXMoMjAwKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IE9wZW5zIG5ldyB0cmFuc2FjdGlvbi5cclxuICAgICAqIEBkZXNjcmlwdGlvbiBUaGUgdHJhbnNhY3Rpb24gd2lsbCBwZXJzaXN0IHRpbGwgYSBuZXcgb25lIGlzIG9wZW5lZC4gVHJhbnNhY3Rpb24gbmFtZXMgbXVzdCBiZSB1bmlxdWUuXHJcbiAgICAgKiBAZnVuY3Rpb24gdHJhbnNhY3Rpb25cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIC0gVGhlIHRyYW5zYWN0aW9uIG5hbWUuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHRyYW5zYWN0aW9uKG5hbWUpIHtcclxuICAgICAgICBpZiAoIW5hbWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBqdXN0IGluIGNhc2UgdXNlciBwYXNzZWQgYSBjb21wbGV4IG9iamVjdCBieSBtaXN0YWtlXHJcbiAgICAgICAgbmFtZSA9IG5hbWUudG9TdHJpbmcoKTtcclxuXHJcbiAgICAgICAgLy8gbGltaXQgdGhlIG5hbWUgbGVuZ3RoIChzaW5jZSB3ZSBjYW4ndCBzdG9yZSB2YWx1ZXMgbGFyZ2VyIHRoYW4gNTEyQiBpbiB0aGUgZGF0YWJhc2UpXHJcbiAgICAgICAgbmFtZSA9IG5hbWUuc2xpY2UoMCwgNTEyKTtcclxuXHJcbiAgICAgICAgZ2xvYmFsLl9sYXN0VHJhbnNhY3Rpb25OYW1lID0gbmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRTdGVwRGlzcGxheU5hbWUobWV0aG9kTmFtZSwgbWV0aG9kQXJncywgcmV0dmFsLCBlcnJvcikge1xyXG4gICAgICAgIGlmICghSFRUUF9NRVRIT0RTLmluY2x1ZGVzKG1ldGhvZE5hbWUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5fZXh0cmEgfHwgIXRoaXMuX2V4dHJhLmh0dHAgfHwgIXRoaXMuX2V4dHJhLmh0dHAucmVxdWVzdCkge1xyXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYCR7bWV0aG9kTmFtZS50b1VwcGVyQ2FzZSgpfSAke3RoaXMuX2V4dHJhLmh0dHAucmVxdWVzdC5wYXRofWA7XHJcbiAgICB9XHJcblxyXG4gICAgX2FkZFJlcXVlc3RFeHRyYShyZXF1ZXN0LCB1cGRhdGVkT3B0aW9ucykge1xyXG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocmVxdWVzdC51cmwpO1xyXG4gICAgICAgIGNvbnN0IHJlcUV4dHJhID0ge1xyXG4gICAgICAgICAgICB1cmw6IHJlcXVlc3QudXJsLFxyXG4gICAgICAgICAgICBwYXRoOiBgJHt1cmwucGF0aG5hbWV9JHt1cmwuc2VhcmNofSR7dXJsLmhhc2h9YCxcclxuICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHRoaXMuX2dldFF1ZXJ5UGFyYW1zKHVybC5zZWFyY2hQYXJhbXMpLFxyXG4gICAgICAgICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiB1cGRhdGVkT3B0aW9ucy5oZWFkZXJzLFxyXG4gICAgICAgICAgICBjb250ZW50VHlwZTogdGhpcy5fZ2V0Q29udGVudFR5cGUodXBkYXRlZE9wdGlvbnMuaGVhZGVycyksXHJcbiAgICAgICAgICAgIGNvbnRlbnRMZW5ndGg6IHRoaXMuX2dldENvbnRlbnRMZW5ndGgodXBkYXRlZE9wdGlvbnMuaGVhZGVycyksXHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZiAocmVxdWVzdC5mb3JtKSB7XHJcbiAgICAgICAgICAgIHJlcUV4dHJhLmZvcm1EYXRhID0gcmVxdWVzdC5mb3JtO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChyZXF1ZXN0Lmpzb24pIHtcclxuICAgICAgICAgICAgcmVxRXh0cmEuY29udGVudFR5cGUgPSAnYXBwbGljYXRpb24vanNvbic7XHJcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0Lmpzb24gaW5zdGFuY2VvZiBPYmplY3QpIHtcclxuICAgICAgICAgICAgICAgIHJlcUV4dHJhLmNvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShyZXF1ZXN0Lmpzb24pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmVxRXh0cmEuY29udGVudCA9IHJlcXVlc3QuanNvbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChyZXF1ZXN0LmJvZHkpIHtcclxuICAgICAgICAgICAgcmVxRXh0cmEuY29udGVudCA9IHJlcXVlc3QuYm9keTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fZXh0cmEuaHR0cCkge1xyXG4gICAgICAgICAgICB0aGlzLl9leHRyYS5odHRwID0ge307XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2V4dHJhLmh0dHAucmVxdWVzdCA9IHJlcUV4dHJhO1xyXG4gICAgfVxyXG5cclxuICAgIF9nZXRDb250ZW50VHlwZShoZWFkZXJzID0ge30pIHtcclxuICAgICAgICBpZiAoIWhlYWRlcnMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY29udGVudFR5cGUgPSBoZWFkZXJzWydjb250ZW50LXR5cGUnXTtcclxuICAgICAgICBpZiAoIWNvbnRlbnRUeXBlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG1hdGNoID0gY29udGVudFR5cGUubWF0Y2goL14oLis/KSg7fCQpLyk7XHJcbiAgICAgICAgaWYgKCFtYXRjaCB8fCBtYXRjaC5sZW5ndGggPCAyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBtYXRjaFsxXTtcclxuICAgIH1cclxuXHJcbiAgICBfZ2V0Q29udGVudExlbmd0aChoZWFkZXJzID0ge30pIHtcclxuICAgICAgICBpZiAoIWhlYWRlcnMgfHwgIWhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ10pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbGVuZ3RoQXNTdHIgPSBoZWFkZXJzWydjb250ZW50LWxlbmd0aCddO1xyXG4gICAgICAgIHJldHVybiBwYXJzZUludChsZW5ndGhBc1N0cik7XHJcbiAgICB9XHJcblxyXG4gICAgX2dldFF1ZXJ5UGFyYW1zKHNlYXJjaFBhcmFtcykge1xyXG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKCBzZWFyY2hQYXJhbXMua2V5cygpICkucmVkdWNlKCAoIHJlY29yZCwga2V5ICkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBzZWFyY2hQYXJhbXMuZ2V0QWxsKGtleSk7XHJcbiAgICAgICAgICAgIHJldHVybiB7IC4uLnJlY29yZCwgWyBrZXkgXTogdmFsdWVzLmxlbmd0aCA+IDEgPyB2YWx1ZXMuam9pbignLCcpIDogdmFsdWVzWzBdIH07XHJcbiAgICAgICAgfSwge30pO1xyXG4gICAgfVxyXG5cclxuICAgIF9hZGRSZXNwb25zZUV4dHJhKHJlc3BvbnNlKSB7XHJcbiAgICAgICAgY29uc3QgcmVzRXh0cmEgPSB7XHJcbiAgICAgICAgICAgIHVybDogcmVzcG9uc2UucmVkaXJlY3RVcmxzICYmIHJlc3BvbnNlLnJlZGlyZWN0VXJscy5sZW5ndGggJiYgcmVzcG9uc2UucmVkaXJlY3RVcmxzWzBdLFxyXG4gICAgICAgICAgICBzdGF0dXNUZXh0OiByZXNwb25zZS5zdGF0dXNNZXNzYWdlLFxyXG4gICAgICAgICAgICBzdGF0dXNDb2RlOiByZXNwb25zZS5zdGF0dXNDb2RlLFxyXG4gICAgICAgICAgICBjb250ZW50VHlwZTogdGhpcy5fZ2V0Q29udGVudFR5cGUocmVzcG9uc2UuaGVhZGVycyksXHJcbiAgICAgICAgICAgIGNvbnRlbnRMZW5ndGg6IHRoaXMuX2dldENvbnRlbnRMZW5ndGgocmVzcG9uc2UuaGVhZGVycyksXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IHJlc3BvbnNlLmhlYWRlcnMsXHJcbiAgICAgICAgICAgIHZlcnNpb246IHJlc3BvbnNlLmh0dHBWZXJzaW9uLFxyXG4gICAgICAgICAgICBjb250ZW50OiByZXNwb25zZS5ib2R5LFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKCF0aGlzLl9leHRyYS5odHRwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2V4dHJhLmh0dHAgPSB7fTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fZXh0cmEuaHR0cC5yZXNwb25zZSA9IHJlc0V4dHJhO1xyXG4gICAgICAgIGlmIChyZXNwb25zZS50aW1pbmdzICYmIHJlc3BvbnNlLnRpbWluZ3MucGhhc2VzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2V4dHJhLmh0dHAudGltaW5ncyA9IHsgLi4ucmVzcG9uc2UudGltaW5ncy5waGFzZXMgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIF9yZXNvbHZlRGF0YShkYXRhLCBoZWFkZXJzLCBpc0Zvcm1EYXRhID0gZmFsc2UpIHtcclxuICAgICAgICBjb25zdCBkYXRhUmVzb2x2ZXIgPSB7fTtcclxuXHJcbiAgICAgICAgaWYgKGlzRm9ybURhdGEpIHtcclxuICAgICAgICAgICAgZGF0YVJlc29sdmVyLmZvcm0gPSBkYXRhO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChkYXRhIGluc3RhbmNlb2YgRm9ybURhdGEpIHtcclxuICAgICAgICAgICAgZGF0YVJlc29sdmVyLmJvZHkgPSBkYXRhO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChkYXRhIGluc3RhbmNlb2YgT2JqZWN0KSB7XHJcbiAgICAgICAgICAgIG1vZFV0aWxzLmFzc2VydENpcmN1bGFyKGRhdGEpO1xyXG4gICAgICAgICAgICBkYXRhUmVzb2x2ZXIuanNvbiA9IGRhdGE7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZGF0YVJlc29sdmVyLmJvZHkgPSBkYXRhO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGRhdGFSZXNvbHZlcjtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfaHR0cFJlcXVlc3RTeW5jKGh0dHBPcHRzLCB3aXRoQXV0aCA9IGZhbHNlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2V4dHJhLmh0dHApIHtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2V4dHJhLmh0dHA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vdGhpcy5fYWRkUmVxdWVzdEV4dHJhKGh0dHBPcHRzKTtcclxuICAgICAgICBsZXQgcmVzdWx0O1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXN1bHQgPSBhd2FpdCBnb3QoeyAuLi5odHRwT3B0cywgaG9va3M6IHtcclxuICAgICAgICAgICAgICAgIGJlZm9yZVJlcXVlc3Q6IFtcclxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0+IHsgdGhpcy5fYWRkUmVxdWVzdEV4dHJhKGh0dHBPcHRzLCBvcHRpb25zKTsgfVxyXG4gICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgfX0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKGh0dHBPcHRzLmRlZmxhdGVSYXcgJiYgcmVzdWx0LmhlYWRlcnNbJ2NvbnRlbnQtZW5jb2RpbmcnXSA9PT0gJ2RlZmxhdGUnKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB6bGliID0gcmVxdWlyZSgnemxpYicpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGVjb21wID0gemxpYi5jcmVhdGVJbmZsYXRlUmF3KCk7XHJcbiAgICAgICAgICAgICAgICBkZWNvbXAud3JpdGUocmVzdWx0LmJvZHkpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWNvbXAub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmJvZHkgPSBkYXRhLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmhlYWRlcnNbQ09OVEVOVF9UWVBFX0hFQURFUl0gJiYgcmVzdWx0LmhlYWRlcnNbQ09OVEVOVF9UWVBFX0hFQURFUl0uaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL2pzb24nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ib2R5ID0gSlNPTi5wYXJzZShyZXN1bHQuYm9keSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBwYXJzaW5nIGZhaWxzIGp1c3QgcmV0dXJuIHRoZSBvcmlnaW5hbCBzdHJpbmdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSkoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuaGVhZGVyc1tDT05URU5UX1RZUEVfSEVBREVSXSAmJiByZXN1bHQuaGVhZGVyc1tDT05URU5UX1RZUEVfSEVBREVSXS5pbmNsdWRlcygnYXBwbGljYXRpb24vanNvbicpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmJvZHkgPSBKU09OLnBhcnNlKHJlc3VsdC5ib2R5KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHBhcnNpbmcgZmFpbHMganVzdCByZXR1cm4gdGhlIG9yaWdpbmFsIHN0cmluZ1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgcmVzdWx0ID0gZTtcclxuICAgICAgICAgICAgaWYgKGUucmVzcG9uc2UgJiYgZS5yZXNwb25zZS5zdGF0dXNDb2RlICYmIGUucmVzcG9uc2Uuc3RhdHVzQ29kZSA9PT0gNDAxICYmICF3aXRoQXV0aCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYXV0aFJlcVJlc3VsdCA9IGF3YWl0IHRoaXMuX2hhbmRsZU50bG1BdXRob3JpemF0aW9uKGh0dHBPcHRzLCBlLnJlc3BvbnNlKTtcclxuICAgICAgICAgICAgICAgIGlmIChhdXRoUmVxUmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYXV0aFJlcVJlc3VsdDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XHJcbiAgICAgICAgICAgIGxldCBib2R5ID0gbnVsbDtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnJlc3BvbnNlICYmXHJcbiAgICAgICAgICAgICAgICByZXN1bHQucmVzcG9uc2UuYm9keVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIGJvZHkgPSByZXN1bHQucmVzcG9uc2UuYm9keTtcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5ID0gSlNPTi5wYXJzZShib2R5KTtcclxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgPSByZXN1bHQucmVzcG9uc2UuYm9keTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHtcclxuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogcmVzdWx0Lm1lc3NhZ2UsXHJcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiByZXN1bHQucmVzcG9uc2UgPyByZXN1bHQucmVzcG9uc2UuaGVhZGVycyA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiByZXN1bHQucmVzcG9uc2UgPyByZXN1bHQucmVzcG9uc2Uuc3RhdHVzQ29kZSA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICBzdGF0dXNNZXNzYWdlOiByZXN1bHQucmVzcG9uc2UgPyByZXN1bHQucmVzcG9uc2Uuc3RhdHVzTWVzc2FnZSA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICByYXdCb2R5OiByZXN1bHQucmVzcG9uc2UgPyByZXN1bHQucmVzcG9uc2UucmF3Qm9keSA6IG51bGwsXHJcbiAgICAgICAgICAgICAgICBib2R5OiBib2R5XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmVzdWx0ID0ge1xyXG4gICAgICAgICAgICAgICAgaHR0cFZlcnNpb246IHJlc3VsdC5odHRwVmVyc2lvbixcclxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlc3VsdC5oZWFkZXJzLFxyXG4gICAgICAgICAgICAgICAgdXBncmFkZTogcmVzdWx0LnVwZ3JhZGUsXHJcbiAgICAgICAgICAgICAgICB1cmw6IHJlc3VsdC51cmwsXHJcbiAgICAgICAgICAgICAgICBtZXRob2Q6IHJlc3VsdC5tZXRob2QsXHJcbiAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiByZXN1bHQuc3RhdHVzQ29kZSxcclxuICAgICAgICAgICAgICAgIHN0YXR1c01lc3NhZ2U6IHJlc3VsdC5zdGF0dXNNZXNzYWdlLFxyXG4gICAgICAgICAgICAgICAgdGltaW5nczogcmVzdWx0LnRpbWluZ3MsXHJcbiAgICAgICAgICAgICAgICByZXF1ZXN0VXJsOiByZXN1bHQucmVxdWVzdFVybCxcclxuICAgICAgICAgICAgICAgIHJlZGlyZWN0VXJsczogcmVzdWx0LnJlZGlyZWN0VXJscyxcclxuICAgICAgICAgICAgICAgIGlzRnJvbUNhY2hlOiByZXN1bHQuaXNGcm9tQ2FjaGUsXHJcbiAgICAgICAgICAgICAgICBpcDogcmVzdWx0LmlwLFxyXG4gICAgICAgICAgICAgICAgcmV0cnlDb3VudDogcmVzdWx0LnJldHJ5Q291bnQsXHJcbiAgICAgICAgICAgICAgICBib2R5OiByZXN1bHQuYm9keVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9hZGRSZXNwb25zZUV4dHJhKHJlc3VsdCk7XHJcbiAgICAgICAgLy8gc3RvcmUgbGFzdCByZXNwb25zZSB0byBhbGxvdyBmdXJ0aGVyIGFzc2VydGlvbnMgYW5kIHZhbGlkYXRpb25zXHJcbiAgICAgICAgdGhpcy5fbGFzdFJlc3BvbnNlID0gcmVzdWx0O1xyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9oYW5kbGVOdGxtQXV0aG9yaXphdGlvbihodHRwT3B0cywgcmVzcG9uc2UpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX3VzZXJuYW1lKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBhdXRoTWV0aG9kcyA9IGdldEF1dGhlbnRpY2F0ZU1ldGhvZHMocmVzcG9uc2UpO1xyXG4gICAgICAgIGNvbnN0IG9wdHNXaXRoQXV0aCA9IHsgLi4uaHR0cE9wdHMgfTtcclxuICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzQ29kZSA9PT0gNDAxICYmIGF1dGhNZXRob2RzPy5zb21lKG0gPT4gbS5zdGFydHNXaXRoKCdiYXNpYycpKSkge1xyXG4gICAgICAgICAgICBvcHRzV2l0aEF1dGguaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gY3JlYXRlQmFzaWNNZXNzYWdlKHRoaXMuX3VzZXJuYW1lIHx8ICcnLCB0aGlzLl9wYXNzd29yZCB8fCAnJyk7XHJcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9odHRwUmVxdWVzdFN5bmMob3B0c1dpdGhBdXRoLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gSXMgaHR0cHM/XHJcbiAgICAgICAgY29uc3QgcmVxVXJsID0gcmVxdWlyZSgndXJsJykucGFyc2Uob3B0c1dpdGhBdXRoLnVybCk7XHJcbiAgICAgICAgY29uc3QgaXNIdHRwcyA9IHJlcVVybC5wcm90b2NvbCA9PT0gJ2h0dHBzOic7XHJcbiAgICAgICAgLy8gU2V0dXAga2VlcC1hbGl2ZSBhZ2VudCAob3RoZXJ3aXNlIHdlIHdpbGwgZ2V0IEhUVFAgNDAxIGZvciBtZXNzYWdlIHR5cGUgMylcclxuICAgICAgICBjb25zdCBrZWVwYWxpdmVBZ2VudCA9IGlzSHR0cHMgPyBuZXcgaHR0cHMuQWdlbnQoe2tlZXBBbGl2ZTogdHJ1ZX0pXHJcbiAgICAgICAgICAgIDogbmV3IGh0dHAuQWdlbnQoe2tlZXBBbGl2ZTogdHJ1ZX0pO1xyXG4gICAgICAgIGlmIChpc0h0dHBzKSB7XHJcbiAgICAgICAgICAgIG9wdHNXaXRoQXV0aC5hZ2VudCA9IHsgaHR0cHM6IGtlZXBhbGl2ZUFnZW50IH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBvcHRzV2l0aEF1dGguYWdlbnQgPSB7IGh0dHA6IGtlZXBhbGl2ZUFnZW50IH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFNlbmQgVHlwZSAxIG1lc3NhZ2VcclxuICAgICAgICBjb25zdCBudGxtT3B0cyA9IHtcclxuICAgICAgICAgICAgdXNlcm5hbWU6IHRoaXMuX3VzZXJuYW1lLFxyXG4gICAgICAgICAgICBwYXNzd29yZDogdGhpcy5fcGFzc3dvcmQsXHJcbiAgICAgICAgICAgIGRvbWFpbjogJycsXHJcbiAgICAgICAgICAgIHdvcmtzdGF0aW9uOiAnJyxcclxuICAgICAgICAgICAgdXJsOiBvcHRzV2l0aEF1dGgudXJsXHJcbiAgICAgICAgfTtcclxuICAgICAgICBvcHRzV2l0aEF1dGguaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gbnRsbS5jcmVhdGVUeXBlMU1lc3NhZ2UobnRsbU9wdHMpO1xyXG4gICAgICAgIG9wdHNXaXRoQXV0aC5oZWFkZXJzWydDb25uZWN0aW9uJ10gPSAna2VlcC1hbGl2ZSc7XHJcbiAgICAgICAgb3B0c1dpdGhBdXRoLnRocm93SHR0cEVycm9ycyA9IGZhbHNlO1xyXG4gICAgICAgIGxldCB0eXBlMU1zZ1Jlc3BvbnNlID0gYXdhaXQgZ290KG9wdHNXaXRoQXV0aCk7XHJcbiAgICAgICAgYXV0aE1ldGhvZHMgPSBnZXRBdXRoZW50aWNhdGVNZXRob2RzKHR5cGUxTXNnUmVzcG9uc2UpO1xyXG4gICAgICAgIC8vIFBhcnNlIFR5cGUgMiByZXNwb25zZVxyXG4gICAgICAgIGlmICh0eXBlMU1zZ1Jlc3BvbnNlLnN0YXR1c0NvZGUgPT09IDQwMSAmJiBhdXRoTWV0aG9kcy5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICYmIGF1dGhNZXRob2RzWzBdLnN0YXJ0c1dpdGgoJ250bG0nKSkge1xyXG4gICAgICAgICAgICBjb25zdCB0eXBlMk1zZyA9IG50bG0ucGFyc2VUeXBlMk1lc3NhZ2UodHlwZTFNc2dSZXNwb25zZS5oZWFkZXJzWyd3d3ctYXV0aGVudGljYXRlJ10pO1xyXG4gICAgICAgICAgICBvcHRzV2l0aEF1dGguZm9sbG93UmVkaXJlY3QgPSBmYWxzZTtcclxuICAgICAgICAgICAgb3B0c1dpdGhBdXRoLmhlYWRlcnNbJ0Nvbm5lY3Rpb24nXSA9ICdjbG9zZSc7XHJcbiAgICAgICAgICAgIG9wdHNXaXRoQXV0aC5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPVxyXG4gICAgICAgICAgICAgICAgbnRsbS5jcmVhdGVUeXBlM01lc3NhZ2UodHlwZTJNc2csIG50bG1PcHRzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb3B0c1dpdGhBdXRoLnRocm93SHR0cEVycm9ycyA9IHRydWU7XHJcbiAgICAgICAgLy8gU2VuZCBUeXBlIDMgbWVzc2FnZVxyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9odHRwUmVxdWVzdFN5bmMob3B0c1dpdGhBdXRoLCB0cnVlKTtcclxuICAgIH1cclxufSJdfQ==