ravcredit-lib 0.0.4 → 0.0.6

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.
Files changed (49) hide show
  1. package/fesm2022/ravcredit-lib.mjs +666 -2
  2. package/fesm2022/ravcredit-lib.mjs.map +1 -1
  3. package/index.d.ts +1598 -4
  4. package/package.json +3 -4
  5. package/esm2022/lib/ravcredit-lib.component.mjs +0 -19
  6. package/esm2022/lib/ravcredit-lib.service.mjs +0 -14
  7. package/esm2022/lib/v1/objects/oAddress.mjs +0 -10
  8. package/esm2022/lib/v1/objects/oBusiness.mjs +0 -2
  9. package/esm2022/lib/v1/objects/oClient.mjs +0 -2
  10. package/esm2022/lib/v1/objects/oConekta.mjs +0 -85
  11. package/esm2022/lib/v1/objects/oContract.mjs +0 -2
  12. package/esm2022/lib/v1/objects/oContractAll.mjs +0 -2
  13. package/esm2022/lib/v1/objects/oCustomer.mjs +0 -18
  14. package/esm2022/lib/v1/objects/oDevice.mjs +0 -2
  15. package/esm2022/lib/v1/objects/oFinancial.mjs +0 -2
  16. package/esm2022/lib/v1/objects/oGlobal.mjs +0 -86
  17. package/esm2022/lib/v1/objects/oLogIn.mjs +0 -17
  18. package/esm2022/lib/v1/objects/oNewPayment.mjs +0 -2
  19. package/esm2022/lib/v1/objects/oNotification.mjs +0 -17
  20. package/esm2022/lib/v1/objects/oPassport.mjs +0 -7
  21. package/esm2022/lib/v1/objects/oUser.mjs +0 -2
  22. package/esm2022/lib/v1/util/UtilBusiness.mjs +0 -171
  23. package/esm2022/lib/v1/util/UtilClient.mjs +0 -221
  24. package/esm2022/lib/v1/util/UtilContract.mjs +0 -331
  25. package/esm2022/lib/v1/util/UtilDynamiCore.mjs +0 -292
  26. package/esm2022/public-api.mjs +0 -25
  27. package/esm2022/ravcredit-lib.mjs +0 -5
  28. package/lib/ravcredit-lib.component.d.ts +0 -5
  29. package/lib/ravcredit-lib.service.d.ts +0 -6
  30. package/lib/v1/objects/oAddress.d.ts +0 -10
  31. package/lib/v1/objects/oBusiness.d.ts +0 -101
  32. package/lib/v1/objects/oClient.d.ts +0 -43
  33. package/lib/v1/objects/oConekta.d.ts +0 -305
  34. package/lib/v1/objects/oContract.d.ts +0 -23
  35. package/lib/v1/objects/oContractAll.d.ts +0 -21
  36. package/lib/v1/objects/oCustomer.d.ts +0 -17
  37. package/lib/v1/objects/oDevice.d.ts +0 -5
  38. package/lib/v1/objects/oFinancial.d.ts +0 -30
  39. package/lib/v1/objects/oGlobal.d.ts +0 -149
  40. package/lib/v1/objects/oLogIn.d.ts +0 -30
  41. package/lib/v1/objects/oNewPayment.d.ts +0 -11
  42. package/lib/v1/objects/oNotification.d.ts +0 -25
  43. package/lib/v1/objects/oPassport.d.ts +0 -55
  44. package/lib/v1/objects/oUser.d.ts +0 -25
  45. package/lib/v1/util/UtilBusiness.d.ts +0 -52
  46. package/lib/v1/util/UtilClient.d.ts +0 -34
  47. package/lib/v1/util/UtilContract.d.ts +0 -70
  48. package/lib/v1/util/UtilDynamiCore.d.ts +0 -453
  49. package/public-api.d.ts +0 -21
