@bitgo-beta/sdk-api 1.10.1-beta.206 → 1.10.1-beta.2061

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/dist/package.json +23 -27
  2. package/dist/src/api.d.ts +18 -6
  3. package/dist/src/api.d.ts.map +1 -1
  4. package/dist/src/api.js +151 -72
  5. package/dist/src/bitgoAPI.d.ts +111 -29
  6. package/dist/src/bitgoAPI.d.ts.map +1 -1
  7. package/dist/src/bitgoAPI.js +704 -338
  8. package/dist/src/decryptV1.d.ts +60 -0
  9. package/dist/src/decryptV1.d.ts.map +1 -0
  10. package/dist/src/decryptV1.js +140 -0
  11. package/dist/src/encrypt.d.ts +37 -6
  12. package/dist/src/encrypt.d.ts.map +1 -1
  13. package/dist/src/encrypt.js +171 -15
  14. package/dist/src/encryptV2.d.ts +67 -0
  15. package/dist/src/encryptV2.d.ts.map +1 -0
  16. package/dist/src/encryptV2.js +234 -0
  17. package/dist/src/encryptionSession.d.ts +63 -0
  18. package/dist/src/encryptionSession.d.ts.map +1 -0
  19. package/dist/src/encryptionSession.js +140 -0
  20. package/dist/src/index.d.ts +3 -0
  21. package/dist/src/index.d.ts.map +1 -1
  22. package/dist/src/index.js +9 -2
  23. package/dist/src/types.d.ts +70 -43
  24. package/dist/src/types.d.ts.map +1 -1
  25. package/dist/src/types.js +4 -2
  26. package/dist/src/util.d.ts +12 -0
  27. package/dist/src/util.d.ts.map +1 -1
  28. package/dist/src/util.js +57 -4
  29. package/dist/src/v1/blockchain.js +25 -12
  30. package/dist/src/v1/keychains.js +39 -26
  31. package/dist/src/v1/markets.js +10 -5
  32. package/dist/src/v1/pendingapproval.d.ts.map +1 -1
  33. package/dist/src/v1/pendingapproval.js +57 -18
  34. package/dist/src/v1/pendingapprovals.d.ts.map +1 -1
  35. package/dist/src/v1/pendingapprovals.js +41 -7
  36. package/dist/src/v1/signPsbt.d.ts +14 -0
  37. package/dist/src/v1/signPsbt.d.ts.map +1 -0
  38. package/dist/src/v1/signPsbt.js +69 -0
  39. package/dist/src/v1/transactionBuilder.js +221 -91
  40. package/dist/src/v1/travelRule.js +125 -66
  41. package/dist/src/v1/verifyAddress.d.ts +6 -0
  42. package/dist/src/v1/verifyAddress.d.ts.map +1 -0
  43. package/dist/src/v1/verifyAddress.js +50 -0
  44. package/dist/src/v1/wallet.d.ts.map +1 -1
  45. package/dist/src/v1/wallet.js +498 -230
  46. package/dist/src/v1/wallets.js +118 -53
  47. package/dist/test/unit/api.d.ts +2 -0
  48. package/dist/test/unit/api.d.ts.map +1 -0
  49. package/dist/test/unit/api.js +331 -0
  50. package/dist/test/unit/bitgoAPI.d.ts +2 -0
  51. package/dist/test/unit/bitgoAPI.d.ts.map +1 -0
  52. package/dist/test/unit/bitgoAPI.js +1113 -0
  53. package/dist/test/unit/decryptV1.browser.d.ts +2 -0
  54. package/dist/test/unit/decryptV1.browser.d.ts.map +1 -0
  55. package/dist/test/unit/decryptV1.browser.js +133 -0
  56. package/dist/test/unit/decryptV1.d.ts +2 -0
  57. package/dist/test/unit/decryptV1.d.ts.map +1 -0
  58. package/dist/test/unit/decryptV1.js +230 -0
  59. package/dist/test/unit/encrypt.d.ts +2 -0
  60. package/dist/test/unit/encrypt.d.ts.map +1 -0
  61. package/dist/test/unit/encrypt.js +544 -0
  62. package/dist/test/unit/fixtures/keycard.d.ts +25 -0
  63. package/dist/test/unit/fixtures/keycard.d.ts.map +1 -0
  64. package/dist/test/unit/fixtures/keycard.js +28 -0
  65. package/dist/test/unit/hmacStrategy.d.ts +2 -0
  66. package/dist/test/unit/hmacStrategy.d.ts.map +1 -0
  67. package/dist/test/unit/hmacStrategy.js +136 -0
  68. package/dist/test/unit/serializeRequestDataIntegration.d.ts +2 -0
  69. package/dist/test/unit/serializeRequestDataIntegration.d.ts.map +1 -0
  70. package/dist/test/unit/serializeRequestDataIntegration.js +115 -0
  71. package/dist/test/unit/utils.d.ts +2 -0
  72. package/dist/test/unit/utils.d.ts.map +1 -0
  73. package/dist/test/unit/utils.js +65 -0
  74. package/dist/test/unit/v1/fixtures/accelerate-tx.d.ts +4 -0
  75. package/dist/test/unit/v1/fixtures/accelerate-tx.d.ts.map +1 -0
  76. package/dist/test/unit/v1/fixtures/accelerate-tx.js +53 -0
  77. package/dist/test/unit/v1/fixtures/index.d.ts +3 -0
  78. package/dist/test/unit/v1/fixtures/index.d.ts.map +1 -0
  79. package/dist/test/unit/v1/fixtures/index.js +24 -0
  80. package/dist/test/unit/v1/signPsbt.d.ts +2 -0
  81. package/dist/test/unit/v1/signPsbt.d.ts.map +1 -0
  82. package/dist/test/unit/v1/signPsbt.js +53 -0
  83. package/dist/test/unit/v1/travelRule.d.ts +2 -0
  84. package/dist/test/unit/v1/travelRule.d.ts.map +1 -0
  85. package/dist/test/unit/v1/travelRule.js +125 -0
  86. package/dist/test/unit/v1/wallet.d.ts +2 -0
  87. package/dist/test/unit/v1/wallet.d.ts.map +1 -0
  88. package/dist/test/unit/v1/wallet.js +1717 -0
  89. package/dist/tsconfig.tsbuildinfo +1 -0
  90. package/package.json +23 -27
  91. package/.eslintignore +0 -5
  92. package/CHANGELOG.md +0 -605
  93. package/dist/web/main.js +0 -2
  94. package/dist/web/main.js.LICENSE.txt +0 -110
package/dist/package.json CHANGED
@@ -1,32 +1,22 @@
1
1
  {
2
2
  "name": "@bitgo-beta/sdk-api",
3
- "version": "1.10.1-beta.206",
3
+ "version": "1.10.1-beta.2061",
4
4
  "description": "REST wrapper for BitGoJS",
5
5
  "main": "./dist/src/index.js",
6
6
  "types": "./dist/src/index.d.ts",
7
- "exports": {
8
- "./package.json": "./package.json",
9
- ".": {
10
- "node": "./dist/src/index.js",
11
- "default": "./dist/web/main.js"
12
- }
13
- },
14
7
  "browser": {
15
8
  "proxy-agent": false
16
9
  },
17
10
  "scripts": {
18
11
  "build": "yarn tsc --build --incremental --verbose .",
19
12
  "fmt": "prettier --write .",
20
- "check-fmt": "prettier --check .",
13
+ "check-fmt": "prettier --check '**/*.{ts,js,json}'",
21
14
  "clean": "rm -r ./dist",
22
15
  "lint": "eslint --quiet .",
23
16
  "prepare": "npm run build",
24
- "webpack-dev": "yarn webpack",
25
- "webpack-prod": "yarn webpack --mode=production --node-env=production",
26
- "prepublishOnly": "yarn webpack-prod",
27
17
  "test": "npm run coverage",
28
18
  "coverage": "nyc -- npm run unit-test",
29
- "unit-test": "mocha"
19
+ "unit-test": "mocha 'test/unit/**/*.ts'"
30
20
  },
31
21
  "author": "BitGo SDK Team <sdkteam@bitgo.com>",
32
22
  "license": "MIT",
@@ -50,23 +40,26 @@
50
40
  ]
51
41
  },
52
42
  "dependencies": {
53
- "@bitgo-beta/sdk-core": "8.2.1-beta.206",
54
- "@bitgo-beta/sjcl": "1.0.2-beta.444",
55
- "@bitgo-beta/unspents": "0.13.2-beta.206",
56
- "@bitgo-beta/utxo-lib": "8.0.3-beta.207",
43
+ "@bitgo-beta/argon2": "0.0.1-beta.392",
44
+ "@bitgo-beta/sdk-core": "8.2.1-beta.2069",
45
+ "@bitgo-beta/sdk-hmac": "1.0.1-beta.1459",
46
+ "@bitgo-beta/sjcl": "1.0.2-beta.2332",
47
+ "@bitgo-beta/unspents": "0.13.2-beta.2077",
48
+ "@bitgo-beta/utxo-lib": "8.0.3-beta.2079",
57
49
  "@types/superagent": "4.1.15",
58
- "bitcoinjs-message": "npm:@bitgo-forks/bitcoinjs-message@1.0.0-master.2",
59
- "bluebird": "^3.5.3",
60
- "browser-or-node": "2.0.0",
61
- "bs58": "^2.0.1",
50
+ "bitcoinjs-message": "npm:@bitgo-forks/bitcoinjs-message@1.0.0-master.3",
62
51
  "debug": "3.1.0",
63
52
  "eol": "^0.5.0",
64
- "lodash": "^4.17.15",
65
- "proxy-agent": "6.3.1",
66
- "sanitize-html": "^2.11",
67
- "secp256k1": "^4.0.2",
53
+ "io-ts": "npm:@bitgo-forks/io-ts@2.1.4",
54
+ "lodash": "^4.18.0",
55
+ "proxy-agent": "6.4.0",
56
+ "sanitize-html": "^2.17.4",
57
+ "secp256k1": "5.0.1",
68
58
  "secrets.js-grempe": "^1.1.0",
69
- "superagent": "3.8.3"
59
+ "superagent": "^9.0.1"
60
+ },
61
+ "devDependencies": {
62
+ "crypto-browserify": "^3.12.0"
70
63
  },
71
64
  "overrides": {
72
65
  "degenerator": "5.0.0"
@@ -74,5 +67,8 @@
74
67
  "resolutions": {
75
68
  "degenerator": "5.0.0"
76
69
  },
77
- "gitHead": "dcc880e95336e6ed8395146142262554bc8a0e9b"
70
+ "gitHead": "17464c2623c873c1cb37dde34a7323876b49c76b",
71
+ "files": [
72
+ "dist"
73
+ ]
78
74
  }
package/dist/src/api.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import * as superagent from 'superagent';
1
+ import superagent from 'superagent';
2
2
  import { BitGoRequest } from '@bitgo-beta/sdk-core';
3
- import { VerifyResponseOptions } from './types';
3
+ import { AuthVersion, VerifyResponseOptions } from './types';
4
4
  import { BitGoAPI } from './bitgoAPI';
5
5
  /**
6
6
  * Add the bitgo-specific result() function on a superagent request.
@@ -29,11 +29,22 @@ export declare function handleResponseError(e: Error & {
29
29
  response?: superagent.Response;
30
30
  }): never;
31
31
  /**
32
- * Serialize request data based on the request content type
33
- * Note: Not sure this is still needed or even useful. Consider removing.
32
+ * Serialize request data based on the request content type.
33
+ *
34
+ * Multipart requests (built with superagent's `.field()`/`.attach()`) populate
35
+ * `req._formData` rather than `req._data`. For those, return the final multipart
36
+ * body as a Buffer so the HMAC is computed over the exact bytes superagent will
37
+ * transmit. `Buffer#toString('utf8')` must NOT be used here: raw file content
38
+ * (e.g. JPEG bytes) contains invalid UTF-8 sequences that would be replaced with
39
+ * U+FFFD and corrupt the hash.
40
+ *
41
+ * Otherwise:
42
+ * If data is already a string, returns it as-is to preserve exact bytes for HMAC.
43
+ * If data is a Buffer, converts to UTF-8 string.
44
+ * If data is an object, serializes it based on Content-Type.
34
45
  * @param req
35
46
  */
