@bryntum/taskboard-angular-thin 7.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +44 -0
- package/bryntum-taskboard-angular-thin.d.ts +5 -0
- package/bundles/bryntum-taskboard-angular-thin.umd.js +18990 -0
- package/bundles/bryntum-taskboard-angular-thin.umd.js.map +1 -0
- package/esm2015/bryntum-taskboard-angular-thin.js +5 -0
- package/esm2015/lib/bryntum-column-combo.component.js +937 -0
- package/esm2015/lib/bryntum-column-filter-field.component.js +800 -0
- package/esm2015/lib/bryntum-column-picker-button.component.js +720 -0
- package/esm2015/lib/bryntum-column-scroll-button.component.js +720 -0
- package/esm2015/lib/bryntum-project-combo.component.js +941 -0
- package/esm2015/lib/bryntum-resources-combo.component.js +937 -0
- package/esm2015/lib/bryntum-swimlane-combo.component.js +937 -0
- package/esm2015/lib/bryntum-swimlane-filter-field.component.js +808 -0
- package/esm2015/lib/bryntum-swimlane-picker-button.component.js +720 -0
- package/esm2015/lib/bryntum-swimlane-scroll-button.component.js +720 -0
- package/esm2015/lib/bryntum-tag-combo.component.js +941 -0
- package/esm2015/lib/bryntum-task-board-base.component.js +1679 -0
- package/esm2015/lib/bryntum-task-board-field-filter-picker-group.component.js +763 -0
- package/esm2015/lib/bryntum-task-board-field-filter-picker.component.js +733 -0
- package/esm2015/lib/bryntum-task-board-project-model.component.js +690 -0
- package/esm2015/lib/bryntum-task-board.component.js +1683 -0
- package/esm2015/lib/bryntum-task-color-combo.component.js +795 -0
- package/esm2015/lib/bryntum-task-filter-field.component.js +808 -0
- package/esm2015/lib/bryntum-todo-list-field.component.js +781 -0
- package/esm2015/lib/bryntum-undo-redo.component.js +690 -0
- package/esm2015/lib/bryntum-zoom-slider.component.js +666 -0
- package/esm2015/lib/taskboard.module.js +124 -0
- package/esm2015/lib/wrapper.helper.js +74 -0
- package/esm2015/public-api.js +26 -0
- package/fesm2015/bryntum-taskboard-angular-thin.js +18489 -0
- package/fesm2015/bryntum-taskboard-angular-thin.js.map +1 -0
- package/lib/bryntum-column-combo.component.d.ts +1209 -0
- package/lib/bryntum-column-filter-field.component.d.ts +989 -0
- package/lib/bryntum-column-picker-button.component.d.ts +854 -0
- package/lib/bryntum-column-scroll-button.component.d.ts +854 -0
- package/lib/bryntum-project-combo.component.d.ts +1210 -0
- package/lib/bryntum-resources-combo.component.d.ts +1208 -0
- package/lib/bryntum-swimlane-combo.component.d.ts +1208 -0
- package/lib/bryntum-swimlane-filter-field.component.d.ts +1002 -0
- package/lib/bryntum-swimlane-picker-button.component.d.ts +854 -0
- package/lib/bryntum-swimlane-scroll-button.component.d.ts +854 -0
- package/lib/bryntum-tag-combo.component.d.ts +1213 -0
- package/lib/bryntum-task-board-base.component.d.ts +1922 -0
- package/lib/bryntum-task-board-field-filter-picker-group.component.d.ts +942 -0
- package/lib/bryntum-task-board-field-filter-picker.component.d.ts +890 -0
- package/lib/bryntum-task-board-project-model.component.d.ts +733 -0
- package/lib/bryntum-task-board.component.d.ts +1924 -0
- package/lib/bryntum-task-color-combo.component.d.ts +966 -0
- package/lib/bryntum-task-filter-field.component.d.ts +1002 -0
- package/lib/bryntum-todo-list-field.component.d.ts +956 -0
- package/lib/bryntum-undo-redo.component.d.ts +832 -0
- package/lib/bryntum-zoom-slider.component.d.ts +785 -0
- package/lib/taskboard.module.d.ts +27 -0
- package/lib/wrapper.helper.d.ts +26 -0
- package/package.json +33 -0
- package/public-api.d.ts +22 -0
|
@@ -0,0 +1,690 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
2
|
+
/**
|
|
3
|
+
* Angular wrapper for Bryntum ProjectModel
|
|
4
|
+
*/
|
|
5
|
+
import { Component, EventEmitter, Output, Input } from '@angular/core';
|
|
6
|
+
import WrapperHelper from './wrapper.helper';
|
|
7
|
+
import { ProjectModel } from '@bryntum/taskboard-thin';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
export class BryntumTaskBoardProjectModelComponent {
|
|
10
|
+
constructor(element) {
|
|
11
|
+
this.bryntumConfig = {
|
|
12
|
+
adopt: undefined,
|
|
13
|
+
appendTo: undefined,
|
|
14
|
+
href: undefined,
|
|
15
|
+
angularComponent: this,
|
|
16
|
+
features: {},
|
|
17
|
+
listeners: {}
|
|
18
|
+
};
|
|
19
|
+
// Events emitters
|
|
20
|
+
/**
|
|
21
|
+
* Fires before an object is destroyed.
|
|
22
|
+
* @param {object} event Event object
|
|
23
|
+
* @param {Core.Base} event.source The Object that is being destroyed.
|
|
24
|
+
*/
|
|
25
|
+
this.onBeforeDestroy = new EventEmitter();
|
|
26
|
+
/**
|
|
27
|
+
* Fires before [load request](https://bryntum.com/products/scheduler/docs#Scheduler/crud/AbstractCrudManagerMixin#function-load) is sent. Return `false` to cancel load request.
|
|
28
|
+
* @param {object} event Event object
|
|
29
|
+
* @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager.
|
|
30
|
+
* @param {object} event.pack The data package which contains data for all stores managed by the crud manager.
|
|
31
|
+
*/
|
|
32
|
+
this.onBeforeLoad = new EventEmitter();
|
|
33
|
+
/**
|
|
34
|
+
* Fires before loaded data get applied to the stores. Return `false` to prevent data applying.
|
|
35
|
+
* This event can be used for server data preprocessing. To achieve it user can modify the `response` object.
|
|
36
|
+
* @param {object} event Event object
|
|
37
|
+
* @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager.
|
|
38
|
+
* @param {object} event.response The decoded server response object.
|
|
39
|
+
* @param {object} event.options Options provided to the [load](https://bryntum.com/products/scheduler/docs#Scheduler/crud/AbstractCrudManagerMixin#function-load) method.
|
|
40
|
+
*/
|
|
41
|
+
this.onBeforeLoadApply = new EventEmitter();
|
|
42
|
+
/**
|
|
43
|
+
* Fires before server response gets applied to the stores. Return `false` to prevent data applying.
|
|
44
|
+
* This event can be used for server data preprocessing. To achieve it user can modify the `response` object.
|
|
45
|
+
* @param {object} event Event object
|
|
46
|
+
* @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager.
|
|
47
|
+
* @param {'sync','load'} event.requestType The request type (`sync` or `load`).
|
|
48
|
+
* @param {object} event.response The decoded server response object.
|
|
49
|
+
*/
|
|
50
|
+
this.onBeforeResponseApply = new EventEmitter();
|
|
51
|
+
/**
|
|
52
|
+
* Fires before a request is sent to the server.
|
|
53
|
+
* ...
|
|
54
|
+
* [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/model/ProjectModel#event-beforeSend)
|
|
55
|
+
* @param {object} event Event object
|
|
56
|
+
* @param {Scheduler.crud.AbstractCrudManager} event.crudManager The CRUD manager.
|
|
57
|
+
* @param {object} event.params HTTP request params to be passed in the request URL.
|
|
58
|
+
* @param {'sync','load'} event.requestType CrudManager request type (`load`/`sync`)
|
|
59
|
+
* @param {object} event.requestConfig Configuration object for Ajax request call
|
|
60
|
+
*/
|
|
61
|
+
this.onBeforeSend = new EventEmitter();
|
|
62
|
+
/**
|
|
63
|
+
* Fires before [sync request](https://bryntum.com/products/scheduler/docs#Scheduler/crud/AbstractCrudManagerMixin#function-sync) is sent. Return `false` to cancel sync request.
|
|
64
|
+
* ...
|
|
65
|
+
* [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/model/ProjectModel#event-beforeSync)
|
|
66
|
+
* @param {object} event Event object
|
|
67
|
+
* @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager.
|
|
68
|
+
* @param {object} event.pack The data package which contains data for all stores managed by the crud manager.
|
|
69
|
+
*/
|
|
70
|
+
this.onBeforeSync = new EventEmitter();
|
|
71
|
+
/**
|
|
72
|
+
* Fires before sync response data get applied to the stores. Return `false` to prevent data applying.
|
|
73
|
+
* This event can be used for server data preprocessing. To achieve it user can modify the `response` object.
|
|
74
|
+
* @param {object} event Event object
|
|
75
|
+
* @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager.
|
|
76
|
+
* @param {object} event.response The decoded server response object.
|
|
77
|
+
*/
|
|
78
|
+
this.onBeforeSyncApply = new EventEmitter();
|
|
79
|
+
/**
|
|
80
|
+
* Fires when any other event is fired from the object.
|
|
81
|
+
* ...
|
|
82
|
+
* [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/model/ProjectModel#event-catchAll)
|
|
83
|
+
* @param {object} event Event object
|
|
84
|
+
* @param {{[key: string]: any, type: string}} event.event The Object that contains event details
|
|
85
|
+
* @param {string} event.event.type The type of the event which is caught by the listener
|
|
86
|
+
*/
|
|
87
|
+
this.onCatchAll = new EventEmitter();
|
|
88
|
+
/**
|
|
89
|
+
* Fired when data in any of the projects stores changes.
|
|
90
|
+
* ...
|
|
91
|
+
* [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/model/ProjectModel#event-change)
|
|
92
|
+
* @param {object} event Event object
|
|
93
|
+
* @param {Scheduler.model.SchedulerProjectModel,any} event.source This project
|
|
94
|
+
* @param {Core.data.Store} event.store Affected store
|
|
95
|
+
* @param {'remove','removeAll','add','clearchanges','filter','update','dataset','replace'} event.action Name of action which triggered the change. May be one of: * `'remove'` * `'removeAll'` * `'add'` * `'clearchanges'` * `'filter'` * `'update'` * `'dataset'` * `'replace'`
|
|
96
|
+
* @param {Core.data.Model} event.record Changed record, for actions that affects exactly one record (`'update'`)
|
|
97
|
+
* @param {Core.data.Model[]} event.records Changed records, passed for all actions except `'removeAll'`
|
|
98
|
+
* @param {object} event.changes Passed for the `'update'` action, info on which record fields changed
|
|
99
|
+
*/
|
|
100
|
+
this.onChange = new EventEmitter();
|
|
101
|
+
/**
|
|
102
|
+
* Fired when the engine has finished its calculations and the results has been written back to the records.
|
|
103
|
+
* ...
|
|
104
|
+
* [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/model/ProjectModel#event-dataReady)
|
|
105
|
+
* @param {object} event Event object
|
|
106
|
+
* @param {Scheduler.model.SchedulerProjectModel,any} event.source The project
|
|
107
|
+
* @param {boolean} event.isInitialCommit Flag that shows if this commit is initial
|
|
108
|
+
* @param {Set<any>} event.records Set of all [Model](https://bryntum.com/products/taskboard/docs/api/Core/data/Model)s that were modified in the completed transaction. Use the [modifications](https://bryntum.com/products/taskboard/docs/api/Core/data/Model#property-modifications) property of each Model to identify modified fields.
|
|
109
|
+
*/
|
|
110
|
+
this.onDataReady = new EventEmitter();
|
|
111
|
+
/**
|
|
112
|
+
* Fires when an object is destroyed.
|
|
113
|
+
* @param {object} event Event object
|
|
114
|
+
* @param {Core.Base} event.source The Object that is being destroyed.
|
|
115
|
+
*/
|
|
116
|
+
this.onDestroy = new EventEmitter();
|
|
117
|
+
/**
|
|
118
|
+
* Fires when data in any of the registered data stores is changed.
|
|
119
|
+
* ...
|
|
120
|
+
* [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/model/ProjectModel#event-hasChanges)
|
|
121
|
+
* @param {object} event Event object
|
|
122
|
+
* @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager.
|
|
123
|
+
*/
|
|
124
|
+
this.onHasChanges = new EventEmitter();
|
|
125
|
+
/**
|
|
126
|
+
* Fires on successful [load request](https://bryntum.com/products/scheduler/docs#Scheduler/crud/AbstractCrudManagerMixin#function-load) completion after data gets loaded to the stores.
|
|
127
|
+
* @param {object} event Event object
|
|
128
|
+
* @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager.
|
|
129
|
+
* @param {object} event.response The decoded server response object.
|
|
130
|
+
* @param {object} event.responseOptions [DEPRECATED] see `requestOptions`
|
|
131
|
+
* @param {object} event.requestOptions The request options passed to the request.
|
|
132
|
+
* @param {Response} event.rawResponse The native Response object
|
|
133
|
+
*/
|
|
134
|
+
this.onLoad = new EventEmitter();
|
|
135
|
+
/**
|
|
136
|
+
* Fired after [load request](https://bryntum.com/products/scheduler/docs#Scheduler/crud/AbstractCrudManagerMixin#function-load) was canceled by some [beforeLoad](https://bryntum.com/products/scheduler/docs#Scheduler/crud/AbstractCrudManagerMixin#event-beforeLoad)
|
|
137
|
+
* listener or due to incomplete prior load request.
|
|
138
|
+
* @param {object} event Event object
|
|
139
|
+
* @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager.
|
|
140
|
+
* @param {object} event.pack The data package which contains data for all stores managed by the crud manager.
|
|
141
|
+
*/
|
|
142
|
+
this.onLoadCanceled = new EventEmitter();
|
|
143
|
+
/**
|
|
144
|
+
* Fires when a [load request](https://bryntum.com/products/scheduler/docs#Scheduler/crud/AbstractCrudManagerMixin#function-load) fails.
|
|
145
|
+
* @param {object} event Event object
|
|
146
|
+
* @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager instance.
|
|
147
|
+
* @param {object} event.response The decoded server response object.
|
|
148
|
+
* @param {string} event.responseText The raw server response text
|
|
149
|
+
* @param {object} event.responseOptions [DEPRECATED] see `requestOptions`
|
|
150
|
+
* @param {object} event.requestOptions The request options passed to the request.
|
|
151
|
+
* @param {Response} event.rawResponse The native Response object
|
|
152
|
+
*/
|
|
153
|
+
this.onLoadFail = new EventEmitter();
|
|
154
|
+
/**
|
|
155
|
+
* Fires when registered stores get into state when they don't have any
|
|
156
|
+
* not persisted change. This happens after [load](https://bryntum.com/products/scheduler/docs#Scheduler/crud/AbstractCrudManagerMixin#function-load) or [sync](https://bryntum.com/products/scheduler/docs#Scheduler/crud/AbstractCrudManagerMixin#function-sync) request
|
|
157
|
+
* completion. Or this may happen after a record update which turns its fields back to their original state.
|
|
158
|
+
* ...
|
|
159
|
+
* [View online docs...](https://bryntum.com/products/taskboard/docs/api/TaskBoard/model/ProjectModel#event-noChanges)
|
|
160
|
+
* @param {object} event Event object
|
|
161
|
+
* @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager.
|
|
162
|
+
*/
|
|
163
|
+
this.onNoChanges = new EventEmitter();
|
|
164
|
+
/**
|
|
165
|
+
* Fires on successful request completion after data gets applied to the stores.
|
|
166
|
+
* @param {object} event Event object
|
|
167
|
+
* @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager.
|
|
168
|
+
* @param {'sync','load'} event.requestType The request type (`sync` or `load`).
|
|
169
|
+
* @param {object} event.response The decoded server response object.
|
|
170
|
+
* @param {object} event.responseOptions [DEPRECATED] see `requestOptions`
|
|
171
|
+
* @param {object} event.requestOptions The request options passed to the request.
|
|
172
|
+
* @param {Response} event.rawResponse The native Response object
|
|
173
|
+
*/
|
|
174
|
+
this.onRequestDone = new EventEmitter();
|
|
175
|
+
/**
|
|
176
|
+
* Fires when a request fails.
|
|
177
|
+
* @param {object} event Event object
|
|
178
|
+
* @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager instance.
|
|
179
|
+
* @param {'sync','load'} event.requestType The request type (`sync` or `load`).
|
|
180
|
+
* @param {object} event.response The decoded server response object.
|
|
181
|
+
* @param {string} event.responseText The raw server response text
|
|
182
|
+
* @param {object} event.responseOptions [DEPRECATED] see `requestOptions`
|
|
183
|
+
* @param {object} event.requestOptions The request options passed to the request.
|
|
184
|
+
* @param {Response} event.rawResponse The native Response object
|
|
185
|
+
*/
|
|
186
|
+
this.onRequestFail = new EventEmitter();
|
|
187
|
+
/**
|
|
188
|
+
* Fires on successful [sync request](https://bryntum.com/products/scheduler/docs#Scheduler/crud/AbstractCrudManagerMixin#function-sync) completion.
|
|
189
|
+
* @param {object} event Event object
|
|
190
|
+
* @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager.
|
|
191
|
+
* @param {object} event.response The decoded server response object.
|
|
192
|
+
* @param {object} event.responseOptions [DEPRECATED] see `requestOptions`
|
|
193
|
+
* @param {object} event.requestOptions The request options passed to the request.
|
|
194
|
+
* @param {Response} event.rawResponse The native Response object
|
|
195
|
+
*/
|
|
196
|
+
this.onSync = new EventEmitter();
|
|
197
|
+
/**
|
|
198
|
+
* Fires after [sync request](https://bryntum.com/products/scheduler/docs#Scheduler/crud/AbstractCrudManagerMixin#function-sync) was canceled by some [beforeSync](https://bryntum.com/products/scheduler/docs#Scheduler/crud/AbstractCrudManagerMixin#event-beforeSync) listener.
|
|
199
|
+
* @param {object} event Event object
|
|
200
|
+
* @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager.
|
|
201
|
+
* @param {object} event.pack The data package which contains data for all stores managed by the crud manager.
|
|
202
|
+
*/
|
|
203
|
+
this.onSyncCanceled = new EventEmitter();
|
|
204
|
+
/**
|
|
205
|
+
* Fires after [sync request](https://bryntum.com/products/scheduler/docs#Scheduler/crud/AbstractCrudManagerMixin#function-sync) was delayed due to incomplete previous one.
|
|
206
|
+
* @param {object} event Event object
|
|
207
|
+
* @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager.
|
|
208
|
+
* @param {object} event.arguments The arguments of [sync](https://bryntum.com/products/scheduler/docs#Scheduler/crud/AbstractCrudManagerMixin#function-sync) call.
|
|
209
|
+
*/
|
|
210
|
+
this.onSyncDelayed = new EventEmitter();
|
|
211
|
+
/**
|
|
212
|
+
* Fires when a [sync request](https://bryntum.com/products/scheduler/docs#Scheduler/crud/AbstractCrudManagerMixin#function-sync) fails.
|
|
213
|
+
* @param {object} event Event object
|
|
214
|
+
* @param {Scheduler.crud.AbstractCrudManager} event.source The CRUD manager instance.
|
|
215
|
+
* @param {object} event.response The decoded server response object.
|
|
216
|
+
* @param {string} event.responseText The raw server response text
|
|
217
|
+
* @param {object} event.responseOptions [DEPRECATED] see `requestOptions`
|
|
218
|
+
* @param {object} event.requestOptions The request options passed to the request.
|
|
219
|
+
* @param {Response} event.rawResponse The native Response object
|
|
220
|
+
*/
|
|
221
|
+
this.onSyncFail = new EventEmitter();
|
|
222
|
+
this.elementRef = element;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Create and append the underlying widget
|
|
226
|
+
*/
|
|
227
|
+
ngOnInit() {
|
|
228
|
+
const me = this, { elementRef, bryntumConfig } = me, { instanceClass, instanceName, bryntumConfigs, bryntumEvents } = BryntumTaskBoardProjectModelComponent;
|
|
229
|
+
bryntumConfigs.filter(prop => prop in this).forEach(prop => {
|
|
230
|
+
// @ts-ignore
|
|
231
|
+
WrapperHelper.applyPropValue(bryntumConfig, prop, this[prop]);
|
|
232
|
+
if (['features', 'config'].includes(prop)) {
|
|
233
|
+
WrapperHelper.devWarningConfigProp(instanceName, prop);
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
// @ts-ignore
|
|
237
|
+
bryntumEvents.filter(event => this[event] && this[event].observers.length > 0).forEach(event => {
|
|
238
|
+
const uncapitalize = (str) => str.charAt(0).toLowerCase() + str.slice(1), eventName = (str) => uncapitalize(str.slice(2));
|
|
239
|
+
// @ts-ignore
|
|
240
|
+
bryntumConfig.listeners[eventName(event)] = e => {
|
|
241
|
+
// @ts-ignore
|
|
242
|
+
me[event].emit(e);
|
|
243
|
+
// EventEmitter does not return values in the normal way, work around it by setting `returnValue` flag
|
|
244
|
+
// in Angular listeners
|
|
245
|
+
return e.returnValue;
|
|
246
|
+
};
|
|
247
|
+
});
|
|
248
|
+
// If component has no container specified in config then use adopt to Wrapper's element
|
|
249
|
+
const containerParam = [
|
|
250
|
+
'adopt',
|
|
251
|
+
'appendTo',
|
|
252
|
+
'insertAfter',
|
|
253
|
+
'insertBefore'
|
|
254
|
+
// @ts-ignore
|
|
255
|
+
].find(prop => bryntumConfig[prop]);
|
|
256
|
+
if (!containerParam) {
|
|
257
|
+
if (instanceName === 'Button' || elementRef.nativeElement.getRootNode() instanceof ShadowRoot) {
|
|
258
|
+
// Button should always be <a> or <button> inside owner element
|
|
259
|
+
bryntumConfig.appendTo = elementRef.nativeElement;
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
bryntumConfig.adopt = elementRef.nativeElement;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
WrapperHelper.devWarningContainer(instanceName, containerParam);
|
|
267
|
+
}
|
|
268
|
+
// @ts-ignore
|
|
269
|
+
me.instance = instanceName === 'Widget' ? Widget.create(bryntumConfig) : new instanceClass(bryntumConfig);
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Watch for changes
|
|
273
|
+
* @param changes
|
|
274
|
+
*/
|
|
275
|
+
ngOnChanges(changes) {
|
|
276
|
+
const { instance } = this, { instanceName } = BryntumTaskBoardProjectModelComponent;
|
|
277
|
+
if (!instance) {
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
// Iterate over all changes
|
|
281
|
+
Object.entries(changes).forEach(([prop, change]) => {
|
|
282
|
+
const newValue = change.currentValue, { instance } = this, { bryntumConfigsOnly, bryntumProps } = BryntumTaskBoardProjectModelComponent;
|
|
283
|
+
if (bryntumProps.includes(prop)) {
|
|
284
|
+
WrapperHelper.applyPropValue(instance, prop, newValue, false);
|
|
285
|
+
if (bryntumConfigsOnly.includes(prop)) {
|
|
286
|
+
WrapperHelper.devWarningUpdateProp(instanceName, prop);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Destroy the component
|
|
293
|
+
*/
|
|
294
|
+
ngOnDestroy() {
|
|
295
|
+
// @ts-ignore
|
|
296
|
+
if (this.instance && this.instance.destroy) {
|
|
297
|
+
this.instance.destroy();
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
BryntumTaskBoardProjectModelComponent.instanceClass = ProjectModel;
|
|
302
|
+
BryntumTaskBoardProjectModelComponent.instanceName = 'ProjectModel';
|
|
303
|
+
BryntumTaskBoardProjectModelComponent.bryntumEvents = [
|
|
304
|
+
'onBeforeDestroy',
|
|
305
|
+
'onBeforeLoad',
|
|
306
|
+
'onBeforeLoadApply',
|
|
307
|
+
'onBeforeResponseApply',
|
|
308
|
+
'onBeforeSend',
|
|
309
|
+
'onBeforeSync',
|
|
310
|
+
'onBeforeSyncApply',
|
|
311
|
+
'onCatchAll',
|
|
312
|
+
'onChange',
|
|
313
|
+
'onDataReady',
|
|
314
|
+
'onDestroy',
|
|
315
|
+
'onHasChanges',
|
|
316
|
+
'onLoad',
|
|
317
|
+
'onLoadCanceled',
|
|
318
|
+
'onLoadFail',
|
|
319
|
+
'onNoChanges',
|
|
320
|
+
'onRequestDone',
|
|
321
|
+
'onRequestFail',
|
|
322
|
+
'onSync',
|
|
323
|
+
'onSyncCanceled',
|
|
324
|
+
'onSyncDelayed',
|
|
325
|
+
'onSyncFail'
|
|
326
|
+
];
|
|
327
|
+
BryntumTaskBoardProjectModelComponent.bryntumFeatureNames = [];
|
|
328
|
+
BryntumTaskBoardProjectModelComponent.bryntumConfigs = BryntumTaskBoardProjectModelComponent.bryntumFeatureNames.concat([
|
|
329
|
+
'adjustDurationToDST',
|
|
330
|
+
'assignmentModelClass',
|
|
331
|
+
'assignments',
|
|
332
|
+
'assignmentsData',
|
|
333
|
+
'assignmentStore',
|
|
334
|
+
'assignmentStoreClass',
|
|
335
|
+
'autoLoad',
|
|
336
|
+
'autoSync',
|
|
337
|
+
'autoSyncTimeout',
|
|
338
|
+
'bubbleEvents',
|
|
339
|
+
'callOnFunctions',
|
|
340
|
+
'catchEventHandlerExceptions',
|
|
341
|
+
'children',
|
|
342
|
+
'crudStores',
|
|
343
|
+
'dependencies',
|
|
344
|
+
'dependenciesData',
|
|
345
|
+
'dependencyModelClass',
|
|
346
|
+
'dependencyStore',
|
|
347
|
+
'dependencyStoreClass',
|
|
348
|
+
'encoder',
|
|
349
|
+
'events',
|
|
350
|
+
'eventsData',
|
|
351
|
+
'eventStore',
|
|
352
|
+
'expanded',
|
|
353
|
+
'forceSync',
|
|
354
|
+
'id',
|
|
355
|
+
'ignoreRemoteChangesInSTM',
|
|
356
|
+
'includeChildrenInRemoveRequest',
|
|
357
|
+
'includeLegacyDataProperties',
|
|
358
|
+
'isFullyLoaded',
|
|
359
|
+
'json',
|
|
360
|
+
'listeners',
|
|
361
|
+
'loadUrl',
|
|
362
|
+
'orderedParentIndex',
|
|
363
|
+
'parentId',
|
|
364
|
+
'parentIndex',
|
|
365
|
+
'phantomIdField',
|
|
366
|
+
'phantomParentIdField',
|
|
367
|
+
'readOnly',
|
|
368
|
+
'remoteChildCount',
|
|
369
|
+
'resetIdsBeforeSync',
|
|
370
|
+
'resourceModelClass',
|
|
371
|
+
'resources',
|
|
372
|
+
'resourcesData',
|
|
373
|
+
'resourceStore',
|
|
374
|
+
'resourceStoreClass',
|
|
375
|
+
'shouldSyncDataOnLoad',
|
|
376
|
+
'silenceInitialCommit',
|
|
377
|
+
'skipSuccessProperty',
|
|
378
|
+
'stm',
|
|
379
|
+
'storeIdProperty',
|
|
380
|
+
'supportShortSyncResponse',
|
|
381
|
+
'syncApplySequence',
|
|
382
|
+
'syncUrl',
|
|
383
|
+
'taskModelClass',
|
|
384
|
+
'tasks',
|
|
385
|
+
'tasksData',
|
|
386
|
+
'taskStore',
|
|
387
|
+
'taskStoreClass',
|
|
388
|
+
'timeZone',
|
|
389
|
+
'toJSONResultFormat',
|
|
390
|
+
'trackResponseType',
|
|
391
|
+
'transport',
|
|
392
|
+
'useRawData',
|
|
393
|
+
'validateResponse',
|
|
394
|
+
'writeAllFields'
|
|
395
|
+
]);
|
|
396
|
+
BryntumTaskBoardProjectModelComponent.bryntumConfigsOnly = [
|
|
397
|
+
'adjustDurationToDST',
|
|
398
|
+
'assignmentModelClass',
|
|
399
|
+
'assignmentsData',
|
|
400
|
+
'assignmentStoreClass',
|
|
401
|
+
'autoLoad',
|
|
402
|
+
'autoSync',
|
|
403
|
+
'autoSyncTimeout',
|
|
404
|
+
'bubbleEvents',
|
|
405
|
+
'children',
|
|
406
|
+
'dependenciesData',
|
|
407
|
+
'dependencyModelClass',
|
|
408
|
+
'dependencyStoreClass',
|
|
409
|
+
'encoder',
|
|
410
|
+
'eventsData',
|
|
411
|
+
'expanded',
|
|
412
|
+
'ignoreRemoteChangesInSTM',
|
|
413
|
+
'includeChildrenInRemoveRequest',
|
|
414
|
+
'listeners',
|
|
415
|
+
'orderedParentIndex',
|
|
416
|
+
'parentIndex',
|
|
417
|
+
'phantomIdField',
|
|
418
|
+
'phantomParentIdField',
|
|
419
|
+
'resetIdsBeforeSync',
|
|
420
|
+
'resourceModelClass',
|
|
421
|
+
'resourcesData',
|
|
422
|
+
'resourceStoreClass',
|
|
423
|
+
'silenceInitialCommit',
|
|
424
|
+
'skipSuccessProperty',
|
|
425
|
+
'storeIdProperty',
|
|
426
|
+
'supportShortSyncResponse',
|
|
427
|
+
'taskModelClass',
|
|
428
|
+
'tasksData',
|
|
429
|
+
'taskStoreClass',
|
|
430
|
+
'toJSONResultFormat',
|
|
431
|
+
'trackResponseType',
|
|
432
|
+
'transport',
|
|
433
|
+
'useRawData',
|
|
434
|
+
'validateResponse',
|
|
435
|
+
'writeAllFields'
|
|
436
|
+
];
|
|
437
|
+
BryntumTaskBoardProjectModelComponent.bryntumProps = BryntumTaskBoardProjectModelComponent.bryntumFeatureNames.concat([
|
|
438
|
+
'allChildren',
|
|
439
|
+
'allUnfilteredChildren',
|
|
440
|
+
'assignments',
|
|
441
|
+
'assignmentStore',
|
|
442
|
+
'callOnFunctions',
|
|
443
|
+
'catchEventHandlerExceptions',
|
|
444
|
+
'crudStores',
|
|
445
|
+
'dependencies',
|
|
446
|
+
'dependencyStore',
|
|
447
|
+
'descendantCount',
|
|
448
|
+
'events',
|
|
449
|
+
'eventStore',
|
|
450
|
+
'forceSync',
|
|
451
|
+
'hasGeneratedId',
|
|
452
|
+
'id',
|
|
453
|
+
'includeLegacyDataProperties',
|
|
454
|
+
'inlineData',
|
|
455
|
+
'internalId',
|
|
456
|
+
'isCommitting',
|
|
457
|
+
'isCreating',
|
|
458
|
+
'isFullyLoaded',
|
|
459
|
+
'isValid',
|
|
460
|
+
'json',
|
|
461
|
+
'loadUrl',
|
|
462
|
+
'parentId',
|
|
463
|
+
'previousSiblingsTotalCount',
|
|
464
|
+
'readOnly',
|
|
465
|
+
'remoteChildCount',
|
|
466
|
+
'resources',
|
|
467
|
+
'resourceStore',
|
|
468
|
+
'resourceTimeRanges',
|
|
469
|
+
'shouldSyncDataOnLoad',
|
|
470
|
+
'stm',
|
|
471
|
+
'syncApplySequence',
|
|
472
|
+
'syncUrl',
|
|
473
|
+
'tasks',
|
|
474
|
+
'taskStore',
|
|
475
|
+
'timeRanges',
|
|
476
|
+
'timeZone',
|
|
477
|
+
'visibleDescendantCount'
|
|
478
|
+
]);
|
|
479
|
+
BryntumTaskBoardProjectModelComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.0", ngImport: i0, type: BryntumTaskBoardProjectModelComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
480
|
+
BryntumTaskBoardProjectModelComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.0", type: BryntumTaskBoardProjectModelComponent, selector: "bryntum-task-board-project-model", inputs: { adjustDurationToDST: "adjustDurationToDST", assignmentModelClass: "assignmentModelClass", assignmentsData: "assignmentsData", assignmentStoreClass: "assignmentStoreClass", autoLoad: "autoLoad", autoSync: "autoSync", autoSyncTimeout: "autoSyncTimeout", bubbleEvents: "bubbleEvents", children: "children", dependenciesData: "dependenciesData", dependencyModelClass: "dependencyModelClass", dependencyStoreClass: "dependencyStoreClass", encoder: "encoder", eventsData: "eventsData", expanded: "expanded", ignoreRemoteChangesInSTM: "ignoreRemoteChangesInSTM", includeChildrenInRemoveRequest: "includeChildrenInRemoveRequest", listeners: "listeners", orderedParentIndex: "orderedParentIndex", parentIndex: "parentIndex", phantomIdField: "phantomIdField", phantomParentIdField: "phantomParentIdField", resetIdsBeforeSync: "resetIdsBeforeSync", resourceModelClass: "resourceModelClass", resourcesData: "resourcesData", resourceStoreClass: "resourceStoreClass", silenceInitialCommit: "silenceInitialCommit", skipSuccessProperty: "skipSuccessProperty", storeIdProperty: "storeIdProperty", supportShortSyncResponse: "supportShortSyncResponse", taskModelClass: "taskModelClass", tasksData: "tasksData", taskStoreClass: "taskStoreClass", toJSONResultFormat: "toJSONResultFormat", trackResponseType: "trackResponseType", transport: "transport", useRawData: "useRawData", validateResponse: "validateResponse", writeAllFields: "writeAllFields", assignments: "assignments", assignmentStore: "assignmentStore", callOnFunctions: "callOnFunctions", catchEventHandlerExceptions: "catchEventHandlerExceptions", crudStores: "crudStores", dependencies: "dependencies", dependencyStore: "dependencyStore", events: "events", eventStore: "eventStore", forceSync: "forceSync", id: "id", includeLegacyDataProperties: "includeLegacyDataProperties", isFullyLoaded: "isFullyLoaded", json: "json", loadUrl: "loadUrl", parentId: "parentId", readOnly: "readOnly", remoteChildCount: "remoteChildCount", resources: "resources", resourceStore: "resourceStore", shouldSyncDataOnLoad: "shouldSyncDataOnLoad", stm: "stm", syncApplySequence: "syncApplySequence", syncUrl: "syncUrl", tasks: "tasks", taskStore: "taskStore", timeZone: "timeZone", allChildren: "allChildren", allUnfilteredChildren: "allUnfilteredChildren", descendantCount: "descendantCount", hasGeneratedId: "hasGeneratedId", inlineData: "inlineData", internalId: "internalId", isCommitting: "isCommitting", isCreating: "isCreating", isValid: "isValid", previousSiblingsTotalCount: "previousSiblingsTotalCount", resourceTimeRanges: "resourceTimeRanges", timeRanges: "timeRanges", visibleDescendantCount: "visibleDescendantCount" }, outputs: { onBeforeDestroy: "onBeforeDestroy", onBeforeLoad: "onBeforeLoad", onBeforeLoadApply: "onBeforeLoadApply", onBeforeResponseApply: "onBeforeResponseApply", onBeforeSend: "onBeforeSend", onBeforeSync: "onBeforeSync", onBeforeSyncApply: "onBeforeSyncApply", onCatchAll: "onCatchAll", onChange: "onChange", onDataReady: "onDataReady", onDestroy: "onDestroy", onHasChanges: "onHasChanges", onLoad: "onLoad", onLoadCanceled: "onLoadCanceled", onLoadFail: "onLoadFail", onNoChanges: "onNoChanges", onRequestDone: "onRequestDone", onRequestFail: "onRequestFail", onSync: "onSync", onSyncCanceled: "onSyncCanceled", onSyncDelayed: "onSyncDelayed", onSyncFail: "onSyncFail" }, usesOnChanges: true, ngImport: i0, template: '', isInline: true });
|
|
481
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.0", ngImport: i0, type: BryntumTaskBoardProjectModelComponent, decorators: [{
|
|
482
|
+
type: Component,
|
|
483
|
+
args: [{
|
|
484
|
+
selector: 'bryntum-task-board-project-model',
|
|
485
|
+
template: ''
|
|
486
|
+
}]
|
|
487
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { adjustDurationToDST: [{
|
|
488
|
+
type: Input
|
|
489
|
+
}], assignmentModelClass: [{
|
|
490
|
+
type: Input
|
|
491
|
+
}], assignmentsData: [{
|
|
492
|
+
type: Input
|
|
493
|
+
}], assignmentStoreClass: [{
|
|
494
|
+
type: Input
|
|
495
|
+
}], autoLoad: [{
|
|
496
|
+
type: Input
|
|
497
|
+
}], autoSync: [{
|
|
498
|
+
type: Input
|
|
499
|
+
}], autoSyncTimeout: [{
|
|
500
|
+
type: Input
|
|
501
|
+
}], bubbleEvents: [{
|
|
502
|
+
type: Input
|
|
503
|
+
}], children: [{
|
|
504
|
+
type: Input
|
|
505
|
+
}], dependenciesData: [{
|
|
506
|
+
type: Input
|
|
507
|
+
}], dependencyModelClass: [{
|
|
508
|
+
type: Input
|
|
509
|
+
}], dependencyStoreClass: [{
|
|
510
|
+
type: Input
|
|
511
|
+
}], encoder: [{
|
|
512
|
+
type: Input
|
|
513
|
+
}], eventsData: [{
|
|
514
|
+
type: Input
|
|
515
|
+
}], expanded: [{
|
|
516
|
+
type: Input
|
|
517
|
+
}], ignoreRemoteChangesInSTM: [{
|
|
518
|
+
type: Input
|
|
519
|
+
}], includeChildrenInRemoveRequest: [{
|
|
520
|
+
type: Input
|
|
521
|
+
}], listeners: [{
|
|
522
|
+
type: Input
|
|
523
|
+
}], orderedParentIndex: [{
|
|
524
|
+
type: Input
|
|
525
|
+
}], parentIndex: [{
|
|
526
|
+
type: Input
|
|
527
|
+
}], phantomIdField: [{
|
|
528
|
+
type: Input
|
|
529
|
+
}], phantomParentIdField: [{
|
|
530
|
+
type: Input
|
|
531
|
+
}], resetIdsBeforeSync: [{
|
|
532
|
+
type: Input
|
|
533
|
+
}], resourceModelClass: [{
|
|
534
|
+
type: Input
|
|
535
|
+
}], resourcesData: [{
|
|
536
|
+
type: Input
|
|
537
|
+
}], resourceStoreClass: [{
|
|
538
|
+
type: Input
|
|
539
|
+
}], silenceInitialCommit: [{
|
|
540
|
+
type: Input
|
|
541
|
+
}], skipSuccessProperty: [{
|
|
542
|
+
type: Input
|
|
543
|
+
}], storeIdProperty: [{
|
|
544
|
+
type: Input
|
|
545
|
+
}], supportShortSyncResponse: [{
|
|
546
|
+
type: Input
|
|
547
|
+
}], taskModelClass: [{
|
|
548
|
+
type: Input
|
|
549
|
+
}], tasksData: [{
|
|
550
|
+
type: Input
|
|
551
|
+
}], taskStoreClass: [{
|
|
552
|
+
type: Input
|
|
553
|
+
}], toJSONResultFormat: [{
|
|
554
|
+
type: Input
|
|
555
|
+
}], trackResponseType: [{
|
|
556
|
+
type: Input
|
|
557
|
+
}], transport: [{
|
|
558
|
+
type: Input
|
|
559
|
+
}], useRawData: [{
|
|
560
|
+
type: Input
|
|
561
|
+
}], validateResponse: [{
|
|
562
|
+
type: Input
|
|
563
|
+
}], writeAllFields: [{
|
|
564
|
+
type: Input
|
|
565
|
+
}], assignments: [{
|
|
566
|
+
type: Input
|
|
567
|
+
}], assignmentStore: [{
|
|
568
|
+
type: Input
|
|
569
|
+
}], callOnFunctions: [{
|
|
570
|
+
type: Input
|
|
571
|
+
}], catchEventHandlerExceptions: [{
|
|
572
|
+
type: Input
|
|
573
|
+
}], crudStores: [{
|
|
574
|
+
type: Input
|
|
575
|
+
}], dependencies: [{
|
|
576
|
+
type: Input
|
|
577
|
+
}], dependencyStore: [{
|
|
578
|
+
type: Input
|
|
579
|
+
}], events: [{
|
|
580
|
+
type: Input
|
|
581
|
+
}], eventStore: [{
|
|
582
|
+
type: Input
|
|
583
|
+
}], forceSync: [{
|
|
584
|
+
type: Input
|
|
585
|
+
}], id: [{
|
|
586
|
+
type: Input
|
|
587
|
+
}], includeLegacyDataProperties: [{
|
|
588
|
+
type: Input
|
|
589
|
+
}], isFullyLoaded: [{
|
|
590
|
+
type: Input
|
|
591
|
+
}], json: [{
|
|
592
|
+
type: Input
|
|
593
|
+
}], loadUrl: [{
|
|
594
|
+
type: Input
|
|
595
|
+
}], parentId: [{
|
|
596
|
+
type: Input
|
|
597
|
+
}], readOnly: [{
|
|
598
|
+
type: Input
|
|
599
|
+
}], remoteChildCount: [{
|
|
600
|
+
type: Input
|
|
601
|
+
}], resources: [{
|
|
602
|
+
type: Input
|
|
603
|
+
}], resourceStore: [{
|
|
604
|
+
type: Input
|
|
605
|
+
}], shouldSyncDataOnLoad: [{
|
|
606
|
+
type: Input
|
|
607
|
+
}], stm: [{
|
|
608
|
+
type: Input
|
|
609
|
+
}], syncApplySequence: [{
|
|
610
|
+
type: Input
|
|
611
|
+
}], syncUrl: [{
|
|
612
|
+
type: Input
|
|
613
|
+
}], tasks: [{
|
|
614
|
+
type: Input
|
|
615
|
+
}], taskStore: [{
|
|
616
|
+
type: Input
|
|
617
|
+
}], timeZone: [{
|
|
618
|
+
type: Input
|
|
619
|
+
}], allChildren: [{
|
|
620
|
+
type: Input
|
|
621
|
+
}], allUnfilteredChildren: [{
|
|
622
|
+
type: Input
|
|
623
|
+
}], descendantCount: [{
|
|
624
|
+
type: Input
|
|
625
|
+
}], hasGeneratedId: [{
|
|
626
|
+
type: Input
|
|
627
|
+
}], inlineData: [{
|
|
628
|
+
type: Input
|
|
629
|
+
}], internalId: [{
|
|
630
|
+
type: Input
|
|
631
|
+
}], isCommitting: [{
|
|
632
|
+
type: Input
|
|
633
|
+
}], isCreating: [{
|
|
634
|
+
type: Input
|
|
635
|
+
}], isValid: [{
|
|
636
|
+
type: Input
|
|
637
|
+
}], previousSiblingsTotalCount: [{
|
|
638
|
+
type: Input
|
|
639
|
+
}], resourceTimeRanges: [{
|
|
640
|
+
type: Input
|
|
641
|
+
}], timeRanges: [{
|
|
642
|
+
type: Input
|
|
643
|
+
}], visibleDescendantCount: [{
|
|
644
|
+
type: Input
|
|
645
|
+
}], onBeforeDestroy: [{
|
|
646
|
+
type: Output
|
|
647
|
+
}], onBeforeLoad: [{
|
|
648
|
+
type: Output
|
|
649
|
+
}], onBeforeLoadApply: [{
|
|
650
|
+
type: Output
|
|
651
|
+
}], onBeforeResponseApply: [{
|
|
652
|
+
type: Output
|
|
653
|
+
}], onBeforeSend: [{
|
|
654
|
+
type: Output
|
|
655
|
+
}], onBeforeSync: [{
|
|
656
|
+
type: Output
|
|
657
|
+
}], onBeforeSyncApply: [{
|
|
658
|
+
type: Output
|
|
659
|
+
}], onCatchAll: [{
|
|
660
|
+
type: Output
|
|
661
|
+
}], onChange: [{
|
|
662
|
+
type: Output
|
|
663
|
+
}], onDataReady: [{
|
|
664
|
+
type: Output
|
|
665
|
+
}], onDestroy: [{
|
|
666
|
+
type: Output
|
|
667
|
+
}], onHasChanges: [{
|
|
668
|
+
type: Output
|
|
669
|
+
}], onLoad: [{
|
|
670
|
+
type: Output
|
|
671
|
+
}], onLoadCanceled: [{
|
|
672
|
+
type: Output
|
|
673
|
+
}], onLoadFail: [{
|
|
674
|
+
type: Output
|
|
675
|
+
}], onNoChanges: [{
|
|
676
|
+
type: Output
|
|
677
|
+
}], onRequestDone: [{
|
|
678
|
+
type: Output
|
|
679
|
+
}], onRequestFail: [{
|
|
680
|
+
type: Output
|
|
681
|
+
}], onSync: [{
|
|
682
|
+
type: Output
|
|
683
|
+
}], onSyncCanceled: [{
|
|
684
|
+
type: Output
|
|
685
|
+
}], onSyncDelayed: [{
|
|
686
|
+
type: Output
|
|
687
|
+
}], onSyncFail: [{
|
|
688
|
+
type: Output
|
|
689
|
+
}] } });
|
|
690
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJ5bnR1bS10YXNrLWJvYXJkLXByb2plY3QtbW9kZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vY29tcG9uZW50L3NyYy9saWIvYnJ5bnR1bS10YXNrLWJvYXJkLXByb2plY3QtbW9kZWwuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHNEQUFzRDtBQUN0RDs7R0FFRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQWtELE1BQU0sZUFBZSxDQUFDO0FBRW5JLE9BQU8sYUFBYSxNQUFNLGtCQUFrQixDQUFDO0FBRzdDLE9BQU8sRUFBK1EsWUFBWSxFQUE0UixNQUFNLHlCQUF5QixDQUFDOztBQStaOWxCLE1BQU0sT0FBTyxxQ0FBcUM7SUF5TTlDLFlBQVksT0FBbUI7UUFUdkIsa0JBQWEsR0FBRztZQUNwQixLQUFLLEVBQWMsU0FBUztZQUM1QixRQUFRLEVBQVcsU0FBUztZQUM1QixJQUFJLEVBQWUsU0FBUztZQUM1QixnQkFBZ0IsRUFBRyxJQUFJO1lBQ3ZCLFFBQVEsRUFBVyxFQUFFO1lBQ3JCLFNBQVMsRUFBVSxFQUFFO1NBQ3hCLENBQUM7UUFnR0Ysa0JBQWtCO1FBQ2xCOzs7O1dBSUc7UUFDTyxvQkFBZSxHQUFRLElBQUksWUFBWSxFQUE4QyxDQUFDO1FBQ2hHOzs7OztXQUtHO1FBQ08saUJBQVksR0FBUSxJQUFJLFlBQVksRUFBb0csQ0FBQztRQUNuSjs7Ozs7OztXQU9HO1FBQ08sc0JBQWlCLEdBQVEsSUFBSSxZQUFZLEVBQXlILENBQUM7UUFDN0s7Ozs7Ozs7V0FPRztRQUNPLDBCQUFxQixHQUFRLElBQUksWUFBWSxFQUFvSSxDQUFDO1FBQzVMOzs7Ozs7Ozs7V0FTRztRQUNPLGlCQUFZLEdBQVEsSUFBSSxZQUFZLEVBQThJLENBQUM7UUFDN0w7Ozs7Ozs7V0FPRztRQUNPLGlCQUFZLEdBQVEsSUFBSSxZQUFZLEVBQW9HLENB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dGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbi8qKlxuICogQW5ndWxhciB3cmFwcGVyIGZvciBCcnludHVtIFByb2plY3RNb2RlbFxuICovXG5cbmltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBPdXRwdXQsIElucHV0LCBTaW1wbGVDaGFuZ2UsIFNpbXBsZUNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCBXcmFwcGVySGVscGVyIGZyb20gJy4vd3JhcHBlci5oZWxwZXInO1xuXG5pbXBvcnQgeyBCYXNlLCBNb2RlbCwgTW9kZWxDb25maWcsIFN0YXRlVHJhY2tpbmdNYW5hZ2VyLCBTdGF0ZVRyYWNraW5nTWFuYWdlckNvbmZpZywgU3RvcmUsIFN0b3JlQ29uZmlnIH0gZnJvbSAnQGJyeW50dW0vY29yZS10aGluJztcbmltcG9ydCB7IEFic3RyYWN0Q3J1ZE1hbmFnZXIsIEFzc2lnbm1lbnRNb2RlbCwgQXNzaWdubWVudE1vZGVsQ29uZmlnLCBBc3NpZ25tZW50U3RvcmUsIEFzc2lnbm1lbnRTdG9yZUNvbmZpZywgQ3J1ZE1hbmFnZXJTdG9yZURlc2NyaXB0b3IsIERlcGVuZGVuY3lNb2RlbCwgRGVwZW5kZW5jeU1vZGVsQ29uZmlnLCBEZXBlbmRlbmN5U3RvcmUsIERlcGVuZGVuY3lTdG9yZUNvbmZpZywgRXZlbnRNb2RlbCwgRXZlbnRNb2RlbENvbmZpZywgRXZlbnRTdG9yZSwgRXZlbnRTdG9yZUNvbmZpZywgUHJvamVjdE1vZGVsLCBQcm9qZWN0TW9kZWwgYXMgU2NoZWR1bGVyUHJvamVjdE1vZGVsLCBQcm9qZWN0TW9kZWxMaXN0ZW5lcnMsIFJlc291cmNlTW9kZWwsIFJlc291cmNlTW9kZWxDb25maWcsIFJlc291cmNlU3RvcmUsIFJlc291cmNlU3RvcmVDb25maWcsIFJlc291cmNlVGltZVJhbmdlTW9kZWwsIFJlc291cmNlVGltZVJhbmdlTW9kZWxDb25maWcsIFRhc2tNb2RlbCwgVGFza01vZGVsQ29uZmlnLCBUYXNrU3RvcmUsIFRhc2tTdG9yZUNvbmZpZywgVGltZVJhbmdlTW9kZWwsIFRpbWVSYW5nZU1vZGVsQ29uZmlnIH0gZnJvbSAnQGJyeW50dW0vdGFza2JvYXJkLXRoaW4nO1xuXG5pbXBvcnQgeyBTdHJpbmdIZWxwZXIgfSBmcm9tICdAYnJ5bnR1bS9jb3JlLXRoaW4nO1xuXG5leHBvcnQgdHlwZSBCcnludHVtVGFza0JvYXJkUHJvamVjdE1vZGVsUHJvcHMgPSB7XG4gICAgLy8gQ29uZmlnc1xuICAgIC8qKlxuICAgICAqIEEgZmxhZywgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBkYXRlcyBhbmQgZHVyYXRpb24gY2FsY3VsYXRpb25zIHNob3VsZCBhZGp1c3QgdGhlIHJlc3VsdCB0byBEU1QgdGltZSBzaGlmdC5cbiAgICAgKi9cbiAgICBhZGp1c3REdXJhdGlvblRvRFNUID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogVGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBhc3NpZ25tZW50IG1vZGVsIGNsYXNzLCB0byBiZSB1c2VkIGluIHRoZSBwcm9qZWN0LiBXaWxsIGJlIHNldCBhcyB0aGVcbiAgICAgKiBbbW9kZWxDbGFzc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS9kYXRhL1N0b3JlI2NvbmZpZy1tb2RlbENsYXNzKSBwcm9wZXJ0eSBvZiB0aGUgW2Fzc2lnbm1lbnRTdG9yZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcyNTY2hlZHVsZXIvbW9kZWwvUHJvamVjdE1vZGVsI3Byb3BlcnR5LWFzc2lnbm1lbnRTdG9yZSlcbiAgICAgKi9cbiAgICBhc3NpZ25tZW50TW9kZWxDbGFzcyA/IDogdHlwZW9mIEFzc2lnbm1lbnRNb2RlbFxuICAgIC8qKlxuICAgICAqIERhdGEgdXNlIHRvIGZpbGwgdGhlIFthc3NpZ25tZW50U3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL21vZGVsL1Byb2plY3RNb2RlbCNwcm9wZXJ0eS1hc3NpZ25tZW50U3RvcmUpLiBTaG91bGQgYmUgYW4gYXJyYXkgb2ZcbiAgICAgKiBbQXNzaWdubWVudE1vZGVsc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcyNTY2hlZHVsZXIvbW9kZWwvQXNzaWdubWVudE1vZGVsKSBvciBpdHMgY29uZmlndXJhdGlvbiBvYmplY3RzLlxuICAgICAqL1xuICAgIGFzc2lnbm1lbnRzID8gOiBBc3NpZ25tZW50TW9kZWxbXXxBc3NpZ25tZW50TW9kZWxDb25maWdbXVxuICAgIC8qKlxuICAgICAqIFRoZSBpbml0aWFsIGRhdGEsIHRvIGZpbGwgdGhlIFthc3NpZ25tZW50U3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL21vZGVsL1Byb2plY3RNb2RlbCNwcm9wZXJ0eS1hc3NpZ25tZW50U3RvcmUpIHdpdGguXG4gICAgICogU2hvdWxkIGJlIGFuIGFycmF5IG9mIFtBc3NpZ25tZW50TW9kZWxzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9tb2RlbC9Bc3NpZ25tZW50TW9kZWwpIG9yIGl0cyBjb25maWd1cmF0aW9uXG4gICAgICogb2JqZWN0cy5cbiAgICAgKiBAZGVwcmVjYXRlZCA2LjMuMCBVc2UgW2Fzc2lnbm1lbnRzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLWFzc2lnbm1lbnRzKSBpbnN0ZWFkXG4gICAgICovXG4gICAgYXNzaWdubWVudHNEYXRhID8gOiBBc3NpZ25tZW50TW9kZWxbXXxBc3NpZ25tZW50TW9kZWxDb25maWdbXVxuICAgIC8qKlxuICAgICAqIEFuIFtBc3NpZ25tZW50U3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL2RhdGEvQXNzaWdubWVudFN0b3JlKSBpbnN0YW5jZSBvciBhIGNvbmZpZyBvYmplY3QuXG4gICAgICovXG4gICAgYXNzaWdubWVudFN0b3JlID8gOiBBc3NpZ25tZW50U3RvcmV8QXNzaWdubWVudFN0b3JlQ29uZmlnXG4gICAgLyoqXG4gICAgICogVGhlIGNvbnN0cnVjdG9yIHRvIGNyZWF0ZSBhbiBhc3NpZ25tZW50IHN0b3JlIGluc3RhbmNlIHdpdGguIFNob3VsZCBiZSBhIGNsYXNzLCBzdWJjbGFzc2luZyB0aGVcbiAgICAgKiBbQXNzaWdubWVudFN0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9kYXRhL0Fzc2lnbm1lbnRTdG9yZSlcbiAgICAgKi9cbiAgICBhc3NpZ25tZW50U3RvcmVDbGFzcyA/IDogdHlwZW9mIEFzc2lnbm1lbnRTdG9yZXxvYmplY3RcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IGB0cnVlYCB0byBhdXRvbWF0aWNhbGx5IGNhbGwgW2xvYWRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL2NydWQvQWJzdHJhY3RDcnVkTWFuYWdlck1peGluI2Z1bmN0aW9uLWxvYWQpIG1ldGhvZCBvbiB0aGUgbmV4dCBmcmFtZSBhZnRlciBjcmVhdGlvbi5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctYXV0b0xvYWQpXG4gICAgICovXG4gICAgYXV0b0xvYWQgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgdG8gYXV0b21hdGljYWxseSBwZXJzaXN0IHN0b3JlIGNoYW5nZXMgYWZ0ZXIgZWRpdHMgYXJlIG1hZGUgaW4gYW55IG9mIHRoZSBzdG9yZXMgbW9uaXRvcmVkLlxuICAgICAqIFBsZWFzZSBub3RlIHRoYXQgc3luYyByZXF1ZXN0IHdpbGwgbm90IGJlIGludm9rZWQgaW1tZWRpYXRlbHkgYnV0IG9ubHkgYWZ0ZXJcbiAgICAgKiBbYXV0b1N5bmNUaW1lb3V0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9jcnVkL0Fic3RyYWN0Q3J1ZE1hbmFnZXJNaXhpbiNjb25maWctYXV0b1N5bmNUaW1lb3V0KSBpbnRlcnZhbC5cbiAgICAgKi9cbiAgICBhdXRvU3luYyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyB0byB3YWl0IGJlZm9yZSBwZXJzaXN0aW5nIGNoYW5nZXMgdG8gdGhlIHNlcnZlci5cbiAgICAgKiBVc2VkIHdoZW4gW2F1dG9TeW5jXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9jcnVkL0Fic3RyYWN0Q3J1ZE1hbmFnZXJNaXhpbiNjb25maWctYXV0b1N5bmMpIGlzIHNldCB0byBgdHJ1ZWAuXG4gICAgICovXG4gICAgYXV0b1N5bmNUaW1lb3V0ID8gOiBudW1iZXJcbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3Qgd2hlcmUgcHJvcGVydHkgbmFtZXMgd2l0aCBhIHRydXRoeSB2YWx1ZSBpbmRpY2F0ZSB3aGljaCBldmVudHMgc2hvdWxkIGJ1YmJsZSB1cCB0aGUgb3duZXJzaGlwXG4gICAgICogaGllcmFyY2h5IHdoZW4gdHJpZ2dlcmVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy1idWJibGVFdmVudHMpXG4gICAgICovXG4gICAgYnViYmxlRXZlbnRzID8gOiBvYmplY3RcbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIGNhbGwgb25YWFggbWV0aG9kIG5hbWVzIChlLmcuIGBvblNob3dgLCBgb25DbGlja2ApLCBhcyBhbiBlYXN5IHdheSB0byBsaXN0ZW4gZm9yIGV2ZW50cy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctY2FsbE9uRnVuY3Rpb25zKVxuICAgICAqL1xuICAgIGNhbGxPbkZ1bmN0aW9ucyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEJ5IGRlZmF1bHQsIGlmIGFuIGV2ZW50IGhhbmRsZXIgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdGhlIGVycm9yIHByb3BhZ2F0ZXMgdXAgdGhlIHN0YWNrIGFuZCB0aGVcbiAgICAgKiBhcHBsaWNhdGlvbiBzdGF0ZSBpcyB1bmRlZmluZWQuIENvZGUgd2hpY2ggZm9sbG93cyB0aGUgZXZlbnQgaGFuZGxlciB3aWxsICpub3QqIGJlIGV4ZWN1dGVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy1jYXRjaEV2ZW50SGFuZGxlckV4Y2VwdGlvbnMpXG4gICAgICovXG4gICAgY2F0Y2hFdmVudEhhbmRsZXJFeGNlcHRpb25zID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQ2hpbGQgbm9kZXMuIFRvIGFsbG93IGxvYWRpbmcgY2hpbGRyZW4gb24gZGVtYW5kLCBzcGVjaWZ5IGBjaGlsZHJlbiA6IHRydWVgIGluIHlvdXIgZGF0YS4gT21pdCB0aGUgZmllbGQgZm9yIGxlYWZcbiAgICAgKiB0YXNrcy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctY2hpbGRyZW4pXG4gICAgICovXG4gICAgY2hpbGRyZW4gPyA6IGJvb2xlYW58b2JqZWN0W118TW9kZWxbXXxNb2RlbENvbmZpZ1tdXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbGlzdCBvZiBzdG9yZXMgY29udHJvbGxlZCBieSB0aGUgQ1JVRCBtYW5hZ2VyLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy1jcnVkU3RvcmVzKVxuICAgICAqL1xuICAgIGNydWRTdG9yZXMgPyA6IFN0b3JlW118c3RyaW5nW118Q3J1ZE1hbmFnZXJTdG9yZURlc2NyaXB0b3JbXXxTdG9yZUNvbmZpZ1tdXG4gICAgLyoqXG4gICAgICogRGF0YSB1c2UgdG8gZmlsbCB0aGUgW2RlcGVuZGVuY3lTdG9yZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcyNTY2hlZHVsZXIvbW9kZWwvUHJvamVjdE1vZGVsI3Byb3BlcnR5LWRlcGVuZGVuY3lTdG9yZSkuIFNob3VsZCBiZSBhbiBhcnJheSBvZlxuICAgICAqIFtEZXBlbmRlbmN5TW9kZWxzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9tb2RlbC9EZXBlbmRlbmN5TW9kZWwpIG9yIGl0cyBjb25maWd1cmF0aW9uIG9iamVjdHMuXG4gICAgICovXG4gICAgZGVwZW5kZW5jaWVzID8gOiBEZXBlbmRlbmN5TW9kZWxbXXxEZXBlbmRlbmN5TW9kZWxDb25maWdbXVxuICAgIC8qKlxuICAgICAqIFRoZSBpbml0aWFsIGRhdGEsIHRvIGZpbGwgdGhlIFtkZXBlbmRlbmN5U3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL21vZGVsL1Byb2plY3RNb2RlbCNwcm9wZXJ0eS1kZXBlbmRlbmN5U3RvcmUpIHdpdGguXG4gICAgICogU2hvdWxkIGJlIGFuIGFycmF5IG9mIFtEZXBlbmRlbmN5TW9kZWxzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9tb2RlbC9EZXBlbmRlbmN5TW9kZWwpIG9yIGl0cyBjb25maWd1cmF0aW9uXG4gICAgICogb2JqZWN0cy5cbiAgICAgKiBAZGVwcmVjYXRlZCA2LjMuMCBVc2UgW2RlcGVuZGVuY2llc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcyNTY2hlZHVsZXIvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy1kZXBlbmRlbmNpZXMpIGluc3RlYWRcbiAgICAgKi9cbiAgICBkZXBlbmRlbmNpZXNEYXRhID8gOiBEZXBlbmRlbmN5TW9kZWxbXXxEZXBlbmRlbmN5TW9kZWxDb25maWdbXVxuICAgIC8qKlxuICAgICAqIFRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgZGVwZW5kZW5jeSBtb2RlbCBjbGFzcywgdG8gYmUgdXNlZCBpbiB0aGUgcHJvamVjdC4gV2lsbCBiZSBzZXQgYXMgdGhlXG4gICAgICogW21vZGVsQ2xhc3NdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvZGF0YS9TdG9yZSNjb25maWctbW9kZWxDbGFzcykgcHJvcGVydHkgb2YgdGhlIFtkZXBlbmRlbmN5U3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL21vZGVsL1Byb2plY3RNb2RlbCNwcm9wZXJ0eS1kZXBlbmRlbmN5U3RvcmUpXG4gICAgICovXG4gICAgZGVwZW5kZW5jeU1vZGVsQ2xhc3MgPyA6IHR5cGVvZiBEZXBlbmRlbmN5TW9kZWxcbiAgICAvKipcbiAgICAgKiBBIFtEZXBlbmRlbmN5U3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL2RhdGEvRGVwZW5kZW5jeVN0b3JlKSBpbnN0YW5jZSBvciBhIGNvbmZpZyBvYmplY3QuXG4gICAgICovXG4gICAgZGVwZW5kZW5jeVN0b3JlID8gOiBEZXBlbmRlbmN5U3RvcmV8RGVwZW5kZW5jeVN0b3JlQ29uZmlnXG4gICAgLyoqXG4gICAgICogVGhlIGNvbnN0cnVjdG9yIHRvIGNyZWF0ZSBhIGRlcGVuZGVuY3kgc3RvcmUgaW5zdGFuY2Ugd2l0aC4gU2hvdWxkIGJlIGEgY2xhc3MsIHN1YmNsYXNzaW5nIHRoZVxuICAgICAqIFtEZXBlbmRlbmN5U3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL2RhdGEvRGVwZW5kZW5jeVN0b3JlKVxuICAgICAqL1xuICAgIGRlcGVuZGVuY3lTdG9yZUNsYXNzID8gOiB0eXBlb2YgRGVwZW5kZW5jeVN0b3JlfG9iamVjdFxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyYXRpb24gb2YgdGhlIEpTT04gZW5jb2RlciB1c2VkIGJ5IHRoZSAqQ3J1ZCBNYW5hZ2VyKi5cbiAgICAgKi9cbiAgICBlbmNvZGVyID8gOiB7XG4gICAgICAgIHJlcXVlc3REYXRhPzogb2JqZWN0XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERhdGEgdXNlIHRvIGZpbGwgdGhlIFtldmVudFN0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9tb2RlbC9Qcm9qZWN0TW9kZWwjcHJvcGVydHktZXZlbnRTdG9yZSkuIFNob3VsZCBiZSBhbiBhcnJheSBvZlxuICAgICAqIFtFdmVudE1vZGVsc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcyNTY2hlZHVsZXIvbW9kZWwvRXZlbnRNb2RlbCkgb3IgaXRzIGNvbmZpZ3VyYXRpb24gb2JqZWN0cy5cbiAgICAgKi9cbiAgICBldmVudHMgPyA6IEV2ZW50TW9kZWxbXXxFdmVudE1vZGVsQ29uZmlnW11cbiAgICAvKipcbiAgICAgKiBUaGUgaW5pdGlhbCBkYXRhLCB0byBmaWxsIHRoZSBbZXZlbnRTdG9yZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcyNTY2hlZHVsZXIvbW9kZWwvUHJvamVjdE1vZGVsI3Byb3BlcnR5LWV2ZW50U3RvcmUpIHdpdGguXG4gICAgICogU2hvdWxkIGJlIGFuIGFycmF5IG9mIFtFdmVudE1vZGVsc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcyNTY2hlZHVsZXIvbW9kZWwvRXZlbnRNb2RlbCkgb3IgaXRzIGNvbmZpZ3VyYXRpb24gb2JqZWN0cy5cbiAgICAgKiBAZGVwcmVjYXRlZCA2LjMuMCBVc2UgW2V2ZW50c10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcyNTY2hlZHVsZXIvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy1ldmVudHMpIGluc3RlYWRcbiAgICAgKi9cbiAgICBldmVudHNEYXRhID8gOiBFdmVudE1vZGVsW118RXZlbnRNb2RlbENvbmZpZ1tdXG4gICAgLyoqXG4gICAgICogQW4gW0V2ZW50U3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL2RhdGEvRXZlbnRTdG9yZSkgaW5zdGFuY2Ugb3IgYSBjb25maWcgb2JqZWN0LlxuICAgICAqL1xuICAgIGV2ZW50U3RvcmUgPyA6IEV2ZW50U3RvcmV8RXZlbnRTdG9yZUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIFN0YXJ0IGV4cGFuZGVkIG9yIG5vdCAob25seSB2YWxpZCBmb3IgdHJlZSBkYXRhKVxuICAgICAqL1xuICAgIGV4cGFuZGVkID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBhcyBgdHJ1ZWAgdG8gZm9yY2Ugc3luYyByZXF1ZXN0cyB0byBiZSBzZW50IHdoZW4gY2FsbGluZyBgc3luYygpYCwgZXZlbiBpZiB0aGVyZSBhcmUgbm8gbG9jYWxcbiAgICAgKiBjaGFuZ2VzLiBVc2VmdWwgaW4gYSBwb2xsaW5nIHNjZW5hcmlvLCB0byBrZWVwIGNsaWVudCB1cCB0byBkYXRlIHdpdGggdGhlIGJhY2tlbmQuXG4gICAgICovXG4gICAgZm9yY2VTeW5jID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZWNvcmQuIE1pZ2h0IGJlIG1hcHBlZCB0byBhbm90aGVyIGRhdGFTb3VyY2UgdXNpbmcgaWRGaWVsZCwgYnV0IGFsd2F5cyBleHBvc2VkIGFzXG4gICAgICogcmVjb3JkLmlkLiBXaWxsIGdldCBhIGdlbmVyYXRlZCB2YWx1ZSBpZiBub25lIGlzIHNwZWNpZmllZCBpbiByZWNvcmRzIGRhdGEuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLWlkKVxuICAgICAqL1xuICAgIGlkID8gOiBzdHJpbmd8bnVtYmVyXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGB0cnVlYCB0byBtYWtlIFNUTSBpZ25vcmUgY2hhbmdlcyBjb21pbmcgZnJvbSB0aGUgYmFja2VuZC4gVGhpcyB3aWxsIGFsbG93IHVzZXIgdG8gb25seSB1bmRvIHJlZG9cbiAgICAgKiBsb2NhbCBjaGFuZ2VzLlxuICAgICAqL1xuICAgIGlnbm9yZVJlbW90ZUNoYW5nZXNJblNUTSA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFNldCB0byBgZmFsc2VgIHRvIG9ubHkgaW5jbHVkZSB0aGUgaWQgb2YgYSByZW1vdmVkIHBhcmVudCBub2RlIGluIHRoZSByZXF1ZXN0IHRvIHRoZSBiYWNrZW5kIChhbHNvXG4gICAgICogYWZmZWN0cyBwcm9ncmFtbWF0aWMgY2FsbHMgdG8gZ2V0IFtjaGFuZ2VzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9jcnVkL0Fic3RyYWN0Q3J1ZE1hbmFnZXJNaXhpbiNwcm9wZXJ0eS1jaGFuZ2VzKSBldGMuKSwgYW5kIG5vdCB0aGUgaWRzIG9mIGl0cyBjaGlsZHJlbi5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctaW5jbHVkZUNoaWxkcmVuSW5SZW1vdmVSZXF1ZXN0KVxuICAgICAqL1xuICAgIGluY2x1ZGVDaGlsZHJlbkluUmVtb3ZlUmVxdWVzdCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gaW5jbHVkZSBsZWdhY3kgZGF0YSBwcm9wZXJ0aWVzIGluIHRoZSBKU09OIC8gaW5saW5lRGF0YSBvdXRwdXQuIFRoZSBsZWdhY3kgZGF0YSBwcm9wZXJ0aWVzIGFyZVxuICAgICAqIHRoZSBgeHhEYXRhYCAoYGV2ZW50c0RhdGFgLCBgcmVzb3VyY2VzRGF0YWAgZXRjLikgcHJvcGVydGllcyB0aGF0IGFyZSBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW5cbiAgICAgKiB0aGUgZnV0dXJlLlxuICAgICAqIEBkZXByZWNhdGVkIDYuMy4wIFRoaXMgY29uZmlnIHdpbGwgYmUgcmVtb3ZlZCB3aGVuIHRoZSBldmVudHNEYXRhLCByZXNvdXJjZXNEYXRhIGV0Yy4gcHJvcGVydGllcyBhcmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLlxuICAgICAqL1xuICAgIGluY2x1ZGVMZWdhY3lEYXRhUHJvcGVydGllcyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFRoaXMgZmllbGQgaXMgYWRkZWQgdG8gdGhlIGNsYXNzIGF0IHJ1bnRpbWUgd2hlbiB0aGUgU3RvcmUgaXMgY29uZmlndXJlZCB3aXRoXG4gICAgICogW2xhenlMb2FkXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL2RhdGEvU3RvcmUjY29uZmlnLWxhenlMb2FkKS4gSWYgc2V0IG9uIGEgcGFyZW50IHJlY29yZCBhdCBsb2FkIHRpbWUsIHRoYXQgcGFyZW50IHdpbGwgbm90IGNhdXNlIGFueVxuICAgICAqIG1vcmUgY2hpbGQgbG9hZCByZXF1ZXN0cy4gSWYgb21pdHRlZCwgaXQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHNldCB0byBgdHJ1ZWAgd2hlbiBhIGxvYWQgcmVxdWVzdCByZWNlaXZlcyBmZXdlclxuICAgICAqIGNoaWxkIHJlY29yZHMgdGhhbiByZXF1ZXN0ZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLWlzRnVsbHlMb2FkZWQpXG4gICAgICovXG4gICAgaXNGdWxseUxvYWRlZCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFByb2plY3QgZGF0YSBhcyBhIEpTT04gc3RyaW5nLCB1c2VkIHRvIHBvcHVsYXRlIGl0cyBzdG9yZXMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLWpzb24pXG4gICAgICovXG4gICAganNvbiA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogVGhlIGxpc3RlbmVyIHNldCBmb3IgdGhpcyBvYmplY3QuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLWxpc3RlbmVycylcbiAgICAgKi9cbiAgICBsaXN0ZW5lcnMgPyA6IFByb2plY3RNb2RlbExpc3RlbmVyc1xuICAgIC8qKlxuICAgICAqIENvbnZlbmllbmNlIHNob3J0Y3V0IHRvIHNldCBvbmx5IHRoZSB1cmwgdG8gbG9hZCBmcm9tLCB3aGVuIHlvdSBkbyBub3QgbmVlZCB0byBzdXBwbHkgYW55IG90aGVyIGNvbmZpZ1xuICAgICAqIG9wdGlvbnMgaW4gdGhlIGBsb2FkYCBzZWN0aW9uIG9mIHRoZSBgdHJhbnNwb3J0YCBjb25maWcuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLWxvYWRVcmwpXG4gICAgICovXG4gICAgbG9hZFVybCA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBhIHJlYWQtb25seSBmaWVsZCBwcm92aWRlZCBpbiBzZXJ2ZXIgc3luY2hyb25pemF0aW9uIHBhY2tldHMgdG8gc3BlY2lmeVxuICAgICAqIHdoaWNoIHBvc2l0aW9uIHRoZSBub2RlIHRha2VzIGluIHRoZSBwYXJlbnQncyBvcmRlcmVkIGNoaWxkcmVuIGFycmF5LlxuICAgICAqIFRoaXMgaW5kZXggaXMgc2V0IG9uIGxvYWQgYW5kIGdldHMgdXBkYXRlZCBvbiByZW9yZGVyaW5nIG5vZGVzIGluIHRyZWUuIFNvcnRpbmcgYW5kIGZpbHRlcmluZ1xuICAgICAqIGhhdmUgbm8gZWZmZWN0IG9uIGl0LlxuICAgICAqL1xuICAgIG9yZGVyZWRQYXJlbnRJbmRleCA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBhIHJlYWQtb25seSBmaWVsZCBwcm92aWRlZCBpbiBzZXJ2ZXIgc3luY2hyb25pemF0aW9uIHBhY2tldHMgdG8gc3BlY2lmeVxuICAgICAqIHdoaWNoIHJlY29yZCBpZCBpcyB0aGUgcGFyZW50IG9mIHRoZSByZWNvcmQuXG4gICAgICovXG4gICAgcGFyZW50SWQgPyA6IHN0cmluZ3xudW1iZXJ8bnVsbFxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYSByZWFkLW9ubHkgZmllbGQgcHJvdmlkZWQgaW4gc2VydmVyIHN5bmNocm9uaXphdGlvbiBwYWNrZXRzIHRvIHNwZWNpZnlcbiAgICAgKiB3aGljaCBwb3NpdGlvbiB0aGUgbm9kZSB0YWtlcyBpbiB0aGUgcGFyZW50J3MgY2hpbGRyZW4gYXJyYXkuXG4gICAgICogVGhpcyBpbmRleCBpcyBzZXQgb24gbG9hZCBhbmQgZ2V0cyB1cGRhdGVkIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgcm93IHJlb3JkZXJpbmcsIHNvcnRpbmcsIGV0Yy5cbiAgICAgKiBUbyBzYXZlIHRoZSBvcmRlciwgbmVlZCB0byBwZXJzaXN0IHRoZSBmaWVsZCBvbiB0aGUgc2VydmVyIGFuZCB3aGVuIGRhdGEgaXMgZmV0Y2hlZCB0byBiZSBsb2FkZWQsXG4gICAgICogbmVlZCB0byBzb3J0IGJ5IHRoaXMgZmllbGQuXG4gICAgICovXG4gICAgcGFyZW50SW5kZXggPyA6IG51bWJlclxuICAgIC8qKlxuICAgICAqIEZpZWxkIG5hbWUgdG8gYmUgdXNlZCB0byB0cmFuc2ZlciBhIHBoYW50b20gcmVjb3JkIGlkZW50aWZpZXIuXG4gICAgICovXG4gICAgcGhhbnRvbUlkRmllbGQgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIEZpZWxkIG5hbWUgdG8gYmUgdXNlZCB0byB0cmFuc2ZlciBhIHBoYW50b20gcGFyZW50IHJlY29yZCBpZGVudGlmaWVyLlxuICAgICAqL1xuICAgIHBoYW50b21QYXJlbnRJZEZpZWxkID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBGbGFnIHRoZSByZWNvcmQgYXMgcmVhZC1vbmx5IG9uIHRoZSBVSSBsZXZlbCwgcHJldmVudGluZyB0aGUgZW5kIHVzZXIgZnJvbSBtYW5pcHVsYXRpbmcgaXQgdXNpbmcgZWRpdGluZ1xuICAgICAqIGZlYXR1cmVzIHN1Y2ggYXMgY2VsbCBlZGl0aW5nIGFuZCBldmVudCBkcmFnZ2luZy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctcmVhZE9ubHkpXG4gICAgICovXG4gICAgcmVhZE9ubHkgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZpZWxkIGlzIGFkZGVkIHRvIHRoZSBjbGFzcyBhdCBydW50aW1lIHdoZW4gdGhlIFN0b3JlIGlzIGNvbmZpZ3VyZWQgd2l0aFxuICAgICAqIFtsYXp5TG9hZF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS9kYXRhL1N0b3JlI2NvbmZpZy1sYXp5TG9hZCkuIFRoZVxuICAgICAqIG51bWJlciBzcGVjaWZpZWQgc2hvdWxkIHJlZmxlY3QgdGhlIDxzdHJvbmc+dG90YWw8L3N0cm9uZz4gYW1vdW50IG9mIGNoaWxkcmVuIG9mIGEgcGFyZW50IG5vZGUsIGluY2x1ZGluZyBuZXN0ZWQgZGVzY2VuZGFudHMuXG4gICAgICogQGRlcHJlY2F0ZWQgVGhpcyBmaWVsZCBoYXMgYmVlbiBkZXByZWNhdGVkLiBQbGVhc2UgcmVhZCB0aGUgW2d1aWRlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9ndWlkZS9HcmlkL2RhdGEvbGF6eWxvYWRpbmcpIHRvIGZpbmQgb3V0IGlmIHlvdXIgYXBwIG5lZWRzIHRvIHVzZSB0aGUgbmV3IFtpc0Z1bGx5TG9hZGVkXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL2RhdGEvbWl4aW4vVHJlZU5vZGUjZmllbGQtaXNGdWxseUxvYWRlZCkgZmllbGQuXG4gICAgICovXG4gICAgcmVtb3RlQ2hpbGRDb3VudCA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogYFRydWVgIHRvIHJlc2V0IGlkZW50aWZpZXJzIChkZWZpbmVkIGJ5IGBpZEZpZWxkYCBjb25maWcpIG9mIHBoYW50b20gcmVjb3JkcyBiZWZvcmUgc3VibWl0dGluZyB0aGVtXG4gICAgICogdG8gdGhlIHNlcnZlci5cbiAgICAgKi9cbiAgICByZXNldElkc0JlZm9yZVN5bmMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBUaGUgY29uc3RydWN0b3Igb2YgdGhlIHJlc291cmNlIG1vZGVsIGNsYXNzLCB0byBiZSB1c2VkIGluIHRoZSBwcm9qZWN0LiBXaWxsIGJlIHNldCBhcyB0aGVcbiAgICAgKiBbbW9kZWxDbGFzc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS9kYXRhL1N0b3JlI2NvbmZpZy1tb2RlbENsYXNzKSBwcm9wZXJ0eSBvZiB0aGUgW3Jlc291cmNlU3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL21vZGVsL1Byb2plY3RNb2RlbCNwcm9wZXJ0eS1yZXNvdXJjZVN0b3JlKVxuICAgICAqL1xuICAgIHJlc291cmNlTW9kZWxDbGFzcyA/IDogdHlwZW9mIFJlc291cmNlTW9kZWxcbiAgICAvKipcbiAgICAgKiBEYXRhIHVzZSB0byBmaWxsIHRoZSBbcmVzb3VyY2VTdG9yZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcyNTY2hlZHVsZXIvbW9kZWwvUHJvamVjdE1vZGVsI3Byb3BlcnR5LXJlc291cmNlU3RvcmUpLiBTaG91bGQgYmUgYW4gYXJyYXkgb2ZcbiAgICAgKiBbUmVzb3VyY2VNb2RlbHNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL21vZGVsL1Jlc291cmNlTW9kZWwpIG9yIGl0cyBjb25maWd1cmF0aW9uIG9iamVjdHMuXG4gICAgICovXG4gICAgcmVzb3VyY2VzID8gOiBSZXNvdXJjZU1vZGVsW118UmVzb3VyY2VNb2RlbENvbmZpZ1tdXG4gICAgLyoqXG4gICAgICogVGhlIGluaXRpYWwgZGF0YSwgdG8gZmlsbCB0aGUgW3Jlc291cmNlU3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL21vZGVsL1Byb2plY3RNb2RlbCNwcm9wZXJ0eS1yZXNvdXJjZVN0b3JlKSB3aXRoLlxuICAgICAqIFNob3VsZCBiZSBhbiBhcnJheSBvZiBbUmVzb3VyY2VNb2RlbHNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL21vZGVsL1Jlc291cmNlTW9kZWwpIG9yIGl0cyBjb25maWd1cmF0aW9uIG9iamVjdHMuXG4gICAgICogQGRlcHJlY2F0ZWQgNi4zLjAgVXNlIFtyZXNvdXJjZXNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctcmVzb3VyY2VzKSBpbnN0ZWFkXG4gICAgICovXG4gICAgcmVzb3VyY2VzRGF0YSA/IDogUmVzb3VyY2VNb2RlbFtdfFJlc291cmNlTW9kZWxDb25maWdbXVxuICAgIC8qKlxuICAgICAqIEEgW1Jlc291cmNlU3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL2RhdGEvUmVzb3VyY2VTdG9yZSkgaW5zdGFuY2Ugb3IgYSBjb25maWcgb2JqZWN0LlxuICAgICAqL1xuICAgIHJlc291cmNlU3RvcmUgPyA6IFJlc291cmNlU3RvcmV8UmVzb3VyY2VTdG9yZUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25zdHJ1Y3RvciB0byBjcmVhdGUgYSByZXNvdXJjZSBzdG9yZSBpbnN0YW5jZSB3aXRoLiBTaG91bGQgYmUgYSBjbGFzcywgc3ViY2xhc3NpbmcgdGhlXG4gICAgICogW1Jlc291cmNlU3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL2RhdGEvUmVzb3VyY2VTdG9yZSlcbiAgICAgKi9cbiAgICByZXNvdXJjZVN0b3JlQ2xhc3MgPyA6IHR5cGVvZiBSZXNvdXJjZVN0b3JlfG9iamVjdFxuICAgIC8qKlxuICAgICAqIEV4cGVyaW1lbnRhbCBob29rIHRoYXQgbGV0cyB0aGUgYXBwIGRldGVybWluZSBpZiBhIGJvdW5kIGRhdGFzZXQgbmVlZHMgc3luY2luZyB3aXRoIHRoZSBzdG9yZSBvciBub3QsIGFuZFxuICAgICAqIGlmIGl0IGRvZXMgLSB3aGljaCByZWNvcmRzIHRoYXQgc2hvdWxkIGJlIHByb2Nlc3NlZC4gT25seSBjYWxsZWQgZm9yIHN0b3JlcyB0aGF0IGFyZSBjb25maWd1cmVkIHdpdGhcbiAgICAgKiBgc3luY0RhdGFPbkxvYWQ6IHRydWVgICh3aGljaCBpcyB0aGUgZGVmYXVsdCBpbiB0aGUgUmVhY3QsIEFuZ3VsYXIgYW5kIFZ1ZSB3cmFwcGVycykuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLXNob3VsZFN5bmNEYXRhT25Mb2FkKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIE9wdGlvbnMgcGFzc2VkIGJ5IHRoZSBzdG9yZSB0byB0aGlzIGhvb2tcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5TdG9yZX0gb3B0aW9ucy5zdG9yZSBTdG9yZSBhYm91dCB0byBiZSBzeW5jZWRcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gb3B0aW9ucy5yZWNvcmRzIFJlY29yZHMgY3VycmVudGx5IGluIHRoZSBzdG9yZVxuICAgICAqIEBwYXJhbSB7b2JqZWN0W119IG9wdGlvbnMuZGF0YSBJbmNvbWluZyBkYXRhXG4gICAgICogQHJldHVybnMge1NldDxhbnk+LGJvb2xlYW59IFJldHVybiBgZmFsc2VgIHRvIHByZXZlbnQgdGhlIHN0b3JlIGZyb20gc3luY2luZywgb3IgYSBzZXQgb2YgcmVjb3JkIGlkcyB0aGF0IG5lZWQgZnVydGhlciBwcm9jZXNzaW5nIChmb3IgcmVjb3JkcyB0aGF0IGhhcyBzb21lIGtpbmQgb2YgY2hhbmdlLCBlZy4gYW4gdXBkYXRlLCByZW1vdmFsIG9yIGFkZGl0aW9uKVxuICAgICAqL1xuICAgIHNob3VsZFN5bmNEYXRhT25Mb2FkID8gOiAob3B0aW9uczogeyBzdG9yZTogU3RvcmUsIHJlY29yZHM6IE1vZGVsLCBkYXRhOiBvYmplY3RbXSB9KSA9PiBTZXQ8YW55Pnxib29sZWFuXG4gICAgLyoqXG4gICAgICogU2lsZW5jZXMgcHJvcGFnYXRpb25zIGNhdXNlZCBieSB0aGUgcHJvamVjdCBsb2FkaW5nLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy1zaWxlbmNlSW5pdGlhbENvbW1pdClcbiAgICAgKi9cbiAgICBzaWxlbmNlSW5pdGlhbENvbW1pdCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgIHRyZWF0cyBwYXJzZWQgcmVzcG9uc2VzIHdpdGhvdXQgYHN1Y2Nlc3NgIHByb3BlcnR5IGFzIHN1Y2Nlc3NmdWwuXG4gICAgICogSW4gdGhpcyBtb2RlIGEgcGFyc2VkIHJlc3BvbnNlIGlzIHRyZWF0ZWQgYXMgaW52YWxpZCBpZiBpdCBoYXMgZXhwbGljaXRseSBzZXQgYHN1Y2Nlc3MgOiBmYWxzZWAuXG4gICAgICovXG4gICAgc2tpcFN1Y2Nlc3NQcm9wZXJ0eSA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byBwcm92aWRlIHRvIHRoZSBTVE0gbWFuYWdlclxuICAgICAqL1xuICAgIHN0bSA/IDogU3RhdGVUcmFja2luZ01hbmFnZXJDb25maWd8U3RhdGVUcmFja2luZ01hbmFnZXJcbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIGEgc3RvcmUgcHJvcGVydHkgdG8gcmV0cmlldmUgc3RvcmUgaWRlbnRpZmllcnMgZnJvbS4gTWFrZSBzdXJlIHlvdSBoYXZlIGFuIGluc3RhbmNlIG9mIGFcbiAgICAgKiBzdG9yZSB0byB1c2UgaXQgYnkgaWQuIFN0b3JlIGlkZW50aWZpZXIgaXMgdXNlZCBhcyBhIGNvbnRhaW5lciBuYW1lIGhvbGRpbmcgY29ycmVzcG9uZGluZyBzdG9yZSBkYXRhXG4gICAgICogd2hpbGUgdHJhbnNmZXJyaW5nIHRoZW0gdG8vZnJvbSB0aGUgc2VydmVyLiBCeSBkZWZhdWx0LCBgaWRgIHByb3BlcnR5IGlzIHVzZWQuIEFuZCBpbiBjYXNlIGFcbiAgICAgKiBjb250YWluZXIgaWRlbnRpZmllciBoYXMgdG8gZGlmZmVyIHRoaXMgY29uZmlnIGNhbiBiZSB1c2VkOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy1zdG9yZUlkUHJvcGVydHkpXG4gICAgICovXG4gICAgc3RvcmVJZFByb3BlcnR5ID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCB0aGUgQ3J1ZCBNYW5hZ2VyIGRvZXMgbm90IHJlcXVpcmUgYWxsIHVwZGF0ZWQgYW5kIHJlbW92ZWQgcmVjb3JkcyB0byBiZSBtZW50aW9uZWQgaW4gdGhlXG4gICAgICogKnN5bmMqIHJlc3BvbnNlLiBJbiB0aGlzIGNhc2UgcmVzcG9uc2Ugc2hvdWxkIGluY2x1ZGUgb25seSBzZXJ2ZXIgc2lkZSBjaGFuZ2VzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy1zdXBwb3J0U2hvcnRTeW5jUmVzcG9uc2UpXG4gICAgICovXG4gICAgc3VwcG9ydFNob3J0U3luY1Jlc3BvbnNlID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2Ygc3RvcmUgaWRlbnRpZmllcnMgc2V0cyBhbiBhbHRlcm5hdGl2ZSBzeW5jIHJlc3BvbnNlcyBhcHBseSBvcmRlci5cbiAgICAgKiBCeSBkZWZhdWx0LCB0aGUgb3JkZXIgaW4gd2hpY2ggc3luYyByZXNwb25zZXMgYXJlIGFwcGxpZWQgdG8gdGhlIHN0b3JlcyBpcyB0aGUgc2FtZSBhcyB0aGV5XG4gICAgICogcmVnaXN0ZXJlZCBpbi4gQnV0IGluIGNhc2Ugb2Ygc29tZSB0cmlja3kgZGVwZW5kZW5jaWVzIGJldHdlZW4gc3RvcmVzIHRoaXMgb3JkZXIgY2FuIGJlIGNoYW5nZWQ6XG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLXN5bmNBcHBseVNlcXVlbmNlKVxuICAgICAqL1xuICAgIHN5bmNBcHBseVNlcXVlbmNlID8gOiBzdHJpbmdbXXxDcnVkTWFuYWdlclN0b3JlRGVzY3JpcHRvcltdXG4gICAgLyoqXG4gICAgICogQ29udmVuaWVuY2Ugc2hvcnRjdXQgdG8gc2V0IG9ubHkgdGhlIHVybCB0byBzeW5jIHRvLCB3aGVuIHlvdSBkbyBub3QgbmVlZCB0byBzdXBwbHkgYW55IG90aGVyIGNvbmZpZ1xuICAgICAqIG9wdGlvbnMgaW4gdGhlIGBzeW5jYCBzZWN0aW9uIG9mIHRoZSBgdHJhbnNwb3J0YCBjb25maWcuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLXN5bmNVcmwpXG4gICAgICovXG4gICAgc3luY1VybCA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogVGhlIGNvbnN0cnVjdG9yIG9mIHRoZSB0YXNrIG1vZGVsIGNsYXNzLCB0byBiZSB1c2VkIGluIHRoZSBwcm9qZWN0LlxuICAgICAqIFdpbGwgYmUgc2V0IGFzIHRoZSBbbW9kZWxDbGFzc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS9kYXRhL1N0b3JlI2NvbmZpZy1tb2RlbENsYXNzKVxuICAgICAqIHByb3BlcnR5IG9mIHRoZSBbdGFza1N0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvbW9kZWwvUHJvamVjdE1vZGVsI3Byb3BlcnR5LXRhc2tTdG9yZSkuXG4gICAgICovXG4gICAgdGFza01vZGVsQ2xhc3MgPyA6IHR5cGVvZiBUYXNrTW9kZWxcbiAgICAvKipcbiAgICAgKiBUaGUgaW5pdGlhbCBkYXRhLCB0byBmaWxsIHRoZSBbdGFza1N0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvbW9kZWwvUHJvamVjdE1vZGVsI3Byb3BlcnR5LXRhc2tTdG9yZSkgd2l0aC4gU2hvdWxkIGJlIGFuIGFycmF5IG9mXG4gICAgICogW1Rhc2tNb2RlbF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL1Rhc2tNb2RlbCkgb3IgaXRzIGNvbmZpZ3VyYXRpb24gb2JqZWN0cy5cbiAgICAgKi9cbiAgICB0YXNrcyA/IDogVGFza01vZGVsW118VGFza01vZGVsQ29uZmlnW11cbiAgICAvKipcbiAgICAgKiBUaGUgaW5pdGlhbCBkYXRhLCB0byBmaWxsIHRoZSBbdGFza1N0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvbW9kZWwvUHJvamVjdE1vZGVsI3Byb3BlcnR5LXRhc2tTdG9yZSkgd2l0aC5cbiAgICAgKiBTaG91bGQgYmUgYW4gYXJyYXkgb2YgW1Rhc2tNb2RlbF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL1Rhc2tNb2RlbCkgaW5zdGFuY2VzIG9yIGl0cyBjb25maWd1cmF0aW9uIG9iamVjdHMuXG4gICAgICogQGRlcHJlY2F0ZWQgNi4zLjAgVXNlIFt0YXNrc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctdGFza3MpIGluc3RlYWRcbiAgICAgKi9cbiAgICB0YXNrc0RhdGEgPyA6IFRhc2tNb2RlbFtdfFRhc2tNb2RlbENvbmZpZ1tdXG4gICAgLyoqXG4gICAgICogQW4gW1Rhc2tTdG9yZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3N0b3JlL1Rhc2tTdG9yZSkgaW5zdGFuY2Ugb3IgYSBjb25maWcgb2JqZWN0LlxuICAgICAqL1xuICAgIHRhc2tTdG9yZSA/IDogVGFza1N0b3JlQ29uZmlnfFRhc2tTdG9yZVxuICAgIC8qKlxuICAgICAqIFRoZSBjb25zdHJ1Y3RvciB0byBjcmVhdGUgYSB0YXNrIHN0b3JlIGluc3RhbmNlIHdpdGguXG4gICAgICogU2hvdWxkIGJlIGEgY2xhc3MsIHN1YmNsYXNzaW5nIHRoZSBbVGFza1N0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvc3RvcmUvVGFza1N0b3JlKS5cbiAgICAgKi9cbiAgICB0YXNrU3RvcmVDbGFzcyA/IDogdHlwZW9mIFRhc2tTdG9yZVxuICAgIC8qKlxuICAgICAqIFNldCB0byBhIElBTkEgdGltZSB6b25lIChpLmUuIGBFdXJvcGUvU3RvY2tob2xtYCkgb3IgYSBVVEMgb2Zmc2V0IGluIG1pbnV0ZXMgKGkuZS4gYC0xMjBgKS4gVGhpcyB3aWxsXG4gICAgICogY29udmVydCBhbGwgZXZlbnRzLCB0YXNrcyBhbmQgdGltZSByYW5nZXMgdG8gdGhlIHNwZWNpZmllZCB0aW1lIHpvbmUgb3Igb2Zmc2V0LiBJdCB3aWxsIGFsc28gYWZmZWN0IHRoZVxuICAgICAqIGRpc3BsYXllZCB0aW1lbGluZSdzIGhlYWRlcnMgYXMgd2VsbCBhdCB0aGUgc3RhcnQgYW5kIGVuZCBkYXRlIG9mIGl0LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy10aW1lWm9uZSlcbiAgICAgKi9cbiAgICB0aW1lWm9uZSA/IDogc3RyaW5nfG51bWJlclxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB0aGUgb3V0cHV0IGZvcm1hdCBvZiBbdG9KU09OXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9tb2RlbC9taXhpbi9Qcm9qZWN0TW9kZWxDb21tb24jZnVuY3Rpb24tdG9KU09OKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctdG9KU09OUmVzdWx0Rm9ybWF0KVxuICAgICAqL1xuICAgIHRvSlNPTlJlc3VsdEZvcm1hdCA/IDogJ2lubGluZURhdGEnfCdtb2RlbCdcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCBmb3JjZXMgdGhlIENSVUQgbWFuYWdlciB0byBwcm9jZXNzIHJlc3BvbnNlcyBkZXBlbmRpbmcgb24gdGhlaXIgYHR5cGVgIGF0dHJpYnV0ZS5cbiAgICAgKiBTbyBgbG9hZGAgcmVxdWVzdCBtYXkgYmUgcmVzcG9uZGVkIHdpdGggYHN5bmNgIHJlc3BvbnNlIGZvciBleGFtcGxlLlxuICAgICAqIENhbiBiZSB1c2VkIGZvciBzbWFydCBzZXJ2ZXIgbG9naWMgYWxsb3dpbmcgdGhlIHNlcnZlciB0byBkZWNpZGUgd2hlbiBpdCdzIGJldHRlciB0byByZXNwb25kIHdpdGggYVxuICAgICAqIGNvbXBsZXRlIGRhdGEgc2V0IChgbG9hZGAgcmVzcG9uc2UpIG9yIGl0J3MgZW5vdWdoIHRvIHJldHVybiBqdXN0IGEgZGVsdGEgKGBzeW5jYCByZXNwb25zZSkuXG4gICAgICovXG4gICAgdHJhY2tSZXNwb25zZVR5cGUgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBDb25maWd1cmF0aW9uIG9mIHRoZSBBSkFYIHJlcXVlc3RzIHVzZWQgYnkgKkNydWQgTWFuYWdlciogdG8gY29tbXVuaWNhdGUgd2l0aCBhIHNlcnZlci1zaWRlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy10cmFuc3BvcnQpXG4gICAgICovXG4gICAgdHJhbnNwb3J0ID8gOiB7XG4gICAgICAgIGxvYWQ/OiBvYmplY3RcbiAgICAgICAgc3luYz86IG9iamVjdFxuICAgIH1cbiAgICAvKipcbiAgICAgKiBCeSBkZWZhdWx0LCB0aGUgc3RvcmVzIG9mIGEgcHJvamVjdCB1c2UgdGhlIHJhdyBkYXRhIG9iamVjdHMgcGFzc2VkIHRvIHRoZW0gYXMgdGhlIGRhdGEgc291cmNlIGZvciB0aGVpclxuICAgICAqIHJlY29yZHMgaWYgZGF0YSBpcyBsb2FkZWQgcmVtb3RlbHkgKHVzaW5nIGFuIGBBamF4U3RvcmVgIG9yIGEgYENydWRNYW5hZ2VyYCkuIEZvciBkYXRhIHN1cHBsaWVkIGlubGluZSxcbiAgICAgKiB0aGUgZGF0YSBvYmplY3RzIGFyZSBpbnN0ZWFkIGJ5IGRlZmF1bHQgY2xvbmVkIHRvIGF2b2lkIHRoZSBvcmlnaW5hbCBkYXRhIG9iamVjdCBiZWluZyBtb2RpZmllZCBieSB0aGVcbiAgICAgKiBzdG9yZS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctdXNlUmF3RGF0YSlcbiAgICAgKi9cbiAgICB1c2VSYXdEYXRhID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogVGhpcyBjb25maWcgdmFsaWRhdGVzIHRoZSByZXNwb25zZSBzdHJ1Y3R1cmUgZm9yIHJlcXVlc3RzIG1hZGUgYnkgdGhlIENydWQgTWFuYWdlci5cbiAgICAgKiBXaGVuIGB0cnVlYCwgdGhlIENydWQgTWFuYWdlciBjaGVja3MgZXZlcnkgcGFyc2VkIHJlc3BvbnNlIHN0cnVjdHVyZSBmb3IgZXJyb3JzXG4gICAgICogYW5kIGlmIHRoZSByZXNwb25zZSBmb3JtYXQgaXMgaW52YWxpZCwgYSB3YXJuaW5nIGlzIGxvZ2dlZCB0byB0aGUgYnJvd3NlciBjb25zb2xlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy12YWxpZGF0ZVJlc3BvbnNlKVxuICAgICAqL1xuICAgIHZhbGlkYXRlUmVzcG9uc2UgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgdG8gd3JpdGUgYWxsIGZpZWxkcyBmcm9tIHRoZSByZWNvcmQgdG8gdGhlIHNlcnZlci5cbiAgICAgKiBJZiBzZXQgdG8gYGZhbHNlYCBpdCB3aWxsIG9ubHkgc2VuZCB0aGUgZmllbGRzIHRoYXQgd2VyZSBtb2RpZmllZC5cbiAgICAgKiBOb3RlIHRoYXQgYW55IGZpZWxkcyB0aGF0IGhhdmUgW3BlcnNpc3RdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvZGF0YS9maWVsZC9EYXRhRmllbGQjY29uZmlnLXBlcnNpc3QpIHNldCB0byBgZmFsc2VgIHdpbGxcbiAgICAgKiBzdGlsbCBiZSBpZ25vcmVkIGFuZCBmaWVsZHMgaGF2aW5nIFthbHdheXNXcml0ZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS9kYXRhL2ZpZWxkL0RhdGFGaWVsZCNjb25maWctYWx3YXlzV3JpdGUpIHNldCB0byBgdHJ1ZWBcbiAgICAgKiB3aWxsIGFsd2F5cyBiZSBpbmNsdWRlZC5cbiAgICAgKi9cbiAgICB3cml0ZUFsbEZpZWxkcyA/IDogYm9vbGVhblxuXG59XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yIDogJ2JyeW50dW0tdGFzay1ib2FyZC1wcm9qZWN0LW1vZGVsJyxcbiAgICB0ZW1wbGF0ZSA6ICcnXG59KVxuZXhwb3J0IGNsYXNzIEJyeW50dW1UYXNrQm9hcmRQcm9qZWN0TW9kZWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgICBwdWJsaWMgc3RhdGljIGluc3RhbmNlQ2xhc3MgPSBQcm9qZWN0TW9kZWw7XG5cbiAgICBwdWJsaWMgc3RhdGljIGluc3RhbmNlTmFtZSA9ICdQcm9qZWN0TW9kZWwnO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnJ5bnR1bUV2ZW50czogc3RyaW5nW10gPSBbXG4gICAgICAgICdvbkJlZm9yZURlc3Ryb3knLFxuICAgICAgICAnb25CZWZvcmVMb2FkJyxcbiAgICAgICAgJ29uQmVmb3JlTG9hZEFwcGx5JyxcbiAgICAgICAgJ29uQmVmb3JlUmVzcG9uc2VBcHBseScsXG4gICAgICAgICdvbkJlZm9yZVNlbmQnLFxuICAgICAgICAnb25CZWZvcmVTeW5jJyxcbiAgICAgICAgJ29uQmVmb3JlU3luY0FwcGx5JyxcbiAgICAgICAgJ29uQ2F0Y2hBbGwnLFxuICAgICAgICAnb25DaGFuZ2UnLFxuICAgICAgICAnb25EYXRhUmVhZHknLFxuICAgICAgICAnb25EZXN0cm95JyxcbiAgICAgICAgJ29uSGFzQ2hhbmdlcycsXG4gICAgICAgICdvbkxvYWQnLFxuICAgICAgICAnb25Mb2FkQ2FuY2VsZWQnLFxuICAgICAgICAnb25Mb2FkRmFpbCcsXG4gICAgICAgICdvbk5vQ2hhbmdlcycsXG4gICAgICAgICdvblJlcXVlc3REb25lJyxcbiAgICAgICAgJ29uUmVxdWVzdEZhaWwnLFxuICAgICAgICAnb25TeW5jJyxcbiAgICAgICAgJ29uU3luY0NhbmNlbGVkJyxcbiAgICAgICAgJ29uU3luY0RlbGF5ZWQnLFxuICAgICAgICAnb25TeW5jRmFpbCdcbiAgICBdO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnJ5bnR1bUZlYXR1cmVOYW1lczogc3RyaW5nW10gPSBbXG5cbiAgICBdO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnJ5bnR1bUNvbmZpZ3M6IHN0cmluZ1tdID0gQnJ5bnR1bVRhc2tCb2FyZFByb2plY3RNb2RlbENvbXBvbmVudC5icnludHVtRmVhdHVyZU5hbWVzLmNvbmNhdChbXG4gICAgICAgICdhZGp1c3REdXJhdGlvblRvRFNUJyxcbiAgICAgICAgJ2Fzc2lnbm1lbnRNb2RlbENsYXNzJyxcbiAgICAgICAgJ2Fzc2lnbm1lbnRzJyxcbiAgICAgICAgJ2Fzc2lnbm1lbnRzRGF0YScsXG4gICAgICAgICdhc3NpZ25tZW50U3RvcmUnLFxuICAgICAgICAnYXNzaWdubWVudFN0b3JlQ2xhc3MnLFxuICAgICAgICAnYXV0b0xvYWQnLFxuICAgICAgICAnYXV0b1N5bmMnLFxuICAgICAgICAnYXV0b1N5bmNUaW1lb3V0JyxcbiAgICAgICAgJ2J1YmJsZUV2ZW50cycsXG4gICAgICAgICdjYWxsT25GdW5jdGlvbnMnLFxuICAgICAgICAnY2F0Y2hFdmVudEhhbmRsZXJFeGNlcHRpb25zJyxcbiAgICAgICAgJ2NoaWxkcmVuJyxcbiAgICAgICAgJ2NydWRTdG9yZXMnLFxuICAgICAgICAnZGVwZW5kZW5jaWVzJyxcbiAgICAgICAgJ2RlcGVuZGVuY2llc0RhdGEnLFxuICAgICAgICAnZGVwZW5kZW5jeU1vZGVsQ2xhc3MnLFxuICAgICAgICAnZGVwZW5kZW5jeVN0b3JlJyxcbiAgICAgICAgJ2RlcGVuZGVuY3lTdG9yZUNsYXNzJyxcbiAgICAgICAgJ2VuY29kZXInLFxuICAgICAgICAnZXZlbnRzJyxcbiAgICAgICAgJ2V2ZW50c0RhdGEnLFxuICAgICAgICAnZXZlbnRTdG9yZScsXG4gICAgICAgICdleHBhbmRlZCcsXG4gICAgICAgICdmb3JjZVN5bmMnLFxuICAgICAgICAnaWQnLFxuICAgICAgICAnaWdub3JlUmVtb3RlQ2hhbmdlc0luU1RNJyxcbiAgICAgICAgJ2luY2x1ZGVDaGlsZHJlbkluUmVtb3ZlUmVxdWVzdCcsXG4gICAgICAgICdpbmNsdWRlTGVnYWN5RGF0YVByb3BlcnRpZXMnLFxuICAgICAgICAnaXNGdWxseUxvYWRlZCcsXG4gICAgICAgICdqc29uJyxcbiAgICAgICAgJ2xpc3RlbmVycycsXG4gICAgICAgICdsb2FkVXJsJyxcbiAgICAgICAgJ29yZGVyZWRQYXJlbnRJbmRleCcsXG4gICAgICAgICdwYXJlbnRJZCcsXG4gICAgICAgICdwYXJlbnRJbmRleCcsXG4gICAgICAgICdwaGFudG9tSWRGaWVsZCcsXG4gICAgICAgICdwaGFudG9tUGFyZW50SWRGaWVsZCcsXG4gICAgICAgICdyZWFkT25seScsXG4gICAgICAgICdyZW1vdGVDaGlsZENvdW50JyxcbiAgICAgICAgJ3Jlc2V0SWRzQmVmb3JlU3luYycsXG4gICAgICAgICdyZXNvdXJjZU1vZGVsQ2xhc3MnLFxuICAgICAgICAncmVzb3VyY2VzJyxcbiAgICAgICAgJ3Jlc291cmNlc0RhdGEnLFxuICAgICAgICAncmVzb3VyY2VTdG9yZScsXG4gICAgICAgICdyZXNvdXJjZVN0b3JlQ2xhc3MnLFxuICAgICAgICAnc2hvdWxkU3luY0RhdGFPbkxvYWQnLFxuICAgICAgICAnc2lsZW5jZUluaXRpYWxDb21taXQnLFxuICAgICAgICAnc2tpcFN1Y2Nlc3NQcm9wZXJ0eScsXG4gICAgICAgICdzdG0nLFxuICAgICAgICAnc3RvcmVJZFByb3BlcnR5JyxcbiAgICAgICAgJ3N1cHBvcnRTaG9ydFN5bmNSZXNwb25zZScsXG4gICAgICAgICdzeW5jQXBwbHlTZXF1ZW5jZScsXG4gICAgICAgICdzeW5jVXJsJyxcbiAgICAgICAgJ3Rhc2tNb2RlbENsYXNzJyxcbiAgICAgICAgJ3Rhc2tzJyxcbiAgICAgICAgJ3Rhc2tzRGF0YScsXG4gICAgICAgICd0YXNrU3RvcmUnLFxuICAgICAgICAndGFza1N0b3JlQ2xhc3MnLFxuICAgICAgICAndGltZVpvbmUnLFxuICAgICAgICAndG9KU09OUmVzdWx0Rm9ybWF0JyxcbiAgICAgICAgJ3RyYWNrUmVzcG9uc2VUeXBlJyxcbiAgICAgICAgJ3RyYW5zcG9ydCcsXG4gICAgICAgICd1c2VSYXdEYXRhJyxcbiAgICAgICAgJ3ZhbGlkYXRlUmVzcG9uc2UnLFxuICAgICAgICAnd3JpdGVBbGxGaWVsZHMnXG4gICAgXSk7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBicnludHVtQ29uZmlnc09ubHk6IHN0cmluZ1tdID0gW1xuICAgICAgICAnYWRqdXN0RHVyYXRpb25Ub0RTVCcsXG4gICAgICAgICdhc3NpZ25tZW50TW9kZWxDbGFzcycsXG4gICAgICAgICdhc3NpZ25tZW50c0RhdGEnLFxuICAgICAgICAnYXNzaWdubWVudFN0b3JlQ2xhc3MnLFxuICAgICAgICAnYXV0b0xvYWQnLFxuICAgICAgICAnYXV0b1N5bmMnLFxuICAgICAgICAnYXV0b1N5bmNUaW1lb3V0JyxcbiAgICAgICAgJ2J1YmJsZUV2ZW50cycsXG4gICAgICAgICdjaGlsZHJlbicsXG4gICAgICAgICdkZXBlbmRlbmNpZXNEYXRhJyxcbiAgICAgICAgJ2RlcGVuZGVuY3lNb2RlbENsYXNzJyxcbiAgICAgICAgJ2RlcGVuZGVuY3lTdG9yZUNsYXNzJyxcbiAgICAgICAgJ2VuY29kZXInLFxuICAgICAgICAnZXZlbnRzRGF0YScsXG4gICAgICAgICdleHBhbmRlZCcsXG4gICAgICAgICdpZ25vcmVSZW1vdGVDaGFuZ2VzSW5TVE0nLFxuICAgICAgICAnaW5jbHVkZUNoaWxkcmVuSW5SZW1vdmVSZXF1ZXN0JyxcbiAgICAgICAgJ2xpc3RlbmVycycsXG4gICAgICAgICdvcmRlcmVkUGFyZW50SW5kZXgnLFxuICAgICAgICAncGFyZW50SW5kZXgnLFxuICAgICAgICAncGhhbnRvbUlkRmllbGQnLFxuICAgICAgICAncGhhbnRvbVBhcmVudElkRmllbGQnLFxuICAgICAgICAncmVzZXRJZHNCZWZvcmVTeW5jJyxcbiAgICAgICAgJ3Jlc291cmNlTW9kZWxDbGFzcycsXG4gICAgICAgICdyZXNvdXJjZXNEYXRhJyxcbiAgICAgICAgJ3Jlc291cmNlU3RvcmVDbGFzcycsXG4gICAgICAgICdzaWxlbmNlSW5pdGlhbENvbW1pdCcsXG4gICAgICAgICdza2lwU3VjY2Vzc1Byb3BlcnR5JyxcbiAgICAgICAgJ3N0b3JlSWRQcm9wZXJ0eScsXG4gICAgICAgICdzdXBwb3J0U2hvcnRTeW5jUmVzcG9uc2UnLFxuICAgICAgICAndGFza01vZGVsQ2xhc3MnLFxuICAgICAgICAndGFza3NEYXRhJyxcbiAgICAgICAgJ3Rhc2tTdG9yZUNsYXNzJyxcbiAgICAgICAgJ3RvSlNPTlJlc3VsdEZvcm1hdCcsXG4gICAgICAgICd0cmFja1Jlc3BvbnNlVHlwZScsXG4gICAgICAgICd0cmFuc3BvcnQnLFxuICAgICAgICAndXNlUmF3RGF0YScsXG4gICAgICAgICd2YWxpZGF0ZVJlc3BvbnNlJyxcbiAgICAgICAgJ3dyaXRlQWxsRmllbGRzJ1xuICAgIF07XG5cbiAgICBwcml2YXRlIHN0YXRpYyBicnludHVtUHJvcHM6IHN0cmluZ1tdID0gQnJ5bnR1bVRhc2tCb2FyZFByb2plY3RNb2RlbENvbXBvbmVudC5icnludHVtRmVhdHVyZU5hbWVzLmNvbmNhdChbXG4gICAgICAgICdhbGxDaGlsZHJlbicsXG4gICAgICAgICdhbGxVbmZpbHRlcmVkQ2hpbGRyZW4nLFxuICAgICAgICAnYXNzaWdubWVudHMnLFxuICAgICAgICAnYXNzaWdubWVudFN0b3JlJyxcbiAgICAgICAgJ2NhbGxPbkZ1bmN0aW9ucycsXG4gICAgICAgICdjYXRjaEV2ZW50SGFuZGxlckV4Y2VwdGlvbnMnLFxuICAgICAgICAnY3J1ZFN0b3JlcycsXG4gICAgICAgICdkZXBlbmRlbmNpZXMnLFxuICAgICAgICAnZGVwZW5kZW5jeVN0b3JlJyxcbiAgICAgICAgJ2Rlc2NlbmRhbnRDb3VudCcsXG4gICAgICAgICdldmVudHMnLFxuICAgICAgICAnZXZlbnRTdG9yZScsXG4gICAgICAgICdmb3JjZVN5bmMnLFxuICAgICAgICAnaGFzR2VuZXJhdGVkSWQnLFxuICAgICAgICAnaWQnLFxuICAgICAgICAnaW5jbHVkZUxlZ2FjeURhdGFQcm9wZXJ0aWVzJyxcbiAgICAgICAgJ2lubGluZURhdGEnLFxuICAgICAgICAnaW50ZXJuYWxJZCcsXG4gICAgICAgICdpc0NvbW1pdHRpbmcnLFxuICAgICAgICAnaXNDcmVhdGluZycsXG4gICAgICAgICdpc0Z1bGx5TG9hZGVkJyxcbiAgICAgICAgJ2lzVmFsaWQnLFxuICAgICAgICAnanNvbicsXG4gICAgICAgICdsb2FkVXJsJyxcbiAgICAgICAgJ3BhcmVudElkJyxcbiAgICAgICAgJ3ByZXZpb3VzU2libGluZ3NUb3RhbENvdW50JyxcbiAgICAgICAgJ3JlYWRPbmx5JyxcbiAgICAgICAgJ3JlbW90ZUNoaWxkQ291bnQnLFxuICAgICAgICAncmVzb3VyY2VzJyxcbiAgICAgICAgJ3Jlc291cmNlU3RvcmUnLFxuICAgICAgICAncmVzb3VyY2VUaW1lUmFuZ2VzJyxcbiAgICAgICAgJ3Nob3VsZFN5bmNEYXRhT25Mb2FkJyxcbiAgICAgICAgJ3N0bScsXG4gICAgICAgICdzeW5jQXBwbHlTZXF1ZW5jZScsXG4gICAgICAgICdzeW5jVXJsJyxcbiAgICAgICAgJ3Rhc2tzJyxcbiAgICAgICAgJ3Rhc2tTdG9yZScsXG4gICAgICAgICd0aW1lUmFuZ2VzJyxcbiAgICAgICAgJ3RpbWVab25lJyxcbiAgICAgICAgJ3Zpc2libGVEZXNjZW5kYW50Q291bnQnXG4gICAgXSk7XG5cbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY7XG4gICAgcHVibGljIGluc3RhbmNlITogUHJvamVjdE1vZGVsO1xuXG4gICAgcHJpdmF0ZSBicnludHVtQ29uZmlnID0ge1xuICAgICAgICBhZG9wdCAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBhcHBlbmRUbyAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBocmVmICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBhbmd1bGFyQ29tcG9uZW50IDogdGhpcyxcbiAgICAgICAgZmVhdHVyZXMgICAgICAgICA6IHt9LFxuICAgICAgICBsaXN0ZW5lcnMgICAgICAgIDoge31cbiAgICB9O1xuXG4gICAgY29uc3RydWN0b3IoZWxlbWVudDogRWxlbWVudFJlZikge1xuICAgICAgICB0aGlzLmVsZW1lbnRSZWYgPSBlbGVtZW50O1xuICAgIH1cblxuICAgIC8vIENvbmZpZ3Mgb25seVxuICAgIEBJbnB1dCgpIGFkanVzdER1cmF0aW9uVG9EU1QgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBhc3NpZ25tZW50TW9kZWxDbGFzcyAgICAgICAgICAgISA6IHR5cGVvZiBBc3NpZ25tZW50TW9kZWw7XG4gICAgQElucHV0KCkgYXNzaWdubWVudHNEYXRhICAgICAgICAgICAgICAgICEgOiBBc3NpZ25tZW50TW9kZWxbXXxBc3NpZ25tZW50TW9kZWxDb25maWdbXTtcbiAgICBASW5wdXQoKSBhc3NpZ25tZW50U3RvcmVDbGFzcyAgICAgICAgICAgISA6IHR5cGVvZiBBc3NpZ25tZW50U3RvcmV8b2JqZWN0O1xuICAgIEBJbnB1dCgpIGF1dG9Mb2FkICAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBhdXRvU3luYyAgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgYXV0b1N5bmNUaW1lb3V0ICAgICAgICAgICAgICAgICEgOiBudW1iZXI7XG4gICAgQElucHV0KCkgYnViYmxlRXZlbnRzICAgICAgICAgICAgICAgICAgICEgOiBvYmplY3Q7XG4gICAgQElucHV0KCkgY2hpbGRyZW4gICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFufG9iamVjdFtdfE1vZGVsW118TW9kZWxDb25maWdbXTtcbiAgICBASW5wdXQoKSBkZXBlbmRlbmNpZXNEYXRhICAgICAgICAgICAgICAgISA6IERlcGVuZGVuY3lNb2RlbFtdfERlcGVuZGVuY3lNb2RlbENvbmZpZ1tdO1xuICAgIEBJbnB1dCgpIGRlcGVuZGVuY3lNb2RlbENsYXNzICAgICAgICAgICAhIDogdHlwZW9mIERlcGVuZGVuY3lNb2RlbDtcbiAgICBASW5wdXQoKSBkZXBlbmRlbmN5U3RvcmVDbGFzcyAgICAgICAgICAgISA6IHR5cGVvZiBEZXBlbmRlbmN5U3RvcmV8b2JqZWN0O1xuICAgIEBJbnB1dCgpIGVuY29kZXIgICAgICAgICAgICAgICAgICAgICAgICAhIDoge1xuICAgICAgICByZXF1ZXN0RGF0YT86IG9iamVjdFxuICAgIH07XG4gICAgQElucHV0KCkgZXZlbnRzRGF0YSAgICAgICAgICAgICAgICAgICAgICEgOiBFdmVudE1vZGVsW118RXZlbnRNb2RlbENvbmZpZ1tdO1xuICAgIEBJbnB1dCgpIGV4cGFuZGVkICAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBpZ25vcmVSZW1vdGVDaGFuZ2VzSW5TVE0gICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaW5jbHVkZUNoaWxkcmVuSW5SZW1vdmVSZXF1ZXN0ICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGxpc3RlbmVycyAgICAgICAgICAgICAgICAgICAgICAhIDogUHJvamVjdE1vZGVsTGlzdGVuZXJzO1xuICAgIEBJbnB1dCgpIG9yZGVyZWRQYXJlbnRJbmRleCAgICAgICAgICAgICAhIDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIHBhcmVudEluZGV4ICAgICAgICAgICAgICAgICAgICAhIDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIHBoYW50b21JZEZpZWxkICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHBoYW50b21QYXJlbnRJZEZpZWxkICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHJlc2V0SWRzQmVmb3JlU3luYyAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSByZXNvdXJjZU1vZGVsQ2xhc3MgICAgICAgICAgICAgISA6IHR5cGVvZiBSZXNvdXJjZU1vZGVsO1xuICAgIEBJbnB1dCgpIHJlc291cmNlc0RhdGEgICAgICAgICAgICAgICAgICAhIDogUmVzb3VyY2VNb2RlbFtdfFJlc291cmNlTW9kZWxDb25maWdbXTtcbiAgICBASW5wdXQoKSByZXNvdXJjZVN0b3JlQ2xhc3MgICAgICAgICAgICAgISA6IHR5cGVvZiBSZXNvdXJjZVN0b3JlfG9iamVjdDtcbiAgICBASW5wdXQoKSBzaWxlbmNlSW5pdGlhbENvbW1pdCAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgc2tpcFN1Y2Nlc3NQcm9wZXJ0eSAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHN0b3JlSWRQcm9wZXJ0eSAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHN1cHBvcnRTaG9ydFN5bmNSZXNwb25zZSAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSB0YXNrTW9kZWxDbGFzcyAgICAgICAgICAgICAgICAgISA6IHR5cGVvZiBUYXNrTW9kZWw7XG4gICAgQElucHV0KCkgdGFza3NEYXRhICAgICAgICAgICAgICAgICAgICAgICEgOiBUYXNrTW9kZWxbXXxUYXNrTW9kZWxDb25maWdbXTtcbiAgICBASW5wdXQoKSB0YXNrU3RvcmVDbGFzcyAgICAgICAgICAgICAgICAgISA6IHR5cGVvZiBUYXNrU3RvcmU7XG4gICAgQElucHV0KCkgdG9KU09OUmVzdWx0Rm9ybWF0ICAgICAgICAgICAgICEgOiAnaW5saW5lRGF0YSd8J21vZGVsJztcbiAgICBASW5wdXQoKSB0cmFja1Jlc3BvbnNlVHlwZSAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgdHJhbnNwb3J0ICAgICAgICAgICAgICAgICAgICAgICEgOiB7XG4gICAgICAgIGxvYWQ/OiBvYmplY3RcbiAgICAgICAgc3luYz86IG9iamVjdFxuICAgIH07XG4gICAgQElucHV0KCkgdXNlUmF3RGF0YSAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHZhbGlkYXRlUmVzcG9uc2UgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSB3cml0ZUFsbEZpZWxkcyAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG5cbiAgICAvLyBDb25maWdzIGFuZCBwcm9wZXJ0aWVzXG4gICAgQElucHV0KCkgYXNzaWdubWVudHMgICAgICAgICAgICAgICAgICEgOiBBc3NpZ25tZW50TW9kZWxbXXxBc3NpZ25tZW50TW9kZWxDb25maWdbXTtcbiAgICBASW5wdXQoKSBhc3NpZ25tZW50U3RvcmUgICAgICAgICAgICAgISA6IEFzc2lnbm1lbnRTdG9yZXxBc3NpZ25tZW50U3RvcmVDb25maWc7XG4gICAgQElucHV0KCkgY2FsbE9uRnVuY3Rpb25zICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGNhdGNoRXZlbnRIYW5kbGVyRXhjZXB0aW9ucyAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBjcnVkU3RvcmVzICAgICAgICAgICAgICAgICAgISA6IENydWRNYW5hZ2VyU3RvcmVEZXNjcmlwdG9yW118U3RvcmVbXXxzdHJpbmdbXXxTdG9yZUNvbmZpZ1tdO1xuICAgIEBJbnB1dCgpIGRlcGVuZGVuY2llcyAgICAgICAgICAgICAgICAhIDogRGVwZW5kZW5jeU1vZGVsW118RGVwZW5kZW5jeU1vZGVsQ29uZmlnW107XG4gICAgQElucHV0KCkgZGVwZW5kZW5jeVN0b3JlICAgICAgICAgICAgICEgOiBEZXBlbmRlbmN5U3RvcmV8RGVwZW5kZW5jeVN0b3JlQ29uZmlnO1xuICAgIEBJbnB1dCgpIGV2ZW50cyAgICAgICAgICAgICAgICAgICAgICAhIDogRXZlbnRNb2RlbFtdfEV2ZW50TW9kZWxDb25maWdbXTtcbiAgICBASW5wdXQoKSBldmVudFN0b3JlICAgICAgICAgICAgICAgICAgISA6IEV2ZW50U3RvcmV8RXZlbnRTdG9yZUNvbmZpZztcbiAgICBASW5wdXQoKSBmb3JjZVN5bmMgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaWQgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8bnVtYmVyO1xuICAgIEBJbnB1dCgpIGluY2x1ZGVMZWdhY3lEYXRhUHJvcGVydGllcyAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBpc0Z1bGx5TG9hZGVkICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkganNvbiAgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgbG9hZFVybCAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgcGFyZW50SWQgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXJ8c3RyaW5nfG51bGw7XG4gICAgQElucHV0KCkgcmVhZE9ubHkgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHJlbW90ZUNoaWxkQ291bnQgICAgICAgICAgICAhIDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIHJlc291cmNlcyAgICAgICAgICAgICAgICAgICAhIDogUmVzb3VyY2VNb2RlbFtdfFJlc291cmNlTW9kZWxDb25maWdbXTtcbiAgICBASW5wdXQoKSByZXNvdXJjZVN0b3JlICAgICAgICAgICAgICAgISA6IFJlc291cmNlU3RvcmV8UmVzb3VyY2VTdG9yZUNvbmZpZztcbiAgICBASW5wdXQoKSBzaG91bGRTeW5jRGF0YU9uTG9hZCAgICAgICAgISA6IChvcHRpb25zOiB7IHN0b3JlOiBTdG9yZSwgcmVjb3JkczogTW9kZWwsIGRhdGE6IG9iamVjdFtdIH0pID0+IFNldDxhbnk+fGJvb2xlYW47XG4gICAgQElucHV0KCkgc3RtICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBTdGF0ZVRyYWNraW5nTWFuYWdlcnxTdGF0ZVRyYWNraW5nTWFuYWdlckNvbmZpZztcbiAgICBASW5wdXQoKSBzeW5jQXBwbHlTZXF1ZW5jZSAgICAgICAgICAgISA6IHN0cmluZ1tdfENydWRNYW5hZ2VyU3RvcmVEZXNjcmlwdG9yW107XG4gICAgQElucHV0KCkgc3luY1VybCAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgdGFza3MgICAgICAgICAgICAgICAgICAgICAgICEgOiBUYXNrTW9kZWxbXXxUYXNrTW9kZWxDb25maWdbXTtcbiAgICBASW5wdXQoKSB0YXNrU3RvcmUgICAgICAgICAgICAgICAgICAgISA6IFRhc2tTdG9yZXxUYXNrU3RvcmVDb25maWc7XG4gICAgQElucHV0KCkgdGltZVpvbmUgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8bnVtYmVyO1xuXG4gICAgLy8gUHJvcGVydGllcyBvbmx5XG4gICAgQElucHV0KCkgYWxsQ2hpbGRyZW4gICAgICAgICAgICAgICAgISA6IE1vZGVsW107XG4gICAgQElucHV0KCkgYWxsVW5maWx0ZXJlZENoaWxkcmVuICAgICAgISA6IE1vZGVsW107XG4gICAgQElucHV0KCkgZGVzY2VuZGFudENvdW50ICAgICAgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSBoYXNHZW5lcmF0ZWRJZCAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBpbmxpbmVEYXRhICAgICAgICAgICAgICAgICAhIDogb2JqZWN0O1xuICAgIEBJbnB1dCgpIGludGVybmFsSWQgICAgICAgICAgICAgICAgICEgOiBudW1iZXI7XG4gICAgQElucHV0KCkgaXNDb21taXR0aW5nICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaXNDcmVhdGluZyAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaXNWYWxpZCAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcHJldmlvdXNTaWJsaW5nc1RvdGFsQ291bnQgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSByZXNvdXJjZVRpbWVSYW5nZXMgICAgICAgICAhIDogUmVzb3VyY2VUaW1lUmFuZ2VNb2RlbFtdfFJlc291cmNlVGltZVJhbmdlTW9kZWxDb25maWdbXTtcbiAgICBASW5wdXQoKSB0aW1lUmFuZ2VzICAgICAgICAgICAgICAgICAhIDogVGltZVJhbmdlTW9kZWxbXXxUaW1lUmFuZ2VNb2RlbENvbmZpZ1tdO1xuICAgIEBJbnB1dCgpIHZpc2libGVEZXNjZW5kYW50Q291bnQgICAgICEgOiBudW1iZXI7XG5cbiAgICAvLyBFdmVudHMgZW1pdHRlcnNcbiAgICAvKipcbiAgICAgKiBGaXJlcyBiZWZvcmUgYW4gb2JqZWN0IGlzIGRlc3Ryb3llZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLkJhc2V9IGV2ZW50LnNvdXJjZSBUaGUgT2JqZWN0IHRoYXQgaXMgYmVpbmcgZGVzdHJveWVkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZURlc3Ryb3k6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEJhc2UgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIGJlZm9yZSBbbG9hZCByZXF1ZXN0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9jcnVkL0Fic3RyYWN0Q3J1ZE1hbmFnZXJNaXhpbiNmdW5jdGlvbi1sb2FkKSBpcyBzZW50LiBSZXR1cm4gYGZhbHNlYCB0byBjYW5jZWwgbG9hZCByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5jcnVkLkFic3RyYWN0Q3J1ZE1hbmFnZXJ9IGV2ZW50LnNvdXJjZSBUaGUgQ1JVRCBtYW5hZ2VyLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5wYWNrIFRoZSBkYXRhIHBhY2thZ2Ugd2hpY2ggY29udGFpbnMgZGF0YSBmb3IgYWxsIHN0b3JlcyBtYW5hZ2VkIGJ5IHRoZSBjcnVkIG1hbmFnZXIuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlTG9hZDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQWJzdHJhY3RDcnVkTWFuYWdlciwgcGFjazogb2JqZWN0IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgYmVmb3JlIGxvYWRlZCBkYXRhIGdldCBhcHBsaWVkIHRvIHRoZSBzdG9yZXMuIFJldHVybiBgZmFsc2VgIHRvIHByZXZlbnQgZGF0YSBhcHBseWluZy5cbiAgICAgKiBUaGlzIGV2ZW50IGNhbiBiZSB1c2VkIGZvciBzZXJ2ZXIgZGF0YSBwcmVwcm9jZXNzaW5nLiBUbyBhY2hpZXZlIGl0IHVzZXIgY2FuIG1vZGlmeSB0aGUgYHJlc3BvbnNlYCBvYmplY3QuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLmNydWQuQWJzdHJhY3RDcnVkTWFuYWdlcn0gZXZlbnQuc291cmNlIFRoZSBDUlVEIG1hbmFnZXIuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LnJlc3BvbnNlIFRoZSBkZWNvZGVkIHNlcnZlciByZXNwb25zZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50Lm9wdGlvbnMgT3B0aW9ucyBwcm92aWRlZCB0byB0aGUgW2xvYWRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL2NydWQvQWJzdHJhY3RDcnVkTWFuYWdlck1peGluI2Z1bmN0aW9uLWxvYWQpIG1ldGhvZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVMb2FkQXBwbHk6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEFic3RyYWN0Q3J1ZE1hbmFnZXIsIHJlc3BvbnNlOiBvYmplY3QsIG9wdGlvbnM6IG9iamVjdCB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIGJlZm9yZSBzZXJ2ZXIgcmVzcG9uc2UgZ2V0cyBhcHBsaWVkIHRvIHRoZSBzdG9yZXMuIFJldHVybiBgZmFsc2VgIHRvIHByZXZlbnQgZGF0YSBhcHBseWluZy5cbiAgICAgKiBUaGlzIGV2ZW50IGNhbiBiZSB1c2VkIGZvciBzZXJ2ZXIgZGF0YSBwcmVwcm9jZXNzaW5nLiBUbyBhY2hpZXZlIGl0IHVzZXIgY2FuIG1vZGlmeSB0aGUgYHJlc3BvbnNlYCBvYmplY3QuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLmNydWQuQWJzdHJhY3RDcnVkTWFuYWdlcn0gZXZlbnQuc291cmNlIFRoZSBDUlVEIG1hbmFnZXIuXG4gICAgICogQHBhcmFtIHsnc3luYycsJ2xvYWQnfSBldmVudC5yZXF1ZXN0VHlwZSBUaGUgcmVxdWVzdCB0eXBlIChgc3luY2Agb3IgYGxvYWRgKS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQucmVzcG9uc2UgVGhlIGRlY29kZWQgc2VydmVyIHJlc3BvbnNlIG9iamVjdC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVSZXNwb25zZUFwcGx5OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBBYnN0cmFjdENydWRNYW5hZ2VyLCByZXF1ZXN0VHlwZTogJ3N5bmMnfCdsb2FkJywgcmVzcG9uc2U6IG9iamVjdCB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIGJlZm9yZSBhIHJlcXVlc3QgaXMgc2VudCB0byB0aGUgc2VydmVyLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvbW9kZWwvUHJvamVjdE1vZGVsI2V2ZW50LWJlZm9yZVNlbmQpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLmNydWQuQWJzdHJhY3RDcnVkTWFuYWdlcn0gZXZlbnQuY3J1ZE1hbmFnZXIgVGhlIENSVUQgbWFuYWdlci5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQucGFyYW1zIEhUVFAgcmVxdWVzdCBwYXJhbXMgdG8gYmUgcGFzc2VkIGluIHRoZSByZXF1ZXN0IFVSTC5cbiAgICAgKiBAcGFyYW0geydzeW5jJywnbG9hZCd9IGV2ZW50LnJlcXVlc3RUeXBlIENydWRNYW5hZ2VyIHJlcXVlc3QgdHlwZSAoYGxvYWRgL2BzeW5jYClcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQucmVxdWVzdENvbmZpZyBDb25maWd1cmF0aW9uIG9iamVjdCBmb3IgQWpheCByZXF1ZXN0IGNhbGxcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVTZW5kOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgY3J1ZE1hbmFnZXI6IEFic3RyYWN0Q3J1ZE1hbmFnZXIsIHBhcmFtczogb2JqZWN0LCByZXF1ZXN0VHlwZTogJ3N5bmMnfCdsb2FkJywgcmVxdWVzdENvbmZpZzogb2JqZWN0IH0pID0+IFByb21pc2U8dm9pZD4pfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBiZWZvcmUgW3N5bmMgcmVxdWVzdF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcyNTY2hlZHVsZXIvY3J1ZC9BYnN0cmFjdENydWRNYW5hZ2VyTWl4aW4jZnVuY3Rpb24tc3luYykgaXMgc2VudC4gUmV0dXJuIGBmYWxzZWAgdG8gY2FuY2VsIHN5bmMgcmVxdWVzdC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL1Byb2plY3RNb2RlbCNldmVudC1iZWZvcmVTeW5jKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5jcnVkLkFic3RyYWN0Q3J1ZE1hbmFnZXJ9IGV2ZW50LnNvdXJjZSBUaGUgQ1JVRCBtYW5hZ2VyLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5wYWNrIFRoZSBkYXRhIHBhY2thZ2Ugd2hpY2ggY29udGFpbnMgZGF0YSBmb3IgYWxsIHN0b3JlcyBtYW5hZ2VkIGJ5IHRoZSBjcnVkIG1hbmFnZXIuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlU3luYzogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQWJzdHJhY3RDcnVkTWFuYWdlciwgcGFjazogb2JqZWN0IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgYmVmb3JlIHN5bmMgcmVzcG9uc2UgZGF0YSBnZXQgYXBwbGllZCB0byB0aGUgc3RvcmVzLiBSZXR1cm4gYGZhbHNlYCB0byBwcmV2ZW50IGRhdGEgYXBwbHlpbmcuXG4gICAgICogVGhpcyBldmVudCBjYW4gYmUgdXNlZCBmb3Igc2VydmVyIGRhdGEgcHJlcHJvY2Vzc2luZy4gVG8gYWNoaWV2ZSBpdCB1c2VyIGNhbiBtb2RpZnkgdGhlIGByZXNwb25zZWAgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5jcnVkLkFic3RyYWN0Q3J1ZE1hbmFnZXJ9IGV2ZW50LnNvdXJjZSBUaGUgQ1JVRCBtYW5hZ2VyLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5yZXNwb25zZSBUaGUgZGVjb2RlZCBzZXJ2ZXIgcmVzcG9uc2Ugb2JqZWN0LlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVN5bmNBcHBseTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQWJzdHJhY3RDcnVkTWFuYWdlciwgcmVzcG9uc2U6IG9iamVjdCB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYW55IG90aGVyIGV2ZW50IGlzIGZpcmVkIGZyb20gdGhlIG9iamVjdC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL1Byb2plY3RNb2RlbCNldmVudC1jYXRjaEFsbClcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHt7W2tleTogc3RyaW5nXTogYW55LCB0eXBlOiBzdHJpbmd9fSBldmVudC5ldmVudCBUaGUgT2JqZWN0IHRoYXQgY29udGFpbnMgZXZlbnQgZGV0YWlsc1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5ldmVudC50eXBlIFRoZSB0eXBlIG9mIHRoZSBldmVudCB3aGljaCBpcyBjYXVnaHQgYnkgdGhlIGxpc3RlbmVyXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ2F0Y2hBbGw6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDoge1trZXk6IHN0cmluZ106IGFueSwgdHlwZTogc3RyaW5nfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gZGF0YSBpbiBhbnkgb2YgdGhlIHByb2plY3RzIHN0b3JlcyBjaGFuZ2VzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvbW9kZWwvUHJvamVjdE1vZGVsI2V2ZW50LWNoYW5nZSlcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuU2NoZWR1bGVyUHJvamVjdE1vZGVsLGFueX0gZXZlbnQuc291cmNlIFRoaXMgcHJvamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLlN0b3JlfSBldmVudC5zdG9yZSBBZmZlY3RlZCBzdG9yZVxuICAgICAqIEBwYXJhbSB7J3JlbW92ZScsJ3JlbW92ZUFsbCcsJ2FkZCcsJ2NsZWFyY2hhbmdlcycsJ2ZpbHRlcicsJ3VwZGF0ZScsJ2RhdGFzZXQnLCdyZXBsYWNlJ30gZXZlbnQuYWN0aW9uIE5hbWUgb2YgYWN0aW9uIHdoaWNoIHRyaWdnZXJlZCB0aGUgY2hhbmdlLiBNYXkgYmUgb25lIG9mOiAgKiBgJ3JlbW92ZSdgICogYCdyZW1vdmVBbGwnYCAqIGAnYWRkJ2AgKiBgJ2NsZWFyY2hhbmdlcydgICogYCdmaWx0ZXInYCAqIGAndXBkYXRlJ2AgKiBgJ2RhdGFzZXQnYCAqIGAncmVwbGFjZSdgXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBDaGFuZ2VkIHJlY29yZCwgZm9yIGFjdGlvbnMgdGhhdCBhZmZlY3RzIGV4YWN0bHkgb25lIHJlY29yZCAoYCd1cGRhdGUnYClcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbFtdfSBldmVudC5yZWNvcmRzIENoYW5nZWQgcmVjb3JkcywgcGFzc2VkIGZvciBhbGwgYWN0aW9ucyBleGNlcHQgYCdyZW1vdmVBbGwnYFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5jaGFuZ2VzIFBhc3NlZCBmb3IgdGhlIGAndXBkYXRlJ2AgYWN0aW9uLCBpbmZvIG9uIHdoaWNoIHJlY29yZCBmaWVsZHMgY2hhbmdlZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNoYW5nZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogU2NoZWR1bGVyUHJvamVjdE1vZGVsfGFueSwgc3RvcmU6IFN0b3JlLCBhY3Rpb246ICdyZW1vdmUnfCdyZW1vdmVBbGwnfCdhZGQnfCdjbGVhcmNoYW5nZXMnfCdmaWx0ZXInfCd1cGRhdGUnfCdkYXRhc2V0J3wncmVwbGFjZScsIHJlY29yZDogTW9kZWwsIHJlY29yZHM6IE1vZGVsW10sIGNoYW5nZXM6IG9iamVjdCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiB0aGUgZW5naW5lIGhhcyBmaW5pc2hlZCBpdHMgY2FsY3VsYXRpb25zIGFuZCB0aGUgcmVzdWx0cyBoYXMgYmVlbiB3cml0dGVuIGJhY2sgdG8gdGhlIHJlY29yZHMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9tb2RlbC9Qcm9qZWN0TW9kZWwjZXZlbnQtZGF0YVJlYWR5KVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5TY2hlZHVsZXJQcm9qZWN0TW9kZWwsYW55fSBldmVudC5zb3VyY2UgVGhlIHByb2plY3RcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmlzSW5pdGlhbENvbW1pdCBGbGFnIHRoYXQgc2hvd3MgaWYgdGhpcyBjb21taXQgaXMgaW5pdGlhbFxuICAgICAqIEBwYXJhbSB7U2V0PGFueT59IGV2ZW50LnJlY29yZHMgU2V0IG9mIGFsbCBbTW9kZWxdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvZGF0YS9Nb2RlbClzIHRoYXQgd2VyZSBtb2RpZmllZCBpbiB0aGUgY29tcGxldGVkIHRyYW5zYWN0aW9uLiBVc2UgdGhlIFttb2RpZmljYXRpb25zXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL2RhdGEvTW9kZWwjcHJvcGVydHktbW9kaWZpY2F0aW9ucykgcHJvcGVydHkgb2YgZWFjaCBNb2RlbCB0byBpZGVudGlmeSBtb2RpZmllZCBmaWVsZHMuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRGF0YVJlYWR5OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBTY2hlZHVsZXJQcm9qZWN0TW9kZWx8YW55LCBpc0luaXRpYWxDb21taXQ6IGJvb2xlYW4sIHJlY29yZHM6IFNldDxhbnk+IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGFuIG9iamVjdCBpcyBkZXN0cm95ZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS5CYXNlfSBldmVudC5zb3VyY2UgVGhlIE9iamVjdCB0aGF0IGlzIGJlaW5nIGRlc3Ryb3llZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25EZXN0cm95OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBCYXNlIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGRhdGEgaW4gYW55IG9mIHRoZSByZWdpc3RlcmVkIGRhdGEgc3RvcmVzIGlzIGNoYW5nZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9tb2RlbC9Qcm9qZWN0TW9kZWwjZXZlbnQtaGFzQ2hhbmdlcylcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIuY3J1ZC5BYnN0cmFjdENydWRNYW5hZ2VyfSBldmVudC5zb3VyY2UgVGhlIENSVUQgbWFuYWdlci5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25IYXNDaGFuZ2VzOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBBYnN0cmFjdENydWRNYW5hZ2VyIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiBzdWNjZXNzZnVsIFtsb2FkIHJlcXVlc3RdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL2NydWQvQWJzdHJhY3RDcnVkTWFuYWdlck1peGluI2Z1bmN0aW9uLWxvYWQpIGNvbXBsZXRpb24gYWZ0ZXIgZGF0YSBnZXRzIGxvYWRlZCB0byB0aGUgc3RvcmVzLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5jcnVkLkFic3RyYWN0Q3J1ZE1hbmFnZXJ9IGV2ZW50LnNvdXJjZSBUaGUgQ1JVRCBtYW5hZ2VyLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5yZXNwb25zZSBUaGUgZGVjb2RlZCBzZXJ2ZXIgcmVzcG9uc2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5yZXNwb25zZU9wdGlvbnMgW0RFUFJFQ0FURURdIHNlZSBgcmVxdWVzdE9wdGlvbnNgXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LnJlcXVlc3RPcHRpb25zIFRoZSByZXF1ZXN0IG9wdGlvbnMgcGFzc2VkIHRvIHRoZSByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSB7UmVzcG9uc2V9IGV2ZW50LnJhd1Jlc3BvbnNlIFRoZSBuYXRpdmUgUmVzcG9uc2Ugb2JqZWN0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uTG9hZDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQWJzdHJhY3RDcnVkTWFuYWdlciwgcmVzcG9uc2U6IG9iamVjdCwgcmVzcG9uc2VPcHRpb25zOiBvYmplY3QsIHJlcXVlc3RPcHRpb25zOiBvYmplY3QsIHJhd1Jlc3BvbnNlOiBhbnkgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIGFmdGVyIFtsb2FkIHJlcXVlc3RdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL2NydWQvQWJzdHJhY3RDcnVkTWFuYWdlck1peGluI2Z1bmN0aW9uLWxvYWQpIHdhcyBjYW5jZWxlZCBieSBzb21lIFtiZWZvcmVMb2FkXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9jcnVkL0Fic3RyYWN0Q3J1ZE1hbmFnZXJNaXhpbiNldmVudC1iZWZvcmVMb2FkKVxuICAgICAqIGxpc3RlbmVyIG9yIGR1ZSB0byBpbmNvbXBsZXRlIHByaW9yIGxvYWQgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIuY3J1ZC5BYnN0cmFjdENydWRNYW5hZ2VyfSBldmVudC5zb3VyY2UgVGhlIENSVUQgbWFuYWdlci5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQucGFjayBUaGUgZGF0YSBwYWNrYWdlIHdoaWNoIGNvbnRhaW5zIGRhdGEgZm9yIGFsbCBzdG9yZXMgbWFuYWdlZCBieSB0aGUgY3J1ZCBtYW5hZ2VyLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkxvYWRDYW5jZWxlZDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQWJzdHJhY3RDcnVkTWFuYWdlciwgcGFjazogb2JqZWN0IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGEgW2xvYWQgcmVxdWVzdF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcyNTY2hlZHVsZXIvY3J1ZC9BYnN0cmFjdENydWRNYW5hZ2VyTWl4aW4jZnVuY3Rpb24tbG9hZCkgZmFpbHMuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLmNydWQuQWJzdHJhY3RDcnVkTWFuYWdlcn0gZXZlbnQuc291cmNlIFRoZSBDUlVEIG1hbmFnZXIgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LnJlc3BvbnNlIFRoZSBkZWNvZGVkIHNlcnZlciByZXNwb25zZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LnJlc3BvbnNlVGV4dCBUaGUgcmF3IHNlcnZlciByZXNwb25zZSB0ZXh0XG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LnJlc3BvbnNlT3B0aW9ucyBbREVQUkVDQVRFRF0gc2VlIGByZXF1ZXN0T3B0aW9uc2BcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQucmVxdWVzdE9wdGlvbnMgVGhlIHJlcXVlc3Qgb3B0aW9ucyBwYXNzZWQgdG8gdGhlIHJlcXVlc3QuXG4gICAgICogQHBhcmFtIHtSZXNwb25zZX0gZXZlbnQucmF3UmVzcG9uc2UgVGhlIG5hdGl2ZSBSZXNwb25zZSBvYmplY3RcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Mb2FkRmFpbDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQWJzdHJhY3RDcnVkTWFuYWdlciwgcmVzcG9uc2U6IG9iamVjdCwgcmVzcG9uc2VUZXh0OiBzdHJpbmcsIHJlc3BvbnNlT3B0aW9uczogb2JqZWN0LCByZXF1ZXN0T3B0aW9uczogb2JqZWN0LCByYXdSZXNwb25zZTogYW55IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIHJlZ2lzdGVyZWQgc3RvcmVzIGdldCBpbnRvIHN0YXRlIHdoZW4gdGhleSBkb24ndCBoYXZlIGFueVxuICAgICAqIG5vdCBwZXJzaXN0ZWQgY2hhbmdlLiBUaGlzIGhhcHBlbnMgYWZ0ZXIgW2xvYWRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL2NydWQvQWJzdHJhY3RDcnVkTWFuYWdlck1peGluI2Z1bmN0aW9uLWxvYWQpIG9yIFtzeW5jXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9jcnVkL0Fic3RyYWN0Q3J1ZE1hbmFnZXJNaXhpbiNmdW5jdGlvbi1zeW5jKSByZXF1ZXN0XG4gICAgICogY29tcGxldGlvbi4gT3IgdGhpcyBtYXkgaGFwcGVuIGFmdGVyIGEgcmVjb3JkIHVwZGF0ZSB3aGljaCB0dXJucyBpdHMgZmllbGRzIGJhY2sgdG8gdGhlaXIgb3JpZ2luYWwgc3RhdGUuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9tb2RlbC9Qcm9qZWN0TW9kZWwjZXZlbnQtbm9DaGFuZ2VzKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5jcnVkLkFic3RyYWN0Q3J1ZE1hbmFnZXJ9IGV2ZW50LnNvdXJjZSBUaGUgQ1JVRCBtYW5hZ2VyLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbk5vQ2hhbmdlczogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQWJzdHJhY3RDcnVkTWFuYWdlciB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gc3VjY2Vzc2Z1bCByZXF1ZXN0IGNvbXBsZXRpb24gYWZ0ZXIgZGF0YSBnZXRzIGFwcGxpZWQgdG8gdGhlIHN0b3Jlcy5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIuY3J1ZC5BYnN0cmFjdENydWRNYW5hZ2VyfSBldmVudC5zb3VyY2UgVGhlIENSVUQgbWFuYWdlci5cbiAgICAgKiBAcGFyYW0geydzeW5jJywnbG9hZCd9IGV2ZW50LnJlcXVlc3RUeXBlIFRoZSByZXF1ZXN0IHR5cGUgKGBzeW5jYCBvciBgbG9hZGApLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5yZXNwb25zZSBUaGUgZGVjb2RlZCBzZXJ2ZXIgcmVzcG9uc2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5yZXNwb25zZU9wdGlvbnMgW0RFUFJFQ0FURURdIHNlZSBgcmVxdWVzdE9wdGlvbnNgXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LnJlcXVlc3RPcHRpb25zIFRoZSByZXF1ZXN0IG9wdGlvbnMgcGFzc2VkIHRvIHRoZSByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSB7UmVzcG9uc2V9IGV2ZW50LnJhd1Jlc3BvbnNlIFRoZSBuYXRpdmUgUmVzcG9uc2Ugb2JqZWN0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uUmVxdWVzdERvbmU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEFic3RyYWN0Q3J1ZE1hbmFnZXIsIHJlcXVlc3RUeXBlOiAnc3luYyd8J2xvYWQnLCByZXNwb25zZTogb2JqZWN0LCByZXNwb25zZU9wdGlvbnM6IG9iamVjdCwgcmVxdWVzdE9wdGlvbnM6IG9iamVjdCwgcmF3UmVzcG9uc2U6IGFueSB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiBhIHJlcXVlc3QgZmFpbHMuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLmNydWQuQWJzdHJhY3RDcnVkTWFuYWdlcn0gZXZlbnQuc291cmNlIFRoZSBDUlVEIG1hbmFnZXIgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHsnc3luYycsJ2xvYWQnfSBldmVudC5yZXF1ZXN0VHlwZSBUaGUgcmVxdWVzdCB0eXBlIChgc3luY2Agb3IgYGxvYWRgKS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQucmVzcG9uc2UgVGhlIGRlY29kZWQgc2VydmVyIHJlc3BvbnNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQucmVzcG9uc2VUZXh0IFRoZSByYXcgc2VydmVyIHJlc3BvbnNlIHRleHRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQucmVzcG9uc2VPcHRpb25zIFtERVBSRUNBVEVEXSBzZWUgYHJlcXVlc3RPcHRpb25zYFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5yZXF1ZXN0T3B0aW9ucyBUaGUgcmVxdWVzdCBvcHRpb25zIHBhc3NlZCB0byB0aGUgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0ge1Jlc3BvbnNlfSBldmVudC5yYXdSZXNwb25zZSBUaGUgbmF0aXZlIFJlc3BvbnNlIG9iamVjdFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJlcXVlc3RGYWlsOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBBYnN0cmFjdENydWRNYW5hZ2VyLCByZXF1ZXN0VHlwZTogJ3N5bmMnfCdsb2FkJywgcmVzcG9uc2U6IG9iamVjdCwgcmVzcG9uc2VUZXh0OiBzdHJpbmcsIHJlc3BvbnNlT3B0aW9uczogb2JqZWN0LCByZXF1ZXN0T3B0aW9uczogb2JqZWN0LCByYXdSZXNwb25zZTogYW55IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiBzdWNjZXNzZnVsIFtzeW5jIHJlcXVlc3RdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL2NydWQvQWJzdHJhY3RDcnVkTWFuYWdlck1peGluI2Z1bmN0aW9uLXN5bmMpIGNvbXBsZXRpb24uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLmNydWQuQWJzdHJhY3RDcnVkTWFuYWdlcn0gZXZlbnQuc291cmNlIFRoZSBDUlVEIG1hbmFnZXIuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LnJlc3BvbnNlIFRoZSBkZWNvZGVkIHNlcnZlciByZXNwb25zZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LnJlc3BvbnNlT3B0aW9ucyBbREVQUkVDQVRFRF0gc2VlIGByZXF1ZXN0T3B0aW9uc2BcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQucmVxdWVzdE9wdGlvbnMgVGhlIHJlcXVlc3Qgb3B0aW9ucyBwYXNzZWQgdG8gdGhlIHJlcXVlc3QuXG4gICAgICogQHBhcmFtIHtSZXNwb25zZX0gZXZlbnQucmF3UmVzcG9uc2UgVGhlIG5hdGl2ZSBSZXNwb25zZSBvYmplY3RcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25TeW5jOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBBYnN0cmFjdENydWRNYW5hZ2VyLCByZXNwb25zZTogb2JqZWN0LCByZXNwb25zZU9wdGlvbnM6IG9iamVjdCwgcmVxdWVzdE9wdGlvbnM6IG9iamVjdCwgcmF3UmVzcG9uc2U6IGFueSB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgYWZ0ZXIgW3N5bmMgcmVxdWVzdF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcyNTY2hlZHVsZXIvY3J1ZC9BYnN0cmFjdENydWRNYW5hZ2VyTWl4aW4jZnVuY3Rpb24tc3luYykgd2FzIGNhbmNlbGVkIGJ5IHNvbWUgW2JlZm9yZVN5bmNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL2NydWQvQWJzdHJhY3RDcnVkTWFuYWdlck1peGluI2V2ZW50LWJlZm9yZVN5bmMpIGxpc3RlbmVyLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5jcnVkLkFic3RyYWN0Q3J1ZE1hbmFnZXJ9IGV2ZW50LnNvdXJjZSBUaGUgQ1JVRCBtYW5hZ2VyLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5wYWNrIFRoZSBkYXRhIHBhY2thZ2Ugd2hpY2ggY29udGFpbnMgZGF0YSBmb3IgYWxsIHN0b3JlcyBtYW5hZ2VkIGJ5IHRoZSBjcnVkIG1hbmFnZXIuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU3luY0NhbmNlbGVkOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBBYnN0cmFjdENydWRNYW5hZ2VyLCBwYWNrOiBvYmplY3QgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIGFmdGVyIFtzeW5jIHJlcXVlc3RdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL2NydWQvQWJzdHJhY3RDcnVkTWFuYWdlck1peGluI2Z1bmN0aW9uLXN5bmMpIHdhcyBkZWxheWVkIGR1ZSB0byBpbmNvbXBsZXRlIHByZXZpb3VzIG9uZS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIuY3J1ZC5BYnN0cmFjdENydWRNYW5hZ2VyfSBldmVudC5zb3VyY2UgVGhlIENSVUQgbWFuYWdlci5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQuYXJndW1lbnRzIFRoZSBhcmd1bWVudHMgb2YgW3N5bmNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL2NydWQvQWJzdHJhY3RDcnVkTWFuYWdlck1peGluI2Z1bmN0aW9uLXN5bmMpIGNhbGwuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU3luY0RlbGF5ZWQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEFic3RyYWN0Q3J1ZE1hbmFnZXIsIGFyZ3VtZW50czogb2JqZWN0IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGEgW3N5bmMgcmVxdWVzdF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcyNTY2hlZHVsZXIvY3J1ZC9BYnN0cmFjdENydWRNYW5hZ2VyTWl4aW4jZnVuY3Rpb24tc3luYykgZmFpbHMuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLmNydWQuQWJzdHJhY3RDcnVkTWFuYWdlcn0gZXZlbnQuc291cmNlIFRoZSBDUlVEIG1hbmFnZXIgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LnJlc3BvbnNlIFRoZSBkZWNvZGVkIHNlcnZlciByZXNwb25zZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LnJlc3BvbnNlVGV4dCBUaGUgcmF3IHNlcnZlciByZXNwb25zZSB0ZXh0XG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LnJlc3BvbnNlT3B0aW9ucyBbREVQUkVDQVRFRF0gc2VlIGByZXF1ZXN0T3B0aW9uc2BcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQucmVxdWVzdE9wdGlvbnMgVGhlIHJlcXVlc3Qgb3B0aW9ucyBwYXNzZWQgdG8gdGhlIHJlcXVlc3QuXG4gICAgICogQHBhcmFtIHtSZXNwb25zZX0gZXZlbnQucmF3UmVzcG9uc2UgVGhlIG5hdGl2ZSBSZXNwb25zZSBvYmplY3RcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25TeW5jRmFpbDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQWJzdHJhY3RDcnVkTWFuYWdlciwgcmVzcG9uc2U6IG9iamVjdCwgcmVzcG9uc2VUZXh0OiBzdHJpbmcsIHJlc3BvbnNlT3B0aW9uczogb2JqZWN0LCByZXF1ZXN0T3B0aW9uczogb2JqZWN0LCByYXdSZXNwb25zZTogYW55IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhbmQgYXBwZW5kIHRoZSB1bmRlcmx5aW5nIHdpZGdldFxuICAgICAqL1xuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBjb25zdFxuICAgICAgICAgICAgbWUgPSB0aGlzLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGVsZW1lbnRSZWYsXG4gICAgICAgICAgICAgICAgYnJ5bnR1bUNvbmZpZ1xuICAgICAgICAgICAgfSA9IG1lLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGluc3RhbmNlQ2xhc3MsXG4gICAgICAgICAgICAgICAgaW5zdGFuY2VOYW1lLFxuICAgICAgICAgICAgICAgIGJyeW50dW1Db25maWdzLFxuICAgICAgICAgICAgICAgIGJyeW50dW1FdmVudHNcbiAgICAgICAgICAgIH0gPSBCcnludHVtVGFza0JvYXJkUHJvamVjdE1vZGVsQ29tcG9uZW50O1xuXG4gICAgICAgIGJyeW50dW1Db25maWdzLmZpbHRlcihwcm9wID0+IHByb3AgaW4gdGhpcykuZm9yRWFjaChwcm9wID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIFdyYXBwZXJIZWxwZXIuYXBwbHlQcm9wVmFsdWUoYnJ5bnR1bUNvbmZpZywgcHJvcCwgdGhpc1twcm9wXSk7XG4gICAgICAgICAgICBpZiAoWydmZWF0dXJlcycsICdjb25maWcnXS5pbmNsdWRlcyhwcm9wKSkge1xuICAgICAgICAgICAgICAgIFdyYXBwZXJIZWxwZXIuZGV2V2FybmluZ0NvbmZpZ1Byb3AoaW5zdGFuY2VOYW1lLCBwcm9wKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgYnJ5bnR1bUV2ZW50cy5maWx0ZXIoZXZlbnQgPT4gdGhpc1tldmVudF0gJiYgdGhpc1tldmVudF0ub2JzZXJ2ZXJzLmxlbmd0aCA+IDApLmZvckVhY2goZXZlbnQgPT4ge1xuICAgICAgICAgICAgY29uc3RcbiAgICAgICAgICAgICAgICB1bmNhcGl0YWxpemUgPSAoc3RyOiBzdHJpbmcpID0+IHN0ci5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIHN0ci5zbGljZSgxKSxcbiAgICAgICAgICAgICAgICBldmVudE5hbWUgPSAoc3RyOiBzdHJpbmcpID0+IHVuY2FwaXRhbGl6ZShzdHIuc2xpY2UoMikpO1xuXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBicnludHVtQ29uZmlnLmxpc3RlbmVyc1tldmVudE5hbWUoZXZlbnQpXSA9IGUgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBtZVtldmVudF0uZW1pdChlKTtcbiAgICAgICAgICAgICAgICAvLyBFdmVudEVtaXR0ZXIgZG9lcyBub3QgcmV0dXJuIHZhbHVlcyBpbiB0aGUgbm9ybWFsIHdheSwgd29yayBhcm91bmQgaXQgYnkgc2V0dGluZyBgcmV0dXJuVmFsdWVgIGZsYWdcbiAgICAgICAgICAgICAgICAvLyBpbiBBbmd1bGFyIGxpc3RlbmVyc1xuICAgICAgICAgICAgICAgIHJldHVybiBlLnJldHVyblZhbHVlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gSWYgY29tcG9uZW50IGhhcyBubyBjb250YWluZXIgc3BlY2lmaWVkIGluIGNvbmZpZyB0aGVuIHVzZSBhZG9wdCB0byBXcmFwcGVyJ3MgZWxlbWVudFxuICAgICAgICBjb25zdFxuICAgICAgICAgICAgY29udGFpbmVyUGFyYW0gPSBbXG4gICAgICAgICAgICAgICAgJ2Fkb3B0JyxcbiAgICAgICAgICAgICAgICAnYXBwZW5kVG8nLFxuICAgICAgICAgICAgICAgICdpbnNlcnRBZnRlcicsXG4gICAgICAgICAgICAgICAgJ2luc2VydEJlZm9yZSdcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBdLmZpbmQocHJvcCA9PiBicnludHVtQ29uZmlnW3Byb3BdKTtcbiAgICAgICAgaWYgKCFjb250YWluZXJQYXJhbSkge1xuICAgICAgICAgICAgaWYgKGluc3RhbmNlTmFtZSA9PT0gJ0J1dHRvbicgfHwgZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldFJvb3ROb2RlKCkgaW5zdGFuY2VvZiBTaGFkb3dSb290KSB7XG4gICAgICAgICAgICAgICAgLy8gQnV0dG9uIHNob3VsZCBhbHdheXMgYmUgPGE+IG9yIDxidXR0b24+IGluc2lkZSBvd25lciBlbGVtZW50XG4gICAgICAgICAgICAgICAgYnJ5bnR1bUNvbmZpZy5hcHBlbmRUbyA9IGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGJyeW50dW1Db25maWcuYWRvcHQgPSBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBXcmFwcGVySGVscGVyLmRldldhcm5pbmdDb250YWluZXIoaW5zdGFuY2VOYW1lLCBjb250YWluZXJQYXJhbSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIG1lLmluc3RhbmNlID0gaW5zdGFuY2VOYW1lID09PSAnV2lkZ2V0JyA/IFdpZGdldC5jcmVhdGUoYnJ5bnR1bUNvbmZpZykgOiBuZXcgaW5zdGFuY2VDbGFzcyhicnludHVtQ29uZmlnKTtcblxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdhdGNoIGZvciBjaGFuZ2VzXG4gICAgICogQHBhcmFtIGNoYW5nZXNcbiAgICAgKi9cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGNvbnN0XG4gICAgICAgICAgICB7IGluc3RhbmNlIH0gPSB0aGlzLFxuICAgICAgICAgICAgeyBpbnN0YW5jZU5hbWUgfSA9IEJyeW50dW1UYXNrQm9hcmRQcm9qZWN0TW9kZWxDb21wb25lbnQ7XG4gICAgICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBJdGVyYXRlIG92ZXIgYWxsIGNoYW5nZXNcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoY2hhbmdlcykuZm9yRWFjaCgoW3Byb3AsIGNoYW5nZV0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0XG4gICAgICAgICAgICAgICAgbmV3VmFsdWUgPSAoY2hhbmdlIGFzIFNpbXBsZUNoYW5nZSkuY3VycmVudFZhbHVlLFxuICAgICAgICAgICAgICAgIHsgaW5zdGFuY2UgfSA9IHRoaXMsXG4gICAgICAgICAgICAgICAgeyBicnludHVtQ29uZmlnc09ubHksIGJyeW50dW1Qcm9wcyB9ID0gQnJ5bnR1bVRhc2tCb2FyZFByb2plY3RNb2RlbENvbXBvbmVudDtcbiAgICAgICAgICAgIGlmIChicnludHVtUHJvcHMuaW5jbHVkZXMocHJvcCkpIHtcbiAgICAgICAgICAgICAgICBXcmFwcGVySGVscGVyLmFwcGx5UHJvcFZhbHVlKGluc3RhbmNlLCBwcm9wLCBuZXdWYWx1ZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChicnludHVtQ29uZmlnc09ubHkuaW5jbHVkZXMocHJvcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgV3JhcHBlckhlbHBlci5kZXZXYXJuaW5nVXBkYXRlUHJvcChpbnN0YW5jZU5hbWUsIHByb3ApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzdHJveSB0aGUgY29tcG9uZW50XG4gICAgICovXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKHRoaXMuaW5zdGFuY2UgJiYgdGhpcy5pbnN0YW5jZS5kZXN0cm95KSB7XG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
|