@bitgo-beta/sdk-core 8.2.1-beta.1980 → 8.2.1-beta.1982

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/dist/src/bitgo/defi/defiVault.d.ts +21 -1
  2. package/dist/src/bitgo/defi/defiVault.d.ts.map +1 -1
  3. package/dist/src/bitgo/defi/defiVault.js +36 -12
  4. package/dist/src/bitgo/defi/iDefiVault.d.ts +2 -1
  5. package/dist/src/bitgo/defi/iDefiVault.d.ts.map +1 -1
  6. package/dist/src/bitgo/defi/iDefiVault.js +1 -1
  7. package/dist/src/bitgo/environments.js +3 -3
  8. package/dist/src/bitgo/keychain/iKeychains.d.ts +2 -0
  9. package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
  10. package/dist/src/bitgo/keychain/iKeychains.js +1 -1
  11. package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
  12. package/dist/src/bitgo/keychain/keychains.js +3 -1
  13. package/dist/src/bitgo/safe/iSafe.d.ts +4 -2
  14. package/dist/src/bitgo/safe/iSafe.d.ts.map +1 -1
  15. package/dist/src/bitgo/safe/iSafe.js +1 -1
  16. package/dist/src/bitgo/safe/iSafes.d.ts +13 -8
  17. package/dist/src/bitgo/safe/iSafes.d.ts.map +1 -1
  18. package/dist/src/bitgo/safe/iSafes.js +1 -1
  19. package/dist/src/bitgo/safe/safe.d.ts +3 -8
  20. package/dist/src/bitgo/safe/safe.d.ts.map +1 -1
  21. package/dist/src/bitgo/safe/safe.js +136 -4
  22. package/dist/src/bitgo/safe/safeDerivation.d.ts +7 -3
  23. package/dist/src/bitgo/safe/safeDerivation.d.ts.map +1 -1
  24. package/dist/src/bitgo/safe/safeDerivation.js +57 -17
  25. package/dist/src/bitgo/safe/safes.d.ts +7 -6
  26. package/dist/src/bitgo/safe/safes.d.ts.map +1 -1
  27. package/dist/src/bitgo/safe/safes.js +27 -19
  28. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +9 -3
  29. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -1
  30. package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +19 -3
  31. package/dist/src/bitgo/utils/tss/recipientUtils.d.ts +1 -1
  32. package/dist/src/bitgo/utils/tss/recipientUtils.d.ts.map +1 -1
  33. package/dist/src/bitgo/utils/tss/recipientUtils.js +4 -2
  34. package/dist/src/bitgo/wallet/iWallet.d.ts +3 -2
  35. package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
  36. package/dist/src/bitgo/wallet/iWallet.js +1 -1
  37. package/dist/src/bitgo/wallet/safeKeychain.d.ts +2 -2
  38. package/dist/src/bitgo/wallet/safeKeychain.d.ts.map +1 -1
  39. package/dist/src/bitgo/wallet/safeKeychain.js +10 -10
  40. package/dist/src/bitgo/wallet/wallet.d.ts +4 -0
  41. package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
  42. package/dist/src/bitgo/wallet/wallet.js +6 -2
  43. package/dist/test/unit/bitgo/defi/defiVault.js +56 -1
  44. package/dist/test/unit/bitgo/safe/safe.js +133 -5
  45. package/dist/test/unit/bitgo/safe/safes.js +45 -4
  46. package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.js +121 -1
  47. package/dist/test/unit/bitgo/utils/tss/recipientUtils.js +14 -1
  48. package/dist/test/unit/bitgo/wallet/safeGetUserPrv.js +18 -40
  49. package/dist/tsconfig.tsbuildinfo +1 -1
  50. package/package.json +8 -8
@@ -1,4 +1,37 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
36
  exports.Safe = void 0;
4
37
  /**
@@ -7,9 +40,54 @@ exports.Safe = void 0;
7
40
  * @experimental The safe client surface is experimental and may change (including breaking
8
41
  * changes) before the public release.
9
42
  */
43
+ const t = __importStar(require("io-ts"));
10
44
  const public_types_1 = require("@bitgo/public-types");
45
+ const statics_1 = require("@bitgo-beta/statics");
46
+ const errors_1 = require("../errors");
47
+ const keychain_1 = require("../keychain");
11
48
  const codecs_1 = require("../utils/codecs");
12
49
  const postWithCodec_1 = require("../utils/postWithCodec");
50
+ const wallet_1 = require("../wallet");
51
+ const safeKeychain_1 = require("../wallet/safeKeychain");
52
+ const safeDerivation_1 = require("./safeDerivation");
53
+ const SafeRootKeySlot = t.keyof({
54
+ secp256k1Multisig: null,
55
+ ecdsaMpc: null,
56
+ eddsaMpc: null,
57
+ ed25519Multisig: null,
58
+ });
59
+ const GetDerivationIndexResponse = t.type({
60
+ slot: SafeRootKeySlot,
61
+ index: (0, codecs_1.boundedInt)(0, 0x7fffffff, 'derivationIndex'),
62
+ });
63
+ const CreateWalletInSafeBody = t.strict({
64
+ coin: t.string,
65
+ label: t.string,
66
+ type: t.literal('hot'),
67
+ multisigType: t.literal('onchain'),
68
+ keys: t.tuple([t.string]),
69
+ });
70
+ function onchainSlotForCoin(coin) {
71
+ if (coin.getDefaultMultisigType() === 'tss') {
72
+ throw new Error('MPC safe wallet minting is not yet implemented; use a slot-1 onchain coin');
73
+ }
74
+ const curve = statics_1.coins.get(coin.getChain()).primaryKeyCurve;
75
+ if (curve === statics_1.KeyCurve.Secp256k1) {
76
+ return 'secp256k1Multisig';
77
+ }
78
+ if (curve === statics_1.KeyCurve.Ed25519) {
79
+ throw new Error('ed25519 coin safe wallet minting is not yet supported');
80
+ }
81
+ throw new Error(`Coin '${coin.getChain()}' is not supported for safe wallet minting`);
82
+ }
83
+ function userRootIdFromSafe(safe, slot) {
84
+ const triplet = safe.rootKeys?.hot?.[slot];
85
+ if (!triplet || triplet.length !== 3) {
86
+ return undefined;
87
+ }
88
+ const userRootId = triplet[0];
89
+ return userRootId.length > 0 ? userRootId : undefined;
90
+ }
13
91
  /**
14
92
  * @experimental
15
93
  */
@@ -38,11 +116,65 @@ class Safe {
38
116
  return this.bitgo.url(`/enterprise/${this.enterpriseId()}/safes/${this.id()}${extra}`, 2);
39
117
  }
40
118
  /**
41
- * Mint a child wallet in this safe (server-side public derivation — no ceremony).
42
- * Body lands in WCN-1203.
119
+ * Mint a child wallet: peek the sequential index, hardened-derive the user child,
120
+ * register it public-only, then mint. Backup and BitGo children are soft-derived on the server.
43
121
  */
44
122
  async createWallet(params) {
45
- throw new Error('Safe.createWallet is not yet implemented (WCN-1203)');
123
+ if (params.passphrase.length === 0) {
124
+ throw new Error('passphrase is required to mint a safe wallet');
125
+ }
126
+ if (params.type !== undefined && params.type !== 'hot') {
127
+ throw new Error('Safe wallets are hot-only in v1');
128
+ }
129
+ if (params.multisigType === 'tss') {
130
+ throw new Error('MPC safe wallet minting is not yet implemented; use multisigType "onchain"');
131
+ }
132
+ const coin = this.bitgo.coin(params.coin);
133
+ const slot = onchainSlotForCoin(coin);
134
+ const indexResponse = await this.bitgo.get(this.url('/derivation-index')).query({ slot }).result();
135
+ const peeked = (0, codecs_1.decodeWithCodec)(GetDerivationIndexResponse, indexResponse, 'GetDerivationIndexResponse');
136
+ if (peeked.slot !== slot) {
137
+ throw new Error(`derivation-index returned slot '${peeked.slot}', expected '${slot}'`);
138
+ }
139
+ const { index } = peeked;
140
+ const userRootId = userRootIdFromSafe(this._safe, slot) ?? userRootIdFromSafe(await this.fetchSafeData(), slot);
141
+ if (userRootId === undefined) {
142
+ throw new Error(`Safe ${this.id()} is missing rootKeys.hot.${slot}`);
143
+ }
144
+ const keychains = coin.keychains();
145
+ const rootKeychain = await keychains.get({ id: userRootId });
146
+ if (rootKeychain.source !== 'user') {
147
+ throw new safeKeychain_1.InvalidRootKeychainSourceError(rootKeychain.id, rootKeychain.source);
148
+ }
149
+ const rootPrv = await (0, keychain_1.decryptKeychainPrivateKey)(this.bitgo, rootKeychain, params.passphrase);
150
+ if (!rootPrv) {
151
+ throw new errors_1.IncorrectPasswordError();
152
+ }
153
+ const derived = (0, safeDerivation_1.deriveAndSelfCheckSafeChildHardened)(rootPrv, index);
154
+ const child = await keychains.add({
155
+ pub: derived.pub,
156
+ source: 'user',
157
+ keyType: 'independent',
158
+ parent: userRootId,
159
+ safeId: this.id(),
160
+ });
161
+ const childId = child.id;
162
+ if (childId.length === 0) {
163
+ throw new Error('safe child key registration returned an empty id');
164
+ }
165
+ const keys = [childId];
166
+ const response = await (0, postWithCodec_1.postWithCodec)(this.bitgo, this.url('/wallets'), CreateWalletInSafeBody, {
167
+ coin: params.coin,
168
+ label: params.label,
169
+ type: 'hot',
170
+ multisigType: 'onchain',
171
+ keys,
172
+ }).result();
173
+ return new wallet_1.Wallet(this.bitgo, coin, response);
174
+ }
175
+ async fetchSafeData() {
176
+ const response = await this.bitgo.get(this.url()).result();
177
+ return (0, codecs_1.decodeWithCodec)(public_types_1.SafeData, response, 'SafeData');
46
178
  }