36
- export declare function serializeRequestData(req: superagent.Request): string | undefined;
47
+ export declare function serializeRequestData(req: superagent.Request): string | Buffer | undefined;
37
48
  /**
38
49
  * Set the superagent query string correctly for browsers or node.
39
50
  * @param req
@@ -43,5 +54,6 @@ export declare function setRequestQueryString(req: superagent.SuperAgentRequest)
43
54
  * Verify that the response received from the server is signed correctly.
44
55
  * Right now, it is very permissive with the timestamp variance.
45
56
  */
46
- export declare function verifyResponse(bitgo: BitGoAPI, token: string | undefined, method: VerifyResponseOptions['method'], req: superagent.SuperAgentRequest, response: superagent.Response): superagent.Response;
57
+ export declare function verifyResponse(bitgo: BitGoAPI, token: string | undefined, method: VerifyResponseOptions['method'], req: superagent.SuperAgentRequest, response: superagent.Response, authVersion: AuthVersion): superagent.Response;
58
+ export declare function verifyResponseAsync(bitgo: BitGoAPI, token: string | undefined, method: VerifyResponseOptions['method'], req: superagent.SuperAgentRequest, response: superagent.Response, authVersion: AuthVersion): Promise<superagent.Response>;
47
59
  //# sourceMappingURL=api.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/api.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,UAAU,MAAM,YAAY,CAAC;AAIzC,OAAO,EAAoB,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAItC;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,kBAAkB,GAAG,GAAG,EACrD,GAAG,EAAE,UAAU,CAAC,iBAAiB,GAChC,YAAY,CAAC,kBAAkB,CAAC,CASlC;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,kBAAkB,EACrD,aAAa,CAAC,EAAE,MAAM,GACrB,CAAC,GAAG,EAAE,UAAU,CAAC,QAAQ,KAAK,kBAAkB,CAOlD;AAkBD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,KAAK,GAAG;IAAE,QAAQ,CAAC,EAAE,UAAU,CAAC,QAAQ,CAAA;CAAE,GAAG,KAAK,CAKxF;AAgCD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,UAAU,CAAC,OAAO,GAAG,MAAM,GAAG,SAAS,CAkBhF;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,UAAU,CAAC,iBAAiB,GAAG,IAAI,CAwB7E;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,QAAQ,EACf,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,qBAAqB,CAAC,QAAQ,CAAC,EACvC,GAAG,EAAE,UAAU,CAAC,iBAAiB,EACjC,QAAQ,EAAE,UAAU,CAAC,QAAQ,GAC5B,UAAU,CAAC,QAAQ,CA+CrB"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/api.ts"],"names":[],"mappings":"AAOA,OAAO,UAAU,MAAM,YAAY,CAAC;AAIpC,OAAO,EAAoB,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEtE,OAAO,EAAE,WAAW,EAAsB,qBAAqB,EAAE,MAAM,SAAS,CAAC;AACjF,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAItC;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,kBAAkB,GAAG,GAAG,EACrD,GAAG,EAAE,UAAU,CAAC,iBAAiB,GAChC,YAAY,CAAC,kBAAkB,CAAC,CASlC;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,kBAAkB,EACrD,aAAa,CAAC,EAAE,MAAM,GACrB,CAAC,GAAG,EAAE,UAAU,CAAC,QAAQ,KAAK,kBAAkB,CAalD;AAqBD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,KAAK,GAAG;IAAE,QAAQ,CAAC,EAAE,UAAU,CAAC,QAAQ,CAAA;CAAE,GAAG,KAAK,CAKxF;AAgCD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,UAAU,CAAC,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CA+DzF;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,UAAU,CAAC,iBAAiB,GAAG,IAAI,CAwB7E;AAqCD;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,QAAQ,EACf,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,qBAAqB,CAAC,QAAQ,CAAC,EACvC,GAAG,EAAE,UAAU,CAAC,iBAAiB,EACjC,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAC7B,WAAW,EAAE,WAAW,GACvB,UAAU,CAAC,QAAQ,CAkBrB;AAED,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,QAAQ,EACf,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,qBAAqB,CAAC,QAAQ,CAAC,EACvC,GAAG,EAAE,UAAU,CAAC,iBAAiB,EACjC,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAC7B,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAkB9B"}
package/dist/src/api.js CHANGED
@@ -1,18 +1,27 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.verifyResponse = exports.setRequestQueryString = exports.serializeRequestData = exports.handleResponseError = exports.handleResponseResult = exports.toBitgoRequest = void 0;
6
+ exports.toBitgoRequest = toBitgoRequest;
7
+ exports.handleResponseResult = handleResponseResult;
8
+ exports.handleResponseError = handleResponseError;
9
+ exports.serializeRequestData = serializeRequestData;
10
+ exports.setRequestQueryString = setRequestQueryString;
11
+ exports.verifyResponse = verifyResponse;
12
+ exports.verifyResponseAsync = verifyResponseAsync;
4
13
  /**
5
14
  * @prettier
6
15
  */
7
- const debug_1 = require("debug");
8
- const eol = require("eol");
9
- const _ = require("lodash");
10
- const sanitizeHtml = require("sanitize-html");
11
- const superagent = require("superagent");
12
- const urlLib = require("url");
13
- const querystring = require("querystring");
16
+ const debug_1 = __importDefault(require("debug"));
17
+ const eol_1 = __importDefault(require("eol"));
18
+ const lodash_1 = __importDefault(require("lodash"));
19
+ const sanitize_html_1 = __importDefault(require("sanitize-html"));
20
+ const superagent_1 = __importDefault(require("superagent"));
21
+ const url_1 = __importDefault(require("url"));
22
+ const querystring_1 = __importDefault(require("querystring"));
14
23
  const sdk_core_1 = require("@bitgo-beta/sdk-core");
15
- const debug = debug_1.default('bitgo:api');
24
+ const debug = (0, debug_1.default)('bitgo:api');
16
25
  /**
17
26
  * Add the bitgo-specific result() function on a superagent request.
18
27
  *
@@ -31,7 +40,6 @@ function toBitgoRequest(req) {
31
40
  },
32
41
  });
33
42
  }
34
- exports.toBitgoRequest = toBitgoRequest;
35
43
  /**
36
44
  * Return a function which extracts the specified response body property from the response if successful,
37
45
  * otherwise throw an `ApiErrorResponse` parsed from the response body.
@@ -39,13 +47,17 @@ exports.toBitgoRequest = toBitgoRequest;
39
47
  */
