@bitgo-beta/sdk-coin-celo 1.3.3-alpha.407 → 1.3.3-alpha.409

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-beta/sdk-coin-celo",
3
- "version": "1.3.3-alpha.407",
3
+ "version": "1.3.3-alpha.409",
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-beta/abstract-eth": "1.2.3-alpha.411",
44
- "@bitgo-beta/sdk-coin-eth": "2.4.1-alpha.409",
45
- "@bitgo-beta/sdk-core": "2.4.1-alpha.411",
46
- "@bitgo-beta/statics": "10.0.1-alpha.411",
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-beta/abstract-eth": "1.2.3-alpha.413",
44
+ "@bitgo-beta/sdk-coin-eth": "2.4.1-alpha.411",
45
+ "@bitgo-beta/sdk-core": "2.4.1-alpha.413",
46
+ "@bitgo-beta/statics": "10.0.1-alpha.413",
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-beta/sdk-api": "1.6.1-alpha.411",
59
- "@bitgo-beta/sdk-test": "^9.1.4"
53
+ "@bitgo-beta/sdk-api": "1.6.1-alpha.413",
54
+ "@bitgo-beta/sdk-test": "^9.1.7"
60
55
  },
61
56
  "resolutions": {
62
57
  "form-data": "^4.0.4"
63
58
  },
64
- "gitHead": "c3df6d35f18d6d1b2588dddaf08a0f3d092c6d39",
59
+ "gitHead": "930ca59f94921ae2bbda9e74b7f983609b2b59b1",
65
60
  "files": [
66
61
  "dist"
67
62
  ]
