@bitgo/sdk-coin-celo 5.3.5 → 6.0.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bitgo/sdk-coin-celo",
3
- "version": "5.3.5",
3
+ "version": "6.0.1",
4
4
  "description": "BitGo SDK coin library for Celo",
5
5
  "main": "./dist/src/index.js",
6
6
  "types": "./dist/src/index.d.ts",
@@ -40,28 +40,23 @@
40
40
  ]
41
41
  },
42
42
  "dependencies": {
43
- "@bitgo/abstract-eth": "^24.13.5",
44
- "@bitgo/sdk-coin-eth": "^25.3.5",
45
- "@bitgo/sdk-core": "^36.13.0",
46
- "@bitgo/statics": "^58.5.0",
47
- "@celo/connect": "^2.0.0",
48
- "@celo/contractkit": "^2.0.0",
49
- "@celo/wallet-base": "^2.0.0",
50
- "@celo/wallet-local": "^2.0.0",
43
+ "@bitgo/abstract-eth": "^24.13.7",
44
+ "@bitgo/sdk-coin-eth": "^25.3.7",
45
+ "@bitgo/sdk-core": "^36.15.0",
46
+ "@bitgo/statics": "^58.7.0",
51
47
  "@ethereumjs/common": "^2.6.5",
52
48
  "bignumber.js": "^9.0.0",
53
49
  "ethereumjs-abi": "^0.6.5",
54
- "ethereumjs-util": "7.1.5",
55
- "ethers": "^5.1.3"
50
+ "ethereumjs-util": "7.1.5"
56
51
  },
57
52
  "devDependencies": {
58
- "@bitgo/sdk-api": "^1.70.2",
59
- "@bitgo/sdk-test": "^9.1.5"
53
+ "@bitgo/sdk-api": "^1.70.4",
54
+ "@bitgo/sdk-test": "^9.1.7"
60
55
  },
61
56
  "resolutions": {
62
57
  "form-data": "^4.0.4"
63
58
  },
64
- "gitHead": "e0674d41fa6b20f2ceb98c458fea60c2370a1555",
59
+ "gitHead": "3960d34c7573ef1113b84887fd3b0e6c5aa690e1",
65
60
  "files": [
66
61
  "dist"
67
62
  ]
