@bitgo-beta/sdk-api 1.10.1-beta.2057 → 1.10.1-beta.2059

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bitgo-beta/sdk-api",
3
- "version": "1.10.1-beta.2057",
3
+ "version": "1.10.1-beta.2059",
4
4
  "description": "REST wrapper for BitGoJS",
5
5
  "main": "./dist/src/index.js",
6
6
  "types": "./dist/src/index.d.ts",
@@ -40,12 +40,12 @@
40
40
  ]
41
41
  },
42
42
  "dependencies": {
43
- "@bitgo-beta/argon2": "0.0.1-beta.388",
44
- "@bitgo-beta/sdk-core": "8.2.1-beta.2065",
45
- "@bitgo-beta/sdk-hmac": "1.0.1-beta.1454",
46
- "@bitgo-beta/sjcl": "1.0.2-beta.2328",
47
- "@bitgo-beta/unspents": "0.13.2-beta.2073",
48
- "@bitgo-beta/utxo-lib": "8.0.3-beta.2075",
43
+ "@bitgo-beta/argon2": "0.0.1-beta.390",
44
+ "@bitgo-beta/sdk-core": "8.2.1-beta.2067",
45
+ "@bitgo-beta/sdk-hmac": "1.0.1-beta.1457",
46
+ "@bitgo-beta/sjcl": "1.0.2-beta.2330",
47
+ "@bitgo-beta/unspents": "0.13.2-beta.2075",
48
+ "@bitgo-beta/utxo-lib": "8.0.3-beta.2077",
49
49
  "@types/superagent": "4.1.15",
50
50
  "bitcoinjs-message": "npm:@bitgo-forks/bitcoinjs-message@1.0.0-master.3",
51
51
  "debug": "3.1.0",
@@ -67,7 +67,7 @@
67
67
  "resolutions": {
68
68
  "degenerator": "5.0.0"
69
69
  },
70
- "gitHead": "5528fd028444ce192fb0ec157a3dd1d3ef121373",
70
+ "gitHead": "75a1e9f973ce987e33ca2aaf5e5124e03739d035",
71
71
  "files": [
72
72
  "dist"
73
73
  ]
package/dist/src/api.d.ts CHANGED
@@ -30,12 +30,21 @@ export declare function handleResponseError(e: Error & {
30
30
  }): never;
31
31
  /**
32
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:
33
42
  * If data is already a string, returns it as-is to preserve exact bytes for HMAC.
34
43
  * If data is a Buffer, converts to UTF-8 string.
35
44
  * If data is an object, serializes it based on Content-Type.
36
45
  * @param req
37
46
  */
38
- export declare function serializeRequestData(req: superagent.Request): string | undefined;
47
+ export declare function serializeRequestData(req: superagent.Request): string | Buffer | undefined;
39
48
  /**
40
49
  * Set the superagent query string correctly for browsers or node.
41
50
  * @param req
@@ -1 +1 @@
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;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,UAAU,CAAC,OAAO,GAAG,MAAM,GAAG,SAAS,CAsDhF;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"}
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
@@ -119,12 +119,29 @@ function createResponseErrorString(res) {
119
119
  }
120
120
  /**
121
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:
122
131
  * If data is already a string, returns it as-is to preserve exact bytes for HMAC.
123
132
  * If data is a Buffer, converts to UTF-8 string.
124
133
  * If data is an object, serializes it based on Content-Type.
125
134
  * @param req
126
135
  */
127
136
  function serializeRequestData(req) {
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
+ }
128
145
  const data = req._data;
129
146
  if (typeof data === 'string') {
130
147
  return data;
@@ -268,4 +285,4 @@ async function verifyResponseAsync(bitgo, token, method, req, response, authVers
268
285
  assertVerificationResponse(bitgo, token, req, response, verificationResponse);
269
286
  return response;
270
287
  }
271
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQTZCQSx3Q0FXQztBQU9ELG9EQWVDO0FBMEJELGtEQUtDO0FBdUNELG9EQXNEQztBQU1ELHNEQXdCQztBQXlDRCx3Q0F5QkM7QUFFRCxrREF5QkM7QUFyVEQ7O0dBRUc7QUFDSCxrREFBMEI7QUFDMUIsOENBQXNCO0FBQ3RCLG9EQUF1QjtBQUN2QixrRUFBeUM7QUFDekMsNERBQW9DO0FBQ3BDLDhDQUF5QjtBQUN6Qiw4REFBc0M7QUFFdEMsbURBQXNFO0FBS3RFLE1BQU0sS0FBSyxHQUFHLElBQUEsZUFBSyxFQUFDLFdBQVcsQ0FBQyxDQUFDO0FBRWpDOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFnQixjQUFjLENBQzVCLEdBQWlDO0lBRWpDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7UUFDeEIsTUFBTSxDQUFDLGFBQXNCO1lBQzNCLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FDYixDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsb0JBQW9CLENBQXFCLGFBQWEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUMvRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQ3RDLENBQUM7UUFDSixDQUFDO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQixvQkFBb0IsQ0FDbEMsYUFBc0I7SUFFdEIsT0FBTyxVQUFVLEdBQXdCO1FBQ3ZDLElBQUksZ0JBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUM7WUFDcEUsT0FBTztZQUNMLDBGQUEwRjtZQUMxRixnSEFBZ0g7WUFDaEgsQ0FBQyxhQUFhLElB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b3J0IERlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCBlb2wgZnJvbSAnZW9sJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgc2FuaXRpemVIdG1sIGZyb20gJ3Nhbml0aXplLWh0bWwnO1xuaW1wb3J0IHN1cGVyYWdlbnQgZnJvbSAnc3VwZXJhZ2VudCc7XG5pbXBvcnQgdXJsTGliIGZyb20gJ3VybCc7XG5pbXBvcnQgcXVlcnlzdHJpbmcgZnJvbSAncXVlcnlzdHJpbmcnO1xuXG5pbXBvcnQgeyBBcGlSZXNwb25zZUVycm9yLCBCaXRHb1JlcXVlc3QgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5cbmltcG9ydCB7IEF1dGhWZXJzaW9uLCBWZXJpZnlSZXNwb25zZUluZm8sIFZlcmlmeVJlc3BvbnNlT3B0aW9ucyB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgQml0R29BUEkgfSBmcm9tICcuL2JpdGdvQVBJJztcblxuY29uc3QgZGVidWcgPSBEZWJ1ZygnYml0Z286YXBpJyk7XG5cbi8qKlxuICogQWRkIHRoZSBiaXRnby1zcGVjaWZpYyByZXN1bHQoKSBmdW5jdGlvbiBvbiBhIHN1cGVyYWdlbnQgcmVxdWVzdC5cbiAqXG4gKiBJZiB0aGUgc2VydmVyIHJlc3BvbnNlIGlzIHN1Y2Nlc3NmdWwsIHRoZSBgcmVzdWx0KClgIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGVpdGhlciB0aGUgZW50aXJlIHJlc3BvbnNlIGJvZHksXG4gKiBvciB0aGUgZmllbGQgZnJvbSB0aGUgcmVzcG9uc2UgYm9keSBzcGVjaWZpZWQgYnkgdGhlIGBvcHRpb25hbEZpZWxkYCBwYXJhbWV0ZXIgaWYgaXQgaXMgcHJvdmlkZWQuXG4gKlxuICogSWYgdGhlIHNlcnZlciByZXNwb25zZSB3aXRoIGFuIGVycm9yLCBgcmVzdWx0KClgIHdpbGwgaGFuZGxlIEhUVFAgZXJyb3JzIGFwcHJvcHJpYXRlbHkgYnlcbiAqIHJldGhyb3dpbmcgdGhlbSBhcyBhbiBgQXBpUmVzcG9uc2VFcnJvcmAgaWYgcG9zc2libGUsIGFuZCBvdGhlcndpc2UgcmV0aHJvd2luZyB0aGUgdW5kZXJseWluZyByZXNwb25zZSBlcnJvci5cbiAqXG4gKiBAcGFyYW0gcmVxXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0JpdGdvUmVxdWVzdDxSZXNwb25zZVJlc3VsdFR5cGUgPSBhbnk+KFxuICByZXE6IHN1cGVyYWdlbnQuU3VwZXJBZ2VudFJlcXVlc3Rcbik6IEJpdEdvUmVxdWVzdDxSZXNwb25zZVJlc3VsdFR5cGU+IHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24ocmVxLCB7XG4gICAgcmVzdWx0KG9wdGlvbmFsRmllbGQ/OiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiByZXEudGhlbihcbiAgICAgICAgKHJlc3BvbnNlKSA9PiBoYW5kbGVSZXNwb25zZVJlc3VsdDxSZXNwb25zZVJlc3VsdFR5cGU+KG9wdGlvbmFsRmllbGQpKHJlc3BvbnNlKSxcbiAgICAgICAgKGVycm9yKSA9PiBoYW5kbGVSZXNwb25zZUVycm9yKGVycm9yKVxuICAgICAgKTtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gYSBmdW5jdGlvbiB3aGljaCBleHRyYWN0cyB0aGUgc3BlY2lmaWVkIHJlc3BvbnNlIGJvZHkgcHJvcGVydHkgZnJvbSB0aGUgcmVzcG9uc2UgaWYgc3VjY2Vzc2Z1bCxcbiAqIG90aGVyd2lzZSB0aHJvdyBhbiBgQXBpRXJyb3JSZXNwb25zZWAgcGFyc2VkIGZyb20gdGhlIHJlc3BvbnNlIGJvZHkuXG4gKiBAcGFyYW0gb3B0aW9uYWxGaWVsZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlUmVzcG9uc2VSZXN1bHQ8UmVzcG9uc2VSZXN1bHRUeXBlPihcbiAgb3B0aW9uYWxGaWVsZD86IHN0cmluZ1xuKTogKHJlczogc3VwZXJhZ2VudC5SZXNwb25zZSkgPT4gUmVzcG9uc2VSZXN1bHRUeXBlIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChyZXM6IHN1cGVyYWdlbnQuUmVzcG9uc2UpOiBSZXNwb25zZVJlc3VsdFR5cGUge1xuICAgIGlmIChfLmlzTnVtYmVyKHJlcy5zdGF0dXMpICYmIHJlcy5zdGF0dXMgPj0gMjAwICYmIHJlcy5zdGF0dXMgPCAzMDApIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIC8vIElmIHRoZXJlJ3MgYW4gb3B0aW9uYWwgZmllbGQgYW5kIHRoZSBib2R5IGlzIG5vbi1udWxsaXNoIHdpdGggdGhhdCBwcm9wZXJ0eSwgcmV0dXJuIGl0O1xuICAgICAgICAvLyBvdGhlcndpc2UgcmV0dXJuIHRoZSBib2R5IGlmIGF2YWlsYWJsZTsgaWYgbm90LCByZXR1cm4gdGhlIHRleHQ7IGFuZCBmaW5hbGx5IGZhbGxiYWNrIHRvIHRoZSBlbnRpcmUgcmVzcG9uc2UuXG4gICAgICAgIChvcHRpb25hbEZpZWxkICYmIHJlcy5ib2R5ICYmIHJlcy5ib2R5W29wdGlvbmFsRmllbGRdICE9PSB1bmRlZmluZWQgPyByZXMuYm9keVtvcHRpb25hbEZpZWxkXSA6IHJlcy5ib2R5KSA/P1xuICAgICAgICByZXMudGV4dCA/P1xuICAgICAgICByZXNcbiAgICAgICk7XG4gICAgfVxuICAgIHRocm93IGVyckZyb21SZXNwb25zZShyZXMpO1xuICB9O1xufVxuXG4vKipcbiAqIEV4dHJhY3QgcmVsZXZhbnQgaW5mb3JtYXRpb24gZnJvbSBhIHN1Y2Nlc3NmdWwgcmVzcG9uc2UgKHRoYXQgaXMsIGEgcmVzcG9uc2Ugd2l0aCBhbiBIVFRQIHN0YXR1cyBjb2RlXG4gKiBiZXR3ZWVuIDIwMCBhbmQgMjk5KSwgYnV0IHdoaWNoIHJlc3VsdGVkIGluIGFuIGFwcGxpY2F0aW9uIHNwZWNpZmljIGVycm9yIGFuZCB1c2UgaXQgdG8gY29uc3RydWN0IGFuZFxuICogdGhyb3cgYW4gYEFwaUVycm9yUmVzcG9uc2VgLlxuICpcbiAqIEBwYXJhbSByZXNcbiAqL1xuZnVuY3Rpb24gZXJyRnJvbVJlc3BvbnNlPFJlc3BvbnNlQm9keVR5cGU+KHJlczogc3VwZXJhZ2VudC5SZXNwb25zZSk6IEFwaVJlc3BvbnNlRXJyb3Ige1xuICBjb25zdCBtZXNzYWdlID0gY3JlYXRlUmVzcG9uc2VFcnJvclN0cmluZyhyZXMpO1xuICBjb25zdCBzdGF0dXMgPSByZXMuc3RhdHVzO1xuICBjb25zdCByZXN1bHQgPSByZXMuYm9keSBhcyBSZXNwb25zZUJvZHlUeXBlO1xuICBjb25zdCBpbnZhbGlkVG9rZW4gPSBfLmhhcyhyZXMuaGVhZGVyLCAneC1hdXRoLXJlcXVpcmVkJykgJiYgcmVzLmhlYWRlclsneC1hdXRoLXJlcXVpcmVkJ10gPT09ICd0cnVlJztcbiAgY29uc3QgbmVlZHNPdHAgPSByZXMuYm9keT8ubmVlZHNPVFAgIT09IHVuZGVmaW5lZDtcbiAgLy8gU2VydmVyIGVjaG9lcyB0aGUgY2xpZW50J3MgYFJlcXVlc3QtSURgIGhlYWRlciAob3Igb25lIGl0IGdlbmVyYXRlZCkgYmFjayBvbiBldmVyeVxuICAvLyByZXNwb25zZSwgaW5jbHVkaW5nIGVycm9ycyDigJQgc3VyZmFjZSBpdCBzbyBmYWlsdXJlcyBjYW4gYmUgY29ycmVsYXRlZCB3aXRoIHNlcnZlciBsb2dzLlxuICBjb25zdCByZXF1ZXN0SWQgPSByZXMuaGVhZGVyPy5bJ3JlcXVlc3QtaWQnXTtcbiAgcmV0dXJuIG5ldyBBcGlSZXNwb25zZUVycm9yKG1lc3NhZ2UsIHN0YXR1cywgcmVzdWx0LCBpbnZhbGlkVG9rZW4sIG5lZWRzT3RwLCByZXF1ZXN0SWQpO1xufVxuXG4vKipcbiAqIEhhbmRsZSBhbiBlcnJvciBvciBhbiBlcnJvciBjb250YWluaW5nIGFuIEhUVFAgcmVzcG9uc2UgYW5kIHVzZSBpdCB0byB0aHJvdyBhIHdlbGwtZm9ybWVkIGVycm9yIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlUmVzcG9uc2VFcnJvcihlOiBFcnJvciAmIHsgcmVzcG9uc2U/OiBzdXBlcmFnZW50LlJlc3BvbnNlIH0pOiBuZXZlciB7XG4gIGlmIChlLnJlc3BvbnNlKSB7XG4gICAgdGhyb3cgZXJyRnJvbVJlc3BvbnNlKGUucmVzcG9uc2UpO1xuICB9XG4gIHRocm93IGU7XG59XG5cbi8qKlxuICogVGhlcmUgYXJlIG1hbnkgd2F5cyBhIHJlcXVlc3QgY2FuIGZhaWwsIGFuZCBtYXkgd2F5cyBpbmZvcm1hdGlvbiBvbiB0aGF0IGZhaWx1cmUgY2FuIGJlXG4gKiBjb21tdW5pY2F0ZWQgdG8gdGhlIGNsaWVudC4gVGhpcyBmdW5jdGlvbiB0cmllcyB0byBoYW5kbGUgdGhvc2UgY2FzZXMgYW5kIGNyZWF0ZSBhIHNhbmUgZXJyb3Igc3RyaW5nXG4gKiBAcGFyYW0gcmVzIFJlc3BvbnNlIGZyb20gYW4gSFRUUCByZXF1ZXN0XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlRXJyb3JTdHJpbmcocmVzOiBzdXBlcmFnZW50LlJlc3BvbnNlKTogc3RyaW5nIHtcbiAgbGV0IGVyclN0cmluZyA9IHJlcy5zdGF0dXMudG9TdHJpbmcoKTsgLy8gYXQgdGhlIHZlcnkgbGVhc3Qgd2UnbGwgaGF2ZSB0aGUgc3RhdHVzIGNvZGVcbiAgaWYgKHJlcy5ib2R5Py5lcnJvcikge1xuICAgIC8vIHRoaXMgaXMgdGhlIGNhc2Ugd2UgaG9wZSBmb3IsIHdoZXJlIHRoZSBzZXJ2ZXIgZ2l2ZXMgdXMgYSBuaWNlIGVycm9yIGZyb20gdGhlIEpTT04gYm9keVxuICAgIGVyclN0cmluZyA9IHJlcy5ib2R5LmVycm9yO1xuICB9IGVsc2UgaWYgKHJlcy50ZXh0KSB7XG4gICAgLy8gaWYgdGhlIHJlc3BvbnNlIGNhbWUgYmFjayBhcyB0ZXh0LCB3ZSB0cnkgdG8gcGFyc2UgaXQgYXMgSFRNTCBhbmQgcmVtb3ZlIGFsbCB0YWdzLCBsZWF2aW5nIHVzXG4gICAgLy8ganVzdCB0aGUgYmFyZSB0ZXh0LCB3aGljaCB3ZSB0aGVuIHRyaW0gb2YgZXhjZXNzaXZlIG5ld2xpbmVzIGFuZCBsaW1pdCB0byBhIGNlcnRhaW4gbGVuZ3RoXG4gICAgdHJ5IHtcbiAgICAgIGxldCBzYW5pdGl6ZWRUZXh0ID0gc2FuaXRpemVIdG1sKHJlcy50ZXh0LCB7IGFsbG93ZWRUYWdzOiBbXSB9KTtcbiAgICAgIHNhbml0aXplZFRleHQgPSBzYW5pdGl6ZWRUZXh0LnRyaW0oKTtcbiAgICAgIHNhbml0aXplZFRleHQgPSBlb2wubGYoc2FuaXRpemVkVGV4dCk7IC8vIHVzZSAnXFxuJyBmb3IgYWxsIG5ld2xpbmVzXG4gICAgICBzYW5pdGl6ZWRUZXh0ID0gXy5yZXBsYWNlKHNhbml0aXplZFRleHQsIC9cXG5bIHxcXHRdezEsfVxcbi9nLCAnXFxuXFxuJyk7IC8vIHJlbW92ZSB0aGUgc3BhY2VzL3RhYnMgYmV0d2VlbiBuZXdsaW5lc1xuICAgICAgc2FuaXRpemVkVGV4dCA9IF8ucmVwbGFjZShzYW5pdGl6ZWRUZXh0LCAvW1xcbl17Myx9L2csICdcXG5cXG4nKTsgLy8gaGF2ZSBhdCBtb3N0IDIgY29uc2VjdXRpdmUgbmV3bGluZXNcbiAgICAgIHNhbml0aXplZFRleHQgPSBzYW5pdGl6ZWRUZXh0LnN1YnN0cmluZygwLCA1MDAwKTsgLy8gcHJldmVudCBtZXNzYWdlIGZyb20gZ2V0dGluZyB0b28gbGFyZ2VcbiAgICAgIGVyclN0cmluZyA9IGVyclN0cmluZyArICdcXG4nICsgc2FuaXRpemVkVGV4dDsgLy8gYWRkIGl0IHRvIG91ciBleGlzdGluZyBlcnJTdHJpbmcgKGF0IHRoaXMgcG9pbnQgdGhlIG1vcmUgaW5mbyB0aGUgYmV0dGVyISlcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBkbyBub3RoaW5nLCB0aGUgcmVzcG9uc2UncyBIVE1MIHdhcyB0b28gd2Fja3kgdG8gYmUgcGFyc2VkIGNsZWFubHlcbiAgICAgIGRlYnVnKCdnb3QgZXJyb3Igd2l0aCBtZXNzYWdlIFwiJXNcIiB3aGlsZSBjcmVhdGluZyByZXNwb25zZSBlcnJvciBzdHJpbmcgZnJvbSByZXNwb25zZTogJXMnLCBlLm1lc3NhZ2UsIHJlcy50ZXh0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXJyU3RyaW5nO1xufVxuXG4vKipcbiAqIFNlcmlhbGl6ZSByZXF1ZXN0IGRhdGEgYmFzZWQgb24gdGhlIHJlcXVlc3QgY29udGVudCB0eXBlLlxuICogSWYgZGF0YSBpcyBhbHJlYWR5IGEgc3RyaW5nLCByZXR1cm5zIGl0IGFzLWlzIHRvIHByZXNlcnZlIGV4YWN0IGJ5dGVzIGZvciBITUFDLlxuICogSWYgZGF0YSBpcyBhIEJ1ZmZlciwgY29udmVydHMgdG8gVVRGLTggc3RyaW5nLlxuICogSWYgZGF0YSBpcyBhbiBvYmplY3QsIHNlcmlhbGl6ZXMgaXQgYmFzZWQgb24gQ29udGVudC1UeXBlLlxuICogQHBhcmFtIHJlcVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplUmVxdWVzdERhdGEocmVxOiBzdXBlcmFnZW50LlJlcXVlc3QpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBkYXRhOiBzdHJpbmcgfCBCdWZmZXIgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCA9IChyZXEgYXMgYW55KS5fZGF0YTtcblxuICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGRhdGEpKSB7XG4gICAgLy8gQ29udmVydCBCdWZmZXIgdG8gVVRGLTggc3RyaW5nIGFuZCBtdXRhdGUgX2RhdGEgdG8gZW5zdXJlIGNvbnNpc3RlbmN5LlxuICAgIC8vIFRoaXMgaXMgY3JpdGljYWw6IGlmIF9kYXRhIHN0YXlzIGFzIGEgQnVmZmVyLCBzdXBlcmFnZW50IHdpbGwgc2VyaWFsaXplIGl0XG4gICAgLy8gYXMgSlNPTiAoe1widHlwZVwiOlwiQnVmZmVyXCIsXCJkYXRhXCI6Wy4uLl19KSwgd2hpY2ggd29uJ3QgbWF0Y2ggdGhlIEhNQUMuXG4gICAgLy8gQnkgbXV0YXRpbmcgdG8gc3RyaW5nLCBzdXBlcmFnZW50IHNlbmRzIHRoZSBleGFjdCBieXRlcyB3ZSBoYXNoLlxuICAgIC8vIFRoaXMgaXMgc2FmZSBmb3IgcmV0cmllczogY2FsbGluZyBhZ2FpbiB3aXRoIGEgc3RyaW5nIHdpbGwgaGl0IHRoZSBlYXJseSByZXR1cm4gYWJvdmUuXG4gICAgY29uc3Qgc3RyaW5nRGF0YSA9IGRhdGEudG9TdHJpbmcoJ3V0ZjgnKTtcbiAgICAocmVxIGFzIGFueSkuX2RhdGEgPSBzdHJpbmdEYXRhO1xuICAgIHJldHVybiBzdHJpbmdEYXRhO1xuICB9XG5cbiAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCB8fCBkYXRhID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIFNlcmlhbGl6ZSBvYmplY3QgZGF0YSBiYXNlZCBvbiBDb250ZW50LVR5cGVcbiAgbGV0IGNvbnRlbnRUeXBlID0gcmVxLmdldCgnQ29udGVudC1UeXBlJyk7XG4gIC8vIFBhcnNlIG91dCBqdXN0IHRoZSBjb250ZW50IHR5cGUgZnJvbSB0aGUgaGVhZGVyIChpZ25vcmUgdGhlIGNoYXJzZXQpXG4gIGlmIChjb250ZW50VHlwZSkge1xuICAgIGNvbnRlbnRUeXBlID0gY29udGVudFR5cGUuc3BsaXQoJzsnKVswXS50cmltKCk7XG4gIH1cbiAgbGV0IHNlcmlhbGl6ZTogKChib2R5OiB1bmtub3duKSA9PiBzdHJpbmcpIHwgdW5kZWZpbmVkO1xuICBjb25zdCBzZXJpYWxpemVycyA9IHN1cGVyYWdlbnQuc2VyaWFsaXplIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBpZiAoY29udGVudFR5cGUpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNlcmlhbGl6ZXJzLCBjb250ZW50VHlwZSkpIHtcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHNlcmlhbGl6ZXJzW2NvbnRlbnRUeXBlXTtcbiAgICAgIGlmICh0eXBlb2YgY2FuZGlkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHNlcmlhbGl6ZSA9IGNhbmRpZGF0ZSBhcyAoYm9keTogdW5rbm93bikgPT4gc3RyaW5nO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoL1tcXC8rXWpzb25cXGIvLnRlc3QoY29udGVudFR5cGUpKSB7XG4gICAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIGJ1aWx0LWluIEpTT04gc2VyaWFsaXplciBmb3IgSlNPTi1saWtlIGNvbnRlbnQgdHlwZXNcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2VyaWFsaXplcnMsICdhcHBsaWNhdGlvbi9qc29uJykpIHtcbiAgICAgICAgY29uc3QganNvblNlcmlhbGl6ZXIgPSBzZXJpYWxpemVyc1snYXBwbGljYXRpb24vanNvbiddO1xuICAgICAgICBpZiAodHlwZW9mIGpzb25TZXJpYWxpemVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgc2VyaWFsaXplID0ganNvblNlcmlhbGl6ZXIgYXMgKGJvZHk6IHVua25vd24pID0+IHN0cmluZztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChzZXJpYWxpemUpIHtcbiAgICBjb25zdCBzZXJpYWxpemVkID0gc2VyaWFsaXplKGRhdGEpO1xuICAgIChyZXEgYXMgYW55KS5fZGF0YSA9IHNlcmlhbGl6ZWQ7XG4gICAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFNldCB0aGUgc3VwZXJhZ2VudCBxdWVyeSBzdHJpbmcgY29ycmVjdGx5IGZvciBicm93c2VycyBvciBub2RlLlxuICogQHBhcmFtIHJlcVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0UmVxdWVzdFF1ZXJ5U3RyaW5nKHJlcTogc3VwZXJhZ2VudC5TdXBlckFnZW50UmVxdWVzdCk6IHZvaWQge1xuICBjb25zdCB1cmxEZXRhaWxzID0gdXJsTGliLnBhcnNlKHJlcS51cmwpO1xuXG4gIGxldCBxdWVyeVN0cmluZzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBjb25zdCBxdWVyeTogc3RyaW5nW10gPSAocmVxIGFzIGFueSkuX3F1ZXJ5O1xuICBjb25zdCBxczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IChyZXEgYXMgYW55KS5xcztcbiAgaWYgKHF1ZXJ5ICYmIHF1ZXJ5Lmxlbmd0aCA+IDApIHtcbiAgICAvLyBicm93c2VyIHZlcnNpb25cbiAgICBxdWVyeVN0cmluZyA9IHF1ZXJ5LmpvaW4oJyYnKTtcbiAgICAocmVxIGFzIGFueSkuX3F1ZXJ5ID0gW107XG4gIH0gZWxzZSBpZiAocXMpIHtcbiAgICAvLyBub2RlIHZlcnNpb25cbiAgICBxdWVyeVN0cmluZyA9IHF1ZXJ5c3RyaW5nLnN0cmluZ2lmeShxcyk7XG4gICAgKHJlcSBhcyBhbnkpLnFzID0gbnVsbDtcbiAgfVxuXG4gIGlmIChxdWVyeVN0cmluZykge1xuICAgIGlmICh1cmxEZXRhaWxzLnNlYXJjaCkge1xuICAgICAgdXJsRGV0YWlscy5zZWFyY2ggKz0gJyYnICsgcXVlcnlTdHJpbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVybERldGFpbHMuc2VhcmNoID0gJz8nICsgcXVlcnlTdHJpbmc7XG4gICAgfVxuICAgIHJlcS51cmwgPSB1cmxMaWIuZm9ybWF0KHVybERldGFpbHMpO1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGUgYSBjb21wbGV0ZWQgdmVyaWZpY2F0aW9uIHJlc3BvbnNlIGFuZCB0aHJvdyBhIGRlc2NyaXB0aXZlIGBBcGlSZXNwb25zZUVycm9yYCBpZiBpdFxuICogaW5kaWNhdGVzIHRoZSByZXNwb25zZSBpcyBpbnZhbGlkIG9yIG91dHNpZGUgdGhlIGFjY2VwdGFibGUgdGltZSB3aW5kb3cuXG4gKi9cbmZ1bmN0aW9uIGFzc2VydFZlcmlmaWNhdGlvblJlc3BvbnNlKFxuICBiaXRnbzogQml0R29BUEksXG4gIHRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHJlcTogc3VwZXJhZ2VudC5TdXBlckFnZW50UmVxdWVzdCxcbiAgcmVzcG9uc2U6IHN1cGVyYWdlbnQuUmVzcG9uc2UsXG4gIHZlcmlmaWNhdGlvblJlc3BvbnNlOiBWZXJpZnlSZXNwb25zZUluZm9cbik6IHZvaWQge1xuICBpZiAoIXZlcmlmaWNhdGlvblJlc3BvbnNlLmlzVmFsaWQpIHtcbiAgICAvLyBMb2cgb25seSB0aGUgZmlyc3QgMTAgY2hhcmFjdGVycyBvZiB0aGUgdG9rZW4gdG8gZW5zdXJlIHRoZSBmdWxsIHRva2VuIGlzbid0IGxvZ2dlZC5cbiAgICBjb25zdCBwYXJ0aWFsQml0Z29Ub2tlbiA9IHRva2VuID8gdG9rZW4uc3Vic3RyaW5nKDAsIDEwKSA6ICcnO1xuICAgIGNvbnN0IGVycm9yRGV0YWlscyA9IHtcbiAgICAgIGV4cGVjdGVkSG1hYzogdmVyaWZpY2F0aW9uUmVzcG9uc2UuZXhwZWN0ZWRIbWFjLFxuICAgICAgcmVjZWl2ZWRIbWFjOiByZXNwb25zZS5oZWFkZXIuaG1hYyxcbiAgICAgIGhtYWNJbnB1dDogdmVyaWZpY2F0aW9uUmVzcG9uc2Uuc2lnbmF0dXJlU3ViamVjdCxcbiAgICAgIHJlcXVlc3RUb2tlbjogcmVxLmF1dGhlbnRpY2F0aW9uVG9rZW4sXG4gICAgICBiaXRnb1Rva2VuOiBwYXJ0aWFsQml0Z29Ub2tlbixcbiAgICB9O1xuICAgIGRlYnVnKCdJbnZhbGlkIHJlc3BvbnNlIEhNQUM6ICVPJywgZXJyb3JEZXRhaWxzKTtcbiAgICB0aHJvdyBuZXcgQXBpUmVzcG9uc2VFcnJvcignaW52YWxpZCByZXNwb25zZSBITUFDJywgNTExLCBlcnJvckRldGFpbHMpO1xuICB9XG5cbiAgaWYgKGJpdGdvLmdldEF1dGhWZXJzaW9uKCkgPT09IDMgJiYgIXZlcmlmaWNhdGlvblJlc3BvbnNlLmlzSW5SZXNwb25zZVZhbGlkaXR5V2luZG93KSB7XG4gICAgY29uc3QgZXJyb3JEZXRhaWxzID0ge1xuICAgICAgdGltZXN0YW1wOiByZXNwb25zZS5oZWFkZXIudGltZXN0YW1wLFxuICAgICAgdmVyaWZpY2F0aW9uVGltZTogdmVyaWZpY2F0aW9uUmVzcG9uc2UudmVyaWZpY2F0aW9uVGltZSxcbiAgICB9O1xuICAgIGRlYnVnKCdTZXJ2ZXIgcmVzcG9uc2Ugb3V0c2lkZSByZXNwb25zZSB2YWxpZGl0eSB0aW1lIHdpbmRvdzogJU8nLCBlcnJvckRldGFpbHMpO1xuICAgIHRocm93IG5ldyBBcGlSZXNwb25zZUVycm9yKCdzZXJ2ZXIgcmVzcG9uc2Ugb3V0c2lkZSByZXNwb25zZSB2YWxpZGl0eSB0aW1lIHdpbmRvdycsIDUxMSwgZXJyb3JEZXRhaWxzKTtcbiAgfVxufVxuXG4vKipcbiAqIFZlcmlmeSB0aGF0IHRoZSByZXNwb25zZSByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXIgaXMgc2lnbmVkIGNvcnJlY3RseS5cbiAqIFJpZ2h0IG5vdywgaXQgaXMgdmVyeSBwZXJtaXNzaXZlIHdpdGggdGhlIHRpbWVzdGFtcCB2YXJpYW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZlcmlmeVJlc3BvbnNlKFxuICBiaXRnbzogQml0R29BUEksXG4gIHRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIG1ldGhvZDogVmVyaWZ5UmVzcG9uc2VPcHRpb25zWydtZXRob2QnXSxcbiAgcmVxOiBzdXBlcmFnZW50LlN1cGVyQWdlbnRSZXF1ZXN0LFxuICByZXNwb25zZTogc3VwZXJhZ2VudC5SZXNwb25zZSxcbiAgYXV0aFZlcnNpb246IEF1dGhWZXJzaW9uXG4pOiBzdXBlcmFnZW50LlJlc3BvbnNlIHtcbiAgaWYgKCFyZXEuaXNWMkF1dGhlbnRpY2F0ZWQgfHwgIXJlcS5hdXRoZW50aWNhdGlvblRva2VuKSB7XG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgY29uc3QgdmVyaWZpY2F0aW9uUmVzcG9uc2UgPSBiaXRnby52ZXJpZnlSZXNwb25zZSh7XG4gICAgdXJsOiByZXEudXJsLFxuICAgIGhtYWM6IHJlc3BvbnNlLmhlYWRlci5obWFjLFxuICAgIHN0YXR1c0NvZGU6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICB0ZXh0OiByZXNwb25zZS50ZXh0LFxuICAgIHRpbWVzdGFtcDogcmVzcG9uc2UuaGVhZGVyLnRpbWVzdGFtcCxcbiAgICB0b2tlbjogcmVxLmF1dGhlbnRpY2F0aW9uVG9rZW4sXG4gICAgbWV0aG9kLFxuICAgIGF1dGhWZXJzaW9uLFxuICB9KTtcblxuICBhc3NlcnRWZXJpZmljYXRpb25SZXNwb25zZShiaXRnbywgdG9rZW4sIHJlcSwgcmVzcG9uc2UsIHZlcmlmaWNhdGlvblJlc3BvbnNlKTtcbiAgcmV0dXJuIHJlc3BvbnNlO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmVyaWZ5UmVzcG9uc2VBc3luYyhcbiAgYml0Z286IEJpdEdvQVBJLFxuICB0b2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBtZXRob2Q6IFZlcmlmeVJlc3BvbnNlT3B0aW9uc1snbWV0aG9kJ10sXG4gIHJlcTogc3VwZXJhZ2VudC5TdXBlckFnZW50UmVxdWVzdCxcbiAgcmVzcG9uc2U6IHN1cGVyYWdlbnQuUmVzcG9uc2UsXG4gIGF1dGhWZXJzaW9uOiBBdXRoVmVyc2lvblxuKTogUHJvbWlzZTxzdXBlcmFnZW50LlJlc3BvbnNlPiB7XG4gIGlmICghcmVxLmlzVjJBdXRoZW50aWNhdGVkIHx8ICFyZXEuYXV0aGVudGljYXRpb25Ub2tlbikge1xuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIGNvbnN0IHZlcmlmaWNhdGlvblJlc3BvbnNlID0gYXdhaXQgYml0Z28udmVyaWZ5UmVzcG9uc2VBc3luYyh7XG4gICAgdXJsOiByZXEudXJsLFxuICAgIGhtYWM6IHJlc3BvbnNlLmhlYWRlci5obWFjLFxuICAgIHN0YXR1c0NvZGU6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICB0ZXh0OiByZXNwb25zZS50ZXh0LFxuICAgIHRpbWVzdGFtcDogcmVzcG9uc2UuaGVhZGVyLnRpbWVzdGFtcCxcbiAgICB0b2tlbjogcmVxLmF1dGhlbnRpY2F0aW9uVG9rZW4sXG4gICAgbWV0aG9kLFxuICAgIGF1dGhWZXJzaW9uLFxuICB9KTtcblxuICBhc3NlcnRWZXJpZmljYXRpb25SZXNwb25zZShiaXRnbywgdG9rZW4sIHJlcSwgcmVzcG9uc2UsIHZlcmlmaWNhdGlvblJlc3BvbnNlKTtcbiAgcmV0dXJuIHJlc3BvbnNlO1xufVxuIl19
288
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQTZCQSx3Q0FXQztBQU9ELG9EQWVDO0FBMEJELGtEQUtDO0FBZ0RELG9EQStEQztBQU1ELHNEQXdCQztBQXlDRCx3Q0F5QkM7QUFFRCxrREF5QkM7QUF2VUQ7O0dBRUc7QUFDSCxrREFBMEI7QUFDMUIsOENBQXNCO0FBQ3RCLG9EQUF1QjtBQUN2QixrRUFBeUM7QUFDekMsNERBQW9DO0FBQ3BDLDhDQUF5QjtBQUN6Qiw4REFBc0M7QUFFdEMsbURBQXNFO0FBS3RFLE1BQU0sS0FBSyxHQUFHLElBQUEsZUFBSyxFQUFDLFdBQVcsQ0FBQyxDQUFDO0FBRWpDOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFnQixjQUFjLENBQzVCLEdBQWlDO0lBRWpDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7UUFDeEIsTUFBTSxDQUFDLGFBQXNCO1lBQzNCLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FDYixDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsb0JBQW9CLENBQXFCLGFBQWEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUMvRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQ3RDLENBQUM7UUFDSixDQUFDO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFnQixvQkFBb0IsQ0FDbEMsYUFBc0I7SUFFdEIsT0FBTyxVQUFVLEdBQXdCO1FBQ3ZDLElBQUksZ0JBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUM7WUFDcEUsT0FBTztZQUNMLDBGQUEwRjtZQUMxRixnSEFBZ0g7WUFDaEgsQ0FBQyxhQUFhLElB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QUFFLEdBQUcsQ0FBQyxtQkFBbUI7UUFDOUIsTUFBTTtRQUNOLFdBQVc7S0FDWixDQUFDLENBQUM7SUFFSCwwQkFBMEIsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztJQUM5RSxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqL1xuaW1wb3J0IERlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCBlb2wgZnJvbSAnZW9sJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgc2FuaXRpemVIdG1sIGZyb20gJ3Nhbml0aXplLWh0bWwnO1xuaW1wb3J0IHN1cGVyYWdlbnQgZnJvbSAnc3VwZXJhZ2VudCc7XG5pbXBvcnQgdXJsTGliIGZyb20gJ3VybCc7XG5pbXBvcnQgcXVlcnlzdHJpbmcgZnJvbSAncXVlcnlzdHJpbmcnO1xuXG5pbXBvcnQgeyBBcGlSZXNwb25zZUVycm9yLCBCaXRHb1JlcXVlc3QgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5cbmltcG9ydCB7IEF1dGhWZXJzaW9uLCBWZXJpZnlSZXNwb25zZUluZm8sIFZlcmlmeVJlc3BvbnNlT3B0aW9ucyB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgQml0R29BUEkgfSBmcm9tICcuL2JpdGdvQVBJJztcblxuY29uc3QgZGVidWcgPSBEZWJ1ZygnYml0Z286YXBpJyk7XG5cbi8qKlxuICogQWRkIHRoZSBiaXRnby1zcGVjaWZpYyByZXN1bHQoKSBmdW5jdGlvbiBvbiBhIHN1cGVyYWdlbnQgcmVxdWVzdC5cbiAqXG4gKiBJZiB0aGUgc2VydmVyIHJlc3BvbnNlIGlzIHN1Y2Nlc3NmdWwsIHRoZSBgcmVzdWx0KClgIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGVpdGhlciB0aGUgZW50aXJlIHJlc3BvbnNlIGJvZHksXG4gKiBvciB0aGUgZmllbGQgZnJvbSB0aGUgcmVzcG9uc2UgYm9keSBzcGVjaWZpZWQgYnkgdGhlIGBvcHRpb25hbEZpZWxkYCBwYXJhbWV0ZXIgaWYgaXQgaXMgcHJvdmlkZWQuXG4gKlxuICogSWYgdGhlIHNlcnZlciByZXNwb25zZSB3aXRoIGFuIGVycm9yLCBgcmVzdWx0KClgIHdpbGwgaGFuZGxlIEhUVFAgZXJyb3JzIGFwcHJvcHJpYXRlbHkgYnlcbiAqIHJldGhyb3dpbmcgdGhlbSBhcyBhbiBgQXBpUmVzcG9uc2VFcnJvcmAgaWYgcG9zc2libGUsIGFuZCBvdGhlcndpc2UgcmV0aHJvd2luZyB0aGUgdW5kZXJseWluZyByZXNwb25zZSBlcnJvci5cbiAqXG4gKiBAcGFyYW0gcmVxXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0JpdGdvUmVxdWVzdDxSZXNwb25zZVJlc3VsdFR5cGUgPSBhbnk+KFxuICByZXE6IHN1cGVyYWdlbnQuU3VwZXJBZ2VudFJlcXVlc3Rcbik6IEJpdEdvUmVxdWVzdDxSZXNwb25zZVJlc3VsdFR5cGU+IHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24ocmVxLCB7XG4gICAgcmVzdWx0KG9wdGlvbmFsRmllbGQ/OiBzdHJpbmcpIHtcbiAgICAgIHJldHVybiByZXEudGhlbihcbiAgICAgICAgKHJlc3BvbnNlKSA9PiBoYW5kbGVSZXNwb25zZVJlc3VsdDxSZXNwb25zZVJlc3VsdFR5cGU+KG9wdGlvbmFsRmllbGQpKHJlc3BvbnNlKSxcbiAgICAgICAgKGVycm9yKSA9PiBoYW5kbGVSZXNwb25zZUVycm9yKGVycm9yKVxuICAgICAgKTtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gYSBmdW5jdGlvbiB3aGljaCBleHRyYWN0cyB0aGUgc3BlY2lmaWVkIHJlc3BvbnNlIGJvZHkgcHJvcGVydHkgZnJvbSB0aGUgcmVzcG9uc2UgaWYgc3VjY2Vzc2Z1bCxcbiAqIG90aGVyd2lzZSB0aHJvdyBhbiBgQXBpRXJyb3JSZXNwb25zZWAgcGFyc2VkIGZyb20gdGhlIHJlc3BvbnNlIGJvZHkuXG4gKiBAcGFyYW0gb3B0aW9uYWxGaWVsZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlUmVzcG9uc2VSZXN1bHQ8UmVzcG9uc2VSZXN1bHRUeXBlPihcbiAgb3B0aW9uYWxGaWVsZD86IHN0cmluZ1xuKTogKHJlczogc3VwZXJhZ2VudC5SZXNwb25zZSkgPT4gUmVzcG9uc2VSZXN1bHRUeXBlIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChyZXM6IHN1cGVyYWdlbnQuUmVzcG9uc2UpOiBSZXNwb25zZVJlc3VsdFR5cGUge1xuICAgIGlmIChfLmlzTnVtYmVyKHJlcy5zdGF0dXMpICYmIHJlcy5zdGF0dXMgPj0gMjAwICYmIHJlcy5zdGF0dXMgPCAzMDApIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIC8vIElmIHRoZXJlJ3MgYW4gb3B0aW9uYWwgZmllbGQgYW5kIHRoZSBib2R5IGlzIG5vbi1udWxsaXNoIHdpdGggdGhhdCBwcm9wZXJ0eSwgcmV0dXJuIGl0O1xuICAgICAgICAvLyBvdGhlcndpc2UgcmV0dXJuIHRoZSBib2R5IGlmIGF2YWlsYWJsZTsgaWYgbm90LCByZXR1cm4gdGhlIHRleHQ7IGFuZCBmaW5hbGx5IGZhbGxiYWNrIHRvIHRoZSBlbnRpcmUgcmVzcG9uc2UuXG4gICAgICAgIChvcHRpb25hbEZpZWxkICYmIHJlcy5ib2R5ICYmIHJlcy5ib2R5W29wdGlvbmFsRmllbGRdICE9PSB1bmRlZmluZWQgPyByZXMuYm9keVtvcHRpb25hbEZpZWxkXSA6IHJlcy5ib2R5KSA/P1xuICAgICAgICByZXMudGV4dCA/P1xuICAgICAgICByZXNcbiAgICAgICk7XG4gICAgfVxuICAgIHRocm93IGVyckZyb21SZXNwb25zZShyZXMpO1xuICB9O1xufVxuXG4vKipcbiAqIEV4dHJhY3QgcmVsZXZhbnQgaW5mb3JtYXRpb24gZnJvbSBhIHN1Y2Nlc3NmdWwgcmVzcG9uc2UgKHRoYXQgaXMsIGEgcmVzcG9uc2Ugd2l0aCBhbiBIVFRQIHN0YXR1cyBjb2RlXG4gKiBiZXR3ZWVuIDIwMCBhbmQgMjk5KSwgYnV0IHdoaWNoIHJlc3VsdGVkIGluIGFuIGFwcGxpY2F0aW9uIHNwZWNpZmljIGVycm9yIGFuZCB1c2UgaXQgdG8gY29uc3RydWN0IGFuZFxuICogdGhyb3cgYW4gYEFwaUVycm9yUmVzcG9uc2VgLlxuICpcbiAqIEBwYXJhbSByZXNcbiAqL1xuZnVuY3Rpb24gZXJyRnJvbVJlc3BvbnNlPFJlc3BvbnNlQm9keVR5cGU+KHJlczogc3VwZXJhZ2VudC5SZXNwb25zZSk6IEFwaVJlc3BvbnNlRXJyb3Ige1xuICBjb25zdCBtZXNzYWdlID0gY3JlYXRlUmVzcG9uc2VFcnJvclN0cmluZyhyZXMpO1xuICBjb25zdCBzdGF0dXMgPSByZXMuc3RhdHVzO1xuICBjb25zdCByZXN1bHQgPSByZXMuYm9keSBhcyBSZXNwb25zZUJvZHlUeXBlO1xuICBjb25zdCBpbnZhbGlkVG9rZW4gPSBfLmhhcyhyZXMuaGVhZGVyLCAneC1hdXRoLXJlcXVpcmVkJykgJiYgcmVzLmhlYWRlclsneC1hdXRoLXJlcXVpcmVkJ10gPT09ICd0cnVlJztcbiAgY29uc3QgbmVlZHNPdHAgPSByZXMuYm9keT8ubmVlZHNPVFAgIT09IHVuZGVmaW5lZDtcbiAgLy8gU2VydmVyIGVjaG9lcyB0aGUgY2xpZW50J3MgYFJlcXVlc3QtSURgIGhlYWRlciAob3Igb25lIGl0IGdlbmVyYXRlZCkgYmFjayBvbiBldmVyeVxuICAvLyByZXNwb25zZSwgaW5jbHVkaW5nIGVycm9ycyDigJQgc3VyZmFjZSBpdCBzbyBmYWlsdXJlcyBjYW4gYmUgY29ycmVsYXRlZCB3aXRoIHNlcnZlciBsb2dzLlxuICBjb25zdCByZXF1ZXN0SWQgPSByZXMuaGVhZGVyPy5bJ3JlcXVlc3QtaWQnXTtcbiAgcmV0dXJuIG5ldyBBcGlSZXNwb25zZUVycm9yKG1lc3NhZ2UsIHN0YXR1cywgcmVzdWx0LCBpbnZhbGlkVG9rZW4sIG5lZWRzT3RwLCByZXF1ZXN0SWQpO1xufVxuXG4vKipcbiAqIEhhbmRsZSBhbiBlcnJvciBvciBhbiBlcnJvciBjb250YWluaW5nIGFuIEhUVFAgcmVzcG9uc2UgYW5kIHVzZSBpdCB0byB0aHJvdyBhIHdlbGwtZm9ybWVkIGVycm9yIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlUmVzcG9uc2VFcnJvcihlOiBFcnJvciAmIHsgcmVzcG9uc2U/OiBzdXBlcmFnZW50LlJlc3BvbnNlIH0pOiBuZXZlciB7XG4gIGlmIChlLnJlc3BvbnNlKSB7XG4gICAgdGhyb3cgZXJyRnJvbVJlc3BvbnNlKGUucmVzcG9uc2UpO1xuICB9XG4gIHRocm93IGU7XG59XG5cbi8qKlxuICogVGhlcmUgYXJlIG1hbnkgd2F5cyBhIHJlcXVlc3QgY2FuIGZhaWwsIGFuZCBtYXkgd2F5cyBpbmZvcm1hdGlvbiBvbiB0aGF0IGZhaWx1cmUgY2FuIGJlXG4gKiBjb21tdW5pY2F0ZWQgdG8gdGhlIGNsaWVudC4gVGhpcyBmdW5jdGlvbiB0cmllcyB0byBoYW5kbGUgdGhvc2UgY2FzZXMgYW5kIGNyZWF0ZSBhIHNhbmUgZXJyb3Igc3RyaW5nXG4gKiBAcGFyYW0gcmVzIFJlc3BvbnNlIGZyb20gYW4gSFRUUCByZXF1ZXN0XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlRXJyb3JTdHJpbmcocmVzOiBzdXBlcmFnZW50LlJlc3BvbnNlKTogc3RyaW5nIHtcbiAgbGV0IGVyclN0cmluZyA9IHJlcy5zdGF0dXMudG9TdHJpbmcoKTsgLy8gYXQgdGhlIHZlcnkgbGVhc3Qgd2UnbGwgaGF2ZSB0aGUgc3RhdHVzIGNvZGVcbiAgaWYgKHJlcy5ib2R5Py5lcnJvcikge1xuICAgIC8vIHRoaXMgaXMgdGhlIGNhc2Ugd2UgaG9wZSBmb3IsIHdoZXJlIHRoZSBzZXJ2ZXIgZ2l2ZXMgdXMgYSBuaWNlIGVycm9yIGZyb20gdGhlIEpTT04gYm9keVxuICAgIGVyclN0cmluZyA9IHJlcy5ib2R5LmVycm9yO1xuICB9IGVsc2UgaWYgKHJlcy50ZXh0KSB7XG4gICAgLy8gaWYgdGhlIHJlc3BvbnNlIGNhbWUgYmFjayBhcyB0ZXh0LCB3ZSB0cnkgdG8gcGFyc2UgaXQgYXMgSFRNTCBhbmQgcmVtb3ZlIGFsbCB0YWdzLCBsZWF2aW5nIHVzXG4gICAgLy8ganVzdCB0aGUgYmFyZSB0ZXh0LCB3aGljaCB3ZSB0aGVuIHRyaW0gb2YgZXhjZXNzaXZlIG5ld2xpbmVzIGFuZCBsaW1pdCB0byBhIGNlcnRhaW4gbGVuZ3RoXG4gICAgdHJ5IHtcbiAgICAgIGxldCBzYW5pdGl6ZWRUZXh0ID0gc2FuaXRpemVIdG1sKHJlcy50ZXh0LCB7IGFsbG93ZWRUYWdzOiBbXSB9KTtcbiAgICAgIHNhbml0aXplZFRleHQgPSBzYW5pdGl6ZWRUZXh0LnRyaW0oKTtcbiAgICAgIHNhbml0aXplZFRleHQgPSBlb2wubGYoc2FuaXRpemVkVGV4dCk7IC8vIHVzZSAnXFxuJyBmb3IgYWxsIG5ld2xpbmVzXG4gICAgICBzYW5pdGl6ZWRUZXh0ID0gXy5yZXBsYWNlKHNhbml0aXplZFRleHQsIC9cXG5bIHxcXHRdezEsfVxcbi9nLCAnXFxuXFxuJyk7IC8vIHJlbW92ZSB0aGUgc3BhY2VzL3RhYnMgYmV0d2VlbiBuZXdsaW5lc1xuICAgICAgc2FuaXRpemVkVGV4dCA9IF8ucmVwbGFjZShzYW5pdGl6ZWRUZXh0LCAvW1xcbl17Myx9L2csICdcXG5cXG4nKTsgLy8gaGF2ZSBhdCBtb3N0IDIgY29uc2VjdXRpdmUgbmV3bGluZXNcbiAgICAgIHNhbml0aXplZFRleHQgPSBzYW5pdGl6ZWRUZXh0LnN1YnN0cmluZygwLCA1MDAwKTsgLy8gcHJldmVudCBtZXNzYWdlIGZyb20gZ2V0dGluZyB0b28gbGFyZ2VcbiAgICAgIGVyclN0cmluZyA9IGVyclN0cmluZyArICdcXG4nICsgc2FuaXRpemVkVGV4dDsgLy8gYWRkIGl0IHRvIG91ciBleGlzdGluZyBlcnJTdHJpbmcgKGF0IHRoaXMgcG9pbnQgdGhlIG1vcmUgaW5mbyB0aGUgYmV0dGVyISlcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBkbyBub3RoaW5nLCB0aGUgcmVzcG9uc2UncyBIVE1MIHdhcyB0b28gd2Fja3kgdG8gYmUgcGFyc2VkIGNsZWFubHlcbiAgICAgIGRlYnVnKCdnb3QgZXJyb3Igd2l0aCBtZXNzYWdlIFwiJXNcIiB3aGlsZSBjcmVhdGluZyByZXNwb25zZSBlcnJvciBzdHJpbmcgZnJvbSByZXNwb25zZTogJXMnLCBlLm1lc3NhZ2UsIHJlcy50ZXh0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXJyU3RyaW5nO1xufVxuXG4vKipcbiAqIFNlcmlhbGl6ZSByZXF1ZXN0IGRhdGEgYmFzZWQgb24gdGhlIHJlcXVlc3QgY29udGVudCB0eXBlLlxuICpcbiAqIE11bHRpcGFydCByZXF1ZXN0cyAoYnVpbHQgd2l0aCBzdXBlcmFnZW50J3MgYC5maWVsZCgpYC9gLmF0dGFjaCgpYCkgcG9wdWxhdGVcbiAqIGByZXEuX2Zvcm1EYXRhYCByYXRoZXIgdGhhbiBgcmVxLl9kYXRhYC4gRm9yIHRob3NlLCByZXR1cm4gdGhlIGZpbmFsIG11bHRpcGFydFxuICogYm9keSBhcyBhIEJ1ZmZlciBzbyB0aGUgSE1BQyBpcyBjb21wdXRlZCBvdmVyIHRoZSBleGFjdCBieXRlcyBzdXBlcmFnZW50IHdpbGxcbiAqIHRyYW5zbWl0LiBgQnVmZmVyI3RvU3RyaW5nKCd1dGY4JylgIG11c3QgTk9UIGJlIHVzZWQgaGVyZTogcmF3IGZpbGUgY29udGVudFxuICogKGUuZy4gSlBFRyBieXRlcykgY29udGFpbnMgaW52YWxpZCBVVEYtOCBzZXF1ZW5jZXMgdGhhdCB3b3VsZCBiZSByZXBsYWNlZCB3aXRoXG4gKiBVK0ZGRkQgYW5kIGNvcnJ1cHQgdGhlIGhhc2guXG4gKlxuICogT3RoZXJ3aXNlOlxuICogSWYgZGF0YSBpcyBhbHJlYWR5IGEgc3RyaW5nLCByZXR1cm5zIGl0IGFzLWlzIHRvIHByZXNlcnZlIGV4YWN0IGJ5dGVzIGZvciBITUFDLlxuICogSWYgZGF0YSBpcyBhIEJ1ZmZlciwgY29udmVydHMgdG8gVVRGLTggc3RyaW5nLlxuICogSWYgZGF0YSBpcyBhbiBvYmplY3QsIHNlcmlhbGl6ZXMgaXQgYmFzZWQgb24gQ29udGVudC1UeXBlLlxuICogQHBhcmFtIHJlcVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplUmVxdWVzdERhdGEocmVxOiBzdXBlcmFnZW50LlJlcXVlc3QpOiBzdHJpbmcgfCBCdWZmZXIgfCB1bmRlZmluZWQge1xuICAvLyBgX2Zvcm1EYXRhYCBpcyBjcmVhdGVkIGxhemlseSBieSBzdXBlcmFnZW50J3MgYC5maWVsZCgpYC9gLmF0dGFjaCgpYCBhbmQgaXMgYW5cbiAgLy8gaW5zdGFuY2Ugb2YgdGhlIGBmb3JtLWRhdGFgIHBhY2thZ2UncyBGb3JtRGF0YSwgd2hpY2ggZXhwb3NlcyBhIHN5bmNocm9ub3VzXG4gIC8vIGBnZXRCdWZmZXIoKWAgcmV0dXJuaW5nIHRoZSBleGFjdCBtdWx0aXBhcnQgYm9keSAoYm91bmRhcnkgKyBjb250ZW50KSBhcyBhXG4gIC8vIEJ1ZmZlci4gVGhpcyBydW5zIGFmdGVyIGFsbCBgLmF0dGFjaCgpYC9gLmZpZWxkKClgIGNhbGxzIChzZWUgcmVxdWVzdFBhdGNoKS5cbiAgY29uc3QgZm9ybURhdGEgPSAocmVxIGFzIHsgX2Zvcm1EYXRhPzogeyBnZXRCdWZmZXI/OiAoKSA9PiBCdWZmZXIgfSB9KS5fZm9ybURhdGE7XG4gIGlmIChmb3JtRGF0YSAmJiB0eXBlb2YgZm9ybURhdGEuZ2V0QnVmZmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGZvcm1EYXRhLmdldEJ1ZmZlcigpO1xuICB9XG5cbiAgY29uc3QgZGF0YTogc3RyaW5nIHwgQnVmZmVyIHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQgPSAocmVxIGFzIGFueSkuX2RhdGE7XG5cbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihkYXRhKSkge1xuICAgIC8vIENvbnZlcnQgQnVmZmVyIHRvIFVURi04IHN0cmluZyBhbmQgbXV0YXRlIF9kYXRhIHRvIGVuc3VyZSBjb25zaXN0ZW5jeS5cbiAgICAvLyBUaGlzIGlzIGNyaXRpY2FsOiBpZiBfZGF0YSBzdGF5cyBhcyBhIEJ1ZmZlciwgc3VwZXJhZ2VudCB3aWxsIHNlcmlhbGl6ZSBpdFxuICAgIC8vIGFzIEpTT04gKHtcInR5cGVcIjpcIkJ1ZmZlclwiLFwiZGF0YVwiOlsuLi5dfSksIHdoaWNoIHdvbid0IG1hdGNoIHRoZSBITUFDLlxuICAgIC8vIEJ5IG11dGF0aW5nIHRvIHN0cmluZywgc3VwZXJhZ2VudCBzZW5kcyB0aGUgZXhhY3QgYnl0ZXMgd2UgaGFzaC5cbiAgICAvLyBUaGlzIGlzIHNhZmUgZm9yIHJldHJpZXM6IGNhbGxpbmcgYWdhaW4gd2l0aCBhIHN0cmluZyB3aWxsIGhpdCB0aGUgZWFybHkgcmV0dXJuIGFib3ZlLlxuICAgIGNvbnN0IHN0cmluZ0RhdGEgPSBkYXRhLnRvU3RyaW5nKCd1dGY4Jyk7XG4gICAgKHJlcSBhcyBhbnkpLl9kYXRhID0gc3RyaW5nRGF0YTtcbiAgICByZXR1cm4gc3RyaW5nRGF0YTtcbiAgfVxuXG4gIGlmIChkYXRhID09PSB1bmRlZmluZWQgfHwgZGF0YSA9PT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyBTZXJpYWxpemUgb2JqZWN0IGRhdGEgYmFzZWQgb24gQ29udGVudC1UeXBlXG4gIGxldCBjb250ZW50VHlwZSA9IHJlcS5nZXQoJ0NvbnRlbnQtVHlwZScpO1xuICAvLyBQYXJzZSBvdXQganVzdCB0aGUgY29udGVudCB0eXBlIGZyb20gdGhlIGhlYWRlciAoaWdub3JlIHRoZSBjaGFyc2V0KVxuICBpZiAoY29udGVudFR5cGUpIHtcbiAgICBjb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlLnNwbGl0KCc7JylbMF0udHJpbSgpO1xuICB9XG4gIGxldCBzZXJpYWxpemU6ICgoYm9keTogdW5rbm93bikgPT4gc3RyaW5nKSB8IHVuZGVmaW5lZDtcbiAgY29uc3Qgc2VyaWFsaXplcnMgPSBzdXBlcmFnZW50LnNlcmlhbGl6ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgaWYgKGNvbnRlbnRUeXBlKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZXJpYWxpemVycywgY29udGVudFR5cGUpKSB7XG4gICAgICBjb25zdCBjYW5kaWRhdGUgPSBzZXJpYWxpemVyc1tjb250ZW50VHlwZV07XG4gICAgICBpZiAodHlwZW9mIGNhbmRpZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBzZXJpYWxpemUgPSBjYW5kaWRhdGUgYXMgKGJvZHk6IHVua25vd24pID0+IHN0cmluZztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKC9bXFwvK11qc29uXFxiLy50ZXN0KGNvbnRlbnRUeXBlKSkge1xuICAgICAgLy8gRmFsbCBiYWNrIHRvIHRoZSBidWlsdC1pbiBKU09OIHNlcmlhbGl6ZXIgZm9yIEpTT04tbGlrZSBjb250ZW50IHR5cGVzXG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNlcmlhbGl6ZXJzLCAnYXBwbGljYXRpb24vanNvbicpKSB7XG4gICAgICAgIGNvbnN0IGpzb25TZXJpYWxpemVyID0gc2VyaWFsaXplcnNbJ2FwcGxpY2F0aW9uL2pzb24nXTtcbiAgICAgICAgaWYgKHR5cGVvZiBqc29uU2VyaWFsaXplciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHNlcmlhbGl6ZSA9IGpzb25TZXJpYWxpemVyIGFzIChib2R5OiB1bmtub3duKSA9PiBzdHJpbmc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoc2VyaWFsaXplKSB7XG4gICAgY29uc3Qgc2VyaWFsaXplZCA9IHNlcmlhbGl6ZShkYXRhKTtcbiAgICAocmVxIGFzIGFueSkuX2RhdGEgPSBzZXJpYWxpemVkO1xuICAgIHJldHVybiBzZXJpYWxpemVkO1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIHN1cGVyYWdlbnQgcXVlcnkgc3RyaW5nIGNvcnJlY3RseSBmb3IgYnJvd3NlcnMgb3Igbm9kZS5cbiAqIEBwYXJhbSByZXFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFJlcXVlc3RRdWVyeVN0cmluZyhyZXE6IHN1cGVyYWdlbnQuU3VwZXJBZ2VudFJlcXVlc3QpOiB2b2lkIHtcbiAgY29uc3QgdXJsRGV0YWlscyA9IHVybExpYi5wYXJzZShyZXEudXJsKTtcblxuICBsZXQgcXVlcnlTdHJpbmc6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgY29uc3QgcXVlcnk6IHN0cmluZ1tdID0gKHJlcSBhcyBhbnkpLl9xdWVyeTtcbiAgY29uc3QgcXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSAocmVxIGFzIGFueSkucXM7XG4gIGlmIChxdWVyeSAmJiBxdWVyeS5sZW5ndGggPiAwKSB7XG4gICAgLy8gYnJvd3NlciB2ZXJzaW9uXG4gICAgcXVlcnlTdHJpbmcgPSBxdWVyeS5qb2luKCcmJyk7XG4gICAgKHJlcSBhcyBhbnkpLl9xdWVyeSA9IFtdO1xuICB9IGVsc2UgaWYgKHFzKSB7XG4gICAgLy8gbm9kZSB2ZXJzaW9uXG4gICAgcXVlcnlTdHJpbmcgPSBxdWVyeXN0cmluZy5zdHJpbmdpZnkocXMpO1xuICAgIChyZXEgYXMgYW55KS5xcyA9IG51bGw7XG4gIH1cblxuICBpZiAocXVlcnlTdHJpbmcpIHtcbiAgICBpZiAodXJsRGV0YWlscy5zZWFyY2gpIHtcbiAgICAgIHVybERldGFpbHMuc2VhcmNoICs9ICcmJyArIHF1ZXJ5U3RyaW5nO1xuICAgIH0gZWxzZSB7XG4gICAgICB1cmxEZXRhaWxzLnNlYXJjaCA9ICc/JyArIHF1ZXJ5U3RyaW5nO1xuICAgIH1cbiAgICByZXEudXJsID0gdXJsTGliLmZvcm1hdCh1cmxEZXRhaWxzKTtcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIGEgY29tcGxldGVkIHZlcmlmaWNhdGlvbiByZXNwb25zZSBhbmQgdGhyb3cgYSBkZXNjcmlwdGl2ZSBgQXBpUmVzcG9uc2VFcnJvcmAgaWYgaXRcbiAqIGluZGljYXRlcyB0aGUgcmVzcG9uc2UgaXMgaW52YWxpZCBvciBvdXRzaWRlIHRoZSBhY2NlcHRhYmxlIHRpbWUgd2luZG93LlxuICovXG5mdW5jdGlvbiBhc3NlcnRWZXJpZmljYXRpb25SZXNwb25zZShcbiAgYml0Z286IEJpdEdvQVBJLFxuICB0b2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICByZXE6IHN1cGVyYWdlbnQuU3VwZXJBZ2VudFJlcXVlc3QsXG4gIHJlc3BvbnNlOiBzdXBlcmFnZW50LlJlc3BvbnNlLFxuICB2ZXJpZmljYXRpb25SZXNwb25zZTogVmVyaWZ5UmVzcG9uc2VJbmZvXG4pOiB2b2lkIHtcbiAgaWYgKCF2ZXJpZmljYXRpb25SZXNwb25zZS5pc1ZhbGlkKSB7XG4gICAgLy8gTG9nIG9ubHkgdGhlIGZpcnN0IDEwIGNoYXJhY3RlcnMgb2YgdGhlIHRva2VuIHRvIGVuc3VyZSB0aGUgZnVsbCB0b2tlbiBpc24ndCBsb2dnZWQuXG4gICAgY29uc3QgcGFydGlhbEJpdGdvVG9rZW4gPSB0b2tlbiA/IHRva2VuLnN1YnN0cmluZygwLCAxMCkgOiAnJztcbiAgICBjb25zdCBlcnJvckRldGFpbHMgPSB7XG4gICAgICBleHBlY3RlZEhtYWM6IHZlcmlmaWNhdGlvblJlc3BvbnNlLmV4cGVjdGVkSG1hYyxcbiAgICAgIHJlY2VpdmVkSG1hYzogcmVzcG9uc2UuaGVhZGVyLmhtYWMsXG4gICAgICBobWFjSW5wdXQ6IHZlcmlmaWNhdGlvblJlc3BvbnNlLnNpZ25hdHVyZVN1YmplY3QsXG4gICAgICByZXF1ZXN0VG9rZW46IHJlcS5hdXRoZW50aWNhdGlvblRva2VuLFxuICAgICAgYml0Z29Ub2tlbjogcGFydGlhbEJpdGdvVG9rZW4sXG4gICAgfTtcbiAgICBkZWJ1ZygnSW52YWxpZCByZXNwb25zZSBITUFDOiAlTycsIGVycm9yRGV0YWlscyk7XG4gICAgdGhyb3cgbmV3IEFwaVJlc3BvbnNlRXJyb3IoJ2ludmFsaWQgcmVzcG9uc2UgSE1BQycsIDUxMSwgZXJyb3JEZXRhaWxzKTtcbiAgfVxuXG4gIGlmIChiaXRnby5nZXRBdXRoVmVyc2lvbigpID09PSAzICYmICF2ZXJpZmljYXRpb25SZXNwb25zZS5pc0luUmVzcG9uc2VWYWxpZGl0eVdpbmRvdykge1xuICAgIGNvbnN0IGVycm9yRGV0YWlscyA9IHtcbiAgICAgIHRpbWVzdGFtcDogcmVzcG9uc2UuaGVhZGVyLnRpbWVzdGFtcCxcbiAgICAgIHZlcmlmaWNhdGlvblRpbWU6IHZlcmlmaWNhdGlvblJlc3BvbnNlLnZlcmlmaWNhdGlvblRpbWUsXG4gICAgfTtcbiAgICBkZWJ1ZygnU2VydmVyIHJlc3BvbnNlIG91dHNpZGUgcmVzcG9uc2UgdmFsaWRpdHkgdGltZSB3aW5kb3c6ICVPJywgZXJyb3JEZXRhaWxzKTtcbiAgICB0aHJvdyBuZXcgQXBpUmVzcG9uc2VFcnJvcignc2VydmVyIHJlc3BvbnNlIG91dHNpZGUgcmVzcG9uc2UgdmFsaWRpdHkgdGltZSB3aW5kb3cnLCA1MTEsIGVycm9yRGV0YWlscyk7XG4gIH1cbn1cblxuLyoqXG4gKiBWZXJpZnkgdGhhdCB0aGUgcmVzcG9uc2UgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyIGlzIHNpZ25lZCBjb3JyZWN0bHkuXG4gKiBSaWdodCBub3csIGl0IGlzIHZlcnkgcGVybWlzc2l2ZSB3aXRoIHRoZSB0aW1lc3RhbXAgdmFyaWFuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2ZXJpZnlSZXNwb25zZShcbiAgYml0Z286IEJpdEdvQVBJLFxuICB0b2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBtZXRob2Q6IFZlcmlmeVJlc3BvbnNlT3B0aW9uc1snbWV0aG9kJ10sXG4gIHJlcTogc3VwZXJhZ2VudC5TdXBlckFnZW50UmVxdWVzdCxcbiAgcmVzcG9uc2U6IHN1cGVyYWdlbnQuUmVzcG9uc2UsXG4gIGF1dGhWZXJzaW9uOiBBdXRoVmVyc2lvblxuKTogc3VwZXJhZ2VudC5SZXNwb25zZSB7XG4gIGlmICghcmVxLmlzVjJBdXRoZW50aWNhdGVkIHx8ICFyZXEuYXV0aGVudGljYXRpb25Ub2tlbikge1xuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIGNvbnN0IHZlcmlmaWNhdGlvblJlc3BvbnNlID0gYml0Z28udmVyaWZ5UmVzcG9uc2Uoe1xuICAgIHVybDogcmVxLnVybCxcbiAgICBobWFjOiByZXNwb25zZS5oZWFkZXIuaG1hYyxcbiAgICBzdGF0dXNDb2RlOiByZXNwb25zZS5zdGF0dXMsXG4gICAgdGV4dDogcmVzcG9uc2UudGV4dCxcbiAgICB0aW1lc3RhbXA6IHJlc3BvbnNlLmhlYWRlci50aW1lc3RhbXAsXG4gICAgdG9rZW46IHJlcS5hdXRoZW50aWNhdGlvblRva2VuLFxuICAgIG1ldGhvZCxcbiAgICBhdXRoVmVyc2lvbixcbiAgfSk7XG5cbiAgYXNzZXJ0VmVyaWZpY2F0aW9uUmVzcG9uc2UoYml0Z28sIHRva2VuLCByZXEsIHJlc3BvbnNlLCB2ZXJpZmljYXRpb25SZXNwb25zZSk7XG4gIHJldHVybiByZXNwb25zZTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZlcmlmeVJlc3BvbnNlQXN5bmMoXG4gIGJpdGdvOiBCaXRHb0FQSSxcbiAgdG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgbWV0aG9kOiBWZXJpZnlSZXNwb25zZU9wdGlvbnNbJ21ldGhvZCddLFxuICByZXE6IHN1cGVyYWdlbnQuU3VwZXJBZ2VudFJlcXVlc3QsXG4gIHJlc3BvbnNlOiBzdXBlcmFnZW50LlJlc3BvbnNlLFxuICBhdXRoVmVyc2lvbjogQXV0aFZlcnNpb25cbik6IFByb21pc2U8c3VwZXJhZ2VudC5SZXNwb25zZT4ge1xuICBpZiAoIXJlcS5pc1YyQXV0aGVudGljYXRlZCB8fCAhcmVxLmF1dGhlbnRpY2F0aW9uVG9rZW4pIHtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICBjb25zdCB2ZXJpZmljYXRpb25SZXNwb25zZSA9IGF3YWl0IGJpdGdvLnZlcmlmeVJlc3BvbnNlQXN5bmMoe1xuICAgIHVybDogcmVxLnVybCxcbiAgICBobWFjOiByZXNwb25zZS5oZWFkZXIuaG1hYyxcbiAgICBzdGF0dXNDb2RlOiByZXNwb25zZS5zdGF0dXMsXG4gICAgdGV4dDogcmVzcG9uc2UudGV4dCxcbiAgICB0aW1lc3RhbXA6IHJlc3BvbnNlLmhlYWRlci50aW1lc3RhbXAsXG4gICAgdG9rZW46IHJlcS5hdXRoZW50aWNhdGlvblRva2VuLFxuICAgIG1ldGhvZCxcbiAgICBhdXRoVmVyc2lvbixcbiAgfSk7XG5cbiAgYXNzZXJ0VmVyaWZpY2F0aW9uUmVzcG9uc2UoYml0Z28sIHRva2VuLCByZXEsIHJlc3BvbnNlLCB2ZXJpZmljYXRpb25SZXNwb25zZSk7XG4gIHJldHVybiByZXNwb25zZTtcbn1cbiJdfQ==