@@ -1,50 +0,0 @@
1
- import { EthLikeTransactionData, KeyPair, LegacyTxData } from '@bitgo-beta/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,0BAA0B,CAAC;AAE7G,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-beta/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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdFQUFxQztBQUNyQyxxREFBaUQ7QUFDakQscURBVXlCO0FBRXpCLDJEQUE2RztBQUU3RyxNQUFhLGVBQWU7SUFrQjFCLDBEQUEwRDtJQUMxRDs7Ozs7T0FLRztJQUNLLGlCQUFpQixDQUFDLFdBQVc7UUFDbkMsSUFBSSxXQUFXLEtBQUssS0FBSyxJQUFJLFdBQVcsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUMvQyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7YUFBTSxJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3hDLE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUM7UUFDRCxPQUFPLEtBQUssR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxZQUFZLEVBQWdCO1FBN0JwQixpQkFBWSxHQUFXLElBQUEsMEJBQVEsRUFBQyxJQUFJLENBQUMsQ0FBQztRQUN0Qyx5QkFBb0IsR0FBVyxJQUFBLDBCQUFRLEVBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUMsZ0JBQVcsR0FBVyxJQUFBLDBCQUFRLEVBQUMsSUFBSSxDQUFDLENBQUM7UUFNN0MsT0FBRSxHQUFXLElBQUEsMEJBQVEsRUFBQyxFQUFFLENBQUMsQ0FBQztRQUMxQixNQUFDLEdBQVcsSUFBQSwwQkFBUSxFQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pCLE1BQUMsR0FBVyxJQUFBLDBCQUFRLEVBQUMsRUFBRSxDQUFDLENBQUM7UUFDekIsTUFBQyxHQUFXLElBQUEsMEJBQVEsRUFBQyxFQUFFLENBQUMsQ0FBQztRQW1CdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFBLDZCQUFXLEVBQUMsSUFBQSwwQkFBUSxFQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBQSwwQkFBUSxFQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUM5RCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUEsMEJBQVEsRUFBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDOUQsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFBLDBCQUFRLEVBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBQSwwQkFBUSxFQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN4RCxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNWLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBQSwwQkFBUSxFQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM1QixDQUFDO1FBQ0QsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDVCxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUEsMEJBQVEsRUFBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsQ0FBQztRQUNELElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ1QsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFBLDBCQUFRLEVBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLENBQUM7UUFDRCxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNULElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBQSwwQkFBUSxFQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixDQUFDO1FBQ0QsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDWixJQUFJLENBQUMsS0FBSyxHQUFHLElB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O1lBQ3BCLElBQUksRUFBRSxNQUFNO1NBQ2IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLE1BQU0sQ0FBQyxlQUFlLENBQUMsU0FBNkI7UUFDMUQsT0FBTztZQUNMLEdBQUcsU0FBUyxDQUFDLEVBQUU7WUFDZixLQUFLLEVBQUUsaUNBQWtCLENBQUMsTUFBTTtZQUNoQyxLQUFLLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUN2QyxRQUFRLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQyxHQUFHO1lBQzFCLElBQUksRUFBRSxTQUFTLENBQUMsR0FBRztTQUNwQixDQUFDO0lBQ0osQ0FBQztDQUNGO0FBbkhELGtEQW1IQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCB7IExvY2FsV2FsbGV0IH0gZnJvbSAnQGNlbG8vd2FsbGV0LWxvY2FsJztcbmltcG9ydCB7XG4gIGFkZEhleFByZWZpeCxcbiAgdG9CdWZmZXIsXG4gIGJ1ZmZlclRvSGV4LFxuICBidWZmZXJUb0ludCxcbiAgcmxwLFxuICBybHBoYXNoLFxuICBlY3JlY292ZXIsXG4gIHB1YmxpY1RvQWRkcmVzcyxcbiAgdW5wYWRCdWZmZXIsXG59IGZyb20gJ2V0aGVyZXVtanMtdXRpbCc7XG5pbXBvcnQgeyBDZWxvVHgsIEVuY29kZWRUcmFuc2FjdGlvbiB9IGZyb20gJ0BjZWxvL2Nvbm5lY3QnO1xuaW1wb3J0IHsgRXRoTGlrZVRyYW5zYWN0aW9uRGF0YSwgRVRIVHJhbnNhY3Rpb25UeXBlLCBLZXlQYWlyLCBMZWdhY3lUeERhdGEgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29pbi1ldGgnO1xuXG5leHBvcnQgY2xhc3MgQ2Vsb1RyYW5zYWN0aW9uIHtcbiAgcHJpdmF0ZSByYXc6IEJ1ZmZlcltdO1xuICBwcml2YXRlIF9mcm9tOiBCdWZmZXI7XG4gIHByaXZhdGUgX3NlbmRlclB1YktleT87XG4gIHByaXZhdGUgX3NpZ25hdHVyZXM6IEJ1ZmZlcltdO1xuICBwcml2YXRlIF9mZWVDdXJyZW5jeTogQnVmZmVyID0gdG9CdWZmZXIoJzB4Jyk7XG4gIHByaXZhdGUgX2dhdGV3YXlGZWVSZWNpcGllbnQ6IEJ1ZmZlciA9IHRvQnVmZmVyKCcweCcpO1xuICBwcml2YXRlIF9nYXRld2F5RmVlOiBCdWZmZXIgPSB0b0J1ZmZlcignMHgnKTtcbiAgbm9uY2U6IEJ1ZmZlcjtcbiAgZ2FzTGltaXQ6IEJ1ZmZlcjtcbiAgZ2FzUHJpY2U6IEJ1ZmZlcjtcbiAgZGF0YTogQnVmZmVyO1xuICB2YWx1ZTogQnVmZmVyO1xuICB0bzogQnVmZmVyID0gdG9CdWZmZXIoW10pO1xuICB2OiBCdWZmZXIgPSB0b0J1ZmZlcihbXSk7XG4gIHI6IEJ1ZmZlciA9IHRvQnVmZmVyKFtdKTtcbiAgczogQnVmZmVyID0gdG9CdWZmZXIoW10pO1xuXG4gIC8vIFRPRE86IHZhbGlkYXRlIGlmIHRoaXMgbmVlZHMgdG8gYmUgbW92ZWQgdG8gVXRpbHMgY2xhc3NcbiAgLyoqXG4gICAqIENsZWFuIGhleCBmb3JtYXR0ZWQgdmFsdWVzIGVuc3VyaW5nIHRoZXkgaGF2ZSBhbiBldmVuIGxlbmd0aFxuICAgKlxuICAgKiBAcGFyYW0gbnVtYmVyVmFsdWUgSGV4IGZvcm1hdHRlZCBudW1iZXIgdmFsdWUuIEV4YW1wbGUgJzB4MDEnXG4gICAqIEByZXR1cm5zIHNhbml0aXplZCB2YWx1ZVxuICAgKi9cbiAgcHJpdmF0ZSBzYW5pdGl6ZUhleFN0cmluZyhudW1iZXJWYWx1ZSkge1xuICAgIGlmIChudW1iZXJWYWx1ZSA9PT0gJzB4MCcgfHwgbnVtYmVyVmFsdWUgPT0gJycpIHtcbiAgICAgIHJldHVybiAnMHgnO1xuICAgIH0gZWxzZSBpZiAobnVtYmVyVmFsdWUubGVuZ3RoICUgMiA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bWJlclZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gJzB4MCcgKyBudW1iZXJWYWx1ZS5zbGljZSgyKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHR4OiBMZWdhY3lUeERhdGEpIHtcbiAgICB0aGlzLm5vbmNlID0gdW5wYWRCdWZmZXIodG9CdWZmZXIodHgubm9uY2UpKTtcbiAgICB0aGlzLmdhc0xpbWl0ID0gdG9CdWZmZXIodGhpcy5zYW5pdGl6ZUhleFN0cmluZyh0eC5nYXNMaW1pdCkpO1xuICAgIHRoaXMuZ2FzUHJpY2UgPSB0b0J1ZmZlcih0aGlzLnNhbml0aXplSGV4U3RyaW5nKHR4Lmdhc1ByaWNlKSk7XG4gICAgdGhpcy5kYXRhID0gdG9CdWZmZXIodGhpcy5zYW5pdGl6ZUhleFN0cmluZyh0eC5kYXRhKSk7XG4gICAgdGhpcy52YWx1ZSA9IHRvQnVmZmVyKHRoaXMuc2FuaXRpemVIZXhTdHJpbmcodHgudmFsdWUpKTtcbiAgICBpZiAodHgudG8pIHtcbiAgICAgIHRoaXMudG8gPSB0b0J1ZmZlcih0eC50byk7XG4gICAgfVxuICAgIGlmICh0eC52KSB7XG4gICAgICB0aGlzLnYgPSB0b0J1ZmZlcih0eC52KTtcbiAgICB9XG4gICAgaWYgKHR4LnIpIHtcbiAgICAgIHRoaXMuciA9IHRvQnVmZmVyKHR4LnIpO1xuICAgIH1cbiAgICBpZiAodHgucykge1xuICAgICAgdGhpcy5zID0gdG9CdWZmZXIodHgucyk7XG4gICAgfVxuICAgIGlmICh0eC5mcm9tKSB7XG4gICAgICB0aGlzLl9mcm9tID0gdG9CdWZmZXIodHguZnJvbSk7XG4gICAgfVxuICAgIHRoaXMuaW5pdFJhdygpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0UmF3KCkge1xuICAgIHRoaXMucmF3ID0gW1xuICAgICAgdGhpcy5ub25jZSxcbiAgICAgIHRoaXMuZ2FzUHJpY2UsXG4gICAgICB0aGlzLmdhc0xpbWl0LFxuICAgICAgdGhpcy5fZmVlQ3VycmVuY3ksXG4gICAgICB0aGlzLl9nYXRld2F5RmVlUmVjaXBpZW50LFxuICAgICAgdGhpcy5fZ2F0ZXdheUZlZSxcbiAgICAgIHRoaXMudG8sXG4gICAgICB0aGlzLnZhbHVlLFxuICAgICAgdGhpcy5kYXRhLFxuICAgICAgdGhpcy52LFxuICAgICAgdGhpcy5yLFxuICAgICAgdGhpcy5zLFxuICAgIF07XG4gIH1cblxuICBoYXNoKGluY2x1ZGVTaWduYXR1cmU/OiBib29sZWFuKTogQnVmZmVyIHtcbiAgICBsZXQgaXRlbXM7XG4gICAgaWYgKGluY2x1ZGVTaWduYXR1cmUpIHtcbiAgICAgIGl0ZW1zID0gdGhpcy5yYXc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGl0ZW1zID0gdGhpcy5yYXdcbiAgICAgICAgLnNsaWNlKDAsIDkpXG4gICAgICAgIC5jb25jYXQoW3RvQnVmZmVyKHRoaXMuZ2V0Q2hhaW5JZCgpKSwgdW5wYWRCdWZmZXIodG9CdWZmZXIoMCkpLCB1bnBhZEJ1ZmZlcih0b0J1ZmZlcigwKSldKTtcbiAgICB9XG4gICAgcmV0dXJuIHJscGhhc2goaXRlbXMpO1xuICB9XG5cbiAgZ2V0U2VuZGVyQWRkcmVzcygpOiBCdWZmZXIge1xuICAgIGlmICh0aGlzLl9mcm9tKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZnJvbTtcbiAgICB9XG4gICAgY29uc3QgcHViS2V5ID0gdGhpcy5nZXRTZW5kZXJQdWJsaWNLZXkoKTtcbiAgICB0aGlzLl9mcm9tID0gcHVibGljVG9BZGRyZXNzKHB1YktleSk7XG4gICAgcmV0dXJuIHRoaXMuX2Zyb207XG4gIH1cblxuICBnZXRTZW5kZXJQdWJsaWNLZXkoKSB7XG4gICAgaWYgKHRoaXMudmVyaWZ5U2lnbmF0dXJlKCkpIHtcbiAgICAgIC8vIElmIHRoZSBzaWduYXR1cmUgd2FzIHZlcmlmaWVkIHN1Y2Nlc3NmdWxseSB0aGUgX3NlbmRlclB1YktleSBmaWVsZCBpcyBkZWZpbmVkXG4gICAgICByZXR1cm4gdGhpcy5fc2VuZGVyUHViS2V5O1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgU2lnbmF0dXJlJyk7XG4gIH1cblxuICBzZXJpYWxpemUoKTogQnVmZmVyIHtcbiAgICByZXR1cm4gcmxwLmVuY29kZSh0aGlzLnJhdyk7XG4gIH1cblxuICBzaWduKHByaXZhdGVLZXk6IEJ1ZmZlcik6IHZvaWQge1xuICAgIHRoaXMuX3NpZ25hdHVyZXMgPSBbdGhpcy52LCB0aGlzLnIsIHRoaXMucywgcHJpdmF0ZUtleV07XG4gIH1cblxuICB2ZXJpZnlTaWduYXR1cmUoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbXNnSGFzaCA9IHRoaXMuaGFzaChmYWxzZSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNoYWluSWQgPSB0aGlzLmdldENoYWluSWQoKTtcbiAgICAgIGNvbnN0IHYgPSBidWZmZXJUb0ludCh0aGlzLnYpIC0gKDIgKiBjaGFpbklkICsgMzUpO1xuICAgICAgdGhpcy5fc2VuZGVyUHViS2V5ID0gZWNyZWNvdmVyKG1zZ0hhc2gsIHYgKyAyNywgdGhpcy5yLCB0aGlzLnMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuICEhdGhpcy5fc2VuZGVyUHViS2V5O1xuICB9XG5cbiAgZ2V0Q2hhaW5JZCgpOiBudW1iZXIge1xuICAgIGxldCBjaGFpbklkID0gYnVmZmVyVG9JbnQodGhpcy52KTtcbiAgICBpZiAodGhpcy5yLmxlbmd0aCAmJiB0aGlzLnMubGVuZ3RoKSB7XG4gICAgICBjaGFpbklkID0gKGNoYWluSWQgLSAzNSkgPj4gMTtcbiAgICB9XG4gICAgcmV0dXJuIGNoYWluSWQ7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENlbG9UcmFuc2FjdGlvbkRhdGEgaW1wbGVtZW50cyBFdGhMaWtlVHJhbnNhY3Rpb25EYXRhIHtcbiAgcHJpdmF0ZSB0eDogQ2Vsb1RyYW5zYWN0aW9uO1xuICBwcml2YXRlIGRlcGxveWVkQWRkcmVzcz86IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcih0eDogQ2Vsb1RyYW5zYWN0aW9uLCBkZXBsb3llZEFkZHJlc3M/OiBzdHJpbmcpIHtcbiAgICB0aGlzLnR4ID0gdHg7XG4gICAgdGhpcy5kZXBsb3llZEFkZHJlc3MgPSBkZXBsb3llZEFkZHJlc3M7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGZyb21Kc29uKHR4OiBMZWdhY3lUeERhdGEpOiBDZWxvVHJhbnNhY3Rpb25EYXRhIHtcbiAgICBjb25zdCBjaGFpbklkID0gYWRkSGV4UHJlZml4KG5ldyBCaWdOdW1iZXIoTnVtYmVyKHR4LmNoYWluSWQpKS50b1N0cmluZygxNikpO1xuICAgIHJldHVybiBuZXcgQ2Vsb1RyYW5zYWN0aW9uRGF0YShcbiAgICAgIG5ldyBDZWxvVHJhbnNhY3Rpb24oe1xuICAgICAgICBfdHlwZTogRVRIVHJhbnNhY3Rpb25UeXBlLkxFR0FDWSxcbiAgICAgICAgbm9uY2U6IHR4Lm5vbmNlLFxuICAgICAgICB0bzogdHgudG8sXG4gICAgICAgIGdhc1ByaWNlOiBhZGRIZXhQcmVmaXgobmV3IEJpZ051bWJlcih0eC5nYXNQcmljZSkudG9TdHJpbmcoMTYpKSxcbiAgICAgICAgZ2FzTGltaXQ6IGFkZEhleFByZWZpeChuZXcgQmlnTnVtYmVyKHR4Lmdhc0xpbWl0KS50b1N0cmluZygxNikpLFxuICAgICAgICB2YWx1ZTogYWRkSGV4UHJlZml4KG5ldyBCaWdOdW1iZXIodHgudmFsdWUpLnRvU3RyaW5nKDE2KSksXG4gICAgICAgIGRhdGE6IHR4LmRhdGEgPT09ICcweCcgPyAnJyA6IHR4LmRhdGEsXG4gICAgICAgIGZyb206IHR4LmZyb20sXG4gICAgICAgIHM6IHR4LnMsXG4gICAgICAgIHI6IHR4LnIsXG4gICAgICAgIHY6IHR4LnYgfHwgY2hhaW5JZCxcbiAgICAgIH0pLFxuICAgICAgdHguZGVwbG95ZWRBZGRyZXNzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHNpZ24oa2V5UGFpcjogS2V5UGFpcikge1xuICAgIGNvbnN0IHByaXZhdGVLZXkgPSBhZGRIZXhQcmVmaXgoa2V5UGFpci5nZXRLZXlzKCkucHJ2IGFzIHN0cmluZyk7XG4gICAgY29uc3QgZGF0YSA9IENlbG9UcmFuc2FjdGlvbkRhdGEudHhKc29uVG9DZWxvVHgodGhpcy50b0pzb24oKSwga2V5UGFpci5nZXRBZGRyZXNzKCkpO1xuICAgIGNvbnN0IGNlbG9Mb2NhbFdhbGxldCA9IG5ldyBMb2NhbFdhbGxldCgpO1xuICAgIGNlbG9Mb2NhbFdhbGxldC5hZGRBY2NvdW50KHByaXZhdGVLZXkpO1xuICAgIGNvbnN0IHJhd1RyYW5zYWN0aW9uID0gYXdhaXQgY2Vsb0xvY2FsV2FsbGV0LnNpZ25UcmFuc2FjdGlvbihkYXRhKTtcblxuICAgIGNvbnN0IG5vbmNlQmlnTnVtYmVyID0gbmV3IEJpZ051bWJlcihyYXdUcmFuc2FjdGlvbi50eC5ub25jZSk7XG4gICAgcmF3VHJhbnNhY3Rpb24udHgubm9uY2UgPSBhZGRIZXhQcmVmaXgobm9uY2VCaWdOdW1iZXIudG9TdHJpbmcoMTYpKTtcbiAgICByYXdUcmFuc2FjdGlvbi5yYXcgPSBkYXRhLmRhdGEgPT09IHVuZGVmaW5lZCA/ICcnIDogZGF0YS5kYXRhO1xuICAgIHJhd1RyYW5zYWN0aW9uLnR4LmdhcyA9IHJhd1RyYW5zYWN0aW9uLnR4LmdhcztcbiAgICB0aGlzLnR4ID0gbmV3IENlbG9UcmFuc2FjdGlvbihDZWxvVHJhbnNhY3Rpb25EYXRhLmVuY29kZWRUeFRvSnNvbihyYXdUcmFuc2FjdGlvbikpO1xuICAgIHRoaXMudHguc2lnbih0b0J1ZmZlcihwcml2YXRlS2V5KSk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdG9Kc29uKCk6IExlZ2FjeVR4RGF0YSB7XG4gICAgY29uc3QgcmVzdWx0OiBMZWdhY3lUeERhdGEgPSB7XG4gICAgICBfdHlwZTogRVRIVHJhbnNhY3Rpb25UeXBlLkxFR0FDWSxcbiAgICAgIG5vbmNlOiBidWZmZXJUb0ludCh0aGlzLnR4Lm5vbmNlKSxcbiAgICAgIGdhc1ByaWNlOiBuZXcgQmlnTnVtYmVyKGJ1ZmZlclRvSGV4KHRoaXMudHguZ2FzUHJpY2UpLCAxNikudG9TdHJpbmcoMTApLFxuICAgICAgZ2FzTGltaXQ6IG5ldyBCaWdOdW1iZXIoYnVmZmVyVG9IZXgodGhpcy50eC5nYXNMaW1pdCksIDE2KS50b1N0cmluZygxMCksXG4gICAgICB2YWx1ZTogdGhpcy50eC52YWx1ZS5sZW5ndGggPT09IDAgPyAnMCcgOiBuZXcgQmlnTnVtYmVyKGJ1ZmZlclRvSGV4KHRoaXMudHgudmFsdWUpLCAxNikudG9TdHJpbmcoMTApLFxuICAgICAgZGF0YTogYnVmZmVyVG9IZXgodGhpcy50eC5kYXRhKSxcbiAgICAgIGlkOiBhZGRIZXhQcmVmaXgoYnVmZmVyVG9IZXgodGhpcy50eC5oYXNoKHRydWUpKSksXG4gICAgfTtcblxuICAgIGlmICh0aGlzLnR4LnRvICYmIHRoaXMudHgudG8ubGVuZ3RoKSB7XG4gICAgICByZXN1bHQudG8gPSBidWZmZXJUb0hleCh0aGlzLnR4LnRvKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50eC52ZXJpZnlTaWduYXR1cmUoKSkge1xuICAgICAgcmVzdWx0LmZyb20gPSBidWZmZXJUb0hleCh0aGlzLnR4LmdldFNlbmRlckFkZHJlc3MoKSk7XG4gICAgfVxuXG4gICAgY29uc3QgY2hhaW5JZCA9IHRoaXMudHguZ2V0Q2hhaW5JZCgpO1xuICAgIGlmIChjaGFpbklkKSB7XG4gICAgICByZXN1bHQuY2hhaW5JZCA9IGNoYWluSWQudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kZXBsb3llZEFkZHJlc3MpIHtcbiAgICAgIHJlc3VsdC5kZXBsb3llZEFkZHJlc3MgPSB0aGlzLmRlcGxveWVkQWRkcmVzcztcbiAgICB9XG5cbiAgICB0aGlzLnNldFNpZ25hdHVyZUZpZWxkcyhyZXN1bHQpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0U2lnbmF0dXJlRmllbGRzKHJlc3VsdDogTGVnYWN5VHhEYXRhKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudHgudiAmJiB0aGlzLnR4LnYubGVuZ3RoKSB7XG4gICAgICByZXN1bHQudiA9IGJ1ZmZlclRvSGV4KHRoaXMudHgudik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHguciAmJiB0aGlzLnR4LnIubGVuZ3RoKSB7XG4gICAgICByZXN1bHQuciA9IGJ1ZmZlclRvSGV4KHRoaXMudHgucik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHgucyAmJiB0aGlzLnR4LnMubGVuZ3RoKSB7XG4gICAgICByZXN1bHQucyA9IGJ1ZmZlclRvSGV4KHRoaXMudHgucyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHRvU2VyaWFsaXplZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBhZGRIZXhQcmVmaXgodGhpcy50eC5zZXJpYWxpemUoKS50b1N0cmluZygnaGV4JykpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgdHhKc29uVG9DZWxvVHgodHhKc29uOiBMZWdhY3lUeERhdGEsIHNpZ25lcjogc3RyaW5nKTogQ2Vsb1R4IHtcbiAgICAvLyB0aGUgY2VsbyBsaWJyYXJ5IHJlcXVpcmVzIHlvdSB0byBzcGVjaWZ5IHRoZSBzaWduZXIgYWRkcmVzcyB3aXRoIHRoZSBmcm9tIGZpZWxkXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHR4SnNvbiwge1xuICAgICAgY2hhaW5JZDogdHhKc29uLmNoYWluSWQgPT09IHVuZGVmaW5lZCA/IDAgOiBwYXJzZUludCh0eEpzb24uY2hhaW5JZCwgMTApLFxuICAgICAgZ2FzOiB0eEpzb24uZ2FzTGltaXQsXG4gICAgICBmcm9tOiBzaWduZXIsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBlbmNvZGVkVHhUb0pzb24oZW5jb2RlZFR4OiBFbmNvZGVkVHJhbnNhY3Rpb24pOiBMZWdhY3lUeERhdGEge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5lbmNvZGVkVHgudHgsXG4gICAgICBfdHlwZTogRVRIVHJhbnNhY3Rpb25UeXBlLkxFR0FDWSxcbiAgICAgIG5vbmNlOiBwYXJzZUludChlbmNvZGVkVHgudHgubm9uY2UsIDE2KSxcbiAgICAgIGdhc0xpbWl0OiBlbmNvZGVkVHgudHguZ2FzLFxuICAgICAgZGF0YTogZW5jb2RlZFR4LnJhdyxcbiAgICB9O1xuICB9XG59XG4iXX0=