@gravitee/ui-components 3.24.3-migrate-codemirror-f56ff96 → 3.24.4

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 (114) hide show
  1. package/assets/css/codemirror/all.css +476 -0
  2. package/package.json +2 -17
  3. package/src/atoms/gv-autocomplete.js +132 -156
  4. package/src/atoms/gv-button.js +73 -256
  5. package/src/atoms/gv-checkbox.js +45 -103
  6. package/src/atoms/gv-date-picker-calendar.js +312 -393
  7. package/src/atoms/gv-date-picker-cell.js +57 -81
  8. package/src/atoms/gv-date-picker.js +180 -319
  9. package/src/atoms/gv-file-upload.js +85 -195
  10. package/src/atoms/gv-icon.js +13 -34
  11. package/src/atoms/gv-image.js +31 -66
  12. package/src/atoms/gv-input-message.js +12 -37
  13. package/src/atoms/gv-input.js +120 -144
  14. package/src/atoms/gv-link.js +47 -125
  15. package/src/atoms/gv-message.js +18 -69
  16. package/src/atoms/gv-metric.js +19 -68
  17. package/src/atoms/gv-relative-time.js +67 -38
  18. package/src/atoms/gv-select-native.js +96 -215
  19. package/src/atoms/gv-select.js +110 -230
  20. package/src/atoms/gv-spinner.js +5 -26
  21. package/src/atoms/gv-state.js +25 -66
  22. package/src/atoms/gv-switch.js +40 -160
  23. package/src/atoms/gv-tag.js +26 -78
  24. package/src/atoms/gv-text.js +22 -83
  25. package/src/charts/gv-chart-bar.js +22 -18
  26. package/src/charts/gv-chart-gauge.js +28 -31
  27. package/src/charts/gv-chart-histogram.js +18 -10
  28. package/src/charts/gv-chart-line.js +70 -59
  29. package/src/charts/gv-chart-map.js +44 -42
  30. package/src/charts/gv-chart-pie.js +18 -14
  31. package/src/index.js +2 -0
  32. package/src/lib/cron-expression.js +40 -35
  33. package/src/lib/date.js +10 -1
  34. package/src/lib/events.js +3 -1
  35. package/src/lib/http-client-schema-form.js +13 -12
  36. package/src/lib/http.js +57 -56
  37. package/src/lib/i18n.js +30 -22
  38. package/src/lib/item.js +13 -12
  39. package/src/lib/properties.js +77 -42
  40. package/src/lib/schema-form.js +4 -5
  41. package/src/lib/studio.js +13 -60
  42. package/src/lib/style.js +8 -8
  43. package/src/lib/text-format.js +14 -7
  44. package/src/lib/theme.js +8 -5
  45. package/src/lib/utils.js +17 -18
  46. package/src/mixins/chart-element.js +31 -54
  47. package/src/mixins/input-element.js +59 -44
  48. package/src/mixins/item-resource.js +34 -32
  49. package/src/mixins/keyboard-element.js +6 -5
  50. package/src/mixins/update-after-browser.js +4 -1
  51. package/src/mixins/with-resize-observer.js +23 -13
  52. package/src/mixins/with-skeleton-attribute.js +54 -48
  53. package/src/molecules/gv-card-full.js +26 -147
  54. package/src/molecules/gv-card-list.js +13 -42
  55. package/src/molecules/gv-card.js +17 -91
  56. package/src/molecules/gv-category-list.js +6 -17
  57. package/src/molecules/gv-category.js +23 -103
  58. package/src/molecules/gv-code-hint.js +49 -0
  59. package/src/molecules/gv-code.js +185 -392
  60. package/src/molecules/gv-confirm.js +41 -71
  61. package/src/molecules/gv-cron-editor.js +143 -389
  62. package/src/molecules/gv-dropdown-menu.js +14 -46
  63. package/src/molecules/gv-expandable.js +31 -59
  64. package/src/molecules/gv-expression-language.js +591 -7
  65. package/src/molecules/gv-identity-picture.js +42 -65
  66. package/src/molecules/gv-list.js +42 -134
  67. package/src/molecules/gv-metrics.js +37 -49
  68. package/src/molecules/gv-modal.js +28 -95
  69. package/src/molecules/gv-nav.js +49 -75
  70. package/src/molecules/gv-option.js +57 -130
  71. package/src/molecules/gv-plans.js +86 -209
  72. package/src/molecules/gv-popover.js +57 -177
  73. package/src/molecules/gv-promote.js +28 -146
  74. package/src/molecules/gv-rating-list.js +69 -195
  75. package/src/molecules/gv-rating.js +52 -105
  76. package/src/molecules/gv-row-expandable.js +5 -11
  77. package/src/molecules/gv-row.js +21 -147
  78. package/src/molecules/gv-stats.js +23 -48
  79. package/src/molecules/gv-stepper.js +43 -187
  80. package/src/molecules/gv-table.js +199 -309
  81. package/src/molecules/gv-tree.js +33 -156
  82. package/src/organisms/gv-documentation.js +44 -127
  83. package/src/organisms/gv-header.js +37 -195
  84. package/src/organisms/gv-http-client.js +32 -168
  85. package/src/organisms/gv-menu.js +37 -158
  86. package/src/organisms/gv-newsletter-subscription.js +48 -189
  87. package/src/organisms/gv-pagination.js +49 -77
  88. package/src/organisms/gv-properties.js +271 -492
  89. package/src/organisms/gv-resizable-views.js +41 -259
  90. package/src/organisms/gv-resources.js +168 -275
  91. package/src/organisms/gv-schema-form-array.js +49 -159
  92. package/src/organisms/gv-schema-form-control-object.js +59 -73
  93. package/src/organisms/gv-schema-form-control.js +107 -134
  94. package/src/organisms/gv-schema-form.js +195 -280
  95. package/src/organisms/gv-tabs.js +66 -98
  96. package/src/organisms/gv-user-menu.js +36 -201
  97. package/src/organisms/gv-vertical-menu.js +20 -61
  98. package/src/policy-studio/gv-flow-step.js +105 -245
  99. package/src/policy-studio/gv-flow.js +125 -304
  100. package/src/policy-studio/gv-policy-studio-menu.js +157 -471
  101. package/src/policy-studio/gv-policy-studio.js +688 -761
  102. package/src/styles/empty.js +3 -20
  103. package/src/styles/input.js +3 -245
  104. package/src/styles/link.js +3 -16
  105. package/src/styles/shapes.js +1 -0
  106. package/src/styles/skeleton.js +3 -37
  107. package/src/styles/zoom.js +3 -24
  108. package/src/theme/gv-theme.js +21 -60
  109. package/wc/gv-code-hint.js +1 -0
  110. package/CHANGELOG.md +0 -1244
  111. package/LICENSE.txt +0 -202
  112. package/README.md +0 -195
  113. package/src/.eslintrc.js +0 -19
  114. package/src/theme/definition.json +0 -1762
@@ -22,7 +22,6 @@ import { repeat } from 'lit/directives/repeat';
22
22
  import { Validator } from 'jsonschema';
23
23
  import { empty } from '../styles/empty';
24
24
  import './gv-schema-form-control';
25
-
26
25
  /**
27
26
  * Schema form component
28
27
  *
@@ -41,25 +40,67 @@ import './gv-schema-form-control';
41
40
  * @cssprop {Color} [--gv-schema-form--bgc=#ffffff] - Background color
42
41
  * @cssprop {Length} [--gv-schema-form-control--m=0.4rem] - Control margin
43
42
  */
