@allbridge/bridge-core-sdk 3.26.0-alpha.9 → 3.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/index.js +1 -6
- package/dist/browser/index.js.map +4 -4
- package/dist/cjs/index.js +1 -6
- package/dist/cjs/index.js.map +4 -4
- package/dist/esm/index.js +1 -6
- package/dist/esm/index.js.map +4 -4
- package/dist/src/chains/chain.enums.d.ts +3 -4
- package/dist/src/chains/chain.enums.js +2 -3
- package/dist/src/chains/chain.enums.js.map +1 -1
- package/dist/src/chains/index.js +6 -6
- package/dist/src/chains/index.js.map +1 -1
- package/dist/src/client/core-api/core-api-mapper.js +0 -1
- package/dist/src/client/core-api/core-api-mapper.js.map +1 -1
- package/dist/src/client/core-api/core-api.model.d.ts +0 -1
- package/dist/src/client/core-api/core-api.model.js.map +1 -1
- package/dist/src/services/bridge/index.js +0 -16
- package/dist/src/services/bridge/index.js.map +1 -1
- package/dist/src/services/bridge/models/bridge.model.d.ts +0 -1
- package/dist/src/services/bridge/models/bridge.model.js.map +1 -1
- package/dist/src/services/bridge/sui/index.js.map +1 -1
- package/dist/src/services/bridge/utils.d.ts +1 -3
- package/dist/src/services/bridge/utils.js +15 -72
- package/dist/src/services/bridge/utils.js.map +1 -1
- package/dist/src/services/liquidity-pool/index.js +0 -16
- package/dist/src/services/liquidity-pool/index.js.map +1 -1
- package/dist/src/services/liquidity-pool/sui/index.js.map +1 -1
- package/dist/src/services/liquidity-pool/trx/index.js.map +1 -1
- package/dist/src/services/models/index.d.ts +5 -6
- package/dist/src/services/models/index.js.map +1 -1
- package/dist/src/services/token/index.js +0 -16
- package/dist/src/services/token/index.js.map +1 -1
- package/dist/src/services/token/sui/index.js.map +1 -1
- package/dist/src/services/utils/trx/index.js.map +1 -1
- package/dist/src/services/yield/index.js +0 -4
- package/dist/src/services/yield/index.js.map +1 -1
- package/dist/src/tokens-info/tokens-info.model.d.ts +0 -4
- package/dist/src/tokens-info/tokens-info.model.js.map +1 -1
- package/dist/src/utils/index.d.ts +0 -3
- package/dist/src/utils/index.js +0 -3
- package/dist/src/utils/index.js.map +1 -1
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/dist/src/version.js.map +1 -1
- package/package.json +2 -5
- package/dist/src/services/bridge/alg/index.d.ts +0 -15
- package/dist/src/services/bridge/alg/index.js +0 -151
- package/dist/src/services/bridge/alg/index.js.map +0 -1
- package/dist/src/services/liquidity-pool/alg/index.d.ts +0 -19
- package/dist/src/services/liquidity-pool/alg/index.js +0 -141
- package/dist/src/services/liquidity-pool/alg/index.js.map +0 -1
- package/dist/src/services/models/alg/BridgeClient.d.ts +0 -2718
- package/dist/src/services/models/alg/BridgeClient.js +0 -2633
- package/dist/src/services/models/alg/BridgeClient.js.map +0 -1
- package/dist/src/services/models/alg/PoolClient.d.ts +0 -2265
- package/dist/src/services/models/alg/PoolClient.js +0 -2176
- package/dist/src/services/models/alg/PoolClient.js.map +0 -1
- package/dist/src/services/token/alg/index.d.ts +0 -17
- package/dist/src/services/token/alg/index.js +0 -46
- package/dist/src/services/token/alg/index.js.map +0 -1
- package/dist/src/services/utils/alg/index.d.ts +0 -17
- package/dist/src/services/utils/alg/index.js +0 -81
- package/dist/src/services/utils/alg/index.js.map +0 -1
- package/dist/src/utils/alg/index.d.ts +0 -21
- package/dist/src/utils/alg/index.js +0 -76
- package/dist/src/utils/alg/index.js.map +0 -1
|
@@ -1,2176 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.PoolClient = exports.PoolFactory = exports.PoolParamsFactory = exports.APP_SPEC = void 0;
|
|
4
|
-
const app_arc56_1 = require("@algorandfoundation/algokit-utils/types/app-arc56");
|
|
5
|
-
const app_client_1 = require("@algorandfoundation/algokit-utils/types/app-client");
|
|
6
|
-
const app_factory_1 = require("@algorandfoundation/algokit-utils/types/app-factory");
|
|
7
|
-
const algosdk_1 = require("algosdk");
|
|
8
|
-
exports.APP_SPEC = {
|
|
9
|
-
name: "Pool",
|
|
10
|
-
structs: {},
|
|
11
|
-
methods: [
|
|
12
|
-
{
|
|
13
|
-
name: "createApplication",
|
|
14
|
-
args: [
|
|
15
|
-
{ type: "address", name: "owner" },
|
|
16
|
-
{ type: "address", name: "router" },
|
|
17
|
-
{ type: "uint64", name: "a" },
|
|
18
|
-
{ type: "uint64", name: "assetId" },
|
|
19
|
-
{ type: "uint64", name: "feeShareBP" },
|
|
20
|
-
{ type: "uint64", name: "balanceRatioMinBP" },
|
|
21
|
-
],
|
|
22
|
-
returns: { type: "void" },
|
|
23
|
-
actions: { create: ["NoOp"], call: [] },
|
|
24
|
-
readonly: false,
|
|
25
|
-
events: [],
|
|
26
|
-
recommendations: {},
|
|
27
|
-
},
|
|
28
|
-
{
|
|
29
|
-
name: "optInToApplication",
|
|
30
|
-
args: [],
|
|
31
|
-
returns: { type: "void" },
|
|
32
|
-
actions: { create: [], call: ["OptIn"] },
|
|
33
|
-
readonly: false,
|
|
34
|
-
events: [],
|
|
35
|
-
recommendations: {},
|
|
36
|
-
},
|
|
37
|
-
{
|
|
38
|
-
name: "optInAsset",
|
|
39
|
-
args: [],
|
|
40
|
-
returns: { type: "void" },
|
|
41
|
-
actions: { create: [], call: ["NoOp"] },
|
|
42
|
-
readonly: false,
|
|
43
|
-
desc: "Opt-in the application account to the ASA stored in `this.asset`.\nThis performs an inner axfer of 0 to the app's own address.\nCall once after deploy (or whenever you change the asset).",
|
|
44
|
-
events: [],
|
|
45
|
-
recommendations: {},
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
name: "noop",
|
|
49
|
-
args: [],
|
|
50
|
-
returns: { type: "void" },
|
|
51
|
-
actions: { create: [], call: ["NoOp"] },
|
|
52
|
-
readonly: false,
|
|
53
|
-
events: [],
|
|
54
|
-
recommendations: {},
|
|
55
|
-
},
|
|
56
|
-
{
|
|
57
|
-
name: "deposit",
|
|
58
|
-
args: [],
|
|
59
|
-
returns: { type: "void" },
|
|
60
|
-
actions: { create: [], call: ["NoOp"] },
|
|
61
|
-
readonly: false,
|
|
62
|
-
events: [
|
|
63
|
-
{
|
|
64
|
-
name: "RewardsClaimed",
|
|
65
|
-
args: [
|
|
66
|
-
{ type: "address", name: "user" },
|
|
67
|
-
{ type: "uint64", name: "pending" },
|
|
68
|
-
],
|
|
69
|
-
},
|
|
70
|
-
{
|
|
71
|
-
name: "Deposit",
|
|
72
|
-
args: [
|
|
73
|
-
{ type: "address", name: "to" },
|
|
74
|
-
{ type: "uint64", name: "lpAmount" },
|
|
75
|
-
],
|
|
76
|
-
},
|
|
77
|
-
],
|
|
78
|
-
recommendations: {},
|
|
79
|
-
},
|
|
80
|
-
{
|
|
81
|
-
name: "withdraw",
|
|
82
|
-
args: [{ type: "uint64", name: "amountLp", desc: "The Withdrawn amount" }],
|
|
83
|
-
returns: { type: "void" },
|
|
84
|
-
actions: { create: [], call: ["NoOp"] },
|
|
85
|
-
readonly: false,
|
|
86
|
-
events: [
|
|
87
|
-
{
|
|
88
|
-
name: "RewardsClaimed",
|
|
89
|
-
args: [
|
|
90
|
-
{ type: "address", name: "user" },
|
|
91
|
-
{ type: "uint64", name: "pending" },
|
|
92
|
-
],
|
|
93
|
-
},
|
|
94
|
-
{
|
|
95
|
-
name: "Withdraw",
|
|
96
|
-
args: [
|
|
97
|
-
{ type: "address", name: "from" },
|
|
98
|
-
{ type: "uint64", name: "lpAmount" },
|
|
99
|
-
],
|
|
100
|
-
},
|
|
101
|
-
],
|
|
102
|
-
recommendations: {},
|
|
103
|
-
},
|
|
104
|
-
{
|
|
105
|
-
name: "swapToVUsd",
|
|
106
|
-
args: [
|
|
107
|
-
{ type: "address", name: "user" },
|
|
108
|
-
{ type: "uint64", name: "amount", desc: "The amount of tokens to swap." },
|
|
109
|
-
{
|
|
110
|
-
type: "bool",
|
|
111
|
-
name: "zeroFee",
|
|
112
|
-
desc: "When true it allows to swap without incurring any fees. It is intended for use with service\naccounts.",
|
|
113
|
-
},
|
|
114
|
-
],
|
|
115
|
-
returns: { type: "uint64", desc: "returns the difference between the old and the new value of vUsdBalance" },
|
|
116
|
-
actions: { create: [], call: ["NoOp"] },
|
|
117
|
-
readonly: false,
|
|
118
|
-
events: [
|
|
119
|
-
{
|
|
120
|
-
name: "SwappedToVUsd",
|
|
121
|
-
args: [
|
|
122
|
-
{ type: "address", name: "sender" },
|
|
123
|
-
{ type: "uint64", name: "tokenId" },
|
|
124
|
-
{ type: "uint64", name: "amount" },
|
|
125
|
-
{ type: "uint64", name: "vUsdAmount" },
|
|
126
|
-
{ type: "uint64", name: "fee" },
|
|
127
|
-
],
|
|
128
|
-
},
|
|
129
|
-
],
|
|
130
|
-
recommendations: {},
|
|
131
|
-
},
|
|
132
|
-
{
|
|
133
|
-
name: "swapFromVUsd",
|
|
134
|
-
args: [
|
|
135
|
-
{ type: "address", name: "user", desc: "The address of the recipient." },
|
|
136
|
-
{ type: "uint64", name: "amount", desc: "The amount of vUSD to swap." },
|
|
137
|
-
{
|
|
138
|
-
type: "uint64",
|
|
139
|
-
name: "receiveAmountMin",
|
|
140
|
-
desc: "The minimum amount of tokens required to be received during the swap, otherwise the\ntransaction reverts.",
|
|
141
|
-
},
|
|
142
|
-
{
|
|
143
|
-
type: "bool",
|
|
144
|
-
name: "zeroFee",
|
|
145
|
-
desc: "When true it allows to swap without incurring any fees. It is intended for use with service\naccounts.",
|
|
146
|
-
},
|
|
147
|
-
],
|
|
148
|
-
returns: { type: "uint64", desc: "returns the difference between the old and the new value of vUsdBalance" },
|
|
149
|
-
actions: { create: [], call: ["NoOp"] },
|
|
150
|
-
readonly: false,
|
|
151
|
-
events: [
|
|
152
|
-
{
|
|
153
|
-
name: "SwappedFromVUsd",
|
|
154
|
-
args: [
|
|
155
|
-
{ type: "address", name: "recipient" },
|
|
156
|
-
{ type: "uint64", name: "tokenId" },
|
|
157
|
-
{ type: "uint64", name: "vUsdAmount" },
|
|
158
|
-
{ type: "uint64", name: "amount" },
|
|
159
|
-
{ type: "uint64", name: "fee" },
|
|
160
|
-
],
|
|
161
|
-
},
|
|
162
|
-
],
|
|
163
|
-
recommendations: {},
|
|
164
|
-
},
|
|
165
|
-
{
|
|
166
|
-
name: "setFeeShare",
|
|
167
|
-
args: [{ type: "uint64", name: "feeShareBP" }],
|
|
168
|
-
returns: { type: "void" },
|
|
169
|
-
actions: { create: [], call: ["NoOp"] },
|
|
170
|
-
readonly: false,
|
|
171
|
-
events: [],
|
|
172
|
-
recommendations: {},
|
|
173
|
-
},
|
|
174
|
-
{
|
|
175
|
-
name: "adjustTotalLpAmount",
|
|
176
|
-
args: [],
|
|
177
|
-
returns: { type: "void" },
|
|
178
|
-
actions: { create: [], call: ["NoOp"] },
|
|
179
|
-
readonly: false,
|
|
180
|
-
events: [
|
|
181
|
-
{
|
|
182
|
-
name: "RewardsClaimed",
|
|
183
|
-
args: [
|
|
184
|
-
{ type: "address", name: "user" },
|
|
185
|
-
{ type: "uint64", name: "pending" },
|
|
186
|
-
],
|
|
187
|
-
},
|
|
188
|
-
{
|
|
189
|
-
name: "Deposit",
|
|
190
|
-
args: [
|
|
191
|
-
{ type: "address", name: "to" },
|
|
192
|
-
{ type: "uint64", name: "lpAmount" },
|
|
193
|
-
],
|
|
194
|
-
},
|
|
195
|
-
],
|
|
196
|
-
recommendations: {},
|
|
197
|
-
},
|
|
198
|
-
{
|
|
199
|
-
name: "setBalanceRatioMinBP",
|
|
200
|
-
args: [{ type: "uint64", name: "balanceRatioMinBP" }],
|
|
201
|
-
returns: { type: "void" },
|
|
202
|
-
actions: { create: [], call: ["NoOp"] },
|
|
203
|
-
readonly: false,
|
|
204
|
-
events: [],
|
|
205
|
-
recommendations: {},
|
|
206
|
-
},
|
|
207
|
-
{
|
|
208
|
-
name: "stopDeposit",
|
|
209
|
-
args: [],
|
|
210
|
-
returns: { type: "void" },
|
|
211
|
-
actions: { create: [], call: ["NoOp"] },
|
|
212
|
-
readonly: false,
|
|
213
|
-
events: [],
|
|
214
|
-
recommendations: {},
|
|
215
|
-
},
|
|
216
|
-
{
|
|
217
|
-
name: "startDeposit",
|
|
218
|
-
args: [],
|
|
219
|
-
returns: { type: "void" },
|
|
220
|
-
actions: { create: [], call: ["NoOp"] },
|
|
221
|
-
readonly: false,
|
|
222
|
-
events: [],
|
|
223
|
-
recommendations: {},
|
|
224
|
-
},
|
|
225
|
-
{
|
|
226
|
-
name: "stopWithdraw",
|
|
227
|
-
args: [],
|
|
228
|
-
returns: { type: "void" },
|
|
229
|
-
actions: { create: [], call: ["NoOp"] },
|
|
230
|
-
readonly: false,
|
|
231
|
-
events: [],
|
|
232
|
-
recommendations: {},
|
|
233
|
-
},
|
|
234
|
-
{
|
|
235
|
-
name: "startWithdraw",
|
|
236
|
-
args: [],
|
|
237
|
-
returns: { type: "void" },
|
|
238
|
-
actions: { create: [], call: ["NoOp"] },
|
|
239
|
-
readonly: false,
|
|
240
|
-
events: [],
|
|
241
|
-
recommendations: {},
|
|
242
|
-
},
|
|
243
|
-
{
|
|
244
|
-
name: "setStopAuthority",
|
|
245
|
-
args: [{ type: "address", name: "stopAuthority" }],
|
|
246
|
-
returns: { type: "void" },
|
|
247
|
-
actions: { create: [], call: ["NoOp"] },
|
|
248
|
-
readonly: false,
|
|
249
|
-
events: [],
|
|
250
|
-
recommendations: {},
|
|
251
|
-
},
|
|
252
|
-
{
|
|
253
|
-
name: "setRouter",
|
|
254
|
-
args: [{ type: "address", name: "router" }],
|
|
255
|
-
returns: { type: "void" },
|
|
256
|
-
actions: { create: [], call: ["NoOp"] },
|
|
257
|
-
readonly: false,
|
|
258
|
-
events: [],
|
|
259
|
-
recommendations: {},
|
|
260
|
-
},
|
|
261
|
-
{
|
|
262
|
-
name: "claimRewards",
|
|
263
|
-
args: [],
|
|
264
|
-
returns: { type: "void" },
|
|
265
|
-
actions: { create: [], call: ["NoOp"] },
|
|
266
|
-
readonly: false,
|
|
267
|
-
events: [
|
|
268
|
-
{
|
|
269
|
-
name: "RewardsClaimed",
|
|
270
|
-
args: [
|
|
271
|
-
{ type: "address", name: "user" },
|
|
272
|
-
{ type: "uint64", name: "pending" },
|
|
273
|
-
],
|
|
274
|
-
},
|
|
275
|
-
],
|
|
276
|
-
recommendations: {},
|
|
277
|
-
},
|
|
278
|
-
{
|
|
279
|
-
name: "setAdminFeeShare",
|
|
280
|
-
args: [{ type: "uint64", name: "adminFeeShareBP" }],
|
|
281
|
-
returns: { type: "void" },
|
|
282
|
-
actions: { create: [], call: ["NoOp"] },
|
|
283
|
-
readonly: false,
|
|
284
|
-
events: [],
|
|
285
|
-
recommendations: {},
|
|
286
|
-
},
|
|
287
|
-
{
|
|
288
|
-
name: "claimAdminFee",
|
|
289
|
-
args: [],
|
|
290
|
-
returns: { type: "void" },
|
|
291
|
-
actions: { create: [], call: ["NoOp"] },
|
|
292
|
-
readonly: false,
|
|
293
|
-
events: [],
|
|
294
|
-
recommendations: {},
|
|
295
|
-
},
|
|
296
|
-
{
|
|
297
|
-
name: "pendingReward",
|
|
298
|
-
args: [{ type: "account", name: "user" }],
|
|
299
|
-
returns: { type: "uint64" },
|
|
300
|
-
actions: { create: [], call: ["NoOp"] },
|
|
301
|
-
readonly: true,
|
|
302
|
-
events: [],
|
|
303
|
-
recommendations: {},
|
|
304
|
-
},
|
|
305
|
-
{
|
|
306
|
-
name: "decimals",
|
|
307
|
-
args: [],
|
|
308
|
-
returns: { type: "uint64" },
|
|
309
|
-
actions: { create: [], call: ["NoOp"] },
|
|
310
|
-
readonly: true,
|
|
311
|
-
events: [],
|
|
312
|
-
recommendations: {},
|
|
313
|
-
},
|
|
314
|
-
{
|
|
315
|
-
name: "transferOwnership",
|
|
316
|
-
args: [{ type: "address", name: "newOwner" }],
|
|
317
|
-
returns: { type: "void" },
|
|
318
|
-
actions: { create: [], call: ["NoOp"] },
|
|
319
|
-
readonly: false,
|
|
320
|
-
events: [],
|
|
321
|
-
recommendations: {},
|
|
322
|
-
},
|
|
323
|
-
],
|
|
324
|
-
arcs: [22, 28],
|
|
325
|
-
desc: "4AD - D = 4A(x + y) - (D³ / 4xy)\nX - is value of real stable token\nY - is value of virtual usd",
|
|
326
|
-
networks: {},
|
|
327
|
-
state: {
|
|
328
|
-
schema: { global: { ints: 15, bytes: 4 }, local: { ints: 2, bytes: 0 } },
|
|
329
|
-
keys: {
|
|
330
|
-
global: {
|
|
331
|
-
feeShareBP: { keyType: "AVMString", valueType: "AVMUint64", key: "ZmVlU2hhcmVCUA==" },
|
|
332
|
-
router: { keyType: "AVMString", valueType: "address", key: "cm91dGVy" },
|
|
333
|
-
tokenBalance: { keyType: "AVMString", valueType: "AVMUint64", key: "dG9rZW5CYWxhbmNl" },
|
|
334
|
-
vUsdBalance: { keyType: "AVMString", valueType: "AVMUint64", key: "dlVzZEJhbGFuY2U=" },
|
|
335
|
-
balanceRatioMinBP: { keyType: "AVMString", valueType: "AVMUint64", key: "YmFsYW5jZVJhdGlvTWluQlA=" },
|
|
336
|
-
reserves: { keyType: "AVMString", valueType: "AVMUint64", key: "cmVzZXJ2ZXM=" },
|
|
337
|
-
a: { keyType: "AVMString", valueType: "AVMUint64", key: "YQ==" },
|
|
338
|
-
d: { keyType: "AVMString", valueType: "AVMUint64", key: "ZA==" },
|
|
339
|
-
tokenAmountReduce: { keyType: "AVMString", valueType: "AVMUint64", key: "dG9rZW5BbW91bnRSZWR1Y2U=" },
|
|
340
|
-
tokenAmountIncrease: { keyType: "AVMString", valueType: "AVMUint64", key: "dG9rZW5BbW91bnRJbmNyZWFzZQ==" },
|
|
341
|
-
stopAuthority: { keyType: "AVMString", valueType: "address", key: "c3RvcEF1dGhvcml0eQ==" },
|
|
342
|
-
canDeposit: { keyType: "AVMString", valueType: "AVMUint64", key: "Y2FuRGVwb3NpdA==" },
|
|
343
|
-
canWithdraw: { keyType: "AVMString", valueType: "AVMUint64", key: "Y2FuV2l0aGRyYXc=" },
|
|
344
|
-
asset: { keyType: "AVMString", valueType: "AVMUint64", key: "YXNzZXQ=" },
|
|
345
|
-
adminFeeShareBP: { keyType: "AVMString", valueType: "AVMUint64", key: "YWRtaW5GZWVTaGFyZUJQ" },
|
|
346
|
-
totalSupply: { keyType: "AVMString", valueType: "AVMUint64", key: "dG90YWxTdXBwbHk=" },
|
|
347
|
-
accRewardPerShareP: { keyType: "AVMString", valueType: "AVMBytes", key: "YWNjUmV3YXJkUGVyU2hhcmVQ" },
|
|
348
|
-
adminFeeAmount: { keyType: "AVMString", valueType: "AVMUint64", key: "YWRtaW5GZWVBbW91bnQ=" },
|
|
349
|
-
owner: { keyType: "AVMString", valueType: "address", key: "b3duZXI=" },
|
|
350
|
-
},
|
|
351
|
-
local: {
|
|
352
|
-
balance: { keyType: "AVMString", valueType: "AVMUint64", key: "YmFsYW5jZQ==" },
|
|
353
|
-
userRewardDebt: { keyType: "AVMString", valueType: "AVMUint64", key: "dXNlclJld2FyZERlYnQ=" },
|
|
354
|
-
},
|
|
355
|
-
box: {},
|
|
356
|
-
},
|
|
357
|
-
maps: { global: {}, local: {}, box: {} },
|
|
358
|
-
},
|
|
359
|
-
bareActions: { create: [], call: [] },
|
|
360
|
-
sourceInfo: {
|
|
361
|
-
approval: {
|
|
362
|
-
sourceInfo: [
|
|
363
|
-
{ pc: [1446], errorMessage: '"Pool: withdraw prohibited' },
|
|
364
|
-
{ pc: [1249], errorMessage: "Asset must go to app" },
|
|
365
|
-
{ pc: [1232], errorMessage: "Asset txn missing" },
|
|
366
|
-
{ pc: [1270], errorMessage: "CloseTo not allowed" },
|
|
367
|
-
{
|
|
368
|
-
pc: [
|
|
369
|
-
514, 529, 553, 577, 589, 605, 617, 632, 647, 659, 671, 683, 695, 711, 723, 739, 773, 803, 819, 831, 840,
|
|
370
|
-
865,
|
|
371
|
-
],
|
|
372
|
-
errorMessage: "OnCompletion is not NoOp",
|
|
373
|
-
},
|
|
374
|
-
{ pc: [853], errorMessage: "OnCompletion is not OptIn" },
|
|
375
|
-
{ pc: [3306], errorMessage: "Only owner" },
|
|
376
|
-
{ pc: [1216], errorMessage: "Pool: deposit prohibited" },
|
|
377
|
-
{ pc: [1141], errorMessage: "Pool: is not stopAuthority" },
|
|
378
|
-
{ pc: [1206], errorMessage: "Pool: low token balance" },
|
|
379
|
-
{ pc: [1182], errorMessage: "Pool: low vUSD balance" },
|
|
380
|
-
{ pc: [1131], errorMessage: "Pool: only router" },
|
|
381
|
-
{ pc: [1701, 1983], errorMessage: "Pool: reserves" },
|
|
382
|
-
{ pc: [2027], errorMessage: "Pool: slippage" },
|
|
383
|
-
{ pc: [2116, 2175], errorMessage: "Pool: too large" },
|
|
384
|
-
{ pc: [1280], errorMessage: "Pool: too little" },
|
|
385
|
-
{ pc: [1369], errorMessage: "Pool: too much" },
|
|
386
|
-
{ pc: [1723], errorMessage: "Pool: zero D changes" },
|
|
387
|
-
{ pc: [1693], errorMessage: "Pool: zero changes" },
|
|
388
|
-
{ pc: [1263], errorMessage: "Rekey not allowed" },
|
|
389
|
-
{ pc: [1468], errorMessage: "RewardManager: not enough amount" },
|
|
390
|
-
{ pc: [2994], errorMessage: "RewardManager: too high" },
|
|
391
|
-
{ pc: [1256], errorMessage: "Wrong asset" },
|
|
392
|
-
{ pc: [984], errorMessage: "asset exists" },
|
|
393
|
-
{ pc: [869], errorMessage: "can only call when creating" },
|
|
394
|
-
{
|
|
395
|
-
pc: [
|
|
396
|
-
517, 532, 556, 580, 592, 608, 620, 635, 650, 662, 674, 686, 698, 714, 726, 742, 776, 806, 822, 834, 843,
|
|
397
|
-
856,
|
|
398
|
-
],
|
|
399
|
-
errorMessage: "can only call when not creating",
|
|
400
|
-
},
|
|
401
|
-
{
|
|
402
|
-
pc: [
|
|
403
|
-
977, 1080, 1129, 1139, 1153, 1163, 1180, 1204, 1215, 1225, 1229, 1284, 1298, 1308, 1326, 1336, 1350, 1360,
|
|
404
|
-
1374, 1412, 1445, 1451, 1476, 1531, 1563, 1614, 1618, 1624, 1660, 1686, 1690, 1697, 1705, 1719, 1728, 1775,
|
|
405
|
-
1805, 1815, 1823, 1833, 1841, 1870, 1929, 1939, 1955, 1976, 1987, 2002, 2032, 2066, 2137, 2148, 2251, 2260,
|
|
406
|
-
2408, 2413, 2421, 2529, 2537, 2578, 2586, 2917, 2954, 3015, 3023, 3028, 3064, 3092, 3100, 3118, 3138, 3152,
|
|
407
|
-
3216, 3250, 3304,
|
|
408
|
-
],
|
|
409
|
-
errorMessage: "check GlobalState exists",
|
|
410
|
-
},
|
|
411
|
-
{ pc: [1463, 1500, 1516, 2906, 2934, 3058, 3078, 3164, 3186, 3201], errorMessage: "check LocalState exists" },
|
|
412
|
-
{ pc: [2626], errorMessage: "n must be non-negative" },
|
|
413
|
-
{ pc: [1395, 1426, 1642, 1674], errorMessage: "overflow" },
|
|
414
|
-
{ pc: [1242], errorMessage: "transaction type is axfer" },
|
|
415
|
-
],
|
|
416
|
-
pcOffsetMethod: "none",
|
|
417
|
-
},
|
|
418
|
-
clear: { sourceInfo: [], pcOffsetMethod: "none" },
|
|
419
|
-
},
|
|
420
|
-
source: {
|
|
421
|
-
approval: "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDggNCAxMDAwMAogICAgYnl0ZWNibG9jayAidG9rZW5CYWxhbmNlIiAidlVzZEJhbGFuY2UiICJhc3NldCIgInJlc2VydmVzIiAiYmFsYW5jZSIgInVzZXJSZXdhcmREZWJ0IiAiZCIgInRvdGFsU3VwcGx5IiAiYWNjUmV3YXJkUGVyU2hhcmVQIiAweDAxMDAwMDAwMDAwMDAwIDB4MDEgImFkbWluRmVlQW1vdW50IiAiY2FuRGVwb3NpdCIgImNhbldpdGhkcmF3IiAib3duZXIiICJmZWVTaGFyZUJQIiAiYmFsYW5jZVJhdGlvTWluQlAiIDB4MDIgImFkbWluRmVlU2hhcmVCUCIgMHgxNTFmN2M3NSAiYSIgInJvdXRlciIgInN0b3BBdXRob3JpdHkiICJ0b2tlbkFtb3VudFJlZHVjZSIgInRva2VuQW1vdW50SW5jcmVhc2UiIDB4YmE4MTgwNzYgMHgwMyAweDAxMDAwMDAwMDAwMDAwMDAwMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI4CiAgICAvLyBhZG1pbkZlZVNoYXJlQlAgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiBCUCAvIDUgfSk7IC8vIERlZmF1bHQgYWRtaW4gZmVlIGlzIDIwJQogICAgYnl0ZWMgMTggLy8gImFkbWluRmVlU2hhcmVCUCIKICAgIHB1c2hpbnQgMjAwMCAvLyAyMDAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI5CiAgICAvLyB0b3RhbFN1cHBseSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlYyA3IC8vICJ0b3RhbFN1cHBseSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjMwCiAgICAvLyBhY2NSZXdhcmRQZXJTaGFyZVAgPSBHbG9iYWxTdGF0ZTxiaWd1aW50Pih7IGluaXRpYWxWYWx1ZTogMG4gfSk7CiAgICBieXRlYyA4IC8vICJhY2NSZXdhcmRQZXJTaGFyZVAiCiAgICBwdXNoYnl0ZXMgMHgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzEKICAgIC8vIGFkbWluRmVlQW1vdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGJ5dGVjIDExIC8vICJhZG1pbkZlZUFtb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDEKICAgIC8vIHRva2VuQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlY18wIC8vICJ0b2tlbkJhbGFuY2UiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyB2VXNkQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlY18xIC8vICJ2VXNkQmFsYW5jZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDQKICAgIC8vIHJlc2VydmVzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGJ5dGVjXzMgLy8gInJlc2VydmVzIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NgogICAgLy8gZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlYyA2IC8vICJkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1MgogICAgLy8gY2FuRGVwb3NpdCA9IEdsb2JhbFN0YXRlPGJvb2xlYW4+KHsgaW5pdGlhbFZhbHVlOiB0cnVlIH0pOy8vIGlzIGRlcG9zaXQgb3BlcmF0aW9uIGFsbG93ZWQKICAgIGJ5dGVjIDEyIC8vICJjYW5EZXBvc2l0IgogICAgaW50Y18xIC8vIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1MwogICAgLy8gY2FuV2l0aGRyYXcgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGluaXRpYWxWYWx1ZTogdHJ1ZSB9KTsvLyBpcyB3aXRoZHJhd24gb3BlcmF0aW9uIGFsbG93ZWQKICAgIGJ5dGVjIDEzIC8vICJjYW5XaXRoZHJhdyIKICAgIGludGNfMSAvLyAxCiAgICBhcHBfZ2xvYmFsX3B1dAoKbWFpbl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMwogICAgLy8gZXhwb3J0IGNsYXNzIFBvb2wgZXh0ZW5kcyBSZXdhcmRNYW5hZ2VyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZyB7CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9hZnRlcl9pZl9lbHNlQDMxCiAgICBwdXNoYnl0ZXNzIDB4NTE2ZDM0N2IgMHgwMWEzYTNmZiAweDc2MTBhNDYwIDB4ZTgzYTg3YWIgMHg5MmUwM2IxYyAweDIxZjFkZGZmIDB4ZDk3OGFkMTQgMHgwZDFiNGMwNiAweDc1YmY5YTI4IDB4ZjQ5M2Q3ZWQgMHg4ZDVjYjZkZiAweGZlMDRhNWNlIDB4MDI4ZTA4NTkgMHg0MWZjOTY2ZSAweGFiZjIwMDE0IDB4MDRiMTYxZjEgMHg2NjU5MWNjZiAweGE1YWU2YmQxIDB4YTA0YzViYzQgMHgzNjFiNjE1OSAweDMyYmJiMDExIDB4Yjg3NzllZTcgMHhlMTdiYWZiNCAvLyBtZXRob2QgImNyZWF0ZUFwcGxpY2F0aW9uKGFkZHJlc3MsYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpdm9pZCIsIG1ldGhvZCAib3B0SW5Ub0FwcGxpY2F0aW9uKCl2b2lkIiwgbWV0aG9kICJvcHRJbkFzc2V0KCl2b2lkIiwgbWV0aG9kICJub29wKCl2b2lkIiwgbWV0aG9kICJkZXBvc2l0KCl2b2lkIiwgbWV0aG9kICJ3aXRoZHJhdyh1aW50NjQpdm9pZCIsIG1ldGhvZCAic3dhcFRvVlVzZChhZGRyZXNzLHVpbnQ2NCxib29sKXVpbnQ2NCIsIG1ldGhvZCAic3dhcEZyb21WVXNkKGFkZHJlc3MsdWludDY0LHVpbnQ2NCxib29sKXVpbnQ2NCIsIG1ldGhvZCAic2V0RmVlU2hhcmUodWludDY0KXZvaWQiLCBtZXRob2QgImFkanVzdFRvdGFsTHBBbW91bnQoKXZvaWQiLCBtZXRob2QgInNldEJhbGFuY2VSYXRpb01pbkJQKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJzdG9wRGVwb3NpdCgpdm9pZCIsIG1ldGhvZCAic3RhcnREZXBvc2l0KCl2b2lkIiwgbWV0aG9kICJzdG9wV2l0aGRyYXcoKXZvaWQiLCBtZXRob2QgInN0YXJ0V2l0aGRyYXcoKXZvaWQiLCBtZXRob2QgInNldFN0b3BBdXRob3JpdHkoYWRkcmVzcyl2b2lkIiwgbWV0aG9kICJzZXRSb3V0ZXIoYWRkcmVzcyl2b2lkIiwgbWV0aG9kICJjbGFpbVJld2FyZHMoKXZvaWQiLCBtZXRob2QgInNldEFkbWluRmVlU2hhcmUodWludDY0KXZvaWQiLCBtZXRob2QgImNsYWltQWRtaW5GZWUoKXZvaWQiLCBtZXRob2QgInBlbmRpbmdSZXdhcmQoYWNjb3VudCl1aW50NjQiLCBtZXRob2QgImRlY2ltYWxzKCl1aW50NjQiLCBtZXRob2QgInRyYW5zZmVyT3duZXJzaGlwKGFkZHJlc3Mpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fY3JlYXRlQXBwbGljYXRpb25fcm91dGVANSBtYWluX29wdEluVG9BcHBsaWNhdGlvbl9yb3V0ZUA2IG1haW5fb3B0SW5Bc3NldF9yb3V0ZUA3IG1haW5fbm9vcF9yb3V0ZUA4IG1haW5fZGVwb3NpdF9yb3V0ZUA5IG1haW5fd2l0aGRyYXdfcm91dGVAMTAgbWFpbl9zd2FwVG9WVXNkX3JvdXRlQDExIG1haW5fc3dhcEZyb21WVXNkX3JvdXRlQDEyIG1haW5fc2V0RmVlU2hhcmVfcm91dGVAMTMgbWFpbl9hZGp1c3RUb3RhbExwQW1vdW50X3JvdXRlQDE0IG1haW5fc2V0QmFsYW5jZVJhdGlvTWluQlBfcm91dGVAMTUgbWFpbl9zdG9wRGVwb3NpdF9yb3V0ZUAxNiBtYWluX3N0YXJ0RGVwb3NpdF9yb3V0ZUAxNyBtYWluX3N0b3BXaXRoZHJhd19yb3V0ZUAxOCBtYWluX3N0YXJ0V2l0aGRyYXdfcm91dGVAMTkgbWFpbl9zZXRTdG9wQXV0aG9yaXR5X3JvdXRlQDIwIG1haW5fc2V0Um91dGVyX3JvdXRlQDIxIG1haW5fY2xhaW1SZXdhcmRzX3JvdXRlQDIyIG1haW5fc2V0QWRtaW5GZWVTaGFyZV9yb3V0ZUAyMyBtYWluX2NsYWltQWRtaW5GZWVfcm91dGVAMjQgbWFpbl9wZW5kaW5nUmV3YXJkX3JvdXRlQDI1IG1haW5fZGVjaW1hbHNfcm91dGVAMjYgbWFpbl90cmFuc2Zlck93bmVyc2hpcF9yb3V0ZUAyNwoKbWFpbl9hZnRlcl9pZl9lbHNlQDMxOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzMKICAgIC8vIGV4cG9ydCBjbGFzcyBQb29sIGV4dGVuZHMgUmV3YXJkTWFuYWdlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcgewogICAgaW50Y18wIC8vIDAKICAgIHJldHVybgoKbWFpbl90cmFuc2Zlck93bmVyc2hpcF9yb3V0ZUAyNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjE2CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzMKICAgIC8vIGV4cG9ydCBjbGFzcyBQb29sIGV4dGVuZHMgUmV3YXJkTWFuYWdlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6MTYKICAgIC8vIEBhYmltZXRob2QoKQogICAgY2FsbHN1YiB0cmFuc2Zlck93bmVyc2hpcAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9kZWNpbWFsc19yb3V0ZUAyNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo5MQogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1MDAwMDAwMDAwMDAwMDAwMwogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3BlbmRpbmdSZXdhcmRfcm91dGVAMjU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6ODYKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMwogICAgLy8gZXhwb3J0IGNsYXNzIFBvb2wgZXh0ZW5kcyBSZXdhcmRNYW5hZ2VyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZyB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjg2CiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGNhbGxzdWIgcGVuZGluZ1Jld2FyZAogICAgaXRvYgogICAgYnl0ZWMgMTkgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fY2xhaW1BZG1pbkZlZV9yb3V0ZUAyNDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo3MgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgY2xhaW1BZG1pbkZlZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRBZG1pbkZlZVNoYXJlX3JvdXRlQDIzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjY1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzMKICAgIC8vIGV4cG9ydCBjbGFzcyBQb29sIGV4dGVuZHMgUmV3YXJkTWFuYWdlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjY1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgc2V0QWRtaW5GZWVTaGFyZQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9jbGFpbVJld2FyZHNfcm91dGVAMjI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NTAKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGNsYWltUmV3YXJkcwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRSb3V0ZXJfcm91dGVAMjE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNTcKICAgIC8vIHNldFJvdXRlcihyb3V0ZXI6IEFkZHJlc3MpOiB2b2lkIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzMKICAgIC8vIGV4cG9ydCBjbGFzcyBQb29sIGV4dGVuZHMgUmV3YXJkTWFuYWdlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzU3CiAgICAvLyBzZXRSb3V0ZXIocm91dGVyOiBBZGRyZXNzKTogdm9pZCB7CiAgICBjYWxsc3ViIHNldFJvdXRlcgogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRTdG9wQXV0aG9yaXR5X3JvdXRlQDIwOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzUyCiAgICAvLyBzZXRTdG9wQXV0aG9yaXR5KHN0b3BBdXRob3JpdHk6IEFkZHJlc3MpOiB2b2lkIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzMKICAgIC8vIGV4cG9ydCBjbGFzcyBQb29sIGV4dGVuZHMgUmV3YXJkTWFuYWdlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzUyCiAgICAvLyBzZXRTdG9wQXV0aG9yaXR5KHN0b3BBdXRob3JpdHk6IEFkZHJlc3MpOiB2b2lkIHsKICAgIGNhbGxzdWIgc2V0U3RvcEF1dGhvcml0eQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zdGFydFdpdGhkcmF3X3JvdXRlQDE5OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzQ3CiAgICAvLyBzdGFydFdpdGhkcmF3KCk6IHZvaWQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHN0YXJ0V2l0aGRyYXcKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc3RvcFdpdGhkcmF3X3JvdXRlQDE4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzQyCiAgICAvLyBzdG9wV2l0aGRyYXcoKTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgc3RvcFdpdGhkcmF3CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3N0YXJ0RGVwb3NpdF9yb3V0ZUAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMzNwogICAgLy8gc3RhcnREZXBvc2l0KCk6IHZvaWQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHN0YXJ0RGVwb3NpdAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zdG9wRGVwb3NpdF9yb3V0ZUAxNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMzMgogICAgLy8gc3RvcERlcG9zaXQoKTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgc3RvcERlcG9zaXQKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc2V0QmFsYW5jZVJhdGlvTWluQlBfcm91dGVAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMjYKICAgIC8vIHNldEJhbGFuY2VSYXRpb01pbkJQKGJhbGFuY2VSYXRpb01pbkJQOiB1aW50NjQpOiB2b2lkIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzMKICAgIC8vIGV4cG9ydCBjbGFzcyBQb29sIGV4dGVuZHMgUmV3YXJkTWFuYWdlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzI2CiAgICAvLyBzZXRCYWxhbmNlUmF0aW9NaW5CUChiYWxhbmNlUmF0aW9NaW5CUDogdWludDY0KTogdm9pZCB7CiAgICBjYWxsc3ViIHNldEJhbGFuY2VSYXRpb01pbkJQCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2FkanVzdFRvdGFsTHBBbW91bnRfcm91dGVAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMTMKICAgIC8vIGFkanVzdFRvdGFsTHBBbW91bnQoKTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgYWRqdXN0VG90YWxMcEFtb3VudAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9zZXRGZWVTaGFyZV9yb3V0ZUAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMwNwogICAgLy8gc2V0RmVlU2hhcmUoZmVlU2hhcmVCUDogdWludDY0KTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMzCiAgICAvLyBleHBvcnQgY2xhc3MgUG9vbCBleHRlbmRzIFJld2FyZE1hbmFnZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMwNwogICAgLy8gc2V0RmVlU2hhcmUoZmVlU2hhcmVCUDogdWludDY0KTogdm9pZCB7CiAgICBjYWxsc3ViIHNldEZlZVNoYXJlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX3N3YXBGcm9tVlVzZF9yb3V0ZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI1OS0yNjQKICAgIC8vIHN3YXBGcm9tVlVzZCgKICAgIC8vICAgdXNlcjogQWRkcmVzcywKICAgIC8vICAgYW1vdW50OiB1aW50NjQsCiAgICAvLyAgIHJlY2VpdmVBbW91bnRNaW46IHVpbnQ2NCwKICAgIC8vICAgemVyb0ZlZTogYm9vbGVhbiwKICAgIC8vICk6IHVpbnQ2NCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMzCiAgICAvLyBleHBvcnQgY2xhc3MgUG9vbCBleHRlbmRzIFJld2FyZE1hbmFnZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI1OS0yNjQKICAgIC8vIHN3YXBGcm9tVlVzZCgKICAgIC8vICAgdXNlcjogQWRkcmVzcywKICAgIC8vICAgYW1vdW50OiB1aW50NjQsCiAgICAvLyAgIHJlY2VpdmVBbW91bnRNaW46IHVpbnQ2NCwKICAgIC8vICAgemVyb0ZlZTogYm9vbGVhbiwKICAgIC8vICk6IHVpbnQ2NCB7CiAgICBjYWxsc3ViIHN3YXBGcm9tVlVzZAogICAgaXRvYgogICAgYnl0ZWMgMTkgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fc3dhcFRvVlVzZF9yb3V0ZUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIxMy0yMTcKICAgIC8vIHN3YXBUb1ZVc2QoCiAgICAvLyAgIHVzZXI6IEFkZHJlc3MsCiAgICAvLyAgIGFtb3VudDogdWludDY0LAogICAgLy8gICB6ZXJvRmVlOiBib29sZWFuLAogICAgLy8gKTogdWludDY0IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzMKICAgIC8vIGV4cG9ydCBjbGFzcyBQb29sIGV4dGVuZHMgUmV3YXJkTWFuYWdlciBpbXBsZW1lbnRzIENvbnZlbnRpb25hbFJvdXRpbmcgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjEzLTIxNwogICAgLy8gc3dhcFRvVlVzZCgKICAgIC8vICAgdXNlcjogQWRkcmVzcywKICAgIC8vICAgYW1vdW50OiB1aW50NjQsCiAgICAvLyAgIHplcm9GZWU6IGJvb2xlYW4sCiAgICAvLyApOiB1aW50NjQgewogICAgY2FsbHN1YiBzd2FwVG9WVXNkCiAgICBpdG9iCiAgICBieXRlYyAxOSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl93aXRoZHJhd19yb3V0ZUAxMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjE2OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMzCiAgICAvLyBleHBvcnQgY2xhc3MgUG9vbCBleHRlbmRzIFJld2FyZE1hbmFnZXIgaW1wbGVtZW50cyBDb252ZW50aW9uYWxSb3V0aW5nIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjE2OAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHdpdGhkcmF3CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgptYWluX2RlcG9zaXRfcm91dGVAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjEyOQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZGVwb3NpdAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9ub29wX3JvdXRlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo5MgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fb3B0SW5Bc3NldF9yb3V0ZUA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NzcKICAgIC8vIG9wdEluQXNzZXQoKTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgb3B0SW5Bc3NldAogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9vcHRJblRvQXBwbGljYXRpb25fcm91dGVANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjY4CiAgICAvLyBvcHRJblRvQXBwbGljYXRpb24oKTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBpbnRjXzEgLy8gT3B0SW4KICAgID09CiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBPcHRJbgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIG9wdEluVG9BcHBsaWNhdGlvbgogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9jcmVhdGVBcHBsaWNhdGlvbl9yb3V0ZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NTUKICAgIC8vIGNyZWF0ZUFwcGxpY2F0aW9uKG93bmVyOiBBZGRyZXNzLCByb3V0ZXI6IEFkZHJlc3MsIGE6IHVpbnQ2NCwgYXNzZXRJZDogdWludDY0LCBmZWVTaGFyZUJQOiB1aW50NjQsIGJhbGFuY2VSYXRpb01pbkJQOiB1aW50NjQpOiB2b2lkIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMwogICAgLy8gZXhwb3J0IGNsYXNzIFBvb2wgZXh0ZW5kcyBSZXdhcmRNYW5hZ2VyIGltcGxlbWVudHMgQ29udmVudGlvbmFsUm91dGluZyB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1NQogICAgLy8gY3JlYXRlQXBwbGljYXRpb24ob3duZXI6IEFkZHJlc3MsIHJvdXRlcjogQWRkcmVzcywgYTogdWludDY0LCBhc3NldElkOiB1aW50NjQsIGZlZVNoYXJlQlA6IHVpbnQ2NCwgYmFsYW5jZVJhdGlvTWluQlA6IHVpbnQ2NCk6IHZvaWQgewogICAgY2FsbHN1YiBjcmVhdGVBcHBsaWNhdGlvbgogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo6YmlndWludFRvVWludDY0TW9kdWxvKHY6IGJ5dGVzKSAtPiB1aW50NjQ6CmJpZ3VpbnRUb1VpbnQ2NE1vZHVsbzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czoyNgogICAgLy8gZXhwb3J0IGZ1bmN0aW9uIGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbyh2OiBiaWd1aW50KTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjI4CiAgICAvLyBjb25zdCBsZW4gPSBvcC5sZW4oYik7CiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6MjkKICAgIC8vIGNvbnN0IHN0YXJ0OiB1aW50NjQgPSBsZW4gPiA4ID8gKGxlbiAtIDgpIDogMDsKICAgIGludGNfMiAvLyA4CiAgICA+CiAgICBieiBiaWd1aW50VG9VaW50NjRNb2R1bG9fdGVybmFyeV9mYWxzZUAyCiAgICBmcmFtZV9kaWcgMAogICAgaW50Y18yIC8vIDgKICAgIC0KCmJpZ3VpbnRUb1VpbnQ2NE1vZHVsb190ZXJuYXJ5X21lcmdlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6MzAKICAgIC8vIGNvbnN0IGxhc3Q4ID0gYi5zbGljZShzdGFydCk7ICAgICAgICAgICAvLyBrZWVwIGxlYXN0LXNpZ25pZmljYW50IDggYnl0ZXMKICAgIGR1cAogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgY292ZXIgMwogICAgPj0KICAgIGRpZyAyCiAgICBzd2FwCiAgICBzZWxlY3QKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6MzEKICAgIC8vIHJldHVybiBvcC5idG9pKGxhc3Q4KTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udmVydCB0byB1aW50NjQKICAgIGJ0b2kKICAgIHN3YXAKICAgIHJldHN1YgoKYmlndWludFRvVWludDY0TW9kdWxvX3Rlcm5hcnlfZmFsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czoyOQogICAgLy8gY29uc3Qgc3RhcnQ6IHVpbnQ2NCA9IGxlbiA+IDggPyAobGVuIC0gOCkgOiAwOwogICAgaW50Y18wIC8vIDAKICAgIGIgYmlndWludFRvVWludDY0TW9kdWxvX3Rlcm5hcnlfbWVyZ2VAMwoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLmNyZWF0ZUFwcGxpY2F0aW9uKG93bmVyOiBieXRlcywgcm91dGVyOiBieXRlcywgYTogdWludDY0LCBhc3NldElkOiB1aW50NjQsIGZlZVNoYXJlQlA6IHVpbnQ2NCwgYmFsYW5jZVJhdGlvTWluQlA6IHVpbnQ2NCkgLT4gdm9pZDoKY3JlYXRlQXBwbGljYXRpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1NQogICAgLy8gY3JlYXRlQXBwbGljYXRpb24ob3duZXI6IEFkZHJlc3MsIHJvdXRlcjogQWRkcmVzcywgYTogdWludDY0LCBhc3NldElkOiB1aW50NjQsIGZlZVNoYXJlQlA6IHVpbnQ2NCwgYmFsYW5jZVJhdGlvTWluQlA6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gNiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czo2CiAgICAvLyBwcm90ZWN0ZWQgb3duZXIgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPigpOwogICAgYnl0ZWMgMTQgLy8gIm93bmVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6OQogICAgLy8gdGhpcy5vd25lci52YWx1ZSA9IG93bmVyOwogICAgZnJhbWVfZGlnIC02CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI3CiAgICAvLyBhc3NldCA9IEdsb2JhbFN0YXRlPEFzc2V0PigpOwogICAgYnl0ZWNfMiAvLyAiYXNzZXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzgKICAgIC8vIHRoaXMuYXNzZXQudmFsdWUgPSBBc3NldChhc3NldElkKTsKICAgIGZyYW1lX2RpZyAtMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ1CiAgICAvLyBhID0gR2xvYmFsU3RhdGU8dWludDY0PigpOwogICAgYnl0ZWMgMjAgLy8gImEiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1NwogICAgLy8gdGhpcy5hLnZhbHVlID0gYTsKICAgIGZyYW1lX2RpZyAtNAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQwCiAgICAvLyByb3V0ZXIgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPigpOy8vIGlzIGRlcG9zaXQgb3BlcmF0aW9uIGFsbG93ZWQKICAgIGJ5dGVjIDIxIC8vICJyb3V0ZXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1OAogICAgLy8gdGhpcy5yb3V0ZXIudmFsdWUgPSByb3V0ZXI7CiAgICBmcmFtZV9kaWcgLTUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1MQogICAgLy8gcHJpdmF0ZSBzdG9wQXV0aG9yaXR5ID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oKTsvLyBjYW4gcmVzdHJpY3QgZGVwb3NpdCBvciB3aXRoZHJhdyBvcGVyYXRpb25zCiAgICBieXRlYyAyMiAvLyAic3RvcEF1dGhvcml0eSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjU5CiAgICAvLyB0aGlzLnN0b3BBdXRob3JpdHkudmFsdWUgPSBvd25lcjsKICAgIGZyYW1lX2RpZyAtNgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM5CiAgICAvLyBmZWVTaGFyZUJQID0gR2xvYmFsU3RhdGU8dWludDY0PigpOwogICAgYnl0ZWMgMTUgLy8gImZlZVNoYXJlQlAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo2MAogICAgLy8gdGhpcy5mZWVTaGFyZUJQLnZhbHVlID0gZmVlU2hhcmVCUDsKICAgIGZyYW1lX2RpZyAtMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQzCiAgICAvLyBiYWxhbmNlUmF0aW9NaW5CUCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDE2IC8vICJiYWxhbmNlUmF0aW9NaW5CUCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjYxCiAgICAvLyB0aGlzLmJhbGFuY2VSYXRpb01pbkJQLnZhbHVlID0gYmFsYW5jZVJhdGlvTWluQlA7CiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MjcKICAgIC8vIGFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiYXNzZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NjMKICAgIC8vIGNvbnN0IGRlY2ltYWxzID0gdGhpcy5hc3NldC52YWx1ZS5kZWNpbWFsczsKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXREZWNpbWFscwogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIwCiAgICAvLyBjb25zdCBTWVNURU1fUFJFQ0lTSU9OOiB1aW50NjQgPSAzOwogICAgcHVzaGludCAzIC8vIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjY0CiAgICAvLyB0aGlzLnRva2VuQW1vdW50UmVkdWNlLnZhbHVlID0gZGVjaW1hbHMgPiBTWVNURU1fUFJFQ0lTSU9OID8gMTAgKiogKGRlY2ltYWxzIC0gU1lTVEVNX1BSRUNJU0lPTikgOiAwOwogICAgPgogICAgYnogY3JlYXRlQXBwbGljYXRpb25fdGVybmFyeV9mYWxzZUAyCiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjAKICAgIC8vIGNvbnN0IFNZU1RFTV9QUkVDSVNJT046IHVpbnQ2NCA9IDM7CiAgICBwdXNoaW50IDMgLy8gMwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NjQKICAgIC8vIHRoaXMudG9rZW5BbW91bnRSZWR1Y2UudmFsdWUgPSBkZWNpbWFscyA+IFNZU1RFTV9QUkVDSVNJT04gPyAxMCAqKiAoZGVjaW1hbHMgLSBTWVNURU1fUFJFQ0lTSU9OKSA6IDA7CiAgICAtCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBzd2FwCiAgICBleHAKCmNyZWF0ZUFwcGxpY2F0aW9uX3Rlcm5hcnlfbWVyZ2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ4CiAgICAvLyBwcml2YXRlIHRva2VuQW1vdW50UmVkdWNlID0gR2xvYmFsU3RhdGU8dWludDY0PigpOwogICAgYnl0ZWMgMjMgLy8gInRva2VuQW1vdW50UmVkdWNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NjQKICAgIC8vIHRoaXMudG9rZW5BbW91bnRSZWR1Y2UudmFsdWUgPSBkZWNpbWFscyA+IFNZU1RFTV9QUkVDSVNJT04gPyAxMCAqKiAoZGVjaW1hbHMgLSBTWVNURU1fUFJFQ0lTSU9OKSA6IDA7CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NjUKICAgIC8vIHRoaXMudG9rZW5BbW91bnRJbmNyZWFzZS52YWx1ZSA9IGRlY2ltYWxzIDwgU1lTVEVNX1BSRUNJU0lPTiA/IDEwICoqIChTWVNURU1fUFJFQ0lTSU9OIC0gZGVjaW1hbHMpIDogMDsKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyMAogICAgLy8gY29uc3QgU1lTVEVNX1BSRUNJU0lPTjogdWludDY0ID0gMzsKICAgIHB1c2hpbnQgMyAvLyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo2NQogICAgLy8gdGhpcy50b2tlbkFtb3VudEluY3JlYXNlLnZhbHVlID0gZGVjaW1hbHMgPCBTWVNURU1fUFJFQ0lTSU9OID8gMTAgKiogKFNZU1RFTV9QUkVDSVNJT04gLSBkZWNpbWFscykgOiAwOwogICAgPAogICAgYnogY3JlYXRlQXBwbGljYXRpb25fdGVybmFyeV9mYWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyMAogICAgLy8gY29uc3QgU1lTVEVNX1BSRUNJU0lPTjogdWludDY0ID0gMzsKICAgIHB1c2hpbnQgMyAvLyAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo2NQogICAgLy8gdGhpcy50b2tlbkFtb3VudEluY3JlYXNlLnZhbHVlID0gZGVjaW1hbHMgPCBTWVNURU1fUFJFQ0lTSU9OID8gMTAgKiogKFNZU1RFTV9QUkVDSVNJT04gLSBkZWNpbWFscykgOiAwOwogICAgZnJhbWVfZGlnIDAKICAgIC0KICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIHN3YXAKICAgIGV4cAoKY3JlYXRlQXBwbGljYXRpb25fdGVybmFyeV9tZXJnZUA2OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDkKICAgIC8vIHByaXZhdGUgdG9rZW5BbW91bnRJbmNyZWFzZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDI0IC8vICJ0b2tlbkFtb3VudEluY3JlYXNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NjUKICAgIC8vIHRoaXMudG9rZW5BbW91bnRJbmNyZWFzZS52YWx1ZSA9IGRlY2ltYWxzIDwgU1lTVEVNX1BSRUNJU0lPTiA/IDEwICoqIChTWVNURU1fUFJFQ0lTSU9OIC0gZGVjaW1hbHMpIDogMDsKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCmNyZWF0ZUFwcGxpY2F0aW9uX3Rlcm5hcnlfZmFsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjY1CiAgICAvLyB0aGlzLnRva2VuQW1vdW50SW5jcmVhc2UudmFsdWUgPSBkZWNpbWFscyA8IFNZU1RFTV9QUkVDSVNJT04gPyAxMCAqKiAoU1lTVEVNX1BSRUNJU0lPTiAtIGRlY2ltYWxzKSA6IDA7CiAgICBpbnRjXzAgLy8gMAogICAgYiBjcmVhdGVBcHBsaWNhdGlvbl90ZXJuYXJ5X21lcmdlQDYKCmNyZWF0ZUFwcGxpY2F0aW9uX3Rlcm5hcnlfZmFsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjY0CiAgICAvLyB0aGlzLnRva2VuQW1vdW50UmVkdWNlLnZhbHVlID0gZGVjaW1hbHMgPiBTWVNURU1fUFJFQ0lTSU9OID8gMTAgKiogKGRlY2ltYWxzIC0gU1lTVEVNX1BSRUNJU0lPTikgOiAwOwogICAgaW50Y18wIC8vIDAKICAgIGIgY3JlYXRlQXBwbGljYXRpb25fdGVybmFyeV9tZXJnZUAzCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6OlBvb2wub3B0SW5Ub0FwcGxpY2F0aW9uKCkgLT4gdm9pZDoKb3B0SW5Ub0FwcGxpY2F0aW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NjgKICAgIC8vIG9wdEluVG9BcHBsaWNhdGlvbigpOiB2b2lkIHsKICAgIHByb3RvIDAgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NjkKICAgIC8vIHN1cGVyLm9wdEluVG9BcHBsaWNhdGlvbihUeG4uc2VuZGVyKTsKICAgIHR4biBTZW5kZXIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjQyCiAgICAvLyBpZiAoIXRoaXMuYmFsYW5jZSh0bykuaGFzVmFsdWUpIHsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzMKICAgIC8vIGJhbGFuY2UgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDQgLy8gImJhbGFuY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NDIKICAgIC8vIGlmICghdGhpcy5iYWxhbmNlKHRvKS5oYXNWYWx1ZSkgewogICAgYXBwX2xvY2FsX2dldF9leAogICAgYnVyeSAxCiAgICBibnogb3B0SW5Ub0FwcGxpY2F0aW9uX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjQzCiAgICAvLyB0aGlzLmJhbGFuY2UodG8pLnZhbHVlID0gMDsKICAgIGZyYW1lX2RpZyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzMKICAgIC8vIGJhbGFuY2UgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDQgLy8gImJhbGFuY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NDMKICAgIC8vIHRoaXMuYmFsYW5jZSh0bykudmFsdWUgPSAwOwogICAgaW50Y18wIC8vIDAKICAgIGFwcF9sb2NhbF9wdXQKCm9wdEluVG9BcHBsaWNhdGlvbl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NDUKICAgIC8vIGlmICghdGhpcy51c2VyUmV3YXJkRGVidCh0bykuaGFzVmFsdWUpIHsKICAgIGZyYW1lX2RpZyAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjM0CiAgICAvLyB1c2VyUmV3YXJkRGVidCA9IExvY2FsU3RhdGU8dWludDY0PigpOwogICAgYnl0ZWMgNSAvLyAidXNlclJld2FyZERlYnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NDUKICAgIC8vIGlmICghdGhpcy51c2VyUmV3YXJkRGVidCh0bykuaGFzVmFsdWUpIHsKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgYm56IG9wdEluVG9BcHBsaWNhdGlvbl9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo0NgogICAgLy8gdGhpcy51c2VyUmV3YXJkRGVidCh0bykudmFsdWUgPSAwOwogICAgZnJhbWVfZGlnIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czozNAogICAgLy8gdXNlclJld2FyZERlYnQgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDUgLy8gInVzZXJSZXdhcmREZWJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjQ2CiAgICAvLyB0aGlzLnVzZXJSZXdhcmREZWJ0KHRvKS52YWx1ZSA9IDA7CiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2xvY2FsX3B1dAoKb3B0SW5Ub0FwcGxpY2F0aW9uX2FmdGVyX2lmX2Vsc2VANToKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLm9wdEluQXNzZXQoKSAtPiB2b2lkOgpvcHRJbkFzc2V0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NzgKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6ODEtODcKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHhmZXJBc3NldDogdGhpcy5hc3NldC52YWx1ZSwKICAgIC8vICAgICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI3CiAgICAvLyBhc3NldCA9IEdsb2JhbFN0YXRlPEFzc2V0PigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImFzc2V0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjg1CiAgICAvLyBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjg0CiAgICAvLyBhc3NldEFtb3VudDogMCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6ODEtODYKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIHhmZXJBc3NldDogdGhpcy5hc3NldC52YWx1ZSwKICAgIC8vICAgICBhc3NldEFtb3VudDogMCwKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIC8vICAgfSkKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjgxLTg3CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMuYXNzZXQudmFsdWUsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IDAsCiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKTsKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo4OQogICAgLy8gbG9nKCdQb29sOiBvcHQtaW4gY29tcGxldGVkJyk7CiAgICBwdXNoYnl0ZXMgIlBvb2w6IG9wdC1pbiBjb21wbGV0ZWQiCiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLm9ubHlSb3V0ZXIoKSAtPiB2b2lkOgpvbmx5Um91dGVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6OTcKICAgIC8vIGFzc2VydChvcC5UeG4uc2VuZGVyLmJ5dGVzID09PSB0aGlzLnJvdXRlci52YWx1ZS5ieXRlcywgJ1Bvb2w6IG9ubHkgcm91dGVyJyk7CiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MAogICAgLy8gcm91dGVyID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oKTsvLyBpcyBkZXBvc2l0IG9wZXJhdGlvbiBhbGxvd2VkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjEgLy8gInJvdXRlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo5NwogICAgLy8gYXNzZXJ0KG9wLlR4bi5zZW5kZXIuYnl0ZXMgPT09IHRoaXMucm91dGVyLnZhbHVlLmJ5dGVzLCAnUG9vbDogb25seSByb3V0ZXInKTsKICAgID09CiAgICBhc3NlcnQgLy8gUG9vbDogb25seSByb3V0ZXIKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLm9ubHlTdG9wQXV0aG9yaXR5KCkgLT4gdm9pZDoKb25seVN0b3BBdXRob3JpdHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxMDEKICAgIC8vIGFzc2VydChvcC5UeG4uc2VuZGVyLmJ5dGVzID09PSB0aGlzLnN0b3BBdXRob3JpdHkudmFsdWUuYnl0ZXMsICdQb29sOiBpcyBub3Qgc3RvcEF1dGhvcml0eScpOwogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NTEKICAgIC8vIHByaXZhdGUgc3RvcEF1dGhvcml0eSA9IEdsb2JhbFN0YXRlPEFkZHJlc3M+KCk7Ly8gY2FuIHJlc3RyaWN0IGRlcG9zaXQgb3Igd2l0aGRyYXcgb3BlcmF0aW9ucwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDIyIC8vICJzdG9wQXV0aG9yaXR5IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjEwMQogICAgLy8gYXNzZXJ0KG9wLlR4bi5zZW5kZXIuYnl0ZXMgPT09IHRoaXMuc3RvcEF1dGhvcml0eS52YWx1ZS5ieXRlcywgJ1Bvb2w6IGlzIG5vdCBzdG9wQXV0aG9yaXR5Jyk7CiAgICA9PQogICAgYXNzZXJ0IC8vIFBvb2w6IGlzIG5vdCBzdG9wQXV0aG9yaXR5CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo6UG9vbC52YWxpZGF0ZUJhbGFuY2VSYXRpbygpIC0+IHZvaWQ6CnZhbGlkYXRlQmFsYW5jZVJhdGlvOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTA3CiAgICAvLyBwcml2YXRlIHZhbGlkYXRlQmFsYW5jZVJhdGlvKCk6IHZvaWQgewogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MQogICAgLy8gdG9rZW5CYWxhbmNlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJ0b2tlbkJhbGFuY2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyB2VXNkQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAidlVzZEJhbGFuY2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb3ZlciAzCiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxMTAKICAgIC8vIGlmICh0b2tlbkJhbGFuY2UgPiB2VXNkQmFsYW5jZSkgewogICAgPgogICAgYnogdmFsaWRhdGVCYWxhbmNlUmF0aW9fZWxzZV9ib2R5QDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjExMQogICAgLy8gYXNzZXJ0KCh2VXNkQmFsYW5jZSAqIEJQKSAvIHRva2VuQmFsYW5jZSA+PSB0aGlzLmJhbGFuY2VSYXRpb01pbkJQLnZhbHVlLCAnUG9vbDogbG93IHZVU0QgYmFsYW5jZScpOwogICAgZnJhbWVfZGlnIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxOQogICAgLy8gZXhwb3J0IGNvbnN0IEJQOiB1aW50NjQgPSAxMF8wMDA7CiAgICBpbnRjIDQgLy8gMTAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjExMQogICAgLy8gYXNzZXJ0KCh2VXNkQmFsYW5jZSAqIEJQKSAvIHRva2VuQmFsYW5jZSA+PSB0aGlzLmJhbGFuY2VSYXRpb01pbkJQLnZhbHVlLCAnUG9vbDogbG93IHZVU0QgYmFsYW5jZScpOwogICAgKgogICAgZnJhbWVfZGlnIDAKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQzCiAgICAvLyBiYWxhbmNlUmF0aW9NaW5CUCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiYmFsYW5jZVJhdGlvTWluQlAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTExCiAgICAvLyBhc3NlcnQoKHZVc2RCYWxhbmNlICogQlApIC8gdG9rZW5CYWxhbmNlID49IHRoaXMuYmFsYW5jZVJhdGlvTWluQlAudmFsdWUsICdQb29sOiBsb3cgdlVTRCBiYWxhbmNlJyk7CiAgICA+PQogICAgYXNzZXJ0IC8vIFBvb2w6IGxvdyB2VVNEIGJhbGFuY2UKCnZhbGlkYXRlQmFsYW5jZVJhdGlvX2FmdGVyX2lmX2Vsc2VANToKICAgIHJldHN1YgoKdmFsaWRhdGVCYWxhbmNlUmF0aW9fZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxMTIKICAgIC8vIH0gZWxzZSBpZiAodG9rZW5CYWxhbmNlIDwgdlVzZEJhbGFuY2UpIHsKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgMQogICAgPAogICAgYnogdmFsaWRhdGVCYWxhbmNlUmF0aW9fYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxMTMKICAgIC8vIGFzc2VydCgodG9rZW5CYWxhbmNlICogQlApIC8gdlVzZEJhbGFuY2UgPj0gdGhpcy5iYWxhbmNlUmF0aW9NaW5CUC52YWx1ZSwgJ1Bvb2w6IGxvdyB0b2tlbiBiYWxhbmNlJyk7CiAgICBmcmFtZV9kaWcgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjE5CiAgICAvLyBleHBvcnQgY29uc3QgQlA6IHVpbnQ2NCA9IDEwXzAwMDsKICAgIGludGMgNCAvLyAxMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTEzCiAgICAvLyBhc3NlcnQoKHRva2VuQmFsYW5jZSAqIEJQKSAvIHZVc2RCYWxhbmNlID49IHRoaXMuYmFsYW5jZVJhdGlvTWluQlAudmFsdWUsICdQb29sOiBsb3cgdG9rZW4gYmFsYW5jZScpOwogICAgKgogICAgZnJhbWVfZGlnIDEKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQzCiAgICAvLyBiYWxhbmNlUmF0aW9NaW5CUCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNiAvLyAiYmFsYW5jZVJhdGlvTWluQlAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTEzCiAgICAvLyBhc3NlcnQoKHRva2VuQmFsYW5jZSAqIEJQKSAvIHZVc2RCYWxhbmNlID49IHRoaXMuYmFsYW5jZVJhdGlvTWluQlAudmFsdWUsICdQb29sOiBsb3cgdG9rZW4gYmFsYW5jZScpOwogICAgPj0KICAgIGFzc2VydCAvLyBQb29sOiBsb3cgdG9rZW4gYmFsYW5jZQogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6OlBvb2wuZGVwb3NpdCgpIC0+IHZvaWQ6CmRlcG9zaXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxMjktMTMwCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGRlcG9zaXQoKTogdm9pZCB7CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjUyCiAgICAvLyBjYW5EZXBvc2l0ID0gR2xvYmFsU3RhdGU8Ym9vbGVhbj4oeyBpbml0aWFsVmFsdWU6IHRydWUgfSk7Ly8gaXMgZGVwb3NpdCBvcGVyYXRpb24gYWxsb3dlZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJjYW5EZXBvc2l0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjExOAogICAgLy8gYXNzZXJ0KHRoaXMuY2FuRGVwb3NpdC52YWx1ZSwgJ1Bvb2w6IGRlcG9zaXQgcHJvaGliaXRlZCcpOwogICAgYXNzZXJ0IC8vIFBvb2w6IGRlcG9zaXQgcHJvaGliaXRlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDYKICAgIC8vIGQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyNwogICAgLy8gYXNzZXQgPSBHbG9iYWxTdGF0ZTxBc3NldD4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJhc3NldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6MzYKICAgIC8vIGFzc2VydChUeG4uZ3JvdXBJbmRleCA+IDAsIGBBc3NldCB0eG4gbWlzc2luZ2ApOwogICAgdHhuIEdyb3VwSW5kZXgKICAgIGFzc2VydCAvLyBBc3NldCB0eG4gbWlzc2luZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjM5CiAgICAvLyBjb25zdCBwcmV2SWR4OiB1aW50NjQgPSBUeG4uZ3JvdXBJbmRleCAtIDE7CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo0MQogICAgLy8gY29uc3QgcGF5ID0gZ3R4bi5Bc3NldFRyYW5zZmVyVHhuKHByZXZJZHgpOwogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18zIC8vIGF4ZmVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXhmZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo0NAogICAgLy8gYXNzZXJ0KHBheS5hc3NldFJlY2VpdmVyID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywgYEFzc2V0IG11c3QgZ28gdG8gYXBwYCk7CiAgICBkdXAKICAgIGd0eG5zIEFzc2V0UmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIEFzc2V0IG11c3QgZ28gdG8gYXBwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3V0aWxzLmFsZ28udHM6NDUKICAgIC8vIGFzc2VydChwYXkueGZlckFzc2V0LmlkID09PSBhc3NldElkLCBgV3JvbmcgYXNzZXRgKTsKICAgIGR1cAogICAgZ3R4bnMgWGZlckFzc2V0CiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gV3JvbmcgYXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo0OAogICAgLy8gYXNzZXJ0KHBheS5yZWtleVRvID09PSBHbG9iYWwuemVyb0FkZHJlc3MsIGBSZWtleSBub3QgYWxsb3dlZGApOwogICAgZHVwCiAgICBndHhucyBSZWtleVRvCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gUmVrZXkgbm90IGFsbG93ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvdXRpbHMuYWxnby50czo0OQogICAgLy8gYXNzZXJ0KHBheS5hc3NldENsb3NlVG8gPT09IEdsb2JhbC56ZXJvQWRkcmVzcywgYENsb3NlVG8gbm90IGFsbG93ZWRgKTsKICAgIGR1cAogICAgZ3R4bnMgQXNzZXRDbG9zZVRvCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gQ2xvc2VUbyBub3QgYWxsb3dlZAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy91dGlscy5hbGdvLnRzOjUwCiAgICAvLyByZXR1cm4gcGF5LmFzc2V0QW1vdW50OwogICAgZ3R4bnMgQXNzZXRBbW91bnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjEzNgogICAgLy8gY29uc3QgYW1vdW50U1AgPSB0aGlzLnRvU3lzdGVtUHJlY2lzaW9uKGFtb3VudCk7CiAgICBjYWxsc3ViIHRvU3lzdGVtUHJlY2lzaW9uCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjEzNwogICAgLy8gYXNzZXJ0KGFtb3VudFNQID4gMCwgJ1Bvb2w6IHRvbyBsaXR0bGUnKTsKICAgIGR1cAogICAgYXNzZXJ0IC8vIFBvb2w6IHRvbyBsaXR0bGUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ0CiAgICAvLyByZXNlcnZlcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAicmVzZXJ2ZXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTQwCiAgICAvLyB0aGlzLnJlc2VydmVzLnZhbHVlICs9IGFtb3VudFNQOwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDQKICAgIC8vIHJlc2VydmVzID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGJ5dGVjXzMgLy8gInJlc2VydmVzIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTQwCiAgICAvLyB0aGlzLnJlc2VydmVzLnZhbHVlICs9IGFtb3VudFNQOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxCiAgICAvLyB0b2tlbkJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInRva2VuQmFsYW5jZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvdmVyIDMKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyB2VXNkQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAidlVzZEJhbGFuY2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb3ZlciA0CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxNDUKICAgIC8vIGNvbnN0IG9sZEJhbGFuY2U6IHVpbnQ2NCA9ICh0b2tlbkJhbGFuY2UgKyB2VXNkQmFsYW5jZSk7CiAgICArCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxNDYKICAgIC8vIGlmIChvbGREID09PSAwIHx8IG9sZEJhbGFuY2UgPT09IDApIHsKICAgIGJ6IGRlcG9zaXRfaWZfYm9keUAyCiAgICBmcmFtZV9kaWcgNAogICAgYm56IGRlcG9zaXRfZWxzZV9ib2R5QDMKCmRlcG9zaXRfaWZfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTQ4CiAgICAvLyBjb25zdCBoYWxmQW1vdW50OiB1aW50NjQgPSBhbW91bnRTUCA+PiAxOwogICAgZnJhbWVfZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICBzaHIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxCiAgICAvLyB0b2tlbkJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInRva2VuQmFsYW5jZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxNDkKICAgIC8vIHRoaXMudG9rZW5CYWxhbmNlLnZhbHVlICs9IGhhbGZBbW91bnQ7CiAgICBkaWcgMQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDEKICAgIC8vIHRva2VuQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlY18wIC8vICJ0b2tlbkJhbGFuY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxNDkKICAgIC8vIHRoaXMudG9rZW5CYWxhbmNlLnZhbHVlICs9IGhhbGZBbW91bnQ7CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDIKICAgIC8vIHZVc2RCYWxhbmNlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJ2VXNkQmFsYW5jZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxNTAKICAgIC8vIHRoaXMudlVzZEJhbGFuY2UudmFsdWUgKz0gaGFsZkFtb3VudDsKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyB2VXNkQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlY18xIC8vICJ2VXNkQmFsYW5jZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjE1MAogICAgLy8gdGhpcy52VXNkQmFsYW5jZS52YWx1ZSArPSBoYWxmQW1vdW50OwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmRlcG9zaXRfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTU2CiAgICAvLyB0aGlzLnVwZGF0ZUQoKTsKICAgIGNhbGxzdWIgdXBkYXRlRAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTU4CiAgICAvLyB0aGlzLmRlcG9zaXRMcChUeG4uc2VuZGVyLCB0aGlzLmQudmFsdWUgLSBvbGREKTsKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ2CiAgICAvLyBkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjE1OAogICAgLy8gdGhpcy5kZXBvc2l0THAoVHhuLnNlbmRlciwgdGhpcy5kLnZhbHVlIC0gb2xkRCk7CiAgICBmcmFtZV9kaWcgMAogICAgLQogICAgY2FsbHN1YiBkZXBvc2l0THAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxCiAgICAvLyB0b2tlbkJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInRva2VuQmFsYW5jZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyMQogICAgLy8gY29uc3QgTUFYX1RPS0VOX0JBTEFOQ0U6IHVpbnQ2NCA9IDIgKiogNDA7IC8vIE1heCBwb3NzaWJsZSB0b2tlbiBiYWxhbmNlCiAgICBwdXNoaW50IDEwOTk1MTE2Mjc3NzYgLy8gMTA5OTUxMTYyNzc3NgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTYwCiAgICAvLyBhc3NlcnQodGhpcy50b2tlbkJhbGFuY2UudmFsdWUgPCBNQVhfVE9LRU5fQkFMQU5DRSwgJ1Bvb2w6IHRvbyBtdWNoJyk7CiAgICA8CiAgICBhc3NlcnQgLy8gUG9vbDogdG9vIG11Y2gKICAgIHJldHN1YgoKZGVwb3NpdF9lbHNlX2JvZHlAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxCiAgICAvLyB0b2tlbkJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInRva2VuQmFsYW5jZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxNTMKICAgIC8vIHRoaXMudG9rZW5CYWxhbmNlLnZhbHVlICs9IG5ldyBVaW50TjY0KChCaWdVaW50KGFtb3VudFNQKSAqIEJpZ1VpbnQodG9rZW5CYWxhbmNlKSkgLyBCaWdVaW50KG9sZEJhbGFuY2UpKS5uYXRpdmU7CiAgICBmcmFtZV9kaWcgMQogICAgaXRvYgogICAgZnJhbWVfZGlnIDIKICAgIGl0b2IKICAgIGRpZyAxCiAgICBiKgogICAgZnJhbWVfZGlnIDQKICAgIGl0b2IKICAgIHN3YXAKICAgIGRpZyAxCiAgICBiLwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gOAogICAgYnplcm8KICAgIHN3YXAKICAgIGRpZyAxCiAgICBifAogICAgYnRvaQogICAgdW5jb3ZlciA0CiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MQogICAgLy8gdG9rZW5CYWxhbmNlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGJ5dGVjXzAgLy8gInRva2VuQmFsYW5jZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjE1MwogICAgLy8gdGhpcy50b2tlbkJhbGFuY2UudmFsdWUgKz0gbmV3IFVpbnRONjQoKEJpZ1VpbnQoYW1vdW50U1ApICogQmlnVWludCh0b2tlbkJhbGFuY2UpKSAvIEJpZ1VpbnQob2xkQmFsYW5jZSkpLm5hdGl2ZTsKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MgogICAgLy8gdlVzZEJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInZVc2RCYWxhbmNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjE1NAogICAgLy8gdGhpcy52VXNkQmFsYW5jZS52YWx1ZSArPSBuZXcgVWludE42NCgoQmlnVWludChhbW91bnRTUCkgKiBCaWdVaW50KHZVc2RCYWxhbmNlKSkgLyBCaWdVaW50KG9sZEJhbGFuY2UpKS5uYXRpdmU7CiAgICBmcmFtZV9kaWcgMwogICAgaXRvYgogICAgdW5jb3ZlciA0CiAgICBiKgogICAgdW5jb3ZlciAzCiAgICBiLwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBidG9pCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MgogICAgLy8gdlVzZEJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgYnl0ZWNfMSAvLyAidlVzZEJhbGFuY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxNTQKICAgIC8vIHRoaXMudlVzZEJhbGFuY2UudmFsdWUgKz0gbmV3IFVpbnRONjQoKEJpZ1VpbnQoYW1vdW50U1ApICogQmlnVWludCh2VXNkQmFsYW5jZSkpIC8gQmlnVWludChvbGRCYWxhbmNlKSkubmF0aXZlOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgZGVwb3NpdF9hZnRlcl9pZl9lbHNlQDQKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo6UG9vbC53aXRoZHJhdyhhbW91bnRMcDogdWludDY0KSAtPiB2b2lkOgp3aXRoZHJhdzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjE2OC0xNjkKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gd2l0aGRyYXcoYW1vdW50THA6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1MwogICAgLy8gY2FuV2l0aGRyYXcgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGluaXRpYWxWYWx1ZTogdHJ1ZSB9KTsvLyBpcyB3aXRoZHJhd24gb3BlcmF0aW9uIGFsbG93ZWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMyAvLyAiY2FuV2l0aGRyYXciCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTIyCiAgICAvLyBhc3NlcnQodGhpcy5jYW5XaXRoZHJhdy52YWx1ZSwgJyJQb29sOiB3aXRoZHJhdyBwcm9oaWJpdGVkJyk7CiAgICBhc3NlcnQgLy8gIlBvb2w6IHdpdGhkcmF3IHByb2hpYml0ZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ2CiAgICAvLyBkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjE3MwogICAgLy8gdGhpcy53aXRoZHJhd0xwKFR4bi5zZW5kZXIsIGFtb3VudExwKTsKICAgIHR4biBTZW5kZXIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEyNgogICAgLy8gbGV0IHVzZXJMcEFtb3VudCA9IHRoaXMuYmFsYW5jZShmcm9tKS52YWx1ZTsKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzMKICAgIC8vIGJhbGFuY2UgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDQgLy8gImJhbGFuY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTI2CiAgICAvLyBsZXQgdXNlckxwQW1vdW50ID0gdGhpcy5iYWxhbmNlKGZyb20pLnZhbHVlOwogICAgYXBwX2xvY2FsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBMb2NhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEyNwogICAgLy8gYXNzZXJ0KHVzZXJMcEFtb3VudCA+PSBscEFtb3VudCwgJ1Jld2FyZE1hbmFnZXI6IG5vdCBlbm91Z2ggYW1vdW50Jyk7CiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMQogICAgPj0KICAgIGFzc2VydCAvLyBSZXdhcmRNYW5hZ2VyOiBub3QgZW5vdWdoIGFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjMwCiAgICAvLyBhY2NSZXdhcmRQZXJTaGFyZVAgPSBHbG9iYWxTdGF0ZTxiaWd1aW50Pih7IGluaXRpYWxWYWx1ZTogMG4gfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAiYWNjUmV3YXJkUGVyU2hhcmVQIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMjkKICAgIC8vIGxldCBwZW5kaW5nOiB1aW50NjQgPSAwOwogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzAKICAgIC8vIGlmICh1c2VyTHBBbW91bnQgPiAwKSB7CiAgICBieiB3aXRoZHJhd19hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzEKICAgIC8vIHBlbmRpbmcgPSBiaWd1aW50VG9VaW50NjRNb2R1bG8oKEJpZ1VpbnQodXNlckxwQW1vdW50KSAqIGFjY1Jld2FyZFBlclNoYXJlUCkgLyBQX1NDQUxFKSAtIHRoaXMudXNlclJld2FyZERlYnQoZnJvbSkudmFsdWU7CiAgICBmcmFtZV9kaWcgMgogICAgaXRvYgogICAgZnJhbWVfZGlnIDMKICAgIGIqCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MjAKICAgIC8vIGNvbnN0IFBfU0NBTEU6IGJpZ3VpbnQgPSBCaWdVaW50KDEgPDwgUCk7CiAgICBieXRlYyA5IC8vIDB4MDEwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzEKICAgIC8vIHBlbmRpbmcgPSBiaWd1aW50VG9VaW50NjRNb2R1bG8oKEJpZ1VpbnQodXNlckxwQW1vdW50KSAqIGFjY1Jld2FyZFBlclNoYXJlUCkgLyBQX1NDQUxFKSAtIHRoaXMudXNlclJld2FyZERlYnQoZnJvbSkudmFsdWU7CiAgICBiLwogICAgY2FsbHN1YiBiaWd1aW50VG9VaW50NjRNb2R1bG8KICAgIGZyYW1lX2RpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjM0CiAgICAvLyB1c2VyUmV3YXJkRGVidCA9IExvY2FsU3RhdGU8dWludDY0PigpOwogICAgYnl0ZWMgNSAvLyAidXNlclJld2FyZERlYnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTMxCiAgICAvLyBwZW5kaW5nID0gYmlndWludFRvVWludDY0TW9kdWxvKChCaWdVaW50KHVzZXJMcEFtb3VudCkgKiBhY2NSZXdhcmRQZXJTaGFyZVApIC8gUF9TQ0FMRSkgLSB0aGlzLnVzZXJSZXdhcmREZWJ0KGZyb20pLnZhbHVlOwogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIExvY2FsU3RhdGUgZXhpc3RzCiAgICAtCiAgICBmcmFtZV9idXJ5IDQKCndpdGhkcmF3X2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzMKICAgIC8vIHVzZXJMcEFtb3VudCAtPSBscEFtb3VudDsKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgLTEKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzQKICAgIC8vIHRoaXMuYmFsYW5jZShmcm9tKS52YWx1ZSAtPSBscEFtb3VudDsKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzMKICAgIC8vIGJhbGFuY2UgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDQgLy8gImJhbGFuY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTM0CiAgICAvLyB0aGlzLmJhbGFuY2UoZnJvbSkudmFsdWUgLT0gbHBBbW91bnQ7CiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgTG9jYWxTdGF0ZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgLQogICAgZGlnIDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czozMwogICAgLy8gYmFsYW5jZSA9IExvY2FsU3RhdGU8dWludDY0PigpOwogICAgYnl0ZWMgNCAvLyAiYmFsYW5jZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzQKICAgIC8vIHRoaXMuYmFsYW5jZShmcm9tKS52YWx1ZSAtPSBscEFtb3VudDsKICAgIHVuY292ZXIgMgogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI5CiAgICAvLyB0b3RhbFN1cHBseSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNyAvLyAidG90YWxTdXBwbHkiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEzNQogICAgLy8gdGhpcy50b3RhbFN1cHBseS52YWx1ZSAtPSBscEFtb3VudDsKICAgIGZyYW1lX2RpZyAtMQogICAgLQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI5CiAgICAvLyB0b3RhbFN1cHBseSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlYyA3IC8vICJ0b3RhbFN1cHBseSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzUKICAgIC8vIHRoaXMudG90YWxTdXBwbHkudmFsdWUgLT0gbHBBbW91bnQ7CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEzNgogICAgLy8gdGhpcy51c2VyUmV3YXJkRGVidChmcm9tKS52YWx1ZSA9IGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbyhCaWdVaW50KHVzZXJMcEFtb3VudCkgKiBhY2NSZXdhcmRQZXJTaGFyZVAgLyBQX1NDQUxFKTsKICAgIHN3YXAKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAzCiAgICBiKgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjIwCiAgICAvLyBjb25zdCBQX1NDQUxFOiBiaWd1aW50ID0gQmlnVWludCgxIDw8IFApOwogICAgYnl0ZWMgOSAvLyAweDAxMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTM2CiAgICAvLyB0aGlzLnVzZXJSZXdhcmREZWJ0KGZyb20pLnZhbHVlID0gYmlndWludFRvVWludDY0TW9kdWxvKEJpZ1VpbnQodXNlckxwQW1vdW50KSAqIGFjY1Jld2FyZFBlclNoYXJlUCAvIFBfU0NBTEUpOwogICAgYi8KICAgIGNhbGxzdWIgYmlndWludFRvVWludDY0TW9kdWxvCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzQKICAgIC8vIHVzZXJSZXdhcmREZWJ0ID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBieXRlYyA1IC8vICJ1c2VyUmV3YXJkRGVidCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzYKICAgIC8vIHRoaXMudXNlclJld2FyZERlYnQoZnJvbSkudmFsdWUgPSBiaWd1aW50VG9VaW50NjRNb2R1bG8oQmlnVWludCh1c2VyTHBBbW91bnQpICogYWNjUmV3YXJkUGVyU2hhcmVQIC8gUF9TQ0FMRSk7CiAgICBzd2FwCiAgICBhcHBfbG9jYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTM3CiAgICAvLyBpZiAocGVuZGluZyA+IDApIHsKICAgIGZyYW1lX2RpZyA0CiAgICBieiB3aXRoZHJhd19hZnRlcl9pZl9lbHNlQDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzgKICAgIC8vIGFzc2V0VHJhbnNmZXIoeyB4ZmVyQXNzZXQ6IHRoaXMuYXNzZXQudmFsdWUsIGFzc2V0QW1vdW50OiBwZW5kaW5nLCBhc3NldFJlY2VpdmVyOiBmcm9tIH0pLnN1Ym1pdCgpOwogICAgaXR4bl9iZWdpbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI3CiAgICAvLyBhc3NldCA9IEdsb2JhbFN0YXRlPEFzc2V0PigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImFzc2V0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzgKICAgIC8vIGFzc2V0VHJhbnNmZXIoeyB4ZmVyQXNzZXQ6IHRoaXMuYXNzZXQudmFsdWUsIGFzc2V0QW1vdW50OiBwZW5kaW5nLCBhc3NldFJlY2VpdmVyOiBmcm9tIH0pLnN1Ym1pdCgpOwogICAgaW50Y18zIC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMzkKICAgIC8vIGVtaXQ8UmV3YXJkc0NsYWltZWQ+KHsgdXNlcjogbmV3IEFkZHJlc3MoZnJvbSksIHBlbmRpbmcgfSk7CiAgICBpdG9iCiAgICBjb25jYXQKICAgIGJ5dGVjIDI1IC8vIG1ldGhvZCAiUmV3YXJkc0NsYWltZWQoYWRkcmVzcyx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKCndpdGhkcmF3X2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxNDEKICAgIC8vIGVtaXQ8V2l0aGRyYXc+KHsgZnJvbTogbmV3IEFkZHJlc3MoZnJvbSksIGxwQW1vdW50IH0pOwogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgMQogICAgZGlnIDEKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4ZDNhZmE0ZjEgLy8gbWV0aG9kICJXaXRoZHJhdyhhZGRyZXNzLHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDEKICAgIC8vIHRva2VuQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAidG9rZW5CYWxhbmNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyB2VXNkQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAidlVzZEJhbGFuY2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTgxCiAgICAvLyBjb25zdCBvbGRCYWxhbmNlOiB1aW50NjQgPSAodG9rZW5CYWxhbmNlICsgdlVzZEJhbGFuY2UpOwogICAgZHVwMgogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDEKICAgIC8vIHRva2VuQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAidG9rZW5CYWxhbmNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjE4MgogICAgLy8gdGhpcy50b2tlbkJhbGFuY2UudmFsdWUgLT0gbmV3IFVpbnRONjQoKEJpZ1VpbnQoYW1vdW50THApICogQmlnVWludCh0b2tlbkJhbGFuY2UpKSAvIEJpZ1VpbnQob2xkQmFsYW5jZSkpLm5hdGl2ZTsKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgZGlnIDQKICAgIGIqCiAgICBkaWcgMgogICAgaXRvYgogICAgc3dhcAogICAgZGlnIDEKICAgIGIvCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDgKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA4CiAgICBiemVybwogICAgc3dhcAogICAgZGlnIDEKICAgIGJ8CiAgICBidG9pCiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxCiAgICAvLyB0b2tlbkJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgYnl0ZWNfMCAvLyAidG9rZW5CYWxhbmNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTgyCiAgICAvLyB0aGlzLnRva2VuQmFsYW5jZS52YWx1ZSAtPSBuZXcgVWludE42NCgoQmlnVWludChhbW91bnRMcCkgKiBCaWdVaW50KHRva2VuQmFsYW5jZSkpIC8gQmlnVWludChvbGRCYWxhbmNlKSkubmF0aXZlOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyB2VXNkQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAidlVzZEJhbGFuY2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTgzCiAgICAvLyB0aGlzLnZVc2RCYWxhbmNlLnZhbHVlIC09IG5ldyBVaW50TjY0KChCaWdVaW50KGFtb3VudExwKSAqIEJpZ1VpbnQodlVzZEJhbGFuY2UpKSAvIEJpZ1VpbnQob2xkQmFsYW5jZSkpLm5hdGl2ZTsKICAgIHVuY292ZXIgNAogICAgaXRvYgogICAgdW5jb3ZlciA1CiAgICBiKgogICAgdW5jb3ZlciAzCiAgICBiLwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMiAvLyA4CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICB1bmNvdmVyIDIKICAgIGJ8CiAgICBidG9pCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MgogICAgLy8gdlVzZEJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgYnl0ZWNfMSAvLyAidlVzZEJhbGFuY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxODMKICAgIC8vIHRoaXMudlVzZEJhbGFuY2UudmFsdWUgLT0gbmV3IFVpbnRONjQoKEJpZ1VpbnQoYW1vdW50THApICogQmlnVWludCh2VXNkQmFsYW5jZSkpIC8gQmlnVWludChvbGRCYWxhbmNlKSkubmF0aXZlOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxCiAgICAvLyB0b2tlbkJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInRva2VuQmFsYW5jZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MgogICAgLy8gdlVzZEJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInZVc2RCYWxhbmNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjE4NQogICAgLy8gYXNzZXJ0KHRoaXMudG9rZW5CYWxhbmNlLnZhbHVlICsgdGhpcy52VXNkQmFsYW5jZS52YWx1ZSA8IG9sZEJhbGFuY2UsICdQb29sOiB6ZXJvIGNoYW5nZXMnKTsKICAgICsKICAgID4KICAgIGFzc2VydCAvLyBQb29sOiB6ZXJvIGNoYW5nZXMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ0CiAgICAvLyByZXNlcnZlcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAicmVzZXJ2ZXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTg4CiAgICAvLyBhc3NlcnQoYW1vdW50THAgPD0gdGhpcy5yZXNlcnZlcy52YWx1ZSwgJ1Bvb2w6IHJlc2VydmVzJyk7CiAgICBmcmFtZV9kaWcgLTEKICAgID49CiAgICBhc3NlcnQgLy8gUG9vbDogcmVzZXJ2ZXMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ0CiAgICAvLyByZXNlcnZlcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAicmVzZXJ2ZXMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTkxCiAgICAvLyB0aGlzLnJlc2VydmVzLnZhbHVlIC09IGFtb3VudExwOwogICAgZnJhbWVfZGlnIC0xCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NAogICAgLy8gcmVzZXJ2ZXMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgYnl0ZWNfMyAvLyAicmVzZXJ2ZXMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxOTEKICAgIC8vIHRoaXMucmVzZXJ2ZXMudmFsdWUgLT0gYW1vdW50THA7CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTk0CiAgICAvLyB0aGlzLnVwZGF0ZUQoKTsKICAgIGNhbGxzdWIgdXBkYXRlRAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDYKICAgIC8vIGQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTk1CiAgICAvLyBhc3NlcnQodGhpcy5kLnZhbHVlIDwgb2xkRCwgJ1Bvb2w6IHplcm8gRCBjaGFuZ2VzJyk7CiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYXNzZXJ0IC8vIFBvb2w6IHplcm8gRCBjaGFuZ2VzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxOTctMjAxCiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICB4ZmVyQXNzZXQ6IHRoaXMuYXNzZXQudmFsdWUsCiAgICAvLyAgIGFzc2V0QW1vdW50OiB0aGlzLmZyb21TeXN0ZW1QcmVjaXNpb24oYW1vdW50THApLAogICAgLy8gICBhc3NldFJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgLy8gfSkuc3VibWl0KCk7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MjcKICAgIC8vIGFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiYXNzZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MTk5CiAgICAvLyBhc3NldEFtb3VudDogdGhpcy5mcm9tU3lzdGVtUHJlY2lzaW9uKGFtb3VudExwKSwKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBmcm9tU3lzdGVtUHJlY2lzaW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyMDAKICAgIC8vIGFzc2V0UmVjZWl2ZXI6IFR4bi5zZW5kZXIsCiAgICB0eG4gU2VuZGVyCiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoxOTctMjAxCiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICB4ZmVyQXNzZXQ6IHRoaXMuYXNzZXQudmFsdWUsCiAgICAvLyAgIGFzc2V0QW1vdW50OiB0aGlzLmZyb21TeXN0ZW1QcmVjaXNpb24oYW1vdW50THApLAogICAgLy8gICBhc3NldFJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgLy8gfSkuc3VibWl0KCk7CiAgICBpbnRjXzMgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6OlBvb2wuc3dhcFRvVlVzZCh1c2VyOiBieXRlcywgYW1vdW50OiB1aW50NjQsIHplcm9GZWU6IHVpbnQ2NCkgLT4gdWludDY0Ogpzd2FwVG9WVXNkOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjEzLTIxNwogICAgLy8gc3dhcFRvVlVzZCgKICAgIC8vICAgdXNlcjogQWRkcmVzcywKICAgIC8vICAgYW1vdW50OiB1aW50NjQsCiAgICAvLyAgIHplcm9GZWU6IGJvb2xlYW4sCiAgICAvLyApOiB1aW50NjQgewogICAgcHJvdG8gMyAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIxOAogICAgLy8gdGhpcy5vbmx5Um91dGVyKCk7CiAgICBjYWxsc3ViIG9ubHlSb3V0ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIyMAogICAgLy8gbGV0IHJlc3VsdDogdWludDY0ID0gMDsgLy8gMCBieSBkZWZhdWx0CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjIwLTIyMQogICAgLy8gbGV0IHJlc3VsdDogdWludDY0ID0gMDsgLy8gMCBieSBkZWZhdWx0CiAgICAvLyBsZXQgZmVlOiB1aW50NjQgPSAwOwogICAgZHVwbiAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyMjIKICAgIC8vIGlmIChhbW91bnQgPiAwKSB7CiAgICBmcmFtZV9kaWcgLTIKICAgIGJ6IHN3YXBUb1ZVc2RfYWZ0ZXJfaWZfZWxzZUA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyMjMKICAgIC8vIGlmICghemVyb0ZlZSkgewogICAgZnJhbWVfZGlnIC0xCiAgICBibnogc3dhcFRvVlVzZF9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM5CiAgICAvLyBmZWVTaGFyZUJQID0gR2xvYmFsU3RhdGU8dWludDY0PigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE1IC8vICJmZWVTaGFyZUJQIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIyNAogICAgLy8gZmVlID0gKGFtb3VudCAqIHRoaXMuZmVlU2hhcmVCUC52YWx1ZSkgLyBCUDsKICAgIGZyYW1lX2RpZyAtMgogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjE5CiAgICAvLyBleHBvcnQgY29uc3QgQlA6IHVpbnQ2NCA9IDEwXzAwMDsKICAgIGludGMgNCAvLyAxMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjI0CiAgICAvLyBmZWUgPSAoYW1vdW50ICogdGhpcy5mZWVTaGFyZUJQLnZhbHVlKSAvIEJQOwogICAgLwogICAgZnJhbWVfYnVyeSAyCgpzd2FwVG9WVXNkX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIyNgogICAgLy8gY29uc3QgYW1vdW50SW4gPSB0aGlzLnRvU3lzdGVtUHJlY2lzaW9uKGFtb3VudCAtIGZlZSk7CiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAyCiAgICAtCiAgICBjYWxsc3ViIHRvU3lzdGVtUHJlY2lzaW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyMjgKICAgIC8vIGZlZSA9IGFtb3VudCAtIHRoaXMuZnJvbVN5c3RlbVByZWNpc2lvbihhbW91bnRJbik7CiAgICBkdXAKICAgIGNhbGxzdWIgZnJvbVN5c3RlbVByZWNpc2lvbgogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICAtCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxCiAgICAvLyB0b2tlbkJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInRva2VuQmFsYW5jZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyMzEKICAgIC8vIHRoaXMudG9rZW5CYWxhbmNlLnZhbHVlICs9IGFtb3VudEluOwogICAgZGlnIDEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxCiAgICAvLyB0b2tlbkJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgYnl0ZWNfMCAvLyAidG9rZW5CYWxhbmNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjMxCiAgICAvLyB0aGlzLnRva2VuQmFsYW5jZS52YWx1ZSArPSBhbW91bnRJbjsKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NAogICAgLy8gcmVzZXJ2ZXMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInJlc2VydmVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIzMgogICAgLy8gdGhpcy5yZXNlcnZlcy52YWx1ZSArPSBhbW91bnRJbjsKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ0CiAgICAvLyByZXNlcnZlcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlY18zIC8vICJyZXNlcnZlcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIzMgogICAgLy8gdGhpcy5yZXNlcnZlcy52YWx1ZSArPSBhbW91bnRJbjsKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MQogICAgLy8gdG9rZW5CYWxhbmNlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJ0b2tlbkJhbGFuY2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjM0CiAgICAvLyBjb25zdCB2VXNkTmV3QW1vdW50ID0gdGhpcy5nZXRZKHRoaXMudG9rZW5CYWxhbmNlLnZhbHVlKTsKICAgIGNhbGxzdWIgZ2V0WQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyB2VXNkQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAidlVzZEJhbGFuY2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjM1CiAgICAvLyBpZiAodGhpcy52VXNkQmFsYW5jZS52YWx1ZSA+IHZVc2ROZXdBbW91bnQpIHsKICAgIDwKICAgIGJ6IHN3YXBUb1ZVc2RfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MgogICAgLy8gdlVzZEJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInZVc2RCYWxhbmNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIzNgogICAgLy8gcmVzdWx0ID0gdGhpcy52VXNkQmFsYW5jZS52YWx1ZSAtIHZVc2ROZXdBbW91bnQ7CiAgICBmcmFtZV9kaWcgMAogICAgLQogICAgZnJhbWVfYnVyeSAxCgpzd2FwVG9WVXNkX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyB2VXNkQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlY18xIC8vICJ2VXNkQmFsYW5jZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIzOAogICAgLy8gdGhpcy52VXNkQmFsYW5jZS52YWx1ZSA9IHZVc2ROZXdBbW91bnQ7CiAgICBmcmFtZV9kaWcgMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIzOQogICAgLy8gdGhpcy5hZGRSZXdhcmRzKGZlZSk7CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjYWxsc3ViIGFkZFJld2FyZHMKICAgIGZyYW1lX2J1cnkgMwogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2J1cnkgNAoKc3dhcFRvVlVzZF9hZnRlcl9pZl9lbHNlQDY6CiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyNwogICAgLy8gYXNzZXQgPSBHbG9iYWxTdGF0ZTxBc3NldD4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJhc3NldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyNDIKICAgIC8vIGVtaXQ8U3dhcHBlZFRvVlVzZD4oeyBzZW5kZXI6IHVzZXIsIHRva2VuSWQ6IHRoaXMuYXNzZXQudmFsdWUuaWQsIGFtb3VudCwgdlVzZEFtb3VudDogcmVzdWx0LCBmZWUgfSk7CiAgICBmcmFtZV9kaWcgLTIKICAgIGl0b2IKICAgIGRpZyAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAtMwogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgyYmJiZWNhMyAvLyBtZXRob2QgIlN3YXBwZWRUb1ZVc2QoYWRkcmVzcyx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI0NAogICAgLy8gdGhpcy52YWxpZGF0ZUJhbGFuY2VSYXRpbygpOwogICAgY2FsbHN1YiB2YWxpZGF0ZUJhbGFuY2VSYXRpbwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjQ1CiAgICAvLyByZXR1cm4gcmVzdWx0OwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo6UG9vbC5zd2FwRnJvbVZVc2QodXNlcjogYnl0ZXMsIGFtb3VudDogdWludDY0LCByZWNlaXZlQW1vdW50TWluOiB1aW50NjQsIHplcm9GZWU6IHVpbnQ2NCkgLT4gdWludDY0Ogpzd2FwRnJvbVZVc2Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyNTktMjY0CiAgICAvLyBzd2FwRnJvbVZVc2QoCiAgICAvLyAgIHVzZXI6IEFkZHJlc3MsCiAgICAvLyAgIGFtb3VudDogdWludDY0LAogICAgLy8gICByZWNlaXZlQW1vdW50TWluOiB1aW50NjQsCiAgICAvLyAgIHplcm9GZWU6IGJvb2xlYW4sCiAgICAvLyApOiB1aW50NjQgewogICAgcHJvdG8gNCAxCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjY1CiAgICAvLyB0aGlzLm9ubHlSb3V0ZXIoKTsKICAgIGNhbGxzdWIgb25seVJvdXRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjY3CiAgICAvLyBsZXQgcmVzdWx0U1A6IHVpbnQ2NCA9IDA7IC8vIDAgYnkgZGVmYXVsdAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI2OC0yNjkKICAgIC8vIGxldCByZXN1bHQ6IHVpbnQ2NCA9IDA7IC8vIDAgYnkgZGVmYXVsdAogICAgLy8gbGV0IGZlZTogdWludDY0ID0gMDsKICAgIGR1cG4gNAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjcwCiAgICAvLyBpZiAoYW1vdW50ID4gMCkgewogICAgZnJhbWVfZGlnIC0zCiAgICBieiBzd2FwRnJvbVZVc2RfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MgogICAgLy8gdlVzZEJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInZVc2RCYWxhbmNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI3MQogICAgLy8gdGhpcy52VXNkQmFsYW5jZS52YWx1ZSArPSBhbW91bnQ7CiAgICBmcmFtZV9kaWcgLTMKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyCiAgICAvLyB2VXNkQmFsYW5jZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlY18xIC8vICJ2VXNkQmFsYW5jZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI3MQogICAgLy8gdGhpcy52VXNkQmFsYW5jZS52YWx1ZSArPSBhbW91bnQ7CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDIKICAgIC8vIHZVc2RCYWxhbmNlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJ2VXNkQmFsYW5jZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyNzIKICAgIC8vIGNvbnN0IG5ld0Ftb3VudCA9IHRoaXMuZ2V0WSh0aGlzLnZVc2RCYWxhbmNlLnZhbHVlKTsKICAgIGNhbGxzdWIgZ2V0WQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxCiAgICAvLyB0b2tlbkJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInRva2VuQmFsYW5jZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGZyYW1lX2J1cnkgMQogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6Mjc0CiAgICAvLyBpZiAodG9rZW5CYWxhbmNlID4gbmV3QW1vdW50KSB7CiAgICA8CiAgICBieiBzd2FwRnJvbVZVc2RfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyNzUKICAgIC8vIHJlc3VsdFNQID0gdG9rZW5CYWxhbmNlIC0gbmV3QW1vdW50OwogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICAtCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6Mjc2CiAgICAvLyByZXN1bHQgPSB0aGlzLmZyb21TeXN0ZW1QcmVjaXNpb24ocmVzdWx0U1ApOwogICAgY2FsbHN1YiBmcm9tU3lzdGVtUHJlY2lzaW9uCiAgICBmcmFtZV9idXJ5IDMKCnN3YXBGcm9tVlVzZF9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NAogICAgLy8gcmVzZXJ2ZXMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInJlc2VydmVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI4MAogICAgLy8gYXNzZXJ0KHJlc3VsdFNQIDw9IHRoaXMucmVzZXJ2ZXMudmFsdWUsICdQb29sOiByZXNlcnZlcycpOwogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICA8PQogICAgYXNzZXJ0IC8vIFBvb2w6IHJlc2VydmVzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NAogICAgLy8gcmVzZXJ2ZXMgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gInJlc2VydmVzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI4MgogICAgLy8gdGhpcy5yZXNlcnZlcy52YWx1ZSAtPSByZXN1bHRTUDsKICAgIHN3YXAKICAgIC0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ0CiAgICAvLyByZXNlcnZlcyA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlY18zIC8vICJyZXNlcnZlcyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI4MgogICAgLy8gdGhpcy5yZXNlcnZlcy52YWx1ZSAtPSByZXN1bHRTUDsKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyODMKICAgIC8vIGlmICghemVyb0ZlZSkgewogICAgZnJhbWVfZGlnIC0xCiAgICBibnogc3dhcEZyb21WVXNkX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzkKICAgIC8vIGZlZVNoYXJlQlAgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTUgLy8gImZlZVNoYXJlQlAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6Mjg0CiAgICAvLyBmZWUgPSAocmVzdWx0ICogdGhpcy5mZWVTaGFyZUJQLnZhbHVlKSAvIEJQOwogICAgZnJhbWVfZGlnIDMKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxOQogICAgLy8gZXhwb3J0IGNvbnN0IEJQOiB1aW50NjQgPSAxMF8wMDA7CiAgICBpbnRjIDQgLy8gMTAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI4NAogICAgLy8gZmVlID0gKHJlc3VsdCAqIHRoaXMuZmVlU2hhcmVCUC52YWx1ZSkgLyBCUDsKICAgIC8KICAgIGZyYW1lX2J1cnkgNAoKc3dhcEZyb21WVXNkX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI4NwogICAgLy8gcmVzdWx0IC09IGZlZTsKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MQogICAgLy8gdG9rZW5CYWxhbmNlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGJ5dGVjXzAgLy8gInRva2VuQmFsYW5jZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI4OQogICAgLy8gdGhpcy50b2tlbkJhbGFuY2UudmFsdWUgPSBuZXdBbW91bnQ7CiAgICBmcmFtZV9kaWcgMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI5MAogICAgLy8gYXNzZXJ0KHJlc3VsdCA+PSByZWNlaXZlQW1vdW50TWluLCAnUG9vbDogc2xpcHBhZ2UnKTsKICAgIGR1cAogICAgZnJhbWVfZGlnIC0yCiAgICA+PQogICAgYXNzZXJ0IC8vIFBvb2w6IHNsaXBwYWdlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyOTEtMjk1CiAgICAvLyBpdHhuLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICB4ZmVyQXNzZXQ6IHRoaXMuYXNzZXQudmFsdWUsCiAgICAvLyAgIGFzc2V0QW1vdW50OiByZXN1bHQsCiAgICAvLyAgIGFzc2V0UmVjZWl2ZXI6IHVzZXIubmF0aXZlLAogICAgLy8gfSkuc3VibWl0KCk7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MjcKICAgIC8vIGFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiYXNzZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZnJhbWVfZGlnIC00CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIGRpZyAxCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MjkxLTI5NQogICAgLy8gaXR4bi5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgeGZlckFzc2V0OiB0aGlzLmFzc2V0LnZhbHVlLAogICAgLy8gICBhc3NldEFtb3VudDogcmVzdWx0LAogICAgLy8gICBhc3NldFJlY2VpdmVyOiB1c2VyLm5hdGl2ZSwKICAgIC8vIH0pLnN1Ym1pdCgpOwogICAgaW50Y18zIC8vIDQKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI5NgogICAgLy8gdGhpcy5hZGRSZXdhcmRzKGZlZSk7CiAgICBkaWcgMQogICAgY2FsbHN1YiBhZGRSZXdhcmRzCiAgICBmcmFtZV9idXJ5IDYKICAgIGZyYW1lX2J1cnkgNQoKc3dhcEZyb21WVXNkX2FmdGVyX2lmX2Vsc2VANzoKICAgIGZyYW1lX2RpZyA1CiAgICBmcmFtZV9kaWcgNgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI3CiAgICAvLyBhc3NldCA9IEdsb2JhbFN0YXRlPEFzc2V0PigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImFzc2V0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjI5OAogICAgLy8gZW1pdDxTd2FwcGVkRnJvbVZVc2Q+KHsgcmVjaXBpZW50OiB1c2VyLCB0b2tlbklkOiB0aGlzLmFzc2V0LnZhbHVlLmlkLCB2VXNkQW1vdW50OiBhbW91bnQsIGFtb3VudDogcmVzdWx0LCBmZWUgfSk7CiAgICBmcmFtZV9kaWcgLTMKICAgIGl0b2IKICAgIGRpZyAyCiAgICBpdG9iCiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAtNAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHhkM2YxZDU0MiAvLyBtZXRob2QgIlN3YXBwZWRGcm9tVlVzZChhZGRyZXNzLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzAwCiAgICAvLyB0aGlzLnZhbGlkYXRlQmFsYW5jZVJhdGlvKCk7CiAgICBjYWxsc3ViIHZhbGlkYXRlQmFsYW5jZVJhdGlvCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMDEKICAgIC8vIHJldHVybiByZXN1bHQ7CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLnNldEZlZVNoYXJlKGZlZVNoYXJlQlA6IHVpbnQ2NCkgLT4gdm9pZDoKc2V0RmVlU2hhcmU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMDcKICAgIC8vIHNldEZlZVNoYXJlKGZlZVNoYXJlQlA6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMDgKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzA5CiAgICAvLyBhc3NlcnQoZmVlU2hhcmVCUCA8PSBCUCwgJ1Bvb2w6IHRvbyBsYXJnZScpOwogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTkKICAgIC8vIGV4cG9ydCBjb25zdCBCUDogdWludDY0ID0gMTBfMDAwOwogICAgaW50YyA0IC8vIDEwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMDkKICAgIC8vIGFzc2VydChmZWVTaGFyZUJQIDw9IEJQLCAnUG9vbDogdG9vIGxhcmdlJyk7CiAgICA8PQogICAgYXNzZXJ0IC8vIFBvb2w6IHRvbyBsYXJnZQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzkKICAgIC8vIGZlZVNoYXJlQlAgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBieXRlYyAxNSAvLyAiZmVlU2hhcmVCUCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMxMAogICAgLy8gdGhpcy5mZWVTaGFyZUJQLnZhbHVlID0gZmVlU2hhcmVCUDsKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLmFkanVzdFRvdGFsTHBBbW91bnQoKSAtPiB2b2lkOgphZGp1c3RUb3RhbExwQW1vdW50OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzEzCiAgICAvLyBhZGp1c3RUb3RhbExwQW1vdW50KCk6IHZvaWQgewogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMTQKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDYKICAgIC8vIGQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDYgLy8gImQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyOQogICAgLy8gdG90YWxTdXBwbHkgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gInRvdGFsU3VwcGx5IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgY292ZXIgMgogICAgY292ZXIgMwogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzE4CiAgICAvLyBpZiAoZCA+IHRvdGFsU3VwcGx5KSB7CiAgICA+CiAgICBieiBhZGp1c3RUb3RhbExwQW1vdW50X2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzE5CiAgICAvLyB0aGlzLmRlcG9zaXRMcChUeG4uc2VuZGVyLCBkIC0gdG90YWxTdXBwbHkpOwogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAxCiAgICAtCiAgICBjYWxsc3ViIGRlcG9zaXRMcAoKYWRqdXN0VG90YWxMcEFtb3VudF9hZnRlcl9pZl9lbHNlQDI6CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo6UG9vbC5zZXRCYWxhbmNlUmF0aW9NaW5CUChiYWxhbmNlUmF0aW9NaW5CUDogdWludDY0KSAtPiB2b2lkOgpzZXRCYWxhbmNlUmF0aW9NaW5CUDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMyNgogICAgLy8gc2V0QmFsYW5jZVJhdGlvTWluQlAoYmFsYW5jZVJhdGlvTWluQlA6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMjcKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzI4CiAgICAvLyBhc3NlcnQoYmFsYW5jZVJhdGlvTWluQlAgPD0gQlAsICdQb29sOiB0b28gbGFyZ2UnKTsKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjE5CiAgICAvLyBleHBvcnQgY29uc3QgQlA6IHVpbnQ2NCA9IDEwXzAwMDsKICAgIGludGMgNCAvLyAxMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzI4CiAgICAvLyBhc3NlcnQoYmFsYW5jZVJhdGlvTWluQlAgPD0gQlAsICdQb29sOiB0b28gbGFyZ2UnKTsKICAgIDw9CiAgICBhc3NlcnQgLy8gUG9vbDogdG9vIGxhcmdlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MwogICAgLy8gYmFsYW5jZVJhdGlvTWluQlAgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBieXRlYyAxNiAvLyAiYmFsYW5jZVJhdGlvTWluQlAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMjkKICAgIC8vIHRoaXMuYmFsYW5jZVJhdGlvTWluQlAudmFsdWUgPSBiYWxhbmNlUmF0aW9NaW5CUDsKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLnN0b3BEZXBvc2l0KCkgLT4gdm9pZDoKc3RvcERlcG9zaXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMzMKICAgIC8vIHRoaXMub25seVN0b3BBdXRob3JpdHkoKTsKICAgIGNhbGxzdWIgb25seVN0b3BBdXRob3JpdHkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjUyCiAgICAvLyBjYW5EZXBvc2l0ID0gR2xvYmFsU3RhdGU8Ym9vbGVhbj4oeyBpbml0aWFsVmFsdWU6IHRydWUgfSk7Ly8gaXMgZGVwb3NpdCBvcGVyYXRpb24gYWxsb3dlZAogICAgYnl0ZWMgMTIgLy8gImNhbkRlcG9zaXQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMzQKICAgIC8vIHRoaXMuY2FuRGVwb3NpdC52YWx1ZSA9IGZhbHNlOwogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo6UG9vbC5zdGFydERlcG9zaXQoKSAtPiB2b2lkOgpzdGFydERlcG9zaXQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozMzgKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NTIKICAgIC8vIGNhbkRlcG9zaXQgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGluaXRpYWxWYWx1ZTogdHJ1ZSB9KTsvLyBpcyBkZXBvc2l0IG9wZXJhdGlvbiBhbGxvd2VkCiAgICBieXRlYyAxMiAvLyAiY2FuRGVwb3NpdCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjMzOQogICAgLy8gdGhpcy5jYW5EZXBvc2l0LnZhbHVlID0gdHJ1ZTsKICAgIGludGNfMSAvLyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6OlBvb2wuc3RvcFdpdGhkcmF3KCkgLT4gdm9pZDoKc3RvcFdpdGhkcmF3OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzQzCiAgICAvLyB0aGlzLm9ubHlTdG9wQXV0aG9yaXR5KCk7CiAgICBjYWxsc3ViIG9ubHlTdG9wQXV0aG9yaXR5CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1MwogICAgLy8gY2FuV2l0aGRyYXcgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGluaXRpYWxWYWx1ZTogdHJ1ZSB9KTsvLyBpcyB3aXRoZHJhd24gb3BlcmF0aW9uIGFsbG93ZWQKICAgIGJ5dGVjIDEzIC8vICJjYW5XaXRoZHJhdyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM0NAogICAgLy8gdGhpcy5jYW5XaXRoZHJhdy52YWx1ZSA9IGZhbHNlOwogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo6UG9vbC5zdGFydFdpdGhkcmF3KCkgLT4gdm9pZDoKc3RhcnRXaXRoZHJhdzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM0OAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1MwogICAgLy8gY2FuV2l0aGRyYXcgPSBHbG9iYWxTdGF0ZTxib29sZWFuPih7IGluaXRpYWxWYWx1ZTogdHJ1ZSB9KTsvLyBpcyB3aXRoZHJhd24gb3BlcmF0aW9uIGFsbG93ZWQKICAgIGJ5dGVjIDEzIC8vICJjYW5XaXRoZHJhdyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM0OQogICAgLy8gdGhpcy5jYW5XaXRoZHJhdy52YWx1ZSA9IHRydWU7CiAgICBpbnRjXzEgLy8gMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLnNldFN0b3BBdXRob3JpdHkoc3RvcEF1dGhvcml0eTogYnl0ZXMpIC0+IHZvaWQ6CnNldFN0b3BBdXRob3JpdHk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNTIKICAgIC8vIHNldFN0b3BBdXRob3JpdHkoc3RvcEF1dGhvcml0eTogQWRkcmVzcyk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNTMKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NTEKICAgIC8vIHByaXZhdGUgc3RvcEF1dGhvcml0eSA9IEdsb2JhbFN0YXRlPEFkZHJlc3M+KCk7Ly8gY2FuIHJlc3RyaWN0IGRlcG9zaXQgb3Igd2l0aGRyYXcgb3BlcmF0aW9ucwogICAgYnl0ZWMgMjIgLy8gInN0b3BBdXRob3JpdHkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNTQKICAgIC8vIHRoaXMuc3RvcEF1dGhvcml0eS52YWx1ZSA9IHN0b3BBdXRob3JpdHk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo6UG9vbC5zZXRSb3V0ZXIocm91dGVyOiBieXRlcykgLT4gdm9pZDoKc2V0Um91dGVyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzU3CiAgICAvLyBzZXRSb3V0ZXIocm91dGVyOiBBZGRyZXNzKTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM1OAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MAogICAgLy8gcm91dGVyID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oKTsvLyBpcyBkZXBvc2l0IG9wZXJhdGlvbiBhbGxvd2VkCiAgICBieXRlYyAyMSAvLyAicm91dGVyIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6MzU5CiAgICAvLyB0aGlzLnJvdXRlci52YWx1ZSA9IHJvdXRlcjsKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLmdldFkoeDogdWludDY0KSAtPiB1aW50NjQ6CmdldFk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNjUKICAgIC8vIHByaXZhdGUgZ2V0WSh4OiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMSAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNjYKICAgIC8vIGNvbnN0IHhfID0gQmlnVWludCh4KTsKICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NgogICAgLy8gZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNjcKICAgIC8vIGNvbnN0IGRfID0gQmlnVWludCh0aGlzLmQudmFsdWUpOwogICAgaXRvYgogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NQogICAgLy8gYSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMCAvLyAiYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNjgKICAgIC8vIGNvbnN0IGE0ID0gQmlnVWludCh0aGlzLmEudmFsdWUgPDwgMik7CiAgICBwdXNoaW50IDIgLy8gMgogICAgc2hsCiAgICBpdG9iCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM2OQogICAgLy8gY29uc3QgYTggPSBCaWdVaW50KGE0ICogMm4pOwogICAgYnl0ZWMgMTcgLy8gMHgwMgogICAgYioKICAgIGNvdmVyIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM3MQogICAgLy8gY29uc3QgZE1pbnVzWElzUG9zaXRpdmUgPSBkXyA+PSB4XzsKICAgIGI8PQogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNzIKICAgIC8vIGNvbnN0IGRNaW51c1hBYnM6IGJpZ3VpbnQgPSBkTWludXNYSXNQb3NpdGl2ZSA/IChkXyAtIHhfKSA6ICh4XyAtIGRfKTsKICAgIGJ6IGdldFlfdGVybmFyeV9mYWxzZUAyCiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDIKICAgIGItCgpnZXRZX3Rlcm5hcnlfbWVyZ2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM3NAogICAgLy8gY29uc3QgYTRCeURNaW51c1hBYnM6IGJpZ3VpbnQgPSBhNCAqIGRNaW51c1hBYnM7CiAgICBmcmFtZV9kaWcgNAogICAgYioKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6Mzc5CiAgICAvLyBpZiAoZE1pbnVzWElzUG9zaXRpdmUpIHsKICAgIGZyYW1lX2RpZyA2CiAgICBieiBnZXRZX2Vsc2VfYm9keUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozODAKICAgIC8vIGlmIChhNEJ5RE1pbnVzWEFicyA+PSBkXykgewogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAzCiAgICBiPj0KICAgIGJ6IGdldFlfZWxzZV9ib2R5QDYKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM4MQogICAgLy8gcGFydDFBYnMgPSBhNEJ5RE1pbnVzWEFicyAtIGRfOwogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2RpZyAzCiAgICBiLQogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozODIKICAgIC8vIHBhcnQxSXNQb3NpdGl2ZSA9IHRydWU7CiAgICBpbnRjXzEgLy8gMQoKZ2V0WV9hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozOTMKICAgIC8vIGNvbnN0IHBhcnQyOiBiaWd1aW50ID0gQmlnVWludCh4KSAqIChhNCAqIGRfICogZF8gKiBkXyArIHhfICogKHBhcnQxQWJzICogcGFydDFBYnMpKTsKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBiKgogICAgZGlnIDEKICAgIGIqCiAgICBiKgogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgYioKICAgIGZyYW1lX2RpZyAyCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYioKICAgIHVuY292ZXIgMgogICAgYisKICAgIGIqCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozOTQKICAgIC8vIGxldCBudW1lcmF0b3I6IGJpZ3VpbnQgPSB0aGlzLnNxcnQocGFydDIpOwogICAgY2FsbHN1YiBzcXJ0CiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozOTcKICAgIC8vIGlmIChwYXJ0MUlzUG9zaXRpdmUpIHsKICAgIGJ6IGdldFlfZWxzZV9ib2R5QDExCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozOTgKICAgIC8vIG51bWVyYXRvciArPSB4XyAqIHBhcnQxQWJzOwogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAxCiAgICBiKgogICAgYisKCmdldFlfYWZ0ZXJfaWZfZWxzZUAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQwNAogICAgLy8gcmV0dXJuIGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbyhudW1lcmF0b3IgLyAoYTggKiB4XykgKyAxbik7IC8vICsxIHRvIG9mZnNldCByb3VuZGluZyBlcnJvcnMKICAgIGZyYW1lX2RpZyA1CiAgICBmcmFtZV9kaWcgMgogICAgYioKICAgIGIvCiAgICBieXRlYyAxMCAvLyAweDAxCiAgICBiKwogICAgY2FsbHN1YiBiaWd1aW50VG9VaW50NjRNb2R1bG8KICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgpnZXRZX2Vsc2VfYm9keUAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQwMAogICAgLy8gbnVtZXJhdG9yIC09IHhfICogcGFydDFBYnM7CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIGIqCiAgICBiLQogICAgYiBnZXRZX2FmdGVyX2lmX2Vsc2VAMTIKCmdldFlfZWxzZV9ib2R5QDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozODQKICAgIC8vIHBhcnQxQWJzID0gZF8gLSBhNEJ5RE1pbnVzWEFiczsKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMAogICAgYi0KICAgIGZyYW1lX2J1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6Mzg1CiAgICAvLyBwYXJ0MUlzUG9zaXRpdmUgPSBmYWxzZTsKICAgIGludGNfMCAvLyAwCiAgICBiIGdldFlfYWZ0ZXJfaWZfZWxzZUA5CgpnZXRZX2Vsc2VfYm9keUA4OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6Mzg4CiAgICAvLyBwYXJ0MUFicyA9IGE0QnlETWludXNYQWJzICsgZF87CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDMKICAgIGIrCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjM4OQogICAgLy8gcGFydDFJc1Bvc2l0aXZlID0gZmFsc2U7CiAgICBpbnRjXzAgLy8gMAogICAgYiBnZXRZX2FmdGVyX2lmX2Vsc2VAOQoKZ2V0WV90ZXJuYXJ5X2ZhbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czozNzIKICAgIC8vIGNvbnN0IGRNaW51c1hBYnM6IGJpZ3VpbnQgPSBkTWludXNYSXNQb3NpdGl2ZSA/IChkXyAtIHhfKSA6ICh4XyAtIGRfKTsKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgMwogICAgYi0KICAgIGIgZ2V0WV90ZXJuYXJ5X21lcmdlQDMKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo6UG9vbC51cGRhdGVEKCkgLT4gdm9pZDoKdXBkYXRlRDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQwNwogICAgLy8gcHJpdmF0ZSB1cGRhdGVEKCk6IHZvaWQgewogICAgcHJvdG8gMCAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MQogICAgLy8gdG9rZW5CYWxhbmNlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJ0b2tlbkJhbGFuY2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDA4CiAgICAvLyBjb25zdCB4ID0gQmlnVWludCh0aGlzLnRva2VuQmFsYW5jZS52YWx1ZSk7CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MgogICAgLy8gdlVzZEJhbGFuY2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInZVc2RCYWxhbmNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQwOQogICAgLy8gY29uc3QgeSA9IEJpZ1VpbnQodGhpcy52VXNkQmFsYW5jZS52YWx1ZSk7CiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MTQKICAgIC8vIGNvbnN0IHh5OiBiaWd1aW50ID0geCAqIHk7CiAgICBkdXAyCiAgICBiKgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDUKICAgIC8vIGEgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjAgLy8gImEiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDE1CiAgICAvLyBjb25zdCBhXyA9IEJpZ1VpbnQodGhpcy5hLnZhbHVlKTsKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxNwogICAgLy8gY29uc3QgcDE6IGJpZ3VpbnQgPSBhXyAqIHh5ICogKHggKyB5KTsKICAgIGR1cAogICAgZGlnIDIKICAgIGIqCiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgNAogICAgYisKICAgIGIqCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvdmVyIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQxOQogICAgLy8gY29uc3QgcDI6IGJpZ3VpbnQgPSAoeHkgKiAoKGFfICogNG4pIC0gMW4pKSAvIDNuOwogICAgcHVzaGJ5dGVzIDB4MDQKICAgIGIqCiAgICBieXRlYyAxMCAvLyAweDAxCiAgICBiLQogICAgdW5jb3ZlciAyCiAgICBiKgogICAgYnl0ZWMgMjYgLy8gMHgwMwogICAgYi8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyMQogICAgLy8gY29uc3QgcDM6IGJpZ3VpbnQgPSB0aGlzLnNxcnQoKHAxICogcDEpICsgKHAyICogcDIgKiBwMikpOwogICAgZGlnIDEKICAgIGRpZyAyCiAgICBiKgogICAgZGlnIDEKICAgIGRpZyAyCiAgICBiKgogICAgdW5jb3ZlciAyCiAgICBiKgogICAgYisKICAgIGNhbGxzdWIgc3FydAogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MjIKICAgIC8vIGxldCBkXyA9IHRoaXMuY2JydChwMSArIHAzKTsKICAgIGR1cDIKICAgIGIrCiAgICBjYWxsc3ViIGNicnQKICAgIGNvdmVyIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyMwogICAgLy8gaWYgKHAzID4gcDEpIHsKICAgIGI8CiAgICBieiB1cGRhdGVEX2Vsc2VfYm9keUAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MjQKICAgIC8vIGRfIC09IHRoaXMuY2JydChwMyAtIHAxKTsKICAgIGZyYW1lX2RpZyAwCiAgICBiLQogICAgY2FsbHN1YiBjYnJ0CiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgLQogICAgZnJhbWVfYnVyeSAxCgp1cGRhdGVEX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQyOAogICAgLy8gdGhpcy5kLnZhbHVlID0gKGRfIDw8IDEpOwogICAgZnJhbWVfZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICBzaGwKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ2CiAgICAvLyBkID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGJ5dGVjIDYgLy8gImQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MjgKICAgIC8vIHRoaXMuZC52YWx1ZSA9IChkXyA8PCAxKTsKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCnVwZGF0ZURfZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MjYKICAgIC8vIGRfICs9IHRoaXMuY2JydChwMSAtIHAzKTsKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICBiLQogICAgY2FsbHN1YiBjYnJ0CiAgICBmcmFtZV9kaWcgMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICBiIHVwZGF0ZURfYWZ0ZXJfaWZfZWxzZUAzCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6OlBvb2wudG9TeXN0ZW1QcmVjaXNpb24oYW1vdW50OiB1aW50NjQpIC0+IHVpbnQ2NDoKdG9TeXN0ZW1QcmVjaXNpb246CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MzEKICAgIC8vIHByaXZhdGUgdG9TeXN0ZW1QcmVjaXNpb24oYW1vdW50OiB1aW50NjQpOiB1aW50NjQgewogICAgcHJvdG8gMSAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0OAogICAgLy8gcHJpdmF0ZSB0b2tlbkFtb3VudFJlZHVjZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAyMyAvLyAidG9rZW5BbW91bnRSZWR1Y2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ5CiAgICAvLyBwcml2YXRlIHRva2VuQW1vdW50SW5jcmVhc2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjQgLy8gInRva2VuQW1vdW50SW5jcmVhc2UiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDM1CiAgICAvLyBpZiAodG9rZW5BbW91bnRSZWR1Y2UgPiAwKSB7CiAgICBieiB0b1N5c3RlbVByZWNpc2lvbl9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDM2CiAgICAvLyByZXR1cm4gYW1vdW50IC8gdG9rZW5BbW91bnRSZWR1Y2U7CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyAwCiAgICAvCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKdG9TeXN0ZW1QcmVjaXNpb25fZWxzZV9ib2R5QDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0MzcKICAgIC8vIH0gZWxzZSBpZiAodG9rZW5BbW91bnRJbmNyZWFzZSA+IDApIHsKICAgIGZyYW1lX2RpZyAxCiAgICBieiB0b1N5c3RlbVByZWNpc2lvbl9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQzOAogICAgLy8gcmV0dXJuIGFtb3VudCAqIHRva2VuQW1vdW50SW5jcmVhc2U7CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyAxCiAgICAqCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKdG9TeXN0ZW1QcmVjaXNpb25fYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDQwCiAgICAvLyByZXR1cm4gYW1vdW50OwogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLmZyb21TeXN0ZW1QcmVjaXNpb24oYW1vdW50OiB1aW50NjQpIC0+IHVpbnQ2NDoKZnJvbVN5c3RlbVByZWNpc2lvbjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ0MwogICAgLy8gcHJpdmF0ZSBmcm9tU3lzdGVtUHJlY2lzaW9uKGFtb3VudDogdWludDY0KTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDgKICAgIC8vIHByaXZhdGUgdG9rZW5BbW91bnRSZWR1Y2UgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMjMgLy8gInRva2VuQW1vdW50UmVkdWNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0OQogICAgLy8gcHJpdmF0ZSB0b2tlbkFtb3VudEluY3JlYXNlID0gR2xvYmFsU3RhdGU8dWludDY0PigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDI0IC8vICJ0b2tlbkFtb3VudEluY3JlYXNlIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ0NwogICAgLy8gaWYgKHRva2VuQW1vdW50UmVkdWNlID4gMCkgewogICAgYnogZnJvbVN5c3RlbVByZWNpc2lvbl9lbHNlX2JvZHlAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDQ4CiAgICAvLyByZXR1cm4gYW1vdW50ICogdG9rZW5BbW91bnRSZWR1Y2U7CiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyAwCiAgICAqCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZnJvbVN5c3RlbVByZWNpc2lvbl9lbHNlX2JvZHlAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ0OQogICAgLy8gfSBlbHNlIGlmICh0b2tlbkFtb3VudEluY3JlYXNlID4gMCkgewogICAgZnJhbWVfZGlnIDEKICAgIGJ6IGZyb21TeXN0ZW1QcmVjaXNpb25fYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NTAKICAgIC8vIHJldHVybiBhbW91bnQgLyB0b2tlbkFtb3VudEluY3JlYXNlOwogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgMQogICAgLwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmZyb21TeXN0ZW1QcmVjaXNpb25fYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDUyCiAgICAvLyByZXR1cm4gYW1vdW50OwogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjpQb29sLnNxcnQobjogYnl0ZXMpIC0+IGJ5dGVzOgpzcXJ0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDU1CiAgICAvLyBwcml2YXRlIHNxcnQobjogYmlndWludCk6IGJpZ3VpbnQgewogICAgcHJvdG8gMSAxCiAgICBpbnRjXzAgLy8gMAogICAgZHVwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NTYKICAgIC8vIGFzc2VydChuID4gMG4sICduIG11c3QgYmUgbm9uLW5lZ2F0aXZlJyk7CiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hieXRlcyAweAogICAgYj4KICAgIGFzc2VydCAvLyBuIG11c3QgYmUgbm9uLW5lZ2F0aXZlCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NTcKICAgIC8vIGlmIChuID09PSAwbikgcmV0dXJuIDBuOwogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoYnl0ZXMgMHgKICAgIGI9PQogICAgYnogc3FydF9hZnRlcl9pZl9lbHNlQDIKICAgIHB1c2hieXRlcyAweAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCnNxcnRfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDU4CiAgICAvLyBpZiAobiA8PSAzbikgcmV0dXJuIDFuOwogICAgZnJhbWVfZGlnIC0xCiAgICBieXRlYyAyNiAvLyAweDAzCiAgICBiPD0KICAgIGJ6IHNxcnRfYWZ0ZXJfaWZfZWxzZUA0CiAgICBieXRlYyAxMCAvLyAweDAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKc3FydF9hZnRlcl9pZl9lbHNlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NjEKICAgIC8vIGNvbnN0IGJsID0gYml0TGVuZ3RoKEJ5dGVzKG4pKTsKICAgIGZyYW1lX2RpZyAtMQogICAgYml0bGVuCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NjIKICAgIC8vIGxldCB3aWRlID0gZXhwdygyLCAoYmwgKyAxKSAvIDIpOwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIHB1c2hpbnQgMiAvLyAyCiAgICAvCiAgICBwdXNoaW50IDIgLy8gMgogICAgc3dhcAogICAgZXhwdwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDYzCiAgICAvLyBjb25zdCBoaSA9IEJpZ1VpbnQod2lkZVswXSk7CiAgICBzd2FwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NjQKICAgIC8vIGNvbnN0IGxvID0gQmlnVWludCh3aWRlWzFdKTsKICAgIHN3YXAKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ2NQogICAgLy8gbGV0IHg6IGJpZ3VpbnQgPSBoaSAqIFNISUZUNjQgKyBsbzsKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjIyCiAgICAvLyBjb25zdCBTSElGVDY0OiBiaWd1aW50ID0gMTg0NDY3NDQwNzM3MDk1NTE2MTZuOyAvLyAyXjY0CiAgICBieXRlYyAyNyAvLyAweDAxMDAwMDAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDY1CiAgICAvLyBsZXQgeDogYmlndWludCA9IGhpICogU0hJRlQ2NCArIGxvOwogICAgYioKICAgIGIrCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDY4CiAgICAvLyBsZXQgeTogYmlndWludCA9ICh4ICsgbiAvIHgpIC8gMm47CiAgICBmcmFtZV9kaWcgLTEKICAgIGRpZyAxCiAgICBiLwogICAgYisKICAgIGJ5dGVjIDE3IC8vIDB4MDIKICAgIGIvCiAgICBmcmFtZV9idXJ5IDEKCnNxcnRfd2hpbGVfdG9wQDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NjkKICAgIC8vIHdoaWxlICh5IDwgeCkgewogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAwCiAgICBiPAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDY5LTQ3MgogICAgLy8gd2hpbGUgKHkgPCB4KSB7CiAgICAvLyAgIHggPSB5OwogICAgLy8gICB5ID0gKHggKyBuIC8geCkgLyAybjsKICAgIC8vIH0KICAgIGJ6IHNxcnRfYWZ0ZXJfd2hpbGVANwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDcxCiAgICAvLyB5ID0gKHggKyBuIC8geCkgLyAybjsKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgYi8KICAgIGRpZyAxCiAgICBiKwogICAgYnl0ZWMgMTcgLy8gMHgwMgogICAgYi8KICAgIGZyYW1lX2J1cnkgMQogICAgZnJhbWVfYnVyeSAwCiAgICBiIHNxcnRfd2hpbGVfdG9wQDUKCnNxcnRfYWZ0ZXJfd2hpbGVANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ3MwogICAgLy8gcmV0dXJuIHg7CiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo6UG9vbC5jYnJ0KG46IGJ5dGVzKSAtPiB1aW50NjQ6CmNicnQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NzYKICAgIC8vIHByaXZhdGUgY2JydChuOiBiaWd1aW50KTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgaW50Y18wIC8vIDAKICAgIGR1cG4gMwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDc3CiAgICAvLyBpZiAobiA9PT0gMG4pIHJldHVybiAwOwogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoYnl0ZXMgMHgKICAgIGI9PQogICAgYnogY2JydF9hZnRlcl9pZl9lbHNlQDIKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKY2JydF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0NzgKICAgIC8vIGlmIChuIDwgOG4pIHJldHVybiAxOwogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoYnl0ZXMgMHgwOAogICAgYjwKICAgIGJ6IGNicnRfYWZ0ZXJfaWZfZWxzZUA0CiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmNicnRfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDgxCiAgICAvLyBjb25zdCBibCA9IGJpdExlbmd0aChCeXRlcyhuKSk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGJpdGxlbgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDgyCiAgICAvLyBsZXQgd2lkZSA9IGV4cHcoMiwgKGJsICsgMikgLyAzKTsKICAgIHB1c2hpbnQgMiAvLyAyCiAgICArCiAgICBwdXNoaW50IDMgLy8gMwogICAgLwogICAgcHVzaGludCAyIC8vIDIKICAgIHN3YXAKICAgIGV4cHcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ4MwogICAgLy8gY29uc3QgaGkgPSBCaWdVaW50KHdpZGVbMF0pOwogICAgc3dhcAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDg0CiAgICAvLyBjb25zdCBsbyA9IEJpZ1VpbnQod2lkZVsxXSk7CiAgICBzd2FwCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0ODUKICAgIC8vIGxldCB4OiBiaWd1aW50ID0gaGkgKiBTSElGVDY0ICsgbG87CiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czoyMgogICAgLy8gY29uc3QgU0hJRlQ2NDogYmlndWludCA9IDE4NDQ2NzQ0MDczNzA5NTUxNjE2bjsgLy8gMl42NAogICAgYnl0ZWMgMjcgLy8gMHgwMTAwMDAwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjQ4NQogICAgLy8gbGV0IHg6IGJpZ3VpbnQgPSBoaSAqIFNISUZUNjQgKyBsbzsKICAgIGIqCiAgICBiKwogICAgZnJhbWVfYnVyeSAxCgpjYnJ0X3doaWxlX3RvcEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9wb29sLmNvbnRyYWN0LmFsZ28udHM6NDg5CiAgICAvLyBjb25zdCB4MjogYmlndWludCA9IHggKiB4OwogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgYioKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0OTAKICAgIC8vIGlmICh4MiA9PT0gMG4pIGJyZWFrOyAvLyBzaG91bGQgbm90IGhhcHBlbiBmb3IgeD4wCiAgICBwdXNoYnl0ZXMgMHgKICAgIGI9PQogICAgYm56IGNicnRfd2hpbGVfdG9wQDE0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0OTEKICAgIC8vIGNvbnN0IG5leHQ6IGJpZ3VpbnQgPSAoMm4gKiB4ICsgbiAvIHgyKSAvIDNuOwogICAgYnl0ZWMgMTcgLy8gMHgwMgogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgYioKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDMKICAgIGIvCiAgICBiKwogICAgYnl0ZWMgMjYgLy8gMHgwMwogICAgYi8KICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo0OTIKICAgIC8vIGlmIChuZXh0ID09PSB4IHx8IG5leHQgPT09IHggLSAxbikgewogICAgYj09CiAgICBibnogY2JydF9pZl9ib2R5QDEwCiAgICBmcmFtZV9kaWcgMQogICAgYnl0ZWMgMTAgLy8gMHgwMQogICAgYi0KICAgIGZyYW1lX2RpZyAwCiAgICBiPT0KICAgIGJ6IGNicnRfYWZ0ZXJfaWZfZWxzZUAxMQoKY2JydF9pZl9ib2R5QDEwOgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2J1cnkgMQoKY2JydF93aGlsZV90b3BAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Bvb2wuY29udHJhY3QuYWxnby50czo1MDAKICAgIC8vIHdoaWxlICgoeCArIDFuKSAqICh4ICsgMW4pICogKHggKyAxbikgPD0gbikgeCArPSAxbjsKICAgIGZyYW1lX2RpZyAxCiAgICBieXRlYyAxMCAvLyAweDAxCiAgICBiKwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIKICAgIGR1cAogICAgZGlnIDEKICAgIGIqCiAgICBiKgogICAgZnJhbWVfZGlnIC0xCiAgICBiPD0KICAgIGJ6IGNicnRfd2hpbGVfdG9wQDE3CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfYnVyeSAxCiAgICBiIGNicnRfd2hpbGVfdG9wQDE0CgpjYnJ0X3doaWxlX3RvcEAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjUwMQogICAgLy8gd2hpbGUgKHggKiB4ICogeCA+IG4pIHggLT0gMW47CiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICBkaWcgMQogICAgYioKICAgIGIqCiAgICBmcmFtZV9kaWcgLTEKICAgIGI+CiAgICBieiBjYnJ0X2FmdGVyX3doaWxlQDE5CiAgICBmcmFtZV9kaWcgMQogICAgYnl0ZWMgMTAgLy8gMHgwMQogICAgYi0KICAgIGZyYW1lX2J1cnkgMQogICAgYiBjYnJ0X3doaWxlX3RvcEAxNwoKY2JydF9hZnRlcl93aGlsZUAxOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcG9vbC5jb250cmFjdC5hbGdvLnRzOjUwMgogICAgLy8gcmV0dXJuIGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbyh4KTsKICAgIGZyYW1lX2RpZyAxCiAgICBjYWxsc3ViIGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbwogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmNicnRfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgY2JydF93aGlsZV90b3BANQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo6UmV3YXJkTWFuYWdlci5jbGFpbVJld2FyZHMoKSAtPiB2b2lkOgpjbGFpbVJld2FyZHM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NTAtNTEKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gY2xhaW1SZXdhcmRzKCk6IHZvaWQgewogICAgcHJvdG8gMCAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjUyCiAgICAvLyBjb25zdCB1c2VyID0gVHhuLnNlbmRlcjsKICAgIHR4biBTZW5kZXIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjUzCiAgICAvLyBjb25zdCB1c2VyTHBBbW91bnQgPSB0aGlzLmJhbGFuY2UodXNlcikudmFsdWU7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjMzCiAgICAvLyBiYWxhbmNlID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBieXRlYyA0IC8vICJiYWxhbmNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjUzCiAgICAvLyBjb25zdCB1c2VyTHBBbW91bnQgPSB0aGlzLmJhbGFuY2UodXNlcikudmFsdWU7CiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIExvY2FsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NTQKICAgIC8vIGlmICh1c2VyTHBBbW91bnQgPiAwKSB7CiAgICBieiBjbGFpbVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NTUKICAgIC8vIGNvbnN0IHJld2FyZHMgPSBiaWd1aW50VG9VaW50NjRNb2R1bG8oQmlnVWludCh1c2VyTHBBbW91bnQpICogdGhpcy5hY2NSZXdhcmRQZXJTaGFyZVAudmFsdWUgLyBQX1NDQUxFKTsKICAgIGZyYW1lX2RpZyAzCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzAKICAgIC8vIGFjY1Jld2FyZFBlclNoYXJlUCA9IEdsb2JhbFN0YXRlPGJpZ3VpbnQ+KHsgaW5pdGlhbFZhbHVlOiAwbiB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vICJhY2NSZXdhcmRQZXJTaGFyZVAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjU1CiAgICAvLyBjb25zdCByZXdhcmRzID0gYmlndWludFRvVWludDY0TW9kdWxvKEJpZ1VpbnQodXNlckxwQW1vdW50KSAqIHRoaXMuYWNjUmV3YXJkUGVyU2hhcmVQLnZhbHVlIC8gUF9TQ0FMRSk7CiAgICBiKgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjIwCiAgICAvLyBjb25zdCBQX1NDQUxFOiBiaWd1aW50ID0gQmlnVWludCgxIDw8IFApOwogICAgYnl0ZWMgOSAvLyAweDAxMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NTUKICAgIC8vIGNvbnN0IHJld2FyZHMgPSBiaWd1aW50VG9VaW50NjRNb2R1bG8oQmlnVWludCh1c2VyTHBBbW91bnQpICogdGhpcy5hY2NSZXdhcmRQZXJTaGFyZVAudmFsdWUgLyBQX1NDQUxFKTsKICAgIGIvCiAgICBjYWxsc3ViIGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo1NgogICAgLy8gY29uc3QgcGVuZGluZzogdWludDY0ID0gcmV3YXJkcyAtIHRoaXMudXNlclJld2FyZERlYnQodXNlcikudmFsdWU7CiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czozNAogICAgLy8gdXNlclJld2FyZERlYnQgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDUgLy8gInVzZXJSZXdhcmREZWJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjU2CiAgICAvLyBjb25zdCBwZW5kaW5nOiB1aW50NjQgPSByZXdhcmRzIC0gdGhpcy51c2VyUmV3YXJkRGVidCh1c2VyKS52YWx1ZTsKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBMb2NhbFN0YXRlIGV4aXN0cwogICAgLQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo1NwogICAgLy8gaWYgKHBlbmRpbmcgPiAwKSB7CiAgICBieiBjbGFpbVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NTgKICAgIC8vIHRoaXMudXNlclJld2FyZERlYnQodXNlcikudmFsdWUgPSByZXdhcmRzOwogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjM0CiAgICAvLyB1c2VyUmV3YXJkRGVidCA9IExvY2FsU3RhdGU8dWludDY0PigpOwogICAgYnl0ZWMgNSAvLyAidXNlclJld2FyZERlYnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NTgKICAgIC8vIHRoaXMudXNlclJld2FyZERlYnQodXNlcikudmFsdWUgPSByZXdhcmRzOwogICAgZnJhbWVfZGlnIDEKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo1OQogICAgLy8gYXNzZXRUcmFuc2Zlcih7IHhmZXJBc3NldDogdGhpcy5hc3NldC52YWx1ZSwgYXNzZXRBbW91bnQ6IHBlbmRpbmcsIGFzc2V0UmVjZWl2ZXI6IHVzZXIgfSkuc3VibWl0KCk7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MjcKICAgIC8vIGFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiYXNzZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZGlnIDEKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgY292ZXIgMgogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo1OQogICAgLy8gYXNzZXRUcmFuc2Zlcih7IHhmZXJBc3NldDogdGhpcy5hc3NldC52YWx1ZSwgYXNzZXRBbW91bnQ6IHBlbmRpbmcsIGFzc2V0UmVjZWl2ZXI6IHVzZXIgfSkuc3VibWl0KCk7CiAgICBpbnRjXzMgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjYwCiAgICAvLyBlbWl0PFJld2FyZHNDbGFpbWVkPih7IHVzZXI6IG5ldyBBZGRyZXNzKHVzZXIpLCBwZW5kaW5nIH0pOwogICAgaXRvYgogICAgY29uY2F0CiAgICBieXRlYyAyNSAvLyBtZXRob2QgIlJld2FyZHNDbGFpbWVkKGFkZHJlc3MsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCgpjbGFpbVJld2FyZHNfYWZ0ZXJfaWZfZWxzZUA1OgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjpSZXdhcmRNYW5hZ2VyLnNldEFkbWluRmVlU2hhcmUoYWRtaW5GZWVTaGFyZUJQOiB1aW50NjQpIC0+IHZvaWQ6CnNldEFkbWluRmVlU2hhcmU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NjUtNjYKICAgIC8vIEBhYmltZXRob2QoKQogICAgLy8gc2V0QWRtaW5GZWVTaGFyZShhZG1pbkZlZVNoYXJlQlA6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NjcKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjY4CiAgICAvLyBhc3NlcnQoYWRtaW5GZWVTaGFyZUJQIDw9IEJQLCAnUmV3YXJkTWFuYWdlcjogdG9vIGhpZ2gnKTsKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjE5CiAgICAvLyBleHBvcnQgY29uc3QgQlA6IHVpbnQ2NCA9IDEwXzAwMDsKICAgIGludGMgNCAvLyAxMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjY4CiAgICAvLyBhc3NlcnQoYWRtaW5GZWVTaGFyZUJQIDw9IEJQLCAnUmV3YXJkTWFuYWdlcjogdG9vIGhpZ2gnKTsKICAgIDw9CiAgICBhc3NlcnQgLy8gUmV3YXJkTWFuYWdlcjogdG9vIGhpZ2gKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyOAogICAgLy8gYWRtaW5GZWVTaGFyZUJQID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogQlAgLyA1IH0pOyAvLyBEZWZhdWx0IGFkbWluIGZlZSBpcyAyMCUKICAgIGJ5dGVjIDE4IC8vICJhZG1pbkZlZVNoYXJlQlAiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6NjkKICAgIC8vIHRoaXMuYWRtaW5GZWVTaGFyZUJQLnZhbHVlID0gYWRtaW5GZWVTaGFyZUJQOwogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjpSZXdhcmRNYW5hZ2VyLmNsYWltQWRtaW5GZWUoKSAtPiB2b2lkOgpjbGFpbUFkbWluRmVlOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjcyLTczCiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIC8vIGNsYWltQWRtaW5GZWUoKTogdm9pZCB7CiAgICBwcm90byAwIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo3NAogICAgLy8gdGhpcy5vbmx5T3duZXIoKTsKICAgIGNhbGxzdWIgb25seU93bmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzEKICAgIC8vIGFkbWluRmVlQW1vdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAiYWRtaW5GZWVBbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgc3dhcAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo3NgogICAgLy8gaWYgKGFkbWluRmVlQW1vdW50ID4gMCkgewogICAgYnogY2xhaW1BZG1pbkZlZV9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo3Ny04MQogICAgLy8gYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIHhmZXJBc3NldDogdGhpcy5hc3NldC52YWx1ZSwKICAgIC8vICAgYXNzZXRBbW91bnQ6IGFkbWluRmVlQW1vdW50LAogICAgLy8gICBhc3NldFJlY2VpdmVyOiB0aGlzLm93bmVyLnZhbHVlLmJ5dGVzLAogICAgLy8gfSkuc3VibWl0KCk7CiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MjcKICAgIC8vIGFzc2V0ID0gR2xvYmFsU3RhdGU8QXNzZXQ+KCk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiYXNzZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6NgogICAgLy8gcHJvdGVjdGVkIG93bmVyID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxNCAvLyAib3duZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBmcmFtZV9kaWcgMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo3Ny04MQogICAgLy8gYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgIHhmZXJBc3NldDogdGhpcy5hc3NldC52YWx1ZSwKICAgIC8vICAgYXNzZXRBbW91bnQ6IGFkbWluRmVlQW1vdW50LAogICAgLy8gICBhc3NldFJlY2VpdmVyOiB0aGlzLm93bmVyLnZhbHVlLmJ5dGVzLAogICAgLy8gfSkuc3VibWl0KCk7CiAgICBpbnRjXzMgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjMxCiAgICAvLyBhZG1pbkZlZUFtb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAgfSk7CiAgICBieXRlYyAxMSAvLyAiYWRtaW5GZWVBbW91bnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6ODIKICAgIC8vIHRoaXMuYWRtaW5GZWVBbW91bnQudmFsdWUgPSAwOwogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgpjbGFpbUFkbWluRmVlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo6UmV3YXJkTWFuYWdlci5wZW5kaW5nUmV3YXJkKHVzZXI6IGJ5dGVzKSAtPiB1aW50NjQ6CnBlbmRpbmdSZXdhcmQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6ODYtODcKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgLy8gcGVuZGluZ1Jld2FyZCh1c2VyOiBBY2NvdW50KTogdWludDY0IHsKICAgIHByb3RvIDEgMQogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjg4CiAgICAvLyByZXR1cm4gYmlndWludFRvVWludDY0TW9kdWxvKChCaWdVaW50KHRoaXMuYmFsYW5jZSh1c2VyKS52YWx1ZSkgKiB0aGlzLmFjY1Jld2FyZFBlclNoYXJlUC52YWx1ZSkgLyBQX1NDQUxFKSAtIHRoaXMudXNlclJld2FyZERlYnQodXNlcikudmFsdWU7CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzMKICAgIC8vIGJhbGFuY2UgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDQgLy8gImJhbGFuY2UiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6ODgKICAgIC8vIHJldHVybiBiaWd1aW50VG9VaW50NjRNb2R1bG8oKEJpZ1VpbnQodGhpcy5iYWxhbmNlKHVzZXIpLnZhbHVlKSAqIHRoaXMuYWNjUmV3YXJkUGVyU2hhcmVQLnZhbHVlKSAvIFBfU0NBTEUpIC0gdGhpcy51c2VyUmV3YXJkRGVidCh1c2VyKS52YWx1ZTsKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBMb2NhbFN0YXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjMwCiAgICAvLyBhY2NSZXdhcmRQZXJTaGFyZVAgPSBHbG9iYWxTdGF0ZTxiaWd1aW50Pih7IGluaXRpYWxWYWx1ZTogMG4gfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAiYWNjUmV3YXJkUGVyU2hhcmVQIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo4OAogICAgLy8gcmV0dXJuIGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbygoQmlnVWludCh0aGlzLmJhbGFuY2UodXNlcikudmFsdWUpICogdGhpcy5hY2NSZXdhcmRQZXJTaGFyZVAudmFsdWUpIC8gUF9TQ0FMRSkgLSB0aGlzLnVzZXJSZXdhcmREZWJ0KHVzZXIpLnZhbHVlOwogICAgYioKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyMAogICAgLy8gY29uc3QgUF9TQ0FMRTogYmlndWludCA9IEJpZ1VpbnQoMSA8PCBQKTsKICAgIGJ5dGVjIDkgLy8gMHgwMTAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjg4CiAgICAvLyByZXR1cm4gYmlndWludFRvVWludDY0TW9kdWxvKChCaWdVaW50KHRoaXMuYmFsYW5jZSh1c2VyKS52YWx1ZSkgKiB0aGlzLmFjY1Jld2FyZFBlclNoYXJlUC52YWx1ZSkgLyBQX1NDQUxFKSAtIHRoaXMudXNlclJld2FyZERlYnQodXNlcikudmFsdWU7CiAgICBiLwogICAgY2FsbHN1YiBiaWd1aW50VG9VaW50NjRNb2R1bG8KICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czozNAogICAgLy8gdXNlclJld2FyZERlYnQgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDUgLy8gInVzZXJSZXdhcmREZWJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjg4CiAgICAvLyByZXR1cm4gYmlndWludFRvVWludDY0TW9kdWxvKChCaWdVaW50KHRoaXMuYmFsYW5jZSh1c2VyKS52YWx1ZSkgKiB0aGlzLmFjY1Jld2FyZFBlclNoYXJlUC52YWx1ZSkgLyBQX1NDQUxFKSAtIHRoaXMudXNlclJld2FyZERlYnQodXNlcikudmFsdWU7CiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgTG9jYWxTdGF0ZSBleGlzdHMKICAgIC0KICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czo6UmV3YXJkTWFuYWdlci5hZGRSZXdhcmRzKHJld2FyZEFtb3VudDogdWludDY0KSAtPiB2b2lkOgphZGRSZXdhcmRzOgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjk2CiAgICAvLyBwcm90ZWN0ZWQgYWRkUmV3YXJkcyhyZXdhcmRBbW91bnQ6IHVpbnQ2NCk6IHZvaWQgewogICAgcHJvdG8gMSAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MjkKICAgIC8vIHRvdGFsU3VwcGx5ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJ0b3RhbFN1cHBseSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjk4CiAgICAvLyBpZiAodG90YWxTdXBwbHkgPiAwKSB7CiAgICBieiBhZGRSZXdhcmRzX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjI4CiAgICAvLyBhZG1pbkZlZVNoYXJlQlAgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiBCUCAvIDUgfSk7IC8vIERlZmF1bHQgYWRtaW4gZmVlIGlzIDIwJQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE4IC8vICJhZG1pbkZlZVNoYXJlQlAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjk5CiAgICAvLyBjb25zdCBhZG1pbkZlZVJld2FyZHM6IHVpbnQ2NCA9IChyZXdhcmRBbW91bnQgKiB0aGlzLmFkbWluRmVlU2hhcmVCUC52YWx1ZSkgLyBCUDsKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjE5CiAgICAvLyBleHBvcnQgY29uc3QgQlA6IHVpbnQ2NCA9IDEwXzAwMDsKICAgIGludGMgNCAvLyAxMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjk5CiAgICAvLyBjb25zdCBhZG1pbkZlZVJld2FyZHM6IHVpbnQ2NCA9IChyZXdhcmRBbW91bnQgKiB0aGlzLmFkbWluRmVlU2hhcmVCUC52YWx1ZSkgLyBCUDsKICAgIC8KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMDAKICAgIC8vIHJld2FyZEFtb3VudCAtPSBhZG1pbkZlZVJld2FyZHM7CiAgICBmcmFtZV9kaWcgLTEKICAgIGRpZyAxCiAgICAtCiAgICBmcmFtZV9idXJ5IC0xCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzAKICAgIC8vIGFjY1Jld2FyZFBlclNoYXJlUCA9IEdsb2JhbFN0YXRlPGJpZ3VpbnQ+KHsgaW5pdGlhbFZhbHVlOiAwbiB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vICJhY2NSZXdhcmRQZXJTaGFyZVAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEwMQogICAgLy8gdGhpcy5hY2NSZXdhcmRQZXJTaGFyZVAudmFsdWUgKz0gQmlnVWludChyZXdhcmRBbW91bnQpICogUF9TQ0FMRSAvIEJpZ1VpbnQodG90YWxTdXBwbHkpOwogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MjAKICAgIC8vIGNvbnN0IFBfU0NBTEU6IGJpZ3VpbnQgPSBCaWdVaW50KDEgPDwgUCk7CiAgICBieXRlYyA5IC8vIDB4MDEwMDAwMDAwMDAwMDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMDEKICAgIC8vIHRoaXMuYWNjUmV3YXJkUGVyU2hhcmVQLnZhbHVlICs9IEJpZ1VpbnQocmV3YXJkQW1vdW50KSAqIFBfU0NBTEUgLyBCaWdVaW50KHRvdGFsU3VwcGx5KTsKICAgIGIqCiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgYi8KICAgIGIrCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzAKICAgIC8vIGFjY1Jld2FyZFBlclNoYXJlUCA9IEdsb2JhbFN0YXRlPGJpZ3VpbnQ+KHsgaW5pdGlhbFZhbHVlOiAwbiB9KTsKICAgIGJ5dGVjIDggLy8gImFjY1Jld2FyZFBlclNoYXJlUCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMDEKICAgIC8vIHRoaXMuYWNjUmV3YXJkUGVyU2hhcmVQLnZhbHVlICs9IEJpZ1VpbnQocmV3YXJkQW1vdW50KSAqIFBfU0NBTEUgLyBCaWdVaW50KHRvdGFsU3VwcGx5KTsKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzEKICAgIC8vIGFkbWluRmVlQW1vdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMSAvLyAiYWRtaW5GZWVBbW91bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEwMgogICAgLy8gdGhpcy5hZG1pbkZlZUFtb3VudC52YWx1ZSArPSBhZG1pbkZlZVJld2FyZHM7CiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzEKICAgIC8vIGFkbWluRmVlQW1vdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCB9KTsKICAgIGJ5dGVjIDExIC8vICJhZG1pbkZlZUFtb3VudCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMDIKICAgIC8vIHRoaXMuYWRtaW5GZWVBbW91bnQudmFsdWUgKz0gYWRtaW5GZWVSZXdhcmRzOwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmFkZFJld2FyZHNfYWZ0ZXJfaWZfZWxzZUAyOgogICAgcmV0c3ViCgoKLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjpSZXdhcmRNYW5hZ2VyLmRlcG9zaXRMcCh0bzogYnl0ZXMsIGxwQW1vdW50OiB1aW50NjQpIC0+IHZvaWQ6CmRlcG9zaXRMcDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMDYKICAgIC8vIHByb3RlY3RlZCBkZXBvc2l0THAodG86IEFjY291bnQsIGxwQW1vdW50OiB1aW50NjQpOiB2b2lkIHsKICAgIHByb3RvIDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjMwCiAgICAvLyBhY2NSZXdhcmRQZXJTaGFyZVAgPSBHbG9iYWxTdGF0ZTxiaWd1aW50Pih7IGluaXRpYWxWYWx1ZTogMG4gfSk7CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgOCAvLyAiYWNjUmV3YXJkUGVyU2hhcmVQIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMDgKICAgIC8vIGxldCBwZW5kaW5nOiB1aW50NjQgPSAwOwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMDkKICAgIC8vIGxldCB1c2VyTHBBbW91bnQgPSB0aGlzLmJhbGFuY2UodG8pLnZhbHVlOwogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjMzCiAgICAvLyBiYWxhbmNlID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBieXRlYyA0IC8vICJiYWxhbmNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEwOQogICAgLy8gbGV0IHVzZXJMcEFtb3VudCA9IHRoaXMuYmFsYW5jZSh0bykudmFsdWU7CiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIExvY2FsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTEwCiAgICAvLyBpZiAodXNlckxwQW1vdW50ID4gMCkgewogICAgYnogZGVwb3NpdExwX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjExMQogICAgLy8gcGVuZGluZyA9IGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbyhCaWdVaW50KHVzZXJMcEFtb3VudCkgKiBhY2NSZXdhcmRQZXJTaGFyZVAgLyBQX1NDQUxFKSAtIHRoaXMudXNlclJld2FyZERlYnQodG8pLnZhbHVlOwogICAgZnJhbWVfZGlnIDIKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAwCiAgICBiKgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjIwCiAgICAvLyBjb25zdCBQX1NDQUxFOiBiaWd1aW50ID0gQmlnVWludCgxIDw8IFApOwogICAgYnl0ZWMgOSAvLyAweDAxMDAwMDAwMDAwMDAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTExCiAgICAvLyBwZW5kaW5nID0gYmlndWludFRvVWludDY0TW9kdWxvKEJpZ1VpbnQodXNlckxwQW1vdW50KSAqIGFjY1Jld2FyZFBlclNoYXJlUCAvIFBfU0NBTEUpIC0gdGhpcy51c2VyUmV3YXJkRGVidCh0bykudmFsdWU7CiAgICBiLwogICAgY2FsbHN1YiBiaWd1aW50VG9VaW50NjRNb2R1bG8KICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czozNAogICAgLy8gdXNlclJld2FyZERlYnQgPSBMb2NhbFN0YXRlPHVpbnQ2ND4oKTsKICAgIGJ5dGVjIDUgLy8gInVzZXJSZXdhcmREZWJ0IgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjExMQogICAgLy8gcGVuZGluZyA9IGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbyhCaWdVaW50KHVzZXJMcEFtb3VudCkgKiBhY2NSZXdhcmRQZXJTaGFyZVAgLyBQX1NDQUxFKSAtIHRoaXMudXNlclJld2FyZERlYnQodG8pLnZhbHVlOwogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIExvY2FsU3RhdGUgZXhpc3RzCiAgICAtCiAgICBmcmFtZV9idXJ5IDEKCmRlcG9zaXRMcF9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTEzCiAgICAvLyB1c2VyTHBBbW91bnQgKz0gbHBBbW91bnQ7CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTE0CiAgICAvLyB0aGlzLmJhbGFuY2UodG8pLnZhbHVlICs9IGxwQW1vdW50OwogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjMzCiAgICAvLyBiYWxhbmNlID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBieXRlYyA0IC8vICJiYWxhbmNlIgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjExNAogICAgLy8gdGhpcy5iYWxhbmNlKHRvKS52YWx1ZSArPSBscEFtb3VudDsKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBMb2NhbFN0YXRlIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBmcmFtZV9kaWcgLTIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czozMwogICAgLy8gYmFsYW5jZSA9IExvY2FsU3RhdGU8dWludDY0PigpOwogICAgYnl0ZWMgNCAvLyAiYmFsYW5jZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMTQKICAgIC8vIHRoaXMuYmFsYW5jZSh0bykudmFsdWUgKz0gbHBBbW91bnQ7CiAgICB1bmNvdmVyIDIKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyOQogICAgLy8gdG90YWxTdXBwbHkgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gInRvdGFsU3VwcGx5IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMTUKICAgIC8vIHRoaXMudG90YWxTdXBwbHkudmFsdWUgKz0gbHBBbW91bnQ7CiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyOQogICAgLy8gdG90YWxTdXBwbHkgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwIH0pOwogICAgYnl0ZWMgNyAvLyAidG90YWxTdXBwbHkiCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTE1CiAgICAvLyB0aGlzLnRvdGFsU3VwcGx5LnZhbHVlICs9IGxwQW1vdW50OwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMTcKICAgIC8vIHRoaXMudXNlclJld2FyZERlYnQodG8pLnZhbHVlID0gYmlndWludFRvVWludDY0TW9kdWxvKChCaWdVaW50KHVzZXJMcEFtb3VudCkgKiBhY2NSZXdhcmRQZXJTaGFyZVApIC8gUF9TQ0FMRSk7CiAgICBpdG9iCiAgICBmcmFtZV9kaWcgMAogICAgYioKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyMAogICAgLy8gY29uc3QgUF9TQ0FMRTogYmlndWludCA9IEJpZ1VpbnQoMSA8PCBQKTsKICAgIGJ5dGVjIDkgLy8gMHgwMTAwMDAwMDAwMDAwMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjExNwogICAgLy8gdGhpcy51c2VyUmV3YXJkRGVidCh0bykudmFsdWUgPSBiaWd1aW50VG9VaW50NjRNb2R1bG8oKEJpZ1VpbnQodXNlckxwQW1vdW50KSAqIGFjY1Jld2FyZFBlclNoYXJlUCkgLyBQX1NDQUxFKTsKICAgIGIvCiAgICBjYWxsc3ViIGJpZ3VpbnRUb1VpbnQ2NE1vZHVsbwogICAgZnJhbWVfZGlnIC0yCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MzQKICAgIC8vIHVzZXJSZXdhcmREZWJ0ID0gTG9jYWxTdGF0ZTx1aW50NjQ+KCk7CiAgICBieXRlYyA1IC8vICJ1c2VyUmV3YXJkRGVidCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMTcKICAgIC8vIHRoaXMudXNlclJld2FyZERlYnQodG8pLnZhbHVlID0gYmlndWludFRvVWludDY0TW9kdWxvKChCaWdVaW50KHVzZXJMcEFtb3VudCkgKiBhY2NSZXdhcmRQZXJTaGFyZVApIC8gUF9TQ0FMRSk7CiAgICB1bmNvdmVyIDIKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMTgKICAgIC8vIGlmIChwZW5kaW5nID4gMCkgewogICAgZnJhbWVfZGlnIDEKICAgIGJ6IGRlcG9zaXRMcF9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMTkKICAgIC8vIGFzc2V0VHJhbnNmZXIoeyB4ZmVyQXNzZXQ6IHRoaXMuYXNzZXQudmFsdWUsIGFzc2V0QW1vdW50OiBwZW5kaW5nLCBhc3NldFJlY2VpdmVyOiB0byB9KS5zdWJtaXQoKTsKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoyNwogICAgLy8gYXNzZXQgPSBHbG9iYWxTdGF0ZTxBc3NldD4oKTsKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJhc3NldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTIKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvcmV3YXJkLW1hbmFnZXIuYWxnby50czoxMTkKICAgIC8vIGFzc2V0VHJhbnNmZXIoeyB4ZmVyQXNzZXQ6IHRoaXMuYXNzZXQudmFsdWUsIGFzc2V0QW1vdW50OiBwZW5kaW5nLCBhc3NldFJlY2VpdmVyOiB0byB9KS5zdWJtaXQoKTsKICAgIGludGNfMyAvLyA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL3Jld2FyZC1tYW5hZ2VyLmFsZ28udHM6MTIwCiAgICAvLyBlbWl0PFJld2FyZHNDbGFpbWVkPih7IHVzZXI6IG5ldyBBZGRyZXNzKHRvKSwgcGVuZGluZyB9KTsKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAtMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyAyNSAvLyBtZXRob2QgIlJld2FyZHNDbGFpbWVkKGFkZHJlc3MsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCgpkZXBvc2l0THBfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9yZXdhcmQtbWFuYWdlci5hbGdvLnRzOjEyMgogICAgLy8gZW1pdDxEZXBvc2l0Pih7IHRvOiBuZXcgQWRkcmVzcyh0byksIGxwQW1vdW50IH0pOwogICAgZnJhbWVfZGlnIC0xCiAgICBpdG9iCiAgICBmcmFtZV9kaWcgLTIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4Y2ZhYjg3MjMgLy8gbWV0aG9kICJEZXBvc2l0KGFkZHJlc3MsdWludDY0KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czo6T3duYWJsZS5vbmx5T3duZXIoKSAtPiB2b2lkOgpvbmx5T3duZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czoxMwogICAgLy8gYXNzZXJ0KG9wLlR4bi5zZW5kZXIuYnl0ZXMgPT09IHRoaXMub3duZXIudmFsdWUuYnl0ZXMsICdPbmx5IG93bmVyJyk7CiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czo2CiAgICAvLyBwcm90ZWN0ZWQgb3duZXIgPSBHbG9iYWxTdGF0ZTxBZGRyZXNzPigpOwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDE0IC8vICJvd25lciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czoxMwogICAgLy8gYXNzZXJ0KG9wLlR4bi5zZW5kZXIuYnl0ZXMgPT09IHRoaXMub3duZXIudmFsdWUuYnl0ZXMsICdPbmx5IG93bmVyJyk7CiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgb3duZXIKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjpPd25hYmxlLnRyYW5zZmVyT3duZXJzaGlwKG5ld093bmVyOiBieXRlcykgLT4gdm9pZDoKdHJhbnNmZXJPd25lcnNoaXA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvY29udHJhY3RzL293bmFibGUuYWxnby50czoxNi0xNwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICAvLyBwdWJsaWMgdHJhbnNmZXJPd25lcnNoaXAobmV3T3duZXI6IEFkZHJlc3MpOiB2b2lkIHsKICAgIHByb3RvIDEgMAogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6MTgKICAgIC8vIHRoaXMub25seU93bmVyKCk7CiAgICBjYWxsc3ViIG9ubHlPd25lcgogICAgLy8gc21hcnRfY29udHJhY3RzL2NvbnRyYWN0cy9vd25hYmxlLmFsZ28udHM6NgogICAgLy8gcHJvdGVjdGVkIG93bmVyID0gR2xvYmFsU3RhdGU8QWRkcmVzcz4oKTsKICAgIGJ5dGVjIDE0IC8vICJvd25lciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9jb250cmFjdHMvb3duYWJsZS5hbGdvLnRzOjE5CiAgICAvLyB0aGlzLm93bmVyLnZhbHVlID0gbmV3T3duZXI7CiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIK",
|
|
422
|
-
clear: "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==",
|
|
423
|
-
},
|
|
424
|
-
byteCode: {
|
|
425
|
-
approval: "CiAFAAEIBJBOJhwMdG9rZW5CYWxhbmNlC3ZVc2RCYWxhbmNlBWFzc2V0CHJlc2VydmVzB2JhbGFuY2UOdXNlclJld2FyZERlYnQBZAt0b3RhbFN1cHBseRJhY2NSZXdhcmRQZXJTaGFyZVAHAQAAAAAAAAEBDmFkbWluRmVlQW1vdW50CmNhbkRlcG9zaXQLY2FuV2l0aGRyYXcFb3duZXIKZmVlU2hhcmVCUBFiYWxhbmNlUmF0aW9NaW5CUAECD2FkbWluRmVlU2hhcmVCUAQVH3x1AWEGcm91dGVyDXN0b3BBdXRob3JpdHkRdG9rZW5BbW91bnRSZWR1Y2UTdG9rZW5BbW91bnRJbmNyZWFzZQS6gYB2AQMJAQAAAAAAAAAAMRhAACgnEoHQD2cnByJnJwiAAGcnCyJnKCJnKSJnKyJnJwYiZycMI2cnDSNnMRtBAKiCFwRRbTR7BAGjo/8EdhCkYAToOoerBJLgOxwEIfHd/wTZeK0UBA0bTAYEdb+aKAT0k9ftBI1ctt8E/gSlzgQCjghZBEH8lm4Eq/IAFAQEsWHxBGZZHM8Epa5r0QSgTFvEBDYbYVkEMruwEQS4d57nBOF7r7Q2GgCOFwFhAVQBSAE/ATMBIwEFAOMA0wDHALcAqwCfAJMAhwB4AGkAXQBNAEEAKQARAAIiQzEZFEQxGEQ2GgGICuAjQzEZFEQxGESADBUffHUAAAAAAAAAA7AjQzEZFEQxGEQ2GgEXwByICbMWJxNMULAjQzEZFEQxGESICXEjQzEZFEQxGEQ2GgEXiAlPI0MxGRREMRhEiAjlI0MxGRREMRhENhoBiAY/I0MxGRREMRhENhoBiAYkI0MxGRREMRhEiAYQI0MxGRREMRhEiAX8I0MxGRREMRhEiAXoI0MxGRREMRhEiAXUI0MxGRREMRhENhoBF4gFsiNDMRkURDEYRIgFfSNDMRkURDEYRDYaAReIBVsjQzEZFEQxGEQ2GgE2GgIXNhoDFzYaBCJTiAR7FicTTFCwI0MxGRREMRhENhoBNhoCFzYaAyJTiAO+FicTTFCwI0MxGRREMRhENhoBF4gCcCNDMRkURDEYRIgBfiNDMRkURDEYRCNDMRkURDEYRIgA4iNDMRkjEkQxGESIAK4jQzEZFEQxGBRENhoBNhoCNhoDFzYaBBc2GgUXNhoGF4gAKiNDigEBi/8VSSQNQQAYiwAkCUmLAElOAw9LAkxNi/9MTwJSF0yJIkL/6IoGACcOi/pnKov9ZycUi/xnJxWL+2cnFov6ZycPi/5nJxCL/2ciKmVEcQFMSU8CRIEDDUEAJ4sAgQMJgQpMlCcXTGeLAIEDDEEADoEDiwAJgQpMlCcYTGeJIkL/9yJC/96KAAAxAEkiJwRjRQFAAAaLACcEImaLACInBWNFAUAABosAJwUiZomICK6xIiplRDIKshQishKyESWyECKyAbOAFlBvb2w6IG9wdC1pbiBjb21wbGV0ZWSwiTEAIicVZUQSRIkxACInFmVEEkSJigAAIihlTElPAkQiKWVMSU4CTgNEDUEAEIsBIQQLiwAKIicQZUQPRImLAIsBDEH/94sAIQQLiwEKIicQZUQPRImKAAAiJwxlREQiJwZlTElPAkQiKmVEMRZEMRYjCUk4ECUSREk4FDIKEkRJOBFPAhJESTggMgMSREk4FTIDEkQ4EogE2klOAklEIitlRAgrTGciKGVMSU4CTgNEIillTElOAk4ERAhMQQAFiwRAADSLASORIihlREsBCChMZyIpZUQIKUxniAQiMQAiJwZlRIsACYgG/CIoZUSBgICAgIAgDESJIihlRIsBFosCFksBo4sEFkxLAaJJFSQORCSvTEsBqxdPBAgoTGciKWVEiwMWTwSjTwOiSRUkDkRPAqsXCClMZ0L/n4oBACInDWVERCInBmVEMQBJIicEY0xJTwJESYv/D0QiJwhlTE4CRCJMQQAWiwIWiwOjJwmiiP2riwEiJwVjRAmMBIsCi/8JiwFJIicEY0SL/wlLAScETwJmIicHZUSL/wknB0xnTBaLA6MnCaKI/XMnBUxmiwRBACOxIiplRIsBSU4CshSLBElOArISshElshAisgGzFlAnGUxQsIv/FosBSwFQgATTr6TxTFCwIihlRCIpZURKCCIoZURPAxZLBKNLAhZMSwGiSRUkDkQkr0xLAasXTwNMCShMZyIpZURPBBZPBaNPA6JJFSQORE8CqxcJKUxnIihlRCIpZUQIDUQiK2VEi/8PRCIrZUSL/wkrTGeIAq8iJwZlRIsADESxIiplRIv/iANBMQCyFLISshElshAisgGziYoDAYAAiP2FIkcDi/5BAGGL/0AADSInD2VEi/4LIQQKjAKL/osCCYgC1kmIAwOL/kwJjAIiKGVESwEIKExnIitlRAgrTGciKGVEiAGbSYwAIillRAxBAAkiKWVEiwAJjAEpiwBniwJJiATIjAOLAYwEiwOLBCIqZUQWi/4WSwIWTwQWi/1PBFBPA1BPAlBMUIAEK7vso0xQsIj9BYwAiYoEAYAASYj85SJHBIv9QQCFIillRIv9CClMZyIpZUSIASdJjAAiKGVMSU4CjAFEDEEADYsBiwAJSYwCiAJUjAMiK2VEiwJJTwIORCIrZURMCStMZ4v/QAANIicPZUSLAwshBAqMBIsDiwRJTgIJKIsAZ0mL/g9EsSIqZUSL/LIUSwGyErIRJbIQIrIBs0sBiAQCjAaMBYsFiwYiKmVEFov9FksCFk8EFov8TwRQTwNQTwJQTFCABNPx1UJMULCI/EGMAImKAQCIBKOL/yEEDkQnD4v/Z4mKAACIBJEiJwZlTElPAkQiJwdlTElOAk4DRA1BAAoxAIsAiwEJiAPWiYoBAIgEaIv/IQQORCcQi/9niYj75CcMImeJiARRJwwjZ4mI+9QnDSJniYgEQScNI2eJigEAiAQ2JxaL/2eJigEAiAQqJxWL/2eJigEBIkmL/xZJIicGZUQWSU4CIicUZUSBApAWSU4DJxGjTgKmSUEAdIsDiwKhiwSjjACLBkEAWosAiwOnQQBHiwCLA6GMASOLBIsDSU4Co0sBo6OLAUmjiwJJTwKjTwKgo4gBFkxBABWLAosBo6CLBYsCo6InCqCI+kmMAImLAosBo6FC/+iLA4sAoYwBIkL/tosAiwOgjAEiQv+riwKLA6FC/4mKAAAiKGVEFiIpZUQWSqMiJxRlRBZJSwKjTwRPBKCjSU4CTgOAAQSjJwqhTwKjJxqiSwFLAqNLAUsCo08Co6CIAJRJTgJKoIgA8k4DpEEAFYsAoYgA5osBTAmMAYsBI5AnBkxniYsATKGIANCLAQiMAUL/6IoBASInF2VMSU8CRCInGGVMTgJEQQAIi/+LAAqMAImLAUEACIv/iwELjACJi/+MAImKAQEiJxdlTElPAkQiJxhlTE4CREEACIv/iwALjACJiwFBAAiL/4sBCowAiYv/jACJigEBIkmL/4AApUSL/4AAqEEABYAAjACJi/8nGqZBAAUnCowAiYv/kyMIgQIKgQJMlUwWTBZMJxujoEmMAIv/SwGioCcRoowBiwGLAKRBABWL/4sBSU4CoksBoCcRoowBjABC/+OJigEBIkcDi/+AAKhBAAQijACJi/+AAQikQQAEI4wAiYv/k4ECCIEDCoECTJVMFkwWTCcbo6CMAYsBSaNJjAOAAKhAACcnEYsBSU4Co4v/iwOioCcaokmMAKhAAAuLAScKoYsAqEEAPYsAjAGLAScKoEmMAklLAaOji/+mQQAHiwKMAUL/5osBSUsBo6OL/6VBAAqLAScKoYwBQv/piwGI+EKMAImLAIwBQv+MigAAgABJMQBJIicEY0xJTwJEQQBIiwMWIicIZUSjJwmiiPgUSYwBiwIiJwVjRAlJjABBACiLAkknBYsBZrEiKmVESwGyFIsASU4CshKyESWyECKyAbMWUCcZTFCwiYoBAIgBNYv/IQQORCcSi/9niYoAAIgBIyInC2VMSU8CREEAHbEiKmVEIicOZUSyFIsAshKyESWyECKyAbMnCyJniYoBAYv/IicEY0QWIicIZUSjJwmiiPeBi/8iJwVjRAmJigEAIicHZUxJTwJEQQAwIicSZUSL/wshBAqL/0sBCYz/IicIZUSL/xYnCaOLABaioCcITGciJwtlRAgnC0xniYoCACInCGVEIov+IicEY0xJTwJEQQAWiwIWiwCjJwmiiPcVi/4iJwVjRAmMAYsCi/8Ii/4iJwRjRIv/CIv+JwRPAmYiJwdlRIv/CCcHTGcWiwCjJwmiiPbfi/4nBU8CZosBQQAjsSIqZUSL/rIUiwFJTgKyErIRJbIQIrIBsxaL/kxQJxlMULCL/xaL/kxQgATPq4cjTFCwiTEAIicOZUQSRImKAQCI//AnDov/Z4k=",
|
|
426
|
-
clear: "CoEBQw==",
|
|
427
|
-
},
|
|
428
|
-
events: [
|
|
429
|
-
{
|
|
430
|
-
name: "RewardsClaimed",
|
|
431
|
-
args: [
|
|
432
|
-
{ type: "address", name: "user" },
|
|
433
|
-
{ type: "uint64", name: "pending" },
|
|
434
|
-
],
|
|
435
|
-
},
|
|
436
|
-
{
|
|
437
|
-
name: "Deposit",
|
|
438
|
-
args: [
|
|
439
|
-
{ type: "address", name: "to" },
|
|
440
|
-
{ type: "uint64", name: "lpAmount" },
|
|
441
|
-
],
|
|
442
|
-
},
|
|
443
|
-
{
|
|
444
|
-
name: "Withdraw",
|
|
445
|
-
args: [
|
|
446
|
-
{ type: "address", name: "from" },
|
|
447
|
-
{ type: "uint64", name: "lpAmount" },
|
|
448
|
-
],
|
|
449
|
-
},
|
|
450
|
-
{
|
|
451
|
-
name: "SwappedToVUsd",
|
|
452
|
-
args: [
|
|
453
|
-
{ type: "address", name: "sender" },
|
|
454
|
-
{ type: "uint64", name: "tokenId" },
|
|
455
|
-
{ type: "uint64", name: "amount" },
|
|
456
|
-
{ type: "uint64", name: "vUsdAmount" },
|
|
457
|
-
{ type: "uint64", name: "fee" },
|
|
458
|
-
],
|
|
459
|
-
},
|
|
460
|
-
{
|
|
461
|
-
name: "SwappedFromVUsd",
|
|
462
|
-
args: [
|
|
463
|
-
{ type: "address", name: "recipient" },
|
|
464
|
-
{ type: "uint64", name: "tokenId" },
|
|
465
|
-
{ type: "uint64", name: "vUsdAmount" },
|
|
466
|
-
{ type: "uint64", name: "amount" },
|
|
467
|
-
{ type: "uint64", name: "fee" },
|
|
468
|
-
],
|
|
469
|
-
},
|
|
470
|
-
],
|
|
471
|
-
templateVariables: {},
|
|
472
|
-
};
|
|
473
|
-
class BinaryStateValue {
|
|
474
|
-
value;
|
|
475
|
-
constructor(value) {
|
|
476
|
-
this.value = value;
|
|
477
|
-
}
|
|
478
|
-
asByteArray() {
|
|
479
|
-
return this.value;
|
|
480
|
-
}
|
|
481
|
-
asString() {
|
|
482
|
-
return this.value !== undefined ? Buffer.from(this.value).toString("utf-8") : undefined;
|
|
483
|
-
}
|
|
484
|
-
}
|
|
485
|
-
/**
|
|
486
|
-
* Exposes methods for constructing `AppClient` params objects for ABI calls to the Pool smart contract
|
|
487
|
-
*/
|
|
488
|
-
class PoolParamsFactory {
|
|
489
|
-
/**
|
|
490
|
-
* Gets available create ABI call param factories
|
|
491
|
-
*/
|
|
492
|
-
static get create() {
|
|
493
|
-
return {
|
|
494
|
-
_resolveByMethod(params) {
|
|
495
|
-
switch (params.method) {
|
|
496
|
-
case "createApplication":
|
|
497
|
-
case "createApplication(address,address,uint64,uint64,uint64,uint64)void":
|
|
498
|
-
return PoolParamsFactory.create.createApplication(params);
|
|
499
|
-
}
|
|
500
|
-
throw new Error(`Unknown ' + verb + ' method`);
|
|
501
|
-
},
|
|
502
|
-
/**
|
|
503
|
-
* Constructs create ABI call params for the Pool smart contract using the createApplication(address,address,uint64,uint64,uint64,uint64)void ABI method
|
|
504
|
-
*
|
|
505
|
-
* @param params Parameters for the call
|
|
506
|
-
* @returns An `AppClientMethodCallParams` object for the call
|
|
507
|
-
*/
|
|
508
|
-
createApplication(params) {
|
|
509
|
-
return {
|
|
510
|
-
...params,
|
|
511
|
-
method: "createApplication(address,address,uint64,uint64,uint64,uint64)void",
|
|
512
|
-
args: Array.isArray(params.args)
|
|
513
|
-
? params.args
|
|
514
|
-
: [
|
|
515
|
-
params.args.owner,
|
|
516
|
-
params.args.router,
|
|
517
|
-
params.args.a,
|
|
518
|
-
params.args.assetId,
|
|
519
|
-
params.args.feeShareBp,
|
|
520
|
-
params.args.balanceRatioMinBp,
|
|
521
|
-
],
|
|
522
|
-
};
|
|
523
|
-
},
|
|
524
|
-
};
|
|
525
|
-
}
|
|
526
|
-
/**
|
|
527
|
-
* Gets available optIn ABI call param factories
|
|
528
|
-
*/
|
|
529
|
-
static get optIn() {
|
|
530
|
-
return {
|
|
531
|
-
/**
|
|
532
|
-
* Constructs opt-in ABI call params for the Pool smart contract using the optInToApplication()void ABI method
|
|
533
|
-
*
|
|
534
|
-
* @param params Parameters for the call
|
|
535
|
-
* @returns An `AppClientMethodCallParams` object for the call
|
|
536
|
-
*/
|
|
537
|
-
optInToApplication(params) {
|
|
538
|
-
return {
|
|
539
|
-
...params,
|
|
540
|
-
method: "optInToApplication()void",
|
|
541
|
-
args: Array.isArray(params.args) ? params.args : [],
|
|
542
|
-
};
|
|
543
|
-
},
|
|
544
|
-
};
|
|
545
|
-
}
|
|
546
|
-
/**
|
|
547
|
-
* Constructs a no op call for the optInAsset()void ABI method
|
|
548
|
-
*
|
|
549
|
-
* Opt-in the application account to the ASA stored in `this.asset`.
|
|
550
|
-
This performs an inner axfer of 0 to the app's own address.
|
|
551
|
-
Call once after deploy (or whenever you change the asset).
|
|
552
|
-
|
|
553
|
-
*
|
|
554
|
-
* @param params Parameters for the call
|
|
555
|
-
* @returns An `AppClientMethodCallParams` object for the call
|
|
556
|
-
*/
|
|
557
|
-
static optInAsset(params) {
|
|
558
|
-
return {
|
|
559
|
-
...params,
|
|
560
|
-
method: "optInAsset()void",
|
|
561
|
-
args: Array.isArray(params.args) ? params.args : [],
|
|
562
|
-
};
|
|
563
|
-
}
|
|
564
|
-
/**
|
|
565
|
-
* Constructs a no op call for the noop()void ABI method
|
|
566
|
-
*
|
|
567
|
-
* @param params Parameters for the call
|
|
568
|
-
* @returns An `AppClientMethodCallParams` object for the call
|
|
569
|
-
*/
|
|
570
|
-
static noop(params) {
|
|
571
|
-
return {
|
|
572
|
-
...params,
|
|
573
|
-
method: "noop()void",
|
|
574
|
-
args: Array.isArray(params.args) ? params.args : [],
|
|
575
|
-
};
|
|
576
|
-
}
|
|
577
|
-
/**
|
|
578
|
-
* Constructs a no op call for the deposit()void ABI method
|
|
579
|
-
*
|
|
580
|
-
* @param params Parameters for the call
|
|
581
|
-
* @returns An `AppClientMethodCallParams` object for the call
|
|
582
|
-
*/
|
|
583
|
-
static deposit(params) {
|
|
584
|
-
return {
|
|
585
|
-
...params,
|
|
586
|
-
method: "deposit()void",
|
|
587
|
-
args: Array.isArray(params.args) ? params.args : [],
|
|
588
|
-
};
|
|
589
|
-
}
|
|
590
|
-
/**
|
|
591
|
-
* Constructs a no op call for the withdraw(uint64)void ABI method
|
|
592
|
-
*
|
|
593
|
-
* @param params Parameters for the call
|
|
594
|
-
* @returns An `AppClientMethodCallParams` object for the call
|
|
595
|
-
*/
|
|
596
|
-
static withdraw(params) {
|
|
597
|
-
return {
|
|
598
|
-
...params,
|
|
599
|
-
method: "withdraw(uint64)void",
|
|
600
|
-
args: Array.isArray(params.args) ? params.args : [params.args.amountLp],
|
|
601
|
-
};
|
|
602
|
-
}
|
|
603
|
-
/**
|
|
604
|
-
* Constructs a no op call for the swapToVUsd(address,uint64,bool)uint64 ABI method
|
|
605
|
-
*
|
|
606
|
-
* @param params Parameters for the call
|
|
607
|
-
* @returns An `AppClientMethodCallParams` object for the call
|
|
608
|
-
*/
|
|
609
|
-
static swapToVUsd(params) {
|
|
610
|
-
return {
|
|
611
|
-
...params,
|
|
612
|
-
method: "swapToVUsd(address,uint64,bool)uint64",
|
|
613
|
-
args: Array.isArray(params.args) ? params.args : [params.args.user, params.args.amount, params.args.zeroFee],
|
|
614
|
-
};
|
|
615
|
-
}
|
|
616
|
-
/**
|
|
617
|
-
* Constructs a no op call for the swapFromVUsd(address,uint64,uint64,bool)uint64 ABI method
|
|
618
|
-
*
|
|
619
|
-
* @param params Parameters for the call
|
|
620
|
-
* @returns An `AppClientMethodCallParams` object for the call
|
|
621
|
-
*/
|
|
622
|
-
static swapFromVUsd(params) {
|
|
623
|
-
return {
|
|
624
|
-
...params,
|
|
625
|
-
method: "swapFromVUsd(address,uint64,uint64,bool)uint64",
|
|
626
|
-
args: Array.isArray(params.args)
|
|
627
|
-
? params.args
|
|
628
|
-
: [params.args.user, params.args.amount, params.args.receiveAmountMin, params.args.zeroFee],
|
|
629
|
-
};
|
|
630
|
-
}
|
|
631
|
-
/**
|
|
632
|
-
* Constructs a no op call for the setFeeShare(uint64)void ABI method
|
|
633
|
-
*
|
|
634
|
-
* @param params Parameters for the call
|
|
635
|
-
* @returns An `AppClientMethodCallParams` object for the call
|
|
636
|
-
*/
|
|
637
|
-
static setFeeShare(params) {
|
|
638
|
-
return {
|
|
639
|
-
...params,
|
|
640
|
-
method: "setFeeShare(uint64)void",
|
|
641
|
-
args: Array.isArray(params.args) ? params.args : [params.args.feeShareBp],
|
|
642
|
-
};
|
|
643
|
-
}
|
|
644
|
-
/**
|
|
645
|
-
* Constructs a no op call for the adjustTotalLpAmount()void ABI method
|
|
646
|
-
*
|
|
647
|
-
* @param params Parameters for the call
|
|
648
|
-
* @returns An `AppClientMethodCallParams` object for the call
|
|
649
|
-
*/
|
|
650
|
-
static adjustTotalLpAmount(params) {
|
|
651
|
-
return {
|
|
652
|
-
...params,
|
|
653
|
-
method: "adjustTotalLpAmount()void",
|
|
654
|
-
args: Array.isArray(params.args) ? params.args : [],
|
|
655
|
-
};
|
|
656
|
-
}
|
|
657
|
-
/**
|
|
658
|
-
* Constructs a no op call for the setBalanceRatioMinBP(uint64)void ABI method
|
|
659
|
-
*
|
|
660
|
-
* @param params Parameters for the call
|
|
661
|
-
* @returns An `AppClientMethodCallParams` object for the call
|
|
662
|
-
*/
|
|
663
|
-
static setBalanceRatioMinBp(params) {
|
|
664
|
-
return {
|
|
665
|
-
...params,
|
|
666
|
-
method: "setBalanceRatioMinBP(uint64)void",
|
|
667
|
-
args: Array.isArray(params.args) ? params.args : [params.args.balanceRatioMinBp],
|
|
668
|
-
};
|
|
669
|
-
}
|
|
670
|
-
/**
|
|
671
|
-
* Constructs a no op call for the stopDeposit()void ABI method
|
|
672
|
-
*
|
|
673
|
-
* @param params Parameters for the call
|
|
674
|
-
* @returns An `AppClientMethodCallParams` object for the call
|
|
675
|
-
*/
|
|
676
|
-
static stopDeposit(params) {
|
|
677
|
-
return {
|
|
678
|
-
...params,
|
|
679
|
-
method: "stopDeposit()void",
|
|
680
|
-
args: Array.isArray(params.args) ? params.args : [],
|
|
681
|
-
};
|
|
682
|
-
}
|
|
683
|
-
/**
|
|
684
|
-
* Constructs a no op call for the startDeposit()void ABI method
|
|
685
|
-
*
|
|
686
|
-
* @param params Parameters for the call
|
|
687
|
-
* @returns An `AppClientMethodCallParams` object for the call
|
|
688
|
-
*/
|
|
689
|
-
static startDeposit(params) {
|
|
690
|
-
return {
|
|
691
|
-
...params,
|
|
692
|
-
method: "startDeposit()void",
|
|
693
|
-
args: Array.isArray(params.args) ? params.args : [],
|
|
694
|
-
};
|
|
695
|
-
}
|
|
696
|
-
/**
|
|
697
|
-
* Constructs a no op call for the stopWithdraw()void ABI method
|
|
698
|
-
*
|
|
699
|
-
* @param params Parameters for the call
|
|
700
|
-
* @returns An `AppClientMethodCallParams` object for the call
|
|
701
|
-
*/
|
|
702
|
-
static stopWithdraw(params) {
|
|
703
|
-
return {
|
|
704
|
-
...params,
|
|
705
|
-
method: "stopWithdraw()void",
|
|
706
|
-
args: Array.isArray(params.args) ? params.args : [],
|
|
707
|
-
};
|
|
708
|
-
}
|
|
709
|
-
/**
|
|
710
|
-
* Constructs a no op call for the startWithdraw()void ABI method
|
|
711
|
-
*
|
|
712
|
-
* @param params Parameters for the call
|
|
713
|
-
* @returns An `AppClientMethodCallParams` object for the call
|
|
714
|
-
*/
|
|
715
|
-
static startWithdraw(params) {
|
|
716
|
-
return {
|
|
717
|
-
...params,
|
|
718
|
-
method: "startWithdraw()void",
|
|
719
|
-
args: Array.isArray(params.args) ? params.args : [],
|
|
720
|
-
};
|
|
721
|
-
}
|
|
722
|
-
/**
|
|
723
|
-
* Constructs a no op call for the setStopAuthority(address)void ABI method
|
|
724
|
-
*
|
|
725
|
-
* @param params Parameters for the call
|
|
726
|
-
* @returns An `AppClientMethodCallParams` object for the call
|
|
727
|
-
*/
|
|
728
|
-
static setStopAuthority(params) {
|
|
729
|
-
return {
|
|
730
|
-
...params,
|
|
731
|
-
method: "setStopAuthority(address)void",
|
|
732
|
-
args: Array.isArray(params.args) ? params.args : [params.args.stopAuthority],
|
|
733
|
-
};
|
|
734
|
-
}
|
|
735
|
-
/**
|
|
736
|
-
* Constructs a no op call for the setRouter(address)void ABI method
|
|
737
|
-
*
|
|
738
|
-
* @param params Parameters for the call
|
|
739
|
-
* @returns An `AppClientMethodCallParams` object for the call
|
|
740
|
-
*/
|
|
741
|
-
static setRouter(params) {
|
|
742
|
-
return {
|
|
743
|
-
...params,
|
|
744
|
-
method: "setRouter(address)void",
|
|
745
|
-
args: Array.isArray(params.args) ? params.args : [params.args.router],
|
|
746
|
-
};
|
|
747
|
-
}
|
|
748
|
-
/**
|
|
749
|
-
* Constructs a no op call for the claimRewards()void ABI method
|
|
750
|
-
*
|
|
751
|
-
* @param params Parameters for the call
|
|
752
|
-
* @returns An `AppClientMethodCallParams` object for the call
|
|
753
|
-
*/
|
|
754
|
-
static claimRewards(params) {
|
|
755
|
-
return {
|
|
756
|
-
...params,
|
|
757
|
-
method: "claimRewards()void",
|
|
758
|
-
args: Array.isArray(params.args) ? params.args : [],
|
|
759
|
-
};
|
|
760
|
-
}
|
|
761
|
-
/**
|
|
762
|
-
* Constructs a no op call for the setAdminFeeShare(uint64)void ABI method
|
|
763
|
-
*
|
|
764
|
-
* @param params Parameters for the call
|
|
765
|
-
* @returns An `AppClientMethodCallParams` object for the call
|
|
766
|
-
*/
|
|
767
|
-
static setAdminFeeShare(params) {
|
|
768
|
-
return {
|
|
769
|
-
...params,
|
|
770
|
-
method: "setAdminFeeShare(uint64)void",
|
|
771
|
-
args: Array.isArray(params.args) ? params.args : [params.args.adminFeeShareBp],
|
|
772
|
-
};
|
|
773
|
-
}
|
|
774
|
-
/**
|
|
775
|
-
* Constructs a no op call for the claimAdminFee()void ABI method
|
|
776
|
-
*
|
|
777
|
-
* @param params Parameters for the call
|
|
778
|
-
* @returns An `AppClientMethodCallParams` object for the call
|
|
779
|
-
*/
|
|
780
|
-
static claimAdminFee(params) {
|
|
781
|
-
return {
|
|
782
|
-
...params,
|
|
783
|
-
method: "claimAdminFee()void",
|
|
784
|
-
args: Array.isArray(params.args) ? params.args : [],
|
|
785
|
-
};
|
|
786
|
-
}
|
|
787
|
-
/**
|
|
788
|
-
* Constructs a no op call for the pendingReward(account)uint64 ABI method
|
|
789
|
-
*
|
|
790
|
-
* @param params Parameters for the call
|
|
791
|
-
* @returns An `AppClientMethodCallParams` object for the call
|
|
792
|
-
*/
|
|
793
|
-
static pendingReward(params) {
|
|
794
|
-
return {
|
|
795
|
-
...params,
|
|
796
|
-
method: "pendingReward(account)uint64",
|
|
797
|
-
args: Array.isArray(params.args) ? params.args : [params.args.user],
|
|
798
|
-
};
|
|
799
|
-
}
|
|
800
|
-
/**
|
|
801
|
-
* Constructs a no op call for the decimals()uint64 ABI method
|
|
802
|
-
*
|
|
803
|
-
* @param params Parameters for the call
|
|
804
|
-
* @returns An `AppClientMethodCallParams` object for the call
|
|
805
|
-
*/
|
|
806
|
-
static decimals(params) {
|
|
807
|
-
return {
|
|
808
|
-
...params,
|
|
809
|
-
method: "decimals()uint64",
|
|
810
|
-
args: Array.isArray(params.args) ? params.args : [],
|
|
811
|
-
};
|
|
812
|
-
}
|
|
813
|
-
/**
|
|
814
|
-
* Constructs a no op call for the transferOwnership(address)void ABI method
|
|
815
|
-
*
|
|
816
|
-
* @param params Parameters for the call
|
|
817
|
-
* @returns An `AppClientMethodCallParams` object for the call
|
|
818
|
-
*/
|
|
819
|
-
static transferOwnership(params) {
|
|
820
|
-
return {
|
|
821
|
-
...params,
|
|
822
|
-
method: "transferOwnership(address)void",
|
|
823
|
-
args: Array.isArray(params.args) ? params.args : [params.args.newOwner],
|
|
824
|
-
};
|
|
825
|
-
}
|
|
826
|
-
}
|
|
827
|
-
exports.PoolParamsFactory = PoolParamsFactory;
|
|
828
|
-
/**
|
|
829
|
-
* A factory to create and deploy one or more instance of the Pool smart contract and to create one or more app clients to interact with those (or other) app instances
|
|
830
|
-
*/
|
|
831
|
-
class PoolFactory {
|
|
832
|
-
/**
|
|
833
|
-
* The underlying `AppFactory` for when you want to have more flexibility
|
|
834
|
-
*/
|
|
835
|
-
appFactory;
|
|
836
|
-
/**
|
|
837
|
-
* Creates a new instance of `PoolFactory`
|
|
838
|
-
*
|
|
839
|
-
* @param params The parameters to initialise the app factory with
|
|
840
|
-
*/
|
|
841
|
-
constructor(params) {
|
|
842
|
-
this.appFactory = new app_factory_1.AppFactory({
|
|
843
|
-
...params,
|
|
844
|
-
appSpec: exports.APP_SPEC,
|
|
845
|
-
});
|
|
846
|
-
}
|
|
847
|
-
/** The name of the app (from the ARC-32 / ARC-56 app spec or override). */
|
|
848
|
-
get appName() {
|
|
849
|
-
return this.appFactory.appName;
|
|
850
|
-
}
|
|
851
|
-
/** The ARC-56 app spec being used */
|
|
852
|
-
get appSpec() {
|
|
853
|
-
return exports.APP_SPEC;
|
|
854
|
-
}
|
|
855
|
-
/** A reference to the underlying `AlgorandClient` this app factory is using. */
|
|
856
|
-
get algorand() {
|
|
857
|
-
return this.appFactory.algorand;
|
|
858
|
-
}
|
|
859
|
-
/**
|
|
860
|
-
* Returns a new `AppClient` client for an app instance of the given ID.
|
|
861
|
-
*
|
|
862
|
-
* Automatically populates appName, defaultSender and source maps from the factory
|
|
863
|
-
* if not specified in the params.
|
|
864
|
-
* @param params The parameters to create the app client
|
|
865
|
-
* @returns The `AppClient`
|
|
866
|
-
*/
|
|
867
|
-
getAppClientById(params) {
|
|
868
|
-
return new PoolClient(this.appFactory.getAppClientById(params));
|
|
869
|
-
}
|
|
870
|
-
/**
|
|
871
|
-
* Returns a new `AppClient` client, resolving the app by creator address and name
|
|
872
|
-
* using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).
|
|
873
|
-
*
|
|
874
|
-
* Automatically populates appName, defaultSender and source maps from the factory
|
|
875
|
-
* if not specified in the params.
|
|
876
|
-
* @param params The parameters to create the app client
|
|
877
|
-
* @returns The `AppClient`
|
|
878
|
-
*/
|
|
879
|
-
async getAppClientByCreatorAndName(params) {
|
|
880
|
-
return new PoolClient(await this.appFactory.getAppClientByCreatorAndName(params));
|
|
881
|
-
}
|
|
882
|
-
/**
|
|
883
|
-
* Idempotently deploys the Pool smart contract.
|
|
884
|
-
*
|
|
885
|
-
* @param params The arguments for the contract calls and any additional parameters for the call
|
|
886
|
-
* @returns The deployment result
|
|
887
|
-
*/
|
|
888
|
-
async deploy(params = {}) {
|
|
889
|
-
const result = await this.appFactory.deploy({
|
|
890
|
-
...params,
|
|
891
|
-
createParams: params.createParams?.method
|
|
892
|
-
? PoolParamsFactory.create._resolveByMethod(params.createParams)
|
|
893
|
-
: params.createParams
|
|
894
|
-
? params.createParams
|
|
895
|
-
: undefined,
|
|
896
|
-
});
|
|
897
|
-
return { result: result.result, appClient: new PoolClient(result.appClient) };
|
|
898
|
-
}
|
|
899
|
-
/**
|
|
900
|
-
* Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.
|
|
901
|
-
*/
|
|
902
|
-
params = {
|
|
903
|
-
/**
|
|
904
|
-
* Gets available create methods
|
|
905
|
-
*/
|
|
906
|
-
create: {
|
|
907
|
-
/**
|
|
908
|
-
* Creates a new instance of the Pool smart contract using the createApplication(address,address,uint64,uint64,uint64,uint64)void ABI method.
|
|
909
|
-
*
|
|
910
|
-
* @param params The params for the smart contract call
|
|
911
|
-
* @returns The create params
|
|
912
|
-
*/
|
|
913
|
-
createApplication: (params) => {
|
|
914
|
-
return this.appFactory.params.create(PoolParamsFactory.create.createApplication(params));
|
|
915
|
-
},
|
|
916
|
-
},
|
|
917
|
-
};
|
|
918
|
-
/**
|
|
919
|
-
* Create transactions for the current app
|
|
920
|
-
*/
|
|
921
|
-
createTransaction = {
|
|
922
|
-
/**
|
|
923
|
-
* Gets available create methods
|
|
924
|
-
*/
|
|
925
|
-
create: {
|
|
926
|
-
/**
|
|
927
|
-
* Creates a new instance of the Pool smart contract using the createApplication(address,address,uint64,uint64,uint64,uint64)void ABI method.
|
|
928
|
-
*
|
|
929
|
-
* @param params The params for the smart contract call
|
|
930
|
-
* @returns The create transaction
|
|
931
|
-
*/
|
|
932
|
-
createApplication: (params) => {
|
|
933
|
-
return this.appFactory.createTransaction.create(PoolParamsFactory.create.createApplication(params));
|
|
934
|
-
},
|
|
935
|
-
},
|
|
936
|
-
};
|
|
937
|
-
/**
|
|
938
|
-
* Send calls to the current app
|
|
939
|
-
*/
|
|
940
|
-
send = {
|
|
941
|
-
/**
|
|
942
|
-
* Gets available create methods
|
|
943
|
-
*/
|
|
944
|
-
create: {
|
|
945
|
-
/**
|
|
946
|
-
* Creates a new instance of the Pool smart contract using an ABI method call using the createApplication(address,address,uint64,uint64,uint64,uint64)void ABI method.
|
|
947
|
-
*
|
|
948
|
-
* @param params The params for the smart contract call
|
|
949
|
-
* @returns The create result
|
|
950
|
-
*/
|
|
951
|
-
createApplication: async (params) => {
|
|
952
|
-
const result = await this.appFactory.send.create(PoolParamsFactory.create.createApplication(params));
|
|
953
|
-
return {
|
|
954
|
-
result: {
|
|
955
|
-
...result.result,
|
|
956
|
-
return: result.result.return,
|
|
957
|
-
},
|
|
958
|
-
appClient: new PoolClient(result.appClient),
|
|
959
|
-
};
|
|
960
|
-
},
|
|
961
|
-
},
|
|
962
|
-
};
|
|
963
|
-
}
|
|
964
|
-
exports.PoolFactory = PoolFactory;
|
|
965
|
-
/**
|
|
966
|
-
* A client to make calls to the Pool smart contract
|
|
967
|
-
*/
|
|
968
|
-
class PoolClient {
|
|
969
|
-
/**
|
|
970
|
-
* The underlying `AppClient` for when you want to have more flexibility
|
|
971
|
-
*/
|
|
972
|
-
appClient;
|
|
973
|
-
constructor(appClientOrParams) {
|
|
974
|
-
this.appClient =
|
|
975
|
-
appClientOrParams instanceof app_client_1.AppClient
|
|
976
|
-
? appClientOrParams
|
|
977
|
-
: new app_client_1.AppClient({
|
|
978
|
-
...appClientOrParams,
|
|
979
|
-
appSpec: exports.APP_SPEC,
|
|
980
|
-
});
|
|
981
|
-
}
|
|
982
|
-
/**
|
|
983
|
-
* Checks for decode errors on the given return value and maps the return value to the return type for the given method
|
|
984
|
-
* @returns The typed return value or undefined if there was no value
|
|
985
|
-
*/
|
|
986
|
-
decodeReturnValue(method, returnValue) {
|
|
987
|
-
return returnValue !== undefined
|
|
988
|
-
? (0, app_arc56_1.getArc56ReturnValue)(returnValue, this.appClient.getABIMethod(method), exports.APP_SPEC.structs)
|
|
989
|
-
: undefined;
|
|
990
|
-
}
|
|
991
|
-
/**
|
|
992
|
-
* Returns a new `PoolClient` client, resolving the app by creator address and name
|
|
993
|
-
* using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).
|
|
994
|
-
* @param params The parameters to create the app client
|
|
995
|
-
*/
|
|
996
|
-
static async fromCreatorAndName(params) {
|
|
997
|
-
return new PoolClient(await app_client_1.AppClient.fromCreatorAndName({ ...params, appSpec: exports.APP_SPEC }));
|
|
998
|
-
}
|
|
999
|
-
/**
|
|
1000
|
-
* Returns an `PoolClient` instance for the current network based on
|
|
1001
|
-
* pre-determined network-specific app IDs specified in the ARC-56 app spec.
|
|
1002
|
-
*
|
|
1003
|
-
* If no IDs are in the app spec or the network isn't recognised, an error is thrown.
|
|
1004
|
-
* @param params The parameters to create the app client
|
|
1005
|
-
*/
|
|
1006
|
-
static async fromNetwork(params) {
|
|
1007
|
-
return new PoolClient(await app_client_1.AppClient.fromNetwork({ ...params, appSpec: exports.APP_SPEC }));
|
|
1008
|
-
}
|
|
1009
|
-
/** The ID of the app instance this client is linked to. */
|
|
1010
|
-
get appId() {
|
|
1011
|
-
return this.appClient.appId;
|
|
1012
|
-
}
|
|
1013
|
-
/** The app address of the app instance this client is linked to. */
|
|
1014
|
-
get appAddress() {
|
|
1015
|
-
return this.appClient.appAddress;
|
|
1016
|
-
}
|
|
1017
|
-
/** The name of the app. */
|
|
1018
|
-
get appName() {
|
|
1019
|
-
return this.appClient.appName;
|
|
1020
|
-
}
|
|
1021
|
-
/** The ARC-56 app spec being used */
|
|
1022
|
-
get appSpec() {
|
|
1023
|
-
return this.appClient.appSpec;
|
|
1024
|
-
}
|
|
1025
|
-
/** A reference to the underlying `AlgorandClient` this app client is using. */
|
|
1026
|
-
get algorand() {
|
|
1027
|
-
return this.appClient.algorand;
|
|
1028
|
-
}
|
|
1029
|
-
/**
|
|
1030
|
-
* Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.
|
|
1031
|
-
*/
|
|
1032
|
-
params = {
|
|
1033
|
-
/**
|
|
1034
|
-
* Gets available optIn methods
|
|
1035
|
-
*/
|
|
1036
|
-
optIn: {
|
|
1037
|
-
/**
|
|
1038
|
-
* Opts the user into an existing instance of the Pool smart contract using the `optInToApplication()void` ABI method.
|
|
1039
|
-
*
|
|
1040
|
-
* @param params The params for the smart contract call
|
|
1041
|
-
* @returns The optIn params
|
|
1042
|
-
*/
|
|
1043
|
-
optInToApplication: (params = { args: [] }) => {
|
|
1044
|
-
return this.appClient.params.optIn(PoolParamsFactory.optIn.optInToApplication(params));
|
|
1045
|
-
},
|
|
1046
|
-
},
|
|
1047
|
-
/**
|
|
1048
|
-
* Makes a clear_state call to an existing instance of the Pool smart contract.
|
|
1049
|
-
*
|
|
1050
|
-
* @param params The params for the bare (raw) call
|
|
1051
|
-
* @returns The clearState result
|
|
1052
|
-
*/
|
|
1053
|
-
clearState: (params) => {
|
|
1054
|
-
return this.appClient.params.bare.clearState(params);
|
|
1055
|
-
},
|
|
1056
|
-
/**
|
|
1057
|
-
* Makes a call to the Pool smart contract using the `optInAsset()void` ABI method.
|
|
1058
|
-
*
|
|
1059
|
-
* Opt-in the application account to the ASA stored in `this.asset`.
|
|
1060
|
-
This performs an inner axfer of 0 to the app's own address.
|
|
1061
|
-
Call once after deploy (or whenever you change the asset).
|
|
1062
|
-
|
|
1063
|
-
*
|
|
1064
|
-
* @param params The params for the smart contract call
|
|
1065
|
-
* @returns The call params
|
|
1066
|
-
*/
|
|
1067
|
-
optInAsset: (params = { args: [] }) => {
|
|
1068
|
-
return this.appClient.params.call(PoolParamsFactory.optInAsset(params));
|
|
1069
|
-
},
|
|
1070
|
-
/**
|
|
1071
|
-
* Makes a call to the Pool smart contract using the `noop()void` ABI method.
|
|
1072
|
-
*
|
|
1073
|
-
* @param params The params for the smart contract call
|
|
1074
|
-
* @returns The call params
|
|
1075
|
-
*/
|
|
1076
|
-
noop: (params = { args: [] }) => {
|
|
1077
|
-
return this.appClient.params.call(PoolParamsFactory.noop(params));
|
|
1078
|
-
},
|
|
1079
|
-
/**
|
|
1080
|
-
* Makes a call to the Pool smart contract using the `deposit()void` ABI method.
|
|
1081
|
-
*
|
|
1082
|
-
* @param params The params for the smart contract call
|
|
1083
|
-
* @returns The call params
|
|
1084
|
-
*/
|
|
1085
|
-
deposit: (params = { args: [] }) => {
|
|
1086
|
-
return this.appClient.params.call(PoolParamsFactory.deposit(params));
|
|
1087
|
-
},
|
|
1088
|
-
/**
|
|
1089
|
-
* Makes a call to the Pool smart contract using the `withdraw(uint64)void` ABI method.
|
|
1090
|
-
*
|
|
1091
|
-
* @param params The params for the smart contract call
|
|
1092
|
-
* @returns The call params
|
|
1093
|
-
*/
|
|
1094
|
-
withdraw: (params) => {
|
|
1095
|
-
return this.appClient.params.call(PoolParamsFactory.withdraw(params));
|
|
1096
|
-
},
|
|
1097
|
-
/**
|
|
1098
|
-
* Makes a call to the Pool smart contract using the `swapToVUsd(address,uint64,bool)uint64` ABI method.
|
|
1099
|
-
*
|
|
1100
|
-
* @param params The params for the smart contract call
|
|
1101
|
-
* @returns The call params: returns the difference between the old and the new value of vUsdBalance
|
|
1102
|
-
*/
|
|
1103
|
-
swapToVUsd: (params) => {
|
|
1104
|
-
return this.appClient.params.call(PoolParamsFactory.swapToVUsd(params));
|
|
1105
|
-
},
|
|
1106
|
-
/**
|
|
1107
|
-
* Makes a call to the Pool smart contract using the `swapFromVUsd(address,uint64,uint64,bool)uint64` ABI method.
|
|
1108
|
-
*
|
|
1109
|
-
* @param params The params for the smart contract call
|
|
1110
|
-
* @returns The call params: returns the difference between the old and the new value of vUsdBalance
|
|
1111
|
-
*/
|
|
1112
|
-
swapFromVUsd: (params) => {
|
|
1113
|
-
return this.appClient.params.call(PoolParamsFactory.swapFromVUsd(params));
|
|
1114
|
-
},
|
|
1115
|
-
/**
|
|
1116
|
-
* Makes a call to the Pool smart contract using the `setFeeShare(uint64)void` ABI method.
|
|
1117
|
-
*
|
|
1118
|
-
* @param params The params for the smart contract call
|
|
1119
|
-
* @returns The call params
|
|
1120
|
-
*/
|
|
1121
|
-
setFeeShare: (params) => {
|
|
1122
|
-
return this.appClient.params.call(PoolParamsFactory.setFeeShare(params));
|
|
1123
|
-
},
|
|
1124
|
-
/**
|
|
1125
|
-
* Makes a call to the Pool smart contract using the `adjustTotalLpAmount()void` ABI method.
|
|
1126
|
-
*
|
|
1127
|
-
* @param params The params for the smart contract call
|
|
1128
|
-
* @returns The call params
|
|
1129
|
-
*/
|
|
1130
|
-
adjustTotalLpAmount: (params = { args: [] }) => {
|
|
1131
|
-
return this.appClient.params.call(PoolParamsFactory.adjustTotalLpAmount(params));
|
|
1132
|
-
},
|
|
1133
|
-
/**
|
|
1134
|
-
* Makes a call to the Pool smart contract using the `setBalanceRatioMinBP(uint64)void` ABI method.
|
|
1135
|
-
*
|
|
1136
|
-
* @param params The params for the smart contract call
|
|
1137
|
-
* @returns The call params
|
|
1138
|
-
*/
|
|
1139
|
-
setBalanceRatioMinBp: (params) => {
|
|
1140
|
-
return this.appClient.params.call(PoolParamsFactory.setBalanceRatioMinBp(params));
|
|
1141
|
-
},
|
|
1142
|
-
/**
|
|
1143
|
-
* Makes a call to the Pool smart contract using the `stopDeposit()void` ABI method.
|
|
1144
|
-
*
|
|
1145
|
-
* @param params The params for the smart contract call
|
|
1146
|
-
* @returns The call params
|
|
1147
|
-
*/
|
|
1148
|
-
stopDeposit: (params = { args: [] }) => {
|
|
1149
|
-
return this.appClient.params.call(PoolParamsFactory.stopDeposit(params));
|
|
1150
|
-
},
|
|
1151
|
-
/**
|
|
1152
|
-
* Makes a call to the Pool smart contract using the `startDeposit()void` ABI method.
|
|
1153
|
-
*
|
|
1154
|
-
* @param params The params for the smart contract call
|
|
1155
|
-
* @returns The call params
|
|
1156
|
-
*/
|
|
1157
|
-
startDeposit: (params = { args: [] }) => {
|
|
1158
|
-
return this.appClient.params.call(PoolParamsFactory.startDeposit(params));
|
|
1159
|
-
},
|
|
1160
|
-
/**
|
|
1161
|
-
* Makes a call to the Pool smart contract using the `stopWithdraw()void` ABI method.
|
|
1162
|
-
*
|
|
1163
|
-
* @param params The params for the smart contract call
|
|
1164
|
-
* @returns The call params
|
|
1165
|
-
*/
|
|
1166
|
-
stopWithdraw: (params = { args: [] }) => {
|
|
1167
|
-
return this.appClient.params.call(PoolParamsFactory.stopWithdraw(params));
|
|
1168
|
-
},
|
|
1169
|
-
/**
|
|
1170
|
-
* Makes a call to the Pool smart contract using the `startWithdraw()void` ABI method.
|
|
1171
|
-
*
|
|
1172
|
-
* @param params The params for the smart contract call
|
|
1173
|
-
* @returns The call params
|
|
1174
|
-
*/
|
|
1175
|
-
startWithdraw: (params = { args: [] }) => {
|
|
1176
|
-
return this.appClient.params.call(PoolParamsFactory.startWithdraw(params));
|
|
1177
|
-
},
|
|
1178
|
-
/**
|
|
1179
|
-
* Makes a call to the Pool smart contract using the `setStopAuthority(address)void` ABI method.
|
|
1180
|
-
*
|
|
1181
|
-
* @param params The params for the smart contract call
|
|
1182
|
-
* @returns The call params
|
|
1183
|
-
*/
|
|
1184
|
-
setStopAuthority: (params) => {
|
|
1185
|
-
return this.appClient.params.call(PoolParamsFactory.setStopAuthority(params));
|
|
1186
|
-
},
|
|
1187
|
-
/**
|
|
1188
|
-
* Makes a call to the Pool smart contract using the `setRouter(address)void` ABI method.
|
|
1189
|
-
*
|
|
1190
|
-
* @param params The params for the smart contract call
|
|
1191
|
-
* @returns The call params
|
|
1192
|
-
*/
|
|
1193
|
-
setRouter: (params) => {
|
|
1194
|
-
return this.appClient.params.call(PoolParamsFactory.setRouter(params));
|
|
1195
|
-
},
|
|
1196
|
-
/**
|
|
1197
|
-
* Makes a call to the Pool smart contract using the `claimRewards()void` ABI method.
|
|
1198
|
-
*
|
|
1199
|
-
* @param params The params for the smart contract call
|
|
1200
|
-
* @returns The call params
|
|
1201
|
-
*/
|
|
1202
|
-
claimRewards: (params = { args: [] }) => {
|
|
1203
|
-
return this.appClient.params.call(PoolParamsFactory.claimRewards(params));
|
|
1204
|
-
},
|
|
1205
|
-
/**
|
|
1206
|
-
* Makes a call to the Pool smart contract using the `setAdminFeeShare(uint64)void` ABI method.
|
|
1207
|
-
*
|
|
1208
|
-
* @param params The params for the smart contract call
|
|
1209
|
-
* @returns The call params
|
|
1210
|
-
*/
|
|
1211
|
-
setAdminFeeShare: (params) => {
|
|
1212
|
-
return this.appClient.params.call(PoolParamsFactory.setAdminFeeShare(params));
|
|
1213
|
-
},
|
|
1214
|
-
/**
|
|
1215
|
-
* Makes a call to the Pool smart contract using the `claimAdminFee()void` ABI method.
|
|
1216
|
-
*
|
|
1217
|
-
* @param params The params for the smart contract call
|
|
1218
|
-
* @returns The call params
|
|
1219
|
-
*/
|
|
1220
|
-
claimAdminFee: (params = { args: [] }) => {
|
|
1221
|
-
return this.appClient.params.call(PoolParamsFactory.claimAdminFee(params));
|
|
1222
|
-
},
|
|
1223
|
-
/**
|
|
1224
|
-
* Makes a call to the Pool smart contract using the `pendingReward(account)uint64` ABI method.
|
|
1225
|
-
*
|
|
1226
|
-
* This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
|
|
1227
|
-
*
|
|
1228
|
-
* @param params The params for the smart contract call
|
|
1229
|
-
* @returns The call params
|
|
1230
|
-
*/
|
|
1231
|
-
pendingReward: (params) => {
|
|
1232
|
-
return this.appClient.params.call(PoolParamsFactory.pendingReward(params));
|
|
1233
|
-
},
|
|
1234
|
-
/**
|
|
1235
|
-
* Makes a call to the Pool smart contract using the `decimals()uint64` ABI method.
|
|
1236
|
-
*
|
|
1237
|
-
* This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
|
|
1238
|
-
*
|
|
1239
|
-
* @param params The params for the smart contract call
|
|
1240
|
-
* @returns The call params
|
|
1241
|
-
*/
|
|
1242
|
-
decimals: (params = { args: [] }) => {
|
|
1243
|
-
return this.appClient.params.call(PoolParamsFactory.decimals(params));
|
|
1244
|
-
},
|
|
1245
|
-
/**
|
|
1246
|
-
* Makes a call to the Pool smart contract using the `transferOwnership(address)void` ABI method.
|
|
1247
|
-
*
|
|
1248
|
-
* @param params The params for the smart contract call
|
|
1249
|
-
* @returns The call params
|
|
1250
|
-
*/
|
|
1251
|
-
transferOwnership: (params) => {
|
|
1252
|
-
return this.appClient.params.call(PoolParamsFactory.transferOwnership(params));
|
|
1253
|
-
},
|
|
1254
|
-
};
|
|
1255
|
-
/**
|
|
1256
|
-
* Create transactions for the current app
|
|
1257
|
-
*/
|
|
1258
|
-
createTransaction = {
|
|
1259
|
-
/**
|
|
1260
|
-
* Gets available optIn methods
|
|
1261
|
-
*/
|
|
1262
|
-
optIn: {
|
|
1263
|
-
/**
|
|
1264
|
-
* Opts the user into an existing instance of the Pool smart contract using the `optInToApplication()void` ABI method.
|
|
1265
|
-
*
|
|
1266
|
-
* @param params The params for the smart contract call
|
|
1267
|
-
* @returns The optIn transaction
|
|
1268
|
-
*/
|
|
1269
|
-
optInToApplication: (params = { args: [] }) => {
|
|
1270
|
-
return this.appClient.createTransaction.optIn(PoolParamsFactory.optIn.optInToApplication(params));
|
|
1271
|
-
},
|
|
1272
|
-
},
|
|
1273
|
-
/**
|
|
1274
|
-
* Makes a clear_state call to an existing instance of the Pool smart contract.
|
|
1275
|
-
*
|
|
1276
|
-
* @param params The params for the bare (raw) call
|
|
1277
|
-
* @returns The clearState result
|
|
1278
|
-
*/
|
|
1279
|
-
clearState: (params) => {
|
|
1280
|
-
return this.appClient.createTransaction.bare.clearState(params);
|
|
1281
|
-
},
|
|
1282
|
-
/**
|
|
1283
|
-
* Makes a call to the Pool smart contract using the `optInAsset()void` ABI method.
|
|
1284
|
-
*
|
|
1285
|
-
* Opt-in the application account to the ASA stored in `this.asset`.
|
|
1286
|
-
This performs an inner axfer of 0 to the app's own address.
|
|
1287
|
-
Call once after deploy (or whenever you change the asset).
|
|
1288
|
-
|
|
1289
|
-
*
|
|
1290
|
-
* @param params The params for the smart contract call
|
|
1291
|
-
* @returns The call transaction
|
|
1292
|
-
*/
|
|
1293
|
-
optInAsset: (params = { args: [] }) => {
|
|
1294
|
-
return this.appClient.createTransaction.call(PoolParamsFactory.optInAsset(params));
|
|
1295
|
-
},
|
|
1296
|
-
/**
|
|
1297
|
-
* Makes a call to the Pool smart contract using the `noop()void` ABI method.
|
|
1298
|
-
*
|
|
1299
|
-
* @param params The params for the smart contract call
|
|
1300
|
-
* @returns The call transaction
|
|
1301
|
-
*/
|
|
1302
|
-
noop: (params = { args: [] }) => {
|
|
1303
|
-
return this.appClient.createTransaction.call(PoolParamsFactory.noop(params));
|
|
1304
|
-
},
|
|
1305
|
-
/**
|
|
1306
|
-
* Makes a call to the Pool smart contract using the `deposit()void` ABI method.
|
|
1307
|
-
*
|
|
1308
|
-
* @param params The params for the smart contract call
|
|
1309
|
-
* @returns The call transaction
|
|
1310
|
-
*/
|
|
1311
|
-
deposit: (params = { args: [] }) => {
|
|
1312
|
-
return this.appClient.createTransaction.call(PoolParamsFactory.deposit(params));
|
|
1313
|
-
},
|
|
1314
|
-
/**
|
|
1315
|
-
* Makes a call to the Pool smart contract using the `withdraw(uint64)void` ABI method.
|
|
1316
|
-
*
|
|
1317
|
-
* @param params The params for the smart contract call
|
|
1318
|
-
* @returns The call transaction
|
|
1319
|
-
*/
|
|
1320
|
-
withdraw: (params) => {
|
|
1321
|
-
return this.appClient.createTransaction.call(PoolParamsFactory.withdraw(params));
|
|
1322
|
-
},
|
|
1323
|
-
/**
|
|
1324
|
-
* Makes a call to the Pool smart contract using the `swapToVUsd(address,uint64,bool)uint64` ABI method.
|
|
1325
|
-
*
|
|
1326
|
-
* @param params The params for the smart contract call
|
|
1327
|
-
* @returns The call transaction: returns the difference between the old and the new value of vUsdBalance
|
|
1328
|
-
*/
|
|
1329
|
-
swapToVUsd: (params) => {
|
|
1330
|
-
return this.appClient.createTransaction.call(PoolParamsFactory.swapToVUsd(params));
|
|
1331
|
-
},
|
|
1332
|
-
/**
|
|
1333
|
-
* Makes a call to the Pool smart contract using the `swapFromVUsd(address,uint64,uint64,bool)uint64` ABI method.
|
|
1334
|
-
*
|
|
1335
|
-
* @param params The params for the smart contract call
|
|
1336
|
-
* @returns The call transaction: returns the difference between the old and the new value of vUsdBalance
|
|
1337
|
-
*/
|
|
1338
|
-
swapFromVUsd: (params) => {
|
|
1339
|
-
return this.appClient.createTransaction.call(PoolParamsFactory.swapFromVUsd(params));
|
|
1340
|
-
},
|
|
1341
|
-
/**
|
|
1342
|
-
* Makes a call to the Pool smart contract using the `setFeeShare(uint64)void` ABI method.
|
|
1343
|
-
*
|
|
1344
|
-
* @param params The params for the smart contract call
|
|
1345
|
-
* @returns The call transaction
|
|
1346
|
-
*/
|
|
1347
|
-
setFeeShare: (params) => {
|
|
1348
|
-
return this.appClient.createTransaction.call(PoolParamsFactory.setFeeShare(params));
|
|
1349
|
-
},
|
|
1350
|
-
/**
|
|
1351
|
-
* Makes a call to the Pool smart contract using the `adjustTotalLpAmount()void` ABI method.
|
|
1352
|
-
*
|
|
1353
|
-
* @param params The params for the smart contract call
|
|
1354
|
-
* @returns The call transaction
|
|
1355
|
-
*/
|
|
1356
|
-
adjustTotalLpAmount: (params = { args: [] }) => {
|
|
1357
|
-
return this.appClient.createTransaction.call(PoolParamsFactory.adjustTotalLpAmount(params));
|
|
1358
|
-
},
|
|
1359
|
-
/**
|
|
1360
|
-
* Makes a call to the Pool smart contract using the `setBalanceRatioMinBP(uint64)void` ABI method.
|
|
1361
|
-
*
|
|
1362
|
-
* @param params The params for the smart contract call
|
|
1363
|
-
* @returns The call transaction
|
|
1364
|
-
*/
|
|
1365
|
-
setBalanceRatioMinBp: (params) => {
|
|
1366
|
-
return this.appClient.createTransaction.call(PoolParamsFactory.setBalanceRatioMinBp(params));
|
|
1367
|
-
},
|
|
1368
|
-
/**
|
|
1369
|
-
* Makes a call to the Pool smart contract using the `stopDeposit()void` ABI method.
|
|
1370
|
-
*
|
|
1371
|
-
* @param params The params for the smart contract call
|
|
1372
|
-
* @returns The call transaction
|
|
1373
|
-
*/
|
|
1374
|
-
stopDeposit: (params = { args: [] }) => {
|
|
1375
|
-
return this.appClient.createTransaction.call(PoolParamsFactory.stopDeposit(params));
|
|
1376
|
-
},
|
|
1377
|
-
/**
|
|
1378
|
-
* Makes a call to the Pool smart contract using the `startDeposit()void` ABI method.
|
|
1379
|
-
*
|
|
1380
|
-
* @param params The params for the smart contract call
|
|
1381
|
-
* @returns The call transaction
|
|
1382
|
-
*/
|
|
1383
|
-
startDeposit: (params = { args: [] }) => {
|
|
1384
|
-
return this.appClient.createTransaction.call(PoolParamsFactory.startDeposit(params));
|
|
1385
|
-
},
|
|
1386
|
-
/**
|
|
1387
|
-
* Makes a call to the Pool smart contract using the `stopWithdraw()void` ABI method.
|
|
1388
|
-
*
|
|
1389
|
-
* @param params The params for the smart contract call
|
|
1390
|
-
* @returns The call transaction
|
|
1391
|
-
*/
|
|
1392
|
-
stopWithdraw: (params = { args: [] }) => {
|
|
1393
|
-
return this.appClient.createTransaction.call(PoolParamsFactory.stopWithdraw(params));
|
|
1394
|
-
},
|
|
1395
|
-
/**
|
|
1396
|
-
* Makes a call to the Pool smart contract using the `startWithdraw()void` ABI method.
|
|
1397
|
-
*
|
|
1398
|
-
* @param params The params for the smart contract call
|
|
1399
|
-
* @returns The call transaction
|
|
1400
|
-
*/
|
|
1401
|
-
startWithdraw: (params = { args: [] }) => {
|
|
1402
|
-
return this.appClient.createTransaction.call(PoolParamsFactory.startWithdraw(params));
|
|
1403
|
-
},
|
|
1404
|
-
/**
|
|
1405
|
-
* Makes a call to the Pool smart contract using the `setStopAuthority(address)void` ABI method.
|
|
1406
|
-
*
|
|
1407
|
-
* @param params The params for the smart contract call
|
|
1408
|
-
* @returns The call transaction
|
|
1409
|
-
*/
|
|
1410
|
-
setStopAuthority: (params) => {
|
|
1411
|
-
return this.appClient.createTransaction.call(PoolParamsFactory.setStopAuthority(params));
|
|
1412
|
-
},
|
|
1413
|
-
/**
|
|
1414
|
-
* Makes a call to the Pool smart contract using the `setRouter(address)void` ABI method.
|
|
1415
|
-
*
|
|
1416
|
-
* @param params The params for the smart contract call
|
|
1417
|
-
* @returns The call transaction
|
|
1418
|
-
*/
|
|
1419
|
-
setRouter: (params) => {
|
|
1420
|
-
return this.appClient.createTransaction.call(PoolParamsFactory.setRouter(params));
|
|
1421
|
-
},
|
|
1422
|
-
/**
|
|
1423
|
-
* Makes a call to the Pool smart contract using the `claimRewards()void` ABI method.
|
|
1424
|
-
*
|
|
1425
|
-
* @param params The params for the smart contract call
|
|
1426
|
-
* @returns The call transaction
|
|
1427
|
-
*/
|
|
1428
|
-
claimRewards: (params = { args: [] }) => {
|
|
1429
|
-
return this.appClient.createTransaction.call(PoolParamsFactory.claimRewards(params));
|
|
1430
|
-
},
|
|
1431
|
-
/**
|
|
1432
|
-
* Makes a call to the Pool smart contract using the `setAdminFeeShare(uint64)void` ABI method.
|
|
1433
|
-
*
|
|
1434
|
-
* @param params The params for the smart contract call
|
|
1435
|
-
* @returns The call transaction
|
|
1436
|
-
*/
|
|
1437
|
-
setAdminFeeShare: (params) => {
|
|
1438
|
-
return this.appClient.createTransaction.call(PoolParamsFactory.setAdminFeeShare(params));
|
|
1439
|
-
},
|
|
1440
|
-
/**
|
|
1441
|
-
* Makes a call to the Pool smart contract using the `claimAdminFee()void` ABI method.
|
|
1442
|
-
*
|
|
1443
|
-
* @param params The params for the smart contract call
|
|
1444
|
-
* @returns The call transaction
|
|
1445
|
-
*/
|
|
1446
|
-
claimAdminFee: (params = { args: [] }) => {
|
|
1447
|
-
return this.appClient.createTransaction.call(PoolParamsFactory.claimAdminFee(params));
|
|
1448
|
-
},
|
|
1449
|
-
/**
|
|
1450
|
-
* Makes a call to the Pool smart contract using the `pendingReward(account)uint64` ABI method.
|
|
1451
|
-
*
|
|
1452
|
-
* This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
|
|
1453
|
-
*
|
|
1454
|
-
* @param params The params for the smart contract call
|
|
1455
|
-
* @returns The call transaction
|
|
1456
|
-
*/
|
|
1457
|
-
pendingReward: (params) => {
|
|
1458
|
-
return this.appClient.createTransaction.call(PoolParamsFactory.pendingReward(params));
|
|
1459
|
-
},
|
|
1460
|
-
/**
|
|
1461
|
-
* Makes a call to the Pool smart contract using the `decimals()uint64` ABI method.
|
|
1462
|
-
*
|
|
1463
|
-
* This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
|
|
1464
|
-
*
|
|
1465
|
-
* @param params The params for the smart contract call
|
|
1466
|
-
* @returns The call transaction
|
|
1467
|
-
*/
|
|
1468
|
-
decimals: (params = { args: [] }) => {
|
|
1469
|
-
return this.appClient.createTransaction.call(PoolParamsFactory.decimals(params));
|
|
1470
|
-
},
|
|
1471
|
-
/**
|
|
1472
|
-
* Makes a call to the Pool smart contract using the `transferOwnership(address)void` ABI method.
|
|
1473
|
-
*
|
|
1474
|
-
* @param params The params for the smart contract call
|
|
1475
|
-
* @returns The call transaction
|
|
1476
|
-
*/
|
|
1477
|
-
transferOwnership: (params) => {
|
|
1478
|
-
return this.appClient.createTransaction.call(PoolParamsFactory.transferOwnership(params));
|
|
1479
|
-
},
|
|
1480
|
-
};
|
|
1481
|
-
/**
|
|
1482
|
-
* Send calls to the current app
|
|
1483
|
-
*/
|
|
1484
|
-
send = {
|
|
1485
|
-
/**
|
|
1486
|
-
* Gets available optIn methods
|
|
1487
|
-
*/
|
|
1488
|
-
optIn: {
|
|
1489
|
-
/**
|
|
1490
|
-
* Opts the user into an existing instance of the Pool smart contract using the `optInToApplication()void` ABI method.
|
|
1491
|
-
*
|
|
1492
|
-
* @param params The params for the smart contract call
|
|
1493
|
-
* @returns The optIn result
|
|
1494
|
-
*/
|
|
1495
|
-
optInToApplication: async (params = { args: [] }) => {
|
|
1496
|
-
const result = await this.appClient.send.optIn(PoolParamsFactory.optIn.optInToApplication(params));
|
|
1497
|
-
return { ...result, return: result.return };
|
|
1498
|
-
},
|
|
1499
|
-
},
|
|
1500
|
-
/**
|
|
1501
|
-
* Makes a clear_state call to an existing instance of the Pool smart contract.
|
|
1502
|
-
*
|
|
1503
|
-
* @param params The params for the bare (raw) call
|
|
1504
|
-
* @returns The clearState result
|
|
1505
|
-
*/
|
|
1506
|
-
clearState: (params) => {
|
|
1507
|
-
return this.appClient.send.bare.clearState(params);
|
|
1508
|
-
},
|
|
1509
|
-
/**
|
|
1510
|
-
* Makes a call to the Pool smart contract using the `optInAsset()void` ABI method.
|
|
1511
|
-
*
|
|
1512
|
-
* Opt-in the application account to the ASA stored in `this.asset`.
|
|
1513
|
-
This performs an inner axfer of 0 to the app's own address.
|
|
1514
|
-
Call once after deploy (or whenever you change the asset).
|
|
1515
|
-
|
|
1516
|
-
*
|
|
1517
|
-
* @param params The params for the smart contract call
|
|
1518
|
-
* @returns The call result
|
|
1519
|
-
*/
|
|
1520
|
-
optInAsset: async (params = { args: [] }) => {
|
|
1521
|
-
const result = await this.appClient.send.call(PoolParamsFactory.optInAsset(params));
|
|
1522
|
-
return { ...result, return: result.return };
|
|
1523
|
-
},
|
|
1524
|
-
/**
|
|
1525
|
-
* Makes a call to the Pool smart contract using the `noop()void` ABI method.
|
|
1526
|
-
*
|
|
1527
|
-
* @param params The params for the smart contract call
|
|
1528
|
-
* @returns The call result
|
|
1529
|
-
*/
|
|
1530
|
-
noop: async (params = { args: [] }) => {
|
|
1531
|
-
const result = await this.appClient.send.call(PoolParamsFactory.noop(params));
|
|
1532
|
-
return { ...result, return: result.return };
|
|
1533
|
-
},
|
|
1534
|
-
/**
|
|
1535
|
-
* Makes a call to the Pool smart contract using the `deposit()void` ABI method.
|
|
1536
|
-
*
|
|
1537
|
-
* @param params The params for the smart contract call
|
|
1538
|
-
* @returns The call result
|
|
1539
|
-
*/
|
|
1540
|
-
deposit: async (params = { args: [] }) => {
|
|
1541
|
-
const result = await this.appClient.send.call(PoolParamsFactory.deposit(params));
|
|
1542
|
-
return { ...result, return: result.return };
|
|
1543
|
-
},
|
|
1544
|
-
/**
|
|
1545
|
-
* Makes a call to the Pool smart contract using the `withdraw(uint64)void` ABI method.
|
|
1546
|
-
*
|
|
1547
|
-
* @param params The params for the smart contract call
|
|
1548
|
-
* @returns The call result
|
|
1549
|
-
*/
|
|
1550
|
-
withdraw: async (params) => {
|
|
1551
|
-
const result = await this.appClient.send.call(PoolParamsFactory.withdraw(params));
|
|
1552
|
-
return { ...result, return: result.return };
|
|
1553
|
-
},
|
|
1554
|
-
/**
|
|
1555
|
-
* Makes a call to the Pool smart contract using the `swapToVUsd(address,uint64,bool)uint64` ABI method.
|
|
1556
|
-
*
|
|
1557
|
-
* @param params The params for the smart contract call
|
|
1558
|
-
* @returns The call result: returns the difference between the old and the new value of vUsdBalance
|
|
1559
|
-
*/
|
|
1560
|
-
swapToVUsd: async (params) => {
|
|
1561
|
-
const result = await this.appClient.send.call(PoolParamsFactory.swapToVUsd(params));
|
|
1562
|
-
return {
|
|
1563
|
-
...result,
|
|
1564
|
-
return: result.return,
|
|
1565
|
-
};
|
|
1566
|
-
},
|
|
1567
|
-
/**
|
|
1568
|
-
* Makes a call to the Pool smart contract using the `swapFromVUsd(address,uint64,uint64,bool)uint64` ABI method.
|
|
1569
|
-
*
|
|
1570
|
-
* @param params The params for the smart contract call
|
|
1571
|
-
* @returns The call result: returns the difference between the old and the new value of vUsdBalance
|
|
1572
|
-
*/
|
|
1573
|
-
swapFromVUsd: async (params) => {
|
|
1574
|
-
const result = await this.appClient.send.call(PoolParamsFactory.swapFromVUsd(params));
|
|
1575
|
-
return {
|
|
1576
|
-
...result,
|
|
1577
|
-
return: result.return,
|
|
1578
|
-
};
|
|
1579
|
-
},
|
|
1580
|
-
/**
|
|
1581
|
-
* Makes a call to the Pool smart contract using the `setFeeShare(uint64)void` ABI method.
|
|
1582
|
-
*
|
|
1583
|
-
* @param params The params for the smart contract call
|
|
1584
|
-
* @returns The call result
|
|
1585
|
-
*/
|
|
1586
|
-
setFeeShare: async (params) => {
|
|
1587
|
-
const result = await this.appClient.send.call(PoolParamsFactory.setFeeShare(params));
|
|
1588
|
-
return { ...result, return: result.return };
|
|
1589
|
-
},
|
|
1590
|
-
/**
|
|
1591
|
-
* Makes a call to the Pool smart contract using the `adjustTotalLpAmount()void` ABI method.
|
|
1592
|
-
*
|
|
1593
|
-
* @param params The params for the smart contract call
|
|
1594
|
-
* @returns The call result
|
|
1595
|
-
*/
|
|
1596
|
-
adjustTotalLpAmount: async (params = { args: [] }) => {
|
|
1597
|
-
const result = await this.appClient.send.call(PoolParamsFactory.adjustTotalLpAmount(params));
|
|
1598
|
-
return { ...result, return: result.return };
|
|
1599
|
-
},
|
|
1600
|
-
/**
|
|
1601
|
-
* Makes a call to the Pool smart contract using the `setBalanceRatioMinBP(uint64)void` ABI method.
|
|
1602
|
-
*
|
|
1603
|
-
* @param params The params for the smart contract call
|
|
1604
|
-
* @returns The call result
|
|
1605
|
-
*/
|
|
1606
|
-
setBalanceRatioMinBp: async (params) => {
|
|
1607
|
-
const result = await this.appClient.send.call(PoolParamsFactory.setBalanceRatioMinBp(params));
|
|
1608
|
-
return {
|
|
1609
|
-
...result,
|
|
1610
|
-
return: result.return,
|
|
1611
|
-
};
|
|
1612
|
-
},
|
|
1613
|
-
/**
|
|
1614
|
-
* Makes a call to the Pool smart contract using the `stopDeposit()void` ABI method.
|
|
1615
|
-
*
|
|
1616
|
-
* @param params The params for the smart contract call
|
|
1617
|
-
* @returns The call result
|
|
1618
|
-
*/
|
|
1619
|
-
stopDeposit: async (params = { args: [] }) => {
|
|
1620
|
-
const result = await this.appClient.send.call(PoolParamsFactory.stopDeposit(params));
|
|
1621
|
-
return { ...result, return: result.return };
|
|
1622
|
-
},
|
|
1623
|
-
/**
|
|
1624
|
-
* Makes a call to the Pool smart contract using the `startDeposit()void` ABI method.
|
|
1625
|
-
*
|
|
1626
|
-
* @param params The params for the smart contract call
|
|
1627
|
-
* @returns The call result
|
|
1628
|
-
*/
|
|
1629
|
-
startDeposit: async (params = { args: [] }) => {
|
|
1630
|
-
const result = await this.appClient.send.call(PoolParamsFactory.startDeposit(params));
|
|
1631
|
-
return { ...result, return: result.return };
|
|
1632
|
-
},
|
|
1633
|
-
/**
|
|
1634
|
-
* Makes a call to the Pool smart contract using the `stopWithdraw()void` ABI method.
|
|
1635
|
-
*
|
|
1636
|
-
* @param params The params for the smart contract call
|
|
1637
|
-
* @returns The call result
|
|
1638
|
-
*/
|
|
1639
|
-
stopWithdraw: async (params = { args: [] }) => {
|
|
1640
|
-
const result = await this.appClient.send.call(PoolParamsFactory.stopWithdraw(params));
|
|
1641
|
-
return { ...result, return: result.return };
|
|
1642
|
-
},
|
|
1643
|
-
/**
|
|
1644
|
-
* Makes a call to the Pool smart contract using the `startWithdraw()void` ABI method.
|
|
1645
|
-
*
|
|
1646
|
-
* @param params The params for the smart contract call
|
|
1647
|
-
* @returns The call result
|
|
1648
|
-
*/
|
|
1649
|
-
startWithdraw: async (params = { args: [] }) => {
|
|
1650
|
-
const result = await this.appClient.send.call(PoolParamsFactory.startWithdraw(params));
|
|
1651
|
-
return { ...result, return: result.return };
|
|
1652
|
-
},
|
|
1653
|
-
/**
|
|
1654
|
-
* Makes a call to the Pool smart contract using the `setStopAuthority(address)void` ABI method.
|
|
1655
|
-
*
|
|
1656
|
-
* @param params The params for the smart contract call
|
|
1657
|
-
* @returns The call result
|
|
1658
|
-
*/
|
|
1659
|
-
setStopAuthority: async (params) => {
|
|
1660
|
-
const result = await this.appClient.send.call(PoolParamsFactory.setStopAuthority(params));
|
|
1661
|
-
return {
|
|
1662
|
-
...result,
|
|
1663
|
-
return: result.return,
|
|
1664
|
-
};
|
|
1665
|
-
},
|
|
1666
|
-
/**
|
|
1667
|
-
* Makes a call to the Pool smart contract using the `setRouter(address)void` ABI method.
|
|
1668
|
-
*
|
|
1669
|
-
* @param params The params for the smart contract call
|
|
1670
|
-
* @returns The call result
|
|
1671
|
-
*/
|
|
1672
|
-
setRouter: async (params) => {
|
|
1673
|
-
const result = await this.appClient.send.call(PoolParamsFactory.setRouter(params));
|
|
1674
|
-
return { ...result, return: result.return };
|
|
1675
|
-
},
|
|
1676
|
-
/**
|
|
1677
|
-
* Makes a call to the Pool smart contract using the `claimRewards()void` ABI method.
|
|
1678
|
-
*
|
|
1679
|
-
* @param params The params for the smart contract call
|
|
1680
|
-
* @returns The call result
|
|
1681
|
-
*/
|
|
1682
|
-
claimRewards: async (params = { args: [] }) => {
|
|
1683
|
-
const result = await this.appClient.send.call(PoolParamsFactory.claimRewards(params));
|
|
1684
|
-
return { ...result, return: result.return };
|
|
1685
|
-
},
|
|
1686
|
-
/**
|
|
1687
|
-
* Makes a call to the Pool smart contract using the `setAdminFeeShare(uint64)void` ABI method.
|
|
1688
|
-
*
|
|
1689
|
-
* @param params The params for the smart contract call
|
|
1690
|
-
* @returns The call result
|
|
1691
|
-
*/
|
|
1692
|
-
setAdminFeeShare: async (params) => {
|
|
1693
|
-
const result = await this.appClient.send.call(PoolParamsFactory.setAdminFeeShare(params));
|
|
1694
|
-
return { ...result, return: result.return };
|
|
1695
|
-
},
|
|
1696
|
-
/**
|
|
1697
|
-
* Makes a call to the Pool smart contract using the `claimAdminFee()void` ABI method.
|
|
1698
|
-
*
|
|
1699
|
-
* @param params The params for the smart contract call
|
|
1700
|
-
* @returns The call result
|
|
1701
|
-
*/
|
|
1702
|
-
claimAdminFee: async (params = { args: [] }) => {
|
|
1703
|
-
const result = await this.appClient.send.call(PoolParamsFactory.claimAdminFee(params));
|
|
1704
|
-
return { ...result, return: result.return };
|
|
1705
|
-
},
|
|
1706
|
-
/**
|
|
1707
|
-
* Makes a call to the Pool smart contract using the `pendingReward(account)uint64` ABI method.
|
|
1708
|
-
*
|
|
1709
|
-
* This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
|
|
1710
|
-
*
|
|
1711
|
-
* @param params The params for the smart contract call
|
|
1712
|
-
* @returns The call result
|
|
1713
|
-
*/
|
|
1714
|
-
pendingReward: async (params) => {
|
|
1715
|
-
const result = await this.appClient.send.call(PoolParamsFactory.pendingReward(params));
|
|
1716
|
-
return { ...result, return: result.return };
|
|
1717
|
-
},
|
|
1718
|
-
/**
|
|
1719
|
-
* Makes a call to the Pool smart contract using the `decimals()uint64` ABI method.
|
|
1720
|
-
*
|
|
1721
|
-
* This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
|
|
1722
|
-
*
|
|
1723
|
-
* @param params The params for the smart contract call
|
|
1724
|
-
* @returns The call result
|
|
1725
|
-
*/
|
|
1726
|
-
decimals: async (params = { args: [] }) => {
|
|
1727
|
-
const result = await this.appClient.send.call(PoolParamsFactory.decimals(params));
|
|
1728
|
-
return { ...result, return: result.return };
|
|
1729
|
-
},
|
|
1730
|
-
/**
|
|
1731
|
-
* Makes a call to the Pool smart contract using the `transferOwnership(address)void` ABI method.
|
|
1732
|
-
*
|
|
1733
|
-
* @param params The params for the smart contract call
|
|
1734
|
-
* @returns The call result
|
|
1735
|
-
*/
|
|
1736
|
-
transferOwnership: async (params) => {
|
|
1737
|
-
const result = await this.appClient.send.call(PoolParamsFactory.transferOwnership(params));
|
|
1738
|
-
return {
|
|
1739
|
-
...result,
|
|
1740
|
-
return: result.return,
|
|
1741
|
-
};
|
|
1742
|
-
},
|
|
1743
|
-
};
|
|
1744
|
-
/**
|
|
1745
|
-
* Clone this app client with different params
|
|
1746
|
-
*
|
|
1747
|
-
* @param params The params to use for the the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value.
|
|
1748
|
-
* @returns A new app client with the altered params
|
|
1749
|
-
*/
|
|
1750
|
-
clone(params) {
|
|
1751
|
-
return new PoolClient(this.appClient.clone(params));
|
|
1752
|
-
}
|
|
1753
|
-
/**
|
|
1754
|
-
* Makes a readonly (simulated) call to the Pool smart contract using the `pendingReward(account)uint64` ABI method.
|
|
1755
|
-
*
|
|
1756
|
-
* This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
|
|
1757
|
-
*
|
|
1758
|
-
* @param params The params for the smart contract call
|
|
1759
|
-
* @returns The call result
|
|
1760
|
-
*/
|
|
1761
|
-
async pendingReward(params) {
|
|
1762
|
-
const result = await this.appClient.send.call(PoolParamsFactory.pendingReward(params));
|
|
1763
|
-
return result.return;
|
|
1764
|
-
}
|
|
1765
|
-
/**
|
|
1766
|
-
* Makes a readonly (simulated) call to the Pool smart contract using the `decimals()uint64` ABI method.
|
|
1767
|
-
*
|
|
1768
|
-
* This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
|
|
1769
|
-
*
|
|
1770
|
-
* @param params The params for the smart contract call
|
|
1771
|
-
* @returns The call result
|
|
1772
|
-
*/
|
|
1773
|
-
async decimals(params = { args: [] }) {
|
|
1774
|
-
const result = await this.appClient.send.call(PoolParamsFactory.decimals(params));
|
|
1775
|
-
return result.return;
|
|
1776
|
-
}
|
|
1777
|
-
/**
|
|
1778
|
-
* Methods to access state for the current Pool app
|
|
1779
|
-
*/
|
|
1780
|
-
state = {
|
|
1781
|
-
/**
|
|
1782
|
-
* Methods to access global state for the current Pool app
|
|
1783
|
-
*/
|
|
1784
|
-
global: {
|
|
1785
|
-
/**
|
|
1786
|
-
* Get all current keyed values from global state
|
|
1787
|
-
*/
|
|
1788
|
-
getAll: async () => {
|
|
1789
|
-
const result = await this.appClient.state.global.getAll();
|
|
1790
|
-
return {
|
|
1791
|
-
feeShareBp: result.feeShareBP,
|
|
1792
|
-
router: result.router,
|
|
1793
|
-
tokenBalance: result.tokenBalance,
|
|
1794
|
-
vUsdBalance: result.vUsdBalance,
|
|
1795
|
-
balanceRatioMinBp: result.balanceRatioMinBP,
|
|
1796
|
-
reserves: result.reserves,
|
|
1797
|
-
a: result.a,
|
|
1798
|
-
d: result.d,
|
|
1799
|
-
tokenAmountReduce: result.tokenAmountReduce,
|
|
1800
|
-
tokenAmountIncrease: result.tokenAmountIncrease,
|
|
1801
|
-
stopAuthority: result.stopAuthority,
|
|
1802
|
-
canDeposit: result.canDeposit,
|
|
1803
|
-
canWithdraw: result.canWithdraw,
|
|
1804
|
-
asset: result.asset,
|
|
1805
|
-
adminFeeShareBp: result.adminFeeShareBP,
|
|
1806
|
-
totalSupply: result.totalSupply,
|
|
1807
|
-
accRewardPerShareP: new BinaryStateValue(result.accRewardPerShareP),
|
|
1808
|
-
adminFeeAmount: result.adminFeeAmount,
|
|
1809
|
-
owner: result.owner,
|
|
1810
|
-
};
|
|
1811
|
-
},
|
|
1812
|
-
/**
|
|
1813
|
-
* Get the current value of the feeShareBP key in global state
|
|
1814
|
-
*/
|
|
1815
|
-
feeShareBp: async () => {
|
|
1816
|
-
return (await this.appClient.state.global.getValue("feeShareBP"));
|
|
1817
|
-
},
|
|
1818
|
-
/**
|
|
1819
|
-
* Get the current value of the router key in global state
|
|
1820
|
-
*/
|
|
1821
|
-
router: async () => {
|
|
1822
|
-
return (await this.appClient.state.global.getValue("router"));
|
|
1823
|
-
},
|
|
1824
|
-
/**
|
|
1825
|
-
* Get the current value of the tokenBalance key in global state
|
|
1826
|
-
*/
|
|
1827
|
-
tokenBalance: async () => {
|
|
1828
|
-
return (await this.appClient.state.global.getValue("tokenBalance"));
|
|
1829
|
-
},
|
|
1830
|
-
/**
|
|
1831
|
-
* Get the current value of the vUsdBalance key in global state
|
|
1832
|
-
*/
|
|
1833
|
-
vUsdBalance: async () => {
|
|
1834
|
-
return (await this.appClient.state.global.getValue("vUsdBalance"));
|
|
1835
|
-
},
|
|
1836
|
-
/**
|
|
1837
|
-
* Get the current value of the balanceRatioMinBP key in global state
|
|
1838
|
-
*/
|
|
1839
|
-
balanceRatioMinBp: async () => {
|
|
1840
|
-
return (await this.appClient.state.global.getValue("balanceRatioMinBP"));
|
|
1841
|
-
},
|
|
1842
|
-
/**
|
|
1843
|
-
* Get the current value of the reserves key in global state
|
|
1844
|
-
*/
|
|
1845
|
-
reserves: async () => {
|
|
1846
|
-
return (await this.appClient.state.global.getValue("reserves"));
|
|
1847
|
-
},
|
|
1848
|
-
/**
|
|
1849
|
-
* Get the current value of the a key in global state
|
|
1850
|
-
*/
|
|
1851
|
-
a: async () => {
|
|
1852
|
-
return (await this.appClient.state.global.getValue("a"));
|
|
1853
|
-
},
|
|
1854
|
-
/**
|
|
1855
|
-
* Get the current value of the d key in global state
|
|
1856
|
-
*/
|
|
1857
|
-
d: async () => {
|
|
1858
|
-
return (await this.appClient.state.global.getValue("d"));
|
|
1859
|
-
},
|
|
1860
|
-
/**
|
|
1861
|
-
* Get the current value of the tokenAmountReduce key in global state
|
|
1862
|
-
*/
|
|
1863
|
-
tokenAmountReduce: async () => {
|
|
1864
|
-
return (await this.appClient.state.global.getValue("tokenAmountReduce"));
|
|
1865
|
-
},
|
|
1866
|
-
/**
|
|
1867
|
-
* Get the current value of the tokenAmountIncrease key in global state
|
|
1868
|
-
*/
|
|
1869
|
-
tokenAmountIncrease: async () => {
|
|
1870
|
-
return (await this.appClient.state.global.getValue("tokenAmountIncrease"));
|
|
1871
|
-
},
|
|
1872
|
-
/**
|
|
1873
|
-
* Get the current value of the stopAuthority key in global state
|
|
1874
|
-
*/
|
|
1875
|
-
stopAuthority: async () => {
|
|
1876
|
-
return (await this.appClient.state.global.getValue("stopAuthority"));
|
|
1877
|
-
},
|
|
1878
|
-
/**
|
|
1879
|
-
* Get the current value of the canDeposit key in global state
|
|
1880
|
-
*/
|
|
1881
|
-
canDeposit: async () => {
|
|
1882
|
-
return (await this.appClient.state.global.getValue("canDeposit"));
|
|
1883
|
-
},
|
|
1884
|
-
/**
|
|
1885
|
-
* Get the current value of the canWithdraw key in global state
|
|
1886
|
-
*/
|
|
1887
|
-
canWithdraw: async () => {
|
|
1888
|
-
return (await this.appClient.state.global.getValue("canWithdraw"));
|
|
1889
|
-
},
|
|
1890
|
-
/**
|
|
1891
|
-
* Get the current value of the asset key in global state
|
|
1892
|
-
*/
|
|
1893
|
-
asset: async () => {
|
|
1894
|
-
return (await this.appClient.state.global.getValue("asset"));
|
|
1895
|
-
},
|
|
1896
|
-
/**
|
|
1897
|
-
* Get the current value of the adminFeeShareBP key in global state
|
|
1898
|
-
*/
|
|
1899
|
-
adminFeeShareBp: async () => {
|
|
1900
|
-
return (await this.appClient.state.global.getValue("adminFeeShareBP"));
|
|
1901
|
-
},
|
|
1902
|
-
/**
|
|
1903
|
-
* Get the current value of the totalSupply key in global state
|
|
1904
|
-
*/
|
|
1905
|
-
totalSupply: async () => {
|
|
1906
|
-
return (await this.appClient.state.global.getValue("totalSupply"));
|
|
1907
|
-
},
|
|
1908
|
-
/**
|
|
1909
|
-
* Get the current value of the accRewardPerShareP key in global state
|
|
1910
|
-
*/
|
|
1911
|
-
accRewardPerShareP: async () => {
|
|
1912
|
-
return new BinaryStateValue((await this.appClient.state.global.getValue("accRewardPerShareP")));
|
|
1913
|
-
},
|
|
1914
|
-
/**
|
|
1915
|
-
* Get the current value of the adminFeeAmount key in global state
|
|
1916
|
-
*/
|
|
1917
|
-
adminFeeAmount: async () => {
|
|
1918
|
-
return (await this.appClient.state.global.getValue("adminFeeAmount"));
|
|
1919
|
-
},
|
|
1920
|
-
/**
|
|
1921
|
-
* Get the current value of the owner key in global state
|
|
1922
|
-
*/
|
|
1923
|
-
owner: async () => {
|
|
1924
|
-
return (await this.appClient.state.global.getValue("owner"));
|
|
1925
|
-
},
|
|
1926
|
-
},
|
|
1927
|
-
/**
|
|
1928
|
-
* Methods to access local state for the current Pool app
|
|
1929
|
-
*/
|
|
1930
|
-
local: (address) => {
|
|
1931
|
-
const encodedAddress = typeof address === "string" ? address : (0, algosdk_1.encodeAddress)(address.publicKey);
|
|
1932
|
-
return {
|
|
1933
|
-
/**
|
|
1934
|
-
* Get all current keyed values from local state
|
|
1935
|
-
*/
|
|
1936
|
-
getAll: async () => {
|
|
1937
|
-
const result = await this.appClient.state.local(encodedAddress).getAll();
|
|
1938
|
-
return {
|
|
1939
|
-
balance: result.balance,
|
|
1940
|
-
userRewardDebt: result.userRewardDebt,
|
|
1941
|
-
};
|
|
1942
|
-
},
|
|
1943
|
-
/**
|
|
1944
|
-
* Get the current value of the balance key in local state
|
|
1945
|
-
*/
|
|
1946
|
-
balance: async () => {
|
|
1947
|
-
return (await this.appClient.state.local(encodedAddress).getValue("balance"));
|
|
1948
|
-
},
|
|
1949
|
-
/**
|
|
1950
|
-
* Get the current value of the userRewardDebt key in local state
|
|
1951
|
-
*/
|
|
1952
|
-
userRewardDebt: async () => {
|
|
1953
|
-
return (await this.appClient.state.local(encodedAddress).getValue("userRewardDebt"));
|
|
1954
|
-
},
|
|
1955
|
-
};
|
|
1956
|
-
},
|
|
1957
|
-
};
|
|
1958
|
-
newGroup() {
|
|
1959
|
-
const client = this;
|
|
1960
|
-
const composer = this.algorand.newGroup();
|
|
1961
|
-
let promiseChain = Promise.resolve();
|
|
1962
|
-
const resultMappers = [];
|
|
1963
|
-
return {
|
|
1964
|
-
/**
|
|
1965
|
-
* Add a optInAsset()void method call against the Pool contract
|
|
1966
|
-
*/
|
|
1967
|
-
optInAsset(params) {
|
|
1968
|
-
promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optInAsset(params)));
|
|
1969
|
-
resultMappers.push(undefined);
|
|
1970
|
-
return this;
|
|
1971
|
-
},
|
|
1972
|
-
/**
|
|
1973
|
-
* Add a noop()void method call against the Pool contract
|
|
1974
|
-
*/
|
|
1975
|
-
noop(params) {
|
|
1976
|
-
promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.noop(params)));
|
|
1977
|
-
resultMappers.push(undefined);
|
|
1978
|
-
return this;
|
|
1979
|
-
},
|
|
1980
|
-
/**
|
|
1981
|
-
* Add a deposit()void method call against the Pool contract
|
|
1982
|
-
*/
|
|
1983
|
-
deposit(params) {
|
|
1984
|
-
promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.deposit(params)));
|
|
1985
|
-
resultMappers.push(undefined);
|
|
1986
|
-
return this;
|
|
1987
|
-
},
|
|
1988
|
-
/**
|
|
1989
|
-
* Add a withdraw(uint64)void method call against the Pool contract
|
|
1990
|
-
*/
|
|
1991
|
-
withdraw(params) {
|
|
1992
|
-
promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.withdraw(params)));
|
|
1993
|
-
resultMappers.push(undefined);
|
|
1994
|
-
return this;
|
|
1995
|
-
},
|
|
1996
|
-
/**
|
|
1997
|
-
* Add a swapToVUsd(address,uint64,bool)uint64 method call against the Pool contract
|
|
1998
|
-
*/
|
|
1999
|
-
swapToVUsd(params) {
|
|
2000
|
-
promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.swapToVUsd(params)));
|
|
2001
|
-
resultMappers.push((v) => client.decodeReturnValue("swapToVUsd(address,uint64,bool)uint64", v));
|
|
2002
|
-
return this;
|
|
2003
|
-
},
|
|
2004
|
-
/**
|
|
2005
|
-
* Add a swapFromVUsd(address,uint64,uint64,bool)uint64 method call against the Pool contract
|
|
2006
|
-
*/
|
|
2007
|
-
swapFromVUsd(params) {
|
|
2008
|
-
promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.swapFromVUsd(params)));
|
|
2009
|
-
resultMappers.push((v) => client.decodeReturnValue("swapFromVUsd(address,uint64,uint64,bool)uint64", v));
|
|
2010
|
-
return this;
|
|
2011
|
-
},
|
|
2012
|
-
/**
|
|
2013
|
-
* Add a setFeeShare(uint64)void method call against the Pool contract
|
|
2014
|
-
*/
|
|
2015
|
-
setFeeShare(params) {
|
|
2016
|
-
promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setFeeShare(params)));
|
|
2017
|
-
resultMappers.push(undefined);
|
|
2018
|
-
return this;
|
|
2019
|
-
},
|
|
2020
|
-
/**
|
|
2021
|
-
* Add a adjustTotalLpAmount()void method call against the Pool contract
|
|
2022
|
-
*/
|
|
2023
|
-
adjustTotalLpAmount(params) {
|
|
2024
|
-
promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.adjustTotalLpAmount(params)));
|
|
2025
|
-
resultMappers.push(undefined);
|
|
2026
|
-
return this;
|
|
2027
|
-
},
|
|
2028
|
-
/**
|
|
2029
|
-
* Add a setBalanceRatioMinBP(uint64)void method call against the Pool contract
|
|
2030
|
-
*/
|
|
2031
|
-
setBalanceRatioMinBp(params) {
|
|
2032
|
-
promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setBalanceRatioMinBp(params)));
|
|
2033
|
-
resultMappers.push(undefined);
|
|
2034
|
-
return this;
|
|
2035
|
-
},
|
|
2036
|
-
/**
|
|
2037
|
-
* Add a stopDeposit()void method call against the Pool contract
|
|
2038
|
-
*/
|
|
2039
|
-
stopDeposit(params) {
|
|
2040
|
-
promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.stopDeposit(params)));
|
|
2041
|
-
resultMappers.push(undefined);
|
|
2042
|
-
return this;
|
|
2043
|
-
},
|
|
2044
|
-
/**
|
|
2045
|
-
* Add a startDeposit()void method call against the Pool contract
|
|
2046
|
-
*/
|
|
2047
|
-
startDeposit(params) {
|
|
2048
|
-
promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.startDeposit(params)));
|
|
2049
|
-
resultMappers.push(undefined);
|
|
2050
|
-
return this;
|
|
2051
|
-
},
|
|
2052
|
-
/**
|
|
2053
|
-
* Add a stopWithdraw()void method call against the Pool contract
|
|
2054
|
-
*/
|
|
2055
|
-
stopWithdraw(params) {
|
|
2056
|
-
promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.stopWithdraw(params)));
|
|
2057
|
-
resultMappers.push(undefined);
|
|
2058
|
-
return this;
|
|
2059
|
-
},
|
|
2060
|
-
/**
|
|
2061
|
-
* Add a startWithdraw()void method call against the Pool contract
|
|
2062
|
-
*/
|
|
2063
|
-
startWithdraw(params) {
|
|
2064
|
-
promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.startWithdraw(params)));
|
|
2065
|
-
resultMappers.push(undefined);
|
|
2066
|
-
return this;
|
|
2067
|
-
},
|
|
2068
|
-
/**
|
|
2069
|
-
* Add a setStopAuthority(address)void method call against the Pool contract
|
|
2070
|
-
*/
|
|
2071
|
-
setStopAuthority(params) {
|
|
2072
|
-
promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setStopAuthority(params)));
|
|
2073
|
-
resultMappers.push(undefined);
|
|
2074
|
-
return this;
|
|
2075
|
-
},
|
|
2076
|
-
/**
|
|
2077
|
-
* Add a setRouter(address)void method call against the Pool contract
|
|
2078
|
-
*/
|
|
2079
|
-
setRouter(params) {
|
|
2080
|
-
promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setRouter(params)));
|
|
2081
|
-
resultMappers.push(undefined);
|
|
2082
|
-
return this;
|
|
2083
|
-
},
|
|
2084
|
-
/**
|
|
2085
|
-
* Add a claimRewards()void method call against the Pool contract
|
|
2086
|
-
*/
|
|
2087
|
-
claimRewards(params) {
|
|
2088
|
-
promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.claimRewards(params)));
|
|
2089
|
-
resultMappers.push(undefined);
|
|
2090
|
-
return this;
|
|
2091
|
-
},
|
|
2092
|
-
/**
|
|
2093
|
-
* Add a setAdminFeeShare(uint64)void method call against the Pool contract
|
|
2094
|
-
*/
|
|
2095
|
-
setAdminFeeShare(params) {
|
|
2096
|
-
promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.setAdminFeeShare(params)));
|
|
2097
|
-
resultMappers.push(undefined);
|
|
2098
|
-
return this;
|
|
2099
|
-
},
|
|
2100
|
-
/**
|
|
2101
|
-
* Add a claimAdminFee()void method call against the Pool contract
|
|
2102
|
-
*/
|
|
2103
|
-
claimAdminFee(params) {
|
|
2104
|
-
promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.claimAdminFee(params)));
|
|
2105
|
-
resultMappers.push(undefined);
|
|
2106
|
-
return this;
|
|
2107
|
-
},
|
|
2108
|
-
/**
|
|
2109
|
-
* Add a pendingReward(account)uint64 method call against the Pool contract
|
|
2110
|
-
*/
|
|
2111
|
-
pendingReward(params) {
|
|
2112
|
-
promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.pendingReward(params)));
|
|
2113
|
-
resultMappers.push((v) => client.decodeReturnValue("pendingReward(account)uint64", v));
|
|
2114
|
-
return this;
|
|
2115
|
-
},
|
|
2116
|
-
/**
|
|
2117
|
-
* Add a decimals()uint64 method call against the Pool contract
|
|
2118
|
-
*/
|
|
2119
|
-
decimals(params) {
|
|
2120
|
-
promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.decimals(params)));
|
|
2121
|
-
resultMappers.push((v) => client.decodeReturnValue("decimals()uint64", v));
|
|
2122
|
-
return this;
|
|
2123
|
-
},
|
|
2124
|
-
/**
|
|
2125
|
-
* Add a transferOwnership(address)void method call against the Pool contract
|
|
2126
|
-
*/
|
|
2127
|
-
transferOwnership(params) {
|
|
2128
|
-
promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.transferOwnership(params)));
|
|
2129
|
-
resultMappers.push(undefined);
|
|
2130
|
-
return this;
|
|
2131
|
-
},
|
|
2132
|
-
get optIn() {
|
|
2133
|
-
return {
|
|
2134
|
-
optInToApplication: (params) => {
|
|
2135
|
-
promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optIn.optInToApplication(params)));
|
|
2136
|
-
resultMappers.push(undefined);
|
|
2137
|
-
return this;
|
|
2138
|
-
},
|
|
2139
|
-
};
|
|
2140
|
-
},
|
|
2141
|
-
/**
|
|
2142
|
-
* Add a clear state call to the Pool contract
|
|
2143
|
-
*/
|
|
2144
|
-
clearState(params) {
|
|
2145
|
-
promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params)));
|
|
2146
|
-
return this;
|
|
2147
|
-
},
|
|
2148
|
-
addTransaction(txn, signer) {
|
|
2149
|
-
promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer));
|
|
2150
|
-
return this;
|
|
2151
|
-
},
|
|
2152
|
-
async composer() {
|
|
2153
|
-
await promiseChain;
|
|
2154
|
-
return composer;
|
|
2155
|
-
},
|
|
2156
|
-
async simulate(options) {
|
|
2157
|
-
await promiseChain;
|
|
2158
|
-
const result = await (!options ? composer.simulate() : composer.simulate(options));
|
|
2159
|
-
return {
|
|
2160
|
-
...result,
|
|
2161
|
-
returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i](val) : val.returnValue),
|
|
2162
|
-
};
|
|
2163
|
-
},
|
|
2164
|
-
async send(params) {
|
|
2165
|
-
await promiseChain;
|
|
2166
|
-
const result = await composer.send(params);
|
|
2167
|
-
return {
|
|
2168
|
-
...result,
|
|
2169
|
-
returns: result.returns?.map((val, i) => resultMappers[i] !== undefined ? resultMappers[i](val) : val.returnValue),
|
|
2170
|
-
};
|
|
2171
|
-
},
|
|
2172
|
-
};
|
|
2173
|
-
}
|
|
2174
|
-
}
|
|
2175
|
-
exports.PoolClient = PoolClient;
|
|
2176
|
-
//# sourceMappingURL=PoolClient.js.map
|