@bryntum/taskboard-angular 7.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +44 -0
- package/bryntum-taskboard-angular.d.ts +5 -0
- package/bundles/bryntum-taskboard-angular.umd.js +56826 -0
- package/bundles/bryntum-taskboard-angular.umd.js.map +1 -0
- package/esm2015/bryntum-taskboard-angular.js +5 -0
- package/esm2015/lib/bryntum-button-group.component.js +725 -0
- package/esm2015/lib/bryntum-button.component.js +715 -0
- package/esm2015/lib/bryntum-chat-panel.component.js +839 -0
- package/esm2015/lib/bryntum-checkbox-group.component.js +854 -0
- package/esm2015/lib/bryntum-checkbox.component.js +805 -0
- package/esm2015/lib/bryntum-chip-view.component.js +727 -0
- package/esm2015/lib/bryntum-code-editor.component.js +818 -0
- package/esm2015/lib/bryntum-color-field.component.js +794 -0
- package/esm2015/lib/bryntum-column-combo.component.js +936 -0
- package/esm2015/lib/bryntum-column-filter-field.component.js +799 -0
- package/esm2015/lib/bryntum-column-picker-button.component.js +719 -0
- package/esm2015/lib/bryntum-column-scroll-button.component.js +719 -0
- package/esm2015/lib/bryntum-combo.component.js +932 -0
- package/esm2015/lib/bryntum-container.component.js +681 -0
- package/esm2015/lib/bryntum-date-field.component.js +831 -0
- package/esm2015/lib/bryntum-date-picker.component.js +1008 -0
- package/esm2015/lib/bryntum-date-range-field.component.js +835 -0
- package/esm2015/lib/bryntum-date-time-field.component.js +752 -0
- package/esm2015/lib/bryntum-demo-code-editor.component.js +830 -0
- package/esm2015/lib/bryntum-demo-header.component.js +171 -0
- package/esm2015/lib/bryntum-display-field.component.js +772 -0
- package/esm2015/lib/bryntum-duration-field.component.js +815 -0
- package/esm2015/lib/bryntum-editor.component.js +823 -0
- package/esm2015/lib/bryntum-field-filter-picker-group.component.js +758 -0
- package/esm2015/lib/bryntum-field-filter-picker.component.js +740 -0
- package/esm2015/lib/bryntum-field-set.component.js +810 -0
- package/esm2015/lib/bryntum-file-field.component.js +776 -0
- package/esm2015/lib/bryntum-file-picker.component.js +709 -0
- package/esm2015/lib/bryntum-filter-field.component.js +803 -0
- package/esm2015/lib/bryntum-fullscreen-button.component.js +53 -0
- package/esm2015/lib/bryntum-hint.component.js +856 -0
- package/esm2015/lib/bryntum-label.component.js +584 -0
- package/esm2015/lib/bryntum-list.component.js +715 -0
- package/esm2015/lib/bryntum-menu.component.js +883 -0
- package/esm2015/lib/bryntum-month-picker.component.js +818 -0
- package/esm2015/lib/bryntum-number-field.component.js +800 -0
- package/esm2015/lib/bryntum-paging-toolbar.component.js +736 -0
- package/esm2015/lib/bryntum-panel.component.js +794 -0
- package/esm2015/lib/bryntum-password-field.component.js +768 -0
- package/esm2015/lib/bryntum-project-combo.component.js +940 -0
- package/esm2015/lib/bryntum-radio-group.component.js +826 -0
- package/esm2015/lib/bryntum-radio.component.js +805 -0
- package/esm2015/lib/bryntum-resources-combo.component.js +936 -0
- package/esm2015/lib/bryntum-scheduler-project-combo.component.js +936 -0
- package/esm2015/lib/bryntum-slide-toggle.component.js +805 -0
- package/esm2015/lib/bryntum-slider.component.js +661 -0
- package/esm2015/lib/bryntum-splitter.component.js +618 -0
- package/esm2015/lib/bryntum-swimlane-combo.component.js +936 -0
- package/esm2015/lib/bryntum-swimlane-filter-field.component.js +807 -0
- package/esm2015/lib/bryntum-swimlane-picker-button.component.js +719 -0
- package/esm2015/lib/bryntum-swimlane-scroll-button.component.js +719 -0
- package/esm2015/lib/bryntum-tab-panel.component.js +842 -0
- package/esm2015/lib/bryntum-tag-combo.component.js +940 -0
- package/esm2015/lib/bryntum-task-board-base.component.js +1678 -0
- package/esm2015/lib/bryntum-task-board-field-filter-picker-group.component.js +762 -0
- package/esm2015/lib/bryntum-task-board-field-filter-picker.component.js +732 -0
- package/esm2015/lib/bryntum-task-board-project-model.component.js +690 -0
- package/esm2015/lib/bryntum-task-board.component.js +1682 -0
- package/esm2015/lib/bryntum-task-color-combo.component.js +794 -0
- package/esm2015/lib/bryntum-task-filter-field.component.js +807 -0
- package/esm2015/lib/bryntum-text-area-field.component.js +776 -0
- package/esm2015/lib/bryntum-text-area-picker-field.component.js +798 -0
- package/esm2015/lib/bryntum-text-field.component.js +783 -0
- package/esm2015/lib/bryntum-time-field.component.js +819 -0
- package/esm2015/lib/bryntum-time-picker.component.js +709 -0
- package/esm2015/lib/bryntum-todo-list-field.component.js +780 -0
- package/esm2015/lib/bryntum-toolbar.component.js +732 -0
- package/esm2015/lib/bryntum-undo-redo.component.js +689 -0
- package/esm2015/lib/bryntum-widget.component.js +580 -0
- package/esm2015/lib/bryntum-year-picker.component.js +827 -0
- package/esm2015/lib/bryntum-zoom-slider.component.js +665 -0
- package/esm2015/lib/taskboard.module.js +374 -0
- package/esm2015/lib/wrapper.helper.js +74 -0
- package/esm2015/public-api.js +76 -0
- package/fesm2015/bryntum-taskboard-angular.js +56188 -0
- package/fesm2015/bryntum-taskboard-angular.js.map +1 -0
- package/lib/bryntum-button-group.component.d.ts +860 -0
- package/lib/bryntum-button.component.d.ts +845 -0
- package/lib/bryntum-chat-panel.component.d.ts +1060 -0
- package/lib/bryntum-checkbox-group.component.d.ts +1094 -0
- package/lib/bryntum-checkbox.component.d.ts +968 -0
- package/lib/bryntum-chip-view.component.d.ts +872 -0
- package/lib/bryntum-code-editor.component.d.ts +1045 -0
- package/lib/bryntum-color-field.component.d.ts +965 -0
- package/lib/bryntum-column-combo.component.d.ts +1208 -0
- package/lib/bryntum-column-filter-field.component.d.ts +988 -0
- package/lib/bryntum-column-picker-button.component.d.ts +853 -0
- package/lib/bryntum-column-scroll-button.component.d.ts +853 -0
- package/lib/bryntum-combo.component.d.ts +1199 -0
- package/lib/bryntum-container.component.d.ts +822 -0
- package/lib/bryntum-date-field.component.d.ts +1025 -0
- package/lib/bryntum-date-picker.component.d.ts +1338 -0
- package/lib/bryntum-date-range-field.component.d.ts +1027 -0
- package/lib/bryntum-date-time-field.component.d.ts +912 -0
- package/lib/bryntum-demo-code-editor.component.d.ts +1061 -0
- package/lib/bryntum-demo-header.component.d.ts +29 -0
- package/lib/bryntum-display-field.component.d.ts +949 -0
- package/lib/bryntum-duration-field.component.d.ts +1008 -0
- package/lib/bryntum-editor.component.d.ts +969 -0
- package/lib/bryntum-field-filter-picker-group.component.d.ts +935 -0
- package/lib/bryntum-field-filter-picker.component.d.ts +903 -0
- package/lib/bryntum-field-set.component.d.ts +1038 -0
- package/lib/bryntum-file-field.component.d.ts +952 -0
- package/lib/bryntum-file-picker.component.d.ts +847 -0
- package/lib/bryntum-filter-field.component.d.ts +993 -0
- package/lib/bryntum-fullscreen-button.component.d.ts +20 -0
- package/lib/bryntum-hint.component.d.ts +1117 -0
- package/lib/bryntum-label.component.d.ts +683 -0
- package/lib/bryntum-list.component.d.ts +849 -0
- package/lib/bryntum-menu.component.d.ts +1129 -0
- package/lib/bryntum-month-picker.component.d.ts +1034 -0
- package/lib/bryntum-number-field.component.d.ts +995 -0
- package/lib/bryntum-paging-toolbar.component.d.ts +886 -0
- package/lib/bryntum-panel.component.d.ts +1015 -0
- package/lib/bryntum-password-field.component.d.ts +939 -0
- package/lib/bryntum-project-combo.component.d.ts +1209 -0
- package/lib/bryntum-radio-group.component.d.ts +1068 -0
- package/lib/bryntum-radio.component.d.ts +968 -0
- package/lib/bryntum-resources-combo.component.d.ts +1207 -0
- package/lib/bryntum-scheduler-project-combo.component.d.ts +1201 -0
- package/lib/bryntum-slide-toggle.component.d.ts +968 -0
- package/lib/bryntum-slider.component.d.ts +776 -0
- package/lib/bryntum-splitter.component.d.ts +714 -0
- package/lib/bryntum-swimlane-combo.component.d.ts +1207 -0
- package/lib/bryntum-swimlane-filter-field.component.d.ts +1001 -0
- package/lib/bryntum-swimlane-picker-button.component.d.ts +853 -0
- package/lib/bryntum-swimlane-scroll-button.component.d.ts +853 -0
- package/lib/bryntum-tab-panel.component.d.ts +1065 -0
- package/lib/bryntum-tag-combo.component.d.ts +1212 -0
- package/lib/bryntum-task-board-base.component.d.ts +1921 -0
- package/lib/bryntum-task-board-field-filter-picker-group.component.d.ts +941 -0
- package/lib/bryntum-task-board-field-filter-picker.component.d.ts +889 -0
- package/lib/bryntum-task-board-project-model.component.d.ts +732 -0
- package/lib/bryntum-task-board.component.d.ts +1923 -0
- package/lib/bryntum-task-color-combo.component.d.ts +965 -0
- package/lib/bryntum-task-filter-field.component.d.ts +1001 -0
- package/lib/bryntum-text-area-field.component.d.ts +951 -0
- package/lib/bryntum-text-area-picker-field.component.d.ts +972 -0
- package/lib/bryntum-text-field.component.d.ts +957 -0
- package/lib/bryntum-time-field.component.d.ts +1006 -0
- package/lib/bryntum-time-picker.component.d.ts +853 -0
- package/lib/bryntum-todo-list-field.component.d.ts +955 -0
- package/lib/bryntum-toolbar.component.d.ts +879 -0
- package/lib/bryntum-undo-redo.component.d.ts +831 -0
- package/lib/bryntum-widget.component.d.ts +678 -0
- package/lib/bryntum-year-picker.component.d.ts +1049 -0
- package/lib/bryntum-zoom-slider.component.d.ts +784 -0
- package/lib/taskboard.module.d.ts +77 -0
- package/lib/wrapper.helper.d.ts +26 -0
- package/package.json +33 -0
- package/public-api.d.ts +72 -0
|
@@ -0,0 +1,1678 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
2
|
+
/**
|
|
3
|
+
* Angular wrapper for Bryntum TaskBoardBase
|
|
4
|
+
*/
|
|
5
|
+
import { Component, EventEmitter, Output, Input } from '@angular/core';
|
|
6
|
+
import WrapperHelper from './wrapper.helper';
|
|
7
|
+
import { TaskBoardBase, Widget } from '@bryntum/taskboard';
|
|
8
|
+
import { StringHelper } from '@bryntum/taskboard';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
export class BryntumTaskBoardBaseComponent {
|
|
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
|
+
* Triggered when a task is "activated" by pressing `Enter` or double clicking it.
|
|
23
|
+
* ...
|
|
24
|
+
* [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-activateTask)
|
|
25
|
+
* @param {object} event Event object
|
|
26
|
+
* @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
|
|
27
|
+
* @param {TaskBoard.model.TaskModel} event.taskRecord Task record
|
|
28
|
+
* @param {MouseEvent} event.event Browser event
|
|
29
|
+
*/
|
|
30
|
+
this.onActivateTask = new EventEmitter();
|
|
31
|
+
/**
|
|
32
|
+
* Fires on the owning TaskBoard before column dragging starts. Return `false` to prevent the action
|
|
33
|
+
* @param {object} event Event object
|
|
34
|
+
* @param {TaskBoard.view.TaskBoard} event.source Owning TaskBoard
|
|
35
|
+
* @param {TaskBoard.model.ColumnModel} event.columnRecord Column to be dragged
|
|
36
|
+
*/
|
|
37
|
+
this.onBeforeColumnDrag = new EventEmitter();
|
|
38
|
+
/**
|
|
39
|
+
* Fires on the owning TaskBoard when dropping a column, before the operation completes. Handles async
|
|
40
|
+
* listeners, returning `false` from one will abort the operation
|
|
41
|
+
* ...
|
|
42
|
+
* [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-beforeColumnDrop)
|
|
43
|
+
* @param {object} event Event object
|
|
44
|
+
* @param {TaskBoard.view.TaskBoard} event.source Owning TaskBoard
|
|
45
|
+
* @param {TaskBoard.model.ColumnModel} event.columnRecord Dropped column
|
|
46
|
+
* @param {TaskBoard.model.ColumnModel} event.beforeColumn Dropped before this column
|
|
47
|
+
*/
|
|
48
|
+
this.onBeforeColumnDrop = new EventEmitter();
|
|
49
|
+
/**
|
|
50
|
+
* This event is fired prior to starting a column resize gesture. The resize is canceled if a listener returns
|
|
51
|
+
* `false`.
|
|
52
|
+
* @param {object} event Event object
|
|
53
|
+
* @param {TaskBoard.view.TaskBoard} event.source The TaskBoard instance
|
|
54
|
+
* @param {TaskBoard.model.ColumnModel} event.column The column
|
|
55
|
+
* @param {Event} event.domEvent The browser event
|
|
56
|
+
*/
|
|
57
|
+
this.onBeforeColumnResize = new EventEmitter();
|
|
58
|
+
/**
|
|
59
|
+
* Fires before an object is destroyed.
|
|
60
|
+
* @param {object} event Event object
|
|
61
|
+
* @param {Core.Base} event.source The Object that is being destroyed.
|
|
62
|
+
*/
|
|
63
|
+
this.onBeforeDestroy = new EventEmitter();
|
|
64
|
+
/**
|
|
65
|
+
* Triggered before a widget is hidden. Return `false` to prevent the action.
|
|
66
|
+
* @param {object} event Event object
|
|
67
|
+
* @param {Core.widget.Widget} event.source The widget being hidden.
|
|
68
|
+
*/
|
|
69
|
+
this.onBeforeHide = new EventEmitter();
|
|
70
|
+
/**
|
|
71
|
+
* Triggered before a new [responsiveState](https://bryntum.com/products/taskboard/docs/api/Core/widget/mixin/Responsive#config-responsiveState) is applied.
|
|
72
|
+
* @param {object} event Event object
|
|
73
|
+
* @param {Core.widget.Widget} event.source The widget whose `responsiveState` is to be changed
|
|
74
|
+
* @param {string} event.state The new value for the widget's `responsiveState`
|
|
75
|
+
* @param {string} event.oldState The previous value for the widget's `responsiveState`
|
|
76
|
+
*/
|
|
77
|
+
this.onBeforeResponsiveStateChange = 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
|
+
* Fires on the owning TaskBoard before displaying an inline editor. Returning `false` stops the editor from
|
|
86
|
+
* being shown.
|
|
87
|
+
* ...
|
|
88
|
+
* [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-beforeSimpleTaskEdit)
|
|
89
|
+
* @param {object} event Event object
|
|
90
|
+
* @param {TaskBoard.view.TaskBoard} event.source The task board
|
|
91
|
+
* @param {TaskBoard.feature.SimpleTaskEdit} event.simpleTaskEdit The simpleTaskEdit feature
|
|
92
|
+
* @param {TaskBoard.model.TaskModel} event.taskRecord The record about to be shown in the editor
|
|
93
|
+
* @param {string} event.field Field name being edited
|
|
94
|
+
*/
|
|
95
|
+
this.onBeforeSimpleTaskEdit = new EventEmitter();
|
|
96
|
+
/**
|
|
97
|
+
* Fired before state is applied to the source. Allows editing the state object or preventing the operation.
|
|
98
|
+
* @param {object} event Event object
|
|
99
|
+
* @param {any} event.state State object config
|
|
100
|
+
*/
|
|
101
|
+
this.onBeforeStateApply = new EventEmitter();
|
|
102
|
+
/**
|
|
103
|
+
* Fired before state is saved by the StateProvider. Allows editing the state object or preventing the operation.
|
|
104
|
+
* @param {object} event Event object
|
|
105
|
+
* @param {any} event.state State object config
|
|
106
|
+
*/
|
|
107
|
+
this.onBeforeStateSave = new EventEmitter();
|
|
108
|
+
/**
|
|
109
|
+
* Fires on the owning TaskBoard before task dragging starts. Return `false` to prevent the action
|
|
110
|
+
* @param {object} event Event object
|
|
111
|
+
* @param {TaskBoard.view.TaskBoard} event.source Owning TaskBoard
|
|
112
|
+
* @param {TaskBoard.model.TaskModel[]} event.taskRecords Tasks to be dragged
|
|
113
|
+
* @param {Event} event.domEvent The mouse event
|
|
114
|
+
*/
|
|
115
|
+
this.onBeforeTaskDrag = new EventEmitter();
|
|
116
|
+
/**
|
|
117
|
+
* Fires on the owning TaskBoard when tasks are dropped, before the operation completes. Handles async
|
|
118
|
+
* listeners, returning `false` from one will abort the operation
|
|
119
|
+
* ...
|
|
120
|
+
* [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-beforeTaskDrop)
|
|
121
|
+
* @param {object} event Event object
|
|
122
|
+
* @param {TaskBoard.view.TaskBoard} event.source Owning TaskBoard
|
|
123
|
+
* @param {TaskBoard.model.TaskModel[]} event.taskRecords Dropped tasks
|
|
124
|
+
* @param {TaskBoard.model.ColumnModel} event.targetColumn Dropped on this column
|
|
125
|
+
* @param {TaskBoard.model.SwimlaneModel} event.targetSwimlane Dropped in this swimlane (if used)
|
|
126
|
+
* @param {Event} event.domEvent The mouse event
|
|
127
|
+
*/
|
|
128
|
+
this.onBeforeTaskDrop = new EventEmitter();
|
|
129
|
+
/**
|
|
130
|
+
* Fires on the owning TaskBoard before a task is displayed in an editor.
|
|
131
|
+
* ...
|
|
132
|
+
* [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-beforeTaskEdit)
|
|
133
|
+
* @param {object} event Event object
|
|
134
|
+
* @param {TaskBoard.view.TaskBoard} event.source The owning TaskBoard
|
|
135
|
+
* @param {TaskBoard.model.TaskModel} event.taskRecord The record about to be shown in the task editor
|
|
136
|
+
*/
|
|
137
|
+
this.onBeforeTaskEdit = new EventEmitter();
|
|
138
|
+
/**
|
|
139
|
+
* Fires on the owning TaskBoard when the editor for a task is available, but before it is populated with data
|
|
140
|
+
* and shown. Allows manipulating fields etc.
|
|
141
|
+
* ...
|
|
142
|
+
* [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-beforeTaskEditShow)
|
|
143
|
+
* @param {object} event Event object
|
|
144
|
+
* @param {TaskBoard.view.TaskBoard} event.source The owning TaskBoard
|
|
145
|
+
* @param {TaskBoard.model.TaskModel} event.taskRecord The record about to be shown in the task editor
|
|
146
|
+
* @param {TaskBoard.widget.TaskEditor} event.editor The editor
|
|
147
|
+
*/
|
|
148
|
+
this.onBeforeTaskEditShow = new EventEmitter();
|
|
149
|
+
/**
|
|
150
|
+
* Triggered when one or more tasks are to be removed by a call to `removeTask()`.
|
|
151
|
+
* ...
|
|
152
|
+
* [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-beforeTaskRemove)
|
|
153
|
+
* @param {object} event Event object
|
|
154
|
+
* @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
|
|
155
|
+
* @param {TaskBoard.model.TaskModel[]} event.taskRecords Task records to be removed
|
|
156
|
+
*/
|
|
157
|
+
this.onBeforeTaskRemove = new EventEmitter();
|
|
158
|
+
/**
|
|
159
|
+
* Fires when any other event is fired from the object.
|
|
160
|
+
* ...
|
|
161
|
+
* [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-catchAll)
|
|
162
|
+
* @param {object} event Event object
|
|
163
|
+
* @param {{[key: string]: any, type: string}} event.event The Object that contains event details
|
|
164
|
+
* @param {string} event.event.type The type of the event which is caught by the listener
|
|
165
|
+
*/
|
|
166
|
+
this.onCatchAll = new EventEmitter();
|
|
167
|
+
/**
|
|
168
|
+
* This event fires on the owning TaskBoard when an item is selected in the column header menu.
|
|
169
|
+
* @param {object} event Event object
|
|
170
|
+
* @param {TaskBoard.view.TaskBoard} event.source The grid
|
|
171
|
+
* @param {Core.widget.Menu} event.menu The menu
|
|
172
|
+
* @param {Core.widget.MenuItem} event.item Selected menu item
|
|
173
|
+
* @param {TaskBoard.model.ColumnModel} event.columnRecord The column
|
|
174
|
+
*/
|
|
175
|
+
this.onCellMenuItem = new EventEmitter();
|
|
176
|
+
/**
|
|
177
|
+
* This event fires on the owning TaskBoard after the context menu is shown for a column header.
|
|
178
|
+
* @param {object} event Event object
|
|
179
|
+
* @param {TaskBoard.view.TaskBoard} event.source The grid
|
|
180
|
+
* @param {Core.widget.Menu} event.menu The menu
|
|
181
|
+
* @param {Record<string, MenuItemEntry>} event.items Menu item configs
|
|
182
|
+
* @param {TaskBoard.model.ColumnModel} event.columnRecord The column
|
|
183
|
+
*/
|
|
184
|
+
this.onCellMenuShow = new EventEmitter();
|
|
185
|
+
/**
|
|
186
|
+
* This event fires on the owning TaskBoard when a check item is toggled in the column header menu.
|
|
187
|
+
* @param {object} event Event object
|
|
188
|
+
* @param {TaskBoard.view.TaskBoard} event.source The grid
|
|
189
|
+
* @param {Core.widget.Menu} event.menu The menu
|
|
190
|
+
* @param {Core.widget.MenuItem} event.item Selected menu item
|
|
191
|
+
* @param {TaskBoard.model.ColumnModel} event.columnRecord The column
|
|
192
|
+
* @param {boolean} event.checked Checked or not
|
|
193
|
+
*/
|
|
194
|
+
this.onCellMenuToggleItem = new EventEmitter();
|
|
195
|
+
/**
|
|
196
|
+
* Fires when a Panel is collapsed using the [collapsible](https://bryntum.com/products/taskboard/docs/api/Core/widget/Panel#config-collapsible) setting.
|
|
197
|
+
* @param {object} event Event object
|
|
198
|
+
* @param {Core.widget.Panel} event.source This Panel.
|
|
199
|
+
*/
|
|
200
|
+
this.onCollapse = new EventEmitter();
|
|
201
|
+
/**
|
|
202
|
+
* Triggered when a column is collapsed.
|
|
203
|
+
* @param {object} event Event object
|
|
204
|
+
* @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
|
|
205
|
+
* @param {TaskBoard.model.ColumnModel} event.columnRecord Column record
|
|
206
|
+
*/
|
|
207
|
+
this.onColumnCollapse = new EventEmitter();
|
|
208
|
+
/**
|
|
209
|
+
* Fires on the owning TaskBoard when a column is dragged, if the drag leads to a change compared to
|
|
210
|
+
* the last columnDrag event.
|
|
211
|
+
* ...
|
|
212
|
+
* [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-columnDrag)
|
|
213
|
+
* @param {object} event Event object
|
|
214
|
+
* @param {TaskBoard.view.TaskBoard} event.source Owning TaskBoard
|
|
215
|
+
* @param {TaskBoard.model.ColumnModel} event.columnRecord Column being dragged
|
|
216
|
+
* @param {TaskBoard.model.ColumnModel} event.beforeColumn Insert before this column on drop, `null` if last
|
|
217
|
+
*/
|
|
218
|
+
this.onColumnDrag = new EventEmitter();
|
|
219
|
+
/**
|
|
220
|
+
* Fires on the owning TaskBoard when a drag operation is aborted (invalid drop or aborted using ESC)
|
|
221
|
+
* @param {object} event Event object
|
|
222
|
+
* @param {TaskBoard.view.TaskBoard} event.source Owning TaskBoard
|
|
223
|
+
* @param {TaskBoard.model.ColumnModel} event.columnRecord Dragged column
|
|
224
|
+
*/
|
|
225
|
+
this.onColumnDragAbort = new EventEmitter();
|
|
226
|
+
/**
|
|
227
|
+
* Fires on the owning TaskBoard when a previously started drag operation ends, no matter the
|
|
228
|
+
* outcome of it (whether valid, invalid or aborted)
|
|
229
|
+
* @param {object} event Event object
|
|
230
|
+
* @param {TaskBoard.view.TaskBoard} event.source Owning TaskBoard
|
|
231
|
+
* @param {TaskBoard.model.ColumnModel} event.columnRecord Affected column
|
|
232
|
+
*/
|
|
233
|
+
this.onColumnDragEnd = new EventEmitter();
|
|
234
|
+
/**
|
|
235
|
+
* Fires on the owning TaskBoard when column dragging starts
|
|
236
|
+
* @param {object} event Event object
|
|
237
|
+
* @param {TaskBoard.view.TaskBoard} event.source Owning TaskBoard
|
|
238
|
+
* @param {TaskBoard.model.ColumnModel} event.columnRecord Column to be dragged
|
|
239
|
+
*/
|
|
240
|
+
this.onColumnDragStart = new EventEmitter();
|
|
241
|
+
/**
|
|
242
|
+
* Fires on the owning TaskBoard when a column is successfully dropped (after the drop transition
|
|
243
|
+
* has finished)
|
|
244
|
+
* @param {object} event Event object
|
|
245
|
+
* @param {TaskBoard.view.TaskBoard} event.source Owning TaskBoard
|
|
246
|
+
* @param {TaskBoard.model.ColumnModel} event.columnRecord Dropped column
|
|
247
|
+
* @param {TaskBoard.model.ColumnModel} event.beforeColumn Dropped before this column (`null` if last)
|
|
248
|
+
* @param {TaskBoard.model.SwimlaneModel} event.targetSwimlane Dropped in this swimlane (if used)
|
|
249
|
+
*/
|
|
250
|
+
this.onColumnDrop = new EventEmitter();
|
|
251
|
+
/**
|
|
252
|
+
* Triggered when a column is expanded.
|
|
253
|
+
* @param {object} event Event object
|
|
254
|
+
* @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
|
|
255
|
+
* @param {TaskBoard.model.ColumnModel} event.columnRecord Column record
|
|
256
|
+
*/
|
|
257
|
+
this.onColumnExpand = new EventEmitter();
|
|
258
|
+
/**
|
|
259
|
+
* Triggered when the column filter is hidden.
|
|
260
|
+
* @param {object} event Event object
|
|
261
|
+
* @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
|
|
262
|
+
* @param {TaskBoard.model.ColumnModel} event.columnRecord Column record
|
|
263
|
+
*/
|
|
264
|
+
this.onColumnFilterHide = new EventEmitter();
|
|
265
|
+
/**
|
|
266
|
+
* Triggered when the column filter is displayed.
|
|
267
|
+
* @param {object} event Event object
|
|
268
|
+
* @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
|
|
269
|
+
* @param {TaskBoard.model.ColumnModel} event.columnRecord Column record
|
|
270
|
+
*/
|
|
271
|
+
this.onColumnFilterShow = new EventEmitter();
|
|
272
|
+
/**
|
|
273
|
+
* Triggered when the column filter visibility is toggled.
|
|
274
|
+
* @param {object} event Event object
|
|
275
|
+
* @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
|
|
276
|
+
* @param {TaskBoard.model.ColumnModel} event.columnRecord Column record
|
|
277
|
+
* @param {boolean} event.visible True if filter popup is visible, false otherwise
|
|
278
|
+
*/
|
|
279
|
+
this.onColumnFilterToggle = new EventEmitter();
|
|
280
|
+
/**
|
|
281
|
+
* Triggered when a column header is clicked.
|
|
282
|
+
* ...
|
|
283
|
+
* [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-columnHeaderClick)
|
|
284
|
+
* @param {object} event Event object
|
|
285
|
+
* @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
|
|
286
|
+
* @param {TaskBoard.model.ColumnModel} event.columnRecord Column record
|
|
287
|
+
* @param {MouseEvent} event.event Browser event
|
|
288
|
+
*/
|
|
289
|
+
this.onColumnHeaderClick = new EventEmitter();
|
|
290
|
+
/**
|
|
291
|
+
* Triggered when a column header is right-clicked.
|
|
292
|
+
* ...
|
|
293
|
+
* [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-columnHeaderContextMenu)
|
|
294
|
+
* @param {object} event Event object
|
|
295
|
+
* @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
|
|
296
|
+
* @param {TaskBoard.model.ColumnModel} event.columnRecord Column record
|
|
297
|
+
* @param {MouseEvent} event.event Browser event
|
|
298
|
+
*/
|
|
299
|
+
this.onColumnHeaderContextMenu = new EventEmitter();
|
|
300
|
+
/**
|
|
301
|
+
* Triggered when a column header is double-clicked.
|
|
302
|
+
* ...
|
|
303
|
+
* [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-columnHeaderDblClick)
|
|
304
|
+
* @param {object} event Event object
|
|
305
|
+
* @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
|
|
306
|
+
* @param {TaskBoard.model.ColumnModel} event.columnRecord Column record
|
|
307
|
+
* @param {MouseEvent} event.event Browser event
|
|
308
|
+
*/
|
|
309
|
+
this.onColumnHeaderDblClick = new EventEmitter();
|
|
310
|
+
/**
|
|
311
|
+
* This event fires on the owning TaskBoard before the menu is shown for a column header.
|
|
312
|
+
* Allows manipulation of the items to show in the same way as in the [processItems](https://bryntum.com/products/taskboard/docs/api/TaskBoard/feature/ColumnHeaderMenu#config-processItems).
|
|
313
|
+
* ...
|
|
314
|
+
* [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-columnHeaderMenuBeforeShow)
|
|
315
|
+
* @param {object} event Event object
|
|
316
|
+
* @param {TaskBoard.view.TaskBoard} event.source The grid
|
|
317
|
+
* @param {Core.widget.Menu} event.menu The menu
|
|
318
|
+
* @param {Record<string, MenuItemEntry>} event.items Menu item configs
|
|
319
|
+
* @param {TaskBoard.model.ColumnModel} event.columnRecord The column
|
|
320
|
+
*/
|
|
321
|
+
this.onColumnHeaderMenuBeforeShow = new EventEmitter();
|
|
322
|
+
/**
|
|
323
|
+
* This event is fired after a resize gesture is completed.
|
|
324
|
+
* @param {object} event Event object
|
|
325
|
+
* @param {TaskBoard.view.TaskBoard} event.source The TaskBoard instance
|
|
326
|
+
* @param {TaskBoard.model.ColumnModel} event.column The column
|
|
327
|
+
* @param {Event} event.domEvent The browser event
|
|
328
|
+
*/
|
|
329
|
+
this.onColumnResize = new EventEmitter();
|
|
330
|
+
/**
|
|
331
|
+
* This event is fired when a column resize gesture starts.
|
|
332
|
+
* @param {object} event Event object
|
|
333
|
+
* @param {TaskBoard.view.TaskBoard} event.source The TaskBoard instance
|
|
334
|
+
* @param {TaskBoard.model.ColumnModel} event.column The column
|
|
335
|
+
* @param {Event} event.domEvent The browser event
|
|
336
|
+
*/
|
|
337
|
+
this.onColumnResizeStart = new EventEmitter();
|
|
338
|
+
/**
|
|
339
|
+
* Triggered when a column title element is clicked.
|
|
340
|
+
* ...
|
|
341
|
+
* [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-columnTitleClick)
|
|
342
|
+
* @param {object} event Event object
|
|
343
|
+
* @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
|
|
344
|
+
* @param {TaskBoard.model.ColumnModel} event.columnRecord Column record
|
|
345
|
+
* @param {MouseEvent} event.event Browser event
|
|
346
|
+
*/
|
|
347
|
+
this.onColumnTitleClick = new EventEmitter();
|
|
348
|
+
/**
|
|
349
|
+
* Triggered when a column title element is right-clicked.
|
|
350
|
+
* ...
|
|
351
|
+
* [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-columnTitleContextMenu)
|
|
352
|
+
* @param {object} event Event object
|
|
353
|
+
* @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
|
|
354
|
+
* @param {TaskBoard.model.ColumnModel} event.columnRecord Column record
|
|
355
|
+
* @param {MouseEvent} event.event Browser event
|
|
356
|
+
*/
|
|
357
|
+
this.onColumnTitleContextMenu = new EventEmitter();
|
|
358
|
+
/**
|
|
359
|
+
* Triggered when a column title element is double-clicked.
|
|
360
|
+
* ...
|
|
361
|
+
* [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-columnTitleDblClick)
|
|
362
|
+
* @param {object} event Event object
|
|
363
|
+
* @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
|
|
364
|
+
* @param {TaskBoard.model.ColumnModel} event.columnRecord Column record
|
|
365
|
+
* @param {MouseEvent} event.event Browser event
|
|
366
|
+
*/
|
|
367
|
+
this.onColumnTitleDblClick = new EventEmitter();
|
|
368
|
+
/**
|
|
369
|
+
* Triggered when the column collapsed state is toggled.
|
|
370
|
+
* @param {object} event Event object
|
|
371
|
+
* @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
|
|
372
|
+
* @param {TaskBoard.model.ColumnModel} event.columnRecord Column record
|
|
373
|
+
* @param {boolean} event.collapse `true` if the column is being collapsed.
|
|
374
|
+
*/
|
|
375
|
+
this.onColumnToggle = new EventEmitter();
|
|
376
|
+
/**
|
|
377
|
+
* Fires when an object is destroyed.
|
|
378
|
+
* @param {object} event Event object
|
|
379
|
+
* @param {Core.Base} event.source The Object that is being destroyed.
|
|
380
|
+
*/
|
|
381
|
+
this.onDestroy = new EventEmitter();
|
|
382
|
+
/**
|
|
383
|
+
* Fires when a field is mutated and the state of the [hasChanges](https://bryntum.com/products/taskboard/docs/api/Core/widget/Container#property-hasChanges) property changes
|
|
384
|
+
* @param {object} event Event object
|
|
385
|
+
* @param {Core.widget.Container} event.source The container.
|
|
386
|
+
* @param {boolean} event.dirty The dirty state of the Container - `true` if there are any fields which have been changed since initial load.
|
|
387
|
+
*/
|
|
388
|
+
this.onDirtyStateChange = new EventEmitter();
|
|
389
|
+
/**
|
|
390
|
+
* Triggered when a widget's [element](https://bryntum.com/products/taskboard/docs/api/Core/widget/Widget#property-element) is available.
|
|
391
|
+
* @param {object} event Event object
|
|
392
|
+
* @param {HTMLElement} event.element The Widget's element.
|
|
393
|
+
*/
|
|
394
|
+
this.onElementCreated = new EventEmitter();
|
|
395
|
+
/**
|
|
396
|
+
* Fires when a Panel is expanded using the [collapsible](https://bryntum.com/products/taskboard/docs/api/Core/widget/Panel#config-collapsible) setting.
|
|
397
|
+
* @param {object} event Event object
|
|
398
|
+
* @param {Core.widget.Panel} event.source This Panel.
|
|
399
|
+
*/
|
|
400
|
+
this.onExpand = new EventEmitter();
|
|
401
|
+
/**
|
|
402
|
+
* Fired when focus enters this Widget.
|
|
403
|
+
* @param {object} event Event object
|
|
404
|
+
* @param {Core.widget.Widget} event.source This Widget
|
|
405
|
+
* @param {HTMLElement} event.fromElement The element which lost focus.
|
|
406
|
+
* @param {HTMLElement} event.toElement The element which gained focus.
|
|
407
|
+
* @param {Core.widget.Widget} event.fromWidget The widget which lost focus.
|
|
408
|
+
* @param {Core.widget.Widget} event.toWidget The widget which gained focus.
|
|
409
|
+
* @param {boolean} event.backwards `true` if the `toElement` is before the `fromElement` in document order.
|
|
410
|
+
*/
|
|
411
|
+
this.onFocusIn = new EventEmitter();
|
|
412
|
+
/**
|
|
413
|
+
* Fired when focus exits this Widget's ownership tree. This is different from a `blur` event.
|
|
414
|
+
* focus moving from within this Widget's ownership tree, even if there are floating widgets
|
|
415
|
+
* will not trigger this event. This is when focus exits this widget completely.
|
|
416
|
+
* @param {object} event Event object
|
|
417
|
+
* @param {Core.widget.Widget} event.source This Widget
|
|
418
|
+
* @param {HTMLElement} event.fromElement The element which lost focus.
|
|
419
|
+
* @param {HTMLElement} event.toElement The element which gained focus.
|
|
420
|
+
* @param {Core.widget.Widget} event.fromWidget The widget which lost focus.
|
|
421
|
+
* @param {Core.widget.Widget} event.toWidget The widget which gained focus.
|
|
422
|
+
* @param {boolean} event.backwards `true` if the `toElement` is before the `fromElement` in document order.
|
|
423
|
+
*/
|
|
424
|
+
this.onFocusOut = new EventEmitter();
|
|
425
|
+
/**
|
|
426
|
+
* Triggered after a widget was hidden
|
|
427
|
+
* @param {object} event Event object
|
|
428
|
+
* @param {Core.widget.Widget} event.source The widget
|
|
429
|
+
*/
|
|
430
|
+
this.onHide = new EventEmitter();
|
|
431
|
+
/**
|
|
432
|
+
* Triggered when a widget which had been in a non-visible state for any reason
|
|
433
|
+
* achieves visibility.
|
|
434
|
+
* ...
|
|
435
|
+
* [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-paint)
|
|
436
|
+
* @param {object} event Event object
|
|
437
|
+
* @param {Core.widget.Widget} event.source The widget being painted.
|
|
438
|
+
* @param {boolean} event.firstPaint `true` if this is the first paint.
|
|
439
|
+
*/
|
|
440
|
+
this.onPaint = new EventEmitter();
|
|
441
|
+
/**
|
|
442
|
+
* Fired when a Widget's read only state is toggled
|
|
443
|
+
* @param {object} event Event object
|
|
444
|
+
* @param {boolean} event.readOnly Read only or not
|
|
445
|
+
*/
|
|
446
|
+
this.onReadOnly = new EventEmitter();
|
|
447
|
+
/**
|
|
448
|
+
* This event is fired after a widget's elements have been synchronized due to a direct or indirect call
|
|
449
|
+
* to [recompose](https://bryntum.com/products/taskboard/docs/api/Core/widget/Widget#function-recompose), if this results in some change to the widget's rendered DOM elements.
|
|
450
|
+
*/
|
|
451
|
+
this.onRecompose = new EventEmitter();
|
|
452
|
+
/**
|
|
453
|
+
* Triggered when a tasks element is removed.
|
|
454
|
+
* ...
|
|
455
|
+
* [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-removeTaskElement)
|
|
456
|
+
* @param {object} event Event object
|
|
457
|
+
* @param {TaskBoard.view.TaskBoard} event.source TaskBoard instance
|
|
458
|
+
* @param {string,number} event.taskId Id of the task (not the record itself since it might be removed)
|
|
459
|
+
* @param {HTMLElement} event.element Tasks element
|
|
460
|
+
*/
|
|
461
|
+
this.onRemoveTaskElement = new EventEmitter();
|
|
462
|
+
/**
|
|
463
|
+
* Triggered when a task is rendered.
|
|
464
|
+
* ...
|
|
465
|
+
* [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-renderTask)
|
|
466
|
+
* @param {object} event Event object
|
|
467
|
+
* @param {TaskBoard.view.TaskBoard} event.source TaskBoard instance
|
|
468
|
+
* @param {TaskBoard.model.TaskModel} event.taskRecord Task being rendered
|
|
469
|
+
* @param {boolean} event.isRefresh `true` if the element was updated, `false` if it was added
|
|
470
|
+
* @param {HTMLElement} event.element Tasks element
|
|
471
|
+
*/
|
|
472
|
+
this.onRenderTask = new EventEmitter();
|
|
473
|
+
/**
|
|
474
|
+
* Triggered when all tasks in the task board are rendered
|
|
475
|
+
* @param {object} event Event object
|
|
476
|
+
* @param {TaskBoard.view.TaskBoard} event.source TaskBoard instance
|
|
477
|
+
* @param {TaskBoard.model.TaskModel[]} event.taskRecords Tasks being rendered
|
|
478
|
+
*/
|
|
479
|
+
this.onRenderTasks = new EventEmitter();
|
|
480
|
+
/**
|
|
481
|
+
* Fired when the encapsulating element of a Widget resizes *only when [monitorResize](https://bryntum.com/products/taskboard/docs/api/Core/widget/Widget#config-monitorResize) is `true`*.
|
|
482
|
+
* @param {object} event Event object
|
|
483
|
+
* @param {Core.widget.Widget} event.source This Widget
|
|
484
|
+
* @param {number} event.width The new width
|
|
485
|
+
* @param {number} event.height The new height
|
|
486
|
+
* @param {number} event.oldWidth The old width
|
|
487
|
+
* @param {number} event.oldHeight The old height
|
|
488
|
+
*/
|
|
489
|
+
this.onResize = new EventEmitter();
|
|
490
|
+
/**
|
|
491
|
+
* Triggered when a new [responsiveState](https://bryntum.com/products/taskboard/docs/api/Core/widget/mixin/Responsive#config-responsiveState) is applied.
|
|
492
|
+
* @param {object} event Event object
|
|
493
|
+
* @param {Core.widget.Widget} event.source The widget whose `responsiveState` has changed
|
|
494
|
+
* @param {string} event.state The new value for the widget's `responsiveState`
|
|
495
|
+
* @param {string} event.oldState The previous value for the widget's `responsiveState`
|
|
496
|
+
*/
|
|
497
|
+
this.onResponsiveStateChange = new EventEmitter();
|
|
498
|
+
/**
|
|
499
|
+
* Triggered when task selection changes.
|
|
500
|
+
* @param {object} event Event object
|
|
501
|
+
* @param {TaskBoard.view.TaskBoard} event.source TaskBoard instance
|
|
502
|
+
* @param {'select','deselect'} event.action Either 'select' or 'deselect', depending on operation
|
|
503
|
+
* @param {TaskBoard.model.TaskModel[]} event.selection All currently selected tasks
|
|
504
|
+
* @param {TaskBoard.model.TaskModel[]} event.select Tasks selected by the operation
|
|
505
|
+
* @param {TaskBoard.model.TaskModel[]} event.deselect Tasks deselected by the operation
|
|
506
|
+
*/
|
|
507
|
+
this.onSelectionChange = new EventEmitter();
|
|
508
|
+
/**
|
|
509
|
+
* Triggered after a widget is shown.
|
|
510
|
+
* @param {object} event Event object
|
|
511
|
+
* @param {Core.widget.Widget} event.source The widget
|
|
512
|
+
*/
|
|
513
|
+
this.onShow = new EventEmitter();
|
|
514
|
+
/**
|
|
515
|
+
* Fires on the owning TaskBoard when inline editing of a field is cancelled (by pressing ESC).
|
|
516
|
+
* ...
|
|
517
|
+
* [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-simpleTaskEditCancel)
|
|
518
|
+
* @param {object} event Event object
|
|
519
|
+
* @param {TaskBoard.view.TaskBoard} event.source The task board
|
|
520
|
+
* @param {TaskBoard.feature.SimpleTaskEdit} event.simpleTaskEdit The simpleTaskEdit feature
|
|
521
|
+
* @param {TaskBoard.model.TaskModel} event.taskRecord Record that was edited
|
|
522
|
+
* @param {string} event.field Field name being edited
|
|
523
|
+
*/
|
|
524
|
+
this.onSimpleTaskEditCancel = new EventEmitter();
|
|
525
|
+
/**
|
|
526
|
+
* Fires on the owning TaskBoard when inline editing of a field has successfully finished.
|
|
527
|
+
* ...
|
|
528
|
+
* [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-simpleTaskEditComplete)
|
|
529
|
+
* @param {object} event Event object
|
|
530
|
+
* @param {TaskBoard.view.TaskBoard} event.source The task board
|
|
531
|
+
* @param {TaskBoard.feature.SimpleTaskEdit} event.simpleTaskEdit The simpleTaskEdit feature
|
|
532
|
+
* @param {TaskBoard.model.TaskModel} event.taskRecord Record that was edited
|
|
533
|
+
* @param {string} event.field Field name being edited
|
|
534
|
+
*/
|
|
535
|
+
this.onSimpleTaskEditComplete = new EventEmitter();
|
|
536
|
+
/**
|
|
537
|
+
* Triggered when a swimlane is collapsed.
|
|
538
|
+
* @param {object} event Event object
|
|
539
|
+
* @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
|
|
540
|
+
* @param {TaskBoard.model.SwimlaneModel} event.swimlaneRecord Swimlane record
|
|
541
|
+
*/
|
|
542
|
+
this.onSwimlaneCollapse = new EventEmitter();
|
|
543
|
+
/**
|
|
544
|
+
* Triggered when a swimlane is expanded.
|
|
545
|
+
* @param {object} event Event object
|
|
546
|
+
* @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
|
|
547
|
+
* @param {TaskBoard.model.SwimlaneModel} event.swimlaneRecord Swimlane record
|
|
548
|
+
*/
|
|
549
|
+
this.onSwimlaneExpand = new EventEmitter();
|
|
550
|
+
/**
|
|
551
|
+
* Triggered when a swimlane header is clicked.
|
|
552
|
+
* ...
|
|
553
|
+
* [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-swimlaneHeaderClick)
|
|
554
|
+
* @param {object} event Event object
|
|
555
|
+
* @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
|
|
556
|
+
* @param {TaskBoard.model.SwimlaneModel} event.swimlaneRecord Swimlane record
|
|
557
|
+
* @param {MouseEvent} event.event Browser event
|
|
558
|
+
*/
|
|
559
|
+
this.onSwimlaneHeaderClick = new EventEmitter();
|
|
560
|
+
/**
|
|
561
|
+
* Triggered when a swimlane header is right-clicked.
|
|
562
|
+
* ...
|
|
563
|
+
* [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-swimlaneHeaderContextMenu)
|
|
564
|
+
* @param {object} event Event object
|
|
565
|
+
* @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
|
|
566
|
+
* @param {TaskBoard.model.SwimlaneModel} event.swimlaneRecord Swimlane record
|
|
567
|
+
* @param {MouseEvent} event.event Browser event
|
|
568
|
+
*/
|
|
569
|
+
this.onSwimlaneHeaderContextMenu = new EventEmitter();
|
|
570
|
+
/**
|
|
571
|
+
* Triggered when a swimlane header is double-clicked.
|
|
572
|
+
* ...
|
|
573
|
+
* [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-swimlaneHeaderDblClick)
|
|
574
|
+
* @param {object} event Event object
|
|
575
|
+
* @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
|
|
576
|
+
* @param {TaskBoard.model.SwimlaneModel} event.swimlaneRecord Swimlane record
|
|
577
|
+
* @param {MouseEvent} event.event Browser event
|
|
578
|
+
*/
|
|
579
|
+
this.onSwimlaneHeaderDblClick = new EventEmitter();
|
|
580
|
+
/**
|
|
581
|
+
* Triggered when the swimlane collapsed state is toggled.
|
|
582
|
+
* @param {object} event Event object
|
|
583
|
+
* @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
|
|
584
|
+
* @param {TaskBoard.model.SwimlaneModel} event.swimlaneRecord Swimlane record
|
|
585
|
+
* @param {boolean} event.collapse `true` if the column is being collapsed.
|
|
586
|
+
*/
|
|
587
|
+
this.onSwimlaneToggle = new EventEmitter();
|
|
588
|
+
/**
|
|
589
|
+
* Triggered when a card is clicked.
|
|
590
|
+
* ...
|
|
591
|
+
* [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-taskClick)
|
|
592
|
+
* @param {object} event Event object
|
|
593
|
+
* @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
|
|
594
|
+
* @param {TaskBoard.model.TaskModel} event.taskRecord Task record
|
|
595
|
+
* @param {TaskBoard.model.ColumnModel} event.columnRecord Column record for the tasks column
|
|
596
|
+
* @param {TaskBoard.model.SwimlaneModel} event.swimlaneRecord Swimlane record for the tasks swimlane (if used)
|
|
597
|
+
* @param {MouseEvent} event.event Browser event
|
|
598
|
+
*/
|
|
599
|
+
this.onTaskClick = new EventEmitter();
|
|
600
|
+
/**
|
|
601
|
+
* Triggered when a card is double-clicked
|
|
602
|
+
* ...
|
|
603
|
+
* [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-taskDblClick)
|
|
604
|
+
* @param {object} event Event object
|
|
605
|
+
* @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
|
|
606
|
+
* @param {TaskBoard.model.TaskModel} event.taskRecord Task record
|
|
607
|
+
* @param {TaskBoard.model.ColumnModel} event.columnRecord Column record for the tasks column
|
|
608
|
+
* @param {TaskBoard.model.SwimlaneModel} event.swimlaneRecord Swimlane record for the tasks swimlane (if used)
|
|
609
|
+
* @param {MouseEvent} event.event Browser event
|
|
610
|
+
*/
|
|
611
|
+
this.onTaskDblClick = new EventEmitter();
|
|
612
|
+
/**
|
|
613
|
+
* Fires on the owning TaskBoard when tasks are dragged, if the drag leads to any changes compared to
|
|
614
|
+
* the last taskDrag event (moved to a new column or changed order within a column).
|
|
615
|
+
* ...
|
|
616
|
+
* [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-taskDrag)
|
|
617
|
+
* @param {object} event Event object
|
|
618
|
+
* @param {TaskBoard.view.TaskBoard} event.source Owning TaskBoard
|
|
619
|
+
* @param {TaskBoard.model.TaskModel[]} event.taskRecords Dragged tasks
|
|
620
|
+
* @param {TaskBoard.model.ColumnModel} event.targetColumn Currently over this column
|
|
621
|
+
* @param {TaskBoard.model.SwimlaneModel} event.targetSwimlane Currently over this swimlane (if used)
|
|
622
|
+
* @param {Event} event.domEvent The mouse event
|
|
623
|
+
*/
|
|
624
|
+
this.onTaskDrag = new EventEmitter();
|
|
625
|
+
/**
|
|
626
|
+
* Fires on the owning TaskBoard when a drag operation is aborted (invalid drop or aborted using ESC)
|
|
627
|
+
* @param {object} event Event object
|
|
628
|
+
* @param {TaskBoard.view.TaskBoard} event.source Owning TaskBoard
|
|
629
|
+
* @param {TaskBoard.model.TaskModel[]} event.taskRecords Dragged tasks
|
|
630
|
+
*/
|
|
631
|
+
this.onTaskDragAbort = new EventEmitter();
|
|
632
|
+
/**
|
|
633
|
+
* Fires on the owning TaskBoard when a previously started drag operation ends, no matter the
|
|
634
|
+
* outcome of it (whether valid, invalid or aborted)
|
|
635
|
+
* @param {object} event Event object
|
|
636
|
+
* @param {TaskBoard.view.TaskBoard} event.source Owning TaskBoard
|
|
637
|
+
* @param {TaskBoard.model.TaskModel[]} event.taskRecords Affected tasks
|
|
638
|
+
* @param {Event} event.domEvent The mouse event
|
|
639
|
+
*/
|
|
640
|
+
this.onTaskDragEnd = new EventEmitter();
|
|
641
|
+
/**
|
|
642
|
+
* Fires on the owning TaskBoard when task dragging starts
|
|
643
|
+
* @param {object} event Event object
|
|
644
|
+
* @param {TaskBoard.view.TaskBoard} event.source Owning TaskBoard
|
|
645
|
+
* @param {TaskBoard.model.TaskModel[]} event.taskRecords Tasks to be dragged
|
|
646
|
+
* @param {Event} event.domEvent The mouse event
|
|
647
|
+
*/
|
|
648
|
+
this.onTaskDragStart = new EventEmitter();
|
|
649
|
+
/**
|
|
650
|
+
* Fires on the owning TaskBoard when tasks are successfully dropped (after the drop transition has
|
|
651
|
+
* finished)
|
|
652
|
+
* @param {object} event Event object
|
|
653
|
+
* @param {TaskBoard.view.TaskBoard} event.source Owning TaskBoard
|
|
654
|
+
* @param {TaskBoard.model.TaskModel[]} event.taskRecords Dropped tasks
|
|
655
|
+
* @param {TaskBoard.model.ColumnModel} event.targetColumn Dropped on this column
|
|
656
|
+
* @param {TaskBoard.model.SwimlaneModel} event.targetSwimlane Dropped in this swimlane (if used)
|
|
657
|
+
* @param {Event} event.domEvent The mouse event
|
|
658
|
+
*/
|
|
659
|
+
this.onTaskDrop = new EventEmitter();
|
|
660
|
+
/**
|
|
661
|
+
* This event fires on the owning TaskBoard before the context menu is shown for a task.
|
|
662
|
+
* Allows manipulation of the items to show in the same way as in the [processItems](https://bryntum.com/products/taskboard/docs/api/TaskBoard/feature/TaskMenu#config-processItems).
|
|
663
|
+
* ...
|
|
664
|
+
* [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-taskMenuBeforeShow)
|
|
665
|
+
* @param {object} event Event object
|
|
666
|
+
* @param {TaskBoard.view.TaskBoard} event.source The grid
|
|
667
|
+
* @param {Core.widget.Menu} event.menu The menu
|
|
668
|
+
* @param {Record<string, MenuItemEntry>} event.items Menu item configs
|
|
669
|
+
* @param {TaskBoard.model.TaskModel} event.taskRecord The task
|
|
670
|
+
*/
|
|
671
|
+
this.onTaskMenuBeforeShow = new EventEmitter();
|
|
672
|
+
/**
|
|
673
|
+
* This event fires on the owning TaskBoard when an item is selected in the task context menu.
|
|
674
|
+
* @param {object} event Event object
|
|
675
|
+
* @param {TaskBoard.view.TaskBoard} event.source The grid
|
|
676
|
+
* @param {Core.widget.Menu} event.menu The menu
|
|
677
|
+
* @param {Core.widget.MenuItem} event.item Selected menu item
|
|
678
|
+
* @param {TaskBoard.model.TaskModel} event.taskRecord The task
|
|
679
|
+
*/
|
|
680
|
+
this.onTaskMenuItem = new EventEmitter();
|
|
681
|
+
/**
|
|
682
|
+
* This event fires on the owning TaskBoard after the context menu is shown for a task.
|
|
683
|
+
* @param {object} event Event object
|
|
684
|
+
* @param {TaskBoard.view.TaskBoard} event.source The grid
|
|
685
|
+
* @param {Core.widget.Menu} event.menu The menu
|
|
686
|
+
* @param {Record<string, MenuItemEntry>} event.items Menu item configs
|
|
687
|
+
* @param {TaskBoard.model.TaskModel} event.taskRecord The task
|
|
688
|
+
*/
|
|
689
|
+
this.onTaskMenuShow = new EventEmitter();
|
|
690
|
+
/**
|
|
691
|
+
* This event fires on the owning TaskBoard when a check item is toggled in the task context menu.
|
|
692
|
+
* @param {object} event Event object
|
|
693
|
+
* @param {TaskBoard.view.TaskBoard} event.source The grid
|
|
694
|
+
* @param {Core.widget.Menu} event.menu The menu
|
|
695
|
+
* @param {Core.widget.MenuItem} event.item Selected menu item
|
|
696
|
+
* @param {TaskBoard.model.TaskModel} event.taskRecord The task
|
|
697
|
+
* @param {boolean} event.checked Checked or not
|
|
698
|
+
*/
|
|
699
|
+
this.onTaskMenuToggleItem = new EventEmitter();
|
|
700
|
+
/**
|
|
701
|
+
* Triggered when the mouse enters a card
|
|
702
|
+
* ...
|
|
703
|
+
* [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-taskMouseEnter)
|
|
704
|
+
* @param {object} event Event object
|
|
705
|
+
* @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
|
|
706
|
+
* @param {TaskBoard.model.TaskModel} event.taskRecord Task record
|
|
707
|
+
* @param {TaskBoard.model.ColumnModel} event.columnRecord Column record for the tasks column
|
|
708
|
+
* @param {TaskBoard.model.SwimlaneModel} event.swimlaneRecord Swimlane record for the tasks swimlane (if used)
|
|
709
|
+
* @param {MouseEvent} event.event Browser event
|
|
710
|
+
*/
|
|
711
|
+
this.onTaskMouseEnter = new EventEmitter();
|
|
712
|
+
/**
|
|
713
|
+
* Triggered when the mouse leaves a card
|
|
714
|
+
* ...
|
|
715
|
+
* [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/view/TaskBoardBase#event-taskMouseLeave)
|
|
716
|
+
* @param {object} event Event object
|
|
717
|
+
* @param {TaskBoard.view.TaskBoard} event.source This TaskBoard
|
|
718
|
+
* @param {TaskBoard.model.TaskModel} event.taskRecord Task record
|
|
719
|
+
* @param {TaskBoard.model.ColumnModel} event.columnRecord Column record for the tasks column
|
|
720
|
+
* @param {TaskBoard.model.SwimlaneModel} event.swimlaneRecord Swimlane record for the tasks swimlane (if used)
|
|
721
|
+
* @param {MouseEvent} event.event Browser event
|
|
722
|
+
*/
|
|
723
|
+
this.onTaskMouseLeave = new EventEmitter();
|
|
724
|
+
/**
|
|
725
|
+
* A header [tool](https://bryntum.com/products/taskboard/docs/api/Core/widget/Panel#config-tools) has been clicked.
|
|
726
|
+
* @param {object} event Event object
|
|
727
|
+
* @param {Core.widget.Tool} event.source This Panel.
|
|
728
|
+
* @param {Core.widget.Tool} event.tool The tool which is being clicked.
|
|
729
|
+
*/
|
|
730
|
+
this.onToolClick = new EventEmitter();
|
|
731
|
+
this.elementRef = element;
|
|
732
|
+
}
|
|
733
|
+
/**
|
|
734
|
+
* Create and append the underlying widget
|
|
735
|
+
*/
|
|
736
|
+
ngOnInit() {
|
|
737
|
+
const me = this, { elementRef, bryntumConfig } = me, { instanceClass, instanceName, bryntumConfigs, bryntumEvents } = BryntumTaskBoardBaseComponent;
|
|
738
|
+
bryntumConfigs.filter(prop => prop in this).forEach(prop => {
|
|
739
|
+
// @ts-ignore
|
|
740
|
+
WrapperHelper.applyPropValue(bryntumConfig, prop, this[prop]);
|
|
741
|
+
if (['features', 'config'].includes(prop)) {
|
|
742
|
+
WrapperHelper.devWarningConfigProp(instanceName, prop);
|
|
743
|
+
}
|
|
744
|
+
});
|
|
745
|
+
// @ts-ignore
|
|
746
|
+
bryntumEvents.filter(event => this[event] && this[event].observers.length > 0).forEach(event => {
|
|
747
|
+
const uncapitalize = (str) => str.charAt(0).toLowerCase() + str.slice(1), eventName = (str) => uncapitalize(str.slice(2));
|
|
748
|
+
// @ts-ignore
|
|
749
|
+
bryntumConfig.listeners[eventName(event)] = e => {
|
|
750
|
+
// @ts-ignore
|
|
751
|
+
me[event].emit(e);
|
|
752
|
+
// EventEmitter does not return values in the normal way, work around it by setting `returnValue` flag
|
|
753
|
+
// in Angular listeners
|
|
754
|
+
return e.returnValue;
|
|
755
|
+
};
|
|
756
|
+
});
|
|
757
|
+
// If component has no container specified in config then use adopt to Wrapper's element
|
|
758
|
+
const containerParam = [
|
|
759
|
+
'adopt',
|
|
760
|
+
'appendTo',
|
|
761
|
+
'insertAfter',
|
|
762
|
+
'insertBefore'
|
|
763
|
+
// @ts-ignore
|
|
764
|
+
].find(prop => bryntumConfig[prop]);
|
|
765
|
+
if (!containerParam) {
|
|
766
|
+
if (instanceName === 'Button' || elementRef.nativeElement.getRootNode() instanceof ShadowRoot) {
|
|
767
|
+
// Button should always be <a> or <button> inside owner element
|
|
768
|
+
bryntumConfig.appendTo = elementRef.nativeElement;
|
|
769
|
+
}
|
|
770
|
+
else {
|
|
771
|
+
bryntumConfig.adopt = elementRef.nativeElement;
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
else {
|
|
775
|
+
WrapperHelper.devWarningContainer(instanceName, containerParam);
|
|
776
|
+
}
|
|
777
|
+
// @ts-ignore
|
|
778
|
+
me.instance = instanceName === 'Widget' ? Widget.create(bryntumConfig) : new instanceClass(bryntumConfig);
|
|
779
|
+
// Backwards compatibility for gridInstance, schedulerInstance etc.
|
|
780
|
+
// @ts-ignore
|
|
781
|
+
me[StringHelper.uncapitalize(instanceName) + 'Instance'] = me.instance;
|
|
782
|
+
//
|
|
783
|
+
}
|
|
784
|
+
/**
|
|
785
|
+
* Watch for changes
|
|
786
|
+
* @param changes
|
|
787
|
+
*/
|
|
788
|
+
ngOnChanges(changes) {
|
|
789
|
+
const { instance } = this, { instanceName } = BryntumTaskBoardBaseComponent;
|
|
790
|
+
if (!instance) {
|
|
791
|
+
return;
|
|
792
|
+
}
|
|
793
|
+
// Iterate over all changes
|
|
794
|
+
Object.entries(changes).forEach(([prop, change]) => {
|
|
795
|
+
const newValue = change.currentValue, { instance } = this, { bryntumConfigsOnly, bryntumProps } = BryntumTaskBoardBaseComponent;
|
|
796
|
+
if (bryntumProps.includes(prop)) {
|
|
797
|
+
WrapperHelper.applyPropValue(instance, prop, newValue, false);
|
|
798
|
+
if (bryntumConfigsOnly.includes(prop)) {
|
|
799
|
+
WrapperHelper.devWarningUpdateProp(instanceName, prop);
|
|
800
|
+
}
|
|
801
|
+
}
|
|
802
|
+
});
|
|
803
|
+
}
|
|
804
|
+
/**
|
|
805
|
+
* Destroy the component
|
|
806
|
+
*/
|
|
807
|
+
ngOnDestroy() {
|
|
808
|
+
// @ts-ignore
|
|
809
|
+
if (this.instance && this.instance.destroy) {
|
|
810
|
+
this.instance.destroy();
|
|
811
|
+
}
|
|
812
|
+
}
|
|
813
|
+
}
|
|
814
|
+
BryntumTaskBoardBaseComponent.instanceClass = TaskBoardBase;
|
|
815
|
+
BryntumTaskBoardBaseComponent.instanceName = 'TaskBoardBase';
|
|
816
|
+
BryntumTaskBoardBaseComponent.bryntumEvents = [
|
|
817
|
+
'onActivateTask',
|
|
818
|
+
'onBeforeColumnDrag',
|
|
819
|
+
'onBeforeColumnDrop',
|
|
820
|
+
'onBeforeColumnResize',
|
|
821
|
+
'onBeforeDestroy',
|
|
822
|
+
'onBeforeHide',
|
|
823
|
+
'onBeforeResponsiveStateChange',
|
|
824
|
+
'onBeforeShow',
|
|
825
|
+
'onBeforeSimpleTaskEdit',
|
|
826
|
+
'onBeforeStateApply',
|
|
827
|
+
'onBeforeStateSave',
|
|
828
|
+
'onBeforeTaskDrag',
|
|
829
|
+
'onBeforeTaskDrop',
|
|
830
|
+
'onBeforeTaskEdit',
|
|
831
|
+
'onBeforeTaskEditShow',
|
|
832
|
+
'onBeforeTaskRemove',
|
|
833
|
+
'onCatchAll',
|
|
834
|
+
'onCellMenuItem',
|
|
835
|
+
'onCellMenuShow',
|
|
836
|
+
'onCellMenuToggleItem',
|
|
837
|
+
'onCollapse',
|
|
838
|
+
'onColumnCollapse',
|
|
839
|
+
'onColumnDrag',
|
|
840
|
+
'onColumnDragAbort',
|
|
841
|
+
'onColumnDragEnd',
|
|
842
|
+
'onColumnDragStart',
|
|
843
|
+
'onColumnDrop',
|
|
844
|
+
'onColumnExpand',
|
|
845
|
+
'onColumnFilterHide',
|
|
846
|
+
'onColumnFilterShow',
|
|
847
|
+
'onColumnFilterToggle',
|
|
848
|
+
'onColumnHeaderClick',
|
|
849
|
+
'onColumnHeaderContextMenu',
|
|
850
|
+
'onColumnHeaderDblClick',
|
|
851
|
+
'onColumnHeaderMenuBeforeShow',
|
|
852
|
+
'onColumnResize',
|
|
853
|
+
'onColumnResizeStart',
|
|
854
|
+
'onColumnTitleClick',
|
|
855
|
+
'onColumnTitleContextMenu',
|
|
856
|
+
'onColumnTitleDblClick',
|
|
857
|
+
'onColumnToggle',
|
|
858
|
+
'onDestroy',
|
|
859
|
+
'onDirtyStateChange',
|
|
860
|
+
'onElementCreated',
|
|
861
|
+
'onExpand',
|
|
862
|
+
'onFocusIn',
|
|
863
|
+
'onFocusOut',
|
|
864
|
+
'onHide',
|
|
865
|
+
'onPaint',
|
|
866
|
+
'onReadOnly',
|
|
867
|
+
'onRecompose',
|
|
868
|
+
'onRemoveTaskElement',
|
|
869
|
+
'onRenderTask',
|
|
870
|
+
'onRenderTasks',
|
|
871
|
+
'onResize',
|
|
872
|
+
'onResponsiveStateChange',
|
|
873
|
+
'onSelectionChange',
|
|
874
|
+
'onShow',
|
|
875
|
+
'onSimpleTaskEditCancel',
|
|
876
|
+
'onSimpleTaskEditComplete',
|
|
877
|
+
'onSwimlaneCollapse',
|
|
878
|
+
'onSwimlaneExpand',
|
|
879
|
+
'onSwimlaneHeaderClick',
|
|
880
|
+
'onSwimlaneHeaderContextMenu',
|
|
881
|
+
'onSwimlaneHeaderDblClick',
|
|
882
|
+
'onSwimlaneToggle',
|
|
883
|
+
'onTaskClick',
|
|
884
|
+
'onTaskDblClick',
|
|
885
|
+
'onTaskDrag',
|
|
886
|
+
'onTaskDragAbort',
|
|
887
|
+
'onTaskDragEnd',
|
|
888
|
+
'onTaskDragStart',
|
|
889
|
+
'onTaskDrop',
|
|
890
|
+
'onTaskMenuBeforeShow',
|
|
891
|
+
'onTaskMenuItem',
|
|
892
|
+
'onTaskMenuShow',
|
|
893
|
+
'onTaskMenuToggleItem',
|
|
894
|
+
'onTaskMouseEnter',
|
|
895
|
+
'onTaskMouseLeave',
|
|
896
|
+
'onToolClick'
|
|
897
|
+
];
|
|
898
|
+
BryntumTaskBoardBaseComponent.bryntumFeatureNames = [
|
|
899
|
+
'columnDragFeature',
|
|
900
|
+
'columnFilterFeature',
|
|
901
|
+
'columnHeaderMenuFeature',
|
|
902
|
+
'columnLockFeature',
|
|
903
|
+
'columnRenameFeature',
|
|
904
|
+
'columnResizeFeature',
|
|
905
|
+
'columnSortFeature',
|
|
906
|
+
'columnToolbarsFeature',
|
|
907
|
+
'filterBarFeature',
|
|
908
|
+
'simpleTaskEditFeature',
|
|
909
|
+
'swimlaneDragFeature',
|
|
910
|
+
'taskDragFeature',
|
|
911
|
+
'taskDragSelectFeature',
|
|
912
|
+
'taskEditFeature',
|
|
913
|
+
'taskMenuFeature',
|
|
914
|
+
'taskTooltipFeature'
|
|
915
|
+
];
|
|
916
|
+
BryntumTaskBoardBaseComponent.bryntumConfigs = BryntumTaskBoardBaseComponent.bryntumFeatureNames.concat([
|
|
917
|
+
'activateTaskEvent',
|
|
918
|
+
'adopt',
|
|
919
|
+
'align',
|
|
920
|
+
'alignSelf',
|
|
921
|
+
'anchor',
|
|
922
|
+
'appendTo',
|
|
923
|
+
'ariaDescription',
|
|
924
|
+
'ariaLabel',
|
|
925
|
+
'assignments',
|
|
926
|
+
'autoGenerateColumns',
|
|
927
|
+
'autoGenerateSwimlanes',
|
|
928
|
+
'bbar',
|
|
929
|
+
'bodyCls',
|
|
930
|
+
'bodyItems',
|
|
931
|
+
'bubbleEvents',
|
|
932
|
+
'callOnFunctions',
|
|
933
|
+
'cardSizes',
|
|
934
|
+
'catchEventHandlerExceptions',
|
|
935
|
+
'centered',
|
|
936
|
+
'chainFilters',
|
|
937
|
+
'cls',
|
|
938
|
+
'collapsed',
|
|
939
|
+
'collapseTitle',
|
|
940
|
+
'collapsible',
|
|
941
|
+
'color',
|
|
942
|
+
'column',
|
|
943
|
+
'columnField',
|
|
944
|
+
'columns',
|
|
945
|
+
'columnTitleRenderer',
|
|
946
|
+
'config',
|
|
947
|
+
'constrainTo',
|
|
948
|
+
'css',
|
|
949
|
+
'cssVarPrefix',
|
|
950
|
+
'dataField',
|
|
951
|
+
'dataset',
|
|
952
|
+
'detectCSSCompatibilityIssues',
|
|
953
|
+
'disabled',
|
|
954
|
+
'dock',
|
|
955
|
+
'draggable',
|
|
956
|
+
'drawer',
|
|
957
|
+
'drawOnScroll',
|
|
958
|
+
'elementAttributes',
|
|
959
|
+
'extraData',
|
|
960
|
+
'flex',
|
|
961
|
+
'floating',
|
|
962
|
+
'footer',
|
|
963
|
+
'footerItems',
|
|
964
|
+
'getTaskHeight',
|
|
965
|
+
'header',
|
|
966
|
+
'headerItems',
|
|
967
|
+
'height',
|
|
968
|
+
'hidden',
|
|
969
|
+
'hideAnimation',
|
|
970
|
+
'htmlEncodeHeaderText',
|
|
971
|
+
'icon',
|
|
972
|
+
'id',
|
|
973
|
+
'ignoreParentReadOnly',
|
|
974
|
+
'inputFieldAlign',
|
|
975
|
+
'insertBefore',
|
|
976
|
+
'insertFirst',
|
|
977
|
+
'isTaskSelectable',
|
|
978
|
+
'keyMap',
|
|
979
|
+
'labelPosition',
|
|
980
|
+
'listeners',
|
|
981
|
+
'loadMask',
|
|
982
|
+
'loadMaskDefaults',
|
|
983
|
+
'loadMaskError',
|
|
984
|
+
'localeClass',
|
|
985
|
+
'localizable',
|
|
986
|
+
'localizableProperties',
|
|
987
|
+
'margin',
|
|
988
|
+
'maskDefaults',
|
|
989
|
+
'masked',
|
|
990
|
+
'maxHeight',
|
|
991
|
+
'maximizeOnMobile',
|
|
992
|
+
'maxWidth',
|
|
993
|
+
'minHeight',
|
|
994
|
+
'minWidth',
|
|
995
|
+
'newTaskDefaults',
|
|
996
|
+
'owner',
|
|
997
|
+
'plugins',
|
|
998
|
+
'positioned',
|
|
999
|
+
'processItems',
|
|
1000
|
+
'project',
|
|
1001
|
+
'readOnly',
|
|
1002
|
+
'record',
|
|
1003
|
+
'relayStoreEvents',
|
|
1004
|
+
'rendition',
|
|
1005
|
+
'resourceImagePath',
|
|
1006
|
+
'resources',
|
|
1007
|
+
'responsive',
|
|
1008
|
+
'responsiveRoot',
|
|
1009
|
+
'responsiveState',
|
|
1010
|
+
'responsiveTarget',
|
|
1011
|
+
'rootElement',
|
|
1012
|
+
'rtl',
|
|
1013
|
+
'scrollable',
|
|
1014
|
+
'scrollAction',
|
|
1015
|
+
'scrollManager',
|
|
1016
|
+
'scrollOptions',
|
|
1017
|
+
'selectedTasks',
|
|
1018
|
+
'selectOnNavigation',
|
|
1019
|
+
'showAnimation',
|
|
1020
|
+
'showCollapseInHeader',
|
|
1021
|
+
'showCollapseTooltip',
|
|
1022
|
+
'showCountInHeader',
|
|
1023
|
+
'span',
|
|
1024
|
+
'stateful',
|
|
1025
|
+
'statefulEvents',
|
|
1026
|
+
'stateId',
|
|
1027
|
+
'stateProvider',
|
|
1028
|
+
'stickyHeaders',
|
|
1029
|
+
'stretchCards',
|
|
1030
|
+
'strictRecordMapping',
|
|
1031
|
+
'strips',
|
|
1032
|
+
'swimlaneField',
|
|
1033
|
+
'swimlaneRenderer',
|
|
1034
|
+
'swimlanes',
|
|
1035
|
+
'syncMask',
|
|
1036
|
+
'tab',
|
|
1037
|
+
'tabBarItems',
|
|
1038
|
+
'taskRenderer',
|
|
1039
|
+
'tasks',
|
|
1040
|
+
'taskSorterFn',
|
|
1041
|
+
'tasksPerRow',
|
|
1042
|
+
'tbar',
|
|
1043
|
+
'title',
|
|
1044
|
+
'tools',
|
|
1045
|
+
'ui',
|
|
1046
|
+
'useDomTransition',
|
|
1047
|
+
'virtualize',
|
|
1048
|
+
'weight',
|
|
1049
|
+
'width',
|
|
1050
|
+
'x',
|
|
1051
|
+
'y'
|
|
1052
|
+
]);
|
|
1053
|
+
BryntumTaskBoardBaseComponent.bryntumConfigsOnly = [
|
|
1054
|
+
'activateTaskEvent',
|
|
1055
|
+
'adopt',
|
|
1056
|
+
'align',
|
|
1057
|
+
'anchor',
|
|
1058
|
+
'ariaDescription',
|
|
1059
|
+
'ariaLabel',
|
|
1060
|
+
'autoGenerateColumns',
|
|
1061
|
+
'autoGenerateSwimlanes',
|
|
1062
|
+
'bbar',
|
|
1063
|
+
'bodyCls',
|
|
1064
|
+
'bubbleEvents',
|
|
1065
|
+
'cardSizes',
|
|
1066
|
+
'centered',
|
|
1067
|
+
'chainFilters',
|
|
1068
|
+
'collapseTitle',
|
|
1069
|
+
'collapsible',
|
|
1070
|
+
'color',
|
|
1071
|
+
'columnTitleRenderer',
|
|
1072
|
+
'config',
|
|
1073
|
+
'constrainTo',
|
|
1074
|
+
'cssVarPrefix',
|
|
1075
|
+
'dataField',
|
|
1076
|
+
'detectCSSCompatibilityIssues',
|
|
1077
|
+
'dock',
|
|
1078
|
+
'draggable',
|
|
1079
|
+
'drawer',
|
|
1080
|
+
'elementAttributes',
|
|
1081
|
+
'floating',
|
|
1082
|
+
'footer',
|
|
1083
|
+
'header',
|
|
1084
|
+
'hideAnimation',
|
|
1085
|
+
'htmlEncodeHeaderText',
|
|
1086
|
+
'icon',
|
|
1087
|
+
'ignoreParentReadOnly',
|
|
1088
|
+
'listeners',
|
|
1089
|
+
'loadMask',
|
|
1090
|
+
'loadMaskDefaults',
|
|
1091
|
+
'loadMaskError',
|
|
1092
|
+
'localeClass',
|
|
1093
|
+
'localizable',
|
|
1094
|
+
'localizableProperties',
|
|
1095
|
+
'maskDefaults',
|
|
1096
|
+
'masked',
|
|
1097
|
+
'newTaskDefaults',
|
|
1098
|
+
'owner',
|
|
1099
|
+
'plugins',
|
|
1100
|
+
'positioned',
|
|
1101
|
+
'processItems',
|
|
1102
|
+
'record',
|
|
1103
|
+
'relayStoreEvents',
|
|
1104
|
+
'resourceImagePath',
|
|
1105
|
+
'responsive',
|
|
1106
|
+
'responsiveRoot',
|
|
1107
|
+
'responsiveState',
|
|
1108
|
+
'responsiveTarget',
|
|
1109
|
+
'rootElement',
|
|
1110
|
+
'scrollable',
|
|
1111
|
+
'scrollAction',
|
|
1112
|
+
'scrollManager',
|
|
1113
|
+
'scrollOptions',
|
|
1114
|
+
'selectOnNavigation',
|
|
1115
|
+
'showAnimation',
|
|
1116
|
+
'showCollapseInHeader',
|
|
1117
|
+
'showCountInHeader',
|
|
1118
|
+
'stateful',
|
|
1119
|
+
'statefulEvents',
|
|
1120
|
+
'stateId',
|
|
1121
|
+
'stateProvider',
|
|
1122
|
+
'stickyHeaders',
|
|
1123
|
+
'strips',
|
|
1124
|
+
'swimlaneRenderer',
|
|
1125
|
+
'syncMask',
|
|
1126
|
+
'tab',
|
|
1127
|
+
'tabBarItems',
|
|
1128
|
+
'taskRenderer',
|
|
1129
|
+
'taskSorterFn',
|
|
1130
|
+
'tasksPerRow',
|
|
1131
|
+
'tbar',
|
|
1132
|
+
'ui',
|
|
1133
|
+
'useDomTransition',
|
|
1134
|
+
'weight'
|
|
1135
|
+
];
|
|
1136
|
+
BryntumTaskBoardBaseComponent.bryntumProps = BryntumTaskBoardBaseComponent.bryntumFeatureNames.concat([
|
|
1137
|
+
'alignSelf',
|
|
1138
|
+
'anchorSize',
|
|
1139
|
+
'appendTo',
|
|
1140
|
+
'assignments',
|
|
1141
|
+
'bodyItems',
|
|
1142
|
+
'callOnFunctions',
|
|
1143
|
+
'catchEventHandlerExceptions',
|
|
1144
|
+
'cls',
|
|
1145
|
+
'collapsed',
|
|
1146
|
+
'column',
|
|
1147
|
+
'columnField',
|
|
1148
|
+
'columns',
|
|
1149
|
+
'css',
|
|
1150
|
+
'dataset',
|
|
1151
|
+
'disabled',
|
|
1152
|
+
'drawOnScroll',
|
|
1153
|
+
'extraData',
|
|
1154
|
+
'flex',
|
|
1155
|
+
'focusVisible',
|
|
1156
|
+
'footerItems',
|
|
1157
|
+
'getTaskHeight',
|
|
1158
|
+
'hasChanges',
|
|
1159
|
+
'headerItems',
|
|
1160
|
+
'height',
|
|
1161
|
+
'hidden',
|
|
1162
|
+
'id',
|
|
1163
|
+
'inputFieldAlign',
|
|
1164
|
+
'insertBefore',
|
|
1165
|
+
'insertFirst',
|
|
1166
|
+
'isTaskSelectable',
|
|
1167
|
+
'keyMap',
|
|
1168
|
+
'labelPosition',
|
|
1169
|
+
'margin',
|
|
1170
|
+
'maxHeight',
|
|
1171
|
+
'maximizeOnMobile',
|
|
1172
|
+
'maxWidth',
|
|
1173
|
+
'minHeight',
|
|
1174
|
+
'minWidth',
|
|
1175
|
+
'parent',
|
|
1176
|
+
'project',
|
|
1177
|
+
'readOnly',
|
|
1178
|
+
'rendition',
|
|
1179
|
+
'resources',
|
|
1180
|
+
'rtl',
|
|
1181
|
+
'selectedTasks',
|
|
1182
|
+
'showCollapseTooltip',
|
|
1183
|
+
'span',
|
|
1184
|
+
'state',
|
|
1185
|
+
'stretchCards',
|
|
1186
|
+
'strictRecordMapping',
|
|
1187
|
+
'swimlaneField',
|
|
1188
|
+
'swimlanes',
|
|
1189
|
+
'tasks',
|
|
1190
|
+
'title',
|
|
1191
|
+
'tools',
|
|
1192
|
+
'virtualize',
|
|
1193
|
+
'width',
|
|
1194
|
+
'x',
|
|
1195
|
+
'y'
|
|
1196
|
+
]);
|
|
1197
|
+
BryntumTaskBoardBaseComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.0", ngImport: i0, type: BryntumTaskBoardBaseComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
1198
|
+
BryntumTaskBoardBaseComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.0", type: BryntumTaskBoardBaseComponent, selector: "bryntum-task-board-base", inputs: { activateTaskEvent: "activateTaskEvent", adopt: "adopt", align: "align", anchor: "anchor", ariaDescription: "ariaDescription", ariaLabel: "ariaLabel", autoGenerateColumns: "autoGenerateColumns", autoGenerateSwimlanes: "autoGenerateSwimlanes", bbar: "bbar", bodyCls: "bodyCls", bubbleEvents: "bubbleEvents", cardSizes: "cardSizes", centered: "centered", chainFilters: "chainFilters", collapseTitle: "collapseTitle", collapsible: "collapsible", color: "color", columnTitleRenderer: "columnTitleRenderer", config: "config", constrainTo: "constrainTo", cssVarPrefix: "cssVarPrefix", dataField: "dataField", detectCSSCompatibilityIssues: "detectCSSCompatibilityIssues", dock: "dock", draggable: "draggable", drawer: "drawer", elementAttributes: "elementAttributes", floating: "floating", footer: "footer", header: "header", hideAnimation: "hideAnimation", htmlEncodeHeaderText: "htmlEncodeHeaderText", icon: "icon", ignoreParentReadOnly: "ignoreParentReadOnly", listeners: "listeners", loadMask: "loadMask", loadMaskDefaults: "loadMaskDefaults", loadMaskError: "loadMaskError", localeClass: "localeClass", localizable: "localizable", localizableProperties: "localizableProperties", maskDefaults: "maskDefaults", masked: "masked", newTaskDefaults: "newTaskDefaults", owner: "owner", plugins: "plugins", positioned: "positioned", processItems: "processItems", record: "record", relayStoreEvents: "relayStoreEvents", resourceImagePath: "resourceImagePath", responsive: "responsive", responsiveRoot: "responsiveRoot", responsiveState: "responsiveState", responsiveTarget: "responsiveTarget", rootElement: "rootElement", scrollable: "scrollable", scrollAction: "scrollAction", scrollManager: "scrollManager", scrollOptions: "scrollOptions", selectOnNavigation: "selectOnNavigation", showAnimation: "showAnimation", showCollapseInHeader: "showCollapseInHeader", showCountInHeader: "showCountInHeader", stateful: "stateful", statefulEvents: "statefulEvents", stateId: "stateId", stateProvider: "stateProvider", stickyHeaders: "stickyHeaders", strips: "strips", swimlaneRenderer: "swimlaneRenderer", syncMask: "syncMask", tab: "tab", tabBarItems: "tabBarItems", taskRenderer: "taskRenderer", taskSorterFn: "taskSorterFn", tasksPerRow: "tasksPerRow", tbar: "tbar", ui: "ui", useDomTransition: "useDomTransition", weight: "weight", alignSelf: "alignSelf", appendTo: "appendTo", assignments: "assignments", bodyItems: "bodyItems", callOnFunctions: "callOnFunctions", catchEventHandlerExceptions: "catchEventHandlerExceptions", cls: "cls", collapsed: "collapsed", column: "column", columnField: "columnField", columns: "columns", css: "css", dataset: "dataset", disabled: "disabled", drawOnScroll: "drawOnScroll", extraData: "extraData", flex: "flex", footerItems: "footerItems", getTaskHeight: "getTaskHeight", headerItems: "headerItems", height: "height", hidden: "hidden", id: "id", inputFieldAlign: "inputFieldAlign", insertBefore: "insertBefore", insertFirst: "insertFirst", isTaskSelectable: "isTaskSelectable", keyMap: "keyMap", labelPosition: "labelPosition", margin: "margin", maxHeight: "maxHeight", maximizeOnMobile: "maximizeOnMobile", maxWidth: "maxWidth", minHeight: "minHeight", minWidth: "minWidth", project: "project", readOnly: "readOnly", rendition: "rendition", resources: "resources", rtl: "rtl", selectedTasks: "selectedTasks", showCollapseTooltip: "showCollapseTooltip", span: "span", stretchCards: "stretchCards", strictRecordMapping: "strictRecordMapping", swimlaneField: "swimlaneField", swimlanes: "swimlanes", tasks: "tasks", title: "title", tools: "tools", virtualize: "virtualize", width: "width", x: "x", y: "y", anchorSize: "anchorSize", focusVisible: "focusVisible", hasChanges: "hasChanges", parent: "parent", state: "state", columnDragFeature: "columnDragFeature", columnFilterFeature: "columnFilterFeature", columnHeaderMenuFeature: "columnHeaderMenuFeature", columnLockFeature: "columnLockFeature", columnRenameFeature: "columnRenameFeature", columnResizeFeature: "columnResizeFeature", columnSortFeature: "columnSortFeature", columnToolbarsFeature: "columnToolbarsFeature", filterBarFeature: "filterBarFeature", simpleTaskEditFeature: "simpleTaskEditFeature", swimlaneDragFeature: "swimlaneDragFeature", taskDragFeature: "taskDragFeature", taskDragSelectFeature: "taskDragSelectFeature", taskEditFeature: "taskEditFeature", taskMenuFeature: "taskMenuFeature", taskTooltipFeature: "taskTooltipFeature" }, outputs: { onActivateTask: "onActivateTask", onBeforeColumnDrag: "onBeforeColumnDrag", onBeforeColumnDrop: "onBeforeColumnDrop", onBeforeColumnResize: "onBeforeColumnResize", onBeforeDestroy: "onBeforeDestroy", onBeforeHide: "onBeforeHide", onBeforeResponsiveStateChange: "onBeforeResponsiveStateChange", onBeforeShow: "onBeforeShow", onBeforeSimpleTaskEdit: "onBeforeSimpleTaskEdit", onBeforeStateApply: "onBeforeStateApply", onBeforeStateSave: "onBeforeStateSave", onBeforeTaskDrag: "onBeforeTaskDrag", onBeforeTaskDrop: "onBeforeTaskDrop", onBeforeTaskEdit: "onBeforeTaskEdit", onBeforeTaskEditShow: "onBeforeTaskEditShow", onBeforeTaskRemove: "onBeforeTaskRemove", onCatchAll: "onCatchAll", onCellMenuItem: "onCellMenuItem", onCellMenuShow: "onCellMenuShow", onCellMenuToggleItem: "onCellMenuToggleItem", onCollapse: "onCollapse", onColumnCollapse: "onColumnCollapse", onColumnDrag: "onColumnDrag", onColumnDragAbort: "onColumnDragAbort", onColumnDragEnd: "onColumnDragEnd", onColumnDragStart: "onColumnDragStart", onColumnDrop: "onColumnDrop", onColumnExpand: "onColumnExpand", onColumnFilterHide: "onColumnFilterHide", onColumnFilterShow: "onColumnFilterShow", onColumnFilterToggle: "onColumnFilterToggle", onColumnHeaderClick: "onColumnHeaderClick", onColumnHeaderContextMenu: "onColumnHeaderContextMenu", onColumnHeaderDblClick: "onColumnHeaderDblClick", onColumnHeaderMenuBeforeShow: "onColumnHeaderMenuBeforeShow", onColumnResize: "onColumnResize", onColumnResizeStart: "onColumnResizeStart", onColumnTitleClick: "onColumnTitleClick", onColumnTitleContextMenu: "onColumnTitleContextMenu", onColumnTitleDblClick: "onColumnTitleDblClick", onColumnToggle: "onColumnToggle", onDestroy: "onDestroy", onDirtyStateChange: "onDirtyStateChange", onElementCreated: "onElementCreated", onExpand: "onExpand", onFocusIn: "onFocusIn", onFocusOut: "onFocusOut", onHide: "onHide", onPaint: "onPaint", onReadOnly: "onReadOnly", onRecompose: "onRecompose", onRemoveTaskElement: "onRemoveTaskElement", onRenderTask: "onRenderTask", onRenderTasks: "onRenderTasks", onResize: "onResize", onResponsiveStateChange: "onResponsiveStateChange", onSelectionChange: "onSelectionChange", onShow: "onShow", onSimpleTaskEditCancel: "onSimpleTaskEditCancel", onSimpleTaskEditComplete: "onSimpleTaskEditComplete", onSwimlaneCollapse: "onSwimlaneCollapse", onSwimlaneExpand: "onSwimlaneExpand", onSwimlaneHeaderClick: "onSwimlaneHeaderClick", onSwimlaneHeaderContextMenu: "onSwimlaneHeaderContextMenu", onSwimlaneHeaderDblClick: "onSwimlaneHeaderDblClick", onSwimlaneToggle: "onSwimlaneToggle", onTaskClick: "onTaskClick", onTaskDblClick: "onTaskDblClick", onTaskDrag: "onTaskDrag", onTaskDragAbort: "onTaskDragAbort", onTaskDragEnd: "onTaskDragEnd", onTaskDragStart: "onTaskDragStart", onTaskDrop: "onTaskDrop", onTaskMenuBeforeShow: "onTaskMenuBeforeShow", onTaskMenuItem: "onTaskMenuItem", onTaskMenuShow: "onTaskMenuShow", onTaskMenuToggleItem: "onTaskMenuToggleItem", onTaskMouseEnter: "onTaskMouseEnter", onTaskMouseLeave: "onTaskMouseLeave", onToolClick: "onToolClick" }, usesOnChanges: true, ngImport: i0, template: '', isInline: true });
|
|
1199
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.0", ngImport: i0, type: BryntumTaskBoardBaseComponent, decorators: [{
|
|
1200
|
+
type: Component,
|
|
1201
|
+
args: [{
|
|
1202
|
+
selector: 'bryntum-task-board-base',
|
|
1203
|
+
template: ''
|
|
1204
|
+
}]
|
|
1205
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { activateTaskEvent: [{
|
|
1206
|
+
type: Input
|
|
1207
|
+
}], adopt: [{
|
|
1208
|
+
type: Input
|
|
1209
|
+
}], align: [{
|
|
1210
|
+
type: Input
|
|
1211
|
+
}], anchor: [{
|
|
1212
|
+
type: Input
|
|
1213
|
+
}], ariaDescription: [{
|
|
1214
|
+
type: Input
|
|
1215
|
+
}], ariaLabel: [{
|
|
1216
|
+
type: Input
|
|
1217
|
+
}], autoGenerateColumns: [{
|
|
1218
|
+
type: Input
|
|
1219
|
+
}], autoGenerateSwimlanes: [{
|
|
1220
|
+
type: Input
|
|
1221
|
+
}], bbar: [{
|
|
1222
|
+
type: Input
|
|
1223
|
+
}], bodyCls: [{
|
|
1224
|
+
type: Input
|
|
1225
|
+
}], bubbleEvents: [{
|
|
1226
|
+
type: Input
|
|
1227
|
+
}], cardSizes: [{
|
|
1228
|
+
type: Input
|
|
1229
|
+
}], centered: [{
|
|
1230
|
+
type: Input
|
|
1231
|
+
}], chainFilters: [{
|
|
1232
|
+
type: Input
|
|
1233
|
+
}], collapseTitle: [{
|
|
1234
|
+
type: Input
|
|
1235
|
+
}], collapsible: [{
|
|
1236
|
+
type: Input
|
|
1237
|
+
}], color: [{
|
|
1238
|
+
type: Input
|
|
1239
|
+
}], columnTitleRenderer: [{
|
|
1240
|
+
type: Input
|
|
1241
|
+
}], config: [{
|
|
1242
|
+
type: Input
|
|
1243
|
+
}], constrainTo: [{
|
|
1244
|
+
type: Input
|
|
1245
|
+
}], cssVarPrefix: [{
|
|
1246
|
+
type: Input
|
|
1247
|
+
}], dataField: [{
|
|
1248
|
+
type: Input
|
|
1249
|
+
}], detectCSSCompatibilityIssues: [{
|
|
1250
|
+
type: Input
|
|
1251
|
+
}], dock: [{
|
|
1252
|
+
type: Input
|
|
1253
|
+
}], draggable: [{
|
|
1254
|
+
type: Input
|
|
1255
|
+
}], drawer: [{
|
|
1256
|
+
type: Input
|
|
1257
|
+
}], elementAttributes: [{
|
|
1258
|
+
type: Input
|
|
1259
|
+
}], floating: [{
|
|
1260
|
+
type: Input
|
|
1261
|
+
}], footer: [{
|
|
1262
|
+
type: Input
|
|
1263
|
+
}], header: [{
|
|
1264
|
+
type: Input
|
|
1265
|
+
}], hideAnimation: [{
|
|
1266
|
+
type: Input
|
|
1267
|
+
}], htmlEncodeHeaderText: [{
|
|
1268
|
+
type: Input
|
|
1269
|
+
}], icon: [{
|
|
1270
|
+
type: Input
|
|
1271
|
+
}], ignoreParentReadOnly: [{
|
|
1272
|
+
type: Input
|
|
1273
|
+
}], listeners: [{
|
|
1274
|
+
type: Input
|
|
1275
|
+
}], loadMask: [{
|
|
1276
|
+
type: Input
|
|
1277
|
+
}], loadMaskDefaults: [{
|
|
1278
|
+
type: Input
|
|
1279
|
+
}], loadMaskError: [{
|
|
1280
|
+
type: Input
|
|
1281
|
+
}], localeClass: [{
|
|
1282
|
+
type: Input
|
|
1283
|
+
}], localizable: [{
|
|
1284
|
+
type: Input
|
|
1285
|
+
}], localizableProperties: [{
|
|
1286
|
+
type: Input
|
|
1287
|
+
}], maskDefaults: [{
|
|
1288
|
+
type: Input
|
|
1289
|
+
}], masked: [{
|
|
1290
|
+
type: Input
|
|
1291
|
+
}], newTaskDefaults: [{
|
|
1292
|
+
type: Input
|
|
1293
|
+
}], owner: [{
|
|
1294
|
+
type: Input
|
|
1295
|
+
}], plugins: [{
|
|
1296
|
+
type: Input
|
|
1297
|
+
}], positioned: [{
|
|
1298
|
+
type: Input
|
|
1299
|
+
}], processItems: [{
|
|
1300
|
+
type: Input
|
|
1301
|
+
}], record: [{
|
|
1302
|
+
type: Input
|
|
1303
|
+
}], relayStoreEvents: [{
|
|
1304
|
+
type: Input
|
|
1305
|
+
}], resourceImagePath: [{
|
|
1306
|
+
type: Input
|
|
1307
|
+
}], responsive: [{
|
|
1308
|
+
type: Input
|
|
1309
|
+
}], responsiveRoot: [{
|
|
1310
|
+
type: Input
|
|
1311
|
+
}], responsiveState: [{
|
|
1312
|
+
type: Input
|
|
1313
|
+
}], responsiveTarget: [{
|
|
1314
|
+
type: Input
|
|
1315
|
+
}], rootElement: [{
|
|
1316
|
+
type: Input
|
|
1317
|
+
}], scrollable: [{
|
|
1318
|
+
type: Input
|
|
1319
|
+
}], scrollAction: [{
|
|
1320
|
+
type: Input
|
|
1321
|
+
}], scrollManager: [{
|
|
1322
|
+
type: Input
|
|
1323
|
+
}], scrollOptions: [{
|
|
1324
|
+
type: Input
|
|
1325
|
+
}], selectOnNavigation: [{
|
|
1326
|
+
type: Input
|
|
1327
|
+
}], showAnimation: [{
|
|
1328
|
+
type: Input
|
|
1329
|
+
}], showCollapseInHeader: [{
|
|
1330
|
+
type: Input
|
|
1331
|
+
}], showCountInHeader: [{
|
|
1332
|
+
type: Input
|
|
1333
|
+
}], stateful: [{
|
|
1334
|
+
type: Input
|
|
1335
|
+
}], statefulEvents: [{
|
|
1336
|
+
type: Input
|
|
1337
|
+
}], stateId: [{
|
|
1338
|
+
type: Input
|
|
1339
|
+
}], stateProvider: [{
|
|
1340
|
+
type: Input
|
|
1341
|
+
}], stickyHeaders: [{
|
|
1342
|
+
type: Input
|
|
1343
|
+
}], strips: [{
|
|
1344
|
+
type: Input
|
|
1345
|
+
}], swimlaneRenderer: [{
|
|
1346
|
+
type: Input
|
|
1347
|
+
}], syncMask: [{
|
|
1348
|
+
type: Input
|
|
1349
|
+
}], tab: [{
|
|
1350
|
+
type: Input
|
|
1351
|
+
}], tabBarItems: [{
|
|
1352
|
+
type: Input
|
|
1353
|
+
}], taskRenderer: [{
|
|
1354
|
+
type: Input
|
|
1355
|
+
}], taskSorterFn: [{
|
|
1356
|
+
type: Input
|
|
1357
|
+
}], tasksPerRow: [{
|
|
1358
|
+
type: Input
|
|
1359
|
+
}], tbar: [{
|
|
1360
|
+
type: Input
|
|
1361
|
+
}], ui: [{
|
|
1362
|
+
type: Input
|
|
1363
|
+
}], useDomTransition: [{
|
|
1364
|
+
type: Input
|
|
1365
|
+
}], weight: [{
|
|
1366
|
+
type: Input
|
|
1367
|
+
}], alignSelf: [{
|
|
1368
|
+
type: Input
|
|
1369
|
+
}], appendTo: [{
|
|
1370
|
+
type: Input
|
|
1371
|
+
}], assignments: [{
|
|
1372
|
+
type: Input
|
|
1373
|
+
}], bodyItems: [{
|
|
1374
|
+
type: Input
|
|
1375
|
+
}], callOnFunctions: [{
|
|
1376
|
+
type: Input
|
|
1377
|
+
}], catchEventHandlerExceptions: [{
|
|
1378
|
+
type: Input
|
|
1379
|
+
}], cls: [{
|
|
1380
|
+
type: Input
|
|
1381
|
+
}], collapsed: [{
|
|
1382
|
+
type: Input
|
|
1383
|
+
}], column: [{
|
|
1384
|
+
type: Input
|
|
1385
|
+
}], columnField: [{
|
|
1386
|
+
type: Input
|
|
1387
|
+
}], columns: [{
|
|
1388
|
+
type: Input
|
|
1389
|
+
}], css: [{
|
|
1390
|
+
type: Input
|
|
1391
|
+
}], dataset: [{
|
|
1392
|
+
type: Input
|
|
1393
|
+
}], disabled: [{
|
|
1394
|
+
type: Input
|
|
1395
|
+
}], drawOnScroll: [{
|
|
1396
|
+
type: Input
|
|
1397
|
+
}], extraData: [{
|
|
1398
|
+
type: Input
|
|
1399
|
+
}], flex: [{
|
|
1400
|
+
type: Input
|
|
1401
|
+
}], footerItems: [{
|
|
1402
|
+
type: Input
|
|
1403
|
+
}], getTaskHeight: [{
|
|
1404
|
+
type: Input
|
|
1405
|
+
}], headerItems: [{
|
|
1406
|
+
type: Input
|
|
1407
|
+
}], height: [{
|
|
1408
|
+
type: Input
|
|
1409
|
+
}], hidden: [{
|
|
1410
|
+
type: Input
|
|
1411
|
+
}], id: [{
|
|
1412
|
+
type: Input
|
|
1413
|
+
}], inputFieldAlign: [{
|
|
1414
|
+
type: Input
|
|
1415
|
+
}], insertBefore: [{
|
|
1416
|
+
type: Input
|
|
1417
|
+
}], insertFirst: [{
|
|
1418
|
+
type: Input
|
|
1419
|
+
}], isTaskSelectable: [{
|
|
1420
|
+
type: Input
|
|
1421
|
+
}], keyMap: [{
|
|
1422
|
+
type: Input
|
|
1423
|
+
}], labelPosition: [{
|
|
1424
|
+
type: Input
|
|
1425
|
+
}], margin: [{
|
|
1426
|
+
type: Input
|
|
1427
|
+
}], maxHeight: [{
|
|
1428
|
+
type: Input
|
|
1429
|
+
}], maximizeOnMobile: [{
|
|
1430
|
+
type: Input
|
|
1431
|
+
}], maxWidth: [{
|
|
1432
|
+
type: Input
|
|
1433
|
+
}], minHeight: [{
|
|
1434
|
+
type: Input
|
|
1435
|
+
}], minWidth: [{
|
|
1436
|
+
type: Input
|
|
1437
|
+
}], project: [{
|
|
1438
|
+
type: Input
|
|
1439
|
+
}], readOnly: [{
|
|
1440
|
+
type: Input
|
|
1441
|
+
}], rendition: [{
|
|
1442
|
+
type: Input
|
|
1443
|
+
}], resources: [{
|
|
1444
|
+
type: Input
|
|
1445
|
+
}], rtl: [{
|
|
1446
|
+
type: Input
|
|
1447
|
+
}], selectedTasks: [{
|
|
1448
|
+
type: Input
|
|
1449
|
+
}], showCollapseTooltip: [{
|
|
1450
|
+
type: Input
|
|
1451
|
+
}], span: [{
|
|
1452
|
+
type: Input
|
|
1453
|
+
}], stretchCards: [{
|
|
1454
|
+
type: Input
|
|
1455
|
+
}], strictRecordMapping: [{
|
|
1456
|
+
type: Input
|
|
1457
|
+
}], swimlaneField: [{
|
|
1458
|
+
type: Input
|
|
1459
|
+
}], swimlanes: [{
|
|
1460
|
+
type: Input
|
|
1461
|
+
}], tasks: [{
|
|
1462
|
+
type: Input
|
|
1463
|
+
}], title: [{
|
|
1464
|
+
type: Input
|
|
1465
|
+
}], tools: [{
|
|
1466
|
+
type: Input
|
|
1467
|
+
}], virtualize: [{
|
|
1468
|
+
type: Input
|
|
1469
|
+
}], width: [{
|
|
1470
|
+
type: Input
|
|
1471
|
+
}], x: [{
|
|
1472
|
+
type: Input
|
|
1473
|
+
}], y: [{
|
|
1474
|
+
type: Input
|
|
1475
|
+
}], anchorSize: [{
|
|
1476
|
+
type: Input
|
|
1477
|
+
}], focusVisible: [{
|
|
1478
|
+
type: Input
|
|
1479
|
+
}], hasChanges: [{
|
|
1480
|
+
type: Input
|
|
1481
|
+
}], parent: [{
|
|
1482
|
+
type: Input
|
|
1483
|
+
}], state: [{
|
|
1484
|
+
type: Input
|
|
1485
|
+
}], columnDragFeature: [{
|
|
1486
|
+
type: Input
|
|
1487
|
+
}], columnFilterFeature: [{
|
|
1488
|
+
type: Input
|
|
1489
|
+
}], columnHeaderMenuFeature: [{
|
|
1490
|
+
type: Input
|
|
1491
|
+
}], columnLockFeature: [{
|
|
1492
|
+
type: Input
|
|
1493
|
+
}], columnRenameFeature: [{
|
|
1494
|
+
type: Input
|
|
1495
|
+
}], columnResizeFeature: [{
|
|
1496
|
+
type: Input
|
|
1497
|
+
}], columnSortFeature: [{
|
|
1498
|
+
type: Input
|
|
1499
|
+
}], columnToolbarsFeature: [{
|
|
1500
|
+
type: Input
|
|
1501
|
+
}], filterBarFeature: [{
|
|
1502
|
+
type: Input
|
|
1503
|
+
}], simpleTaskEditFeature: [{
|
|
1504
|
+
type: Input
|
|
1505
|
+
}], swimlaneDragFeature: [{
|
|
1506
|
+
type: Input
|
|
1507
|
+
}], taskDragFeature: [{
|
|
1508
|
+
type: Input
|
|
1509
|
+
}], taskDragSelectFeature: [{
|
|
1510
|
+
type: Input
|
|
1511
|
+
}], taskEditFeature: [{
|
|
1512
|
+
type: Input
|
|
1513
|
+
}], taskMenuFeature: [{
|
|
1514
|
+
type: Input
|
|
1515
|
+
}], taskTooltipFeature: [{
|
|
1516
|
+
type: Input
|
|
1517
|
+
}], onActivateTask: [{
|
|
1518
|
+
type: Output
|
|
1519
|
+
}], onBeforeColumnDrag: [{
|
|
1520
|
+
type: Output
|
|
1521
|
+
}], onBeforeColumnDrop: [{
|
|
1522
|
+
type: Output
|
|
1523
|
+
}], onBeforeColumnResize: [{
|
|
1524
|
+
type: Output
|
|
1525
|
+
}], onBeforeDestroy: [{
|
|
1526
|
+
type: Output
|
|
1527
|
+
}], onBeforeHide: [{
|
|
1528
|
+
type: Output
|
|
1529
|
+
}], onBeforeResponsiveStateChange: [{
|
|
1530
|
+
type: Output
|
|
1531
|
+
}], onBeforeShow: [{
|
|
1532
|
+
type: Output
|
|
1533
|
+
}], onBeforeSimpleTaskEdit: [{
|
|
1534
|
+
type: Output
|
|
1535
|
+
}], onBeforeStateApply: [{
|
|
1536
|
+
type: Output
|
|
1537
|
+
}], onBeforeStateSave: [{
|
|
1538
|
+
type: Output
|
|
1539
|
+
}], onBeforeTaskDrag: [{
|
|
1540
|
+
type: Output
|
|
1541
|
+
}], onBeforeTaskDrop: [{
|
|
1542
|
+
type: Output
|
|
1543
|
+
}], onBeforeTaskEdit: [{
|
|
1544
|
+
type: Output
|
|
1545
|
+
}], onBeforeTaskEditShow: [{
|
|
1546
|
+
type: Output
|
|
1547
|
+
}], onBeforeTaskRemove: [{
|
|
1548
|
+
type: Output
|
|
1549
|
+
}], onCatchAll: [{
|
|
1550
|
+
type: Output
|
|
1551
|
+
}], onCellMenuItem: [{
|
|
1552
|
+
type: Output
|
|
1553
|
+
}], onCellMenuShow: [{
|
|
1554
|
+
type: Output
|
|
1555
|
+
}], onCellMenuToggleItem: [{
|
|
1556
|
+
type: Output
|
|
1557
|
+
}], onCollapse: [{
|
|
1558
|
+
type: Output
|
|
1559
|
+
}], onColumnCollapse: [{
|
|
1560
|
+
type: Output
|
|
1561
|
+
}], onColumnDrag: [{
|
|
1562
|
+
type: Output
|
|
1563
|
+
}], onColumnDragAbort: [{
|
|
1564
|
+
type: Output
|
|
1565
|
+
}], onColumnDragEnd: [{
|
|
1566
|
+
type: Output
|
|
1567
|
+
}], onColumnDragStart: [{
|
|
1568
|
+
type: Output
|
|
1569
|
+
}], onColumnDrop: [{
|
|
1570
|
+
type: Output
|
|
1571
|
+
}], onColumnExpand: [{
|
|
1572
|
+
type: Output
|
|
1573
|
+
}], onColumnFilterHide: [{
|
|
1574
|
+
type: Output
|
|
1575
|
+
}], onColumnFilterShow: [{
|
|
1576
|
+
type: Output
|
|
1577
|
+
}], onColumnFilterToggle: [{
|
|
1578
|
+
type: Output
|
|
1579
|
+
}], onColumnHeaderClick: [{
|
|
1580
|
+
type: Output
|
|
1581
|
+
}], onColumnHeaderContextMenu: [{
|
|
1582
|
+
type: Output
|
|
1583
|
+
}], onColumnHeaderDblClick: [{
|
|
1584
|
+
type: Output
|
|
1585
|
+
}], onColumnHeaderMenuBeforeShow: [{
|
|
1586
|
+
type: Output
|
|
1587
|
+
}], onColumnResize: [{
|
|
1588
|
+
type: Output
|
|
1589
|
+
}], onColumnResizeStart: [{
|
|
1590
|
+
type: Output
|
|
1591
|
+
}], onColumnTitleClick: [{
|
|
1592
|
+
type: Output
|
|
1593
|
+
}], onColumnTitleContextMenu: [{
|
|
1594
|
+
type: Output
|
|
1595
|
+
}], onColumnTitleDblClick: [{
|
|
1596
|
+
type: Output
|
|
1597
|
+
}], onColumnToggle: [{
|
|
1598
|
+
type: Output
|
|
1599
|
+
}], onDestroy: [{
|
|
1600
|
+
type: Output
|
|
1601
|
+
}], onDirtyStateChange: [{
|
|
1602
|
+
type: Output
|
|
1603
|
+
}], onElementCreated: [{
|
|
1604
|
+
type: Output
|
|
1605
|
+
}], onExpand: [{
|
|
1606
|
+
type: Output
|
|
1607
|
+
}], onFocusIn: [{
|
|
1608
|
+
type: Output
|
|
1609
|
+
}], onFocusOut: [{
|
|
1610
|
+
type: Output
|
|
1611
|
+
}], onHide: [{
|
|
1612
|
+
type: Output
|
|
1613
|
+
}], onPaint: [{
|
|
1614
|
+
type: Output
|
|
1615
|
+
}], onReadOnly: [{
|
|
1616
|
+
type: Output
|
|
1617
|
+
}], onRecompose: [{
|
|
1618
|
+
type: Output
|
|
1619
|
+
}], onRemoveTaskElement: [{
|
|
1620
|
+
type: Output
|
|
1621
|
+
}], onRenderTask: [{
|
|
1622
|
+
type: Output
|
|
1623
|
+
}], onRenderTasks: [{
|
|
1624
|
+
type: Output
|
|
1625
|
+
}], onResize: [{
|
|
1626
|
+
type: Output
|
|
1627
|
+
}], onResponsiveStateChange: [{
|
|
1628
|
+
type: Output
|
|
1629
|
+
}], onSelectionChange: [{
|
|
1630
|
+
type: Output
|
|
1631
|
+
}], onShow: [{
|
|
1632
|
+
type: Output
|
|
1633
|
+
}], onSimpleTaskEditCancel: [{
|
|
1634
|
+
type: Output
|
|
1635
|
+
}], onSimpleTaskEditComplete: [{
|
|
1636
|
+
type: Output
|
|
1637
|
+
}], onSwimlaneCollapse: [{
|
|
1638
|
+
type: Output
|
|
1639
|
+
}], onSwimlaneExpand: [{
|
|
1640
|
+
type: Output
|
|
1641
|
+
}], onSwimlaneHeaderClick: [{
|
|
1642
|
+
type: Output
|
|
1643
|
+
}], onSwimlaneHeaderContextMenu: [{
|
|
1644
|
+
type: Output
|
|
1645
|
+
}], onSwimlaneHeaderDblClick: [{
|
|
1646
|
+
type: Output
|
|
1647
|
+
}], onSwimlaneToggle: [{
|
|
1648
|
+
type: Output
|
|
1649
|
+
}], onTaskClick: [{
|
|
1650
|
+
type: Output
|
|
1651
|
+
}], onTaskDblClick: [{
|
|
1652
|
+
type: Output
|
|
1653
|
+
}], onTaskDrag: [{
|
|
1654
|
+
type: Output
|
|
1655
|
+
}], onTaskDragAbort: [{
|
|
1656
|
+
type: Output
|
|
1657
|
+
}], onTaskDragEnd: [{
|
|
1658
|
+
type: Output
|
|
1659
|
+
}], onTaskDragStart: [{
|
|
1660
|
+
type: Output
|
|
1661
|
+
}], onTaskDrop: [{
|
|
1662
|
+
type: Output
|
|
1663
|
+
}], onTaskMenuBeforeShow: [{
|
|
1664
|
+
type: Output
|
|
1665
|
+
}], onTaskMenuItem: [{
|
|
1666
|
+
type: Output
|
|
1667
|
+
}], onTaskMenuShow: [{
|
|
1668
|
+
type: Output
|
|
1669
|
+
}], onTaskMenuToggleItem: [{
|
|
1670
|
+
type: Output
|
|
1671
|
+
}], onTaskMouseEnter: [{
|
|
1672
|
+
type: Output
|
|
1673
|
+
}], onTaskMouseLeave: [{
|
|
1674
|
+
type: Output
|
|
1675
|
+
}], onToolClick: [{
|
|
1676
|
+
type: Output
|
|
1677
|
+
}] } });
|
|
1678
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJ5bnR1bS10YXNrLWJvYXJkLWJhc2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vY29tcG9uZW50L3NyYy9saWIvYnJ5bnR1bS10YXNrLWJvYXJkLWJhc2UuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHNEQUFzRDtBQUN0RDs7R0FFRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQWtELE1BQU0sZUFBZSxDQUFDO0FBRW5JLE9BQU8sYUFBYSxNQUFNLGtCQUFrQixDQUFDO0FBRTdDLE9BQU8sRUFBeTVCLGFBQWEsRUFBc1IsTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFdHVDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7QUFvOUJsRCxNQUFNLE9BQU8sNkJBQTZCO0lBb1p0QyxZQUFZLE9BQW1CO1FBVHZCLGtCQUFhLEdBQUc7WUFDcEIsS0FBSyxFQUFjLFNBQVM7WUFDNUIsUUFBUSxFQUFXLFNBQVM7WUFDNUIsSUFBSSxFQUFlLFNBQVM7WUFDNUIsZ0JBQWdCLEVBQUcsSUFBSTtZQUN2QixRQUFRLEVBQVcsRUFBRTtZQUNyQixTQUFTLEVBQVUsRUFBRTtTQUN4QixDQUFDO1FBZ0xGLGtCQUFrQjtRQUNsQjs7Ozs7Ozs7V0FRRztRQUNPLG1CQUFjLEdBQVEsSUFBSSxZQUFZLEVBQTZGLENBQUM7UUFDOUk7Ozs7O1dBS0c7UUFDTyx1QkFBa0IsR0FBUSxJQUFJLFlBQVksRUFBdUcsQ0FBQztRQUM1Sjs7Ozs7Ozs7O1dBU0c7UUFDTyx1QkFBa0IsR0FBUSxJQUFJLFlBQVksRUFBa0ksQ0FBQztRQUN2TDs7Ozs7OztXQU9HO1FBQ08seUJBQW9CLEdBQVEsSUFBSSxZQUFZLEVBQWtILENBQUM7UUFDeks7Ozs7V0FJRztRQUNPLG9CQUFlLEdBQVEsSUFBSSxZQUFZLEVBQThDLENBQUM7UUFDaEc7Ozs7V0FJ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aUI7c0JBQTFCLE1BQU07Z0JBTUcsTUFBTTtzQkFBZixNQUFNO2dCQVdHLHNCQUFzQjtzQkFBL0IsTUFBTTtnQkFXRyx3QkFBd0I7c0JBQWpDLE1BQU07Z0JBT0csa0JBQWtCO3NCQUEzQixNQUFNO2dCQU9HLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFVRyxxQkFBcUI7c0JBQTlCLE1BQU07Z0JBVUcsMkJBQTJCO3NCQUFwQyxNQUFNO2dCQVVHLHdCQUF3QjtzQkFBakMsTUFBTTtnQkFRRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBWUcsV0FBVztzQkFBcEIsTUFBTTtnQkFZRyxjQUFjO3NCQUF2QixNQUFNO2dCQWFHLFVBQVU7c0JBQW5CLE1BQU07Z0JBT0csZUFBZTtzQkFBeEIsTUFBTTtnQkFTRyxhQUFhO3NCQUF0QixNQUFNO2dCQVFHLGVBQWU7c0JBQXhCLE1BQU07Z0JBV0csVUFBVTtzQkFBbkIsTUFBTTtnQkFZRyxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBU0csY0FBYztzQkFBdkIsTUFBTTtnQkFTRyxjQUFjO3NCQUF2QixNQUFNO2dCQVVHLG9CQUFvQjtzQkFBN0IsTUFBTTtnQkFZRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBWUcsZ0JBQWdCO3NCQUF6QixNQUFNO2dCQU9HLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbi8qKlxuICogQW5ndWxhciB3cmFwcGVyIGZvciBCcnludHVtIFRhc2tCb2FyZEJhc2VcbiAqL1xuXG5pbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgT3V0cHV0LCBJbnB1dCwgU2ltcGxlQ2hhbmdlLCBTaW1wbGVDaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgV3JhcHBlckhlbHBlciBmcm9tICcuL3dyYXBwZXIuaGVscGVyJztcblxuaW1wb3J0IHsgQWxpZ25TcGVjLCBBc3NpZ25tZW50TW9kZWwsIEFzc2lnbm1lbnRNb2RlbENvbmZpZywgQmFzZSwgQnJ5bnR1bVNjcm9sbE9wdGlvbnMsIENhcmRTaXplLCBDb2x1bW5EcmFnLCBDb2x1bW5EcmFnQ29uZmlnLCBDb2x1bW5GaWx0ZXIsIENvbHVtbkZpbHRlckNvbmZpZywgQ29sdW1uSGVhZGVyTWVudSwgQ29sdW1uSGVhZGVyTWVudUNvbmZpZywgQ29sdW1uTG9jaywgQ29sdW1uTG9ja0NvbmZpZywgQ29sdW1uTW9kZWwsIENvbHVtbk1vZGVsQ29uZmlnLCBDb2x1bW5SZW5hbWUsIENvbHVtblJlbmFtZUNvbmZpZywgQ29sdW1uUmVzaXplLCBDb2x1bW5SZXNpemVDb25maWcsIENvbHVtblNvcnQsIENvbHVtblNvcnRDb25maWcsIENvbHVtblRvb2xiYXJzLCBDb2x1bW5Ub29sYmFyc0NvbmZpZywgQ29udGFpbmVyLCBDb250YWluZXJJdGVtQ29uZmlnLCBEb21Db25maWcsIEZpbHRlckJhciwgRmlsdGVyQmFyQ29uZmlnLCBLZXlNYXBDb25maWcsIE1hc2ssIE1hc2tDb25maWcsIE1lbnUsIE1lbnVJdGVtLCBNZW51SXRlbUVudHJ5LCBNb2RlbCwgUGFnaW5nVG9vbGJhckNvbmZpZywgUGFuZWwsIFBhbmVsQ29sbGFwc2VyQ29uZmlnLCBQYW5lbENvbGxhcHNlck92ZXJsYXlDb25maWcsIFBhbmVsSGVhZGVyLCBQcm9qZWN0TW9kZWwsIFByb2plY3RNb2RlbENvbmZpZywgUmVjdGFuZ2xlLCBSZXNvdXJjZU1vZGVsLCBSZXNvdXJjZU1vZGVsQ29uZmlnLCBTY3JvbGxNYW5hZ2VyQ29uZmlnLCBTY3JvbGxlciwgU2Nyb2xsZXJDb25maWcsIFNpbXBsZVRhc2tFZGl0LCBTaW1wbGVUYXNrRWRpdENvbmZpZywgU3RhdGVQcm92aWRlciwgU3RvcmUsIFN0b3JlQ29uZmlnLCBTd2ltbGFuZURyYWcsIFN3aW1sYW5lRHJhZ0NvbmZpZywgU3dpbWxhbmVNb2RlbCwgU3dpbWxhbmVNb2RlbENvbmZpZywgVGFiQ29uZmlnLCBUYXNrQm9hcmQsIFRhc2tCb2FyZEJhc2UsIFRhc2tCb2FyZEJhc2VMaXN0ZW5lcnMsIFRhc2tEcmFnLCBUYXNrRHJhZ0NvbmZpZywgVGFza0RyYWdTZWxlY3QsIFRhc2tEcmFnU2VsZWN0Q29uZmlnLCBUYXNrRWRpdCwgVGFza0VkaXRDb25maWcsIFRhc2tFZGl0b3IsIFRhc2tJdGVtT3B0aW9ucywgVGFza01lbnUsIFRhc2tNZW51Q29uZmlnLCBUYXNrTW9kZWwsIFRhc2tNb2RlbENvbmZpZywgVGFza1Rvb2x0aXAsIFRhc2tUb29sdGlwQ29uZmlnLCBUb29sLCBUb29sQ29uZmlnLCBUb29sYmFyQ29uZmlnLCBUb29sYmFySXRlbXMsIFdpZGdldCB9IGZyb20gJ0BicnludHVtL3Rhc2tib2FyZCc7XG5cbmltcG9ydCB7IFN0cmluZ0hlbHBlciB9IGZyb20gJ0BicnludHVtL3Rhc2tib2FyZCc7XG5cbmV4cG9ydCB0eXBlIEJyeW50dW1UYXNrQm9hcmRCYXNlUHJvcHMgPSB7XG4gICAgLy8gQ29uZmlnc1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBldmVudCB0aGF0IHNob3VsZCBhY3RpdmF0ZSBhIHRhc2sgYW5kIHRyaWdnZXIgZWRpdGluZyAoaWYgYW4gZWRpdGluZyBmZWF0dXJlIGlzIGFjdGl2ZSkuXG4gICAgICogQXZhaWxhYmxlIG9wdGlvbnMgYXJlOiAndGFza0NsaWNrJywgJ3Rhc2tEYmxDbGljaycgb3IgbnVsbCAoZGlzYWJsZSlcbiAgICAgKi9cbiAgICBhY3RpdmF0ZVRhc2tFdmVudCA/IDogJ3Rhc2tDbGljayd8J3Rhc2tEYmxDbGljayd8bnVsbFxuICAgIC8qKlxuICAgICAqIEVsZW1lbnQgKG9yIGVsZW1lbnQgaWQpIHRvIGFkb3B0IGFzIHRoaXMgV2lkZ2V0J3MgZW5jYXBzdWxhdGluZyBlbGVtZW50LiBUaGUgd2lkZ2V0J3NcbiAgICAgKiBjb250ZW50IHdpbGwgYmUgcGxhY2VkIGluc2lkZSB0aGlzIGVsZW1lbnQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLWFkb3B0KVxuICAgICAqL1xuICAgIGFkb3B0ID8gOiBIVE1MRWxlbWVudHxzdHJpbmdcbiAgICAvKipcbiAgICAgKiAqT25seSB2YWxpZCBpZiB0aGlzIFdpZGdldCBpcyBbZmxvYXRpbmddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctZmxvYXRpbmcpLipcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctYWxpZ24pXG4gICAgICovXG4gICAgYWxpZ24gPyA6IEFsaWduU3BlY3xzdHJpbmdcbiAgICAvKipcbiAgICAgKiBXaGVuIHRoaXMgd2lkZ2V0IGlzIGEgY2hpbGQgb2YgYSBbQ29udGFpbmVyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db250YWluZXIpLCBpdCB3aWxsIGJ5IGRlZmF1bHQgYmUgcGFydGljaXBhdGluZyBpbiBhXG4gICAgICogZmxleGJveCBsYXlvdXQuIFRoaXMgY29uZmlnIGFsbG93cyB5b3UgdG8gc2V0IHRoaXMgd2lkZ2V0J3NcbiAgICAgKiBbYWxpZ24tc2VsZl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL2FsaWduLXNlbGYpIHN0eWxlLlxuICAgICAqL1xuICAgIGFsaWduU2VsZiA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogKk9ubHkgdmFsaWQgaWYgdGhpcyBXaWRnZXQgaXMgW2Zsb2F0aW5nXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLWZsb2F0aW5nKSBhbmQgYmVpbmcgc2hvd24gdGhyb3VnaCBbc2hvd0J5XSgjQ29yZS93aWRnZXQvV2lkZ2V0I2Z1bmN0aW9uLXNob3dCeSkuKlxuICAgICAqIGB0cnVlYCB0byBzaG93IGEgY29ubmVjdG9yIGFycm93IHBvaW50aW5nIHRvIHRoZSBhbGlnbiB0YXJnZXQuXG4gICAgICovXG4gICAgYW5jaG9yID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogRWxlbWVudCAob3IgdGhlIGlkIG9mIGFuIGVsZW1lbnQpIHRvIGFwcGVuZCB0aGlzIHdpZGdldCdzIGVsZW1lbnQgdG8uIENhbiBiZSBjb25maWd1cmVkLCBvciBzZXQgb25jZSBhdFxuICAgICAqIHJ1bnRpbWUuIFRvIGFjY2VzcyB0aGUgZWxlbWVudCBvZiBhIHJlbmRlcmVkIHdpZGdldCwgc2VlIFtlbGVtZW50XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjcHJvcGVydHktZWxlbWVudCkuXG4gICAgICovXG4gICAgYXBwZW5kVG8gPyA6IEhUTUxFbGVtZW50fHN0cmluZ1xuICAgIC8qKlxuICAgICAqIEEgbG9jYWxpemFibGUgc3RyaW5nIChNYXkgY29udGFpbiBgJ0x7fSdgIHRva2VucyB3aGljaCByZXNvbHZlIGluIHRoZSBsb2NhbGUgZmlsZSkgdG8gaW5qZWN0XG4gICAgICogaW50byBhbiBlbGVtZW50IHdoaWNoIHdpbGwgYmUgbGlua2VkIHVzaW5nIHRoZSBgYXJpYS1kZXNjcmliZWRieWAgYXR0cmlidXRlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1hcmlhRGVzY3JpcHRpb24pXG4gICAgICovXG4gICAgYXJpYURlc2NyaXB0aW9uID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBIGxvY2FsaXphYmxlIHN0cmluZyAoTWF5IGNvbnRhaW4gYCdMe30nYCB0b2tlbnMgd2hpY2ggcmVzb2x2ZSBpbiB0aGUgbG9jYWxlIGZpbGUpIHRvIGluamVjdCBhc1xuICAgICAqIHRoZSBgYXJpYS1sYWJlbGAgYXR0cmlidXRlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1hcmlhTGFiZWwpXG4gICAgICovXG4gICAgYXJpYUxhYmVsID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBJbmxpbmUgW2Fzc2lnbm1lbnRzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9tb2RlbC9Bc3NpZ25tZW50TW9kZWwpLCB3aWxsIGJlIGxvYWRlZCBpbnRvIGFuIGludGVybmFsbHkgY3JlYXRlZFxuICAgICAqIFtBc3NpZ25tZW50U3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL2RhdGEvQXNzaWdubWVudFN0b3JlKSAgYXMgYSBwYXJ0IG9mIGEgW3Byb2plY3RdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9tb2RlbC9Qcm9qZWN0TW9kZWwpLlxuICAgICAqL1xuICAgIGFzc2lnbm1lbnRzID8gOiBBc3NpZ25tZW50TW9kZWxbXXxvYmplY3RbXXxBc3NpZ25tZW50TW9kZWxDb25maWdbXVxuICAgIC8qKlxuICAgICAqIFNldCB0byBgdHJ1ZWAgdG8gYXV0byBnZW5lcmF0ZSBjb2x1bW5zIHdoZW4gW2NvbHVtbnNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L21peGluL1Rhc2tCb2FyZENvbHVtbnMjY29uZmlnLWNvbHVtbnMpIGlzIHVuZGVmaW5lZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctYXV0b0dlbmVyYXRlQ29sdW1ucylcbiAgICAgKi9cbiAgICBhdXRvR2VuZXJhdGVDb2x1bW5zID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGB0cnVlYCB0byBhdXRvIGdlbmVyYXRlIHN3aW1sYW5lcyB3aGVuIFtzd2ltbGFuZXNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L21peGluL1Rhc2tCb2FyZFN3aW1sYW5lcyNjb25maWctc3dpbWxhbmVzKSBpcyB1bmRlZmluZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLWF1dG9HZW5lcmF0ZVN3aW1sYW5lcylcbiAgICAgKi9cbiAgICBhdXRvR2VuZXJhdGVTd2ltbGFuZXMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBBIENvbmZpZyBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjb25maWd1cmF0aW9uIG9mIGEgW1Rvb2xiYXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1Rvb2xiYXIpLFxuICAgICAqIG9yIGFycmF5IG9mIGNvbmZpZyBvYmplY3RzIHJlcHJlc2VudGluZyB0aGUgY2hpbGQgaXRlbXMgb2YgYSBUb29sYmFyLiBBbm90aGVyIHdheSB0byBhZGQgYSBiYmFyIGlzIHRvIHVzZSBbc3RyaXBzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9QYW5lbCNjb25maWctc3RyaXBzKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctYmJhcilcbiAgICAgKi9cbiAgICBiYmFyID8gOiAoQ29udGFpbmVySXRlbUNvbmZpZ3xzdHJpbmcpW118VG9vbGJhckNvbmZpZ3xQYWdpbmdUb29sYmFyQ29uZmlnfG51bGxcbiAgICAvKipcbiAgICAgKiBDdXN0b20gQ1NTIGNsYXNzZXMgdG8gYWRkIHRvIHRoZSBwYW5lbCdzIGJvZHkgZWxlbWVudC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctYm9keUNscylcbiAgICAgKi9cbiAgICBib2R5Q2xzID8gOiBzdHJpbmd8b2JqZWN0XG4gICAgLyoqXG4gICAgICogSXRlbXMgdG8gYWRkIHRvIGVhY2ggY2FyZCdzIGJvZHkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLWJvZHlJdGVtcylcbiAgICAgKi9cbiAgICBib2R5SXRlbXMgPyA6IFJlY29yZDxzdHJpbmcsIFRhc2tJdGVtT3B0aW9ucz5cbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3Qgd2hlcmUgcHJvcGVydHkgbmFtZXMgd2l0aCBhIHRydXRoeSB2YWx1ZSBpbmRpY2F0ZSB3aGljaCBldmVudHMgc2hvdWxkIGJ1YmJsZSB1cCB0aGUgb3duZXJzaGlwXG4gICAgICogaGllcmFyY2h5IHdoZW4gdHJpZ2dlcmVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1idWJibGVFdmVudHMpXG4gICAgICovXG4gICAgYnViYmxlRXZlbnRzID8gOiBvYmplY3RcbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYGZhbHNlYCB0byBub3QgY2FsbCBvblhYWCBtZXRob2QgbmFtZXMgKGUuZy4gYG9uU2hvd2AsIGBvbkNsaWNrYCksIGFzIGFuIGVhc3kgd2F5IHRvIGxpc3RlbiBmb3IgZXZlbnRzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1jYWxsT25GdW5jdGlvbnMpXG4gICAgICovXG4gICAgY2FsbE9uRnVuY3Rpb25zID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgW0NhcmRTaXplXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9taXhpbi9SZXNwb25zaXZlQ2FyZHMjdHlwZWRlZi1DYXJkU2l6ZSkgb2JqZWN0cyB0byB1c2UgYXMgcmVzcG9uc2l2ZSBsZXZlbHMgYmFzZWQgb24gY2FyZCB3aWR0aHMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLWNhcmRTaXplcylcbiAgICAgKi9cbiAgICBjYXJkU2l6ZXMgPyA6IENhcmRTaXplXG4gICAgLyoqXG4gICAgICogQnkgZGVmYXVsdCwgaWYgYW4gZXZlbnQgaGFuZGxlciB0aHJvd3MgYW4gZXhjZXB0aW9uLCB0aGUgZXJyb3IgcHJvcGFnYXRlcyB1cCB0aGUgc3RhY2sgYW5kIHRoZVxuICAgICAqIGFwcGxpY2F0aW9uIHN0YXRlIGlzIHVuZGVmaW5lZC4gQ29kZSB3aGljaCBmb2xsb3dzIHRoZSBldmVudCBoYW5kbGVyIHdpbGwgKm5vdCogYmUgZXhlY3V0ZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLWNhdGNoRXZlbnRIYW5kbGVyRXhjZXB0aW9ucylcbiAgICAgKi9cbiAgICBjYXRjaEV2ZW50SGFuZGxlckV4Y2VwdGlvbnMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiAqT25seSB2YWxpZCBpZiB0aGlzIFdpZGdldCBpcyBbZmxvYXRpbmddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctZmxvYXRpbmcpLipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIGNlbnRyZSB0aGUgV2lkZ2V0IGluIGJyb3dzZXIgdmlld3BvcnQgc3BhY2UuXG4gICAgICovXG4gICAgY2VudGVyZWQgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBDb2x1bW5zIGhvbGQgdGhlaXIgdGFza3MgaW4gc3RvcmVzIGNoYWluZWQgb2ZmIHRoZSBwcm9qZWN0J3MgdGFzayBzdG9yZS4gRmlsdGVycyBhcHBsaWVkIHRvIHRoZSBwcm9qZWN0IHN0b3JlXG4gICAgICogYXJlIGJ5IGRlZmF1bHQgbm90IGFwcGxpZWQgdG8gdGhlIGNvbHVtbiBzdG9yZXM7IHRoZXkgYXJlIG9ubHkgYWZmZWN0ZWQgYnkgdGhlaXIgb3duIGZpbHRlcnMuIEJ5IGNvbmZpZ3VyaW5nXG4gICAgICogYGNoYWluRmlsdGVycyA6IHRydWVgLCB0aGUgZmlsdGVycyBmcm9tIHRoZSBwcm9qZWN0IHN0b3JlIHdpbGwgYWxzbyBiZSB0YWtlbiBpbnRvIGFjY291bnQgd2hlbiBmaWx0ZXJpbmcgdGhlXG4gICAgICogY29sdW1ucy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctY2hhaW5GaWx0ZXJzKVxuICAgICAqL1xuICAgIGNoYWluRmlsdGVycyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEN1c3RvbSBDU1MgY2xhc3NlcyB0byBhZGQgdG8gZWxlbWVudC5cbiAgICAgKiBNYXkgYmUgc3BlY2lmaWVkIGFzIGEgc3BhY2Ugc2VwYXJhdGVkIHN0cmluZywgb3IgYXMgYW4gb2JqZWN0IGluIHdoaWNoIHByb3BlcnR5IG5hbWVzXG4gICAgICogd2l0aCB0cnV0aHkgdmFsdWVzIGFyZSB1c2VkIGFzIHRoZSBjbGFzcyBuYW1lczpcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctY2xzKVxuICAgICAqL1xuICAgIGNscyA/IDogc3RyaW5nfG9iamVjdFxuICAgIC8qKlxuICAgICAqIENvbnRyb2xzIHdoZXRoZXIgdGhlIHBhbmVsIGlzIGNvbGxhcHNlZCAodGhlIGJvZHkgb2YgdGhlIHBhbmVsIGlzIGhpZGRlbiB3aGlsZSBvbmx5IHRoZSBoZWFkZXIgaXNcbiAgICAgKiB2aXNpYmxlKS4gT25seSB2YWxpZCBpZiB0aGUgcGFuZWwgaXMgW2NvbGxhcHNpYmxlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9QYW5lbCNjb25maWctY29sbGFwc2libGUpLlxuICAgICAqL1xuICAgIGNvbGxhcHNlZCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgYHRydWVgIHRvIGhpZGUgdGhlIGNvbHVtbiB0aXRsZSBpbnN0ZWFkIG9mIHJvdGF0aW5nIGl0IG9uIGNvbGxhcHNlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1jb2xsYXBzZVRpdGxlKVxuICAgICAqL1xuICAgIGNvbGxhcHNlVGl0bGUgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBUaGlzIGNvbmZpZyBlbmFibGVzIGNvbGxhcHNpYmlsaXR5IGZvciB0aGUgcGFuZWwuIFNlZSBbY29sbGFwc2VkXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9QYW5lbCNjb25maWctY29sbGFwc2VkKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctY29sbGFwc2libGUpXG4gICAgICovXG4gICAgY29sbGFwc2libGUgPyA6IGJvb2xlYW58UGFuZWxDb2xsYXBzZXJDb25maWd8UGFuZWxDb2xsYXBzZXJPdmVybGF5Q29uZmlnXG4gICAgLyoqXG4gICAgICogQXBwbGllcyB0aGUgc3BlY2lmaWVkIGNvbG9yIHRvIHRoZSB3aWRnZXQsIGJ5IHNldHRpbmcgdGhlIGAtLWItcHJpbWFyeWAgQ1NTIHZhcmlhYmxlIGluIHRoZSB3aWRnZXRzXG4gICAgICogYHN0eWxlYCBibG9jay5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctY29sb3IpXG4gICAgICovXG4gICAgY29sb3IgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFByb2dyYW1tYXRpYyBjb250cm9sIG92ZXIgd2hpY2ggY29sdW1uIHRvIHN0YXJ0IGluIHdoZW4gdXNlZCBpbiBhIGdyaWQgbGF5b3V0LlxuICAgICAqL1xuICAgIGNvbHVtbiA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogRmllbGQgb24gYSB0YXNrIHJlY29yZCB1c2VkIHRvIGRldGVybWluZSB3aGljaCBjb2x1bW4gdGhlIHRhc2sgYmVsb25ncyB0by5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctY29sdW1uRmllbGQpXG4gICAgICovXG4gICAgY29sdW1uRmllbGQgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFN0b3JlIGNvbnRhaW5pbmcgdGhlIFRhc2tCb2FyZCBjb2x1bW5zLiBBIHRhc2tzIFtjb2x1bW5GaWVsZF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvbWl4aW4vVGFza0JvYXJkQ29sdW1ucyNjb25maWctY29sdW1uRmllbGQpIGlzIG1hdGNoZWQgYWdhaW5zdCB0aGUgYGlkYCBvZiBhXG4gICAgICogY29sdW1uIHRvIGRldGVybWluZSBpbiB3aGljaCBjb2x1bW4gaXQgaXMgZGlzcGxheWVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1jb2x1bW5zKVxuICAgICAqL1xuICAgIGNvbHVtbnMgPyA6IENvbHVtbk1vZGVsW118Q29sdW1uTW9kZWxDb25maWdbXXxzdHJpbmdbXXxTdG9yZXxzdHJpbmd8U3RvcmVDb25maWdcbiAgICAvKipcbiAgICAgKiBBIGZ1bmN0aW9uIHdoaWNoIHJlbmRlcnMgdGhlIHRleHQsIEhUTUwsIG9yIGBEb21Db25maWdgIG9iamVjdCB0byBzaG93IGFzIHRoZSBjb2x1bW4gdGl0bGUuIElmIHlvdSBwcm92aWRlIGFcbiAgICAgKiBgRG9tQ29uZmlnYCBvYmplY3QsIGl0IHdpbGwgcmVwbGFjZSB0aGUgdGl0bGUgZWxlbWVudCBhbmQgeW91IGFyZSByZXNwb25zaWJsZSBmb3Igc3R5bGluZyBpdCArIGxheWluZyBpdCBvdXQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLWNvbHVtblRpdGxlUmVuZGVyZXIpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IHJlbmRlckRhdGFcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5Db2x1bW5Nb2RlbH0gY29sdW1uUmVjb3JkIFRoZSBjb2x1bW4gaW5zdGFuY2VcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nLERvbUNvbmZpZ31cbiAgICAgKi9cbiAgICBjb2x1bW5UaXRsZVJlbmRlcmVyID8gOiAocmVuZGVyRGF0YTogb2JqZWN0LCBjb2x1bW5SZWNvcmQ6IENvbHVtbk1vZGVsKSA9PiBzdHJpbmd8RG9tQ29uZmlnXG4gICAgY29uZmlnID8gOiBvYmplY3RcbiAgICAvKipcbiAgICAgKiAqT25seSB2YWxpZCBpZiB0aGlzIFdpZGdldCBpcyBbZmxvYXRpbmddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctZmxvYXRpbmcpIG9yIFtwb3NpdGlvbmVkXSgjQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1wb3NpdGlvbmVkKS4qXG4gICAgICogRWxlbWVudCwgV2lkZ2V0IG9yIFJlY3RhbmdsZSB0byB3aGljaCB0aGlzIFdpZGdldCBpcyBjb25zdHJhaW5lZC5cbiAgICAgKi9cbiAgICBjb25zdHJhaW5UbyA/IDogSFRNTEVsZW1lbnR8V2lkZ2V0fFJlY3RhbmdsZVxuICAgIC8qKlxuICAgICAqIEluaXRpYWwgQ1NTIHZhcmlhYmxlcyB0byBzZXQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLWNzcylcbiAgICAgKi9cbiAgICBjc3MgPyA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgICAvKipcbiAgICAgKiBDU1MgdmFyaWFibGUgcHJlZml4LCBhcHBlbmRlZCB0byB0aGUga2V5cyB1c2VkIGluIFtjc3NdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLWNzcykuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLWNzc1ZhclByZWZpeClcbiAgICAgKi9cbiAgICBjc3NWYXJQcmVmaXggPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFdoZW4gdGhpcyBXaWRnZXQgY29uZmlndXJhdGlvbiBpcyB1c2VkIGluIHRoZSBHcmlkJ3MgUm93RXhwYW5kZXIgZmVhdHVyZSdzIGB3aWRnZXRgIGNvbmZpZywgcHJvdmlkZSB0aGVcbiAgICAgKiBmaWVsZCBvbiB0aGUgZXhwYW5kZWQgcmVjb3JkIHRvIHVzZSBmb3IgcG9wdWxhdGluZyB0aGlzIHdpZGdldCdzIHN0b3JlIChpZiBhcHBsaWNhYmxlKVxuICAgICAqL1xuICAgIGRhdGFGaWVsZCA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogT2JqZWN0IHRvIGFwcGx5IHRvIGVsZW1lbnRzIGRhdGFzZXQgKGVhY2gga2V5IHdpbGwgYmUgdXNlZCBhcyBhIGRhdGEtYXR0cmlidXRlIG9uIHRoZSBlbGVtZW50KVxuICAgICAqL1xuICAgIGRhdGFzZXQgPyA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgICAvKipcbiAgICAgKiBDaGVjayBmb3IgQ1NTIGNvbXBhdGliaWxpdHkgaXNzdWVzIHdoZW4gdXBncmFkaW5nIHRvIHY3LiBQZXJmb3JtcyB0aGUgZm9sbG93aW5nIGNoZWNrczpcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctZGV0ZWN0Q1NTQ29tcGF0aWJpbGl0eUlzc3VlcylcbiAgICAgKi9cbiAgICBkZXRlY3RDU1NDb21wYXRpYmlsaXR5SXNzdWVzID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogRGlzYWJsZSBvciBlbmFibGUgdGhlIHdpZGdldC4gSXQgaXMgc2ltaWxhciB0byBbcmVhZE9ubHldKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctcmVhZE9ubHkpIGV4Y2VwdCBhIGRpc2FibGVkIHdpZGdldFxuICAgICAqIGNhbm5vdCBiZSBmb2N1c2VkLCB1c2VzIGEgZGlmZmVyZW50IHJlbmRpdGlvbiAodXN1YWxseSBncmV5aXNoKSBhbmQgZG9lcyBub3QgYWxsb3cgc2VsZWN0aW5nIGl0cyB2YWx1ZS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctZGlzYWJsZWQpXG4gICAgICovXG4gICAgZGlzYWJsZWQgPyA6IGJvb2xlYW58J2luZXJ0J1xuICAgIC8qKlxuICAgICAqIENvbnRyb2xzIHRoZSBwbGFjZW1lbnQgb2YgdGhpcyB3aWRnZXQgd2hlbiBpdCBpcyBhZGRlZCB0byBhIFtwYW5lbCdzIF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwpXG4gICAgICogW3N0cmlwcyBjb2xsZWN0aW9uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9QYW5lbCNjb25maWctc3RyaXBzKS4gVHlwaWNhbCB2YWx1ZXMgZm9yIHRoaXMgY29uZmlnIGFyZSBgJ3RvcCdgLFxuICAgICAqIGAnYm90dG9tJ2AsIGAnbGVmdCdgLCBvciBgJ3JpZ2h0J2AsIHdoaWNoIGNhdXNlIHRoZSB3aWRnZXQgdG8gYmUgcGxhY2VkIG9uIHRoYXQgc2lkZSBvZiB0aGUgcGFuZWwnc1xuICAgICAqIGJvZHkuIFN1Y2ggd2lkZ2V0cyBhcmUgY2FsbGVkIFwiZWRnZSBzdHJpcHNcIi5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctZG9jaylcbiAgICAgKi9cbiAgICBkb2NrID8gOiAndG9wJ3wnYm90dG9tJ3wnbGVmdCd8J3JpZ2h0J3wnc3RhcnQnfCdlbmQnfCdoZWFkZXInfCdwcmUtaGVhZGVyJ3xvYmplY3RcbiAgICAvKipcbiAgICAgKiAqT25seSB2YWxpZCBpZiB0aGlzIFdpZGdldCBpcyBbZmxvYXRpbmddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctZmxvYXRpbmcpLipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIGJlIGFibGUgdG8gZHJhZyBhIHdpZGdldCBmcmVlbHkgb24gdGhlIHBhZ2UuIE9yIHNldCB0byBhbiBvYmplY3Qgd2l0aCBhIMK0aGFuZGxlU2VsZWN0b3LCtFxuICAgICAqIHByb3BlcnR5IHdoaWNoIGNvbnRyb2xzIHdoZW4gYSBkcmFnIHNob3VsZCBzdGFydC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctZHJhZ2dhYmxlKVxuICAgICAqL1xuICAgIGRyYWdnYWJsZSA/IDogYm9vbGVhbnx7XG4gICAgICAgIGhhbmRsZVNlbGVjdG9yPzogc3RyaW5nXG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1ha2UgdGhpcyBQYW5lbCBhIGRvY2tlZCBkcmF3ZXIgd2hpY2ggc2xpZGVzIG91dCBmcm9tIG9uZSBzaWRlIG9mIHRoZSBicm93c2VyIHZpZXdwb3J0IGJ5IGRlZmF1bHQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLWRyYXdlcilcbiAgICAgKiBAcGFyYW0geydzdGFydCcsJ2xlZnQnLCdlbmQnLCdyaWdodCcsJ3RvcCcsJ2JvdHRvbSd9IHNpZGUgVGhlIHNpZGUgb2YgdGhlIHZpZXdwb3J0IHRvIGRvY2sgdGhlIGRyYXdlciB0by4gICogYCdzdGFydCdgIG1lYW5zIHRoZSBgaW5saW5lLXN0YXJ0YCBzaWRlLiAqIGAnZW5kJ2AgbWVhbnMgdGhlIGBpbmxpbmUtZW5kYCBzaWRlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nLG51bWJlcn0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZHJhd2VyIGluIGl0cyBjb2xsYXBzaWJsZSBheGlzLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5saW5lIElmIHVzaW5nIHRoZSBbYXBwZW5kVG9dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1BhbmVsI2NvbmZpZy1hcHBlbmRUbykgY29uZmlnIHRvIHBsYWNlIHRoZSBkcmF3ZXIgaW5zaWRlIGEgaG9zdCB3aWRnZXQsIHRoaXMgbWF5IGJlIHNldCB0byBgdHJ1ZWAgdG8gbWFrZSB0aGUgZHJhd2VyIGlubGluZSB3aXRoaW4gdGhhdCBob3N0LiBOb3RlIHRoYXQsIGlmIHVzaW5nIHRoaXMsIHRoZSBsYXlvdXQgb2YgdGhlIGhvc3QgZWxlbWVudCBtdXN0IGhhdmUgYGZsZXgtZGlyZWN0aW9uYCBzZXQgYXBwcm9wcmlhdGVseS5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW4sb2JqZWN0fSBhdXRvQ2xvc2UgU3BlY2lmaWVzIHdoYXQgdXNlciBhY3Rpb25zIHNob3VsZCBhdXRvbWF0aWNhbGx5IGNsb3NlIHRoZSBkcmF3ZXIuIERlZmF1bHRzIHRvIGNsb3Npbmcgd2hlbiB0aGUgdXNlciBjbGlja3Mgb3V0c2lkZSBvZiB0aGUgZHJhd2VyIG9yIHdoZW4gZm9jdXMgbW92ZXMgb3V0c2lkZSBvZiB0aGUgZHJhd2VyLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbixzdHJpbmd9IGF1dG9DbG9zZS5tb3VzZWRvd24gSWYgdGhlIHVzZXIgY2xpY2tzIG91dHNpZGUgb2YgdGhlIGRyYXdlciwgdGhlIGRyYXdlciB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgaGlkZGVuLiBJZiB0aGUgdmFsdWUgaXMgYSBzdHJpbmcsIGl0IGlzIHVzZWQgYXMgYSBDU1Mgc2VsZWN0b3IgdG8gZmlsdGVyIGNsaWNrcyB3aGljaCBzaG91bGQgY2xvc2UgdGhlIGRyYXdlci5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW4sc3RyaW5nfSBhdXRvQ2xvc2UuZm9jdXNvdXQgSWYgZm9jdXMgbW92ZXMgb3V0c2lkZSBvZiB0aGUgZHJhd2VyLCB0aGUgZHJhd2VyIHdpbGwgYXV0b21hdGljYWxseSBiZSBoaWRkZW4uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGF1dG9DbG9zZS5tb3VzZW91dCBIaWRlcyB0aGUgZHJhd2VyIHdoZW4gdGhlIG1vdXNlIGxlYXZlcyB0aGUgZHJhd2VyIGFmdGVyIHRoZSBgYXV0b0Nsb3NlRGVsYXlgIHBlcmlvZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYXV0b0Nsb3NlRGVsYXkgV2hlbiB1c2luZyBgbW91c2VvdXRgLCB0aGlzIGlzIHRoZSBkZWxheSBpbiBtaWxsaXNlY29uZHNcbiAgICAgKi9cbiAgICBkcmF3ZXIgPyA6IGJvb2xlYW58e3NpZGU/OiAnc3RhcnQnfCdsZWZ0J3wnZW5kJ3wncmlnaHQnfCd0b3AnfCdib3R0b20nLCBzaXplPzogc3RyaW5nfG51bWJlciwgaW5saW5lPzogYm9vbGVhbiwgYXV0b0Nsb3NlOiB7IG1vdXNlZG93bj86IGJvb2xlYW58c3RyaW5nLCBmb2N1c291dD86IGJvb2xlYW58c3RyaW5nLCBtb3VzZW91dD86IHN0cmluZyB9LCBhdXRvQ2xvc2VEZWxheT86IG51bWJlcn1cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIGRyYXcgY2FyZHMgb24gc2Nyb2xsLCBvciBvbmx5IHdoZW4gc2Nyb2xsaW5nIGVuZHMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLWRyYXdPblNjcm9sbClcbiAgICAgKi9cbiAgICBkcmF3T25TY3JvbGwgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3Qgc3BlY2lmeWluZyBhdHRyaWJ1dGVzIHRvIGFzc2lnbiB0byB0aGUgcm9vdCBlbGVtZW50IG9mIHRoaXMgd2lkZ2V0LlxuICAgICAqIFNldCBgbnVsbGAgdmFsdWUgdG8gYXR0cmlidXRlIHRvIHJlbW92ZSBpdC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctZWxlbWVudEF0dHJpYnV0ZXMpXG4gICAgICovXG4gICAgZWxlbWVudEF0dHJpYnV0ZXMgPyA6IFJlY29yZDxzdHJpbmcsIHN0cmluZ3xudWxsPlxuICAgIGV4dHJhRGF0YSA/IDogYW55XG4gICAgLyoqXG4gICAgICogV2hlbiB0aGlzIHdpZGdldCBpcyBhIGNoaWxkIG9mIGEgW0NvbnRhaW5lcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ29udGFpbmVyKSwgaXQgd2lsbCBieSBkZWZhdWx0IGJlIHBhcnRpY2lwYXRpbmcgaW4gYVxuICAgICAqIGZsZXhib3ggbGF5b3V0LiBUaGlzIGNvbmZpZyBhbGxvd3MgeW91IHRvIHNldCB0aGlzIHdpZGdldCdzXG4gICAgICogW2ZsZXhdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9mbGV4KSBzdHlsZS5cbiAgICAgKiBUaGlzIG1heSBiZSBjb25maWd1cmVkIGFzIGEgc2luZ2xlIG51bWJlciBvciBhIGAmbHQ7ZmxleC1ncm93Jmd0OyAmbHQ7ZmxleC1zaHJpbmsmZ3Q7ICZsdDtmbGV4LWJhc2lzJmd0O2AgZm9ybWF0IHN0cmluZy5cbiAgICAgKiBudW1lcmljLW9ubHkgdmFsdWVzIGFyZSBpbnRlcnByZXRlZCBhcyB0aGUgYGZsZXgtZ3Jvd2AgdmFsdWUuXG4gICAgICovXG4gICAgZmxleCA/IDogbnVtYmVyfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFNldCB0byBgdHJ1ZWAgdG8gbW92ZSB0aGUgd2lkZ2V0IG91dCBvZiB0aGUgZG9jdW1lbnQgZmxvdyBhbmQgcG9zaXRpb24gaXRcbiAgICAgKiBhYnNvbHV0ZWx5IGluIGJyb3dzZXIgdmlld3BvcnQgc3BhY2UuXG4gICAgICovXG4gICAgZmxvYXRpbmcgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBDb25maWcgb2JqZWN0IG9mIGEgZm9vdGVyLiBNYXkgY29udGFpbiBhIGBkb2NrYCwgYGh0bWxgIGFuZCBhIGBjbHNgIHByb3BlcnR5LiBBIGZvb3RlciBpcyBub3QgYSB3aWRnZXQsXG4gICAgICogYnV0IHJhdGhlciBwbGFpbiBIVE1MIHRoYXQgZm9sbG93cyB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBwYW5lbCdzIGJvZHkgYW5kIFtzdHJpcHNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1BhbmVsI2NvbmZpZy1zdHJpcHMpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1mb290ZXIpXG4gICAgICovXG4gICAgZm9vdGVyID8gOiB7XG4gICAgICAgIGRvY2s/OiAndG9wJ3wncmlnaHQnfCdib3R0b20nfCdsZWZ0J3wnc3RhcnQnfCdlbmQnXG4gICAgICAgIGh0bWw/OiBzdHJpbmdcbiAgICAgICAgY2xzPzogc3RyaW5nXG4gICAgfXxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBJdGVtcyB0byBhZGQgdG8gZWFjaCBjYXJkJ3MgZm9vdGVyLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1mb290ZXJJdGVtcylcbiAgICAgKi9cbiAgICBmb290ZXJJdGVtcyA/IDogUmVjb3JkPHN0cmluZywgVGFza0l0ZW1PcHRpb25zPlxuICAgIC8qKlxuICAgICAqIFRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGVhY2ggdGFzayBhcyBwYXJ0IG9mIHRoZSByZW5kZXIgbG9vcCwgYW5kIGlzIGV4cGVjdGVkIHRvIHJldHVybiB0aGUgaGVpZ2h0IGluXG4gICAgICogcGl4ZWxzIGZvciB0aGUgdGFzay4gVXNpbmcgdGhpcyBmdW5jdGlvbiBpcyBvbmx5IHJlY29tbWVuZGVkIHdoZW4gdXNpbmcgcGFydGlhbCB2aXJ0dWFsaXplZCByZW5kZXJpbmcsIHNlZVxuICAgICAqIHRoZSBbdmlydHVhbGl6ZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvbWl4aW4vVGFza0JvYXJkVmlydHVhbGl6YXRpb24jY29uZmlnLXZpcnR1YWxpemUpIHNldHRpbmcuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLWdldFRhc2tIZWlnaHQpXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuVGFza01vZGVsfSB0YXNrUmVjb3JkIFRoZSB0YXNrIHJlY29yZFxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBoZWlnaHQgb2YgdGhlIHRhc2sgaW4gcGl4ZWxzXG4gICAgICovXG4gICAgZ2V0VGFza0hlaWdodCA/IDogKHRhc2tSZWNvcmQ6IFRhc2tNb2RlbCkgPT4gbnVtYmVyXG4gICAgLyoqXG4gICAgICogQSBjb25maWcgW29iamVjdF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwjdHlwZWRlZi1QYW5lbEhlYWRlcikgZm9yIHRoZSBwYW5lbCdzIGhlYWRlciBvciBhIHN0cmluZyBpbiBwbGFjZSBvZiBhIGB0aXRsZWAuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLWhlYWRlcilcbiAgICAgKi9cbiAgICBoZWFkZXIgPyA6IHN0cmluZ3xib29sZWFufFBhbmVsSGVhZGVyXG4gICAgLyoqXG4gICAgICogSXRlbXMgdG8gYWRkIHRvIGVhY2ggY2FyZCdzIGhlYWRlci5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctaGVhZGVySXRlbXMpXG4gICAgICovXG4gICAgaGVhZGVySXRlbXMgPyA6IFJlY29yZDxzdHJpbmcsIFRhc2tJdGVtT3B0aW9ucz5cbiAgICAvKipcbiAgICAgKiBXaWRnZXQncyBoZWlnaHQsIHVzZWQgdG8gc2V0IGVsZW1lbnQgYHN0eWxlLmhlaWdodGAuIEVpdGhlciBzcGVjaWZ5IGEgdmFsaWQgaGVpZ2h0IHN0cmluZyBvciBhIG51bWJlcixcbiAgICAgKiB3aGljaCB3aWxsIGdldCAncHgnIGFwcGVuZGVkLiBXZSByZWNvbW1lbmQgdXNpbmcgQ1NTIGFzIHRoZSBwcmltYXJ5IHdheSB0byBjb250cm9sIGhlaWdodCwgYnV0IGluIHNvbWVcbiAgICAgKiBjYXNlcyB0aGlzIGNvbmZpZyBpcyBjb252ZW5pZW50LlxuICAgICAqL1xuICAgIGhlaWdodCA/IDogc3RyaW5nfG51bWJlclxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSB3aXRoIHRydWUgdG8gbWFrZSB3aWRnZXQgaW5pdGlhbGx5IGhpZGRlbi5cbiAgICAgKi9cbiAgICBoaWRkZW4gPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiAqT25seSB2YWxpZCBpZiB0aGlzIFdpZGdldCBpcyBbZmxvYXRpbmddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctZmxvYXRpbmcpLipcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctaGlkZUFuaW1hdGlvbilcbiAgICAgKi9cbiAgICBoaWRlQW5pbWF0aW9uID8gOiBib29sZWFufG9iamVjdFxuICAgIC8qKlxuICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBoZWFkZXIgdGV4dCBpcyBIVE1MLWVuY29kZWQuIFNldCB0aGlzIGZsYWcgdG8gYGZhbHNlYCBkaXNhYmxlIHRoaXMgYW5kIGFsbG93IGh0bWxcbiAgICAgKiBlbGVtZW50cyBpbiB0aGUgY29sdW1uIGhlYWRlcnMuIENhbiBhbHNvIGJlIHNwZWNpZmllZCBvbiBhIHNpbmdsZVxuICAgICAqIFtjb2x1bW5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9tb2RlbC9Db2x1bW5Nb2RlbCNmaWVsZC1odG1sRW5jb2RlSGVhZGVyVGV4dCkuXG4gICAgICovXG4gICAgaHRtbEVuY29kZUhlYWRlclRleHQgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBBbiBpY29uIHRvIHNob3cgYmVmb3JlIHRoZSBbdGl0bGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1BhbmVsI2NvbmZpZy10aXRsZSkuIEVpdGhlciBwYXNzIGEgQ1NTIGNsYXNzIGFzIGEgc3RyaW5nLCBvciBwYXNzIGFcbiAgICAgKiBbRG9tQ29uZmlnXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL2hlbHBlci9Eb21IZWxwZXIjdHlwZWRlZi1Eb21Db25maWcpIG9iamVjdCBkZXNjcmliaW5nIGFuIGVsZW1lbnQgdG8gcmVwcmVzZW50IHRoZSBpY29uLlxuICAgICAqL1xuICAgIGljb24gPyA6IHN0cmluZ3xEb21Db25maWdcbiAgICAvKipcbiAgICAgKiBXaWRnZXQgaWQsIGlmIG5vdCBzcGVjaWZpZWQgb25lIHdpbGwgYmUgZ2VuZXJhdGVkLiBBbHNvIHVzZWQgZm9yIGxvb2t1cHMgdGhyb3VnaCBXaWRnZXQuZ2V0QnlJZFxuICAgICAqL1xuICAgIGlkID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSB3aWRnZXRzIHJlYWQtb25seSBzdGF0ZSBzaG91bGQgYmUgY29udHJvbGxlZCBieSBpdHMgcGFyZW50LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1pZ25vcmVQYXJlbnRSZWFkT25seSlcbiAgICAgKi9cbiAgICBpZ25vcmVQYXJlbnRSZWFkT25seSA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIENvbnZlbmllbmNlIHNldHRpbmcgdG8gYWxpZ24gaW5wdXQgZmllbGRzIG9mIGNoaWxkIHdpZGdldHMuIEJ5IGRlZmF1bHQsIHRoZSBGaWVsZCBpbnB1dCBlbGVtZW50IGlzXG4gICAgICogcGxhY2VkIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgYGxhYmVsYC4gSWYgeW91IHByZWZlciB0byBoYXZlIGFsbCBpbnB1dCBmaWVsZHMgYWxpZ25lZCB0byB0aGVcbiAgICAgKiByaWdodCwgc2V0IHRoaXMgY29uZmlnIHRvIGAnZW5kJ2AuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLWlucHV0RmllbGRBbGlnbilcbiAgICAgKi9cbiAgICBpbnB1dEZpZWxkQWxpZ24gPyA6ICdzdGFydCd8J2VuZCdcbiAgICAvKipcbiAgICAgKiBFbGVtZW50IChvciBlbGVtZW50IGlkKSB0byBpbnNlcnQgdGhpcyB3aWRnZXQgYmVmb3JlLiBJZiBwcm92aWRlZCwgW2FwcGVuZFRvXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLWFwcGVuZFRvKSBjb25maWcgaXMgaWdub3JlZC5cbiAgICAgKi9cbiAgICBpbnNlcnRCZWZvcmUgPyA6IEhUTUxFbGVtZW50fHN0cmluZ1xuICAgIC8qKlxuICAgICAqIEVsZW1lbnQgKG9yIGVsZW1lbnQgaWQpIHRvIGFwcGVuZCB0aGlzIHdpZGdldCBlbGVtZW50IHRvLCBhcyBhIGZpcnN0IGNoaWxkLiBJZiBwcm92aWRlZCwgW2FwcGVuZFRvXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLWFwcGVuZFRvKSBjb25maWcgaXMgaWdub3JlZC5cbiAgICAgKi9cbiAgICBpbnNlcnRGaXJzdCA/IDogSFRNTEVsZW1lbnR8c3RyaW5nXG4gICAgLyoqXG4gICAgICogQSB0ZW1wbGF0ZSBtZXRob2QgKGVtcHR5IGJ5IGRlZmF1bHQpIGFsbG93aW5nIHlvdSB0byBjb250cm9sIGlmIGEgdGFzayBjYW4gYmUgc2VsZWN0ZWQgb3Igbm90LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1pc1Rhc2tTZWxlY3RhYmxlKVxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLlRhc2tNb2RlbH0gdGFza1JlY29yZCBUaGUgdGFzayByZWNvcmRcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB0YXNrIGNhbiBiZSBzZWxlY3RlZCwgb3RoZXJ3aXNlIGBmYWxzZWBcbiAgICAgKi9cbiAgICBpc1Rhc2tTZWxlY3RhYmxlID8gOiAodGFza1JlY29yZDogVGFza01vZGVsKSA9PiBib29sZWFuXG4gICAgLyoqXG4gICAgICogU2VlIFtLZXlib2FyZCBzaG9ydGN1dHNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZCNrZXlib2FyZC1zaG9ydGN1dHMpIGZvciBkZXRhaWxzXG4gICAgICovXG4gICAga2V5TWFwID8gOiBSZWNvcmQ8c3RyaW5nLCBLZXlNYXBDb25maWc+XG4gICAgLyoqXG4gICAgICogQ29udmVuaWVuY2Ugc2V0dGluZyB0byB1c2Ugc2FtZSBsYWJlbCBwbGFjZW1lbnQgb24gYWxsIGNoaWxkIHdpZGdldHMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLWxhYmVsUG9zaXRpb24pXG4gICAgICovXG4gICAgbGFiZWxQb3NpdGlvbiA/IDogJ2JlZm9yZSd8J2Fib3ZlJ3wnYWxpZ24tYmVmb3JlJ3wnYXV0byd8bnVsbFxuICAgIC8qKlxuICAgICAqIFRoZSBsaXN0ZW5lciBzZXQgZm9yIHRoaXMgb2JqZWN0LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1saXN0ZW5lcnMpXG4gICAgICovXG4gICAgbGlzdGVuZXJzID8gOiBUYXNrQm9hcmRCYXNlTGlzdGVuZXJzXG4gICAgLyoqXG4gICAgICogQSBbTWFza10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS93aWRnZXQvTWFzaykgY29uZmlnIG9iamVjdCwgb3IgYSBtZXNzYWdlIHRvIGJlIHNob3duIHdoZW4gYSBzdG9yZSBpcyBwZXJmb3JtaW5nIGEgcmVtb3RlXG4gICAgICogb3BlcmF0aW9uLCBvciBDcnVkIE1hbmFnZXIgaXMgbG9hZGluZyBkYXRhIGZyb20gdGhlIHNldmVyLiBTZXQgdG8gYG51bGxgIHRvIGRpc2FibGUgZGVmYXVsdCBsb2FkIG1hc2suXG4gICAgICovXG4gICAgbG9hZE1hc2sgPyA6IHN0cmluZ3xNYXNrQ29uZmlnfG51bGxcbiAgICAvKipcbiAgICAgKiBBIFtNYXNrXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9NYXNrKSBjb25maWcgb2JqZWN0IHRvIGFkanVzdCB0aGUgW21hc2tEZWZhdWx0c10oI0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctbWFza0RlZmF1bHRzKVxuICAgICAqIHdoZW4gZGF0YSBpcyBsb2FkaW5nLiBUaGUgbWVzc2FnZSBhbmQgb3B0aW9uYWwgY29uZmlndXJhdGlvbiBmcm9tIHRoZVxuICAgICAqIFtsb2FkTWFza10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS9taXhpbi9Mb2FkTWFza2FibGUjY29uZmlnLWxvYWRNYXNrKSBjb25maWcgdGFrZSBwcmlvcml0eSBvdmVyIHRoZXNlIG9wdGlvbnMsIGp1c3QgYXMgdGhleSBkb1xuICAgICAqIGZvciBgbWFza0RlZmF1bHRzYCwgcmVzcGVjdGl2ZWx5LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1sb2FkTWFza0RlZmF1bHRzKVxuICAgICAqL1xuICAgIGxvYWRNYXNrRGVmYXVsdHMgPyA6IE1hc2tDb25maWdcbiAgICAvKipcbiAgICAgKiBBIFtNYXNrXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9NYXNrKSBjb25maWcgb2JqZWN0IHRvIGFkanVzdCB0aGUgW21hc2tEZWZhdWx0c10oI0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctbWFza0RlZmF1bHRzKVxuICAgICAqIHdoZW4gYW4gZXJyb3Igb2NjdXJzIGxvYWRpbmcgZGF0YS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctbG9hZE1hc2tFcnJvcilcbiAgICAgKi9cbiAgICBsb2FkTWFza0Vycm9yID8gOiBNYXNrQ29uZmlnfE1hc2t8Ym9vbGVhblxuICAgIC8qKlxuICAgICAqIEEgY2xhc3MgdHJhbnNsYXRpb25zIG9mIHdoaWNoIGFyZSB1c2VkIGZvciB0cmFuc2xhdGluZyB0aGlzIGVudGl0eS5cbiAgICAgKiBUaGlzIGlzIG9mdGVuIHVzZWQgd2hlbiB0cmFuc2xhdGlvbnMgb2YgYW4gaXRlbSBhcmUgZGVmaW5lZCBvbiBpdHMgY29udGFpbmVyIGNsYXNzLlxuICAgICAqIEZvciBleGFtcGxlOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1sb2NhbGVDbGFzcylcbiAgICAgKi9cbiAgICBsb2NhbGVDbGFzcyA/IDogdHlwZW9mIEJhc2VcbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYGZhbHNlYCB0byBkaXNhYmxlIGxvY2FsaXphdGlvbiBvZiB0aGlzIG9iamVjdC5cbiAgICAgKi9cbiAgICBsb2NhbGl6YWJsZSA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgcHJvcGVydGllcyB3aGljaCB2YWx1ZXMgc2hvdWxkIGJlIHRyYW5zbGF0ZWQgYXV0b21hdGljYWxseSB1cG9uIGEgbG9jYWxlIGFwcGx5aW5nLlxuICAgICAqIEluIGNhc2UgdGhlcmUgaXMgYSBuZWVkIHRvIGxvY2FsaXplIG5vdCB0eXBpY2FsIHZhbHVlIChub3QgYSBTdHJpbmcgdmFsdWUgb3IgYSBmaWVsZCB3aXRoIHJlLWRlZmluZWQgc2V0dGVyL2dldHRlciksXG4gICAgICogeW91IGNvdWxkIHVzZSAnbG9jYWxlS2V5JyBtZXRhIGNvbmZpZ3VyYXRpb24uXG4gICAgICogRXhhbXBsZTpcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctbG9jYWxpemFibGVQcm9wZXJ0aWVzKVxuICAgICAqL1xuICAgIGxvY2FsaXphYmxlUHJvcGVydGllcyA/IDogc3RyaW5nW11cbiAgICAvKipcbiAgICAgKiBXaWRnZXQncyBtYXJnaW4uIFRoaXMgbWF5IGJlIGNvbmZpZ3VyZWQgYXMgYSBzaW5nbGUgbnVtYmVyIG9yIGEgYFRSQkxgIGZvcm1hdCBzdHJpbmcuXG4gICAgICogbnVtZXJpYy1vbmx5IHZhbHVlcyBhcmUgaW50ZXJwcmV0ZWQgYXMgcGl4ZWxzLlxuICAgICAqL1xuICAgIG1hcmdpbiA/IDogbnVtYmVyfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFRoaXMgY29uZmlnIG9iamVjdCBjb250YWlucyB0aGUgZGVmYXVsdHMgZm9yIHRoZSBbTWFza10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS93aWRnZXQvTWFzaykgY3JlYXRlZCBmb3IgdGhlXG4gICAgICogW21hc2tlZF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1tYXNrZWQpIGNvbmZpZy4gQW55IHByb3BlcnRpZXMgc3BlY2lmaWVkIGluIHRoZSBgbWFza2VkYCBjb25maWcgd2lsbCBvdmVycmlkZSB0aGVzZVxuICAgICAqIHZhbHVlcy5cbiAgICAgKi9cbiAgICBtYXNrRGVmYXVsdHMgPyA6IE1hc2tDb25maWdcbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIGFwcGx5IHRoZSBkZWZhdWx0IG1hc2sgdG8gdGhlIHdpZGdldC4gQWx0ZXJuYXRpdmVseSwgdGhpcyBjYW4gYmUgdGhlIG1hc2sgbWVzc2FnZSBvciBhXG4gICAgICogW01hc2tdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L01hc2spIGNvbmZpZyBvYmplY3QuXG4gICAgICovXG4gICAgbWFza2VkID8gOiBib29sZWFufHN0cmluZ3xNYXNrQ29uZmlnXG4gICAgLyoqXG4gICAgICogVGhlIGVsZW1lbnQncyBtYXhIZWlnaHQuIENhbiBiZSBlaXRoZXIgYSBTdHJpbmcgb3IgYSBOdW1iZXIgKHdoaWNoIHdpbGwgaGF2ZSAncHgnIGFwcGVuZGVkKS4gTm90ZSB0aGF0XG4gICAgICogbGlrZSBbaGVpZ2h0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLWhlaWdodCksICpyZWFkaW5nKiB0aGUgdmFsdWUgd2lsbCByZXR1cm4gdGhlIG51bWVyaWMgdmFsdWUgaW4gcGl4ZWxzLlxuICAgICAqL1xuICAgIG1heEhlaWdodCA/IDogc3RyaW5nfG51bWJlclxuICAgIC8qKlxuICAgICAqICpPbmx5IHZhbGlkIGlmIHRoaXMgV2lkZ2V0IGlzIFtmbG9hdGluZ10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1mbG9hdGluZykuKlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1tYXhpbWl6ZU9uTW9iaWxlKVxuICAgICAqL1xuICAgIG1heGltaXplT25Nb2JpbGUgPyA6IG51bWJlcnxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBUaGUgZWxlbWVudHMgbWF4V2lkdGguIENhbiBiZSBlaXRoZXIgYSBTdHJpbmcgb3IgYSBOdW1iZXIgKHdoaWNoIHdpbGwgaGF2ZSAncHgnIGFwcGVuZGVkKS4gTm90ZSB0aGF0XG4gICAgICogbGlrZSBbd2lkdGhdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctd2lkdGgpLCAqcmVhZGluZyogdGhlIHZhbHVlIHdpbGwgcmV0dXJuIHRoZSBudW1lcmljIHZhbHVlIGluIHBpeGVscy5cbiAgICAgKi9cbiAgICBtYXhXaWR0aCA/IDogc3RyaW5nfG51bWJlclxuICAgIC8qKlxuICAgICAqIFRoZSBlbGVtZW50J3MgbWluSGVpZ2h0LiBDYW4gYmUgZWl0aGVyIGEgU3RyaW5nIG9yIGEgTnVtYmVyICh3aGljaCB3aWxsIGhhdmUgJ3B4JyBhcHBlbmRlZCkuIE5vdGUgdGhhdFxuICAgICAqIGxpa2UgW2hlaWdodF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1oZWlnaHQpLCAqcmVhZGluZyogdGhlIHZhbHVlIHdpbGwgcmV0dXJuIHRoZSBudW1lcmljIHZhbHVlIGluIHBpeGVscy5cbiAgICAgKi9cbiAgICBtaW5IZWlnaHQgPyA6IHN0cmluZ3xudW1iZXJcbiAgICAvKipcbiAgICAgKiBUaGUgZWxlbWVudHMgbWluV2lkdGguIENhbiBiZSBlaXRoZXIgYSBTdHJpbmcgb3IgYSBOdW1iZXIgKHdoaWNoIHdpbGwgaGF2ZSAncHgnIGFwcGVuZGVkKS4gTm90ZSB0aGF0XG4gICAgICogbGlrZSBbd2lkdGhdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctd2lkdGgpLCAqcmVhZGluZyogdGhlIHZhbHVlIHdpbGwgcmV0dXJuIHRoZSBudW1lcmljIHZhbHVlIGluIHBpeGVscy5cbiAgICAgKi9cbiAgICBtaW5XaWR0aCA/IDogc3RyaW5nfG51bWJlclxuICAgIC8qKlxuICAgICAqIERlZmF1bHQgdmFsdWVzIHRvIGFwcGx5IHRvIHRhc2sgcmVjb3JkcyBjcmVhdGVkIGJ5IHRhc2sgYm9hcmRzIGZlYXR1cmVzIChzdWNoIGFzIHRoZSBjb2x1bW4gaGVhZGVyIG1lbnUgYW5kXG4gICAgICogdGhlIGNvbHVtbiB0b29sYmFyKVxuICAgICAqL1xuICAgIG5ld1Rhc2tEZWZhdWx0cyA/IDogVGFza01vZGVsQ29uZmlnXG4gICAgLyoqXG4gICAgICogVGhlIG93bmluZyBXaWRnZXQgb2YgdGhpcyBXaWRnZXQuIElmIHRoaXMgV2lkZ2V0IGlzIGRpcmVjdGx5IGNvbnRhaW5lZCAodGhhdCBpcywgaXQgaXMgb25lIG9mIHRoZVxuICAgICAqIFtpdGVtc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ29udGFpbmVyI3Byb3BlcnR5LWl0ZW1zKSBvZiBhIENvbnRhaW5lciksIHRoaXMgY29uZmlnIHdpbGwgYmUgaWdub3JlZC4gSW4gdGhpcyBjYXNlXG4gICAgICogdGhlIG93bmVyIGlzIDxzdHJvbmc+YWx3YXlzPC9zdHJvbmc+IHRoZSBlbmNhcHN1bGF0aW5nIENvbnRhaW5lci5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctb3duZXIpXG4gICAgICovXG4gICAgb3duZXIgPyA6IFdpZGdldHxhbnlcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHBsdWdpbnMgKGFuIGFycmF5IG9mIGNsYXNzZXMpIGluIGNvbmZpZ1xuICAgICAqL1xuICAgIHBsdWdpbnMgPyA6IEZ1bmN0aW9uW11cbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHdoZW4gYSB3aWRnZXQgaXMgcmVuZGVyZWQgaW50byBhbm90aGVyIHdpZGdldCdzIFtjb250ZW50RWxlbWVudF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I3Byb3BlcnR5LWNvbnRlbnRFbGVtZW50KSwgYnV0IG11c3RcbiAgICAgKiBub3QgcGFydGljaXBhdGUgaW4gdGhlIHN0YW5kYXJkIGxheW91dCBvZiB0aGF0IHdpZGdldCwgYW5kIG11c3QgYmUgcG9zaXRpb25lZCByZWxhdGl2ZWx5IHRvIHRoYXRcbiAgICAgKiB3aWRnZXQncyBbY29udGVudEVsZW1lbnRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNwcm9wZXJ0eS1jb250ZW50RWxlbWVudCkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLXBvc2l0aW9uZWQpXG4gICAgICovXG4gICAgcG9zaXRpb25lZCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEEgZnVuY3Rpb24gY2FsbGVkIG9uIGVhY2ggcmVuZGVyIGJlZm9yZSBhZGRpbmcgaXRlbXMgdG8gYSB0YXNrcyBjYXJkLCBhbGxvd2luZyBydW50aW1lIG1hbmlwdWxhdGlvbiBvZiB0aGVtLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1wcm9jZXNzSXRlbXMpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHRcbiAgICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFRhc2tJdGVtT3B0aW9ucz59IGNvbnRleHQuaGVhZGVySXRlbXMgSXRlbSBjb25maWcgb2JqZWN0cyBmb3IgdGhlIHRhc2sgaGVhZGVyLCBrZXllZCBieSByZWZcbiAgICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFRhc2tJdGVtT3B0aW9ucz59IGNvbnRleHQuYm9keUl0ZW1zIEl0ZW0gY29uZmlnIG9iamVjdHMgZm9yIHRoZSB0YXNrIGJvZHksIGtleWVkIGJ5IHJlZlxuICAgICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgVGFza0l0ZW1PcHRpb25zPn0gY29udGV4dC5mb290ZXJJdGVtcyBJdGVtIGNvbmZpZyBvYmplY3RzIGZvciB0aGUgdGFzayBmb290ZXIsIGtleWVkIGJ5IHJlZlxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLlRhc2tNb2RlbH0gY29udGV4dC50YXNrUmVjb3JkIFJlY29yZCByZXByZXNlbnRpbmcgdGFzayB0byBiZSByZW5kZXJlZFxuICAgICAqIEByZXR1cm5zIHtib29sZWFuLHZvaWR9IFJldHVybmluZyBgZmFsc2VgIGZyb20gdGhpcyBmdW5jdGlvbiBwcmV2ZW50cyB0aGUgbWVudSBiZWluZyBzaG93blxuICAgICAqL1xuICAgIHByb2Nlc3NJdGVtcyA/IDogKGNvbnRleHQ6IHsgaGVhZGVySXRlbXM6IFJlY29yZDxzdHJpbmcsIFRhc2tJdGVtT3B0aW9ucz4sIGJvZHlJdGVtczogUmVjb3JkPHN0cmluZywgVGFza0l0ZW1PcHRpb25zPiwgZm9vdGVySXRlbXM6IFJlY29yZDxzdHJpbmcsIFRhc2tJdGVtT3B0aW9ucz4sIHRhc2tSZWNvcmQ6IFRhc2tNb2RlbCB9KSA9PiBib29sZWFufHZvaWRcbiAgICAvKipcbiAgICAgKiBBIFtwcm9qZWN0IGNvbmZpZyBvYmplY3RdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlncykgb3IgYW4gaW5zdGFuY2UgdGhhdCBob2xkcyBhbGwgc3RvcmVzIGFuZFxuICAgICAqIGRhdGEgdXNlZCBieSB0aGUgVGFza0JvYXJkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1wcm9qZWN0KVxuICAgICAqL1xuICAgIHByb2plY3QgPyA6IFByb2plY3RNb2RlbHxQcm9qZWN0TW9kZWxDb25maWd8b2JqZWN0XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGlzIHdpZGdldCBpcyByZWFkLW9ubHkuICBUaGlzIGlzIG9ubHkgdmFsaWQgaWYgdGhlIHdpZGdldCBpcyBhbiBpbnB1dFxuICAgICAqIGZpZWxkLCA8c3Ryb25nPm9yIGNvbnRhaW5zIGlucHV0IGZpZWxkcyBhdCBhbnkgZGVwdGg8L3N0cm9uZz4uXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLXJlYWRPbmx5KVxuICAgICAqL1xuICAgIHJlYWRPbmx5ID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogW1JlY29yZF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS9kYXRhL01vZGVsKSB3aG9zZSB2YWx1ZXMgd2lsbCBiZSB1c2VkIHRvIHBvcHVsYXRlIGZpZWxkcyBpbiB0aGUgY29udGFpbmVyLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1yZWNvcmQpXG4gICAgICovXG4gICAgcmVjb3JkID8gOiBNb2RlbFxuICAgIHJlbGF5U3RvcmVFdmVudHMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBFaXRoZXIgYSBkZWZhdWx0IGByZW5kaXRpb25gIHRvIGFwcGx5IHRvIGFsbCBjaGlsZCB3aWRnZXRzLCBvciBhIG1hcCBvZiByZW5kaXRpb25zIGtleWVkIGJ5IGNoaWxkIHdpZGdldFxuICAgICAqIGB0eXBlYC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctcmVuZGl0aW9uKVxuICAgICAqL1xuICAgIHJlbmRpdGlvbiA/IDogc3RyaW5nfFJlY29yZDxzdHJpbmcsIHN0cmluZz58bnVsbFxuICAgIC8qKlxuICAgICAqIFBhdGggdG8gbG9hZCByZXNvdXJjZSBpbWFnZXMgZnJvbS4gVXNlZCBieSB0aGUgZm9yIGV4YW1wbGUgdGhlIHJlc291cmNlIHBpY2tlciBpbiB0aGUgdGFzayBlZGl0b3IgYW5kIGJ5IHRoZVxuICAgICAqIFJlc291cmNlQXZhdGFycyB0YXNrIGl0ZW0uIFNldCB0aGlzIHRvIGRpc3BsYXkgbWluaWF0dXJlIGltYWdlcyBmb3IgZWFjaCByZXNvdXJjZSB1c2luZyB0aGVpciBgaW1hZ2VgIGZpZWxkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1yZXNvdXJjZUltYWdlUGF0aClcbiAgICAgKi9cbiAgICByZXNvdXJjZUltYWdlUGF0aCA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogSW5saW5lIFtyZXNvdXJjZXNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL21vZGVsL1Jlc291cmNlTW9kZWwpLCB3aWxsIGJlIGxvYWRlZCBpbnRvIGFuIGludGVybmFsbHkgY3JlYXRlZFxuICAgICAqIFtSZXNvdXJjZVN0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9kYXRhL1Jlc291cmNlU3RvcmUpIGFzIGEgcGFydCBvZiBhIFtwcm9qZWN0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvbW9kZWwvUHJvamVjdE1vZGVsKS5cbiAgICAgKi9cbiAgICByZXNvdXJjZXMgPyA6IFJlc291cmNlTW9kZWxbXXxvYmplY3RbXXxSZXNvdXJjZU1vZGVsQ29uZmlnW11cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgdGhlIHZhcmlvdXMgcmVzcG9uc2l2ZSBzdGF0ZSBvYmplY3RzIGtleWVkIGJ5IHRoZWlyIG5hbWUuIEVhY2gga2V5IChleGNlcHQgYCcqJ2AsIHNlZSBiZWxvdykgaW5cbiAgICAgKiB0aGlzIG9iamVjdCBpcyBhIHN0YXRlIG5hbWUgKHNlZSBbcmVzcG9uc2l2ZVN0YXRlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9taXhpbi9SZXNwb25zaXZlI2NvbmZpZy1yZXNwb25zaXZlU3RhdGUpKSBhbmQgaXRzIGNvcnJlc3BvbmRpbmcgdmFsdWUgaXMgdGhlXG4gICAgICogYXNzb2NpYXRlZCBbUmVzcG9uc2l2ZVN0YXRlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9taXhpbi9SZXNwb25zaXZlI3R5cGVkZWYtUmVzcG9uc2l2ZVN0YXRlKSBvYmplY3QuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLXJlc3BvbnNpdmUpXG4gICAgICovXG4gICAgcmVzcG9uc2l2ZSA/IDogb2JqZWN0XG4gICAgLyoqXG4gICAgICogU2V0IHRvIGB0cnVlYCB0byBtYXJrIHRoaXMgaW5zdGFuY2UgYXMgdGhlIGRlZmF1bHQgW3Jlc3BvbnNpdmVUYXJnZXRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L21peGluL1Jlc3BvbnNpdmUjY29uZmlnLXJlc3BvbnNpdmVUYXJnZXQpIGZvciBkZXNjZW5kYW50cyB0aGF0IGRvXG4gICAgICogbm90IHNwZWNpZnkgYW4gZXhwbGljaXQgW3Jlc3BvbnNpdmVUYXJnZXRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L21peGluL1Jlc3BvbnNpdmUjY29uZmlnLXJlc3BvbnNpdmVUYXJnZXQpIG9mIHRoZWlyIG93bi5cbiAgICAgKi9cbiAgICByZXNwb25zaXZlUm9vdCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY3RpdmUgc3RhdGUgb2YgdGhlIFtyZXNwb25zaXZlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9taXhpbi9SZXNwb25zaXZlI2NvbmZpZy1yZXNwb25zaXZlKSBjb25maWcuIFRoaXMgaXMgYXNzaWduZWQgaW50ZXJuYWxseVxuICAgICAqIGFuZCBzaG91bGQgbm90IGJlIGFzc2lnbmVkIGRpcmVjdGx5LlxuICAgICAqL1xuICAgIHJlc3BvbnNpdmVTdGF0ZSA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogVGhlIHdpZGdldCB3aG9zZSBzaXplIGFuZCBvdGhlciBwcm9wZXJ0aWVzIGRyaXZlIHRoaXMgb2JqZWN0J3MgcmVzcG9uc2l2ZSBiZWhhdmlvci4gSWYgdGhpcyBjb25maWcgaXMgbm90XG4gICAgICogc3BlY2lmaWVkLCB0aGUgY2xvc2VzdCBhbmNlc3RvciB0aGF0IHNwZWNpZmllZCBbcmVzcG9uc2l2ZVJvb3Q9dHJ1ZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS93aWRnZXQvbWl4aW4vUmVzcG9uc2l2ZSNjb25maWctcmVzcG9uc2l2ZVJvb3QpIHdpbGwgYmVcbiAgICAgKiB1c2VkLiBJZiB0aGVyZSBpcyBubyBzdWNoIGFuY2VzdG9yLCB0aGVuIHRoZSBpbnN0YW5jZSB1c2luZyB0aGlzIG1peGluIGlzIHVzZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLXJlc3BvbnNpdmVUYXJnZXQpXG4gICAgICovXG4gICAgcmVzcG9uc2l2ZVRhcmdldCA/IDogc3RyaW5nfFdpZGdldFxuICAgIC8qKlxuICAgICAqIElmIHlvdSBhcmUgcmVuZGVyaW5nIHRoaXMgd2lkZ2V0IHRvIGEgc2hhZG93IHJvb3QgaW5zaWRlIGEgd2ViIGNvbXBvbmVudCwgc2V0IHRoaXMgY29uZmlnIHRvIHRoZSBzaGFkb3dSb290LiBJZiBub3QgaW5zaWRlIGEgd2ViIGNvbXBvbmVudCwgc2V0IGl0IHRvIGBkb2N1bWVudC5ib2R5YFxuICAgICAqL1xuICAgIHJvb3RFbGVtZW50ID8gOiBTaGFkb3dSb290fEhUTUxFbGVtZW50XG4gICAgLyoqXG4gICAgICogVGhpcyBtYXkgYmUgY29uZmlndXJlZCBhcyBgdHJ1ZWAgdG8gbWFrZSB0aGUgd2lkZ2V0J3MgZWxlbWVudCB1c2UgdGhlIGBkaXJlY3Rpb246cnRsYCBzdHlsZS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctcnRsKVxuICAgICAqL1xuICAgIHJ0bCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIChhbmQgb3B0aW9uYWxseSBpbiB3aGljaCBheGVzKSBhIFdpZGdldCBtYXkgc2Nyb2xsLiBgdHJ1ZWAgbWVhbnMgdGhpcyB3aWRnZXQgbWF5IHNjcm9sbFxuICAgICAqIGluIGJvdGggYXhlcy4gTWF5IGJlIGFuIG9iamVjdCBjb250YWluaW5nIGJvb2xlYW4gYG92ZXJmbG93WGAgYW5kIGBvdmVyZmxvd1lgIHByb3BlcnRpZXMgd2hpY2ggYXJlXG4gICAgICogYXBwbGllZCB0byBDU1Mgc3R5bGUgcHJvcGVydGllcyBgb3ZlcmZsb3dYYCBhbmQgYG92ZXJmbG93WWAuIElmIHRoZXkgYXJlIGJvb2xlYW4sIHRoZXkgYXJlIHRyYW5zbGF0ZWQgdG9cbiAgICAgKiBDU1Mgb3ZlcmZsb3cgcHJvcGVydGllcyB0aHVzOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1zY3JvbGxhYmxlKVxuICAgICAqL1xuICAgIHNjcm9sbGFibGUgPyA6IGJvb2xlYW58U2Nyb2xsZXJDb25maWd8U2Nyb2xsZXJcbiAgICAvKipcbiAgICAgKiBEZWZpbmVzIHdoYXQgdG8gZG8gaWYgZG9jdW1lbnQgaXMgc2Nyb2xsZWQgd2hpbGUgV2lkZ2V0IGlzIHZpc2libGUgKG9ubHkgcmVsZXZhbnQgd2hlbiBmbG9hdGluZyBpcyBzZXQgdG8gYHRydWVgKS5cbiAgICAgKiBWYWxpZCB2YWx1ZXM6IMK0bnVsbMK0OiBkbyBub3RoaW5nLCDCtGhpZGXCtDogaGlkZSB0aGUgd2lkZ2V0IG9yIMK0cmVhbGlnbsK0OiByZWFsaWduIHRvIHRoZSB0YXJnZXQgaWYgcG9zc2libGUuXG4gICAgICovXG4gICAgc2Nyb2xsQWN0aW9uID8gOiAnaGlkZSd8J3JlYWxpZ24nfG51bGxcbiAgICAvKipcbiAgICAgKiBDb25maWd1cmF0aW9uIHZhbHVlcyBmb3IgdGhlIFtTY3JvbGxNYW5hZ2VyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL3V0aWwvU2Nyb2xsTWFuYWdlcikgY2xhc3MuIEl0IGlzIHVzZWQgdG8gbWFuYWdlIGNvbHVtbi9ib2R5XG4gICAgICogc2Nyb2xsaW5nIGR1cmluZyB0YXNrLCBjb2x1bW4gb3Igc3dpbWxhbmUgZHJhZy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctc2Nyb2xsTWFuYWdlcilcbiAgICAgKi9cbiAgICBzY3JvbGxNYW5hZ2VyID8gOiBTY3JvbGxNYW5hZ2VyQ29uZmlnXG4gICAgLyoqXG4gICAgICogRGVmYXVsdCBzY3JvbGwgb3B0aW9ucywgc2VlIHRoZSBvcHRpb25zIGZvciBbc2Nyb2xsSW50b1ZpZXddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvaGVscGVyL3V0aWwvU2Nyb2xsZXIjZnVuY3Rpb24tc2Nyb2xsSW50b1ZpZXcpXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLXNjcm9sbE9wdGlvbnMpXG4gICAgICovXG4gICAgc2Nyb2xsT3B0aW9ucyA/IDogQnJ5bnR1bVNjcm9sbE9wdGlvbnNcbiAgICAvKipcbiAgICAgKiBTZWxlY3RlZCB0YXNrcy5cbiAgICAgKi9cbiAgICBzZWxlY3RlZFRhc2tzID8gOiBUYXNrTW9kZWxbXVxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSB3aXRoIGB0cnVlYCB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIG9mIGtleWJvYXJkIG5hdmlnYXRpb24gZnJvbSBtb3ZpbmcgZm9jdXMgdG8gc2VsZWN0aW5nXG4gICAgICogdGFza3M6XG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLXNlbGVjdE9uTmF2aWdhdGlvbilcbiAgICAgKi9cbiAgICBzZWxlY3RPbk5hdmlnYXRpb24gPyA6IGJvb2xlYW58c3RyaW5nXG4gICAgLyoqXG4gICAgICogKk9ubHkgdmFsaWQgaWYgdGhpcyBXaWRnZXQgaXMgW2Zsb2F0aW5nXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLWZsb2F0aW5nKS4qXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLXNob3dBbmltYXRpb24pXG4gICAgICovXG4gICAgc2hvd0FuaW1hdGlvbiA/IDogYm9vbGVhbnxvYmplY3RcbiAgICAvKipcbiAgICAgKiBTaG93IGFuIGljb24gdG8gZXhwYW5kL2NvbGxhcHNlIGNvbHVtbnMgYW5kIHN3aW1sYW5lcyBpbiB0aGVpciBoZWFkZXJzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1zaG93Q29sbGFwc2VJbkhlYWRlcilcbiAgICAgKi9cbiAgICBzaG93Q29sbGFwc2VJbkhlYWRlciA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEJ5IGRlZmF1bHQsIGEgdG9vbHRpcCBzaG93aW5nIGBFeHBhbmQgWFhgL2BDb2xsYXBzZSBYWGAgaXMgc2hvd24gd2hlbiBob3ZlcmluZyB0aGUgZXhwYW5kL2NvbGxhcHNlIGljb24gZm9yXG4gICAgICogYSBjb2x1bW4gb3Igc3dpbWxhbmUuIFRvIGRpc2FibGUgdGhlIHRvb2x0aXAsIHNldCB0aGlzIHRvIGBmYWxzZWAuXG4gICAgICovXG4gICAgc2hvd0NvbGxhcHNlVG9vbHRpcCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFNob3cgdGFzayBjb3VudCBmb3IgYSBjb2x1bW4gaW4gaXRzIGhlYWRlciwgYXBwZW5kZWQgYWZ0ZXIgdGhlIHRpdGxlXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLXNob3dDb3VudEluSGVhZGVyKVxuICAgICAqL1xuICAgIHNob3dDb3VudEluSGVhZGVyID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogUHJvZ3JhbW1hdGljIGNvbnRyb2wgb3ZlciBob3cgbWFueSBjb2x1bW5zIHRvIHNwYW4gd2hlbiB1c2VkIGluIGEgZ3JpZCBsYXlvdXQuXG4gICAgICovXG4gICAgc3BhbiA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogVGhpcyB2YWx1ZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6XG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLXN0YXRlZnVsKVxuICAgICAqL1xuICAgIHN0YXRlZnVsID8gOiBib29sZWFufG9iamVjdHxzdHJpbmdbXVxuICAgIC8qKlxuICAgICAqIFRoZSBldmVudHMgdGhhdCwgd2hlbiBmaXJlZCBieSB0aGlzIGNvbXBvbmVudCwgc2hvdWxkIHRyaWdnZXIgaXQgdG8gc2F2ZSBpdHMgc3RhdGUgYnkgY2FsbGluZ1xuICAgICAqIFtzYXZlU3RhdGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvbWl4aW4vU3RhdGUjZnVuY3Rpb24tc2F2ZVN0YXRlKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctc3RhdGVmdWxFdmVudHMpXG4gICAgICovXG4gICAgc3RhdGVmdWxFdmVudHMgPyA6IG9iamVjdHxzdHJpbmdbXVxuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgdG8gdXNlIHdoZW4gc2F2aW5nIHRoaXMgb2JqZWN0J3Mgc3RhdGUgaW4gdGhlIFtzdGF0ZVByb3ZpZGVyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL21peGluL1N0YXRlI2NvbmZpZy1zdGF0ZVByb3ZpZGVyKS4gSWYgdGhpcyBjb25maWcgaXNcbiAgICAgKiBub3QgYXNzaWduZWQsIGFuZCBbc3RhdGVmdWxdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvbWl4aW4vU3RhdGUjY29uZmlnLXN0YXRlZnVsKSBpcyBub3Qgc2V0IHRvIGBmYWxzZWAsIHRoZSBbaWRdKCNDb3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLWlkKVxuICAgICAqIChpZiBleHBsaWNpdGx5IHNwZWNpZmllZCkgd2lsbCBiZSB1c2VkIGFzIHRoZSBgc3RhdGVJZGAuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLXN0YXRlSWQpXG4gICAgICovXG4gICAgc3RhdGVJZCA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogVGhlIGBTdGF0ZVByb3ZpZGVyYCB0byB1c2UgdG8gc2F2ZSBhbmQgcmVzdG9yZSB0aGlzIG9iamVjdCdzIFtzdGF0ZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS9taXhpbi9TdGF0ZSNwcm9wZXJ0eS1zdGF0ZSkuIEJ5IGRlZmF1bHQsIGBzdGF0ZWBcbiAgICAgKiB3aWxsIGJlIHNhdmVkIHVzaW5nIHRoZSBbZGVmYXVsdCBzdGF0ZSBwcm92aWRlcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS9zdGF0ZS9TdGF0ZVByb3ZpZGVyI3Byb3BlcnR5LWluc3RhbmNlLXN0YXRpYykuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLXN0YXRlUHJvdmlkZXIpXG4gICAgICovXG4gICAgc3RhdGVQcm92aWRlciA/IDogU3RhdGVQcm92aWRlclxuICAgIC8qKlxuICAgICAqIE1ha2VzIGNvbHVtbiBhbmQgc3dpbWxhbmUgaGVhZGVycyBzdGlja3lcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctc3RpY2t5SGVhZGVycylcbiAgICAgKi9cbiAgICBzdGlja3lIZWFkZXJzID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogU2V0dGluZyB0aGlzIHdpbGwgY2F1c2UgY2FyZHMgdG8gZXhwYW5kIHRvIHNoYXJlIHRoZSBhdmFpbGFibGUgd2lkdGggaWYgdGhlcmUgYXJlIGZld2VyIHRoYW5cbiAgICAgKiBbdGFza3NQZXJSb3ddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLXRhc2tzUGVyUm93KS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctc3RyZXRjaENhcmRzKVxuICAgICAqL1xuICAgIHN0cmV0Y2hDYXJkcyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgYHRydWVgIHRvIG1hdGNoIGZpZWxkcyBieSB0aGVpciBgbmFtZWAgcHJvcGVydHkgb25seSB3aGVuIGFzc2lnbmluZyBhIFtyZWNvcmRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0NvbnRhaW5lciNjb25maWctcmVjb3JkKSxcbiAgICAgKiB3aXRob3V0IGZhbGxpbmcgYmFjayB0byBgcmVmYC5cbiAgICAgKi9cbiAgICBzdHJpY3RSZWNvcmRNYXBwaW5nID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgd2lkZ2V0cyBrZXllZCBieSBuYW1lLiBCeSBkZWZhdWx0ICh3aGVuIG5vIGB0eXBlYCBpcyBnaXZlbiksIHN0cmlwcyBhcmVcbiAgICAgKiBbdG9vbGJhcnNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1Rvb2xiYXIpLiBJZiB5b3Ugd2FudCB0byBwYXNzIGFuIGFycmF5LCB5b3UgY2FuIHVzZVxuICAgICAqIHRoZSB0b29sYmFyJ3MgW2l0ZW1zXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db250YWluZXIjY29uZmlnLWl0ZW1zKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctc3RyaXBzKVxuICAgICAqL1xuICAgIHN0cmlwcyA/IDogUmVjb3JkPHN0cmluZywgQ29udGFpbmVySXRlbUNvbmZpZz5cbiAgICAvKipcbiAgICAgKiBGaWVsZCBvbiBhIHRhc2sgcmVjb3JkIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIHN3aW1sYW5lIHRoZSB0YXNrIGJlbG9uZ3MgdG8uXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLXN3aW1sYW5lRmllbGQpXG4gICAgICovXG4gICAgc3dpbWxhbmVGaWVsZCA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogQW4gZW1wdHkgZnVuY3Rpb24gYnkgZGVmYXVsdCwgYnV0IHByb3ZpZGVkIHNvIHRoYXQgeW91IGNhbiBvdmVycmlkZSBpdC4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZWFjaCB0aW1lXG4gICAgICogYSBzd2ltbGFuZSBpcyByZW5kZXJlZCBpbnRvIHRoZSB0YXNrIGJvYXJkLiBJdCBhbGxvd3MgeW91IHRvIG1hbmlwdWxhdGUgdGhlIERPTSBjb25maWcgb2JqZWN0IHVzZWQgZm9yIHRoZVxuICAgICAqIHN3aW1sYW5lIGJlZm9yZSBpdCBpcyBzeW5jZWQgdG8gRE9NLCB0aHVzIGdpdmluZyB5b3UgY29udHJvbCBvdmVyIHN0eWxpbmcgYW5kIGNvbnRlbnRzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1zd2ltbGFuZVJlbmRlcmVyKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBkZXRhaWwgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byByZW5kZXIgYSBzd2ltbGFuZS5cbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5Td2ltbGFuZU1vZGVsfSBkZXRhaWwuc3dpbWxhbmVSZWNvcmQgVGhlIHN3aW1sYW5lLlxuICAgICAqIEBwYXJhbSB7RG9tQ29uZmlnfSBkZXRhaWwuc3dpbWxhbmVDb25maWcgRE9NIGNvbmZpZyBvYmplY3QgZm9yIHRoZSBzd2ltbGFuZVxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIHN3aW1sYW5lUmVuZGVyZXIgPyA6IChkZXRhaWw6IHsgc3dpbWxhbmVSZWNvcmQ6IFN3aW1sYW5lTW9kZWwsIHN3aW1sYW5lQ29uZmlnOiBEb21Db25maWcgfSkgPT4gdm9pZFxuICAgIC8qKlxuICAgICAqIFN0b3JlIGNvbnRhaW5pbmcgdGhlIFRhc2tCb2FyZCBzd2ltbGFuZXMuIEEgdGFza3MgW3N3aW1sYW5lRmllbGRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L21peGluL1Rhc2tCb2FyZFN3aW1sYW5lcyNjb25maWctc3dpbWxhbmVGaWVsZCkgaXMgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBgaWRgXG4gICAgICogb2YgYSBzd2ltbGFuZSB0byBkZXRlcm1pbmUgaW4gd2hpY2ggc3dpbWxhbmUgaXQgaXMgZGlzcGxheWVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy1zd2ltbGFuZXMpXG4gICAgICovXG4gICAgc3dpbWxhbmVzID8gOiBTd2ltbGFuZU1vZGVsW118U3dpbWxhbmVNb2RlbENvbmZpZ1tdfFN0b3JlfHN0cmluZ3xTdG9yZUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIFRhc2tCb2FyZCBkb2VzIG5vdCB1c2UgYSBzeW5jIG1hc2sgYnkgZGVmYXVsdC4gSWYgeW91IHdhbnQgb25lLCBzZWVcbiAgICAgKiBbc3luY01hc2tdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvbWl4aW4vTG9hZE1hc2thYmxlI2NvbmZpZy1zeW5jTWFzaykgZm9yIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiAgICAgKi9cbiAgICBzeW5jTWFzayA/IDogc3RyaW5nfG9iamVjdHxudWxsXG4gICAgLyoqXG4gICAgICogQSBjb25maWd1cmF0aW9uIGZvciB0aGUgW3RhYl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS93aWRnZXQvVGFiKSBjcmVhdGVkIGZvciB0aGlzIHdpZGdldCB3aGVuIGl0IGlzIHBsYWNlZCBpbiBhXG4gICAgICogW1RhYlBhbmVsXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9UYWJQYW5lbCkuIEZvciBleGFtcGxlLCB0aGlzIGNvbmZpZyBjYW4gYmUgdXNlZCB0byBjb250cm9sIHRoZSBpY29uIG9mIHRoZSBgdGFiYCBmb3JcbiAgICAgKiB0aGlzIHdpZGdldDpcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctdGFiKVxuICAgICAqL1xuICAgIHRhYiA/IDogYm9vbGVhbnxUYWJDb25maWdcbiAgICAvKipcbiAgICAgKiBXaGVuIHRoaXMgY29udGFpbmVyIGlzIHVzZWQgYXMgYSB0YWIgaW4gYSBUYWJQYW5lbCwgdGhlc2UgaXRlbXMgYXJlIGFkZGVkIHRvIHRoZVxuICAgICAqIFtUYWJCYXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1RhYkJhcikgd2hlbiB0aGlzIGNvbnRhaW5lciBpcyB0aGUgYWN0aXZlIHRhYi5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctdGFiQmFySXRlbXMpXG4gICAgICovXG4gICAgdGFiQmFySXRlbXMgPyA6IFRvb2xiYXJJdGVtc1tdfFdpZGdldFtdXG4gICAgLyoqXG4gICAgICogQW4gZW1wdHkgZnVuY3Rpb24gYnkgZGVmYXVsdCwgYnV0IHByb3ZpZGVkIHNvIHRoYXQgeW91IGNhbiBvdmVycmlkZSBpdC4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZWFjaCB0aW1lXG4gICAgICogYSB0YXNrIGlzIHJlbmRlcmVkIGludG8gdGhlIHRhc2sgYm9hcmQuIEl0IGFsbG93cyB5b3UgdG8gbWFuaXB1bGF0ZSB0aGUgRE9NIGNvbmZpZyBvYmplY3QgdXNlZCBmb3IgdGhlIGNhcmRcbiAgICAgKiBiZWZvcmUgaXQgaXMgc3luY2VkIHRvIERPTSwgdGh1cyBnaXZpbmcgeW91IGNvbnRyb2wgb3ZlciBzdHlsaW5nIGFuZCBjb250ZW50cy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctdGFza1JlbmRlcmVyKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBkZXRhaWwgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCB0byByZW5kZXIgYSB0YXNrLlxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLlRhc2tNb2RlbH0gZGV0YWlsLnRhc2tSZWNvcmQgVGhlIHRhc2sgcmVjb3JkLlxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLkNvbHVtbk1vZGVsfSBkZXRhaWwuY29sdW1uUmVjb3JkIFRoZSBjb2x1bW4gdGhlIHRhc2sgd2lsbCBiZSBkaXNwbGF5ZWQgaW4uXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuU3dpbWxhbmVNb2RlbH0gZGV0YWlsLnN3aW1sYW5lUmVjb3JkIFRoZSBzd2ltbGFuZSB0aGUgdGFzayB3aWxsIGJlIGRpc3BsYXllZCBpbi5cbiAgICAgKiBAcGFyYW0ge0RvbUNvbmZpZ30gZGV0YWlsLmNhcmRDb25maWcgRE9NIGNvbmZpZyBvYmplY3QgZm9yIHRoZSBjYXJkcyBlbGVtZW50XG4gICAgICogQHJldHVybnMge3ZvaWR9XG4gICAgICovXG4gICAgdGFza1JlbmRlcmVyID8gOiAoZGV0YWlsOiB7IHRhc2tSZWNvcmQ6IFRhc2tNb2RlbCwgY29sdW1uUmVjb3JkOiBDb2x1bW5Nb2RlbCwgc3dpbWxhbmVSZWNvcmQ6IFN3aW1sYW5lTW9kZWwsIGNhcmRDb25maWc6IERvbUNvbmZpZyB9KSA9PiB2b2lkXG4gICAgLyoqXG4gICAgICogSW5saW5lIFt0YXNrc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL1Rhc2tNb2RlbCksIHdpbGwgYmUgbG9hZGVkIGludG8gYW4gaW50ZXJuYWxseSBjcmVhdGVkXG4gICAgICogW1Rhc2tTdG9yZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3N0b3JlL1Rhc2tTdG9yZSkgYXMgYSBwYXJ0IG9mIGEgW3Byb2plY3RdKCNUYXNrQm9hcmQvbW9kZWwvUHJvamVjdE1vZGVsKS5cbiAgICAgKi9cbiAgICB0YXNrcyA/IDogVGFza01vZGVsW118b2JqZWN0W118VGFza01vZGVsQ29uZmlnW11cbiAgICAvKipcbiAgICAgKiBBbGxvd3Mgc29ydGluZyB0YXNrcyBpbiB0aGUgVUkgaW5kZXBlbmRlbnQgb2YgaG93IHRoZXkgYXJlIHNvcnRlZCBpbiB0aGUgdGFzayBzdG9yZS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctdGFza1NvcnRlckZuKVxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLlRhc2tNb2RlbH0gZmlyc3QgVGhlIGZpcnN0IHRhc2sgdG8gY29tcGFyZVxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLlRhc2tNb2RlbH0gc2Vjb25kIFRoZSBzZWNvbmQgdGFzayB0byBjb21wYXJlXG4gICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJuIGAxYCBpZiBmaXJzdCB0YXNrIGlzIGdyZWF0ZXIgdGhhbiBzZWNvbmQgdGFzaywgYC0xYCBpZiB0aGUgb3Bwb3NpdGUgaXMgdHJ1ZSBvciBgMGAgaWYgdGhleSBhcmUgZXF1YWxcbiAgICAgKi9cbiAgICB0YXNrU29ydGVyRm4gPyA6IGJvb2xlYW58KChmaXJzdDogVGFza01vZGVsLCBzZWNvbmQ6IFRhc2tNb2RlbCkgPT4gbnVtYmVyKVxuICAgIC8qKlxuICAgICAqIENvbnRyb2xzIGhvdyBtYW55IGNhcmRzIGFyZSByZW5kZXJlZCB0byBhIHJvdyBpbiBlYWNoIGNvbHVtbi4gQ2FuIGJlIGNvbnRyb2xsZWQgb24gYSBwZXIgY29sdW1uIGJhc2lzIGJ5XG4gICAgICogc2V0dGluZyBbdGFza3NQZXJSb3ddKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9tb2RlbC9Db2x1bW5Nb2RlbCNmaWVsZC10YXNrc1BlclJvdylcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctdGFza3NQZXJSb3cpXG4gICAgICovXG4gICAgdGFza3NQZXJSb3cgPyA6IG51bWJlclxuICAgIC8qKlxuICAgICAqIEEgQ29uZmlnIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gb2YgYSBbVG9vbGJhcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS93aWRnZXQvVG9vbGJhciksXG4gICAgICogb3IgYXJyYXkgb2YgY29uZmlnIG9iamVjdHMgcmVwcmVzZW50aW5nIHRoZSBjaGlsZCBpdGVtcyBvZiBhIFRvb2xiYXIuXG4gICAgICogVGhpcyBjcmVhdGVzIGEgdG9vbGJhciBkb2NrZWQgdG8gdGhlIHRvcCBvZiB0aGUgcGFuZWwgaW1tZWRpYXRlbHkgYmVsb3cgdGhlIGhlYWRlci5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNjb25maWctdGJhcilcbiAgICAgKi9cbiAgICB0YmFyID8gOiAoQ29udGFpbmVySXRlbUNvbmZpZ3xzdHJpbmcpW118VG9vbGJhckNvbmZpZ3xQYWdpbmdUb29sYmFyQ29uZmlnfG51bGxcbiAgICAvKipcbiAgICAgKiBBIHRpdGxlIHRvIGRpc3BsYXkgaW4gdGhlIGhlYWRlciBvciBvd25pbmcgVGFiUGFuZWwuIENhdXNlcyBjcmVhdGlvbiBhbmQgZG9ja2luZyBvZiBhIGhlYWRlclxuICAgICAqIHRvIHRoZSB0b3AgaWYgbm8gaGVhZGVyIGlzIGNvbmZpZ3VyZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLXRpdGxlKVxuICAgICAqL1xuICAgIHRpdGxlID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBUaGUgW3Rvb2xzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9Ub29sKSB0byBhZGQgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGUgYHRpdGxlYCBpbiB0aGUgUGFuZWwgaGVhZGVyLiBFYWNoXG4gICAgICogcHJvcGVydHkgbmFtZSBpcyB0aGUgcmVmZXJlbmNlIGJ5IHdoaWNoIGFuIGluc3RhbnRpYXRlZCB0b29sIG1heSBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgbGl2ZVxuICAgICAqIGBbdG9vbHNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L21peGluL1Rvb2xhYmxlI3Byb3BlcnR5LXRvb2xzKWAgcHJvcGVydHkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjY29uZmlnLXRvb2xzKVxuICAgICAqL1xuICAgIHRvb2xzID8gOiBSZWNvcmQ8c3RyaW5nLCBUb29sQ29uZmlnPnxudWxsXG4gICAgLyoqXG4gICAgICogQ3VzdG9tIENTUyBjbGFzcyBuYW1lIHN1ZmZpeGVzIHRvIGFwcGx5IHRvIHRoZSBlbGVtZW50cyByZW5kZXJlZCBieSB0aGlzIHdpZGdldC4gVGhpcyBtYXkgYmUgc3BlY2lmaWVkXG4gICAgICogYXMgYSBzcGFjZSBzZXBhcmF0ZWQgc3RyaW5nLCBhbiBhcnJheSBvZiBzdHJpbmdzLCBvciBhcyBhbiBvYmplY3QgaW4gd2hpY2ggcHJvcGVydHkgbmFtZXMgd2l0aCB0cnV0aHlcbiAgICAgKiB2YWx1ZXMgYXJlIHVzZWQgYXMgdGhlIGNsYXNzIG5hbWVzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy11aSlcbiAgICAgKi9cbiAgICB1aSA/IDogJ3BsYWluJ3wndG9vbGJhcid8c3RyaW5nfG9iamVjdFxuICAgIC8qKlxuICAgICAqIEV4cGVyaW1lbnRhbCwgYW5pbWF0ZSBhY3Rpb25zIHRoYXQgY2Fubm90IGJlIGFuaW1hdGVkIHVzaW5nIENTUyB0cmFuc2l0aW9ucy4gQ3VycmVudGx5IGluY2x1ZGVzOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy11c2VEb21UcmFuc2l0aW9uKVxuICAgICAqL1xuICAgIHVzZURvbVRyYW5zaXRpb24gPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBCeSB0dXJuaW5nIG9uIHRoaXMgc2V0dGluZyB5b3UgZW5hYmxlIHBhcnRpYWwgdmlydHVhbGl6ZWQgcmVuZGVyaW5nIGZvciB0aGUgYm9hcmQsIHdoaWNoIHJlZHVjZXMgaW5pdGlhbFxuICAgICAqIHJlbmRlcmluZyB0aW1lIGFuZCBtYWtlcyBpbnRlcmFjdGlvbiBsZXNzIHNsdWdnaXNoIHdoZW4gdXNpbmcgdGhvdXNhbmRzIG9mIHRhc2tzLiBUaGUgdHJhZGVvZmYgaXMgdGhhdFxuICAgICAqIHNjcm9sbGluZyBpbiBtb3N0IGNhc2VzIHdpbGwgYmUgc2xvd2VyLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy12aXJ0dWFsaXplKVxuICAgICAqL1xuICAgIHZpcnR1YWxpemUgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBBIHdpZGdldHMgd2VpZ2h0IGRldGVybWluZXMgaXRzIHBvc2l0aW9uIGFtb25nIHNpYmxpbmdzIHdoZW4gYWRkZWQgdG8gYSBbQ29udGFpbmVyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db250YWluZXIpLlxuICAgICAqIEhpZ2hlciB3ZWlnaHRzIGdvIGZ1cnRoZXIgZG93bi5cbiAgICAgKi9cbiAgICB3ZWlnaHQgPyA6IG51bWJlclxuICAgIC8qKlxuICAgICAqIFdpZGdldCdzIHdpZHRoLCB1c2VkIHRvIHNldCBlbGVtZW50IGBzdHlsZS53aWR0aGAuIEVpdGhlciBzcGVjaWZ5IGEgdmFsaWQgd2lkdGggc3RyaW5nIG9yIGEgbnVtYmVyLCB3aGljaFxuICAgICAqIHdpbGwgZ2V0ICdweCcgYXBwZW5kZWQuIFdlIHJlY29tbWVuZCB1c2luZyBDU1MgYXMgdGhlIHByaW1hcnkgd2F5IHRvIGNvbnRyb2wgd2lkdGgsIGJ1dCBpbiBzb21lIGNhc2VzXG4gICAgICogdGhpcyBjb25maWcgaXMgY29udmVuaWVudC5cbiAgICAgKi9cbiAgICB3aWR0aCA/IDogc3RyaW5nfG51bWJlclxuICAgIC8qKlxuICAgICAqIFRoZSB4IHBvc2l0aW9uIGZvciB0aGUgd2lkZ2V0LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy14KVxuICAgICAqL1xuICAgIHggPyA6IG51bWJlclxuICAgIC8qKlxuICAgICAqIFRoZSB5IHBvc2l0aW9uIGZvciB0aGUgd2lkZ2V0LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2NvbmZpZy15KVxuICAgICAqL1xuICAgIHkgPyA6IG51bWJlclxuXG4gICAgLy8gRmVhdHVyZXNcbiAgICAvKipcbiAgICAgKiBUaGlzIGZlYXR1cmUgYWxsb3dzIHVzZXJzIHRvIGRyYWcgY29sdW1ucyBvbiB0aGUgVGFza0JvYXJkIHRvIGNoYW5nZSB0aGUgY29sdW1uIG9yZGVyLiBEcmFnIGlzIGluaXRpYXRlZCB1cG9uXG4gICAgICogbW91c2UgZG93biBpbiB0aGUgY29sdW1uIGhlYWRlci4gVHJ5IGl0IG91dCBiZWxvdyFcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL2ZlYXR1cmUvQ29sdW1uRHJhZylcbiAgICAgKi9cbiAgICBjb2x1bW5EcmFnRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfENvbHVtbkRyYWd8Q29sdW1uRHJhZ0NvbmZpZ1xuICAgIC8qKlxuICAgICAqIEFkZHMgdGhlIGFiaWxpdHkgdG8gZmlsdGVyIGVhY2ggY29sdW1uIG9mIHRoZSBUYXNrQm9hcmQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9mZWF0dXJlL0NvbHVtbkZpbHRlcilcbiAgICAgKi9cbiAgICBjb2x1bW5GaWx0ZXJGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q29sdW1uRmlsdGVyfENvbHVtbkZpbHRlckNvbmZpZ1xuICAgIC8qKlxuICAgICAqIEFkZHMgYSBtZW51IGJ1dHRvbiAoYMK3wrfCt2ApIHRvIGNvbHVtbiBoZWFkZXJzLCBjbGlja2luZyBpdCBkaXNwbGF5cyBhIG1lbnUuIEl0ZW1zIGFyZSBwb3B1bGF0ZWQgYnkgb3RoZXIgZmVhdHVyZXNcbiAgICAgKiBhbmQvb3IgYXBwbGljYXRpb24gY29kZS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL2ZlYXR1cmUvQ29sdW1uSGVhZGVyTWVudSlcbiAgICAgKi9cbiAgICBjb2x1bW5IZWFkZXJNZW51RmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfENvbHVtbkhlYWRlck1lbnV8Q29sdW1uSGVhZGVyTWVudUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIEFsbG93cyB1c2VyIHRvIGxvY2sgY29sdW1ucyB0byB0aGUgbGVmdCBvciByaWdodCB1c2luZyB0aGUgbmV3IFtsb2NrZWRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9tb2RlbC9Db2x1bW5Nb2RlbCNmaWVsZC1sb2NrZWQpIGZpZWxkXG4gICAgICogb24gY29sdW1ucy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL2ZlYXR1cmUvQ29sdW1uTG9jaylcbiAgICAgKi9cbiAgICBjb2x1bW5Mb2NrRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfENvbHVtbkxvY2t8Q29sdW1uTG9ja0NvbmZpZ1xuICAgIC8qKlxuICAgICAqIEFsbG93cyB1c2VyIHRvIHJlbmFtZSBjb2x1bW5zIGJ5IGVpdGhlciBkb3VibGUtY2xpY2tpbmcgY29sdW1uIHRleHQsIG9yIHZpYSB0aGUgY29sdW1uIGhlYWRlciBtZW51LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvZmVhdHVyZS9Db2x1bW5SZW5hbWUpXG4gICAgICovXG4gICAgY29sdW1uUmVuYW1lRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfENvbHVtblJlbmFtZXxDb2x1bW5SZW5hbWVDb25maWdcbiAgICAvKipcbiAgICAgKiBUaGlzIGZlYXR1cmUgYWxsb3dzIHVzZXJzIHRvIGNoYW5nZSB0aGUgd2lkdGggb2YgaW5kaXZpZHVhbCBUYXNrQm9hcmQgY29sdW1ucy4gUmVzaXplIGlzIGluaXRpYXRlZCB1cG9uIG1vdXNlIGRvd24gb25cbiAgICAgKiB0aGUgc2VwYXJhdG9yIGVsZW1lbnQgYmV0d2VlbiBjb2x1bW4gaGVhZGVycy4gVHJ5IGl0IG91dCBiZWxvdyFcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL2ZlYXR1cmUvQ29sdW1uUmVzaXplKVxuICAgICAqL1xuICAgIGNvbHVtblJlc2l6ZUZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDb2x1bW5SZXNpemV8Q29sdW1uUmVzaXplQ29uZmlnXG4gICAgLyoqXG4gICAgICogQWRkcyB0aGUgYWJpbGl0eSB0byBzb3J0IGVhY2ggY29sdW1uIG9mIHRoZSBUYXNrQm9hcmQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9mZWF0dXJlL0NvbHVtblNvcnQpXG4gICAgICovXG4gICAgY29sdW1uU29ydEZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDb2x1bW5Tb3J0fENvbHVtblNvcnRDb25maWdcbiAgICAvKipcbiAgICAgKiBBZGRzIHRvb2xiYXJzIHRvIHRoZSB0b3AgYW5kL29yIGJvdHRvbSBvZiBlYWNoIGNvbHVtbi4gQnkgZGVmYXVsdCBpdCBhZGRzIGEgYm90dG9tIHRvb2xiYXIgY29udGFpbmluZyBhIHNpbmdsZSBidXR0b25cbiAgICAgKiBmb3IgYWRkaW5nIGV2ZW50cyB0byB0aGF0IGNvbHVtbi9zd2ltbGFuZTpcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL2ZlYXR1cmUvQ29sdW1uVG9vbGJhcnMpXG4gICAgICovXG4gICAgY29sdW1uVG9vbGJhcnNGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q29sdW1uVG9vbGJhcnN8Q29sdW1uVG9vbGJhcnNDb25maWdcbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBhYmlsaXR5IHRvIHF1aWNrIHNlYXJjaCBpbiBjb25maWd1cmVkIGZpZWxkcyBvZiB0YXNrcy5cbiAgICAgKiBSZW5kZXJzIGEgZmlsdGVyIGJhciBiZWxvdyBlYWNoIGNvbHVtbidzIGhlYWRlci5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL2ZlYXR1cmUvRmlsdGVyQmFyKVxuICAgICAqL1xuICAgIGZpbHRlckJhckZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xGaWx0ZXJCYXJ8RmlsdGVyQmFyQ29uZmlnXG4gICAgLyoqXG4gICAgICogVGhpcyBmZWF0dXJlIGFsbG93cyBpbmxpbmUgZWRpdGluZyBvZiB0YXNrcy4gRG91YmxlLWNsaWNraW5nIGFuIGl0ZW0gc3RhcnRzIGVkaXRpbmcgaXQ6XG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9mZWF0dXJlL1NpbXBsZVRhc2tFZGl0KVxuICAgICAqL1xuICAgIHNpbXBsZVRhc2tFZGl0RmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFNpbXBsZVRhc2tFZGl0fFNpbXBsZVRhc2tFZGl0Q29uZmlnXG4gICAgLyoqXG4gICAgICogVGhpcyBmZWF0dXJlIGFsbG93cyB1c2VycyB0byBkcmFnIGRyb3Agc3dpbWxhbmVzIG9uIHRoZSBUYXNrQm9hcmQgY2hhbmdpbmcgdGhlaXIgb3JkZXIgKGJ5IGdyYWJiaW5nIHRoZWlyIGhlYWRlcikuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9mZWF0dXJlL1N3aW1sYW5lRHJhZylcbiAgICAgKi9cbiAgICBzd2ltbGFuZURyYWdGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8U3dpbWxhbmVEcmFnfFN3aW1sYW5lRHJhZ0NvbmZpZ1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmVhdHVyZSBhbGxvd3MgY2FyZHMgb24gdGhlIFRhc2tCb2FyZCB0byBiZSBkcmFnZ2VkIGFjcm9zcyBzd2ltbGFuZXMgYW5kIGNvbHVtbnMgYnV0IGFsc28gdmVydGljYWxseSBpbiB0aGVcbiAgICAgKiBzYW1lIGNvbHVtbiB0byBjaGFuZ2UgdGhlIG9yZGVyOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvZmVhdHVyZS9UYXNrRHJhZylcbiAgICAgKi9cbiAgICB0YXNrRHJhZ0ZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xUYXNrRHJhZ3xUYXNrRHJhZ0NvbmZpZ1xuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgdXNlcnMgdG8gY2xpY2sgYW5kIGRyYWcgdG8gc2VsZWN0IGNhcmRzIG9uIHRoZSBUYXNrQm9hcmQgKG1hcnF1ZWUgc2VsZWN0aW9uKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL2ZlYXR1cmUvVGFza0RyYWdTZWxlY3QpXG4gICAgICovXG4gICAgdGFza0RyYWdTZWxlY3RGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8VGFza0RyYWdTZWxlY3R8VGFza0RyYWdTZWxlY3RDb25maWdcbiAgICAvKipcbiAgICAgKiBUaGlzIGZlYXR1cmVzIGFsbG93cyB0aGUgdXNlciB0byBlZGl0IHRhc2tzIGluIGEgcG9wdXAgZWRpdG9yIHRoYXQgY2FuIGVpdGhlciBiZSBzaG93biBjZW50ZXJlZCBvbiBzY3JlZW4gKHRoZVxuICAgICAqIGRlZmF1bHQsIGRvdWJsZSBjbGljayBhIHRhc2sgdG8gc2hvdyB0aGUgZWRpdG9yKTpcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL2ZlYXR1cmUvVGFza0VkaXQpXG4gICAgICovXG4gICAgdGFza0VkaXRGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8VGFza0VkaXR8VGFza0VkaXRDb25maWdcbiAgICAvKipcbiAgICAgKiBEaXNwbGF5cyBhIGNvbnRleHQgbWVudSBmb3IgdGFza3MuIEl0ZW1zIGFyZSBwb3B1bGF0ZWQgYnkgb3RoZXIgZmVhdHVyZXMgYW5kL29yIGFwcGxpY2F0aW9uIGNvZGUuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9mZWF0dXJlL1Rhc2tNZW51KVxuICAgICAqL1xuICAgIHRhc2tNZW51RmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFRhc2tNZW51fFRhc2tNZW51Q29uZmlnXG4gICAgLyoqXG4gICAgICogRGlzcGxheXMgYSB0b29sdGlwIHdoZW4gaG92ZXJpbmcgYSB0YXNrLiBCeSBkZWZhdWx0IHRoZSB0b29sdGlwIGRpc3BsYXlzOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvZmVhdHVyZS9UYXNrVG9vbHRpcClcbiAgICAgKi9cbiAgICB0YXNrVG9vbHRpcEZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xUYXNrVG9vbHRpcHxUYXNrVG9vbHRpcENvbmZpZ1xuXG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yIDogJ2JyeW50dW0tdGFzay1ib2FyZC1iYXNlJyxcbiAgICB0ZW1wbGF0ZSA6ICcnXG59KVxuZXhwb3J0IGNsYXNzIEJyeW50dW1UYXNrQm9hcmRCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gICAgcHVibGljIHN0YXRpYyBpbnN0YW5jZUNsYXNzID0gVGFza0JvYXJkQmFzZTtcblxuICAgIHB1YmxpYyBzdGF0aWMgaW5zdGFuY2VOYW1lID0gJ1Rhc2tCb2FyZEJhc2UnO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnJ5bnR1bUV2ZW50czogc3RyaW5nW10gPSBbXG4gICAgICAgICdvbkFjdGl2YXRlVGFzaycsXG4gICAgICAgICdvbkJlZm9yZUNvbHVtbkRyYWcnLFxuICAgICAgICAnb25CZWZvcmVDb2x1bW5Ecm9wJyxcbiAgICAgICAgJ29uQmVmb3JlQ29sdW1uUmVzaXplJyxcbiAgICAgICAgJ29uQmVmb3JlRGVzdHJveScsXG4gICAgICAgICdvbkJlZm9yZUhpZGUnLFxuICAgICAgICAnb25CZWZvcmVSZXNwb25zaXZlU3RhdGVDaGFuZ2UnLFxuICAgICAgICAnb25CZWZvcmVTaG93JyxcbiAgICAgICAgJ29uQmVmb3JlU2ltcGxlVGFza0VkaXQnLFxuICAgICAgICAnb25CZWZvcmVTdGF0ZUFwcGx5JyxcbiAgICAgICAgJ29uQmVmb3JlU3RhdGVTYXZlJyxcbiAgICAgICAgJ29uQmVmb3JlVGFza0RyYWcnLFxuICAgICAgICAnb25CZWZvcmVUYXNrRHJvcCcsXG4gICAgICAgICdvbkJlZm9yZVRhc2tFZGl0JyxcbiAgICAgICAgJ29uQmVmb3JlVGFza0VkaXRTaG93JyxcbiAgICAgICAgJ29uQmVmb3JlVGFza1JlbW92ZScsXG4gICAgICAgICdvbkNhdGNoQWxsJyxcbiAgICAgICAgJ29uQ2VsbE1lbnVJdGVtJyxcbiAgICAgICAgJ29uQ2VsbE1lbnVTaG93JyxcbiAgICAgICAgJ29uQ2VsbE1lbnVUb2dnbGVJdGVtJyxcbiAgICAgICAgJ29uQ29sbGFwc2UnLFxuICAgICAgICAnb25Db2x1bW5Db2xsYXBzZScsXG4gICAgICAgICdvbkNvbHVtbkRyYWcnLFxuICAgICAgICAnb25Db2x1bW5EcmFnQWJvcnQnLFxuICAgICAgICAnb25Db2x1bW5EcmFnRW5kJyxcbiAgICAgICAgJ29uQ29sdW1uRHJhZ1N0YXJ0JyxcbiAgICAgICAgJ29uQ29sdW1uRHJvcCcsXG4gICAgICAgICdvbkNvbHVtbkV4cGFuZCcsXG4gICAgICAgICdvbkNvbHVtbkZpbHRlckhpZGUnLFxuICAgICAgICAnb25Db2x1bW5GaWx0ZXJTaG93JyxcbiAgICAgICAgJ29uQ29sdW1uRmlsdGVyVG9nZ2xlJyxcbiAgICAgICAgJ29uQ29sdW1uSGVhZGVyQ2xpY2snLFxuICAgICAgICAnb25Db2x1bW5IZWFkZXJDb250ZXh0TWVudScsXG4gICAgICAgICdvbkNvbHVtbkhlYWRlckRibENsaWNrJyxcbiAgICAgICAgJ29uQ29sdW1uSGVhZGVyTWVudUJlZm9yZVNob3cnLFxuICAgICAgICAnb25Db2x1bW5SZXNpemUnLFxuICAgICAgICAnb25Db2x1bW5SZXNpemVTdGFydCcsXG4gICAgICAgICdvbkNvbHVtblRpdGxlQ2xpY2snLFxuICAgICAgICAnb25Db2x1bW5UaXRsZUNvbnRleHRNZW51JyxcbiAgICAgICAgJ29uQ29sdW1uVGl0bGVEYmxDbGljaycsXG4gICAgICAgICdvbkNvbHVtblRvZ2dsZScsXG4gICAgICAgICdvbkRlc3Ryb3knLFxuICAgICAgICAnb25EaXJ0eVN0YXRlQ2hhbmdlJyxcbiAgICAgICAgJ29uRWxlbWVudENyZWF0ZWQnLFxuICAgICAgICAnb25FeHBhbmQnLFxuICAgICAgICAnb25Gb2N1c0luJyxcbiAgICAgICAgJ29uRm9jdXNPdXQnLFxuICAgICAgICAnb25IaWRlJyxcbiAgICAgICAgJ29uUGFpbnQnLFxuICAgICAgICAnb25SZWFkT25seScsXG4gICAgICAgICdvblJlY29tcG9zZScsXG4gICAgICAgICdvblJlbW92ZVRhc2tFbGVtZW50JyxcbiAgICAgICAgJ29uUmVuZGVyVGFzaycsXG4gICAgICAgICdvblJlbmRlclRhc2tzJyxcbiAgICAgICAgJ29uUmVzaXplJyxcbiAgICAgICAgJ29uUmVzcG9uc2l2ZVN0YXRlQ2hhbmdlJyxcbiAgICAgICAgJ29uU2VsZWN0aW9uQ2hhbmdlJyxcbiAgICAgICAgJ29uU2hvdycsXG4gICAgICAgICdvblNpbXBsZVRhc2tFZGl0Q2FuY2VsJyxcbiAgICAgICAgJ29uU2ltcGxlVGFza0VkaXRDb21wbGV0ZScsXG4gICAgICAgICdvblN3aW1sYW5lQ29sbGFwc2UnLFxuICAgICAgICAnb25Td2ltbGFuZUV4cGFuZCcsXG4gICAgICAgICdvblN3aW1sYW5lSGVhZGVyQ2xpY2snLFxuICAgICAgICAnb25Td2ltbGFuZUhlYWRlckNvbnRleHRNZW51JyxcbiAgICAgICAgJ29uU3dpbWxhbmVIZWFkZXJEYmxDbGljaycsXG4gICAgICAgICdvblN3aW1sYW5lVG9nZ2xlJyxcbiAgICAgICAgJ29uVGFza0NsaWNrJyxcbiAgICAgICAgJ29uVGFza0RibENsaWNrJyxcbiAgICAgICAgJ29uVGFza0RyYWcnLFxuICAgICAgICAnb25UYXNrRHJhZ0Fib3J0JyxcbiAgICAgICAgJ29uVGFza0RyYWdFbmQnLFxuICAgICAgICAnb25UYXNrRHJhZ1N0YXJ0JyxcbiAgICAgICAgJ29uVGFza0Ryb3AnLFxuICAgICAgICAnb25UYXNrTWVudUJlZm9yZVNob3cnLFxuICAgICAgICAnb25UYXNrTWVudUl0ZW0nLFxuICAgICAgICAnb25UYXNrTWVudVNob3cnLFxuICAgICAgICAnb25UYXNrTWVudVRvZ2dsZUl0ZW0nLFxuICAgICAgICAnb25UYXNrTW91c2VFbnRlcicsXG4gICAgICAgICdvblRhc2tNb3VzZUxlYXZlJyxcbiAgICAgICAgJ29uVG9vbENsaWNrJ1xuICAgIF07XG5cbiAgICBwcml2YXRlIHN0YXRpYyBicnludHVtRmVhdHVyZU5hbWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgJ2NvbHVtbkRyYWdGZWF0dXJlJyxcbiAgICAgICAgJ2NvbHVtbkZpbHRlckZlYXR1cmUnLFxuICAgICAgICAnY29sdW1uSGVhZGVyTWVudUZlYXR1cmUnLFxuICAgICAgICAnY29sdW1uTG9ja0ZlYXR1cmUnLFxuICAgICAgICAnY29sdW1uUmVuYW1lRmVhdHVyZScsXG4gICAgICAgICdjb2x1bW5SZXNpemVGZWF0dXJlJyxcbiAgICAgICAgJ2NvbHVtblNvcnRGZWF0dXJlJyxcbiAgICAgICAgJ2NvbHVtblRvb2xiYXJzRmVhdHVyZScsXG4gICAgICAgICdmaWx0ZXJCYXJGZWF0dXJlJyxcbiAgICAgICAgJ3NpbXBsZVRhc2tFZGl0RmVhdHVyZScsXG4gICAgICAgICdzd2ltbGFuZURyYWdGZWF0dXJlJyxcbiAgICAgICAgJ3Rhc2tEcmFnRmVhdHVyZScsXG4gICAgICAgICd0YXNrRHJhZ1NlbGVjdEZlYXR1cmUnLFxuICAgICAgICAndGFza0VkaXRGZWF0dXJlJyxcbiAgICAgICAgJ3Rhc2tNZW51RmVhdHVyZScsXG4gICAgICAgICd0YXNrVG9vbHRpcEZlYXR1cmUnXG4gICAgXTtcblxuICAgIHByaXZhdGUgc3RhdGljIGJyeW50dW1Db25maWdzOiBzdHJpbmdbXSA9IEJyeW50dW1UYXNrQm9hcmRCYXNlQ29tcG9uZW50LmJyeW50dW1GZWF0dXJlTmFtZXMuY29uY2F0KFtcbiAgICAgICAgJ2FjdGl2YXRlVGFza0V2ZW50JyxcbiAgICAgICAgJ2Fkb3B0JyxcbiAgICAgICAgJ2FsaWduJyxcbiAgICAgICAgJ2FsaWduU2VsZicsXG4gICAgICAgICdhbmNob3InLFxuICAgICAgICAnYXBwZW5kVG8nLFxuICAgICAgICAnYXJpYURlc2NyaXB0aW9uJyxcbiAgICAgICAgJ2FyaWFMYWJlbCcsXG4gICAgICAgICdhc3NpZ25tZW50cycsXG4gICAgICAgICdhdXRvR2VuZXJhdGVDb2x1bW5zJyxcbiAgICAgICAgJ2F1dG9HZW5lcmF0ZVN3aW1sYW5lcycsXG4gICAgICAgICdiYmFyJyxcbiAgICAgICAgJ2JvZHlDbHMnLFxuICAgICAgICAnYm9keUl0ZW1zJyxcbiAgICAgICAgJ2J1YmJsZUV2ZW50cycsXG4gICAgICAgICdjYWxsT25GdW5jdGlvbnMnLFxuICAgICAgICAnY2FyZFNpemVzJyxcbiAgICAgICAgJ2NhdGNoRXZlbnRIYW5kbGVyRXhjZXB0aW9ucycsXG4gICAgICAgICdjZW50ZXJlZCcsXG4gICAgICAgICdjaGFpbkZpbHRlcnMnLFxuICAgICAgICAnY2xzJyxcbiAgICAgICAgJ2NvbGxhcHNlZCcsXG4gICAgICAgICdjb2xsYXBzZVRpdGxlJyxcbiAgICAgICAgJ2NvbGxhcHNpYmxlJyxcbiAgICAgICAgJ2NvbG9yJyxcbiAgICAgICAgJ2NvbHVtbicsXG4gICAgICAgICdjb2x1bW5GaWVsZCcsXG4gICAgICAgICdjb2x1bW5zJyxcbiAgICAgICAgJ2NvbHVtblRpdGxlUmVuZGVyZXInLFxuICAgICAgICAnY29uZmlnJyxcbiAgICAgICAgJ2NvbnN0cmFpblRvJyxcbiAgICAgICAgJ2NzcycsXG4gICAgICAgICdjc3NWYXJQcmVmaXgnLFxuICAgICAgICAnZGF0YUZpZWxkJyxcbiAgICAgICAgJ2RhdGFzZXQnLFxuICAgICAgICAnZGV0ZWN0Q1NTQ29tcGF0aWJpbGl0eUlzc3VlcycsXG4gICAgICAgICdkaXNhYmxlZCcsXG4gICAgICAgICdkb2NrJyxcbiAgICAgICAgJ2RyYWdnYWJsZScsXG4gICAgICAgICdkcmF3ZXInLFxuICAgICAgICAnZHJhd09uU2Nyb2xsJyxcbiAgICAgICAgJ2VsZW1lbnRBdHRyaWJ1dGVzJyxcbiAgICAgICAgJ2V4dHJhRGF0YScsXG4gICAgICAgICdmbGV4JyxcbiAgICAgICAgJ2Zsb2F0aW5nJyxcbiAgICAgICAgJ2Zvb3RlcicsXG4gICAgICAgICdmb290ZXJJdGVtcycsXG4gICAgICAgICdnZXRUYXNrSGVpZ2h0JyxcbiAgICAgICAgJ2hlYWRlcicsXG4gICAgICAgICdoZWFkZXJJdGVtcycsXG4gICAgICAgICdoZWlnaHQnLFxuICAgICAgICAnaGlkZGVuJyxcbiAgICAgICAgJ2hpZGVBbmltYXRpb24nLFxuICAgICAgICAnaHRtbEVuY29kZUhlYWRlclRleHQnLFxuICAgICAgICAnaWNvbicsXG4gICAgICAgICdpZCcsXG4gICAgICAgICdpZ25vcmVQYXJlbnRSZWFkT25seScsXG4gICAgICAgICdpbnB1dEZpZWxkQWxpZ24nLFxuICAgICAgICAnaW5zZXJ0QmVmb3JlJyxcbiAgICAgICAgJ2luc2VydEZpcnN0JyxcbiAgICAgICAgJ2lzVGFza1NlbGVjdGFibGUnLFxuICAgICAgICAna2V5TWFwJyxcbiAgICAgICAgJ2xhYmVsUG9zaXRpb24nLFxuICAgICAgICAnbGlzdGVuZXJzJyxcbiAgICAgICAgJ2xvYWRNYXNrJyxcbiAgICAgICAgJ2xvYWRNYXNrRGVmYXVsdHMnLFxuICAgICAgICAnbG9hZE1hc2tFcnJvcicsXG4gICAgICAgICdsb2NhbGVDbGFzcycsXG4gICAgICAgICdsb2NhbGl6YWJsZScsXG4gICAgICAgICdsb2NhbGl6YWJsZVByb3BlcnRpZXMnLFxuICAgICAgICAnbWFyZ2luJyxcbiAgICAgICAgJ21hc2tEZWZhdWx0cycsXG4gICAgICAgICdtYXNrZWQnLFxuICAgICAgICAnbWF4SGVpZ2h0JyxcbiAgICAgICAgJ21heGltaXplT25Nb2JpbGUnLFxuICAgICAgICAnbWF4V2lkdGgnLFxuICAgICAgICAnbWluSGVpZ2h0JyxcbiAgICAgICAgJ21pbldpZHRoJyxcbiAgICAgICAgJ25ld1Rhc2tEZWZhdWx0cycsXG4gICAgICAgICdvd25lcicsXG4gICAgICAgICdwbHVnaW5zJyxcbiAgICAgICAgJ3Bvc2l0aW9uZWQnLFxuICAgICAgICAncHJvY2Vzc0l0ZW1zJyxcbiAgICAgICAgJ3Byb2plY3QnLFxuICAgICAgICAncmVhZE9ubHknLFxuICAgICAgICAncmVjb3JkJyxcbiAgICAgICAgJ3JlbGF5U3RvcmVFdmVudHMnLFxuICAgICAgICAncmVuZGl0aW9uJyxcbiAgICAgICAgJ3Jlc291cmNlSW1hZ2VQYXRoJyxcbiAgICAgICAgJ3Jlc291cmNlcycsXG4gICAgICAgICdyZXNwb25zaXZlJyxcbiAgICAgICAgJ3Jlc3BvbnNpdmVSb290JyxcbiAgICAgICAgJ3Jlc3BvbnNpdmVTdGF0ZScsXG4gICAgICAgICdyZXNwb25zaXZlVGFyZ2V0JyxcbiAgICAgICAgJ3Jvb3RFbGVtZW50JyxcbiAgICAgICAgJ3J0bCcsXG4gICAgICAgICdzY3JvbGxhYmxlJyxcbiAgICAgICAgJ3Njcm9sbEFjdGlvbicsXG4gICAgICAgICdzY3JvbGxNYW5hZ2VyJyxcbiAgICAgICAgJ3Njcm9sbE9wdGlvbnMnLFxuICAgICAgICAnc2VsZWN0ZWRUYXNrcycsXG4gICAgICAgICdzZWxlY3RPbk5hdmlnYXRpb24nLFxuICAgICAgICAnc2hvd0FuaW1hdGlvbicsXG4gICAgICAgICdzaG93Q29sbGFwc2VJbkhlYWRlcicsXG4gICAgICAgICdzaG93Q29sbGFwc2VUb29sdGlwJyxcbiAgICAgICAgJ3Nob3dDb3VudEluSGVhZGVyJyxcbiAgICAgICAgJ3NwYW4nLFxuICAgICAgICAnc3RhdGVmdWwnLFxuICAgICAgICAnc3RhdGVmdWxFdmVudHMnLFxuICAgICAgICAnc3RhdGVJZCcsXG4gICAgICAgICdzdGF0ZVByb3ZpZGVyJyxcbiAgICAgICAgJ3N0aWNreUhlYWRlcnMnLFxuICAgICAgICAnc3RyZXRjaENhcmRzJyxcbiAgICAgICAgJ3N0cmljdFJlY29yZE1hcHBpbmcnLFxuICAgICAgICAnc3RyaXBzJyxcbiAgICAgICAgJ3N3aW1sYW5lRmllbGQnLFxuICAgICAgICAnc3dpbWxhbmVSZW5kZXJlcicsXG4gICAgICAgICdzd2ltbGFuZXMnLFxuICAgICAgICAnc3luY01hc2snLFxuICAgICAgICAndGFiJyxcbiAgICAgICAgJ3RhYkJhckl0ZW1zJyxcbiAgICAgICAgJ3Rhc2tSZW5kZXJlcicsXG4gICAgICAgICd0YXNrcycsXG4gICAgICAgICd0YXNrU29ydGVyRm4nLFxuICAgICAgICAndGFza3NQZXJSb3cnLFxuICAgICAgICAndGJhcicsXG4gICAgICAgICd0aXRsZScsXG4gICAgICAgICd0b29scycsXG4gICAgICAgICd1aScsXG4gICAgICAgICd1c2VEb21UcmFuc2l0aW9uJyxcbiAgICAgICAgJ3ZpcnR1YWxpemUnLFxuICAgICAgICAnd2VpZ2h0JyxcbiAgICAgICAgJ3dpZHRoJyxcbiAgICAgICAgJ3gnLFxuICAgICAgICAneSdcbiAgICBdKTtcblxuICAgIHByaXZhdGUgc3RhdGljIGJyeW50dW1Db25maWdzT25seTogc3RyaW5nW10gPSBbXG4gICAgICAgICdhY3RpdmF0ZVRhc2tFdmVudCcsXG4gICAgICAgICdhZG9wdCcsXG4gICAgICAgICdhbGlnbicsXG4gICAgICAgICdhbmNob3InLFxuICAgICAgICAnYXJpYURlc2NyaXB0aW9uJyxcbiAgICAgICAgJ2FyaWFMYWJlbCcsXG4gICAgICAgICdhdXRvR2VuZXJhdGVDb2x1bW5zJyxcbiAgICAgICAgJ2F1dG9HZW5lcmF0ZVN3aW1sYW5lcycsXG4gICAgICAgICdiYmFyJyxcbiAgICAgICAgJ2JvZHlDbHMnLFxuICAgICAgICAnYnViYmxlRXZlbnRzJyxcbiAgICAgICAgJ2NhcmRTaXplcycsXG4gICAgICAgICdjZW50ZXJlZCcsXG4gICAgICAgICdjaGFpbkZpbHRlcnMnLFxuICAgICAgICAnY29sbGFwc2VUaXRsZScsXG4gICAgICAgICdjb2xsYXBzaWJsZScsXG4gICAgICAgICdjb2xvcicsXG4gICAgICAgICdjb2x1bW5UaXRsZVJlbmRlcmVyJyxcbiAgICAgICAgJ2NvbmZpZycsXG4gICAgICAgICdjb25zdHJhaW5UbycsXG4gICAgICAgICdjc3NWYXJQcmVmaXgnLFxuICAgICAgICAnZGF0YUZpZWxkJyxcbiAgICAgICAgJ2RldGVjdENTU0NvbXBhdGliaWxpdHlJc3N1ZXMnLFxuICAgICAgICAnZG9jaycsXG4gICAgICAgICdkcmFnZ2FibGUnLFxuICAgICAgICAnZHJhd2VyJyxcbiAgICAgICAgJ2VsZW1lbnRBdHRyaWJ1dGVzJyxcbiAgICAgICAgJ2Zsb2F0aW5nJyxcbiAgICAgICAgJ2Zvb3RlcicsXG4gICAgICAgICdoZWFkZXInLFxuICAgICAgICAnaGlkZUFuaW1hdGlvbicsXG4gICAgICAgICdodG1sRW5jb2RlSGVhZGVyVGV4dCcsXG4gICAgICAgICdpY29uJyxcbiAgICAgICAgJ2lnbm9yZVBhcmVudFJlYWRPbmx5JyxcbiAgICAgICAgJ2xpc3RlbmVycycsXG4gICAgICAgICdsb2FkTWFzaycsXG4gICAgICAgICdsb2FkTWFza0RlZmF1bHRzJyxcbiAgICAgICAgJ2xvYWRNYXNrRXJyb3InLFxuICAgICAgICAnbG9jYWxlQ2xhc3MnLFxuICAgICAgICAnbG9jYWxpemFibGUnLFxuICAgICAgICAnbG9jYWxpemFibGVQcm9wZXJ0aWVzJyxcbiAgICAgICAgJ21hc2tEZWZhdWx0cycsXG4gICAgICAgICdtYXNrZWQnLFxuICAgICAgICAnbmV3VGFza0RlZmF1bHRzJyxcbiAgICAgICAgJ293bmVyJyxcbiAgICAgICAgJ3BsdWdpbnMnLFxuICAgICAgICAncG9zaXRpb25lZCcsXG4gICAgICAgICdwcm9jZXNzSXRlbXMnLFxuICAgICAgICAncmVjb3JkJyxcbiAgICAgICAgJ3JlbGF5U3RvcmVFdmVudHMnLFxuICAgICAgICAncmVzb3VyY2VJbWFnZVBhdGgnLFxuICAgICAgICAncmVzcG9uc2l2ZScsXG4gICAgICAgICdyZXNwb25zaXZlUm9vdCcsXG4gICAgICAgICdyZXNwb25zaXZlU3RhdGUnLFxuICAgICAgICAncmVzcG9uc2l2ZVRhcmdldCcsXG4gICAgICAgICdyb290RWxlbWVudCcsXG4gICAgICAgICdzY3JvbGxhYmxlJyxcbiAgICAgICAgJ3Njcm9sbEFjdGlvbicsXG4gICAgICAgICdzY3JvbGxNYW5hZ2VyJyxcbiAgICAgICAgJ3Njcm9sbE9wdGlvbnMnLFxuICAgICAgICAnc2VsZWN0T25OYXZpZ2F0aW9uJyxcbiAgICAgICAgJ3Nob3dBbmltYXRpb24nLFxuICAgICAgICAnc2hvd0NvbGxhcHNlSW5IZWFkZXInLFxuICAgICAgICAnc2hvd0NvdW50SW5IZWFkZXInLFxuICAgICAgICAnc3RhdGVmdWwnLFxuICAgICAgICAnc3RhdGVmdWxFdmVudHMnLFxuICAgICAgICAnc3RhdGVJZCcsXG4gICAgICAgICdzdGF0ZVByb3ZpZGVyJyxcbiAgICAgICAgJ3N0aWNreUhlYWRlcnMnLFxuICAgICAgICAnc3RyaXBzJyxcbiAgICAgICAgJ3N3aW1sYW5lUmVuZGVyZXInLFxuICAgICAgICAnc3luY01hc2snLFxuICAgICAgICAndGFiJyxcbiAgICAgICAgJ3RhYkJhckl0ZW1zJyxcbiAgICAgICAgJ3Rhc2tSZW5kZXJlcicsXG4gICAgICAgICd0YXNrU29ydGVyRm4nLFxuICAgICAgICAndGFza3NQZXJSb3cnLFxuICAgICAgICAndGJhcicsXG4gICAgICAgICd1aScsXG4gICAgICAgICd1c2VEb21UcmFuc2l0aW9uJyxcbiAgICAgICAgJ3dlaWdodCdcbiAgICBdO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnJ5bnR1bVByb3BzOiBzdHJpbmdbXSA9IEJyeW50dW1UYXNrQm9hcmRCYXNlQ29tcG9uZW50LmJyeW50dW1GZWF0dXJlTmFtZXMuY29uY2F0KFtcbiAgICAgICAgJ2FsaWduU2VsZicsXG4gICAgICAgICdhbmNob3JTaXplJyxcbiAgICAgICAgJ2FwcGVuZFRvJyxcbiAgICAgICAgJ2Fzc2lnbm1lbnRzJyxcbiAgICAgICAgJ2JvZHlJdGVtcycsXG4gICAgICAgICdjYWxsT25GdW5jdGlvbnMnLFxuICAgICAgICAnY2F0Y2hFdmVudEhhbmRsZXJFeGNlcHRpb25zJyxcbiAgICAgICAgJ2NscycsXG4gICAgICAgICdjb2xsYXBzZWQnLFxuICAgICAgICAnY29sdW1uJyxcbiAgICAgICAgJ2NvbHVtbkZpZWxkJyxcbiAgICAgICAgJ2NvbHVtbnMnLFxuICAgICAgICAnY3NzJyxcbiAgICAgICAgJ2RhdGFzZXQnLFxuICAgICAgICAnZGlzYWJsZWQnLFxuICAgICAgICAnZHJhd09uU2Nyb2xsJyxcbiAgICAgICAgJ2V4dHJhRGF0YScsXG4gICAgICAgICdmbGV4JyxcbiAgICAgICAgJ2ZvY3VzVmlzaWJsZScsXG4gICAgICAgICdmb290ZXJJdGVtcycsXG4gICAgICAgICdnZXRUYXNrSGVpZ2h0JyxcbiAgICAgICAgJ2hhc0NoYW5nZXMnLFxuICAgICAgICAnaGVhZGVySXRlbXMnLFxuICAgICAgICAnaGVpZ2h0JyxcbiAgICAgICAgJ2hpZGRlbicsXG4gICAgICAgICdpZCcsXG4gICAgICAgICdpbnB1dEZpZWxkQWxpZ24nLFxuICAgICAgICAnaW5zZXJ0QmVmb3JlJyxcbiAgICAgICAgJ2luc2VydEZpcnN0JyxcbiAgICAgICAgJ2lzVGFza1NlbGVjdGFibGUnLFxuICAgICAgICAna2V5TWFwJyxcbiAgICAgICAgJ2xhYmVsUG9zaXRpb24nLFxuICAgICAgICAnbWFyZ2luJyxcbiAgICAgICAgJ21heEhlaWdodCcsXG4gICAgICAgICdtYXhpbWl6ZU9uTW9iaWxlJyxcbiAgICAgICAgJ21heFdpZHRoJyxcbiAgICAgICAgJ21pbkhlaWdodCcsXG4gICAgICAgICdtaW5XaWR0aCcsXG4gICAgICAgICdwYXJlbnQnLFxuICAgICAgICAncHJvamVjdCcsXG4gICAgICAgICdyZWFkT25seScsXG4gICAgICAgICdyZW5kaXRpb24nLFxuICAgICAgICAncmVzb3VyY2VzJyxcbiAgICAgICAgJ3J0bCcsXG4gICAgICAgICdzZWxlY3RlZFRhc2tzJyxcbiAgICAgICAgJ3Nob3dDb2xsYXBzZVRvb2x0aXAnLFxuICAgICAgICAnc3BhbicsXG4gICAgICAgICdzdGF0ZScsXG4gICAgICAgICdzdHJldGNoQ2FyZHMnLFxuICAgICAgICAnc3RyaWN0UmVjb3JkTWFwcGluZycsXG4gICAgICAgICdzd2ltbGFuZUZpZWxkJyxcbiAgICAgICAgJ3N3aW1sYW5lcycsXG4gICAgICAgICd0YXNrcycsXG4gICAgICAgICd0aXRsZScsXG4gICAgICAgICd0b29scycsXG4gICAgICAgICd2aXJ0dWFsaXplJyxcbiAgICAgICAgJ3dpZHRoJyxcbiAgICAgICAgJ3gnLFxuICAgICAgICAneSdcbiAgICBdKTtcblxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZjtcbiAgICBwdWJsaWMgaW5zdGFuY2UhOiBUYXNrQm9hcmRCYXNlO1xuXG4gICAgcHJpdmF0ZSBicnludHVtQ29uZmlnID0ge1xuICAgICAgICBhZG9wdCAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBhcHBlbmRUbyAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBocmVmICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBhbmd1bGFyQ29tcG9uZW50IDogdGhpcyxcbiAgICAgICAgZmVhdHVyZXMgICAgICAgICA6IHt9LFxuICAgICAgICBsaXN0ZW5lcnMgICAgICAgIDoge31cbiAgICB9O1xuXG4gICAgY29uc3RydWN0b3IoZWxlbWVudDogRWxlbWVudFJlZikge1xuICAgICAgICB0aGlzLmVsZW1lbnRSZWYgPSBlbGVtZW50O1xuICAgIH1cblxuICAgIC8vIENvbmZpZ3Mgb25seVxuICAgIEBJbnB1dCgpIGFjdGl2YXRlVGFza0V2ZW50ICAgICAgICAgICAgISA6ICd0YXNrQ2xpY2snfCd0YXNrRGJsQ2xpY2snfG51bGw7XG4gICAgQElucHV0KCkgYWRvcHQgICAgICAgICAgICAgICAgICAgICAgICAhIDogSFRNTEVsZW1lbnR8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGFsaWduICAgICAgICAgICAgICAgICAgICAgICAgISA6IEFsaWduU3BlY3xzdHJpbmc7XG4gICAgQElucHV0KCkgYW5jaG9yICAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBhcmlhRGVzY3JpcHRpb24gICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgYXJpYUxhYmVsICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGF1dG9HZW5lcmF0ZUNvbHVtbnMgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgYXV0b0dlbmVyYXRlU3dpbWxhbmVzICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBiYmFyICAgICAgICAgICAgICAgICAgICAgICAgICEgOiAoQ29udGFpbmVySXRlbUNvbmZpZ3xzdHJpbmcpW118VG9vbGJhckNvbmZpZ3xQYWdpbmdUb29sYmFyQ29uZmlnfG51bGw7XG4gICAgQElucHV0KCkgYm9keUNscyAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfG9iamVjdDtcbiAgICBASW5wdXQoKSBidWJibGVFdmVudHMgICAgICAgICAgICAgICAgICEgOiBvYmplY3Q7XG4gICAgQElucHV0KCkgY2FyZFNpemVzICAgICAgICAgICAgICAgICAgICAhIDogQ2FyZFNpemU7XG4gICAgQElucHV0KCkgY2VudGVyZWQgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBjaGFpbkZpbHRlcnMgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGNvbGxhcHNlVGl0bGUgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgY29sbGFwc2libGUgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbnxQYW5lbENvbGxhcHNlckNvbmZpZ3xQYW5lbENvbGxhcHNlck92ZXJsYXlDb25maWc7XG4gICAgQElucHV0KCkgY29sb3IgICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGNvbHVtblRpdGxlUmVuZGVyZXIgICAgICAgICAgISA6IChyZW5kZXJEYXRhOiBvYmplY3QsIGNvbHVtblJlY29yZDogQ29sdW1uTW9kZWwpID0+IHN0cmluZ3xEb21Db25maWc7XG4gICAgQElucHV0KCkgY29uZmlnICAgICAgICAgICAgICAgICAgICAgICAhIDogb2JqZWN0O1xuICAgIEBJbnB1dCgpIGNvbnN0cmFpblRvICAgICAgICAgICAgICAgICAgISA6IEhUTUxFbGVtZW50fFdpZGdldHxSZWN0YW5nbGU7XG4gICAgQElucHV0KCkgY3NzVmFyUHJlZml4ICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGRhdGFGaWVsZCAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBkZXRlY3RDU1NDb21wYXRpYmlsaXR5SXNzdWVzICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGRvY2sgICAgICAgICAgICAgICAgICAgICAgICAgISA6ICd0b3AnfCdib3R0b20nfCdsZWZ0J3wncmlnaHQnfCdzdGFydCd8J2VuZCd8J2hlYWRlcid8J3ByZS1oZWFkZXInfG9iamVjdDtcbiAgICBASW5wdXQoKSBkcmFnZ2FibGUgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFufHtcbiAgICAgICAgaGFuZGxlU2VsZWN0b3I/OiBzdHJpbmdcbiAgICB9O1xuICAgIEBJbnB1dCgpIGRyYXdlciAgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58e3NpZGU/OiAnc3RhcnQnfCdsZWZ0J3wnZW5kJ3wncmlnaHQnfCd0b3AnfCdib3R0b20nLCBzaXplPzogc3RyaW5nfG51bWJlciwgaW5saW5lPzogYm9vbGVhbiwgYXV0b0Nsb3NlOiB7IG1vdXNlZG93bj86IGJvb2xlYW58c3RyaW5nLCBmb2N1c291dD86IGJvb2xlYW58c3RyaW5nLCBtb3VzZW91dD86IHN0cmluZyB9LCBhdXRvQ2xvc2VEZWxheT86IG51bWJlcn07XG4gICAgQElucHV0KCkgZWxlbWVudEF0dHJpYnV0ZXMgICAgICAgICAgICAhIDogUmVjb3JkPHN0cmluZywgc3RyaW5nfG51bGw+O1xuICAgIEBJbnB1dCgpIGZsb2F0aW5nICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZm9vdGVyICAgICAgICAgICAgICAgICAgICAgICAhIDoge1xuICAgICAgICBkb2NrPzogJ3RvcCd8J3JpZ2h0J3wnYm90dG9tJ3wnbGVmdCd8J3N0YXJ0J3wnZW5kJ1xuICAgICAgICBodG1sPzogc3RyaW5nXG4gICAgICAgIGNscz86IHN0cmluZ1xuICAgIH18c3RyaW5nO1xuICAgIEBJbnB1dCgpIGhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xib29sZWFufFBhbmVsSGVhZGVyO1xuICAgIEBJbnB1dCgpIGhpZGVBbmltYXRpb24gICAgICAgICAgICAgICAgISA6IGJvb2xlYW58b2JqZWN0O1xuICAgIEBJbnB1dCgpIGh0bWxFbmNvZGVIZWFkZXJUZXh0ICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaWNvbiAgICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfERvbUNvbmZpZztcbiAgICBASW5wdXQoKSBpZ25vcmVQYXJlbnRSZWFkT25seSAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGxpc3RlbmVycyAgICAgICAgICAgICAgICAgICAgISA6IFRhc2tCb2FyZEJhc2VMaXN0ZW5lcnM7XG4gICAgQElucHV0KCkgbG9hZE1hc2sgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfE1hc2tDb25maWd8bnVsbDtcbiAgICBASW5wdXQoKSBsb2FkTWFza0RlZmF1bHRzICAgICAgICAgICAgICEgOiBNYXNrQ29uZmlnO1xuICAgIEBJbnB1dCgpIGxvYWRNYXNrRXJyb3IgICAgICAgICAgICAgICAgISA6IE1hc2tDb25maWd8TWFza3xib29sZWFuO1xuICAgIEBJbnB1dCgpIGxvY2FsZUNsYXNzICAgICAgICAgICAgICAgICAgISA6IHR5cGVvZiBCYXNlO1xuICAgIEBJbnB1dCgpIGxvY2FsaXphYmxlICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgbG9jYWxpemFibGVQcm9wZXJ0aWVzICAgICAgICAhIDogc3RyaW5nW107XG4gICAgQElucHV0KCkgbWFza0RlZmF1bHRzICAgICAgICAgICAgICAgICAhIDogTWFza0NvbmZpZztcbiAgICBASW5wdXQoKSBtYXNrZWQgICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFufHN0cmluZ3xNYXNrQ29uZmlnO1xuICAgIEBJbnB1dCgpIG5ld1Rhc2tEZWZhdWx0cyAgICAgICAgICAgICAgISA6IFRhc2tNb2RlbENvbmZpZztcbiAgICBASW5wdXQoKSBvd25lciAgICAgICAgICAgICAgICAgICAgICAgICEgOiBXaWRnZXR8YW55O1xuICAgIEBJbnB1dCgpIHBsdWdpbnMgICAgICAgICAgICAgICAgICAgICAgISA6IEZ1bmN0aW9uW107XG4gICAgQElucHV0KCkgcG9zaXRpb25lZCAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBwcm9jZXNzSXRlbXMgICAgICAgICAgICAgICAgICEgOiAoY29udGV4dDogeyBoZWFkZXJJdGVtczogUmVjb3JkPHN0cmluZywgVGFza0l0ZW1PcHRpb25zPiwgYm9keUl0ZW1zOiBSZWNvcmQ8c3RyaW5nLCBUYXNrSXRlbU9wdGlvbnM+LCBmb290ZXJJdGVtczogUmVjb3JkPHN0cmluZywgVGFza0l0ZW1PcHRpb25zPiwgdGFza1JlY29yZDogVGFza01vZGVsIH0pID0+IGJvb2xlYW58dm9pZDtcbiAgICBASW5wdXQoKSByZWNvcmQgICAgICAgICAgICAgICAgICAgICAgICEgOiBNb2RlbDtcbiAgICBASW5wdXQoKSByZWxheVN0b3JlRXZlbnRzICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHJlc291cmNlSW1hZ2VQYXRoICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSByZXNwb25zaXZlICAgICAgICAgICAgICAgICAgICEgOiBvYmplY3Q7XG4gICAgQElucHV0KCkgcmVzcG9uc2l2ZVJvb3QgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSByZXNwb25zaXZlU3RhdGUgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgcmVzcG9uc2l2ZVRhcmdldCAgICAgICAgICAgICAhIDogc3RyaW5nfFdpZGdldDtcbiAgICBASW5wdXQoKSByb290RWxlbWVudCAgICAgICAgICAgICAgICAgICEgOiBTaGFkb3dSb290fEhUTUxFbGVtZW50O1xuICAgIEBJbnB1dCgpIHNjcm9sbGFibGUgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58U2Nyb2xsZXJDb25maWd8U2Nyb2xsZXI7XG4gICAgQElucHV0KCkgc2Nyb2xsQWN0aW9uICAgICAgICAgICAgICAgICAhIDogJ2hpZGUnfCdyZWFsaWduJ3xudWxsO1xuICAgIEBJbnB1dCgpIHNjcm9sbE1hbmFnZXIgICAgICAgICAgICAgICAgISA6IFNjcm9sbE1hbmFnZXJDb25maWc7XG4gICAgQElucHV0KCkgc2Nyb2xsT3B0aW9ucyAgICAgICAgICAgICAgICAhIDogQnJ5bnR1bVNjcm9sbE9wdGlvbnM7XG4gICAgQElucHV0KCkgc2VsZWN0T25OYXZpZ2F0aW9uICAgICAgICAgICAhIDogYm9vbGVhbnxzdHJpbmc7XG4gICAgQElucHV0KCkgc2hvd0FuaW1hdGlvbiAgICAgICAgICAgICAgICAhIDogYm9vbGVhbnxvYmplY3Q7XG4gICAgQElucHV0KCkgc2hvd0NvbGxhcHNlSW5IZWFkZXIgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBzaG93Q291bnRJbkhlYWRlciAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHN0YXRlZnVsICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58b2JqZWN0fHN0cmluZ1tdO1xuICAgIEBJbnB1dCgpIHN0YXRlZnVsRXZlbnRzICAgICAgICAgICAgICAgISA6IG9iamVjdHxzdHJpbmdbXTtcbiAgICBASW5wdXQoKSBzdGF0ZUlkICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgc3RhdGVQcm92aWRlciAgICAgICAgICAgICAgICAhIDogU3RhdGVQcm92aWRlcjtcbiAgICBASW5wdXQoKSBzdGlja3lIZWFkZXJzICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHN0cmlwcyAgICAgICAgICAgICAgICAgICAgICAgISA6IFJlY29yZDxzdHJpbmcsIENvbnRhaW5lckl0ZW1Db25maWc+O1xuICAgIEBJbnB1dCgpIHN3aW1sYW5lUmVuZGVyZXIgICAgICAgICAgICAgISA6IChkZXRhaWw6IHsgc3dpbWxhbmVSZWNvcmQ6IFN3aW1sYW5lTW9kZWwsIHN3aW1sYW5lQ29uZmlnOiBEb21Db25maWcgfSkgPT4gdm9pZDtcbiAgICBASW5wdXQoKSBzeW5jTWFzayAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8b2JqZWN0fG51bGw7XG4gICAgQElucHV0KCkgdGFiICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbnxUYWJDb25maWc7XG4gICAgQElucHV0KCkgdGFiQmFySXRlbXMgICAgICAgICAgICAgICAgICAhIDogVG9vbGJhckl0ZW1zW118V2lkZ2V0W107XG4gICAgQElucHV0KCkgdGFza1JlbmRlcmVyICAgICAgICAgICAgICAgICAhIDogKGRldGFpbDogeyB0YXNrUmVjb3JkOiBUYXNrTW9kZWwsIGNvbHVtblJlY29yZDogQ29sdW1uTW9kZWwsIHN3aW1sYW5lUmVjb3JkOiBTd2ltbGFuZU1vZGVsLCBjYXJkQ29uZmlnOiBEb21Db25maWcgfSkgPT4gdm9pZDtcbiAgICBASW5wdXQoKSB0YXNrU29ydGVyRm4gICAgICAgICAgICAgICAgICEgOiBib29sZWFufCgoZmlyc3Q6IFRhc2tNb2RlbCwgc2Vjb25kOiBUYXNrTW9kZWwpID0+IG51bWJlcik7XG4gICAgQElucHV0KCkgdGFza3NQZXJSb3cgICAgICAgICAgICAgICAgICAhIDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIHRiYXIgICAgICAgICAgICAgICAgICAgICAgICAgISA6IChDb250YWluZXJJdGVtQ29uZmlnfHN0cmluZylbXXxUb29sYmFyQ29uZmlnfFBhZ2luZ1Rvb2xiYXJDb25maWd8bnVsbDtcbiAgICBASW5wdXQoKSB1aSAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiAncGxhaW4nfCd0b29sYmFyJ3xzdHJpbmd8b2JqZWN0O1xuICAgIEBJbnB1dCgpIHVzZURvbVRyYW5zaXRpb24gICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgd2VpZ2h0ICAgICAgICAgICAgICAgICAgICAgICAhIDogbnVtYmVyO1xuXG4gICAgLy8gQ29uZmlncyBhbmQgcHJvcGVydGllc1xuICAgIEBJbnB1dCgpIGFsaWduU2VsZiAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGFwcGVuZFRvICAgICAgICAgICAgICAgICAgICAhIDogSFRNTEVsZW1lbnR8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGFzc2lnbm1lbnRzICAgICAgICAgICAgICAgICAhIDogQXNzaWdubWVudE1vZGVsW118b2JqZWN0W118QXNzaWdubWVudE1vZGVsQ29uZmlnW107XG4gICAgQElucHV0KCkgYm9keUl0ZW1zICAgICAgICAgICAgICAgICAgICEgOiBSZWNvcmQ8c3RyaW5nLCBUYXNrSXRlbU9wdGlvbnM+O1xuICAgIEBJbnB1dCgpIGNhbGxPbkZ1bmN0aW9ucyAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBjYXRjaEV2ZW50SGFuZGxlckV4Y2VwdGlvbnMgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgY2xzICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8b2JqZWN0O1xuICAgIEBJbnB1dCgpIGNvbGxhcHNlZCAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBjb2x1bW4gICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSBjb2x1bW5GaWVsZCAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBjb2x1bW5zICAgICAgICAgICAgICAgICAgICAgISA6IFN0b3JlfENvbHVtbk1vZGVsW118Q29sdW1uTW9kZWxDb25maWdbXXxzdHJpbmdbXXxzdHJpbmd8U3RvcmVDb25maWc7XG4gICAgQElucHV0KCkgY3NzICAgICAgICAgICAgICAgICAgICAgICAgICEgOiB0eXBlb2YgUHJveHl8UmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICBASW5wdXQoKSBkYXRhc2V0ICAgICAgICAgICAgICAgICAgICAgISA6IG9iamVjdHxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIEBJbnB1dCgpIGRpc2FibGVkICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbnwnaW5lcnQnO1xuICAgIEBJbnB1dCgpIGRyYXdPblNjcm9sbCAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBleHRyYURhdGEgICAgICAgICAgICAgICAgICAgISA6IGFueTtcbiAgICBASW5wdXQoKSBmbGV4ICAgICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcnxzdHJpbmc7XG4gICAgQElucHV0KCkgZm9vdGVySXRlbXMgICAgICAgICAgICAgICAgICEgOiBSZWNvcmQ8c3RyaW5nLCBUYXNrSXRlbU9wdGlvbnM+O1xuICAgIEBJbnB1dCgpIGdldFRhc2tIZWlnaHQgICAgICAgICAgICAgICAhIDogKHRhc2tSZWNvcmQ6IFRhc2tNb2RlbCkgPT4gbnVtYmVyO1xuICAgIEBJbnB1dCgpIGhlYWRlckl0ZW1zICAgICAgICAgICAgICAgICAhIDogUmVjb3JkPHN0cmluZywgVGFza0l0ZW1PcHRpb25zPjtcbiAgICBASW5wdXQoKSBoZWlnaHQgICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcnxzdHJpbmc7XG4gICAgQElucHV0KCkgaGlkZGVuICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGlkICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGlucHV0RmllbGRBbGlnbiAgICAgICAgICAgICAhIDogJ3N0YXJ0J3wnZW5kJztcbiAgICBASW5wdXQoKSBpbnNlcnRCZWZvcmUgICAgICAgICAgICAgICAgISA6IEhUTUxFbGVtZW50fHN0cmluZztcbiAgICBASW5wdXQoKSBpbnNlcnRGaXJzdCAgICAgICAgICAgICAgICAgISA6IEhUTUxFbGVtZW50fHN0cmluZztcbiAgICBASW5wdXQoKSBpc1Rhc2tTZWxlY3RhYmxlICAgICAgICAgICAgISA6ICh0YXNrUmVjb3JkOiBUYXNrTW9kZWwpID0+IGJvb2xlYW47XG4gICAgQElucHV0KCkga2V5TWFwICAgICAgICAgICAgICAgICAgICAgICEgOiBSZWNvcmQ8c3RyaW5nLCBLZXlNYXBDb25maWc+O1xuICAgIEBJbnB1dCgpIGxhYmVsUG9zaXRpb24gICAgICAgICAgICAgICAhIDogJ2JlZm9yZSd8J2Fib3ZlJ3wnYWxpZ24tYmVmb3JlJ3wnYXV0byd8bnVsbDtcbiAgICBASW5wdXQoKSBtYXJnaW4gICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcnxzdHJpbmc7XG4gICAgQElucHV0KCkgbWF4SGVpZ2h0ICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8bnVtYmVyO1xuICAgIEBJbnB1dCgpIG1heGltaXplT25Nb2JpbGUgICAgICAgICAgICAhIDogbnVtYmVyfHN0cmluZztcbiAgICBASW5wdXQoKSBtYXhXaWR0aCAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xudW1iZXI7XG4gICAgQElucHV0KCkgbWluSGVpZ2h0ICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8bnVtYmVyO1xuICAgIEBJbnB1dCgpIG1pbldpZHRoICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfG51bWJlcjtcbiAgICBASW5wdXQoKSBwcm9qZWN0ICAgICAgICAgICAgICAgICAgICAgISA6IFByb2plY3RNb2RlbHxQcm9qZWN0TW9kZWxDb25maWd8b2JqZWN0O1xuICAgIEBJbnB1dCgpIHJlYWRPbmx5ICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSByZW5kaXRpb24gICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fG51bGw7XG4gICAgQElucHV0KCkgcmVzb3VyY2VzICAgICAgICAgICAgICAgICAgICEgOiBSZXNvdXJjZU1vZGVsW118b2JqZWN0W118UmVzb3VyY2VNb2RlbENvbmZpZ1tdO1xuICAgIEBJbnB1dCgpIHJ0bCAgICAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBzZWxlY3RlZFRhc2tzICAgICAgICAgICAgICAgISA6IFRhc2tNb2RlbFtdO1xuICAgIEBJbnB1dCgpIHNob3dDb2xsYXBzZVRvb2x0aXAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBzcGFuICAgICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSBzdHJldGNoQ2FyZHMgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgc3RyaWN0UmVjb3JkTWFwcGluZyAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHN3aW1sYW5lRmllbGQgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHN3aW1sYW5lcyAgICAgICAgICAgICAgICAgICAhIDogU3RvcmV8U3dpbWxhbmVNb2RlbFtdfFN3aW1sYW5lTW9kZWxDb25maWdbXXxzdHJpbmd8U3RvcmVDb25maWc7XG4gICAgQElucHV0KCkgdGFza3MgICAgICAgICAgICAgICAgICAgICAgICEgOiBUYXNrTW9kZWxbXXxvYmplY3RbXXxUYXNrTW9kZWxDb25maWdbXTtcbiAgICBASW5wdXQoKSB0aXRsZSAgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSB0b29scyAgICAgICAgICAgICAgICAgICAgICAgISA6IFJlY29yZDxzdHJpbmcsIFRvb2x8VG9vbENvbmZpZz58bnVsbHxSZWNvcmQ8c3RyaW5nLCBUb29sPnxSZWNvcmQ8c3RyaW5nLCBUb29sQ29uZmlnPjtcbiAgICBASW5wdXQoKSB2aXJ0dWFsaXplICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgd2lkdGggICAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXJ8c3RyaW5nO1xuICAgIEBJbnB1dCgpIHggICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIHkgICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogbnVtYmVyO1xuXG4gICAgLy8gUHJvcGVydGllcyBvbmx5XG4gICAgQElucHV0KCkgYW5jaG9yU2l6ZSAgICEgOiBudW1iZXJbXTtcbiAgICBASW5wdXQoKSBmb2N1c1Zpc2libGUgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaGFzQ2hhbmdlcyAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHBhcmVudCAgICAgICAhIDogV2lkZ2V0O1xuICAgIEBJbnB1dCgpIHN0YXRlICAgICAgICAhIDogYW55O1xuXG4gICAgLy8gRmVhdHVyZXNcbiAgICBASW5wdXQoKSBjb2x1bW5EcmFnRmVhdHVyZSAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDb2x1bW5EcmFnfENvbHVtbkRyYWdDb25maWc7XG4gICAgQElucHV0KCkgY29sdW1uRmlsdGVyRmVhdHVyZSAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q29sdW1uRmlsdGVyfENvbHVtbkZpbHRlckNvbmZpZztcbiAgICBASW5wdXQoKSBjb2x1bW5IZWFkZXJNZW51RmVhdHVyZSAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDb2x1bW5IZWFkZXJNZW51fENvbHVtbkhlYWRlck1lbnVDb25maWc7XG4gICAgQElucHV0KCkgY29sdW1uTG9ja0ZlYXR1cmUgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q29sdW1uTG9ja3xDb2x1bW5Mb2NrQ29uZmlnO1xuICAgIEBJbnB1dCgpIGNvbHVtblJlbmFtZUZlYXR1cmUgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfENvbHVtblJlbmFtZXxDb2x1bW5SZW5hbWVDb25maWc7XG4gICAgQElucHV0KCkgY29sdW1uUmVzaXplRmVhdHVyZSAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q29sdW1uUmVzaXplfENvbHVtblJlc2l6ZUNvbmZpZztcbiAgICBASW5wdXQoKSBjb2x1bW5Tb3J0RmVhdHVyZSAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDb2x1bW5Tb3J0fENvbHVtblNvcnRDb25maWc7XG4gICAgQElucHV0KCkgY29sdW1uVG9vbGJhcnNGZWF0dXJlICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q29sdW1uVG9vbGJhcnN8Q29sdW1uVG9vbGJhcnNDb25maWc7XG4gICAgQElucHV0KCkgZmlsdGVyQmFyRmVhdHVyZSAgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8RmlsdGVyQmFyfEZpbHRlckJhckNvbmZpZztcbiAgICBASW5wdXQoKSBzaW1wbGVUYXNrRWRpdEZlYXR1cmUgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xTaW1wbGVUYXNrRWRpdHxTaW1wbGVUYXNrRWRpdENvbmZpZztcbiAgICBASW5wdXQoKSBzd2ltbGFuZURyYWdGZWF0dXJlICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xTd2ltbGFuZURyYWd8U3dpbWxhbmVEcmFnQ29uZmlnO1xuICAgIEBJbnB1dCgpIHRhc2tEcmFnRmVhdHVyZSAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFRhc2tEcmFnfFRhc2tEcmFnQ29uZmlnO1xuICAgIEBJbnB1dCgpIHRhc2tEcmFnU2VsZWN0RmVhdHVyZSAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFRhc2tEcmFnU2VsZWN0fFRhc2tEcmFnU2VsZWN0Q29uZmlnO1xuICAgIEBJbnB1dCgpIHRhc2tFZGl0RmVhdHVyZSAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFRhc2tFZGl0fFRhc2tFZGl0Q29uZmlnO1xuICAgIEBJbnB1dCgpIHRhc2tNZW51RmVhdHVyZSAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFRhc2tNZW51fFRhc2tNZW51Q29uZmlnO1xuICAgIEBJbnB1dCgpIHRhc2tUb29sdGlwRmVhdHVyZSAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFRhc2tUb29sdGlwfFRhc2tUb29sdGlwQ29uZmlnO1xuXG4gICAgLy8gRXZlbnRzIGVtaXR0ZXJzXG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gYSB0YXNrIGlzIFwiYWN0aXZhdGVkXCIgYnkgcHJlc3NpbmcgYEVudGVyYCBvciBkb3VibGUgY2xpY2tpbmcgaXQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjZXZlbnQtYWN0aXZhdGVUYXNrKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC52aWV3LlRhc2tCb2FyZH0gZXZlbnQuc291cmNlIFRoaXMgVGFza0JvYXJkXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuVGFza01vZGVsfSBldmVudC50YXNrUmVjb3JkIFRhc2sgcmVjb3JkXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5ldmVudCBCcm93c2VyIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQWN0aXZhdGVUYXNrOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUYXNrQm9hcmQsIHRhc2tSZWNvcmQ6IFRhc2tNb2RlbCwgZXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgVGFza0JvYXJkIGJlZm9yZSBjb2x1bW4gZHJhZ2dpbmcgc3RhcnRzLiBSZXR1cm4gYGZhbHNlYCB0byBwcmV2ZW50IHRoZSBhY3Rpb25cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQudmlldy5UYXNrQm9hcmR9IGV2ZW50LnNvdXJjZSBPd25pbmcgVGFza0JvYXJkXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuQ29sdW1uTW9kZWx9IGV2ZW50LmNvbHVtblJlY29yZCBDb2x1bW4gdG8gYmUgZHJhZ2dlZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZUNvbHVtbkRyYWc6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRhc2tCb2FyZCwgY29sdW1uUmVjb3JkOiBDb2x1bW5Nb2RlbCB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgVGFza0JvYXJkIHdoZW4gZHJvcHBpbmcgYSBjb2x1bW4sIGJlZm9yZSB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlcy4gSGFuZGxlcyBhc3luY1xuICAgICAqIGxpc3RlbmVycywgcmV0dXJuaW5nIGBmYWxzZWAgZnJvbSBvbmUgd2lsbCBhYm9ydCB0aGUgb3BlcmF0aW9uXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjZXZlbnQtYmVmb3JlQ29sdW1uRHJvcClcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQudmlldy5UYXNrQm9hcmR9IGV2ZW50LnNvdXJjZSBPd25pbmcgVGFza0JvYXJkXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuQ29sdW1uTW9kZWx9IGV2ZW50LmNvbHVtblJlY29yZCBEcm9wcGVkIGNvbHVtblxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLkNvbHVtbk1vZGVsfSBldmVudC5iZWZvcmVDb2x1bW4gRHJvcHBlZCBiZWZvcmUgdGhpcyBjb2x1bW5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVDb2x1bW5Ecm9wOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUYXNrQm9hcmQsIGNvbHVtblJlY29yZDogQ29sdW1uTW9kZWwsIGJlZm9yZUNvbHVtbjogQ29sdW1uTW9kZWwgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGlzIGZpcmVkIHByaW9yIHRvIHN0YXJ0aW5nIGEgY29sdW1uIHJlc2l6ZSBnZXN0dXJlLiBUaGUgcmVzaXplIGlzIGNhbmNlbGVkIGlmIGEgbGlzdGVuZXIgcmV0dXJuc1xuICAgICAqIGBmYWxzZWAuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgVGhlIFRhc2tCb2FyZCBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLkNvbHVtbk1vZGVsfSBldmVudC5jb2x1bW4gVGhlIGNvbHVtblxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSBicm93c2VyIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlQ29sdW1uUmVzaXplOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUYXNrQm9hcmQsIGNvbHVtbjogQ29sdW1uTW9kZWwsIGRvbUV2ZW50OiBFdmVudCB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIGJlZm9yZSBhbiBvYmplY3QgaXMgZGVzdHJveWVkLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUuQmFzZX0gZXZlbnQuc291cmNlIFRoZSBPYmplY3QgdGhhdCBpcyBiZWluZyBkZXN0cm95ZWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlRGVzdHJveTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQmFzZSB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIGJlZm9yZSBhIHdpZGdldCBpcyBoaWRkZW4uIFJldHVybiBgZmFsc2VgIHRvIHByZXZlbnQgdGhlIGFjdGlvbi5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnNvdXJjZSBUaGUgd2lkZ2V0IGJlaW5nIGhpZGRlbi5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVIaWRlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBXaWRnZXQgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgYmVmb3JlIGEgbmV3IFtyZXNwb25zaXZlU3RhdGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L21peGluL1Jlc3BvbnNpdmUjY29uZmlnLXJlc3BvbnNpdmVTdGF0ZSkgaXMgYXBwbGllZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnNvdXJjZSBUaGUgd2lkZ2V0IHdob3NlIGByZXNwb25zaXZlU3RhdGVgIGlzIHRvIGJlIGNoYW5nZWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQuc3RhdGUgVGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHdpZGdldCdzIGByZXNwb25zaXZlU3RhdGVgXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50Lm9sZFN0YXRlIFRoZSBwcmV2aW91cyB2YWx1ZSBmb3IgdGhlIHdpZGdldCdzIGByZXNwb25zaXZlU3RhdGVgXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlUmVzcG9uc2l2ZVN0YXRlQ2hhbmdlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBXaWRnZXQsIHN0YXRlOiBzdHJpbmcsIG9sZFN0YXRlOiBzdHJpbmcgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCBiZWZvcmUgYSB3aWRnZXQgaXMgc2hvd24uIFJldHVybiBgZmFsc2VgIHRvIHByZXZlbnQgdGhlIGFjdGlvbi5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXQsYW55fSBldmVudC5zb3VyY2UgVGhlIHdpZGdldCBiZWluZyBzaG93blxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVNob3c6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldHxhbnkgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiB0aGUgb3duaW5nIFRhc2tCb2FyZCBiZWZvcmUgZGlzcGxheWluZyBhbiBpbmxpbmUgZWRpdG9yLiBSZXR1cm5pbmcgYGZhbHNlYCBzdG9wcyB0aGUgZWRpdG9yIGZyb21cbiAgICAgKiBiZWluZyBzaG93bi5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNldmVudC1iZWZvcmVTaW1wbGVUYXNrRWRpdClcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQudmlldy5UYXNrQm9hcmR9IGV2ZW50LnNvdXJjZSBUaGUgdGFzayBib2FyZFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLmZlYXR1cmUuU2ltcGxlVGFza0VkaXR9IGV2ZW50LnNpbXBsZVRhc2tFZGl0IFRoZSBzaW1wbGVUYXNrRWRpdCBmZWF0dXJlXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuVGFza01vZGVsfSBldmVudC50YXNrUmVjb3JkIFRoZSByZWNvcmQgYWJvdXQgdG8gYmUgc2hvd24gaW4gdGhlIGVkaXRvclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5maWVsZCBGaWVsZCBuYW1lIGJlaW5nIGVkaXRlZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVNpbXBsZVRhc2tFZGl0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUYXNrQm9hcmQsIHNpbXBsZVRhc2tFZGl0OiBTaW1wbGVUYXNrRWRpdCwgdGFza1JlY29yZDogVGFza01vZGVsLCBmaWVsZDogc3RyaW5nIH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgYmVmb3JlIHN0YXRlIGlzIGFwcGxpZWQgdG8gdGhlIHNvdXJjZS4gQWxsb3dzIGVkaXRpbmcgdGhlIHN0YXRlIG9iamVjdCBvciBwcmV2ZW50aW5nIHRoZSBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7YW55fSBldmVudC5zdGF0ZSBTdGF0ZSBvYmplY3QgY29uZmlnXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlU3RhdGVBcHBseTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHN0YXRlOiBhbnkgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBiZWZvcmUgc3RhdGUgaXMgc2F2ZWQgYnkgdGhlIFN0YXRlUHJvdmlkZXIuIEFsbG93cyBlZGl0aW5nIHRoZSBzdGF0ZSBvYmplY3Qgb3IgcHJldmVudGluZyB0aGUgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge2FueX0gZXZlbnQuc3RhdGUgU3RhdGUgb2JqZWN0IGNvbmZpZ1xuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVN0YXRlU2F2ZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHN0YXRlOiBhbnkgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiB0aGUgb3duaW5nIFRhc2tCb2FyZCBiZWZvcmUgdGFzayBkcmFnZ2luZyBzdGFydHMuIFJldHVybiBgZmFsc2VgIHRvIHByZXZlbnQgdGhlIGFjdGlvblxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC52aWV3LlRhc2tCb2FyZH0gZXZlbnQuc291cmNlIE93bmluZyBUYXNrQm9hcmRcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5UYXNrTW9kZWxbXX0gZXZlbnQudGFza1JlY29yZHMgVGFza3MgdG8gYmUgZHJhZ2dlZFxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSBtb3VzZSBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVRhc2tEcmFnOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUYXNrQm9hcmQsIHRhc2tSZWNvcmRzOiBUYXNrTW9kZWxbXSwgZG9tRXZlbnQ6IEV2ZW50IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBUYXNrQm9hcmQgd2hlbiB0YXNrcyBhcmUgZHJvcHBlZCwgYmVmb3JlIHRoZSBvcGVyYXRpb24gY29tcGxldGVzLiBIYW5kbGVzIGFzeW5jXG4gICAgICogbGlzdGVuZXJzLCByZXR1cm5pbmcgYGZhbHNlYCBmcm9tIG9uZSB3aWxsIGFib3J0IHRoZSBvcGVyYXRpb25cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNldmVudC1iZWZvcmVUYXNrRHJvcClcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQudmlldy5UYXNrQm9hcmR9IGV2ZW50LnNvdXJjZSBPd25pbmcgVGFza0JvYXJkXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuVGFza01vZGVsW119IGV2ZW50LnRhc2tSZWNvcmRzIERyb3BwZWQgdGFza3NcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5Db2x1bW5Nb2RlbH0gZXZlbnQudGFyZ2V0Q29sdW1uIERyb3BwZWQgb24gdGhpcyBjb2x1bW5cbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5Td2ltbGFuZU1vZGVsfSBldmVudC50YXJnZXRTd2ltbGFuZSBEcm9wcGVkIGluIHRoaXMgc3dpbWxhbmUgKGlmIHVzZWQpXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIG1vdXNlIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlVGFza0Ryb3A6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRhc2tCb2FyZCwgdGFza1JlY29yZHM6IFRhc2tNb2RlbFtdLCB0YXJnZXRDb2x1bW46IENvbHVtbk1vZGVsLCB0YXJnZXRTd2ltbGFuZTogU3dpbWxhbmVNb2RlbCwgZG9tRXZlbnQ6IEV2ZW50IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBUYXNrQm9hcmQgYmVmb3JlIGEgdGFzayBpcyBkaXNwbGF5ZWQgaW4gYW4gZWRpdG9yLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2V2ZW50LWJlZm9yZVRhc2tFZGl0KVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC52aWV3LlRhc2tCb2FyZH0gZXZlbnQuc291cmNlIFRoZSBvd25pbmcgVGFza0JvYXJkXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuVGFza01vZGVsfSBldmVudC50YXNrUmVjb3JkIFRoZSByZWNvcmQgYWJvdXQgdG8gYmUgc2hvd24gaW4gdGhlIHRhc2sgZWRpdG9yXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlVGFza0VkaXQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRhc2tCb2FyZCwgdGFza1JlY29yZDogVGFza01vZGVsIH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBUYXNrQm9hcmQgd2hlbiB0aGUgZWRpdG9yIGZvciBhIHRhc2sgaXMgYXZhaWxhYmxlLCBidXQgYmVmb3JlIGl0IGlzIHBvcHVsYXRlZCB3aXRoIGRhdGFcbiAgICAgKiBhbmQgc2hvd24uIEFsbG93cyBtYW5pcHVsYXRpbmcgZmllbGRzIGV0Yy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNldmVudC1iZWZvcmVUYXNrRWRpdFNob3cpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgVGhlIG93bmluZyBUYXNrQm9hcmRcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5UYXNrTW9kZWx9IGV2ZW50LnRhc2tSZWNvcmQgVGhlIHJlY29yZCBhYm91dCB0byBiZSBzaG93biBpbiB0aGUgdGFzayBlZGl0b3JcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC53aWRnZXQuVGFza0VkaXRvcn0gZXZlbnQuZWRpdG9yIFRoZSBlZGl0b3JcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVUYXNrRWRpdFNob3c6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRhc2tCb2FyZCwgdGFza1JlY29yZDogVGFza01vZGVsLCBlZGl0b3I6IFRhc2tFZGl0b3IgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCB3aGVuIG9uZSBvciBtb3JlIHRhc2tzIGFyZSB0byBiZSByZW1vdmVkIGJ5IGEgY2FsbCB0byBgcmVtb3ZlVGFzaygpYC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNldmVudC1iZWZvcmVUYXNrUmVtb3ZlKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC52aWV3LlRhc2tCb2FyZH0gZXZlbnQuc291cmNlIFRoaXMgVGFza0JvYXJkXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuVGFza01vZGVsW119IGV2ZW50LnRhc2tSZWNvcmRzIFRhc2sgcmVjb3JkcyB0byBiZSByZW1vdmVkXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlVGFza1JlbW92ZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVGFza0JvYXJkLCB0YXNrUmVjb3JkczogVGFza01vZGVsW10gfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGFueSBvdGhlciBldmVudCBpcyBmaXJlZCBmcm9tIHRoZSBvYmplY3QuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjZXZlbnQtY2F0Y2hBbGwpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7e1trZXk6IHN0cmluZ106IGFueSwgdHlwZTogc3RyaW5nfX0gZXZlbnQuZXZlbnQgVGhlIE9iamVjdCB0aGF0IGNvbnRhaW5zIGV2ZW50IGRldGFpbHNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQuZXZlbnQudHlwZSBUaGUgdHlwZSBvZiB0aGUgZXZlbnQgd2hpY2ggaXMgY2F1Z2h0IGJ5IHRoZSBsaXN0ZW5lclxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNhdGNoQWxsOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHtba2V5OiBzdHJpbmddOiBhbnksIHR5cGU6IHN0cmluZ30pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGZpcmVzIG9uIHRoZSBvd25pbmcgVGFza0JvYXJkIHdoZW4gYW4gaXRlbSBpcyBzZWxlY3RlZCBpbiB0aGUgY29sdW1uIGhlYWRlciBtZW51LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC52aWV3LlRhc2tCb2FyZH0gZXZlbnQuc291cmNlIFRoZSBncmlkXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5NZW51fSBldmVudC5tZW51IFRoZSBtZW51XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5NZW51SXRlbX0gZXZlbnQuaXRlbSBTZWxlY3RlZCBtZW51IGl0ZW1cbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5Db2x1bW5Nb2RlbH0gZXZlbnQuY29sdW1uUmVjb3JkIFRoZSBjb2x1bW5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25DZWxsTWVudUl0ZW06IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRhc2tCb2FyZCwgbWVudTogTWVudSwgaXRlbTogTWVudUl0ZW0sIGNvbHVtblJlY29yZDogQ29sdW1uTW9kZWwgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgb24gdGhlIG93bmluZyBUYXNrQm9hcmQgYWZ0ZXIgdGhlIGNvbnRleHQgbWVudSBpcyBzaG93biBmb3IgYSBjb2x1bW4gaGVhZGVyLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC52aWV3LlRhc2tCb2FyZH0gZXZlbnQuc291cmNlIFRoZSBncmlkXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5NZW51fSBldmVudC5tZW51IFRoZSBtZW51XG4gICAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBNZW51SXRlbUVudHJ5Pn0gZXZlbnQuaXRlbXMgTWVudSBpdGVtIGNvbmZpZ3NcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5Db2x1bW5Nb2RlbH0gZXZlbnQuY29sdW1uUmVjb3JkIFRoZSBjb2x1bW5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25DZWxsTWVudVNob3c6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRhc2tCb2FyZCwgbWVudTogTWVudSwgaXRlbXM6IFJlY29yZDxzdHJpbmcsIE1lbnVJdGVtRW50cnk+LCBjb2x1bW5SZWNvcmQ6IENvbHVtbk1vZGVsIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGZpcmVzIG9uIHRoZSBvd25pbmcgVGFza0JvYXJkIHdoZW4gYSBjaGVjayBpdGVtIGlzIHRvZ2dsZWQgaW4gdGhlIGNvbHVtbiBoZWFkZXIgbWVudS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQudmlldy5UYXNrQm9hcmR9IGV2ZW50LnNvdXJjZSBUaGUgZ3JpZFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuTWVudX0gZXZlbnQubWVudSBUaGUgbWVudVxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuTWVudUl0ZW19IGV2ZW50Lml0ZW0gU2VsZWN0ZWQgbWVudSBpdGVtXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuQ29sdW1uTW9kZWx9IGV2ZW50LmNvbHVtblJlY29yZCBUaGUgY29sdW1uXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5jaGVja2VkIENoZWNrZWQgb3Igbm90XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ2VsbE1lbnVUb2dnbGVJdGVtOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUYXNrQm9hcmQsIG1lbnU6IE1lbnUsIGl0ZW06IE1lbnVJdGVtLCBjb2x1bW5SZWNvcmQ6IENvbHVtbk1vZGVsLCBjaGVja2VkOiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGEgUGFuZWwgaXMgY29sbGFwc2VkIHVzaW5nIHRoZSBbY29sbGFwc2libGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1BhbmVsI2NvbmZpZy1jb2xsYXBzaWJsZSkgc2V0dGluZy5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5QYW5lbH0gZXZlbnQuc291cmNlIFRoaXMgUGFuZWwuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ29sbGFwc2U6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFBhbmVsIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgd2hlbiBhIGNvbHVtbiBpcyBjb2xsYXBzZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgVGhpcyBUYXNrQm9hcmRcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5Db2x1bW5Nb2RlbH0gZXZlbnQuY29sdW1uUmVjb3JkIENvbHVtbiByZWNvcmRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Db2x1bW5Db2xsYXBzZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVGFza0JvYXJkLCBjb2x1bW5SZWNvcmQ6IENvbHVtbk1vZGVsIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiB0aGUgb3duaW5nIFRhc2tCb2FyZCB3aGVuIGEgY29sdW1uIGlzIGRyYWdnZWQsIGlmIHRoZSBkcmFnIGxlYWRzIHRvIGEgY2hhbmdlIGNvbXBhcmVkIHRvXG4gICAgICogdGhlIGxhc3QgY29sdW1uRHJhZyBldmVudC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNldmVudC1jb2x1bW5EcmFnKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC52aWV3LlRhc2tCb2FyZH0gZXZlbnQuc291cmNlIE93bmluZyBUYXNrQm9hcmRcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5Db2x1bW5Nb2RlbH0gZXZlbnQuY29sdW1uUmVjb3JkIENvbHVtbiBiZWluZyBkcmFnZ2VkXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuQ29sdW1uTW9kZWx9IGV2ZW50LmJlZm9yZUNvbHVtbiBJbnNlcnQgYmVmb3JlIHRoaXMgY29sdW1uIG9uIGRyb3AsIGBudWxsYCBpZiBsYXN0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ29sdW1uRHJhZzogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVGFza0JvYXJkLCBjb2x1bW5SZWNvcmQ6IENvbHVtbk1vZGVsLCBiZWZvcmVDb2x1bW46IENvbHVtbk1vZGVsIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiB0aGUgb3duaW5nIFRhc2tCb2FyZCB3aGVuIGEgZHJhZyBvcGVyYXRpb24gaXMgYWJvcnRlZCAoaW52YWxpZCBkcm9wIG9yIGFib3J0ZWQgdXNpbmcgRVNDKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC52aWV3LlRhc2tCb2FyZH0gZXZlbnQuc291cmNlIE93bmluZyBUYXNrQm9hcmRcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5Db2x1bW5Nb2RlbH0gZXZlbnQuY29sdW1uUmVjb3JkIERyYWdnZWQgY29sdW1uXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ29sdW1uRHJhZ0Fib3J0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUYXNrQm9hcmQsIGNvbHVtblJlY29yZDogQ29sdW1uTW9kZWwgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgVGFza0JvYXJkIHdoZW4gYSBwcmV2aW91c2x5IHN0YXJ0ZWQgZHJhZyBvcGVyYXRpb24gZW5kcywgbm8gbWF0dGVyIHRoZVxuICAgICAqIG91dGNvbWUgb2YgaXQgKHdoZXRoZXIgdmFsaWQsIGludmFsaWQgb3IgYWJvcnRlZClcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQudmlldy5UYXNrQm9hcmR9IGV2ZW50LnNvdXJjZSBPd25pbmcgVGFza0JvYXJkXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuQ29sdW1uTW9kZWx9IGV2ZW50LmNvbHVtblJlY29yZCBBZmZlY3RlZCBjb2x1bW5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Db2x1bW5EcmFnRW5kOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUYXNrQm9hcmQsIGNvbHVtblJlY29yZDogQ29sdW1uTW9kZWwgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgVGFza0JvYXJkIHdoZW4gY29sdW1uIGRyYWdnaW5nIHN0YXJ0c1xuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC52aWV3LlRhc2tCb2FyZH0gZXZlbnQuc291cmNlIE93bmluZyBUYXNrQm9hcmRcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5Db2x1bW5Nb2RlbH0gZXZlbnQuY29sdW1uUmVjb3JkIENvbHVtbiB0byBiZSBkcmFnZ2VkXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ29sdW1uRHJhZ1N0YXJ0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUYXNrQm9hcmQsIGNvbHVtblJlY29yZDogQ29sdW1uTW9kZWwgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgVGFza0JvYXJkIHdoZW4gYSBjb2x1bW4gaXMgc3VjY2Vzc2Z1bGx5IGRyb3BwZWQgKGFmdGVyIHRoZSBkcm9wIHRyYW5zaXRpb25cbiAgICAgKiBoYXMgZmluaXNoZWQpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgT3duaW5nIFRhc2tCb2FyZFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLkNvbHVtbk1vZGVsfSBldmVudC5jb2x1bW5SZWNvcmQgRHJvcHBlZCBjb2x1bW5cbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5Db2x1bW5Nb2RlbH0gZXZlbnQuYmVmb3JlQ29sdW1uIERyb3BwZWQgYmVmb3JlIHRoaXMgY29sdW1uIChgbnVsbGAgaWYgbGFzdClcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5Td2ltbGFuZU1vZGVsfSBldmVudC50YXJnZXRTd2ltbGFuZSBEcm9wcGVkIGluIHRoaXMgc3dpbWxhbmUgKGlmIHVzZWQpXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ29sdW1uRHJvcDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVGFza0JvYXJkLCBjb2x1bW5SZWNvcmQ6IENvbHVtbk1vZGVsLCBiZWZvcmVDb2x1bW46IENvbHVtbk1vZGVsLCB0YXJnZXRTd2ltbGFuZTogU3dpbWxhbmVNb2RlbCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gYSBjb2x1bW4gaXMgZXhwYW5kZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgVGhpcyBUYXNrQm9hcmRcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5Db2x1bW5Nb2RlbH0gZXZlbnQuY29sdW1uUmVjb3JkIENvbHVtbiByZWNvcmRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Db2x1bW5FeHBhbmQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRhc2tCb2FyZCwgY29sdW1uUmVjb3JkOiBDb2x1bW5Nb2RlbCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gdGhlIGNvbHVtbiBmaWx0ZXIgaXMgaGlkZGVuLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC52aWV3LlRhc2tCb2FyZH0gZXZlbnQuc291cmNlIFRoaXMgVGFza0JvYXJkXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuQ29sdW1uTW9kZWx9IGV2ZW50LmNvbHVtblJlY29yZCBDb2x1bW4gcmVjb3JkXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ29sdW1uRmlsdGVySGlkZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVGFza0JvYXJkLCBjb2x1bW5SZWNvcmQ6IENvbHVtbk1vZGVsIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgd2hlbiB0aGUgY29sdW1uIGZpbHRlciBpcyBkaXNwbGF5ZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgVGhpcyBUYXNrQm9hcmRcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5Db2x1bW5Nb2RlbH0gZXZlbnQuY29sdW1uUmVjb3JkIENvbHVtbiByZWNvcmRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Db2x1bW5GaWx0ZXJTaG93OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUYXNrQm9hcmQsIGNvbHVtblJlY29yZDogQ29sdW1uTW9kZWwgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCB3aGVuIHRoZSBjb2x1bW4gZmlsdGVyIHZpc2liaWxpdHkgaXMgdG9nZ2xlZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQudmlldy5UYXNrQm9hcmR9IGV2ZW50LnNvdXJjZSBUaGlzIFRhc2tCb2FyZFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLkNvbHVtbk1vZGVsfSBldmVudC5jb2x1bW5SZWNvcmQgQ29sdW1uIHJlY29yZFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQudmlzaWJsZSBUcnVlIGlmIGZpbHRlciBwb3B1cCBpcyB2aXNpYmxlLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Db2x1bW5GaWx0ZXJUb2dnbGU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRhc2tCb2FyZCwgY29sdW1uUmVjb3JkOiBDb2x1bW5Nb2RlbCwgdmlzaWJsZTogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gYSBjb2x1bW4gaGVhZGVyIGlzIGNsaWNrZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjZXZlbnQtY29sdW1uSGVhZGVyQ2xpY2spXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgVGhpcyBUYXNrQm9hcmRcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5Db2x1bW5Nb2RlbH0gZXZlbnQuY29sdW1uUmVjb3JkIENvbHVtbiByZWNvcmRcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50LmV2ZW50IEJyb3dzZXIgZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Db2x1bW5IZWFkZXJDbGljazogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVGFza0JvYXJkLCBjb2x1bW5SZWNvcmQ6IENvbHVtbk1vZGVsLCBldmVudDogTW91c2VFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gYSBjb2x1bW4gaGVhZGVyIGlzIHJpZ2h0LWNsaWNrZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjZXZlbnQtY29sdW1uSGVhZGVyQ29udGV4dE1lbnUpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgVGhpcyBUYXNrQm9hcmRcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5Db2x1bW5Nb2RlbH0gZXZlbnQuY29sdW1uUmVjb3JkIENvbHVtbiByZWNvcmRcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50LmV2ZW50IEJyb3dzZXIgZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Db2x1bW5IZWFkZXJDb250ZXh0TWVudTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVGFza0JvYXJkLCBjb2x1bW5SZWNvcmQ6IENvbHVtbk1vZGVsLCBldmVudDogTW91c2VFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gYSBjb2x1bW4gaGVhZGVyIGlzIGRvdWJsZS1jbGlja2VkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2V2ZW50LWNvbHVtbkhlYWRlckRibENsaWNrKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC52aWV3LlRhc2tCb2FyZH0gZXZlbnQuc291cmNlIFRoaXMgVGFza0JvYXJkXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuQ29sdW1uTW9kZWx9IGV2ZW50LmNvbHVtblJlY29yZCBDb2x1bW4gcmVjb3JkXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5ldmVudCBCcm93c2VyIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ29sdW1uSGVhZGVyRGJsQ2xpY2s6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRhc2tCb2FyZCwgY29sdW1uUmVjb3JkOiBDb2x1bW5Nb2RlbCwgZXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgb24gdGhlIG93bmluZyBUYXNrQm9hcmQgYmVmb3JlIHRoZSBtZW51IGlzIHNob3duIGZvciBhIGNvbHVtbiBoZWFkZXIuXG4gICAgICogQWxsb3dzIG1hbmlwdWxhdGlvbiBvZiB0aGUgaXRlbXMgdG8gc2hvdyBpbiB0aGUgc2FtZSB3YXkgYXMgaW4gdGhlIFtwcm9jZXNzSXRlbXNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9mZWF0dXJlL0NvbHVtbkhlYWRlck1lbnUjY29uZmlnLXByb2Nlc3NJdGVtcykuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjZXZlbnQtY29sdW1uSGVhZGVyTWVudUJlZm9yZVNob3cpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgVGhlIGdyaWRcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnV9IGV2ZW50Lm1lbnUgVGhlIG1lbnVcbiAgICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIE1lbnVJdGVtRW50cnk+fSBldmVudC5pdGVtcyBNZW51IGl0ZW0gY29uZmlnc1xuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLkNvbHVtbk1vZGVsfSBldmVudC5jb2x1bW5SZWNvcmQgVGhlIGNvbHVtblxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNvbHVtbkhlYWRlck1lbnVCZWZvcmVTaG93OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUYXNrQm9hcmQsIG1lbnU6IE1lbnUsIGl0ZW1zOiBSZWNvcmQ8c3RyaW5nLCBNZW51SXRlbUVudHJ5PiwgY29sdW1uUmVjb3JkOiBDb2x1bW5Nb2RlbCB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgaXMgZmlyZWQgYWZ0ZXIgYSByZXNpemUgZ2VzdHVyZSBpcyBjb21wbGV0ZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgVGhlIFRhc2tCb2FyZCBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLkNvbHVtbk1vZGVsfSBldmVudC5jb2x1bW4gVGhlIGNvbHVtblxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSBicm93c2VyIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ29sdW1uUmVzaXplOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUYXNrQm9hcmQsIGNvbHVtbjogQ29sdW1uTW9kZWwsIGRvbUV2ZW50OiBFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBpcyBmaXJlZCB3aGVuIGEgY29sdW1uIHJlc2l6ZSBnZXN0dXJlIHN0YXJ0cy5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQudmlldy5UYXNrQm9hcmR9IGV2ZW50LnNvdXJjZSBUaGUgVGFza0JvYXJkIGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuQ29sdW1uTW9kZWx9IGV2ZW50LmNvbHVtbiBUaGUgY29sdW1uXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIGJyb3dzZXIgZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Db2x1bW5SZXNpemVTdGFydDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVGFza0JvYXJkLCBjb2x1bW46IENvbHVtbk1vZGVsLCBkb21FdmVudDogRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCB3aGVuIGEgY29sdW1uIHRpdGxlIGVsZW1lbnQgaXMgY2xpY2tlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNldmVudC1jb2x1bW5UaXRsZUNsaWNrKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC52aWV3LlRhc2tCb2FyZH0gZXZlbnQuc291cmNlIFRoaXMgVGFza0JvYXJkXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuQ29sdW1uTW9kZWx9IGV2ZW50LmNvbHVtblJlY29yZCBDb2x1bW4gcmVjb3JkXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5ldmVudCBCcm93c2VyIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ29sdW1uVGl0bGVDbGljazogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVGFza0JvYXJkLCBjb2x1bW5SZWNvcmQ6IENvbHVtbk1vZGVsLCBldmVudDogTW91c2VFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gYSBjb2x1bW4gdGl0bGUgZWxlbWVudCBpcyByaWdodC1jbGlja2VkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2V2ZW50LWNvbHVtblRpdGxlQ29udGV4dE1lbnUpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgVGhpcyBUYXNrQm9hcmRcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5Db2x1bW5Nb2RlbH0gZXZlbnQuY29sdW1uUmVjb3JkIENvbHVtbiByZWNvcmRcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50LmV2ZW50IEJyb3dzZXIgZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Db2x1bW5UaXRsZUNvbnRleHRNZW51OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUYXNrQm9hcmQsIGNvbHVtblJlY29yZDogQ29sdW1uTW9kZWwsIGV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgd2hlbiBhIGNvbHVtbiB0aXRsZSBlbGVtZW50IGlzIGRvdWJsZS1jbGlja2VkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2V2ZW50LWNvbHVtblRpdGxlRGJsQ2xpY2spXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgVGhpcyBUYXNrQm9hcmRcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5Db2x1bW5Nb2RlbH0gZXZlbnQuY29sdW1uUmVjb3JkIENvbHVtbiByZWNvcmRcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50LmV2ZW50IEJyb3dzZXIgZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Db2x1bW5UaXRsZURibENsaWNrOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUYXNrQm9hcmQsIGNvbHVtblJlY29yZDogQ29sdW1uTW9kZWwsIGV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgd2hlbiB0aGUgY29sdW1uIGNvbGxhcHNlZCBzdGF0ZSBpcyB0b2dnbGVkLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC52aWV3LlRhc2tCb2FyZH0gZXZlbnQuc291cmNlIFRoaXMgVGFza0JvYXJkXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuQ29sdW1uTW9kZWx9IGV2ZW50LmNvbHVtblJlY29yZCBDb2x1bW4gcmVjb3JkXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5jb2xsYXBzZSBgdHJ1ZWAgaWYgdGhlIGNvbHVtbiBpcyBiZWluZyBjb2xsYXBzZWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ29sdW1uVG9nZ2xlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUYXNrQm9hcmQsIGNvbHVtblJlY29yZDogQ29sdW1uTW9kZWwsIGNvbGxhcHNlOiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGFuIG9iamVjdCBpcyBkZXN0cm95ZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS5CYXNlfSBldmVudC5zb3VyY2UgVGhlIE9iamVjdCB0aGF0IGlzIGJlaW5nIGRlc3Ryb3llZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25EZXN0cm95OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBCYXNlIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGEgZmllbGQgaXMgbXV0YXRlZCBhbmQgdGhlIHN0YXRlIG9mIHRoZSBbaGFzQ2hhbmdlc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ29udGFpbmVyI3Byb3BlcnR5LWhhc0NoYW5nZXMpIHByb3BlcnR5IGNoYW5nZXNcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5Db250YWluZXJ9IGV2ZW50LnNvdXJjZSBUaGUgY29udGFpbmVyLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuZGlydHkgVGhlIGRpcnR5IHN0YXRlIG9mIHRoZSBDb250YWluZXIgLSBgdHJ1ZWAgaWYgdGhlcmUgYXJlIGFueSBmaWVsZHMgd2hpY2ggaGF2ZSBiZWVuIGNoYW5nZWQgc2luY2UgaW5pdGlhbCBsb2FkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkRpcnR5U3RhdGVDaGFuZ2U6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IENvbnRhaW5lciwgZGlydHk6IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCB3aGVuIGEgd2lkZ2V0J3MgW2VsZW1lbnRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNwcm9wZXJ0eS1lbGVtZW50KSBpcyBhdmFpbGFibGUuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LmVsZW1lbnQgVGhlIFdpZGdldCdzIGVsZW1lbnQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRWxlbWVudENyZWF0ZWQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBlbGVtZW50OiBIVE1MRWxlbWVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiBhIFBhbmVsIGlzIGV4cGFuZGVkIHVzaW5nIHRoZSBbY29sbGFwc2libGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1BhbmVsI2NvbmZpZy1jb2xsYXBzaWJsZSkgc2V0dGluZy5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5QYW5lbH0gZXZlbnQuc291cmNlIFRoaXMgUGFuZWwuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRXhwYW5kOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBQYW5lbCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBmb2N1cyBlbnRlcnMgdGhpcyBXaWRnZXQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhpcyBXaWRnZXRcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC5mcm9tRWxlbWVudCBUaGUgZWxlbWVudCB3aGljaCBsb3N0IGZvY3VzLlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LnRvRWxlbWVudCBUaGUgZWxlbWVudCB3aGljaCBnYWluZWQgZm9jdXMuXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LmZyb21XaWRnZXQgVGhlIHdpZGdldCB3aGljaCBsb3N0IGZvY3VzLlxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC50b1dpZGdldCBUaGUgd2lkZ2V0IHdoaWNoIGdhaW5lZCBmb2N1cy5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmJhY2t3YXJkcyBgdHJ1ZWAgaWYgdGhlIGB0b0VsZW1lbnRgIGlzIGJlZm9yZSB0aGUgYGZyb21FbGVtZW50YCBpbiBkb2N1bWVudCBvcmRlci5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Gb2N1c0luOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBXaWRnZXQsIGZyb21FbGVtZW50OiBIVE1MRWxlbWVudCwgdG9FbGVtZW50OiBIVE1MRWxlbWVudCwgZnJvbVdpZGdldDogV2lkZ2V0LCB0b1dpZGdldDogV2lkZ2V0LCBiYWNrd2FyZHM6IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gZm9jdXMgZXhpdHMgdGhpcyBXaWRnZXQncyBvd25lcnNoaXAgdHJlZS4gVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBhIGBibHVyYCBldmVudC5cbiAgICAgKiBmb2N1cyBtb3ZpbmcgZnJvbSB3aXRoaW4gdGhpcyBXaWRnZXQncyBvd25lcnNoaXAgdHJlZSwgZXZlbiBpZiB0aGVyZSBhcmUgZmxvYXRpbmcgd2lkZ2V0c1xuICAgICAqIHdpbGwgbm90IHRyaWdnZXIgdGhpcyBldmVudC4gVGhpcyBpcyB3aGVuIGZvY3VzIGV4aXRzIHRoaXMgd2lkZ2V0IGNvbXBsZXRlbHkuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhpcyBXaWRnZXRcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC5mcm9tRWxlbWVudCBUaGUgZWxlbWVudCB3aGljaCBsb3N0IGZvY3VzLlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LnRvRWxlbWVudCBUaGUgZWxlbWVudCB3aGljaCBnYWluZWQgZm9jdXMuXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LmZyb21XaWRnZXQgVGhlIHdpZGdldCB3aGljaCBsb3N0IGZvY3VzLlxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC50b1dpZGdldCBUaGUgd2lkZ2V0IHdoaWNoIGdhaW5lZCBmb2N1cy5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmJhY2t3YXJkcyBgdHJ1ZWAgaWYgdGhlIGB0b0VsZW1lbnRgIGlzIGJlZm9yZSB0aGUgYGZyb21FbGVtZW50YCBpbiBkb2N1bWVudCBvcmRlci5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Gb2N1c091dDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0LCBmcm9tRWxlbWVudDogSFRNTEVsZW1lbnQsIHRvRWxlbWVudDogSFRNTEVsZW1lbnQsIGZyb21XaWRnZXQ6IFdpZGdldCwgdG9XaWRnZXQ6IFdpZGdldCwgYmFja3dhcmRzOiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgYWZ0ZXIgYSB3aWRnZXQgd2FzIGhpZGRlblxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQuc291cmNlIFRoZSB3aWRnZXRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25IaWRlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBXaWRnZXQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCB3aGVuIGEgd2lkZ2V0IHdoaWNoIGhhZCBiZWVuIGluIGEgbm9uLXZpc2libGUgc3RhdGUgZm9yIGFueSByZWFzb25cbiAgICAgKiBhY2hpZXZlcyB2aXNpYmlsaXR5LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2V2ZW50LXBhaW50KVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQuc291cmNlIFRoZSB3aWRnZXQgYmVpbmcgcGFpbnRlZC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmZpcnN0UGFpbnQgYHRydWVgIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHBhaW50LlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblBhaW50OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBXaWRnZXQsIGZpcnN0UGFpbnQ6IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBXaWRnZXQncyByZWFkIG9ubHkgc3RhdGUgaXMgdG9nZ2xlZFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LnJlYWRPbmx5IFJlYWQgb25seSBvciBub3RcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25SZWFkT25seTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHJlYWRPbmx5OiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGlzIGZpcmVkIGFmdGVyIGEgd2lkZ2V0J3MgZWxlbWVudHMgaGF2ZSBiZWVuIHN5bmNocm9uaXplZCBkdWUgdG8gYSBkaXJlY3Qgb3IgaW5kaXJlY3QgY2FsbFxuICAgICAqIHRvIFtyZWNvbXBvc2VdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNmdW5jdGlvbi1yZWNvbXBvc2UpLCBpZiB0aGlzIHJlc3VsdHMgaW4gc29tZSBjaGFuZ2UgdG8gdGhlIHdpZGdldCdzIHJlbmRlcmVkIERPTSBlbGVtZW50cy5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25SZWNvbXBvc2U6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KCgpID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgd2hlbiBhIHRhc2tzIGVsZW1lbnQgaXMgcmVtb3ZlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNldmVudC1yZW1vdmVUYXNrRWxlbWVudClcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQudmlldy5UYXNrQm9hcmR9IGV2ZW50LnNvdXJjZSBUYXNrQm9hcmQgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge3N0cmluZyxudW1iZXJ9IGV2ZW50LnRhc2tJZCBJZCBvZiB0aGUgdGFzayAobm90IHRoZSByZWNvcmQgaXRzZWxmIHNpbmNlIGl0IG1pZ2h0IGJlIHJlbW92ZWQpXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuZWxlbWVudCBUYXNrcyBlbGVtZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uUmVtb3ZlVGFza0VsZW1lbnQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRhc2tCb2FyZCwgdGFza0lkOiBzdHJpbmd8bnVtYmVyLCBlbGVtZW50OiBIVE1MRWxlbWVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gYSB0YXNrIGlzIHJlbmRlcmVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2V2ZW50LXJlbmRlclRhc2spXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgVGFza0JvYXJkIGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuVGFza01vZGVsfSBldmVudC50YXNrUmVjb3JkIFRhc2sgYmVpbmcgcmVuZGVyZWRcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmlzUmVmcmVzaCBgdHJ1ZWAgaWYgdGhlIGVsZW1lbnQgd2FzIHVwZGF0ZWQsIGBmYWxzZWAgaWYgaXQgd2FzIGFkZGVkXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuZWxlbWVudCBUYXNrcyBlbGVtZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uUmVuZGVyVGFzazogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVGFza0JvYXJkLCB0YXNrUmVjb3JkOiBUYXNrTW9kZWwsIGlzUmVmcmVzaDogYm9vbGVhbiwgZWxlbWVudDogSFRNTEVsZW1lbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCB3aGVuIGFsbCB0YXNrcyBpbiB0aGUgdGFzayBib2FyZCBhcmUgcmVuZGVyZWRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQudmlldy5UYXNrQm9hcmR9IGV2ZW50LnNvdXJjZSBUYXNrQm9hcmQgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5UYXNrTW9kZWxbXX0gZXZlbnQudGFza1JlY29yZHMgVGFza3MgYmVpbmcgcmVuZGVyZWRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25SZW5kZXJUYXNrczogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVGFza0JvYXJkLCB0YXNrUmVjb3JkczogVGFza01vZGVsW10gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gdGhlIGVuY2Fwc3VsYXRpbmcgZWxlbWVudCBvZiBhIFdpZGdldCByZXNpemVzICpvbmx5IHdoZW4gW21vbml0b3JSZXNpemVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctbW9uaXRvclJlc2l6ZSkgaXMgYHRydWVgKi5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnNvdXJjZSBUaGlzIFdpZGdldFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBldmVudC53aWR0aCBUaGUgbmV3IHdpZHRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGV2ZW50LmhlaWdodCBUaGUgbmV3IGhlaWdodFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBldmVudC5vbGRXaWR0aCBUaGUgb2xkIHdpZHRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGV2ZW50Lm9sZEhlaWdodCBUaGUgb2xkIGhlaWdodFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJlc2l6ZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0LCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgb2xkV2lkdGg6IG51bWJlciwgb2xkSGVpZ2h0OiBudW1iZXIgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCB3aGVuIGEgbmV3IFtyZXNwb25zaXZlU3RhdGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L21peGluL1Jlc3BvbnNpdmUjY29uZmlnLXJlc3BvbnNpdmVTdGF0ZSkgaXMgYXBwbGllZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnNvdXJjZSBUaGUgd2lkZ2V0IHdob3NlIGByZXNwb25zaXZlU3RhdGVgIGhhcyBjaGFuZ2VkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LnN0YXRlIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSB3aWRnZXQncyBgcmVzcG9uc2l2ZVN0YXRlYFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5vbGRTdGF0ZSBUaGUgcHJldmlvdXMgdmFsdWUgZm9yIHRoZSB3aWRnZXQncyBgcmVzcG9uc2l2ZVN0YXRlYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJlc3BvbnNpdmVTdGF0ZUNoYW5nZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0LCBzdGF0ZTogc3RyaW5nLCBvbGRTdGF0ZTogc3RyaW5nIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgd2hlbiB0YXNrIHNlbGVjdGlvbiBjaGFuZ2VzLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC52aWV3LlRhc2tCb2FyZH0gZXZlbnQuc291cmNlIFRhc2tCb2FyZCBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7J3NlbGVjdCcsJ2Rlc2VsZWN0J30gZXZlbnQuYWN0aW9uIEVpdGhlciAnc2VsZWN0JyBvciAnZGVzZWxlY3QnLCBkZXBlbmRpbmcgb24gb3BlcmF0aW9uXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuVGFza01vZGVsW119IGV2ZW50LnNlbGVjdGlvbiBBbGwgY3VycmVudGx5IHNlbGVjdGVkIHRhc2tzXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuVGFza01vZGVsW119IGV2ZW50LnNlbGVjdCBUYXNrcyBzZWxlY3RlZCBieSB0aGUgb3BlcmF0aW9uXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuVGFza01vZGVsW119IGV2ZW50LmRlc2VsZWN0IFRhc2tzIGRlc2VsZWN0ZWQgYnkgdGhlIG9wZXJhdGlvblxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblNlbGVjdGlvbkNoYW5nZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVGFza0JvYXJkLCBhY3Rpb246ICdzZWxlY3QnfCdkZXNlbGVjdCcsIHNlbGVjdGlvbjogVGFza01vZGVsW10sIHNlbGVjdDogVGFza01vZGVsW10sIGRlc2VsZWN0OiBUYXNrTW9kZWxbXSB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIGFmdGVyIGEgd2lkZ2V0IGlzIHNob3duLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQuc291cmNlIFRoZSB3aWRnZXRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25TaG93OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBXaWRnZXQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgVGFza0JvYXJkIHdoZW4gaW5saW5lIGVkaXRpbmcgb2YgYSBmaWVsZCBpcyBjYW5jZWxsZWQgKGJ5IHByZXNzaW5nIEVTQykuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjZXZlbnQtc2ltcGxlVGFza0VkaXRDYW5jZWwpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgVGhlIHRhc2sgYm9hcmRcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5mZWF0dXJlLlNpbXBsZVRhc2tFZGl0fSBldmVudC5zaW1wbGVUYXNrRWRpdCBUaGUgc2ltcGxlVGFza0VkaXQgZmVhdHVyZVxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLlRhc2tNb2RlbH0gZXZlbnQudGFza1JlY29yZCBSZWNvcmQgdGhhdCB3YXMgZWRpdGVkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LmZpZWxkIEZpZWxkIG5hbWUgYmVpbmcgZWRpdGVkXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU2ltcGxlVGFza0VkaXRDYW5jZWw6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRhc2tCb2FyZCwgc2ltcGxlVGFza0VkaXQ6IFNpbXBsZVRhc2tFZGl0LCB0YXNrUmVjb3JkOiBUYXNrTW9kZWwsIGZpZWxkOiBzdHJpbmcgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiB0aGUgb3duaW5nIFRhc2tCb2FyZCB3aGVuIGlubGluZSBlZGl0aW5nIG9mIGEgZmllbGQgaGFzIHN1Y2Nlc3NmdWxseSBmaW5pc2hlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNldmVudC1zaW1wbGVUYXNrRWRpdENvbXBsZXRlKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC52aWV3LlRhc2tCb2FyZH0gZXZlbnQuc291cmNlIFRoZSB0YXNrIGJvYXJkXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQuZmVhdHVyZS5TaW1wbGVUYXNrRWRpdH0gZXZlbnQuc2ltcGxlVGFza0VkaXQgVGhlIHNpbXBsZVRhc2tFZGl0IGZlYXR1cmVcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5UYXNrTW9kZWx9IGV2ZW50LnRhc2tSZWNvcmQgUmVjb3JkIHRoYXQgd2FzIGVkaXRlZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5maWVsZCBGaWVsZCBuYW1lIGJlaW5nIGVkaXRlZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblNpbXBsZVRhc2tFZGl0Q29tcGxldGU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRhc2tCb2FyZCwgc2ltcGxlVGFza0VkaXQ6IFNpbXBsZVRhc2tFZGl0LCB0YXNrUmVjb3JkOiBUYXNrTW9kZWwsIGZpZWxkOiBzdHJpbmcgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgd2hlbiBhIHN3aW1sYW5lIGlzIGNvbGxhcHNlZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQudmlldy5UYXNrQm9hcmR9IGV2ZW50LnNvdXJjZSBUaGlzIFRhc2tCb2FyZFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLlN3aW1sYW5lTW9kZWx9IGV2ZW50LnN3aW1sYW5lUmVjb3JkIFN3aW1sYW5lIHJlY29yZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblN3aW1sYW5lQ29sbGFwc2U6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRhc2tCb2FyZCwgc3dpbWxhbmVSZWNvcmQ6IFN3aW1sYW5lTW9kZWwgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCB3aGVuIGEgc3dpbWxhbmUgaXMgZXhwYW5kZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgVGhpcyBUYXNrQm9hcmRcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5Td2ltbGFuZU1vZGVsfSBldmVudC5zd2ltbGFuZVJlY29yZCBTd2ltbGFuZSByZWNvcmRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Td2ltbGFuZUV4cGFuZDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVGFza0JvYXJkLCBzd2ltbGFuZVJlY29yZDogU3dpbWxhbmVNb2RlbCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gYSBzd2ltbGFuZSBoZWFkZXIgaXMgY2xpY2tlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNldmVudC1zd2ltbGFuZUhlYWRlckNsaWNrKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC52aWV3LlRhc2tCb2FyZH0gZXZlbnQuc291cmNlIFRoaXMgVGFza0JvYXJkXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuU3dpbWxhbmVNb2RlbH0gZXZlbnQuc3dpbWxhbmVSZWNvcmQgU3dpbWxhbmUgcmVjb3JkXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5ldmVudCBCcm93c2VyIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU3dpbWxhbmVIZWFkZXJDbGljazogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVGFza0JvYXJkLCBzd2ltbGFuZVJlY29yZDogU3dpbWxhbmVNb2RlbCwgZXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCB3aGVuIGEgc3dpbWxhbmUgaGVhZGVyIGlzIHJpZ2h0LWNsaWNrZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjZXZlbnQtc3dpbWxhbmVIZWFkZXJDb250ZXh0TWVudSlcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQudmlldy5UYXNrQm9hcmR9IGV2ZW50LnNvdXJjZSBUaGlzIFRhc2tCb2FyZFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLlN3aW1sYW5lTW9kZWx9IGV2ZW50LnN3aW1sYW5lUmVjb3JkIFN3aW1sYW5lIHJlY29yZFxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnQuZXZlbnQgQnJvd3NlciBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblN3aW1sYW5lSGVhZGVyQ29udGV4dE1lbnU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRhc2tCb2FyZCwgc3dpbWxhbmVSZWNvcmQ6IFN3aW1sYW5lTW9kZWwsIGV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgd2hlbiBhIHN3aW1sYW5lIGhlYWRlciBpcyBkb3VibGUtY2xpY2tlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNldmVudC1zd2ltbGFuZUhlYWRlckRibENsaWNrKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC52aWV3LlRhc2tCb2FyZH0gZXZlbnQuc291cmNlIFRoaXMgVGFza0JvYXJkXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuU3dpbWxhbmVNb2RlbH0gZXZlbnQuc3dpbWxhbmVSZWNvcmQgU3dpbWxhbmUgcmVjb3JkXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5ldmVudCBCcm93c2VyIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU3dpbWxhbmVIZWFkZXJEYmxDbGljazogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVGFza0JvYXJkLCBzd2ltbGFuZVJlY29yZDogU3dpbWxhbmVNb2RlbCwgZXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCB3aGVuIHRoZSBzd2ltbGFuZSBjb2xsYXBzZWQgc3RhdGUgaXMgdG9nZ2xlZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQudmlldy5UYXNrQm9hcmR9IGV2ZW50LnNvdXJjZSBUaGlzIFRhc2tCb2FyZFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLlN3aW1sYW5lTW9kZWx9IGV2ZW50LnN3aW1sYW5lUmVjb3JkIFN3aW1sYW5lIHJlY29yZFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuY29sbGFwc2UgYHRydWVgIGlmIHRoZSBjb2x1bW4gaXMgYmVpbmcgY29sbGFwc2VkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblN3aW1sYW5lVG9nZ2xlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUYXNrQm9hcmQsIHN3aW1sYW5lUmVjb3JkOiBTd2ltbGFuZU1vZGVsLCBjb2xsYXBzZTogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gYSBjYXJkIGlzIGNsaWNrZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjZXZlbnQtdGFza0NsaWNrKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC52aWV3LlRhc2tCb2FyZH0gZXZlbnQuc291cmNlIFRoaXMgVGFza0JvYXJkXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuVGFza01vZGVsfSBldmVudC50YXNrUmVjb3JkIFRhc2sgcmVjb3JkXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuQ29sdW1uTW9kZWx9IGV2ZW50LmNvbHVtblJlY29yZCBDb2x1bW4gcmVjb3JkIGZvciB0aGUgdGFza3MgY29sdW1uXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuU3dpbWxhbmVNb2RlbH0gZXZlbnQuc3dpbWxhbmVSZWNvcmQgU3dpbWxhbmUgcmVjb3JkIGZvciB0aGUgdGFza3Mgc3dpbWxhbmUgKGlmIHVzZWQpXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5ldmVudCBCcm93c2VyIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uVGFza0NsaWNrOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUYXNrQm9hcmQsIHRhc2tSZWNvcmQ6IFRhc2tNb2RlbCwgY29sdW1uUmVjb3JkOiBDb2x1bW5Nb2RlbCwgc3dpbWxhbmVSZWNvcmQ6IFN3aW1sYW5lTW9kZWwsIGV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgd2hlbiBhIGNhcmQgaXMgZG91YmxlLWNsaWNrZWRcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNldmVudC10YXNrRGJsQ2xpY2spXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgVGhpcyBUYXNrQm9hcmRcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5UYXNrTW9kZWx9IGV2ZW50LnRhc2tSZWNvcmQgVGFzayByZWNvcmRcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5Db2x1bW5Nb2RlbH0gZXZlbnQuY29sdW1uUmVjb3JkIENvbHVtbiByZWNvcmQgZm9yIHRoZSB0YXNrcyBjb2x1bW5cbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5Td2ltbGFuZU1vZGVsfSBldmVudC5zd2ltbGFuZVJlY29yZCBTd2ltbGFuZSByZWNvcmQgZm9yIHRoZSB0YXNrcyBzd2ltbGFuZSAoaWYgdXNlZClcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50LmV2ZW50IEJyb3dzZXIgZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25UYXNrRGJsQ2xpY2s6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRhc2tCb2FyZCwgdGFza1JlY29yZDogVGFza01vZGVsLCBjb2x1bW5SZWNvcmQ6IENvbHVtbk1vZGVsLCBzd2ltbGFuZVJlY29yZDogU3dpbWxhbmVNb2RlbCwgZXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgVGFza0JvYXJkIHdoZW4gdGFza3MgYXJlIGRyYWdnZWQsIGlmIHRoZSBkcmFnIGxlYWRzIHRvIGFueSBjaGFuZ2VzIGNvbXBhcmVkIHRvXG4gICAgICogdGhlIGxhc3QgdGFza0RyYWcgZXZlbnQgKG1vdmVkIHRvIGEgbmV3IGNvbHVtbiBvciBjaGFuZ2VkIG9yZGVyIHdpdGhpbiBhIGNvbHVtbikuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjZXZlbnQtdGFza0RyYWcpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgT3duaW5nIFRhc2tCb2FyZFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLlRhc2tNb2RlbFtdfSBldmVudC50YXNrUmVjb3JkcyBEcmFnZ2VkIHRhc2tzXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuQ29sdW1uTW9kZWx9IGV2ZW50LnRhcmdldENvbHVtbiBDdXJyZW50bHkgb3ZlciB0aGlzIGNvbHVtblxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLlN3aW1sYW5lTW9kZWx9IGV2ZW50LnRhcmdldFN3aW1sYW5lIEN1cnJlbnRseSBvdmVyIHRoaXMgc3dpbWxhbmUgKGlmIHVzZWQpXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIG1vdXNlIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uVGFza0RyYWc6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRhc2tCb2FyZCwgdGFza1JlY29yZHM6IFRhc2tNb2RlbFtdLCB0YXJnZXRDb2x1bW46IENvbHVtbk1vZGVsLCB0YXJnZXRTd2ltbGFuZTogU3dpbWxhbmVNb2RlbCwgZG9tRXZlbnQ6IEV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiB0aGUgb3duaW5nIFRhc2tCb2FyZCB3aGVuIGEgZHJhZyBvcGVyYXRpb24gaXMgYWJvcnRlZCAoaW52YWxpZCBkcm9wIG9yIGFib3J0ZWQgdXNpbmcgRVNDKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC52aWV3LlRhc2tCb2FyZH0gZXZlbnQuc291cmNlIE93bmluZyBUYXNrQm9hcmRcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5UYXNrTW9kZWxbXX0gZXZlbnQudGFza1JlY29yZHMgRHJhZ2dlZCB0YXNrc1xuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblRhc2tEcmFnQWJvcnQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRhc2tCb2FyZCwgdGFza1JlY29yZHM6IFRhc2tNb2RlbFtdIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiB0aGUgb3duaW5nIFRhc2tCb2FyZCB3aGVuIGEgcHJldmlvdXNseSBzdGFydGVkIGRyYWcgb3BlcmF0aW9uIGVuZHMsIG5vIG1hdHRlciB0aGVcbiAgICAgKiBvdXRjb21lIG9mIGl0ICh3aGV0aGVyIHZhbGlkLCBpbnZhbGlkIG9yIGFib3J0ZWQpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgT3duaW5nIFRhc2tCb2FyZFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLlRhc2tNb2RlbFtdfSBldmVudC50YXNrUmVjb3JkcyBBZmZlY3RlZCB0YXNrc1xuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSBtb3VzZSBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblRhc2tEcmFnRW5kOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUYXNrQm9hcmQsIHRhc2tSZWNvcmRzOiBUYXNrTW9kZWxbXSwgZG9tRXZlbnQ6IEV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiB0aGUgb3duaW5nIFRhc2tCb2FyZCB3aGVuIHRhc2sgZHJhZ2dpbmcgc3RhcnRzXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgT3duaW5nIFRhc2tCb2FyZFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLlRhc2tNb2RlbFtdfSBldmVudC50YXNrUmVjb3JkcyBUYXNrcyB0byBiZSBkcmFnZ2VkXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIG1vdXNlIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uVGFza0RyYWdTdGFydDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVGFza0JvYXJkLCB0YXNrUmVjb3JkczogVGFza01vZGVsW10sIGRvbUV2ZW50OiBFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBUYXNrQm9hcmQgd2hlbiB0YXNrcyBhcmUgc3VjY2Vzc2Z1bGx5IGRyb3BwZWQgKGFmdGVyIHRoZSBkcm9wIHRyYW5zaXRpb24gaGFzXG4gICAgICogZmluaXNoZWQpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgT3duaW5nIFRhc2tCb2FyZFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLlRhc2tNb2RlbFtdfSBldmVudC50YXNrUmVjb3JkcyBEcm9wcGVkIHRhc2tzXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuQ29sdW1uTW9kZWx9IGV2ZW50LnRhcmdldENvbHVtbiBEcm9wcGVkIG9uIHRoaXMgY29sdW1uXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuU3dpbWxhbmVNb2RlbH0gZXZlbnQudGFyZ2V0U3dpbWxhbmUgRHJvcHBlZCBpbiB0aGlzIHN3aW1sYW5lIChpZiB1c2VkKVxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSBtb3VzZSBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblRhc2tEcm9wOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUYXNrQm9hcmQsIHRhc2tSZWNvcmRzOiBUYXNrTW9kZWxbXSwgdGFyZ2V0Q29sdW1uOiBDb2x1bW5Nb2RlbCwgdGFyZ2V0U3dpbWxhbmU6IFN3aW1sYW5lTW9kZWwsIGRvbUV2ZW50OiBFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBmaXJlcyBvbiB0aGUgb3duaW5nIFRhc2tCb2FyZCBiZWZvcmUgdGhlIGNvbnRleHQgbWVudSBpcyBzaG93biBmb3IgYSB0YXNrLlxuICAgICAqIEFsbG93cyBtYW5pcHVsYXRpb24gb2YgdGhlIGl0ZW1zIHRvIHNob3cgaW4gdGhlIHNhbWUgd2F5IGFzIGluIHRoZSBbcHJvY2Vzc0l0ZW1zXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvZmVhdHVyZS9UYXNrTWVudSNjb25maWctcHJvY2Vzc0l0ZW1zKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3ZpZXcvVGFza0JvYXJkQmFzZSNldmVudC10YXNrTWVudUJlZm9yZVNob3cpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgVGhlIGdyaWRcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnV9IGV2ZW50Lm1lbnUgVGhlIG1lbnVcbiAgICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIE1lbnVJdGVtRW50cnk+fSBldmVudC5pdGVtcyBNZW51IGl0ZW0gY29uZmlnc1xuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLlRhc2tNb2RlbH0gZXZlbnQudGFza1JlY29yZCBUaGUgdGFza1xuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblRhc2tNZW51QmVmb3JlU2hvdzogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVGFza0JvYXJkLCBtZW51OiBNZW51LCBpdGVtczogUmVjb3JkPHN0cmluZywgTWVudUl0ZW1FbnRyeT4sIHRhc2tSZWNvcmQ6IFRhc2tNb2RlbCB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgb24gdGhlIG93bmluZyBUYXNrQm9hcmQgd2hlbiBhbiBpdGVtIGlzIHNlbGVjdGVkIGluIHRoZSB0YXNrIGNvbnRleHQgbWVudS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQudmlldy5UYXNrQm9hcmR9IGV2ZW50LnNvdXJjZSBUaGUgZ3JpZFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuTWVudX0gZXZlbnQubWVudSBUaGUgbWVudVxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuTWVudUl0ZW19IGV2ZW50Lml0ZW0gU2VsZWN0ZWQgbWVudSBpdGVtXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuVGFza01vZGVsfSBldmVudC50YXNrUmVjb3JkIFRoZSB0YXNrXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uVGFza01lbnVJdGVtOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBUYXNrQm9hcmQsIG1lbnU6IE1lbnUsIGl0ZW06IE1lbnVJdGVtLCB0YXNrUmVjb3JkOiBUYXNrTW9kZWwgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgb24gdGhlIG93bmluZyBUYXNrQm9hcmQgYWZ0ZXIgdGhlIGNvbnRleHQgbWVudSBpcyBzaG93biBmb3IgYSB0YXNrLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC52aWV3LlRhc2tCb2FyZH0gZXZlbnQuc291cmNlIFRoZSBncmlkXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5NZW51fSBldmVudC5tZW51IFRoZSBtZW51XG4gICAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBNZW51SXRlbUVudHJ5Pn0gZXZlbnQuaXRlbXMgTWVudSBpdGVtIGNvbmZpZ3NcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5UYXNrTW9kZWx9IGV2ZW50LnRhc2tSZWNvcmQgVGhlIHRhc2tcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25UYXNrTWVudVNob3c6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRhc2tCb2FyZCwgbWVudTogTWVudSwgaXRlbXM6IFJlY29yZDxzdHJpbmcsIE1lbnVJdGVtRW50cnk+LCB0YXNrUmVjb3JkOiBUYXNrTW9kZWwgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgb24gdGhlIG93bmluZyBUYXNrQm9hcmQgd2hlbiBhIGNoZWNrIGl0ZW0gaXMgdG9nZ2xlZCBpbiB0aGUgdGFzayBjb250ZXh0IG1lbnUuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgVGhlIGdyaWRcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnV9IGV2ZW50Lm1lbnUgVGhlIG1lbnVcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnVJdGVtfSBldmVudC5pdGVtIFNlbGVjdGVkIG1lbnUgaXRlbVxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLm1vZGVsLlRhc2tNb2RlbH0gZXZlbnQudGFza1JlY29yZCBUaGUgdGFza1xuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuY2hlY2tlZCBDaGVja2VkIG9yIG5vdFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblRhc2tNZW51VG9nZ2xlSXRlbTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVGFza0JvYXJkLCBtZW51OiBNZW51LCBpdGVtOiBNZW51SXRlbSwgdGFza1JlY29yZDogVGFza01vZGVsLCBjaGVja2VkOiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgd2hlbiB0aGUgbW91c2UgZW50ZXJzIGEgY2FyZFxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvdmlldy9UYXNrQm9hcmRCYXNlI2V2ZW50LXRhc2tNb3VzZUVudGVyKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC52aWV3LlRhc2tCb2FyZH0gZXZlbnQuc291cmNlIFRoaXMgVGFza0JvYXJkXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuVGFza01vZGVsfSBldmVudC50YXNrUmVjb3JkIFRhc2sgcmVjb3JkXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuQ29sdW1uTW9kZWx9IGV2ZW50LmNvbHVtblJlY29yZCBDb2x1bW4gcmVjb3JkIGZvciB0aGUgdGFza3MgY29sdW1uXG4gICAgICogQHBhcmFtIHtUYXNrQm9hcmQubW9kZWwuU3dpbWxhbmVNb2RlbH0gZXZlbnQuc3dpbWxhbmVSZWNvcmQgU3dpbWxhbmUgcmVjb3JkIGZvciB0aGUgdGFza3Mgc3dpbWxhbmUgKGlmIHVzZWQpXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5ldmVudCBCcm93c2VyIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uVGFza01vdXNlRW50ZXI6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRhc2tCb2FyZCwgdGFza1JlY29yZDogVGFza01vZGVsLCBjb2x1bW5SZWNvcmQ6IENvbHVtbk1vZGVsLCBzd2ltbGFuZVJlY29yZDogU3dpbWxhbmVNb2RlbCwgZXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCB3aGVuIHRoZSBtb3VzZSBsZWF2ZXMgYSBjYXJkXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC92aWV3L1Rhc2tCb2FyZEJhc2UjZXZlbnQtdGFza01vdXNlTGVhdmUpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7VGFza0JvYXJkLnZpZXcuVGFza0JvYXJkfSBldmVudC5zb3VyY2UgVGhpcyBUYXNrQm9hcmRcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5UYXNrTW9kZWx9IGV2ZW50LnRhc2tSZWNvcmQgVGFzayByZWNvcmRcbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5Db2x1bW5Nb2RlbH0gZXZlbnQuY29sdW1uUmVjb3JkIENvbHVtbiByZWNvcmQgZm9yIHRoZSB0YXNrcyBjb2x1bW5cbiAgICAgKiBAcGFyYW0ge1Rhc2tCb2FyZC5tb2RlbC5Td2ltbGFuZU1vZGVsfSBldmVudC5zd2ltbGFuZVJlY29yZCBTd2ltbGFuZSByZWNvcmQgZm9yIHRoZSB0YXNrcyBzd2ltbGFuZSAoaWYgdXNlZClcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50LmV2ZW50IEJyb3dzZXIgZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25UYXNrTW91c2VMZWF2ZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogVGFza0JvYXJkLCB0YXNrUmVjb3JkOiBUYXNrTW9kZWwsIGNvbHVtblJlY29yZDogQ29sdW1uTW9kZWwsIHN3aW1sYW5lUmVjb3JkOiBTd2ltbGFuZU1vZGVsLCBldmVudDogTW91c2VFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogQSBoZWFkZXIgW3Rvb2xdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1BhbmVsI2NvbmZpZy10b29scykgaGFzIGJlZW4gY2xpY2tlZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5Ub29sfSBldmVudC5zb3VyY2UgVGhpcyBQYW5lbC5cbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LlRvb2x9IGV2ZW50LnRvb2wgVGhlIHRvb2wgd2hpY2ggaXMgYmVpbmcgY2xpY2tlZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Ub29sQ2xpY2s6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRvb2wsIHRvb2w6IFRvb2wgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGFuZCBhcHBlbmQgdGhlIHVuZGVybHlpbmcgd2lkZ2V0XG4gICAgICovXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0XG4gICAgICAgICAgICBtZSA9IHRoaXMsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZWxlbWVudFJlZixcbiAgICAgICAgICAgICAgICBicnludHVtQ29uZmlnXG4gICAgICAgICAgICB9ID0gbWUsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaW5zdGFuY2VDbGFzcyxcbiAgICAgICAgICAgICAgICBpbnN0YW5jZU5hbWUsXG4gICAgICAgICAgICAgICAgYnJ5bnR1bUNvbmZpZ3MsXG4gICAgICAgICAgICAgICAgYnJ5bnR1bUV2ZW50c1xuICAgICAgICAgICAgfSA9IEJyeW50dW1UYXNrQm9hcmRCYXNlQ29tcG9uZW50O1xuXG4gICAgICAgIGJyeW50dW1Db25maWdzLmZpbHRlcihwcm9wID0+IHByb3AgaW4gdGhpcykuZm9yRWFjaChwcm9wID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIFdyYXBwZXJIZWxwZXIuYXBwbHlQcm9wVmFsdWUoYnJ5bnR1bUNvbmZpZywgcHJvcCwgdGhpc1twcm9wXSk7XG4gICAgICAgICAgICBpZiAoWydmZWF0dXJlcycsICdjb25maWcnXS5pbmNsdWRlcyhwcm9wKSkge1xuICAgICAgICAgICAgICAgIFdyYXBwZXJIZWxwZXIuZGV2V2FybmluZ0NvbmZpZ1Byb3AoaW5zdGFuY2VOYW1lLCBwcm9wKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgYnJ5bnR1bUV2ZW50cy5maWx0ZXIoZXZlbnQgPT4gdGhpc1tldmVudF0gJiYgdGhpc1tldmVudF0ub2JzZXJ2ZXJzLmxlbmd0aCA+IDApLmZvckVhY2goZXZlbnQgPT4ge1xuICAgICAgICAgICAgY29uc3RcbiAgICAgICAgICAgICAgICB1bmNhcGl0YWxpemUgPSAoc3RyOiBzdHJpbmcpID0+IHN0ci5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIHN0ci5zbGljZSgxKSxcbiAgICAgICAgICAgICAgICBldmVudE5hbWUgPSAoc3RyOiBzdHJpbmcpID0+IHVuY2FwaXRhbGl6ZShzdHIuc2xpY2UoMikpO1xuXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBicnludHVtQ29uZmlnLmxpc3RlbmVyc1tldmVudE5hbWUoZXZlbnQpXSA9IGUgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBtZVtldmVudF0uZW1pdChlKTtcbiAgICAgICAgICAgICAgICAvLyBFdmVudEVtaXR0ZXIgZG9lcyBub3QgcmV0dXJuIHZhbHVlcyBpbiB0aGUgbm9ybWFsIHdheSwgd29yayBhcm91bmQgaXQgYnkgc2V0dGluZyBgcmV0dXJuVmFsdWVgIGZsYWdcbiAgICAgICAgICAgICAgICAvLyBpbiBBbmd1bGFyIGxpc3RlbmVyc1xuICAgICAgICAgICAgICAgIHJldHVybiBlLnJldHVyblZhbHVlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gSWYgY29tcG9uZW50IGhhcyBubyBjb250YWluZXIgc3BlY2lmaWVkIGluIGNvbmZpZyB0aGVuIHVzZSBhZG9wdCB0byBXcmFwcGVyJ3MgZWxlbWVudFxuICAgICAgICBjb25zdFxuICAgICAgICAgICAgY29udGFpbmVyUGFyYW0gPSBbXG4gICAgICAgICAgICAgICAgJ2Fkb3B0JyxcbiAgICAgICAgICAgICAgICAnYXBwZW5kVG8nLFxuICAgICAgICAgICAgICAgICdpbnNlcnRBZnRlcicsXG4gICAgICAgICAgICAgICAgJ2luc2VydEJlZm9yZSdcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBdLmZpbmQocHJvcCA9PiBicnludHVtQ29uZmlnW3Byb3BdKTtcbiAgICAgICAgaWYgKCFjb250YWluZXJQYXJhbSkge1xuICAgICAgICAgICAgaWYgKGluc3RhbmNlTmFtZSA9PT0gJ0J1dHRvbicgfHwgZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldFJvb3ROb2RlKCkgaW5zdGFuY2VvZiBTaGFkb3dSb290KSB7XG4gICAgICAgICAgICAgICAgLy8gQnV0dG9uIHNob3VsZCBhbHdheXMgYmUgPGE+IG9yIDxidXR0b24+IGluc2lkZSBvd25lciBlbGVtZW50XG4gICAgICAgICAgICAgICAgYnJ5bnR1bUNvbmZpZy5hcHBlbmRUbyA9IGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGJyeW50dW1Db25maWcuYWRvcHQgPSBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBXcmFwcGVySGVscGVyLmRldldhcm5pbmdDb250YWluZXIoaW5zdGFuY2VOYW1lLCBjb250YWluZXJQYXJhbSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIG1lLmluc3RhbmNlID0gaW5zdGFuY2VOYW1lID09PSAnV2lkZ2V0JyA/IFdpZGdldC5jcmVhdGUoYnJ5bnR1bUNvbmZpZykgOiBuZXcgaW5zdGFuY2VDbGFzcyhicnludHVtQ29uZmlnKTtcblxuICAgICAgICAvLyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgZ3JpZEluc3RhbmNlLCBzY2hlZHVsZXJJbnN0YW5jZSBldGMuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgbWVbU3RyaW5nSGVscGVyLnVuY2FwaXRhbGl6ZShpbnN0YW5jZU5hbWUpICsgJ0luc3RhbmNlJ10gPSBtZS5pbnN0YW5jZTtcbiAgICAgICAgLy8gXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2F0Y2ggZm9yIGNoYW5nZXNcbiAgICAgKiBAcGFyYW0gY2hhbmdlc1xuICAgICAqL1xuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgY29uc3RcbiAgICAgICAgICAgIHsgaW5zdGFuY2UgfSA9IHRoaXMsXG4gICAgICAgICAgICB7IGluc3RhbmNlTmFtZSB9ID0gQnJ5bnR1bVRhc2tCb2FyZEJhc2VDb21wb25lbnQ7XG4gICAgICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIGNoYW5nZXNcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoY2hhbmdlcykuZm9yRWFjaCgoW3Byb3AsIGNoYW5nZV0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0XG4gICAgICAgICAgICAgICAgbmV3VmFsdWUgPSAoY2hhbmdlIGFzIFNpbXBsZUNoYW5nZSkuY3VycmVudFZhbHVlLFxuICAgICAgICAgICAgICAgIHsgaW5zdGFuY2UgfSA9IHRoaXMsXG4gICAgICAgICAgICAgICAgeyBicnludHVtQ29uZmlnc09ubHksIGJyeW50dW1Qcm9wcyB9ID0gQnJ5bnR1bVRhc2tCb2FyZEJhc2VDb21wb25lbnQ7XG4gICAgICAgICAgICBpZiAoYnJ5bnR1bVByb3BzLmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICAgICAgICAgICAgV3JhcHBlckhlbHBlci5hcHBseVByb3BWYWx1ZShpbnN0YW5jZSwgcHJvcCwgbmV3VmFsdWUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoYnJ5bnR1bUNvbmZpZ3NPbmx5LmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICAgICAgICAgICAgICAgIFdyYXBwZXJIZWxwZXIuZGV2V2FybmluZ1VwZGF0ZVByb3AoaW5zdGFuY2VOYW1lLCBwcm9wKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3kgdGhlIGNvbXBvbmVudFxuICAgICAqL1xuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmICh0aGlzLmluc3RhbmNlICYmIHRoaXMuaW5zdGFuY2UuZGVzdHJveSkge1xuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZS5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
|