@bryntum/grid-angular 7.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/README.md +44 -0
  2. package/bryntum-grid-angular.d.ts +5 -0
  3. package/bundles/bryntum-grid-angular.umd.js +49212 -0
  4. package/bundles/bryntum-grid-angular.umd.js.map +1 -0
  5. package/esm2015/bryntum-grid-angular.js +5 -0
  6. package/esm2015/lib/bryntum-a-i-filter-field.component.js +791 -0
  7. package/esm2015/lib/bryntum-button-group.component.js +725 -0
  8. package/esm2015/lib/bryntum-button.component.js +715 -0
  9. package/esm2015/lib/bryntum-chat-panel.component.js +839 -0
  10. package/esm2015/lib/bryntum-checkbox-group.component.js +854 -0
  11. package/esm2015/lib/bryntum-checkbox.component.js +805 -0
  12. package/esm2015/lib/bryntum-checklist-filter-combo.component.js +943 -0
  13. package/esm2015/lib/bryntum-chip-view.component.js +727 -0
  14. package/esm2015/lib/bryntum-code-editor.component.js +818 -0
  15. package/esm2015/lib/bryntum-color-field.component.js +794 -0
  16. package/esm2015/lib/bryntum-combo.component.js +932 -0
  17. package/esm2015/lib/bryntum-container.component.js +681 -0
  18. package/esm2015/lib/bryntum-date-field.component.js +831 -0
  19. package/esm2015/lib/bryntum-date-picker.component.js +1008 -0
  20. package/esm2015/lib/bryntum-date-range-field.component.js +835 -0
  21. package/esm2015/lib/bryntum-date-time-field.component.js +752 -0
  22. package/esm2015/lib/bryntum-demo-code-editor.component.js +830 -0
  23. package/esm2015/lib/bryntum-demo-header.component.js +171 -0
  24. package/esm2015/lib/bryntum-display-field.component.js +772 -0
  25. package/esm2015/lib/bryntum-duration-field.component.js +815 -0
  26. package/esm2015/lib/bryntum-editor.component.js +823 -0
  27. package/esm2015/lib/bryntum-field-filter-picker-group.component.js +758 -0
  28. package/esm2015/lib/bryntum-field-filter-picker.component.js +740 -0
  29. package/esm2015/lib/bryntum-field-set.component.js +810 -0
  30. package/esm2015/lib/bryntum-file-field.component.js +776 -0
  31. package/esm2015/lib/bryntum-file-picker.component.js +709 -0
  32. package/esm2015/lib/bryntum-filter-field.component.js +803 -0
  33. package/esm2015/lib/bryntum-fullscreen-button.component.js +53 -0
  34. package/esm2015/lib/bryntum-grid-base.component.js +2099 -0
  35. package/esm2015/lib/bryntum-grid-chart-designer.component.js +588 -0
  36. package/esm2015/lib/bryntum-grid-field-filter-picker-group.component.js +754 -0
  37. package/esm2015/lib/bryntum-grid-field-filter-picker.component.js +744 -0
  38. package/esm2015/lib/bryntum-grid.component.js +2103 -0
  39. package/esm2015/lib/bryntum-group-bar.component.js +727 -0
  40. package/esm2015/lib/bryntum-hint.component.js +856 -0
  41. package/esm2015/lib/bryntum-label.component.js +584 -0
  42. package/esm2015/lib/bryntum-list.component.js +715 -0
  43. package/esm2015/lib/bryntum-menu.component.js +883 -0
  44. package/esm2015/lib/bryntum-month-picker.component.js +818 -0
  45. package/esm2015/lib/bryntum-number-field.component.js +800 -0
  46. package/esm2015/lib/bryntum-paging-toolbar.component.js +736 -0
  47. package/esm2015/lib/bryntum-panel.component.js +794 -0
  48. package/esm2015/lib/bryntum-password-field.component.js +768 -0
  49. package/esm2015/lib/bryntum-radio-group.component.js +826 -0
  50. package/esm2015/lib/bryntum-radio.component.js +805 -0
  51. package/esm2015/lib/bryntum-slide-toggle.component.js +805 -0
  52. package/esm2015/lib/bryntum-slider.component.js +661 -0
  53. package/esm2015/lib/bryntum-splitter.component.js +618 -0
  54. package/esm2015/lib/bryntum-tab-panel.component.js +842 -0
  55. package/esm2015/lib/bryntum-text-area-field.component.js +776 -0
  56. package/esm2015/lib/bryntum-text-area-picker-field.component.js +798 -0
  57. package/esm2015/lib/bryntum-text-field.component.js +783 -0
  58. package/esm2015/lib/bryntum-time-field.component.js +819 -0
  59. package/esm2015/lib/bryntum-time-picker.component.js +709 -0
  60. package/esm2015/lib/bryntum-toolbar.component.js +732 -0
  61. package/esm2015/lib/bryntum-tree-combo.component.js +932 -0
  62. package/esm2015/lib/bryntum-tree-grid.component.js +2103 -0
  63. package/esm2015/lib/bryntum-widget.component.js +580 -0
  64. package/esm2015/lib/bryntum-year-picker.component.js +827 -0
  65. package/esm2015/lib/grid.module.js +314 -0
  66. package/esm2015/lib/wrapper.helper.js +74 -0
  67. package/esm2015/public-api.js +64 -0
  68. package/fesm2015/bryntum-grid-angular.js +48622 -0
  69. package/fesm2015/bryntum-grid-angular.js.map +1 -0
  70. package/lib/bryntum-a-i-filter-field.component.d.ts +968 -0
  71. package/lib/bryntum-button-group.component.d.ts +860 -0
  72. package/lib/bryntum-button.component.d.ts +845 -0
  73. package/lib/bryntum-chat-panel.component.d.ts +1060 -0
  74. package/lib/bryntum-checkbox-group.component.d.ts +1094 -0
  75. package/lib/bryntum-checkbox.component.d.ts +968 -0
  76. package/lib/bryntum-checklist-filter-combo.component.d.ts +1210 -0
  77. package/lib/bryntum-chip-view.component.d.ts +872 -0
  78. package/lib/bryntum-code-editor.component.d.ts +1045 -0
  79. package/lib/bryntum-color-field.component.d.ts +965 -0
  80. package/lib/bryntum-combo.component.d.ts +1199 -0
  81. package/lib/bryntum-container.component.d.ts +822 -0
  82. package/lib/bryntum-date-field.component.d.ts +1025 -0
  83. package/lib/bryntum-date-picker.component.d.ts +1338 -0
  84. package/lib/bryntum-date-range-field.component.d.ts +1027 -0
  85. package/lib/bryntum-date-time-field.component.d.ts +912 -0
  86. package/lib/bryntum-demo-code-editor.component.d.ts +1061 -0
  87. package/lib/bryntum-demo-header.component.d.ts +29 -0
  88. package/lib/bryntum-display-field.component.d.ts +949 -0
  89. package/lib/bryntum-duration-field.component.d.ts +1008 -0
  90. package/lib/bryntum-editor.component.d.ts +969 -0
  91. package/lib/bryntum-field-filter-picker-group.component.d.ts +935 -0
  92. package/lib/bryntum-field-filter-picker.component.d.ts +903 -0
  93. package/lib/bryntum-field-set.component.d.ts +1038 -0
  94. package/lib/bryntum-file-field.component.d.ts +952 -0
  95. package/lib/bryntum-file-picker.component.d.ts +847 -0
  96. package/lib/bryntum-filter-field.component.d.ts +993 -0
  97. package/lib/bryntum-fullscreen-button.component.d.ts +20 -0
  98. package/lib/bryntum-grid-base.component.d.ts +2271 -0
  99. package/lib/bryntum-grid-chart-designer.component.d.ts +691 -0
  100. package/lib/bryntum-grid-field-filter-picker-group.component.d.ts +929 -0
  101. package/lib/bryntum-grid-field-filter-picker.component.d.ts +916 -0
  102. package/lib/bryntum-grid.component.d.ts +2273 -0
  103. package/lib/bryntum-group-bar.component.d.ts +872 -0
  104. package/lib/bryntum-hint.component.d.ts +1117 -0
  105. package/lib/bryntum-label.component.d.ts +683 -0
  106. package/lib/bryntum-list.component.d.ts +849 -0
  107. package/lib/bryntum-menu.component.d.ts +1129 -0
  108. package/lib/bryntum-month-picker.component.d.ts +1034 -0
  109. package/lib/bryntum-number-field.component.d.ts +995 -0
  110. package/lib/bryntum-paging-toolbar.component.d.ts +886 -0
  111. package/lib/bryntum-panel.component.d.ts +1015 -0
  112. package/lib/bryntum-password-field.component.d.ts +939 -0
  113. package/lib/bryntum-radio-group.component.d.ts +1068 -0
  114. package/lib/bryntum-radio.component.d.ts +968 -0
  115. package/lib/bryntum-slide-toggle.component.d.ts +968 -0
  116. package/lib/bryntum-slider.component.d.ts +776 -0
  117. package/lib/bryntum-splitter.component.d.ts +714 -0
  118. package/lib/bryntum-tab-panel.component.d.ts +1065 -0
  119. package/lib/bryntum-text-area-field.component.d.ts +951 -0
  120. package/lib/bryntum-text-area-picker-field.component.d.ts +972 -0
  121. package/lib/bryntum-text-field.component.d.ts +957 -0
  122. package/lib/bryntum-time-field.component.d.ts +1006 -0
  123. package/lib/bryntum-time-picker.component.d.ts +853 -0
  124. package/lib/bryntum-toolbar.component.d.ts +879 -0
  125. package/lib/bryntum-tree-combo.component.d.ts +1199 -0
  126. package/lib/bryntum-tree-grid.component.d.ts +2273 -0
  127. package/lib/bryntum-widget.component.d.ts +678 -0
  128. package/lib/bryntum-year-picker.component.d.ts +1049 -0
  129. package/lib/grid.module.d.ts +65 -0
  130. package/lib/wrapper.helper.d.ts +26 -0
  131. package/package.json +33 -0
  132. package/public-api.d.ts +60 -0
