@gravitee/ui-components 3.24.5-renovate-github-markdown-css-5-x-6cd8067 → 3.25.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/assets/css/github-markdown-css/github-markdown.css +545 -500
  2. package/assets/i18n/en.json +3 -0
  3. package/assets/i18n/fr.json +3 -0
  4. package/assets/icons/design.svg +1 -1
  5. package/package.json +2 -9
  6. package/src/atoms/gv-autocomplete.js +132 -156
  7. package/src/atoms/gv-button.js +73 -248
  8. package/src/atoms/gv-checkbox.js +45 -103
  9. package/src/atoms/gv-date-picker-calendar.js +312 -393
  10. package/src/atoms/gv-date-picker-cell.js +57 -81
  11. package/src/atoms/gv-date-picker.js +180 -319
  12. package/src/atoms/gv-file-upload.js +85 -195
  13. package/src/atoms/gv-icon.js +13 -34
  14. package/src/atoms/gv-image.js +31 -66
  15. package/src/atoms/gv-input-message.js +12 -37
  16. package/src/atoms/gv-input.js +117 -148
  17. package/src/atoms/gv-link.js +47 -125
  18. package/src/atoms/gv-message.js +18 -69
  19. package/src/atoms/gv-metric.js +19 -68
  20. package/src/atoms/gv-relative-time.js +67 -38
  21. package/src/atoms/gv-select-native.js +96 -215
  22. package/src/atoms/gv-select.js +110 -230
  23. package/src/atoms/gv-spinner.js +5 -26
  24. package/src/atoms/gv-state.js +25 -66
  25. package/src/atoms/gv-switch.js +40 -160
  26. package/src/atoms/gv-tag.js +26 -78
  27. package/src/atoms/gv-text.js +22 -83
  28. package/src/charts/gv-chart-bar.js +22 -18
  29. package/src/charts/gv-chart-gauge.js +28 -31
  30. package/src/charts/gv-chart-histogram.js +18 -10
  31. package/src/charts/gv-chart-line.js +70 -59
  32. package/src/charts/gv-chart-map.js +44 -42
  33. package/src/charts/gv-chart-pie.js +18 -14
  34. package/src/index.js +1 -0
  35. package/src/lib/cron-expression.js +40 -35
  36. package/src/lib/date.js +10 -1
  37. package/src/lib/events.js +3 -1
  38. package/src/lib/http-client-schema-form.js +13 -12
  39. package/src/lib/http.js +57 -56
  40. package/src/lib/i18n.js +30 -22
  41. package/src/lib/item.js +13 -12
  42. package/src/lib/properties.js +77 -42
  43. package/src/lib/schema-form.js +4 -5
  44. package/src/lib/studio.js +13 -60
  45. package/src/lib/style.js +8 -8
  46. package/src/lib/text-format.js +14 -7
  47. package/src/lib/theme.js +8 -5
  48. package/src/lib/utils.js +17 -18
  49. package/src/mixins/chart-element.js +31 -54
  50. package/src/mixins/input-element.js +60 -47
  51. package/src/mixins/item-resource.js +34 -32
  52. package/src/mixins/keyboard-element.js +6 -5
  53. package/src/mixins/update-after-browser.js +4 -1
  54. package/src/mixins/with-resize-observer.js +23 -13
  55. package/src/mixins/with-skeleton-attribute.js +54 -48
  56. package/src/molecules/gv-card-full.js +26 -147
  57. package/src/molecules/gv-card-list.js +13 -42
  58. package/src/molecules/gv-card.js +17 -91
  59. package/src/molecules/gv-category-list.js +6 -17
  60. package/src/molecules/gv-category.js +23 -103
  61. package/src/molecules/gv-code.js +81 -143
  62. package/src/molecules/gv-confirm.js +41 -71
  63. package/src/molecules/gv-cron-editor.js +143 -389
  64. package/src/molecules/gv-dropdown-menu.js +14 -46
  65. package/src/molecules/gv-expandable.js +31 -59
  66. package/src/molecules/gv-expression-language.js +176 -138
  67. package/src/molecules/gv-identity-picture.js +42 -65
  68. package/src/molecules/gv-list.js +42 -134
  69. package/src/molecules/gv-metrics.js +37 -49
  70. package/src/molecules/gv-modal.js +28 -95
  71. package/src/molecules/gv-nav.js +49 -75
  72. package/src/molecules/gv-option.js +57 -130
  73. package/src/molecules/gv-plans.js +86 -209
  74. package/src/molecules/gv-popover.js +57 -177
  75. package/src/molecules/gv-promote.js +28 -146
  76. package/src/molecules/gv-rating-list.js +69 -195
  77. package/src/molecules/gv-rating.js +52 -105
  78. package/src/molecules/gv-row-expandable.js +5 -11
  79. package/src/molecules/gv-row.js +21 -147
  80. package/src/molecules/gv-stats.js +23 -48
  81. package/src/molecules/gv-stepper.js +43 -187
  82. package/src/molecules/gv-table.js +199 -309
  83. package/src/molecules/gv-tree.js +33 -156
  84. package/src/organisms/gv-documentation.js +45 -128
  85. package/src/organisms/gv-header.js +37 -195
  86. package/src/organisms/gv-http-client.js +32 -168
  87. package/src/organisms/gv-menu.js +37 -158
  88. package/src/organisms/gv-newsletter-subscription.js +48 -189
  89. package/src/organisms/gv-pagination.js +49 -77
  90. package/src/organisms/gv-properties.js +271 -492
  91. package/src/organisms/gv-resizable-views.js +41 -259
  92. package/src/organisms/gv-resources.js +168 -275
  93. package/src/organisms/gv-schema-form-array.js +49 -159
  94. package/src/organisms/gv-schema-form-control-object.js +59 -73
  95. package/src/organisms/gv-schema-form-control.js +107 -134
  96. package/src/organisms/gv-schema-form.js +219 -280
  97. package/src/organisms/gv-tabs.js +66 -98
  98. package/src/organisms/gv-user-menu.js +36 -201
  99. package/src/organisms/gv-vertical-menu.js +20 -61
  100. package/src/policy-studio/gv-flow-step.js +106 -245
  101. package/src/policy-studio/gv-flow.js +125 -304
  102. package/src/policy-studio/gv-policy-studio-menu.js +157 -471
  103. package/src/policy-studio/gv-policy-studio.js +714 -760
  104. package/src/styles/empty.js +3 -20
  105. package/src/styles/input.js +3 -247
  106. package/src/styles/link.js +3 -16
  107. package/src/styles/shapes.js +1 -0
  108. package/src/styles/skeleton.js +3 -37
  109. package/src/styles/zoom.js +3 -24
  110. package/src/theme/gv-theme.js +21 -60
  111. package/CHANGELOG.md +0 -1260
  112. package/LICENSE.txt +0 -202
  113. package/README.md +0 -195
  114. package/src/.eslintrc.js +0 -19
  115. 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,70 @@ 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
+ },
104
+ groups: {
105
+ type: Array
106
+ }
63
107
  };
64
108
  }
65
109
 
