@aerokit/sdk 12.72.0 → 12.74.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,11 @@
1
1
  import { Values } from "@aerokit/sdk/bpm/values";
2
+ const JBpmnError = Java.type("org.flowable.engine.delegate.BpmnError");
2
3
  const BpmFacade = Java.type("org.eclipse.dirigible.components.api.bpm.BpmFacade");
4
+ class BpmnError {
5
+ constructor(code, message) {
6
+ return new JBpmnError(code, message);
7
+ }
8
+ }
3
9
  class Process {
4
10
  /**
5
11
  * Starts a new process instance for a given process definition key.
@@ -95,9 +101,308 @@ class Process {
95
101
  static getExecutionContext() {
96
102
  return new ExecutionContext();
97
103
  }
104
+ /**
105
+ * Retrieves the current task context object, typically used within a task listener or service task.
106
+ *
107
+ * @returns A new instance of the `TaskContext` containing details about the current task.
108
+ */
109
+ static getTaskContext() {
110
+ return new TaskContext();
111
+ }
112
+ }
113
+ class VariableScope {
114
+ constructor(variableScope) {
115
+ this.variableScope = variableScope;
116
+ }
117
+ /**
118
+ * Returns all variables. This will include all variables of parent scopes too.
119
+ * @returns A Map of variable names (`string`) to variable values (`any`).
120
+ */
121
+ getVariables() {
122
+ const variables = this.variableScope.getVariables();
123
+ for (const [key, value] of variables) {
124
+ variables.set(key, Values.parseValue(value));
125
+ }
126
+ return variables;
127
+ }
128
+ /**
129
+ * Returns all variables, as instances of the {@link VariableInstance} interface, which gives more information than only the value (type, execution id, etc.)
130
+ * @returns A Map of variable names (`string`) to {@link VariableInstance} objects (Java type).
131
+ */
132
+ getVariableInstances() {
133
+ return this.variableScope.getVariableInstances();
134
+ }
135
+ /**
136
+ * Returns the variable local to this scope only. So, in contrary to {@link #getVariables()}, the variables from the parent scope won't be returned.
137
+ * @returns A Map of variable names (`string`) to local variable values (`any`).
138
+ */
139
+ getVariablesLocal() {
140
+ const variablesLocal = this.variableScope.getVariablesLocal();
141
+ for (const [key, value] of variablesLocal) {
142
+ variablesLocal.set(key, Values.parseValue(value));
143
+ }
144
+ return variablesLocal;
145
+ }
146
+ /**
147
+ * Returns the variables local to this scope as instances of the {@link VariableInstance} interface, which provided additional information about the variable.
148
+ * @returns A Map of variable names (`string`) to local {@link VariableInstance} objects (Java type).
149
+ */
150
+ getVariableInstancesLocal() {
151
+ return this.variableScope.getVariableInstancesLocal();
152
+ }
153
+ /**
154
+ * Returns the variable value for one specific variable. Will look in parent scopes when the variable does not exist on this particular scope.
155
+ * @param variableName The name of the variable to retrieve.
156
+ * @returns The value of the variable (`any`), or `null` if not found.
157
+ */
158
+ getVariable(variableName) {
159
+ return Values.parseValue(this.variableScope.getVariable(variableName));
160
+ }
161
+ /**
162
+ * Similar to {@link #getVariable(String)}, but returns a {@link VariableInstance} instance, which contains more information than just the value.
163
+ * @param variableName The name of the variable to retrieve.
164
+ * @returns The {@link VariableInstance} object (Java type), or `null`.
165
+ */
166
+ getVariableInstance(variableName) {
167
+ return this.variableScope.getVariableInstance(variableName);
168
+ }
169
+ /**
170
+ * Returns the value for the specific variable and only checks this scope and not any parent scope.
171
+ * @param variableName The name of the local variable to retrieve.
172
+ * @returns The value of the local variable (`any`), or `null` if not found locally.
173
+ */
174
+ getVariableLocal(variableName) {
175
+ return Values.parseValue(this.variableScope.getVariableLocal(variableName));
176
+ }
177
+ /**
178
+ * Similar to {@link #getVariableLocal(String)}, but returns an instance of {@link VariableInstance}, which has some additional information beyond the value.
179
+ * @param variableName The name of the local variable to retrieve.
180
+ * @returns The local {@link VariableInstance} object (Java type), or `null`.
181
+ */
182
+ getVariableInstanceLocal(variableName) {
183
+ return this.variableScope.getVariableInstanceLocal(variableName);
184
+ }
185
+ /**
186
+ * Returns all the names of the variables for this scope and all parent scopes.
187
+ * @returns A Set of all variable names (`string`).
188
+ */
189
+ getVariableNames() {
190
+ const variableNames = /* @__PURE__ */ new Set();
191
+ for (const next of this.variableScope.getVariableNames().toArray()) {
192
+ variableNames.add(next);
193
+ }
194
+ return variableNames;
195
+ }
196
+ /**
197
+ * Returns all the names of the variables for this scope (no parent scopes).
198
+ * @returns A Set of local variable names (`string`).
199
+ */
200
+ getVariableNamesLocal() {
201
+ const variableNamesLocal = /* @__PURE__ */ new Set();
202
+ for (const next of this.variableScope.getVariableNamesLocal().toArray()) {
203
+ variableNamesLocal.add(next);
204
+ }
205
+ return variableNamesLocal;
206
+ }
207
+ /**
208
+ * Sets the variable with the provided name to the provided value. It checks parent scopes for an existing variable before setting on the current scope.
209
+ * @param variableName The name of the variable to be set.
210
+ * @param value The value of the variable to be set (`any`).
211
+ */
212
+ setVariable(variableName, value) {
213
+ this.variableScope.setVariable(variableName, Values.stringifyValue(value));
214
+ }
215
+ /**
216
+ * Similar to {@link #setVariable(String, Object)}, but the variable is set to this scope specifically (local variable).
217
+ * @param variableName The name of the variable to be set locally.
218
+ * @param value The value of the variable to be set (`any`).
219
+ * @returns The old value of the local variable (Java type), or `null`.
220
+ */
221
+ setVariableLocal(variableName, value) {
222
+ return this.variableScope.setVariableLocal(variableName, Values.stringifyValue(value));
223
+ }
224
+ /**
225
+ * Sets the provided variables to the variable scope, using the default scoping algorithm.
226
+ * @param variables A map of keys (`string`) and values (`any`) for the variables to be set.
227
+ */
228
+ setVariables(variables) {
229
+ for (const [key, value] of variables) {
230
+ variables.set(key, Values.stringifyValue(value));
231
+ }
232
+ this.variableScope.setVariables(variables);
233
+ }
234
+ /**
235
+ * Similar to {@link #setVariables(Map)}, but the variables are set on this scope specifically (local variables).
236
+ * @param variables A map of keys (`string`) and values (`any`) for the local variables to be set.
237
+ */
238
+ setVariablesLocal(variables) {
239
+ for (const [key, value] of variables) {
240
+ variables.set(key, Values.stringifyValue(value));
241
+ }
242
+ this.variableScope.setVariablesLocal(variables);
243
+ }
244
+ /**
245
+ * Returns whether this scope or any parent scope has variables.
246
+ * @returns `true` if variables exist in scope hierarchy, `false` otherwise.
247
+ */
248
+ hasVariables() {
249
+ return this.variableScope.hasVariables();
250
+ }
251
+ /**
252
+ * Returns whether this scope has variables.
253
+ * @returns `true` if local variables exist, `false` otherwise.
254
+ */
255
+ hasVariablesLocal() {
256
+ return this.variableScope.hasVariablesLocal();
257
+ }
258
+ /**
259
+ * Returns whether this scope or any parent scope has a specific variable.
260
+ * @param variableName The name of the variable to check.
261
+ * @returns `true` if the variable is found in the scope hierarchy, `false` otherwise.
262
+ */
263
+ hasVariable(variableName) {
264
+ return this.variableScope.hasVariable(variableName);
265
+ }
266
+ /**
267
+ * Returns whether this scope has a specific variable.
268
+ * @param variableName The name of the local variable to check.
269
+ * @returns `true` if the variable is found locally, `false` otherwise.
270
+ */
271
+ hasVariableLocal(variableName) {
272
+ return this.variableScope.hasVariableLocal(variableName);
273
+ }
274
+ /**
275
+ * Removes the variable from the process instance and creates a new HistoricVariableUpdate. Searches up the scope hierarchy.
276
+ * @param variableName The name of the variable to remove.
277
+ */
278
+ removeVariable(variableName) {
279
+ this.variableScope.removeVariable(variableName);
280
+ }
281
+ /**
282
+ * Removes the local variable and creates a new HistoricVariableUpdate.
283
+ * @param variableName The name of the local variable to remove.
284
+ */
285
+ removeVariableLocal(variableName) {
286
+ this.variableScope.removeVariableLocal(variableName);
287
+ }
288
+ /**
289
+ * Removes the variables and creates a new HistoricVariableUpdate for each of them. Searches up the scope hierarchy.
290
+ * @param variableNames An array of variable names (`string[]`) to remove.
291
+ */
292
+ removeVariables(variableNames) {
293
+ this.variableScope.removeVariables(variableNames);
294
+ }
295
+ /**
296
+ * Removes the local variables and creates a new HistoricVariableUpdate for each of them.
297
+ * @param variableNames An array of local variable names (`string[]`) to remove.
298
+ */
299
+ removeVariablesLocal(variableNames) {
300
+ this.variableScope.removeVariablesLocal(variableNames);
301
+ }
302
+ /**
303
+ * Sets a transient variable using the default scoping mechanism (up the hierarchy). Transient variables have no history and are cleared at wait states.
304
+ * @param variableName The name of the transient variable.
305
+ * @param variableValue The value of the transient variable (`any`).
306
+ */
307
+ setTransientVariable(variableName, variableValue) {
308
+ this.variableScope.setTransientVariable(variableName, Values.stringifyValue(variableValue));
309
+ }
310
+ /**
311
+ * Sets a local transient variable. Transient variables have no history and are cleared at wait states.
312
+ * @param variableName The name of the local transient variable.
313
+ * @param variableValue The value of the local transient variable (`any`).
314
+ */
315
+ setTransientVariableLocal(variableName, variableValue) {
316
+ this.variableScope.setTransientVariableLocal(variableName, Values.stringifyValue(variableValue));
317
+ }
318
+ /**
319
+ * Sets multiple transient variables using the default scoping mechanism (up the hierarchy).
320
+ * @param transientVariables A map of keys (`string`) and values (`any`) for the transient variables to be set.
321
+ */
322
+ setTransientVariables(transientVariables) {
323
+ for (const [key, value] of transientVariables) {
324
+ transientVariables.set(key, Values.stringifyValue(value));
325
+ }
326
+ this.variableScope.setTransientVariables(transientVariables);
327
+ }
328
+ /**
329
+ * Retrieves the value of a transient variable, searching up the parent scopes.
330
+ * @param variableName The name of the transient variable to retrieve.
331
+ * @returns The value of the transient variable (`any`), or `null` if not found.
332
+ */
333
+ getTransientVariable(variableName) {
334
+ return Values.parseValue(this.variableScope.getTransientVariable(variableName));
335
+ }
336
+ /**
337
+ * Retrieves all transient variables in the current scope hierarchy.
338
+ * @returns A Map of transient variable names (`string`) to values (`any`).
339
+ */
340
+ getTransientVariables() {
341
+ const transientVariables = this.variableScope.getTransientVariables();
342
+ for (const [key, value] of transientVariables) {
343
+ transientVariables.set(key, Values.parseValue(value));
344
+ }
345
+ return transientVariables;
346
+ }
347
+ /**
348
+ * Sets multiple local transient variables.
349
+ * @param transientVariables A map of keys (`string`) and values (`any`) for the local transient variables to be set.
350
+ */
351
+ setTransientVariablesLocal(transientVariables) {
352
+ for (const [key, value] of transientVariables) {
353
+ transientVariables.set(key, Values.stringifyValue(value));
354
+ }
355
+ this.variableScope.setTransientVariablesLocal(transientVariables);
356
+ }
357
+ /**
358
+ * Retrieves the value of a local transient variable.
359
+ * @param variableName The name of the local transient variable to retrieve.
360
+ * @returns The value of the local transient variable (`any`), or `null` if not found.
361
+ */
362
+ getTransientVariableLocal(variableName) {
363
+ return Values.parseValue(this.variableScope.getTransientVariableLocal(variableName));
364
+ }
365
+ /**
366
+ * Retrieves all local transient variables.
367
+ * @returns A Map of local transient variable names (`string`) to values (`any`).
368
+ */
369
+ getTransientVariablesLocal() {
370
+ const transientVariablesLocal = this.variableScope.getTransientVariablesLocal();
371
+ for (const [key, value] of transientVariablesLocal) {
372
+ transientVariablesLocal.set(key, Values.parseValue(value));
373
+ }
374
+ return transientVariablesLocal;
375
+ }
376
+ /**
377
+ * Removes a specific local transient variable.
378
+ * @param variableName The name of the local transient variable to remove.
379
+ */
380
+ removeTransientVariableLocal(variableName) {
381
+ this.variableScope.removeTransientVariableLocal(variableName);
382
+ }
383
+ /**
384
+ * Removes a specific transient variable, searching up the scope hierarchy.
385
+ * @param variableName The name of the transient variable to remove.
386
+ */
387
+ removeTransientVariable(variableName) {
388
+ this.variableScope.removeTransientVariable(variableName);
389
+ }
390
+ /**
391
+ * Remove all transient variables of this scope and its parent scopes.
392
+ */
393
+ removeTransientVariables() {
394
+ this.variableScope.removeTransientVariables();
395
+ }
396
+ /**
397
+ * Removes all local transient variables.
398
+ */
399
+ removeTransientVariablesLocal() {
400
+ this.variableScope.removeTransientVariablesLocal();
401
+ }
98
402
  }