@@ -1,331 +0,0 @@
1
- import { UntypedFormArray, UntypedFormControl, Validators } from "@angular/forms";
2
- import { cClient, cUserReference } from "./UtilClient";
3
- // import {TaskState} from "firebase/storage";
4
- import { cBusinessDeadlines } from "./UtilBusiness";
5
- import { cAddress } from '../objects/oAddress';
6
- export var eProvider;
7
- (function (eProvider) {
8
- eProvider["none"] = "";
9
- eProvider["Conekta"] = "Conekta";
10
- eProvider["Passport"] = "Passport";
11
- eProvider["DynamiCore"] = "DynamiCore";
12
- })(eProvider || (eProvider = {}));
13
- // export type ProgressTaskStatus = TaskState | "uploading" | "idle" | "generating" | "unauthorized"
14
- export const cDevice = {
15
- device: "",
16
- IMEI: ""
17
- };
18
- export const cFinancial = {
19
- total: 0,
20
- initial: 0,
21
- deadlines: cBusinessDeadlines,
22
- initDate: 0,
23
- weeklyPayment: 0,
24
- pendingOf: [],
25
- progress: [],
26
- interest: 0,
27
- provider: eProvider.DynamiCore,
28
- financed: 0,
29
- nextPayment: 0,
30
- amount_commission_opening: 0,
31
- principal_disbursed: 0,
32
- expected_disbursed: 0, // ---------
33
- credit_type: 'Arrendamiento',
34
- interest_rate: 0,
35
- commission_opening: 0,
36
- interest_arrears: 0,
37
- };
38
- export const cContract = {
39
- id: "",
40
- client: "",
41
- address: cAddress,
42
- device: cDevice,
43
- financial: cFinancial,
44
- by: "",
45
- active: true
46
- };
47
- export class FactoryContract {
48
- static FormClient(client) {
49
- let data = cClient;
50
- if (client)
51
- data = client;
52
- return {
53
- name: new UntypedFormControl(data.name, [Validators.required, Validators.minLength(10)]),
54
- email: new UntypedFormControl(data.username, [Validators.required, Validators.email]),
55
- phone: new UntypedFormControl(data.phone, [Validators.required, Validators.min(10)]),
56
- curp: new UntypedFormControl(data.curp, [Validators.required, Validators.minLength(16)]),
57
- userReferences: new UntypedFormArray([])
58
- };
59
- }
60
- static CreateUserReferenceFormObj(user) {
61
- let data = cUserReference;
62
- if (user.name != "")
63
- data = user;
64
- return {
65
- name: new UntypedFormControl(data.name, [Validators.required, Validators.minLength(10)]),
66
- phone: new UntypedFormControl(data.phone, [Validators.required]),
67
- relationship: new UntypedFormControl(data.relationship, [Validators.required]),
68
- };
69
- }
70
- static FormAddress(address) {
71
- let data = cAddress;
72
- if (address)
73
- data = address;
74
- return {
75
- street: new UntypedFormControl(data.street, Validators.required),
76
- neighbor: new UntypedFormControl(data.neighbor, Validators.required),
77
- cp: new UntypedFormControl(data.zip, Validators.required),
78
- ext: new UntypedFormControl(data.ext, Validators.required),
79
- int: new UntypedFormControl(data.int),
80
- city: new UntypedFormControl(data.city, Validators.required),
81
- state: new UntypedFormControl(data.state, Validators.required),
82
- };
83
- }
84
- static FormDevice(device) {
85
- let data = cDevice;
86
- if (device)
87
- data = device;
88
- return {
89
- model: new UntypedFormControl(data.device, Validators.required),
90
- IMEI: new UntypedFormControl(data.IMEI, Validators.required),
91
- ID: new UntypedFormControl(data.id),
92
- };
93
- }
94
- static FormFinancial(financial) {
95
- let data = cFinancial;
96
- if (financial)
97
- data = financial;
98
- data.credit_type = "Arrendamiento";
99
- // data.deadlines.weeks = cBusinessDeadlines
100
- return {
101
- total: new UntypedFormControl(data.total, [Validators.required, Validators.min(1)]),
102
- initial: new UntypedFormControl(data.initial, [Validators.required]),
103
- financed: new UntypedFormControl(data.financed, Validators.min(1)),
104
- weeklyPayment: new UntypedFormControl(data.weeklyPayment, [Validators.required, Validators.min(1)]),
105
- deadlines: new UntypedFormControl(data.deadlines, [Validators.required]),
106
- initDate: new UntypedFormControl(data.initDate),
107
- provider: new UntypedFormControl(data.provider),
108
- credit_type: new UntypedFormControl(data.credit_type ? data.credit_type : 0),
109
- interest_rate: new UntypedFormControl(data.interest_rate ? data.interest_rate : 0), // interes credit dynamic
110
- commission_opening: new UntypedFormControl(data.commission_opening ? data.commission_opening : 0),
111
- interest_arrears: new UntypedFormControl(data.interest_arrears ? data.interest_arrears : 0), // intereses moratorios dynamic
112
- amount_commission_opening: new UntypedFormControl(data.amount_commission_opening), // comision por apertura dynamic
113
- principal_disbursed: new UntypedFormControl(data.principal_disbursed),
114
- expected_disbursed: new UntypedFormControl(data.expected_disbursed)
115
- };
116
- }
117
- static CreateContractFromFormObj(data, finalPay) {
118
- const date = new Date();
119
- const device = {
120
- device: data["device"][0].model,
121
- id: data["device"][0].ID,
122
- IMEI: data["device"][0].IMEI
123
- };
124
- const address = {
125
- street: data["address"][0].street,
126
- city: data["address"][0].city,
127
- neighbor: data["address"][0].neighbor,
128
- zip: data["address"][0].cp,
129
- ext: data["address"][0].ext,
130
- int: data["address"][0].int,
131
- state: data["address"][0].state
132
- };
133
- const financial = {
134
- total: Number(data["financial"][0].total),
135
- initial: data["financial"][0].initial,
136
- deadlines: data["financial"][0].deadlines,
137
- progress: [],
138
- pendingOf: [],
139
- weeklyPayment: data["financial"][0].weeklyPayment,
140
- interest: data["financial"][0].interest_rate,
141
- finalDate: date.getTime() + (data["financial"][0].deadlines.weeks * (604800 * 1000)),
142
- initDate: date.getDate(),
143
- dayCut: date.getDate(),
144
- provider: data["financial"][0].provider,
145
- finalPayment: finalPay,
146
- financed: data["financial"][0].financed,
147
- nextPayment: data["financial"][0].nextPayment
148
- };
149
- if (data["financial"][0].provider == eProvider.DynamiCore) {
150
- financial.initial = data["financial"][0].amount_commission_opening ? Number(data["financial"][0].amount_commission_opening) : 0;
151
- financial.expected_disbursed = data["financial"][0].expected_disbursed ? Number(data["financial"][0].expected_disbursed) : 0;
152
- financial.principal_disbursed = data["financial"][0].principal_disbursed ? Number(data["financial"][0].principal_disbursed) : 0;
153
- financial.interest_arrears = data["financial"][0].interest_rate ? Number(data["financial"][0].interest_rate) : 0;
154
- financial.commission_opening = data["financial"][0].commission_opening ? Number(data["financial"][0].commission_opening) : 0;
155
- financial.credit_type = data["financial"][0].credit_type ? data["financial"][0].credit_type : "";
156
- financial.clabe = data["financial"][0].clabe ? data["financial"][0].clabe : "";
157
- }
158
- if (data["financial"][0].amount_commission_opening != undefined) {
159
- if (Number(data["financial"][0].amount_commission_opening) > 0)
160
- financial.initial = Number(data["financial"][0].amount_commission_opening);
161
- else
162
- financial.initial = Number(data["financial"][0].initial);
163
- }
164
- if (Number(data["financial"][0].amount_commission_opening) > 0)
165
- financial.amount_commission_opening = Number(data["financial"][0].amount_commission_opening);
166
- else
167
- financial.amount_commission_opening = financial.initial;
168
- if (financial.nextPayment == undefined)
169
- financial.nextPayment = 0;
170
- const contract = {
171
- id: "",
172
- client: "",
173
- address: address,
174
- device: device,
175
- financial: financial,
176
- by: "",
177
- active: true,
178
- lastPayment: date.getTime(),
179
- createdAt: date.getTime()
180
- };
181
- return contract;
182
- }
183
- static CreateContractToConektaObj(data, monthlyPay, finalPay) {
184
- const o = {};
185
- const device = {
186
- device: data.device.device,
187
- id: data.device.id,
188
- IMEI: data.device.IMEI
189
- };
190
- const address = {
191
- street: data.address.street,
192
- city: data.address.city,
193
- neighbor: data.address.neighbor,
194
- zip: data.address.zip,
195
- ext: data.address.ext,
196
- int: data.address.int,
197
- state: data.address.state
198
- };
199
- const financial = {
200
- total: data.financial.total,
201
- initial: data.financial.initial,
202
- deadlines: data.financial.deadlines,
203
- progress: data.financial.progress,
204
- pendingOf: data.financial.pendingOf,
205
- weeklyPayment: data.financial.weeklyPayment,
206
- interest: data.financial.interest,
207
- finalDate: data.financial.finalDate,
208
- initDate: data.financial.initDate,
209
- dayCut: data.financial.dayCut,
210
- provider: data.financial.provider,
211
- finalPayment: data.financial.finalPayment,
212
- financed: data.financial.financed,
213
- nextPayment: data.financial.nextPayment
214
- };
215
- const contract = {
216
- id: "",
217
- client: "",
218
- address: address,
219
- device: device,
220
- financial: financial,
221
- by: "",
222
- active: true
223
- };
224
- return contract;
225
- }
226
- static CreateAuthForm(username, curp) {
227
- const password = this.createPassword(curp);
228
- return {
229
- username: new UntypedFormControl(username, Validators.required),
230
- password: new UntypedFormControl(password, Validators.required),
231
- };
232
- }
233
- static createPassword(curp) {
234
- const _curp = curp.split("");
235
- let password = "";
236
- const limit = 7;
237
- if (_curp.length < 16)
238
- return "";
239
- password += _curp[0].toLowerCase();
240
- for (let i = 1; i <= limit; i++)
241
- password += _curp[i].toUpperCase();
242
- password += `*`;
243
- return password;
244
- }
245
- static MapperTypeContCli_Contract(_contract) {
246
- const contract = {
247
- id: _contract.contract,
248
- client: _contract.client,
249
- address: _contract.address,
250
- device: _contract.device,
251
- financial: _contract.financial,
252
- by: _contract.by,
253
- active: _contract.active,
254
- lastPayment: _contract.lastPayment,
255
- createdAt: _contract.createdAt,
256
- dynamicAccount: _contract.dynamicAccount,
257
- };
258
- return contract;
259
- }
260
- static MapperSyncContractDynamic(base, account) {
261
- let nContract = base;
262
- let _financial = base.financial;
263
- let _device = base.device;
264
- const financial = {
265
- total: _financial.total,
266
- initial: account.properties.amount_commission_opening ? account.properties.amount_commission_opening : _financial.initial,
267
- deadlines: _financial.deadlines,
268
- progress: _financial.progress ? _financial.progress : [],
269
- pendingOf: _financial.pendingOf ? _financial.pendingOf : [],
270
- weeklyPayment: _financial.weeklyPayment,
271
- interest: _financial.interest,
272
- finalDate: _financial.finalDate,
273
- initDate: _financial.initDate,
274
- dayCut: _financial.dayCut,
275
- provider: _financial.provider,
276
- finalPayment: _financial.finalPayment,
277
- financed: _financial.financed,
278
- nextPayment: _financial.nextPayment ? _financial.nextPayment : 0,
279
- amount_commission_opening: account.properties.amount_commission_opening,
280
- expected_disbursed: account.properties.expected_disbursed ?
281
- Number(account.properties.expected_disbursed) :
282
- Number(_financial.expected_disbursed),
283
- principal_disbursed: account.properties.principal_disbursed ?
284
- account.properties.principal_disbursed :
285
- _financial.principal_disbursed,
286
- commission_opening: account.config.commission_opening ?
287
- Number(account.config.commission_opening) :
288
- Number(_financial.commission_opening),
289
- credit_type: account.config.credit_type ? account.config.credit_type : _financial.credit_type,
290
- clabe: String(account.properties.clabe ? account.properties.clabe : _financial.clabe)
291
- };
292
- const interestArrears = account.config.interest_arrears;
293
- const prevInterestArrears = _financial.interest_arrears;
294
- if (interestArrears != undefined) {
295
- financial.interest_arrears = interestArrears;
296
- }
297
- else if (prevInterestArrears != undefined) {
298
- financial.interest_arrears = prevInterestArrears;
299
- }
300
- else {
301
- financial.interest_arrears = 0;
302
- }
303
- const interest = account.config.interest_rate;
304
- const prevInterest = _financial.interest;
305
- if (interest != undefined) {
306
- financial.interest = interest;
307
- }
308
- else if (prevInterest != undefined) {
309
- financial.interest = prevInterest;
310
- }
311
- else {
312
- financial.interest = 0;
313
- }
314
- if (account.properties.amount_commission_opening != undefined) {
315
- if (Number(account.properties.amount_commission_opening) > 0) {
316
- financial.initial = Number(account.properties.amount_commission_opening);
317
- financial.amount_commission_opening = Number(account.properties.amount_commission_opening);
318
- }
319
- else {
320
- financial.initial = Number(_financial.initial);
321
- financial.amount_commission_opening = financial.initial;
322
- }
323
- }
324
- const seller = account.properties.seller_name;
325
- nContract.by = seller != null ? seller : "";
326
- nContract.device.id = _device.id ? _device.id : "";
327
- nContract.financial = financial;
328
- return nContract;
329
- }
330
- }
331
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXRpbENvbnRyYWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmF2Y3JlZGl0LWxpYi9zcmMvbGliL3YxL3V0aWwvVXRpbENvbnRyYWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRixPQUFPLEVBQUMsT0FBTyxFQUFFLGNBQWMsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNyRCw4Q0FBOEM7QUFDOUMsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFJbEQsT0FBTyxFQUFDLFFBQVEsRUFBVyxNQUFNLHFCQUFxQixDQUFDO0FBS3ZELE1BQU0sQ0FBTixJQUFZLFNBS1g7QUFMRCxXQUFZLFNBQVM7SUFDbkIsc0JBQVMsQ0FBQTtJQUNULGdDQUFtQixDQUFBO0lBQ25CLGtDQUFxQixDQUFBO0lBQ3JCLHNDQUF5QixDQUFBO0FBQzNCLENBQUMsRUFMVyxTQUFTLEtBQVQsU0FBUyxRQUtwQjtBQUVELG9HQUFvRztBQUVwRyxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQVk7SUFDOUIsTUFBTSxFQUFFLEVBQUU7SUFDVixJQUFJLEVBQUUsRUFBRTtDQUNULENBQUE7QUFFRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWU7SUFDcEMsS0FBSyxFQUFFLENBQUM7SUFDUixPQUFPLEVBQUUsQ0FBQztJQUNWLFNBQVMsRUFBRSxrQkFBa0I7SUFDN0IsUUFBUSxFQUFFLENBQUM7SUFDWCxhQUFhLEVBQUUsQ0FBQztJQUNoQixTQUFTLEVBQUUsRUFBRTtJQUNiLFFBQVEsRUFBRSxFQUFFO0lBQ1osUUFBUSxFQUFFLENBQUM7SUFDWCxRQUFRLEVBQUUsU0FBUyxDQUFDLFVBQVU7SUFDOUIsUUFBUSxFQUFFLENBQUM7SUFDWCxXQUFXLEVBQUUsQ0FBQztJQUNkLHlCQUF5QixFQUFFLENBQUM7SUFDNUIsbUJBQW1CLEVBQUUsQ0FBQztJQUN0QixrQkFBa0IsRUFBRSxDQUFDLEVBQUUsWUFBWTtJQUNuQyxXQUFXLEVBQUUsZUFBZTtJQUM1QixhQUFhLEVBQUUsQ0FBQztJQUNoQixrQkFBa0IsRUFBRSxDQUFDO0lBQ3JCLGdCQUFnQixFQUFFLENBQUM7Q0FDcEIsQ0FBQTtBQUVELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBYztJQUNsQyxFQUFFLEVBQUUsRUFBRTtJQUNOLE1BQU0sRUFBRSxFQUFFO0lBQ1YsT0FBTyxFQUFFLFFBQVE7SUFDakIsTUFBTSxFQUFFLE9BQU87SUFDZixTQUFTLEVBQUUsVUFBVTtJQUNyQixFQUFFLEVBQUUsRUFBRTtJQUNOLE1BQU0sRUFBRSxJQUFJO0NBQ2IsQ0FBQTtBQUVELE1BQU0sT0FBTyxlQUFlO0lBRW5CLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBZ0I7UUFDdkMsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFBO1FBRWxCLElBQUksTUFBTTtZQUFFLElBQUksR0FBRyxNQUFNLENBQUE7UUFFekIsT0FBTztZQUNMLElBQUksRUFBRSxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN4RixLQUFLLEVBQUUsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckYsS0FBSyxFQUFFLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3BGLElBQUksRUFBRSxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN4RixjQUFjLEVBQUUsSUFBSSxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7U0FDekMsQ0FBQTtJQUNILENBQUM7SUFFTSxNQUFNLENBQUMsMEJBQTBCLENBQUMsSUFBb0I7UUFDM0QsSUFBSSxJQUFJLEdBQUcsY0FBYyxDQUFBO1FBRXpCLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFO1lBQUUsSUFBSSxHQUFHLElBQUksQ0FBQTtRQUVoQyxPQUFPO1lBQ0wsSUFBSSxFQUFFLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3hGLEtBQUssRUFBRSxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDaEUsWUFBWSxFQUFFLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUMvRSxDQUFBO0lBQ0gsQ0FBQztJQUVNLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBa0I7UUFDMUMsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFBO1FBRW5CLElBQUksT0FBTztZQUFFLElBQUksR0FBRyxPQUFPLENBQUE7UUFFM0IsT0FBTztZQUNMLE1BQU0sRUFBRSxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUNoRSxRQUFRLEVBQUUsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDcEUsRUFBRSxFQUFFLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQ3pELEdBQUcsRUFBRSxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUMxRCxHQUFHLEVBQUUsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1lBQ3JDLElBQUksRUFBRSxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUM1RCxLQUFLLEVBQUUsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7U0FDL0QsQ0FBQTtJQUNILENBQUM7SUFFTSxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQWdCO1FBQ3ZDLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQTtRQUVsQixJQUFJLE1BQU07WUFBRSxJQUFJLEdBQUcsTUFBTSxDQUFBO1FBRXpCLE9BQU87WUFDTCxLQUFLLEVBQUUsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDL0QsSUFBSSxFQUFFLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQzVELEVBQUUsRUFBRSxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7U0FDcEMsQ0FBQTtJQUNILENBQUM7SUFFTSxNQUFNLENBQUMsYUFBYSxDQUFDLFNBQXNCO1FBQ2hELElBQUksSUFBSSxHQUFHLFVBQVUsQ0FBQTtRQUVyQixJQUFJLFNBQVM7WUFBRSxJQUFJLEdBQUcsU0FBUyxDQUFBO1FBRS9CLElBQUksQ0FBQyxXQUFXLEdBQUcsZUFBZSxDQUFBO1FBQ2xDLDRDQUE0QztRQUU1QyxPQUFPO1lBQ0wsS0FBSyxFQUFFLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25GLE9BQU8sRUFBRSxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDcEUsUUFBUSxFQUFFLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xFLGFBQWEsRUFBRSxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuRyxTQUFTLEVBQUUsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3hFLFFBQVEsRUFBRSxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDL0MsUUFBUSxFQUFFLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUUvQyxXQUFXLEVBQUUsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUUsYUFBYSxFQUFFLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUseUJBQXlCO1lBQzdHLGtCQUFrQixFQUFFLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqRyxnQkFBZ0IsRUFBRSxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSwrQkFBK0I7WUFFNUgseUJBQXlCLEVBQUUsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsRUFBRSxnQ0FBZ0M7WUFDbkgsbUJBQW1CLEVBQUUsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUM7WUFDckUsa0JBQWtCLEVBQUUsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUM7U0FDcEUsQ0FBQTtJQUNILENBQUM7SUFFTSxNQUFNLENBQUMseUJBQXlCLENBQUMsSUFBUyxFQUFFLFFBQWdCO1FBQ2pFLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUE7UUFFdkIsTUFBTSxNQUFNLEdBQVk7WUFDdEIsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLO1lBQy9CLEVBQUUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUN4QixJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7U0FDN0IsQ0FBQTtRQUNELE1BQU0sT0FBTyxHQUFhO1lBQ3hCLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTTtZQUNqQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDN0IsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRO1lBQ3JDLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUMxQixHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUc7WUFDM0IsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHO1lBQzNCLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSztTQUNoQyxDQUFBO1FBRUQsTUFBTSxTQUFTLEdBQWU7WUFDNUIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQ3pDLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTztZQUNyQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDekMsUUFBUSxFQUFFLEVBQUU7WUFDWixTQUFTLEVBQUUsRUFBRTtZQUNiLGFBQWEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYTtZQUNqRCxRQUFRLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWE7WUFDNUMsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQ3BGLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ3hCLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ3RCLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUTtZQUN2QyxZQUFZLEVBQUUsUUFBUTtZQUN0QixRQUFRLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVE7WUFDdkMsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXO1NBQzlDLENBQUE7UUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzFELFNBQVMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUMvSCxTQUFTLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUM1SCxTQUFTLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUMvSCxTQUFTLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ2hILFNBQVMsQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQzVILFNBQVMsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1lBQ2hHLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1FBQ2hGLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyx5QkFBeUIsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNoRSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMseUJBQXlCLENBQUMsR0FBRyxDQUFDO2dCQUM1RCxTQUFTLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMseUJBQXlCLENBQUMsQ0FBQTs7Z0JBRTFFLFNBQVMsQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUM1RCxDQUFDO1FBRUQsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHlCQUF5QixDQUFDLEdBQUcsQ0FBQztZQUM1RCxTQUFTLENBQUMseUJBQXlCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFBOztZQUU1RixTQUFTLENBQUMseUJBQXlCLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQTtRQUV6RCxJQUFJLFNBQVMsQ0FBQyxXQUFXLElBQUksU0FBUztZQUFFLFNBQVMsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFBO1FBRWpFLE1BQU0sUUFBUSxHQUFjO1lBQzFCLEVBQUUsRUFBRSxFQUFFO1lBQ04sTUFBTSxFQUFFLEVBQUU7WUFDVixPQUFPLEVBQUUsT0FBTztZQUNoQixNQUFNLEVBQUUsTUFBTTtZQUNkLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLEVBQUUsRUFBRSxFQUFFO1lBQ04sTUFBTSxFQUFFLElBQUk7WUFDWixXQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUMzQixTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRTtTQUMxQixDQUFBO1FBQ0QsT0FBTyxRQUFRLENBQUE7SUFDakIsQ0FBQztJQUVNLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxJQUFlLEVBQUUsVUFBa0IsRUFBRSxRQUFnQjtRQUM1RixNQUFNLENBQUMsR0FBUSxFQUFFLENBQUE7UUFFakIsTUFBTSxNQUFNLEdBQVk7WUFDdEIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTTtZQUMxQixFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ2xCLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUk7U0FDdkIsQ0FBQTtRQUNELE1BQU0sT0FBTyxHQUFhO1lBQ3hCLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU07WUFDM0IsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSTtZQUN2QixRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRO1lBQy9CLEdBQUcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUc7WUFDckIsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRztZQUNyQixHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHO1lBQ3JCLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUs7U0FDMUIsQ0FBQTtRQUNELE1BQU0sU0FBUyxHQUFlO1lBQzVCLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUs7WUFDM0IsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTztZQUMvQixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTO1lBQ25DLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVE7WUFDakMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUztZQUNuQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhO1lBQzNDLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVE7WUFDakMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUztZQUNuQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRO1lBQ2pDLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU07WUFDN0IsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUTtZQUNqQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZO1lBQ3pDLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVE7WUFDakMsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVztTQUN4QyxDQUFBO1FBQ0QsTUFBTSxRQUFRLEdBQWM7WUFDMUIsRUFBRSxFQUFFLEVBQUU7WUFDTixNQUFNLEVBQUUsRUFBRTtZQUNWLE9BQU8sRUFBRSxPQUFPO1lBQ2hCLE1BQU0sRUFBRSxNQUFNO1lBQ2QsU0FBUyxFQUFFLFNBQVM7WUFDcEIsRUFBRSxFQUFFLEVBQUU7WUFDTixNQUFNLEVBQUUsSUFBSTtTQUNiLENBQUE7UUFDRCxPQUFPLFFBQVEsQ0FBQTtJQUNqQixDQUFDO0lBRU0sTUFBTSxDQUFDLGNBQWMsQ0FBQyxRQUFnQixFQUFFLElBQVk7UUFDekQsTUFBTSxRQUFRLEdBQVcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNsRCxPQUFPO1lBQ0wsUUFBUSxFQUFFLElBQUksa0JBQWtCLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDL0QsUUFBUSxFQUFFLElBQUksa0JBQWtCLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7U0FDaEUsQ0FBQTtJQUNILENBQUM7SUFFTSxNQUFNLENBQUMsY0FBYyxDQUFDLElBQVk7UUFDdkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUM1QixJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUE7UUFDakIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFBO1FBRWYsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLEVBQUU7WUFBRSxPQUFPLEVBQUUsQ0FBQTtRQUVoQyxRQUFRLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFBO1FBRWxDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxFQUFFO1lBQzdCLFFBQVEsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUE7UUFFcEMsUUFBUSxJQUFJLEdBQUcsQ0FBQTtRQUNmLE9BQU8sUUFBUSxDQUFBO0lBQ2pCLENBQUM7SUFFTSxNQUFNLENBQUMsMEJBQTBCLENBQUMsU0FBMkI7UUFDbEUsTUFBTSxRQUFRLEdBQWM7WUFDMUIsRUFBRSxFQUFFLFNBQVMsQ0FBQyxRQUFTO1lBQ3ZCLE1BQU0sRUFBRSxTQUFTLENBQUMsTUFBTTtZQUN4QixPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQU87WUFDMUIsTUFBTSxFQUFFLFNBQVMsQ0FBQyxNQUFNO1lBQ3hCLFNBQVMsRUFBRSxTQUFTLENBQUMsU0FBUztZQUM5QixFQUFFLEVBQUUsU0FBUyxDQUFDLEVBQUU7WUFDaEIsTUFBTSxFQUFFLFNBQVMsQ0FBQyxNQUFNO1lBQ3hCLFdBQVcsRUFBRSxTQUFTLENBQUMsV0FBVztZQUNsQyxTQUFTLEVBQUUsU0FBUyxDQUFDLFNBQVM7WUFDOUIsY0FBYyxFQUFFLFNBQVMsQ0FBQyxjQUFjO1NBQ3pDLENBQUE7UUFFRCxPQUFPLFFBQVEsQ0FBQTtJQUNqQixDQUFDO0lBRU0sTUFBTSxDQUFDLHlCQUF5QixDQUFDLElBQWUsRUFBRSxPQUFtQjtRQUMxRSxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUE7UUFDcEIsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQTtRQUMvQixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFBO1FBR3pCLE1BQU0sU0FBUyxHQUFlO1lBQzVCLEtBQUssRUFBRSxVQUFVLENBQUMsS0FBSztZQUN2QixPQUFPLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU87WUFDekgsU0FBUyxFQUFFLFVBQVUsQ0FBQyxTQUFTO1lBQy9CLFFBQVEsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3hELFNBQVMsRUFBRSxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQzNELGFBQWEsRUFBRSxVQUFVLENBQUMsYUFBYTtZQUN2QyxRQUFRLEVBQUUsVUFBVSxDQUFDLFFBQVE7WUFDN0IsU0FBUyxFQUFFLFVBQVUsQ0FBQyxTQUFTO1lBQy9CLFFBQVEsRUFBRSxVQUFVLENBQUMsUUFBUTtZQUM3QixNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU07WUFDekIsUUFBUSxFQUFFLFVBQVUsQ0FBQyxRQUFRO1lBQzdCLFlBQVksRUFBRSxVQUFVLENBQUMsWUFBWTtZQUNyQyxRQUFRLEVBQUUsVUFBVSxDQUFDLFFBQVE7WUFDN0IsV0FBVyxFQUFFLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFaEUseUJBQXlCLEVBQ3pCLE9BQU8sQ0FBQyxVQUFVLENBQUMseUJBQXlCO1lBRTVDLGtCQUFrQixFQUNoQixPQUFPLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLENBQUM7Z0JBQ3JDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQztnQkFDL0MsTUFBTSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQztZQUV6QyxtQkFBbUIsRUFDakIsT0FBTyxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO2dCQUN0QyxPQUFPLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLENBQUM7Z0JBQ3hDLFVBQVUsQ0FBQyxtQkFBbUI7WUFFbEMsa0JBQWtCLEVBQ2hCLE9BQU8sQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztnQkFDakMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO2dCQUMzQyxNQUFNLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDO1lBRXpDLFdBQVcsRUFDVCxPQUFPLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxXQUFXO1lBRWxGLEtBQUssRUFDSCxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDO1NBQ2pGLENBQUE7UUFFRCxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFBO1FBQ3ZELE1BQU0sbUJBQW1CLEdBQUcsVUFBVSxDQUFDLGdCQUFnQixDQUFBO1FBQ3ZELElBQUksZUFBZSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2pDLFNBQVMsQ0FBQyxnQkFBZ0IsR0FBRyxlQUFlLENBQUE7UUFDOUMsQ0FBQzthQUFNLElBQUksbUJBQW1CLElBQUksU0FBUyxFQUFFLENBQUM7WUFDNUMsU0FBUyxDQUFDLGdCQUFnQixHQUFHLG1CQUFtQixDQUFBO1FBQ2xELENBQUM7YUFBTSxDQUFDO1lBQ04sU0FBUyxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQTtRQUNoQyxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUE7UUFDN0MsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQTtRQUN4QyxJQUFJLFFBQVEsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUMxQixTQUFTLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtRQUMvQixDQUFDO2FBQU0sSUFBSSxZQUFZLElBQUksU0FBUyxFQUFFLENBQUM7WUFDckMsU0FBUyxDQUFDLFFBQVEsR0FBRyxZQUFZLENBQUE7UUFDbkMsQ0FBQzthQUFNLENBQUM7WUFDTixTQUFTLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQTtRQUN4QixDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLHlCQUF5QixJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQzlELElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMseUJBQXlCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDN0QsU0FBUyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFBO2dCQUN4RSxTQUFTLENBQUMseUJBQXlCLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMseUJBQXlCLENBQUMsQ0FBQTtZQUM1RixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sU0FBUyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFBO2dCQUM5QyxTQUFTLENBQUMseUJBQXlCLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQTtZQUN6RCxDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUF1QixPQUFPLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQTtRQUNqRSxTQUFTLENBQUMsRUFBRSxHQUFHLE1BQU0sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1FBRTNDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtRQUVsRCxTQUFTLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQTtRQUMvQixPQUFPLFNBQVMsQ0FBQTtJQUNsQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1VudHlwZWRGb3JtQXJyYXksIFVudHlwZWRGb3JtQ29udHJvbCwgVmFsaWRhdG9yc30gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQge2NDbGllbnQsIGNVc2VyUmVmZXJlbmNlfSBmcm9tIFwiLi9VdGlsQ2xpZW50XCI7XG4vLyBpbXBvcnQge1Rhc2tTdGF0ZX0gZnJvbSBcImZpcmViYXNlL3N0b3JhZ2VcIjtcbmltcG9ydCB7Y0J1c2luZXNzRGVhZGxpbmVzfSBmcm9tIFwiLi9VdGlsQnVzaW5lc3NcIjtcbmltcG9ydCB7SURDQWNjb3VudH0gZnJvbSBcIi4vVXRpbER5bmFtaUNvcmVcIjtcbmltcG9ydCB7b0RldmljZX0gZnJvbSAnLi4vb2JqZWN0cy9vRGV2aWNlJztcbmltcG9ydCB7b0ZpbmFuY2lhbH0gZnJvbSAnLi4vb2JqZWN0cy9vRmluYW5jaWFsJztcbmltcG9ydCB7Y0FkZHJlc3MsIG9BZGRyZXNzfSBmcm9tICcuLi9vYmplY3RzL29BZGRyZXNzJztcbmltcG9ydCB7b0NvbnRyYWN0fSBmcm9tICcuLi9vYmplY3RzL29Db250cmFjdCc7XG5pbXBvcnQge29DbGllbnQsIG9Vc2VyUmVmZXJlbmNlfSBmcm9tICcuLi9vYmplY3RzL29DbGllbnQnO1xuaW1wb3J0IHt0eUNsaWVudENvbnRyYWN0fSBmcm9tICcuLi9vYmplY3RzL29HbG9iYWwnO1xuXG5leHBvcnQgZW51bSBlUHJvdmlkZXIge1xuICBub25lID0gXCJcIixcbiAgQ29uZWt0YSA9IFwiQ29uZWt0YVwiLFxuICBQYXNzcG9ydCA9IFwiUGFzc3BvcnRcIixcbiAgRHluYW1pQ29yZSA9IFwiRHluYW1pQ29yZVwiLFxufVxuXG4vLyBleHBvcnQgdHlwZSBQcm9ncmVzc1Rhc2tTdGF0dXMgPSBUYXNrU3RhdGUgfCBcInVwbG9hZGluZ1wiIHwgXCJpZGxlXCIgfCBcImdlbmVyYXRpbmdcIiB8IFwidW5hdXRob3JpemVkXCJcblxuZXhwb3J0IGNvbnN0IGNEZXZpY2U6IG9EZXZpY2UgPSB7XG4gIGRldmljZTogXCJcIixcbiAgSU1FSTogXCJcIlxufVxuXG5leHBvcnQgY29uc3QgY0ZpbmFuY2lhbDogb0ZpbmFuY2lhbCA9IHtcbiAgdG90YWw6IDAsXG4gIGluaXRpYWw6IDAsXG4gIGRlYWRsaW5lczogY0J1c2luZXNzRGVhZGxpbmVzLFxuICBpbml0RGF0ZTogMCxcbiAgd2Vla2x5UGF5bWVudDogMCxcbiAgcGVuZGluZ09mOiBbXSxcbiAgcHJvZ3Jlc3M6IFtdLFxuICBpbnRlcmVzdDogMCxcbiAgcHJvdmlkZXI6IGVQcm92aWRlci5EeW5hbWlDb3JlLFxuICBmaW5hbmNlZDogMCxcbiAgbmV4dFBheW1lbnQ6IDAsXG4gIGFtb3VudF9jb21taXNzaW9uX29wZW5pbmc6IDAsXG4gIHByaW5jaXBhbF9kaXNidXJzZWQ6IDAsXG4gIGV4cGVjdGVkX2Rpc2J1cnNlZDogMCwgLy8gLS0tLS0tLS0tXG4gIGNyZWRpdF90eXBlOiAnQXJyZW5kYW1pZW50bycsXG4gIGludGVyZXN0X3JhdGU6IDAsXG4gIGNvbW1pc3Npb25fb3BlbmluZzogMCxcbiAgaW50ZXJlc3RfYXJyZWFyczogMCxcbn1cblxuZXhwb3J0IGNvbnN0IGNDb250cmFjdDogb0NvbnRyYWN0ID0ge1xuICBpZDogXCJcIixcbiAgY2xpZW50OiBcIlwiLFxuICBhZGRyZXNzOiBjQWRkcmVzcyxcbiAgZGV2aWNlOiBjRGV2aWNlLFxuICBmaW5hbmNpYWw6IGNGaW5hbmNpYWwsXG4gIGJ5OiBcIlwiLFxuICBhY3RpdmU6IHRydWVcbn1cblxuZXhwb3J0IGNsYXNzIEZhY3RvcnlDb250cmFjdCB7XG5cbiAgcHVibGljIHN0YXRpYyBGb3JtQ2xpZW50KGNsaWVudD86IG9DbGllbnQpIHtcbiAgICBsZXQgZGF0YSA9IGNDbGllbnRcblxuICAgIGlmIChjbGllbnQpIGRhdGEgPSBjbGllbnRcblxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEubmFtZSwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluTGVuZ3RoKDEwKV0pLFxuICAgICAgZW1haWw6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS51c2VybmFtZSwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMuZW1haWxdKSxcbiAgICAgIHBob25lOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEucGhvbmUsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbigxMCldKSxcbiAgICAgIGN1cnA6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5jdXJwLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW5MZW5ndGgoMTYpXSksXG4gICAgICB1c2VyUmVmZXJlbmNlczogbmV3IFVudHlwZWRGb3JtQXJyYXkoW10pXG4gICAgfVxuICB9XG5cbiAgcHVibGljIHN0YXRpYyBDcmVhdGVVc2VyUmVmZXJlbmNlRm9ybU9iaih1c2VyOiBvVXNlclJlZmVyZW5jZSkge1xuICAgIGxldCBkYXRhID0gY1VzZXJSZWZlcmVuY2VcblxuICAgIGlmICh1c2VyLm5hbWUgIT0gXCJcIikgZGF0YSA9IHVzZXJcblxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEubmFtZSwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluTGVuZ3RoKDEwKV0pLFxuICAgICAgcGhvbmU6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5waG9uZSwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSxcbiAgICAgIHJlbGF0aW9uc2hpcDogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLnJlbGF0aW9uc2hpcCwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSxcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIEZvcm1BZGRyZXNzKGFkZHJlc3M/OiBvQWRkcmVzcykge1xuICAgIGxldCBkYXRhID0gY0FkZHJlc3NcblxuICAgIGlmIChhZGRyZXNzKSBkYXRhID0gYWRkcmVzc1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN0cmVldDogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLnN0cmVldCwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgICBuZWlnaGJvcjogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLm5laWdoYm9yLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICAgIGNwOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEuemlwLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICAgIGV4dDogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLmV4dCwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgICBpbnQ6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5pbnQpLFxuICAgICAgY2l0eTogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLmNpdHksIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgICAgc3RhdGU6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5zdGF0ZSwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgfVxuICB9XG5cbiAgcHVibGljIHN0YXRpYyBGb3JtRGV2aWNlKGRldmljZT86IG9EZXZpY2UpIHtcbiAgICBsZXQgZGF0YSA9IGNEZXZpY2VcblxuICAgIGlmIChkZXZpY2UpIGRhdGEgPSBkZXZpY2VcblxuICAgIHJldHVybiB7XG4gICAgICBtb2RlbDogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLmRldmljZSwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgICBJTUVJOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEuSU1FSSwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgICBJRDogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLmlkKSxcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIEZvcm1GaW5hbmNpYWwoZmluYW5jaWFsPzogb0ZpbmFuY2lhbCkge1xuICAgIGxldCBkYXRhID0gY0ZpbmFuY2lhbFxuXG4gICAgaWYgKGZpbmFuY2lhbCkgZGF0YSA9IGZpbmFuY2lhbFxuXG4gICAgZGF0YS5jcmVkaXRfdHlwZSA9IFwiQXJyZW5kYW1pZW50b1wiXG4gICAgLy8gZGF0YS5kZWFkbGluZXMud2Vla3MgPSBjQnVzaW5lc3NEZWFkbGluZXNcblxuICAgIHJldHVybiB7XG4gICAgICB0b3RhbDogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLnRvdGFsLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW4oMSldKSxcbiAgICAgIGluaXRpYWw6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5pbml0aWFsLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxuICAgICAgZmluYW5jZWQ6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5maW5hbmNlZCwgVmFsaWRhdG9ycy5taW4oMSkpLFxuICAgICAgd2Vla2x5UGF5bWVudDogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLndlZWtseVBheW1lbnQsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbigxKV0pLFxuICAgICAgZGVhZGxpbmVzOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEuZGVhZGxpbmVzLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxuICAgICAgaW5pdERhdGU6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5pbml0RGF0ZSksXG4gICAgICBwcm92aWRlcjogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLnByb3ZpZGVyKSxcblxuICAgICAgY3JlZGl0X3R5cGU6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5jcmVkaXRfdHlwZSA/IGRhdGEuY3JlZGl0X3R5cGUgOiAwKSxcbiAgICAgIGludGVyZXN0X3JhdGU6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5pbnRlcmVzdF9yYXRlID8gZGF0YS5pbnRlcmVzdF9yYXRlIDogMCksIC8vIGludGVyZXMgY3JlZGl0IGR5bmFtaWNcbiAgICAgIGNvbW1pc3Npb25fb3BlbmluZzogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLmNvbW1pc3Npb25fb3BlbmluZyA/IGRhdGEuY29tbWlzc2lvbl9vcGVuaW5nIDogMCksXG4gICAgICBpbnRlcmVzdF9hcnJlYXJzOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEuaW50ZXJlc3RfYXJyZWFycyA/IGRhdGEuaW50ZXJlc3RfYXJyZWFycyA6IDApLCAvLyBpbnRlcmVzZXMgbW9yYXRvcmlvcyBkeW5hbWljXG5cbiAgICAgIGFtb3VudF9jb21taXNzaW9uX29wZW5pbmc6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5hbW91bnRfY29tbWlzc2lvbl9vcGVuaW5nKSwgLy8gY29taXNpb24gcG9yIGFwZXJ0dXJhIGR5bmFtaWNcbiAgICAgIHByaW5jaXBhbF9kaXNidXJzZWQ6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5wcmluY2lwYWxfZGlzYnVyc2VkKSxcbiAgICAgIGV4cGVjdGVkX2Rpc2J1cnNlZDogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLmV4cGVjdGVkX2Rpc2J1cnNlZClcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIENyZWF0ZUNvbnRyYWN0RnJvbUZvcm1PYmooZGF0YTogYW55LCBmaW5hbFBheTogbnVtYmVyKSB7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKClcblxuICAgIGNvbnN0IGRldmljZTogb0RldmljZSA9IHtcbiAgICAgIGRldmljZTogZGF0YVtcImRldmljZVwiXVswXS5tb2RlbCxcbiAgICAgIGlkOiBkYXRhW1wiZGV2aWNlXCJdWzBdLklELFxuICAgICAgSU1FSTogZGF0YVtcImRldmljZVwiXVswXS5JTUVJXG4gICAgfVxuICAgIGNvbnN0IGFkZHJlc3M6IG9BZGRyZXNzID0ge1xuICAgICAgc3RyZWV0OiBkYXRhW1wiYWRkcmVzc1wiXVswXS5zdHJlZXQsXG4gICAgICBjaXR5OiBkYXRhW1wiYWRkcmVzc1wiXVswXS5jaXR5LFxuICAgICAgbmVpZ2hib3I6IGRhdGFbXCJhZGRyZXNzXCJdWzBdLm5laWdoYm9yLFxuICAgICAgemlwOiBkYXRhW1wiYWRkcmVzc1wiXVswXS5jcCxcbiAgICAgIGV4dDogZGF0YVtcImFkZHJlc3NcIl1bMF0uZXh0LFxuICAgICAgaW50OiBkYXRhW1wiYWRkcmVzc1wiXVswXS5pbnQsXG4gICAgICBzdGF0ZTogZGF0YVtcImFkZHJlc3NcIl1bMF0uc3RhdGVcbiAgICB9XG5cbiAgICBjb25zdCBmaW5hbmNpYWw6IG9GaW5hbmNpYWwgPSB7XG4gICAgICB0b3RhbDogTnVtYmVyKGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0udG90YWwpLFxuICAgICAgaW5pdGlhbDogZGF0YVtcImZpbmFuY2lhbFwiXVswXS5pbml0aWFsLFxuICAgICAgZGVhZGxpbmVzOiBkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmRlYWRsaW5lcyxcbiAgICAgIHByb2dyZXNzOiBbXSxcbiAgICAgIHBlbmRpbmdPZjogW10sXG4gICAgICB3ZWVrbHlQYXltZW50OiBkYXRhW1wiZmluYW5jaWFsXCJdWzBdLndlZWtseVBheW1lbnQsXG4gICAgICBpbnRlcmVzdDogZGF0YVtcImZpbmFuY2lhbFwiXVswXS5pbnRlcmVzdF9yYXRlLFxuICAgICAgZmluYWxEYXRlOiBkYXRlLmdldFRpbWUoKSArIChkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmRlYWRsaW5lcy53ZWVrcyAqICg2MDQ4MDAgKiAxMDAwKSksXG4gICAgICBpbml0RGF0ZTogZGF0ZS5nZXREYXRlKCksXG4gICAgICBkYXlDdXQ6IGRhdGUuZ2V0RGF0ZSgpLFxuICAgICAgcHJvdmlkZXI6IGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0ucHJvdmlkZXIsXG4gICAgICBmaW5hbFBheW1lbnQ6IGZpbmFsUGF5LFxuICAgICAgZmluYW5jZWQ6IGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0uZmluYW5jZWQsXG4gICAgICBuZXh0UGF5bWVudDogZGF0YVtcImZpbmFuY2lhbFwiXVswXS5uZXh0UGF5bWVudFxuICAgIH1cbiAgICBpZiAoZGF0YVtcImZpbmFuY2lhbFwiXVswXS5wcm92aWRlciA9PSBlUHJvdmlkZXIuRHluYW1pQ29yZSkge1xuICAgICAgZmluYW5jaWFsLmluaXRpYWwgPSBkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmFtb3VudF9jb21taXNzaW9uX29wZW5pbmcgPyBOdW1iZXIoZGF0YVtcImZpbmFuY2lhbFwiXVswXS5hbW91bnRfY29tbWlzc2lvbl9vcGVuaW5nKSA6IDBcbiAgICAgIGZpbmFuY2lhbC5leHBlY3RlZF9kaXNidXJzZWQgPSBkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmV4cGVjdGVkX2Rpc2J1cnNlZCA/IE51bWJlcihkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmV4cGVjdGVkX2Rpc2J1cnNlZCkgOiAwXG4gICAgICBmaW5hbmNpYWwucHJpbmNpcGFsX2Rpc2J1cnNlZCA9IGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0ucHJpbmNpcGFsX2Rpc2J1cnNlZCA/IE51bWJlcihkYXRhW1wiZmluYW5jaWFsXCJdWzBdLnByaW5jaXBhbF9kaXNidXJzZWQpIDogMFxuICAgICAgZmluYW5jaWFsLmludGVyZXN0X2FycmVhcnMgPSBkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmludGVyZXN0X3JhdGUgPyBOdW1iZXIoZGF0YVtcImZpbmFuY2lhbFwiXVswXS5pbnRlcmVzdF9yYXRlKSA6IDBcbiAgICAgIGZpbmFuY2lhbC5jb21taXNzaW9uX29wZW5pbmcgPSBkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmNvbW1pc3Npb25fb3BlbmluZyA/IE51bWJlcihkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmNvbW1pc3Npb25fb3BlbmluZykgOiAwXG4gICAgICBmaW5hbmNpYWwuY3JlZGl0X3R5cGUgPSBkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmNyZWRpdF90eXBlID8gZGF0YVtcImZpbmFuY2lhbFwiXVswXS5jcmVkaXRfdHlwZSA6IFwiXCJcbiAgICAgIGZpbmFuY2lhbC5jbGFiZSA9IGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0uY2xhYmUgPyBkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmNsYWJlIDogXCJcIlxuICAgIH1cblxuICAgIGlmIChkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmFtb3VudF9jb21taXNzaW9uX29wZW5pbmcgIT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoTnVtYmVyKGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0uYW1vdW50X2NvbW1pc3Npb25fb3BlbmluZykgPiAwKVxuICAgICAgICBmaW5hbmNpYWwuaW5pdGlhbCA9IE51bWJlcihkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmFtb3VudF9jb21taXNzaW9uX29wZW5pbmcpXG4gICAgICBlbHNlXG4gICAgICAgIGZpbmFuY2lhbC5pbml0aWFsID0gTnVtYmVyKGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0uaW5pdGlhbClcbiAgICB9XG5cbiAgICBpZiAoTnVtYmVyKGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0uYW1vdW50X2NvbW1pc3Npb25fb3BlbmluZykgPiAwKVxuICAgICAgZmluYW5jaWFsLmFtb3VudF9jb21taXNzaW9uX29wZW5pbmcgPSBOdW1iZXIoZGF0YVtcImZpbmFuY2lhbFwiXVswXS5hbW91bnRfY29tbWlzc2lvbl9vcGVuaW5nKVxuICAgIGVsc2VcbiAgICAgIGZpbmFuY2lhbC5hbW91bnRfY29tbWlzc2lvbl9vcGVuaW5nID0gZmluYW5jaWFsLmluaXRpYWxcblxuICAgIGlmIChmaW5hbmNpYWwubmV4dFBheW1lbnQgPT0gdW5kZWZpbmVkKSBmaW5hbmNpYWwubmV4dFBheW1lbnQgPSAwXG5cbiAgICBjb25zdCBjb250cmFjdDogb0NvbnRyYWN0ID0ge1xuICAgICAgaWQ6IFwiXCIsXG4gICAgICBjbGllbnQ6IFwiXCIsXG4gICAgICBhZGRyZXNzOiBhZGRyZXNzLFxuICAgICAgZGV2aWNlOiBkZXZpY2UsXG4gICAgICBmaW5hbmNpYWw6IGZpbmFuY2lhbCxcbiAgICAgIGJ5OiBcIlwiLFxuICAgICAgYWN0aXZlOiB0cnVlLFxuICAgICAgbGFzdFBheW1lbnQ6IGRhdGUuZ2V0VGltZSgpLFxuICAgICAgY3JlYXRlZEF0OiBkYXRlLmdldFRpbWUoKVxuICAgIH1cbiAgICByZXR1cm4gY29udHJhY3RcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgQ3JlYXRlQ29udHJhY3RUb0NvbmVrdGFPYmooZGF0YTogb0NvbnRyYWN0LCBtb250aGx5UGF5OiBudW1iZXIsIGZpbmFsUGF5OiBudW1iZXIpIHtcbiAgICBjb25zdCBvOiBhbnkgPSB7fVxuXG4gICAgY29uc3QgZGV2aWNlOiBvRGV2aWNlID0ge1xuICAgICAgZGV2aWNlOiBkYXRhLmRldmljZS5kZXZpY2UsXG4gICAgICBpZDogZGF0YS5kZXZpY2UuaWQsXG4gICAgICBJTUVJOiBkYXRhLmRldmljZS5JTUVJXG4gICAgfVxuICAgIGNvbnN0IGFkZHJlc3M6IG9BZGRyZXNzID0ge1xuICAgICAgc3RyZWV0OiBkYXRhLmFkZHJlc3Muc3RyZWV0LFxuICAgICAgY2l0eTogZGF0YS5hZGRyZXNzLmNpdHksXG4gICAgICBuZWlnaGJvcjogZGF0YS5hZGRyZXNzLm5laWdoYm9yLFxuICAgICAgemlwOiBkYXRhLmFkZHJlc3MuemlwLFxuICAgICAgZXh0OiBkYXRhLmFkZHJlc3MuZXh0LFxuICAgICAgaW50OiBkYXRhLmFkZHJlc3MuaW50LFxuICAgICAgc3RhdGU6IGRhdGEuYWRkcmVzcy5zdGF0ZVxuICAgIH1cbiAgICBjb25zdCBmaW5hbmNpYWw6IG9GaW5hbmNpYWwgPSB7XG4gICAgICB0b3RhbDogZGF0YS5maW5hbmNpYWwudG90YWwsXG4gICAgICBpbml0aWFsOiBkYXRhLmZpbmFuY2lhbC5pbml0aWFsLFxuICAgICAgZGVhZGxpbmVzOiBkYXRhLmZpbmFuY2lhbC5kZWFkbGluZXMsXG4gICAgICBwcm9ncmVzczogZGF0YS5maW5hbmNpYWwucHJvZ3Jlc3MsXG4gICAgICBwZW5kaW5nT2Y6IGRhdGEuZmluYW5jaWFsLnBlbmRpbmdPZixcbiAgICAgIHdlZWtseVBheW1lbnQ6IGRhdGEuZmluYW5jaWFsLndlZWtseVBheW1lbnQsXG4gICAgICBpbnRlcmVzdDogZGF0YS5maW5hbmNpYWwuaW50ZXJlc3QsXG4gICAgICBmaW5hbERhdGU6IGRhdGEuZmluYW5jaWFsLmZpbmFsRGF0ZSxcbiAgICAgIGluaXREYXRlOiBkYXRhLmZpbmFuY2lhbC5pbml0RGF0ZSxcbiAgICAgIGRheUN1dDogZGF0YS5maW5hbmNpYWwuZGF5Q3V0LFxuICAgICAgcHJvdmlkZXI6IGRhdGEuZmluYW5jaWFsLnByb3ZpZGVyLFxuICAgICAgZmluYWxQYXltZW50OiBkYXRhLmZpbmFuY2lhbC5maW5hbFBheW1lbnQsXG4gICAgICBmaW5hbmNlZDogZGF0YS5maW5hbmNpYWwuZmluYW5jZWQsXG4gICAgICBuZXh0UGF5bWVudDogZGF0YS5maW5hbmNpYWwubmV4dFBheW1lbnRcbiAgICB9XG4gICAgY29uc3QgY29udHJhY3Q6IG9Db250cmFjdCA9IHtcbiAgICAgIGlkOiBcIlwiLFxuICAgICAgY2xpZW50OiBcIlwiLFxuICAgICAgYWRkcmVzczogYWRkcmVzcyxcbiAgICAgIGRldmljZTogZGV2aWNlLFxuICAgICAgZmluYW5jaWFsOiBmaW5hbmNpYWwsXG4gICAgICBieTogXCJcIixcbiAgICAgIGFjdGl2ZTogdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gY29udHJhY3RcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgQ3JlYXRlQXV0aEZvcm0odXNlcm5hbWU6IHN0cmluZywgY3VycDogc3RyaW5nKSB7XG4gICAgY29uc3QgcGFzc3dvcmQ6IHN0cmluZyA9IHRoaXMuY3JlYXRlUGFzc3dvcmQoY3VycClcbiAgICByZXR1cm4ge1xuICAgICAgdXNlcm5hbWU6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2wodXNlcm5hbWUsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgICAgcGFzc3dvcmQ6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2wocGFzc3dvcmQsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlUGFzc3dvcmQoY3VycDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBfY3VycCA9IGN1cnAuc3BsaXQoXCJcIilcbiAgICBsZXQgcGFzc3dvcmQgPSBcIlwiXG4gICAgY29uc3QgbGltaXQgPSA3XG5cbiAgICBpZiAoX2N1cnAubGVuZ3RoIDwgMTYpIHJldHVybiBcIlwiXG5cbiAgICBwYXNzd29yZCArPSBfY3VycFswXS50b0xvd2VyQ2FzZSgpXG5cbiAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBsaW1pdDsgaSsrKVxuICAgICAgcGFzc3dvcmQgKz0gX2N1cnBbaV0udG9VcHBlckNhc2UoKVxuXG4gICAgcGFzc3dvcmQgKz0gYCpgXG4gICAgcmV0dXJuIHBhc3N3b3JkXG4gIH1cblxuICBwdWJsaWMgc3RhdGljIE1hcHBlclR5cGVDb250Q2xpX0NvbnRyYWN0KF9jb250cmFjdDogdHlDbGllbnRDb250cmFjdCk6IG9Db250cmFjdCB7XG4gICAgY29uc3QgY29udHJhY3Q6IG9Db250cmFjdCA9IHtcbiAgICAgIGlkOiBfY29udHJhY3QuY29udHJhY3QhLFxuICAgICAgY2xpZW50OiBfY29udHJhY3QuY2xpZW50LFxuICAgICAgYWRkcmVzczogX2NvbnRyYWN0LmFkZHJlc3MsXG4gICAgICBkZXZpY2U6IF9jb250cmFjdC5kZXZpY2UsXG4gICAgICBmaW5hbmNpYWw6IF9jb250cmFjdC5maW5hbmNpYWwsXG4gICAgICBieTogX2NvbnRyYWN0LmJ5LFxuICAgICAgYWN0aXZlOiBfY29udHJhY3QuYWN0aXZlLFxuICAgICAgbGFzdFBheW1lbnQ6IF9jb250cmFjdC5sYXN0UGF5bWVudCxcbiAgICAgIGNyZWF0ZWRBdDogX2NvbnRyYWN0LmNyZWF0ZWRBdCxcbiAgICAgIGR5bmFtaWNBY2NvdW50OiBfY29udHJhY3QuZHluYW1pY0FjY291bnQsXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRyYWN0XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIE1hcHBlclN5bmNDb250cmFjdER5bmFtaWMoYmFzZTogb0NvbnRyYWN0LCBhY2NvdW50OiBJRENBY2NvdW50KTogb0NvbnRyYWN0IHtcbiAgICBsZXQgbkNvbnRyYWN0ID0gYmFzZVxuICAgIGxldCBfZmluYW5jaWFsID0gYmFzZS5maW5hbmNpYWxcbiAgICBsZXQgX2RldmljZSA9IGJhc2UuZGV2aWNlXG5cblxuICAgIGNvbnN0IGZpbmFuY2lhbDogb0ZpbmFuY2lhbCA9IHtcbiAgICAgIHRvdGFsOiBfZmluYW5jaWFsLnRvdGFsLFxuICAgICAgaW5pdGlhbDogYWNjb3VudC5wcm9wZXJ0aWVzLmFtb3VudF9jb21taXNzaW9uX29wZW5pbmcgPyBhY2NvdW50LnByb3BlcnRpZXMuYW1vdW50X2NvbW1pc3Npb25fb3BlbmluZyA6IF9maW5hbmNpYWwuaW5pdGlhbCxcbiAgICAgIGRlYWRsaW5lczogX2ZpbmFuY2lhbC5kZWFkbGluZXMsXG4gICAgICBwcm9ncmVzczogX2ZpbmFuY2lhbC5wcm9ncmVzcyA/IF9maW5hbmNpYWwucHJvZ3Jlc3MgOiBbXSxcbiAgICAgIHBlbmRpbmdPZjogX2ZpbmFuY2lhbC5wZW5kaW5nT2YgPyBfZmluYW5jaWFsLnBlbmRpbmdPZiA6IFtdLFxuICAgICAgd2Vla2x5UGF5bWVudDogX2ZpbmFuY2lhbC53ZWVrbHlQYXltZW50LFxuICAgICAgaW50ZXJlc3Q6IF9maW5hbmNpYWwuaW50ZXJlc3QsXG4gICAgICBmaW5hbERhdGU6IF9maW5hbmNpYWwuZmluYWxEYXRlLFxuICAgICAgaW5pdERhdGU6IF9maW5hbmNpYWwuaW5pdERhdGUsXG4gICAgICBkYXlDdXQ6IF9maW5hbmNpYWwuZGF5Q3V0LFxuICAgICAgcHJvdmlkZXI6IF9maW5hbmNpYWwucHJvdmlkZXIsXG4gICAgICBmaW5hbFBheW1lbnQ6IF9maW5hbmNpYWwuZmluYWxQYXltZW50LFxuICAgICAgZmluYW5jZWQ6IF9maW5hbmNpYWwuZmluYW5jZWQsXG4gICAgICBuZXh0UGF5bWVudDogX2ZpbmFuY2lhbC5uZXh0UGF5bWVudCA/IF9maW5hbmNpYWwubmV4dFBheW1lbnQgOiAwLFxuXG4gICAgICBhbW91bnRfY29tbWlzc2lvbl9vcGVuaW5nOlxuICAgICAgYWNjb3VudC5wcm9wZXJ0aWVzLmFtb3VudF9jb21taXNzaW9uX29wZW5pbmcsXG5cbiAgICAgIGV4cGVjdGVkX2Rpc2J1cnNlZDpcbiAgICAgICAgYWNjb3VudC5wcm9wZXJ0aWVzLmV4cGVjdGVkX2Rpc2J1cnNlZCA/XG4gICAgICAgICAgTnVtYmVyKGFjY291bnQucHJvcGVydGllcy5leHBlY3RlZF9kaXNidXJzZWQpIDpcbiAgICAgICAgICBOdW1iZXIoX2ZpbmFuY2lhbC5leHBlY3RlZF9kaXNidXJzZWQpLFxuXG4gICAgICBwcmluY2lwYWxfZGlzYnVyc2VkOlxuICAgICAgICBhY2NvdW50LnByb3BlcnRpZXMucHJpbmNpcGFsX2Rpc2J1cnNlZCA/XG4gICAgICAgICAgYWNjb3VudC5wcm9wZXJ0aWVzLnByaW5jaXBhbF9kaXNidXJzZWQgOlxuICAgICAgICAgIF9maW5hbmNpYWwucHJpbmNpcGFsX2Rpc2J1cnNlZCxcblxuICAgICAgY29tbWlzc2lvbl9vcGVuaW5nOlxuICAgICAgICBhY2NvdW50LmNvbmZpZy5jb21taXNzaW9uX29wZW5pbmcgP1xuICAgICAgICAgIE51bWJlcihhY2NvdW50LmNvbmZpZy5jb21taXNzaW9uX29wZW5pbmcpIDpcbiAgICAgICAgICBOdW1iZXIoX2ZpbmFuY2lhbC5jb21taXNzaW9uX29wZW5pbmcpLFxuXG4gICAgICBjcmVkaXRfdHlwZTpcbiAgICAgICAgYWNjb3VudC5jb25maWcuY3JlZGl0X3R5cGUgPyBhY2NvdW50LmNvbmZpZy5jcmVkaXRfdHlwZSA6IF9maW5hbmNpYWwuY3JlZGl0X3R5cGUsXG5cbiAgICAgIGNsYWJlOlxuICAgICAgICBTdHJpbmcoYWNjb3VudC5wcm9wZXJ0aWVzLmNsYWJlID8gYWNjb3VudC5wcm9wZXJ0aWVzLmNsYWJlIDogX2ZpbmFuY2lhbC5jbGFiZSlcbiAgICB9XG5cbiAgICBjb25zdCBpbnRlcmVzdEFycmVhcnMgPSBhY2NvdW50LmNvbmZpZy5pbnRlcmVzdF9hcnJlYXJzXG4gICAgY29uc3QgcHJldkludGVyZXN0QXJyZWFycyA9IF9maW5hbmNpYWwuaW50ZXJlc3RfYXJyZWFyc1xuICAgIGlmIChpbnRlcmVzdEFycmVhcnMgIT0gdW5kZWZpbmVkKSB7XG4gICAgICBmaW5hbmNpYWwuaW50ZXJlc3RfYXJyZWFycyA9IGludGVyZXN0QXJyZWFyc1xuICAgIH0gZWxzZSBpZiAocHJldkludGVyZXN0QXJyZWFycyAhPSB1bmRlZmluZWQpIHtcbiAgICAgIGZpbmFuY2lhbC5pbnRlcmVzdF9hcnJlYXJzID0gcHJldkludGVyZXN0QXJyZWFyc1xuICAgIH0gZWxzZSB7XG4gICAgICBmaW5hbmNpYWwuaW50ZXJlc3RfYXJyZWFycyA9IDBcbiAgICB9XG5cbiAgICBjb25zdCBpbnRlcmVzdCA9IGFjY291bnQuY29uZmlnLmludGVyZXN0X3JhdGVcbiAgICBjb25zdCBwcmV2SW50ZXJlc3QgPSBfZmluYW5jaWFsLmludGVyZXN0XG4gICAgaWYgKGludGVyZXN0ICE9IHVuZGVmaW5lZCkge1xuICAgICAgZmluYW5jaWFsLmludGVyZXN0ID0gaW50ZXJlc3RcbiAgICB9IGVsc2UgaWYgKHByZXZJbnRlcmVzdCAhPSB1bmRlZmluZWQpIHtcbiAgICAgIGZpbmFuY2lhbC5pbnRlcmVzdCA9IHByZXZJbnRlcmVzdFxuICAgIH0gZWxzZSB7XG4gICAgICBmaW5hbmNpYWwuaW50ZXJlc3QgPSAwXG4gICAgfVxuXG4gICAgaWYgKGFjY291bnQucHJvcGVydGllcy5hbW91bnRfY29tbWlzc2lvbl9vcGVuaW5nICE9IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKE51bWJlcihhY2NvdW50LnByb3BlcnRpZXMuYW1vdW50X2NvbW1pc3Npb25fb3BlbmluZykgPiAwKSB7XG4gICAgICAgIGZpbmFuY2lhbC5pbml0aWFsID0gTnVtYmVyKGFjY291bnQucHJvcGVydGllcy5hbW91bnRfY29tbWlzc2lvbl9vcGVuaW5nKVxuICAgICAgICBmaW5hbmNpYWwuYW1vdW50X2NvbW1pc3Npb25fb3BlbmluZyA9IE51bWJlcihhY2NvdW50LnByb3BlcnRpZXMuYW1vdW50X2NvbW1pc3Npb25fb3BlbmluZylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpbmFuY2lhbC5pbml0aWFsID0gTnVtYmVyKF9maW5hbmNpYWwuaW5pdGlhbClcbiAgICAgICAgZmluYW5jaWFsLmFtb3VudF9jb21taXNzaW9uX29wZW5pbmcgPSBmaW5hbmNpYWwuaW5pdGlhbFxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNlbGxlcjogc3RyaW5nIHwgdW5kZWZpbmVkID0gYWNjb3VudC5wcm9wZXJ0aWVzLnNlbGxlcl9uYW1lXG4gICAgbkNvbnRyYWN0LmJ5ID0gc2VsbGVyICE9IG51bGwgPyBzZWxsZXIgOiBcIlwiXG5cbiAgICBuQ29udHJhY3QuZGV2aWNlLmlkID0gX2RldmljZS5pZCA/IF9kZXZpY2UuaWQgOiBcIlwiXG5cbiAgICBuQ29udHJhY3QuZmluYW5jaWFsID0gZmluYW5jaWFsXG4gICAgcmV0dXJuIG5Db250cmFjdFxuICB9XG59XG5cbiJdfQ==