@aneoconsultingfr/armonik.api.angular 3.29.0-edge.13.eb211e2 → 3.29.0-edge.68.23f0ea8b

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 (113) hide show
  1. package/fesm2022/aneoconsultingfr-armonik.api.angular.mjs +29 -29
  2. package/fesm2022/aneoconsultingfr-armonik.api.angular.mjs.map +1 -1
  3. package/index.d.ts +11699 -3
  4. package/package.json +6 -8
  5. package/esm2022/aneoconsultingfr-armonik.api.angular.mjs +0 -5
  6. package/esm2022/lib/generated/applications-common.pb.mjs +0 -586
  7. package/esm2022/lib/generated/applications-fields.pb.mjs +0 -231
  8. package/esm2022/lib/generated/applications-filters.pb.mjs +0 -349
  9. package/esm2022/lib/generated/applications-service.pb.mjs +0 -2
  10. package/esm2022/lib/generated/applications-service.pbconf.mjs +0 -13
  11. package/esm2022/lib/generated/applications-service.pbsc.mjs +0 -74
  12. package/esm2022/lib/generated/auth-common.pb.mjs +0 -318
  13. package/esm2022/lib/generated/auth-service.pb.mjs +0 -2
  14. package/esm2022/lib/generated/auth-service.pbconf.mjs +0 -13
  15. package/esm2022/lib/generated/auth-service.pbsc.mjs +0 -74
  16. package/esm2022/lib/generated/events-common.pb.mjs +0 -1139
  17. package/esm2022/lib/generated/events-service.pb.mjs +0 -2
  18. package/esm2022/lib/generated/events-service.pbconf.mjs +0 -13
  19. package/esm2022/lib/generated/events-service.pbsc.mjs +0 -74
  20. package/esm2022/lib/generated/filters-common.pb.mjs +0 -774
  21. package/esm2022/lib/generated/health-checks-common.pb.mjs +0 -331
  22. package/esm2022/lib/generated/health-checks-service.pb.mjs +0 -2
  23. package/esm2022/lib/generated/health-checks-service.pbconf.mjs +0 -13
  24. package/esm2022/lib/generated/health-checks-service.pbsc.mjs +0 -74
  25. package/esm2022/lib/generated/objects.pb.mjs +0 -2721
  26. package/esm2022/lib/generated/partitions-common.pb.mjs +0 -978
  27. package/esm2022/lib/generated/partitions-fields.pb.mjs +0 -233
  28. package/esm2022/lib/generated/partitions-filters.pb.mjs +0 -431
  29. package/esm2022/lib/generated/partitions-service.pb.mjs +0 -2
  30. package/esm2022/lib/generated/partitions-service.pbconf.mjs +0 -13
  31. package/esm2022/lib/generated/partitions-service.pbsc.mjs +0 -104
  32. package/esm2022/lib/generated/result-status.pb.mjs +0 -16
  33. package/esm2022/lib/generated/results-common.pb.mjs +0 -3476
  34. package/esm2022/lib/generated/results-fields.pb.mjs +0 -238
  35. package/esm2022/lib/generated/results-filters.pb.mjs +0 -573
  36. package/esm2022/lib/generated/results-service.pb.mjs +0 -2
  37. package/esm2022/lib/generated/results-service.pbconf.mjs +0 -13
  38. package/esm2022/lib/generated/results-service.pbsc.mjs +0 -375
  39. package/esm2022/lib/generated/session-status.pb.mjs +0 -17
  40. package/esm2022/lib/generated/sessions-common.pb.mjs +0 -2638
  41. package/esm2022/lib/generated/sessions-fields.pb.mjs +0 -509
  42. package/esm2022/lib/generated/sessions-filters.pb.mjs +0 -629
  43. package/esm2022/lib/generated/sessions-service.pb.mjs +0 -2
  44. package/esm2022/lib/generated/sessions-service.pbconf.mjs +0 -13
  45. package/esm2022/lib/generated/sessions-service.pbsc.mjs +0 -344
  46. package/esm2022/lib/generated/sort-direction.pb.mjs +0 -13
  47. package/esm2022/lib/generated/task-status.pb.mjs +0 -24
  48. package/esm2022/lib/generated/tasks-common.pb.mjs +0 -3383
  49. package/esm2022/lib/generated/tasks-fields.pb.mjs +0 -518
  50. package/esm2022/lib/generated/tasks-filters.pb.mjs +0 -629
  51. package/esm2022/lib/generated/tasks-service.pb.mjs +0 -2
  52. package/esm2022/lib/generated/tasks-service.pbconf.mjs +0 -13
  53. package/esm2022/lib/generated/tasks-service.pbsc.mjs +0 -254
  54. package/esm2022/lib/generated/versions-common.pb.mjs +0 -200
  55. package/esm2022/lib/generated/versions-service.pb.mjs +0 -2
  56. package/esm2022/lib/generated/versions-service.pbconf.mjs +0 -13
  57. package/esm2022/lib/generated/versions-service.pbsc.mjs +0 -74
  58. package/esm2022/lib/index.mjs +0 -35
  59. package/esm2022/public-api.mjs +0 -5
  60. package/lib/generated/applications-common.pb.d.ts +0 -331
  61. package/lib/generated/applications-fields.pb.d.ts +0 -153
  62. package/lib/generated/applications-filters.pb.d.ts +0 -222
  63. package/lib/generated/applications-service.pb.d.ts +0 -1
  64. package/lib/generated/applications-service.pbconf.d.ts +0 -6
  65. package/lib/generated/applications-service.pbsc.d.ts +0 -38
  66. package/lib/generated/auth-common.pb.d.ts +0 -214
  67. package/lib/generated/auth-service.pb.d.ts +0 -1
  68. package/lib/generated/auth-service.pbconf.d.ts +0 -6
  69. package/lib/generated/auth-service.pbsc.d.ts +0 -38
  70. package/lib/generated/events-common.pb.d.ts +0 -612
  71. package/lib/generated/events-service.pb.d.ts +0 -1
  72. package/lib/generated/events-service.pbconf.d.ts +0 -6
  73. package/lib/generated/events-service.pbsc.d.ts +0 -38
  74. package/lib/generated/filters-common.pb.d.ts +0 -491
  75. package/lib/generated/health-checks-common.pb.d.ts +0 -220
  76. package/lib/generated/health-checks-service.pb.d.ts +0 -1
  77. package/lib/generated/health-checks-service.pbconf.d.ts +0 -6
  78. package/lib/generated/health-checks-service.pbsc.d.ts +0 -38
  79. package/lib/generated/objects.pb.d.ts +0 -1678
  80. package/lib/generated/partitions-common.pb.d.ts +0 -566
  81. package/lib/generated/partitions-fields.pb.d.ts +0 -155
  82. package/lib/generated/partitions-filters.pb.d.ts +0 -240
  83. package/lib/generated/partitions-service.pb.d.ts +0 -1
  84. package/lib/generated/partitions-service.pbconf.d.ts +0 -6
  85. package/lib/generated/partitions-service.pbsc.d.ts +0 -54
  86. package/lib/generated/result-status.pb.d.ts +0 -8
  87. package/lib/generated/results-common.pb.d.ts +0 -2121
  88. package/lib/generated/results-fields.pb.d.ts +0 -160
  89. package/lib/generated/results-filters.pb.d.ts +0 -321
  90. package/lib/generated/results-service.pb.d.ts +0 -1
  91. package/lib/generated/results-service.pbconf.d.ts +0 -6
  92. package/lib/generated/results-service.pbsc.d.ts +0 -199
  93. package/lib/generated/session-status.pb.d.ts +0 -9
  94. package/lib/generated/sessions-common.pb.d.ts +0 -1637
  95. package/lib/generated/sessions-fields.pb.d.ts +0 -323
  96. package/lib/generated/sessions-filters.pb.d.ts +0 -333
  97. package/lib/generated/sessions-service.pb.d.ts +0 -1
  98. package/lib/generated/sessions-service.pbconf.d.ts +0 -6
  99. package/lib/generated/sessions-service.pbsc.d.ts +0 -182
  100. package/lib/generated/sort-direction.pb.d.ts +0 -5
  101. package/lib/generated/task-status.pb.d.ts +0 -16
  102. package/lib/generated/tasks-common.pb.d.ts +0 -1754
  103. package/lib/generated/tasks-fields.pb.d.ts +0 -332
  104. package/lib/generated/tasks-filters.pb.d.ts +0 -333
  105. package/lib/generated/tasks-service.pb.d.ts +0 -1
  106. package/lib/generated/tasks-service.pbconf.d.ts +0 -6
  107. package/lib/generated/tasks-service.pbsc.d.ts +0 -134
  108. package/lib/generated/versions-common.pb.d.ts +0 -140
  109. package/lib/generated/versions-service.pb.d.ts +0 -1
  110. package/lib/generated/versions-service.pbconf.d.ts +0 -6
  111. package/lib/generated/versions-service.pbsc.d.ts +0 -38
  112. package/lib/index.d.ts +0 -34
  113. package/public-api.d.ts +0 -1
