@bryntum/taskboard-angular 7.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/README.md +44 -0
  2. package/bryntum-taskboard-angular.d.ts +5 -0
  3. package/bundles/bryntum-taskboard-angular.umd.js +56826 -0
  4. package/bundles/bryntum-taskboard-angular.umd.js.map +1 -0
  5. package/esm2015/bryntum-taskboard-angular.js +5 -0
  6. package/esm2015/lib/bryntum-button-group.component.js +725 -0
  7. package/esm2015/lib/bryntum-button.component.js +715 -0
  8. package/esm2015/lib/bryntum-chat-panel.component.js +839 -0
  9. package/esm2015/lib/bryntum-checkbox-group.component.js +854 -0
  10. package/esm2015/lib/bryntum-checkbox.component.js +805 -0
  11. package/esm2015/lib/bryntum-chip-view.component.js +727 -0
  12. package/esm2015/lib/bryntum-code-editor.component.js +818 -0
  13. package/esm2015/lib/bryntum-color-field.component.js +794 -0
  14. package/esm2015/lib/bryntum-column-combo.component.js +936 -0
  15. package/esm2015/lib/bryntum-column-filter-field.component.js +799 -0
  16. package/esm2015/lib/bryntum-column-picker-button.component.js +719 -0
  17. package/esm2015/lib/bryntum-column-scroll-button.component.js +719 -0
  18. package/esm2015/lib/bryntum-combo.component.js +932 -0
  19. package/esm2015/lib/bryntum-container.component.js +681 -0
  20. package/esm2015/lib/bryntum-date-field.component.js +831 -0
  21. package/esm2015/lib/bryntum-date-picker.component.js +1008 -0
  22. package/esm2015/lib/bryntum-date-range-field.component.js +835 -0
  23. package/esm2015/lib/bryntum-date-time-field.component.js +752 -0
  24. package/esm2015/lib/bryntum-demo-code-editor.component.js +830 -0
  25. package/esm2015/lib/bryntum-demo-header.component.js +171 -0
  26. package/esm2015/lib/bryntum-display-field.component.js +772 -0
  27. package/esm2015/lib/bryntum-duration-field.component.js +815 -0
  28. package/esm2015/lib/bryntum-editor.component.js +823 -0
  29. package/esm2015/lib/bryntum-field-filter-picker-group.component.js +758 -0
  30. package/esm2015/lib/bryntum-field-filter-picker.component.js +740 -0
  31. package/esm2015/lib/bryntum-field-set.component.js +810 -0
  32. package/esm2015/lib/bryntum-file-field.component.js +776 -0
  33. package/esm2015/lib/bryntum-file-picker.component.js +709 -0
  34. package/esm2015/lib/bryntum-filter-field.component.js +803 -0
  35. package/esm2015/lib/bryntum-fullscreen-button.component.js +53 -0
  36. package/esm2015/lib/bryntum-hint.component.js +856 -0
  37. package/esm2015/lib/bryntum-label.component.js +584 -0
  38. package/esm2015/lib/bryntum-list.component.js +715 -0
  39. package/esm2015/lib/bryntum-menu.component.js +883 -0
  40. package/esm2015/lib/bryntum-month-picker.component.js +818 -0
  41. package/esm2015/lib/bryntum-number-field.component.js +800 -0
  42. package/esm2015/lib/bryntum-paging-toolbar.component.js +736 -0
  43. package/esm2015/lib/bryntum-panel.component.js +794 -0
  44. package/esm2015/lib/bryntum-password-field.component.js +768 -0
  45. package/esm2015/lib/bryntum-project-combo.component.js +940 -0
  46. package/esm2015/lib/bryntum-radio-group.component.js +826 -0
  47. package/esm2015/lib/bryntum-radio.component.js +805 -0
  48. package/esm2015/lib/bryntum-resources-combo.component.js +936 -0
  49. package/esm2015/lib/bryntum-scheduler-project-combo.component.js +936 -0
  50. package/esm2015/lib/bryntum-slide-toggle.component.js +805 -0
  51. package/esm2015/lib/bryntum-slider.component.js +661 -0
  52. package/esm2015/lib/bryntum-splitter.component.js +618 -0
  53. package/esm2015/lib/bryntum-swimlane-combo.component.js +936 -0
  54. package/esm2015/lib/bryntum-swimlane-filter-field.component.js +807 -0
  55. package/esm2015/lib/bryntum-swimlane-picker-button.component.js +719 -0
  56. package/esm2015/lib/bryntum-swimlane-scroll-button.component.js +719 -0
  57. package/esm2015/lib/bryntum-tab-panel.component.js +842 -0
  58. package/esm2015/lib/bryntum-tag-combo.component.js +940 -0
  59. package/esm2015/lib/bryntum-task-board-base.component.js +1678 -0
  60. package/esm2015/lib/bryntum-task-board-field-filter-picker-group.component.js +762 -0
  61. package/esm2015/lib/bryntum-task-board-field-filter-picker.component.js +732 -0
  62. package/esm2015/lib/bryntum-task-board-project-model.component.js +690 -0
  63. package/esm2015/lib/bryntum-task-board.component.js +1682 -0
  64. package/esm2015/lib/bryntum-task-color-combo.component.js +794 -0
  65. package/esm2015/lib/bryntum-task-filter-field.component.js +807 -0
  66. package/esm2015/lib/bryntum-text-area-field.component.js +776 -0
  67. package/esm2015/lib/bryntum-text-area-picker-field.component.js +798 -0
  68. package/esm2015/lib/bryntum-text-field.component.js +783 -0
  69. package/esm2015/lib/bryntum-time-field.component.js +819 -0
  70. package/esm2015/lib/bryntum-time-picker.component.js +709 -0
  71. package/esm2015/lib/bryntum-todo-list-field.component.js +780 -0
  72. package/esm2015/lib/bryntum-toolbar.component.js +732 -0
  73. package/esm2015/lib/bryntum-undo-redo.component.js +689 -0
  74. package/esm2015/lib/bryntum-widget.component.js +580 -0
  75. package/esm2015/lib/bryntum-year-picker.component.js +827 -0
  76. package/esm2015/lib/bryntum-zoom-slider.component.js +665 -0
  77. package/esm2015/lib/taskboard.module.js +374 -0
  78. package/esm2015/lib/wrapper.helper.js +74 -0
  79. package/esm2015/public-api.js +76 -0
  80. package/fesm2015/bryntum-taskboard-angular.js +56188 -0
  81. package/fesm2015/bryntum-taskboard-angular.js.map +1 -0
  82. package/lib/bryntum-button-group.component.d.ts +860 -0
  83. package/lib/bryntum-button.component.d.ts +845 -0
  84. package/lib/bryntum-chat-panel.component.d.ts +1060 -0
  85. package/lib/bryntum-checkbox-group.component.d.ts +1094 -0
  86. package/lib/bryntum-checkbox.component.d.ts +968 -0
  87. package/lib/bryntum-chip-view.component.d.ts +872 -0
  88. package/lib/bryntum-code-editor.component.d.ts +1045 -0
  89. package/lib/bryntum-color-field.component.d.ts +965 -0
  90. package/lib/bryntum-column-combo.component.d.ts +1208 -0
  91. package/lib/bryntum-column-filter-field.component.d.ts +988 -0
  92. package/lib/bryntum-column-picker-button.component.d.ts +853 -0
  93. package/lib/bryntum-column-scroll-button.component.d.ts +853 -0
  94. package/lib/bryntum-combo.component.d.ts +1199 -0
  95. package/lib/bryntum-container.component.d.ts +822 -0
  96. package/lib/bryntum-date-field.component.d.ts +1025 -0
  97. package/lib/bryntum-date-picker.component.d.ts +1338 -0
  98. package/lib/bryntum-date-range-field.component.d.ts +1027 -0
  99. package/lib/bryntum-date-time-field.component.d.ts +912 -0
  100. package/lib/bryntum-demo-code-editor.component.d.ts +1061 -0
  101. package/lib/bryntum-demo-header.component.d.ts +29 -0
  102. package/lib/bryntum-display-field.component.d.ts +949 -0
  103. package/lib/bryntum-duration-field.component.d.ts +1008 -0
  104. package/lib/bryntum-editor.component.d.ts +969 -0
  105. package/lib/bryntum-field-filter-picker-group.component.d.ts +935 -0
  106. package/lib/bryntum-field-filter-picker.component.d.ts +903 -0
  107. package/lib/bryntum-field-set.component.d.ts +1038 -0
  108. package/lib/bryntum-file-field.component.d.ts +952 -0
  109. package/lib/bryntum-file-picker.component.d.ts +847 -0
  110. package/lib/bryntum-filter-field.component.d.ts +993 -0
  111. package/lib/bryntum-fullscreen-button.component.d.ts +20 -0
  112. package/lib/bryntum-hint.component.d.ts +1117 -0
  113. package/lib/bryntum-label.component.d.ts +683 -0
  114. package/lib/bryntum-list.component.d.ts +849 -0
  115. package/lib/bryntum-menu.component.d.ts +1129 -0
  116. package/lib/bryntum-month-picker.component.d.ts +1034 -0
  117. package/lib/bryntum-number-field.component.d.ts +995 -0
  118. package/lib/bryntum-paging-toolbar.component.d.ts +886 -0
  119. package/lib/bryntum-panel.component.d.ts +1015 -0
  120. package/lib/bryntum-password-field.component.d.ts +939 -0
  121. package/lib/bryntum-project-combo.component.d.ts +1209 -0
  122. package/lib/bryntum-radio-group.component.d.ts +1068 -0
  123. package/lib/bryntum-radio.component.d.ts +968 -0
  124. package/lib/bryntum-resources-combo.component.d.ts +1207 -0
  125. package/lib/bryntum-scheduler-project-combo.component.d.ts +1201 -0
  126. package/lib/bryntum-slide-toggle.component.d.ts +968 -0
  127. package/lib/bryntum-slider.component.d.ts +776 -0
  128. package/lib/bryntum-splitter.component.d.ts +714 -0
  129. package/lib/bryntum-swimlane-combo.component.d.ts +1207 -0
  130. package/lib/bryntum-swimlane-filter-field.component.d.ts +1001 -0
  131. package/lib/bryntum-swimlane-picker-button.component.d.ts +853 -0
  132. package/lib/bryntum-swimlane-scroll-button.component.d.ts +853 -0
  133. package/lib/bryntum-tab-panel.component.d.ts +1065 -0
  134. package/lib/bryntum-tag-combo.component.d.ts +1212 -0
  135. package/lib/bryntum-task-board-base.component.d.ts +1921 -0
  136. package/lib/bryntum-task-board-field-filter-picker-group.component.d.ts +941 -0
  137. package/lib/bryntum-task-board-field-filter-picker.component.d.ts +889 -0
  138. package/lib/bryntum-task-board-project-model.component.d.ts +732 -0
  139. package/lib/bryntum-task-board.component.d.ts +1923 -0
  140. package/lib/bryntum-task-color-combo.component.d.ts +965 -0
  141. package/lib/bryntum-task-filter-field.component.d.ts +1001 -0
  142. package/lib/bryntum-text-area-field.component.d.ts +951 -0
  143. package/lib/bryntum-text-area-picker-field.component.d.ts +972 -0
  144. package/lib/bryntum-text-field.component.d.ts +957 -0
  145. package/lib/bryntum-time-field.component.d.ts +1006 -0
  146. package/lib/bryntum-time-picker.component.d.ts +853 -0
  147. package/lib/bryntum-todo-list-field.component.d.ts +955 -0
  148. package/lib/bryntum-toolbar.component.d.ts +879 -0
  149. package/lib/bryntum-undo-redo.component.d.ts +831 -0
  150. package/lib/bryntum-widget.component.d.ts +678 -0
  151. package/lib/bryntum-year-picker.component.d.ts +1049 -0
  152. package/lib/bryntum-zoom-slider.component.d.ts +784 -0
  153. package/lib/taskboard.module.d.ts +77 -0
  154. package/lib/wrapper.helper.d.ts +26 -0
  155. package/package.json +33 -0
  156. package/public-api.d.ts +72 -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';
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJ5bnR1bS10YXNrLWJvYXJkLXByb2plY3QtbW9kZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vY29tcG9uZW50L3NyYy9saWIvYnJ5bnR1bS10YXNrLWJvYXJkLXByb2plY3QtbW9kZWwuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHNEQUFzRDtBQUN0RDs7R0FFRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQWtELE1BQU0sZUFBZSxDQUFDO0FBRW5JLE9BQU8sYUFBYSxNQUFNLGtCQUFrQixDQUFDO0FBRTdDLE9BQU8sRUFBeVMsWUFBWSxFQUFrVixNQUFNLG9CQUFvQixDQUFDOztBQStaenFCLE1BQU0sT0FBTyxxQ0FBcUM7SUF5TTlDLFlBQVksT0FBbUI7UUFUdkIsa0JBQWEsR0FBRztZQUNwQixLQUFLLEVBQWMsU0FBUztZQUM1QixRQUFRLEVBQVcsU0FBUztZQUM1QixJQUFJLEVBQWUsU0FBUztZQUM1QixnQkFBZ0IsRUFBRyxJQUFJO1lBQ3ZCLFFBQVEsRUFBVyxFQUFFO1lBQ3JCLFNBQVMsRUFBVSxFQUFFO1NBQ3hCLENBQUM7UUFnR0Ysa0JBQWtCO1FBQ2xCOzs7O1dBSUc7UUFDTyxvQkFBZSxHQUFRLElBQUksWUFBWSxFQUE4QyxDQUFDO1FBQ2hHOzs7OztXQUtHO1FBQ08saUJBQVksR0FBUSxJQUFJLFlBQVksRUFBb0csQ0FBQztRQUNuSjs7Ozs7OztXQU9HO1FBQ08sc0JBQWlCLEdBQVEsSUFBSSxZQUFZLEVBQXlILENBQUM7UUFDN0s7Ozs7Ozs7V0FPRztRQUNPLDBCQUFxQixHQUFRLElBQUksWUFBWSxFQUFvSSxDQUFDO1FBQzVMOzs7Ozs7Ozs7V0FTRztRQUNPLGlCQUFZLEdBQVEsSUFBSSxZQUFZLEVBQThJLENBQUM7UUFDN0w7Ozs7Ozs7V0FPRztRQUNPLGlCQUFZLEdBQVEsSUFBSSxZQUFZLEVBQW9HLENB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dGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnMgKi9cbi8qKlxuICogQW5ndWxhciB3cmFwcGVyIGZvciBCcnludHVtIFByb2plY3RNb2RlbFxuICovXG5cbmltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBPdXRwdXQsIElucHV0LCBTaW1wbGVDaGFuZ2UsIFNpbXBsZUNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCBXcmFwcGVySGVscGVyIGZyb20gJy4vd3JhcHBlci5oZWxwZXInO1xuXG5pbXBvcnQgeyBBYnN0cmFjdENydWRNYW5hZ2VyLCBBc3NpZ25tZW50TW9kZWwsIEFzc2lnbm1lbnRNb2RlbENvbmZpZywgQXNzaWdubWVudFN0b3JlLCBBc3NpZ25tZW50U3RvcmVDb25maWcsIEJhc2UsIENydWRNYW5hZ2VyU3RvcmVEZXNjcmlwdG9yLCBEZXBlbmRlbmN5TW9kZWwsIERlcGVuZGVuY3lNb2RlbENvbmZpZywgRGVwZW5kZW5jeVN0b3JlLCBEZXBlbmRlbmN5U3RvcmVDb25maWcsIEV2ZW50TW9kZWwsIEV2ZW50TW9kZWxDb25maWcsIEV2ZW50U3RvcmUsIEV2ZW50U3RvcmVDb25maWcsIE1vZGVsLCBNb2RlbENvbmZpZywgUHJvamVjdE1vZGVsLCBQcm9qZWN0TW9kZWxMaXN0ZW5lcnMsIFJlc291cmNlTW9kZWwsIFJlc291cmNlTW9kZWxDb25maWcsIFJlc291cmNlU3RvcmUsIFJlc291cmNlU3RvcmVDb25maWcsIFJlc291cmNlVGltZVJhbmdlTW9kZWwsIFJlc291cmNlVGltZVJhbmdlTW9kZWxDb25maWcsIFNjaGVkdWxlclByb2plY3RNb2RlbCwgU3RhdGVUcmFja2luZ01hbmFnZXIsIFN0YXRlVHJhY2tpbmdNYW5hZ2VyQ29uZmlnLCBTdG9yZSwgU3RvcmVDb25maWcsIFRhc2tNb2RlbCwgVGFza01vZGVsQ29uZmlnLCBUYXNrU3RvcmUsIFRhc2tTdG9yZUNvbmZpZywgVGltZVJhbmdlTW9kZWwsIFRpbWVSYW5nZU1vZGVsQ29uZmlnIH0gZnJvbSAnQGJyeW50dW0vdGFza2JvYXJkJztcblxuaW1wb3J0IHsgU3RyaW5nSGVscGVyIH0gZnJvbSAnQGJyeW50dW0vdGFza2JvYXJkJztcblxuZXhwb3J0IHR5cGUgQnJ5bnR1bVRhc2tCb2FyZFByb2plY3RNb2RlbFByb3BzID0ge1xuICAgIC8vIENvbmZpZ3NcbiAgICAvKipcbiAgICAgKiBBIGZsYWcsIGluZGljYXRpbmcgd2hldGhlciB0aGUgZGF0ZXMgYW5kIGR1cmF0aW9uIGNhbGN1bGF0aW9ucyBzaG91bGQgYWRqdXN0IHRoZSByZXN1bHQgdG8gRFNUIHRpbWUgc2hpZnQuXG4gICAgICovXG4gICAgYWRqdXN0RHVyYXRpb25Ub0RTVCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgYXNzaWdubWVudCBtb2RlbCBjbGFzcywgdG8gYmUgdXNlZCBpbiB0aGUgcHJvamVjdC4gV2lsbCBiZSBzZXQgYXMgdGhlXG4gICAgICogW21vZGVsQ2xhc3NdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvZGF0YS9TdG9yZSNjb25maWctbW9kZWxDbGFzcykgcHJvcGVydHkgb2YgdGhlIFthc3NpZ25tZW50U3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL21vZGVsL1Byb2plY3RNb2RlbCNwcm9wZXJ0eS1hc3NpZ25tZW50U3RvcmUpXG4gICAgICovXG4gICAgYXNzaWdubWVudE1vZGVsQ2xhc3MgPyA6IHR5cGVvZiBBc3NpZ25tZW50TW9kZWxcbiAgICAvKipcbiAgICAgKiBEYXRhIHVzZSB0byBmaWxsIHRoZSBbYXNzaWdubWVudFN0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9tb2RlbC9Qcm9qZWN0TW9kZWwjcHJvcGVydHktYXNzaWdubWVudFN0b3JlKS4gU2hvdWxkIGJlIGFuIGFycmF5IG9mXG4gICAgICogW0Fzc2lnbm1lbnRNb2RlbHNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL21vZGVsL0Fzc2lnbm1lbnRNb2RlbCkgb3IgaXRzIGNvbmZpZ3VyYXRpb24gb2JqZWN0cy5cbiAgICAgKi9cbiAgICBhc3NpZ25tZW50cyA/IDogQXNzaWdubWVudE1vZGVsW118QXNzaWdubWVudE1vZGVsQ29uZmlnW11cbiAgICAvKipcbiAgICAgKiBUaGUgaW5pdGlhbCBkYXRhLCB0byBmaWxsIHRoZSBbYXNzaWdubWVudFN0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9tb2RlbC9Qcm9qZWN0TW9kZWwjcHJvcGVydHktYXNzaWdubWVudFN0b3JlKSB3aXRoLlxuICAgICAqIFNob3VsZCBiZSBhbiBhcnJheSBvZiBbQXNzaWdubWVudE1vZGVsc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcyNTY2hlZHVsZXIvbW9kZWwvQXNzaWdubWVudE1vZGVsKSBvciBpdHMgY29uZmlndXJhdGlvblxuICAgICAqIG9iamVjdHMuXG4gICAgICogQGRlcHJlY2F0ZWQgNi4zLjAgVXNlIFthc3NpZ25tZW50c10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcyNTY2hlZHVsZXIvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy1hc3NpZ25tZW50cykgaW5zdGVhZFxuICAgICAqL1xuICAgIGFzc2lnbm1lbnRzRGF0YSA/IDogQXNzaWdubWVudE1vZGVsW118QXNzaWdubWVudE1vZGVsQ29uZmlnW11cbiAgICAvKipcbiAgICAgKiBBbiBbQXNzaWdubWVudFN0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9kYXRhL0Fzc2lnbm1lbnRTdG9yZSkgaW5zdGFuY2Ugb3IgYSBjb25maWcgb2JqZWN0LlxuICAgICAqL1xuICAgIGFzc2lnbm1lbnRTdG9yZSA/IDogQXNzaWdubWVudFN0b3JlfEFzc2lnbm1lbnRTdG9yZUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25zdHJ1Y3RvciB0byBjcmVhdGUgYW4gYXNzaWdubWVudCBzdG9yZSBpbnN0YW5jZSB3aXRoLiBTaG91bGQgYmUgYSBjbGFzcywgc3ViY2xhc3NpbmcgdGhlXG4gICAgICogW0Fzc2lnbm1lbnRTdG9yZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcyNTY2hlZHVsZXIvZGF0YS9Bc3NpZ25tZW50U3RvcmUpXG4gICAgICovXG4gICAgYXNzaWdubWVudFN0b3JlQ2xhc3MgPyA6IHR5cGVvZiBBc3NpZ25tZW50U3RvcmV8b2JqZWN0XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBgdHJ1ZWAgdG8gYXV0b21hdGljYWxseSBjYWxsIFtsb2FkXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9jcnVkL0Fic3RyYWN0Q3J1ZE1hbmFnZXJNaXhpbiNmdW5jdGlvbi1sb2FkKSBtZXRob2Qgb24gdGhlIG5leHQgZnJhbWUgYWZ0ZXIgY3JlYXRpb24uXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLWF1dG9Mb2FkKVxuICAgICAqL1xuICAgIGF1dG9Mb2FkID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogYHRydWVgIHRvIGF1dG9tYXRpY2FsbHkgcGVyc2lzdCBzdG9yZSBjaGFuZ2VzIGFmdGVyIGVkaXRzIGFyZSBtYWRlIGluIGFueSBvZiB0aGUgc3RvcmVzIG1vbml0b3JlZC5cbiAgICAgKiBQbGVhc2Ugbm90ZSB0aGF0IHN5bmMgcmVxdWVzdCB3aWxsIG5vdCBiZSBpbnZva2VkIGltbWVkaWF0ZWx5IGJ1dCBvbmx5IGFmdGVyXG4gICAgICogW2F1dG9TeW5jVGltZW91dF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcyNTY2hlZHVsZXIvY3J1ZC9BYnN0cmFjdENydWRNYW5hZ2VyTWl4aW4jY29uZmlnLWF1dG9TeW5jVGltZW91dCkgaW50ZXJ2YWwuXG4gICAgICovXG4gICAgYXV0b1N5bmMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBUaGUgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgcGVyc2lzdGluZyBjaGFuZ2VzIHRvIHRoZSBzZXJ2ZXIuXG4gICAgICogVXNlZCB3aGVuIFthdXRvU3luY10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcyNTY2hlZHVsZXIvY3J1ZC9BYnN0cmFjdENydWRNYW5hZ2VyTWl4aW4jY29uZmlnLWF1dG9TeW5jKSBpcyBzZXQgdG8gYHRydWVgLlxuICAgICAqL1xuICAgIGF1dG9TeW5jVGltZW91dCA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogQW4gb2JqZWN0IHdoZXJlIHByb3BlcnR5IG5hbWVzIHdpdGggYSB0cnV0aHkgdmFsdWUgaW5kaWNhdGUgd2hpY2ggZXZlbnRzIHNob3VsZCBidWJibGUgdXAgdGhlIG93bmVyc2hpcFxuICAgICAqIGhpZXJhcmNoeSB3aGVuIHRyaWdnZXJlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctYnViYmxlRXZlbnRzKVxuICAgICAqL1xuICAgIGJ1YmJsZUV2ZW50cyA/IDogb2JqZWN0XG4gICAgLyoqXG4gICAgICogU2V0IHRvIGB0cnVlYCB0byBjYWxsIG9uWFhYIG1ldGhvZCBuYW1lcyAoZS5nLiBgb25TaG93YCwgYG9uQ2xpY2tgKSwgYXMgYW4gZWFzeSB3YXkgdG8gbGlzdGVuIGZvciBldmVudHMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLWNhbGxPbkZ1bmN0aW9ucylcbiAgICAgKi9cbiAgICBjYWxsT25GdW5jdGlvbnMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBCeSBkZWZhdWx0LCBpZiBhbiBldmVudCBoYW5kbGVyIHRocm93cyBhbiBleGNlcHRpb24sIHRoZSBlcnJvciBwcm9wYWdhdGVzIHVwIHRoZSBzdGFjayBhbmQgdGhlXG4gICAgICogYXBwbGljYXRpb24gc3RhdGUgaXMgdW5kZWZpbmVkLiBDb2RlIHdoaWNoIGZvbGxvd3MgdGhlIGV2ZW50IGhhbmRsZXIgd2lsbCAqbm90KiBiZSBleGVjdXRlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctY2F0Y2hFdmVudEhhbmRsZXJFeGNlcHRpb25zKVxuICAgICAqL1xuICAgIGNhdGNoRXZlbnRIYW5kbGVyRXhjZXB0aW9ucyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIENoaWxkIG5vZGVzLiBUbyBhbGxvdyBsb2FkaW5nIGNoaWxkcmVuIG9uIGRlbWFuZCwgc3BlY2lmeSBgY2hpbGRyZW4gOiB0cnVlYCBpbiB5b3VyIGRhdGEuIE9taXQgdGhlIGZpZWxkIGZvciBsZWFmXG4gICAgICogdGFza3MuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLWNoaWxkcmVuKVxuICAgICAqL1xuICAgIGNoaWxkcmVuID8gOiBib29sZWFufG9iamVjdFtdfE1vZGVsW118TW9kZWxDb25maWdbXVxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGxpc3Qgb2Ygc3RvcmVzIGNvbnRyb2xsZWQgYnkgdGhlIENSVUQgbWFuYWdlci5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctY3J1ZFN0b3JlcylcbiAgICAgKi9cbiAgICBjcnVkU3RvcmVzID8gOiBTdG9yZVtdfHN0cmluZ1tdfENydWRNYW5hZ2VyU3RvcmVEZXNjcmlwdG9yW118U3RvcmVDb25maWdbXVxuICAgIC8qKlxuICAgICAqIERhdGEgdXNlIHRvIGZpbGwgdGhlIFtkZXBlbmRlbmN5U3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL21vZGVsL1Byb2plY3RNb2RlbCNwcm9wZXJ0eS1kZXBlbmRlbmN5U3RvcmUpLiBTaG91bGQgYmUgYW4gYXJyYXkgb2ZcbiAgICAgKiBbRGVwZW5kZW5jeU1vZGVsc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcyNTY2hlZHVsZXIvbW9kZWwvRGVwZW5kZW5jeU1vZGVsKSBvciBpdHMgY29uZmlndXJhdGlvbiBvYmplY3RzLlxuICAgICAqL1xuICAgIGRlcGVuZGVuY2llcyA/IDogRGVwZW5kZW5jeU1vZGVsW118RGVwZW5kZW5jeU1vZGVsQ29uZmlnW11cbiAgICAvKipcbiAgICAgKiBUaGUgaW5pdGlhbCBkYXRhLCB0byBmaWxsIHRoZSBbZGVwZW5kZW5jeVN0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9tb2RlbC9Qcm9qZWN0TW9kZWwjcHJvcGVydHktZGVwZW5kZW5jeVN0b3JlKSB3aXRoLlxuICAgICAqIFNob3VsZCBiZSBhbiBhcnJheSBvZiBbRGVwZW5kZW5jeU1vZGVsc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcyNTY2hlZHVsZXIvbW9kZWwvRGVwZW5kZW5jeU1vZGVsKSBvciBpdHMgY29uZmlndXJhdGlvblxuICAgICAqIG9iamVjdHMuXG4gICAgICogQGRlcHJlY2F0ZWQgNi4zLjAgVXNlIFtkZXBlbmRlbmNpZXNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctZGVwZW5kZW5jaWVzKSBpbnN0ZWFkXG4gICAgICovXG4gICAgZGVwZW5kZW5jaWVzRGF0YSA/IDogRGVwZW5kZW5jeU1vZGVsW118RGVwZW5kZW5jeU1vZGVsQ29uZmlnW11cbiAgICAvKipcbiAgICAgKiBUaGUgY29uc3RydWN0b3Igb2YgdGhlIGRlcGVuZGVuY3kgbW9kZWwgY2xhc3MsIHRvIGJlIHVzZWQgaW4gdGhlIHByb2plY3QuIFdpbGwgYmUgc2V0IGFzIHRoZVxuICAgICAqIFttb2RlbENsYXNzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL2RhdGEvU3RvcmUjY29uZmlnLW1vZGVsQ2xhc3MpIHByb3BlcnR5IG9mIHRoZSBbZGVwZW5kZW5jeVN0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9tb2RlbC9Qcm9qZWN0TW9kZWwjcHJvcGVydHktZGVwZW5kZW5jeVN0b3JlKVxuICAgICAqL1xuICAgIGRlcGVuZGVuY3lNb2RlbENsYXNzID8gOiB0eXBlb2YgRGVwZW5kZW5jeU1vZGVsXG4gICAgLyoqXG4gICAgICogQSBbRGVwZW5kZW5jeVN0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9kYXRhL0RlcGVuZGVuY3lTdG9yZSkgaW5zdGFuY2Ugb3IgYSBjb25maWcgb2JqZWN0LlxuICAgICAqL1xuICAgIGRlcGVuZGVuY3lTdG9yZSA/IDogRGVwZW5kZW5jeVN0b3JlfERlcGVuZGVuY3lTdG9yZUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25zdHJ1Y3RvciB0byBjcmVhdGUgYSBkZXBlbmRlbmN5IHN0b3JlIGluc3RhbmNlIHdpdGguIFNob3VsZCBiZSBhIGNsYXNzLCBzdWJjbGFzc2luZyB0aGVcbiAgICAgKiBbRGVwZW5kZW5jeVN0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9kYXRhL0RlcGVuZGVuY3lTdG9yZSlcbiAgICAgKi9cbiAgICBkZXBlbmRlbmN5U3RvcmVDbGFzcyA/IDogdHlwZW9mIERlcGVuZGVuY3lTdG9yZXxvYmplY3RcbiAgICAvKipcbiAgICAgKiBDb25maWd1cmF0aW9uIG9mIHRoZSBKU09OIGVuY29kZXIgdXNlZCBieSB0aGUgKkNydWQgTWFuYWdlciouXG4gICAgICovXG4gICAgZW5jb2RlciA/IDoge1xuICAgICAgICByZXF1ZXN0RGF0YT86IG9iamVjdFxuICAgIH1cbiAgICAvKipcbiAgICAgKiBEYXRhIHVzZSB0byBmaWxsIHRoZSBbZXZlbnRTdG9yZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcyNTY2hlZHVsZXIvbW9kZWwvUHJvamVjdE1vZGVsI3Byb3BlcnR5LWV2ZW50U3RvcmUpLiBTaG91bGQgYmUgYW4gYXJyYXkgb2ZcbiAgICAgKiBbRXZlbnRNb2RlbHNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL21vZGVsL0V2ZW50TW9kZWwpIG9yIGl0cyBjb25maWd1cmF0aW9uIG9iamVjdHMuXG4gICAgICovXG4gICAgZXZlbnRzID8gOiBFdmVudE1vZGVsW118RXZlbnRNb2RlbENvbmZpZ1tdXG4gICAgLyoqXG4gICAgICogVGhlIGluaXRpYWwgZGF0YSwgdG8gZmlsbCB0aGUgW2V2ZW50U3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL21vZGVsL1Byb2plY3RNb2RlbCNwcm9wZXJ0eS1ldmVudFN0b3JlKSB3aXRoLlxuICAgICAqIFNob3VsZCBiZSBhbiBhcnJheSBvZiBbRXZlbnRNb2RlbHNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL21vZGVsL0V2ZW50TW9kZWwpIG9yIGl0cyBjb25maWd1cmF0aW9uIG9iamVjdHMuXG4gICAgICogQGRlcHJlY2F0ZWQgNi4zLjAgVXNlIFtldmVudHNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctZXZlbnRzKSBpbnN0ZWFkXG4gICAgICovXG4gICAgZXZlbnRzRGF0YSA/IDogRXZlbnRNb2RlbFtdfEV2ZW50TW9kZWxDb25maWdbXVxuICAgIC8qKlxuICAgICAqIEFuIFtFdmVudFN0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9kYXRhL0V2ZW50U3RvcmUpIGluc3RhbmNlIG9yIGEgY29uZmlnIG9iamVjdC5cbiAgICAgKi9cbiAgICBldmVudFN0b3JlID8gOiBFdmVudFN0b3JlfEV2ZW50U3RvcmVDb25maWdcbiAgICAvKipcbiAgICAgKiBTdGFydCBleHBhbmRlZCBvciBub3QgKG9ubHkgdmFsaWQgZm9yIHRyZWUgZGF0YSlcbiAgICAgKi9cbiAgICBleHBhbmRlZCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgYXMgYHRydWVgIHRvIGZvcmNlIHN5bmMgcmVxdWVzdHMgdG8gYmUgc2VudCB3aGVuIGNhbGxpbmcgYHN5bmMoKWAsIGV2ZW4gaWYgdGhlcmUgYXJlIG5vIGxvY2FsXG4gICAgICogY2hhbmdlcy4gVXNlZnVsIGluIGEgcG9sbGluZyBzY2VuYXJpbywgdG8ga2VlcCBjbGllbnQgdXAgdG8gZGF0ZSB3aXRoIHRoZSBiYWNrZW5kLlxuICAgICAqL1xuICAgIGZvcmNlU3luYyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVjb3JkLiBNaWdodCBiZSBtYXBwZWQgdG8gYW5vdGhlciBkYXRhU291cmNlIHVzaW5nIGlkRmllbGQsIGJ1dCBhbHdheXMgZXhwb3NlZCBhc1xuICAgICAqIHJlY29yZC5pZC4gV2lsbCBnZXQgYSBnZW5lcmF0ZWQgdmFsdWUgaWYgbm9uZSBpcyBzcGVjaWZpZWQgaW4gcmVjb3JkcyBkYXRhLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy1pZClcbiAgICAgKi9cbiAgICBpZCA/IDogc3RyaW5nfG51bWJlclxuICAgIC8qKlxuICAgICAqIFNldCB0byBgdHJ1ZWAgdG8gbWFrZSBTVE0gaWdub3JlIGNoYW5nZXMgY29taW5nIGZyb20gdGhlIGJhY2tlbmQuIFRoaXMgd2lsbCBhbGxvdyB1c2VyIHRvIG9ubHkgdW5kbyByZWRvXG4gICAgICogbG9jYWwgY2hhbmdlcy5cbiAgICAgKi9cbiAgICBpZ25vcmVSZW1vdGVDaGFuZ2VzSW5TVE0gPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYGZhbHNlYCB0byBvbmx5IGluY2x1ZGUgdGhlIGlkIG9mIGEgcmVtb3ZlZCBwYXJlbnQgbm9kZSBpbiB0aGUgcmVxdWVzdCB0byB0aGUgYmFja2VuZCAoYWxzb1xuICAgICAqIGFmZmVjdHMgcHJvZ3JhbW1hdGljIGNhbGxzIHRvIGdldCBbY2hhbmdlc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcyNTY2hlZHVsZXIvY3J1ZC9BYnN0cmFjdENydWRNYW5hZ2VyTWl4aW4jcHJvcGVydHktY2hhbmdlcykgZXRjLiksIGFuZCBub3QgdGhlIGlkcyBvZiBpdHMgY2hpbGRyZW4uXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLWluY2x1ZGVDaGlsZHJlbkluUmVtb3ZlUmVxdWVzdClcbiAgICAgKi9cbiAgICBpbmNsdWRlQ2hpbGRyZW5JblJlbW92ZVJlcXVlc3QgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgbGVnYWN5IGRhdGEgcHJvcGVydGllcyBpbiB0aGUgSlNPTiAvIGlubGluZURhdGEgb3V0cHV0LiBUaGUgbGVnYWN5IGRhdGEgcHJvcGVydGllcyBhcmVcbiAgICAgKiB0aGUgYHh4RGF0YWAgKGBldmVudHNEYXRhYCwgYHJlc291cmNlc0RhdGFgIGV0Yy4pIHByb3BlcnRpZXMgdGhhdCBhcmUgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluXG4gICAgICogdGhlIGZ1dHVyZS5cbiAgICAgKiBAZGVwcmVjYXRlZCA2LjMuMCBUaGlzIGNvbmZpZyB3aWxsIGJlIHJlbW92ZWQgd2hlbiB0aGUgZXZlbnRzRGF0YSwgcmVzb3VyY2VzRGF0YSBldGMuIHByb3BlcnRpZXMgYXJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS5cbiAgICAgKi9cbiAgICBpbmNsdWRlTGVnYWN5RGF0YVByb3BlcnRpZXMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZpZWxkIGlzIGFkZGVkIHRvIHRoZSBjbGFzcyBhdCBydW50aW1lIHdoZW4gdGhlIFN0b3JlIGlzIGNvbmZpZ3VyZWQgd2l0aFxuICAgICAqIFtsYXp5TG9hZF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS9kYXRhL1N0b3JlI2NvbmZpZy1sYXp5TG9hZCkuIElmIHNldCBvbiBhIHBhcmVudCByZWNvcmQgYXQgbG9hZCB0aW1lLCB0aGF0IHBhcmVudCB3aWxsIG5vdCBjYXVzZSBhbnlcbiAgICAgKiBtb3JlIGNoaWxkIGxvYWQgcmVxdWVzdHMuIElmIG9taXR0ZWQsIGl0IHdpbGwgYmUgYXV0b21hdGljYWxseSBzZXQgdG8gYHRydWVgIHdoZW4gYSBsb2FkIHJlcXVlc3QgcmVjZWl2ZXMgZmV3ZXJcbiAgICAgKiBjaGlsZCByZWNvcmRzIHRoYW4gcmVxdWVzdGVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy1pc0Z1bGx5TG9hZGVkKVxuICAgICAqL1xuICAgIGlzRnVsbHlMb2FkZWQgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBQcm9qZWN0IGRhdGEgYXMgYSBKU09OIHN0cmluZywgdXNlZCB0byBwb3B1bGF0ZSBpdHMgc3RvcmVzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy1qc29uKVxuICAgICAqL1xuICAgIGpzb24gPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFRoZSBsaXN0ZW5lciBzZXQgZm9yIHRoaXMgb2JqZWN0LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy1saXN0ZW5lcnMpXG4gICAgICovXG4gICAgbGlzdGVuZXJzID8gOiBQcm9qZWN0TW9kZWxMaXN0ZW5lcnNcbiAgICAvKipcbiAgICAgKiBDb252ZW5pZW5jZSBzaG9ydGN1dCB0byBzZXQgb25seSB0aGUgdXJsIHRvIGxvYWQgZnJvbSwgd2hlbiB5b3UgZG8gbm90IG5lZWQgdG8gc3VwcGx5IGFueSBvdGhlciBjb25maWdcbiAgICAgKiBvcHRpb25zIGluIHRoZSBgbG9hZGAgc2VjdGlvbiBvZiB0aGUgYHRyYW5zcG9ydGAgY29uZmlnLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy1sb2FkVXJsKVxuICAgICAqL1xuICAgIGxvYWRVcmwgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYSByZWFkLW9ubHkgZmllbGQgcHJvdmlkZWQgaW4gc2VydmVyIHN5bmNocm9uaXphdGlvbiBwYWNrZXRzIHRvIHNwZWNpZnlcbiAgICAgKiB3aGljaCBwb3NpdGlvbiB0aGUgbm9kZSB0YWtlcyBpbiB0aGUgcGFyZW50J3Mgb3JkZXJlZCBjaGlsZHJlbiBhcnJheS5cbiAgICAgKiBUaGlzIGluZGV4IGlzIHNldCBvbiBsb2FkIGFuZCBnZXRzIHVwZGF0ZWQgb24gcmVvcmRlcmluZyBub2RlcyBpbiB0cmVlLiBTb3J0aW5nIGFuZCBmaWx0ZXJpbmdcbiAgICAgKiBoYXZlIG5vIGVmZmVjdCBvbiBpdC5cbiAgICAgKi9cbiAgICBvcmRlcmVkUGFyZW50SW5kZXggPyA6IG51bWJlclxuICAgIC8qKlxuICAgICAqIFRoaXMgaXMgYSByZWFkLW9ubHkgZmllbGQgcHJvdmlkZWQgaW4gc2VydmVyIHN5bmNocm9uaXphdGlvbiBwYWNrZXRzIHRvIHNwZWNpZnlcbiAgICAgKiB3aGljaCByZWNvcmQgaWQgaXMgdGhlIHBhcmVudCBvZiB0aGUgcmVjb3JkLlxuICAgICAqL1xuICAgIHBhcmVudElkID8gOiBzdHJpbmd8bnVtYmVyfG51bGxcbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIGEgcmVhZC1vbmx5IGZpZWxkIHByb3ZpZGVkIGluIHNlcnZlciBzeW5jaHJvbml6YXRpb24gcGFja2V0cyB0byBzcGVjaWZ5XG4gICAgICogd2hpY2ggcG9zaXRpb24gdGhlIG5vZGUgdGFrZXMgaW4gdGhlIHBhcmVudCdzIGNoaWxkcmVuIGFycmF5LlxuICAgICAqIFRoaXMgaW5kZXggaXMgc2V0IG9uIGxvYWQgYW5kIGdldHMgdXBkYXRlZCBhdXRvbWF0aWNhbGx5IGFmdGVyIHJvdyByZW9yZGVyaW5nLCBzb3J0aW5nLCBldGMuXG4gICAgICogVG8gc2F2ZSB0aGUgb3JkZXIsIG5lZWQgdG8gcGVyc2lzdCB0aGUgZmllbGQgb24gdGhlIHNlcnZlciBhbmQgd2hlbiBkYXRhIGlzIGZldGNoZWQgdG8gYmUgbG9hZGVkLFxuICAgICAqIG5lZWQgdG8gc29ydCBieSB0aGlzIGZpZWxkLlxuICAgICAqL1xuICAgIHBhcmVudEluZGV4ID8gOiBudW1iZXJcbiAgICAvKipcbiAgICAgKiBGaWVsZCBuYW1lIHRvIGJlIHVzZWQgdG8gdHJhbnNmZXIgYSBwaGFudG9tIHJlY29yZCBpZGVudGlmaWVyLlxuICAgICAqL1xuICAgIHBoYW50b21JZEZpZWxkID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBGaWVsZCBuYW1lIHRvIGJlIHVzZWQgdG8gdHJhbnNmZXIgYSBwaGFudG9tIHBhcmVudCByZWNvcmQgaWRlbnRpZmllci5cbiAgICAgKi9cbiAgICBwaGFudG9tUGFyZW50SWRGaWVsZCA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogRmxhZyB0aGUgcmVjb3JkIGFzIHJlYWQtb25seSBvbiB0aGUgVUkgbGV2ZWwsIHByZXZlbnRpbmcgdGhlIGVuZCB1c2VyIGZyb20gbWFuaXB1bGF0aW5nIGl0IHVzaW5nIGVkaXRpbmdcbiAgICAgKiBmZWF0dXJlcyBzdWNoIGFzIGNlbGwgZWRpdGluZyBhbmQgZXZlbnQgZHJhZ2dpbmcuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLXJlYWRPbmx5KVxuICAgICAqL1xuICAgIHJlYWRPbmx5ID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCBpcyBhZGRlZCB0byB0aGUgY2xhc3MgYXQgcnVudGltZSB3aGVuIHRoZSBTdG9yZSBpcyBjb25maWd1cmVkIHdpdGhcbiAgICAgKiBbbGF6eUxvYWRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvZGF0YS9TdG9yZSNjb25maWctbGF6eUxvYWQpLiBUaGVcbiAgICAgKiBudW1iZXIgc3BlY2lmaWVkIHNob3VsZCByZWZsZWN0IHRoZSA8c3Ryb25nPnRvdGFsPC9zdHJvbmc+IGFtb3VudCBvZiBjaGlsZHJlbiBvZiBhIHBhcmVudCBub2RlLCBpbmNsdWRpbmcgbmVzdGVkIGRlc2NlbmRhbnRzLlxuICAgICAqIEBkZXByZWNhdGVkIFRoaXMgZmllbGQgaGFzIGJlZW4gZGVwcmVjYXRlZC4gUGxlYXNlIHJlYWQgdGhlIFtndWlkZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvZ3VpZGUvR3JpZC9kYXRhL2xhenlsb2FkaW5nKSB0byBmaW5kIG91dCBpZiB5b3VyIGFwcCBuZWVkcyB0byB1c2UgdGhlIG5ldyBbaXNGdWxseUxvYWRlZF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS9kYXRhL21peGluL1RyZWVOb2RlI2ZpZWxkLWlzRnVsbHlMb2FkZWQpIGZpZWxkLlxuICAgICAqL1xuICAgIHJlbW90ZUNoaWxkQ291bnQgPyA6IG51bWJlclxuICAgIC8qKlxuICAgICAqIGBUcnVlYCB0byByZXNldCBpZGVudGlmaWVycyAoZGVmaW5lZCBieSBgaWRGaWVsZGAgY29uZmlnKSBvZiBwaGFudG9tIHJlY29yZHMgYmVmb3JlIHN1Ym1pdHRpbmcgdGhlbVxuICAgICAqIHRvIHRoZSBzZXJ2ZXIuXG4gICAgICovXG4gICAgcmVzZXRJZHNCZWZvcmVTeW5jID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogVGhlIGNvbnN0cnVjdG9yIG9mIHRoZSByZXNvdXJjZSBtb2RlbCBjbGFzcywgdG8gYmUgdXNlZCBpbiB0aGUgcHJvamVjdC4gV2lsbCBiZSBzZXQgYXMgdGhlXG4gICAgICogW21vZGVsQ2xhc3NdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvZGF0YS9TdG9yZSNjb25maWctbW9kZWxDbGFzcykgcHJvcGVydHkgb2YgdGhlIFtyZXNvdXJjZVN0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9tb2RlbC9Qcm9qZWN0TW9kZWwjcHJvcGVydHktcmVzb3VyY2VTdG9yZSlcbiAgICAgKi9cbiAgICByZXNvdXJjZU1vZGVsQ2xhc3MgPyA6IHR5cGVvZiBSZXNvdXJjZU1vZGVsXG4gICAgLyoqXG4gICAgICogRGF0YSB1c2UgdG8gZmlsbCB0aGUgW3Jlc291cmNlU3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL21vZGVsL1Byb2plY3RNb2RlbCNwcm9wZXJ0eS1yZXNvdXJjZVN0b3JlKS4gU2hvdWxkIGJlIGFuIGFycmF5IG9mXG4gICAgICogW1Jlc291cmNlTW9kZWxzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9tb2RlbC9SZXNvdXJjZU1vZGVsKSBvciBpdHMgY29uZmlndXJhdGlvbiBvYmplY3RzLlxuICAgICAqL1xuICAgIHJlc291cmNlcyA/IDogUmVzb3VyY2VNb2RlbFtdfFJlc291cmNlTW9kZWxDb25maWdbXVxuICAgIC8qKlxuICAgICAqIFRoZSBpbml0aWFsIGRhdGEsIHRvIGZpbGwgdGhlIFtyZXNvdXJjZVN0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9tb2RlbC9Qcm9qZWN0TW9kZWwjcHJvcGVydHktcmVzb3VyY2VTdG9yZSkgd2l0aC5cbiAgICAgKiBTaG91bGQgYmUgYW4gYXJyYXkgb2YgW1Jlc291cmNlTW9kZWxzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9tb2RlbC9SZXNvdXJjZU1vZGVsKSBvciBpdHMgY29uZmlndXJhdGlvbiBvYmplY3RzLlxuICAgICAqIEBkZXByZWNhdGVkIDYuMy4wIFVzZSBbcmVzb3VyY2VzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLXJlc291cmNlcykgaW5zdGVhZFxuICAgICAqL1xuICAgIHJlc291cmNlc0RhdGEgPyA6IFJlc291cmNlTW9kZWxbXXxSZXNvdXJjZU1vZGVsQ29uZmlnW11cbiAgICAvKipcbiAgICAgKiBBIFtSZXNvdXJjZVN0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9kYXRhL1Jlc291cmNlU3RvcmUpIGluc3RhbmNlIG9yIGEgY29uZmlnIG9iamVjdC5cbiAgICAgKi9cbiAgICByZXNvdXJjZVN0b3JlID8gOiBSZXNvdXJjZVN0b3JlfFJlc291cmNlU3RvcmVDb25maWdcbiAgICAvKipcbiAgICAgKiBUaGUgY29uc3RydWN0b3IgdG8gY3JlYXRlIGEgcmVzb3VyY2Ugc3RvcmUgaW5zdGFuY2Ugd2l0aC4gU2hvdWxkIGJlIGEgY2xhc3MsIHN1YmNsYXNzaW5nIHRoZVxuICAgICAqIFtSZXNvdXJjZVN0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9kYXRhL1Jlc291cmNlU3RvcmUpXG4gICAgICovXG4gICAgcmVzb3VyY2VTdG9yZUNsYXNzID8gOiB0eXBlb2YgUmVzb3VyY2VTdG9yZXxvYmplY3RcbiAgICAvKipcbiAgICAgKiBFeHBlcmltZW50YWwgaG9vayB0aGF0IGxldHMgdGhlIGFwcCBkZXRlcm1pbmUgaWYgYSBib3VuZCBkYXRhc2V0IG5lZWRzIHN5bmNpbmcgd2l0aCB0aGUgc3RvcmUgb3Igbm90LCBhbmRcbiAgICAgKiBpZiBpdCBkb2VzIC0gd2hpY2ggcmVjb3JkcyB0aGF0IHNob3VsZCBiZSBwcm9jZXNzZWQuIE9ubHkgY2FsbGVkIGZvciBzdG9yZXMgdGhhdCBhcmUgY29uZmlndXJlZCB3aXRoXG4gICAgICogYHN5bmNEYXRhT25Mb2FkOiB0cnVlYCAod2hpY2ggaXMgdGhlIGRlZmF1bHQgaW4gdGhlIFJlYWN0LCBBbmd1bGFyIGFuZCBWdWUgd3JhcHBlcnMpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy1zaG91bGRTeW5jRGF0YU9uTG9hZClcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBPcHRpb25zIHBhc3NlZCBieSB0aGUgc3RvcmUgdG8gdGhpcyBob29rXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuU3RvcmV9IG9wdGlvbnMuc3RvcmUgU3RvcmUgYWJvdXQgdG8gYmUgc3luY2VkXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IG9wdGlvbnMucmVjb3JkcyBSZWNvcmRzIGN1cnJlbnRseSBpbiB0aGUgc3RvcmVcbiAgICAgKiBAcGFyYW0ge29iamVjdFtdfSBvcHRpb25zLmRhdGEgSW5jb21pbmcgZGF0YVxuICAgICAqIEByZXR1cm5zIHtTZXQ8YW55Pixib29sZWFufSBSZXR1cm4gYGZhbHNlYCB0byBwcmV2ZW50IHRoZSBzdG9yZSBmcm9tIHN5bmNpbmcsIG9yIGEgc2V0IG9mIHJlY29yZCBpZHMgdGhhdCBuZWVkIGZ1cnRoZXIgcHJvY2Vzc2luZyAoZm9yIHJlY29yZHMgdGhhdCBoYXMgc29tZSBraW5kIG9mIGNoYW5nZSwgZWcuIGFuIHVwZGF0ZSwgcmVtb3ZhbCBvciBhZGRpdGlvbilcbiAgICAgKi9cbiAgICBzaG91bGRTeW5jRGF0YU9uTG9hZCA/IDogKG9wdGlvbnM6IHsgc3RvcmU6IFN0b3JlLCByZWNvcmRzOiBNb2RlbCwgZGF0YTogb2JqZWN0W10gfSkgPT4gU2V0PGFueT58Ym9vbGVhblxuICAgIC8qKlxuICAgICAqIFNpbGVuY2VzIHByb3BhZ2F0aW9ucyBjYXVzZWQgYnkgdGhlIHByb2plY3QgbG9hZGluZy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctc2lsZW5jZUluaXRpYWxDb21taXQpXG4gICAgICovXG4gICAgc2lsZW5jZUluaXRpYWxDb21taXQgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCB0cmVhdHMgcGFyc2VkIHJlc3BvbnNlcyB3aXRob3V0IGBzdWNjZXNzYCBwcm9wZXJ0eSBhcyBzdWNjZXNzZnVsLlxuICAgICAqIEluIHRoaXMgbW9kZSBhIHBhcnNlZCByZXNwb25zZSBpcyB0cmVhdGVkIGFzIGludmFsaWQgaWYgaXQgaGFzIGV4cGxpY2l0bHkgc2V0IGBzdWNjZXNzIDogZmFsc2VgLlxuICAgICAqL1xuICAgIHNraXBTdWNjZXNzUHJvcGVydHkgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBDb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gcHJvdmlkZSB0byB0aGUgU1RNIG1hbmFnZXJcbiAgICAgKi9cbiAgICBzdG0gPyA6IFN0YXRlVHJhY2tpbmdNYW5hZ2VyQ29uZmlnfFN0YXRlVHJhY2tpbmdNYW5hZ2VyXG4gICAgLyoqXG4gICAgICogTmFtZSBvZiBhIHN0b3JlIHByb3BlcnR5IHRvIHJldHJpZXZlIHN0b3JlIGlkZW50aWZpZXJzIGZyb20uIE1ha2Ugc3VyZSB5b3UgaGF2ZSBhbiBpbnN0YW5jZSBvZiBhXG4gICAgICogc3RvcmUgdG8gdXNlIGl0IGJ5IGlkLiBTdG9yZSBpZGVudGlmaWVyIGlzIHVzZWQgYXMgYSBjb250YWluZXIgbmFtZSBob2xkaW5nIGNvcnJlc3BvbmRpbmcgc3RvcmUgZGF0YVxuICAgICAqIHdoaWxlIHRyYW5zZmVycmluZyB0aGVtIHRvL2Zyb20gdGhlIHNlcnZlci4gQnkgZGVmYXVsdCwgYGlkYCBwcm9wZXJ0eSBpcyB1c2VkLiBBbmQgaW4gY2FzZSBhXG4gICAgICogY29udGFpbmVyIGlkZW50aWZpZXIgaGFzIHRvIGRpZmZlciB0aGlzIGNvbmZpZyBjYW4gYmUgdXNlZDpcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctc3RvcmVJZFByb3BlcnR5KVxuICAgICAqL1xuICAgIHN0b3JlSWRQcm9wZXJ0eSA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAgdGhlIENydWQgTWFuYWdlciBkb2VzIG5vdCByZXF1aXJlIGFsbCB1cGRhdGVkIGFuZCByZW1vdmVkIHJlY29yZHMgdG8gYmUgbWVudGlvbmVkIGluIHRoZVxuICAgICAqICpzeW5jKiByZXNwb25zZS4gSW4gdGhpcyBjYXNlIHJlc3BvbnNlIHNob3VsZCBpbmNsdWRlIG9ubHkgc2VydmVyIHNpZGUgY2hhbmdlcy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctc3VwcG9ydFNob3J0U3luY1Jlc3BvbnNlKVxuICAgICAqL1xuICAgIHN1cHBvcnRTaG9ydFN5bmNSZXNwb25zZSA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHN0b3JlIGlkZW50aWZpZXJzIHNldHMgYW4gYWx0ZXJuYXRpdmUgc3luYyByZXNwb25zZXMgYXBwbHkgb3JkZXIuXG4gICAgICogQnkgZGVmYXVsdCwgdGhlIG9yZGVyIGluIHdoaWNoIHN5bmMgcmVzcG9uc2VzIGFyZSBhcHBsaWVkIHRvIHRoZSBzdG9yZXMgaXMgdGhlIHNhbWUgYXMgdGhleVxuICAgICAqIHJlZ2lzdGVyZWQgaW4uIEJ1dCBpbiBjYXNlIG9mIHNvbWUgdHJpY2t5IGRlcGVuZGVuY2llcyBiZXR3ZWVuIHN0b3JlcyB0aGlzIG9yZGVyIGNhbiBiZSBjaGFuZ2VkOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy1zeW5jQXBwbHlTZXF1ZW5jZSlcbiAgICAgKi9cbiAgICBzeW5jQXBwbHlTZXF1ZW5jZSA/IDogc3RyaW5nW118Q3J1ZE1hbmFnZXJTdG9yZURlc2NyaXB0b3JbXVxuICAgIC8qKlxuICAgICAqIENvbnZlbmllbmNlIHNob3J0Y3V0IHRvIHNldCBvbmx5IHRoZSB1cmwgdG8gc3luYyB0bywgd2hlbiB5b3UgZG8gbm90IG5lZWQgdG8gc3VwcGx5IGFueSBvdGhlciBjb25maWdcbiAgICAgKiBvcHRpb25zIGluIHRoZSBgc3luY2Agc2VjdGlvbiBvZiB0aGUgYHRyYW5zcG9ydGAgY29uZmlnLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvbW9kZWwvUHJvamVjdE1vZGVsI2NvbmZpZy1zeW5jVXJsKVxuICAgICAqL1xuICAgIHN5bmNVcmwgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgdGFzayBtb2RlbCBjbGFzcywgdG8gYmUgdXNlZCBpbiB0aGUgcHJvamVjdC5cbiAgICAgKiBXaWxsIGJlIHNldCBhcyB0aGUgW21vZGVsQ2xhc3NdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvZGF0YS9TdG9yZSNjb25maWctbW9kZWxDbGFzcylcbiAgICAgKiBwcm9wZXJ0eSBvZiB0aGUgW3Rhc2tTdG9yZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL1Byb2plY3RNb2RlbCNwcm9wZXJ0eS10YXNrU3RvcmUpLlxuICAgICAqL1xuICAgIHRhc2tNb2RlbENsYXNzID8gOiB0eXBlb2YgVGFza01vZGVsXG4gICAgLyoqXG4gICAgICogVGhlIGluaXRpYWwgZGF0YSwgdG8gZmlsbCB0aGUgW3Rhc2tTdG9yZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL1Byb2plY3RNb2RlbCNwcm9wZXJ0eS10YXNrU3RvcmUpIHdpdGguIFNob3VsZCBiZSBhbiBhcnJheSBvZlxuICAgICAqIFtUYXNrTW9kZWxdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9tb2RlbC9UYXNrTW9kZWwpIG9yIGl0cyBjb25maWd1cmF0aW9uIG9iamVjdHMuXG4gICAgICovXG4gICAgdGFza3MgPyA6IFRhc2tNb2RlbFtdfFRhc2tNb2RlbENvbmZpZ1tdXG4gICAgLyoqXG4gICAgICogVGhlIGluaXRpYWwgZGF0YSwgdG8gZmlsbCB0aGUgW3Rhc2tTdG9yZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL1Byb2plY3RNb2RlbCNwcm9wZXJ0eS10YXNrU3RvcmUpIHdpdGguXG4gICAgICogU2hvdWxkIGJlIGFuIGFycmF5IG9mIFtUYXNrTW9kZWxdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9tb2RlbC9UYXNrTW9kZWwpIGluc3RhbmNlcyBvciBpdHMgY29uZmlndXJhdGlvbiBvYmplY3RzLlxuICAgICAqIEBkZXByZWNhdGVkIDYuMy4wIFVzZSBbdGFza3NdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLXRhc2tzKSBpbnN0ZWFkXG4gICAgICovXG4gICAgdGFza3NEYXRhID8gOiBUYXNrTW9kZWxbXXxUYXNrTW9kZWxDb25maWdbXVxuICAgIC8qKlxuICAgICAqIEFuIFtUYXNrU3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9zdG9yZS9UYXNrU3RvcmUpIGluc3RhbmNlIG9yIGEgY29uZmlnIG9iamVjdC5cbiAgICAgKi9cbiAgICB0YXNrU3RvcmUgPyA6IFRhc2tTdG9yZUNvbmZpZ3xUYXNrU3RvcmVcbiAgICAvKipcbiAgICAgKiBUaGUgY29uc3RydWN0b3IgdG8gY3JlYXRlIGEgdGFzayBzdG9yZSBpbnN0YW5jZSB3aXRoLlxuICAgICAqIFNob3VsZCBiZSBhIGNsYXNzLCBzdWJjbGFzc2luZyB0aGUgW1Rhc2tTdG9yZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL3N0b3JlL1Rhc2tTdG9yZSkuXG4gICAgICovXG4gICAgdGFza1N0b3JlQ2xhc3MgPyA6IHR5cGVvZiBUYXNrU3RvcmVcbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYSBJQU5BIHRpbWUgem9uZSAoaS5lLiBgRXVyb3BlL1N0b2NraG9sbWApIG9yIGEgVVRDIG9mZnNldCBpbiBtaW51dGVzIChpLmUuIGAtMTIwYCkuIFRoaXMgd2lsbFxuICAgICAqIGNvbnZlcnQgYWxsIGV2ZW50cywgdGFza3MgYW5kIHRpbWUgcmFuZ2VzIHRvIHRoZSBzcGVjaWZpZWQgdGltZSB6b25lIG9yIG9mZnNldC4gSXQgd2lsbCBhbHNvIGFmZmVjdCB0aGVcbiAgICAgKiBkaXNwbGF5ZWQgdGltZWxpbmUncyBoZWFkZXJzIGFzIHdlbGwgYXQgdGhlIHN0YXJ0IGFuZCBlbmQgZGF0ZSBvZiBpdC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctdGltZVpvbmUpXG4gICAgICovXG4gICAgdGltZVpvbmUgPyA6IHN0cmluZ3xudW1iZXJcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgdGhlIG91dHB1dCBmb3JtYXQgb2YgW3RvSlNPTl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcyNTY2hlZHVsZXIvbW9kZWwvbWl4aW4vUHJvamVjdE1vZGVsQ29tbW9uI2Z1bmN0aW9uLXRvSlNPTikuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLXRvSlNPTlJlc3VsdEZvcm1hdClcbiAgICAgKi9cbiAgICB0b0pTT05SZXN1bHRGb3JtYXQgPyA6ICdpbmxpbmVEYXRhJ3wnbW9kZWwnXG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAgZm9yY2VzIHRoZSBDUlVEIG1hbmFnZXIgdG8gcHJvY2VzcyByZXNwb25zZXMgZGVwZW5kaW5nIG9uIHRoZWlyIGB0eXBlYCBhdHRyaWJ1dGUuXG4gICAgICogU28gYGxvYWRgIHJlcXVlc3QgbWF5IGJlIHJlc3BvbmRlZCB3aXRoIGBzeW5jYCByZXNwb25zZSBmb3IgZXhhbXBsZS5cbiAgICAgKiBDYW4gYmUgdXNlZCBmb3Igc21hcnQgc2VydmVyIGxvZ2ljIGFsbG93aW5nIHRoZSBzZXJ2ZXIgdG8gZGVjaWRlIHdoZW4gaXQncyBiZXR0ZXIgdG8gcmVzcG9uZCB3aXRoIGFcbiAgICAgKiBjb21wbGV0ZSBkYXRhIHNldCAoYGxvYWRgIHJlc3BvbnNlKSBvciBpdCdzIGVub3VnaCB0byByZXR1cm4ganVzdCBhIGRlbHRhIChgc3luY2AgcmVzcG9uc2UpLlxuICAgICAqL1xuICAgIHRyYWNrUmVzcG9uc2VUeXBlID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJhdGlvbiBvZiB0aGUgQUpBWCByZXF1ZXN0cyB1c2VkIGJ5ICpDcnVkIE1hbmFnZXIqIHRvIGNvbW11bmljYXRlIHdpdGggYSBzZXJ2ZXItc2lkZS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctdHJhbnNwb3J0KVxuICAgICAqL1xuICAgIHRyYW5zcG9ydCA/IDoge1xuICAgICAgICBsb2FkPzogb2JqZWN0XG4gICAgICAgIHN5bmM/OiBvYmplY3RcbiAgICB9XG4gICAgLyoqXG4gICAgICogQnkgZGVmYXVsdCwgdGhlIHN0b3JlcyBvZiBhIHByb2plY3QgdXNlIHRoZSByYXcgZGF0YSBvYmplY3RzIHBhc3NlZCB0byB0aGVtIGFzIHRoZSBkYXRhIHNvdXJjZSBmb3IgdGhlaXJcbiAgICAgKiByZWNvcmRzIGlmIGRhdGEgaXMgbG9hZGVkIHJlbW90ZWx5ICh1c2luZyBhbiBgQWpheFN0b3JlYCBvciBhIGBDcnVkTWFuYWdlcmApLiBGb3IgZGF0YSBzdXBwbGllZCBpbmxpbmUsXG4gICAgICogdGhlIGRhdGEgb2JqZWN0cyBhcmUgaW5zdGVhZCBieSBkZWZhdWx0IGNsb25lZCB0byBhdm9pZCB0aGUgb3JpZ2luYWwgZGF0YSBvYmplY3QgYmVpbmcgbW9kaWZpZWQgYnkgdGhlXG4gICAgICogc3RvcmUuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9tb2RlbC9Qcm9qZWN0TW9kZWwjY29uZmlnLXVzZVJhd0RhdGEpXG4gICAgICovXG4gICAgdXNlUmF3RGF0YSA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFRoaXMgY29uZmlnIHZhbGlkYXRlcyB0aGUgcmVzcG9uc2Ugc3RydWN0dXJlIGZvciByZXF1ZXN0cyBtYWRlIGJ5IHRoZSBDcnVkIE1hbmFnZXIuXG4gICAgICogV2hlbiBgdHJ1ZWAsIHRoZSBDcnVkIE1hbmFnZXIgY2hlY2tzIGV2ZXJ5IHBhcnNlZCByZXNwb25zZSBzdHJ1Y3R1cmUgZm9yIGVycm9yc1xuICAgICAqIGFuZCBpZiB0aGUgcmVzcG9uc2UgZm9ybWF0IGlzIGludmFsaWQsIGEgd2FybmluZyBpcyBsb2dnZWQgdG8gdGhlIGJyb3dzZXIgY29uc29sZS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL1Byb2plY3RNb2RlbCNjb25maWctdmFsaWRhdGVSZXNwb25zZSlcbiAgICAgKi9cbiAgICB2YWxpZGF0ZVJlc3BvbnNlID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogYHRydWVgIHRvIHdyaXRlIGFsbCBmaWVsZHMgZnJvbSB0aGUgcmVjb3JkIHRvIHRoZSBzZXJ2ZXIuXG4gICAgICogSWYgc2V0IHRvIGBmYWxzZWAgaXQgd2lsbCBvbmx5IHNlbmQgdGhlIGZpZWxkcyB0aGF0IHdlcmUgbW9kaWZpZWQuXG4gICAgICogTm90ZSB0aGF0IGFueSBmaWVsZHMgdGhhdCBoYXZlIFtwZXJzaXN0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL2RhdGEvZmllbGQvRGF0YUZpZWxkI2NvbmZpZy1wZXJzaXN0KSBzZXQgdG8gYGZhbHNlYCB3aWxsXG4gICAgICogc3RpbGwgYmUgaWdub3JlZCBhbmQgZmllbGRzIGhhdmluZyBbYWx3YXlzV3JpdGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL0NvcmUvZGF0YS9maWVsZC9EYXRhRmllbGQjY29uZmlnLWFsd2F5c1dyaXRlKSBzZXQgdG8gYHRydWVgXG4gICAgICogd2lsbCBhbHdheXMgYmUgaW5jbHVkZWQuXG4gICAgICovXG4gICAgd3JpdGVBbGxGaWVsZHMgPyA6IGJvb2xlYW5cblxufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvciA6ICdicnludHVtLXRhc2stYm9hcmQtcHJvamVjdC1tb2RlbCcsXG4gICAgdGVtcGxhdGUgOiAnJ1xufSlcbmV4cG9ydCBjbGFzcyBCcnludHVtVGFza0JvYXJkUHJvamVjdE1vZGVsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gICAgcHVibGljIHN0YXRpYyBpbnN0YW5jZUNsYXNzID0gUHJvamVjdE1vZGVsO1xuXG4gICAgcHVibGljIHN0YXRpYyBpbnN0YW5jZU5hbWUgPSAnUHJvamVjdE1vZGVsJztcblxuICAgIHByaXZhdGUgc3RhdGljIGJyeW50dW1FdmVudHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAnb25CZWZvcmVEZXN0cm95JyxcbiAgICAgICAgJ29uQmVmb3JlTG9hZCcsXG4gICAgICAgICdvbkJlZm9yZUxvYWRBcHBseScsXG4gICAgICAgICdvbkJlZm9yZVJlc3BvbnNlQXBwbHknLFxuICAgICAgICAnb25CZWZvcmVTZW5kJyxcbiAgICAgICAgJ29uQmVmb3JlU3luYycsXG4gICAgICAgICdvbkJlZm9yZVN5bmNBcHBseScsXG4gICAgICAgICdvbkNhdGNoQWxsJyxcbiAgICAgICAgJ29uQ2hhbmdlJyxcbiAgICAgICAgJ29uRGF0YVJlYWR5JyxcbiAgICAgICAgJ29uRGVzdHJveScsXG4gICAgICAgICdvbkhhc0NoYW5nZXMnLFxuICAgICAgICAnb25Mb2FkJyxcbiAgICAgICAgJ29uTG9hZENhbmNlbGVkJyxcbiAgICAgICAgJ29uTG9hZEZhaWwnLFxuICAgICAgICAnb25Ob0NoYW5nZXMnLFxuICAgICAgICAnb25SZXF1ZXN0RG9uZScsXG4gICAgICAgICdvblJlcXVlc3RGYWlsJyxcbiAgICAgICAgJ29uU3luYycsXG4gICAgICAgICdvblN5bmNDYW5jZWxlZCcsXG4gICAgICAgICdvblN5bmNEZWxheWVkJyxcbiAgICAgICAgJ29uU3luY0ZhaWwnXG4gICAgXTtcblxuICAgIHByaXZhdGUgc3RhdGljIGJyeW50dW1GZWF0dXJlTmFtZXM6IHN0cmluZ1tdID0gW1xuXG4gICAgXTtcblxuICAgIHByaXZhdGUgc3RhdGljIGJyeW50dW1Db25maWdzOiBzdHJpbmdbXSA9IEJyeW50dW1UYXNrQm9hcmRQcm9qZWN0TW9kZWxDb21wb25lbnQuYnJ5bnR1bUZlYXR1cmVOYW1lcy5jb25jYXQoW1xuICAgICAgICAnYWRqdXN0RHVyYXRpb25Ub0RTVCcsXG4gICAgICAgICdhc3NpZ25tZW50TW9kZWxDbGFzcycsXG4gICAgICAgICdhc3NpZ25tZW50cycsXG4gICAgICAgICdhc3NpZ25tZW50c0RhdGEnLFxuICAgICAgICAnYXNzaWdubWVudFN0b3JlJyxcbiAgICAgICAgJ2Fzc2lnbm1lbnRTdG9yZUNsYXNzJyxcbiAgICAgICAgJ2F1dG9Mb2FkJyxcbiAgICAgICAgJ2F1dG9TeW5jJyxcbiAgICAgICAgJ2F1dG9TeW5jVGltZW91dCcsXG4gICAgICAgICdidWJibGVFdmVudHMnLFxuICAgICAgICAnY2FsbE9uRnVuY3Rpb25zJyxcbiAgICAgICAgJ2NhdGNoRXZlbnRIYW5kbGVyRXhjZXB0aW9ucycsXG4gICAgICAgICdjaGlsZHJlbicsXG4gICAgICAgICdjcnVkU3RvcmVzJyxcbiAgICAgICAgJ2RlcGVuZGVuY2llcycsXG4gICAgICAgICdkZXBlbmRlbmNpZXNEYXRhJyxcbiAgICAgICAgJ2RlcGVuZGVuY3lNb2RlbENsYXNzJyxcbiAgICAgICAgJ2RlcGVuZGVuY3lTdG9yZScsXG4gICAgICAgICdkZXBlbmRlbmN5U3RvcmVDbGFzcycsXG4gICAgICAgICdlbmNvZGVyJyxcbiAgICAgICAgJ2V2ZW50cycsXG4gICAgICAgICdldmVudHNEYXRhJyxcbiAgICAgICAgJ2V2ZW50U3RvcmUnLFxuICAgICAgICAnZXhwYW5kZWQnLFxuICAgICAgICAnZm9yY2VTeW5jJyxcbiAgICAgICAgJ2lkJyxcbiAgICAgICAgJ2lnbm9yZVJlbW90ZUNoYW5nZXNJblNUTScsXG4gICAgICAgICdpbmNsdWRlQ2hpbGRyZW5JblJlbW92ZVJlcXVlc3QnLFxuICAgICAgICAnaW5jbHVkZUxlZ2FjeURhdGFQcm9wZXJ0aWVzJyxcbiAgICAgICAgJ2lzRnVsbHlMb2FkZWQnLFxuICAgICAgICAnanNvbicsXG4gICAgICAgICdsaXN0ZW5lcnMnLFxuICAgICAgICAnbG9hZFVybCcsXG4gICAgICAgICdvcmRlcmVkUGFyZW50SW5kZXgnLFxuICAgICAgICAncGFyZW50SWQnLFxuICAgICAgICAncGFyZW50SW5kZXgnLFxuICAgICAgICAncGhhbnRvbUlkRmllbGQnLFxuICAgICAgICAncGhhbnRvbVBhcmVudElkRmllbGQnLFxuICAgICAgICAncmVhZE9ubHknLFxuICAgICAgICAncmVtb3RlQ2hpbGRDb3VudCcsXG4gICAgICAgICdyZXNldElkc0JlZm9yZVN5bmMnLFxuICAgICAgICAncmVzb3VyY2VNb2RlbENsYXNzJyxcbiAgICAgICAgJ3Jlc291cmNlcycsXG4gICAgICAgICdyZXNvdXJjZXNEYXRhJyxcbiAgICAgICAgJ3Jlc291cmNlU3RvcmUnLFxuICAgICAgICAncmVzb3VyY2VTdG9yZUNsYXNzJyxcbiAgICAgICAgJ3Nob3VsZFN5bmNEYXRhT25Mb2FkJyxcbiAgICAgICAgJ3NpbGVuY2VJbml0aWFsQ29tbWl0JyxcbiAgICAgICAgJ3NraXBTdWNjZXNzUHJvcGVydHknLFxuICAgICAgICAnc3RtJyxcbiAgICAgICAgJ3N0b3JlSWRQcm9wZXJ0eScsXG4gICAgICAgICdzdXBwb3J0U2hvcnRTeW5jUmVzcG9uc2UnLFxuICAgICAgICAnc3luY0FwcGx5U2VxdWVuY2UnLFxuICAgICAgICAnc3luY1VybCcsXG4gICAgICAgICd0YXNrTW9kZWxDbGFzcycsXG4gICAgICAgICd0YXNrcycsXG4gICAgICAgICd0YXNrc0RhdGEnLFxuICAgICAgICAndGFza1N0b3JlJyxcbiAgICAgICAgJ3Rhc2tTdG9yZUNsYXNzJyxcbiAgICAgICAgJ3RpbWVab25lJyxcbiAgICAgICAgJ3RvSlNPTlJlc3VsdEZvcm1hdCcsXG4gICAgICAgICd0cmFja1Jlc3BvbnNlVHlwZScsXG4gICAgICAgICd0cmFuc3BvcnQnLFxuICAgICAgICAndXNlUmF3RGF0YScsXG4gICAgICAgICd2YWxpZGF0ZVJlc3BvbnNlJyxcbiAgICAgICAgJ3dyaXRlQWxsRmllbGRzJ1xuICAgIF0pO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnJ5bnR1bUNvbmZpZ3NPbmx5OiBzdHJpbmdbXSA9IFtcbiAgICAgICAgJ2FkanVzdER1cmF0aW9uVG9EU1QnLFxuICAgICAgICAnYXNzaWdubWVudE1vZGVsQ2xhc3MnLFxuICAgICAgICAnYXNzaWdubWVudHNEYXRhJyxcbiAgICAgICAgJ2Fzc2lnbm1lbnRTdG9yZUNsYXNzJyxcbiAgICAgICAgJ2F1dG9Mb2FkJyxcbiAgICAgICAgJ2F1dG9TeW5jJyxcbiAgICAgICAgJ2F1dG9TeW5jVGltZW91dCcsXG4gICAgICAgICdidWJibGVFdmVudHMnLFxuICAgICAgICAnY2hpbGRyZW4nLFxuICAgICAgICAnZGVwZW5kZW5jaWVzRGF0YScsXG4gICAgICAgICdkZXBlbmRlbmN5TW9kZWxDbGFzcycsXG4gICAgICAgICdkZXBlbmRlbmN5U3RvcmVDbGFzcycsXG4gICAgICAgICdlbmNvZGVyJyxcbiAgICAgICAgJ2V2ZW50c0RhdGEnLFxuICAgICAgICAnZXhwYW5kZWQnLFxuICAgICAgICAnaWdub3JlUmVtb3RlQ2hhbmdlc0luU1RNJyxcbiAgICAgICAgJ2luY2x1ZGVDaGlsZHJlbkluUmVtb3ZlUmVxdWVzdCcsXG4gICAgICAgICdsaXN0ZW5lcnMnLFxuICAgICAgICAnb3JkZXJlZFBhcmVudEluZGV4JyxcbiAgICAgICAgJ3BhcmVudEluZGV4JyxcbiAgICAgICAgJ3BoYW50b21JZEZpZWxkJyxcbiAgICAgICAgJ3BoYW50b21QYXJlbnRJZEZpZWxkJyxcbiAgICAgICAgJ3Jlc2V0SWRzQmVmb3JlU3luYycsXG4gICAgICAgICdyZXNvdXJjZU1vZGVsQ2xhc3MnLFxuICAgICAgICAncmVzb3VyY2VzRGF0YScsXG4gICAgICAgICdyZXNvdXJjZVN0b3JlQ2xhc3MnLFxuICAgICAgICAnc2lsZW5jZUluaXRpYWxDb21taXQnLFxuICAgICAgICAnc2tpcFN1Y2Nlc3NQcm9wZXJ0eScsXG4gICAgICAgICdzdG9yZUlkUHJvcGVydHknLFxuICAgICAgICAnc3VwcG9ydFNob3J0U3luY1Jlc3BvbnNlJyxcbiAgICAgICAgJ3Rhc2tNb2RlbENsYXNzJyxcbiAgICAgICAgJ3Rhc2tzRGF0YScsXG4gICAgICAgICd0YXNrU3RvcmVDbGFzcycsXG4gICAgICAgICd0b0pTT05SZXN1bHRGb3JtYXQnLFxuICAgICAgICAndHJhY2tSZXNwb25zZVR5cGUnLFxuICAgICAgICAndHJhbnNwb3J0JyxcbiAgICAgICAgJ3VzZVJhd0RhdGEnLFxuICAgICAgICAndmFsaWRhdGVSZXNwb25zZScsXG4gICAgICAgICd3cml0ZUFsbEZpZWxkcydcbiAgICBdO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnJ5bnR1bVByb3BzOiBzdHJpbmdbXSA9IEJyeW50dW1UYXNrQm9hcmRQcm9qZWN0TW9kZWxDb21wb25lbnQuYnJ5bnR1bUZlYXR1cmVOYW1lcy5jb25jYXQoW1xuICAgICAgICAnYWxsQ2hpbGRyZW4nLFxuICAgICAgICAnYWxsVW5maWx0ZXJlZENoaWxkcmVuJyxcbiAgICAgICAgJ2Fzc2lnbm1lbnRzJyxcbiAgICAgICAgJ2Fzc2lnbm1lbnRTdG9yZScsXG4gICAgICAgICdjYWxsT25GdW5jdGlvbnMnLFxuICAgICAgICAnY2F0Y2hFdmVudEhhbmRsZXJFeGNlcHRpb25zJyxcbiAgICAgICAgJ2NydWRTdG9yZXMnLFxuICAgICAgICAnZGVwZW5kZW5jaWVzJyxcbiAgICAgICAgJ2RlcGVuZGVuY3lTdG9yZScsXG4gICAgICAgICdkZXNjZW5kYW50Q291bnQnLFxuICAgICAgICAnZXZlbnRzJyxcbiAgICAgICAgJ2V2ZW50U3RvcmUnLFxuICAgICAgICAnZm9yY2VTeW5jJyxcbiAgICAgICAgJ2hhc0dlbmVyYXRlZElkJyxcbiAgICAgICAgJ2lkJyxcbiAgICAgICAgJ2luY2x1ZGVMZWdhY3lEYXRhUHJvcGVydGllcycsXG4gICAgICAgICdpbmxpbmVEYXRhJyxcbiAgICAgICAgJ2ludGVybmFsSWQnLFxuICAgICAgICAnaXNDb21taXR0aW5nJyxcbiAgICAgICAgJ2lzQ3JlYXRpbmcnLFxuICAgICAgICAnaXNGdWxseUxvYWRlZCcsXG4gICAgICAgICdpc1ZhbGlkJyxcbiAgICAgICAgJ2pzb24nLFxuICAgICAgICAnbG9hZFVybCcsXG4gICAgICAgICdwYXJlbnRJZCcsXG4gICAgICAgICdwcmV2aW91c1NpYmxpbmdzVG90YWxDb3VudCcsXG4gICAgICAgICdyZWFkT25seScsXG4gICAgICAgICdyZW1vdGVDaGlsZENvdW50JyxcbiAgICAgICAgJ3Jlc291cmNlcycsXG4gICAgICAgICdyZXNvdXJjZVN0b3JlJyxcbiAgICAgICAgJ3Jlc291cmNlVGltZVJhbmdlcycsXG4gICAgICAgICdzaG91bGRTeW5jRGF0YU9uTG9hZCcsXG4gICAgICAgICdzdG0nLFxuICAgICAgICAnc3luY0FwcGx5U2VxdWVuY2UnLFxuICAgICAgICAnc3luY1VybCcsXG4gICAgICAgICd0YXNrcycsXG4gICAgICAgICd0YXNrU3RvcmUnLFxuICAgICAgICAndGltZVJhbmdlcycsXG4gICAgICAgICd0aW1lWm9uZScsXG4gICAgICAgICd2aXNpYmxlRGVzY2VuZGFudENvdW50J1xuICAgIF0pO1xuXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmO1xuICAgIHB1YmxpYyBpbnN0YW5jZSE6IFByb2plY3RNb2RlbDtcblxuICAgIHByaXZhdGUgYnJ5bnR1bUNvbmZpZyA9IHtcbiAgICAgICAgYWRvcHQgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgYXBwZW5kVG8gICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgaHJlZiAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgYW5ndWxhckNvbXBvbmVudCA6IHRoaXMsXG4gICAgICAgIGZlYXR1cmVzICAgICAgICAgOiB7fSxcbiAgICAgICAgbGlzdGVuZXJzICAgICAgICA6IHt9XG4gICAgfTtcblxuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQ6IEVsZW1lbnRSZWYpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50UmVmID0gZWxlbWVudDtcbiAgICB9XG5cbiAgICAvLyBDb25maWdzIG9ubHlcbiAgICBASW5wdXQoKSBhZGp1c3REdXJhdGlvblRvRFNUICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgYXNzaWdubWVudE1vZGVsQ2xhc3MgICAgICAgICAgICEgOiB0eXBlb2YgQXNzaWdubWVudE1vZGVsO1xuICAgIEBJbnB1dCgpIGFzc2lnbm1lbnRzRGF0YSAgICAgICAgICAgICAgICAhIDogQXNzaWdubWVudE1vZGVsW118QXNzaWdubWVudE1vZGVsQ29uZmlnW107XG4gICAgQElucHV0KCkgYXNzaWdubWVudFN0b3JlQ2xhc3MgICAgICAgICAgICEgOiB0eXBlb2YgQXNzaWdubWVudFN0b3JlfG9iamVjdDtcbiAgICBASW5wdXQoKSBhdXRvTG9hZCAgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgYXV0b1N5bmMgICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGF1dG9TeW5jVGltZW91dCAgICAgICAgICAgICAgICAhIDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIGJ1YmJsZUV2ZW50cyAgICAgICAgICAgICAgICAgICAhIDogb2JqZWN0O1xuICAgIEBJbnB1dCgpIGNoaWxkcmVuICAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbnxvYmplY3RbXXxNb2RlbFtdfE1vZGVsQ29uZmlnW107XG4gICAgQElucHV0KCkgZGVwZW5kZW5jaWVzRGF0YSAgICAgICAgICAgICAgICEgOiBEZXBlbmRlbmN5TW9kZWxbXXxEZXBlbmRlbmN5TW9kZWxDb25maWdbXTtcbiAgICBASW5wdXQoKSBkZXBlbmRlbmN5TW9kZWxDbGFzcyAgICAgICAgICAgISA6IHR5cGVvZiBEZXBlbmRlbmN5TW9kZWw7XG4gICAgQElucHV0KCkgZGVwZW5kZW5jeVN0b3JlQ2xhc3MgICAgICAgICAgICEgOiB0eXBlb2YgRGVwZW5kZW5jeVN0b3JlfG9iamVjdDtcbiAgICBASW5wdXQoKSBlbmNvZGVyICAgICAgICAgICAgICAgICAgICAgICAgISA6IHtcbiAgICAgICAgcmVxdWVzdERhdGE/OiBvYmplY3RcbiAgICB9O1xuICAgIEBJbnB1dCgpIGV2ZW50c0RhdGEgICAgICAgICAgICAgICAgICAgICAhIDogRXZlbnRNb2RlbFtdfEV2ZW50TW9kZWxDb25maWdbXTtcbiAgICBASW5wdXQoKSBleHBhbmRlZCAgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaWdub3JlUmVtb3RlQ2hhbmdlc0luU1RNICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGluY2x1ZGVDaGlsZHJlbkluUmVtb3ZlUmVxdWVzdCAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBsaXN0ZW5lcnMgICAgICAgICAgICAgICAgICAgICAgISA6IFByb2plY3RNb2RlbExpc3RlbmVycztcbiAgICBASW5wdXQoKSBvcmRlcmVkUGFyZW50SW5kZXggICAgICAgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSBwYXJlbnRJbmRleCAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSBwaGFudG9tSWRGaWVsZCAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBwaGFudG9tUGFyZW50SWRGaWVsZCAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSByZXNldElkc0JlZm9yZVN5bmMgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcmVzb3VyY2VNb2RlbENsYXNzICAgICAgICAgICAgICEgOiB0eXBlb2YgUmVzb3VyY2VNb2RlbDtcbiAgICBASW5wdXQoKSByZXNvdXJjZXNEYXRhICAgICAgICAgICAgICAgICAgISA6IFJlc291cmNlTW9kZWxbXXxSZXNvdXJjZU1vZGVsQ29uZmlnW107XG4gICAgQElucHV0KCkgcmVzb3VyY2VTdG9yZUNsYXNzICAgICAgICAgICAgICEgOiB0eXBlb2YgUmVzb3VyY2VTdG9yZXxvYmplY3Q7XG4gICAgQElucHV0KCkgc2lsZW5jZUluaXRpYWxDb21taXQgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHNraXBTdWNjZXNzUHJvcGVydHkgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBzdG9yZUlkUHJvcGVydHkgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBzdXBwb3J0U2hvcnRTeW5jUmVzcG9uc2UgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgdGFza01vZGVsQ2xhc3MgICAgICAgICAgICAgICAgICEgOiB0eXBlb2YgVGFza01vZGVsO1xuICAgIEBJbnB1dCgpIHRhc2tzRGF0YSAgICAgICAgICAgICAgICAgICAgICAhIDogVGFza01vZGVsW118VGFza01vZGVsQ29uZmlnW107XG4gICAgQElucHV0KCkgdGFza1N0b3JlQ2xhc3MgICAgICAgICAgICAgICAgICEgOiB0eXBlb2YgVGFza1N0b3JlO1xuICAgIEBJbnB1dCgpIHRvSlNPTlJlc3VsdEZvcm1hdCAgICAgICAgICAgICAhIDogJ2lubGluZURhdGEnfCdtb2RlbCc7XG4gICAgQElucHV0KCkgdHJhY2tSZXNwb25zZVR5cGUgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHRyYW5zcG9ydCAgICAgICAgICAgICAgICAgICAgICAhIDoge1xuICAgICAgICBsb2FkPzogb2JqZWN0XG4gICAgICAgIHN5bmM/OiBvYmplY3RcbiAgICB9O1xuICAgIEBJbnB1dCgpIHVzZVJhd0RhdGEgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSB2YWxpZGF0ZVJlc3BvbnNlICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgd3JpdGVBbGxGaWVsZHMgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuXG4gICAgLy8gQ29uZmlncyBhbmQgcHJvcGVydGllc1xuICAgIEBJbnB1dCgpIGFzc2lnbm1lbnRzICAgICAgICAgICAgICAgICAhIDogQXNzaWdubWVudE1vZGVsW118QXNzaWdubWVudE1vZGVsQ29uZmlnW107XG4gICAgQElucHV0KCkgYXNzaWdubWVudFN0b3JlICAgICAgICAgICAgICEgOiBBc3NpZ25tZW50U3RvcmV8QXNzaWdubWVudFN0b3JlQ29uZmlnO1xuICAgIEBJbnB1dCgpIGNhbGxPbkZ1bmN0aW9ucyAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBjYXRjaEV2ZW50SGFuZGxlckV4Y2VwdGlvbnMgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgY3J1ZFN0b3JlcyAgICAgICAgICAgICAgICAgICEgOiBDcnVkTWFuYWdlclN0b3JlRGVzY3JpcHRvcltdfFN0b3JlW118c3RyaW5nW118U3RvcmVDb25maWdbXTtcbiAgICBASW5wdXQoKSBkZXBlbmRlbmNpZXMgICAgICAgICAgICAgICAgISA6IERlcGVuZGVuY3lNb2RlbFtdfERlcGVuZGVuY3lNb2RlbENvbmZpZ1tdO1xuICAgIEBJbnB1dCgpIGRlcGVuZGVuY3lTdG9yZSAgICAgICAgICAgICAhIDogRGVwZW5kZW5jeVN0b3JlfERlcGVuZGVuY3lTdG9yZUNvbmZpZztcbiAgICBASW5wdXQoKSBldmVudHMgICAgICAgICAgICAgICAgICAgICAgISA6IEV2ZW50TW9kZWxbXXxFdmVudE1vZGVsQ29uZmlnW107XG4gICAgQElucHV0KCkgZXZlbnRTdG9yZSAgICAgICAgICAgICAgICAgICEgOiBFdmVudFN0b3JlfEV2ZW50U3RvcmVDb25maWc7XG4gICAgQElucHV0KCkgZm9yY2VTeW5jICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGlkICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfG51bWJlcjtcbiAgICBASW5wdXQoKSBpbmNsdWRlTGVnYWN5RGF0YVByb3BlcnRpZXMgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaXNGdWxseUxvYWRlZCAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGpzb24gICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGxvYWRVcmwgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHBhcmVudElkICAgICAgICAgICAgICAgICAgICAhIDogbnVtYmVyfHN0cmluZ3xudWxsO1xuICAgIEBJbnB1dCgpIHJlYWRPbmx5ICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSByZW1vdGVDaGlsZENvdW50ICAgICAgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSByZXNvdXJjZXMgICAgICAgICAgICAgICAgICAgISA6IFJlc291cmNlTW9kZWxbXXxSZXNvdXJjZU1vZGVsQ29uZmlnW107XG4gICAgQElucHV0KCkgcmVzb3VyY2VTdG9yZSAgICAgICAgICAgICAgICEgOiBSZXNvdXJjZVN0b3JlfFJlc291cmNlU3RvcmVDb25maWc7XG4gICAgQElucHV0KCkgc2hvdWxkU3luY0RhdGFPbkxvYWQgICAgICAgICEgOiAob3B0aW9uczogeyBzdG9yZTogU3RvcmUsIHJlY29yZHM6IE1vZGVsLCBkYXRhOiBvYmplY3RbXSB9KSA9PiBTZXQ8YW55Pnxib29sZWFuO1xuICAgIEBJbnB1dCgpIHN0bSAgICAgICAgICAgICAgICAgICAgICAgICAhIDogU3RhdGVUcmFja2luZ01hbmFnZXJ8U3RhdGVUcmFja2luZ01hbmFnZXJDb25maWc7XG4gICAgQElucHV0KCkgc3luY0FwcGx5U2VxdWVuY2UgICAgICAgICAgICEgOiBzdHJpbmdbXXxDcnVkTWFuYWdlclN0b3JlRGVzY3JpcHRvcltdO1xuICAgIEBJbnB1dCgpIHN5bmNVcmwgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHRhc2tzICAgICAgICAgICAgICAgICAgICAgICAhIDogVGFza01vZGVsW118VGFza01vZGVsQ29uZmlnW107XG4gICAgQElucHV0KCkgdGFza1N0b3JlICAgICAgICAgICAgICAgICAgICEgOiBUYXNrU3RvcmV8VGFza1N0b3JlQ29uZmlnO1xuICAgIEBJbnB1dCgpIHRpbWVab25lICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfG51bWJlcjtcblxuICAgIC8vIFByb3BlcnRpZXMgb25seVxuICAgIEBJbnB1dCgpIGFsbENoaWxkcmVuICAgICAgICAgICAgICAgICEgOiBNb2RlbFtdO1xuICAgIEBJbnB1dCgpIGFsbFVuZmlsdGVyZWRDaGlsZHJlbiAgICAgICEgOiBNb2RlbFtdO1xuICAgIEBJbnB1dCgpIGRlc2NlbmRhbnRDb3VudCAgICAgICAgICAgICEgOiBudW1iZXI7XG4gICAgQElucHV0KCkgaGFzR2VuZXJhdGVkSWQgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaW5saW5lRGF0YSAgICAgICAgICAgICAgICAgISA6IG9iamVjdDtcbiAgICBASW5wdXQoKSBpbnRlcm5hbElkICAgICAgICAgICAgICAgICAhIDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIGlzQ29tbWl0dGluZyAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGlzQ3JlYXRpbmcgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGlzVmFsaWQgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHByZXZpb3VzU2libGluZ3NUb3RhbENvdW50ICEgOiBudW1iZXI7XG4gICAgQElucHV0KCkgcmVzb3VyY2VUaW1lUmFuZ2VzICAgICAgICAgISA6IFJlc291cmNlVGltZVJhbmdlTW9kZWxbXXxSZXNvdXJjZVRpbWVSYW5nZU1vZGVsQ29uZmlnW107XG4gICAgQElucHV0KCkgdGltZVJhbmdlcyAgICAgICAgICAgICAgICAgISA6IFRpbWVSYW5nZU1vZGVsW118VGltZVJhbmdlTW9kZWxDb25maWdbXTtcbiAgICBASW5wdXQoKSB2aXNpYmxlRGVzY2VuZGFudENvdW50ICAgICAhIDogbnVtYmVyO1xuXG4gICAgLy8gRXZlbnRzIGVtaXR0ZXJzXG4gICAgLyoqXG4gICAgICogRmlyZXMgYmVmb3JlIGFuIG9iamVjdCBpcyBkZXN0cm95ZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS5CYXNlfSBldmVudC5zb3VyY2UgVGhlIE9iamVjdCB0aGF0IGlzIGJlaW5nIGRlc3Ryb3llZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVEZXN0cm95OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBCYXNlIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBiZWZvcmUgW2xvYWQgcmVxdWVzdF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcyNTY2hlZHVsZXIvY3J1ZC9BYnN0cmFjdENydWRNYW5hZ2VyTWl4aW4jZnVuY3Rpb24tbG9hZCkgaXMgc2VudC4gUmV0dXJuIGBmYWxzZWAgdG8gY2FuY2VsIGxvYWQgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIuY3J1ZC5BYnN0cmFjdENydWRNYW5hZ2VyfSBldmVudC5zb3VyY2UgVGhlIENSVUQgbWFuYWdlci5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQucGFjayBUaGUgZGF0YSBwYWNrYWdlIHdoaWNoIGNvbnRhaW5zIGRhdGEgZm9yIGFsbCBzdG9yZXMgbWFuYWdlZCBieSB0aGUgY3J1ZCBtYW5hZ2VyLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZUxvYWQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEFic3RyYWN0Q3J1ZE1hbmFnZXIsIHBhY2s6IG9iamVjdCB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIGJlZm9yZSBsb2FkZWQgZGF0YSBnZXQgYXBwbGllZCB0byB0aGUgc3RvcmVzLiBSZXR1cm4gYGZhbHNlYCB0byBwcmV2ZW50IGRhdGEgYXBwbHlpbmcuXG4gICAgICogVGhpcyBldmVudCBjYW4gYmUgdXNlZCBmb3Igc2VydmVyIGRhdGEgcHJlcHJvY2Vzc2luZy4gVG8gYWNoaWV2ZSBpdCB1c2VyIGNhbiBtb2RpZnkgdGhlIGByZXNwb25zZWAgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5jcnVkLkFic3RyYWN0Q3J1ZE1hbmFnZXJ9IGV2ZW50LnNvdXJjZSBUaGUgQ1JVRCBtYW5hZ2VyLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5yZXNwb25zZSBUaGUgZGVjb2RlZCBzZXJ2ZXIgcmVzcG9uc2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5vcHRpb25zIE9wdGlvbnMgcHJvdmlkZWQgdG8gdGhlIFtsb2FkXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9jcnVkL0Fic3RyYWN0Q3J1ZE1hbmFnZXJNaXhpbiNmdW5jdGlvbi1sb2FkKSBtZXRob2QuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlTG9hZEFwcGx5OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBBYnN0cmFjdENydWRNYW5hZ2VyLCByZXNwb25zZTogb2JqZWN0LCBvcHRpb25zOiBvYmplY3QgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBiZWZvcmUgc2VydmVyIHJlc3BvbnNlIGdldHMgYXBwbGllZCB0byB0aGUgc3RvcmVzLiBSZXR1cm4gYGZhbHNlYCB0byBwcmV2ZW50IGRhdGEgYXBwbHlpbmcuXG4gICAgICogVGhpcyBldmVudCBjYW4gYmUgdXNlZCBmb3Igc2VydmVyIGRhdGEgcHJlcHJvY2Vzc2luZy4gVG8gYWNoaWV2ZSBpdCB1c2VyIGNhbiBtb2RpZnkgdGhlIGByZXNwb25zZWAgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5jcnVkLkFic3RyYWN0Q3J1ZE1hbmFnZXJ9IGV2ZW50LnNvdXJjZSBUaGUgQ1JVRCBtYW5hZ2VyLlxuICAgICAqIEBwYXJhbSB7J3N5bmMnLCdsb2FkJ30gZXZlbnQucmVxdWVzdFR5cGUgVGhlIHJlcXVlc3QgdHlwZSAoYHN5bmNgIG9yIGBsb2FkYCkuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LnJlc3BvbnNlIFRoZSBkZWNvZGVkIHNlcnZlciByZXNwb25zZSBvYmplY3QuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlUmVzcG9uc2VBcHBseTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQWJzdHJhY3RDcnVkTWFuYWdlciwgcmVxdWVzdFR5cGU6ICdzeW5jJ3wnbG9hZCcsIHJlc3BvbnNlOiBvYmplY3QgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBiZWZvcmUgYSByZXF1ZXN0IGlzIHNlbnQgdG8gdGhlIHNlcnZlci5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL1Byb2plY3RNb2RlbCNldmVudC1iZWZvcmVTZW5kKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5jcnVkLkFic3RyYWN0Q3J1ZE1hbmFnZXJ9IGV2ZW50LmNydWRNYW5hZ2VyIFRoZSBDUlVEIG1hbmFnZXIuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LnBhcmFtcyBIVFRQIHJlcXVlc3QgcGFyYW1zIHRvIGJlIHBhc3NlZCBpbiB0aGUgcmVxdWVzdCBVUkwuXG4gICAgICogQHBhcmFtIHsnc3luYycsJ2xvYWQnfSBldmVudC5yZXF1ZXN0VHlwZSBDcnVkTWFuYWdlciByZXF1ZXN0IHR5cGUgKGBsb2FkYC9gc3luY2ApXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LnJlcXVlc3RDb25maWcgQ29uZmlndXJhdGlvbiBvYmplY3QgZm9yIEFqYXggcmVxdWVzdCBjYWxsXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlU2VuZDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGNydWRNYW5hZ2VyOiBBYnN0cmFjdENydWRNYW5hZ2VyLCBwYXJhbXM6IG9iamVjdCwgcmVxdWVzdFR5cGU6ICdzeW5jJ3wnbG9hZCcsIHJlcXVlc3RDb25maWc6IG9iamVjdCB9KSA9PiBQcm9taXNlPHZvaWQ+KXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgYmVmb3JlIFtzeW5jIHJlcXVlc3RdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL2NydWQvQWJzdHJhY3RDcnVkTWFuYWdlck1peGluI2Z1bmN0aW9uLXN5bmMpIGlzIHNlbnQuIFJldHVybiBgZmFsc2VgIHRvIGNhbmNlbCBzeW5jIHJlcXVlc3QuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9tb2RlbC9Qcm9qZWN0TW9kZWwjZXZlbnQtYmVmb3JlU3luYylcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIuY3J1ZC5BYnN0cmFjdENydWRNYW5hZ2VyfSBldmVudC5zb3VyY2UgVGhlIENSVUQgbWFuYWdlci5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQucGFjayBUaGUgZGF0YSBwYWNrYWdlIHdoaWNoIGNvbnRhaW5zIGRhdGEgZm9yIGFsbCBzdG9yZXMgbWFuYWdlZCBieSB0aGUgY3J1ZCBtYW5hZ2VyLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVN5bmM6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEFic3RyYWN0Q3J1ZE1hbmFnZXIsIHBhY2s6IG9iamVjdCB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIGJlZm9yZSBzeW5jIHJlc3BvbnNlIGRhdGEgZ2V0IGFwcGxpZWQgdG8gdGhlIHN0b3Jlcy4gUmV0dXJuIGBmYWxzZWAgdG8gcHJldmVudCBkYXRhIGFwcGx5aW5nLlxuICAgICAqIFRoaXMgZXZlbnQgY2FuIGJlIHVzZWQgZm9yIHNlcnZlciBkYXRhIHByZXByb2Nlc3NpbmcuIFRvIGFjaGlldmUgaXQgdXNlciBjYW4gbW9kaWZ5IHRoZSBgcmVzcG9uc2VgIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIuY3J1ZC5BYnN0cmFjdENydWRNYW5hZ2VyfSBldmVudC5zb3VyY2UgVGhlIENSVUQgbWFuYWdlci5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQucmVzcG9uc2UgVGhlIGRlY29kZWQgc2VydmVyIHJlc3BvbnNlIG9iamVjdC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVTeW5jQXBwbHk6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEFic3RyYWN0Q3J1ZE1hbmFnZXIsIHJlc3BvbnNlOiBvYmplY3QgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGFueSBvdGhlciBldmVudCBpcyBmaXJlZCBmcm9tIHRoZSBvYmplY3QuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvdGFza2JvYXJkL2RvY3MvYXBpL1Rhc2tCb2FyZC9tb2RlbC9Qcm9qZWN0TW9kZWwjZXZlbnQtY2F0Y2hBbGwpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7e1trZXk6IHN0cmluZ106IGFueSwgdHlwZTogc3RyaW5nfX0gZXZlbnQuZXZlbnQgVGhlIE9iamVjdCB0aGF0IGNvbnRhaW5zIGV2ZW50IGRldGFpbHNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQuZXZlbnQudHlwZSBUaGUgdHlwZSBvZiB0aGUgZXZlbnQgd2hpY2ggaXMgY2F1Z2h0IGJ5IHRoZSBsaXN0ZW5lclxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNhdGNoQWxsOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHtba2V5OiBzdHJpbmddOiBhbnksIHR5cGU6IHN0cmluZ30pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGRhdGEgaW4gYW55IG9mIHRoZSBwcm9qZWN0cyBzdG9yZXMgY2hhbmdlcy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvVGFza0JvYXJkL21vZGVsL1Byb2plY3RNb2RlbCNldmVudC1jaGFuZ2UpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlNjaGVkdWxlclByb2plY3RNb2RlbCxhbnl9IGV2ZW50LnNvdXJjZSBUaGlzIHByb2plY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5TdG9yZX0gZXZlbnQuc3RvcmUgQWZmZWN0ZWQgc3RvcmVcbiAgICAgKiBAcGFyYW0geydyZW1vdmUnLCdyZW1vdmVBbGwnLCdhZGQnLCdjbGVhcmNoYW5nZXMnLCdmaWx0ZXInLCd1cGRhdGUnLCdkYXRhc2V0JywncmVwbGFjZSd9IGV2ZW50LmFjdGlvbiBOYW1lIG9mIGFjdGlvbiB3aGljaCB0cmlnZ2VyZWQgdGhlIGNoYW5nZS4gTWF5IGJlIG9uZSBvZjogICogYCdyZW1vdmUnYCAqIGAncmVtb3ZlQWxsJ2AgKiBgJ2FkZCdgICogYCdjbGVhcmNoYW5nZXMnYCAqIGAnZmlsdGVyJ2AgKiBgJ3VwZGF0ZSdgICogYCdkYXRhc2V0J2AgKiBgJ3JlcGxhY2UnYFxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsfSBldmVudC5yZWNvcmQgQ2hhbmdlZCByZWNvcmQsIGZvciBhY3Rpb25zIHRoYXQgYWZmZWN0cyBleGFjdGx5IG9uZSByZWNvcmQgKGAndXBkYXRlJ2ApXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWxbXX0gZXZlbnQucmVjb3JkcyBDaGFuZ2VkIHJlY29yZHMsIHBhc3NlZCBmb3IgYWxsIGFjdGlvbnMgZXhjZXB0IGAncmVtb3ZlQWxsJ2BcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQuY2hhbmdlcyBQYXNzZWQgZm9yIHRoZSBgJ3VwZGF0ZSdgIGFjdGlvbiwgaW5mbyBvbiB3aGljaCByZWNvcmQgZmllbGRzIGNoYW5nZWRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25DaGFuZ2U6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFNjaGVkdWxlclByb2plY3RNb2RlbHxhbnksIHN0b3JlOiBTdG9yZSwgYWN0aW9uOiAncmVtb3ZlJ3wncmVtb3ZlQWxsJ3wnYWRkJ3wnY2xlYXJjaGFuZ2VzJ3wnZmlsdGVyJ3wndXBkYXRlJ3wnZGF0YXNldCd8J3JlcGxhY2UnLCByZWNvcmQ6IE1vZGVsLCByZWNvcmRzOiBNb2RlbFtdLCBjaGFuZ2VzOiBvYmplY3QgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gdGhlIGVuZ2luZSBoYXMgZmluaXNoZWQgaXRzIGNhbGN1bGF0aW9ucyBhbmQgdGhlIHJlc3VsdHMgaGFzIGJlZW4gd3JpdHRlbiBiYWNrIHRvIHRoZSByZWNvcmRzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvbW9kZWwvUHJvamVjdE1vZGVsI2V2ZW50LWRhdGFSZWFkeSlcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuU2NoZWR1bGVyUHJvamVjdE1vZGVsLGFueX0gZXZlbnQuc291cmNlIFRoZSBwcm9qZWN0XG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5pc0luaXRpYWxDb21taXQgRmxhZyB0aGF0IHNob3dzIGlmIHRoaXMgY29tbWl0IGlzIGluaXRpYWxcbiAgICAgKiBAcGFyYW0ge1NldDxhbnk+fSBldmVudC5yZWNvcmRzIFNldCBvZiBhbGwgW01vZGVsXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9Db3JlL2RhdGEvTW9kZWwpcyB0aGF0IHdlcmUgbW9kaWZpZWQgaW4gdGhlIGNvbXBsZXRlZCB0cmFuc2FjdGlvbi4gVXNlIHRoZSBbbW9kaWZpY2F0aW9uc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy90YXNrYm9hcmQvZG9jcy9hcGkvQ29yZS9kYXRhL01vZGVsI3Byb3BlcnR5LW1vZGlmaWNhdGlvbnMpIHByb3BlcnR5IG9mIGVhY2ggTW9kZWwgdG8gaWRlbnRpZnkgbW9kaWZpZWQgZmllbGRzLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkRhdGFSZWFkeTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogU2NoZWR1bGVyUHJvamVjdE1vZGVsfGFueSwgaXNJbml0aWFsQ29tbWl0OiBib29sZWFuLCByZWNvcmRzOiBTZXQ8YW55PiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiBhbiBvYmplY3QgaXMgZGVzdHJveWVkLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUuQmFzZX0gZXZlbnQuc291cmNlIFRoZSBPYmplY3QgdGhhdCBpcyBiZWluZyBkZXN0cm95ZWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRGVzdHJveTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQmFzZSB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiBkYXRhIGluIGFueSBvZiB0aGUgcmVnaXN0ZXJlZCBkYXRhIHN0b3JlcyBpcyBjaGFuZ2VkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvbW9kZWwvUHJvamVjdE1vZGVsI2V2ZW50LWhhc0NoYW5nZXMpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLmNydWQuQWJzdHJhY3RDcnVkTWFuYWdlcn0gZXZlbnQuc291cmNlIFRoZSBDUlVEIG1hbmFnZXIuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uSGFzQ2hhbmdlczogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQWJzdHJhY3RDcnVkTWFuYWdlciB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gc3VjY2Vzc2Z1bCBbbG9hZCByZXF1ZXN0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9jcnVkL0Fic3RyYWN0Q3J1ZE1hbmFnZXJNaXhpbiNmdW5jdGlvbi1sb2FkKSBjb21wbGV0aW9uIGFmdGVyIGRhdGEgZ2V0cyBsb2FkZWQgdG8gdGhlIHN0b3Jlcy5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIuY3J1ZC5BYnN0cmFjdENydWRNYW5hZ2VyfSBldmVudC5zb3VyY2UgVGhlIENSVUQgbWFuYWdlci5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQucmVzcG9uc2UgVGhlIGRlY29kZWQgc2VydmVyIHJlc3BvbnNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQucmVzcG9uc2VPcHRpb25zIFtERVBSRUNBVEVEXSBzZWUgYHJlcXVlc3RPcHRpb25zYFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5yZXF1ZXN0T3B0aW9ucyBUaGUgcmVxdWVzdCBvcHRpb25zIHBhc3NlZCB0byB0aGUgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0ge1Jlc3BvbnNlfSBldmVudC5yYXdSZXNwb25zZSBUaGUgbmF0aXZlIFJlc3BvbnNlIG9iamVjdFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkxvYWQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEFic3RyYWN0Q3J1ZE1hbmFnZXIsIHJlc3BvbnNlOiBvYmplY3QsIHJlc3BvbnNlT3B0aW9uczogb2JqZWN0LCByZXF1ZXN0T3B0aW9uczogb2JqZWN0LCByYXdSZXNwb25zZTogYW55IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBhZnRlciBbbG9hZCByZXF1ZXN0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9jcnVkL0Fic3RyYWN0Q3J1ZE1hbmFnZXJNaXhpbiNmdW5jdGlvbi1sb2FkKSB3YXMgY2FuY2VsZWQgYnkgc29tZSBbYmVmb3JlTG9hZF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcyNTY2hlZHVsZXIvY3J1ZC9BYnN0cmFjdENydWRNYW5hZ2VyTWl4aW4jZXZlbnQtYmVmb3JlTG9hZClcbiAgICAgKiBsaXN0ZW5lciBvciBkdWUgdG8gaW5jb21wbGV0ZSBwcmlvciBsb2FkIHJlcXVlc3QuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLmNydWQuQWJzdHJhY3RDcnVkTWFuYWdlcn0gZXZlbnQuc291cmNlIFRoZSBDUlVEIG1hbmFnZXIuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LnBhY2sgVGhlIGRhdGEgcGFja2FnZSB3aGljaCBjb250YWlucyBkYXRhIGZvciBhbGwgc3RvcmVzIG1hbmFnZWQgYnkgdGhlIGNydWQgbWFuYWdlci5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Mb2FkQ2FuY2VsZWQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEFic3RyYWN0Q3J1ZE1hbmFnZXIsIHBhY2s6IG9iamVjdCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiBhIFtsb2FkIHJlcXVlc3RdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL2NydWQvQWJzdHJhY3RDcnVkTWFuYWdlck1peGluI2Z1bmN0aW9uLWxvYWQpIGZhaWxzLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5jcnVkLkFic3RyYWN0Q3J1ZE1hbmFnZXJ9IGV2ZW50LnNvdXJjZSBUaGUgQ1JVRCBtYW5hZ2VyIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5yZXNwb25zZSBUaGUgZGVjb2RlZCBzZXJ2ZXIgcmVzcG9uc2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5yZXNwb25zZVRleHQgVGhlIHJhdyBzZXJ2ZXIgcmVzcG9uc2UgdGV4dFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5yZXNwb25zZU9wdGlvbnMgW0RFUFJFQ0FURURdIHNlZSBgcmVxdWVzdE9wdGlvbnNgXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LnJlcXVlc3RPcHRpb25zIFRoZSByZXF1ZXN0IG9wdGlvbnMgcGFzc2VkIHRvIHRoZSByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSB7UmVzcG9uc2V9IGV2ZW50LnJhd1Jlc3BvbnNlIFRoZSBuYXRpdmUgUmVzcG9uc2Ugb2JqZWN0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uTG9hZEZhaWw6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEFic3RyYWN0Q3J1ZE1hbmFnZXIsIHJlc3BvbnNlOiBvYmplY3QsIHJlc3BvbnNlVGV4dDogc3RyaW5nLCByZXNwb25zZU9wdGlvbnM6IG9iamVjdCwgcmVxdWVzdE9wdGlvbnM6IG9iamVjdCwgcmF3UmVzcG9uc2U6IGFueSB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiByZWdpc3RlcmVkIHN0b3JlcyBnZXQgaW50byBzdGF0ZSB3aGVuIHRoZXkgZG9uJ3QgaGF2ZSBhbnlcbiAgICAgKiBub3QgcGVyc2lzdGVkIGNoYW5nZS4gVGhpcyBoYXBwZW5zIGFmdGVyIFtsb2FkXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9jcnVkL0Fic3RyYWN0Q3J1ZE1hbmFnZXJNaXhpbiNmdW5jdGlvbi1sb2FkKSBvciBbc3luY10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9zY2hlZHVsZXIvZG9jcyNTY2hlZHVsZXIvY3J1ZC9BYnN0cmFjdENydWRNYW5hZ2VyTWl4aW4jZnVuY3Rpb24tc3luYykgcmVxdWVzdFxuICAgICAqIGNvbXBsZXRpb24uIE9yIHRoaXMgbWF5IGhhcHBlbiBhZnRlciBhIHJlY29yZCB1cGRhdGUgd2hpY2ggdHVybnMgaXRzIGZpZWxkcyBiYWNrIHRvIHRoZWlyIG9yaWdpbmFsIHN0YXRlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3Rhc2tib2FyZC9kb2NzL2FwaS9UYXNrQm9hcmQvbW9kZWwvUHJvamVjdE1vZGVsI2V2ZW50LW5vQ2hhbmdlcylcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIuY3J1ZC5BYnN0cmFjdENydWRNYW5hZ2VyfSBldmVudC5zb3VyY2UgVGhlIENSVUQgbWFuYWdlci5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Ob0NoYW5nZXM6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEFic3RyYWN0Q3J1ZE1hbmFnZXIgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHN1Y2Nlc3NmdWwgcmVxdWVzdCBjb21wbGV0aW9uIGFmdGVyIGRhdGEgZ2V0cyBhcHBsaWVkIHRvIHRoZSBzdG9yZXMuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLmNydWQuQWJzdHJhY3RDcnVkTWFuYWdlcn0gZXZlbnQuc291cmNlIFRoZSBDUlVEIG1hbmFnZXIuXG4gICAgICogQHBhcmFtIHsnc3luYycsJ2xvYWQnfSBldmVudC5yZXF1ZXN0VHlwZSBUaGUgcmVxdWVzdCB0eXBlIChgc3luY2Agb3IgYGxvYWRgKS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQucmVzcG9uc2UgVGhlIGRlY29kZWQgc2VydmVyIHJlc3BvbnNlIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQucmVzcG9uc2VPcHRpb25zIFtERVBSRUNBVEVEXSBzZWUgYHJlcXVlc3RPcHRpb25zYFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5yZXF1ZXN0T3B0aW9ucyBUaGUgcmVxdWVzdCBvcHRpb25zIHBhc3NlZCB0byB0aGUgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0ge1Jlc3BvbnNlfSBldmVudC5yYXdSZXNwb25zZSBUaGUgbmF0aXZlIFJlc3BvbnNlIG9iamVjdFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJlcXVlc3REb25lOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBBYnN0cmFjdENydWRNYW5hZ2VyLCByZXF1ZXN0VHlwZTogJ3N5bmMnfCdsb2FkJywgcmVzcG9uc2U6IG9iamVjdCwgcmVzcG9uc2VPcHRpb25zOiBvYmplY3QsIHJlcXVlc3RPcHRpb25zOiBvYmplY3QsIHJhd1Jlc3BvbnNlOiBhbnkgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYSByZXF1ZXN0IGZhaWxzLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5jcnVkLkFic3RyYWN0Q3J1ZE1hbmFnZXJ9IGV2ZW50LnNvdXJjZSBUaGUgQ1JVRCBtYW5hZ2VyIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSB7J3N5bmMnLCdsb2FkJ30gZXZlbnQucmVxdWVzdFR5cGUgVGhlIHJlcXVlc3QgdHlwZSAoYHN5bmNgIG9yIGBsb2FkYCkuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LnJlc3BvbnNlIFRoZSBkZWNvZGVkIHNlcnZlciByZXNwb25zZSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LnJlc3BvbnNlVGV4dCBUaGUgcmF3IHNlcnZlciByZXNwb25zZSB0ZXh0XG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LnJlc3BvbnNlT3B0aW9ucyBbREVQUkVDQVRFRF0gc2VlIGByZXF1ZXN0T3B0aW9uc2BcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQucmVxdWVzdE9wdGlvbnMgVGhlIHJlcXVlc3Qgb3B0aW9ucyBwYXNzZWQgdG8gdGhlIHJlcXVlc3QuXG4gICAgICogQHBhcmFtIHtSZXNwb25zZX0gZXZlbnQucmF3UmVzcG9uc2UgVGhlIG5hdGl2ZSBSZXNwb25zZSBvYmplY3RcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25SZXF1ZXN0RmFpbDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQWJzdHJhY3RDcnVkTWFuYWdlciwgcmVxdWVzdFR5cGU6ICdzeW5jJ3wnbG9hZCcsIHJlc3BvbnNlOiBvYmplY3QsIHJlc3BvbnNlVGV4dDogc3RyaW5nLCByZXNwb25zZU9wdGlvbnM6IG9iamVjdCwgcmVxdWVzdE9wdGlvbnM6IG9iamVjdCwgcmF3UmVzcG9uc2U6IGFueSB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gc3VjY2Vzc2Z1bCBbc3luYyByZXF1ZXN0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9jcnVkL0Fic3RyYWN0Q3J1ZE1hbmFnZXJNaXhpbiNmdW5jdGlvbi1zeW5jKSBjb21wbGV0aW9uLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5jcnVkLkFic3RyYWN0Q3J1ZE1hbmFnZXJ9IGV2ZW50LnNvdXJjZSBUaGUgQ1JVRCBtYW5hZ2VyLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5yZXNwb25zZSBUaGUgZGVjb2RlZCBzZXJ2ZXIgcmVzcG9uc2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5yZXNwb25zZU9wdGlvbnMgW0RFUFJFQ0FURURdIHNlZSBgcmVxdWVzdE9wdGlvbnNgXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LnJlcXVlc3RPcHRpb25zIFRoZSByZXF1ZXN0IG9wdGlvbnMgcGFzc2VkIHRvIHRoZSByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSB7UmVzcG9uc2V9IGV2ZW50LnJhd1Jlc3BvbnNlIFRoZSBuYXRpdmUgUmVzcG9uc2Ugb2JqZWN0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU3luYzogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQWJzdHJhY3RDcnVkTWFuYWdlciwgcmVzcG9uc2U6IG9iamVjdCwgcmVzcG9uc2VPcHRpb25zOiBvYmplY3QsIHJlcXVlc3RPcHRpb25zOiBvYmplY3QsIHJhd1Jlc3BvbnNlOiBhbnkgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIGFmdGVyIFtzeW5jIHJlcXVlc3RdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL2NydWQvQWJzdHJhY3RDcnVkTWFuYWdlck1peGluI2Z1bmN0aW9uLXN5bmMpIHdhcyBjYW5jZWxlZCBieSBzb21lIFtiZWZvcmVTeW5jXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9jcnVkL0Fic3RyYWN0Q3J1ZE1hbmFnZXJNaXhpbiNldmVudC1iZWZvcmVTeW5jKSBsaXN0ZW5lci5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIuY3J1ZC5BYnN0cmFjdENydWRNYW5hZ2VyfSBldmVudC5zb3VyY2UgVGhlIENSVUQgbWFuYWdlci5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQucGFjayBUaGUgZGF0YSBwYWNrYWdlIHdoaWNoIGNvbnRhaW5zIGRhdGEgZm9yIGFsbCBzdG9yZXMgbWFuYWdlZCBieSB0aGUgY3J1ZCBtYW5hZ2VyLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblN5bmNDYW5jZWxlZDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQWJzdHJhY3RDcnVkTWFuYWdlciwgcGFjazogb2JqZWN0IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBhZnRlciBbc3luYyByZXF1ZXN0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9jcnVkL0Fic3RyYWN0Q3J1ZE1hbmFnZXJNaXhpbiNmdW5jdGlvbi1zeW5jKSB3YXMgZGVsYXllZCBkdWUgdG8gaW5jb21wbGV0ZSBwcmV2aW91cyBvbmUuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLmNydWQuQWJzdHJhY3RDcnVkTWFuYWdlcn0gZXZlbnQuc291cmNlIFRoZSBDUlVEIG1hbmFnZXIuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LmFyZ3VtZW50cyBUaGUgYXJndW1lbnRzIG9mIFtzeW5jXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL3NjaGVkdWxlci9kb2NzI1NjaGVkdWxlci9jcnVkL0Fic3RyYWN0Q3J1ZE1hbmFnZXJNaXhpbiNmdW5jdGlvbi1zeW5jKSBjYWxsLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblN5bmNEZWxheWVkOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBBYnN0cmFjdENydWRNYW5hZ2VyLCBhcmd1bWVudHM6IG9iamVjdCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiBhIFtzeW5jIHJlcXVlc3RdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvc2NoZWR1bGVyL2RvY3MjU2NoZWR1bGVyL2NydWQvQWJzdHJhY3RDcnVkTWFuYWdlck1peGluI2Z1bmN0aW9uLXN5bmMpIGZhaWxzLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5jcnVkLkFic3RyYWN0Q3J1ZE1hbmFnZXJ9IGV2ZW50LnNvdXJjZSBUaGUgQ1JVRCBtYW5hZ2VyIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5yZXNwb25zZSBUaGUgZGVjb2RlZCBzZXJ2ZXIgcmVzcG9uc2Ugb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5yZXNwb25zZVRleHQgVGhlIHJhdyBzZXJ2ZXIgcmVzcG9uc2UgdGV4dFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5yZXNwb25zZU9wdGlvbnMgW0RFUFJFQ0FURURdIHNlZSBgcmVxdWVzdE9wdGlvbnNgXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LnJlcXVlc3RPcHRpb25zIFRoZSByZXF1ZXN0IG9wdGlvbnMgcGFzc2VkIHRvIHRoZSByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSB7UmVzcG9uc2V9IGV2ZW50LnJhd1Jlc3BvbnNlIFRoZSBuYXRpdmUgUmVzcG9uc2Ugb2JqZWN0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU3luY0ZhaWw6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEFic3RyYWN0Q3J1ZE1hbmFnZXIsIHJlc3BvbnNlOiBvYmplY3QsIHJlc3BvbnNlVGV4dDogc3RyaW5nLCByZXNwb25zZU9wdGlvbnM6IG9iamVjdCwgcmVxdWVzdE9wdGlvbnM6IG9iamVjdCwgcmF3UmVzcG9uc2U6IGFueSB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYW5kIGFwcGVuZCB0aGUgdW5kZXJseWluZyB3aWRnZXRcbiAgICAgKi9cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3RcbiAgICAgICAgICAgIG1lID0gdGhpcyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50UmVmLFxuICAgICAgICAgICAgICAgIGJyeW50dW1Db25maWdcbiAgICAgICAgICAgIH0gPSBtZSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZUNsYXNzLFxuICAgICAgICAgICAgICAgIGluc3RhbmNlTmFtZSxcbiAgICAgICAgICAgICAgICBicnludHVtQ29uZmlncyxcbiAgICAgICAgICAgICAgICBicnludHVtRXZlbnRzXG4gICAgICAgICAgICB9ID0gQnJ5bnR1bVRhc2tCb2FyZFByb2plY3RNb2RlbENvbXBvbmVudDtcblxuICAgICAgICBicnludHVtQ29uZmlncy5maWx0ZXIocHJvcCA9PiBwcm9wIGluIHRoaXMpLmZvckVhY2gocHJvcCA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBXcmFwcGVySGVscGVyLmFwcGx5UHJvcFZhbHVlKGJyeW50dW1Db25maWcsIHByb3AsIHRoaXNbcHJvcF0pO1xuICAgICAgICAgICAgaWYgKFsnZmVhdHVyZXMnLCAnY29uZmlnJ10uaW5jbHVkZXMocHJvcCkpIHtcbiAgICAgICAgICAgICAgICBXcmFwcGVySGVscGVyLmRldldhcm5pbmdDb25maWdQcm9wKGluc3RhbmNlTmFtZSwgcHJvcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGJyeW50dW1FdmVudHMuZmlsdGVyKGV2ZW50ID0+IHRoaXNbZXZlbnRdICYmIHRoaXNbZXZlbnRdLm9ic2VydmVycy5sZW5ndGggPiAwKS5mb3JFYWNoKGV2ZW50ID0+IHtcbiAgICAgICAgICAgIGNvbnN0XG4gICAgICAgICAgICAgICAgdW5jYXBpdGFsaXplID0gKHN0cjogc3RyaW5nKSA9PiBzdHIuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSksXG4gICAgICAgICAgICAgICAgZXZlbnROYW1lID0gKHN0cjogc3RyaW5nKSA9PiB1bmNhcGl0YWxpemUoc3RyLnNsaWNlKDIpKTtcblxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgYnJ5bnR1bUNvbmZpZy5saXN0ZW5lcnNbZXZlbnROYW1lKGV2ZW50KV0gPSBlID0+IHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgbWVbZXZlbnRdLmVtaXQoZSk7XG4gICAgICAgICAgICAgICAgLy8gRXZlbnRFbWl0dGVyIGRvZXMgbm90IHJldHVybiB2YWx1ZXMgaW4gdGhlIG5vcm1hbCB3YXksIHdvcmsgYXJvdW5kIGl0IGJ5IHNldHRpbmcgYHJldHVyblZhbHVlYCBmbGFnXG4gICAgICAgICAgICAgICAgLy8gaW4gQW5ndWxhciBsaXN0ZW5lcnNcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5yZXR1cm5WYWx1ZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIElmIGNvbXBvbmVudCBoYXMgbm8gY29udGFpbmVyIHNwZWNpZmllZCBpbiBjb25maWcgdGhlbiB1c2UgYWRvcHQgdG8gV3JhcHBlcidzIGVsZW1lbnRcbiAgICAgICAgY29uc3RcbiAgICAgICAgICAgIGNvbnRhaW5lclBhcmFtID0gW1xuICAgICAgICAgICAgICAgICdhZG9wdCcsXG4gICAgICAgICAgICAgICAgJ2FwcGVuZFRvJyxcbiAgICAgICAgICAgICAgICAnaW5zZXJ0QWZ0ZXInLFxuICAgICAgICAgICAgICAgICdpbnNlcnRCZWZvcmUnXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgXS5maW5kKHByb3AgPT4gYnJ5bnR1bUNvbmZpZ1twcm9wXSk7XG4gICAgICAgIGlmICghY29udGFpbmVyUGFyYW0pIHtcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZU5hbWUgPT09ICdCdXR0b24nIHx8IGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRSb290Tm9kZSgpIGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgICAgICAgICAgICAgIC8vIEJ1dHRvbiBzaG91bGQgYWx3YXlzIGJlIDxhPiBvciA8YnV0dG9uPiBpbnNpZGUgb3duZXIgZWxlbWVudFxuICAgICAgICAgICAgICAgIGJyeW50dW1Db25maWcuYXBwZW5kVG8gPSBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBicnludHVtQ29uZmlnLmFkb3B0ID0gZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgV3JhcHBlckhlbHBlci5kZXZXYXJuaW5nQ29udGFpbmVyKGluc3RhbmNlTmFtZSwgY29udGFpbmVyUGFyYW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBtZS5pbnN0YW5jZSA9IGluc3RhbmNlTmFtZSA9PT0gJ1dpZGdldCcgPyBXaWRnZXQuY3JlYXRlKGJyeW50dW1Db25maWcpIDogbmV3IGluc3RhbmNlQ2xhc3MoYnJ5bnR1bUNvbmZpZyk7XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXYXRjaCBmb3IgY2hhbmdlc1xuICAgICAqIEBwYXJhbSBjaGFuZ2VzXG4gICAgICovXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBjb25zdFxuICAgICAgICAgICAgeyBpbnN0YW5jZSB9ID0gdGhpcyxcbiAgICAgICAgICAgIHsgaW5zdGFuY2VOYW1lIH0gPSBCcnludHVtVGFza0JvYXJkUHJvamVjdE1vZGVsQ29tcG9uZW50O1xuICAgICAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBjaGFuZ2VzXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGNoYW5nZXMpLmZvckVhY2goKFtwcm9wLCBjaGFuZ2VdKSA9PiB7XG4gICAgICAgICAgICBjb25zdFxuICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gKGNoYW5nZSBhcyBTaW1wbGVDaGFuZ2UpLmN1cnJlbnRWYWx1ZSxcbiAgICAgICAgICAgICAgICB7IGluc3RhbmNlIH0gPSB0aGlzLFxuICAgICAgICAgICAgICAgIHsgYnJ5bnR1bUNvbmZpZ3NPbmx5LCBicnludHVtUHJvcHMgfSA9IEJyeW50dW1UYXNrQm9hcmRQcm9qZWN0TW9kZWxDb21wb25lbnQ7XG4gICAgICAgICAgICBpZiAoYnJ5bnR1bVByb3BzLmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICAgICAgICAgICAgV3JhcHBlckhlbHBlci5hcHBseVByb3BWYWx1ZShpbnN0YW5jZSwgcHJvcCwgbmV3VmFsdWUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoYnJ5bnR1bUNvbmZpZ3NPbmx5LmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICAgICAgICAgICAgICAgIFdyYXBwZXJIZWxwZXIuZGV2V2FybmluZ1VwZGF0ZVByb3AoaW5zdGFuY2VOYW1lLCBwcm9wKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3kgdGhlIGNvbXBvbmVudFxuICAgICAqL1xuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmICh0aGlzLmluc3RhbmNlICYmIHRoaXMuaW5zdGFuY2UuZGVzdHJveSkge1xuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZS5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=