@gravitee/ui-components 3.25.2 → 3.25.3-typescript-5a46c7d

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 (183) hide show
  1. package/package.json +13 -4
  2. package/src/atoms/gv-autocomplete.js +1 -437
  3. package/src/atoms/gv-button.js +1 -235
  4. package/src/atoms/gv-checkbox.js +1 -129
  5. package/src/atoms/gv-date-picker-calendar.js +1 -813
  6. package/src/atoms/gv-date-picker-cell.js +1 -166
  7. package/src/atoms/gv-date-picker.js +1 -532
  8. package/src/atoms/gv-file-upload.js +1 -257
  9. package/src/atoms/gv-icon.js +1 -82
  10. package/src/atoms/gv-image.js +1 -109
  11. package/src/atoms/gv-input-message.js +1 -59
  12. package/src/atoms/gv-input.js +1 -530
  13. package/src/atoms/gv-link.js +1 -132
  14. package/src/atoms/gv-message.js +1 -77
  15. package/src/atoms/gv-metric.js +1 -68
  16. package/src/atoms/gv-relative-time.js +1 -185
  17. package/src/atoms/gv-select-native.js +1 -269
  18. package/src/atoms/gv-select.js +1 -317
  19. package/src/atoms/gv-spinner.js +1 -36
  20. package/src/atoms/gv-state.js +1 -89
  21. package/src/atoms/gv-switch.js +1 -123
  22. package/src/atoms/gv-tag.js +1 -116
  23. package/src/atoms/gv-text.js +1 -107
  24. package/src/charts/gv-chart-bar.js +1 -107
  25. package/src/charts/gv-chart-gauge.js +1 -97
  26. package/src/charts/gv-chart-histogram.js +1 -91
  27. package/src/charts/gv-chart-line.js +1 -235
  28. package/src/charts/gv-chart-map.js +1 -114
  29. package/src/charts/gv-chart-pie.js +1 -95
  30. package/src/index.js +1 -78
  31. package/src/lib/cron-expression.js +1 -210
  32. package/src/lib/date.js +1 -53
  33. package/src/lib/events.js +1 -28
  34. package/src/lib/http-client-schema-form.js +1 -68
  35. package/src/lib/http.js +1 -238
  36. package/src/lib/i18n.js +1 -111
  37. package/src/lib/item.js +1 -119
  38. package/src/lib/properties.js +1 -224
  39. package/src/lib/schema-form.js +1 -43
  40. package/src/lib/studio.js +1 -94
  41. package/src/lib/style.js +1 -41
  42. package/src/lib/text-format.js +1 -76
  43. package/src/lib/theme.js +1 -66
  44. package/src/lib/utils.js +1 -110
  45. package/src/mixins/chart-element.js +1 -142
  46. package/src/mixins/input-element.js +1 -157
  47. package/src/mixins/item-resource.js +1 -122
  48. package/src/mixins/keyboard-element.js +1 -70
  49. package/src/mixins/update-after-browser.js +1 -33
  50. package/src/mixins/with-resize-observer.js +1 -78
  51. package/src/mixins/with-skeleton-attribute.js +1 -118
  52. package/src/molecules/gv-card-full.js +1 -97
  53. package/src/molecules/gv-card-list.js +1 -84
  54. package/src/molecules/gv-card.js +1 -59
  55. package/src/molecules/gv-category-list.js +1 -49
  56. package/src/molecules/gv-category.js +1 -90
  57. package/src/molecules/gv-code.js +1 -297
  58. package/src/molecules/gv-confirm.js +1 -158
  59. package/src/molecules/gv-cron-editor.js +1 -464
  60. package/src/molecules/gv-dropdown-menu.js +1 -84
  61. package/src/molecules/gv-expandable.js +1 -94
  62. package/src/molecules/gv-expression-language.js +1 -308
  63. package/src/molecules/gv-identity-picture.js +1 -125
  64. package/src/molecules/gv-list.js +1 -135
  65. package/src/molecules/gv-metrics.js +1 -150
  66. package/src/molecules/gv-modal.js +1 -146
  67. package/src/molecules/gv-nav.js +1 -170
  68. package/src/molecules/gv-option.js +1 -169
  69. package/src/molecules/gv-plans.js +1 -306
  70. package/src/molecules/gv-popover.js +1 -231
  71. package/src/molecules/gv-promote.js +1 -91
  72. package/src/molecules/gv-rating-list.js +1 -239
  73. package/src/molecules/gv-rating.js +1 -200
  74. package/src/molecules/gv-row-expandable.js +1 -39
  75. package/src/molecules/gv-row.js +1 -84
  76. package/src/molecules/gv-stats.js +1 -96
  77. package/src/molecules/gv-stepper.js +1 -144
  78. package/src/molecules/gv-table.js +1 -575
  79. package/src/molecules/gv-tree.js +1 -127
  80. package/src/organisms/gv-documentation.js +1 -132
  81. package/src/organisms/gv-header.js +1 -130
  82. package/src/organisms/gv-http-client.js +1 -139
  83. package/src/organisms/gv-menu.js +1 -142
  84. package/src/organisms/gv-newsletter-subscription.js +1 -130
  85. package/src/organisms/gv-pagination.js +1 -170
  86. package/src/organisms/gv-properties.js +1 -699
  87. package/src/organisms/gv-resizable-views.js +1 -178
  88. package/src/organisms/gv-resources.js +1 -428
  89. package/src/organisms/gv-schema-form-array.js +1 -140
  90. package/src/organisms/gv-schema-form-control-object.js +1 -140
  91. package/src/organisms/gv-schema-form-control.js +1 -416
  92. package/src/organisms/gv-schema-form.js +1 -646
  93. package/src/organisms/gv-tabs.js +1 -178
  94. package/src/organisms/gv-user-menu.js +1 -149
  95. package/src/organisms/gv-vertical-menu.js +1 -82
  96. package/src/policy-studio/gv-flow-step.js +1 -304
  97. package/src/policy-studio/gv-flow.js +1 -442
  98. package/src/policy-studio/gv-policy-studio-menu.js +1 -436
  99. package/src/policy-studio/gv-policy-studio.js +1 -1778
  100. package/src/styles/empty.js +1 -19
  101. package/src/styles/input.js +1 -19
  102. package/src/styles/link.js +1 -19
  103. package/src/styles/shapes.js +1 -18
  104. package/src/styles/skeleton.js +1 -19
  105. package/src/styles/zoom.js +1 -19
  106. package/src/theme/gv-theme.js +1 -164
  107. package/wc/gv-autocomplete.js +1 -1
  108. package/wc/gv-button.js +1 -1
  109. package/wc/gv-card-full.js +1 -1
  110. package/wc/gv-card-list.js +1 -1
  111. package/wc/gv-card.js +1 -1
  112. package/wc/gv-category-list.js +1 -1
  113. package/wc/gv-category.js +1 -1
  114. package/wc/gv-chart-bar.js +1 -1
  115. package/wc/gv-chart-gauge.js +1 -1
  116. package/wc/gv-chart-histogram.js +1 -1
  117. package/wc/gv-chart-line.js +1 -1
  118. package/wc/gv-chart-map.js +1 -1
  119. package/wc/gv-chart-pie.js +1 -1
  120. package/wc/gv-checkbox.js +1 -1
  121. package/wc/gv-code.js +1 -1
  122. package/wc/gv-confirm.js +1 -1
  123. package/wc/gv-cron-editor.js +1 -1
  124. package/wc/gv-date-picker-calendar.js +1 -1
  125. package/wc/gv-date-picker-cell.js +1 -1
  126. package/wc/gv-date-picker.js +1 -1
  127. package/wc/gv-documentation.js +1 -1
  128. package/wc/gv-dropdown-menu.js +1 -1
  129. package/wc/gv-expandable.js +1 -1
  130. package/wc/gv-expression-language.js +1 -1
  131. package/wc/gv-file-upload.js +1 -1
  132. package/wc/gv-flow-step.js +1 -1
  133. package/wc/gv-flow.js +1 -1
  134. package/wc/gv-header.js +1 -1
  135. package/wc/gv-http-client.js +1 -1
  136. package/wc/gv-icon.js +1 -1
  137. package/wc/gv-identity-picture.js +1 -1
  138. package/wc/gv-image.js +1 -1
  139. package/wc/gv-input-message.js +1 -1
  140. package/wc/gv-input.js +1 -1
  141. package/wc/gv-link.js +1 -1
  142. package/wc/gv-list.js +1 -1
  143. package/wc/gv-menu.js +1 -1
  144. package/wc/gv-message.js +1 -1
  145. package/wc/gv-metric.js +1 -1
  146. package/wc/gv-metrics.js +1 -1
  147. package/wc/gv-modal.js +1 -1
  148. package/wc/gv-nav.js +1 -1
  149. package/wc/gv-newsletter-subscription.js +1 -1
  150. package/wc/gv-option.js +1 -1
  151. package/wc/gv-pagination.js +1 -1
  152. package/wc/gv-plans.js +1 -1
  153. package/wc/gv-policy-studio-menu.js +1 -1
  154. package/wc/gv-policy-studio.js +1 -1
  155. package/wc/gv-popover.js +1 -1
  156. package/wc/gv-promote.js +1 -1
  157. package/wc/gv-properties.js +1 -1
  158. package/wc/gv-rating-list.js +1 -1
  159. package/wc/gv-rating.js +1 -1
  160. package/wc/gv-relative-time.js +1 -1
  161. package/wc/gv-resizable-views.js +1 -1
  162. package/wc/gv-resources.js +1 -1
  163. package/wc/gv-row-expandable.js +1 -1
  164. package/wc/gv-row.js +1 -1
  165. package/wc/gv-schema-form-array.js +1 -1
  166. package/wc/gv-schema-form-control-object.js +1 -1
  167. package/wc/gv-schema-form-control.js +1 -1
  168. package/wc/gv-schema-form.js +1 -1
  169. package/wc/gv-select-native.js +1 -1
  170. package/wc/gv-select.js +1 -1
  171. package/wc/gv-spinner.js +1 -1
  172. package/wc/gv-state.js +1 -1
  173. package/wc/gv-stats.js +1 -1
  174. package/wc/gv-stepper.js +1 -1
  175. package/wc/gv-switch.js +1 -1
  176. package/wc/gv-table.js +1 -1
  177. package/wc/gv-tabs.js +1 -1
  178. package/wc/gv-tag.js +1 -1
  179. package/wc/gv-text.js +1 -1
  180. package/wc/gv-theme.js +1 -1
  181. package/wc/gv-tree.js +1 -1
  182. package/wc/gv-user-menu.js +1 -1
  183. package/wc/gv-vertical-menu.js +1 -1