@@ -0,0 +1,715 @@
1
+ /* eslint-disable @typescript-eslint/no-unused-vars */
2
+ /**
3
+ * Angular wrapper for Bryntum List
4
+ */
5
+ import { Component, EventEmitter, Output, Input } from '@angular/core';
6
+ import WrapperHelper from './wrapper.helper';
7
+ import { List, Widget } from '@bryntum/grid';
8
+ import * as i0 from "@angular/core";
9
+ export class BryntumListComponent {
10
+ constructor(element) {
11
+ this.bryntumConfig = {
12
+ adopt: undefined,
13
+ appendTo: undefined,
14
+ href: undefined,
15
+ angularComponent: this,
16
+ features: {},
17
+ listeners: {}
18
+ };
19
+ // Events emitters
20
+ /**
21
+ * Fires before an object is destroyed.
22
+ * @param {object} event Event object
23
+ * @param {Core.Base} event.source The Object that is being destroyed.
24
+ */
25
+ this.onBeforeDestroy = new EventEmitter();
26
+ /**
27
+ * Triggered before a widget is hidden. Return `false` to prevent the action.
28
+ * @param {object} event Event object
29
+ * @param {Core.widget.Widget} event.source The widget being hidden.
30
+ */
31
+ this.onBeforeHide = new EventEmitter();
32
+ /**
33
+ * User going to activate an item in the list either by pointer or keyboard.
34
+ * The active record, list item index, and the triggering event are passed.
35
+ * It is preventable by returning `false`
36
+ * @param {object} event Event object
37
+ * @param {Core.widget.List} event.source The List instance
38
+ * @param {HTMLElement} event.item The clicked list element
39
+ * @param {Core.data.Model} event.record Activated record
40
+ * @param {number} event.index List item index
41
+ * @param {Event} event.event Triggering event
42
+ */
43
+ this.onBeforeItem = new EventEmitter();
44
+ /**
45
+ * Triggered before a widget is shown. Return `false` to prevent the action.
46
+ * @param {object} event Event object
47
+ * @param {Core.widget.Widget,any} event.source The widget being shown
48
+ */
49
+ this.onBeforeShow = new EventEmitter();
50
+ /**
51
+ * Fires when any other event is fired from the object.
52
+ * ...
53
+ * [View online docs...](https://bryntum.com/products/grid/docs/api/Core/widget/List#event-catchAll)
54
+ * @param {object} event Event object
55
+ * @param {{[key: string]: any, type: string}} event.event The Object that contains event details
56
+ * @param {string} event.event.type The type of the event which is caught by the listener
57
+ */
58
+ this.onCatchAll = new EventEmitter();
59
+ /**
60
+ * Fires when an object is destroyed.
61
+ * @param {object} event Event object
62
+ * @param {Core.Base} event.source The Object that is being destroyed.
63
+ */
64
+ this.onDestroy = new EventEmitter();
65
+ /**
66
+ * Triggered when a widget's [element](https://bryntum.com/products/grid/docs/api/Core/widget/Widget#property-element) is available.
67
+ * @param {object} event Event object
68
+ * @param {HTMLElement} event.element The Widget's element.
69
+ */
70
+ this.onElementCreated = new EventEmitter();
71
+ /**
72
+ * Fired when focus enters this Widget.
73
+ * @param {object} event Event object
74
+ * @param {Core.widget.Widget} event.source This Widget
75
+ * @param {HTMLElement} event.fromElement The element which lost focus.
76
+ * @param {HTMLElement} event.toElement The element which gained focus.
77
+ * @param {Core.widget.Widget} event.fromWidget The widget which lost focus.
78
+ * @param {Core.widget.Widget} event.toWidget The widget which gained focus.
79
+ * @param {boolean} event.backwards `true` if the `toElement` is before the `fromElement` in document order.
80
+ */
81
+ this.onFocusIn = new EventEmitter();
82
+ /**
83
+ * Fired when focus exits this Widget's ownership tree. This is different from a `blur` event.
84
+ * focus moving from within this Widget's ownership tree, even if there are floating widgets
85
+ * will not trigger this event. This is when focus exits this widget completely.
86
+ * @param {object} event Event object
87
+ * @param {Core.widget.Widget} event.source This Widget
88
+ * @param {HTMLElement} event.fromElement The element which lost focus.
89
+ * @param {HTMLElement} event.toElement The element which gained focus.
90
+ * @param {Core.widget.Widget} event.fromWidget The widget which lost focus.
91
+ * @param {Core.widget.Widget} event.toWidget The widget which gained focus.
92
+ * @param {boolean} event.backwards `true` if the `toElement` is before the `fromElement` in document order.
93
+ */
94
+ this.onFocusOut = new EventEmitter();
95
+ /**
96
+ * Triggered after a widget was hidden
97
+ * @param {object} event Event object
98
+ * @param {Core.widget.Widget} event.source The widget
99
+ */
100
+ this.onHide = new EventEmitter();
101
+ /**
102
+ * User activated an item in the list either by pointer or keyboard.
103
+ * The active record, list item index, and the triggering event are passed.
104
+ * @param {object} event Event object
105
+ * @param {Core.widget.List} event.source The List instance
106
+ * @param {HTMLElement} event.item The clicked list element
107
+ * @param {Core.data.Model} event.record Activated record
108
+ * @param {number} event.index List item index
109
+ * @param {Event} event.event Triggering event
110
+ */
111
+ this.onItem = new EventEmitter();
112
+ /**
113
+ * Triggered when a widget which had been in a non-visible state for any reason
114
+ * achieves visibility.
115
+ * ...
116
+ * [View online docs...](https://bryntum.com/products/grid/docs/api/Core/widget/List#event-paint)
117
+ * @param {object} event Event object
118
+ * @param {Core.widget.Widget} event.source The widget being painted.
119
+ * @param {boolean} event.firstPaint `true` if this is the first paint.
120
+ */
121
+ this.onPaint = new EventEmitter();
122
+ /**
123
+ * Fired when a Widget's read only state is toggled
124
+ * @param {object} event Event object
125
+ * @param {boolean} event.readOnly Read only or not
126
+ */
127
+ this.onReadOnly = new EventEmitter();
128
+ /**
129
+ * This event is fired after a widget's elements have been synchronized due to a direct or indirect call
130
+ * to [recompose](https://bryntum.com/products/grid/docs/api/Core/widget/Widget#function-recompose), if this results in some change to the widget's rendered DOM elements.
131
+ */
132
+ this.onRecompose = new EventEmitter();
133
+ /**
134
+ * Fired when the encapsulating element of a Widget resizes *only when [monitorResize](https://bryntum.com/products/grid/docs/api/Core/widget/Widget#config-monitorResize) is `true`*.
135
+ * @param {object} event Event object
136
+ * @param {Core.widget.Widget} event.source This Widget
137
+ * @param {number} event.width The new width
138
+ * @param {number} event.height The new height
139
+ * @param {number} event.oldWidth The old width
140
+ * @param {number} event.oldHeight The old height
141
+ */
142
+ this.onResize = new EventEmitter();
143
+ /**
144
+ * Fired when selection changes
145
+ * @param {object} event Event object
146
+ * @param {Core.widget.List} event.source The List instance
147
+ * @param {Core.data.Model[]} event.selected An array of the currently selected records
148
+ */
149
+ this.onSelectionChange = new EventEmitter();
150
+ /**
151
+ * Triggered after a widget is shown.
152
+ * @param {object} event Event object
153
+ * @param {Core.widget.Widget} event.source The widget
154
+ */
155
+ this.onShow = new EventEmitter();
156
+ /**
157
+ * Group item expanded or collapsed
158
+ * @param {object} event Event object
159
+ * @param {Core.data.Model} event.groupRecord Group record
160
+ * @param {boolean} event.collapse Collapsed (true) or expanded (false)
161
+ */
162
+ this.onToggleGroup = new EventEmitter();
163
+ /**
164
+ * Tree parent node expanded or collapsed
165
+ * @param {object} event Event object
166
+ * @param {Core.data.Model} event.record The parent record which has been toggled
167
+ * @param {boolean} event.collapse Collapsed (true) or expanded (false)
168
+ */
169
+ this.onToggleNode = new EventEmitter();
170
+ this.elementRef = element;
171
+ }
172
+ /**
173
+ * Create and append the underlying widget
174
+ */
175
+ ngOnInit() {
176
+ const me = this, { elementRef, bryntumConfig } = me, { instanceClass, instanceName, bryntumConfigs, bryntumEvents } = BryntumListComponent;
177
+ bryntumConfigs.filter(prop => prop in this).forEach(prop => {
178
+ // @ts-ignore
179
+ WrapperHelper.applyPropValue(bryntumConfig, prop, this[prop]);
180
+ if (['features', 'config'].includes(prop)) {
181
+ WrapperHelper.devWarningConfigProp(instanceName, prop);
182
+ }
183
+ });
184
+ // @ts-ignore
185
+ bryntumEvents.filter(event => this[event] && this[event].observers.length > 0).forEach(event => {
186
+ const uncapitalize = (str) => str.charAt(0).toLowerCase() + str.slice(1), eventName = (str) => uncapitalize(str.slice(2));
187
+ // @ts-ignore
188
+ bryntumConfig.listeners[eventName(event)] = e => {
189
+ // @ts-ignore
190
+ me[event].emit(e);
191
+ // EventEmitter does not return values in the normal way, work around it by setting `returnValue` flag
192
+ // in Angular listeners
193
+ return e.returnValue;
194
+ };
195
+ });
196
+ // If component has no container specified in config then use adopt to Wrapper's element
197
+ const containerParam = [
198
+ 'adopt',
199
+ 'appendTo',
200
+ 'insertAfter',
201
+ 'insertBefore'
202
+ // @ts-ignore
203
+ ].find(prop => bryntumConfig[prop]);
204
+ if (!containerParam) {
205
+ if (instanceName === 'Button' || elementRef.nativeElement.getRootNode() instanceof ShadowRoot) {
206
+ // Button should always be <a> or <button> inside owner element
207
+ bryntumConfig.appendTo = elementRef.nativeElement;
208
+ }
209
+ else {
210
+ bryntumConfig.adopt = elementRef.nativeElement;
211
+ }
212
+ }
213
+ else {
214
+ WrapperHelper.devWarningContainer(instanceName, containerParam);
215
+ }
216
+ // @ts-ignore
217
+ me.instance = instanceName === 'Widget' ? Widget.create(bryntumConfig) : new instanceClass(bryntumConfig);
218
+ }
219
+ /**
220
+ * Watch for changes
221
+ * @param changes
222
+ */
223
+ ngOnChanges(changes) {
224
+ const { instance } = this, { instanceName } = BryntumListComponent;
225
+ if (!instance) {
226
+ return;
227
+ }
228
+ // Iterate over all changes
229
+ Object.entries(changes).forEach(([prop, change]) => {
230
+ const newValue = change.currentValue, { instance } = this, { bryntumConfigsOnly, bryntumProps } = BryntumListComponent;
231
+ if (bryntumProps.includes(prop)) {
232
+ WrapperHelper.applyPropValue(instance, prop, newValue, false);
233
+ if (bryntumConfigsOnly.includes(prop)) {
234
+ WrapperHelper.devWarningUpdateProp(instanceName, prop);
235
+ }
236
+ }
237
+ });
238
+ }
239
+ /**
240
+ * Destroy the component
241
+ */
242
+ ngOnDestroy() {
243
+ // @ts-ignore
244
+ if (this.instance && this.instance.destroy) {
245
+ this.instance.destroy();
246
+ }
247
+ }
248
+ }
249
+ BryntumListComponent.instanceClass = List;
250
+ BryntumListComponent.instanceName = 'List';
251
+ BryntumListComponent.bryntumEvents = [
252
+ 'onBeforeDestroy',
253
+ 'onBeforeHide',
254
+ 'onBeforeItem',
255
+ 'onBeforeShow',
256
+ 'onCatchAll',
257
+ 'onDestroy',
258
+ 'onElementCreated',
259
+ 'onFocusIn',
260
+ 'onFocusOut',
261
+ 'onHide',
262
+ 'onItem',
263
+ 'onPaint',
264
+ 'onReadOnly',
265
+ 'onRecompose',
266
+ 'onResize',
267
+ 'onSelectionChange',
268
+ 'onShow',
269
+ 'onToggleGroup',
270
+ 'onToggleNode'
271
+ ];
272
+ BryntumListComponent.bryntumFeatureNames = [];
273
+ BryntumListComponent.bryntumConfigs = BryntumListComponent.bryntumFeatureNames.concat([
274
+ 'activateOnMouseover',
275
+ 'adopt',
276
+ 'align',
277
+ 'alignSelf',
278
+ 'allowGroupSelect',
279
+ 'anchor',
280
+ 'appendTo',
281
+ 'ariaDescription',
282
+ 'ariaLabel',
283
+ 'bubbleEvents',
284
+ 'callOnFunctions',
285
+ 'catchEventHandlerExceptions',
286
+ 'centered',
287
+ 'clearSelectionOnEmptySpaceClick',
288
+ 'cls',
289
+ 'collapsibleGroups',
290
+ 'color',
291
+ 'column',
292
+ 'config',
293
+ 'constrainTo',
294
+ 'content',
295
+ 'contentElementCls',
296
+ 'dataField',
297
+ 'dataset',
298
+ 'defaultBindProperty',
299
+ 'detectCSSCompatibilityIssues',
300
+ 'disabled',
301
+ 'displayField',
302
+ 'dock',
303
+ 'draggable',
304
+ 'elementAttributes',
305
+ 'emptyText',
306
+ 'extraData',
307
+ 'flex',
308
+ 'floating',
309
+ 'getItemCls',
310
+ 'getItemStyle',
311
+ 'groupHeaderTpl',
312
+ 'height',
313
+ 'hidden',
314
+ 'hideAnimation',
315
+ 'html',
316
+ 'htmlCls',
317
+ 'id',
318
+ 'ignoreParentReadOnly',
319
+ 'insertBefore',
320
+ 'insertFirst',
321
+ 'isSelectable',
322
+ 'items',
323
+ 'itemTpl',
324
+ 'keyMap',
325
+ 'listeners',
326
+ 'localeClass',
327
+ 'localizable',
328
+ 'localizableProperties',
329
+ 'margin',
330
+ 'maskDefaults',
331
+ 'masked',
332
+ 'maxHeight',
333
+ 'maximizeOnMobile',
334
+ 'maxWidth',
335
+ 'minHeight',
336
+ 'minWidth',
337
+ 'monitorResize',
338
+ 'multiSelect',
339
+ 'owner',
340
+ 'positioned',
341
+ 'preventTooltipOnTouch',
342
+ 'readOnly',
343
+ 'relayStoreEvents',
344
+ 'ripple',
345
+ 'rootElement',
346
+ 'rtl',
347
+ 'scrollable',
348
+ 'scrollAction',
349
+ 'selectAllItem',
350
+ 'selected',
351
+ 'showAnimation',
352
+ 'showTooltipWhenDisabled',
353
+ 'span',
354
+ 'store',
355
+ 'tab',
356
+ 'tag',
357
+ 'textAlign',
358
+ 'title',
359
+ 'toggleAllIfCtrlPressed',
360
+ 'tooltip',
361
+ 'tooltipTemplate',
362
+ 'type',
363
+ 'ui',
364
+ 'virtualize',
365
+ 'weight',
366
+ 'width',
367
+ 'x',
368
+ 'y'
369
+ ]);
370
+ BryntumListComponent.bryntumConfigsOnly = [
371
+ 'activateOnMouseover',
372
+ 'adopt',
373
+ 'align',
374
+ 'allowGroupSelect',
375
+ 'anchor',
376
+ 'ariaDescription',
377
+ 'ariaLabel',
378
+ 'bubbleEvents',
379
+ 'centered',
380
+ 'clearSelectionOnEmptySpaceClick',
381
+ 'color',
382
+ 'config',
383
+ 'constrainTo',
384
+ 'contentElementCls',
385
+ 'dataField',
386
+ 'defaultBindProperty',
387
+ 'detectCSSCompatibilityIssues',
388
+ 'displayField',
389
+ 'dock',
390
+ 'draggable',
391
+ 'elementAttributes',
392
+ 'floating',
393
+ 'getItemCls',
394
+ 'getItemStyle',
395
+ 'groupHeaderTpl',
396
+ 'hideAnimation',
397
+ 'htmlCls',
398
+ 'ignoreParentReadOnly',
399
+ 'isSelectable',
400
+ 'itemTpl',
401
+ 'listeners',
402
+ 'localeClass',
403
+ 'localizable',
404
+ 'localizableProperties',
405
+ 'maskDefaults',
406
+ 'masked',
407
+ 'monitorResize',
408
+ 'owner',
409
+ 'positioned',
410
+ 'preventTooltipOnTouch',
411
+ 'relayStoreEvents',
412
+ 'ripple',
413
+ 'rootElement',
414
+ 'scrollAction',
415
+ 'selectAllItem',
416
+ 'showAnimation',
417
+ 'showTooltipWhenDisabled',
418
+ 'tab',
419
+ 'tag',
420
+ 'textAlign',
421
+ 'tooltipTemplate',
422
+ 'type',
423
+ 'ui',
424
+ 'virtualize',
425
+ 'weight'
426
+ ];
427
+ BryntumListComponent.bryntumProps = BryntumListComponent.bryntumFeatureNames.concat([
428
+ 'alignSelf',
429
+ 'anchorSize',
430
+ 'appendTo',
431
+ 'callOnFunctions',
432
+ 'catchEventHandlerExceptions',
433
+ 'cls',
434
+ 'collapsibleGroups',
435
+ 'column',
436
+ 'content',
437
+ 'dataset',
438
+ 'disabled',
439
+ 'emptyText',
440
+ 'extraData',
441
+ 'flex',
442
+ 'focusVisible',
443
+ 'height',
444
+ 'hidden',
445
+ 'html',
446
+ 'id',
447
+ 'insertBefore',
448
+ 'insertFirst',
449
+ 'items',
450
+ 'keyMap',
451
+ 'margin',
452
+ 'maxHeight',
453
+ 'maximizeOnMobile',
454
+ 'maxWidth',
455
+ 'minHeight',
456
+ 'minWidth',
457
+ 'multiSelect',
458
+ 'parent',
459
+ 'readOnly',
460
+ 'rtl',
461
+ 'scrollable',
462
+ 'selected',
463
+ 'span',
464
+ 'store',
465
+ 'title',
466
+ 'toggleAllIfCtrlPressed',
467
+ 'tooltip',
468
+ 'width',
469
+ 'x',
470
+ 'y'
471
+ ]);
472
+ BryntumListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.0", ngImport: i0, type: BryntumListComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
473
+ BryntumListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.0", type: BryntumListComponent, selector: "bryntum-list", inputs: { activateOnMouseover: "activateOnMouseover", adopt: "adopt", align: "align", allowGroupSelect: "allowGroupSelect", anchor: "anchor", ariaDescription: "ariaDescription", ariaLabel: "ariaLabel", bubbleEvents: "bubbleEvents", centered: "centered", clearSelectionOnEmptySpaceClick: "clearSelectionOnEmptySpaceClick", color: "color", config: "config", constrainTo: "constrainTo", contentElementCls: "contentElementCls", dataField: "dataField", defaultBindProperty: "defaultBindProperty", detectCSSCompatibilityIssues: "detectCSSCompatibilityIssues", displayField: "displayField", dock: "dock", draggable: "draggable", elementAttributes: "elementAttributes", floating: "floating", getItemCls: "getItemCls", getItemStyle: "getItemStyle", groupHeaderTpl: "groupHeaderTpl", hideAnimation: "hideAnimation", htmlCls: "htmlCls", ignoreParentReadOnly: "ignoreParentReadOnly", isSelectable: "isSelectable", itemTpl: "itemTpl", listeners: "listeners", localeClass: "localeClass", localizable: "localizable", localizableProperties: "localizableProperties", maskDefaults: "maskDefaults", masked: "masked", monitorResize: "monitorResize", owner: "owner", positioned: "positioned", preventTooltipOnTouch: "preventTooltipOnTouch", relayStoreEvents: "relayStoreEvents", ripple: "ripple", rootElement: "rootElement", scrollAction: "scrollAction", selectAllItem: "selectAllItem", showAnimation: "showAnimation", showTooltipWhenDisabled: "showTooltipWhenDisabled", tab: "tab", tag: "tag", textAlign: "textAlign", tooltipTemplate: "tooltipTemplate", type: "type", ui: "ui", virtualize: "virtualize", weight: "weight", alignSelf: "alignSelf", appendTo: "appendTo", callOnFunctions: "callOnFunctions", catchEventHandlerExceptions: "catchEventHandlerExceptions", cls: "cls", collapsibleGroups: "collapsibleGroups", column: "column", content: "content", dataset: "dataset", disabled: "disabled", emptyText: "emptyText", extraData: "extraData", flex: "flex", height: "height", hidden: "hidden", html: "html", id: "id", insertBefore: "insertBefore", insertFirst: "insertFirst", items: "items", keyMap: "keyMap", margin: "margin", maxHeight: "maxHeight", maximizeOnMobile: "maximizeOnMobile", maxWidth: "maxWidth", minHeight: "minHeight", minWidth: "minWidth", multiSelect: "multiSelect", readOnly: "readOnly", rtl: "rtl", scrollable: "scrollable", selected: "selected", span: "span", store: "store", title: "title", toggleAllIfCtrlPressed: "toggleAllIfCtrlPressed", tooltip: "tooltip", width: "width", x: "x", y: "y", anchorSize: "anchorSize", focusVisible: "focusVisible", parent: "parent" }, outputs: { onBeforeDestroy: "onBeforeDestroy", onBeforeHide: "onBeforeHide", onBeforeItem: "onBeforeItem", onBeforeShow: "onBeforeShow", onCatchAll: "onCatchAll", onDestroy: "onDestroy", onElementCreated: "onElementCreated", onFocusIn: "onFocusIn", onFocusOut: "onFocusOut", onHide: "onHide", onItem: "onItem", onPaint: "onPaint", onReadOnly: "onReadOnly", onRecompose: "onRecompose", onResize: "onResize", onSelectionChange: "onSelectionChange", onShow: "onShow", onToggleGroup: "onToggleGroup", onToggleNode: "onToggleNode" }, usesOnChanges: true, ngImport: i0, template: '', isInline: true });
474
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.0", ngImport: i0, type: BryntumListComponent, decorators: [{
475
+ type: Component,
476
+ args: [{
477
+ selector: 'bryntum-list',
478
+ template: ''
479
+ }]
480
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { activateOnMouseover: [{
481
+ type: Input
482
+ }], adopt: [{
483
+ type: Input
484
+ }], align: [{
485
+ type: Input
486
+ }], allowGroupSelect: [{
487
+ type: Input
488
+ }], anchor: [{
489
+ type: Input
490
+ }], ariaDescription: [{
491
+ type: Input
492
+ }], ariaLabel: [{
493
+ type: Input
494
+ }], bubbleEvents: [{
495
+ type: Input
496
+ }], centered: [{
497
+ type: Input
498
+ }], clearSelectionOnEmptySpaceClick: [{
499
+ type: Input
500
+ }], color: [{
501
+ type: Input
502
+ }], config: [{
503
+ type: Input
504
+ }], constrainTo: [{
505
+ type: Input
506
+ }], contentElementCls: [{
507
+ type: Input
508
+ }], dataField: [{
509
+ type: Input
510
+ }], defaultBindProperty: [{
511
+ type: Input
512
+ }], detectCSSCompatibilityIssues: [{
513
+ type: Input
514
+ }], displayField: [{
515
+ type: Input
516
+ }], dock: [{
517
+ type: Input
518
+ }], draggable: [{
519
+ type: Input
520
+ }], elementAttributes: [{
521
+ type: Input
522
+ }], floating: [{
523
+ type: Input
524
+ }], getItemCls: [{
525
+ type: Input
526
+ }], getItemStyle: [{
527
+ type: Input
528
+ }], groupHeaderTpl: [{
529
+ type: Input
530
+ }], hideAnimation: [{
531
+ type: Input
532
+ }], htmlCls: [{
533
+ type: Input
534
+ }], ignoreParentReadOnly: [{
535
+ type: Input
536
+ }], isSelectable: [{
537
+ type: Input
538
+ }], itemTpl: [{
539
+ type: Input
540
+ }], listeners: [{
541
+ type: Input
542
+ }], localeClass: [{
543
+ type: Input
544
+ }], localizable: [{
545
+ type: Input
546
+ }], localizableProperties: [{
547
+ type: Input
548
+ }], maskDefaults: [{
549
+ type: Input
550
+ }], masked: [{
551
+ type: Input
552
+ }], monitorResize: [{
553
+ type: Input
554
+ }], owner: [{
555
+ type: Input
556
+ }], positioned: [{
557
+ type: Input
558
+ }], preventTooltipOnTouch: [{
559
+ type: Input
560
+ }], relayStoreEvents: [{
561
+ type: Input
562
+ }], ripple: [{
563
+ type: Input
564
+ }], rootElement: [{
565
+ type: Input
566
+ }], scrollAction: [{
567
+ type: Input
568
+ }], selectAllItem: [{
569
+ type: Input
570
+ }], showAnimation: [{
571
+ type: Input
572
+ }], showTooltipWhenDisabled: [{
573
+ type: Input
574
+ }], tab: [{
575
+ type: Input
576
+ }], tag: [{
577
+ type: Input
578
+ }], textAlign: [{
579
+ type: Input
580
+ }], tooltipTemplate: [{
581
+ type: Input
582
+ }], type: [{
583
+ type: Input
584
+ }], ui: [{
585
+ type: Input
586
+ }], virtualize: [{
587
+ type: Input
588
+ }], weight: [{
589
+ type: Input
590
+ }], alignSelf: [{
591
+ type: Input
592
+ }], appendTo: [{
593
+ type: Input
594
+ }], callOnFunctions: [{
595
+ type: Input
596
+ }], catchEventHandlerExceptions: [{
597
+ type: Input
598
+ }], cls: [{
599
+ type: Input
600
+ }], collapsibleGroups: [{
601
+ type: Input
602
+ }], column: [{
603
+ type: Input
604
+ }], content: [{
605
+ type: Input
606
+ }], dataset: [{
607
+ type: Input
608
+ }], disabled: [{
609
+ type: Input
610
+ }], emptyText: [{
611
+ type: Input
612
+ }], extraData: [{
613
+ type: Input
614
+ }], flex: [{
615
+ type: Input
616
+ }], height: [{
617
+ type: Input
618
+ }], hidden: [{
619
+ type: Input
620
+ }], html: [{
621
+ type: Input
622
+ }], id: [{
623
+ type: Input
624
+ }], insertBefore: [{
625
+ type: Input
626
+ }], insertFirst: [{
627
+ type: Input
628
+ }], items: [{
629
+ type: Input
630
+ }], keyMap: [{
631
+ type: Input
632
+ }], margin: [{
633
+ type: Input
634
+ }], maxHeight: [{
635
+ type: Input
636
+ }], maximizeOnMobile: [{
637
+ type: Input
638
+ }], maxWidth: [{
639
+ type: Input
640
+ }], minHeight: [{
641
+ type: Input
642
+ }], minWidth: [{
643
+ type: Input
644
+ }], multiSelect: [{
645
+ type: Input
646
+ }], readOnly: [{
647
+ type: Input
648
+ }], rtl: [{
649
+ type: Input
650
+ }], scrollable: [{
651
+ type: Input
652
+ }], selected: [{
653
+ type: Input
654
+ }], span: [{
655
+ type: Input
656
+ }], store: [{
657
+ type: Input
658
+ }], title: [{
659
+ type: Input
660
+ }], toggleAllIfCtrlPressed: [{
661
+ type: Input
662
+ }], tooltip: [{
663
+ type: Input
664
+ }], width: [{
665
+ type: Input
666
+ }], x: [{
667
+ type: Input
668
+ }], y: [{
669
+ type: Input
670
+ }], anchorSize: [{
671
+ type: Input
672
+ }], focusVisible: [{
673
+ type: Input
674
+ }], parent: [{
675
+ type: Input
676
+ }], onBeforeDestroy: [{
677
+ type: Output
678
+ }], onBeforeHide: [{
679
+ type: Output
680
+ }], onBeforeItem: [{
681
+ type: Output
682
+ }], onBeforeShow: [{
683
+ type: Output
684
+ }], onCatchAll: [{
685
+ type: Output
686
+ }], onDestroy: [{
687
+ type: Output
688
+ }], onElementCreated: [{
689
+ type: Output
690
+ }], onFocusIn: [{
691
+ type: Output
692
+ }], onFocusOut: [{
693
+ type: Output
694
+ }], onHide: [{
695
+ type: Output
696
+ }], onItem: [{
697
+ type: Output
698
+ }], onPaint: [{
699
+ type: Output
700
+ }], onReadOnly: [{
701
+ type: Output
702
+ }], onRecompose: [{
703
+ type: Output
704
+ }], onResize: [{
705
+ type: Output
706
+ }], onSelectionChange: [{
707
+ type: Output
708
+ }], onShow: [{
709
+ type: Output
710
+ }], onToggleGroup: [{
711
+ type: Output
712
+ }], onToggleNode: [{
713
+ type: Output
714
+ }] } });
715
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJ5bnR1bS1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2NvbXBvbmVudC9zcmMvbGliL2JyeW50dW0tbGlzdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsc0RBQXNEO0FBQ3REOztHQUVHO0FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBa0QsTUFBTSxlQUFlLENBQUM7QUFFbkksT0FBTyxhQUFhLE1BQU0sa0JBQWtCLENBQUM7QUFFN0MsT0FBTyxFQUEwRSxJQUFJLEVBQStJLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUF5akJsUSxNQUFNLE9BQU8sb0JBQW9CO0lBc1A3QixZQUFZLE9BQW1CO1FBVHZCLGtCQUFhLEdBQUc7WUFDcEIsS0FBSyxFQUFjLFNBQVM7WUFDNUIsUUFBUSxFQUFXLFNBQVM7WUFDNUIsSUFBSSxFQUFlLFNBQVM7WUFDNUIsZ0JBQWdCLEVBQUcsSUFBSTtZQUN2QixRQUFRLEVBQVcsRUFBRTtZQUNyQixTQUFTLEVBQVUsRUFBRTtTQUN4QixDQUFDO1FBdUhGLGtCQUFrQjtRQUNsQjs7OztXQUlHO1FBQ08sb0JBQWUsR0FBUSxJQUFJLFlBQVksRUFBOEMsQ0FBQztRQUNoRzs7OztXQUlHO1FBQ08saUJBQVksR0FBUSxJQUFJLFlBQVksRUFBeUUsQ0FBQztRQUN4SDs7Ozs7Ozs7OztXQVVHO1FBQ08saUJBQVksR0FBUSxJQUFJLFlBQVksRUFBc0ksQ0FBQztRQUNyTDs7OztXQUlHO1FBQ08saUJBQVksR0FBUSxJQUFJLFlBQVksRUFBNkUsQ0FBQztRQUM1SDs7Ozs7OztXQU9HO1FBQ08sZUFBVSxHQUFRLElBQUksWUFBWSxFQUFnRSxDQUFDO1FBQzdHOzs7O1dBSUc7UUFDTyxjQUFTLEdBQVEsSUFBSSxZQUFZLEVBQThDLENBQUM7UUFDMUY7Ozs7V0FJRztRQUNPLHFCQUFnQixHQUFRLElBQUksWUFB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O2dCQU1HLFlBQVk7c0JBQXJCLE1BQU07Z0JBWUcsWUFBWTtzQkFBckIsTUFBTTtnQkFNRyxZQUFZO3NCQUFyQixNQUFNO2dCQVNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBTUcsU0FBUztzQkFBbEIsTUFBTTtnQkFNRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBV0csU0FBUztzQkFBbEIsTUFBTTtnQkFhRyxVQUFVO3NCQUFuQixNQUFNO2dCQU1HLE1BQU07c0JBQWYsTUFBTTtnQkFXRyxNQUFNO3NCQUFmLE1BQU07Z0JBVUcsT0FBTztzQkFBaEIsTUFBTTtnQkFNRyxVQUFVO3NCQUFuQixNQUFNO2dCQUtHLFdBQVc7c0JBQXBCLE1BQU07Z0JBVUcsUUFBUTtzQkFBakIsTUFBTTtnQkFPRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBTUcsTUFBTTtzQkFBZixNQUFNO2dCQU9HLGFBQWE7c0JBQXRCLE1BQU07Z0JBT0csWUFBWTtzQkFBckIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuLyoqXG4gKiBBbmd1bGFyIHdyYXBwZXIgZm9yIEJyeW50dW0gTGlzdFxuICovXG5cbmltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBPdXRwdXQsIElucHV0LCBTaW1wbGVDaGFuZ2UsIFNpbXBsZUNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCBXcmFwcGVySGVscGVyIGZyb20gJy4vd3JhcHBlci5oZWxwZXInO1xuXG5pbXBvcnQgeyBBbGlnblNwZWMsIEJhc2UsIENvbGxlY3Rpb24sIENvbGxlY3Rpb25Db25maWcsIERvbUNvbmZpZywgS2V5TWFwQ29uZmlnLCBMaXN0LCBMaXN0TGlzdGVuZXJzLCBNYXNrQ29uZmlnLCBNb2RlbCwgTW9kZWxDb25maWcsIFJlY3RhbmdsZSwgU2Nyb2xsZXIsIFNjcm9sbGVyQ29uZmlnLCBTdG9yZSwgU3RvcmVDb25maWcsIFRhYkNvbmZpZywgVG9vbHRpcENvbmZpZywgVnVlQ29uZmlnLCBXaWRnZXQgfSBmcm9tICdAYnJ5bnR1bS9ncmlkJztcblxuaW1wb3J0IHsgU3RyaW5nSGVscGVyIH0gZnJvbSAnQGJyeW50dW0vZ3JpZCc7XG5cbmV4cG9ydCB0eXBlIEJyeW50dW1MaXN0UHJvcHMgPSB7XG4gICAgLy8gQ29uZmlnc1xuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSBhcyBgdHJ1ZWAgdG8gYWN0aXZhdGUgaXRlbXMgb24gbW91c2VvdmVyLiBUaGlzIGlzIHVzZWQgYnkgdGhlIENvbWJvXG4gICAgICogZmllbGQgd2hlbiB1c2luZyBhIExpc3QgYXMgaXRzIGRyb3Bkb3duLlxuICAgICAqL1xuICAgIGFjdGl2YXRlT25Nb3VzZW92ZXIgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBFbGVtZW50IChvciBlbGVtZW50IGlkKSB0byBhZG9wdCBhcyB0aGlzIFdpZGdldCdzIGVuY2Fwc3VsYXRpbmcgZWxlbWVudC4gVGhlIHdpZGdldCdzXG4gICAgICogY29udGVudCB3aWxsIGJlIHBsYWNlZCBpbnNpZGUgdGhpcyBlbGVtZW50LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvTGlzdCNjb25maWctYWRvcHQpXG4gICAgICovXG4gICAgYWRvcHQgPyA6IEhUTUxFbGVtZW50fHN0cmluZ1xuICAgIC8qKlxuICAgICAqICpPbmx5IHZhbGlkIGlmIHRoaXMgV2lkZ2V0IGlzIFtmbG9hdGluZ10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctZmxvYXRpbmcpLipcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0xpc3QjY29uZmlnLWFsaWduKVxuICAgICAqL1xuICAgIGFsaWduID8gOiBBbGlnblNwZWN8c3RyaW5nXG4gICAgLyoqXG4gICAgICogV2hlbiB0aGlzIHdpZGdldCBpcyBhIGNoaWxkIG9mIGEgW0NvbnRhaW5lcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0NvbnRhaW5lciksIGl0IHdpbGwgYnkgZGVmYXVsdCBiZSBwYXJ0aWNpcGF0aW5nIGluIGFcbiAgICAgKiBmbGV4Ym94IGxheW91dC4gVGhpcyBjb25maWcgYWxsb3dzIHlvdSB0byBzZXQgdGhpcyB3aWRnZXQnc1xuICAgICAqIFthbGlnbi1zZWxmXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvYWxpZ24tc2VsZikgc3R5bGUuXG4gICAgICovXG4gICAgYWxpZ25TZWxmID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBDb25maWd1cmUgYXMgYHRydWVgIHRvIGFsbG93IHNlbGVjdGluZyBncm91cHMgKGFsbCB0aGUgZ3JvdXAgY2hpbGQgcmVjb3JkcyB3aWxsIGJlIHRvZ2dsZWQpLiBPbmx5XG4gICAgICogYXBwbGljYWJsZSB3aGVuIHRoZSBzdG9yZSBpcyBncm91cGVkLlxuICAgICAqL1xuICAgIGFsbG93R3JvdXBTZWxlY3QgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiAqT25seSB2YWxpZCBpZiB0aGlzIFdpZGdldCBpcyBbZmxvYXRpbmddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLWZsb2F0aW5nKSBhbmQgYmVpbmcgc2hvd24gdGhyb3VnaCBbc2hvd0J5XSgjQ29yZS93aWRnZXQvV2lkZ2V0I2Z1bmN0aW9uLXNob3dCeSkuKlxuICAgICAqIGB0cnVlYCB0byBzaG93IGEgY29ubmVjdG9yIGFycm93IHBvaW50aW5nIHRvIHRoZSBhbGlnbiB0YXJnZXQuXG4gICAgICovXG4gICAgYW5jaG9yID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogRWxlbWVudCAob3IgdGhlIGlkIG9mIGFuIGVsZW1lbnQpIHRvIGFwcGVuZCB0aGlzIHdpZGdldCdzIGVsZW1lbnQgdG8uIENhbiBiZSBjb25maWd1cmVkLCBvciBzZXQgb25jZSBhdFxuICAgICAqIHJ1bnRpbWUuIFRvIGFjY2VzcyB0aGUgZWxlbWVudCBvZiBhIHJlbmRlcmVkIHdpZGdldCwgc2VlIFtlbGVtZW50XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I3Byb3BlcnR5LWVsZW1lbnQpLlxuICAgICAqL1xuICAgIGFwcGVuZFRvID8gOiBIVE1MRWxlbWVudHxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBIGxvY2FsaXphYmxlIHN0cmluZyAoTWF5IGNvbnRhaW4gYCdMe30nYCB0b2tlbnMgd2hpY2ggcmVzb2x2ZSBpbiB0aGUgbG9jYWxlIGZpbGUpIHRvIGluamVjdFxuICAgICAqIGludG8gYW4gZWxlbWVudCB3aGljaCB3aWxsIGJlIGxpbmtlZCB1c2luZyB0aGUgYGFyaWEtZGVzY3JpYmVkYnlgIGF0dHJpYnV0ZS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0xpc3QjY29uZmlnLWFyaWFEZXNjcmlwdGlvbilcbiAgICAgKi9cbiAgICBhcmlhRGVzY3JpcHRpb24gPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIEEgbG9jYWxpemFibGUgc3RyaW5nIChNYXkgY29udGFpbiBgJ0x7fSdgIHRva2VucyB3aGljaCByZXNvbHZlIGluIHRoZSBsb2NhbGUgZmlsZSkgdG8gaW5qZWN0IGFzXG4gICAgICogdGhlIGBhcmlhLWxhYmVsYCBhdHRyaWJ1dGUuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9MaXN0I2NvbmZpZy1hcmlhTGFiZWwpXG4gICAgICovXG4gICAgYXJpYUxhYmVsID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3Qgd2hlcmUgcHJvcGVydHkgbmFtZXMgd2l0aCBhIHRydXRoeSB2YWx1ZSBpbmRpY2F0ZSB3aGljaCBldmVudHMgc2hvdWxkIGJ1YmJsZSB1cCB0aGUgb3duZXJzaGlwXG4gICAgICogaGllcmFyY2h5IHdoZW4gdHJpZ2dlcmVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvTGlzdCNjb25maWctYnViYmxlRXZlbnRzKVxuICAgICAqL1xuICAgIGJ1YmJsZUV2ZW50cyA/IDogb2JqZWN0XG4gICAgLyoqXG4gICAgICogU2V0IHRvIGBmYWxzZWAgdG8gbm90IGNhbGwgb25YWFggbWV0aG9kIG5hbWVzIChlLmcuIGBvblNob3dgLCBgb25DbGlja2ApLCBhcyBhbiBlYXN5IHdheSB0byBsaXN0ZW4gZm9yIGV2ZW50cy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0xpc3QjY29uZmlnLWNhbGxPbkZ1bmN0aW9ucylcbiAgICAgKi9cbiAgICBjYWxsT25GdW5jdGlvbnMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBCeSBkZWZhdWx0LCBpZiBhbiBldmVudCBoYW5kbGVyIHRocm93cyBhbiBleGNlcHRpb24sIHRoZSBlcnJvciBwcm9wYWdhdGVzIHVwIHRoZSBzdGFjayBhbmQgdGhlXG4gICAgICogYXBwbGljYXRpb24gc3RhdGUgaXMgdW5kZWZpbmVkLiBDb2RlIHdoaWNoIGZvbGxvd3MgdGhlIGV2ZW50IGhhbmRsZXIgd2lsbCAqbm90KiBiZSBleGVjdXRlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0xpc3QjY29uZmlnLWNhdGNoRXZlbnRIYW5kbGVyRXhjZXB0aW9ucylcbiAgICAgKi9cbiAgICBjYXRjaEV2ZW50SGFuZGxlckV4Y2VwdGlvbnMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiAqT25seSB2YWxpZCBpZiB0aGlzIFdpZGdldCBpcyBbZmxvYXRpbmddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLWZsb2F0aW5nKS4qXG4gICAgICogU2V0IHRvIGB0cnVlYCB0byBjZW50cmUgdGhlIFdpZGdldCBpbiBicm93c2VyIHZpZXdwb3J0IHNwYWNlLlxuICAgICAqL1xuICAgIGNlbnRlcmVkID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlIGFzIGB0cnVlYCB0byBjbGVhciBzZWxlY3Rpb24gd2hlbiBjbGlja2luZyBvbiBlbXB0eSBzcGFjZSBpbnNpZGUgdGhlIExpc3TCtHMgZWxlbWVudC5cbiAgICAgKi9cbiAgICBjbGVhclNlbGVjdGlvbk9uRW1wdHlTcGFjZUNsaWNrID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQ3VzdG9tIENTUyBjbGFzc2VzIHRvIGFkZCB0byBlbGVtZW50LlxuICAgICAqIE1heSBiZSBzcGVjaWZpZWQgYXMgYSBzcGFjZSBzZXBhcmF0ZWQgc3RyaW5nLCBvciBhcyBhbiBvYmplY3QgaW4gd2hpY2ggcHJvcGVydHkgbmFtZXNcbiAgICAgKiB3aXRoIHRydXRoeSB2YWx1ZXMgYXJlIHVzZWQgYXMgdGhlIGNsYXNzIG5hbWVzOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvTGlzdCNjb25maWctY2xzKVxuICAgICAqL1xuICAgIGNscyA/IDogc3RyaW5nfG9iamVjdFxuICAgIC8qKlxuICAgICAqIFRydWUgdG8gYWRkIGEgY29sbGFwc2UgaWNvbiB0byB0b2dnbGUgZ3JvdXBzIGJlaW5nIGNvbGxhcHNlZCBvciBleHBhbmRlZFxuICAgICAqL1xuICAgIGNvbGxhcHNpYmxlR3JvdXBzID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQXBwbGllcyB0aGUgc3BlY2lmaWVkIGNvbG9yIHRvIHRoZSB3aWRnZXQsIGJ5IHNldHRpbmcgdGhlIGAtLWItcHJpbWFyeWAgQ1NTIHZhcmlhYmxlIGluIHRoZSB3aWRnZXRzXG4gICAgICogYHN0eWxlYCBibG9jay5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0xpc3QjY29uZmlnLWNvbG9yKVxuICAgICAqL1xuICAgIGNvbG9yID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBQcm9ncmFtbWF0aWMgY29udHJvbCBvdmVyIHdoaWNoIGNvbHVtbiB0byBzdGFydCBpbiB3aGVuIHVzZWQgaW4gYSBncmlkIGxheW91dC5cbiAgICAgKi9cbiAgICBjb2x1bW4gPyA6IG51bWJlclxuICAgIGNvbmZpZyA/IDogb2JqZWN0XG4gICAgLyoqXG4gICAgICogKk9ubHkgdmFsaWQgaWYgdGhpcyBXaWRnZXQgaXMgW2Zsb2F0aW5nXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1mbG9hdGluZykgb3IgW3Bvc2l0aW9uZWRdKCNDb3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLXBvc2l0aW9uZWQpLipcbiAgICAgKiBFbGVtZW50LCBXaWRnZXQgb3IgUmVjdGFuZ2xlIHRvIHdoaWNoIHRoaXMgV2lkZ2V0IGlzIGNvbnN0cmFpbmVkLlxuICAgICAqL1xuICAgIGNvbnN0cmFpblRvID8gOiBIVE1MRWxlbWVudHxXaWRnZXR8UmVjdGFuZ2xlXG4gICAgLyoqXG4gICAgICogVGhlIEhUTUwgY29udGVudCB0aGF0IGNvZXhpc3RzIHdpdGggc2libGluZyBlbGVtZW50cyB3aGljaCBtYXkgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZVxuICAgICAqIFtjb250ZW50RWxlbWVudF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNwcm9wZXJ0eS1jb250ZW50RWxlbWVudCkgYnkgcGx1Z2lucyBhbmQgZmVhdHVyZXMuXG4gICAgICogV2hlbiBzcGVjaWZ5aW5nIGh0bWwsIHRoaXMgd2lkZ2V0J3MgZWxlbWVudCB3aWxsIGFsc28gaGF2ZSB0aGUgW2h0bWxDbHNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLWh0bWxDbHMpXG4gICAgICogY2xhc3MgYWRkZWQgdG8gaXRzIGNsYXNzTGlzdCwgdG8gYWxsb3cgdGFyZ2V0ZWQgc3R5bGluZy5cbiAgICAgKi9cbiAgICBjb250ZW50ID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBDdXN0b20gQ1NTIGNsYXNzZXMgdG8gYWRkIHRvIHRoZSBbY29udGVudEVsZW1lbnRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjcHJvcGVydHktY29udGVudEVsZW1lbnQpLlxuICAgICAqIE1heSBiZSBzcGVjaWZpZWQgYXMgYSBzcGFjZSBzZXBhcmF0ZWQgc3RyaW5nLCBvciBhcyBhbiBvYmplY3QgaW4gd2hpY2ggcHJvcGVydHkgbmFtZXNcbiAgICAgKiB3aXRoIHRydXRoeSB2YWx1ZXMgYXJlIHVzZWQgYXMgdGhlIGNsYXNzIG5hbWVzOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvTGlzdCNjb25maWctY29udGVudEVsZW1lbnRDbHMpXG4gICAgICovXG4gICAgY29udGVudEVsZW1lbnRDbHMgPyA6IHN0cmluZ3xvYmplY3RcbiAgICAvKipcbiAgICAgKiBXaGVuIHRoaXMgV2lkZ2V0IGNvbmZpZ3VyYXRpb24gaXMgdXNlZCBpbiB0aGUgR3JpZCdzIFJvd0V4cGFuZGVyIGZlYXR1cmUncyBgd2lkZ2V0YCBjb25maWcsIHByb3ZpZGUgdGhlXG4gICAgICogZmllbGQgb24gdGhlIGV4cGFuZGVkIHJlY29yZCB0byB1c2UgZm9yIHBvcHVsYXRpbmcgdGhpcyB3aWRnZXQncyBzdG9yZSAoaWYgYXBwbGljYWJsZSlcbiAgICAgKi9cbiAgICBkYXRhRmllbGQgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIE9iamVjdCB0byBhcHBseSB0byBlbGVtZW50cyBkYXRhc2V0IChlYWNoIGtleSB3aWxsIGJlIHVzZWQgYXMgYSBkYXRhLWF0dHJpYnV0ZSBvbiB0aGUgZWxlbWVudClcbiAgICAgKi9cbiAgICBkYXRhc2V0ID8gOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldCB3aGVuIGEgc2luZ2xlIHZhbHVlIGlzIHRvIGJlIGFwcGxpZWQgdG8gdGhpcyBXaWRnZXQuIFN1Y2ggYXMgd2hlbiB1c2VkXG4gICAgICogaW4gYSBncmlkIFdpZGdldENvbHVtbiwgdGhpcyBpcyB0aGUgcHJvcGVydHkgdG8gd2hpY2ggdGhlIGNvbHVtbidzIGBmaWVsZGAgaXMgYXBwbGllZC5cbiAgICAgKi9cbiAgICBkZWZhdWx0QmluZFByb3BlcnR5ID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBDaGVjayBmb3IgQ1NTIGNvbXBhdGliaWxpdHkgaXNzdWVzIHdoZW4gdXBncmFkaW5nIHRvIHY3LiBQZXJmb3JtcyB0aGUgZm9sbG93aW5nIGNoZWNrczpcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0xpc3QjY29uZmlnLWRldGVjdENTU0NvbXBhdGliaWxpdHlJc3N1ZXMpXG4gICAgICovXG4gICAgZGV0ZWN0Q1NTQ29tcGF0aWJpbGl0eUlzc3VlcyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIERpc2FibGUgb3IgZW5hYmxlIHRoZSB3aWRnZXQuIEl0IGlzIHNpbWlsYXIgdG8gW3JlYWRPbmx5XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1yZWFkT25seSkgZXhjZXB0IGEgZGlzYWJsZWQgd2lkZ2V0XG4gICAgICogY2Fubm90IGJlIGZvY3VzZWQsIHVzZXMgYSBkaWZmZXJlbnQgcmVuZGl0aW9uICh1c3VhbGx5IGdyZXlpc2gpIGFuZCBkb2VzIG5vdCBhbGxvdyBzZWxlY3RpbmcgaXRzIHZhbHVlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvTGlzdCNjb25maWctZGlzYWJsZWQpXG4gICAgICovXG4gICAgZGlzYWJsZWQgPyA6IGJvb2xlYW58J2luZXJ0J1xuICAgIC8qKlxuICAgICAqIFRoZSBtb2RlbCBmaWVsZCB0byByZW5kZXIgaW50byBlYWNoIGxpc3QgaXRlbVxuICAgICAqL1xuICAgIGRpc3BsYXlGaWVsZCA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogQ29udHJvbHMgdGhlIHBsYWNlbWVudCBvZiB0aGlzIHdpZGdldCB3aGVuIGl0IGlzIGFkZGVkIHRvIGEgW3BhbmVsJ3MgXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwpXG4gICAgICogW3N0cmlwcyBjb2xsZWN0aW9uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwjY29uZmlnLXN0cmlwcykuIFR5cGljYWwgdmFsdWVzIGZvciB0aGlzIGNvbmZpZyBhcmUgYCd0b3AnYCxcbiAgICAgKiBgJ2JvdHRvbSdgLCBgJ2xlZnQnYCwgb3IgYCdyaWdodCdgLCB3aGljaCBjYXVzZSB0aGUgd2lkZ2V0IHRvIGJlIHBsYWNlZCBvbiB0aGF0IHNpZGUgb2YgdGhlIHBhbmVsJ3NcbiAgICAgKiBib2R5LiBTdWNoIHdpZGdldHMgYXJlIGNhbGxlZCBcImVkZ2Ugc3RyaXBzXCIuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9MaXN0I2NvbmZpZy1kb2NrKVxuICAgICAqL1xuICAgIGRvY2sgPyA6ICd0b3AnfCdib3R0b20nfCdsZWZ0J3wncmlnaHQnfCdzdGFydCd8J2VuZCd8J2hlYWRlcid8J3ByZS1oZWFkZXInfG9iamVjdFxuICAgIC8qKlxuICAgICAqICpPbmx5IHZhbGlkIGlmIHRoaXMgV2lkZ2V0IGlzIFtmbG9hdGluZ10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctZmxvYXRpbmcpLipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIGJlIGFibGUgdG8gZHJhZyBhIHdpZGdldCBmcmVlbHkgb24gdGhlIHBhZ2UuIE9yIHNldCB0byBhbiBvYmplY3Qgd2l0aCBhIMK0aGFuZGxlU2VsZWN0b3LCtFxuICAgICAqIHByb3BlcnR5IHdoaWNoIGNvbnRyb2xzIHdoZW4gYSBkcmFnIHNob3VsZCBzdGFydC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0xpc3QjY29uZmlnLWRyYWdnYWJsZSlcbiAgICAgKi9cbiAgICBkcmFnZ2FibGUgPyA6IGJvb2xlYW58e1xuICAgICAgICBoYW5kbGVTZWxlY3Rvcj86IHN0cmluZ1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3Qgc3BlY2lmeWluZyBhdHRyaWJ1dGVzIHRvIGFzc2lnbiB0byB0aGUgcm9vdCBlbGVtZW50IG9mIHRoaXMgd2lkZ2V0LlxuICAgICAqIFNldCBgbnVsbGAgdmFsdWUgdG8gYXR0cmlidXRlIHRvIHJlbW92ZSBpdC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0xpc3QjY29uZmlnLWVsZW1lbnRBdHRyaWJ1dGVzKVxuICAgICAqL1xuICAgIGVsZW1lbnRBdHRyaWJ1dGVzID8gOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmd8bnVsbD5cbiAgICAvKipcbiAgICAgKiBUaGUgdGV4dCB0byBzaG93IHdoZW4gdGhlIGxpc3QgaXMgZW1wdHkuIElmIG5vdCBzZXQsIHRoZSBsaXN0IHdpbGwgYmUgZW1wdHkuXG4gICAgICovXG4gICAgZW1wdHlUZXh0ID8gOiBzdHJpbmdcbiAgICBleHRyYURhdGEgPyA6IGFueVxuICAgIC8qKlxuICAgICAqIFdoZW4gdGhpcyB3aWRnZXQgaXMgYSBjaGlsZCBvZiBhIFtDb250YWluZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db250YWluZXIpLCBpdCB3aWxsIGJ5IGRlZmF1bHQgYmUgcGFydGljaXBhdGluZyBpbiBhXG4gICAgICogZmxleGJveCBsYXlvdXQuIFRoaXMgY29uZmlnIGFsbG93cyB5b3UgdG8gc2V0IHRoaXMgd2lkZ2V0J3NcbiAgICAgKiBbZmxleF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL2ZsZXgpIHN0eWxlLlxuICAgICAqIFRoaXMgbWF5IGJlIGNvbmZpZ3VyZWQgYXMgYSBzaW5nbGUgbnVtYmVyIG9yIGEgYCZsdDtmbGV4LWdyb3cmZ3Q7ICZsdDtmbGV4LXNocmluayZndDsgJmx0O2ZsZXgtYmFzaXMmZ3Q7YCBmb3JtYXQgc3RyaW5nLlxuICAgICAqIG51bWVyaWMtb25seSB2YWx1ZXMgYXJlIGludGVycHJldGVkIGFzIHRoZSBgZmxleC1ncm93YCB2YWx1ZS5cbiAgICAgKi9cbiAgICBmbGV4ID8gOiBudW1iZXJ8c3RyaW5nXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGB0cnVlYCB0byBtb3ZlIHRoZSB3aWRnZXQgb3V0IG9mIHRoZSBkb2N1bWVudCBmbG93IGFuZCBwb3NpdGlvbiBpdFxuICAgICAqIGFic29sdXRlbHkgaW4gYnJvd3NlciB2aWV3cG9ydCBzcGFjZS5cbiAgICAgKi9cbiAgICBmbG9hdGluZyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSB0aGlzIGFzIGEgZnVuY3Rpb24gb3IgdGhlIG5hbWUgb2YgYSBmdW5jdGlvbiwgd2hpY2ggd2hlbiBwYXNzZWQgYSByZWNvcmQgaW4gdGhlXG4gICAgICogbGlzdCwgcmV0dXJucyBhIENTUyBjbGFzcyBuYW1lIHN0cmluZyB0byBhcHBseSB0byBpdHMgbGlzdCBpdGVtLlxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsfSByZWNvcmQgVGhlIHJlY29yZFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgZ2V0SXRlbUNscyA/IDogKChyZWNvcmQ6IE1vZGVsKSA9PiBzdHJpbmcpfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSB0aGlzIGFzIGEgZnVuY3Rpb24gb3IgdGhlIG5hbWUgb2YgYSBmdW5jdGlvbiwgd2hpY2ggd2hlbiBwYXNzZWQgYSByZWNvcmQgaW4gdGhlXG4gICAgICogbGlzdCwgcmV0dXJucyBhIHN0eWxlIHN0cmluZyB0byBhcHBseSB0byBpdHMgbGlzdCBpdGVtLlxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsfSByZWNvcmQgVGhlIHJlY29yZFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgZ2V0SXRlbVN0eWxlID8gOiAoKHJlY29yZDogTW9kZWwpID0+IHN0cmluZyl8c3RyaW5nXG4gICAgLyoqXG4gICAgICogVGVtcGxhdGUgZnVuY3Rpb24gd2hpY2ggaXMgcGFzc2VkIGEgZ3JvdXAgcmVjb3JkIGFuZCB0aGUgdXBwZXJjYXNlZCBncm91cCBmaWVsZCBuYW1lLiBUaGUgdGV4dCByZXR1cm5lZFxuICAgICAqIHdpbGwgYmUgcmVuZGVyZWQgYXMgdGhlIGdyb3VwIGhlYWRlci5cbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gcmVjb3JkIFRoZSByZWNvcmRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZ3JvdXBOYW1lIFRoZSBjdXJyZW50IGdyb3VwIG5hbWVcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIGdyb3VwSGVhZGVyVHBsID8gOiAocmVjb3JkOiBNb2RlbCwgZ3JvdXBOYW1lOiBzdHJpbmcpID0+IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFdpZGdldCdzIGhlaWdodCwgdXNlZCB0byBzZXQgZWxlbWVudCBgc3R5bGUuaGVpZ2h0YC4gRWl0aGVyIHNwZWNpZnkgYSB2YWxpZCBoZWlnaHQgc3RyaW5nIG9yIGEgbnVtYmVyLFxuICAgICAqIHdoaWNoIHdpbGwgZ2V0ICdweCcgYXBwZW5kZWQuIFdlIHJlY29tbWVuZCB1c2luZyBDU1MgYXMgdGhlIHByaW1hcnkgd2F5IHRvIGNvbnRyb2wgaGVpZ2h0LCBidXQgaW4gc29tZVxuICAgICAqIGNhc2VzIHRoaXMgY29uZmlnIGlzIGNvbnZlbmllbnQuXG4gICAgICovXG4gICAgaGVpZ2h0ID8gOiBzdHJpbmd8bnVtYmVyXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlIHdpdGggdHJ1ZSB0byBtYWtlIHdpZGdldCBpbml0aWFsbHkgaGlkZGVuLlxuICAgICAqL1xuICAgIGhpZGRlbiA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqICpPbmx5IHZhbGlkIGlmIHRoaXMgV2lkZ2V0IGlzIFtmbG9hdGluZ10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctZmxvYXRpbmcpLipcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0xpc3QjY29uZmlnLWhpZGVBbmltYXRpb24pXG4gICAgICovXG4gICAgaGlkZUFuaW1hdGlvbiA/IDogYm9vbGVhbnxvYmplY3RcbiAgICAvKipcbiAgICAgKiBUaGUgSFRNTCB0byBkaXNwbGF5IGluaXRpYWxseSBvciBhIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgbWFya3VwIChjYWxsZWQgYXQgd2lkZ2V0IGNvbnN0cnVjdGlvbiB0aW1lKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0xpc3QjY29uZmlnLWh0bWwpXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IHdpZGdldCBUaGUgY2FsbGluZyBXaWRnZXRcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgICAqL1xuICAgIGh0bWwgPyA6IHN0cmluZ3woKHdpZGdldDogV2lkZ2V0KSA9PiBzdHJpbmcpfERvbUNvbmZpZ3xEb21Db25maWdbXXxWdWVDb25maWdcbiAgICAvKipcbiAgICAgKiBUaGUgQ1NTIGNsYXNzKGVzKSB0byBhZGQgd2hlbiBIVE1MIGNvbnRlbnQgaXMgYmVpbmcgYXBwbGllZCB0byB0aGlzIHdpZGdldC5cbiAgICAgKi9cbiAgICBodG1sQ2xzID8gOiBzdHJpbmd8b2JqZWN0XG4gICAgLyoqXG4gICAgICogV2lkZ2V0IGlkLCBpZiBub3Qgc3BlY2lmaWVkIG9uZSB3aWxsIGJlIGdlbmVyYXRlZC4gQWxzbyB1c2VkIGZvciBsb29rdXBzIHRocm91Z2ggV2lkZ2V0LmdldEJ5SWRcbiAgICAgKi9cbiAgICBpZCA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgd2lkZ2V0cyByZWFkLW9ubHkgc3RhdGUgc2hvdWxkIGJlIGNvbnRyb2xsZWQgYnkgaXRzIHBhcmVudC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0xpc3QjY29uZmlnLWlnbm9yZVBhcmVudFJlYWRPbmx5KVxuICAgICAqL1xuICAgIGlnbm9yZVBhcmVudFJlYWRPbmx5ID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogRWxlbWVudCAob3IgZWxlbWVudCBpZCkgdG8gaW5zZXJ0IHRoaXMgd2lkZ2V0IGJlZm9yZS4gSWYgcHJvdmlkZWQsIFthcHBlbmRUb10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctYXBwZW5kVG8pIGNvbmZpZyBpcyBpZ25vcmVkLlxuICAgICAqL1xuICAgIGluc2VydEJlZm9yZSA/IDogSFRNTEVsZW1lbnR8c3RyaW5nXG4gICAgLyoqXG4gICAgICogRWxlbWVudCAob3IgZWxlbWVudCBpZCkgdG8gYXBwZW5kIHRoaXMgd2lkZ2V0IGVsZW1lbnQgdG8sIGFzIGEgZmlyc3QgY2hpbGQuIElmIHByb3ZpZGVkLCBbYXBwZW5kVG9dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLWFwcGVuZFRvKSBjb25maWcgaXMgaWdub3JlZC5cbiAgICAgKi9cbiAgICBpbnNlcnRGaXJzdCA/IDogSFRNTEVsZW1lbnR8c3RyaW5nXG4gICAgLyoqXG4gICAgICogQSBmdW5jdGlvbiwgb3IgdGhlIG5hbWUgb2YgYSBmdW5jdGlvbiBpbiB0aGUgb3duZXJzaGlwIGhpZXJhcmNoeSB3aGljaCBpcyB1c2VkIHRvIGRldGVybWluZVxuICAgICAqIHdoZXRoZXIgYSByZWNvcmQgaXMgc2VsZWN0YWJsZS4gQnkgZGVmYXVsdCwgYWxsIHJlY29yZHMgYXJlIHNlbGVjdGFibGUgZXhjZXB0IGdyb3VwIGhlYWRlclxuICAgICAqIHJlY29yZHMgaW4gYSBncm91cGVkIHN0b3JlLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHJlY29yZCBpcyBzZWxlY3RhYmxlXG4gICAgICovXG4gICAgaXNTZWxlY3RhYmxlID8gOiAoKCkgPT4gYm9vbGVhbil8c3RyaW5nXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgT2JqZWN0cyB3aGljaCBhcmUgY29udmVydGVkIGludG8gcmVjb3JkcyBhbmQgdXNlZCB0byBjcmVhdGUgdGhpc1xuICAgICAqIExpc3QncyBbc3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9MaXN0I2NvbmZpZy1zdG9yZSlcbiAgICAgKi9cbiAgICBpdGVtcyA/IDogb2JqZWN0W11cbiAgICAvKipcbiAgICAgKiBUZW1wbGF0ZSBmdW5jdGlvbiAob3IgbmFtZSBvZiBhIHRlbXBsYXRlIGZ1bmN0aW9uKSwgd2hpY2gsIHdoZW4gcGFzc2VkIGEgcmVjb3JkLCByZXR1cm5zIHRoZSB0ZXh0dWFsIEhUTUwgZm9yXG4gICAgICogdGhhdCBpdGVtLiBEZWZhdWx0cyB0byBhIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgdmFsdWUgb2YgdGhlIHJlY29yZMK0cyBbZGlzcGxheUZpZWxkXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvTGlzdCNjb25maWctZGlzcGxheUZpZWxkKVxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsfSByZWNvcmQgVGhlIHJlY29yZFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgaXRlbVRwbCA/IDogKChyZWNvcmQ6IE1vZGVsKSA9PiBzdHJpbmcpfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIEFuIG9iamVjdCB3aG9zZSBrZXlzIGFyZSB0aGUgW2tleV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0tleWJvYXJkRXZlbnQva2V5KSBuYW1lXG4gICAgICogYW5kIG9wdGlvbmFsIG1vZGlmaWVyIHByZWZpeGVzOiBgJ0N0cmwrJ2AsIGAnQWx0KydgLCBgJ01ldGErJ2AsIGFuZCBgJ1NoaWZ0KydgIChjYXNlLWluc2Vuc2l0aXZlKS4gVGhlIHZhbHVlc1xuICAgICAqIGFyZSB0aGUgbmFtZSBvZiB0aGUgaW5zdGFuY2UgbWV0aG9kIHRvIGNhbGwgd2hlbiB0aGUga2V5c3Ryb2tlIGlzIHJlY2VpdmVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvTGlzdCNjb25maWcta2V5TWFwKVxuICAgICAqL1xuICAgIGtleU1hcCA/IDogUmVjb3JkPHN0cmluZywgS2V5TWFwQ29uZmlnPlxuICAgIC8qKlxuICAgICAqIFRoZSBsaXN0ZW5lciBzZXQgZm9yIHRoaXMgb2JqZWN0LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvTGlzdCNjb25maWctbGlzdGVuZXJzKVxuICAgICAqL1xuICAgIGxpc3RlbmVycyA/IDogTGlzdExpc3RlbmVyc1xuICAgIC8qKlxuICAgICAqIEEgY2xhc3MgdHJhbnNsYXRpb25zIG9mIHdoaWNoIGFyZSB1c2VkIGZvciB0cmFuc2xhdGluZyB0aGlzIGVudGl0eS5cbiAgICAgKiBUaGlzIGlzIG9mdGVuIHVzZWQgd2hlbiB0cmFuc2xhdGlvbnMgb2YgYW4gaXRlbSBhcmUgZGVmaW5lZCBvbiBpdHMgY29udGFpbmVyIGNsYXNzLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvTGlzdCNjb25maWctbG9jYWxlQ2xhc3MpXG4gICAgICovXG4gICAgbG9jYWxlQ2xhc3MgPyA6IHR5cGVvZiBCYXNlXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGBmYWxzZWAgdG8gZGlzYWJsZSBsb2NhbGl6YXRpb24gb2YgdGhpcyBvYmplY3QuXG4gICAgICovXG4gICAgbG9jYWxpemFibGUgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIHByb3BlcnRpZXMgd2hpY2ggdmFsdWVzIHNob3VsZCBiZSB0cmFuc2xhdGVkIGF1dG9tYXRpY2FsbHkgdXBvbiBhIGxvY2FsZSBhcHBseWluZy5cbiAgICAgKiBJbiBjYXNlIHRoZXJlIGlzIGEgbmVlZCB0byBsb2NhbGl6ZSBub3QgdHlwaWNhbCB2YWx1ZSAobm90IGEgU3RyaW5nIHZhbHVlIG9yIGEgZmllbGQgd2l0aCByZS1kZWZpbmVkIHNldHRlci9nZXR0ZXIpLFxuICAgICAqIHlvdSBjb3VsZCB1c2UgJ2xvY2FsZUtleScgbWV0YSBjb25maWd1cmF0aW9uLlxuICAgICAqIEV4YW1wbGU6XG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9MaXN0I2NvbmZpZy1sb2NhbGl6YWJsZVByb3BlcnRpZXMpXG4gICAgICovXG4gICAgbG9jYWxpemFibGVQcm9wZXJ0aWVzID8gOiBzdHJpbmdbXVxuICAgIC8qKlxuICAgICAqIFdpZGdldCdzIG1hcmdpbi4gVGhpcyBtYXkgYmUgY29uZmlndXJlZCBhcyBhIHNpbmdsZSBudW1iZXIgb3IgYSBgVFJCTGAgZm9ybWF0IHN0cmluZy5cbiAgICAgKiBudW1lcmljLW9ubHkgdmFsdWVzIGFyZSBpbnRlcnByZXRlZCBhcyBwaXhlbHMuXG4gICAgICovXG4gICAgbWFyZ2luID8gOiBudW1iZXJ8c3RyaW5nXG4gICAgLyoqXG4gICAgICogVGhpcyBjb25maWcgb2JqZWN0IGNvbnRhaW5zIHRoZSBkZWZhdWx0cyBmb3IgdGhlIFtNYXNrXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvTWFzaykgY3JlYXRlZCBmb3IgdGhlXG4gICAgICogW21hc2tlZF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctbWFza2VkKSBjb25maWcuIEFueSBwcm9wZXJ0aWVzIHNwZWNpZmllZCBpbiB0aGUgYG1hc2tlZGAgY29uZmlnIHdpbGwgb3ZlcnJpZGUgdGhlc2VcbiAgICAgKiB2YWx1ZXMuXG4gICAgICovXG4gICAgbWFza0RlZmF1bHRzID8gOiBNYXNrQ29uZmlnXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGB0cnVlYCB0byBhcHBseSB0aGUgZGVmYXVsdCBtYXNrIHRvIHRoZSB3aWRnZXQuIEFsdGVybmF0aXZlbHksIHRoaXMgY2FuIGJlIHRoZSBtYXNrIG1lc3NhZ2Ugb3IgYVxuICAgICAqIFtNYXNrXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvTWFzaykgY29uZmlnIG9iamVjdC5cbiAgICAgKi9cbiAgICBtYXNrZWQgPyA6IGJvb2xlYW58c3RyaW5nfE1hc2tDb25maWdcbiAgICAvKipcbiAgICAgKiBUaGUgZWxlbWVudCdzIG1heEhlaWdodC4gQ2FuIGJlIGVpdGhlciBhIFN0cmluZyBvciBhIE51bWJlciAod2hpY2ggd2lsbCBoYXZlICdweCcgYXBwZW5kZWQpLiBOb3RlIHRoYXRcbiAgICAgKiBsaWtlIFtoZWlnaHRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLWhlaWdodCksICpyZWFkaW5nKiB0aGUgdmFsdWUgd2lsbCByZXR1cm4gdGhlIG51bWVyaWMgdmFsdWUgaW4gcGl4ZWxzLlxuICAgICAqL1xuICAgIG1heEhlaWdodCA/IDogc3RyaW5nfG51bWJlclxuICAgIC8qKlxuICAgICAqICpPbmx5IHZhbGlkIGlmIHRoaXMgV2lkZ2V0IGlzIFtmbG9hdGluZ10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctZmxvYXRpbmcpLipcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0xpc3QjY29uZmlnLW1heGltaXplT25Nb2JpbGUpXG4gICAgICovXG4gICAgbWF4aW1pemVPbk1vYmlsZSA/IDogbnVtYmVyfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFRoZSBlbGVtZW50cyBtYXhXaWR0aC4gQ2FuIGJlIGVpdGhlciBhIFN0cmluZyBvciBhIE51bWJlciAod2hpY2ggd2lsbCBoYXZlICdweCcgYXBwZW5kZWQpLiBOb3RlIHRoYXRcbiAgICAgKiBsaWtlIFt3aWR0aF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctd2lkdGgpLCAqcmVhZGluZyogdGhlIHZhbHVlIHdpbGwgcmV0dXJuIHRoZSBudW1lcmljIHZhbHVlIGluIHBpeGVscy5cbiAgICAgKi9cbiAgICBtYXhXaWR0aCA/IDogc3RyaW5nfG51bWJlclxuICAgIC8qKlxuICAgICAqIFRoZSBlbGVtZW50J3MgbWluSGVpZ2h0LiBDYW4gYmUgZWl0aGVyIGEgU3RyaW5nIG9yIGEgTnVtYmVyICh3aGljaCB3aWxsIGhhdmUgJ3B4JyBhcHBlbmRlZCkuIE5vdGUgdGhhdFxuICAgICAqIGxpa2UgW2hlaWdodF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctaGVpZ2h0KSwgKnJlYWRpbmcqIHRoZSB2YWx1ZSB3aWxsIHJldHVybiB0aGUgbnVtZXJpYyB2YWx1ZSBpbiBwaXhlbHMuXG4gICAgICovXG4gICAgbWluSGVpZ2h0ID8gOiBzdHJpbmd8bnVtYmVyXG4gICAgLyoqXG4gICAgICogVGhlIGVsZW1lbnRzIG1pbldpZHRoLiBDYW4gYmUgZWl0aGVyIGEgU3RyaW5nIG9yIGEgTnVtYmVyICh3aGljaCB3aWxsIGhhdmUgJ3B4JyBhcHBlbmRlZCkuIE5vdGUgdGhhdFxuICAgICAqIGxpa2UgW3dpZHRoXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy13aWR0aCksICpyZWFkaW5nKiB0aGUgdmFsdWUgd2lsbCByZXR1cm4gdGhlIG51bWVyaWMgdmFsdWUgaW4gcGl4ZWxzLlxuICAgICAqL1xuICAgIG1pbldpZHRoID8gOiBzdHJpbmd8bnVtYmVyXG4gICAgLyoqXG4gICAgICogV2hlbiB0aGlzIGlzIGNvbmZpZ3VyZWQgYXMgYHRydWVgIGEgW1Jlc2l6ZU9ic2VydmVyXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvUmVzaXplT2JzZXJ2ZXIpXG4gICAgICogaXMgdXNlZCB0byBtb25pdG9yIHRoaXMgZWxlbWVudCBmb3Igc2l6ZSBjaGFuZ2VzIGNhdXNlZCBieSBlaXRoZXIgc3R5bGUgbWFuaXB1bGF0aW9uLCBvciBieSBDU1NcbiAgICAgKiBsYXlvdXQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9MaXN0I2NvbmZpZy1tb25pdG9yUmVzaXplKVxuICAgICAqL1xuICAgIG1vbml0b3JSZXNpemUgPyA6IGJvb2xlYW58e1xuICAgICAgICBpbW1lZGlhdGU/OiBib29sZWFuXG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSBhcyBgdHJ1ZWAgdG8gYWxsb3cgbXVsdGkgc2VsZWN0IGFuZCBhZGQgY2hlY2tib3hlcyB0byB0aGUgaXRlbXNcbiAgICAgKi9cbiAgICBtdWx0aVNlbGVjdCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFRoZSBvd25pbmcgV2lkZ2V0IG9mIHRoaXMgV2lkZ2V0LiBJZiB0aGlzIFdpZGdldCBpcyBkaXJlY3RseSBjb250YWluZWQgKHRoYXQgaXMsIGl0IGlzIG9uZSBvZiB0aGVcbiAgICAgKiBbaXRlbXNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db250YWluZXIjcHJvcGVydHktaXRlbXMpIG9mIGEgQ29udGFpbmVyKSwgdGhpcyBjb25maWcgd2lsbCBiZSBpZ25vcmVkLiBJbiB0aGlzIGNhc2VcbiAgICAgKiB0aGUgb3duZXIgaXMgPHN0cm9uZz5hbHdheXM8L3N0cm9uZz4gdGhlIGVuY2Fwc3VsYXRpbmcgQ29udGFpbmVyLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvTGlzdCNjb25maWctb3duZXIpXG4gICAgICovXG4gICAgb3duZXIgPyA6IFdpZGdldHxhbnlcbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHdoZW4gYSB3aWRnZXQgaXMgcmVuZGVyZWQgaW50byBhbm90aGVyIHdpZGdldCdzIFtjb250ZW50RWxlbWVudF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNwcm9wZXJ0eS1jb250ZW50RWxlbWVudCksIGJ1dCBtdXN0XG4gICAgICogbm90IHBhcnRpY2lwYXRlIGluIHRoZSBzdGFuZGFyZCBsYXlvdXQgb2YgdGhhdCB3aWRnZXQsIGFuZCBtdXN0IGJlIHBvc2l0aW9uZWQgcmVsYXRpdmVseSB0byB0aGF0XG4gICAgICogd2lkZ2V0J3MgW2NvbnRlbnRFbGVtZW50XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I3Byb3BlcnR5LWNvbnRlbnRFbGVtZW50KS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0xpc3QjY29uZmlnLXBvc2l0aW9uZWQpXG4gICAgICovXG4gICAgcG9zaXRpb25lZCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFByZXZlbnQgdG9vbHRpcCBmcm9tIGJlaW5nIGRpc3BsYXllZCBvbiB0b3VjaCBkZXZpY2VzLiBVc2VmdWwgZm9yIGV4YW1wbGUgZm9yIGJ1dHRvbnMgdGhhdCBkaXNwbGF5IGFcbiAgICAgKiBtZW51IG9uIGNsaWNrIGV0Yywgc2luY2UgdGhlIHRvb2x0aXAgd291bGQgYmUgZGlzcGxheWVkIGF0IHRoZSBzYW1lIHRpbWUuXG4gICAgICovXG4gICAgcHJldmVudFRvb2x0aXBPblRvdWNoID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGlzIHdpZGdldCBpcyByZWFkLW9ubHkuICBUaGlzIGlzIG9ubHkgdmFsaWQgaWYgdGhlIHdpZGdldCBpcyBhbiBpbnB1dFxuICAgICAqIGZpZWxkLCA8c3Ryb25nPm9yIGNvbnRhaW5zIGlucHV0IGZpZWxkcyBhdCBhbnkgZGVwdGg8L3N0cm9uZz4uXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9MaXN0I2NvbmZpZy1yZWFkT25seSlcbiAgICAgKi9cbiAgICByZWFkT25seSA/IDogYm9vbGVhblxuICAgIHJlbGF5U3RvcmVFdmVudHMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBDb25maWd1cmUgYXMgYHRydWVgIHRvIGhhdmUgdGhlIGNvbXBvbmVudCBkaXNwbGF5IGEgdHJhbnNsdWNlbnQgcmlwcGxlIHdoZW4gaXRzXG4gICAgICogW2ZvY3VzRWxlbWVudF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNwcm9wZXJ0eS1mb2N1c0VsZW1lbnQpLCBvciBbZWxlbWVudF0oI0NvcmUvd2lkZ2V0L1dpZGdldCNwcm9wZXJ0eS1lbGVtZW50KSBpcyB0YXBwZWQgPGVtPmlmIHRoZVxuICAgICAqIGN1cnJlbnQgdGhlbWUgc3VwcG9ydHMgcmlwcGxlczwvZW0+LiBPdXQgb2YgdGhlIGJveCwgb25seSB0aGUgTWF0ZXJpYWwgdGhlbWUgc3VwcG9ydHMgcmlwcGxlcy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0xpc3QjY29uZmlnLXJpcHBsZSlcbiAgICAgKi9cbiAgICByaXBwbGUgPyA6IGJvb2xlYW58e1xuICAgICAgICBkZWxlZ2F0ZT86IHN0cmluZ1xuICAgICAgICBjb2xvcj86IHN0cmluZ1xuICAgICAgICByYWRpdXM/OiBudW1iZXJcbiAgICAgICAgY2xpcD86IHN0cmluZ1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiB5b3UgYXJlIHJlbmRlcmluZyB0aGlzIHdpZGdldCB0byBhIHNoYWRvdyByb290IGluc2lkZSBhIHdlYiBjb21wb25lbnQsIHNldCB0aGlzIGNvbmZpZyB0byB0aGUgc2hhZG93Um9vdC4gSWYgbm90IGluc2lkZSBhIHdlYiBjb21wb25lbnQsIHNldCBpdCB0byBgZG9jdW1lbnQuYm9keWBcbiAgICAgKi9cbiAgICByb290RWxlbWVudCA/IDogU2hhZG93Um9vdHxIVE1MRWxlbWVudFxuICAgIC8qKlxuICAgICAqIFRoaXMgbWF5IGJlIGNvbmZpZ3VyZWQgYXMgYHRydWVgIHRvIG1ha2UgdGhlIHdpZGdldCdzIGVsZW1lbnQgdXNlIHRoZSBgZGlyZWN0aW9uOnJ0bGAgc3R5bGUuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9MaXN0I2NvbmZpZy1ydGwpXG4gICAgICovXG4gICAgcnRsID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgKGFuZCBvcHRpb25hbGx5IGluIHdoaWNoIGF4ZXMpIGEgV2lkZ2V0IG1heSBzY3JvbGwuIGB0cnVlYCBtZWFucyB0aGlzIHdpZGdldCBtYXkgc2Nyb2xsXG4gICAgICogaW4gYm90aCBheGVzLiBNYXkgYmUgYW4gb2JqZWN0IGNvbnRhaW5pbmcgYm9vbGVhbiBgb3ZlcmZsb3dYYCBhbmQgYG92ZXJmbG93WWAgcHJvcGVydGllcyB3aGljaCBhcmVcbiAgICAgKiBhcHBsaWVkIHRvIENTUyBzdHlsZSBwcm9wZXJ0aWVzIGBvdmVyZmxvd1hgIGFuZCBgb3ZlcmZsb3dZYC4gSWYgdGhleSBhcmUgYm9vbGVhbiwgdGhleSBhcmUgdHJhbnNsYXRlZCB0b1xuICAgICAqIENTUyBvdmVyZmxvdyBwcm9wZXJ0aWVzIHRodXM6XG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9MaXN0I2NvbmZpZy1zY3JvbGxhYmxlKVxuICAgICAqL1xuICAgIHNjcm9sbGFibGUgPyA6IGJvb2xlYW58U2Nyb2xsZXJDb25maWd8U2Nyb2xsZXJcbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIHdoYXQgdG8gZG8gaWYgZG9jdW1lbnQgaXMgc2Nyb2xsZWQgd2hpbGUgV2lkZ2V0IGlzIHZpc2libGUgKG9ubHkgcmVsZXZhbnQgd2hlbiBmbG9hdGluZyBpcyBzZXQgdG8gYHRydWVgKS5cbiAgICAgKiBWYWxpZCB2YWx1ZXM6IMK0bnVsbMK0OiBkbyBub3RoaW5nLCDCtGhpZGXCtDogaGlkZSB0aGUgd2lkZ2V0IG9yIMK0cmVhbGlnbsK0OiByZWFsaWduIHRvIHRoZSB0YXJnZXQgaWYgcG9zc2libGUuXG4gICAgICovXG4gICAgc2Nyb2xsQWN0aW9uID8gOiAnaGlkZSd8J3JlYWxpZ24nfG51bGxcbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIGFkZCBhIFwiU2VsZWN0IGFsbFwiIGl0ZW0gdG8gdGhlIGxpc3QgdG8gc2VsZWN0L3Vuc2VsZWN0IGFsbCBpdGVtcyBhdCBvbmNlLlxuICAgICAqIE9ubHkgYXBwbGllcyB3aGVuIFttdWx0aVNlbGVjdF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0xpc3QjY29uZmlnLW11bHRpU2VsZWN0KSBtb2RlIGlzIGVuYWJsZWQuXG4gICAgICovXG4gICAgc2VsZWN0QWxsSXRlbSA/IDogYm9vbGVhbnxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBIFtDb2xsZWN0aW9uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS91dGlsL0NvbGxlY3Rpb24pLCBvciBDb2xsZWN0aW9uIGNvbmZpZyBvYmplY3QgdG8gdXNlIHRvIGNvbnRhaW4gdGhpcyBMaXN0J3Mgc2VsZWN0ZWRcbiAgICAgKiByZWNvcmRzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvTGlzdCNjb25maWctc2VsZWN0ZWQpXG4gICAgICovXG4gICAgc2VsZWN0ZWQgPyA6IG9iamVjdFtdfG51bWJlcltdfHN0cmluZ1tdfENvbGxlY3Rpb258Q29sbGVjdGlvbkNvbmZpZ3xDb2xsZWN0aW9uQ29uZmlnW11cbiAgICAvKipcbiAgICAgKiAqT25seSB2YWxpZCBpZiB0aGlzIFdpZGdldCBpcyBbZmxvYXRpbmddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLWZsb2F0aW5nKS4qXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9MaXN0I2NvbmZpZy1zaG93QW5pbWF0aW9uKVxuICAgICAqL1xuICAgIHNob3dBbmltYXRpb24gPyA6IGJvb2xlYW58b2JqZWN0XG4gICAgLyoqXG4gICAgICogU2V0IHRvIGBmYWxzZWAgdG8gbm90IHNob3cgdGhlIHRvb2x0aXAgd2hlbiB0aGlzIHdpZGdldCBpcyBbZGlzYWJsZWRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjcHJvcGVydHktZGlzYWJsZWQpXG4gICAgICovXG4gICAgc2hvd1Rvb2x0aXBXaGVuRGlzYWJsZWQgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBQcm9ncmFtbWF0aWMgY29udHJvbCBvdmVyIGhvdyBtYW55IGNvbHVtbnMgdG8gc3BhbiB3aGVuIHVzZWQgaW4gYSBncmlkIGxheW91dC5cbiAgICAgKi9cbiAgICBzcGFuID8gOiBudW1iZXJcbiAgICAvKipcbiAgICAgKiBBIFtTdG9yZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvZGF0YS9TdG9yZSkgd2hpY2ggcHJvdmlkZXMgdGhlIHJlY29yZHMgd2hpY2ggbWFwIHRvIExpc3QgaXRlbXMuIEVhY2ggcmVjb3JkIGlzIHBhc3NlZCB0aHJvdWdoIHRoZVxuICAgICAqIFtpdGVtVHBsXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvTGlzdCNjb25maWctaXRlbVRwbCkgdG8gcHJvZHVjZSB0aGUgRE9NIHN0cnVjdHVyZSBvZiB0aGUgTGlzdC4gTWF5IGJlIGdlbmVyYXRlZCBmcm9tIGFuIGFycmF5IG9mIFtpdGVtc10oI0NvcmUvd2lkZ2V0L0xpc3QjY29uZmlnLWl0ZW1zKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0xpc3QjY29uZmlnLXN0b3JlKVxuICAgICAqL1xuICAgIHN0b3JlID8gOiBvYmplY3R8b2JqZWN0W118U3RvcmVDb25maWd8U3RvcmV8U3RvcmVDb25maWdbXVxuICAgIC8qKlxuICAgICAqIEEgY29uZmlndXJhdGlvbiBmb3IgdGhlIFt0YWJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9UYWIpIGNyZWF0ZWQgZm9yIHRoaXMgd2lkZ2V0IHdoZW4gaXQgaXMgcGxhY2VkIGluIGFcbiAgICAgKiBbVGFiUGFuZWxdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9UYWJQYW5lbCkuIEZvciBleGFtcGxlLCB0aGlzIGNvbmZpZyBjYW4gYmUgdXNlZCB0byBjb250cm9sIHRoZSBpY29uIG9mIHRoZSBgdGFiYCBmb3JcbiAgICAgKiB0aGlzIHdpZGdldDpcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0xpc3QjY29uZmlnLXRhYilcbiAgICAgKi9cbiAgICB0YWIgPyA6IGJvb2xlYW58VGFiQ29uZmlnXG4gICAgLyoqXG4gICAgICogVGhlIHRhZyBuYW1lIG9mIHRoaXMgV2lkZ2V0J3Mgcm9vdCBlbGVtZW50XG4gICAgICovXG4gICAgdGFnID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBUZXh0IGFsaWdubWVudDogJ2xlZnQnLCAnY2VudGVyJyBvciAncmlnaHQnLiBBbHNvIGFjY2VwdHMgZGlyZWN0aW9uIG5ldXRyYWwgJ3N0YXJ0JyBhbmQgJ2VuZCcuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9MaXN0I2NvbmZpZy10ZXh0QWxpZ24pXG4gICAgICovXG4gICAgdGV4dEFsaWduID8gOiAnbGVmdCd8J2NlbnRlcid8J3JpZ2h0J3wnc3RhcnQnfCdlbmQnXG4gICAgLyoqXG4gICAgICogVGhlIHRpdGxlIHRvIHNob3cgYXQgdGhlIHRvcCBvZiB0aGUgbGlzdC5cbiAgICAgKi9cbiAgICB0aXRsZSA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogU2VsZWN0L2Rlc2VsZWN0IGFsbCBpZiBgQ01EYC9gQ1RSTGAgaXMgcHJlc3NlZCB3aGVuIGNsaWNraW5nXG4gICAgICovXG4gICAgdG9nZ2xlQWxsSWZDdHJsUHJlc3NlZCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFRvb2x0aXAgZm9yIHRoZSB3aWRnZXQsIGVpdGhlciBhcyBhIHN0cmluZyBvciBhcyBhIFRvb2x0aXAgY29uZmlnIG9iamVjdC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0xpc3QjY29uZmlnLXRvb2x0aXApXG4gICAgICovXG4gICAgdG9vbHRpcCA/IDogc3RyaW5nfFRvb2x0aXBDb25maWd8bnVsbFxuICAgIC8qKlxuICAgICAqIFRlbXBsYXRlIGZ1bmN0aW9uIHRvIHByb3ZpZGUgYSB0b29sdGlwICh0ZXh0dWFsLCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgSFRNTC1lbmNvZGVkKSBzaG93biB3aGVuIGhvdmVyaW5nIGFuIGl0ZW0uXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IHJlY29yZCBUaGUgcmVjb3JkIHJlcHJlc2VudGluZyB0aGUgaXRlbVxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAgICovXG4gICAgdG9vbHRpcFRlbXBsYXRlID8gOiAocmVjb3JkOiBNb2RlbCkgPT4gc3RyaW5nXG4gICAgdHlwZSA/IDogJ2xpc3QnXG4gICAgLyoqXG4gICAgICogQ3VzdG9tIENTUyBjbGFzcyBuYW1lIHN1ZmZpeGVzIHRvIGFwcGx5IHRvIHRoZSBlbGVtZW50cyByZW5kZXJlZCBieSB0aGlzIHdpZGdldC4gVGhpcyBtYXkgYmUgc3BlY2lmaWVkXG4gICAgICogYXMgYSBzcGFjZSBzZXBhcmF0ZWQgc3RyaW5nLCBhbiBhcnJheSBvZiBzdHJpbmdzLCBvciBhcyBhbiBvYmplY3QgaW4gd2hpY2ggcHJvcGVydHkgbmFtZXMgd2l0aCB0cnV0aHlcbiAgICAgKiB2YWx1ZXMgYXJlIHVzZWQgYXMgdGhlIGNsYXNzIG5hbWVzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvTGlzdCNjb25maWctdWkpXG4gICAgICovXG4gICAgdWkgPyA6IHN0cmluZ3xvYmplY3RcbiAgICAvKipcbiAgICAgKiBDb250cm9scyB2aXJ0dWFsaXphdGlvbiBvZiBsaXN0IGl0ZW1zIHVzaW5nIHRoZSBgSW50ZXJzZWN0aW9uT2JzZXJ2ZXJgIEFQSSB0byByZW5kZXIgaXRlbXMgb25seSB3aGVuXG4gICAgICogc2Nyb2xsZWQgaW50byB2aWV3LiBUaGlzIGlzIG9ubHkgdXNlZnVsIGZvciBsaXN0cyB3aXRoIGNvbXBsZXggbWFya3VwLCBmb3Igc2ltcGxlIGxpc3RzIGl0IGxpa2VseSBhZGRzXG4gICAgICogb3ZlcmhlYWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9MaXN0I2NvbmZpZy12aXJ0dWFsaXplKVxuICAgICAqL1xuICAgIHZpcnR1YWxpemUgPyA6IGJvb2xlYW58bnVtYmVyXG4gICAgLyoqXG4gICAgICogQSB3aWRnZXRzIHdlaWdodCBkZXRlcm1pbmVzIGl0cyBwb3NpdGlvbiBhbW9uZyBzaWJsaW5ncyB3aGVuIGFkZGVkIHRvIGEgW0NvbnRhaW5lcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0NvbnRhaW5lcikuXG4gICAgICogSGlnaGVyIHdlaWdodHMgZ28gZnVydGhlciBkb3duLlxuICAgICAqL1xuICAgIHdlaWdodCA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogV2lkZ2V0J3Mgd2lkdGgsIHVzZWQgdG8gc2V0IGVsZW1lbnQgYHN0eWxlLndpZHRoYC4gRWl0aGVyIHNwZWNpZnkgYSB2YWxpZCB3aWR0aCBzdHJpbmcgb3IgYSBudW1iZXIsIHdoaWNoXG4gICAgICogd2lsbCBnZXQgJ3B4JyBhcHBlbmRlZC4gV2UgcmVjb21tZW5kIHVzaW5nIENTUyBhcyB0aGUgcHJpbWFyeSB3YXkgdG8gY29udHJvbCB3aWR0aCwgYnV0IGluIHNvbWUgY2FzZXNcbiAgICAgKiB0aGlzIGNvbmZpZyBpcyBjb252ZW5pZW50LlxuICAgICAqL1xuICAgIHdpZHRoID8gOiBzdHJpbmd8bnVtYmVyXG4gICAgLyoqXG4gICAgICogVGhlIHggcG9zaXRpb24gZm9yIHRoZSB3aWRnZXQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9MaXN0I2NvbmZpZy14KVxuICAgICAqL1xuICAgIHggPyA6IG51bWJlclxuICAgIC8qKlxuICAgICAqIFRoZSB5IHBvc2l0aW9uIGZvciB0aGUgd2lkZ2V0LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvTGlzdCNjb25maWcteSlcbiAgICAgKi9cbiAgICB5ID8gOiBudW1iZXJcblxufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvciA6ICdicnludHVtLWxpc3QnLFxuICAgIHRlbXBsYXRlIDogJydcbn0pXG5leHBvcnQgY2xhc3MgQnJ5bnR1bUxpc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgICBwdWJsaWMgc3RhdGljIGluc3RhbmNlQ2xhc3MgPSBMaXN0O1xuXG4gICAgcHVibGljIHN0YXRpYyBpbnN0YW5jZU5hbWUgPSAnTGlzdCc7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBicnludHVtRXZlbnRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgJ29uQmVmb3JlRGVzdHJveScsXG4gICAgICAgICdvbkJlZm9yZUhpZGUnLFxuICAgICAgICAnb25CZWZvcmVJdGVtJyxcbiAgICAgICAgJ29uQmVmb3JlU2hvdycsXG4gICAgICAgICdvbkNhdGNoQWxsJyxcbiAgICAgICAgJ29uRGVzdHJveScsXG4gICAgICAgICdvbkVsZW1lbnRDcmVhdGVkJyxcbiAgICAgICAgJ29uRm9jdXNJbicsXG4gICAgICAgICdvbkZvY3VzT3V0JyxcbiAgICAgICAgJ29uSGlkZScsXG4gICAgICAgICdvbkl0ZW0nLFxuICAgICAgICAnb25QYWludCcsXG4gICAgICAgICdvblJlYWRPbmx5JyxcbiAgICAgICAgJ29uUmVjb21wb3NlJyxcbiAgICAgICAgJ29uUmVzaXplJyxcbiAgICAgICAgJ29uU2VsZWN0aW9uQ2hhbmdlJyxcbiAgICAgICAgJ29uU2hvdycsXG4gICAgICAgICdvblRvZ2dsZUdyb3VwJyxcbiAgICAgICAgJ29uVG9nZ2xlTm9kZSdcbiAgICBdO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnJ5bnR1bUZlYXR1cmVOYW1lczogc3RyaW5nW10gPSBbXG5cbiAgICBdO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnJ5bnR1bUNvbmZpZ3M6IHN0cmluZ1tdID0gQnJ5bnR1bUxpc3RDb21wb25lbnQuYnJ5bnR1bUZlYXR1cmVOYW1lcy5jb25jYXQoW1xuICAgICAgICAnYWN0aXZhdGVPbk1vdXNlb3ZlcicsXG4gICAgICAgICdhZG9wdCcsXG4gICAgICAgICdhbGlnbicsXG4gICAgICAgICdhbGlnblNlbGYnLFxuICAgICAgICAnYWxsb3dHcm91cFNlbGVjdCcsXG4gICAgICAgICdhbmNob3InLFxuICAgICAgICAnYXBwZW5kVG8nLFxuICAgICAgICAnYXJpYURlc2NyaXB0aW9uJyxcbiAgICAgICAgJ2FyaWFMYWJlbCcsXG4gICAgICAgICdidWJibGVFdmVudHMnLFxuICAgICAgICAnY2FsbE9uRnVuY3Rpb25zJyxcbiAgICAgICAgJ2NhdGNoRXZlbnRIYW5kbGVyRXhjZXB0aW9ucycsXG4gICAgICAgICdjZW50ZXJlZCcsXG4gICAgICAgICdjbGVhclNlbGVjdGlvbk9uRW1wdHlTcGFjZUNsaWNrJyxcbiAgICAgICAgJ2NscycsXG4gICAgICAgICdjb2xsYXBzaWJsZUdyb3VwcycsXG4gICAgICAgICdjb2xvcicsXG4gICAgICAgICdjb2x1bW4nLFxuICAgICAgICAnY29uZmlnJyxcbiAgICAgICAgJ2NvbnN0cmFpblRvJyxcbiAgICAgICAgJ2NvbnRlbnQnLFxuICAgICAgICAnY29udGVudEVsZW1lbnRDbHMnLFxuICAgICAgICAnZGF0YUZpZWxkJyxcbiAgICAgICAgJ2RhdGFzZXQnLFxuICAgICAgICAnZGVmYXVsdEJpbmRQcm9wZXJ0eScsXG4gICAgICAgICdkZXRlY3RDU1NDb21wYXRpYmlsaXR5SXNzdWVzJyxcbiAgICAgICAgJ2Rpc2FibGVkJyxcbiAgICAgICAgJ2Rpc3BsYXlGaWVsZCcsXG4gICAgICAgICdkb2NrJyxcbiAgICAgICAgJ2RyYWdnYWJsZScsXG4gICAgICAgICdlbGVtZW50QXR0cmlidXRlcycsXG4gICAgICAgICdlbXB0eVRleHQnLFxuICAgICAgICAnZXh0cmFEYXRhJyxcbiAgICAgICAgJ2ZsZXgnLFxuICAgICAgICAnZmxvYXRpbmcnLFxuICAgICAgICAnZ2V0SXRlbUNscycsXG4gICAgICAgICdnZXRJdGVtU3R5bGUnLFxuICAgICAgICAnZ3JvdXBIZWFkZXJUcGwnLFxuICAgICAgICAnaGVpZ2h0JyxcbiAgICAgICAgJ2hpZGRlbicsXG4gICAgICAgICdoaWRlQW5pbWF0aW9uJyxcbiAgICAgICAgJ2h0bWwnLFxuICAgICAgICAnaHRtbENscycsXG4gICAgICAgICdpZCcsXG4gICAgICAgICdpZ25vcmVQYXJlbnRSZWFkT25seScsXG4gICAgICAgICdpbnNlcnRCZWZvcmUnLFxuICAgICAgICAnaW5zZXJ0Rmlyc3QnLFxuICAgICAgICAnaXNTZWxlY3RhYmxlJyxcbiAgICAgICAgJ2l0ZW1zJyxcbiAgICAgICAgJ2l0ZW1UcGwnLFxuICAgICAgICAna2V5TWFwJyxcbiAgICAgICAgJ2xpc3RlbmVycycsXG4gICAgICAgICdsb2NhbGVDbGFzcycsXG4gICAgICAgICdsb2NhbGl6YWJsZScsXG4gICAgICAgICdsb2NhbGl6YWJsZVByb3BlcnRpZXMnLFxuICAgICAgICAnbWFyZ2luJyxcbiAgICAgICAgJ21hc2tEZWZhdWx0cycsXG4gICAgICAgICdtYXNrZWQnLFxuICAgICAgICAnbWF4SGVpZ2h0JyxcbiAgICAgICAgJ21heGltaXplT25Nb2JpbGUnLFxuICAgICAgICAnbWF4V2lkdGgnLFxuICAgICAgICAnbWluSGVpZ2h0JyxcbiAgICAgICAgJ21pbldpZHRoJyxcbiAgICAgICAgJ21vbml0b3JSZXNpemUnLFxuICAgICAgICAnbXVsdGlTZWxlY3QnLFxuICAgICAgICAnb3duZXInLFxuICAgICAgICAncG9zaXRpb25lZCcsXG4gICAgICAgICdwcmV2ZW50VG9vbHRpcE9uVG91Y2gnLFxuICAgICAgICAncmVhZE9ubHknLFxuICAgICAgICAncmVsYXlTdG9yZUV2ZW50cycsXG4gICAgICAgICdyaXBwbGUnLFxuICAgICAgICAncm9vdEVsZW1lbnQnLFxuICAgICAgICAncnRsJyxcbiAgICAgICAgJ3Njcm9sbGFibGUnLFxuICAgICAgICAnc2Nyb2xsQWN0aW9uJyxcbiAgICAgICAgJ3NlbGVjdEFsbEl0ZW0nLFxuICAgICAgICAnc2VsZWN0ZWQnLFxuICAgICAgICAnc2hvd0FuaW1hdGlvbicsXG4gICAgICAgICdzaG93VG9vbHRpcFdoZW5EaXNhYmxlZCcsXG4gICAgICAgICdzcGFuJyxcbiAgICAgICAgJ3N0b3JlJyxcbiAgICAgICAgJ3RhYicsXG4gICAgICAgICd0YWcnLFxuICAgICAgICAndGV4dEFsaWduJyxcbiAgICAgICAgJ3RpdGxlJyxcbiAgICAgICAgJ3RvZ2dsZUFsbElmQ3RybFByZXNzZWQnLFxuICAgICAgICAndG9vbHRpcCcsXG4gICAgICAgICd0b29sdGlwVGVtcGxhdGUnLFxuICAgICAgICAndHlwZScsXG4gICAgICAgICd1aScsXG4gICAgICAgICd2aXJ0dWFsaXplJyxcbiAgICAgICAgJ3dlaWdodCcsXG4gICAgICAgICd3aWR0aCcsXG4gICAgICAgICd4JyxcbiAgICAgICAgJ3knXG4gICAgXSk7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBicnludHVtQ29uZmlnc09ubHk6IHN0cmluZ1tdID0gW1xuICAgICAgICAnYWN0aXZhdGVPbk1vdXNlb3ZlcicsXG4gICAgICAgICdhZG9wdCcsXG4gICAgICAgICdhbGlnbicsXG4gICAgICAgICdhbGxvd0dyb3VwU2VsZWN0JyxcbiAgICAgICAgJ2FuY2hvcicsXG4gICAgICAgICdhcmlhRGVzY3JpcHRpb24nLFxuICAgICAgICAnYXJpYUxhYmVsJyxcbiAgICAgICAgJ2J1YmJsZUV2ZW50cycsXG4gICAgICAgICdjZW50ZXJlZCcsXG4gICAgICAgICdjbGVhclNlbGVjdGlvbk9uRW1wdHlTcGFjZUNsaWNrJyxcbiAgICAgICAgJ2NvbG9yJyxcbiAgICAgICAgJ2NvbmZpZycsXG4gICAgICAgICdjb25zdHJhaW5UbycsXG4gICAgICAgICdjb250ZW50RWxlbWVudENscycsXG4gICAgICAgICdkYXRhRmllbGQnLFxuICAgICAgICAnZGVmYXVsdEJpbmRQcm9wZXJ0eScsXG4gICAgICAgICdkZXRlY3RDU1NDb21wYXRpYmlsaXR5SXNzdWVzJyxcbiAgICAgICAgJ2Rpc3BsYXlGaWVsZCcsXG4gICAgICAgICdkb2NrJyxcbiAgICAgICAgJ2RyYWdnYWJsZScsXG4gICAgICAgICdlbGVtZW50QXR0cmlidXRlcycsXG4gICAgICAgICdmbG9hdGluZycsXG4gICAgICAgICdnZXRJdGVtQ2xzJyxcbiAgICAgICAgJ2dldEl0ZW1TdHlsZScsXG4gICAgICAgICdncm91cEhlYWRlclRwbCcsXG4gICAgICAgICdoaWRlQW5pbWF0aW9uJyxcbiAgICAgICAgJ2h0bWxDbHMnLFxuICAgICAgICAnaWdub3JlUGFyZW50UmVhZE9ubHknLFxuICAgICAgICAnaXNTZWxlY3RhYmxlJyxcbiAgICAgICAgJ2l0ZW1UcGwnLFxuICAgICAgICAnbGlzdGVuZXJzJyxcbiAgICAgICAgJ2xvY2FsZUNsYXNzJyxcbiAgICAgICAgJ2xvY2FsaXphYmxlJyxcbiAgICAgICAgJ2xvY2FsaXphYmxlUHJvcGVydGllcycsXG4gICAgICAgICdtYXNrRGVmYXVsdHMnLFxuICAgICAgICAnbWFza2VkJyxcbiAgICAgICAgJ21vbml0b3JSZXNpemUnLFxuICAgICAgICAnb3duZXInLFxuICAgICAgICAncG9zaXRpb25lZCcsXG4gICAgICAgICdwcmV2ZW50VG9vbHRpcE9uVG91Y2gnLFxuICAgICAgICAncmVsYXlTdG9yZUV2ZW50cycsXG4gICAgICAgICdyaXBwbGUnLFxuICAgICAgICAncm9vdEVsZW1lbnQnLFxuICAgICAgICAnc2Nyb2xsQWN0aW9uJyxcbiAgICAgICAgJ3NlbGVjdEFsbEl0ZW0nLFxuICAgICAgICAnc2hvd0FuaW1hdGlvbicsXG4gICAgICAgICdzaG93VG9vbHRpcFdoZW5EaXNhYmxlZCcsXG4gICAgICAgICd0YWInLFxuICAgICAgICAndGFnJyxcbiAgICAgICAgJ3RleHRBbGlnbicsXG4gICAgICAgICd0b29sdGlwVGVtcGxhdGUnLFxuICAgICAgICAndHlwZScsXG4gICAgICAgICd1aScsXG4gICAgICAgICd2aXJ0dWFsaXplJyxcbiAgICAgICAgJ3dlaWdodCdcbiAgICBdO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnJ5bnR1bVByb3BzOiBzdHJpbmdbXSA9IEJyeW50dW1MaXN0Q29tcG9uZW50LmJyeW50dW1GZWF0dXJlTmFtZXMuY29uY2F0KFtcbiAgICAgICAgJ2FsaWduU2VsZicsXG4gICAgICAgICdhbmNob3JTaXplJyxcbiAgICAgICAgJ2FwcGVuZFRvJyxcbiAgICAgICAgJ2NhbGxPbkZ1bmN0aW9ucycsXG4gICAgICAgICdjYXRjaEV2ZW50SGFuZGxlckV4Y2VwdGlvbnMnLFxuICAgICAgICAnY2xzJyxcbiAgICAgICAgJ2NvbGxhcHNpYmxlR3JvdXBzJyxcbiAgICAgICAgJ2NvbHVtbicsXG4gICAgICAgICdjb250ZW50JyxcbiAgICAgICAgJ2RhdGFzZXQnLFxuICAgICAgICAnZGlzYWJsZWQnLFxuICAgICAgICAnZW1wdHlUZXh0JyxcbiAgICAgICAgJ2V4dHJhRGF0YScsXG4gICAgICAgICdmbGV4JyxcbiAgICAgICAgJ2ZvY3VzVmlzaWJsZScsXG4gICAgICAgICdoZWlnaHQnLFxuICAgICAgICAnaGlkZGVuJyxcbiAgICAgICAgJ2h0bWwnLFxuICAgICAgICAnaWQnLFxuICAgICAgICAnaW5zZXJ0QmVmb3JlJyxcbiAgICAgICAgJ2luc2VydEZpcnN0JyxcbiAgICAgICAgJ2l0ZW1zJyxcbiAgICAgICAgJ2tleU1hcCcsXG4gICAgICAgICdtYXJnaW4nLFxuICAgICAgICAnbWF4SGVpZ2h0JyxcbiAgICAgICAgJ21heGltaXplT25Nb2JpbGUnLFxuICAgICAgICAnbWF4V2lkdGgnLFxuICAgICAgICAnbWluSGVpZ2h0JyxcbiAgICAgICAgJ21pbldpZHRoJyxcbiAgICAgICAgJ211bHRpU2VsZWN0JyxcbiAgICAgICAgJ3BhcmVudCcsXG4gICAgICAgICdyZWFkT25seScsXG4gICAgICAgICdydGwnLFxuICAgICAgICAnc2Nyb2xsYWJsZScsXG4gICAgICAgICdzZWxlY3RlZCcsXG4gICAgICAgICdzcGFuJyxcbiAgICAgICAgJ3N0b3JlJyxcbiAgICAgICAgJ3RpdGxlJyxcbiAgICAgICAgJ3RvZ2dsZUFsbElmQ3RybFByZXNzZWQnLFxuICAgICAgICAndG9vbHRpcCcsXG4gICAgICAgICd3aWR0aCcsXG4gICAgICAgICd4JyxcbiAgICAgICAgJ3knXG4gICAgXSk7XG5cbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY7XG4gICAgcHVibGljIGluc3RhbmNlITogTGlzdDtcblxuICAgIHByaXZhdGUgYnJ5bnR1bUNvbmZpZyA9IHtcbiAgICAgICAgYWRvcHQgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgYXBwZW5kVG8gICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgaHJlZiAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgYW5ndWxhckNvbXBvbmVudCA6IHRoaXMsXG4gICAgICAgIGZlYXR1cmVzICAgICAgICAgOiB7fSxcbiAgICAgICAgbGlzdGVuZXJzICAgICAgICA6IHt9XG4gICAgfTtcblxuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQ6IEVsZW1lbnRSZWYpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50UmVmID0gZWxlbWVudDtcbiAgICB9XG5cbiAgICAvLyBDb25maWdzIG9ubHlcbiAgICBASW5wdXQoKSBhY3RpdmF0ZU9uTW91c2VvdmVyICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGFkb3B0ICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IEhUTUxFbGVtZW50fHN0cmluZztcbiAgICBASW5wdXQoKSBhbGlnbiAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBBbGlnblNwZWN8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGFsbG93R3JvdXBTZWxlY3QgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgYW5jaG9yICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBhcmlhRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgYXJpYUxhYmVsICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGJ1YmJsZUV2ZW50cyAgICAgICAgICAgICAgICAgICAgISA6IG9iamVjdDtcbiAgICBASW5wdXQoKSBjZW50ZXJlZCAgICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGNsZWFyU2VsZWN0aW9uT25FbXB0eVNwYWNlQ2xpY2sgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgY29sb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGNvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IG9iamVjdDtcbiAgICBASW5wdXQoKSBjb25zdHJhaW5UbyAgICAgICAgICAgICAgICAgICAgICEgOiBIVE1MRWxlbWVudHxXaWRnZXR8UmVjdGFuZ2xlO1xuICAgIEBJbnB1dCgpIGNvbnRlbnRFbGVtZW50Q2xzICAgICAgICAgICAgICAgISA6IHN0cmluZ3xvYmplY3Q7XG4gICAgQElucHV0KCkgZGF0YUZpZWxkICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGRlZmF1bHRCaW5kUHJvcGVydHkgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBkZXRlY3RDU1NDb21wYXRpYmlsaXR5SXNzdWVzICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGRpc3BsYXlGaWVsZCAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBkb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiAndG9wJ3wnYm90dG9tJ3wnbGVmdCd8J3JpZ2h0J3wnc3RhcnQnfCdlbmQnfCdoZWFkZXInfCdwcmUtaGVhZGVyJ3xvYmplY3Q7XG4gICAgQElucHV0KCkgZHJhZ2dhYmxlICAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbnx7XG4gICAgICAgIGhhbmRsZVNlbGVjdG9yPzogc3RyaW5nXG4gICAgfTtcbiAgICBASW5wdXQoKSBlbGVtZW50QXR0cmlidXRlcyAgICAgICAgICAgICAgICEgOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmd8bnVsbD47XG4gICAgQElucHV0KCkgZmxvYXRpbmcgICAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBnZXRJdGVtQ2xzICAgICAgICAgICAgICAgICAgICAgICEgOiAoKHJlY29yZDogTW9kZWwpID0+IHN0cmluZyl8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGdldEl0ZW1TdHlsZSAgICAgICAgICAgICAgICAgICAgISA6ICgocmVjb3JkOiBNb2RlbCkgPT4gc3RyaW5nKXxzdHJpbmc7XG4gICAgQElucHV0KCkgZ3JvdXBIZWFkZXJUcGwgICAgICAgICAgICAgICAgICAhIDogKHJlY29yZDogTW9kZWwsIGdyb3VwTmFtZTogc3RyaW5nKSA9PiBzdHJpbmc7XG4gICAgQElucHV0KCkgaGlkZUFuaW1hdGlvbiAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbnxvYmplY3Q7XG4gICAgQElucHV0KCkgaHRtbENscyAgICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfG9iamVjdDtcbiAgICBASW5wdXQoKSBpZ25vcmVQYXJlbnRSZWFkT25seSAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGlzU2VsZWN0YWJsZSAgICAgICAgICAgICAgICAgICAgISA6ICgoKSA9PiBib29sZWFuKXxzdHJpbmc7XG4gICAgQElucHV0KCkgaXRlbVRwbCAgICAgICAgICAgICAgICAgICAgICAgICAhIDogKChyZWNvcmQ6IE1vZGVsKSA9PiBzdHJpbmcpfHN0cmluZztcbiAgICBASW5wdXQoKSBsaXN0ZW5lcnMgICAgICAgICAgICAgICAgICAgICAgICEgOiBMaXN0TGlzdGVuZXJzO1xuICAgIEBJbnB1dCgpIGxvY2FsZUNsYXNzICAgICAgICAgICAgICAgICAgICAgISA6IHR5cGVvZiBCYXNlO1xuICAgIEBJbnB1dCgpIGxvY2FsaXphYmxlICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgbG9jYWxpemFibGVQcm9wZXJ0aWVzICAgICAgICAgICAhIDogc3RyaW5nW107XG4gICAgQElucHV0KCkgbWFza0RlZmF1bHRzICAgICAgICAgICAgICAgICAgICAhIDogTWFza0NvbmZpZztcbiAgICBASW5wdXQoKSBtYXNrZWQgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFufHN0cmluZ3xNYXNrQ29uZmlnO1xuICAgIEBJbnB1dCgpIG1vbml0b3JSZXNpemUgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58e1xuICAgICAgICBpbW1lZGlhdGU/OiBib29sZWFuXG4gICAgfTtcbiAgICBASW5wdXQoKSBvd25lciAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBXaWRnZXR8YW55O1xuICAgIEBJbnB1dCgpIHBvc2l0aW9uZWQgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcHJldmVudFRvb2x0aXBPblRvdWNoICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSByZWxheVN0b3JlRXZlbnRzICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHJpcHBsZSAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58e1xuICAgICAgICBkZWxlZ2F0ZT86IHN0cmluZ1xuICAgICAgICBjb2xvcj86IHN0cmluZ1xuICAgICAgICByYWRpdXM/OiBudW1iZXJcbiAgICAgICAgY2xpcD86IHN0cmluZ1xuICAgIH07XG4gICAgQElucHV0KCkgcm9vdEVsZW1lbnQgICAgICAgICAgICAgICAgICAgICAhIDogU2hhZG93Um9vdHxIVE1MRWxlbWVudDtcbiAgICBASW5wdXQoKSBzY3JvbGxBY3Rpb24gICAgICAgICAgICAgICAgICAgICEgOiAnaGlkZSd8J3JlYWxpZ24nfG51bGw7XG4gICAgQElucHV0KCkgc2VsZWN0QWxsSXRlbSAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbnxzdHJpbmc7XG4gICAgQElucHV0KCkgc2hvd0FuaW1hdGlvbiAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbnxvYmplY3Q7XG4gICAgQElucHV0KCkgc2hvd1Rvb2x0aXBXaGVuRGlzYWJsZWQgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSB0YWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFufFRhYkNvbmZpZztcbiAgICBASW5wdXQoKSB0YWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgdGV4dEFsaWduICAgICAgICAgICAgICAgICAgICAgICAhIDogJ2xlZnQnfCdjZW50ZXInfCdyaWdodCd8J3N0YXJ0J3wnZW5kJztcbiAgICBASW5wdXQoKSB0b29sdGlwVGVtcGxhdGUgICAgICAgICAgICAgICAgICEgOiAocmVjb3JkOiBNb2RlbCkgPT4gc3RyaW5nO1xuICAgIEBJbnB1dCgpIHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6ICdsaXN0JztcbiAgICBASW5wdXQoKSB1aSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8b2JqZWN0O1xuICAgIEBJbnB1dCgpIHZpcnR1YWxpemUgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58bnVtYmVyO1xuICAgIEBJbnB1dCgpIHdlaWdodCAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcjtcblxuICAgIC8vIENvbmZpZ3MgYW5kIHByb3BlcnRpZXNcbiAgICBASW5wdXQoKSBhbGlnblNlbGYgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBhcHBlbmRUbyAgICAgICAgICAgICAgICAgICAgISA6IEhUTUxFbGVtZW50fHN0cmluZztcbiAgICBASW5wdXQoKSBjYWxsT25GdW5jdGlvbnMgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgY2F0Y2hFdmVudEhhbmRsZXJFeGNlcHRpb25zICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGNscyAgICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfG9iamVjdDtcbiAgICBASW5wdXQoKSBjb2xsYXBzaWJsZUdyb3VwcyAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgY29sdW1uICAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXI7XG4gICAgQElucHV0KCkgY29udGVudCAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgZGF0YXNldCAgICAgICAgICAgICAgICAgICAgICEgOiBvYmplY3R8UmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICBASW5wdXQoKSBkaXNhYmxlZCAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58J2luZXJ0JztcbiAgICBASW5wdXQoKSBlbXB0eVRleHQgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBleHRyYURhdGEgICAgICAgICAgICAgICAgICAgISA6IGFueTtcbiAgICBASW5wdXQoKSBmbGV4ICAgICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcnxzdHJpbmc7XG4gICAgQElucHV0KCkgaGVpZ2h0ICAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXJ8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGhpZGRlbiAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBodG1sICAgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3woKHdpZGdldDogV2lkZ2V0KSA9PiBzdHJpbmcpfERvbUNvbmZpZ3xEb21Db25maWdbXXxWdWVDb25maWc7XG4gICAgQElucHV0KCkgaWQgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgaW5zZXJ0QmVmb3JlICAgICAgICAgICAgICAgICEgOiBIVE1MRWxlbWVudHxzdHJpbmc7XG4gICAgQElucHV0KCkgaW5zZXJ0Rmlyc3QgICAgICAgICAgICAgICAgICEgOiBIVE1MRWxlbWVudHxzdHJpbmc7XG4gICAgQElucHV0KCkgaXRlbXMgICAgICAgICAgICAgICAgICAgICAgICEgOiBvYmplY3RbXTtcbiAgICBASW5wdXQoKSBrZXlNYXAgICAgICAgICAgICAgICAgICAgICAgISA6IFJlY29yZDxzdHJpbmcsIEtleU1hcENvbmZpZz47XG4gICAgQElucHV0KCkgbWFyZ2luICAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXJ8c3RyaW5nO1xuICAgIEBJbnB1dCgpIG1heEhlaWdodCAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfG51bWJlcjtcbiAgICBASW5wdXQoKSBtYXhpbWl6ZU9uTW9iaWxlICAgICAgICAgICAgISA6IG51bWJlcnxzdHJpbmc7XG4gICAgQElucHV0KCkgbWF4V2lkdGggICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8bnVtYmVyO1xuICAgIEBJbnB1dCgpIG1pbkhlaWdodCAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfG51bWJlcjtcbiAgICBASW5wdXQoKSBtaW5XaWR0aCAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xudW1iZXI7XG4gICAgQElucHV0KCkgbXVsdGlTZWxlY3QgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHJlYWRPbmx5ICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBydGwgICAgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgc2Nyb2xsYWJsZSAgICAgICAgICAgICAgICAgICEgOiBTY3JvbGxlcnxib29sZWFufFNjcm9sbGVyQ29uZmlnO1xuICAgIEBJbnB1dCgpIHNlbGVjdGVkICAgICAgICAgICAgICAgICAgICAhIDogTW9kZWx8TW9kZWxbXXxzdHJpbmd8c3RyaW5nW118bnVtYmVyfG51bWJlcltdfENvbGxlY3Rpb258b2JqZWN0W118Q29sbGVjdGlvbkNvbmZpZ3xNb2RlbENvbmZpZ1tdfENvbGxlY3Rpb25Db25maWdbXTtcbiAgICBASW5wdXQoKSBzcGFuICAgICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSBzdG9yZSAgICAgICAgICAgICAgICAgICAgICAgISA6IG9iamVjdHxvYmplY3RbXXxTdG9yZUNvbmZpZ3xTdG9yZXxTdG9yZUNvbmZpZ1tdO1xuICAgIEBJbnB1dCgpIHRpdGxlICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHRvZ2dsZUFsbElmQ3RybFByZXNzZWQgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSB0b29sdGlwICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xUb29sdGlwQ29uZmlnfG51bGw7XG4gICAgQElucHV0KCkgd2lkdGggICAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXJ8c3RyaW5nO1xuICAgIEBJbnB1dCgpIHggICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIHkgICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogbnVtYmVyO1xuXG4gICAgLy8gUHJvcGVydGllcyBvbmx5XG4gICAgQElucHV0KCkgYW5jaG9yU2l6ZSAgICEgOiBudW1iZXJbXTtcbiAgICBASW5wdXQoKSBmb2N1c1Zpc2libGUgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcGFyZW50ICAgICAgICEgOiBXaWRnZXQ7XG5cbiAgICAvLyBFdmVudHMgZW1pdHRlcnNcbiAgICAvKipcbiAgICAgKiBGaXJlcyBiZWZvcmUgYW4gb2JqZWN0IGlzIGRlc3Ryb3llZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLkJhc2V9IGV2ZW50LnNvdXJjZSBUaGUgT2JqZWN0IHRoYXQgaXMgYmVpbmcgZGVzdHJveWVkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZURlc3Ryb3k6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEJhc2UgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCBiZWZvcmUgYSB3aWRnZXQgaXMgaGlkZGVuLiBSZXR1cm4gYGZhbHNlYCB0byBwcmV2ZW50IHRoZSBhY3Rpb24uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhlIHdpZGdldCBiZWluZyBoaWRkZW4uXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlSGlkZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVXNlciBnb2luZyB0byBhY3RpdmF0ZSBhbiBpdGVtIGluIHRoZSBsaXN0IGVpdGhlciBieSBwb2ludGVyIG9yIGtleWJvYXJkLlxuICAgICAqIFRoZSBhY3RpdmUgcmVjb3JkLCBsaXN0IGl0ZW0gaW5kZXgsIGFuZCB0aGUgdHJpZ2dlcmluZyBldmVudCBhcmUgcGFzc2VkLlxuICAgICAqIEl0IGlzIHByZXZlbnRhYmxlIGJ5IHJldHVybmluZyBgZmFsc2VgXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuTGlzdH0gZXZlbnQuc291cmNlIFRoZSBMaXN0IGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuaXRlbSBUaGUgY2xpY2tlZCBsaXN0IGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQucmVjb3JkIEFjdGl2YXRlZCByZWNvcmRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZXZlbnQuaW5kZXggTGlzdCBpdGVtIGluZGV4XG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZXZlbnQgVHJpZ2dlcmluZyBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZUl0ZW06IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IExpc3QsIGl0ZW06IEhUTUxFbGVtZW50LCByZWNvcmQ6IE1vZGVsLCBpbmRleDogbnVtYmVyLCBldmVudDogRXZlbnQgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgYmVmb3JlIGEgd2lkZ2V0IGlzIHNob3duLiBSZXR1cm4gYGZhbHNlYCB0byBwcmV2ZW50IHRoZSBhY3Rpb24uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0LGFueX0gZXZlbnQuc291cmNlIFRoZSB3aWRnZXQgYmVpbmcgc2hvd25cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVTaG93OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBXaWRnZXR8YW55IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiBhbnkgb3RoZXIgZXZlbnQgaXMgZmlyZWQgZnJvbSB0aGUgb2JqZWN0LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvTGlzdCNldmVudC1jYXRjaEFsbClcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHt7W2tleTogc3RyaW5nXTogYW55LCB0eXBlOiBzdHJpbmd9fSBldmVudC5ldmVudCBUaGUgT2JqZWN0IHRoYXQgY29udGFpbnMgZXZlbnQgZGV0YWlsc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5ldmVudC50eXBlIFRoZSB0eXBlIG9mIHRoZSBldmVudCB3aGljaCBpcyBjYXVnaHQgYnkgdGhlIGxpc3RlbmVyXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ2F0Y2hBbGw6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDoge1trZXk6IHN0cmluZ106IGFueSwgdHlwZTogc3RyaW5nfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYW4gb2JqZWN0IGlzIGRlc3Ryb3llZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLkJhc2V9IGV2ZW50LnNvdXJjZSBUaGUgT2JqZWN0IHRoYXQgaXMgYmVpbmcgZGVzdHJveWVkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkRlc3Ryb3k6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEJhc2UgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCB3aGVuIGEgd2lkZ2V0J3MgW2VsZW1lbnRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjcHJvcGVydHktZWxlbWVudCkgaXMgYXZhaWxhYmxlLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC5lbGVtZW50IFRoZSBXaWRnZXQncyBlbGVtZW50LlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkVsZW1lbnRDcmVhdGVkOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgZWxlbWVudDogSFRNTEVsZW1lbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gZm9jdXMgZW50ZXJzIHRoaXMgV2lkZ2V0LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQuc291cmNlIFRoaXMgV2lkZ2V0XG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuZnJvbUVsZW1lbnQgVGhlIGVsZW1lbnQgd2hpY2ggbG9zdCBmb2N1cy5cbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC50b0VsZW1lbnQgVGhlIGVsZW1lbnQgd2hpY2ggZ2FpbmVkIGZvY3VzLlxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5mcm9tV2lkZ2V0IFRoZSB3aWRnZXQgd2hpY2ggbG9zdCBmb2N1cy5cbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQudG9XaWRnZXQgVGhlIHdpZGdldCB3aGljaCBnYWluZWQgZm9jdXMuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5iYWNrd2FyZHMgYHRydWVgIGlmIHRoZSBgdG9FbGVtZW50YCBpcyBiZWZvcmUgdGhlIGBmcm9tRWxlbWVudGAgaW4gZG9jdW1lbnQgb3JkZXIuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRm9jdXNJbjogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0LCBmcm9tRWxlbWVudDogSFRNTEVsZW1lbnQsIHRvRWxlbWVudDogSFRNTEVsZW1lbnQsIGZyb21XaWRnZXQ6IFdpZGdldCwgdG9XaWRnZXQ6IFdpZGdldCwgYmFja3dhcmRzOiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGZvY3VzIGV4aXRzIHRoaXMgV2lkZ2V0J3Mgb3duZXJzaGlwIHRyZWUuIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gYSBgYmx1cmAgZXZlbnQuXG4gICAgICogZm9jdXMgbW92aW5nIGZyb20gd2l0aGluIHRoaXMgV2lkZ2V0J3Mgb3duZXJzaGlwIHRyZWUsIGV2ZW4gaWYgdGhlcmUgYXJlIGZsb2F0aW5nIHdpZGdldHNcbiAgICAgKiB3aWxsIG5vdCB0cmlnZ2VyIHRoaXMgZXZlbnQuIFRoaXMgaXMgd2hlbiBmb2N1cyBleGl0cyB0aGlzIHdpZGdldCBjb21wbGV0ZWx5LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQuc291cmNlIFRoaXMgV2lkZ2V0XG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuZnJvbUVsZW1lbnQgVGhlIGVsZW1lbnQgd2hpY2ggbG9zdCBmb2N1cy5cbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC50b0VsZW1lbnQgVGhlIGVsZW1lbnQgd2hpY2ggZ2FpbmVkIGZvY3VzLlxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5mcm9tV2lkZ2V0IFRoZSB3aWRnZXQgd2hpY2ggbG9zdCBmb2N1cy5cbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQudG9XaWRnZXQgVGhlIHdpZGdldCB3aGljaCBnYWluZWQgZm9jdXMuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5iYWNrd2FyZHMgYHRydWVgIGlmIHRoZSBgdG9FbGVtZW50YCBpcyBiZWZvcmUgdGhlIGBmcm9tRWxlbWVudGAgaW4gZG9jdW1lbnQgb3JkZXIuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRm9jdXNPdXQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldCwgZnJvbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCB0b0VsZW1lbnQ6IEhUTUxFbGVtZW50LCBmcm9tV2lkZ2V0OiBXaWRnZXQsIHRvV2lkZ2V0OiBXaWRnZXQsIGJhY2t3YXJkczogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIGFmdGVyIGEgd2lkZ2V0IHdhcyBoaWRkZW5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnNvdXJjZSBUaGUgd2lkZ2V0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uSGlkZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBVc2VyIGFjdGl2YXRlZCBhbiBpdGVtIGluIHRoZSBsaXN0IGVpdGhlciBieSBwb2ludGVyIG9yIGtleWJvYXJkLlxuICAgICAqIFRoZSBhY3RpdmUgcmVjb3JkLCBsaXN0IGl0ZW0gaW5kZXgsIGFuZCB0aGUgdHJpZ2dlcmluZyBldmVudCBhcmUgcGFzc2VkLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lkxpc3R9IGV2ZW50LnNvdXJjZSBUaGUgTGlzdCBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50Lml0ZW0gVGhlIGNsaWNrZWQgbGlzdCBlbGVtZW50XG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBBY3RpdmF0ZWQgcmVjb3JkXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGV2ZW50LmluZGV4IExpc3QgaXRlbSBpbmRleFxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmV2ZW50IFRyaWdnZXJpbmcgZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25JdGVtOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBMaXN0LCBpdGVtOiBIVE1MRWxlbWVudCwgcmVjb3JkOiBNb2RlbCwgaW5kZXg6IG51bWJlciwgZXZlbnQ6IEV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgd2hlbiBhIHdpZGdldCB3aGljaCBoYWQgYmVlbiBpbiBhIG5vbi12aXNpYmxlIHN0YXRlIGZvciBhbnkgcmVhc29uXG4gICAgICogYWNoaWV2ZXMgdmlzaWJpbGl0eS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0xpc3QjZXZlbnQtcGFpbnQpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhlIHdpZGdldCBiZWluZyBwYWludGVkLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuZmlyc3RQYWludCBgdHJ1ZWAgaWYgdGhpcyBpcyB0aGUgZmlyc3QgcGFpbnQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uUGFpbnQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldCwgZmlyc3RQYWludDogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIFdpZGdldCdzIHJlYWQgb25seSBzdGF0ZSBpcyB0b2dnbGVkXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQucmVhZE9ubHkgUmVhZCBvbmx5IG9yIG5vdFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJlYWRPbmx5OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgcmVhZE9ubHk6IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgaXMgZmlyZWQgYWZ0ZXIgYSB3aWRnZXQncyBlbGVtZW50cyBoYXZlIGJlZW4gc3luY2hyb25pemVkIGR1ZSB0byBhIGRpcmVjdCBvciBpbmRpcmVjdCBjYWxsXG4gICAgICogdG8gW3JlY29tcG9zZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNmdW5jdGlvbi1yZWNvbXBvc2UpLCBpZiB0aGlzIHJlc3VsdHMgaW4gc29tZSBjaGFuZ2UgdG8gdGhlIHdpZGdldCdzIHJlbmRlcmVkIERPTSBlbGVtZW50cy5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25SZWNvbXBvc2U6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KCgpID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIHRoZSBlbmNhcHN1bGF0aW5nIGVsZW1lbnQgb2YgYSBXaWRnZXQgcmVzaXplcyAqb25seSB3aGVuIFttb25pdG9yUmVzaXplXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1tb25pdG9yUmVzaXplKSBpcyBgdHJ1ZWAqLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQuc291cmNlIFRoaXMgV2lkZ2V0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGV2ZW50LndpZHRoIFRoZSBuZXcgd2lkdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZXZlbnQuaGVpZ2h0IFRoZSBuZXcgaGVpZ2h0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGV2ZW50Lm9sZFdpZHRoIFRoZSBvbGQgd2lkdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZXZlbnQub2xkSGVpZ2h0IFRoZSBvbGQgaGVpZ2h0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uUmVzaXplOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBXaWRnZXQsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBvbGRXaWR0aDogbnVtYmVyLCBvbGRIZWlnaHQ6IG51bWJlciB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBzZWxlY3Rpb24gY2hhbmdlc1xuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lkxpc3R9IGV2ZW50LnNvdXJjZSBUaGUgTGlzdCBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsW119IGV2ZW50LnNlbGVjdGVkIEFuIGFycmF5IG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcmVjb3Jkc1xuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblNlbGVjdGlvbkNoYW5nZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogTGlzdCwgc2VsZWN0ZWQ6IE1vZGVsW10gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCBhZnRlciBhIHdpZGdldCBpcyBzaG93bi5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnNvdXJjZSBUaGUgd2lkZ2V0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU2hvdzogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBHcm91cCBpdGVtIGV4cGFuZGVkIG9yIGNvbGxhcHNlZFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQuZ3JvdXBSZWNvcmQgR3JvdXAgcmVjb3JkXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5jb2xsYXBzZSBDb2xsYXBzZWQgKHRydWUpIG9yIGV4cGFuZGVkIChmYWxzZSlcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Ub2dnbGVHcm91cDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGdyb3VwUmVjb3JkOiBNb2RlbCwgY29sbGFwc2U6IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyZWUgcGFyZW50IG5vZGUgZXhwYW5kZWQgb3IgY29sbGFwc2VkXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsfSBldmVudC5yZWNvcmQgVGhlIHBhcmVudCByZWNvcmQgd2hpY2ggaGFzIGJlZW4gdG9nZ2xlZFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuY29sbGFwc2UgQ29sbGFwc2VkICh0cnVlKSBvciBleHBhbmRlZCAoZmFsc2UpXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uVG9nZ2xlTm9kZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHJlY29yZDogTW9kZWwsIGNvbGxhcHNlOiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhbmQgYXBwZW5kIHRoZSB1bmRlcmx5aW5nIHdpZGdldFxuICAgICAqL1xuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBjb25zdFxuICAgICAgICAgICAgbWUgPSB0aGlzLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGVsZW1lbnRSZWYsXG4gICAgICAgICAgICAgICAgYnJ5bnR1bUNvbmZpZ1xuICAgICAgICAgICAgfSA9IG1lLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlQ2xhc3MsXG4gICAgICAgICAgICAgICAgaW5zdGFuY2VOYW1lLFxuICAgICAgICAgICAgICAgIGJyeW50dW1Db25maWdzLFxuICAgICAgICAgICAgICAgIGJyeW50dW1FdmVudHNcbiAgICAgICAgICAgIH0gPSBCcnludHVtTGlzdENvbXBvbmVudDtcblxuICAgICAgICBicnludHVtQ29uZmlncy5maWx0ZXIocHJvcCA9PiBwcm9wIGluIHRoaXMpLmZvckVhY2gocHJvcCA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBXcmFwcGVySGVscGVyLmFwcGx5UHJvcFZhbHVlKGJyeW50dW1Db25maWcsIHByb3AsIHRoaXNbcHJvcF0pO1xuICAgICAgICAgICAgaWYgKFsnZmVhdHVyZXMnLCAnY29uZmlnJ10uaW5jbHVkZXMocHJvcCkpIHtcbiAgICAgICAgICAgICAgICBXcmFwcGVySGVscGVyLmRldldhcm5pbmdDb25maWdQcm9wKGluc3RhbmNlTmFtZSwgcHJvcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGJyeW50dW1FdmVudHMuZmlsdGVyKGV2ZW50ID0+IHRoaXNbZXZlbnRdICYmIHRoaXNbZXZlbnRdLm9ic2VydmVycy5sZW5ndGggPiAwKS5mb3JFYWNoKGV2ZW50ID0+IHtcbiAgICAgICAgICAgIGNvbnN0XG4gICAgICAgICAgICAgICAgdW5jYXBpdGFsaXplID0gKHN0cjogc3RyaW5nKSA9PiBzdHIuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSksXG4gICAgICAgICAgICAgICAgZXZlbnROYW1lID0gKHN0cjogc3RyaW5nKSA9PiB1bmNhcGl0YWxpemUoc3RyLnNsaWNlKDIpKTtcblxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgYnJ5bnR1bUNvbmZpZy5saXN0ZW5lcnNbZXZlbnROYW1lKGV2ZW50KV0gPSBlID0+IHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgbWVbZXZlbnRdLmVtaXQoZSk7XG4gICAgICAgICAgICAgICAgLy8gRXZlbnRFbWl0dGVyIGRvZXMgbm90IHJldHVybiB2YWx1ZXMgaW4gdGhlIG5vcm1hbCB3YXksIHdvcmsgYXJvdW5kIGl0IGJ5IHNldHRpbmcgYHJldHVyblZhbHVlYCBmbGFnXG4gICAgICAgICAgICAgICAgLy8gaW4gQW5ndWxhciBsaXN0ZW5lcnNcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5yZXR1cm5WYWx1ZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIElmIGNvbXBvbmVudCBoYXMgbm8gY29udGFpbmVyIHNwZWNpZmllZCBpbiBjb25maWcgdGhlbiB1c2UgYWRvcHQgdG8gV3JhcHBlcidzIGVsZW1lbnRcbiAgICAgICAgY29uc3RcbiAgICAgICAgICAgIGNvbnRhaW5lclBhcmFtID0gW1xuICAgICAgICAgICAgICAgICdhZG9wdCcsXG4gICAgICAgICAgICAgICAgJ2FwcGVuZFRvJyxcbiAgICAgICAgICAgICAgICAnaW5zZXJ0QWZ0ZXInLFxuICAgICAgICAgICAgICAgICdpbnNlcnRCZWZvcmUnXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgXS5maW5kKHByb3AgPT4gYnJ5bnR1bUNvbmZpZ1twcm9wXSk7XG4gICAgICAgIGlmICghY29udGFpbmVyUGFyYW0pIHtcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZU5hbWUgPT09ICdCdXR0b24nIHx8IGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRSb290Tm9kZSgpIGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgICAgICAgICAgICAgIC8vIEJ1dHRvbiBzaG91bGQgYWx3YXlzIGJlIDxhPiBvciA8YnV0dG9uPiBpbnNpZGUgb3duZXIgZWxlbWVudFxuICAgICAgICAgICAgICAgIGJyeW50dW1Db25maWcuYXBwZW5kVG8gPSBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBicnludHVtQ29uZmlnLmFkb3B0ID0gZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgV3JhcHBlckhlbHBlci5kZXZXYXJuaW5nQ29udGFpbmVyKGluc3RhbmNlTmFtZSwgY29udGFpbmVyUGFyYW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBtZS5pbnN0YW5jZSA9IGluc3RhbmNlTmFtZSA9PT0gJ1dpZGdldCcgPyBXaWRnZXQuY3JlYXRlKGJyeW50dW1Db25maWcpIDogbmV3IGluc3RhbmNlQ2xhc3MoYnJ5bnR1bUNvbmZpZyk7XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXYXRjaCBmb3IgY2hhbmdlc1xuICAgICAqIEBwYXJhbSBjaGFuZ2VzXG4gICAgICovXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBjb25zdFxuICAgICAgICAgICAgeyBpbnN0YW5jZSB9ID0gdGhpcyxcbiAgICAgICAgICAgIHsgaW5zdGFuY2VOYW1lIH0gPSBCcnludHVtTGlzdENvbXBvbmVudDtcbiAgICAgICAgaWYgKCFpbnN0YW5jZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgY2hhbmdlc1xuICAgICAgICBPYmplY3QuZW50cmllcyhjaGFuZ2VzKS5mb3JFYWNoKChbcHJvcCwgY2hhbmdlXSkgPT4ge1xuICAgICAgICAgICAgY29uc3RcbiAgICAgICAgICAgICAgICBuZXdWYWx1ZSA9IChjaGFuZ2UgYXMgU2ltcGxlQ2hhbmdlKS5jdXJyZW50VmFsdWUsXG4gICAgICAgICAgICAgICAgeyBpbnN0YW5jZSB9ID0gdGhpcyxcbiAgICAgICAgICAgICAgICB7IGJyeW50dW1Db25maWdzT25seSwgYnJ5bnR1bVByb3BzIH0gPSBCcnludHVtTGlzdENvbXBvbmVudDtcbiAgICAgICAgICAgIGlmIChicnludHVtUHJvcHMuaW5jbHVkZXMocHJvcCkpIHtcbiAgICAgICAgICAgICAgICBXcmFwcGVySGVscGVyLmFwcGx5UHJvcFZhbHVlKGluc3RhbmNlLCBwcm9wLCBuZXdWYWx1ZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChicnludHVtQ29uZmlnc09ubHkuaW5jbHVkZXMocHJvcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgV3JhcHBlckhlbHBlci5kZXZXYXJuaW5nVXBkYXRlUHJvcChpbnN0YW5jZU5hbWUsIHByb3ApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzdHJveSB0aGUgY29tcG9uZW50XG4gICAgICovXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKHRoaXMuaW5zdGFuY2UgJiYgdGhpcy5pbnN0YW5jZS5kZXN0cm95KSB7XG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==