47
179
  /**
48
180
  * Add a member to the whole safe (view/admin/spend). Spend opens a key share.
@@ -93,4 +225,4 @@ class Safe {
93
225
  }
94
226
  }
95
227
  exports.Safe = Safe;
96
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iaXRnby9zYWZlL3NhZmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7Ozs7O0dBS0c7QUFDSCxzREFBOEY7QUFFOUYsNENBQWtEO0FBQ2xELDBEQUF1RDtBQVd2RDs7R0FFRztBQUNILE1BQWEsSUFBSTtJQUlmLFlBQVksS0FBZ0IsRUFBRSxRQUFrQjtRQUM5QyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQztJQUN4QixDQUFDO0lBRUQsRUFBRTtRQUNBLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVELFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDO0lBQ2pDLENBQUM7SUFFRCxLQUFLO1FBQ0gsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztJQUMxQixDQUFDO0lBRUQsTUFBTTtRQUNKLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7T0FHRztJQUNILEdBQUcsQ0FBQyxLQUFLLEdBQUcsRUFBRTtRQUNaLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsZUFBZSxJQUFJLENBQUMsWUFBWSxFQUFFLFVBQVUsSUFBSSxDQUFDLEVBQUUsRUFBRSxHQUFHLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzVGLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQStCO1FBQ2hELE1BQU0sSUFBSSxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUE0QjtRQUMxQyxNQUFNLElBQUksS0FBSyxDQUFDLGtEQUFrRCxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFrQztRQUN4RCxNQUFNLElBQUksS0FBSyxDQUFDLDBEQUEwRCxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxVQUFVLENBQUMsU0FBcUMsRUFBRTtRQUN0RCxNQUFNLElBQUksS0FBSyxDQUFDLG1EQUFtRCxDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBOEI7UUFDOUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQXlCLEVBQUU7UUFDdEMsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFBLDZCQUFhLEVBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLDZCQUFjLEVBQUUsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDdkcsT0FBTyxJQUFBLHdCQUFlLEVBQUMsdUJBQVEsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxPQUFPO1FBQ1gsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDN0UsT0FBTyxJQUFBLHdCQUFlLEVBQUMsdUJBQVEsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELE1BQU07UUFDSixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztDQUNGO0FBOUZELG9CQThGQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKlxuICogQGV4cGVyaW1lbnRhbCBUaGUgc2FmZSBjbGllbnQgc3VyZmFjZSBpcyBleHBlcmltZW50YWwgYW5kIG1heSBjaGFuZ2UgKGluY2x1ZGluZyBicmVha2luZ1xuICogY2hhbmdlcykgYmVmb3JlIHRoZSBwdWJsaWMgcmVsZWFzZS5cbiAqL1xuaW1wb3J0IHsgRnJlZXplU2FmZUJvZHksIFNhZmVEYXRhLCBTYWZlU2hhcmVEYXRhLCBTYWZlU2hhcmVTdGF0ZSB9IGZyb20gJ0BiaXRnby9wdWJsaWMtdHlwZXMnO1xuaW1wb3J0IHsgQml0R29CYXNlIH0gZnJvbSAnLi4vYml0Z29CYXNlJztcbmltcG9ydCB7IGRlY29kZVdpdGhDb2RlYyB9IGZyb20gJy4uL3V0aWxzL2NvZGVjcyc7XG5pbXBvcnQgeyBwb3N0V2l0aENvZGVjIH0gZnJvbSAnLi4vdXRpbHMvcG9zdFdpdGhDb2RlYyc7XG5pbXBvcnQgeyBXYWxsZXQgfSBmcm9tICcuLi93YWxsZXQnO1xuaW1wb3J0IHtcbiAgQWNjZXB0U2FmZVNoYXJlT3B0aW9ucyxcbiAgQWRkU2FmZU1lbWJlck9wdGlvbnMsXG4gIEFkZFNhZmVXYWxsZXRNZW1iZXJPcHRpb25zLFxuICBDcmVhdGVTYWZlV2FsbGV0T3B0aW9ucyxcbiAgSVNhZmUsXG4gIFdhbGxldFNoYXJlRGF0YSxcbn0gZnJvbSAnLi9pU2FmZSc7XG5cbi8qKlxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgY2xhc3MgU2FmZSBpbXBsZW1lbnRzIElTYWZlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBiaXRnbzogQml0R29CYXNlO1xuICBwdWJsaWMgcmVhZG9ubHkgX3NhZmU6IFNhZmVEYXRhO1xuXG4gIGNvbnN0cnVjdG9yKGJpdGdvOiBCaXRHb0Jhc2UsIHNhZmVEYXRhOiBTYWZlRGF0YSkge1xuICAgIHRoaXMuYml0Z28gPSBiaXRnbztcbiAgICB0aGlzLl9zYWZlID0gc2FmZURhdGE7XG4gIH1cblxuICBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zYWZlLmlkO1xuICB9XG5cbiAgZW50ZXJwcmlzZUlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3NhZmUuZW50ZXJwcmlzZUlkO1xuICB9XG5cbiAgbGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc2FmZS5sYWJlbDtcbiAgfVxuXG4gIHN0YXR1cygpOiBTYWZlRGF0YVsnc3RhdHVzJ10ge1xuICAgIHJldHVybiB0aGlzLl9zYWZlLnN0YXR1cztcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnRlcnByaXNlLXNjb3BlZCB2MiBVUkwgZm9yIHRoaXMgc2FmZSwgZS5nLiAvYXBpL3YyL2VudGVycHJpc2UvOmVJZC9zYWZlcy86c2FmZUlkXG4gICAqIEBwYXJhbSBleHRyYVxuICAgKi9cbiAgdXJsKGV4dHJhID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmJpdGdvLnVybChgL2VudGVycHJpc2UvJHt0aGlzLmVudGVycHJpc2VJZCgpfS9zYWZlcy8ke3RoaXMuaWQoKX0ke2V4dHJhfWAsIDIpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1pbnQgYSBjaGlsZCB3YWxsZXQgaW4gdGhpcyBzYWZlIChzZXJ2ZXItc2lkZSBwdWJsaWMgZGVyaXZhdGlvbiDigJQgbm8gY2VyZW1vbnkpLlxuICAgKiBCb2R5IGxhbmRzIGluIFdDTi0xMjAzLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlV2FsbGV0KHBhcmFtczogQ3JlYXRlU2FmZVdhbGxldE9wdGlvbnMpOiBQcm9taXNlPFdhbGxldD4ge1xuICAgIHRocm93IG5ldyBFcnJvcignU2FmZS5jcmVhdGVXYWxsZXQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCAoV0NOLTEyMDMpJyk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgbWVtYmVyIHRvIHRoZSB3aG9sZSBzYWZlICh2aWV3L2FkbWluL3NwZW5kKS4gU3BlbmQgb3BlbnMgYSBrZXkgc2hhcmUuXG4gICAqIEJvZHkgbGFuZHMgaW4gV0NOLTEyMDQuXG4gICAqL1xuICBhc3luYyBhZGRNZW1iZXIocGFyYW1zOiBBZGRTYWZlTWVtYmVyT3B0aW9ucyk6IFByb21pc2U8U2FmZURhdGE+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NhZmUuYWRkTWVtYmVyIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgKFdDTi0xMjA0KScpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNoYXJlIE9ORSBzYWZlIHdhbGxldCB3aXRoIGEgbm9uLW1lbWJlciB2aWEgdGhlIGV4aXN0aW5nIHdhbGxldC1zaGFyZSBoYW5kc2hha2UgKEZSLTEzKS5cbiAgICogQm9keSBsYW5kcyBpbiBXQ04tMTIwNC5cbiAgICovXG4gIGFzeW5jIGFkZE1lbWJlclRvV2FsbGV0KHBhcmFtczogQWRkU2FmZVdhbGxldE1lbWJlck9wdGlvbnMpOiBQcm9taXNlPFdhbGxldFNoYXJlRGF0YT4ge1xuICAgIHRocm93IG5ldyBFcnJvcignU2FmZS5hZGRNZW1iZXJUb1dhbGxldCBpcyBub3QgeWV0IGltcGxlbWVudGVkIChXQ04tMTIwNCknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IHRoZSBzYWZlIGtleSBzaGFyZXMgdmlzaWJsZSB0byB0aGUgY2FsbGVyLlxuICAgKiBCb2R5IGxhbmRzIGluIFdDTi0xMjA0LlxuICAgKi9cbiAgYXN5bmMgbGlzdFNoYXJlcyhwYXJhbXM6IHsgc3RhdGU/OiBTYWZlU2hhcmVTdGF0ZSB9ID0ge30pOiBQcm9taXNlPFNhZmVTaGFyZURhdGFbXT4ge1xuICAgIHRocm93IG5ldyBFcnJvcignU2FmZS5saXN0U2hhcmVzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgKFdDTi0xMjA0KScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjY2VwdCBhIHNhZmUga2V5IHNoYXJlIGFkZHJlc3NlZCB0byB0aGUgY2FsbGVyLlxuICAgKiBCb2R5IGxhbmRzIGluIFdDTi0xMjA0LlxuICAgKi9cbiAgYXN5bmMgYWNjZXB0U2hhcmUocGFyYW1zOiBBY2NlcHRTYWZlU2hhcmVPcHRpb25zKTogUHJvbWlzZTxTYWZlU2hhcmVEYXRhPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTYWZlLmFjY2VwdFNoYXJlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgKFdDTi0xMjA0KScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZyZWV6ZSB0aGUgc2FmZSDigJQgYmxvY2tzIHdpdGhkcmF3YWxzIG9uIGFsbCBzYWZlIHdhbGxldHMuIFNhZmUgc3RheXMgJ2FjdGl2ZScuXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGZyZWV6ZShwYXJhbXM6IEZyZWV6ZVNhZmVCb2R5ID0ge30pOiBQcm9taXNlPFNhZmVEYXRhPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBwb3N0V2l0aENvZGVjKHRoaXMuYml0Z28sIHRoaXMudXJsKCcvZnJlZXplJyksIEZyZWV6ZVNhZmVCb2R5LCBwYXJhbXMpLnJlc3VsdCgpO1xuICAgIHJldHVybiBkZWNvZGVXaXRoQ29kZWMoU2FmZURhdGEsIHJlc3BvbnNlLCAnU2FmZURhdGEnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcmNoaXZlIHRoZSBzYWZlLiBSZXF1aXJlcyBldmVyeSBzYWZlIHdhbGxldCB0byBhbHJlYWR5IGJlIGFyY2hpdmVkOyBhbHNvIHRoZSBhYmFuZG9ubWVudFxuICAgKiBwYXRoIGZvciBhIHN0dWNrICdpbml0aWFsaXppbmcnIHNhZmUuXG4gICAqL1xuICBhc3luYyBhcmNoaXZlKCk6IFByb21pc2U8U2FmZURhdGE+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdCh0aGlzLnVybCgnL2FyY2hpdmUnKSkuc2VuZCgpLnJlc3VsdCgpO1xuICAgIHJldHVybiBkZWNvZGVXaXRoQ29kZWMoU2FmZURhdGEsIHJlc3BvbnNlLCAnU2FmZURhdGEnKTtcbiAgfVxuXG4gIHRvSlNPTigpOiBTYWZlRGF0YSB7XG4gICAgcmV0dXJuIHRoaXMuX3NhZmU7XG4gIH1cbn1cbiJdfQ==
228
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9iaXRnby9zYWZlL3NhZmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7O0dBS0c7QUFDSCx5Q0FBMkI7QUFDM0Isc0RBQWdIO0FBQ2hILGlEQUFzRDtBQUd0RCxzQ0FBbUQ7QUFDbkQsMENBQXdEO0FBQ3hELDRDQUE4RDtBQUM5RCwwREFBdUQ7QUFDdkQsc0NBQW1DO0FBQ25DLHlEQUF3RTtBQVN4RSxxREFBdUU7QUFFdkUsTUFBTSxlQUFlLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUM5QixpQkFBaUIsRUFBRSxJQUFJO0lBQ3ZCLFFBQVEsRUFBRSxJQUFJO0lBQ2QsUUFBUSxFQUFFLElBQUk7SUFDZCxlQUFlLEVBQUUsSUFBSTtDQUN0QixDQUFDLENBQUM7QUFFSCxNQUFNLDBCQUEwQixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDeEMsSUFBSSxFQUFFLGVBQWU7SUFDckIsS0FBSyxFQUFFLElBQUEsbUJBQVUsRUFBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixDQUFDO0NBQ3BELENBQUMsQ0FBQztBQUVILE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUN0QyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU07SUFDZCxLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU07SUFDZixJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDdEIsWUFBWSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO0lBQ2xDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0NBQzFCLENBQUMsQ0FBQztBQUVILFNBQVMsa0JBQWtCLENBQUMsSUFBZTtJQUN6QyxJQUFJLElBQUks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Q0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsT0FBTztRQUNYLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzdFLE9BQU8sSUFBQSx3QkFBZSxFQUFDLHVCQUFRLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxNQUFNO1FBQ0osT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7Q0FDRjtBQTVKRCxvQkE0SkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICpcbiAqIEBleHBlcmltZW50YWwgVGhlIHNhZmUgY2xpZW50IHN1cmZhY2UgaXMgZXhwZXJpbWVudGFsIGFuZCBtYXkgY2hhbmdlIChpbmNsdWRpbmcgYnJlYWtpbmdcbiAqIGNoYW5nZXMpIGJlZm9yZSB0aGUgcHVibGljIHJlbGVhc2UuXG4gKi9cbmltcG9ydCAqIGFzIHQgZnJvbSAnaW8tdHMnO1xuaW1wb3J0IHsgRnJlZXplU2FmZUJvZHksIFNhZmVEYXRhLCBTYWZlU2hhcmVEYXRhLCBTYWZlU2hhcmVTdGF0ZSwgdHlwZSBSb290S2V5VHlwZSB9IGZyb20gJ0BiaXRnby9wdWJsaWMtdHlwZXMnO1xuaW1wb3J0IHsgY29pbnMsIEtleUN1cnZlIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBJQmFzZUNvaW4gfSBmcm9tICcuLi9iYXNlQ29pbic7XG5pbXBvcnQgeyBCaXRHb0Jhc2UgfSBmcm9tICcuLi9iaXRnb0Jhc2UnO1xuaW1wb3J0IHsgSW5jb3JyZWN0UGFzc3dvcmRFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBkZWNyeXB0S2V5Y2hhaW5Qcml2YXRlS2V5IH0gZnJvbSAnLi4va2V5Y2hhaW4nO1xuaW1wb3J0IHsgYm91bmRlZEludCwgZGVjb2RlV2l0aENvZGVjIH0gZnJvbSAnLi4vdXRpbHMvY29kZWNzJztcbmltcG9ydCB7IHBvc3RXaXRoQ29kZWMgfSBmcm9tICcuLi91dGlscy9wb3N0V2l0aENvZGVjJztcbmltcG9ydCB7IFdhbGxldCB9IGZyb20gJy4uL3dhbGxldCc7XG5pbXBvcnQgeyBJbnZhbGlkUm9vdEtleWNoYWluU291cmNlRXJyb3IgfSBmcm9tICcuLi93YWxsZXQvc2FmZUtleWNoYWluJztcbmltcG9ydCB7XG4gIEFjY2VwdFNhZmVTaGFyZU9wdGlvbnMsXG4gIEFkZFNhZmVNZW1iZXJPcHRpb25zLFxuICBBZGRTYWZlV2FsbGV0TWVtYmVyT3B0aW9ucyxcbiAgQ3JlYXRlU2FmZVdhbGxldE9wdGlvbnMsXG4gIElTYWZlLFxuICBXYWxsZXRTaGFyZURhdGEsXG59IGZyb20gJy4vaVNhZmUnO1xuaW1wb3J0IHsgZGVyaXZlQW5kU2VsZkNoZWNrU2FmZUNoaWxkSGFyZGVuZWQgfSBmcm9tICcuL3NhZmVEZXJpdmF0aW9uJztcblxuY29uc3QgU2FmZVJvb3RLZXlTbG90ID0gdC5rZXlvZih7XG4gIHNlY3AyNTZrMU11bHRpc2lnOiBudWxsLFxuICBlY2RzYU1wYzogbnVsbCxcbiAgZWRkc2FNcGM6IG51bGwsXG4gIGVkMjU1MTlNdWx0aXNpZzogbnVsbCxcbn0pO1xuXG5jb25zdCBHZXREZXJpdmF0aW9uSW5kZXhSZXNwb25zZSA9IHQudHlwZSh7XG4gIHNsb3Q6IFNhZmVSb290S2V5U2xvdCxcbiAgaW5kZXg6IGJvdW5kZWRJbnQoMCwgMHg3ZmZmZmZmZiwgJ2Rlcml2YXRpb25JbmRleCcpLFxufSk7XG5cbmNvbnN0IENyZWF0ZVdhbGxldEluU2FmZUJvZHkgPSB0LnN0cmljdCh7XG4gIGNvaW46IHQuc3RyaW5nLFxuICBsYWJlbDogdC5zdHJpbmcsXG4gIHR5cGU6IHQubGl0ZXJhbCgnaG90JyksXG4gIG11bHRpc2lnVHlwZTogdC5saXRlcmFsKCdvbmNoYWluJyksXG4gIGtleXM6IHQudHVwbGUoW3Quc3RyaW5nXSksXG59KTtcblxuZnVuY3Rpb24gb25jaGFpblNsb3RGb3JDb2luKGNvaW46IElCYXNlQ29pbik6IEV4dHJhY3Q8Um9vdEtleVR5cGUsICdzZWNwMjU2azFNdWx0aXNpZyc+IHtcbiAgaWYgKGNvaW4uZ2V0RGVmYXVsdE11bHRpc2lnVHlwZSgpID09PSAndHNzJykge1xuICAgIHRocm93IG5ldyBFcnJvcignTVBDIHNhZmUgd2FsbGV0IG1pbnRpbmcgaXMgbm90IHlldCBpbXBsZW1lbnRlZDsgdXNlIGEgc2xvdC0xIG9uY2hhaW4gY29pbicpO1xuICB9XG4gIGNvbnN0IGN1cnZlID0gY29pbnMuZ2V0KGNvaW4uZ2V0Q2hhaW4oKSkucHJpbWFyeUtleUN1cnZlO1xuICBpZiAoY3VydmUgPT09IEtleUN1cnZlLlNlY3AyNTZrMSkge1xuICAgIHJldHVybiAnc2VjcDI1NmsxTXVsdGlzaWcnO1xuICB9XG4gIGlmIChjdXJ2ZSA9PT0gS2V5Q3VydmUuRWQyNTUxOSkge1xuICAgIHRocm93IG5ldyBFcnJvcignZWQyNTUxOSBjb2luIHNhZmUgd2FsbGV0IG1pbnRpbmcgaXMgbm90IHlldCBzdXBwb3J0ZWQnKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYENvaW4gJyR7Y29pbi5nZXRDaGFpbigpfScgaXMgbm90IHN1cHBvcnRlZCBmb3Igc2FmZSB3YWxsZXQgbWludGluZ2ApO1xufVxuXG5mdW5jdGlvbiB1c2VyUm9vdElkRnJvbVNhZmUoc2FmZTogU2FmZURhdGEsIHNsb3Q6IFJvb3RLZXlUeXBlKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdHJpcGxldCA9IHNhZmUucm9vdEtleXM/LmhvdD8uW3Nsb3RdO1xuICBpZiAoIXRyaXBsZXQgfHwgdHJpcGxldC5sZW5ndGggIT09IDMpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IHVzZXJSb290SWQgPSB0cmlwbGV0WzBdO1xuICByZXR1cm4gdXNlclJvb3RJZC5sZW5ndGggPiAwID8gdXNlclJvb3RJZCA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBjbGFzcyBTYWZlIGltcGxlbWVudHMgSVNhZmUge1xuICBwcml2YXRlIHJlYWRvbmx5IGJpdGdvOiBCaXRHb0Jhc2U7XG4gIHB1YmxpYyByZWFkb25seSBfc2FmZTogU2FmZURhdGE7XG5cbiAgY29uc3RydWN0b3IoYml0Z286IEJpdEdvQmFzZSwgc2FmZURhdGE6IFNhZmVEYXRhKSB7XG4gICAgdGhpcy5iaXRnbyA9IGJpdGdvO1xuICAgIHRoaXMuX3NhZmUgPSBzYWZlRGF0YTtcbiAgfVxuXG4gIGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3NhZmUuaWQ7XG4gIH1cblxuICBlbnRlcnByaXNlSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc2FmZS5lbnRlcnByaXNlSWQ7XG4gIH1cblxuICBsYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zYWZlLmxhYmVsO1xuICB9XG5cbiAgc3RhdHVzKCk6IFNhZmVEYXRhWydzdGF0dXMnXSB7XG4gICAgcmV0dXJuIHRoaXMuX3NhZmUuc3RhdHVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEVudGVycHJpc2Utc2NvcGVkIHYyIFVSTCBmb3IgdGhpcyBzYWZlLCBlLmcuIC9hcGkvdjIvZW50ZXJwcmlzZS86ZUlkL3NhZmVzLzpzYWZlSWRcbiAgICogQHBhcmFtIGV4dHJhXG4gICAqL1xuICB1cmwoZXh0cmEgPSAnJyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYml0Z28udXJsKGAvZW50ZXJwcmlzZS8ke3RoaXMuZW50ZXJwcmlzZUlkKCl9L3NhZmVzLyR7dGhpcy5pZCgpfSR7ZXh0cmF9YCwgMik7XG4gIH1cblxuICAvKipcbiAgICogTWludCBhIGNoaWxkIHdhbGxldDogcGVlayB0aGUgc2VxdWVudGlhbCBpbmRleCwgaGFyZGVuZWQtZGVyaXZlIHRoZSB1c2VyIGNoaWxkLFxuICAgKiByZWdpc3RlciBpdCBwdWJsaWMtb25seSwgdGhlbiBtaW50LiBCYWNrdXAgYW5kIEJpdEdvIGNoaWxkcmVuIGFyZSBzb2Z0LWRlcml2ZWQgb24gdGhlIHNlcnZlci5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZVdhbGxldChwYXJhbXM6IENyZWF0ZVNhZmVXYWxsZXRPcHRpb25zKTogUHJvbWlzZTxXYWxsZXQ+IHtcbiAgICBpZiAocGFyYW1zLnBhc3NwaHJhc2UubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Bhc3NwaHJhc2UgaXMgcmVxdWlyZWQgdG8gbWludCBhIHNhZmUgd2FsbGV0Jyk7XG4gICAgfVxuICAgIGlmIChwYXJhbXMudHlwZSAhPT0gdW5kZWZpbmVkICYmIHBhcmFtcy50eXBlICE9PSAnaG90Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTYWZlIHdhbGxldHMgYXJlIGhvdC1vbmx5IGluIHYxJyk7XG4gICAgfVxuICAgIGlmIChwYXJhbXMubXVsdGlzaWdUeXBlID09PSAndHNzJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNUEMgc2FmZSB3YWxsZXQgbWludGluZyBpcyBub3QgeWV0IGltcGxlbWVudGVkOyB1c2UgbXVsdGlzaWdUeXBlIFwib25jaGFpblwiJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY29pbiA9IHRoaXMuYml0Z28uY29pbihwYXJhbXMuY29pbik7XG4gICAgY29uc3Qgc2xvdCA9IG9uY2hhaW5TbG90Rm9yQ29pbihjb2luKTtcblxuICAgIGNvbnN0IGluZGV4UmVzcG9uc2UgPSBhd2FpdCB0aGlzLmJpdGdvLmdldCh0aGlzLnVybCgnL2Rlcml2YXRpb24taW5kZXgnKSkucXVlcnkoeyBzbG90IH0pLnJlc3VsdCgpO1xuICAgIGNvbnN0IHBlZWtlZCA9IGRlY29kZVdpdGhDb2RlYyhHZXREZXJpdmF0aW9uSW5kZXhSZXNwb25zZSwgaW5kZXhSZXNwb25zZSwgJ0dldERlcml2YXRpb25JbmRleFJlc3BvbnNlJyk7XG4gICAgaWYgKHBlZWtlZC5zbG90ICE9PSBzbG90KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGRlcml2YXRpb24taW5kZXggcmV0dXJuZWQgc2xvdCAnJHtwZWVrZWQuc2xvdH0nLCBleHBlY3RlZCAnJHtzbG90fSdgKTtcbiAgICB9XG4gICAgY29uc3QgeyBpbmRleCB9ID0gcGVla2VkO1xuXG4gICAgY29uc3QgdXNlclJvb3RJZCA9IHVzZXJSb290SWRGcm9tU2FmZSh0aGlzLl9zYWZlLCBzbG90KSA/PyB1c2VyUm9vdElkRnJvbVNhZmUoYXdhaXQgdGhpcy5mZXRjaFNhZmVEYXRhKCksIHNsb3QpO1xuICAgIGlmICh1c2VyUm9vdElkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2FmZSAke3RoaXMuaWQoKX0gaXMgbWlzc2luZyByb290S2V5cy5ob3QuJHtzbG90fWApO1xuICAgIH1cblxuICAgIGNvbnN0IGtleWNoYWlucyA9IGNvaW4ua2V5Y2hhaW5zKCk7XG4gICAgY29uc3Qgcm9vdEtleWNoYWluID0gYXdhaXQga2V5Y2hhaW5zLmdldCh7IGlkOiB1c2VyUm9vdElkIH0pO1xuICAgIGlmIChyb290S2V5Y2hhaW4uc291cmNlICE9PSAndXNlcicpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkUm9vdEtleWNoYWluU291cmNlRXJyb3Iocm9vdEtleWNoYWluLmlkLCByb290S2V5Y2hhaW4uc291cmNlKTtcbiAgICB9XG4gICAgY29uc3Qgcm9vdFBydiA9IGF3YWl0IGRlY3J5cHRLZXljaGFpblByaXZhdGVLZXkodGhpcy5iaXRnbywgcm9vdEtleWNoYWluLCBwYXJhbXMucGFzc3BocmFzZSk7XG4gICAgaWYgKCFyb290UHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgSW5jb3JyZWN0UGFzc3dvcmRFcnJvcigpO1xuICAgIH1cblxuICAgIGNvbnN0IGRlcml2ZWQgPSBkZXJpdmVBbmRTZWxmQ2hlY2tTYWZlQ2hpbGRIYXJkZW5lZChyb290UHJ2LCBpbmRleCk7XG5cbiAgICBjb25zdCBjaGlsZCA9IGF3YWl0IGtleWNoYWlucy5hZGQoe1xuICAgICAgcHViOiBkZXJpdmVkLnB1YixcbiAgICAgIHNvdXJjZTogJ3VzZXInLFxuICAgICAga2V5VHlwZTogJ2luZGVwZW5kZW50JyxcbiAgICAgIHBhcmVudDogdXNlclJvb3RJZCxcbiAgICAgIHNhZmVJZDogdGhpcy5pZCgpLFxuICAgIH0pO1xuICAgIGNvbnN0IGNoaWxkSWQgPSBjaGlsZC5pZDtcbiAgICBpZiAoY2hpbGRJZC5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2FmZSBjaGlsZCBrZXkgcmVnaXN0cmF0aW9uIHJldHVybmVkIGFuIGVtcHR5IGlkJyk7XG4gICAgfVxuICAgIGNvbnN0IGtleXM6IFtzdHJpbmddID0gW2NoaWxkSWRdO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBwb3N0V2l0aENvZGVjKHRoaXMuYml0Z28sIHRoaXMudXJsKCcvd2FsbGV0cycpLCBDcmVhdGVXYWxsZXRJblNhZmVCb2R5LCB7XG4gICAgICBjb2luOiBwYXJhbXMuY29pbixcbiAgICAgIGxhYmVsOiBwYXJhbXMubGFiZWwsXG4gICAgICB0eXBlOiAnaG90JyxcbiAgICAgIG11bHRpc2lnVHlwZTogJ29uY2hhaW4nLFxuICAgICAga2V5cyxcbiAgICB9KS5yZXN1bHQoKTtcbiAgICByZXR1cm4gbmV3IFdhbGxldCh0aGlzLmJpdGdvLCBjb2luLCByZXNwb25zZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGZldGNoU2FmZURhdGEoKTogUHJvbWlzZTxTYWZlRGF0YT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy51cmwoKSkucmVzdWx0KCk7XG4gICAgcmV0dXJuIGRlY29kZVdpdGhDb2RlYyhTYWZlRGF0YSwgcmVzcG9uc2UsICdTYWZlRGF0YScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIG1lbWJlciB0byB0aGUgd2hvbGUgc2FmZSAodmlldy9hZG1pbi9zcGVuZCkuIFNwZW5kIG9wZW5zIGEga2V5IHNoYXJlLlxuICAgKiBCb2R5IGxhbmRzIGluIFdDTi0xMjA0LlxuICAgKi9cbiAgYXN5bmMgYWRkTWVtYmVyKHBhcmFtczogQWRkU2FmZU1lbWJlck9wdGlvbnMpOiBQcm9taXNlPFNhZmVEYXRhPiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTYWZlLmFkZE1lbWJlciBpcyBub3QgeWV0IGltcGxlbWVudGVkIChXQ04tMTIwNCknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaGFyZSBPTkUgc2FmZSB3YWxsZXQgd2l0aCBhIG5vbi1tZW1iZXIgdmlhIHRoZSBleGlzdGluZyB3YWxsZXQtc2hhcmUgaGFuZHNoYWtlIChGUi0xMykuXG4gICAqIEJvZHkgbGFuZHMgaW4gV0NOLTEyMDQuXG4gICAqL1xuICBhc3luYyBhZGRNZW1iZXJUb1dhbGxldChwYXJhbXM6IEFkZFNhZmVXYWxsZXRNZW1iZXJPcHRpb25zKTogUHJvbWlzZTxXYWxsZXRTaGFyZURhdGE+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NhZmUuYWRkTWVtYmVyVG9XYWxsZXQgaXMgbm90IHlldCBpbXBsZW1lbnRlZCAoV0NOLTEyMDQpJyk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCB0aGUgc2FmZSBrZXkgc2hhcmVzIHZpc2libGUgdG8gdGhlIGNhbGxlci5cbiAgICogQm9keSBsYW5kcyBpbiBXQ04tMTIwNC5cbiAgICovXG4gIGFzeW5jIGxpc3RTaGFyZXMocGFyYW1zOiB7IHN0YXRlPzogU2FmZVNoYXJlU3RhdGUgfSA9IHt9KTogUHJvbWlzZTxTYWZlU2hhcmVEYXRhW10+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NhZmUubGlzdFNoYXJlcyBpcyBub3QgeWV0IGltcGxlbWVudGVkIChXQ04tMTIwNCknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY2NlcHQgYSBzYWZlIGtleSBzaGFyZSBhZGRyZXNzZWQgdG8gdGhlIGNhbGxlci5cbiAgICogQm9keSBsYW5kcyBpbiBXQ04tMTIwNC5cbiAgICovXG4gIGFzeW5jIGFjY2VwdFNoYXJlKHBhcmFtczogQWNjZXB0U2FmZVNoYXJlT3B0aW9ucyk6IFByb21pc2U8U2FmZVNoYXJlRGF0YT4ge1xuICAgIHRocm93IG5ldyBFcnJvcignU2FmZS5hY2NlcHRTaGFyZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIChXQ04tMTIwNCknKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGcmVlemUgdGhlIHNhZmUg4oCUIGJsb2NrcyB3aXRoZHJhd2FscyBvbiBhbGwgc2FmZSB3YWxsZXRzLiBTYWZlIHN0YXlzICdhY3RpdmUnLlxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBmcmVlemUocGFyYW1zOiBGcmVlemVTYWZlQm9keSA9IHt9KTogUHJvbWlzZTxTYWZlRGF0YT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcG9zdFdpdGhDb2RlYyh0aGlzLmJpdGdvLCB0aGlzLnVybCgnL2ZyZWV6ZScpLCBGcmVlemVTYWZlQm9keSwgcGFyYW1zKS5yZXN1bHQoKTtcbiAgICByZXR1cm4gZGVjb2RlV2l0aENvZGVjKFNhZmVEYXRhLCByZXNwb25zZSwgJ1NhZmVEYXRhJyk7XG4gIH1cblxuICAvKipcbiAgICogQXJjaGl2ZSB0aGUgc2FmZS4gUmVxdWlyZXMgZXZlcnkgc2FmZSB3YWxsZXQgdG8gYWxyZWFkeSBiZSBhcmNoaXZlZDsgYWxzbyB0aGUgYWJhbmRvbm1lbnRcbiAgICogcGF0aCBmb3IgYSBzdHVjayAnaW5pdGlhbGl6aW5nJyBzYWZlLlxuICAgKi9cbiAgYXN5bmMgYXJjaGl2ZSgpOiBQcm9taXNlPFNhZmVEYXRhPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy51cmwoJy9hcmNoaXZlJykpLnNlbmQoKS5yZXN1bHQoKTtcbiAgICByZXR1cm4gZGVjb2RlV2l0aENvZGVjKFNhZmVEYXRhLCByZXNwb25zZSwgJ1NhZmVEYXRhJyk7XG4gIH1cblxuICB0b0pTT04oKTogU2FmZURhdGEge1xuICAgIHJldHVybiB0aGlzLl9zYWZlO1xuICB9XG59XG4iXX0=
@@ -1,11 +1,15 @@
1
- /** BIP32 purpose for safe wallet derivation (hardened). */
2
- export declare const SAFE_DERIVATION_PURPOSE = 999999;
1
+ /** Sign-time scan cap (wallet cap plus abandoned mint increments). */
2
+ export declare const MAX_SAFE_CHILD_INDEX_SCAN = 4096;
3
+ export declare function parseSafeDerivationIndex(index: string | number): number;
3
4
  export declare function getSafeHardenedDerivationPath(index: string | number): string;