@@ -1,1139 +0,0 @@
1
- import { BinaryReader, BinaryWriter } from 'google-protobuf';
2
- import * as armonikApiGrpcV1Result_status001 from './result-status.pb';
3
- import * as armonikApiGrpcV1Task_status003 from './task-status.pb';
4
- import * as armonikApiGrpcV1Results005 from './results-filters.pb';
5
- import * as armonikApiGrpcV1Tasks006 from './tasks-filters.pb';
6
- export var EventsEnum;
7
- (function (EventsEnum) {
8
- EventsEnum[EventsEnum["EVENTS_ENUM_UNSPECIFIED"] = 0] = "EVENTS_ENUM_UNSPECIFIED";
9
- EventsEnum[EventsEnum["EVENTS_ENUM_NEW_TASK"] = 1] = "EVENTS_ENUM_NEW_TASK";
10
- EventsEnum[EventsEnum["EVENTS_ENUM_TASK_STATUS_UPDATE"] = 2] = "EVENTS_ENUM_TASK_STATUS_UPDATE";
11
- EventsEnum[EventsEnum["EVENTS_ENUM_NEW_RESULT"] = 3] = "EVENTS_ENUM_NEW_RESULT";
12
- EventsEnum[EventsEnum["EVENTS_ENUM_RESULT_STATUS_UPDATE"] = 4] = "EVENTS_ENUM_RESULT_STATUS_UPDATE";
13
- EventsEnum[EventsEnum["EVENTS_ENUM_RESULT_OWNER_UPDATE"] = 5] = "EVENTS_ENUM_RESULT_OWNER_UPDATE";
14
- })(EventsEnum || (EventsEnum = {}));
15
- /**
16
- * Message implementation for armonik.api.grpc.v1.events.EventSubscriptionRequest
17
- */
18
- export class EventSubscriptionRequest {
19
- static { this.id = 'armonik.api.grpc.v1.events.EventSubscriptionRequest'; }
20
- /**
21
- * Deserialize binary data to message
22
- * @param instance message instance
23
- */
24
- static deserializeBinary(bytes) {
25
- const instance = new EventSubscriptionRequest();
26
- EventSubscriptionRequest.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
27
- return instance;
28
- }
29
- /**
30
- * Check all the properties and set default protobuf values if necessary
31
- * @param _instance message instance
32
- */
33
- static refineValues(_instance) {
34
- _instance.sessionId = _instance.sessionId || '';
35
- _instance.tasksFilters = _instance.tasksFilters || undefined;
36
- _instance.resultsFilters = _instance.resultsFilters || undefined;
37
- _instance.returnedEvents = _instance.returnedEvents || [];
38
- }
39
- /**
40
- * Deserializes / reads binary message into message instance using provided binary reader
41
- * @param _instance message instance
42
- * @param _reader binary reader instance
43
- */
44
- static deserializeBinaryFromReader(_instance, _reader) {
45
- while (_reader.nextField()) {
46
- if (_reader.isEndGroup())
47
- break;
48
- switch (_reader.getFieldNumber()) {
49
- case 1:
50
- _instance.sessionId = _reader.readString();
51
- break;
52
- case 2:
53
- _instance.tasksFilters = new armonikApiGrpcV1Tasks006.Filters();
54
- _reader.readMessage(_instance.tasksFilters, armonikApiGrpcV1Tasks006.Filters.deserializeBinaryFromReader);
55
- break;
56
- case 3:
57
- _instance.resultsFilters = new armonikApiGrpcV1Results005.Filters();
58
- _reader.readMessage(_instance.resultsFilters, armonikApiGrpcV1Results005.Filters.deserializeBinaryFromReader);
59
- break;
60
- case 4:
61
- (_instance.returnedEvents = _instance.returnedEvents || []).push(...(_reader.readPackedEnum() || []));
62
- break;
63
- default:
64
- _reader.skipField();
65
- }
66
- }
67
- EventSubscriptionRequest.refineValues(_instance);
68
- }
69
- /**
70
- * Serializes a message to binary format using provided binary reader
71
- * @param _instance message instance
72
- * @param _writer binary writer instance
73
- */
74
- static serializeBinaryToWriter(_instance, _writer) {
75
- if (_instance.sessionId) {
76
- _writer.writeString(1, _instance.sessionId);
77
- }
78
- if (_instance.tasksFilters) {
79
- _writer.writeMessage(2, _instance.tasksFilters, armonikApiGrpcV1Tasks006.Filters.serializeBinaryToWriter);
80
- }
81
- if (_instance.resultsFilters) {
82
- _writer.writeMessage(3, _instance.resultsFilters, armonikApiGrpcV1Results005.Filters.serializeBinaryToWriter);
83
- }
84
- if (_instance.returnedEvents && _instance.returnedEvents.length) {
85
- _writer.writePackedEnum(4, _instance.returnedEvents);
86
- }
87
- }
88
- /**
89
- * Message constructor. Initializes the properties and applies default Protobuf values if necessary
90
- * @param _value initial values object or instance of EventSubscriptionRequest to deeply clone from
91
- */
92
- constructor(_value) {
93
- _value = _value || {};
94
- this.sessionId = _value.sessionId;
95
- this.tasksFilters = _value.tasksFilters
96
- ? new armonikApiGrpcV1Tasks006.Filters(_value.tasksFilters)
97
- : undefined;
98
- this.resultsFilters = _value.resultsFilters
99
- ? new armonikApiGrpcV1Results005.Filters(_value.resultsFilters)
100
- : undefined;
101
- this.returnedEvents = (_value.returnedEvents || []).slice();
102
- EventSubscriptionRequest.refineValues(this);
103
- }
104
- get sessionId() {
105
- return this._sessionId;
106
- }
107
- set sessionId(value) {
108
- this._sessionId = value;
109
- }
110
- get tasksFilters() {
111
- return this._tasksFilters;
112
- }
113
- set tasksFilters(value) {
114
- this._tasksFilters = value;
115
- }
116
- get resultsFilters() {
117
- return this._resultsFilters;
118
- }
119
- set resultsFilters(value) {
120
- this._resultsFilters = value;
121
- }
122
- get returnedEvents() {
123
- return this._returnedEvents;
124
- }
125
- set returnedEvents(value) {
126
- this._returnedEvents = value;
127
- }
128
- /**
129
- * Serialize message to binary data
130
- * @param instance message instance
131
- */
132
- serializeBinary() {
133
- const writer = new BinaryWriter();
134
- EventSubscriptionRequest.serializeBinaryToWriter(this, writer);
135
- return writer.getResultBuffer();
136
- }
137
- /**
138
- * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
139
- */
140
- toObject() {
141
- return {
142
- sessionId: this.sessionId,
143
- tasksFilters: this.tasksFilters
144
- ? this.tasksFilters.toObject()
145
- : undefined,
146
- resultsFilters: this.resultsFilters
147
- ? this.resultsFilters.toObject()
148
- : undefined,
149
- returnedEvents: (this.returnedEvents || []).slice()
150
- };
151
- }
152
- /**
153
- * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
154
- */
155
- toJSON() {
156
- return this.toObject();
157
- }
158
- /**
159
- * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
160
- * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
161
- * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
162
- */
163
- toProtobufJSON(
164
- // @ts-ignore
165
- options) {
166
- return {
167
- sessionId: this.sessionId,
168
- tasksFilters: this.tasksFilters
169
- ? this.tasksFilters.toProtobufJSON(options)
170
- : null,
171
- resultsFilters: this.resultsFilters
172
- ? this.resultsFilters.toProtobufJSON(options)
173
- : null,
174
- returnedEvents: (this.returnedEvents || []).map(v => EventsEnum[v])
175
- };
176
- }
177
- }
178
- /**
179
- * Message implementation for armonik.api.grpc.v1.events.EventSubscriptionResponse
180
- */
181
- export class EventSubscriptionResponse {
182
- static { this.id = 'armonik.api.grpc.v1.events.EventSubscriptionResponse'; }
183
- /**
184
- * Deserialize binary data to message
185
- * @param instance message instance
186
- */
187
- static deserializeBinary(bytes) {
188
- const instance = new EventSubscriptionResponse();
189
- EventSubscriptionResponse.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
190
- return instance;
191
- }
192
- /**
193
- * Check all the properties and set default protobuf values if necessary
194
- * @param _instance message instance
195
- */
196
- static refineValues(_instance) {
197
- _instance.sessionId = _instance.sessionId || '';
198
- }
199
- /**
200
- * Deserializes / reads binary message into message instance using provided binary reader
201
- * @param _instance message instance
202
- * @param _reader binary reader instance
203
- */
204
- static deserializeBinaryFromReader(_instance, _reader) {
205
- while (_reader.nextField()) {
206
- if (_reader.isEndGroup())
207
- break;
208
- switch (_reader.getFieldNumber()) {
209
- case 1:
210
- _instance.sessionId = _reader.readString();
211
- break;
212
- case 2:
213
- _instance.taskStatusUpdate = new EventSubscriptionResponse.TaskStatusUpdate();
214
- _reader.readMessage(_instance.taskStatusUpdate, EventSubscriptionResponse.TaskStatusUpdate
215
- .deserializeBinaryFromReader);
216
- break;
217
- case 3:
218
- _instance.resultStatusUpdate = new EventSubscriptionResponse.ResultStatusUpdate();
219
- _reader.readMessage(_instance.resultStatusUpdate, EventSubscriptionResponse.ResultStatusUpdate
220
- .deserializeBinaryFromReader);
221
- break;
222
- case 4:
223
- _instance.resultOwnerUpdate = new EventSubscriptionResponse.ResultOwnerUpdate();
224
- _reader.readMessage(_instance.resultOwnerUpdate, EventSubscriptionResponse.ResultOwnerUpdate
225
- .deserializeBinaryFromReader);
226
- break;
227
- case 5:
228
- _instance.newTask = new EventSubscriptionResponse.NewTask();
229
- _reader.readMessage(_instance.newTask, EventSubscriptionResponse.NewTask.deserializeBinaryFromReader);
230
- break;
231
- case 6:
232
- _instance.newResult = new EventSubscriptionResponse.NewResult();
233
- _reader.readMessage(_instance.newResult, EventSubscriptionResponse.NewResult.deserializeBinaryFromReader);
234
- break;
235
- default:
236
- _reader.skipField();
237
- }
238
- }
239
- EventSubscriptionResponse.refineValues(_instance);
240
- }
241
- /**
242
- * Serializes a message to binary format using provided binary reader
243
- * @param _instance message instance
244
- * @param _writer binary writer instance
245
- */
246
- static serializeBinaryToWriter(_instance, _writer) {
247
- if (_instance.sessionId) {
248
- _writer.writeString(1, _instance.sessionId);
249
- }
250
- if (_instance.taskStatusUpdate) {
251
- _writer.writeMessage(2, _instance.taskStatusUpdate, EventSubscriptionResponse.TaskStatusUpdate.serializeBinaryToWriter);
252
- }
253
- if (_instance.resultStatusUpdate) {
254
- _writer.writeMessage(3, _instance.resultStatusUpdate, EventSubscriptionResponse.ResultStatusUpdate.serializeBinaryToWriter);
255
- }
256
- if (_instance.resultOwnerUpdate) {
257
- _writer.writeMessage(4, _instance.resultOwnerUpdate, EventSubscriptionResponse.ResultOwnerUpdate.serializeBinaryToWriter);
258
- }
259
- if (_instance.newTask) {
260
- _writer.writeMessage(5, _instance.newTask, EventSubscriptionResponse.NewTask.serializeBinaryToWriter);
261
- }
262
- if (_instance.newResult) {
263
- _writer.writeMessage(6, _instance.newResult, EventSubscriptionResponse.NewResult.serializeBinaryToWriter);
264
- }
265
- }
266
- /**
267
- * Message constructor. Initializes the properties and applies default Protobuf values if necessary
268
- * @param _value initial values object or instance of EventSubscriptionResponse to deeply clone from
269
- */
270
- constructor(_value) {
271
- this._update = EventSubscriptionResponse.UpdateCase.none;
272
- _value = _value || {};
273
- this.sessionId = _value.sessionId;
274
- this.taskStatusUpdate = _value.taskStatusUpdate
275
- ? new EventSubscriptionResponse.TaskStatusUpdate(_value.taskStatusUpdate)
276
- : undefined;
277
- this.resultStatusUpdate = _value.resultStatusUpdate
278
- ? new EventSubscriptionResponse.ResultStatusUpdate(_value.resultStatusUpdate)
279
- : undefined;
280
- this.resultOwnerUpdate = _value.resultOwnerUpdate
281
- ? new EventSubscriptionResponse.ResultOwnerUpdate(_value.resultOwnerUpdate)
282
- : undefined;
283
- this.newTask = _value.newTask
284
- ? new EventSubscriptionResponse.NewTask(_value.newTask)
285
- : undefined;
286
- this.newResult = _value.newResult
287
- ? new EventSubscriptionResponse.NewResult(_value.newResult)
288
- : undefined;
289
- EventSubscriptionResponse.refineValues(this);
290
- }
291
- get sessionId() {
292
- return this._sessionId;
293
- }
294
- set sessionId(value) {
295
- this._sessionId = value;
296
- }
297
- get taskStatusUpdate() {
298
- return this._taskStatusUpdate;
299
- }
300
- set taskStatusUpdate(value) {
301
- if (value !== undefined && value !== null) {
302
- this._resultStatusUpdate = this._resultOwnerUpdate = this._newTask = this._newResult = undefined;
303
- this._update = EventSubscriptionResponse.UpdateCase.taskStatusUpdate;
304
- }
305
- this._taskStatusUpdate = value;
306
- }
307
- get resultStatusUpdate() {
308
- return this._resultStatusUpdate;
309
- }
310
- set resultStatusUpdate(value) {
311
- if (value !== undefined && value !== null) {
312
- this._taskStatusUpdate = this._resultOwnerUpdate = this._newTask = this._newResult = undefined;
313
- this._update = EventSubscriptionResponse.UpdateCase.resultStatusUpdate;
314
- }
315
- this._resultStatusUpdate = value;
316
- }
317
- get resultOwnerUpdate() {
318
- return this._resultOwnerUpdate;
319
- }
320
- set resultOwnerUpdate(value) {
321
- if (value !== undefined && value !== null) {
322
- this._taskStatusUpdate = this._resultStatusUpdate = this._newTask = this._newResult = undefined;
323
- this._update = EventSubscriptionResponse.UpdateCase.resultOwnerUpdate;
324
- }
325
- this._resultOwnerUpdate = value;
326
- }
327
- get newTask() {
328
- return this._newTask;
329
- }
330
- set newTask(value) {
331
- if (value !== undefined && value !== null) {
332
- this._taskStatusUpdate = this._resultStatusUpdate = this._resultOwnerUpdate = this._newResult = undefined;
333
- this._update = EventSubscriptionResponse.UpdateCase.newTask;
334
- }
335
- this._newTask = value;
336
- }
337
- get newResult() {
338
- return this._newResult;
339
- }
340
- set newResult(value) {
341
- if (value !== undefined && value !== null) {
342
- this._taskStatusUpdate = this._resultStatusUpdate = this._resultOwnerUpdate = this._newTask = undefined;
343
- this._update = EventSubscriptionResponse.UpdateCase.newResult;
344
- }
345
- this._newResult = value;
346
- }
347
- get update() {
348
- return this._update;
349
- }
350
- /**
351
- * Serialize message to binary data
352
- * @param instance message instance
353
- */
354
- serializeBinary() {
355
- const writer = new BinaryWriter();
356
- EventSubscriptionResponse.serializeBinaryToWriter(this, writer);
357
- return writer.getResultBuffer();
358
- }
359
- /**
360
- * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
361
- */
362
- toObject() {
363
- return {
364
- sessionId: this.sessionId,
365
- taskStatusUpdate: this.taskStatusUpdate
366
- ? this.taskStatusUpdate.toObject()
367
- : undefined,
368
- resultStatusUpdate: this.resultStatusUpdate
369
- ? this.resultStatusUpdate.toObject()
370
- : undefined,
371
- resultOwnerUpdate: this.resultOwnerUpdate
372
- ? this.resultOwnerUpdate.toObject()
373
- : undefined,
374
- newTask: this.newTask ? this.newTask.toObject() : undefined,
375
- newResult: this.newResult ? this.newResult.toObject() : undefined
376
- };
377
- }
378
- /**
379
- * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
380
- */
381
- toJSON() {
382
- return this.toObject();
383
- }
384
- /**
385
- * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
386
- * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
387
- * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
388
- */
389
- toProtobufJSON(
390
- // @ts-ignore
391
- options) {
392
- return {
393
- sessionId: this.sessionId,
394
- taskStatusUpdate: this.taskStatusUpdate
395
- ? this.taskStatusUpdate.toProtobufJSON(options)
396
- : null,
397
- resultStatusUpdate: this.resultStatusUpdate
398
- ? this.resultStatusUpdate.toProtobufJSON(options)
399
- : null,
400
- resultOwnerUpdate: this.resultOwnerUpdate
401
- ? this.resultOwnerUpdate.toProtobufJSON(options)
402
- : null,
403
- newTask: this.newTask ? this.newTask.toProtobufJSON(options) : null,
404
- newResult: this.newResult ? this.newResult.toProtobufJSON(options) : null
405
- };
406
- }
407
- }
408
- (function (EventSubscriptionResponse) {
409
- let UpdateCase;
410
- (function (UpdateCase) {
411
- UpdateCase[UpdateCase["none"] = 0] = "none";
412
- UpdateCase[UpdateCase["taskStatusUpdate"] = 1] = "taskStatusUpdate";
413
- UpdateCase[UpdateCase["resultStatusUpdate"] = 2] = "resultStatusUpdate";
414
- UpdateCase[UpdateCase["resultOwnerUpdate"] = 3] = "resultOwnerUpdate";
415
- UpdateCase[UpdateCase["newTask"] = 4] = "newTask";
416
- UpdateCase[UpdateCase["newResult"] = 5] = "newResult";
417
- })(UpdateCase = EventSubscriptionResponse.UpdateCase || (EventSubscriptionResponse.UpdateCase = {}));
418
- /**
419
- * Message implementation for armonik.api.grpc.v1.events.EventSubscriptionResponse.TaskStatusUpdate
420
- */
421
- class TaskStatusUpdate {
422
- static { this.id = 'armonik.api.grpc.v1.events.EventSubscriptionResponse.TaskStatusUpdate'; }
423
- /**
424
- * Deserialize binary data to message
425
- * @param instance message instance
426
- */
427
- static deserializeBinary(bytes) {
428
- const instance = new TaskStatusUpdate();
429
- TaskStatusUpdate.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
430
- return instance;
431
- }
432
- /**
433
- * Check all the properties and set default protobuf values if necessary
434
- * @param _instance message instance
435
- */
436
- static refineValues(_instance) {
437
- _instance.taskId = _instance.taskId || '';
438
- _instance.status = _instance.status || 0;
439
- }
440
- /**
441
- * Deserializes / reads binary message into message instance using provided binary reader
442
- * @param _instance message instance
443
- * @param _reader binary reader instance
444
- */
445
- static deserializeBinaryFromReader(_instance, _reader) {
446
- while (_reader.nextField()) {
447
- if (_reader.isEndGroup())
448
- break;
449
- switch (_reader.getFieldNumber()) {
450
- case 10:
451
- _instance.taskId = _reader.readString();
452
- break;
453
- case 11:
454
- _instance.status = _reader.readEnum();
455
- break;
456
- default:
457
- _reader.skipField();
458
- }
459
- }
460
- TaskStatusUpdate.refineValues(_instance);
461
- }
462
- /**
463
- * Serializes a message to binary format using provided binary reader
464
- * @param _instance message instance
465
- * @param _writer binary writer instance
466
- */
467
- static serializeBinaryToWriter(_instance, _writer) {
468
- if (_instance.taskId) {
469
- _writer.writeString(10, _instance.taskId);
470
- }
471
- if (_instance.status) {
472
- _writer.writeEnum(11, _instance.status);
473
- }
474
- }
475
- /**
476
- * Message constructor. Initializes the properties and applies default Protobuf values if necessary
477
- * @param _value initial values object or instance of TaskStatusUpdate to deeply clone from
478
- */
479
- constructor(_value) {
480
- _value = _value || {};
481
- this.taskId = _value.taskId;
482
- this.status = _value.status;
483
- TaskStatusUpdate.refineValues(this);
484
- }
485
- get taskId() {
486
- return this._taskId;
487
- }
488
- set taskId(value) {
489
- this._taskId = value;
490
- }
491
- get status() {
492
- return this._status;
493
- }
494
- set status(value) {
495
- this._status = value;
496
- }
497
- /**
498
- * Serialize message to binary data
499
- * @param instance message instance
500
- */
501
- serializeBinary() {
502
- const writer = new BinaryWriter();
503
- TaskStatusUpdate.serializeBinaryToWriter(this, writer);
504
- return writer.getResultBuffer();
505
- }
506
- /**
507
- * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
508
- */
509
- toObject() {
510
- return {
511
- taskId: this.taskId,
512
- status: this.status
513
- };
514
- }
515
- /**
516
- * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
517
- */
518
- toJSON() {
519
- return this.toObject();
520
- }
521
- /**
522
- * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
523
- * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
524
- * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
525
- */
526
- toProtobufJSON(
527
- // @ts-ignore
528
- options) {
529
- return {
530
- taskId: this.taskId,
531
- status: armonikApiGrpcV1Task_status003.TaskStatus[this.status === null || this.status === undefined ? 0 : this.status]
532
- };
533
- }
534
- }
535
- EventSubscriptionResponse.TaskStatusUpdate = TaskStatusUpdate;
536
- /**
537
- * Message implementation for armonik.api.grpc.v1.events.EventSubscriptionResponse.ResultStatusUpdate
538
- */
539
- class ResultStatusUpdate {
540
- static { this.id = 'armonik.api.grpc.v1.events.EventSubscriptionResponse.ResultStatusUpdate'; }
541
- /**
542
- * Deserialize binary data to message
543
- * @param instance message instance
544
- */
545
- static deserializeBinary(bytes) {
546
- const instance = new ResultStatusUpdate();
547
- ResultStatusUpdate.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
548
- return instance;
549
- }
550
- /**
551
- * Check all the properties and set default protobuf values if necessary
552
- * @param _instance message instance
553
- */
554
- static refineValues(_instance) {
555
- _instance.resultId = _instance.resultId || '';
556
- _instance.status = _instance.status || 0;
557
- }
558
- /**
559
- * Deserializes / reads binary message into message instance using provided binary reader
560
- * @param _instance message instance
561
- * @param _reader binary reader instance
562
- */
563
- static deserializeBinaryFromReader(_instance, _reader) {
564
- while (_reader.nextField()) {
565
- if (_reader.isEndGroup())
566
- break;
567
- switch (_reader.getFieldNumber()) {
568
- case 20:
569
- _instance.resultId = _reader.readString();
570
- break;
571
- case 21:
572
- _instance.status = _reader.readEnum();
573
- break;
574
- default:
575
- _reader.skipField();
576
- }
577
- }
578
- ResultStatusUpdate.refineValues(_instance);
579
- }
580
- /**
581
- * Serializes a message to binary format using provided binary reader
582
- * @param _instance message instance
583
- * @param _writer binary writer instance
584
- */
585
- static serializeBinaryToWriter(_instance, _writer) {
586
- if (_instance.resultId) {
587
- _writer.writeString(20, _instance.resultId);
588
- }
589
- if (_instance.status) {
590
- _writer.writeEnum(21, _instance.status);
591
- }
592
- }
593
- /**
594
- * Message constructor. Initializes the properties and applies default Protobuf values if necessary
595
- * @param _value initial values object or instance of ResultStatusUpdate to deeply clone from
596
- */
597
- constructor(_value) {
598
- _value = _value || {};
599
- this.resultId = _value.resultId;
600
- this.status = _value.status;
601
- ResultStatusUpdate.refineValues(this);
602
- }
603
- get resultId() {
604
- return this._resultId;
605
- }
606
- set resultId(value) {
607
- this._resultId = value;
608
- }
609
- get status() {
610
- return this._status;
611
- }
612
- set status(value) {
613
- this._status = value;
614
- }
615
- /**
616
- * Serialize message to binary data
617
- * @param instance message instance
618
- */
619
- serializeBinary() {
620
- const writer = new BinaryWriter();
621
- ResultStatusUpdate.serializeBinaryToWriter(this, writer);
622
- return writer.getResultBuffer();
623
- }
624
- /**
625
- * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
626
- */
627
- toObject() {
628
- return {
629
- resultId: this.resultId,
630
- status: this.status
631
- };
632
- }
633
- /**
634
- * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
635
- */
636
- toJSON() {
637
- return this.toObject();
638
- }
639
- /**
640
- * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
641
- * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
642
- * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
643
- */
644
- toProtobufJSON(
645
- // @ts-ignore
646
- options) {
647
- return {
648
- resultId: this.resultId,
649
- status: armonikApiGrpcV1Result_status001.ResultStatus[this.status === null || this.status === undefined ? 0 : this.status]
650
- };
651
- }
652
- }
653
- EventSubscriptionResponse.ResultStatusUpdate = ResultStatusUpdate;
654
- /**
655
- * Message implementation for armonik.api.grpc.v1.events.EventSubscriptionResponse.ResultOwnerUpdate
656
- */
657
- class ResultOwnerUpdate {
658
- static { this.id = 'armonik.api.grpc.v1.events.EventSubscriptionResponse.ResultOwnerUpdate'; }
659
- /**
660
- * Deserialize binary data to message
661
- * @param instance message instance
662
- */
663
- static deserializeBinary(bytes) {
664
- const instance = new ResultOwnerUpdate();
665
- ResultOwnerUpdate.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
666
- return instance;
667
- }
668
- /**
669
- * Check all the properties and set default protobuf values if necessary
670
- * @param _instance message instance
671
- */
672
- static refineValues(_instance) {
673
- _instance.resultId = _instance.resultId || '';
674
- _instance.previousOwnerId = _instance.previousOwnerId || '';
675
- _instance.currentOwnerId = _instance.currentOwnerId || '';
676
- }
677
- /**
678
- * Deserializes / reads binary message into message instance using provided binary reader
679
- * @param _instance message instance
680
- * @param _reader binary reader instance
681
- */
682
- static deserializeBinaryFromReader(_instance, _reader) {
683
- while (_reader.nextField()) {
684
- if (_reader.isEndGroup())
685
- break;
686
- switch (_reader.getFieldNumber()) {
687
- case 30:
688
- _instance.resultId = _reader.readString();
689
- break;
690
- case 31:
691
- _instance.previousOwnerId = _reader.readString();
692
- break;
693
- case 32:
694
- _instance.currentOwnerId = _reader.readString();
695
- break;
696
- default:
697
- _reader.skipField();
698
- }
699
- }
700
- ResultOwnerUpdate.refineValues(_instance);
701
- }
702
- /**
703
- * Serializes a message to binary format using provided binary reader
704
- * @param _instance message instance
705
- * @param _writer binary writer instance
706
- */
707
- static serializeBinaryToWriter(_instance, _writer) {
708
- if (_instance.resultId) {
709
- _writer.writeString(30, _instance.resultId);
710
- }
711
- if (_instance.previousOwnerId) {
712
- _writer.writeString(31, _instance.previousOwnerId);
713
- }
714
- if (_instance.currentOwnerId) {
715
- _writer.writeString(32, _instance.currentOwnerId);
716
- }
717
- }
718
- /**
719
- * Message constructor. Initializes the properties and applies default Protobuf values if necessary
720
- * @param _value initial values object or instance of ResultOwnerUpdate to deeply clone from
721
- */
722
- constructor(_value) {
723
- _value = _value || {};
724
- this.resultId = _value.resultId;
725
- this.previousOwnerId = _value.previousOwnerId;
726
- this.currentOwnerId = _value.currentOwnerId;
727
- ResultOwnerUpdate.refineValues(this);
728
- }
729
- get resultId() {
730
- return this._resultId;
731
- }
732
- set resultId(value) {
733
- this._resultId = value;
734
- }
735
- get previousOwnerId() {
736
- return this._previousOwnerId;
737
- }
738
- set previousOwnerId(value) {
739
- this._previousOwnerId = value;
740
- }
741
- get currentOwnerId() {
742
- return this._currentOwnerId;
743
- }
744
- set currentOwnerId(value) {
745
- this._currentOwnerId = value;
746
- }
747
- /**
748
- * Serialize message to binary data
749
- * @param instance message instance
750
- */
751
- serializeBinary() {
752
- const writer = new BinaryWriter();
753
- ResultOwnerUpdate.serializeBinaryToWriter(this, writer);
754
- return writer.getResultBuffer();
755
- }
756
- /**
757
- * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
758
- */
759
- toObject() {
760
- return {
761
- resultId: this.resultId,
762
- previousOwnerId: this.previousOwnerId,
763
- currentOwnerId: this.currentOwnerId
764
- };
765
- }
766
- /**
767
- * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
768
- */
769
- toJSON() {
770
- return this.toObject();
771
- }
772
- /**
773
- * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
774
- * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
775
- * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
776
- */
777
- toProtobufJSON(
778
- // @ts-ignore
779
- options) {
780
- return {
781
- resultId: this.resultId,
782
- previousOwnerId: this.previousOwnerId,
783
- currentOwnerId: this.currentOwnerId
784
- };
785
- }
786
- }
787
- EventSubscriptionResponse.ResultOwnerUpdate = ResultOwnerUpdate;
788
- /**
789
- * Message implementation for armonik.api.grpc.v1.events.EventSubscriptionResponse.NewTask
790
- */
791
- class NewTask {
792
- static { this.id = 'armonik.api.grpc.v1.events.EventSubscriptionResponse.NewTask'; }
793
- /**
794
- * Deserialize binary data to message
795
- * @param instance message instance
796
- */
797
- static deserializeBinary(bytes) {
798
- const instance = new NewTask();
799
- NewTask.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
800
- return instance;
801
- }
802
- /**
803
- * Check all the properties and set default protobuf values if necessary
804
- * @param _instance message instance
805
- */
806
- static refineValues(_instance) {
807
- _instance.taskId = _instance.taskId || '';
808
- _instance.payloadId = _instance.payloadId || '';
809
- _instance.originTaskId = _instance.originTaskId || '';
810
- _instance.status = _instance.status || 0;
811
- _instance.expectedOutputKeys = _instance.expectedOutputKeys || [];
812
- _instance.dataDependencies = _instance.dataDependencies || [];
813
- _instance.retryOfIds = _instance.retryOfIds || [];
814
- _instance.parentTaskIds = _instance.parentTaskIds || [];
815
- }
816
- /**
817
- * Deserializes / reads binary message into message instance using provided binary reader
818
- * @param _instance message instance
819
- * @param _reader binary reader instance
820
- */
821
- static deserializeBinaryFromReader(_instance, _reader) {
822
- while (_reader.nextField()) {
823
- if (_reader.isEndGroup())
824
- break;
825
- switch (_reader.getFieldNumber()) {
826
- case 40:
827
- _instance.taskId = _reader.readString();
828
- break;
829
- case 41:
830
- _instance.payloadId = _reader.readString();
831
- break;
832
- case 42:
833
- _instance.originTaskId = _reader.readString();
834
- break;
835
- case 43:
836
- _instance.status = _reader.readEnum();
837
- break;
838
- case 44:
839
- (_instance.expectedOutputKeys =
840
- _instance.expectedOutputKeys || []).push(_reader.readString());
841
- break;
842
- case 45:
843
- (_instance.dataDependencies =
844
- _instance.dataDependencies || []).push(_reader.readString());
845
- break;
846
- case 46:
847
- (_instance.retryOfIds = _instance.retryOfIds || []).push(_reader.readString());
848
- break;
849
- case 47:
850
- (_instance.parentTaskIds = _instance.parentTaskIds || []).push(_reader.readString());
851
- break;
852
- default:
853
- _reader.skipField();
854
- }
855
- }
856
- NewTask.refineValues(_instance);
857
- }
858
- /**
859
- * Serializes a message to binary format using provided binary reader
860
- * @param _instance message instance
861
- * @param _writer binary writer instance
862
- */
863
- static serializeBinaryToWriter(_instance, _writer) {
864
- if (_instance.taskId) {
865
- _writer.writeString(40, _instance.taskId);
866
- }
867
- if (_instance.payloadId) {
868
- _writer.writeString(41, _instance.payloadId);
869
- }
870
- if (_instance.originTaskId) {
871
- _writer.writeString(42, _instance.originTaskId);
872
- }
873
- if (_instance.status) {
874
- _writer.writeEnum(43, _instance.status);
875
- }
876
- if (_instance.expectedOutputKeys && _instance.expectedOutputKeys.length) {
877
- _writer.writeRepeatedString(44, _instance.expectedOutputKeys);
878
- }
879
- if (_instance.dataDependencies && _instance.dataDependencies.length) {
880
- _writer.writeRepeatedString(45, _instance.dataDependencies);
881
- }
882
- if (_instance.retryOfIds && _instance.retryOfIds.length) {
883
- _writer.writeRepeatedString(46, _instance.retryOfIds);
884
- }
885
- if (_instance.parentTaskIds && _instance.parentTaskIds.length) {
886
- _writer.writeRepeatedString(47, _instance.parentTaskIds);
887
- }
888
- }
889
- /**
890
- * Message constructor. Initializes the properties and applies default Protobuf values if necessary
891
- * @param _value initial values object or instance of NewTask to deeply clone from
892
- */
893
- constructor(_value) {
894
- _value = _value || {};
895
- this.taskId = _value.taskId;
896
- this.payloadId = _value.payloadId;
897
- this.originTaskId = _value.originTaskId;
898
- this.status = _value.status;
899
- this.expectedOutputKeys = (_value.expectedOutputKeys || []).slice();
900
- this.dataDependencies = (_value.dataDependencies || []).slice();
901
- this.retryOfIds = (_value.retryOfIds || []).slice();
902
- this.parentTaskIds = (_value.parentTaskIds || []).slice();
903
- NewTask.refineValues(this);
904
- }
905
- get taskId() {
906
- return this._taskId;
907
- }
908
- set taskId(value) {
909
- this._taskId = value;
910
- }
911
- get payloadId() {
912
- return this._payloadId;
913
- }
914
- set payloadId(value) {
915
- this._payloadId = value;
916
- }
917
- get originTaskId() {
918
- return this._originTaskId;
919
- }
920
- set originTaskId(value) {
921
- this._originTaskId = value;
922
- }
923
- get status() {
924
- return this._status;
925
- }
926
- set status(value) {
927
- this._status = value;
928
- }
929
- get expectedOutputKeys() {
930
- return this._expectedOutputKeys;
931
- }
932
- set expectedOutputKeys(value) {
933
- this._expectedOutputKeys = value;
934
- }
935
- get dataDependencies() {
936
- return this._dataDependencies;
937
- }
938
- set dataDependencies(value) {
939
- this._dataDependencies = value;
940
- }
941
- get retryOfIds() {
942
- return this._retryOfIds;
943
- }
944
- set retryOfIds(value) {
945
- this._retryOfIds = value;
946
- }
947
- get parentTaskIds() {
948
- return this._parentTaskIds;
949
- }
950
- set parentTaskIds(value) {
951
- this._parentTaskIds = value;
952
- }
953
- /**
954
- * Serialize message to binary data
955
- * @param instance message instance
956
- */
957
- serializeBinary() {
958
- const writer = new BinaryWriter();
959
- NewTask.serializeBinaryToWriter(this, writer);
960
- return writer.getResultBuffer();
961
- }
962
- /**
963
- * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
964
- */
965
- toObject() {
966
- return {
967
- taskId: this.taskId,
968
- payloadId: this.payloadId,
969
- originTaskId: this.originTaskId,
970
- status: this.status,
971
- expectedOutputKeys: (this.expectedOutputKeys || []).slice(),
972
- dataDependencies: (this.dataDependencies || []).slice(),
973
- retryOfIds: (this.retryOfIds || []).slice(),
974
- parentTaskIds: (this.parentTaskIds || []).slice()
975
- };
976
- }
977
- /**
978
- * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
979
- */
980
- toJSON() {
981
- return this.toObject();
982
- }
983
- /**
984
- * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
985
- * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
986
- * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
987
- */
988
- toProtobufJSON(
989
- // @ts-ignore
990
- options) {
991
- return {
992
- taskId: this.taskId,
993
- payloadId: this.payloadId,
994
- originTaskId: this.originTaskId,
995
- status: armonikApiGrpcV1Task_status003.TaskStatus[this.status === null || this.status === undefined ? 0 : this.status],
996
- expectedOutputKeys: (this.expectedOutputKeys || []).slice(),
997
- dataDependencies: (this.dataDependencies || []).slice(),
998
- retryOfIds: (this.retryOfIds || []).slice(),
999
- parentTaskIds: (this.parentTaskIds || []).slice()
1000
- };
1001
- }
1002
- }
1003
- EventSubscriptionResponse.NewTask = NewTask;
1004
- /**
1005
- * Message implementation for armonik.api.grpc.v1.events.EventSubscriptionResponse.NewResult
1006
- */
1007
- class NewResult {
1008
- static { this.id = 'armonik.api.grpc.v1.events.EventSubscriptionResponse.NewResult'; }
1009
- /**
1010
- * Deserialize binary data to message
1011
- * @param instance message instance
1012
- */
1013
- static deserializeBinary(bytes) {
1014
- const instance = new NewResult();
1015
- NewResult.deserializeBinaryFromReader(instance, new BinaryReader(bytes));
1016
- return instance;
1017
- }
1018
- /**
1019
- * Check all the properties and set default protobuf values if necessary
1020
- * @param _instance message instance
1021
- */
1022
- static refineValues(_instance) {
1023
- _instance.resultId = _instance.resultId || '';
1024
- _instance.ownerId = _instance.ownerId || '';
1025
- _instance.status = _instance.status || 0;
1026
- }
1027
- /**
1028
- * Deserializes / reads binary message into message instance using provided binary reader
1029
- * @param _instance message instance
1030
- * @param _reader binary reader instance
1031
- */
1032
- static deserializeBinaryFromReader(_instance, _reader) {
1033
- while (_reader.nextField()) {
1034
- if (_reader.isEndGroup())
1035
- break;
1036
- switch (_reader.getFieldNumber()) {
1037
- case 50:
1038
- _instance.resultId = _reader.readString();
1039
- break;
1040
- case 51:
1041
- _instance.ownerId = _reader.readString();
1042
- break;
1043
- case 52:
1044
- _instance.status = _reader.readEnum();
1045
- break;
1046
- default:
1047
- _reader.skipField();
1048
- }
1049
- }
1050
- NewResult.refineValues(_instance);
1051
- }
1052
- /**
1053
- * Serializes a message to binary format using provided binary reader
1054
- * @param _instance message instance
1055
- * @param _writer binary writer instance
1056
- */
1057
- static serializeBinaryToWriter(_instance, _writer) {
1058
- if (_instance.resultId) {
1059
- _writer.writeString(50, _instance.resultId);
1060
- }
1061
- if (_instance.ownerId) {
1062
- _writer.writeString(51, _instance.ownerId);
1063
- }
1064
- if (_instance.status) {
1065
- _writer.writeEnum(52, _instance.status);
1066
- }
1067
- }
1068
- /**
1069
- * Message constructor. Initializes the properties and applies default Protobuf values if necessary
1070
- * @param _value initial values object or instance of NewResult to deeply clone from
1071
- */
1072
- constructor(_value) {
1073
- _value = _value || {};
1074
- this.resultId = _value.resultId;
1075
- this.ownerId = _value.ownerId;
1076
- this.status = _value.status;
1077
- NewResult.refineValues(this);
1078
- }
1079
- get resultId() {
1080
- return this._resultId;
1081
- }
1082
- set resultId(value) {
1083
- this._resultId = value;
1084
- }
1085
- get ownerId() {
1086
- return this._ownerId;
1087
- }
1088
- set ownerId(value) {
1089
- this._ownerId = value;
1090
- }
1091
- get status() {
1092
- return this._status;
1093
- }
1094
- set status(value) {
1095
- this._status = value;
1096
- }
1097
- /**
1098
- * Serialize message to binary data
1099
- * @param instance message instance
1100
- */
1101
- serializeBinary() {
1102
- const writer = new BinaryWriter();
1103
- NewResult.serializeBinaryToWriter(this, writer);
1104
- return writer.getResultBuffer();
1105
- }
1106
- /**
1107
- * Cast message to standard JavaScript object (all non-primitive values are deeply cloned)
1108
- */
1109
- toObject() {
1110
- return {
1111
- resultId: this.resultId,
1112
- ownerId: this.ownerId,
1113
- status: this.status
1114
- };
1115
- }
1116
- /**
1117
- * Convenience method to support JSON.stringify(message), replicates the structure of toObject()
1118
- */
1119
- toJSON() {
1120
- return this.toObject();
1121
- }
1122
- /**
1123
- * Cast message to JSON using protobuf JSON notation: https://developers.google.com/protocol-buffers/docs/proto3#json
1124
- * Attention: output differs from toObject() e.g. enums are represented as names and not as numbers, Timestamp is an ISO Date string format etc.
1125
- * If the message itself or some of descendant messages is google.protobuf.Any, you MUST provide a message pool as options. If not, the messagePool is not required
1126
- */
1127
- toProtobufJSON(
1128
- // @ts-ignore
1129
- options) {
1130
- return {
1131
- resultId: this.resultId,
1132
- ownerId: this.ownerId,
1133
- status: armonikApiGrpcV1Result_status001.ResultStatus[this.status === null || this.status === undefined ? 0 : this.status]
1134
- };
1135
- }
1136
- }
1137
- EventSubscriptionResponse.NewResult = NewResult;
1138
- })(EventSubscriptionResponse || (EventSubscriptionResponse = {}));
1139
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnRzLWNvbW1vbi5wYi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZW9jb25zdWx0aW5nZnIvYXJtb25pay5hcGkuYW5ndWxhci9zcmMvbGliL2dlbmVyYXRlZC9ldmVudHMtY29tbW9uLnBiLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVdBLE9BQU8sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFjLE1BQU0saUJBQWlCLENBQUM7QUFFekUsT0FBTyxLQUFLLGdDQUFnQyxNQUFNLG9CQUFvQixDQUFDO0FBRXZFLE9BQU8sS0FBSyw4QkFBOEIsTUFBTSxrQkFBa0IsQ0FBQztBQUVuRSxPQUFPLEtBQUssMEJBQTBCLE1BQU0sc0JBQXNCLENBQUM7QUFDbkUsT0FBTyxLQUFLLHdCQUF3QixNQUFNLG9CQUFvQixDQUFDO0FBQy9ELE1BQU0sQ0FBTixJQUFZLFVBT1g7QUFQRCxXQUFZLFVBQVU7SUFDcEIsaUZBQTJCLENBQUE7SUFDM0IsMkVBQXdCLENBQUE7SUFDeEIsK0ZBQWtDLENBQUE7SUFDbEMsK0VBQTBCLENBQUE7SUFDMUIsbUdBQW9DLENBQUE7SUFDcEMsaUdBQW1DLENBQUE7QUFDckMsQ0FBQyxFQVBXLFVBQVUsS0FBVixVQUFVLFFBT3JCO0FBQ0Q7O0dBRUc7QUFDSCxNQUFNLE9BQU8sd0JBQXdCO2FBQzVCLE9BQUUsR0FBRyxxREFBcUQsQ0FBQztJQUVsRTs7O09BR0c7SUFDSCxNQUFNLENBQUMsaUJBQWlCLENBQUMsS0FBaUI7UUFDeEMsTUFBTSxRQUFRLEdBQUcsSUFBSSx3QkFBd0IsRUFBRSxDQUFDO1FBQ2hELHdCQUF3QixDQUFDLDJCQUEyQixDQUNsRCxRQUFRLEVBQ1IsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQ3hCLENBQUM7UUFDRixPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLFlBQVksQ0FBQyxTQUFtQztRQUNy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QXVCLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ2hELE9BQU8sTUFBTSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ2xDLENBQUM7UUFFRDs7V0FFRztRQUNILFFBQVE7WUFDTixPQUFPO2dCQUNMLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtnQkFDdkIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO2dCQUNyQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07YUFDcEIsQ0FBQztRQUNKLENBQUM7UUFFRDs7V0FFRztRQUNILE1BQU07WUFDSixPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN6QixDQUFDO1FBRUQ7Ozs7V0FJRztRQUNILGNBQWM7UUFDWixhQUFhO1FBQ2IsT0FBK0I7WUFFL0IsT0FBTztnQkFDTCxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7Z0JBQ3ZCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztnQkFDckIsTUFBTSxFQUNKLGdDQUFnQyxDQUFDLFlBQVksQ0FDM0MsSUFBSSxDQUFDLE1BQU0sS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FDcEU7YUFDSixDQUFDO1FBQ0osQ0FBQzs7SUF6SlUsbUNBQVMsWUEwSnJCLENBQUE7QUFvQkgsQ0FBQyxFQTE5QmEseUJBQXlCLEtBQXpCLHlCQUF5QixRQTA5QnRDIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGUgKi9cbi8qIGVzbGludC1kaXNhYmxlICovXG4vLyBAdHMtbm9jaGVja1xuLy9cbi8vIFRISVMgSVMgQSBHRU5FUkFURUQgRklMRVxuLy8gRE8gTk9UIE1PRElGWSBJVCEgWU9VUiBDSEFOR0VTIFdJTEwgQkUgTE9TVFxuaW1wb3J0IHtcbiAgR3JwY01lc3NhZ2UsXG4gIFJlY3Vyc2l2ZVBhcnRpYWwsXG4gIFRvUHJvdG9idWZKU09OT3B0aW9uc1xufSBmcm9tICdAbmd4LWdycGMvY29tbW9uJztcbmltcG9ydCB7IEJpbmFyeVJlYWRlciwgQmluYXJ5V3JpdGVyLCBCeXRlU291cmNlIH0gZnJvbSAnZ29vZ2xlLXByb3RvYnVmJztcbmltcG9ydCAqIGFzIGFybW9uaWtBcGlHcnBjVjEwMDAgZnJvbSAnLi9maWx0ZXJzLWNvbW1vbi5wYic7XG5pbXBvcnQgKiBhcyBhcm1vbmlrQXBpR3JwY1YxUmVzdWx0X3N0YXR1czAwMSBmcm9tICcuL3Jlc3VsdC1zdGF0dXMucGInO1xuaW1wb3J0ICogYXMgYXJtb25pa0FwaUdycGNWMVJlc3VsdHMwMDIgZnJvbSAnLi9yZXN1bHRzLWZpZWxkcy5wYic7XG5pbXBvcnQgKiBhcyBhcm1vbmlrQXBpR3JwY1YxVGFza19zdGF0dXMwMDMgZnJvbSAnLi90YXNrLXN0YXR1cy5wYic7XG5pbXBvcnQgKiBhcyBhcm1vbmlrQXBpR3JwY1YxVGFza3MwMDQgZnJvbSAnLi90YXNrcy1maWVsZHMucGInO1xuaW1wb3J0ICogYXMgYXJtb25pa0FwaUdycGNWMVJlc3VsdHMwMDUgZnJvbSAnLi9yZXN1bHRzLWZpbHRlcnMucGInO1xuaW1wb3J0ICogYXMgYXJtb25pa0FwaUdycGNWMVRhc2tzMDA2IGZyb20gJy4vdGFza3MtZmlsdGVycy5wYic7XG5leHBvcnQgZW51bSBFdmVudHNFbnVtIHtcbiAgRVZFTlRTX0VOVU1fVU5TUEVDSUZJRUQgPSAwLFxuICBFVkVOVFNfRU5VTV9ORVdfVEFTSyA9IDEsXG4gIEVWRU5UU19FTlVNX1RBU0tfU1RBVFVTX1VQREFURSA9IDIsXG4gIEVWRU5UU19FTlVNX05FV19SRVNVTFQgPSAzLFxuICBFVkVOVFNfRU5VTV9SRVNVTFRfU1RBVFVTX1VQREFURSA9IDQsXG4gIEVWRU5UU19FTlVNX1JFU1VMVF9PV05FUl9VUERBVEUgPSA1XG59XG4vKipcbiAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIGFybW9uaWsuYXBpLmdycGMudjEuZXZlbnRzLkV2ZW50U3Vic2NyaXB0aW9uUmVxdWVzdFxuICovXG5leHBvcnQgY2xhc3MgRXZlbnRTdWJzY3JpcHRpb25SZXF1ZXN0IGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICBzdGF0aWMgaWQgPSAnYXJtb25pay5hcGkuZ3JwYy52MS5ldmVudHMuRXZlbnRTdWJzY3JpcHRpb25SZXF1ZXN0JztcblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgRXZlbnRTdWJzY3JpcHRpb25SZXF1ZXN0KCk7XG4gICAgRXZlbnRTdWJzY3JpcHRpb25SZXF1ZXN0LmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgIGluc3RhbmNlLFxuICAgICAgbmV3IEJpbmFyeVJlYWRlcihieXRlcylcbiAgICApO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBhbGwgdGhlIHByb3BlcnRpZXMgYW5kIHNldCBkZWZhdWx0IHByb3RvYnVmIHZhbHVlcyBpZiBuZWNlc3NhcnlcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgcmVmaW5lVmFsdWVzKF9pbnN0YW5jZTogRXZlbnRTdWJzY3JpcHRpb25SZXF1ZXN0KSB7XG4gICAgX2luc3RhbmNlLnNlc3Npb25JZCA9IF9pbnN0YW5jZS5zZXNzaW9uSWQgfHwgJyc7XG4gICAgX2luc3RhbmNlLnRhc2tzRmlsdGVycyA9IF9pbnN0YW5jZS50YXNrc0ZpbHRlcnMgfHwgdW5kZWZpbmVkO1xuICAgIF9pbnN0YW5jZS5yZXN1bHRzRmlsdGVycyA9IF9pbnN0YW5jZS5yZXN1bHRzRmlsdGVycyB8fCB1bmRlZmluZWQ7XG4gICAgX2luc3RhbmNlLnJldHVybmVkRXZlbnRzID0gX2luc3RhbmNlLnJldHVybmVkRXZlbnRzIHx8IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplcyAvIHJlYWRzIGJpbmFyeSBtZXNzYWdlIGludG8gbWVzc2FnZSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgIF9pbnN0YW5jZTogRXZlbnRTdWJzY3JpcHRpb25SZXF1ZXN0LFxuICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICApIHtcbiAgICB3aGlsZSAoX3JlYWRlci5uZXh0RmllbGQoKSkge1xuICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIF9pbnN0YW5jZS5zZXNzaW9uSWQgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIF9pbnN0YW5jZS50YXNrc0ZpbHRlcnMgPSBuZXcgYXJtb25pa0FwaUdycGNWMVRhc2tzMDA2LkZpbHRlcnMoKTtcbiAgICAgICAgICBfcmVhZGVyLnJlYWRNZXNzYWdlKFxuICAgICAgICAgICAgX2luc3RhbmNlLnRhc2tzRmlsdGVycyxcbiAgICAgICAgICAgIGFybW9uaWtBcGlHcnBjVjFUYXNrczAwNi5GaWx0ZXJzLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBfaW5zdGFuY2UucmVzdWx0c0ZpbHRlcnMgPSBuZXcgYXJtb25pa0FwaUdycGNWMVJlc3VsdHMwMDUuRmlsdGVycygpO1xuICAgICAgICAgIF9yZWFkZXIucmVhZE1lc3NhZ2UoXG4gICAgICAgICAgICBfaW5zdGFuY2UucmVzdWx0c0ZpbHRlcnMsXG4gICAgICAgICAgICBhcm1vbmlrQXBpR3JwY1YxUmVzdWx0czAwNS5GaWx0ZXJzLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAoX2luc3RhbmNlLnJldHVybmVkRXZlbnRzID0gX2luc3RhbmNlLnJldHVybmVkRXZlbnRzIHx8IFtdKS5wdXNoKFxuICAgICAgICAgICAgLi4uKF9yZWFkZXIucmVhZFBhY2tlZEVudW0oKSB8fCBbXSlcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgRXZlbnRTdWJzY3JpcHRpb25SZXF1ZXN0LnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKFxuICAgIF9pbnN0YW5jZTogRXZlbnRTdWJzY3JpcHRpb25SZXF1ZXN0LFxuICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICApIHtcbiAgICBpZiAoX2luc3RhbmNlLnNlc3Npb25JZCkge1xuICAgICAgX3dyaXRlci53cml0ZVN0cmluZygxLCBfaW5zdGFuY2Uuc2Vzc2lvbklkKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS50YXNrc0ZpbHRlcnMpIHtcbiAgICAgIF93cml0ZXIud3JpdGVNZXNzYWdlKFxuICAgICAgICAyLFxuICAgICAgICBfaW5zdGFuY2UudGFza3NGaWx0ZXJzIGFzIGFueSxcbiAgICAgICAgYXJtb25pa0FwaUdycGNWMVRhc2tzMDA2LkZpbHRlcnMuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UucmVzdWx0c0ZpbHRlcnMpIHtcbiAgICAgIF93cml0ZXIud3JpdGVNZXNzYWdlKFxuICAgICAgICAzLFxuICAgICAgICBfaW5zdGFuY2UucmVzdWx0c0ZpbHRlcnMgYXMgYW55LFxuICAgICAgICBhcm1vbmlrQXBpR3JwY1YxUmVzdWx0czAwNS5GaWx0ZXJzLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLnJldHVybmVkRXZlbnRzICYmIF9pbnN0YW5jZS5yZXR1cm5lZEV2ZW50cy5sZW5ndGgpIHtcbiAgICAgIF93cml0ZXIud3JpdGVQYWNrZWRFbnVtKDQsIF9pbnN0YW5jZS5yZXR1cm5lZEV2ZW50cyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2Vzc2lvbklkOiBzdHJpbmc7XG4gIHByaXZhdGUgX3Rhc2tzRmlsdGVycz86IGFybW9uaWtBcGlHcnBjVjFUYXNrczAwNi5GaWx0ZXJzO1xuICBwcml2YXRlIF9yZXN1bHRzRmlsdGVycz86IGFybW9uaWtBcGlHcnBjVjFSZXN1bHRzMDA1LkZpbHRlcnM7XG4gIHByaXZhdGUgX3JldHVybmVkRXZlbnRzOiBFdmVudHNFbnVtW107XG5cbiAgLyoqXG4gICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gX3ZhbHVlIGluaXRpYWwgdmFsdWVzIG9iamVjdCBvciBpbnN0YW5jZSBvZiBFdmVudFN1YnNjcmlwdGlvblJlcXVlc3QgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICovXG4gIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8RXZlbnRTdWJzY3JpcHRpb25SZXF1ZXN0LkFzT2JqZWN0Pikge1xuICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICB0aGlzLnNlc3Npb25JZCA9IF92YWx1ZS5zZXNzaW9uSWQ7XG4gICAgdGhpcy50YXNrc0ZpbHRlcnMgPSBfdmFsdWUudGFza3NGaWx0ZXJzXG4gICAgICA/IG5ldyBhcm1vbmlrQXBpR3JwY1YxVGFza3MwMDYuRmlsdGVycyhfdmFsdWUudGFza3NGaWx0ZXJzKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5yZXN1bHRzRmlsdGVycyA9IF92YWx1ZS5yZXN1bHRzRmlsdGVyc1xuICAgICAgPyBuZXcgYXJtb25pa0FwaUdycGNWMVJlc3VsdHMwMDUuRmlsdGVycyhfdmFsdWUucmVzdWx0c0ZpbHRlcnMpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLnJldHVybmVkRXZlbnRzID0gKF92YWx1ZS5yZXR1cm5lZEV2ZW50cyB8fCBbXSkuc2xpY2UoKTtcbiAgICBFdmVudFN1YnNjcmlwdGlvblJlcXVlc3QucmVmaW5lVmFsdWVzKHRoaXMpO1xuICB9XG4gIGdldCBzZXNzaW9uSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbklkO1xuICB9XG4gIHNldCBzZXNzaW9uSWQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3Nlc3Npb25JZCA9IHZhbHVlO1xuICB9XG4gIGdldCB0YXNrc0ZpbHRlcnMoKTogYXJtb25pa0FwaUdycGNWMVRhc2tzMDA2LkZpbHRlcnMgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl90YXNrc0ZpbHRlcnM7XG4gIH1cbiAgc2V0IHRhc2tzRmlsdGVycyh2YWx1ZTogYXJtb25pa0FwaUdycGNWMVRhc2tzMDA2LkZpbHRlcnMgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl90YXNrc0ZpbHRlcnMgPSB2YWx1ZTtcbiAgfVxuICBnZXQgcmVzdWx0c0ZpbHRlcnMoKTogYXJtb25pa0FwaUdycGNWMVJlc3VsdHMwMDUuRmlsdGVycyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3Jlc3VsdHNGaWx0ZXJzO1xuICB9XG4gIHNldCByZXN1bHRzRmlsdGVycyh2YWx1ZTogYXJtb25pa0FwaUdycGNWMVJlc3VsdHMwMDUuRmlsdGVycyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3Jlc3VsdHNGaWx0ZXJzID0gdmFsdWU7XG4gIH1cbiAgZ2V0IHJldHVybmVkRXZlbnRzKCk6IEV2ZW50c0VudW1bXSB7XG4gICAgcmV0dXJuIHRoaXMuX3JldHVybmVkRXZlbnRzO1xuICB9XG4gIHNldCByZXR1cm5lZEV2ZW50cyh2YWx1ZTogRXZlbnRzRW51bVtdKSB7XG4gICAgdGhpcy5fcmV0dXJuZWRFdmVudHMgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBFdmVudFN1YnNjcmlwdGlvblJlcXVlc3Quc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgKi9cbiAgdG9PYmplY3QoKTogRXZlbnRTdWJzY3JpcHRpb25SZXF1ZXN0LkFzT2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgc2Vzc2lvbklkOiB0aGlzLnNlc3Npb25JZCxcbiAgICAgIHRhc2tzRmlsdGVyczogdGhpcy50YXNrc0ZpbHRlcnNcbiAgICAgICAgPyB0aGlzLnRhc2tzRmlsdGVycy50b09iamVjdCgpXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgcmVzdWx0c0ZpbHRlcnM6IHRoaXMucmVzdWx0c0ZpbHRlcnNcbiAgICAgICAgPyB0aGlzLnJlc3VsdHNGaWx0ZXJzLnRvT2JqZWN0KClcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICByZXR1cm5lZEV2ZW50czogKHRoaXMucmV0dXJuZWRFdmVudHMgfHwgW10pLnNsaWNlKClcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAqIEF0dGVudGlvbjogb3V0cHV0IGRpZmZlcnMgZnJvbSB0b09iamVjdCgpIGUuZy4gZW51bXMgYXJlIHJlcHJlc2VudGVkIGFzIG5hbWVzIGFuZCBub3QgYXMgbnVtYmVycywgVGltZXN0YW1wIGlzIGFuIElTTyBEYXRlIHN0cmluZyBmb3JtYXQgZXRjLlxuICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAqL1xuICB0b1Byb3RvYnVmSlNPTihcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICApOiBFdmVudFN1YnNjcmlwdGlvblJlcXVlc3QuQXNQcm90b2J1ZkpTT04ge1xuICAgIHJldHVybiB7XG4gICAgICBzZXNzaW9uSWQ6IHRoaXMuc2Vzc2lvbklkLFxuICAgICAgdGFza3NGaWx0ZXJzOiB0aGlzLnRhc2tzRmlsdGVyc1xuICAgICAgICA/IHRoaXMudGFza3NGaWx0ZXJzLnRvUHJvdG9idWZKU09OKG9wdGlvbnMpXG4gICAgICAgIDogbnVsbCxcbiAgICAgIHJlc3VsdHNGaWx0ZXJzOiB0aGlzLnJlc3VsdHNGaWx0ZXJzXG4gICAgICAgID8gdGhpcy5yZXN1bHRzRmlsdGVycy50b1Byb3RvYnVmSlNPTihvcHRpb25zKVxuICAgICAgICA6IG51bGwsXG4gICAgICByZXR1cm5lZEV2ZW50czogKHRoaXMucmV0dXJuZWRFdmVudHMgfHwgW10pLm1hcCh2ID0+IEV2ZW50c0VudW1bdl0pXG4gICAgfTtcbiAgfVxufVxuZXhwb3J0IG1vZHVsZSBFdmVudFN1YnNjcmlwdGlvblJlcXVlc3Qge1xuICAvKipcbiAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIEV2ZW50U3Vic2NyaXB0aW9uUmVxdWVzdFxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gICAgdGFza3NGaWx0ZXJzPzogYXJtb25pa0FwaUdycGNWMVRhc2tzMDA2LkZpbHRlcnMuQXNPYmplY3Q7XG4gICAgcmVzdWx0c0ZpbHRlcnM/OiBhcm1vbmlrQXBpR3JwY1YxUmVzdWx0czAwNS5GaWx0ZXJzLkFzT2JqZWN0O1xuICAgIHJldHVybmVkRXZlbnRzOiBFdmVudHNFbnVtW107XG4gIH1cblxuICAvKipcbiAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgRXZlbnRTdWJzY3JpcHRpb25SZXF1ZXN0XG4gICAqL1xuICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgICB0YXNrc0ZpbHRlcnM6IGFybW9uaWtBcGlHcnBjVjFUYXNrczAwNi5GaWx0ZXJzLkFzUHJvdG9idWZKU09OIHwgbnVsbDtcbiAgICByZXN1bHRzRmlsdGVyczogYXJtb25pa0FwaUdycGNWMVJlc3VsdHMwMDUuRmlsdGVycy5Bc1Byb3RvYnVmSlNPTiB8IG51bGw7XG4gICAgcmV0dXJuZWRFdmVudHM6IHN0cmluZ1tdO1xuICB9XG59XG5cbi8qKlxuICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3IgYXJtb25pay5hcGkuZ3JwYy52MS5ldmVudHMuRXZlbnRTdWJzY3JpcHRpb25SZXNwb25zZVxuICovXG5leHBvcnQgY2xhc3MgRXZlbnRTdWJzY3JpcHRpb25SZXNwb25zZSBpbXBsZW1lbnRzIEdycGNNZXNzYWdlIHtcbiAgc3RhdGljIGlkID0gJ2FybW9uaWsuYXBpLmdycGMudjEuZXZlbnRzLkV2ZW50U3Vic2NyaXB0aW9uUmVzcG9uc2UnO1xuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBFdmVudFN1YnNjcmlwdGlvblJlc3BvbnNlKCk7XG4gICAgRXZlbnRTdWJzY3JpcHRpb25SZXNwb25zZS5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgICBpbnN0YW5jZSxcbiAgICAgIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpXG4gICAgKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IEV2ZW50U3Vic2NyaXB0aW9uUmVzcG9uc2UpIHtcbiAgICBfaW5zdGFuY2Uuc2Vzc2lvbklkID0gX2luc3RhbmNlLnNlc3Npb25JZCB8fCAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZXMgLyByZWFkcyBiaW5hcnkgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICogQHBhcmFtIF9yZWFkZXIgYmluYXJ5IHJlYWRlciBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICBfaW5zdGFuY2U6IEV2ZW50U3Vic2NyaXB0aW9uUmVzcG9uc2UsXG4gICAgX3JlYWRlcjogQmluYXJ5UmVhZGVyXG4gICkge1xuICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICBpZiAoX3JlYWRlci5pc0VuZEdyb3VwKCkpIGJyZWFrO1xuXG4gICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgX2luc3RhbmNlLnNlc3Npb25JZCA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgX2luc3RhbmNlLnRhc2tTdGF0dXNVcGRhdGUgPSBuZXcgRXZlbnRTdWJzY3JpcHRpb25SZXNwb25zZS5UYXNrU3RhdHVzVXBkYXRlKCk7XG4gICAgICAgICAgX3JlYWRlci5yZWFkTWVzc2FnZShcbiAgICAgICAgICAgIF9pbnN0YW5jZS50YXNrU3RhdHVzVXBkYXRlLFxuICAgICAgICAgICAgRXZlbnRTdWJzY3JpcHRpb25SZXNwb25zZS5UYXNrU3RhdHVzVXBkYXRlXG4gICAgICAgICAgICAgIC5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgX2luc3RhbmNlLnJlc3VsdFN0YXR1c1VwZGF0ZSA9IG5ldyBFdmVudFN1YnNjcmlwdGlvblJlc3BvbnNlLlJlc3VsdFN0YXR1c1VwZGF0ZSgpO1xuICAgICAgICAgIF9yZWFkZXIucmVhZE1lc3NhZ2UoXG4gICAgICAgICAgICBfaW5zdGFuY2UucmVzdWx0U3RhdHVzVXBkYXRlLFxuICAgICAgICAgICAgRXZlbnRTdWJzY3JpcHRpb25SZXNwb25zZS5SZXN1bHRTdGF0dXNVcGRhdGVcbiAgICAgICAgICAgICAgLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBfaW5zdGFuY2UucmVzdWx0T3duZXJVcGRhdGUgPSBuZXcgRXZlbnRTdWJzY3JpcHRpb25SZXNwb25zZS5SZXN1bHRPd25lclVwZGF0ZSgpO1xuICAgICAgICAgIF9yZWFkZXIucmVhZE1lc3NhZ2UoXG4gICAgICAgICAgICBfaW5zdGFuY2UucmVzdWx0T3duZXJVcGRhdGUsXG4gICAgICAgICAgICBFdmVudFN1YnNjcmlwdGlvblJlc3BvbnNlLlJlc3VsdE93bmVyVXBkYXRlXG4gICAgICAgICAgICAgIC5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgX2luc3RhbmNlLm5ld1Rhc2sgPSBuZXcgRXZlbnRTdWJzY3JpcHRpb25SZXNwb25zZS5OZXdUYXNrKCk7XG4gICAgICAgICAgX3JlYWRlci5yZWFkTWVzc2FnZShcbiAgICAgICAgICAgIF9pbnN0YW5jZS5uZXdUYXNrLFxuICAgICAgICAgICAgRXZlbnRTdWJzY3JpcHRpb25SZXNwb25zZS5OZXdUYXNrLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlclxuICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNjpcbiAgICAgICAgICBfaW5zdGFuY2UubmV3UmVzdWx0ID0gbmV3IEV2ZW50U3Vic2NyaXB0aW9uUmVzcG9uc2UuTmV3UmVzdWx0KCk7XG4gICAgICAgICAgX3JlYWRlci5yZWFkTWVzc2FnZShcbiAgICAgICAgICAgIF9pbnN0YW5jZS5uZXdSZXN1bHQsXG4gICAgICAgICAgICBFdmVudFN1YnNjcmlwdGlvblJlc3BvbnNlLk5ld1Jlc3VsdC5kZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXJcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgRXZlbnRTdWJzY3JpcHRpb25SZXNwb25zZS5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICBfaW5zdGFuY2U6IEV2ZW50U3Vic2NyaXB0aW9uUmVzcG9uc2UsXG4gICAgX3dyaXRlcjogQmluYXJ5V3JpdGVyXG4gICkge1xuICAgIGlmIChfaW5zdGFuY2Uuc2Vzc2lvbklkKSB7XG4gICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDEsIF9pbnN0YW5jZS5zZXNzaW9uSWQpO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLnRhc2tTdGF0dXNVcGRhdGUpIHtcbiAgICAgIF93cml0ZXIud3JpdGVNZXNzYWdlKFxuICAgICAgICAyLFxuICAgICAgICBfaW5zdGFuY2UudGFza1N0YXR1c1VwZGF0ZSBhcyBhbnksXG4gICAgICAgIEV2ZW50U3Vic2NyaXB0aW9uUmVzcG9uc2UuVGFza1N0YXR1c1VwZGF0ZS5zZXJpYWxpemVCaW5hcnlUb1dyaXRlclxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5yZXN1bHRTdGF0dXNVcGRhdGUpIHtcbiAgICAgIF93cml0ZXIud3JpdGVNZXNzYWdlKFxuICAgICAgICAzLFxuICAgICAgICBfaW5zdGFuY2UucmVzdWx0U3RhdHVzVXBkYXRlIGFzIGFueSxcbiAgICAgICAgRXZlbnRTdWJzY3JpcHRpb25SZXNwb25zZS5SZXN1bHRTdGF0dXNVcGRhdGUuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChfaW5zdGFuY2UucmVzdWx0T3duZXJVcGRhdGUpIHtcbiAgICAgIF93cml0ZXIud3JpdGVNZXNzYWdlKFxuICAgICAgICA0LFxuICAgICAgICBfaW5zdGFuY2UucmVzdWx0T3duZXJVcGRhdGUgYXMgYW55LFxuICAgICAgICBFdmVudFN1YnNjcmlwdGlvblJlc3BvbnNlLlJlc3VsdE93bmVyVXBkYXRlLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoX2luc3RhbmNlLm5ld1Rhc2spIHtcbiAgICAgIF93cml0ZXIud3JpdGVNZXNzYWdlKFxuICAgICAgICA1LFxuICAgICAgICBfaW5zdGFuY2UubmV3VGFzayBhcyBhbnksXG4gICAgICAgIEV2ZW50U3Vic2NyaXB0aW9uUmVzcG9uc2UuTmV3VGFzay5zZXJpYWxpemVCaW5hcnlUb1dyaXRlclxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKF9pbnN0YW5jZS5uZXdSZXN1bHQpIHtcbiAgICAgIF93cml0ZXIud3JpdGVNZXNzYWdlKFxuICAgICAgICA2LFxuICAgICAgICBfaW5zdGFuY2UubmV3UmVzdWx0IGFzIGFueSxcbiAgICAgICAgRXZlbnRTdWJzY3JpcHRpb25SZXNwb25zZS5OZXdSZXN1bHQuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXJcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2Vzc2lvbklkOiBzdHJpbmc7XG4gIHByaXZhdGUgX3Rhc2tTdGF0dXNVcGRhdGU/OiBFdmVudFN1YnNjcmlwdGlvblJlc3BvbnNlLlRhc2tTdGF0dXNVcGRhdGU7XG4gIHByaXZhdGUgX3Jlc3VsdFN0YXR1c1VwZGF0ZT86IEV2ZW50U3Vic2NyaXB0aW9uUmVzcG9uc2UuUmVzdWx0U3RhdHVzVXBkYXRlO1xuICBwcml2YXRlIF9yZXN1bHRPd25lclVwZGF0ZT86IEV2ZW50U3Vic2NyaXB0aW9uUmVzcG9uc2UuUmVzdWx0T3duZXJVcGRhdGU7XG4gIHByaXZhdGUgX25ld1Rhc2s/OiBFdmVudFN1YnNjcmlwdGlvblJlc3BvbnNlLk5ld1Rhc2s7XG4gIHByaXZhdGUgX25ld1Jlc3VsdD86IEV2ZW50U3Vic2NyaXB0aW9uUmVzcG9uc2UuTmV3UmVzdWx0O1xuXG4gIHByaXZhdGUgX3VwZGF0ZTogRXZlbnRTdWJzY3JpcHRpb25SZXNwb25zZS5VcGRhdGVDYXNlID1cbiAgICBFdmVudFN1YnNjcmlwdGlvblJlc3BvbnNlLlVwZGF0ZUNhc2Uubm9uZTtcblxuICAvKipcbiAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIEV2ZW50U3Vic2NyaXB0aW9uUmVzcG9uc2UgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICovXG4gIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8RXZlbnRTdWJzY3JpcHRpb25SZXNwb25zZS5Bc09iamVjdD4pIHtcbiAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgdGhpcy5zZXNzaW9uSWQgPSBfdmFsdWUuc2Vzc2lvbklkO1xuICAgIHRoaXMudGFza1N0YXR1c1VwZGF0ZSA9IF92YWx1ZS50YXNrU3RhdHVzVXBkYXRlXG4gICAgICA/IG5ldyBFdmVudFN1YnNjcmlwdGlvblJlc3BvbnNlLlRhc2tTdGF0dXNVcGRhdGUoX3ZhbHVlLnRhc2tTdGF0dXNVcGRhdGUpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLnJlc3VsdFN0YXR1c1VwZGF0ZSA9IF92YWx1ZS5yZXN1bHRTdGF0dXNVcGRhdGVcbiAgICAgID8gbmV3IEV2ZW50U3Vic2NyaXB0aW9uUmVzcG9uc2UuUmVzdWx0U3RhdHVzVXBkYXRlKFxuICAgICAgICAgIF92YWx1ZS5yZXN1bHRTdGF0dXNVcGRhdGVcbiAgICAgICAgKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5yZXN1bHRPd25lclVwZGF0ZSA9IF92YWx1ZS5yZXN1bHRPd25lclVwZGF0ZVxuICAgICAgPyBuZXcgRXZlbnRTdWJzY3JpcHRpb25SZXNwb25zZS5SZXN1bHRPd25lclVwZGF0ZShcbiAgICAgICAgICBfdmFsdWUucmVzdWx0T3duZXJVcGRhdGVcbiAgICAgICAgKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5uZXdUYXNrID0gX3ZhbHVlLm5ld1Rhc2tcbiAgICAgID8gbmV3IEV2ZW50U3Vic2NyaXB0aW9uUmVzcG9uc2UuTmV3VGFzayhfdmFsdWUubmV3VGFzaylcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIHRoaXMubmV3UmVzdWx0ID0gX3ZhbHVlLm5ld1Jlc3VsdFxuICAgICAgPyBuZXcgRXZlbnRTdWJzY3JpcHRpb25SZXNwb25zZS5OZXdSZXN1bHQoX3ZhbHVlLm5ld1Jlc3VsdClcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIEV2ZW50U3Vic2NyaXB0aW9uUmVzcG9uc2UucmVmaW5lVmFsdWVzKHRoaXMpO1xuICB9XG4gIGdldCBzZXNzaW9uSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbklkO1xuICB9XG4gIHNldCBzZXNzaW9uSWQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3Nlc3Npb25JZCA9IHZhbHVlO1xuICB9XG4gIGdldCB0YXNrU3RhdHVzVXBkYXRlKCk6XG4gICAgfCBFdmVudFN1YnNjcmlwdGlvblJlc3BvbnNlLlRhc2tTdGF0dXNVcGRhdGVcbiAgICB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3Rhc2tTdGF0dXNVcGRhdGU7XG4gIH1cbiAgc2V0IHRhc2tTdGF0dXNVcGRhdGUoXG4gICAgdmFsdWU6IEV2ZW50U3Vic2NyaXB0aW9uUmVzcG9uc2UuVGFza1N0YXR1c1VwZGF0ZSB8IHVuZGVmaW5lZFxuICApIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5fcmVzdWx0U3RhdHVzVXBkYXRlID0gdGhpcy5fcmVzdWx0T3duZXJVcGRhdGUgPSB0aGlzLl9uZXdUYXNrID0gdGhpcy5fbmV3UmVzdWx0ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdXBkYXRlID0gRXZlbnRTdWJzY3JpcHRpb25SZXNwb25zZS5VcGRhdGVDYXNlLnRhc2tTdGF0dXNVcGRhdGU7XG4gICAgfVxuICAgIHRoaXMuX3Rhc2tTdGF0dXNVcGRhdGUgPSB2YWx1ZTtcbiAgfVxuICBnZXQgcmVzdWx0U3RhdHVzVXBkYXRlKCk6XG4gICAgfCBFdmVudFN1YnNjcmlwdGlvblJlc3BvbnNlLlJlc3VsdFN0YXR1c1VwZGF0ZVxuICAgIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fcmVzdWx0U3RhdHVzVXBkYXRlO1xuICB9XG4gIHNldCByZXN1bHRTdGF0dXNVcGRhdGUoXG4gICAgdmFsdWU6IEV2ZW50U3Vic2NyaXB0aW9uUmVzcG9uc2UuUmVzdWx0U3RhdHVzVXBkYXRlIHwgdW5kZWZpbmVkXG4gICkge1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICB0aGlzLl90YXNrU3RhdHVzVXBkYXRlID0gdGhpcy5fcmVzdWx0T3duZXJVcGRhdGUgPSB0aGlzLl9uZXdUYXNrID0gdGhpcy5fbmV3UmVzdWx0ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdXBkYXRlID0gRXZlbnRTdWJzY3JpcHRpb25SZXNwb25zZS5VcGRhdGVDYXNlLnJlc3VsdFN0YXR1c1VwZGF0ZTtcbiAgICB9XG4gICAgdGhpcy5fcmVzdWx0U3RhdHVzVXBkYXRlID0gdmFsdWU7XG4gIH1cbiAgZ2V0IHJlc3VsdE93bmVyVXBkYXRlKCk6XG4gICAgfCBFdmVudFN1YnNjcmlwdGlvblJlc3BvbnNlLlJlc3VsdE93bmVyVXBkYXRlXG4gICAgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9yZXN1bHRPd25lclVwZGF0ZTtcbiAgfVxuICBzZXQgcmVzdWx0T3duZXJVcGRhdGUoXG4gICAgdmFsdWU6IEV2ZW50U3Vic2NyaXB0aW9uUmVzcG9uc2UuUmVzdWx0T3duZXJVcGRhdGUgfCB1bmRlZmluZWRcbiAgKSB7XG4gICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuX3Rhc2tTdGF0dXNVcGRhdGUgPSB0aGlzLl9yZXN1bHRTdGF0dXNVcGRhdGUgPSB0aGlzLl9uZXdUYXNrID0gdGhpcy5fbmV3UmVzdWx0ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdXBkYXRlID0gRXZlbnRTdWJzY3JpcHRpb25SZXNwb25zZS5VcGRhdGVDYXNlLnJlc3VsdE93bmVyVXBkYXRlO1xuICAgIH1cbiAgICB0aGlzLl9yZXN1bHRPd25lclVwZGF0ZSA9IHZhbHVlO1xuICB9XG4gIGdldCBuZXdUYXNrKCk6IEV2ZW50U3Vic2NyaXB0aW9uUmVzcG9uc2UuTmV3VGFzayB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX25ld1Rhc2s7XG4gIH1cbiAgc2V0IG5ld1Rhc2sodmFsdWU6IEV2ZW50U3Vic2NyaXB0aW9uUmVzcG9uc2UuTmV3VGFzayB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICB0aGlzLl90YXNrU3RhdHVzVXBkYXRlID0gdGhpcy5fcmVzdWx0U3RhdHVzVXBkYXRlID0gdGhpcy5fcmVzdWx0T3duZXJVcGRhdGUgPSB0aGlzLl9uZXdSZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl91cGRhdGUgPSBFdmVudFN1YnNjcmlwdGlvblJlc3BvbnNlLlVwZGF0ZUNhc2UubmV3VGFzaztcbiAgICB9XG4gICAgdGhpcy5fbmV3VGFzayA9IHZhbHVlO1xuICB9XG4gIGdldCBuZXdSZXN1bHQoKTogRXZlbnRTdWJzY3JpcHRpb25SZXNwb25zZS5OZXdSZXN1bHQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9uZXdSZXN1bHQ7XG4gIH1cbiAgc2V0IG5ld1Jlc3VsdCh2YWx1ZTogRXZlbnRTdWJzY3JpcHRpb25SZXNwb25zZS5OZXdSZXN1bHQgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5fdGFza1N0YXR1c1VwZGF0ZSA9IHRoaXMuX3Jlc3VsdFN0YXR1c1VwZGF0ZSA9IHRoaXMuX3Jlc3VsdE93bmVyVXBkYXRlID0gdGhpcy5fbmV3VGFzayA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3VwZGF0ZSA9IEV2ZW50U3Vic2NyaXB0aW9uUmVzcG9uc2UuVXBkYXRlQ2FzZS5uZXdSZXN1bHQ7XG4gICAgfVxuICAgIHRoaXMuX25ld1Jlc3VsdCA9IHZhbHVlO1xuICB9XG4gIGdldCB1cGRhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3VwZGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgKi9cbiAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICBFdmVudFN1YnNjcmlwdGlvblJlc3BvbnNlLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgcmV0dXJuIHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gc3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgKGFsbCBub24tcHJpbWl0aXZlIHZhbHVlcyBhcmUgZGVlcGx5IGNsb25lZClcbiAgICovXG4gIHRvT2JqZWN0KCk6IEV2ZW50U3Vic2NyaXB0aW9uUmVzcG9uc2UuQXNPYmplY3Qge1xuICAgIHJldHVybiB7XG4gICAgICBzZXNzaW9uSWQ6IHRoaXMuc2Vzc2lvbklkLFxuICAgICAgdGFza1N0YXR1c1VwZGF0ZTogdGhpcy50YXNrU3RhdHVzVXBkYXRlXG4gICAgICAgID8gdGhpcy50YXNrU3RhdHVzVXBkYXRlLnRvT2JqZWN0KClcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICByZXN1bHRTdGF0dXNVcGRhdGU6IHRoaXMucmVzdWx0U3RhdHVzVXBkYXRlXG4gICAgICAgID8gdGhpcy5yZXN1bHRTdGF0dXNVcGRhdGUudG9PYmplY3QoKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIHJlc3VsdE93bmVyVXBkYXRlOiB0aGlzLnJlc3VsdE93bmVyVXBkYXRlXG4gICAgICAgID8gdGhpcy5yZXN1bHRPd25lclVwZGF0ZS50b09iamVjdCgpXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgbmV3VGFzazogdGhpcy5uZXdUYXNrID8gdGhpcy5uZXdUYXNrLnRvT2JqZWN0KCkgOiB1bmRlZmluZWQsXG4gICAgICBuZXdSZXN1bHQ6IHRoaXMubmV3UmVzdWx0ID8gdGhpcy5uZXdSZXN1bHQudG9PYmplY3QoKSA6IHVuZGVmaW5lZFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAqIElmIHRoZSBtZXNzYWdlIGl0c2VsZiBvciBzb21lIG9mIGRlc2NlbmRhbnQgbWVzc2FnZXMgaXMgZ29vZ2xlLnByb3RvYnVmLkFueSwgeW91IE1VU1QgcHJvdmlkZSBhIG1lc3NhZ2UgcG9vbCBhcyBvcHRpb25zLiBJZiBub3QsIHRoZSBtZXNzYWdlUG9vbCBpcyBub3QgcmVxdWlyZWRcbiAgICovXG4gIHRvUHJvdG9idWZKU09OKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICk6IEV2ZW50U3Vic2NyaXB0aW9uUmVzcG9uc2UuQXNQcm90b2J1ZkpTT04ge1xuICAgIHJldHVybiB7XG4gICAgICBzZXNzaW9uSWQ6IHRoaXMuc2Vzc2lvbklkLFxuICAgICAgdGFza1N0YXR1c1VwZGF0ZTogdGhpcy50YXNrU3RhdHVzVXBkYXRlXG4gICAgICAgID8gdGhpcy50YXNrU3RhdHVzVXBkYXRlLnRvUHJvdG9idWZKU09OKG9wdGlvbnMpXG4gICAgICAgIDogbnVsbCxcbiAgICAgIHJlc3VsdFN0YXR1c1VwZGF0ZTogdGhpcy5yZXN1bHRTdGF0dXNVcGRhdGVcbiAgICAgICAgPyB0aGlzLnJlc3VsdFN0YXR1c1VwZGF0ZS50b1Byb3RvYnVmSlNPTihvcHRpb25zKVxuICAgICAgICA6IG51bGwsXG4gICAgICByZXN1bHRPd25lclVwZGF0ZTogdGhpcy5yZXN1bHRPd25lclVwZGF0ZVxuICAgICAgICA/IHRoaXMucmVzdWx0T3duZXJVcGRhdGUudG9Qcm90b2J1ZkpTT04ob3B0aW9ucylcbiAgICAgICAgOiBudWxsLFxuICAgICAgbmV3VGFzazogdGhpcy5uZXdUYXNrID8gdGhpcy5uZXdUYXNrLnRvUHJvdG9idWZKU09OKG9wdGlvbnMpIDogbnVsbCxcbiAgICAgIG5ld1Jlc3VsdDogdGhpcy5uZXdSZXN1bHQgPyB0aGlzLm5ld1Jlc3VsdC50b1Byb3RvYnVmSlNPTihvcHRpb25zKSA6IG51bGxcbiAgICB9O1xuICB9XG59XG5leHBvcnQgbW9kdWxlIEV2ZW50U3Vic2NyaXB0aW9uUmVzcG9uc2Uge1xuICAvKipcbiAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIEV2ZW50U3Vic2NyaXB0aW9uUmVzcG9uc2VcbiAgICovXG4gIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgIHNlc3Npb25JZDogc3RyaW5nO1xuICAgIHRhc2tTdGF0dXNVcGRhdGU/OiBFdmVudFN1YnNjcmlwdGlvblJlc3BvbnNlLlRhc2tTdGF0dXNVcGRhdGUuQXNPYmplY3Q7XG4gICAgcmVzdWx0U3RhdHVzVXBkYXRlPzogRXZlbnRTdWJzY3JpcHRpb25SZXNwb25zZS5SZXN1bHRTdGF0dXNVcGRhdGUuQXNPYmplY3Q7XG4gICAgcmVzdWx0T3duZXJVcGRhdGU/OiBFdmVudFN1YnNjcmlwdGlvblJlc3BvbnNlLlJlc3VsdE93bmVyVXBkYXRlLkFzT2JqZWN0O1xuICAgIG5ld1Rhc2s/OiBFdmVudFN1YnNjcmlwdGlvblJlc3BvbnNlLk5ld1Rhc2suQXNPYmplY3Q7XG4gICAgbmV3UmVzdWx0PzogRXZlbnRTdWJzY3JpcHRpb25SZXNwb25zZS5OZXdSZXN1bHQuQXNPYmplY3Q7XG4gIH1cblxuICAvKipcbiAgICogUHJvdG9idWYgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgRXZlbnRTdWJzY3JpcHRpb25SZXNwb25zZVxuICAgKi9cbiAgZXhwb3J0IGludGVyZmFjZSBBc1Byb3RvYnVmSlNPTiB7XG4gICAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gICAgdGFza1N0YXR1c1VwZGF0ZTogRXZlbnRTdWJzY3JpcHRpb25SZXNwb25zZS5UYXNrU3RhdHVzVXBkYXRlLkFzUHJvdG9idWZKU09OIHwgbnVsbDtcbiAgICByZXN1bHRTdGF0dXNVcGRhdGU6IEV2ZW50U3Vic2NyaXB0aW9uUmVzcG9uc2UuUmVzdWx0U3RhdHVzVXBkYXRlLkFzUHJvdG9idWZKU09OIHwgbnVsbDtcbiAgICByZXN1bHRPd25lclVwZGF0ZTogRXZlbnRTdWJzY3JpcHRpb25SZXNwb25zZS5SZXN1bHRPd25lclVwZGF0ZS5Bc1Byb3RvYnVmSlNPTiB8IG51bGw7XG4gICAgbmV3VGFzazogRXZlbnRTdWJzY3JpcHRpb25SZXNwb25zZS5OZXdUYXNrLkFzUHJvdG9idWZKU09OIHwgbnVsbDtcbiAgICBuZXdSZXN1bHQ6IEV2ZW50U3Vic2NyaXB0aW9uUmVzcG9uc2UuTmV3UmVzdWx0LkFzUHJvdG9idWZKU09OIHwgbnVsbDtcbiAgfVxuICBleHBvcnQgZW51bSBVcGRhdGVDYXNlIHtcbiAgICBub25lID0gMCxcbiAgICB0YXNrU3RhdHVzVXBkYXRlID0gMSxcbiAgICByZXN1bHRTdGF0dXNVcGRhdGUgPSAyLFxuICAgIHJlc3VsdE93bmVyVXBkYXRlID0gMyxcbiAgICBuZXdUYXNrID0gNCxcbiAgICBuZXdSZXN1bHQgPSA1XG4gIH1cbiAgLyoqXG4gICAqIE1lc3NhZ2UgaW1wbGVtZW50YXRpb24gZm9yIGFybW9uaWsuYXBpLmdycGMudjEuZXZlbnRzLkV2ZW50U3Vic2NyaXB0aW9uUmVzcG9uc2UuVGFza1N0YXR1c1VwZGF0ZVxuICAgKi9cbiAgZXhwb3J0IGNsYXNzIFRhc2tTdGF0dXNVcGRhdGUgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gICAgc3RhdGljIGlkID1cbiAgICAgICdhcm1vbmlrLmFwaS5ncnBjLnYxLmV2ZW50cy5FdmVudFN1YnNjcmlwdGlvblJlc3BvbnNlLlRhc2tTdGF0dXNVcGRhdGUnO1xuXG4gICAgLyoqXG4gICAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAgICovXG4gICAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBUYXNrU3RhdHVzVXBkYXRlKCk7XG4gICAgICBUYXNrU3RhdHVzVXBkYXRlLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpXG4gICAgICApO1xuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBUYXNrU3RhdHVzVXBkYXRlKSB7XG4gICAgICBfaW5zdGFuY2UudGFza0lkID0gX2luc3RhbmNlLnRhc2tJZCB8fCAnJztcbiAgICAgIF9pbnN0YW5jZS5zdGF0dXMgPSBfaW5zdGFuY2Uuc3RhdHVzIHx8IDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAgICovXG4gICAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgIF9pbnN0YW5jZTogVGFza1N0YXR1c1VwZGF0ZSxcbiAgICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICAgICkge1xuICAgICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICBfaW5zdGFuY2UudGFza0lkID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgX2luc3RhbmNlLnN0YXR1cyA9IF9yZWFkZXIucmVhZEVudW0oKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBfcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIFRhc2tTdGF0dXNVcGRhdGUucmVmaW5lVmFsdWVzKF9pbnN0YW5jZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VyaWFsaXplcyBhIG1lc3NhZ2UgdG8gYmluYXJ5IGZvcm1hdCB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICAgIF9pbnN0YW5jZTogVGFza1N0YXR1c1VwZGF0ZSxcbiAgICAgIF93cml0ZXI6IEJpbmFyeVdyaXRlclxuICAgICkge1xuICAgICAgaWYgKF9pbnN0YW5jZS50YXNrSWQpIHtcbiAgICAgICAgX3dyaXRlci53cml0ZVN0cmluZygxMCwgX2luc3RhbmNlLnRhc2tJZCk7XG4gICAgICB9XG4gICAgICBpZiAoX2luc3RhbmNlLnN0YXR1cykge1xuICAgICAgICBfd3JpdGVyLndyaXRlRW51bSgxMSwgX2luc3RhbmNlLnN0YXR1cyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdGFza0lkOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfc3RhdHVzOiBhcm1vbmlrQXBpR3JwY1YxVGFza19zdGF0dXMwMDMuVGFza1N0YXR1cztcblxuICAgIC8qKlxuICAgICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIFRhc2tTdGF0dXNVcGRhdGUgdG8gZGVlcGx5IGNsb25lIGZyb21cbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihfdmFsdWU/OiBSZWN1cnNpdmVQYXJ0aWFsPFRhc2tTdGF0dXNVcGRhdGUuQXNPYmplY3Q+KSB7XG4gICAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgICB0aGlzLnRhc2tJZCA9IF92YWx1ZS50YXNrSWQ7XG4gICAgICB0aGlzLnN0YXR1cyA9IF92YWx1ZS5zdGF0dXM7XG4gICAgICBUYXNrU3RhdHVzVXBkYXRlLnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgICB9XG4gICAgZ2V0IHRhc2tJZCgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuX3Rhc2tJZDtcbiAgICB9XG4gICAgc2V0IHRhc2tJZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICB0aGlzLl90YXNrSWQgPSB2YWx1ZTtcbiAgICB9XG4gICAgZ2V0IHN0YXR1cygpOiBhcm1vbmlrQXBpR3JwY1YxVGFza19zdGF0dXMwMDMuVGFza1N0YXR1cyB7XG4gICAgICByZXR1cm4gdGhpcy5fc3RhdHVzO1xuICAgIH1cbiAgICBzZXQgc3RhdHVzKHZhbHVlOiBhcm1vbmlrQXBpR3JwY1YxVGFza19zdGF0dXMwMDMuVGFza1N0YXR1cykge1xuICAgICAgdGhpcy5fc3RhdHVzID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VyaWFsaXplIG1lc3NhZ2UgdG8gYmluYXJ5IGRhdGFcbiAgICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHNlcmlhbGl6ZUJpbmFyeSgpIHtcbiAgICAgIGNvbnN0IHdyaXRlciA9IG5ldyBCaW5hcnlXcml0ZXIoKTtcbiAgICAgIFRhc2tTdGF0dXNVcGRhdGUuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAgICovXG4gICAgdG9PYmplY3QoKTogVGFza1N0YXR1c1VwZGF0ZS5Bc09iamVjdCB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YXNrSWQ6IHRoaXMudGFza0lkLFxuICAgICAgICBzdGF0dXM6IHRoaXMuc3RhdHVzXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgICAqL1xuICAgIHRvSlNPTigpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgICAqL1xuICAgIHRvUHJvdG9idWZKU09OKFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICAgICk6IFRhc2tTdGF0dXNVcGRhdGUuQXNQcm90b2J1ZkpTT04ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGFza0lkOiB0aGlzLnRhc2tJZCxcbiAgICAgICAgc3RhdHVzOlxuICAgICAgICAgIGFybW9uaWtBcGlHcnBjVjFUYXNrX3N0YXR1czAwMy5UYXNrU3RhdHVzW1xuICAgICAgICAgICAgdGhpcy5zdGF0dXMgPT09IG51bGwgfHwgdGhpcy5zdGF0dXMgPT09IHVuZGVmaW5lZCA/IDAgOiB0aGlzLnN0YXR1c1xuICAgICAgICAgIF1cbiAgICAgIH07XG4gICAgfVxuICB9XG4gIGV4cG9ydCBtb2R1bGUgVGFza1N0YXR1c1VwZGF0ZSB7XG4gICAgLyoqXG4gICAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIFRhc2tTdGF0dXNVcGRhdGVcbiAgICAgKi9cbiAgICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHtcbiAgICAgIHRhc2tJZDogc3RyaW5nO1xuICAgICAgc3RhdHVzOiBhcm1vbmlrQXBpR3JwY1YxVGFza19zdGF0dXMwMDMuVGFza1N0YXR1cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBUYXNrU3RhdHVzVXBkYXRlXG4gICAgICovXG4gICAgZXhwb3J0IGludGVyZmFjZSBBc1Byb3RvYnVmSlNPTiB7XG4gICAgICB0YXNrSWQ6IHN0cmluZztcbiAgICAgIHN0YXR1czogc3RyaW5nO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBhcm1vbmlrLmFwaS5ncnBjLnYxLmV2ZW50cy5FdmVudFN1YnNjcmlwdGlvblJlc3BvbnNlLlJlc3VsdFN0YXR1c1VwZGF0ZVxuICAgKi9cbiAgZXhwb3J0IGNsYXNzIFJlc3VsdFN0YXR1c1VwZGF0ZSBpbXBsZW1lbnRzIEdycGNNZXNzYWdlIHtcbiAgICBzdGF0aWMgaWQgPVxuICAgICAgJ2FybW9uaWsuYXBpLmdycGMudjEuZXZlbnRzLkV2ZW50U3Vic2NyaXB0aW9uUmVzcG9uc2UuUmVzdWx0U3RhdHVzVXBkYXRlJztcblxuICAgIC8qKlxuICAgICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgUmVzdWx0U3RhdHVzVXBkYXRlKCk7XG4gICAgICBSZXN1bHRTdGF0dXNVcGRhdGUuZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgbmV3IEJpbmFyeVJlYWRlcihieXRlcylcbiAgICAgICk7XG4gICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgYWxsIHRoZSBwcm9wZXJ0aWVzIGFuZCBzZXQgZGVmYXVsdCBwcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAgICovXG4gICAgc3RhdGljIHJlZmluZVZhbHVlcyhfaW5zdGFuY2U6IFJlc3VsdFN0YXR1c1VwZGF0ZSkge1xuICAgICAgX2luc3RhbmNlLnJlc3VsdElkID0gX2luc3RhbmNlLnJlc3VsdElkIHx8ICcnO1xuICAgICAgX2luc3RhbmNlLnN0YXR1cyA9IF9pbnN0YW5jZS5zdGF0dXMgfHwgMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXNlcmlhbGl6ZXMgLyByZWFkcyBiaW5hcnkgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgaW5zdGFuY2UgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSBfcmVhZGVyIGJpbmFyeSByZWFkZXIgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnlGcm9tUmVhZGVyKFxuICAgICAgX2luc3RhbmNlOiBSZXN1bHRTdGF0dXNVcGRhdGUsXG4gICAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgICApIHtcbiAgICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgICBjYXNlIDIwOlxuICAgICAgICAgICAgX2luc3RhbmNlLnJlc3VsdElkID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDIxOlxuICAgICAgICAgICAgX2luc3RhbmNlLnN0YXR1cyA9IF9yZWFkZXIucmVhZEVudW0oKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBfcmVhZGVyLnNraXBGaWVsZCgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIFJlc3VsdFN0YXR1c1VwZGF0ZS5yZWZpbmVWYWx1ZXMoX2luc3RhbmNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXJpYWxpemVzIGEgbWVzc2FnZSB0byBiaW5hcnkgZm9ybWF0IHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0gX3dyaXRlciBiaW5hcnkgd3JpdGVyIGluc3RhbmNlXG4gICAgICovXG4gICAgc3RhdGljIHNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKFxuICAgICAgX2luc3RhbmNlOiBSZXN1bHRTdGF0dXNVcGRhdGUsXG4gICAgICBfd3JpdGVyOiBCaW5hcnlXcml0ZXJcbiAgICApIHtcbiAgICAgIGlmIChfaW5zdGFuY2UucmVzdWx0SWQpIHtcbiAgICAgICAgX3dyaXRlci53cml0ZVN0cmluZygyMCwgX2luc3RhbmNlLnJlc3VsdElkKTtcbiAgICAgIH1cbiAgICAgIGlmIChfaW5zdGFuY2Uuc3RhdHVzKSB7XG4gICAgICAgIF93cml0ZXIud3JpdGVFbnVtKDIxLCBfaW5zdGFuY2Uuc3RhdHVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZXN1bHRJZDogc3RyaW5nO1xuICAgIHByaXZhdGUgX3N0YXR1czogYXJtb25pa0FwaUdycGNWMVJlc3VsdF9zdGF0dXMwMDEuUmVzdWx0U3RhdHVzO1xuXG4gICAgLyoqXG4gICAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgUmVzdWx0U3RhdHVzVXBkYXRlIHRvIGRlZXBseSBjbG9uZSBmcm9tXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxSZXN1bHRTdGF0dXNVcGRhdGUuQXNPYmplY3Q+KSB7XG4gICAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgICB0aGlzLnJlc3VsdElkID0gX3ZhbHVlLnJlc3VsdElkO1xuICAgICAgdGhpcy5zdGF0dXMgPSBfdmFsdWUuc3RhdHVzO1xuICAgICAgUmVzdWx0U3RhdHVzVXBkYXRlLnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgICB9XG4gICAgZ2V0IHJlc3VsdElkKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVzdWx0SWQ7XG4gICAgfVxuICAgIHNldCByZXN1bHRJZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICB0aGlzLl9yZXN1bHRJZCA9IHZhbHVlO1xuICAgIH1cbiAgICBnZXQgc3RhdHVzKCk6IGFybW9uaWtBcGlHcnBjVjFSZXN1bHRfc3RhdHVzMDAxLlJlc3VsdFN0YXR1cyB7XG4gICAgICByZXR1cm4gdGhpcy5fc3RhdHVzO1xuICAgIH1cbiAgICBzZXQgc3RhdHVzKHZhbHVlOiBhcm1vbmlrQXBpR3JwY1YxUmVzdWx0X3N0YXR1czAwMS5SZXN1bHRTdGF0dXMpIHtcbiAgICAgIHRoaXMuX3N0YXR1cyA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgICBSZXN1bHRTdGF0dXNVcGRhdGUuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAgICovXG4gICAgdG9PYmplY3QoKTogUmVzdWx0U3RhdHVzVXBkYXRlLkFzT2JqZWN0IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlc3VsdElkOiB0aGlzLnJlc3VsdElkLFxuICAgICAgICBzdGF0dXM6IHRoaXMuc3RhdHVzXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgICAqL1xuICAgIHRvSlNPTigpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgICAqL1xuICAgIHRvUHJvdG9idWZKU09OKFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICAgICk6IFJlc3VsdFN0YXR1c1VwZGF0ZS5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZXN1bHRJZDogdGhpcy5yZXN1bHRJZCxcbiAgICAgICAgc3RhdHVzOlxuICAgICAgICAgIGFybW9uaWtBcGlHcnBjVjFSZXN1bHRfc3RhdHVzMDAxLlJlc3VsdFN0YXR1c1tcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzID09PSBudWxsIHx8IHRoaXMuc3RhdHVzID09PSB1bmRlZmluZWQgPyAwIDogdGhpcy5zdGF0dXNcbiAgICAgICAgICBdXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBleHBvcnQgbW9kdWxlIFJlc3VsdFN0YXR1c1VwZGF0ZSB7XG4gICAgLyoqXG4gICAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIFJlc3VsdFN0YXR1c1VwZGF0ZVxuICAgICAqL1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgQXNPYmplY3Qge1xuICAgICAgcmVzdWx0SWQ6IHN0cmluZztcbiAgICAgIHN0YXR1czogYXJtb25pa0FwaUdycGNWMVJlc3VsdF9zdGF0dXMwMDEuUmVzdWx0U3RhdHVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIFJlc3VsdFN0YXR1c1VwZGF0ZVxuICAgICAqL1xuICAgIGV4cG9ydCBpbnRlcmZhY2UgQXNQcm90b2J1ZkpTT04ge1xuICAgICAgcmVzdWx0SWQ6IHN0cmluZztcbiAgICAgIHN0YXR1czogc3RyaW5nO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBhcm1vbmlrLmFwaS5ncnBjLnYxLmV2ZW50cy5FdmVudFN1YnNjcmlwdGlvblJlc3BvbnNlLlJlc3VsdE93bmVyVXBkYXRlXG4gICAqL1xuICBleHBvcnQgY2xhc3MgUmVzdWx0T3duZXJVcGRhdGUgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gICAgc3RhdGljIGlkID1cbiAgICAgICdhcm1vbmlrLmFwaS5ncnBjLnYxLmV2ZW50cy5FdmVudFN1YnNjcmlwdGlvblJlc3BvbnNlLlJlc3VsdE93bmVyVXBkYXRlJztcblxuICAgIC8qKlxuICAgICAqIERlc2VyaWFsaXplIGJpbmFyeSBkYXRhIHRvIG1lc3NhZ2VcbiAgICAgKiBAcGFyYW0gaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeShieXRlczogQnl0ZVNvdXJjZSkge1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgUmVzdWx0T3duZXJVcGRhdGUoKTtcbiAgICAgIFJlc3VsdE93bmVyVXBkYXRlLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgIG5ldyBCaW5hcnlSZWFkZXIoYnl0ZXMpXG4gICAgICApO1xuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBSZXN1bHRPd25lclVwZGF0ZSkge1xuICAgICAgX2luc3RhbmNlLnJlc3VsdElkID0gX2luc3RhbmNlLnJlc3VsdElkIHx8ICcnO1xuICAgICAgX2luc3RhbmNlLnByZXZpb3VzT3duZXJJZCA9IF9pbnN0YW5jZS5wcmV2aW91c093bmVySWQgfHwgJyc7XG4gICAgICBfaW5zdGFuY2UuY3VycmVudE93bmVySWQgPSBfaW5zdGFuY2UuY3VycmVudE93bmVySWQgfHwgJyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAgICovXG4gICAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgIF9pbnN0YW5jZTogUmVzdWx0T3duZXJVcGRhdGUsXG4gICAgICBfcmVhZGVyOiBCaW5hcnlSZWFkZXJcbiAgICApIHtcbiAgICAgIHdoaWxlIChfcmVhZGVyLm5leHRGaWVsZCgpKSB7XG4gICAgICAgIGlmIChfcmVhZGVyLmlzRW5kR3JvdXAoKSkgYnJlYWs7XG5cbiAgICAgICAgc3dpdGNoIChfcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHtcbiAgICAgICAgICBjYXNlIDMwOlxuICAgICAgICAgICAgX2luc3RhbmNlLnJlc3VsdElkID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDMxOlxuICAgICAgICAgICAgX2luc3RhbmNlLnByZXZpb3VzT3duZXJJZCA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAzMjpcbiAgICAgICAgICAgIF9pbnN0YW5jZS5jdXJyZW50T3duZXJJZCA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIF9yZWFkZXIuc2tpcEZpZWxkKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgUmVzdWx0T3duZXJVcGRhdGUucmVmaW5lVmFsdWVzKF9pbnN0YW5jZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VyaWFsaXplcyBhIG1lc3NhZ2UgdG8gYmluYXJ5IGZvcm1hdCB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICAgIF9pbnN0YW5jZTogUmVzdWx0T3duZXJVcGRhdGUsXG4gICAgICBfd3JpdGVyOiBCaW5hcnlXcml0ZXJcbiAgICApIHtcbiAgICAgIGlmIChfaW5zdGFuY2UucmVzdWx0SWQpIHtcbiAgICAgICAgX3dyaXRlci53cml0ZVN0cmluZygzMCwgX2luc3RhbmNlLnJlc3VsdElkKTtcbiAgICAgIH1cbiAgICAgIGlmIChfaW5zdGFuY2UucHJldmlvdXNPd25lcklkKSB7XG4gICAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoMzEsIF9pbnN0YW5jZS5wcmV2aW91c093bmVySWQpO1xuICAgICAgfVxuICAgICAgaWYgKF9pbnN0YW5jZS5jdXJyZW50T3duZXJJZCkge1xuICAgICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDMyLCBfaW5zdGFuY2UuY3VycmVudE93bmVySWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3Jlc3VsdElkOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfcHJldmlvdXNPd25lcklkOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfY3VycmVudE93bmVySWQ6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIE1lc3NhZ2UgY29uc3RydWN0b3IuIEluaXRpYWxpemVzIHRoZSBwcm9wZXJ0aWVzIGFuZCBhcHBsaWVzIGRlZmF1bHQgUHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgICAqIEBwYXJhbSBfdmFsdWUgaW5pdGlhbCB2YWx1ZXMgb2JqZWN0IG9yIGluc3RhbmNlIG9mIFJlc3VsdE93bmVyVXBkYXRlIHRvIGRlZXBseSBjbG9uZSBmcm9tXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxSZXN1bHRPd25lclVwZGF0ZS5Bc09iamVjdD4pIHtcbiAgICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICAgIHRoaXMucmVzdWx0SWQgPSBfdmFsdWUucmVzdWx0SWQ7XG4gICAgICB0aGlzLnByZXZpb3VzT3duZXJJZCA9IF92YWx1ZS5wcmV2aW91c093bmVySWQ7XG4gICAgICB0aGlzLmN1cnJlbnRPd25lcklkID0gX3ZhbHVlLmN1cnJlbnRPd25lcklkO1xuICAgICAgUmVzdWx0T3duZXJVcGRhdGUucmVmaW5lVmFsdWVzKHRoaXMpO1xuICAgIH1cbiAgICBnZXQgcmVzdWx0SWQoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZXN1bHRJZDtcbiAgICB9XG4gICAgc2V0IHJlc3VsdElkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgIHRoaXMuX3Jlc3VsdElkID0gdmFsdWU7XG4gICAgfVxuICAgIGdldCBwcmV2aW91c093bmVySWQoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLl9wcmV2aW91c093bmVySWQ7XG4gICAgfVxuICAgIHNldCBwcmV2aW91c093bmVySWQodmFsdWU6IHN0cmluZykge1xuICAgICAgdGhpcy5fcHJldmlvdXNPd25lcklkID0gdmFsdWU7XG4gICAgfVxuICAgIGdldCBjdXJyZW50T3duZXJJZCgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRPd25lcklkO1xuICAgIH1cbiAgICBzZXQgY3VycmVudE93bmVySWQodmFsdWU6IHN0cmluZykge1xuICAgICAgdGhpcy5fY3VycmVudE93bmVySWQgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXJpYWxpemUgbWVzc2FnZSB0byBiaW5hcnkgZGF0YVxuICAgICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAgICovXG4gICAgc2VyaWFsaXplQmluYXJ5KCkge1xuICAgICAgY29uc3Qgd3JpdGVyID0gbmV3IEJpbmFyeVdyaXRlcigpO1xuICAgICAgUmVzdWx0T3duZXJVcGRhdGUuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAgICovXG4gICAgdG9PYmplY3QoKTogUmVzdWx0T3duZXJVcGRhdGUuQXNPYmplY3Qge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVzdWx0SWQ6IHRoaXMucmVzdWx0SWQsXG4gICAgICAgIHByZXZpb3VzT3duZXJJZDogdGhpcy5wcmV2aW91c093bmVySWQsXG4gICAgICAgIGN1cnJlbnRPd25lcklkOiB0aGlzLmN1cnJlbnRPd25lcklkXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBzdXBwb3J0IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UpLCByZXBsaWNhdGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdG9PYmplY3QoKVxuICAgICAqL1xuICAgIHRvSlNPTigpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdCBtZXNzYWdlIHRvIEpTT04gdXNpbmcgcHJvdG9idWYgSlNPTiBub3RhdGlvbjogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uXG4gICAgICogQXR0ZW50aW9uOiBvdXRwdXQgZGlmZmVycyBmcm9tIHRvT2JqZWN0KCkgZS5nLiBlbnVtcyBhcmUgcmVwcmVzZW50ZWQgYXMgbmFtZXMgYW5kIG5vdCBhcyBudW1iZXJzLCBUaW1lc3RhbXAgaXMgYW4gSVNPIERhdGUgc3RyaW5nIGZvcm1hdCBldGMuXG4gICAgICogSWYgdGhlIG1lc3NhZ2UgaXRzZWxmIG9yIHNvbWUgb2YgZGVzY2VuZGFudCBtZXNzYWdlcyBpcyBnb29nbGUucHJvdG9idWYuQW55LCB5b3UgTVVTVCBwcm92aWRlIGEgbWVzc2FnZSBwb29sIGFzIG9wdGlvbnMuIElmIG5vdCwgdGhlIG1lc3NhZ2VQb29sIGlzIG5vdCByZXF1aXJlZFxuICAgICAqL1xuICAgIHRvUHJvdG9idWZKU09OKFxuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgb3B0aW9ucz86IFRvUHJvdG9idWZKU09OT3B0aW9uc1xuICAgICk6IFJlc3VsdE93bmVyVXBkYXRlLkFzUHJvdG9idWZKU09OIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlc3VsdElkOiB0aGlzLnJlc3VsdElkLFxuICAgICAgICBwcmV2aW91c093bmVySWQ6IHRoaXMucHJldmlvdXNPd25lcklkLFxuICAgICAgICBjdXJyZW50T3duZXJJZDogdGhpcy5jdXJyZW50T3duZXJJZFxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgZXhwb3J0IG1vZHVsZSBSZXN1bHRPd25lclVwZGF0ZSB7XG4gICAgLyoqXG4gICAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIFJlc3VsdE93bmVyVXBkYXRlXG4gICAgICovXG4gICAgZXhwb3J0IGludGVyZmFjZSBBc09iamVjdCB7XG4gICAgICByZXN1bHRJZDogc3RyaW5nO1xuICAgICAgcHJldmlvdXNPd25lcklkOiBzdHJpbmc7XG4gICAgICBjdXJyZW50T3duZXJJZDogc3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIFJlc3VsdE93bmVyVXBkYXRlXG4gICAgICovXG4gICAgZXhwb3J0IGludGVyZmFjZSBBc1Byb3RvYnVmSlNPTiB7XG4gICAgICByZXN1bHRJZDogc3RyaW5nO1xuICAgICAgcHJldmlvdXNPd25lcklkOiBzdHJpbmc7XG4gICAgICBjdXJyZW50T3duZXJJZDogc3RyaW5nO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNZXNzYWdlIGltcGxlbWVudGF0aW9uIGZvciBhcm1vbmlrLmFwaS5ncnBjLnYxLmV2ZW50cy5FdmVudFN1YnNjcmlwdGlvblJlc3BvbnNlLk5ld1Rhc2tcbiAgICovXG4gIGV4cG9ydCBjbGFzcyBOZXdUYXNrIGltcGxlbWVudHMgR3JwY01lc3NhZ2Uge1xuICAgIHN0YXRpYyBpZCA9ICdhcm1vbmlrLmFwaS5ncnBjLnYxLmV2ZW50cy5FdmVudFN1YnNjcmlwdGlvblJlc3BvbnNlLk5ld1Rhc2snO1xuXG4gICAgLyoqXG4gICAgICogRGVzZXJpYWxpemUgYmluYXJ5IGRhdGEgdG8gbWVzc2FnZVxuICAgICAqIEBwYXJhbSBpbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAgICovXG4gICAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5KGJ5dGVzOiBCeXRlU291cmNlKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBOZXdUYXNrKCk7XG4gICAgICBOZXdUYXNrLmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihpbnN0YW5jZSwgbmV3IEJpbmFyeVJlYWRlcihieXRlcykpO1xuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBOZXdUYXNrKSB7XG4gICAgICBfaW5zdGFuY2UudGFza0lkID0gX2luc3RhbmNlLnRhc2tJZCB8fCAnJztcbiAgICAgIF9pbnN0YW5jZS5wYXlsb2FkSWQgPSBfaW5zdGFuY2UucGF5bG9hZElkIHx8ICcnO1xuICAgICAgX2luc3RhbmNlLm9yaWdpblRhc2tJZCA9IF9pbnN0YW5jZS5vcmlnaW5UYXNrSWQgfHwgJyc7XG4gICAgICBfaW5zdGFuY2Uuc3RhdHVzID0gX2luc3RhbmNlLnN0YXR1cyB8fCAwO1xuICAgICAgX2luc3RhbmNlLmV4cGVjdGVkT3V0cHV0S2V5cyA9IF9pbnN0YW5jZS5leHBlY3RlZE91dHB1dEtleXMgfHwgW107XG4gICAgICBfaW5zdGFuY2UuZGF0YURlcGVuZGVuY2llcyA9IF9pbnN0YW5jZS5kYXRhRGVwZW5kZW5jaWVzIHx8IFtdO1xuICAgICAgX2luc3RhbmNlLnJldHJ5T2ZJZHMgPSBfaW5zdGFuY2UucmV0cnlPZklkcyB8fCBbXTtcbiAgICAgIF9pbnN0YW5jZS5wYXJlbnRUYXNrSWRzID0gX2luc3RhbmNlLnBhcmVudFRhc2tJZHMgfHwgW107XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzZXJpYWxpemVzIC8gcmVhZHMgYmluYXJ5IG1lc3NhZ2UgaW50byBtZXNzYWdlIGluc3RhbmNlIHVzaW5nIHByb3ZpZGVkIGJpbmFyeSByZWFkZXJcbiAgICAgKiBAcGFyYW0gX2luc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0gX3JlYWRlciBiaW5hcnkgcmVhZGVyIGluc3RhbmNlXG4gICAgICovXG4gICAgc3RhdGljIGRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihcbiAgICAgIF9pbnN0YW5jZTogTmV3VGFzayxcbiAgICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICAgICkge1xuICAgICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICAgIGNhc2UgNDA6XG4gICAgICAgICAgICBfaW5zdGFuY2UudGFza0lkID0gX3JlYWRlci5yZWFkU3RyaW5nKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDQxOlxuICAgICAgICAgICAgX2luc3RhbmNlLnBheWxvYWRJZCA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSA0MjpcbiAgICAgICAgICAgIF9pbnN0YW5jZS5vcmlnaW5UYXNrSWQgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgNDM6XG4gICAgICAgICAgICBfaW5zdGFuY2Uuc3RhdHVzID0gX3JlYWRlci5yZWFkRW51bSgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSA0NDpcbiAgICAgICAgICAgIChfaW5zdGFuY2UuZXhwZWN0ZWRPdXRwdXRLZXlzID1cbiAgICAgICAgICAgICAgX2luc3RhbmNlLmV4cGVjdGVkT3V0cHV0S2V5cyB8fCBbXSkucHVzaChfcmVhZGVyLnJlYWRTdHJpbmcoKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDQ1OlxuICAgICAgICAgICAgKF9pbnN0YW5jZS5kYXRhRGVwZW5kZW5jaWVzID1cbiAgICAgICAgICAgICAgX2luc3RhbmNlLmRhdGFEZXBlbmRlbmNpZXMgfHwgW10pLnB1c2goX3JlYWRlci5yZWFkU3RyaW5nKCkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSA0NjpcbiAgICAgICAgICAgIChfaW5zdGFuY2UucmV0cnlPZklkcyA9IF9pbnN0YW5jZS5yZXRyeU9mSWRzIHx8IFtdKS5wdXNoKFxuICAgICAgICAgICAgICBfcmVhZGVyLnJlYWRTdHJpbmcoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgNDc6XG4gICAgICAgICAgICAoX2luc3RhbmNlLnBhcmVudFRhc2tJZHMgPSBfaW5zdGFuY2UucGFyZW50VGFza0lkcyB8fCBbXSkucHVzaChcbiAgICAgICAgICAgICAgX3JlYWRlci5yZWFkU3RyaW5nKClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBOZXdUYXNrLnJlZmluZVZhbHVlcyhfaW5zdGFuY2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlcmlhbGl6ZXMgYSBtZXNzYWdlIHRvIGJpbmFyeSBmb3JtYXQgdXNpbmcgcHJvdmlkZWQgYmluYXJ5IHJlYWRlclxuICAgICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSBfd3JpdGVyIGJpbmFyeSB3cml0ZXIgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzdGF0aWMgc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIoX2luc3RhbmNlOiBOZXdUYXNrLCBfd3JpdGVyOiBCaW5hcnlXcml0ZXIpIHtcbiAgICAgIGlmIChfaW5zdGFuY2UudGFza0lkKSB7XG4gICAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoNDAsIF9pbnN0YW5jZS50YXNrSWQpO1xuICAgICAgfVxuICAgICAgaWYgKF9pbnN0YW5jZS5wYXlsb2FkSWQpIHtcbiAgICAgICAgX3dyaXRlci53cml0ZVN0cmluZyg0MSwgX2luc3RhbmNlLnBheWxvYWRJZCk7XG4gICAgICB9XG4gICAgICBpZiAoX2luc3RhbmNlLm9yaWdpblRhc2tJZCkge1xuICAgICAgICBfd3JpdGVyLndyaXRlU3RyaW5nKDQyLCBfaW5zdGFuY2Uub3JpZ2luVGFza0lkKTtcbiAgICAgIH1cbiAgICAgIGlmIChfaW5zdGFuY2Uuc3RhdHVzKSB7XG4gICAgICAgIF93cml0ZXIud3JpdGVFbnVtKDQzLCBfaW5zdGFuY2Uuc3RhdHVzKTtcbiAgICAgIH1cbiAgICAgIGlmIChfaW5zdGFuY2UuZXhwZWN0ZWRPdXRwdXRLZXlzICYmIF9pbnN0YW5jZS5leHBlY3RlZE91dHB1dEtleXMubGVuZ3RoKSB7XG4gICAgICAgIF93cml0ZXIud3JpdGVSZXBlYXRlZFN0cmluZyg0NCwgX2luc3RhbmNlLmV4cGVjdGVkT3V0cHV0S2V5cyk7XG4gICAgICB9XG4gICAgICBpZiAoX2luc3RhbmNlLmRhdGFEZXBlbmRlbmNpZXMgJiYgX2luc3RhbmNlLmRhdGFEZXBlbmRlbmNpZXMubGVuZ3RoKSB7XG4gICAgICAgIF93cml0ZXIud3JpdGVSZXBlYXRlZFN0cmluZyg0NSwgX2luc3RhbmNlLmRhdGFEZXBlbmRlbmNpZXMpO1xuICAgICAgfVxuICAgICAgaWYgKF9pbnN0YW5jZS5yZXRyeU9mSWRzICYmIF9pbnN0YW5jZS5yZXRyeU9mSWRzLmxlbmd0aCkge1xuICAgICAgICBfd3JpdGVyLndyaXRlUmVwZWF0ZWRTdHJpbmcoNDYsIF9pbnN0YW5jZS5yZXRyeU9mSWRzKTtcbiAgICAgIH1cbiAgICAgIGlmIChfaW5zdGFuY2UucGFyZW50VGFza0lkcyAmJiBfaW5zdGFuY2UucGFyZW50VGFza0lkcy5sZW5ndGgpIHtcbiAgICAgICAgX3dyaXRlci53cml0ZVJlcGVhdGVkU3RyaW5nKDQ3LCBfaW5zdGFuY2UucGFyZW50VGFza0lkcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfdGFza0lkOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfcGF5bG9hZElkOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfb3JpZ2luVGFza0lkOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfc3RhdHVzOiBhcm1vbmlrQXBpR3JwY1YxVGFza19zdGF0dXMwMDMuVGFza1N0YXR1cztcbiAgICBwcml2YXRlIF9leHBlY3RlZE91dHB1dEtleXM6IHN0cmluZ1tdO1xuICAgIHByaXZhdGUgX2RhdGFEZXBlbmRlbmNpZXM6IHN0cmluZ1tdO1xuICAgIHByaXZhdGUgX3JldHJ5T2ZJZHM6IHN0cmluZ1tdO1xuICAgIHByaXZhdGUgX3BhcmVudFRhc2tJZHM6IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgTmV3VGFzayB0byBkZWVwbHkgY2xvbmUgZnJvbVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKF92YWx1ZT86IFJlY3Vyc2l2ZVBhcnRpYWw8TmV3VGFzay5Bc09iamVjdD4pIHtcbiAgICAgIF92YWx1ZSA9IF92YWx1ZSB8fCB7fTtcbiAgICAgIHRoaXMudGFza0lkID0gX3ZhbHVlLnRhc2tJZDtcbiAgICAgIHRoaXMucGF5bG9hZElkID0gX3ZhbHVlLnBheWxvYWRJZDtcbiAgICAgIHRoaXMub3JpZ2luVGFza0lkID0gX3ZhbHVlLm9yaWdpblRhc2tJZDtcbiAgICAgIHRoaXMuc3RhdHVzID0gX3ZhbHVlLnN0YXR1cztcbiAgICAgIHRoaXMuZXhwZWN0ZWRPdXRwdXRLZXlzID0gKF92YWx1ZS5leHBlY3RlZE91dHB1dEtleXMgfHwgW10pLnNsaWNlKCk7XG4gICAgICB0aGlzLmRhdGFEZXBlbmRlbmNpZXMgPSAoX3ZhbHVlLmRhdGFEZXBlbmRlbmNpZXMgfHwgW10pLnNsaWNlKCk7XG4gICAgICB0aGlzLnJldHJ5T2ZJZHMgPSAoX3ZhbHVlLnJldHJ5T2ZJZHMgfHwgW10pLnNsaWNlKCk7XG4gICAgICB0aGlzLnBhcmVudFRhc2tJZHMgPSAoX3ZhbHVlLnBhcmVudFRhc2tJZHMgfHwgW10pLnNsaWNlKCk7XG4gICAgICBOZXdUYXNrLnJlZmluZVZhbHVlcyh0aGlzKTtcbiAgICB9XG4gICAgZ2V0IHRhc2tJZCgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuX3Rhc2tJZDtcbiAgICB9XG4gICAgc2V0IHRhc2tJZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICB0aGlzLl90YXNrSWQgPSB2YWx1ZTtcbiAgICB9XG4gICAgZ2V0IHBheWxvYWRJZCgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuX3BheWxvYWRJZDtcbiAgICB9XG4gICAgc2V0IHBheWxvYWRJZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICB0aGlzLl9wYXlsb2FkSWQgPSB2YWx1ZTtcbiAgICB9XG4gICAgZ2V0IG9yaWdpblRhc2tJZCgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMuX29yaWdpblRhc2tJZDtcbiAgICB9XG4gICAgc2V0IG9yaWdpblRhc2tJZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICB0aGlzLl9vcmlnaW5UYXNrSWQgPSB2YWx1ZTtcbiAgICB9XG4gICAgZ2V0IHN0YXR1cygpOiBhcm1vbmlrQXBpR3JwY1YxVGFza19zdGF0dXMwMDMuVGFza1N0YXR1cyB7XG4gICAgICByZXR1cm4gdGhpcy5fc3RhdHVzO1xuICAgIH1cbiAgICBzZXQgc3RhdHVzKHZhbHVlOiBhcm1vbmlrQXBpR3JwY1YxVGFza19zdGF0dXMwMDMuVGFza1N0YXR1cykge1xuICAgICAgdGhpcy5fc3RhdHVzID0gdmFsdWU7XG4gICAgfVxuICAgIGdldCBleHBlY3RlZE91dHB1dEtleXMoKTogc3RyaW5nW10ge1xuICAgICAgcmV0dXJuIHRoaXMuX2V4cGVjdGVkT3V0cHV0S2V5cztcbiAgICB9XG4gICAgc2V0IGV4cGVjdGVkT3V0cHV0S2V5cyh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICAgIHRoaXMuX2V4cGVjdGVkT3V0cHV0S2V5cyA9IHZhbHVlO1xuICAgIH1cbiAgICBnZXQgZGF0YURlcGVuZGVuY2llcygpOiBzdHJpbmdbXSB7XG4gICAgICByZXR1cm4gdGhpcy5fZGF0YURlcGVuZGVuY2llcztcbiAgICB9XG4gICAgc2V0IGRhdGFEZXBlbmRlbmNpZXModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgICB0aGlzLl9kYXRhRGVwZW5kZW5jaWVzID0gdmFsdWU7XG4gICAgfVxuICAgIGdldCByZXRyeU9mSWRzKCk6IHN0cmluZ1tdIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZXRyeU9mSWRzO1xuICAgIH1cbiAgICBzZXQgcmV0cnlPZklkcyh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICAgIHRoaXMuX3JldHJ5T2ZJZHMgPSB2YWx1ZTtcbiAgICB9XG4gICAgZ2V0IHBhcmVudFRhc2tJZHMoKTogc3RyaW5nW10ge1xuICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudFRhc2tJZHM7XG4gICAgfVxuICAgIHNldCBwYXJlbnRUYXNrSWRzKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgICAgdGhpcy5fcGFyZW50VGFza0lkcyA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgICBOZXdUYXNrLnNlcmlhbGl6ZUJpbmFyeVRvV3JpdGVyKHRoaXMsIHdyaXRlcik7XG4gICAgICByZXR1cm4gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhc3QgbWVzc2FnZSB0byBzdGFuZGFyZCBKYXZhU2NyaXB0IG9iamVjdCAoYWxsIG5vbi1wcmltaXRpdmUgdmFsdWVzIGFyZSBkZWVwbHkgY2xvbmVkKVxuICAgICAqL1xuICAgIHRvT2JqZWN0KCk6IE5ld1Rhc2suQXNPYmplY3Qge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGFza0lkOiB0aGlzLnRhc2tJZCxcbiAgICAgICAgcGF5bG9hZElkOiB0aGlzLnBheWxvYWRJZCxcbiAgICAgICAgb3JpZ2luVGFza0lkOiB0aGlzLm9yaWdpblRhc2tJZCxcbiAgICAgICAgc3RhdHVzOiB0aGlzLnN0YXR1cyxcbiAgICAgICAgZXhwZWN0ZWRPdXRwdXRLZXlzOiAodGhpcy5leHBlY3RlZE91dHB1dEtleXMgfHwgW10pLnNsaWNlKCksXG4gICAgICAgIGRhdGFEZXBlbmRlbmNpZXM6ICh0aGlzLmRhdGFEZXBlbmRlbmNpZXMgfHwgW10pLnNsaWNlKCksXG4gICAgICAgIHJldHJ5T2ZJZHM6ICh0aGlzLnJldHJ5T2ZJZHMgfHwgW10pLnNsaWNlKCksXG4gICAgICAgIHBhcmVudFRhc2tJZHM6ICh0aGlzLnBhcmVudFRhc2tJZHMgfHwgW10pLnNsaWNlKClcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAgICovXG4gICAgdG9KU09OKCkge1xuICAgICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAgICovXG4gICAgdG9Qcm90b2J1ZkpTT04oXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICAgKTogTmV3VGFzay5Bc1Byb3RvYnVmSlNPTiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YXNrSWQ6IHRoaXMudGFza0lkLFxuICAgICAgICBwYXlsb2FkSWQ6IHRoaXMucGF5bG9hZElkLFxuICAgICAgICBvcmlnaW5UYXNrSWQ6IHRoaXMub3JpZ2luVGFza0lkLFxuICAgICAgICBzdGF0dXM6XG4gICAgICAgICAgYXJtb25pa0FwaUdycGNWMVRhc2tfc3RhdHVzMDAzLlRhc2tTdGF0dXNbXG4gICAgICAgICAgICB0aGlzLnN0YXR1cyA9PT0gbnVsbCB8fCB0aGlzLnN0YXR1cyA9PT0gdW5kZWZpbmVkID8gMCA6IHRoaXMuc3RhdHVzXG4gICAgICAgICAgXSxcbiAgICAgICAgZXhwZWN0ZWRPdXRwdXRLZXlzOiAodGhpcy5leHBlY3RlZE91dHB1dEtleXMgfHwgW10pLnNsaWNlKCksXG4gICAgICAgIGRhdGFEZXBlbmRlbmNpZXM6ICh0aGlzLmRhdGFEZXBlbmRlbmNpZXMgfHwgW10pLnNsaWNlKCksXG4gICAgICAgIHJldHJ5T2ZJZHM6ICh0aGlzLnJldHJ5T2ZJZHMgfHwgW10pLnNsaWNlKCksXG4gICAgICAgIHBhcmVudFRhc2tJZHM6ICh0aGlzLnBhcmVudFRhc2tJZHMgfHwgW10pLnNsaWNlKClcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIGV4cG9ydCBtb2R1bGUgTmV3VGFzayB7XG4gICAgLyoqXG4gICAgICogU3RhbmRhcmQgSmF2YVNjcmlwdCBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIE5ld1Rhc2tcbiAgICAgKi9cbiAgICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHtcbiAgICAgIHRhc2tJZDogc3RyaW5nO1xuICAgICAgcGF5bG9hZElkOiBzdHJpbmc7XG4gICAgICBvcmlnaW5UYXNrSWQ6IHN0cmluZztcbiAgICAgIHN0YXR1czogYXJtb25pa0FwaUdycGNWMVRhc2tfc3RhdHVzMDAzLlRhc2tTdGF0dXM7XG4gICAgICBleHBlY3RlZE91dHB1dEtleXM6IHN0cmluZ1tdO1xuICAgICAgZGF0YURlcGVuZGVuY2llczogc3RyaW5nW107XG4gICAgICByZXRyeU9mSWRzOiBzdHJpbmdbXTtcbiAgICAgIHBhcmVudFRhc2tJZHM6IHN0cmluZ1tdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIE5ld1Rhc2tcbiAgICAgKi9cbiAgICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICAgIHRhc2tJZDogc3RyaW5nO1xuICAgICAgcGF5bG9hZElkOiBzdHJpbmc7XG4gICAgICBvcmlnaW5UYXNrSWQ6IHN0cmluZztcbiAgICAgIHN0YXR1czogc3RyaW5nO1xuICAgICAgZXhwZWN0ZWRPdXRwdXRLZXlzOiBzdHJpbmdbXTtcbiAgICAgIGRhdGFEZXBlbmRlbmNpZXM6IHN0cmluZ1tdO1xuICAgICAgcmV0cnlPZklkczogc3RyaW5nW107XG4gICAgICBwYXJlbnRUYXNrSWRzOiBzdHJpbmdbXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBmb3IgYXJtb25pay5hcGkuZ3JwYy52MS5ldmVudHMuRXZlbnRTdWJzY3JpcHRpb25SZXNwb25zZS5OZXdSZXN1bHRcbiAgICovXG4gIGV4cG9ydCBjbGFzcyBOZXdSZXN1bHQgaW1wbGVtZW50cyBHcnBjTWVzc2FnZSB7XG4gICAgc3RhdGljIGlkID1cbiAgICAgICdhcm1vbmlrLmFwaS5ncnBjLnYxLmV2ZW50cy5FdmVudFN1YnNjcmlwdGlvblJlc3BvbnNlLk5ld1Jlc3VsdCc7XG5cbiAgICAvKipcbiAgICAgKiBEZXNlcmlhbGl6ZSBiaW5hcnkgZGF0YSB0byBtZXNzYWdlXG4gICAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzdGF0aWMgZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXM6IEJ5dGVTb3VyY2UpIHtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IE5ld1Jlc3VsdCgpO1xuICAgICAgTmV3UmVzdWx0LmRlc2VyaWFsaXplQmluYXJ5RnJvbVJlYWRlcihpbnN0YW5jZSwgbmV3IEJpbmFyeVJlYWRlcihieXRlcykpO1xuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGFsbCB0aGUgcHJvcGVydGllcyBhbmQgc2V0IGRlZmF1bHQgcHJvdG9idWYgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgICAqIEBwYXJhbSBfaW5zdGFuY2UgbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyByZWZpbmVWYWx1ZXMoX2luc3RhbmNlOiBOZXdSZXN1bHQpIHtcbiAgICAgIF9pbnN0YW5jZS5yZXN1bHRJZCA9IF9pbnN0YW5jZS5yZXN1bHRJZCB8fCAnJztcbiAgICAgIF9pbnN0YW5jZS5vd25lcklkID0gX2luc3RhbmNlLm93bmVySWQgfHwgJyc7XG4gICAgICBfaW5zdGFuY2Uuc3RhdHVzID0gX2luc3RhbmNlLnN0YXR1cyB8fCAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc2VyaWFsaXplcyAvIHJlYWRzIGJpbmFyeSBtZXNzYWdlIGludG8gbWVzc2FnZSBpbnN0YW5jZSB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAgICogQHBhcmFtIF9yZWFkZXIgYmluYXJ5IHJlYWRlciBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyBkZXNlcmlhbGl6ZUJpbmFyeUZyb21SZWFkZXIoXG4gICAgICBfaW5zdGFuY2U6IE5ld1Jlc3VsdCxcbiAgICAgIF9yZWFkZXI6IEJpbmFyeVJlYWRlclxuICAgICkge1xuICAgICAgd2hpbGUgKF9yZWFkZXIubmV4dEZpZWxkKCkpIHtcbiAgICAgICAgaWYgKF9yZWFkZXIuaXNFbmRHcm91cCgpKSBicmVhaztcblxuICAgICAgICBzd2l0Y2ggKF9yZWFkZXIuZ2V0RmllbGROdW1iZXIoKSkge1xuICAgICAgICAgIGNhc2UgNTA6XG4gICAgICAgICAgICBfaW5zdGFuY2UucmVzdWx0SWQgPSBfcmVhZGVyLnJlYWRTdHJpbmcoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgNTE6XG4gICAgICAgICAgICBfaW5zdGFuY2Uub3duZXJJZCA9IF9yZWFkZXIucmVhZFN0cmluZygpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSA1MjpcbiAgICAgICAgICAgIF9pbnN0YW5jZS5zdGF0dXMgPSBfcmVhZGVyLnJlYWRFbnVtKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgX3JlYWRlci5za2lwRmllbGQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBOZXdSZXN1bHQucmVmaW5lVmFsdWVzKF9pbnN0YW5jZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VyaWFsaXplcyBhIG1lc3NhZ2UgdG8gYmluYXJ5IGZvcm1hdCB1c2luZyBwcm92aWRlZCBiaW5hcnkgcmVhZGVyXG4gICAgICogQHBhcmFtIF9pbnN0YW5jZSBtZXNzYWdlIGluc3RhbmNlXG4gICAgICogQHBhcmFtIF93cml0ZXIgYmluYXJ5IHdyaXRlciBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyBzZXJpYWxpemVCaW5hcnlUb1dyaXRlcihcbiAgICAgIF9pbnN0YW5jZTogTmV3UmVzdWx0LFxuICAgICAgX3dyaXRlcjogQmluYXJ5V3JpdGVyXG4gICAgKSB7XG4gICAgICBpZiAoX2luc3RhbmNlLnJlc3VsdElkKSB7XG4gICAgICAgIF93cml0ZXIud3JpdGVTdHJpbmcoNTAsIF9pbnN0YW5jZS5yZXN1bHRJZCk7XG4gICAgICB9XG4gICAgICBpZiAoX2luc3RhbmNlLm93bmVySWQpIHtcbiAgICAgICAgX3dyaXRlci53cml0ZVN0cmluZyg1MSwgX2luc3RhbmNlLm93bmVySWQpO1xuICAgICAgfVxuICAgICAgaWYgKF9pbnN0YW5jZS5zdGF0dXMpIHtcbiAgICAgICAgX3dyaXRlci53cml0ZUVudW0oNTIsIF9pbnN0YW5jZS5zdGF0dXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgX3Jlc3VsdElkOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfb3duZXJJZDogc3RyaW5nO1xuICAgIHByaXZhdGUgX3N0YXR1czogYXJtb25pa0FwaUdycGNWMVJlc3VsdF9zdGF0dXMwMDEuUmVzdWx0U3RhdHVzO1xuXG4gICAgLyoqXG4gICAgICogTWVzc2FnZSBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZXMgdGhlIHByb3BlcnRpZXMgYW5kIGFwcGxpZXMgZGVmYXVsdCBQcm90b2J1ZiB2YWx1ZXMgaWYgbmVjZXNzYXJ5XG4gICAgICogQHBhcmFtIF92YWx1ZSBpbml0aWFsIHZhbHVlcyBvYmplY3Qgb3IgaW5zdGFuY2Ugb2YgTmV3UmVzdWx0IHRvIGRlZXBseSBjbG9uZSBmcm9tXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoX3ZhbHVlPzogUmVjdXJzaXZlUGFydGlhbDxOZXdSZXN1bHQuQXNPYmplY3Q+KSB7XG4gICAgICBfdmFsdWUgPSBfdmFsdWUgfHwge307XG4gICAgICB0aGlzLnJlc3VsdElkID0gX3ZhbHVlLnJlc3VsdElkO1xuICAgICAgdGhpcy5vd25lcklkID0gX3ZhbHVlLm93bmVySWQ7XG4gICAgICB0aGlzLnN0YXR1cyA9IF92YWx1ZS5zdGF0dXM7XG4gICAgICBOZXdSZXN1bHQucmVmaW5lVmFsdWVzKHRoaXMpO1xuICAgIH1cbiAgICBnZXQgcmVzdWx0SWQoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZXN1bHRJZDtcbiAgICB9XG4gICAgc2V0IHJlc3VsdElkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgIHRoaXMuX3Jlc3VsdElkID0gdmFsdWU7XG4gICAgfVxuICAgIGdldCBvd25lcklkKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5fb3duZXJJZDtcbiAgICB9XG4gICAgc2V0IG93bmVySWQodmFsdWU6IHN0cmluZykge1xuICAgICAgdGhpcy5fb3duZXJJZCA9IHZhbHVlO1xuICAgIH1cbiAgICBnZXQgc3RhdHVzKCk6IGFybW9uaWtBcGlHcnBjVjFSZXN1bHRfc3RhdHVzMDAxLlJlc3VsdFN0YXR1cyB7XG4gICAgICByZXR1cm4gdGhpcy5fc3RhdHVzO1xuICAgIH1cbiAgICBzZXQgc3RhdHVzKHZhbHVlOiBhcm1vbmlrQXBpR3JwY1YxUmVzdWx0X3N0YXR1czAwMS5SZXN1bHRTdGF0dXMpIHtcbiAgICAgIHRoaXMuX3N0YXR1cyA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlcmlhbGl6ZSBtZXNzYWdlIHRvIGJpbmFyeSBkYXRhXG4gICAgICogQHBhcmFtIGluc3RhbmNlIG1lc3NhZ2UgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzZXJpYWxpemVCaW5hcnkoKSB7XG4gICAgICBjb25zdCB3cml0ZXIgPSBuZXcgQmluYXJ5V3JpdGVyKCk7XG4gICAgICBOZXdSZXN1bHQuc2VyaWFsaXplQmluYXJ5VG9Xcml0ZXIodGhpcywgd3JpdGVyKTtcbiAgICAgIHJldHVybiB3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FzdCBtZXNzYWdlIHRvIHN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IChhbGwgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgYXJlIGRlZXBseSBjbG9uZWQpXG4gICAgICovXG4gICAgdG9PYmplY3QoKTogTmV3UmVzdWx0LkFzT2JqZWN0IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlc3VsdElkOiB0aGlzLnJlc3VsdElkLFxuICAgICAgICBvd25lcklkOiB0aGlzLm93bmVySWQsXG4gICAgICAgIHN0YXR1czogdGhpcy5zdGF0dXNcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHN1cHBvcnQgSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIHJlcGxpY2F0ZXMgdGhlIHN0cnVjdHVyZSBvZiB0b09iamVjdCgpXG4gICAgICovXG4gICAgdG9KU09OKCkge1xuICAgICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYXN0IG1lc3NhZ2UgdG8gSlNPTiB1c2luZyBwcm90b2J1ZiBKU09OIG5vdGF0aW9uOiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb25cbiAgICAgKiBBdHRlbnRpb246IG91dHB1dCBkaWZmZXJzIGZyb20gdG9PYmplY3QoKSBlLmcuIGVudW1zIGFyZSByZXByZXNlbnRlZCBhcyBuYW1lcyBhbmQgbm90IGFzIG51bWJlcnMsIFRpbWVzdGFtcCBpcyBhbiBJU08gRGF0ZSBzdHJpbmcgZm9ybWF0IGV0Yy5cbiAgICAgKiBJZiB0aGUgbWVzc2FnZSBpdHNlbGYgb3Igc29tZSBvZiBkZXNjZW5kYW50IG1lc3NhZ2VzIGlzIGdvb2dsZS5wcm90b2J1Zi5BbnksIHlvdSBNVVNUIHByb3ZpZGUgYSBtZXNzYWdlIHBvb2wgYXMgb3B0aW9ucy4gSWYgbm90LCB0aGUgbWVzc2FnZVBvb2wgaXMgbm90IHJlcXVpcmVkXG4gICAgICovXG4gICAgdG9Qcm90b2J1ZkpTT04oXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBvcHRpb25zPzogVG9Qcm90b2J1ZkpTT05PcHRpb25zXG4gICAgKTogTmV3UmVzdWx0LkFzUHJvdG9idWZKU09OIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlc3VsdElkOiB0aGlzLnJlc3VsdElkLFxuICAgICAgICBvd25lcklkOiB0aGlzLm93bmVySWQsXG4gICAgICAgIHN0YXR1czpcbiAgICAgICAgICBhcm1vbmlrQXBpR3JwY1YxUmVzdWx0X3N0YXR1czAwMS5SZXN1bHRTdGF0dXNbXG4gICAgICAgICAgICB0aGlzLnN0YXR1cyA9PT0gbnVsbCB8fCB0aGlzLnN0YXR1cyA9PT0gdW5kZWZpbmVkID8gMCA6IHRoaXMuc3RhdHVzXG4gICAgICAgICAgXVxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgZXhwb3J0IG1vZHVsZSBOZXdSZXN1bHQge1xuICAgIC8qKlxuICAgICAqIFN0YW5kYXJkIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZvciBOZXdSZXN1bHRcbiAgICAgKi9cbiAgICBleHBvcnQgaW50ZXJmYWNlIEFzT2JqZWN0IHtcbiAgICAgIHJlc3VsdElkOiBzdHJpbmc7XG4gICAgICBvd25lcklkOiBzdHJpbmc7XG4gICAgICBzdGF0dXM6IGFybW9uaWtBcGlHcnBjVjFSZXN1bHRfc3RhdHVzMDAxLlJlc3VsdFN0YXR1cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcm90b2J1ZiBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBOZXdSZXN1bHRcbiAgICAgKi9cbiAgICBleHBvcnQgaW50ZXJmYWNlIEFzUHJvdG9idWZKU09OIHtcbiAgICAgIHJlc3VsdElkOiBzdHJpbmc7XG4gICAgICBvd25lcklkOiBzdHJpbmc7XG4gICAgICBzdGF0dXM6IHN0cmluZztcbiAgICB9XG4gIH1cbn1cbiJdfQ==