@bitgo/sdk-coin-tempo 1.11.0 → 1.12.1

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.
@@ -6,7 +6,7 @@
6
6
  */
7
7
  import { BaseTransaction, TransactionType } from '@bitgo/sdk-core';
8
8
  import { BaseCoin as CoinConfig } from '@bitgo/statics';
9
- import { Address, Hex, Tip20Operation } from './types';
9
+ import { Address, Hex, RawContractCall, Tip20Operation } from './types';
10
10
  /**
11
11
  * TIP-20 Transaction Request Structure
12
12
  * Represents the raw transaction data for Tempo Account Abstraction (EIP-7702)
@@ -45,6 +45,7 @@ export interface TxData {
45
45
  callCount: number;
46
46
  feeToken?: string;
47
47
  operations: Tip20Operation[];
48
+ rawCalls: RawContractCall[];
48
49
  signature?: {
49
50
  r: Hex;
50
51
  s: Hex;
@@ -54,8 +55,9 @@ export interface TxData {
54
55
  export declare class Tip20Transaction extends BaseTransaction {
55
56
  private txRequest;
56
57
  private _operations;
58
+ private _rawCalls;
57
59
  private _signature?;
58
- constructor(_coinConfig: Readonly<CoinConfig>, request: Tip20TransactionRequest, operations?: Tip20Operation[]);
60
+ constructor(_coinConfig: Readonly<CoinConfig>, request: Tip20TransactionRequest, operations?: Tip20Operation[], rawCalls?: RawContractCall[]);
59
61
  get type(): TransactionType;
60
62
  canSign(): boolean;
61
63
  serialize(signature?: {
@@ -113,6 +115,7 @@ export declare class Tip20Transaction extends BaseTransaction {
113
115
  */
114
116
  private serializeTransaction;
115
117
  getOperations(): Tip20Operation[];
118
+ getRawCalls(): RawContractCall[];
116
119
  getFeeToken(): Address | undefined;
117
120
  getOperationCount(): number;
118
121
  isBatch(): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../../src/lib/transaction.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../../src/lib/transaction.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAyB,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC1F,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAExD,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAGxE;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,2CAA2C;IAC3C,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,qCAAqC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,wBAAwB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,8CAA8C;IAC9C,oBAAoB,EAAE,MAAM,CAAC;IAC7B,oCAAoC;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,oDAAoD;IACpD,KAAK,EAAE;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,GAAG,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACnD,yDAAyD;IACzD,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC;IACvB,mDAAmD;IACnD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,SAAS,CAAC,EAAE;QAAE,CAAC,EAAE,GAAG,CAAC;QAAC,CAAC,EAAE,GAAG,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CACjD;AAED,qBAAa,gBAAiB,SAAQ,eAAe;IACnD,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,WAAW,CAAmB;IACtC,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,UAAU,CAAC,CAAsC;gBAGvD,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC,EACjC,OAAO,EAAE,uBAAuB,EAChC,UAAU,GAAE,cAAc,EAAO,EACjC,QAAQ,GAAE,eAAe,EAAO;IAsBlC,IAAI,IAAI,IAAI,eAAe,CAE1B;IAED,OAAO,IAAI,OAAO;IAIZ,SAAS,CAAC,SAAS,CAAC,EAAE;QAAE,CAAC,EAAE,GAAG,CAAC;QAAC,CAAC,EAAE,GAAG,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAK9E;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAI3B;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAIxB;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAQnB;;;;;;OAMG;IACH,OAAO,CAAC,gBAAgB;IAkBxB;;;;;OAKG;IACH,OAAO,CAAC,eAAe;IAUvB;;;;;OAKG;IACH,OAAO,CAAC,uBAAuB;IAS/B;;;;;;OAMG;IACH,OAAO,CAAC,oBAAoB;IAY5B,aAAa,IAAI,cAAc,EAAE;IAIjC,WAAW,IAAI,eAAe,EAAE;IAIhC,WAAW,IAAI,OAAO,GAAG,SAAS;IAIlC,iBAAiB,IAAI,MAAM;IAI3B,OAAO,IAAI,OAAO;IAIlB,YAAY,CAAC,SAAS,EAAE;QAAE,CAAC,EAAE,GAAG,CAAC;QAAC,CAAC,EAAE,GAAG,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAIlE,YAAY,IAAI;QAAE,CAAC,EAAE,GAAG,CAAC;QAAC,CAAC,EAAE,GAAG,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS;IAI/D;;;OAGG;IACH,gBAAgB,IAAI,MAAM,GAAG,SAAS;IActC,MAAM,IAAI,MAAM;IAgBV,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC;IAI1C,kBAAkB;IAClB,IAAI,EAAE,IAAI,MAAM,CAOf;IAED,QAAQ,IAAI,MAAM;IAIlB,YAAY,IAAI,OAAO;CAGxB"}
@@ -11,15 +11,23 @@ const sdk_core_1 = require("@bitgo/sdk-core");
11
11
  const ethers_1 = require("ethers");
12
12
  const utils_1 = require("./utils");