4
5
  export interface SafeHardenedChildKey {
5
6
  prv: string;
6
7
  pub: string;
7
8
  derivationPath: string;
8
9
  }
9
- /** Hardened BIP32 derive for secp256k1 multisig from a root xprv and mint index. */
10
10
  export declare function deriveSafeChildHardenedFromXprv(rootXprv: string, index: string | number): SafeHardenedChildKey;
11
+ /** Re-derive and assert both results match before the child is registered. */
12
+ export declare function deriveAndSelfCheckSafeChildHardened(rootXprv: string, index: string | number): SafeHardenedChildKey;
13
+ /** Walk `m/0'` … `m/<max>'` until the registered child pub matches. */
14
+ export declare function deriveSafeChildHardenedMatchingPub(rootXprv: string, expectedPub: string, maxIndex?: number): SafeHardenedChildKey;
11
15
  //# sourceMappingURL=safeDerivation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"safeDerivation.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/safe/safeDerivation.ts"],"names":[],"mappings":"AAYA,2DAA2D;AAC3D,eAAO,MAAM,uBAAuB,SAAS,CAAC;AAE9C,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAM5E;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,oFAAoF;AACpF,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,oBAAoB,CAW9G"}
1
+ {"version":3,"file":"safeDerivation.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/safe/safeDerivation.ts"],"names":[],"mappings":"AAeA,sEAAsE;AACtE,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAE9C,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAavE;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAE5E;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;CACxB;AAaD,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,oBAAoB,CAI9G;AAED,8EAA8E;AAC9E,wBAAgB,mCAAmC,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,oBAAoB,CAOlH;AAED,uEAAuE;AACvE,wBAAgB,kCAAkC,CAChD,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,QAAQ,GAAE,MAAkC,GAC3C,oBAAoB,CAUtB"}
@@ -1,32 +1,46 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SAFE_DERIVATION_PURPOSE = void 0;
3
+ exports.MAX_SAFE_CHILD_INDEX_SCAN = void 0;
4
+ exports.parseSafeDerivationIndex = parseSafeDerivationIndex;
4
5
  exports.getSafeHardenedDerivationPath = getSafeHardenedDerivationPath;