@@ -1,699 +1 @@
1
- /*
2
- * Copyright (C) 2015 The Gravitee team (http://gravitee.io)
3
- *
4
- * Licensed under the Apache License, Version 2.0 (the "License");
5
- * you may not use this file except in compliance with the License.
6
- * You may obtain a copy of the License at
7
- *
8
- * http://www.apache.org/licenses/LICENSE-2.0
9
- *
10
- * Unless required by applicable law or agreed to in writing, software
11
- * distributed under the License is distributed on an "AS IS" BASIS,
12
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- * See the License for the specific language governing permissions and
14
- * limitations under the License.
15
- */
16
- import { css, html, LitElement } from 'lit';
17
- import './gv-schema-form';
18
- import './gv-resizable-views';
19
- import '../molecules/gv-table';
20
- import '../atoms/gv-button';
21
- import '../atoms/gv-input';
22
- import '../atoms/gv-icon';
23
- import '../atoms/gv-text';
24
- import '../atoms/gv-input-message';
25
- import '../atoms/gv-select';
26
- import { dispatchCustomEvent } from '../lib/events';
27
- import { ERROR_TYPES, parseRaw, toNameEqualsValueString } from '../lib/properties';
28
- import { i18n } from '../lib/i18n';
29
- import { classMap } from 'lit/directives/class-map';
30
- import { KeyboardElement, KEYS } from '../mixins/keyboard-element';
31
- import { empty } from '../styles/empty';
32
- /**
33
- * A component to manage properties
34
- *
35
- * @fires gv-properties:change - When list of properties change
36
- * @fires gv-properties:save-provider - When user validates provider configuration
37
- * @fires gv-properties:switch-encrypted - When user switches encryption toggle
38
- *
39
- * @attr {Array} properties - Array of Properties {key, value, dynamic?}
40
- * @attr {Object} provider - Configuration of provider
41
- * @attr {Array} providers - List of available providers (only http for the moment)
42
- * @attr {Boolean} expert - For display expert mode by default
43
- * @attr {Boolean} encryptable - To display the 'encrypted' toggle on each property
44
- *
45
- * @cssprop {Length} [--gv-properties-table--colmg=0.2rem] - Table cells margin
46
- */
47
-
48
- export class GvProperties extends KeyboardElement(LitElement) {
49
- static get properties() {
50
- return {
51
- dynamicPropertySchema: {
52
- type: Object
53
- },
54
- properties: {
55
- type: Array
56
- },
57
- _properties: {
58
- type: Array,
59
- attribute: false
60
- },
61
- provider: {
62
- type: Object
63
- },
64
- providers: {
65
- type: Array
66
- },
67
- _propertySchemaForm: {
68
- type: Object,
69
- attribute: false
70
- },
71
- expert: {
72
- type: Boolean
73
- },
74
- _formattedErrors: {
75
- type: Array,
76
- attributes: false
77
- },
78
- _filter: {
79
- type: String
80
- },
81
- _paginationData: {
82
- type: Object,
83
- attribute: false
84
- },
85
- _pageSize: {
86
- type: Number,
87
- attribute: false
88
- },
89
- _newItem: {
90
- type: Object,
91
- attribute: false
92
- },
93
- _providerDocumentation: {
94
- type: Boolean,
95
- attribute: false
96
- },
97
- _showDocumentation: {
98
- type: Boolean,
99
- attribute: false
100
- },
101
- _textRows: {
102
- type: Number,
103
- attribute: false
104
- },
105
- readonly: {
106
- type: Boolean,
107
- reflect: true
108
- },
109
- encryptable: {
110
- type: Boolean,
111
- reflect: true
112
- }
113
- };
114
- }
115
-
116
- constructor() {
117
- super();
118
- this.properties = [];
119
- this.types = [];
120
- this.provider = {};
121
- this._currentResource = null;
122
- this._formattedErrors = [];
123
- this._showDocumentation = true;
124
- this._newItem = {
125
- key: '',
126
- value: '',
127
- _new: true
128
- };
129
- this._pageSize = 10;
130
- this._textRows = 10;
131
- this._pageSizes = [5, 10, 25, 50, 100];
132
- this._errors = [];
133
- }
134
-
135
- onKeyboard() {
136
- if (this.isPressed(KEYS.Esc)) {
137
- this._onClosePropertySchemaForm();
138
- }
139
-
140
- if (this.isPressed(KEYS.Shift, KEYS.Ctrl, KEYS.Space)) {
141
- const search = this.shadowRoot.querySelector('#search-property');
142
-
143
- if (search) {
144
- search.focus();
145
- }
146
- }
147
- }
148
-
149
- set properties(properties) {
150
- this._properties = properties.sort((a, b) => a.key.localeCompare(b.key)).map(property => {
151
- if (property.encrypted) {
152
- property.encryptable = true;
153
- }
154
-
155
- return property;
156
- });
157
- }
158
-
159
- get properties() {
160
- return this._properties;
161
- }
162
-
163
- _getResizableViews() {
164
- return this.shadowRoot.querySelector('gv-resizable-views');
165
- }
166
-
167
- _maximizeTopView() {
168
- const views = this._getResizableViews();
169
-
170
- if (views) {
171
- views.maximizeTop(95, 5);
172
- }
173
- }
174
-
175
- _maximizeBottomView() {
176
- const views = this._getResizableViews();
177
-
178
- if (views) {
179
- views.resize(30, 70);
180
- }
181
- }
182
-
183
- _splitMainViews() {
184
- const views = this._getResizableViews();
185
-
186
- if (views) {
187
- views.split();
188
- }
189
- }
190
-
191
- _isNewLineTable(line) {
192
- return line._new === true;
193
- }
194
-
195
- _onInputNew(name, event) {
196
- const target = event.target;
197
- this._newItem[name] = event.detail;
198
- const {
199
- errors
200
- } = parseRaw(toNameEqualsValueString([...this.properties, this._newItem]));
201
- this._errors = errors;
202
- setTimeout(() => {
203
- const btn = this.shadowRoot.querySelector('gv-button#add-property');
204
-
205
- if (errors.length > 0 || this._disabledNewLine(this._newItem)) {
206
- btn.setAttribute('disabled', true);
207
- } else {
208
- btn.removeAttribute('disabled');
209
- }
210
-
211
- if (name === 'key') {
212
- if (errors.length === 0) {
213
- target.removeAttribute('invalid');
214
- target.setAttribute('valid', true);
215
- } else {
216
- target.removeAttribute('valid');
217
- target.setAttribute('invalid', true);
218
- }
219
- }
220
- }, 0);
221
- }
222
-
223
- _onInput() {
224
- dispatchCustomEvent(this, 'change', {
225
- properties: this.properties
226
- });
227
- }
228
-
229
- _onSwitchEncrypted(item) {
230
- if (item.encrypted === true) {
231
- item.value = '';
232
- item.encrypted = false;
233
- item.encryptionWarning = i18n('gv-properties.infos.overwrite-encryption');
234
- this.requestUpdate();
235
- }
236
-
237
- dispatchCustomEvent(this, 'switch-encrypted', {
238
- properties: this.properties
239
- });
240
- }
241
-
242
- _addProperty(item) {
243
- delete item._new;
244
- this.properties = [item, ...this._properties];
245
- this._newItem = {
246
- key: '',
247
- value: '',
248
- _new: true,
249
- encryptable: false,
250
- encrypted: false
251
- };
252
- dispatchCustomEvent(this, 'change', {
253
- properties: this.properties
254
- });
255
- }
256
-
257
- _removeProperty(item) {
258
- this._properties = this._properties.filter(property => property.key !== item.key);
259
- dispatchCustomEvent(this, 'change', {
260
- properties: this.properties
261
- });
262
- }
263
-
264
- _disabledNewLine(item) {
265
- return item.key == null || item.value == null || item.key.trim() === '' || item.value.trim() === '';
266
- }
267
-
268
- _submitExpertMode() {
269
- if (this.expert) {
270
- this.properties = this._handleExpertModeInput(this.shadowRoot.querySelector('#expert-input').value);
271
- }
272
- }
273
-
274
- _onExpertModeTextInput({
275
- detail
276
- }) {
277
- this._handleExpertModeInput(detail);
278
- }
279
-
280
- _handleExpertModeInput(expertModeInputString) {
281
- let allProperties = this._properties;
282
- const providerEnabled = this.provider && this.provider.enabled;
283
- const dynamicProperties = allProperties.filter(prop => providerEnabled && prop.dynamic);
284
- const encryptedProperties = allProperties.filter(prop => prop.encrypted);
285
- const allPropertiesString = `${expertModeInputString}\n${toNameEqualsValueString(dynamicProperties)}\n${toNameEqualsValueString(encryptedProperties)}`;
286
- const {
287
- errors
288
- } = parseRaw(allPropertiesString);
289
- this._errors = errors;
290
-
291
- if (errors.length === 0) {
292
- const {
293
- variables
294
- } = parseRaw(expertModeInputString);
295
- allProperties = [...variables, ...dynamicProperties, ...encryptedProperties];
296
- dispatchCustomEvent(this, 'change', {
297
- properties: allProperties
298
- });
299
- }
300
-
301
- return allProperties;
302
- }
303
-
304
- _onSubmitPropertyForm({
305
- detail
306
- }) {
307
- const provider = detail.values;
308
- dispatchCustomEvent(this, 'save-provider', {
309
- provider
310
- });
311
- this.requestUpdate();
312
- }
313
-
314
- submit() {
315
- if (this.expert) {
316
- this._submitExpertMode();
317
- } else {
318
- this._onSubmit();
319
- }
320
- }
321
-
322
- _onSubmit() {
323
- const invalidControls = [...this.shadowRoot.querySelectorAll('form .control')].find(control => control.invalid);
324
-
325
- if (invalidControls == null) {
326
- this._addProperty(this._newItem);
327
- }
328
- }
329
-
330
- _onConfigureDynamicProperties() {
331
- if (this.dynamicPropertySchema == null) {
332
- // dynamicPropertySchema has been introduced to ensure backward compatibility with old versions. If no schema is provided a default schema will be used.
333
- const providersTitleMap = this.providers.reduce((map, provider) => {
334
- map[provider.id] = provider.key;
335
- return map;
336
- }, {});
337
- const providersEnum = Object.keys(providersTitleMap);
338
- this.dynamicPropertySchema = {
339
- properties: {
340
- enabled: {
341
- type: 'boolean',
342
- title: 'Enabled',
343
- description: ' This service is requiring an API deployment. Do not forget to deploy API to start dynamic-properties service.'
344
- },
345
- schedule: {
346
- type: 'string',
347
- title: 'Schedule',
348
- 'x-schema-form': {
349
- 'cron-expression': true
350
- }
351
- },
352
- provider: {
353
- type: 'string',
354
- title: 'Provider type',
355
- enum: providersEnum,
356
- default: providersEnum[0],
357
- 'x-schema-form': {
358
- titleMap: providersTitleMap
359
- }
360
- }
361
- },
362
- required: ['schedule', 'provider']
363
- };
364
- }
365
-
366
- const defaultProvider = this.providers[0];
367
- this._propertySchemaForm = {
368
- properties: { ...this.dynamicPropertySchema.properties,
369
- configuration: defaultProvider.schema
370
- },
371
- required: this.dynamicPropertySchema.required
372
- };
373
- this._providerDocumentation = defaultProvider.documentation;
374
-
375
- this._maximizeBottomView();
376
- }
377
-
378
- _onClosePropertySchemaForm() {
379
- this._propertySchemaForm = null;
380
-
381
- this._maximizeTopView();
382
- }
383
-
384
- _onSearchProperty({
385
- detail
386
- }) {
387
- this._filter = detail;
388
-
389
- this._onClosePropertySchemaForm();
390
- }
391
-
392
- _onClearProperty() {
393
- this._filter = null;
394
-
395
- this._onClosePropertySchemaForm();
396
- }
397
-
398
- get _errors() {
399
- return this._formattedErrors;
400
- }
401
-
402
- set _errors(rawErrors) {
403
- this._formattedErrors = rawErrors.map(({
404
- type,
405
- key,
406
- pos
407
- }) => {
408
- if (type === ERROR_TYPES.INVALID_NAME) {
409
- return {
410
- line: pos.line,
411
- msg: i18n('gv-properties.errors.invalid-key', {
412
- key
413
- })
414
- };
415
- }
416
-
417
- if (type === ERROR_TYPES.DUPLICATED_NAME) {
418
- return {
419
- line: pos.line,
420
- msg: i18n('gv-properties.errors.duplicated-key', {
421
- key
422
- })
423
- };
424
- }
425
-
426
- if (type === ERROR_TYPES.INVALID_LINE) {
427
- return {
428
- line: pos.line,
429
- msg: i18n('gv-properties.errors.invalid-line')
430
- };
431
- }
432
-
433
- if (type === ERROR_TYPES.INVALID_VALUE) {
434
- return {
435
- line: pos.line,
436
- msg: i18n('gv-properties.errors.invalid-value')
437
- };
438
- }
439
-
440
- return {
441
- line: '?',
442
- msg: i18n('gv-properties.errors.unknown')
443
- };
444
- });
445
- }
446
-
447
- _renderErrors(withLine = false) {
448
- if (this._formattedErrors.length > 0) {
449
- return html`<div class="${classMap({
450
- 'add-form-error': true,
451
- 'add-form-error_expert': this.expert
452
- })}"> <div></div> <div class="error-list"> ${this._formattedErrors.map(({
453
- line,
454
- msg
455
- }) => html` <gv-input-message>${withLine ? html`<strong .innerHTML="${i18n('gv-properties.errors.line')} ${line}:&nbsp;"></strong>` : ''} <span .innerHTML="${msg}"></span></gv-input-message> `)} </div> </div>`;
456
- }
457
-
458
- return html``;
459
- }
460
-
461
- _renderTable() {
462
- const providerEnabled = this.provider && this.provider.enabled;
463
-
464
- if (this.expert) {
465
- this._computeTextRows();
466
-
467
- const staticProperties = providerEnabled ? this._properties.filter(prop => !(providerEnabled && prop.dynamic)) : this._properties;
468
- const expertProperties = staticProperties.filter(prop => !prop.encrypted);
469
- const content = expertProperties.map(prop => `${prop.key}="${prop.value}"`).join('\n');
470
- return html`<gv-text id="expert-input" placeholder="${i18n('gv-properties.placeholder.input')}" @gv-text:input="${this._onExpertModeTextInput}" .value="${content}" ?readonly="${this.readonly}" .rows="${this._textRows}"></gv-text> ${this._renderErrors(true)}`;
471
- } else {
472
- const options = {
473
- data: [{
474
- field: 'dynamic',
475
- label: 'Dynamic',
476
- width: '40px',
477
- type: item => item.dynamic && providerEnabled ? 'gv-icon' : 'div',
478
- attributes: {
479
- shape: item => item.dynamic && providerEnabled ? 'code:time-schedule' : '',
480
- title: item => item.dynamic && providerEnabled ? 'Dynamic properties service is actually in running' : '',
481
- style: 'justify-content: center; align-items: center; height: 100%;'
482
- }
483
- }, {
484
- field: 'key',
485
- label: 'Key',
486
- type: 'gv-input',
487
- attributes: {
488
- clipboard: true,
489
- placeholder: i18n('gv-properties.placeholder.key'),
490
- name: 'key',
491
- required: true,
492
- readonly: this.readonly
493
- }
494
- }, {
495
- field: 'value',
496
- label: 'Value',
497
- type: 'gv-input',
498
- attributes: {
499
- name: 'value',
500
- placeholder: 'Property value',
501
- required: true,
502
- readonly: this.readonly,
503
- disabled: item => item.dynamic && providerEnabled || item.encrypted,
504
- type: item => item.encrypted ? 'password' : 'text',
505
- title: item => item.encrypted ? i18n('gv-properties.infos.encrypted-value') : '',
506
- description: item => item.encryptionWarning,
507
- icon: null,
508
- 'ongv-input:input': this._onInput.bind(this)
509
- }
510
- }]
511
- };
512
-
513
- if (this.encryptable === true) {
514
- options.data.push({
515
- field: 'encryptable',
516
- type: 'gv-switch',
517
- style: '--gv-switch--ta: right;',
518
- width: '105px',
519
- attributes: {
520
- description: i18n('gv-properties.encrypted-toggle'),
521
- required: true,
522
- readonly: this.readonly,
523
- disabled: item => item.dynamic && providerEnabled,
524
- 'ongv-switch:input': this._onSwitchEncrypted.bind(this),
525
- style: 'display: inline-flex; font-size: 12px; height: 40px;'
526
- }
527
- });
528
- }
529
-
530
- if (this.readonly !== true) {
531
- options.data.push({
532
- type: 'gv-button',
533
- width: '40px',
534
- attributes: {
535
- 'ongv-button:click': (item, event, target) => this._removeProperty(item, target),
536
- title: 'Remove',
537
- disabled: item => item.dynamic && providerEnabled,
538
- danger: true,
539
- outlined: true,
540
- icon: 'home:trash'
541
- }
542
- });
543
- }
544
-
545
- const filteredProperties = this._filter != null ? this._properties.filter(prop => {
546
- return (prop.key.toLowerCase() + prop.value.toLowerCase()).includes(this._filter);
547
- }) : this._properties;
548
- let properties = [...filteredProperties];
549
-
550
- if (this._paginationData) {
551
- this._paginationData.last = Math.ceil(filteredProperties.length / this._pageSize);
552
- this._paginationData.total = filteredProperties.length;
553
- this._paginationData.total_pages = Math.ceil(filteredProperties.length / this._pageSize);
554
- const index = (this._paginationData.current_page - 1) * this._pageSize;
555
- properties = [...filteredProperties].splice(index, this._pageSize);
556
- }
557
-
558
- const addPropertyFormGridClass = this.encryptable ? 'add-form-grid-with-encrypted-toggle' : 'add-form-grid';
559
- const addPropertyForm = this.readonly !== true ? html`<form id="add-property-form" class="add-form ${addPropertyFormGridClass}" @submit="${this._onSubmit}"> <div></div> <gv-input class="control" placeholder="${i18n('gv-properties.placeholder.key')}" required @gv-input:input="${this._onInputNew.bind(this, 'key')}" value="${this._newItem.key}"></gv-input> <gv-input class="control" placeholder="${i18n('gv-properties.placeholder.value')}" required @gv-input:input="${this._onInputNew.bind(this, 'value')}" .value="${this._newItem.value}"></gv-input> ${this.encryptable ? html` <gv-switch class="control" required description="${i18n('gv-properties.encrypted-toggle')}" @gv-switch:input="${this._onInputNew.bind(this, 'encryptable')}" .value="${this._newItem.encryptable}"></gv-switch>` : ''} <gv-button id="add-property" icon="code:plus" outlined disabled="disabled" @gv-button:click="${this._addProperty.bind(this, this._newItem)}" title="${i18n('gv-properties.add')}"></gv-button> </form> ${this._renderErrors()} <hr>` : '';
560
- return html` ${addPropertyForm} <gv-table .options="${options}" .items="${properties}" noheader nosort order="key" rowheight="57px"></gv-table>`;
561
- }
562
- }
563
-
564
- _onChangeMode({
565
- detail
566
- }) {
567
- this._submitExpertMode();
568
-
569
- this.expert = detail;
570
- this._errors = [];
571
- this._newItem = {
572
- key: '',
573
- value: '',
574
- _new: true
575
- };
576
-
577
- this._onClosePropertySchemaForm();
578
- }
579
-
580
- _onPaginate({
581
- detail
582
- }) {
583
- this._paginationData.current_page = detail.page;
584
-
585
- this._onClosePropertySchemaForm();
586
-
587
- this.requestUpdate();
588
- }
589
-
590
- updated(props) {
591
- if (props.has('_properties') || props.has('_pageSize')) {
592
- this._paginationData = {
593
- first: 1,
594
- last: Math.ceil(this._properties.length / this._pageSize),
595
- total: this._properties.length,
596
- current_page: 1,
597
- total_pages: Math.ceil(this._properties.length / this._pageSize)
598
- };
599
- }
600
- }
601
-
602
- _onChangePageSize({
603
- detail
604
- }) {
605
- this._pageSize = Number(detail).valueOf();
606
-
607
- this._onClosePropertySchemaForm();
608
- }
609
-
610
- _renderTableForm() {
611
- return html`<div class="container"> <div class="header"> <div class="title">Manage global properties <span>(${this._properties ? this._properties.length : 0})</span></div> <gv-switch small .description="${this.expert ? 'Expert' : 'Simple'}" .value="${this.expert}" @gv-switch:input="${this._onChangeMode}"></gv-switch> <gv-input id="search-property" placeholder="Filter properties (Shift + Ctrl + Space)" type="search" small class="search-input" .disabled="${this.expert}" @gv-input:input="${this._onSearchProperty}" @gv-input:clear="${this._onClearProperty}"></gv-input> <gv-select class="page-size__select" @gv-select:input="${this._onChangePageSize}" small .options="${this._pageSizes}" .value="${this._pageSize}" .disabled="${this.expert || this._paginationData == null}"></gv-select> <gv-pagination @gv-pagination:paginate="${this._onPaginate}" .disabled="${this.expert || this._paginationData == null}" .data="${this._paginationData}" widget></gv-pagination> </div> <div class="content"><div class="form-content">${this._renderTable()}</div></div> </div>`;
612
- }
613
-
614
- _fetchDocumentation() {
615
- this._showDocumentation = true;
616
- }
617
-
618
- _hideDocumentation() {
619
- this._showDocumentation = false;
620
- }
621
-
622
- get dirty() {
623
- const form = this.shadowRoot.querySelector('gv-schema-form');
624
- return form && form.dirty;
625
- }
626
-
627
- confirm() {
628
- const form = this.shadowRoot.querySelector('gv-schema-form');
629
-
630
- if (form) {
631
- return form.confirm().then(() => this._onClosePropertySchemaForm());
632
- }
633
-
634
- return Promise.resolve();
635
- }
636
-
637
- _renderForm() {
638
- return html`<gv-schema-form slot="top" scrollable .schema="${this._propertySchemaForm}" .values="${this.provider}" .icon="design:edit" has-header ?readonly="${this.readonly}" @gv-schema-form:submit="${this._onSubmitPropertyForm}"> <div slot="title" class="properties-title">Configure dynamic properties</div> <gv-button slot="header-left" icon="general:close" outlined small @gv-button:click="${this._onClosePropertySchemaForm}" title="Close (esc)"></gv-button> <gv-button slot="header-left" icon="home:book" ?disabled="${this._showDocumentation}" outlined small @gv-button:click="${this._fetchDocumentation}" title="Open documentation"></gv-button> </gv-schema-form>`;
639
- }
640
-
641
- _renderBottom() {
642
- if (this._propertySchemaForm && this._showDocumentation) {
643
- return html`<gv-resizable-views no-overflow direction="horizontal"> ${this._renderForm()} <gv-documentation slot="bottom" .text="${this._providerDocumentation}" @gv-documentation:close="${this._hideDocumentation}"></gv-documentation> </gv-resizable-views>`;
644
- } else if (this._propertySchemaForm) {
645
- return this._renderForm();
646
- } else {
647
- return html`<div class="properties-bottom-container">${this._renderDynamicConfiguration()}</div>`;
648
- }
649
- }
650
-
651
- _renderDynamicConfiguration() {
652
- const hasDynamicConfiguration = this.provider && this.provider.enabled;
653
- let configureAction = '';
654
-
655
- if (hasDynamicConfiguration || this.readonly !== true) {
656
- configureAction = html`<gv-button icon="tools:tools" @gv-button:click="${this._onConfigureDynamicProperties}" outlined .disabled="${this.expert}">Configure dynamic properties</gv-button>`;
657
- }
658
-
659
- if (hasDynamicConfiguration) {
660
- return html`<div class="properties-message"> Dynamic properties service is actually in <code>running</code> state and run with cron expression <code>${this.provider.schedule}</code> using <code>${this.provider.provider}</code> provider. </div> ${configureAction}`;
661
- } else if (this.readonly) {
662
- return html`<div class="empty">No dynamic properties service configured</div>`;
663
- } else {
664
- return configureAction;
665
- }
666
- }
667
-
668
- _onMove() {
669
- this._computeTextRows();
670
- }
671
-
672
- _computeTextRows() {
673
- const parent = this.shadowRoot.querySelector('.content');
674
-
675
- if (parent) {
676
- const {
677
- height
678
- } = parent.getBoundingClientRect(); // --gv-text--lh=30px
679
-
680
- this._textRows = Math.round(Math.round(height - 20) / 30) - 2;
681
- }
682
- }
683
-
684
- render() {
685
- if (this.providers && this.providers.length > 0) {
686
- return html`<div class="properties"> <gv-resizable-views no-overflow @gv-resizable-views:move="${this._onMove}" @gv-resizable-views:resize="${this._onMove}"> <div slot="top" class="box">${this._renderTableForm()}</div> <div slot="bottom">${this._renderBottom()}</div> </gv-resizable-views> </div>`;
687
- } else {
688
- return html`<div class="properties"> <div class="table-box">${this._renderTableForm()}</div> </div>`;
689
- }
690
- }
691
-
692
- static get styles() {
693
- return [empty, // language=CSS
694
- css`:host{box-sizing:border-box;height:100%;width:100%;display:block}.properties{display:flex;height:100%;width:100%}gv-resizable-views{height:100%;width:100%}gv-schema-form{margin:0}.table-box{width:100%;border-left:1px solid #bfbfbf;display:flex}gv-table{height:auto;flex:1;margin-top:10px;margin-right:50px;--gv-table-rows--ov:none;--gv-table--colmg:var(--gv-properties-table--colmg, 0.2rem);--gv-table-cell--d:inline;--gv-table-row--ai:flex-start;--gv-table-row--ac:flex-start;--gv-table-hover--bgc:var(--gv-theme-neutral-color-lightest)}.properties-title{text-transform:uppercase;letter-spacing:.2rem}.properties-bottom-container{display:flex;justify-content:center;align-items:center;height:100%;flex-direction:column}.header{border-bottom:1px solid #d9d9d9;display:flex;min-height:45px;align-items:center;margin-bottom:.5rem;padding:0 .5rem}.header .title{color:#28444f;font-size:18px;display:flex;align-items:flex-end;flex:1}.header .title span{font-size:12px;margin-left:8px;opacity:.7}.box{position:absolute;display:flex;flex-direction:column;width:100%;top:0;bottom:0;left:0}.container{flex-grow:1;display:flex;flex-direction:column;min-height:0;height:100%}.content{background:#fff;flex-grow:1;overflow:auto;min-height:0;padding:.5rem;display:flex;flex-direction:column;align-items:center}gv-text{--gv-text--fz:20px;--gv-text--lh:25px}gv-switch{--gv-switch--ta:right}.header gv-input{margin:0 1rem}.add-form,.add-form-error{display:grid;margin:auto 50px auto 0;box-sizing:border-box}.add-form{column-gap:var(--gv-properties-table--colmg,.2rem);border-right:solid thick transparent;height:50px}.add-form gv-input,gv-button,gv-switch{margin:auto 0}.add-form gv-switch{font-size:12px}.add-form-grid{grid-template-columns:40px auto auto 40px}.add-form-grid-with-encrypted-toggle{grid-template-columns:40px auto auto 105px 40px}.add-form-error_expert{display:flex}.add-form-error{grid-template-columns:40px 1fr}code{color:var(--gv-theme-color-warning-dark,#f57c00)}.form-content{display:flex;flex-direction:column;width:100%}.properties-message{margin-bottom:.5rem;font-size:14px}.page-size__select{max-width:50px}.search-input{width:300px}hr{background-color:var(--gv-theme-neutral-color);border:0;width:100%;height:2px}`];
695
- }
696
-
697
- }
698
- window.customElements.define('gv-properties', GvProperties);
699
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4vbm9kZV9tb2R1bGVzL0BncmF2aXRlZS91aS1jb21wb25lbnRzL29yZ2FuaXNtcy9ndi1wcm9wZXJ0aWVzLmpzIl0sIm5hbWVzIjpbImNzcyIsImh0bWwiLCJMaXRFbGVtZW50IiwiZGlzcGF0Y2hDdXN0b21FdmVudCIsIkVSUk9SX1RZUEVTIiwicGFyc2VSYXciLCJ0b05hbWVFcXVhbHNWYWx1ZVN0cmluZyIsImkxOG4iLCJjbGFzc01hcCIsIktleWJvYXJkRWxlbWVudCIsIktFWVMiLCJlbXB0eSIsIkd2UHJvcGVydGllcyIsInByb3BlcnRpZXMiLCJkeW5hbWljUHJvcGVydHlTY2hlbWEiLCJ0eXBlIiwiT2JqZWN0IiwiQXJyYXkiLCJfcHJvcGVydGllcyIsImF0dHJpYnV0ZSIsInByb3ZpZGVyIiwicHJvdmlkZXJzIiwiX3Byb3BlcnR5U2NoZW1hRm9ybSIsImV4cGVydCIsIkJvb2xlYW4iLCJfZm9ybWF0dGVkRXJyb3JzIiwiYXR0cmlidXRlcyIsIl9maWx0ZXIiLCJTdHJpbmciLCJfcGFnaW5hdGlvbkRhdGEiLCJfcGFnZVNpemUiLCJOdW1iZXIiLCJfbmV3SXRlbSIsIl9wcm92aWRlckRvY3VtZW50YXRpb24iLCJfc2hvd0RvY3VtZW50YXRpb24iLCJfdGV4dFJvd3MiLCJyZWFkb25seSIsInJlZmxlY3QiLCJlbmNyeXB0YWJsZSIsImNvbnN0cnVjdG9yIiwidHlwZXMiLCJfY3VycmVudFJlc291cmNlIiwia2V5IiwidmFsdWUiLCJfbmV3IiwiX3BhZ2VTaXplcyIsIl9lcnJvcnMiLCJvbktleWJvYXJkIiwiaXNQcmVzc2VkIiwiRXNjIiwiX29uQ2xvc2VQcm9wZXJ0eVNjaGVtYUZvcm0iLCJTaGlmdCIsIkN0cmwiLCJTcGFjZSIsInNlYXJjaCIsInNoYWRvd1Jvb3QiLCJxdWVyeVNlbGVjdG9yIiwiZm9jdXMiLCJzb3J0IiwiYSIsImIiLCJsb2NhbGVDb21wYXJlIiwibWFwIiwicHJvcGVydHkiLCJlbmNyeXB0ZWQiLCJfZ2V0UmVzaXphYmxlVmlld3MiLCJfbWF4aW1pemVUb3BWaWV3Iiwidmlld3MiLCJtYXhpbWl6ZVRvcCIsIl9tYXhpbWl6ZUJvdHRvbVZpZXciLCJyZXNpemUiLCJfc3BsaXRNYWluVmlld3MiLCJzcGxpdCIsIl9pc05ld0xpbmVUYWJsZSIsImxpbmUiLCJfb25JbnB1dE5ldyIsIm5hbWUiLCJldmVudCIsInRhcmdldCIsImRldGFpbCIsImVycm9ycyIsInNldFRpbWVvdXQiLCJidG4iLCJsZW5ndGgiLCJfZGlzYWJsZWROZXdMaW5lIiwic2V0QXR0cmlidXRlIiwicmVtb3ZlQXR0cmlidXRlIiwiX29uSW5wdXQiLCJfb25Td2l0Y2hFbmNyeXB0ZWQiLCJpdGVtIiwiZW5jcnlwdGlvbldhcm5pbmciLCJyZXF1ZXN0VXBkYXRlIiwiX2FkZFByb3BlcnR5IiwiX3JlbW92ZVByb3BlcnR5IiwiZmlsdGVyIiwidHJpbSIsIl9zdWJtaXRFeHBlcnRNb2RlIiwiX2hhbmRsZUV4cGVydE1vZGVJbnB1dCIsIl9vbkV4cGVydE1vZGVUZXh0SW5wdXQiLCJleHBlcnRNb2RlSW5wdXRTdHJpbmciLCJhbGxQcm9wZXJ0aWVzIiwicHJvdmlkZXJFbmFibGVkIiwiZW5hYmxlZCIsImR5bmFtaWNQcm9wZXJ0aWVzIiwicHJvcCIsImR5bmFtaWMiLCJlbmNyeXB0ZWRQcm9wZXJ0aWVzIiwiYWxsUHJvcGVydGllc1N0cmluZyIsInZhcmlhYmxlcyIsIl9vblN1Ym1pdFByb3BlcnR5Rm9ybSIsInZhbHVlcyIsInN1Ym1pdCIsIl9vblN1Ym1pdCIsImludmFsaWRDb250cm9scyIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJmaW5kIiwiY29udHJvbCIsImludmFsaWQiLCJfb25Db25maWd1cmVEeW5hbWljUHJvcGVydGllcyIsInByb3ZpZGVyc1RpdGxlTWFwIiwicmVkdWNlIiwiaWQiLCJwcm92aWRlcnNFbnVtIiwia2V5cyIsInRpdGxlIiwiZGVzY3JpcHRpb24iLCJzY2hlZHVsZSIsImVudW0iLCJkZWZhdWx0IiwidGl0bGVNYXAiLCJyZXF1aXJlZCIsImRlZmF1bHRQcm92aWRlciIsImNvbmZpZ3VyYXRpb24iLCJzY2hlbWEiLCJkb2N1bWVudGF0aW9uIiwiX29uU2VhcmNoUHJvcGVydHkiLCJfb25DbGVhclByb3BlcnR5IiwicmF3RXJyb3JzIiwicG9zIiwiSU5WQUxJRF9OQU1FIiwibXNnIiwiRFVQTElDQVRFRF9OQU1FIiwiSU5WQUxJRF9MSU5FIiwiSU5WQUxJRF9WQUxVRSIsIl9yZW5kZXJFcnJvcnMiLCJ3aXRoTGluZSIsIl9yZW5kZXJUYWJsZSIsIl9jb21wdXRlVGV4dFJvd3MiLCJzdGF0aWNQcm9wZXJ0aWVzIiwiZXhwZXJ0UHJvcGVydGllcyIsImNvbnRlbnQiLCJqb2luIiwib3B0aW9ucyIsImRhdGEiLCJmaWVsZCIsImxhYmVsIiwid2lkdGgiLCJzaGFwZSIsInN0eWxlIiwiY2xpcGJvYXJkIiwicGxhY2Vob2xkZXIiLCJkaXNhYmxlZCIsImljb24iLCJiaW5kIiwicHVzaCIsImRhbmdlciIsIm91dGxpbmVkIiwiZmlsdGVyZWRQcm9wZXJ0aWVzIiwidG9Mb3dlckNhc2UiLCJpbmNsdWRlcyIsImxhc3QiLCJNYXRoIiwiY2VpbCIsInRvdGFsIiwidG90YWxfcGFnZXMiLCJpbmRleCIsImN1cnJlbnRfcGFnZSIsInNwbGljZSIsImFkZFByb3BlcnR5Rm9ybUdyaWRDbGFzcyIsImFkZFByb3BlcnR5Rm9ybSIsIl9vbkNoYW5nZU1vZGUiLCJfb25QYWdpbmF0ZSIsInBhZ2UiLCJ1cGRhdGVkIiwicHJvcHMiLCJoYXMiLCJmaXJzdCIsIl9vbkNoYW5nZVBhZ2VTaXplIiwidmFsdWVPZiIsIl9yZW5kZXJUYWJsZUZvcm0iLCJfZmV0Y2hEb2N1bWVudGF0aW9uIiwiX2hpZGVEb2N1bWVudGF0aW9uIiwiZGlydHkiLCJmb3JtIiwiY29uZmlybSIsInRoZW4iLCJQcm9taXNlIiwicmVzb2x2ZSIsIl9yZW5kZXJGb3JtIiwiX3JlbmRlckJvdHRvbSIsIl9yZW5kZXJEeW5hbWljQ29uZmlndXJhdGlvbiIsImhhc0R5bmFtaWNDb25maWd1cmF0aW9uIiwiY29uZmlndXJlQWN0aW9uIiwiX29uTW92ZSIsInBhcmVudCIsImhlaWdodCIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsInJvdW5kIiwicmVuZGVyIiwic3R5bGVzIiwid2luZG93IiwiY3VzdG9tRWxlbWVudHMiLCJkZWZpbmUiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNBLEdBQVQsRUFBY0MsSUFBZCxFQUFvQkMsVUFBcEIsUUFBc0MsS0FBdEM7QUFFQSxPQUFPLGtCQUFQO0FBQ0EsT0FBTyxzQkFBUDtBQUNBLE9BQU8sdUJBQVA7QUFDQSxPQUFPLG9CQUFQO0FBQ0EsT0FBTyxtQkFBUDtBQUNBLE9BQU8sa0JBQVA7QUFDQSxPQUFPLGtCQUFQO0FBQ0EsT0FBTywyQkFBUDtBQUNBLE9BQU8sb0JBQVA7QUFDQSxTQUFTQyxtQkFBVCxRQUFvQyxlQUFwQztBQUNBLFNBQVNDLFdBQVQsRUFBc0JDLFFBQXRCLEVBQWdDQyx1QkFBaEMsUUFBK0QsbUJBQS9EO0FBQ0EsU0FBU0MsSUFBVCxRQUFxQixhQUFyQjtBQUNBLFNBQVNDLFFBQVQsUUFBeUIsMEJBQXpCO0FBQ0EsU0FBU0MsZUFBVCxFQUEwQkMsSUFBMUIsUUFBc0MsNEJBQXRDO0FBQ0EsU0FBU0MsS0FBVCxRQUFzQixpQkFBdEI7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsT0FBTyxNQUFNQyxZQUFOLFNBQTJCSCxlQUFlLENBQUNQLFVBQUQsQ0FBMUMsQ0FBdUQ7QUFDdkMsYUFBVlcsVUFBVSxHQUFHO0FBQ3RCLFdBQU87QUFDTEMsTUFBQUEscUJBQXFCLEVBQUU7QUFBRUMsUUFBQUEsSUFBSSxFQUFFQztBQUFSLE9BRGxCO0FBRUxILE1BQUFBLFVBQVUsRUFBRTtBQUFFRSxRQUFBQSxJQUFJLEVBQUVFO0FB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Y2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBHcmF2aXRlZSB0ZWFtIChodHRwOi8vZ3Jhdml0ZWUuaW8pXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgY3NzLCBodG1sLCBMaXRFbGVtZW50IH0gZnJvbSAnbGl0JztcblxuaW1wb3J0ICcuL2d2LXNjaGVtYS1mb3JtJztcbmltcG9ydCAnLi9ndi1yZXNpemFibGUtdmlld3MnO1xuaW1wb3J0ICcuLi9tb2xlY3VsZXMvZ3YtdGFibGUnO1xuaW1wb3J0ICcuLi9hdG9tcy9ndi1idXR0b24nO1xuaW1wb3J0ICcuLi9hdG9tcy9ndi1pbnB1dCc7XG5pbXBvcnQgJy4uL2F0b21zL2d2LWljb24nO1xuaW1wb3J0ICcuLi9hdG9tcy9ndi10ZXh0JztcbmltcG9ydCAnLi4vYXRvbXMvZ3YtaW5wdXQtbWVzc2FnZSc7XG5pbXBvcnQgJy4uL2F0b21zL2d2LXNlbGVjdCc7XG5pbXBvcnQgeyBkaXNwYXRjaEN1c3RvbUV2ZW50IH0gZnJvbSAnLi4vbGliL2V2ZW50cyc7XG5pbXBvcnQgeyBFUlJPUl9UWVBFUywgcGFyc2VSYXcsIHRvTmFtZUVxdWFsc1ZhbHVlU3RyaW5nIH0gZnJvbSAnLi4vbGliL3Byb3BlcnRpZXMnO1xuaW1wb3J0IHsgaTE4biB9IGZyb20gJy4uL2xpYi9pMThuJztcbmltcG9ydCB7IGNsYXNzTWFwIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvY2xhc3MtbWFwJztcbmltcG9ydCB7IEtleWJvYXJkRWxlbWVudCwgS0VZUyB9IGZyb20gJy4uL21peGlucy9rZXlib2FyZC1lbGVtZW50JztcbmltcG9ydCB7IGVtcHR5IH0gZnJvbSAnLi4vc3R5bGVzL2VtcHR5JztcblxuLyoqXG4gKiBBIGNvbXBvbmVudCB0byBtYW5hZ2UgcHJvcGVydGllc1xuICpcbiAqIEBmaXJlcyBndi1wcm9wZXJ0aWVzOmNoYW5nZSAtIFdoZW4gbGlzdCBvZiBwcm9wZXJ0aWVzIGNoYW5nZVxuICogQGZpcmVzIGd2LXByb3BlcnRpZXM6c2F2ZS1wcm92aWRlciAtIFdoZW4gdXNlciB2YWxpZGF0ZXMgcHJvdmlkZXIgY29uZmlndXJhdGlvblxuICogQGZpcmVzIGd2LXByb3BlcnRpZXM6c3dpdGNoLWVuY3J5cHRlZCAtIFdoZW4gdXNlciBzd2l0Y2hlcyBlbmNyeXB0aW9uIHRvZ2dsZVxuICpcbiAqIEBhdHRyIHtBcnJheX0gcHJvcGVydGllcyAtIEFycmF5IG9mIFByb3BlcnRpZXMge2tleSwgdmFsdWUsIGR5bmFtaWM/fVxuICogQGF0dHIge09iamVjdH0gcHJvdmlkZXIgLSBDb25maWd1cmF0aW9uIG9mIHByb3ZpZGVyXG4gKiBAYXR0ciB7QXJyYXl9IHByb3ZpZGVycyAtIExpc3Qgb2YgYXZhaWxhYmxlIHByb3ZpZGVycyAob25seSBodHRwIGZvciB0aGUgbW9tZW50KVxuICogQGF0dHIge0Jvb2xlYW59IGV4cGVydCAtIEZvciBkaXNwbGF5IGV4cGVydCBtb2RlIGJ5IGRlZmF1bHRcbiAqIEBhdHRyIHtCb29sZWFufSBlbmNyeXB0YWJsZSAtIFRvIGRpc3BsYXkgdGhlICdlbmNyeXB0ZWQnIHRvZ2dsZSBvbiBlYWNoIHByb3BlcnR5XG4gKlxuICogQGNzc3Byb3Age0xlbmd0aH0gWy0tZ3YtcHJvcGVydGllcy10YWJsZS0tY29sbWc9MC4ycmVtXSAtIFRhYmxlIGNlbGxzIG1hcmdpblxuICovXG5leHBvcnQgY2xhc3MgR3ZQcm9wZXJ0aWVzIGV4dGVuZHMgS2V5Ym9hcmRFbGVtZW50KExpdEVsZW1lbnQpIHtcbiAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBkeW5hbWljUHJvcGVydHlTY2hlbWE6IHsgdHlwZTogT2JqZWN0IH0sXG4gICAgICBwcm9wZXJ0aWVzOiB7IHR5cGU6IEFycmF5IH0sXG4gICAgICBfcHJvcGVydGllczogeyB0eXBlOiBBcnJheSwgYXR0cmlidXRlOiBmYWxzZSB9LFxuICAgICAgcHJvdmlkZXI6IHsgdHlwZTogT2JqZWN0IH0sXG4gICAgICBwcm92aWRlcnM6IHsgdHlwZTogQXJyYXkgfSxcbiAgICAgIF9wcm9wZXJ0eVNjaGVtYUZvcm06IHsgdHlwZTogT2JqZWN0LCBhdHRyaWJ1dGU6IGZhbHNlIH0sXG4gICAgICBleHBlcnQ6IHsgdHlwZTogQm9vbGVhbiB9LFxuICAgICAgX2Zvcm1hdHRlZEVycm9yczogeyB0eXBlOiBBcnJheSwgYXR0cmlidXRlczogZmFsc2UgfSxcbiAgICAgIF9maWx0ZXI6IHsgdHlwZTogU3RyaW5nIH0sXG4gICAgICBfcGFnaW5hdGlvbkRhdGE6IHsgdHlwZTogT2JqZWN0LCBhdHRyaWJ1dGU6IGZhbHNlIH0sXG4gICAgICBfcGFnZVNpemU6IHsgdHlwZTogTnVtYmVyLCBhdHRyaWJ1dGU6IGZhbHNlIH0sXG4gICAgICBfbmV3SXRlbTogeyB0eXBlOiBPYmplY3QsIGF0dHJpYnV0ZTogZmFsc2UgfSxcbiAgICAgIF9wcm92aWRlckRvY3VtZW50YXRpb246IHsgdHlwZTogQm9vbGVhbiwgYXR0cmlidXRlOiBmYWxzZSB9LFxuICAgICAgX3Nob3dEb2N1bWVudGF0aW9uOiB7IHR5cGU6IEJvb2xlYW4sIGF0dHJpYnV0ZTogZmFsc2UgfSxcbiAgICAgIF90ZXh0Um93czogeyB0eXBlOiBOdW1iZXIsIGF0dHJpYnV0ZTogZmFsc2UgfSxcbiAgICAgIHJlYWRvbmx5OiB7IHR5cGU6IEJvb2xlYW4sIHJlZmxlY3Q6IHRydWUgfSxcbiAgICAgIGVuY3J5cHRhYmxlOiB7IHR5cGU6IEJvb2xlYW4sIHJlZmxlY3Q6IHRydWUgfSxcbiAgICB9O1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnByb3BlcnRpZXMgPSBbXTtcbiAgICB0aGlzLnR5cGVzID0gW107XG4gICAgdGhpcy5wcm92aWRlciA9IHt9O1xuICAgIHRoaXMuX2N1cnJlbnRSZXNvdXJjZSA9IG51bGw7XG4gICAgdGhpcy5fZm9ybWF0dGVkRXJyb3JzID0gW107XG4gICAgdGhpcy5fc2hvd0RvY3VtZW50YXRpb24gPSB0cnVlO1xuICAgIHRoaXMuX25ld0l0ZW0gPSB7IGtleTogJycsIHZhbHVlOiAnJywgX25ldzogdHJ1ZSB9O1xuICAgIHRoaXMuX3BhZ2VTaXplID0gMTA7XG4gICAgdGhpcy5fdGV4dFJvd3MgPSAxMDtcbiAgICB0aGlzLl9wYWdlU2l6ZXMgPSBbNSwgMTAsIDI1LCA1MCwgMTAwXTtcbiAgICB0aGlzLl9lcnJvcnMgPSBbXTtcbiAgfVxuXG4gIG9uS2V5Ym9hcmQoKSB7XG4gICAgaWYgKHRoaXMuaXNQcmVzc2VkKEtFWVMuRXNjKSkge1xuICAgICAgdGhpcy5fb25DbG9zZVByb3BlcnR5U2NoZW1hRm9ybSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc1ByZXNzZWQoS0VZUy5TaGlmdCwgS0VZUy5DdHJsLCBLRVlTLlNwYWNlKSkge1xuICAgICAgY29uc3Qgc2VhcmNoID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJyNzZWFyY2gtcHJvcGVydHknKTtcbiAgICAgIGlmIChzZWFyY2gpIHtcbiAgICAgICAgc2VhcmNoLmZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2V0IHByb3BlcnRpZXMocHJvcGVydGllcykge1xuICAgIHRoaXMuX3Byb3BlcnRpZXMgPSBwcm9wZXJ0aWVzXG4gICAgICAuc29ydCgoYSwgYikgPT4gYS5rZXkubG9jYWxlQ29tcGFyZShiLmtleSkpXG4gICAgICAubWFwKChwcm9wZXJ0eSkgPT4ge1xuICAgICAgICBpZiAocHJvcGVydHkuZW5jcnlwdGVkKSB7XG4gICAgICAgICAgcHJvcGVydHkuZW5jcnlwdGFibGUgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wZXJ0eTtcbiAgICAgIH0pO1xuICB9XG5cbiAgZ2V0IHByb3BlcnRpZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Byb3BlcnRpZXM7XG4gIH1cblxuICBfZ2V0UmVzaXphYmxlVmlld3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdndi1yZXNpemFibGUtdmlld3MnKTtcbiAgfVxuXG4gIF9tYXhpbWl6ZVRvcFZpZXcoKSB7XG4gICAgY29uc3Qgdmlld3MgPSB0aGlzLl9nZXRSZXNpemFibGVWaWV3cygpO1xuICAgIGlmICh2aWV3cykge1xuICAgICAgdmlld3MubWF4aW1pemVUb3AoOTUsIDUpO1xuICAgIH1cbiAgfVxuXG4gIF9tYXhpbWl6ZUJvdHRvbVZpZXcoKSB7XG4gICAgY29uc3Qgdmlld3MgPSB0aGlzLl9nZXRSZXNpemFibGVWaWV3cygpO1xuICAgIGlmICh2aWV3cykge1xuICAgICAgdmlld3MucmVzaXplKDMwLCA3MCk7XG4gICAgfVxuICB9XG5cbiAgX3NwbGl0TWFpblZpZXdzKCkge1xuICAgIGNvbnN0IHZpZXdzID0gdGhpcy5fZ2V0UmVzaXphYmxlVmlld3MoKTtcbiAgICBpZiAodmlld3MpIHtcbiAgICAgIHZpZXdzLnNwbGl0KCk7XG4gICAgfVxuICB9XG5cbiAgX2lzTmV3TGluZVRhYmxlKGxpbmUpIHtcbiAgICByZXR1cm4gbGluZS5fbmV3ID09PSB0cnVlO1xuICB9XG5cbiAgX29uSW5wdXROZXcobmFtZSwgZXZlbnQpIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgdGhpcy5fbmV3SXRlbVtuYW1lXSA9IGV2ZW50LmRldGFpbDtcbiAgICBjb25zdCB7IGVycm9ycyB9ID0gcGFyc2VSYXcodG9OYW1lRXF1YWxzVmFsdWVTdHJpbmcoWy4uLnRoaXMucHJvcGVydGllcywgdGhpcy5fbmV3SXRlbV0pKTtcbiAgICB0aGlzLl9lcnJvcnMgPSBlcnJvcnM7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBidG4gPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignZ3YtYnV0dG9uI2FkZC1wcm9wZXJ0eScpO1xuICAgICAgaWYgKGVycm9ycy5sZW5ndGggPiAwIHx8IHRoaXMuX2Rpc2FibGVkTmV3TGluZSh0aGlzLl9uZXdJdGVtKSkge1xuICAgICAgICBidG4uc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsIHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnRuLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgIH1cbiAgICAgIGlmIChuYW1lID09PSAna2V5Jykge1xuICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoJ2ludmFsaWQnKTtcbiAgICAgICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKCd2YWxpZCcsIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoJ3ZhbGlkJyk7XG4gICAgICAgICAgdGFyZ2V0LnNldEF0dHJpYnV0ZSgnaW52YWxpZCcsIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgMCk7XG4gIH1cblxuICBfb25JbnB1dCgpIHtcbiAgICBkaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMsICdjaGFuZ2UnLCB7IHByb3BlcnRpZXM6IHRoaXMucHJvcGVydGllcyB9KTtcbiAgfVxuXG4gIF9vblN3aXRjaEVuY3J5cHRlZChpdGVtKSB7XG4gICAgaWYgKGl0ZW0uZW5jcnlwdGVkID09PSB0cnVlKSB7XG4gICAgICBpdGVtLnZhbHVlID0gJyc7XG4gICAgICBpdGVtLmVuY3J5cHRlZCA9IGZhbHNlO1xuICAgICAgaXRlbS5lbmNyeXB0aW9uV2FybmluZyA9IGkxOG4oJ2d2LXByb3BlcnRpZXMuaW5mb3Mub3ZlcndyaXRlLWVuY3J5cHRpb24nKTtcbiAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpO1xuICAgIH1cbiAgICBkaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMsICdzd2l0Y2gtZW5jcnlwdGVkJywgeyBwcm9wZXJ0aWVzOiB0aGlzLnByb3BlcnRpZXMgfSk7XG4gIH1cblxuICBfYWRkUHJvcGVydHkoaXRlbSkge1xuICAgIGRlbGV0ZSBpdGVtLl9uZXc7XG4gICAgdGhpcy5wcm9wZXJ0aWVzID0gW2l0ZW0sIC4uLnRoaXMuX3Byb3BlcnRpZXNdO1xuICAgIHRoaXMuX25ld0l0ZW0gPSB7IGtleTogJycsIHZhbHVlOiAnJywgX25ldzogdHJ1ZSwgZW5jcnlwdGFibGU6IGZhbHNlLCBlbmNyeXB0ZWQ6IGZhbHNlIH07XG4gICAgZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLCAnY2hhbmdlJywgeyBwcm9wZXJ0aWVzOiB0aGlzLnByb3BlcnRpZXMgfSk7XG4gIH1cblxuICBfcmVtb3ZlUHJvcGVydHkoaXRlbSkge1xuICAgIHRoaXMuX3Byb3BlcnRpZXMgPSB0aGlzLl9wcm9wZXJ0aWVzLmZpbHRlcigocHJvcGVydHkpID0+IHByb3BlcnR5LmtleSAhPT0gaXRlbS5rZXkpO1xuICAgIGRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcywgJ2NoYW5nZScsIHsgcHJvcGVydGllczogdGhpcy5wcm9wZXJ0aWVzIH0pO1xuICB9XG5cbiAgX2Rpc2FibGVkTmV3TGluZShpdGVtKSB7XG4gICAgcmV0dXJuIGl0ZW0ua2V5ID09IG51bGwgfHwgaXRlbS52YWx1ZSA9PSBudWxsIHx8IGl0ZW0ua2V5LnRyaW0oKSA9PT0gJycgfHwgaXRlbS52YWx1ZS50cmltKCkgPT09ICcnO1xuICB9XG5cbiAgX3N1Ym1pdEV4cGVydE1vZGUoKSB7XG4gICAgaWYgKHRoaXMuZXhwZXJ0KSB7XG4gICAgICB0aGlzLnByb3BlcnRpZXMgPSB0aGlzLl9oYW5kbGVFeHBlcnRNb2RlSW5wdXQodGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJyNleHBlcnQtaW5wdXQnKS52YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgX29uRXhwZXJ0TW9kZVRleHRJbnB1dCh7IGRldGFpbCB9KSB7XG4gICAgdGhpcy5faGFuZGxlRXhwZXJ0TW9kZUlucHV0KGRldGFpbCk7XG4gIH1cblxuICBfaGFuZGxlRXhwZXJ0TW9kZUlucHV0KGV4cGVydE1vZGVJbnB1dFN0cmluZykge1xuICAgIGxldCBhbGxQcm9wZXJ0aWVzID0gdGhpcy5fcHJvcGVydGllcztcbiAgICBjb25zdCBwcm92aWRlckVuYWJsZWQgPSB0aGlzLnByb3ZpZGVyICYmIHRoaXMucHJvdmlkZXIuZW5hYmxlZDtcbiAgICBjb25zdCBkeW5hbWljUHJvcGVydGllcyA9IGFsbFByb3BlcnRpZXMuZmlsdGVyKChwcm9wKSA9PiBwcm92aWRlckVuYWJsZWQgJiYgcHJvcC5keW5hbWljKTtcbiAgICBjb25zdCBlbmNyeXB0ZWRQcm9wZXJ0aWVzID0gYWxsUHJvcGVydGllcy5maWx0ZXIoKHByb3ApID0+IHByb3AuZW5jcnlwdGVkKTtcblxuICAgIGNvbnN0IGFsbFByb3BlcnRpZXNTdHJpbmcgPSBgJHtleHBlcnRNb2RlSW5wdXRTdHJpbmd9XFxuJHt0b05hbWVFcXVhbHNWYWx1ZVN0cmluZyhkeW5hbWljUHJvcGVydGllcyl9XFxuJHt0b05hbWVFcXVhbHNWYWx1ZVN0cmluZyhcbiAgICAgIGVuY3J5cHRlZFByb3BlcnRpZXMsXG4gICAgKX1gO1xuICAgIGNvbnN0IHsgZXJyb3JzIH0gPSBwYXJzZVJhdyhhbGxQcm9wZXJ0aWVzU3RyaW5nKTtcbiAgICB0aGlzLl9lcnJvcnMgPSBlcnJvcnM7XG4gICAgaWYgKGVycm9ycy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnN0IHsgdmFyaWFibGVzIH0gPSBwYXJzZVJhdyhleHBlcnRNb2RlSW5wdXRTdHJpbmcpO1xuICAgICAgYWxsUHJvcGVydGllcyA9IFsuLi52YXJpYWJsZXMsIC4uLmR5bmFtaWNQcm9wZXJ0aWVzLCAuLi5lbmNyeXB0ZWRQcm9wZXJ0aWVzXTtcbiAgICAgIGRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcywgJ2NoYW5nZScsIHsgcHJvcGVydGllczogYWxsUHJvcGVydGllcyB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWxsUHJvcGVydGllcztcbiAgfVxuXG4gIF9vblN1Ym1pdFByb3BlcnR5Rm9ybSh7IGRldGFpbCB9KSB7XG4gICAgY29uc3QgcHJvdmlkZXIgPSBkZXRhaWwudmFsdWVzO1xuICAgIGRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcywgJ3NhdmUtcHJvdmlkZXInLCB7IHByb3ZpZGVyIH0pO1xuICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpO1xuICB9XG5cbiAgc3VibWl0KCkge1xuICAgIGlmICh0aGlzLmV4cGVydCkge1xuICAgICAgdGhpcy5fc3VibWl0RXhwZXJ0TW9kZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9vblN1Ym1pdCgpO1xuICAgIH1cbiAgfVxuXG4gIF9vblN1Ym1pdCgpIHtcbiAgICBjb25zdCBpbnZhbGlkQ29udHJvbHMgPSBbLi4udGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ2Zvcm0gLmNvbnRyb2wnKV0uZmluZCgoY29udHJvbCkgPT4gY29udHJvbC5pbnZhbGlkKTtcbiAgICBpZiAoaW52YWxpZENvbnRyb2xzID09IG51bGwpIHtcbiAgICAgIHRoaXMuX2FkZFByb3BlcnR5KHRoaXMuX25ld0l0ZW0pO1xuICAgIH1cbiAgfVxuXG4gIF9vbkNvbmZpZ3VyZUR5bmFtaWNQcm9wZXJ0aWVzKCkge1xuICAgIGlmICh0aGlzLmR5bmFtaWNQcm9wZXJ0eVNjaGVtYSA9PSBudWxsKSB7XG4gICAgICAvLyBkeW5hbWljUHJvcGVydHlTY2hlbWEgaGFzIGJlZW4gaW50cm9kdWNlZCB0byBlbnN1cmUgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCB2ZXJzaW9ucy4gSWYgbm8gc2NoZW1hIGlzIHByb3ZpZGVkIGEgZGVmYXVsdCBzY2hlbWEgd2lsbCBiZSB1c2VkLlxuICAgICAgY29uc3QgcHJvdmlkZXJzVGl0bGVNYXAgPSB0aGlzLnByb3ZpZGVycy5yZWR1Y2UoKG1hcCwgcHJvdmlkZXIpID0+IHtcbiAgICAgICAgbWFwW3Byb3ZpZGVyLmlkXSA9IHByb3ZpZGVyLmtleTtcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgIH0sIHt9KTtcblxuICAgICAgY29uc3QgcHJvdmlkZXJzRW51bSA9IE9iamVjdC5rZXlzKHByb3ZpZGVyc1RpdGxlTWFwKTtcbiAgICAgIHRoaXMuZHluYW1pY1Byb3BlcnR5U2NoZW1hID0ge1xuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgZW5hYmxlZDoge1xuICAgICAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICAgICAgdGl0bGU6ICdFbmFibGVkJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnIFRoaXMgc2VydmljZSBpcyByZXF1aXJpbmcgYW4gQVBJIGRlcGxveW1lbnQuIERvIG5vdCBmb3JnZXQgdG8gZGVwbG95IEFQSSB0byBzdGFydCBkeW5hbWljLXByb3BlcnRpZXMgc2VydmljZS4nLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc2NoZWR1bGU6IHtcbiAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgdGl0bGU6ICdTY2hlZHVsZScsXG4gICAgICAgICAgICAneC1zY2hlbWEtZm9ybSc6IHtcbiAgICAgICAgICAgICAgJ2Nyb24tZXhwcmVzc2lvbic6IHRydWUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcHJvdmlkZXI6IHtcbiAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgdGl0bGU6ICdQcm92aWRlciB0eXBlJyxcbiAgICAgICAgICAgIGVudW06IHByb3ZpZGVyc0VudW0sXG4gICAgICAgICAgICBkZWZhdWx0OiBwcm92aWRlcnNFbnVtWzBdLFxuICAgICAgICAgICAgJ3gtc2NoZW1hLWZvcm0nOiB7XG4gICAgICAgICAgICAgIHRpdGxlTWFwOiBwcm92aWRlcnNUaXRsZU1hcCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgcmVxdWlyZWQ6IFsnc2NoZWR1bGUnLCAncHJvdmlkZXInXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgZGVmYXVsdFByb3ZpZGVyID0gdGhpcy5wcm92aWRlcnNbMF07XG5cbiAgICB0aGlzLl9wcm9wZXJ0eVNjaGVtYUZvcm0gPSB7XG4gICAgICBwcm9wZXJ0aWVzOiB7IC4uLnRoaXMuZHluYW1pY1Byb3BlcnR5U2NoZW1hLnByb3BlcnRpZXMsIGNvbmZpZ3VyYXRpb246IGRlZmF1bHRQcm92aWRlci5zY2hlbWEgfSxcbiAgICAgIHJlcXVpcmVkOiB0aGlzLmR5bmFtaWNQcm9wZXJ0eVNjaGVtYS5yZXF1aXJlZCxcbiAgICB9O1xuICAgIHRoaXMuX3Byb3ZpZGVyRG9jdW1lbnRhdGlvbiA9IGRlZmF1bHRQcm92aWRlci5kb2N1bWVudGF0aW9uO1xuICAgIHRoaXMuX21heGltaXplQm90dG9tVmlldygpO1xuICB9XG5cbiAgX29uQ2xvc2VQcm9wZXJ0eVNjaGVtYUZvcm0oKSB7XG4gICAgdGhpcy5fcHJvcGVydHlTY2hlbWFGb3JtID0gbnVsbDtcbiAgICB0aGlzLl9tYXhpbWl6ZVRvcFZpZXcoKTtcbiAgfVxuXG4gIF9vblNlYXJjaFByb3BlcnR5KHsgZGV0YWlsIH0pIHtcbiAgICB0aGlzLl9maWx0ZXIgPSBkZXRhaWw7XG4gICAgdGhpcy5fb25DbG9zZVByb3BlcnR5U2NoZW1hRm9ybSgpO1xuICB9XG5cbiAgX29uQ2xlYXJQcm9wZXJ0eSgpIHtcbiAgICB0aGlzLl9maWx0ZXIgPSBudWxsO1xuICAgIHRoaXMuX29uQ2xvc2VQcm9wZXJ0eVNjaGVtYUZvcm0oKTtcbiAgfVxuXG4gIGdldCBfZXJyb3JzKCkge1xuICAgIHJldHVybiB0aGlzLl9mb3JtYXR0ZWRFcnJvcnM7XG4gIH1cblxuICBzZXQgX2Vycm9ycyhyYXdFcnJvcnMpIHtcbiAgICB0aGlzLl9mb3JtYXR0ZWRFcnJvcnMgPSByYXdFcnJvcnMubWFwKCh7IHR5cGUsIGtleSwgcG9zIH0pID0+IHtcbiAgICAgIGlmICh0eXBlID09PSBFUlJPUl9UWVBFUy5JTlZBTElEX05BTUUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsaW5lOiBwb3MubGluZSxcbiAgICAgICAgICBtc2c6IGkxOG4oJ2d2LXByb3BlcnRpZXMuZXJyb3JzLmludmFsaWQta2V5JywgeyBrZXkgfSksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAodHlwZSA9PT0gRVJST1JfVFlQRVMuRFVQTElDQVRFRF9OQU1FKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbGluZTogcG9zLmxpbmUsXG4gICAgICAgICAgbXNnOiBpMThuKCdndi1wcm9wZXJ0aWVzLmVycm9ycy5kdXBsaWNhdGVkLWtleScsIHsga2V5IH0pLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKHR5cGUgPT09IEVSUk9SX1RZUEVTLklOVkFMSURfTElORSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxpbmU6IHBvcy5saW5lLFxuICAgICAgICAgIG1zZzogaTE4bignZ3YtcHJvcGVydGllcy5lcnJvcnMuaW52YWxpZC1saW5lJyksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAodHlwZSA9PT0gRVJST1JfVFlQRVMuSU5WQUxJRF9WQUxVRSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGxpbmU6IHBvcy5saW5lLFxuICAgICAgICAgIG1zZzogaTE4bignZ3YtcHJvcGVydGllcy5lcnJvcnMuaW52YWxpZC12YWx1ZScpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgbGluZTogJz8nLCBtc2c6IGkxOG4oJ2d2LXByb3BlcnRpZXMuZXJyb3JzLnVua25vd24nKSB9O1xuICAgIH0pO1xuICB9XG5cbiAgX3JlbmRlckVycm9ycyh3aXRoTGluZSA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMuX2Zvcm1hdHRlZEVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gaHRtbGA8ZGl2IGNsYXNzPVwiJHtjbGFzc01hcCh7ICdhZGQtZm9ybS1lcnJvcic6IHRydWUsICdhZGQtZm9ybS1lcnJvcl9leHBlcnQnOiB0aGlzLmV4cGVydCB9KX1cIj5cbiAgICAgICAgPGRpdj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImVycm9yLWxpc3RcIj5cbiAgICAgICAgICAke3RoaXMuX2Zvcm1hdHRlZEVycm9ycy5tYXAoXG4gICAgICAgICAgICAoeyBsaW5lLCBtc2cgfSkgPT4gaHRtbGBcbiAgICAgICAgICAgICAgPGd2LWlucHV0LW1lc3NhZ2VcbiAgICAgICAgICAgICAgICA+JHt3aXRoTGluZSA/IGh0bWxgPHN0cm9uZyAuaW5uZXJIVE1MPVwiJHtpMThuKCdndi1wcm9wZXJ0aWVzLmVycm9ycy5saW5lJyl9ICR7bGluZX06Jm5ic3A7XCI+PC9zdHJvbmc+YCA6ICcnfVxuICAgICAgICAgICAgICAgIDxzcGFuIC5pbm5lckhUTUw9XCIke21zZ31cIj48L3NwYW5cbiAgICAgICAgICAgICAgPjwvZ3YtaW5wdXQtbWVzc2FnZT5cbiAgICAgICAgICAgIGAsXG4gICAgICAgICAgKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5gO1xuICAgIH1cbiAgICByZXR1cm4gaHRtbGBgO1xuICB9XG5cbiAgX3JlbmRlclRhYmxlKCkge1xuICAgIGNvbnN0IHByb3ZpZGVyRW5hYmxlZCA9IHRoaXMucHJvdmlkZXIgJiYgdGhpcy5wcm92aWRlci5lbmFibGVkO1xuICAgIGlmICh0aGlzLmV4cGVydCkge1xuICAgICAgdGhpcy5fY29tcHV0ZVRleHRSb3dzKCk7XG5cbiAgICAgIGNvbnN0IHN0YXRpY1Byb3BlcnRpZXMgPSBwcm92aWRlckVuYWJsZWQgPyB0aGlzLl9wcm9wZXJ0aWVzLmZpbHRlcigocHJvcCkgPT4gIShwcm92aWRlckVuYWJsZWQgJiYgcHJvcC5keW5hbWljKSkgOiB0aGlzLl9wcm9wZXJ0aWVzO1xuICAgICAgY29uc3QgZXhwZXJ0UHJvcGVydGllcyA9IHN0YXRpY1Byb3BlcnRpZXMuZmlsdGVyKChwcm9wKSA9PiAhcHJvcC5lbmNyeXB0ZWQpO1xuICAgICAgY29uc3QgY29udGVudCA9IGV4cGVydFByb3BlcnRpZXMubWFwKChwcm9wKSA9PiBgJHtwcm9wLmtleX09XCIke3Byb3AudmFsdWV9XCJgKS5qb2luKCdcXG4nKTtcblxuICAgICAgcmV0dXJuIGh0bWxgPGd2LXRleHRcbiAgICAgICAgICBpZD1cImV4cGVydC1pbnB1dFwiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCIke2kxOG4oJ2d2LXByb3BlcnRpZXMucGxhY2Vob2xkZXIuaW5wdXQnKX1cIlxuICAgICAgICAgIEBndi10ZXh0OmlucHV0PVwiJHt0aGlzLl9vbkV4cGVydE1vZGVUZXh0SW5wdXR9XCJcbiAgICAgICAgICAudmFsdWU9XCIke2NvbnRlbnR9XCJcbiAgICAgICAgICA/cmVhZG9ubHk9XCIke3RoaXMucmVhZG9ubHl9XCJcbiAgICAgICAgICAucm93cz1cIiR7dGhpcy5fdGV4dFJvd3N9XCJcbiAgICAgICAgPjwvZ3YtdGV4dD5cbiAgICAgICAgJHt0aGlzLl9yZW5kZXJFcnJvcnModHJ1ZSl9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgZGF0YTogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZpZWxkOiAnZHluYW1pYycsXG4gICAgICAgICAgICBsYWJlbDogJ0R5bmFtaWMnLFxuICAgICAgICAgICAgd2lkdGg6ICc0MHB4JyxcbiAgICAgICAgICAgIHR5cGU6IChpdGVtKSA9PiAoaXRlbS5keW5hbWljICYmIHByb3ZpZGVyRW5hYmxlZCA/ICdndi1pY29uJyA6ICdkaXYnKSxcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgICAgc2hhcGU6IChpdGVtKSA9PiAoaXRlbS5keW5hbWljICYmIHByb3ZpZGVyRW5hYmxlZCA/ICdjb2RlOnRpbWUtc2NoZWR1bGUnIDogJycpLFxuICAgICAgICAgICAgICB0aXRsZTogKGl0ZW0pID0+IChpdGVtLmR5bmFtaWMgJiYgcHJvdmlkZXJFbmFibGVkID8gJ0R5bmFtaWMgcHJvcGVydGllcyBzZXJ2aWNlIGlzIGFjdHVhbGx5IGluIHJ1bm5pbmcnIDogJycpLFxuICAgICAgICAgICAgICBzdHlsZTogJ2p1c3RpZnktY29udGVudDogY2VudGVyOyBhbGlnbi1pdGVtczogY2VudGVyOyBoZWlnaHQ6IDEwMCU7JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmaWVsZDogJ2tleScsXG4gICAgICAgICAgICBsYWJlbDogJ0tleScsXG4gICAgICAgICAgICB0eXBlOiAnZ3YtaW5wdXQnLFxuICAgICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgICBjbGlwYm9hcmQ6IHRydWUsXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBpMThuKCdndi1wcm9wZXJ0aWVzLnBsYWNlaG9sZGVyLmtleScpLFxuICAgICAgICAgICAgICBuYW1lOiAna2V5JyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIHJlYWRvbmx5OiB0aGlzLnJlYWRvbmx5LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZpZWxkOiAndmFsdWUnLFxuICAgICAgICAgICAgbGFiZWw6ICdWYWx1ZScsXG4gICAgICAgICAgICB0eXBlOiAnZ3YtaW5wdXQnLFxuICAgICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgICBuYW1lOiAndmFsdWUnLFxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogJ1Byb3BlcnR5IHZhbHVlJyxcbiAgICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICAgIHJlYWRvbmx5OiB0aGlzLnJlYWRvbmx5LFxuICAgICAgICAgICAgICBkaXNhYmxlZDogKGl0ZW0pID0+IChpdGVtLmR5bmFtaWMgJiYgcHJvdmlkZXJFbmFibGVkKSB8fCBpdGVtLmVuY3J5cHRlZCxcbiAgICAgICAgICAgICAgdHlwZTogKGl0ZW0pID0+IChpdGVtLmVuY3J5cHRlZCA/ICdwYXNzd29yZCcgOiAndGV4dCcpLFxuICAgICAgICAgICAgICB0aXRsZTogKGl0ZW0pID0+IChpdGVtLmVuY3J5cHRlZCA/IGkxOG4oJ2d2LXByb3BlcnRpZXMuaW5mb3MuZW5jcnlwdGVkLXZhbHVlJykgOiAnJyksXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAoaXRlbSkgPT4gaXRlbS5lbmNyeXB0aW9uV2FybmluZyxcbiAgICAgICAgICAgICAgaWNvbjogbnVsbCxcbiAgICAgICAgICAgICAgJ29uZ3YtaW5wdXQ6aW5wdXQnOiB0aGlzLl9vbklucHV0LmJpbmQodGhpcyksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuXG4gICAgICBpZiAodGhpcy5lbmNyeXB0YWJsZSA9PT0gdHJ1ZSkge1xuICAgICAgICBvcHRpb25zLmRhdGEucHVzaCh7XG4gICAgICAgICAgZmllbGQ6ICdlbmNyeXB0YWJsZScsXG4gICAgICAgICAgdHlwZTogJ2d2LXN3aXRjaCcsXG4gICAgICAgICAgc3R5bGU6ICctLWd2LXN3aXRjaC0tdGE6IHJpZ2h0OycsXG4gICAgICAgICAgd2lkdGg6ICcxMDVweCcsXG4gICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgZGVzY3JpcHRpb246IGkxOG4oJ2d2LXByb3BlcnRpZXMuZW5jcnlwdGVkLXRvZ2dsZScpLFxuICAgICAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICByZWFkb25seTogdGhpcy5yZWFkb25seSxcbiAgICAgICAgICAgIGRpc2FibGVkOiAoaXRlbSkgPT4gaXRlbS5keW5hbWljICYmIHByb3ZpZGVyRW5hYmxlZCxcbiAgICAgICAgICAgICdvbmd2LXN3aXRjaDppbnB1dCc6IHRoaXMuX29uU3dpdGNoRW5jcnlwdGVkLmJpbmQodGhpcyksXG4gICAgICAgICAgICBzdHlsZTogJ2Rpc3BsYXk6IGlubGluZS1mbGV4OyBmb250LXNpemU6IDEycHg7IGhlaWdodDogNDBweDsnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5yZWFkb25seSAhPT0gdHJ1ZSkge1xuICAgICAgICBvcHRpb25zLmRhdGEucHVzaCh7XG4gICAgICAgICAgdHlwZTogJ2d2LWJ1dHRvbicsXG4gICAgICAgICAgd2lkdGg6ICc0MHB4JyxcbiAgICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgICAnb25ndi1idXR0b246Y2xpY2snOiAoaXRlbSwgZXZlbnQsIHRhcmdldCkgPT4gdGhpcy5fcmVtb3ZlUHJvcGVydHkoaXRlbSwgdGFyZ2V0KSxcbiAgICAgICAgICAgIHRpdGxlOiAnUmVtb3ZlJyxcbiAgICAgICAgICAgIGRpc2FibGVkOiAoaXRlbSkgPT4gaXRlbS5keW5hbWljICYmIHByb3ZpZGVyRW5hYmxlZCxcbiAgICAgICAgICAgIGRhbmdlcjogdHJ1ZSxcbiAgICAgICAgICAgIG91dGxpbmVkOiB0cnVlLFxuICAgICAgICAgICAgaWNvbjogJ2hvbWU6dHJhc2gnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWx0ZXJlZFByb3BlcnRpZXMgPVxuICAgICAgICB0aGlzLl9maWx0ZXIgIT0gbnVsbFxuICAgICAgICAgID8gdGhpcy5fcHJvcGVydGllcy5maWx0ZXIoKHByb3ApID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIChwcm9wLmtleS50b0xvd2VyQ2FzZSgpICsgcHJvcC52YWx1ZS50b0xvd2VyQ2FzZSgpKS5pbmNsdWRlcyh0aGlzLl9maWx0ZXIpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICA6IHRoaXMuX3Byb3BlcnRpZXM7XG4gICAgICBsZXQgcHJvcGVydGllcyA9IFsuLi5maWx0ZXJlZFByb3BlcnRpZXNdO1xuICAgICAgaWYgKHRoaXMuX3BhZ2luYXRpb25EYXRhKSB7XG4gICAgICAgIHRoaXMuX3BhZ2luYXRpb25EYXRhLmxhc3QgPSBNYXRoLmNlaWwoZmlsdGVyZWRQcm9wZXJ0aWVzLmxlbmd0aCAvIHRoaXMuX3BhZ2VTaXplKTtcbiAgICAgICAgdGhpcy5fcGFnaW5hdGlvbkRhdGEudG90YWwgPSBmaWx0ZXJlZFByb3BlcnRpZXMubGVuZ3RoO1xuICAgICAgICB0aGlzLl9wYWdpbmF0aW9uRGF0YS50b3RhbF9wYWdlcyA9IE1hdGguY2VpbChmaWx0ZXJlZFByb3BlcnRpZXMubGVuZ3RoIC8gdGhpcy5fcGFnZVNpemUpO1xuICAgICAgICBjb25zdCBpbmRleCA9ICh0aGlzLl9wYWdpbmF0aW9uRGF0YS5jdXJyZW50X3BhZ2UgLSAxKSAqIHRoaXMuX3BhZ2VTaXplO1xuICAgICAgICBwcm9wZXJ0aWVzID0gWy4uLmZpbHRlcmVkUHJvcGVydGllc10uc3BsaWNlKGluZGV4LCB0aGlzLl9wYWdlU2l6ZSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFkZFByb3BlcnR5Rm9ybUdyaWRDbGFzcyA9IHRoaXMuZW5jcnlwdGFibGUgPyAnYWRkLWZvcm0tZ3JpZC13aXRoLWVuY3J5cHRlZC10b2dnbGUnIDogJ2FkZC1mb3JtLWdyaWQnO1xuXG4gICAgICBjb25zdCBhZGRQcm9wZXJ0eUZvcm0gPVxuICAgICAgICB0aGlzLnJlYWRvbmx5ICE9PSB0cnVlXG4gICAgICAgICAgPyBodG1sYDxmb3JtIGlkPVwiYWRkLXByb3BlcnR5LWZvcm1cIiBjbGFzcz1cImFkZC1mb3JtICR7YWRkUHJvcGVydHlGb3JtR3JpZENsYXNzfVwiIEBzdWJtaXQ9XCIke3RoaXMuX29uU3VibWl0fVwiPlxuICAgICAgICAgICAgICAgIDxkaXY+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGd2LWlucHV0XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCIke2kxOG4oJ2d2LXByb3BlcnRpZXMucGxhY2Vob2xkZXIua2V5Jyl9XCJcbiAgICAgICAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgICBAZ3YtaW5wdXQ6aW5wdXQ9XCIke3RoaXMuX29uSW5wdXROZXcuYmluZCh0aGlzLCAna2V5Jyl9XCJcbiAgICAgICAgICAgICAgICAgIHZhbHVlPVwiJHt0aGlzLl9uZXdJdGVtLmtleX1cIlxuICAgICAgICAgICAgICAgID48L2d2LWlucHV0PlxuICAgICAgICAgICAgICAgIDxndi1pbnB1dFxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjb250cm9sXCJcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiJHtpMThuKCdndi1wcm9wZXJ0aWVzLnBsYWNlaG9sZGVyLnZhbHVlJyl9XCJcbiAgICAgICAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgICBAZ3YtaW5wdXQ6aW5wdXQ9XCIke3RoaXMuX29uSW5wdXROZXcuYmluZCh0aGlzLCAndmFsdWUnKX1cIlxuICAgICAgICAgICAgICAgICAgLnZhbHVlPVwiJHt0aGlzLl9uZXdJdGVtLnZhbHVlfVwiXG4gICAgICAgICAgICAgICAgPjwvZ3YtaW5wdXQ+XG4gICAgICAgICAgICAgICAgJHt0aGlzLmVuY3J5cHRhYmxlXG4gICAgICAgICAgICAgICAgICA/IGh0bWxgIDxndi1zd2l0Y2hcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249XCIke2kxOG4oJ2d2LXByb3BlcnRpZXMuZW5jcnlwdGVkLXRvZ2dsZScpfVwiXG4gICAgICAgICAgICAgICAgICAgICAgQGd2LXN3aXRjaDppbnB1dD1cIiR7dGhpcy5fb25JbnB1dE5ldy5iaW5kKHRoaXMsICdlbmNyeXB0YWJsZScpfVwiXG4gICAgICAgICAgICAgICAgICAgICAgLnZhbHVlPVwiJHt0aGlzLl9uZXdJdGVtLmVuY3J5cHRhYmxlfVwiXG4gICAgICAgICAgICAgICAgICAgID48L2d2LXN3aXRjaD5gXG4gICAgICAgICAgICAgICAgICA6ICcnfVxuICAgICAgICAgICAgICAgIDxndi1idXR0b25cbiAgICAgICAgICAgICAgICAgIGlkPVwiYWRkLXByb3BlcnR5XCJcbiAgICAgICAgICAgICAgICAgIGljb249XCJjb2RlOnBsdXNcIlxuICAgICAgICAgICAgICAgICAgb3V0bGluZWRcbiAgICAgICAgICAgICAgICAgIGRpc2FibGVkXG4gICAgICAgICAgICAgICAgICBAZ3YtYnV0dG9uOmNsaWNrPVwiJHt0aGlzLl9hZGRQcm9wZXJ0eS5iaW5kKHRoaXMsIHRoaXMuX25ld0l0ZW0pfVwiXG4gICAgICAgICAgICAgICAgICB0aXRsZT1cIiR7aTE4bignZ3YtcHJvcGVydGllcy5hZGQnKX1cIlxuICAgICAgICAgICAgICAgID48L2d2LWJ1dHRvbj5cbiAgICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgICAke3RoaXMuX3JlbmRlckVycm9ycygpfVxuICAgICAgICAgICAgICA8aHIgLz5gXG4gICAgICAgICAgOiAnJztcblxuICAgICAgcmV0dXJuIGh0bWxgICR7YWRkUHJvcGVydHlGb3JtfVxuICAgICAgICA8Z3YtdGFibGUgLm9wdGlvbnM9XCIke29wdGlvbnN9XCIgLml0ZW1zPVwiJHtwcm9wZXJ0aWVzfVwiIG5vaGVhZGVyIG5vc29ydCBvcmRlcj1cImtleVwiIHJvd2hlaWdodD1cIjU3cHhcIj48L2d2LXRhYmxlPmA7XG4gICAgfVxuICB9XG5cbiAgX29uQ2hhbmdlTW9kZSh7IGRldGFpbCB9KSB7XG4gICAgdGhpcy5fc3VibWl0RXhwZXJ0TW9kZSgpO1xuICAgIHRoaXMuZXhwZXJ0ID0gZGV0YWlsO1xuICAgIHRoaXMuX2Vycm9ycyA9IFtdO1xuICAgIHRoaXMuX25ld0l0ZW0gPSB7IGtleTogJycsIHZhbHVlOiAnJywgX25ldzogdHJ1ZSB9O1xuICAgIHRoaXMuX29uQ2xvc2VQcm9wZXJ0eVNjaGVtYUZvcm0oKTtcbiAgfVxuXG4gIF9vblBhZ2luYXRlKHsgZGV0YWlsIH0pIHtcbiAgICB0aGlzLl9wYWdpbmF0aW9uRGF0YS5jdXJyZW50X3BhZ2UgPSBkZXRhaWwucGFnZTtcbiAgICB0aGlzLl9vbkNsb3NlUHJvcGVydHlTY2hlbWFGb3JtKCk7XG4gICAgdGhpcy5yZXF1ZXN0VXBkYXRlKCk7XG4gIH1cblxuICB1cGRhdGVkKHByb3BzKSB7XG4gICAgaWYgKHByb3BzLmhhcygnX3Byb3BlcnRpZXMnKSB8fCBwcm9wcy5oYXMoJ19wYWdlU2l6ZScpKSB7XG4gICAgICB0aGlzLl9wYWdpbmF0aW9uRGF0YSA9IHtcbiAgICAgICAgZmlyc3Q6IDEsXG4gICAgICAgIGxhc3Q6IE1hdGguY2VpbCh0aGlzLl9wcm9wZXJ0aWVzLmxlbmd0aCAvIHRoaXMuX3BhZ2VTaXplKSxcbiAgICAgICAgdG90YWw6IHRoaXMuX3Byb3BlcnRpZXMubGVuZ3RoLFxuICAgICAgICBjdXJyZW50X3BhZ2U6IDEsXG4gICAgICAgIHRvdGFsX3BhZ2VzOiBNYXRoLmNlaWwodGhpcy5fcHJvcGVydGllcy5sZW5ndGggLyB0aGlzLl9wYWdlU2l6ZSksXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIF9vbkNoYW5nZVBhZ2VTaXplKHsgZGV0YWlsIH0pIHtcbiAgICB0aGlzLl9wYWdlU2l6ZSA9IE51bWJlcihkZXRhaWwpLnZhbHVlT2YoKTtcbiAgICB0aGlzLl9vbkNsb3NlUHJvcGVydHlTY2hlbWFGb3JtKCk7XG4gIH1cblxuICBfcmVuZGVyVGFibGVGb3JtKCkge1xuICAgIHJldHVybiBodG1sYDxkaXYgY2xhc3M9XCJjb250YWluZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+TWFuYWdlIGdsb2JhbCBwcm9wZXJ0aWVzIDxzcGFuPigke3RoaXMuX3Byb3BlcnRpZXMgPyB0aGlzLl9wcm9wZXJ0aWVzLmxlbmd0aCA6IDB9KTwvc3Bhbj48L2Rpdj5cbiAgICAgICAgPGd2LXN3aXRjaFxuICAgICAgICAgIHNtYWxsXG4gICAgICAgICAgLmRlc2NyaXB0aW9uPVwiJHt0aGlzLmV4cGVydCA/ICdFeHBlcnQnIDogJ1NpbXBsZSd9XCJcbiAgICAgICAgICAudmFsdWU9XCIke3RoaXMuZXhwZXJ0fVwiXG4gICAgICAgICAgQGd2LXN3aXRjaDppbnB1dD1cIiR7dGhpcy5fb25DaGFuZ2VNb2RlfVwiXG4gICAgICAgID48L2d2LXN3aXRjaD5cbiAgICAgICAgPGd2LWlucHV0XG4gICAgICAgICAgaWQ9XCJzZWFyY2gtcHJvcGVydHlcIlxuICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRmlsdGVyIHByb3BlcnRpZXMgKFNoaWZ0ICsgQ3RybCArIFNwYWNlKVwiXG4gICAgICAgICAgdHlwZT1cInNlYXJjaFwiXG4gICAgICAgICAgc21hbGxcbiAgICAgICAgICBjbGFzcz1cInNlYXJjaC1pbnB1dFwiXG4gICAgICAgICAgLmRpc2FibGVkPVwiJHt0aGlzLmV4cGVydH1cIlxuICAgICAgICAgIEBndi1pbnB1dDppbnB1dD1cIiR7dGhpcy5fb25TZWFyY2hQcm9wZXJ0eX1cIlxuICAgICAgICAgIEBndi1pbnB1dDpjbGVhcj1cIiR7dGhpcy5fb25DbGVhclByb3BlcnR5fVwiXG4gICAgICAgID48L2d2LWlucHV0PlxuICAgICAgICA8Z3Ytc2VsZWN0XG4gICAgICAgICAgY2xhc3M9XCJwYWdlLXNpemVfX3NlbGVjdFwiXG4gICAgICAgICAgQGd2LXNlbGVjdDppbnB1dD1cIiR7dGhpcy5fb25DaGFuZ2VQYWdlU2l6ZX1cIlxuICAgICAgICAgIHNtYWxsXG4gICAgICAgICAgLm9wdGlvbnM9XCIke3RoaXMuX3BhZ2VTaXplc31cIlxuICAgICAgICAgIC52YWx1ZT1cIiR7dGhpcy5fcGFnZVNpemV9XCJcbiAgICAgICAgICAuZGlzYWJsZWQ9XCIke3RoaXMuZXhwZXJ0IHx8IHRoaXMuX3BhZ2luYXRpb25EYXRhID09IG51bGx9XCJcbiAgICAgICAgPjwvZ3Ytc2VsZWN0PlxuICAgICAgICA8Z3YtcGFnaW5hdGlvblxuICAgICAgICAgIEBndi1wYWdpbmF0aW9uOnBhZ2luYXRlPVwiJHt0aGlzLl9vblBhZ2luYXRlfVwiXG4gICAgICAgICAgLmRpc2FibGVkPVwiJHt0aGlzLmV4cGVydCB8fCB0aGlzLl9wYWdpbmF0aW9uRGF0YSA9PSBudWxsfVwiXG4gICAgICAgICAgLmRhdGE9XCIke3RoaXMuX3BhZ2luYXRpb25EYXRhfVwiXG4gICAgICAgICAgd2lkZ2V0XG4gICAgICAgID48L2d2LXBhZ2luYXRpb24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50XCI+PGRpdiBjbGFzcz1cImZvcm0tY29udGVudFwiPiR7dGhpcy5fcmVuZGVyVGFibGUoKX08L2Rpdj48L2Rpdj5cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgX2ZldGNoRG9jdW1lbnRhdGlvbigpIHtcbiAgICB0aGlzLl9zaG93RG9jdW1lbnRhdGlvbiA9IHRydWU7XG4gIH1cblxuICBfaGlkZURvY3VtZW50YXRpb24oKSB7XG4gICAgdGhpcy5fc2hvd0RvY3VtZW50YXRpb24gPSBmYWxzZTtcbiAgfVxuXG4gIGdldCBkaXJ0eSgpIHtcbiAgICBjb25zdCBmb3JtID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ2d2LXNjaGVtYS1mb3JtJyk7XG4gICAgcmV0dXJuIGZvcm0gJiYgZm9ybS5kaXJ0eTtcbiAgfVxuXG4gIGNvbmZpcm0oKSB7XG4gICAgY29uc3QgZm9ybSA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdndi1zY2hlbWEtZm9ybScpO1xuICAgIGlmIChmb3JtKSB7XG4gICAgICByZXR1cm4gZm9ybS5jb25maXJtKCkudGhlbigoKSA9PiB0aGlzLl9vbkNsb3NlUHJvcGVydHlTY2hlbWFGb3JtKCkpO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICBfcmVuZGVyRm9ybSgpIHtcbiAgICByZXR1cm4gaHRtbGA8Z3Ytc2NoZW1hLWZvcm1cbiAgICAgIHNsb3Q9XCJ0b3BcIlxuICAgICAgc2Nyb2xsYWJsZVxuICAgICAgLnNjaGVtYT1cIiR7dGhpcy5fcHJvcGVydHlTY2hlbWFGb3JtfVwiXG4gICAgICAudmFsdWVzPVwiJHt0aGlzLnByb3ZpZGVyfVwiXG4gICAgICAuaWNvbj1cImRlc2lnbjplZGl0XCJcbiAgICAgIGhhcy1oZWFkZXJcbiAgICAgID9yZWFkb25seT1cIiR7dGhpcy5yZWFkb25seX1cIlxuICAgICAgQGd2LXNjaGVtYS1mb3JtOnN1Ym1pdD1cIiR7dGhpcy5fb25TdWJtaXRQcm9wZXJ0eUZvcm19XCJcbiAgICA+XG4gICAgICA8ZGl2IHNsb3Q9XCJ0aXRsZVwiIGNsYXNzPVwicHJvcGVydGllcy10aXRsZVwiPkNvbmZpZ3VyZSBkeW5hbWljIHByb3BlcnRpZXM8L2Rpdj5cbiAgICAgIDxndi1idXR0b25cbiAgICAgICAgc2xvdD1cImhlYWRlci1sZWZ0XCJcbiAgICAgICAgaWNvbj1cImdlbmVyYWw6Y2xvc2VcIlxuICAgICAgICBvdXRsaW5lZFxuICAgICAgICBzbWFsbFxuICAgICAgICBAZ3YtYnV0dG9uOmNsaWNrPVwiJHt0aGlzLl9vbkNsb3NlUHJvcGVydHlTY2hlbWFGb3JtfVwiXG4gICAgICAgIHRpdGxlPVwiQ2xvc2UgKGVzYylcIlxuICAgICAgPjwvZ3YtYnV0dG9uPlxuICAgICAgPGd2LWJ1dHRvblxuICAgICAgICBzbG90PVwiaGVhZGVyLWxlZnRcIlxuICAgICAgICBpY29uPVwiaG9tZTpib29rXCJcbiAgICAgICAgP2Rpc2FibGVkPVwiJHt0aGlzLl9zaG93RG9jdW1lbnRhdGlvbn1cIlxuICAgICAgICBvdXRsaW5lZFxuICAgICAgICBzbWFsbFxuICAgICAgICBAZ3YtYnV0dG9uOmNsaWNrPVwiJHt0aGlzLl9mZXRjaERvY3VtZW50YXRpb259XCJcbiAgICAgICAgdGl0bGU9XCJPcGVuIGRvY3VtZW50YXRpb25cIlxuICAgICAgPjwvZ3YtYnV0dG9uPlxuICAgIDwvZ3Ytc2NoZW1hLWZvcm0+YDtcbiAgfVxuXG4gIF9yZW5kZXJCb3R0b20oKSB7XG4gICAgaWYgKHRoaXMuX3Byb3BlcnR5U2NoZW1hRm9ybSAmJiB0aGlzLl9zaG93RG9jdW1lbnRhdGlvbikge1xuICAgICAgcmV0dXJuIGh0bWxgPGd2LXJlc2l6YWJsZS12aWV3cyBuby1vdmVyZmxvdyBkaXJlY3Rpb249XCJob3Jpem9udGFsXCI+XG4gICAgICAgICR7dGhpcy5fcmVuZGVyRm9ybSgpfVxuICAgICAgICA8Z3YtZG9jdW1lbnRhdGlvblxuICAgICAgICAgIHNsb3Q9XCJib3R0b21cIlxuICAgICAgICAgIC50ZXh0PVwiJHt0aGlzLl9wcm92aWRlckRvY3VtZW50YXRpb259XCJcbiAgICAgICAgICBAZ3YtZG9jdW1lbnRhdGlvbjpjbG9zZT1cIiR7dGhpcy5faGlkZURvY3VtZW50YXRpb259XCJcbiAgICAgICAgPjwvZ3YtZG9jdW1lbnRhdGlvbj5cbiAgICAgIDwvZ3YtcmVzaXphYmxlLXZpZXdzPmA7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9wcm9wZXJ0eVNjaGVtYUZvcm0pIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJGb3JtKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBodG1sYDxkaXYgY2xhc3M9XCJwcm9wZXJ0aWVzLWJvdHRvbS1jb250YWluZXJcIj4ke3RoaXMuX3JlbmRlckR5bmFtaWNDb25maWd1cmF0aW9uKCl9PC9kaXY+YDtcbiAgICB9XG4gIH1cblxuICBfcmVuZGVyRHluYW1pY0NvbmZpZ3VyYXRpb24oKSB7XG4gICAgY29uc3QgaGFzRHluYW1pY0NvbmZpZ3VyYXRpb24gPSB0aGlzLnByb3ZpZGVyICYmIHRoaXMucHJvdmlkZXIuZW5hYmxlZDtcblxuICAgIGxldCBjb25maWd1cmVBY3Rpb24gPSAnJztcbiAgICBpZiAoaGFzRHluYW1pY0NvbmZpZ3VyYXRpb24gfHwgdGhpcy5yZWFkb25seSAhPT0gdHJ1ZSkge1xuICAgICAgY29uZmlndXJlQWN0aW9uID0gaHRtbGA8Z3YtYnV0dG9uXG4gICAgICAgIGljb249XCJ0b29sczp0b29sc1wiXG4gICAgICAgIEBndi1idXR0b246Y2xpY2s9XCIke3RoaXMuX29uQ29uZmlndXJlRHluYW1pY1Byb3BlcnRpZXN9XCJcbiAgICAgICAgb3V0bGluZWRcbiAgICAgICAgLmRpc2FibGVkPVwiJHt0aGlzLmV4cGVydH1cIlxuICAgICAgICA+Q29uZmlndXJlIGR5bmFtaWMgcHJvcGVydGllczwvZ3YtYnV0dG9uXG4gICAgICA+YDtcbiAgICB9XG5cbiAgICBpZiAoaGFzRHluYW1pY0NvbmZpZ3VyYXRpb24pIHtcbiAgICAgIHJldHVybiBodG1sYDxkaXYgY2xhc3M9XCJwcm9wZXJ0aWVzLW1lc3NhZ2VcIj5cbiAgICAgICAgICBEeW5hbWljIHByb3BlcnRpZXMgc2VydmljZSBpcyBhY3R1YWxseSBpbiA8Y29kZT5ydW5uaW5nPC9jb2RlPiBzdGF0ZSBhbmQgcnVuIHdpdGggY3JvbiBleHByZXNzaW9uXG4gICAgICAgICAgPGNvZGU+JHt0aGlzLnByb3ZpZGVyLnNjaGVkdWxlfTwvY29kZT4gdXNpbmcgPGNvZGU+JHt0aGlzLnByb3ZpZGVyLnByb3ZpZGVyfTwvY29kZT4gcHJvdmlkZXIuXG4gICAgICAgIDwvZGl2PlxuICAgICAgICAke2NvbmZpZ3VyZUFjdGlvbn1gO1xuICAgIH0gZWxzZSBpZiAodGhpcy5yZWFkb25seSkge1xuICAgICAgcmV0dXJuIGh0bWxgPGRpdiBjbGFzcz1cImVtcHR5XCI+Tm8gZHluYW1pYyBwcm9wZXJ0aWVzIHNlcnZpY2UgY29uZmlndXJlZDwvZGl2PmA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjb25maWd1cmVBY3Rpb247XG4gICAgfVxuICB9XG5cbiAgX29uTW92ZSgpIHtcbiAgICB0aGlzLl9jb21wdXRlVGV4dFJvd3MoKTtcbiAgfVxuXG4gIF9jb21wdXRlVGV4dFJvd3MoKSB7XG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJy5jb250ZW50Jyk7XG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgY29uc3QgeyBoZWlnaHQgfSA9IHBhcmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIC8vIC0tZ3YtdGV4dC0tbGg9MzBweFxuICAgICAgdGhpcy5fdGV4dFJvd3MgPSBNYXRoLnJvdW5kKE1hdGgucm91bmQoaGVpZ2h0IC0gMjApIC8gMzApIC0gMjtcbiAgICB9XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgaWYgKHRoaXMucHJvdmlkZXJzICYmIHRoaXMucHJvdmlkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBodG1sYDxkaXYgY2xhc3M9XCJwcm9wZXJ0aWVzXCI+XG4gICAgICAgIDxndi1yZXNpemFibGUtdmlld3Mgbm8tb3ZlcmZsb3cgQGd2LXJlc2l6YWJsZS12aWV3czptb3ZlPVwiJHt0aGlzLl9vbk1vdmV9XCIgQGd2LXJlc2l6YWJsZS12aWV3czpyZXNpemU9XCIke3RoaXMuX29uTW92ZX1cIj5cbiAgICAgICAgICA8ZGl2IHNsb3Q9XCJ0b3BcIiBjbGFzcz1cImJveFwiPiR7dGhpcy5fcmVuZGVyVGFibGVGb3JtKCl9PC9kaXY+XG4gICAgICAgICAgPGRpdiBzbG90PVwiYm90dG9tXCI+JHt0aGlzLl9yZW5kZXJCb3R0b20oKX08L2Rpdj5cbiAgICAgICAgPC9ndi1yZXNpemFibGUtdmlld3M+XG4gICAgICA8L2Rpdj5gO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaHRtbGA8ZGl2IGNsYXNzPVwicHJvcGVydGllc1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtYm94XCI+JHt0aGlzLl9yZW5kZXJUYWJsZUZvcm0oKX08L2Rpdj5cbiAgICAgIDwvZGl2PmA7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldCBzdHlsZXMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGVtcHR5LFxuICAgICAgLy8gbGFuZ3VhZ2U9Q1NTXG4gICAgICBjc3NgXG4gICAgICAgIDpob3N0IHtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgfVxuXG4gICAgICAgIC5wcm9wZXJ0aWVzIHtcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgfVxuXG4gICAgICAgIGd2LXJlc2l6YWJsZS12aWV3cyB7XG4gICAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICB9XG5cbiAgICAgICAgZ3Ytc2NoZW1hLWZvcm0ge1xuICAgICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC50YWJsZS1ib3gge1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2JmYmZiZjtcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgZ3YtdGFibGUge1xuICAgICAgICAgIGhlaWdodDogYXV0bztcbiAgICAgICAgICBmbGV4OiAxO1xuICAgICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XG4gICAgICAgICAgbWFyZ2luLXJpZ2h0OiA1MHB4O1xuICAgICAgICAgIC0tZ3YtdGFibGUtcm93cy0tb3Y6IG5vbmU7XG4gICAgICAgICAgLS1ndi10YWJsZS0tY29sbWc6IHZhcigtLWd2LXByb3BlcnRpZXMtdGFibGUtLWNvbG1nLCAwLjJyZW0pO1xuICAgICAgICAgIC0tZ3YtdGFibGUtY2VsbC0tZDogaW5saW5lO1xuICAgICAgICAgIC0tZ3YtdGFibGUtcm93LS1haTogZmxleC1zdGFydDtcbiAgICAgICAgICAtLWd2LXRhYmxlLXJvdy0tYWM6IGZsZXgtc3RhcnQ7XG4gICAgICAgICAgLS1ndi10YWJsZS1ob3Zlci0tYmdjOiB2YXIoLS1ndi10aGVtZS1uZXV0cmFsLWNvbG9yLWxpZ2h0ZXN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5wcm9wZXJ0aWVzLXRpdGxlIHtcbiAgICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjJyZW07XG4gICAgICAgIH1cblxuICAgICAgICAucHJvcGVydGllcy1ib3R0b20tY29udGFpbmVyIHtcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIH1cblxuICAgICAgICAuaGVhZGVyIHtcbiAgICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2Q5ZDlkOTtcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIG1pbi1oZWlnaHQ6IDQ1cHg7XG4gICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgICBtYXJnaW4tYm90dG9tOiAwLjVyZW07XG4gICAgICAgICAgcGFkZGluZzogMCAwLjVyZW07XG4gICAgICAgIH1cblxuICAgICAgICAuaGVhZGVyIC50aXRsZSB7XG4gICAgICAgICAgY29sb3I6ICMyODQ0NGY7XG4gICAgICAgICAgZm9udC1zaXplOiAxOHB4O1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtZW5kO1xuICAgICAgICAgIGZsZXg6IDE7XG4gICAgICAgIH1cblxuICAgICAgICAuaGVhZGVyIC50aXRsZSBzcGFuIHtcbiAgICAgICAgICBmb250LXNpemU6IDEycHg7XG4gICAgICAgICAgbWFyZ2luLWxlZnQ6IDhweDtcbiAgICAgICAgICBvcGFjaXR5OiAwLjc7XG4gICAgICAgIH1cblxuICAgICAgICAuYm94IHtcbiAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgIHRvcDogMDtcbiAgICAgICAgICBib3R0b206IDA7XG4gICAgICAgICAgbGVmdDogMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5jb250YWluZXIge1xuICAgICAgICAgIGZsZXgtZ3JvdzogMTtcblxuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblxuICAgICAgICAgIC8qIGZvciBGaXJlZm94ICovXG4gICAgICAgICAgbWluLWhlaWdodDogMDtcbiAgICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIH1cblxuICAgICAgICAuY29udGVudCB7XG4gICAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7XG4gICAgICAgICAgZmxleC1ncm93OiAxO1xuXG4gICAgICAgICAgb3ZlcmZsb3c6IGF1dG87XG5cbiAgICAgICAgICAvKiBmb3IgRmlyZWZveCAqL1xuICAgICAgICAgIG1pbi1oZWlnaHQ6IDA7XG4gICAgICAgICAgcGFkZGluZzogMC41cmVtO1xuXG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIH1cblxuICAgICAgICBndi10ZXh0IHtcbiAgICAgICAgICAtLWd2LXRleHQtLWZ6OiAyMHB4O1xuICAgICAgICAgIC0tZ3YtdGV4dC0tbGg6IDI1cHg7XG4gICAgICAgIH1cblxuICAgICAgICBndi1zd2l0Y2gge1xuICAgICAgICAgIC0tZ3Ytc3dpdGNoLS10YTogcmlnaHQ7XG4gICAgICAgIH1cblxuICAgICAgICAuaGVhZGVyIGd2LWlucHV0IHtcbiAgICAgICAgICBtYXJnaW46IDAgMXJlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5hZGQtZm9ybSxcbiAgICAgICAgLmFkZC1mb3JtLWVycm9yIHtcbiAgICAgICAgICBkaXNwbGF5OiBncmlkO1xuICAgICAgICAgIG1hcmdpbjogYXV0byA1MHB4IGF1dG8gMDtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICB9XG5cbiAgICAgICAgLmFkZC1mb3JtIHtcbiAgICAgICAgICBjb2x1bW4tZ2FwOiB2YXIoLS1ndi1wcm9wZXJ0aWVzLXRhYmxlLS1jb2xtZywgMC4ycmVtKTtcbiAgICAgICAgICBib3JkZXItcmlnaHQ6IHNvbGlkIHRoaWNrIHRyYW5zcGFyZW50O1xuICAgICAgICAgIGhlaWdodDogNTBweDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5hZGQtZm9ybSBndi1pbnB1dCxcbiAgICAgICAgZ3YtYnV0dG9uLFxuICAgICAgICBndi1zd2l0Y2gge1xuICAgICAgICAgIG1hcmdpbjogYXV0byAwO1xuICAgICAgICB9XG5cbiAgICAgICAgLmFkZC1mb3JtIGd2LXN3aXRjaCB7XG4gICAgICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgICB9XG5cbiAgICAgICAgLmFkZC1mb3JtLWdyaWQge1xuICAgICAgICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogNDBweCBhdXRvIGF1dG8gNDBweDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5hZGQtZm9ybS1ncmlkLXdpdGgtZW5jcnlwdGVkLXRvZ2dsZSB7XG4gICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiA0MHB4IGF1dG8gYXV0byAxMDVweCA0MHB4O1xuICAgICAgICB9XG5cbiAgICAgICAgLmFkZC1mb3JtLWVycm9yX2V4cGVydCB7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5hZGQtZm9ybS1lcnJvciB7XG4gICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiA0MHB4IDFmcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvZGUge1xuICAgICAgICAgIGNvbG9yOiB2YXIoLS1ndi10aGVtZS1jb2xvci13YXJuaW5nLWRhcmssICNmNTdjMDApO1xuICAgICAgICB9XG5cbiAgICAgICAgLmZvcm0tY29udGVudCB7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICB9XG5cbiAgICAgICAgLnByb3BlcnRpZXMtbWVzc2FnZSB7XG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMC41cmVtO1xuICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5wYWdlLXNpemVfX3NlbGVjdCB7XG4gICAgICAgICAgbWF4LXdpZHRoOiA1MHB4O1xuICAgICAgICB9XG5cbiAgICAgICAgLnNlYXJjaC1pbnB1dCB7XG4gICAgICAgICAgd2lkdGg6IDMwMHB4O1xuICAgICAgICB9XG5cbiAgICAgICAgaHIge1xuICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWd2LXRoZW1lLW5ldXRyYWwtY29sb3IpO1xuICAgICAgICAgIGJvcmRlcjogMDtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICBoZWlnaHQ6IDJweDtcbiAgICAgICAgfVxuICAgICAgYCxcbiAgICBdO1xuICB9XG59XG5cbndpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ2d2LXByb3BlcnRpZXMnLCBHdlByb3BlcnRpZXMpO1xuIl19
1
+ Object.defineProperty(exports,"__esModule",{value:!0}),exports.GvProperties=void 0;const e=require("lit");require("./gv-schema-form"),require("./gv-resizable-views"),require("../molecules/gv-table"),require("../atoms/gv-button"),require("../atoms/gv-input"),require("../atoms/gv-icon"),require("../atoms/gv-text"),require("../atoms/gv-input-message"),require("../atoms/gv-select");const t=require("../lib/events"),i=require("../lib/properties"),r=require("../lib/i18n"),o=require("lit/directives/class-map"),s=require("../mixins/keyboard-element"),n=require("../styles/empty");class a extends((0,s.KeyboardElement)(e.LitElement)){static get properties(){return{dynamicPropertySchema:{type:Object},properties:{type:Array},_properties:{type:Array,attribute:!1},provider:{type:Object},providers:{type:Array},_propertySchemaForm:{type:Object,attribute:!1},expert:{type:Boolean},_formattedErrors:{type:Array,attributes:!1},_filter:{type:String},_paginationData:{type:Object,attribute:!1},_pageSize:{type:Number,attribute:!1},_newItem:{type:Object,attribute:!1},_providerDocumentation:{type:Boolean,attribute:!1},_showDocumentation:{type:Boolean,attribute:!1},_textRows:{type:Number,attribute:!1},readonly:{type:Boolean,reflect:!0},encryptable:{type:Boolean,reflect:!0}}}constructor(){super(),this.properties=[],this.types=[],this.provider={},this._currentResource=null,this._formattedErrors=[],this._showDocumentation=!0,this._newItem={key:"",value:"",_new:!0},this._pageSize=10,this._textRows=10,this._pageSizes=[5,10,25,50,100],this._errors=[]}onKeyboard(){if(this.isPressed(s.KEYS.Esc)&&this._onClosePropertySchemaForm(),this.isPressed(s.KEYS.Shift,s.KEYS.Ctrl,s.KEYS.Space)){const e=this.shadowRoot.querySelector("#search-property");e&&e.focus()}}set properties(e){this._properties=e.sort(((e,t)=>e.key.localeCompare(t.key))).map((e=>(e.encrypted&&(e.encryptable=!0),e)))}get properties(){return this._properties}_getResizableViews(){return this.shadowRoot.querySelector("gv-resizable-views")}_maximizeTopView(){const e=this._getResizableViews();e&&e.maximizeTop(95,5)}_maximizeBottomView(){const e=this._getResizableViews();e&&e.resize(30,70)}_splitMainViews(){const e=this._getResizableViews();e&&e.split()}_isNewLineTable(e){return!0===e._new}_onInputNew(e,t){const r=t.target;this._newItem[e]=t.detail;const{errors:o}=(0,i.parseRaw)((0,i.toNameEqualsValueString)([...this.properties,this._newItem]));this._errors=o,setTimeout((()=>{const t=this.shadowRoot.querySelector("gv-button#add-property");o.length>0||this._disabledNewLine(this._newItem)?t.setAttribute("disabled",!0):t.removeAttribute("disabled"),"key"===e&&(0===o.length?(r.removeAttribute("invalid"),r.setAttribute("valid",!0)):(r.removeAttribute("valid"),r.setAttribute("invalid",!0)))}),0)}_onInput(){(0,t.dispatchCustomEvent)(this,"change",{properties:this.properties})}_onSwitchEncrypted(e){!0===e.encrypted&&(e.value="",e.encrypted=!1,e.encryptionWarning=(0,r.i18n)("gv-properties.infos.overwrite-encryption"),this.requestUpdate()),(0,t.dispatchCustomEvent)(this,"switch-encrypted",{properties:this.properties})}_addProperty(e){delete e._new,this.properties=[e,...this._properties],this._newItem={key:"",value:"",_new:!0,encryptable:!1,encrypted:!1},(0,t.dispatchCustomEvent)(this,"change",{properties:this.properties})}_removeProperty(e){this._properties=this._properties.filter((t=>t.key!==e.key)),(0,t.dispatchCustomEvent)(this,"change",{properties:this.properties})}_disabledNewLine(e){return null==e.key||null==e.value||""===e.key.trim()||""===e.value.trim()}_submitExpertMode(){this.expert&&(this.properties=this._handleExpertModeInput(this.shadowRoot.querySelector("#expert-input").value))}_onExpertModeTextInput({detail:e}){this._handleExpertModeInput(e)}_handleExpertModeInput(e){let r=this._properties;const o=this.provider&&this.provider.enabled,s=r.filter((e=>o&&e.dynamic)),n=r.filter((e=>e.encrypted)),a=`${e}\n${(0,i.toNameEqualsValueString)(s)}\n${(0,i.toNameEqualsValueString)(n)}`,{errors:p}=(0,i.parseRaw)(a);if(this._errors=p,0===p.length){const{variables:o}=(0,i.parseRaw)(e);r=[...o,...s,...n],(0,t.dispatchCustomEvent)(this,"change",{properties:r})}return r}_onSubmitPropertyForm({detail:e}){const i=e.values;(0,t.dispatchCustomEvent)(this,"save-provider",{provider:i}),this.requestUpdate()}submit(){this.expert?this._submitExpertMode():this._onSubmit()}_onSubmit(){null==[...this.shadowRoot.querySelectorAll("form .control")].find((e=>e.invalid))&&this._addProperty(this._newItem)}_onConfigureDynamicProperties(){if(null==this.dynamicPropertySchema){const e=this.providers.reduce(((e,t)=>(e[t.id]=t.key,e)),{}),t=Object.keys(e);this.dynamicPropertySchema={properties:{enabled:{type:"boolean",title:"Enabled",description:" This service is requiring an API deployment. Do not forget to deploy API to start dynamic-properties service."},schedule:{type:"string",title:"Schedule","x-schema-form":{"cron-expression":!0}},provider:{type:"string",title:"Provider type",enum:t,default:t[0],"x-schema-form":{titleMap:e}}},required:["schedule","provider"]}}const e=this.providers[0];this._propertySchemaForm={properties:{...this.dynamicPropertySchema.properties,configuration:e.schema},required:this.dynamicPropertySchema.required},this._providerDocumentation=e.documentation,this._maximizeBottomView()}_onClosePropertySchemaForm(){this._propertySchemaForm=null,this._maximizeTopView()}_onSearchProperty({detail:e}){this._filter=e,this._onClosePropertySchemaForm()}_onClearProperty(){this._filter=null,this._onClosePropertySchemaForm()}get _errors(){return this._formattedErrors}set _errors(e){this._formattedErrors=e.map((({type:e,key:t,pos:o})=>e===i.ERROR_TYPES.INVALID_NAME?{line:o.line,msg:(0,r.i18n)("gv-properties.errors.invalid-key",{key:t})}:e===i.ERROR_TYPES.DUPLICATED_NAME?{line:o.line,msg:(0,r.i18n)("gv-properties.errors.duplicated-key",{key:t})}:e===i.ERROR_TYPES.INVALID_LINE?{line:o.line,msg:(0,r.i18n)("gv-properties.errors.invalid-line")}:e===i.ERROR_TYPES.INVALID_VALUE?{line:o.line,msg:(0,r.i18n)("gv-properties.errors.invalid-value")}:{line:"?",msg:(0,r.i18n)("gv-properties.errors.unknown")}))}_renderErrors(t=!1){return this._formattedErrors.length>0?e.html`<div class="${(0,o.classMap)({"add-form-error":!0,"add-form-error_expert":this.expert})}"><div></div><div class="error-list">${this._formattedErrors.map((({line:i,msg:o})=>e.html`<gv-input-message>${t?e.html`<strong .innerHTML="${(0,r.i18n)("gv-properties.errors.line")} ${i}: "></strong>`:""} <span .innerHTML="${o}"></span></gv-input-message>`))}</div></div>`:e.html``}_renderTable(){const t=this.provider&&this.provider.enabled;if(this.expert){this._computeTextRows();const i=(t?this._properties.filter((e=>!(t&&e.dynamic))):this._properties).filter((e=>!e.encrypted)).map((e=>`${e.key}="${e.value}"`)).join("\n");return e.html`<gv-text id="expert-input" placeholder="${(0,r.i18n)("gv-properties.placeholder.input")}" @gv-text:input="${this._onExpertModeTextInput}" .value="${i}" ?readonly="${this.readonly}" .rows="${this._textRows}"></gv-text>${this._renderErrors(!0)}`}{const i={data:[{field:"dynamic",label:"Dynamic",width:"40px",type:e=>e.dynamic&&t?"gv-icon":"div",attributes:{shape:e=>e.dynamic&&t?"code:time-schedule":"",title:e=>e.dynamic&&t?"Dynamic properties service is actually in running":"",style:"justify-content: center; align-items: center; height: 100%;"}},{field:"key",label:"Key",type:"gv-input",attributes:{clipboard:!0,placeholder:(0,r.i18n)("gv-properties.placeholder.key"),name:"key",required:!0,readonly:this.readonly}},{field:"value",label:"Value",type:"gv-input",attributes:{name:"value",placeholder:"Property value",required:!0,readonly:this.readonly,disabled:e=>e.dynamic&&t||e.encrypted,type:e=>e.encrypted?"password":"text",title:e=>e.encrypted?(0,r.i18n)("gv-properties.infos.encrypted-value"):"",description:e=>e.encryptionWarning,icon:null,"ongv-input:input":this._onInput.bind(this)}}]};!0===this.encryptable&&i.data.push({field:"encryptable",type:"gv-switch",style:"--gv-switch--ta: right;",width:"105px",attributes:{description:(0,r.i18n)("gv-properties.encrypted-toggle"),required:!0,readonly:this.readonly,disabled:e=>e.dynamic&&t,"ongv-switch:input":this._onSwitchEncrypted.bind(this),style:"display: inline-flex; font-size: 12px; height: 40px;"}}),!0!==this.readonly&&i.data.push({type:"gv-button",width:"40px",attributes:{"ongv-button:click":(e,t,i)=>this._removeProperty(e,i),title:"Remove",disabled:e=>e.dynamic&&t,danger:!0,outlined:!0,icon:"home:trash"}});const o=null!=this._filter?this._properties.filter((e=>(e.key.toLowerCase()+e.value.toLowerCase()).includes(this._filter))):this._properties;let s=[...o];if(this._paginationData){this._paginationData.last=Math.ceil(o.length/this._pageSize),this._paginationData.total=o.length,this._paginationData.total_pages=Math.ceil(o.length/this._pageSize);const e=(this._paginationData.current_page-1)*this._pageSize;s=[...o].splice(e,this._pageSize)}const n=this.encryptable?"add-form-grid-with-encrypted-toggle":"add-form-grid",a=!0!==this.readonly?e.html`<form id="add-property-form" class="add-form ${n}" @submit="${this._onSubmit}"><div></div><gv-input class="control" placeholder="${(0,r.i18n)("gv-properties.placeholder.key")}" required @gv-input:input="${this._onInputNew.bind(this,"key")}" value="${this._newItem.key}"></gv-input><gv-input class="control" placeholder="${(0,r.i18n)("gv-properties.placeholder.value")}" required @gv-input:input="${this._onInputNew.bind(this,"value")}" .value="${this._newItem.value}"></gv-input>${this.encryptable?e.html`<gv-switch class="control" required description="${(0,r.i18n)("gv-properties.encrypted-toggle")}" @gv-switch:input="${this._onInputNew.bind(this,"encryptable")}" .value="${this._newItem.encryptable}"></gv-switch>`:""}<gv-button id="add-property" icon="code:plus" outlined disabled="disabled" @gv-button:click="${this._addProperty.bind(this,this._newItem)}" title="${(0,r.i18n)("gv-properties.add")}"></gv-button></form>${this._renderErrors()}<hr>`:"";return e.html`${a}<gv-table .options="${i}" .items="${s}" noheader nosort order="key" rowheight="57px"></gv-table>`}}_onChangeMode({detail:e}){this._submitExpertMode(),this.expert=e,this._errors=[],this._newItem={key:"",value:"",_new:!0},this._onClosePropertySchemaForm()}_onPaginate({detail:e}){this._paginationData.current_page=e.page,this._onClosePropertySchemaForm(),this.requestUpdate()}updated(e){(e.has("_properties")||e.has("_pageSize"))&&(this._paginationData={first:1,last:Math.ceil(this._properties.length/this._pageSize),total:this._properties.length,current_page:1,total_pages:Math.ceil(this._properties.length/this._pageSize)})}_onChangePageSize({detail:e}){this._pageSize=Number(e).valueOf(),this._onClosePropertySchemaForm()}_renderTableForm(){return e.html`<div class="container"><div class="header"><div class="title">Manage global properties <span>(${this._properties?this._properties.length:0})</span></div><gv-switch small .description="${this.expert?"Expert":"Simple"}" .value="${this.expert}" @gv-switch:input="${this._onChangeMode}"></gv-switch><gv-input id="search-property" placeholder="Filter properties (Shift + Ctrl + Space)" type="search" small class="search-input" .disabled="${this.expert}" @gv-input:input="${this._onSearchProperty}" @gv-input:clear="${this._onClearProperty}"></gv-input><gv-select class="page-size__select" @gv-select:input="${this._onChangePageSize}" small .options="${this._pageSizes}" .value="${this._pageSize}" .disabled="${this.expert||null==this._paginationData}"></gv-select><gv-pagination @gv-pagination:paginate="${this._onPaginate}" .disabled="${this.expert||null==this._paginationData}" .data="${this._paginationData}" widget></gv-pagination></div><div class="content"><div class="form-content">${this._renderTable()}</div></div></div>`}_fetchDocumentation(){this._showDocumentation=!0}_hideDocumentation(){this._showDocumentation=!1}get dirty(){const e=this.shadowRoot.querySelector("gv-schema-form");return e&&e.dirty}confirm(){const e=this.shadowRoot.querySelector("gv-schema-form");return e?e.confirm().then((()=>this._onClosePropertySchemaForm())):Promise.resolve()}_renderForm(){return e.html`<gv-schema-form slot="top" scrollable .schema="${this._propertySchemaForm}" .values="${this.provider}" .icon="design:edit" has-header ?readonly="${this.readonly}" @gv-schema-form:submit="${this._onSubmitPropertyForm}"><div slot="title" class="properties-title">Configure dynamic properties</div><gv-button slot="header-left" icon="general:close" outlined small @gv-button:click="${this._onClosePropertySchemaForm}" title="Close (esc)"></gv-button><gv-button slot="header-left" icon="home:book" ?disabled="${this._showDocumentation}" outlined small @gv-button:click="${this._fetchDocumentation}" title="Open documentation"></gv-button></gv-schema-form>`}_renderBottom(){return this._propertySchemaForm&&this._showDocumentation?e.html`<gv-resizable-views no-overflow direction="horizontal">${this._renderForm()}<gv-documentation slot="bottom" .text="${this._providerDocumentation}" @gv-documentation:close="${this._hideDocumentation}"></gv-documentation></gv-resizable-views>`:this._propertySchemaForm?this._renderForm():e.html`<div class="properties-bottom-container">${this._renderDynamicConfiguration()}</div>`}_renderDynamicConfiguration(){const t=this.provider&&this.provider.enabled;let i="";return(t||!0!==this.readonly)&&(i=e.html`<gv-button icon="tools:tools" @gv-button:click="${this._onConfigureDynamicProperties}" outlined .disabled="${this.expert}">Configure dynamic properties</gv-button>`),t?e.html`<div class="properties-message">Dynamic properties service is actually in <code>running</code> state and run with cron expression <code>${this.provider.schedule}</code> using <code>${this.provider.provider}</code> provider.</div>${i}`:this.readonly?e.html`<div class="empty">No dynamic properties service configured</div>`:i}_onMove(){this._computeTextRows()}_computeTextRows(){const e=this.shadowRoot.querySelector(".content");if(e){const{height:t}=e.getBoundingClientRect();this._textRows=Math.round(Math.round(t-20)/30)-2}}render(){return this.providers&&this.providers.length>0?e.html`<div class="properties"><gv-resizable-views no-overflow @gv-resizable-views:move="${this._onMove}" @gv-resizable-views:resize="${this._onMove}"><div slot="top" class="box">${this._renderTableForm()}</div><div slot="bottom">${this._renderBottom()}</div></gv-resizable-views></div>`:e.html`<div class="properties"><div class="table-box">${this._renderTableForm()}</div></div>`}static get styles(){return[n.empty,e.css`:host{box-sizing:border-box;height:100%;width:100%;display:block}.properties{display:flex;height:100%;width:100%}gv-resizable-views{height:100%;width:100%}gv-schema-form{margin:0}.table-box{width:100%;border-left:1px solid #bfbfbf;display:flex}gv-table{height:auto;flex:1;margin-top:10px;margin-right:50px;--gv-table-rows--ov:none;--gv-table--colmg:var(--gv-properties-table--colmg, 0.2rem);--gv-table-cell--d:inline;--gv-table-row--ai:flex-start;--gv-table-row--ac:flex-start;--gv-table-hover--bgc:var(--gv-theme-neutral-color-lightest)}.properties-title{text-transform:uppercase;letter-spacing:.2rem}.properties-bottom-container{display:flex;justify-content:center;align-items:center;height:100%;flex-direction:column}.header{border-bottom:1px solid #d9d9d9;display:flex;min-height:45px;align-items:center;margin-bottom:.5rem;padding:0 .5rem}.header .title{color:#28444f;font-size:18px;display:flex;align-items:flex-end;flex:1}.header .title span{font-size:12px;margin-left:8px;opacity:.7}.box{position:absolute;display:flex;flex-direction:column;width:100%;top:0;bottom:0;left:0}.container{flex-grow:1;display:flex;flex-direction:column;min-height:0;height:100%}.content{background:#fff;flex-grow:1;overflow:auto;min-height:0;padding:.5rem;display:flex;flex-direction:column;align-items:center}gv-text{--gv-text--fz:20px;--gv-text--lh:25px}gv-switch{--gv-switch--ta:right}.header gv-input{margin:0 1rem}.add-form,.add-form-error{display:grid;margin:auto 50px auto 0;box-sizing:border-box}.add-form{column-gap:var(--gv-properties-table--colmg,.2rem);border-right:solid thick transparent;height:50px}.add-form gv-input,gv-button,gv-switch{margin:auto 0}.add-form gv-switch{font-size:12px}.add-form-grid{grid-template-columns:40px auto auto 40px}.add-form-grid-with-encrypted-toggle{grid-template-columns:40px auto auto 105px 40px}.add-form-error_expert{display:flex}.add-form-error{grid-template-columns:40px 1fr}code{color:var(--gv-theme-color-warning-dark,#f57c00)}.form-content{display:flex;flex-direction:column;width:100%}.properties-message{margin-bottom:.5rem;font-size:14px}.page-size__select{max-width:50px}.search-input{width:300px}hr{background-color:var(--gv-theme-neutral-color);border:0;width:100%;height:2px}`]}}exports.GvProperties=a,window.customElements.define("gv-properties",a);