@bitgo-beta/abstract-utxo 1.1.1-beta.2321 → 1.1.1-beta.2323

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"RecoveryProvider.d.ts","sourceRoot":"","sources":["../../../../src/recovery/RecoveryProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,WAAW,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAElF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAI1C;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM;IACxE,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC1E,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACtD,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACjD,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CACxD;AAED,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAgBrF"}
1
+ {"version":3,"file":"RecoveryProvider.d.ts","sourceRoot":"","sources":["../../../../src/recovery/RecoveryProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,WAAW,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAGnG,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAI1C;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM;IACxE,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC1E,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACtD,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACjD,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CACxD;AA0BD,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAgBrF"}
@@ -2,7 +2,30 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.forCoin = forCoin;
4
4
  const blockapis_1 = require("@bitgo-beta/blockapis");
5
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
5
6
  const baseApi_1 = require("./baseApi");
7
+ /**
8
+ * Re-map `@bitgo-beta/blockapis` provider failures (`ApiRequestError`) to the shared
9
+ * `RecoveryProviderError` so a recovery scanner can distinguish "indexer failed"
10
+ * from "wallet is empty". `ApiRequestError` is the single error type the blockchair
11
+ * http client surfaces for network failures, non-2xx responses, and malformed bodies.
12
+ */
13
+ function wrapProviderErrors(provider) {
14
+ return new Proxy(provider, {
15
+ get(target, prop, receiver) {
16
+ const value = Reflect.get(target, prop, receiver);
17
+ if (typeof value === 'function') {
18
+ return (...args) => Promise.resolve(value.apply(target, args)).catch((e) => {
19
+ if (e instanceof blockapis_1.ApiRequestError) {
20
+ throw new sdk_core_1.RecoveryProviderError(e.message, e);
21
+ }
22
+ throw e;
23
+ });
24
+ }
25
+ return value;
26
+ },
27
+ });
28
+ }
6
29
  function forCoin(coinName, apiToken) {
7
30
  switch (coinName) {
8
31
  case 'btc':
@@ -15,8 +38,8 @@ function forCoin(coinName, apiToken) {
15
38
  case 'doge':
16
39
  case 'ltc':
17
40
  case 'zec':
18
- return blockapis_1.BlockchairApi.forCoin(coinName, { apiToken });
41
+ return wrapProviderErrors(blockapis_1.BlockchairApi.forCoin(coinName, { apiToken }));
19
42
  }
20
43
  throw new baseApi_1.ApiNotImplementedError(coinName);
21
44
  }
22
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVjb3ZlcnlQcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9yZWNvdmVyeS9SZWNvdmVyeVByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBd0JBLDBCQWdCQztBQXhDRCxxREFBa0Y7QUFJbEYsdUNBQW1EO0FBb0JuRCxTQUFnQixPQUFPLENBQUMsUUFBZ0IsRUFBRSxRQUFpQjtJQUN6RCxRQUFRLFFBQVEsRUFBRSxDQUFDO1FBQ2pCLEtBQUssS0FBSyxDQUFDO1FBQ1gsS0FBSyxNQUFNLENBQUM7UUFDWixLQUFLLEtBQUssQ0FBQztRQUNYLEtBQUssTUFBTSxDQUFDO1FBQ1osS0FBSyxLQUFLLENBQUM7UUFDWCxLQUFLLEtBQUssQ0FBQztRQUNYLEtBQUssTUFBTSxDQUFDO1FBQ1osS0FBSyxNQUFNLENBQUM7UUFDWixLQUFLLEtBQUssQ0FBQztRQUNYLEtBQUssS0FBSztZQUNSLE9BQU8seUJBQWEsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsTUFBTSxJQUFJLGdDQUFzQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzdDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCbG9ja2NoYWlyQXBpLCBBZGRyZXNzSW5mbywgVHJhbnNhY3Rpb25JTyB9IGZyb20gJ0BiaXRnby1iZXRhL2Jsb2NrYXBpcyc7XG5cbmltcG9ydCB0eXBlIHsgVW5zcGVudCB9IGZyb20gJy4uL3Vuc3BlbnQnO1xuXG5pbXBvcnQgeyBBcGlOb3RJbXBsZW1lbnRlZEVycm9yIH0gZnJvbSAnLi9iYXNlQXBpJztcblxuLyoqXG4gKiBBbiBhY2NvdW50IHdpdGggYmVhciBtaW5pbXVtIGluZm9ybWF0aW9uIHJlcXVpcmVkIGZvciByZWNvdmVyaWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY292ZXJ5QWNjb3VudERhdGEge1xuICB0eENvdW50OiBudW1iZXI7XG4gIHRvdGFsQmFsYW5jZTogbnVtYmVyO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZm9yIEFkZHJlc3NBcGkgJiBVdHhvQXBpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjb3ZlcnlQcm92aWRlcjxUTnVtYmVyIGV4dGVuZHMgbnVtYmVyIHwgYmlnaW50ID0gbnVtYmVyPiB7XG4gIGdldFVuc3BlbnRzRm9yQWRkcmVzc2VzKGFkZHJlc3Nlczogc3RyaW5nW10pOiBQcm9taXNlPFVuc3BlbnQ8VE51bWJlcj5bXT47XG4gIGdldEFkZHJlc3NJbmZvKGFkZHJlc3M6IHN0cmluZyk6IFByb21pc2U8QWRkcmVzc0luZm8+O1xuICBnZXRUcmFuc2FjdGlvbkhleCh0eGlkOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz47XG4gIGdldFRyYW5zYWN0aW9uSU8odHhpZDogc3RyaW5nKTogUHJvbWlzZTxUcmFuc2FjdGlvbklPPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvckNvaW4oY29pbk5hbWU6IHN0cmluZywgYXBpVG9rZW4/OiBzdHJpbmcpOiBSZWNvdmVyeVByb3ZpZGVyPG51bWJlcj4ge1xuICBzd2l0Y2ggKGNvaW5OYW1lKSB7XG4gICAgY2FzZSAnYnRjJzpcbiAgICBjYXNlICd0YnRjJzpcbiAgICBjYXNlICdiY2gnOlxuICAgIGNhc2UgJ2JjaGEnOlxuICAgIGNhc2UgJ2Jzdic6XG4gICAgY2FzZSAnYnRnJzpcbiAgICBjYXNlICdkYXNoJzpcbiAgICBjYXNlICdkb2dlJzpcbiAgICBjYXNlICdsdGMnOlxuICAgIGNhc2UgJ3plYyc6XG4gICAgICByZXR1cm4gQmxvY2tjaGFpckFwaS5mb3JDb2luKGNvaW5OYW1lLCB7IGFwaVRva2VuIH0pO1xuICB9XG5cbiAgdGhyb3cgbmV3IEFwaU5vdEltcGxlbWVudGVkRXJyb3IoY29pbk5hbWUpO1xufVxuIl19
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVjb3ZlcnlQcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9yZWNvdmVyeS9SZWNvdmVyeVByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBaURBLDBCQWdCQztBQWpFRCxxREFBbUc7QUFDbkcsbURBQTZEO0FBSTdELHVDQUFtRDtBQW9CbkQ7Ozs7O0dBS0c7QUFDSCxTQUFTLGtCQUFrQixDQUE2QixRQUFXO0lBQ2pFLE9BQU8sSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFO1FBQ3pCLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVE7WUFDeEIsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ2xELElBQUksT0FBTyxLQUFLLEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQ2hDLE9BQU8sQ0FBQyxHQUFHLElBQWUsRUFBRSxFQUFFLENBQzVCLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFVLEVBQUUsRUFBRTtvQkFDOUQsSUFBSSxDQUFDLFlBQVksMkJBQWUsRUFBRSxDQUFDO3dCQUNqQyxNQUFNLElBQUksZ0NBQXFCLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDaEQsQ0FBQztvQkFDRCxNQUFNLENBQUMsQ0FBQztnQkFDVixDQUFDLENBQUMsQ0FBQztZQUNQLENBQUM7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7S0FDRixDQUFNLENBQUM7QUFDVixDQUFDO0FBRUQsU0FBZ0IsT0FBTyxDQUFDLFFBQWdCLEVBQUUsUUFBaUI7SUFDekQsUUFBUSxRQUFRLEVBQUUsQ0FBQztRQUNqQixLQUFLLEtBQUssQ0FBQztRQUNYLEtBQUssTUFBTSxDQUFDO1FBQ1osS0FBSyxLQUFLLENBQUM7UUFDWCxLQUFLLE1BQU0sQ0FBQztRQUNaLEtBQUssS0FBSyxDQUFDO1FBQ1gsS0FBSyxLQUFLLENBQUM7UUFDWCxLQUFLLE1BQU0sQ0FBQztRQUNaLEtBQUssTUFBTSxDQUFDO1FBQ1osS0FBSyxLQUFLLENBQUM7UUFDWCxLQUFLLEtBQUs7WUFDUixPQUFPLGtCQUFrQixDQUFDLHlCQUFhLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQsTUFBTSxJQUFJLGdDQUFzQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzdDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcGlSZXF1ZXN0RXJyb3IsIEJsb2NrY2hhaXJBcGksIEFkZHJlc3NJbmZvLCBUcmFuc2FjdGlvbklPIH0gZnJvbSAnQGJpdGdvLWJldGEvYmxvY2thcGlzJztcbmltcG9ydCB7IFJlY292ZXJ5UHJvdmlkZXJFcnJvciB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcblxuaW1wb3J0IHR5cGUgeyBVbnNwZW50IH0gZnJvbSAnLi4vdW5zcGVudCc7XG5cbmltcG9ydCB7IEFwaU5vdEltcGxlbWVudGVkRXJyb3IgfSBmcm9tICcuL2Jhc2VBcGknO1xuXG4vKipcbiAqIEFuIGFjY291bnQgd2l0aCBiZWFyIG1pbmltdW0gaW5mb3JtYXRpb24gcmVxdWlyZWQgZm9yIHJlY292ZXJpZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjb3ZlcnlBY2NvdW50RGF0YSB7XG4gIHR4Q291bnQ6IG51bWJlcjtcbiAgdG90YWxCYWxhbmNlOiBudW1iZXI7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmb3IgQWRkcmVzc0FwaSAmIFV0eG9BcGlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWNvdmVyeVByb3ZpZGVyPFROdW1iZXIgZXh0ZW5kcyBudW1iZXIgfCBiaWdpbnQgPSBudW1iZXI+IHtcbiAgZ2V0VW5zcGVudHNGb3JBZGRyZXNzZXMoYWRkcmVzc2VzOiBzdHJpbmdbXSk6IFByb21pc2U8VW5zcGVudDxUTnVtYmVyPltdPjtcbiAgZ2V0QWRkcmVzc0luZm8oYWRkcmVzczogc3RyaW5nKTogUHJvbWlzZTxBZGRyZXNzSW5mbz47XG4gIGdldFRyYW5zYWN0aW9uSGV4KHR4aWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPjtcbiAgZ2V0VHJhbnNhY3Rpb25JTyh0eGlkOiBzdHJpbmcpOiBQcm9taXNlPFRyYW5zYWN0aW9uSU8+O1xufVxuXG4vKipcbiAqIFJlLW1hcCBgQGJpdGdvLWJldGEvYmxvY2thcGlzYCBwcm92aWRlciBmYWlsdXJlcyAoYEFwaVJlcXVlc3RFcnJvcmApIHRvIHRoZSBzaGFyZWRcbiAqIGBSZWNvdmVyeVByb3ZpZGVyRXJyb3JgIHNvIGEgcmVjb3Zlcnkgc2Nhbm5lciBjYW4gZGlzdGluZ3Vpc2ggXCJpbmRleGVyIGZhaWxlZFwiXG4gKiBmcm9tIFwid2FsbGV0IGlzIGVtcHR5XCIuIGBBcGlSZXF1ZXN0RXJyb3JgIGlzIHRoZSBzaW5nbGUgZXJyb3IgdHlwZSB0aGUgYmxvY2tjaGFpclxuICogaHR0cCBjbGllbnQgc3VyZmFjZXMgZm9yIG5ldHdvcmsgZmFpbHVyZXMsIG5vbi0yeHggcmVzcG9uc2VzLCBhbmQgbWFsZm9ybWVkIGJvZGllcy5cbiAqL1xuZnVuY3Rpb24gd3JhcFByb3ZpZGVyRXJyb3JzPFQgZXh0ZW5kcyBSZWNvdmVyeVByb3ZpZGVyPihwcm92aWRlcjogVCk6IFQge1xuICByZXR1cm4gbmV3IFByb3h5KHByb3ZpZGVyLCB7XG4gICAgZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcik7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiAoLi4uYXJnczogdW5rbm93bltdKSA9PlxuICAgICAgICAgIFByb21pc2UucmVzb2x2ZSh2YWx1ZS5hcHBseSh0YXJnZXQsIGFyZ3MpKS5jYXRjaCgoZTogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBBcGlSZXF1ZXN0RXJyb3IpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlY292ZXJ5UHJvdmlkZXJFcnJvcihlLm1lc3NhZ2UsIGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9LFxuICB9KSBhcyBUO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9yQ29pbihjb2luTmFtZTogc3RyaW5nLCBhcGlUb2tlbj86IHN0cmluZyk6IFJlY292ZXJ5UHJvdmlkZXI8bnVtYmVyPiB7XG4gIHN3aXRjaCAoY29pbk5hbWUpIHtcbiAgICBjYXNlICdidGMnOlxuICAgIGNhc2UgJ3RidGMnOlxuICAgIGNhc2UgJ2JjaCc6XG4gICAgY2FzZSAnYmNoYSc6XG4gICAgY2FzZSAnYnN2JzpcbiAgICBjYXNlICdidGcnOlxuICAgIGNhc2UgJ2Rhc2gnOlxuICAgIGNhc2UgJ2RvZ2UnOlxuICAgIGNhc2UgJ2x0Yyc6XG4gICAgY2FzZSAnemVjJzpcbiAgICAgIHJldHVybiB3cmFwUHJvdmlkZXJFcnJvcnMoQmxvY2tjaGFpckFwaS5mb3JDb2luKGNvaW5OYW1lLCB7IGFwaVRva2VuIH0pKTtcbiAgfVxuXG4gIHRocm93IG5ldyBBcGlOb3RJbXBsZW1lbnRlZEVycm9yKGNvaW5OYW1lKTtcbn1cbiJdfQ==
@@ -39,6 +39,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
39
39
  const assert_1 = __importDefault(require("assert"));
40
40
  const sinon = __importStar(require("sinon"));
41
41
  const nock = require("nock");
42
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
43
+ const blockapis_1 = require("@bitgo-beta/blockapis");
42
44
  const src_1 = require("../../../src");
43
45
  const util_1 = require("../util");
44
46
  const mock_1 = require("./mock");
@@ -143,5 +145,49 @@ describe('Backup Key Recovery - Unspent Gathering', function () {
143
145
  });
144
146
  });