5
6
  exports.deriveSafeChildHardenedFromXprv = deriveSafeChildHardenedFromXprv;
7
+ exports.deriveAndSelfCheckSafeChildHardened = deriveAndSelfCheckSafeChildHardened;
8
+ exports.deriveSafeChildHardenedMatchingPub = deriveSafeChildHardenedMatchingPub;
6
9
  /**
7
10
  * @prettier
8
11
  *
9
- * Shared safe child derivation for mint and sign.
10
- * Path: m/999999'/<index>' where index is the mint allocation stored on the
11
- * child key as derivedFromParentWithSeed.
12
+ * @experimental Shared safe child derivation for mint and sign.
12
13
  *
13
- * Soft deriveKeyWithSeed (m/999999/a/b) must not be used for safe children —
14
- * it cannot reproduce a hardened key.
14
+ * User child: hardened `m/<index>'` from the sequential `safe.derivationIndex[slot]`.
15
+ * Backup / BitGo children are soft-derived server-side at `m/<index>` (not here).
16
+ *
17
+ * Do not use `derivedFromParentWithSeed` / `deriveKeyWithSeed` (`m/999999/a/b`) —
18
+ * that is the custody hashed path and cannot reproduce a safe child.
15
19
  */
16
20
  const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
17
- /** BIP32 purpose for safe wallet derivation (hardened). */
18
- exports.SAFE_DERIVATION_PURPOSE = 999999;
19
- function getSafeHardenedDerivationPath(index) {
20
- const idx = typeof index === 'number' ? String(index) : index;
21
- if (!/^\d+$/.test(idx)) {
21
+ const MAX_BIP32_INDEX = 0x7fffffff;
22
+ /** Sign-time scan cap (wallet cap plus abandoned mint increments). */
23
+ exports.MAX_SAFE_CHILD_INDEX_SCAN = 4096;
24
+ function parseSafeDerivationIndex(index) {
25
+ let idx;
26
+ if (typeof index === 'number') {
27
+ idx = index;
28
+ }
29
+ else if (/^\d+$/.test(index)) {
30
+ idx = Number(index);
31
+ }
32
+ else {
22
33
  throw new Error(`Invalid safe derivation index '${index}': expected a non-negative integer`);
23
34
  }
24
- return `m/${exports.SAFE_DERIVATION_PURPOSE}'/${idx}'`;
35
+ if (!Number.isInteger(idx) || idx < 0 || idx > MAX_BIP32_INDEX) {
36
+ throw new Error(`Invalid safe derivation index '${index}': expected a non-negative integer`);
37
+ }
38
+ return idx;
25
39
  }
26
- /** Hardened BIP32 derive for secp256k1 multisig from a root xprv and mint index. */
27
- function deriveSafeChildHardenedFromXprv(rootXprv, index) {
28
- const derivationPath = getSafeHardenedDerivationPath(index);
29
- const child = utxo_lib_1.bip32.fromBase58(rootXprv).derivePath(derivationPath);
40
+ function getSafeHardenedDerivationPath(index) {
41
+ return `m/${parseSafeDerivationIndex(index)}'`;
42
+ }
43
+ function childFromNode(child, derivationPath) {
30
44
  if (!child.privateKey) {
31
45
  throw new Error(`Failed to derive hardened safe child at ${derivationPath}`);
32
46
  }
@@ -36,4 +50,30 @@ function deriveSafeChildHardenedFromXprv(rootXprv, index) {
36
50
  derivationPath,
37
51
  };
38
52
  }
39
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZURlcml2YXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYml0Z28vc2FmZS9zYWZlRGVyaXZhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFlQSxzRUFNQztBQVNELDBFQVdDO0FBekNEOzs7Ozs7Ozs7R0FTRztBQUNILG1EQUE2QztBQUU3QywyREFBMkQ7QUFDOUMsUUFBQSx1QkFBdUIsR0FBRyxNQUFNLENBQUM7QUFFOUMsU0FBZ0IsNkJBQTZCLENBQUMsS0FBc0I7SUFDbEUsTUFBTSxHQUFHLEdBQUcsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUM5RCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLEtBQUssb0NBQW9DLENBQUMsQ0FBQztJQUMvRixDQUFDO0lBQ0QsT0FBTyxLQUFLLCtCQUF1QixLQUFLLEdBQUcsR0FBRyxDQUFDO0FBQ2pELENBQUM7QUFRRCxvRkFBb0Y7QUFDcEYsU0FBZ0IsK0JBQStCLENBQUMsUUFBZ0IsRUFBRSxLQUFzQjtJQUN0RixNQUFNLGNBQWMsR0FBRyw2QkFBNkIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1RCxNQUFNLEtBQUssR0FBRyxnQkFBSyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDcEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUN0QixNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO0lBQy9FLENBQUM7SUFDRCxPQUFPO1FBQ0wsR0FBRyxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUU7UUFDckIsR0FBRyxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUU7UUFDaEMsY0FBYztLQUNmLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqXG4gKiBTaGFyZWQgc2FmZSBjaGlsZCBkZXJpdmF0aW9uIGZvciBtaW50IGFuZCBzaWduLlxuICogUGF0aDogbS85OTk5OTknLzxpbmRleD4nIHdoZXJlIGluZGV4IGlzIHRoZSBtaW50IGFsbG9jYXRpb24gc3RvcmVkIG9uIHRoZVxuICogY2hpbGQga2V5IGFzIGRlcml2ZWRGcm9tUGFyZW50V2l0aFNlZWQuXG4gKlxuICogU29mdCBkZXJpdmVLZXlXaXRoU2VlZCAobS85OTk5OTkvYS9iKSBtdXN0IG5vdCBiZSB1c2VkIGZvciBzYWZlIGNoaWxkcmVuIOKAlFxuICogaXQgY2Fubm90IHJlcHJvZHVjZSBhIGhhcmRlbmVkIGtleS5cbiAqL1xuaW1wb3J0IHsgYmlwMzIgfSBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5cbi8qKiBCSVAzMiBwdXJwb3NlIGZvciBzYWZlIHdhbGxldCBkZXJpdmF0aW9uIChoYXJkZW5lZCkuICovXG5leHBvcnQgY29uc3QgU0FGRV9ERVJJVkFUSU9OX1BVUlBPU0UgPSA5OTk5OTk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTYWZlSGFyZGVuZWREZXJpdmF0aW9uUGF0aChpbmRleDogc3RyaW5nIHwgbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgaWR4ID0gdHlwZW9mIGluZGV4ID09PSAnbnVtYmVyJyA/IFN0cmluZyhpbmRleCkgOiBpbmRleDtcbiAgaWYgKCEvXlxcZCskLy50ZXN0KGlkeCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2FmZSBkZXJpdmF0aW9uIGluZGV4ICcke2luZGV4fSc6IGV4cGVjdGVkIGEgbm9uLW5lZ2F0aXZlIGludGVnZXJgKTtcbiAgfVxuICByZXR1cm4gYG0vJHtTQUZFX0RFUklWQVRJT05fUFVSUE9TRX0nLyR7aWR4fSdgO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNhZmVIYXJkZW5lZENoaWxkS2V5IHtcbiAgcHJ2OiBzdHJpbmc7XG4gIHB1Yjogc3RyaW5nO1xuICBkZXJpdmF0aW9uUGF0aDogc3RyaW5nO1xufVxuXG4vKiogSGFyZGVuZWQgQklQMzIgZGVyaXZlIGZvciBzZWNwMjU2azEgbXVsdGlzaWcgZnJvbSBhIHJvb3QgeHBydiBhbmQgbWludCBpbmRleC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXJpdmVTYWZlQ2hpbGRIYXJkZW5lZEZyb21YcHJ2KHJvb3RYcHJ2OiBzdHJpbmcsIGluZGV4OiBzdHJpbmcgfCBudW1iZXIpOiBTYWZlSGFyZGVuZWRDaGlsZEtleSB7XG4gIGNvbnN0IGRlcml2YXRpb25QYXRoID0gZ2V0U2FmZUhhcmRlbmVkRGVyaXZhdGlvblBhdGgoaW5kZXgpO1xuICBjb25zdCBjaGlsZCA9IGJpcDMyLmZyb21CYXNlNTgocm9vdFhwcnYpLmRlcml2ZVBhdGgoZGVyaXZhdGlvblBhdGgpO1xuICBpZiAoIWNoaWxkLnByaXZhdGVLZXkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBkZXJpdmUgaGFyZGVuZWQgc2FmZSBjaGlsZCBhdCAke2Rlcml2YXRpb25QYXRofWApO1xuICB9XG4gIHJldHVybiB7XG4gICAgcHJ2OiBjaGlsZC50b0Jhc2U1OCgpLFxuICAgIHB1YjogY2hpbGQubmV1dGVyZWQoKS50b0Jhc2U1OCgpLFxuICAgIGRlcml2YXRpb25QYXRoLFxuICB9O1xufVxuIl19
53
+ function deriveSafeChildHardenedFromXprv(rootXprv, index) {
54
+ const idx = parseSafeDerivationIndex(index);
55
+ const derivationPath = getSafeHardenedDerivationPath(idx);
56
+ return childFromNode(utxo_lib_1.bip32.fromBase58(rootXprv).deriveHardened(idx), derivationPath);
57
+ }
58
+ /** Re-derive and assert both results match before the child is registered. */
59
+ function deriveAndSelfCheckSafeChildHardened(rootXprv, index) {
60
+ const first = deriveSafeChildHardenedFromXprv(rootXprv, index);
61
+ const second = deriveSafeChildHardenedFromXprv(rootXprv, index);
62
+ if (first.pub !== second.pub || first.prv !== second.prv) {
63
+ throw new Error(`Safe child self-check failed at ${first.derivationPath}: derivation was not deterministic`);
64
+ }
65
+ return first;
66
+ }
67
+ /** Walk `m/0'` … `m/<max>'` until the registered child pub matches. */
68
+ function deriveSafeChildHardenedMatchingPub(rootXprv, expectedPub, maxIndex = exports.MAX_SAFE_CHILD_INDEX_SCAN) {
69
+ const root = utxo_lib_1.bip32.fromBase58(rootXprv);
70
+ const limit = parseSafeDerivationIndex(maxIndex);
71
+ for (let i = 0; i <= limit; i++) {
72
+ const derived = childFromNode(root.deriveHardened(i), getSafeHardenedDerivationPath(i));
73
+ if (derived.pub === expectedPub) {
74
+ return derived;
75
+ }
76
+ }
77
+ throw new Error(`No hardened safe child at m/0'..m/${limit}' matched the registered public key`);
78
+ }
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZURlcml2YXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYml0Z28vc2FmZS9zYWZlRGVyaXZhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFrQkEsNERBYUM7QUFFRCxzRUFFQztBQW1CRCwwRUFJQztBQUdELGtGQU9DO0FBR0QsZ0ZBY0M7QUFyRkQ7Ozs7Ozs7Ozs7R0FVRztBQUNILG1EQUE2RDtBQUU3RCxNQUFNLGVBQWUsR0FBRyxVQUFVLENBQUM7QUFFbkMsc0VBQXNFO0FBQ3pELFFBQUEseUJBQXlCLEdBQUcsSUFBSSxDQUFDO0FBRTlDLFNBQWdCLHdCQUF3QixDQUFDLEtBQXNCO0lBQzdELElBQUksR0FBVyxDQUFDO0lBQ2hCLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUIsR0FBRyxHQUFHLEtBQUssQ0FBQztJQUNkLENBQUM7U0FBTSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUMvQixHQUFHLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RCLENBQUM7U0FBTSxDQUFDO1FBQ04sTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsS0FBSyxvQ0FBb0MsQ0FBQyxDQUFDO0lBQy9GLENBQUM7SUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxlQUFlLEVBQUUsQ0FBQztRQUMvRCxNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxLQUFLLG9DQUFvQyxDQUFDLENBQUM7SUFDL0YsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELFNBQWdCLDZCQUE2QixDQUFDLEtBQXNCO0lBQ2xFLE9BQU8sS0FBSyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO0FBQ2pELENBQUM7QUFRRCxTQUFTLGFBQWEsQ0FBQyxLQUFxQixFQUFFLGNBQXNCO0lBQ2xFLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsY0FBYyxFQUFFLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBQ0QsT0FBTztRQUNMLEdBQUcsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFO1FBQ3JCLEdBQUcsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFO1FBQ2hDLGNBQWM7S0FDZixDQUFDO0FBQ0osQ0FBQztBQUVELFNBQWdCLCtCQUErQixDQUFDLFFBQWdCLEVBQUUsS0FBc0I7SUFDdEYsTUFBTSxHQUFHLEdBQUcsd0JBQXdCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUMsTUFBTSxjQUFjLEdBQUcsNkJBQTZCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUQsT0FBTyxhQUFhLENBQUMsZ0JBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0FBQ3ZGLENBQUM7QUFFRCw4RUFBOEU7QUFDOUUsU0FBZ0IsbUNBQW1DLENBQUMsUUFBZ0IsRUFBRSxLQUFzQjtJQUMxRixNQUFNLEtBQUssR0FBRywrQkFBK0IsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDL0QsTUFBTSxNQUFNLEdBQUcsK0JBQStCLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2hFLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxNQUFNLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3pELE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLEtBQUssQ0FBQyxjQUFjLG9DQUFvQyxDQUFDLENBQUM7SUFDL0csQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELHVFQUF1RTtBQUN2RSxTQUFnQixrQ0FBa0MsQ0FDaEQsUUFBZ0IsRUFDaEIsV0FBbUIsRUFDbkIsV0FBbUIsaUNBQXlCO0lBRTVDLE1BQU0sSUFBSSxHQUFHLGdCQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3hDLE1BQU0sS0FBSyxHQUFHLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2pELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNoQyxNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hGLElBQUksT0FBTyxDQUFDLEdBQUcsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUNoQyxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO0lBQ0gsQ0FBQztJQUNELE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLEtBQUsscUNBQXFDLENBQUMsQ0FBQztBQUNuRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqXG4gKiBAZXhwZXJpbWVudGFsIFNoYXJlZCBzYWZlIGNoaWxkIGRlcml2YXRpb24gZm9yIG1pbnQgYW5kIHNpZ24uXG4gKlxuICogVXNlciBjaGlsZDogaGFyZGVuZWQgYG0vPGluZGV4PidgIGZyb20gdGhlIHNlcXVlbnRpYWwgYHNhZmUuZGVyaXZhdGlvbkluZGV4W3Nsb3RdYC5cbiAqIEJhY2t1cCAvIEJpdEdvIGNoaWxkcmVuIGFyZSBzb2Z0LWRlcml2ZWQgc2VydmVyLXNpZGUgYXQgYG0vPGluZGV4PmAgKG5vdCBoZXJlKS5cbiAqXG4gKiBEbyBub3QgdXNlIGBkZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkYCAvIGBkZXJpdmVLZXlXaXRoU2VlZGAgKGBtLzk5OTk5OS9hL2JgKSDigJRcbiAqIHRoYXQgaXMgdGhlIGN1c3RvZHkgaGFzaGVkIHBhdGggYW5kIGNhbm5vdCByZXByb2R1Y2UgYSBzYWZlIGNoaWxkLlxuICovXG5pbXBvcnQgeyBiaXAzMiwgQklQMzJJbnRlcmZhY2UgfSBmcm9tICdAYml0Z28tYmV0YS91dHhvLWxpYic7XG5cbmNvbnN0IE1BWF9CSVAzMl9JTkRFWCA9IDB4N2ZmZmZmZmY7XG5cbi8qKiBTaWduLXRpbWUgc2NhbiBjYXAgKHdhbGxldCBjYXAgcGx1cyBhYmFuZG9uZWQgbWludCBpbmNyZW1lbnRzKS4gKi9cbmV4cG9ydCBjb25zdCBNQVhfU0FGRV9DSElMRF9JTkRFWF9TQ0FOID0gNDA5NjtcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2FmZURlcml2YXRpb25JbmRleChpbmRleDogc3RyaW5nIHwgbnVtYmVyKTogbnVtYmVyIHtcbiAgbGV0IGlkeDogbnVtYmVyO1xuICBpZiAodHlwZW9mIGluZGV4ID09PSAnbnVtYmVyJykge1xuICAgIGlkeCA9IGluZGV4O1xuICB9IGVsc2UgaWYgKC9eXFxkKyQvLnRlc3QoaW5kZXgpKSB7XG4gICAgaWR4ID0gTnVtYmVyKGluZGV4KTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2FmZSBkZXJpdmF0aW9uIGluZGV4ICcke2luZGV4fSc6IGV4cGVjdGVkIGEgbm9uLW5lZ2F0aXZlIGludGVnZXJgKTtcbiAgfVxuICBpZiAoIU51bWJlci5pc0ludGVnZXIoaWR4KSB8fCBpZHggPCAwIHx8IGlkeCA+IE1BWF9CSVAzMl9JTkRFWCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzYWZlIGRlcml2YXRpb24gaW5kZXggJyR7aW5kZXh9JzogZXhwZWN0ZWQgYSBub24tbmVnYXRpdmUgaW50ZWdlcmApO1xuICB9XG4gIHJldHVybiBpZHg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTYWZlSGFyZGVuZWREZXJpdmF0aW9uUGF0aChpbmRleDogc3RyaW5nIHwgbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBtLyR7cGFyc2VTYWZlRGVyaXZhdGlvbkluZGV4KGluZGV4KX0nYDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTYWZlSGFyZGVuZWRDaGlsZEtleSB7XG4gIHBydjogc3RyaW5nO1xuICBwdWI6IHN0cmluZztcbiAgZGVyaXZhdGlvblBhdGg6IHN0cmluZztcbn1cblxuZnVuY3Rpb24gY2hpbGRGcm9tTm9kZShjaGlsZDogQklQMzJJbnRlcmZhY2UsIGRlcml2YXRpb25QYXRoOiBzdHJpbmcpOiBTYWZlSGFyZGVuZWRDaGlsZEtleSB7XG4gIGlmICghY2hpbGQucHJpdmF0ZUtleSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGRlcml2ZSBoYXJkZW5lZCBzYWZlIGNoaWxkIGF0ICR7ZGVyaXZhdGlvblBhdGh9YCk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBwcnY6IGNoaWxkLnRvQmFzZTU4KCksXG4gICAgcHViOiBjaGlsZC5uZXV0ZXJlZCgpLnRvQmFzZTU4KCksXG4gICAgZGVyaXZhdGlvblBhdGgsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXJpdmVTYWZlQ2hpbGRIYXJkZW5lZEZyb21YcHJ2KHJvb3RYcHJ2OiBzdHJpbmcsIGluZGV4OiBzdHJpbmcgfCBudW1iZXIpOiBTYWZlSGFyZGVuZWRDaGlsZEtleSB7XG4gIGNvbnN0IGlkeCA9IHBhcnNlU2FmZURlcml2YXRpb25JbmRleChpbmRleCk7XG4gIGNvbnN0IGRlcml2YXRpb25QYXRoID0gZ2V0U2FmZUhhcmRlbmVkRGVyaXZhdGlvblBhdGgoaWR4KTtcbiAgcmV0dXJuIGNoaWxkRnJvbU5vZGUoYmlwMzIuZnJvbUJhc2U1OChyb290WHBydikuZGVyaXZlSGFyZGVuZWQoaWR4KSwgZGVyaXZhdGlvblBhdGgpO1xufVxuXG4vKiogUmUtZGVyaXZlIGFuZCBhc3NlcnQgYm90aCByZXN1bHRzIG1hdGNoIGJlZm9yZSB0aGUgY2hpbGQgaXMgcmVnaXN0ZXJlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXJpdmVBbmRTZWxmQ2hlY2tTYWZlQ2hpbGRIYXJkZW5lZChyb290WHBydjogc3RyaW5nLCBpbmRleDogc3RyaW5nIHwgbnVtYmVyKTogU2FmZUhhcmRlbmVkQ2hpbGRLZXkge1xuICBjb25zdCBmaXJzdCA9IGRlcml2ZVNhZmVDaGlsZEhhcmRlbmVkRnJvbVhwcnYocm9vdFhwcnYsIGluZGV4KTtcbiAgY29uc3Qgc2Vjb25kID0gZGVyaXZlU2FmZUNoaWxkSGFyZGVuZWRGcm9tWHBydihyb290WHBydiwgaW5kZXgpO1xuICBpZiAoZmlyc3QucHViICE9PSBzZWNvbmQucHViIHx8IGZpcnN0LnBydiAhPT0gc2Vjb25kLnBydikge1xuICAgIHRocm93IG5ldyBFcnJvcihgU2FmZSBjaGlsZCBzZWxmLWNoZWNrIGZhaWxlZCBhdCAke2ZpcnN0LmRlcml2YXRpb25QYXRofTogZGVyaXZhdGlvbiB3YXMgbm90IGRldGVybWluaXN0aWNgKTtcbiAgfVxuICByZXR1cm4gZmlyc3Q7XG59XG5cbi8qKiBXYWxrIGBtLzAnYCDigKYgYG0vPG1heD4nYCB1bnRpbCB0aGUgcmVnaXN0ZXJlZCBjaGlsZCBwdWIgbWF0Y2hlcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXJpdmVTYWZlQ2hpbGRIYXJkZW5lZE1hdGNoaW5nUHViKFxuICByb290WHBydjogc3RyaW5nLFxuICBleHBlY3RlZFB1Yjogc3RyaW5nLFxuICBtYXhJbmRleDogbnVtYmVyID0gTUFYX1NBRkVfQ0hJTERfSU5ERVhfU0NBTlxuKTogU2FmZUhhcmRlbmVkQ2hpbGRLZXkge1xuICBjb25zdCByb290ID0gYmlwMzIuZnJvbUJhc2U1OChyb290WHBydik7XG4gIGNvbnN0IGxpbWl0ID0gcGFyc2VTYWZlRGVyaXZhdGlvbkluZGV4KG1heEluZGV4KTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPD0gbGltaXQ7IGkrKykge1xuICAgIGNvbnN0IGRlcml2ZWQgPSBjaGlsZEZyb21Ob2RlKHJvb3QuZGVyaXZlSGFyZGVuZWQoaSksIGdldFNhZmVIYXJkZW5lZERlcml2YXRpb25QYXRoKGkpKTtcbiAgICBpZiAoZGVyaXZlZC5wdWIgPT09IGV4cGVjdGVkUHViKSB7XG4gICAgICByZXR1cm4gZGVyaXZlZDtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBObyBoYXJkZW5lZCBzYWZlIGNoaWxkIGF0IG0vMCcuLm0vJHtsaW1pdH0nIG1hdGNoZWQgdGhlIHJlZ2lzdGVyZWQgcHVibGljIGtleWApO1xufVxuIl19
@@ -21,7 +21,7 @@ export declare class Safes implements ISafes {
21
21
  private url;
22
22
  /**
23
23
  * One-call convenience wrapper chaining the three creation phases:
24
- * initialize (Phase 1) → createSafeKeys (Phase 2, 4 safeId-tagged ceremonies) →
24
+ * initialize (Phase 1) → createSafeKeys (Phase 2, enabled-slot ceremonies) →
25
25
  * finalize (Phase 3). HOT custody only in v1.
26
26
  *
27
27
  * If a key ceremony fails, `createSafeKeys` archives the safe before throwing, so a failed run
@@ -32,15 +32,16 @@ export declare class Safes implements ISafes {
32
32
  /**
33
33
  * Phase 1 — initialize a safe (metadata only, no key material).
34
34
  * POST /api/v2/enterprise/:eId/safes { label }
35
- * Response is just `{ id, status }` — the safe has no label/roster/etc. yet.
35
+ * Response is `{ id, status }` plus optional `enabledRootSlots` (absent on older WP).
36
36
  * @experimental
37
37
  */
38
38
  initializeSafe(params: InitializeSafeOptions): Promise<InitializeSafeResponse>;
39
39
  /**
40
- * Phase 2 — run the 4 root key ceremonies tagged with `safeId`; returns the 12 minted key ids
41
- * as 4 ordered [user, backup, bitgo] triplets. HOT custody only in v1.
40
+ * Phase 2 — run the enabled root key ceremonies tagged with `safeId`; returns ordered
41
+ * [user, backup, bitgo] triplets for those slots. HOT custody only in v1.
42
42
  *
43
- * All 4 ceremonies (2.1 multisig ①④, 2.2 MPC ②③) run in parallel. If any of them fail, the
43
+ * Absent `enabledRootSlots` (older WP, pre-gating) runs all 4 slots. Enabled ceremonies
44
+ * (2.1 multisig ①④, 2.2 MPC ②③) run in parallel. If any of them fail, the
44
45
  * partially-created safe is archived (a legal `initializing → archived` transition, so the
45
46
  * orphaned tagged keys are inert) and an error listing every ceremony failure is thrown —
46
47
  * create a new safe and retry.
@@ -58,7 +59,7 @@ export declare class Safes implements ISafes {
58
59
  */
59
60
  archiveSafe(safeId: string): Promise<Safe>;
60
61
  /**
61
- * Phase 3 — finalize a safe with the 12 root key ids as 4 ordered [user, backup, bitgo] triplets.
62
+ * Phase 3 — finalize a safe with the minted root key ids as ordered [user, backup, bitgo] triplets.
62
63
  * POST /api/v2/enterprise/:eId/safes/:safeId/finalize { rootKeys }.
63
64
  * Idempotent: re-finalizing with the same `rootKeys` returns the active safe again (200).
64
65
  * @experimental
@@ -1 +1 @@
1
- {"version":3,"file":"safes.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/safe/safes.ts"],"names":[],"mappings":"AAOA,OAAO,EAGL,sBAAsB,EAIvB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAIzC,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACrH,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAuC9B;;;;;;GAMG;AACH,qBAAa,KAAM,YAAW,MAAM;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAE1B,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM;IAKlD;;;OAGG;IACH,OAAO,CAAC,GAAG;IAIX;;;;;;;;OAQG;IACG,YAAY,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAM5D;;;;;OAKG;IACG,cAAc,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAKpF;;;;;;;;;;;;OAYG;IACG,cAAc,CAAC,MAAM,EAAE,iBAAiB,GAAG,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAqDvF;;;;;OAKG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAShD;;;;;OAKG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAW9E;;;OAGG;IACH,OAAO,CAAC,WAAW;IAOnB;;;;;;OAMG;YACW,kBAAkB;IA0BhC;;;;;OAKG;YACW,aAAa;IAY3B;;;;;;;OAOG;IACG,IAAI,CAAC,MAAM,GAAE,gBAAqB,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAiB1F;;;;OAIG;IACG,GAAG,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAKjD"}
1
+ {"version":3,"file":"safes.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/safe/safes.ts"],"names":[],"mappings":"AAOA,OAAO,EAGL,sBAAsB,EAKvB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAIzC,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACrH,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAuC9B;;;;;;GAMG;AACH,qBAAa,KAAM,YAAW,MAAM;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAE1B,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM;IAKlD;;;OAGG;IACH,OAAO,CAAC,GAAG;IAIX;;;;;;;;OAQG;IACG,YAAY,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAU5D;;;;;OAKG;IACG,cAAc,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAKpF;;;;;;;;;;;;;OAaG;IACG,cAAc,CAAC,MAAM,EAAE,iBAAiB,GAAG,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAwDvF;;;;;OAKG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAShD;;;;;OAKG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAW9E;;;OAGG;IACH,OAAO,CAAC,WAAW;IAOnB;;;;;;OAMG;YACW,kBAAkB;IA0BhC;;;;;OAKG;YACW,aAAa;IAY3B;;;;;;;OAOG;IACG,IAAI,CAAC,MAAM,GAAE,gBAAqB,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAiB1F;;;;OAIG;IACG,GAAG,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAKjD"}