@bryntum/calendar-angular-thin 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 (46) hide show
  1. package/README.md +44 -0
  2. package/bryntum-calendar-angular-thin.d.ts +5 -0
  3. package/bundles/bryntum-calendar-angular-thin.umd.js +22195 -0
  4. package/bundles/bryntum-calendar-angular-thin.umd.js.map +1 -0
  5. package/esm2015/bryntum-calendar-angular-thin.js +5 -0
  6. package/esm2015/lib/bryntum-agenda-view.component.js +2503 -0
  7. package/esm2015/lib/bryntum-calendar-date-picker.component.js +1045 -0
  8. package/esm2015/lib/bryntum-calendar-project-model.component.js +369 -0
  9. package/esm2015/lib/bryntum-calendar.component.js +2355 -0
  10. package/esm2015/lib/bryntum-day-agenda-view.component.js +1338 -0
  11. package/esm2015/lib/bryntum-day-resource-view.component.js +1347 -0
  12. package/esm2015/lib/bryntum-day-view.component.js +1323 -0
  13. package/esm2015/lib/bryntum-event-list.component.js +2453 -0
  14. package/esm2015/lib/bryntum-mode-selector.component.js +702 -0
  15. package/esm2015/lib/bryntum-month-agenda-view.component.js +1201 -0
  16. package/esm2015/lib/bryntum-month-grid.component.js +1262 -0
  17. package/esm2015/lib/bryntum-month-view.component.js +1337 -0
  18. package/esm2015/lib/bryntum-range-menu.component.js +884 -0
  19. package/esm2015/lib/bryntum-resource-view.component.js +1068 -0
  20. package/esm2015/lib/bryntum-week-view.component.js +1323 -0
  21. package/esm2015/lib/bryntum-year-view.component.js +1163 -0
  22. package/esm2015/lib/calendar.module.js +99 -0
  23. package/esm2015/lib/wrapper.helper.js +74 -0
  24. package/esm2015/public-api.js +21 -0
  25. package/fesm2015/bryntum-calendar-angular-thin.js +21714 -0
  26. package/fesm2015/bryntum-calendar-angular-thin.js.map +1 -0
  27. package/lib/bryntum-agenda-view.component.d.ts +2953 -0
  28. package/lib/bryntum-calendar-date-picker.component.d.ts +1525 -0
  29. package/lib/bryntum-calendar-project-model.component.d.ts +399 -0
  30. package/lib/bryntum-calendar.component.d.ts +2577 -0
  31. package/lib/bryntum-day-agenda-view.component.d.ts +1960 -0
  32. package/lib/bryntum-day-resource-view.component.d.ts +2025 -0
  33. package/lib/bryntum-day-view.component.d.ts +1980 -0
  34. package/lib/bryntum-event-list.component.d.ts +2888 -0
  35. package/lib/bryntum-mode-selector.component.d.ts +851 -0
  36. package/lib/bryntum-month-agenda-view.component.d.ts +1765 -0
  37. package/lib/bryntum-month-grid.component.d.ts +1731 -0
  38. package/lib/bryntum-month-view.component.d.ts +1897 -0
  39. package/lib/bryntum-range-menu.component.d.ts +1130 -0
  40. package/lib/bryntum-resource-view.component.d.ts +1512 -0
  41. package/lib/bryntum-week-view.component.d.ts +1980 -0
  42. package/lib/bryntum-year-view.component.d.ts +1661 -0
  43. package/lib/calendar.module.d.ts +22 -0
  44. package/lib/wrapper.helper.d.ts +26 -0
  45. package/package.json +33 -0
  46. package/public-api.d.ts +17 -0
@@ -0,0 +1,1337 @@
1
+ /* eslint-disable @typescript-eslint/no-unused-vars */
2
+ /**
3
+ * Angular wrapper for Bryntum MonthView
4
+ */
5
+ import { Component, EventEmitter, Output, Input } from '@angular/core';
6
+ import WrapperHelper from './wrapper.helper';
7
+ import { Widget } from '@bryntum/core-thin';
8
+ import { MonthView } from '@bryntum/calendar-thin';
9
+ import * as i0 from "@angular/core";
10
+ export class BryntumMonthViewComponent {
11
+ constructor(element) {
12
+ this.bryntumConfig = {
13
+ adopt: undefined,
14
+ appendTo: undefined,
15
+ href: undefined,
16
+ angularComponent: this,
17
+ features: {},
18
+ listeners: {}
19
+ };
20
+ // Events emitters
21
+ /**
22
+ * This event fires whenever the [autoCreate gesture](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/CalendarMixin#config-autoCreate) is detected
23
+ * and also when a [drag-create](https://bryntum.com/products/calendar/docs/api/Calendar/feature/CalendarDrag) gesture is detected.
24
+ * ...
25
+ * [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/widget/MonthView#event-beforeAutoCreate)
26
+ * @param {object} event Event object
27
+ * @param {Event} event.domEvent The DOM event which initiated the creation.
28
+ * @param {Date} event.date *DEPRECATED in favour of `startDate`.* The starting time of the event to be created. If this is in a `DayView`, this will be snapped according to the specification in [autoCreate](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/CalendarMixin#config-autoCreate)
29
+ * @param {Date} event.startDate The starting time of the event to be created. If this is in a `DayView`, this will be snapped according to the specification in [autoCreate](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/CalendarMixin#config-autoCreate)
30
+ * @param {Date} event.endDate The ending time of the event to be created.
31
+ * @param {Scheduler.model.ResourceModel} event.resourceRecord The resource if the UI includes a resource.
32
+ * @param {CalendarView} event.view This view.
33
+ */
34
+ this.onBeforeAutoCreate = new EventEmitter();
35
+ /**
36
+ * Triggered before a view's orientating date changes.
37
+ * ...
38
+ * [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/widget/MonthView#event-beforeChangeDate)
39
+ * @param {object} event Event object
40
+ * @param {Date} event.oldDate The current orientating date of this view.
41
+ * @param {Date} event.date The new date to which this view is to be orientated.
42
+ */
43
+ this.onBeforeChangeDate = new EventEmitter();
44
+ /**
45
+ * Fires before an object is destroyed.
46
+ * @param {object} event Event object
47
+ * @param {Core.Base} event.source The Object that is being destroyed.
48
+ */
49
+ this.onBeforeDestroy = new EventEmitter();
50
+ /**
51
+ * Triggered before a widget is hidden. Return `false` to prevent the action.
52
+ * @param {object} event Event object
53
+ * @param {Core.widget.Widget} event.source The widget being hidden.
54
+ */
55
+ this.onBeforeHide = new EventEmitter();
56
+ /**
57
+ * Fires before this CalendarPanel refreshes in response to changes in its month.
58
+ * @param {object} event Event object
59
+ * @param {Core.widget.DatePicker} event.source This DatePicker.
60
+ */
61
+ this.onBeforeRefresh = new EventEmitter();
62
+ /**
63
+ * Triggered before a new [responsiveState](https://bryntum.com/products/calendar/docs/api/Core/widget/mixin/Responsive#config-responsiveState) is applied.
64
+ * @param {object} event Event object
65
+ * @param {Core.widget.Widget} event.source The widget whose `responsiveState` is to be changed
66
+ * @param {string} event.state The new value for the widget's `responsiveState`
67
+ * @param {string} event.oldState The previous value for the widget's `responsiveState`
68
+ */
69
+ this.onBeforeResponsiveStateChange = new EventEmitter();
70
+ /**
71
+ * Fired before this container will load record values into its child fields. This is useful if you
72
+ * want to modify the UI before data is loaded (e.g. set some input field to be readonly)
73
+ * @param {object} event Event object
74
+ * @param {Core.widget.Container} event.source The container
75
+ * @param {Core.data.Model} event.record The record
76
+ */
77
+ this.onBeforeSetRecord = new EventEmitter();
78
+ /**
79
+ * Triggered before a widget is shown. Return `false` to prevent the action.
80
+ * @param {object} event Event object
81
+ * @param {Core.widget.Widget,any} event.source The widget being shown
82
+ */
83
+ this.onBeforeShow = new EventEmitter();
84
+ /**
85
+ * Fired before an [OverflowPopup](https://bryntum.com/products/calendar/docs/api/Calendar/widget/OverflowPopup) is shown when an a
86
+ * "+ n more" overflow button is activated by an [overflowPopupTrigger](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/DayCellRenderer#config-overflowPopupTrigger) event.
87
+ * @param {object} event Event object
88
+ * @param {HTMLElement} event.cell The day cell for which the overflow popup is going to be shown.
89
+ * @param {DayCell} event.cellData A `DayCell` object that contains data about the cell.
90
+ * @param {Date} event.date The date which has overflowing events
91
+ * @param {Calendar.widget.OverflowPopup} event.overflowPopup The overflow `Popup`.
92
+ */
93
+ this.onBeforeShowOverflowPopup = new EventEmitter();
94
+ /**
95
+ * Fired before state is applied to the source. Allows editing the state object or preventing the operation.
96
+ * @param {object} event Event object
97
+ * @param {any} event.state State object config
98
+ */
99
+ this.onBeforeStateApply = new EventEmitter();
100
+ /**
101
+ * Fired before state is saved by the StateProvider. Allows editing the state object or preventing the operation.
102
+ * @param {object} event Event object
103
+ * @param {any} event.state State object config
104
+ */
105
+ this.onBeforeStateSave = new EventEmitter();
106
+ /**
107
+ * Fires when any other event is fired from the object.
108
+ * ...
109
+ * [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/widget/MonthView#event-catchAll)
110
+ * @param {object} event Event object
111
+ * @param {{[key: string]: any, type: string}} event.event The Object that contains event details
112
+ * @param {string} event.event.type The type of the event which is caught by the listener
113
+ */
114
+ this.onCatchAll = new EventEmitter();
115
+ /**
116
+ * Fired when a date cell is clicked.
117
+ * @param {object} event Event object
118
+ * @param {HTMLElement} event.cell The clicked cell element.
119
+ * @param {Date} event.date The date represented by the cell.
120
+ * @param {number[]} event.week The week array `[year, weekNumber]`.
121
+ * @param {Event} event.domEvent The original DOM event.
122
+ */
123
+ this.onCellClick = new EventEmitter();
124
+ /**
125
+ * Fired when a new set of events has been gathered for this view's date range.
126
+ * @param {object} event Event object
127
+ * @param {Map<any, any>} event.cellMap The map of date keys to [day cell](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/DayCellCollecter#typedef-DayCell) data blocks.
128
+ */
129
+ this.onCellMapPopulated = new EventEmitter();
130
+ /**
131
+ * Fires when a Panel is collapsed using the [collapsible](https://bryntum.com/products/calendar/docs/api/Core/widget/Panel#config-collapsible) setting.
132
+ * @param {object} event Event object
133
+ * @param {Core.widget.Panel} event.source This Panel.
134
+ */
135
+ this.onCollapse = new EventEmitter();
136
+ /**
137
+ * Fires when the date of this CalendarPanel is set.
138
+ * @param {object} event Event object
139
+ * @param {Date} event.value The new date.
140
+ * @param {Date} event.oldValue The old date.
141
+ * @param {object} event.changes An object which contains properties which indicate what part of the date changed.
142
+ * @param {boolean} event.changes.d True if the date changed in any way.
143
+ * @param {boolean} event.changes.w True if the week changed (including same week in a different year).
144
+ * @param {boolean} event.changes.m True if the month changed (including same month in a different year).
145
+ * @param {boolean} event.changes.y True if the year changed.
146
+ */
147
+ this.onDateChange = new EventEmitter();
148
+ /**
149
+ * Fired after one day cell's events are collected in sorted order according to the
150
+ * [eventSorter](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/CalendarMixin#config-eventSorter)
151
+ * ...
152
+ * [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/widget/MonthView#event-dayCellPopulated)
153
+ * @param {object} event Event object
154
+ * @param {Scheduler.model.EventModel[]} event.events The events to be shown for the passed date
155
+ * @param {Date} event.The date the events are to be shown in.
156
+ */
157
+ this.onDayCellPopulated = new EventEmitter();
158
+ /**
159
+ * Fires when an object is destroyed.
160
+ * @param {object} event Event object
161
+ * @param {Core.Base} event.source The Object that is being destroyed.
162
+ */
163
+ this.onDestroy = new EventEmitter();
164
+ /**
165
+ * Fires when a field is mutated and the state of the [hasChanges](https://bryntum.com/products/calendar/docs/api/Core/widget/Container#property-hasChanges) property changes
166
+ * @param {object} event Event object
167
+ * @param {Core.widget.Container} event.source The container.
168
+ * @param {boolean} event.dirty The dirty state of the Container - `true` if there are any fields which have been changed since initial load.
169
+ */
170
+ this.onDirtyStateChange = new EventEmitter();
171
+ /**
172
+ * Triggered when a widget's [element](https://bryntum.com/products/calendar/docs/api/Core/widget/Widget#property-element) is available.
173
+ * @param {object} event Event object
174
+ * @param {HTMLElement} event.element The Widget's element.
175
+ */
176
+ this.onElementCreated = new EventEmitter();
177
+ /**
178
+ * Fired when an empty cell content area is clicked on. If the handler returns
179
+ * `false` the current pointer event is not processed further.
180
+ * @param {object} event Event object
181
+ * @param {Event} event.domEvent The triggering DOM event.
182
+ * @param {Date} event.date The date which has no visible events
183
+ */
184
+ this.onEmptyCellClick = new EventEmitter();
185
+ /**
186
+ * Fired when an [autoCreate](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/CalendarMixin#config-autoCreate) gesture has created a new event
187
+ * and added it to the event store.
188
+ * ...
189
+ * [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/widget/MonthView#event-eventAutoCreated)
190
+ * @param {object} event Event object
191
+ * @param {CalendarView} event.source This Calendar view instance.
192
+ * @param {Scheduler.model.EventModel} event.eventRecord The new event record.
193
+ */
194
+ this.onEventAutoCreated = new EventEmitter();
195
+ /**
196
+ * This event is fired when the event height changes due to resizing of the view
197
+ * and the application of [responsiveEventHeight](https://bryntum.com/products/calendar/docs/api/Calendar/widget/MonthView#config-responsiveEventHeight).
198
+ * @param {object} event Event object
199
+ * @param {number} event.height The new event height.
200
+ * @param {number} event.oldHeight The previous event height.
201
+ */
202
+ this.onEventHeightChange = new EventEmitter();
203
+ /**
204
+ * Fires when a day spanning event is found, and the date to which its encapsulating event bar
205
+ * extends has been calculated.
206
+ * ...
207
+ * [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/widget/MonthView#event-eventPropagate)
208
+ * @param {object} event Event object
209
+ * @param {Date} event.eventEndDate The end date for which to calculate the propagate end date.
210
+ * @param {Date} event.propagateEndDate The system-calculated end point of the event bar.
211
+ * @param {boolean} event.isAllDay `true` if the event is an all day event, or spans multiple days.
212
+ * @param {boolean} event.isOverflow `true` if this is being called as part of further propagation.
213
+ * @param {boolean} event.overflows `true` if the event extends into future cells.
214
+ * @param {Scheduler.model.EventModel} event.eventRecord The event record being propagated.
215
+ * @param {Date} event.date The date from which the event is being propagated.
216
+ */
217
+ this.onEventPropagate = new EventEmitter();
218
+ /**
219
+ * Fires when a Panel is expanded using the [collapsible](https://bryntum.com/products/calendar/docs/api/Core/widget/Panel#config-collapsible) setting.
220
+ * @param {object} event Event object
221
+ * @param {Core.widget.Panel} event.source This Panel.
222
+ */
223
+ this.onExpand = new EventEmitter();
224
+ /**
225
+ * Fired when focus enters this Widget.
226
+ * @param {object} event Event object
227
+ * @param {Core.widget.Widget} event.source This Widget
228
+ * @param {HTMLElement} event.fromElement The element which lost focus.
229
+ * @param {HTMLElement} event.toElement The element which gained focus.
230
+ * @param {Core.widget.Widget} event.fromWidget The widget which lost focus.
231
+ * @param {Core.widget.Widget} event.toWidget The widget which gained focus.
232
+ * @param {boolean} event.backwards `true` if the `toElement` is before the `fromElement` in document order.
233
+ */
234
+ this.onFocusIn = new EventEmitter();
235
+ /**
236
+ * Fired when focus exits this Widget's ownership tree. This is different from a `blur` event.
237
+ * focus moving from within this Widget's ownership tree, even if there are floating widgets
238
+ * will not trigger this event. This is when focus exits this widget completely.
239
+ * @param {object} event Event object
240
+ * @param {Core.widget.Widget} event.source This Widget
241
+ * @param {HTMLElement} event.fromElement The element which lost focus.
242
+ * @param {HTMLElement} event.toElement The element which gained focus.
243
+ * @param {Core.widget.Widget} event.fromWidget The widget which lost focus.
244
+ * @param {Core.widget.Widget} event.toWidget The widget which gained focus.
245
+ * @param {boolean} event.backwards `true` if the `toElement` is before the `fromElement` in document order.
246
+ */
247
+ this.onFocusOut = new EventEmitter();
248
+ /**
249
+ * Triggered after a widget was hidden
250
+ * @param {object} event Event object
251
+ * @param {Core.widget.Widget} event.source The widget
252
+ */
253
+ this.onHide = new EventEmitter();
254
+ /**
255
+ * Triggered when a widget which had been in a non-visible state for any reason
256
+ * achieves visibility.
257
+ * ...
258
+ * [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/widget/MonthView#event-paint)
259
+ * @param {object} event Event object
260
+ * @param {Core.widget.Widget} event.source The widget being painted.
261
+ * @param {boolean} event.firstPaint `true` if this is the first paint.
262
+ */
263
+ this.onPaint = new EventEmitter();
264
+ /**
265
+ * Fired when a Widget's read only state is toggled
266
+ * @param {object} event Event object
267
+ * @param {boolean} event.readOnly Read only or not
268
+ */
269
+ this.onReadOnly = new EventEmitter();
270
+ /**
271
+ * This event is fired after a widget's elements have been synchronized due to a direct or indirect call
272
+ * to [recompose](https://bryntum.com/products/calendar/docs/api/Core/widget/Widget#function-recompose), if this results in some change to the widget's rendered DOM elements.
273
+ */
274
+ this.onRecompose = new EventEmitter();
275
+ /**
276
+ * Fires when this CalendarPanel refreshes.
277
+ */
278
+ this.onRefresh = new EventEmitter();
279
+ /**
280
+ * Fired when the encapsulating element of a Widget resizes *only when [monitorResize](https://bryntum.com/products/calendar/docs/api/Core/widget/Widget#config-monitorResize) is `true`*.
281
+ * @param {object} event Event object
282
+ * @param {Core.widget.Widget} event.source This Widget
283
+ * @param {number} event.width The new width
284
+ * @param {number} event.height The new height
285
+ * @param {number} event.oldWidth The old width
286
+ * @param {number} event.oldHeight The old height
287
+ */
288
+ this.onResize = new EventEmitter();
289
+ /**
290
+ * Triggered when a new [responsiveState](https://bryntum.com/products/calendar/docs/api/Core/widget/mixin/Responsive#config-responsiveState) is applied.
291
+ * @param {object} event Event object
292
+ * @param {Core.widget.Widget} event.source The widget whose `responsiveState` has changed
293
+ * @param {string} event.state The new value for the widget's `responsiveState`
294
+ * @param {string} event.oldState The previous value for the widget's `responsiveState`
295
+ */
296
+ this.onResponsiveStateChange = new EventEmitter();
297
+ /**
298
+ * Triggered after a widget is shown.
299
+ * @param {object} event Event object
300
+ * @param {Core.widget.Widget} event.source The widget
301
+ */
302
+ this.onShow = new EventEmitter();
303
+ /**
304
+ * Fired after an [OverflowPopup](https://bryntum.com/products/calendar/docs/api/Calendar/widget/OverflowPopup) has been shown when an a
305
+ * "+ n more" overflow button is activated by an [overflowPopupTrigger](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/DayCellRenderer#config-overflowPopupTrigger) event.
306
+ * @param {object} event Event object
307
+ * @param {HTMLElement} event.cell The day cell for which the overflow popup is going to be shown.
308
+ * @param {DayCell} event.cellData A `DayCell` object that contains data about the cell.
309
+ * @param {Date} event.date The date which has overflowing events
310
+ * @param {Calendar.widget.OverflowPopup} event.overflowPopup The overflow `Popup`.
311
+ */
312
+ this.onShowOverflowPopup = new EventEmitter();
313
+ /**
314
+ * A header [tool](https://bryntum.com/products/calendar/docs/api/Core/widget/Panel#config-tools) has been clicked.
315
+ * @param {object} event Event object
316
+ * @param {Core.widget.Tool} event.source This Panel.
317
+ * @param {Core.widget.Tool} event.tool The tool which is being clicked.
318
+ */
319
+ this.onToolClick = new EventEmitter();
320
+ /**
321
+ * Fired when a week number cell is clicked.
322
+ * @param {object} event Event object
323
+ * @param {Date} event.date The start date of the week.
324
+ * @param {number[]} event.week The week array `[year, weekNumber]`.
325
+ * @param {Event} event.domEvent The original DOM event.
326
+ */
327
+ this.onWeekCellClick = new EventEmitter();
328
+ /**
329
+ * This event is fired as soon as a week row is requested to be flexed. The animated
330
+ * transition to the new height will still be in progress, but the row's flex style is
331
+ * set to its evenly shared flex value.
332
+ * ...
333
+ * [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/widget/MonthView#event-weekFlex)
334
+ * @param {object} event Event object
335
+ * @param {Date} event.weekStart The start date of the week being reverted to a flexed height.
336
+ * @param {HTMLElement} event.element The week row being reverted to a flexed height.
337
+ */
338
+ this.onWeekFlex = new EventEmitter();
339
+ /**
340
+ * This event is fired as soon as a week row is requested to be shrinkwrapped.
341
+ * ...
342
+ * [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/widget/MonthView#event-weekShrinkwrap)
343
+ * @param {object} event Event object
344
+ * @param {Date} event.weekStart The start date of the week being shrinkwrapped.
345
+ * @param {HTMLElement} event.element The week row being shrinkwrapped.
346
+ */
347
+ this.onWeekShrinkwrap = new EventEmitter();
348
+ this.elementRef = element;
349
+ }
350
+ /**
351
+ * Create and append the underlying widget
352
+ */
353
+ ngOnInit() {
354
+ const me = this, { elementRef, bryntumConfig } = me, { instanceClass, instanceName, bryntumConfigs, bryntumEvents } = BryntumMonthViewComponent;
355
+ bryntumConfigs.filter(prop => prop in this).forEach(prop => {
356
+ // @ts-ignore
357
+ WrapperHelper.applyPropValue(bryntumConfig, prop, this[prop]);
358
+ if (['features', 'config'].includes(prop)) {
359
+ WrapperHelper.devWarningConfigProp(instanceName, prop);
360
+ }
361
+ });
362
+ // @ts-ignore
363
+ bryntumEvents.filter(event => this[event] && this[event].observers.length > 0).forEach(event => {
364
+ const uncapitalize = (str) => str.charAt(0).toLowerCase() + str.slice(1), eventName = (str) => uncapitalize(str.slice(2));
365
+ // @ts-ignore
366
+ bryntumConfig.listeners[eventName(event)] = e => {
367
+ // @ts-ignore
368
+ me[event].emit(e);
369
+ // EventEmitter does not return values in the normal way, work around it by setting `returnValue` flag
370
+ // in Angular listeners
371
+ return e.returnValue;
372
+ };
373
+ });
374
+ // If component has no container specified in config then use adopt to Wrapper's element
375
+ const containerParam = [
376
+ 'adopt',
377
+ 'appendTo',
378
+ 'insertAfter',
379
+ 'insertBefore'
380
+ // @ts-ignore
381
+ ].find(prop => bryntumConfig[prop]);
382
+ if (!containerParam) {
383
+ if (instanceName === 'Button' || elementRef.nativeElement.getRootNode() instanceof ShadowRoot) {
384
+ // Button should always be <a> or <button> inside owner element
385
+ bryntumConfig.appendTo = elementRef.nativeElement;
386
+ }
387
+ else {
388
+ bryntumConfig.adopt = elementRef.nativeElement;
389
+ }
390
+ }
391
+ else {
392
+ WrapperHelper.devWarningContainer(instanceName, containerParam);
393
+ }
394
+ // @ts-ignore
395
+ me.instance = instanceName === 'Widget' ? Widget.create(bryntumConfig) : new instanceClass(bryntumConfig);
396
+ }
397
+ /**
398
+ * Watch for changes
399
+ * @param changes
400
+ */
401
+ ngOnChanges(changes) {
402
+ const { instance } = this, { instanceName } = BryntumMonthViewComponent;
403
+ if (!instance) {
404
+ return;
405
+ }
406
+ // Iterate over all changes
407
+ Object.entries(changes).forEach(([prop, change]) => {
408
+ const newValue = change.currentValue, { instance } = this, { bryntumConfigsOnly, bryntumProps } = BryntumMonthViewComponent;
409
+ if (bryntumProps.includes(prop)) {
410
+ WrapperHelper.applyPropValue(instance, prop, newValue, false);
411
+ if (bryntumConfigsOnly.includes(prop)) {
412
+ WrapperHelper.devWarningUpdateProp(instanceName, prop);
413
+ }
414
+ }
415
+ });
416
+ }
417
+ /**
418
+ * Destroy the component
419
+ */
420
+ ngOnDestroy() {
421
+ // @ts-ignore
422
+ if (this.instance && this.instance.destroy) {
423
+ this.instance.destroy();
424
+ }
425
+ }
426
+ }
427
+ BryntumMonthViewComponent.instanceClass = MonthView;
428
+ BryntumMonthViewComponent.instanceName = 'MonthView';
429
+ BryntumMonthViewComponent.bryntumEvents = [
430
+ 'onBeforeAutoCreate',
431
+ 'onBeforeChangeDate',
432
+ 'onBeforeDestroy',
433
+ 'onBeforeHide',
434
+ 'onBeforeRefresh',
435
+ 'onBeforeResponsiveStateChange',
436
+ 'onBeforeSetRecord',
437
+ 'onBeforeShow',
438
+ 'onBeforeShowOverflowPopup',
439
+ 'onBeforeStateApply',
440
+ 'onBeforeStateSave',
441
+ 'onCatchAll',
442
+ 'onCellClick',
443
+ 'onCellMapPopulated',
444
+ 'onCollapse',
445
+ 'onDateChange',
446
+ 'onDayCellPopulated',
447
+ 'onDestroy',
448
+ 'onDirtyStateChange',
449
+ 'onElementCreated',
450
+ 'onEmptyCellClick',
451
+ 'onEventAutoCreated',
452
+ 'onEventHeightChange',
453
+ 'onEventPropagate',
454
+ 'onExpand',
455
+ 'onFocusIn',
456
+ 'onFocusOut',
457
+ 'onHide',
458
+ 'onPaint',
459
+ 'onReadOnly',
460
+ 'onRecompose',
461
+ 'onRefresh',
462
+ 'onResize',
463
+ 'onResponsiveStateChange',
464
+ 'onShow',
465
+ 'onShowOverflowPopup',
466
+ 'onToolClick',
467
+ 'onWeekCellClick',
468
+ 'onWeekFlex',
469
+ 'onWeekShrinkwrap'
470
+ ];
471
+ BryntumMonthViewComponent.bryntumFeatureNames = [];
472
+ BryntumMonthViewComponent.bryntumConfigs = BryntumMonthViewComponent.bryntumFeatureNames.concat([
473
+ 'activationKey',
474
+ 'adopt',
475
+ 'align',
476
+ 'alignSelf',
477
+ 'allowDragCreate',
478
+ 'allowDragMove',
479
+ 'allowDragResize',
480
+ 'anchor',
481
+ 'animateTimeShift',
482
+ 'appendTo',
483
+ 'ariaDescription',
484
+ 'ariaLabel',
485
+ 'autoCreate',
486
+ 'autoRowHeight',
487
+ 'bbar',
488
+ 'bodyCls',
489
+ 'bubbleEvents',
490
+ 'callOnFunctions',
491
+ 'catchEventHandlerExceptions',
492
+ 'cellRenderer',
493
+ 'centered',
494
+ 'cls',
495
+ 'collapsed',
496
+ 'collapsible',
497
+ 'color',
498
+ 'column',
499
+ 'config',
500
+ 'constrainTo',
501
+ 'contentElementCls',
502
+ 'dataField',
503
+ 'dataset',
504
+ 'date',
505
+ 'dateFormat',
506
+ 'dateSeparator',
507
+ 'dayCellNameFormat',
508
+ 'dayCellRenderer',
509
+ 'dayNameFormat',
510
+ 'defaultBindProperty',
511
+ 'defaultFocus',
512
+ 'defaults',
513
+ 'defaultScrollOptions',
514
+ 'descriptionFormat',
515
+ 'descriptionRenderer',
516
+ 'detectCSSCompatibilityIssues',
517
+ 'disabled',
518
+ 'disabledCls',
519
+ 'disabledDates',
520
+ 'disableNonWorkingDays',
521
+ 'disableOtherMonthCells',
522
+ 'disableWeekends',
523
+ 'dock',
524
+ 'draggable',
525
+ 'dragUnit',
526
+ 'drawer',
527
+ 'elementAttributes',
528
+ 'emptyCellRenderer',
529
+ 'eventFilter',
530
+ 'eventHeaderRenderer',
531
+ 'eventHeight',
532
+ 'eventRenderer',
533
+ 'eventSorter',
534
+ 'eventSpacing',
535
+ 'extendAllDayEndDay',
536
+ 'extraData',
537
+ 'filterEventResources',
538
+ 'flex',
539
+ 'floating',
540
+ 'footer',
541
+ 'getPrimaryResource',
542
+ 'header',
543
+ 'headerRenderer',
544
+ 'height',
545
+ 'hidden',
546
+ 'hideAnimation',
547
+ 'hideNonWorkingDays',
548
+ 'hideOtherMonthCells',
549
+ 'hideWhenEmpty',
550
+ 'icon',
551
+ 'id',
552
+ 'ignoreParentReadOnly',
553
+ 'inputFieldAlign',
554
+ 'insertBefore',
555
+ 'insertFirst',
556
+ 'itemCls',
557
+ 'items',
558
+ 'keyMap',
559
+ 'labelPosition',
560
+ 'layout',
561
+ 'layoutStyle',
562
+ 'lazyItems',
563
+ 'listeners',
564
+ 'localeClass',
565
+ 'localizable',
566
+ 'localizableProperties',
567
+ 'margin',
568
+ 'maskDefaults',
569
+ 'masked',
570
+ 'maxDate',
571
+ 'maxEventsPerCell',
572
+ 'maxHeight',
573
+ 'maximizeOnMobile',
574
+ 'maxWidth',
575
+ 'minColumnWidth',
576
+ 'minDate',
577
+ 'minHeight',
578
+ 'minRowHeight',
579
+ 'minWidth',
580
+ 'monitorResize',
581
+ 'month',
582
+ 'namedItems',
583
+ 'nonWorkingDayCls',
584
+ 'nonWorkingDays',
585
+ 'otherMonthCls',
586
+ 'overflowButtonRenderer',
587
+ 'overflowClickAction',
588
+ 'overflowPopup',
589
+ 'overflowPopupTrigger',
590
+ 'owner',
591
+ 'pastEventCls',
592
+ 'persistShrinkWrappedRows',
593
+ 'positioned',
594
+ 'preventTooltipOnTouch',
595
+ 'readOnly',
596
+ 'relayStoreEvents',
597
+ 'rendition',
598
+ 'resourceImagePath',
599
+ 'responsive',
600
+ 'responsiveEventHeight',
601
+ 'responsiveRoot',
602
+ 'responsiveState',
603
+ 'responsiveTarget',
604
+ 'ripple',
605
+ 'rootElement',
606
+ 'rtl',
607
+ 'scrollable',
608
+ 'scrollAction',
609
+ 'selectorButton',
610
+ 'selectorMenuItem',
611
+ 'shadePastDates',
612
+ 'shortDateFormat',
613
+ 'shortDateTimeFormat',
614
+ 'shortEventCls',
615
+ 'shortEventDuration',
616
+ 'showAnimation',
617
+ 'showBullet',
618
+ 'showResourceAvatars',
619
+ 'showTooltipWhenDisabled',
620
+ 'showWeekColumn',
621
+ 'showWeekNumber',
622
+ 'sixWeeks',
623
+ 'span',
624
+ 'stackMultiDayEvents',
625
+ 'stateful',
626
+ 'statefulEvents',
627
+ 'stateId',
628
+ 'stateProvider',
629
+ 'strictRecordMapping',
630
+ 'strips',
631
+ 'syncCalendarDate',
632
+ 'syncViewDate',
633
+ 'tab',
634
+ 'tabBarItems',
635
+ 'tag',
636
+ 'tbar',
637
+ 'textAlign',
638
+ 'timeFormat',
639
+ 'tip',
640
+ 'title',
641
+ 'todayCls',
642
+ 'tools',
643
+ 'tooltip',
644
+ 'trapFocus',
645
+ 'type',
646
+ 'ui',
647
+ 'weekColumnHeader',
648
+ 'weekendCls',
649
+ 'weekRenderer',
650
+ 'weekStartDay',
651
+ 'weight',
652
+ 'width',
653
+ 'x',
654
+ 'y'
655
+ ]);
656
+ BryntumMonthViewComponent.bryntumConfigsOnly = [
657
+ 'activationKey',
658
+ 'adopt',
659
+ 'align',
660
+ 'anchor',
661
+ 'ariaDescription',
662
+ 'ariaLabel',
663
+ 'bbar',
664
+ 'bodyCls',
665
+ 'bubbleEvents',
666
+ 'cellRenderer',
667
+ 'centered',
668
+ 'collapsible',
669
+ 'color',
670
+ 'config',
671
+ 'constrainTo',
672
+ 'contentElementCls',
673
+ 'dataField',
674
+ 'dayCellNameFormat',
675
+ 'dayCellRenderer',
676
+ 'dayNameFormat',
677
+ 'defaultBindProperty',
678
+ 'defaultFocus',
679
+ 'defaults',
680
+ 'descriptionRenderer',
681
+ 'detectCSSCompatibilityIssues',
682
+ 'disabledCls',
683
+ 'disabledDates',
684
+ 'disableNonWorkingDays',
685
+ 'disableOtherMonthCells',
686
+ 'disableWeekends',
687
+ 'dock',
688
+ 'draggable',
689
+ 'drawer',
690
+ 'elementAttributes',
691
+ 'emptyCellRenderer',
692
+ 'eventFilter',
693
+ 'eventHeaderRenderer',
694
+ 'eventRenderer',
695
+ 'eventSorter',
696
+ 'floating',
697
+ 'footer',
698
+ 'getPrimaryResource',
699
+ 'header',
700
+ 'headerRenderer',
701
+ 'hideAnimation',
702
+ 'hideOtherMonthCells',
703
+ 'hideWhenEmpty',
704
+ 'icon',
705
+ 'ignoreParentReadOnly',
706
+ 'itemCls',
707
+ 'lazyItems',
708
+ 'listeners',
709
+ 'localeClass',
710
+ 'localizable',
711
+ 'localizableProperties',
712
+ 'maskDefaults',
713
+ 'masked',
714
+ 'maxEventsPerCell',
715
+ 'minColumnWidth',
716
+ 'minRowHeight',
717
+ 'monitorResize',
718
+ 'month',
719
+ 'namedItems',
720
+ 'nonWorkingDayCls',
721
+ 'otherMonthCls',
722
+ 'overflowButtonRenderer',
723
+ 'overflowClickAction',
724
+ 'overflowPopup',
725
+ 'overflowPopupTrigger',
726
+ 'owner',
727
+ 'positioned',
728
+ 'preventTooltipOnTouch',
729
+ 'relayStoreEvents',
730
+ 'resourceImagePath',
731
+ 'responsive',
732
+ 'responsiveEventHeight',
733
+ 'responsiveRoot',
734
+ 'responsiveState',
735
+ 'responsiveTarget',
736
+ 'ripple',
737
+ 'rootElement',
738
+ 'scrollAction',
739
+ 'selectorButton',
740
+ 'selectorMenuItem',
741
+ 'shortEventCls',
742
+ 'shortEventDuration',
743
+ 'showAnimation',
744
+ 'showBullet',
745
+ 'showResourceAvatars',
746
+ 'showTooltipWhenDisabled',
747
+ 'showWeekColumn',
748
+ 'sixWeeks',
749
+ 'stateful',
750
+ 'statefulEvents',
751
+ 'stateId',
752
+ 'stateProvider',
753
+ 'strips',
754
+ 'tab',
755
+ 'tabBarItems',
756
+ 'tag',
757
+ 'tbar',
758
+ 'textAlign',
759
+ 'timeFormat',
760
+ 'tip',
761
+ 'todayCls',
762
+ 'trapFocus',
763
+ 'type',
764
+ 'ui',
765
+ 'weekendCls',
766
+ 'weekRenderer',
767
+ 'weekStartDay',
768
+ 'weight'
769
+ ];
770
+ BryntumMonthViewComponent.bryntumProps = BryntumMonthViewComponent.bryntumFeatureNames.concat([
771
+ 'alignSelf',
772
+ 'allowDragCreate',
773
+ 'allowDragMove',
774
+ 'allowDragResize',
775
+ 'anchorSize',
776
+ 'animateTimeShift',
777
+ 'appendTo',
778
+ 'autoCreate',
779
+ 'autoRowHeight',
780
+ 'callOnFunctions',
781
+ 'catchEventHandlerExceptions',
782
+ 'cls',
783
+ 'collapsed',
784
+ 'column',
785
+ 'dataset',
786
+ 'date',
787
+ 'dateFormat',
788
+ 'dateSeparator',
789
+ 'dayCellCls',
790
+ 'defaultScrollOptions',
791
+ 'descriptionFormat',
792
+ 'disabled',
793
+ 'dragUnit',
794
+ 'eventHeight',
795
+ 'eventSpacing',
796
+ 'extendAllDayEndDay',
797
+ 'extraData',
798
+ 'filterEventResources',
799
+ 'firstVisibleCell',
800
+ 'firstVisibleDate',
801
+ 'flex',
802
+ 'focusVisible',
803
+ 'hasChanges',
804
+ 'height',
805
+ 'hidden',
806
+ 'hideNonWorkingDays',
807
+ 'id',
808
+ 'inputFieldAlign',
809
+ 'insertBefore',
810
+ 'insertFirst',
811
+ 'isSettingValues',
812
+ 'isValid',
813
+ 'items',
814
+ 'keyMap',
815
+ 'labelPosition',
816
+ 'lastVisibleCell',
817
+ 'lastVisibleDate',
818
+ 'layout',
819
+ 'layoutStyle',
820
+ 'margin',
821
+ 'maxDate',
822
+ 'maxHeight',
823
+ 'maximizeOnMobile',
824
+ 'maxWidth',
825
+ 'minDate',
826
+ 'minHeight',
827
+ 'minWidth',
828
+ 'nonWorkingDays',
829
+ 'parent',
830
+ 'pastEventCls',
831
+ 'persistShrinkWrappedRows',
832
+ 'readOnly',
833
+ 'record',
834
+ 'rendition',
835
+ 'rtl',
836
+ 'scrollable',
837
+ 'shadePastDates',
838
+ 'shortDateFormat',
839
+ 'shortDateTimeFormat',
840
+ 'showWeekNumber',
841
+ 'span',
842
+ 'stackMultiDayEvents',
843
+ 'state',
844
+ 'strictRecordMapping',
845
+ 'syncCalendarDate',
846
+ 'syncViewDate',
847
+ 'title',
848
+ 'tools',
849
+ 'tooltip',
850
+ 'values',
851
+ 'weekColumnHeader',
852
+ 'width',
853
+ 'x',
854
+ 'y'
855
+ ]);
856
+ BryntumMonthViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.0", ngImport: i0, type: BryntumMonthViewComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
857
+ BryntumMonthViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.0", type: BryntumMonthViewComponent, selector: "bryntum-month-view", inputs: { activationKey: "activationKey", adopt: "adopt", align: "align", anchor: "anchor", ariaDescription: "ariaDescription", ariaLabel: "ariaLabel", bbar: "bbar", bodyCls: "bodyCls", bubbleEvents: "bubbleEvents", cellRenderer: "cellRenderer", centered: "centered", collapsible: "collapsible", color: "color", config: "config", constrainTo: "constrainTo", contentElementCls: "contentElementCls", dataField: "dataField", dayCellNameFormat: "dayCellNameFormat", dayCellRenderer: "dayCellRenderer", dayNameFormat: "dayNameFormat", defaultBindProperty: "defaultBindProperty", defaultFocus: "defaultFocus", defaults: "defaults", descriptionRenderer: "descriptionRenderer", detectCSSCompatibilityIssues: "detectCSSCompatibilityIssues", disabledCls: "disabledCls", disabledDates: "disabledDates", disableNonWorkingDays: "disableNonWorkingDays", disableOtherMonthCells: "disableOtherMonthCells", disableWeekends: "disableWeekends", dock: "dock", draggable: "draggable", drawer: "drawer", elementAttributes: "elementAttributes", emptyCellRenderer: "emptyCellRenderer", eventFilter: "eventFilter", eventHeaderRenderer: "eventHeaderRenderer", eventRenderer: "eventRenderer", eventSorter: "eventSorter", floating: "floating", footer: "footer", getPrimaryResource: "getPrimaryResource", header: "header", headerRenderer: "headerRenderer", hideAnimation: "hideAnimation", hideOtherMonthCells: "hideOtherMonthCells", hideWhenEmpty: "hideWhenEmpty", icon: "icon", ignoreParentReadOnly: "ignoreParentReadOnly", itemCls: "itemCls", lazyItems: "lazyItems", listeners: "listeners", localeClass: "localeClass", localizable: "localizable", localizableProperties: "localizableProperties", maskDefaults: "maskDefaults", masked: "masked", maxEventsPerCell: "maxEventsPerCell", minColumnWidth: "minColumnWidth", minRowHeight: "minRowHeight", monitorResize: "monitorResize", month: "month", namedItems: "namedItems", nonWorkingDayCls: "nonWorkingDayCls", otherMonthCls: "otherMonthCls", overflowButtonRenderer: "overflowButtonRenderer", overflowClickAction: "overflowClickAction", overflowPopup: "overflowPopup", overflowPopupTrigger: "overflowPopupTrigger", owner: "owner", positioned: "positioned", preventTooltipOnTouch: "preventTooltipOnTouch", relayStoreEvents: "relayStoreEvents", resourceImagePath: "resourceImagePath", responsive: "responsive", responsiveEventHeight: "responsiveEventHeight", responsiveRoot: "responsiveRoot", responsiveState: "responsiveState", responsiveTarget: "responsiveTarget", ripple: "ripple", rootElement: "rootElement", scrollAction: "scrollAction", selectorButton: "selectorButton", selectorMenuItem: "selectorMenuItem", shortEventCls: "shortEventCls", shortEventDuration: "shortEventDuration", showAnimation: "showAnimation", showBullet: "showBullet", showResourceAvatars: "showResourceAvatars", showTooltipWhenDisabled: "showTooltipWhenDisabled", showWeekColumn: "showWeekColumn", sixWeeks: "sixWeeks", stateful: "stateful", statefulEvents: "statefulEvents", stateId: "stateId", stateProvider: "stateProvider", strips: "strips", tab: "tab", tabBarItems: "tabBarItems", tag: "tag", tbar: "tbar", textAlign: "textAlign", timeFormat: "timeFormat", tip: "tip", todayCls: "todayCls", trapFocus: "trapFocus", type: "type", ui: "ui", weekendCls: "weekendCls", weekRenderer: "weekRenderer", weekStartDay: "weekStartDay", weight: "weight", alignSelf: "alignSelf", allowDragCreate: "allowDragCreate", allowDragMove: "allowDragMove", allowDragResize: "allowDragResize", animateTimeShift: "animateTimeShift", appendTo: "appendTo", autoCreate: "autoCreate", autoRowHeight: "autoRowHeight", callOnFunctions: "callOnFunctions", catchEventHandlerExceptions: "catchEventHandlerExceptions", cls: "cls", collapsed: "collapsed", column: "column", dataset: "dataset", date: "date", dateFormat: "dateFormat", dateSeparator: "dateSeparator", defaultScrollOptions: "defaultScrollOptions", descriptionFormat: "descriptionFormat", disabled: "disabled", dragUnit: "dragUnit", eventHeight: "eventHeight", eventSpacing: "eventSpacing", extendAllDayEndDay: "extendAllDayEndDay", extraData: "extraData", filterEventResources: "filterEventResources", flex: "flex", height: "height", hidden: "hidden", hideNonWorkingDays: "hideNonWorkingDays", id: "id", inputFieldAlign: "inputFieldAlign", insertBefore: "insertBefore", insertFirst: "insertFirst", items: "items", keyMap: "keyMap", labelPosition: "labelPosition", layout: "layout", layoutStyle: "layoutStyle", margin: "margin", maxDate: "maxDate", maxHeight: "maxHeight", maximizeOnMobile: "maximizeOnMobile", maxWidth: "maxWidth", minDate: "minDate", minHeight: "minHeight", minWidth: "minWidth", nonWorkingDays: "nonWorkingDays", pastEventCls: "pastEventCls", persistShrinkWrappedRows: "persistShrinkWrappedRows", readOnly: "readOnly", rendition: "rendition", rtl: "rtl", scrollable: "scrollable", shadePastDates: "shadePastDates", shortDateFormat: "shortDateFormat", shortDateTimeFormat: "shortDateTimeFormat", showWeekNumber: "showWeekNumber", span: "span", stackMultiDayEvents: "stackMultiDayEvents", strictRecordMapping: "strictRecordMapping", syncCalendarDate: "syncCalendarDate", syncViewDate: "syncViewDate", title: "title", tools: "tools", tooltip: "tooltip", weekColumnHeader: "weekColumnHeader", width: "width", x: "x", y: "y", anchorSize: "anchorSize", dayCellCls: "dayCellCls", firstVisibleCell: "firstVisibleCell", firstVisibleDate: "firstVisibleDate", focusVisible: "focusVisible", hasChanges: "hasChanges", isSettingValues: "isSettingValues", isValid: "isValid", lastVisibleCell: "lastVisibleCell", lastVisibleDate: "lastVisibleDate", parent: "parent", record: "record", state: "state", values: "values" }, outputs: { onBeforeAutoCreate: "onBeforeAutoCreate", onBeforeChangeDate: "onBeforeChangeDate", onBeforeDestroy: "onBeforeDestroy", onBeforeHide: "onBeforeHide", onBeforeRefresh: "onBeforeRefresh", onBeforeResponsiveStateChange: "onBeforeResponsiveStateChange", onBeforeSetRecord: "onBeforeSetRecord", onBeforeShow: "onBeforeShow", onBeforeShowOverflowPopup: "onBeforeShowOverflowPopup", onBeforeStateApply: "onBeforeStateApply", onBeforeStateSave: "onBeforeStateSave", onCatchAll: "onCatchAll", onCellClick: "onCellClick", onCellMapPopulated: "onCellMapPopulated", onCollapse: "onCollapse", onDateChange: "onDateChange", onDayCellPopulated: "onDayCellPopulated", onDestroy: "onDestroy", onDirtyStateChange: "onDirtyStateChange", onElementCreated: "onElementCreated", onEmptyCellClick: "onEmptyCellClick", onEventAutoCreated: "onEventAutoCreated", onEventHeightChange: "onEventHeightChange", onEventPropagate: "onEventPropagate", onExpand: "onExpand", onFocusIn: "onFocusIn", onFocusOut: "onFocusOut", onHide: "onHide", onPaint: "onPaint", onReadOnly: "onReadOnly", onRecompose: "onRecompose", onRefresh: "onRefresh", onResize: "onResize", onResponsiveStateChange: "onResponsiveStateChange", onShow: "onShow", onShowOverflowPopup: "onShowOverflowPopup", onToolClick: "onToolClick", onWeekCellClick: "onWeekCellClick", onWeekFlex: "onWeekFlex", onWeekShrinkwrap: "onWeekShrinkwrap" }, usesOnChanges: true, ngImport: i0, template: '', isInline: true });
858
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.0", ngImport: i0, type: BryntumMonthViewComponent, decorators: [{
859
+ type: Component,
860
+ args: [{
861
+ selector: 'bryntum-month-view',
862
+ template: ''
863
+ }]
864
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { activationKey: [{
865
+ type: Input
866
+ }], adopt: [{
867
+ type: Input
868
+ }], align: [{
869
+ type: Input
870
+ }], anchor: [{
871
+ type: Input
872
+ }], ariaDescription: [{
873
+ type: Input
874
+ }], ariaLabel: [{
875
+ type: Input
876
+ }], bbar: [{
877
+ type: Input
878
+ }], bodyCls: [{
879
+ type: Input
880
+ }], bubbleEvents: [{
881
+ type: Input
882
+ }], cellRenderer: [{
883
+ type: Input
884
+ }], centered: [{
885
+ type: Input
886
+ }], collapsible: [{
887
+ type: Input
888
+ }], color: [{
889
+ type: Input
890
+ }], config: [{
891
+ type: Input
892
+ }], constrainTo: [{
893
+ type: Input
894
+ }], contentElementCls: [{
895
+ type: Input
896
+ }], dataField: [{
897
+ type: Input
898
+ }], dayCellNameFormat: [{
899
+ type: Input
900
+ }], dayCellRenderer: [{
901
+ type: Input
902
+ }], dayNameFormat: [{
903
+ type: Input
904
+ }], defaultBindProperty: [{
905
+ type: Input
906
+ }], defaultFocus: [{
907
+ type: Input
908
+ }], defaults: [{
909
+ type: Input
910
+ }], descriptionRenderer: [{
911
+ type: Input
912
+ }], detectCSSCompatibilityIssues: [{
913
+ type: Input
914
+ }], disabledCls: [{
915
+ type: Input
916
+ }], disabledDates: [{
917
+ type: Input
918
+ }], disableNonWorkingDays: [{
919
+ type: Input
920
+ }], disableOtherMonthCells: [{
921
+ type: Input
922
+ }], disableWeekends: [{
923
+ type: Input
924
+ }], dock: [{
925
+ type: Input
926
+ }], draggable: [{
927
+ type: Input
928
+ }], drawer: [{
929
+ type: Input
930
+ }], elementAttributes: [{
931
+ type: Input
932
+ }], emptyCellRenderer: [{
933
+ type: Input
934
+ }], eventFilter: [{
935
+ type: Input
936
+ }], eventHeaderRenderer: [{
937
+ type: Input
938
+ }], eventRenderer: [{
939
+ type: Input
940
+ }], eventSorter: [{
941
+ type: Input
942
+ }], floating: [{
943
+ type: Input
944
+ }], footer: [{
945
+ type: Input
946
+ }], getPrimaryResource: [{
947
+ type: Input
948
+ }], header: [{
949
+ type: Input
950
+ }], headerRenderer: [{
951
+ type: Input
952
+ }], hideAnimation: [{
953
+ type: Input
954
+ }], hideOtherMonthCells: [{
955
+ type: Input
956
+ }], hideWhenEmpty: [{
957
+ type: Input
958
+ }], icon: [{
959
+ type: Input
960
+ }], ignoreParentReadOnly: [{
961
+ type: Input
962
+ }], itemCls: [{
963
+ type: Input
964
+ }], lazyItems: [{
965
+ type: Input
966
+ }], listeners: [{
967
+ type: Input
968
+ }], localeClass: [{
969
+ type: Input
970
+ }], localizable: [{
971
+ type: Input
972
+ }], localizableProperties: [{
973
+ type: Input
974
+ }], maskDefaults: [{
975
+ type: Input
976
+ }], masked: [{
977
+ type: Input
978
+ }], maxEventsPerCell: [{
979
+ type: Input
980
+ }], minColumnWidth: [{
981
+ type: Input
982
+ }], minRowHeight: [{
983
+ type: Input
984
+ }], monitorResize: [{
985
+ type: Input
986
+ }], month: [{
987
+ type: Input
988
+ }], namedItems: [{
989
+ type: Input
990
+ }], nonWorkingDayCls: [{
991
+ type: Input
992
+ }], otherMonthCls: [{
993
+ type: Input
994
+ }], overflowButtonRenderer: [{
995
+ type: Input
996
+ }], overflowClickAction: [{
997
+ type: Input
998
+ }], overflowPopup: [{
999
+ type: Input
1000
+ }], overflowPopupTrigger: [{
1001
+ type: Input
1002
+ }], owner: [{
1003
+ type: Input
1004
+ }], positioned: [{
1005
+ type: Input
1006
+ }], preventTooltipOnTouch: [{
1007
+ type: Input
1008
+ }], relayStoreEvents: [{
1009
+ type: Input
1010
+ }], resourceImagePath: [{
1011
+ type: Input
1012
+ }], responsive: [{
1013
+ type: Input
1014
+ }], responsiveEventHeight: [{
1015
+ type: Input
1016
+ }], responsiveRoot: [{
1017
+ type: Input
1018
+ }], responsiveState: [{
1019
+ type: Input
1020
+ }], responsiveTarget: [{
1021
+ type: Input
1022
+ }], ripple: [{
1023
+ type: Input
1024
+ }], rootElement: [{
1025
+ type: Input
1026
+ }], scrollAction: [{
1027
+ type: Input
1028
+ }], selectorButton: [{
1029
+ type: Input
1030
+ }], selectorMenuItem: [{
1031
+ type: Input
1032
+ }], shortEventCls: [{
1033
+ type: Input
1034
+ }], shortEventDuration: [{
1035
+ type: Input
1036
+ }], showAnimation: [{
1037
+ type: Input
1038
+ }], showBullet: [{
1039
+ type: Input
1040
+ }], showResourceAvatars: [{
1041
+ type: Input
1042
+ }], showTooltipWhenDisabled: [{
1043
+ type: Input
1044
+ }], showWeekColumn: [{
1045
+ type: Input
1046
+ }], sixWeeks: [{
1047
+ type: Input
1048
+ }], stateful: [{
1049
+ type: Input
1050
+ }], statefulEvents: [{
1051
+ type: Input
1052
+ }], stateId: [{
1053
+ type: Input
1054
+ }], stateProvider: [{
1055
+ type: Input
1056
+ }], strips: [{
1057
+ type: Input
1058
+ }], tab: [{
1059
+ type: Input
1060
+ }], tabBarItems: [{
1061
+ type: Input
1062
+ }], tag: [{
1063
+ type: Input
1064
+ }], tbar: [{
1065
+ type: Input
1066
+ }], textAlign: [{
1067
+ type: Input
1068
+ }], timeFormat: [{
1069
+ type: Input
1070
+ }], tip: [{
1071
+ type: Input
1072
+ }], todayCls: [{
1073
+ type: Input
1074
+ }], trapFocus: [{
1075
+ type: Input
1076
+ }], type: [{
1077
+ type: Input
1078
+ }], ui: [{
1079
+ type: Input
1080
+ }], weekendCls: [{
1081
+ type: Input
1082
+ }], weekRenderer: [{
1083
+ type: Input
1084
+ }], weekStartDay: [{
1085
+ type: Input
1086
+ }], weight: [{
1087
+ type: Input
1088
+ }], alignSelf: [{
1089
+ type: Input
1090
+ }], allowDragCreate: [{
1091
+ type: Input
1092
+ }], allowDragMove: [{
1093
+ type: Input
1094
+ }], allowDragResize: [{
1095
+ type: Input
1096
+ }], animateTimeShift: [{
1097
+ type: Input
1098
+ }], appendTo: [{
1099
+ type: Input
1100
+ }], autoCreate: [{
1101
+ type: Input
1102
+ }], autoRowHeight: [{
1103
+ type: Input
1104
+ }], callOnFunctions: [{
1105
+ type: Input
1106
+ }], catchEventHandlerExceptions: [{
1107
+ type: Input
1108
+ }], cls: [{
1109
+ type: Input
1110
+ }], collapsed: [{
1111
+ type: Input
1112
+ }], column: [{
1113
+ type: Input
1114
+ }], dataset: [{
1115
+ type: Input
1116
+ }], date: [{
1117
+ type: Input
1118
+ }], dateFormat: [{
1119
+ type: Input
1120
+ }], dateSeparator: [{
1121
+ type: Input
1122
+ }], defaultScrollOptions: [{
1123
+ type: Input
1124
+ }], descriptionFormat: [{
1125
+ type: Input
1126
+ }], disabled: [{
1127
+ type: Input
1128
+ }], dragUnit: [{
1129
+ type: Input
1130
+ }], eventHeight: [{
1131
+ type: Input
1132
+ }], eventSpacing: [{
1133
+ type: Input
1134
+ }], extendAllDayEndDay: [{
1135
+ type: Input
1136
+ }], extraData: [{
1137
+ type: Input
1138
+ }], filterEventResources: [{
1139
+ type: Input
1140
+ }], flex: [{
1141
+ type: Input
1142
+ }], height: [{
1143
+ type: Input
1144
+ }], hidden: [{
1145
+ type: Input
1146
+ }], hideNonWorkingDays: [{
1147
+ type: Input
1148
+ }], id: [{
1149
+ type: Input
1150
+ }], inputFieldAlign: [{
1151
+ type: Input
1152
+ }], insertBefore: [{
1153
+ type: Input
1154
+ }], insertFirst: [{
1155
+ type: Input
1156
+ }], items: [{
1157
+ type: Input
1158
+ }], keyMap: [{
1159
+ type: Input
1160
+ }], labelPosition: [{
1161
+ type: Input
1162
+ }], layout: [{
1163
+ type: Input
1164
+ }], layoutStyle: [{
1165
+ type: Input
1166
+ }], margin: [{
1167
+ type: Input
1168
+ }], maxDate: [{
1169
+ type: Input
1170
+ }], maxHeight: [{
1171
+ type: Input
1172
+ }], maximizeOnMobile: [{
1173
+ type: Input
1174
+ }], maxWidth: [{
1175
+ type: Input
1176
+ }], minDate: [{
1177
+ type: Input
1178
+ }], minHeight: [{
1179
+ type: Input
1180
+ }], minWidth: [{
1181
+ type: Input
1182
+ }], nonWorkingDays: [{
1183
+ type: Input
1184
+ }], pastEventCls: [{
1185
+ type: Input
1186
+ }], persistShrinkWrappedRows: [{
1187
+ type: Input
1188
+ }], readOnly: [{
1189
+ type: Input
1190
+ }], rendition: [{
1191
+ type: Input
1192
+ }], rtl: [{
1193
+ type: Input
1194
+ }], scrollable: [{
1195
+ type: Input
1196
+ }], shadePastDates: [{
1197
+ type: Input
1198
+ }], shortDateFormat: [{
1199
+ type: Input
1200
+ }], shortDateTimeFormat: [{
1201
+ type: Input
1202
+ }], showWeekNumber: [{
1203
+ type: Input
1204
+ }], span: [{
1205
+ type: Input
1206
+ }], stackMultiDayEvents: [{
1207
+ type: Input
1208
+ }], strictRecordMapping: [{
1209
+ type: Input
1210
+ }], syncCalendarDate: [{
1211
+ type: Input
1212
+ }], syncViewDate: [{
1213
+ type: Input
1214
+ }], title: [{
1215
+ type: Input
1216
+ }], tools: [{
1217
+ type: Input
1218
+ }], tooltip: [{
1219
+ type: Input
1220
+ }], weekColumnHeader: [{
1221
+ type: Input
1222
+ }], width: [{
1223
+ type: Input
1224
+ }], x: [{
1225
+ type: Input
1226
+ }], y: [{
1227
+ type: Input
1228
+ }], anchorSize: [{
1229
+ type: Input
1230
+ }], dayCellCls: [{
1231
+ type: Input
1232
+ }], firstVisibleCell: [{
1233
+ type: Input
1234
+ }], firstVisibleDate: [{
1235
+ type: Input
1236
+ }], focusVisible: [{
1237
+ type: Input
1238
+ }], hasChanges: [{
1239
+ type: Input
1240
+ }], isSettingValues: [{
1241
+ type: Input
1242
+ }], isValid: [{
1243
+ type: Input
1244
+ }], lastVisibleCell: [{
1245
+ type: Input
1246
+ }], lastVisibleDate: [{
1247
+ type: Input
1248
+ }], parent: [{
1249
+ type: Input
1250
+ }], record: [{
1251
+ type: Input
1252
+ }], state: [{
1253
+ type: Input
1254
+ }], values: [{
1255
+ type: Input
1256
+ }], onBeforeAutoCreate: [{
1257
+ type: Output
1258
+ }], onBeforeChangeDate: [{
1259
+ type: Output
1260
+ }], onBeforeDestroy: [{
1261
+ type: Output
1262
+ }], onBeforeHide: [{
1263
+ type: Output
1264
+ }], onBeforeRefresh: [{
1265
+ type: Output
1266
+ }], onBeforeResponsiveStateChange: [{
1267
+ type: Output
1268
+ }], onBeforeSetRecord: [{
1269
+ type: Output
1270
+ }], onBeforeShow: [{
1271
+ type: Output
1272
+ }], onBeforeShowOverflowPopup: [{
1273
+ type: Output
1274
+ }], onBeforeStateApply: [{
1275
+ type: Output
1276
+ }], onBeforeStateSave: [{
1277
+ type: Output
1278
+ }], onCatchAll: [{
1279
+ type: Output
1280
+ }], onCellClick: [{
1281
+ type: Output
1282
+ }], onCellMapPopulated: [{
1283
+ type: Output
1284
+ }], onCollapse: [{
1285
+ type: Output
1286
+ }], onDateChange: [{
1287
+ type: Output
1288
+ }], onDayCellPopulated: [{
1289
+ type: Output
1290
+ }], onDestroy: [{
1291
+ type: Output
1292
+ }], onDirtyStateChange: [{
1293
+ type: Output
1294
+ }], onElementCreated: [{
1295
+ type: Output
1296
+ }], onEmptyCellClick: [{
1297
+ type: Output
1298
+ }], onEventAutoCreated: [{
1299
+ type: Output
1300
+ }], onEventHeightChange: [{
1301
+ type: Output
1302
+ }], onEventPropagate: [{
1303
+ type: Output
1304
+ }], onExpand: [{
1305
+ type: Output
1306
+ }], onFocusIn: [{
1307
+ type: Output
1308
+ }], onFocusOut: [{
1309
+ type: Output
1310
+ }], onHide: [{
1311
+ type: Output
1312
+ }], onPaint: [{
1313
+ type: Output
1314
+ }], onReadOnly: [{
1315
+ type: Output
1316
+ }], onRecompose: [{
1317
+ type: Output
1318
+ }], onRefresh: [{
1319
+ type: Output
1320
+ }], onResize: [{
1321
+ type: Output
1322
+ }], onResponsiveStateChange: [{
1323
+ type: Output
1324
+ }], onShow: [{
1325
+ type: Output
1326
+ }], onShowOverflowPopup: [{
1327
+ type: Output
1328
+ }], onToolClick: [{
1329
+ type: Output
1330
+ }], onWeekCellClick: [{
1331
+ type: Output
1332
+ }], onWeekFlex: [{
1333
+ type: Output
1334
+ }], onWeekShrinkwrap: [{
1335
+ type: Output
1336
+ }] } });
1337
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJ5bnR1bS1tb250aC12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2NvbXBvbmVudC9zcmMvbGliL2JyeW50dW0tbW9udGgtdmlldy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsc0RBQXNEO0FBQ3REOztHQUVHO0FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBa0QsTUFBTSxlQUFlLENBQUM7QUFFbkksT0FBTyxhQUFhLE1BQU0sa0JBQWtCLENBQUM7QUFFN0MsT0FBTyxFQUE2WixNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV2YyxPQUFPLEVBQStGLFNBQVMsRUFBMEQsTUFBTSx3QkFBd0IsQ0FBQzs7QUEycUN4TSxNQUFNLE9BQU8seUJBQXlCO0lBb2NsQyxZQUFZLE9BQW1CO1FBVHZCLGtCQUFhLEdBQUc7WUFDcEIsS0FBSyxFQUFjLFNBQVM7WUFDNUIsUUFBUSxFQUFXLFNBQVM7WUFDNUIsSUFBSSxFQUFlLFNBQVM7WUFDNUIsZ0JBQWdCLEVBQUcsSUFBSTtZQUN2QixRQUFRLEVBQVcsRUFBRTtZQUNyQixTQUFTLEVBQVUsRUFBRTtTQUN4QixDQUFDO1FBb09GLGtCQUFrQjtRQUNsQjs7Ozs7Ozs7Ozs7O1dBWUc7UUFDTyx1QkFBa0IsR0FBUSxJQUFJLFlBQVksRUFBeUssQ0FBQztRQUM5Tjs7Ozs7OztXQU9HO1FBQ08sdUJBQWtCLEdBQVEsSUFBSSxZQUFZLEVBQW9GLENBQUM7UUFDekk7Ozs7V0FJRztRQUNPLG9CQUFlLEdBQVEsSUFBSSxZQUFZLEVBQThDLENBQUM7UUFDaEc7Ozs7V0FJRztRQUNPLGlCQUFZLEdBQVEsSUFBSSxZQUFZLEVBQXlFLENBQUM7UUFDeEg7Ozs7V0FJRztRQUNPLG9CQUFlLEdBQVEsSUFBSSxZQUFZLEVBQW9ELENBQUM7UUFDdEc7Ozs7OztXQU1HO1FBQ08sa0NBQTZCLEdBQVEsSUFBSSxZQUFZLEVBQWlGLENBQUM7UUFDako7Ozs7OztXQU1HO1FBQ08sc0JBQWlCLEdBQVEsSUFBSSxZQUFZLEVBQWtFLENBQUM7UUFDdEg7Ozs7V0FJRztRQUNPLGlCQUFZLEdBQVEsSUFBSSxZQUFZLEVBQTZFLENBQUM7UUFDNUg7Ozs7Ozs7O1dBUUc7UUFDTyw4QkFBeUIsR0FBUSxJQUFJLFlBQVksRUFBeUksQ0FBQztRQUNyTTs7OztXQUlHO1FBQ08sdUJBQWtCLEdBQVEsSUFBSSxZQUFZLEVBQXFFLENBQUM7UUFDMUg7Ozs7V0FJRztRQUNPLHNCQUFpQixHQUFRLElBQUksWUFBWSxFQUFxRSxDQUFDO1FBQ3pIOzs7Ozs7O1dBT0c7UUFDTyxlQUFVLEdBQVEsSUFBSSxZQUFZLEVBQWdFLENBQUM7UUFDN0c7Ozs7Ozs7V0FPRztRQUNPLGdCQUFXLEdBQVEsSUFBSSxZQUFZLEVBQWdHLENBQUM7UUFDOUk7Ozs7V0FJRztRQUNPLHVCQUFrQixHQUFRLElBQUksWUFBWSxFQUF3RCxDQUFDO1FBQzdHOzs7O1dBSUc7UUFDTyxlQUFVLEdBQVEsSUFBSSxZQUFZLEVBQStDLENBQUM7UUFDNUY7Ozs7Ozs7Ozs7V0FVRztRQUNPLGlCQUFZLEdBQVEsSUFBSSxZQUFZLEVBQTBILENBQUM7UUFDeks7Ozs7Ozs7O1dBUUc7UUFDTyx1QkFBa0IsR0FBUSxJQUFJLFlBQVksRUFBaUUsQ0FBQztRQUN0SDs7OztXQUlHO1FBQ08sY0FBUyxHQUFRLElBQUksWUFBWSxFQUE4QyxDQUFDO1FBQzFGOzs7OztXQUtHO1FBQ08sdUJBQWtCLEdBQVEsSUFBSSxZQUFZLEVBQW1FLENBQUM7UUFDeEg7Ozs7V0FJRztRQUNPLHFCQUFnQixHQUFRLElBQUksWUFBWSxFQUFzRCxDQUFDO1FBQ3pHOzs7Ozs7V0FNRztRQUNPLHFCQUFnQixHQUFRLElBQUksWUFBWSxFQUE2RCxDQUFDO1FBQ2hIOzs7Ozs7OztXQVFHO1FBQ08sdUJBQWtCLEdBQVEsSUFBSSxZQUFZLEVBQStFLENBQUM7UUFDcEk7Ozs7OztXQU1HO1FBQ08sd0JBQW1CLEdBQVEsSUFBSSxZQUFZLEVBQW1FLENBQUM7UUFDekg7Ozs7Ozs7Ozs7Ozs7V0FhRztRQUNPLHFCQUFnQixHQUFRLElBQUksWUFBWSxFQUE2SyxDQUFDO1FBQ2hPOzs7O1dBSUc7UUFDTyxhQUFRLEdBQVEsSUFBSSxZQUFZLEVBQStDLENBQUM7UUFDMUY7Ozs7Ozs7OztXQVNHO1FBQ08sY0FBUyxHQUFRLElBQUksWUFBWSxFQUE0SixDQUFDO1FBQ3hNOzs7Ozs7Ozs7OztXQVdHO1FBQ08sZUFBVSxHQUFRLElBQUksWUFBWSxFQUE0SixDQUFDO1FBQ3pNOzs7O1dBSUc7UUFDTyxXQUFNLEdBQVEsSUFBSSxZQUFZLEVBQWdELENBQUM7UUFDekY7Ozs7Ozs7O1dBUUc7UUFDTyxZQUFPLEdBQVEsSUFBSSxZQUFZLEVBQXFFLENBQUM7UUFDL0c7Ozs7V0FJRztRQUNPLGVBQVUsR0FBUSxJQUFJLFlBQVksRUFBbUQsQ0FBQztRQUNoRzs7O1dBR0c7UUFDTyxnQkFBVyxHQUFRLElBQUksWUFBWSxFQUF1QixDQUFDO1FBQ3JFOztXQUVHO1FBQ08sY0FBUyxHQUFRLElBQUksWUFBWSxFQUF1QixDQUFDO1FBQ25FOzs7Ozs7OztXQVFHO1FBQ08sYUFBUSxHQUFRLElBQUksWUFBWSxFQUFvSCxDQUFDO1FBQy9KOzs7Ozs7V0FNRztRQUNPLDRCQUF1QixHQUFRLElBQUksWUFBWSxFQUFpRixDQUFDO1FBQzNJOzs7O1dBSUc7UUFDTyxXQUFNLEdBQVEsSUFBSSxZQUFZLEVBQWdELENBQUM7UUFDekY7Ozs7Ozs7O1dBUUc7UUFDTyx3QkFBbUIsR0FBUSxJQUFJLFlBQVksRUFBZ0gsQ0FBQztRQUN0Szs7Ozs7V0FLRztRQUNPLGdCQUFXLEdBQVEsSUFBSSxZQUFZLEVBQTBELENBQUM7UUFDeEc7Ozs7OztXQU1HO1FBQ08sb0JBQWUsR0FBUSxJQUFJLFlBQVksRUFBNkUsQ0FBQztRQUMvSDs7Ozs7Ozs7O1dBU0c7UUFDTyxlQUFVLEdBQVEsSUFBSSxZQUFZLEVBQXVFLENBQUM7UUFDcEg7Ozs7Ozs7V0FPRztRQUNPLHFCQUFnQixHQUFRLElBQUksWUFBWSxFQUF1RSxDQUFDO1FBeGlCdEgsSUFBSSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUM7SUFDOUIsQ0FBQztJQXlpQkQ7O09BRUc7SUFDSCxRQUFRO1FBQ0osTUFDSSxFQUFFLEdBQUcsSUFBSSxFQUNULEVBQ0ksVUFBVSxFQUNWLGFBQWEsRUFDaEIsR0FBRyxFQUFFLEVBQ04sRUFDSSxhQUFhLEVBQ2IsWUFBWSxFQUNaLGNBQWMsRUFDZCxhQUFhLEVBQ2hCLEdBQUcseUJBQXlCLENBQUM7UUFFbEMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDdkQsYUFBYTtZQUNiLGFBQWEsQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUM5RCxJQUFJLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDdkMsYUFBYSxDQUFDLG9CQUFvQixDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQzthQUMxRDtRQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0gsYUFBYTtRQUNiLGFBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzNGLE1BQ0ksWUFBWSxHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQzFFLFNBQVMsR0FBRyxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUU1RCxhQUFhO1lBQ2IsYUFBYSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtnQkFDNUMsYUFBYTtnQkFDYixFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNsQixzR0FBc0c7Z0JBQ3RHLHVCQUF1QjtnQkFDdkIsT0FBTyxDQUFDLENBQUMsV0FBVyxDQUFDO1lBQ3pCLENBQUMsQ0FBQztRQUNOLENBQUMsQ0FBQyxDQUFDO1FBRUgsd0ZBQXdGO1FBQ3hGLE1BQ0ksY0FBYyxHQUFHO1lBQ2IsT0FBTztZQUNQLFVBQVU7WUFDVixhQUFhO1lBQ2IsY0FBYztZQUNkLGFBQWE7U0FDaEIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ2pCLElBQUksWUFBWSxLQUFLLFFBQVEsSUFBSSxVQUFVLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxZQUFZLFVBQVUsRUFBRTtnQkFDM0YsK0RBQStEO2dCQUMvRCxhQUFhLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUM7YUFDckQ7aUJBQ0k7Z0JBQ0QsYUFBYSxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsYUFBYSxDQUFDO2FBQ2xEO1NBQ0o7YUFDSTtZQUNELGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLEVBQUUsY0FBYyxDQUFDLENBQUM7U0FDbkU7UUFFRCxhQUFhO1FBQ2IsRUFBRSxDQUFDLFFBQVEsR0FBRyxZQUFZLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUU5RyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsV0FBVyxDQUFDLE9BQXNCO1FBQzlCLE1BQ0ksRUFBRSxRQUFRLEVBQUUsR0FBRyxJQUFJLEVBQ25CLEVBQUUsWUFBWSxFQUFFLEdBQUcseUJBQXlCLENBQUM7UUFDakQsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNYLE9BQU87U0FDVjtRQUNELDJCQUEyQjtRQUMzQixNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUU7WUFDL0MsTUFDSSxRQUFRLEdBQUksTUFBdUIsQ0FBQyxZQUFZLEVBQ2hELEVBQUUsUUFBUSxFQUFFLEdBQUcsSUFBSSxFQUNuQixFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxHQUFHLHlCQUF5QixDQUFDO1lBQ3JFLElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDN0IsYUFBYSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDOUQsSUFBSSxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQ25DLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7aUJBQzFEO2FBQ0o7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7T0FFRztJQUNILFdBQVc7UUFDUCxhQUFhO1FBQ2IsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFO1lBQ3hDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDM0I7SUFDTCxDQUFDOztBQWxsQ2EsdUNBQWEsR0FBRyxTQUFTLENBQUM7QUFFMUIsc0NBQVksR0FBRyxXQUFXLENBQUM7QUFFMUIsdUNBQWEsR0FBYTtJQUNyQyxvQkFBb0I7SUFDcEIsb0JBQW9CO0lBQ3BCLGlCQUFpQjtJQUNqQixjQUFjO0lBQ2QsaUJBQWlCO0lBQ2pCLCtCQUErQjtJQUMvQixtQkFBbUI7SUFDbkIsY0FBYztJQUNkLDJCQUEyQjtJQUMzQixvQkFBb0I7SUFDcEIsbUJBQW1CO0lBQ25CLFlBQVk7SUFDWixhQUFhO0lBQ2Isb0JBQW9CO0lBQ3BCLFlBQVk7SUFDWixjQUFjO0lBQ2Qsb0JBQW9CO0lBQ3BCLFdBQVc7SUFDWCxvQkFBb0I7SUFDcEIsa0JBQWtCO0lBQ2xCLGtCQUFrQjtJQUNsQixvQkFBb0I7SUFDcEIscUJBQXFCO0lBQ3JCLGtCQUFrQjtJQUNsQixVQUFVO0lBQ1YsV0FBVztJQUNYLFlBQVk7SUFDWixRQUFRO0lBQ1IsU0FBUztJQUNULFlBQVk7SUFDWixhQUFhO0lBQ2IsV0FBVztJQUNYLFVBQVU7SUFDVix5QkFBeUI7SUFDekIsUUFBUTtJQUNSLHFCQUFxQjtJQUNyQixhQUFhO0lBQ2IsaUJBQWlCO0lBQ2pCLFlBQVk7SUFDWixrQkFBa0I7Q0FDckIsQ0FBQztBQUVhLDZDQUFtQixHQUFhLEVBRTlDLENBQUM7QUFFYSx3Q0FBYyxHQUFhLHlCQUF5QixDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQztJQUMzRixlQUFlO0lBQ2YsT0FBTztJQUNQLE9BQU87SUFDUCxXQUFXO0lBQ1gsaUJBQWlCO0lBQ2pCLGVBQWU7SUFDZixpQkFBaUI7SUFDakIsUUFBUTtJQUNSLGtCQUFrQjtJQUNsQixVQUFVO0lBQ1YsaUJBQWlCO0lBQ2pCLFdBQVc7SUFDWCxZQUFZO0lBQ1osZUFBZTtJQUNmLE1BQU07SUFDTixTQUFTO0lBQ1QsY0FBYztJQUNkLGlCQUFpQjtJQUNqQiw2QkFBNkI7SUFDN0IsY0FBYztJQUNkLFVBQVU7SUFDVixLQUFLO0lBQ0wsV0FBVztJQUNYLGFBQWE7SUFDYixPQUFPO0lBQ1AsUUFBUTtJQUNSLFFBQVE7SUFDUixhQUFhO0lBQ2IsbUJBQW1CO0lBQ25CLFdBQVc7SUFDWCxTQUFTO0lBQ1QsTUFBTTtJQUNOLFlBQVk7SUFDWixlQUFlO0lBQ2YsbUJBQW1CO0lBQ25CLGlCQUFpQjtJQUNqQixlQUFlO0lBQ2YscUJBQXFCO0lBQ3JCLGNBQWM7SUFDZCxVQUFVO0lBQ1Ysc0JBQXNCO0lBQ3RCLG1CQUFtQjtJQUNuQixxQkFBcUI7SUFDckIsOEJBQThCO0lBQzlCLFVBQVU7SUFDVixhQUFhO0lBQ2IsZUFBZTtJQUNmLHVCQUF1QjtJQUN2Qix3QkFBd0I7SUFDeEIsaUJBQWlCO0lBQ2pCLE1BQU07SUFDTixXQUFXO0lBQ1gsVUFBVTtJQUNWLFFBQVE7SUFDUixtQkFBbUI7SUFDbkIsbUJBQW1CO0lBQ25CLGFBQWE7SUFDYixxQkFBcUI7SUFDckIsYUFBYTtJQUNiLGVBQWU7SUFDZixhQUFhO0lBQ2IsY0FBYztJQUNkLG9CQUFvQjtJQUNwQixXQUFXO0lBQ1gsc0JBQXNCO0lBQ3RCLE1BQU07SUFDTixVQUFVO0lBQ1YsUUFBUTtJQUNSLG9CQUFvQjtJQUNwQixRQUFRO0lBQ1IsZ0JBQWdCO0lBQ2hCLFFBQVE7SUFDUixRQUFRO0lBQ1IsZUFBZTtJQUNmLG9CQUFvQjtJQUNwQixxQkFBcUI7SUFDckIsZUFBZTtJQUNmLE1BQU07SUFDTixJQUFJO0lBQ0osc0JBQXNCO0lBQ3RCLGlCQUFpQjtJQUNqQixjQUFjO0lBQ2QsYUFBYTtJQUNiLFNBQVM7SUFDVCxPQUFPO0lBQ1AsUUFBUTtJQUNSLGVBQWU7SUFDZixRQUFRO0lBQ1IsYUFBYTtJQUNiLFdBQVc7SUFDWCxXQUFXO0lBQ1gsYUFBYTtJQUNiLGFBQWE7SUFDYix1QkFBdUI7SUFDdkIsUUFBUTtJQUNSLGNBQWM7SUFDZCxRQUFRO0lBQ1IsU0FBUztJQUNULGtCQUFrQjtJQUNsQixXQUFXO0lBQ1gsa0JBQWtCO0lBQ2xCLFVBQVU7SUFDVixnQkFBZ0I7SUFDaEIsU0FBUztJQUNULFdBQVc7SUFDWCxjQUFjO0lBQ2QsVUFBVTtJQUNWLGVBQWU7SUFDZixPQUFPO0lBQ1AsWUFBWTtJQUNaLGtCQUFrQjtJQUNsQixnQkFBZ0I7SUFDaEIsZUFBZTtJQUNmLHdCQUF3QjtJQUN4QixxQkFBcUI7SUFDckIsZUFBZTtJQUNmLHNCQUFzQjtJQUN0QixPQUFPO0lBQ1AsY0FBYztJQUNkLDBCQUEwQjtJQUMxQixZQUFZO0lBQ1osdUJBQXVCO0lBQ3ZCLFVBQVU7SUFDVixrQkFBa0I7SUFDbEIsV0FBVztJQUNYLG1CQUFtQjtJQUNuQixZQUFZO0lBQ1osdUJBQXVCO0lBQ3ZCLGdCQUFnQjtJQUNoQixpQkFBaUI7SUFDakIsa0JBQWtCO0lBQ2xCLFFBQVE7SUFDUixhQUFhO0lBQ2IsS0FBSztJQUNMLFlBQVk7SUFDWixjQUFjO0lBQ2QsZ0JBQWdCO0lBQ2hCLGtCQUFrQjtJQUNsQixnQkFBZ0I7SUFDaEIsaUJBQWlCO0lBQ2pCLHFCQUFxQjtJQUNyQixlQUFlO0lBQ2Ysb0JBQW9CO0lBQ3BCLGVBQWU7SUFDZixZQUFZO0lBQ1oscUJBQXFCO0lBQ3JCLHlCQUF5QjtJQUN6QixnQkFBZ0I7SUFDaEIsZ0JBQWdCO0lBQ2hCLFVBQVU7SUFDVixNQUFNO0lBQ04scUJBQXFCO0lBQ3JCLFVBQVU7SUFDVixnQkFBZ0I7SUFDaEIsU0FBUztJQUNULGVBQWU7SUFDZixxQkFBcUI7SUFDckIsUUFBUTtJQUNSLGtCQUFrQjtJQUNsQixjQUFjO0lBQ2QsS0FBSztJQUNMLGFBQWE7SUFDYixLQUFLO0lBQ0wsTUFBTTtJQUNOLFdBQVc7SUFDWCxZQUFZO0lBQ1osS0FBSztJQUNMLE9BQU87SUFDUCxVQUFVO0lBQ1YsT0FBTztJQUNQLFNBQVM7SUFDVCxXQUFXO0lBQ1gsTUFBTTtJQUNOLElBQUk7SUFDSixrQkFBa0I7SUFDbEIsWUFBWTtJQUNaLGNBQWM7SUFDZCxjQUFjO0lBQ2QsUUFBUTtJQUNSLE9BQU87SUFDUCxHQUFHO0lBQ0gsR0FBRztDQUNOLENBQUMsQ0FBQztBQUVZLDRDQUFrQixHQUFhO0lBQzFDLGVBQWU7SUFDZixPQUFPO0lBQ1AsT0FBTztJQUNQLFFBQVE7SUFDUixpQkFBaUI7SUFDakIsV0FBVztJQUNYLE1BQU07SUFDTixTQUFTO0lBQ1QsY0FBYztJQUNkLGNBQWM7SUFDZCxVQUFVO0lBQ1YsYUFBYTtJQUNiLE9BQU87SUFDUCxRQUFRO0lBQ1IsYUFBYTtJQUNiLG1CQUFtQjtJQUNuQixXQUFXO0lBQ1gsbUJBQW1CO0lBQ25CLGlCQUFpQjtJQUNqQixlQUFlO0lBQ2YscUJBQXFCO0lBQ3JCLGNBQWM7SUFDZCxVQUFVO0lBQ1YscUJBQXFCO0lBQ3JCLDhCQUE4QjtJQUM5QixhQUFhO0lBQ2IsZUFBZTtJQUNmLHVCQUF1QjtJQUN2Qix3QkFBd0I7SUFDeEIsaUJBQWlCO0lBQ2pCLE1BQU07SUFDTixXQUFXO0lBQ1gsUUFBUTtJQUNSLG1CQUFtQjtJQUNuQixtQkFBbUI7SUFDbkIsYUFBYTtJQUNiLHFCQUFxQjtJQUNyQixlQUFlO0lBQ2YsYUFBYTtJQUNiLFVBQVU7SUFDVixRQUFRO0lBQ1Isb0JBQW9CO0lBQ3BCLFFBQVE7SUFDUixnQkFBZ0I7SUFDaEIsZUFBZTtJQUNmLHFCQUFxQjtJQUNyQixlQUFlO0lBQ2YsTUFBTTtJQUNOLHNCQUFzQjtJQUN0QixTQUFTO0lBQ1QsV0FBVztJQUNYLFdBQVc7SUFDWCxhQUFhO0lBQ2IsYUFBYTtJQUNiLHVCQUF1QjtJQUN2QixjQUFjO0lBQ2QsUUFBUTtJQUNSLGtCQUFrQjtJQUNsQixnQkFBZ0I7SUFDaEIsY0FBYztJQUNkLGVBQWU7SUFDZixPQUFPO0lBQ1AsWUFBWTtJQUNaLGtCQUFrQjtJQUNsQixlQUFlO0lBQ2Ysd0JBQXdCO0lBQ3hCLHFCQUFxQjtJQUNyQixlQUFlO0lBQ2Ysc0JBQXNCO0lBQ3RCLE9BQU87SUFDUCxZQUFZO0lBQ1osdUJBQXVCO0lBQ3ZCLGtCQUFrQjtJQUNsQixtQkFBbUI7SUFDbkIsWUFBWTtJQUNaLHVCQUF1QjtJQUN2QixnQkFBZ0I7SUFDaEIsaUJBQWlCO0lBQ2pCLGtCQUFrQjtJQUNsQixRQUFRO0lBQ1IsYUFBYTtJQUNiLGNBQWM7SUFDZCxnQkFBZ0I7SUFDaEIsa0JBQWtCO0lBQ2xCLGVBQWU7SUFDZixvQkFBb0I7SUFDcEIsZUFBZTtJQUNmLFlBQVk7SUFDWixxQkFBcUI7SUFDckIseUJBQXlCO0lBQ3pCLGdCQUFnQjtJQUNoQixVQUFVO0lBQ1YsVUFBVTtJQUNWLGdCQUFnQjtJQUNoQixTQUFTO0lBQ1QsZUFBZTtJQUNmLFFBQVE7SUFDUixLQUFLO0lBQ0wsYUFBYTtJQUNiLEtBQUs7SUFDTCxNQUFNO0lBQ04sV0FBVztJQUNYLFlBQVk7SUFDWixLQUFLO0lBQ0wsVUFBVTtJQUNWLFdBQVc7SUFDWCxNQUFNO0lBQ04sSUFBSTtJQUNKLFlBQVk7SUFDWixjQUFjO0lBQ2QsY0FBYztJQUNkLFFBQVE7Q0FDWCxDQUFDO0FBRWEsc0NBQVksR0FBYSx5QkFBeUIsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUM7SUFDekYsV0FBVztJQUNYLGlCQUFpQjtJQUNqQixlQUFlO0lBQ2YsaUJBQWlCO0lBQ2pCLFlBQVk7SUFDWixrQkFBa0I7SUFDbEIsVUFBVTtJQUNWLFlBQVk7SUFDWixlQUFlO0lBQ2YsaUJBQWlCO0lBQ2pCLDZCQUE2QjtJQUM3QixLQUFLO0lBQ0wsV0FBVztJQUNYLFFBQVE7SUFDUixTQUFTO0lBQ1QsTUFBTTtJQUNOLFlBQVk7SUFDWixlQUFlO0lBQ2YsWUFBWTtJQUNaLHNCQUFzQjtJQUN0QixtQkFBbUI7SUFDbkIsVUFBVTtJQUNWLFVBQVU7SUFDVixhQUFhO0lBQ2IsY0FBYztJQUNkLG9CQUFvQjtJQUNwQixXQUFXO0lBQ1gsc0JBQXNCO0lBQ3RCLGtCQUFrQjtJQUNsQixrQkFBa0I7SUFDbEIsTUFBTTtJQUNOLGNBQWM7SUFDZCxZQUFZO0lBQ1osUUFBUTtJQUNSLFFBQVE7SUFDUixvQkFBb0I7SUFDcEIsSUFBSTtJQUNKLGlCQUFpQjtJQUNqQixjQUFjO0lBQ2QsYUFBYTtJQUNiLGlCQUFpQjtJQUNqQixTQUFTO0lBQ1QsT0FBTztJQUNQLFFBQVE7SUFDUixlQUFlO0lBQ2YsaUJBQWlCO0lBQ2pCLGlCQUFpQjtJQUNqQixRQUFRO0lBQ1IsYUFBYTtJQUNiLFFBQVE7SUFDUixTQUFTO0lBQ1QsV0FBVztJQUNYLGtCQUFrQjtJQUNsQixVQUFVO0lBQ1YsU0FBUztJQUNULFdBQVc7SUFDWCxVQUFVO0lBQ1YsZ0JBQWdCO0lBQ2hCLFFBQVE7SUFDUixjQUFjO0lBQ2QsMEJBQTBCO0lBQzFCLFVBQVU7SUFDVixRQUFRO0lBQ1IsV0FBVztJQUNYLEtBQUs7SUFDTCxZQUFZO0lBQ1osZ0JBQWdCO0lBQ2hCLGlCQUFpQjtJQUNqQixxQkFBcUI7SUFDckIsZ0JBQWdCO0lBQ2hCLE1BQU07SUFDTixxQkFBcUI7SUFDckIsT0FBTztJQUNQLHFCQUFxQjtJQUNyQixrQkFBa0I7SUFDbEIsY0FBYztJQUNkLE9BQU87SUFDUCxPQUFPO0lBQ1AsU0FBUztJQUNULFFBQVE7SUFDUixrQkFBa0I7SUFDbEIsT0FBTztJQUNQLEdBQUc7SUFDSCxHQUFHO0NBQ04sQ0FBQyxDQUFDO3NIQXRiTSx5QkFBeUI7MEdBQXpCLHlCQUF5Qiw0OE5BRnZCLEVBQUU7MkZBRUoseUJBQXlCO2tCQUpyQyxTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRyxvQkFBb0I7b0JBQy9CLFFBQVEsRUFBRyxFQUFFO2lCQUNoQjtpR0EwY1ksYUFBYTtzQkFBckIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLDRCQUE0QjtzQkFBcEMsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUNHLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUdHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFLRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBR0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csc0JBQXNCO3NCQUE5QixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFNRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyx1QkFBdUI7c0JBQS9CLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csRUFBRTtzQkFBVixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFHRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBUUcsYUFBYTtzQkFBckIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLDJCQUEyQjtzQkFBbkMsS0FBSztnQkFDRyxHQUFHO3NCQUFYLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csRUFBRTtzQkFBVixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csd0JBQXdCO3NCQUFoQyxLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxHQUFHO3NCQUFYLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxDQUFDO3NCQUFULEtBQUs7Z0JBQ0csQ0FBQztzQkFBVCxLQUFLO2dCQUdHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQWdCSSxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBU0csa0JBQWtCO3NCQUEzQixNQUFNO2dCQU1HLGVBQWU7c0JBQXhCLE1BQU07Z0JBTUcsWUFBWTtzQkFBckIsTUFBTTtnQkFNRyxlQUFlO3NCQUF4QixNQUFNO2dCQVFHLDZCQUE2QjtzQkFBdEMsTUFBTTtnQkFRRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBTUcsWUFBWTtzQkFBckIsTUFBTTtnQkFVRyx5QkFBeUI7c0JBQWxDLE1BQU07Z0JBTUcsa0JBQWtCO3NCQUEzQixNQUFNO2dCQU1HLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFTRyxVQUFVO3NCQUFuQixNQUFNO2dCQVNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBTUcsa0JBQWtCO3NCQUEzQixNQUFNO2dCQU1HLFVBQVU7c0JBQW5CLE1BQU07Z0JBWUcsWUFBWTtzQkFBckIsTUFBTTtnQkFVRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBTUcsU0FBUztzQkFBbEIsTUFBTTtnQkFPRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBTUcsZ0JBQWdCO3NCQUF6QixNQUFNO2dCQVFHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFVRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBUUcsbUJBQW1CO3NCQUE1QixNQUFNO2dCQWVHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFNRyxRQUFRO3NCQUFqQixNQUFNO2dCQVdHLFNBQVM7c0JBQWxCLE1BQU07Z0JBYUcsVUFBVTtzQkFBbkIsTUFBTTtnQkFNRyxNQUFNO3NCQUFmLE1BQU07Z0JBVUcsT0FBTztzQkFBaEIsTUFBTTtnQkFNRyxVQUFVO3NCQUFuQixNQUFNO2dCQUtHLFdBQVc7c0JBQXBCLE1BQU07Z0JBSUcsU0FBUztzQkFBbEIsTUFBTTtnQkFVRyxRQUFRO3NCQUFqQixNQUFNO2dCQVFHLHVCQUF1QjtzQkFBaEMsTUFBTTtnQkFNRyxNQUFNO3NCQUFmLE1BQU07Z0JBVUcsbUJBQW1CO3NCQUE1QixNQUFNO2dCQU9HLFdBQVc7c0JBQXBCLE1BQU07Z0JBUUcsZUFBZTtzQkFBeEIsTUFBTTtnQkFXRyxVQUFVO3NCQUFuQixNQUFNO2dCQVNHLGdCQUFnQjtzQkFBekIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuLyoqXG4gKiBBbmd1bGFyIHdyYXBwZXIgZm9yIEJyeW50dW0gTW9udGhWaWV3XG4gKi9cblxuaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgSW5wdXQsIFNpbXBsZUNoYW5nZSwgU2ltcGxlQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IFdyYXBwZXJIZWxwZXIgZnJvbSAnLi93cmFwcGVyLmhlbHBlcic7XG5cbmltcG9ydCB7IEFsaWduU3BlYywgQmFzZSwgQnJ5bnR1bVNjcm9sbE9wdGlvbnMsIEJ1dHRvbkNvbmZpZywgQ2FsZW5kYXJQYW5lbCwgQ29udGFpbmVyLCBEYXRlUGlja2VyLCBEb21Db25maWcsIEtleU1hcENvbmZpZywgTGF5b3V0LCBNYXNrQ29uZmlnLCBNZW51SXRlbUNvbmZpZywgTWVudUl0ZW1FbnRyeSwgTW9kZWwsIE1vbnRoLCBNb250aENvbmZpZywgUGFnaW5nVG9vbGJhckNvbmZpZywgUGFuZWwsIFBhbmVsQ29sbGFwc2VyQ29uZmlnLCBQYW5lbENvbGxhcHNlck92ZXJsYXlDb25maWcsIFBhbmVsSGVhZGVyLCBSZWN0YW5nbGUsIFNjcm9sbGVyLCBTY3JvbGxlckNvbmZpZywgU3RhdGVQcm92aWRlciwgVGFiQ29uZmlnLCBUb29sLCBUb29sQ29uZmlnLCBUb29sYmFyQ29uZmlnLCBUb29sYmFySXRlbXMsIFRvb2x0aXBDb25maWcsIFdpZGdldCB9IGZyb20gJ0BicnludHVtL2NvcmUtdGhpbic7XG5pbXBvcnQgeyBFdmVudE1vZGVsLCBSZXNvdXJjZU1vZGVsIH0gZnJvbSAnQGJyeW50dW0vc2NoZWR1bGVyLXRoaW4nO1xuaW1wb3J0IHsgQ2FsZW5kYXJWaWV3LCBDYWxlbmRhckNvbnRhaW5lckl0ZW1Db25maWcsIENhbGVuZGFyQ29udGFpbmVyTGF5b3V0Q29uZmlnLCBEYXlDZWxsLCBFdmVudEJhciwgTW9udGhWaWV3LCBNb250aFZpZXdMaXN0ZW5lcnMsIE92ZXJmbG93UG9wdXAsIE92ZXJmbG93UG9wdXBDb25maWcgfSBmcm9tICdAYnJ5bnR1bS9jYWxlbmRhci10aGluJztcblxuaW1wb3J0IHsgU3RyaW5nSGVscGVyIH0gZnJvbSAnQGJyeW50dW0vY29yZS10aGluJztcblxuZXhwb3J0IHR5cGUgQnJ5bnR1bU1vbnRoVmlld1Byb3BzID0ge1xuICAgIC8vIENvbmZpZ3NcbiAgICAvKipcbiAgICAgKiBBIGtleSB0byB1c2UgdG8gYWN0aXZhdGUgdGhpcyB2aWV3LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLWFjdGl2YXRpb25LZXkpXG4gICAgICovXG4gICAgYWN0aXZhdGlvbktleSA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogRWxlbWVudCAob3IgZWxlbWVudCBpZCkgdG8gYWRvcHQgYXMgdGhpcyBXaWRnZXQncyBlbmNhcHN1bGF0aW5nIGVsZW1lbnQuIFRoZSB3aWRnZXQnc1xuICAgICAqIGNvbnRlbnQgd2lsbCBiZSBwbGFjZWQgaW5zaWRlIHRoaXMgZWxlbWVudC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1hZG9wdClcbiAgICAgKi9cbiAgICBhZG9wdCA/IDogSFRNTEVsZW1lbnR8c3RyaW5nXG4gICAgLyoqXG4gICAgICogKk9ubHkgdmFsaWQgaWYgdGhpcyBXaWRnZXQgaXMgW2Zsb2F0aW5nXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctZmxvYXRpbmcpLipcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1hbGlnbilcbiAgICAgKi9cbiAgICBhbGlnbiA/IDogQWxpZ25TcGVjfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFdoZW4gdGhpcyB3aWRnZXQgaXMgYSBjaGlsZCBvZiBhIFtDb250YWluZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ29udGFpbmVyKSwgaXQgd2lsbCBieSBkZWZhdWx0IGJlIHBhcnRpY2lwYXRpbmcgaW4gYVxuICAgICAqIGZsZXhib3ggbGF5b3V0LiBUaGlzIGNvbmZpZyBhbGxvd3MgeW91IHRvIHNldCB0aGlzIHdpZGdldCdzXG4gICAgICogW2FsaWduLXNlbGZdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9hbGlnbi1zZWxmKSBzdHlsZS5cbiAgICAgKi9cbiAgICBhbGlnblNlbGYgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSB0aGlzIGFzIGBmYWxzZWAgdG8gZGlzYWJsZSBkcmFnLWNyZWF0aW5nIGV2ZW50cyBpbiB0aGlzIHZpZXcuXG4gICAgICovXG4gICAgYWxsb3dEcmFnQ3JlYXRlID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlIHRoaXMgYXMgYGZhbHNlYCB0byBkaXNhYmxlIGRyYWctbW92aW5nIGV2ZW50cyBpbiB0aGlzIHZpZXcuXG4gICAgICovXG4gICAgYWxsb3dEcmFnTW92ZSA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSB0aGlzIGFzIGBmYWxzZWAgdG8gZGlzYWJsZSBkcmFnLXJlc2l6aW5nIGV2ZW50cyBpbiB0aGlzIHZpZXcuXG4gICAgICovXG4gICAgYWxsb3dEcmFnUmVzaXplID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogKk9ubHkgdmFsaWQgaWYgdGhpcyBXaWRnZXQgaXMgW2Zsb2F0aW5nXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctZmxvYXRpbmcpIGFuZCBiZWluZyBzaG93biB0aHJvdWdoIFtzaG93QnldKCNDb3JlL3dpZGdldC9XaWRnZXQjZnVuY3Rpb24tc2hvd0J5KS4qXG4gICAgICogYHRydWVgIHRvIHNob3cgYSBjb25uZWN0b3IgYXJyb3cgcG9pbnRpbmcgdG8gdGhlIGFsaWduIHRhcmdldC5cbiAgICAgKi9cbiAgICBhbmNob3IgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBCeSBkZWZhdWx0LCB3aGVuIG5hdmlnYXRpbmcgdGhyb3VnaCB0aW1lLCB0aGUgbmV4dCB0aW1lXG4gICAgICogYmxvY2sgd2lsbCBiZSBhbmltYXRlZCBpbiBmcm9tIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3Rpb24uXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctYW5pbWF0ZVRpbWVTaGlmdClcbiAgICAgKi9cbiAgICBhbmltYXRlVGltZVNoaWZ0ID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogRWxlbWVudCAob3IgdGhlIGlkIG9mIGFuIGVsZW1lbnQpIHRvIGFwcGVuZCB0aGlzIHdpZGdldCdzIGVsZW1lbnQgdG8uIENhbiBiZSBjb25maWd1cmVkLCBvciBzZXQgb25jZSBhdFxuICAgICAqIHJ1bnRpbWUuIFRvIGFjY2VzcyB0aGUgZWxlbWVudCBvZiBhIHJlbmRlcmVkIHdpZGdldCwgc2VlIFtlbGVtZW50XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNwcm9wZXJ0eS1lbGVtZW50KS5cbiAgICAgKi9cbiAgICBhcHBlbmRUbyA/IDogSFRNTEVsZW1lbnR8c3RyaW5nXG4gICAgLyoqXG4gICAgICogQSBsb2NhbGl6YWJsZSBzdHJpbmcgKE1heSBjb250YWluIGAnTHt9J2AgdG9rZW5zIHdoaWNoIHJlc29sdmUgaW4gdGhlIGxvY2FsZSBmaWxlKSB0byBpbmplY3RcbiAgICAgKiBpbnRvIGFuIGVsZW1lbnQgd2hpY2ggd2lsbCBiZSBsaW5rZWQgdXNpbmcgdGhlIGBhcmlhLWRlc2NyaWJlZGJ5YCBhdHRyaWJ1dGUuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctYXJpYURlc2NyaXB0aW9uKVxuICAgICAqL1xuICAgIGFyaWFEZXNjcmlwdGlvbiA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogQSBsb2NhbGl6YWJsZSBzdHJpbmcgKE1heSBjb250YWluIGAnTHt9J2AgdG9rZW5zIHdoaWNoIHJlc29sdmUgaW4gdGhlIGxvY2FsZSBmaWxlKSB0byBpbmplY3QgYXNcbiAgICAgKiB0aGUgYGFyaWEtbGFiZWxgIGF0dHJpYnV0ZS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1hcmlhTGFiZWwpXG4gICAgICovXG4gICAgYXJpYUxhYmVsID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBJZiB0aGlzIGNvbmZpZyBpcyBzZXQsIHRoZW4gdGhlIGBnZXN0dXJlYCBjb25maWd1cmVkICh3aGljaCBkZWZhdWx0cyB0byBgZGJsY2xpY2tgKSBjcmVhdGVzIGFcbiAgICAgKiBuZXcgZXZlbnQgYXQgdGhlIG1vdXNlIG9yIHRvdWNoIGV2ZW50J3MgdGltZSBwb2ludC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1hdXRvQ3JlYXRlKVxuICAgICAqL1xuICAgIGF1dG9DcmVhdGUgPyA6IHtcbiAgICAgICAgZ2VzdHVyZT86IHN0cmluZ1xuICAgICAgICBuZXdOYW1lPzogRnVuY3Rpb258c3RyaW5nXG4gICAgICAgIHN0ZXA/OiBzdHJpbmdcbiAgICAgICAgc25hcFR5cGU/OiAncm91bmQnfCdjZWlsJ3wnZmxvb3InXG4gICAgICAgIGR1cmF0aW9uPzogc3RyaW5nXG4gICAgICAgIHN0YXJ0SG91cj86IG51bWJlclxuICAgIH18c3RyaW5nfGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBCeSBkZWZhdWx0LCB3ZWVrcyByb3dzIGFsbCBmbGV4IHRvIHNoYXJlIHRoZSBhdmFpbGFibGUgaGVpZ2h0IGVxdWFsbHkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctYXV0b1Jvd0hlaWdodClcbiAgICAgKi9cbiAgICBhdXRvUm93SGVpZ2h0ID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQSBDb25maWcgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY29uZmlndXJhdGlvbiBvZiBhIFtUb29sYmFyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1Rvb2xiYXIpLFxuICAgICAqIG9yIGFycmF5IG9mIGNvbmZpZyBvYmplY3RzIHJlcHJlc2VudGluZyB0aGUgY2hpbGQgaXRlbXMgb2YgYSBUb29sYmFyLiBBbm90aGVyIHdheSB0byBhZGQgYSBiYmFyIGlzIHRvIHVzZSBbc3RyaXBzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1BhbmVsI2NvbmZpZy1zdHJpcHMpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLWJiYXIpXG4gICAgICovXG4gICAgYmJhciA/IDogKENhbGVuZGFyQ29udGFpbmVySXRlbUNvbmZpZ3xzdHJpbmcpW118VG9vbGJhckNvbmZpZ3xQYWdpbmdUb29sYmFyQ29uZmlnfG51bGxcbiAgICAvKipcbiAgICAgKiBDdXN0b20gQ1NTIGNsYXNzZXMgdG8gYWRkIHRvIHRoZSBwYW5lbCdzIGJvZHkgZWxlbWVudC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1ib2R5Q2xzKVxuICAgICAqL1xuICAgIGJvZHlDbHMgPyA6IHN0cmluZ3xvYmplY3RcbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3Qgd2hlcmUgcHJvcGVydHkgbmFtZXMgd2l0aCBhIHRydXRoeSB2YWx1ZSBpbmRpY2F0ZSB3aGljaCBldmVudHMgc2hvdWxkIGJ1YmJsZSB1cCB0aGUgb3duZXJzaGlwXG4gICAgICogaGllcmFyY2h5IHdoZW4gdHJpZ2dlcmVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLWJ1YmJsZUV2ZW50cylcbiAgICAgKi9cbiAgICBidWJibGVFdmVudHMgPyA6IG9iamVjdFxuICAgIC8qKlxuICAgICAqIFNldCB0byBgZmFsc2VgIHRvIG5vdCBjYWxsIG9uWFhYIG1ldGhvZCBuYW1lcyAoZS5nLiBgb25TaG93YCwgYG9uQ2xpY2tgKSwgYXMgYW4gZWFzeSB3YXkgdG8gbGlzdGVuIGZvciBldmVudHMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctY2FsbE9uRnVuY3Rpb25zKVxuICAgICAqL1xuICAgIGNhbGxPbkZ1bmN0aW9ucyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEJ5IGRlZmF1bHQsIGlmIGFuIGV2ZW50IGhhbmRsZXIgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdGhlIGVycm9yIHByb3BhZ2F0ZXMgdXAgdGhlIHN0YWNrIGFuZCB0aGVcbiAgICAgKiBhcHBsaWNhdGlvbiBzdGF0ZSBpcyB1bmRlZmluZWQuIENvZGUgd2hpY2ggZm9sbG93cyB0aGUgZXZlbnQgaGFuZGxlciB3aWxsICpub3QqIGJlIGV4ZWN1dGVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLWNhdGNoRXZlbnRIYW5kbGVyRXhjZXB0aW9ucylcbiAgICAgKi9cbiAgICBjYXRjaEV2ZW50SGFuZGxlckV4Y2VwdGlvbnMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBBIGZ1bmN0aW9uIChvciB0aGUgbmFtZSBvZiBhIGZ1bmN0aW9uKSB3aGljaCBjcmVhdGVzIGNvbnRlbnQgaW4sIGFuZCBtYXkgbXV0YXRlIGEgZGF5IGNlbGwgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gcmVuZGVyRGF0YVxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHJlbmRlckRhdGEuY2VsbCBUaGUgY2VsbCBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7RGF0ZX0gcmVuZGVyRGF0YS5kYXRlIFRoZSBkYXRlIGZvciB0aGUgY2VsbFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSByZW5kZXJEYXRhLmRheSBUaGUgZGF5IGZvciB0aGUgY2VsbCAoYDBgIHRvIGA2YCBmb3IgU3VuZGF5IHRvIFNhdHVyZGF5KVxuICAgICAqIEBwYXJhbSB7bnVtYmVyW119IHJlbmRlckRhdGEucm93SW5kZXggVGhlIHJvdyBpbmRleCwgMCB0byBtb250aCByb3cgY291bnQgKDYgaWYgW3NpeFdlZWtzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0NhbGVuZGFyUGFuZWwjY29uZmlnLXNpeFdlZWtzKSBpcyBgdHJ1ZWApXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcmVuZGVyRGF0YS5yb3cgVGhlIHJvdyBlbGVtZW50IGVuY2Fwc3VsYXRpbmcgdGhlIHdlZWsgd2hpY2ggdGhlIGNlbGwgaXMgYSBwYXJ0IG9mXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5DYWxlbmRhclBhbmVsfSByZW5kZXJEYXRhLnNvdXJjZSBUaGUgd2lkZ2V0IGJlaW5nIHJlbmRlcmVkXG4gICAgICogQHBhcmFtIHtudW1iZXJbXX0gcmVuZGVyRGF0YS5jZWxsSW5kZXggVGhlIGNlbGwgaW5kZXggaW4gdGhlIHdob2xlIHBhbmVsLiBNYXkgYmUgZnJvbSBgMGAgdG8gdXAgdG8gYDQyYFxuICAgICAqIEBwYXJhbSB7bnVtYmVyW119IHJlbmRlckRhdGEuY29sdW1uSW5kZXggVGhlIGNvbHVtbiBpbmRleCwgYDBgIHRvIGA2YFxuICAgICAqIEBwYXJhbSB7bnVtYmVyW119IHJlbmRlckRhdGEudmlzaWJsZUNvbHVtbkluZGV4IFRoZSB2aXNpYmxlIGNvbHVtbiBpbmRleCB0YWtpbmcgaGlkZGVuIG5vbiB3b3JraW5nIGRheXMgaW50byBhY2NvdW50XG4gICAgICogQHJldHVybnMge3N0cmluZyxEb21Db25maWcsdm9pZH1cbiAgICAgKi9cbiAgICBjZWxsUmVuZGVyZXIgPyA6ICgocmVuZGVyRGF0YTogeyBjZWxsOiBIVE1MRWxlbWVudCwgZGF0ZTogRGF0ZSwgZGF5OiBudW1iZXIsIHJvd0luZGV4OiBudW1iZXJbXSwgcm93OiBIVE1MRWxlbWVudCwgc291cmNlOiBDYWxlbmRhclBhbmVsLCBjZWxsSW5kZXg6IG51bWJlcltdLCBjb2x1bW5JbmRleDogbnVtYmVyW10sIHZpc2libGVDb2x1bW5JbmRleDogbnVtYmVyW10gfSkgPT4gc3RyaW5nfERvbUNvbmZpZ3x2b2lkKXxzdHJpbmdcbiAgICAvKipcbiAgICAgKiAqT25seSB2YWxpZCBpZiB0aGlzIFdpZGdldCBpcyBbZmxvYXRpbmddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1mbG9hdGluZykuKlxuICAgICAqIFNldCB0byBgdHJ1ZWAgdG8gY2VudHJlIHRoZSBXaWRnZXQgaW4gYnJvd3NlciB2aWV3cG9ydCBzcGFjZS5cbiAgICAgKi9cbiAgICBjZW50ZXJlZCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEN1c3RvbSBDU1MgY2xhc3NlcyB0byBhZGQgdG8gZWxlbWVudC5cbiAgICAgKiBNYXkgYmUgc3BlY2lmaWVkIGFzIGEgc3BhY2Ugc2VwYXJhdGVkIHN0cmluZywgb3IgYXMgYW4gb2JqZWN0IGluIHdoaWNoIHByb3BlcnR5IG5hbWVzXG4gICAgICogd2l0aCB0cnV0aHkgdmFsdWVzIGFyZSB1c2VkIGFzIHRoZSBjbGFzcyBuYW1lczpcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1jbHMpXG4gICAgICovXG4gICAgY2xzID8gOiBzdHJpbmd8b2JqZWN0XG4gICAgLyoqXG4gICAgICogQ29udHJvbHMgd2hldGhlciB0aGUgcGFuZWwgaXMgY29sbGFwc2VkICh0aGUgYm9keSBvZiB0aGUgcGFuZWwgaXMgaGlkZGVuIHdoaWxlIG9ubHkgdGhlIGhlYWRlciBpc1xuICAgICAqIHZpc2libGUpLiBPbmx5IHZhbGlkIGlmIHRoZSBwYW5lbCBpcyBbY29sbGFwc2libGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwjY29uZmlnLWNvbGxhcHNpYmxlKS5cbiAgICAgKi9cbiAgICBjb2xsYXBzZWQgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBUaGlzIGNvbmZpZyBlbmFibGVzIGNvbGxhcHNpYmlsaXR5IGZvciB0aGUgcGFuZWwuIFNlZSBbY29sbGFwc2VkXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1BhbmVsI2NvbmZpZy1jb2xsYXBzZWQpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLWNvbGxhcHNpYmxlKVxuICAgICAqL1xuICAgIGNvbGxhcHNpYmxlID8gOiBib29sZWFufFBhbmVsQ29sbGFwc2VyQ29uZmlnfFBhbmVsQ29sbGFwc2VyT3ZlcmxheUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIEFwcGxpZXMgdGhlIHNwZWNpZmllZCBjb2xvciB0byB0aGUgd2lkZ2V0LCBieSBzZXR0aW5nIHRoZSBgLS1iLXByaW1hcnlgIENTUyB2YXJpYWJsZSBpbiB0aGUgd2lkZ2V0c1xuICAgICAqIGBzdHlsZWAgYmxvY2suXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctY29sb3IpXG4gICAgICovXG4gICAgY29sb3IgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFByb2dyYW1tYXRpYyBjb250cm9sIG92ZXIgd2hpY2ggY29sdW1uIHRvIHN0YXJ0IGluIHdoZW4gdXNlZCBpbiBhIGdyaWQgbGF5b3V0LlxuICAgICAqL1xuICAgIGNvbHVtbiA/IDogbnVtYmVyXG4gICAgY29uZmlnID8gOiBvYmplY3RcbiAgICAvKipcbiAgICAgKiAqT25seSB2YWxpZCBpZiB0aGlzIFdpZGdldCBpcyBbZmxvYXRpbmddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1mbG9hdGluZykgb3IgW3Bvc2l0aW9uZWRdKCNDb3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLXBvc2l0aW9uZWQpLipcbiAgICAgKiBFbGVtZW50LCBXaWRnZXQgb3IgUmVjdGFuZ2xlIHRvIHdoaWNoIHRoaXMgV2lkZ2V0IGlzIGNvbnN0cmFpbmVkLlxuICAgICAqL1xuICAgIGNvbnN0cmFpblRvID8gOiBIVE1MRWxlbWVudHxXaWRnZXR8UmVjdGFuZ2xlXG4gICAgLyoqXG4gICAgICogQ3VzdG9tIENTUyBjbGFzc2VzIHRvIGFkZCB0byB0aGUgW2NvbnRlbnRFbGVtZW50XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNwcm9wZXJ0eS1jb250ZW50RWxlbWVudCkuXG4gICAgICogTWF5IGJlIHNwZWNpZmllZCBhcyBhIHNwYWNlIHNlcGFyYXRlZCBzdHJpbmcsIG9yIGFzIGFuIG9iamVjdCBpbiB3aGljaCBwcm9wZXJ0eSBuYW1lc1xuICAgICAqIHdpdGggdHJ1dGh5IHZhbHVlcyBhcmUgdXNlZCBhcyB0aGUgY2xhc3MgbmFtZXM6XG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctY29udGVudEVsZW1lbnRDbHMpXG4gICAgICovXG4gICAgY29udGVudEVsZW1lbnRDbHMgPyA6IHN0cmluZ3xvYmplY3RcbiAgICAvKipcbiAgICAgKiBXaGVuIHRoaXMgV2lkZ2V0IGNvbmZpZ3VyYXRpb24gaXMgdXNlZCBpbiB0aGUgR3JpZCdzIFJvd0V4cGFuZGVyIGZlYXR1cmUncyBgd2lkZ2V0YCBjb25maWcsIHByb3ZpZGUgdGhlXG4gICAgICogZmllbGQgb24gdGhlIGV4cGFuZGVkIHJlY29yZCB0byB1c2UgZm9yIHBvcHVsYXRpbmcgdGhpcyB3aWRnZXQncyBzdG9yZSAoaWYgYXBwbGljYWJsZSlcbiAgICAgKi9cbiAgICBkYXRhRmllbGQgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIE9iamVjdCB0byBhcHBseSB0byBlbGVtZW50cyBkYXRhc2V0IChlYWNoIGtleSB3aWxsIGJlIHVzZWQgYXMgYSBkYXRhLWF0dHJpYnV0ZSBvbiB0aGUgZWxlbWVudClcbiAgICAgKi9cbiAgICBkYXRhc2V0ID8gOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgd2hpY2ggdGhpcyBDYWxlbmRhclBhbmVsIGVuY2Fwc3VsYXRlcy5cbiAgICAgKi9cbiAgICBkYXRlID8gOiBEYXRlfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIEEgW0RhdGVIZWxwZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS9oZWxwZXIvRGF0ZUhlbHBlcikgZm9ybWF0IHN0cmluZy9mdW5jdGlvbiB0byB1c2UgdG8gY3JlYXRlIGRhdGUgb3V0cHV0IGZvciB2aWV3IGRlc2NyaXB0aW9ucy5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGRhdGUgVGhlIGRhdGUgdG8gZm9ybWF0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmb3JtYXR0ZWQgZGF0ZS5cbiAgICAgKi9cbiAgICBkYXRlRm9ybWF0ID8gOiBzdHJpbmd8KChkYXRlOiBEYXRlKSA9PiBzdHJpbmcpXG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgdXNlZCB0byBzZXBhcmF0ZSBzdGFydCBhbmQgZW5kIGRhdGVzIGluIHRoZSBbZGVzY3JpcHRpb25Gb3JtYXRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvbWl4aW4vRGVzY3JpYmFibGUjY29uZmlnLWRlc2NyaXB0aW9uRm9ybWF0KS5cbiAgICAgKi9cbiAgICBkYXRlU2VwYXJhdG9yID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBUaGUgW0RhdGVIZWxwZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS9oZWxwZXIvRGF0ZUhlbHBlcikgZm9ybWF0IHN0cmluZy9mdW5jdGlvbiB0byBmb3JtYXQgdGhlIGRheSBuYW1lc1xuICAgICAqIGluIHRoZSBoZWFkZXIgcGFydCBvZiBlYWNoIGNhbGVuZGFyIGNlbGwuXG4gICAgICogQHBhcmFtIHtEYXRlfSBkYXRlIFRoZSBkYXRlIHRvIGZvcm1hdC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZm9ybWF0dGVkIGRhdGUuXG4gICAgICovXG4gICAgZGF5Q2VsbE5hbWVGb3JtYXQgPyA6IHN0cmluZ3woKGRhdGU6IERhdGUpID0+IHN0cmluZylcbiAgICAvKipcbiAgICAgKiBUaGlzIG1heSBiZSBzcGVjaWZpZWQgdG8gY3JlYXRlIHRoZSBjb250ZW50IGZvciB0aGUgZGF0ZSBhbmQgZGF5IG5hbWUgc2VjdGlvbiBvZiBjYWxlbmRhciBjZWxscy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1kYXlDZWxsUmVuZGVyZXIpXG4gICAgICogQHBhcmFtIHtEYXlDZWxsfSBjZWxsRGF0YSBBIGBEYXlDZWxsYCBvYmplY3QgdGhhdCBjb250YWlucyBkYXRhIGFib3V0IHRoZSBjZWxsLi5cbiAgICAgKiBAcGFyYW0ge0RvbUNvbmZpZyxvYmplY3R9IGRheUNlbGxEb21Db25maWcgQW4gb2JqZWN0IHRvIHN5bmMgdGhlIGRheSBjZWxsIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGRheUNlbGxEb21Db25maWcuY2xhc3NOYW1lIEFuIG9iamVjdCB3aG8ncyB0cnV0aHkgcHJvcGVydHkgbmFtZXMgd2lsbCBiZSBhcHBsaWVkIGFzIGNsYXNzIG5hbWVzLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBkYXlDZWxsRG9tQ29uZmlnLnN0eWxlIEEgQ1NTIHN0eWxlIGRlZmluaXRpb24gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBkYXlDZWxsRG9tQ29uZmlnLmRhdGFzZXQgVGhlIERPTSBkYXRhIHByb3BlcnRpZXMgdG8gc2V0LlxuICAgICAqIEBwYXJhbSB7RG9tQ29uZmlnW119IGRheUNlbGxEb21Db25maWcuY2hpbGRyZW4gVGhlIFtEb21Db25maWddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS9oZWxwZXIvRG9tSGVscGVyI3R5cGVkZWYtRG9tQ29uZmlnKSBkZWZpbml0aW9ucyBmb3IgdGhlIGNvbnRlbnQgb2YgdGhlIGNlbGwuXG4gICAgICogQHJldHVybnMge3N0cmluZyxvYmplY3Qsb2JqZWN0W119IFRoZSBkZWZpbml0aW9uIG9mIHRoZSBjZWxsIGhlYWRlciBjb250ZW50LlxuICAgICAqL1xuICAgIGRheUNlbGxSZW5kZXJlciA/IDogKGNlbGxEYXRhOiBEYXlDZWxsLCBkYXlDZWxsRG9tQ29uZmlnOiB7IGNsYXNzTmFtZTogb2JqZWN0LCBzdHlsZTogb2JqZWN0LCBkYXRhc2V0OiBvYmplY3QsIGNoaWxkcmVuOiBEb21Db25maWdbXSB9KSA9PiBzdHJpbmd8b2JqZWN0fG9iamVjdFtdXG4gICAgLyoqXG4gICAgICogVGhlIFtEYXRlSGVscGVyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvaGVscGVyL0RhdGVIZWxwZXIpIGZvcm1hdCBzdHJpbmcgdG8gZm9ybWF0IHRoZSBkYXkgbmFtZXNcbiAgICAgKiBpbiB0aGUgaGVhZGVyIHJvdyBhYm92ZSB0aGUgY2FsZW5kYXIgY2VsbHMuXG4gICAgICovXG4gICAgZGF5TmFtZUZvcm1hdCA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHNldCB3aGVuIGEgc2luZ2xlIHZhbHVlIGlzIHRvIGJlIGFwcGxpZWQgdG8gdGhpcyBXaWRnZXQuIFN1Y2ggYXMgd2hlbiB1c2VkXG4gICAgICogaW4gYSBncmlkIFdpZGdldENvbHVtbiwgdGhpcyBpcyB0aGUgcHJvcGVydHkgdG8gd2hpY2ggdGhlIGNvbHVtbidzIGBmaWVsZGAgaXMgYXBwbGllZC5cbiAgICAgKi9cbiAgICBkZWZhdWx0QmluZFByb3BlcnR5ID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBIFtxdWVyeV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db250YWluZXIjZnVuY3Rpb24tcXVlcnkpIHNlbGVjdG9yIGZ1bmN0aW9uIHdoaWNoIGNhbiBpZGVudGlmeSB0aGUgZGVzY2VuZGFudCB3aWRnZXQgdG8gd2hpY2hcbiAgICAgKiBmb2N1cyBzaG91bGQgYmUgZGlyZWN0ZWQgYnkgZGVmYXVsdC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1kZWZhdWx0Rm9jdXMpXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IHdpZGdldCBXaWRnZXQgcGFzc2VkIHRvIG1ldGhvZFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSB0cnV0aHkgdmFsdWUgaWYgd2lkZ2V0IGlzIHRoZSBkZWZhdWx0IG9uZVxuICAgICAqL1xuICAgIGRlZmF1bHRGb2N1cyA/IDogKCh3aWRnZXQ6IFdpZGdldCkgPT4gYm9vbGVhbil8c3RyaW5nXG4gICAgLyoqXG4gICAgICogQSBjb25maWcgb2JqZWN0IGNvbnRhaW5pbmcgZGVmYXVsdCBzZXR0aW5ncyB0byBhcHBseSB0byBhbGwgY2hpbGQgd2lkZ2V0cy5cbiAgICAgKi9cbiAgICBkZWZhdWx0cyA/IDogQ2FsZW5kYXJDb250YWluZXJJdGVtQ29uZmlnXG4gICAgLyoqXG4gICAgICogT3B0aW9ucyB0byBhZGQgaW50byBzY3JvbGwgb3B0aW9ucyB3aGVuIHRoZSBbc2Nyb2xsVG9dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L21peGluL0NhbGVuZGFyTWl4aW4jZnVuY3Rpb24tc2Nyb2xsVG8pIG1ldGhvZCBpcyBjYWxsZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctZGVmYXVsdFNjcm9sbE9wdGlvbnMpXG4gICAgICovXG4gICAgZGVmYXVsdFNjcm9sbE9wdGlvbnMgPyA6IEJyeW50dW1TY3JvbGxPcHRpb25zXG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgZm9ybWF0IHVzZWQgYnkgdGhlIGRlZmF1bHQgW2Rlc2NyaXB0aW9uUmVuZGVyZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvbWl4aW4vRGVzY3JpYmFibGUjY29uZmlnLWRlc2NyaXB0aW9uUmVuZGVyZXIpIGZvciByZW5kZXJpbmcgdGhlIHZpZXcncyBkZXNjcmlwdGlvbi5cbiAgICAgKiBJZiB0aGlzIHZhbHVlIGlzIGBudWxsYCwgdGhlIFtkYXRlRm9ybWF0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L21peGluL0Rlc2NyaWJhYmxlI2NvbmZpZy1kYXRlRm9ybWF0KSAoYW5kIHBvdGVudGlhbGx5IFtkYXRlU2VwYXJhdG9yXSgjU2NoZWR1bGVyL3ZpZXcvbWl4aW4vRGVzY3JpYmFibGUjY29uZmlnLWRhdGVTZXBhcmF0b3IpKSB3aWxsXG4gICAgICogYmUgdXNlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1kZXNjcmlwdGlvbkZvcm1hdClcbiAgICAgKiBAcGFyYW0ge0RhdGV9IGRhdGUgVGhlIGRhdGUgdG8gZm9ybWF0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmb3JtYXR0ZWQgZGF0ZS5cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbkZvcm1hdCA/IDogc3RyaW5nfHN0cmluZ1tdfGJvb2xlYW5bXXwoKGRhdGU6IERhdGUpID0+IHN0cmluZyl8RnVuY3Rpb25bXVxuICAgIC8qKlxuICAgICAqIEEgZnVuY3Rpb24gdGhhdCBwcm92aWRlcyB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgdGhpcyB2aWV3LiBJZiBwcm92aWRlZCwgdGhpcyBmdW5jdGlvbiBvdmVycmlkZXMgdGhlXG4gICAgICogW2Rlc2NyaXB0aW9uRm9ybWF0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L21peGluL0Rlc2NyaWJhYmxlI2NvbmZpZy1kZXNjcmlwdGlvbkZvcm1hdCkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctZGVzY3JpcHRpb25SZW5kZXJlcilcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gdmlldyBUaGUgYWN0aXZlIHZpZXcgaW4gY2FzZSB0aGUgZnVuY3Rpb24gaXMgaW4gYW5vdGhlciBzY29wZS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBEZXNjcmlwdGlvbiBzdHJpbmdcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvblJlbmRlcmVyID8gOiAodmlldzogV2lkZ2V0KSA9PiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBDaGVjayBmb3IgQ1NTIGNvbXBhdGliaWxpdHkgaXNzdWVzIHdoZW4gdXBncmFkaW5nIHRvIHY3LiBQZXJmb3JtcyB0aGUgZm9sbG93aW5nIGNoZWNrczpcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1kZXRlY3RDU1NDb21wYXRpYmlsaXR5SXNzdWVzKVxuICAgICAqL1xuICAgIGRldGVjdENTU0NvbXBhdGliaWxpdHlJc3N1ZXMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlIG9yIGVuYWJsZSB0aGUgd2lkZ2V0LiBJdCBpcyBzaW1pbGFyIHRvIFtyZWFkT25seV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLXJlYWRPbmx5KSBleGNlcHQgYSBkaXNhYmxlZCB3aWRnZXRcbiAgICAgKiBjYW5ub3QgYmUgZm9jdXNlZCwgdXNlcyBhIGRpZmZlcmVudCByZW5kaXRpb24gKHVzdWFsbHkgZ3JleWlzaCkgYW5kIGRvZXMgbm90IGFsbG93IHNlbGVjdGluZyBpdHMgdmFsdWUuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctZGlzYWJsZWQpXG4gICAgICovXG4gICAgZGlzYWJsZWQgPyA6IGJvb2xlYW58J2luZXJ0J1xuICAgIC8qKlxuICAgICAqIFRoZSBjbGFzcyBuYW1lIHRvIGFkZCB0byBkaXNhYmxlZCBjYWxlbmRhciBjZWxscy5cbiAgICAgKi9cbiAgICBkaXNhYmxlZENscyA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogRWl0aGVyIGFuIGFycmF5IG9mIGBEYXRlYCBvYmplY3RzIHdoaWNoIGFyZSB0byBiZSBkaXNhYmxlZCAob3IgZGF0ZSBzdHJpbmdzKSwgb3JcbiAgICAgKiBhIGZ1bmN0aW9uIChvciB0aGUgbmFtZSBvZiBhIGZ1bmN0aW9uKSwgd2hpY2gsIHdoZW4gcGFzc2VkIGEgYERhdGVgIHJldHVybnMgYHRydWVgIGlmIHRoZVxuICAgICAqIGRhdGUgaXMgZGlzYWJsZWQuIERpc2FibGVkIGRhdGVzIGNhbm5vdCBiZSBpbnRlcmFjdGVkIHdpdGguXG4gICAgICogQHBhcmFtIHtEYXRlfSBkYXRlIERhdGUgdG8gY2hlY2tcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHByb3ZpZGVkIGRhdGUgaXMgZGlzYWJsZWRcbiAgICAgKi9cbiAgICBkaXNhYmxlZERhdGVzID8gOiAoKGRhdGU6IERhdGUpID0+IGJvb2xlYW4pfHN0cmluZ3xEYXRlW118c3RyaW5nW11cbiAgICAvKipcbiAgICAgKiBDb25maWd1cmUgYXMgYHRydWVgIHRvIHJlbmRlciBub24gd29ya2luZyBkYXlzIGFzIFtkaXNhYmxlZERhdGVzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0NhbGVuZGFyUGFuZWwjY29uZmlnLWRpc2FibGVkRGF0ZXMpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLWRpc2FibGVOb25Xb3JraW5nRGF5cylcbiAgICAgKi9cbiAgICBkaXNhYmxlTm9uV29ya2luZ0RheXMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBDb25maWd1cmUgdGhpcyBhcyB0cnVlIHRvIGRpc2FibGUgcG9pbnRlciBpbnRlcmFjdGlvbiB3aXRoIGNlbGxzIHdoaWNoIGFyZSBvdXRzaWRlIHRoZVxuICAgICAqIHJhbmdlIG9mIHRoZSBjdXJyZW50IG1vbnRoLlxuICAgICAqL1xuICAgIGRpc2FibGVPdGhlck1vbnRoQ2VsbHMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBDb25maWd1cmUgYXMgYHRydWVgIHRvIHJlbmRlciBTYXR1cmRheXMgYW5kIFN1bmRheXMgYXMgW2Rpc2FibGVkRGF0ZXNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ2FsZW5kYXJQYW5lbCNjb25maWctZGlzYWJsZWREYXRlcykuXG4gICAgICovXG4gICAgZGlzYWJsZVdlZWtlbmRzID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQ29udHJvbHMgdGhlIHBsYWNlbWVudCBvZiB0aGlzIHdpZGdldCB3aGVuIGl0IGlzIGFkZGVkIHRvIGEgW3BhbmVsJ3MgXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1BhbmVsKVxuICAgICAqIFtzdHJpcHMgY29sbGVjdGlvbl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9QYW5lbCNjb25maWctc3RyaXBzKS4gVHlwaWNhbCB2YWx1ZXMgZm9yIHRoaXMgY29uZmlnIGFyZSBgJ3RvcCdgLFxuICAgICAqIGAnYm90dG9tJ2AsIGAnbGVmdCdgLCBvciBgJ3JpZ2h0J2AsIHdoaWNoIGNhdXNlIHRoZSB3aWRnZXQgdG8gYmUgcGxhY2VkIG9uIHRoYXQgc2lkZSBvZiB0aGUgcGFuZWwnc1xuICAgICAqIGJvZHkuIFN1Y2ggd2lkZ2V0cyBhcmUgY2FsbGVkIFwiZWRnZSBzdHJpcHNcIi5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1kb2NrKVxuICAgICAqL1xuICAgIGRvY2sgPyA6ICd0b3AnfCdib3R0b20nfCdsZWZ0J3wncmlnaHQnfCdzdGFydCd8J2VuZCd8J2hlYWRlcid8J3ByZS1oZWFkZXInfG9iamVjdFxuICAgIC8qKlxuICAgICAqICpPbmx5IHZhbGlkIGlmIHRoaXMgV2lkZ2V0IGlzIFtmbG9hdGluZ10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLWZsb2F0aW5nKS4qXG4gICAgICogU2V0IHRvIGB0cnVlYCB0byBiZSBhYmxlIHRvIGRyYWcgYSB3aWRnZXQgZnJlZWx5IG9uIHRoZSBwYWdlLiBPciBzZXQgdG8gYW4gb2JqZWN0IHdpdGggYSDCtGhhbmRsZVNlbGVjdG9ywrRcbiAgICAgKiBwcm9wZXJ0eSB3aGljaCBjb250cm9scyB3aGVuIGEgZHJhZyBzaG91bGQgc3RhcnQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctZHJhZ2dhYmxlKVxuICAgICAqL1xuICAgIGRyYWdnYWJsZSA/IDogYm9vbGVhbnx7XG4gICAgICAgIGhhbmRsZVNlbGVjdG9yPzogc3RyaW5nXG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRoZSBbZHVyYXRpb25Vbml0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL1NjaGVkdWxlci9tb2RlbC9FdmVudE1vZGVsI2ZpZWxkLWR1cmF0aW9uVW5pdCkgdG8gdXNlIHdoZW4gZHJhZy1jcmVhdGluZyBldmVudHNcbiAgICAgKiBpbiB0aGlzIHZpZXcuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctZHJhZ1VuaXQpXG4gICAgICovXG4gICAgZHJhZ1VuaXQgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIE1ha2UgdGhpcyBQYW5lbCBhIGRvY2tlZCBkcmF3ZXIgd2hpY2ggc2xpZGVzIG91dCBmcm9tIG9uZSBzaWRlIG9mIHRoZSBicm93c2VyIHZpZXdwb3J0IGJ5IGRlZmF1bHQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctZHJhd2VyKVxuICAgICAqIEBwYXJhbSB7J3N0YXJ0JywnbGVmdCcsJ2VuZCcsJ3JpZ2h0JywndG9wJywnYm90dG9tJ30gc2lkZSBUaGUgc2lkZSBvZiB0aGUgdmlld3BvcnQgdG8gZG9jayB0aGUgZHJhd2VyIHRvLiAgKiBgJ3N0YXJ0J2AgbWVhbnMgdGhlIGBpbmxpbmUtc3RhcnRgIHNpZGUuICogYCdlbmQnYCBtZWFucyB0aGUgYGlubGluZS1lbmRgIHNpZGUuXG4gICAgICogQHBhcmFtIHtzdHJpbmcsbnVtYmVyfSBzaXplIFRoZSBzaXplIG9mIHRoZSBkcmF3ZXIgaW4gaXRzIGNvbGxhcHNpYmxlIGF4aXMuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBpbmxpbmUgSWYgdXNpbmcgdGhlIFthcHBlbmRUb10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9QYW5lbCNjb25maWctYXBwZW5kVG8pIGNvbmZpZyB0byBwbGFjZSB0aGUgZHJhd2VyIGluc2lkZSBhIGhvc3Qgd2lkZ2V0LCB0aGlzIG1heSBiZSBzZXQgdG8gYHRydWVgIHRvIG1ha2UgdGhlIGRyYXdlciBpbmxpbmUgd2l0aGluIHRoYXQgaG9zdC4gTm90ZSB0aGF0LCBpZiB1c2luZyB0aGlzLCB0aGUgbGF5b3V0IG9mIHRoZSBob3N0IGVsZW1lbnQgbXVzdCBoYXZlIGBmbGV4LWRpcmVjdGlvbmAgc2V0IGFwcHJvcHJpYXRlbHkuXG4gICAgICogQHBhcmFtIHtib29sZWFuLG9iamVjdH0gYXV0b0Nsb3NlIFNwZWNpZmllcyB3aGF0IHVzZXIgYWN0aW9ucyBzaG91bGQgYXV0b21hdGljYWxseSBjbG9zZSB0aGUgZHJhd2VyLiBEZWZhdWx0cyB0byBjbG9zaW5nIHdoZW4gdGhlIHVzZXIgY2xpY2tzIG91dHNpZGUgb2YgdGhlIGRyYXdlciBvciB3aGVuIGZvY3VzIG1vdmVzIG91dHNpZGUgb2YgdGhlIGRyYXdlci5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW4sc3RyaW5nfSBhdXRvQ2xvc2UubW91c2Vkb3duIElmIHRoZSB1c2VyIGNsaWNrcyBvdXRzaWRlIG9mIHRoZSBkcmF3ZXIsIHRoZSBkcmF3ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGhpZGRlbi4gSWYgdGhlIHZhbHVlIGlzIGEgc3RyaW5nLCBpdCBpcyB1c2VkIGFzIGEgQ1NTIHNlbGVjdG9yIHRvIGZpbHRlciBjbGlja3Mgd2hpY2ggc2hvdWxkIGNsb3NlIHRoZSBkcmF3ZXIuXG4gICAgICogQHBhcmFtIHtib29sZWFuLHN0cmluZ30gYXV0b0Nsb3NlLmZvY3Vzb3V0IElmIGZvY3VzIG1vdmVzIG91dHNpZGUgb2YgdGhlIGRyYXdlciwgdGhlIGRyYXdlciB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgaGlkZGVuLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdXRvQ2xvc2UubW91c2VvdXQgSGlkZXMgdGhlIGRyYXdlciB3aGVuIHRoZSBtb3VzZSBsZWF2ZXMgdGhlIGRyYXdlciBhZnRlciB0aGUgYGF1dG9DbG9zZURlbGF5YCBwZXJpb2QuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGF1dG9DbG9zZURlbGF5IFdoZW4gdXNpbmcgYG1vdXNlb3V0YCwgdGhpcyBpcyB0aGUgZGVsYXkgaW4gbWlsbGlzZWNvbmRzXG4gICAgICovXG4gICAgZHJhd2VyID8gOiBib29sZWFufHtzaWRlPzogJ3N0YXJ0J3wnbGVmdCd8J2VuZCd8J3JpZ2h0J3wndG9wJ3wnYm90dG9tJywgc2l6ZT86IHN0cmluZ3xudW1iZXIsIGlubGluZT86IGJvb2xlYW4sIGF1dG9DbG9zZTogeyBtb3VzZWRvd24/OiBib29sZWFufHN0cmluZywgZm9jdXNvdXQ/OiBib29sZWFufHN0cmluZywgbW91c2VvdXQ/OiBzdHJpbmcgfSwgYXV0b0Nsb3NlRGVsYXk/OiBudW1iZXJ9XG4gICAgLyoqXG4gICAgICogQW4gb2JqZWN0IHNwZWNpZnlpbmcgYXR0cmlidXRlcyB0byBhc3NpZ24gdG8gdGhlIHJvb3QgZWxlbWVudCBvZiB0aGlzIHdpZGdldC5cbiAgICAgKiBTZXQgYG51bGxgIHZhbHVlIHRvIGF0dHJpYnV0ZSB0byByZW1vdmUgaXQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctZWxlbWVudEF0dHJpYnV0ZXMpXG4gICAgICovXG4gICAgZWxlbWVudEF0dHJpYnV0ZXMgPyA6IFJlY29yZDxzdHJpbmcsIHN0cmluZ3xudWxsPlxuICAgIC8qKlxuICAgICAqIEEgW0RvbUNvbmZpZ10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL2hlbHBlci9Eb21IZWxwZXIjdHlwZWRlZi1Eb21Db25maWcpIG9iamVjdCB3aGljaCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBjb250ZW50IG9mIGEgY2xpY2thYmxlXG4gICAgICogZWxlbWVudCB3aGljaCBpcyBwcmVzZW50IHdoZW4gbm8gZXZlbnRzIGFyZSBpbiBhIGNlbGwuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctZW1wdHlDZWxsUmVuZGVyZXIpXG4gICAgICogQHBhcmFtIHtEYXlDZWxsfSBkYXlDZWxsUmVuZGVyZXIgQSBgRGF5Q2VsbGAgb2JqZWN0IHRoYXQgY29udGFpbnMgZGF0YSBhYm91dCB0aGUgY2VsbC5cbiAgICAgKiBAcmV0dXJucyB7RG9tQ29uZmlnLHZvaWR9IERvbUNvbmZpZyBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBIVE1MIG1hcmt1cFxuICAgICAqL1xuICAgIGVtcHR5Q2VsbFJlbmRlcmVyID8gOiAoKGRheUNlbGxSZW5kZXJlcjogRGF5Q2VsbCkgPT4gRG9tQ29uZmlnfHZvaWQpfG9iamVjdHxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBIGZ1bmN0aW9uLCBvciB0aGUgbmFtZSBvZiBhIGZ1bmN0aW9uIGluIHRoZSBvd25lcnNoaXAgaGllcmFyY2h5IHRvIGZpbHRlciB3aGljaCBldmVudHNcbiAgICAgKiBhcmUgY29sbGVjdGVkIGludG8gdGhlIGRheSBjZWxsIGRhdGEgYmxvY2tzLlxuICAgICAqIFJldHVybiBgdHJ1ZWAgdG8gaW5jbHVkZSB0aGUgcGFzc2VkIGV2ZW50LCBvciBhICpmYWxzeSogdmFsdWUgdG8gZXhjbHVkZSB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbH0gZXZlbnQgdGhlIHBhc3NlZCBldmVudFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGV2ZW50RmlsdGVyID8gOiAoKGV2ZW50OiBFdmVudE1vZGVsKSA9PiBib29sZWFuKXxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBIGZ1bmN0aW9uLCBvciB0aGUgbmFtZSBvZiBhIGZ1bmN0aW9uIGluIHRoZSBvd25lcnNoaXAgaGllcmFyY2h5IHdoaWNoIHlvdVxuICAgICAqIGNhbiBzcGVjaWZ5IHRvIGN1c3RvbWl6ZSBldmVudCBET00gY29udGVudC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1ldmVudEhlYWRlclJlbmRlcmVyKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBkZXRhaWwgQW4gb2JqZWN0IHRoYXQgY29udGFpbnMgZGF0YSBhYm91dCB0aGUgZXZlbnQgYmVpbmcgcmVuZGVyZWRcbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyVmlld30gZGV0YWlsLnZpZXcgVGhlIHZpZXcgcmVuZGVyaW5nIHRoZSBldmVudFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWx9IGRldGFpbC5ldmVudFJlY29yZCBUaGUgZXZlbnQgcmVjb3JkXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuUmVzb3VyY2VNb2RlbH0gZGV0YWlsLnJlc291cmNlUmVjb3JkIFRoZSByZXNvdXJjZSByZWNvcmRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZGV0YWlsLnJlbmRlckRhdGEgQSBkYXRhIG9iamVjdCBjb250YWluaW5nIHByb3BlcnRpZXMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBldmVudCBlbGVtZW50XG4gICAgICogQHBhcmFtIHtvYmplY3R9IGRldGFpbC5yZW5kZXJEYXRhLnN0eWxlIFRoZSBzdHlsZSBwcm9wZXJ0eSBpcyBhbiBvYmplY3QgY29udGFpbmluZyBzdHlsZSBwcm9wZXJ0aWVzIGZvciB0aGUgZXZlbnQgZWxlbWVudFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBkZXRhaWwucmVuZGVyRGF0YS5jbHMgVGhlIGNscyBwcm9wZXJ0eSBpcyBhbiBvYmplY3Qgd2hvc2UgcHJvcGVydHkgbmFtZXMgd2lsbCBiZSBhZGRlZCB0byB0aGUgZXZlbnQgZWxlbWVudCBpZiB0aGUgcHJvcGVydHkgdmFsdWUgaXMgdHJ1dGh5XG4gICAgICogQHBhcmFtIHtvYmplY3R9IGRldGFpbC5yZW5kZXJEYXRhLmljb25TdHlsZSBUaGUgaWNvblN0eWxlIHByb3BlcnR5IGlzIGFuIG9iamVjdCBjb250YWluaW5nIHN0eWxlIHByb3BlcnRpZXMgZm9yIHRoZSBpY29uIGVsZW1lbnQgaWYgYW4gaWNvbiBlbGVtZW50IGlzIHRvIGJlIHVzZWRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZGV0YWlsLnJlbmRlckRhdGEuaWNvbkNscyBUaGUgaWNvbkNscyBwcm9wZXJ0eSBpcyBhbiBvYmplY3Qgd2hvc2UgcHJvcGVydHkgbmFtZXMgd2lsbCBiZSBhZGRlZCB0byB0aGUgaWNvbiBlbGVtZW50LiBJbml0aWFsbHkgc2V0IGZyb20gdGhlIGV2ZW50IHJlY29yZCdzIFtpY29uQ2xzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL1NjaGVkdWxlci9tb2RlbC9FdmVudE1vZGVsI2ZpZWxkLWljb25DbHMpLiBDYW4gYmUgbXV0YXRlZCBieSB0aGUgcmVuZGVyZXIuIElmIG51bGwsIG9yIG5vIHByb3BlcnRpZXMgYXJlIHNldCwgbm8gaWNvbiB3aWxsIGJlIHJlbmRlcmVkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRldGFpbC5yZW5kZXJEYXRhLmV2ZW50Q29sb3IgQ29sb3IgdG8gYmUgYXBwbGllZCB0byB0aGUgZXZlbnRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZGV0YWlsLnJlbmRlckRhdGEuZGF0YXNldCBBbiBvYmplY3Qgd2hpY2ggcHJvZHVjZXMgdGhlIGBkYXRhc2V0YCBvZiB0aGUgcmVzdWx0aW5nIGV2ZW50IGJhclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZGV0YWlsLnJlbmRlckRhdGEuc29saWRCYXIgVGhpcyBpcyB2YWxpZCBmb3Igdmlld3Mgd2hpY2ggY3JlYXRlIGV2ZW50IGJhcnMuIFRoaXMgaXMgc2V0IHRvIGB0cnVlYCBieSBkZWZhdWx0IGZvciBhbGwgZGF5IGFuZCBpbnRlcmRheSBldmVudHMgc28gdGhhdCB0aGVzZSBhcHBlYXIgYXMgYSBzb2xpZCBibG9jayBvZiBiYWNrZ3JvdW5kIGNvbG9yLiBBbiBldmVudFJlbmRlcmVyIG1heSBtdXRhdGUgdGhpcyBmbGFnIHRvIGNoYW5nZSBpbiB3aGF0IG1hbm5lciB0aGUgZXZlbnQgYmFyIGlzIGNvbG9yZWQgLSBhcyBhIHNvbGlkIGJhciBvZiBjb2xvciwgb3IgdXNpbmcgdGhlIGZvcmVncm91bmQgY29sb3IgKHRleHQgYW5kIGljb25zKSBzdWNoIGFzIHRoZSBNb250aFZpZXcsIHRoZSBDYWxlbmRhclJvdyAoYWxsIGRheSBldmVudHMgaW4gYSBEYXlWaWV3KSwgYW5kIE92ZXJmbG93UG9wdXBzXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRldGFpbC5yZW5kZXJEYXRhLmJvZHlDb2xvciBXaGVuIHVzZWQgaW4gYSBbRGF5Vmlld10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRGF5VmlldyksIHRoaXMgY29sb3IgaXMgYXBwbGllZCB0byB0aGUgYm9keSBvZiB0aGUgZXZlbnQgZWxlbWVudC4gTm90ZSB0aGF0IHRoaXMgbXVzdCBiZSBsaWdodCBlbm91Z2ggdGhhdCB0aGUgdGV4dCBjb2xvciAoRnJvbSB0aGUgU0FTUyB2YXJpYWJsZSBgJGRheXZpZXctZXZlbnQtY29sb3JgKSBpcyB2aXNpYmxlXG4gICAgICogQHBhcmFtIHtib29sZWFufSBkZXRhaWwuc2hvd0J1bGxldCBJZiB0aGVyZSBpcyBubyBgaWNvbkNsc2AsIGFuZCB0aGUgZXZlbnQgaXMgbm90IHJlY3VycmluZywgdGhlbiBieSBkZWZhdWx0IGEgXCJidWxsZXRcIiBjaXJjdWxhciBpY29uIGlzIHNob3duIGlmIHRoZSB2aWV3J3MgW3Nob3dCdWxsZXRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L21peGluL0NhbGVuZGFyTWl4aW4jY29uZmlnLXNob3dCdWxsZXQpIGlmIHNldC4gU2V0dGluZyB0aGlzIHByb3BlcnR5IGluIGFuIGV2ZW50IHJlbmRlcmVyIG92ZXJyaWRlcyB0aGlzIGJlaGF2aW91ci5cbiAgICAgKiBAcmV0dXJucyB7RG9tQ29uZmlnLERvbUNvbmZpZ1tdLHN0cmluZyx2b2lkfVxuICAgICAqL1xuICAgIGV2ZW50SGVhZGVyUmVuZGVyZXIgPyA6ICgoZGV0YWlsOiB7IHZpZXc6IENhbGVuZGFyVmlldywgZXZlbnRSZWNvcmQ6IEV2ZW50TW9kZWwsIHJlc291cmNlUmVjb3JkOiBSZXNvdXJjZU1vZGVsLCByZW5kZXJEYXRhOiB7IHN0eWxlOiBvYmplY3QsIGNsczogb2JqZWN0LCBpY29uU3R5bGU6IG9iamVjdCwgaWNvbkNsczogb2JqZWN0LCBldmVudENvbG9yOiBzdHJpbmcsIGRhdGFzZXQ6IG9iamVjdCwgc29saWRCYXI6IGJvb2xlYW4sIGJvZHlDb2xvcjogc3RyaW5nIH0sIHNob3dCdWxsZXQ6IGJvb2xlYW4gfSkgPT4gRG9tQ29uZmlnfERvbUNvbmZpZ1tdfHN0cmluZ3x2b2lkKXxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBUaGUgaGVpZ2h0IG9mIGV2ZW50IGJhcnMgaW4gdGhpcyB2aWV3LiBUaGlzIGNhbiBiZSBhIG51bWVyaWMgdmFsdWUgaW4gcGl4ZWxzIG9yIGEgQ1NTIHVuaXQgbWVhc3VyZSBzdWNoXG4gICAgICogYXMgYCcyZW0nYC5cbiAgICAgKi9cbiAgICBldmVudEhlaWdodCA/IDogbnVtYmVyfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIEEgZnVuY3Rpb24sIG9yIHRoZSBuYW1lIG9mIGEgZnVuY3Rpb24gaW4gdGhlIG93bmVyc2hpcCBoaWVyYXJjaHkgd2hpY2ggeW91XG4gICAgICogY2FuIHNwZWNpZnkgdG8gY3VzdG9taXplIGV2ZW50IERPTSBjb250ZW50LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLWV2ZW50UmVuZGVyZXIpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGRldGFpbCBBbiBvYmplY3QgdGhhdCBjb250YWlucyBkYXRhIGFib3V0IHRoZSBldmVudCBiZWluZyByZW5kZXJlZFxuICAgICAqIEBwYXJhbSB7Q2FsZW5kYXJWaWV3fSBkZXRhaWwudmlldyBUaGUgdmlldyByZW5kZXJpbmcgdGhlIGV2ZW50XG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbH0gZGV0YWlsLmV2ZW50UmVjb3JkIFRoZSBldmVudCByZWNvcmRcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5SZXNvdXJjZU1vZGVsfSBkZXRhaWwucmVzb3VyY2VSZWNvcmQgVGhlIFJlc291cmNlIHJlY29yZFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBkZXRhaWwucmVuZGVyRGF0YSBBIGRhdGEgb2JqZWN0IGNvbnRhaW5pbmcgcHJvcGVydGllcyB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIGV2ZW50IGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZGV0YWlsLnJlbmRlckRhdGEuc3R5bGUgVGhlIHN0eWxlIHByb3BlcnR5IGlzIGFuIG9iamVjdCBjb250YWluaW5nIHN0eWxlIHByb3BlcnRpZXMgZm9yIHRoZSBldmVudCBlbGVtZW50XG4gICAgICogQHBhcmFtIHtvYmplY3R9IGRldGFpbC5yZW5kZXJEYXRhLmNscyBUaGUgY2xzIHByb3BlcnR5IGlzIGFuIG9iamVjdCB3aG9zZSBwcm9wZXJ0eSBuYW1lcyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBldmVudCBlbGVtZW50IGlmIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyB0cnV0aHlcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZGV0YWlsLnJlbmRlckRhdGEuaWNvblN0eWxlIFRoZSBpY29uU3R5bGUgcHJvcGVydHkgaXMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgc3R5bGUgcHJvcGVydGllcyBmb3IgdGhlIGljb24gZWxlbWVudCBpZiBhbiBpY29uIGVsZW1lbnQgaXMgdG8gYmUgdXNlZFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBkZXRhaWwucmVuZGVyRGF0YS5pY29uQ2xzIFRoZSBpY29uQ2xzIHByb3BlcnR5IGlzIGFuIG9iamVjdCB3aG9zZSBwcm9wZXJ0eSBuYW1lcyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBpY29uIGVsZW1lbnQuIEluaXRpYWxseSBzZXQgZnJvbSB0aGUgZXZlbnQgcmVjb3JkJ3MgW2ljb25DbHNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvU2NoZWR1bGVyL21vZGVsL0V2ZW50TW9kZWwjZmllbGQtaWNvbkNscykuIENhbiBiZSBtdXRhdGVkIGJ5IHRoZSByZW5kZXJlci4gSWYgbnVsbCwgb3Igbm8gcHJvcGVydGllcyBhcmUgc2V0LCBubyBpY29uIHdpbGwgYmUgcmVuZGVyZWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGV0YWlsLnJlbmRlckRhdGEuZXZlbnRDb2xvciBDb2xvciB0byBiZSBhcHBsaWVkIHRvIHRoZSBldmVudC4gVGhpcyBtYXkgYmUgYSBDU1MgY29sb3IgbmFtZSBvciBhIENTUyBjb2xvciB2YWx1ZSBpbiBhbnkgb2YgdGhlIHN1cHBvcnRlZCBDU1MgY29sb3IgZm9ybWF0cyBzdWNoIGFzIGAjUlJHR0JCYCwgYHJnYigyNTUsIDAsIDApYCwgb3IgYHJnYmEoMjU1LCAwLCAwLCAwLjUpYC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGV0YWlsLnJlbmRlckRhdGEuZXZlbnRCYWNrZ3JvdW5kIEEgQ1NTIGJhY2tncm91bmQgc3R5bGUgdG8gYmUgYXBwbGllZCB0byB0aGUgZXZlbnQuIFRoaXMgaXMgbm90IHNldCBieSBkZWZhdWx0LCBidXQgY2FuIGJlIHNldCBieSB0aGUgcmVuZGVyZXIgdG8gcHJvdmlkZSBhIGJhY2tncm91bmQgaW1hZ2Ugb3IgZ3JhZGllbnQgZm9yIHRoZSBldmVudCBiYXIuIFRoaXMgb3ZlcnJpZGVzIHRoZSBgZXZlbnRDb2xvcmAgcHJvcGVydHkgaWYgcHJlc2VudC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGV0YWlsLnJlbmRlckRhdGEudGV4dENvbG9yIEEgQ1NTIGNvbG9yIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGV2ZW50IHRleHQuIFRoaXMgaXMgbm90IHNldCBieSBkZWZhdWx0LCBidXQgY2FuIGJlIHNldCBieSB0aGUgcmVuZGVyZXIgdG8gcHJvdmlkZSBhIGN1c3RvbSBjb2xvciBmb3IgdGhlIGV2ZW50IG5hbWUgdGV4dCBpbiB0aGUgZXZlbnQgYmFyLiBUaGlzIG1heSBiZSBhIENTUyBjb2xvciBuYW1lIG9yIGEgQ1NTIGNvbG9yIHZhbHVlIGluIGFueSBvZiB0aGUgc3VwcG9ydGVkIENTUyBjb2xvciBmb3JtYXRzIHN1Y2ggYXMgYCNSUkdHQkJgLCBgcmdiKDI1NSwgMCwgMClgLCBvciBgcmdiYSgyNTUsIDAsIDAsIDAuNSlgLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBkZXRhaWwucmVuZGVyRGF0YS5ldmVudElubmVyU3R5bGUgVGhlIGV2ZW50SW5uZXJTdHlsZSBwcm9wZXJ0eSBpcyBhbiBvYmplY3QgY29udGFpbmluZyBzdHlsZSBwcm9wZXJ0aWVzIGZvciB0aGUgaW5uZXIgcGFydCBvZiB0aGUgZXZlbnQgZWxlbWVudCwgdGhlIGAuYi1jYWwtZXZlbnRgIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGRldGFpbC5yZW5kZXJEYXRhLmRhdGFzZXQgQW4gb2JqZWN0IHdoaWNoIHByb2R1Y2VzIHRoZSBgZGF0YXNldGAgb2YgdGhlIHJlc3VsdGluZyBldmVudCBiYXJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGRldGFpbC5yZW5kZXJEYXRhLnNvbGlkQmFyIFRoaXMgaXMgdmFsaWQgZm9yIHZpZXdzIHdoaWNoIGNyZWF0ZSBldmVudCBiYXJzLiBUaGlzIGlzIHNldCB0byBgdHJ1ZWAgYnkgZGVmYXVsdCBmb3IgYWxsIGRheSBhbmQgaW50ZXJkYXkgZXZlbnRzIHNvIHRoYXQgdGhlc2UgYXBwZWFyIGFzIGEgc29saWQgYmxvY2sgb2YgYmFja2dyb3VuZCBjb2xvci4gQW4gZXZlbnRSZW5kZXJlciBtYXkgbXV0YXRlIHRoaXMgZmxhZyB0byBjaGFuZ2UgaW4gd2hhdCBtYW5uZXIgdGhlIGV2ZW50IGJhciBpcyBjb2xvcmVkIC0gYXMgYSBzb2xpZCBiYXIgb2YgY29sb3IsIG9yIHVzaW5nIHRoZSBmb3JlZ3JvdW5kIGNvbG9yICh0ZXh0IGFuZCBpY29ucykgc3VjaCBhcyB0aGUgTW9udGhWaWV3LCB0aGUgQ2FsZW5kYXJSb3cgKGFsbCBkYXkgZXZlbnRzIGluIGEgRGF5VmlldyksIGFuZCBPdmVyZmxvd1BvcHVwc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkZXRhaWwucmVuZGVyRGF0YS5ib2R5Q29sb3IgV2hlbiB1c2VkIGluIGEgW0RheVZpZXddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0RheVZpZXcpLCB0aGlzIGNvbG9yIGlzIGFwcGxpZWQgdG8gdGhlIGJvZHkgb2YgdGhlIGV2ZW50IGVsZW1lbnQuIE5vdGUgdGhhdCB0aGlzIG11c3QgYmUgbGlnaHQgZW5vdWdoIHRoYXQgdGhlIHRleHQgY29sb3IgKEZyb20gdGhlIFNBU1MgdmFyaWFibGUgYCRkYXl2aWV3LWV2ZW50LWNvbG9yYCkgaXMgdmlzaWJsZVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZGV0YWlsLnJlbmRlckRhdGEuc2hvd0J1bGxldCBJZiB0aGVyZSBpcyBubyBgaWNvbkNsc2AsIGFuZCB0aGUgZXZlbnQgaXMgbm90IHJlY3VycmluZywgdGhlbiBieSBkZWZhdWx0IGEgXCJidWxsZXRcIiBjaXJjdWxhciBpY29uIGlzIHNob3duIGlmIHRoZSB2aWV3J3MgW3Nob3dCdWxsZXRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L21peGluL0NhbGVuZGFyTWl4aW4jY29uZmlnLXNob3dCdWxsZXQpIGlmIHNldC4gU2V0dGluZyB0aGlzIHByb3BlcnR5IGluIGFuIGV2ZW50IHJlbmRlcmVyIG92ZXJyaWRlcyB0aGlzIGJlaGF2aW91ci5cbiAgICAgKiBAcmV0dXJucyB7RG9tQ29uZmlnLERvbUNvbmZpZ1tdLHN0cmluZyx2b2lkfSBUaGUgY29udGVudCB0byBiZSB1c2VkIGFzIHRoZSBldmVudCBib2R5LlxuICAgICAqL1xuICAgIGV2ZW50UmVuZGVyZXIgPyA6ICgoZGV0YWlsOiB7IHZpZXc6IENhbGVuZGFyVmlldywgZXZlbnRSZWNvcmQ6IEV2ZW50TW9kZWwsIHJlc291cmNlUmVjb3JkOiBSZXNvdXJjZU1vZGVsLCByZW5kZXJEYXRhOiB7IHN0eWxlOiBvYmplY3QsIGNsczogb2JqZWN0LCBpY29uU3R5bGU6IG9iamVjdCwgaWNvbkNsczogb2JqZWN0LCBldmVudENvbG9yOiBzdHJpbmcsIGV2ZW50QmFja2dyb3VuZDogc3RyaW5nLCB0ZXh0Q29sb3I6IHN0cmluZywgZXZlbnRJbm5lclN0eWxlOiBvYmplY3QsIGRhdGFzZXQ6IG9iamVjdCwgc29saWRCYXI6IGJvb2xlYW4sIGJvZHlDb2xvcjogc3RyaW5nLCBzaG93QnVsbGV0OiBib29sZWFuIH0gfSkgPT4gRG9tQ29uZmlnfERvbUNvbmZpZ1tdfHN0cmluZ3x2b2lkKXxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBIGZ1bmN0aW9uIHdoaWNoIGNvbXBhcmVzIGV2ZW50cyB3aGljaCBzb21lIHZpZXdzIHVzZSB0byBkZWNpZGUgdXBvbiByZW5kZXJpbmcgb3JkZXIuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctZXZlbnRTb3J0ZXIpXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbCxFdmVudEJhcn0gbGhzIFRoZSBsZWZ0IHNpZGUgdmFsdWUgdG8gY29ucGFyZVxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWwsRXZlbnRCYXJ9IHJocyBUaGUgcmlnaHQgc2lkZSB2YWx1ZSB0byBjb25wYXJlXG4gICAgICogQHJldHVybnMge251bWJlcn1cbiAgICAgKi9cbiAgICBldmVudFNvcnRlciA/IDogKGxoczogRXZlbnRNb2RlbHxFdmVudEJhciwgcmhzOiBFdmVudE1vZGVsfEV2ZW50QmFyKSA9PiBudW1iZXJcbiAgICAvKipcbiAgICAgKiBIb3cgbXVjaCB2ZXJ0aWNhbCBzcGFjZSBpbiBwaXhlbHMgdG8gbGVhdmUgYmV0d2VlbiBldmVudCBiYXJzIGluIGEgY2VsbC5cbiAgICAgKi9cbiAgICBldmVudFNwYWNpbmcgPyA6IG51bWJlclxuICAgIC8qKlxuICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBlbmQgZGF0ZSBvZiBhbiBhbGwgZGF5IGV2ZW50IGlzIGRpc3BsYXllZCBpbiB0aGUgVUkgYXNcbiAgICAgKiB0aGUgbGFzdCBjYWxlbmRhciBkYXRlIG9uIHdoaWNoIHRoZSBldmVudCBmYWxscy4gRm9yIG1vc3QgZW5kIHVzZXJzLCB0aGlzIGlzIHRoZVxuICAgICAqIGV4cGVjdGVkIHZhbHVlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLWV4dGVuZEFsbERheUVuZERheSlcbiAgICAgKi9cbiAgICBleHRlbmRBbGxEYXlFbmREYXkgPyA6IGJvb2xlYW5cbiAgICBleHRyYURhdGEgPyA6IGFueVxuICAgIC8qKlxuICAgICAqIElmIHRoaXMgaXMgc2V0IHRvIGB0cnVlYCwgdGhlbiB3aGVuIGRldGVybWluaW5nIHdoaWNoIGFzc2lnbmVkIHJlc291cmNlIG9mIGEgbXVsdGkgYXNzaWduZWQgZXZlbnRcbiAgICAgKiB0byB1c2UgdG8gY3JlYXRlIHRoZSBldmVudCBVSSwgdGhlIGZpcnN0IHJlc291cmNlIHdoaWNoIGlzIHN0aWxsIHNlbGVjdGVkIGluIHRoZVxuICAgICAqIFtyZXNvdXJjZUZpbHRlcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvU2lkZWJhciNwcm9wZXJ0eS1yZXNvdXJjZUZpbHRlcikgaXMgdXNlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1maWx0ZXJFdmVudFJlc291cmNlcylcbiAgICAgKi9cbiAgICBmaWx0ZXJFdmVudFJlc291cmNlcyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFdoZW4gdGhpcyB3aWRnZXQgaXMgYSBjaGlsZCBvZiBhIFtDb250YWluZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ29udGFpbmVyKSwgaXQgd2lsbCBieSBkZWZhdWx0IGJlIHBhcnRpY2lwYXRpbmcgaW4gYVxuICAgICAqIGZsZXhib3ggbGF5b3V0LiBUaGlzIGNvbmZpZyBhbGxvd3MgeW91IHRvIHNldCB0aGlzIHdpZGdldCdzXG4gICAgICogW2ZsZXhdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9mbGV4KSBzdHlsZS5cbiAgICAgKiBUaGlzIG1heSBiZSBjb25maWd1cmVkIGFzIGEgc2luZ2xlIG51bWJlciBvciBhIGAmbHQ7ZmxleC1ncm93Jmd0OyAmbHQ7ZmxleC1zaHJpbmsmZ3Q7ICZsdDtmbGV4LWJhc2lzJmd0O2AgZm9ybWF0IHN0cmluZy5cbiAgICAgKiBudW1lcmljLW9ubHkgdmFsdWVzIGFyZSBpbnRlcnByZXRlZCBhcyB0aGUgYGZsZXgtZ3Jvd2AgdmFsdWUuXG4gICAgICovXG4gICAgZmxleCA/IDogbnVtYmVyfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFNldCB0byBgdHJ1ZWAgdG8gbW92ZSB0aGUgd2lkZ2V0IG91dCBvZiB0aGUgZG9jdW1lbnQgZmxvdyBhbmQgcG9zaXRpb24gaXRcbiAgICAgKiBhYnNvbHV0ZWx5IGluIGJyb3dzZXIgdmlld3BvcnQgc3BhY2UuXG4gICAgICovXG4gICAgZmxvYXRpbmcgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBDb25maWcgb2JqZWN0IG9mIGEgZm9vdGVyLiBNYXkgY29udGFpbiBhIGBkb2NrYCwgYGh0bWxgIGFuZCBhIGBjbHNgIHByb3BlcnR5LiBBIGZvb3RlciBpcyBub3QgYSB3aWRnZXQsXG4gICAgICogYnV0IHJhdGhlciBwbGFpbiBIVE1MIHRoYXQgZm9sbG93cyB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBwYW5lbCdzIGJvZHkgYW5kIFtzdHJpcHNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwjY29uZmlnLXN0cmlwcykuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctZm9vdGVyKVxuICAgICAqL1xuICAgIGZvb3RlciA/IDoge1xuICAgICAgICBkb2NrPzogJ3RvcCd8J3JpZ2h0J3wnYm90dG9tJ3wnbGVmdCd8J3N0YXJ0J3wnZW5kJ1xuICAgICAgICBodG1sPzogc3RyaW5nXG4gICAgICAgIGNscz86IHN0cmluZ1xuICAgIH18c3RyaW5nXG4gICAgLyoqXG4gICAgICogQSBGdW5jdGlvbiAob3IgbmFtZSBvZiBhIGZ1bmN0aW9uIGluIHRoZSBvd25lcnNoaXAgaGllcmFyY2h5KSB3aGljaCByZXR1cm5zIHRoZVxuICAgICAqIFtyZXNvdXJjZSByZWNvcmRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvU2NoZWR1bGVyL21vZGVsL1Jlc291cmNlTW9kZWwpIHRvIHVzZSB0byBjcmVhdGUgdGhlIFVJIGZvciBhbiBldmVudC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1nZXRQcmltYXJ5UmVzb3VyY2UpXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbH0gZXZlbnRSZWNvcmQgVGhlIGV2ZW50IGZyb20gd2hpY2ggdG8gZXh0cmFjdCB0aGUgcHJpbWFyeSByZXNvdXJjZS5cbiAgICAgKiBAcmV0dXJucyB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlTW9kZWx9IFRoZSByZXNvdXJjZSB0byBiZSB1c2VkIHRvIHJlbmRlciB0aGUgZXZlbnQuXG4gICAgICovXG4gICAgZ2V0UHJpbWFyeVJlc291cmNlID8gOiAoKGV2ZW50UmVjb3JkOiBFdmVudE1vZGVsKSA9PiBSZXNvdXJjZU1vZGVsKXxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBIGNvbmZpZyBbb2JqZWN0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1BhbmVsI3R5cGVkZWYtUGFuZWxIZWFkZXIpIGZvciB0aGUgcGFuZWwncyBoZWFkZXIgb3IgYSBzdHJpbmcgaW4gcGxhY2Ugb2YgYSBgdGl0bGVgLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLWhlYWRlcilcbiAgICAgKi9cbiAgICBoZWFkZXIgPyA6IHN0cmluZ3xib29sZWFufFBhbmVsSGVhZGVyXG4gICAgLyoqXG4gICAgICogQSBmdW5jdGlvbiAob3IgdGhlIG5hbWUgb2YgYSBmdW5jdGlvbikgd2hpY2ggY3JlYXRlcyBjb250ZW50IGluLCBhbmQgbWF5IG11dGF0ZSBhIGRheSBoZWFkZXIgZWxlbWVudC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1oZWFkZXJSZW5kZXJlcilcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBjZWxsIFRoZSBoZWFkZXIgZWxlbWVudFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjb2x1bW5JbmRleCBUaGUgZGF5IGNvbHVtbi4gV2lsbCBiZSBpbiB0aGUgcmFuZ2UgYDBgIHRvIGA2YFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3ZWVrRGF5IFRoZSBjYW5vbmljYWwgZGF5IG51bWJlciB3aGVyZSBNb25kYXkgaXMgYDBgIGFuZCBTdW5kYXkgaXMgYDZgXG4gICAgICogQHJldHVybnMge3N0cmluZyxEb21Db25maWcsdm9pZH1cbiAgICAgKi9cbiAgICBoZWFkZXJSZW5kZXJlciA/IDogKChjZWxsOiBIVE1MRWxlbWVudCwgY29sdW1uSW5kZXg6IG51bWJlciwgd2Vla0RheTogbnVtYmVyKSA9PiBzdHJpbmd8RG9tQ29uZmlnfHZvaWQpfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFdpZGdldCdzIGhlaWdodCwgdXNlZCB0byBzZXQgZWxlbWVudCBgc3R5bGUuaGVpZ2h0YC4gRWl0aGVyIHNwZWNpZnkgYSB2YWxpZCBoZWlnaHQgc3RyaW5nIG9yIGEgbnVtYmVyLFxuICAgICAqIHdoaWNoIHdpbGwgZ2V0ICdweCcgYXBwZW5kZWQuIFdlIHJlY29tbWVuZCB1c2luZyBDU1MgYXMgdGhlIHByaW1hcnkgd2F5IHRvIGNvbnRyb2wgaGVpZ2h0LCBidXQgaW4gc29tZVxuICAgICAqIGNhc2VzIHRoaXMgY29uZmlnIGlzIGNvbnZlbmllbnQuXG4gICAgICovXG4gICAgaGVpZ2h0ID8gOiBzdHJpbmd8bnVtYmVyXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlIHdpdGggdHJ1ZSB0byBtYWtlIHdpZGdldCBpbml0aWFsbHkgaGlkZGVuLlxuICAgICAqL1xuICAgIGhpZGRlbiA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqICpPbmx5IHZhbGlkIGlmIHRoaXMgV2lkZ2V0IGlzIFtmbG9hdGluZ10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLWZsb2F0aW5nKS4qXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctaGlkZUFuaW1hdGlvbilcbiAgICAgKi9cbiAgICBoaWRlQW5pbWF0aW9uID8gOiBib29sZWFufG9iamVjdFxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSBhcyBgdHJ1ZWAgdG8gaGlkZSBbbm9uV29ya2luZ0RheXNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L21peGluL0NhbGVuZGFyTWl4aW4jY29uZmlnLW5vbldvcmtpbmdEYXlzKVxuICAgICAqL1xuICAgIGhpZGVOb25Xb3JraW5nRGF5cyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSB0aGlzIGFzIGB0cnVlYCB0byBoaWRlIGNlbGxzIHdoaWNoIGFyZSBvdXRzaWRlIHRoZSByYW5nZSBvZiB0aGUgY3VycmVudCBtb250aC5cbiAgICAgKi9cbiAgICBoaWRlT3RoZXJNb250aENlbGxzID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBgdHJ1ZWAgdG8gbWFrZSB0aGlzIGNvbnRhaW5lciBoaWRlIHdoZW4gaXQgaGFzIG5vIHZpc2libGUgY2hpbGRyZW4gKEVpdGhlciBlbXB0eVxuICAgICAqIG9yIGFsbCBjaGlsZHJlbiBoaWRkZW4pLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLWhpZGVXaGVuRW1wdHkpXG4gICAgICovXG4gICAgaGlkZVdoZW5FbXB0eSA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEFuIGljb24gdG8gc2hvdyBiZWZvcmUgdGhlIFt0aXRsZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9QYW5lbCNjb25maWctdGl0bGUpLiBFaXRoZXIgcGFzcyBhIENTUyBjbGFzcyBhcyBhIHN0cmluZywgb3IgcGFzcyBhXG4gICAgICogW0RvbUNvbmZpZ10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL2hlbHBlci9Eb21IZWxwZXIjdHlwZWRlZi1Eb21Db25maWcpIG9iamVjdCBkZXNjcmliaW5nIGFuIGVsZW1lbnQgdG8gcmVwcmVzZW50IHRoZSBpY29uLlxuICAgICAqL1xuICAgIGljb24gPyA6IHN0cmluZ3xEb21Db25maWdcbiAgICAvKipcbiAgICAgKiBXaWRnZXQgaWQsIGlmIG5vdCBzcGVjaWZpZWQgb25lIHdpbGwgYmUgZ2VuZXJhdGVkLiBBbHNvIHVzZWQgZm9yIGxvb2t1cHMgdGhyb3VnaCBXaWRnZXQuZ2V0QnlJZFxuICAgICAqL1xuICAgIGlkID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSB3aWRnZXRzIHJlYWQtb25seSBzdGF0ZSBzaG91bGQgYmUgY29udHJvbGxlZCBieSBpdHMgcGFyZW50LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLWlnbm9yZVBhcmVudFJlYWRPbmx5KVxuICAgICAqL1xuICAgIGlnbm9yZVBhcmVudFJlYWRPbmx5ID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQ29udmVuaWVuY2Ugc2V0dGluZyB0byBhbGlnbiBpbnB1dCBmaWVsZHMgb2YgY2hpbGQgd2lkZ2V0cy4gQnkgZGVmYXVsdCwgdGhlIEZpZWxkIGlucHV0IGVsZW1lbnQgaXNcbiAgICAgKiBwbGFjZWQgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBgbGFiZWxgLiBJZiB5b3UgcHJlZmVyIHRvIGhhdmUgYWxsIGlucHV0IGZpZWxkcyBhbGlnbmVkIHRvIHRoZVxuICAgICAqIHJpZ2h0LCBzZXQgdGhpcyBjb25maWcgdG8gYCdlbmQnYC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1pbnB1dEZpZWxkQWxpZ24pXG4gICAgICovXG4gICAgaW5wdXRGaWVsZEFsaWduID8gOiAnc3RhcnQnfCdlbmQnXG4gICAgLyoqXG4gICAgICogRWxlbWVudCAob3IgZWxlbWVudCBpZCkgdG8gaW5zZXJ0IHRoaXMgd2lkZ2V0IGJlZm9yZS4gSWYgcHJvdmlkZWQsIFthcHBlbmRUb10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLWFwcGVuZFRvKSBjb25maWcgaXMgaWdub3JlZC5cbiAgICAgKi9cbiAgICBpbnNlcnRCZWZvcmUgPyA6IEhUTUxFbGVtZW50fHN0cmluZ1xuICAgIC8qKlxuICAgICAqIEVsZW1lbnQgKG9yIGVsZW1lbnQgaWQpIHRvIGFwcGVuZCB0aGlzIHdpZGdldCBlbGVtZW50IHRvLCBhcyBhIGZpcnN0IGNoaWxkLiBJZiBwcm92aWRlZCwgW2FwcGVuZFRvXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctYXBwZW5kVG8pIGNvbmZpZyBpcyBpZ25vcmVkLlxuICAgICAqL1xuICAgIGluc2VydEZpcnN0ID8gOiBIVE1MRWxlbWVudHxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBbiBvcHRpb25hbCBDU1MgY2xhc3MgdG8gYWRkIHRvIGNoaWxkIGl0ZW1zIG9mIHRoaXMgY29udGFpbmVyLlxuICAgICAqL1xuICAgIGl0ZW1DbHMgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIEFuIG9iamVjdCBjb250YWluaW5nIHR5cGVkIGNoaWxkIHdpZGdldCBjb25maWcgb2JqZWN0cyBvciBXaWRnZXRzLiBNYXkgYWxzbyBiZSBzcGVjaWZpZWRcbiAgICAgKiBhcyBhbiBhcnJheS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1pdGVtcylcbiAgICAgKi9cbiAgICBpdGVtcyA/IDogUmVjb3JkPHN0cmluZywgQ2FsZW5kYXJDb250YWluZXJJdGVtQ29uZmlnfE1lbnVJdGVtRW50cnk+fChDYWxlbmRhckNvbnRhaW5lckl0ZW1Db25maWd8TWVudUl0ZW1FbnRyeXxXaWRnZXQpW11cbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3Qgd2hvc2Uga2V5cyBhcmUgdGhlIFtrZXldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9LZXlib2FyZEV2ZW50L2tleSkgbmFtZVxuICAgICAqIGFuZCBvcHRpb25hbCBtb2RpZmllciBwcmVmaXhlczogYCdDdHJsKydgLCBgJ0FsdCsnYCwgYCdNZXRhKydgLCBhbmQgYCdTaGlmdCsnYCAoY2FzZS1pbnNlbnNpdGl2ZSkuIFRoZSB2YWx1ZXNcbiAgICAgKiBhcmUgdGhlIG5hbWUgb2YgdGhlIGluc3RhbmNlIG1ldGhvZCB0byBjYWxsIHdoZW4gdGhlIGtleXN0cm9rZSBpcyByZWNlaXZlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1rZXlNYXApXG4gICAgICovXG4gICAga2V5TWFwID8gOiBSZWNvcmQ8c3RyaW5nLCBLZXlNYXBDb25maWc+XG4gICAgLyoqXG4gICAgICogQ29udmVuaWVuY2Ugc2V0dGluZyB0byB1c2Ugc2FtZSBsYWJlbCBwbGFjZW1lbnQgb24gYWxsIGNoaWxkIHdpZGdldHMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctbGFiZWxQb3NpdGlvbilcbiAgICAgKi9cbiAgICBsYWJlbFBvc2l0aW9uID8gOiAnYmVmb3JlJ3wnYWJvdmUnfCdhbGlnbi1iZWZvcmUnfCdhdXRvJ3xudWxsXG4gICAgLyoqXG4gICAgICogVGhlIHNob3J0IG5hbWUgb2YgYSBoZWxwZXIgY2xhc3Mgd2hpY2ggbWFuYWdlcyByZW5kZXJpbmcgYW5kIHN0eWxpbmcgb2YgY2hpbGQgaXRlbXMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctbGF5b3V0KVxuICAgICAqL1xuICAgIGxheW91dCA/IDogc3RyaW5nfENhbGVuZGFyQ29udGFpbmVyTGF5b3V0Q29uZmlnXG4gICAgLyoqXG4gICAgICogVGhlIENTUyBzdHlsZSBwcm9wZXJ0aWVzIHRvIGFwcGx5IHRvIHRoZSBbY29udGVudEVsZW1lbnRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I3Byb3BlcnR5LWNvbnRlbnRFbGVtZW50KS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1sYXlvdXRTdHlsZSlcbiAgICAgKi9cbiAgICBsYXlvdXRTdHlsZSA/IDogb2JqZWN0XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgW2NoaWxkIGl0ZW1dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ29udGFpbmVyI2NvbmZpZy1pdGVtcykgKmNvbmZpZyBvYmplY3RzKiB3aGljaCBpcyB0byBiZSBjb252ZXJ0ZWQgaW50b1xuICAgICAqIGluc3RhbmNlcyBvbmx5IHdoZW4gdGhpcyBDb250YWluZXIgaXMgcmVuZGVyZWQsIHJhdGhlciB0aGFuIGVhZ2VybHkgYXQgY29uc3RydWN0IHRpbWUuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctbGF6eUl0ZW1zKVxuICAgICAqL1xuICAgIGxhenlJdGVtcyA/IDogUmVjb3JkPHN0cmluZywgQ2FsZW5kYXJDb250YWluZXJJdGVtQ29uZmlnPnxDYWxlbmRhckNvbnRhaW5lckl0ZW1Db25maWdbXXxXaWRnZXRbXVxuICAgIC8qKlxuICAgICAqIFRoZSBsaXN0ZW5lciBzZXQgZm9yIHRoaXMgb2JqZWN0LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLWxpc3RlbmVycylcbiAgICAgKi9cbiAgICBsaXN0ZW5lcnMgPyA6IE1vbnRoVmlld0xpc3RlbmVyc1xuICAgIC8qKlxuICAgICAqIEEgY2xhc3MgdHJhbnNsYXRpb25zIG9mIHdoaWNoIGFyZSB1c2VkIGZvciB0cmFuc2xhdGluZyB0aGlzIGVudGl0eS5cbiAgICAgKiBUaGlzIGlzIG9mdGVuIHVzZWQgd2hlbiB0cmFuc2xhdGlvbnMgb2YgYW4gaXRlbSBhcmUgZGVmaW5lZCBvbiBpdHMgY29udGFpbmVyIGNsYXNzLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLWxvY2FsZUNsYXNzKVxuICAgICAqL1xuICAgIGxvY2FsZUNsYXNzID8gOiB0eXBlb2YgQmFzZVxuICAgIC8qKlxuICAgICAqIFNldCB0byBgZmFsc2VgIHRvIGRpc2FibGUgbG9jYWxpemF0aW9uIG9mIHRoaXMgb2JqZWN0LlxuICAgICAqL1xuICAgIGxvY2FsaXphYmxlID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBwcm9wZXJ0aWVzIHdoaWNoIHZhbHVlcyBzaG91bGQgYmUgdHJhbnNsYXRlZCBhdXRvbWF0aWNhbGx5IHVwb24gYSBsb2NhbGUgYXBwbHlpbmcuXG4gICAgICogSW4gY2FzZSB0aGVyZSBpcyBhIG5lZWQgdG8gbG9jYWxpemUgbm90IHR5cGljYWwgdmFsdWUgKG5vdCBhIFN0cmluZyB2YWx1ZSBvciBhIGZpZWxkIHdpdGggcmUtZGVmaW5lZCBzZXR0ZXIvZ2V0dGVyKSxcbiAgICAgKiB5b3UgY291bGQgdXNlICdsb2NhbGVLZXknIG1ldGEgY29uZmlndXJhdGlvbi5cbiAgICAgKiBFeGFtcGxlOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLWxvY2FsaXphYmxlUHJvcGVydGllcylcbiAgICAgKi9cbiAgICBsb2NhbGl6YWJsZVByb3BlcnRpZXMgPyA6IHN0cmluZ1tdXG4gICAgLyoqXG4gICAgICogV2lkZ2V0J3MgbWFyZ2luLiBUaGlzIG1heSBiZSBjb25maWd1cmVkIGFzIGEgc2luZ2xlIG51bWJlciBvciBhIGBUUkJMYCBmb3JtYXQgc3RyaW5nLlxuICAgICAqIG51bWVyaWMtb25seSB2YWx1ZXMgYXJlIGludGVycHJldGVkIGFzIHBpeGVscy5cbiAgICAgKi9cbiAgICBtYXJnaW4gPyA6IG51bWJlcnxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBUaGlzIGNvbmZpZyBvYmplY3QgY29udGFpbnMgdGhlIGRlZmF1bHRzIGZvciB0aGUgW01hc2tdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvTWFzaykgY3JlYXRlZCBmb3IgdGhlXG4gICAgICogW21hc2tlZF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLW1hc2tlZCkgY29uZmlnLiBBbnkgcHJvcGVydGllcyBzcGVjaWZpZWQgaW4gdGhlIGBtYXNrZWRgIGNvbmZpZyB3aWxsIG92ZXJyaWRlIHRoZXNlXG4gICAgICogdmFsdWVzLlxuICAgICAqL1xuICAgIG1hc2tEZWZhdWx0cyA/IDogTWFza0NvbmZpZ1xuICAgIC8qKlxuICAgICAqIFNldCB0byBgdHJ1ZWAgdG8gYXBwbHkgdGhlIGRlZmF1bHQgbWFzayB0byB0aGUgd2lkZ2V0LiBBbHRlcm5hdGl2ZWx5LCB0aGlzIGNhbiBiZSB0aGUgbWFzayBtZXNzYWdlIG9yIGFcbiAgICAgKiBbTWFza10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9NYXNrKSBjb25maWcgb2JqZWN0LlxuICAgICAqL1xuICAgIG1hc2tlZCA/IDogYm9vbGVhbnxzdHJpbmd8TWFza0NvbmZpZ1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIGRhdGUgdG8gd2hpY2ggdGhlIGBlbmREYXRlYCBvZiB0aGlzIHZpZXcgbWF5IGJlIG5hdmlnYXRlZC5cbiAgICAgKi9cbiAgICBtYXhEYXRlID8gOiBEYXRlfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBldmVudHMgdG8gc2hvdyBpbiBhIGNlbGwgd2hlbiB0aGUgcm93IGlzIHNocmlua3dyYXBwZWQuXG4gICAgICogVXNlIHRoaXMgdG8ga2VlcCByb3dzIHRvIGEgc2FuZSBzaXplIHdoZW4gdXNpbmcgW2F1dG9Sb3dIZWlnaHRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctYXV0b1Jvd0hlaWdodCksXG4gICAgICogb3IgdGhlIFtXZWVrRXhwYW5kZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvZmVhdHVyZS9XZWVrRXhwYW5kZXIpIGZlYXR1cmUuXG4gICAgICovXG4gICAgbWF4RXZlbnRzUGVyQ2VsbCA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogVGhlIGVsZW1lbnQncyBtYXhIZWlnaHQuIENhbiBiZSBlaXRoZXIgYSBTdHJpbmcgb3IgYSBOdW1iZXIgKHdoaWNoIHdpbGwgaGF2ZSAncHgnIGFwcGVuZGVkKS4gTm90ZSB0aGF0XG4gICAgICogbGlrZSBbaGVpZ2h0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctaGVpZ2h0KSwgKnJlYWRpbmcqIHRoZSB2YWx1ZSB3aWxsIHJldHVybiB0aGUgbnVtZXJpYyB2YWx1ZSBpbiBwaXhlbHMuXG4gICAgICovXG4gICAgbWF4SGVpZ2h0ID8gOiBzdHJpbmd8bnVtYmVyXG4gICAgLyoqXG4gICAgICogKk9ubHkgdmFsaWQgaWYgdGhpcyBXaWRnZXQgaXMgW2Zsb2F0aW5nXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctZmxvYXRpbmcpLipcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1tYXhpbWl6ZU9uTW9iaWxlKVxuICAgICAqL1xuICAgIG1heGltaXplT25Nb2JpbGUgPyA6IG51bWJlcnxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBUaGUgZWxlbWVudHMgbWF4V2lkdGguIENhbiBiZSBlaXRoZXIgYSBTdHJpbmcgb3IgYSBOdW1iZXIgKHdoaWNoIHdpbGwgaGF2ZSAncHgnIGFwcGVuZGVkKS4gTm90ZSB0aGF0XG4gICAgICogbGlrZSBbd2lkdGhdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy13aWR0aCksICpyZWFkaW5nKiB0aGUgdmFsdWUgd2lsbCByZXR1cm4gdGhlIG51bWVyaWMgdmFsdWUgaW4gcGl4ZWxzLlxuICAgICAqL1xuICAgIG1heFdpZHRoID8gOiBzdHJpbmd8bnVtYmVyXG4gICAgLyoqXG4gICAgICogQnkgZGVmYXVsdCwgZGF5IGNlbGxzIGZsZXggdG8gc2hhcmUgYXZhaWxhYmxlIFBhbmVsIHdpZHRoIGVxdWFsbHkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctbWluQ29sdW1uV2lkdGgpXG4gICAgICovXG4gICAgbWluQ29sdW1uV2lkdGggPyA6IG51bWJlclxuICAgIC8qKlxuICAgICAqIFRoZSBtaW5pbXVtIGRhdGUgdG8gd2hpY2ggdGhlIGBzdGFydERhdGVgIG9mIHRoaXMgdmlldyBtYXkgYmUgbmF2aWdhdGVkLlxuICAgICAqL1xuICAgIG1pbkRhdGUgPyA6IERhdGV8c3RyaW5nXG4gICAgLyoqXG4gICAgICogVGhlIGVsZW1lbnQncyBtaW5IZWlnaHQuIENhbiBiZSBlaXRoZXIgYSBTdHJpbmcgb3IgYSBOdW1iZXIgKHdoaWNoIHdpbGwgaGF2ZSAncHgnIGFwcGVuZGVkKS4gTm90ZSB0aGF0XG4gICAgICogbGlrZSBbaGVpZ2h0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctaGVpZ2h0KSwgKnJlYWRpbmcqIHRoZSB2YWx1ZSB3aWxsIHJldHVybiB0aGUgbnVtZXJpYyB2YWx1ZSBpbiBwaXhlbHMuXG4gICAgICovXG4gICAgbWluSGVpZ2h0ID8gOiBzdHJpbmd8bnVtYmVyXG4gICAgLyoqXG4gICAgICogQnkgZGVmYXVsdCwgd2VlayByb3dzIGZsZXggdG8gc2hhcmUgYXZhaWxhYmxlIFBhbmVsIGhlaWdodCBlcXVhbGx5LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLW1pblJvd0hlaWdodClcbiAgICAgKi9cbiAgICBtaW5Sb3dIZWlnaHQgPyA6IG51bWJlcnxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBUaGUgZWxlbWVudHMgbWluV2lkdGguIENhbiBiZSBlaXRoZXIgYSBTdHJpbmcgb3IgYSBOdW1iZXIgKHdoaWNoIHdpbGwgaGF2ZSAncHgnIGFwcGVuZGVkKS4gTm90ZSB0aGF0XG4gICAgICogbGlrZSBbd2lkdGhdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy13aWR0aCksICpyZWFkaW5nKiB0aGUgdmFsdWUgd2lsbCByZXR1cm4gdGhlIG51bWVyaWMgdmFsdWUgaW4gcGl4ZWxzLlxuICAgICAqL1xuICAgIG1pbldpZHRoID8gOiBzdHJpbmd8bnVtYmVyXG4gICAgLyoqXG4gICAgICogV2hlbiB0aGlzIGlzIGNvbmZpZ3VyZWQgYXMgYHRydWVgIGEgW1Jlc2l6ZU9ic2VydmVyXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvUmVzaXplT2JzZXJ2ZXIpXG4gICAgICogaXMgdXNlZCB0byBtb25pdG9yIHRoaXMgZWxlbWVudCBmb3Igc2l6ZSBjaGFuZ2VzIGNhdXNlZCBieSBlaXRoZXIgc3R5bGUgbWFuaXB1bGF0aW9uLCBvciBieSBDU1NcbiAgICAgKiBsYXlvdXQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctbW9uaXRvclJlc2l6ZSlcbiAgICAgKi9cbiAgICBtb25pdG9yUmVzaXplID8gOiBib29sZWFufHtcbiAgICAgICAgaW1tZWRpYXRlPzogYm9vbGVhblxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBIFtNb250aF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3V0aWwvTW9udGgpIE1vbnRoIHV0aWxpdHkgb2JqZWN0IHdoaWNoIGVuY2Fwc3VsYXRlcyB0aGlzIFBhbmVsJ3MgbW9udGhcbiAgICAgKiBhbmQgcHJvdmlkZXMgY29udGV4dHVhbCBpbmZvcm1hdGlvbiBhbmQgbmF2aWdhdGlvbiBzZXJ2aWNlcy5cbiAgICAgKi9cbiAgICBtb250aCA/IDogTW9udGh8TW9udGhDb25maWdcbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3QgY29udGFpbmluZyBkZWZhdWx0IGNvbmZpZyBvYmplY3RzIHdoaWNoIG1heSBiZSByZWZlcmVuY2VkIGJ5IG5hbWUgaW4gdGhlIFtpdGVtc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db250YWluZXIjY29uZmlnLWl0ZW1zKVxuICAgICAqIGNvbmZpZy4gRm9yIGV4YW1wbGUsIGEgc3BlY2lhbGl6ZWQgW01lbnVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvTWVudSkgc3ViY2xhc3MgbWF5IGhhdmUgYSBgbmFtZWRJdGVtc2AgZGVmYXVsdFxuICAgICAqIHZhbHVlIGRlZmluZWQgbGlrZSB0aGlzOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLW5hbWVkSXRlbXMpXG4gICAgICovXG4gICAgbmFtZWRJdGVtcyA/IDogUmVjb3JkPHN0cmluZywgQ2FsZW5kYXJDb250YWluZXJJdGVtQ29uZmlnPlxuICAgIC8qKlxuICAgICAqIFRoZSBjbGFzcyBuYW1lIHRvIGFkZCB0byBjYWxlbmRhciBjZWxscyB3aGljaCBhcmUgW25vbldvcmtpbmdEYXlzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0NhbGVuZGFyUGFuZWwjY29uZmlnLW5vbldvcmtpbmdEYXlzKS5cbiAgICAgKi9cbiAgICBub25Xb3JraW5nRGF5Q2xzID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBOb24td29ya2luZyBkYXlzIGFzIGFuIG9iamVjdCB3aGVyZSBrZXlzIGFyZSBkYXkgaW5kaWNlcywgMC02IChTdW5kYXktU2F0dXJkYXkpLCBhbmQgdGhlIHZhbHVlIGlzIGB0cnVlYC5cbiAgICAgKiBEZWZhdWx0cyB0byBbbm9uV29ya2luZ0RheXNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS9oZWxwZXIvRGF0ZUhlbHBlciNwcm9wZXJ0eS1ub25Xb3JraW5nRGF5cy1zdGF0aWMpLlxuICAgICAqL1xuICAgIG5vbldvcmtpbmdEYXlzID8gOiBSZWNvcmQ8bnVtYmVyLCBib29sZWFuPlxuICAgIC8qKlxuICAgICAqIFRoZSBjbGFzcyBuYW1lIHRvIGFkZCB0byBjYWxlbmRhciBjZWxscyB3aGljaCBhcmUgaW4gdGhlIHByZXZpb3VzIG9yIG5leHQgbW9udGguXG4gICAgICovXG4gICAgb3RoZXJNb250aENscyA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogQSBmdW5jdGlvbiwgb3IgbmFtZSBvZiBhIGZ1bmN0aW9uIHdoaWNoIGlzIHBhc3NlZCB0aGUgW0RvbUNvbmZpZ10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL2hlbHBlci9Eb21IZWxwZXIjdHlwZWRlZi1Eb21Db25maWcpIG9iamVjdCB3aGljaFxuICAgICAqIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIFwiK24gbW9yZVwiIGJ1dHRvbiB3aGljaCBpbmRpY2F0ZXMgdGhhdCBhIGRheSBjZWxsIGhhc1xuICAgICAqIG92ZXJmbG93aW5nIGV2ZW50cy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1vdmVyZmxvd0J1dHRvblJlbmRlcmVyKVxuICAgICAqIEBwYXJhbSB7RG9tQ29uZmlnLG9iamVjdH0gZG9tQ29uZmlnIEEgW0RvbUNvbmZpZ10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL2hlbHBlci9Eb21IZWxwZXIjdHlwZWRlZi1Eb21Db25maWcpIGNvbmZpZyBvYmplY3Qgd2hpY2ggaXMgdXNlZCB0byBjcmVhdGUgdGhlIG92ZXJmbG93IGJ1dHRvbi5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZG9tQ29uZmlnLnRhZyBUaGUgdGFnIG5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gY3JlYXRlLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBkb21Db25maWcuY2xhc3NOYW1lIEFuIG9iamVjdCB3aG8ncyB0cnV0aHkgcHJvcGVydHkgbmFtZXMgd2lsbCBiZSBhcHBsaWVkIGFzIGNsYXNzIG5hbWVzLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkb21Db25maWcudGV4dCBUaGUgaW5uZXIgY29udGVudCBvZiB0aGUgZWxlbWVudC4gPHN0cm9uZz5Ob3RlIHRoYXQgdGhpcyB3aWxsIGJlIEhUTUwgZW5jb2RlZCBmb3IgWFNTIHNhZmV0eTwvc3Ryb25nPlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBkb21Db25maWcuc3R5bGUgQSBDU1Mgc3R5bGUgZGVmaW5pdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGRvbUNvbmZpZy5kYXRhc2V0IFRoZSBET00gZGF0YSBwcm9wZXJ0aWVzIHRvIHNldC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gb3ZlcmZsb3dDb3VudCBUaGUgbnVtYmVyIG9mIG92ZXJmbG93aW5nIGV2ZW50cy5cbiAgICAgKiBAcmV0dXJucyB7RG9tQ29uZmlnLHN0cmluZyx2b2lkfVxuICAgICAqL1xuICAgIG92ZXJmbG93QnV0dG9uUmVuZGVyZXIgPyA6IChkb21Db25maWc6IHsgdGFnOiBzdHJpbmcsIGNsYXNzTmFtZTogb2JqZWN0LCB0ZXh0OiBzdHJpbmcsIHN0eWxlOiBvYmplY3QsIGRhdGFzZXQ6IG9iamVjdCB9LCBvdmVyZmxvd0NvdW50OiBudW1iZXIpID0+IERvbUNvbmZpZ3xzdHJpbmd8dm9pZFxuICAgIC8qKlxuICAgICAqIEhvdyB0aGUgdmlldyByZXNwb25kcyB0byBjbGlja2luZyBvbiBhIGArbiBtb3JlYCBidXR0b24gaW4gYW4gb3ZlcmZsb3dpbmcgZGF5IGNlbGwuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctb3ZlcmZsb3dDbGlja0FjdGlvbilcbiAgICAgKi9cbiAgICBvdmVyZmxvd0NsaWNrQWN0aW9uID8gOiAncG9wdXAnfCdleHBhbmQnXG4gICAgLyoqXG4gICAgICogQSBjb25maWcgb2JqZWN0IHVzZWQgdG8gY3JlYXRlIHRoZSBbT3ZlcmZsb3dQb3B1cF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvT3ZlcmZsb3dQb3B1cCkgdGhhdCB0aGlzIHZpZXdcbiAgICAgKiBtYXkgc2hvdyB3aGVuIGV2ZW50cyBmb3Igb25lIGRheSBvdmVyZmxvdyB0aGUgYXZhaWxhYmxlIHNwYWNlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLW92ZXJmbG93UG9wdXApXG4gICAgICovXG4gICAgb3ZlcmZsb3dQb3B1cCA/IDogT3ZlcmZsb3dQb3B1cENvbmZpZ1xuICAgIC8qKlxuICAgICAqIFRoZSBwb2ludGVyIGdlc3R1cmUgd2hpY2ggc2hvd3MgdGhlIHBvcHVwIGNvbnRhaW5pbmcgYW55IG92ZXJmbG93aW5nIGV2ZW50c1xuICAgICAqIGluIHRoZSBjdXJyZW50IHZpZXcuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctb3ZlcmZsb3dQb3B1cFRyaWdnZXIpXG4gICAgICovXG4gICAgb3ZlcmZsb3dQb3B1cFRyaWdnZXIgPyA6ICdjbGljayd8J21vdXNlb3Zlcid8J2hvdmVyJ1xuICAgIC8qKlxuICAgICAqIFRoZSBvd25pbmcgV2lkZ2V0IG9mIHRoaXMgV2lkZ2V0LiBJZiB0aGlzIFdpZGdldCBpcyBkaXJlY3RseSBjb250YWluZWQgKHRoYXQgaXMsIGl0IGlzIG9uZSBvZiB0aGVcbiAgICAgKiBbaXRlbXNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ29udGFpbmVyI3Byb3BlcnR5LWl0ZW1zKSBvZiBhIENvbnRhaW5lciksIHRoaXMgY29uZmlnIHdpbGwgYmUgaWdub3JlZC4gSW4gdGhpcyBjYXNlXG4gICAgICogdGhlIG93bmVyIGlzIDxzdHJvbmc+YWx3YXlzPC9zdHJvbmc+IHRoZSBlbmNhcHN1bGF0aW5nIENvbnRhaW5lci5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1vd25lcilcbiAgICAgKi9cbiAgICBvd25lciA/IDogV2lkZ2V0fGFueVxuICAgIC8qKlxuICAgICAqIFRoZSBjbGFzcyBuYW1lIHRvIGFkZCB0byBldmVudHMgd2hpY2ggaGF2ZSBhbiBlbmQgZGF0ZSBpbiB0aGUgcGFzdC4gRGVmYXVsdHMgdG8gYCdiLXBhc3QtZXZlbnQnYC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1wYXN0RXZlbnRDbHMpXG4gICAgICovXG4gICAgcGFzdEV2ZW50Q2xzID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBCeSBkZWZhdWx0LCByb3dzIHdoaWNoIGhhdmUgYmVlbiBtb2RpZmllZCBieSB0aGUgW1dlZWtFeHBhbmRlcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci9mZWF0dXJlL1dlZWtFeHBhbmRlcilcbiAgICAgKiBmZWF0dXJlLCA8c3Ryb25nPm5vdCBieSB0aGUgW2F1dG9Sb3dIZWlnaHRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctYXV0b1Jvd0hlaWdodCkgc2V0dGluZzwvc3Ryb25nPiwgdG8gc2hpbmt3cmFwIGxhcmdlIGNvbnRlbnRcbiAgICAgKiBhcmUgcmVzZXQgdG8gZmxleGVkIGhlaWdodCBvbiBtb250aCBjaGFuZ2UuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctcGVyc2lzdFNocmlua1dyYXBwZWRSb3dzKVxuICAgICAqL1xuICAgIHBlcnNpc3RTaHJpbmtXcmFwcGVkUm93cyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFNldCB0byBgdHJ1ZWAgd2hlbiBhIHdpZGdldCBpcyByZW5kZXJlZCBpbnRvIGFub3RoZXIgd2lkZ2V0J3MgW2NvbnRlbnRFbGVtZW50XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNwcm9wZXJ0eS1jb250ZW50RWxlbWVudCksIGJ1dCBtdXN0XG4gICAgICogbm90IHBhcnRpY2lwYXRlIGluIHRoZSBzdGFuZGFyZCBsYXlvdXQgb2YgdGhhdCB3aWRnZXQsIGFuZCBtdXN0IGJlIHBvc2l0aW9uZWQgcmVsYXRpdmVseSB0byB0aGF0XG4gICAgICogd2lkZ2V0J3MgW2NvbnRlbnRFbGVtZW50XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNwcm9wZXJ0eS1jb250ZW50RWxlbWVudCkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctcG9zaXRpb25lZClcbiAgICAgKi9cbiAgICBwb3NpdGlvbmVkID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogUHJldmVudCB0b29sdGlwIGZyb20gYmVpbmcgZGlzcGxheWVkIG9uIHRvdWNoIGRldmljZXMuIFVzZWZ1bCBmb3IgZXhhbXBsZSBmb3IgYnV0dG9ucyB0aGF0IGRpc3BsYXkgYVxuICAgICAqIG1lbnUgb24gY2xpY2sgZXRjLCBzaW5jZSB0aGUgdG9vbHRpcCB3b3VsZCBiZSBkaXNwbGF5ZWQgYXQgdGhlIHNhbWUgdGltZS5cbiAgICAgKi9cbiAgICBwcmV2ZW50VG9vbHRpcE9uVG91Y2ggPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoaXMgd2lkZ2V0IGlzIHJlYWQtb25seS4gIFRoaXMgaXMgb25seSB2YWxpZCBpZiB0aGUgd2lkZ2V0IGlzIGFuIGlucHV0XG4gICAgICogZmllbGQsIDxzdHJvbmc+b3IgY29udGFpbnMgaW5wdXQgZmllbGRzIGF0IGFueSBkZXB0aDwvc3Ryb25nPi5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1yZWFkT25seSlcbiAgICAgKi9cbiAgICByZWFkT25seSA/IDogYm9vbGVhblxuICAgIHJlbGF5U3RvcmVFdmVudHMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBFaXRoZXIgYSBkZWZhdWx0IGByZW5kaXRpb25gIHRvIGFwcGx5IHRvIGFsbCBjaGlsZCB3aWRnZXRzLCBvciBhIG1hcCBvZiByZW5kaXRpb25zIGtleWVkIGJ5IGNoaWxkIHdpZGdldFxuICAgICAqIGB0eXBlYC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1yZW5kaXRpb24pXG4gICAgICovXG4gICAgcmVuZGl0aW9uID8gOiBzdHJpbmd8UmVjb3JkPHN0cmluZywgc3RyaW5nPnxudWxsXG4gICAgLyoqXG4gICAgICogUGF0aCB0byBsb2FkIHJlc291cmNlIGltYWdlcyBmcm9tLiBVc2VkIGJ5IHRoZSBbc2hvd1Jlc291cmNlQXZhdGFyc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvbWl4aW4vQ2FsZW5kYXJNaXhpbiNjb25maWctc2hvd1Jlc291cmNlQXZhdGFycykgY29uZmlnXG4gICAgICogdG8gY3JlYXRlIFVSTHMgdXNpbmcgdGhlIHJlc291cmNlJ3NcbiAgICAgKiBbaW1hZ2VdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvU2NoZWR1bGVyL21vZGVsL1Jlc291cmNlTW9kZWwjZmllbGQtaW1hZ2UpIG9yXG4gICAgICogW2ltYWdlVXJsXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL1NjaGVkdWxlci9tb2RlbC9SZXNvdXJjZU1vZGVsI2ZpZWxkLWltYWdlVXJsKSBmaWVsZHM6XG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctcmVzb3VyY2VJbWFnZVBhdGgpXG4gICAgICovXG4gICAgcmVzb3VyY2VJbWFnZVBhdGggPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB0aGUgdmFyaW91cyByZXNwb25zaXZlIHN0YXRlIG9iamVjdHMga2V5ZWQgYnkgdGhlaXIgbmFtZS4gRWFjaCBrZXkgKGV4Y2VwdCBgJyonYCwgc2VlIGJlbG93KSBpblxuICAgICAqIHRoaXMgb2JqZWN0IGlzIGEgc3RhdGUgbmFtZSAoc2VlIFtyZXNwb25zaXZlU3RhdGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvbWl4aW4vUmVzcG9uc2l2ZSNjb25maWctcmVzcG9uc2l2ZVN0YXRlKSkgYW5kIGl0cyBjb3JyZXNwb25kaW5nIHZhbHVlIGlzIHRoZVxuICAgICAqIGFzc29jaWF0ZWQgW1Jlc3BvbnNpdmVTdGF0ZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9taXhpbi9SZXNwb25zaXZlI3R5cGVkZWYtUmVzcG9uc2l2ZVN0YXRlKSBvYmplY3QuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctcmVzcG9uc2l2ZSlcbiAgICAgKi9cbiAgICByZXNwb25zaXZlID8gOiBvYmplY3RcbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3Qgd2hpY2ggZGVzY3JpYmVzIGhvdyB0aGUgZXZlbnQgYmFyIGhlaWdodCBpbiBtb250aCBjZWxscyBzaG91bGQgcmVzcG9uZCB0byBjaGFuZ2VzXG4gICAgICogaW4gYXZhaWxhYmxlIHZlcnRpY2FsIHNwYWNlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLXJlc3BvbnNpdmVFdmVudEhlaWdodClcbiAgICAgKi9cbiAgICByZXNwb25zaXZlRXZlbnRIZWlnaHQgPyA6IFJlY29yZDwoJ3RocmVzaG9sZCd8J21pbkhlaWdodCcpLCBudW1iZXI+fFJlY29yZDxudW1iZXIsIG51bWJlcj5cbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIG1hcmsgdGhpcyBpbnN0YW5jZSBhcyB0aGUgZGVmYXVsdCBbcmVzcG9uc2l2ZVRhcmdldF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9taXhpbi9SZXNwb25zaXZlI2NvbmZpZy1yZXNwb25zaXZlVGFyZ2V0KSBmb3IgZGVzY2VuZGFudHMgdGhhdCBkb1xuICAgICAqIG5vdCBzcGVjaWZ5IGFuIGV4cGxpY2l0IFtyZXNwb25zaXZlVGFyZ2V0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L21peGluL1Jlc3BvbnNpdmUjY29uZmlnLXJlc3BvbnNpdmVUYXJnZXQpIG9mIHRoZWlyIG93bi5cbiAgICAgKi9cbiAgICByZXNwb25zaXZlUm9vdCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY3RpdmUgc3RhdGUgb2YgdGhlIFtyZXNwb25zaXZlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L21peGluL1Jlc3BvbnNpdmUjY29uZmlnLXJlc3BvbnNpdmUpIGNvbmZpZy4gVGhpcyBpcyBhc3NpZ25lZCBpbnRlcm5hbGx5XG4gICAgICogYW5kIHNob3VsZCBub3QgYmUgYXNzaWduZWQgZGlyZWN0bHkuXG4gICAgICovXG4gICAgcmVzcG9uc2l2ZVN0YXRlID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBUaGUgd2lkZ2V0IHdob3NlIHNpemUgYW5kIG90aGVyIHByb3BlcnRpZXMgZHJpdmUgdGhpcyBvYmplY3QncyByZXNwb25zaXZlIGJlaGF2aW9yLiBJZiB0aGlzIGNvbmZpZyBpcyBub3RcbiAgICAgKiBzcGVjaWZpZWQsIHRoZSBjbG9zZXN0IGFuY2VzdG9yIHRoYXQgc3BlY2lmaWVkIFtyZXNwb25zaXZlUm9vdD10cnVlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L21peGluL1Jlc3BvbnNpdmUjY29uZmlnLXJlc3BvbnNpdmVSb290KSB3aWxsIGJlXG4gICAgICogdXNlZC4gSWYgdGhlcmUgaXMgbm8gc3VjaCBhbmNlc3RvciwgdGhlbiB0aGUgaW5zdGFuY2UgdXNpbmcgdGhpcyBtaXhpbiBpcyB1c2VkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLXJlc3BvbnNpdmVUYXJnZXQpXG4gICAgICovXG4gICAgcmVzcG9uc2l2ZVRhcmdldCA/IDogc3RyaW5nfFdpZGdldFxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSBhcyBgdHJ1ZWAgdG8gaGF2ZSB0aGUgY29tcG9uZW50IGRpc3BsYXkgYSB0cmFuc2x1Y2VudCByaXBwbGUgd2hlbiBpdHNcbiAgICAgKiBbZm9jdXNFbGVtZW50XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNwcm9wZXJ0eS1mb2N1c0VsZW1lbnQpLCBvciBbZWxlbWVudF0oI0NvcmUvd2lkZ2V0L1dpZGdldCNwcm9wZXJ0eS1lbGVtZW50KSBpcyB0YXBwZWQgPGVtPmlmIHRoZVxuICAgICAqIGN1cnJlbnQgdGhlbWUgc3VwcG9ydHMgcmlwcGxlczwvZW0+LiBPdXQgb2YgdGhlIGJveCwgb25seSB0aGUgTWF0ZXJpYWwgdGhlbWUgc3VwcG9ydHMgcmlwcGxlcy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1yaXBwbGUpXG4gICAgICovXG4gICAgcmlwcGxlID8gOiBib29sZWFufHtcbiAgICAgICAgZGVsZWdhdGU/OiBzdHJpbmdcbiAgICAgICAgY29sb3I/OiBzdHJpbmdcbiAgICAgICAgcmFkaXVzPzogbnVtYmVyXG4gICAgICAgIGNsaXA/OiBzdHJpbmdcbiAgICB9XG4gICAgLyoqXG4gICAgICogSWYgeW91IGFyZSByZW5kZXJpbmcgdGhpcyB3aWRnZXQgdG8gYSBzaGFkb3cgcm9vdCBpbnNpZGUgYSB3ZWIgY29tcG9uZW50LCBzZXQgdGhpcyBjb25maWcgdG8gdGhlIHNoYWRvd1Jvb3QuIElmIG5vdCBpbnNpZGUgYSB3ZWIgY29tcG9uZW50LCBzZXQgaXQgdG8gYGRvY3VtZW50LmJvZHlgXG4gICAgICovXG4gICAgcm9vdEVsZW1lbnQgPyA6IFNoYWRvd1Jvb3R8SFRNTEVsZW1lbnRcbiAgICAvKipcbiAgICAgKiBUaGlzIG1heSBiZSBjb25maWd1cmVkIGFzIGB0cnVlYCB0byBtYWtlIHRoZSB3aWRnZXQncyBlbGVtZW50IHVzZSB0aGUgYGRpcmVjdGlvbjpydGxgIHN0eWxlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLXJ0bClcbiAgICAgKi9cbiAgICBydGwgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgd2hldGhlciAoYW5kIG9wdGlvbmFsbHkgaW4gd2hpY2ggYXhlcykgYSBXaWRnZXQgbWF5IHNjcm9sbC4gYHRydWVgIG1lYW5zIHRoaXMgd2lkZ2V0IG1heSBzY3JvbGxcbiAgICAgKiBpbiBib3RoIGF4ZXMuIE1heSBiZSBhbiBvYmplY3QgY29udGFpbmluZyBib29sZWFuIGBvdmVyZmxvd1hgIGFuZCBgb3ZlcmZsb3dZYCBwcm9wZXJ0aWVzIHdoaWNoIGFyZVxuICAgICAqIGFwcGxpZWQgdG8gQ1NTIHN0eWxlIHByb3BlcnRpZXMgYG92ZXJmbG93WGAgYW5kIGBvdmVyZmxvd1lgLiBJZiB0aGV5IGFyZSBib29sZWFuLCB0aGV5IGFyZSB0cmFuc2xhdGVkIHRvXG4gICAgICogQ1NTIG92ZXJmbG93IHByb3BlcnRpZXMgdGh1czpcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1zY3JvbGxhYmxlKVxuICAgICAqL1xuICAgIHNjcm9sbGFibGUgPyA6IGJvb2xlYW58U2Nyb2xsZXJDb25maWd8U2Nyb2xsZXJcbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIHdoYXQgdG8gZG8gaWYgZG9jdW1lbnQgaXMgc2Nyb2xsZWQgd2hpbGUgV2lkZ2V0IGlzIHZpc2libGUgKG9ubHkgcmVsZXZhbnQgd2hlbiBmbG9hdGluZyBpcyBzZXQgdG8gYHRydWVgKS5cbiAgICAgKiBWYWxpZCB2YWx1ZXM6IMK0bnVsbMK0OiBkbyBub3RoaW5nLCDCtGhpZGXCtDogaGlkZSB0aGUgd2lkZ2V0IG9yIMK0cmVhbGlnbsK0OiByZWFsaWduIHRvIHRoZSB0YXJnZXQgaWYgcG9zc2libGUuXG4gICAgICovXG4gICAgc2Nyb2xsQWN0aW9uID8gOiAnaGlkZSd8J3JlYWxpZ24nfG51bGxcbiAgICAvKipcbiAgICAgKiBBIGJ1dHRvbiBjb25maWd1cmF0aW9uIG9iamVjdCB0byB1c2UgZm9yIHRoZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgbW9kZSBzZWxlY3RvciBidXR0b24gZm9yIHRoaXMgbW9kZS5cbiAgICAgKi9cbiAgICBzZWxlY3RvckJ1dHRvbiA/IDogQnV0dG9uQ29uZmlnXG4gICAgLyoqXG4gICAgICogQSBtZW51IGl0ZW0gY29uZmlndXJhdGlvbiBvYmplY3QgdG8gdXNlIGZvciB0aGUgYXV0b21hdGljYWxseSBjcmVhdGVkIG1vZGUgc2VsZWN0b3IgbWVudSBpdGVtIGZvciB0aGlzIG1vZGUuXG4gICAgICovXG4gICAgc2VsZWN0b3JNZW51SXRlbSA/IDogTWVudUl0ZW1Db25maWdcbiAgICAvKipcbiAgICAgKiBDb25maWd1cmUgYXMgYHRydWVgIHRvIHJlbmRlciBwYXN0IGRhdGVzIGluIGEgbGlnaHRlciB0ZXh0IGNvbG9yLlxuICAgICAqL1xuICAgIHNoYWRlUGFzdERhdGVzID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQSBbRGF0ZUhlbHBlcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL2hlbHBlci9EYXRlSGVscGVyKSBmb3JtYXQgc3RyaW5nL2Z1bmN0aW9uIHRvIHVzZSB0byBjcmVhdGUgZGF0ZSBvdXRwdXQgZm9yXG4gICAgICogYWJicmV2aWF0ZWQgdmlldyBkZXNjcmlwdGlvbnMuXG4gICAgICogQHBhcmFtIHtEYXRlfSBkYXRlIFRoZSBkYXRlIHRvIGZvcm1hdC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZm9ybWF0dGVkIGRhdGUuXG4gICAgICovXG4gICAgc2hvcnREYXRlRm9ybWF0ID8gOiBzdHJpbmd8KChkYXRlOiBEYXRlKSA9PiBzdHJpbmcpXG4gICAgLyoqXG4gICAgICogQSBbRGF0ZUhlbHBlcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL2hlbHBlci9EYXRlSGVscGVyKSBmb3JtYXQgc3RyaW5nL2Z1bmN0aW9uIHRvIHVzZSB0byBjcmVhdGUgZGF0ZSBhbmQgdGltZSBvdXRwdXQgZm9yXG4gICAgICogYWJicmV2aWF0ZWQgdmlldyBkZXNjcmlwdGlvbnMuXG4gICAgICogQHBhcmFtIHtEYXRlfSBkYXRlIFRoZSBkYXRlIHRvIGZvcm1hdC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZm9ybWF0dGVkIGRhdGUuXG4gICAgICovXG4gICAgc2hvcnREYXRlVGltZUZvcm1hdCA/IDogc3RyaW5nfCgoZGF0ZTogRGF0ZSkgPT4gc3RyaW5nKVxuICAgIC8qKlxuICAgICAqIFRoZSBjbGFzcyBuYW1lIHRvIGFkZCB0byBldmVudHMgd2hpY2ggaGF2ZSBkdXJhdGlvbiBsZXNzIHRoYW4gb3IgZXF1YWwgdG9cbiAgICAgKiBbc2hvcnRFdmVudER1cmF0aW9uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9taXhpbi9DYWxlbmRhck1peGluI2NvbmZpZy1zaG9ydEV2ZW50RHVyYXRpb24pLlxuICAgICAqL1xuICAgIHNob3J0RXZlbnRDbHMgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFRoZSBkdXJhdGlvbiBhdCB3aGljaCBiZWxvdyBhbmQgZXF1YWwgdG8gdGhpcyB2YWx1ZSwgYW4gZXZlbnQncyBlbmNhcHN1bGF0aW5nIGVsZW1lbnQgZ2V0c1xuICAgICAqIHRoZSBbc2hvcnRFdmVudENsc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvbWl4aW4vQ2FsZW5kYXJNaXhpbiNjb25maWctc2hvcnRFdmVudENscykgYWRkZWQgdG8gaXQgc28gdGhhdCBzbWFsbCBldmVudCBiYXJzIGNhbiBoYXZlIHN0eWxlIHJlYXJyYW5nZW1lbnRzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLXNob3J0RXZlbnREdXJhdGlvbilcbiAgICAgKi9cbiAgICBzaG9ydEV2ZW50RHVyYXRpb24gPyA6IHN0cmluZ3xudW1iZXJcbiAgICAvKipcbiAgICAgKiAqT25seSB2YWxpZCBpZiB0aGlzIFdpZGdldCBpcyBbZmxvYXRpbmddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1mbG9hdGluZykuKlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLXNob3dBbmltYXRpb24pXG4gICAgICovXG4gICAgc2hvd0FuaW1hdGlvbiA/IDogYm9vbGVhbnxvYmplY3RcbiAgICAvKipcbiAgICAgKiA8c3Ryb25nPk5vdCBhcHBsaWNhYmxlIGluIGEgYERheVZpZXdgPC9zdHJvbmc+XG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctc2hvd0J1bGxldClcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGJhciBUaGlzIGlzIGBmYWxzZWAgYnkgZGVmYXVsdC4gU2V0IHRoaXMgdG8gYHRydWVgIGluIG1vZGVzIHdoZXJlIGEgc29saWQgZXZlbnQgYmFyIHNob3VsZCBzaG93IGEgYnVsbGV0IGljb25cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG5vQmFyIFRoaXMgaXMgYHRydWVgIGJ5IGRlZmF1bHQuIEV2ZW50cyB3aXRoIG5vIGJhY2tncm91bmQgY29sb3VyLCB1c2UgdGhpcyB0byBzaG93IHRoZSBldmVudCdzIGRlZmluZWQgYGV2ZW50Q29sb3JgXG4gICAgICovXG4gICAgc2hvd0J1bGxldCA/IDogYm9vbGVhbnx7YmFyPzogYm9vbGVhbiwgbm9CYXI/OiBib29sZWFufVxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSBhcyBgdHJ1ZWAgdG8gc2hvdyBhdmF0YXJzIG9mIHRoZSBhc3NpZ25lZCByZXNvdXJjZXMgKGNhbGVuZGFycykgYXQgdGhlXG4gICAgICogc3RhcnQgb2YgdGhlIGV2ZW50IGJhci5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1zaG93UmVzb3VyY2VBdmF0YXJzKVxuICAgICAqL1xuICAgIHNob3dSZXNvdXJjZUF2YXRhcnMgPyA6IGJvb2xlYW58c3RyaW5nXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGBmYWxzZWAgdG8gbm90IHNob3cgdGhlIHRvb2x0aXAgd2hlbiB0aGlzIHdpZGdldCBpcyBbZGlzYWJsZWRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I3Byb3BlcnR5LWRpc2FibGVkKVxuICAgICAqL1xuICAgIHNob3dUb29sdGlwV2hlbkRpc2FibGVkID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlIGFzIGB0cnVlYCB0byBzaG93IGEgd2VlayBudW1iZXIgY29sdW1uIGF0IHRoZSBzdGFydCBvZiB0aGUgY2FsZW5kYXIgYmxvY2suXG4gICAgICovXG4gICAgc2hvd1dlZWtDb2x1bW4gPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBDb25maWd1cmUgYXMgYGZhbHNlYCB0byBoaWRlIHRoZSB3ZWVrIG51bWJlciBzaG93biBhdCB0aGUgdG9wLWxlZnQgb2YgZWFjaCBkYXkgY2VsbFxuICAgICAqL1xuICAgIHNob3dXZWVrTnVtYmVyID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlIGFzIGB0cnVlYCB0byBhbHdheXMgc2hvdyBhIHNpeC13ZWVrIGNhbGVuZGFyLlxuICAgICAqL1xuICAgIHNpeFdlZWtzID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogUHJvZ3JhbW1hdGljIGNvbnRyb2wgb3ZlciBob3cgbWFueSBjb2x1bW5zIHRvIHNwYW4gd2hlbiB1c2VkIGluIGEgZ3JpZCBsYXlvdXQuXG4gICAgICovXG4gICAgc3BhbiA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGB0cnVlYCB0byBzdGFjayBtdWx0aS1kYXkgZXZlbnRzIHdpdGhpbiBlYWNoIGNlbGwgaW4gdGhlIG9yZGVyIG9mIHRoZWlyIHN0YXJ0IHRpbWUuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctc3RhY2tNdWx0aURheUV2ZW50cylcbiAgICAgKi9cbiAgICBzdGFja011bHRpRGF5RXZlbnRzID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogVGhpcyB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6XG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctc3RhdGVmdWwpXG4gICAgICovXG4gICAgc3RhdGVmdWwgPyA6IGJvb2xlYW58b2JqZWN0fHN0cmluZ1tdXG4gICAgLyoqXG4gICAgICogVGhlIGV2ZW50cyB0aGF0LCB3aGVuIGZpcmVkIGJ5IHRoaXMgY29tcG9uZW50LCBzaG91bGQgdHJpZ2dlciBpdCB0byBzYXZlIGl0cyBzdGF0ZSBieSBjYWxsaW5nXG4gICAgICogW3NhdmVTdGF0ZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL21peGluL1N0YXRlI2Z1bmN0aW9uLXNhdmVTdGF0ZSkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctc3RhdGVmdWxFdmVudHMpXG4gICAgICovXG4gICAgc3RhdGVmdWxFdmVudHMgPyA6IG9iamVjdHxzdHJpbmdbXVxuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgdG8gdXNlIHdoZW4gc2F2aW5nIHRoaXMgb2JqZWN0J3Mgc3RhdGUgaW4gdGhlIFtzdGF0ZVByb3ZpZGVyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvbWl4aW4vU3RhdGUjY29uZmlnLXN0YXRlUHJvdmlkZXIpLiBJZiB0aGlzIGNvbmZpZyBpc1xuICAgICAqIG5vdCBhc3NpZ25lZCwgYW5kIFtzdGF0ZWZ1bF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL21peGluL1N0YXRlI2NvbmZpZy1zdGF0ZWZ1bCkgaXMgbm90IHNldCB0byBgZmFsc2VgLCB0aGUgW2lkXSgjQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1pZClcbiAgICAgKiAoaWYgZXhwbGljaXRseSBzcGVjaWZpZWQpIHdpbGwgYmUgdXNlZCBhcyB0aGUgYHN0YXRlSWRgLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLXN0YXRlSWQpXG4gICAgICovXG4gICAgc3RhdGVJZCA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogVGhlIGBTdGF0ZVByb3ZpZGVyYCB0byB1c2UgdG8gc2F2ZSBhbmQgcmVzdG9yZSB0aGlzIG9iamVjdCdzIFtzdGF0ZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL21peGluL1N0YXRlI3Byb3BlcnR5LXN0YXRlKS4gQnkgZGVmYXVsdCwgYHN0YXRlYFxuICAgICAqIHdpbGwgYmUgc2F2ZWQgdXNpbmcgdGhlIFtkZWZhdWx0IHN0YXRlIHByb3ZpZGVyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvc3RhdGUvU3RhdGVQcm92aWRlciNwcm9wZXJ0eS1pbnN0YW5jZS1zdGF0aWMpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLXN0YXRlUHJvdmlkZXIpXG4gICAgICovXG4gICAgc3RhdGVQcm92aWRlciA/IDogU3RhdGVQcm92aWRlclxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgYHRydWVgIHRvIG1hdGNoIGZpZWxkcyBieSB0aGVpciBgbmFtZWAgcHJvcGVydHkgb25seSB3aGVuIGFzc2lnbmluZyBhIFtyZWNvcmRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ29udGFpbmVyI2NvbmZpZy1yZWNvcmQpLFxuICAgICAqIHdpdGhvdXQgZmFsbGluZyBiYWNrIHRvIGByZWZgLlxuICAgICAqL1xuICAgIHN0cmljdFJlY29yZE1hcHBpbmcgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3QgY29udGFpbmluZyB3aWRnZXRzIGtleWVkIGJ5IG5hbWUuIEJ5IGRlZmF1bHQgKHdoZW4gbm8gYHR5cGVgIGlzIGdpdmVuKSwgc3RyaXBzIGFyZVxuICAgICAqIFt0b29sYmFyc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9Ub29sYmFyKS4gSWYgeW91IHdhbnQgdG8gcGFzcyBhbiBhcnJheSwgeW91IGNhbiB1c2VcbiAgICAgKiB0aGUgdG9vbGJhcidzIFtpdGVtc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db250YWluZXIjY29uZmlnLWl0ZW1zKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy1zdHJpcHMpXG4gICAgICovXG4gICAgc3RyaXBzID8gOiBSZWNvcmQ8c3RyaW5nLCBDYWxlbmRhckNvbnRhaW5lckl0ZW1Db25maWc+XG4gICAgLyoqXG4gICAgICogVGhlIGNvbnZlcnNlIG9mIFtzeW5jVmlld0RhdGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L21peGluL0NhbGVuZGFyTWl4aW4jcHJvcGVydHktc3luY1ZpZXdEYXRlKVxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLXN5bmNDYWxlbmRhckRhdGUpXG4gICAgICovXG4gICAgc3luY0NhbGVuZGFyRGF0ZSA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFRoZSBjb252ZXJzZSBvZiBbc3luY0NhbGVuZGFyRGF0ZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvbWl4aW4vQ2FsZW5kYXJNaXhpbiNwcm9wZXJ0eS1zeW5jQ2FsZW5kYXJEYXRlKVxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLXN5bmNWaWV3RGF0ZSlcbiAgICAgKi9cbiAgICBzeW5jVmlld0RhdGUgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBBIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBbdGFiXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1RhYikgY3JlYXRlZCBmb3IgdGhpcyB3aWRnZXQgd2hlbiBpdCBpcyBwbGFjZWQgaW4gYVxuICAgICAqIFtUYWJQYW5lbF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9UYWJQYW5lbCkuIEZvciBleGFtcGxlLCB0aGlzIGNvbmZpZyBjYW4gYmUgdXNlZCB0byBjb250cm9sIHRoZSBpY29uIG9mIHRoZSBgdGFiYCBmb3JcbiAgICAgKiB0aGlzIHdpZGdldDpcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy10YWIpXG4gICAgICovXG4gICAgdGFiID8gOiBib29sZWFufFRhYkNvbmZpZ1xuICAgIC8qKlxuICAgICAqIFdoZW4gdGhpcyBjb250YWluZXIgaXMgdXNlZCBhcyBhIHRhYiBpbiBhIFRhYlBhbmVsLCB0aGVzZSBpdGVtcyBhcmUgYWRkZWQgdG8gdGhlXG4gICAgICogW1RhYkJhcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9UYWJCYXIpIHdoZW4gdGhpcyBjb250YWluZXIgaXMgdGhlIGFjdGl2ZSB0YWIuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctdGFiQmFySXRlbXMpXG4gICAgICovXG4gICAgdGFiQmFySXRlbXMgPyA6IFRvb2xiYXJJdGVtc1tdfFdpZGdldFtdXG4gICAgLyoqXG4gICAgICogVGhlIHRhZyBuYW1lIG9mIHRoaXMgV2lkZ2V0J3Mgcm9vdCBlbGVtZW50XG4gICAgICovXG4gICAgdGFnID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBIENvbmZpZyBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjb25maWd1cmF0aW9uIG9mIGEgW1Rvb2xiYXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvVG9vbGJhciksXG4gICAgICogb3IgYXJyYXkgb2YgY29uZmlnIG9iamVjdHMgcmVwcmVzZW50aW5nIHRoZSBjaGlsZCBpdGVtcyBvZiBhIFRvb2xiYXIuXG4gICAgICogVGhpcyBjcmVhdGVzIGEgdG9vbGJhciBkb2NrZWQgdG8gdGhlIHRvcCBvZiB0aGUgcGFuZWwgaW1tZWRpYXRlbHkgYmVsb3cgdGhlIGhlYWRlci5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy10YmFyKVxuICAgICAqL1xuICAgIHRiYXIgPyA6IChDYWxlbmRhckNvbnRhaW5lckl0ZW1Db25maWd8c3RyaW5nKVtdfFRvb2xiYXJDb25maWd8UGFnaW5nVG9vbGJhckNvbmZpZ3xudWxsXG4gICAgLyoqXG4gICAgICogVGV4dCBhbGlnbm1lbnQ6ICdsZWZ0JywgJ2NlbnRlcicgb3IgJ3JpZ2h0Jy4gQWxzbyBhY2NlcHRzIGRpcmVjdGlvbiBuZXV0cmFsICdzdGFydCcgYW5kICdlbmQnLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLXRleHRBbGlnbilcbiAgICAgKi9cbiAgICB0ZXh0QWxpZ24gPyA6ICdsZWZ0J3wnY2VudGVyJ3wncmlnaHQnfCdzdGFydCd8J2VuZCdcbiAgICAvKipcbiAgICAgKiBBIFtEYXRlSGVscGVyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvaGVscGVyL0RhdGVIZWxwZXIpIGZvcm1hdCBzdHJpbmcvZnVuY3Rpb24gdXNlZCB0byBmb3JtYXQgdGhlIHRpbWUgZGlzcGxheWVkIGluIGV2ZW50c1xuICAgICAqIEBwYXJhbSB7RGF0ZX0gZGF0ZSBUaGUgZGF0ZSB0byBmb3JtYXQuXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGZvcm1hdHRlZCBkYXRlLlxuICAgICAqL1xuICAgIHRpbWVGb3JtYXQgPyA6IHN0cmluZ3woKGRhdGU6IERhdGUpID0+IHN0cmluZylcbiAgICAvKipcbiAgICAgKiBBIGNvbmZpZyBvYmplY3QgdG8gY3JlYXRlIGEgdG9vbHRpcCB3aGljaCB3aWxsIHNob3cgb24gaG92ZXIgb2YgYSBkYXRlIGNlbGwgaW5jbHVkaW5nIGRpc2FibGVkLCB3ZWVrZW5kLFxuICAgICAqIGFuZCBcIm90aGVyIG1vbnRoXCIgY2VsbHMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctdGlwKVxuICAgICAqL1xuICAgIHRpcCA/IDogVG9vbHRpcENvbmZpZ1xuICAgIC8qKlxuICAgICAqIEEgdGl0bGUgdG8gZGlzcGxheSBpbiB0aGUgaGVhZGVyIG9yIG93bmluZyBUYWJQYW5lbC4gQ2F1c2VzIGNyZWF0aW9uIGFuZCBkb2NraW5nIG9mIGEgaGVhZGVyXG4gICAgICogdG8gdGhlIHRvcCBpZiBubyBoZWFkZXIgaXMgY29uZmlndXJlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy10aXRsZSlcbiAgICAgKi9cbiAgICB0aXRsZSA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogVGhlIGNsYXNzIG5hbWUgdG8gYWRkIHRvIHRoZSBjYWxlbmRhciBjZWxsIHdoaWNoIGNvbnRhaW5zIHRvZGF5J3MgZGF0ZS5cbiAgICAgKi9cbiAgICB0b2RheUNscyA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogVGhlIFt0b29sc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9Ub29sKSB0byBhZGQgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGUgYHRpdGxlYCBpbiB0aGUgUGFuZWwgaGVhZGVyLiBFYWNoXG4gICAgICogcHJvcGVydHkgbmFtZSBpcyB0aGUgcmVmZXJlbmNlIGJ5IHdoaWNoIGFuIGluc3RhbnRpYXRlZCB0b29sIG1heSBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgbGl2ZVxuICAgICAqIGBbdG9vbHNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvbWl4aW4vVG9vbGFibGUjcHJvcGVydHktdG9vbHMpYCBwcm9wZXJ0eS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy10b29scylcbiAgICAgKi9cbiAgICB0b29scyA/IDogUmVjb3JkPHN0cmluZywgVG9vbENvbmZpZz58bnVsbFxuICAgIC8qKlxuICAgICAqIFRvb2x0aXAgZm9yIHRoZSB3aWRnZXQsIGVpdGhlciBhcyBhIHN0cmluZyBvciBhcyBhIFRvb2x0aXAgY29uZmlnIG9iamVjdC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2NvbmZpZy10b29sdGlwKVxuICAgICAqL1xuICAgIHRvb2x0aXAgPyA6IHN0cmluZ3xUb29sdGlwQ29uZmlnfG51bGxcbiAgICAvKipcbiAgICAgKiBCeSBkZWZhdWx0LCB0YWJiaW5nIHdpdGhpbiBhIFBhbmVsIGlzIG5vdCBjb250YWluZWQsIGllIHlvdSBjYW4gVEFCIG91dCBvZiB0aGUgUGFuZWxcbiAgICAgKiBmb3J3YXJkcyBvciBiYWNrd2FyZHMuXG4gICAgICogQ29uZmlndXJlIHRoaXMgYXMgYHRydWVgIHRvIGRpc2FsbG93IHRhYmJpbmcgb3V0IG9mIHRoZSBQYW5lbCwgYW5kIG1ha2UgdGFiYmluZyBjaXJjdWxhciB3aXRoaW4gdGhpcyBQYW5lbC5cbiAgICAgKi9cbiAgICB0cmFwRm9jdXMgPyA6IGJvb2xlYW5cbiAgICB0eXBlID8gOiAnbW9udGh2aWV3J3wnbW9udGgnXG4gICAgLyoqXG4gICAgICogQ3VzdG9tIENTUyBjbGFzcyBuYW1lIHN1ZmZpeGVzIHRvIGFwcGx5IHRvIHRoZSBlbGVtZW50cyByZW5kZXJlZCBieSB0aGlzIHdpZGdldC4gVGhpcyBtYXkgYmUgc3BlY2lmaWVkXG4gICAgICogYXMgYSBzcGFjZSBzZXBhcmF0ZWQgc3RyaW5nLCBhbiBhcnJheSBvZiBzdHJpbmdzLCBvciBhcyBhbiBvYmplY3QgaW4gd2hpY2ggcHJvcGVydHkgbmFtZXMgd2l0aCB0cnV0aHlcbiAgICAgKiB2YWx1ZXMgYXJlIHVzZWQgYXMgdGhlIGNsYXNzIG5hbWVzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLXVpKVxuICAgICAqL1xuICAgIHVpID8gOiAncGxhaW4nfCd0b29sYmFyJ3xzdHJpbmd8b2JqZWN0XG4gICAgLyoqXG4gICAgICogVGhlIGhlYWRlciB0ZXh0IGZvciB0aGUgd2VlayBudW1iZXIgY29sdW1uLCBpZiBzaG93bi5cbiAgICAgKi9cbiAgICB3ZWVrQ29sdW1uSGVhZGVyID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBUaGUgY2xhc3MgbmFtZSB0byBhZGQgdG8gY2FsZW5kYXIgY2VsbHMgd2hpY2ggYXJlIHdlZWtlbmQgZGF0ZXMuXG4gICAgICovXG4gICAgd2Vla2VuZENscyA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogQSBmdW5jdGlvbiAob3IgdGhlIG5hbWUgb2YgYSBmdW5jdGlvbikgd2hpY2ggY3JlYXRlcyBjb250ZW50IGluLCBhbmQgbWF5IG11dGF0ZSB0aGUgd2VlayBjZWxsIGVsZW1lbnQgYXQgdGhlIHN0YXJ0IG9mIGEgd2VlayByb3cuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctd2Vla1JlbmRlcmVyKVxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHdlZWtDZWxsIFRoZSBoZWFkZXIgZWxlbWVudFxuICAgICAqIEBwYXJhbSB7bnVtYmVyW119IHdlZWsgQW4gYXJyYXkgY29udGFpbmluZyBgW3llYXIsIHdlZWtOdW1iZXJdYFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmcsRG9tQ29uZmlnLHZvaWR9XG4gICAgICovXG4gICAgd2Vla1JlbmRlcmVyID8gOiAoKHdlZWtDZWxsOiBIVE1MRWxlbWVudCwgd2VlazogbnVtYmVyW10pID0+IHN0cmluZ3xEb21Db25maWd8dm9pZCl8c3RyaW5nXG4gICAgLyoqXG4gICAgICogVGhlIHdlZWsgc3RhcnQgZGF5LCAwIG1lYW5pbmcgU3VuZGF5LCA2IG1lYW5pbmcgU2F0dXJkYXkuXG4gICAgICogRGVmYXVsdHMgdG8gW3dlZWtTdGFydERheV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL2hlbHBlci9EYXRlSGVscGVyI3Byb3BlcnR5LXdlZWtTdGFydERheS1zdGF0aWMpLlxuICAgICAqL1xuICAgIHdlZWtTdGFydERheSA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogQSB3aWRnZXRzIHdlaWdodCBkZXRlcm1pbmVzIGl0cyBwb3NpdGlvbiBhbW9uZyBzaWJsaW5ncyB3aGVuIGFkZGVkIHRvIGEgW0NvbnRhaW5lcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db250YWluZXIpLlxuICAgICAqIEhpZ2hlciB3ZWlnaHRzIGdvIGZ1cnRoZXIgZG93bi5cbiAgICAgKi9cbiAgICB3ZWlnaHQgPyA6IG51bWJlclxuICAgIC8qKlxuICAgICAqIFdpZGdldCdzIHdpZHRoLCB1c2VkIHRvIHNldCBlbGVtZW50IGBzdHlsZS53aWR0aGAuIEVpdGhlciBzcGVjaWZ5IGEgdmFsaWQgd2lkdGggc3RyaW5nIG9yIGEgbnVtYmVyLCB3aGljaFxuICAgICAqIHdpbGwgZ2V0ICdweCcgYXBwZW5kZWQuIFdlIHJlY29tbWVuZCB1c2luZyBDU1MgYXMgdGhlIHByaW1hcnkgd2F5IHRvIGNvbnRyb2wgd2lkdGgsIGJ1dCBpbiBzb21lIGNhc2VzXG4gICAgICogdGhpcyBjb25maWcgaXMgY29udmVuaWVudC5cbiAgICAgKi9cbiAgICB3aWR0aCA/IDogc3RyaW5nfG51bWJlclxuICAgIC8qKlxuICAgICAqIFRoZSB4IHBvc2l0aW9uIGZvciB0aGUgd2lkZ2V0LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjY29uZmlnLXgpXG4gICAgICovXG4gICAgeCA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogVGhlIHkgcG9zaXRpb24gZm9yIHRoZSB3aWRnZXQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWcteSlcbiAgICAgKi9cbiAgICB5ID8gOiBudW1iZXJcblxufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvciA6ICdicnludHVtLW1vbnRoLXZpZXcnLFxuICAgIHRlbXBsYXRlIDogJydcbn0pXG5leHBvcnQgY2xhc3MgQnJ5bnR1bU1vbnRoVmlld0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICAgIHB1YmxpYyBzdGF0aWMgaW5zdGFuY2VDbGFzcyA9IE1vbnRoVmlldztcblxuICAgIHB1YmxpYyBzdGF0aWMgaW5zdGFuY2VOYW1lID0gJ01vbnRoVmlldyc7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBicnludHVtRXZlbnRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgJ29uQmVmb3JlQXV0b0NyZWF0ZScsXG4gICAgICAgICdvbkJlZm9yZUNoYW5nZURhdGUnLFxuICAgICAgICAnb25CZWZvcmVEZXN0cm95JyxcbiAgICAgICAgJ29uQmVmb3JlSGlkZScsXG4gICAgICAgICdvbkJlZm9yZVJlZnJlc2gnLFxuICAgICAgICAnb25CZWZvcmVSZXNwb25zaXZlU3RhdGVDaGFuZ2UnLFxuICAgICAgICAnb25CZWZvcmVTZXRSZWNvcmQnLFxuICAgICAgICAnb25CZWZvcmVTaG93JyxcbiAgICAgICAgJ29uQmVmb3JlU2hvd092ZXJmbG93UG9wdXAnLFxuICAgICAgICAnb25CZWZvcmVTdGF0ZUFwcGx5JyxcbiAgICAgICAgJ29uQmVmb3JlU3RhdGVTYXZlJyxcbiAgICAgICAgJ29uQ2F0Y2hBbGwnLFxuICAgICAgICAnb25DZWxsQ2xpY2snLFxuICAgICAgICAnb25DZWxsTWFwUG9wdWxhdGVkJyxcbiAgICAgICAgJ29uQ29sbGFwc2UnLFxuICAgICAgICAnb25EYXRlQ2hhbmdlJyxcbiAgICAgICAgJ29uRGF5Q2VsbFBvcHVsYXRlZCcsXG4gICAgICAgICdvbkRlc3Ryb3knLFxuICAgICAgICAnb25EaXJ0eVN0YXRlQ2hhbmdlJyxcbiAgICAgICAgJ29uRWxlbWVudENyZWF0ZWQnLFxuICAgICAgICAnb25FbXB0eUNlbGxDbGljaycsXG4gICAgICAgICdvbkV2ZW50QXV0b0NyZWF0ZWQnLFxuICAgICAgICAnb25FdmVudEhlaWdodENoYW5nZScsXG4gICAgICAgICdvbkV2ZW50UHJvcGFnYXRlJyxcbiAgICAgICAgJ29uRXhwYW5kJyxcbiAgICAgICAgJ29uRm9jdXNJbicsXG4gICAgICAgICdvbkZvY3VzT3V0JyxcbiAgICAgICAgJ29uSGlkZScsXG4gICAgICAgICdvblBhaW50JyxcbiAgICAgICAgJ29uUmVhZE9ubHknLFxuICAgICAgICAnb25SZWNvbXBvc2UnLFxuICAgICAgICAnb25SZWZyZXNoJyxcbiAgICAgICAgJ29uUmVzaXplJyxcbiAgICAgICAgJ29uUmVzcG9uc2l2ZVN0YXRlQ2hhbmdlJyxcbiAgICAgICAgJ29uU2hvdycsXG4gICAgICAgICdvblNob3dPdmVyZmxvd1BvcHVwJyxcbiAgICAgICAgJ29uVG9vbENsaWNrJyxcbiAgICAgICAgJ29uV2Vla0NlbGxDbGljaycsXG4gICAgICAgICdvbldlZWtGbGV4JyxcbiAgICAgICAgJ29uV2Vla1Nocmlua3dyYXAnXG4gICAgXTtcblxuICAgIHByaXZhdGUgc3RhdGljIGJyeW50dW1GZWF0dXJlTmFtZXM6IHN0cmluZ1tdID0gW1xuXG4gICAgXTtcblxuICAgIHByaXZhdGUgc3RhdGljIGJyeW50dW1Db25maWdzOiBzdHJpbmdbXSA9IEJyeW50dW1Nb250aFZpZXdDb21wb25lbnQuYnJ5bnR1bUZlYXR1cmVOYW1lcy5jb25jYXQoW1xuICAgICAgICAnYWN0aXZhdGlvbktleScsXG4gICAgICAgICdhZG9wdCcsXG4gICAgICAgICdhbGlnbicsXG4gICAgICAgICdhbGlnblNlbGYnLFxuICAgICAgICAnYWxsb3dEcmFnQ3JlYXRlJyxcbiAgICAgICAgJ2FsbG93RHJhZ01vdmUnLFxuICAgICAgICAnYWxsb3dEcmFnUmVzaXplJyxcbiAgICAgICAgJ2FuY2hvcicsXG4gICAgICAgICdhbmltYXRlVGltZVNoaWZ0JyxcbiAgICAgICAgJ2FwcGVuZFRvJyxcbiAgICAgICAgJ2FyaWFEZXNjcmlwdGlvbicsXG4gICAgICAgICdhcmlhTGFiZWwnLFxuICAgICAgICAnYXV0b0NyZWF0ZScsXG4gICAgICAgICdhdXRvUm93SGVpZ2h0JyxcbiAgICAgICAgJ2JiYXInLFxuICAgICAgICAnYm9keUNscycsXG4gICAgICAgICdidWJibGVFdmVudHMnLFxuICAgICAgICAnY2FsbE9uRnVuY3Rpb25zJyxcbiAgICAgICAgJ2NhdGNoRXZlbnRIYW5kbGVyRXhjZXB0aW9ucycsXG4gICAgICAgICdjZWxsUmVuZGVyZXInLFxuICAgICAgICAnY2VudGVyZWQnLFxuICAgICAgICAnY2xzJyxcbiAgICAgICAgJ2NvbGxhcHNlZCcsXG4gICAgICAgICdjb2xsYXBzaWJsZScsXG4gICAgICAgICdjb2xvcicsXG4gICAgICAgICdjb2x1bW4nLFxuICAgICAgICAnY29uZmlnJyxcbiAgICAgICAgJ2NvbnN0cmFpblRvJyxcbiAgICAgICAgJ2NvbnRlbnRFbGVtZW50Q2xzJyxcbiAgICAgICAgJ2RhdGFGaWVsZCcsXG4gICAgICAgICdkYXRhc2V0JyxcbiAgICAgICAgJ2RhdGUnLFxuICAgICAgICAnZGF0ZUZvcm1hdCcsXG4gICAgICAgICdkYXRlU2VwYXJhdG9yJyxcbiAgICAgICAgJ2RheUNlbGxOYW1lRm9ybWF0JyxcbiAgICAgICAgJ2RheUNlbGxSZW5kZXJlcicsXG4gICAgICAgICdkYXlOYW1lRm9ybWF0JyxcbiAgICAgICAgJ2RlZmF1bHRCaW5kUHJvcGVydHknLFxuICAgICAgICAnZGVmYXVsdEZvY3VzJyxcbiAgICAgICAgJ2RlZmF1bHRzJyxcbiAgICAgICAgJ2RlZmF1bHRTY3JvbGxPcHRpb25zJyxcbiAgICAgICAgJ2Rlc2NyaXB0aW9uRm9ybWF0JyxcbiAgICAgICAgJ2Rlc2NyaXB0aW9uUmVuZGVyZXInLFxuICAgICAgICAnZGV0ZWN0Q1NTQ29tcGF0aWJpbGl0eUlzc3VlcycsXG4gICAgICAgICdkaXNhYmxlZCcsXG4gICAgICAgICdkaXNhYmxlZENscycsXG4gICAgICAgICdkaXNhYmxlZERhdGVzJyxcbiAgICAgICAgJ2Rpc2FibGVOb25Xb3JraW5nRGF5cycsXG4gICAgICAgICdkaXNhYmxlT3RoZXJNb250aENlbGxzJyxcbiAgICAgICAgJ2Rpc2FibGVXZWVrZW5kcycsXG4gICAgICAgICdkb2NrJyxcbiAgICAgICAgJ2RyYWdnYWJsZScsXG4gICAgICAgICdkcmFnVW5pdCcsXG4gICAgICAgICdkcmF3ZXInLFxuICAgICAgICAnZWxlbWVudEF0dHJpYnV0ZXMnLFxuICAgICAgICAnZW1wdHlDZWxsUmVuZGVyZXInLFxuICAgICAgICAnZXZlbnRGaWx0ZXInLFxuICAgICAgICAnZXZlbnRIZWFkZXJSZW5kZXJlcicsXG4gICAgICAgICdldmVudEhlaWdodCcsXG4gICAgICAgICdldmVudFJlbmRlcmVyJyxcbiAgICAgICAgJ2V2ZW50U29ydGVyJyxcbiAgICAgICAgJ2V2ZW50U3BhY2luZycsXG4gICAgICAgICdleHRlbmRBbGxEYXlFbmREYXknLFxuICAgICAgICAnZXh0cmFEYXRhJyxcbiAgICAgICAgJ2ZpbHRlckV2ZW50UmVzb3VyY2VzJyxcbiAgICAgICAgJ2ZsZXgnLFxuICAgICAgICAnZmxvYXRpbmcnLFxuICAgICAgICAnZm9vdGVyJyxcbiAgICAgICAgJ2dldFByaW1hcnlSZXNvdXJjZScsXG4gICAgICAgICdoZWFkZXInLFxuICAgICAgICAnaGVhZGVyUmVuZGVyZXInLFxuICAgICAgICAnaGVpZ2h0JyxcbiAgICAgICAgJ2hpZGRlbicsXG4gICAgICAgICdoaWRlQW5pbWF0aW9uJyxcbiAgICAgICAgJ2hpZGVOb25Xb3JraW5nRGF5cycsXG4gICAgICAgICdoaWRlT3RoZXJNb250aENlbGxzJyxcbiAgICAgICAgJ2hpZGVXaGVuRW1wdHknLFxuICAgICAgICAnaWNvbicsXG4gICAgICAgICdpZCcsXG4gICAgICAgICdpZ25vcmVQYXJlbnRSZWFkT25seScsXG4gICAgICAgICdpbnB1dEZpZWxkQWxpZ24nLFxuICAgICAgICAnaW5zZXJ0QmVmb3JlJyxcbiAgICAgICAgJ2luc2VydEZpcnN0JyxcbiAgICAgICAgJ2l0ZW1DbHMnLFxuICAgICAgICAnaXRlbXMnLFxuICAgICAgICAna2V5TWFwJyxcbiAgICAgICAgJ2xhYmVsUG9zaXRpb24nLFxuICAgICAgICAnbGF5b3V0JyxcbiAgICAgICAgJ2xheW91dFN0eWxlJyxcbiAgICAgICAgJ2xhenlJdGVtcycsXG4gICAgICAgICdsaXN0ZW5lcnMnLFxuICAgICAgICAnbG9jYWxlQ2xhc3MnLFxuICAgICAgICAnbG9jYWxpemFibGUnLFxuICAgICAgICAnbG9jYWxpemFibGVQcm9wZXJ0aWVzJyxcbiAgICAgICAgJ21hcmdpbicsXG4gICAgICAgICdtYXNrRGVmYXVsdHMnLFxuICAgICAgICAnbWFza2VkJyxcbiAgICAgICAgJ21heERhdGUnLFxuICAgICAgICAnbWF4RXZlbnRzUGVyQ2VsbCcsXG4gICAgICAgICdtYXhIZWlnaHQnLFxuICAgICAgICAnbWF4aW1pemVPbk1vYmlsZScsXG4gICAgICAgICdtYXhXaWR0aCcsXG4gICAgICAgICdtaW5Db2x1bW5XaWR0aCcsXG4gICAgICAgICdtaW5EYXRlJyxcbiAgICAgICAgJ21pbkhlaWdodCcsXG4gICAgICAgICdtaW5Sb3dIZWlnaHQnLFxuICAgICAgICAnbWluV2lkdGgnLFxuICAgICAgICAnbW9uaXRvclJlc2l6ZScsXG4gICAgICAgICdtb250aCcsXG4gICAgICAgICduYW1lZEl0ZW1zJyxcbiAgICAgICAgJ25vbldvcmtpbmdEYXlDbHMnLFxuICAgICAgICAnbm9uV29ya2luZ0RheXMnLFxuICAgICAgICAnb3RoZXJNb250aENscycsXG4gICAgICAgICdvdmVyZmxvd0J1dHRvblJlbmRlcmVyJyxcbiAgICAgICAgJ292ZXJmbG93Q2xpY2tBY3Rpb24nLFxuICAgICAgICAnb3ZlcmZsb3dQb3B1cCcsXG4gICAgICAgICdvdmVyZmxvd1BvcHVwVHJpZ2dlcicsXG4gICAgICAgICdvd25lcicsXG4gICAgICAgICdwYXN0RXZlbnRDbHMnLFxuICAgICAgICAncGVyc2lzdFNocmlua1dyYXBwZWRSb3dzJyxcbiAgICAgICAgJ3Bvc2l0aW9uZWQnLFxuICAgICAgICAncHJldmVudFRvb2x0aXBPblRvdWNoJyxcbiAgICAgICAgJ3JlYWRPbmx5JyxcbiAgICAgICAgJ3JlbGF5U3RvcmVFdmVudHMnLFxuICAgICAgICAncmVuZGl0aW9uJyxcbiAgICAgICAgJ3Jlc291cmNlSW1hZ2VQYXRoJyxcbiAgICAgICAgJ3Jlc3BvbnNpdmUnLFxuICAgICAgICAncmVzcG9uc2l2ZUV2ZW50SGVpZ2h0JyxcbiAgICAgICAgJ3Jlc3BvbnNpdmVSb290JyxcbiAgICAgICAgJ3Jlc3BvbnNpdmVTdGF0ZScsXG4gICAgICAgICdyZXNwb25zaXZlVGFyZ2V0JyxcbiAgICAgICAgJ3JpcHBsZScsXG4gICAgICAgICdyb290RWxlbWVudCcsXG4gICAgICAgICdydGwnLFxuICAgICAgICAnc2Nyb2xsYWJsZScsXG4gICAgICAgICdzY3JvbGxBY3Rpb24nLFxuICAgICAgICAnc2VsZWN0b3JCdXR0b24nLFxuICAgICAgICAnc2VsZWN0b3JNZW51SXRlbScsXG4gICAgICAgICdzaGFkZVBhc3REYXRlcycsXG4gICAgICAgICdzaG9ydERhdGVGb3JtYXQnLFxuICAgICAgICAnc2hvcnREYXRlVGltZUZvcm1hdCcsXG4gICAgICAgICdzaG9ydEV2ZW50Q2xzJyxcbiAgICAgICAgJ3Nob3J0RXZlbnREdXJhdGlvbicsXG4gICAgICAgICdzaG93QW5pbWF0aW9uJyxcbiAgICAgICAgJ3Nob3dCdWxsZXQnLFxuICAgICAgICAnc2hvd1Jlc291cmNlQXZhdGFycycsXG4gICAgICAgICdzaG93VG9vbHRpcFdoZW5EaXNhYmxlZCcsXG4gICAgICAgICdzaG93V2Vla0NvbHVtbicsXG4gICAgICAgICdzaG93V2Vla051bWJlcicsXG4gICAgICAgICdzaXhXZWVrcycsXG4gICAgICAgICdzcGFuJyxcbiAgICAgICAgJ3N0YWNrTXVsdGlEYXlFdmVudHMnLFxuICAgICAgICAnc3RhdGVmdWwnLFxuICAgICAgICAnc3RhdGVmdWxFdmVudHMnLFxuICAgICAgICAnc3RhdGVJZCcsXG4gICAgICAgICdzdGF0ZVByb3ZpZGVyJyxcbiAgICAgICAgJ3N0cmljdFJlY29yZE1hcHBpbmcnLFxuICAgICAgICAnc3RyaXBzJyxcbiAgICAgICAgJ3N5bmNDYWxlbmRhckRhdGUnLFxuICAgICAgICAnc3luY1ZpZXdEYXRlJyxcbiAgICAgICAgJ3RhYicsXG4gICAgICAgICd0YWJCYXJJdGVtcycsXG4gICAgICAgICd0YWcnLFxuICAgICAgICAndGJhcicsXG4gICAgICAgICd0ZXh0QWxpZ24nLFxuICAgICAgICAndGltZUZvcm1hdCcsXG4gICAgICAgICd0aXAnLFxuICAgICAgICAndGl0bGUnLFxuICAgICAgICAndG9kYXlDbHMnLFxuICAgICAgICAndG9vbHMnLFxuICAgICAgICAndG9vbHRpcCcsXG4gICAgICAgICd0cmFwRm9jdXMnLFxuICAgICAgICAndHlwZScsXG4gICAgICAgICd1aScsXG4gICAgICAgICd3ZWVrQ29sdW1uSGVhZGVyJyxcbiAgICAgICAgJ3dlZWtlbmRDbHMnLFxuICAgICAgICAnd2Vla1JlbmRlcmVyJyxcbiAgICAgICAgJ3dlZWtTdGFydERheScsXG4gICAgICAgICd3ZWlnaHQnLFxuICAgICAgICAnd2lkdGgnLFxuICAgICAgICAneCcsXG4gICAgICAgICd5J1xuICAgIF0pO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnJ5bnR1bUNvbmZpZ3NPbmx5OiBzdHJpbmdbXSA9IFtcbiAgICAgICAgJ2FjdGl2YXRpb25LZXknLFxuICAgICAgICAnYWRvcHQnLFxuICAgICAgICAnYWxpZ24nLFxuICAgICAgICAnYW5jaG9yJyxcbiAgICAgICAgJ2FyaWFEZXNjcmlwdGlvbicsXG4gICAgICAgICdhcmlhTGFiZWwnLFxuICAgICAgICAnYmJhcicsXG4gICAgICAgICdib2R5Q2xzJyxcbiAgICAgICAgJ2J1YmJsZUV2ZW50cycsXG4gICAgICAgICdjZWxsUmVuZGVyZXInLFxuICAgICAgICAnY2VudGVyZWQnLFxuICAgICAgICAnY29sbGFwc2libGUnLFxuICAgICAgICAnY29sb3InLFxuICAgICAgICAnY29uZmlnJyxcbiAgICAgICAgJ2NvbnN0cmFpblRvJyxcbiAgICAgICAgJ2NvbnRlbnRFbGVtZW50Q2xzJyxcbiAgICAgICAgJ2RhdGFGaWVsZCcsXG4gICAgICAgICdkYXlDZWxsTmFtZUZvcm1hdCcsXG4gICAgICAgICdkYXlDZWxsUmVuZGVyZXInLFxuICAgICAgICAnZGF5TmFtZUZvcm1hdCcsXG4gICAgICAgICdkZWZhdWx0QmluZFByb3BlcnR5JyxcbiAgICAgICAgJ2RlZmF1bHRGb2N1cycsXG4gICAgICAgICdkZWZhdWx0cycsXG4gICAgICAgICdkZXNjcmlwdGlvblJlbmRlcmVyJyxcbiAgICAgICAgJ2RldGVjdENTU0NvbXBhdGliaWxpdHlJc3N1ZXMnLFxuICAgICAgICAnZGlzYWJsZWRDbHMnLFxuICAgICAgICAnZGlzYWJsZWREYXRlcycsXG4gICAgICAgICdkaXNhYmxlTm9uV29ya2luZ0RheXMnLFxuICAgICAgICAnZGlzYWJsZU90aGVyTW9udGhDZWxscycsXG4gICAgICAgICdkaXNhYmxlV2Vla2VuZHMnLFxuICAgICAgICAnZG9jaycsXG4gICAgICAgICdkcmFnZ2FibGUnLFxuICAgICAgICAnZHJhd2VyJyxcbiAgICAgICAgJ2VsZW1lbnRBdHRyaWJ1dGVzJyxcbiAgICAgICAgJ2VtcHR5Q2VsbFJlbmRlcmVyJyxcbiAgICAgICAgJ2V2ZW50RmlsdGVyJyxcbiAgICAgICAgJ2V2ZW50SGVhZGVyUmVuZGVyZXInLFxuICAgICAgICAnZXZlbnRSZW5kZXJlcicsXG4gICAgICAgICdldmVudFNvcnRlcicsXG4gICAgICAgICdmbG9hdGluZycsXG4gICAgICAgICdmb290ZXInLFxuICAgICAgICAnZ2V0UHJpbWFyeVJlc291cmNlJyxcbiAgICAgICAgJ2hlYWRlcicsXG4gICAgICAgICdoZWFkZXJSZW5kZXJlcicsXG4gICAgICAgICdoaWRlQW5pbWF0aW9uJyxcbiAgICAgICAgJ2hpZGVPdGhlck1vbnRoQ2VsbHMnLFxuICAgICAgICAnaGlkZVdoZW5FbXB0eScsXG4gICAgICAgICdpY29uJyxcbiAgICAgICAgJ2lnbm9yZVBhcmVudFJlYWRPbmx5JyxcbiAgICAgICAgJ2l0ZW1DbHMnLFxuICAgICAgICAnbGF6eUl0ZW1zJyxcbiAgICAgICAgJ2xpc3RlbmVycycsXG4gICAgICAgICdsb2NhbGVDbGFzcycsXG4gICAgICAgICdsb2NhbGl6YWJsZScsXG4gICAgICAgICdsb2NhbGl6YWJsZVByb3BlcnRpZXMnLFxuICAgICAgICAnbWFza0RlZmF1bHRzJyxcbiAgICAgICAgJ21hc2tlZCcsXG4gICAgICAgICdtYXhFdmVudHNQZXJDZWxsJyxcbiAgICAgICAgJ21pbkNvbHVtbldpZHRoJyxcbiAgICAgICAgJ21pblJvd0hlaWdodCcsXG4gICAgICAgICdtb25pdG9yUmVzaXplJyxcbiAgICAgICAgJ21vbnRoJyxcbiAgICAgICAgJ25hbWVkSXRlbXMnLFxuICAgICAgICAnbm9uV29ya2luZ0RheUNscycsXG4gICAgICAgICdvdGhlck1vbnRoQ2xzJyxcbiAgICAgICAgJ292ZXJmbG93QnV0dG9uUmVuZGVyZXInLFxuICAgICAgICAnb3ZlcmZsb3dDbGlja0FjdGlvbicsXG4gICAgICAgICdvdmVyZmxvd1BvcHVwJyxcbiAgICAgICAgJ292ZXJmbG93UG9wdXBUcmlnZ2VyJyxcbiAgICAgICAgJ293bmVyJyxcbiAgICAgICAgJ3Bvc2l0aW9uZWQnLFxuICAgICAgICAncHJldmVudFRvb2x0aXBPblRvdWNoJyxcbiAgICAgICAgJ3JlbGF5U3RvcmVFdmVudHMnLFxuICAgICAgICAncmVzb3VyY2VJbWFnZVBhdGgnLFxuICAgICAgICAncmVzcG9uc2l2ZScsXG4gICAgICAgICdyZXNwb25zaXZlRXZlbnRIZWlnaHQnLFxuICAgICAgICAncmVzcG9uc2l2ZVJvb3QnLFxuICAgICAgICAncmVzcG9uc2l2ZVN0YXRlJyxcbiAgICAgICAgJ3Jlc3BvbnNpdmVUYXJnZXQnLFxuICAgICAgICAncmlwcGxlJyxcbiAgICAgICAgJ3Jvb3RFbGVtZW50JyxcbiAgICAgICAgJ3Njcm9sbEFjdGlvbicsXG4gICAgICAgICdzZWxlY3RvckJ1dHRvbicsXG4gICAgICAgICdzZWxlY3Rvck1lbnVJdGVtJyxcbiAgICAgICAgJ3Nob3J0RXZlbnRDbHMnLFxuICAgICAgICAnc2hvcnRFdmVudER1cmF0aW9uJyxcbiAgICAgICAgJ3Nob3dBbmltYXRpb24nLFxuICAgICAgICAnc2hvd0J1bGxldCcsXG4gICAgICAgICdzaG93UmVzb3VyY2VBdmF0YXJzJyxcbiAgICAgICAgJ3Nob3dUb29sdGlwV2hlbkRpc2FibGVkJyxcbiAgICAgICAgJ3Nob3dXZWVrQ29sdW1uJyxcbiAgICAgICAgJ3NpeFdlZWtzJyxcbiAgICAgICAgJ3N0YXRlZnVsJyxcbiAgICAgICAgJ3N0YXRlZnVsRXZlbnRzJyxcbiAgICAgICAgJ3N0YXRlSWQnLFxuICAgICAgICAnc3RhdGVQcm92aWRlcicsXG4gICAgICAgICdzdHJpcHMnLFxuICAgICAgICAndGFiJyxcbiAgICAgICAgJ3RhYkJhckl0ZW1zJyxcbiAgICAgICAgJ3RhZycsXG4gICAgICAgICd0YmFyJyxcbiAgICAgICAgJ3RleHRBbGlnbicsXG4gICAgICAgICd0aW1lRm9ybWF0JyxcbiAgICAgICAgJ3RpcCcsXG4gICAgICAgICd0b2RheUNscycsXG4gICAgICAgICd0cmFwRm9jdXMnLFxuICAgICAgICAndHlwZScsXG4gICAgICAgICd1aScsXG4gICAgICAgICd3ZWVrZW5kQ2xzJyxcbiAgICAgICAgJ3dlZWtSZW5kZXJlcicsXG4gICAgICAgICd3ZWVrU3RhcnREYXknLFxuICAgICAgICAnd2VpZ2h0J1xuICAgIF07XG5cbiAgICBwcml2YXRlIHN0YXRpYyBicnludHVtUHJvcHM6IHN0cmluZ1tdID0gQnJ5bnR1bU1vbnRoVmlld0NvbXBvbmVudC5icnludHVtRmVhdHVyZU5hbWVzLmNvbmNhdChbXG4gICAgICAgICdhbGlnblNlbGYnLFxuICAgICAgICAnYWxsb3dEcmFnQ3JlYXRlJyxcbiAgICAgICAgJ2FsbG93RHJhZ01vdmUnLFxuICAgICAgICAnYWxsb3dEcmFnUmVzaXplJyxcbiAgICAgICAgJ2FuY2hvclNpemUnLFxuICAgICAgICAnYW5pbWF0ZVRpbWVTaGlmdCcsXG4gICAgICAgICdhcHBlbmRUbycsXG4gICAgICAgICdhdXRvQ3JlYXRlJyxcbiAgICAgICAgJ2F1dG9Sb3dIZWlnaHQnLFxuICAgICAgICAnY2FsbE9uRnVuY3Rpb25zJyxcbiAgICAgICAgJ2NhdGNoRXZlbnRIYW5kbGVyRXhjZXB0aW9ucycsXG4gICAgICAgICdjbHMnLFxuICAgICAgICAnY29sbGFwc2VkJyxcbiAgICAgICAgJ2NvbHVtbicsXG4gICAgICAgICdkYXRhc2V0JyxcbiAgICAgICAgJ2RhdGUnLFxuICAgICAgICAnZGF0ZUZvcm1hdCcsXG4gICAgICAgICdkYXRlU2VwYXJhdG9yJyxcbiAgICAgICAgJ2RheUNlbGxDbHMnLFxuICAgICAgICAnZGVmYXVsdFNjcm9sbE9wdGlvbnMnLFxuICAgICAgICAnZGVzY3JpcHRpb25Gb3JtYXQnLFxuICAgICAgICAnZGlzYWJsZWQnLFxuICAgICAgICAnZHJhZ1VuaXQnLFxuICAgICAgICAnZXZlbnRIZWlnaHQnLFxuICAgICAgICAnZXZlbnRTcGFjaW5nJyxcbiAgICAgICAgJ2V4dGVuZEFsbERheUVuZERheScsXG4gICAgICAgICdleHRyYURhdGEnLFxuICAgICAgICAnZmlsdGVyRXZlbnRSZXNvdXJjZXMnLFxuICAgICAgICAnZmlyc3RWaXNpYmxlQ2VsbCcsXG4gICAgICAgICdmaXJzdFZpc2libGVEYXRlJyxcbiAgICAgICAgJ2ZsZXgnLFxuICAgICAgICAnZm9jdXNWaXNpYmxlJyxcbiAgICAgICAgJ2hhc0NoYW5nZXMnLFxuICAgICAgICAnaGVpZ2h0JyxcbiAgICAgICAgJ2hpZGRlbicsXG4gICAgICAgICdoaWRlTm9uV29ya2luZ0RheXMnLFxuICAgICAgICAnaWQnLFxuICAgICAgICAnaW5wdXRGaWVsZEFsaWduJyxcbiAgICAgICAgJ2luc2VydEJlZm9yZScsXG4gICAgICAgICdpbnNlcnRGaXJzdCcsXG4gICAgICAgICdpc1NldHRpbmdWYWx1ZXMnLFxuICAgICAgICAnaXNWYWxpZCcsXG4gICAgICAgICdpdGVtcycsXG4gICAgICAgICdrZXlNYXAnLFxuICAgICAgICAnbGFiZWxQb3NpdGlvbicsXG4gICAgICAgICdsYXN0VmlzaWJsZUNlbGwnLFxuICAgICAgICAnbGFzdFZpc2libGVEYXRlJyxcbiAgICAgICAgJ2xheW91dCcsXG4gICAgICAgICdsYXlvdXRTdHlsZScsXG4gICAgICAgICdtYXJnaW4nLFxuICAgICAgICAnbWF4RGF0ZScsXG4gICAgICAgICdtYXhIZWlnaHQnLFxuICAgICAgICAnbWF4aW1pemVPbk1vYmlsZScsXG4gICAgICAgICdtYXhXaWR0aCcsXG4gICAgICAgICdtaW5EYXRlJyxcbiAgICAgICAgJ21pbkhlaWdodCcsXG4gICAgICAgICdtaW5XaWR0aCcsXG4gICAgICAgICdub25Xb3JraW5nRGF5cycsXG4gICAgICAgICdwYXJlbnQnLFxuICAgICAgICAncGFzdEV2ZW50Q2xzJyxcbiAgICAgICAgJ3BlcnNpc3RTaHJpbmtXcmFwcGVkUm93cycsXG4gICAgICAgICdyZWFkT25seScsXG4gICAgICAgICdyZWNvcmQnLFxuICAgICAgICAncmVuZGl0aW9uJyxcbiAgICAgICAgJ3J0bCcsXG4gICAgICAgICdzY3JvbGxhYmxlJyxcbiAgICAgICAgJ3NoYWRlUGFzdERhdGVzJyxcbiAgICAgICAgJ3Nob3J0RGF0ZUZvcm1hdCcsXG4gICAgICAgICdzaG9ydERhdGVUaW1lRm9ybWF0JyxcbiAgICAgICAgJ3Nob3dXZWVrTnVtYmVyJyxcbiAgICAgICAgJ3NwYW4nLFxuICAgICAgICAnc3RhY2tNdWx0aURheUV2ZW50cycsXG4gICAgICAgICdzdGF0ZScsXG4gICAgICAgICdzdHJpY3RSZWNvcmRNYXBwaW5nJyxcbiAgICAgICAgJ3N5bmNDYWxlbmRhckRhdGUnLFxuICAgICAgICAnc3luY1ZpZXdEYXRlJyxcbiAgICAgICAgJ3RpdGxlJyxcbiAgICAgICAgJ3Rvb2xzJyxcbiAgICAgICAgJ3Rvb2x0aXAnLFxuICAgICAgICAndmFsdWVzJyxcbiAgICAgICAgJ3dlZWtDb2x1bW5IZWFkZXInLFxuICAgICAgICAnd2lkdGgnLFxuICAgICAgICAneCcsXG4gICAgICAgICd5J1xuICAgIF0pO1xuXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmO1xuICAgIHB1YmxpYyBpbnN0YW5jZSE6IE1vbnRoVmlldztcblxuICAgIHByaXZhdGUgYnJ5bnR1bUNvbmZpZyA9IHtcbiAgICAgICAgYWRvcHQgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgYXBwZW5kVG8gICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgaHJlZiAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgYW5ndWxhckNvbXBvbmVudCA6IHRoaXMsXG4gICAgICAgIGZlYXR1cmVzICAgICAgICAgOiB7fSxcbiAgICAgICAgbGlzdGVuZXJzICAgICAgICA6IHt9XG4gICAgfTtcblxuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQ6IEVsZW1lbnRSZWYpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50UmVmID0gZWxlbWVudDtcbiAgICB9XG5cbiAgICAvLyBDb25maWdzIG9ubHlcbiAgICBASW5wdXQoKSBhY3RpdmF0aW9uS2V5ICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgYWRvcHQgICAgICAgICAgICAgICAgICAgICAgICAhIDogSFRNTEVsZW1lbnR8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGFsaWduICAgICAgICAgICAgICAgICAgICAgICAgISA6IEFsaWduU3BlY3xzdHJpbmc7XG4gICAgQElucHV0KCkgYW5jaG9yICAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBhcmlhRGVzY3JpcHRpb24gICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgYXJpYUxhYmVsICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGJiYXIgICAgICAgICAgICAgICAgICAgICAgICAgISA6IChDYWxlbmRhckNvbnRhaW5lckl0ZW1Db25maWd8c3RyaW5nKVtdfFRvb2xiYXJDb25maWd8UGFnaW5nVG9vbGJhckNvbmZpZ3xudWxsO1xuICAgIEBJbnB1dCgpIGJvZHlDbHMgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xvYmplY3Q7XG4gICAgQElucHV0KCkgYnViYmxlRXZlbnRzICAgICAgICAgICAgICAgICAhIDogb2JqZWN0O1xuICAgIEBJbnB1dCgpIGNlbGxSZW5kZXJlciAgICAgICAgICAgICAgICAgISA6ICgocmVuZGVyRGF0YTogeyBjZWxsOiBIVE1MRWxlbWVudCwgZGF0ZTogRGF0ZSwgZGF5OiBudW1iZXIsIHJvd0luZGV4OiBudW1iZXJbXSwgcm93OiBIVE1MRWxlbWVudCwgc291cmNlOiBDYWxlbmRhclBhbmVsLCBjZWxsSW5kZXg6IG51bWJlcltdLCBjb2x1bW5JbmRleDogbnVtYmVyW10sIHZpc2libGVDb2x1bW5JbmRleDogbnVtYmVyW10gfSkgPT4gc3RyaW5nfERvbUNvbmZpZ3x2b2lkKXxzdHJpbmc7XG4gICAgQElucHV0KCkgY2VudGVyZWQgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBjb2xsYXBzaWJsZSAgICAgICAgICAgICAgICAgICEgOiBib29sZWFufFBhbmVsQ29sbGFwc2VyQ29uZmlnfFBhbmVsQ29sbGFwc2VyT3ZlcmxheUNvbmZpZztcbiAgICBASW5wdXQoKSBjb2xvciAgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgY29uZmlnICAgICAgICAgICAgICAgICAgICAgICAhIDogb2JqZWN0O1xuICAgIEBJbnB1dCgpIGNvbnN0cmFpblRvICAgICAgICAgICAgICAgICAgISA6IEhUTUxFbGVtZW50fFdpZGdldHxSZWN0YW5nbGU7XG4gICAgQElucHV0KCkgY29udGVudEVsZW1lbnRDbHMgICAgICAgICAgICAhIDogc3RyaW5nfG9iamVjdDtcbiAgICBASW5wdXQoKSBkYXRhRmllbGQgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgZGF5Q2VsbE5hbWVGb3JtYXQgICAgICAgICAgICAhIDogc3RyaW5nfCgoZGF0ZTogRGF0ZSkgPT4gc3RyaW5nKTtcbiAgICBASW5wdXQoKSBkYXlDZWxsUmVuZGVyZXIgICAgICAgICAgICAgICEgOiAoY2VsbERhdGE6IERheUNlbGwsIGRheUNlbGxEb21Db25maWc6IHsgY2xhc3NOYW1lOiBvYmplY3QsIHN0eWxlOiBvYmplY3QsIGRhdGFzZXQ6IG9iamVjdCwgY2hpbGRyZW46IERvbUNvbmZpZ1tdIH0pID0+IHN0cmluZ3xvYmplY3R8b2JqZWN0W107XG4gICAgQElucHV0KCkgZGF5TmFtZUZvcm1hdCAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGRlZmF1bHRCaW5kUHJvcGVydHkgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBkZWZhdWx0Rm9jdXMgICAgICAgICAgICAgICAgICEgOiAoKHdpZGdldDogV2lkZ2V0KSA9PiBib29sZWFuKXxzdHJpbmc7XG4gICAgQElucHV0KCkgZGVmYXVsdHMgICAgICAgICAgICAgICAgICAgICAhIDogQ2FsZW5kYXJDb250YWluZXJJdGVtQ29uZmlnO1xuICAgIEBJbnB1dCgpIGRlc2NyaXB0aW9uUmVuZGVyZXIgICAgICAgICAgISA6ICh2aWV3OiBXaWRnZXQpID0+IHN0cmluZztcbiAgICBASW5wdXQoKSBkZXRlY3RDU1NDb21wYXRpYmlsaXR5SXNzdWVzICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGRpc2FibGVkQ2xzICAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBkaXNhYmxlZERhdGVzICAgICAgICAgICAgICAgICEgOiAoKGRhdGU6IERhdGUpID0+IGJvb2xlYW4pfHN0cmluZ3xEYXRlW118c3RyaW5nW107XG4gICAgQElucHV0KCkgZGlzYWJsZU5vbldvcmtpbmdEYXlzICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBkaXNhYmxlT3RoZXJNb250aENlbGxzICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGRpc2FibGVXZWVrZW5kcyAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZG9jayAgICAgICAgICAgICAgICAgICAgICAgICAhIDogJ3RvcCd8J2JvdHRvbSd8J2xlZnQnfCdyaWdodCd8J3N0YXJ0J3wnZW5kJ3wnaGVhZGVyJ3wncHJlLWhlYWRlcid8b2JqZWN0O1xuICAgIEBJbnB1dCgpIGRyYWdnYWJsZSAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58e1xuICAgICAgICBoYW5kbGVTZWxlY3Rvcj86IHN0cmluZ1xuICAgIH07XG4gICAgQElucHV0KCkgZHJhd2VyICAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbnx7c2lkZT86ICdzdGFydCd8J2xlZnQnfCdlbmQnfCdyaWdodCd8J3RvcCd8J2JvdHRvbScsIHNpemU/OiBzdHJpbmd8bnVtYmVyLCBpbmxpbmU/OiBib29sZWFuLCBhdXRvQ2xvc2U6IHsgbW91c2Vkb3duPzogYm9vbGVhbnxzdHJpbmcsIGZvY3Vzb3V0PzogYm9vbGVhbnxzdHJpbmcsIG1vdXNlb3V0Pzogc3RyaW5nIH0sIGF1dG9DbG9zZURlbGF5PzogbnVtYmVyfTtcbiAgICBASW5wdXQoKSBlbGVtZW50QXR0cmlidXRlcyAgICAgICAgICAgICEgOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmd8bnVsbD47XG4gICAgQElucHV0KCkgZW1wdHlDZWxsUmVuZGVyZXIgICAgICAgICAgICAhIDogKChkYXlDZWxsUmVuZGVyZXI6IERheUNlbGwpID0+IERvbUNvbmZpZ3x2b2lkKXxvYmplY3R8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGV2ZW50RmlsdGVyICAgICAgICAgICAgICAgICAgISA6ICgoZXZlbnQ6IEV2ZW50TW9kZWwpID0+IGJvb2xlYW4pfHN0cmluZztcbiAgICBASW5wdXQoKSBldmVudEhlYWRlclJlbmRlcmVyICAgICAgICAgICEgOiAoKGRldGFpbDogeyB2aWV3OiBDYWxlbmRhclZpZXcsIGV2ZW50UmVjb3JkOiBFdmVudE1vZGVsLCByZXNvdXJjZVJlY29yZDogUmVzb3VyY2VNb2RlbCwgcmVuZGVyRGF0YTogeyBzdHlsZTogb2JqZWN0LCBjbHM6IG9iamVjdCwgaWNvblN0eWxlOiBvYmplY3QsIGljb25DbHM6IG9iamVjdCwgZXZlbnRDb2xvcjogc3RyaW5nLCBkYXRhc2V0OiBvYmplY3QsIHNvbGlkQmFyOiBib29sZWFuLCBib2R5Q29sb3I6IHN0cmluZyB9LCBzaG93QnVsbGV0OiBib29sZWFuIH0pID0+IERvbUNvbmZpZ3xEb21Db25maWdbXXxzdHJpbmd8dm9pZCl8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGV2ZW50UmVuZGVyZXIgICAgICAgICAgICAgICAgISA6ICgoZGV0YWlsOiB7IHZpZXc6IENhbGVuZGFyVmlldywgZXZlbnRSZWNvcmQ6IEV2ZW50TW9kZWwsIHJlc291cmNlUmVjb3JkOiBSZXNvdXJjZU1vZGVsLCByZW5kZXJEYXRhOiB7IHN0eWxlOiBvYmplY3QsIGNsczogb2JqZWN0LCBpY29uU3R5bGU6IG9iamVjdCwgaWNvbkNsczogb2JqZWN0LCBldmVudENvbG9yOiBzdHJpbmcsIGV2ZW50QmFja2dyb3VuZDogc3RyaW5nLCB0ZXh0Q29sb3I6IHN0cmluZywgZXZlbnRJbm5lclN0eWxlOiBvYmplY3QsIGRhdGFzZXQ6IG9iamVjdCwgc29saWRCYXI6IGJvb2xlYW4sIGJvZHlDb2xvcjogc3RyaW5nLCBzaG93QnVsbGV0OiBib29sZWFuIH0gfSkgPT4gRG9tQ29uZmlnfERvbUNvbmZpZ1tdfHN0cmluZ3x2b2lkKXxzdHJpbmc7XG4gICAgQElucHV0KCkgZXZlbnRTb3J0ZXIgICAgICAgICAgICAgICAgICAhIDogKGxoczogRXZlbnRNb2RlbHxFdmVudEJhciwgcmhzOiBFdmVudE1vZGVsfEV2ZW50QmFyKSA9PiBudW1iZXI7XG4gICAgQElucHV0KCkgZmxvYXRpbmcgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBmb290ZXIgICAgICAgICAgICAgICAgICAgICAgICEgOiB7XG4gICAgICAgIGRvY2s/OiAndG9wJ3wncmlnaHQnfCdib3R0b20nfCdsZWZ0J3wnc3RhcnQnfCdlbmQnXG4gICAgICAgIGh0bWw/OiBzdHJpbmdcbiAgICAgICAgY2xzPzogc3RyaW5nXG4gICAgfXxzdHJpbmc7XG4gICAgQElucHV0KCkgZ2V0UHJpbWFyeVJlc291cmNlICAgICAgICAgICAhIDogKChldmVudFJlY29yZDogRXZlbnRNb2RlbCkgPT4gUmVzb3VyY2VNb2RlbCl8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xib29sZWFufFBhbmVsSGVhZGVyO1xuICAgIEBJbnB1dCgpIGhlYWRlclJlbmRlcmVyICAgICAgICAgICAgICAgISA6ICgoY2VsbDogSFRNTEVsZW1lbnQsIGNvbHVtbkluZGV4OiBudW1iZXIsIHdlZWtEYXk6IG51bWJlcikgPT4gc3RyaW5nfERvbUNvbmZpZ3x2b2lkKXxzdHJpbmc7XG4gICAgQElucHV0KCkgaGlkZUFuaW1hdGlvbiAgICAgICAgICAgICAgICAhIDogYm9vbGVhbnxvYmplY3Q7XG4gICAgQElucHV0KCkgaGlkZU90aGVyTW9udGhDZWxscyAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBoaWRlV2hlbkVtcHR5ICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGljb24gICAgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xEb21Db25maWc7XG4gICAgQElucHV0KCkgaWdub3JlUGFyZW50UmVhZE9ubHkgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBpdGVtQ2xzICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgbGF6eUl0ZW1zICAgICAgICAgICAgICAgICAgICAhIDogUmVjb3JkPHN0cmluZywgQ2FsZW5kYXJDb250YWluZXJJdGVtQ29uZmlnPnxDYWxlbmRhckNvbnRhaW5lckl0ZW1Db25maWdbXXxXaWRnZXRbXTtcbiAgICBASW5wdXQoKSBsaXN0ZW5lcnMgICAgICAgICAgICAgICAgICAgICEgOiBNb250aFZpZXdMaXN0ZW5lcnM7XG4gICAgQElucHV0KCkgbG9jYWxlQ2xhc3MgICAgICAgICAgICAgICAgICAhIDogdHlwZW9mIEJhc2U7XG4gICAgQElucHV0KCkgbG9jYWxpemFibGUgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBsb2NhbGl6YWJsZVByb3BlcnRpZXMgICAgICAgICEgOiBzdHJpbmdbXTtcbiAgICBASW5wdXQoKSBtYXNrRGVmYXVsdHMgICAgICAgICAgICAgICAgICEgOiBNYXNrQ29uZmlnO1xuICAgIEBJbnB1dCgpIG1hc2tlZCAgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58c3RyaW5nfE1hc2tDb25maWc7XG4gICAgQElucHV0KCkgbWF4RXZlbnRzUGVyQ2VsbCAgICAgICAgICAgICAhIDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIG1pbkNvbHVtbldpZHRoICAgICAgICAgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSBtaW5Sb3dIZWlnaHQgICAgICAgICAgICAgICAgICEgOiBudW1iZXJ8c3RyaW5nO1xuICAgIEBJbnB1dCgpIG1vbml0b3JSZXNpemUgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58e1xuICAgICAgICBpbW1lZGlhdGU/OiBib29sZWFuXG4gICAgfTtcbiAgICBASW5wdXQoKSBtb250aCAgICAgICAgICAgICAgICAgICAgICAgICEgOiBNb250aHxNb250aENvbmZpZztcbiAgICBASW5wdXQoKSBuYW1lZEl0ZW1zICAgICAgICAgICAgICAgICAgICEgOiBSZWNvcmQ8c3RyaW5nLCBDYWxlbmRhckNvbnRhaW5lckl0ZW1Db25maWc+O1xuICAgIEBJbnB1dCgpIG5vbldvcmtpbmdEYXlDbHMgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBvdGhlck1vbnRoQ2xzICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgb3ZlcmZsb3dCdXR0b25SZW5kZXJlciAgICAgICAhIDogKGRvbUNvbmZpZzogeyB0YWc6IHN0cmluZywgY2xhc3NOYW1lOiBvYmplY3QsIHRleHQ6IHN0cmluZywgc3R5bGU6IG9iamVjdCwgZGF0YXNldDogb2JqZWN0IH0sIG92ZXJmbG93Q291bnQ6IG51bWJlcikgPT4gRG9tQ29uZmlnfHN0cmluZ3x2b2lkO1xuICAgIEBJbnB1dCgpIG92ZXJmbG93Q2xpY2tBY3Rpb24gICAgICAgICAgISA6ICdwb3B1cCd8J2V4cGFuZCc7XG4gICAgQElucHV0KCkgb3ZlcmZsb3dQb3B1cCAgICAgICAgICAgICAgICAhIDogT3ZlcmZsb3dQb3B1cENvbmZpZztcbiAgICBASW5wdXQoKSBvdmVyZmxvd1BvcHVwVHJpZ2dlciAgICAgICAgICEgOiAnY2xpY2snfCdtb3VzZW92ZXInfCdob3Zlcic7XG4gICAgQElucHV0KCkgb3duZXIgICAgICAgICAgICAgICAgICAgICAgICAhIDogV2lkZ2V0fGFueTtcbiAgICBASW5wdXQoKSBwb3NpdGlvbmVkICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHByZXZlbnRUb29sdGlwT25Ub3VjaCAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcmVsYXlTdG9yZUV2ZW50cyAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSByZXNvdXJjZUltYWdlUGF0aCAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgcmVzcG9uc2l2ZSAgICAgICAgICAgICAgICAgICAhIDogb2JqZWN0O1xuICAgIEBJbnB1dCgpIHJlc3BvbnNpdmVFdmVudEhlaWdodCAgICAgICAgISA6IFJlY29yZDwoJ3RocmVzaG9sZCd8J21pbkhlaWdodCcpLCBudW1iZXI+fFJlY29yZDxudW1iZXIsIG51bWJlcj47XG4gICAgQElucHV0KCkgcmVzcG9uc2l2ZVJvb3QgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSByZXNwb25zaXZlU3RhdGUgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgcmVzcG9uc2l2ZVRhcmdldCAgICAgICAgICAgICAhIDogc3RyaW5nfFdpZGdldDtcbiAgICBASW5wdXQoKSByaXBwbGUgICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFufHtcbiAgICAgICAgZGVsZWdhdGU/OiBzdHJpbmdcbiAgICAgICAgY29sb3I/OiBzdHJpbmdcbiAgICAgICAgcmFkaXVzPzogbnVtYmVyXG4gICAgICAgIGNsaXA/OiBzdHJpbmdcbiAgICB9O1xuICAgIEBJbnB1dCgpIHJvb3RFbGVtZW50ICAgICAgICAgICAgICAgICAgISA6IFNoYWRvd1Jvb3R8SFRNTEVsZW1lbnQ7XG4gICAgQElucHV0KCkgc2Nyb2xsQWN0aW9uICAgICAgICAgICAgICAgICAhIDogJ2hpZGUnfCdyZWFsaWduJ3xudWxsO1xuICAgIEBJbnB1dCgpIHNlbGVjdG9yQnV0dG9uICAgICAgICAgICAgICAgISA6IEJ1dHRvbkNvbmZpZztcbiAgICBASW5wdXQoKSBzZWxlY3Rvck1lbnVJdGVtICAgICAgICAgICAgICEgOiBNZW51SXRlbUNvbmZpZztcbiAgICBASW5wdXQoKSBzaG9ydEV2ZW50Q2xzICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgc2hvcnRFdmVudER1cmF0aW9uICAgICAgICAgICAhIDogc3RyaW5nfG51bWJlcjtcbiAgICBASW5wdXQoKSBzaG93QW5pbWF0aW9uICAgICAgICAgICAgICAgICEgOiBib29sZWFufG9iamVjdDtcbiAgICBASW5wdXQoKSBzaG93QnVsbGV0ICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFufHtiYXI/OiBib29sZWFuLCBub0Jhcj86IGJvb2xlYW59O1xuICAgIEBJbnB1dCgpIHNob3dSZXNvdXJjZUF2YXRhcnMgICAgICAgICAgISA6IGJvb2xlYW58c3RyaW5nO1xuICAgIEBJbnB1dCgpIHNob3dUb29sdGlwV2hlbkRpc2FibGVkICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgc2hvd1dlZWtDb2x1bW4gICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBzaXhXZWVrcyAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHN0YXRlZnVsICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58b2JqZWN0fHN0cmluZ1tdO1xuICAgIEBJbnB1dCgpIHN0YXRlZnVsRXZlbnRzICAgICAgICAgICAgICAgISA6IG9iamVjdHxzdHJpbmdbXTtcbiAgICBASW5wdXQoKSBzdGF0ZUlkICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgc3RhdGVQcm92aWRlciAgICAgICAgICAgICAgICAhIDogU3RhdGVQcm92aWRlcjtcbiAgICBASW5wdXQoKSBzdHJpcHMgICAgICAgICAgICAgICAgICAgICAgICEgOiBSZWNvcmQ8c3RyaW5nLCBDYWxlbmRhckNvbnRhaW5lckl0ZW1Db25maWc+O1xuICAgIEBJbnB1dCgpIHRhYiAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58VGFiQ29uZmlnO1xuICAgIEBJbnB1dCgpIHRhYkJhckl0ZW1zICAgICAgICAgICAgICAgICAgISA6IFRvb2xiYXJJdGVtc1tdfFdpZGdldFtdO1xuICAgIEBJbnB1dCgpIHRhZyAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSB0YmFyICAgICAgICAgICAgICAgICAgICAgICAgICEgOiAoQ2FsZW5kYXJDb250YWluZXJJdGVtQ29uZmlnfHN0cmluZylbXXxUb29sYmFyQ29uZmlnfFBhZ2luZ1Rvb2xiYXJDb25maWd8bnVsbDtcbiAgICBASW5wdXQoKSB0ZXh0QWxpZ24gICAgICAgICAgICAgICAgICAgICEgOiAnbGVmdCd8J2NlbnRlcid8J3JpZ2h0J3wnc3RhcnQnfCdlbmQnO1xuICAgIEBJbnB1dCgpIHRpbWVGb3JtYXQgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3woKGRhdGU6IERhdGUpID0+IHN0cmluZyk7XG4gICAgQElucHV0KCkgdGlwICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogVG9vbHRpcENvbmZpZztcbiAgICBASW5wdXQoKSB0b2RheUNscyAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgdHJhcEZvY3VzICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSB0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICEgOiAnbW9udGh2aWV3J3wnbW9udGgnO1xuICAgIEBJbnB1dCgpIHVpICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6ICdwbGFpbid8J3Rvb2xiYXInfHN0cmluZ3xvYmplY3Q7XG4gICAgQElucHV0KCkgd2Vla2VuZENscyAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHdlZWtSZW5kZXJlciAgICAgICAgICAgICAgICAgISA6ICgod2Vla0NlbGw6IEhUTUxFbGVtZW50LCB3ZWVrOiBudW1iZXJbXSkgPT4gc3RyaW5nfERvbUNvbmZpZ3x2b2lkKXxzdHJpbmc7XG4gICAgQElucHV0KCkgd2Vla1N0YXJ0RGF5ICAgICAgICAgICAgICAgICAhIDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIHdlaWdodCAgICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcjtcblxuICAgIC8vIENvbmZpZ3MgYW5kIHByb3BlcnRpZXNcbiAgICBASW5wdXQoKSBhbGlnblNlbGYgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBhbGxvd0RyYWdDcmVhdGUgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgYWxsb3dEcmFnTW92ZSAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGFsbG93RHJhZ1Jlc2l6ZSAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBhbmltYXRlVGltZVNoaWZ0ICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgYXBwZW5kVG8gICAgICAgICAgICAgICAgICAgICEgOiBIVE1MRWxlbWVudHxzdHJpbmc7XG4gICAgQElucHV0KCkgYXV0b0NyZWF0ZSAgICAgICAgICAgICAgICAgICEgOiB7XG4gICAgICAgIGdlc3R1cmU/OiBzdHJpbmdcbiAgICAgICAgbmV3TmFtZT86IEZ1bmN0aW9ufHN0cmluZ1xuICAgICAgICBzdGVwPzogc3RyaW5nXG4gICAgICAgIHNuYXBUeXBlPzogJ3JvdW5kJ3wnY2VpbCd8J2Zsb29yJ1xuICAgICAgICBkdXJhdGlvbj86IHN0cmluZ1xuICAgICAgICBzdGFydEhvdXI/OiBudW1iZXJcbiAgICB9fHN0cmluZ3xib29sZWFuO1xuICAgIEBJbnB1dCgpIGF1dG9Sb3dIZWlnaHQgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBjYWxsT25GdW5jdGlvbnMgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgY2F0Y2hFdmVudEhhbmRsZXJFeGNlcHRpb25zICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGNscyAgICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfG9iamVjdDtcbiAgICBASW5wdXQoKSBjb2xsYXBzZWQgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgY29sdW1uICAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXI7XG4gICAgQElucHV0KCkgZGF0YXNldCAgICAgICAgICAgICAgICAgICAgICEgOiBvYmplY3R8UmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICBASW5wdXQoKSBkYXRlICAgICAgICAgICAgICAgICAgICAgICAgISA6IERhdGV8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGRhdGVGb3JtYXQgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfCgoZGF0ZTogRGF0ZSkgPT4gc3RyaW5nKTtcbiAgICBASW5wdXQoKSBkYXRlU2VwYXJhdG9yICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBkZWZhdWx0U2Nyb2xsT3B0aW9ucyAgICAgICAgISA6IEJyeW50dW1TY3JvbGxPcHRpb25zO1xuICAgIEBJbnB1dCgpIGRlc2NyaXB0aW9uRm9ybWF0ICAgICAgICAgICAhIDogc3RyaW5nfHN0cmluZ1tdfGJvb2xlYW5bXXwoKGRhdGU6IERhdGUpID0+IHN0cmluZyl8RnVuY3Rpb25bXTtcbiAgICBASW5wdXQoKSBkaXNhYmxlZCAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58J2luZXJ0JztcbiAgICBASW5wdXQoKSBkcmFnVW5pdCAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBldmVudEhlaWdodCAgICAgICAgICAgICAgICAgISA6IG51bWJlcnxzdHJpbmc7XG4gICAgQElucHV0KCkgZXZlbnRTcGFjaW5nICAgICAgICAgICAgICAgICEgOiBudW1iZXI7XG4gICAgQElucHV0KCkgZXh0ZW5kQWxsRGF5RW5kRGF5ICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGV4dHJhRGF0YSAgICAgICAgICAgICAgICAgICAhIDogYW55O1xuICAgIEBJbnB1dCgpIGZpbHRlckV2ZW50UmVzb3VyY2VzICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBmbGV4ICAgICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcnxzdHJpbmc7XG4gICAgQElucHV0KCkgaGVpZ2h0ICAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXJ8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGhpZGRlbiAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBoaWRlTm9uV29ya2luZ0RheXMgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaWQgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgaW5wdXRGaWVsZEFsaWduICAgICAgICAgICAgICEgOiAnc3RhcnQnfCdlbmQnO1xuICAgIEBJbnB1dCgpIGluc2VydEJlZm9yZSAgICAgICAgICAgICAgICAhIDogSFRNTEVsZW1lbnR8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGluc2VydEZpcnN0ICAgICAgICAgICAgICAgICAhIDogSFRNTEVsZW1lbnR8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGl0ZW1zICAgICAgICAgICAgICAgICAgICAgICAhIDogKENhbGVuZGFyQ29udGFpbmVySXRlbUNvbmZpZ3xNZW51SXRlbUNvbmZpZ3xXaWRnZXQpW118UmVjb3JkPHN0cmluZywgQ2FsZW5kYXJDb250YWluZXJJdGVtQ29uZmlnfE1lbnVJdGVtQ29uZmlnPnxXaWRnZXRbXXxSZWNvcmQ8c3RyaW5nLCBDYWxlbmRhckNvbnRhaW5lckl0ZW1Db25maWd8TWVudUl0ZW1FbnRyeT58KENhbGVuZGFyQ29udGFpbmVySXRlbUNvbmZpZ3xNZW51SXRlbUVudHJ5fFdpZGdldClbXTtcbiAgICBASW5wdXQoKSBrZXlNYXAgICAgICAgICAgICAgICAgICAgICAgISA6IFJlY29yZDxzdHJpbmcsIEtleU1hcENvbmZpZz47XG4gICAgQElucHV0KCkgbGFiZWxQb3NpdGlvbiAgICAgICAgICAgICAgICEgOiAnYmVmb3JlJ3wnYWJvdmUnfCdhbGlnbi1iZWZvcmUnfCdhdXRvJ3xudWxsO1xuICAgIEBJbnB1dCgpIGxheW91dCAgICAgICAgICAgICAgICAgICAgICAhIDogTGF5b3V0fHN0cmluZ3xDYWxlbmRhckNvbnRhaW5lckxheW91dENvbmZpZztcbiAgICBASW5wdXQoKSBsYXlvdXRTdHlsZSAgICAgICAgICAgICAgICAgISA6IG9iamVjdDtcbiAgICBASW5wdXQoKSBtYXJnaW4gICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcnxzdHJpbmc7XG4gICAgQElucHV0KCkgbWF4RGF0ZSAgICAgICAgICAgICAgICAgICAgICEgOiBEYXRlfHN0cmluZztcbiAgICBASW5wdXQoKSBtYXhIZWlnaHQgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xudW1iZXI7XG4gICAgQElucHV0KCkgbWF4aW1pemVPbk1vYmlsZSAgICAgICAgICAgICEgOiBudW1iZXJ8c3RyaW5nO1xuICAgIEBJbnB1dCgpIG1heFdpZHRoICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfG51bWJlcjtcbiAgICBASW5wdXQoKSBtaW5EYXRlICAgICAgICAgICAgICAgICAgICAgISA6IERhdGV8c3RyaW5nO1xuICAgIEBJbnB1dCgpIG1pbkhlaWdodCAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfG51bWJlcjtcbiAgICBASW5wdXQoKSBtaW5XaWR0aCAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xudW1iZXI7XG4gICAgQElucHV0KCkgbm9uV29ya2luZ0RheXMgICAgICAgICAgICAgICEgOiBSZWNvcmQ8bnVtYmVyLCBib29sZWFuPjtcbiAgICBASW5wdXQoKSBwYXN0RXZlbnRDbHMgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBwZXJzaXN0U2hyaW5rV3JhcHBlZFJvd3MgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcmVhZE9ubHkgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHJlbmRpdGlvbiAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfFJlY29yZDxzdHJpbmcsIHN0cmluZz58bnVsbDtcbiAgICBASW5wdXQoKSBydGwgICAgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgc2Nyb2xsYWJsZSAgICAgICAgICAgICAgICAgICEgOiBTY3JvbGxlcnxib29sZWFufFNjcm9sbGVyQ29uZmlnO1xuICAgIEBJbnB1dCgpIHNoYWRlUGFzdERhdGVzICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBzaG9ydERhdGVGb3JtYXQgICAgICAgICAgICAgISA6IHN0cmluZ3woKGRhdGU6IERhdGUpID0+IHN0cmluZyk7XG4gICAgQElucHV0KCkgc2hvcnREYXRlVGltZUZvcm1hdCAgICAgICAgICEgOiBzdHJpbmd8KChkYXRlOiBEYXRlKSA9PiBzdHJpbmcpO1xuICAgIEBJbnB1dCgpIHNob3dXZWVrTnVtYmVyICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBzcGFuICAgICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSBzdGFja011bHRpRGF5RXZlbnRzICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgc3RyaWN0UmVjb3JkTWFwcGluZyAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHN5bmNDYWxlbmRhckRhdGUgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBzeW5jVmlld0RhdGUgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgdGl0bGUgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgdG9vbHMgICAgICAgICAgICAgICAgICAgICAgICEgOiBSZWNvcmQ8c3RyaW5nLCBUb29sfFRvb2xDb25maWc+fG51bGx8UmVjb3JkPHN0cmluZywgVG9vbD58UmVjb3JkPHN0cmluZywgVG9vbENvbmZpZz47XG4gICAgQElucHV0KCkgdG9vbHRpcCAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8VG9vbHRpcENvbmZpZ3xudWxsO1xuICAgIEBJbnB1dCgpIHdlZWtDb2x1bW5IZWFkZXIgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHdpZHRoICAgICAgICAgICAgICAgICAgICAgICAhIDogbnVtYmVyfHN0cmluZztcbiAgICBASW5wdXQoKSB4ICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcjtcblxuICAgIC8vIFByb3BlcnRpZXMgb25seVxuICAgIEBJbnB1dCgpIGFuY2hvclNpemUgICAgICAgISA6IG51bWJlcltdO1xuICAgIEBJbnB1dCgpIGRheUNlbGxDbHMgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBmaXJzdFZpc2libGVDZWxsICEgOiBIVE1MRWxlbWVudDtcbiAgICBASW5wdXQoKSBmaXJzdFZpc2libGVEYXRlICEgOiBEYXRlO1xuICAgIEBJbnB1dCgpIGZvY3VzVmlzaWJsZSAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaGFzQ2hhbmdlcyAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBpc1NldHRpbmdWYWx1ZXMgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGlzVmFsaWQgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgbGFzdFZpc2libGVDZWxsICAhIDogSFRNTEVsZW1lbnQ7XG4gICAgQElucHV0KCkgbGFzdFZpc2libGVEYXRlICAhIDogRGF0ZTtcbiAgICBASW5wdXQoKSBwYXJlbnQgICAgICAgICAgICEgOiBXaWRnZXQ7XG4gICAgQElucHV0KCkgcmVjb3JkICAgICAgICAgICAhIDogTW9kZWw7XG4gICAgQElucHV0KCkgc3RhdGUgICAgICAgICAgICAhIDogYW55O1xuICAgIEBJbnB1dCgpIHZhbHVlcyAgICAgICAgICAgISA6IFJlY29yZDxzdHJpbmcsIG9iamVjdD47XG5cbiAgICAvLyBFdmVudHMgZW1pdHRlcnNcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGZpcmVzIHdoZW5ldmVyIHRoZSBbYXV0b0NyZWF0ZSBnZXN0dXJlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9taXhpbi9DYWxlbmRhck1peGluI2NvbmZpZy1hdXRvQ3JlYXRlKSBpcyBkZXRlY3RlZFxuICAgICAqIGFuZCBhbHNvIHdoZW4gYSBbZHJhZy1jcmVhdGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvZmVhdHVyZS9DYWxlbmRhckRyYWcpIGdlc3R1cmUgaXMgZGV0ZWN0ZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNldmVudC1iZWZvcmVBdXRvQ3JlYXRlKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5kb21FdmVudCBUaGUgRE9NIGV2ZW50IHdoaWNoIGluaXRpYXRlZCB0aGUgY3JlYXRpb24uXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5kYXRlICpERVBSRUNBVEVEIGluIGZhdm91ciBvZiBgc3RhcnREYXRlYC4qIFRoZSBzdGFydGluZyB0aW1lIG9mIHRoZSBldmVudCB0byBiZSBjcmVhdGVkLiBJZiB0aGlzIGlzIGluIGEgYERheVZpZXdgLCB0aGlzIHdpbGwgYmUgc25hcHBlZCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmljYXRpb24gaW4gW2F1dG9DcmVhdGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L21peGluL0NhbGVuZGFyTWl4aW4jY29uZmlnLWF1dG9DcmVhdGUpXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5zdGFydERhdGUgVGhlIHN0YXJ0aW5nIHRpbWUgb2YgdGhlIGV2ZW50IHRvIGJlIGNyZWF0ZWQuIElmIHRoaXMgaXMgaW4gYSBgRGF5Vmlld2AsIHRoaXMgd2lsbCBiZSBzbmFwcGVkIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWNhdGlvbiBpbiBbYXV0b0NyZWF0ZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvbWl4aW4vQ2FsZW5kYXJNaXhpbiNjb25maWctYXV0b0NyZWF0ZSlcbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LmVuZERhdGUgVGhlIGVuZGluZyB0aW1lIG9mIHRoZSBldmVudCB0byBiZSBjcmVhdGVkLlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlTW9kZWx9IGV2ZW50LnJlc291cmNlUmVjb3JkIFRoZSByZXNvdXJjZSBpZiB0aGUgVUkgaW5jbHVkZXMgYSByZXNvdXJjZS5cbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyVmlld30gZXZlbnQudmlldyBUaGlzIHZpZXcuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlQXV0b0NyZWF0ZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGRvbUV2ZW50OiBFdmVudCwgZGF0ZTogRGF0ZSwgc3RhcnREYXRlOiBEYXRlLCBlbmREYXRlOiBEYXRlLCByZXNvdXJjZVJlY29yZDogUmVzb3VyY2VNb2RlbCwgdmlldzogQ2FsZW5kYXJWaWV3IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIGJlZm9yZSBhIHZpZXcncyBvcmllbnRhdGluZyBkYXRlIGNoYW5nZXMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNldmVudC1iZWZvcmVDaGFuZ2VEYXRlKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50Lm9sZERhdGUgVGhlIGN1cnJlbnQgb3JpZW50YXRpbmcgZGF0ZSBvZiB0aGlzIHZpZXcuXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5kYXRlIFRoZSBuZXcgZGF0ZSB0byB3aGljaCB0aGlzIHZpZXcgaXMgdG8gYmUgb3JpZW50YXRlZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVDaGFuZ2VEYXRlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgb2xkRGF0ZTogRGF0ZSwgZGF0ZTogRGF0ZSB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIGJlZm9yZSBhbiBvYmplY3QgaXMgZGVzdHJveWVkLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUuQmFzZX0gZXZlbnQuc291cmNlIFRoZSBPYmplY3QgdGhhdCBpcyBiZWluZyBkZXN0cm95ZWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlRGVzdHJveTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQmFzZSB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIGJlZm9yZSBhIHdpZGdldCBpcyBoaWRkZW4uIFJldHVybiBgZmFsc2VgIHRvIHByZXZlbnQgdGhlIGFjdGlvbi5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnNvdXJjZSBUaGUgd2lkZ2V0IGJlaW5nIGhpZGRlbi5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVIaWRlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBXaWRnZXQgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBiZWZvcmUgdGhpcyBDYWxlbmRhclBhbmVsIHJlZnJlc2hlcyBpbiByZXNwb25zZSB0byBjaGFuZ2VzIGluIGl0cyBtb250aC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5EYXRlUGlja2VyfSBldmVudC5zb3VyY2UgVGhpcyBEYXRlUGlja2VyLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVJlZnJlc2g6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IERhdGVQaWNrZXIgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCBiZWZvcmUgYSBuZXcgW3Jlc3BvbnNpdmVTdGF0ZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9taXhpbi9SZXNwb25zaXZlI2NvbmZpZy1yZXNwb25zaXZlU3RhdGUpIGlzIGFwcGxpZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhlIHdpZGdldCB3aG9zZSBgcmVzcG9uc2l2ZVN0YXRlYCBpcyB0byBiZSBjaGFuZ2VkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LnN0YXRlIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSB3aWRnZXQncyBgcmVzcG9uc2l2ZVN0YXRlYFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5vbGRTdGF0ZSBUaGUgcHJldmlvdXMgdmFsdWUgZm9yIHRoZSB3aWRnZXQncyBgcmVzcG9uc2l2ZVN0YXRlYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVJlc3BvbnNpdmVTdGF0ZUNoYW5nZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0LCBzdGF0ZTogc3RyaW5nLCBvbGRTdGF0ZTogc3RyaW5nIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBiZWZvcmUgdGhpcyBjb250YWluZXIgd2lsbCBsb2FkIHJlY29yZCB2YWx1ZXMgaW50byBpdHMgY2hpbGQgZmllbGRzLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3VcbiAgICAgKiB3YW50IHRvIG1vZGlmeSB0aGUgVUkgYmVmb3JlIGRhdGEgaXMgbG9hZGVkIChlLmcuIHNldCBzb21lIGlucHV0IGZpZWxkIHRvIGJlIHJlYWRvbmx5KVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LkNvbnRhaW5lcn0gZXZlbnQuc291cmNlIFRoZSBjb250YWluZXJcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQucmVjb3JkIFRoZSByZWNvcmRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVTZXRSZWNvcmQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IENvbnRhaW5lciwgcmVjb3JkOiBNb2RlbCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIGJlZm9yZSBhIHdpZGdldCBpcyBzaG93bi4gUmV0dXJuIGBmYWxzZWAgdG8gcHJldmVudCB0aGUgYWN0aW9uLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldCxhbnl9IGV2ZW50LnNvdXJjZSBUaGUgd2lkZ2V0IGJlaW5nIHNob3duXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlU2hvdzogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0fGFueSB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIGJlZm9yZSBhbiBbT3ZlcmZsb3dQb3B1cF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvT3ZlcmZsb3dQb3B1cCkgaXMgc2hvd24gd2hlbiBhbiBhXG4gICAgICogXCIrIG4gbW9yZVwiIG92ZXJmbG93IGJ1dHRvbiBpcyBhY3RpdmF0ZWQgYnkgYW4gW292ZXJmbG93UG9wdXBUcmlnZ2VyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9taXhpbi9EYXlDZWxsUmVuZGVyZXIjY29uZmlnLW92ZXJmbG93UG9wdXBUcmlnZ2VyKSBldmVudC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuY2VsbCBUaGUgZGF5IGNlbGwgZm9yIHdoaWNoIHRoZSBvdmVyZmxvdyBwb3B1cCBpcyBnb2luZyB0byBiZSBzaG93bi5cbiAgICAgKiBAcGFyYW0ge0RheUNlbGx9IGV2ZW50LmNlbGxEYXRhIEEgYERheUNlbGxgIG9iamVjdCB0aGF0IGNvbnRhaW5zIGRhdGEgYWJvdXQgdGhlIGNlbGwuXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5kYXRlIFRoZSBkYXRlIHdoaWNoIGhhcyBvdmVyZmxvd2luZyBldmVudHNcbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyLndpZGdldC5PdmVyZmxvd1BvcHVwfSBldmVudC5vdmVyZmxvd1BvcHVwIFRoZSBvdmVyZmxvdyBgUG9wdXBgLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVNob3dPdmVyZmxvd1BvcHVwOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgY2VsbDogSFRNTEVsZW1lbnQsIGNlbGxEYXRhOiBEYXlDZWxsLCBkYXRlOiBEYXRlLCBvdmVyZmxvd1BvcHVwOiBPdmVyZmxvd1BvcHVwIH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgYmVmb3JlIHN0YXRlIGlzIGFwcGxpZWQgdG8gdGhlIHNvdXJjZS4gQWxsb3dzIGVkaXRpbmcgdGhlIHN0YXRlIG9iamVjdCBvciBwcmV2ZW50aW5nIHRoZSBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7YW55fSBldmVudC5zdGF0ZSBTdGF0ZSBvYmplY3QgY29uZmlnXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlU3RhdGVBcHBseTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHN0YXRlOiBhbnkgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBiZWZvcmUgc3RhdGUgaXMgc2F2ZWQgYnkgdGhlIFN0YXRlUHJvdmlkZXIuIEFsbG93cyBlZGl0aW5nIHRoZSBzdGF0ZSBvYmplY3Qgb3IgcHJldmVudGluZyB0aGUgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge2FueX0gZXZlbnQuc3RhdGUgU3RhdGUgb2JqZWN0IGNvbmZpZ1xuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVN0YXRlU2F2ZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHN0YXRlOiBhbnkgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGFueSBvdGhlciBldmVudCBpcyBmaXJlZCBmcm9tIHRoZSBvYmplY3QuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNldmVudC1jYXRjaEFsbClcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHt7W2tleTogc3RyaW5nXTogYW55LCB0eXBlOiBzdHJpbmd9fSBldmVudC5ldmVudCBUaGUgT2JqZWN0IHRoYXQgY29udGFpbnMgZXZlbnQgZGV0YWlsc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5ldmVudC50eXBlIFRoZSB0eXBlIG9mIHRoZSBldmVudCB3aGljaCBpcyBjYXVnaHQgYnkgdGhlIGxpc3RlbmVyXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ2F0Y2hBbGw6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDoge1trZXk6IHN0cmluZ106IGFueSwgdHlwZTogc3RyaW5nfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBkYXRlIGNlbGwgaXMgY2xpY2tlZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuY2VsbCBUaGUgY2xpY2tlZCBjZWxsIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5kYXRlIFRoZSBkYXRlIHJlcHJlc2VudGVkIGJ5IHRoZSBjZWxsLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyW119IGV2ZW50LndlZWsgVGhlIHdlZWsgYXJyYXkgYFt5ZWFyLCB3ZWVrTnVtYmVyXWAuXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIG9yaWdpbmFsIERPTSBldmVudC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25DZWxsQ2xpY2s6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBjZWxsOiBIVE1MRWxlbWVudCwgZGF0ZTogRGF0ZSwgd2VlazogbnVtYmVyW10sIGRvbUV2ZW50OiBFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIG5ldyBzZXQgb2YgZXZlbnRzIGhhcyBiZWVuIGdhdGhlcmVkIGZvciB0aGlzIHZpZXcncyBkYXRlIHJhbmdlLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge01hcDxhbnksIGFueT59IGV2ZW50LmNlbGxNYXAgVGhlIG1hcCBvZiBkYXRlIGtleXMgdG8gW2RheSBjZWxsXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9taXhpbi9EYXlDZWxsQ29sbGVjdGVyI3R5cGVkZWYtRGF5Q2VsbCkgZGF0YSBibG9ja3MuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ2VsbE1hcFBvcHVsYXRlZDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGNlbGxNYXA6IE1hcDxhbnksIGFueT4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYSBQYW5lbCBpcyBjb2xsYXBzZWQgdXNpbmcgdGhlIFtjb2xsYXBzaWJsZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9QYW5lbCNjb25maWctY29sbGFwc2libGUpIHNldHRpbmcuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuUGFuZWx9IGV2ZW50LnNvdXJjZSBUaGlzIFBhbmVsLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNvbGxhcHNlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBQYW5lbCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiB0aGUgZGF0ZSBvZiB0aGlzIENhbGVuZGFyUGFuZWwgaXMgc2V0LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LnZhbHVlIFRoZSBuZXcgZGF0ZS5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50Lm9sZFZhbHVlIFRoZSBvbGQgZGF0ZS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQuY2hhbmdlcyBBbiBvYmplY3Qgd2hpY2ggY29udGFpbnMgcHJvcGVydGllcyB3aGljaCBpbmRpY2F0ZSB3aGF0IHBhcnQgb2YgdGhlIGRhdGUgY2hhbmdlZC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmNoYW5nZXMuZCBUcnVlIGlmIHRoZSBkYXRlIGNoYW5nZWQgaW4gYW55IHdheS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmNoYW5nZXMudyBUcnVlIGlmIHRoZSB3ZWVrIGNoYW5nZWQgKGluY2x1ZGluZyBzYW1lIHdlZWsgaW4gYSBkaWZmZXJlbnQgeWVhcikuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5jaGFuZ2VzLm0gVHJ1ZSBpZiB0aGUgbW9udGggY2hhbmdlZCAoaW5jbHVkaW5nIHNhbWUgbW9udGggaW4gYSBkaWZmZXJlbnQgeWVhcikuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5jaGFuZ2VzLnkgVHJ1ZSBpZiB0aGUgeWVhciBjaGFuZ2VkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkRhdGVDaGFuZ2U6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyB2YWx1ZTogRGF0ZSwgb2xkVmFsdWU6IERhdGUsIGNoYW5nZXM6IHsgZDogYm9vbGVhbiwgdzogYm9vbGVhbiwgbTogYm9vbGVhbiwgeTogYm9vbGVhbiB9IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBhZnRlciBvbmUgZGF5IGNlbGwncyBldmVudHMgYXJlIGNvbGxlY3RlZCBpbiBzb3J0ZWQgb3JkZXIgYWNjb3JkaW5nIHRvIHRoZVxuICAgICAqIFtldmVudFNvcnRlcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvbWl4aW4vQ2FsZW5kYXJNaXhpbiNjb25maWctZXZlbnRTb3J0ZXIpXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNldmVudC1kYXlDZWxsUG9wdWxhdGVkKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5FdmVudE1vZGVsW119IGV2ZW50LmV2ZW50cyBUaGUgZXZlbnRzIHRvIGJlIHNob3duIGZvciB0aGUgcGFzc2VkIGRhdGVcbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LlRoZSBkYXRlIHRoZSBldmVudHMgYXJlIHRvIGJlIHNob3duIGluLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkRheUNlbGxQb3B1bGF0ZWQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBldmVudHM6IEV2ZW50TW9kZWxbXSwgVGhlOiBEYXRlIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGFuIG9iamVjdCBpcyBkZXN0cm95ZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS5CYXNlfSBldmVudC5zb3VyY2UgVGhlIE9iamVjdCB0aGF0IGlzIGJlaW5nIGRlc3Ryb3llZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25EZXN0cm95OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBCYXNlIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGEgZmllbGQgaXMgbXV0YXRlZCBhbmQgdGhlIHN0YXRlIG9mIHRoZSBbaGFzQ2hhbmdlc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db250YWluZXIjcHJvcGVydHktaGFzQ2hhbmdlcykgcHJvcGVydHkgY2hhbmdlc1xuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LkNvbnRhaW5lcn0gZXZlbnQuc291cmNlIFRoZSBjb250YWluZXIuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5kaXJ0eSBUaGUgZGlydHkgc3RhdGUgb2YgdGhlIENvbnRhaW5lciAtIGB0cnVlYCBpZiB0aGVyZSBhcmUgYW55IGZpZWxkcyB3aGljaCBoYXZlIGJlZW4gY2hhbmdlZCBzaW5jZSBpbml0aWFsIGxvYWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRGlydHlTdGF0ZUNoYW5nZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQ29udGFpbmVyLCBkaXJ0eTogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gYSB3aWRnZXQncyBbZWxlbWVudF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjcHJvcGVydHktZWxlbWVudCkgaXMgYXZhaWxhYmxlLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC5lbGVtZW50IFRoZSBXaWRnZXQncyBlbGVtZW50LlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkVsZW1lbnRDcmVhdGVkOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgZWxlbWVudDogSFRNTEVsZW1lbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYW4gZW1wdHkgY2VsbCBjb250ZW50IGFyZWEgaXMgY2xpY2tlZCBvbi4gSWYgdGhlIGhhbmRsZXIgcmV0dXJuc1xuICAgICAqIGBmYWxzZWAgdGhlIGN1cnJlbnQgcG9pbnRlciBldmVudCBpcyBub3QgcHJvY2Vzc2VkIGZ1cnRoZXIuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSB0cmlnZ2VyaW5nIERPTSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LmRhdGUgVGhlIGRhdGUgd2hpY2ggaGFzIG5vIHZpc2libGUgZXZlbnRzXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRW1wdHlDZWxsQ2xpY2s6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBkb21FdmVudDogRXZlbnQsIGRhdGU6IERhdGUgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYW4gW2F1dG9DcmVhdGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L21peGluL0NhbGVuZGFyTWl4aW4jY29uZmlnLWF1dG9DcmVhdGUpIGdlc3R1cmUgaGFzIGNyZWF0ZWQgYSBuZXcgZXZlbnRcbiAgICAgKiBhbmQgYWRkZWQgaXQgdG8gdGhlIGV2ZW50IHN0b3JlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9Nb250aFZpZXcjZXZlbnQtZXZlbnRBdXRvQ3JlYXRlZClcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDYWxlbmRhclZpZXd9IGV2ZW50LnNvdXJjZSBUaGlzIENhbGVuZGFyIHZpZXcgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbH0gZXZlbnQuZXZlbnRSZWNvcmQgVGhlIG5ldyBldmVudCByZWNvcmQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRXZlbnRBdXRvQ3JlYXRlZDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQ2FsZW5kYXJWaWV3LCBldmVudFJlY29yZDogRXZlbnRNb2RlbCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBpcyBmaXJlZCB3aGVuIHRoZSBldmVudCBoZWlnaHQgY2hhbmdlcyBkdWUgdG8gcmVzaXppbmcgb2YgdGhlIHZpZXdcbiAgICAgKiBhbmQgdGhlIGFwcGxpY2F0aW9uIG9mIFtyZXNwb25zaXZlRXZlbnRIZWlnaHRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNjb25maWctcmVzcG9uc2l2ZUV2ZW50SGVpZ2h0KS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGV2ZW50LmhlaWdodCBUaGUgbmV3IGV2ZW50IGhlaWdodC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZXZlbnQub2xkSGVpZ2h0IFRoZSBwcmV2aW91cyBldmVudCBoZWlnaHQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRXZlbnRIZWlnaHRDaGFuZ2U6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBoZWlnaHQ6IG51bWJlciwgb2xkSGVpZ2h0OiBudW1iZXIgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYSBkYXkgc3Bhbm5pbmcgZXZlbnQgaXMgZm91bmQsIGFuZCB0aGUgZGF0ZSB0byB3aGljaCBpdHMgZW5jYXBzdWxhdGluZyBldmVudCBiYXJcbiAgICAgKiBleHRlbmRzIGhhcyBiZWVuIGNhbGN1bGF0ZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNldmVudC1ldmVudFByb3BhZ2F0ZSlcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5ldmVudEVuZERhdGUgVGhlIGVuZCBkYXRlIGZvciB3aGljaCB0byBjYWxjdWxhdGUgdGhlIHByb3BhZ2F0ZSBlbmQgZGF0ZS5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LnByb3BhZ2F0ZUVuZERhdGUgVGhlIHN5c3RlbS1jYWxjdWxhdGVkIGVuZCBwb2ludCBvZiB0aGUgZXZlbnQgYmFyLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuaXNBbGxEYXkgYHRydWVgIGlmIHRoZSBldmVudCBpcyBhbiBhbGwgZGF5IGV2ZW50LCBvciBzcGFucyBtdWx0aXBsZSBkYXlzLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuaXNPdmVyZmxvdyBgdHJ1ZWAgaWYgdGhpcyBpcyBiZWluZyBjYWxsZWQgYXMgcGFydCBvZiBmdXJ0aGVyIHByb3BhZ2F0aW9uLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQub3ZlcmZsb3dzIGB0cnVlYCBpZiB0aGUgZXZlbnQgZXh0ZW5kcyBpbnRvIGZ1dHVyZSBjZWxscy5cbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5FdmVudE1vZGVsfSBldmVudC5ldmVudFJlY29yZCBUaGUgZXZlbnQgcmVjb3JkIGJlaW5nIHByb3BhZ2F0ZWQuXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5kYXRlIFRoZSBkYXRlIGZyb20gd2hpY2ggdGhlIGV2ZW50IGlzIGJlaW5nIHByb3BhZ2F0ZWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRXZlbnRQcm9wYWdhdGU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBldmVudEVuZERhdGU6IERhdGUsIHByb3BhZ2F0ZUVuZERhdGU6IERhdGUsIGlzQWxsRGF5OiBib29sZWFuLCBpc092ZXJmbG93OiBib29sZWFuLCBvdmVyZmxvd3M6IGJvb2xlYW4sIGV2ZW50UmVjb3JkOiBFdmVudE1vZGVsLCBkYXRlOiBEYXRlIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGEgUGFuZWwgaXMgZXhwYW5kZWQgdXNpbmcgdGhlIFtjb2xsYXBzaWJsZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9QYW5lbCNjb25maWctY29sbGFwc2libGUpIHNldHRpbmcuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuUGFuZWx9IGV2ZW50LnNvdXJjZSBUaGlzIFBhbmVsLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkV4cGFuZDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogUGFuZWwgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gZm9jdXMgZW50ZXJzIHRoaXMgV2lkZ2V0LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQuc291cmNlIFRoaXMgV2lkZ2V0XG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuZnJvbUVsZW1lbnQgVGhlIGVsZW1lbnQgd2hpY2ggbG9zdCBmb2N1cy5cbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC50b0VsZW1lbnQgVGhlIGVsZW1lbnQgd2hpY2ggZ2FpbmVkIGZvY3VzLlxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5mcm9tV2lkZ2V0IFRoZSB3aWRnZXQgd2hpY2ggbG9zdCBmb2N1cy5cbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQudG9XaWRnZXQgVGhlIHdpZGdldCB3aGljaCBnYWluZWQgZm9jdXMuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5iYWNrd2FyZHMgYHRydWVgIGlmIHRoZSBgdG9FbGVtZW50YCBpcyBiZWZvcmUgdGhlIGBmcm9tRWxlbWVudGAgaW4gZG9jdW1lbnQgb3JkZXIuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRm9jdXNJbjogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0LCBmcm9tRWxlbWVudDogSFRNTEVsZW1lbnQsIHRvRWxlbWVudDogSFRNTEVsZW1lbnQsIGZyb21XaWRnZXQ6IFdpZGdldCwgdG9XaWRnZXQ6IFdpZGdldCwgYmFja3dhcmRzOiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGZvY3VzIGV4aXRzIHRoaXMgV2lkZ2V0J3Mgb3duZXJzaGlwIHRyZWUuIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gYSBgYmx1cmAgZXZlbnQuXG4gICAgICogZm9jdXMgbW92aW5nIGZyb20gd2l0aGluIHRoaXMgV2lkZ2V0J3Mgb3duZXJzaGlwIHRyZWUsIGV2ZW4gaWYgdGhlcmUgYXJlIGZsb2F0aW5nIHdpZGdldHNcbiAgICAgKiB3aWxsIG5vdCB0cmlnZ2VyIHRoaXMgZXZlbnQuIFRoaXMgaXMgd2hlbiBmb2N1cyBleGl0cyB0aGlzIHdpZGdldCBjb21wbGV0ZWx5LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQuc291cmNlIFRoaXMgV2lkZ2V0XG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuZnJvbUVsZW1lbnQgVGhlIGVsZW1lbnQgd2hpY2ggbG9zdCBmb2N1cy5cbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC50b0VsZW1lbnQgVGhlIGVsZW1lbnQgd2hpY2ggZ2FpbmVkIGZvY3VzLlxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5mcm9tV2lkZ2V0IFRoZSB3aWRnZXQgd2hpY2ggbG9zdCBmb2N1cy5cbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQudG9XaWRnZXQgVGhlIHdpZGdldCB3aGljaCBnYWluZWQgZm9jdXMuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5iYWNrd2FyZHMgYHRydWVgIGlmIHRoZSBgdG9FbGVtZW50YCBpcyBiZWZvcmUgdGhlIGBmcm9tRWxlbWVudGAgaW4gZG9jdW1lbnQgb3JkZXIuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRm9jdXNPdXQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldCwgZnJvbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCB0b0VsZW1lbnQ6IEhUTUxFbGVtZW50LCBmcm9tV2lkZ2V0OiBXaWRnZXQsIHRvV2lkZ2V0OiBXaWRnZXQsIGJhY2t3YXJkczogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIGFmdGVyIGEgd2lkZ2V0IHdhcyBoaWRkZW5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnNvdXJjZSBUaGUgd2lkZ2V0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uSGlkZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgd2hlbiBhIHdpZGdldCB3aGljaCBoYWQgYmVlbiBpbiBhIG5vbi12aXNpYmxlIHN0YXRlIGZvciBhbnkgcmVhc29uXG4gICAgICogYWNoaWV2ZXMgdmlzaWJpbGl0eS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2V2ZW50LXBhaW50KVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQuc291cmNlIFRoZSB3aWRnZXQgYmVpbmcgcGFpbnRlZC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmZpcnN0UGFpbnQgYHRydWVgIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHBhaW50LlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblBhaW50OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBXaWRnZXQsIGZpcnN0UGFpbnQ6IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBXaWRnZXQncyByZWFkIG9ubHkgc3RhdGUgaXMgdG9nZ2xlZFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LnJlYWRPbmx5IFJlYWQgb25seSBvciBub3RcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25SZWFkT25seTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHJlYWRPbmx5OiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGlzIGZpcmVkIGFmdGVyIGEgd2lkZ2V0J3MgZWxlbWVudHMgaGF2ZSBiZWVuIHN5bmNocm9uaXplZCBkdWUgdG8gYSBkaXJlY3Qgb3IgaW5kaXJlY3QgY2FsbFxuICAgICAqIHRvIFtyZWNvbXBvc2VdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2Z1bmN0aW9uLXJlY29tcG9zZSksIGlmIHRoaXMgcmVzdWx0cyBpbiBzb21lIGNoYW5nZSB0byB0aGUgd2lkZ2V0J3MgcmVuZGVyZWQgRE9NIGVsZW1lbnRzLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJlY29tcG9zZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKCkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gdGhpcyBDYWxlbmRhclBhbmVsIHJlZnJlc2hlcy5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25SZWZyZXNoOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoKSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiB0aGUgZW5jYXBzdWxhdGluZyBlbGVtZW50IG9mIGEgV2lkZ2V0IHJlc2l6ZXMgKm9ubHkgd2hlbiBbbW9uaXRvclJlc2l6ZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLW1vbml0b3JSZXNpemUpIGlzIGB0cnVlYCouXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhpcyBXaWRnZXRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZXZlbnQud2lkdGggVGhlIG5ldyB3aWR0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBldmVudC5oZWlnaHQgVGhlIG5ldyBoZWlnaHRcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZXZlbnQub2xkV2lkdGggVGhlIG9sZCB3aWR0aFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBldmVudC5vbGRIZWlnaHQgVGhlIG9sZCBoZWlnaHRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25SZXNpemU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldCwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIG9sZFdpZHRoOiBudW1iZXIsIG9sZEhlaWdodDogbnVtYmVyIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgd2hlbiBhIG5ldyBbcmVzcG9uc2l2ZVN0YXRlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L21peGluL1Jlc3BvbnNpdmUjY29uZmlnLXJlc3BvbnNpdmVTdGF0ZSkgaXMgYXBwbGllZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnNvdXJjZSBUaGUgd2lkZ2V0IHdob3NlIGByZXNwb25zaXZlU3RhdGVgIGhhcyBjaGFuZ2VkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LnN0YXRlIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSB3aWRnZXQncyBgcmVzcG9uc2l2ZVN0YXRlYFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5vbGRTdGF0ZSBUaGUgcHJldmlvdXMgdmFsdWUgZm9yIHRoZSB3aWRnZXQncyBgcmVzcG9uc2l2ZVN0YXRlYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJlc3BvbnNpdmVTdGF0ZUNoYW5nZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0LCBzdGF0ZTogc3RyaW5nLCBvbGRTdGF0ZTogc3RyaW5nIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgYWZ0ZXIgYSB3aWRnZXQgaXMgc2hvd24uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhlIHdpZGdldFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblNob3c6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgYWZ0ZXIgYW4gW092ZXJmbG93UG9wdXBdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L092ZXJmbG93UG9wdXApIGhhcyBiZWVuIHNob3duIHdoZW4gYW4gYVxuICAgICAqIFwiKyBuIG1vcmVcIiBvdmVyZmxvdyBidXR0b24gaXMgYWN0aXZhdGVkIGJ5IGFuIFtvdmVyZmxvd1BvcHVwVHJpZ2dlcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvbWl4aW4vRGF5Q2VsbFJlbmRlcmVyI2NvbmZpZy1vdmVyZmxvd1BvcHVwVHJpZ2dlcikgZXZlbnQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LmNlbGwgVGhlIGRheSBjZWxsIGZvciB3aGljaCB0aGUgb3ZlcmZsb3cgcG9wdXAgaXMgZ29pbmcgdG8gYmUgc2hvd24uXG4gICAgICogQHBhcmFtIHtEYXlDZWxsfSBldmVudC5jZWxsRGF0YSBBIGBEYXlDZWxsYCBvYmplY3QgdGhhdCBjb250YWlucyBkYXRhIGFib3V0IHRoZSBjZWxsLlxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQuZGF0ZSBUaGUgZGF0ZSB3aGljaCBoYXMgb3ZlcmZsb3dpbmcgZXZlbnRzXG4gICAgICogQHBhcmFtIHtDYWxlbmRhci53aWRnZXQuT3ZlcmZsb3dQb3B1cH0gZXZlbnQub3ZlcmZsb3dQb3B1cCBUaGUgb3ZlcmZsb3cgYFBvcHVwYC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25TaG93T3ZlcmZsb3dQb3B1cDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGNlbGw6IEhUTUxFbGVtZW50LCBjZWxsRGF0YTogRGF5Q2VsbCwgZGF0ZTogRGF0ZSwgb3ZlcmZsb3dQb3B1cDogT3ZlcmZsb3dQb3B1cCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogQSBoZWFkZXIgW3Rvb2xdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwjY29uZmlnLXRvb2xzKSBoYXMgYmVlbiBjbGlja2VkLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LlRvb2x9IGV2ZW50LnNvdXJjZSBUaGlzIFBhbmVsLlxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuVG9vbH0gZXZlbnQudG9vbCBUaGUgdG9vbCB3aGljaCBpcyBiZWluZyBjbGlja2VkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblRvb2xDbGljazogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVG9vbCwgdG9vbDogVG9vbCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIHdlZWsgbnVtYmVyIGNlbGwgaXMgY2xpY2tlZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5kYXRlIFRoZSBzdGFydCBkYXRlIG9mIHRoZSB3ZWVrLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyW119IGV2ZW50LndlZWsgVGhlIHdlZWsgYXJyYXkgYFt5ZWFyLCB3ZWVrTnVtYmVyXWAuXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIG9yaWdpbmFsIERPTSBldmVudC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25XZWVrQ2VsbENsaWNrOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgZGF0ZTogRGF0ZSwgd2VlazogbnVtYmVyW10sIGRvbUV2ZW50OiBFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBpcyBmaXJlZCBhcyBzb29uIGFzIGEgd2VlayByb3cgaXMgcmVxdWVzdGVkIHRvIGJlIGZsZXhlZC4gVGhlIGFuaW1hdGVkXG4gICAgICogdHJhbnNpdGlvbiB0byB0aGUgbmV3IGhlaWdodCB3aWxsIHN0aWxsIGJlIGluIHByb2dyZXNzLCBidXQgdGhlIHJvdydzIGZsZXggc3R5bGUgaXNcbiAgICAgKiBzZXQgdG8gaXRzIGV2ZW5seSBzaGFyZWQgZmxleCB2YWx1ZS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvTW9udGhWaWV3I2V2ZW50LXdlZWtGbGV4KVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LndlZWtTdGFydCBUaGUgc3RhcnQgZGF0ZSBvZiB0aGUgd2VlayBiZWluZyByZXZlcnRlZCB0byBhIGZsZXhlZCBoZWlnaHQuXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuZWxlbWVudCBUaGUgd2VlayByb3cgYmVpbmcgcmV2ZXJ0ZWQgdG8gYSBmbGV4ZWQgaGVpZ2h0LlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbldlZWtGbGV4OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgd2Vla1N0YXJ0OiBEYXRlLCBlbGVtZW50OiBIVE1MRWxlbWVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBpcyBmaXJlZCBhcyBzb29uIGFzIGEgd2VlayByb3cgaXMgcmVxdWVzdGVkIHRvIGJlIHNocmlua3dyYXBwZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L01vbnRoVmlldyNldmVudC13ZWVrU2hyaW5rd3JhcClcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC53ZWVrU3RhcnQgVGhlIHN0YXJ0IGRhdGUgb2YgdGhlIHdlZWsgYmVpbmcgc2hyaW5rd3JhcHBlZC5cbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC5lbGVtZW50IFRoZSB3ZWVrIHJvdyBiZWluZyBzaHJpbmt3cmFwcGVkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbldlZWtTaHJpbmt3cmFwOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgd2Vla1N0YXJ0OiBEYXRlLCBlbGVtZW50OiBIVE1MRWxlbWVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYW5kIGFwcGVuZCB0aGUgdW5kZXJseWluZyB3aWRnZXRcbiAgICAgKi9cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3RcbiAgICAgICAgICAgIG1lID0gdGhpcyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50UmVmLFxuICAgICAgICAgICAgICAgIGJyeW50dW1Db25maWdcbiAgICAgICAgICAgIH0gPSBtZSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZUNsYXNzLFxuICAgICAgICAgICAgICAgIGluc3RhbmNlTmFtZSxcbiAgICAgICAgICAgICAgICBicnludHVtQ29uZmlncyxcbiAgICAgICAgICAgICAgICBicnludHVtRXZlbnRzXG4gICAgICAgICAgICB9ID0gQnJ5bnR1bU1vbnRoVmlld0NvbXBvbmVudDtcblxuICAgICAgICBicnludHVtQ29uZmlncy5maWx0ZXIocHJvcCA9PiBwcm9wIGluIHRoaXMpLmZvckVhY2gocHJvcCA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBXcmFwcGVySGVscGVyLmFwcGx5UHJvcFZhbHVlKGJyeW50dW1Db25maWcsIHByb3AsIHRoaXNbcHJvcF0pO1xuICAgICAgICAgICAgaWYgKFsnZmVhdHVyZXMnLCAnY29uZmlnJ10uaW5jbHVkZXMocHJvcCkpIHtcbiAgICAgICAgICAgICAgICBXcmFwcGVySGVscGVyLmRldldhcm5pbmdDb25maWdQcm9wKGluc3RhbmNlTmFtZSwgcHJvcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGJyeW50dW1FdmVudHMuZmlsdGVyKGV2ZW50ID0+IHRoaXNbZXZlbnRdICYmIHRoaXNbZXZlbnRdLm9ic2VydmVycy5sZW5ndGggPiAwKS5mb3JFYWNoKGV2ZW50ID0+IHtcbiAgICAgICAgICAgIGNvbnN0XG4gICAgICAgICAgICAgICAgdW5jYXBpdGFsaXplID0gKHN0cjogc3RyaW5nKSA9PiBzdHIuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSksXG4gICAgICAgICAgICAgICAgZXZlbnROYW1lID0gKHN0cjogc3RyaW5nKSA9PiB1bmNhcGl0YWxpemUoc3RyLnNsaWNlKDIpKTtcblxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgYnJ5bnR1bUNvbmZpZy5saXN0ZW5lcnNbZXZlbnROYW1lKGV2ZW50KV0gPSBlID0+IHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgbWVbZXZlbnRdLmVtaXQoZSk7XG4gICAgICAgICAgICAgICAgLy8gRXZlbnRFbWl0dGVyIGRvZXMgbm90IHJldHVybiB2YWx1ZXMgaW4gdGhlIG5vcm1hbCB3YXksIHdvcmsgYXJvdW5kIGl0IGJ5IHNldHRpbmcgYHJldHVyblZhbHVlYCBmbGFnXG4gICAgICAgICAgICAgICAgLy8gaW4gQW5ndWxhciBsaXN0ZW5lcnNcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5yZXR1cm5WYWx1ZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIElmIGNvbXBvbmVudCBoYXMgbm8gY29udGFpbmVyIHNwZWNpZmllZCBpbiBjb25maWcgdGhlbiB1c2UgYWRvcHQgdG8gV3JhcHBlcidzIGVsZW1lbnRcbiAgICAgICAgY29uc3RcbiAgICAgICAgICAgIGNvbnRhaW5lclBhcmFtID0gW1xuICAgICAgICAgICAgICAgICdhZG9wdCcsXG4gICAgICAgICAgICAgICAgJ2FwcGVuZFRvJyxcbiAgICAgICAgICAgICAgICAnaW5zZXJ0QWZ0ZXInLFxuICAgICAgICAgICAgICAgICdpbnNlcnRCZWZvcmUnXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgXS5maW5kKHByb3AgPT4gYnJ5bnR1bUNvbmZpZ1twcm9wXSk7XG4gICAgICAgIGlmICghY29udGFpbmVyUGFyYW0pIHtcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZU5hbWUgPT09ICdCdXR0b24nIHx8IGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRSb290Tm9kZSgpIGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgICAgICAgICAgICAgIC8vIEJ1dHRvbiBzaG91bGQgYWx3YXlzIGJlIDxhPiBvciA8YnV0dG9uPiBpbnNpZGUgb3duZXIgZWxlbWVudFxuICAgICAgICAgICAgICAgIGJyeW50dW1Db25maWcuYXBwZW5kVG8gPSBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBicnludHVtQ29uZmlnLmFkb3B0ID0gZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgV3JhcHBlckhlbHBlci5kZXZXYXJuaW5nQ29udGFpbmVyKGluc3RhbmNlTmFtZSwgY29udGFpbmVyUGFyYW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBtZS5pbnN0YW5jZSA9IGluc3RhbmNlTmFtZSA9PT0gJ1dpZGdldCcgPyBXaWRnZXQuY3JlYXRlKGJyeW50dW1Db25maWcpIDogbmV3IGluc3RhbmNlQ2xhc3MoYnJ5bnR1bUNvbmZpZyk7XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXYXRjaCBmb3IgY2hhbmdlc1xuICAgICAqIEBwYXJhbSBjaGFuZ2VzXG4gICAgICovXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBjb25zdFxuICAgICAgICAgICAgeyBpbnN0YW5jZSB9ID0gdGhpcyxcbiAgICAgICAgICAgIHsgaW5zdGFuY2VOYW1lIH0gPSBCcnludHVtTW9udGhWaWV3Q29tcG9uZW50O1xuICAgICAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBjaGFuZ2VzXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGNoYW5nZXMpLmZvckVhY2goKFtwcm9wLCBjaGFuZ2VdKSA9PiB7XG4gICAgICAgICAgICBjb25zdFxuICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gKGNoYW5nZSBhcyBTaW1wbGVDaGFuZ2UpLmN1cnJlbnRWYWx1ZSxcbiAgICAgICAgICAgICAgICB7IGluc3RhbmNlIH0gPSB0aGlzLFxuICAgICAgICAgICAgICAgIHsgYnJ5bnR1bUNvbmZpZ3NPbmx5LCBicnludHVtUHJvcHMgfSA9IEJyeW50dW1Nb250aFZpZXdDb21wb25lbnQ7XG4gICAgICAgICAgICBpZiAoYnJ5bnR1bVByb3BzLmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICAgICAgICAgICAgV3JhcHBlckhlbHBlci5hcHBseVByb3BWYWx1ZShpbnN0YW5jZSwgcHJvcCwgbmV3VmFsdWUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoYnJ5bnR1bUNvbmZpZ3NPbmx5LmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICAgICAgICAgICAgICAgIFdyYXBwZXJIZWxwZXIuZGV2V2FybmluZ1VwZGF0ZVByb3AoaW5zdGFuY2VOYW1lLCBwcm9wKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3kgdGhlIGNvbXBvbmVudFxuICAgICAqL1xuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmICh0aGlzLmluc3RhbmNlICYmIHRoaXMuaW5zdGFuY2UuZGVzdHJveSkge1xuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZS5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=