@coinflowlabs/angular 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,5 @@
1
1
  import { web3, base58 } from './SolanaPeerDeps';
2
2
  import LZString from 'lz-string';
3
- import { Keypair, Transaction } from '@solana/web3.js';
4
- import { sign } from 'tweetnacl';
5
3
  export class CoinflowUtils {
6
4
  constructor(env) {
7
5
  this.env = env ?? 'prod';
@@ -21,17 +19,6 @@ export class CoinflowUtils {
21
19
  return undefined;
22
20
  });
23
21
  }
24
- async getCreditBalance(publicKey, merchantId, blockchain) {
25
- const response = await fetch(this.url + `/api/customer/balances/${merchantId}`, {
26
- method: 'GET',
27
- headers: {
28
- 'x-coinflow-auth-wallet': publicKey,
29
- 'x-coinflow-auth-blockchain': blockchain,
30
- },
31
- });
32
- const { credits } = await response.json();
33
- return credits;
34
- }
35
22
  static getCoinflowBaseUrl(env) {
36
23
  if (!env || env === 'prod')
37
24
  return 'https://coinflow.cash';
@@ -46,7 +33,7 @@ export class CoinflowUtils {
46
33
  return 'http://localhost:5000';
47
34
  return `https://api-${env}.coinflow.cash`;
48
35
  }
49
- static getCoinflowUrl({ walletPubkey, sessionKey, route, routePrefix, env, amount, transaction, blockchain = 'solana', webhookInfo, email, loaderBackground, handleHeightChange, bankAccountLinkRedirect, additionalWallets, nearDeposit, chargebackProtectionData, merchantCss, color, rent, lockDefaultToken, token, tokens, planCode, disableApplePay, disableGooglePay, customerInfo, settlementType, lockAmount, nativeSolToConvert, theme, usePermit, transactionSigner, authOnly, deviceId, jwtToken, origins, threeDsChallengePreference, supportEmail, }) {
36
+ static getCoinflowUrl({ walletPubkey, sessionKey, route, routePrefix, env, amount, transaction, blockchain = 'solana', webhookInfo, email, loaderBackground, handleHeightChange, bankAccountLinkRedirect, additionalWallets, nearDeposit, chargebackProtectionData, merchantCss, color, rent, lockDefaultToken, token, tokens, planCode, disableApplePay, disableGooglePay, customerInfo, settlementType, lockAmount, nativeSolToConvert, theme, usePermit, transactionSigner, authOnly, deviceId, jwtToken, origins, threeDsChallengePreference, supportEmail, destinationAuthKey, }) {
50
37
  const prefix = routePrefix
51
38
  ? `/${routePrefix}/${blockchain}`
52
39
  : `/${blockchain}`;
@@ -140,6 +127,8 @@ export class CoinflowUtils {
140
127
  url.searchParams.append('origins', LZString.compressToEncodedURIComponent(JSON.stringify(origins)));
141
128
  if (threeDsChallengePreference)
142
129
  url.searchParams.append('threeDsChallengePreference', threeDsChallengePreference);
130
+ if (destinationAuthKey)
131
+ url.searchParams.append('destinationAuthKey', destinationAuthKey);
143
132
  return url.toString();
144
133
  }
145
134
  static getTransaction(props) {
@@ -216,56 +205,5 @@ export class CoinflowUtils {
216
205
  throw new Error('blockchain not supported!');
217
206
  }
218
207
  }
219
- static async getWalletFromUserId({ userId, merchantId, env, }) {
220
- return this.getWalletFromEmail({
221
- email: userId,
222
- merchantId,
223
- env,
224
- });
225
- }
226
- static async getWalletFromEmail({ email, merchantId, env, }) {
227
- const buffer = new TextEncoder().encode(email);
228
- const crypto = window.crypto.subtle;
229
- const hash = await crypto.digest('SHA-256', buffer);
230
- const seed = new Uint8Array(hash);
231
- const keypair = Keypair.fromSeed(seed);
232
- return {
233
- publicKey: keypair.publicKey,
234
- signMessage: (message) => Promise.resolve(sign.detached(message, keypair.secretKey)),
235
- signTransaction: async (transaction) => {
236
- if (transaction instanceof Transaction) {
237
- transaction.sign(keypair);
238
- return transaction;
239
- }
240
- else {
241
- transaction.sign([keypair]);
242
- return transaction;
243
- }
244
- },
245
- sendTransaction: async (transaction) => {
246
- if (transaction instanceof Transaction) {
247
- transaction.sign(keypair);
248
- }
249
- else {
250
- transaction.sign([keypair]);
251
- }
252
- const coinflowBaseUrl = this.getCoinflowApiUrl(env);
253
- const options = {
254
- method: 'POST',
255
- headers: {
256
- 'content-type': 'application/json',
257
- 'x-coinflow-auth-wallet': keypair.publicKey.toString(),
258
- 'x-coinflow-auth-blockchain': 'solana',
259
- },
260
- body: JSON.stringify({
261
- merchantId,
262
- signedTransaction: base58?.encode(transaction.serialize()),
263
- }),
264
- };
265
- const { signature } = await fetch(coinflowBaseUrl + '/api/utils/send-coinflow-tx', options).then(res => res.json());
266
- return signature;
267
- },
268
- };
269
- }
270
208
  }
271
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29pbmZsb3dVdGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvaW5mbG93bGFicy9zcmMvbGliL2NvbW1vbi9Db2luZmxvd1V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLE9BQU8sRUFBQyxJQUFJLEVBQUUsTUFBTSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDOUMsT0FBTyxRQUFRLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxPQUFPLEVBQUUsV0FBVyxFQUF1QixNQUFNLGlCQUFpQixDQUFDO0FBQzNFLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFL0IsTUFBTSxPQUFPLGFBQWE7SUFJeEIsWUFBWSxHQUFrQjtRQUM1QixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxNQUFNLENBQUM7UUFDekIsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLE1BQU07WUFBRSxJQUFJLENBQUMsR0FBRyxHQUFHLDJCQUEyQixDQUFDO2FBQzNELElBQUksSUFBSSxDQUFDLEdBQUcsS0FBSyxPQUFPO1lBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyx1QkFBdUIsQ0FBQzs7WUFDN0QsSUFBSSxDQUFDLEdBQUcsR0FBRyxlQUFlLElBQUksQ0FBQyxHQUFHLGdCQUFnQixDQUFDO0lBQzFELENBQUM7SUFFRCxLQUFLLENBQUMsaUJBQWlCLENBQUMsVUFBa0I7UUFDeEMsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxrQkFBa0IsVUFBVSxFQUFFLENBQUM7YUFDcEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO2FBQ2pDLElBQUksQ0FDSCxDQUFDLElBR0EsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxjQUFjLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FDaEU7YUFDQSxLQUFLLENB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O0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb2luZmxvd0Jsb2NrY2hhaW4sXG4gIENvaW5mbG93RW52cyxcbiAgQ29pbmZsb3dJRnJhbWVQcm9wcyxcbiAgQ29pbmZsb3dQdXJjaGFzZVByb3BzLFxuICBTb2xhbmFXYWxsZXQsXG59IGZyb20gJy4vQ29pbmZsb3dUeXBlcyc7XG5pbXBvcnQge3dlYjMsIGJhc2U1OH0gZnJvbSAnLi9Tb2xhbmFQZWVyRGVwcyc7XG5pbXBvcnQgTFpTdHJpbmcgZnJvbSAnbHotc3RyaW5nJztcbmltcG9ydCB7S2V5cGFpciwgVHJhbnNhY3Rpb24sIFZlcnNpb25lZFRyYW5zYWN0aW9ufSBmcm9tICdAc29sYW5hL3dlYjMuanMnO1xuaW1wb3J0IHtzaWdufSBmcm9tICd0d2VldG5hY2wnO1xuXG5leHBvcnQgY2xhc3MgQ29pbmZsb3dVdGlscyB7XG4gIGVudjogQ29pbmZsb3dFbnZzO1xuICB1cmw6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihlbnY/OiBDb2luZmxvd0VudnMpIHtcbiAgICB0aGlzLmVudiA9IGVudiA/PyAncHJvZCc7XG4gICAgaWYgKHRoaXMuZW52ID09PSAncHJvZCcpIHRoaXMudXJsID0gJ2h0dHBzOi8vYXBpLmNvaW5mbG93LmNhc2gnO1xuICAgIGVsc2UgaWYgKHRoaXMuZW52ID09PSAnbG9jYWwnKSB0aGlzLnVybCA9ICdodHRwOi8vbG9jYWxob3N0OjUwMDAnO1xuICAgIGVsc2UgdGhpcy51cmwgPSBgaHR0cHM6Ly9hcGktJHt0aGlzLmVudn0uY29pbmZsb3cuY2FzaGA7XG4gIH1cblxuICBhc3luYyBnZXROU3VyZVBhcnRuZXJJZChtZXJjaGFudElkOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiBmZXRjaCh0aGlzLnVybCArIGAvbWVyY2hhbnQvdmlldy8ke21lcmNoYW50SWR9YClcbiAgICAgIC50aGVuKHJlc3BvbnNlID0+IHJlc3BvbnNlLmpzb24oKSlcbiAgICAgIC50aGVuKFxuICAgICAgICAoanNvbjoge1xuICAgICAgICAgIG5TdXJlUGFydG5lcklkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgblN1cmVTZXR0aW5nczoge25TdXJlUGFydG5lcklkOiBzdHJpbmcgfCB1bmRlZmluZWR9O1xuICAgICAgICB9KSA9PiBqc29uLm5TdXJlU2V0dGluZ3M/Lm5TdXJlUGFydG5lcklkIHx8IGpzb24ublN1cmVQYXJ0bmVySWRcbiAgICAgIClcbiAgICAgIC5jYXRjaChlID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZ2V0Q3JlZGl0QmFsYW5jZShcbiAgICBwdWJsaWNLZXk6IHN0cmluZyxcbiAgICBtZXJjaGFudElkOiBzdHJpbmcsXG4gICAgYmxvY2tjaGFpbjogJ3NvbGFuYScgfCAnbmVhcidcbiAgKTogUHJvbWlzZTx7Y2VudHM6IG51bWJlcn0+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgdGhpcy51cmwgKyBgL2FwaS9jdXN0b21lci9iYWxhbmNlcy8ke21lcmNoYW50SWR9YCxcbiAgICAgIHtcbiAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICd4LWNvaW5mbG93LWF1dGgtd2FsbGV0JzogcHVibGljS2V5LFxuICAgICAgICAgICd4LWNvaW5mbG93LWF1dGgtYmxvY2tjaGFpbic6IGJsb2NrY2hhaW4sXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgKTtcbiAgICBjb25zdCB7Y3JlZGl0c30gPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgcmV0dXJuIGNyZWRpdHM7XG4gIH1cblxuICBzdGF0aWMgZ2V0Q29pbmZsb3dCYXNlVXJsKGVudj86IENvaW5mbG93RW52cyk6IHN0cmluZyB7XG4gICAgaWYgKCFlbnYgfHwgZW52ID09PSAncHJvZCcpIHJldHVybiAnaHR0cHM6Ly9jb2luZmxvdy5jYXNoJztcbiAgICBpZiAoZW52ID09PSAnbG9jYWwnKSByZXR1cm4gJ2h0dHA6Ly9sb2NhbGhvc3Q6MzAwMCc7XG5cbiAgICByZXR1cm4gYGh0dHBzOi8vJHtlbnZ9LmNvaW5mbG93LmNhc2hgO1xuICB9XG5cbiAgc3RhdGljIGdldENvaW5mbG93QXBpVXJsKGVudj86IENvaW5mbG93RW52cyk6IHN0cmluZyB7XG4gICAgaWYgKCFlbnYgfHwgZW52ID09PSAncHJvZCcpIHJldHVybiAnaHR0cHM6Ly9hcGkuY29pbmZsb3cuY2FzaCc7XG4gICAgaWYgKGVudiA9PT0gJ2xvY2FsJykgcmV0dXJuICdodHRwOi8vbG9jYWxob3N0OjUwMDAnO1xuXG4gICAgcmV0dXJuIGBodHRwczovL2FwaS0ke2Vudn0uY29pbmZsb3cuY2FzaGA7XG4gIH1cblxuICBzdGF0aWMgZ2V0Q29pbmZsb3dVcmwoe1xuICAgIHdhbGxldFB1YmtleSxcbiAgICBzZXNzaW9uS2V5LFxuICAgIHJvdXRlLFxuICAgIHJvdXRlUHJlZml4LFxuICAgIGVudixcbiAgICBhbW91bnQsXG4gICAgdHJhbnNhY3Rpb24sXG4gICAgYmxvY2tjaGFpbiA9ICdzb2xhbmEnLFxuICAgIHdlYmhvb2tJbmZvLFxuICAgIGVtYWlsLFxuICAgIGxvYWRlckJhY2tncm91bmQsXG4gICAgaGFuZGxlSGVpZ2h0Q2hhbmdlLFxuICAgIGJhbmtBY2NvdW50TGlua1JlZGlyZWN0LFxuICAgIGFkZGl0aW9uYWxXYWxsZXRzLFxuICAgIG5lYXJEZXBvc2l0LFxuICAgIGNoYXJnZWJhY2tQcm90ZWN0aW9uRGF0YSxcbiAgICBtZXJjaGFudENzcyxcbiAgICBjb2xvcixcbiAgICByZW50LFxuICAgIGxvY2tEZWZhdWx0VG9rZW4sXG4gICAgdG9rZW4sXG4gICAgdG9rZW5zLFxuICAgIHBsYW5Db2RlLFxuICAgIGRpc2FibGVBcHBsZVBheSxcbiAgICBkaXNhYmxlR29vZ2xlUGF5LFxuICAgIGN1c3RvbWVySW5mbyxcbiAgICBzZXR0bGVtZW50VHlwZSxcbiAgICBsb2NrQW1vdW50LFxuICAgIG5hdGl2ZVNvbFRvQ29udmVydCxcbiAgICB0aGVtZSxcbiAgICB1c2VQZXJtaXQsXG4gICAgdHJhbnNhY3Rpb25TaWduZXIsXG4gICAgYXV0aE9ubHksXG4gICAgZGV2aWNlSWQsXG4gICAgand0VG9rZW4sXG4gICAgb3JpZ2lucyxcbiAgICB0aHJlZURzQ2hhbGxlbmdlUHJlZmVyZW5jZSxcbiAgICBzdXBwb3J0RW1haWwsXG4gIH06IENvaW5mbG93SUZyYW1lUHJvcHMpOiBzdHJpbmcge1xuICAgIGNvbnN0IHByZWZpeCA9IHJvdXRlUHJlZml4XG4gICAgICA/IGAvJHtyb3V0ZVByZWZpeH0vJHtibG9ja2NoYWlufWBcbiAgICAgIDogYC8ke2Jsb2NrY2hhaW59YDtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHByZWZpeCArIHJvdXRlLCBDb2luZmxvd1V0aWxzLmdldENvaW5mbG93QmFzZVVybChlbnYpKTtcblxuICAgIGlmICh3YWxsZXRQdWJrZXkpIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKCdwdWJrZXknLCB3YWxsZXRQdWJrZXkpO1xuICAgIGlmIChzZXNzaW9uS2V5KSB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgnc2Vzc2lvbktleScsIHNlc3Npb25LZXkpO1xuXG4gICAgaWYgKHRyYW5zYWN0aW9uKSB7XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgndHJhbnNhY3Rpb24nLCB0cmFuc2FjdGlvbik7XG4gICAgfVxuICAgIGlmIChhbW91bnQpIHtcbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKCdhbW91bnQnLCBhbW91bnQudG9TdHJpbmcoKSk7XG4gICAgfVxuXG4gICAgaWYgKHdlYmhvb2tJbmZvKSB7XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcbiAgICAgICAgJ3dlYmhvb2tJbmZvJyxcbiAgICAgICAgTFpTdHJpbmcuY29tcHJlc3NUb0VuY29kZWRVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkod2ViaG9va0luZm8pKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodGhlbWUpIHtcbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFxuICAgICAgICAndGhlbWUnLFxuICAgICAgICBMWlN0cmluZy5jb21wcmVzc1RvRW5jb2RlZFVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh0aGVtZSkpXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChjdXN0b21lckluZm8pIHtcbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFxuICAgICAgICAnY3VzdG9tZXJJbmZvJyxcbiAgICAgICAgTFpTdHJpbmcuY29tcHJlc3NUb0VuY29kZWRVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoY3VzdG9tZXJJbmZvKSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGVtYWlsKSB7XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgnZW1haWwnLCBlbWFpbCk7XG4gICAgfVxuICAgIGlmIChzdXBwb3J0RW1haWwpIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKCdzdXBwb3J0RW1haWwnLCBzdXBwb3J0RW1haWwpO1xuXG4gICAgaWYgKHRva2VuKSB7XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgndG9rZW4nLCB0b2tlbi50b1N0cmluZygpKTtcbiAgICB9XG5cbiAgICBpZiAodG9rZW5zKSB7XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgndG9rZW5zJywgdG9rZW5zLnRvU3RyaW5nKCkpO1xuICAgIH1cblxuICAgIGlmIChsb2FkZXJCYWNrZ3JvdW5kKSB7XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgnbG9hZGVyQmFja2dyb3VuZCcsIGxvYWRlckJhY2tncm91bmQpO1xuICAgIH1cblxuICAgIGlmIChoYW5kbGVIZWlnaHRDaGFuZ2UpIHtcbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKCd1c2VIZWlnaHRDaGFuZ2UnLCAndHJ1ZScpO1xuICAgIH1cblxuICAgIGlmIChiYW5rQWNjb3VudExpbmtSZWRpcmVjdCkge1xuICAgICAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXG4gICAgICAgICdiYW5rQWNjb3VudExpbmtSZWRpcmVjdCcsXG4gICAgICAgIGJhbmtBY2NvdW50TGlua1JlZGlyZWN0XG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChhZGRpdGlvbmFsV2FsbGV0cylcbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFxuICAgICAgICAnYWRkaXRpb25hbFdhbGxldHMnLFxuICAgICAgICBMWlN0cmluZy5jb21wcmVzc1RvRW5jb2RlZFVSSUNvbXBvbmVudChcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeShhZGRpdGlvbmFsV2FsbGV0cylcbiAgICAgICAgKVxuICAgICAgKTtcblxuICAgIGlmIChuZWFyRGVwb3NpdCkgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoJ25lYXJEZXBvc2l0JywgbmVhckRlcG9zaXQpO1xuXG4gICAgaWYgKGNoYXJnZWJhY2tQcm90ZWN0aW9uRGF0YSlcbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFxuICAgICAgICAnY2hhcmdlYmFja1Byb3RlY3Rpb25EYXRhJyxcbiAgICAgICAgTFpTdHJpbmcuY29tcHJlc3NUb0VuY29kZWRVUklDb21wb25lbnQoXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoY2hhcmdlYmFja1Byb3RlY3Rpb25EYXRhKVxuICAgICAgICApXG4gICAgICApO1xuICAgIGlmIChkZXZpY2VJZCkge1xuICAgICAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoJ2RldmljZUlkJywgZGV2aWNlSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGNvbnN0IGRldmljZUlkID0gd2luZG93Py5uU3VyZVNESz8uZ2V0RGV2aWNlSWQoKTtcbiAgICAgICAgaWYgKGRldmljZUlkKSB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgnZGV2aWNlSWQnLCBkZXZpY2VJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1lcmNoYW50Q3NzKSB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgnbWVyY2hhbnRDc3MnLCBtZXJjaGFudENzcyk7XG4gICAgaWYgKGNvbG9yKSB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgnY29sb3InLCBjb2xvcik7XG4gICAgaWYgKHJlbnQpIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKCdyZW50JywgcmVudC5sYW1wb3J0cy50b1N0cmluZygpKTtcbiAgICBpZiAobmF0aXZlU29sVG9Db252ZXJ0KVxuICAgICAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXG4gICAgICAgICduYXRpdmVTb2xUb0NvbnZlcnQnLFxuICAgICAgICBuYXRpdmVTb2xUb0NvbnZlcnQubGFtcG9ydHMudG9TdHJpbmcoKVxuICAgICAgKTtcbiAgICBpZiAobG9ja0RlZmF1bHRUb2tlbikgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoJ2xvY2tEZWZhdWx0VG9rZW4nLCAndHJ1ZScpO1xuICAgIGlmIChwbGFuQ29kZSkgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoJ3BsYW5Db2RlJywgcGxhbkNvZGUpO1xuXG4gICAgaWYgKGRpc2FibGVBcHBsZVBheSkgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoJ2Rpc2FibGVBcHBsZVBheScsICd0cnVlJyk7XG4gICAgaWYgKGRpc2FibGVHb29nbGVQYXkpIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKCdkaXNhYmxlR29vZ2xlUGF5JywgJ3RydWUnKTtcbiAgICBpZiAoc2V0dGxlbWVudFR5cGUpXG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgnc2V0dGxlbWVudFR5cGUnLCBzZXR0bGVtZW50VHlwZSk7XG5cbiAgICBpZiAobG9ja0Ftb3VudCkgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoJ2xvY2tBbW91bnQnLCAndHJ1ZScpO1xuXG4gICAgaWYgKHVzZVBlcm1pdCA9PT0gZmFsc2UpIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKCd1c2VQZXJtaXQnLCAnZmFsc2UnKTtcbiAgICBpZiAodHJhbnNhY3Rpb25TaWduZXIpXG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgndHJhbnNhY3Rpb25TaWduZXInLCB0cmFuc2FjdGlvblNpZ25lcik7XG4gICAgaWYgKGF1dGhPbmx5ID09PSB0cnVlKSB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgnYXV0aE9ubHknLCAndHJ1ZScpO1xuICAgIGlmIChqd3RUb2tlbikgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoJ2p3dFRva2VuJywgand0VG9rZW4pO1xuICAgIGlmIChvcmlnaW5zKVxuICAgICAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXG4gICAgICAgICdvcmlnaW5zJyxcbiAgICAgICAgTFpTdHJpbmcuY29tcHJlc3NUb0VuY29kZWRVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkob3JpZ2lucykpXG4gICAgICApO1xuXG4gICAgaWYgKHRocmVlRHNDaGFsbGVuZ2VQcmVmZXJlbmNlKVxuICAgICAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXG4gICAgICAgICd0aHJlZURzQ2hhbGxlbmdlUHJlZmVyZW5jZScsXG4gICAgICAgIHRocmVlRHNDaGFsbGVuZ2VQcmVmZXJlbmNlXG4gICAgICApO1xuXG4gICAgcmV0dXJuIHVybC50b1N0cmluZygpO1xuICB9XG5cbiAgc3RhdGljIGdldFRyYW5zYWN0aW9uKHByb3BzOiBDb2luZmxvd1B1cmNoYXNlUHJvcHMpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghcHJvcHMuYmxvY2tjaGFpbikgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIHJldHVybiB0aGlzLmJ5QmxvY2tjaGFpbjwoKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQ+KHByb3BzLmJsb2NrY2hhaW4sIHtcbiAgICAgIHNvbGFuYTogKCkgPT4ge1xuICAgICAgICBpZiAoISgndHJhbnNhY3Rpb24nIGluIHByb3BzKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3Qge3RyYW5zYWN0aW9ufSA9IHByb3BzO1xuICAgICAgICBpZiAoIXdlYjMpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdAc29sYW5hL3dlYjMuanMgZGVwZW5kZW5jeSBpcyByZXF1aXJlZCBmb3IgU29sYW5hJyk7XG4gICAgICAgIGlmICghYmFzZTU4KSB0aHJvdyBuZXcgRXJyb3IoJ2JzNTggZGVwZW5kZW5jeSBpcyByZXF1aXJlZCBmb3IgU29sYW5hJyk7XG4gICAgICAgIGlmICghdHJhbnNhY3Rpb24pIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBiYXNlNTguZW5jb2RlKFxuICAgICAgICAgICh0cmFuc2FjdGlvbiBhcyBWZXJzaW9uZWRUcmFuc2FjdGlvbiB8IFRyYW5zYWN0aW9uKS5zZXJpYWxpemUoe1xuICAgICAgICAgICAgcmVxdWlyZUFsbFNpZ25hdHVyZXM6IGZhbHNlLFxuICAgICAgICAgICAgdmVyaWZ5U2lnbmF0dXJlczogZmFsc2UsXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBwb2x5Z29uOiAoKSA9PiB7XG4gICAgICAgIGlmICghKCd0cmFuc2FjdGlvbicgaW4gcHJvcHMpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCB7dHJhbnNhY3Rpb259ID0gcHJvcHM7XG4gICAgICAgIHJldHVybiBMWlN0cmluZy5jb21wcmVzc1RvRW5jb2RlZFVSSUNvbXBvbmVudChcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0cmFuc2FjdGlvbilcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBldGg6ICgpID0+IHtcbiAgICAgICAgaWYgKCEoJ3RyYW5zYWN0aW9uJyBpbiBwcm9wcykpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHt0cmFuc2FjdGlvbn0gPSBwcm9wcztcbiAgICAgICAgcmV0dXJuIExaU3RyaW5nLmNvbXByZXNzVG9FbmNvZGVkVVJJQ29tcG9uZW50KFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRyYW5zYWN0aW9uKVxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIGJhc2U6ICgpID0+IHtcbiAgICAgICAgaWYgKCEoJ3RyYW5zYWN0aW9uJyBpbiBwcm9wcykpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHt0cmFuc2FjdGlvbn0gPSBwcm9wcztcbiAgICAgICAgcmV0dXJuIExaU3RyaW5nLmNvbXByZXNzVG9FbmNvZGVkVVJJQ29tcG9uZW50KFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRyYW5zYWN0aW9uKVxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIGFyYml0cnVtOiAoKSA9PiB7XG4gICAgICAgIGlmICghKCd0cmFuc2FjdGlvbicgaW4gcHJvcHMpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCB7dHJhbnNhY3Rpb259ID0gcHJvcHM7XG4gICAgICAgIHJldHVybiBMWlN0cmluZy5jb21wcmVzc1RvRW5jb2RlZFVSSUNvbXBvbmVudChcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0cmFuc2FjdGlvbilcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBuZWFyOiAoKSA9PiB7XG4gICAgICAgIGlmICghKCdhY3Rpb24nIGluIHByb3BzKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3Qge2FjdGlvbn0gPSBwcm9wcztcbiAgICAgICAgcmV0dXJuIExaU3RyaW5nLmNvbXByZXNzVG9FbmNvZGVkVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KGFjdGlvbikpO1xuICAgICAgfSxcbiAgICAgIHVzZXI6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0sXG4gICAgfSkoKTtcbiAgfVxuXG4gIHN0YXRpYyBieUJsb2NrY2hhaW48VD4oXG4gICAgYmxvY2tjaGFpbjogQ29pbmZsb3dCbG9ja2NoYWluLFxuICAgIGFyZ3M6IHtcbiAgICAgIHNvbGFuYTogVDtcbiAgICAgIG5lYXI6IFQ7XG4gICAgICBldGg6IFQ7XG4gICAgICBwb2x5Z29uOiBUO1xuICAgICAgYmFzZTogVDtcbiAgICAgIGFyYml0cnVtOiBUO1xuICAgICAgdXNlcjogVDtcbiAgICB9XG4gICk6IFQge1xuICAgIHN3aXRjaCAoYmxvY2tjaGFpbikge1xuICAgICAgY2FzZSAnc29sYW5hJzpcbiAgICAgICAgcmV0dXJuIGFyZ3Muc29sYW5hO1xuICAgICAgY2FzZSAnbmVhcic6XG4gICAgICAgIHJldHVybiBhcmdzLm5lYXI7XG4gICAgICBjYXNlICdwb2x5Z29uJzpcbiAgICAgICAgcmV0dXJuIGFyZ3MucG9seWdvbjtcbiAgICAgIGNhc2UgJ2V0aCc6XG4gICAgICAgIHJldHVybiBhcmdzLmV0aDtcbiAgICAgIGNhc2UgJ2Jhc2UnOlxuICAgICAgICByZXR1cm4gYXJncy5iYXNlO1xuICAgICAgY2FzZSAnYXJiaXRydW0nOlxuICAgICAgICByZXR1cm4gYXJncy5hcmJpdHJ1bTtcbiAgICAgIGNhc2UgJ3VzZXInOlxuICAgICAgICByZXR1cm4gYXJncy51c2VyO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdibG9ja2NoYWluIG5vdCBzdXBwb3J0ZWQhJyk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGFzeW5jIGdldFdhbGxldEZyb21Vc2VySWQoe1xuICAgIHVzZXJJZCxcbiAgICBtZXJjaGFudElkLFxuICAgIGVudixcbiAgfToge1xuICAgIHVzZXJJZDogc3RyaW5nO1xuICAgIG1lcmNoYW50SWQ6IHN0cmluZztcbiAgICBlbnY6IENvaW5mbG93RW52cztcbiAgfSk6IFByb21pc2U8U29sYW5hV2FsbGV0PiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0V2FsbGV0RnJvbUVtYWlsKHtcbiAgICAgIGVtYWlsOiB1c2VySWQsXG4gICAgICBtZXJjaGFudElkLFxuICAgICAgZW52LFxuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIGFzeW5jIGdldFdhbGxldEZyb21FbWFpbCh7XG4gICAgZW1haWwsXG4gICAgbWVyY2hhbnRJZCxcbiAgICBlbnYsXG4gIH06IHtcbiAgICBlbWFpbDogc3RyaW5nO1xuICAgIG1lcmNoYW50SWQ6IHN0cmluZztcbiAgICBlbnY6IENvaW5mbG93RW52cztcbiAgfSk6IFByb21pc2U8U29sYW5hV2FsbGV0PiB7XG4gICAgY29uc3QgYnVmZmVyID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGVtYWlsKTtcbiAgICBjb25zdCBjcnlwdG8gPSB3aW5kb3cuY3J5cHRvLnN1YnRsZTtcbiAgICBjb25zdCBoYXNoID0gYXdhaXQgY3J5cHRvLmRpZ2VzdCgnU0hBLTI1NicsIGJ1ZmZlcik7XG4gICAgY29uc3Qgc2VlZCA9IG5ldyBVaW50OEFycmF5KGhhc2gpO1xuICAgIGNvbnN0IGtleXBhaXIgPSBLZXlwYWlyLmZyb21TZWVkKHNlZWQpO1xuICAgIHJldHVybiB7XG4gICAgICBwdWJsaWNLZXk6IGtleXBhaXIucHVibGljS2V5LFxuICAgICAgc2lnbk1lc3NhZ2U6IChtZXNzYWdlOiBVaW50OEFycmF5KSA9PlxuICAgICAgICBQcm9taXNlLnJlc29sdmUoc2lnbi5kZXRhY2hlZChtZXNzYWdlLCBrZXlwYWlyLnNlY3JldEtleSkpLFxuICAgICAgc2lnblRyYW5zYWN0aW9uOiBhc3luYyA8VCBleHRlbmRzIFRyYW5zYWN0aW9uIHwgVmVyc2lvbmVkVHJhbnNhY3Rpb24+KFxuICAgICAgICB0cmFuc2FjdGlvbjogVFxuICAgICAgKTogUHJvbWlzZTxUPiA9PiB7XG4gICAgICAgIGlmICh0cmFuc2FjdGlvbiBpbnN0YW5jZW9mIFRyYW5zYWN0aW9uKSB7XG4gICAgICAgICAgdHJhbnNhY3Rpb24uc2lnbihrZXlwYWlyKTtcbiAgICAgICAgICByZXR1cm4gdHJhbnNhY3Rpb247XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHJhbnNhY3Rpb24uc2lnbihba2V5cGFpcl0pO1xuICAgICAgICAgIHJldHVybiB0cmFuc2FjdGlvbjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNlbmRUcmFuc2FjdGlvbjogYXN5bmMgPFQgZXh0ZW5kcyBUcmFuc2FjdGlvbiB8IFZlcnNpb25lZFRyYW5zYWN0aW9uPihcbiAgICAgICAgdHJhbnNhY3Rpb246IFRcbiAgICAgICk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gICAgICAgIGlmICh0cmFuc2FjdGlvbiBpbnN0YW5jZW9mIFRyYW5zYWN0aW9uKSB7XG4gICAgICAgICAgdHJhbnNhY3Rpb24uc2lnbihrZXlwYWlyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0cmFuc2FjdGlvbi5zaWduKFtrZXlwYWlyXSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb2luZmxvd0Jhc2VVcmwgPSB0aGlzLmdldENvaW5mbG93QXBpVXJsKGVudik7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICd4LWNvaW5mbG93LWF1dGgtd2FsbGV0Jzoga2V5cGFpci5wdWJsaWNLZXkudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICd4LWNvaW5mbG93LWF1dGgtYmxvY2tjaGFpbic6ICdzb2xhbmEnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgbWVyY2hhbnRJZCxcbiAgICAgICAgICAgIHNpZ25lZFRyYW5zYWN0aW9uOiBiYXNlNTg/LmVuY29kZSh0cmFuc2FjdGlvbi5zZXJpYWxpemUoKSksXG4gICAgICAgICAgfSksXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3Qge3NpZ25hdHVyZX0gPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICBjb2luZmxvd0Jhc2VVcmwgKyAnL2FwaS91dGlscy9zZW5kLWNvaW5mbG93LXR4JyxcbiAgICAgICAgICBvcHRpb25zXG4gICAgICAgICkudGhlbihyZXMgPT4gcmVzLmpzb24oKSk7XG4gICAgICAgIHJldHVybiBzaWduYXR1cmU7XG4gICAgICB9LFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
209
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29pbmZsb3dVdGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvaW5mbG93bGFicy9zcmMvbGliL2NvbW1vbi9Db2luZmxvd1V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU1BLE9BQU8sRUFBQyxJQUFJLEVBQUUsTUFBTSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDOUMsT0FBTyxRQUFRLE1BQU0sV0FBVyxDQUFDO0FBR2pDLE1BQU0sT0FBTyxhQUFhO0lBSXhCLFlBQVksR0FBa0I7UUFDNUIsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksTUFBTSxDQUFDO1FBQ3pCLElBQUksSUFBSSxDQUFDLEdBQUcsS0FBSyxNQUFNO1lBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRywyQkFBMkIsQ0FBQzthQUMzRCxJQUFJLElBQUksQ0FBQyxHQUFHLEtBQUssT0FBTztZQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsdUJBQXVCLENBQUM7O1lBQzdELElBQUksQ0FBQyxHQUFHLEdBQUcsZUFBZSxJQUFJLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQztJQUMxRCxDQUFDO0lBRUQsS0FBSyxDQUFDLGlCQUFpQixDQUFDLFVBQWtCO1FBQ3hDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsa0JBQWtCLFVBQVUsRUFBRSxDQUFDO2FBQ3BELElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQzthQUNqQyxJQUFJLENBQ0gsQ0FBQyxJQUdBLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsY0FBYyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQ2hFO2FBQ0EsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ1QsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqQixPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDLENBQUMs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QUFHLEtBQUssQ0FBQztnQkFDdkIsT0FBTyxRQUFRLENBQUMsNkJBQTZCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ3hFLENBQUM7WUFDRCxJQUFJLEVBQUUsR0FBRyxFQUFFO2dCQUNULE9BQU8sU0FBUyxDQUFDO1lBQ25CLENBQUM7U0FDRixDQUFDLEVBQUUsQ0FBQztJQUNQLENBQUM7SUFFRCxNQUFNLENBQUMsWUFBWSxDQUNqQixVQUE4QixFQUM5QixJQVFDO1FBRUQsUUFBUSxVQUFVLEVBQUUsQ0FBQztZQUNuQixLQUFLLFFBQVE7Z0JBQ1gsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ3JCLEtBQUssTUFBTTtnQkFDVCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDbkIsS0FBSyxTQUFTO2dCQUNaLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUN0QixLQUFLLEtBQUs7Z0JBQ1IsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDO1lBQ2xCLEtBQUssTUFBTTtnQkFDVCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDbkIsS0FBSyxVQUFVO2dCQUNiLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUN2QixLQUFLLE1BQU07Z0JBQ1QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ25CO2dCQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsMkJBQTJCLENBQUMsQ0FBQztRQUNqRCxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29pbmZsb3dCbG9ja2NoYWluLFxuICBDb2luZmxvd0VudnMsXG4gIENvaW5mbG93SUZyYW1lUHJvcHMsXG4gIENvaW5mbG93UHVyY2hhc2VQcm9wcyxcbn0gZnJvbSAnLi9Db2luZmxvd1R5cGVzJztcbmltcG9ydCB7d2ViMywgYmFzZTU4fSBmcm9tICcuL1NvbGFuYVBlZXJEZXBzJztcbmltcG9ydCBMWlN0cmluZyBmcm9tICdsei1zdHJpbmcnO1xuaW1wb3J0IHR5cGUge1RyYW5zYWN0aW9uLCBWZXJzaW9uZWRUcmFuc2FjdGlvbn0gZnJvbSAnQHNvbGFuYS93ZWIzLmpzJztcblxuZXhwb3J0IGNsYXNzIENvaW5mbG93VXRpbHMge1xuICBlbnY6IENvaW5mbG93RW52cztcbiAgdXJsOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoZW52PzogQ29pbmZsb3dFbnZzKSB7XG4gICAgdGhpcy5lbnYgPSBlbnYgPz8gJ3Byb2QnO1xuICAgIGlmICh0aGlzLmVudiA9PT0gJ3Byb2QnKSB0aGlzLnVybCA9ICdodHRwczovL2FwaS5jb2luZmxvdy5jYXNoJztcbiAgICBlbHNlIGlmICh0aGlzLmVudiA9PT0gJ2xvY2FsJykgdGhpcy51cmwgPSAnaHR0cDovL2xvY2FsaG9zdDo1MDAwJztcbiAgICBlbHNlIHRoaXMudXJsID0gYGh0dHBzOi8vYXBpLSR7dGhpcy5lbnZ9LmNvaW5mbG93LmNhc2hgO1xuICB9XG5cbiAgYXN5bmMgZ2V0TlN1cmVQYXJ0bmVySWQobWVyY2hhbnRJZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gZmV0Y2godGhpcy51cmwgKyBgL21lcmNoYW50L3ZpZXcvJHttZXJjaGFudElkfWApXG4gICAgICAudGhlbihyZXNwb25zZSA9PiByZXNwb25zZS5qc29uKCkpXG4gICAgICAudGhlbihcbiAgICAgICAgKGpzb246IHtcbiAgICAgICAgICBuU3VyZVBhcnRuZXJJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAgIG5TdXJlU2V0dGluZ3M6IHtuU3VyZVBhcnRuZXJJZDogc3RyaW5nIHwgdW5kZWZpbmVkfTtcbiAgICAgICAgfSkgPT4ganNvbi5uU3VyZVNldHRpbmdzPy5uU3VyZVBhcnRuZXJJZCB8fCBqc29uLm5TdXJlUGFydG5lcklkXG4gICAgICApXG4gICAgICAuY2F0Y2goZSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRDb2luZmxvd0Jhc2VVcmwoZW52PzogQ29pbmZsb3dFbnZzKTogc3RyaW5nIHtcbiAgICBpZiAoIWVudiB8fCBlbnYgPT09ICdwcm9kJykgcmV0dXJuICdodHRwczovL2NvaW5mbG93LmNhc2gnO1xuICAgIGlmIChlbnYgPT09ICdsb2NhbCcpIHJldHVybiAnaHR0cDovL2xvY2FsaG9zdDozMDAwJztcblxuICAgIHJldHVybiBgaHR0cHM6Ly8ke2Vudn0uY29pbmZsb3cuY2FzaGA7XG4gIH1cblxuICBzdGF0aWMgZ2V0Q29pbmZsb3dBcGlVcmwoZW52PzogQ29pbmZsb3dFbnZzKTogc3RyaW5nIHtcbiAgICBpZiAoIWVudiB8fCBlbnYgPT09ICdwcm9kJykgcmV0dXJuICdodHRwczovL2FwaS5jb2luZmxvdy5jYXNoJztcbiAgICBpZiAoZW52ID09PSAnbG9jYWwnKSByZXR1cm4gJ2h0dHA6Ly9sb2NhbGhvc3Q6NTAwMCc7XG5cbiAgICByZXR1cm4gYGh0dHBzOi8vYXBpLSR7ZW52fS5jb2luZmxvdy5jYXNoYDtcbiAgfVxuXG4gIHN0YXRpYyBnZXRDb2luZmxvd1VybCh7XG4gICAgd2FsbGV0UHVia2V5LFxuICAgIHNlc3Npb25LZXksXG4gICAgcm91dGUsXG4gICAgcm91dGVQcmVmaXgsXG4gICAgZW52LFxuICAgIGFtb3VudCxcbiAgICB0cmFuc2FjdGlvbixcbiAgICBibG9ja2NoYWluID0gJ3NvbGFuYScsXG4gICAgd2ViaG9va0luZm8sXG4gICAgZW1haWwsXG4gICAgbG9hZGVyQmFja2dyb3VuZCxcbiAgICBoYW5kbGVIZWlnaHRDaGFuZ2UsXG4gICAgYmFua0FjY291bnRMaW5rUmVkaXJlY3QsXG4gICAgYWRkaXRpb25hbFdhbGxldHMsXG4gICAgbmVhckRlcG9zaXQsXG4gICAgY2hhcmdlYmFja1Byb3RlY3Rpb25EYXRhLFxuICAgIG1lcmNoYW50Q3NzLFxuICAgIGNvbG9yLFxuICAgIHJlbnQsXG4gICAgbG9ja0RlZmF1bHRUb2tlbixcbiAgICB0b2tlbixcbiAgICB0b2tlbnMsXG4gICAgcGxhbkNvZGUsXG4gICAgZGlzYWJsZUFwcGxlUGF5LFxuICAgIGRpc2FibGVHb29nbGVQYXksXG4gICAgY3VzdG9tZXJJbmZvLFxuICAgIHNldHRsZW1lbnRUeXBlLFxuICAgIGxvY2tBbW91bnQsXG4gICAgbmF0aXZlU29sVG9Db252ZXJ0LFxuICAgIHRoZW1lLFxuICAgIHVzZVBlcm1pdCxcbiAgICB0cmFuc2FjdGlvblNpZ25lcixcbiAgICBhdXRoT25seSxcbiAgICBkZXZpY2VJZCxcbiAgICBqd3RUb2tlbixcbiAgICBvcmlnaW5zLFxuICAgIHRocmVlRHNDaGFsbGVuZ2VQcmVmZXJlbmNlLFxuICAgIHN1cHBvcnRFbWFpbCxcbiAgICBkZXN0aW5hdGlvbkF1dGhLZXksXG4gIH06IENvaW5mbG93SUZyYW1lUHJvcHMpOiBzdHJpbmcge1xuICAgIGNvbnN0IHByZWZpeCA9IHJvdXRlUHJlZml4XG4gICAgICA/IGAvJHtyb3V0ZVByZWZpeH0vJHtibG9ja2NoYWlufWBcbiAgICAgIDogYC8ke2Jsb2NrY2hhaW59YDtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHByZWZpeCArIHJvdXRlLCBDb2luZmxvd1V0aWxzLmdldENvaW5mbG93QmFzZVVybChlbnYpKTtcblxuICAgIGlmICh3YWxsZXRQdWJrZXkpIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKCdwdWJrZXknLCB3YWxsZXRQdWJrZXkpO1xuICAgIGlmIChzZXNzaW9uS2V5KSB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgnc2Vzc2lvbktleScsIHNlc3Npb25LZXkpO1xuXG4gICAgaWYgKHRyYW5zYWN0aW9uKSB7XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgndHJhbnNhY3Rpb24nLCB0cmFuc2FjdGlvbik7XG4gICAgfVxuICAgIGlmIChhbW91bnQpIHtcbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKCdhbW91bnQnLCBhbW91bnQudG9TdHJpbmcoKSk7XG4gICAgfVxuXG4gICAgaWYgKHdlYmhvb2tJbmZvKSB7XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZChcbiAgICAgICAgJ3dlYmhvb2tJbmZvJyxcbiAgICAgICAgTFpTdHJpbmcuY29tcHJlc3NUb0VuY29kZWRVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkod2ViaG9va0luZm8pKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodGhlbWUpIHtcbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFxuICAgICAgICAndGhlbWUnLFxuICAgICAgICBMWlN0cmluZy5jb21wcmVzc1RvRW5jb2RlZFVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh0aGVtZSkpXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChjdXN0b21lckluZm8pIHtcbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFxuICAgICAgICAnY3VzdG9tZXJJbmZvJyxcbiAgICAgICAgTFpTdHJpbmcuY29tcHJlc3NUb0VuY29kZWRVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoY3VzdG9tZXJJbmZvKSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGVtYWlsKSB7XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgnZW1haWwnLCBlbWFpbCk7XG4gICAgfVxuICAgIGlmIChzdXBwb3J0RW1haWwpIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKCdzdXBwb3J0RW1haWwnLCBzdXBwb3J0RW1haWwpO1xuXG4gICAgaWYgKHRva2VuKSB7XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgndG9rZW4nLCB0b2tlbi50b1N0cmluZygpKTtcbiAgICB9XG5cbiAgICBpZiAodG9rZW5zKSB7XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgndG9rZW5zJywgdG9rZW5zLnRvU3RyaW5nKCkpO1xuICAgIH1cblxuICAgIGlmIChsb2FkZXJCYWNrZ3JvdW5kKSB7XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgnbG9hZGVyQmFja2dyb3VuZCcsIGxvYWRlckJhY2tncm91bmQpO1xuICAgIH1cblxuICAgIGlmIChoYW5kbGVIZWlnaHRDaGFuZ2UpIHtcbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKCd1c2VIZWlnaHRDaGFuZ2UnLCAndHJ1ZScpO1xuICAgIH1cblxuICAgIGlmIChiYW5rQWNjb3VudExpbmtSZWRpcmVjdCkge1xuICAgICAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXG4gICAgICAgICdiYW5rQWNjb3VudExpbmtSZWRpcmVjdCcsXG4gICAgICAgIGJhbmtBY2NvdW50TGlua1JlZGlyZWN0XG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChhZGRpdGlvbmFsV2FsbGV0cylcbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFxuICAgICAgICAnYWRkaXRpb25hbFdhbGxldHMnLFxuICAgICAgICBMWlN0cmluZy5jb21wcmVzc1RvRW5jb2RlZFVSSUNvbXBvbmVudChcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeShhZGRpdGlvbmFsV2FsbGV0cylcbiAgICAgICAgKVxuICAgICAgKTtcblxuICAgIGlmIChuZWFyRGVwb3NpdCkgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoJ25lYXJEZXBvc2l0JywgbmVhckRlcG9zaXQpO1xuXG4gICAgaWYgKGNoYXJnZWJhY2tQcm90ZWN0aW9uRGF0YSlcbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKFxuICAgICAgICAnY2hhcmdlYmFja1Byb3RlY3Rpb25EYXRhJyxcbiAgICAgICAgTFpTdHJpbmcuY29tcHJlc3NUb0VuY29kZWRVUklDb21wb25lbnQoXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoY2hhcmdlYmFja1Byb3RlY3Rpb25EYXRhKVxuICAgICAgICApXG4gICAgICApO1xuICAgIGlmIChkZXZpY2VJZCkge1xuICAgICAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoJ2RldmljZUlkJywgZGV2aWNlSWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGNvbnN0IGRldmljZUlkID0gd2luZG93Py5uU3VyZVNESz8uZ2V0RGV2aWNlSWQoKTtcbiAgICAgICAgaWYgKGRldmljZUlkKSB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgnZGV2aWNlSWQnLCBkZXZpY2VJZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1lcmNoYW50Q3NzKSB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgnbWVyY2hhbnRDc3MnLCBtZXJjaGFudENzcyk7XG4gICAgaWYgKGNvbG9yKSB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgnY29sb3InLCBjb2xvcik7XG4gICAgaWYgKHJlbnQpIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKCdyZW50JywgcmVudC5sYW1wb3J0cy50b1N0cmluZygpKTtcbiAgICBpZiAobmF0aXZlU29sVG9Db252ZXJ0KVxuICAgICAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXG4gICAgICAgICduYXRpdmVTb2xUb0NvbnZlcnQnLFxuICAgICAgICBuYXRpdmVTb2xUb0NvbnZlcnQubGFtcG9ydHMudG9TdHJpbmcoKVxuICAgICAgKTtcbiAgICBpZiAobG9ja0RlZmF1bHRUb2tlbikgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoJ2xvY2tEZWZhdWx0VG9rZW4nLCAndHJ1ZScpO1xuICAgIGlmIChwbGFuQ29kZSkgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoJ3BsYW5Db2RlJywgcGxhbkNvZGUpO1xuXG4gICAgaWYgKGRpc2FibGVBcHBsZVBheSkgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoJ2Rpc2FibGVBcHBsZVBheScsICd0cnVlJyk7XG4gICAgaWYgKGRpc2FibGVHb29nbGVQYXkpIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKCdkaXNhYmxlR29vZ2xlUGF5JywgJ3RydWUnKTtcbiAgICBpZiAoc2V0dGxlbWVudFR5cGUpXG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgnc2V0dGxlbWVudFR5cGUnLCBzZXR0bGVtZW50VHlwZSk7XG5cbiAgICBpZiAobG9ja0Ftb3VudCkgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoJ2xvY2tBbW91bnQnLCAndHJ1ZScpO1xuXG4gICAgaWYgKHVzZVBlcm1pdCA9PT0gZmFsc2UpIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKCd1c2VQZXJtaXQnLCAnZmFsc2UnKTtcbiAgICBpZiAodHJhbnNhY3Rpb25TaWduZXIpXG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgndHJhbnNhY3Rpb25TaWduZXInLCB0cmFuc2FjdGlvblNpZ25lcik7XG4gICAgaWYgKGF1dGhPbmx5ID09PSB0cnVlKSB1cmwuc2VhcmNoUGFyYW1zLmFwcGVuZCgnYXV0aE9ubHknLCAndHJ1ZScpO1xuICAgIGlmIChqd3RUb2tlbikgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoJ2p3dFRva2VuJywgand0VG9rZW4pO1xuICAgIGlmIChvcmlnaW5zKVxuICAgICAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXG4gICAgICAgICdvcmlnaW5zJyxcbiAgICAgICAgTFpTdHJpbmcuY29tcHJlc3NUb0VuY29kZWRVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkob3JpZ2lucykpXG4gICAgICApO1xuXG4gICAgaWYgKHRocmVlRHNDaGFsbGVuZ2VQcmVmZXJlbmNlKVxuICAgICAgdXJsLnNlYXJjaFBhcmFtcy5hcHBlbmQoXG4gICAgICAgICd0aHJlZURzQ2hhbGxlbmdlUHJlZmVyZW5jZScsXG4gICAgICAgIHRocmVlRHNDaGFsbGVuZ2VQcmVmZXJlbmNlXG4gICAgICApO1xuXG4gICAgaWYgKGRlc3RpbmF0aW9uQXV0aEtleSlcbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKCdkZXN0aW5hdGlvbkF1dGhLZXknLCBkZXN0aW5hdGlvbkF1dGhLZXkpO1xuXG4gICAgcmV0dXJuIHVybC50b1N0cmluZygpO1xuICB9XG5cbiAgc3RhdGljIGdldFRyYW5zYWN0aW9uKHByb3BzOiBDb2luZmxvd1B1cmNoYXNlUHJvcHMpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghcHJvcHMuYmxvY2tjaGFpbikgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIHJldHVybiB0aGlzLmJ5QmxvY2tjaGFpbjwoKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQ+KHByb3BzLmJsb2NrY2hhaW4sIHtcbiAgICAgIHNvbGFuYTogKCkgPT4ge1xuICAgICAgICBpZiAoISgndHJhbnNhY3Rpb24nIGluIHByb3BzKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3Qge3RyYW5zYWN0aW9ufSA9IHByb3BzO1xuICAgICAgICBpZiAoIXdlYjMpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdAc29sYW5hL3dlYjMuanMgZGVwZW5kZW5jeSBpcyByZXF1aXJlZCBmb3IgU29sYW5hJyk7XG4gICAgICAgIGlmICghYmFzZTU4KSB0aHJvdyBuZXcgRXJyb3IoJ2JzNTggZGVwZW5kZW5jeSBpcyByZXF1aXJlZCBmb3IgU29sYW5hJyk7XG4gICAgICAgIGlmICghdHJhbnNhY3Rpb24pIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBiYXNlNTguZW5jb2RlKFxuICAgICAgICAgICh0cmFuc2FjdGlvbiBhcyBWZXJzaW9uZWRUcmFuc2FjdGlvbiB8IFRyYW5zYWN0aW9uKS5zZXJpYWxpemUoe1xuICAgICAgICAgICAgcmVxdWlyZUFsbFNpZ25hdHVyZXM6IGZhbHNlLFxuICAgICAgICAgICAgdmVyaWZ5U2lnbmF0dXJlczogZmFsc2UsXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBwb2x5Z29uOiAoKSA9PiB7XG4gICAgICAgIGlmICghKCd0cmFuc2FjdGlvbicgaW4gcHJvcHMpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCB7dHJhbnNhY3Rpb259ID0gcHJvcHM7XG4gICAgICAgIHJldHVybiBMWlN0cmluZy5jb21wcmVzc1RvRW5jb2RlZFVSSUNvbXBvbmVudChcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0cmFuc2FjdGlvbilcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBldGg6ICgpID0+IHtcbiAgICAgICAgaWYgKCEoJ3RyYW5zYWN0aW9uJyBpbiBwcm9wcykpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHt0cmFuc2FjdGlvbn0gPSBwcm9wcztcbiAgICAgICAgcmV0dXJuIExaU3RyaW5nLmNvbXByZXNzVG9FbmNvZGVkVVJJQ29tcG9uZW50KFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRyYW5zYWN0aW9uKVxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIGJhc2U6ICgpID0+IHtcbiAgICAgICAgaWYgKCEoJ3RyYW5zYWN0aW9uJyBpbiBwcm9wcykpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHt0cmFuc2FjdGlvbn0gPSBwcm9wcztcbiAgICAgICAgcmV0dXJuIExaU3RyaW5nLmNvbXByZXNzVG9FbmNvZGVkVVJJQ29tcG9uZW50KFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRyYW5zYWN0aW9uKVxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIGFyYml0cnVtOiAoKSA9PiB7XG4gICAgICAgIGlmICghKCd0cmFuc2FjdGlvbicgaW4gcHJvcHMpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCB7dHJhbnNhY3Rpb259ID0gcHJvcHM7XG4gICAgICAgIHJldHVybiBMWlN0cmluZy5jb21wcmVzc1RvRW5jb2RlZFVSSUNvbXBvbmVudChcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh0cmFuc2FjdGlvbilcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBuZWFyOiAoKSA9PiB7XG4gICAgICAgIGlmICghKCdhY3Rpb24nIGluIHByb3BzKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3Qge2FjdGlvbn0gPSBwcm9wcztcbiAgICAgICAgcmV0dXJuIExaU3RyaW5nLmNvbXByZXNzVG9FbmNvZGVkVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KGFjdGlvbikpO1xuICAgICAgfSxcbiAgICAgIHVzZXI6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0sXG4gICAgfSkoKTtcbiAgfVxuXG4gIHN0YXRpYyBieUJsb2NrY2hhaW48VD4oXG4gICAgYmxvY2tjaGFpbjogQ29pbmZsb3dCbG9ja2NoYWluLFxuICAgIGFyZ3M6IHtcbiAgICAgIHNvbGFuYTogVDtcbiAgICAgIG5lYXI6IFQ7XG4gICAgICBldGg6IFQ7XG4gICAgICBwb2x5Z29uOiBUO1xuICAgICAgYmFzZTogVDtcbiAgICAgIGFyYml0cnVtOiBUO1xuICAgICAgdXNlcjogVDtcbiAgICB9XG4gICk6IFQge1xuICAgIHN3aXRjaCAoYmxvY2tjaGFpbikge1xuICAgICAgY2FzZSAnc29sYW5hJzpcbiAgICAgICAgcmV0dXJuIGFyZ3Muc29sYW5hO1xuICAgICAgY2FzZSAnbmVhcic6XG4gICAgICAgIHJldHVybiBhcmdzLm5lYXI7XG4gICAgICBjYXNlICdwb2x5Z29uJzpcbiAgICAgICAgcmV0dXJuIGFyZ3MucG9seWdvbjtcbiAgICAgIGNhc2UgJ2V0aCc6XG4gICAgICAgIHJldHVybiBhcmdzLmV0aDtcbiAgICAgIGNhc2UgJ2Jhc2UnOlxuICAgICAgICByZXR1cm4gYXJncy5iYXNlO1xuICAgICAgY2FzZSAnYXJiaXRydW0nOlxuICAgICAgICByZXR1cm4gYXJncy5hcmJpdHJ1bTtcbiAgICAgIGNhc2UgJ3VzZXInOlxuICAgICAgICByZXR1cm4gYXJncy51c2VyO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdibG9ja2NoYWluIG5vdCBzdXBwb3J0ZWQhJyk7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -1,10 +1,8 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { EventEmitter, Component, Input, Output, ViewChild, HostListener, Injectable, inject } from '@angular/core';
3
3
  import * as SolanaWeb3Js from '@solana/web3.js';
4
- import { Keypair, Transaction } from '@solana/web3.js';
5
4
  import base58Imported from 'bs58';
6
5
  import LZString from 'lz-string';
7
- import { sign } from 'tweetnacl';
8
6
  import * as i1 from '@angular/platform-browser';
9
7
 
10
8
  var SettlementType;
@@ -66,17 +64,6 @@ class CoinflowUtils {
66
64
  return undefined;
67
65
  });
68
66
  }