145
147
  });
148
+ describe('RecoveryProvider', function () {
149
+ afterEach(function () {
150
+ nock.cleanAll();
151
+ });
152
+ it('maps a blockchair indexer failure to RecoveryProviderError', async function () {
153
+ const failingProvider = {
154
+ getAddressInfo: () => Promise.reject(new blockapis_1.ApiRequestError('https://api.blockchair.com', 'status code 503')),
155
+ getUnspentsForAddresses: () => Promise.reject(new Error('unused')),
156
+ getTransactionHex: () => Promise.reject(new Error('unused')),
157
+ getTransactionIO: () => Promise.reject(new Error('unused')),
158
+ };
159
+ const stub = sinon.stub(blockapis_1.BlockchairApi, 'forCoin').returns(failingProvider);
160
+ try {
161
+ const provider = (0, src_1.forCoin)('btc');
162
+ await assert_1.default.rejects(() => provider.getAddressInfo('addr'), sdk_core_1.RecoveryProviderError);
163
+ }
164
+ finally {
165
+ stub.restore();
166
+ }
167
+ });
168
+ it('maps a real blockchair 503 to RecoveryProviderError', async function () {
169
+ const address = '1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa';
170
+ nock('https://api.blockchair.com')
171
+ .get('/bitcoin/dashboards/address/' + address)
172
+ .reply(503);
173
+ const provider = (0, src_1.forCoin)('btc');
174
+ await assert_1.default.rejects(() => provider.getAddressInfo(address), sdk_core_1.RecoveryProviderError);
175
+ });
176
+ it('maps a blockchair rate-limit body (data:null) to RecoveryProviderError', async function () {
177
+ const address = '1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa';
178
+ nock('https://api.blockchair.com')
179
+ .get('/bitcoin/dashboards/address/' + address)
180
+ .reply(200, {
181
+ data: null,
182
+ context: {
183
+ code: 430,
184
+ error: 'Your IP address is temporary blacklisted due to exceeding usage of API resources.',
185
+ },
186
+ api: {},
187
+ });
188
+ const provider = (0, src_1.forCoin)('btc');
189
+ await assert_1.default.rejects(() => provider.getAddressInfo(address), sdk_core_1.RecoveryProviderError);
190
+ });
191
+ });
146
192
  });