@@ -76,6 +120,7 @@ export class GvSchemaForm extends LitElement {
76
120
  this._ignoreProperties = [];
77
121
  this._dynamicControls = [];
78
122
  this._dynamicAttributes = ['disabled', 'required', 'hidden'];
123
+ this.groups = null;
79
124
  this.addEventListener('gv-schema-form-control:default-value', this._onDefaultValue.bind(this));
80
125
  this.addEventListener('gv-schema-form-control:change', this._onChange.bind(this));
81
126
  this.addEventListener('gv-schema-form-control:control-ready', this._onControlReady.bind(this));
@@ -84,10 +129,12 @@ export class GvSchemaForm extends LitElement {
84
129
  set values(values) {
85
130
  if (!deepEqual(this._values, values)) {
86
131
  if (values) {
87
- this._initialValues = { ...values };
132
+ this._initialValues = { ...values
133
+ };
88
134
  } else {
89
135
  this._initialValues = {};
90
136
  }
137
+
91
138
  this._values = deepClone(this._initialValues);
92
139
  }
93
140
  }
@@ -99,8 +146,10 @@ export class GvSchemaForm extends LitElement {
99
146
  reset(values = null) {
100
147
  this._values = deepClone(values || this._initialValues);
101
148
  this._touch = false;
149
+
102
150
  this._setDirty(false);
103
- this.getControls().forEach((s) => {
151
+
152
+ this.getControls().forEach(s => {
104
153
  s.requestUpdate();
105
154
  });
106
155
  }
@@ -114,6 +163,7 @@ export class GvSchemaForm extends LitElement {
114
163
  clearTimeout(this._validateTimeout);
115
164
  this._validateTimeout = setTimeout(() => {
116
165
  this.validate();
166
+
117
167
  this._updateActions();
118
168
  }, 350);
119
169
  }
@@ -124,13 +174,20 @@ export class GvSchemaForm extends LitElement {
124
174
 
125
175
  _onSubmit() {
126
176
  const validatorResults = this.validate();
177
+
127
178
  if (this.isValid()) {
128
179
  this._initialValues = deepClone(this._values);
129
180
  this.dirty = false;
130
181
  this._touch = false;
131
- dispatchCustomEvent(this, 'submit', { values: this._values, validatorResults });
182
+ dispatchCustomEvent(this, 'submit', {
183
+ values: this._values,
184
+ validatorResults
185
+ });
132
186
  } else {
133
- dispatchCustomEvent(this, 'error', { values: this._values, validatorResults });
187
+ dispatchCustomEvent(this, 'error', {
188
+ values: this._values,
189
+ validatorResults
190
+ });
134
191
  }
135
192
  }
136
193
 
@@ -147,17 +204,26 @@ export class GvSchemaForm extends LitElement {
147
204
  if (this._confirm && this._confirm.promise) {
148
205
  return this._confirm.promise;
149
206
  }
150
- const promise = new Promise((resolve, reject) => (this._confirm = { resolve, reject }));
207
+
208
+ const promise = new Promise((resolve, reject) => this._confirm = {
209
+ resolve,
210
+ reject
211
+ });
151
212
  this._confirm.promise = promise;
152
213
  return promise;
153
214
  }
215
+
154
216
  return Promise.resolve();
155
217
  }
156
218
 
157
219
  _onConfirmReset() {
158
- const { resolve } = this._confirm;
220
+ const {
221
+ resolve
222
+ } = this._confirm;
159
223
  this._confirm = null;
224
+
160
225
  this._onReset();
226
+
161
227
  this.requestUpdate();
162
228
  this.updateComplete.then(() => {
163
229
  resolve(this);
@@ -166,7 +232,9 @@ export class GvSchemaForm extends LitElement {
166
232
 
167
233
  _onConfirmEdit() {
168
234
  this._confirm.reject(this);
235
+
169
236
  this._confirm = null;
237
+
170
238
  this._updateChildren(this.validateOnRender);
171
239
  }
172
240
 
@@ -181,24 +249,43 @@ export class GvSchemaForm extends LitElement {
181
249
  _dispatchChange() {
182
250
  clearTimeout(this._changeTimeout);
183
251
  this._changeTimeout = setTimeout(() => {
184
- dispatchCustomEvent(this, 'change', { target: this, values: this._values, validation: this._validatorResults });
252
+ dispatchCustomEvent(this, 'change', {
253
+ target: this,
254
+ values: this._values,
255
+ validation: this._validatorResults
256
+ });
185
257
  }, 50);
186
258
  }
187
259
 
188
- _onDefaultValue({ detail: { currentTarget, value, control } }) {
189
- if (control.type === 'integer' && value != null && ((value.trim && value.length > 0) || value.length > 0)) {
260
+ _onDefaultValue({
261
+ detail: {
262
+ currentTarget,
263
+ value,
264
+ control
265
+ }
266
+ }) {
267
+ if (control.type === 'integer' && value != null && (value.trim && value.length > 0 || value.length > 0)) {
190
268
  value = parseInt(value, 10);
191
269
  }
270
+
192
271
  set(this._values, currentTarget.id, value);
193
272
  }
194
273
 
195
- _onChange({ detail: { currentTarget, value, control } }) {
274
+ _onChange({
275
+ detail: {
276
+ currentTarget,
277
+ value,
278
+ control
279
+ }
280
+ }) {
196
281
  this._setTouch(true);
282
+
197
283
  if (control.type === 'integer') {
198
284
  if (typeof value === 'string' && value.trim().length === 0) {
199
285
  value = null;
200
286
  } else {
201
287
  const intValue = Number(value).valueOf();
288
+
202
289
  if (!isNaN(intValue)) {
203
290
  value = intValue;
204
291
  } else {
@@ -214,6 +301,7 @@ export class GvSchemaForm extends LitElement {
214
301
  value = null;
215
302
  }
216
303
  }
304
+
217
305
  if (value == null) {
218
306
  del(this._values, currentTarget.id);
219
307
  } else {
@@ -221,9 +309,12 @@ export class GvSchemaForm extends LitElement {
221
309
  }
222
310
 
223
311
  this._updateDynamicControls();
312
+
224
313
  this._validatorResults = this.validate();
225
314
  this.dirty = true;
315
+
226
316
  this._updateActions();
317
+
227
318
  this._dispatchChange();
228
319
  }
229
320
 
@@ -232,12 +323,16 @@ export class GvSchemaForm extends LitElement {
232
323
  e.preventDefault();
233
324
  const controlElement = e.detail.control;
234
325
  const control = controlElement.control;
326
+
235
327
  if (control['x-schema-form']) {
236
328
  if (control['x-schema-form'].event) {
237
329
  const event = control['x-schema-form'].event;
238
- dispatchCustomEvent(this, event.name, { ...event, ...e.detail });
330
+ dispatchCustomEvent(this, event.name, { ...event,
331
+ ...e.detail
332
+ });
239
333
  } else if (this._hasCondition(control)) {
240
334
  this._dynamicControls.push(controlElement);
335
+
241
336
  this._updateDynamicControl(controlElement);
242
337
  }
243
338
  }
@@ -245,18 +340,22 @@ export class GvSchemaForm extends LitElement {
245
340
 
246
341
  _updateDynamicControls() {
247
342
  this._ignoreProperties = [];
248
- this._dynamicControls.forEach((controlElement) => {
343
+
344
+ this._dynamicControls.forEach(controlElement => {
249
345
  this._updateDynamicControl(controlElement);
250
346
  });
251
347
  }
252
348
 
253
349
  _updateDynamicControl(controlElement) {
254
350
  const control = controlElement.control;
351
+
255
352
  if (control['x-schema-form']) {
256
- this._dynamicAttributes.forEach((attribute) => {
353
+ this._dynamicAttributes.forEach(attribute => {
257
354
  const is = this._evaluateCondition(control, attribute);
355
+
258
356
  if (is) {
259
357
  controlElement.setAttribute(attribute, '');
358
+
260
359
  if (attribute === 'hidden') {
261
360
  this._ignoreProperties.push(controlElement.id);
262
361
  }
@@ -265,12 +364,13 @@ export class GvSchemaForm extends LitElement {
265
364
  }
266
365
  });
267
366
  }
367
+
268
368
  return null;
269
369
  }
270
370
 
271
371
  async performUpdate() {
272
- await Promise.all(this.getControls().map((e) => e.updateComplete));
273
- this.getControls().forEach((s) => {
372
+ await Promise.all(this.getControls().map(e => e.updateComplete));
373
+ this.getControls().forEach(s => {
274
374
  s.requestUpdate();
275
375
  });
276
376
  super.performUpdate();
@@ -278,34 +378,30 @@ export class GvSchemaForm extends LitElement {
278
378
 
279
379
  _renderControl(key) {
280
380
  // 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');
381
+ const control = { ...this.schema.properties[key]
382
+ };
383
+
384
+ const isRequired = this.schema.required && this.schema.required.includes(key) || this._evaluateCondition(control, 'required');
385
+
386
+ const isDisabled = this.schema.disabled && this.schema.disabled.includes(key) || this._evaluateCondition(control, 'disabled');
387
+
284
388
  const isHidden = this._evaluateCondition(control, 'hidden');
389
+
285
390
  if (isHidden) {
286
391
  this._ignoreProperties.push(key);
287
392
  }
393
+
288
394
  const isReadonly = this.readonly || control.readOnly === true;
289
395
  const isWriteOnly = control.writeOnly === true;
290
396
  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>`;
397
+ 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
398
  }
304
399
 
305
400
  _hasCondition(control) {
306
401
  if (control['x-schema-form']) {
307
- return this._dynamicAttributes.find((condition) => control['x-schema-form'][condition] != null) != null;
402
+ return this._dynamicAttributes.find(condition => control['x-schema-form'][condition] != null) != null;
308
403
  }
404
+
309
405
  return false;
310
406
  }
311
407
 
@@ -313,10 +409,13 @@ export class GvSchemaForm extends LitElement {
313
409
  if (control['x-schema-form'] == null || control['x-schema-form'][conditionKey] == null) {
314
410
  return false;
315
411
  }
412
+
316
413
  const condition = control['x-schema-form'][conditionKey];
414
+
317
415
  if (typeof condition === 'boolean') {
318
416
  return condition;
319
417
  }
418
+
320
419
  if (!Array.isArray(condition)) {
321
420
  // condition isn't an array, ignore the condition
322
421
  console.warn(`'${conditionKey}' attribute of 'x-schema-form' should be an array`);
@@ -324,6 +423,7 @@ export class GvSchemaForm extends LitElement {
324
423
  }
325
424
 
326
425
  let result = true;
426
+
327
427
  for (const operation of condition) {
328
428
  // operation only have one operator with a single object containing operand values
329
429
  const operator = Object.keys(operation)[0];
@@ -332,15 +432,19 @@ export class GvSchemaForm extends LitElement {
332
432
  case '$neq':
333
433
  result = result && this._evaluateNotEqualsCondition(control, operation);
334
434
  break;
435
+
335
436
  case '$eq':
336
437
  result = result && this._evaluateEqualsCondition(control, operation);
337
438
  break;
439
+
338
440
  case '$nodef':
339
441
  result = result && this._evaluateNotDefCondition(control, operation);
340
442
  break;
443
+
341
444
  case '$def':
342
445
  result = result && this._evaluateDefCondition(control, operation);
343
446
  break;
447
+
344
448
  default:
345
449
  console.warn(`Unsupported operator '${operator}' on disable condition`);
346
450
  result = false;
@@ -359,19 +463,20 @@ export class GvSchemaForm extends LitElement {
359
463
  const operator = Object.keys(condition)[0];
360
464
  const operands = condition[operator];
361
465
  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);
466
+ return modelAttributes.map(modelAttribute => {
467
+ const testValue = operands[modelAttribute];
468
+ let value = get(this._values, modelAttribute);
469
+
470
+ if (value == null && control.type === 'string') {
471
+ value = '';
472
+ }
473
+
474
+ if (Array.isArray(testValue)) {
475
+ return testValue.includes(value);
476
+ }
477
+
478
+ return value === testValue;
479
+ }).reduce((acc, current) => acc || current);
375
480
  }
376
481
 
377
482
  _evaluateNotDefCondition(control, condition) {
@@ -386,21 +491,32 @@ export class GvSchemaForm extends LitElement {
386
491
 
387
492
  _renderPart() {
388
493
  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>`;
494
+ 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
495
  }
496
+
397
497
  const keys = this.schema.properties ? Object.keys(this.schema.properties) : [];
398
498
  this._ignoreProperties = [];
399
- return repeat(
400
- keys,
401
- (key) => key,
402
- (key) => this._renderControl(key),
403
- );
499
+
500
+ if (this.groups) {
501
+ // Remove undefined group items
502
+ const groupsCleaned = this.groups.reduce((prev, group) => {
503
+ const itemsExistingInSchemaKeys = keys.filter(key => [...(group.items || [])].includes(key));
504
+ prev.push({ ...group,
505
+ items: itemsExistingInSchemaKeys || []
506
+ });
507
+ return prev;
508
+ }, []); // Add non grouped items inside default group
509
+
510
+ const defaultGroup = groupsCleaned.find(g => g.default) || {
511
+ default: true,
512
+ items: []
513
+ };
514
+ const zipGroupedItems = groupsCleaned.reduce((prev, group) => [...prev, ...group.items], []);
515
+ defaultGroup.items = keys.filter(key => !zipGroupedItems.includes(key));
516
+ return repeat(groupsCleaned, group => html`${group.name ? html`<h2 class="group-title">${group.name}</h2> ${repeat(group.items, key => this._renderControl(key))}` : repeat(group.items, key => this._renderControl(key))} `);
517
+ }
518
+
519
+ return html`${repeat([1], () => repeat(keys, key => key, key => this._renderControl(key)))}`;
404
520
  }
405
521
 
406
522
  getControls() {
@@ -412,17 +528,20 @@ export class GvSchemaForm extends LitElement {
412
528
  }
413
529
 
414
530
  _getErrors() {
415
- return (this._validatorResults.errors || []).filter((error) => {
531
+ return (this._validatorResults.errors || []).filter(error => {
416
532
  let id = `${error.property.replace('instance.', '')}`;
533
+
417
534
  if (!Array.isArray(error.argument)) {
418
535
  id = `${id}.${error.argument}`;
419
536
  }
420
537
 
421
538
  const errorKey = `x-schema-form.errors.${id}.${error.name}`;
422
539
  const errorMessage = get(this.schema, errorKey);
540
+
423
541
  if (errorMessage) {
424
542
  error.message = errorMessage;
425
543
  }
544
+
426
545
  return !this._ignoreProperties.includes(id);
427
546
  });
428
547
  }
@@ -430,9 +549,12 @@ export class GvSchemaForm extends LitElement {
430
549
  validate() {
431
550
  if (this.schema) {
432
551
  // Additional properties should not block the validation of the form
433
- this._validatorResults = this._validator.validate(this._values, { ...this.schema, additionalProperties: true });
552
+ this._validatorResults = this._validator.validate(this._values, { ...this.schema,
553
+ additionalProperties: true
554
+ });
434
555
  this.errors = this._getErrors();
435
556
  }
557
+
436
558
  return this._validatorResults;
437
559
  }
438
560
 
@@ -440,11 +562,12 @@ export class GvSchemaForm extends LitElement {
440
562
  if (this._validatorResults.valid) {
441
563
  return true;
442
564
  }
565
+
443
566
  return this._getErrors() === 0;
444
567
  }
445
568
 
446
569
  isTouch() {
447
- return this._touch || (this.dirty && this.validateOnRender);
570
+ return this._touch || this.dirty && this.validateOnRender;
448
571
  }
449
572
 
450
573
  canSubmit() {
@@ -453,6 +576,7 @@ export class GvSchemaForm extends LitElement {
453
576
 
454
577
  _updateActions() {
455
578
  const submitBtn = this._getSubmitBtn();
579
+
456
580
  if (submitBtn != null) {
457
581
  if (this.canSubmit()) {
458
582
  this._getSubmitBtn().removeAttribute('disabled');
@@ -460,7 +584,9 @@ export class GvSchemaForm extends LitElement {
460
584
  this._getSubmitBtn().setAttribute('disabled', true);
461
585
  }
462
586
  }
587
+
463
588
  const resetBtn = this._getResetBtn();
589
+
464
590
  if (resetBtn != null) {
465
591
  if (this.dirty) {
466
592
  resetBtn.removeAttribute('disabled');
@@ -482,226 +608,39 @@ export class GvSchemaForm extends LitElement {
482
608
 
483
609
  async updated(changedProperties) {
484
610
  clearTimeout(this._updateActionsTimeout);
611
+
485
612
  if (changedProperties.has('_values')) {
486
- this.getControls().forEach((control) => {
613
+ this.getControls().forEach(control => {
487
614
  control.value = get(this._values, control.id);
488
615
  });
489
616
  }
617
+
490
618
  this._updateChildren(this.validateOnRender && (changedProperties.has('_values') || changedProperties.has('schema')));
491
619
  }
492
620
 
493
621
  async getUpdateComplete() {
494
622
  const result = await super.getUpdateComplete();
495
- await Promise.all(this.getControls().map((e) => e.updateComplete));
623
+ await Promise.all(this.getControls().map(e => e.updateComplete));
496
624
  return result;
497
625
  }
498
626
 
499
627
  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>`;
628
+ return html`<form class="${classMap({
629
+ scrollable: this.scrollable
630
+ })}"> <div class="${classMap({
631
+ container: true,
632
+ confirm: this._confirm
633
+ })}"> ${this.hasHeader === true ? html` <div class="header"> <div class="${classMap({
634
+ title: true,
635
+ center: this.hasHeader && !this.hasFooter
636
+ })}"> <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
637
  }
550
638
 
551
639
  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
- ];
640
+ return [empty, // language=CSS
641
+ 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>.group-title,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}.group-title{align-self:center;width:100%;color:var(--gv-theme-font-color-dark);font-size:21px;font-weight:600;padding-bottom:.3em;border-bottom:1px solid var(--gv-theme-font-color-dark);margin-top:24px;margin-bottom:16px}`];
704
642
  }
705
- }
706
643
 
644
+ }
707
645
  window.customElements.define('gv-schema-form', GvSchemaForm);
646
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4vbm9kZV9tb2R1bGVzL0BncmF2aXRlZS91aS1jb21wb25lbnRzL29yZ2FuaXNtcy9ndi1zY2hlbWEtZm9ybS5qcyJdLCJuYW1lcyI6WyJMaXRFbGVtZW50IiwiaHRtbCIsImNzcyIsImdldCIsInNldCIsImRlbCIsImRpc3BhdGNoQ3VzdG9tRXZlbnQiLCJkZWVwQ2xvbmUiLCJkZWVwRXF1YWwiLCJjbGFzc01hcCIsInJlcGVhdCIsIlZhbGlkYXRvciIsImVtcHR5IiwiR3ZTY2hlbWFGb3JtIiwicHJvcGVydGllcyIsInNjaGVtYSIsInR5cGUiLCJPYmplY3QiLCJlcnJvcnMiLCJ2YWx1ZXMiLCJzdWJtaXRMYWJlbCIsIlN0cmluZyIsImhhc0Zvb3RlciIsIkJvb2xlYW4iLCJhdHRyaWJ1dGUiLCJoYXNIZWFkZXIiLCJfY29uZmlybSIsIl92YWx1ZXMiLCJkaXJ0eSIsInJlZmxlY3QiLCJoaWRlRGVwcmVjYXRlZCIsInZhbGlkYXRlT25SZW5kZXIiLCJfdmFsaWRhdG9yUmVzdWx0cyIsInNrZWxldG9uIiwiX3RvdWNoIiwicmVhZG9ubHkiLCJzY3JvbGxhYmxlIiwiZ3JvdXBzIiwiQXJyYXkiLCJjb25zdHJ1Y3RvciIsIl92YWxpZGF0b3IiLCJfaWdub3JlUHJvcGVydGllcyIsIl9keW5hbWljQ29udHJvbHMiLCJfZHluYW1pY0F0dHJpYnV0ZXMiLCJhZGRFdmVudExpc3RlbmVyIiwiX29uRGVmYXVsdFZhbHVlIiwiYmluZCIsIl9vbkNoYW5nZSIsIl9vbkNvbnRyb2xSZWFkeSIsIl9pbml0aWFsVmFsdWVzIiwicmVzZXQiLCJfc2V0RGlydHkiLCJnZXRDb250cm9scyIsImZvckVhY2giLCJzIiwicmVxdWVzdFVwZGF0ZSIsIl9vblJlc2V0IiwicmVxdWVzdFZhbGlkYXRpb24iLCJjbGVhclRpbWVvdXQiLCJfdmFsaWRhdGVUaW1lb3V0Iiwic2V0VGltZW91dCIsInZhbGlkYXRlIiwiX3VwZGF0ZUFjdGlvbnMiLCJzdWJtaXQiLCJfb25TdWJtaXQiLCJ2YWxpZGF0b3JSZXN1bHRzIiwiaXNWYWxpZCIsIl9zZXRUb3VjaCIsInRvdWNoIiwiY29uZmlybSIsImlzVG91Y2giLCJwcm9taXNlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJfb25Db25maXJtUmVzZXQiLCJ1cGRhdGVDb21wbGV0ZSIsInRoZW4iLCJfb25Db25maXJtRWRpdCIsIl91cGRhdGVDaGlsZHJlbiIsIl9nZXRTdWJtaXRCdG4iLCJzaGFkb3dSb290IiwicXVlcnlTZWxlY3RvciIsIl9nZXRSZXNldEJ0biIsIl9kaXNwYXRjaENoYW5nZSIsIl9jaGFuZ2VUaW1lb3V0IiwidGFyZ2V0IiwidmFsaWRhdGlvbiIsImRldGFpbCIsImN1cnJlbnRUYXJnZXQiLCJ2YWx1ZSIsImNvbnRyb2wiLCJ0cmltIiwibGVuZ3RoIiwicGFyc2VJbnQiLCJpZCIsImludFZhbHVlIiwiTnVtYmVyIiwidmFsdWVPZiIsImlzTmFOIiwiZW51bSIsImtleXMiLCJfdXBkYXRlRHluYW1pY0NvbnRyb2xzIiwiZSIsInN0b3BQcm9wYWdhdGlvbiIsInByZXZlbnREZWZhdWx0IiwiY29udHJvbEVsZW1lbnQiLCJldmVudCIsIm5hbWUiLCJfaGFzQ29uZGl0aW9uIiwicHVzaCIsIl91cGRhdGVEeW5hbWljQ29udHJvbCIsImlzIiwiX2V2YWx1YXRlQ29uZGl0aW9uIiwic2V0QXR0cmlidXRlIiwicmVtb3ZlQXR0cmlidXRlIiwicGVyZm9ybVVwZGF0ZSIsImFsbCIsIm1hcCIsIl9yZW5kZXJDb250cm9sIiwia2V5IiwiaXNSZXF1aXJlZCIsInJlcXVpcmVkIiwiaW5jbHVkZXMiLCJpc0Rpc2FibGVkIiwiZGlzYWJsZWQiLCJpc0hpZGRlbiIsImlzUmVhZG9ubHkiLCJyZWFkT25seSIsImlzV3JpdGVPbmx5Iiwid3JpdGVPbmx5IiwiZmluZCIsImNvbmRpdGlvbiIsImNvbmRpdGlvbktleSIsImlzQXJyYXkiLCJjb25zb2xlIiwid2FybiIsInJlc3VsdCIsIm9wZXJhdGlvbiIsIm9wZXJhdG9yIiwiX2V2YWx1YXRlTm90RXF1YWxzQ29uZGl0aW9uIiwiX2V2YWx1YXRlRXF1YWxzQ29uZGl0aW9uIiwiX2V2YWx1YXRlTm90RGVmQ29uZGl0aW9uIiwiX2V2YWx1YXRlRGVmQ29uZGl0aW9uIiwib3BlcmFuZHMiLCJtb2RlbEF0dHJpYnV0ZXMiLCJtb2RlbEF0dHJpYnV0ZSIsInRlc3RWYWx1ZSIsInJlZHVjZSIsImFjYyIsImN1cnJlbnQiLCJ1bmRlZmluZWQiLCJfcmVuZGVyUGFydCIsImdyb3Vwc0NsZWFuZWQiLCJwcmV2IiwiZ3JvdXAiLCJpdGVtc0V4aXN0aW5nSW5TY2hlbWFLZXlzIiwiZmlsdGVyIiwiaXRlbXMiLCJkZWZhdWx0R3JvdXAiLCJnIiwiZGVmYXVsdCIsInppcEdyb3VwZWRJdGVtcyIsImZyb20iLCJxdWVyeVNlbGVjdG9yQWxsIiwiZ2V0Q29udHJvbCIsIl9nZXRFcnJvcnMiLCJlcnJvciIsInByb3BlcnR5IiwicmVwbGFjZSIsImFyZ3VtZW50IiwiZXJyb3JLZXkiLCJlcnJvck1lc3NhZ2UiLCJtZXNzYWdlIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJ2YWxpZCIsImNhblN1Ym1pdCIsInN1Ym1pdEJ0biIsInJlc2V0QnRuIiwid2l0aFZhbGlkYXRpb24iLCJfdXBkYXRlQWN0aW9uc1RpbWVvdXQiLCJ1cGRhdGVkIiwiY2hhbmdlZFByb3BlcnRpZXMiLCJoYXMiLCJnZXRVcGRhdGVDb21wbGV0ZSIsInJlbmRlciIsImNvbnRhaW5lciIsInRpdGxlIiwiY2VudGVyIiwic3R5bGVzIiwid2luZG93IiwiY3VzdG9tRWxlbWVudHMiLCJkZWZpbmUiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNBLFVBQVQsRUFBcUJDLElBQXJCLEVBQTJCQyxHQUEzQixRQUFzQyxLQUF0QztBQUNBLFNBQVNDLEdBQVQsRUFBY0MsR0FBZCxFQUFtQkMsR0FBbkIsUUFBOEIsYUFBOUI7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TUFBQUEsTUFBTSxFQUFFLEtBQUtuSyxTQUFMLElBQWtCLENBQUMsS0FBS0g7QUFBL0MsS0FBRCxDQUZ0QixtR0FRRSxLQUFLYSxRQUFMLEtBQWtCLElBQWxCLElBQTBCLEtBQUtiLFNBQUwsS0FBbUIsSUFBN0MsR0FDRSxFQURGLEdBRUVyQixJQUFJLDhFQUtvQixLQUFLdUQsUUFMekIscUdBWW9CLEtBQUtRLFNBWnpCLCtCQWNVLEtBQUs1QyxXQWRmLHdCQVZSLFVBRE4sR0E4QkUsRUFoQ0cseUJBaUNnQixLQUFLTCxNQUFMLElBQWUsSUFBZixHQUFzQixLQUFLeUksV0FBTCxFQUF0QixHQUEyQ3ZKLElBQUksRUFqQy9ELFVBa0NMLEtBQUtxQixTQUFMLEtBQW1CLElBQW5CLElBQTJCLEtBQUthLFFBQUwsS0FBa0IsSUFBN0MsR0FDRWxDLElBQUksdUhBSXFELEtBQUt1RCxRQUoxRCxvR0FLNkMsS0FBS1EsU0FMbEQsK0JBSzBGLEtBQUs1QyxXQUwvRixLQU1PLEtBQUtBLFdBTlosNkJBRE4sR0FZRSxFQTlDRyxpQkFBWDtBQWlERDs7QUFFZ0IsYUFBTnlLLE1BQU0sR0FBRztBQUNsQixXQUFPLENBQ0xqTCxLQURLLEVBRUw7QUFDQVYsSUFBQUEsR0FBRyxpMkRBSEUsQ0FBUDtBQXFLRDs7QUFoc0IwQztBQW1zQjdDNEwsTUFBTSxDQUFDQyxjQUFQLENBQXNCQyxNQUF0QixDQUE2QixnQkFBN0IsRUFBK0NuTCxZQUEvQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEdyYXZpdGVlIHRlYW0gKGh0dHA6Ly9ncmF2aXRlZS5pbylcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyBMaXRFbGVtZW50LCBodG1sLCBjc3MgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgZ2V0LCBzZXQsIGRlbCB9IGZyb20gJ29iamVjdC1wYXRoJztcbmltcG9ydCB7IGRpc3BhdGNoQ3VzdG9tRXZlbnQgfSBmcm9tICcuLi9saWIvZXZlbnRzJztcbmltcG9ydCB7IGRlZXBDbG9uZSwgZGVlcEVxdWFsIH0gZnJvbSAnLi4vbGliL3V0aWxzJztcbmltcG9ydCB7IGNsYXNzTWFwIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvY2xhc3MtbWFwJztcbmltcG9ydCB7IHJlcGVhdCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL3JlcGVhdCc7XG5pbXBvcnQgeyBWYWxpZGF0b3IgfSBmcm9tICdqc29uc2NoZW1hJztcbmltcG9ydCB7IGVtcHR5IH0gZnJvbSAnLi4vc3R5bGVzL2VtcHR5JztcbmltcG9ydCAnLi9ndi1zY2hlbWEtZm9ybS1jb250cm9sJztcblxuLyoqXG4gKiBTY2hlbWEgZm9ybSBjb21wb25lbnRcbiAqXG4gKiBAZmlyZXMgZ3Ytc2NoZW1hLWZvcm06c3VibWl0IC0gZXZlbnQgd2hlbiB1c2VyIHN1Ym1pdCB2YWxpZCBmb3JtXG4gKiBAZmlyZXMgZ3Ytc2NoZW1hLWZvcm06ZXJyb3IgLSBldmVudCB3aGVuIHVzZXIgc3VibWl0IGludmFsaWQgZm9ybVxuICogQGZpcmVzIGd2LXNjaGVtYS1mb3JtOmNoYW5nZSAtIGV2ZW50IHdoZW4gd2hlbiBmb3JtIGNoYW5nZVxuICogQGZpcmVzIGd2LXNjaGVtYS1mb3JtOmNhbmNlbCAtIGV2ZW50IHdoZW4gdXNlciBjYW5jZWwgZm9ybVxuICpcbiAqIEBhdHRyIHtPYmplY3R9IHNjaGVtYSAtIHRoZSBzY2hlbWEgZm9ybSBjb25maWd1cmF0aW9uXG4gKiBAYXR0ciB7T2JqZWN0fSB2YWx1ZXMgLSB0aGUgdmFsdWVzIG9mIGZpZWxkc1xuICogQGF0dHIge09iamVjdH0gZXJyb3JzIC0gdGhlIG1hcCBvZiBlcnJvcnMgYnkgaW5wdXQga2V5XG4gKiBAYXR0ciB7Qm9vbGVhbn0gdmFsaWRhdGUgLSB0byBmb3JjZSB2YWxpZGF0aW9uIG9uIGZpcnN0IHJlbmRlclxuICogQGF0dHIge0Jvb2xlYW59IHJlYWRvbmx5IC0gdHJ1ZSBpZiByZWFkb25seVxuICogQGF0dHIge0Jvb2xlYW59IHNjcm9sbGFibGUgLSB1c2VmdWwgZm9yIG1ha2luZyBjb250ZW50IHNjcm9sbGFibGUgd2l0aCBmaXhlZCBoZWFkZXJzIC8gZm9vdGVyc1xuICpcbiAqIEBjc3Nwcm9wIHtDb2xvcn0gWy0tZ3Ytc2NoZW1hLWZvcm0tLWJnYz0jZmZmZmZmXSAtIEJhY2tncm91bmQgY29sb3JcbiAqIEBjc3Nwcm9wIHtMZW5ndGh9IFstLWd2LXNjaGVtYS1mb3JtLWNvbnRyb2wtLW09MC40cmVtXSAtIENvbnRyb2wgbWFyZ2luXG4gKi9cbmV4cG9ydCBjbGFzcyBHdlNjaGVtYUZvcm0gZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBzY2hlbWE6IHsgdHlwZTogT2JqZWN0IH0sXG4gICAgICBlcnJvcnM6IHsgdHlwZTogT2JqZWN0IH0sXG4gICAgICB2YWx1ZXM6IHsgdHlwZTogT2JqZWN0IH0sXG4gICAgICBzdWJtaXRMYWJlbDogeyB0eXBlOiBTdHJpbmcgfSxcbiAgICAgIGhhc0Zvb3RlcjogeyB0eXBlOiBCb29sZWFuLCBhdHRyaWJ1dGU6ICdoYXMtZm9vdGVyJyB9LFxuICAgICAgaGFzSGVhZGVyOiB7IHR5cGU6IEJvb2xlYW4sIGF0dHJpYnV0ZTogJ2hhcy1oZWFkZXInIH0sXG4gICAgICBfY29uZmlybTogeyB0eXBlOiBPYmplY3QgfSxcbiAgICAgIF92YWx1ZXM6IHsgdHlwZTogT2JqZWN0LCBhdHRyaWJ1dGU6IGZhbHNlIH0sXG4gICAgICBkaXJ0eTogeyB0eXBlOiBCb29sZWFuLCByZWZsZWN0OiB0cnVlIH0sXG4gICAgICBoaWRlRGVwcmVjYXRlZDogeyB0eXBlOiBCb29sZWFuLCBhdHRyaWJ1dGU6ICdoaWRlLWRlcHJlY2F0ZWQnIH0sXG4gICAgICB2YWxpZGF0ZU9uUmVuZGVyOiB7IHR5cGU6IEJvb2xlYW4sIGF0dHJpYnV0ZTogJ3ZhbGlkYXRlLW9uLXJlbmRlcicgfSxcbiAgICAgIF92YWxpZGF0b3JSZXN1bHRzOiB7IHR5cGU6IE9iamVjdCB9LFxuICAgICAgc2tlbGV0b246IHsgdHlwZTogQm9vbGVhbiwgcmVmbGVjdDogdHJ1ZSB9LFxuICAgICAgX3RvdWNoOiB7IHR5cGU6IEJvb2xlYW4gfSxcbiAgICAgIHJlYWRvbmx5OiB7IHR5cGU6IEJvb2xlYW4sIHJlZmxlY3Q6IHRydWUgfSxcbiAgICAgIHNjcm9sbGFibGU6IHsgdHlwZTogQm9vbGVhbiwgcmVmbGVjdDogdHJ1ZSB9LFxuICAgICAgZ3JvdXBzOiB7IHR5cGU6IEFycmF5IH0sXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5oaWRlRGVwcmVjYXRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX3ZhbHVlcyA9IHt9O1xuICAgIHRoaXMuc3VibWl0TGFiZWwgPSAnT2snO1xuICAgIHRoaXMuaGFzSGVhZGVyID0gZmFsc2U7XG4gICAgdGhpcy5oYXNGb290ZXIgPSBmYWxzZTtcbiAgICB0aGlzLl90b3VjaCA9IGZhbHNlO1xuICAgIHRoaXMuX3ZhbGlkYXRvciA9IG5ldyBWYWxpZGF0b3IoKTtcbiAgICB0aGlzLl92YWxpZGF0b3JSZXN1bHRzID0ge307XG4gICAgdGhpcy5faWdub3JlUHJvcGVydGllcyA9IFtdO1xuICAgIHRoaXMuX2R5bmFtaWNDb250cm9scyA9IFtdO1xuICAgIHRoaXMuX2R5bmFtaWNBdHRyaWJ1dGVzID0gWydkaXNhYmxlZCcsICdyZXF1aXJlZCcsICdoaWRkZW4nXTtcbiAgICB0aGlzLmdyb3VwcyA9IG51bGw7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdndi1zY2hlbWEtZm9ybS1jb250cm9sOmRlZmF1bHQtdmFsdWUnLCB0aGlzLl9vbkRlZmF1bHRWYWx1ZS5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2d2LXNjaGVtYS1mb3JtLWNvbnRyb2w6Y2hhbmdlJywgdGhpcy5fb25DaGFuZ2UuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdndi1zY2hlbWEtZm9ybS1jb250cm9sOmNvbnRyb2wtcmVhZHknLCB0aGlzLl9vbkNvbnRyb2xSZWFkeS5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIHNldCB2YWx1ZXModmFsdWVzKSB7XG4gICAgaWYgKCFkZWVwRXF1YWwodGhpcy5fdmFsdWVzLCB2YWx1ZXMpKSB7XG4gICAgICBpZiAodmFsdWVzKSB7XG4gICAgICAgIHRoaXMuX2luaXRpYWxWYWx1ZXMgPSB7IC4uLnZhbHVlcyB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faW5pdGlhbFZhbHVlcyA9IHt9O1xuICAgICAgfVxuICAgICAgdGhpcy5fdmFsdWVzID0gZGVlcENsb25lKHRoaXMuX2luaXRpYWxWYWx1ZXMpO1xuICAgIH1cbiAgfVxuXG4gIGdldCB2YWx1ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlcztcbiAgfVxuXG4gIHJlc2V0KHZhbHVlcyA9IG51bGwpIHtcbiAgICB0aGlzLl92YWx1ZXMgPSBkZWVwQ2xvbmUodmFsdWVzIHx8IHRoaXMuX2luaXRpYWxWYWx1ZXMpO1xuICAgIHRoaXMuX3RvdWNoID0gZmFsc2U7XG4gICAgdGhpcy5fc2V0RGlydHkoZmFsc2UpO1xuICAgIHRoaXMuZ2V0Q29udHJvbHMoKS5mb3JFYWNoKChzKSA9PiB7XG4gICAgICBzLnJlcXVlc3RVcGRhdGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIF9vblJlc2V0KCkge1xuICAgIHRoaXMucmVzZXQoKTtcbiAgICBkaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMsICdyZXNldCcpO1xuICB9XG5cbiAgcmVxdWVzdFZhbGlkYXRpb24oKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX3ZhbGlkYXRlVGltZW91dCk7XG4gICAgdGhpcy5fdmFsaWRhdGVUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnZhbGlkYXRlKCk7XG4gICAgICB0aGlzLl91cGRhdGVBY3Rpb25zKCk7XG4gICAgfSwgMzUwKTtcbiAgfVxuXG4gIHN1Ym1pdCgpIHtcbiAgICB0aGlzLl9vblN1Ym1pdCgpO1xuICB9XG5cbiAgX29uU3VibWl0KCkge1xuICAgIGNvbnN0IHZhbGlkYXRvclJlc3VsdHMgPSB0aGlzLnZhbGlkYXRlKCk7XG4gICAgaWYgKHRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICB0aGlzLl9pbml0aWFsVmFsdWVzID0gZGVlcENsb25lKHRoaXMuX3ZhbHVlcyk7XG4gICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgICB0aGlzLl90b3VjaCA9IGZhbHNlO1xuICAgICAgZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLCAnc3VibWl0JywgeyB2YWx1ZXM6IHRoaXMuX3ZhbHVlcywgdmFsaWRhdG9yUmVzdWx0cyB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLCAnZXJyb3InLCB7IHZhbHVlczogdGhpcy5fdmFsdWVzLCB2YWxpZGF0b3JSZXN1bHRzIH0pO1xuICAgIH1cbiAgfVxuXG4gIF9zZXREaXJ0eShkaXJ0eSA9IHRydWUpIHtcbiAgICB0aGlzLmRpcnR5ID0gISFkaXJ0eTtcbiAgfVxuXG4gIF9zZXRUb3VjaCh0b3VjaCA9IHRydWUpIHtcbiAgICB0aGlzLl90b3VjaCA9ICEhdG91Y2g7XG4gIH1cblxuICBjb25maXJtKCkge1xuICAgIGlmICh0aGlzLmlzVG91Y2goKSkge1xuICAgICAgaWYgKHRoaXMuX2NvbmZpcm0gJiYgdGhpcy5fY29uZmlybS5wcm9taXNlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb25maXJtLnByb21pc2U7XG4gICAgICB9XG4gICAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gKHRoaXMuX2NvbmZpcm0gPSB7IHJlc29sdmUsIHJlamVjdCB9KSk7XG4gICAgICB0aGlzLl9jb25maXJtLnByb21pc2UgPSBwcm9taXNlO1xuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuXG4gIF9vbkNvbmZpcm1SZXNldCgpIHtcbiAgICBjb25zdCB7IHJlc29sdmUgfSA9IHRoaXMuX2NvbmZpcm07XG4gICAgdGhpcy5fY29uZmlybSA9IG51bGw7XG4gICAgdGhpcy5fb25SZXNldCgpO1xuICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpO1xuICAgIHRoaXMudXBkYXRlQ29tcGxldGUudGhlbigoKSA9PiB7XG4gICAgICByZXNvbHZlKHRoaXMpO1xuICAgIH0pO1xuICB9XG5cbiAgX29uQ29uZmlybUVkaXQoKSB7XG4gICAgdGhpcy5fY29uZmlybS5yZWplY3QodGhpcyk7XG4gICAgdGhpcy5fY29uZmlybSA9IG51bGw7XG4gICAgdGhpcy5fdXBkYXRlQ2hpbGRyZW4odGhpcy52YWxpZGF0ZU9uUmVuZGVyKTtcbiAgfVxuXG4gIF9nZXRTdWJtaXRCdG4oKSB7XG4gICAgcmV0dXJuIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCcjc3VibWl0Jyk7XG4gIH1cblxuICBfZ2V0UmVzZXRCdG4oKSB7XG4gICAgcmV0dXJuIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCcjcmVzZXQnKTtcbiAgfVxuXG4gIF9kaXNwYXRjaENoYW5nZSgpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fY2hhbmdlVGltZW91dCk7XG4gICAgdGhpcy5fY2hhbmdlVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLCAnY2hhbmdlJywgeyB0YXJnZXQ6IHRoaXMsIHZhbHVlczogdGhpcy5fdmFsdWVzLCB2YWxpZGF0aW9uOiB0aGlzLl92YWxpZGF0b3JSZXN1bHRzIH0pO1xuICAgIH0sIDUwKTtcbiAgfVxuXG4gIF9vbkRlZmF1bHRWYWx1ZSh7IGRldGFpbDogeyBjdXJyZW50VGFyZ2V0LCB2YWx1ZSwgY29udHJvbCB9IH0pIHtcbiAgICBpZiAoY29udHJvbC50eXBlID09PSAnaW50ZWdlcicgJiYgdmFsdWUgIT0gbnVsbCAmJiAoKHZhbHVlLnRyaW0gJiYgdmFsdWUubGVuZ3RoID4gMCkgfHwgdmFsdWUubGVuZ3RoID4gMCkpIHtcbiAgICAgIHZhbHVlID0gcGFyc2VJbnQodmFsdWUsIDEwKTtcbiAgICB9XG4gICAgc2V0KHRoaXMuX3ZhbHVlcywgY3VycmVudFRhcmdldC5pZCwgdmFsdWUpO1xuICB9XG5cbiAgX29uQ2hhbmdlKHsgZGV0YWlsOiB7IGN1cnJlbnRUYXJnZXQsIHZhbHVlLCBjb250cm9sIH0gfSkge1xuICAgIHRoaXMuX3NldFRvdWNoKHRydWUpO1xuICAgIGlmIChjb250cm9sLnR5cGUgPT09ICdpbnRlZ2VyJykge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB2YWx1ZSA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBpbnRWYWx1ZSA9IE51bWJlcih2YWx1ZSkudmFsdWVPZigpO1xuICAgICAgICBpZiAoIWlzTmFOKGludFZhbHVlKSkge1xuICAgICAgICAgIHZhbHVlID0gaW50VmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjb250cm9sLnR5cGUgPT09ICdhcnJheScgJiYgdmFsdWUubGVuZ3RoID09PSAwKSB7XG4gICAgICB2YWx1ZSA9IG51bGw7XG4gICAgfSBlbHNlIGlmIChjb250cm9sLnR5cGUgPT09ICdzdHJpbmcnICYmIHZhbHVlLnRyaW0oKS5sZW5ndGggPT09IDAgJiYgIWNvbnRyb2wuZW51bSkge1xuICAgICAgdmFsdWUgPSBudWxsO1xuICAgIH0gZWxzZSBpZiAoY29udHJvbC50eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdmFsdWUgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgZGVsKHRoaXMuX3ZhbHVlcywgY3VycmVudFRhcmdldC5pZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldCh0aGlzLl92YWx1ZXMsIGN1cnJlbnRUYXJnZXQuaWQsIHZhbHVlKTtcbiAgICB9XG5cbiAgICB0aGlzLl91cGRhdGVEeW5hbWljQ29udHJvbHMoKTtcbiAgICB0aGlzLl92YWxpZGF0b3JSZXN1bHRzID0gdGhpcy52YWxpZGF0ZSgpO1xuICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuICAgIHRoaXMuX3VwZGF0ZUFjdGlvbnMoKTtcbiAgICB0aGlzLl9kaXNwYXRjaENoYW5nZSgpO1xuICB9XG5cbiAgX29uQ29udHJvbFJlYWR5KGUpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCBjb250cm9sRWxlbWVudCA9IGUuZGV0YWlsLmNvbnRyb2w7XG4gICAgY29uc3QgY29udHJvbCA9IGNvbnRyb2xFbGVtZW50LmNvbnRyb2w7XG4gICAgaWYgKGNvbnRyb2xbJ3gtc2NoZW1hLWZvcm0nXSkge1xuICAgICAgaWYgKGNvbnRyb2xbJ3gtc2NoZW1hLWZvcm0nXS5ldmVudCkge1xuICAgICAgICBjb25zdCBldmVudCA9IGNvbnRyb2xbJ3gtc2NoZW1hLWZvcm0nXS5ldmVudDtcbiAgICAgICAgZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLCBldmVudC5uYW1lLCB7IC4uLmV2ZW50LCAuLi5lLmRldGFpbCB9KTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5faGFzQ29uZGl0aW9uKGNvbnRyb2wpKSB7XG4gICAgICAgIHRoaXMuX2R5bmFtaWNDb250cm9scy5wdXNoKGNvbnRyb2xFbGVtZW50KTtcbiAgICAgICAgdGhpcy5fdXBkYXRlRHluYW1pY0NvbnRyb2woY29udHJvbEVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF91cGRhdGVEeW5hbWljQ29udHJvbHMoKSB7XG4gICAgdGhpcy5faWdub3JlUHJvcGVydGllcyA9IFtdO1xuICAgIHRoaXMuX2R5bmFtaWNDb250cm9scy5mb3JFYWNoKChjb250cm9sRWxlbWVudCkgPT4ge1xuICAgICAgdGhpcy5fdXBkYXRlRHluYW1pY0NvbnRyb2woY29udHJvbEVsZW1lbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgX3VwZGF0ZUR5bmFtaWNDb250cm9sKGNvbnRyb2xFbGVtZW50KSB7XG4gICAgY29uc3QgY29udHJvbCA9IGNvbnRyb2xFbGVtZW50LmNvbnRyb2w7XG4gICAgaWYgKGNvbnRyb2xbJ3gtc2NoZW1hLWZvcm0nXSkge1xuICAgICAgdGhpcy5fZHluYW1pY0F0dHJpYnV0ZXMuZm9yRWFjaCgoYXR0cmlidXRlKSA9PiB7XG4gICAgICAgIGNvbnN0IGlzID0gdGhpcy5fZXZhbHVhdGVDb25kaXRpb24oY29udHJvbCwgYXR0cmlidXRlKTtcbiAgICAgICAgaWYgKGlzKSB7XG4gICAgICAgICAgY29udHJvbEVsZW1lbnQuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZSwgJycpO1xuICAgICAgICAgIGlmIChhdHRyaWJ1dGUgPT09ICdoaWRkZW4nKSB7XG4gICAgICAgICAgICB0aGlzLl9pZ25vcmVQcm9wZXJ0aWVzLnB1c2goY29udHJvbEVsZW1lbnQuaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb250cm9sRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgYXN5bmMgcGVyZm9ybVVwZGF0ZSgpIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbCh0aGlzLmdldENvbnRyb2xzKCkubWFwKChlKSA9PiBlLnVwZGF0ZUNvbXBsZXRlKSk7XG4gICAgdGhpcy5nZXRDb250cm9scygpLmZvckVhY2goKHMpID0+IHtcbiAgICAgIHMucmVxdWVzdFVwZGF0ZSgpO1xuICAgIH0pO1xuICAgIHN1cGVyLnBlcmZvcm1VcGRhdGUoKTtcbiAgfVxuXG4gIF9yZW5kZXJDb250cm9sKGtleSkge1xuICAgIC8vIFRoaXMgaXMgcmVxdWlyZSB0byBjbGVhbiBjYWNoZSBvZiA8Z3Ytc2NoZW1hLWZvcm0tY29udHJvbD5cbiAgICBjb25zdCBjb250cm9sID0geyAuLi50aGlzLnNjaGVtYS5wcm9wZXJ0aWVzW2tleV0gfTtcbiAgICBjb25zdCBpc1JlcXVpcmVkID0gKHRoaXMuc2NoZW1hLnJlcXVpcmVkICYmIHRoaXMuc2NoZW1hLnJlcXVpcmVkLmluY2x1ZGVzKGtleSkpIHx8IHRoaXMuX2V2YWx1YXRlQ29uZGl0aW9uKGNvbnRyb2wsICdyZXF1aXJlZCcpO1xuICAgIGNvbnN0IGlzRGlzYWJsZWQgPSAodGhpcy5zY2hlbWEuZGlzYWJsZWQgJiYgdGhpcy5zY2hlbWEuZGlzYWJsZWQuaW5jbHVkZXMoa2V5KSkgfHwgdGhpcy5fZXZhbHVhdGVDb25kaXRpb24oY29udHJvbCwgJ2Rpc2FibGVkJyk7XG4gICAgY29uc3QgaXNIaWRkZW4gPSB0aGlzLl9ldmFsdWF0ZUNvbmRpdGlvbihjb250cm9sLCAnaGlkZGVuJyk7XG4gICAgaWYgKGlzSGlkZGVuKSB7XG4gICAgICB0aGlzLl9pZ25vcmVQcm9wZXJ0aWVzLnB1c2goa2V5KTtcbiAgICB9XG4gICAgY29uc3QgaXNSZWFkb25seSA9IHRoaXMucmVhZG9ubHkgfHwgY29udHJvbC5yZWFkT25seSA9PT0gdHJ1ZTtcbiAgICBjb25zdCBpc1dyaXRlT25seSA9IGNvbnRyb2wud3JpdGVPbmx5ID09PSB0cnVlO1xuICAgIGNvbnN0IHZhbHVlID0gZ2V0KHRoaXMuX3ZhbHVlcywga2V5KTtcbiAgICByZXR1cm4gaHRtbGA8Z3Ytc2NoZW1hLWZvcm0tY29udHJvbFxuICAgICAgLmlkPVwiJHtrZXl9XCJcbiAgICAgIC5lcnJvcnM9XCIke3RoaXMuZXJyb3JzfVwiXG4gICAgICAuY29udHJvbD1cIiR7Y29udHJvbH1cIlxuICAgICAgLnNrZWxldG9uPVwiJHt0aGlzLnNrZWxldG9ufVwiXG4gICAgICAudmFsdWU9XCIke3ZhbHVlfVwiXG4gICAgICA/cmVhZG9ubHk9XCIke2lzUmVhZG9ubHl9XCJcbiAgICAgID93cml0ZW9ubHk9XCIke2lzV3JpdGVPbmx5fVwiXG4gICAgICA/cmVxdWlyZWQ9XCIke2lzUmVxdWlyZWR9XCJcbiAgICAgID9kaXNhYmxlZD1cIiR7aXNEaXNhYmxlZH1cIlxuICAgICAgP2hpZGRlbj1cIiR7aXNIaWRkZW59XCJcbiAgICA+PC9ndi1zY2hlbWEtZm9ybS1jb250cm9sPmA7XG4gIH1cblxuICBfaGFzQ29uZGl0aW9uKGNvbnRyb2wpIHtcbiAgICBpZiAoY29udHJvbFsneC1zY2hlbWEtZm9ybSddKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZHluYW1pY0F0dHJpYnV0ZXMuZmluZCgoY29uZGl0aW9uKSA9PiBjb250cm9sWyd4LXNjaGVtYS1mb3JtJ11bY29uZGl0aW9uXSAhPSBudWxsKSAhPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBfZXZhbHVhdGVDb25kaXRpb24oY29udHJvbCwgY29uZGl0aW9uS2V5KSB7XG4gICAgaWYgKGNvbnRyb2xbJ3gtc2NoZW1hLWZvcm0nXSA9PSBudWxsIHx8IGNvbnRyb2xbJ3gtc2NoZW1hLWZvcm0nXVtjb25kaXRpb25LZXldID09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgY29uZGl0aW9uID0gY29udHJvbFsneC1zY2hlbWEtZm9ybSddW2NvbmRpdGlvbktleV07XG4gICAgaWYgKHR5cGVvZiBjb25kaXRpb24gPT09ICdib29sZWFuJykge1xuICAgICAgcmV0dXJuIGNvbmRpdGlvbjtcbiAgICB9XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbmRpdGlvbikpIHtcbiAgICAgIC8vIGNvbmRpdGlvbiBpc24ndCBhbiBhcnJheSwgaWdub3JlIHRoZSBjb25kaXRpb25cbiAgICAgIGNvbnNvbGUud2FybihgJyR7Y29uZGl0aW9uS2V5fScgYXR0cmlidXRlIG9mICd4LXNjaGVtYS1mb3JtJyBzaG91bGQgYmUgYW4gYXJyYXlgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBsZXQgcmVzdWx0ID0gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IG9wZXJhdGlvbiBvZiBjb25kaXRpb24pIHtcbiAgICAgIC8vIG9wZXJhdGlvbiBvbmx5IGhhdmUgb25lIG9wZXJhdG9yIHdpdGggYSBzaW5nbGUgb2JqZWN0IGNvbnRhaW5pbmcgb3BlcmFuZCB2YWx1ZXNcbiAgICAgIGNvbnN0IG9wZXJhdG9yID0gT2JqZWN0LmtleXMob3BlcmF0aW9uKVswXTtcblxuICAgICAgc3dpdGNoIChvcGVyYXRvcikge1xuICAgICAgICBjYXNlICckbmVxJzpcbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQgJiYgdGhpcy5fZXZhbHVhdGVOb3RFcXVhbHNDb25kaXRpb24oY29udHJvbCwgb3BlcmF0aW9uKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnJGVxJzpcbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQgJiYgdGhpcy5fZXZhbHVhdGVFcXVhbHNDb25kaXRpb24oY29udHJvbCwgb3BlcmF0aW9uKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnJG5vZGVmJzpcbiAgICAgICAgICByZXN1bHQgPSByZXN1bHQgJiYgdGhpcy5fZXZhbHVhdGVOb3REZWZDb25kaXRpb24oY29udHJvbCwgb3BlcmF0aW9uKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnJGRlZic6XG4gICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICYmIHRoaXMuX2V2YWx1YXRlRGVmQ29uZGl0aW9uKGNvbnRyb2wsIG9wZXJhdGlvbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgY29uc29sZS53YXJuKGBVbnN1cHBvcnRlZCBvcGVyYXRvciAnJHtvcGVyYXRvcn0nIG9uIGRpc2FibGUgY29uZGl0aW9uYCk7XG4gICAgICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIF9ldmFsdWF0ZU5vdEVxdWFsc0NvbmRpdGlvbihjb250cm9sLCBjb25kaXRpb24pIHtcbiAgICByZXR1cm4gIXRoaXMuX2V2YWx1YXRlRXF1YWxzQ29uZGl0aW9uKGNvbnRyb2wsIGNvbmRpdGlvbik7XG4gIH1cblxuICBfZXZhbHVhdGVFcXVhbHNDb25kaXRpb24oY29udHJvbCwgY29uZGl0aW9uKSB7XG4gICAgY29uc3Qgb3BlcmF0b3IgPSBPYmplY3Qua2V5cyhjb25kaXRpb24pWzBdO1xuICAgIGNvbnN0IG9wZXJhbmRzID0gY29uZGl0aW9uW29wZXJhdG9yXTtcbiAgICBjb25zdCBtb2RlbEF0dHJpYnV0ZXMgPSBPYmplY3Qua2V5cyhvcGVyYW5kcyk7XG4gICAgcmV0dXJuIG1vZGVsQXR0cmlidXRlc1xuICAgICAgLm1hcCgobW9kZWxBdHRyaWJ1dGUpID0+IHtcbiAgICAgICAgY29uc3QgdGVzdFZhbHVlID0gb3BlcmFuZHNbbW9kZWxBdHRyaWJ1dGVdO1xuICAgICAgICBsZXQgdmFsdWUgPSBnZXQodGhpcy5fdmFsdWVzLCBtb2RlbEF0dHJpYnV0ZSk7XG4gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsICYmIGNvbnRyb2wudHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB2YWx1ZSA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRlc3RWYWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gdGVzdFZhbHVlLmluY2x1ZGVzKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWUgPT09IHRlc3RWYWx1ZTtcbiAgICAgIH0pXG4gICAgICAucmVkdWNlKChhY2MsIGN1cnJlbnQpID0+IGFjYyB8fCBjdXJyZW50KTtcbiAgfVxuXG4gIF9ldmFsdWF0ZU5vdERlZkNvbmRpdGlvbihjb250cm9sLCBjb25kaXRpb24pIHtcbiAgICBjb25zdCBvcGVyYXRvciA9IE9iamVjdC5rZXlzKGNvbmRpdGlvbilbMF07XG4gICAgY29uc3QgbW9kZWxBdHRyaWJ1dGUgPSBjb25kaXRpb25bb3BlcmF0b3JdO1xuICAgIHJldHVybiBnZXQodGhpcy5fdmFsdWVzLCBtb2RlbEF0dHJpYnV0ZSkgPT09IHVuZGVmaW5lZCB8fCBnZXQodGhpcy5fdmFsdWVzLCBtb2RlbEF0dHJpYnV0ZSkgPT09IG51bGw7XG4gIH1cblxuICBfZXZhbHVhdGVEZWZDb25kaXRpb24oY29udHJvbCwgY29uZGl0aW9uKSB7XG4gICAgcmV0dXJuICF0aGlzLl9ldmFsdWF0ZU5vdERlZkNvbmRpdGlvbihjb250cm9sLCBjb25kaXRpb24pO1xuICB9XG5cbiAgX3JlbmRlclBhcnQoKSB7XG4gICAgaWYgKHRoaXMuX2NvbmZpcm0pIHtcbiAgICAgIHJldHVybiBodG1sYDxkaXYgY2xhc3M9XCJjb25maXJtLWJveFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZXJyb3JcIj5UaGUgY29uZmlndXJhdGlvbiBpcyBub3QgdmFsaWQgYW5kIGNhbm5vdCBiZSBzYXZlZC48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbmZpcm0tYm94X2FjdGlvbnNcIj5cbiAgICAgICAgICA8Z3YtYnV0dG9uIEBndi1idXR0b246Y2xpY2s9XCIke3RoaXMuX29uQ29uZmlybVJlc2V0fVwiIG91dGxpbmVkIGljb249XCJnZW5lcmFsOnVwZGF0ZVwiIGRhbmdlcj5Mb3NlIGNoYW5nZXM8L2d2LWJ1dHRvbj5cbiAgICAgICAgICA8Z3YtYnV0dG9uIEBndi1idXR0b246Y2xpY2s9XCIke3RoaXMuX29uQ29uZmlybUVkaXR9XCIgaWNvbj1cImRlc2lnbjplZGl0XCI+RWRpdDwvZ3YtYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PmA7XG4gICAgfVxuICAgIGNvbnN0IGtleXMgPSB0aGlzLnNjaGVtYS5wcm9wZXJ0aWVzID8gT2JqZWN0LmtleXModGhpcy5zY2hlbWEucHJvcGVydGllcykgOiBbXTtcbiAgICB0aGlzLl9pZ25vcmVQcm9wZXJ0aWVzID0gW107XG5cbiAgICBpZiAodGhpcy5ncm91cHMpIHtcbiAgICAgIC8vIFJlbW92ZSB1bmRlZmluZWQgZ3JvdXAgaXRlbXNcbiAgICAgIGNvbnN0IGdyb3Vwc0NsZWFuZWQgPSB0aGlzLmdyb3Vwcy5yZWR1Y2UoKHByZXYsIGdyb3VwKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zRXhpc3RpbmdJblNjaGVtYUtleXMgPSBrZXlzLmZpbHRlcigoa2V5KSA9PiBbLi4uKGdyb3VwLml0ZW1zIHx8IFtdKV0uaW5jbHVkZXMoa2V5KSk7XG4gICAgICAgIHByZXYucHVzaCh7XG4gICAgICAgICAgLi4uZ3JvdXAsXG4gICAgICAgICAgaXRlbXM6IGl0ZW1zRXhpc3RpbmdJblNjaGVtYUtleXMgfHwgW10sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcHJldjtcbiAgICAgIH0sIFtdKTtcblxuICAgICAgLy8gQWRkIG5vbiBncm91cGVkIGl0ZW1zIGluc2lkZSBkZWZhdWx0IGdyb3VwXG4gICAgICBjb25zdCBkZWZhdWx0R3JvdXAgPSBncm91cHNDbGVhbmVkLmZpbmQoKGcpID0+IGcuZGVmYXVsdCkgfHwgeyBkZWZhdWx0OiB0cnVlLCBpdGVtczogW10gfTtcbiAgICAgIGNvbnN0IHppcEdyb3VwZWRJdGVtcyA9IGdyb3Vwc0NsZWFuZWQucmVkdWNlKChwcmV2LCBncm91cCkgPT4gWy4uLnByZXYsIC4uLmdyb3VwLml0ZW1zXSwgW10pO1xuICAgICAgZGVmYXVsdEdyb3VwLml0ZW1zID0ga2V5cy5maWx0ZXIoKGtleSkgPT4gIXppcEdyb3VwZWRJdGVtcy5pbmNsdWRlcyhrZXkpKTtcblxuICAgICAgcmV0dXJuIHJlcGVhdChcbiAgICAgICAgZ3JvdXBzQ2xlYW5lZCxcbiAgICAgICAgKGdyb3VwKSA9PlxuICAgICAgICAgIGh0bWxgJHtncm91cC5uYW1lXG4gICAgICAgICAgICA/IGh0bWxgPGgyIGNsYXNzPVwiZ3JvdXAtdGl0bGVcIj4ke2dyb3VwLm5hbWV9PC9oMj5cbiAgICAgICAgICAgICAgICAke3JlcGVhdChncm91cC5pdGVtcywgKGtleSkgPT4gdGhpcy5fcmVuZGVyQ29udHJvbChrZXkpKX1gXG4gICAgICAgICAgICA6IHJlcGVhdChncm91cC5pdGVtcywgKGtleSkgPT4gdGhpcy5fcmVuZGVyQ29udHJvbChrZXkpKX0gYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGh0bWxgJHtyZXBlYXQoWzFdLCAoKSA9PlxuICAgICAgcmVwZWF0KFxuICAgICAgICBrZXlzLFxuICAgICAgICAoa2V5KSA9PiBrZXksXG4gICAgICAgIChrZXkpID0+IHRoaXMuX3JlbmRlckNvbnRyb2woa2V5KSxcbiAgICAgICksXG4gICAgKX1gO1xuICB9XG5cbiAgZ2V0Q29udHJvbHMoKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ2d2LXNjaGVtYS1mb3JtLWNvbnRyb2wnKSk7XG4gIH1cblxuICBnZXRDb250cm9sKGlkKSB7XG4gICAgcmV0dXJuIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKGBbaWQ9XCIke2lkfVwiXWApO1xuICB9XG5cbiAgX2dldEVycm9ycygpIHtcbiAgICByZXR1cm4gKHRoaXMuX3ZhbGlkYXRvclJlc3VsdHMuZXJyb3JzIHx8IFtdKS5maWx0ZXIoKGVycm9yKSA9PiB7XG4gICAgICBsZXQgaWQgPSBgJHtlcnJvci5wcm9wZXJ0eS5yZXBsYWNlKCdpbnN0YW5jZS4nLCAnJyl9YDtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShlcnJvci5hcmd1bWVudCkpIHtcbiAgICAgICAgaWQgPSBgJHtpZH0uJHtlcnJvci5hcmd1bWVudH1gO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBlcnJvcktleSA9IGB4LXNjaGVtYS1mb3JtLmVycm9ycy4ke2lkfS4ke2Vycm9yLm5hbWV9YDtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGdldCh0aGlzLnNjaGVtYSwgZXJyb3JLZXkpO1xuICAgICAgaWYgKGVycm9yTWVzc2FnZSkge1xuICAgICAgICBlcnJvci5tZXNzYWdlID0gZXJyb3JNZXNzYWdlO1xuICAgICAgfVxuICAgICAgcmV0dXJuICF0aGlzLl9pZ25vcmVQcm9wZXJ0aWVzLmluY2x1ZGVzKGlkKTtcbiAgICB9KTtcbiAgfVxuXG4gIHZhbGlkYXRlKCkge1xuICAgIGlmICh0aGlzLnNjaGVtYSkge1xuICAgICAgLy8gQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHNob3VsZCBub3QgYmxvY2sgdGhlIHZhbGlkYXRpb24gb2YgdGhlIGZvcm1cbiAgICAgIHRoaXMuX3ZhbGlkYXRvclJlc3VsdHMgPSB0aGlzLl92YWxpZGF0b3IudmFsaWRhdGUodGhpcy5fdmFsdWVzLCB7IC4uLnRoaXMuc2NoZW1hLCBhZGRpdGlvbmFsUHJvcGVydGllczogdHJ1ZSB9KTtcbiAgICAgIHRoaXMuZXJyb3JzID0gdGhpcy5fZ2V0RXJyb3JzKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl92YWxpZGF0b3JSZXN1bHRzO1xuICB9XG5cbiAgaXNWYWxpZCgpIHtcbiAgICBpZiAodGhpcy5fdmFsaWRhdG9yUmVzdWx0cy52YWxpZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9nZXRFcnJvcnMoKSA9PT0gMDtcbiAgfVxuXG4gIGlzVG91Y2goKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RvdWNoIHx8ICh0aGlzLmRpcnR5ICYmIHRoaXMudmFsaWRhdGVPblJlbmRlcik7XG4gIH1cblxuICBjYW5TdWJtaXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNUb3VjaCgpICYmIHRoaXMuaXNWYWxpZCgpO1xuICB9XG5cbiAgX3VwZGF0ZUFjdGlvbnMoKSB7XG4gICAgY29uc3Qgc3VibWl0QnRuID0gdGhpcy5fZ2V0U3VibWl0QnRuKCk7XG4gICAgaWYgKHN1Ym1pdEJ0biAhPSBudWxsKSB7XG4gICAgICBpZiAodGhpcy5jYW5TdWJtaXQoKSkge1xuICAgICAgICB0aGlzLl9nZXRTdWJtaXRCdG4oKS5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9nZXRTdWJtaXRCdG4oKS5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgdHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlc2V0QnRuID0gdGhpcy5fZ2V0UmVzZXRCdG4oKTtcbiAgICBpZiAocmVzZXRCdG4gIT0gbnVsbCkge1xuICAgICAgaWYgKHRoaXMuZGlydHkpIHtcbiAgICAgICAgcmVzZXRCdG4ucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzZXRCdG4uc2V0QXR0cmlidXRlKCdkaXNhYmxlZCcsIHRydWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF91cGRhdGVDaGlsZHJlbih3aXRoVmFsaWRhdGlvbikge1xuICAgIGlmICh3aXRoVmFsaWRhdGlvbikge1xuICAgICAgdGhpcy5fdmFsaWRhdG9yUmVzdWx0cyA9IHt9O1xuICAgICAgdGhpcy5lcnJvcnMgPSBudWxsO1xuICAgICAgdGhpcy5yZXF1ZXN0VmFsaWRhdGlvbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl91cGRhdGVBY3Rpb25zVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5fdXBkYXRlQWN0aW9ucygpLCAwKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyB1cGRhdGVkKGNoYW5nZWRQcm9wZXJ0aWVzKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX3VwZGF0ZUFjdGlvbnNUaW1lb3V0KTtcbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdfdmFsdWVzJykpIHtcbiAgICAgIHRoaXMuZ2V0Q29udHJvbHMoKS5mb3JFYWNoKChjb250cm9sKSA9PiB7XG4gICAgICAgIGNvbnRyb2wudmFsdWUgPSBnZXQodGhpcy5fdmFsdWVzLCBjb250cm9sLmlkKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLl91cGRhdGVDaGlsZHJlbih0aGlzLnZhbGlkYXRlT25SZW5kZXIgJiYgKGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnX3ZhbHVlcycpIHx8IGNoYW5nZWRQcm9wZXJ0aWVzLmhhcygnc2NoZW1hJykpKTtcbiAgfVxuXG4gIGFzeW5jIGdldFVwZGF0ZUNvbXBsZXRlKCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN1cGVyLmdldFVwZGF0ZUNvbXBsZXRlKCk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5nZXRDb250cm9scygpLm1hcCgoZSkgPT4gZS51cGRhdGVDb21wbGV0ZSkpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgcmV0dXJuIGh0bWxgPGZvcm0gY2xhc3M9XCIke2NsYXNzTWFwKHsgc2Nyb2xsYWJsZTogdGhpcy5zY3JvbGxhYmxlIH0pfVwiPlxuICAgICAgPGRpdiBjbGFzcz1cIiR7Y2xhc3NNYXAoeyBjb250YWluZXI6IHRydWUsIGNvbmZpcm06IHRoaXMuX2NvbmZpcm0gfSl9XCI+XG4gICAgICAgICR7dGhpcy5oYXNIZWFkZXIgPT09IHRydWVcbiAgICAgICAgICA/IGh0bWxgXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiJHtjbGFzc01hcCh7IHRpdGxlOiB0cnVlLCBjZW50ZXI6IHRoaXMuaGFzSGVhZGVyICYmICF0aGlzLmhhc0Zvb3RlciB9KX1cIj5cbiAgICAgICAgICAgICAgICAgIDxzbG90IG5hbWU9XCJ0aXRsZVwiPjwvc2xvdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVmdFwiPlxuICAgICAgICAgICAgICAgICAgPHNsb3QgbmFtZT1cImhlYWRlci1sZWZ0XCI+PC9zbG90PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICR7dGhpcy5yZWFkb25seSA9PT0gdHJ1ZSB8fCB0aGlzLmhhc0Zvb3RlciA9PT0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgPyAnJ1xuICAgICAgICAgICAgICAgICAgOiBodG1sYDxkaXYgY2xhc3M9XCJyaWdodFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxndi1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwicmVzZXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIHNtYWxsXG4gICAgICAgICAgICAgICAgICAgICAgICBAZ3YtYnV0dG9uOmNsaWNrPVwiJHt0aGlzLl9vblJlc2V0fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwiZ2VuZXJhbDp1cGRhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJSZXNldFwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvZ3YtYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDxndi1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwic3VibWl0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNtYWxsXG4gICAgICAgICAgICAgICAgICAgICAgICBAZ3YtYnV0dG9uOmNsaWNrPVwiJHt0aGlzLl9vblN1Ym1pdH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbj1cImNvZGU6Y2hlY2tcIlxuICAgICAgICAgICAgICAgICAgICAgICAgLnRpdGxlPVwiJHt0aGlzLnN1Ym1pdExhYmVsfVwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvZ3YtYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj4gYH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBgXG4gICAgICAgICAgOiAnJ31cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnRcIj4ke3RoaXMuc2NoZW1hICE9IG51bGwgPyB0aGlzLl9yZW5kZXJQYXJ0KCkgOiBodG1sYGB9PC9kaXY+XG4gICAgICAgICR7dGhpcy5oYXNGb290ZXIgPT09IHRydWUgJiYgdGhpcy5yZWFkb25seSAhPT0gdHJ1ZVxuICAgICAgICAgID8gaHRtbGBcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvb3RlclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWZ0XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICA8Z3YtYnV0dG9uIGlkPVwicmVzZXRcIiBvdXRsaW5lZCBAZ3YtYnV0dG9uOmNsaWNrPVwiJHt0aGlzLl9vblJlc2V0fVwiIGljb249XCJnZW5lcmFsOnVwZGF0ZVwiIHRpdGxlPVwiUmVzZXRcIj5SZXNldDwvZ3YtYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPGd2LWJ1dHRvbiBpZD1cInN1Ym1pdFwiIEBndi1idXR0b246Y2xpY2s9XCIke3RoaXMuX29uU3VibWl0fVwiIGljb249XCJjb2RlOmNoZWNrXCIgLnRpdGxlPVwiJHt0aGlzLnN1Ym1pdExhYmVsfVwiXG4gICAgICAgICAgICAgICAgICAgID4ke3RoaXMuc3VibWl0TGFiZWx9PC9ndi1idXR0b25cbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBgXG4gICAgICAgICAgOiAnJ31cbiAgICAgIDwvZGl2PlxuICAgIDwvZm9ybT5gO1xuICB9XG5cbiAgc3RhdGljIGdldCBzdHlsZXMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGVtcHR5LFxuICAgICAgLy8gbGFuZ3VhZ2U9Q1NTXG4gICAgICBjc3NgXG4gICAgICAgIDpob3N0IHtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIG1hcmdpbjogMC4ycmVtO1xuICAgICAgICAgIC0tYmdjOiB2YXIoLS1ndi1zY2hlbWEtZm9ybS0tYmdjLCAjZmZmZmZmKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcm0ge1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcm0uc2Nyb2xsYWJsZSB7XG4gICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgIHRvcDogMDtcbiAgICAgICAgICBib3R0b206IDA7XG4gICAgICAgICAgbGVmdDogMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5jb250YWluZXIge1xuICAgICAgICAgIGZsZXgtZ3JvdzogMTtcblxuICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJnYyk7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXG4gICAgICAgICAgLyogZm9yIEZpcmVmb3ggKi9cbiAgICAgICAgICBtaW4taGVpZ2h0OiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgLmhlYWRlcixcbiAgICAgICAgLmZvb3RlcixcbiAgICAgICAgLmNvbnRlbnQge1xuICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWJnYyk7XG4gICAgICAgIH1cblxuICAgICAgICAuY29udGVudCB7XG4gICAgICAgICAgZmxleC1ncm93OiAxO1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgICBhbGlnbi1zZWxmOiBjZW50ZXI7XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG5cbiAgICAgICAgICAvKiBmb3IgRmlyZWZveCAqL1xuICAgICAgICAgIG1pbi1oZWlnaHQ6IDA7XG4gICAgICAgIH1cblxuICAgICAgICAuY29udGVudCA+IGd2LXNjaGVtYS1mb3JtLWNvbnRyb2wge1xuICAgICAgICAgIGFsaWduLXNlbGY6IGNlbnRlcjtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcm0uc2Nyb2xsYWJsZSAuY29udGVudCB7XG4gICAgICAgICAgb3ZlcmZsb3c6IGF1dG87XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtLnNjcm9sbGFibGUgLmNvbnRlbnQgPiBndi1zY2hlbWEtZm9ybS1jb250cm9sLFxuICAgICAgICBmb3JtLnNjcm9sbGFibGUgLmNvbnRlbnQgPiAuZ3JvdXAtdGl0bGUge1xuICAgICAgICAgIG1heC13aWR0aDogNzc1cHg7XG4gICAgICAgICAgd2lkdGg6IDk1JTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5oZWFkZXIsXG4gICAgICAgIC5mb290ZXIge1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICBtaW4taGVpZ2h0OiA0NXB4O1xuICAgICAgICAgIC0tZ3YtaWNvbi0tczogMjZweDtcbiAgICAgICAgICAtLWd2LWljb24tLWM6ICNiZmJmYmY7XG4gICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgICBwYWRkaW5nOiAwIDAuNXJlbTtcbiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIH1cblxuICAgICAgICAuaGVhZGVyIHtcbiAgICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2Q5ZDlkOTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5mb290ZXIge1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgICAgIHBhZGRpbmc6IDFyZW07XG4gICAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkOWQ5ZDk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtLnNjcm9sbGFibGUgLmZvb3RlciB7XG4gICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICAgIH1cblxuICAgICAgICAuZm9vdGVyIC5sZWZ0LFxuICAgICAgICAuZm9vdGVyIC5yaWdodCB7XG4gICAgICAgICAgbWF4LXdpZHRoOiA0MDBweDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5oZWFkZXIgLmxlZnQsXG4gICAgICAgIC5mb290ZXIgLmxlZnQsXG4gICAgICAgIC5oZWFkZXIgLnJpZ2h0LFxuICAgICAgICAuZm9vdGVyIC5yaWdodCB7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBmbGV4OiAxO1xuICAgICAgICAgIHotaW5kZXg6IDEwO1xuICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIH1cblxuICAgICAgICAuaGVhZGVyIC5yaWdodCxcbiAgICAgICAgLmZvb3RlciAucmlnaHQge1xuICAgICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG4gICAgICAgIH1cblxuICAgICAgICAuaGVhZGVyIC50aXRsZSB7XG4gICAgICAgICAgY29sb3I6ICMyODQ0NGY7XG4gICAgICAgICAgZm9udC1zaXplOiAxOHB4O1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC5oZWFkZXIgLnRpdGxlLmNlbnRlciB7XG4gICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgIHRvcDogMDtcbiAgICAgICAgICBsZWZ0OiAwO1xuICAgICAgICAgIGJvdHRvbTogMDtcbiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC5jb25maXJtLWJveCB7XG4gICAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICAgIHBhZGRpbmc6IDFyZW07XG4gICAgICAgICAgZm9udC1zdHlsZTogaXRhbGljO1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcblxuICAgICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgLmNvbmZpcm0tYm94X2FjdGlvbnMge1xuICAgICAgICAgIHBhZGRpbmc6IDFyZW0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5jb25maXJtIC5oZWFkZXIgLmxlZnQsXG4gICAgICAgIC5jb25maXJtIC5oZWFkZXIgLnJpZ2h0LFxuICAgICAgICAuY29uZmlybSAuZm9vdGVyIC5sZWZ0LFxuICAgICAgICAuY29uZmlybSAuZm9vdGVyIC5yaWdodCB7XG4gICAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5ncm91cC10aXRsZSB7XG4gICAgICAgICAgYWxpZ24tc2VsZjogY2VudGVyO1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgIGNvbG9yOiB2YXIoLS1ndi10aGVtZS1mb250LWNvbG9yLWRhcmspO1xuICAgICAgICAgIGZvbnQtc2l6ZTogMjFweDtcbiAgICAgICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgICAgIHBhZGRpbmctYm90dG9tOiAwLjNlbTtcbiAgICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tZ3YtdGhlbWUtZm9udC1jb2xvci1kYXJrKTtcbiAgICAgICAgICBtYXJnaW4tdG9wOiAyNHB4O1xuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDE2cHg7XG4gICAgICAgIH1cbiAgICAgIGAsXG4gICAgXTtcbiAgfVxufVxuXG53aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdndi1zY2hlbWEtZm9ybScsIEd2U2NoZW1hRm9ybSk7XG4iXX0=