69
- async getCreditBalance(publicKey, merchantId, blockchain) {
70
- const response = await fetch(this.url + `/api/customer/balances/${merchantId}`, {
71
- method: 'GET',
72
- headers: {
73
- 'x-coinflow-auth-wallet': publicKey,
74
- 'x-coinflow-auth-blockchain': blockchain,
75
- },
76
- });
77
- const { credits } = await response.json();
78
- return credits;
79
- }
80
67
  static getCoinflowBaseUrl(env) {
81
68
  if (!env || env === 'prod')
82
69
  return 'https://coinflow.cash';
@@ -91,7 +78,7 @@ class CoinflowUtils {
91
78
  return 'http://localhost:5000';
92
79
  return `https://api-${env}.coinflow.cash`;
93
80
  }
94
- static getCoinflowUrl({ walletPubkey, sessionKey, route, routePrefix, env, amount, transaction, blockchain = 'solana', webhookInfo, email, loaderBackground, handleHeightChange, bankAccountLinkRedirect, additionalWallets, nearDeposit, chargebackProtectionData, merchantCss, color, rent, lockDefaultToken, token, tokens, planCode, disableApplePay, disableGooglePay, customerInfo, settlementType, lockAmount, nativeSolToConvert, theme, usePermit, transactionSigner, authOnly, deviceId, jwtToken, origins, threeDsChallengePreference, supportEmail, }) {
81
+ static getCoinflowUrl({ walletPubkey, sessionKey, route, routePrefix, env, amount, transaction, blockchain = 'solana', webhookInfo, email, loaderBackground, handleHeightChange, bankAccountLinkRedirect, additionalWallets, nearDeposit, chargebackProtectionData, merchantCss, color, rent, lockDefaultToken, token, tokens, planCode, disableApplePay, disableGooglePay, customerInfo, settlementType, lockAmount, nativeSolToConvert, theme, usePermit, transactionSigner, authOnly, deviceId, jwtToken, origins, threeDsChallengePreference, supportEmail, destinationAuthKey, }) {
95
82
  const prefix = routePrefix
96
83
  ? `/${routePrefix}/${blockchain}`
97
84
  : `/${blockchain}`;
@@ -185,6 +172,8 @@ class CoinflowUtils {
185
172
  url.searchParams.append('origins', LZString.compressToEncodedURIComponent(JSON.stringify(origins)));
186
173
  if (threeDsChallengePreference)
187
174
  url.searchParams.append('threeDsChallengePreference', threeDsChallengePreference);
175
+ if (destinationAuthKey)
176
+ url.searchParams.append('destinationAuthKey', destinationAuthKey);
188
177
  return url.toString();
189
178
  }
190
179
  static getTransaction(props) {
@@ -261,57 +250,6 @@ class CoinflowUtils {
261
250
  throw new Error('blockchain not supported!');
262
251
  }
263
252
  }
264
- static async getWalletFromUserId({ userId, merchantId, env, }) {
265
- return this.getWalletFromEmail({
266
- email: userId,
267
- merchantId,
268
- env,
269
- });
270
- }
271
- static async getWalletFromEmail({ email, merchantId, env, }) {
272
- const buffer = new TextEncoder().encode(email);
273
- const crypto = window.crypto.subtle;
274
- const hash = await crypto.digest('SHA-256', buffer);
275
- const seed = new Uint8Array(hash);
276
- const keypair = Keypair.fromSeed(seed);
277
- return {
278
- publicKey: keypair.publicKey,
279
- signMessage: (message) => Promise.resolve(sign.detached(message, keypair.secretKey)),
280
- signTransaction: async (transaction) => {
281
- if (transaction instanceof Transaction) {
282
- transaction.sign(keypair);
283
- return transaction;
284
- }
285
- else {
286
- transaction.sign([keypair]);
287
- return transaction;
288
- }
289
- },
290
- sendTransaction: async (transaction) => {
291
- if (transaction instanceof Transaction) {
292
- transaction.sign(keypair);
293
- }
294
- else {
295
- transaction.sign([keypair]);
296
- }
297
- const coinflowBaseUrl = this.getCoinflowApiUrl(env);
298
- const options = {
299
- method: 'POST',
300
- headers: {
301
- 'content-type': 'application/json',
302
- 'x-coinflow-auth-wallet': keypair.publicKey.toString(),
303
- 'x-coinflow-auth-blockchain': 'solana',
304
- },
305
- body: JSON.stringify({
306
- merchantId,
307
- signedTransaction: base58?.encode(transaction.serialize()),
308
- }),
309
- };
310
- const { signature } = await fetch(coinflowBaseUrl + '/api/utils/send-coinflow-tx', options).then(res => res.json());
311
- return signature;
312
- },
313
- };
314
- }
315
253
  }
316
254
 
317
255
  var IFrameMessageMethods;
@@ -321,20 +259,28 @@ var IFrameMessageMethods;
321
259
  IFrameMessageMethods["SendTransaction"] = "sendTransaction";
322
260
  IFrameMessageMethods["HeightChange"] = "heightChange";
323
261
  IFrameMessageMethods["Success"] = "success";
324
- IFrameMessageMethods["Load"] = "load";
262
+ IFrameMessageMethods["Loaded"] = "loaded";
325
263
  })(IFrameMessageMethods || (IFrameMessageMethods = {}));