99
- class ExecutionContext {
403
+ class ExecutionContext extends VariableScope {
100
404
  constructor() {
405
+ super(__context.get("execution"));
101
406
  this.execution = __context.get("execution");
102
407
  }
103
408
  /**
@@ -322,296 +627,426 @@ class ExecutionContext {
322
627
  setMultiInstanceRoot(isMultiInstanceRoot) {
323
628
  this.execution.setMultiInstanceRoot(isMultiInstanceRoot);
324
629
  }
630
+ }
631
+ var DelegationState = /* @__PURE__ */ ((DelegationState2) => {
632
+ DelegationState2[DelegationState2["PENDING"] = 0] = "PENDING";
633
+ DelegationState2[DelegationState2["RESOLVED"] = 1] = "RESOLVED";
634
+ return DelegationState2;
635
+ })(DelegationState || {});
636
+ class TaskContext extends VariableScope {
637
+ constructor() {
638
+ super(__context.get("task"));
639
+ this.task = __context.get("task");
640
+ }
325
641
  /**
326
- * Returns all variables. This will include all variables of parent scopes too.
327
- * @returns A Map of variable names (`string`) to variable values (`any`).
642
+ * DB id of the task.
643
+ *
644
+ * @returns the unique ID of the current task.
328
645
  */
329
- getVariables() {
330
- const variables = this.execution.getVariables();
331
- for (const [key, value] of variables) {
332
- variables.set(key, Values.parseValue(value));
333
- }
334
- return variables;
646
+ getId() {
647
+ return this.task.getId();
335
648
  }
336
649
  /**
337
- * Returns all variables, as instances of the {@link VariableInstance} interface, which gives more information than only the value (type, execution id, etc.)
338
- * @returns A Map of variable names (`string`) to {@link VariableInstance} objects (Java type).
650
+ * Name or title of the task.
651
+ *
652
+ * @returns the name of the current task.
339
653
  */
340
- getVariableInstances() {
341
- return this.execution.getVariableInstances();
654
+ getName() {
655
+ return this.task.getName();
342
656
  }
343
657
  /**
344
- * Returns the variable local to this scope only. So, in contrary to {@link #getVariables()}, the variables from the parent scope won't be returned.
345
- * @returns A Map of variable names (`string`) to local variable values (`any`).
658
+ * Change the name of the task.
659
+ *
660
+ * @param name the new name for the task.
346
661
  */
347
- getVariablesLocal() {
348
- const variablesLocal = this.execution.getVariablesLocal();
349
- for (const [key, value] of variablesLocal) {
350
- variablesLocal.set(key, Values.parseValue(value));
351
- }
352
- return variablesLocal;
662
+ setName(name) {
663
+ this.task.setName(name);
353
664
  }
354
665
  /**
355
- * Returns the variables local to this scope as instances of the {@link VariableInstance} interface, which provided additional information about the variable.
356
- * @returns A Map of variable names (`string`) to local {@link VariableInstance} objects (Java type).
666
+ * Get the free text description of the task.
667
+ *
668
+ * @returns the description of the current task.
357
669
  */
358
- getVariableInstancesLocal() {
359
- return this.execution.getVariableInstancesLocal();
670
+ getDescription() {
671
+ return this.task.getDescription();
360
672
  }
361
673
  /**
362
- * Returns the variable value for one specific variable. Will look in parent scopes when the variable does not exist on this particular scope.
363
- * @param variableName The name of the variable to retrieve.
364
- * @returns The value of the variable (`any`), or `null` if not found.
674
+ * Free text description of the task.
675
+ *
676
+ * @param description the new description for the task.
365
677
  */
366
- getVariable(variableName) {
367
- return Values.parseValue(this.execution.getVariable(variableName));
678
+ setDescription(description) {
679
+ this.task.setDescription(description);
368
680
  }
369
681
  /**
370
- * Similar to {@link #getVariable(String)}, but returns a {@link VariableInstance} instance, which contains more information than just the value.
371
- * @param variableName The name of the variable to retrieve.
372
- * @returns The {@link VariableInstance} object (Java type), or `null`.
682
+ * Indication of how important/urgent this task is with a number between 0 and 100 where higher values mean a higher priority and lower values mean lower priority: [0..19] lowest, [20..39] low,
683
+ * [40..59] normal, [60..79] high [80..100] highest
684
+ *
685
+ * @returns the priority of the current task.
373
686
  */
374
- getVariableInstance(variableName) {
375
- return this.execution.getVariableInstance(variableName);
687
+ getPriority() {
688
+ return this.task.getPriority();
376
689
  }
377
690
  /**
378
- * Returns the value for the specific variable and only checks this scope and not any parent scope.
379
- * @param variableName The name of the local variable to retrieve.
380
- * @returns The value of the local variable (`any`), or `null` if not found locally.
691
+ * Indication of how important/urgent this task is with a number between 0 and 100 where higher values mean a higher priority and lower values mean lower priority: [0..19] lowest, [20..39] low,
692
+ * [40..59] normal, [60..79] high [80..100] highest
693
+ *
694
+ * @param priority the new priority for the task, with a number between 0 and 100 where higher values mean a higher priority and lower values mean lower priority: [0..19] lowest, [20..39] low, [40..59] normal,
381
695
  */
382
- getVariableLocal(variableName) {
383
- return Values.parseValue(this.execution.getVariableLocal(variableName));
696
+ setPriority(priority) {
697
+ this.task.setPriority(priority);
384
698
  }
385
699
  /**
386
- * Similar to {@link #getVariableLocal(String)}, but returns an instance of {@link VariableInstance}, which has some additional information beyond the value.
387
- * @param variableName The name of the local variable to retrieve.
388
- * @returns The local {@link VariableInstance} object (Java type), or `null`.
700
+ * Refrence to the process instance this task is associated with, or `null` if the task is not related to a process instance.
701
+ *
702
+ * @returns the ID of the process instance this task is associated with, or `null`.
389
703
  */
390
- getVariableInstanceLocal(variableName) {
391
- return this.execution.getVariableInstanceLocal(variableName);
704
+ getProcessInstanceId() {
705
+ return this.task.getProcessInstanceId();
392
706
  }
393
707
  /**
394
- * Returns all the names of the variables for this scope and all parent scopes.
395
- * @returns A Set of all variable names (`string`).
708
+ * Reference to the path of execution this task is associated with, or `null` if the task is not related to a process instance.
709
+ *
710
+ * @returns the ID of the execution this task is associated with, or `null`.
396
711
  */
397
- getVariableNames() {
398
- const variableNames = /* @__PURE__ */ new Set();
399
- for (const next of this.execution.getVariableNames().toArray()) {
400
- variableNames.add(next);
401
- }
402
- return variableNames;
712
+ getExecutionId() {
713
+ return this.task.getExecutionId();
403
714
  }
404
715
  /**
405
- * Returns all the names of the variables for this scope (no parent scopes).
406
- * @returns A Set of local variable names (`string`).
716
+ * Reference to the process definition this task is associated with, or `null` if the task is not related to a process instance.
717
+ *
718
+ * @returns the ID of the process definition this task is associated with, or `null`.
407
719
  */
408
- getVariableNamesLocal() {
409
- const variableNamesLocal = /* @__PURE__ */ new Set();
410
- for (const next of this.execution.getVariableNamesLocal().toArray()) {
411
- variableNamesLocal.add(next);
412
- }
413
- return variableNamesLocal;
720
+ getProcessDefinitionId() {
721
+ return this.task.getProcessDefinitionId();
414
722
  }
415
723
  /**
416
- * Sets the variable with the provided name to the provided value. It checks parent scopes for an existing variable before setting on the current scope.
417
- * @param variableName The name of the variable to be set.
418
- * @param value The value of the variable to be set (`any`).
724
+ * The current state of the task.
725
+ *
726
+ * @returns the state of the current task.
419
727
  */
420
- setVariable(variableName, value) {
421
- this.execution.setVariable(variableName, Values.stringifyValue(value));
728
+ getState() {
729
+ return this.task.getState();
422
730
  }
423
731
  /**
424
- * Similar to {@link #setVariable(String, Object)}, but the variable is set to this scope specifically (local variable).
425
- * @param variableName The name of the variable to be set locally.
426
- * @param value The value of the variable to be set (`any`).
427
- * @returns The old value of the local variable (Java type), or `null`.
732
+ * The date/time when this task was created.
733
+ *
734
+ * @returns the creation time of the current task.
428
735
  */
429
- setVariableLocal(variableName, value) {
430
- return this.execution.setVariableLocal(variableName, Values.stringifyValue(value));
736
+ getCreateTime() {
737
+ return this.task.getCreateTime();
431
738
  }
432
739
  /**
433
- * Sets the provided variables to the variable scope, using the default scoping algorithm.
434
- * @param variables A map of keys (`string`) and values (`any`) for the variables to be set.
740
+ * The date/time when this task was put in progress.
741
+ *
742
+ * @returns the in progress start time of the current task.
435
743
  */
436
- setVariables(variables) {
437
- for (const [key, value] of variables) {
438
- variables.set(key, Values.stringifyValue(value));
439
- }
440
- this.execution.setVariables(variables);
744
+ getInProgressStartTime() {
745
+ return this.task.getInProgressStartTime();
441
746
  }
442
747
  /**
443
- * Similar to {@link #setVariables(Map)}, but the variables are set on this scope specifically (local variables).
444
- * @param variables A map of keys (`string`) and values (`any`) for the local variables to be set.
748
+ * The user reference that started the task.
749
+ *
750
+ * @returns the user reference that started the task.
445
751
  */
446
- setVariablesLocal(variables) {
447
- for (const [key, value] of variables) {
448
- variables.set(key, Values.stringifyValue(value));
449
- }
450
- this.execution.setVariablesLocal(variables);
752
+ getInProgressStartedBy() {
753
+ return this.task.getInProgressStartedBy();
451
754
  }
452
755
  /**
453
- * Returns whether this scope or any parent scope has variables.
454
- * @returns `true` if variables exist in scope hierarchy, `false` otherwise.
756
+ * The date/time when this task was claimed.
757
+ *
758
+ * @returns the claim time of the current task.
455
759
  */
456
- hasVariables() {
457
- return this.execution.hasVariables();
760
+ getClaimTime() {
761
+ return this.task.getClaimTime();
458
762
  }
459
763
  /**
460
- * Returns whether this scope has variables.
461
- * @returns `true` if local variables exist, `false` otherwise.
764
+ * The user reference that claimed the task.
765
+ *
766
+ * @returns the user reference that claimed the task.
462
767
  */
463
- hasVariablesLocal() {
464
- return this.execution.hasVariablesLocal();
768
+ getClaimedBy() {
769
+ return this.task.getClaimedBy();
465
770
  }
466
771
  /**
467
- * Returns whether this scope or any parent scope has a specific variable.
468
- * @param variableName The name of the variable to check.
469
- * @returns `true` if the variable is found in the scope hierarchy, `false` otherwise.
772
+ * The date/time when this task was suspended.
773
+ *
774
+ * @returns the date/time when this task was suspended.
470
775
  */
471
- hasVariable(variableName) {
472
- return this.execution.hasVariable(variableName);
776
+ getSuspendedTime() {
777
+ return this.task.getSuspendedTime();
473
778
  }
474
779
  /**
475
- * Returns whether this scope has a specific variable.
476
- * @param variableName The name of the local variable to check.
477
- * @returns `true` if the variable is found locally, `false` otherwise.
780
+ * The user reference that suspended the task.
781
+ *
782
+ * @returns the user reference that suspended the task.
478
783
  */
479
- hasVariableLocal(variableName) {
480
- return this.execution.hasVariableLocal(variableName);
784
+ getSuspendedBy() {
785
+ return this.task.getSuspendedBy();
481
786
  }
482
787
  /**
483
- * Removes the variable from the process instance and creates a new HistoricVariableUpdate. Searches up the scope hierarchy.
484
- * @param variableName The name of the variable to remove.
788
+ * The id of the activity in the process defining this task or null if this is not related to a process.
789
+ *
790
+ * @returns the task definition key.
485
791
  */
486
- removeVariable(variableName) {
487
- this.execution.removeVariable(variableName);
792
+ getTaskDefinitionKey() {
793
+ return this.task.getTaskDefinitionKey();
488
794
  }
489
795
  /**
490
- * Removes the local variable and creates a new HistoricVariableUpdate.
491
- * @param variableName The name of the local variable to remove.
796
+ * Indicated whether this task is suspended or not.
797
+ *
798
+ * @returns `true` if the task is suspended, `false` otherwise.
492
799
  */
493
- removeVariableLocal(variableName) {
494
- this.execution.removeVariableLocal(variableName);
800
+ isSuspended() {
801
+ return this.task.isSuspended();
495
802
  }
496
803
  /**
497
- * Removes the variables and creates a new HistoricVariableUpdate for each of them. Searches up the scope hierarchy.
498
- * @param variableNames An array of variable names (`string[]`) to remove.
804
+ * The tenant identifier of this task, which is the same as the tenant identifier of the process definition and process instance this task is associated with (if any).
805
+ *
806
+ * @returns the tenant ID of this task, or `null`/empty string if no tenant is associated.
499
807
  */
500
- removeVariables(variableNames) {
501
- this.execution.removeVariables(variableNames);
808
+ getTenantId() {
809
+ return this.task.getTenantId();
502
810
  }
503
811
  /**
504
- * Removes the local variables and creates a new HistoricVariableUpdate for each of them.
505
- * @param variableNames An array of local variable names (`string[]`) to remove.
812
+ * The form key for the user task, which is the same as the form key defined on the user task in the process definition. Will return `null` if this task is not a user task or if no form key is defined.
813
+ *
814
+ * @returns the form key for the user task, or `null` if no form key is defined.
506
815
  */
507
- removeVariablesLocal(variableNames) {
508
- this.execution.removeVariablesLocal(variableNames);
816
+ getFormKey() {
817
+ return this.task.getFormKey();
509
818
  }
510
819
  /**
511
- * Sets a transient variable using the default scoping mechanism (up the hierarchy). Transient variables have no history and are cleared at wait states.
512
- * @param variableName The name of the transient variable.
513
- * @param variableValue The value of the transient variable (`any`).
820
+ * Change the form key of the task.
821
+ *
822
+ * @param formKey the new form key for the user task, or `null` to remove the form key
514
823
  */
515
- setTransientVariable(variableName, variableValue) {
516
- this.execution.setTransientVariable(variableName, Values.stringifyValue(variableValue));
824
+ setFormKey(formKey) {
825
+ this.task.setFormKey(formKey);
517
826
  }
518
827
  /**
519
- * Sets a local transient variable. Transient variables have no history and are cleared at wait states.
520
- * @param variableName The name of the local transient variable.
521
- * @param variableValue The value of the local transient variable (`any`).
828
+ * The event name which triggered the task listener to fire for this task. Will return `null`/empty string if not executing a task listener.
829
+ *
830
+ * @returns the event name which triggered the task listener to fire for this task, or `null`/empty string if not executing a task listener.
522
831
  */
523
- setTransientVariableLocal(variableName, variableValue) {
524
- this.execution.setTransientVariableLocal(variableName, Values.stringifyValue(variableValue));
832
+ getEventName() {
833
+ return this.task.getEventName();
525
834
  }
526
835
  /**
527
- * Sets multiple transient variables using the default scoping mechanism (up the hierarchy).
528
- * @param transientVariables A map of keys (`string`) and values (`any`) for the transient variables to be set.
836
+ * The event handler identifier which triggered the task listener to fire for this task. Will return `null`/empty string if not executing a task listener or if the event handler does not have an identifier.
837
+ *
838
+ * @returns the event handler identifier, or `null`/empty string if not executing a task listener or if the event handler does not have an identifier.
529
839
  */
530
- setTransientVariables(transientVariables) {
531
- for (const [key, value] of transientVariables) {
532
- transientVariables.set(key, Values.stringifyValue(value));
533
- }
534
- this.execution.setTransientVariables(transientVariables);
840
+ getEventHandlerId() {
841
+ return this.task.getEventHandlerId();
535
842
  }
536
843
  /**
537
- * Retrieves the value of a transient variable, searching up the parent scopes.
538
- * @param variableName The name of the transient variable to retrieve.
539
- * @returns The value of the transient variable (`any`), or `null` if not found.
844
+ * The current delegation state of the task, which is `null` if the task is not delegated, `PENDING` if the task is delegated and waiting for resolution by the assignee, and `RESOLVED` if the task is delegated and has been resolved by the assignee but not yet completed by the owner.
845
+ *
846
+ * @returns the delegation state of the task, which is `null` if the task is not delegated, `PENDING` if the task is delegated and waiting for resolution by the assignee, and `RESOLVED` if the task is delegated and has been resolved by the assignee but not yet completed by the owner.
540
847
  */
541
- getTransientVariable(variableName) {
542
- return Values.parseValue(this.execution.getTransientVariable(variableName));
848
+ getDelegationState() {
849
+ return this.task.getDelegationState();
543
850
  }
544
851
  /**
545
- * Retrieves all transient variables in the current scope hierarchy.
546
- * @returns A Map of transient variable names (`string`) to values (`any`).
852
+ * Adds a candidate user to this task, which means that the user is allowed to claim and work on this task. This does not mean that the user is the assignee of the task, but it means that the user is a candidate to become an assignee. The user will be able to see this task in their task list and claim it to become the assignee.
853
+ *
854
+ * @param userId the user ID of the candidate user to add to this task.
547
855
  */
548
- getTransientVariables() {
549
- const transientVariables = this.execution.getTransientVariables();
550
- for (const [key, value] of transientVariables) {
551
- transientVariables.set(key, Values.parseValue(value));
552
- }
553
- return transientVariables;
856
+ addCandidateUser(userId) {
857
+ this.task.addCandidateUser(userId);
554
858
  }
555
859
  /**
556
- * Sets multiple local transient variables.
557
- * @param transientVariables A map of keys (`string`) and values (`any`) for the local transient variables to be set.
860
+ * Adds multiple users as candidate user to this task.
861
+ *
862
+ * @param candidateUsers the collection of candidate user IDs to add to this task.
558
863
  */
559
- setTransientVariablesLocal(transientVariables) {
560
- for (const [key, value] of transientVariables) {
561
- transientVariables.set(key, Values.stringifyValue(value));
562
- }
563
- this.execution.setTransientVariablesLocal(transientVariables);
864
+ addCandidateUsers(candidateUsers) {
865
+ this.task.addCandidateUsers(candidateUsers);
564
866
  }
565
867
  /**
566
- * Retrieves the value of a local transient variable.
567
- * @param variableName The name of the local transient variable to retrieve.
568
- * @returns The value of the local transient variable (`any`), or `null` if not found.
868
+ * Adds a candidate group to this task, which means that all users that are members of this group are allowed to claim and work on this task. This does not mean that the group is the assignee of the task, but it means that all users that are members of the group are candidates to become assignees. The users that are members of the group will be able to see this task in their task list and claim it to become the assignee.
869
+ *
870
+ * @param groupId the group ID of the candidate group to add to this task.
569
871
  */
570
- getTransientVariableLocal(variableName) {
571
- return Values.parseValue(this.execution.getTransientVariableLocal(variableName));
872
+ addCandidateGroup(groupId) {
873
+ this.task.addCandidateGroup(groupId);
572
874
  }
573
875
  /**
574
- * Retrieves all local transient variables.
575
- * @returns A Map of local transient variable names (`string`) to values (`any`).
876
+ * Adds multiple groups as candidate group to this task.
877
+ *
878
+ * @param candidateGroups the collection of candidate group IDs to add to this task.
576
879
  */
577
- getTransientVariablesLocal() {
578
- const transientVariablesLocal = this.execution.getTransientVariablesLocal();
579
- for (const [key, value] of transientVariablesLocal) {
580
- transientVariablesLocal.set(key, Values.parseValue(value));
581
- }
582
- return transientVariablesLocal;
880
+ addCandidateGroups(candidateGroups) {
881
+ this.task.addCandidateGroups(candidateGroups);
583
882
  }
584
883
  /**
585
- * Removes a specific local transient variable.
586
- * @param variableName The name of the local transient variable to remove.
884
+ * The user id of the person responsible for this task. This is the user that has to work on this task and complete it. When a task is assigned to a user, that user becomes the assignee of the task. The assignee is the only one that can complete the task (unless the task is delegated
885
+ *
886
+ * @returns the user ID of the assignee of this task
587
887
  */
588
- removeTransientVariableLocal(variableName) {
589
- this.execution.removeTransientVariableLocal(variableName);
888
+ getOwner() {
889
+ return this.task.getOwner();
590
890
  }
591
891
  /**
592
- * Removes a specific transient variable, searching up the scope hierarchy.
593
- * @param variableName The name of the transient variable to remove.
892
+ * The user id of the person responsible for this task. This is the user that has to work on this task and complete it. When a task is assigned to a user, that user becomes the assignee of the task. The assignee is the only one that can complete the task (unless the task is delegated
893
+ *
894
+ * @param owner the user ID of the assignee of this task
594
895
  */
595
- removeTransientVariable(variableName) {
596
- this.execution.removeTransientVariable(variableName);
896
+ setOwner(owner) {
897
+ this.task.setOwner(owner);
597
898
  }
598
899
  /**
599
- * Remove all transient variables of this scope and its parent scopes.
900
+ * The user id of the person to which this task is delegated.
901
+ *
902
+ * @returns the user ID of the assignee of this task
600
903
  */
601
- removeTransientVariables() {
602
- this.execution.removeTransientVariables();
904
+ getAssignee() {
905
+ return this.task.getAssignee();
603
906
  }
604
907
  /**
605
- * Removes all local transient variables.
908
+ * The user id of the person to which this task is delegated.
909
+ * @param assignee the user ID of the assignee of this task
606
910
  */
607
- removeTransientVariablesLocal() {
608
- this.execution.removeTransientVariablesLocal();
911
+ setAssignee(assignee) {
912
+ this.task.setAssignee(assignee);
913
+ }
914
+ /**
915
+ * Due date of the in progress start of the task.
916
+ *
917
+ * @returns the due date of the in progress start of the task.
918
+ */
919
+ getInProgressStartDueDate() {
920
+ return this.task.getInProgressStartDueDate();
921
+ }
922
+ /**
923
+ * Change the in progress start due date of the task.
924
+ *
925
+ * @param inProgressStartDueDate the new due date of the in progress start of the task.
926
+ */
927
+ setInProgressStartDueDate(inProgressStartDueDate) {
928
+ this.task.setInProgressStartDueDate(inProgressStartDueDate);
929
+ }
930
+ /**
931
+ * Due date of the task.
932
+ *
933
+ * @returns the due date of the task.
934
+ */
935
+ getDueDate() {
936
+ return this.task.getDueDate();
937
+ }
938
+ /**
939
+ * Change the due date of the task.
940
+ *
941
+ * @param dueDate the new due date of the task.
942
+ */
943
+ setDueDate(dueDate) {
944
+ this.task.setDueDate(dueDate);
945
+ }
946
+ /**
947
+ * The category of the task. This is an optional field and allows to 'tag' tasks as belonging to a certain category.
948
+ *
949
+ * @returns the category of the task
950
+ */
951
+ getCategory() {
952
+ return this.task.getCategory();
953
+ }
954
+ /**
955
+ * Change the category of the task. This is an optional field and allows to 'tag' tasks as belonging to a certain category.
956
+ *
957
+ * @param category the new category of the task
958
+ */
959
+ setCategory(category) {
960
+ this.task.setCategory(category);
961
+ }
962
+ /**
963
+ * Involves a user with a task. The type of identity link is defined by the given identityLinkType.
964
+ *
965
+ * @param userId
966
+ * id of the user involve, cannot be null.
967
+ * @param identityLinkType
968
+ * type of identityLink, cannot be null (@see {@link IdentityLinkType}).
969
+ * @throws FlowableObjectNotFoundException
970
+ * when the task or user doesn't exist.
971
+ */
972
+ addUserIdentityLink(userId, identityLinkType) {
973
+ this.task.addUserIdentityLink(userId, identityLinkType);
974
+ }
975
+ /**
976
+ * Involves a group with group task. The type of identityLink is defined by the given identityLink.
977
+ *
978
+ * @param groupId
979
+ * id of the group to involve, cannot be null.
980
+ * @param identityLinkType
981
+ * type of identity, cannot be null (@see {@link IdentityLinkType}).
982
+ * @throws FlowableObjectNotFoundException
983
+ * when the task or group doesn't exist.
984
+ */
985
+ addGroupIdentityLink(groupId, identityLinkType) {
986
+ this.task.addGroupIdentityLink(groupId, identityLinkType);
987
+ }
988
+ /**
989
+ * Convenience shorthand for {@link #deleteUserIdentityLink(String, String)} ; with type {@link IdentityLinkType#CANDIDATE}
990
+ *
991
+ * @param userId
992
+ * id of the user to use as candidate, cannot be null.
993
+ * @throws FlowableObjectNotFoundException
994
+ * when the task or user doesn't exist.
995
+ */
996
+ deleteCandidateUser(userId) {
997
+ this.task.deleteCandidateUser(userId);
998
+ }
999
+ /**
1000
+ * Convenience shorthand for {@link #deleteGroupIdentityLink(String, String)}; with type {@link IdentityLinkType#CANDIDATE}
1001
+ *
1002
+ * @param groupId
1003
+ * id of the group to use as candidate, cannot be null.
1004
+ * @throws FlowableObjectNotFoundException
1005
+ * when the task or group doesn't exist.
1006
+ */
1007
+ deleteCandidateGroup(groupId) {
1008
+ this.task.deleteCandidateGroup(groupId);
1009
+ }
1010
+ /**
1011
+ * Removes the association between a user and a task for the given identityLinkType.
1012
+ *
1013
+ * @param userId
1014
+ * id of the user involve, cannot be null.
1015
+ * @param identityLinkType
1016
+ * type of identityLink, cannot be null (@see {@link IdentityLinkType}).
1017
+ * @throws FlowableObjectNotFoundException
1018
+ * when the task or user doesn't exist.
1019
+ */
1020
+ deleteUserIdentityLink(userId, identityLinkType) {
1021
+ this.task.deleteUserIdentityLink(userId, identityLinkType);
1022
+ }
1023
+ /**
1024
+ * Removes the association between a group and a task for the given identityLinkType.
1025
+ *
1026
+ * @param groupId
1027
+ * id of the group to involve, cannot be null.
1028
+ * @param identityLinkType
1029
+ * type of identity, cannot be null (@see {@link IdentityLinkType}).
1030
+ * @throws FlowableObjectNotFoundException
1031
+ * when the task or group doesn't exist.
1032
+ */
1033
+ deleteGroupIdentityLink(groupId, identityLinkType) {
1034
+ this.task.deleteGroupIdentityLink(groupId, identityLinkType);
1035
+ }
1036
+ /**
1037
+ * Retrieves the candidate users and groups associated with the task.
1038
+ *
1039
+ * @return set of {@link IdentityLink}s of type {@link IdentityLinkType#CANDIDATE}.
1040
+ */
1041
+ getCandidates() {
1042
+ return this.task.getCandidates();
609
1043
  }
610
1044
  }
611
1045
  if (typeof module !== "undefined") {
612
1046
  module.exports = Process;
613
1047
  }
614
1048
  export {
1049
+ BpmnError,
615
1050
  Process
616
1051
  };
617
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2JwbS9wcm9jZXNzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEFQSSBQcm9jZXNzXG4gKiAqIFByb3ZpZGVzIG1ldGhvZHMgZm9yIGludGVyYWN0aW5nIHdpdGggcHJvY2VzcyBpbnN0YW5jZXMsXG4gKiBpbmNsdWRpbmcgc3RhcnRpbmcsIHVwZGF0aW5nIG1ldGFkYXRhLCBhbmQgbWFuYWdpbmcgdmFyaWFibGVzLlxuICovXG5cbmltcG9ydCB7IFZhbHVlcyB9IGZyb20gXCJAYWVyb2tpdC9zZGsvYnBtL3ZhbHVlc1wiO1xuXG5jb25zdCBCcG1GYWNhZGUgPSBKYXZhLnR5cGUoXCJvcmcuZWNsaXBzZS5kaXJpZ2libGUuY29tcG9uZW50cy5hcGkuYnBtLkJwbUZhY2FkZVwiKTtcblxuZXhwb3J0IGNsYXNzIFByb2Nlc3Mge1xuXG5cdC8qKlxuXHQgKiBTdGFydHMgYSBuZXcgcHJvY2VzcyBpbnN0YW5jZSBmb3IgYSBnaXZlbiBwcm9jZXNzIGRlZmluaXRpb24ga2V5LlxuXHQgKlxuXHQgKiBAcGFyYW0ga2V5IFRoZSBwcm9jZXNzIGRlZmluaXRpb24ga2V5IChJRCkgb2YgdGhlIHByb2Nlc3MgdG8gc3RhcnQuXG5cdCAqIEBwYXJhbSBidXNpbmVzc0tleSBBbiBvcHRpb25hbCBidXNpbmVzcyBrZXkgdG8gYXNzb2NpYXRlIHdpdGggdGhlIHByb2Nlc3MgaW5zdGFuY2UuIERlZmF1bHRzIHRvIGFuIGVtcHR5IHN0cmluZy5cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgQW4gb3B0aW9uYWwgbWFwIG9mIHByb2Nlc3MgdmFyaWFibGVzIHRvIHBhc3MgdG8gdGhlIHByb2Nlc3MgaW5zdGFuY2UgdXBvbiBzdGFydGluZy4gRGVmYXVsdHMgdG8gYW4gZW1wdHkgb2JqZWN0LlxuXHQgKiBAcmV0dXJucyBUaGUgdW5pcXVlIElEIG9mIHRoZSBuZXdseSBzdGFydGVkIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIHN0YXJ0KGtleTogc3RyaW5nLCBidXNpbmVzc0tleTogc3RyaW5nID0gJycsIHBhcmFtZXRlcnM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fSk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIEJwbUZhY2FkZS5zdGFydFByb2Nlc3Moa2V5LCBidXNpbmVzc0tleSwgSlNPTi5zdHJpbmdpZnkocGFyYW1ldGVycykpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgYSBodW1hbi1yZWFkYWJsZSBuYW1lIGZvciBhbiBleGlzdGluZyBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKlxuXHQgKiBAcGFyYW0gcHJvY2Vzc0luc3RhbmNlSWQgVGhlIElEIG9mIHRoZSBwcm9jZXNzIGluc3RhbmNlIHRvIHVwZGF0ZS5cblx0ICogQHBhcmFtIG5hbWUgVGhlIG5ldyBuYW1lIGZvciB0aGUgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgc2V0UHJvY2Vzc0luc3RhbmNlTmFtZShwcm9jZXNzSW5zdGFuY2VJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRCcG1GYWNhZGUuc2V0UHJvY2Vzc0luc3RhbmNlTmFtZShwcm9jZXNzSW5zdGFuY2VJZCwgbmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogVXBkYXRlcyB0aGUgYnVzaW5lc3Mga2V5IG9mIGFuIGV4aXN0aW5nIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBwcm9jZXNzSW5zdGFuY2VJZCBUaGUgSUQgb2YgdGhlIHByb2Nlc3MgaW5zdGFuY2UgdG8gdXBkYXRlLlxuXHQgKiBAcGFyYW0gYnVzaW5lc3NLZXkgVGhlIG5ldyBidXNpbmVzcyBrZXkuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIHVwZGF0ZUJ1c2luZXNzS2V5KHByb2Nlc3NJbnN0YW5jZUlkOiBzdHJpbmcsIGJ1c2luZXNzS2V5OiBzdHJpbmcpOiB2b2lkIHtcblx0XHRCcG1GYWNhZGUudXBkYXRlQnVzaW5lc3NLZXkocHJvY2Vzc0luc3RhbmNlSWQsIGJ1c2luZXNzS2V5KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGVzIHRoZSBidXNpbmVzcyBzdGF0dXMgb2YgYW4gZXhpc3RpbmcgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICpcblx0ICogQHBhcmFtIHByb2Nlc3NJbnN0YW5jZUlkIFRoZSBJRCBvZiB0aGUgcHJvY2VzcyBpbnN0YW5jZSB0byB1cGRhdGUuXG5cdCAqIEBwYXJhbSBidXNpbmVzc1N0YXR1cyBUaGUgbmV3IGJ1c2luZXNzIHN0YXR1cy5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgdXBkYXRlQnVzaW5lc3NTdGF0dXMocHJvY2Vzc0luc3RhbmNlSWQ6IHN0cmluZywgYnVzaW5lc3NTdGF0dXM6IHN0cmluZyk6IHZvaWQge1xuXHRcdEJwbUZhY2FkZS51cGRhdGVCdXNpbmVzc1N0YXR1cyhwcm9jZXNzSW5zdGFuY2VJZCwgYnVzaW5lc3NTdGF0dXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpYyB2YXJpYWJsZSBmcm9tIGEgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICpcblx0ICogQHBhcmFtIHByb2Nlc3NJbnN0YW5jZUlkIFRoZSBJRCBvZiB0aGUgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gcmV0cmlldmUuXG5cdCAqIEByZXR1cm5zIFRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUsIG9yIGBudWxsYCBpZiB0aGUgdmFyaWFibGUgZG9lcyBub3QgZXhpc3QuIFRoZSB0eXBlIGlzIGBhbnlgIGFzIGl0IGRlcGVuZHMgb24gdGhlIHN0b3JlZCB2YWx1ZS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgZ2V0VmFyaWFibGUocHJvY2Vzc0luc3RhbmNlSWQ6IHN0cmluZywgdmFyaWFibGVOYW1lOiBzdHJpbmcpOiBhbnkge1xuXHRcdHJldHVybiBCcG1GYWNhZGUuZ2V0VmFyaWFibGUocHJvY2Vzc0luc3RhbmNlSWQsIHZhcmlhYmxlTmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIGFsbCB2YXJpYWJsZXMgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICpcblx0ICogQHBhcmFtIHByb2Nlc3NJbnN0YW5jZUlkIFRoZSBJRCBvZiB0aGUgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgYWxsIHZhcmlhYmxlcyBmb3IgdGhlIHByb2Nlc3MgaW5zdGFuY2UsIHdoZXJlIGtleXMgYXJlIHZhcmlhYmxlIG5hbWVzIGFuZCB2YWx1ZXMgYXJlIHRoZSB2YXJpYWJsZSB2YWx1ZXMuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIGdldFZhcmlhYmxlcyhwcm9jZXNzSW5zdGFuY2VJZDogc3RyaW5nKTogYW55IHtcblx0XHRyZXR1cm4gQnBtRmFjYWRlLmdldFZhcmlhYmxlcyhwcm9jZXNzSW5zdGFuY2VJZCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyBvciB1cGRhdGVzIHRoZSB2YWx1ZSBvZiBhIHZhcmlhYmxlIGluIGEgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICpcblx0ICogQHBhcmFtIHByb2Nlc3NJbnN0YW5jZUlkIFRoZSBJRCBvZiB0aGUgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gc2V0LlxuXHQgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHZhcmlhYmxlLiBUaGUgdHlwZSBpcyBgYW55YCB0byBhY2NvbW1vZGF0ZSBkaWZmZXJlbnQgZGF0YSB0eXBlcy5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgc2V0VmFyaWFibGUocHJvY2Vzc0luc3RhbmNlSWQ6IHN0cmluZywgdmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcblx0XHRCcG1GYWNhZGUuc2V0VmFyaWFibGUocHJvY2Vzc0luc3RhbmNlSWQsIHZhcmlhYmxlTmFtZSwgdmFsdWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgYSB2YXJpYWJsZSBmcm9tIGEgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICpcblx0ICogQHBhcmFtIHByb2Nlc3NJbnN0YW5jZUlkIFRoZSBJRCBvZiB0aGUgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gcmVtb3ZlLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyByZW1vdmVWYXJpYWJsZShwcm9jZXNzSW5zdGFuY2VJZDogc3RyaW5nLCB2YXJpYWJsZU5hbWU6IHN0cmluZyk6IHZvaWQge1xuXHRcdEJwbUZhY2FkZS5yZW1vdmVWYXJpYWJsZShwcm9jZXNzSW5zdGFuY2VJZCwgdmFyaWFibGVOYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb3JyZWxhdGVzIGEgbWVzc2FnZSBldmVudCB3aXRoIGEgcnVubmluZyBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKlxuXHQgKiBAcGFyYW0gcHJvY2Vzc0luc3RhbmNlSWQgVGhlIElEIG9mIHRoZSBwcm9jZXNzIGluc3RhbmNlIHRvIGNvcnJlbGF0ZSB0aGUgbWVzc2FnZSB0by5cblx0ICogQHBhcmFtIG1lc3NhZ2VOYW1lIFRoZSBuYW1lIG9mIHRoZSBtZXNzYWdlIGV2ZW50IGRlZmluZWQgaW4gdGhlIEJQTU4gcHJvY2Vzcy5cblx0ICogQHBhcmFtIHZhcmlhYmxlcyBBIG1hcCBvZiB2YXJpYWJsZXMgKGBNYXA8c3RyaW5nLCBhbnk+YCkgdG8gcGFzcyBhbG9uZyB3aXRoIHRoZSBtZXNzYWdlIGV2ZW50LlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBjb3JyZWxhdGVNZXNzYWdlRXZlbnQocHJvY2Vzc0luc3RhbmNlSWQ6IHN0cmluZywgbWVzc2FnZU5hbWU6IHN0cmluZywgdmFyaWFibGVzOiBNYXA8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG5cdFx0QnBtRmFjYWRlLmNvcnJlbGF0ZU1lc3NhZ2VFdmVudChwcm9jZXNzSW5zdGFuY2VJZCwgbWVzc2FnZU5hbWUsIFZhbHVlcy5zdHJpbmdpZnlWYWx1ZXNNYXAodmFyaWFibGVzKSk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBjb250ZXh0IG9iamVjdCwgdHlwaWNhbGx5IHVzZWQgd2l0aGluIGFuIGV4ZWN1dGlvbiBsaXN0ZW5lciBvciBzZXJ2aWNlIHRhc2suXG5cdCAqXG5cdCAqIEByZXR1cm5zIEEgbmV3IGluc3RhbmNlIG9mIHRoZSBgRXhlY3V0aW9uQ29udGV4dGAgY29udGFpbmluZyBkZXRhaWxzIGFib3V0IHRoZSBjdXJyZW50IHByb2Nlc3MgZXhlY3V0aW9uIHBhdGguXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIGdldEV4ZWN1dGlvbkNvbnRleHQoKSB7XG5cdFx0cmV0dXJuIG5ldyBFeGVjdXRpb25Db250ZXh0KCk7XG5cdH1cbn1cblxuLyoqXG4gKiBFeGVjdXRpb25Db250ZXh0IG9iamVjdFxuICogKiBQcm92aWRlcyBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhbmQgY29udHJvbCBvdmVyIHRoZSBjdXJyZW50IHByb2Nlc3MgZXhlY3V0aW9uIHBhdGguXG4gKi9cbmNsYXNzIEV4ZWN1dGlvbkNvbnRleHQge1xuXG5cdHByaXZhdGUgZXhlY3V0aW9uOiBhbnk7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0dGhpcy5leGVjdXRpb24gPSBfX2NvbnRleHQuZ2V0KCdleGVjdXRpb24nKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVbmlxdWUgaWQgb2YgdGhpcyBwYXRoIG9mIGV4ZWN1dGlvbiB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgaGFuZGxlIHRvIHByb3ZpZGUgZXh0ZXJuYWwgc2lnbmFscyBiYWNrIGludG8gdGhlIGVuZ2luZSBhZnRlciB3YWl0IHN0YXRlcy5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIHVuaXF1ZSBJRCBvZiB0aGUgY3VycmVudCBleGVjdXRpb24uXG5cdCAqL1xuXHRwdWJsaWMgZ2V0SWQoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uZ2V0SWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZWZlcmVuY2UgdG8gdGhlIG92ZXJhbGwgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICogQHJldHVybnMgVGhlIElEIG9mIHRoZSBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKi9cblx0cHVibGljIGdldFByb2Nlc3NJbnN0YW5jZUlkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFByb2Nlc3NJbnN0YW5jZUlkKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlICdyb290JyBwcm9jZXNzIGluc3RhbmNlLiBXaGVuIHVzaW5nIGNhbGwgYWN0aXZpdHkgZm9yIGV4YW1wbGUsIHRoZSBwcm9jZXNzSW5zdGFuY2Ugc2V0IHdpbGwgbm90IGFsd2F5cyBiZSB0aGUgcm9vdC4gVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgdG9wbW9zdCBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgSUQgb2YgdGhlIHJvb3QgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICovXG5cdHB1YmxpYyBnZXRSb290UHJvY2Vzc0luc3RhbmNlSWQoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uZ2V0Um9vdFByb2Nlc3NJbnN0YW5jZUlkKCk7XG5cdH1cblxuXHQvKipcblx0ICogV2lsbCBjb250YWluIHRoZSBldmVudCBuYW1lIGluIGNhc2UgdGhpcyBleGVjdXRpb24gaXMgcGFzc2VkIGluIGZvciBhbiB7QGxpbmsgRXhlY3V0aW9uTGlzdGVuZXJ9LlxuXHQgKiBAcmV0dXJucyBUaGUgY3VycmVudCBldmVudCBuYW1lLCBvciBgbnVsbGAvZW1wdHkgc3RyaW5nIGlmIG5vdCBleGVjdXRpbmcgYW4gZXZlbnQgbGlzdGVuZXIuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RXZlbnROYW1lKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldEV2ZW50TmFtZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGN1cnJlbnQgZXZlbnQgKHR5cGljYWxseSB3aGVuIGV4ZWN1dGlvbiBhbiB7QGxpbmsgRXhlY3V0aW9uTGlzdGVuZXJ9KS5cblx0ICpcblx0ICogQHBhcmFtIGV2ZW50TmFtZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG5cdCAqL1xuXHRwdWJsaWMgc2V0RXZlbnROYW1lKGV2ZW50TmFtZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy5leGVjdXRpb24uc2V0RXZlbnROYW1lKGV2ZW50TmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGJ1c2luZXNzIGtleSBmb3IgdGhlIHByb2Nlc3MgaW5zdGFuY2UgdGhpcyBleGVjdXRpb24gaXMgYXNzb2NpYXRlZCB3aXRoLlxuXHQgKiBAcmV0dXJucyBUaGUgYnVzaW5lc3Mga2V5LlxuXHQgKi9cblx0cHVibGljIGdldFByb2Nlc3NJbnN0YW5jZUJ1c2luZXNzS2V5KCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFByb2Nlc3NJbnN0YW5jZUJ1c2luZXNzS2V5KCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGJ1c2luZXNzIHN0YXR1cyBmb3IgdGhlIHByb2Nlc3MgaW5zdGFuY2UgdGhpcyBleGVjdXRpb24gaXMgYXNzb2NpYXRlZCB3aXRoLlxuXHQgKiBAcmV0dXJucyBUaGUgYnVzaW5lc3Mgc3RhdHVzLlxuXHQgKi9cblx0cHVibGljIGdldFByb2Nlc3NJbnN0YW5jZUJ1c2luZXNzU3RhdHVzKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFByb2Nlc3NJbnN0YW5jZUJ1c2luZXNzU3RhdHVzKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHByb2Nlc3MgZGVmaW5pdGlvbiBrZXkgZm9yIHRoZSBwcm9jZXNzIGluc3RhbmNlIHRoaXMgZXhlY3V0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aC5cblx0ICogQHJldHVybnMgVGhlIHByb2Nlc3MgZGVmaW5pdGlvbiBJRC5cblx0ICovXG5cdHB1YmxpYyBnZXRQcm9jZXNzRGVmaW5pdGlvbklkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFByb2Nlc3NEZWZpbml0aW9uSWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJZiB0aGlzIGV4ZWN1dGlvbiBydW5zIGluIHRoZSBjb250ZXh0IG9mIGEgY2FzZSBhbmQgc3RhZ2UsIHRoaXMgbWV0aG9kIHJldHVybnMgaXQncyBjbG9zZXN0IHBhcmVudCBzdGFnZSBpbnN0YW5jZSBpZCAodGhlIHN0YWdlIHBsYW4gaXRlbSBpbnN0YW5jZSBpZCB0byBiZVxuXHQgKiBwcmVjaXNlKS5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIHN0YWdlIGluc3RhbmNlIGlkIHRoaXMgZXhlY3V0aW9uIGJlbG9uZ3MgdG8gb3IgYG51bGxgLCBpZiB0aGlzIGV4ZWN1dGlvbiBpcyBub3QgcGFydCBvZiBhIGNhc2UgYXQgYWxsIG9yIGlzIG5vdCBhIGNoaWxkIGVsZW1lbnQgb2YgYSBzdGFnZS5cblx0ICovXG5cdHB1YmxpYyBnZXRQcm9wYWdhdGVkU3RhZ2VJbnN0YW5jZUlkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFByb3BhZ2F0ZWRTdGFnZUluc3RhbmNlSWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBpZCBvZiB0aGUgcGFyZW50IG9mIHRoaXMgZXhlY3V0aW9uLiBJZiBudWxsLCB0aGUgZXhlY3V0aW9uIHJlcHJlc2VudHMgYSBwcm9jZXNzLWluc3RhbmNlLlxuXHQgKiBAcmV0dXJucyBUaGUgcGFyZW50IGV4ZWN1dGlvbiBJRCwgb3IgYG51bGxgLlxuXHQgKi9cblx0cHVibGljIGdldFBhcmVudElkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFBhcmVudElkKCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgaWQgb2YgdGhlIGNhbGxpbmcgZXhlY3V0aW9uLiBJZiBub3QgbnVsbCwgdGhlIGV4ZWN1dGlvbiBpcyBwYXJ0IG9mIGEgc3VicHJvY2Vzcy5cblx0ICogQHJldHVybnMgVGhlIHN1cGVyIGV4ZWN1dGlvbiBJRCwgb3IgYG51bGxgLlxuXHQgKi9cblx0cHVibGljIGdldFN1cGVyRXhlY3V0aW9uSWQoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uZ2V0U3VwZXJFeGVjdXRpb25JZCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGlkIG9mIHRoZSBjdXJyZW50IGFjdGl2aXR5LlxuXHQgKiBAcmV0dXJucyBUaGUgY3VycmVudCBhY3Rpdml0eSBJRC5cblx0ICovXG5cdHB1YmxpYyBnZXRDdXJyZW50QWN0aXZpdHlJZCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLmV4ZWN1dGlvbi5nZXRDdXJyZW50QWN0aXZpdHlJZCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHRlbmFudCBpZCwgaWYgYW55IGlzIHNldCBiZWZvcmUgb24gdGhlIHByb2Nlc3MgZGVmaW5pdGlvbiBvciBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKiBAcmV0dXJucyBUaGUgdGVuYW50IElELCBvciBgbnVsbGAvZW1wdHkgc3RyaW5nLlxuXHQgKi9cblx0cHVibGljIGdldFRlbmFudElkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFRlbmFudElkKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIEJQTU4gZWxlbWVudCB3aGVyZSB0aGUgZXhlY3V0aW9uIGN1cnJlbnRseSBpcyBhdC5cblx0ICogQHJldHVybnMgVGhlIGN1cnJlbnQgZmxvdyBlbGVtZW50IG9iamVjdCAodHlwZSBpcyBKYXZhIG9iamVjdCkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q3VycmVudEZsb3dFbGVtZW50KCk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldEN1cnJlbnRGbG93RWxlbWVudCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZSB0aGUgY3VycmVudCBCUE1OIGVsZW1lbnQgdGhlIGV4ZWN1dGlvbiBpcyBhdC5cblx0ICogQHBhcmFtIGZsb3dFbGVtZW50IFRoZSBuZXcgZmxvdyBlbGVtZW50IG9iamVjdCAoSmF2YSB0eXBlKS5cblx0ICovXG5cdHB1YmxpYyBzZXRDdXJyZW50Rmxvd0VsZW1lbnQoZmxvd0VsZW1lbnQ6IGFueSk6IHZvaWQge1xuXHRcdHRoaXMuZXhlY3V0aW9uLnNldEN1cnJlbnRGbG93RWxlbWVudChmbG93RWxlbWVudCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUge0BsaW5rIEZsb3dhYmxlTGlzdGVuZXJ9IGluc3RhbmNlIG1hdGNoaW5nIGFuIHtAbGluayBFeGVjdXRpb25MaXN0ZW5lcn0gaWYgY3VycmVudGx5IGFuIGV4ZWN1dGlvbiBsaXN0ZW5lciBpcyBiZWluZyBleGVjdXRpb24uIFJldHVybnMgbnVsbCBvdGhlcndpc2UuXG5cdCAqIEByZXR1cm5zIFRoZSBjdXJyZW50IEZsb3dhYmxlIExpc3RlbmVyIG9iamVjdCAoSmF2YSB0eXBlKSwgb3IgYG51bGxgLlxuXHQgKi9cblx0cHVibGljIGdldEN1cnJlbnRGbG93YWJsZUxpc3RlbmVyKCk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldEN1cnJlbnRGbG93YWJsZUxpc3RlbmVyKCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbGVkIHdoZW4gYW4ge0BsaW5rIEV4ZWN1dGlvbkxpc3RlbmVyfSBpcyBiZWluZyBleGVjdXRlZC5cblx0ICogQHBhcmFtIGN1cnJlbnRMaXN0ZW5lciBUaGUgY3VycmVudCBsaXN0ZW5lciBvYmplY3QgKEphdmEgdHlwZSkuXG5cdCAqL1xuXHRwdWJsaWMgc2V0Q3VycmVudEZsb3dhYmxlTGlzdGVuZXIoY3VycmVudExpc3RlbmVyOiBhbnkpOiB2b2lkIHtcblx0XHR0aGlzLmV4ZWN1dGlvbi5zZXRDdXJyZW50Rmxvd2FibGVMaXN0ZW5lcihjdXJyZW50TGlzdGVuZXIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSBhIHNuYXBzaG90IHJlYWQgb25seSBkZWxlZ2F0ZSBleGVjdXRpb24gb2YgdGhpcyBkZWxlZ2F0ZSBleGVjdXRpb24uXG5cdCAqXG5cdCAqIEByZXR1cm5zIEEge0BsaW5rIFJlYWRPbmx5RGVsZWdhdGVFeGVjdXRpb259IG9iamVjdCAoSmF2YSB0eXBlKS5cblx0ICovXG5cdHB1YmxpYyBzbmFwc2hvdFJlYWRPbmx5KCk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLnNuYXBzaG90UmVhZE9ubHkoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiByZXR1cm5zIHRoZSBwYXJlbnQgb2YgdGhpcyBleGVjdXRpb24sIG9yIG51bGwgaWYgdGhlcmUgbm8gcGFyZW50LlxuXHQgKiBAcmV0dXJucyBUaGUgcGFyZW50IGV4ZWN1dGlvbiBvYmplY3QgKEphdmEgdHlwZSksIG9yIGBudWxsYC5cblx0ICovXG5cdHB1YmxpYyBnZXRQYXJlbnQoKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uZ2V0UGFyZW50KCk7XG5cdH1cblxuXHQvKipcblx0ICogcmV0dXJucyB0aGUgbGlzdCBvZiBleGVjdXRpb24gb2Ygd2hpY2ggdGhpcyBleGVjdXRpb24gdGhlIHBhcmVudCBvZi5cblx0ICogQHJldHVybnMgQW4gYXJyYXkgb2YgY2hpbGQgZXhlY3V0aW9uIG9iamVjdHMgKEphdmEgdHlwZSkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RXhlY3V0aW9ucygpOiBhbnlbXSB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldEV4ZWN1dGlvbnMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBtYWtlcyB0aGlzIGV4ZWN1dGlvbiBhY3RpdmUgb3IgaW5hY3RpdmUuXG5cdCAqIEBwYXJhbSBpc0FjdGl2ZSBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBleGVjdXRpb24gc2hvdWxkIGJlIGFjdGl2ZS5cblx0ICovXG5cdHB1YmxpYyBzZXRBY3RpdmUoaXNBY3RpdmU6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHR0aGlzLmV4ZWN1dGlvbi5zZXRBY3RpdmUoaXNBY3RpdmUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIHJldHVybnMgd2hldGhlciB0aGlzIGV4ZWN1dGlvbiBpcyBjdXJyZW50bHkgYWN0aXZlLlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgYWN0aXZlLCBgZmFsc2VgIG90aGVyd2lzZS5cblx0ICovXG5cdHB1YmxpYyBpc0FjdGl2ZSgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uaXNBY3RpdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiByZXR1cm5zIHdoZXRoZXIgdGhpcyBleGVjdXRpb24gaGFzIGVuZGVkIG9yIG5vdC5cblx0ICogQHJldHVybnMgYHRydWVgIGlmIGVuZGVkLCBgZmFsc2VgIG90aGVyd2lzZS5cblx0ICovXG5cdHB1YmxpYyBpc0VuZGVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmV4ZWN1dGlvbi5pc0VuZGVkKCk7XG5cdH1cblxuXHQvKipcblx0ICogY2hhbmdlcyB0aGUgY29uY3VycmVudCBpbmRpY2F0b3Igb24gdGhpcyBleGVjdXRpb24uXG5cdCAqIEBwYXJhbSBpc0NvbmN1cnJlbnQgQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZXhlY3V0aW9uIHNob3VsZCBiZSBjb25jdXJyZW50LlxuXHQgKi9cblx0cHVibGljIHNldENvbmN1cnJlbnQoaXNDb25jdXJyZW50OiBib29sZWFuKTogdm9pZCB7XG5cdFx0dGhpcy5leGVjdXRpb24uc2V0Q29uY3VycmVudChpc0NvbmN1cnJlbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIHJldHVybnMgd2hldGhlciB0aGlzIGV4ZWN1dGlvbiBpcyBjb25jdXJyZW50IG9yIG5vdC5cblx0ICogQHJldHVybnMgYHRydWVgIGlmIGNvbmN1cnJlbnQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuXHQgKi9cblx0cHVibGljIGlzQ29uY3VycmVudCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uaXNDb25jdXJyZW50KCk7XG5cdH1cblxuXHQvKipcblx0ICogcmV0dXJucyB3aGV0aGVyIHRoaXMgZXhlY3V0aW9uIGlzIGEgcHJvY2VzcyBpbnN0YW5jZSBvciBub3QuXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiBpdCdzIGEgcHJvY2VzcyBpbnN0YW5jZSwgYGZhbHNlYCBvdGhlcndpc2UuXG5cdCAqL1xuXHRwdWJsaWMgaXNQcm9jZXNzSW5zdGFuY2VUeXBlKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmV4ZWN1dGlvbi5pc1Byb2Nlc3NJbnN0YW5jZVR5cGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbmFjdGl2YXRlcyB0aGlzIGV4ZWN1dGlvbi4gVGhpcyBpcyB1c2VmdWwgZm9yIGV4YW1wbGUgaW4gYSBqb2luOiB0aGUgZXhlY3V0aW9uIHN0aWxsIGV4aXN0cywgYnV0IGl0IGlzIG5vdCBsb25nZXIgYWN0aXZlLlxuXHQgKi9cblx0cHVibGljIGluYWN0aXZhdGUoKTogdm9pZCB7XG5cdFx0dGhpcy5leGVjdXRpb24uaW5hY3RpdmF0ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgd2hldGhlciB0aGlzIGV4ZWN1dGlvbiBpcyBhIHNjb3BlLlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgaXQgaXMgYSBzY29wZSwgYGZhbHNlYCBvdGhlcndpc2UuXG5cdCAqL1xuXHRwdWJsaWMgaXNTY29wZSgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uaXNTY29wZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZXMgd2hldGhlciB0aGlzIGV4ZWN1dGlvbiBpcyBhIHNjb3BlIG9yIG5vdC5cblx0ICogQHBhcmFtIGlzU2NvcGUgQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZXhlY3V0aW9uIHNob3VsZCBiZSBhIHNjb3BlLlxuXHQgKi9cblx0cHVibGljIHNldFNjb3BlKGlzU2NvcGU6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHR0aGlzLmV4ZWN1dGlvbi5zZXRTY29wZShpc1Njb3BlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBleGVjdXRpb24gaXMgdGhlIHJvb3Qgb2YgYSBtdWx0aSBpbnN0YW5jZSBleGVjdXRpb24uXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiBpdCdzIGEgbXVsdGkgaW5zdGFuY2Ugcm9vdCwgYGZhbHNlYCBvdGhlcndpc2UuXG5cdCAqL1xuXHRwdWJsaWMgaXNNdWx0aUluc3RhbmNlUm9vdCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uaXNNdWx0aUluc3RhbmNlUm9vdCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZXMgd2hldGhlciB0aGlzIGV4ZWN1dGlvbiBpcyBhIG11bHRpIGluc3RhbmNlIHJvb3Qgb3Igbm90LlxuXHQgKiBAcGFyYW0gaXNNdWx0aUluc3RhbmNlUm9vdCBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBleGVjdXRpb24gaXMgdGhlIHJvb3Qgb2YgYSBtdWx0aS1pbnN0YW5jZSBleGVjdXRpb24uXG5cdCAqL1xuXHRwdWJsaWMgc2V0TXVsdGlJbnN0YW5jZVJvb3QoaXNNdWx0aUluc3RhbmNlUm9vdDogYm9vbGVhbik6IHZvaWQge1xuXHRcdHRoaXMuZXhlY3V0aW9uLnNldE11bHRpSW5zdGFuY2VSb290KGlzTXVsdGlJbnN0YW5jZVJvb3QpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYWxsIHZhcmlhYmxlcy4gVGhpcyB3aWxsIGluY2x1ZGUgYWxsIHZhcmlhYmxlcyBvZiBwYXJlbnQgc2NvcGVzIHRvby5cblx0ICogQHJldHVybnMgQSBNYXAgb2YgdmFyaWFibGUgbmFtZXMgKGBzdHJpbmdgKSB0byB2YXJpYWJsZSB2YWx1ZXMgKGBhbnlgKS5cblx0ICovXG5cdHB1YmxpYyBnZXRWYXJpYWJsZXMoKTogTWFwPHN0cmluZywgYW55PiB7XG5cdFx0Y29uc3QgdmFyaWFibGVzID0gdGhpcy5leGVjdXRpb24uZ2V0VmFyaWFibGVzKCk7XG5cdFx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdmFyaWFibGVzKSB7XG5cdFx0XHR2YXJpYWJsZXMuc2V0KGtleSwgVmFsdWVzLnBhcnNlVmFsdWUodmFsdWUpKTtcblx0XHR9XG5cdFx0cmV0dXJuIHZhcmlhYmxlcztcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGFsbCB2YXJpYWJsZXMsIGFzIGluc3RhbmNlcyBvZiB0aGUge0BsaW5rIFZhcmlhYmxlSW5zdGFuY2V9IGludGVyZmFjZSwgd2hpY2ggZ2l2ZXMgbW9yZSBpbmZvcm1hdGlvbiB0aGFuIG9ubHkgdGhlIHZhbHVlICh0eXBlLCBleGVjdXRpb24gaWQsIGV0Yy4pXG5cdCAqIEByZXR1cm5zIEEgTWFwIG9mIHZhcmlhYmxlIG5hbWVzIChgc3RyaW5nYCkgdG8ge0BsaW5rIFZhcmlhYmxlSW5zdGFuY2V9IG9iamVjdHMgKEphdmEgdHlwZSkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VmFyaWFibGVJbnN0YW5jZXMoKTogTWFwPHN0cmluZywgYW55PiB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFZhcmlhYmxlSW5zdGFuY2VzKCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgdmFyaWFibGUgbG9jYWwgdG8gdGhpcyBzY29wZSBvbmx5LiBTbywgaW4gY29udHJhcnkgdG8ge0BsaW5rICNnZXRWYXJpYWJsZXMoKX0sIHRoZSB2YXJpYWJsZXMgZnJvbSB0aGUgcGFyZW50IHNjb3BlIHdvbid0IGJlIHJldHVybmVkLlxuXHQgKiBAcmV0dXJucyBBIE1hcCBvZiB2YXJpYWJsZSBuYW1lcyAoYHN0cmluZ2ApIHRvIGxvY2FsIHZhcmlhYmxlIHZhbHVlcyAoYGFueWApLlxuXHQgKi9cblx0cHVibGljIGdldFZhcmlhYmxlc0xvY2FsKCk6IE1hcDxzdHJpbmcsIGFueT4ge1xuXHRcdGNvbnN0IHZhcmlhYmxlc0xvY2FsID0gdGhpcy5leGVjdXRpb24uZ2V0VmFyaWFibGVzTG9jYWwoKTtcblx0XHRmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB2YXJpYWJsZXNMb2NhbCkge1xuXHRcdFx0dmFyaWFibGVzTG9jYWwuc2V0KGtleSwgVmFsdWVzLnBhcnNlVmFsdWUodmFsdWUpKTtcblx0XHR9XG5cdFx0cmV0dXJuIHZhcmlhYmxlc0xvY2FsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHZhcmlhYmxlcyBsb2NhbCB0byB0aGlzIHNjb3BlIGFzIGluc3RhbmNlcyBvZiB0aGUge0BsaW5rIFZhcmlhYmxlSW5zdGFuY2V9IGludGVyZmFjZSwgd2hpY2ggcHJvdmlkZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmFyaWFibGUuXG5cdCAqIEByZXR1cm5zIEEgTWFwIG9mIHZhcmlhYmxlIG5hbWVzIChgc3RyaW5nYCkgdG8gbG9jYWwge0BsaW5rIFZhcmlhYmxlSW5zdGFuY2V9IG9iamVjdHMgKEphdmEgdHlwZSkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VmFyaWFibGVJbnN0YW5jZXNMb2NhbCgpOiBNYXA8c3RyaW5nLCBhbnk+IHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uZ2V0VmFyaWFibGVJbnN0YW5jZXNMb2NhbCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHZhcmlhYmxlIHZhbHVlIGZvciBvbmUgc3BlY2lmaWMgdmFyaWFibGUuIFdpbGwgbG9vayBpbiBwYXJlbnQgc2NvcGVzIHdoZW4gdGhlIHZhcmlhYmxlIGRvZXMgbm90IGV4aXN0IG9uIHRoaXMgcGFydGljdWxhciBzY29wZS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gcmV0cmlldmUuXG5cdCAqIEByZXR1cm5zIFRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgKGBhbnlgKSwgb3IgYG51bGxgIGlmIG5vdCBmb3VuZC5cblx0ICovXG5cdHB1YmxpYyBnZXRWYXJpYWJsZSh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IGFueSB7XG5cdFx0cmV0dXJuIFZhbHVlcy5wYXJzZVZhbHVlKHRoaXMuZXhlY3V0aW9uLmdldFZhcmlhYmxlKHZhcmlhYmxlTmFtZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNpbWlsYXIgdG8ge0BsaW5rICNnZXRWYXJpYWJsZShTdHJpbmcpfSwgYnV0IHJldHVybnMgYSB7QGxpbmsgVmFyaWFibGVJbnN0YW5jZX0gaW5zdGFuY2UsIHdoaWNoIGNvbnRhaW5zIG1vcmUgaW5mb3JtYXRpb24gdGhhbiBqdXN0IHRoZSB2YWx1ZS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gcmV0cmlldmUuXG5cdCAqIEByZXR1cm5zIFRoZSB7QGxpbmsgVmFyaWFibGVJbnN0YW5jZX0gb2JqZWN0IChKYXZhIHR5cGUpLCBvciBgbnVsbGAuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VmFyaWFibGVJbnN0YW5jZSh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFZhcmlhYmxlSW5zdGFuY2UodmFyaWFibGVOYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIHNwZWNpZmljIHZhcmlhYmxlIGFuZCBvbmx5IGNoZWNrcyB0aGlzIHNjb3BlIGFuZCBub3QgYW55IHBhcmVudCBzY29wZS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgbG9jYWwgdmFyaWFibGUgdG8gcmV0cmlldmUuXG5cdCAqIEByZXR1cm5zIFRoZSB2YWx1ZSBvZiB0aGUgbG9jYWwgdmFyaWFibGUgKGBhbnlgKSwgb3IgYG51bGxgIGlmIG5vdCBmb3VuZCBsb2NhbGx5LlxuXHQgKi9cblx0cHVibGljIGdldFZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lOiBzdHJpbmcpOiBhbnkge1xuXHRcdHJldHVybiBWYWx1ZXMucGFyc2VWYWx1ZSh0aGlzLmV4ZWN1dGlvbi5nZXRWYXJpYWJsZUxvY2FsKHZhcmlhYmxlTmFtZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNpbWlsYXIgdG8ge0BsaW5rICNnZXRWYXJpYWJsZUxvY2FsKFN0cmluZyl9LCBidXQgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgVmFyaWFibGVJbnN0YW5jZX0sIHdoaWNoIGhhcyBzb21lIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYmV5b25kIHRoZSB2YWx1ZS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgbG9jYWwgdmFyaWFibGUgdG8gcmV0cmlldmUuXG5cdCAqIEByZXR1cm5zIFRoZSBsb2NhbCB7QGxpbmsgVmFyaWFibGVJbnN0YW5jZX0gb2JqZWN0IChKYXZhIHR5cGUpLCBvciBgbnVsbGAuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VmFyaWFibGVJbnN0YW5jZUxvY2FsKHZhcmlhYmxlTmFtZTogc3RyaW5nKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uZ2V0VmFyaWFibGVJbnN0YW5jZUxvY2FsKHZhcmlhYmxlTmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhbGwgdGhlIG5hbWVzIG9mIHRoZSB2YXJpYWJsZXMgZm9yIHRoaXMgc2NvcGUgYW5kIGFsbCBwYXJlbnQgc2NvcGVzLlxuXHQgKiBAcmV0dXJucyBBIFNldCBvZiBhbGwgdmFyaWFibGUgbmFtZXMgKGBzdHJpbmdgKS5cblx0ICovXG5cdHB1YmxpYyBnZXRWYXJpYWJsZU5hbWVzKCk6IFNldDxzdHJpbmc+IHtcblx0XHRjb25zdCB2YXJpYWJsZU5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cdFx0Zm9yIChjb25zdCBuZXh0IG9mIHRoaXMuZXhlY3V0aW9uLmdldFZhcmlhYmxlTmFtZXMoKS50b0FycmF5KCkpIHtcblx0XHRcdHZhcmlhYmxlTmFtZXMuYWRkKG5leHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gdmFyaWFibGVOYW1lcztcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGFsbCB0aGUgbmFtZXMgb2YgdGhlIHZhcmlhYmxlcyBmb3IgdGhpcyBzY29wZSAobm8gcGFyZW50IHNjb3BlcykuXG5cdCAqIEByZXR1cm5zIEEgU2V0IG9mIGxvY2FsIHZhcmlhYmxlIG5hbWVzIChgc3RyaW5nYCkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VmFyaWFibGVOYW1lc0xvY2FsKCk6IFNldDxzdHJpbmc+IHtcblx0XHRjb25zdCB2YXJpYWJsZU5hbWVzTG9jYWwgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0XHRmb3IgKGNvbnN0IG5leHQgb2YgdGhpcy5leGVjdXRpb24uZ2V0VmFyaWFibGVOYW1lc0xvY2FsKCkudG9BcnJheSgpKSB7XG5cdFx0XHR2YXJpYWJsZU5hbWVzTG9jYWwuYWRkKG5leHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gdmFyaWFibGVOYW1lc0xvY2FsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIHZhcmlhYmxlIHdpdGggdGhlIHByb3ZpZGVkIG5hbWUgdG8gdGhlIHByb3ZpZGVkIHZhbHVlLiBJdCBjaGVja3MgcGFyZW50IHNjb3BlcyBmb3IgYW4gZXhpc3RpbmcgdmFyaWFibGUgYmVmb3JlIHNldHRpbmcgb24gdGhlIGN1cnJlbnQgc2NvcGUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIGJlIHNldC5cblx0ICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgdG8gYmUgc2V0IChgYW55YCkuXG5cdCAqL1xuXHRwdWJsaWMgc2V0VmFyaWFibGUodmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcblx0XHR0aGlzLmV4ZWN1dGlvbi5zZXRWYXJpYWJsZSh2YXJpYWJsZU5hbWUsIFZhbHVlcy5zdHJpbmdpZnlWYWx1ZSh2YWx1ZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNpbWlsYXIgdG8ge0BsaW5rICNzZXRWYXJpYWJsZShTdHJpbmcsIE9iamVjdCl9LCBidXQgdGhlIHZhcmlhYmxlIGlzIHNldCB0byB0aGlzIHNjb3BlIHNwZWNpZmljYWxseSAobG9jYWwgdmFyaWFibGUpLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0byBiZSBzZXQgbG9jYWxseS5cblx0ICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgdG8gYmUgc2V0IChgYW55YCkuXG5cdCAqIEByZXR1cm5zIFRoZSBvbGQgdmFsdWUgb2YgdGhlIGxvY2FsIHZhcmlhYmxlIChKYXZhIHR5cGUpLCBvciBgbnVsbGAuXG5cdCAqL1xuXHRwdWJsaWMgc2V0VmFyaWFibGVMb2NhbCh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLnNldFZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lLCBWYWx1ZXMuc3RyaW5naWZ5VmFsdWUodmFsdWUpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBwcm92aWRlZCB2YXJpYWJsZXMgdG8gdGhlIHZhcmlhYmxlIHNjb3BlLCB1c2luZyB0aGUgZGVmYXVsdCBzY29waW5nIGFsZ29yaXRobS5cblx0ICogQHBhcmFtIHZhcmlhYmxlcyBBIG1hcCBvZiBrZXlzIChgc3RyaW5nYCkgYW5kIHZhbHVlcyAoYGFueWApIGZvciB0aGUgdmFyaWFibGVzIHRvIGJlIHNldC5cblx0ICovXG5cdHB1YmxpYyBzZXRWYXJpYWJsZXModmFyaWFibGVzOiBNYXA8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG5cdFx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdmFyaWFibGVzKSB7XG5cdFx0XHR2YXJpYWJsZXMuc2V0KGtleSwgVmFsdWVzLnN0cmluZ2lmeVZhbHVlKHZhbHVlKSk7XG5cdFx0fVxuXHRcdHRoaXMuZXhlY3V0aW9uLnNldFZhcmlhYmxlcyh2YXJpYWJsZXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNpbWlsYXIgdG8ge0BsaW5rICNzZXRWYXJpYWJsZXMoTWFwKX0sIGJ1dCB0aGUgdmFyaWFibGVzIGFyZSBzZXQgb24gdGhpcyBzY29wZSBzcGVjaWZpY2FsbHkgKGxvY2FsIHZhcmlhYmxlcykuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZXMgQSBtYXAgb2Yga2V5cyAoYHN0cmluZ2ApIGFuZCB2YWx1ZXMgKGBhbnlgKSBmb3IgdGhlIGxvY2FsIHZhcmlhYmxlcyB0byBiZSBzZXQuXG5cdCAqL1xuXHRwdWJsaWMgc2V0VmFyaWFibGVzTG9jYWwodmFyaWFibGVzOiBNYXA8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG5cdFx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdmFyaWFibGVzKSB7XG5cdFx0XHR2YXJpYWJsZXMuc2V0KGtleSwgVmFsdWVzLnN0cmluZ2lmeVZhbHVlKHZhbHVlKSk7XG5cdFx0fVxuXHRcdHRoaXMuZXhlY3V0aW9uLnNldFZhcmlhYmxlc0xvY2FsKHZhcmlhYmxlcyk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB3aGV0aGVyIHRoaXMgc2NvcGUgb3IgYW55IHBhcmVudCBzY29wZSBoYXMgdmFyaWFibGVzLlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdmFyaWFibGVzIGV4aXN0IGluIHNjb3BlIGhpZXJhcmNoeSwgYGZhbHNlYCBvdGhlcndpc2UuXG5cdCAqL1xuXHRwdWJsaWMgaGFzVmFyaWFibGVzKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmV4ZWN1dGlvbi5oYXNWYXJpYWJsZXMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzY29wZSBoYXMgdmFyaWFibGVzLlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgbG9jYWwgdmFyaWFibGVzIGV4aXN0LCBgZmFsc2VgIG90aGVyd2lzZS5cblx0ICovXG5cdHB1YmxpYyBoYXNWYXJpYWJsZXNMb2NhbCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uaGFzVmFyaWFibGVzTG9jYWwoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzY29wZSBvciBhbnkgcGFyZW50IHNjb3BlIGhhcyBhIHNwZWNpZmljIHZhcmlhYmxlLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0byBjaGVjay5cblx0ICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB2YXJpYWJsZSBpcyBmb3VuZCBpbiB0aGUgc2NvcGUgaGllcmFyY2h5LCBgZmFsc2VgIG90aGVyd2lzZS5cblx0ICovXG5cdHB1YmxpYyBoYXNWYXJpYWJsZSh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmV4ZWN1dGlvbi5oYXNWYXJpYWJsZSh2YXJpYWJsZU5hbWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgd2hldGhlciB0aGlzIHNjb3BlIGhhcyBhIHNwZWNpZmljIHZhcmlhYmxlLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lIFRoZSBuYW1lIG9mIHRoZSBsb2NhbCB2YXJpYWJsZSB0byBjaGVjay5cblx0ICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB2YXJpYWJsZSBpcyBmb3VuZCBsb2NhbGx5LCBgZmFsc2VgIG90aGVyd2lzZS5cblx0ICovXG5cdHB1YmxpYyBoYXNWYXJpYWJsZUxvY2FsKHZhcmlhYmxlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmhhc1ZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIHRoZSB2YXJpYWJsZSBmcm9tIHRoZSBwcm9jZXNzIGluc3RhbmNlIGFuZCBjcmVhdGVzIGEgbmV3IEhpc3RvcmljVmFyaWFibGVVcGRhdGUuIFNlYXJjaGVzIHVwIHRoZSBzY29wZSBoaWVyYXJjaHkuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIHJlbW92ZS5cblx0ICovXG5cdHB1YmxpYyByZW1vdmVWYXJpYWJsZSh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMuZXhlY3V0aW9uLnJlbW92ZVZhcmlhYmxlKHZhcmlhYmxlTmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyB0aGUgbG9jYWwgdmFyaWFibGUgYW5kIGNyZWF0ZXMgYSBuZXcgSGlzdG9yaWNWYXJpYWJsZVVwZGF0ZS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgbG9jYWwgdmFyaWFibGUgdG8gcmVtb3ZlLlxuXHQgKi9cblx0cHVibGljIHJlbW92ZVZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLmV4ZWN1dGlvbi5yZW1vdmVWYXJpYWJsZUxvY2FsKHZhcmlhYmxlTmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyB0aGUgdmFyaWFibGVzIGFuZCBjcmVhdGVzIGEgbmV3IEhpc3RvcmljVmFyaWFibGVVcGRhdGUgZm9yIGVhY2ggb2YgdGhlbS4gU2VhcmNoZXMgdXAgdGhlIHNjb3BlIGhpZXJhcmNoeS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZXMgQW4gYXJyYXkgb2YgdmFyaWFibGUgbmFtZXMgKGBzdHJpbmdbXWApIHRvIHJlbW92ZS5cblx0ICovXG5cdHB1YmxpYyByZW1vdmVWYXJpYWJsZXModmFyaWFibGVOYW1lczogc3RyaW5nW10pOiB2b2lkIHtcblx0XHR0aGlzLmV4ZWN1dGlvbi5yZW1vdmVWYXJpYWJsZXModmFyaWFibGVOYW1lcyk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyB0aGUgbG9jYWwgdmFyaWFibGVzIGFuZCBjcmVhdGVzIGEgbmV3IEhpc3RvcmljVmFyaWFibGVVcGRhdGUgZm9yIGVhY2ggb2YgdGhlbS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZXMgQW4gYXJyYXkgb2YgbG9jYWwgdmFyaWFibGUgbmFtZXMgKGBzdHJpbmdbXWApIHRvIHJlbW92ZS5cblx0ICovXG5cdHB1YmxpYyByZW1vdmVWYXJpYWJsZXNMb2NhbCh2YXJpYWJsZU5hbWVzOiBzdHJpbmdbXSk6IHZvaWQge1xuXHRcdHRoaXMuZXhlY3V0aW9uLnJlbW92ZVZhcmlhYmxlc0xvY2FsKHZhcmlhYmxlTmFtZXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgYSB0cmFuc2llbnQgdmFyaWFibGUgdXNpbmcgdGhlIGRlZmF1bHQgc2NvcGluZyBtZWNoYW5pc20gKHVwIHRoZSBoaWVyYXJjaHkpLiBUcmFuc2llbnQgdmFyaWFibGVzIGhhdmUgbm8gaGlzdG9yeSBhbmQgYXJlIGNsZWFyZWQgYXQgd2FpdCBzdGF0ZXMuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHRyYW5zaWVudCB2YXJpYWJsZS5cblx0ICogQHBhcmFtIHZhcmlhYmxlVmFsdWUgVGhlIHZhbHVlIG9mIHRoZSB0cmFuc2llbnQgdmFyaWFibGUgKGBhbnlgKS5cblx0ICovXG5cdHB1YmxpYyBzZXRUcmFuc2llbnRWYXJpYWJsZSh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFyaWFibGVWYWx1ZTogYW55KTogdm9pZCB7XG5cdFx0dGhpcy5leGVjdXRpb24uc2V0VHJhbnNpZW50VmFyaWFibGUodmFyaWFibGVOYW1lLCBWYWx1ZXMuc3RyaW5naWZ5VmFsdWUodmFyaWFibGVWYWx1ZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgYSBsb2NhbCB0cmFuc2llbnQgdmFyaWFibGUuIFRyYW5zaWVudCB2YXJpYWJsZXMgaGF2ZSBubyBoaXN0b3J5IGFuZCBhcmUgY2xlYXJlZCBhdCB3YWl0IHN0YXRlcy5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgbG9jYWwgdHJhbnNpZW50IHZhcmlhYmxlLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVWYWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGxvY2FsIHRyYW5zaWVudCB2YXJpYWJsZSAoYGFueWApLlxuXHQgKi9cblx0cHVibGljIHNldFRyYW5zaWVudFZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhcmlhYmxlVmFsdWU6IGFueSk6IHZvaWQge1xuXHRcdHRoaXMuZXhlY3V0aW9uLnNldFRyYW5zaWVudFZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lLCBWYWx1ZXMuc3RyaW5naWZ5VmFsdWUodmFyaWFibGVWYWx1ZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgbXVsdGlwbGUgdHJhbnNpZW50IHZhcmlhYmxlcyB1c2luZyB0aGUgZGVmYXVsdCBzY29waW5nIG1lY2hhbmlzbSAodXAgdGhlIGhpZXJhcmNoeSkuXG5cdCAqIEBwYXJhbSB0cmFuc2llbnRWYXJpYWJsZXMgQSBtYXAgb2Yga2V5cyAoYHN0cmluZ2ApIGFuZCB2YWx1ZXMgKGBhbnlgKSBmb3IgdGhlIHRyYW5zaWVudCB2YXJpYWJsZXMgdG8gYmUgc2V0LlxuXHQgKi9cblx0cHVibGljIHNldFRyYW5zaWVudFZhcmlhYmxlcyh0cmFuc2llbnRWYXJpYWJsZXM6IE1hcDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcblx0XHRmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0cmFuc2llbnRWYXJpYWJsZXMpIHtcblx0XHRcdHRyYW5zaWVudFZhcmlhYmxlcy5zZXQoa2V5LCBWYWx1ZXMuc3RyaW5naWZ5VmFsdWUodmFsdWUpKTtcblx0XHR9XG5cdFx0dGhpcy5leGVjdXRpb24uc2V0VHJhbnNpZW50VmFyaWFibGVzKHRyYW5zaWVudFZhcmlhYmxlcyk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiBhIHRyYW5zaWVudCB2YXJpYWJsZSwgc2VhcmNoaW5nIHVwIHRoZSBwYXJlbnQgc2NvcGVzLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lIFRoZSBuYW1lIG9mIHRoZSB0cmFuc2llbnQgdmFyaWFibGUgdG8gcmV0cmlldmUuXG5cdCAqIEByZXR1cm5zIFRoZSB2YWx1ZSBvZiB0aGUgdHJhbnNpZW50IHZhcmlhYmxlIChgYW55YCksIG9yIGBudWxsYCBpZiBub3QgZm91bmQuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VHJhbnNpZW50VmFyaWFibGUodmFyaWFibGVOYW1lOiBzdHJpbmcpOiBhbnkge1xuXHRcdHJldHVybiBWYWx1ZXMucGFyc2VWYWx1ZSh0aGlzLmV4ZWN1dGlvbi5nZXRUcmFuc2llbnRWYXJpYWJsZSh2YXJpYWJsZU5hbWUpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgYWxsIHRyYW5zaWVudCB2YXJpYWJsZXMgaW4gdGhlIGN1cnJlbnQgc2NvcGUgaGllcmFyY2h5LlxuXHQgKiBAcmV0dXJucyBBIE1hcCBvZiB0cmFuc2llbnQgdmFyaWFibGUgbmFtZXMgKGBzdHJpbmdgKSB0byB2YWx1ZXMgKGBhbnlgKS5cblx0ICovXG5cdHB1YmxpYyBnZXRUcmFuc2llbnRWYXJpYWJsZXMoKTogTWFwPHN0cmluZywgYW55PiB7XG5cdFx0Y29uc3QgdHJhbnNpZW50VmFyaWFibGVzID0gdGhpcy5leGVjdXRpb24uZ2V0VHJhbnNpZW50VmFyaWFibGVzKCk7XG5cdFx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdHJhbnNpZW50VmFyaWFibGVzKSB7XG5cdFx0XHR0cmFuc2llbnRWYXJpYWJsZXMuc2V0KGtleSwgVmFsdWVzLnBhcnNlVmFsdWUodmFsdWUpKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRyYW5zaWVudFZhcmlhYmxlcztcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIG11bHRpcGxlIGxvY2FsIHRyYW5zaWVudCB2YXJpYWJsZXMuXG5cdCAqIEBwYXJhbSB0cmFuc2llbnRWYXJpYWJsZXMgQSBtYXAgb2Yga2V5cyAoYHN0cmluZ2ApIGFuZCB2YWx1ZXMgKGBhbnlgKSBmb3IgdGhlIGxvY2FsIHRyYW5zaWVudCB2YXJpYWJsZXMgdG8gYmUgc2V0LlxuXHQgKi9cblx0cHVibGljIHNldFRyYW5zaWVudFZhcmlhYmxlc0xvY2FsKHRyYW5zaWVudFZhcmlhYmxlczogTWFwPHN0cmluZywgYW55Pik6IHZvaWQge1xuXHRcdGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRyYW5zaWVudFZhcmlhYmxlcykge1xuXHRcdFx0dHJhbnNpZW50VmFyaWFibGVzLnNldChrZXksIFZhbHVlcy5zdHJpbmdpZnlWYWx1ZSh2YWx1ZSkpO1xuXHRcdH1cblx0XHR0aGlzLmV4ZWN1dGlvbi5zZXRUcmFuc2llbnRWYXJpYWJsZXNMb2NhbCh0cmFuc2llbnRWYXJpYWJsZXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgdmFsdWUgb2YgYSBsb2NhbCB0cmFuc2llbnQgdmFyaWFibGUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGxvY2FsIHRyYW5zaWVudCB2YXJpYWJsZSB0byByZXRyaWV2ZS5cblx0ICogQHJldHVybnMgVGhlIHZhbHVlIG9mIHRoZSBsb2NhbCB0cmFuc2llbnQgdmFyaWFibGUgKGBhbnlgKSwgb3IgYG51bGxgIGlmIG5vdCBmb3VuZC5cblx0ICovXG5cdHB1YmxpYyBnZXRUcmFuc2llbnRWYXJpYWJsZUxvY2FsKHZhcmlhYmxlTmFtZTogc3RyaW5nKTogYW55IHtcblx0XHRyZXR1cm4gVmFsdWVzLnBhcnNlVmFsdWUodGhpcy5leGVjdXRpb24uZ2V0VHJhbnNpZW50VmFyaWFibGVMb2NhbCh2YXJpYWJsZU5hbWUpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgYWxsIGxvY2FsIHRyYW5zaWVudCB2YXJpYWJsZXMuXG5cdCAqIEByZXR1cm5zIEEgTWFwIG9mIGxvY2FsIHRyYW5zaWVudCB2YXJpYWJsZSBuYW1lcyAoYHN0cmluZ2ApIHRvIHZhbHVlcyAoYGFueWApLlxuXHQgKi9cblx0cHVibGljIGdldFRyYW5zaWVudFZhcmlhYmxlc0xvY2FsKCk6IE1hcDxzdHJpbmcsIGFueT4ge1xuXHRcdGNvbnN0IHRyYW5zaWVudFZhcmlhYmxlc0xvY2FsID0gdGhpcy5leGVjdXRpb24uZ2V0VHJhbnNpZW50VmFyaWFibGVzTG9jYWwoKTtcblx0XHRmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0cmFuc2llbnRWYXJpYWJsZXNMb2NhbCkge1xuXHRcdFx0dHJhbnNpZW50VmFyaWFibGVzTG9jYWwuc2V0KGtleSwgVmFsdWVzLnBhcnNlVmFsdWUodmFsdWUpKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRyYW5zaWVudFZhcmlhYmxlc0xvY2FsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgYSBzcGVjaWZpYyBsb2NhbCB0cmFuc2llbnQgdmFyaWFibGUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGxvY2FsIHRyYW5zaWVudCB2YXJpYWJsZSB0byByZW1vdmUuXG5cdCAqL1xuXHRwdWJsaWMgcmVtb3ZlVHJhbnNpZW50VmFyaWFibGVMb2NhbCh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMuZXhlY3V0aW9uLnJlbW92ZVRyYW5zaWVudFZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGEgc3BlY2lmaWMgdHJhbnNpZW50IHZhcmlhYmxlLCBzZWFyY2hpbmcgdXAgdGhlIHNjb3BlIGhpZXJhcmNoeS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgdHJhbnNpZW50IHZhcmlhYmxlIHRvIHJlbW92ZS5cblx0ICovXG5cdHB1YmxpYyByZW1vdmVUcmFuc2llbnRWYXJpYWJsZSh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMuZXhlY3V0aW9uLnJlbW92ZVRyYW5zaWVudFZhcmlhYmxlKHZhcmlhYmxlTmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlIGFsbCB0cmFuc2llbnQgdmFyaWFibGVzIG9mIHRoaXMgc2NvcGUgYW5kIGl0cyBwYXJlbnQgc2NvcGVzLlxuXHQgKi9cblx0cHVibGljIHJlbW92ZVRyYW5zaWVudFZhcmlhYmxlcygpOiB2b2lkIHtcblx0XHR0aGlzLmV4ZWN1dGlvbi5yZW1vdmVUcmFuc2llbnRWYXJpYWJsZXMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGFsbCBsb2NhbCB0cmFuc2llbnQgdmFyaWFibGVzLlxuXHQgKi9cblx0cHVibGljIHJlbW92ZVRyYW5zaWVudFZhcmlhYmxlc0xvY2FsKCk6IHZvaWQge1xuXHRcdHRoaXMuZXhlY3V0aW9uLnJlbW92ZVRyYW5zaWVudFZhcmlhYmxlc0xvY2FsKCk7XG5cdH1cblxufVxuXG4vLyBAdHMtaWdub3JlXG5pZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0Ly8gQHRzLWlnbm9yZVxuXHRtb2R1bGUuZXhwb3J0cyA9IFByb2Nlc3M7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiQUFNQSxTQUFTLGNBQWM7QUFFdkIsTUFBTSxZQUFZLEtBQUssS0FBSyxvREFBb0Q7QUFFekUsTUFBTSxRQUFRO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBVXBCLE9BQWMsTUFBTSxLQUFhLGNBQXNCLElBQUksYUFBcUMsQ0FBQyxHQUFXO0FBQzNHLFdBQU8sVUFBVSxhQUFhLEtBQUssYUFBYSxLQUFLLFVBQVUsVUFBVSxDQUFDO0FBQUEsRUFDM0U7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFBLE9BQWMsdUJBQXVCLG1CQUEyQixNQUFvQjtBQUNuRixjQUFVLHVCQUF1QixtQkFBbUIsSUFBSTtBQUFBLEVBQ3pEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRQSxPQUFjLGtCQUFrQixtQkFBMkIsYUFBMkI7QUFDckYsY0FBVSxrQkFBa0IsbUJBQW1CLFdBQVc7QUFBQSxFQUMzRDtBQUFBO0FBQUE7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
1052
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2JwbS9wcm9jZXNzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEFQSSBQcm9jZXNzXG4gKiAqIFByb3ZpZGVzIG1ldGhvZHMgZm9yIGludGVyYWN0aW5nIHdpdGggcHJvY2VzcyBpbnN0YW5jZXMsXG4gKiBpbmNsdWRpbmcgc3RhcnRpbmcsIHVwZGF0aW5nIG1ldGFkYXRhLCBhbmQgbWFuYWdpbmcgdmFyaWFibGVzLlxuICovXG5cbmltcG9ydCB7IFZhbHVlcyB9IGZyb20gXCJAYWVyb2tpdC9zZGsvYnBtL3ZhbHVlc1wiO1xuaW1wb3J0IHsgSWRlbnRpdHlMaW5rIH0gZnJvbSBcIi4vdGFza3NcIjtcblxuY29uc3QgSkJwbW5FcnJvciA9IEphdmEudHlwZSgnb3JnLmZsb3dhYmxlLmVuZ2luZS5kZWxlZ2F0ZS5CcG1uRXJyb3InKTtcbmNvbnN0IEJwbUZhY2FkZSA9IEphdmEudHlwZShcIm9yZy5lY2xpcHNlLmRpcmlnaWJsZS5jb21wb25lbnRzLmFwaS5icG0uQnBtRmFjYWRlXCIpO1xuXG5leHBvcnQgY2xhc3MgQnBtbkVycm9yIHtcblx0Y29uc3RydWN0b3IoY29kZTogc3RyaW5nLCBtZXNzYWdlPzogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIG5ldyBKQnBtbkVycm9yKGNvZGUsIG1lc3NhZ2UpO1xuXHR9XG59XG5cbmV4cG9ydCBjbGFzcyBQcm9jZXNzIHtcblxuXHQvKipcblx0ICogU3RhcnRzIGEgbmV3IHByb2Nlc3MgaW5zdGFuY2UgZm9yIGEgZ2l2ZW4gcHJvY2VzcyBkZWZpbml0aW9uIGtleS5cblx0ICpcblx0ICogQHBhcmFtIGtleSBUaGUgcHJvY2VzcyBkZWZpbml0aW9uIGtleSAoSUQpIG9mIHRoZSBwcm9jZXNzIHRvIHN0YXJ0LlxuXHQgKiBAcGFyYW0gYnVzaW5lc3NLZXkgQW4gb3B0aW9uYWwgYnVzaW5lc3Mga2V5IHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBwcm9jZXNzIGluc3RhbmNlLiBEZWZhdWx0cyB0byBhbiBlbXB0eSBzdHJpbmcuXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIEFuIG9wdGlvbmFsIG1hcCBvZiBwcm9jZXNzIHZhcmlhYmxlcyB0byBwYXNzIHRvIHRoZSBwcm9jZXNzIGluc3RhbmNlIHVwb24gc3RhcnRpbmcuIERlZmF1bHRzIHRvIGFuIGVtcHR5IG9iamVjdC5cblx0ICogQHJldHVybnMgVGhlIHVuaXF1ZSBJRCBvZiB0aGUgbmV3bHkgc3RhcnRlZCBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBzdGFydChrZXk6IHN0cmluZywgYnVzaW5lc3NLZXk6IHN0cmluZyA9ICcnLCBwYXJhbWV0ZXJzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge30pOiBzdHJpbmcge1xuXHRcdHJldHVybiBCcG1GYWNhZGUuc3RhcnRQcm9jZXNzKGtleSwgYnVzaW5lc3NLZXksIEpTT04uc3RyaW5naWZ5KHBhcmFtZXRlcnMpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIGEgaHVtYW4tcmVhZGFibGUgbmFtZSBmb3IgYW4gZXhpc3RpbmcgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICpcblx0ICogQHBhcmFtIHByb2Nlc3NJbnN0YW5jZUlkIFRoZSBJRCBvZiB0aGUgcHJvY2VzcyBpbnN0YW5jZSB0byB1cGRhdGUuXG5cdCAqIEBwYXJhbSBuYW1lIFRoZSBuZXcgbmFtZSBmb3IgdGhlIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIHNldFByb2Nlc3NJbnN0YW5jZU5hbWUocHJvY2Vzc0luc3RhbmNlSWQ6IHN0cmluZywgbmFtZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0QnBtRmFjYWRlLnNldFByb2Nlc3NJbnN0YW5jZU5hbWUocHJvY2Vzc0luc3RhbmNlSWQsIG5hbWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgdGhlIGJ1c2luZXNzIGtleSBvZiBhbiBleGlzdGluZyBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKlxuXHQgKiBAcGFyYW0gcHJvY2Vzc0luc3RhbmNlSWQgVGhlIElEIG9mIHRoZSBwcm9jZXNzIGluc3RhbmNlIHRvIHVwZGF0ZS5cblx0ICogQHBhcmFtIGJ1c2luZXNzS2V5IFRoZSBuZXcgYnVzaW5lc3Mga2V5LlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyB1cGRhdGVCdXNpbmVzc0tleShwcm9jZXNzSW5zdGFuY2VJZDogc3RyaW5nLCBidXNpbmVzc0tleTogc3RyaW5nKTogdm9pZCB7XG5cdFx0QnBtRmFjYWRlLnVwZGF0ZUJ1c2luZXNzS2V5KHByb2Nlc3NJbnN0YW5jZUlkLCBidXNpbmVzc0tleSk7XG5cdH1cblxuXHQvKipcblx0ICogVXBkYXRlcyB0aGUgYnVzaW5lc3Mgc3RhdHVzIG9mIGFuIGV4aXN0aW5nIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBwcm9jZXNzSW5zdGFuY2VJZCBUaGUgSUQgb2YgdGhlIHByb2Nlc3MgaW5zdGFuY2UgdG8gdXBkYXRlLlxuXHQgKiBAcGFyYW0gYnVzaW5lc3NTdGF0dXMgVGhlIG5ldyBidXNpbmVzcyBzdGF0dXMuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIHVwZGF0ZUJ1c2luZXNzU3RhdHVzKHByb2Nlc3NJbnN0YW5jZUlkOiBzdHJpbmcsIGJ1c2luZXNzU3RhdHVzOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRCcG1GYWNhZGUudXBkYXRlQnVzaW5lc3NTdGF0dXMocHJvY2Vzc0luc3RhbmNlSWQsIGJ1c2luZXNzU3RhdHVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWMgdmFyaWFibGUgZnJvbSBhIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBwcm9jZXNzSW5zdGFuY2VJZCBUaGUgSUQgb2YgdGhlIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIHJldHJpZXZlLlxuXHQgKiBAcmV0dXJucyBUaGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlLCBvciBgbnVsbGAgaWYgdGhlIHZhcmlhYmxlIGRvZXMgbm90IGV4aXN0LiBUaGUgdHlwZSBpcyBgYW55YCBhcyBpdCBkZXBlbmRzIG9uIHRoZSBzdG9yZWQgdmFsdWUuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIGdldFZhcmlhYmxlKHByb2Nlc3NJbnN0YW5jZUlkOiBzdHJpbmcsIHZhcmlhYmxlTmFtZTogc3RyaW5nKTogYW55IHtcblx0XHRyZXR1cm4gQnBtRmFjYWRlLmdldFZhcmlhYmxlKHByb2Nlc3NJbnN0YW5jZUlkLCB2YXJpYWJsZU5hbWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyBhbGwgdmFyaWFibGVzIGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBwcm9jZXNzSW5zdGFuY2VJZCBUaGUgSUQgb2YgdGhlIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIGFsbCB2YXJpYWJsZXMgZm9yIHRoZSBwcm9jZXNzIGluc3RhbmNlLCB3aGVyZSBrZXlzIGFyZSB2YXJpYWJsZSBuYW1lcyBhbmQgdmFsdWVzIGFyZSB0aGUgdmFyaWFibGUgdmFsdWVzLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBnZXRWYXJpYWJsZXMocHJvY2Vzc0luc3RhbmNlSWQ6IHN0cmluZyk6IGFueSB7XG5cdFx0cmV0dXJuIEJwbUZhY2FkZS5nZXRWYXJpYWJsZXMocHJvY2Vzc0luc3RhbmNlSWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgb3IgdXBkYXRlcyB0aGUgdmFsdWUgb2YgYSB2YXJpYWJsZSBpbiBhIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBwcm9jZXNzSW5zdGFuY2VJZCBUaGUgSUQgb2YgdGhlIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIHNldC5cblx0ICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSB2YXJpYWJsZS4gVGhlIHR5cGUgaXMgYGFueWAgdG8gYWNjb21tb2RhdGUgZGlmZmVyZW50IGRhdGEgdHlwZXMuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIHNldFZhcmlhYmxlKHByb2Nlc3NJbnN0YW5jZUlkOiBzdHJpbmcsIHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG5cdFx0QnBtRmFjYWRlLnNldFZhcmlhYmxlKHByb2Nlc3NJbnN0YW5jZUlkLCB2YXJpYWJsZU5hbWUsIHZhbHVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGEgdmFyaWFibGUgZnJvbSBhIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBwcm9jZXNzSW5zdGFuY2VJZCBUaGUgSUQgb2YgdGhlIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIHJlbW92ZS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgcmVtb3ZlVmFyaWFibGUocHJvY2Vzc0luc3RhbmNlSWQ6IHN0cmluZywgdmFyaWFibGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRCcG1GYWNhZGUucmVtb3ZlVmFyaWFibGUocHJvY2Vzc0luc3RhbmNlSWQsIHZhcmlhYmxlTmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29ycmVsYXRlcyBhIG1lc3NhZ2UgZXZlbnQgd2l0aCBhIHJ1bm5pbmcgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICpcblx0ICogQHBhcmFtIHByb2Nlc3NJbnN0YW5jZUlkIFRoZSBJRCBvZiB0aGUgcHJvY2VzcyBpbnN0YW5jZSB0byBjb3JyZWxhdGUgdGhlIG1lc3NhZ2UgdG8uXG5cdCAqIEBwYXJhbSBtZXNzYWdlTmFtZSBUaGUgbmFtZSBvZiB0aGUgbWVzc2FnZSBldmVudCBkZWZpbmVkIGluIHRoZSBCUE1OIHByb2Nlc3MuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZXMgQSBtYXAgb2YgdmFyaWFibGVzIChgTWFwPHN0cmluZywgYW55PmApIHRvIHBhc3MgYWxvbmcgd2l0aCB0aGUgbWVzc2FnZSBldmVudC5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgY29ycmVsYXRlTWVzc2FnZUV2ZW50KHByb2Nlc3NJbnN0YW5jZUlkOiBzdHJpbmcsIG1lc3NhZ2VOYW1lOiBzdHJpbmcsIHZhcmlhYmxlczogTWFwPHN0cmluZywgYW55Pik6IHZvaWQge1xuXHRcdEJwbUZhY2FkZS5jb3JyZWxhdGVNZXNzYWdlRXZlbnQocHJvY2Vzc0luc3RhbmNlSWQsIG1lc3NhZ2VOYW1lLCBWYWx1ZXMuc3RyaW5naWZ5VmFsdWVzTWFwKHZhcmlhYmxlcykpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgY3VycmVudCBleGVjdXRpb24gY29udGV4dCBvYmplY3QsIHR5cGljYWxseSB1c2VkIHdpdGhpbiBhbiBleGVjdXRpb24gbGlzdGVuZXIgb3Igc2VydmljZSB0YXNrLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBBIG5ldyBpbnN0YW5jZSBvZiB0aGUgYEV4ZWN1dGlvbkNvbnRleHRgIGNvbnRhaW5pbmcgZGV0YWlscyBhYm91dCB0aGUgY3VycmVudCBwcm9jZXNzIGV4ZWN1dGlvbiBwYXRoLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBnZXRFeGVjdXRpb25Db250ZXh0KCkge1xuXHRcdHJldHVybiBuZXcgRXhlY3V0aW9uQ29udGV4dCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgY3VycmVudCB0YXNrIGNvbnRleHQgb2JqZWN0LCB0eXBpY2FsbHkgdXNlZCB3aXRoaW4gYSB0YXNrIGxpc3RlbmVyIG9yIHNlcnZpY2UgdGFzay5cblx0ICpcblx0ICogQHJldHVybnMgQSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGBUYXNrQ29udGV4dGAgY29udGFpbmluZyBkZXRhaWxzIGFib3V0IHRoZSBjdXJyZW50IHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIGdldFRhc2tDb250ZXh0KCkge1xuXHRcdHJldHVybiBuZXcgVGFza0NvbnRleHQoKTtcblx0fVxufVxuXG5jbGFzcyBWYXJpYWJsZVNjb3BlIHtcblxuXHRwcml2YXRlIHZhcmlhYmxlU2NvcGU6IGFueTtcblxuXHRjb25zdHJ1Y3Rvcih2YXJpYWJsZVNjb3BlOiBhbnkpIHtcblx0XHR0aGlzLnZhcmlhYmxlU2NvcGUgPSB2YXJpYWJsZVNjb3BlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYWxsIHZhcmlhYmxlcy4gVGhpcyB3aWxsIGluY2x1ZGUgYWxsIHZhcmlhYmxlcyBvZiBwYXJlbnQgc2NvcGVzIHRvby5cblx0ICogQHJldHVybnMgQSBNYXAgb2YgdmFyaWFibGUgbmFtZXMgKGBzdHJpbmdgKSB0byB2YXJpYWJsZSB2YWx1ZXMgKGBhbnlgKS5cblx0ICovXG5cdHB1YmxpYyBnZXRWYXJpYWJsZXMoKTogTWFwPHN0cmluZywgYW55PiB7XG5cdFx0Y29uc3QgdmFyaWFibGVzID0gdGhpcy52YXJpYWJsZVNjb3BlLmdldFZhcmlhYmxlcygpO1xuXHRcdGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHZhcmlhYmxlcykge1xuXHRcdFx0dmFyaWFibGVzLnNldChrZXksIFZhbHVlcy5wYXJzZVZhbHVlKHZhbHVlKSk7XG5cdFx0fVxuXHRcdHJldHVybiB2YXJpYWJsZXM7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhbGwgdmFyaWFibGVzLCBhcyBpbnN0YW5jZXMgb2YgdGhlIHtAbGluayBWYXJpYWJsZUluc3RhbmNlfSBpbnRlcmZhY2UsIHdoaWNoIGdpdmVzIG1vcmUgaW5mb3JtYXRpb24gdGhhbiBvbmx5IHRoZSB2YWx1ZSAodHlwZSwgZXhlY3V0aW9uIGlkLCBldGMuKVxuXHQgKiBAcmV0dXJucyBBIE1hcCBvZiB2YXJpYWJsZSBuYW1lcyAoYHN0cmluZ2ApIHRvIHtAbGluayBWYXJpYWJsZUluc3RhbmNlfSBvYmplY3RzIChKYXZhIHR5cGUpLlxuXHQgKi9cblx0cHVibGljIGdldFZhcmlhYmxlSW5zdGFuY2VzKCk6IE1hcDxzdHJpbmcsIGFueT4ge1xuXHRcdHJldHVybiB0aGlzLnZhcmlhYmxlU2NvcGUuZ2V0VmFyaWFibGVJbnN0YW5jZXMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSB2YXJpYWJsZSBsb2NhbCB0byB0aGlzIHNjb3BlIG9ubHkuIFNvLCBpbiBjb250cmFyeSB0byB7QGxpbmsgI2dldFZhcmlhYmxlcygpfSwgdGhlIHZhcmlhYmxlcyBmcm9tIHRoZSBwYXJlbnQgc2NvcGUgd29uJ3QgYmUgcmV0dXJuZWQuXG5cdCAqIEByZXR1cm5zIEEgTWFwIG9mIHZhcmlhYmxlIG5hbWVzIChgc3RyaW5nYCkgdG8gbG9jYWwgdmFyaWFibGUgdmFsdWVzIChgYW55YCkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VmFyaWFibGVzTG9jYWwoKTogTWFwPHN0cmluZywgYW55PiB7XG5cdFx0Y29uc3QgdmFyaWFibGVzTG9jYWwgPSB0aGlzLnZhcmlhYmxlU2NvcGUuZ2V0VmFyaWFibGVzTG9jYWwoKTtcblx0XHRmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB2YXJpYWJsZXNMb2NhbCkge1xuXHRcdFx0dmFyaWFibGVzTG9jYWwuc2V0KGtleSwgVmFsdWVzLnBhcnNlVmFsdWUodmFsdWUpKTtcblx0XHR9XG5cdFx0cmV0dXJuIHZhcmlhYmxlc0xvY2FsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHZhcmlhYmxlcyBsb2NhbCB0byB0aGlzIHNjb3BlIGFzIGluc3RhbmNlcyBvZiB0aGUge0BsaW5rIFZhcmlhYmxlSW5zdGFuY2V9IGludGVyZmFjZSwgd2hpY2ggcHJvdmlkZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmFyaWFibGUuXG5cdCAqIEByZXR1cm5zIEEgTWFwIG9mIHZhcmlhYmxlIG5hbWVzIChgc3RyaW5nYCkgdG8gbG9jYWwge0BsaW5rIFZhcmlhYmxlSW5zdGFuY2V9IG9iamVjdHMgKEphdmEgdHlwZSkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VmFyaWFibGVJbnN0YW5jZXNMb2NhbCgpOiBNYXA8c3RyaW5nLCBhbnk+IHtcblx0XHRyZXR1cm4gdGhpcy52YXJpYWJsZVNjb3BlLmdldFZhcmlhYmxlSW5zdGFuY2VzTG9jYWwoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSB2YXJpYWJsZSB2YWx1ZSBmb3Igb25lIHNwZWNpZmljIHZhcmlhYmxlLiBXaWxsIGxvb2sgaW4gcGFyZW50IHNjb3BlcyB3aGVuIHRoZSB2YXJpYWJsZSBkb2VzIG5vdCBleGlzdCBvbiB0aGlzIHBhcnRpY3VsYXIgc2NvcGUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIHJldHJpZXZlLlxuXHQgKiBAcmV0dXJucyBUaGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIChgYW55YCksIG9yIGBudWxsYCBpZiBub3QgZm91bmQuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VmFyaWFibGUodmFyaWFibGVOYW1lOiBzdHJpbmcpOiBhbnkge1xuXHRcdHJldHVybiBWYWx1ZXMucGFyc2VWYWx1ZSh0aGlzLnZhcmlhYmxlU2NvcGUuZ2V0VmFyaWFibGUodmFyaWFibGVOYW1lKSk7XG5cdH1cblxuXHQvKipcblx0ICogU2ltaWxhciB0byB7QGxpbmsgI2dldFZhcmlhYmxlKFN0cmluZyl9LCBidXQgcmV0dXJucyBhIHtAbGluayBWYXJpYWJsZUluc3RhbmNlfSBpbnN0YW5jZSwgd2hpY2ggY29udGFpbnMgbW9yZSBpbmZvcm1hdGlvbiB0aGFuIGp1c3QgdGhlIHZhbHVlLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0byByZXRyaWV2ZS5cblx0ICogQHJldHVybnMgVGhlIHtAbGluayBWYXJpYWJsZUluc3RhbmNlfSBvYmplY3QgKEphdmEgdHlwZSksIG9yIGBudWxsYC5cblx0ICovXG5cdHB1YmxpYyBnZXRWYXJpYWJsZUluc3RhbmNlKHZhcmlhYmxlTmFtZTogc3RyaW5nKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcy52YXJpYWJsZVNjb3BlLmdldFZhcmlhYmxlSW5zdGFuY2UodmFyaWFibGVOYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIHNwZWNpZmljIHZhcmlhYmxlIGFuZCBvbmx5IGNoZWNrcyB0aGlzIHNjb3BlIGFuZCBub3QgYW55IHBhcmVudCBzY29wZS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgbG9jYWwgdmFyaWFibGUgdG8gcmV0cmlldmUuXG5cdCAqIEByZXR1cm5zIFRoZSB2YWx1ZSBvZiB0aGUgbG9jYWwgdmFyaWFibGUgKGBhbnlgKSwgb3IgYG51bGxgIGlmIG5vdCBmb3VuZCBsb2NhbGx5LlxuXHQgKi9cblx0cHVibGljIGdldFZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lOiBzdHJpbmcpOiBhbnkge1xuXHRcdHJldHVybiBWYWx1ZXMucGFyc2VWYWx1ZSh0aGlzLnZhcmlhYmxlU2NvcGUuZ2V0VmFyaWFibGVMb2NhbCh2YXJpYWJsZU5hbWUpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTaW1pbGFyIHRvIHtAbGluayAjZ2V0VmFyaWFibGVMb2NhbChTdHJpbmcpfSwgYnV0IHJldHVybnMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFZhcmlhYmxlSW5zdGFuY2V9LCB3aGljaCBoYXMgc29tZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGJleW9uZCB0aGUgdmFsdWUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGxvY2FsIHZhcmlhYmxlIHRvIHJldHJpZXZlLlxuXHQgKiBAcmV0dXJucyBUaGUgbG9jYWwge0BsaW5rIFZhcmlhYmxlSW5zdGFuY2V9IG9iamVjdCAoSmF2YSB0eXBlKSwgb3IgYG51bGxgLlxuXHQgKi9cblx0cHVibGljIGdldFZhcmlhYmxlSW5zdGFuY2VMb2NhbCh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMudmFyaWFibGVTY29wZS5nZXRWYXJpYWJsZUluc3RhbmNlTG9jYWwodmFyaWFibGVOYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGFsbCB0aGUgbmFtZXMgb2YgdGhlIHZhcmlhYmxlcyBmb3IgdGhpcyBzY29wZSBhbmQgYWxsIHBhcmVudCBzY29wZXMuXG5cdCAqIEByZXR1cm5zIEEgU2V0IG9mIGFsbCB2YXJpYWJsZSBuYW1lcyAoYHN0cmluZ2ApLlxuXHQgKi9cblx0cHVibGljIGdldFZhcmlhYmxlTmFtZXMoKTogU2V0PHN0cmluZz4ge1xuXHRcdGNvbnN0IHZhcmlhYmxlTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0XHRmb3IgKGNvbnN0IG5leHQgb2YgdGhpcy52YXJpYWJsZVNjb3BlLmdldFZhcmlhYmxlTmFtZXMoKS50b0FycmF5KCkpIHtcblx0XHRcdHZhcmlhYmxlTmFtZXMuYWRkKG5leHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gdmFyaWFibGVOYW1lcztcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGFsbCB0aGUgbmFtZXMgb2YgdGhlIHZhcmlhYmxlcyBmb3IgdGhpcyBzY29wZSAobm8gcGFyZW50IHNjb3BlcykuXG5cdCAqIEByZXR1cm5zIEEgU2V0IG9mIGxvY2FsIHZhcmlhYmxlIG5hbWVzIChgc3RyaW5nYCkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VmFyaWFibGVOYW1lc0xvY2FsKCk6IFNldDxzdHJpbmc+IHtcblx0XHRjb25zdCB2YXJpYWJsZU5hbWVzTG9jYWwgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0XHRmb3IgKGNvbnN0IG5leHQgb2YgdGhpcy52YXJpYWJsZVNjb3BlLmdldFZhcmlhYmxlTmFtZXNMb2NhbCgpLnRvQXJyYXkoKSkge1xuXHRcdFx0dmFyaWFibGVOYW1lc0xvY2FsLmFkZChuZXh0KTtcblx0XHR9XG5cdFx0cmV0dXJuIHZhcmlhYmxlTmFtZXNMb2NhbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSB2YXJpYWJsZSB3aXRoIHRoZSBwcm92aWRlZCBuYW1lIHRvIHRoZSBwcm92aWRlZCB2YWx1ZS4gSXQgY2hlY2tzIHBhcmVudCBzY29wZXMgZm9yIGFuIGV4aXN0aW5nIHZhcmlhYmxlIGJlZm9yZSBzZXR0aW5nIG9uIHRoZSBjdXJyZW50IHNjb3BlLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0byBiZSBzZXQuXG5cdCAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIHRvIGJlIHNldCAoYGFueWApLlxuXHQgKi9cblx0cHVibGljIHNldFZhcmlhYmxlKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG5cdFx0dGhpcy52YXJpYWJsZVNjb3BlLnNldFZhcmlhYmxlKHZhcmlhYmxlTmFtZSwgVmFsdWVzLnN0cmluZ2lmeVZhbHVlKHZhbHVlKSk7XG5cdH1cblxuXHQvKipcblx0ICogU2ltaWxhciB0byB7QGxpbmsgI3NldFZhcmlhYmxlKFN0cmluZywgT2JqZWN0KX0sIGJ1dCB0aGUgdmFyaWFibGUgaXMgc2V0IHRvIHRoaXMgc2NvcGUgc3BlY2lmaWNhbGx5IChsb2NhbCB2YXJpYWJsZSkuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIGJlIHNldCBsb2NhbGx5LlxuXHQgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSB0byBiZSBzZXQgKGBhbnlgKS5cblx0ICogQHJldHVybnMgVGhlIG9sZCB2YWx1ZSBvZiB0aGUgbG9jYWwgdmFyaWFibGUgKEphdmEgdHlwZSksIG9yIGBudWxsYC5cblx0ICovXG5cdHB1YmxpYyBzZXRWYXJpYWJsZUxvY2FsKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogYW55IHtcblx0XHRyZXR1cm4gdGhpcy52YXJpYWJsZVNjb3BlLnNldFZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lLCBWYWx1ZXMuc3RyaW5naWZ5VmFsdWUodmFsdWUpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBwcm92aWRlZCB2YXJpYWJsZXMgdG8gdGhlIHZhcmlhYmxlIHNjb3BlLCB1c2luZyB0aGUgZGVmYXVsdCBzY29waW5nIGFsZ29yaXRobS5cblx0ICogQHBhcmFtIHZhcmlhYmxlcyBBIG1hcCBvZiBrZXlzIChgc3RyaW5nYCkgYW5kIHZhbHVlcyAoYGFueWApIGZvciB0aGUgdmFyaWFibGVzIHRvIGJlIHNldC5cblx0ICovXG5cdHB1YmxpYyBzZXRWYXJpYWJsZXModmFyaWFibGVzOiBNYXA8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG5cdFx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdmFyaWFibGVzKSB7XG5cdFx0XHR2YXJpYWJsZXMuc2V0KGtleSwgVmFsdWVzLnN0cmluZ2lmeVZhbHVlKHZhbHVlKSk7XG5cdFx0fVxuXHRcdHRoaXMudmFyaWFibGVTY29wZS5zZXRWYXJpYWJsZXModmFyaWFibGVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTaW1pbGFyIHRvIHtAbGluayAjc2V0VmFyaWFibGVzKE1hcCl9LCBidXQgdGhlIHZhcmlhYmxlcyBhcmUgc2V0IG9uIHRoaXMgc2NvcGUgc3BlY2lmaWNhbGx5IChsb2NhbCB2YXJpYWJsZXMpLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVzIEEgbWFwIG9mIGtleXMgKGBzdHJpbmdgKSBhbmQgdmFsdWVzIChgYW55YCkgZm9yIHRoZSBsb2NhbCB2YXJpYWJsZXMgdG8gYmUgc2V0LlxuXHQgKi9cblx0cHVibGljIHNldFZhcmlhYmxlc0xvY2FsKHZhcmlhYmxlczogTWFwPHN0cmluZywgYW55Pik6IHZvaWQge1xuXHRcdGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHZhcmlhYmxlcykge1xuXHRcdFx0dmFyaWFibGVzLnNldChrZXksIFZhbHVlcy5zdHJpbmdpZnlWYWx1ZSh2YWx1ZSkpO1xuXHRcdH1cblx0XHR0aGlzLnZhcmlhYmxlU2NvcGUuc2V0VmFyaWFibGVzTG9jYWwodmFyaWFibGVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzY29wZSBvciBhbnkgcGFyZW50IHNjb3BlIGhhcyB2YXJpYWJsZXMuXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiB2YXJpYWJsZXMgZXhpc3QgaW4gc2NvcGUgaGllcmFyY2h5LCBgZmFsc2VgIG90aGVyd2lzZS5cblx0ICovXG5cdHB1YmxpYyBoYXNWYXJpYWJsZXMoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMudmFyaWFibGVTY29wZS5oYXNWYXJpYWJsZXMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzY29wZSBoYXMgdmFyaWFibGVzLlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgbG9jYWwgdmFyaWFibGVzIGV4aXN0LCBgZmFsc2VgIG90aGVyd2lzZS5cblx0ICovXG5cdHB1YmxpYyBoYXNWYXJpYWJsZXNMb2NhbCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy52YXJpYWJsZVNjb3BlLmhhc1ZhcmlhYmxlc0xvY2FsKCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB3aGV0aGVyIHRoaXMgc2NvcGUgb3IgYW55IHBhcmVudCBzY29wZSBoYXMgYSBzcGVjaWZpYyB2YXJpYWJsZS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gY2hlY2suXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFyaWFibGUgaXMgZm91bmQgaW4gdGhlIHNjb3BlIGhpZXJhcmNoeSwgYGZhbHNlYCBvdGhlcndpc2UuXG5cdCAqL1xuXHRwdWJsaWMgaGFzVmFyaWFibGUodmFyaWFibGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy52YXJpYWJsZVNjb3BlLmhhc1ZhcmlhYmxlKHZhcmlhYmxlTmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB3aGV0aGVyIHRoaXMgc2NvcGUgaGFzIGEgc3BlY2lmaWMgdmFyaWFibGUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGxvY2FsIHZhcmlhYmxlIHRvIGNoZWNrLlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhcmlhYmxlIGlzIGZvdW5kIGxvY2FsbHksIGBmYWxzZWAgb3RoZXJ3aXNlLlxuXHQgKi9cblx0cHVibGljIGhhc1ZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy52YXJpYWJsZVNjb3BlLmhhc1ZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIHRoZSB2YXJpYWJsZSBmcm9tIHRoZSBwcm9jZXNzIGluc3RhbmNlIGFuZCBjcmVhdGVzIGEgbmV3IEhpc3RvcmljVmFyaWFibGVVcGRhdGUuIFNlYXJjaGVzIHVwIHRoZSBzY29wZSBoaWVyYXJjaHkuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIHJlbW92ZS5cblx0ICovXG5cdHB1YmxpYyByZW1vdmVWYXJpYWJsZSh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudmFyaWFibGVTY29wZS5yZW1vdmVWYXJpYWJsZSh2YXJpYWJsZU5hbWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgdGhlIGxvY2FsIHZhcmlhYmxlIGFuZCBjcmVhdGVzIGEgbmV3IEhpc3RvcmljVmFyaWFibGVVcGRhdGUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGxvY2FsIHZhcmlhYmxlIHRvIHJlbW92ZS5cblx0ICovXG5cdHB1YmxpYyByZW1vdmVWYXJpYWJsZUxvY2FsKHZhcmlhYmxlTmFtZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy52YXJpYWJsZVNjb3BlLnJlbW92ZVZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIHRoZSB2YXJpYWJsZXMgYW5kIGNyZWF0ZXMgYSBuZXcgSGlzdG9yaWNWYXJpYWJsZVVwZGF0ZSBmb3IgZWFjaCBvZiB0aGVtLiBTZWFyY2hlcyB1cCB0aGUgc2NvcGUgaGllcmFyY2h5LlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lcyBBbiBhcnJheSBvZiB2YXJpYWJsZSBuYW1lcyAoYHN0cmluZ1tdYCkgdG8gcmVtb3ZlLlxuXHQgKi9cblx0cHVibGljIHJlbW92ZVZhcmlhYmxlcyh2YXJpYWJsZU5hbWVzOiBzdHJpbmdbXSk6IHZvaWQge1xuXHRcdHRoaXMudmFyaWFibGVTY29wZS5yZW1vdmVWYXJpYWJsZXModmFyaWFibGVOYW1lcyk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyB0aGUgbG9jYWwgdmFyaWFibGVzIGFuZCBjcmVhdGVzIGEgbmV3IEhpc3RvcmljVmFyaWFibGVVcGRhdGUgZm9yIGVhY2ggb2YgdGhlbS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZXMgQW4gYXJyYXkgb2YgbG9jYWwgdmFyaWFibGUgbmFtZXMgKGBzdHJpbmdbXWApIHRvIHJlbW92ZS5cblx0ICovXG5cdHB1YmxpYyByZW1vdmVWYXJpYWJsZXNMb2NhbCh2YXJpYWJsZU5hbWVzOiBzdHJpbmdbXSk6IHZvaWQge1xuXHRcdHRoaXMudmFyaWFibGVTY29wZS5yZW1vdmVWYXJpYWJsZXNMb2NhbCh2YXJpYWJsZU5hbWVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIGEgdHJhbnNpZW50IHZhcmlhYmxlIHVzaW5nIHRoZSBkZWZhdWx0IHNjb3BpbmcgbWVjaGFuaXNtICh1cCB0aGUgaGllcmFyY2h5KS4gVHJhbnNpZW50IHZhcmlhYmxlcyBoYXZlIG5vIGhpc3RvcnkgYW5kIGFyZSBjbGVhcmVkIGF0IHdhaXQgc3RhdGVzLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lIFRoZSBuYW1lIG9mIHRoZSB0cmFuc2llbnQgdmFyaWFibGUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZVZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgdHJhbnNpZW50IHZhcmlhYmxlIChgYW55YCkuXG5cdCAqL1xuXHRwdWJsaWMgc2V0VHJhbnNpZW50VmFyaWFibGUodmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhcmlhYmxlVmFsdWU6IGFueSk6IHZvaWQge1xuXHRcdHRoaXMudmFyaWFibGVTY29wZS5zZXRUcmFuc2llbnRWYXJpYWJsZSh2YXJpYWJsZU5hbWUsIFZhbHVlcy5zdHJpbmdpZnlWYWx1ZSh2YXJpYWJsZVZhbHVlKSk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyBhIGxvY2FsIHRyYW5zaWVudCB2YXJpYWJsZS4gVHJhbnNpZW50IHZhcmlhYmxlcyBoYXZlIG5vIGhpc3RvcnkgYW5kIGFyZSBjbGVhcmVkIGF0IHdhaXQgc3RhdGVzLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lIFRoZSBuYW1lIG9mIHRoZSBsb2NhbCB0cmFuc2llbnQgdmFyaWFibGUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZVZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgbG9jYWwgdHJhbnNpZW50IHZhcmlhYmxlIChgYW55YCkuXG5cdCAqL1xuXHRwdWJsaWMgc2V0VHJhbnNpZW50VmFyaWFibGVMb2NhbCh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFyaWFibGVWYWx1ZTogYW55KTogdm9pZCB7XG5cdFx0dGhpcy52YXJpYWJsZVNjb3BlLnNldFRyYW5zaWVudFZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lLCBWYWx1ZXMuc3RyaW5naWZ5VmFsdWUodmFyaWFibGVWYWx1ZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgbXVsdGlwbGUgdHJhbnNpZW50IHZhcmlhYmxlcyB1c2luZyB0aGUgZGVmYXVsdCBzY29waW5nIG1lY2hhbmlzbSAodXAgdGhlIGhpZXJhcmNoeSkuXG5cdCAqIEBwYXJhbSB0cmFuc2llbnRWYXJpYWJsZXMgQSBtYXAgb2Yga2V5cyAoYHN0cmluZ2ApIGFuZCB2YWx1ZXMgKGBhbnlgKSBmb3IgdGhlIHRyYW5zaWVudCB2YXJpYWJsZXMgdG8gYmUgc2V0LlxuXHQgKi9cblx0cHVibGljIHNldFRyYW5zaWVudFZhcmlhYmxlcyh0cmFuc2llbnRWYXJpYWJsZXM6IE1hcDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcblx0XHRmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0cmFuc2llbnRWYXJpYWJsZXMpIHtcblx0XHRcdHRyYW5zaWVudFZhcmlhYmxlcy5zZXQoa2V5LCBWYWx1ZXMuc3RyaW5naWZ5VmFsdWUodmFsdWUpKTtcblx0XHR9XG5cdFx0dGhpcy52YXJpYWJsZVNjb3BlLnNldFRyYW5zaWVudFZhcmlhYmxlcyh0cmFuc2llbnRWYXJpYWJsZXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgdmFsdWUgb2YgYSB0cmFuc2llbnQgdmFyaWFibGUsIHNlYXJjaGluZyB1cCB0aGUgcGFyZW50IHNjb3Blcy5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgdHJhbnNpZW50IHZhcmlhYmxlIHRvIHJldHJpZXZlLlxuXHQgKiBAcmV0dXJucyBUaGUgdmFsdWUgb2YgdGhlIHRyYW5zaWVudCB2YXJpYWJsZSAoYGFueWApLCBvciBgbnVsbGAgaWYgbm90IGZvdW5kLlxuXHQgKi9cblx0cHVibGljIGdldFRyYW5zaWVudFZhcmlhYmxlKHZhcmlhYmxlTmFtZTogc3RyaW5nKTogYW55IHtcblx0XHRyZXR1cm4gVmFsdWVzLnBhcnNlVmFsdWUodGhpcy52YXJpYWJsZVNjb3BlLmdldFRyYW5zaWVudFZhcmlhYmxlKHZhcmlhYmxlTmFtZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyBhbGwgdHJhbnNpZW50IHZhcmlhYmxlcyBpbiB0aGUgY3VycmVudCBzY29wZSBoaWVyYXJjaHkuXG5cdCAqIEByZXR1cm5zIEEgTWFwIG9mIHRyYW5zaWVudCB2YXJpYWJsZSBuYW1lcyAoYHN0cmluZ2ApIHRvIHZhbHVlcyAoYGFueWApLlxuXHQgKi9cblx0cHVibGljIGdldFRyYW5zaWVudFZhcmlhYmxlcygpOiBNYXA8c3RyaW5nLCBhbnk+IHtcblx0XHRjb25zdCB0cmFuc2llbnRWYXJpYWJsZXMgPSB0aGlzLnZhcmlhYmxlU2NvcGUuZ2V0VHJhbnNpZW50VmFyaWFibGVzKCk7XG5cdFx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdHJhbnNpZW50VmFyaWFibGVzKSB7XG5cdFx0XHR0cmFuc2llbnRWYXJpYWJsZXMuc2V0KGtleSwgVmFsdWVzLnBhcnNlVmFsdWUodmFsdWUpKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRyYW5zaWVudFZhcmlhYmxlcztcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIG11bHRpcGxlIGxvY2FsIHRyYW5zaWVudCB2YXJpYWJsZXMuXG5cdCAqIEBwYXJhbSB0cmFuc2llbnRWYXJpYWJsZXMgQSBtYXAgb2Yga2V5cyAoYHN0cmluZ2ApIGFuZCB2YWx1ZXMgKGBhbnlgKSBmb3IgdGhlIGxvY2FsIHRyYW5zaWVudCB2YXJpYWJsZXMgdG8gYmUgc2V0LlxuXHQgKi9cblx0cHVibGljIHNldFRyYW5zaWVudFZhcmlhYmxlc0xvY2FsKHRyYW5zaWVudFZhcmlhYmxlczogTWFwPHN0cmluZywgYW55Pik6IHZvaWQge1xuXHRcdGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRyYW5zaWVudFZhcmlhYmxlcykge1xuXHRcdFx0dHJhbnNpZW50VmFyaWFibGVzLnNldChrZXksIFZhbHVlcy5zdHJpbmdpZnlWYWx1ZSh2YWx1ZSkpO1xuXHRcdH1cblx0XHR0aGlzLnZhcmlhYmxlU2NvcGUuc2V0VHJhbnNpZW50VmFyaWFibGVzTG9jYWwodHJhbnNpZW50VmFyaWFibGVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIG9mIGEgbG9jYWwgdHJhbnNpZW50IHZhcmlhYmxlLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lIFRoZSBuYW1lIG9mIHRoZSBsb2NhbCB0cmFuc2llbnQgdmFyaWFibGUgdG8gcmV0cmlldmUuXG5cdCAqIEByZXR1cm5zIFRoZSB2YWx1ZSBvZiB0aGUgbG9jYWwgdHJhbnNpZW50IHZhcmlhYmxlIChgYW55YCksIG9yIGBudWxsYCBpZiBub3QgZm91bmQuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VHJhbnNpZW50VmFyaWFibGVMb2NhbCh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IGFueSB7XG5cdFx0cmV0dXJuIFZhbHVlcy5wYXJzZVZhbHVlKHRoaXMudmFyaWFibGVTY29wZS5nZXRUcmFuc2llbnRWYXJpYWJsZUxvY2FsKHZhcmlhYmxlTmFtZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyBhbGwgbG9jYWwgdHJhbnNpZW50IHZhcmlhYmxlcy5cblx0ICogQHJldHVybnMgQSBNYXAgb2YgbG9jYWwgdHJhbnNpZW50IHZhcmlhYmxlIG5hbWVzIChgc3RyaW5nYCkgdG8gdmFsdWVzIChgYW55YCkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VHJhbnNpZW50VmFyaWFibGVzTG9jYWwoKTogTWFwPHN0cmluZywgYW55PiB7XG5cdFx0Y29uc3QgdHJhbnNpZW50VmFyaWFibGVzTG9jYWwgPSB0aGlzLnZhcmlhYmxlU2NvcGUuZ2V0VHJhbnNpZW50VmFyaWFibGVzTG9jYWwoKTtcblx0XHRmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0cmFuc2llbnRWYXJpYWJsZXNMb2NhbCkge1xuXHRcdFx0dHJhbnNpZW50VmFyaWFibGVzTG9jYWwuc2V0KGtleSwgVmFsdWVzLnBhcnNlVmFsdWUodmFsdWUpKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRyYW5zaWVudFZhcmlhYmxlc0xvY2FsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgYSBzcGVjaWZpYyBsb2NhbCB0cmFuc2llbnQgdmFyaWFibGUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGxvY2FsIHRyYW5zaWVudCB2YXJpYWJsZSB0byByZW1vdmUuXG5cdCAqL1xuXHRwdWJsaWMgcmVtb3ZlVHJhbnNpZW50VmFyaWFibGVMb2NhbCh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudmFyaWFibGVTY29wZS5yZW1vdmVUcmFuc2llbnRWYXJpYWJsZUxvY2FsKHZhcmlhYmxlTmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyBhIHNwZWNpZmljIHRyYW5zaWVudCB2YXJpYWJsZSwgc2VhcmNoaW5nIHVwIHRoZSBzY29wZSBoaWVyYXJjaHkuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHRyYW5zaWVudCB2YXJpYWJsZSB0byByZW1vdmUuXG5cdCAqL1xuXHRwdWJsaWMgcmVtb3ZlVHJhbnNpZW50VmFyaWFibGUodmFyaWFibGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnZhcmlhYmxlU2NvcGUucmVtb3ZlVHJhbnNpZW50VmFyaWFibGUodmFyaWFibGVOYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmUgYWxsIHRyYW5zaWVudCB2YXJpYWJsZXMgb2YgdGhpcyBzY29wZSBhbmQgaXRzIHBhcmVudCBzY29wZXMuXG5cdCAqL1xuXHRwdWJsaWMgcmVtb3ZlVHJhbnNpZW50VmFyaWFibGVzKCk6IHZvaWQge1xuXHRcdHRoaXMudmFyaWFibGVTY29wZS5yZW1vdmVUcmFuc2llbnRWYXJpYWJsZXMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGFsbCBsb2NhbCB0cmFuc2llbnQgdmFyaWFibGVzLlxuXHQgKi9cblx0cHVibGljIHJlbW92ZVRyYW5zaWVudFZhcmlhYmxlc0xvY2FsKCk6IHZvaWQge1xuXHRcdHRoaXMudmFyaWFibGVTY29wZS5yZW1vdmVUcmFuc2llbnRWYXJpYWJsZXNMb2NhbCgpO1xuXHR9XG59XG5cbi8qKlxuICogRXhlY3V0aW9uQ29udGV4dCBvYmplY3RcbiAqICogUHJvdmlkZXMgZGV0YWlsZWQgaW5mb3JtYXRpb24gYW5kIGNvbnRyb2wgb3ZlciB0aGUgY3VycmVudCBwcm9jZXNzIGV4ZWN1dGlvbiBwYXRoLlxuICovXG5jbGFzcyBFeGVjdXRpb25Db250ZXh0IGV4dGVuZHMgVmFyaWFibGVTY29wZSB7XG5cblx0cHJpdmF0ZSBleGVjdXRpb246IGFueTtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRzdXBlcihfX2NvbnRleHQuZ2V0KCdleGVjdXRpb24nKSk7XG5cdFx0dGhpcy5leGVjdXRpb24gPSBfX2NvbnRleHQuZ2V0KCdleGVjdXRpb24nKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVbmlxdWUgaWQgb2YgdGhpcyBwYXRoIG9mIGV4ZWN1dGlvbiB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgaGFuZGxlIHRvIHByb3ZpZGUgZXh0ZXJuYWwgc2lnbmFscyBiYWNrIGludG8gdGhlIGVuZ2luZSBhZnRlciB3YWl0IHN0YXRlcy5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIHVuaXF1ZSBJRCBvZiB0aGUgY3VycmVudCBleGVjdXRpb24uXG5cdCAqL1xuXHRwdWJsaWMgZ2V0SWQoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uZ2V0SWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZWZlcmVuY2UgdG8gdGhlIG92ZXJhbGwgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICogQHJldHVybnMgVGhlIElEIG9mIHRoZSBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKi9cblx0cHVibGljIGdldFByb2Nlc3NJbnN0YW5jZUlkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFByb2Nlc3NJbnN0YW5jZUlkKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlICdyb290JyBwcm9jZXNzIGluc3RhbmNlLiBXaGVuIHVzaW5nIGNhbGwgYWN0aXZpdHkgZm9yIGV4YW1wbGUsIHRoZSBwcm9jZXNzSW5zdGFuY2Ugc2V0IHdpbGwgbm90IGFsd2F5cyBiZSB0aGUgcm9vdC4gVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgdG9wbW9zdCBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgSUQgb2YgdGhlIHJvb3QgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICovXG5cdHB1YmxpYyBnZXRSb290UHJvY2Vzc0luc3RhbmNlSWQoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uZ2V0Um9vdFByb2Nlc3NJbnN0YW5jZUlkKCk7XG5cdH1cblxuXHQvKipcblx0ICogV2lsbCBjb250YWluIHRoZSBldmVudCBuYW1lIGluIGNhc2UgdGhpcyBleGVjdXRpb24gaXMgcGFzc2VkIGluIGZvciBhbiB7QGxpbmsgRXhlY3V0aW9uTGlzdGVuZXJ9LlxuXHQgKiBAcmV0dXJucyBUaGUgY3VycmVudCBldmVudCBuYW1lLCBvciBgbnVsbGAvZW1wdHkgc3RyaW5nIGlmIG5vdCBleGVjdXRpbmcgYW4gZXZlbnQgbGlzdGVuZXIuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RXZlbnROYW1lKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldEV2ZW50TmFtZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGN1cnJlbnQgZXZlbnQgKHR5cGljYWxseSB3aGVuIGV4ZWN1dGlvbiBhbiB7QGxpbmsgRXhlY3V0aW9uTGlzdGVuZXJ9KS5cblx0ICpcblx0ICogQHBhcmFtIGV2ZW50TmFtZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG5cdCAqL1xuXHRwdWJsaWMgc2V0RXZlbnROYW1lKGV2ZW50TmFtZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy5leGVjdXRpb24uc2V0RXZlbnROYW1lKGV2ZW50TmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGJ1c2luZXNzIGtleSBmb3IgdGhlIHByb2Nlc3MgaW5zdGFuY2UgdGhpcyBleGVjdXRpb24gaXMgYXNzb2NpYXRlZCB3aXRoLlxuXHQgKiBAcmV0dXJucyBUaGUgYnVzaW5lc3Mga2V5LlxuXHQgKi9cblx0cHVibGljIGdldFByb2Nlc3NJbnN0YW5jZUJ1c2luZXNzS2V5KCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFByb2Nlc3NJbnN0YW5jZUJ1c2luZXNzS2V5KCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGJ1c2luZXNzIHN0YXR1cyBmb3IgdGhlIHByb2Nlc3MgaW5zdGFuY2UgdGhpcyBleGVjdXRpb24gaXMgYXNzb2NpYXRlZCB3aXRoLlxuXHQgKiBAcmV0dXJucyBUaGUgYnVzaW5lc3Mgc3RhdHVzLlxuXHQgKi9cblx0cHVibGljIGdldFByb2Nlc3NJbnN0YW5jZUJ1c2luZXNzU3RhdHVzKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFByb2Nlc3NJbnN0YW5jZUJ1c2luZXNzU3RhdHVzKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHByb2Nlc3MgZGVmaW5pdGlvbiBrZXkgZm9yIHRoZSBwcm9jZXNzIGluc3RhbmNlIHRoaXMgZXhlY3V0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aC5cblx0ICogQHJldHVybnMgVGhlIHByb2Nlc3MgZGVmaW5pdGlvbiBJRC5cblx0ICovXG5cdHB1YmxpYyBnZXRQcm9jZXNzRGVmaW5pdGlvbklkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFByb2Nlc3NEZWZpbml0aW9uSWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJZiB0aGlzIGV4ZWN1dGlvbiBydW5zIGluIHRoZSBjb250ZXh0IG9mIGEgY2FzZSBhbmQgc3RhZ2UsIHRoaXMgbWV0aG9kIHJldHVybnMgaXQncyBjbG9zZXN0IHBhcmVudCBzdGFnZSBpbnN0YW5jZSBpZCAodGhlIHN0YWdlIHBsYW4gaXRlbSBpbnN0YW5jZSBpZCB0byBiZVxuXHQgKiBwcmVjaXNlKS5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIHN0YWdlIGluc3RhbmNlIGlkIHRoaXMgZXhlY3V0aW9uIGJlbG9uZ3MgdG8gb3IgYG51bGxgLCBpZiB0aGlzIGV4ZWN1dGlvbiBpcyBub3QgcGFydCBvZiBhIGNhc2UgYXQgYWxsIG9yIGlzIG5vdCBhIGNoaWxkIGVsZW1lbnQgb2YgYSBzdGFnZS5cblx0ICovXG5cdHB1YmxpYyBnZXRQcm9wYWdhdGVkU3RhZ2VJbnN0YW5jZUlkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFByb3BhZ2F0ZWRTdGFnZUluc3RhbmNlSWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBpZCBvZiB0aGUgcGFyZW50IG9mIHRoaXMgZXhlY3V0aW9uLiBJZiBudWxsLCB0aGUgZXhlY3V0aW9uIHJlcHJlc2VudHMgYSBwcm9jZXNzLWluc3RhbmNlLlxuXHQgKiBAcmV0dXJucyBUaGUgcGFyZW50IGV4ZWN1dGlvbiBJRCwgb3IgYG51bGxgLlxuXHQgKi9cblx0cHVibGljIGdldFBhcmVudElkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFBhcmVudElkKCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgaWQgb2YgdGhlIGNhbGxpbmcgZXhlY3V0aW9uLiBJZiBub3QgbnVsbCwgdGhlIGV4ZWN1dGlvbiBpcyBwYXJ0IG9mIGEgc3VicHJvY2Vzcy5cblx0ICogQHJldHVybnMgVGhlIHN1cGVyIGV4ZWN1dGlvbiBJRCwgb3IgYG51bGxgLlxuXHQgKi9cblx0cHVibGljIGdldFN1cGVyRXhlY3V0aW9uSWQoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uZ2V0U3VwZXJFeGVjdXRpb25JZCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGlkIG9mIHRoZSBjdXJyZW50IGFjdGl2aXR5LlxuXHQgKiBAcmV0dXJucyBUaGUgY3VycmVudCBhY3Rpdml0eSBJRC5cblx0ICovXG5cdHB1YmxpYyBnZXRDdXJyZW50QWN0aXZpdHlJZCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLmV4ZWN1dGlvbi5nZXRDdXJyZW50QWN0aXZpdHlJZCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHRlbmFudCBpZCwgaWYgYW55IGlzIHNldCBiZWZvcmUgb24gdGhlIHByb2Nlc3MgZGVmaW5pdGlvbiBvciBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKiBAcmV0dXJucyBUaGUgdGVuYW50IElELCBvciBgbnVsbGAvZW1wdHkgc3RyaW5nLlxuXHQgKi9cblx0cHVibGljIGdldFRlbmFudElkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFRlbmFudElkKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIEJQTU4gZWxlbWVudCB3aGVyZSB0aGUgZXhlY3V0aW9uIGN1cnJlbnRseSBpcyBhdC5cblx0ICogQHJldHVybnMgVGhlIGN1cnJlbnQgZmxvdyBlbGVtZW50IG9iamVjdCAodHlwZSBpcyBKYXZhIG9iamVjdCkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q3VycmVudEZsb3dFbGVtZW50KCk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldEN1cnJlbnRGbG93RWxlbWVudCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZSB0aGUgY3VycmVudCBCUE1OIGVsZW1lbnQgdGhlIGV4ZWN1dGlvbiBpcyBhdC5cblx0ICogQHBhcmFtIGZsb3dFbGVtZW50IFRoZSBuZXcgZmxvdyBlbGVtZW50IG9iamVjdCAoSmF2YSB0eXBlKS5cblx0ICovXG5cdHB1YmxpYyBzZXRDdXJyZW50Rmxvd0VsZW1lbnQoZmxvd0VsZW1lbnQ6IGFueSk6IHZvaWQge1xuXHRcdHRoaXMuZXhlY3V0aW9uLnNldEN1cnJlbnRGbG93RWxlbWVudChmbG93RWxlbWVudCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUge0BsaW5rIEZsb3dhYmxlTGlzdGVuZXJ9IGluc3RhbmNlIG1hdGNoaW5nIGFuIHtAbGluayBFeGVjdXRpb25MaXN0ZW5lcn0gaWYgY3VycmVudGx5IGFuIGV4ZWN1dGlvbiBsaXN0ZW5lciBpcyBiZWluZyBleGVjdXRpb24uIFJldHVybnMgbnVsbCBvdGhlcndpc2UuXG5cdCAqIEByZXR1cm5zIFRoZSBjdXJyZW50IEZsb3dhYmxlIExpc3RlbmVyIG9iamVjdCAoSmF2YSB0eXBlKSwgb3IgYG51bGxgLlxuXHQgKi9cblx0cHVibGljIGdldEN1cnJlbnRGbG93YWJsZUxpc3RlbmVyKCk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldEN1cnJlbnRGbG93YWJsZUxpc3RlbmVyKCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbGVkIHdoZW4gYW4ge0BsaW5rIEV4ZWN1dGlvbkxpc3RlbmVyfSBpcyBiZWluZyBleGVjdXRlZC5cblx0ICogQHBhcmFtIGN1cnJlbnRMaXN0ZW5lciBUaGUgY3VycmVudCBsaXN0ZW5lciBvYmplY3QgKEphdmEgdHlwZSkuXG5cdCAqL1xuXHRwdWJsaWMgc2V0Q3VycmVudEZsb3dhYmxlTGlzdGVuZXIoY3VycmVudExpc3RlbmVyOiBhbnkpOiB2b2lkIHtcblx0XHR0aGlzLmV4ZWN1dGlvbi5zZXRDdXJyZW50Rmxvd2FibGVMaXN0ZW5lcihjdXJyZW50TGlzdGVuZXIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSBhIHNuYXBzaG90IHJlYWQgb25seSBkZWxlZ2F0ZSBleGVjdXRpb24gb2YgdGhpcyBkZWxlZ2F0ZSBleGVjdXRpb24uXG5cdCAqXG5cdCAqIEByZXR1cm5zIEEge0BsaW5rIFJlYWRPbmx5RGVsZWdhdGVFeGVjdXRpb259IG9iamVjdCAoSmF2YSB0eXBlKS5cblx0ICovXG5cdHB1YmxpYyBzbmFwc2hvdFJlYWRPbmx5KCk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLnNuYXBzaG90UmVhZE9ubHkoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiByZXR1cm5zIHRoZSBwYXJlbnQgb2YgdGhpcyBleGVjdXRpb24sIG9yIG51bGwgaWYgdGhlcmUgbm8gcGFyZW50LlxuXHQgKiBAcmV0dXJucyBUaGUgcGFyZW50IGV4ZWN1dGlvbiBvYmplY3QgKEphdmEgdHlwZSksIG9yIGBudWxsYC5cblx0ICovXG5cdHB1YmxpYyBnZXRQYXJlbnQoKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uZ2V0UGFyZW50KCk7XG5cdH1cblxuXHQvKipcblx0ICogcmV0dXJucyB0aGUgbGlzdCBvZiBleGVjdXRpb24gb2Ygd2hpY2ggdGhpcyBleGVjdXRpb24gdGhlIHBhcmVudCBvZi5cblx0ICogQHJldHVybnMgQW4gYXJyYXkgb2YgY2hpbGQgZXhlY3V0aW9uIG9iamVjdHMgKEphdmEgdHlwZSkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RXhlY3V0aW9ucygpOiBhbnlbXSB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldEV4ZWN1dGlvbnMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBtYWtlcyB0aGlzIGV4ZWN1dGlvbiBhY3RpdmUgb3IgaW5hY3RpdmUuXG5cdCAqIEBwYXJhbSBpc0FjdGl2ZSBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBleGVjdXRpb24gc2hvdWxkIGJlIGFjdGl2ZS5cblx0ICovXG5cdHB1YmxpYyBzZXRBY3RpdmUoaXNBY3RpdmU6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHR0aGlzLmV4ZWN1dGlvbi5zZXRBY3RpdmUoaXNBY3RpdmUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIHJldHVybnMgd2hldGhlciB0aGlzIGV4ZWN1dGlvbiBpcyBjdXJyZW50bHkgYWN0aXZlLlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgYWN0aXZlLCBgZmFsc2VgIG90aGVyd2lzZS5cblx0ICovXG5cdHB1YmxpYyBpc0FjdGl2ZSgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uaXNBY3RpdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiByZXR1cm5zIHdoZXRoZXIgdGhpcyBleGVjdXRpb24gaGFzIGVuZGVkIG9yIG5vdC5cblx0ICogQHJldHVybnMgYHRydWVgIGlmIGVuZGVkLCBgZmFsc2VgIG90aGVyd2lzZS5cblx0ICovXG5cdHB1YmxpYyBpc0VuZGVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmV4ZWN1dGlvbi5pc0VuZGVkKCk7XG5cdH1cblxuXHQvKipcblx0ICogY2hhbmdlcyB0aGUgY29uY3VycmVudCBpbmRpY2F0b3Igb24gdGhpcyBleGVjdXRpb24uXG5cdCAqIEBwYXJhbSBpc0NvbmN1cnJlbnQgQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZXhlY3V0aW9uIHNob3VsZCBiZSBjb25jdXJyZW50LlxuXHQgKi9cblx0cHVibGljIHNldENvbmN1cnJlbnQoaXNDb25jdXJyZW50OiBib29sZWFuKTogdm9pZCB7XG5cdFx0dGhpcy5leGVjdXRpb24uc2V0Q29uY3VycmVudChpc0NvbmN1cnJlbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIHJldHVybnMgd2hldGhlciB0aGlzIGV4ZWN1dGlvbiBpcyBjb25jdXJyZW50IG9yIG5vdC5cblx0ICogQHJldHVybnMgYHRydWVgIGlmIGNvbmN1cnJlbnQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuXHQgKi9cblx0cHVibGljIGlzQ29uY3VycmVudCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uaXNDb25jdXJyZW50KCk7XG5cdH1cblxuXHQvKipcblx0ICogcmV0dXJucyB3aGV0aGVyIHRoaXMgZXhlY3V0aW9uIGlzIGEgcHJvY2VzcyBpbnN0YW5jZSBvciBub3QuXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiBpdCdzIGEgcHJvY2VzcyBpbnN0YW5jZSwgYGZhbHNlYCBvdGhlcndpc2UuXG5cdCAqL1xuXHRwdWJsaWMgaXNQcm9jZXNzSW5zdGFuY2VUeXBlKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmV4ZWN1dGlvbi5pc1Byb2Nlc3NJbnN0YW5jZVR5cGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbmFjdGl2YXRlcyB0aGlzIGV4ZWN1dGlvbi4gVGhpcyBpcyB1c2VmdWwgZm9yIGV4YW1wbGUgaW4gYSBqb2luOiB0aGUgZXhlY3V0aW9uIHN0aWxsIGV4aXN0cywgYnV0IGl0IGlzIG5vdCBsb25nZXIgYWN0aXZlLlxuXHQgKi9cblx0cHVibGljIGluYWN0aXZhdGUoKTogdm9pZCB7XG5cdFx0dGhpcy5leGVjdXRpb24uaW5hY3RpdmF0ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgd2hldGhlciB0aGlzIGV4ZWN1dGlvbiBpcyBhIHNjb3BlLlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgaXQgaXMgYSBzY29wZSwgYGZhbHNlYCBvdGhlcndpc2UuXG5cdCAqL1xuXHRwdWJsaWMgaXNTY29wZSgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uaXNTY29wZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZXMgd2hldGhlciB0aGlzIGV4ZWN1dGlvbiBpcyBhIHNjb3BlIG9yIG5vdC5cblx0ICogQHBhcmFtIGlzU2NvcGUgQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZXhlY3V0aW9uIHNob3VsZCBiZSBhIHNjb3BlLlxuXHQgKi9cblx0cHVibGljIHNldFNjb3BlKGlzU2NvcGU6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHR0aGlzLmV4ZWN1dGlvbi5zZXRTY29wZShpc1Njb3BlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBleGVjdXRpb24gaXMgdGhlIHJvb3Qgb2YgYSBtdWx0aSBpbnN0YW5jZSBleGVjdXRpb24uXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiBpdCdzIGEgbXVsdGkgaW5zdGFuY2Ugcm9vdCwgYGZhbHNlYCBvdGhlcndpc2UuXG5cdCAqL1xuXHRwdWJsaWMgaXNNdWx0aUluc3RhbmNlUm9vdCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uaXNNdWx0aUluc3RhbmNlUm9vdCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZXMgd2hldGhlciB0aGlzIGV4ZWN1dGlvbiBpcyBhIG11bHRpIGluc3RhbmNlIHJvb3Qgb3Igbm90LlxuXHQgKiBAcGFyYW0gaXNNdWx0aUluc3RhbmNlUm9vdCBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBleGVjdXRpb24gaXMgdGhlIHJvb3Qgb2YgYSBtdWx0aS1pbnN0YW5jZSBleGVjdXRpb24uXG5cdCAqL1xuXHRwdWJsaWMgc2V0TXVsdGlJbnN0YW5jZVJvb3QoaXNNdWx0aUluc3RhbmNlUm9vdDogYm9vbGVhbik6IHZvaWQge1xuXHRcdHRoaXMuZXhlY3V0aW9uLnNldE11bHRpSW5zdGFuY2VSb290KGlzTXVsdGlJbnN0YW5jZVJvb3QpO1xuXHR9XG5cbn1cblxuZW51bSBEZWxlZ2F0aW9uU3RhdGUge1xuXG5cdC8qKlxuXHQgKiBUaGUgb3duZXIgZGVsZWdhdGVkIHRoZSB0YXNrIGFuZCB3YW50cyB0byByZXZpZXcgdGhlIHJlc3VsdCBhZnRlciB0aGUgYXNzaWduZWUgaGFzIHJlc29sdmVkIHRoZSB0YXNrLiBXaGVuIHRoZSBhc3NpZ25lZSBjb21wbGV0ZXMgdGhlIHRhc2ssIHRoZSB0YXNrIGlzIG1hcmtlZCBhcyB7QGxpbmsgI1JFU09MVkVEfSBhbmQgc2VudCBiYWNrXG5cdCAqIHRvIHRoZSBvd25lci4gV2hlbiB0aGF0IGhhcHBlbnMsIHRoZSBvd25lciBpcyBzZXQgYXMgdGhlIGFzc2lnbmVlIHNvIHRoYXQgdGhlIG93bmVyIGdldHMgdGhpcyB0YXNrIGJhY2sgaW4gdGhlIFRvRG8uXG5cdCAqL1xuXHRQRU5ESU5HLFxuXG5cdC8qKlxuXHQgKiBUaGUgYXNzaWduZWUgaGFzIHJlc29sdmVkIHRoZSB0YXNrLCB0aGUgYXNzaWduZWUgd2FzIHNldCB0byB0aGUgb3duZXIgYWdhaW4gYW5kIHRoZSBvd25lciBub3cgZmluZHMgdGhpcyB0YXNrIGJhY2sgaW4gdGhlIFRvRG8gbGlzdCBmb3IgcmV2aWV3LiBUaGUgb3duZXIgbm93IGlzIGFibGUgdG8gY29tcGxldGUgdGhlIHRhc2suXG5cdCAqL1xuXHRSRVNPTFZFRFxufVxuXG5jbGFzcyBUYXNrQ29udGV4dCBleHRlbmRzIFZhcmlhYmxlU2NvcGUge1xuXG5cdHByaXZhdGUgdGFzazogYW55O1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHN1cGVyKF9fY29udGV4dC5nZXQoJ3Rhc2snKSk7XG5cdFx0dGhpcy50YXNrID0gX19jb250ZXh0LmdldCgndGFzaycpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERCIGlkIG9mIHRoZSB0YXNrLlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIHVuaXF1ZSBJRCBvZiB0aGUgY3VycmVudCB0YXNrLlxuXHQgKi9cblx0cHVibGljIGdldElkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRJZCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hbWUgb3IgdGl0bGUgb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCB0YXNrLlxuXHQgKi9cblx0cHVibGljIGdldE5hbWUoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldE5hbWUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcGFyYW0gbmFtZSB0aGUgbmV3IG5hbWUgZm9yIHRoZSB0YXNrLlxuXHQgKi9cblx0cHVibGljIHNldE5hbWUobmFtZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrLnNldE5hbWUobmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBmcmVlIHRleHQgZGVzY3JpcHRpb24gb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGN1cnJlbnQgdGFzay5cblx0ICovXG5cdHB1YmxpYyBnZXREZXNjcmlwdGlvbigpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0RGVzY3JpcHRpb24oKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBGcmVlIHRleHQgZGVzY3JpcHRpb24gb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcGFyYW0gZGVzY3JpcHRpb24gdGhlIG5ldyBkZXNjcmlwdGlvbiBmb3IgdGhlIHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb246IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudGFzay5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7XG5cdH1cblxuXHQvKipcblx0ICogSW5kaWNhdGlvbiBvZiBob3cgaW1wb3J0YW50L3VyZ2VudCB0aGlzIHRhc2sgaXMgd2l0aCBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEwMCB3aGVyZSBoaWdoZXIgdmFsdWVzIG1lYW4gYSBoaWdoZXIgcHJpb3JpdHkgYW5kIGxvd2VyIHZhbHVlcyBtZWFuIGxvd2VyIHByaW9yaXR5OiBbMC4uMTldIGxvd2VzdCwgWzIwLi4zOV0gbG93LFxuXHQgKiBbNDAuLjU5XSBub3JtYWwsIFs2MC4uNzldIGhpZ2ggWzgwLi4xMDBdIGhpZ2hlc3Rcblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSBwcmlvcml0eSBvZiB0aGUgY3VycmVudCB0YXNrLlxuXHQgKi9cblx0cHVibGljIGdldFByaW9yaXR5KCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRQcmlvcml0eSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluZGljYXRpb24gb2YgaG93IGltcG9ydGFudC91cmdlbnQgdGhpcyB0YXNrIGlzIHdpdGggYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxMDAgd2hlcmUgaGlnaGVyIHZhbHVlcyBtZWFuIGEgaGlnaGVyIHByaW9yaXR5IGFuZCBsb3dlciB2YWx1ZXMgbWVhbiBsb3dlciBwcmlvcml0eTogWzAuLjE5XSBsb3dlc3QsIFsyMC4uMzldIGxvdyxcblx0ICogWzQwLi41OV0gbm9ybWFsLCBbNjAuLjc5XSBoaWdoIFs4MC4uMTAwXSBoaWdoZXN0XG5cdCAqIFxuXHQgKiBAcGFyYW0gcHJpb3JpdHkgdGhlIG5ldyBwcmlvcml0eSBmb3IgdGhlIHRhc2ssIHdpdGggYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxMDAgd2hlcmUgaGlnaGVyIHZhbHVlcyBtZWFuIGEgaGlnaGVyIHByaW9yaXR5IGFuZCBsb3dlciB2YWx1ZXMgbWVhbiBsb3dlciBwcmlvcml0eTogWzAuLjE5XSBsb3dlc3QsIFsyMC4uMzldIGxvdywgWzQwLi41OV0gbm9ybWFsLCBcblx0ICovXG5cdHB1YmxpYyBzZXRQcmlvcml0eShwcmlvcml0eTogbnVtYmVyKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrLnNldFByaW9yaXR5KHByaW9yaXR5KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZWZyZW5jZSB0byB0aGUgcHJvY2VzcyBpbnN0YW5jZSB0aGlzIHRhc2sgaXMgYXNzb2NpYXRlZCB3aXRoLCBvciBgbnVsbGAgaWYgdGhlIHRhc2sgaXMgbm90IHJlbGF0ZWQgdG8gYSBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIElEIG9mIHRoZSBwcm9jZXNzIGluc3RhbmNlIHRoaXMgdGFzayBpcyBhc3NvY2lhdGVkIHdpdGgsIG9yIGBudWxsYC5cblx0ICovXG5cdHB1YmxpYyBnZXRQcm9jZXNzSW5zdGFuY2VJZCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0UHJvY2Vzc0luc3RhbmNlSWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZWZlcmVuY2UgdG8gdGhlIHBhdGggb2YgZXhlY3V0aW9uIHRoaXMgdGFzayBpcyBhc3NvY2lhdGVkIHdpdGgsIG9yIGBudWxsYCBpZiB0aGUgdGFzayBpcyBub3QgcmVsYXRlZCB0byBhIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgSUQgb2YgdGhlIGV4ZWN1dGlvbiB0aGlzIHRhc2sgaXMgYXNzb2NpYXRlZCB3aXRoLCBvciBgbnVsbGAuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RXhlY3V0aW9uSWQoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldEV4ZWN1dGlvbklkKCk7XG5cdH1cblxuXHQvKipcblx0ICogUmVmZXJlbmNlIHRvIHRoZSBwcm9jZXNzIGRlZmluaXRpb24gdGhpcyB0YXNrIGlzIGFzc29jaWF0ZWQgd2l0aCwgb3IgYG51bGxgIGlmIHRoZSB0YXNrIGlzIG5vdCByZWxhdGVkIHRvIGEgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSBJRCBvZiB0aGUgcHJvY2VzcyBkZWZpbml0aW9uIHRoaXMgdGFzayBpcyBhc3NvY2lhdGVkIHdpdGgsIG9yIGBudWxsYC5cblx0ICovXG5cdHB1YmxpYyBnZXRQcm9jZXNzRGVmaW5pdGlvbklkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRQcm9jZXNzRGVmaW5pdGlvbklkKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnQgdGFzay5cblx0ICovXG5cdHB1YmxpYyBnZXRTdGF0ZSgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0U3RhdGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgZGF0ZS90aW1lIHdoZW4gdGhpcyB0YXNrIHdhcyBjcmVhdGVkLlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIGNyZWF0aW9uIHRpbWUgb2YgdGhlIGN1cnJlbnQgdGFzay5cblx0ICovXG5cdHB1YmxpYyBnZXRDcmVhdGVUaW1lKCk6IERhdGUge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0Q3JlYXRlVGltZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBkYXRlL3RpbWUgd2hlbiB0aGlzIHRhc2sgd2FzIHB1dCBpbiBwcm9ncmVzcy5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSBpbiBwcm9ncmVzcyBzdGFydCB0aW1lIG9mIHRoZSBjdXJyZW50IHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgZ2V0SW5Qcm9ncmVzc1N0YXJ0VGltZSgpOiBEYXRlIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldEluUHJvZ3Jlc3NTdGFydFRpbWUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgdXNlciByZWZlcmVuY2UgdGhhdCBzdGFydGVkIHRoZSB0YXNrLlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIHVzZXIgcmVmZXJlbmNlIHRoYXQgc3RhcnRlZCB0aGUgdGFzay5cblx0ICovXG5cdHB1YmxpYyBnZXRJblByb2dyZXNzU3RhcnRlZEJ5KCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRJblByb2dyZXNzU3RhcnRlZEJ5KCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGRhdGUvdGltZSB3aGVuIHRoaXMgdGFzayB3YXMgY2xhaW1lZC5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSBjbGFpbSB0aW1lIG9mIHRoZSBjdXJyZW50IHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q2xhaW1UaW1lKCk6IERhdGUge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0Q2xhaW1UaW1lKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHVzZXIgcmVmZXJlbmNlIHRoYXQgY2xhaW1lZCB0aGUgdGFzay5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSB1c2VyIHJlZmVyZW5jZSB0aGF0IGNsYWltZWQgdGhlIHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q2xhaW1lZEJ5KCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRDbGFpbWVkQnkoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgZGF0ZS90aW1lIHdoZW4gdGhpcyB0YXNrIHdhcyBzdXNwZW5kZWQuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgZGF0ZS90aW1lIHdoZW4gdGhpcyB0YXNrIHdhcyBzdXNwZW5kZWQuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0U3VzcGVuZGVkVGltZSgpOiBEYXRlIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldFN1c3BlbmRlZFRpbWUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgdXNlciByZWZlcmVuY2UgdGhhdCBzdXNwZW5kZWQgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgdXNlciByZWZlcmVuY2UgdGhhdCBzdXNwZW5kZWQgdGhlIHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgZ2V0U3VzcGVuZGVkQnkoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldFN1c3BlbmRlZEJ5KCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGlkIG9mIHRoZSBhY3Rpdml0eSBpbiB0aGUgcHJvY2VzcyBkZWZpbmluZyB0aGlzIHRhc2sgb3IgbnVsbCBpZiB0aGlzIGlzIG5vdCByZWxhdGVkIHRvIGEgcHJvY2Vzcy5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSB0YXNrIGRlZmluaXRpb24ga2V5LlxuXHQgKi9cblx0cHVibGljIGdldFRhc2tEZWZpbml0aW9uS2V5KCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRUYXNrRGVmaW5pdGlvbktleSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluZGljYXRlZCB3aGV0aGVyIHRoaXMgdGFzayBpcyBzdXNwZW5kZWQgb3Igbm90LlxuXHQgKiBcblx0ICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB0YXNrIGlzIHN1c3BlbmRlZCwgYGZhbHNlYCBvdGhlcndpc2UuXG5cdCAqL1xuXHRwdWJsaWMgaXNTdXNwZW5kZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5pc1N1c3BlbmRlZCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSB0ZW5hbnQgaWRlbnRpZmllciBvZiB0aGlzIHRhc2ssIHdoaWNoIGlzIHRoZSBzYW1lIGFzIHRoZSB0ZW5hbnQgaWRlbnRpZmllciBvZiB0aGUgcHJvY2VzcyBkZWZpbml0aW9uIGFuZCBwcm9jZXNzIGluc3RhbmNlIHRoaXMgdGFzayBpcyBhc3NvY2lhdGVkIHdpdGggKGlmIGFueSkuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgdGVuYW50IElEIG9mIHRoaXMgdGFzaywgb3IgYG51bGxgL2VtcHR5IHN0cmluZyBpZiBubyB0ZW5hbnQgaXMgYXNzb2NpYXRlZC5cblx0ICovXG5cdHB1YmxpYyBnZXRUZW5hbnRJZCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0VGVuYW50SWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgZm9ybSBrZXkgZm9yIHRoZSB1c2VyIHRhc2ssIHdoaWNoIGlzIHRoZSBzYW1lIGFzIHRoZSBmb3JtIGtleSBkZWZpbmVkIG9uIHRoZSB1c2VyIHRhc2sgaW4gdGhlIHByb2Nlc3MgZGVmaW5pdGlvbi4gV2lsbCByZXR1cm4gYG51bGxgIGlmIHRoaXMgdGFzayBpcyBub3QgYSB1c2VyIHRhc2sgb3IgaWYgbm8gZm9ybSBrZXkgaXMgZGVmaW5lZC5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSBmb3JtIGtleSBmb3IgdGhlIHVzZXIgdGFzaywgb3IgYG51bGxgIGlmIG5vIGZvcm0ga2V5IGlzIGRlZmluZWQuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Rm9ybUtleSgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0Rm9ybUtleSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZSB0aGUgZm9ybSBrZXkgb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcGFyYW0gZm9ybUtleSB0aGUgbmV3IGZvcm0ga2V5IGZvciB0aGUgdXNlciB0YXNrLCBvciBgbnVsbGAgdG8gcmVtb3ZlIHRoZSBmb3JtIGtleVxuXHQgKi9cblx0cHVibGljIHNldEZvcm1LZXkoZm9ybUtleTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrLnNldEZvcm1LZXkoZm9ybUtleSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGV2ZW50IG5hbWUgd2hpY2ggdHJpZ2dlcmVkIHRoZSB0YXNrIGxpc3RlbmVyIHRvIGZpcmUgZm9yIHRoaXMgdGFzay4gV2lsbCByZXR1cm4gYG51bGxgL2VtcHR5IHN0cmluZyBpZiBub3QgZXhlY3V0aW5nIGEgdGFzayBsaXN0ZW5lci5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSBldmVudCBuYW1lIHdoaWNoIHRyaWdnZXJlZCB0aGUgdGFzayBsaXN0ZW5lciB0byBmaXJlIGZvciB0aGlzIHRhc2ssIG9yIGBudWxsYC9lbXB0eSBzdHJpbmcgaWYgbm90IGV4ZWN1dGluZyBhIHRhc2sgbGlzdGVuZXIuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RXZlbnROYW1lKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRFdmVudE5hbWUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgZXZlbnQgaGFuZGxlciBpZGVudGlmaWVyIHdoaWNoIHRyaWdnZXJlZCB0aGUgdGFzayBsaXN0ZW5lciB0byBmaXJlIGZvciB0aGlzIHRhc2suIFdpbGwgcmV0dXJuIGBudWxsYC9lbXB0eSBzdHJpbmcgaWYgbm90IGV4ZWN1dGluZyBhIHRhc2sgbGlzdGVuZXIgb3IgaWYgdGhlIGV2ZW50IGhhbmRsZXIgZG9lcyBub3QgaGF2ZSBhbiBpZGVudGlmaWVyLlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIGV2ZW50IGhhbmRsZXIgaWRlbnRpZmllciwgb3IgYG51bGxgL2VtcHR5IHN0cmluZyBpZiBub3QgZXhlY3V0aW5nIGEgdGFzayBsaXN0ZW5lciBvciBpZiB0aGUgZXZlbnQgaGFuZGxlciBkb2VzIG5vdCBoYXZlIGFuIGlkZW50aWZpZXIuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RXZlbnRIYW5kbGVySWQoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldEV2ZW50SGFuZGxlcklkKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGN1cnJlbnQgZGVsZWdhdGlvbiBzdGF0ZSBvZiB0aGUgdGFzaywgd2hpY2ggaXMgYG51bGxgIGlmIHRoZSB0YXNrIGlzIG5vdCBkZWxlZ2F0ZWQsIGBQRU5ESU5HYCBpZiB0aGUgdGFzayBpcyBkZWxlZ2F0ZWQgYW5kIHdhaXRpbmcgZm9yIHJlc29sdXRpb24gYnkgdGhlIGFzc2lnbmVlLCBhbmQgYFJFU09MVkVEYCBpZiB0aGUgdGFzayBpcyBkZWxlZ2F0ZWQgYW5kIGhhcyBiZWVuIHJlc29sdmVkIGJ5IHRoZSBhc3NpZ25lZSBidXQgbm90IHlldCBjb21wbGV0ZWQgYnkgdGhlIG93bmVyLlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIGRlbGVnYXRpb24gc3RhdGUgb2YgdGhlIHRhc2ssIHdoaWNoIGlzIGBudWxsYCBpZiB0aGUgdGFzayBpcyBub3QgZGVsZWdhdGVkLCBgUEVORElOR2AgaWYgdGhlIHRhc2sgaXMgZGVsZWdhdGVkIGFuZCB3YWl0aW5nIGZvciByZXNvbHV0aW9uIGJ5IHRoZSBhc3NpZ25lZSwgYW5kIGBSRVNPTFZFRGAgaWYgdGhlIHRhc2sgaXMgZGVsZWdhdGVkIGFuZCBoYXMgYmVlbiByZXNvbHZlZCBieSB0aGUgYXNzaWduZWUgYnV0IG5vdCB5ZXQgY29tcGxldGVkIGJ5IHRoZSBvd25lci5cblx0ICovXG5cdHB1YmxpYyBnZXREZWxlZ2F0aW9uU3RhdGUoKTogRGVsZWdhdGlvblN0YXRlIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldERlbGVnYXRpb25TdGF0ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgYSBjYW5kaWRhdGUgdXNlciB0byB0aGlzIHRhc2ssIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHVzZXIgaXMgYWxsb3dlZCB0byBjbGFpbSBhbmQgd29yayBvbiB0aGlzIHRhc2suIFRoaXMgZG9lcyBub3QgbWVhbiB0aGF0IHRoZSB1c2VyIGlzIHRoZSBhc3NpZ25lZSBvZiB0aGUgdGFzaywgYnV0IGl0IG1lYW5zIHRoYXQgdGhlIHVzZXIgaXMgYSBjYW5kaWRhdGUgdG8gYmVjb21lIGFuIGFzc2lnbmVlLiBUaGUgdXNlciB3aWxsIGJlIGFibGUgdG8gc2VlIHRoaXMgdGFzayBpbiB0aGVpciB0YXNrIGxpc3QgYW5kIGNsYWltIGl0IHRvIGJlY29tZSB0aGUgYXNzaWduZWUuXG5cdCAqIFxuXHQgKiBAcGFyYW0gdXNlcklkIHRoZSB1c2VyIElEIG9mIHRoZSBjYW5kaWRhdGUgdXNlciB0byBhZGQgdG8gdGhpcyB0YXNrLlxuXHQgKi9cblx0cHVibGljIGFkZENhbmRpZGF0ZVVzZXIodXNlcklkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2suYWRkQ2FuZGlkYXRlVXNlcih1c2VySWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgbXVsdGlwbGUgdXNlcnMgYXMgY2FuZGlkYXRlIHVzZXIgdG8gdGhpcyB0YXNrLlxuXHQgKiBcblx0ICogQHBhcmFtIGNhbmRpZGF0ZVVzZXJzIHRoZSBjb2xsZWN0aW9uIG9mIGNhbmRpZGF0ZSB1c2VyIElEcyB0byBhZGQgdG8gdGhpcyB0YXNrLlxuXHQgKi9cblx0cHVibGljIGFkZENhbmRpZGF0ZVVzZXJzKGNhbmRpZGF0ZVVzZXJzOiBzdHJpbmdbXSk6IHZvaWQge1xuXHRcdHRoaXMudGFzay5hZGRDYW5kaWRhdGVVc2VycyhjYW5kaWRhdGVVc2Vycyk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBhIGNhbmRpZGF0ZSBncm91cCB0byB0aGlzIHRhc2ssIHdoaWNoIG1lYW5zIHRoYXQgYWxsIHVzZXJzIHRoYXQgYXJlIG1lbWJlcnMgb2YgdGhpcyBncm91cCBhcmUgYWxsb3dlZCB0byBjbGFpbSBhbmQgd29yayBvbiB0aGlzIHRhc2suIFRoaXMgZG9lcyBub3QgbWVhbiB0aGF0IHRoZSBncm91cCBpcyB0aGUgYXNzaWduZWUgb2YgdGhlIHRhc2ssIGJ1dCBpdCBtZWFucyB0aGF0IGFsbCB1c2VycyB0aGF0IGFyZSBtZW1iZXJzIG9mIHRoZSBncm91cCBhcmUgY2FuZGlkYXRlcyB0byBiZWNvbWUgYXNzaWduZWVzLiBUaGUgdXNlcnMgdGhhdCBhcmUgbWVtYmVycyBvZiB0aGUgZ3JvdXAgd2lsbCBiZSBhYmxlIHRvIHNlZSB0aGlzIHRhc2sgaW4gdGhlaXIgdGFzayBsaXN0IGFuZCBjbGFpbSBpdCB0byBiZWNvbWUgdGhlIGFzc2lnbmVlLlxuXHQgKiBcblx0ICogQHBhcmFtIGdyb3VwSWQgdGhlIGdyb3VwIElEIG9mIHRoZSBjYW5kaWRhdGUgZ3JvdXAgdG8gYWRkIHRvIHRoaXMgdGFzay5cblx0ICovXG5cdHB1YmxpYyBhZGRDYW5kaWRhdGVHcm91cChncm91cElkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2suYWRkQ2FuZGlkYXRlR3JvdXAoZ3JvdXBJZCk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBtdWx0aXBsZSBncm91cHMgYXMgY2FuZGlkYXRlIGdyb3VwIHRvIHRoaXMgdGFzay5cblx0ICogXG5cdCAqIEBwYXJhbSBjYW5kaWRhdGVHcm91cHMgdGhlIGNvbGxlY3Rpb24gb2YgY2FuZGlkYXRlIGdyb3VwIElEcyB0byBhZGQgdG8gdGhpcyB0YXNrLlxuXHQgKi9cblx0cHVibGljIGFkZENhbmRpZGF0ZUdyb3VwcyhjYW5kaWRhdGVHcm91cHM6IHN0cmluZ1tdKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrLmFkZENhbmRpZGF0ZUdyb3VwcyhjYW5kaWRhdGVHcm91cHMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSB1c2VyIGlkIG9mIHRoZSBwZXJzb24gcmVzcG9uc2libGUgZm9yIHRoaXMgdGFzay4gVGhpcyBpcyB0aGUgdXNlciB0aGF0IGhhcyB0byB3b3JrIG9uIHRoaXMgdGFzayBhbmQgY29tcGxldGUgaXQuIFdoZW4gYSB0YXNrIGlzIGFzc2lnbmVkIHRvIGEgdXNlciwgdGhhdCB1c2VyIGJlY29tZXMgdGhlIGFzc2lnbmVlIG9mIHRoZSB0YXNrLiBUaGUgYXNzaWduZWUgaXMgdGhlIG9ubHkgb25lIHRoYXQgY2FuIGNvbXBsZXRlIHRoZSB0YXNrICh1bmxlc3MgdGhlIHRhc2sgaXMgZGVsZWdhdGVkXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgdXNlciBJRCBvZiB0aGUgYXNzaWduZWUgb2YgdGhpcyB0YXNrXG5cdCAqL1xuXHRwdWJsaWMgZ2V0T3duZXIoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldE93bmVyKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHVzZXIgaWQgb2YgdGhlIHBlcnNvbiByZXNwb25zaWJsZSBmb3IgdGhpcyB0YXNrLiBUaGlzIGlzIHRoZSB1c2VyIHRoYXQgaGFzIHRvIHdvcmsgb24gdGhpcyB0YXNrIGFuZCBjb21wbGV0ZSBpdC4gV2hlbiBhIHRhc2sgaXMgYXNzaWduZWQgdG8gYSB1c2VyLCB0aGF0IHVzZXIgYmVjb21lcyB0aGUgYXNzaWduZWUgb2YgdGhlIHRhc2suIFRoZSBhc3NpZ25lZSBpcyB0aGUgb25seSBvbmUgdGhhdCBjYW4gY29tcGxldGUgdGhlIHRhc2sgKHVubGVzcyB0aGUgdGFzayBpcyBkZWxlZ2F0ZWRcblx0ICogXG5cdCAqIEBwYXJhbSBvd25lciB0aGUgdXNlciBJRCBvZiB0aGUgYXNzaWduZWUgb2YgdGhpcyB0YXNrXG5cdCAqL1xuXHRwdWJsaWMgc2V0T3duZXIob3duZXI6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudGFzay5zZXRPd25lcihvd25lcik7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHVzZXIgaWQgb2YgdGhlIHBlcnNvbiB0byB3aGljaCB0aGlzIHRhc2sgaXMgZGVsZWdhdGVkLlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIHVzZXIgSUQgb2YgdGhlIGFzc2lnbmVlIG9mIHRoaXMgdGFza1xuXHQgKi9cblx0cHVibGljIGdldEFzc2lnbmVlKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRBc3NpZ25lZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSB1c2VyIGlkIG9mIHRoZSBwZXJzb24gdG8gd2hpY2ggdGhpcyB0YXNrIGlzIGRlbGVnYXRlZC5cblx0ICogQHBhcmFtIGFzc2lnbmVlIHRoZSB1c2VyIElEIG9mIHRoZSBhc3NpZ25lZSBvZiB0aGlzIHRhc2tcblx0ICovXG4gICAgcHVibGljIHNldEFzc2lnbmVlKGFzc2lnbmVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50YXNrLnNldEFzc2lnbmVlKGFzc2lnbmVlKTtcbiAgICB9XG5cblx0LyoqXG5cdCAqIER1ZSBkYXRlIG9mIHRoZSBpbiBwcm9ncmVzcyBzdGFydCBvZiB0aGUgdGFzay5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSBkdWUgZGF0ZSBvZiB0aGUgaW4gcHJvZ3Jlc3Mgc3RhcnQgb2YgdGhlIHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgZ2V0SW5Qcm9ncmVzc1N0YXJ0RHVlRGF0ZSgpOiBEYXRlIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldEluUHJvZ3Jlc3NTdGFydER1ZURhdGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGFuZ2UgdGhlIGluIHByb2dyZXNzIHN0YXJ0IGR1ZSBkYXRlIG9mIHRoZSB0YXNrLlxuXHQgKiBcblx0ICogQHBhcmFtIGluUHJvZ3Jlc3NTdGFydER1ZURhdGUgdGhlIG5ldyBkdWUgZGF0ZSBvZiB0aGUgaW4gcHJvZ3Jlc3Mgc3RhcnQgb2YgdGhlIHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgc2V0SW5Qcm9ncmVzc1N0YXJ0RHVlRGF0ZShpblByb2dyZXNzU3RhcnREdWVEYXRlOiBEYXRlKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrLnNldEluUHJvZ3Jlc3NTdGFydER1ZURhdGUoaW5Qcm9ncmVzc1N0YXJ0RHVlRGF0ZSk7XG5cdH1cblxuXHQvKipcblx0ICogRHVlIGRhdGUgb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgZHVlIGRhdGUgb2YgdGhlIHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RHVlRGF0ZSgpOiBEYXRlIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldER1ZURhdGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGFuZ2UgdGhlIGR1ZSBkYXRlIG9mIHRoZSB0YXNrLlxuXHQgKiBcblx0ICogQHBhcmFtIGR1ZURhdGUgdGhlIG5ldyBkdWUgZGF0ZSBvZiB0aGUgdGFzay5cblx0ICovXG5cdHB1YmxpYyBzZXREdWVEYXRlKGR1ZURhdGU6IERhdGUpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2suc2V0RHVlRGF0ZShkdWVEYXRlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgY2F0ZWdvcnkgb2YgdGhlIHRhc2suIFRoaXMgaXMgYW4gb3B0aW9uYWwgZmllbGQgYW5kIGFsbG93cyB0byAndGFnJyB0YXNrcyBhcyBiZWxvbmdpbmcgdG8gYSBjZXJ0YWluIGNhdGVnb3J5LlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIGNhdGVnb3J5IG9mIHRoZSB0YXNrXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q2F0ZWdvcnkoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldENhdGVnb3J5KCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hhbmdlIHRoZSBjYXRlZ29yeSBvZiB0aGUgdGFzay4gVGhpcyBpcyBhbiBvcHRpb25hbCBmaWVsZCBhbmQgYWxsb3dzIHRvICd0YWcnIHRhc2tzIGFzIGJlbG9uZ2luZyB0byBhIGNlcnRhaW4gY2F0ZWdvcnkuXG5cdCAqIFxuXHQgKiBAcGFyYW0gY2F0ZWdvcnkgdGhlIG5ldyBjYXRlZ29yeSBvZiB0aGUgdGFza1xuXHQgKi9cblx0cHVibGljIHNldENhdGVnb3J5KGNhdGVnb3J5OiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2suc2V0Q2F0ZWdvcnkoY2F0ZWdvcnkpO1xuXHR9XG5cblxuICAgIC8qKlxuICAgICAqIEludm9sdmVzIGEgdXNlciB3aXRoIGEgdGFzay4gVGhlIHR5cGUgb2YgaWRlbnRpdHkgbGluayBpcyBkZWZpbmVkIGJ5IHRoZSBnaXZlbiBpZGVudGl0eUxpbmtUeXBlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHVzZXJJZFxuICAgICAqICAgICAgICAgICAgaWQgb2YgdGhlIHVzZXIgaW52b2x2ZSwgY2Fubm90IGJlIG51bGwuXG4gICAgICogQHBhcmFtIGlkZW50aXR5TGlua1R5cGVcbiAgICAgKiAgICAgICAgICAgIHR5cGUgb2YgaWRlbnRpdHlMaW5rLCBjYW5ub3QgYmUgbnVsbCAoQHNlZSB7QGxpbmsgSWRlbnRpdHlMaW5rVHlwZX0pLlxuICAgICAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuICAgICAqICAgICAgICAgICAgIHdoZW4gdGhlIHRhc2sgb3IgdXNlciBkb2Vzbid0IGV4aXN0LlxuICAgICAqL1xuXHRwdWJsaWMgYWRkVXNlcklkZW50aXR5TGluayh1c2VySWQ6IHN0cmluZywgaWRlbnRpdHlMaW5rVHlwZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrLmFkZFVzZXJJZGVudGl0eUxpbmsodXNlcklkLCBpZGVudGl0eUxpbmtUeXBlKTtcblx0fVxuXG4gICAgLyoqXG4gICAgICogSW52b2x2ZXMgYSBncm91cCB3aXRoIGdyb3VwIHRhc2suIFRoZSB0eXBlIG9mIGlkZW50aXR5TGluayBpcyBkZWZpbmVkIGJ5IHRoZSBnaXZlbiBpZGVudGl0eUxpbmsuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZ3JvdXBJZFxuICAgICAqICAgICAgICAgICAgaWQgb2YgdGhlIGdyb3VwIHRvIGludm9sdmUsIGNhbm5vdCBiZSBudWxsLlxuICAgICAqIEBwYXJhbSBpZGVudGl0eUxpbmtUeXBlXG4gICAgICogICAgICAgICAgICB0eXBlIG9mIGlkZW50aXR5LCBjYW5ub3QgYmUgbnVsbCAoQHNlZSB7QGxpbmsgSWRlbnRpdHlMaW5rVHlwZX0pLlxuICAgICAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuICAgICAqICAgICAgICAgICAgIHdoZW4gdGhlIHRhc2sgb3IgZ3JvdXAgZG9lc24ndCBleGlzdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkR3JvdXBJZGVudGl0eUxpbmsoZ3JvdXBJZDogc3RyaW5nLCBpZGVudGl0eUxpbmtUeXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50YXNrLmFkZEdyb3VwSWRlbnRpdHlMaW5rKGdyb3VwSWQsIGlkZW50aXR5TGlua1R5cGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlbmllbmNlIHNob3J0aGFuZCBmb3Ige0BsaW5rICNkZWxldGVVc2VySWRlbnRpdHlMaW5rKFN0cmluZywgU3RyaW5nKX0gOyB3aXRoIHR5cGUge0BsaW5rIElkZW50aXR5TGlua1R5cGUjQ0FORElEQVRFfVxuICAgICAqXG4gICAgICogQHBhcmFtIHVzZXJJZFxuICAgICAqICAgICAgICAgICAgaWQgb2YgdGhlIHVzZXIgdG8gdXNlIGFzIGNhbmRpZGF0ZSwgY2Fubm90IGJlIG51bGwuXG4gICAgICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG4gICAgICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBvciB1c2VyIGRvZXNuJ3QgZXhpc3QuXG4gICAgICovXG4gICAgcHVibGljIGRlbGV0ZUNhbmRpZGF0ZVVzZXIodXNlcklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50YXNrLmRlbGV0ZUNhbmRpZGF0ZVVzZXIodXNlcklkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZW5pZW5jZSBzaG9ydGhhbmQgZm9yIHtAbGluayAjZGVsZXRlR3JvdXBJZGVudGl0eUxpbmsoU3RyaW5nLCBTdHJpbmcpfTsgd2l0aCB0eXBlIHtAbGluayBJZGVudGl0eUxpbmtUeXBlI0NBTkRJREFURX1cbiAgICAgKlxuICAgICAqIEBwYXJhbSBncm91cElkXG4gICAgICogICAgICAgICAgICBpZCBvZiB0aGUgZ3JvdXAgdG8gdXNlIGFzIGNhbmRpZGF0ZSwgY2Fubm90IGJlIG51bGwuXG4gICAgICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG4gICAgICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBvciBncm91cCBkb2Vzbid0IGV4aXN0LlxuICAgICAqL1xuXHRwdWJsaWMgZGVsZXRlQ2FuZGlkYXRlR3JvdXAoZ3JvdXBJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrLmRlbGV0ZUNhbmRpZGF0ZUdyb3VwKGdyb3VwSWQpO1xuXHR9XG5cblx0LyoqXG4gICAgICogUmVtb3ZlcyB0aGUgYXNzb2NpYXRpb24gYmV0d2VlbiBhIHVzZXIgYW5kIGEgdGFzayBmb3IgdGhlIGdpdmVuIGlkZW50aXR5TGlua1R5cGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdXNlcklkXG4gICAgICogICAgICAgICAgICBpZCBvZiB0aGUgdXNlciBpbnZvbHZlLCBjYW5ub3QgYmUgbnVsbC5cbiAgICAgKiBAcGFyYW0gaWRlbnRpdHlMaW5rVHlwZVxuICAgICAqICAgICAgICAgICAgdHlwZSBvZiBpZGVudGl0eUxpbmssIGNhbm5vdCBiZSBudWxsIChAc2VlIHtAbGluayBJZGVudGl0eUxpbmtUeXBlfSkuXG4gICAgICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG4gICAgICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBvciB1c2VyIGRvZXNuJ3QgZXhpc3QuXG4gICAgICovXG5cdHB1YmxpYyBkZWxldGVVc2VySWRlbnRpdHlMaW5rKHVzZXJJZDogc3RyaW5nLCBpZGVudGl0eUxpbmtUeXBlOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2suZGVsZXRlVXNlcklkZW50aXR5TGluayh1c2VySWQsIGlkZW50aXR5TGlua1R5cGUpO1xuXHR9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIGEgZ3JvdXAgYW5kIGEgdGFzayBmb3IgdGhlIGdpdmVuIGlkZW50aXR5TGlua1R5cGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZ3JvdXBJZFxuICAgICAqICAgICAgICAgICAgaWQgb2YgdGhlIGdyb3VwIHRvIGludm9sdmUsIGNhbm5vdCBiZSBudWxsLlxuICAgICAqIEBwYXJhbSBpZGVudGl0eUxpbmtUeXBlXG4gICAgICogICAgICAgICAgICB0eXBlIG9mIGlkZW50aXR5LCBjYW5ub3QgYmUgbnVsbCAoQHNlZSB7QGxpbmsgSWRlbnRpdHlMaW5rVHlwZX0pLlxuICAgICAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuICAgICAqICAgICAgICAgICAgIHdoZW4gdGhlIHRhc2sgb3IgZ3JvdXAgZG9lc24ndCBleGlzdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZGVsZXRlR3JvdXBJZGVudGl0eUxpbmsoZ3JvdXBJZDogc3RyaW5nLCBpZGVudGl0eUxpbmtUeXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50YXNrLmRlbGV0ZUdyb3VwSWRlbnRpdHlMaW5rKGdyb3VwSWQsIGlkZW50aXR5TGlua1R5cGUpO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHRoZSBjYW5kaWRhdGUgdXNlcnMgYW5kIGdyb3VwcyBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2suXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHNldCBvZiB7QGxpbmsgSWRlbnRpdHlMaW5rfXMgb2YgdHlwZSB7QGxpbmsgSWRlbnRpdHlMaW5rVHlwZSNDQU5ESURBVEV9LlxuICAgICAqL1xuXHRwdWJsaWMgZ2V0Q2FuZGlkYXRlcygpOiBJZGVudGl0eUxpbmtbXSB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRDYW5kaWRhdGVzKCk7XG5cdH1cbn1cblxuLy8gQHRzLWlnbm9yZVxuaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnKSB7XG5cdC8vIEB0cy1pZ25vcmVcblx0bW9kdWxlLmV4cG9ydHMgPSBQcm9jZXNzO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBTUEsU0FBUyxjQUFjO0FBR3ZCLE1BQU0sYUFBYSxLQUFLLEtBQUssd0NBQXdDO0FBQ3JFLE1BQU0sWUFBWSxLQUFLLEtBQUssb0RBQW9EO0FBRXpFLE1BQU0sVUFBVTtBQUFBLEVBQ3RCLFlBQVksTUFBYyxTQUFrQjtBQUMzQyxX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LDBCQUEwQix3QkFBb0M7QUFDcEUsU0FBSyxLQUFLLDBCQUEwQixzQkFBc0I7QUFBQSxFQUMzRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLGFBQW1CO0FBQ3pCLFdBQU8sS0FBSyxLQUFLLFdBQVc7QUFBQSxFQUM3QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLFdBQVcsU0FBcUI7QUFDdEMsU0FBSyxLQUFLLFdBQVcsT0FBTztBQUFBLEVBQzdCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT08sY0FBc0I7QUFDNUIsV0FBTyxLQUFLLEtBQUssWUFBWTtBQUFBLEVBQzlCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT08sWUFBWSxVQUF3QjtBQUMxQyxTQUFLLEtBQUssWUFBWSxRQUFRO0FBQUEsRUFDL0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBYU8sb0JBQW9CLFFBQWdCLGtCQUFnQztBQUMxRSxTQUFLLEtBQUssb0JBQW9CLFFBQVEsZ0JBQWdCO0FBQUEsRUFDdkQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBWVUscUJBQXFCLFNBQWlCLGtCQUFnQztBQUN6RSxTQUFLLEtBQUsscUJBQXFCLFNBQVMsZ0JBQWdCO0FBQUEsRUFDNUQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFVTyxvQkFBb0IsUUFBc0I7QUFDN0MsU0FBSyxLQUFLLG9CQUFvQixNQUFNO0FBQUEsRUFDeEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFVSSxxQkFBcUIsU0FBdUI7QUFDbEQsU0FBSyxLQUFLLHFCQUFxQixPQUFPO0FBQUEsRUFDdkM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBWU8sdUJBQXVCLFFBQWdCLGtCQUFnQztBQUM3RSxTQUFLLEtBQUssdUJBQXVCLFFBQVEsZ0JBQWdCO0FBQUEsRUFDMUQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBWVUsd0JBQXdCLFNBQWlCLGtCQUFnQztBQUM1RSxTQUFLLEtBQUssd0JBQXdCLFNBQVMsZ0JBQWdCO0FBQUEsRUFDL0Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRSSxnQkFBZ0M7QUFDdEMsV0FBTyxLQUFLLEtBQUssY0FBYztBQUFBLEVBQ2hDO0FBQ0Q7QUFHQSxJQUFJLE9BQU8sV0FBVyxhQUFhO0FBRWxDLFNBQU8sVUFBVTtBQUNsQjsiLAogICJuYW1lcyI6IFsiRGVsZWdhdGlvblN0YXRlIl0KfQo=