43
+
44
44
  export class GvSchemaForm extends LitElement {
45
45
  static get properties() {
46
46
  return {
47
- schema: { type: Object },
48
- errors: { type: Object },
49
- values: { type: Object },
50
- submitLabel: { type: String },
51
- hasFooter: { type: Boolean, attribute: 'has-footer' },
52
- hasHeader: { type: Boolean, attribute: 'has-header' },
53
- _confirm: { type: Object },
54
- _values: { type: Object, attribute: false },
55
- dirty: { type: Boolean, reflect: true },
56
- hideDeprecated: { type: Boolean, attribute: 'hide-deprecated' },
57
- validateOnRender: { type: Boolean, attribute: 'validate-on-render' },
58
- _validatorResults: { type: Object },
59
- skeleton: { type: Boolean, reflect: true },
60
- _touch: { type: Boolean },
61
- readonly: { type: Boolean, reflect: true },
62
- scrollable: { type: Boolean, reflect: true },
47
+ schema: {
48
+ type: Object
49
+ },
50
+ errors: {
51
+ type: Object
52
+ },
53
+ values: {
54
+ type: Object
55
+ },
56
+ submitLabel: {
57
+ type: String
58
+ },
59
+ hasFooter: {
60
+ type: Boolean,
61
+ attribute: 'has-footer'
62
+ },
63
+ hasHeader: {
64
+ type: Boolean,
65
+ attribute: 'has-header'
66
+ },
67
+ _confirm: {
68
+ type: Object
69
+ },
70
+ _values: {
71
+ type: Object,
72
+ attribute: false
73
+ },
74
+ dirty: {
75
+ type: Boolean,
76
+ reflect: true
77
+ },
78
+ hideDeprecated: {
79
+ type: Boolean,
80
+ attribute: 'hide-deprecated'
81
+ },
82
+ validateOnRender: {
83
+ type: Boolean,
84
+ attribute: 'validate-on-render'
85
+ },
86
+ _validatorResults: {
87
+ type: Object
88
+ },
89
+ skeleton: {
90
+ type: Boolean,
91
+ reflect: true
92
+ },
93
+ _touch: {
94
+ type: Boolean
95
+ },
96
+ readonly: {
97
+ type: Boolean,
98
+ reflect: true
99
+ },
100
+ scrollable: {
101
+ type: Boolean,
102
+ reflect: true
103
+ }
63
104
  };
64
105
  }
65
106
 
@@ -84,10 +125,12 @@ export class GvSchemaForm extends LitElement {
84
125
  set values(values) {
85
126
  if (!deepEqual(this._values, values)) {
86
127
  if (values) {
87
- this._initialValues = { ...values };
128
+ this._initialValues = { ...values
129
+ };
88
130
  } else {
89
131
  this._initialValues = {};
90
132
  }
133
+
91
134
  this._values = deepClone(this._initialValues);
92
135
  }
93
136
  }
@@ -99,8 +142,10 @@ export class GvSchemaForm extends LitElement {
99
142
  reset(values = null) {
100
143
  this._values = deepClone(values || this._initialValues);
101
144
  this._touch = false;
145
+
102
146
  this._setDirty(false);
103
- this.getControls().forEach((s) => {
147
+
148
+ this.getControls().forEach(s => {
104
149
  s.requestUpdate();
105
150
  });
106
151
  }
@@ -114,6 +159,7 @@ export class GvSchemaForm extends LitElement {
114
159
  clearTimeout(this._validateTimeout);
115
160
  this._validateTimeout = setTimeout(() => {
116
161
  this.validate();
162
+
117
163
  this._updateActions();
118
164
  }, 350);
119
165
  }
@@ -124,13 +170,20 @@ export class GvSchemaForm extends LitElement {
124
170
 
125
171
  _onSubmit() {
126
172
  const validatorResults = this.validate();
173
+
127
174
  if (this.isValid()) {
128
175
  this._initialValues = deepClone(this._values);
129
176
  this.dirty = false;
130
177
  this._touch = false;
131
- dispatchCustomEvent(this, 'submit', { values: this._values, validatorResults });
178
+ dispatchCustomEvent(this, 'submit', {
179
+ values: this._values,
180
+ validatorResults
181
+ });
132
182
  } else {
133
- dispatchCustomEvent(this, 'error', { values: this._values, validatorResults });
183
+ dispatchCustomEvent(this, 'error', {
184
+ values: this._values,
185
+ validatorResults
186
+ });
134
187
  }
135
188
  }
136
189
 
@@ -147,17 +200,26 @@ export class GvSchemaForm extends LitElement {
147
200
  if (this._confirm && this._confirm.promise) {
148
201
  return this._confirm.promise;
149
202
  }
150
- const promise = new Promise((resolve, reject) => (this._confirm = { resolve, reject }));
203
+
204
+ const promise = new Promise((resolve, reject) => this._confirm = {
205
+ resolve,
206
+ reject
207
+ });
151
208
  this._confirm.promise = promise;
152
209
  return promise;
153
210
  }
211
+
154
212
  return Promise.resolve();
155
213
  }
156
214
 
157
215
  _onConfirmReset() {
158
- const { resolve } = this._confirm;
216
+ const {
217
+ resolve
218
+ } = this._confirm;
159
219
  this._confirm = null;
220
+
160
221
  this._onReset();
222
+
161
223
  this.requestUpdate();
162
224
  this.updateComplete.then(() => {
163
225
  resolve(this);
@@ -166,7 +228,9 @@ export class GvSchemaForm extends LitElement {
166
228
 
167
229
  _onConfirmEdit() {
168
230
  this._confirm.reject(this);
231
+
169
232
  this._confirm = null;
233
+
170
234
  this._updateChildren(this.validateOnRender);
171
235
  }
172
236
 
@@ -181,24 +245,43 @@ export class GvSchemaForm extends LitElement {
181
245
  _dispatchChange() {
182
246
  clearTimeout(this._changeTimeout);
183
247
  this._changeTimeout = setTimeout(() => {
184
- dispatchCustomEvent(this, 'change', { target: this, values: this._values, validation: this._validatorResults });
248
+ dispatchCustomEvent(this, 'change', {
249
+ target: this,
250
+ values: this._values,
251
+ validation: this._validatorResults
252
+ });
185
253
  }, 50);
186
254
  }
187
255
 
188
- _onDefaultValue({ detail: { currentTarget, value, control } }) {
189
- if (control.type === 'integer' && value != null && ((value.trim && value.length > 0) || value.length > 0)) {
256
+ _onDefaultValue({
257
+ detail: {
258
+ currentTarget,
259
+ value,
260
+ control
261
+ }
262
+ }) {
263
+ if (control.type === 'integer' && value != null && (value.trim && value.length > 0 || value.length > 0)) {
190
264
  value = parseInt(value, 10);
191
265
  }
266
+
192
267
  set(this._values, currentTarget.id, value);
193
268
  }
194
269
 
195
- _onChange({ detail: { currentTarget, value, control } }) {
270
+ _onChange({
271
+ detail: {
272
+ currentTarget,
273
+ value,
274
+ control
275
+ }
276
+ }) {
196
277
  this._setTouch(true);
278
+
197
279
  if (control.type === 'integer') {
198
280
  if (typeof value === 'string' && value.trim().length === 0) {
199
281
  value = null;
200
282
  } else {
201
283
  const intValue = Number(value).valueOf();
284
+
202
285
  if (!isNaN(intValue)) {
203
286
  value = intValue;
204
287
  } else {
@@ -214,6 +297,7 @@ export class GvSchemaForm extends LitElement {
214
297
  value = null;
215
298
  }
216
299
  }
300
+
217
301
  if (value == null) {
218
302
  del(this._values, currentTarget.id);
219
303
  } else {
@@ -221,9 +305,12 @@ export class GvSchemaForm extends LitElement {
221
305
  }
222
306
 
223
307
  this._updateDynamicControls();
308
+
224
309
  this._validatorResults = this.validate();
225
310
  this.dirty = true;
311
+
226
312
  this._updateActions();
313
+
227
314
  this._dispatchChange();
228
315
  }
229
316
 
@@ -232,12 +319,16 @@ export class GvSchemaForm extends LitElement {
232
319
  e.preventDefault();
233
320
  const controlElement = e.detail.control;
234
321
  const control = controlElement.control;
322
+
235
323
  if (control['x-schema-form']) {
236
324
  if (control['x-schema-form'].event) {
237
325
  const event = control['x-schema-form'].event;
238
- dispatchCustomEvent(this, event.name, { ...event, ...e.detail });
326
+ dispatchCustomEvent(this, event.name, { ...event,
327
+ ...e.detail
328
+ });
239
329
  } else if (this._hasCondition(control)) {
240
330
  this._dynamicControls.push(controlElement);
331
+
241
332
  this._updateDynamicControl(controlElement);
242
333
  }
243
334
  }
@@ -245,18 +336,22 @@ export class GvSchemaForm extends LitElement {
245
336
 
246
337
  _updateDynamicControls() {
247
338
  this._ignoreProperties = [];
248
- this._dynamicControls.forEach((controlElement) => {
339
+
340
+ this._dynamicControls.forEach(controlElement => {
249
341
  this._updateDynamicControl(controlElement);
250
342
  });
251
343
  }
252
344
 
253
345
  _updateDynamicControl(controlElement) {
254
346
  const control = controlElement.control;
347
+
255
348
  if (control['x-schema-form']) {
256
- this._dynamicAttributes.forEach((attribute) => {
349
+ this._dynamicAttributes.forEach(attribute => {
257
350
  const is = this._evaluateCondition(control, attribute);
351
+
258
352
  if (is) {
259
353
  controlElement.setAttribute(attribute, '');
354
+
260
355
  if (attribute === 'hidden') {
261
356
  this._ignoreProperties.push(controlElement.id);
262
357
  }
@@ -265,12 +360,13 @@ export class GvSchemaForm extends LitElement {
265
360
  }
266
361
  });
267
362
  }
363
+
268
364
  return null;
269
365
  }
270
366
 
271
367
  async performUpdate() {
272
- await Promise.all(this.getControls().map((e) => e.updateComplete));
273
- this.getControls().forEach((s) => {
368
+ await Promise.all(this.getControls().map(e => e.updateComplete));
369
+ this.getControls().forEach(s => {
274
370
  s.requestUpdate();
275
371
  });
276
372
  super.performUpdate();
@@ -278,34 +374,30 @@ export class GvSchemaForm extends LitElement {
278
374
 
279
375
  _renderControl(key) {
280
376
  // This is require to clean cache of <gv-schema-form-control>
281
- const control = { ...this.schema.properties[key] };
282
- const isRequired = (this.schema.required && this.schema.required.includes(key)) || this._evaluateCondition(control, 'required');
283
- const isDisabled = (this.schema.disabled && this.schema.disabled.includes(key)) || this._evaluateCondition(control, 'disabled');
377
+ const control = { ...this.schema.properties[key]
378
+ };
379
+
380
+ const isRequired = this.schema.required && this.schema.required.includes(key) || this._evaluateCondition(control, 'required');
381
+
382
+ const isDisabled = this.schema.disabled && this.schema.disabled.includes(key) || this._evaluateCondition(control, 'disabled');
383
+
284
384
  const isHidden = this._evaluateCondition(control, 'hidden');
385
+
285
386
  if (isHidden) {
286
387
  this._ignoreProperties.push(key);
287
388
  }
389
+
288
390
  const isReadonly = this.readonly || control.readOnly === true;
289
391
  const isWriteOnly = control.writeOnly === true;
290
392
  const value = get(this._values, key);
291
- return html`<gv-schema-form-control
292
- .id="${key}"
293
- .errors="${this.errors}"
294
- .control="${control}"
295
- .skeleton="${this.skeleton}"
296
- .value="${value}"
297
- ?readonly="${isReadonly}"
298
- ?writeonly="${isWriteOnly}"
299
- ?required="${isRequired}"
300
- ?disabled="${isDisabled}"
301
- ?hidden="${isHidden}"
302
- ></gv-schema-form-control>`;
393
+ return html`<gv-schema-form-control .id="${key}" .errors="${this.errors}" .control="${control}" .skeleton="${this.skeleton}" .value="${value}" ?readonly="${isReadonly}" ?writeonly="${isWriteOnly}" ?required="${isRequired}" ?disabled="${isDisabled}" ?hidden="${isHidden}"></gv-schema-form-control>`;
303
394
  }
304
395
 
305
396
  _hasCondition(control) {
306
397
  if (control['x-schema-form']) {
307
- return this._dynamicAttributes.find((condition) => control['x-schema-form'][condition] != null) != null;
398
+ return this._dynamicAttributes.find(condition => control['x-schema-form'][condition] != null) != null;
308
399
  }
400
+
309
401
  return false;
310
402
  }
311
403
 
@@ -313,10 +405,13 @@ export class GvSchemaForm extends LitElement {
313
405
  if (control['x-schema-form'] == null || control['x-schema-form'][conditionKey] == null) {
314
406
  return false;
315
407
  }
408
+
316
409
  const condition = control['x-schema-form'][conditionKey];
410
+
317
411
  if (typeof condition === 'boolean') {
318
412
  return condition;
319
413
  }
414
+
320
415
  if (!Array.isArray(condition)) {
321
416
  // condition isn't an array, ignore the condition
322
417
  console.warn(`'${conditionKey}' attribute of 'x-schema-form' should be an array`);
@@ -324,6 +419,7 @@ export class GvSchemaForm extends LitElement {
324
419
  }
325
420
 
326
421
  let result = true;
422
+
327
423
  for (const operation of condition) {
328
424
  // operation only have one operator with a single object containing operand values
329
425
  const operator = Object.keys(operation)[0];
@@ -332,15 +428,19 @@ export class GvSchemaForm extends LitElement {
332
428
  case '$neq':
333
429
  result = result && this._evaluateNotEqualsCondition(control, operation);
334
430
  break;
431
+
335
432
  case '$eq':
336
433
  result = result && this._evaluateEqualsCondition(control, operation);
337
434
  break;
435
+
338
436
  case '$nodef':
339
437
  result = result && this._evaluateNotDefCondition(control, operation);
340
438
  break;
439
+
341
440
  case '$def':
342
441
  result = result && this._evaluateDefCondition(control, operation);
343
442
  break;
443
+
344
444
  default:
345
445
  console.warn(`Unsupported operator '${operator}' on disable condition`);
346
446
  result = false;
@@ -359,19 +459,20 @@ export class GvSchemaForm extends LitElement {
359
459
  const operator = Object.keys(condition)[0];
360
460
  const operands = condition[operator];
361
461
  const modelAttributes = Object.keys(operands);
362
- return modelAttributes
363
- .map((modelAttribute) => {
364
- const testValue = operands[modelAttribute];
365
- let value = get(this._values, modelAttribute);
366
- if (value == null && control.type === 'string') {
367
- value = '';
368
- }
369
- if (Array.isArray(testValue)) {
370
- return testValue.includes(value);
371
- }
372
- return value === testValue;
373
- })
374
- .reduce((acc, current) => acc || current);
462
+ return modelAttributes.map(modelAttribute => {
463
+ const testValue = operands[modelAttribute];
464
+ let value = get(this._values, modelAttribute);
465
+
466
+ if (value == null && control.type === 'string') {
467
+ value = '';
468
+ }
469
+
470
+ if (Array.isArray(testValue)) {
471
+ return testValue.includes(value);
472
+ }
473
+
474
+ return value === testValue;
475
+ }).reduce((acc, current) => acc || current);
375
476
  }
376
477
 
377
478
  _evaluateNotDefCondition(control, condition) {
@@ -386,21 +487,12 @@ export class GvSchemaForm extends LitElement {
386
487
 
387
488
  _renderPart() {
388
489
  if (this._confirm) {
389
- return html`<div class="confirm-box">
390
- <div class="error">The configuration is not valid and cannot be saved.</div>
391
- <div class="confirm-box_actions">
392
- <gv-button @gv-button:click="${this._onConfirmReset}" outlined icon="general:update" danger>Lose changes</gv-button>
393
- <gv-button @gv-button:click="${this._onConfirmEdit}" icon="design:edit">Edit</gv-button>
394
- </div>
395
- </div>`;
490
+ return html`<div class="confirm-box"> <div class="error">The configuration is not valid and cannot be saved.</div> <div class="confirm-box_actions"> <gv-button @gv-button:click="${this._onConfirmReset}" outlined icon="general:update" danger>Lose changes</gv-button> <gv-button @gv-button:click="${this._onConfirmEdit}" icon="design:edit">Edit</gv-button> </div> </div>`;
396
491
  }
492
+
397
493
  const keys = this.schema.properties ? Object.keys(this.schema.properties) : [];
398
494
  this._ignoreProperties = [];
399
- return repeat(
400
- keys,
401
- (key) => key,
402
- (key) => this._renderControl(key),
403
- );
495
+ return repeat(keys, key => key, key => this._renderControl(key));
404
496
  }
405
497
 
406
498
  getControls() {
@@ -412,17 +504,20 @@ export class GvSchemaForm extends LitElement {
412
504
  }
413
505
 
414
506
  _getErrors() {
415
- return (this._validatorResults.errors || []).filter((error) => {
507
+ return (this._validatorResults.errors || []).filter(error => {
416
508
  let id = `${error.property.replace('instance.', '')}`;
509
+
417
510
  if (!Array.isArray(error.argument)) {
418
511
  id = `${id}.${error.argument}`;
419
512
  }
420
513
 
421
514
  const errorKey = `x-schema-form.errors.${id}.${error.name}`;
422
515
  const errorMessage = get(this.schema, errorKey);
516
+
423
517
  if (errorMessage) {
424
518
  error.message = errorMessage;
425
519
  }
520
+
426
521
  return !this._ignoreProperties.includes(id);
427
522
  });
428
523
  }
@@ -430,9 +525,12 @@ export class GvSchemaForm extends LitElement {
430
525
  validate() {
431
526
  if (this.schema) {
432
527
  // Additional properties should not block the validation of the form
433
- this._validatorResults = this._validator.validate(this._values, { ...this.schema, additionalProperties: true });
528
+ this._validatorResults = this._validator.validate(this._values, { ...this.schema,
529
+ additionalProperties: true
530
+ });
434
531
  this.errors = this._getErrors();
435
532
  }
533
+
436
534
  return this._validatorResults;
437
535
  }
438
536
 
@@ -440,11 +538,12 @@ export class GvSchemaForm extends LitElement {
440
538
  if (this._validatorResults.valid) {
441
539
  return true;
442
540
  }
541
+
443
542
  return this._getErrors() === 0;
444
543
  }
445
544
 
446
545
  isTouch() {
447
- return this._touch || (this.dirty && this.validateOnRender);
546
+ return this._touch || this.dirty && this.validateOnRender;
448
547
  }
449
548
 
450
549
  canSubmit() {
@@ -453,6 +552,7 @@ export class GvSchemaForm extends LitElement {
453
552
 
454
553
  _updateActions() {
455
554
  const submitBtn = this._getSubmitBtn();
555
+
456
556
  if (submitBtn != null) {
457
557
  if (this.canSubmit()) {
458
558
  this._getSubmitBtn().removeAttribute('disabled');
@@ -460,7 +560,9 @@ export class GvSchemaForm extends LitElement {
460
560
  this._getSubmitBtn().setAttribute('disabled', true);
461
561
  }
462
562
  }
563
+
463
564
  const resetBtn = this._getResetBtn();
565
+
464
566
  if (resetBtn != null) {
465
567
  if (this.dirty) {
466
568
  resetBtn.removeAttribute('disabled');
@@ -482,226 +584,39 @@ export class GvSchemaForm extends LitElement {
482
584
 
483
585
  async updated(changedProperties) {
484
586
  clearTimeout(this._updateActionsTimeout);
587
+
485
588
  if (changedProperties.has('_values')) {
486
- this.getControls().forEach((control) => {
589
+ this.getControls().forEach(control => {
487
590
  control.value = get(this._values, control.id);
488
591
  });
489
592
  }
593
+
490
594
  this._updateChildren(this.validateOnRender && (changedProperties.has('_values') || changedProperties.has('schema')));
491
595
  }
492
596
 
493
597
  async getUpdateComplete() {
494
598
  const result = await super.getUpdateComplete();
495
- await Promise.all(this.getControls().map((e) => e.updateComplete));
599
+ await Promise.all(this.getControls().map(e => e.updateComplete));
496
600
  return result;
497
601
  }
498
602
 
499
603
  render() {
500
- return html`<form class="${classMap({ scrollable: this.scrollable })}">
501
- <div class="${classMap({ container: true, confirm: this._confirm })}">
502
- ${this.hasHeader === true
503
- ? html`
504
- <div class="header">
505
- <div class="${classMap({ title: true, center: this.hasHeader && !this.hasFooter })}">
506
- <slot name="title"></slot>
507
- </div>
508
- <div class="left">
509
- <slot name="header-left"></slot>
510
- </div>
511
- ${this.readonly === true || this.hasFooter === true
512
- ? ''
513
- : html`<div class="right">
514
- <gv-button
515
- id="reset"
516
- outlined
517
- small
518
- @gv-button:click="${this._onReset}"
519
- icon="general:update"
520
- title="Reset"
521
- ></gv-button>
522
- <gv-button
523
- id="submit"
524
- small
525
- @gv-button:click="${this._onSubmit}"
526
- icon="code:check"
527
- .title="${this.submitLabel}"
528
- ></gv-button>
529
- </div> `}
530
- </div>
531
- `
532
- : ''}
533
- <div class="content">${this.schema != null ? this._renderPart() : html``}</div>
534
- ${this.hasFooter === true && this.readonly !== true
535
- ? html`
536
- <div class="footer">
537
- <div class="left"></div>
538
- <div class="right">
539
- <gv-button id="reset" outlined @gv-button:click="${this._onReset}" icon="general:update" title="Reset">Reset</gv-button>
540
- <gv-button id="submit" @gv-button:click="${this._onSubmit}" icon="code:check" .title="${this.submitLabel}"
541
- >${this.submitLabel}</gv-button
542
- >
543
- </div>
544
- </div>
545
- `
546
- : ''}
547
- </div>
548
- </form>`;
604
+ return html`<form class="${classMap({
605
+ scrollable: this.scrollable
606
+ })}"> <div class="${classMap({
607
+ container: true,
608
+ confirm: this._confirm
609
+ })}"> ${this.hasHeader === true ? html` <div class="header"> <div class="${classMap({
610
+ title: true,
611
+ center: this.hasHeader && !this.hasFooter
612
+ })}"> <slot name="title"></slot> </div> <div class="left"> <slot name="header-left"></slot> </div> ${this.readonly === true || this.hasFooter === true ? '' : html`<div class="right"> <gv-button id="reset" outlined small @gv-button:click="${this._onReset}" icon="general:update" title="Reset"></gv-button> <gv-button id="submit" small @gv-button:click="${this._onSubmit}" icon="code:check" .title="${this.submitLabel}"></gv-button> </div> `} </div> ` : ''} <div class="content">${this.schema != null ? this._renderPart() : html``}</div> ${this.hasFooter === true && this.readonly !== true ? html` <div class="footer"> <div class="left"></div> <div class="right"> <gv-button id="reset" outlined @gv-button:click="${this._onReset}" icon="general:update" title="Reset">Reset</gv-button> <gv-button id="submit" @gv-button:click="${this._onSubmit}" icon="code:check" .title="${this.submitLabel}">${this.submitLabel}</gv-button> </div> </div> ` : ''} </div> </form>`;
549
613
  }
550
614
 
551
615
  static get styles() {
552
- return [
553
- empty,
554
- // language=CSS
555
- css`
556
- :host {
557
- box-sizing: border-box;
558
- margin: 0.2rem;
559
- --bgc: var(--gv-schema-form--bgc, #ffffff);
560
- }
561
-
562
- form {
563
- display: flex;
564
- flex-direction: column;
565
- }
566
-
567
- form.scrollable {
568
- position: absolute;
569
- width: 100%;
570
- top: 0;
571
- bottom: 0;
572
- left: 0;
573
- }
574
-
575
- .container {
576
- flex-grow: 1;
577
-
578
- background-color: var(--bgc);
579
- display: flex;
580
- flex-direction: column;
581
-
582
- /* for Firefox */
583
- min-height: 0;
584
- }
585
-
586
- .header,
587
- .footer,
588
- .content {
589
- background-color: var(--bgc);
590
- }
591
-
592
- .content {
593
- flex-grow: 1;
594
- display: flex;
595
- flex-direction: column;
596
- align-self: center;
597
- width: 100%;
598
-
599
- /* for Firefox */
600
- min-height: 0;
601
- }
602
-
603
- .content > gv-schema-form-control {
604
- align-self: center;
605
- width: 100%;
606
- }
607
-
608
- form.scrollable .content {
609
- overflow: auto;
610
- }
611
-
612
- form.scrollable .content > gv-schema-form-control {
613
- max-width: 775px;
614
- width: 95%;
615
- }
616
-
617
- .header,
618
- .footer {
619
- display: flex;
620
- box-sizing: border-box;
621
- min-height: 45px;
622
- --gv-icon--s: 26px;
623
- --gv-icon--c: #bfbfbf;
624
- align-items: center;
625
- padding: 0 0.5rem;
626
- position: relative;
627
- }
628
-
629
- .header {
630
- border-bottom: 1px solid #d9d9d9;
631
- }
632
-
633
- .footer {
634
- display: flex;
635
- justify-content: space-between;
636
- padding: 1rem;
637
- border-top: 1px solid #d9d9d9;
638
- }
639
-
640
- form.scrollable .footer {
641
- justify-content: center;
642
- }
643
-
644
- .footer .left,
645
- .footer .right {
646
- max-width: 400px;
647
- }
648
-
649
- .header .left,
650
- .footer .left,
651
- .header .right,
652
- .footer .right {
653
- display: flex;
654
- flex: 1;
655
- z-index: 10;
656
- align-items: center;
657
- }
658
-
659
- .header .right,
660
- .footer .right {
661
- justify-content: flex-end;
662
- }
663
-
664
- .header .title {
665
- color: #28444f;
666
- font-size: 18px;
667
- display: flex;
668
- width: 100%;
669
- align-items: center;
670
- }
671
-
672
- .header .title.center {
673
- position: absolute;
674
- top: 0;
675
- left: 0;
676
- bottom: 0;
677
- justify-content: center;
678
- }
679
-
680
- .confirm-box {
681
- height: 100%;
682
- padding: 1rem;
683
- font-style: italic;
684
- display: flex;
685
- flex-direction: column;
686
-
687
- justify-content: center;
688
- align-items: center;
689
- text-align: center;
690
- }
691
-
692
- .confirm-box_actions {
693
- padding: 1rem 0;
694
- }
695
-
696
- .confirm .header .left,
697
- .confirm .header .right,
698
- .confirm .footer .left,
699
- .confirm .footer .right {
700
- display: none;
701
- }
702
- `,
703
- ];
616
+ return [empty, // language=CSS
617
+ css`:host{box-sizing:border-box;margin:.2rem;--bgc:var(--gv-schema-form--bgc, #ffffff)}form{display:flex;flex-direction:column}form.scrollable{position:absolute;width:100%;top:0;bottom:0;left:0}.container{flex-grow:1;background-color:var(--bgc);display:flex;flex-direction:column;min-height:0}.content,.footer,.header{background-color:var(--bgc)}.content{flex-grow:1;display:flex;flex-direction:column;align-self:center;width:100%;min-height:0}.content>gv-schema-form-control{align-self:center;width:100%}form.scrollable .content{overflow:auto}form.scrollable .content>gv-schema-form-control{max-width:775px;width:95%}.footer,.header{display:flex;box-sizing:border-box;min-height:45px;--gv-icon--s:26px;--gv-icon--c:#bfbfbf;align-items:center;padding:0 .5rem;position:relative}.header{border-bottom:1px solid #d9d9d9}.footer{display:flex;justify-content:space-between;padding:1rem;border-top:1px solid #d9d9d9}form.scrollable .footer{justify-content:center}.footer .left,.footer .right{max-width:400px}.footer .left,.footer .right,.header .left,.header .right{display:flex;flex:1;z-index:10;align-items:center}.footer .right,.header .right{justify-content:flex-end}.header .title{color:#28444f;font-size:18px;display:flex;width:100%;align-items:center}.header .title.center{position:absolute;top:0;left:0;bottom:0;justify-content:center}.confirm-box{height:100%;padding:1rem;font-style:italic;display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center}.confirm-box_actions{padding:1rem 0}.confirm .footer .left,.confirm .footer .right,.confirm .header .left,.confirm .header .right{display:none}`];
704
618
  }
705
- }
706
619
 
620
+ }
707
621
  window.customElements.define('gv-schema-form', GvSchemaForm);
622
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4vbm9kZV9tb2R1bGVzL0BncmF2aXRlZS91aS1jb21wb25lbnRzL29yZ2FuaXNtcy9ndi1zY2hlbWEtZm9ybS5qcyJdLCJuYW1lcyI6WyJMaXRFbGVtZW50IiwiaHRtbCIsImNzcyIsImdldCIsInNldCIsImRlbCIsImRpc3BhdGNoQ3VzdG9tRXZlbnQiLCJkZWVwQ2xvbmUiLCJkZWVwRXF1YWwiLCJjbGFzc01hcCIsInJlcGVhdCIsIlZhbGlkYXRvciIsImVtcHR5IiwiR3ZTY2hlbWFGb3JtIiwicHJvcGVydGllcyIsInNjaGVtYSIsInR5cGUiLCJPYmplY3QiLCJlcnJvcnMiLCJ2YWx1ZXMiLCJzdWJtaXRMYWJlbCIsIlN0cmluZyIsImhhc0Zvb3RlciIsIkJvb2xlYW4iLCJhdHRyaWJ1dGUiLCJoYXNIZWFkZXIiLCJfY29uZmlybSIsIl92YWx1ZXMiLCJkaXJ0eSIsInJlZmxlY3QiLCJoaWRlRGVwcmVjYXRlZCIsInZhbGlkYXRlT25SZW5kZXIiLCJfdmFsaWRhdG9yUmVzdWx0cyIsInNrZWxldG9uIiwiX3RvdWNoIiwicmVhZG9ubHkiLCJzY3JvbGxhYmxlIiwiY29uc3RydWN0b3IiLCJfdmFsaWRhdG9yIiwiX2lnbm9yZVByb3BlcnRpZXMiLCJfZHluYW1pY0NvbnRyb2xzIiwiX2R5bmFtaWNBdHRyaWJ1dGVzIiwiYWRkRXZlbnRMaXN0ZW5lciIsIl9vbkRlZmF1bHRWYWx1ZSIsImJpbmQiLCJfb25DaGFuZ2UiLCJfb25Db250cm9sUmVhZHkiLCJfaW5pdGlhbFZhbHVlcyIsInJlc2V0IiwiX3NldERpcnR5IiwiZ2V0Q29udHJvbHMiLCJmb3JFYWNoIiwicyIsInJlcXVlc3RVcGRhdGUiLCJfb25SZXNldCIsInJlcXVlc3RWYWxpZGF0aW9uIiwiY2xlYXJUaW1lb3V0IiwiX3ZhbGlkYXRlVGltZW91dCIsInNldFRpbWVvdXQiLCJ2YWxpZGF0ZSIsIl91cGRhdGVBY3Rpb25zIiwic3VibWl0IiwiX29uU3VibWl0IiwidmFsaWRhdG9yUmVzdWx0cyIsImlzVmFsaWQiLCJfc2V0VG91Y2giLCJ0b3VjaCIsImNvbmZpcm0iLCJpc1RvdWNoIiwicHJvbWlzZSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiX29uQ29uZmlybVJlc2V0IiwidXBkYXRlQ29tcGxldGUiLCJ0aGVuIiwiX29uQ29uZmlybUVkaXQiLCJfdXBkYXRlQ2hpbGRyZW4iLCJfZ2V0U3VibWl0QnRuIiwic2hhZG93Um9vdCIsInF1ZXJ5U2VsZWN0b3IiLCJfZ2V0UmVzZXRCdG4iLCJfZGlzcGF0Y2hDaGFuZ2UiLCJfY2hhbmdlVGltZW91dCIsInRhcmdldCIsInZhbGlkYXRpb24iLCJkZXRhaWwiLCJjdXJyZW50VGFyZ2V0IiwidmFsdWUiLCJjb250cm9sIiwidHJpbSIsImxlbmd0aCIsInBhcnNlSW50IiwiaWQiLCJpbnRWYWx1ZSIsIk51bWJlciIsInZhbHVlT2YiLCJpc05hTiIsImVudW0iLCJrZXlzIiwiX3VwZGF0ZUR5bmFtaWNDb250cm9scyIsImUiLCJzdG9wUHJvcGFnYXRpb24iLCJwcmV2ZW50RGVmYXVsdCIsImNvbnRyb2xFbGVtZW50IiwiZXZlbnQiLCJuYW1lIiwiX2hhc0NvbmRpdGlvbiIsInB1c2giLCJfdXBkYXRlRHluYW1pY0NvbnRyb2wiLCJpcyIsIl9ldmFsdWF0ZUNvbmRpdGlvbiIsInNldEF0dHJpYnV0ZSIsInJlbW92ZUF0dHJpYnV0ZSIsInBlcmZvcm1VcGRhdGUiLCJhbGwiLCJtYXAiLCJfcmVuZGVyQ29udHJvbCIsImtleSIsImlzUmVxdWlyZWQiLCJyZXF1aXJlZCIsImluY2x1ZGVzIiwiaXNEaXNhYmxlZCIsImRpc2FibGVkIiwiaXNIaWRkZW4iLCJpc1JlYWRvbmx5IiwicmVhZE9ubHkiLCJpc1dyaXRlT25seSIsIndyaXRlT25seSIsImZpbmQiLCJjb25kaXRpb24iLCJjb25kaXRpb25LZXkiLCJBcnJheSIsImlzQXJyYXkiLCJjb25zb2xlIiwid2FybiIsInJlc3VsdCIsIm9wZXJhdGlvbiIsIm9wZXJhdG9yIiwiX2V2YWx1YXRlTm90RXF1YWxzQ29uZGl0aW9uIiwiX2V2YWx1YXRlRXF1YWxzQ29uZGl0aW9uIiwiX2V2YWx1YXRlTm90RGVmQ29uZGl0aW9uIiwiX2V2YWx1YXRlRGVmQ29uZGl0aW9uIiwib3BlcmFuZHMiLCJtb2RlbEF0dHJpYnV0ZXMiLCJtb2RlbEF0dHJpYnV0ZSIsInRlc3RWYWx1ZSIsInJlZHVjZSIsImFjYyIsImN1cnJlbnQiLCJ1bmRlZmluZWQiLCJfcmVuZGVyUGFydCIsImZyb20iLCJxdWVyeVNlbGVjdG9yQWxsIiwiZ2V0Q29udHJvbCIsIl9nZXRFcnJvcnMiLCJmaWx0ZXIiLCJlcnJvciIsInByb3BlcnR5IiwicmVwbGFjZSIsImFyZ3VtZW50IiwiZXJyb3JLZXkiLCJlcnJvck1lc3NhZ2UiLCJtZXNzYWdlIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJ2YWxpZCIsImNhblN1Ym1pdCIsInN1Ym1pdEJ0biIsInJlc2V0QnRuIiwid2l0aFZhbGlkYXRpb24iLCJfdXBkYXRlQWN0aW9uc1RpbWVvdXQiLCJ1cGRhdGVkIiwiY2hhbmdlZFByb3BlcnRpZXMiLCJoYXMiLCJnZXRVcGRhdGVDb21wbGV0ZSIsInJlbmRlciIsImNvbnRhaW5lciIsInRpdGxlIiwiY2VudGVyIiwic3R5bGVzIiwid2luZG93IiwiY3VzdG9tRWxlbWVudHMiLCJkZWZpbmUiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNBLFVBQVQsRUFBcUJDLElBQXJCLEVBQTJCQyxHQUEzQixRQUFzQyxLQUF0QztBQUNBLFNBQVNDLEdBQVQsRUFBY0MsR0FBZCxFQUFtQkMsR0FBbkIsUUFBOEIsYUFBOUI7QUFDQSxTQUFTQyxtQkFBVCxRQUFvQyxlQUFwQztBQUNBLFNBQVNDLFNBQVQsRUFBb0JDLFNBQXBCLFFBQXFDLGNBQXJDO0FBQ0EsU0FBU0MsUUFBVCxRQUF5QiwwQkFBekI7QUFDQSxTQUFTQyxNQUFULFFBQXVCLHVC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QUFDbEIsV0FBTyxDQUNMdkssS0FESyxFQUVMO0FBQ0FWLElBQUFBLEdBQUcsNmxEQUhFLENBQVA7QUF3SkQ7O0FBcHBCMEM7QUF1cEI3Q2tMLE1BQU0sQ0FBQ0MsY0FBUCxDQUFzQkMsTUFBdEIsQ0FBNkIsZ0JBQTdCLEVBQStDekssWUFBL0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBHcmF2aXRlZSB0ZWFtIChodHRwOi8vZ3Jhdml0ZWUuaW8pXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgTGl0RWxlbWVudCwgaHRtbCwgY3NzIH0gZnJvbSAnbGl0JztcbmltcG9ydCB7IGdldCwgc2V0LCBkZWwgfSBmcm9tICdvYmplY3QtcGF0aCc7XG5pbXBvcnQgeyBkaXNwYXRjaEN1c3RvbUV2ZW50IH0gZnJvbSAnLi4vbGliL2V2ZW50cyc7XG5pbXBvcnQgeyBkZWVwQ2xvbmUsIGRlZXBFcXVhbCB9IGZyb20gJy4uL2xpYi91dGlscyc7XG5pbXBvcnQgeyBjbGFzc01hcCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL2NsYXNzLW1hcCc7XG5pbXBvcnQgeyByZXBlYXQgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9yZXBlYXQnO1xuaW1wb3J0IHsgVmFsaWRhdG9yIH0gZnJvbSAnanNvbnNjaGVtYSc7XG5pbXBvcnQgeyBlbXB0eSB9IGZyb20gJy4uL3N0eWxlcy9lbXB0eSc7XG5pbXBvcnQgJy4vZ3Ytc2NoZW1hLWZvcm0tY29udHJvbCc7XG5cbi8qKlxuICogU2NoZW1hIGZvcm0gY29tcG9uZW50XG4gKlxuICogQGZpcmVzIGd2LXNjaGVtYS1mb3JtOnN1Ym1pdCAtIGV2ZW50IHdoZW4gdXNlciBzdWJtaXQgdmFsaWQgZm9ybVxuICogQGZpcmVzIGd2LXNjaGVtYS1mb3JtOmVycm9yIC0gZXZlbnQgd2hlbiB1c2VyIHN1Ym1pdCBpbnZhbGlkIGZvcm1cbiAqIEBmaXJlcyBndi1zY2hlbWEtZm9ybTpjaGFuZ2UgLSBldmVudCB3aGVuIHdoZW4gZm9ybSBjaGFuZ2VcbiAqIEBmaXJlcyBndi1zY2hlbWEtZm9ybTpjYW5jZWwgLSBldmVudCB3aGVuIHVzZXIgY2FuY2VsIGZvcm1cbiAqXG4gKiBAYXR0ciB7T2JqZWN0fSBzY2hlbWEgLSB0aGUgc2NoZW1hIGZvcm0gY29uZmlndXJhdGlvblxuICogQGF0dHIge09iamVjdH0gdmFsdWVzIC0gdGhlIHZhbHVlcyBvZiBmaWVsZHNcbiAqIEBhdHRyIHtPYmplY3R9IGVycm9ycyAtIHRoZSBtYXAgb2YgZXJyb3JzIGJ5IGlucHV0IGtleVxuICogQGF0dHIge0Jvb2xlYW59IHZhbGlkYXRlIC0gdG8gZm9yY2UgdmFsaWRhdGlvbiBvbiBmaXJzdCByZW5kZXJcbiAqIEBhdHRyIHtCb29sZWFufSByZWFkb25seSAtIHRydWUgaWYgcmVhZG9ubHlcbiAqIEBhdHRyIHtCb29sZWFufSBzY3JvbGxhYmxlIC0gdXNlZnVsIGZvciBtYWtpbmcgY29udGVudCBzY3JvbGxhYmxlIHdpdGggZml4ZWQgaGVhZGVycyAvIGZvb3RlcnNcbiAqXG4gKiBAY3NzcHJvcCB7Q29sb3J9IFstLWd2LXNjaGVtYS1mb3JtLS1iZ2M9I2ZmZmZmZl0gLSBCYWNrZ3JvdW5kIGNvbG9yXG4gKiBAY3NzcHJvcCB7TGVuZ3RofSBbLS1ndi1zY2hlbWEtZm9ybS1jb250cm9sLS1tPTAuNHJlbV0gLSBDb250cm9sIG1hcmdpblxuICovXG5leHBvcnQgY2xhc3MgR3ZTY2hlbWFGb3JtIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2NoZW1hOiB7IHR5cGU6IE9iamVjdCB9LFxuICAgICAgZXJyb3JzOiB7IHR5cGU6IE9iamVjdCB9LFxuICAgICAgdmFsdWVzOiB7IHR5cGU6IE9iamVjdCB9LFxuICAgICAgc3VibWl0TGFiZWw6IHsgdHlwZTogU3RyaW5nIH0sXG4gICAgICBoYXNGb290ZXI6IHsgdHlwZTogQm9vbGVhbiwgYXR0cmlidXRlOiAnaGFzLWZvb3RlcicgfSxcbiAgICAgIGhhc0hlYWRlcjogeyB0eXBlOiBCb29sZWFuLCBhdHRyaWJ1dGU6ICdoYXMtaGVhZGVyJyB9LFxuICAgICAgX2NvbmZpcm06IHsgdHlwZTogT2JqZWN0IH0sXG4gICAgICBfdmFsdWVzOiB7IHR5cGU6IE9iamVjdCwgYXR0cmlidXRlOiBmYWxzZSB9LFxuICAgICAgZGlydHk6IHsgdHlwZTogQm9vbGVhbiwgcmVmbGVjdDogdHJ1ZSB9LFxuICAgICAgaGlkZURlcHJlY2F0ZWQ6IHsgdHlwZTogQm9vbGVhbiwgYXR0cmlidXRlOiAnaGlkZS1kZXByZWNhdGVkJyB9LFxuICAgICAgdmFsaWRhdGVPblJlbmRlcjogeyB0eXBlOiBCb29sZWFuLCBhdHRyaWJ1dGU6ICd2YWxpZGF0ZS1vbi1yZW5kZXInIH0sXG4gICAgICBfdmFsaWRhdG9yUmVzdWx0czogeyB0eXBlOiBPYmplY3QgfSxcbiAgICAgIHNrZWxldG9uOiB7IHR5cGU6IEJvb2xlYW4sIHJlZmxlY3Q6IHRydWUgfSxcbiAgICAgIF90b3VjaDogeyB0eXBlOiBCb29sZWFuIH0sXG4gICAgICByZWFkb25seTogeyB0eXBlOiBCb29sZWFuLCByZWZsZWN0OiB0cnVlIH0sXG4gICAgICBzY3JvbGxhYmxlOiB7IHR5cGU6IEJvb2xlYW4sIHJlZmxlY3Q6IHRydWUgfSxcbiAgICB9O1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmhpZGVEZXByZWNhdGVkID0gZmFsc2U7XG4gICAgdGhpcy5fdmFsdWVzID0ge307XG4gICAgdGhpcy5zdWJtaXRMYWJlbCA9ICdPayc7XG4gICAgdGhpcy5oYXNIZWFkZXIgPSBmYWxzZTtcbiAgICB0aGlzLmhhc0Zvb3RlciA9IGZhbHNlO1xuICAgIHRoaXMuX3RvdWNoID0gZmFsc2U7XG4gICAgdGhpcy5fdmFsaWRhdG9yID0gbmV3IFZhbGlkYXRvcigpO1xuICAgIHRoaXMuX3ZhbGlkYXRvclJlc3VsdHMgPSB7fTtcbiAgICB0aGlzLl9pZ25vcmVQcm9wZXJ0aWVzID0gW107XG4gICAgdGhpcy5fZHluYW1pY0NvbnRyb2xzID0gW107XG4gICAgdGhpcy5fZHluYW1pY0F0dHJpYnV0ZXMgPSBbJ2Rpc2FibGVkJywgJ3JlcXVpcmVkJywgJ2hpZGRlbiddO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignZ3Ytc2NoZW1hLWZvcm0tY29udHJvbDpkZWZhdWx0LXZhbHVlJywgdGhpcy5fb25EZWZhdWx0VmFsdWUuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdndi1zY2hlbWEtZm9ybS1jb250cm9sOmNoYW5nZScsIHRoaXMuX29uQ2hhbmdlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignZ3Ytc2NoZW1hLWZvcm0tY29udHJvbDpjb250cm9sLXJlYWR5JywgdGhpcy5fb25Db250cm9sUmVhZHkuYmluZCh0aGlzKSk7XG4gIH1cblxuICBzZXQgdmFsdWVzKHZhbHVlcykge1xuICAgIGlmICghZGVlcEVxdWFsKHRoaXMuX3ZhbHVlcywgdmFsdWVzKSkge1xuICAgICAgaWYgKHZhbHVlcykge1xuICAgICAgICB0aGlzLl9pbml0aWFsVmFsdWVzID0geyAuLi52YWx1ZXMgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2luaXRpYWxWYWx1ZXMgPSB7fTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3ZhbHVlcyA9IGRlZXBDbG9uZSh0aGlzLl9pbml0aWFsVmFsdWVzKTtcbiAgICB9XG4gIH1cblxuICBnZXQgdmFsdWVzKCkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZXM7XG4gIH1cblxuICByZXNldCh2YWx1ZXMgPSBudWxsKSB7XG4gICAgdGhpcy5fdmFsdWVzID0gZGVlcENsb25lKHZhbHVlcyB8fCB0aGlzLl9pbml0aWFsVmFsdWVzKTtcbiAgICB0aGlzLl90b3VjaCA9IGZhbHNlO1xuICAgIHRoaXMuX3NldERpcnR5KGZhbHNlKTtcbiAgICB0aGlzLmdldENvbnRyb2xzKCkuZm9yRWFjaCgocykgPT4ge1xuICAgICAgcy5yZXF1ZXN0VXBkYXRlKCk7XG4gICAgfSk7XG4gIH1cblxuICBfb25SZXNldCgpIHtcbiAgICB0aGlzLnJlc2V0KCk7XG4gICAgZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLCAncmVzZXQnKTtcbiAgfVxuXG4gIHJlcXVlc3RWYWxpZGF0aW9uKCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLl92YWxpZGF0ZVRpbWVvdXQpO1xuICAgIHRoaXMuX3ZhbGlkYXRlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy52YWxpZGF0ZSgpO1xuICAgICAgdGhpcy5fdXBkYXRlQWN0aW9ucygpO1xuICAgIH0sIDM1MCk7XG4gIH1cblxuICBzdWJtaXQoKSB7XG4gICAgdGhpcy5fb25TdWJtaXQoKTtcbiAgfVxuXG4gIF9vblN1Ym1pdCgpIHtcbiAgICBjb25zdCB2YWxpZGF0b3JSZXN1bHRzID0gdGhpcy52YWxpZGF0ZSgpO1xuICAgIGlmICh0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgdGhpcy5faW5pdGlhbFZhbHVlcyA9IGRlZXBDbG9uZSh0aGlzLl92YWx1ZXMpO1xuICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgICAgdGhpcy5fdG91Y2ggPSBmYWxzZTtcbiAgICAgIGRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcywgJ3N1Ym1pdCcsIHsgdmFsdWVzOiB0aGlzLl92YWx1ZXMsIHZhbGlkYXRvclJlc3VsdHMgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcywgJ2Vycm9yJywgeyB2YWx1ZXM6IHRoaXMuX3ZhbHVlcywgdmFsaWRhdG9yUmVzdWx0cyB9KTtcbiAgICB9XG4gIH1cblxuICBfc2V0RGlydHkoZGlydHkgPSB0cnVlKSB7XG4gICAgdGhpcy5kaXJ0eSA9ICEhZGlydHk7XG4gIH1cblxuICBfc2V0VG91Y2godG91Y2ggPSB0cnVlKSB7XG4gICAgdGhpcy5fdG91Y2ggPSAhIXRvdWNoO1xuICB9XG5cbiAgY29uZmlybSgpIHtcbiAgICBpZiAodGhpcy5pc1RvdWNoKCkpIHtcbiAgICAgIGlmICh0aGlzLl9jb25maXJtICYmIHRoaXMuX2NvbmZpcm0ucHJvbWlzZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29uZmlybS5wcm9taXNlO1xuICAgICAgfVxuICAgICAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+ICh0aGlzLl9jb25maXJtID0geyByZXNvbHZlLCByZWplY3QgfSkpO1xuICAgICAgdGhpcy5fY29uZmlybS5wcm9taXNlID0gcHJvbWlzZTtcbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICBfb25Db25maXJtUmVzZXQoKSB7XG4gICAgY29uc3QgeyByZXNvbHZlIH0gPSB0aGlzLl9jb25maXJtO1xuICAgIHRoaXMuX2NvbmZpcm0gPSBudWxsO1xuICAgIHRoaXMuX29uUmVzZXQoKTtcbiAgICB0aGlzLnJlcXVlc3RVcGRhdGUoKTtcbiAgICB0aGlzLnVwZGF0ZUNvbXBsZXRlLnRoZW4oKCkgPT4ge1xuICAgICAgcmVzb2x2ZSh0aGlzKTtcbiAgICB9KTtcbiAgfVxuXG4gIF9vbkNvbmZpcm1FZGl0KCkge1xuICAgIHRoaXMuX2NvbmZpcm0ucmVqZWN0KHRoaXMpO1xuICAgIHRoaXMuX2NvbmZpcm0gPSBudWxsO1xuICAgIHRoaXMuX3VwZGF0ZUNoaWxkcmVuKHRoaXMudmFsaWRhdGVPblJlbmRlcik7XG4gIH1cblxuICBfZ2V0U3VibWl0QnRuKCkge1xuICAgIHJldHVybiB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignI3N1Ym1pdCcpO1xuICB9XG5cbiAgX2dldFJlc2V0QnRuKCkge1xuICAgIHJldHVybiB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignI3Jlc2V0Jyk7XG4gIH1cblxuICBfZGlzcGF0Y2hDaGFuZ2UoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX2NoYW5nZVRpbWVvdXQpO1xuICAgIHRoaXMuX2NoYW5nZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcywgJ2NoYW5nZScsIHsgdGFyZ2V0OiB0aGlzLCB2YWx1ZXM6IHRoaXMuX3ZhbHVlcywgdmFsaWRhdGlvbjogdGhpcy5fdmFsaWRhdG9yUmVzdWx0cyB9KTtcbiAgICB9LCA1MCk7XG4gIH1cblxuICBfb25EZWZhdWx0VmFsdWUoeyBkZXRhaWw6IHsgY3VycmVudFRhcmdldCwgdmFsdWUsIGNvbnRyb2wgfSB9KSB7XG4gICAgaWYgKGNvbnRyb2wudHlwZSA9PT0gJ2ludGVnZXInICYmIHZhbHVlICE9IG51bGwgJiYgKCh2YWx1ZS50cmltICYmIHZhbHVlLmxlbmd0aCA+IDApIHx8IHZhbHVlLmxlbmd0aCA+IDApKSB7XG4gICAgICB2YWx1ZSA9IHBhcnNlSW50KHZhbHVlLCAxMCk7XG4gICAgfVxuICAgIHNldCh0aGlzLl92YWx1ZXMsIGN1cnJlbnRUYXJnZXQuaWQsIHZhbHVlKTtcbiAgfVxuXG4gIF9vbkNoYW5nZSh7IGRldGFpbDogeyBjdXJyZW50VGFyZ2V0LCB2YWx1ZSwgY29udHJvbCB9IH0pIHtcbiAgICB0aGlzLl9zZXRUb3VjaCh0cnVlKTtcbiAgICBpZiAoY29udHJvbC50eXBlID09PSAnaW50ZWdlcicpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdmFsdWUgPSBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgaW50VmFsdWUgPSBOdW1iZXIodmFsdWUpLnZhbHVlT2YoKTtcbiAgICAgICAgaWYgKCFpc05hTihpbnRWYWx1ZSkpIHtcbiAgICAgICAgICB2YWx1ZSA9IGludFZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbHVlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY29udHJvbC50eXBlID09PSAnYXJyYXknICYmIHZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdmFsdWUgPSBudWxsO1xuICAgIH0gZWxzZSBpZiAoY29udHJvbC50eXBlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS50cmltKCkubGVuZ3RoID09PSAwICYmICFjb250cm9sLmVudW0pIHtcbiAgICAgIHZhbHVlID0gbnVsbDtcbiAgICB9IGVsc2UgaWYgKGNvbnRyb2wudHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHZhbHVlID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIGRlbCh0aGlzLl92YWx1ZXMsIGN1cnJlbnRUYXJnZXQuaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXQodGhpcy5fdmFsdWVzLCBjdXJyZW50VGFyZ2V0LmlkLCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5fdXBkYXRlRHluYW1pY0NvbnRyb2xzKCk7XG4gICAgdGhpcy5fdmFsaWRhdG9yUmVzdWx0cyA9IHRoaXMudmFsaWRhdGUoKTtcbiAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgICB0aGlzLl91cGRhdGVBY3Rpb25zKCk7XG4gICAgdGhpcy5fZGlzcGF0Y2hDaGFuZ2UoKTtcbiAgfVxuXG4gIF9vbkNvbnRyb2xSZWFkeShlKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgY29udHJvbEVsZW1lbnQgPSBlLmRldGFpbC5jb250cm9sO1xuICAgIGNvbnN0IGNvbnRyb2wgPSBjb250cm9sRWxlbWVudC5jb250cm9sO1xuICAgIGlmIChjb250cm9sWyd4LXNjaGVtYS1mb3JtJ10pIHtcbiAgICAgIGlmIChjb250cm9sWyd4LXNjaGVtYS1mb3JtJ10uZXZlbnQpIHtcbiAgICAgICAgY29uc3QgZXZlbnQgPSBjb250cm9sWyd4LXNjaGVtYS1mb3JtJ10uZXZlbnQ7XG4gICAgICAgIGRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcywgZXZlbnQubmFtZSwgeyAuLi5ldmVudCwgLi4uZS5kZXRhaWwgfSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX2hhc0NvbmRpdGlvbihjb250cm9sKSkge1xuICAgICAgICB0aGlzLl9keW5hbWljQ29udHJvbHMucHVzaChjb250cm9sRWxlbWVudCk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUR5bmFtaWNDb250cm9sKGNvbnRyb2xFbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBfdXBkYXRlRHluYW1pY0NvbnRyb2xzKCkge1xuICAgIHRoaXMuX2lnbm9yZVByb3BlcnRpZXMgPSBbXTtcbiAgICB0aGlzLl9keW5hbWljQ29udHJvbHMuZm9yRWFjaCgoY29udHJvbEVsZW1lbnQpID0+IHtcbiAgICAgIHRoaXMuX3VwZGF0ZUR5bmFtaWNDb250cm9sKGNvbnRyb2xFbGVtZW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIF91cGRhdGVEeW5hbWljQ29udHJvbChjb250cm9sRWxlbWVudCkge1xuICAgIGNvbnN0IGNvbnRyb2wgPSBjb250cm9sRWxlbWVudC5jb250cm9sO1xuICAgIGlmIChjb250cm9sWyd4LXNjaGVtYS1mb3JtJ10pIHtcbiAgICAgIHRoaXMuX2R5bmFtaWNBdHRyaWJ1dGVzLmZvckVhY2goKGF0dHJpYnV0ZSkgPT4ge1xuICAgICAgICBjb25zdCBpcyA9IHRoaXMuX2V2YWx1YXRlQ29uZGl0aW9uKGNvbnRyb2wsIGF0dHJpYnV0ZSk7XG4gICAgICAgIGlmIChpcykge1xuICAgICAgICAgIGNvbnRyb2xFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsICcnKTtcbiAgICAgICAgICBpZiAoYXR0cmlidXRlID09PSAnaGlkZGVuJykge1xuICAgICAgICAgICAgdGhpcy5faWdub3JlUHJvcGVydGllcy5wdXNoKGNvbnRyb2xFbGVtZW50LmlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udHJvbEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGFzeW5jIHBlcmZvcm1VcGRhdGUoKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5nZXRDb250cm9scygpLm1hcCgoZSkgPT4gZS51cGRhdGVDb21wbGV0ZSkpO1xuICAgIHRoaXMuZ2V0Q29udHJvbHMoKS5mb3JFYWNoKChzKSA9PiB7XG4gICAgICBzLnJlcXVlc3RVcGRhdGUoKTtcbiAgICB9KTtcbiAgICBzdXBlci5wZXJmb3JtVXBkYXRlKCk7XG4gIH1cblxuICBfcmVuZGVyQ29udHJvbChrZXkpIHtcbiAgICAvLyBUaGlzIGlzIHJlcXVpcmUgdG8gY2xlYW4gY2FjaGUgb2YgPGd2LXNjaGVtYS1mb3JtLWNvbnRyb2w+XG4gICAgY29uc3QgY29udHJvbCA9IHsgLi4udGhpcy5zY2hlbWEucHJvcGVydGllc1trZXldIH07XG4gICAgY29uc3QgaXNSZXF1aXJlZCA9ICh0aGlzLnNjaGVtYS5yZXF1aXJlZCAmJiB0aGlzLnNjaGVtYS5yZXF1aXJlZC5pbmNsdWRlcyhrZXkpKSB8fCB0aGlzLl9ldmFsdWF0ZUNvbmRpdGlvbihjb250cm9sLCAncmVxdWlyZWQnKTtcbiAgICBjb25zdCBpc0Rpc2FibGVkID0gKHRoaXMuc2NoZW1hLmRpc2FibGVkICYmIHRoaXMuc2NoZW1hLmRpc2FibGVkLmluY2x1ZGVzKGtleSkpIHx8IHRoaXMuX2V2YWx1YXRlQ29uZGl0aW9uKGNvbnRyb2wsICdkaXNhYmxlZCcpO1xuICAgIGNvbnN0IGlzSGlkZGVuID0gdGhpcy5fZXZhbHVhdGVDb25kaXRpb24oY29udHJvbCwgJ2hpZGRlbicpO1xuICAgIGlmIChpc0hpZGRlbikge1xuICAgICAgdGhpcy5faWdub3JlUHJvcGVydGllcy5wdXNoKGtleSk7XG4gICAgfVxuICAgIGNvbnN0IGlzUmVhZG9ubHkgPSB0aGlzLnJlYWRvbmx5IHx8IGNvbnRyb2wucmVhZE9ubHkgPT09IHRydWU7XG4gICAgY29uc3QgaXNXcml0ZU9ubHkgPSBjb250cm9sLndyaXRlT25seSA9PT0gdHJ1ZTtcbiAgICBjb25zdCB2YWx1ZSA9IGdldCh0aGlzLl92YWx1ZXMsIGtleSk7XG4gICAgcmV0dXJuIGh0bWxgPGd2LXNjaGVtYS1mb3JtLWNvbnRyb2xcbiAgICAgIC5pZD1cIiR7a2V5fVwiXG4gICAgICAuZXJyb3JzPVwiJHt0aGlzLmVycm9yc31cIlxuICAgICAgLmNvbnRyb2w9XCIke2NvbnRyb2x9XCJcbiAgICAgIC5za2VsZXRvbj1cIiR7dGhpcy5za2VsZXRvbn1cIlxuICAgICAgLnZhbHVlPVwiJHt2YWx1ZX1cIlxuICAgICAgP3JlYWRvbmx5PVwiJHtpc1JlYWRvbmx5fVwiXG4gICAgICA/d3JpdGVvbmx5PVwiJHtpc1dyaXRlT25seX1cIlxuICAgICAgP3JlcXVpcmVkPVwiJHtpc1JlcXVpcmVkfVwiXG4gICAgICA/ZGlzYWJsZWQ9XCIke2lzRGlzYWJsZWR9XCJcbiAgICAgID9oaWRkZW49XCIke2lzSGlkZGVufVwiXG4gICAgPjwvZ3Ytc2NoZW1hLWZvcm0tY29udHJvbD5gO1xuICB9XG5cbiAgX2hhc0NvbmRpdGlvbihjb250cm9sKSB7XG4gICAgaWYgKGNvbnRyb2xbJ3gtc2NoZW1hLWZvcm0nXSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2R5bmFtaWNBdHRyaWJ1dGVzLmZpbmQoKGNvbmRpdGlvbikgPT4gY29udHJvbFsneC1zY2hlbWEtZm9ybSddW2NvbmRpdGlvbl0gIT0gbnVsbCkgIT0gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgX2V2YWx1YXRlQ29uZGl0aW9uKGNvbnRyb2wsIGNvbmRpdGlvbktleSkge1xuICAgIGlmIChjb250cm9sWyd4LXNjaGVtYS1mb3JtJ10gPT0gbnVsbCB8fCBjb250cm9sWyd4LXNjaGVtYS1mb3JtJ11bY29uZGl0aW9uS2V5XSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGNvbmRpdGlvbiA9IGNvbnRyb2xbJ3gtc2NoZW1hLWZvcm0nXVtjb25kaXRpb25LZXldO1xuICAgIGlmICh0eXBlb2YgY29uZGl0aW9uID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHJldHVybiBjb25kaXRpb247XG4gICAgfVxuICAgIGlmICghQXJyYXkuaXNBcnJheShjb25kaXRpb24pKSB7XG4gICAgICAvLyBjb25kaXRpb24gaXNuJ3QgYW4gYXJyYXksIGlnbm9yZSB0aGUgY29uZGl0aW9uXG4gICAgICBjb25zb2xlLndhcm4oYCcke2NvbmRpdGlvbktleX0nIGF0dHJpYnV0ZSBvZiAneC1zY2hlbWEtZm9ybScgc2hvdWxkIGJlIGFuIGFycmF5YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdCA9IHRydWU7XG4gICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2YgY29uZGl0aW9uKSB7XG4gICAgICAvLyBvcGVyYXRpb24gb25seSBoYXZlIG9uZSBvcGVyYXRvciB3aXRoIGEgc2luZ2xlIG9iamVjdCBjb250YWluaW5nIG9wZXJhbmQgdmFsdWVzXG4gICAgICBjb25zdCBvcGVyYXRvciA9IE9iamVjdC5rZXlzKG9wZXJhdGlvbilbMF07XG5cbiAgICAgIHN3aXRjaCAob3BlcmF0b3IpIHtcbiAgICAgICAgY2FzZSAnJG5lcSc6XG4gICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICYmIHRoaXMuX2V2YWx1YXRlTm90RXF1YWxzQ29uZGl0aW9uKGNvbnRyb2wsIG9wZXJhdGlvbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJyRlcSc6XG4gICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICYmIHRoaXMuX2V2YWx1YXRlRXF1YWxzQ29uZGl0aW9uKGNvbnRyb2wsIG9wZXJhdGlvbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJyRub2RlZic6XG4gICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICYmIHRoaXMuX2V2YWx1YXRlTm90RGVmQ29uZGl0aW9uKGNvbnRyb2wsIG9wZXJhdGlvbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJyRkZWYnOlxuICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCAmJiB0aGlzLl9ldmFsdWF0ZURlZkNvbmRpdGlvbihjb250cm9sLCBvcGVyYXRpb24pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGNvbnNvbGUud2FybihgVW5zdXBwb3J0ZWQgb3BlcmF0b3IgJyR7b3BlcmF0b3J9JyBvbiBkaXNhYmxlIGNvbmRpdGlvbmApO1xuICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBfZXZhbHVhdGVOb3RFcXVhbHNDb25kaXRpb24oY29udHJvbCwgY29uZGl0aW9uKSB7XG4gICAgcmV0dXJuICF0aGlzLl9ldmFsdWF0ZUVxdWFsc0NvbmRpdGlvbihjb250cm9sLCBjb25kaXRpb24pO1xuICB9XG5cbiAgX2V2YWx1YXRlRXF1YWxzQ29uZGl0aW9uKGNvbnRyb2wsIGNvbmRpdGlvbikge1xuICAgIGNvbnN0IG9wZXJhdG9yID0gT2JqZWN0LmtleXMoY29uZGl0aW9uKVswXTtcbiAgICBjb25zdCBvcGVyYW5kcyA9IGNvbmRpdGlvbltvcGVyYXRvcl07XG4gICAgY29uc3QgbW9kZWxBdHRyaWJ1dGVzID0gT2JqZWN0LmtleXMob3BlcmFuZHMpO1xuICAgIHJldHVybiBtb2RlbEF0dHJpYnV0ZXNcbiAgICAgIC5tYXAoKG1vZGVsQXR0cmlidXRlKSA9PiB7XG4gICAgICAgIGNvbnN0IHRlc3RWYWx1ZSA9IG9wZXJhbmRzW21vZGVsQXR0cmlidXRlXTtcbiAgICAgICAgbGV0IHZhbHVlID0gZ2V0KHRoaXMuX3ZhbHVlcywgbW9kZWxBdHRyaWJ1dGUpO1xuICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCAmJiBjb250cm9sLnR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdmFsdWUgPSAnJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0ZXN0VmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRlc3RWYWx1ZS5pbmNsdWRlcyh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSB0ZXN0VmFsdWU7XG4gICAgICB9KVxuICAgICAgLnJlZHVjZSgoYWNjLCBjdXJyZW50KSA9PiBhY2MgfHwgY3VycmVudCk7XG4gIH1cblxuICBfZXZhbHVhdGVOb3REZWZDb25kaXRpb24oY29udHJvbCwgY29uZGl0aW9uKSB7XG4gICAgY29uc3Qgb3BlcmF0b3IgPSBPYmplY3Qua2V5cyhjb25kaXRpb24pWzBdO1xuICAgIGNvbnN0IG1vZGVsQXR0cmlidXRlID0gY29uZGl0aW9uW29wZXJhdG9yXTtcbiAgICByZXR1cm4gZ2V0KHRoaXMuX3ZhbHVlcywgbW9kZWxBdHRyaWJ1dGUpID09PSB1bmRlZmluZWQgfHwgZ2V0KHRoaXMuX3ZhbHVlcywgbW9kZWxBdHRyaWJ1dGUpID09PSBudWxsO1xuICB9XG5cbiAgX2V2YWx1YXRlRGVmQ29uZGl0aW9uKGNvbnRyb2wsIGNvbmRpdGlvbikge1xuICAgIHJldHVybiAhdGhpcy5fZXZhbHVhdGVOb3REZWZDb25kaXRpb24oY29udHJvbCwgY29uZGl0aW9uKTtcbiAgfVxuXG4gIF9yZW5kZXJQYXJ0KCkge1xuICAgIGlmICh0aGlzLl9jb25maXJtKSB7XG4gICAgICByZXR1cm4gaHRtbGA8ZGl2IGNsYXNzPVwiY29uZmlybS1ib3hcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImVycm9yXCI+VGhlIGNvbmZpZ3VyYXRpb24gaXMgbm90IHZhbGlkIGFuZCBjYW5ub3QgYmUgc2F2ZWQuPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb25maXJtLWJveF9hY3Rpb25zXCI+XG4gICAgICAgICAgPGd2LWJ1dHRvbiBAZ3YtYnV0dG9uOmNsaWNrPVwiJHt0aGlzLl9vbkNvbmZpcm1SZXNldH1cIiBvdXRsaW5lZCBpY29uPVwiZ2VuZXJhbDp1cGRhdGVcIiBkYW5nZXI+TG9zZSBjaGFuZ2VzPC9ndi1idXR0b24+XG4gICAgICAgICAgPGd2LWJ1dHRvbiBAZ3YtYnV0dG9uOmNsaWNrPVwiJHt0aGlzLl9vbkNvbmZpcm1FZGl0fVwiIGljb249XCJkZXNpZ246ZWRpdFwiPkVkaXQ8L2d2LWJ1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5gO1xuICAgIH1cbiAgICBjb25zdCBrZXlzID0gdGhpcy5zY2hlbWEucHJvcGVydGllcyA/IE9iamVjdC5rZXlzKHRoaXMuc2NoZW1hLnByb3BlcnRpZXMpIDogW107XG4gICAgdGhpcy5faWdub3JlUHJvcGVydGllcyA9IFtdO1xuICAgIHJldHVybiByZXBlYXQoXG4gICAgICBrZXlzLFxuICAgICAgKGtleSkgPT4ga2V5LFxuICAgICAgKGtleSkgPT4gdGhpcy5fcmVuZGVyQ29udHJvbChrZXkpLFxuICAgICk7XG4gIH1cblxuICBnZXRDb250cm9scygpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbCgnZ3Ytc2NoZW1hLWZvcm0tY29udHJvbCcpKTtcbiAgfVxuXG4gIGdldENvbnRyb2woaWQpIHtcbiAgICByZXR1cm4gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoYFtpZD1cIiR7aWR9XCJdYCk7XG4gIH1cblxuICBfZ2V0RXJyb3JzKCkge1xuICAgIHJldHVybiAodGhpcy5fdmFsaWRhdG9yUmVzdWx0cy5lcnJvcnMgfHwgW10pLmZpbHRlcigoZXJyb3IpID0+IHtcbiAgICAgIGxldCBpZCA9IGAke2Vycm9yLnByb3BlcnR5LnJlcGxhY2UoJ2luc3RhbmNlLicsICcnKX1gO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGVycm9yLmFyZ3VtZW50KSkge1xuICAgICAgICBpZCA9IGAke2lkfS4ke2Vycm9yLmFyZ3VtZW50fWA7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVycm9yS2V5ID0gYHgtc2NoZW1hLWZvcm0uZXJyb3JzLiR7aWR9LiR7ZXJyb3IubmFtZX1gO1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZ2V0KHRoaXMuc2NoZW1hLCBlcnJvcktleSk7XG4gICAgICBpZiAoZXJyb3JNZXNzYWdlKSB7XG4gICAgICAgIGVycm9yLm1lc3NhZ2UgPSBlcnJvck1lc3NhZ2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gIXRoaXMuX2lnbm9yZVByb3BlcnRpZXMuaW5jbHVkZXMoaWQpO1xuICAgIH0pO1xuICB9XG5cbiAgdmFsaWRhdGUoKSB7XG4gICAgaWYgKHRoaXMuc2NoZW1hKSB7XG4gICAgICAvLyBBZGRpdGlvbmFsIHByb3BlcnRpZXMgc2hvdWxkIG5vdCBibG9jayB0aGUgdmFsaWRhdGlvbiBvZiB0aGUgZm9ybVxuICAgICAgdGhpcy5fdmFsaWRhdG9yUmVzdWx0cyA9IHRoaXMuX3ZhbGlkYXRvci52YWxpZGF0ZSh0aGlzLl92YWx1ZXMsIHsgLi4udGhpcy5zY2hlbWEsIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB0cnVlIH0pO1xuICAgICAgdGhpcy5lcnJvcnMgPSB0aGlzLl9nZXRFcnJvcnMoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRvclJlc3VsdHM7XG4gIH1cblxuICBpc1ZhbGlkKCkge1xuICAgIGlmICh0aGlzLl92YWxpZGF0b3JSZXN1bHRzLnZhbGlkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2dldEVycm9ycygpID09PSAwO1xuICB9XG5cbiAgaXNUb3VjaCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdG91Y2ggfHwgKHRoaXMuZGlydHkgJiYgdGhpcy52YWxpZGF0ZU9uUmVuZGVyKTtcbiAgfVxuXG4gIGNhblN1Ym1pdCgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1RvdWNoKCkgJiYgdGhpcy5pc1ZhbGlkKCk7XG4gIH1cblxuICBfdXBkYXRlQWN0aW9ucygpIHtcbiAgICBjb25zdCBzdWJtaXRCdG4gPSB0aGlzLl9nZXRTdWJtaXRCdG4oKTtcbiAgICBpZiAoc3VibWl0QnRuICE9IG51bGwpIHtcbiAgICAgIGlmICh0aGlzLmNhblN1Ym1pdCgpKSB7XG4gICAgICAgIHRoaXMuX2dldFN1Ym1pdEJ0bigpLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2dldFN1Ym1pdEJ0bigpLnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVzZXRCdG4gPSB0aGlzLl9nZXRSZXNldEJ0bigpO1xuICAgIGlmIChyZXNldEJ0biAhPSBudWxsKSB7XG4gICAgICBpZiAodGhpcy5kaXJ0eSkge1xuICAgICAgICByZXNldEJ0bi5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNldEJ0bi5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgdHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX3VwZGF0ZUNoaWxkcmVuKHdpdGhWYWxpZGF0aW9uKSB7XG4gICAgaWYgKHdpdGhWYWxpZGF0aW9uKSB7XG4gICAgICB0aGlzLl92YWxpZGF0b3JSZXN1bHRzID0ge307XG4gICAgICB0aGlzLmVycm9ycyA9IG51bGw7XG4gICAgICB0aGlzLnJlcXVlc3RWYWxpZGF0aW9uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3VwZGF0ZUFjdGlvbnNUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLl91cGRhdGVBY3Rpb25zKCksIDApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fdXBkYXRlQWN0aW9uc1RpbWVvdXQpO1xuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ192YWx1ZXMnKSkge1xuICAgICAgdGhpcy5nZXRDb250cm9scygpLmZvckVhY2goKGNvbnRyb2wpID0+IHtcbiAgICAgICAgY29udHJvbC52YWx1ZSA9IGdldCh0aGlzLl92YWx1ZXMsIGNvbnRyb2wuaWQpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuX3VwZGF0ZUNoaWxkcmVuKHRoaXMudmFsaWRhdGVPblJlbmRlciAmJiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdfdmFsdWVzJykgfHwgY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdzY2hlbWEnKSkpO1xuICB9XG5cbiAgYXN5bmMgZ2V0VXBkYXRlQ29tcGxldGUoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3VwZXIuZ2V0VXBkYXRlQ29tcGxldGUoKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLmdldENvbnRyb2xzKCkubWFwKChlKSA9PiBlLnVwZGF0ZUNvbXBsZXRlKSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICByZXR1cm4gaHRtbGA8Zm9ybSBjbGFzcz1cIiR7Y2xhc3NNYXAoeyBzY3JvbGxhYmxlOiB0aGlzLnNjcm9sbGFibGUgfSl9XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiJHtjbGFzc01hcCh7IGNvbnRhaW5lcjogdHJ1ZSwgY29uZmlybTogdGhpcy5fY29uZmlybSB9KX1cIj5cbiAgICAgICAgJHt0aGlzLmhhc0hlYWRlciA9PT0gdHJ1ZVxuICAgICAgICAgID8gaHRtbGBcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCIke2NsYXNzTWFwKHsgdGl0bGU6IHRydWUsIGNlbnRlcjogdGhpcy5oYXNIZWFkZXIgJiYgIXRoaXMuaGFzRm9vdGVyIH0pfVwiPlxuICAgICAgICAgICAgICAgICAgPHNsb3QgbmFtZT1cInRpdGxlXCI+PC9zbG90PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWZ0XCI+XG4gICAgICAgICAgICAgICAgICA8c2xvdCBuYW1lPVwiaGVhZGVyLWxlZnRcIj48L3Nsb3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgJHt0aGlzLnJlYWRvbmx5ID09PSB0cnVlIHx8IHRoaXMuaGFzRm9vdGVyID09PSB0cnVlXG4gICAgICAgICAgICAgICAgICA/ICcnXG4gICAgICAgICAgICAgICAgICA6IGh0bWxgPGRpdiBjbGFzcz1cInJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGd2LWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJyZXNldFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgc21hbGxcbiAgICAgICAgICAgICAgICAgICAgICAgIEBndi1idXR0b246Y2xpY2s9XCIke3RoaXMuX29uUmVzZXR9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJnZW5lcmFsOnVwZGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIlJlc2V0XCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9ndi1idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPGd2LWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJzdWJtaXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc21hbGxcbiAgICAgICAgICAgICAgICAgICAgICAgIEBndi1idXR0b246Y2xpY2s9XCIke3RoaXMuX29uU3VibWl0fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwiY29kZTpjaGVja1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAudGl0bGU9XCIke3RoaXMuc3VibWl0TGFiZWx9XCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9ndi1idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PiBgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIGBcbiAgICAgICAgICA6ICcnfVxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGVudFwiPiR7dGhpcy5zY2hlbWEgIT0gbnVsbCA/IHRoaXMuX3JlbmRlclBhcnQoKSA6IGh0bWxgYH08L2Rpdj5cbiAgICAgICAgJHt0aGlzLmhhc0Zvb3RlciA9PT0gdHJ1ZSAmJiB0aGlzLnJlYWRvbmx5ICE9PSB0cnVlXG4gICAgICAgICAgPyBodG1sYFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZnRcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgIDxndi1idXR0b24gaWQ9XCJyZXNldFwiIG91dGxpbmVkIEBndi1idXR0b246Y2xpY2s9XCIke3RoaXMuX29uUmVzZXR9XCIgaWNvbj1cImdlbmVyYWw6dXBkYXRlXCIgdGl0bGU9XCJSZXNldFwiPlJlc2V0PC9ndi1idXR0b24+XG4gICAgICAgICAgICAgICAgICA8Z3YtYnV0dG9uIGlkPVwic3VibWl0XCIgQGd2LWJ1dHRvbjpjbGljaz1cIiR7dGhpcy5fb25TdWJtaXR9XCIgaWNvbj1cImNvZGU6Y2hlY2tcIiAudGl0bGU9XCIke3RoaXMuc3VibWl0TGFiZWx9XCJcbiAgICAgICAgICAgICAgICAgICAgPiR7dGhpcy5zdWJtaXRMYWJlbH08L2d2LWJ1dHRvblxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIGBcbiAgICAgICAgICA6ICcnfVxuICAgICAgPC9kaXY+XG4gICAgPC9mb3JtPmA7XG4gIH1cblxuICBzdGF0aWMgZ2V0IHN0eWxlcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgZW1wdHksXG4gICAgICAvLyBsYW5ndWFnZT1DU1NcbiAgICAgIGNzc2BcbiAgICAgICAgOmhvc3Qge1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgbWFyZ2luOiAwLjJyZW07XG4gICAgICAgICAgLS1iZ2M6IHZhcigtLWd2LXNjaGVtYS1mb3JtLS1iZ2MsICNmZmZmZmYpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9ybSB7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9ybS5zY3JvbGxhYmxlIHtcbiAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgdG9wOiAwO1xuICAgICAgICAgIGJvdHRvbTogMDtcbiAgICAgICAgICBsZWZ0OiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgLmNvbnRhaW5lciB7XG4gICAgICAgICAgZmxleC1ncm93OiAxO1xuXG4gICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmdjKTtcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cbiAgICAgICAgICAvKiBmb3IgRmlyZWZveCAqL1xuICAgICAgICAgIG1pbi1oZWlnaHQ6IDA7XG4gICAgICAgIH1cblxuICAgICAgICAuaGVhZGVyLFxuICAgICAgICAuZm9vdGVyLFxuICAgICAgICAuY29udGVudCB7XG4gICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tYmdjKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5jb250ZW50IHtcbiAgICAgICAgICBmbGV4LWdyb3c6IDE7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICAgIGFsaWduLXNlbGY6IGNlbnRlcjtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcblxuICAgICAgICAgIC8qIGZvciBGaXJlZm94ICovXG4gICAgICAgICAgbWluLWhlaWdodDogMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5jb250ZW50ID4gZ3Ytc2NoZW1hLWZvcm0tY29udHJvbCB7XG4gICAgICAgICAgYWxpZ24tc2VsZjogY2VudGVyO1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9ybS5zY3JvbGxhYmxlIC5jb250ZW50IHtcbiAgICAgICAgICBvdmVyZmxvdzogYXV0bztcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcm0uc2Nyb2xsYWJsZSAuY29udGVudCA+IGd2LXNjaGVtYS1mb3JtLWNvbnRyb2wge1xuICAgICAgICAgIG1heC13aWR0aDogNzc1cHg7XG4gICAgICAgICAgd2lkdGg6IDk1JTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5oZWFkZXIsXG4gICAgICAgIC5mb290ZXIge1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICBtaW4taGVpZ2h0OiA0NXB4O1xuICAgICAgICAgIC0tZ3YtaWNvbi0tczogMjZweDtcbiAgICAgICAgICAtLWd2LWljb24tLWM6ICNiZmJmYmY7XG4gICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgICBwYWRkaW5nOiAwIDAuNXJlbTtcbiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIH1cblxuICAgICAgICAuaGVhZGVyIHtcbiAgICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2Q5ZDlkOTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5mb290ZXIge1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgICAgIHBhZGRpbmc6IDFyZW07XG4gICAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkOWQ5ZDk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtLnNjcm9sbGFibGUgLmZvb3RlciB7XG4gICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICAgIH1cblxuICAgICAgICAuZm9vdGVyIC5sZWZ0LFxuICAgICAgICAuZm9vdGVyIC5yaWdodCB7XG4gICAgICAgICAgbWF4LXdpZHRoOiA0MDBweDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5oZWFkZXIgLmxlZnQsXG4gICAgICAgIC5mb290ZXIgLmxlZnQsXG4gICAgICAgIC5oZWFkZXIgLnJpZ2h0LFxuICAgICAgICAuZm9vdGVyIC5yaWdodCB7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBmbGV4OiAxO1xuICAgICAgICAgIHotaW5kZXg6IDEwO1xuICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIH1cblxuICAgICAgICAuaGVhZGVyIC5yaWdodCxcbiAgICAgICAgLmZvb3RlciAucmlnaHQge1xuICAgICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG4gICAgICAgIH1cblxuICAgICAgICAuaGVhZGVyIC50aXRsZSB7XG4gICAgICAgICAgY29sb3I6ICMyODQ0NGY7XG4gICAgICAgICAgZm9udC1zaXplOiAxOHB4O1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC5oZWFkZXIgLnRpdGxlLmNlbnRlciB7XG4gICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgIHRvcDogMDtcbiAgICAgICAgICBsZWZ0OiAwO1xuICAgICAgICAgIGJvdHRvbTogMDtcbiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC5jb25maXJtLWJveCB7XG4gICAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICAgIHBhZGRpbmc6IDFyZW07XG4gICAgICAgICAgZm9udC1zdHlsZTogaXRhbGljO1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblxuICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgLmNvbmZpcm0tYm94X2FjdGlvbnMge1xuICAgICAgICAgIHBhZGRpbmc6IDFyZW0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5jb25maXJtIC5oZWFkZXIgLmxlZnQsXG4gICAgICAgIC5jb25maXJtIC5oZWFkZXIgLnJpZ2h0LFxuICAgICAgICAuY29uZmlybSAuZm9vdGVyIC5sZWZ0LFxuICAgICAgICAuY29uZmlybSAuZm9vdGVyIC5yaWdodCB7XG4gICAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgICAgfVxuICAgICAgYCxcbiAgICBdO1xuICB9XG59XG5cbndpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ2d2LXNjaGVtYS1mb3JtJywgR3ZTY2hlbWFGb3JtKTtcbiJdfQ==