@@ -1,50 +0,0 @@
1
- import { EthLikeTransactionData, KeyPair, LegacyTxData } from '@bitgo/sdk-coin-eth';
2
- export declare class CeloTransaction {
3
- private raw;
4
- private _from;
5
- private _senderPubKey?;
6
- private _signatures;
7
- private _feeCurrency;
8
- private _gatewayFeeRecipient;
9
- private _gatewayFee;
10
- nonce: Buffer;
11
- gasLimit: Buffer;
12
- gasPrice: Buffer;
13
- data: Buffer;
14
- value: Buffer;
15
- to: Buffer;
16
- v: Buffer;
17
- r: Buffer;
18
- s: Buffer;
19
- /**
20
- * Clean hex formatted values ensuring they have an even length
21
- *
22
- * @param numberValue Hex formatted number value. Example '0x01'
23
- * @returns sanitized value
24
- */
25
- private sanitizeHexString;
26
- constructor(tx: LegacyTxData);
27
- private initRaw;
28
- hash(includeSignature?: boolean): Buffer;
29
- getSenderAddress(): Buffer;
30
- getSenderPublicKey(): any;
31
- serialize(): Buffer;
32
- sign(privateKey: Buffer): void;
33
- verifySignature(): boolean;
34
- getChainId(): number;
35
- }
36
- export declare class CeloTransactionData implements EthLikeTransactionData {
37
- private tx;
38
- private deployedAddress?;
39
- constructor(tx: CeloTransaction, deployedAddress?: string);
40
- static fromJson(tx: LegacyTxData): CeloTransactionData;
41
- sign(keyPair: KeyPair): Promise<void>;
42
- /** @inheritdoc */
43
- toJson(): LegacyTxData;
44
- private setSignatureFields;
45
- /** @inheritdoc */
46
- toSerialized(): string;
47
- private static txJsonToCeloTx;
48
- private static encodedTxToJson;
49
- }
50
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/types.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,sBAAsB,EAAsB,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExG,qBAAa,eAAe;IAC1B,OAAO,CAAC,GAAG,CAAW;IACtB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,aAAa,CAAC,CAAC;IACvB,OAAO,CAAC,WAAW,CAAW;IAC9B,OAAO,CAAC,YAAY,CAA0B;IAC9C,OAAO,CAAC,oBAAoB,CAA0B;IACtD,OAAO,CAAC,WAAW,CAA0B;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAgB;IAC1B,CAAC,EAAE,MAAM,CAAgB;IACzB,CAAC,EAAE,MAAM,CAAgB;IACzB,CAAC,EAAE,MAAM,CAAgB;IAGzB;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;gBASb,EAAE,EAAE,YAAY;IAwB5B,OAAO,CAAC,OAAO;IAiBf,IAAI,CAAC,gBAAgB,CAAC,EAAE,OAAO,GAAG,MAAM;IAYxC,gBAAgB,IAAI,MAAM;IAS1B,kBAAkB;IAQlB,SAAS,IAAI,MAAM;IAInB,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAI9B,eAAe,IAAI,OAAO;IAY1B,UAAU,IAAI,MAAM;CAOrB;AAED,qBAAa,mBAAoB,YAAW,sBAAsB;IAChE,OAAO,CAAC,EAAE,CAAkB;IAC5B,OAAO,CAAC,eAAe,CAAC,CAAS;gBAErB,EAAE,EAAE,eAAe,EAAE,eAAe,CAAC,EAAE,MAAM;WAK3C,QAAQ,CAAC,EAAE,EAAE,YAAY,GAAG,mBAAmB;IAoBvD,IAAI,CAAC,OAAO,EAAE,OAAO;IAe3B,kBAAkB;IAClB,MAAM,IAAI,YAAY;IAiCtB,OAAO,CAAC,kBAAkB;IAc1B,kBAAkB;IAClB,YAAY,IAAI,MAAM;IAItB,OAAO,CAAC,MAAM,CAAC,cAAc;IAS7B,OAAO,CAAC,MAAM,CAAC,eAAe;CAS/B"}
@@ -1,223 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.CeloTransactionData = exports.CeloTransaction = void 0;
7
- const bignumber_js_1 = __importDefault(require("bignumber.js"));
8
- const wallet_local_1 = require("@celo/wallet-local");
9
- const ethereumjs_util_1 = require("ethereumjs-util");
10
- const sdk_coin_eth_1 = require("@bitgo/sdk-coin-eth");
11
- class CeloTransaction {
12
- // TODO: validate if this needs to be moved to Utils class
13
- /**
14
- * Clean hex formatted values ensuring they have an even length
15
- *
16
- * @param numberValue Hex formatted number value. Example '0x01'
17
- * @returns sanitized value
18
- */
19
- sanitizeHexString(numberValue) {
20
- if (numberValue === '0x0' || numberValue == '') {
21
- return '0x';
22
- }
23
- else if (numberValue.length % 2 === 0) {
24
- return numberValue;
25
- }
26
- return '0x0' + numberValue.slice(2);
27
- }
28
- constructor(tx) {
29
- this._feeCurrency = (0, ethereumjs_util_1.toBuffer)('0x');
30
- this._gatewayFeeRecipient = (0, ethereumjs_util_1.toBuffer)('0x');
31
- this._gatewayFee = (0, ethereumjs_util_1.toBuffer)('0x');
32
- this.to = (0, ethereumjs_util_1.toBuffer)([]);
33
- this.v = (0, ethereumjs_util_1.toBuffer)([]);
34
- this.r = (0, ethereumjs_util_1.toBuffer)([]);
35
- this.s = (0, ethereumjs_util_1.toBuffer)([]);
36
- this.nonce = (0, ethereumjs_util_1.unpadBuffer)((0, ethereumjs_util_1.toBuffer)(tx.nonce));
37
- this.gasLimit = (0, ethereumjs_util_1.toBuffer)(this.sanitizeHexString(tx.gasLimit));
38
- this.gasPrice = (0, ethereumjs_util_1.toBuffer)(this.sanitizeHexString(tx.gasPrice));
39
- this.data = (0, ethereumjs_util_1.toBuffer)(this.sanitizeHexString(tx.data));
40
- this.value = (0, ethereumjs_util_1.toBuffer)(this.sanitizeHexString(tx.value));
41
- if (tx.to) {
42
- this.to = (0, ethereumjs_util_1.toBuffer)(tx.to);
43
- }
44
- if (tx.v) {
45
- this.v = (0, ethereumjs_util_1.toBuffer)(tx.v);
46
- }
47
- if (tx.r) {
48
- this.r = (0, ethereumjs_util_1.toBuffer)(tx.r);
49
- }
50
- if (tx.s) {
51
- this.s = (0, ethereumjs_util_1.toBuffer)(tx.s);
52
- }
53
- if (tx.from) {
54
- this._from = (0, ethereumjs_util_1.toBuffer)(tx.from);
55
- }
56
- this.initRaw();
57
- }
58
- initRaw() {
59
- this.raw = [
60
- this.nonce,
61
- this.gasPrice,
62
- this.gasLimit,
63
- this._feeCurrency,
64
- this._gatewayFeeRecipient,
65
- this._gatewayFee,
66
- this.to,
67
- this.value,
68
- this.data,
69
- this.v,
70
- this.r,
71
- this.s,
72
- ];
73
- }
74
- hash(includeSignature) {
75
- let items;
76
- if (includeSignature) {
77
- items = this.raw;
78
- }
79
- else {
80
- items = this.raw
81
- .slice(0, 9)
82
- .concat([(0, ethereumjs_util_1.toBuffer)(this.getChainId()), (0, ethereumjs_util_1.unpadBuffer)((0, ethereumjs_util_1.toBuffer)(0)), (0, ethereumjs_util_1.unpadBuffer)((0, ethereumjs_util_1.toBuffer)(0))]);
83
- }
84
- return (0, ethereumjs_util_1.rlphash)(items);
85
- }
86
- getSenderAddress() {
87
- if (this._from) {
88
- return this._from;
89
- }
90
- const pubKey = this.getSenderPublicKey();
91
- this._from = (0, ethereumjs_util_1.publicToAddress)(pubKey);
92
- return this._from;
93
- }
94
- getSenderPublicKey() {
95
- if (this.verifySignature()) {
96
- // If the signature was verified successfully the _senderPubKey field is defined
97
- return this._senderPubKey;
98
- }
99
- throw new Error('Invalid Signature');
100
- }
101
- serialize() {
102
- return ethereumjs_util_1.rlp.encode(this.raw);
103
- }
104
- sign(privateKey) {
105
- this._signatures = [this.v, this.r, this.s, privateKey];
106
- }
107
- verifySignature() {
108
- const msgHash = this.hash(false);
109
- try {
110
- const chainId = this.getChainId();
111
- const v = (0, ethereumjs_util_1.bufferToInt)(this.v) - (2 * chainId + 35);
112
- this._senderPubKey = (0, ethereumjs_util_1.ecrecover)(msgHash, v + 27, this.r, this.s);
113
- }
114
- catch (e) {
115
- return false;
116
- }
117
- return !!this._senderPubKey;
118
- }
119
- getChainId() {
120
- let chainId = (0, ethereumjs_util_1.bufferToInt)(this.v);
121
- if (this.r.length && this.s.length) {
122
- chainId = (chainId - 35) >> 1;
123
- }
124
- return chainId;
125
- }
126
- }
127
- exports.CeloTransaction = CeloTransaction;
128
- class CeloTransactionData {
129
- constructor(tx, deployedAddress) {
130
- this.tx = tx;
131
- this.deployedAddress = deployedAddress;
132
- }
133
- static fromJson(tx) {
134
- const chainId = (0, ethereumjs_util_1.addHexPrefix)(new bignumber_js_1.default(Number(tx.chainId)).toString(16));
135
- return new CeloTransactionData(new CeloTransaction({
136
- _type: sdk_coin_eth_1.ETHTransactionType.LEGACY,
137
- nonce: tx.nonce,
138
- to: tx.to,
139
- gasPrice: (0, ethereumjs_util_1.addHexPrefix)(new bignumber_js_1.default(tx.gasPrice).toString(16)),
140
- gasLimit: (0, ethereumjs_util_1.addHexPrefix)(new bignumber_js_1.default(tx.gasLimit).toString(16)),
141
- value: (0, ethereumjs_util_1.addHexPrefix)(new bignumber_js_1.default(tx.value).toString(16)),
142
- data: tx.data === '0x' ? '' : tx.data,
143
- from: tx.from,
144
- s: tx.s,
145
- r: tx.r,
146
- v: tx.v || chainId,
147
- }), tx.deployedAddress);
148
- }
149
- async sign(keyPair) {
150
- const privateKey = (0, ethereumjs_util_1.addHexPrefix)(keyPair.getKeys().prv);
151
- const data = CeloTransactionData.txJsonToCeloTx(this.toJson(), keyPair.getAddress());
152
- const celoLocalWallet = new wallet_local_1.LocalWallet();
153
- celoLocalWallet.addAccount(privateKey);
154
- const rawTransaction = await celoLocalWallet.signTransaction(data);
155
- const nonceBigNumber = new bignumber_js_1.default(rawTransaction.tx.nonce);
156
- rawTransaction.tx.nonce = (0, ethereumjs_util_1.addHexPrefix)(nonceBigNumber.toString(16));
157
- rawTransaction.raw = data.data === undefined ? '' : data.data;
158
- rawTransaction.tx.gas = rawTransaction.tx.gas;
159
- this.tx = new CeloTransaction(CeloTransactionData.encodedTxToJson(rawTransaction));
160
- this.tx.sign((0, ethereumjs_util_1.toBuffer)(privateKey));
161
- }
162
- /** @inheritdoc */
163
- toJson() {
164
- const result = {
165
- _type: sdk_coin_eth_1.ETHTransactionType.LEGACY,
166
- nonce: (0, ethereumjs_util_1.bufferToInt)(this.tx.nonce),
167
- gasPrice: new bignumber_js_1.default((0, ethereumjs_util_1.bufferToHex)(this.tx.gasPrice), 16).toString(10),
168
- gasLimit: new bignumber_js_1.default((0, ethereumjs_util_1.bufferToHex)(this.tx.gasLimit), 16).toString(10),
169
- value: this.tx.value.length === 0 ? '0' : new bignumber_js_1.default((0, ethereumjs_util_1.bufferToHex)(this.tx.value), 16).toString(10),
170
- data: (0, ethereumjs_util_1.bufferToHex)(this.tx.data),
171
- id: (0, ethereumjs_util_1.addHexPrefix)((0, ethereumjs_util_1.bufferToHex)(this.tx.hash(true))),
172
- };
173
- if (this.tx.to && this.tx.to.length) {
174
- result.to = (0, ethereumjs_util_1.bufferToHex)(this.tx.to);
175
- }
176
- if (this.tx.verifySignature()) {
177
- result.from = (0, ethereumjs_util_1.bufferToHex)(this.tx.getSenderAddress());
178
- }
179
- const chainId = this.tx.getChainId();
180
- if (chainId) {
181
- result.chainId = chainId.toString();
182
- }
183
- if (this.deployedAddress) {
184
- result.deployedAddress = this.deployedAddress;
185
- }
186
- this.setSignatureFields(result);
187
- return result;
188
- }
189
- setSignatureFields(result) {
190
- if (this.tx.v && this.tx.v.length) {
191
- result.v = (0, ethereumjs_util_1.bufferToHex)(this.tx.v);
192
- }
193
- if (this.tx.r && this.tx.r.length) {
194
- result.r = (0, ethereumjs_util_1.bufferToHex)(this.tx.r);
195
- }
196
- if (this.tx.s && this.tx.s.length) {
197
- result.s = (0, ethereumjs_util_1.bufferToHex)(this.tx.s);
198
- }
199
- }
200
- /** @inheritdoc */
201
- toSerialized() {
202
- return (0, ethereumjs_util_1.addHexPrefix)(this.tx.serialize().toString('hex'));
203
- }
204
- static txJsonToCeloTx(txJson, signer) {
205
- // the celo library requires you to specify the signer address with the from field
206
- return Object.assign({}, txJson, {
207
- chainId: txJson.chainId === undefined ? 0 : parseInt(txJson.chainId, 10),
208
- gas: txJson.gasLimit,
209
- from: signer,
210
- });
211
- }
212
- static encodedTxToJson(encodedTx) {
213
- return {
214
- ...encodedTx.tx,
215
- _type: sdk_coin_eth_1.ETHTransactionType.LEGACY,
216
- nonce: parseInt(encodedTx.tx.nonce, 16),
217
- gasLimit: encodedTx.tx.gas,
218
- data: encodedTx.raw,
219
- };
220
- }
221
- }
222
- exports.CeloTransactionData = CeloTransactionData;
223
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdFQUFxQztBQUNyQyxxREFBaUQ7QUFDakQscURBVXlCO0FBRXpCLHNEQUF3RztBQUV4RyxNQUFhLGVBQWU7SUFrQjFCLDBEQUEwRDtJQUMxRDs7Ozs7T0FLRztJQUNLLGlCQUFpQixDQUFDLFdBQVc7UUFDbkMsSUFBSSxXQUFXLEtBQUssS0FBSyxJQUFJLFdBQVcsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUMvQyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7YUFBTSxJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3hDLE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUM7UUFDRCxPQUFPLEtBQUssR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxZQUFZLEVBQWdCO1FBN0JwQixpQkFBWSxHQUFXLElBQUEsMEJBQVEsRUFBQyxJQUFJLENBQUMsQ0FBQztRQUN0Qyx5QkFBb0IsR0FBVyxJQUFBLDBCQUFRLEVBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUMsZ0JBQVcsR0FBVyxJQUFBLDBCQUFRLEVBQUMsSUFBSSxDQUFDLENBQUM7UUFNN0MsT0FBRSxHQUFXLElBQUEsMEJBQVEsRUFBQyxFQUFFLENBQUMsQ0FBQztRQUMxQixNQUFDLEdBQVcsSUFBQSwwQkFBUSxFQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pCLE1BQUMsR0FBVyxJQUFBLDBCQUFRLEVBQUMsRUFBRSxDQUFDLENBQUM7UUFDekIsTUFBQyxHQUFXLElBQUEsMEJBQVEsRUFBQyxFQUFFLENBQUMsQ0FBQztRQW1CdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFBLDZCQUFXLEVBQUMsSUFBQSwwQkFBUSxFQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBQSwwQkFBUSxFQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUEsMEJBQVEsRUFBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFBLDBCQUFRLEVBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBQSwwQkFBUSxFQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN4RCxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNWLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBQSwwQkFBUSxFQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM1QixDQUFDO1FBQ0QsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDVCxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUEsMEJBQVEsRUFBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsQ0FBQztRQUNELElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ1QsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFBLDBCQUFRLEVBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLENBQUM7UUFDRCxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNULElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBQSwwQkFBUSxFQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixDQUFDO1FBQ0QsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDWixJQUFJLENBQUMsS0FBSyxHQUFHLElB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O1lBQ3BCLElBQUksRUFBRSxNQUFNO1NBQ2IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLE1BQU0sQ0FBQyxlQUFlLENBQUMsU0FBNkI7UUFDMUQsT0FBTztZQUNMLEdBQUcsU0FBUyxDQUFDLEVBQUU7WUFDZixLQUFLLEVBQUUsaUNBQWtCLENBQUMsTUFBTTtZQUNoQyxLQUFLLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUN2QyxRQUFRLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQyxHQUFHO1lBQzFCLElBQUksRUFBRSxTQUFTLENBQUMsR0FBRztTQUNwQixDQUFDO0lBQ0osQ0FBQztDQUNGO0FBbkhELGtEQW1IQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCB7IExvY2FsV2FsbGV0IH0gZnJvbSAnQGNlbG8vd2FsbGV0LWxvY2FsJztcbmltcG9ydCB7XG4gIGFkZEhleFByZWZpeCxcbiAgdG9CdWZmZXIsXG4gIGJ1ZmZlclRvSGV4LFxuICBidWZmZXJUb0ludCxcbiAgcmxwLFxuICBybHBoYXNoLFxuICBlY3JlY292ZXIsXG4gIHB1YmxpY1RvQWRkcmVzcyxcbiAgdW5wYWRCdWZmZXIsXG59IGZyb20gJ2V0aGVyZXVtanMtdXRpbCc7XG5pbXBvcnQgeyBDZWxvVHgsIEVuY29kZWRUcmFuc2FjdGlvbiB9IGZyb20gJ0BjZWxvL2Nvbm5lY3QnO1xuaW1wb3J0IHsgRXRoTGlrZVRyYW5zYWN0aW9uRGF0YSwgRVRIVHJhbnNhY3Rpb25UeXBlLCBLZXlQYWlyLCBMZWdhY3lUeERhdGEgfSBmcm9tICdAYml0Z28vc2RrLWNvaW4tZXRoJztcblxuZXhwb3J0IGNsYXNzIENlbG9UcmFuc2FjdGlvbiB7XG4gIHByaXZhdGUgcmF3OiBCdWZmZXJbXTtcbiAgcHJpdmF0ZSBfZnJvbTogQnVmZmVyO1xuICBwcml2YXRlIF9zZW5kZXJQdWJLZXk/O1xuICBwcml2YXRlIF9zaWduYXR1cmVzOiBCdWZmZXJbXTtcbiAgcHJpdmF0ZSBfZmVlQ3VycmVuY3k6IEJ1ZmZlciA9IHRvQnVmZmVyKCcweCcpO1xuICBwcml2YXRlIF9nYXRld2F5RmVlUmVjaXBpZW50OiBCdWZmZXIgPSB0b0J1ZmZlcignMHgnKTtcbiAgcHJpdmF0ZSBfZ2F0ZXdheUZlZTogQnVmZmVyID0gdG9CdWZmZXIoJzB4Jyk7XG4gIG5vbmNlOiBCdWZmZXI7XG4gIGdhc0xpbWl0OiBCdWZmZXI7XG4gIGdhc1ByaWNlOiBCdWZmZXI7XG4gIGRhdGE6IEJ1ZmZlcjtcbiAgdmFsdWU6IEJ1ZmZlcjtcbiAgdG86IEJ1ZmZlciA9IHRvQnVmZmVyKFtdKTtcbiAgdjogQnVmZmVyID0gdG9CdWZmZXIoW10pO1xuICByOiBCdWZmZXIgPSB0b0J1ZmZlcihbXSk7XG4gIHM6IEJ1ZmZlciA9IHRvQnVmZmVyKFtdKTtcblxuICAvLyBUT0RPOiB2YWxpZGF0ZSBpZiB0aGlzIG5lZWRzIHRvIGJlIG1vdmVkIHRvIFV0aWxzIGNsYXNzXG4gIC8qKlxuICAgKiBDbGVhbiBoZXggZm9ybWF0dGVkIHZhbHVlcyBlbnN1cmluZyB0aGV5IGhhdmUgYW4gZXZlbiBsZW5ndGhcbiAgICpcbiAgICogQHBhcmFtIG51bWJlclZhbHVlIEhleCBmb3JtYXR0ZWQgbnVtYmVyIHZhbHVlLiBFeGFtcGxlICcweDAxJ1xuICAgKiBAcmV0dXJucyBzYW5pdGl6ZWQgdmFsdWVcbiAgICovXG4gIHByaXZhdGUgc2FuaXRpemVIZXhTdHJpbmcobnVtYmVyVmFsdWUpIHtcbiAgICBpZiAobnVtYmVyVmFsdWUgPT09ICcweDAnIHx8IG51bWJlclZhbHVlID09ICcnKSB7XG4gICAgICByZXR1cm4gJzB4JztcbiAgICB9IGVsc2UgaWYgKG51bWJlclZhbHVlLmxlbmd0aCAlIDIgPT09IDApIHtcbiAgICAgIHJldHVybiBudW1iZXJWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuICcweDAnICsgbnVtYmVyVmFsdWUuc2xpY2UoMik7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcih0eDogTGVnYWN5VHhEYXRhKSB7XG4gICAgdGhpcy5ub25jZSA9IHVucGFkQnVmZmVyKHRvQnVmZmVyKHR4Lm5vbmNlKSk7XG4gICAgdGhpcy5nYXNMaW1pdCA9IHRvQnVmZmVyKHRoaXMuc2FuaXRpemVIZXhTdHJpbmcodHguZ2FzTGltaXQpKTtcbiAgICB0aGlzLmdhc1ByaWNlID0gdG9CdWZmZXIodGhpcy5zYW5pdGl6ZUhleFN0cmluZyh0eC5nYXNQcmljZSkpO1xuICAgIHRoaXMuZGF0YSA9IHRvQnVmZmVyKHRoaXMuc2FuaXRpemVIZXhTdHJpbmcodHguZGF0YSkpO1xuICAgIHRoaXMudmFsdWUgPSB0b0J1ZmZlcih0aGlzLnNhbml0aXplSGV4U3RyaW5nKHR4LnZhbHVlKSk7XG4gICAgaWYgKHR4LnRvKSB7XG4gICAgICB0aGlzLnRvID0gdG9CdWZmZXIodHgudG8pO1xuICAgIH1cbiAgICBpZiAodHgudikge1xuICAgICAgdGhpcy52ID0gdG9CdWZmZXIodHgudik7XG4gICAgfVxuICAgIGlmICh0eC5yKSB7XG4gICAgICB0aGlzLnIgPSB0b0J1ZmZlcih0eC5yKTtcbiAgICB9XG4gICAgaWYgKHR4LnMpIHtcbiAgICAgIHRoaXMucyA9IHRvQnVmZmVyKHR4LnMpO1xuICAgIH1cbiAgICBpZiAodHguZnJvbSkge1xuICAgICAgdGhpcy5fZnJvbSA9IHRvQnVmZmVyKHR4LmZyb20pO1xuICAgIH1cbiAgICB0aGlzLmluaXRSYXcoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFJhdygpIHtcbiAgICB0aGlzLnJhdyA9IFtcbiAgICAgIHRoaXMubm9uY2UsXG4gICAgICB0aGlzLmdhc1ByaWNlLFxuICAgICAgdGhpcy5nYXNMaW1pdCxcbiAgICAgIHRoaXMuX2ZlZUN1cnJlbmN5LFxuICAgICAgdGhpcy5fZ2F0ZXdheUZlZVJlY2lwaWVudCxcbiAgICAgIHRoaXMuX2dhdGV3YXlGZWUsXG4gICAgICB0aGlzLnRvLFxuICAgICAgdGhpcy52YWx1ZSxcbiAgICAgIHRoaXMuZGF0YSxcbiAgICAgIHRoaXMudixcbiAgICAgIHRoaXMucixcbiAgICAgIHRoaXMucyxcbiAgICBdO1xuICB9XG5cbiAgaGFzaChpbmNsdWRlU2lnbmF0dXJlPzogYm9vbGVhbik6IEJ1ZmZlciB7XG4gICAgbGV0IGl0ZW1zO1xuICAgIGlmIChpbmNsdWRlU2lnbmF0dXJlKSB7XG4gICAgICBpdGVtcyA9IHRoaXMucmF3O1xuICAgIH0gZWxzZSB7XG4gICAgICBpdGVtcyA9IHRoaXMucmF3XG4gICAgICAgIC5zbGljZSgwLCA5KVxuICAgICAgICAuY29uY2F0KFt0b0J1ZmZlcih0aGlzLmdldENoYWluSWQoKSksIHVucGFkQnVmZmVyKHRvQnVmZmVyKDApKSwgdW5wYWRCdWZmZXIodG9CdWZmZXIoMCkpXSk7XG4gICAgfVxuICAgIHJldHVybiBybHBoYXNoKGl0ZW1zKTtcbiAgfVxuXG4gIGdldFNlbmRlckFkZHJlc3MoKTogQnVmZmVyIHtcbiAgICBpZiAodGhpcy5fZnJvbSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2Zyb207XG4gICAgfVxuICAgIGNvbnN0IHB1YktleSA9IHRoaXMuZ2V0U2VuZGVyUHVibGljS2V5KCk7XG4gICAgdGhpcy5fZnJvbSA9IHB1YmxpY1RvQWRkcmVzcyhwdWJLZXkpO1xuICAgIHJldHVybiB0aGlzLl9mcm9tO1xuICB9XG5cbiAgZ2V0U2VuZGVyUHVibGljS2V5KCkge1xuICAgIGlmICh0aGlzLnZlcmlmeVNpZ25hdHVyZSgpKSB7XG4gICAgICAvLyBJZiB0aGUgc2lnbmF0dXJlIHdhcyB2ZXJpZmllZCBzdWNjZXNzZnVsbHkgdGhlIF9zZW5kZXJQdWJLZXkgZmllbGQgaXMgZGVmaW5lZFxuICAgICAgcmV0dXJuIHRoaXMuX3NlbmRlclB1YktleTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFNpZ25hdHVyZScpO1xuICB9XG5cbiAgc2VyaWFsaXplKCk6IEJ1ZmZlciB7XG4gICAgcmV0dXJuIHJscC5lbmNvZGUodGhpcy5yYXcpO1xuICB9XG5cbiAgc2lnbihwcml2YXRlS2V5OiBCdWZmZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9zaWduYXR1cmVzID0gW3RoaXMudiwgdGhpcy5yLCB0aGlzLnMsIHByaXZhdGVLZXldO1xuICB9XG5cbiAgdmVyaWZ5U2lnbmF0dXJlKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG1zZ0hhc2ggPSB0aGlzLmhhc2goZmFsc2UpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjaGFpbklkID0gdGhpcy5nZXRDaGFpbklkKCk7XG4gICAgICBjb25zdCB2ID0gYnVmZmVyVG9JbnQodGhpcy52KSAtICgyICogY2hhaW5JZCArIDM1KTtcbiAgICAgIHRoaXMuX3NlbmRlclB1YktleSA9IGVjcmVjb3Zlcihtc2dIYXNoLCB2ICsgMjcsIHRoaXMuciwgdGhpcy5zKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiAhIXRoaXMuX3NlbmRlclB1YktleTtcbiAgfVxuXG4gIGdldENoYWluSWQoKTogbnVtYmVyIHtcbiAgICBsZXQgY2hhaW5JZCA9IGJ1ZmZlclRvSW50KHRoaXMudik7XG4gICAgaWYgKHRoaXMuci5sZW5ndGggJiYgdGhpcy5zLmxlbmd0aCkge1xuICAgICAgY2hhaW5JZCA9IChjaGFpbklkIC0gMzUpID4+IDE7XG4gICAgfVxuICAgIHJldHVybiBjaGFpbklkO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDZWxvVHJhbnNhY3Rpb25EYXRhIGltcGxlbWVudHMgRXRoTGlrZVRyYW5zYWN0aW9uRGF0YSB7XG4gIHByaXZhdGUgdHg6IENlbG9UcmFuc2FjdGlvbjtcbiAgcHJpdmF0ZSBkZXBsb3llZEFkZHJlc3M/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IodHg6IENlbG9UcmFuc2FjdGlvbiwgZGVwbG95ZWRBZGRyZXNzPzogc3RyaW5nKSB7XG4gICAgdGhpcy50eCA9IHR4O1xuICAgIHRoaXMuZGVwbG95ZWRBZGRyZXNzID0gZGVwbG95ZWRBZGRyZXNzO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBmcm9tSnNvbih0eDogTGVnYWN5VHhEYXRhKTogQ2Vsb1RyYW5zYWN0aW9uRGF0YSB7XG4gICAgY29uc3QgY2hhaW5JZCA9IGFkZEhleFByZWZpeChuZXcgQmlnTnVtYmVyKE51bWJlcih0eC5jaGFpbklkKSkudG9TdHJpbmcoMTYpKTtcbiAgICByZXR1cm4gbmV3IENlbG9UcmFuc2FjdGlvbkRhdGEoXG4gICAgICBuZXcgQ2Vsb1RyYW5zYWN0aW9uKHtcbiAgICAgICAgX3R5cGU6IEVUSFRyYW5zYWN0aW9uVHlwZS5MRUdBQ1ksXG4gICAgICAgIG5vbmNlOiB0eC5ub25jZSxcbiAgICAgICAgdG86IHR4LnRvLFxuICAgICAgICBnYXNQcmljZTogYWRkSGV4UHJlZml4KG5ldyBCaWdOdW1iZXIodHguZ2FzUHJpY2UpLnRvU3RyaW5nKDE2KSksXG4gICAgICAgIGdhc0xpbWl0OiBhZGRIZXhQcmVmaXgobmV3IEJpZ051bWJlcih0eC5nYXNMaW1pdCkudG9TdHJpbmcoMTYpKSxcbiAgICAgICAgdmFsdWU6IGFkZEhleFByZWZpeChuZXcgQmlnTnVtYmVyKHR4LnZhbHVlKS50b1N0cmluZygxNikpLFxuICAgICAgICBkYXRhOiB0eC5kYXRhID09PSAnMHgnID8gJycgOiB0eC5kYXRhLFxuICAgICAgICBmcm9tOiB0eC5mcm9tLFxuICAgICAgICBzOiB0eC5zLFxuICAgICAgICByOiB0eC5yLFxuICAgICAgICB2OiB0eC52IHx8IGNoYWluSWQsXG4gICAgICB9KSxcbiAgICAgIHR4LmRlcGxveWVkQWRkcmVzc1xuICAgICk7XG4gIH1cblxuICBhc3luYyBzaWduKGtleVBhaXI6IEtleVBhaXIpIHtcbiAgICBjb25zdCBwcml2YXRlS2V5ID0gYWRkSGV4UHJlZml4KGtleVBhaXIuZ2V0S2V5cygpLnBydiBhcyBzdHJpbmcpO1xuICAgIGNvbnN0IGRhdGEgPSBDZWxvVHJhbnNhY3Rpb25EYXRhLnR4SnNvblRvQ2Vsb1R4KHRoaXMudG9Kc29uKCksIGtleVBhaXIuZ2V0QWRkcmVzcygpKTtcbiAgICBjb25zdCBjZWxvTG9jYWxXYWxsZXQgPSBuZXcgTG9jYWxXYWxsZXQoKTtcbiAgICBjZWxvTG9jYWxXYWxsZXQuYWRkQWNjb3VudChwcml2YXRlS2V5KTtcbiAgICBjb25zdCByYXdUcmFuc2FjdGlvbiA9IGF3YWl0IGNlbG9Mb2NhbFdhbGxldC5zaWduVHJhbnNhY3Rpb24oZGF0YSk7XG5cbiAgICBjb25zdCBub25jZUJpZ051bWJlciA9IG5ldyBCaWdOdW1iZXIocmF3VHJhbnNhY3Rpb24udHgubm9uY2UpO1xuICAgIHJhd1RyYW5zYWN0aW9uLnR4Lm5vbmNlID0gYWRkSGV4UHJlZml4KG5vbmNlQmlnTnVtYmVyLnRvU3RyaW5nKDE2KSk7XG4gICAgcmF3VHJhbnNhY3Rpb24ucmF3ID0gZGF0YS5kYXRhID09PSB1bmRlZmluZWQgPyAnJyA6IGRhdGEuZGF0YTtcbiAgICByYXdUcmFuc2FjdGlvbi50eC5nYXMgPSByYXdUcmFuc2FjdGlvbi50eC5nYXM7XG4gICAgdGhpcy50eCA9IG5ldyBDZWxvVHJhbnNhY3Rpb24oQ2Vsb1RyYW5zYWN0aW9uRGF0YS5lbmNvZGVkVHhUb0pzb24ocmF3VHJhbnNhY3Rpb24pKTtcbiAgICB0aGlzLnR4LnNpZ24odG9CdWZmZXIocHJpdmF0ZUtleSkpO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHRvSnNvbigpOiBMZWdhY3lUeERhdGEge1xuICAgIGNvbnN0IHJlc3VsdDogTGVnYWN5VHhEYXRhID0ge1xuICAgICAgX3R5cGU6IEVUSFRyYW5zYWN0aW9uVHlwZS5MRUdBQ1ksXG4gICAgICBub25jZTogYnVmZmVyVG9JbnQodGhpcy50eC5ub25jZSksXG4gICAgICBnYXNQcmljZTogbmV3IEJpZ051bWJlcihidWZmZXJUb0hleCh0aGlzLnR4Lmdhc1ByaWNlKSwgMTYpLnRvU3RyaW5nKDEwKSxcbiAgICAgIGdhc0xpbWl0OiBuZXcgQmlnTnVtYmVyKGJ1ZmZlclRvSGV4KHRoaXMudHguZ2FzTGltaXQpLCAxNikudG9TdHJpbmcoMTApLFxuICAgICAgdmFsdWU6IHRoaXMudHgudmFsdWUubGVuZ3RoID09PSAwID8gJzAnIDogbmV3IEJpZ051bWJlcihidWZmZXJUb0hleCh0aGlzLnR4LnZhbHVlKSwgMTYpLnRvU3RyaW5nKDEwKSxcbiAgICAgIGRhdGE6IGJ1ZmZlclRvSGV4KHRoaXMudHguZGF0YSksXG4gICAgICBpZDogYWRkSGV4UHJlZml4KGJ1ZmZlclRvSGV4KHRoaXMudHguaGFzaCh0cnVlKSkpLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy50eC50byAmJiB0aGlzLnR4LnRvLmxlbmd0aCkge1xuICAgICAgcmVzdWx0LnRvID0gYnVmZmVyVG9IZXgodGhpcy50eC50byk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHgudmVyaWZ5U2lnbmF0dXJlKCkpIHtcbiAgICAgIHJlc3VsdC5mcm9tID0gYnVmZmVyVG9IZXgodGhpcy50eC5nZXRTZW5kZXJBZGRyZXNzKCkpO1xuICAgIH1cblxuICAgIGNvbnN0IGNoYWluSWQgPSB0aGlzLnR4LmdldENoYWluSWQoKTtcbiAgICBpZiAoY2hhaW5JZCkge1xuICAgICAgcmVzdWx0LmNoYWluSWQgPSBjaGFpbklkLnRvU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGVwbG95ZWRBZGRyZXNzKSB7XG4gICAgICByZXN1bHQuZGVwbG95ZWRBZGRyZXNzID0gdGhpcy5kZXBsb3llZEFkZHJlc3M7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTaWduYXR1cmVGaWVsZHMocmVzdWx0KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIHNldFNpZ25hdHVyZUZpZWxkcyhyZXN1bHQ6IExlZ2FjeVR4RGF0YSk6IHZvaWQge1xuICAgIGlmICh0aGlzLnR4LnYgJiYgdGhpcy50eC52Lmxlbmd0aCkge1xuICAgICAgcmVzdWx0LnYgPSBidWZmZXJUb0hleCh0aGlzLnR4LnYpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnR4LnIgJiYgdGhpcy50eC5yLmxlbmd0aCkge1xuICAgICAgcmVzdWx0LnIgPSBidWZmZXJUb0hleCh0aGlzLnR4LnIpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnR4LnMgJiYgdGhpcy50eC5zLmxlbmd0aCkge1xuICAgICAgcmVzdWx0LnMgPSBidWZmZXJUb0hleCh0aGlzLnR4LnMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB0b1NlcmlhbGl6ZWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYWRkSGV4UHJlZml4KHRoaXMudHguc2VyaWFsaXplKCkudG9TdHJpbmcoJ2hleCcpKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHR4SnNvblRvQ2Vsb1R4KHR4SnNvbjogTGVnYWN5VHhEYXRhLCBzaWduZXI6IHN0cmluZyk6IENlbG9UeCB7XG4gICAgLy8gdGhlIGNlbG8gbGlicmFyeSByZXF1aXJlcyB5b3UgdG8gc3BlY2lmeSB0aGUgc2lnbmVyIGFkZHJlc3Mgd2l0aCB0aGUgZnJvbSBmaWVsZFxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCB0eEpzb24sIHtcbiAgICAgIGNoYWluSWQ6IHR4SnNvbi5jaGFpbklkID09PSB1bmRlZmluZWQgPyAwIDogcGFyc2VJbnQodHhKc29uLmNoYWluSWQsIDEwKSxcbiAgICAgIGdhczogdHhKc29uLmdhc0xpbWl0LFxuICAgICAgZnJvbTogc2lnbmVyLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZW5jb2RlZFR4VG9Kc29uKGVuY29kZWRUeDogRW5jb2RlZFRyYW5zYWN0aW9uKTogTGVnYWN5VHhEYXRhIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZW5jb2RlZFR4LnR4LFxuICAgICAgX3R5cGU6IEVUSFRyYW5zYWN0aW9uVHlwZS5MRUdBQ1ksXG4gICAgICBub25jZTogcGFyc2VJbnQoZW5jb2RlZFR4LnR4Lm5vbmNlLCAxNiksXG4gICAgICBnYXNMaW1pdDogZW5jb2RlZFR4LnR4LmdhcyxcbiAgICAgIGRhdGE6IGVuY29kZWRUeC5yYXcsXG4gICAgfTtcbiAgfVxufVxuIl19