147
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3VwS2V5UmVjb3ZlcnlVbnNwZW50R2F0aGVyaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L3JlY292ZXJ5L2JhY2t1cEtleVJlY292ZXJ5VW5zcGVudEdhdGhlcmluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUU1Qiw2Q0FBK0I7QUFDL0IsNkJBQThCO0FBSTlCLHNDQUtzQjtBQUV0QixrQ0FVaUI7QUFFakIsaUNBQThDO0FBSTlDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0FBRXpCLE1BQU0sZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0FBUS9CLCtEQUErRDtBQUMvRCxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBQSwrQkFBd0IsR0FBRSxDQUFDO0FBRWpGLEtBQUssVUFBVSxZQUFZLENBQUMsSUFBbUIsRUFBRSxRQUFnQjtJQUMvRCxLQUFLLFVBQVUsTUFBTSxDQUFDLENBQVE7UUFDNUIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzVCLDZCQUE2QjtRQUM3QixNQUFNLFdBQVcsR0FBRyxzQkFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxNQUFNLENBQUMsQ0FBQztRQUNwRSxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFDRCwyQ0FBMkM7UUFDM0MsTUFBTSxTQUFTLEdBQUcsc0JBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssTUFBTSxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lB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QW9CLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBRWxELE1BQU0sZ0JBQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxJQUFJLEVBQUU7b0JBQzlCLE1BQU0sSUFBQSx1QkFBaUIsRUFBQyxJQUFJLEVBQUUsbUJBQVksRUFBRTt3QkFDMUMsZ0JBQWdCO3dCQUNoQixtQkFBbUI7d0JBQ25CLElBQUksRUFBRSxDQUFDO3dCQUNQLGtCQUFrQixFQUFFLEVBQUU7d0JBQ3RCLEdBQUcsc0JBQXNCO3dCQUN6QixnQkFBZ0IsRUFBRSxZQUFZO3dCQUM5QixPQUFPLEVBQUUsa0JBQWtCO3FCQUM1QixDQUFDLENBQUM7Z0JBQ0wsQ0FBQyxFQUFFLHFCQUFxQixDQUFDLENBQUM7WUFDNUIsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCAqIGFzIHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCBub2NrID0gcmVxdWlyZSgnbm9jaycpO1xuaW1wb3J0IHsgQklQMzIgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcbmltcG9ydCB7IFRyaXBsZSB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcblxuaW1wb3J0IHtcbiAgYmFja3VwS2V5UmVjb3ZlcnksXG4gIEJhY2t1cEtleVJlY292ZXJ5VHJhbnNhbnNhY3Rpb24sXG4gIENvaW5nZWNrb0FwaSxcbiAgRm9ybWF0dGVkT2ZmbGluZVZhdWx0VHhJbmZvLFxufSBmcm9tICcuLi8uLi8uLi9zcmMnO1xuaW1wb3J0IHR5cGUgeyBVbnNwZW50IH0gZnJvbSAnLi4vLi4vLi4vc3JjL3Vuc3BlbnQnO1xuaW1wb3J0IHtcbiAgY3JlYXRlV2FzbVdhbGxldEtleXMsXG4gIGRlZmF1bHRCaXRHbyxcbiAgZW5jcnlwdEtleWNoYWluLFxuICBnZXREZWZhdWx0V2FzbVdhbGxldEtleXMsXG4gIGdldE1pblV0eG9Db2lucyxcbiAgZ2V0V2FsbGV0QWRkcmVzcyxcbiAga2V5Y2hhaW5zQmFzZTU4LFxuICB0b1Vuc3BlbnRXaXRoUHJldlR4LFxuICBXYWxsZXRVbnNwZW50V2l0aFByZXZUeCxcbn0gZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7IE1vY2tSZWNvdmVyeVByb3ZpZGVyIH0gZnJvbSAnLi9tb2NrJztcblxudHlwZSBTY3JpcHRUeXBlMk9mMyA9ICdwMnNoJyB8ICdwMnNoUDJ3c2gnIHwgJ3Ayd3NoJyB8ICdwMnRyJyB8ICdwMnRyTXVzaWcyJztcblxubm9jay5kaXNhYmxlTmV0Q29ubmVjdCgpO1xuXG5jb25zdCB3YWxsZXRQYXNzcGhyYXNlID0gJ2xvbCc7XG5cbnR5cGUgTmFtZWRLZXlzID0ge1xuICB1c2VyS2V5OiBzdHJpbmc7XG4gIGJhY2t1cEtleTogc3RyaW5nO1xuICBiaXRnb0tleTogc3RyaW5nO1xufTtcblxuLy8gR2V0IGRlZmF1bHQgd2FzbSB3YWxsZXQga2V5cyAoeHB1YnMsIHhwcml2cywgYW5kIHdhbGxldEtleXMpXG5jb25zdCB7IHdhbGxldEtleXM6IHdhc21XYWxsZXRLZXlzLCB4cHVicywgeHByaXZzIH0gPSBnZXREZWZhdWx0V2FzbVdhbGxldEtleXMoKTtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0TmFtZWRLZXlzKGtleXM6IFRyaXBsZTxCSVAzMj4sIHBhc3N3b3JkOiBzdHJpbmcpOiBQcm9taXNlPE5hbWVkS2V5cz4ge1xuICBhc3luYyBmdW5jdGlvbiBlbmNvZGUoazogQklQMzIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGJhc2U1OCA9IGsudG9CYXNlNTgoKTtcbiAgICAvLyBDaGVjayBpZiBpdCdzIGEgcHVibGljIGtleVxuICAgIGNvbnN0IHB1YktleU1hdGNoID0ga2V5Y2hhaW5zQmFzZTU4LmZpbmQoKGtjKSA9PiBrYy5wdWIgPT09IGJhc2U1OCk7XG4gICAgaWYgKHB1YktleU1hdGNoKSB7XG4gICAgICByZXR1cm4gYmFzZTU4O1xuICAgIH1cbiAgICAvLyBJdCdzIGEgcHJpdmF0ZSBrZXkgLSBmaW5kIGFuZCBlbmNyeXB0IGl0XG4gICAgY29uc3Qga2V5QmFzZTU4ID0ga2V5Y2hhaW5zQmFzZTU4LmZpbmQoKGtjKSA9PiBrYy5wcnYgPT09IGJhc2U1OCk7XG4gICAgaWYgKCFrZXlCYXNlNTgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignS2V5IG5vdCBmb3VuZCBpbiBrZXljaGFpbnNCYXNlNTgnKTtcbiAgICB9XG4gICAgcmV0dXJuIGVuY3J5cHRLZXljaGFpbihwYXNzd29yZCwga2V5QmFzZTU4KTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHVzZXJLZXk6IGF3YWl0IGVuY29kZShrZXlzWzBdKSxcbiAgICBiYWNrdXBLZXk6IGF3YWl0IGVuY29kZShrZXlzWzFdKSxcbiAgICBiaXRnb0tleTogYXdhaXQgZW5jb2RlKGtleXNbMl0pLFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRLZXlzRm9yRnVsbFNpZ25lZFJlY292ZXJ5KHBhc3N3b3JkOiBzdHJpbmcpOiBQcm9taXNlPE5hbWVkS2V5cz4ge1xuICByZXR1cm4gZ2V0TmFtZWRLZXlzKFt4cHJpdnNbMF0sIHhwcml2c1sxXSwgeHB1YnNbMl1dLCBwYXNzd29yZCk7XG59XG5cbmxldCBrZXlzRnVsbFNpZ25lZFJlY292ZXJ5OiBOYW1lZEtleXM7XG5cbi8qKlxuICogVGVzdHMgZm9yIHVuc3BlbnQgZ2F0aGVyaW5nIHZpYSBiYWNrdXBLZXlSZWNvdmVyeSB3aXRoIE1vY2tSZWNvdmVyeVByb3ZpZGVyLlxuICogVGhpcyB2YWxpZGF0ZXMgdGhlIGFkZHJlc3Mgc2Nhbm5pbmcgYW5kIHVuc3BlbnQgY29sbGVjdGlvbiBsb2dpYyBzZXBhcmF0ZWx5XG4gKiBmcm9tIHRoZSB0cmFuc2FjdGlvbiBidWlsZGluZyBsb2dpYyB0ZXN0ZWQgaW4gYmFja3VwS2V5UmVjb3ZlcnkudHMuXG4gKi9cbmRlc2NyaWJlKCdCYWNrdXAgS2V5IFJlY292ZXJ5IC0gVW5zcGVudCBHYXRoZXJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGRlZmF1bHRGZWVSYXRlU2F0QiA9IDEwMDtcblxuICBiZWZvcmUoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGtleXNGdWxsU2lnbmVkUmVjb3ZlcnkgPSBhd2FpdCBnZXRLZXlzRm9yRnVsbFNpZ25lZFJlY292ZXJ5KHdhbGxldFBhc3NwaHJhc2UpO1xuICB9KTtcblxuICBnZXRNaW5VdHhvQ29pbnMoKS5mb3JFYWNoKChjb2luKSA9PiB7XG4gICAgZGVzY3JpYmUoYFVuc3BlbnQgR2F0aGVyaW5nIFske2NvaW4uZ2V0Q2hhaW4oKX1dYCwgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgeyB3YWxsZXRLZXlzOiBleHRlcm5hbFdhbGxldCB9ID0gY3JlYXRlV2FzbVdhbGxldEtleXMoJ2V4dGVybmFsJyk7XG4gICAgICBjb25zdCByZWNvdmVyeURlc3RpbmF0aW9uID0gZ2V0V2FsbGV0QWRkcmVzcyhjb2luLm5hbWUsIGV4dGVybmFsV2FsbGV0KTtcblxuICAgICAgYmVmb3JlKCdtb2NrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBzaW5vbi5zdHViKENvaW5nZWNrb0FwaS5wcm90b3R5cGUsICdnZXRVU0RQcmljZScpLnJlc29sdmVzKDY5XzQyMCk7XG4gICAgICB9KTtcblxuICAgICAgYWZ0ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICBzaW5vbi5yZXN0b3JlKCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2dhdGhlcnMgdW5zcGVudHMgZnJvbSByZWNvdmVyeSBwcm92aWRlciBhbmQgYnVpbGRzIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnRpbWVvdXQoMTBfMDAwKTtcbiAgICAgICAgLy8gVXNlIHAyc2ggZm9yIGFsbCBjb2lucyAodW5pdmVyc2FsIHN1cHBvcnQpXG4gICAgICAgIGNvbnN0IHNjcmlwdFR5cGVzOiBTY3JpcHRUeXBlMk9mM1tdID0gWydwMnNoJ107XG5cbiAgICAgICAgLy8gQ3JlYXRlIHRlc3QgdW5zcGVudHMgd2l0aCBwcmV2VHggdXNpbmcgd2FzbS11dHhvIG9ubHkgKG5vIHV0eG9saWIgZGVwZW5kZW5jeSlcbiAgICAgICAgY29uc3QgdGVzdFVuc3BlbnRzOiBXYWxsZXRVbnNwZW50V2l0aFByZXZUeDxiaWdpbnQ+W10gPSBzY3JpcHRUeXBlcy5mbGF0TWFwKChzY3JpcHRUeXBlLCBpbmRleCkgPT4gW1xuICAgICAgICAgIHRvVW5zcGVudFdpdGhQcmV2VHgoeyBzY3JpcHRUeXBlLCB2YWx1ZTogQmlnSW50KDFlOCkgfSwgaW5kZXgsIGNvaW4ubmFtZSwgd2FzbVdhbGxldEtleXMpLFxuICAgICAgICAgIHRvVW5zcGVudFdpdGhQcmV2VHgoeyBzY3JpcHRUeXBlLCB2YWx1ZTogQmlnSW50KDJlOCkgfSwgaW5kZXgsIGNvaW4ubmFtZSwgd2FzbVdhbGxldEtleXMpLFxuICAgICAgICBdKTtcblxuICAgICAgICAvLyBDb252ZXJ0IHRvIEFQSSBmb3JtYXQgZm9yIEJDSC9CQ0hBIGlmIG5lZWRlZFxuICAgICAgICBjb25zdCBtb2NrZWRBcGlVbnNwZW50czogVW5zcGVudDxiaWdpbnQ+W10gPVxuICAgICAgICAgIGNvaW4uZ2V0Q2hhaW4oKSA9PT0gJ2JjaCcgfHwgY29pbi5nZXRDaGFpbigpID09PSAnYmNoYSdcbiAgICAgICAgICAgID8gdGVzdFVuc3BlbnRzLm1hcCgodSkgPT4gKHtcbiAgICAgICAgICAgICAgICAuLi51LFxuICAgICAgICAgICAgICAgIGFkZHJlc3M6IGNvaW4uY2Fub25pY2FsQWRkcmVzcyh1LmFkZHJlc3MsICdjYXNoYWRkcicpLnNwbGl0KCc6JylbMV0sXG4gICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgOiB0ZXN0VW5zcGVudHM7XG5cbiAgICAgICAgY29uc3QgbW9ja1Byb3ZpZGVyID0gbmV3IE1vY2tSZWNvdmVyeVByb3ZpZGVyKG1vY2tlZEFwaVVuc3BlbnRzKTtcblxuICAgICAgICAvLyBWZXJpZnkgbW9jayBwcm92aWRlciB3b3JrcyBjb3JyZWN0bHlcbiAgICAgICAgY29uc3QgZmV0Y2hlZFVuc3BlbnRzID0gYXdhaXQgbW9ja1Byb3ZpZGVyLmdldFVuc3BlbnRzRm9yQWRkcmVzc2VzKG1vY2tlZEFwaVVuc3BlbnRzLm1hcCgodSkgPT4gdS5hZGRyZXNzKSk7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChmZXRjaGVkVW5zcGVudHMubGVuZ3RoLCBtb2NrZWRBcGlVbnNwZW50cy5sZW5ndGgpO1xuXG4gICAgICAgIC8vIENhbGwgYmFja3VwS2V5UmVjb3Zlcnkgd2hpY2ggc2hvdWxkIGdhdGhlciB1bnNwZW50cyB2aWEgdGhlIG1vY2sgcHJvdmlkZXJcbiAgICAgICAgY29uc3QgcmVjb3ZlcnkgPSBhd2FpdCBiYWNrdXBLZXlSZWNvdmVyeShjb2luLCBkZWZhdWx0Qml0R28sIHtcbiAgICAgICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb24sXG4gICAgICAgICAgc2NhbjogNSxcbiAgICAgICAgICBpZ25vcmVBZGRyZXNzVHlwZXM6IFtdLFxuICAgICAgICAgIC4uLmtleXNGdWxsU2lnbmVkUmVjb3ZlcnksXG4gICAgICAgICAgcmVjb3ZlcnlQcm92aWRlcjogbW9ja1Byb3ZpZGVyLFxuICAgICAgICAgIGZlZVJhdGU6IGRlZmF1bHRGZWVSYXRlU2F0QixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVmVyaWZ5IHJlY292ZXJ5IHN1Y2NlZWRlZCAodHJhbnNhY3Rpb24gaGV4IGluZGljYXRlcyB1bnNwZW50cyB3ZXJlIGdhdGhlcmVkKVxuICAgICAgICBjb25zdCB0eEhleCA9XG4gICAgICAgICAgKHJlY292ZXJ5IGFzIEJhY2t1cEtleVJlY292ZXJ5VHJhbnNhbnNhY3Rpb24pLnRyYW5zYWN0aW9uSGV4ID8/XG4gICAgICAgICAgKHJlY292ZXJ5IGFzIEZvcm1hdHRlZE9mZmxpbmVWYXVsdFR4SW5mbykudHhIZXg7XG4gICAgICAgIGFzc2VydC5vayh0eEhleCwgJ3Nob3VsZCBoYXZlIHRyYW5zYWN0aW9uIGhleCBmcm9tIGdhdGhlcmVkIHVuc3BlbnRzJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2hhbmRsZXMgZW1wdHkgdW5zcGVudHMgZnJvbSByZWNvdmVyeSBwcm92aWRlcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy50aW1lb3V0KDEwXzAwMCk7XG5cbiAgICAgICAgY29uc3QgbW9ja1Byb3ZpZGVyID0gbmV3IE1vY2tSZWNvdmVyeVByb3ZpZGVyKFtdKTtcblxuICAgICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgYmFja3VwS2V5UmVjb3ZlcnkoY29pbiwgZGVmYXVsdEJpdEdvLCB7XG4gICAgICAgICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbixcbiAgICAgICAgICAgIHNjYW46IDIsXG4gICAgICAgICAgICBpZ25vcmVBZGRyZXNzVHlwZXM6IFtdLFxuICAgICAgICAgICAgLi4ua2V5c0Z1bGxTaWduZWRSZWNvdmVyeSxcbiAgICAgICAgICAgIHJlY292ZXJ5UHJvdmlkZXI6IG1vY2tQcm92aWRlcixcbiAgICAgICAgICAgIGZlZVJhdGU6IGRlZmF1bHRGZWVSYXRlU2F0QixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSwgL05vIGlucHV0IHRvIHJlY292ZXIvKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
193
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3VwS2V5UmVjb3ZlcnlVbnNwZW50R2F0aGVyaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGVzdC91bml0L3JlY292ZXJ5L2JhY2t1cEtleVJlY292ZXJ5VW5zcGVudEdhdGhlcmluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLG9EQUE0QjtBQUU1Qiw2Q0FBK0I7QUFDL0IsNkJBQThCO0FBRTlCLG1EQUFxRTtBQUNyRSxxREFBdUU7QUFFdkUsc0NBTXNCO0FBRXRCLGtDQVVpQjtBQUVqQixpQ0FBOEM7QUFJOUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7QUFFekIsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7QUFRL0IsK0RBQStEO0FBQy9ELE1BQU0sRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFBLCtCQUF3QixHQUFFLENBQUM7QUFFakYsS0FBSyxVQUFVLFlBQVksQ0FBQyxJQUFtQixFQUFFLFFBQWdCO0lBQy9ELEtBQUssVUFBVSxNQUFNLENBQUMsQ0FBUTtRQUM1QixNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDNUIsNkJBQTZCO1FBQzdCLE1BQU0sV0FBVyxHQUFHLHNCQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLE1BQU0sQ0FBQyxDQUFDO1FBQ3BFLElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQztRQUNELDJDQUEyQztRQUMzQyxNQUFNLFNBQVMsR0FBRyxzQkFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxNQUFNLENBQUMsQ0FBQztRQUNsRSxJ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b0JBQ1QsS0FBSyxFQUFFLG1GQUFtRjtpQkFDM0Y7Z0JBQ0QsR0FBRyxFQUFFLEVBQUU7YUFDUixDQUFDLENBQUM7WUFFTCxNQUFNLFFBQVEsR0FBRyxJQUFBLGFBQU8sRUFBQyxLQUFLLENBQUMsQ0FBQztZQUNoQyxNQUFNLGdCQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEVBQUUsZ0NBQXFCLENBQUMsQ0FBQztRQUN0RixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbmltcG9ydCAqIGFzIHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCBub2NrID0gcmVxdWlyZSgnbm9jaycpO1xuaW1wb3J0IHsgQklQMzIgfSBmcm9tICdAYml0Z28vd2FzbS11dHhvJztcbmltcG9ydCB7IFJlY292ZXJ5UHJvdmlkZXJFcnJvciwgVHJpcGxlIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgQXBpUmVxdWVzdEVycm9yLCBCbG9ja2NoYWlyQXBpIH0gZnJvbSAnQGJpdGdvLWJldGEvYmxvY2thcGlzJztcblxuaW1wb3J0IHtcbiAgYmFja3VwS2V5UmVjb3ZlcnksXG4gIEJhY2t1cEtleVJlY292ZXJ5VHJhbnNhbnNhY3Rpb24sXG4gIENvaW5nZWNrb0FwaSxcbiAgRm9ybWF0dGVkT2ZmbGluZVZhdWx0VHhJbmZvLFxuICBmb3JDb2luLFxufSBmcm9tICcuLi8uLi8uLi9zcmMnO1xuaW1wb3J0IHR5cGUgeyBVbnNwZW50IH0gZnJvbSAnLi4vLi4vLi4vc3JjL3Vuc3BlbnQnO1xuaW1wb3J0IHtcbiAgY3JlYXRlV2FzbVdhbGxldEtleXMsXG4gIGRlZmF1bHRCaXRHbyxcbiAgZW5jcnlwdEtleWNoYWluLFxuICBnZXREZWZhdWx0V2FzbVdhbGxldEtleXMsXG4gIGdldE1pblV0eG9Db2lucyxcbiAgZ2V0V2FsbGV0QWRkcmVzcyxcbiAga2V5Y2hhaW5zQmFzZTU4LFxuICB0b1Vuc3BlbnRXaXRoUHJldlR4LFxuICBXYWxsZXRVbnNwZW50V2l0aFByZXZUeCxcbn0gZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7IE1vY2tSZWNvdmVyeVByb3ZpZGVyIH0gZnJvbSAnLi9tb2NrJztcblxudHlwZSBTY3JpcHRUeXBlMk9mMyA9ICdwMnNoJyB8ICdwMnNoUDJ3c2gnIHwgJ3Ayd3NoJyB8ICdwMnRyJyB8ICdwMnRyTXVzaWcyJztcblxubm9jay5kaXNhYmxlTmV0Q29ubmVjdCgpO1xuXG5jb25zdCB3YWxsZXRQYXNzcGhyYXNlID0gJ2xvbCc7XG5cbnR5cGUgTmFtZWRLZXlzID0ge1xuICB1c2VyS2V5OiBzdHJpbmc7XG4gIGJhY2t1cEtleTogc3RyaW5nO1xuICBiaXRnb0tleTogc3RyaW5nO1xufTtcblxuLy8gR2V0IGRlZmF1bHQgd2FzbSB3YWxsZXQga2V5cyAoeHB1YnMsIHhwcml2cywgYW5kIHdhbGxldEtleXMpXG5jb25zdCB7IHdhbGxldEtleXM6IHdhc21XYWxsZXRLZXlzLCB4cHVicywgeHByaXZzIH0gPSBnZXREZWZhdWx0V2FzbVdhbGxldEtleXMoKTtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0TmFtZWRLZXlzKGtleXM6IFRyaXBsZTxCSVAzMj4sIHBhc3N3b3JkOiBzdHJpbmcpOiBQcm9taXNlPE5hbWVkS2V5cz4ge1xuICBhc3luYyBmdW5jdGlvbiBlbmNvZGUoazogQklQMzIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGJhc2U1OCA9IGsudG9CYXNlNTgoKTtcbiAgICAvLyBDaGVjayBpZiBpdCdzIGEgcHVibGljIGtleVxuICAgIGNvbnN0IHB1YktleU1hdGNoID0ga2V5Y2hhaW5zQmFzZTU4LmZpbmQoKGtjKSA9PiBrYy5wdWIgPT09IGJhc2U1OCk7XG4gICAgaWYgKHB1YktleU1hdGNoKSB7XG4gICAgICByZXR1cm4gYmFzZTU4O1xuICAgIH1cbiAgICAvLyBJdCdzIGEgcHJpdmF0ZSBrZXkgLSBmaW5kIGFuZCBlbmNyeXB0IGl0XG4gICAgY29uc3Qga2V5QmFzZTU4ID0ga2V5Y2hhaW5zQmFzZTU4LmZpbmQoKGtjKSA9PiBrYy5wcnYgPT09IGJhc2U1OCk7XG4gICAgaWYgKCFrZXlCYXNlNTgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignS2V5IG5vdCBmb3VuZCBpbiBrZXljaGFpbnNCYXNlNTgnKTtcbiAgICB9XG4gICAgcmV0dXJuIGVuY3J5cHRLZXljaGFpbihwYXNzd29yZCwga2V5QmFzZTU4KTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHVzZXJLZXk6IGF3YWl0IGVuY29kZShrZXlzWzBdKSxcbiAgICBiYWNrdXBLZXk6IGF3YWl0IGVuY29kZShrZXlzWzFdKSxcbiAgICBiaXRnb0tleTogYXdhaXQgZW5jb2RlKGtleXNbMl0pLFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRLZXlzRm9yRnVsbFNpZ25lZFJlY292ZXJ5KHBhc3N3b3JkOiBzdHJpbmcpOiBQcm9taXNlPE5hbWVkS2V5cz4ge1xuICByZXR1cm4gZ2V0TmFtZWRLZXlzKFt4cHJpdnNbMF0sIHhwcml2c1sxXSwgeHB1YnNbMl1dLCBwYXNzd29yZCk7XG59XG5cbmxldCBrZXlzRnVsbFNpZ25lZFJlY292ZXJ5OiBOYW1lZEtleXM7XG5cbi8qKlxuICogVGVzdHMgZm9yIHVuc3BlbnQgZ2F0aGVyaW5nIHZpYSBiYWNrdXBLZXlSZWNvdmVyeSB3aXRoIE1vY2tSZWNvdmVyeVByb3ZpZGVyLlxuICogVGhpcyB2YWxpZGF0ZXMgdGhlIGFkZHJlc3Mgc2Nhbm5pbmcgYW5kIHVuc3BlbnQgY29sbGVjdGlvbiBsb2dpYyBzZXBhcmF0ZWx5XG4gKiBmcm9tIHRoZSB0cmFuc2FjdGlvbiBidWlsZGluZyBsb2dpYyB0ZXN0ZWQgaW4gYmFja3VwS2V5UmVjb3ZlcnkudHMuXG4gKi9cbmRlc2NyaWJlKCdCYWNrdXAgS2V5IFJlY292ZXJ5IC0gVW5zcGVudCBHYXRoZXJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGRlZmF1bHRGZWVSYXRlU2F0QiA9IDEwMDtcblxuICBiZWZvcmUoYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGtleXNGdWxsU2lnbmVkUmVjb3ZlcnkgPSBhd2FpdCBnZXRLZXlzRm9yRnVsbFNpZ25lZFJlY292ZXJ5KHdhbGxldFBhc3NwaHJhc2UpO1xuICB9KTtcblxuICBnZXRNaW5VdHhvQ29pbnMoKS5mb3JFYWNoKChjb2luKSA9PiB7XG4gICAgZGVzY3JpYmUoYFVuc3BlbnQgR2F0aGVyaW5nIFske2NvaW4uZ2V0Q2hhaW4oKX1dYCwgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgeyB3YWxsZXRLZXlzOiBleHRlcm5hbFdhbGxldCB9ID0gY3JlYXRlV2FzbVdhbGxldEtleXMoJ2V4dGVybmFsJyk7XG4gICAgICBjb25zdCByZWNvdmVyeURlc3RpbmF0aW9uID0gZ2V0V2FsbGV0QWRkcmVzcyhjb2luLm5hbWUsIGV4dGVybmFsV2FsbGV0KTtcblxuICAgICAgYmVmb3JlKCdtb2NrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBzaW5vbi5zdHViKENvaW5nZWNrb0FwaS5wcm90b3R5cGUsICdnZXRVU0RQcmljZScpLnJlc29sdmVzKDY5XzQyMCk7XG4gICAgICB9KTtcblxuICAgICAgYWZ0ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICBzaW5vbi5yZXN0b3JlKCk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2dhdGhlcnMgdW5zcGVudHMgZnJvbSByZWNvdmVyeSBwcm92aWRlciBhbmQgYnVpbGRzIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnRpbWVvdXQoMTBfMDAwKTtcbiAgICAgICAgLy8gVXNlIHAyc2ggZm9yIGFsbCBjb2lucyAodW5pdmVyc2FsIHN1cHBvcnQpXG4gICAgICAgIGNvbnN0IHNjcmlwdFR5cGVzOiBTY3JpcHRUeXBlMk9mM1tdID0gWydwMnNoJ107XG5cbiAgICAgICAgLy8gQ3JlYXRlIHRlc3QgdW5zcGVudHMgd2l0aCBwcmV2VHggdXNpbmcgd2FzbS11dHhvIG9ubHkgKG5vIHV0eG9saWIgZGVwZW5kZW5jeSlcbiAgICAgICAgY29uc3QgdGVzdFVuc3BlbnRzOiBXYWxsZXRVbnNwZW50V2l0aFByZXZUeDxiaWdpbnQ+W10gPSBzY3JpcHRUeXBlcy5mbGF0TWFwKChzY3JpcHRUeXBlLCBpbmRleCkgPT4gW1xuICAgICAgICAgIHRvVW5zcGVudFdpdGhQcmV2VHgoeyBzY3JpcHRUeXBlLCB2YWx1ZTogQmlnSW50KDFlOCkgfSwgaW5kZXgsIGNvaW4ubmFtZSwgd2FzbVdhbGxldEtleXMpLFxuICAgICAgICAgIHRvVW5zcGVudFdpdGhQcmV2VHgoeyBzY3JpcHRUeXBlLCB2YWx1ZTogQmlnSW50KDJlOCkgfSwgaW5kZXgsIGNvaW4ubmFtZSwgd2FzbVdhbGxldEtleXMpLFxuICAgICAgICBdKTtcblxuICAgICAgICAvLyBDb252ZXJ0IHRvIEFQSSBmb3JtYXQgZm9yIEJDSC9CQ0hBIGlmIG5lZWRlZFxuICAgICAgICBjb25zdCBtb2NrZWRBcGlVbnNwZW50czogVW5zcGVudDxiaWdpbnQ+W10gPVxuICAgICAgICAgIGNvaW4uZ2V0Q2hhaW4oKSA9PT0gJ2JjaCcgfHwgY29pbi5nZXRDaGFpbigpID09PSAnYmNoYSdcbiAgICAgICAgICAgID8gdGVzdFVuc3BlbnRzLm1hcCgodSkgPT4gKHtcbiAgICAgICAgICAgICAgICAuLi51LFxuICAgICAgICAgICAgICAgIGFkZHJlc3M6IGNvaW4uY2Fub25pY2FsQWRkcmVzcyh1LmFkZHJlc3MsICdjYXNoYWRkcicpLnNwbGl0KCc6JylbMV0sXG4gICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgOiB0ZXN0VW5zcGVudHM7XG5cbiAgICAgICAgY29uc3QgbW9ja1Byb3ZpZGVyID0gbmV3IE1vY2tSZWNvdmVyeVByb3ZpZGVyKG1vY2tlZEFwaVVuc3BlbnRzKTtcblxuICAgICAgICAvLyBWZXJpZnkgbW9jayBwcm92aWRlciB3b3JrcyBjb3JyZWN0bHlcbiAgICAgICAgY29uc3QgZmV0Y2hlZFVuc3BlbnRzID0gYXdhaXQgbW9ja1Byb3ZpZGVyLmdldFVuc3BlbnRzRm9yQWRkcmVzc2VzKG1vY2tlZEFwaVVuc3BlbnRzLm1hcCgodSkgPT4gdS5hZGRyZXNzKSk7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChmZXRjaGVkVW5zcGVudHMubGVuZ3RoLCBtb2NrZWRBcGlVbnNwZW50cy5sZW5ndGgpO1xuXG4gICAgICAgIC8vIENhbGwgYmFja3VwS2V5UmVjb3Zlcnkgd2hpY2ggc2hvdWxkIGdhdGhlciB1bnNwZW50cyB2aWEgdGhlIG1vY2sgcHJvdmlkZXJcbiAgICAgICAgY29uc3QgcmVjb3ZlcnkgPSBhd2FpdCBiYWNrdXBLZXlSZWNvdmVyeShjb2luLCBkZWZhdWx0Qml0R28sIHtcbiAgICAgICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb24sXG4gICAgICAgICAgc2NhbjogNSxcbiAgICAgICAgICBpZ25vcmVBZGRyZXNzVHlwZXM6IFtdLFxuICAgICAgICAgIC4uLmtleXNGdWxsU2lnbmVkUmVjb3ZlcnksXG4gICAgICAgICAgcmVjb3ZlcnlQcm92aWRlcjogbW9ja1Byb3ZpZGVyLFxuICAgICAgICAgIGZlZVJhdGU6IGRlZmF1bHRGZWVSYXRlU2F0QixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVmVyaWZ5IHJlY292ZXJ5IHN1Y2NlZWRlZCAodHJhbnNhY3Rpb24gaGV4IGluZGljYXRlcyB1bnNwZW50cyB3ZXJlIGdhdGhlcmVkKVxuICAgICAgICBjb25zdCB0eEhleCA9XG4gICAgICAgICAgKHJlY292ZXJ5IGFzIEJhY2t1cEtleVJlY292ZXJ5VHJhbnNhbnNhY3Rpb24pLnRyYW5zYWN0aW9uSGV4ID8/XG4gICAgICAgICAgKHJlY292ZXJ5IGFzIEZvcm1hdHRlZE9mZmxpbmVWYXVsdFR4SW5mbykudHhIZXg7XG4gICAgICAgIGFzc2VydC5vayh0eEhleCwgJ3Nob3VsZCBoYXZlIHRyYW5zYWN0aW9uIGhleCBmcm9tIGdhdGhlcmVkIHVuc3BlbnRzJyk7XG4gICAgICB9KTtcblxuICAgICAgaXQoJ2hhbmRsZXMgZW1wdHkgdW5zcGVudHMgZnJvbSByZWNvdmVyeSBwcm92aWRlcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy50aW1lb3V0KDEwXzAwMCk7XG5cbiAgICAgICAgY29uc3QgbW9ja1Byb3ZpZGVyID0gbmV3IE1vY2tSZWNvdmVyeVByb3ZpZGVyKFtdKTtcblxuICAgICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cyhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgYmFja3VwS2V5UmVjb3ZlcnkoY29pbiwgZGVmYXVsdEJpdEdvLCB7XG4gICAgICAgICAgICB3YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbixcbiAgICAgICAgICAgIHNjYW46IDIsXG4gICAgICAgICAgICBpZ25vcmVBZGRyZXNzVHlwZXM6IFtdLFxuICAgICAgICAgICAgLi4ua2V5c0Z1bGxTaWduZWRSZWNvdmVyeSxcbiAgICAgICAgICAgIHJlY292ZXJ5UHJvdmlkZXI6IG1vY2tQcm92aWRlcixcbiAgICAgICAgICAgIGZlZVJhdGU6IGRlZmF1bHRGZWVSYXRlU2F0QixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSwgL05vIGlucHV0IHRvIHJlY292ZXIvKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnUmVjb3ZlcnlQcm92aWRlcicsIGZ1bmN0aW9uICgpIHtcbiAgICBhZnRlckVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgbm9jay5jbGVhbkFsbCgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ21hcHMgYSBibG9ja2NoYWlyIGluZGV4ZXIgZmFpbHVyZSB0byBSZWNvdmVyeVByb3ZpZGVyRXJyb3InLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBmYWlsaW5nUHJvdmlkZXIgPSB7XG4gICAgICAgIGdldEFkZHJlc3NJbmZvOiAoKSA9PiBQcm9taXNlLnJlamVjdChuZXcgQXBpUmVxdWVzdEVycm9yKCdodHRwczovL2FwaS5ibG9ja2NoYWlyLmNvbScsICdzdGF0dXMgY29kZSA1MDMnKSksXG4gICAgICAgIGdldFVuc3BlbnRzRm9yQWRkcmVzc2VzOiAoKSA9PiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ3VudXNlZCcpKSxcbiAgICAgICAgZ2V0VHJhbnNhY3Rpb25IZXg6ICgpID0+IFByb21pc2UucmVqZWN0KG5ldyBFcnJvcigndW51c2VkJykpLFxuICAgICAgICBnZXRUcmFuc2FjdGlvbklPOiAoKSA9PiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ3VudXNlZCcpKSxcbiAgICAgIH07XG4gICAgICBjb25zdCBzdHViID0gc2lub24uc3R1YihCbG9ja2NoYWlyQXBpLCAnZm9yQ29pbicpLnJldHVybnMoZmFpbGluZ1Byb3ZpZGVyIGFzIGFueSk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwcm92aWRlciA9IGZvckNvaW4oJ2J0YycpO1xuICAgICAgICBhd2FpdCBhc3NlcnQucmVqZWN0cygoKSA9PiBwcm92aWRlci5nZXRBZGRyZXNzSW5mbygnYWRkcicpLCBSZWNvdmVyeVByb3ZpZGVyRXJyb3IpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc3R1Yi5yZXN0b3JlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpdCgnbWFwcyBhIHJlYWwgYmxvY2tjaGFpciA1MDMgdG8gUmVjb3ZlcnlQcm92aWRlckVycm9yJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYWRkcmVzcyA9ICcxQTF6UDFlUDVRR2VmaTJETVBUZlRMNVNMbXY3RGl2Zk5hJztcbiAgICAgIG5vY2soJ2h0dHBzOi8vYXBpLmJsb2NrY2hhaXIuY29tJylcbiAgICAgICAgLmdldCgnL2JpdGNvaW4vZGFzaGJvYXJkcy9hZGRyZXNzLycgKyBhZGRyZXNzKVxuICAgICAgICAucmVwbHkoNTAzKTtcblxuICAgICAgY29uc3QgcHJvdmlkZXIgPSBmb3JDb2luKCdidGMnKTtcbiAgICAgIGF3YWl0IGFzc2VydC5yZWplY3RzKCgpID0+IHByb3ZpZGVyLmdldEFkZHJlc3NJbmZvKGFkZHJlc3MpLCBSZWNvdmVyeVByb3ZpZGVyRXJyb3IpO1xuICAgIH0pO1xuXG4gICAgaXQoJ21hcHMgYSBibG9ja2NoYWlyIHJhdGUtbGltaXQgYm9keSAoZGF0YTpudWxsKSB0byBSZWNvdmVyeVByb3ZpZGVyRXJyb3InLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBhZGRyZXNzID0gJzFBMXpQMWVQNVFHZWZpMkRNUFRmVEw1U0xtdjdEaXZmTmEnO1xuICAgICAgbm9jaygnaHR0cHM6Ly9hcGkuYmxvY2tjaGFpci5jb20nKVxuICAgICAgICAuZ2V0KCcvYml0Y29pbi9kYXNoYm9hcmRzL2FkZHJlc3MvJyArIGFkZHJlc3MpXG4gICAgICAgIC5yZXBseSgyMDAsIHtcbiAgICAgICAgICBkYXRhOiBudWxsLFxuICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgIGNvZGU6IDQzMCxcbiAgICAgICAgICAgIGVycm9yOiAnWW91ciBJUCBhZGRyZXNzIGlzIHRlbXBvcmFyeSBibGFja2xpc3RlZCBkdWUgdG8gZXhjZWVkaW5nIHVzYWdlIG9mIEFQSSByZXNvdXJjZXMuJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFwaToge30sXG4gICAgICAgIH0pO1xuXG4gICAgICBjb25zdCBwcm92aWRlciA9IGZvckNvaW4oJ2J0YycpO1xuICAgICAgYXdhaXQgYXNzZXJ0LnJlamVjdHMoKCkgPT4gcHJvdmlkZXIuZ2V0QWRkcmVzc0luZm8oYWRkcmVzcyksIFJlY292ZXJ5UHJvdmlkZXJFcnJvcik7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=