326
264
  function getWalletPubkey(input) {
327
- if ('wallet' in input && input.wallet) {
328
- const { wallet } = input;
329
- if ('publicKey' in wallet) {
330
- return wallet.publicKey.toString();
331
- }
332
- if ('address' in wallet) {
333
- return wallet.address;
334
- }
335
- if ('accountId' in wallet) {
336
- return wallet.accountId;
337
- }
265
+ let wallet;
266
+ if ('signer' in input &&
267
+ typeof input.signer === 'object' &&
268
+ input.signer &&
269
+ 'wallet' in input.signer)
270
+ wallet = input.signer.wallet;
271
+ else if ('wallet' in input && input.wallet)
272
+ wallet = input.wallet;
273
+ if (!wallet)
274
+ return;
275
+ if (typeof wallet === 'string')
276
+ return wallet;
277
+ if (typeof wallet === 'object') {
278
+ if ('publicKey' in wallet)
279
+ return wallet.publicKey ? wallet.publicKey.toString() : undefined;
280
+ if ('address' in wallet)
281
+ return wallet.address ? wallet.address : undefined;
282
+ if ('accountId' in wallet)
283
+ return wallet.accountId ? wallet.accountId : undefined;
338
284
  }
339
285
  return null;
340
286
  }
@@ -370,32 +316,66 @@ function handleIFrameMessage(rawMessage, handlers) {
370
316
  return;
371
317
  handlers.onSuccess(walletCall.info);
372
318
  return;
319
+ case IFrameMessageMethods.Loaded:
320
+ return;
373
321
  }
374
322
  console.warn(`Didn't expect to get here, handleIFrameMessage method:${method} is not one of ${Object.values(IFrameMessageMethods)}`);
375
323
  }
