@bitgo/sdk-api 2.4.0 → 2.4.2

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.
@@ -33,8 +33,10 @@ export declare function encrypt(password: string, plaintext: string, options?: {
33
33
  *
34
34
  * `native` defaults to the module's `decryptV1` but is exposed as a parameter
35
35
  * so tests can inject a throwing version to exercise the fallback path.
36
+ * `isBrowser` defaults to a real runtime check but is exposed so tests can
37
+ * exercise the browser-only branch under Node.
36
38
  */
37
- export declare function decryptV1WithFallback(password: string, ciphertext: string, native?: (pw: string, ct: string) => Promise<string>): Promise<string>;
39
+ export declare function decryptV1WithFallback(password: string, ciphertext: string, native?: (pw: string, ct: string) => Promise<string>, isBrowser?: boolean): Promise<string>;
38
40
  /**
39
41
  * Auto-detect v1 (PBKDF2-SHA256 + AES-CCM) or v2 (Argon2id + AES-256-GCM)
40
42
  * from the envelope `v` field and decrypt.
@@ -1 +1 @@
1
- {"version":3,"file":"encrypt.d.ts","sourceRoot":"","sources":["../../src/encrypt.ts"],"names":[],"mappings":"AAMA;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,MAAM,EAAE,GAAG,MAAM,CAKjE;AAiCD;;;;;GAKG;AACH,wBAAsB,OAAO,CAC3B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,iBAAiB,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;CAAE,GAClF,OAAO,CAAC,MAAM,CAAC,CAKjB;AAaD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,MAAM,GAAE,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAa,GAC9D,OAAO,CAAC,MAAM,CAAC,CAmBjB;AAED;;;GAGG;AACH,wBAAsB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBnF"}
1
+ {"version":3,"file":"encrypt.d.ts","sourceRoot":"","sources":["../../src/encrypt.ts"],"names":[],"mappings":"AAiCA;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,MAAM,EAAE,GAAG,MAAM,CAKjE;AAiCD;;;;;GAKG;AACH,wBAAsB,OAAO,CAC3B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,iBAAiB,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;CAAE,GAClF,OAAO,CAAC,MAAM,CAAC,CAKjB;AAaD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,MAAM,GAAE,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAa,EAC/D,SAAS,GAAE,OAA0B,GACpC,OAAO,CAAC,MAAM,CAAC,CAuBjB;AAED;;;GAGG;AACH,wBAAsB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBnF"}
@@ -41,6 +41,32 @@ const sjcl = __importStar(require("@bitgo/sjcl"));
41
41
  const crypto_1 = require("crypto");
42
42
  const decryptV1_1 = require("./decryptV1");
43
43
  const encryptV2_1 = require("./encryptV2");
44
+ /**
45
+ * True when running in a bundled browser build. `browserify-aes` -- the AES
46
+ * polyfill webpack substitutes for `node:crypto` in browser bundles -- has no
47
+ * AES-CCM mode at all, so native v1 decrypt fails on literally every call
48
+ * there. There's no point paying for the doomed native attempt (a full
49
+ * PBKDF2 run) before falling back; go straight to SJCL.
50
+ */
51
+ const isBrowserRuntime = typeof window !== 'undefined';
52
+ /**
53
+ * SJCL has no upper bound on `iter`, so a hostile v1 envelope could burn CPU
54
+ * running an inflated PBKDF2. Native decrypt's codec normally catches this
55
+ * before any KDF work runs; the browser path skips native entirely, so it
56
+ * needs this narrow check to preserve the same DoS protection.
57
+ */
58
+ function assertIterWithinCap(ciphertext) {
59
+ let iter;
60
+ try {
61
+ iter = JSON.parse(ciphertext)?.iter;
62
+ }
63
+ catch {
64
+ return; // malformed JSON -- let sjcl.decrypt raise its own error
65
+ }
66
+ if (typeof iter === 'number' && iter > decryptV1_1.V1_MAX_ITER) {
67
+ throw new Error(`v1 decrypt: iter ${iter} exceeds cap of ${decryptV1_1.V1_MAX_ITER}`);
68
+ }
69
+ }
44
70
  /**
45
71
  * convert a 4 element Uint8Array to a 4 byte Number
46
72
  *
@@ -119,8 +145,14 @@ function isIterCapViolation(err) {
119
145
  *
120
146
  * `native` defaults to the module's `decryptV1` but is exposed as a parameter
121
147
  * so tests can inject a throwing version to exercise the fallback path.
148
+ * `isBrowser` defaults to a real runtime check but is exposed so tests can
149
+ * exercise the browser-only branch under Node.
122
150
  */
123
- async function decryptV1WithFallback(password, ciphertext, native = decryptV1_1.decryptV1) {
151
+ async function decryptV1WithFallback(password, ciphertext, native = decryptV1_1.decryptV1, isBrowser = isBrowserRuntime) {
152
+ if (isBrowser) {
153
+ assertIterWithinCap(ciphertext);
154
+ return sjcl.decrypt(password, ciphertext);
155
+ }
124
156
  try {
125
157
  return await native(password, ciphertext);
126
158
  }
@@ -165,4 +197,4 @@ async function decrypt(password, ciphertext) {
165
197
  }
166
198
  return decryptV1WithFallback(password, ciphertext);
167
199
  }
168
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbmNyeXB0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBWUEsa0NBS0M7QUF1Q0QsMEJBU0M7QUE4QkQsc0RBdUJDO0FBTUQsMEJBZ0JDO0FBNUlELGtEQUFvQztBQUNwQyxtQ0FBcUM7QUFFckMsMkNBQXdDO0FBQ3hDLDJDQUFtRDtBQUVuRDs7Ozs7R0FLRztBQUNILFNBQWdCLFdBQVcsQ0FBQyxLQUE2QjtJQUN2RCxJQUFJLENBQUMsQ0FBQyxLQUFLLFlBQVksVUFBVSxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6RCxNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxLQUFLLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzVELENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsU0FBUyxDQUNoQixRQUFnQixFQUNoQixTQUFpQixFQUNqQixPQUF3RDtJQUV4RCxNQUFNLElBQUksR0FBRyxPQUFPLEVBQUUsSUFBSSxJQUFJLElBQUEsb0JBQVcsRUFBQyxDQUFDLENBQUMsQ0FBQztJQUM3QyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUMvRCxNQUFNLEVBQUUsR0FBRyxPQUFPLEVBQUUsRUFBRSxJQUFJLElBQUEsb0JBQVcsRUFBQyxFQUFFLENBQUMsQ0FBQztJQUMxQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssRUFBRTtRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLENBQUMs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TSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN4QyxlQUFlLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFDRCxJQUFJLGVBQWUsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUMxQiwyRUFBMkU7UUFDM0UsT0FBTyxJQUFBLHFCQUFTLEVBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFDRCxJQUFJLGVBQWUsS0FBSyxTQUFTLElBQUksZUFBZSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzNELE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLGVBQWUsRUFBRSxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUNELE9BQU8scUJBQXFCLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ3JELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBzamNsIGZyb20gJ0BiaXRnby9zamNsJztcbmltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSAnY3J5cHRvJztcblxuaW1wb3J0IHsgZGVjcnlwdFYxIH0gZnJvbSAnLi9kZWNyeXB0VjEnO1xuaW1wb3J0IHsgZGVjcnlwdFYyLCBlbmNyeXB0VjIgfSBmcm9tICcuL2VuY3J5cHRWMic7XG5cbi8qKlxuICogY29udmVydCBhIDQgZWxlbWVudCBVaW50OEFycmF5IHRvIGEgNCBieXRlIE51bWJlclxuICpcbiAqIEBwYXJhbSBieXRlc1xuICogQHJldHVybiA0IGJ5dGUgbnVtYmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBieXRlc1RvV29yZChieXRlcz86IFVpbnQ4QXJyYXkgfCBudW1iZXJbXSk6IG51bWJlciB7XG4gIGlmICghKGJ5dGVzIGluc3RhbmNlb2YgVWludDhBcnJheSkgfHwgYnl0ZXMubGVuZ3RoICE9PSA0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdieXRlcyBtdXN0IGJlIGEgVWludDhBcnJheSB3aXRoIGxlbmd0aCA0Jyk7XG4gIH1cbiAgcmV0dXJuIGJ5dGVzLnJlZHVjZSgobnVtLCBieXRlKSA9PiBudW0gKiAweDEwMCArIGJ5dGUsIDApO1xufVxuXG4vKipcbiAqIEludGVybmFsIHYxIChTSkNMIFBCS0RGMi1TSEEyNTYgKyBBRVMtMjU2LUNDTSkgZW5jcnlwdCBoZWxwZXIuXG4gKlxuICogTm90IGV4cG9ydGVkIGFzIHBhcnQgb2YgdGhlIHB1YmxpYyBlbmNyeXB0L2RlY3J5cHQgc3VyZmFjZTogY2FsbGVycyBtdXN0IG5vdCB1c2VcbiAqIHRoaXMgZGlyZWN0bHkuIHYxIG91dHB1dCBpcyByZXF1ZXN0ZWQgdmlhIGBlbmNyeXB0KC4uLiwgeyBlbmNyeXB0aW9uVmVyc2lvbjogMSB9KWAuXG4gKi9cbmZ1bmN0aW9uIGVuY3J5cHRWMShcbiAgcGFzc3dvcmQ6IHN0cmluZyxcbiAgcGxhaW50ZXh0OiBzdHJpbmcsXG4gIG9wdGlvbnM/OiB7IHNhbHQ/OiBCdWZmZXI7IGl2PzogQnVmZmVyOyBhZGF0YT86IHN0cmluZyB9XG4pOiBzdHJpbmcge1xuICBjb25zdCBzYWx0ID0gb3B0aW9ucz8uc2FsdCB8fCByYW5kb21CeXRlcyg4KTtcbiAgaWYgKHNhbHQubGVuZ3RoICE9PSA4KSB0aHJvdyBuZXcgRXJyb3IoJ3NhbHQgbXVzdCBiZSA4IGJ5dGVzJyk7XG4gIGNvbnN0IGl2ID0gb3B0aW9ucz8uaXYgfHwgcmFuZG9tQnl0ZXMoMTYpO1xuICBpZiAoaXYubGVuZ3RoICE9PSAxNikgdGhyb3cgbmV3IEVycm9yKCdpdiBtdXN0IGJlIDE2IGJ5dGVzJyk7XG5cbiAgY29uc3QgZW5jcnlwdE9wdGlvbnM6IHsgaXRlcjogbnVtYmVyOyBrczogbnVtYmVyOyBzYWx0OiBudW1iZXJbXTsgaXY6IG51bWJlcltdOyBhZGF0YT86IHN0cmluZyB9ID0ge1xuICAgIGl0ZXI6IDEwMDAwLFxuICAgIGtzOiAyNTYsXG4gICAgc2FsdDogW2J5dGVzVG9Xb3JkKHNhbHQuc2xpY2UoMCwgNCkpLCBieXRlc1RvV29yZChzYWx0LnNsaWNlKDQpKV0sXG4gICAgaXY6IFtcbiAgICAgIGJ5dGVzVG9Xb3JkKGl2LnNsaWNlKDAsIDQpKSxcbiAgICAgIGJ5dGVzVG9Xb3JkKGl2LnNsaWNlKDQsIDgpKSxcbiAgICAgIGJ5dGVzVG9Xb3JkKGl2LnNsaWNlKDgsIDEyKSksXG4gICAgICBieXRlc1RvV29yZChpdi5zbGljZSgxMiwgMTYpKSxcbiAgICBdLFxuICB9O1xuICBpZiAob3B0aW9ucz8uYWRhdGEpIGVuY3J5cHRPcHRpb25zLmFkYXRhID0gb3B0aW9ucy5hZGF0YTtcbiAgcmV0dXJuIHNqY2wuZW5jcnlwdChwYXNzd29yZCwgcGxhaW50ZXh0LCBlbmNyeXB0T3B0aW9ucyk7XG59XG5cbi8qKlxuICogRW5jcnlwdCBgcGxhaW50ZXh0YCB3aXRoIGBwYXNzd29yZGAuIERlZmF1bHRzIHRvIHYyIChBcmdvbjJpZCArIEFFUy0yNTYtR0NNKS5cbiAqXG4gKiBQYXNzIGBlbmNyeXB0aW9uVmVyc2lvbjogMWAgdG8gcHJvZHVjZSBhIGxlZ2FjeSB2MSAoU0pDTCkgZW52ZWxvcGU7IHRoaXMgaXMgdGhlXG4gKiBvbmx5IHN1cHBvcnRlZCB3YXkgdG8gcmVxdWVzdCB2MSBlbmNyeXB0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5jcnlwdChcbiAgcGFzc3dvcmQ6IHN0cmluZyxcbiAgcGxhaW50ZXh0OiBzdHJpbmcsXG4gIG9wdGlvbnM/OiB7IHNhbHQ/OiBCdWZmZXI7IGl2PzogQnVmZmVyOyBhZGF0YT86IHN0cmluZzsgZW5jcnlwdGlvblZlcnNpb24/OiAxIHwgMiB9XG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBpZiAob3B0aW9ucz8uZW5jcnlwdGlvblZlcnNpb24gPT09IDEpIHtcbiAgICByZXR1cm4gZW5jcnlwdFYxKHBhc3N3b3JkLCBwbGFpbnRleHQsIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBlbmNyeXB0VjIocGFzc3dvcmQsIHBsYWludGV4dCwgeyBhZGF0YTogb3B0aW9ucz8uYWRhdGEgfSk7XG59XG5cbi8qKlxuICogSXRlci1jYXAgdmlvbGF0aW9ucyBhcmUgdGhlIG9ubHkgZXJyb3Igd2UgcmVmdXNlIHRvIGZhbGwgYmFjayBvbjogU0pDTCBoYXNcbiAqIG5vIHVwcGVyIGJvdW5kIG9uIGBpdGVyYCwgc28gZmFsbGluZyB0aHJvdWdoIHRvIGl0IHdvdWxkIGxldCBhIGhvc3RpbGVcbiAqIGVudmVsb3BlIGJ1cm4gQ1BVIHJ1bm5pbmcgYW4gaW5mbGF0ZWQgUEJLREYyLiBFdmVyeXRoaW5nIGVsc2UgLS0gY29kZWNcbiAqIHJlamVjdGlvbiBvZiBhIHNoYXBlIFNKQ0wgd291bGQgYWNjZXB0LCBuYXRpdmUgY3J5cHRvIGJ1ZywgYXV0aC10YWdcbiAqIG1pc21hdGNoIC0tIGlzIHNhZmUgdG8gZmFsbCB0aHJvdWdoIHRvIFNKQ0wuXG4gKi9cbmZ1bmN0aW9uIGlzSXRlckNhcFZpb2xhdGlvbihlcnI6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIGVyciBpbnN0YW5jZW9mIEVycm9yICYmIC9pdGVyOlxccypleHBlY3RlZCBpbnRlZ2VyfGl0ZXIgb3V0IG9mIHJhbmdlL2kudGVzdChlcnIubWVzc2FnZSk7XG59XG5cbi8qKlxuICogdjEgZGVjcnlwdCB3aXRoIGFuIFNKQ0wgc2FmZXR5IG5ldC5cbiAqXG4gKiBEZXNpZ24gaW50ZW50IGR1cmluZyByb2xsb3V0OiB6ZXJvIGZhbHNlIG5lZ2F0aXZlcy4gQW55IG5hdGl2ZSBmYWlsdXJlXG4gKiAoZW52ZWxvcGUgc2hhcGUgb3VyIHN0cmljdGVyIGNvZGVjIHJlamVjdHMsIGZyYW1pbmcgYnVnLCB1bnN1cHBvcnRlZFxuICogYWxnb3JpdGhtLCBhdXRoLXRhZyBtaXNtYXRjaCwgZXRjLikgZmFsbHMgdGhyb3VnaCB0byBgc2pjbC5kZWNyeXB0YCBzbyB0aGVcbiAqIGNhbGxlciBpcyBuZXZlciBibG9ja2VkLiBUaGUgb25seSBleGNlcHRpb24gaXMgYW4gaXRlci1jYXAgdmlvbGF0aW9uLFxuICogd2hpY2ggaXMgcmV0aHJvd24gdG8gcHJlc2VydmUgRG9TIHByb3RlY3Rpb24uXG4gKlxuICogVGhlIGNvbnNvbGUud2FybiBvbmx5IGZpcmVzIHdoZW4gbmF0aXZlIGZhaWxzIEFORCBTSkNMIHN1Y2NlZWRzIC0tIGkuZS5cbiAqIHdoZW4gdGhlIHR3byBlbmdpbmVzIGRpc2FncmVlLCB3aGljaCBpcyB0aGUgb25seSBzaWduYWwgd29ydGhcbiAqIGludmVzdGlnYXRpbmcuIFdyb25nIHBhc3N3b3JkIGZhaWxzIGJvdGggZW5naW5lcyBzaWxlbnRseSBhbmQgc3VyZmFjZXNcbiAqIFNKQ0wncyBhdXRoIGVycm9yIChtYXBwZWQgdXBzdHJlYW0gdG8gXCJpbmNvcnJlY3QgcGFzc3dvcmRcIikuXG4gKlxuICogYG5hdGl2ZWAgZGVmYXVsdHMgdG8gdGhlIG1vZHVsZSdzIGBkZWNyeXB0VjFgIGJ1dCBpcyBleHBvc2VkIGFzIGEgcGFyYW1ldGVyXG4gKiBzbyB0ZXN0cyBjYW4gaW5qZWN0IGEgdGhyb3dpbmcgdmVyc2lvbiB0byBleGVyY2lzZSB0aGUgZmFsbGJhY2sgcGF0aC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlY3J5cHRWMVdpdGhGYWxsYmFjayhcbiAgcGFzc3dvcmQ6IHN0cmluZyxcbiAgY2lwaGVydGV4dDogc3RyaW5nLFxuICBuYXRpdmU6IChwdzogc3RyaW5nLCBjdDogc3RyaW5nKSA9PiBQcm9taXNlPHN0cmluZz4gPSBkZWNyeXB0VjFcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IG5hdGl2ZShwYXNzd29yZCwgY2lwaGVydGV4dCk7XG4gIH0gY2F0Y2ggKG5hdGl2ZUVycikge1xuICAgIGlmIChpc0l0ZXJDYXBWaW9sYXRpb24obmF0aXZlRXJyKSkgdGhyb3cgbmF0aXZlRXJyO1xuICAgIGxldCByZXN1bHQ6IHN0cmluZztcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gc2pjbC5kZWNyeXB0KHBhc3N3b3JkLCBjaXBoZXJ0ZXh0KTtcbiAgICB9IGNhdGNoIChzamNsRXJyKSB7XG4gICAgICAvLyBCb3RoIGVuZ2luZXMgcmVqZWN0ZWQgLS0gYWxtb3N0IGNlcnRhaW5seSBhIHJlYWwgYXV0aCBmYWlsdXJlLlxuICAgICAgLy8gUmV0aHJvdyBTSkNMJ3MgZXJyb3Igc28gQml0R29BUEkuZGVjcnlwdCBtYXBzIGl0IHRvIFwiaW5jb3JyZWN0IHBhc3N3b3JkXCIuXG4gICAgICB0aHJvdyBzamNsRXJyO1xuICAgIH1cbiAgICAvLyBOYXRpdmUgZmFpbGVkIGJ1dCBTSkNMIHN1Y2NlZWRlZCAtLSByZWFsIHNpZ25hbCwgbG9nIGZvciB0aGUgb3BlcmF0b3IuXG4gICAgY29uc3QgbWVzc2FnZSA9IG5hdGl2ZUVyciBpbnN0YW5jZW9mIEVycm9yID8gbmF0aXZlRXJyLm1lc3NhZ2UgOiBTdHJpbmcobmF0aXZlRXJyKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUud2FybignW2JpdGdvLXNka10gdjEgbmF0aXZlIGRlY3J5cHQgZmFpbGVkOyBTSkNMIGZhbGxiYWNrIHN1Y2NlZWRlZDonLCBtZXNzYWdlKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogQXV0by1kZXRlY3QgdjEgKFBCS0RGMi1TSEEyNTYgKyBBRVMtQ0NNKSBvciB2MiAoQXJnb24yaWQgKyBBRVMtMjU2LUdDTSlcbiAqIGZyb20gdGhlIGVudmVsb3BlIGB2YCBmaWVsZCBhbmQgZGVjcnlwdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlY3J5cHQocGFzc3dvcmQ6IHN0cmluZywgY2lwaGVydGV4dDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgbGV0IGVudmVsb3BlVmVyc2lvbjogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIGNvbnN0IGVudmVsb3BlID0gSlNPTi5wYXJzZShjaXBoZXJ0ZXh0KTtcbiAgICBlbnZlbG9wZVZlcnNpb24gPSBlbnZlbG9wZS52O1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2RlY3J5cHQ6IGNpcGhlcnRleHQgaXMgbm90IHZhbGlkIEpTT04nKTtcbiAgfVxuICBpZiAoZW52ZWxvcGVWZXJzaW9uID09PSAyKSB7XG4gICAgLy8gRG8gbm90IGNhdGNoOiB3cm9uZyBwYXNzd29yZCBvbiB2MiBtdXN0IG5vdCBzaWxlbnRseSBmYWxsIHRocm91Z2ggdG8gdjEuXG4gICAgcmV0dXJuIGRlY3J5cHRWMihwYXNzd29yZCwgY2lwaGVydGV4dCk7XG4gIH1cbiAgaWYgKGVudmVsb3BlVmVyc2lvbiAhPT0gdW5kZWZpbmVkICYmIGVudmVsb3BlVmVyc2lvbiAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgZGVjcnlwdDogdW5rbm93biBlbnZlbG9wZSB2ZXJzaW9uICR7ZW52ZWxvcGVWZXJzaW9ufWApO1xuICB9XG4gIHJldHVybiBkZWNyeXB0VjFXaXRoRmFsbGJhY2socGFzc3dvcmQsIGNpcGhlcnRleHQpO1xufVxuIl19
200
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbmNyeXB0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUNBLGtDQUtDO0FBdUNELDBCQVNDO0FBZ0NELHNEQTRCQztBQU1ELDBCQWdCQztBQTlLRCxrREFBb0M7QUFDcEMsbUNBQXFDO0FBRXJDLDJDQUFxRDtBQUNyRCwyQ0FBbUQ7QUFFbkQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLE1BQU0sS0FBSyxXQUFXLENBQUM7QUFFdkQ7Ozs7O0dBS0c7QUFDSCxTQUFTLG1CQUFtQixDQUFDLFVBQWtCO0lBQzdDLElBQUksSUFBYSxDQUFDO0lBQ2xCLElBQUksQ0FBQztRQUNILElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFLElBQUksQ0FBQztJQUN0QyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxDQUFDLHlEQUF5RDtJQUNuRSxDQUFDO0lBQ0QsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxHQUFHLHVCQUFXLEVBQUUsQ0FBQztRQUNuRCxNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixJQUFJLG1CQUFtQix1QkFBVyxFQUFFLENBQUMsQ0FBQztJQUM1RSxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsV0FBVyxDQUFDLEtBQTZCO0lBQ3ZELElBQUksQ0FBQyxDQUFDLEtBQUssWUFBWSxVQUFVLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3pELE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLEtBQUssR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDNUQsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxTQUFTLENBQ2hCLFFBQWdCLEVBQ2hCLFNBQWlCLEVBQ2pCLE9BQXdEO0lBRXhELE1BQU0sSUFBSSxHQUFHLE9BQU8sRUFBRSxJQUFJLElBQUksSUFBQSxvQkFBVyxFQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdDLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQy9ELE1BQU0sRUFBRSxHQUFHLE9BQU8sRUFBRSxFQUFFLElBQUksSUFBQSxvQkFBVyxFQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzFDLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxFQUFFO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBRTdELE1BQU0sY0FBYyxHQUErRTtRQUNqRyxJQUFJLEVBQUUsS0FBSztRQUNYLEVBQUUsRUFBRSxHQUFHO1FBQ1AsSUFBSSxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqRSxFQUFFLEVBQUU7WUFDRixXQUFXLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDM0IsV0FBVyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzNCLFdBQVcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM1QixXQUFXLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDOUI7S0FDRixDQUFDO0lBQ0YsSUFBSSxPQUFPLEVBQUUsS0FBSztRQUFFLGNBQWMsQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUN6RCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxjQUFjLENBQUMsQ0FBQztBQUMzRCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSSxLQUFLLFVBQVUsT0FBTyxDQUMzQixRQUFnQixFQUNoQixTQUFpQixFQUNqQixPQUFtRjtJQUVuRixJQUFJLE9BQU8sRUFBRSxpQkFBaUIsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNyQyxPQUFPLFNBQVMsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFDRCxPQUFPLElBQUEscUJBQVMsRUFBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQ25FLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLGtCQUFrQixDQUFDLEdBQVk7SUFDdEMsT0FBTyxHQUFHLFlBQVksS0FBSyxJQUFJLDZDQUE2QyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDakcsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSSxLQUFLLFVBQVUscUJBQXFCLENBQ3pDLFFBQWdCLEVBQ2hCLFVBQWtCLEVBQ2xCLFNBQXNELHFCQUFTLEVBQy9ELFlBQXFCLGdCQUFnQjtJQUVyQyxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQ2QsbUJBQW1CLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBQ0QsSUFBSSxDQUFDO1FBQ0gsT0FBTyxNQUFNLE1BQU0sQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUFDLE9BQU8sU0FBUyxFQUFFLENBQUM7UUFDbkIsSUFBSSxrQkFBa0IsQ0FBQyxTQUFTLENBQUM7WUFBRSxNQUFNLFNBQVMsQ0FBQztRQUNuRCxJQUFJLE1BQWMsQ0FBQztRQUNuQixJQUFJLENBQUM7WUFDSCxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUFDLE9BQU8sT0FBTyxFQUFFLENBQUM7WUFDakIsaUVBQWlFO1lBQ2pFLDRFQUE0RTtZQUM1RSxNQUFNLE9BQU8sQ0FBQztRQUNoQixDQUFDO1FBQ0QseUVBQXlFO1FBQ3pFLE1BQU0sT0FBTyxHQUFHLFNBQVMsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNuRixzQ0FBc0M7UUFDdEMsT0FBTyxDQUFDLElBQUksQ0FBQyxnRUFBZ0UsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN4RixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7R0FHRztBQUNJLEtBQUssVUFBVSxPQUFPLENBQUMsUUFBZ0IsRUFBRSxVQUFrQjtJQUNoRSxJQUFJLGVBQW1DLENBQUM7SUFDeEMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN4QyxlQUFlLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFDRCxJQUFJLGVBQWUsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUMxQiwyRUFBMkU7UUFDM0UsT0FBTyxJQUFBLHFCQUFTLEVBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFDRCxJQUFJLGVBQWUsS0FBSyxTQUFTLElBQUksZUFBZSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzNELE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLGVBQWUsRUFBRSxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUNELE9BQU8scUJBQXFCLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ3JELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBzamNsIGZyb20gJ0BiaXRnby9zamNsJztcbmltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSAnY3J5cHRvJztcblxuaW1wb3J0IHsgZGVjcnlwdFYxLCBWMV9NQVhfSVRFUiB9IGZyb20gJy4vZGVjcnlwdFYxJztcbmltcG9ydCB7IGRlY3J5cHRWMiwgZW5jcnlwdFYyIH0gZnJvbSAnLi9lbmNyeXB0VjInO1xuXG4vKipcbiAqIFRydWUgd2hlbiBydW5uaW5nIGluIGEgYnVuZGxlZCBicm93c2VyIGJ1aWxkLiBgYnJvd3NlcmlmeS1hZXNgIC0tIHRoZSBBRVNcbiAqIHBvbHlmaWxsIHdlYnBhY2sgc3Vic3RpdHV0ZXMgZm9yIGBub2RlOmNyeXB0b2AgaW4gYnJvd3NlciBidW5kbGVzIC0tIGhhcyBub1xuICogQUVTLUNDTSBtb2RlIGF0IGFsbCwgc28gbmF0aXZlIHYxIGRlY3J5cHQgZmFpbHMgb24gbGl0ZXJhbGx5IGV2ZXJ5IGNhbGxcbiAqIHRoZXJlLiBUaGVyZSdzIG5vIHBvaW50IHBheWluZyBmb3IgdGhlIGRvb21lZCBuYXRpdmUgYXR0ZW1wdCAoYSBmdWxsXG4gKiBQQktERjIgcnVuKSBiZWZvcmUgZmFsbGluZyBiYWNrOyBnbyBzdHJhaWdodCB0byBTSkNMLlxuICovXG5jb25zdCBpc0Jyb3dzZXJSdW50aW1lID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCc7XG5cbi8qKlxuICogU0pDTCBoYXMgbm8gdXBwZXIgYm91bmQgb24gYGl0ZXJgLCBzbyBhIGhvc3RpbGUgdjEgZW52ZWxvcGUgY291bGQgYnVybiBDUFVcbiAqIHJ1bm5pbmcgYW4gaW5mbGF0ZWQgUEJLREYyLiBOYXRpdmUgZGVjcnlwdCdzIGNvZGVjIG5vcm1hbGx5IGNhdGNoZXMgdGhpc1xuICogYmVmb3JlIGFueSBLREYgd29yayBydW5zOyB0aGUgYnJvd3NlciBwYXRoIHNraXBzIG5hdGl2ZSBlbnRpcmVseSwgc28gaXRcbiAqIG5lZWRzIHRoaXMgbmFycm93IGNoZWNrIHRvIHByZXNlcnZlIHRoZSBzYW1lIERvUyBwcm90ZWN0aW9uLlxuICovXG5mdW5jdGlvbiBhc3NlcnRJdGVyV2l0aGluQ2FwKGNpcGhlcnRleHQ6IHN0cmluZyk6IHZvaWQge1xuICBsZXQgaXRlcjogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICBpdGVyID0gSlNPTi5wYXJzZShjaXBoZXJ0ZXh0KT8uaXRlcjtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuOyAvLyBtYWxmb3JtZWQgSlNPTiAtLSBsZXQgc2pjbC5kZWNyeXB0IHJhaXNlIGl0cyBvd24gZXJyb3JcbiAgfVxuICBpZiAodHlwZW9mIGl0ZXIgPT09ICdudW1iZXInICYmIGl0ZXIgPiBWMV9NQVhfSVRFUikge1xuICAgIHRocm93IG5ldyBFcnJvcihgdjEgZGVjcnlwdDogaXRlciAke2l0ZXJ9IGV4Y2VlZHMgY2FwIG9mICR7VjFfTUFYX0lURVJ9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBjb252ZXJ0IGEgNCBlbGVtZW50IFVpbnQ4QXJyYXkgdG8gYSA0IGJ5dGUgTnVtYmVyXG4gKlxuICogQHBhcmFtIGJ5dGVzXG4gKiBAcmV0dXJuIDQgYnl0ZSBudW1iZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ5dGVzVG9Xb3JkKGJ5dGVzPzogVWludDhBcnJheSB8IG51bWJlcltdKTogbnVtYmVyIHtcbiAgaWYgKCEoYnl0ZXMgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB8fCBieXRlcy5sZW5ndGggIT09IDQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2J5dGVzIG11c3QgYmUgYSBVaW50OEFycmF5IHdpdGggbGVuZ3RoIDQnKTtcbiAgfVxuICByZXR1cm4gYnl0ZXMucmVkdWNlKChudW0sIGJ5dGUpID0+IG51bSAqIDB4MTAwICsgYnl0ZSwgMCk7XG59XG5cbi8qKlxuICogSW50ZXJuYWwgdjEgKFNKQ0wgUEJLREYyLVNIQTI1NiArIEFFUy0yNTYtQ0NNKSBlbmNyeXB0IGhlbHBlci5cbiAqXG4gKiBOb3QgZXhwb3J0ZWQgYXMgcGFydCBvZiB0aGUgcHVibGljIGVuY3J5cHQvZGVjcnlwdCBzdXJmYWNlOiBjYWxsZXJzIG11c3Qgbm90IHVzZVxuICogdGhpcyBkaXJlY3RseS4gdjEgb3V0cHV0IGlzIHJlcXVlc3RlZCB2aWEgYGVuY3J5cHQoLi4uLCB7IGVuY3J5cHRpb25WZXJzaW9uOiAxIH0pYC5cbiAqL1xuZnVuY3Rpb24gZW5jcnlwdFYxKFxuICBwYXNzd29yZDogc3RyaW5nLFxuICBwbGFpbnRleHQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IHsgc2FsdD86IEJ1ZmZlcjsgaXY/OiBCdWZmZXI7IGFkYXRhPzogc3RyaW5nIH1cbik6IHN0cmluZyB7XG4gIGNvbnN0IHNhbHQgPSBvcHRpb25zPy5zYWx0IHx8IHJhbmRvbUJ5dGVzKDgpO1xuICBpZiAoc2FsdC5sZW5ndGggIT09IDgpIHRocm93IG5ldyBFcnJvcignc2FsdCBtdXN0IGJlIDggYnl0ZXMnKTtcbiAgY29uc3QgaXYgPSBvcHRpb25zPy5pdiB8fCByYW5kb21CeXRlcygxNik7XG4gIGlmIChpdi5sZW5ndGggIT09IDE2KSB0aHJvdyBuZXcgRXJyb3IoJ2l2IG11c3QgYmUgMTYgYnl0ZXMnKTtcblxuICBjb25zdCBlbmNyeXB0T3B0aW9uczogeyBpdGVyOiBudW1iZXI7IGtzOiBudW1iZXI7IHNhbHQ6IG51bWJlcltdOyBpdjogbnVtYmVyW107IGFkYXRhPzogc3RyaW5nIH0gPSB7XG4gICAgaXRlcjogMTAwMDAsXG4gICAga3M6IDI1NixcbiAgICBzYWx0OiBbYnl0ZXNUb1dvcmQoc2FsdC5zbGljZSgwLCA0KSksIGJ5dGVzVG9Xb3JkKHNhbHQuc2xpY2UoNCkpXSxcbiAgICBpdjogW1xuICAgICAgYnl0ZXNUb1dvcmQoaXYuc2xpY2UoMCwgNCkpLFxuICAgICAgYnl0ZXNUb1dvcmQoaXYuc2xpY2UoNCwgOCkpLFxuICAgICAgYnl0ZXNUb1dvcmQoaXYuc2xpY2UoOCwgMTIpKSxcbiAgICAgIGJ5dGVzVG9Xb3JkKGl2LnNsaWNlKDEyLCAxNikpLFxuICAgIF0sXG4gIH07XG4gIGlmIChvcHRpb25zPy5hZGF0YSkgZW5jcnlwdE9wdGlvbnMuYWRhdGEgPSBvcHRpb25zLmFkYXRhO1xuICByZXR1cm4gc2pjbC5lbmNyeXB0KHBhc3N3b3JkLCBwbGFpbnRleHQsIGVuY3J5cHRPcHRpb25zKTtcbn1cblxuLyoqXG4gKiBFbmNyeXB0IGBwbGFpbnRleHRgIHdpdGggYHBhc3N3b3JkYC4gRGVmYXVsdHMgdG8gdjIgKEFyZ29uMmlkICsgQUVTLTI1Ni1HQ00pLlxuICpcbiAqIFBhc3MgYGVuY3J5cHRpb25WZXJzaW9uOiAxYCB0byBwcm9kdWNlIGEgbGVnYWN5IHYxIChTSkNMKSBlbnZlbG9wZTsgdGhpcyBpcyB0aGVcbiAqIG9ubHkgc3VwcG9ydGVkIHdheSB0byByZXF1ZXN0IHYxIGVuY3J5cHRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbmNyeXB0KFxuICBwYXNzd29yZDogc3RyaW5nLFxuICBwbGFpbnRleHQ6IHN0cmluZyxcbiAgb3B0aW9ucz86IHsgc2FsdD86IEJ1ZmZlcjsgaXY/OiBCdWZmZXI7IGFkYXRhPzogc3RyaW5nOyBlbmNyeXB0aW9uVmVyc2lvbj86IDEgfCAyIH1cbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGlmIChvcHRpb25zPy5lbmNyeXB0aW9uVmVyc2lvbiA9PT0gMSkge1xuICAgIHJldHVybiBlbmNyeXB0VjEocGFzc3dvcmQsIHBsYWludGV4dCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGVuY3J5cHRWMihwYXNzd29yZCwgcGxhaW50ZXh0LCB7IGFkYXRhOiBvcHRpb25zPy5hZGF0YSB9KTtcbn1cblxuLyoqXG4gKiBJdGVyLWNhcCB2aW9sYXRpb25zIGFyZSB0aGUgb25seSBlcnJvciB3ZSByZWZ1c2UgdG8gZmFsbCBiYWNrIG9uOiBTSkNMIGhhc1xuICogbm8gdXBwZXIgYm91bmQgb24gYGl0ZXJgLCBzbyBmYWxsaW5nIHRocm91Z2ggdG8gaXQgd291bGQgbGV0IGEgaG9zdGlsZVxuICogZW52ZWxvcGUgYnVybiBDUFUgcnVubmluZyBhbiBpbmZsYXRlZCBQQktERjIuIEV2ZXJ5dGhpbmcgZWxzZSAtLSBjb2RlY1xuICogcmVqZWN0aW9uIG9mIGEgc2hhcGUgU0pDTCB3b3VsZCBhY2NlcHQsIG5hdGl2ZSBjcnlwdG8gYnVnLCBhdXRoLXRhZ1xuICogbWlzbWF0Y2ggLS0gaXMgc2FmZSB0byBmYWxsIHRocm91Z2ggdG8gU0pDTC5cbiAqL1xuZnVuY3Rpb24gaXNJdGVyQ2FwVmlvbGF0aW9uKGVycjogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gZXJyIGluc3RhbmNlb2YgRXJyb3IgJiYgL2l0ZXI6XFxzKmV4cGVjdGVkIGludGVnZXJ8aXRlciBvdXQgb2YgcmFuZ2UvaS50ZXN0KGVyci5tZXNzYWdlKTtcbn1cblxuLyoqXG4gKiB2MSBkZWNyeXB0IHdpdGggYW4gU0pDTCBzYWZldHkgbmV0LlxuICpcbiAqIERlc2lnbiBpbnRlbnQgZHVyaW5nIHJvbGxvdXQ6IHplcm8gZmFsc2UgbmVnYXRpdmVzLiBBbnkgbmF0aXZlIGZhaWx1cmVcbiAqIChlbnZlbG9wZSBzaGFwZSBvdXIgc3RyaWN0ZXIgY29kZWMgcmVqZWN0cywgZnJhbWluZyBidWcsIHVuc3VwcG9ydGVkXG4gKiBhbGdvcml0aG0sIGF1dGgtdGFnIG1pc21hdGNoLCBldGMuKSBmYWxscyB0aHJvdWdoIHRvIGBzamNsLmRlY3J5cHRgIHNvIHRoZVxuICogY2FsbGVyIGlzIG5ldmVyIGJsb2NrZWQuIFRoZSBvbmx5IGV4Y2VwdGlvbiBpcyBhbiBpdGVyLWNhcCB2aW9sYXRpb24sXG4gKiB3aGljaCBpcyByZXRocm93biB0byBwcmVzZXJ2ZSBEb1MgcHJvdGVjdGlvbi5cbiAqXG4gKiBUaGUgY29uc29sZS53YXJuIG9ubHkgZmlyZXMgd2hlbiBuYXRpdmUgZmFpbHMgQU5EIFNKQ0wgc3VjY2VlZHMgLS0gaS5lLlxuICogd2hlbiB0aGUgdHdvIGVuZ2luZXMgZGlzYWdyZWUsIHdoaWNoIGlzIHRoZSBvbmx5IHNpZ25hbCB3b3J0aFxuICogaW52ZXN0aWdhdGluZy4gV3JvbmcgcGFzc3dvcmQgZmFpbHMgYm90aCBlbmdpbmVzIHNpbGVudGx5IGFuZCBzdXJmYWNlc1xuICogU0pDTCdzIGF1dGggZXJyb3IgKG1hcHBlZCB1cHN0cmVhbSB0byBcImluY29ycmVjdCBwYXNzd29yZFwiKS5cbiAqXG4gKiBgbmF0aXZlYCBkZWZhdWx0cyB0byB0aGUgbW9kdWxlJ3MgYGRlY3J5cHRWMWAgYnV0IGlzIGV4cG9zZWQgYXMgYSBwYXJhbWV0ZXJcbiAqIHNvIHRlc3RzIGNhbiBpbmplY3QgYSB0aHJvd2luZyB2ZXJzaW9uIHRvIGV4ZXJjaXNlIHRoZSBmYWxsYmFjayBwYXRoLlxuICogYGlzQnJvd3NlcmAgZGVmYXVsdHMgdG8gYSByZWFsIHJ1bnRpbWUgY2hlY2sgYnV0IGlzIGV4cG9zZWQgc28gdGVzdHMgY2FuXG4gKiBleGVyY2lzZSB0aGUgYnJvd3Nlci1vbmx5IGJyYW5jaCB1bmRlciBOb2RlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVjcnlwdFYxV2l0aEZhbGxiYWNrKFxuICBwYXNzd29yZDogc3RyaW5nLFxuICBjaXBoZXJ0ZXh0OiBzdHJpbmcsXG4gIG5hdGl2ZTogKHB3OiBzdHJpbmcsIGN0OiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nPiA9IGRlY3J5cHRWMSxcbiAgaXNCcm93c2VyOiBib29sZWFuID0gaXNCcm93c2VyUnVudGltZVxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgaWYgKGlzQnJvd3Nlcikge1xuICAgIGFzc2VydEl0ZXJXaXRoaW5DYXAoY2lwaGVydGV4dCk7XG4gICAgcmV0dXJuIHNqY2wuZGVjcnlwdChwYXNzd29yZCwgY2lwaGVydGV4dCk7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgbmF0aXZlKHBhc3N3b3JkLCBjaXBoZXJ0ZXh0KTtcbiAgfSBjYXRjaCAobmF0aXZlRXJyKSB7XG4gICAgaWYgKGlzSXRlckNhcFZpb2xhdGlvbihuYXRpdmVFcnIpKSB0aHJvdyBuYXRpdmVFcnI7XG4gICAgbGV0IHJlc3VsdDogc3RyaW5nO1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBzamNsLmRlY3J5cHQocGFzc3dvcmQsIGNpcGhlcnRleHQpO1xuICAgIH0gY2F0Y2ggKHNqY2xFcnIpIHtcbiAgICAgIC8vIEJvdGggZW5naW5lcyByZWplY3RlZCAtLSBhbG1vc3QgY2VydGFpbmx5IGEgcmVhbCBhdXRoIGZhaWx1cmUuXG4gICAgICAvLyBSZXRocm93IFNKQ0wncyBlcnJvciBzbyBCaXRHb0FQSS5kZWNyeXB0IG1hcHMgaXQgdG8gXCJpbmNvcnJlY3QgcGFzc3dvcmRcIi5cbiAgICAgIHRocm93IHNqY2xFcnI7XG4gICAgfVxuICAgIC8vIE5hdGl2ZSBmYWlsZWQgYnV0IFNKQ0wgc3VjY2VlZGVkIC0tIHJlYWwgc2lnbmFsLCBsb2cgZm9yIHRoZSBvcGVyYXRvci5cbiAgICBjb25zdCBtZXNzYWdlID0gbmF0aXZlRXJyIGluc3RhbmNlb2YgRXJyb3IgPyBuYXRpdmVFcnIubWVzc2FnZSA6IFN0cmluZyhuYXRpdmVFcnIpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS53YXJuKCdbYml0Z28tc2RrXSB2MSBuYXRpdmUgZGVjcnlwdCBmYWlsZWQ7IFNKQ0wgZmFsbGJhY2sgc3VjY2VlZGVkOicsIG1lc3NhZ2UpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuLyoqXG4gKiBBdXRvLWRldGVjdCB2MSAoUEJLREYyLVNIQTI1NiArIEFFUy1DQ00pIG9yIHYyIChBcmdvbjJpZCArIEFFUy0yNTYtR0NNKVxuICogZnJvbSB0aGUgZW52ZWxvcGUgYHZgIGZpZWxkIGFuZCBkZWNyeXB0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVjcnlwdChwYXNzd29yZDogc3RyaW5nLCBjaXBoZXJ0ZXh0OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBsZXQgZW52ZWxvcGVWZXJzaW9uOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgY29uc3QgZW52ZWxvcGUgPSBKU09OLnBhcnNlKGNpcGhlcnRleHQpO1xuICAgIGVudmVsb3BlVmVyc2lvbiA9IGVudmVsb3BlLnY7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcignZGVjcnlwdDogY2lwaGVydGV4dCBpcyBub3QgdmFsaWQgSlNPTicpO1xuICB9XG4gIGlmIChlbnZlbG9wZVZlcnNpb24gPT09IDIpIHtcbiAgICAvLyBEbyBub3QgY2F0Y2g6IHdyb25nIHBhc3N3b3JkIG9uIHYyIG11c3Qgbm90IHNpbGVudGx5IGZhbGwgdGhyb3VnaCB0byB2MS5cbiAgICByZXR1cm4gZGVjcnlwdFYyKHBhc3N3b3JkLCBjaXBoZXJ0ZXh0KTtcbiAgfVxuICBpZiAoZW52ZWxvcGVWZXJzaW9uICE9PSB1bmRlZmluZWQgJiYgZW52ZWxvcGVWZXJzaW9uICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBkZWNyeXB0OiB1bmtub3duIGVudmVsb3BlIHZlcnNpb24gJHtlbnZlbG9wZVZlcnNpb259YCk7XG4gIH1cbiAgcmV0dXJuIGRlY3J5cHRWMVdpdGhGYWxsYmFjayhwYXNzd29yZCwgY2lwaGVydGV4dCk7XG59XG4iXX0=