40
48
  function handleResponseResult(optionalField) {
41
49
  return function (res) {
42
- if (_.isNumber(res.status) && res.status >= 200 && res.status < 300) {
43
- return optionalField ? res.body[optionalField] : res.body;
50
+ if (lodash_1.default.isNumber(res.status) && res.status >= 200 && res.status < 300) {
51
+ return (
52
+ // If there's an optional field and the body is non-nullish with that property, return it;
53
+ // otherwise return the body if available; if not, return the text; and finally fallback to the entire response.
54
+ (optionalField && res.body && res.body[optionalField] !== undefined ? res.body[optionalField] : res.body) ??
55
+ res.text ??
56
+ res);
44
57
  }
45
58
  throw errFromResponse(res);
46
59
  };
47
60
  }
48
- exports.handleResponseResult = handleResponseResult;
49
61
  /**
50
62
  * Extract relevant information from a successful response (that is, a response with an HTTP status code
51
63
  * between 200 and 299), but which resulted in an application specific error and use it to construct and
@@ -54,13 +66,15 @@ exports.handleResponseResult = handleResponseResult;
54
66
  * @param res
55
67
  */
56
68
  function errFromResponse(res) {
57
- var _a;
58
69
  const message = createResponseErrorString(res);
59
70
  const status = res.status;
60
71
  const result = res.body;
61
- const invalidToken = _.has(res.header, 'x-auth-required') && res.header['x-auth-required'] === 'true';
62
- const needsOtp = ((_a = res.body) === null || _a === void 0 ? void 0 : _a.needsOTP) !== undefined;
63
- return new sdk_core_1.ApiResponseError(message, status, result, invalidToken, needsOtp);
72
+ const invalidToken = lodash_1.default.has(res.header, 'x-auth-required') && res.header['x-auth-required'] === 'true';
73
+ const needsOtp = res.body?.needsOTP !== undefined;
74
+ // Server echoes the client's `Request-ID` header (or one it generated) back on every
75
+ // response, including errors — surface it so failures can be correlated with server logs.
76
+ const requestId = res.header?.['request-id'];
77
+ return new sdk_core_1.ApiResponseError(message, status, result, invalidToken, needsOtp, requestId);
64
78
  }
65
79
  /**
66
80
  * Handle an error or an error containing an HTTP response and use it to throw a well-formed error object.
@@ -73,16 +87,14 @@ function handleResponseError(e) {
73
87
  }
74
88
  throw e;
75
89
  }
76
- exports.handleResponseError = handleResponseError;
77
90
  /**
78
91
  * There are many ways a request can fail, and may ways information on that failure can be
79
92
  * communicated to the client. This function tries to handle those cases and create a sane error string
80
93
  * @param res Response from an HTTP request
81
94
  */
82
95
  function createResponseErrorString(res) {
83
- var _a;
84
96
  let errString = res.status.toString(); // at the very least we'll have the status code
85
- if ((_a = res.body) === null || _a === void 0 ? void 0 : _a.error) {
97
+ if (res.body?.error) {
86
98
  // this is the case we hope for, where the server gives us a nice error from the JSON body
87
99
  errString = res.body.error;
88
100
  }
@@ -90,11 +102,11 @@ function createResponseErrorString(res) {
90
102
  // if the response came back as text, we try to parse it as HTML and remove all tags, leaving us
91
103
  // just the bare text, which we then trim of excessive newlines and limit to a certain length
92
104
  try {
93
- let sanitizedText = sanitizeHtml(res.text, { allowedTags: [] });
105
+ let sanitizedText = (0, sanitize_html_1.default)(res.text, { allowedTags: [] });
94
106
  sanitizedText = sanitizedText.trim();
95
- sanitizedText = eol.lf(sanitizedText); // use '\n' for all newlines
96
- sanitizedText = _.replace(sanitizedText, /\n[ |\t]{1,}\n/g, '\n\n'); // remove the spaces/tabs between newlines
97
- sanitizedText = _.replace(sanitizedText, /[\n]{3,}/g, '\n\n'); // have at most 2 consecutive newlines
107
+ sanitizedText = eol_1.default.lf(sanitizedText); // use '\n' for all newlines
108
+ sanitizedText = lodash_1.default.replace(sanitizedText, /\n[ |\t]{1,}\n/g, '\n\n'); // remove the spaces/tabs between newlines
109
+ sanitizedText = lodash_1.default.replace(sanitizedText, /[\n]{3,}/g, '\n\n'); // have at most 2 consecutive newlines
98
110
  sanitizedText = sanitizedText.substring(0, 5000); // prevent message from getting too large
99
111
  errString = errString + '\n' + sanitizedText; // add it to our existing errString (at this point the more info the better!)
100
112
  }
@@ -106,36 +118,85 @@ function createResponseErrorString(res) {
106
118
  return errString;
107
119
  }
108
120
  /**
109
- * Serialize request data based on the request content type
110
- * Note: Not sure this is still needed or even useful. Consider removing.
121
+ * Serialize request data based on the request content type.
122
+ *
123
+ * Multipart requests (built with superagent's `.field()`/`.attach()`) populate
124
+ * `req._formData` rather than `req._data`. For those, return the final multipart
125
+ * body as a Buffer so the HMAC is computed over the exact bytes superagent will
126
+ * transmit. `Buffer#toString('utf8')` must NOT be used here: raw file content
127
+ * (e.g. JPEG bytes) contains invalid UTF-8 sequences that would be replaced with
128
+ * U+FFFD and corrupt the hash.
129
+ *
130
+ * Otherwise:
131
+ * If data is already a string, returns it as-is to preserve exact bytes for HMAC.
132
+ * If data is a Buffer, converts to UTF-8 string.
133
+ * If data is an object, serializes it based on Content-Type.
111
134
  * @param req
112
135
  */
113
136
  function serializeRequestData(req) {
114
- let data = req._data;
115
- if (typeof data !== 'string') {
116
- let contentType = req.get('Content-Type');
117
- // Parse out just the content type from the header (ignore the charset)
118
- if (contentType) {
119
- contentType = contentType.split(';')[0];
120
- }
121
- let serialize = superagent.serialize[contentType];
122
- if (!serialize && /[\/+]json\b/.test(contentType)) {
123
- serialize = superagent.serialize['application/json'];
137
+ // `_formData` is created lazily by superagent's `.field()`/`.attach()` and is an
138
+ // instance of the `form-data` package's FormData, which exposes a synchronous
139
+ // `getBuffer()` returning the exact multipart body (boundary + content) as a
140
+ // Buffer. This runs after all `.attach()`/`.field()` calls (see requestPatch).
141
+ const formData = req._formData;
142
+ if (formData && typeof formData.getBuffer === 'function') {
143
+ return formData.getBuffer();
144
+ }
145
+ const data = req._data;
146
+ if (typeof data === 'string') {
147
+ return data;
148
+ }
149
+ if (Buffer.isBuffer(data)) {
150
+ // Convert Buffer to UTF-8 string and mutate _data to ensure consistency.
151
+ // This is critical: if _data stays as a Buffer, superagent will serialize it
152
+ // as JSON ({"type":"Buffer","data":[...]}), which won't match the HMAC.
153
+ // By mutating to string, superagent sends the exact bytes we hash.
154
+ // This is safe for retries: calling again with a string will hit the early return above.
155
+ const stringData = data.toString('utf8');
156
+ req._data = stringData;
157
+ return stringData;
158
+ }
159
+ if (data === undefined || data === null) {
160
+ return undefined;
161
+ }
162
+ // Serialize object data based on Content-Type
163
+ let contentType = req.get('Content-Type');
164
+ // Parse out just the content type from the header (ignore the charset)
165
+ if (contentType) {
166
+ contentType = contentType.split(';')[0].trim();
167
+ }
168
+ let serialize;
169
+ const serializers = superagent_1.default.serialize;
170
+ if (contentType) {
171
+ if (Object.prototype.hasOwnProperty.call(serializers, contentType)) {
172
+ const candidate = serializers[contentType];
173
+ if (typeof candidate === 'function') {
174
+ serialize = candidate;
175
+ }
124
176
  }
125
- if (serialize) {
126
- data = serialize(data);
127
- req._data = data;
128
- return data;
177
+ else if (/[\/+]json\b/.test(contentType)) {
178
+ // Fall back to the built-in JSON serializer for JSON-like content types
179
+ if (Object.prototype.hasOwnProperty.call(serializers, 'application/json')) {
180
+ const jsonSerializer = serializers['application/json'];
181
+ if (typeof jsonSerializer === 'function') {
182
+ serialize = jsonSerializer;
183
+ }
184
+ }
129
185
  }
130
186
  }
187
+ if (serialize) {
188
+ const serialized = serialize(data);
189
+ req._data = serialized;
190
+ return serialized;
191
+ }
192
+ return undefined;
131
193
  }
132
- exports.serializeRequestData = serializeRequestData;
133
194
  /**
134
195
  * Set the superagent query string correctly for browsers or node.
135
196
  * @param req
136
197
  */
137
198
  function setRequestQueryString(req) {
138
- const urlDetails = urlLib.parse(req.url);
199
+ const urlDetails = url_1.default.parse(req.url);
139
200
  let queryString;
140
201
  const query = req._query;
141
202
  const qs = req.qs;
@@ -146,7 +207,7 @@ function setRequestQueryString(req) {
146
207
  }
147
208
  else if (qs) {
148
209
  // node version
149
- queryString = querystring.stringify(qs);
210
+ queryString = querystring_1.default.stringify(qs);
150
211
  req.qs = null;
151
212
  }
152
213
  if (queryString) {
@@ -156,44 +217,26 @@ function setRequestQueryString(req) {
156
217
  else {
157
218
  urlDetails.search = '?' + queryString;
158
219
  }
159
- req.url = urlLib.format(urlDetails);
220
+ req.url = url_1.default.format(urlDetails);
160
221
  }
161
222
  }
162
- exports.setRequestQueryString = setRequestQueryString;
163
223
  /**
164
- * Verify that the response received from the server is signed correctly.
165
- * Right now, it is very permissive with the timestamp variance.
224
+ * Validate a completed verification response and throw a descriptive `ApiResponseError` if it
225
+ * indicates the response is invalid or outside the acceptable time window.
166
226
  */
167
- function verifyResponse(bitgo, token, method, req, response) {
168
- // we can't verify the response if we're not authenticated
169
- if (!req.isV2Authenticated || !req.authenticationToken) {
170
- return response;
171
- }
172
- const verificationResponse = bitgo.verifyResponse({
173
- url: req.url,
174
- hmac: response.header.hmac,
175
- statusCode: response.status,
176
- text: response.text,
177
- timestamp: response.header.timestamp,
178
- token: req.authenticationToken,
179
- method,
180
- });
227
+ function assertVerificationResponse(bitgo, token, req, response, verificationResponse) {
181
228
  if (!verificationResponse.isValid) {
182
- // calculate the HMAC
183
- const receivedHmac = response.header.hmac;
184
- const expectedHmac = verificationResponse.expectedHmac;
185
- const signatureSubject = verificationResponse.signatureSubject;
186
229
  // Log only the first 10 characters of the token to ensure the full token isn't logged.
187
230
  const partialBitgoToken = token ? token.substring(0, 10) : '';
188
231
  const errorDetails = {
189
- expectedHmac,
190
- receivedHmac,
191
- hmacInput: signatureSubject,
232
+ expectedHmac: verificationResponse.expectedHmac,
233
+ receivedHmac: response.header.hmac,
234
+ hmacInput: verificationResponse.signatureSubject,
192
235
  requestToken: req.authenticationToken,
193
236
  bitgoToken: partialBitgoToken,
194
237
  };
195
238
  debug('Invalid response HMAC: %O', errorDetails);
196
- throw new sdk_core_1.ApiResponseError('invalid response HMAC, possible man-in-the-middle-attack', 511, errorDetails);
239
+ throw new sdk_core_1.ApiResponseError('invalid response HMAC', 511, errorDetails);
197
240
  }
198
241
  if (bitgo.getAuthVersion() === 3 && !verificationResponse.isInResponseValidityWindow) {
199
242
  const errorDetails = {
@@ -201,9 +244,45 @@ function verifyResponse(bitgo, token, method, req, response) {
201
244
  verificationTime: verificationResponse.verificationTime,
202
245
  };
203
246
  debug('Server response outside response validity time window: %O', errorDetails);
204
- throw new sdk_core_1.ApiResponseError('server response outside response validity time window, possible man-in-the-middle-attack', 511, errorDetails);
247
+ throw new sdk_core_1.ApiResponseError('server response outside response validity time window', 511, errorDetails);
248
+ }
249
+ }
250
+ /**
251
+ * Verify that the response received from the server is signed correctly.
252
+ * Right now, it is very permissive with the timestamp variance.
253
+ */
254
+ function verifyResponse(bitgo, token, method, req, response, authVersion) {
255
+ if (!req.isV2Authenticated || !req.authenticationToken) {
256
+ return response;
257
+ }
258
+ const verificationResponse = bitgo.verifyResponse({
259
+ url: req.url,
260
+ hmac: response.header.hmac,
261
+ statusCode: response.status,
262
+ text: response.text,
263
+ timestamp: response.header.timestamp,
264
+ token: req.authenticationToken,
265
+ method,
266
+ authVersion,
267
+ });
268
+ assertVerificationResponse(bitgo, token, req, response, verificationResponse);
269
+ return response;
270
+ }
271
+ async function verifyResponseAsync(bitgo, token, method, req, response, authVersion) {
272
+ if (!req.isV2Authenticated || !req.authenticationToken) {
273
+ return response;
205
274
  }
275
+ const verificationResponse = await bitgo.verifyResponseAsync({
276
+ url: req.url,
277
+ hmac: response.header.hmac,
278
+ statusCode: response.status,
279
+ text: response.text,
280
+ timestamp: response.header.timestamp,
281
+ token: req.authenticationToken,
282
+ method,
283
+ authVersion,
284
+ });
285
+ assertVerificationResponse(bitgo, token, req, response, verificationResponse);
206
286
  return response;
207
287
  }
208
- exports.verifyResponse = verifyResponse;
209
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7R0FFRztBQUNILGlDQUEwQjtBQUMxQiwyQkFBMkI7QUFDM0IsNEJBQTRCO0FBQzVCLDhDQUE4QztBQUM5Qyx5Q0FBeUM7QUFDekMsOEJBQThCO0FBQzlCLDJDQUEyQztBQUUzQyxtREFBc0U7QUFLdEUsTUFBTSxLQUFLLEdBQUcsZUFBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBRWpDOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFnQixjQUFjLENBQzVCLEdBQWlDO0lBRWpDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7UUFDeEIsTUFBTSxDQUFDLGFBQXNCO1lBQzNCLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FDYixDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsb0JBQW9CLENBQXFCLGFBQWEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUMvRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQ3RDLENBQUM7UUFDSixDQUFDO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQVhELHdDQVdDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLG9CQUFvQixDQUNsQyxhQUFzQjtJQUV0QixPQUFPLFVBQVUsR0FBd0I7UUFDdkMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRTtZQUNuRSxPQUFPLGFBQWEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztTQUMzRDtRQUNELE1BQU0sZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdC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RkFBdUY7UUFDdkYsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDOUQsTUFBTSxZQUFZLEdBQUc7WUFDbkIsWUFBWTtZQUNaLFlBQVk7WUFDWixTQUFTLEVBQUUsZ0JBQWdCO1lBQzNCLFlBQVksRUFBRSxHQUFHLENBQUMsbUJBQW1CO1lBQ3JDLFVBQVUsRUFBRSxpQkFBaUI7U0FDOUIsQ0FBQztRQUNGLEtBQUssQ0FBQywyQkFBMkIsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNqRCxNQUFNLElBQUksMkJBQWdCLENBQUMsMERBQTBELEVBQUUsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDO0tBQzNHO0lBRUQsSUFBSSxLQUFLLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsMEJBQTBCLEVBQUU7UUFDcEYsTUFBTSxZQUFZLEdBQUc7WUFDbkIsU0FBUyxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsU0FBUztZQUNwQyxnQkFBZ0IsRUFBRSxvQkFBb0IsQ0FBQyxnQkFBZ0I7U0FDeEQsQ0FBQztRQUNGLEtBQUssQ0FBQywyREFBMkQsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNqRixNQUFNLElBQUksMkJBQWdCLENBQ3hCLDBGQUEwRixFQUMxRixHQUFHLEVBQ0gsWUFBWSxDQUNiLENBQUM7S0FDSDtJQUNELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUFyREQsd0NBcURDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqL1xuaW1wb3J0IERlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCAqIGFzIGVvbCBmcm9tICdlb2wnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0ICogYXMgc2FuaXRpemVIdG1sIGZyb20gJ3Nhbml0aXplLWh0bWwnO1xuaW1wb3J0ICogYXMgc3VwZXJhZ2VudCBmcm9tICdzdXBlcmFnZW50JztcbmltcG9ydCAqIGFzIHVybExpYiBmcm9tICd1cmwnO1xuaW1wb3J0ICogYXMgcXVlcnlzdHJpbmcgZnJvbSAncXVlcnlzdHJpbmcnO1xuXG5pbXBvcnQgeyBBcGlSZXNwb25zZUVycm9yLCBCaXRHb1JlcXVlc3QgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5cbmltcG9ydCB7IFZlcmlmeVJlc3BvbnNlT3B0aW9ucyB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgQml0R29BUEkgfSBmcm9tICcuL2JpdGdvQVBJJztcblxuY29uc3QgZGVidWcgPSBEZWJ1ZygnYml0Z286YXBpJyk7XG5cbi8qKlxuICogQWRkIHRoZSBiaXRnby1zcGVjaWZpYyByZXN1bHQoKSBmdW5jdGlvbiBvbiBhIHN1cGVyYWdlbnQgcmVxdWVzdC5cbiAqXG4gKiBJZiB0aGUgc2VydmVyIHJlc3BvbnNlIGlzIHN1Y2Nlc3NmdWwsIHRoZSBgcmVzdWx0KClgIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGVpdGhlciB0aGUgZW50aXJlIHJlc3BvbnNlIGJvZHksXG4gKiBvciB0aGUgZmllbGQgZnJvbSB0aGUgcmVzcG9uc2UgYm9keSBzcGVjaWZpZWQgYnkgdGhlIGBvcHRpb25hbEZpZWxkYCBwYXJhbWV0ZXIgaWYgaXQgaXMgcHJvdmlkZWQuXG4gKlxuICogSWYgdGhlIHNlcnZlciByZXNwb25zZSB3aXRoIGFuIGVycm9yLCBgcmVzdWx0KClgIHdpbGwgaGFuZGxlIEhUVFAgZXJyb3JzIGFwcHJvcHJpYXRlbHkgYnlcbiAqIHJldGhyb3dpbmcgdGhlbSBhcyBhbiBgQXBpUmVzcG9uc2VFcnJvcmAgaWYgcG9zc2libGUsIGFuZCBvdGhlcndpc2UgcmV0aHJvd2luZyB0aGUgdW5kZXJseWluZyByZXNwb25zZSBlcnJvci5cbiAqXG4gKiBAcGFyYW0gcmVxXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0JpdGdvUmVxdWVzdDxSZXNwb25zZVJlc3VsdFR5cGUgPSBhbnk+KFxuICByZXE6IHN1cGVyYWdlbnQuU3VwZXJBZ2VudFJlcXVlc3Rcbik6IEJpdEdvUmVxdWVzdDxSZXNwb25zZVJlc3VsdFR5cGU+IHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24ocmVxLCB7XG4gICAgcmVzdWx0KG9wdGlvbmFsRmllbGQ/OiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiByZXEudGhlbihcbiAgICAgICAgKHJlc3BvbnNlKSA9PiBoYW5kbGVSZXNwb25zZVJlc3VsdDxSZXNwb25zZVJlc3VsdFR5cGU+KG9wdGlvbmFsRmllbGQpKHJlc3BvbnNlKSxcbiAgICAgICAgKGVycm9yKSA9PiBoYW5kbGVSZXNwb25zZUVycm9yKGVycm9yKVxuICAgICAgKTtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gYSBmdW5jdGlvbiB3aGljaCBleHRyYWN0cyB0aGUgc3BlY2lmaWVkIHJlc3BvbnNlIGJvZHkgcHJvcGVydHkgZnJvbSB0aGUgcmVzcG9uc2UgaWYgc3VjY2Vzc2Z1bCxcbiAqIG90aGVyd2lzZSB0aHJvdyBhbiBgQXBpRXJyb3JSZXNwb25zZWAgcGFyc2VkIGZyb20gdGhlIHJlc3BvbnNlIGJvZHkuXG4gKiBAcGFyYW0gb3B0aW9uYWxGaWVsZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlUmVzcG9uc2VSZXN1bHQ8UmVzcG9uc2VSZXN1bHRUeXBlPihcbiAgb3B0aW9uYWxGaWVsZD86IHN0cmluZ1xuKTogKHJlczogc3VwZXJhZ2VudC5SZXNwb25zZSkgPT4gUmVzcG9uc2VSZXN1bHRUeXBlIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChyZXM6IHN1cGVyYWdlbnQuUmVzcG9uc2UpOiBSZXNwb25zZVJlc3VsdFR5cGUge1xuICAgIGlmIChfLmlzTnVtYmVyKHJlcy5zdGF0dXMpICYmIHJlcy5zdGF0dXMgPj0gMjAwICYmIHJlcy5zdGF0dXMgPCAzMDApIHtcbiAgICAgIHJldHVybiBvcHRpb25hbEZpZWxkID8gcmVzLmJvZHlbb3B0aW9uYWxGaWVsZF0gOiByZXMuYm9keTtcbiAgICB9XG4gICAgdGhyb3cgZXJyRnJvbVJlc3BvbnNlKHJlcyk7XG4gIH07XG59XG5cbi8qKlxuICogRXh0cmFjdCByZWxldmFudCBpbmZvcm1hdGlvbiBmcm9tIGEgc3VjY2Vzc2Z1bCByZXNwb25zZSAodGhhdCBpcywgYSByZXNwb25zZSB3aXRoIGFuIEhUVFAgc3RhdHVzIGNvZGVcbiAqIGJldHdlZW4gMjAwIGFuZCAyOTkpLCBidXQgd2hpY2ggcmVzdWx0ZWQgaW4gYW4gYXBwbGljYXRpb24gc3BlY2lmaWMgZXJyb3IgYW5kIHVzZSBpdCB0byBjb25zdHJ1Y3QgYW5kXG4gKiB0aHJvdyBhbiBgQXBpRXJyb3JSZXNwb25zZWAuXG4gKlxuICogQHBhcmFtIHJlc1xuICovXG5mdW5jdGlvbiBlcnJGcm9tUmVzcG9uc2U8UmVzcG9uc2VCb2R5VHlwZT4ocmVzOiBzdXBlcmFnZW50LlJlc3BvbnNlKTogQXBpUmVzcG9uc2VFcnJvciB7XG4gIGNvbnN0IG1lc3NhZ2UgPSBjcmVhdGVSZXNwb25zZUVycm9yU3RyaW5nKHJlcyk7XG4gIGNvbnN0IHN0YXR1cyA9IHJlcy5zdGF0dXM7XG4gIGNvbnN0IHJlc3VsdCA9IHJlcy5ib2R5IGFzIFJlc3BvbnNlQm9keVR5cGU7XG4gIGNvbnN0IGludmFsaWRUb2tlbiA9IF8uaGFzKHJlcy5oZWFkZXIsICd4LWF1dGgtcmVxdWlyZWQnKSAmJiByZXMuaGVhZGVyWyd4LWF1dGgtcmVxdWlyZWQnXSA9PT0gJ3RydWUnO1xuICBjb25zdCBuZWVkc090cCA9IHJlcy5ib2R5Py5uZWVkc09UUCAhPT0gdW5kZWZpbmVkO1xuICByZXR1cm4gbmV3IEFwaVJlc3BvbnNlRXJyb3IobWVzc2FnZSwgc3RhdHVzLCByZXN1bHQsIGludmFsaWRUb2tlbiwgbmVlZHNPdHApO1xufVxuXG4vKipcbiAqIEhhbmRsZSBhbiBlcnJvciBvciBhbiBlcnJvciBjb250YWluaW5nIGFuIEhUVFAgcmVzcG9uc2UgYW5kIHVzZSBpdCB0byB0aHJvdyBhIHdlbGwtZm9ybWVkIGVycm9yIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlUmVzcG9uc2VFcnJvcihlOiBFcnJvciAmIHsgcmVzcG9uc2U/OiBzdXBlcmFnZW50LlJlc3BvbnNlIH0pOiBuZXZlciB7XG4gIGlmIChlLnJlc3BvbnNlKSB7XG4gICAgdGhyb3cgZXJyRnJvbVJlc3BvbnNlKGUucmVzcG9uc2UpO1xuICB9XG4gIHRocm93IGU7XG59XG5cbi8qKlxuICogVGhlcmUgYXJlIG1hbnkgd2F5cyBhIHJlcXVlc3QgY2FuIGZhaWwsIGFuZCBtYXkgd2F5cyBpbmZvcm1hdGlvbiBvbiB0aGF0IGZhaWx1cmUgY2FuIGJlXG4gKiBjb21tdW5pY2F0ZWQgdG8gdGhlIGNsaWVudC4gVGhpcyBmdW5jdGlvbiB0cmllcyB0byBoYW5kbGUgdGhvc2UgY2FzZXMgYW5kIGNyZWF0ZSBhIHNhbmUgZXJyb3Igc3RyaW5nXG4gKiBAcGFyYW0gcmVzIFJlc3BvbnNlIGZyb20gYW4gSFRUUCByZXF1ZXN0XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlRXJyb3JTdHJpbmcocmVzOiBzdXBlcmFnZW50LlJlc3BvbnNlKTogc3RyaW5nIHtcbiAgbGV0IGVyclN0cmluZyA9IHJlcy5zdGF0dXMudG9TdHJpbmcoKTsgLy8gYXQgdGhlIHZlcnkgbGVhc3Qgd2UnbGwgaGF2ZSB0aGUgc3RhdHVzIGNvZGVcbiAgaWYgKHJlcy5ib2R5Py5lcnJvcikge1xuICAgIC8vIHRoaXMgaXMgdGhlIGNhc2Ugd2UgaG9wZSBmb3IsIHdoZXJlIHRoZSBzZXJ2ZXIgZ2l2ZXMgdXMgYSBuaWNlIGVycm9yIGZyb20gdGhlIEpTT04gYm9keVxuICAgIGVyclN0cmluZyA9IHJlcy5ib2R5LmVycm9yO1xuICB9IGVsc2UgaWYgKHJlcy50ZXh0KSB7XG4gICAgLy8gaWYgdGhlIHJlc3BvbnNlIGNhbWUgYmFjayBhcyB0ZXh0LCB3ZSB0cnkgdG8gcGFyc2UgaXQgYXMgSFRNTCBhbmQgcmVtb3ZlIGFsbCB0YWdzLCBsZWF2aW5nIHVzXG4gICAgLy8ganVzdCB0aGUgYmFyZSB0ZXh0LCB3aGljaCB3ZSB0aGVuIHRyaW0gb2YgZXhjZXNzaXZlIG5ld2xpbmVzIGFuZCBsaW1pdCB0byBhIGNlcnRhaW4gbGVuZ3RoXG4gICAgdHJ5IHtcbiAgICAgIGxldCBzYW5pdGl6ZWRUZXh0ID0gc2FuaXRpemVIdG1sKHJlcy50ZXh0LCB7IGFsbG93ZWRUYWdzOiBbXSB9KTtcbiAgICAgIHNhbml0aXplZFRleHQgPSBzYW5pdGl6ZWRUZXh0LnRyaW0oKTtcbiAgICAgIHNhbml0aXplZFRleHQgPSBlb2wubGYoc2FuaXRpemVkVGV4dCk7IC8vIHVzZSAnXFxuJyBmb3IgYWxsIG5ld2xpbmVzXG4gICAgICBzYW5pdGl6ZWRUZXh0ID0gXy5yZXBsYWNlKHNhbml0aXplZFRleHQsIC9cXG5bIHxcXHRdezEsfVxcbi9nLCAnXFxuXFxuJyk7IC8vIHJlbW92ZSB0aGUgc3BhY2VzL3RhYnMgYmV0d2VlbiBuZXdsaW5lc1xuICAgICAgc2FuaXRpemVkVGV4dCA9IF8ucmVwbGFjZShzYW5pdGl6ZWRUZXh0LCAvW1xcbl17Myx9L2csICdcXG5cXG4nKTsgLy8gaGF2ZSBhdCBtb3N0IDIgY29uc2VjdXRpdmUgbmV3bGluZXNcbiAgICAgIHNhbml0aXplZFRleHQgPSBzYW5pdGl6ZWRUZXh0LnN1YnN0cmluZygwLCA1MDAwKTsgLy8gcHJldmVudCBtZXNzYWdlIGZyb20gZ2V0dGluZyB0b28gbGFyZ2VcbiAgICAgIGVyclN0cmluZyA9IGVyclN0cmluZyArICdcXG4nICsgc2FuaXRpemVkVGV4dDsgLy8gYWRkIGl0IHRvIG91ciBleGlzdGluZyBlcnJTdHJpbmcgKGF0IHRoaXMgcG9pbnQgdGhlIG1vcmUgaW5mbyB0aGUgYmV0dGVyISlcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBkbyBub3RoaW5nLCB0aGUgcmVzcG9uc2UncyBIVE1MIHdhcyB0b28gd2Fja3kgdG8gYmUgcGFyc2VkIGNsZWFubHlcbiAgICAgIGRlYnVnKCdnb3QgZXJyb3Igd2l0aCBtZXNzYWdlIFwiJXNcIiB3aGlsZSBjcmVhdGluZyByZXNwb25zZSBlcnJvciBzdHJpbmcgZnJvbSByZXNwb25zZTogJXMnLCBlLm1lc3NhZ2UsIHJlcy50ZXh0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXJyU3RyaW5nO1xufVxuXG4vKipcbiAqIFNlcmlhbGl6ZSByZXF1ZXN0IGRhdGEgYmFzZWQgb24gdGhlIHJlcXVlc3QgY29udGVudCB0eXBlXG4gKiBOb3RlOiBOb3Qgc3VyZSB0aGlzIGlzIHN0aWxsIG5lZWRlZCBvciBldmVuIHVzZWZ1bC4gQ29uc2lkZXIgcmVtb3ZpbmcuXG4gKiBAcGFyYW0gcmVxXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVSZXF1ZXN0RGF0YShyZXE6IHN1cGVyYWdlbnQuUmVxdWVzdCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGxldCBkYXRhOiBzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IChyZXEgYXMgYW55KS5fZGF0YTtcbiAgaWYgKHR5cGVvZiBkYXRhICE9PSAnc3RyaW5nJykge1xuICAgIGxldCBjb250ZW50VHlwZSA9IHJlcS5nZXQoJ0NvbnRlbnQtVHlwZScpO1xuICAgIC8vIFBhcnNlIG91dCBqdXN0IHRoZSBjb250ZW50IHR5cGUgZnJvbSB0aGUgaGVhZGVyIChpZ25vcmUgdGhlIGNoYXJzZXQpXG4gICAgaWYgKGNvbnRlbnRUeXBlKSB7XG4gICAgICBjb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlLnNwbGl0KCc7JylbMF07XG4gICAgfVxuICAgIGxldCBzZXJpYWxpemUgPSBzdXBlcmFnZW50LnNlcmlhbGl6ZVtjb250ZW50VHlwZV07XG4gICAgaWYgKCFzZXJpYWxpemUgJiYgL1tcXC8rXWpzb25cXGIvLnRlc3QoY29udGVudFR5cGUpKSB7XG4gICAgICBzZXJpYWxpemUgPSBzdXBlcmFnZW50LnNlcmlhbGl6ZVsnYXBwbGljYXRpb24vanNvbiddO1xuICAgIH1cbiAgICBpZiAoc2VyaWFsaXplKSB7XG4gICAgICBkYXRhID0gc2VyaWFsaXplKGRhdGEpO1xuICAgICAgKHJlcSBhcyBhbnkpLl9kYXRhID0gZGF0YTtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFNldCB0aGUgc3VwZXJhZ2VudCBxdWVyeSBzdHJpbmcgY29ycmVjdGx5IGZvciBicm93c2VycyBvciBub2RlLlxuICogQHBhcmFtIHJlcVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0UmVxdWVzdFF1ZXJ5U3RyaW5nKHJlcTogc3VwZXJhZ2VudC5TdXBlckFnZW50UmVxdWVzdCk6IHZvaWQge1xuICBjb25zdCB1cmxEZXRhaWxzID0gdXJsTGliLnBhcnNlKHJlcS51cmwpO1xuXG4gIGxldCBxdWVyeVN0cmluZzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBjb25zdCBxdWVyeTogc3RyaW5nW10gPSAocmVxIGFzIGFueSkuX3F1ZXJ5O1xuICBjb25zdCBxczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IChyZXEgYXMgYW55KS5xcztcbiAgaWYgKHF1ZXJ5ICYmIHF1ZXJ5Lmxlbmd0aCA+IDApIHtcbiAgICAvLyBicm93c2VyIHZlcnNpb25cbiAgICBxdWVyeVN0cmluZyA9IHF1ZXJ5LmpvaW4oJyYnKTtcbiAgICAocmVxIGFzIGFueSkuX3F1ZXJ5ID0gW107XG4gIH0gZWxzZSBpZiAocXMpIHtcbiAgICAvLyBub2RlIHZlcnNpb25cbiAgICBxdWVyeVN0cmluZyA9IHF1ZXJ5c3RyaW5nLnN0cmluZ2lmeShxcyk7XG4gICAgKHJlcSBhcyBhbnkpLnFzID0gbnVsbDtcbiAgfVxuXG4gIGlmIChxdWVyeVN0cmluZykge1xuICAgIGlmICh1cmxEZXRhaWxzLnNlYXJjaCkge1xuICAgICAgdXJsRGV0YWlscy5zZWFyY2ggKz0gJyYnICsgcXVlcnlTdHJpbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVybERldGFpbHMuc2VhcmNoID0gJz8nICsgcXVlcnlTdHJpbmc7XG4gICAgfVxuICAgIHJlcS51cmwgPSB1cmxMaWIuZm9ybWF0KHVybERldGFpbHMpO1xuICB9XG59XG5cbi8qKlxuICogVmVyaWZ5IHRoYXQgdGhlIHJlc3BvbnNlIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlciBpcyBzaWduZWQgY29ycmVjdGx5LlxuICogUmlnaHQgbm93LCBpdCBpcyB2ZXJ5IHBlcm1pc3NpdmUgd2l0aCB0aGUgdGltZXN0YW1wIHZhcmlhbmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmVyaWZ5UmVzcG9uc2UoXG4gIGJpdGdvOiBCaXRHb0FQSSxcbiAgdG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgbWV0aG9kOiBWZXJpZnlSZXNwb25zZU9wdGlvbnNbJ21ldGhvZCddLFxuICByZXE6IHN1cGVyYWdlbnQuU3VwZXJBZ2VudFJlcXVlc3QsXG4gIHJlc3BvbnNlOiBzdXBlcmFnZW50LlJlc3BvbnNlXG4pOiBzdXBlcmFnZW50LlJlc3BvbnNlIHtcbiAgLy8gd2UgY2FuJ3QgdmVyaWZ5IHRoZSByZXNwb25zZSBpZiB3ZSdyZSBub3QgYXV0aGVudGljYXRlZFxuICBpZiAoIXJlcS5pc1YyQXV0aGVudGljYXRlZCB8fCAhcmVxLmF1dGhlbnRpY2F0aW9uVG9rZW4pIHtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICBjb25zdCB2ZXJpZmljYXRpb25SZXNwb25zZSA9IGJpdGdvLnZlcmlmeVJlc3BvbnNlKHtcbiAgICB1cmw6IHJlcS51cmwsXG4gICAgaG1hYzogcmVzcG9uc2UuaGVhZGVyLmhtYWMsXG4gICAgc3RhdHVzQ29kZTogcmVzcG9uc2Uuc3RhdHVzLFxuICAgIHRleHQ6IHJlc3BvbnNlLnRleHQsXG4gICAgdGltZXN0YW1wOiByZXNwb25zZS5oZWFkZXIudGltZXN0YW1wLFxuICAgIHRva2VuOiByZXEuYXV0aGVudGljYXRpb25Ub2tlbixcbiAgICBtZXRob2QsXG4gIH0pO1xuXG4gIGlmICghdmVyaWZpY2F0aW9uUmVzcG9uc2UuaXNWYWxpZCkge1xuICAgIC8vIGNhbGN1bGF0ZSB0aGUgSE1BQ1xuICAgIGNvbnN0IHJlY2VpdmVkSG1hYyA9IHJlc3BvbnNlLmhlYWRlci5obWFjO1xuICAgIGNvbnN0IGV4cGVjdGVkSG1hYyA9IHZlcmlmaWNhdGlvblJlc3BvbnNlLmV4cGVjdGVkSG1hYztcbiAgICBjb25zdCBzaWduYXR1cmVTdWJqZWN0ID0gdmVyaWZpY2F0aW9uUmVzcG9uc2Uuc2lnbmF0dXJlU3ViamVjdDtcbiAgICAvLyBMb2cgb25seSB0aGUgZmlyc3QgMTAgY2hhcmFjdGVycyBvZiB0aGUgdG9rZW4gdG8gZW5zdXJlIHRoZSBmdWxsIHRva2VuIGlzbid0IGxvZ2dlZC5cbiAgICBjb25zdCBwYXJ0aWFsQml0Z29Ub2tlbiA9IHRva2VuID8gdG9rZW4uc3Vic3RyaW5nKDAsIDEwKSA6ICcnO1xuICAgIGNvbnN0IGVycm9yRGV0YWlscyA9IHtcbiAgICAgIGV4cGVjdGVkSG1hYyxcbiAgICAgIHJlY2VpdmVkSG1hYyxcbiAgICAgIGhtYWNJbnB1dDogc2lnbmF0dXJlU3ViamVjdCxcbiAgICAgIHJlcXVlc3RUb2tlbjogcmVxLmF1dGhlbnRpY2F0aW9uVG9rZW4sXG4gICAgICBiaXRnb1Rva2VuOiBwYXJ0aWFsQml0Z29Ub2tlbixcbiAgICB9O1xuICAgIGRlYnVnKCdJbnZhbGlkIHJlc3BvbnNlIEhNQUM6ICVPJywgZXJyb3JEZXRhaWxzKTtcbiAgICB0aHJvdyBuZXcgQXBpUmVzcG9uc2VFcnJvcignaW52YWxpZCByZXNwb25zZSBITUFDLCBwb3NzaWJsZSBtYW4taW4tdGhlLW1pZGRsZS1hdHRhY2snLCA1MTEsIGVycm9yRGV0YWlscyk7XG4gIH1cblxuICBpZiAoYml0Z28uZ2V0QXV0aFZlcnNpb24oKSA9PT0gMyAmJiAhdmVyaWZpY2F0aW9uUmVzcG9uc2UuaXNJblJlc3BvbnNlVmFsaWRpdHlXaW5kb3cpIHtcbiAgICBjb25zdCBlcnJvckRldGFpbHMgPSB7XG4gICAgICB0aW1lc3RhbXA6IHJlc3BvbnNlLmhlYWRlci50aW1lc3RhbXAsXG4gICAgICB2ZXJpZmljYXRpb25UaW1lOiB2ZXJpZmljYXRpb25SZXNwb25zZS52ZXJpZmljYXRpb25UaW1lLFxuICAgIH07XG4gICAgZGVidWcoJ1NlcnZlciByZXNwb25zZSBvdXRzaWRlIHJlc3BvbnNlIHZhbGlkaXR5IHRpbWUgd2luZG93OiAlTycsIGVycm9yRGV0YWlscyk7XG4gICAgdGhyb3cgbmV3IEFwaVJlc3BvbnNlRXJyb3IoXG4gICAgICAnc2VydmVyIHJlc3BvbnNlIG91dHNpZGUgcmVzcG9uc2UgdmFsaWRpdHkgdGltZSB3aW5kb3csIHBvc3NpYmxlIG1hbi1pbi10aGUtbWlkZGxlLWF0dGFjaycsXG4gICAgICA1MTEsXG4gICAgICBlcnJvckRldGFpbHNcbiAgICApO1xuICB9XG4gIHJldHVybiByZXNwb25zZTtcbn1cbiJdfQ==
288
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQTZCQSx3Q0FXQztBQU9ELG9EQWVDO0FBMEJELGtEQUtDO0FBZ0RELG9EQStEQztBQU1ELHNEQXdCQztBQXlDRCx3Q0F5QkM7QUFFRCxrREF5QkM7QUF2VUQ7O0dBRUc7QUFDSCxrREFBMEI7QUFDMUIsOENBQXNCO0FBQ3RCLG9EQUF1QjtBQUN2QixrRUFBeUM7QUFDekMsNERBQW9DO0FBQ3BDLDhDQUF5QjtBQUN6Qiw4REFBc0M7QUFFdEMsbURBQXNFO0FBS3RFLE1BQU0sS0FBSyxHQUFHLElBQUEsZUFBSyxFQUFDLFdBQVcsQ0FBQyxDQUFDO0FBRWpDOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFnQixjQUFjLENBQzVCLEdBQWlDO0lBRWpDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7UUFDeEIsTUFBTSxDQUFDLGFBQXNCO1lBQzNCLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FDYixDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsb0JBQW9CLENBQXFCLGFBQWEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUMvRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQ3RDLENBQUM7UUFDSixDQUFDO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQixvQkFBb0IsQ0FDbEMsYUFBc0I7SUFFdEIsT0FBTyxVQUFVLEdBQXdCO1FBQ3ZDLElBQUksZ0JBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUM7WUFDcEUsT0FBTztZQUNMLDBGQUEwRjtZQUMxRixnSEFBZ0g7WUFDaEgsQ0FBQyxhQUFhLElB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QUFFLEdBQUcsQ0FBQyxtQkFBbUI7UUFDOUIsTUFBTTtRQUNOLFdBQVc7S0FDWixDQUFDLENBQUM7SUFFSCwwQkFBMEIsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztJQUM5RSxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqL1xuaW1wb3J0IERlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCBlb2wgZnJvbSAnZW9sJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgc2FuaXRpemVIdG1sIGZyb20gJ3Nhbml0aXplLWh0bWwnO1xuaW1wb3J0IHN1cGVyYWdlbnQgZnJvbSAnc3VwZXJhZ2VudCc7XG5pbXBvcnQgdXJsTGliIGZyb20gJ3VybCc7XG5pbXBvcnQgcXVlcnlzdHJpbmcgZnJvbSAncXVlcnlzdHJpbmcnO1xuXG5pbXBvcnQgeyBBcGlSZXNwb25zZUVycm9yLCBCaXRHb1JlcXVlc3QgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5cbmltcG9ydCB7IEF1dGhWZXJzaW9uLCBWZXJpZnlSZXNwb25zZUluZm8sIFZlcmlmeVJlc3BvbnNlT3B0aW9ucyB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgQml0R29BUEkgfSBmcm9tICcuL2JpdGdvQVBJJztcblxuY29uc3QgZGVidWcgPSBEZWJ1ZygnYml0Z286YXBpJyk7XG5cbi8qKlxuICogQWRkIHRoZSBiaXRnby1zcGVjaWZpYyByZXN1bHQoKSBmdW5jdGlvbiBvbiBhIHN1cGVyYWdlbnQgcmVxdWVzdC5cbiAqXG4gKiBJZiB0aGUgc2VydmVyIHJlc3BvbnNlIGlzIHN1Y2Nlc3NmdWwsIHRoZSBgcmVzdWx0KClgIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGVpdGhlciB0aGUgZW50aXJlIHJlc3BvbnNlIGJvZHksXG4gKiBvciB0aGUgZmllbGQgZnJvbSB0aGUgcmVzcG9uc2UgYm9keSBzcGVjaWZpZWQgYnkgdGhlIGBvcHRpb25hbEZpZWxkYCBwYXJhbWV0ZXIgaWYgaXQgaXMgcHJvdmlkZWQuXG4gKlxuICogSWYgdGhlIHNlcnZlciByZXNwb25zZSB3aXRoIGFuIGVycm9yLCBgcmVzdWx0KClgIHdpbGwgaGFuZGxlIEhUVFAgZXJyb3JzIGFwcHJvcHJpYXRlbHkgYnlcbiAqIHJldGhyb3dpbmcgdGhlbSBhcyBhbiBgQXBpUmVzcG9uc2VFcnJvcmAgaWYgcG9zc2libGUsIGFuZCBvdGhlcndpc2UgcmV0aHJvd2luZyB0aGUgdW5kZXJseWluZyByZXNwb25zZSBlcnJvci5cbiAqXG4gKiBAcGFyYW0gcmVxXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0JpdGdvUmVxdWVzdDxSZXNwb25zZVJlc3VsdFR5cGUgPSBhbnk+KFxuICByZXE6IHN1cGVyYWdlbnQuU3VwZXJBZ2VudFJlcXVlc3Rcbik6IEJpdEdvUmVxdWVzdDxSZXNwb25zZVJlc3VsdFR5cGU+IHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24ocmVxLCB7XG4gICAgcmVzdWx0KG9wdGlvbmFsRmllbGQ/OiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiByZXEudGhlbihcbiAgICAgICAgKHJlc3BvbnNlKSA9PiBoYW5kbGVSZXNwb25zZVJlc3VsdDxSZXNwb25zZVJlc3VsdFR5cGU+KG9wdGlvbmFsRmllbGQpKHJlc3BvbnNlKSxcbiAgICAgICAgKGVycm9yKSA9PiBoYW5kbGVSZXNwb25zZUVycm9yKGVycm9yKVxuICAgICAgKTtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gYSBmdW5jdGlvbiB3aGljaCBleHRyYWN0cyB0aGUgc3BlY2lmaWVkIHJlc3BvbnNlIGJvZHkgcHJvcGVydHkgZnJvbSB0aGUgcmVzcG9uc2UgaWYgc3VjY2Vzc2Z1bCxcbiAqIG90aGVyd2lzZSB0aHJvdyBhbiBgQXBpRXJyb3JSZXNwb25zZWAgcGFyc2VkIGZyb20gdGhlIHJlc3BvbnNlIGJvZHkuXG4gKiBAcGFyYW0gb3B0aW9uYWxGaWVsZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlUmVzcG9uc2VSZXN1bHQ8UmVzcG9uc2VSZXN1bHRUeXBlPihcbiAgb3B0aW9uYWxGaWVsZD86IHN0cmluZ1xuKTogKHJlczogc3VwZXJhZ2VudC5SZXNwb25zZSkgPT4gUmVzcG9uc2VSZXN1bHRUeXBlIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChyZXM6IHN1cGVyYWdlbnQuUmVzcG9uc2UpOiBSZXNwb25zZVJlc3VsdFR5cGUge1xuICAgIGlmIChfLmlzTnVtYmVyKHJlcy5zdGF0dXMpICYmIHJlcy5zdGF0dXMgPj0gMjAwICYmIHJlcy5zdGF0dXMgPCAzMDApIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIC8vIElmIHRoZXJlJ3MgYW4gb3B0aW9uYWwgZmllbGQgYW5kIHRoZSBib2R5IGlzIG5vbi1udWxsaXNoIHdpdGggdGhhdCBwcm9wZXJ0eSwgcmV0dXJuIGl0O1xuICAgICAgICAvLyBvdGhlcndpc2UgcmV0dXJuIHRoZSBib2R5IGlmIGF2YWlsYWJsZTsgaWYgbm90LCByZXR1cm4gdGhlIHRleHQ7IGFuZCBmaW5hbGx5IGZhbGxiYWNrIHRvIHRoZSBlbnRpcmUgcmVzcG9uc2UuXG4gICAgICAgIChvcHRpb25hbEZpZWxkICYmIHJlcy5ib2R5ICYmIHJlcy5ib2R5W29wdGlvbmFsRmllbGRdICE9PSB1bmRlZmluZWQgPyByZXMuYm9keVtvcHRpb25hbEZpZWxkXSA6IHJlcy5ib2R5KSA/P1xuICAgICAgICByZXMudGV4dCA/P1xuICAgICAgICByZXNcbiAgICAgICk7XG4gICAgfVxuICAgIHRocm93IGVyckZyb21SZXNwb25zZShyZXMpO1xuICB9O1xufVxuXG4vKipcbiAqIEV4dHJhY3QgcmVsZXZhbnQgaW5mb3JtYXRpb24gZnJvbSBhIHN1Y2Nlc3NmdWwgcmVzcG9uc2UgKHRoYXQgaXMsIGEgcmVzcG9uc2Ugd2l0aCBhbiBIVFRQIHN0YXR1cyBjb2RlXG4gKiBiZXR3ZWVuIDIwMCBhbmQgMjk5KSwgYnV0IHdoaWNoIHJlc3VsdGVkIGluIGFuIGFwcGxpY2F0aW9uIHNwZWNpZmljIGVycm9yIGFuZCB1c2UgaXQgdG8gY29uc3RydWN0IGFuZFxuICogdGhyb3cgYW4gYEFwaUVycm9yUmVzcG9uc2VgLlxuICpcbiAqIEBwYXJhbSByZXNcbiAqL1xuZnVuY3Rpb24gZXJyRnJvbVJlc3BvbnNlPFJlc3BvbnNlQm9keVR5cGU+KHJlczogc3VwZXJhZ2VudC5SZXNwb25zZSk6IEFwaVJlc3BvbnNlRXJyb3Ige1xuICBjb25zdCBtZXNzYWdlID0gY3JlYXRlUmVzcG9uc2VFcnJvclN0cmluZyhyZXMpO1xuICBjb25zdCBzdGF0dXMgPSByZXMuc3RhdHVzO1xuICBjb25zdCByZXN1bHQgPSByZXMuYm9keSBhcyBSZXNwb25zZUJvZHlUeXBlO1xuICBjb25zdCBpbnZhbGlkVG9rZW4gPSBfLmhhcyhyZXMuaGVhZGVyLCAneC1hdXRoLXJlcXVpcmVkJykgJiYgcmVzLmhlYWRlclsneC1hdXRoLXJlcXVpcmVkJ10gPT09ICd0cnVlJztcbiAgY29uc3QgbmVlZHNPdHAgPSByZXMuYm9keT8ubmVlZHNPVFAgIT09IHVuZGVmaW5lZDtcbiAgLy8gU2VydmVyIGVjaG9lcyB0aGUgY2xpZW50J3MgYFJlcXVlc3QtSURgIGhlYWRlciAob3Igb25lIGl0IGdlbmVyYXRlZCkgYmFjayBvbiBldmVyeVxuICAvLyByZXNwb25zZSwgaW5jbHVkaW5nIGVycm9ycyDigJQgc3VyZmFjZSBpdCBzbyBmYWlsdXJlcyBjYW4gYmUgY29ycmVsYXRlZCB3aXRoIHNlcnZlciBsb2dzLlxuICBjb25zdCByZXF1ZXN0SWQgPSByZXMuaGVhZGVyPy5bJ3JlcXVlc3QtaWQnXTtcbiAgcmV0dXJuIG5ldyBBcGlSZXNwb25zZUVycm9yKG1lc3NhZ2UsIHN0YXR1cywgcmVzdWx0LCBpbnZhbGlkVG9rZW4sIG5lZWRzT3RwLCByZXF1ZXN0SWQpO1xufVxuXG4vKipcbiAqIEhhbmRsZSBhbiBlcnJvciBvciBhbiBlcnJvciBjb250YWluaW5nIGFuIEhUVFAgcmVzcG9uc2UgYW5kIHVzZSBpdCB0byB0aHJvdyBhIHdlbGwtZm9ybWVkIGVycm9yIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlUmVzcG9uc2VFcnJvcihlOiBFcnJvciAmIHsgcmVzcG9uc2U/OiBzdXBlcmFnZW50LlJlc3BvbnNlIH0pOiBuZXZlciB7XG4gIGlmIChlLnJlc3BvbnNlKSB7XG4gICAgdGhyb3cgZXJyRnJvbVJlc3BvbnNlKGUucmVzcG9uc2UpO1xuICB9XG4gIHRocm93IGU7XG59XG5cbi8qKlxuICogVGhlcmUgYXJlIG1hbnkgd2F5cyBhIHJlcXVlc3QgY2FuIGZhaWwsIGFuZCBtYXkgd2F5cyBpbmZvcm1hdGlvbiBvbiB0aGF0IGZhaWx1cmUgY2FuIGJlXG4gKiBjb21tdW5pY2F0ZWQgdG8gdGhlIGNsaWVudC4gVGhpcyBmdW5jdGlvbiB0cmllcyB0byBoYW5kbGUgdGhvc2UgY2FzZXMgYW5kIGNyZWF0ZSBhIHNhbmUgZXJyb3Igc3RyaW5nXG4gKiBAcGFyYW0gcmVzIFJlc3BvbnNlIGZyb20gYW4gSFRUUCByZXF1ZXN0XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlRXJyb3JTdHJpbmcocmVzOiBzdXBlcmFnZW50LlJlc3BvbnNlKTogc3RyaW5nIHtcbiAgbGV0IGVyclN0cmluZyA9IHJlcy5zdGF0dXMudG9TdHJpbmcoKTsgLy8gYXQgdGhlIHZlcnkgbGVhc3Qgd2UnbGwgaGF2ZSB0aGUgc3RhdHVzIGNvZGVcbiAgaWYgKHJlcy5ib2R5Py5lcnJvcikge1xuICAgIC8vIHRoaXMgaXMgdGhlIGNhc2Ugd2UgaG9wZSBmb3IsIHdoZXJlIHRoZSBzZXJ2ZXIgZ2l2ZXMgdXMgYSBuaWNlIGVycm9yIGZyb20gdGhlIEpTT04gYm9keVxuICAgIGVyclN0cmluZyA9IHJlcy5ib2R5LmVycm9yO1xuICB9IGVsc2UgaWYgKHJlcy50ZXh0KSB7XG4gICAgLy8gaWYgdGhlIHJlc3BvbnNlIGNhbWUgYmFjayBhcyB0ZXh0LCB3ZSB0cnkgdG8gcGFyc2UgaXQgYXMgSFRNTCBhbmQgcmVtb3ZlIGFsbCB0YWdzLCBsZWF2aW5nIHVzXG4gICAgLy8ganVzdCB0aGUgYmFyZSB0ZXh0LCB3aGljaCB3ZSB0aGVuIHRyaW0gb2YgZXhjZXNzaXZlIG5ld2xpbmVzIGFuZCBsaW1pdCB0byBhIGNlcnRhaW4gbGVuZ3RoXG4gICAgdHJ5IHtcbiAgICAgIGxldCBzYW5pdGl6ZWRUZXh0ID0gc2FuaXRpemVIdG1sKHJlcy50ZXh0LCB7IGFsbG93ZWRUYWdzOiBbXSB9KTtcbiAgICAgIHNhbml0aXplZFRleHQgPSBzYW5pdGl6ZWRUZXh0LnRyaW0oKTtcbiAgICAgIHNhbml0aXplZFRleHQgPSBlb2wubGYoc2FuaXRpemVkVGV4dCk7IC8vIHVzZSAnXFxuJyBmb3IgYWxsIG5ld2xpbmVzXG4gICAgICBzYW5pdGl6ZWRUZXh0ID0gXy5yZXBsYWNlKHNhbml0aXplZFRleHQsIC9cXG5bIHxcXHRdezEsfVxcbi9nLCAnXFxuXFxuJyk7IC8vIHJlbW92ZSB0aGUgc3BhY2VzL3RhYnMgYmV0d2VlbiBuZXdsaW5lc1xuICAgICAgc2FuaXRpemVkVGV4dCA9IF8ucmVwbGFjZShzYW5pdGl6ZWRUZXh0LCAvW1xcbl17Myx9L2csICdcXG5cXG4nKTsgLy8gaGF2ZSBhdCBtb3N0IDIgY29uc2VjdXRpdmUgbmV3bGluZXNcbiAgICAgIHNhbml0aXplZFRleHQgPSBzYW5pdGl6ZWRUZXh0LnN1YnN0cmluZygwLCA1MDAwKTsgLy8gcHJldmVudCBtZXNzYWdlIGZyb20gZ2V0dGluZyB0b28gbGFyZ2VcbiAgICAgIGVyclN0cmluZyA9IGVyclN0cmluZyArICdcXG4nICsgc2FuaXRpemVkVGV4dDsgLy8gYWRkIGl0IHRvIG91ciBleGlzdGluZyBlcnJTdHJpbmcgKGF0IHRoaXMgcG9pbnQgdGhlIG1vcmUgaW5mbyB0aGUgYmV0dGVyISlcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBkbyBub3RoaW5nLCB0aGUgcmVzcG9uc2UncyBIVE1MIHdhcyB0b28gd2Fja3kgdG8gYmUgcGFyc2VkIGNsZWFubHlcbiAgICAgIGRlYnVnKCdnb3QgZXJyb3Igd2l0aCBtZXNzYWdlIFwiJXNcIiB3aGlsZSBjcmVhdGluZyByZXNwb25zZSBlcnJvciBzdHJpbmcgZnJvbSByZXNwb25zZTogJXMnLCBlLm1lc3NhZ2UsIHJlcy50ZXh0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXJyU3RyaW5nO1xufVxuXG4vKipcbiAqIFNlcmlhbGl6ZSByZXF1ZXN0IGRhdGEgYmFzZWQgb24gdGhlIHJlcXVlc3QgY29udGVudCB0eXBlLlxuICpcbiAqIE11bHRpcGFydCByZXF1ZXN0cyAoYnVpbHQgd2l0aCBzdXBlcmFnZW50J3MgYC5maWVsZCgpYC9gLmF0dGFjaCgpYCkgcG9wdWxhdGVcbiAqIGByZXEuX2Zvcm1EYXRhYCByYXRoZXIgdGhhbiBgcmVxLl9kYXRhYC4gRm9yIHRob3NlLCByZXR1cm4gdGhlIGZpbmFsIG11bHRpcGFydFxuICogYm9keSBhcyBhIEJ1ZmZlciBzbyB0aGUgSE1BQyBpcyBjb21wdXRlZCBvdmVyIHRoZSBleGFjdCBieXRlcyBzdXBlcmFnZW50IHdpbGxcbiAqIHRyYW5zbWl0LiBgQnVmZmVyI3RvU3RyaW5nKCd1dGY4JylgIG11c3QgTk9UIGJlIHVzZWQgaGVyZTogcmF3IGZpbGUgY29udGVudFxuICogKGUuZy4gSlBFRyBieXRlcykgY29udGFpbnMgaW52YWxpZCBVVEYtOCBzZXF1ZW5jZXMgdGhhdCB3b3VsZCBiZSByZXBsYWNlZCB3aXRoXG4gKiBVK0ZGRkQgYW5kIGNvcnJ1cHQgdGhlIGhhc2guXG4gKlxuICogT3RoZXJ3aXNlOlxuICogSWYgZGF0YSBpcyBhbHJlYWR5IGEgc3RyaW5nLCByZXR1cm5zIGl0IGFzLWlzIHRvIHByZXNlcnZlIGV4YWN0IGJ5dGVzIGZvciBITUFDLlxuICogSWYgZGF0YSBpcyBhIEJ1ZmZlciwgY29udmVydHMgdG8gVVRGLTggc3RyaW5nLlxuICogSWYgZGF0YSBpcyBhbiBvYmplY3QsIHNlcmlhbGl6ZXMgaXQgYmFzZWQgb24gQ29udGVudC1UeXBlLlxuICogQHBhcmFtIHJlcVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplUmVxdWVzdERhdGEocmVxOiBzdXBlcmFnZW50LlJlcXVlc3QpOiBzdHJpbmcgfCBCdWZmZXIgfCB1bmRlZmluZWQge1xuICAvLyBgX2Zvcm1EYXRhYCBpcyBjcmVhdGVkIGxhemlseSBieSBzdXBlcmFnZW50J3MgYC5maWVsZCgpYC9gLmF0dGFjaCgpYCBhbmQgaXMgYW5cbiAgLy8gaW5zdGFuY2Ugb2YgdGhlIGBmb3JtLWRhdGFgIHBhY2thZ2UncyBGb3JtRGF0YSwgd2hpY2ggZXhwb3NlcyBhIHN5bmNocm9ub3VzXG4gIC8vIGBnZXRCdWZmZXIoKWAgcmV0dXJuaW5nIHRoZSBleGFjdCBtdWx0aXBhcnQgYm9keSAoYm91bmRhcnkgKyBjb250ZW50KSBhcyBhXG4gIC8vIEJ1ZmZlci4gVGhpcyBydW5zIGFmdGVyIGFsbCBgLmF0dGFjaCgpYC9gLmZpZWxkKClgIGNhbGxzIChzZWUgcmVxdWVzdFBhdGNoKS5cbiAgY29uc3QgZm9ybURhdGEgPSAocmVxIGFzIHsgX2Zvcm1EYXRhPzogeyBnZXRCdWZmZXI/OiAoKSA9PiBCdWZmZXIgfSB9KS5fZm9ybURhdGE7XG4gIGlmIChmb3JtRGF0YSAmJiB0eXBlb2YgZm9ybURhdGEuZ2V0QnVmZmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZvcm1EYXRhLmdldEJ1ZmZlcigpO1xuICB9XG5cbiAgY29uc3QgZGF0YTogc3RyaW5nIHwgQnVmZmVyIHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQgPSAocmVxIGFzIGFueSkuX2RhdGE7XG5cbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihkYXRhKSkge1xuICAgIC8vIENvbnZlcnQgQnVmZmVyIHRvIFVURi04IHN0cmluZyBhbmQgbXV0YXRlIF9kYXRhIHRvIGVuc3VyZSBjb25zaXN0ZW5jeS5cbiAgICAvLyBUaGlzIGlzIGNyaXRpY2FsOiBpZiBfZGF0YSBzdGF5cyBhcyBhIEJ1ZmZlciwgc3VwZXJhZ2VudCB3aWxsIHNlcmlhbGl6ZSBpdFxuICAgIC8vIGFzIEpTT04gKHtcInR5cGVcIjpcIkJ1ZmZlclwiLFwiZGF0YVwiOlsuLi5dfSksIHdoaWNoIHdvbid0IG1hdGNoIHRoZSBITUFDLlxuICAgIC8vIEJ5IG11dGF0aW5nIHRvIHN0cmluZywgc3VwZXJhZ2VudCBzZW5kcyB0aGUgZXhhY3QgYnl0ZXMgd2UgaGFzaC5cbiAgICAvLyBUaGlzIGlzIHNhZmUgZm9yIHJldHJpZXM6IGNhbGxpbmcgYWdhaW4gd2l0aCBhIHN0cmluZyB3aWxsIGhpdCB0aGUgZWFybHkgcmV0dXJuIGFib3ZlLlxuICAgIGNvbnN0IHN0cmluZ0RhdGEgPSBkYXRhLnRvU3RyaW5nKCd1dGY4Jyk7XG4gICAgKHJlcSBhcyBhbnkpLl9kYXRhID0gc3RyaW5nRGF0YTtcbiAgICByZXR1cm4gc3RyaW5nRGF0YTtcbiAgfVxuXG4gIGlmIChkYXRhID09PSB1bmRlZmluZWQgfHwgZGF0YSA9PT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyBTZXJpYWxpemUgb2JqZWN0IGRhdGEgYmFzZWQgb24gQ29udGVudC1UeXBlXG4gIGxldCBjb250ZW50VHlwZSA9IHJlcS5nZXQoJ0NvbnRlbnQtVHlwZScpO1xuICAvLyBQYXJzZSBvdXQganVzdCB0aGUgY29udGVudCB0eXBlIGZyb20gdGhlIGhlYWRlciAoaWdub3JlIHRoZSBjaGFyc2V0KVxuICBpZiAoY29udGVudFR5cGUpIHtcbiAgICBjb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlLnNwbGl0KCc7JylbMF0udHJpbSgpO1xuICB9XG4gIGxldCBzZXJpYWxpemU6ICgoYm9keTogdW5rbm93bikgPT4gc3RyaW5nKSB8IHVuZGVmaW5lZDtcbiAgY29uc3Qgc2VyaWFsaXplcnMgPSBzdXBlcmFnZW50LnNlcmlhbGl6ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgaWYgKGNvbnRlbnRUeXBlKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXJpYWxpemVycywgY29udGVudFR5cGUpKSB7XG4gICAgICBjb25zdCBjYW5kaWRhdGUgPSBzZXJpYWxpemVyc1tjb250ZW50VHlwZV07XG4gICAgICBpZiAodHlwZW9mIGNhbmRpZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBzZXJpYWxpemUgPSBjYW5kaWRhdGUgYXMgKGJvZHk6IHVua25vd24pID0+IHN0cmluZztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKC9bXFwvK11qc29uXFxiLy50ZXN0KGNvbnRlbnRUeXBlKSkge1xuICAgICAgLy8gRmFsbCBiYWNrIHRvIHRoZSBidWlsdC1pbiBKU09OIHNlcmlhbGl6ZXIgZm9yIEpTT04tbGlrZSBjb250ZW50IHR5cGVzXG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNlcmlhbGl6ZXJzLCAnYXBwbGljYXRpb24vanNvbicpKSB7XG4gICAgICAgIGNvbnN0IGpzb25TZXJpYWxpemVyID0gc2VyaWFsaXplcnNbJ2FwcGxpY2F0aW9uL2pzb24nXTtcbiAgICAgICAgaWYgKHR5cGVvZiBqc29uU2VyaWFsaXplciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHNlcmlhbGl6ZSA9IGpzb25TZXJpYWxpemVyIGFzIChib2R5OiB1bmtub3duKSA9PiBzdHJpbmc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoc2VyaWFsaXplKSB7XG4gICAgY29uc3Qgc2VyaWFsaXplZCA9IHNlcmlhbGl6ZShkYXRhKTtcbiAgICAocmVxIGFzIGFueSkuX2RhdGEgPSBzZXJpYWxpemVkO1xuICAgIHJldHVybiBzZXJpYWxpemVkO1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIHN1cGVyYWdlbnQgcXVlcnkgc3RyaW5nIGNvcnJlY3RseSBmb3IgYnJvd3NlcnMgb3Igbm9kZS5cbiAqIEBwYXJhbSByZXFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFJlcXVlc3RRdWVyeVN0cmluZyhyZXE6IHN1cGVyYWdlbnQuU3VwZXJBZ2VudFJlcXVlc3QpOiB2b2lkIHtcbiAgY29uc3QgdXJsRGV0YWlscyA9IHVybExpYi5wYXJzZShyZXEudXJsKTtcblxuICBsZXQgcXVlcnlTdHJpbmc6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgY29uc3QgcXVlcnk6IHN0cmluZ1tdID0gKHJlcSBhcyBhbnkpLl9xdWVyeTtcbiAgY29uc3QgcXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSAocmVxIGFzIGFueSkucXM7XG4gIGlmIChxdWVyeSAmJiBxdWVyeS5sZW5ndGggPiAwKSB7XG4gICAgLy8gYnJvd3NlciB2ZXJzaW9uXG4gICAgcXVlcnlTdHJpbmcgPSBxdWVyeS5qb2luKCcmJyk7XG4gICAgKHJlcSBhcyBhbnkpLl9xdWVyeSA9IFtdO1xuICB9IGVsc2UgaWYgKHFzKSB7XG4gICAgLy8gbm9kZSB2ZXJzaW9uXG4gICAgcXVlcnlTdHJpbmcgPSBxdWVyeXN0cmluZy5zdHJpbmdpZnkocXMpO1xuICAgIChyZXEgYXMgYW55KS5xcyA9IG51bGw7XG4gIH1cblxuICBpZiAocXVlcnlTdHJpbmcpIHtcbiAgICBpZiAodXJsRGV0YWlscy5zZWFyY2gpIHtcbiAgICAgIHVybERldGFpbHMuc2VhcmNoICs9ICcmJyArIHF1ZXJ5U3RyaW5nO1xuICAgIH0gZWxzZSB7XG4gICAgICB1cmxEZXRhaWxzLnNlYXJjaCA9ICc/JyArIHF1ZXJ5U3RyaW5nO1xuICAgIH1cbiAgICByZXEudXJsID0gdXJsTGliLmZvcm1hdCh1cmxEZXRhaWxzKTtcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIGEgY29tcGxldGVkIHZlcmlmaWNhdGlvbiByZXNwb25zZSBhbmQgdGhyb3cgYSBkZXNjcmlwdGl2ZSBgQXBpUmVzcG9uc2VFcnJvcmAgaWYgaXRcbiAqIGluZGljYXRlcyB0aGUgcmVzcG9uc2UgaXMgaW52YWxpZCBvciBvdXRzaWRlIHRoZSBhY2NlcHRhYmxlIHRpbWUgd2luZG93LlxuICovXG5mdW5jdGlvbiBhc3NlcnRWZXJpZmljYXRpb25SZXNwb25zZShcbiAgYml0Z286IEJpdEdvQVBJLFxuICB0b2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICByZXE6IHN1cGVyYWdlbnQuU3VwZXJBZ2VudFJlcXVlc3QsXG4gIHJlc3BvbnNlOiBzdXBlcmFnZW50LlJlc3BvbnNlLFxuICB2ZXJpZmljYXRpb25SZXNwb25zZTogVmVyaWZ5UmVzcG9uc2VJbmZvXG4pOiB2b2lkIHtcbiAgaWYgKCF2ZXJpZmljYXRpb25SZXNwb25zZS5pc1ZhbGlkKSB7XG4gICAgLy8gTG9nIG9ubHkgdGhlIGZpcnN0IDEwIGNoYXJhY3RlcnMgb2YgdGhlIHRva2VuIHRvIGVuc3VyZSB0aGUgZnVsbCB0b2tlbiBpc24ndCBsb2dnZWQuXG4gICAgY29uc3QgcGFydGlhbEJpdGdvVG9rZW4gPSB0b2tlbiA/IHRva2VuLnN1YnN0cmluZygwLCAxMCkgOiAnJztcbiAgICBjb25zdCBlcnJvckRldGFpbHMgPSB7XG4gICAgICBleHBlY3RlZEhtYWM6IHZlcmlmaWNhdGlvblJlc3BvbnNlLmV4cGVjdGVkSG1hYyxcbiAgICAgIHJlY2VpdmVkSG1hYzogcmVzcG9uc2UuaGVhZGVyLmhtYWMsXG4gICAgICBobWFjSW5wdXQ6IHZlcmlmaWNhdGlvblJlc3BvbnNlLnNpZ25hdHVyZVN1YmplY3QsXG4gICAgICByZXF1ZXN0VG9rZW46IHJlcS5hdXRoZW50aWNhdGlvblRva2VuLFxuICAgICAgYml0Z29Ub2tlbjogcGFydGlhbEJpdGdvVG9rZW4sXG4gICAgfTtcbiAgICBkZWJ1ZygnSW52YWxpZCByZXNwb25zZSBITUFDOiAlTycsIGVycm9yRGV0YWlscyk7XG4gICAgdGhyb3cgbmV3IEFwaVJlc3BvbnNlRXJyb3IoJ2ludmFsaWQgcmVzcG9uc2UgSE1BQycsIDUxMSwgZXJyb3JEZXRhaWxzKTtcbiAgfVxuXG4gIGlmIChiaXRnby5nZXRBdXRoVmVyc2lvbigpID09PSAzICYmICF2ZXJpZmljYXRpb25SZXNwb25zZS5pc0luUmVzcG9uc2VWYWxpZGl0eVdpbmRvdykge1xuICAgIGNvbnN0IGVycm9yRGV0YWlscyA9IHtcbiAgICAgIHRpbWVzdGFtcDogcmVzcG9uc2UuaGVhZGVyLnRpbWVzdGFtcCxcbiAgICAgIHZlcmlmaWNhdGlvblRpbWU6IHZlcmlmaWNhdGlvblJlc3BvbnNlLnZlcmlmaWNhdGlvblRpbWUsXG4gICAgfTtcbiAgICBkZWJ1ZygnU2VydmVyIHJlc3BvbnNlIG91dHNpZGUgcmVzcG9uc2UgdmFsaWRpdHkgdGltZSB3aW5kb3c6ICVPJywgZXJyb3JEZXRhaWxzKTtcbiAgICB0aHJvdyBuZXcgQXBpUmVzcG9uc2VFcnJvcignc2VydmVyIHJlc3BvbnNlIG91dHNpZGUgcmVzcG9uc2UgdmFsaWRpdHkgdGltZSB3aW5kb3cnLCA1MTEsIGVycm9yRGV0YWlscyk7XG4gIH1cbn1cblxuLyoqXG4gKiBWZXJpZnkgdGhhdCB0aGUgcmVzcG9uc2UgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyIGlzIHNpZ25lZCBjb3JyZWN0bHkuXG4gKiBSaWdodCBub3csIGl0IGlzIHZlcnkgcGVybWlzc2l2ZSB3aXRoIHRoZSB0aW1lc3RhbXAgdmFyaWFuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZXJpZnlSZXNwb25zZShcbiAgYml0Z286IEJpdEdvQVBJLFxuICB0b2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBtZXRob2Q6IFZlcmlmeVJlc3BvbnNlT3B0aW9uc1snbWV0aG9kJ10sXG4gIHJlcTogc3VwZXJhZ2VudC5TdXBlckFnZW50UmVxdWVzdCxcbiAgcmVzcG9uc2U6IHN1cGVyYWdlbnQuUmVzcG9uc2UsXG4gIGF1dGhWZXJzaW9uOiBBdXRoVmVyc2lvblxuKTogc3VwZXJhZ2VudC5SZXNwb25zZSB7XG4gIGlmICghcmVxLmlzVjJBdXRoZW50aWNhdGVkIHx8ICFyZXEuYXV0aGVudGljYXRpb25Ub2tlbikge1xuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIGNvbnN0IHZlcmlmaWNhdGlvblJlc3BvbnNlID0gYml0Z28udmVyaWZ5UmVzcG9uc2Uoe1xuICAgIHVybDogcmVxLnVybCxcbiAgICBobWFjOiByZXNwb25zZS5oZWFkZXIuaG1hYyxcbiAgICBzdGF0dXNDb2RlOiByZXNwb25zZS5zdGF0dXMsXG4gICAgdGV4dDogcmVzcG9uc2UudGV4dCxcbiAgICB0aW1lc3RhbXA6IHJlc3BvbnNlLmhlYWRlci50aW1lc3RhbXAsXG4gICAgdG9rZW46IHJlcS5hdXRoZW50aWNhdGlvblRva2VuLFxuICAgIG1ldGhvZCxcbiAgICBhdXRoVmVyc2lvbixcbiAgfSk7XG5cbiAgYXNzZXJ0VmVyaWZpY2F0aW9uUmVzcG9uc2UoYml0Z28sIHRva2VuLCByZXEsIHJlc3BvbnNlLCB2ZXJpZmljYXRpb25SZXNwb25zZSk7XG4gIHJldHVybiByZXNwb25zZTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZlcmlmeVJlc3BvbnNlQXN5bmMoXG4gIGJpdGdvOiBCaXRHb0FQSSxcbiAgdG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgbWV0aG9kOiBWZXJpZnlSZXNwb25zZU9wdGlvbnNbJ21ldGhvZCddLFxuICByZXE6IHN1cGVyYWdlbnQuU3VwZXJBZ2VudFJlcXVlc3QsXG4gIHJlc3BvbnNlOiBzdXBlcmFnZW50LlJlc3BvbnNlLFxuICBhdXRoVmVyc2lvbjogQXV0aFZlcnNpb25cbik6IFByb21pc2U8c3VwZXJhZ2VudC5SZXNwb25zZT4ge1xuICBpZiAoIXJlcS5pc1YyQXV0aGVudGljYXRlZCB8fCAhcmVxLmF1dGhlbnRpY2F0aW9uVG9rZW4pIHtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICBjb25zdCB2ZXJpZmljYXRpb25SZXNwb25zZSA9IGF3YWl0IGJpdGdvLnZlcmlmeVJlc3BvbnNlQXN5bmMoe1xuICAgIHVybDogcmVxLnVybCxcbiAgICBobWFjOiByZXNwb25zZS5oZWFkZXIuaG1hYyxcbiAgICBzdGF0dXNDb2RlOiByZXNwb25zZS5zdGF0dXMsXG4gICAgdGV4dDogcmVzcG9uc2UudGV4dCxcbiAgICB0aW1lc3RhbXA6IHJlc3BvbnNlLmhlYWRlci50aW1lc3RhbXAsXG4gICAgdG9rZW46IHJlcS5hdXRoZW50aWNhdGlvblRva2VuLFxuICAgIG1ldGhvZCxcbiAgICBhdXRoVmVyc2lvbixcbiAgfSk7XG5cbiAgYXNzZXJ0VmVyaWZpY2F0aW9uUmVzcG9uc2UoYml0Z28sIHRva2VuLCByZXEsIHJlc3BvbnNlLCB2ZXJpZmljYXRpb25SZXNwb25zZSk7XG4gIHJldHVybiByZXNwb25zZTtcbn1cbiJdfQ==