376
324
  function getHandlers(props) {
377
- if (!props.blockchain) {
325
+ let chain;
326
+ let wallet;
327
+ if ('signer' in props &&
328
+ typeof props.signer === 'object' &&
329
+ props.signer &&
330
+ 'blockchain' in props.signer &&
331
+ 'wallet' in props.signer) {
332
+ chain = props.signer.blockchain;
333
+ wallet = props.signer.wallet;
334
+ }
335
+ else if ('blockchain' in props && props.blockchain) {
336
+ chain = props.blockchain;
337
+ wallet = props.wallet;
338
+ }
339
+ if (!chain) {
378
340
  return {
379
341
  handleSendTransaction: () => {
380
- throw new Error('handleSendTransaction Not Implemented for sessionKey');
342
+ throw new Error('handleSendTransaction Not Implemented');
381
343
  },
382
344
  handleSignMessage: () => {
383
- throw new Error('handleSendTransaction Not Implemented for sessionKey');
345
+ throw new Error('handleSendTransaction Not Implemented');
384
346
  },
385
347
  handleSignTransaction: () => {
386
- throw new Error('handleSendTransaction Not Implemented for sessionKey');
348
+ throw new Error('handleSendTransaction Not Implemented');
387
349
  },
388
350
  onSuccess: props.onSuccess,
389
351
  };
390
352
  }
391
- return CoinflowUtils.byBlockchain(props.blockchain, {
392
- solana: () => getSolanaWalletHandlers(props),
393
- near: () => getNearWalletHandlers(props),
394
- eth: () => getEvmWalletHandlers(props),
395
- polygon: () => getEvmWalletHandlers(props),
396
- base: () => getEvmWalletHandlers(props),
397
- arbitrum: () => getEvmWalletHandlers(props),
398
- user: () => getIdWalletHandlers(props),
353
+ return CoinflowUtils.byBlockchain(chain, {
354
+ solana: () => getSolanaWalletHandlers({
355
+ wallet: wallet,
356
+ onSuccess: props.onSuccess,
357
+ }),
358
+ near: () => getNearWalletHandlers({
359
+ wallet: wallet,
360
+ onSuccess: props.onSuccess,
361
+ }),
362
+ eth: () => getEvmWalletHandlers({
363
+ wallet: wallet,
364
+ onSuccess: props.onSuccess,
365
+ }),
366
+ polygon: () => getEvmWalletHandlers({
367
+ wallet: wallet,
368
+ onSuccess: props.onSuccess,
369
+ }),
370
+ base: () => getEvmWalletHandlers({
371
+ wallet: wallet,
372
+ onSuccess: props.onSuccess,
373
+ }),
374
+ arbitrum: () => getEvmWalletHandlers({
375
+ wallet: wallet,
376
+ onSuccess: props.onSuccess,
377
+ }),
378
+ user: () => getSessionKeyHandlers(props),
399
379
  })();
400
380
  }
401
381
  function getSolanaWalletHandlers({ wallet, onSuccess, }) {
@@ -443,11 +423,10 @@ function getSolanaTransaction(data) {
443
423
  return vtx;
444
424
  }
445
425
  function getNearWalletHandlers({ wallet, onSuccess, }) {
446
- const nearWallet = wallet;
447
426
  return {
448
427
  handleSendTransaction: async (transaction) => {
449
428
  const action = JSON.parse(Buffer.from(transaction, 'base64').toString());
450
- const executionOutcome = await nearWallet.signAndSendTransaction(action);
429
+ const executionOutcome = await wallet.signAndSendTransaction(action);
451
430
  if (!executionOutcome)
452
431
  throw new Error('Transaction did not send');
453
432
  const { transaction: transactionResult } = executionOutcome;
@@ -457,20 +436,19 @@ function getNearWalletHandlers({ wallet, onSuccess, }) {
457
436
  };
458
437
  }
459
438
  function getEvmWalletHandlers({ wallet, onSuccess, }) {
460
- const evmWallet = wallet;
461
439
  return {
462
440
  handleSendTransaction: async (transaction) => {
463
441
  const tx = JSON.parse(Buffer.from(transaction, 'base64').toString());
464
- const { hash } = await evmWallet.sendTransaction(tx);
442
+ const { hash } = await wallet.sendTransaction(tx);
465
443
  return hash;
466
444
  },
467
445
  handleSignMessage: async (message) => {
468
- return evmWallet.signMessage(message);
446
+ return wallet.signMessage(message);
469
447
  },
470
448
  onSuccess,
471
449
  };
472
450
  }
473
- function getIdWalletHandlers({ onSuccess, }) {
451
+ function getSessionKeyHandlers({ onSuccess, }) {
474
452
  return {
475
453
  handleSendTransaction: async () => {
476
454
  return Promise.resolve('');
@@ -889,12 +867,22 @@ class CoinflowCardNumberInput {
889
867
  .then(iframe => (this.iframe = iframe))
890
868
  .catch(e => console.error(e));
891
869
  }
892
- ngOnInit() {
870
+ initializeTokenEx() {
893
871
  setTokenExScriptTag({
894
872
  env: this.args.env,
895
873
  setTokenExScriptLoaded: this.onScriptLoaded.bind(this),
896
874
  });
897
875
  }
876
+ reinitialize() {
877
+ this.iframe = undefined;
878
+ this.initializeTokenEx();
879
+ }
880
+ ngOnInit() {
881
+ this.initializeTokenEx();
882
+ }
883
+ ngOnDestroy() {
884
+ this.iframe = undefined;
885
+ }
898
886
  tokenize() {
899
887
  return this.iframe.tokenize();
900
888
  }
@@ -931,12 +919,22 @@ class CoinflowCardNumberOnlyInput {
931
919
  .then(iframe => (this.iframe = iframe))
932
920
  .catch(e => console.error(e));
933
921
  }
934
- ngOnInit() {
922
+ initializeTokenEx() {
935
923
  setTokenExScriptTag({
936
924
  env: this.args.env,
937
925
  setTokenExScriptLoaded: this.onScriptLoaded.bind(this),
938
926
  });
939
927
  }
928
+ reinitialize() {
929
+ this.iframe = undefined;
930
+ this.initializeTokenEx();
931
+ }
932
+ ngOnInit() {
933
+ this.initializeTokenEx();
934
+ }
935
+ ngOnDestroy() {
936
+ this.iframe = undefined;
937
+ }
940
938
  tokenize() {
941
939
  return this.iframe.tokenize();
942
940
  }
@@ -991,12 +989,22 @@ class CoinflowCvvOnlyInputComponent {
991
989
  .then(iframe => (this.iframe = iframe))
992
990
  .catch(e => console.error(e));
993
991
  }
994
- ngOnInit() {
992
+ initializeTokenEx() {
995
993
  setTokenExScriptTag({
996
994
  env: this.args.env,
997
995
  setTokenExScriptLoaded: this.onScriptLoaded.bind(this),
998
996
  });
999
997
  }
998
+ reinitialize() {
999
+ this.iframe = undefined;
1000
+ this.initializeTokenEx();
1001
+ }
1002
+ ngOnInit() {
1003
+ this.initializeTokenEx();
1004
+ }
1005
+ ngOnDestroy() {
1006
+ this.iframe = undefined;
1007
+ }
1000
1008
  tokenize() {
1001
1009
  return this.iframe.tokenize();
1002
1010
  }