13
13
  class Tip20Transaction extends sdk_core_1.BaseTransaction {
14
- constructor(_coinConfig, request, operations = []) {
14
+ constructor(_coinConfig, request, operations = [], rawCalls = []) {
15
15
  super(_coinConfig);
16
16
  this.txRequest = request;
17
17
  this._operations = operations;
18
- this._outputs = operations.map((op) => ({
19
- address: op.to,
20
- value: (0, utils_1.amountToTip20Units)(op.amount).toString(),
21
- coin: op.token,
22
- }));
18
+ this._rawCalls = rawCalls;
19
+ this._outputs = [
20
+ ...operations.map((op) => ({
21
+ address: op.to,
22
+ value: (0, utils_1.amountToTip20Units)(op.amount).toString(),
23
+ coin: op.token,
24
+ })),
25
+ ...rawCalls.map((call) => ({
26
+ address: call.to,
27
+ value: call.value || '0',
28
+ coin: _coinConfig.name,
29
+ })),
30
+ ];
23
31
  const totalUnits = operations.reduce((sum, op) => sum + (0, utils_1.amountToTip20Units)(op.amount), 0n);
24
32
  this._inputs = [{ address: '', value: totalUnits.toString(), coin: _coinConfig.name }];
25
33
  }
@@ -135,11 +143,14 @@ class Tip20Transaction extends sdk_core_1.BaseTransaction {
135
143
  getOperations() {
136
144
  return [...this._operations];
137
145
  }
146
+ getRawCalls() {
147
+ return [...this._rawCalls];
148
+ }
138
149
  getFeeToken() {
139
150
  return this.txRequest.feeToken;
140
151
  }
141
152
  getOperationCount() {
142
- return this.txRequest.calls.length;
153
+ return this._operations.length + this._rawCalls.length;
143
154
  }
144
155
  isBatch() {
145
156
  return this.txRequest.calls.length > 1;
@@ -177,6 +188,7 @@ class Tip20Transaction extends sdk_core_1.BaseTransaction {
177
188
  callCount: this.txRequest.calls.length,
178
189
  feeToken: this.txRequest.feeToken,
179
190
  operations: this._operations,
191
+ rawCalls: this._rawCalls,
180
192
  signature: this._signature,
181
193
  };
182
194
  }
@@ -201,4 +213,4 @@ class Tip20Transaction extends sdk_core_1.BaseTransaction {
201
213
  }
202
214
  }
203
215
  exports.Tip20Transaction = Tip20Transaction;
204
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7R0FLRzs7O0FBRUgsOENBQTBGO0FBRTFGLG1DQUFnQztBQUVoQyxtQ0FBNkM7QUF3QzdDLE1BQWEsZ0JBQWlCLFNBQVEsMEJBQWU7SUFLbkQsWUFBWSxXQUFpQyxFQUFFLE9BQWdDLEVBQUUsYUFBK0IsRUFBRTtRQUNoSCxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUM7UUFDekIsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUM7UUFDOUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3RDLE9BQU8sRUFBRSxFQUFFLENBQUMsRUFBRTtZQUNkLEtBQUssRUFBRSxJQUFBLDBCQUFrQixFQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUU7WUFDL0MsSUFBSSxFQUFFLEVBQUUsQ0FBQyxLQUFLO1NBQ2YsQ0FBQyxDQUFDLENBQUM7UUFDSixNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLElBQUEsMEJBQWtCLEVBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzNGLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDekYsQ0FBQztJQUVELElBQUksSUFBSTtRQUNOLE9BQU8sMEJBQWUsQ0FBQyxJQUFJLENBQUM7SUFDOUIsQ0FBQztJQUVELE9BQU87UUFDTCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxLQUFLLENBQUMsU0FBUyxDQUFDLFNBQStDO1FBQzdELE1BQU0sR0FBRyxHQUFHLFNBQVMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ3pDLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssbUJBQW1CO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDaEcsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxnQkFBZ0I7UUFDdEIsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0RyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxXQUFXLENBQUMsS0FBYTtRQUMvQixJQUFJLEtBQUssS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUNqQixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLE9BQU8sSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxnQkFBZ0IsQ0FBQyxXQUFrQixFQUFFLFlBQW1CO1FBQzlELE9BQU87WUFDTCxlQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQztZQUM1QyxJQUFJLENBQUMsU0FBUyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtZQUNsRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDO1lBQzdDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUM7WUFDcEMsV0FBVztZQUNYLFlBQVk7WUFDWixJQUFJLEVBQUUsMENBQTBDO1lBQ2hELElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDNUUsSUFBSSxFQUFFLHlDQUF5QztZQUMvQyxJQUFJLEVBQUUsd0NBQXdDO1lBQzlDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxJQUFJLElBQUk7WUFDL0IsSUFBSSxFQUFFLCtDQUErQztZQUNyRCxFQUFFLEVBQUUsK0JBQStCO1NBQ3BDLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxlQUFlLENBQUMsU0FBOEM7UUFDcEUsTUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDakMsTUFBTSxjQUFjLEdBQUcsZUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDekMsZUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDckMsZUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDckMsZUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1NBQ3hCLENBQUMsQ0FBQztRQUNILE9BQU8sZUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssdUJBQXVCLENBQUMsT0FBYztRQUM1QyxJQUFJLENBQUM7WUFDSCxNQUFNLE9BQU8sR0FBRyxlQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDakQsT0FBTyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFRLENBQUM7UUFDNUMsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksZ0NBQXFCLENBQUMscUNBQXFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDaEYsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxvQkFBb0IsQ0FBQyxTQUErQztRQUMxRSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUMvQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUM3QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRWpFLElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELGFBQWE7UUFDWCxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDO0lBQ2pDLENBQUM7SUFFRCxpQkFBaUI7UUFDZixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUNyQyxDQUFDO0lBRUQsT0FBTztRQUNMLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsWUFBWSxDQUFDLFNBQThDO1FBQ3pELElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO0lBQzlCLENBQUM7SUFFRCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxnQkFBZ0I7UUFDZCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3JCLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUNoRCxNQUFNLE9BQU8sR0FBRyxlQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxlQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQzNFLE9BQU8sZUFBTSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFO1lBQzFDLENBQUMsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDcEIsQ0FBQyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNwQixhQUFhLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPO1NBQ3ZDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxNQUFNO1FBQ0osT0FBTztZQUNMLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUk7WUFDekIsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTztZQUMvQixLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLO1lBQzNCLFlBQVksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUU7WUFDcEQsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUU7WUFDcEUsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRTtZQUNsQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTTtZQUN0QyxRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRO1lBQ2pDLFVBQVUsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM1QixTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVU7U0FDM0IsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsaUJBQWlCO1FBQ3JCLE9BQU8sTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLElBQUksRUFBRTtRQUNKLElBQUksQ0FBQztZQUNILE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDOUQsT0FBTyxlQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxlQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQ25FLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO0lBQ0gsQ0FBQztJQUVELFFBQVE7UUFDTixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsWUFBWTtRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7SUFDdkUsQ0FBQztDQUNGO0FBeE5ELDRDQXdOQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVElQLTIwIFRyYW5zYWN0aW9uXG4gKlxuICogUmVwcmVzZW50cyBhIFRlbXBvIEFjY291bnQgQWJzdHJhY3Rpb24gKEFBKSB0cmFuc2FjdGlvbiAodHlwZSAweDc2KVxuICogU3VwcG9ydHMgc2luZ2xlIG9yIGJhdGNoIFRJUC0yMCB0b2tlbiB0cmFuc2ZlcnMgd2l0aCBtZW1vc1xuICovXG5cbmltcG9ydCB7IEJhc2VUcmFuc2FjdGlvbiwgUGFyc2VUcmFuc2FjdGlvbkVycm9yLCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7IGV0aGVycyB9IGZyb20gJ2V0aGVycyc7XG5pbXBvcnQgeyBBZGRyZXNzLCBIZXgsIFRpcDIwT3BlcmF0aW9uIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBhbW91bnRUb1RpcDIwVW5pdHMgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBUSVAtMjAgVHJhbnNhY3Rpb24gUmVxdWVzdCBTdHJ1Y3R1cmVcbiAqIFJlcHJlc2VudHMgdGhlIHJhdyB0cmFuc2FjdGlvbiBkYXRhIGZvciBUZW1wbyBBY2NvdW50IEFic3RyYWN0aW9uIChFSVAtNzcwMilcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaXAyMFRyYW5zYWN0aW9uUmVxdWVzdCB7XG4gIC8qKiBUcmFuc2FjdGlvbiB0eXBlICgweDc2IGZvciBUZW1wbyBBQSkgKi9cbiAgdHlwZTogbnVtYmVyIHwgc3RyaW5nO1xuICAvKiogQ2hhaW4gSUQgZm9yIHRoZSBUZW1wbyBuZXR3b3JrICovXG4gIGNoYWluSWQ6IG51bWJlcjtcbiAgLyoqIFRyYW5zYWN0aW9uIG5vbmNlICovXG4gIG5vbmNlOiBudW1iZXI7XG4gIC8qKiBNYXhpbXVtIGZlZSBwZXIgZ2FzIChFSVAtMTU1OSkgKi9cbiAgbWF4RmVlUGVyR2FzOiBiaWdpbnQ7XG4gIC8qKiBNYXhpbXVtIHByaW9yaXR5IGZlZSBwZXIgZ2FzIChFSVAtMTU1OSkgKi9cbiAgbWF4UHJpb3JpdHlGZWVQZXJHYXM6IGJpZ2ludDtcbiAgLyoqIEdhcyBsaW1pdCBmb3IgdGhlIHRyYW5zYWN0aW9uICovXG4gIGdhczogYmlnaW50O1xuICAvKiogQXJyYXkgb2YgY2FsbHMgdG8gZXhlY3V0ZSBpbiB0aGlzIHRyYW5zYWN0aW9uICovXG4gIGNhbGxzOiB7IHRvOiBBZGRyZXNzOyBkYXRhOiBIZXg7IHZhbHVlOiBiaWdpbnQgfVtdO1xuICAvKiogQWNjZXNzIGxpc3QgKG9wdGlvbmFsLCB0eXBpY2FsbHkgZW1wdHkgZm9yIFRJUC0yMCkgKi9cbiAgYWNjZXNzTGlzdD86IHVua25vd25bXTtcbiAgLyoqIE9wdGlvbmFsIFRJUC0yMCB0b2tlbiB0byB1c2UgZm9yIHBheWluZyBmZWVzICovXG4gIGZlZVRva2VuPzogQWRkcmVzcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUeERhdGEge1xuICB0eXBlOiBudW1iZXIgfCBzdHJpbmc7XG4gIGNoYWluSWQ6IG51bWJlcjtcbiAgbm9uY2U6IG51bWJlcjtcbiAgbWF4RmVlUGVyR2FzOiBzdHJpbmc7XG4gIG1heFByaW9yaXR5RmVlUGVyR2FzOiBzdHJpbmc7XG4gIGdhczogc3RyaW5nO1xuICBjYWxsQ291bnQ6IG51bWJlcjtcbiAgZmVlVG9rZW4/OiBzdHJpbmc7XG4gIG9wZXJhdGlvbnM6IFRpcDIwT3BlcmF0aW9uW107XG4gIHNpZ25hdHVyZT86IHsgcjogSGV4OyBzOiBIZXg7IHlQYXJpdHk6IG51bWJlciB9O1xufVxuXG5leHBvcnQgY2xhc3MgVGlwMjBUcmFuc2FjdGlvbiBleHRlbmRzIEJhc2VUcmFuc2FjdGlvbiB7XG4gIHByaXZhdGUgdHhSZXF1ZXN0OiBUaXAyMFRyYW5zYWN0aW9uUmVxdWVzdDtcbiAgcHJpdmF0ZSBfb3BlcmF0aW9uczogVGlwMjBPcGVyYXRpb25bXTtcbiAgcHJpdmF0ZSBfc2lnbmF0dXJlPzogeyByOiBIZXg7IHM6IEhleDsgeVBhcml0eTogbnVtYmVyIH07XG5cbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+LCByZXF1ZXN0OiBUaXAyMFRyYW5zYWN0aW9uUmVxdWVzdCwgb3BlcmF0aW9uczogVGlwMjBPcGVyYXRpb25bXSA9IFtdKSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICAgIHRoaXMudHhSZXF1ZXN0ID0gcmVxdWVzdDtcbiAgICB0aGlzLl9vcGVyYXRpb25zID0gb3BlcmF0aW9ucztcbiAgICB0aGlzLl9vdXRwdXRzID0gb3BlcmF0aW9ucy5tYXAoKG9wKSA9PiAoe1xuICAgICAgYWRkcmVzczogb3AudG8sXG4gICAgICB2YWx1ZTogYW1vdW50VG9UaXAyMFVuaXRzKG9wLmFtb3VudCkudG9TdHJpbmcoKSxcbiAgICAgIGNvaW46IG9wLnRva2VuLFxuICAgIH0pKTtcbiAgICBjb25zdCB0b3RhbFVuaXRzID0gb3BlcmF0aW9ucy5yZWR1Y2UoKHN1bSwgb3ApID0+IHN1bSArIGFtb3VudFRvVGlwMjBVbml0cyhvcC5hbW91bnQpLCAwbik7XG4gICAgdGhpcy5faW5wdXRzID0gW3sgYWRkcmVzczogJycsIHZhbHVlOiB0b3RhbFVuaXRzLnRvU3RyaW5nKCksIGNvaW46IF9jb2luQ29uZmlnLm5hbWUgfV07XG4gIH1cblxuICBnZXQgdHlwZSgpOiBUcmFuc2FjdGlvblR5cGUge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU2VuZDtcbiAgfVxuXG4gIGNhblNpZ24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBhc3luYyBzZXJpYWxpemUoc2lnbmF0dXJlPzogeyByOiBIZXg7IHM6IEhleDsgeVBhcml0eTogbnVtYmVyIH0pOiBQcm9taXNlPEhleD4ge1xuICAgIGNvbnN0IHNpZyA9IHNpZ25hdHVyZSB8fCB0aGlzLl9zaWduYXR1cmU7XG4gICAgcmV0dXJuIHRoaXMuc2VyaWFsaXplVHJhbnNhY3Rpb24oc2lnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmNvZGUgY2FsbHMgYXMgUkxQIHR1cGxlcyBmb3IgYXRvbWljIGJhdGNoIGV4ZWN1dGlvblxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBbdG8sIHZhbHVlLCBkYXRhXSB0dXBsZXNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgZW5jb2RlQ2FsbHNBc1R1cGxlcygpOiBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMudHhSZXF1ZXN0LmNhbGxzLm1hcCgoY2FsbCkgPT4gW2NhbGwudG8sIHRoaXMuYmlnaW50VG9IZXgoY2FsbC52YWx1ZSksIGNhbGwuZGF0YV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuY29kZSBFSVAtMjkzMCBhY2Nlc3MgbGlzdCBhcyBSTFAgdHVwbGVzXG4gICAqIEByZXR1cm5zIEFycmF5IG9mIFthZGRyZXNzLCBzdG9yYWdlS2V5c1tdXSB0dXBsZXNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgZW5jb2RlQWNjZXNzTGlzdCgpOiBhbnlbXSB7XG4gICAgcmV0dXJuICh0aGlzLnR4UmVxdWVzdC5hY2Nlc3NMaXN0ID8/IFtdKS5tYXAoKGl0ZW06IGFueSkgPT4gW2l0ZW0uYWRkcmVzcywgaXRlbS5zdG9yYWdlS2V5cyB8fCBbXV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYmlnaW50IHRvIGhleCBzdHJpbmcgZm9yIFJMUCBlbmNvZGluZ1xuICAgKiBAcGFyYW0gdmFsdWUgYmlnaW50IHZhbHVlIHRvIGNvbnZlcnRcbiAgICogQHJldHVybnMgSGV4IHN0cmluZ1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBiaWdpbnRUb0hleCh2YWx1ZTogYmlnaW50KTogc3RyaW5nIHtcbiAgICBpZiAodmFsdWUgPT09IDBuKSB7XG4gICAgICByZXR1cm4gJzB4JztcbiAgICB9XG4gICAgY29uc3QgaGV4ID0gdmFsdWUudG9TdHJpbmcoMTYpO1xuICAgIHJldHVybiAnMHgnICsgKGhleC5sZW5ndGggJSAyID8gJzAnIDogJycpICsgaGV4O1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGJhc2UgUkxQIGRhdGEgYXJyYXkgcGVyIFRlbXBvIEVJUC03NzAyIHNwZWNpZmljYXRpb25cbiAgICogQHBhcmFtIGNhbGxzVHVwbGVzIEVuY29kZWQgY2FsbHNcbiAgICogQHBhcmFtIGFjY2Vzc1R1cGxlcyBFbmNvZGVkIGFjY2VzcyBsaXN0XG4gICAqIEByZXR1cm5zIFJMUC1yZWFkeSBhcnJheSBvZiB0cmFuc2FjdGlvbiBmaWVsZHNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYnVpbGRCYXNlUmxwRGF0YShjYWxsc1R1cGxlczogYW55W10sIGFjY2Vzc1R1cGxlczogYW55W10pOiBhbnlbXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGV0aGVycy51dGlscy5oZXhsaWZ5KHRoaXMudHhSZXF1ZXN0LmNoYWluSWQpLFxuICAgICAgdGhpcy50eFJlcXVlc3QubWF4UHJpb3JpdHlGZWVQZXJHYXMgPyB0aGlzLmJpZ2ludFRvSGV4KHRoaXMudHhSZXF1ZXN0Lm1heFByaW9yaXR5RmVlUGVyR2FzKSA6ICcweCcsXG4gICAgICB0aGlzLmJpZ2ludFRvSGV4KHRoaXMudHhSZXF1ZXN0Lm1heEZlZVBlckdhcyksXG4gICAgICB0aGlzLmJpZ2ludFRvSGV4KHRoaXMudHhSZXF1ZXN0LmdhcyksXG4gICAgICBjYWxsc1R1cGxlcyxcbiAgICAgIGFjY2Vzc1R1cGxlcyxcbiAgICAgICcweCcsIC8vIG5vbmNlS2V5IChyZXNlcnZlZCBmb3IgMkQgbm9uY2Ugc3lzdGVtKVxuICAgICAgdGhpcy50eFJlcXVlc3Qubm9uY2UgPyB0aGlzLmJpZ2ludFRvSGV4KEJpZ0ludCh0aGlzLnR4UmVxdWVzdC5ub25jZSkpIDogJzB4JyxcbiAgICAgICcweCcsIC8vIHZhbGlkQmVmb3JlIChyZXNlcnZlZCBmb3IgdGltZSBib3VuZHMpXG4gICAgICAnMHgnLCAvLyB2YWxpZEFmdGVyIChyZXNlcnZlZCBmb3IgdGltZSBib3VuZHMpXG4gICAgICB0aGlzLnR4UmVxdWVzdC5mZWVUb2tlbiB8fCAnMHgnLFxuICAgICAgJzB4JywgLy8gZmVlUGF5ZXJTaWduYXR1cmUgKHJlc2VydmVkIGZvciBzcG9uc29yc2hpcClcbiAgICAgIFtdLCAvLyBhdXRob3JpemF0aW9uTGlzdCAoRUlQLTc3MDIpXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmNvZGUgc2VjcDI1NmsxIHNpZ25hdHVyZSBhcyA2NS1ieXRlIGVudmVsb3BlXG4gICAqIEBwYXJhbSBzaWduYXR1cmUgRUNEU0Egc2lnbmF0dXJlIGNvbXBvbmVudHNcbiAgICogQHJldHVybnMgSGV4IHN0cmluZyBvZiBjb25jYXRlbmF0ZWQgciAoMzIpICsgcyAoMzIpICsgdiAoMSkgYnl0ZXNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgZW5jb2RlU2lnbmF0dXJlKHNpZ25hdHVyZTogeyByOiBIZXg7IHM6IEhleDsgeVBhcml0eTogbnVtYmVyIH0pOiBzdHJpbmcge1xuICAgIGNvbnN0IHYgPSBzaWduYXR1cmUueVBhcml0eSArIDI3O1xuICAgIGNvbnN0IHNpZ25hdHVyZUJ5dGVzID0gZXRoZXJzLnV0aWxzLmNvbmNhdChbXG4gICAgICBldGhlcnMudXRpbHMuemVyb1BhZChzaWduYXR1cmUuciwgMzIpLFxuICAgICAgZXRoZXJzLnV0aWxzLnplcm9QYWQoc2lnbmF0dXJlLnMsIDMyKSxcbiAgICAgIGV0aGVycy51dGlscy5oZXhsaWZ5KHYpLFxuICAgIF0pO1xuICAgIHJldHVybiBldGhlcnMudXRpbHMuaGV4bGlmeShzaWduYXR1cmVCeXRlcyk7XG4gIH1cblxuICAvKipcbiAgICogUkxQIGVuY29kZSBhbmQgcHJlcGVuZCB0cmFuc2FjdGlvbiB0eXBlIGJ5dGVcbiAgICogQHBhcmFtIHJscERhdGEgVHJhbnNhY3Rpb24gZmllbGRzIGFycmF5XG4gICAqIEByZXR1cm5zIEhleCBzdHJpbmcgd2l0aCAweDc2IHByZWZpeFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBybHBFbmNvZGVXaXRoVHlwZVByZWZpeChybHBEYXRhOiBhbnlbXSk6IEhleCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVuY29kZWQgPSBldGhlcnMudXRpbHMuUkxQLmVuY29kZShybHBEYXRhKTtcbiAgICAgIHJldHVybiAoJzB4NzYnICsgZW5jb2RlZC5zbGljZSgyKSkgYXMgSGV4O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgUGFyc2VUcmFuc2FjdGlvbkVycm9yKGBGYWlsZWQgdG8gUkxQIGVuY29kZSB0cmFuc2FjdGlvbjogJHtlcnJvcn1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplIFRlbXBvIEFBIHRyYW5zYWN0aW9uICh0eXBlIDB4NzYpIHBlciBFSVAtNzcwMiBzcGVjaWZpY2F0aW9uXG4gICAqIEZvcm1hdDogMHg3NiB8fCBSTFAoW2NoYWluSWQsIGZlZXMsIGdhcywgY2FsbHMsIGFjY2Vzc0xpc3QsIG5vbmNlIGZpZWxkcywgZmVlVG9rZW4sIHNwb25zb3JzaGlwLCBhdXRoTGlzdCwgc2lnbmF0dXJlP10pXG4gICAqIEBwYXJhbSBzaWduYXR1cmUgT3B0aW9uYWwgRUNEU0Egc2lnbmF0dXJlIChvbWl0IGZvciB1bnNpZ25lZCB0cmFuc2FjdGlvbnMpXG4gICAqIEByZXR1cm5zIFJMUC1lbmNvZGVkIHRyYW5zYWN0aW9uIGhleCBzdHJpbmdcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgc2VyaWFsaXplVHJhbnNhY3Rpb24oc2lnbmF0dXJlPzogeyByOiBIZXg7IHM6IEhleDsgeVBhcml0eTogbnVtYmVyIH0pOiBIZXgge1xuICAgIGNvbnN0IGNhbGxzVHVwbGVzID0gdGhpcy5lbmNvZGVDYWxsc0FzVHVwbGVzKCk7XG4gICAgY29uc3QgYWNjZXNzVHVwbGVzID0gdGhpcy5lbmNvZGVBY2Nlc3NMaXN0KCk7XG4gICAgY29uc3QgcmxwRGF0YSA9IHRoaXMuYnVpbGRCYXNlUmxwRGF0YShjYWxsc1R1cGxlcywgYWNjZXNzVHVwbGVzKTtcblxuICAgIGlmIChzaWduYXR1cmUpIHtcbiAgICAgIHJscERhdGEucHVzaCh0aGlzLmVuY29kZVNpZ25hdHVyZShzaWduYXR1cmUpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5ybHBFbmNvZGVXaXRoVHlwZVByZWZpeChybHBEYXRhKTtcbiAgfVxuXG4gIGdldE9wZXJhdGlvbnMoKTogVGlwMjBPcGVyYXRpb25bXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLl9vcGVyYXRpb25zXTtcbiAgfVxuXG4gIGdldEZlZVRva2VuKCk6IEFkZHJlc3MgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnR4UmVxdWVzdC5mZWVUb2tlbjtcbiAgfVxuXG4gIGdldE9wZXJhdGlvbkNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMudHhSZXF1ZXN0LmNhbGxzLmxlbmd0aDtcbiAgfVxuXG4gIGlzQmF0Y2goKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudHhSZXF1ZXN0LmNhbGxzLmxlbmd0aCA+IDE7XG4gIH1cblxuICBzZXRTaWduYXR1cmUoc2lnbmF0dXJlOiB7IHI6IEhleDsgczogSGV4OyB5UGFyaXR5OiBudW1iZXIgfSk6IHZvaWQge1xuICAgIHRoaXMuX3NpZ25hdHVyZSA9IHNpZ25hdHVyZTtcbiAgfVxuXG4gIGdldFNpZ25hdHVyZSgpOiB7IHI6IEhleDsgczogSGV4OyB5UGFyaXR5OiBudW1iZXIgfSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3NpZ25hdHVyZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvdmVyIHRoZSBzaWduZXIgYWRkcmVzcyBmcm9tIHRoZSB0cmFuc2FjdGlvbiBzaWduYXR1cmUuXG4gICAqIEByZXR1cm5zIENoZWNrc3VtbWVkIHNlbmRlciBhZGRyZXNzLCBvciB1bmRlZmluZWQgaWYgdW5zaWduZWRcbiAgICovXG4gIGdldFNlbmRlckFkZHJlc3MoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuX3NpZ25hdHVyZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCB1bnNpZ25lZEhleCA9IHRoaXMuc2VyaWFsaXplVHJhbnNhY3Rpb24oKTtcbiAgICBjb25zdCBtc2dIYXNoID0gZXRoZXJzLnV0aWxzLmtlY2NhazI1NihldGhlcnMudXRpbHMuYXJyYXlpZnkodW5zaWduZWRIZXgpKTtcbiAgICByZXR1cm4gZXRoZXJzLnV0aWxzLnJlY292ZXJBZGRyZXNzKG1zZ0hhc2gsIHtcbiAgICAgIHI6IHRoaXMuX3NpZ25hdHVyZS5yLFxuICAgICAgczogdGhpcy5fc2lnbmF0dXJlLnMsXG4gICAgICByZWNvdmVyeVBhcmFtOiB0aGlzLl9zaWduYXR1cmUueVBhcml0eSxcbiAgICB9KTtcbiAgfVxuXG4gIHRvSnNvbigpOiBUeERhdGEge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiB0aGlzLnR4UmVxdWVzdC50eXBlLFxuICAgICAgY2hhaW5JZDogdGhpcy50eFJlcXVlc3QuY2hhaW5JZCxcbiAgICAgIG5vbmNlOiB0aGlzLnR4UmVxdWVzdC5ub25jZSxcbiAgICAgIG1heEZlZVBlckdhczogdGhpcy50eFJlcXVlc3QubWF4RmVlUGVyR2FzLnRvU3RyaW5nKCksXG4gICAgICBtYXhQcmlvcml0eUZlZVBlckdhczogdGhpcy50eFJlcXVlc3QubWF4UHJpb3JpdHlGZWVQZXJHYXMudG9TdHJpbmcoKSxcbiAgICAgIGdhczogdGhpcy50eFJlcXVlc3QuZ2FzLnRvU3RyaW5nKCksXG4gICAgICBjYWxsQ291bnQ6IHRoaXMudHhSZXF1ZXN0LmNhbGxzLmxlbmd0aCxcbiAgICAgIGZlZVRva2VuOiB0aGlzLnR4UmVxdWVzdC5mZWVUb2tlbixcbiAgICAgIG9wZXJhdGlvbnM6IHRoaXMuX29wZXJhdGlvbnMsXG4gICAgICBzaWduYXR1cmU6IHRoaXMuX3NpZ25hdHVyZSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgdG9Ccm9hZGNhc3RGb3JtYXQoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5zZXJpYWxpemUodGhpcy5fc2lnbmF0dXJlKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IHRoaXMuc2VyaWFsaXplVHJhbnNhY3Rpb24odGhpcy5fc2lnbmF0dXJlKTtcbiAgICAgIHJldHVybiBldGhlcnMudXRpbHMua2VjY2FrMjU2KGV0aGVycy51dGlscy5hcnJheWlmeShzZXJpYWxpemVkKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gJ3BlbmRpbmcnO1xuICAgIH1cbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMudG9Kc29uKCksIG51bGwsIDIpO1xuICB9XG5cbiAgY2FuQnJvYWRjYXN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnR4UmVxdWVzdC5jYWxscy5sZW5ndGggPiAwICYmIHRoaXMudHhSZXF1ZXN0LmNoYWluSWQgPiAwO1xuICB9XG59XG4iXX0=
216
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7R0FLRzs7O0FBRUgsOENBQTBGO0FBRTFGLG1DQUFnQztBQUVoQyxtQ0FBNkM7QUF5QzdDLE1BQWEsZ0JBQWlCLFNBQVEsMEJBQWU7SUFNbkQsWUFDRSxXQUFpQyxFQUNqQyxPQUFnQyxFQUNoQyxhQUErQixFQUFFLEVBQ2pDLFdBQThCLEVBQUU7UUFFaEMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ25CLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDO1FBQzlCLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1FBQzFCLElBQUksQ0FBQyxRQUFRLEdBQUc7WUFDZCxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ3pCLE9BQU8sRUFBRSxFQUFFLENBQUMsRUFBRTtnQkFDZCxLQUFLLEVBQUUsSUFBQSwwQkFBa0IsRUFBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFO2dCQUMvQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEtBQUs7YUFDZixDQUFDLENBQUM7WUFDSCxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ3pCLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRTtnQkFDaEIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLElBQUksR0FBRztnQkFDeEIsSUFBSSxFQUFFLFdBQVcsQ0FBQyxJQUFJO2FBQ3ZCLENBQUMsQ0FBQztTQUNKLENBQUM7UUFDRixNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxF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QUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDOUQsT0FBTyxlQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxlQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQ25FLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUCxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO0lBQ0gsQ0FBQztJQUVELFFBQVE7UUFDTixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQsWUFBWTtRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7SUFDdkUsQ0FBQztDQUNGO0FBM09ELDRDQTJPQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVElQLTIwIFRyYW5zYWN0aW9uXG4gKlxuICogUmVwcmVzZW50cyBhIFRlbXBvIEFjY291bnQgQWJzdHJhY3Rpb24gKEFBKSB0cmFuc2FjdGlvbiAodHlwZSAweDc2KVxuICogU3VwcG9ydHMgc2luZ2xlIG9yIGJhdGNoIFRJUC0yMCB0b2tlbiB0cmFuc2ZlcnMgd2l0aCBtZW1vc1xuICovXG5cbmltcG9ydCB7IEJhc2VUcmFuc2FjdGlvbiwgUGFyc2VUcmFuc2FjdGlvbkVycm9yLCBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7IGV0aGVycyB9IGZyb20gJ2V0aGVycyc7XG5pbXBvcnQgeyBBZGRyZXNzLCBIZXgsIFJhd0NvbnRyYWN0Q2FsbCwgVGlwMjBPcGVyYXRpb24gfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGFtb3VudFRvVGlwMjBVbml0cyB9IGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIFRJUC0yMCBUcmFuc2FjdGlvbiBSZXF1ZXN0IFN0cnVjdHVyZVxuICogUmVwcmVzZW50cyB0aGUgcmF3IHRyYW5zYWN0aW9uIGRhdGEgZm9yIFRlbXBvIEFjY291bnQgQWJzdHJhY3Rpb24gKEVJUC03NzAyKVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRpcDIwVHJhbnNhY3Rpb25SZXF1ZXN0IHtcbiAgLyoqIFRyYW5zYWN0aW9uIHR5cGUgKDB4NzYgZm9yIFRlbXBvIEFBKSAqL1xuICB0eXBlOiBudW1iZXIgfCBzdHJpbmc7XG4gIC8qKiBDaGFpbiBJRCBmb3IgdGhlIFRlbXBvIG5ldHdvcmsgKi9cbiAgY2hhaW5JZDogbnVtYmVyO1xuICAvKiogVHJhbnNhY3Rpb24gbm9uY2UgKi9cbiAgbm9uY2U6IG51bWJlcjtcbiAgLyoqIE1heGltdW0gZmVlIHBlciBnYXMgKEVJUC0xNTU5KSAqL1xuICBtYXhGZWVQZXJHYXM6IGJpZ2ludDtcbiAgLyoqIE1heGltdW0gcHJpb3JpdHkgZmVlIHBlciBnYXMgKEVJUC0xNTU5KSAqL1xuICBtYXhQcmlvcml0eUZlZVBlckdhczogYmlnaW50O1xuICAvKiogR2FzIGxpbWl0IGZvciB0aGUgdHJhbnNhY3Rpb24gKi9cbiAgZ2FzOiBiaWdpbnQ7XG4gIC8qKiBBcnJheSBvZiBjYWxscyB0byBleGVjdXRlIGluIHRoaXMgdHJhbnNhY3Rpb24gKi9cbiAgY2FsbHM6IHsgdG86IEFkZHJlc3M7IGRhdGE6IEhleDsgdmFsdWU6IGJpZ2ludCB9W107XG4gIC8qKiBBY2Nlc3MgbGlzdCAob3B0aW9uYWwsIHR5cGljYWxseSBlbXB0eSBmb3IgVElQLTIwKSAqL1xuICBhY2Nlc3NMaXN0PzogdW5rbm93bltdO1xuICAvKiogT3B0aW9uYWwgVElQLTIwIHRva2VuIHRvIHVzZSBmb3IgcGF5aW5nIGZlZXMgKi9cbiAgZmVlVG9rZW4/OiBBZGRyZXNzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFR4RGF0YSB7XG4gIHR5cGU6IG51bWJlciB8IHN0cmluZztcbiAgY2hhaW5JZDogbnVtYmVyO1xuICBub25jZTogbnVtYmVyO1xuICBtYXhGZWVQZXJHYXM6IHN0cmluZztcbiAgbWF4UHJpb3JpdHlGZWVQZXJHYXM6IHN0cmluZztcbiAgZ2FzOiBzdHJpbmc7XG4gIGNhbGxDb3VudDogbnVtYmVyO1xuICBmZWVUb2tlbj86IHN0cmluZztcbiAgb3BlcmF0aW9uczogVGlwMjBPcGVyYXRpb25bXTtcbiAgcmF3Q2FsbHM6IFJhd0NvbnRyYWN0Q2FsbFtdO1xuICBzaWduYXR1cmU/OiB7IHI6IEhleDsgczogSGV4OyB5UGFyaXR5OiBudW1iZXIgfTtcbn1cblxuZXhwb3J0IGNsYXNzIFRpcDIwVHJhbnNhY3Rpb24gZXh0ZW5kcyBCYXNlVHJhbnNhY3Rpb24ge1xuICBwcml2YXRlIHR4UmVxdWVzdDogVGlwMjBUcmFuc2FjdGlvblJlcXVlc3Q7XG4gIHByaXZhdGUgX29wZXJhdGlvbnM6IFRpcDIwT3BlcmF0aW9uW107XG4gIHByaXZhdGUgX3Jhd0NhbGxzOiBSYXdDb250cmFjdENhbGxbXTtcbiAgcHJpdmF0ZSBfc2lnbmF0dXJlPzogeyByOiBIZXg7IHM6IEhleDsgeVBhcml0eTogbnVtYmVyIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+LFxuICAgIHJlcXVlc3Q6IFRpcDIwVHJhbnNhY3Rpb25SZXF1ZXN0LFxuICAgIG9wZXJhdGlvbnM6IFRpcDIwT3BlcmF0aW9uW10gPSBbXSxcbiAgICByYXdDYWxsczogUmF3Q29udHJhY3RDYWxsW10gPSBbXVxuICApIHtcbiAgICBzdXBlcihfY29pbkNvbmZpZyk7XG4gICAgdGhpcy50eFJlcXVlc3QgPSByZXF1ZXN0O1xuICAgIHRoaXMuX29wZXJhdGlvbnMgPSBvcGVyYXRpb25zO1xuICAgIHRoaXMuX3Jhd0NhbGxzID0gcmF3Q2FsbHM7XG4gICAgdGhpcy5fb3V0cHV0cyA9IFtcbiAgICAgIC4uLm9wZXJhdGlvbnMubWFwKChvcCkgPT4gKHtcbiAgICAgICAgYWRkcmVzczogb3AudG8sXG4gICAgICAgIHZhbHVlOiBhbW91bnRUb1RpcDIwVW5pdHMob3AuYW1vdW50KS50b1N0cmluZygpLFxuICAgICAgICBjb2luOiBvcC50b2tlbixcbiAgICAgIH0pKSxcbiAgICAgIC4uLnJhd0NhbGxzLm1hcCgoY2FsbCkgPT4gKHtcbiAgICAgICAgYWRkcmVzczogY2FsbC50byxcbiAgICAgICAgdmFsdWU6IGNhbGwudmFsdWUgfHwgJzAnLFxuICAgICAgICBjb2luOiBfY29pbkNvbmZpZy5uYW1lLFxuICAgICAgfSkpLFxuICAgIF07XG4gICAgY29uc3QgdG90YWxVbml0cyA9IG9wZXJhdGlvbnMucmVkdWNlKChzdW0sIG9wKSA9PiBzdW0gKyBhbW91bnRUb1RpcDIwVW5pdHMob3AuYW1vdW50KSwgMG4pO1xuICAgIHRoaXMuX2lucHV0cyA9IFt7IGFkZHJlc3M6ICcnLCB2YWx1ZTogdG90YWxVbml0cy50b1N0cmluZygpLCBjb2luOiBfY29pbkNvbmZpZy5uYW1lIH1dO1xuICB9XG5cbiAgZ2V0IHR5cGUoKTogVHJhbnNhY3Rpb25UeXBlIHtcbiAgICByZXR1cm4gVHJhbnNhY3Rpb25UeXBlLlNlbmQ7XG4gIH1cblxuICBjYW5TaWduKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYXN5bmMgc2VyaWFsaXplKHNpZ25hdHVyZT86IHsgcjogSGV4OyBzOiBIZXg7IHlQYXJpdHk6IG51bWJlciB9KTogUHJvbWlzZTxIZXg+IHtcbiAgICBjb25zdCBzaWcgPSBzaWduYXR1cmUgfHwgdGhpcy5fc2lnbmF0dXJlO1xuICAgIHJldHVybiB0aGlzLnNlcmlhbGl6ZVRyYW5zYWN0aW9uKHNpZyk7XG4gIH1cblxuICAvKipcbiAgICogRW5jb2RlIGNhbGxzIGFzIFJMUCB0dXBsZXMgZm9yIGF0b21pYyBiYXRjaCBleGVjdXRpb25cbiAgICogQHJldHVybnMgQXJyYXkgb2YgW3RvLCB2YWx1ZSwgZGF0YV0gdHVwbGVzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGVuY29kZUNhbGxzQXNUdXBsZXMoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLnR4UmVxdWVzdC5jYWxscy5tYXAoKGNhbGwpID0+IFtjYWxsLnRvLCB0aGlzLmJpZ2ludFRvSGV4KGNhbGwudmFsdWUpLCBjYWxsLmRhdGFdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmNvZGUgRUlQLTI5MzAgYWNjZXNzIGxpc3QgYXMgUkxQIHR1cGxlc1xuICAgKiBAcmV0dXJucyBBcnJheSBvZiBbYWRkcmVzcywgc3RvcmFnZUtleXNbXV0gdHVwbGVzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGVuY29kZUFjY2Vzc0xpc3QoKTogYW55W10ge1xuICAgIHJldHVybiAodGhpcy50eFJlcXVlc3QuYWNjZXNzTGlzdCA/PyBbXSkubWFwKChpdGVtOiBhbnkpID0+IFtpdGVtLmFkZHJlc3MsIGl0ZW0uc3RvcmFnZUtleXMgfHwgW11dKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGJpZ2ludCB0byBoZXggc3RyaW5nIGZvciBSTFAgZW5jb2RpbmdcbiAgICogQHBhcmFtIHZhbHVlIGJpZ2ludCB2YWx1ZSB0byBjb252ZXJ0XG4gICAqIEByZXR1cm5zIEhleCBzdHJpbmdcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYmlnaW50VG9IZXgodmFsdWU6IGJpZ2ludCk6IHN0cmluZyB7XG4gICAgaWYgKHZhbHVlID09PSAwbikge1xuICAgICAgcmV0dXJuICcweCc7XG4gICAgfVxuICAgIGNvbnN0IGhleCA9IHZhbHVlLnRvU3RyaW5nKDE2KTtcbiAgICByZXR1cm4gJzB4JyArIChoZXgubGVuZ3RoICUgMiA/ICcwJyA6ICcnKSArIGhleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBiYXNlIFJMUCBkYXRhIGFycmF5IHBlciBUZW1wbyBFSVAtNzcwMiBzcGVjaWZpY2F0aW9uXG4gICAqIEBwYXJhbSBjYWxsc1R1cGxlcyBFbmNvZGVkIGNhbGxzXG4gICAqIEBwYXJhbSBhY2Nlc3NUdXBsZXMgRW5jb2RlZCBhY2Nlc3MgbGlzdFxuICAgKiBAcmV0dXJucyBSTFAtcmVhZHkgYXJyYXkgb2YgdHJhbnNhY3Rpb24gZmllbGRzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkQmFzZVJscERhdGEoY2FsbHNUdXBsZXM6IGFueVtdLCBhY2Nlc3NUdXBsZXM6IGFueVtdKTogYW55W10ge1xuICAgIHJldHVybiBbXG4gICAgICBldGhlcnMudXRpbHMuaGV4bGlmeSh0aGlzLnR4UmVxdWVzdC5jaGFpbklkKSxcbiAgICAgIHRoaXMudHhSZXF1ZXN0Lm1heFByaW9yaXR5RmVlUGVyR2FzID8gdGhpcy5iaWdpbnRUb0hleCh0aGlzLnR4UmVxdWVzdC5tYXhQcmlvcml0eUZlZVBlckdhcykgOiAnMHgnLFxuICAgICAgdGhpcy5iaWdpbnRUb0hleCh0aGlzLnR4UmVxdWVzdC5tYXhGZWVQZXJHYXMpLFxuICAgICAgdGhpcy5iaWdpbnRUb0hleCh0aGlzLnR4UmVxdWVzdC5nYXMpLFxuICAgICAgY2FsbHNUdXBsZXMsXG4gICAgICBhY2Nlc3NUdXBsZXMsXG4gICAgICAnMHgnLCAvLyBub25jZUtleSAocmVzZXJ2ZWQgZm9yIDJEIG5vbmNlIHN5c3RlbSlcbiAgICAgIHRoaXMudHhSZXF1ZXN0Lm5vbmNlID8gdGhpcy5iaWdpbnRUb0hleChCaWdJbnQodGhpcy50eFJlcXVlc3Qubm9uY2UpKSA6ICcweCcsXG4gICAgICAnMHgnLCAvLyB2YWxpZEJlZm9yZSAocmVzZXJ2ZWQgZm9yIHRpbWUgYm91bmRzKVxuICAgICAgJzB4JywgLy8gdmFsaWRBZnRlciAocmVzZXJ2ZWQgZm9yIHRpbWUgYm91bmRzKVxuICAgICAgdGhpcy50eFJlcXVlc3QuZmVlVG9rZW4gfHwgJzB4JyxcbiAgICAgICcweCcsIC8vIGZlZVBheWVyU2lnbmF0dXJlIChyZXNlcnZlZCBmb3Igc3BvbnNvcnNoaXApXG4gICAgICBbXSwgLy8gYXV0aG9yaXphdGlvbkxpc3QgKEVJUC03NzAyKVxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogRW5jb2RlIHNlY3AyNTZrMSBzaWduYXR1cmUgYXMgNjUtYnl0ZSBlbnZlbG9wZVxuICAgKiBAcGFyYW0gc2lnbmF0dXJlIEVDRFNBIHNpZ25hdHVyZSBjb21wb25lbnRzXG4gICAqIEByZXR1cm5zIEhleCBzdHJpbmcgb2YgY29uY2F0ZW5hdGVkIHIgKDMyKSArIHMgKDMyKSArIHYgKDEpIGJ5dGVzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGVuY29kZVNpZ25hdHVyZShzaWduYXR1cmU6IHsgcjogSGV4OyBzOiBIZXg7IHlQYXJpdHk6IG51bWJlciB9KTogc3RyaW5nIHtcbiAgICBjb25zdCB2ID0gc2lnbmF0dXJlLnlQYXJpdHkgKyAyNztcbiAgICBjb25zdCBzaWduYXR1cmVCeXRlcyA9IGV0aGVycy51dGlscy5jb25jYXQoW1xuICAgICAgZXRoZXJzLnV0aWxzLnplcm9QYWQoc2lnbmF0dXJlLnIsIDMyKSxcbiAgICAgIGV0aGVycy51dGlscy56ZXJvUGFkKHNpZ25hdHVyZS5zLCAzMiksXG4gICAgICBldGhlcnMudXRpbHMuaGV4bGlmeSh2KSxcbiAgICBdKTtcbiAgICByZXR1cm4gZXRoZXJzLnV0aWxzLmhleGxpZnkoc2lnbmF0dXJlQnl0ZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJMUCBlbmNvZGUgYW5kIHByZXBlbmQgdHJhbnNhY3Rpb24gdHlwZSBieXRlXG4gICAqIEBwYXJhbSBybHBEYXRhIFRyYW5zYWN0aW9uIGZpZWxkcyBhcnJheVxuICAgKiBAcmV0dXJucyBIZXggc3RyaW5nIHdpdGggMHg3NiBwcmVmaXhcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgcmxwRW5jb2RlV2l0aFR5cGVQcmVmaXgocmxwRGF0YTogYW55W10pOiBIZXgge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBlbmNvZGVkID0gZXRoZXJzLnV0aWxzLlJMUC5lbmNvZGUocmxwRGF0YSk7XG4gICAgICByZXR1cm4gKCcweDc2JyArIGVuY29kZWQuc2xpY2UoMikpIGFzIEhleDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlVHJhbnNhY3Rpb25FcnJvcihgRmFpbGVkIHRvIFJMUCBlbmNvZGUgdHJhbnNhY3Rpb246ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSBUZW1wbyBBQSB0cmFuc2FjdGlvbiAodHlwZSAweDc2KSBwZXIgRUlQLTc3MDIgc3BlY2lmaWNhdGlvblxuICAgKiBGb3JtYXQ6IDB4NzYgfHwgUkxQKFtjaGFpbklkLCBmZWVzLCBnYXMsIGNhbGxzLCBhY2Nlc3NMaXN0LCBub25jZSBmaWVsZHMsIGZlZVRva2VuLCBzcG9uc29yc2hpcCwgYXV0aExpc3QsIHNpZ25hdHVyZT9dKVxuICAgKiBAcGFyYW0gc2lnbmF0dXJlIE9wdGlvbmFsIEVDRFNBIHNpZ25hdHVyZSAob21pdCBmb3IgdW5zaWduZWQgdHJhbnNhY3Rpb25zKVxuICAgKiBAcmV0dXJucyBSTFAtZW5jb2RlZCB0cmFuc2FjdGlvbiBoZXggc3RyaW5nXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHNlcmlhbGl6ZVRyYW5zYWN0aW9uKHNpZ25hdHVyZT86IHsgcjogSGV4OyBzOiBIZXg7IHlQYXJpdHk6IG51bWJlciB9KTogSGV4IHtcbiAgICBjb25zdCBjYWxsc1R1cGxlcyA9IHRoaXMuZW5jb2RlQ2FsbHNBc1R1cGxlcygpO1xuICAgIGNvbnN0IGFjY2Vzc1R1cGxlcyA9IHRoaXMuZW5jb2RlQWNjZXNzTGlzdCgpO1xuICAgIGNvbnN0IHJscERhdGEgPSB0aGlzLmJ1aWxkQmFzZVJscERhdGEoY2FsbHNUdXBsZXMsIGFjY2Vzc1R1cGxlcyk7XG5cbiAgICBpZiAoc2lnbmF0dXJlKSB7XG4gICAgICBybHBEYXRhLnB1c2godGhpcy5lbmNvZGVTaWduYXR1cmUoc2lnbmF0dXJlKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucmxwRW5jb2RlV2l0aFR5cGVQcmVmaXgocmxwRGF0YSk7XG4gIH1cblxuICBnZXRPcGVyYXRpb25zKCk6IFRpcDIwT3BlcmF0aW9uW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5fb3BlcmF0aW9uc107XG4gIH1cblxuICBnZXRSYXdDYWxscygpOiBSYXdDb250cmFjdENhbGxbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLl9yYXdDYWxsc107XG4gIH1cblxuICBnZXRGZWVUb2tlbigpOiBBZGRyZXNzIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy50eFJlcXVlc3QuZmVlVG9rZW47XG4gIH1cblxuICBnZXRPcGVyYXRpb25Db3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9vcGVyYXRpb25zLmxlbmd0aCArIHRoaXMuX3Jhd0NhbGxzLmxlbmd0aDtcbiAgfVxuXG4gIGlzQmF0Y2goKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudHhSZXF1ZXN0LmNhbGxzLmxlbmd0aCA+IDE7XG4gIH1cblxuICBzZXRTaWduYXR1cmUoc2lnbmF0dXJlOiB7IHI6IEhleDsgczogSGV4OyB5UGFyaXR5OiBudW1iZXIgfSk6IHZvaWQge1xuICAgIHRoaXMuX3NpZ25hdHVyZSA9IHNpZ25hdHVyZTtcbiAgfVxuXG4gIGdldFNpZ25hdHVyZSgpOiB7IHI6IEhleDsgczogSGV4OyB5UGFyaXR5OiBudW1iZXIgfSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3NpZ25hdHVyZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvdmVyIHRoZSBzaWduZXIgYWRkcmVzcyBmcm9tIHRoZSB0cmFuc2FjdGlvbiBzaWduYXR1cmUuXG4gICAqIEByZXR1cm5zIENoZWNrc3VtbWVkIHNlbmRlciBhZGRyZXNzLCBvciB1bmRlZmluZWQgaWYgdW5zaWduZWRcbiAgICovXG4gIGdldFNlbmRlckFkZHJlc3MoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuX3NpZ25hdHVyZSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCB1bnNpZ25lZEhleCA9IHRoaXMuc2VyaWFsaXplVHJhbnNhY3Rpb24oKTtcbiAgICBjb25zdCBtc2dIYXNoID0gZXRoZXJzLnV0aWxzLmtlY2NhazI1NihldGhlcnMudXRpbHMuYXJyYXlpZnkodW5zaWduZWRIZXgpKTtcbiAgICByZXR1cm4gZXRoZXJzLnV0aWxzLnJlY292ZXJBZGRyZXNzKG1zZ0hhc2gsIHtcbiAgICAgIHI6IHRoaXMuX3NpZ25hdHVyZS5yLFxuICAgICAgczogdGhpcy5fc2lnbmF0dXJlLnMsXG4gICAgICByZWNvdmVyeVBhcmFtOiB0aGlzLl9zaWduYXR1cmUueVBhcml0eSxcbiAgICB9KTtcbiAgfVxuXG4gIHRvSnNvbigpOiBUeERhdGEge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiB0aGlzLnR4UmVxdWVzdC50eXBlLFxuICAgICAgY2hhaW5JZDogdGhpcy50eFJlcXVlc3QuY2hhaW5JZCxcbiAgICAgIG5vbmNlOiB0aGlzLnR4UmVxdWVzdC5ub25jZSxcbiAgICAgIG1heEZlZVBlckdhczogdGhpcy50eFJlcXVlc3QubWF4RmVlUGVyR2FzLnRvU3RyaW5nKCksXG4gICAgICBtYXhQcmlvcml0eUZlZVBlckdhczogdGhpcy50eFJlcXVlc3QubWF4UHJpb3JpdHlGZWVQZXJHYXMudG9TdHJpbmcoKSxcbiAgICAgIGdhczogdGhpcy50eFJlcXVlc3QuZ2FzLnRvU3RyaW5nKCksXG4gICAgICBjYWxsQ291bnQ6IHRoaXMudHhSZXF1ZXN0LmNhbGxzLmxlbmd0aCxcbiAgICAgIGZlZVRva2VuOiB0aGlzLnR4UmVxdWVzdC5mZWVUb2tlbixcbiAgICAgIG9wZXJhdGlvbnM6IHRoaXMuX29wZXJhdGlvbnMsXG4gICAgICByYXdDYWxsczogdGhpcy5fcmF3Q2FsbHMsXG4gICAgICBzaWduYXR1cmU6IHRoaXMuX3NpZ25hdHVyZSxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgdG9Ccm9hZGNhc3RGb3JtYXQoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5zZXJpYWxpemUodGhpcy5fc2lnbmF0dXJlKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IHRoaXMuc2VyaWFsaXplVHJhbnNhY3Rpb24odGhpcy5fc2lnbmF0dXJlKTtcbiAgICAgIHJldHVybiBldGhlcnMudXRpbHMua2VjY2FrMjU2KGV0aGVycy51dGlscy5hcnJheWlmeShzZXJpYWxpemVkKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gJ3BlbmRpbmcnO1xuICAgIH1cbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMudG9Kc29uKCksIG51bGwsIDIpO1xuICB9XG5cbiAgY2FuQnJvYWRjYXN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnR4UmVxdWVzdC5jYWxscy5sZW5ndGggPiAwICYmIHRoaXMudHhSZXF1ZXN0LmNoYWluSWQgPiAwO1xuICB9XG59XG4iXX0=
@@ -10,13 +10,14 @@
10
10
  import { Transaction as EthTransaction, TransactionBuilder as AbstractTransactionBuilder, TransferBuilder } from '@bitgo/abstract-eth';
11
11
  import { BaseTransaction } from '@bitgo/sdk-core';
12
12
  import { BaseCoin as CoinConfig } from '@bitgo/statics';
13
- import { Address, Tip20Operation } from './types';
13
+ import { Address, RawContractCall, Tip20Operation } from './types';
14
14
  /**
15
15
  * Transaction Builder for TIP-20 tokens on Tempo blockchain
16
16
  * Extends abstract-eth TransactionBuilder with Tempo-specific features
17
17
  */
18
18
  export declare class Tip20TransactionBuilder extends AbstractTransactionBuilder {
19
19
  private operations;
20
+ private rawCalls;
20
21
  private _feeToken?;
21
22
  private _nonce?;
22
23
  private _gas?;
@@ -48,7 +49,8 @@ export declare class Tip20TransactionBuilder extends AbstractTransactionBuilder
48
49
  private fromTip20Transaction;
49
50
  /**
50
51
  * Decode a single AA call's data back into a Tip20Operation.
51
- * Expects the call data to encode transferWithMemo(address, uint256, bytes32).
52
+ * Returns null if the call is not a transferWithMemo it will be stored as a RawContractCall instead.
53
+ * This preserves calldata fidelity for arbitrary smart contract interactions.
52
54
  */
53
55
  private decodeCallToOperation;
54
56
  /**
@@ -64,6 +66,19 @@ export declare class Tip20TransactionBuilder extends AbstractTransactionBuilder
64
66
  * @returns this builder instance for chaining
65
67
  */
66
68
  addOperation(operation: Tip20Operation): this;
69
+ /**
70
+ * Add a raw smart contract call with pre-encoded calldata
71
+ * Use this for arbitrary contract interactions where the UI provides ABI-encoded calldata
72
+ *
73
+ * @param call - Raw contract call with target address and pre-encoded calldata
74
+ * @returns this builder instance for chaining
75
+ */
76
+ addRawCall(call: RawContractCall): this;
77
+ /**
78
+ * Get all raw contract calls in this transaction
79
+ * @returns Array of raw contract calls
80
+ */
81
+ getRawCalls(): RawContractCall[];
67
82
  /**
68
83
  * Set which TIP-20 token will be used to pay transaction fees
69
84
  * This is a global setting for the entire transaction
@@ -1 +1 @@
1
- {"version":3,"file":"transactionBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/transactionBuilder.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,WAAW,IAAI,cAAc,EAC7B,kBAAkB,IAAI,0BAA0B,EAChD,eAAe,EAChB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,eAAe,EAIhB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAExD,OAAO,EAAE,OAAO,EAAO,cAAc,EAAE,MAAM,SAAS,CAAC;AAcvD;;;GAGG;AACH,qBAAa,uBAAwB,SAAQ,0BAA0B;IACrE,OAAO,CAAC,UAAU,CAAwB;IAC1C,OAAO,CAAC,SAAS,CAAC,CAAU;IAC5B,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,IAAI,CAAC,CAAS;IACtB,OAAO,CAAC,aAAa,CAAC,CAAS;IAC/B,OAAO,CAAC,qBAAqB,CAAC,CAAS;IACvC,OAAO,CAAC,kBAAkB,CAAC,CAAsC;gBAErD,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAI7C;;;OAGG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,OAAO,GAAG,eAAe;IASjE;;;;;;OAMG;IACH,mBAAmB,IAAI,IAAI;IAsB3B,kBAAkB;IAClB,sBAAsB,CAAC,cAAc,EAAE,GAAG,GAAG,IAAI;IAYjD,kBAAkB;IAClB,SAAS,CAAC,kBAAkB,CAAC,cAAc,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,OAAO,GAAG,cAAc;IAU7F;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAyE5B;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAmB7B;;;OAGG;cACa,mBAAmB,IAAI,OAAO,CAAC,eAAe,CAAC;IAqD/D;;;;;;OAMG;IACH,YAAY,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI;IAM7C;;;;;;OAMG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAQpC;;;;;OAKG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAQ1B;;;;;OAKG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAS/B;;;;;OAKG;IACH,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IASjD;;;;;OAKG;IACH,oBAAoB,CAAC,oBAAoB,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IASjE;;;OAGG;IACH,aAAa,IAAI,cAAc,EAAE;IAIjC;;;OAGG;IACH,WAAW,IAAI,OAAO,GAAG,SAAS;IAIlC;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAkBzB;;OAEG;IACH,OAAO,CAAC,eAAe;CAUxB"}
1
+ {"version":3,"file":"transactionBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/transactionBuilder.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,WAAW,IAAI,cAAc,EAC7B,kBAAkB,IAAI,0BAA0B,EAChD,eAAe,EAChB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,eAAe,EAIhB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAExD,OAAO,EAAE,OAAO,EAAO,eAAe,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAexE;;;GAGG;AACH,qBAAa,uBAAwB,SAAQ,0BAA0B;IACrE,OAAO,CAAC,UAAU,CAAwB;IAC1C,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,SAAS,CAAC,CAAU;IAC5B,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,IAAI,CAAC,CAAS;IACtB,OAAO,CAAC,aAAa,CAAC,CAAS;IAC/B,OAAO,CAAC,qBAAqB,CAAC,CAAS;IACvC,OAAO,CAAC,kBAAkB,CAAC,CAAsC;gBAErD,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC;IAI7C;;;OAGG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,OAAO,GAAG,eAAe;IASjE;;;;;;OAMG;IACH,mBAAmB,IAAI,IAAI;IAsB3B,kBAAkB;IAClB,sBAAsB,CAAC,cAAc,EAAE,GAAG,GAAG,IAAI;IAYjD,kBAAkB;IAClB,SAAS,CAAC,kBAAkB,CAAC,cAAc,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,OAAO,GAAG,cAAc;IAU7F;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAmF5B;;;;OAIG;IACH,OAAO,CAAC,qBAAqB;IAoB7B;;;OAGG;cACa,mBAAmB,IAAI,OAAO,CAAC,eAAe,CAAC;IA6D/D;;;;;;OAMG;IACH,YAAY,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI;IAM7C;;;;;;OAMG;IACH,UAAU,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI;IAmBvC;;;OAGG;IACH,WAAW,IAAI,eAAe,EAAE;IAIhC;;;;;;OAMG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAQpC;;;;;OAKG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAQ1B;;;;;OAKG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAS/B;;;;;OAKG;IACH,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IASjD;;;;;OAKG;IACH,oBAAoB,CAAC,oBAAoB,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IASjE;;;OAGG;IACH,aAAa,IAAI,cAAc,EAAE;IAIjC;;;OAGG;IACH,WAAW,IAAI,OAAO,GAAG,SAAS;IAIlC;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAkBzB;;OAEG;IACH,OAAO,CAAC,eAAe;CAUxB"}
@@ -25,6 +25,7 @@ class Tip20TransactionBuilder extends abstract_eth_1.TransactionBuilder {
25
25
  constructor(_coinConfig) {
26
26
  super(_coinConfig);
27
27
  this.operations = [];
28
+ this.rawCalls = [];
28
29
  }
29
30
  /**
30
31
  * Implement the transfer method from abstract class
@@ -46,8 +47,8 @@ class Tip20TransactionBuilder extends abstract_eth_1.TransactionBuilder {
46
47
  * @throws BuildTransactionError if validation fails
47
48
  */
48
49
  validateTransaction() {
49
- if (this.operations.length === 0) {
50
- throw new sdk_core_1.BuildTransactionError('At least one operation is required to build a transaction');
50
+ if (this.operations.length === 0 && this.rawCalls.length === 0) {
51
+ throw new sdk_core_1.BuildTransactionError('At least one operation or raw call is required to build a transaction');
51
52
  }
52
53
  if (this._nonce === undefined) {
53
54
  throw new sdk_core_1.BuildTransactionError('Nonce is required to build a transaction');
@@ -110,7 +111,17 @@ class Tip20TransactionBuilder extends abstract_eth_1.TransactionBuilder {
110
111
  value: parseBigInt(tuple[1]),
111
112
  data: tuple[2],
112
113
  }));
113
- const operations = calls.map((call) => this.decodeCallToOperation(call));
114
+ const operations = [];
115
+ const decodedRawCalls = [];
116
+ for (const call of calls) {
117
+ const op = this.decodeCallToOperation(call);
118
+ if (op !== null) {
119
+ operations.push(op);
120
+ }
121
+ else {
122
+ decodedRawCalls.push({ to: call.to, data: call.data, value: call.value.toString() });
123
+ }
124
+ }
114
125
  let signature;
115
126
  if (decoded.length >= 14 && decoded[13] && decoded[13].length > 2) {
116
127
  const sigBytes = ethers_1.ethers.utils.arrayify(decoded[13]);
@@ -140,8 +151,9 @@ class Tip20TransactionBuilder extends abstract_eth_1.TransactionBuilder {
140
151
  this._maxPriorityFeePerGas = maxPriorityFeePerGas;
141
152
  this._feeToken = feeToken;
142
153
  this.operations = operations;
154
+ this.rawCalls = decodedRawCalls;
143
155
  this._restoredSignature = signature;
144
- const tx = new transaction_1.Tip20Transaction(this._coinConfig, txRequest, operations);
156
+ const tx = new transaction_1.Tip20Transaction(this._coinConfig, txRequest, operations, decodedRawCalls);
145
157
  if (signature) {
146
158
  tx.setSignature(signature);
147
159
  }
@@ -155,7 +167,8 @@ class Tip20TransactionBuilder extends abstract_eth_1.TransactionBuilder {
155
167
  }
156
168
  /**
157
169
  * Decode a single AA call's data back into a Tip20Operation.
158
- * Expects the call data to encode transferWithMemo(address, uint256, bytes32).
170
+ * Returns null if the call is not a transferWithMemo it will be stored as a RawContractCall instead.
171
+ * This preserves calldata fidelity for arbitrary smart contract interactions.
159
172
  */
160
173
  decodeCallToOperation(call) {
161
174
  const iface = new ethers_1.ethers.utils.Interface(tip20Abi_1.TIP20_TRANSFER_WITH_MEMO_ABI);
@@ -170,7 +183,8 @@ class Tip20TransactionBuilder extends abstract_eth_1.TransactionBuilder {
170
183
  return { token: call.to, to: toAddress, amount, memo };
171
184
  }
172
185
  catch {
173
- return { token: call.to, to: call.to, amount: (0, utils_1.tip20UnitsToAmount)(call.value) };
186
+ // Not a transferWithMemo call caller will store as RawContractCall
187
+ return null;
174
188
  }
175
189
  }
176
190
  /**
@@ -193,6 +207,13 @@ class Tip20TransactionBuilder extends abstract_eth_1.TransactionBuilder {
193
207
  },
194
208
  });
195
209
  const calls = this.operations.map((op) => this.operationToCall(op));
210
+ for (const rawCall of this.rawCalls) {
211
+ calls.push({
212
+ to: rawCall.to,
213
+ data: rawCall.data,
214
+ value: rawCall.value ? BigInt(rawCall.value) : 0n,
215
+ });
216
+ }
196
217
  const txRequest = {
197
218
  type: constants_1.AA_TRANSACTION_TYPE,
198
219
  chainId: this._common.chainIdBN().toNumber(),
@@ -204,7 +225,7 @@ class Tip20TransactionBuilder extends abstract_eth_1.TransactionBuilder {
204
225
  accessList: [],
205
226
  feeToken: this._feeToken,
206
227
  };
207
- const tx = new transaction_1.Tip20Transaction(this._coinConfig, txRequest, this.operations);
228
+ const tx = new transaction_1.Tip20Transaction(this._coinConfig, txRequest, this.operations, this.rawCalls);
208
229
  if (this._sourceKeyPair && this._sourceKeyPair.getKeys().prv) {
209
230
  const prv = this._sourceKeyPair.getKeys().prv;
210
231
  const unsignedHex = await tx.serialize();
@@ -234,6 +255,40 @@ class Tip20TransactionBuilder extends abstract_eth_1.TransactionBuilder {
234
255
  this.operations.push(operation);
235
256
  return this;
236
257
  }
258
+ /**
259
+ * Add a raw smart contract call with pre-encoded calldata
260
+ * Use this for arbitrary contract interactions where the UI provides ABI-encoded calldata
261
+ *
262
+ * @param call - Raw contract call with target address and pre-encoded calldata
263
+ * @returns this builder instance for chaining
264
+ */
265
+ addRawCall(call) {
266
+ if (!(0, utils_1.isValidAddress)(call.to)) {
267
+ throw new sdk_core_1.BuildTransactionError(`Invalid contract address: ${call.to}`);
268
+ }
269
+ if (!(0, utils_1.isValidHexData)(call.data)) {
270
+ throw new sdk_core_1.BuildTransactionError(`Invalid calldata: must be a non-empty 0x-prefixed hex string with even length`);
271
+ }
272
+ if (call.value !== undefined) {
273
+ try {
274
+ const v = BigInt(call.value);
275
+ if (v < 0n)
276
+ throw new Error();
277
+ }
278
+ catch {
279
+ throw new sdk_core_1.BuildTransactionError(`Invalid value: must be a non-negative integer string`);
280
+ }
281
+ }
282
+ this.rawCalls.push(call);
283
+ return this;
284
+ }
285
+ /**
286
+ * Get all raw contract calls in this transaction
287
+ * @returns Array of raw contract calls
288
+ */
289
+ getRawCalls() {
290
+ return [...this.rawCalls];
291
+ }
237
292
  /**
238
293
  * Set which TIP-20 token will be used to pay transaction fees
239
294
  * This is a global setting for the entire transaction
@@ -350,4 +405,4 @@ class Tip20TransactionBuilder extends abstract_eth_1.TransactionBuilder {
350
405
  }
351
406
  }
352
407
  exports.Tip20TransactionBuilder = Tip20TransactionBuilder;
353
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90cmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7OztHQVFHOzs7QUFFSCxzREFJNkI7QUFDN0IsOENBS3lCO0FBRXpCLG1DQUFnQztBQUVoQywrQ0FBMEU7QUFDMUUsbUNBUWlCO0FBQ2pCLHlDQUEwRDtBQUMxRCwyQ0FBa0Q7QUFFbEQ7OztHQUdHO0FBQ0gsTUFBYSx1QkFBd0IsU0FBUSxpQ0FBMEI7SUFTckUsWUFBWSxXQUFpQztRQUMzQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFUYixlQUFVLEdBQXFCLEVBQUUsQ0FBQztJQVUxQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsUUFBUSxDQUFDLElBQWEsRUFBRSxhQUF1QjtRQUM3QyxNQUFNLGVBQWUsR0FBRyxJQUFJLDhCQUFlLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ3RFLElBQUksSUFBSSxFQUFFLENBQUM7WUFDVCxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdCLENBQUM7UUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLGVBQWUsQ0FBQztRQUNqQyxPQUFPLGVBQWUsQ0FBQztJQUN6QixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsbUJBQW1CO1FBQ2pCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDakMsTUFBTSxJQUFJLGdDQUFxQixDQUFDLDJEQUEyRCxDQUFDLENBQUM7UUFDL0YsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM5QixNQUFNLElBQUksZ0NBQXFCLENBQUMsMENBQTBDLENBQUMsQ0FBQztRQUM5RSxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzVCLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO1FBQ2xGLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDckMsTUFBTSxJQUFJLGdDQUFxQixDQUFDLGlEQUFpRCxDQUFDLENBQUM7UUFDckYsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLHFCQUFxQixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzdDLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyx5REFBeUQsQ0FBQyxDQUFDO1FBQzdGLENBQUM7SUFDSCxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLHNCQUFzQixDQUFDLGNBQW1CO1FBQ3hDLElBQUksT0FBTyxjQUFjLEtBQUssUUFBUSxJQUFJLElBQUEsMEJBQWtCLEVBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztZQUM3RSxJQUFJLENBQUM7Z0JBQ0gsZUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hELE9BQU87WUFDVCxDQUFDO1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDWCxNQUFNLElBQUksZ0NBQXFCLENBQUMsNENBQTRDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbkYsQ0FBQztRQUNILENBQUM7UUFDRCxLQUFLLENBQUMsc0JBQXNCLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELGtCQUFrQjtJQUNSLGtCQUFrQixDQUFDLGNBQXNCLEVBQUUsYUFBdUI7UUFDMUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sSUFBSSxrQ0FBdUIsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7UUFDRCxJQUFJLElBQUEsMEJBQWtCLEVBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztZQUN2QyxPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxjQUFjLENBQThCLENBQUM7UUFDaEYsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDLGtCQUFrQixDQUFDLGNBQWMsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssb0JBQW9CLENBQUMsY0FBc0I7UUFDakQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUMsTUFBTSxPQUFPLEdBQUcsZUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBVSxDQUFDO1lBRXpELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsRUFBRSxFQUFFLENBQUM7Z0JBQ25ELE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO1lBQzFGLENBQUM7WUFFRCxNQUFNLFdBQVcsR0FBRyxDQUFDLEdBQVcsRUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3ZGLE1BQU0sV0FBVyxHQUFHLENBQUMsR0FBVyxFQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBRTVGLE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFXLENBQUMsQ0FBQztZQUNsRCxNQUFNLG9CQUFvQixHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFXLENBQUMsQ0FBQztZQUMvRCxNQUFNLFlBQVksR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBVyxDQUFDLENBQUM7WUFDdkQsTUFBTSxHQUFHLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQVcsQ0FBQyxDQUFDO1lBQzlDLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQWUsQ0FBQztZQUM3QyxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBVyxDQUFDLENBQUM7WUFDaEQsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEVBQUUsQ0FBVyxDQUFDO1lBRTFDLE1BQU0sS0FBSyxHQUFnRCxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUNyRixFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBWTtnQkFDdkIsS0FBSyxFQUFFLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFXLENBQUM7Z0JBQ3RDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFRO2FBQ3RCLENBQUMsQ0FBQyxDQUFDO1lBRUosTUFBTSxVQUFVLEdBQXFCLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBRTNGLElBQUksU0FBMEQsQ0FBQztZQUMvRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLElBQUksRUFBRSxJQUFJLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSyxPQUFPLENBQUMsRUFBRSxDQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUM5RSxNQUFNLFFBQVEsR0FBRyxlQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFXLENBQUMsQ0FBQztnQkFDOUQsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLEVBQUUsRUFBRSxDQUFDO29CQUMzQixNQUFNLENBQUMsR0FBRyxlQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBUSxDQUFDO29CQUM3RCxNQUFNLENBQUMsR0FBRyxlQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBUSxDQUFDO29CQUM5RCxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ3ZCLE1BQU0sT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDbkMsU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQztnQkFDaEMsQ0FBQztZQUNILENBQUM7WUFFRCxNQUFNLFFBQVEsR0FBRyxXQUFXLElBQUksV0FBVyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUUsV0FBdUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBRTVGLE1BQU0sU0FBUyxHQUE0QjtnQkFDekMsSUFBSSxFQUFFLCtCQUFtQjtnQkFDekIsT0FBTztnQkFDUCxLQUFLO2dCQUNMLFlBQVk7Z0JBQ1osb0JBQW9CO2dCQUNwQixHQUFHO2dCQUNILEtBQUs7Z0JBQ0wsVUFBVSxFQUFFLEVBQUU7Z0JBQ2QsUUFBUTthQUNULENBQUM7WUFFRixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztZQUNwQixJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztZQUNoQixJQUFJLENBQUMsYUFBYSxHQUFHLFlBQVksQ0FBQztZQUNsQyxJQUFJLENBQUMscUJBQXFCLEdBQUcsb0JBQW9CLENBQUM7WUFDbEQsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7WUFDMUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7WUFDN0IsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFNBQVMsQ0FBQztZQUVwQyxNQUFNLEVBQUUsR0FBRyxJQUFJLDhCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3pFLElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ2QsRUFBRSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM3QixDQUFDO1lBQ0QsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLElBQUksQ0FBQyxZQUFZLGdDQUFxQjtnQkFBRSxNQUFNLENBQUMsQ0FBQztZQUNoRCxNQUFNLElBQUksZ0NBQXFCLENBQUMsNkNBQTZDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEYsQ0FBQztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSyxxQkFBcUIsQ0FBQyxJQUErQztRQUMzRSxNQUFNLEtBQUssR0FBRyxJQUFJLGVBQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLHVDQUE0QixDQUFDLENBQUM7UUFDdkUsSUFBSSxDQUFDO1lBQ0gsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4RSxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFXLENBQUM7WUFDdkMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQ2xELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQVcsQ0FBQztZQUV6QyxNQUFNLE1BQU0sR0FBRyxJQUFBLDBCQUFrQixFQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRS9DLE1BQU0sUUFBUSxHQUFHLGVBQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3RELE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBRW5GLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUN6RCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFBLDBCQUFrQixFQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2pGLENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ08sS0FBSyxDQUFDLG1CQUFtQjtRQUNqQyxJQUNFLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUztZQUN6QixJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVM7WUFDdkIsSUFBSSxDQUFDLGFBQWEsS0FBSyxTQUFTO1lBQ2hDLElBQUksQ0FBQyxxQkFBcUIsS0FBSyxTQUFTLEVBQ3hDLENBQUM7WUFDRCxNQUFNLElBQUksZ0NBQXFCLENBQUMsd0RBQXdELENBQUMsQ0FBQztRQUM1RixDQUFDO1FBRUQsSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUNQLEdBQUcsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRTtZQUNsQyxRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDOUIsT0FBTyxFQUFFO2dCQUNQLFlBQVksRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsRUFBRTtnQkFDM0Msb0JBQW9CLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsRUFBRTthQUM1RDtTQUNGLENBQUMsQ0FBQztRQUVILE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFcEUsTUFBTSxTQUFTLEdBQTRCO1lBQ3pDLElBQUksRUFBRSwrQkFBbUI7WUFDekIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxFQUFFO1lBQzVDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNsQixZQUFZLEVBQUUsSUFBSSxDQUFDLGFBQWE7WUFDaEMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLHFCQUFxQjtZQUNoRCxHQUFHLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZCxLQUFLO1lBQ0wsVUFBVSxFQUFFLEVBQUU7WUFDZCxRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVM7U0FDekIsQ0FBQztRQUVGLE1BQU0sRUFBRSxHQUFHLElBQUksOEJBQWdCLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRTlFLElBQUksSUFBSSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQzdELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUMsR0FBSSxDQUFDO1lBQy9DLE1BQU0sV0FBVyxHQUFHLE1BQU0sRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3pDLE1BQU0sT0FBTyxHQUFHLGVBQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLGVBQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDM0UsTUFBTSxVQUFVLEdBQUcsSUFBSSxlQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDM0QsTUFBTSxHQUFHLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxlQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ2xFLEVBQUUsQ0FBQyxZQUFZLENBQUM7Z0JBQ2QsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFRO2dCQUNmLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBUTtnQkFDZixPQUFPLEVBQUUsR0FBRyxDQUFDLGFBQWEsSUFBSSxDQUFDO2FBQ2hDLENBQUMsQ0FBQztRQUNMLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ25DLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDM0MsQ0FBQztRQUVELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILFlBQVksQ0FBQyxTQUF5QjtRQUNwQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDaEMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsUUFBUSxDQUFDLFlBQW9CO1FBQzNCLElBQUksQ0FBQyxJQUFBLHNCQUFjLEVBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztZQUNsQyxNQUFNLElBQUksZ0NBQXFCLENBQUMsOEJBQThCLFlBQVksRUFBRSxDQUFDLENBQUM7UUFDaEYsQ0FBQztRQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsWUFBdUIsQ0FBQztRQUN6QyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxLQUFhO1FBQ2pCLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2QsTUFBTSxJQUFJLGdDQUFxQixDQUFDLGtCQUFrQixLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzdELENBQUM7UUFDRCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNwQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEdBQUcsQ0FBQyxHQUFvQjtRQUN0QixNQUFNLFFBQVEsR0FBRyxPQUFPLEdBQUcsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQzdELElBQUksUUFBUSxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ25CLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyxzQkFBc0IsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUMvRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUM7UUFDckIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxZQUFZLENBQUMsWUFBNkI7UUFDeEMsTUFBTSxRQUFRLEdBQUcsT0FBTyxZQUFZLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQztRQUN4RixJQUFJLFFBQVEsR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUNsQixNQUFNLElBQUksZ0NBQXFCLENBQUMseUJBQXlCLFlBQVksRUFBRSxDQUFDLENBQUM7UUFDM0UsQ0FBQztRQUNELElBQUksQ0FBQyxhQUFhLEdBQUcsUUFBUSxDQUFDO1FBQzlCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsb0JBQW9CLENBQUMsb0JBQXFDO1FBQ3hELE1BQU0sUUFBUSxHQUFHLE9BQU8sb0JBQW9CLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUM7UUFDaEgsSUFBSSxRQUFRLEdBQUcsRUFBRSxFQUFFLENBQUM7WUFDbEIsTUFBTSxJQUFJLGdDQUFxQixDQUFDLGlDQUFpQyxvQkFBb0IsRUFBRSxDQUFDLENBQUM7UUFDM0YsQ0FBQztRQUNELElBQUksQ0FBQyxxQkFBcUIsR0FBRyxRQUFRLENBQUM7UUFDdEMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsYUFBYTtRQUNYLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsV0FBVztRQUNULE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLGlCQUFpQixDQUFDLFNBQXlCO1FBQ2pELElBQUksQ0FBQyxJQUFBLHNCQUFjLEVBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDckMsTUFBTSxJQUFJLGdDQUFxQixDQUFDLDBCQUEwQixTQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUMvRSxDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUEsc0JBQWMsRUFBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUNsQyxNQUFNLElBQUksZ0NBQXFCLENBQUMsOEJBQThCLFNBQVMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2hGLENBQUM7UUFFRCxJQUFJLENBQUMsSUFBQSwwQkFBa0IsRUFBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUMxQyxNQUFNLElBQUksZ0NBQXFCLENBQUMsbUJBQW1CLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3pFLENBQUM7UUFFRCxJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssU0FBUyxJQUFJLENBQUMsSUFBQSxxQkFBYSxFQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ25FLE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO1FBQ2xGLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxlQUFlLENBQUMsRUFBa0I7UUFDeEMsTUFBTSxhQUFhLEdBQUcsSUFBQSwwQkFBa0IsRUFBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEQsTUFBTSxJQUFJLEdBQUcsSUFBQSxtQ0FBMkIsRUFBQyxFQUFFLENBQUMsRUFBRSxFQUFFLGFBQWEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFeEUsT0FBTztZQUNMLEVBQUUsRUFBRSxFQUFFLENBQUMsS0FBSztZQUNaLElBQUk7WUFDSixLQUFLLEVBQUUsRUFBRTtTQUNWLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUF2WEQsMERBdVhDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUSVAtMjAgVHJhbnNhY3Rpb24gQnVpbGRlclxuICpcbiAqIFVuaWZpZWQgYnVpbGRlciBmb3IgVElQLTIwIHRyYW5zYWN0aW9ucyBzdXBwb3J0aW5nOlxuICogLSBTaW5nbGUgb3IgYmF0Y2ggb3BlcmF0aW9uc1xuICogLSBQZXItb3BlcmF0aW9uIG1lbW9zIGZvciB0cmFja2luZ1xuICogLSBDdXN0b20gZmVlIHRva2VuIHNlbGVjdGlvblxuICogLSBFSVAtNzcwMiBBY2NvdW50IEFic3RyYWN0aW9uICh0eXBlIDB4NzYpXG4gKi9cblxuaW1wb3J0IHtcbiAgVHJhbnNhY3Rpb24gYXMgRXRoVHJhbnNhY3Rpb24sXG4gIFRyYW5zYWN0aW9uQnVpbGRlciBhcyBBYnN0cmFjdFRyYW5zYWN0aW9uQnVpbGRlcixcbiAgVHJhbnNmZXJCdWlsZGVyLFxufSBmcm9tICdAYml0Z28vYWJzdHJhY3QtZXRoJztcbmltcG9ydCB7XG4gIEJhc2VUcmFuc2FjdGlvbixcbiAgQnVpbGRUcmFuc2FjdGlvbkVycm9yLFxuICBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcixcbiAgUGFyc2VUcmFuc2FjdGlvbkVycm9yLFxufSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgQmFzZUNvaW4gYXMgQ29pbkNvbmZpZyB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7IGV0aGVycyB9IGZyb20gJ2V0aGVycyc7XG5pbXBvcnQgeyBBZGRyZXNzLCBIZXgsIFRpcDIwT3BlcmF0aW9uIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBUaXAyMFRyYW5zYWN0aW9uLCBUaXAyMFRyYW5zYWN0aW9uUmVxdWVzdCB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHtcbiAgYW1vdW50VG9UaXAyMFVuaXRzLFxuICBlbmNvZGVUaXAyMFRyYW5zZmVyV2l0aE1lbW8sXG4gIGlzVGlwMjBUcmFuc2FjdGlvbixcbiAgaXNWYWxpZEFkZHJlc3MsXG4gIGlzVmFsaWRNZW1vSWQsXG4gIGlzVmFsaWRUaXAyMEFtb3VudCxcbiAgdGlwMjBVbml0c1RvQW1vdW50LFxufSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IFRJUDIwX1RSQU5TRkVSX1dJVEhfTUVNT19BQkkgfSBmcm9tICcuL3RpcDIwQWJpJztcbmltcG9ydCB7IEFBX1RSQU5TQUNUSU9OX1RZUEUgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbi8qKlxuICogVHJhbnNhY3Rpb24gQnVpbGRlciBmb3IgVElQLTIwIHRva2VucyBvbiBUZW1wbyBibG9ja2NoYWluXG4gKiBFeHRlbmRzIGFic3RyYWN0LWV0aCBUcmFuc2FjdGlvbkJ1aWxkZXIgd2l0aCBUZW1wby1zcGVjaWZpYyBmZWF0dXJlc1xuICovXG5leHBvcnQgY2xhc3MgVGlwMjBUcmFuc2FjdGlvbkJ1aWxkZXIgZXh0ZW5kcyBBYnN0cmFjdFRyYW5zYWN0aW9uQnVpbGRlciB7XG4gIHByaXZhdGUgb3BlcmF0aW9uczogVGlwMjBPcGVyYXRpb25bXSA9IFtdO1xuICBwcml2YXRlIF9mZWVUb2tlbj86IEFkZHJlc3M7XG4gIHByaXZhdGUgX25vbmNlPzogbnVtYmVyO1xuICBwcml2YXRlIF9nYXM/OiBiaWdpbnQ7XG4gIHByaXZhdGUgX21heEZlZVBlckdhcz86IGJpZ2ludDtcbiAgcHJpdmF0ZSBfbWF4UHJpb3JpdHlGZWVQZXJHYXM/OiBiaWdpbnQ7XG4gIHByaXZhdGUgX3Jlc3RvcmVkU2lnbmF0dXJlPzogeyByOiBIZXg7IHM6IEhleDsgeVBhcml0eTogbnVtYmVyIH07XG5cbiAgY29uc3RydWN0b3IoX2NvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoX2NvaW5Db25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudCB0aGUgdHJhbnNmZXIgbWV0aG9kIGZyb20gYWJzdHJhY3QgY2xhc3NcbiAgICogTm90ZTogRm9yIFRJUC0yMCB0cmFuc2FjdGlvbnMsIHVzZSBhZGRPcGVyYXRpb24oKSBpbnN0ZWFkXG4gICAqL1xuICB0cmFuc2ZlcihkYXRhPzogc3RyaW5nLCBpc0ZpcnN0U2lnbmVyPzogYm9vbGVhbik6IFRyYW5zZmVyQnVpbGRlciB7XG4gICAgY29uc3QgdHJhbnNmZXJCdWlsZGVyID0gbmV3IFRyYW5zZmVyQnVpbGRlcih1bmRlZmluZWQsIGlzRmlyc3RTaWduZXIpO1xuICAgIGlmIChkYXRhKSB7XG4gICAgICB0cmFuc2ZlckJ1aWxkZXIuZGF0YShkYXRhKTtcbiAgICB9XG4gICAgdGhpcy5fdHJhbnNmZXIgPSB0cmFuc2ZlckJ1aWxkZXI7XG4gICAgcmV0dXJuIHRyYW5zZmVyQnVpbGRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSB0aGUgdHJhbnNhY3Rpb24gaGFzIGFsbCByZXF1aXJlZCBmaWVsZHMgZm9yIFRlbXBvIEFBIHRyYW5zYWN0aW9ucy5cbiAgICogT3ZlcnJpZGVzIHBhcmVudCBjbGFzcyB2YWxpZGF0aW9uIHNpbmNlIEFBIHRyYW5zYWN0aW9ucyB1c2UgYSBkaWZmZXJlbnQgbW9kZWxcbiAgICogKG9wZXJhdGlvbnMtYmFzZWQgcmF0aGVyIHRoYW4gc2luZ2xlIGNvbnRyYWN0IGFkZHJlc3MpLlxuICAgKlxuICAgKiBAdGhyb3dzIEJ1aWxkVHJhbnNhY3Rpb25FcnJvciBpZiB2YWxpZGF0aW9uIGZhaWxzXG4gICAqL1xuICB2YWxpZGF0ZVRyYW5zYWN0aW9uKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm9wZXJhdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdBdCBsZWFzdCBvbmUgb3BlcmF0aW9uIGlzIHJlcXVpcmVkIHRvIGJ1aWxkIGEgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fbm9uY2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignTm9uY2UgaXMgcmVxdWlyZWQgdG8gYnVpbGQgYSB0cmFuc2FjdGlvbicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9nYXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignR2FzIGxpbWl0IGlzIHJlcXVpcmVkIHRvIGJ1aWxkIGEgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fbWF4RmVlUGVyR2FzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ21heEZlZVBlckdhcyBpcyByZXF1aXJlZCB0byBidWlsZCBhIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX21heFByaW9yaXR5RmVlUGVyR2FzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ21heFByaW9yaXR5RmVlUGVyR2FzIGlzIHJlcXVpcmVkIHRvIGJ1aWxkIGEgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsaWRhdGVSYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbjogYW55KTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiByYXdUcmFuc2FjdGlvbiA9PT0gJ3N0cmluZycgJiYgaXNUaXAyMFRyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZXRoZXJzLnV0aWxzLlJMUC5kZWNvZGUoJzB4JyArIHJhd1RyYW5zYWN0aW9uLnNsaWNlKDQpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2VUcmFuc2FjdGlvbkVycm9yKGBGYWlsZWQgdG8gUkxQIGRlY29kZSBUSVAtMjAgdHJhbnNhY3Rpb246ICR7ZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc3VwZXIudmFsaWRhdGVSYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbik7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIGZyb21JbXBsZW1lbnRhdGlvbihyYXdUcmFuc2FjdGlvbjogc3RyaW5nLCBpc0ZpcnN0U2lnbmVyPzogYm9vbGVhbik6IEV0aFRyYW5zYWN0aW9uIHtcbiAgICBpZiAoIXJhd1RyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ1JhdyB0cmFuc2FjdGlvbiBpcyBlbXB0eScpO1xuICAgIH1cbiAgICBpZiAoaXNUaXAyMFRyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZnJvbVRpcDIwVHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb24pIGFzIHVua25vd24gYXMgRXRoVHJhbnNhY3Rpb247XG4gICAgfVxuICAgIHJldHVybiBzdXBlci5mcm9tSW1wbGVtZW50YXRpb24ocmF3VHJhbnNhY3Rpb24sIGlzRmlyc3RTaWduZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIGEgdHlwZSAweDc2IHRyYW5zYWN0aW9uIGFuZCByZXN0b3JlIGJ1aWxkZXIgc3RhdGUuXG4gICAqIFJMUCBmaWVsZCBsYXlvdXQgbWlycm9ycyBidWlsZEJhc2VSbHBEYXRhKCkgaW4gdHJhbnNhY3Rpb24udHMuXG4gICAqL1xuICBwcml2YXRlIGZyb21UaXAyMFRyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcpOiBUaXAyMFRyYW5zYWN0aW9uIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmxwSGV4ID0gJzB4JyArIHJhd1RyYW5zYWN0aW9uLnNsaWNlKDQpO1xuICAgICAgY29uc3QgZGVjb2RlZCA9IGV0aGVycy51dGlscy5STFAuZGVjb2RlKHJscEhleCkgYXMgYW55W107XG5cbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShkZWNvZGVkKSB8fCBkZWNvZGVkLmxlbmd0aCA8IDEzKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoJ0ludmFsaWQgVElQLTIwIHRyYW5zYWN0aW9uOiB1bmV4cGVjdGVkIFJMUCBzdHJ1Y3R1cmUnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFyc2VCaWdJbnQgPSAoaGV4OiBzdHJpbmcpOiBiaWdpbnQgPT4gKCFoZXggfHwgaGV4ID09PSAnMHgnID8gMG4gOiBCaWdJbnQoaGV4KSk7XG4gICAgICBjb25zdCBwYXJzZUhleEludCA9IChoZXg6IHN0cmluZyk6IG51bWJlciA9PiAoIWhleCB8fCBoZXggPT09ICcweCcgPyAwIDogcGFyc2VJbnQoaGV4LCAxNikpO1xuXG4gICAgICBjb25zdCBjaGFpbklkID0gcGFyc2VIZXhJbnQoZGVjb2RlZFswXSBhcyBzdHJpbmcpO1xuICAgICAgY29uc3QgbWF4UHJpb3JpdHlGZWVQZXJHYXMgPSBwYXJzZUJpZ0ludChkZWNvZGVkWzFdIGFzIHN0cmluZyk7XG4gICAgICBjb25zdCBtYXhGZWVQZXJHYXMgPSBwYXJzZUJpZ0ludChkZWNvZGVkWzJdIGFzIHN0cmluZyk7XG4gICAgICBjb25zdCBnYXMgPSBwYXJzZUJpZ0ludChkZWNvZGVkWzNdIGFzIHN0cmluZyk7XG4gICAgICBjb25zdCBjYWxsc1R1cGxlcyA9IGRlY29kZWRbNF0gYXMgc3RyaW5nW11bXTtcbiAgICAgIGNvbnN0IG5vbmNlID0gcGFyc2VIZXhJbnQoZGVjb2RlZFs3XSBhcyBzdHJpbmcpO1xuICAgICAgY29uc3QgZmVlVG9rZW5SYXcgPSBkZWNvZGVkWzEwXSBhcyBzdHJpbmc7XG5cbiAgICAgIGNvbnN0IGNhbGxzOiB7IHRvOiBBZGRyZXNzOyBkYXRhOiBIZXg7IHZhbHVlOiBiaWdpbnQgfVtdID0gY2FsbHNUdXBsZXMubWFwKCh0dXBsZSkgPT4gKHtcbiAgICAgICAgdG86IHR1cGxlWzBdIGFzIEFkZHJlc3MsXG4gICAgICAgIHZhbHVlOiBwYXJzZUJpZ0ludCh0dXBsZVsxXSBhcyBzdHJpbmcpLFxuICAgICAgICBkYXRhOiB0dXBsZVsyXSBhcyBIZXgsXG4gICAgICB9KSk7XG5cbiAgICAgIGNvbnN0IG9wZXJhdGlvbnM6IFRpcDIwT3BlcmF0aW9uW10gPSBjYWxscy5tYXAoKGNhbGwpID0+IHRoaXMuZGVjb2RlQ2FsbFRvT3BlcmF0aW9uKGNhbGwpKTtcblxuICAgICAgbGV0IHNpZ25hdHVyZTogeyByOiBIZXg7IHM6IEhleDsgeVBhcml0eTogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoZGVjb2RlZC5sZW5ndGggPj0gMTQgJiYgZGVjb2RlZFsxM10gJiYgKGRlY29kZWRbMTNdIGFzIHN0cmluZykubGVuZ3RoID4gMikge1xuICAgICAgICBjb25zdCBzaWdCeXRlcyA9IGV0aGVycy51dGlscy5hcnJheWlmeShkZWNvZGVkWzEzXSBhcyBzdHJpbmcpO1xuICAgICAgICBpZiAoc2lnQnl0ZXMubGVuZ3RoID09PSA2NSkge1xuICAgICAgICAgIGNvbnN0IHIgPSBldGhlcnMudXRpbHMuaGV4bGlmeShzaWdCeXRlcy5zbGljZSgwLCAzMikpIGFzIEhleDtcbiAgICAgICAgICBjb25zdCBzID0gZXRoZXJzLnV0aWxzLmhleGxpZnkoc2lnQnl0ZXMuc2xpY2UoMzIsIDY0KSkgYXMgSGV4O1xuICAgICAgICAgIGNvbnN0IHYgPSBzaWdCeXRlc1s2NF07XG4gICAgICAgICAgY29uc3QgeVBhcml0eSA9IHYgPiAxID8gdiAtIDI3IDogdjtcbiAgICAgICAgICBzaWduYXR1cmUgPSB7IHIsIHMsIHlQYXJpdHkgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBmZWVUb2tlbiA9IGZlZVRva2VuUmF3ICYmIGZlZVRva2VuUmF3ICE9PSAnMHgnID8gKGZlZVRva2VuUmF3IGFzIEFkZHJlc3MpIDogdW5kZWZpbmVkO1xuXG4gICAgICBjb25zdCB0eFJlcXVlc3Q6IFRpcDIwVHJhbnNhY3Rpb25SZXF1ZXN0ID0ge1xuICAgICAgICB0eXBlOiBBQV9UUkFOU0FDVElPTl9UWVBFLFxuICAgICAgICBjaGFpbklkLFxuICAgICAgICBub25jZSxcbiAgICAgICAgbWF4RmVlUGVyR2FzLFxuICAgICAgICBtYXhQcmlvcml0eUZlZVBlckdhcyxcbiAgICAgICAgZ2FzLFxuICAgICAgICBjYWxscyxcbiAgICAgICAgYWNjZXNzTGlzdDogW10sXG4gICAgICAgIGZlZVRva2VuLFxuICAgICAgfTtcblxuICAgICAgdGhpcy5fbm9uY2UgPSBub25jZTtcbiAgICAgIHRoaXMuX2dhcyA9IGdhcztcbiAgICAgIHRoaXMuX21heEZlZVBlckdhcyA9IG1heEZlZVBlckdhcztcbiAgICAgIHRoaXMuX21heFByaW9yaXR5RmVlUGVyR2FzID0gbWF4UHJpb3JpdHlGZWVQZXJHYXM7XG4gICAgICB0aGlzLl9mZWVUb2tlbiA9IGZlZVRva2VuO1xuICAgICAgdGhpcy5vcGVyYXRpb25zID0gb3BlcmF0aW9ucztcbiAgICAgIHRoaXMuX3Jlc3RvcmVkU2lnbmF0dXJlID0gc2lnbmF0dXJlO1xuXG4gICAgICBjb25zdCB0eCA9IG5ldyBUaXAyMFRyYW5zYWN0aW9uKHRoaXMuX2NvaW5Db25maWcsIHR4UmVxdWVzdCwgb3BlcmF0aW9ucyk7XG4gICAgICBpZiAoc2lnbmF0dXJlKSB7XG4gICAgICAgIHR4LnNldFNpZ25hdHVyZShzaWduYXR1cmUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHR4O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgUGFyc2VUcmFuc2FjdGlvbkVycm9yKSB0aHJvdyBlO1xuICAgICAgdGhyb3cgbmV3IFBhcnNlVHJhbnNhY3Rpb25FcnJvcihgRmFpbGVkIHRvIGRlc2VyaWFsaXplIFRJUC0yMCB0cmFuc2FjdGlvbjogJHtlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGUgYSBzaW5nbGUgQUEgY2FsbCdzIGRhdGEgYmFjayBpbnRvIGEgVGlwMjBPcGVyYXRpb24uXG4gICAqIEV4cGVjdHMgdGhlIGNhbGwgZGF0YSB0byBlbmNvZGUgdHJhbnNmZXJXaXRoTWVtbyhhZGRyZXNzLCB1aW50MjU2LCBieXRlczMyKS5cbiAgICovXG4gIHByaXZhdGUgZGVjb2RlQ2FsbFRvT3BlcmF0aW9uKGNhbGw6IHsgdG86IEFkZHJlc3M7IGRhdGE6IEhleDsgdmFsdWU6IGJpZ2ludCB9KTogVGlwMjBPcGVyYXRpb24ge1xuICAgIGNvbnN0IGlmYWNlID0gbmV3IGV0aGVycy51dGlscy5JbnRlcmZhY2UoVElQMjBfVFJBTlNGRVJfV0lUSF9NRU1PX0FCSSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRlY29kZWQgPSBpZmFjZS5kZWNvZGVGdW5jdGlvbkRhdGEoJ3RyYW5zZmVyV2l0aE1lbW8nLCBjYWxsLmRhdGEpO1xuICAgICAgY29uc3QgdG9BZGRyZXNzID0gZGVjb2RlZFswXSBhcyBzdHJpbmc7XG4gICAgICBjb25zdCBhbW91bnRVbml0cyA9IEJpZ0ludChkZWNvZGVkWzFdLnRvU3RyaW5nKCkpO1xuICAgICAgY29uc3QgbWVtb0J5dGVzMzIgPSBkZWNvZGVkWzJdIGFzIHN0cmluZztcblxuICAgICAgY29uc3QgYW1vdW50ID0gdGlwMjBVbml0c1RvQW1vdW50KGFtb3VudFVuaXRzKTtcblxuICAgICAgY29uc3Qgc3RyaXBwZWQgPSBldGhlcnMudXRpbHMuc3RyaXBaZXJvcyhtZW1vQnl0ZXMzMik7XG4gICAgICBjb25zdCBtZW1vID0gc3RyaXBwZWQubGVuZ3RoID4gMCA/IGV0aGVycy51dGlscy50b1V0ZjhTdHJpbmcoc3RyaXBwZWQpIDogdW5kZWZpbmVkO1xuXG4gICAgICByZXR1cm4geyB0b2tlbjogY2FsbC50bywgdG86IHRvQWRkcmVzcywgYW1vdW50LCBtZW1vIH07XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4geyB0b2tlbjogY2FsbC50bywgdG86IGNhbGwudG8sIGFtb3VudDogdGlwMjBVbml0c1RvQW1vdW50KGNhbGwudmFsdWUpIH07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHRoZSB0cmFuc2FjdGlvbiBmcm9tIGNvbmZpZ3VyZWQgVElQLTIwIG9wZXJhdGlvbnMgYW5kIHRyYW5zYWN0aW9uIHBhcmFtZXRlcnMuXG4gICAqIFNpZ25zIHdpdGggX3NvdXJjZUtleVBhaXIgaWYgaXQgaGFzIGJlZW4gc2V0IHZpYSBzaWduKHsga2V5IH0pLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGJ1aWxkSW1wbGVtZW50YXRpb24oKTogUHJvbWlzZTxCYXNlVHJhbnNhY3Rpb24+IHtcbiAgICBpZiAoXG4gICAgICB0aGlzLl9ub25jZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlzLl9nYXMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgdGhpcy5fbWF4RmVlUGVyR2FzID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHRoaXMuX21heFByaW9yaXR5RmVlUGVyR2FzID09PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ1RyYW5zYWN0aW9uIHZhbGlkYXRpb24gZmFpbGVkOiBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcycpO1xuICAgIH1cblxuICAgIHRoaXMuZmVlKHtcbiAgICAgIGZlZTogdGhpcy5fbWF4RmVlUGVyR2FzLnRvU3RyaW5nKCksXG4gICAgICBnYXNMaW1pdDogdGhpcy5fZ2FzLnRvU3RyaW5nKCksXG4gICAgICBlaXAxNTU5OiB7XG4gICAgICAgIG1heEZlZVBlckdhczogdGhpcy5fbWF4RmVlUGVyR2FzLnRvU3RyaW5nKCksXG4gICAgICAgIG1heFByaW9yaXR5RmVlUGVyR2FzOiB0aGlzLl9tYXhQcmlvcml0eUZlZVBlckdhcy50b1N0cmluZygpLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGNhbGxzID0gdGhpcy5vcGVyYXRpb25zLm1hcCgob3ApID0+IHRoaXMub3BlcmF0aW9uVG9DYWxsKG9wKSk7XG5cbiAgICBjb25zdCB0eFJlcXVlc3Q6IFRpcDIwVHJhbnNhY3Rpb25SZXF1ZXN0ID0ge1xuICAgICAgdHlwZTogQUFfVFJBTlNBQ1RJT05fVFlQRSxcbiAgICAgIGNoYWluSWQ6IHRoaXMuX2NvbW1vbi5jaGFpbklkQk4oKS50b051bWJlcigpLFxuICAgICAgbm9uY2U6IHRoaXMuX25vbmNlLFxuICAgICAgbWF4RmVlUGVyR2FzOiB0aGlzLl9tYXhGZWVQZXJHYXMsXG4gICAgICBtYXhQcmlvcml0eUZlZVBlckdhczogdGhpcy5fbWF4UHJpb3JpdHlGZWVQZXJHYXMsXG4gICAgICBnYXM6IHRoaXMuX2dhcyxcbiAgICAgIGNhbGxzLFxuICAgICAgYWNjZXNzTGlzdDogW10sXG4gICAgICBmZWVUb2tlbjogdGhpcy5fZmVlVG9rZW4sXG4gICAgfTtcblxuICAgIGNvbnN0IHR4ID0gbmV3IFRpcDIwVHJhbnNhY3Rpb24odGhpcy5fY29pbkNvbmZpZywgdHhSZXF1ZXN0LCB0aGlzLm9wZXJhdGlvbnMpO1xuXG4gICAgaWYgKHRoaXMuX3NvdXJjZUtleVBhaXIgJiYgdGhpcy5fc291cmNlS2V5UGFpci5nZXRLZXlzKCkucHJ2KSB7XG4gICAgICBjb25zdCBwcnYgPSB0aGlzLl9zb3VyY2VLZXlQYWlyLmdldEtleXMoKS5wcnYhO1xuICAgICAgY29uc3QgdW5zaWduZWRIZXggPSBhd2FpdCB0eC5zZXJpYWxpemUoKTtcbiAgICAgIGNvbnN0IG1zZ0hhc2ggPSBldGhlcnMudXRpbHMua2VjY2FrMjU2KGV0aGVycy51dGlscy5hcnJheWlmeSh1bnNpZ25lZEhleCkpO1xuICAgICAgY29uc3Qgc2lnbmluZ0tleSA9IG5ldyBldGhlcnMudXRpbHMuU2lnbmluZ0tleSgnMHgnICsgcHJ2KTtcbiAgICAgIGNvbnN0IHNpZyA9IHNpZ25pbmdLZXkuc2lnbkRpZ2VzdChldGhlcnMudXRpbHMuYXJyYXlpZnkobXNnSGFzaCkpO1xuICAgICAgdHguc2V0U2lnbmF0dXJlKHtcbiAgICAgICAgcjogc2lnLnIgYXMgSGV4LFxuICAgICAgICBzOiBzaWcucyBhcyBIZXgsXG4gICAgICAgIHlQYXJpdHk6IHNpZy5yZWNvdmVyeVBhcmFtID8/IDAsXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3Jlc3RvcmVkU2lnbmF0dXJlKSB7XG4gICAgICB0eC5zZXRTaWduYXR1cmUodGhpcy5fcmVzdG9yZWRTaWduYXR1cmUpO1xuICAgIH1cblxuICAgIHJldHVybiB0eDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBzaW5nbGUgb3BlcmF0aW9uIHRvIHRoZSB0cmFuc2FjdGlvblxuICAgKiBDYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIHRvIGNyZWF0ZSBiYXRjaCB0cmFuc2FjdGlvbnNcbiAgICpcbiAgICogQHBhcmFtIG9wZXJhdGlvbiAtIFRJUC0yMCBvcGVyYXRpb24gd2l0aCB0b2tlbiwgcmVjaXBpZW50LCBhbW91bnQsIGFuZCBvcHRpb25hbCBtZW1vXG4gICAqIEByZXR1cm5zIHRoaXMgYnVpbGRlciBpbnN0YW5jZSBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGFkZE9wZXJhdGlvbihvcGVyYXRpb246IFRpcDIwT3BlcmF0aW9uKTogdGhpcyB7XG4gICAgdGhpcy52YWxpZGF0ZU9wZXJhdGlvbihvcGVyYXRpb24pO1xuICAgIHRoaXMub3BlcmF0aW9ucy5wdXNoKG9wZXJhdGlvbik7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHdoaWNoIFRJUC0yMCB0b2tlbiB3aWxsIGJlIHVzZWQgdG8gcGF5IHRyYW5zYWN0aW9uIGZlZXNcbiAgICogVGhpcyBpcyBhIGdsb2JhbCBzZXR0aW5nIGZvciB0aGUgZW50aXJlIHRyYW5zYWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB0b2tlbkFkZHJlc3MgLSBBZGRyZXNzIG9mIHRoZSBUSVAtMjAgdG9rZW4gdG8gdXNlIGZvciBmZWVzXG4gICAqIEByZXR1cm5zIHRoaXMgYnVpbGRlciBpbnN0YW5jZSBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGZlZVRva2VuKHRva2VuQWRkcmVzczogc3RyaW5nKTogdGhpcyB7XG4gICAgaWYgKCFpc1ZhbGlkQWRkcmVzcyh0b2tlbkFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIGZlZSB0b2tlbiBhZGRyZXNzOiAke3Rva2VuQWRkcmVzc31gKTtcbiAgICB9XG4gICAgdGhpcy5fZmVlVG9rZW4gPSB0b2tlbkFkZHJlc3MgYXMgQWRkcmVzcztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHRyYW5zYWN0aW9uIG5vbmNlXG4gICAqXG4gICAqIEBwYXJhbSBub25jZSAtIFRyYW5zYWN0aW9uIG5vbmNlXG4gICAqIEByZXR1cm5zIHRoaXMgYnVpbGRlciBpbnN0YW5jZSBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG5vbmNlKG5vbmNlOiBudW1iZXIpOiB0aGlzIHtcbiAgICBpZiAobm9uY2UgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIG5vbmNlOiAke25vbmNlfWApO1xuICAgIH1cbiAgICB0aGlzLl9ub25jZSA9IG5vbmNlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgZ2FzIGxpbWl0IGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIGdhcyAtIEdhcyBsaW1pdFxuICAgKiBAcmV0dXJucyB0aGlzIGJ1aWxkZXIgaW5zdGFuY2UgZm9yIGNoYWluaW5nXG4gICAqL1xuICBnYXMoZ2FzOiBzdHJpbmcgfCBiaWdpbnQpOiB0aGlzIHtcbiAgICBjb25zdCBnYXNWYWx1ZSA9IHR5cGVvZiBnYXMgPT09ICdzdHJpbmcnID8gQmlnSW50KGdhcykgOiBnYXM7XG4gICAgaWYgKGdhc1ZhbHVlIDw9IDBuKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIGdhcyBsaW1pdDogJHtnYXN9YCk7XG4gICAgfVxuICAgIHRoaXMuX2dhcyA9IGdhc1ZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgbWF4aW11bSBmZWUgcGVyIGdhcyAoRUlQLTE1NTkpXG4gICAqXG4gICAqIEBwYXJhbSBtYXhGZWVQZXJHYXMgLSBNYXhpbXVtIGZlZSBwZXIgZ2FzIGluIHdlaVxuICAgKiBAcmV0dXJucyB0aGlzIGJ1aWxkZXIgaW5zdGFuY2UgZm9yIGNoYWluaW5nXG4gICAqL1xuICBtYXhGZWVQZXJHYXMobWF4RmVlUGVyR2FzOiBzdHJpbmcgfCBiaWdpbnQpOiB0aGlzIHtcbiAgICBjb25zdCBmZWVWYWx1ZSA9IHR5cGVvZiBtYXhGZWVQZXJHYXMgPT09ICdzdHJpbmcnID8gQmlnSW50KG1heEZlZVBlckdhcykgOiBtYXhGZWVQZXJHYXM7XG4gICAgaWYgKGZlZVZhbHVlIDwgMG4pIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgbWF4RmVlUGVyR2FzOiAke21heEZlZVBlckdhc31gKTtcbiAgICB9XG4gICAgdGhpcy5fbWF4RmVlUGVyR2FzID0gZmVlVmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBtYXhpbXVtIHByaW9yaXR5IGZlZSBwZXIgZ2FzIChFSVAtMTU1OSlcbiAgICpcbiAgICogQHBhcmFtIG1heFByaW9yaXR5RmVlUGVyR2FzIC0gTWF4aW11bSBwcmlvcml0eSBmZWUgcGVyIGdhcyBpbiB3ZWlcbiAgICogQHJldHVybnMgdGhpcyBidWlsZGVyIGluc3RhbmNlIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgbWF4UHJpb3JpdHlGZWVQZXJHYXMobWF4UHJpb3JpdHlGZWVQZXJHYXM6IHN0cmluZyB8IGJpZ2ludCk6IHRoaXMge1xuICAgIGNvbnN0IGZlZVZhbHVlID0gdHlwZW9mIG1heFByaW9yaXR5RmVlUGVyR2FzID09PSAnc3RyaW5nJyA/IEJpZ0ludChtYXhQcmlvcml0eUZlZVBlckdhcykgOiBtYXhQcmlvcml0eUZlZVBlckdhcztcbiAgICBpZiAoZmVlVmFsdWUgPCAwbikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBtYXhQcmlvcml0eUZlZVBlckdhczogJHttYXhQcmlvcml0eUZlZVBlckdhc31gKTtcbiAgICB9XG4gICAgdGhpcy5fbWF4UHJpb3JpdHlGZWVQZXJHYXMgPSBmZWVWYWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYWxsIG9wZXJhdGlvbnMgaW4gdGhpcyB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBUSVAtMjAgb3BlcmF0aW9uc1xuICAgKi9cbiAgZ2V0T3BlcmF0aW9ucygpOiBUaXAyME9wZXJhdGlvbltdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMub3BlcmF0aW9uc107XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBmZWUgdG9rZW4gYWRkcmVzcyBpZiBzZXRcbiAgICogQHJldHVybnMgRmVlIHRva2VuIGFkZHJlc3Mgb3IgdW5kZWZpbmVkXG4gICAqL1xuICBnZXRGZWVUb2tlbigpOiBBZGRyZXNzIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZmVlVG9rZW47XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYSBzaW5nbGUgb3BlcmF0aW9uXG4gICAqIEBwYXJhbSBvcGVyYXRpb24gLSBPcGVyYXRpb24gdG8gdmFsaWRhdGVcbiAgICogQHRocm93cyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IgaWYgaW52YWxpZFxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZU9wZXJhdGlvbihvcGVyYXRpb246IFRpcDIwT3BlcmF0aW9uKTogdm9pZCB7XG4gICAgaWYgKCFpc1ZhbGlkQWRkcmVzcyhvcGVyYXRpb24udG9rZW4pKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIHRva2VuIGFkZHJlc3M6ICR7b3BlcmF0aW9uLnRva2VufWApO1xuICAgIH1cblxuICAgIGlmICghaXNWYWxpZEFkZHJlc3Mob3BlcmF0aW9uLnRvKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCByZWNpcGllbnQgYWRkcmVzczogJHtvcGVyYXRpb24udG99YCk7XG4gICAgfVxuXG4gICAgaWYgKCFpc1ZhbGlkVGlwMjBBbW91bnQob3BlcmF0aW9uLmFtb3VudCkpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgYW1vdW50OiAke29wZXJhdGlvbi5hbW91bnR9YCk7XG4gICAgfVxuXG4gICAgaWYgKG9wZXJhdGlvbi5tZW1vICE9PSB1bmRlZmluZWQgJiYgIWlzVmFsaWRNZW1vSWQob3BlcmF0aW9uLm1lbW8pKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIG1lbW86IG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlcmApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGEgVElQLTIwIG9wZXJhdGlvbiB0byBhbiBBQSBjYWxsXG4gICAqL1xuICBwcml2YXRlIG9wZXJhdGlvblRvQ2FsbChvcDogVGlwMjBPcGVyYXRpb24pOiB7IHRvOiBBZGRyZXNzOyBkYXRhOiBIZXg7IHZhbHVlOiBiaWdpbnQgfSB7XG4gICAgY29uc3QgYW1vdW50SW5Vbml0cyA9IGFtb3VudFRvVGlwMjBVbml0cyhvcC5hbW91bnQpO1xuICAgIGNvbnN0IGRhdGEgPSBlbmNvZGVUaXAyMFRyYW5zZmVyV2l0aE1lbW8ob3AudG8sIGFtb3VudEluVW5pdHMsIG9wLm1lbW8pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRvOiBvcC50b2tlbixcbiAgICAgIGRhdGEsXG4gICAgICB2YWx1ZTogMG4sXG4gICAgfTtcbiAgfVxufVxuIl19
408
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90cmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7OztHQVFHOzs7QUFFSCxzREFJNkI7QUFDN0IsOENBS3lCO0FBRXpCLG1DQUFnQztBQUVoQywrQ0FBMEU7QUFDMUUsbUNBU2lCO0FBQ2pCLHlDQUEwRDtBQUMxRCwyQ0FBa0Q7QUFFbEQ7OztHQUdHO0FBQ0gsTUFBYSx1QkFBd0IsU0FBUSxpQ0FBMEI7SUFVckUsWUFBWSxXQUFpQztRQUMzQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFWYixlQUFVLEdBQXFCLEVBQUUsQ0FBQztRQUNsQyxhQUFRLEdBQXNCLEVBQUUsQ0FBQztJQVV6QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsUUFBUSxDQUFDLElBQWEsRUFBRSxhQUF1QjtRQUM3QyxNQUFNLGVBQWUsR0FBRyxJQUFJLDhCQUFlLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ3RFLElBQUksSUFBSSxFQUFFLENBQUM7WUFDVCxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdCLENBQUM7UUFDRCxJQUFJLENBQUMsU0FBUyxHQUFHLGVBQWUsQ0FBQztRQUNqQyxPQUFPLGVBQWUsQ0FBQztJQUN6QixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsbUJBQW1CO1FBQ2pCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQy9ELE1BQU0sSUFBSSxnQ0FBcUIsQ0FBQyx1RUFBdUUsQ0FBQyxDQUFDO1FBQzNHLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDOUIsTUFBTSxJQUFJLGdDQUFxQixDQUFD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QyxtQkFBbUIsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDekUsQ0FBQztRQUVELElBQUksU0FBUyxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksQ0FBQyxJQUFBLHFCQUFhLEVBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDbkUsTUFBTSxJQUFJLGdDQUFxQixDQUFDLDhDQUE4QyxDQUFDLENBQUM7UUFDbEYsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLGVBQWUsQ0FBQyxFQUFrQjtRQUN4QyxNQUFNLGFBQWEsR0FBRyxJQUFBLDBCQUFrQixFQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwRCxNQUFNLElBQUksR0FBRyxJQUFBLG1DQUEyQixFQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsYUFBYSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV4RSxPQUFPO1lBQ0wsRUFBRSxFQUFFLEVBQUUsQ0FBQyxLQUFLO1lBQ1osSUFBSTtZQUNKLEtBQUssRUFBRSxFQUFFO1NBQ1YsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQTlhRCwwREE4YUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRJUC0yMCBUcmFuc2FjdGlvbiBCdWlsZGVyXG4gKlxuICogVW5pZmllZCBidWlsZGVyIGZvciBUSVAtMjAgdHJhbnNhY3Rpb25zIHN1cHBvcnRpbmc6XG4gKiAtIFNpbmdsZSBvciBiYXRjaCBvcGVyYXRpb25zXG4gKiAtIFBlci1vcGVyYXRpb24gbWVtb3MgZm9yIHRyYWNraW5nXG4gKiAtIEN1c3RvbSBmZWUgdG9rZW4gc2VsZWN0aW9uXG4gKiAtIEVJUC03NzAyIEFjY291bnQgQWJzdHJhY3Rpb24gKHR5cGUgMHg3NilcbiAqL1xuXG5pbXBvcnQge1xuICBUcmFuc2FjdGlvbiBhcyBFdGhUcmFuc2FjdGlvbixcbiAgVHJhbnNhY3Rpb25CdWlsZGVyIGFzIEFic3RyYWN0VHJhbnNhY3Rpb25CdWlsZGVyLFxuICBUcmFuc2ZlckJ1aWxkZXIsXG59IGZyb20gJ0BiaXRnby9hYnN0cmFjdC1ldGgnO1xuaW1wb3J0IHtcbiAgQmFzZVRyYW5zYWN0aW9uLFxuICBCdWlsZFRyYW5zYWN0aW9uRXJyb3IsXG4gIEludmFsaWRUcmFuc2FjdGlvbkVycm9yLFxuICBQYXJzZVRyYW5zYWN0aW9uRXJyb3IsXG59IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHsgZXRoZXJzIH0gZnJvbSAnZXRoZXJzJztcbmltcG9ydCB7IEFkZHJlc3MsIEhleCwgUmF3Q29udHJhY3RDYWxsLCBUaXAyME9wZXJhdGlvbiB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgVGlwMjBUcmFuc2FjdGlvbiwgVGlwMjBUcmFuc2FjdGlvblJlcXVlc3QgfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7XG4gIGFtb3VudFRvVGlwMjBVbml0cyxcbiAgZW5jb2RlVGlwMjBUcmFuc2ZlcldpdGhNZW1vLFxuICBpc1RpcDIwVHJhbnNhY3Rpb24sXG4gIGlzVmFsaWRBZGRyZXNzLFxuICBpc1ZhbGlkSGV4RGF0YSxcbiAgaXNWYWxpZE1lbW9JZCxcbiAgaXNWYWxpZFRpcDIwQW1vdW50LFxuICB0aXAyMFVuaXRzVG9BbW91bnQsXG59IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgVElQMjBfVFJBTlNGRVJfV0lUSF9NRU1PX0FCSSB9IGZyb20gJy4vdGlwMjBBYmknO1xuaW1wb3J0IHsgQUFfVFJBTlNBQ1RJT05fVFlQRSB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuLyoqXG4gKiBUcmFuc2FjdGlvbiBCdWlsZGVyIGZvciBUSVAtMjAgdG9rZW5zIG9uIFRlbXBvIGJsb2NrY2hhaW5cbiAqIEV4dGVuZHMgYWJzdHJhY3QtZXRoIFRyYW5zYWN0aW9uQnVpbGRlciB3aXRoIFRlbXBvLXNwZWNpZmljIGZlYXR1cmVzXG4gKi9cbmV4cG9ydCBjbGFzcyBUaXAyMFRyYW5zYWN0aW9uQnVpbGRlciBleHRlbmRzIEFic3RyYWN0VHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgcHJpdmF0ZSBvcGVyYXRpb25zOiBUaXAyME9wZXJhdGlvbltdID0gW107XG4gIHByaXZhdGUgcmF3Q2FsbHM6IFJhd0NvbnRyYWN0Q2FsbFtdID0gW107XG4gIHByaXZhdGUgX2ZlZVRva2VuPzogQWRkcmVzcztcbiAgcHJpdmF0ZSBfbm9uY2U/OiBudW1iZXI7XG4gIHByaXZhdGUgX2dhcz86IGJpZ2ludDtcbiAgcHJpdmF0ZSBfbWF4RmVlUGVyR2FzPzogYmlnaW50O1xuICBwcml2YXRlIF9tYXhQcmlvcml0eUZlZVBlckdhcz86IGJpZ2ludDtcbiAgcHJpdmF0ZSBfcmVzdG9yZWRTaWduYXR1cmU/OiB7IHI6IEhleDsgczogSGV4OyB5UGFyaXR5OiBudW1iZXIgfTtcblxuICBjb25zdHJ1Y3RvcihfY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihfY29pbkNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50IHRoZSB0cmFuc2ZlciBtZXRob2QgZnJvbSBhYnN0cmFjdCBjbGFzc1xuICAgKiBOb3RlOiBGb3IgVElQLTIwIHRyYW5zYWN0aW9ucywgdXNlIGFkZE9wZXJhdGlvbigpIGluc3RlYWRcbiAgICovXG4gIHRyYW5zZmVyKGRhdGE/OiBzdHJpbmcsIGlzRmlyc3RTaWduZXI/OiBib29sZWFuKTogVHJhbnNmZXJCdWlsZGVyIHtcbiAgICBjb25zdCB0cmFuc2ZlckJ1aWxkZXIgPSBuZXcgVHJhbnNmZXJCdWlsZGVyKHVuZGVmaW5lZCwgaXNGaXJzdFNpZ25lcik7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIHRyYW5zZmVyQnVpbGRlci5kYXRhKGRhdGEpO1xuICAgIH1cbiAgICB0aGlzLl90cmFuc2ZlciA9IHRyYW5zZmVyQnVpbGRlcjtcbiAgICByZXR1cm4gdHJhbnNmZXJCdWlsZGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoZSB0cmFuc2FjdGlvbiBoYXMgYWxsIHJlcXVpcmVkIGZpZWxkcyBmb3IgVGVtcG8gQUEgdHJhbnNhY3Rpb25zLlxuICAgKiBPdmVycmlkZXMgcGFyZW50IGNsYXNzIHZhbGlkYXRpb24gc2luY2UgQUEgdHJhbnNhY3Rpb25zIHVzZSBhIGRpZmZlcmVudCBtb2RlbFxuICAgKiAob3BlcmF0aW9ucy1iYXNlZCByYXRoZXIgdGhhbiBzaW5nbGUgY29udHJhY3QgYWRkcmVzcykuXG4gICAqXG4gICAqIEB0aHJvd3MgQnVpbGRUcmFuc2FjdGlvbkVycm9yIGlmIHZhbGlkYXRpb24gZmFpbHNcbiAgICovXG4gIHZhbGlkYXRlVHJhbnNhY3Rpb24oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMub3BlcmF0aW9ucy5sZW5ndGggPT09IDAgJiYgdGhpcy5yYXdDYWxscy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0F0IGxlYXN0IG9uZSBvcGVyYXRpb24gb3IgcmF3IGNhbGwgaXMgcmVxdWlyZWQgdG8gYnVpbGQgYSB0cmFuc2FjdGlvbicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9ub25jZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdOb25jZSBpcyByZXF1aXJlZCB0byBidWlsZCBhIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2dhcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdHYXMgbGltaXQgaXMgcmVxdWlyZWQgdG8gYnVpbGQgYSB0cmFuc2FjdGlvbicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9tYXhGZWVQZXJHYXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignbWF4RmVlUGVyR2FzIGlzIHJlcXVpcmVkIHRvIGJ1aWxkIGEgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fbWF4UHJpb3JpdHlGZWVQZXJHYXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignbWF4UHJpb3JpdHlGZWVQZXJHYXMgaXMgcmVxdWlyZWQgdG8gYnVpbGQgYSB0cmFuc2FjdGlvbicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB2YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodHlwZW9mIHJhd1RyYW5zYWN0aW9uID09PSAnc3RyaW5nJyAmJiBpc1RpcDIwVHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb24pKSB7XG4gICAgICB0cnkge1xuICAgICAgICBldGhlcnMudXRpbHMuUkxQLmRlY29kZSgnMHgnICsgcmF3VHJhbnNhY3Rpb24uc2xpY2UoNCkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoYEZhaWxlZCB0byBSTFAgZGVjb2RlIFRJUC0yMCB0cmFuc2FjdGlvbjogJHtlfWApO1xuICAgICAgfVxuICAgIH1cbiAgICBzdXBlci52YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgZnJvbUltcGxlbWVudGF0aW9uKHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcsIGlzRmlyc3RTaWduZXI/OiBib29sZWFuKTogRXRoVHJhbnNhY3Rpb24ge1xuICAgIGlmICghcmF3VHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignUmF3IHRyYW5zYWN0aW9uIGlzIGVtcHR5Jyk7XG4gICAgfVxuICAgIGlmIChpc1RpcDIwVHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb24pKSB7XG4gICAgICByZXR1cm4gdGhpcy5mcm9tVGlwMjBUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbikgYXMgdW5rbm93biBhcyBFdGhUcmFuc2FjdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIHN1cGVyLmZyb21JbXBsZW1lbnRhdGlvbihyYXdUcmFuc2FjdGlvbiwgaXNGaXJzdFNpZ25lcik7XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYSB0eXBlIDB4NzYgdHJhbnNhY3Rpb24gYW5kIHJlc3RvcmUgYnVpbGRlciBzdGF0ZS5cbiAgICogUkxQIGZpZWxkIGxheW91dCBtaXJyb3JzIGJ1aWxkQmFzZVJscERhdGEoKSBpbiB0cmFuc2FjdGlvbi50cy5cbiAgICovXG4gIHByaXZhdGUgZnJvbVRpcDIwVHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb246IHN0cmluZyk6IFRpcDIwVHJhbnNhY3Rpb24ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBybHBIZXggPSAnMHgnICsgcmF3VHJhbnNhY3Rpb24uc2xpY2UoNCk7XG4gICAgICBjb25zdCBkZWNvZGVkID0gZXRoZXJzLnV0aWxzLlJMUC5kZWNvZGUocmxwSGV4KSBhcyBhbnlbXTtcblxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGRlY29kZWQpIHx8IGRlY29kZWQubGVuZ3RoIDwgMTMpIHtcbiAgICAgICAgdGhyb3cgbmV3IFBhcnNlVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBUSVAtMjAgdHJhbnNhY3Rpb246IHVuZXhwZWN0ZWQgUkxQIHN0cnVjdHVyZScpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJzZUJpZ0ludCA9IChoZXg6IHN0cmluZyk6IGJpZ2ludCA9PiAoIWhleCB8fCBoZXggPT09ICcweCcgPyAwbiA6IEJpZ0ludChoZXgpKTtcbiAgICAgIGNvbnN0IHBhcnNlSGV4SW50ID0gKGhleDogc3RyaW5nKTogbnVtYmVyID0+ICghaGV4IHx8IGhleCA9PT0gJzB4JyA/IDAgOiBwYXJzZUludChoZXgsIDE2KSk7XG5cbiAgICAgIGNvbnN0IGNoYWluSWQgPSBwYXJzZUhleEludChkZWNvZGVkWzBdIGFzIHN0cmluZyk7XG4gICAgICBjb25zdCBtYXhQcmlvcml0eUZlZVBlckdhcyA9IHBhcnNlQmlnSW50KGRlY29kZWRbMV0gYXMgc3RyaW5nKTtcbiAgICAgIGNvbnN0IG1heEZlZVBlckdhcyA9IHBhcnNlQmlnSW50KGRlY29kZWRbMl0gYXMgc3RyaW5nKTtcbiAgICAgIGNvbnN0IGdhcyA9IHBhcnNlQmlnSW50KGRlY29kZWRbM10gYXMgc3RyaW5nKTtcbiAgICAgIGNvbnN0IGNhbGxzVHVwbGVzID0gZGVjb2RlZFs0XSBhcyBzdHJpbmdbXVtdO1xuICAgICAgY29uc3Qgbm9uY2UgPSBwYXJzZUhleEludChkZWNvZGVkWzddIGFzIHN0cmluZyk7XG4gICAgICBjb25zdCBmZWVUb2tlblJhdyA9IGRlY29kZWRbMTBdIGFzIHN0cmluZztcblxuICAgICAgY29uc3QgY2FsbHM6IHsgdG86IEFkZHJlc3M7IGRhdGE6IEhleDsgdmFsdWU6IGJpZ2ludCB9W10gPSBjYWxsc1R1cGxlcy5tYXAoKHR1cGxlKSA9PiAoe1xuICAgICAgICB0bzogdHVwbGVbMF0gYXMgQWRkcmVzcyxcbiAgICAgICAgdmFsdWU6IHBhcnNlQmlnSW50KHR1cGxlWzFdIGFzIHN0cmluZyksXG4gICAgICAgIGRhdGE6IHR1cGxlWzJdIGFzIEhleCxcbiAgICAgIH0pKTtcblxuICAgICAgY29uc3Qgb3BlcmF0aW9uczogVGlwMjBPcGVyYXRpb25bXSA9IFtdO1xuICAgICAgY29uc3QgZGVjb2RlZFJhd0NhbGxzOiBSYXdDb250cmFjdENhbGxbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBjYWxsIG9mIGNhbGxzKSB7XG4gICAgICAgIGNvbnN0IG9wID0gdGhpcy5kZWNvZGVDYWxsVG9PcGVyYXRpb24oY2FsbCk7XG4gICAgICAgIGlmIChvcCAhPT0gbnVsbCkge1xuICAgICAgICAgIG9wZXJhdGlvbnMucHVzaChvcCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVjb2RlZFJhd0NhbGxzLnB1c2goeyB0bzogY2FsbC50bywgZGF0YTogY2FsbC5kYXRhLCB2YWx1ZTogY2FsbC52YWx1ZS50b1N0cmluZygpIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxldCBzaWduYXR1cmU6IHsgcjogSGV4OyBzOiBIZXg7IHlQYXJpdHk6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGRlY29kZWQubGVuZ3RoID49IDE0ICYmIGRlY29kZWRbMTNdICYmIChkZWNvZGVkWzEzXSBhcyBzdHJpbmcpLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgY29uc3Qgc2lnQnl0ZXMgPSBldGhlcnMudXRpbHMuYXJyYXlpZnkoZGVjb2RlZFsxM10gYXMgc3RyaW5nKTtcbiAgICAgICAgaWYgKHNpZ0J5dGVzLmxlbmd0aCA9PT0gNjUpIHtcbiAgICAgICAgICBjb25zdCByID0gZXRoZXJzLnV0aWxzLmhleGxpZnkoc2lnQnl0ZXMuc2xpY2UoMCwgMzIpKSBhcyBIZXg7XG4gICAgICAgICAgY29uc3QgcyA9IGV0aGVycy51dGlscy5oZXhsaWZ5KHNpZ0J5dGVzLnNsaWNlKDMyLCA2NCkpIGFzIEhleDtcbiAgICAgICAgICBjb25zdCB2ID0gc2lnQnl0ZXNbNjRdO1xuICAgICAgICAgIGNvbnN0IHlQYXJpdHkgPSB2ID4gMSA/IHYgLSAyNyA6IHY7XG4gICAgICAgICAgc2lnbmF0dXJlID0geyByLCBzLCB5UGFyaXR5IH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgZmVlVG9rZW4gPSBmZWVUb2tlblJhdyAmJiBmZWVUb2tlblJhdyAhPT0gJzB4JyA/IChmZWVUb2tlblJhdyBhcyBBZGRyZXNzKSA6IHVuZGVmaW5lZDtcblxuICAgICAgY29uc3QgdHhSZXF1ZXN0OiBUaXAyMFRyYW5zYWN0aW9uUmVxdWVzdCA9IHtcbiAgICAgICAgdHlwZTogQUFfVFJBTlNBQ1RJT05fVFlQRSxcbiAgICAgICAgY2hhaW5JZCxcbiAgICAgICAgbm9uY2UsXG4gICAgICAgIG1heEZlZVBlckdhcyxcbiAgICAgICAgbWF4UHJpb3JpdHlGZWVQZXJHYXMsXG4gICAgICAgIGdhcyxcbiAgICAgICAgY2FsbHMsXG4gICAgICAgIGFjY2Vzc0xpc3Q6IFtdLFxuICAgICAgICBmZWVUb2tlbixcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuX25vbmNlID0gbm9uY2U7XG4gICAgICB0aGlzLl9nYXMgPSBnYXM7XG4gICAgICB0aGlzLl9tYXhGZWVQZXJHYXMgPSBtYXhGZWVQZXJHYXM7XG4gICAgICB0aGlzLl9tYXhQcmlvcml0eUZlZVBlckdhcyA9IG1heFByaW9yaXR5RmVlUGVyR2FzO1xuICAgICAgdGhpcy5fZmVlVG9rZW4gPSBmZWVUb2tlbjtcbiAgICAgIHRoaXMub3BlcmF0aW9ucyA9IG9wZXJhdGlvbnM7XG4gICAgICB0aGlzLnJhd0NhbGxzID0gZGVjb2RlZFJhd0NhbGxzO1xuICAgICAgdGhpcy5fcmVzdG9yZWRTaWduYXR1cmUgPSBzaWduYXR1cmU7XG5cbiAgICAgIGNvbnN0IHR4ID0gbmV3IFRpcDIwVHJhbnNhY3Rpb24odGhpcy5fY29pbkNvbmZpZywgdHhSZXF1ZXN0LCBvcGVyYXRpb25zLCBkZWNvZGVkUmF3Q2FsbHMpO1xuICAgICAgaWYgKHNpZ25hdHVyZSkge1xuICAgICAgICB0eC5zZXRTaWduYXR1cmUoc2lnbmF0dXJlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0eDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIFBhcnNlVHJhbnNhY3Rpb25FcnJvcikgdGhyb3cgZTtcbiAgICAgIHRocm93IG5ldyBQYXJzZVRyYW5zYWN0aW9uRXJyb3IoYEZhaWxlZCB0byBkZXNlcmlhbGl6ZSBUSVAtMjAgdHJhbnNhY3Rpb246ICR7ZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVjb2RlIGEgc2luZ2xlIEFBIGNhbGwncyBkYXRhIGJhY2sgaW50byBhIFRpcDIwT3BlcmF0aW9uLlxuICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlIGNhbGwgaXMgbm90IGEgdHJhbnNmZXJXaXRoTWVtbyDigJQgaXQgd2lsbCBiZSBzdG9yZWQgYXMgYSBSYXdDb250cmFjdENhbGwgaW5zdGVhZC5cbiAgICogVGhpcyBwcmVzZXJ2ZXMgY2FsbGRhdGEgZmlkZWxpdHkgZm9yIGFyYml0cmFyeSBzbWFydCBjb250cmFjdCBpbnRlcmFjdGlvbnMuXG4gICAqL1xuICBwcml2YXRlIGRlY29kZUNhbGxUb09wZXJhdGlvbihjYWxsOiB7IHRvOiBBZGRyZXNzOyBkYXRhOiBIZXg7IHZhbHVlOiBiaWdpbnQgfSk6IFRpcDIwT3BlcmF0aW9uIHwgbnVsbCB7XG4gICAgY29uc3QgaWZhY2UgPSBuZXcgZXRoZXJzLnV0aWxzLkludGVyZmFjZShUSVAyMF9UUkFOU0ZFUl9XSVRIX01FTU9fQUJJKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGVjb2RlZCA9IGlmYWNlLmRlY29kZUZ1bmN0aW9uRGF0YSgndHJhbnNmZXJXaXRoTWVtbycsIGNhbGwuZGF0YSk7XG4gICAgICBjb25zdCB0b0FkZHJlc3MgPSBkZWNvZGVkWzBdIGFzIHN0cmluZztcbiAgICAgIGNvbnN0IGFtb3VudFVuaXRzID0gQmlnSW50KGRlY29kZWRbMV0udG9TdHJpbmcoKSk7XG4gICAgICBjb25zdCBtZW1vQnl0ZXMzMiA9IGRlY29kZWRbMl0gYXMgc3RyaW5nO1xuXG4gICAgICBjb25zdCBhbW91bnQgPSB0aXAyMFVuaXRzVG9BbW91bnQoYW1vdW50VW5pdHMpO1xuXG4gICAgICBjb25zdCBzdHJpcHBlZCA9IGV0aGVycy51dGlscy5zdHJpcFplcm9zKG1lbW9CeXRlczMyKTtcbiAgICAgIGNvbnN0IG1lbW8gPSBzdHJpcHBlZC5sZW5ndGggPiAwID8gZXRoZXJzLnV0aWxzLnRvVXRmOFN0cmluZyhzdHJpcHBlZCkgOiB1bmRlZmluZWQ7XG5cbiAgICAgIHJldHVybiB7IHRva2VuOiBjYWxsLnRvLCB0bzogdG9BZGRyZXNzLCBhbW91bnQsIG1lbW8gfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE5vdCBhIHRyYW5zZmVyV2l0aE1lbW8gY2FsbCDigJQgY2FsbGVyIHdpbGwgc3RvcmUgYXMgUmF3Q29udHJhY3RDYWxsXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgdGhlIHRyYW5zYWN0aW9uIGZyb20gY29uZmlndXJlZCBUSVAtMjAgb3BlcmF0aW9ucyBhbmQgdHJhbnNhY3Rpb24gcGFyYW1ldGVycy5cbiAgICogU2lnbnMgd2l0aCBfc291cmNlS2V5UGFpciBpZiBpdCBoYXMgYmVlbiBzZXQgdmlhIHNpZ24oeyBrZXkgfSkuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgYnVpbGRJbXBsZW1lbnRhdGlvbigpOiBQcm9taXNlPEJhc2VUcmFuc2FjdGlvbj4ge1xuICAgIGlmIChcbiAgICAgIHRoaXMuX25vbmNlID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHRoaXMuX2dhcyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0aGlzLl9tYXhGZWVQZXJHYXMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgdGhpcy5fbWF4UHJpb3JpdHlGZWVQZXJHYXMgPT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignVHJhbnNhY3Rpb24gdmFsaWRhdGlvbiBmYWlsZWQ6IG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzJyk7XG4gICAgfVxuXG4gICAgdGhpcy5mZWUoe1xuICAgICAgZmVlOiB0aGlzLl9tYXhGZWVQZXJHYXMudG9TdHJpbmcoKSxcbiAgICAgIGdhc0xpbWl0OiB0aGlzLl9nYXMudG9TdHJpbmcoKSxcbiAgICAgIGVpcDE1NTk6IHtcbiAgICAgICAgbWF4RmVlUGVyR2FzOiB0aGlzLl9tYXhGZWVQZXJHYXMudG9TdHJpbmcoKSxcbiAgICAgICAgbWF4UHJpb3JpdHlGZWVQZXJHYXM6IHRoaXMuX21heFByaW9yaXR5RmVlUGVyR2FzLnRvU3RyaW5nKCksXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgY2FsbHMgPSB0aGlzLm9wZXJhdGlvbnMubWFwKChvcCkgPT4gdGhpcy5vcGVyYXRpb25Ub0NhbGwob3ApKTtcblxuICAgIGZvciAoY29uc3QgcmF3Q2FsbCBvZiB0aGlzLnJhd0NhbGxzKSB7XG4gICAgICBjYWxscy5wdXNoKHtcbiAgICAgICAgdG86IHJhd0NhbGwudG8gYXMgQWRkcmVzcyxcbiAgICAgICAgZGF0YTogcmF3Q2FsbC5kYXRhIGFzIEhleCxcbiAgICAgICAgdmFsdWU6IHJhd0NhbGwudmFsdWUgPyBCaWdJbnQocmF3Q2FsbC52YWx1ZSkgOiAwbixcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHR4UmVxdWVzdDogVGlwMjBUcmFuc2FjdGlvblJlcXVlc3QgPSB7XG4gICAgICB0eXBlOiBBQV9UUkFOU0FDVElPTl9UWVBFLFxuICAgICAgY2hhaW5JZDogdGhpcy5fY29tbW9uLmNoYWluSWRCTigpLnRvTnVtYmVyKCksXG4gICAgICBub25jZTogdGhpcy5fbm9uY2UsXG4gICAgICBtYXhGZWVQZXJHYXM6IHRoaXMuX21heEZlZVBlckdhcyxcbiAgICAgIG1heFByaW9yaXR5RmVlUGVyR2FzOiB0aGlzLl9tYXhQcmlvcml0eUZlZVBlckdhcyxcbiAgICAgIGdhczogdGhpcy5fZ2FzLFxuICAgICAgY2FsbHMsXG4gICAgICBhY2Nlc3NMaXN0OiBbXSxcbiAgICAgIGZlZVRva2VuOiB0aGlzLl9mZWVUb2tlbixcbiAgICB9O1xuXG4gICAgY29uc3QgdHggPSBuZXcgVGlwMjBUcmFuc2FjdGlvbih0aGlzLl9jb2luQ29uZmlnLCB0eFJlcXVlc3QsIHRoaXMub3BlcmF0aW9ucywgdGhpcy5yYXdDYWxscyk7XG5cbiAgICBpZiAodGhpcy5fc291cmNlS2V5UGFpciAmJiB0aGlzLl9zb3VyY2VLZXlQYWlyLmdldEtleXMoKS5wcnYpIHtcbiAgICAgIGNvbnN0IHBydiA9IHRoaXMuX3NvdXJjZUtleVBhaXIuZ2V0S2V5cygpLnBydiE7XG4gICAgICBjb25zdCB1bnNpZ25lZEhleCA9IGF3YWl0IHR4LnNlcmlhbGl6ZSgpO1xuICAgICAgY29uc3QgbXNnSGFzaCA9IGV0aGVycy51dGlscy5rZWNjYWsyNTYoZXRoZXJzLnV0aWxzLmFycmF5aWZ5KHVuc2lnbmVkSGV4KSk7XG4gICAgICBjb25zdCBzaWduaW5nS2V5ID0gbmV3IGV0aGVycy51dGlscy5TaWduaW5nS2V5KCcweCcgKyBwcnYpO1xuICAgICAgY29uc3Qgc2lnID0gc2lnbmluZ0tleS5zaWduRGlnZXN0KGV0aGVycy51dGlscy5hcnJheWlmeShtc2dIYXNoKSk7XG4gICAgICB0eC5zZXRTaWduYXR1cmUoe1xuICAgICAgICByOiBzaWcuciBhcyBIZXgsXG4gICAgICAgIHM6IHNpZy5zIGFzIEhleCxcbiAgICAgICAgeVBhcml0eTogc2lnLnJlY292ZXJ5UGFyYW0gPz8gMCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fcmVzdG9yZWRTaWduYXR1cmUpIHtcbiAgICAgIHR4LnNldFNpZ25hdHVyZSh0aGlzLl9yZXN0b3JlZFNpZ25hdHVyZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHR4O1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHNpbmdsZSBvcGVyYXRpb24gdG8gdGhlIHRyYW5zYWN0aW9uXG4gICAqIENhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgdG8gY3JlYXRlIGJhdGNoIHRyYW5zYWN0aW9uc1xuICAgKlxuICAgKiBAcGFyYW0gb3BlcmF0aW9uIC0gVElQLTIwIG9wZXJhdGlvbiB3aXRoIHRva2VuLCByZWNpcGllbnQsIGFtb3VudCwgYW5kIG9wdGlvbmFsIG1lbW9cbiAgICogQHJldHVybnMgdGhpcyBidWlsZGVyIGluc3RhbmNlIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgYWRkT3BlcmF0aW9uKG9wZXJhdGlvbjogVGlwMjBPcGVyYXRpb24pOiB0aGlzIHtcbiAgICB0aGlzLnZhbGlkYXRlT3BlcmF0aW9uKG9wZXJhdGlvbik7XG4gICAgdGhpcy5vcGVyYXRpb25zLnB1c2gob3BlcmF0aW9uKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSByYXcgc21hcnQgY29udHJhY3QgY2FsbCB3aXRoIHByZS1lbmNvZGVkIGNhbGxkYXRhXG4gICAqIFVzZSB0aGlzIGZvciBhcmJpdHJhcnkgY29udHJhY3QgaW50ZXJhY3Rpb25zIHdoZXJlIHRoZSBVSSBwcm92aWRlcyBBQkktZW5jb2RlZCBjYWxsZGF0YVxuICAgKlxuICAgKiBAcGFyYW0gY2FsbCAtIFJhdyBjb250cmFjdCBjYWxsIHdpdGggdGFyZ2V0IGFkZHJlc3MgYW5kIHByZS1lbmNvZGVkIGNhbGxkYXRhXG4gICAqIEByZXR1cm5zIHRoaXMgYnVpbGRlciBpbnN0YW5jZSBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGFkZFJhd0NhbGwoY2FsbDogUmF3Q29udHJhY3RDYWxsKTogdGhpcyB7XG4gICAgaWYgKCFpc1ZhbGlkQWRkcmVzcyhjYWxsLnRvKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBjb250cmFjdCBhZGRyZXNzOiAke2NhbGwudG99YCk7XG4gICAgfVxuICAgIGlmICghaXNWYWxpZEhleERhdGEoY2FsbC5kYXRhKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBjYWxsZGF0YTogbXVzdCBiZSBhIG5vbi1lbXB0eSAweC1wcmVmaXhlZCBoZXggc3RyaW5nIHdpdGggZXZlbiBsZW5ndGhgKTtcbiAgICB9XG4gICAgaWYgKGNhbGwudmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdiA9IEJpZ0ludChjYWxsLnZhbHVlKTtcbiAgICAgICAgaWYgKHYgPCAwbikgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCB2YWx1ZTogbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIHN0cmluZ2ApO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnJhd0NhbGxzLnB1c2goY2FsbCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCByYXcgY29udHJhY3QgY2FsbHMgaW4gdGhpcyB0cmFuc2FjdGlvblxuICAgKiBAcmV0dXJucyBBcnJheSBvZiByYXcgY29udHJhY3QgY2FsbHNcbiAgICovXG4gIGdldFJhd0NhbGxzKCk6IFJhd0NvbnRyYWN0Q2FsbFtdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMucmF3Q2FsbHNdO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB3aGljaCBUSVAtMjAgdG9rZW4gd2lsbCBiZSB1c2VkIHRvIHBheSB0cmFuc2FjdGlvbiBmZWVzXG4gICAqIFRoaXMgaXMgYSBnbG9iYWwgc2V0dGluZyBmb3IgdGhlIGVudGlyZSB0cmFuc2FjdGlvblxuICAgKlxuICAgKiBAcGFyYW0gdG9rZW5BZGRyZXNzIC0gQWRkcmVzcyBvZiB0aGUgVElQLTIwIHRva2VuIHRvIHVzZSBmb3IgZmVlc1xuICAgKiBAcmV0dXJucyB0aGlzIGJ1aWxkZXIgaW5zdGFuY2UgZm9yIGNoYWluaW5nXG4gICAqL1xuICBmZWVUb2tlbih0b2tlbkFkZHJlc3M6IHN0cmluZyk6IHRoaXMge1xuICAgIGlmICghaXNWYWxpZEFkZHJlc3ModG9rZW5BZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBmZWUgdG9rZW4gYWRkcmVzczogJHt0b2tlbkFkZHJlc3N9YCk7XG4gICAgfVxuICAgIHRoaXMuX2ZlZVRva2VuID0gdG9rZW5BZGRyZXNzIGFzIEFkZHJlc3M7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB0cmFuc2FjdGlvbiBub25jZVxuICAgKlxuICAgKiBAcGFyYW0gbm9uY2UgLSBUcmFuc2FjdGlvbiBub25jZVxuICAgKiBAcmV0dXJucyB0aGlzIGJ1aWxkZXIgaW5zdGFuY2UgZm9yIGNoYWluaW5nXG4gICAqL1xuICBub25jZShub25jZTogbnVtYmVyKTogdGhpcyB7XG4gICAgaWYgKG5vbmNlIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBub25jZTogJHtub25jZX1gKTtcbiAgICB9XG4gICAgdGhpcy5fbm9uY2UgPSBub25jZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGdhcyBsaW1pdCBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSBnYXMgLSBHYXMgbGltaXRcbiAgICogQHJldHVybnMgdGhpcyBidWlsZGVyIGluc3RhbmNlIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgZ2FzKGdhczogc3RyaW5nIHwgYmlnaW50KTogdGhpcyB7XG4gICAgY29uc3QgZ2FzVmFsdWUgPSB0eXBlb2YgZ2FzID09PSAnc3RyaW5nJyA/IEJpZ0ludChnYXMpIDogZ2FzO1xuICAgIGlmIChnYXNWYWx1ZSA8PSAwbikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBnYXMgbGltaXQ6ICR7Z2FzfWApO1xuICAgIH1cbiAgICB0aGlzLl9nYXMgPSBnYXNWYWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIG1heGltdW0gZmVlIHBlciBnYXMgKEVJUC0xNTU5KVxuICAgKlxuICAgKiBAcGFyYW0gbWF4RmVlUGVyR2FzIC0gTWF4aW11bSBmZWUgcGVyIGdhcyBpbiB3ZWlcbiAgICogQHJldHVybnMgdGhpcyBidWlsZGVyIGluc3RhbmNlIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgbWF4RmVlUGVyR2FzKG1heEZlZVBlckdhczogc3RyaW5nIHwgYmlnaW50KTogdGhpcyB7XG4gICAgY29uc3QgZmVlVmFsdWUgPSB0eXBlb2YgbWF4RmVlUGVyR2FzID09PSAnc3RyaW5nJyA/IEJpZ0ludChtYXhGZWVQZXJHYXMpIDogbWF4RmVlUGVyR2FzO1xuICAgIGlmIChmZWVWYWx1ZSA8IDBuKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIG1heEZlZVBlckdhczogJHttYXhGZWVQZXJHYXN9YCk7XG4gICAgfVxuICAgIHRoaXMuX21heEZlZVBlckdhcyA9IGZlZVZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgbWF4aW11bSBwcmlvcml0eSBmZWUgcGVyIGdhcyAoRUlQLTE1NTkpXG4gICAqXG4gICAqIEBwYXJhbSBtYXhQcmlvcml0eUZlZVBlckdhcyAtIE1heGltdW0gcHJpb3JpdHkgZmVlIHBlciBnYXMgaW4gd2VpXG4gICAqIEByZXR1cm5zIHRoaXMgYnVpbGRlciBpbnN0YW5jZSBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG1heFByaW9yaXR5RmVlUGVyR2FzKG1heFByaW9yaXR5RmVlUGVyR2FzOiBzdHJpbmcgfCBiaWdpbnQpOiB0aGlzIHtcbiAgICBjb25zdCBmZWVWYWx1ZSA9IHR5cGVvZiBtYXhQcmlvcml0eUZlZVBlckdhcyA9PT0gJ3N0cmluZycgPyBCaWdJbnQobWF4UHJpb3JpdHlGZWVQZXJHYXMpIDogbWF4UHJpb3JpdHlGZWVQZXJHYXM7XG4gICAgaWYgKGZlZVZhbHVlIDwgMG4pIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgbWF4UHJpb3JpdHlGZWVQZXJHYXM6ICR7bWF4UHJpb3JpdHlGZWVQZXJHYXN9YCk7XG4gICAgfVxuICAgIHRoaXMuX21heFByaW9yaXR5RmVlUGVyR2FzID0gZmVlVmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBvcGVyYXRpb25zIGluIHRoaXMgdHJhbnNhY3Rpb25cbiAgICogQHJldHVybnMgQXJyYXkgb2YgVElQLTIwIG9wZXJhdGlvbnNcbiAgICovXG4gIGdldE9wZXJhdGlvbnMoKTogVGlwMjBPcGVyYXRpb25bXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLm9wZXJhdGlvbnNdO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZmVlIHRva2VuIGFkZHJlc3MgaWYgc2V0XG4gICAqIEByZXR1cm5zIEZlZSB0b2tlbiBhZGRyZXNzIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgZ2V0RmVlVG9rZW4oKTogQWRkcmVzcyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2ZlZVRva2VuO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGEgc2luZ2xlIG9wZXJhdGlvblxuICAgKiBAcGFyYW0gb3BlcmF0aW9uIC0gT3BlcmF0aW9uIHRvIHZhbGlkYXRlXG4gICAqIEB0aHJvd3MgQnVpbGRUcmFuc2FjdGlvbkVycm9yIGlmIGludmFsaWRcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVPcGVyYXRpb24ob3BlcmF0aW9uOiBUaXAyME9wZXJhdGlvbik6IHZvaWQge1xuICAgIGlmICghaXNWYWxpZEFkZHJlc3Mob3BlcmF0aW9uLnRva2VuKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCB0b2tlbiBhZGRyZXNzOiAke29wZXJhdGlvbi50b2tlbn1gKTtcbiAgICB9XG5cbiAgICBpZiAoIWlzVmFsaWRBZGRyZXNzKG9wZXJhdGlvbi50bykpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgcmVjaXBpZW50IGFkZHJlc3M6ICR7b3BlcmF0aW9uLnRvfWApO1xuICAgIH1cblxuICAgIGlmICghaXNWYWxpZFRpcDIwQW1vdW50KG9wZXJhdGlvbi5hbW91bnQpKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnZhbGlkIGFtb3VudDogJHtvcGVyYXRpb24uYW1vdW50fWApO1xuICAgIH1cblxuICAgIGlmIChvcGVyYXRpb24ubWVtbyAhPT0gdW5kZWZpbmVkICYmICFpc1ZhbGlkTWVtb0lkKG9wZXJhdGlvbi5tZW1vKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBtZW1vOiBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXJgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBhIFRJUC0yMCBvcGVyYXRpb24gdG8gYW4gQUEgY2FsbFxuICAgKi9cbiAgcHJpdmF0ZSBvcGVyYXRpb25Ub0NhbGwob3A6IFRpcDIwT3BlcmF0aW9uKTogeyB0bzogQWRkcmVzczsgZGF0YTogSGV4OyB2YWx1ZTogYmlnaW50IH0ge1xuICAgIGNvbnN0IGFtb3VudEluVW5pdHMgPSBhbW91bnRUb1RpcDIwVW5pdHMob3AuYW1vdW50KTtcbiAgICBjb25zdCBkYXRhID0gZW5jb2RlVGlwMjBUcmFuc2ZlcldpdGhNZW1vKG9wLnRvLCBhbW91bnRJblVuaXRzLCBvcC5tZW1vKTtcblxuICAgIHJldHVybiB7XG4gICAgICB0bzogb3AudG9rZW4sXG4gICAgICBkYXRhLFxuICAgICAgdmFsdWU6IDBuLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
@@ -14,4 +14,14 @@ export interface Tip20Operation {
14
14
  amount: string;
15
15
  memo?: string;
16
16
  }
17
+ /**
18
+ * Raw smart contract call with pre-encoded calldata
19
+ * Used for arbitrary contract interactions (e.g., mint(), approve())
20
+ * where the caller provides the full ABI-encoded calldata
21
+ */
22
+ export interface RawContractCall {
23
+ to: Address;
24
+ data: Hex;
25
+ value?: string;
26
+ }
17
27
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC;AAC7B,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC;AACzB,MAAM,MAAM,4BAA4B,GAAG,MAAM,CAAC;AAElD;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC;AAC7B,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC;AACzB,MAAM,MAAM,4BAA4B,GAAG,MAAM,CAAC;AAElD;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,GAAG,CAAC;IACV,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFR5cGUgYWxpYXNlcyBmb3IgRXRoZXJldW0gYWRkcmVzc2VzIGFuZCBoZXggc3RyaW5nc1xuICovXG5leHBvcnQgdHlwZSBBZGRyZXNzID0gc3RyaW5nO1xuZXhwb3J0IHR5cGUgSGV4ID0gc3RyaW5nO1xuZXhwb3J0IHR5cGUgVHJhbnNhY3Rpb25TZXJpYWxpemVkRUlQNzcwMiA9IHN0cmluZztcblxuLyoqXG4gKiBUSVAtMjAgT3BlcmF0aW9uIHdpdGggb3B0aW9uYWwgbWVtb1xuICogUmVwcmVzZW50cyBhIHNpbmdsZSB0cmFuc2ZlciBvcGVyYXRpb24gaW4gYSB0cmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRpcDIwT3BlcmF0aW9uIHtcbiAgdG9rZW46IEFkZHJlc3M7XG4gIHRvOiBBZGRyZXNzO1xuICBhbW91bnQ6IHN0cmluZztcbiAgbWVtbz86IHN0cmluZztcbn1cbiJdfQ==
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFR5cGUgYWxpYXNlcyBmb3IgRXRoZXJldW0gYWRkcmVzc2VzIGFuZCBoZXggc3RyaW5nc1xuICovXG5leHBvcnQgdHlwZSBBZGRyZXNzID0gc3RyaW5nO1xuZXhwb3J0IHR5cGUgSGV4ID0gc3RyaW5nO1xuZXhwb3J0IHR5cGUgVHJhbnNhY3Rpb25TZXJpYWxpemVkRUlQNzcwMiA9IHN0cmluZztcblxuLyoqXG4gKiBUSVAtMjAgT3BlcmF0aW9uIHdpdGggb3B0aW9uYWwgbWVtb1xuICogUmVwcmVzZW50cyBhIHNpbmdsZSB0cmFuc2ZlciBvcGVyYXRpb24gaW4gYSB0cmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRpcDIwT3BlcmF0aW9uIHtcbiAgdG9rZW46IEFkZHJlc3M7XG4gIHRvOiBBZGRyZXNzO1xuICBhbW91bnQ6IHN0cmluZztcbiAgbWVtbz86IHN0cmluZztcbn1cblxuLyoqXG4gKiBSYXcgc21hcnQgY29udHJhY3QgY2FsbCB3aXRoIHByZS1lbmNvZGVkIGNhbGxkYXRhXG4gKiBVc2VkIGZvciBhcmJpdHJhcnkgY29udHJhY3QgaW50ZXJhY3Rpb25zIChlLmcuLCBtaW50KCksIGFwcHJvdmUoKSlcbiAqIHdoZXJlIHRoZSBjYWxsZXIgcHJvdmlkZXMgdGhlIGZ1bGwgQUJJLWVuY29kZWQgY2FsbGRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSYXdDb250cmFjdENhbGwge1xuICB0bzogQWRkcmVzcztcbiAgZGF0YTogSGV4O1xuICB2YWx1ZT86IHN0cmluZztcbn1cbiJdfQ==
@@ -66,6 +66,11 @@ export declare function isTip20Transaction(raw: string): boolean;
66
66
  * Validate that a memoId is a valid non-negative integer string
67
67
  */
68
68
  export declare function isValidMemoId(memoId: string): boolean;
69
+ /**
70
+ * Validate that a string is a non-empty 0x-prefixed hex string
71
+ * Used to validate pre-encoded calldata for raw contract calls
72
+ */
73
+ export declare function isValidHexData(data: string): boolean;
69
74
  declare const utils: {
70
75
  isValidAddress: typeof isValidAddress;
71
76
  isValidPublicKey: typeof isValidPublicKey;
@@ -77,6 +82,7 @@ declare const utils: {
77
82
  isValidTip20Amount: typeof isValidTip20Amount;
78
83
  isTip20Transaction: typeof isTip20Transaction;
79
84
  isValidMemoId: typeof isValidMemoId;
85
+ isValidHexData: typeof isValidHexData;
80
86
  };
81
87
  export default utils;
82
88
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,KAAK,OAAO,GAAG,MAAM,CAAC;AACtB,KAAK,GAAG,GAAG,MAAM,CAAC;AAElB;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAKvD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAU3D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAU7D;AAED;;GAEG;AAEH;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAMzD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAOjD;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,GAAG,CAK3F;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAc1D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,QAAA,MAAM,KAAK;;;;;;;;;;;CAWV,CAAC;AAEF,eAAe,KAAK,CAAC"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,KAAK,OAAO,GAAG,MAAM,CAAC;AACtB,KAAK,GAAG,GAAG,MAAM,CAAC;AAElB;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAKvD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAU3D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAU7D;AAED;;GAEG;AAEH;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAMzD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAOjD;AAED;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,GAAG,CAK3F;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAc1D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAErD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,QAAA,MAAM,KAAK;;;;;;;;;;;;CAYV,CAAC;AAEF,eAAe,KAAK,CAAC"}