@bitgo/sdk-core 38.0.0 → 38.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/account-lib/baseCoin/enum.d.ts +23 -22
- package/dist/src/account-lib/baseCoin/enum.d.ts.map +1 -1
- package/dist/src/account-lib/baseCoin/enum.js +27 -23
- package/dist/src/bitgo/defi/defiVault.d.ts +39 -9
- package/dist/src/bitgo/defi/defiVault.d.ts.map +1 -1
- package/dist/src/bitgo/defi/defiVault.js +137 -8
- package/dist/src/bitgo/defi/iDefiVault.d.ts +24 -3
- package/dist/src/bitgo/defi/iDefiVault.d.ts.map +1 -1
- package/dist/src/bitgo/defi/iDefiVault.js +1 -1
- package/dist/src/bitgo/enterprise/enterprise.d.ts +6 -0
- package/dist/src/bitgo/enterprise/enterprise.d.ts.map +1 -1
- package/dist/src/bitgo/enterprise/enterprise.js +9 -1
- package/dist/src/bitgo/enterprise/iEnterprise.d.ts +3 -0
- package/dist/src/bitgo/enterprise/iEnterprise.d.ts.map +1 -1
- package/dist/src/bitgo/enterprise/iEnterprise.js +1 -1
- package/dist/src/bitgo/index.d.ts +1 -0
- package/dist/src/bitgo/index.d.ts.map +1 -1
- package/dist/src/bitgo/index.js +2 -1
- package/dist/src/bitgo/keychain/iKeychains.d.ts +12 -0
- package/dist/src/bitgo/keychain/iKeychains.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/iKeychains.js +1 -1
- package/dist/src/bitgo/keychain/keychains.d.ts +15 -3
- package/dist/src/bitgo/keychain/keychains.d.ts.map +1 -1
- package/dist/src/bitgo/keychain/keychains.js +32 -14
- package/dist/src/bitgo/pendingApproval/pendingApproval.d.ts.map +1 -1
- package/dist/src/bitgo/pendingApproval/pendingApproval.js +1 -1
- package/dist/src/bitgo/safe/iSafe.d.ts +85 -0
- package/dist/src/bitgo/safe/iSafe.d.ts.map +1 -0
- package/dist/src/bitgo/safe/iSafe.js +3 -0
- package/dist/src/bitgo/safe/iSafes.d.ts +86 -0
- package/dist/src/bitgo/safe/iSafes.d.ts.map +1 -0
- package/dist/src/bitgo/safe/iSafes.js +3 -0
- package/dist/src/bitgo/safe/index.d.ts +5 -0
- package/dist/src/bitgo/safe/index.d.ts.map +1 -0
- package/dist/src/bitgo/safe/index.js +21 -0
- package/dist/src/bitgo/safe/safe.d.ts +66 -0
- package/dist/src/bitgo/safe/safe.d.ts.map +1 -0
- package/dist/src/bitgo/safe/safe.js +96 -0
- package/dist/src/bitgo/safe/safes.d.ts +104 -0
- package/dist/src/bitgo/safe/safes.d.ts.map +1 -0
- package/dist/src/bitgo/safe/safes.js +294 -0
- package/dist/src/bitgo/tss/common.d.ts.map +1 -1
- package/dist/src/bitgo/tss/common.js +3 -1
- package/dist/src/bitgo/utils/mpcUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/mpcUtils.js +13 -6
- package/dist/src/bitgo/utils/tss/baseTSSUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/baseTSSUtils.js +3 -1
- package/dist/src/bitgo/utils/tss/baseTypes.d.ts +5 -2
- package/dist/src/bitgo/utils/tss/baseTypes.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/baseTypes.js +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts +1 -0
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsa.js +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts +3 -2
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2.js +15 -14
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/ecdsa/ecdsaMPCv2KeyGenSender.js +6 -3
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts +1 -0
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsa.js +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts +21 -2
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2.js +108 -14
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/eddsa/eddsaMPCv2KeyGenSender.js +6 -3
- package/dist/src/bitgo/utils/tss/recipientUtils.d.ts.map +1 -1
- package/dist/src/bitgo/utils/tss/recipientUtils.js +2 -1
- package/dist/src/bitgo/wallet/BuildParams.d.ts +30 -0
- package/dist/src/bitgo/wallet/BuildParams.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/BuildParams.js +27 -2
- package/dist/src/bitgo/wallet/iWallet.d.ts +54 -0
- package/dist/src/bitgo/wallet/iWallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/iWallet.js +1 -1
- package/dist/src/bitgo/wallet/iWallets.d.ts +48 -1
- package/dist/src/bitgo/wallet/iWallets.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/iWallets.js +1 -1
- package/dist/src/bitgo/wallet/wallet.d.ts +24 -1
- package/dist/src/bitgo/wallet/wallet.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallet.js +218 -3
- package/dist/src/bitgo/wallet/wallets.d.ts.map +1 -1
- package/dist/src/bitgo/wallet/wallets.js +3 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -1
- package/dist/test/unit/bitgo/defi/defiVault.js +336 -132
- package/dist/test/unit/bitgo/safe/safe.d.ts +2 -0
- package/dist/test/unit/bitgo/safe/safe.d.ts.map +1 -0
- package/dist/test/unit/bitgo/safe/safe.js +134 -0
- package/dist/test/unit/bitgo/safe/safes.d.ts +2 -0
- package/dist/test/unit/bitgo/safe/safes.d.ts.map +1 -0
- package/dist/test/unit/bitgo/safe/safes.js +297 -0
- package/dist/test/unit/bitgo/utils/tss/eddsa/eddsaMPCv2.js +246 -1
- package/dist/test/unit/bitgo/utils/tss/recipientUtils.js +2 -1
- package/dist/test/unit/bitgo/wallet/BuildParams.js +28 -1
- package/dist/test/unit/bitgo/wallet/SendTransactionRequest.js +8 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
|
@@ -59,28 +59,29 @@ export declare enum TransactionType {
|
|
|
59
59
|
AllocationRequest = 54,
|
|
60
60
|
AllocationReject = 55,
|
|
61
61
|
CantonCommand = 56,
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
62
|
+
EndInvestorOnboardingOffer = 57,
|
|
63
|
+
FREEZE = 58,
|
|
64
|
+
VOTE = 59,
|
|
65
|
+
UNFREEZE = 60,
|
|
66
|
+
WITHDRAW_EXPIRE_UNFREEZE = 61,
|
|
67
|
+
CLAIM_REWARDS = 62,
|
|
68
|
+
AccountCreate = 63,
|
|
69
|
+
stakingLock = 64,
|
|
70
|
+
'self-stack' = 65,
|
|
71
|
+
staking = 66,
|
|
72
|
+
stakingUnlock = 67,
|
|
73
|
+
RejectInstruction = 68,
|
|
74
|
+
ImportToC = 69,
|
|
75
|
+
TonWhalesDeposit = 70,
|
|
76
|
+
TonWhalesWithdrawal = 71,
|
|
77
|
+
TonWhalesVestingDeposit = 72,
|
|
78
|
+
TonWhalesVestingWithdrawal = 73,
|
|
79
|
+
AccountDelete = 74,
|
|
80
|
+
MPTokenAuthorize = 75,
|
|
81
|
+
SendMPT = 76,
|
|
82
|
+
DecryptionDelegation = 77,
|
|
83
|
+
SendERC7984 = 78,
|
|
84
|
+
FlushERC7984ForwarderToken = 79
|
|
84
85
|
}
|
|
85
86
|
/**
|
|
86
87
|
* Generic list of encoding formats. Can be used as arguments for methods inputs.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enum.d.ts","sourceRoot":"","sources":["../../../../src/account-lib/baseCoin/enum.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,oBAAY,eAAe;IACzB,IAAI,IAAA;IAEJ,UAAU,IAAA;IAEV,WAAW,IAAA;IAEX,oBAAoB,IAAA;IAEpB,qBAAqB,IAAA;IAErB,oCAAoC,IAAA;IAEpC,WAAW,IAAA;IAEX,UAAU,IAAA;IAEV,aAAa,IAAA;IAEb,aAAa,IAAA;IAEb,WAAW,KAAA;IAEX,WAAW,KAAA;IAEX,aAAa,KAAA;IAEb,eAAe,KAAA;IAEf,aAAa,KAAA;IAEb,eAAe,KAAA;IAEf,YAAY,KAAA;IAEZ,iBAAiB,KAAA;IAEjB,KAAK,KAAA;IAEL,YAAY,KAAA;IAGZ,YAAY,KAAA;IAGZ,YAAY,KAAA;IAEZ,MAAM,KAAA;IACN,MAAM,KAAA;IAEN,wBAAwB,KAAA;IAExB,UAAU,KAAA;IAEV,aAAa,KAAA;IAEb,cAAc,KAAA;IAEd,gBAAgB,KAAA;IAEhB,mBAAmB,KAAA;IAEnB,eAAe,KAAA;IAEf,QAAQ,KAAA;IACR,iBAAiB,KAAA;IACjB,0BAA0B,KAAA;IAC1B,0BAA0B,KAAA;IAE1B,2BAA2B,KAAA;IAC3B,uBAAuB,KAAA;IAEvB,SAAS,KAAA;IAET,SAAS,KAAA;IAET,OAAO,KAAA;IAEP,gBAAgB,KAAA;IAEhB,kBAAkB,KAAA;IAClB,cAAc,KAAA;IAEd,WAAW,KAAA;IAEX,YAAY,KAAA;IAEZ,kBAAkB,KAAA;IAElB,cAAc,KAAA;IAEd,mBAAmB,KAAA;IAEnB,cAAc,KAAA;IAEd,sBAAsB,KAAA;IAEtB,wBAAwB,KAAA;IAExB,sBAAsB,KAAA;IAEtB,kBAAkB,KAAA;IAElB,2BAA2B,KAAA;IAE3B,iBAAiB,KAAA;IAEjB,gBAAgB,KAAA;IAEhB,aAAa,KAAA;
|
|
1
|
+
{"version":3,"file":"enum.d.ts","sourceRoot":"","sources":["../../../../src/account-lib/baseCoin/enum.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,oBAAY,eAAe;IACzB,IAAI,IAAA;IAEJ,UAAU,IAAA;IAEV,WAAW,IAAA;IAEX,oBAAoB,IAAA;IAEpB,qBAAqB,IAAA;IAErB,oCAAoC,IAAA;IAEpC,WAAW,IAAA;IAEX,UAAU,IAAA;IAEV,aAAa,IAAA;IAEb,aAAa,IAAA;IAEb,WAAW,KAAA;IAEX,WAAW,KAAA;IAEX,aAAa,KAAA;IAEb,eAAe,KAAA;IAEf,aAAa,KAAA;IAEb,eAAe,KAAA;IAEf,YAAY,KAAA;IAEZ,iBAAiB,KAAA;IAEjB,KAAK,KAAA;IAEL,YAAY,KAAA;IAGZ,YAAY,KAAA;IAGZ,YAAY,KAAA;IAEZ,MAAM,KAAA;IACN,MAAM,KAAA;IAEN,wBAAwB,KAAA;IAExB,UAAU,KAAA;IAEV,aAAa,KAAA;IAEb,cAAc,KAAA;IAEd,gBAAgB,KAAA;IAEhB,mBAAmB,KAAA;IAEnB,eAAe,KAAA;IAEf,QAAQ,KAAA;IACR,iBAAiB,KAAA;IACjB,0BAA0B,KAAA;IAC1B,0BAA0B,KAAA;IAE1B,2BAA2B,KAAA;IAC3B,uBAAuB,KAAA;IAEvB,SAAS,KAAA;IAET,SAAS,KAAA;IAET,OAAO,KAAA;IAEP,gBAAgB,KAAA;IAEhB,kBAAkB,KAAA;IAClB,cAAc,KAAA;IAEd,WAAW,KAAA;IAEX,YAAY,KAAA;IAEZ,kBAAkB,KAAA;IAElB,cAAc,KAAA;IAEd,mBAAmB,KAAA;IAEnB,cAAc,KAAA;IAEd,sBAAsB,KAAA;IAEtB,wBAAwB,KAAA;IAExB,sBAAsB,KAAA;IAEtB,kBAAkB,KAAA;IAElB,2BAA2B,KAAA;IAE3B,iBAAiB,KAAA;IAEjB,gBAAgB,KAAA;IAEhB,aAAa,KAAA;IAIb,0BAA0B,KAAA;IAG1B,MAAM,KAAA;IACN,IAAI,KAAA;IACJ,QAAQ,KAAA;IACR,wBAAwB,KAAA;IACxB,aAAa,KAAA;IAEb,aAAa,KAAA;IAGb,WAAW,KAAA;IAEX,YAAY,KAAA;IAGZ,OAAO,KAAA;IAGP,aAAa,KAAA;IAGb,iBAAiB,KAAA;IAGjB,SAAS,KAAA;IAGT,gBAAgB,KAAA;IAChB,mBAAmB,KAAA;IACnB,uBAAuB,KAAA;IACvB,0BAA0B,KAAA;IAG1B,aAAa,KAAA;IAEb,gBAAgB,KAAA;IAEhB,OAAO,KAAA;IAEP,oBAAoB,KAAA;IAEpB,WAAW,KAAA;IAGX,0BAA0B,KAAA;CAC3B;AAED;;GAEG;AACH,oBAAY,aAAa;IACvB,GAAG,QAAQ;IACX,MAAM,WAAW;IACjB,OAAO,YAAY;IACnB,OAAO,YAAY;CACpB;AAID,oBAAY,gBAAgB;IAE1B,SAAS,KAAK;IAEd,QAAQ,IAAI;CACb;AAED,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,MAAM,CAAC;AAE3C,oBAAY,qBAAqB;IAC/B,IAAI,IAAA;IACJ,IAAI,IAAA;IACJ,MAAM,IAAA;IACN,QAAQ,IAAA;IACR,MAAM,IAAA;IACN,QAAQ,IAAA;CACT"}
|
|
@@ -115,44 +115,48 @@ var TransactionType;
|
|
|
115
115
|
TransactionType[TransactionType["AllocationReject"] = 55] = "AllocationReject";
|
|
116
116
|
// canton generic DAML command
|
|
117
117
|
TransactionType[TransactionType["CantonCommand"] = 56] = "CantonCommand";
|
|
118
|
+
// canton end investor onboarding offer (internal/dummy txRequest recording an on-chain
|
|
119
|
+
// EndInvestorOnboardingOffer contract on the end investor's wallet so they can accept or reject.
|
|
120
|
+
// Never signed or submitted — built locally without an IMS call.)
|
|
121
|
+
TransactionType[TransactionType["EndInvestorOnboardingOffer"] = 57] = "EndInvestorOnboardingOffer";
|
|
118
122
|
// trx
|
|
119
|
-
TransactionType[TransactionType["FREEZE"] =
|
|
120
|
-
TransactionType[TransactionType["VOTE"] =
|
|
121
|
-
TransactionType[TransactionType["UNFREEZE"] =
|
|
122
|
-
TransactionType[TransactionType["WITHDRAW_EXPIRE_UNFREEZE"] =
|
|
123
|
-
TransactionType[TransactionType["CLAIM_REWARDS"] =
|
|
123
|
+
TransactionType[TransactionType["FREEZE"] = 58] = "FREEZE";
|
|
124
|
+
TransactionType[TransactionType["VOTE"] = 59] = "VOTE";
|
|
125
|
+
TransactionType[TransactionType["UNFREEZE"] = 60] = "UNFREEZE";
|
|
126
|
+
TransactionType[TransactionType["WITHDRAW_EXPIRE_UNFREEZE"] = 61] = "WITHDRAW_EXPIRE_UNFREEZE";
|
|
127
|
+
TransactionType[TransactionType["CLAIM_REWARDS"] = 62] = "CLAIM_REWARDS";
|
|
124
128
|
// Create an account on-chain (e.g. TRX AccountCreateContract)
|
|
125
|
-
TransactionType[TransactionType["AccountCreate"] =
|
|
129
|
+
TransactionType[TransactionType["AccountCreate"] = 63] = "AccountCreate";
|
|
126
130
|
// cspr and stx
|
|
127
|
-
TransactionType[TransactionType["stakingLock"] =
|
|
131
|
+
TransactionType[TransactionType["stakingLock"] = 64] = "stakingLock";
|
|
128
132
|
// stx
|
|
129
|
-
TransactionType[TransactionType["self-stack"] =
|
|
133
|
+
TransactionType[TransactionType["self-stack"] = 65] = "self-stack";
|
|
130
134
|
// btc,
|
|
131
|
-
TransactionType[TransactionType["staking"] =
|
|
135
|
+
TransactionType[TransactionType["staking"] = 66] = "staking";
|
|
132
136
|
// cspr
|
|
133
|
-
TransactionType[TransactionType["stakingUnlock"] =
|
|
137
|
+
TransactionType[TransactionType["stakingUnlock"] = 67] = "stakingUnlock";
|
|
134
138
|
// polyx
|
|
135
|
-
TransactionType[TransactionType["RejectInstruction"] =
|
|
139
|
+
TransactionType[TransactionType["RejectInstruction"] = 68] = "RejectInstruction";
|
|
136
140
|
// flrp
|
|
137
|
-
TransactionType[TransactionType["ImportToC"] =
|
|
141
|
+
TransactionType[TransactionType["ImportToC"] = 69] = "ImportToC";
|
|
138
142
|
// ton whales
|
|
139
|
-
TransactionType[TransactionType["TonWhalesDeposit"] =
|
|
140
|
-
TransactionType[TransactionType["TonWhalesWithdrawal"] =
|
|
141
|
-
TransactionType[TransactionType["TonWhalesVestingDeposit"] =
|
|
142
|
-
TransactionType[TransactionType["TonWhalesVestingWithdrawal"] =
|
|
143
|
+
TransactionType[TransactionType["TonWhalesDeposit"] = 70] = "TonWhalesDeposit";
|
|
144
|
+
TransactionType[TransactionType["TonWhalesWithdrawal"] = 71] = "TonWhalesWithdrawal";
|
|
145
|
+
TransactionType[TransactionType["TonWhalesVestingDeposit"] = 72] = "TonWhalesVestingDeposit";
|
|
146
|
+
TransactionType[TransactionType["TonWhalesVestingWithdrawal"] = 73] = "TonWhalesVestingWithdrawal";
|
|
143
147
|
// xrp — delete an account and recover the full balance including reserve
|
|
144
|
-
TransactionType[TransactionType["AccountDelete"] =
|
|
148
|
+
TransactionType[TransactionType["AccountDelete"] = 74] = "AccountDelete";
|
|
145
149
|
// xrp — opt-in to receive a Multi-Purpose Token (MPTokenAuthorize)
|
|
146
|
-
TransactionType[TransactionType["MPTokenAuthorize"] =
|
|
150
|
+
TransactionType[TransactionType["MPTokenAuthorize"] = 75] = "MPTokenAuthorize";
|
|
147
151
|
// xrp — send a Multi-Purpose Token via Payment with MPT Amount object
|
|
148
|
-
TransactionType[TransactionType["SendMPT"] =
|
|
152
|
+
TransactionType[TransactionType["SendMPT"] = 76] = "SendMPT";
|
|
149
153
|
// Delegate decryption access for Zama ERC-7984 confidential tokens via ACL contract
|
|
150
|
-
TransactionType[TransactionType["DecryptionDelegation"] =
|
|
154
|
+
TransactionType[TransactionType["DecryptionDelegation"] = 77] = "DecryptionDelegation";
|
|
151
155
|
// Send ERC-7984 confidential tokens via encrypted transfer
|
|
152
|
-
TransactionType[TransactionType["SendERC7984"] =
|
|
156
|
+
TransactionType[TransactionType["SendERC7984"] = 78] = "SendERC7984";
|
|
153
157
|
// Flush ERC-7984 confidential tokens from a forwarder address to the parent wallet
|
|
154
158
|
// via forwarder.callFromParent(tokenAddr, 0, confidentialTransfer(parentAddr, handle))
|
|
155
|
-
TransactionType[TransactionType["FlushERC7984ForwarderToken"] =
|
|
159
|
+
TransactionType[TransactionType["FlushERC7984ForwarderToken"] = 79] = "FlushERC7984ForwarderToken";
|
|
156
160
|
})(TransactionType || (exports.TransactionType = TransactionType = {}));
|
|
157
161
|
/**
|
|
158
162
|
* Generic list of encoding formats. Can be used as arguments for methods inputs.
|
|
@@ -182,4 +186,4 @@ var StakingOperationTypes;
|
|
|
182
186
|
StakingOperationTypes[StakingOperationTypes["UNLOCK"] = 4] = "UNLOCK";
|
|
183
187
|
StakingOperationTypes[StakingOperationTypes["WITHDRAW"] = 5] = "WITHDRAW";
|
|
184
188
|
})(StakingOperationTypes || (exports.StakingOperationTypes = StakingOperationTypes = {}));
|
|
185
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW51bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hY2NvdW50LWxpYi9iYXNlQ29pbi9lbnVtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOztHQUVHO0FBQ0gsSUFBWSxlQTRKWDtBQTVKRCxXQUFZLGVBQWU7SUFDekIscURBQUksQ0FBQTtJQUNKLCtCQUErQjtJQUMvQixpRUFBVSxDQUFBO0lBQ1YsZ0NBQWdDO0lBQ2hDLG1FQUFXLENBQUE7SUFDWCxvRUFBb0U7SUFDcEUscUZBQW9CLENBQUE7SUFDcEIscUVBQXFFO0lBQ3JFLHVGQUFxQixDQUFBO0lBQ3JCLDBDQUEwQztJQUMxQyxxSEFBb0MsQ0FBQTtJQUNwQyw0REFBNEQ7SUFDNUQsbUVBQVcsQ0FBQTtJQUNYLHdFQUF3RTtJQUN4RSxpRUFBVSxDQUFBO0lBQ1Ysb0NBQW9DO0lBQ3BDLHVFQUFhLENBQUE7SUFDYiw4RUFBOEU7SUFDOUUsdUVBQWEsQ0FBQTtJQUNiLE9BQU87SUFDUCxvRUFBVyxDQUFBO0lBQ1gsT0FBTztJQUNQLG9FQUFXLENBQUE7SUFDWCxTQUFTO0lBQ1Qsd0VBQWEsQ0FBQTtJQUNiLFdBQVc7SUFDWCw0RUFBZSxDQUFBO0lBQ2YsU0FBUztJQUNULHdFQUFhLENBQUE7SUFDYixXQUFXO0lBQ1gsNEVBQWUsQ0FBQTtJQUNmLDhCQUE4QjtJQUM5QixzRUFBWSxDQUFBO0lBQ1osYUFBYTtJQUNiLGdGQUFpQixDQUFBO0lBQ2pCLG1FQUFtRTtJQUNuRSx3REFBSyxDQUFBO0lBQ0wsNEJBQTRCO0lBQzVCLHNFQUFZLENBQUE7SUFDWiwyQkFBMkI7SUFDM0IsY0FBYztJQUNkLHNFQUFZLENBQUE7SUFDWiwyQkFBMkI7SUFDM0IsY0FBYztJQUNkLHNFQUFZLENBQUE7SUFDWix5Q0FBeUM7SUFDekMsMERBQU0sQ0FBQTtJQUNOLDBEQUFNLENBQUE7SUFDTiwyQ0FBMkM7SUFDM0MsOEZBQXdCLENBQUE7SUFDeEIsY0FBYztJQUNkLGtF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QUFZLHFCQUFxQjtJQUMvQixpRUFBSSxDQUFBO0lBQ0osaUVBQUksQ0FBQTtJQUNKLHFFQUFNLENBQUE7SUFDTix5RUFBUSxDQUFBO0lBQ1IscUVBQU0sQ0FBQTtJQUNOLHlFQUFRLENBQUE7QUFDVixDQUFDLEVBUFcscUJBQXFCLHFDQUFyQixxQkFBcUIsUUFPaEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEludGVybmFsIG1ldGFkYXRhLiBEZWZpbmVzIHRoZSB0eXBlIG9mIHRyYW5zYWN0aW9uLlxuICovXG5leHBvcnQgZW51bSBUcmFuc2FjdGlvblR5cGUge1xuICBTZW5kLFxuICAvLyBTZW5kIEVSQzcyMSBjb21wbGlhbnQgdG9rZW5zXG4gIFNlbmRFUkM3MjEsXG4gIC8vIFNlbmQgRVJDMTE1NSBjb21wbGlhbnQgdG9rZW5zXG4gIFNlbmRFUkMxMTU1LFxuICAvLyBJbml0aWFsaXplIGEgd2FsbGV0IG9uLWNoYWluIChlLmcuIE11bHRpLXNpZyBjb250cmFjdCBkZXBsb3ltZW50KVxuICBXYWxsZXRJbml0aWFsaXphdGlvbixcbiAgLy8gSW5pdGlhbGl6ZSBhbiBhZGRyZXNzIG9uLWNoYWluKGUuZy4gRm9yd2FyZGVyIGNvbnRyYWN0IGRlcGxveW1lbnQpXG4gIEFkZHJlc3NJbml0aWFsaXphdGlvbixcbiAgLy8gSW5pdGlhbGl6ZWQgYW4gYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50XG4gIEFzc29jaWF0ZWRUb2tlbkFjY291bnRJbml0aWFsaXphdGlvbixcbiAgLy8gRmx1c2ggdG9rZW5zIGZyb20gYSBmb3J3YXJkZXIgYWRkcmVzcyB0byBpdHMgYmFzZSBhZGRyZXNzXG4gIEZsdXNoVG9rZW5zLFxuICAvLyBGbHVzaCBuYXRpdmUgY29pbnMgKGVnLiBFVEgpIGZyb20gYSBmb3J3YXJkZXIgYWRkcmVzcyB0byBiYXNlIGFkZHJlc3NcbiAgRmx1c2hDb2lucyxcbiAgLy8gU2VuZCBhIHJhdyBzaW5nbGUtc2lnIHRyYW5zYWN0aW9uXG4gIFNpbmdsZVNpZ1NlbmQsXG4gIC8vIFVwZGF0ZSBhbiBhY2NvdW50IG9uLWNoYWluIChlLmcuIFB1YmxpYyBrZXkgcmV2ZWxhdGlvbiBvcGVyYXRpb24gZm9yIFRlem9zKVxuICBBY2NvdW50VXBkYXRlLFxuICAvLyBMb2NrXG4gIFN0YWtpbmdMb2NrLFxuICAvLyBWb3RlXG4gIFN0YWtpbmdWb3RlLFxuICAvLyBVbnZvdGVcbiAgU3Rha2luZ1Vudm90ZSxcbiAgLy8gQWN0aXZhdGVcbiAgU3Rha2luZ0FjdGl2YXRlLFxuICAvLyBVbmxvY2tcbiAgU3Rha2luZ1VubG9jayxcbiAgLy8gV2l0aGRyYXdcbiAgU3Rha2luZ1dpdGhkcmF3LFxuICAvLyBIYW5kbGUgc21hcnQgY29udHJhY3QgY2FsbHNcbiAgQ29udHJhY3RDYWxsLFxuICAvLyBEZWFjdGl2YXRlXG4gIFN0YWtpbmdEZWFjdGl2YXRlLFxuICAvLyBCYXRjaCBvZiBtdWx0aXBsZSB0cmFuc2FjdGlvbnMgYnJvYWRjYXN0IGFzIGEgc2luZ2xlIHRyYW5zYWN0aW9uXG4gIEJhdGNoLFxuICAvLyBDbGFpbSB0aGUgc3Rha2luZyByZXdhcmRzXG4gIFN0YWtpbmdDbGFpbSxcbiAgLy8gQWRkIGRlbGVnYXRvciB0byBwLWNoYWluXG4gIC8vIEBkZXByZWNhdGVkXG4gIEFkZERlbGVnYXRvcixcbiAgLy8gQWRkIHZhbGlkYXRvciB0byBwLWNoYWluXG4gIC8vIEBkZXByZWNhdGVkXG4gIEFkZFZhbGlkYXRvcixcbiAgLy8gQ3Jvc3MgY2hhaW4gdHJhbnNmZXIgYXQgQXZheCBhbmQgZmxhcmVcbiAgRXhwb3J0LFxuICBJbXBvcnQsXG4gIC8vIENyb3NzIGNoYWluIFJlY292ZXJ5IGZvciBldm0gbGlrZSBjaGFpbnNcbiAgUmVjb3ZlcnlXYWxsZXREZXBsb3ltZW50LFxuICAvLyBBZGQgc3Rha2luZ1xuICBTdGFraW5nQWRkLFxuICAvLyBTdGFraW5nIHBsZWRnZSAoZS5nLiBBREEpXG4gIFN0YWtpbmdQbGVkZ2UsXG4gIC8vIERlbGVnYXRpbmcgdm90ZSAoZS5nLiBBREEpXG4gIFZvdGVEZWxlZ2F0aW9uLFxuICAvLyBTdGFraW5nIEF1dGhvcml6ZSAoZS5nLiBTT0wpXG4gIFN0YWtpbmdBdXRob3JpemUsXG4gIC8vIFN0YWtpbmcgQXV0aG9yaXplIGZyb20gcmF3IG1lc3NhZ2UgKGUuZy4gU09MKVxuICBTdGFraW5nQXV0aG9yaXplUmF3LFxuICAvLyBEZWxlZ2F0ZVxuICBTdGFraW5nRGVsZWdhdGUsXG4gIC8vIEN1c3RvbSB0cmFuc2FjdGlvbiAoZS5nLiBTVUkpXG4gIEN1c3RvbVR4LFxuICBTdGFraW5nUmVkZWxlZ2F0ZSxcbiAgQWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3IsXG4gIEFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yLFxuICAvLyBDbG9zaW5nIGFuIGFzc29jaWF0ZWQgdG9rZW4gYWNjb3VudCAoZS5nLiBTT0wpXG4gIENsb3NlQXNzb2NpYXRlZFRva2VuQWNjb3VudCxcbiAgU2luZ2xlTm9taW5hdG9yV2l0aGRyYXcsXG4gIC8vIFNlbmQgVG9rZW5zIChlLmcgWFJQTCB0b2tlbnMpXG4gIFNlbmRUb2tlbixcbiAgLy8gU2V0dXAgYSB0cnVzdGxpbmUgd2l0aCBpc3N1ZXIgb2YgYSB0b2tlbiAoZWcuIFhSUEwgdG9rZW5zKVxuICBUcnVzdExpbmUsXG4gIC8vIFNlbmQgTm9uIEZ1bmdpYmxlIFRva2VuIChlLmcuIEFQVCBORlRzKVxuICBTZW5kTkZULFxuICAvLyBEZWxlZ2F0ZSByZXNvdXJjZSAoZS5nLiBUUlgpXG4gIERlbGVnYXRlUmVzb3VyY2UsXG4gIC8vIFVuLWRlbGVnYXRlIHJlc291cmNlIChlLmcuIFRSWClcbiAgVW5EZWxlZ2F0ZVJlc291cmNlLFxuICBTdG9yYWdlRGVwb3NpdCxcbiAgLy8gRmx1c2ggRVJDNzIxIE5GVHMgZnJvbSBhIGZvcndhcmRlciBhZGRyZXNzIHRvIGJhc2UgYWRkcmVzc1xuICBGbHVzaEVSQzcyMSxcbiAgLy8gRmx1c2ggRVJDMTE1NSB0b2tlbnMgZnJvbSBhIGZvcndhcmRlciBhZGRyZXNzIHRvIGJhc2UgYWRkcmVzc1xuICBGbHVzaEVSQzExNTUsXG4gIC8vIFNldCB1cCAxLXN0ZXAgcHJlLWFwcHJvdmFsIGZvciBjYW50b25cbiAgT25lU3RlcFByZUFwcHJvdmFsLFxuICAvLyBjYW50b24gdHJhbnNmZXIgYWNjZXB0LCAyLXN0ZXBcbiAgVHJhbnNmZXJBY2NlcHQsXG4gIC8vIGNhbnRvbiB0cmFuc2ZlciBhY2tub3dsZWRnZW1lbnRcbiAgVHJhbnNmZXJBY2tub3dsZWRnZSxcbiAgLy8gY2FudG9uIHRyYW5zZmVyIHJlamVjdCwgMi1zdGVwXG4gIFRyYW5zZmVyUmVqZWN0LFxuICAvLyBjYW50b24gdHJhbnNmZXIgb2ZmZXIgd2l0aGRyYXduLCAyLXN0ZXBcbiAgVHJhbnNmZXJPZmZlcldpdGhkcmF3bixcbiAgLy8gY2FudG9uIGNvc2lnbiBkZWxlZ2F0aW9uIHByb3Bvc2FsXG4gIENvc2lnbkRlbGVnYXRpb25Qcm9wb3NhbCxcbiAgLy8gY2FudG9uIGNvc2lnbiBkZWxlZ2F0aW9uIGFjY2VwdFxuICBDb3NpZ25EZWxlZ2F0aW9uQWNjZXB0LFxuICAvLyBjYW50b24gYWxsb2NhdGlvbiBhbGxvY2F0ZVxuICBBbGxvY2F0aW9uQWxsb2NhdGUsXG4gIC8vIGNhbnRvbiBhbGxvY2F0aW9uIGFsbG9jYXRlIHdpdGhkcmF3blxuICBBbGxvY2F0aW9uQWxsb2NhdGVXaXRoZHJhd24sXG4gIC8vIGNhbnRvbiBhbGxvY2F0aW9uIHJlcXVlc3QgKGludGVybmFsL2R1bW15IHR4UmVxdWVzdCBzdXJmYWNpbmcgRHZQIHRyYWRlIGRldGFpbHMgdG8gdGhlIGFsbG9jYXRpbmcgcGFydHkpXG4gIEFsbG9jYXRpb25SZXF1ZXN0LFxuICAvLyBjYW50b24gYWxsb2NhdGlvbiByZWplY3RcbiAgQWxsb2NhdGlvblJlamVjdCxcbiAgLy8gY2FudG9uIGdlbmVyaWMgREFNTCBjb21tYW5kXG4gIENhbnRvbkNvbW1hbmQsXG5cbiAgLy8gdHJ4XG4gIEZSRUVaRSxcbiAgVk9URSxcbiAgVU5GUkVFWkUsXG4gIFdJVEhEUkFXX0VYUElSRV9VTkZSRUVaRSxcbiAgQ0xBSU1fUkVXQVJEUyxcbiAgLy8gQ3JlYXRlIGFuIGFjY291bnQgb24tY2hhaW4gKGUuZy4gVFJYIEFjY291bnRDcmVhdGVDb250cmFjdClcbiAgQWNjb3VudENyZWF0ZSxcblxuICAvLyBjc3ByIGFuZCBzdHhcbiAgc3Rha2luZ0xvY2ssXG4gIC8vIHN0eFxuICAnc2VsZi1zdGFjaycsXG5cbiAgLy8gYnRjLFxuICBzdGFraW5nLFxuXG4gIC8vIGNzcHJcbiAgc3Rha2luZ1VubG9jayxcblxuICAvLyBwb2x5eFxuICBSZWplY3RJbnN0cnVjdGlvbixcblxuICAvLyBmbHJwXG4gIEltcG9ydFRvQyxcblxuICAvLyB0b24gd2hhbGVzXG4gIFRvbldoYWxlc0RlcG9zaXQsXG4gIFRvbldoYWxlc1dpdGhkcmF3YWwsXG4gIFRvbldoYWxlc1Zlc3RpbmdEZXBvc2l0LFxuICBUb25XaGFsZXNWZXN0aW5nV2l0aGRyYXdhbCxcblxuICAvLyB4cnAg4oCUIGRlbGV0ZSBhbiBhY2NvdW50IGFuZCByZWNvdmVyIHRoZSBmdWxsIGJhbGFuY2UgaW5jbHVkaW5nIHJlc2VydmVcbiAgQWNjb3VudERlbGV0ZSxcbiAgLy8geHJwIOKAlCBvcHQtaW4gdG8gcmVjZWl2ZSBhIE11bHRpLVB1cnBvc2UgVG9rZW4gKE1QVG9rZW5BdXRob3JpemUpXG4gIE1QVG9rZW5BdXRob3JpemUsXG4gIC8vIHhycCDigJQgc2VuZCBhIE11bHRpLVB1cnBvc2UgVG9rZW4gdmlhIFBheW1lbnQgd2l0aCBNUFQgQW1vdW50IG9iamVjdFxuICBTZW5kTVBULFxuICAvLyBEZWxlZ2F0ZSBkZWNyeXB0aW9uIGFjY2VzcyBmb3IgWmFtYSBFUkMtNzk4NCBjb25maWRlbnRpYWwgdG9rZW5zIHZpYSBBQ0wgY29udHJhY3RcbiAgRGVjcnlwdGlvbkRlbGVnYXRpb24sXG4gIC8vIFNlbmQgRVJDLTc5ODQgY29uZmlkZW50aWFsIHRva2VucyB2aWEgZW5jcnlwdGVkIHRyYW5zZmVyXG4gIFNlbmRFUkM3OTg0LFxuICAvLyBGbHVzaCBFUkMtNzk4NCBjb25maWRlbnRpYWwgdG9rZW5zIGZyb20gYSBmb3J3YXJkZXIgYWRkcmVzcyB0byB0aGUgcGFyZW50IHdhbGxldFxuICAvLyB2aWEgZm9yd2FyZGVyLmNhbGxGcm9tUGFyZW50KHRva2VuQWRkciwgMCwgY29uZmlkZW50aWFsVHJhbnNmZXIocGFyZW50QWRkciwgaGFuZGxlKSlcbiAgRmx1c2hFUkM3OTg0Rm9yd2FyZGVyVG9rZW4sXG59XG5cbi8qKlxuICogR2VuZXJpYyBsaXN0IG9mIGVuY29kaW5nIGZvcm1hdHMuIENhbiBiZSB1c2VkIGFzIGFyZ3VtZW50cyBmb3IgbWV0aG9kcyBpbnB1dHMuXG4gKi9cbmV4cG9ydCBlbnVtIEFkZHJlc3NGb3JtYXQge1xuICBoZXggPSAnaGV4JyxcbiAgYmFzZTU4ID0gJ2Jhc2U1OCcsXG4gIG1haW5uZXQgPSAnbWFpbm5ldCcsXG4gIHRlc3RuZXQgPSAndGVzdG5ldCcsXG59XG5cbi8vIFRPRE8oKTogY3JlYXRlIHVuaW9uIHR5cGUgb2YgYWxsIGFkZHJlc3MgZm9ybWF0cyBlbnVtc1xuLy8gbGlzdCBvZiBzczU4IGZvcm1hdCBlbmNvZGluZyB0eXBlcyBmb3IgRG90IGVjb3N5c3RlbVxuZXhwb3J0IGVudW0gRG90QWRkcmVzc0Zvcm1hdCB7XG4gIC8vIGZvcm1hdCBmb3Igd2VzdGVuZCAoZ2VuZXJpYyBzdWJzdHJhdGUpIGFkZHJlc3Nlc1xuICBzdWJzdHJhdGUgPSA0MixcbiAgLy8gZm9ybWF0IGZvciBwb2xrYWRvdCBtYWlubmV0IGFkZHJlc3Nlc1xuICBwb2xrYWRvdCA9IDAsXG59XG5cbmV4cG9ydCB0eXBlIERvdEFzc2V0VHlwZXMgPSAnZG90JyB8ICd0ZG90JztcblxuZXhwb3J0IGVudW0gU3Rha2luZ09wZXJhdGlvblR5cGVzIHtcbiAgTE9DSyxcbiAgVk9URSxcbiAgVU5WT1RFLFxuICBBQ1RJVkFURSxcbiAgVU5MT0NLLFxuICBXSVRIRFJBVyxcbn1cbiJdfQ==
|
|
189
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW51bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hY2NvdW50LWxpYi9iYXNlQ29pbi9lbnVtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOztHQUVHO0FBQ0gsSUFBWSxlQWdLWDtBQWhLRCxXQUFZLGVBQWU7SUFDekIscURBQUksQ0FBQTtJQUNKLCtCQUErQjtJQUMvQixpRUFBVSxDQUFBO0lBQ1YsZ0NBQWdDO0lBQ2hDLG1FQUFXLENBQUE7SUFDWCxvRUFBb0U7SUFDcEUscUZBQW9CLENBQUE7SUFDcEIscUVBQXFFO0lBQ3JFLHVGQUFxQixDQUFBO0lBQ3JCLDBDQUEwQztJQUMxQyxxSEFBb0MsQ0FBQTtJQUNwQyw0REFBNEQ7SUFDNUQsbUVBQVcsQ0FBQTtJQUNYLHdFQUF3RTtJQUN4RSxpRUFBVSxDQUFBO0lBQ1Ysb0NBQW9DO0lBQ3BDLHVFQUFhLENBQUE7SUFDYiw4RUFBOEU7SUFDOUUsdUVBQWEsQ0FBQTtJQUNiLE9BQU87SUFDUCxvRUFBVyxDQUFBO0lBQ1gsT0FBTztJQUNQLG9FQUFXLENBQUE7SUFDWCxTQUFTO0lBQ1Qsd0VBQWEsQ0FBQTtJQUNiLFdBQVc7SUFDWCw0RUFBZSxDQUFBO0lBQ2YsU0FBUztJQUNULHdFQUFhLENBQUE7SUFDYixXQUFXO0lBQ1gsNEVBQWUsQ0FBQTtJQUNmLDhCQUE4QjtJQUM5QixzRUFBWSxDQUFBO0lBQ1osYUFBYTtJQUNiLGdGQUFpQixDQUFBO0lBQ2pCLG1FQUFtRTtJQUNuRSx3REFBSyxDQUFBO0lBQ0wsNEJBQTRCO0lBQzVCLHNFQUFZLENBQUE7SUFDWiwyQkFBMkI7SUFDM0IsY0FBYztJQUNkLHNFQUFZLENBQUE7SUFDWiwyQkFBMkI7SUFDM0IsY0FBYztJQUNkLHNFQUFZLENBQUE7SUFDWix5Q0FBeUM7SUFDekMsMERBQU0sQ0FBQTtJQUNOLDBEQUFNLENBQUE7SUFDTiwyQ0FBMkM7SUFDM0MsOEZBQXdCLENBQUE7SUFDeEIsY0FBYztJQUNkLGtFQUFVLENBQUE7SUFDViw0QkFBNEI7SUFDNUIsd0VBQWEsQ0FBQTtJQUNiLDZCQUE2QjtJQUM3QiwwRUFBYyxDQUFBO0lBQ2QsK0JBQStCO0lBQy9CLDhFQUFnQixDQUFBO0lBQ2hCLGdEQUFnRDtJQUNoRCxvRkFBbUIsQ0FBQTtJQUNuQixXQUFXO0lBQ1gsNEVBQWUsQ0FBQTtJQUNmLGdDQUFnQztJQUNoQyw4REFBUSxDQUFBO0lBQ1IsZ0ZBQWlCLENBQUE7SUFDakIsa0dBQTBCLENBQUE7SUFDMUIsa0dBQTBCLENBQUE7SUFDMUIsaURBQWlEO0lBQ2pELG9HQUEyQixDQUFBO0lBQzNCLDRGQUF1QixDQUFBO0lBQ3ZCLGdDQUFnQztJQUNoQyxnRUFBUyxDQUFBO0lBQ1QsNkRBQTZEO0lBQzdELGdFQUFTLENBQUE7SUFDVCwwQ0FBMEM7SUFDMUMsNERBQU8sQ0FBQTtJQUNQLCtCQUErQjtJQUMvQiw4RUFBZ0IsQ0FBQTtJQUNoQixrQ0FBa0M7SUFDbEMsa0ZBQWtCLENBQUE7SUFDbEIsMEVBQWMsQ0FBQTtJQUNkLDZEQUE2RDtJQUM3RCxvRUFBVyxDQUFBO0lBQ1gsZ0VBQWdFO0lBQ2hFLHNFQUFZLENBQUE7SUFDWix3Q0FBd0M7SUFDeEMsa0ZBQWtCLENBQUE7SUFDbEIsaUNBQWlDO0lBQ2pDLDBFQUFjLENBQUE7SUFDZCxrQ0FBa0M7SUFDbEMsb0ZBQW1CLENBQUE7SUFDbkIsaUNBQWlDO0lBQ2pDLDBFQUFjLENBQUE7SUFDZCwwQ0FBMEM7SUFDMUMsMEZBQXNCLENBQUE7SUFDdEIsb0NBQW9DO0lBQ3BDLDhGQUF3QixDQUFBO0lBQ3hCLGtDQUFrQztJQUNsQywwRkFBc0IsQ0FBQTtJQUN0Qiw2QkFBNkI7SUFDN0Isa0ZBQWtCLENBQUE7SUFDbEIsdUNBQXVDO0lBQ3ZDLG9HQUEyQixDQUFBO0lBQzNCLDJHQUEyRztJQUMzRyxnRkFBaUIsQ0FBQTtJQUNqQiwyQkFBMkI7SUFDM0IsOEVBQWdCLENBQUE7SUFDaEIsOEJBQThCO0lBQzlCLHdFQUFhLENBQUE7SUFDYix1RkFBdUY7SUFDdkYsaUdBQWlHO0lBQ2pHLGtFQUFrRTtJQUNsRSxrR0FBMEIsQ0FBQTtJQUUxQixNQUFNO0lBQ04sMERBQU0sQ0FBQTtJQUNOLHNEQUFJLENBQUE7SUFDSiw4REFBUSxDQUFBO0lBQ1IsOEZBQXdCLENBQUE7SUFDeEIsd0VBQWEsQ0FBQTtJQUNiLDhEQUE4RDtJQUM5RCx3RUFBYSxDQUFBO0lBRWIsZUFBZTtJQUNmLG9FQUFXLENBQUE7SUFDWCxNQUFNO0lBQ04sa0VBQVksQ0FBQTtJQUVaLE9BQU87SUFDUCw0REFBTyxDQUFBO0lBRVAsT0FBTztJQUNQLHdFQUFhLENBQUE7SUFFYixRQUFRO0lBQ1IsZ0ZBQWlCLENBQUE7SUFFakIsT0FBTztJQUNQLGdFQUFTLENBQUE7SUFFVCxhQUFhO0lBQ2IsOEVBQWdCLENBQUE7SUFDaEIsb0ZBQW1CLENBQUE7SUFDbkIsNEZBQXVCLENBQUE7SUFDdkIsa0dBQTBCLENBQUE7SUFFMUIseUVBQXlFO0lBQ3pFLHdFQUFhLENBQUE7SUFDYixtRUFBbUU7SUFDbkUsOEVBQWdCLENBQUE7SUFDaEIsc0VBQXNFO0lBQ3RFLDREQUFPLENBQUE7SUFDUCxvRkFBb0Y7SUFDcEYsc0ZBQW9CLENBQUE7SUFDcEIsMkRBQTJEO0lBQzNELG9FQUFXLENBQUE7SUFDWCxtRkFBbUY7SUFDbkYsdUZBQXVGO0lBQ3ZGLGtHQUEwQixDQUFBO0FBQzVCLENBQUMsRUFoS1csZUFBZSwrQkFBZixlQUFlLFFBZ0sxQjtBQUVEOztHQUVHO0FBQ0gsSUFBWSxhQUtYO0FBTEQsV0FBWSxhQUFhO0lBQ3ZCLDRCQUFXLENBQUE7SUFDWCxrQ0FBaUIsQ0FBQTtJQUNqQixvQ0FBbUIsQ0FBQTtJQUNuQixvQ0FBbUIsQ0FBQTtBQUNyQixDQUFDLEVBTFcsYUFBYSw2QkFBYixhQUFhLFFBS3hCO0FBRUQseURBQXlEO0FBQ3pELHVEQUF1RDtBQUN2RCxJQUFZLGdCQUtYO0FBTEQsV0FBWSxnQkFBZ0I7SUFDMUIsbURBQW1EO0lBQ25ELGtFQUFjLENBQUE7SUFDZCx3Q0FBd0M7SUFDeEMsK0RBQVksQ0FBQTtBQUNkLENBQUMsRUFMVyxnQkFBZ0IsZ0NBQWhCLGdCQUFnQixRQUszQjtBQUlELElBQVkscUJBT1g7QUFQRCxXQUFZLHFCQUFxQjtJQUMvQixpRUFBSSxDQUFBO0lBQ0osaUVBQUksQ0FBQTtJQUNKLHFFQUFNLENBQUE7SUFDTix5RUFBUSxDQUFBO0lBQ1IscUVBQU0sQ0FBQTtJQUNOLHlFQUFRLENBQUE7QUFDVixDQUFDLEVBUFcscUJBQXFCLHFDQUFyQixxQkFBcUIsUUFPaEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEludGVybmFsIG1ldGFkYXRhLiBEZWZpbmVzIHRoZSB0eXBlIG9mIHRyYW5zYWN0aW9uLlxuICovXG5leHBvcnQgZW51bSBUcmFuc2FjdGlvblR5cGUge1xuICBTZW5kLFxuICAvLyBTZW5kIEVSQzcyMSBjb21wbGlhbnQgdG9rZW5zXG4gIFNlbmRFUkM3MjEsXG4gIC8vIFNlbmQgRVJDMTE1NSBjb21wbGlhbnQgdG9rZW5zXG4gIFNlbmRFUkMxMTU1LFxuICAvLyBJbml0aWFsaXplIGEgd2FsbGV0IG9uLWNoYWluIChlLmcuIE11bHRpLXNpZyBjb250cmFjdCBkZXBsb3ltZW50KVxuICBXYWxsZXRJbml0aWFsaXphdGlvbixcbiAgLy8gSW5pdGlhbGl6ZSBhbiBhZGRyZXNzIG9uLWNoYWluKGUuZy4gRm9yd2FyZGVyIGNvbnRyYWN0IGRlcGxveW1lbnQpXG4gIEFkZHJlc3NJbml0aWFsaXphdGlvbixcbiAgLy8gSW5pdGlhbGl6ZWQgYW4gYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50XG4gIEFzc29jaWF0ZWRUb2tlbkFjY291bnRJbml0aWFsaXphdGlvbixcbiAgLy8gRmx1c2ggdG9rZW5zIGZyb20gYSBmb3J3YXJkZXIgYWRkcmVzcyB0byBpdHMgYmFzZSBhZGRyZXNzXG4gIEZsdXNoVG9rZW5zLFxuICAvLyBGbHVzaCBuYXRpdmUgY29pbnMgKGVnLiBFVEgpIGZyb20gYSBmb3J3YXJkZXIgYWRkcmVzcyB0byBiYXNlIGFkZHJlc3NcbiAgRmx1c2hDb2lucyxcbiAgLy8gU2VuZCBhIHJhdyBzaW5nbGUtc2lnIHRyYW5zYWN0aW9uXG4gIFNpbmdsZVNpZ1NlbmQsXG4gIC8vIFVwZGF0ZSBhbiBhY2NvdW50IG9uLWNoYWluIChlLmcuIFB1YmxpYyBrZXkgcmV2ZWxhdGlvbiBvcGVyYXRpb24gZm9yIFRlem9zKVxuICBBY2NvdW50VXBkYXRlLFxuICAvLyBMb2NrXG4gIFN0YWtpbmdMb2NrLFxuICAvLyBWb3RlXG4gIFN0YWtpbmdWb3RlLFxuICAvLyBVbnZvdGVcbiAgU3Rha2luZ1Vudm90ZSxcbiAgLy8gQWN0aXZhdGVcbiAgU3Rha2luZ0FjdGl2YXRlLFxuICAvLyBVbmxvY2tcbiAgU3Rha2luZ1VubG9jayxcbiAgLy8gV2l0aGRyYXdcbiAgU3Rha2luZ1dpdGhkcmF3LFxuICAvLyBIYW5kbGUgc21hcnQgY29udHJhY3QgY2FsbHNcbiAgQ29udHJhY3RDYWxsLFxuICAvLyBEZWFjdGl2YXRlXG4gIFN0YWtpbmdEZWFjdGl2YXRlLFxuICAvLyBCYXRjaCBvZiBtdWx0aXBsZSB0cmFuc2FjdGlvbnMgYnJvYWRjYXN0IGFzIGEgc2luZ2xlIHRyYW5zYWN0aW9uXG4gIEJhdGNoLFxuICAvLyBDbGFpbSB0aGUgc3Rha2luZyByZXdhcmRzXG4gIFN0YWtpbmdDbGFpbSxcbiAgLy8gQWRkIGRlbGVnYXRvciB0byBwLWNoYWluXG4gIC8vIEBkZXByZWNhdGVkXG4gIEFkZERlbGVnYXRvcixcbiAgLy8gQWRkIHZhbGlkYXRvciB0byBwLWNoYWluXG4gIC8vIEBkZXByZWNhdGVkXG4gIEFkZFZhbGlkYXRvcixcbiAgLy8gQ3Jvc3MgY2hhaW4gdHJhbnNmZXIgYXQgQXZheCBhbmQgZmxhcmVcbiAgRXhwb3J0LFxuICBJbXBvcnQsXG4gIC8vIENyb3NzIGNoYWluIFJlY292ZXJ5IGZvciBldm0gbGlrZSBjaGFpbnNcbiAgUmVjb3ZlcnlXYWxsZXREZXBsb3ltZW50LFxuICAvLyBBZGQgc3Rha2luZ1xuICBTdGFraW5nQWRkLFxuICAvLyBTdGFraW5nIHBsZWRnZSAoZS5nLiBBREEpXG4gIFN0YWtpbmdQbGVkZ2UsXG4gIC8vIERlbGVnYXRpbmcgdm90ZSAoZS5nLiBBREEpXG4gIFZvdGVEZWxlZ2F0aW9uLFxuICAvLyBTdGFraW5nIEF1dGhvcml6ZSAoZS5nLiBTT0wpXG4gIFN0YWtpbmdBdXRob3JpemUsXG4gIC8vIFN0YWtpbmcgQXV0aG9yaXplIGZyb20gcmF3IG1lc3NhZ2UgKGUuZy4gU09MKVxuICBTdGFraW5nQXV0aG9yaXplUmF3LFxuICAvLyBEZWxlZ2F0ZVxuICBTdGFraW5nRGVsZWdhdGUsXG4gIC8vIEN1c3RvbSB0cmFuc2FjdGlvbiAoZS5nLiBTVUkpXG4gIEN1c3RvbVR4LFxuICBTdGFraW5nUmVkZWxlZ2F0ZSxcbiAgQWRkUGVybWlzc2lvbmxlc3NEZWxlZ2F0b3IsXG4gIEFkZFBlcm1pc3Npb25sZXNzVmFsaWRhdG9yLFxuICAvLyBDbG9zaW5nIGFuIGFzc29jaWF0ZWQgdG9rZW4gYWNjb3VudCAoZS5nLiBTT0wpXG4gIENsb3NlQXNzb2NpYXRlZFRva2VuQWNjb3VudCxcbiAgU2luZ2xlTm9taW5hdG9yV2l0aGRyYXcsXG4gIC8vIFNlbmQgVG9rZW5zIChlLmcgWFJQTCB0b2tlbnMpXG4gIFNlbmRUb2tlbixcbiAgLy8gU2V0dXAgYSB0cnVzdGxpbmUgd2l0aCBpc3N1ZXIgb2YgYSB0b2tlbiAoZWcuIFhSUEwgdG9rZW5zKVxuICBUcnVzdExpbmUsXG4gIC8vIFNlbmQgTm9uIEZ1bmdpYmxlIFRva2VuIChlLmcuIEFQVCBORlRzKVxuICBTZW5kTkZULFxuICAvLyBEZWxlZ2F0ZSByZXNvdXJjZSAoZS5nLiBUUlgpXG4gIERlbGVnYXRlUmVzb3VyY2UsXG4gIC8vIFVuLWRlbGVnYXRlIHJlc291cmNlIChlLmcuIFRSWClcbiAgVW5EZWxlZ2F0ZVJlc291cmNlLFxuICBTdG9yYWdlRGVwb3NpdCxcbiAgLy8gRmx1c2ggRVJDNzIxIE5GVHMgZnJvbSBhIGZvcndhcmRlciBhZGRyZXNzIHRvIGJhc2UgYWRkcmVzc1xuICBGbHVzaEVSQzcyMSxcbiAgLy8gRmx1c2ggRVJDMTE1NSB0b2tlbnMgZnJvbSBhIGZvcndhcmRlciBhZGRyZXNzIHRvIGJhc2UgYWRkcmVzc1xuICBGbHVzaEVSQzExNTUsXG4gIC8vIFNldCB1cCAxLXN0ZXAgcHJlLWFwcHJvdmFsIGZvciBjYW50b25cbiAgT25lU3RlcFByZUFwcHJvdmFsLFxuICAvLyBjYW50b24gdHJhbnNmZXIgYWNjZXB0LCAyLXN0ZXBcbiAgVHJhbnNmZXJBY2NlcHQsXG4gIC8vIGNhbnRvbiB0cmFuc2ZlciBhY2tub3dsZWRnZW1lbnRcbiAgVHJhbnNmZXJBY2tub3dsZWRnZSxcbiAgLy8gY2FudG9uIHRyYW5zZmVyIHJlamVjdCwgMi1zdGVwXG4gIFRyYW5zZmVyUmVqZWN0LFxuICAvLyBjYW50b24gdHJhbnNmZXIgb2ZmZXIgd2l0aGRyYXduLCAyLXN0ZXBcbiAgVHJhbnNmZXJPZmZlcldpdGhkcmF3bixcbiAgLy8gY2FudG9uIGNvc2lnbiBkZWxlZ2F0aW9uIHByb3Bvc2FsXG4gIENvc2lnbkRlbGVnYXRpb25Qcm9wb3NhbCxcbiAgLy8gY2FudG9uIGNvc2lnbiBkZWxlZ2F0aW9uIGFjY2VwdFxuICBDb3NpZ25EZWxlZ2F0aW9uQWNjZXB0LFxuICAvLyBjYW50b24gYWxsb2NhdGlvbiBhbGxvY2F0ZVxuICBBbGxvY2F0aW9uQWxsb2NhdGUsXG4gIC8vIGNhbnRvbiBhbGxvY2F0aW9uIGFsbG9jYXRlIHdpdGhkcmF3blxuICBBbGxvY2F0aW9uQWxsb2NhdGVXaXRoZHJhd24sXG4gIC8vIGNhbnRvbiBhbGxvY2F0aW9uIHJlcXVlc3QgKGludGVybmFsL2R1bW15IHR4UmVxdWVzdCBzdXJmYWNpbmcgRHZQIHRyYWRlIGRldGFpbHMgdG8gdGhlIGFsbG9jYXRpbmcgcGFydHkpXG4gIEFsbG9jYXRpb25SZXF1ZXN0LFxuICAvLyBjYW50b24gYWxsb2NhdGlvbiByZWplY3RcbiAgQWxsb2NhdGlvblJlamVjdCxcbiAgLy8gY2FudG9uIGdlbmVyaWMgREFNTCBjb21tYW5kXG4gIENhbnRvbkNvbW1hbmQsXG4gIC8vIGNhbnRvbiBlbmQgaW52ZXN0b3Igb25ib2FyZGluZyBvZmZlciAoaW50ZXJuYWwvZHVtbXkgdHhSZXF1ZXN0IHJlY29yZGluZyBhbiBvbi1jaGFpblxuICAvLyBFbmRJbnZlc3Rvck9uYm9hcmRpbmdPZmZlciBjb250cmFjdCBvbiB0aGUgZW5kIGludmVzdG9yJ3Mgd2FsbGV0IHNvIHRoZXkgY2FuIGFjY2VwdCBvciByZWplY3QuXG4gIC8vIE5ldmVyIHNpZ25lZCBvciBzdWJtaXR0ZWQg4oCUIGJ1aWx0IGxvY2FsbHkgd2l0aG91dCBhbiBJTVMgY2FsbC4pXG4gIEVuZEludmVzdG9yT25ib2FyZGluZ09mZmVyLFxuXG4gIC8vIHRyeFxuICBGUkVFWkUsXG4gIFZPVEUsXG4gIFVORlJFRVpFLFxuICBXSVRIRFJBV19FWFBJUkVfVU5GUkVFWkUsXG4gIENMQUlNX1JFV0FSRFMsXG4gIC8vIENyZWF0ZSBhbiBhY2NvdW50IG9uLWNoYWluIChlLmcuIFRSWCBBY2NvdW50Q3JlYXRlQ29udHJhY3QpXG4gIEFjY291bnRDcmVhdGUsXG5cbiAgLy8gY3NwciBhbmQgc3R4XG4gIHN0YWtpbmdMb2NrLFxuICAvLyBzdHhcbiAgJ3NlbGYtc3RhY2snLFxuXG4gIC8vIGJ0YyxcbiAgc3Rha2luZyxcblxuICAvLyBjc3ByXG4gIHN0YWtpbmdVbmxvY2ssXG5cbiAgLy8gcG9seXhcbiAgUmVqZWN0SW5zdHJ1Y3Rpb24sXG5cbiAgLy8gZmxycFxuICBJbXBvcnRUb0MsXG5cbiAgLy8gdG9uIHdoYWxlc1xuICBUb25XaGFsZXNEZXBvc2l0LFxuICBUb25XaGFsZXNXaXRoZHJhd2FsLFxuICBUb25XaGFsZXNWZXN0aW5nRGVwb3NpdCxcbiAgVG9uV2hhbGVzVmVzdGluZ1dpdGhkcmF3YWwsXG5cbiAgLy8geHJwIOKAlCBkZWxldGUgYW4gYWNjb3VudCBhbmQgcmVjb3ZlciB0aGUgZnVsbCBiYWxhbmNlIGluY2x1ZGluZyByZXNlcnZlXG4gIEFjY291bnREZWxldGUsXG4gIC8vIHhycCDigJQgb3B0LWluIHRvIHJlY2VpdmUgYSBNdWx0aS1QdXJwb3NlIFRva2VuIChNUFRva2VuQXV0aG9yaXplKVxuICBNUFRva2VuQXV0aG9yaXplLFxuICAvLyB4cnAg4oCUIHNlbmQgYSBNdWx0aS1QdXJwb3NlIFRva2VuIHZpYSBQYXltZW50IHdpdGggTVBUIEFtb3VudCBvYmplY3RcbiAgU2VuZE1QVCxcbiAgLy8gRGVsZWdhdGUgZGVjcnlwdGlvbiBhY2Nlc3MgZm9yIFphbWEgRVJDLTc5ODQgY29uZmlkZW50aWFsIHRva2VucyB2aWEgQUNMIGNvbnRyYWN0XG4gIERlY3J5cHRpb25EZWxlZ2F0aW9uLFxuICAvLyBTZW5kIEVSQy03OTg0IGNvbmZpZGVudGlhbCB0b2tlbnMgdmlhIGVuY3J5cHRlZCB0cmFuc2ZlclxuICBTZW5kRVJDNzk4NCxcbiAgLy8gRmx1c2ggRVJDLTc5ODQgY29uZmlkZW50aWFsIHRva2VucyBmcm9tIGEgZm9yd2FyZGVyIGFkZHJlc3MgdG8gdGhlIHBhcmVudCB3YWxsZXRcbiAgLy8gdmlhIGZvcndhcmRlci5jYWxsRnJvbVBhcmVudCh0b2tlbkFkZHIsIDAsIGNvbmZpZGVudGlhbFRyYW5zZmVyKHBhcmVudEFkZHIsIGhhbmRsZSkpXG4gIEZsdXNoRVJDNzk4NEZvcndhcmRlclRva2VuLFxufVxuXG4vKipcbiAqIEdlbmVyaWMgbGlzdCBvZiBlbmNvZGluZyBmb3JtYXRzLiBDYW4gYmUgdXNlZCBhcyBhcmd1bWVudHMgZm9yIG1ldGhvZHMgaW5wdXRzLlxuICovXG5leHBvcnQgZW51bSBBZGRyZXNzRm9ybWF0IHtcbiAgaGV4ID0gJ2hleCcsXG4gIGJhc2U1OCA9ICdiYXNlNTgnLFxuICBtYWlubmV0ID0gJ21haW5uZXQnLFxuICB0ZXN0bmV0ID0gJ3Rlc3RuZXQnLFxufVxuXG4vLyBUT0RPKCk6IGNyZWF0ZSB1bmlvbiB0eXBlIG9mIGFsbCBhZGRyZXNzIGZvcm1hdHMgZW51bXNcbi8vIGxpc3Qgb2Ygc3M1OCBmb3JtYXQgZW5jb2RpbmcgdHlwZXMgZm9yIERvdCBlY29zeXN0ZW1cbmV4cG9ydCBlbnVtIERvdEFkZHJlc3NGb3JtYXQge1xuICAvLyBmb3JtYXQgZm9yIHdlc3RlbmQgKGdlbmVyaWMgc3Vic3RyYXRlKSBhZGRyZXNzZXNcbiAgc3Vic3RyYXRlID0gNDIsXG4gIC8vIGZvcm1hdCBmb3IgcG9sa2Fkb3QgbWFpbm5ldCBhZGRyZXNzZXNcbiAgcG9sa2Fkb3QgPSAwLFxufVxuXG5leHBvcnQgdHlwZSBEb3RBc3NldFR5cGVzID0gJ2RvdCcgfCAndGRvdCc7XG5cbmV4cG9ydCBlbnVtIFN0YWtpbmdPcGVyYXRpb25UeXBlcyB7XG4gIExPQ0ssXG4gIFZPVEUsXG4gIFVOVk9URSxcbiAgQUNUSVZBVEUsXG4gIFVOTE9DSyxcbiAgV0lUSERSQVcsXG59XG4iXX0=
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*/
|
|
4
|
-
import { DefiOperation, DefiOperationListResult, DepositResult, DepositToVaultOptions, GetOperationOptions, IDefiVault, ListOperationsOptions, ResumeDepositOptions } from './iDefiVault';
|
|
1
|
+
import { GetVaultResponse } from '@bitgo/public-types';
|
|
2
|
+
import { DefiOperation, DefiOperationListResult, DepositResult, DepositToVaultOptions, GetOperationOptions, GetVaultConfigOptions, IDefiVault, ListOperationsOptions, ResumeDepositOptions, WithdrawFromVaultOptions, WithdrawResult } from './iDefiVault';
|
|
5
3
|
import { IWallet } from '../wallet';
|
|
6
4
|
/**
|
|
7
5
|
* Error thrown when a concurrent active deposit already exists for the (wallet, vault) pair.
|
|
@@ -25,20 +23,34 @@ export declare class DefiVault implements IDefiVault {
|
|
|
25
23
|
private readonly wallet;
|
|
26
24
|
private readonly bitgo;
|
|
27
25
|
constructor(wallet: IWallet);
|
|
26
|
+
/**
|
|
27
|
+
* Fetch vault config from defi-service. Used internally to determine
|
|
28
|
+
* which deposit path to take (Concrete vs Morpho).
|
|
29
|
+
*/
|
|
30
|
+
getVaultConfig(params: GetVaultConfigOptions): Promise<GetVaultResponse>;
|
|
28
31
|
/**
|
|
29
32
|
* Deposit an amount of underlying asset into a vault.
|
|
30
33
|
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
* handles orphaned approvals.
|
|
34
|
+
* Dispatches to the concrete or morpho path based on vault provider.
|
|
35
|
+
* The concrete path returns a pendingApproval (custodial wallet).
|
|
36
|
+
* The morpho path issues two sendMany calls (approve + deposit).
|
|
35
37
|
*
|
|
36
38
|
* @param params.vaultId - DeFi-service vault identifier
|
|
37
39
|
* @param params.amount - amount in base units of the underlying asset
|
|
38
|
-
* @param params.clientIdempotencyKey - optional client idempotency key
|
|
39
40
|
* @param params.walletPassphrase - required for hot wallets, omit for custody
|
|
40
41
|
*/
|
|
41
42
|
depositToVault(params: DepositToVaultOptions): Promise<DepositResult>;
|
|
43
|
+
/**
|
|
44
|
+
* Concrete BTC vault deposit path. The client BTC wallet is custodial, so
|
|
45
|
+
* sendMany returns a pendingApproval rather than a signed transfer.
|
|
46
|
+
* No recipients are sent — WP resolves the escrow destination server-side.
|
|
47
|
+
*/
|
|
48
|
+
private depositToConcreteVault;
|
|
49
|
+
/**
|
|
50
|
+
* Morpho vault deposit path. Issues two sendMany calls (approve + deposit)
|
|
51
|
+
* and returns the operationId that links them.
|
|
52
|
+
*/
|
|
53
|
+
private depositToMorphoVault;
|
|
42
54
|
/**
|
|
43
55
|
* Resume a partially-completed deposit. Call this when the SDK process died
|
|
44
56
|
* between the approve and deposit txRequest creation.
|
|
@@ -63,6 +75,18 @@ export declare class DefiVault implements IDefiVault {
|
|
|
63
75
|
* @param params.cursor - pagination cursor
|
|
64
76
|
*/
|
|
65
77
|
listOperations(params: ListOperationsOptions): Promise<DefiOperationListResult>;
|
|
78
|
+
/**
|
|
79
|
+
* Withdraw vault shares from a DeFi vault.
|
|
80
|
+
*
|
|
81
|
+
* Issues a single sendMany call (defiWithdraw) and returns the operationId
|
|
82
|
+
* and txRequestId. The state machine for withdrawal is simpler than deposit:
|
|
83
|
+
* CREATED → WITHDRAW_TX_REQUESTED → WITHDRAW_SIGNED → WITHDRAW_CONFIRMED → COMPLETED
|
|
84
|
+
*
|
|
85
|
+
* @param params.vaultId - DeFi-service vault identifier
|
|
86
|
+
* @param params.amount - amount in base units of the vault share token
|
|
87
|
+
* @param params.walletPassphrase - required for hot wallets, omit for custody
|
|
88
|
+
*/
|
|
89
|
+
withdrawFromVault(params: WithdrawFromVaultOptions): Promise<WithdrawResult>;
|
|
66
90
|
/**
|
|
67
91
|
* Extract txRequestId from a sendMany result.
|
|
68
92
|
* sendMany returns different shapes depending on wallet type:
|
|
@@ -82,6 +106,12 @@ export declare class DefiVault implements IDefiVault {
|
|
|
82
106
|
* populates the intent.
|
|
83
107
|
*/
|
|
84
108
|
private extractOperationId;
|
|
109
|
+
/**
|
|
110
|
+
* Extracts {@link ConcreteDepositResult} from a custodial sendMany response.
|
|
111
|
+
* Concrete BTC deposits return a `pendingApproval` instead of a txRequest —
|
|
112
|
+
* throws if `pendingApproval.id` is absent, indicating an unexpected shape.
|
|
113
|
+
*/
|
|
114
|
+
private extractConcreteDepositResult;
|
|
85
115
|
private operationsUrl;
|
|
86
116
|
}
|
|
87
117
|
//# sourceMappingURL=defiVault.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defiVault.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/defi/defiVault.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"defiVault.d.ts","sourceRoot":"","sources":["../../../../src/bitgo/defi/defiVault.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,gBAAgB,EAAiB,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAGL,aAAa,EACb,uBAAuB,EACvB,aAAa,EACb,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,UAAU,EACV,qBAAqB,EACrB,oBAAoB,EACpB,wBAAwB,EACxB,cAAc,EACf,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC;;GAEG;AACH,qBAAa,0BAA2B,SAAQ,KAAK;IACnD,SAAgB,WAAW,EAAE,MAAM,CAAC;gBAExB,WAAW,EAAE,MAAM;CAKhC;AAED;;;;;;;;;;GAUG;AACH,qBAAa,SAAU,YAAW,UAAU;IAC1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;gBAEtB,MAAM,EAAE,OAAO;IAK3B;;;OAGG;IACG,cAAc,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAU9E;;;;;;;;;;OAUG;IACG,cAAc,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,aAAa,CAAC;IAmB3E;;;;OAIG;YACW,sBAAsB;IAcpC;;;OAGG;YACW,oBAAoB;IAkDlC;;;;;;OAMG;IACG,aAAa,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,aAAa,CAAC;IAoCzE;;;;OAIG;IACG,YAAY,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,aAAa,CAAC;IAQvE;;;;;;;;OAQG;IACG,cAAc,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAgBrF;;;;;;;;;;OAUG;IACG,iBAAiB,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,cAAc,CAAC;IA6BlF;;;;;OAKG;IACH,OAAO,CAAC,kBAAkB;IAW1B;;;;;;;;;;OAUG;IACH,OAAO,CAAC,kBAAkB;IA0B1B;;;;OAIG;IACH,OAAO,CAAC,4BAA4B;IAWpC,OAAO,CAAC,aAAa;CAGtB"}
|
|
@@ -1,6 +1,45 @@
|
|
|
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.DefiVault = exports.ActiveOperationExistsError = void 0;
|
|
37
|
+
/**
|
|
38
|
+
* @prettier
|
|
39
|
+
*/
|
|
40
|
+
const t = __importStar(require("io-ts"));
|
|
41
|
+
const public_types_1 = require("@bitgo/public-types");
|
|
42
|
+
const utils_1 = require("../utils");
|
|
4
43
|
/**
|
|
5
44
|
* Error thrown when a concurrent active deposit already exists for the (wallet, vault) pair.
|
|
6
45
|
*/
|
|
@@ -28,17 +67,28 @@ class DefiVault {
|
|
|
28
67
|
this.wallet = wallet;
|
|
29
68
|
this.bitgo = wallet.bitgo;
|
|
30
69
|
}
|
|
70
|
+
/**
|
|
71
|
+
* Fetch vault config from defi-service. Used internally to determine
|
|
72
|
+
* which deposit path to take (Concrete vs Morpho).
|
|
73
|
+
*/
|
|
74
|
+
async getVaultConfig(params) {
|
|
75
|
+
if (!params.vaultId) {
|
|
76
|
+
throw new Error('vaultId is required');
|
|
77
|
+
}
|
|
78
|
+
const raw = await this.bitgo
|
|
79
|
+
.get(this.bitgo.microservicesUrl(`/api/defi-service/v1/vaults/${params.vaultId}`))
|
|
80
|
+
.result();
|
|
81
|
+
return (0, utils_1.decodeWithCodec)(public_types_1.GetVaultResponse, raw, 'getVaultConfig');
|
|
82
|
+
}
|
|
31
83
|
/**
|
|
32
84
|
* Deposit an amount of underlying asset into a vault.
|
|
33
85
|
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
* handles orphaned approvals.
|
|
86
|
+
* Dispatches to the concrete or morpho path based on vault provider.
|
|
87
|
+
* The concrete path returns a pendingApproval (custodial wallet).
|
|
88
|
+
* The morpho path issues two sendMany calls (approve + deposit).
|
|
38
89
|
*
|
|
39
90
|
* @param params.vaultId - DeFi-service vault identifier
|
|
40
91
|
* @param params.amount - amount in base units of the underlying asset
|
|
41
|
-
* @param params.clientIdempotencyKey - optional client idempotency key
|
|
42
92
|
* @param params.walletPassphrase - required for hot wallets, omit for custody
|
|
43
93
|
*/
|
|
44
94
|
async depositToVault(params) {
|
|
@@ -48,6 +98,39 @@ class DefiVault {
|
|
|
48
98
|
if (!params.amount) {
|
|
49
99
|
throw new Error('amount is required');
|
|
50
100
|
}
|
|
101
|
+
const config = await this.getVaultConfig({ vaultId: params.vaultId });
|
|
102
|
+
if (config.protocol === public_types_1.VaultProtocol.CONCRETE_BTCCX) {
|
|
103
|
+
return this.depositToConcreteVault(params);
|
|
104
|
+
}
|
|
105
|
+
else if (config.protocol === public_types_1.VaultProtocol.MORPHO) {
|
|
106
|
+
return this.depositToMorphoVault(params);
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
throw new Error(`Unsupported vault protocol: ${config.protocol}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Concrete BTC vault deposit path. The client BTC wallet is custodial, so
|
|
114
|
+
* sendMany returns a pendingApproval rather than a signed transfer.
|
|
115
|
+
* No recipients are sent — WP resolves the escrow destination server-side.
|
|
116
|
+
*/
|
|
117
|
+
async depositToConcreteVault(params) {
|
|
118
|
+
const sendManyResult = await this.wallet.sendMany({
|
|
119
|
+
type: 'defi-deposit',
|
|
120
|
+
defiParams: {
|
|
121
|
+
vaultId: params.vaultId,
|
|
122
|
+
amount: params.amount,
|
|
123
|
+
actionType: 'defi-deposit',
|
|
124
|
+
},
|
|
125
|
+
...(params.walletPassphrase ? { walletPassphrase: params.walletPassphrase } : {}),
|
|
126
|
+
});
|
|
127
|
+
return this.extractConcreteDepositResult(sendManyResult);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Morpho vault deposit path. Issues two sendMany calls (approve + deposit)
|
|
131
|
+
* and returns the operationId that links them.
|
|
132
|
+
*/
|
|
133
|
+
async depositToMorphoVault(params) {
|
|
51
134
|
// TODO(CGD-1709): Re-enable active operation pre-flight check once the
|
|
52
135
|
// defi-service operations endpoint is deployed and returning active state.
|
|
53
136
|
// const activeOps: DefiOperationListResult = await this.bitgo
|
|
@@ -64,7 +147,6 @@ class DefiVault {
|
|
|
64
147
|
defiParams: {
|
|
65
148
|
vaultId: params.vaultId,
|
|
66
149
|
amount: params.amount,
|
|
67
|
-
...(params.clientIdempotencyKey ? { clientIdempotencyKey: params.clientIdempotencyKey } : {}),
|
|
68
150
|
},
|
|
69
151
|
...(params.walletPassphrase ? { walletPassphrase: params.walletPassphrase } : {}),
|
|
70
152
|
});
|
|
@@ -80,7 +162,6 @@ class DefiVault {
|
|
|
80
162
|
vaultId: params.vaultId,
|
|
81
163
|
amount: params.amount,
|
|
82
164
|
operationId,
|
|
83
|
-
...(params.clientIdempotencyKey ? { clientIdempotencyKey: params.clientIdempotencyKey } : {}),
|
|
84
165
|
},
|
|
85
166
|
...(params.walletPassphrase ? { walletPassphrase: params.walletPassphrase } : {}),
|
|
86
167
|
});
|
|
@@ -167,6 +248,39 @@ class DefiVault {
|
|
|
167
248
|
query.cursor = params.cursor;
|
|
168
249
|
return await this.bitgo.get(this.bitgo.microservicesUrl(this.operationsUrl())).query(query).result();
|
|
169
250
|
}
|
|
251
|
+
/**
|
|
252
|
+
* Withdraw vault shares from a DeFi vault.
|
|
253
|
+
*
|
|
254
|
+
* Issues a single sendMany call (defiWithdraw) and returns the operationId
|
|
255
|
+
* and txRequestId. The state machine for withdrawal is simpler than deposit:
|
|
256
|
+
* CREATED → WITHDRAW_TX_REQUESTED → WITHDRAW_SIGNED → WITHDRAW_CONFIRMED → COMPLETED
|
|
257
|
+
*
|
|
258
|
+
* @param params.vaultId - DeFi-service vault identifier
|
|
259
|
+
* @param params.amount - amount in base units of the vault share token
|
|
260
|
+
* @param params.walletPassphrase - required for hot wallets, omit for custody
|
|
261
|
+
*/
|
|
262
|
+
async withdrawFromVault(params) {
|
|
263
|
+
if (!params.vaultId) {
|
|
264
|
+
throw new Error('vaultId is required');
|
|
265
|
+
}
|
|
266
|
+
if (!params.amount) {
|
|
267
|
+
throw new Error('amount is required');
|
|
268
|
+
}
|
|
269
|
+
const withdrawResult = await this.wallet.sendMany({
|
|
270
|
+
type: 'defiWithdraw',
|
|
271
|
+
defiParams: {
|
|
272
|
+
vaultId: params.vaultId,
|
|
273
|
+
amount: params.amount,
|
|
274
|
+
},
|
|
275
|
+
...(params.walletPassphrase ? { walletPassphrase: params.walletPassphrase } : {}),
|
|
276
|
+
});
|
|
277
|
+
const txRequestId = this.extractTxRequestId(withdrawResult);
|
|
278
|
+
const operationId = this.extractOperationId(withdrawResult);
|
|
279
|
+
if (!operationId) {
|
|
280
|
+
throw new Error('operationId not found in withdraw txRequest response');
|
|
281
|
+
}
|
|
282
|
+
return { operationId, txRequestId };
|
|
283
|
+
}
|
|
170
284
|
// ── Internal helpers ────────────────────────────────────────────────
|
|
171
285
|
/**
|
|
172
286
|
* Extract txRequestId from a sendMany result.
|
|
@@ -217,9 +331,24 @@ class DefiVault {
|
|
|
217
331
|
const intent = txRequest.intent;
|
|
218
332
|
return intent?.operationId;
|
|
219
333
|
}
|
|
334
|
+
/**
|
|
335
|
+
* Extracts {@link ConcreteDepositResult} from a custodial sendMany response.
|
|
336
|
+
* Concrete BTC deposits return a `pendingApproval` instead of a txRequest —
|
|
337
|
+
* throws if `pendingApproval.id` is absent, indicating an unexpected shape.
|
|
338
|
+
*/
|
|
339
|
+
extractConcreteDepositResult(sendManyResult) {
|
|
340
|
+
const SendManyConcreteResponse = t.type({
|
|
341
|
+
pendingApproval: t.intersection([t.type({ id: t.string }), t.partial({ state: t.string })]),
|
|
342
|
+
});
|
|
343
|
+
const decoded = (0, utils_1.decodeWithCodec)(SendManyConcreteResponse, sendManyResult, 'defi-deposit sendMany response');
|
|
344
|
+
return {
|
|
345
|
+
pendingApprovalId: decoded.pendingApproval.id,
|
|
346
|
+
state: decoded.pendingApproval.state ?? 'awaitingSignature',
|
|
347
|
+
};
|
|
348
|
+
}
|
|
220
349
|
operationsUrl() {
|
|
221
350
|
return `/api/defi-service/v1/wallets/${this.wallet.id()}/operations`;
|
|
222
351
|
}
|
|
223
352
|
}
|
|
224
353
|
exports.DefiVault = DefiVault;
|
|
225
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmaVZhdWx0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2JpdGdvL2RlZmkvZGVmaVZhdWx0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWdCQTs7R0FFRztBQUNILE1BQWEsMEJBQTJCLFNBQVEsS0FBSztJQUduRCxZQUFZLFdBQW1CO1FBQzdCLEtBQUssQ0FBQywrQ0FBK0MsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUNwRSxJQUFJLENBQUMsSUFBSSxHQUFHLDRCQUE0QixDQUFDO1FBQ3pDLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO0lBQ2pDLENBQUM7Q0FDRjtBQVJELGdFQVFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQWEsU0FBUztJQUlwQixZQUFZLE1BQWU7UUFDekIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQzVCLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDSCxLQUFLLENBQUMsY0FBYyxDQUFDLE1BQTZCO1FBQ2hELElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDcEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3pDLENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBRUQsdUVBQXVFO1FBQ3ZFLDJFQUEyRTtRQUMzRSw4REFBOEQ7UUFDOUQsNERBQTREO1FBQzVELHlEQUF5RDtRQUN6RCxlQUFlO1FBQ2YsRUFBRTtRQUNGLHVEQUF1RDtRQUN2RCwwRUFBMEU7UUFDMUUsSUFBSTtRQUVKLHlDQUF5QztRQUN6QyxNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO1lBQy9DLElBQUksRUFBRSxhQUFhO1lBQ25CLFVBQVUsRUFBRTtnQkFDVixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87Z0JBQ3ZCLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtnQkFDckIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQzlGO1lBQ0QsR0FBRyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ2xGLENBQUMsQ0FBQztRQUVILE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUUzRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO1FBQ3pFLENBQUM7UUFFRCx5Q0FBeUM7UUFDekMsTUFBTSxhQUFhLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztZQUMvQyxJQUFJLEVBQUUsYUFBYTtZQUNuQixVQUFVLEVBQUU7Z0JBQ1YsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO2dCQUN2QixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07Z0JBQ3JCLFdBQVc7Z0JBQ1gsR0FBRyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQzlGO1lBQ0QsR0FBRyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQ2xGLENBQUMsQ0FBQztRQUNILE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRWxFLE9BQU87WUFDTCxXQUFXO1lBQ1gsWUFBWSxFQUFFO2dCQUNaLE9BQU8sRUFBRSxrQkFBa0I7Z0JBQzNCLE9BQU8sRUFBRSxrQkFBa0I7YUFDNUI7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBNEI7UUFDOUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUVELDBEQUEwRDtRQUMxRCxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFFL0UsSUFBSSxTQUFTLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUNwQyxNQUFNLElBQUksS0FBSyxDQUFDLHdFQUF3RSxDQUFDLENBQUM7UUFDNUYsQ0FBQztRQUVELElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQywrREFBK0QsQ0FBQyxDQUFDO1FBQ25GLENBQUM7UUFFRCxxRUFBcUU7UUFDckUsTUFBTSxhQUFhLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztZQUMvQyxJQUFJLEVBQUUsYUFBYTtZQUNuQixVQUFVLEVBQUU7Z0JBQ1YsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFPO2dCQUMxQixNQUFNLEVBQUUsU0FBUyxDQUFDLFdBQVc7Z0JBQzdCLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVzthQUNoQztZQUNELEdBQUcsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNsRixDQUFDLENBQUM7UUFFSCxPQUFPO1lBQ0wsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO1lBQy9CLFlBQVksRUFBRTtnQkFDWixPQUFPLEVBQUUsU0FBUyxDQUFDLFdBQVc7Z0JBQzlCLE9BQU8sRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDO2FBQ2hEO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUEyQjtRQUM1QyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBRUQsT0FBTyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNySCxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxLQUFLLENBQUMsY0FBYyxDQUFDLE1BQTZCO1FBQ2hELElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDcEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3pDLENBQUM7UUFFRCxNQUFNLEtBQUssR0FBb0M7WUFDN0MsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1NBQ3hCLENBQUM7UUFDRixJQUFJLE1BQU0sQ0FBQyxLQUFLO1lBQUUsS0FBSyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQzdDLElBQUksTUFBTSxDQUFDLElBQUk7WUFBRSxLQUFLLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDMUMsSUFBSSxNQUFNLENBQUMsS0FBSztZQUFFLEtBQUssQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUM3QyxJQUFJLE1BQU0sQ0FBQyxNQUFNO1lBQUUsS0FBSyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBRWhELE9BQU8sTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ3ZHLENBQUM7SUFFRCx1RUFBdUU7SUFFdkU7Ozs7O09BS0c7SUFDSyxrQkFBa0IsQ0FBQyxjQUF1QztRQUNoRSxNQUFNLFNBQVMsR0FBRyxjQUFjLENBQUMsU0FBZ0QsQ0FBQztRQUNsRixJQUFJLFNBQVMsRUFBRSxXQUFXLEVBQUUsQ0FBQztZQUMzQixPQUFPLFNBQVMsQ0FBQyxXQUFxQixDQUFDO1FBQ3pDLENBQUM7UUFDRCxJQUFJLGNBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUMvQixPQUFPLGNBQWMsQ0FBQyxXQUFxQixDQUFDO1FBQzlDLENBQUM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSyxrQkFBa0IsQ0FBQyxjQUF1QztRQUNoRSxNQUFNLFNBQVMsR0FBRyxjQUFjLENBQUMsU0FBZ0QsQ0FBQztRQUNsRixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDZixPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBRUQsdUVBQXVFO1FBQ3ZFLE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxZQUEwRCxDQUFDO1FBQzFGLE1BQU0sY0FBYyxHQUFHLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQWlELENBQUM7UUFDNUYsTUFBTSxnQkFBZ0IsR0FBRyxjQUFjLEVBQUUsWUFBbUQsQ0FBQztRQUM3RixJQUFJLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxDQUFDO1lBQ2xDLE9BQU8sZ0JBQWdCLENBQUMsV0FBcUIsQ0FBQztRQUNoRCxDQUFDO1FBRUQsMkRBQTJEO1FBQzNELE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxXQUF5RCxDQUFDO1FBQ3hGLE1BQU0sZ0JBQWdCLEdBQUcsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBbUQsQ0FBQztRQUMvRixJQUFJLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxDQUFDO1lBQ2xDLE9BQU8sZ0JBQWdCLENBQUMsV0FBcUIsQ0FBQztRQUNoRCxDQUFDO1FBRUQsaUZBQWlGO1FBQ2pGLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUE2QyxDQUFDO1FBQ3ZFLE9BQU8sTUFBTSxFQUFFLFdBQWlDLENBQUM7SUFDbkQsQ0FBQztJQUVPLGFBQWE7UUFDbkIsT0FBTyxnQ0FBZ0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsYUFBYSxDQUFDO0lBQ3ZFLENBQUM7Q0FDRjtBQTdORCw4QkE2TkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICovXG5pbXBvcnQge1xuICBEZWZpT3BlcmF0aW9uLFxuICBEZWZpT3BlcmF0aW9uTGlzdFJlc3VsdCxcbiAgRGVwb3NpdFJlc3VsdCxcbiAgRGVwb3NpdFRvVmF1bHRPcHRpb25zLFxuICBHZXRPcGVyYXRpb25PcHRpb25zLFxuICBJRGVmaVZhdWx0LFxuICBMaXN0T3BlcmF0aW9uc09wdGlvbnMsXG4gIFJlc3VtZURlcG9zaXRPcHRpb25zLFxufSBmcm9tICcuL2lEZWZpVmF1bHQnO1xuaW1wb3J0IHsgSVdhbGxldCB9IGZyb20gJy4uL3dhbGxldCc7XG5pbXBvcnQgeyBCaXRHb0Jhc2UgfSBmcm9tICcuLi9iaXRnb0Jhc2UnO1xuXG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIGEgY29uY3VycmVudCBhY3RpdmUgZGVwb3NpdCBhbHJlYWR5IGV4aXN0cyBmb3IgdGhlICh3YWxsZXQsIHZhdWx0KSBwYWlyLlxuICovXG5leHBvcnQgY2xhc3MgQWN0aXZlT3BlcmF0aW9uRXhpc3RzRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHB1YmxpYyByZWFkb25seSBvcGVyYXRpb25JZDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG9wZXJhdGlvbklkOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgQW4gYWN0aXZlIGRlcG9zaXQgb3BlcmF0aW9uIGFscmVhZHkgZXhpc3RzOiAke29wZXJhdGlvbklkfWApO1xuICAgIHRoaXMubmFtZSA9ICdBY3RpdmVPcGVyYXRpb25FeGlzdHNFcnJvcic7XG4gICAgdGhpcy5vcGVyYXRpb25JZCA9IG9wZXJhdGlvbklkO1xuICB9XG59XG5cbi8qKlxuICogT3JjaGVzdHJhdGVzIEVSQy00NjI2IHZhdWx0IGRlcG9zaXQgYW5kIHdpdGhkcmF3IGZsb3dzIGZvciBhIHdhbGxldC5cbiAqXG4gKiBFeHBvc2VkIGFzIGB3YWxsZXQuZGVmaWAgb24gdGhlIFdhbGxldCBjbGFzcy4gU2VlIFRERCDCpzYuMy4xIGZvciB0aGUgZnVsbFxuICogZGVzaWduOiB0aGUgU0RLIHNlcXVlbmNlcyB0d28gc2VuZE1hbnkgY2FsbHMgKGFwcHJvdmUgKyBkZXBvc2l0KSBhbmRcbiAqIHJldHVybnMgYW4gb3BlcmF0aW9uSWQgdGhhdCB0aGUgVUkgdXNlcyBmb3Igc3RhdHVzIHRyYWNraW5nIGFuZCByZWNvdmVyeS5cbiAqXG4gKiBVc2VzIHdhbGxldC5zZW5kTWFueSgpIHVuZGVyIHRoZSBob29kIHNvIHRoYXQgYm90aCBjdXN0b2R5IHdhbGxldHNcbiAqICh0eFJlcXVlc3QgY3JlYXRpb24gb25seSkgYW5kIGhvdCB3YWxsZXRzIChjcmVhdGUgKyBzaWduICsgYnJvYWRjYXN0KVxuICogYXJlIGhhbmRsZWQgYnkgdGhlIGV4aXN0aW5nIGluZnJhc3RydWN0dXJlLlxuICovXG5leHBvcnQgY2xhc3MgRGVmaVZhdWx0IGltcGxlbWVudHMgSURlZmlWYXVsdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgd2FsbGV0OiBJV2FsbGV0O1xuICBwcml2YXRlIHJlYWRvbmx5IGJpdGdvOiBCaXRHb0Jhc2U7XG5cbiAgY29uc3RydWN0b3Iod2FsbGV0OiBJV2FsbGV0KSB7XG4gICAgdGhpcy53YWxsZXQgPSB3YWxsZXQ7XG4gICAgdGhpcy5iaXRnbyA9IHdhbGxldC5iaXRnbztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXBvc2l0IGFuIGFtb3VudCBvZiB1bmRlcmx5aW5nIGFzc2V0IGludG8gYSB2YXVsdC5cbiAgICpcbiAgICogSW50ZXJuYWxseSBpc3N1ZXMgdHdvIHNlbmRNYW55IGNhbGxzIChhcHByb3ZlICsgZGVwb3NpdCkgYW5kIHJldHVybnMgdGhlXG4gICAqIG9wZXJhdGlvbklkIHRoYXQgbGlua3MgdGhlbS4gSWYgdGhlIGRlcG9zaXQgc2VuZE1hbnkgZmFpbHMgYWZ0ZXJcbiAgICogdGhlIGFwcHJvdmUgc3VjY2VlZHMsIHRoZSBlcnJvciBwcm9wYWdhdGVzIOKAlCB0aGUgc2VydmVyLXNpZGUgcmVjb25jaWxlclxuICAgKiBoYW5kbGVzIG9ycGhhbmVkIGFwcHJvdmFscy5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcy52YXVsdElkIC0gRGVGaS1zZXJ2aWNlIHZhdWx0IGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHBhcmFtcy5hbW91bnQgLSBhbW91bnQgaW4gYmFzZSB1bml0cyBvZiB0aGUgdW5kZXJseWluZyBhc3NldFxuICAgKiBAcGFyYW0gcGFyYW1zLmNsaWVudElkZW1wb3RlbmN5S2V5IC0gb3B0aW9uYWwgY2xpZW50IGlkZW1wb3RlbmN5IGtleVxuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgLSByZXF1aXJlZCBmb3IgaG90IHdhbGxldHMsIG9taXQgZm9yIGN1c3RvZHlcbiAgICovXG4gIGFzeW5jIGRlcG9zaXRUb1ZhdWx0KHBhcmFtczogRGVwb3NpdFRvVmF1bHRPcHRpb25zKTogUHJvbWlzZTxEZXBvc2l0UmVzdWx0PiB7XG4gICAgaWYgKCFwYXJhbXMudmF1bHRJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd2YXVsdElkIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGlmICghcGFyYW1zLmFtb3VudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhbW91bnQgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPKENHRC0xNzA5KTogUmUtZW5hYmxlIGFjdGl2ZSBvcGVyYXRpb24gcHJlLWZsaWdodCBjaGVjayBvbmNlIHRoZVxuICAgIC8vIGRlZmktc2VydmljZSBvcGVyYXRpb25zIGVuZHBvaW50IGlzIGRlcGxveWVkIGFuZCByZXR1cm5pbmcgYWN0aXZlIHN0YXRlLlxuICAgIC8vIGNvbnN0IGFjdGl2ZU9wczogRGVmaU9wZXJhdGlvbkxpc3RSZXN1bHQgPSBhd2FpdCB0aGlzLmJpdGdvXG4gICAgLy8gICAuZ2V0KHRoaXMuYml0Z28ubWljcm9zZXJ2aWNlc1VybCh0aGlzLm9wZXJhdGlvbnNVcmwoKSkpXG4gICAgLy8gICAucXVlcnkoeyB2YXVsdElkOiBwYXJhbXMudmF1bHRJZCwgc3RhdGU6ICdhY3RpdmUnIH0pXG4gICAgLy8gICAucmVzdWx0KCk7XG4gICAgLy9cbiAgICAvLyBpZiAoYWN0aXZlT3BzLml0ZW1zICYmIGFjdGl2ZU9wcy5pdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgLy8gICB0aHJvdyBuZXcgQWN0aXZlT3BlcmF0aW9uRXhpc3RzRXJyb3IoYWN0aXZlT3BzLml0ZW1zWzBdLm9wZXJhdGlvbklkKTtcbiAgICAvLyB9XG5cbiAgICAvLyBTdGVwIDE6IEFwcHJvdmUgdHhSZXF1ZXN0IHZpYSBzZW5kTWFueVxuICAgIGNvbnN0IGFwcHJvdmVSZXN1bHQgPSBhd2FpdCB0aGlzLndhbGxldC5zZW5kTWFueSh7XG4gICAgICB0eXBlOiAnZGVmaUFwcHJvdmUnLFxuICAgICAgZGVmaVBhcmFtczoge1xuICAgICAgICB2YXVsdElkOiBwYXJhbXMudmF1bHRJZCxcbiAgICAgICAgYW1vdW50OiBwYXJhbXMuYW1vdW50LFxuICAgICAgICAuLi4ocGFyYW1zLmNsaWVudElkZW1wb3RlbmN5S2V5ID8geyBjbGllbnRJZGVtcG90ZW5jeUtleTogcGFyYW1zLmNsaWVudElkZW1wb3RlbmN5S2V5IH0gOiB7fSksXG4gICAgICB9LFxuICAgICAgLi4uKHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlID8geyB3YWxsZXRQYXNzcGhyYXNlOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSB9IDoge30pLFxuICAgIH0pO1xuXG4gICAgY29uc3QgYXBwcm92ZVR4UmVxdWVzdElkID0gdGhpcy5leHRyYWN0VHhSZXF1ZXN0SWQoYXBwcm92ZVJlc3VsdCk7XG4gICAgY29uc3Qgb3BlcmF0aW9uSWQgPSB0aGlzLmV4dHJhY3RPcGVyYXRpb25JZChhcHByb3ZlUmVzdWx0KTtcblxuICAgIGlmICghb3BlcmF0aW9uSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignb3BlcmF0aW9uSWQgbm90IGZvdW5kIGluIGFwcHJvdmUgdHhSZXF1ZXN0IHJlc3BvbnNlJyk7XG4gICAgfVxuXG4gICAgLy8gU3RlcCAyOiBEZXBvc2l0IHR4UmVxdWVzdCB2aWEgc2VuZE1hbnlcbiAgICBjb25zdCBkZXBvc2l0UmVzdWx0ID0gYXdhaXQgdGhpcy53YWxsZXQuc2VuZE1hbnkoe1xuICAgICAgdHlwZTogJ2RlZmlEZXBvc2l0JyxcbiAgICAgIGRlZmlQYXJhbXM6IHtcbiAgICAgICAgdmF1bHRJZDogcGFyYW1zLnZhdWx0SWQsXG4gICAgICAgIGFtb3VudDogcGFyYW1zLmFtb3VudCxcbiAgICAgICAgb3BlcmF0aW9uSWQsXG4gICAgICAgIC4uLihwYXJhbXMuY2xpZW50SWRlbXBvdGVuY3lLZXkgPyB7IGNsaWVudElkZW1wb3RlbmN5S2V5OiBwYXJhbXMuY2xpZW50SWRlbXBvdGVuY3lLZXkgfSA6IHt9KSxcbiAgICAgIH0sXG4gICAgICAuLi4ocGFyYW1zLndhbGxldFBhc3NwaHJhc2UgPyB7IHdhbGxldFBhc3NwaHJhc2U6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIH0gOiB7fSksXG4gICAgfSk7XG4gICAgY29uc3QgZGVwb3NpdFR4UmVxdWVzdElkID0gdGhpcy5leHRyYWN0VHhSZXF1ZXN0SWQoZGVwb3NpdFJlc3VsdCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgb3BlcmF0aW9uSWQsXG4gICAgICB0eFJlcXVlc3RJZHM6IHtcbiAgICAgICAgYXBwcm92ZTogYXBwcm92ZVR4UmVxdWVzdElkLFxuICAgICAgICBkZXBvc2l0OiBkZXBvc2l0VHhSZXF1ZXN0SWQsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUmVzdW1lIGEgcGFydGlhbGx5LWNvbXBsZXRlZCBkZXBvc2l0LiBDYWxsIHRoaXMgd2hlbiB0aGUgU0RLIHByb2Nlc3MgZGllZFxuICAgKiBiZXR3ZWVuIHRoZSBhcHByb3ZlIGFuZCBkZXBvc2l0IHR4UmVxdWVzdCBjcmVhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcy5vcGVyYXRpb25JZCAtIHRoZSBvcGVyYXRpb25JZCBmcm9tIHRoZSBvcmlnaW5hbCBkZXBvc2l0VG9WYXVsdCBjYWxsXG4gICAqIEBwYXJhbSBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSAtIHJlcXVpcmVkIGZvciBob3Qgd2FsbGV0cywgb21pdCBmb3IgY3VzdG9keVxuICAgKi9cbiAgYXN5bmMgcmVzdW1lRGVwb3NpdChwYXJhbXM6IFJlc3VtZURlcG9zaXRPcHRpb25zKTogUHJvbWlzZTxEZXBvc2l0UmVzdWx0PiB7XG4gICAgaWYgKCFwYXJhbXMub3BlcmF0aW9uSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignb3BlcmF0aW9uSWQgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICAvLyBGZXRjaCB0aGUgb3BlcmF0aW9uIHRvIGdldCB0aGUgdmF1bHQgYW5kIGFtb3VudCBkZXRhaWxzXG4gICAgY29uc3Qgb3BlcmF0aW9uID0gYXdhaXQgdGhpcy5nZXRPcGVyYXRpb24oeyBvcGVyYXRpb25JZDogcGFyYW1zLm9wZXJhdGlvbklkIH0pO1xuXG4gICAgaWYgKG9wZXJhdGlvbi5hc3NvY2lhdGVkVHhSZXF1ZXN0SWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRGVwb3NpdCB0eFJlcXVlc3QgYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgb3BlcmF0aW9uOyBub3RoaW5nIHRvIHJlc3VtZScpO1xuICAgIH1cblxuICAgIGlmICghb3BlcmF0aW9uLnR4UmVxdWVzdElkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FwcHJvdmUgdHhSZXF1ZXN0IG5vdCBmb3VuZCBmb3IgdGhpcyBvcGVyYXRpb247IGNhbm5vdCByZXN1bWUnKTtcbiAgICB9XG5cbiAgICAvLyBJc3N1ZSB0aGUgZGVwb3NpdCB0eFJlcXVlc3QgdXNpbmcgdGhlIGV4aXN0aW5nIG9wZXJhdGlvbidzIGRldGFpbHNcbiAgICBjb25zdCBkZXBvc2l0UmVzdWx0ID0gYXdhaXQgdGhpcy53YWxsZXQuc2VuZE1hbnkoe1xuICAgICAgdHlwZTogJ2RlZmlEZXBvc2l0JyxcbiAgICAgIGRlZmlQYXJhbXM6IHtcbiAgICAgICAgdmF1bHRJZDogb3BlcmF0aW9uLnZhdWx0SWQsXG4gICAgICAgIGFtb3VudDogb3BlcmF0aW9uLmFzc2V0QW1vdW50LFxuICAgICAgICBvcGVyYXRpb25JZDogcGFyYW1zLm9wZXJhdGlvbklkLFxuICAgICAgfSxcbiAgICAgIC4uLihwYXJhbXMud2FsbGV0UGFzc3BocmFzZSA/IHsgd2FsbGV0UGFzc3BocmFzZTogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgfSA6IHt9KSxcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBvcGVyYXRpb25JZDogcGFyYW1zLm9wZXJhdGlvbklkLFxuICAgICAgdHhSZXF1ZXN0SWRzOiB7XG4gICAgICAgIGFwcHJvdmU6IG9wZXJhdGlvbi50eFJlcXVlc3RJZCxcbiAgICAgICAgZGVwb3NpdDogdGhpcy5leHRyYWN0VHhSZXF1ZXN0SWQoZGVwb3NpdFJlc3VsdCksXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgRGVGaSBvcGVyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMub3BlcmF0aW9uSWQgLSB0aGUgb3BlcmF0aW9uIHRvIHJldHJpZXZlXG4gICAqL1xuICBhc3luYyBnZXRPcGVyYXRpb24ocGFyYW1zOiBHZXRPcGVyYXRpb25PcHRpb25zKTogUHJvbWlzZTxEZWZpT3BlcmF0aW9uPiB7XG4gICAgaWYgKCFwYXJhbXMub3BlcmF0aW9uSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignb3BlcmF0aW9uSWQgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy5iaXRnby5taWNyb3NlcnZpY2VzVXJsKHRoaXMub3BlcmF0aW9uc1VybCgpICsgJy8nICsgcGFyYW1zLm9wZXJhdGlvbklkKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdCBvcGVyYXRpb25zIGZvciBhIHZhdWx0IGZpbHRlcmVkIGJ5IHdhbGxldElkLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zLnZhdWx0SWQgLSB2YXVsdCB0byBsaXN0IG9wZXJhdGlvbnMgZm9yXG4gICAqIEBwYXJhbSBwYXJhbXMuc3RhdGUgLSBvcHRpb25hbCBzdGF0ZSBmaWx0ZXJcbiAgICogQHBhcmFtIHBhcmFtcy50eXBlIC0gb3B0aW9uYWwgdHlwZSBmaWx0ZXIgKERFUE9TSVQgfCBXSVRIRFJBVylcbiAgICogQHBhcmFtIHBhcmFtcy5saW1pdCAtIHBhZ2Ugc2l6ZVxuICAgKiBAcGFyYW0gcGFyYW1zLmN1cnNvciAtIHBhZ2luYXRpb24gY3Vyc29yXG4gICAqL1xuICBhc3luYyBsaXN0T3BlcmF0aW9ucyhwYXJhbXM6IExpc3RPcGVyYXRpb25zT3B0aW9ucyk6IFByb21pc2U8RGVmaU9wZXJhdGlvbkxpc3RSZXN1bHQ+IHtcbiAgICBpZiAoIXBhcmFtcy52YXVsdElkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZhdWx0SWQgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBxdWVyeTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPiA9IHtcbiAgICAgIHZhdWx0SWQ6IHBhcmFtcy52YXVsdElkLFxuICAgIH07XG4gICAgaWYgKHBhcmFtcy5zdGF0ZSkgcXVlcnkuc3RhdGUgPSBwYXJhbXMuc3RhdGU7XG4gICAgaWYgKHBhcmFtcy50eXBlKSBxdWVyeS50eXBlID0gcGFyYW1zLnR5cGU7XG4gICAgaWYgKHBhcmFtcy5saW1pdCkgcXVlcnkubGltaXQgPSBwYXJhbXMubGltaXQ7XG4gICAgaWYgKHBhcmFtcy5jdXJzb3IpIHF1ZXJ5LmN1cnNvciA9IHBhcmFtcy5jdXJzb3I7XG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5iaXRnby5nZXQodGhpcy5iaXRnby5taWNyb3NlcnZpY2VzVXJsKHRoaXMub3BlcmF0aW9uc1VybCgpKSkucXVlcnkocXVlcnkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLy8g4pSA4pSAIEludGVybmFsIGhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEV4dHJhY3QgdHhSZXF1ZXN0SWQgZnJvbSBhIHNlbmRNYW55IHJlc3VsdC5cbiAgICogc2VuZE1hbnkgcmV0dXJucyBkaWZmZXJlbnQgc2hhcGVzIGRlcGVuZGluZyBvbiB3YWxsZXQgdHlwZTpcbiAgICogLSBUU1MgZnVsbDogeyB0eFJlcXVlc3Q6IHsgdHhSZXF1ZXN0SWQgfSB9IG9yIHsgcGVuZGluZ0FwcHJvdmFsLCB0eFJlcXVlc3QgfVxuICAgKiAtIFRTUyBsaXRlOiByZXN1bHQgZnJvbSB0c3NVdGlscy5zZW5kVHhSZXF1ZXN0XG4gICAqL1xuICBwcml2YXRlIGV4dHJhY3RUeFJlcXVlc3RJZChzZW5kTWFueVJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBzdHJpbmcge1xuICAgIGNvbnN0IHR4UmVxdWVzdCA9IHNlbmRNYW55UmVzdWx0LnR4UmVxdWVzdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICBpZiAodHhSZXF1ZXN0Py50eFJlcXVlc3RJZCkge1xuICAgICAgcmV0dXJuIHR4UmVxdWVzdC50eFJlcXVlc3RJZCBhcyBzdHJpbmc7XG4gICAgfVxuICAgIGlmIChzZW5kTWFueVJlc3VsdC50eFJlcXVlc3RJZCkge1xuICAgICAgcmV0dXJuIHNlbmRNYW55UmVzdWx0LnR4UmVxdWVzdElkIGFzIHN0cmluZztcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCd0eFJlcXVlc3RJZCBub3QgZm91bmQgaW4gc2VuZE1hbnkgcmVzcG9uc2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0IG9wZXJhdGlvbklkIGZyb20gYSBzZW5kTWFueSByZXN1bHQuXG4gICAqXG4gICAqIFRoZSBXUCB3cml0ZXMgdGhlIGRlZmktc2VydmljZS1taW50ZWQgb3BlcmF0aW9uSWQgaW50byB0aGUgYnVpbHRcbiAgICogdHJhbnNhY3Rpb24ncyBgY29pblNwZWNpZmljYCAoYWxvbmdzaWRlIGBhc3NpZ25lZE5vbmNlYCksIG5vdCBpbnRvIHRoZVxuICAgKiBpbnRlbnQuIFJlYWQgaXQgZnJvbSB0aGVyZTogdGhlIGBmdWxsYCBhcGlWZXJzaW9uIHN1cmZhY2VzIGl0IGF0XG4gICAqIGB0cmFuc2FjdGlvbnNbMF0udW5zaWduZWRUeC5jb2luU3BlY2lmaWMub3BlcmF0aW9uSWRgLCB0aGUgYGxpdGVgIHZlcnNpb25cbiAgICogYXQgYHVuc2lnbmVkVHhzWzBdLmNvaW5TcGVjaWZpYy5vcGVyYXRpb25JZGAuIEZhbGwgYmFjayB0b1xuICAgKiBgaW50ZW50Lm9wZXJhdGlvbklkYCBmb3IgZm9yd2FyZC1jb21wYXQgaW4gY2FzZSB0aGUgV1AgbGF0ZXIgYWxzb1xuICAgKiBwb3B1bGF0ZXMgdGhlIGludGVudC5cbiAgICovXG4gIHByaXZhdGUgZXh0cmFjdE9wZXJhdGlvbklkKHNlbmRNYW55UmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgdHhSZXF1ZXN0ID0gc2VuZE1hbnlSZXN1bHQudHhSZXF1ZXN0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGlmICghdHhSZXF1ZXN0KSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIGZ1bGwgYXBpVmVyc2lvbjogdHJhbnNhY3Rpb25zWzBdLnVuc2lnbmVkVHguY29pblNwZWNpZmljLm9wZXJhdGlvbklkXG4gICAgY29uc3QgdHJhbnNhY3Rpb25zID0gdHhSZXF1ZXN0LnRyYW5zYWN0aW9ucyBhcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgZnVsbFVuc2lnbmVkVHggPSB0cmFuc2FjdGlvbnM/LlswXT8udW5zaWduZWRUeCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBmdWxsQ29pblNwZWNpZmljID0gZnVsbFVuc2lnbmVkVHg/LmNvaW5TcGVjaWZpYyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICBpZiAoZnVsbENvaW5TcGVjaWZpYz8ub3BlcmF0aW9uSWQpIHtcbiAgICAgIHJldHVybiBmdWxsQ29pblNwZWNpZmljLm9wZXJhdGlvbklkIGFzIHN0cmluZztcbiAgICB9XG5cbiAgICAvLyBsaXRlIGFwaVZlcnNpb246IHVuc2lnbmVkVHhzWzBdLmNvaW5TcGVjaWZpYy5vcGVyYXRpb25JZFxuICAgIGNvbnN0IHVuc2lnbmVkVHhzID0gdHhSZXF1ZXN0LnVuc2lnbmVkVHhzIGFzIEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBsaXRlQ29pblNwZWNpZmljID0gdW5zaWduZWRUeHM/LlswXT8uY29pblNwZWNpZmljIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGlmIChsaXRlQ29pblNwZWNpZmljPy5vcGVyYXRpb25JZCkge1xuICAgICAgcmV0dXJuIGxpdGVDb2luU3BlY2lmaWMub3BlcmF0aW9uSWQgYXMgc3RyaW5nO1xuICAgIH1cblxuICAgIC8vIGZvcndhcmQtY29tcGF0OiBpbnRlbnQub3BlcmF0aW9uSWQgKGluIGNhc2UgdGhlIFdQIGxhdGVyIHBvcHVsYXRlcyB0aGUgaW50ZW50KVxuICAgIGNvbnN0IGludGVudCA9IHR4UmVxdWVzdC5pbnRlbnQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGludGVudD8ub3BlcmF0aW9uSWQgYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVyYXRpb25zVXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAvYXBpL2RlZmktc2VydmljZS92MS93YWxsZXRzLyR7dGhpcy53YWxsZXQuaWQoKX0vb3BlcmF0aW9uc2A7XG4gIH1cbn1cbiJdfQ==
|
|
354
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmaVZhdWx0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2JpdGdvL2RlZmkvZGVmaVZhdWx0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztHQUVHO0FBQ0gseUNBQTJCO0FBQzNCLHNEQUFzRTtBQWtCdEUsb0NBQTJDO0FBRTNDOztHQUVHO0FBQ0gsTUFBYSwwQkFBMkIsU0FBUSxLQUFLO0lBR25ELFlBQVksV0FBbUI7UUFDN0IsS0FBSyxDQUFDLCtDQUErQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLElBQUksQ0FBQyxJQUFJLEdBQUcsNEJBQTRCLENBQUM7UUFDekMsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7SUFDakMsQ0FBQztDQUNGO0FBUkQsZ0VBUUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBYSxTQUFTO0lBSXBCLFlBQVksTUFBZTtRQUN6QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDNUIsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxjQUFjLENBQUMsTUFBNkI7UUFDaEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDekMsQ0FBQztRQUNELE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUs7YUFDekIsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsK0JBQStCLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2FBQ2pGLE1BQU0sRUFBRSxDQUFDO1FBQ1osT0FBTyxJQUFBLHVCQUFlLEVBQUMsK0JBQWdCLEVBQUUsR0FBRyxFQUFFLGdCQUFnQixDQUFD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QUFFLE9BQU8sQ0FBQyxlQUFlLENBQUMsS0FBSyxJQUFJLG1CQUFtQjtTQUM1RCxDQUFDO0lBQ0osQ0FBQztJQUVPLGFBQWE7UUFDbkIsT0FBTyxnQ0FBZ0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsYUFBYSxDQUFDO0lBQ3ZFLENBQUM7Q0FDRjtBQWhVRCw4QkFnVUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICovXG5pbXBvcnQgKiBhcyB0IGZyb20gJ2lvLXRzJztcbmltcG9ydCB7IEdldFZhdWx0UmVzcG9uc2UsIFZhdWx0UHJvdG9jb2wgfSBmcm9tICdAYml0Z28vcHVibGljLXR5cGVzJztcbmltcG9ydCB7XG4gIENvbmNyZXRlRGVwb3NpdFJlc3VsdCxcbiAgTW9ycGhvRGVwb3NpdFJlc3VsdCxcbiAgRGVmaU9wZXJhdGlvbixcbiAgRGVmaU9wZXJhdGlvbkxpc3RSZXN1bHQsXG4gIERlcG9zaXRSZXN1bHQsXG4gIERlcG9zaXRUb1ZhdWx0T3B0aW9ucyxcbiAgR2V0T3BlcmF0aW9uT3B0aW9ucyxcbiAgR2V0VmF1bHRDb25maWdPcHRpb25zLFxuICBJRGVmaVZhdWx0LFxuICBMaXN0T3BlcmF0aW9uc09wdGlvbnMsXG4gIFJlc3VtZURlcG9zaXRPcHRpb25zLFxuICBXaXRoZHJhd0Zyb21WYXVsdE9wdGlvbnMsXG4gIFdpdGhkcmF3UmVzdWx0LFxufSBmcm9tICcuL2lEZWZpVmF1bHQnO1xuaW1wb3J0IHsgSVdhbGxldCB9IGZyb20gJy4uL3dhbGxldCc7XG5pbXBvcnQgeyBCaXRHb0Jhc2UgfSBmcm9tICcuLi9iaXRnb0Jhc2UnO1xuaW1wb3J0IHsgZGVjb2RlV2l0aENvZGVjIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG4vKipcbiAqIEVycm9yIHRocm93biB3aGVuIGEgY29uY3VycmVudCBhY3RpdmUgZGVwb3NpdCBhbHJlYWR5IGV4aXN0cyBmb3IgdGhlICh3YWxsZXQsIHZhdWx0KSBwYWlyLlxuICovXG5leHBvcnQgY2xhc3MgQWN0aXZlT3BlcmF0aW9uRXhpc3RzRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHB1YmxpYyByZWFkb25seSBvcGVyYXRpb25JZDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKG9wZXJhdGlvbklkOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgQW4gYWN0aXZlIGRlcG9zaXQgb3BlcmF0aW9uIGFscmVhZHkgZXhpc3RzOiAke29wZXJhdGlvbklkfWApO1xuICAgIHRoaXMubmFtZSA9ICdBY3RpdmVPcGVyYXRpb25FeGlzdHNFcnJvcic7XG4gICAgdGhpcy5vcGVyYXRpb25JZCA9IG9wZXJhdGlvbklkO1xuICB9XG59XG5cbi8qKlxuICogT3JjaGVzdHJhdGVzIEVSQy00NjI2IHZhdWx0IGRlcG9zaXQgYW5kIHdpdGhkcmF3IGZsb3dzIGZvciBhIHdhbGxldC5cbiAqXG4gKiBFeHBvc2VkIGFzIGB3YWxsZXQuZGVmaWAgb24gdGhlIFdhbGxldCBjbGFzcy4gU2VlIFRERCDCpzYuMy4xIGZvciB0aGUgZnVsbFxuICogZGVzaWduOiB0aGUgU0RLIHNlcXVlbmNlcyB0d28gc2VuZE1hbnkgY2FsbHMgKGFwcHJvdmUgKyBkZXBvc2l0KSBhbmRcbiAqIHJldHVybnMgYW4gb3BlcmF0aW9uSWQgdGhhdCB0aGUgVUkgdXNlcyBmb3Igc3RhdHVzIHRyYWNraW5nIGFuZCByZWNvdmVyeS5cbiAqXG4gKiBVc2VzIHdhbGxldC5zZW5kTWFueSgpIHVuZGVyIHRoZSBob29kIHNvIHRoYXQgYm90aCBjdXN0b2R5IHdhbGxldHNcbiAqICh0eFJlcXVlc3QgY3JlYXRpb24gb25seSkgYW5kIGhvdCB3YWxsZXRzIChjcmVhdGUgKyBzaWduICsgYnJvYWRjYXN0KVxuICogYXJlIGhhbmRsZWQgYnkgdGhlIGV4aXN0aW5nIGluZnJhc3RydWN0dXJlLlxuICovXG5leHBvcnQgY2xhc3MgRGVmaVZhdWx0IGltcGxlbWVudHMgSURlZmlWYXVsdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgd2FsbGV0OiBJV2FsbGV0O1xuICBwcml2YXRlIHJlYWRvbmx5IGJpdGdvOiBCaXRHb0Jhc2U7XG5cbiAgY29uc3RydWN0b3Iod2FsbGV0OiBJV2FsbGV0KSB7XG4gICAgdGhpcy53YWxsZXQgPSB3YWxsZXQ7XG4gICAgdGhpcy5iaXRnbyA9IHdhbGxldC5iaXRnbztcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCB2YXVsdCBjb25maWcgZnJvbSBkZWZpLXNlcnZpY2UuIFVzZWQgaW50ZXJuYWxseSB0byBkZXRlcm1pbmVcbiAgICogd2hpY2ggZGVwb3NpdCBwYXRoIHRvIHRha2UgKENvbmNyZXRlIHZzIE1vcnBobykuXG4gICAqL1xuICBhc3luYyBnZXRWYXVsdENvbmZpZyhwYXJhbXM6IEdldFZhdWx0Q29uZmlnT3B0aW9ucyk6IFByb21pc2U8R2V0VmF1bHRSZXNwb25zZT4ge1xuICAgIGlmICghcGFyYW1zLnZhdWx0SWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndmF1bHRJZCBpcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgICBjb25zdCByYXcgPSBhd2FpdCB0aGlzLmJpdGdvXG4gICAgICAuZ2V0KHRoaXMuYml0Z28ubWljcm9zZXJ2aWNlc1VybChgL2FwaS9kZWZpLXNlcnZpY2UvdjEvdmF1bHRzLyR7cGFyYW1zLnZhdWx0SWR9YCkpXG4gICAgICAucmVzdWx0KCk7XG4gICAgcmV0dXJuIGRlY29kZVdpdGhDb2RlYyhHZXRWYXVsdFJlc3BvbnNlLCByYXcsICdnZXRWYXVsdENvbmZpZycpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlcG9zaXQgYW4gYW1vdW50IG9mIHVuZGVybHlpbmcgYXNzZXQgaW50byBhIHZhdWx0LlxuICAgKlxuICAgKiBEaXNwYXRjaGVzIHRvIHRoZSBjb25jcmV0ZSBvciBtb3JwaG8gcGF0aCBiYXNlZCBvbiB2YXVsdCBwcm92aWRlci5cbiAgICogVGhlIGNvbmNyZXRlIHBhdGggcmV0dXJucyBhIHBlbmRpbmdBcHByb3ZhbCAoY3VzdG9kaWFsIHdhbGxldCkuXG4gICAqIFRoZSBtb3JwaG8gcGF0aCBpc3N1ZXMgdHdvIHNlbmRNYW55IGNhbGxzIChhcHByb3ZlICsgZGVwb3NpdCkuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMudmF1bHRJZCAtIERlRmktc2VydmljZSB2YXVsdCBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSBwYXJhbXMuYW1vdW50IC0gYW1vdW50IGluIGJhc2UgdW5pdHMgb2YgdGhlIHVuZGVybHlpbmcgYXNzZXRcbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIC0gcmVxdWlyZWQgZm9yIGhvdCB3YWxsZXRzLCBvbWl0IGZvciBjdXN0b2R5XG4gICAqL1xuICBhc3luYyBkZXBvc2l0VG9WYXVsdChwYXJhbXM6IERlcG9zaXRUb1ZhdWx0T3B0aW9ucyk6IFByb21pc2U8RGVwb3NpdFJlc3VsdD4ge1xuICAgIGlmICghcGFyYW1zLnZhdWx0SWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndmF1bHRJZCBpcyByZXF1aXJlZCcpO1xuICAgIH1cbiAgICBpZiAoIXBhcmFtcy5hbW91bnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYW1vdW50IGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnID0gYXdhaXQgdGhpcy5nZXRWYXVsdENvbmZpZyh7IHZhdWx0SWQ6IHBhcmFtcy52YXVsdElkIH0pO1xuXG4gICAgaWYgKGNvbmZpZy5wcm90b2NvbCA9PT0gVmF1bHRQcm90b2NvbC5DT05DUkVURV9CVENDWCkge1xuICAgICAgcmV0dXJuIHRoaXMuZGVwb3NpdFRvQ29uY3JldGVWYXVsdChwYXJhbXMpO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnLnByb3RvY29sID09PSBWYXVsdFByb3RvY29sLk1PUlBITykge1xuICAgICAgcmV0dXJuIHRoaXMuZGVwb3NpdFRvTW9ycGhvVmF1bHQocGFyYW1zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCB2YXVsdCBwcm90b2NvbDogJHtjb25maWcucHJvdG9jb2x9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbmNyZXRlIEJUQyB2YXVsdCBkZXBvc2l0IHBhdGguIFRoZSBjbGllbnQgQlRDIHdhbGxldCBpcyBjdXN0b2RpYWwsIHNvXG4gICAqIHNlbmRNYW55IHJldHVybnMgYSBwZW5kaW5nQXBwcm92YWwgcmF0aGVyIHRoYW4gYSBzaWduZWQgdHJhbnNmZXIuXG4gICAqIE5vIHJlY2lwaWVudHMgYXJlIHNlbnQg4oCUIFdQIHJlc29sdmVzIHRoZSBlc2Nyb3cgZGVzdGluYXRpb24gc2VydmVyLXNpZGUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRlcG9zaXRUb0NvbmNyZXRlVmF1bHQocGFyYW1zOiBEZXBvc2l0VG9WYXVsdE9wdGlvbnMpOiBQcm9taXNlPENvbmNyZXRlRGVwb3NpdFJlc3VsdD4ge1xuICAgIGNvbnN0IHNlbmRNYW55UmVzdWx0ID0gYXdhaXQgdGhpcy53YWxsZXQuc2VuZE1hbnkoe1xuICAgICAgdHlwZTogJ2RlZmktZGVwb3NpdCcsXG4gICAgICBkZWZpUGFyYW1zOiB7XG4gICAgICAgIHZhdWx0SWQ6IHBhcmFtcy52YXVsdElkLFxuICAgICAgICBhbW91bnQ6IHBhcmFtcy5hbW91bnQsXG4gICAgICAgIGFjdGlvblR5cGU6ICdkZWZpLWRlcG9zaXQnLFxuICAgICAgfSxcbiAgICAgIC4uLihwYXJhbXMud2FsbGV0UGFzc3BocmFzZSA/IHsgd2FsbGV0UGFzc3BocmFzZTogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgfSA6IHt9KSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmV4dHJhY3RDb25jcmV0ZURlcG9zaXRSZXN1bHQoc2VuZE1hbnlSZXN1bHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vcnBobyB2YXVsdCBkZXBvc2l0IHBhdGguIElzc3VlcyB0d28gc2VuZE1hbnkgY2FsbHMgKGFwcHJvdmUgKyBkZXBvc2l0KVxuICAgKiBhbmQgcmV0dXJucyB0aGUgb3BlcmF0aW9uSWQgdGhhdCBsaW5rcyB0aGVtLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkZXBvc2l0VG9Nb3JwaG9WYXVsdChwYXJhbXM6IERlcG9zaXRUb1ZhdWx0T3B0aW9ucyk6IFByb21pc2U8TW9ycGhvRGVwb3NpdFJlc3VsdD4ge1xuICAgIC8vIFRPRE8oQ0dELTE3MDkpOiBSZS1lbmFibGUgYWN0aXZlIG9wZXJhdGlvbiBwcmUtZmxpZ2h0IGNoZWNrIG9uY2UgdGhlXG4gICAgLy8gZGVmaS1zZXJ2aWNlIG9wZXJhdGlvbnMgZW5kcG9pbnQgaXMgZGVwbG95ZWQgYW5kIHJldHVybmluZyBhY3RpdmUgc3RhdGUuXG4gICAgLy8gY29uc3QgYWN0aXZlT3BzOiBEZWZpT3BlcmF0aW9uTGlzdFJlc3VsdCA9IGF3YWl0IHRoaXMuYml0Z29cbiAgICAvLyAgIC5nZXQodGhpcy5iaXRnby5taWNyb3NlcnZpY2VzVXJsKHRoaXMub3BlcmF0aW9uc1VybCgpKSlcbiAgICAvLyAgIC5xdWVyeSh7IHZhdWx0SWQ6IHBhcmFtcy52YXVsdElkLCBzdGF0ZTogJ2FjdGl2ZScgfSlcbiAgICAvLyAgIC5yZXN1bHQoKTtcbiAgICAvL1xuICAgIC8vIGlmIChhY3RpdmVPcHMuaXRlbXMgJiYgYWN0aXZlT3BzLml0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAvLyAgIHRocm93IG5ldyBBY3RpdmVPcGVyYXRpb25FeGlzdHNFcnJvcihhY3RpdmVPcHMuaXRlbXNbMF0ub3BlcmF0aW9uSWQpO1xuICAgIC8vIH1cblxuICAgIC8vIFN0ZXAgMTogQXBwcm92ZSB0eFJlcXVlc3QgdmlhIHNlbmRNYW55XG4gICAgY29uc3QgYXBwcm92ZVJlc3VsdCA9IGF3YWl0IHRoaXMud2FsbGV0LnNlbmRNYW55KHtcbiAgICAgIHR5cGU6ICdkZWZpQXBwcm92ZScsXG4gICAgICBkZWZpUGFyYW1zOiB7XG4gICAgICAgIHZhdWx0SWQ6IHBhcmFtcy52YXVsdElkLFxuICAgICAgICBhbW91bnQ6IHBhcmFtcy5hbW91bnQsXG4gICAgICB9LFxuICAgICAgLi4uKHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlID8geyB3YWxsZXRQYXNzcGhyYXNlOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSB9IDoge30pLFxuICAgIH0pO1xuXG4gICAgY29uc3QgYXBwcm92ZVR4UmVxdWVzdElkID0gdGhpcy5leHRyYWN0VHhSZXF1ZXN0SWQoYXBwcm92ZVJlc3VsdCk7XG4gICAgY29uc3Qgb3BlcmF0aW9uSWQgPSB0aGlzLmV4dHJhY3RPcGVyYXRpb25JZChhcHByb3ZlUmVzdWx0KTtcblxuICAgIGlmICghb3BlcmF0aW9uSWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignb3BlcmF0aW9uSWQgbm90IGZvdW5kIGluIGFwcHJvdmUgdHhSZXF1ZXN0IHJlc3BvbnNlJyk7XG4gICAgfVxuXG4gICAgLy8gU3RlcCAyOiBEZXBvc2l0IHR4UmVxdWVzdCB2aWEgc2VuZE1hbnlcbiAgICBjb25zdCBkZXBvc2l0UmVzdWx0ID0gYXdhaXQgdGhpcy53YWxsZXQuc2VuZE1hbnkoe1xuICAgICAgdHlwZTogJ2RlZmlEZXBvc2l0JyxcbiAgICAgIGRlZmlQYXJhbXM6IHtcbiAgICAgICAgdmF1bHRJZDogcGFyYW1zLnZhdWx0SWQsXG4gICAgICAgIGFtb3VudDogcGFyYW1zLmFtb3VudCxcbiAgICAgICAgb3BlcmF0aW9uSWQsXG4gICAgICB9LFxuICAgICAgLi4uKHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlID8geyB3YWxsZXRQYXNzcGhyYXNlOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSB9IDoge30pLFxuICAgIH0pO1xuICAgIGNvbnN0IGRlcG9zaXRUeFJlcXVlc3RJZCA9IHRoaXMuZXh0cmFjdFR4UmVxdWVzdElkKGRlcG9zaXRSZXN1bHQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG9wZXJhdGlvbklkLFxuICAgICAgdHhSZXF1ZXN0SWRzOiB7XG4gICAgICAgIGFwcHJvdmU6IGFwcHJvdmVUeFJlcXVlc3RJZCxcbiAgICAgICAgZGVwb3NpdDogZGVwb3NpdFR4UmVxdWVzdElkLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3VtZSBhIHBhcnRpYWxseS1jb21wbGV0ZWQgZGVwb3NpdC4gQ2FsbCB0aGlzIHdoZW4gdGhlIFNESyBwcm9jZXNzIGRpZWRcbiAgICogYmV0d2VlbiB0aGUgYXBwcm92ZSBhbmQgZGVwb3NpdCB0eFJlcXVlc3QgY3JlYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMub3BlcmF0aW9uSWQgLSB0aGUgb3BlcmF0aW9uSWQgZnJvbSB0aGUgb3JpZ2luYWwgZGVwb3NpdFRvVmF1bHQgY2FsbFxuICAgKiBAcGFyYW0gcGFyYW1zLndhbGxldFBhc3NwaHJhc2UgLSByZXF1aXJlZCBmb3IgaG90IHdhbGxldHMsIG9taXQgZm9yIGN1c3RvZHlcbiAgICovXG4gIGFzeW5jIHJlc3VtZURlcG9zaXQocGFyYW1zOiBSZXN1bWVEZXBvc2l0T3B0aW9ucyk6IFByb21pc2U8RGVwb3NpdFJlc3VsdD4ge1xuICAgIGlmICghcGFyYW1zLm9wZXJhdGlvbklkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ29wZXJhdGlvbklkIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuXG4gICAgLy8gRmV0Y2ggdGhlIG9wZXJhdGlvbiB0byBnZXQgdGhlIHZhdWx0IGFuZCBhbW91bnQgZGV0YWlsc1xuICAgIGNvbnN0IG9wZXJhdGlvbiA9IGF3YWl0IHRoaXMuZ2V0T3BlcmF0aW9uKHsgb3BlcmF0aW9uSWQ6IHBhcmFtcy5vcGVyYXRpb25JZCB9KTtcblxuICAgIGlmIChvcGVyYXRpb24uYXNzb2NpYXRlZFR4UmVxdWVzdElkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RlcG9zaXQgdHhSZXF1ZXN0IGFscmVhZHkgZXhpc3RzIGZvciB0aGlzIG9wZXJhdGlvbjsgbm90aGluZyB0byByZXN1bWUnKTtcbiAgICB9XG5cbiAgICBpZiAoIW9wZXJhdGlvbi50eFJlcXVlc3RJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcHByb3ZlIHR4UmVxdWVzdCBub3QgZm91bmQgZm9yIHRoaXMgb3BlcmF0aW9uOyBjYW5ub3QgcmVzdW1lJyk7XG4gICAgfVxuXG4gICAgLy8gSXNzdWUgdGhlIGRlcG9zaXQgdHhSZXF1ZXN0IHVzaW5nIHRoZSBleGlzdGluZyBvcGVyYXRpb24ncyBkZXRhaWxzXG4gICAgY29uc3QgZGVwb3NpdFJlc3VsdCA9IGF3YWl0IHRoaXMud2FsbGV0LnNlbmRNYW55KHtcbiAgICAgIHR5cGU6ICdkZWZpRGVwb3NpdCcsXG4gICAgICBkZWZpUGFyYW1zOiB7XG4gICAgICAgIHZhdWx0SWQ6IG9wZXJhdGlvbi52YXVsdElkLFxuICAgICAgICBhbW91bnQ6IG9wZXJhdGlvbi5hc3NldEFtb3VudCxcbiAgICAgICAgb3BlcmF0aW9uSWQ6IHBhcmFtcy5vcGVyYXRpb25JZCxcbiAgICAgIH0sXG4gICAgICAuLi4ocGFyYW1zLndhbGxldFBhc3NwaHJhc2UgPyB7IHdhbGxldFBhc3NwaHJhc2U6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIH0gOiB7fSksXG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgb3BlcmF0aW9uSWQ6IHBhcmFtcy5vcGVyYXRpb25JZCxcbiAgICAgIHR4UmVxdWVzdElkczoge1xuICAgICAgICBhcHByb3ZlOiBvcGVyYXRpb24udHhSZXF1ZXN0SWQsXG4gICAgICAgIGRlcG9zaXQ6IHRoaXMuZXh0cmFjdFR4UmVxdWVzdElkKGRlcG9zaXRSZXN1bHQpLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBzdGF0ZSBvZiBhIERlRmkgb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zLm9wZXJhdGlvbklkIC0gdGhlIG9wZXJhdGlvbiB0byByZXRyaWV2ZVxuICAgKi9cbiAgYXN5bmMgZ2V0T3BlcmF0aW9uKHBhcmFtczogR2V0T3BlcmF0aW9uT3B0aW9ucyk6IFByb21pc2U8RGVmaU9wZXJhdGlvbj4ge1xuICAgIGlmICghcGFyYW1zLm9wZXJhdGlvbklkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ29wZXJhdGlvbklkIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMuYml0Z28ubWljcm9zZXJ2aWNlc1VybCh0aGlzLm9wZXJhdGlvbnNVcmwoKSArICcvJyArIHBhcmFtcy5vcGVyYXRpb25JZCkpLnJlc3VsdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3Qgb3BlcmF0aW9ucyBmb3IgYSB2YXVsdCBmaWx0ZXJlZCBieSB3YWxsZXRJZC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcy52YXVsdElkIC0gdmF1bHQgdG8gbGlzdCBvcGVyYXRpb25zIGZvclxuICAgKiBAcGFyYW0gcGFyYW1zLnN0YXRlIC0gb3B0aW9uYWwgc3RhdGUgZmlsdGVyXG4gICAqIEBwYXJhbSBwYXJhbXMudHlwZSAtIG9wdGlvbmFsIHR5cGUgZmlsdGVyIChERVBPU0lUIHwgV0lUSERSQVcpXG4gICAqIEBwYXJhbSBwYXJhbXMubGltaXQgLSBwYWdlIHNpemVcbiAgICogQHBhcmFtIHBhcmFtcy5jdXJzb3IgLSBwYWdpbmF0aW9uIGN1cnNvclxuICAgKi9cbiAgYXN5bmMgbGlzdE9wZXJhdGlvbnMocGFyYW1zOiBMaXN0T3BlcmF0aW9uc09wdGlvbnMpOiBQcm9taXNlPERlZmlPcGVyYXRpb25MaXN0UmVzdWx0PiB7XG4gICAgaWYgKCFwYXJhbXMudmF1bHRJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd2YXVsdElkIGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnk6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj4gPSB7XG4gICAgICB2YXVsdElkOiBwYXJhbXMudmF1bHRJZCxcbiAgICB9O1xuICAgIGlmIChwYXJhbXMuc3RhdGUpIHF1ZXJ5LnN0YXRlID0gcGFyYW1zLnN0YXRlO1xuICAgIGlmIChwYXJhbXMudHlwZSkgcXVlcnkudHlwZSA9IHBhcmFtcy50eXBlO1xuICAgIGlmIChwYXJhbXMubGltaXQpIHF1ZXJ5LmxpbWl0ID0gcGFyYW1zLmxpbWl0O1xuICAgIGlmIChwYXJhbXMuY3Vyc29yKSBxdWVyeS5jdXJzb3IgPSBwYXJhbXMuY3Vyc29yO1xuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuYml0Z28uZ2V0KHRoaXMuYml0Z28ubWljcm9zZXJ2aWNlc1VybCh0aGlzLm9wZXJhdGlvbnNVcmwoKSkpLnF1ZXJ5KHF1ZXJ5KS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaXRoZHJhdyB2YXVsdCBzaGFyZXMgZnJvbSBhIERlRmkgdmF1bHQuXG4gICAqXG4gICAqIElzc3VlcyBhIHNpbmdsZSBzZW5kTWFueSBjYWxsIChkZWZpV2l0aGRyYXcpIGFuZCByZXR1cm5zIHRoZSBvcGVyYXRpb25JZFxuICAgKiBhbmQgdHhSZXF1ZXN0SWQuIFRoZSBzdGF0ZSBtYWNoaW5lIGZvciB3aXRoZHJhd2FsIGlzIHNpbXBsZXIgdGhhbiBkZXBvc2l0OlxuICAgKiBDUkVBVEVEIOKGkiBXSVRIRFJBV19UWF9SRVFVRVNURUQg4oaSIFdJVEhEUkFXX1NJR05FRCDihpIgV0lUSERSQVdfQ09ORklSTUVEIOKGkiBDT01QTEVURURcbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcy52YXVsdElkIC0gRGVGaS1zZXJ2aWNlIHZhdWx0IGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHBhcmFtcy5hbW91bnQgLSBhbW91bnQgaW4gYmFzZSB1bml0cyBvZiB0aGUgdmF1bHQgc2hhcmUgdG9rZW5cbiAgICogQHBhcmFtIHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlIC0gcmVxdWlyZWQgZm9yIGhvdCB3YWxsZXRzLCBvbWl0IGZvciBjdXN0b2R5XG4gICAqL1xuICBhc3luYyB3aXRoZHJhd0Zyb21WYXVsdChwYXJhbXM6IFdpdGhkcmF3RnJvbVZhdWx0T3B0aW9ucyk6IFByb21pc2U8V2l0aGRyYXdSZXN1bHQ+IHtcbiAgICBpZiAoIXBhcmFtcy52YXVsdElkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZhdWx0SWQgaXMgcmVxdWlyZWQnKTtcbiAgICB9XG4gICAgaWYgKCFwYXJhbXMuYW1vdW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2Ftb3VudCBpcyByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHdpdGhkcmF3UmVzdWx0ID0gYXdhaXQgdGhpcy53YWxsZXQuc2VuZE1hbnkoe1xuICAgICAgdHlwZTogJ2RlZmlXaXRoZHJhdycsXG4gICAgICBkZWZpUGFyYW1zOiB7XG4gICAgICAgIHZhdWx0SWQ6IHBhcmFtcy52YXVsdElkLFxuICAgICAgICBhbW91bnQ6IHBhcmFtcy5hbW91bnQsXG4gICAgICB9LFxuICAgICAgLi4uKHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlID8geyB3YWxsZXRQYXNzcGhyYXNlOiBwYXJhbXMud2FsbGV0UGFzc3BocmFzZSB9IDoge30pLFxuICAgIH0pO1xuXG4gICAgY29uc3QgdHhSZXF1ZXN0SWQgPSB0aGlzLmV4dHJhY3RUeFJlcXVlc3RJZCh3aXRoZHJhd1Jlc3VsdCk7XG4gICAgY29uc3Qgb3BlcmF0aW9uSWQgPSB0aGlzLmV4dHJhY3RPcGVyYXRpb25JZCh3aXRoZHJhd1Jlc3VsdCk7XG5cbiAgICBpZiAoIW9wZXJhdGlvbklkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ29wZXJhdGlvbklkIG5vdCBmb3VuZCBpbiB3aXRoZHJhdyB0eFJlcXVlc3QgcmVzcG9uc2UnKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBvcGVyYXRpb25JZCwgdHhSZXF1ZXN0SWQgfTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJbnRlcm5hbCBoZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBFeHRyYWN0IHR4UmVxdWVzdElkIGZyb20gYSBzZW5kTWFueSByZXN1bHQuXG4gICAqIHNlbmRNYW55IHJldHVybnMgZGlmZmVyZW50IHNoYXBlcyBkZXBlbmRpbmcgb24gd2FsbGV0IHR5cGU6XG4gICAqIC0gVFNTIGZ1bGw6IHsgdHhSZXF1ZXN0OiB7IHR4UmVxdWVzdElkIH0gfSBvciB7IHBlbmRpbmdBcHByb3ZhbCwgdHhSZXF1ZXN0IH1cbiAgICogLSBUU1MgbGl0ZTogcmVzdWx0IGZyb20gdHNzVXRpbHMuc2VuZFR4UmVxdWVzdFxuICAgKi9cbiAgcHJpdmF0ZSBleHRyYWN0VHhSZXF1ZXN0SWQoc2VuZE1hbnlSZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogc3RyaW5nIHtcbiAgICBjb25zdCB0eFJlcXVlc3QgPSBzZW5kTWFueVJlc3VsdC50eFJlcXVlc3QgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKHR4UmVxdWVzdD8udHhSZXF1ZXN0SWQpIHtcbiAgICAgIHJldHVybiB0eFJlcXVlc3QudHhSZXF1ZXN0SWQgYXMgc3RyaW5nO1xuICAgIH1cbiAgICBpZiAoc2VuZE1hbnlSZXN1bHQudHhSZXF1ZXN0SWQpIHtcbiAgICAgIHJldHVybiBzZW5kTWFueVJlc3VsdC50eFJlcXVlc3RJZCBhcyBzdHJpbmc7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcigndHhSZXF1ZXN0SWQgbm90IGZvdW5kIGluIHNlbmRNYW55IHJlc3BvbnNlJyk7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdCBvcGVyYXRpb25JZCBmcm9tIGEgc2VuZE1hbnkgcmVzdWx0LlxuICAgKlxuICAgKiBUaGUgV1Agd3JpdGVzIHRoZSBkZWZpLXNlcnZpY2UtbWludGVkIG9wZXJhdGlvbklkIGludG8gdGhlIGJ1aWx0XG4gICAqIHRyYW5zYWN0aW9uJ3MgYGNvaW5TcGVjaWZpY2AgKGFsb25nc2lkZSBgYXNzaWduZWROb25jZWApLCBub3QgaW50byB0aGVcbiAgICogaW50ZW50LiBSZWFkIGl0IGZyb20gdGhlcmU6IHRoZSBgZnVsbGAgYXBpVmVyc2lvbiBzdXJmYWNlcyBpdCBhdFxuICAgKiBgdHJhbnNhY3Rpb25zWzBdLnVuc2lnbmVkVHguY29pblNwZWNpZmljLm9wZXJhdGlvbklkYCwgdGhlIGBsaXRlYCB2ZXJzaW9uXG4gICAqIGF0IGB1bnNpZ25lZFR4c1swXS5jb2luU3BlY2lmaWMub3BlcmF0aW9uSWRgLiBGYWxsIGJhY2sgdG9cbiAgICogYGludGVudC5vcGVyYXRpb25JZGAgZm9yIGZvcndhcmQtY29tcGF0IGluIGNhc2UgdGhlIFdQIGxhdGVyIGFsc29cbiAgICogcG9wdWxhdGVzIHRoZSBpbnRlbnQuXG4gICAqL1xuICBwcml2YXRlIGV4dHJhY3RPcGVyYXRpb25JZChzZW5kTWFueVJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHR4UmVxdWVzdCA9IHNlbmRNYW55UmVzdWx0LnR4UmVxdWVzdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIXR4UmVxdWVzdCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBmdWxsIGFwaVZlcnNpb246IHRyYW5zYWN0aW9uc1swXS51bnNpZ25lZFR4LmNvaW5TcGVjaWZpYy5vcGVyYXRpb25JZFxuICAgIGNvbnN0IHRyYW5zYWN0aW9ucyA9IHR4UmVxdWVzdC50cmFuc2FjdGlvbnMgYXMgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGZ1bGxVbnNpZ25lZFR4ID0gdHJhbnNhY3Rpb25zPy5bMF0/LnVuc2lnbmVkVHggYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgZnVsbENvaW5TcGVjaWZpYyA9IGZ1bGxVbnNpZ25lZFR4Py5jb2luU3BlY2lmaWMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGZ1bGxDb2luU3BlY2lmaWM/Lm9wZXJhdGlvbklkKSB7XG4gICAgICByZXR1cm4gZnVsbENvaW5TcGVjaWZpYy5vcGVyYXRpb25JZCBhcyBzdHJpbmc7XG4gICAgfVxuXG4gICAgLy8gbGl0ZSBhcGlWZXJzaW9uOiB1bnNpZ25lZFR4c1swXS5jb2luU3BlY2lmaWMub3BlcmF0aW9uSWRcbiAgICBjb25zdCB1bnNpZ25lZFR4cyA9IHR4UmVxdWVzdC51bnNpZ25lZFR4cyBhcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgbGl0ZUNvaW5TcGVjaWZpYyA9IHVuc2lnbmVkVHhzPy5bMF0/LmNvaW5TcGVjaWZpYyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICBpZiAobGl0ZUNvaW5TcGVjaWZpYz8ub3BlcmF0aW9uSWQpIHtcbiAgICAgIHJldHVybiBsaXRlQ29pblNwZWNpZmljLm9wZXJhdGlvbklkIGFzIHN0cmluZztcbiAgICB9XG5cbiAgICAvLyBmb3J3YXJkLWNvbXBhdDogaW50ZW50Lm9wZXJhdGlvbklkIChpbiBjYXNlIHRoZSBXUCBsYXRlciBwb3B1bGF0ZXMgdGhlIGludGVudClcbiAgICBjb25zdCBpbnRlbnQgPSB0eFJlcXVlc3QuaW50ZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIHJldHVybiBpbnRlbnQ/Lm9wZXJhdGlvbklkIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0cyB7QGxpbmsgQ29uY3JldGVEZXBvc2l0UmVzdWx0fSBmcm9tIGEgY3VzdG9kaWFsIHNlbmRNYW55IHJlc3BvbnNlLlxuICAgKiBDb25jcmV0ZSBCVEMgZGVwb3NpdHMgcmV0dXJuIGEgYHBlbmRpbmdBcHByb3ZhbGAgaW5zdGVhZCBvZiBhIHR4UmVxdWVzdCDigJRcbiAgICogdGhyb3dzIGlmIGBwZW5kaW5nQXBwcm92YWwuaWRgIGlzIGFic2VudCwgaW5kaWNhdGluZyBhbiB1bmV4cGVjdGVkIHNoYXBlLlxuICAgKi9cbiAgcHJpdmF0ZSBleHRyYWN0Q29uY3JldGVEZXBvc2l0UmVzdWx0KHNlbmRNYW55UmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IENvbmNyZXRlRGVwb3NpdFJlc3VsdCB7XG4gICAgY29uc3QgU2VuZE1hbnlDb25jcmV0ZVJlc3BvbnNlID0gdC50eXBlKHtcbiAgICAgIHBlbmRpbmdBcHByb3ZhbDogdC5pbnRlcnNlY3Rpb24oW3QudHlwZSh7IGlkOiB0LnN0cmluZyB9KSwgdC5wYXJ0aWFsKHsgc3RhdGU6IHQuc3RyaW5nIH0pXSksXG4gICAgfSk7XG4gICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZVdpdGhDb2RlYyhTZW5kTWFueUNvbmNyZXRlUmVzcG9uc2UsIHNlbmRNYW55UmVzdWx0LCAnZGVmaS1kZXBvc2l0IHNlbmRNYW55IHJlc3BvbnNlJyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBlbmRpbmdBcHByb3ZhbElkOiBkZWNvZGVkLnBlbmRpbmdBcHByb3ZhbC5pZCxcbiAgICAgIHN0YXRlOiBkZWNvZGVkLnBlbmRpbmdBcHByb3ZhbC5zdGF0ZSA/PyAnYXdhaXRpbmdTaWduYXR1cmUnLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIG9wZXJhdGlvbnNVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYC9hcGkvZGVmaS1zZXJ2aWNlL3YxL3dhbGxldHMvJHt0aGlzLndhbGxldC5pZCgpfS9vcGVyYXRpb25zYDtcbiAgfVxufVxuIl19
|