@gravitee/ui-components 3.24.4 → 3.24.5-renovate-github-markdown-css-5-x-d2ffdad

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 (117) hide show
  1. package/CHANGELOG.md +1260 -0
  2. package/LICENSE.txt +202 -0
  3. package/README.md +195 -0
  4. package/assets/css/github-markdown-css/github-markdown.css +500 -545
  5. package/assets/i18n/en.json +0 -3
  6. package/assets/i18n/fr.json +0 -3
  7. package/package.json +19 -21
  8. package/src/.eslintrc.js +19 -0
  9. package/src/atoms/gv-autocomplete.js +156 -132
  10. package/src/atoms/gv-button.js +248 -73
  11. package/src/atoms/gv-checkbox.js +103 -45
  12. package/src/atoms/gv-date-picker-calendar.js +393 -312
  13. package/src/atoms/gv-date-picker-cell.js +81 -57
  14. package/src/atoms/gv-date-picker.js +319 -180
  15. package/src/atoms/gv-file-upload.js +195 -85
  16. package/src/atoms/gv-icon.js +34 -13
  17. package/src/atoms/gv-image.js +66 -31
  18. package/src/atoms/gv-input-message.js +37 -12
  19. package/src/atoms/gv-input.js +169 -139
  20. package/src/atoms/gv-link.js +125 -47
  21. package/src/atoms/gv-message.js +69 -18
  22. package/src/atoms/gv-metric.js +68 -19
  23. package/src/atoms/gv-relative-time.js +38 -67
  24. package/src/atoms/gv-select-native.js +215 -96
  25. package/src/atoms/gv-select.js +230 -110
  26. package/src/atoms/gv-spinner.js +26 -5
  27. package/src/atoms/gv-state.js +66 -25
  28. package/src/atoms/gv-switch.js +160 -40
  29. package/src/atoms/gv-tag.js +78 -26
  30. package/src/atoms/gv-text.js +83 -22
  31. package/src/charts/gv-chart-bar.js +18 -22
  32. package/src/charts/gv-chart-gauge.js +31 -28
  33. package/src/charts/gv-chart-histogram.js +10 -18
  34. package/src/charts/gv-chart-line.js +59 -70
  35. package/src/charts/gv-chart-map.js +42 -44
  36. package/src/charts/gv-chart-pie.js +14 -18
  37. package/src/index.js +0 -2
  38. package/src/lib/cron-expression.js +35 -40
  39. package/src/lib/date.js +1 -10
  40. package/src/lib/events.js +1 -3
  41. package/src/lib/http-client-schema-form.js +12 -13
  42. package/src/lib/http.js +56 -57
  43. package/src/lib/i18n.js +22 -30
  44. package/src/lib/item.js +12 -13
  45. package/src/lib/properties.js +42 -77
  46. package/src/lib/schema-form.js +5 -4
  47. package/src/lib/studio.js +60 -13
  48. package/src/lib/style.js +8 -8
  49. package/src/lib/text-format.js +7 -14
  50. package/src/lib/theme.js +5 -8
  51. package/src/lib/utils.js +18 -17
  52. package/src/mixins/chart-element.js +54 -31
  53. package/src/mixins/input-element.js +49 -60
  54. package/src/mixins/item-resource.js +32 -34
  55. package/src/mixins/keyboard-element.js +5 -6
  56. package/src/mixins/update-after-browser.js +1 -4
  57. package/src/mixins/with-resize-observer.js +13 -23
  58. package/src/mixins/with-skeleton-attribute.js +48 -54
  59. package/src/molecules/gv-card-full.js +147 -26
  60. package/src/molecules/gv-card-list.js +42 -13
  61. package/src/molecules/gv-card.js +91 -17
  62. package/src/molecules/gv-category-list.js +17 -6
  63. package/src/molecules/gv-category.js +103 -23
  64. package/src/molecules/gv-code.js +263 -189
  65. package/src/molecules/gv-confirm.js +71 -41
  66. package/src/molecules/gv-cron-editor.js +389 -143
  67. package/src/molecules/gv-dropdown-menu.js +46 -14
  68. package/src/molecules/gv-expandable.js +59 -31
  69. package/src/molecules/gv-expression-language.js +208 -552
  70. package/src/molecules/gv-identity-picture.js +65 -42
  71. package/src/molecules/gv-list.js +134 -42
  72. package/src/molecules/gv-metrics.js +49 -37
  73. package/src/molecules/gv-modal.js +95 -28
  74. package/src/molecules/gv-nav.js +75 -49
  75. package/src/molecules/gv-option.js +130 -57
  76. package/src/molecules/gv-plans.js +209 -86
  77. package/src/molecules/gv-popover.js +177 -57
  78. package/src/molecules/gv-promote.js +146 -28
  79. package/src/molecules/gv-rating-list.js +195 -69
  80. package/src/molecules/gv-rating.js +105 -52
  81. package/src/molecules/gv-row-expandable.js +11 -5
  82. package/src/molecules/gv-row.js +147 -21
  83. package/src/molecules/gv-stats.js +48 -23
  84. package/src/molecules/gv-stepper.js +187 -43
  85. package/src/molecules/gv-table.js +309 -199
  86. package/src/molecules/gv-tree.js +156 -33
  87. package/src/organisms/gv-documentation.js +127 -44
  88. package/src/organisms/gv-header.js +195 -37
  89. package/src/organisms/gv-http-client.js +168 -32
  90. package/src/organisms/gv-menu.js +158 -37
  91. package/src/organisms/gv-newsletter-subscription.js +189 -48
  92. package/src/organisms/gv-pagination.js +77 -49
  93. package/src/organisms/gv-properties.js +492 -271
  94. package/src/organisms/gv-resizable-views.js +259 -41
  95. package/src/organisms/gv-resources.js +275 -168
  96. package/src/organisms/gv-schema-form-array.js +159 -49
  97. package/src/organisms/gv-schema-form-control-object.js +73 -59
  98. package/src/organisms/gv-schema-form-control.js +134 -107
  99. package/src/organisms/gv-schema-form.js +280 -195
  100. package/src/organisms/gv-tabs.js +98 -66
  101. package/src/organisms/gv-user-menu.js +201 -36
  102. package/src/organisms/gv-vertical-menu.js +61 -20
  103. package/src/policy-studio/gv-flow-step.js +245 -105
  104. package/src/policy-studio/gv-flow.js +304 -125
  105. package/src/policy-studio/gv-policy-studio-menu.js +471 -157
  106. package/src/policy-studio/gv-policy-studio.js +761 -692
  107. package/src/styles/empty.js +20 -3
  108. package/src/styles/input.js +247 -3
  109. package/src/styles/link.js +16 -3
  110. package/src/styles/shapes.js +0 -1
  111. package/src/styles/skeleton.js +37 -3
  112. package/src/styles/zoom.js +24 -3
  113. package/src/theme/definition.json +1762 -0
  114. package/src/theme/gv-theme.js +60 -21
  115. package/assets/css/codemirror/all.css +0 -476
  116. package/src/molecules/gv-code-hint.js +0 -49
  117. package/wc/gv-code-hint.js +0 -1
@@ -20,6 +20,7 @@ import '../atoms/gv-image';
20
20
  import { appendDraggableImage, uuid } from '../lib/utils';
21
21
  import { PolicyDraggable } from './gv-flow-step';
22
22
  import { getFlowName, methods } from '../lib/studio';
23
+
23
24
  /**
24
25
  * Flow component
25
26
  *
@@ -35,44 +36,19 @@ import { getFlowName, methods } from '../lib/studio';
35
36
  * @attr {Boolean} disabled - true for disabled
36
37
  * @attr {Boolean} readonly - true if readonly
37
38
  */
38
-
39
39
  export class GvFlow extends LitElement {
40
40
  static get properties() {
41
41
  return {
42
- flow: {
43
- type: Object
44
- },
45
- plan: {
46
- type: Object
47
- },
48
- policies: {
49
- type: Object
50
- },
51
- selectedStepId: {
52
- type: String
53
- },
54
- dragPolicy: {
55
- type: Object
56
- },
57
- dropPolicy: {
58
- type: Object
59
- },
60
- disabled: {
61
- type: Boolean,
62
- reflect: true
63
- },
64
- hasPolicyFilter: {
65
- type: Boolean,
66
- attribute: 'has-policy-filter'
67
- },
68
- flowsTitle: {
69
- type: String,
70
- attribute: 'flows-title'
71
- },
72
- readonly: {
73
- type: Boolean,
74
- reflect: true
75
- }
42
+ flow: { type: Object },
43
+ plan: { type: Object },
44
+ policies: { type: Object },
45
+ selectedStepId: { type: String },
46
+ dragPolicy: { type: Object },
47
+ dropPolicy: { type: Object },
48
+ disabled: { type: Boolean, reflect: true },
49
+ hasPolicyFilter: { type: Boolean, attribute: 'has-policy-filter' },
50
+ flowsTitle: { type: String, attribute: 'flows-title' },
51
+ readonly: { type: Boolean, reflect: true },
76
52
  };
77
53
  }
78
54
 
@@ -97,18 +73,15 @@ export class GvFlow extends LitElement {
97
73
 
98
74
  getOrCreateCandidate() {
99
75
  let candidate = this.getCandidate();
100
-
101
76
  if (!candidate) {
102
77
  candidate = document.createElement('gv-flow-step');
103
78
  candidate.setAttribute('empty', true);
104
79
  }
105
-
106
80
  return candidate;
107
81
  }
108
82
 
109
83
  removeCandidate() {
110
84
  const candidate = this.getCandidate();
111
-
112
85
  if (candidate) {
113
86
  candidate.remove();
114
87
  }
@@ -118,7 +91,6 @@ export class GvFlow extends LitElement {
118
91
  if (this.disabled || this.readonly) {
119
92
  return false;
120
93
  }
121
-
122
94
  if (policy != null) {
123
95
  if (flowKey === 'pre') {
124
96
  return this.hasPolicyFilter !== true || policy.onRequest === true;
@@ -128,7 +100,6 @@ export class GvFlow extends LitElement {
128
100
  throw new Error(`The flowkey [${flowKey}] parameter must be "pre" or "post"`);
129
101
  }
130
102
  }
131
-
132
103
  return false;
133
104
  }
134
105
 
@@ -137,21 +108,21 @@ export class GvFlow extends LitElement {
137
108
  if (e.dataTransfer.items.length > 0) {
138
109
  e.preventDefault();
139
110
  e.stopPropagation();
140
-
141
111
  if (this.dropPolicy == null) {
142
112
  this.dropPolicy = this.dragPolicy;
143
113
  } else {
144
114
  this.dragPolicy = this.dropPolicy;
145
115
  }
146
116
 
147
- if (this.dropPolicy != null && this._canDropPolicy(flowKey, this.dropPolicy.policy) && !e.target.classList.contains('candidate') && !e.target.hasAttribute('dragging')) {
117
+ if (
118
+ this.dropPolicy != null &&
119
+ this._canDropPolicy(flowKey, this.dropPolicy.policy) &&
120
+ !e.target.classList.contains('candidate') &&
121
+ !e.target.hasAttribute('dragging')
122
+ ) {
148
123
  if (e.target.tagName.toLowerCase() === 'gv-flow-step') {
149
- const {
150
- x,
151
- width
152
- } = e.target.getBoundingClientRect();
124
+ const { x, width } = e.target.getBoundingClientRect();
153
125
  const condition = flowKey === 'post' ? e.clientX - x <= width / 2 : e.clientX - x >= width / 2;
154
-
155
126
  if (condition && !(e.target.nextElementSibling && e.target.nextElementSibling.hasAttribute('dragging'))) {
156
127
  e.target.insertAdjacentElement('afterend', this.getOrCreateCandidate());
157
128
  } else if (!(e.target.previousElementSibling && e.target.previousElementSibling.hasAttribute('dragging'))) {
@@ -159,7 +130,6 @@ export class GvFlow extends LitElement {
159
130
  }
160
131
  } else if (e.target.classList && e.target.classList.contains('drop-area-grid')) {
161
132
  const dropAreas = e.target.querySelectorAll('gv-flow-step');
162
-
163
133
  if (dropAreas.length === 0) {
164
134
  e.target.prepend(this.getOrCreateCandidate());
165
135
  }
@@ -175,10 +145,8 @@ export class GvFlow extends LitElement {
175
145
  if (!this.disabled && !this.readonly) {
176
146
  if (this._draggablePolicyImage) {
177
147
  this._draggablePolicyImage.remove();
178
-
179
148
  this._draggablePolicyImage = null;
180
149
  }
181
-
182
150
  this.dragPolicy = null;
183
151
  this.dropPolicy = null;
184
152
  }
@@ -187,7 +155,6 @@ export class GvFlow extends LitElement {
187
155
  _onDragStart(sourceFlowKey, flowStep, sourcePosition, e) {
188
156
  if (!this.disabled && !this.readonly) {
189
157
  const policy = this.findPolicy(flowStep.policy);
190
-
191
158
  if (policy != null) {
192
159
  // Simulate click on window for close all dropdown menu
193
160
  const windowClick = document.createEvent('Events');
@@ -195,22 +162,21 @@ export class GvFlow extends LitElement {
195
162
  window.dispatchEvent(windowClick);
196
163
  e.target.setAttribute('dragging', true);
197
164
  this.shadowRoot.querySelector('.drop-area-grid').classList.add('dragging');
165
+
198
166
  this.dropPolicy = new PolicyDraggable(policy, sourcePosition, sourceFlowKey, this.flow._id, flowStep);
199
167
  e.dataTransfer.setData('text/plain', this.dropPolicy.toString());
200
-
201
168
  if (policy) {
202
169
  const size = 100;
203
170
  this._draggablePolicyImage = appendDraggableImage(policy.icon, size);
204
171
  e.dataTransfer.setDragImage(this._draggablePolicyImage, size / 2, size / 2);
205
172
  }
206
-
207
173
  dispatchCustomEvent(this, 'drag-start', this.dropPolicy);
208
174
  }
209
175
  }
210
176
  }
211
177
 
212
178
  async performUpdate() {
213
- this.getFlowSteps().forEach(s => {
179
+ this.getFlowSteps().forEach((s) => {
214
180
  s.requestUpdate();
215
181
  });
216
182
  super.performUpdate();
@@ -221,35 +187,25 @@ export class GvFlow extends LitElement {
221
187
  }
222
188
 
223
189
  _onDrop(flowKey, e) {
224
- this.shadowRoot.querySelectorAll('gv-flow-step').forEach(step => step.resetConfirm());
190
+ this.shadowRoot.querySelectorAll('gv-flow-step').forEach((step) => step.resetConfirm());
225
191
  e.preventDefault();
226
192
  e.stopPropagation();
227
193
  const box = e.target.closest('.drop-area-grid');
228
194
  const candidate = this.getCandidate();
229
195
  const draggingArea = this.draggingArea;
230
-
231
196
  if (candidate) {
232
197
  let position = 0;
233
- [...box.querySelectorAll('gv-flow-step')].some(area => {
198
+ [...box.querySelectorAll('gv-flow-step')].some((area) => {
234
199
  if (!area.hasAttribute('empty')) {
235
200
  position++;
236
201
  }
237
-
238
202
  return area.hasAttribute('empty');
239
203
  });
240
- const {
241
- policy,
242
- sourceFlowKey,
243
- sourceFlowId,
244
- sourcePosition,
245
- flowStep
246
- } = this.dropPolicy;
247
-
204
+ const { policy, sourceFlowKey, sourceFlowId, sourcePosition, flowStep } = this.dropPolicy;
248
205
  const move = () => {
249
206
  if (draggingArea) {
250
207
  draggingArea.removeAttribute('dragging');
251
208
  }
252
-
253
209
  candidate.remove();
254
210
  dispatchCustomEvent(this, 'drop', {
255
211
  flowId: this.flow._id,
@@ -259,7 +215,7 @@ export class GvFlow extends LitElement {
259
215
  policy,
260
216
  sourcePosition,
261
217
  sourceFlowKey,
262
- sourceFlowId
218
+ sourceFlowId,
263
219
  });
264
220
  this.dragPolicy = null;
265
221
  this.dropPolicy = null;
@@ -277,9 +233,10 @@ export class GvFlow extends LitElement {
277
233
  position,
278
234
  policy,
279
235
  flowStep,
280
- cancelEdit: true
236
+ cancelEdit: true,
281
237
  });
282
238
  });
239
+
283
240
  candidate.addEventListener('gv-flow-step:move', () => {
284
241
  candidate.remove();
285
242
  move();
@@ -298,34 +255,21 @@ export class GvFlow extends LitElement {
298
255
  return this.flow[flowKey][position];
299
256
  }
300
257
 
301
- _onEditStep({
302
- detail: {
303
- step,
304
- policy,
305
- group
306
- }
307
- }) {
308
- dispatchCustomEvent(this, 'edit', {
309
- flow: this.flow,
310
- step,
311
- policy,
312
- group
313
- });
258
+ _onEditStep({ detail: { step, policy, group } }) {
259
+ dispatchCustomEvent(this, 'edit', { flow: this.flow, step, policy, group });
314
260
  }
315
261
 
316
262
  _onDuplicateStep(flowKey, position) {
317
263
  const step = this.getFlowStep(flowKey, position);
318
264
  const duplicatePosition = position + 1;
319
265
  const policy = this.findPolicy(step.policy);
320
- const duplicateStep = { ...step,
321
- _id: uuid()
322
- };
266
+ const duplicateStep = { ...step, _id: uuid() };
323
267
  dispatchCustomEvent(this, 'drop', {
324
268
  flowId: this.flow._id,
325
269
  flowKey,
326
270
  position: duplicatePosition,
327
271
  flowStep: duplicateStep,
328
- policy
272
+ policy,
329
273
  });
330
274
  }
331
275
 
@@ -334,28 +278,32 @@ export class GvFlow extends LitElement {
334
278
  }
335
279
 
336
280
  _onDeleteStep(flowKey, position, e) {
337
- dispatchCustomEvent(this, 'delete', {
338
- flowKey,
339
- position,
340
- flowId: this.flow._id,
341
- target: e.target
342
- });
281
+ dispatchCustomEvent(this, 'delete', { flowKey, position, flowId: this.flow._id, target: e.target });
343
282
  }
344
283
 
345
- _onChangeStepState(flowKey, position, {
346
- detail
347
- }) {
348
- dispatchCustomEvent(this, 'change-state', {
349
- flowKey,
350
- position,
351
- flowId: this.flow._id,
352
- ...detail
353
- });
284
+ _onChangeStepState(flowKey, position, { detail }) {
285
+ dispatchCustomEvent(this, 'change-state', { flowKey, position, flowId: this.flow._id, ...detail });
354
286
  }
355
287
 
356
288
  _renderDropStep(group, step, position) {
357
289
  if (step) {
358
- return html`<gv-flow-step .step="${step}" .policy="${this.findPolicy(step.policy)}" .id="${step._id}" .group="${group}" .parent="${this.flow._id}" ?disabled="${this.disabled}" ?readonly="${this.readonly}" .draggable="${!this.disabled && !this.readonly}" ?editing="${this._isEditable(step)}" @dragstart="${this._onDragStart.bind(this, group, step, position)}" @dragend="${this._onDragEnd}" @gv-flow-step:edit="${this._onEditStep}" @gv-flow-step:change-state="${this._onChangeStepState.bind(this, group, position)}" @gv-flow-step:delete="${this._onDeleteStep.bind(this, group, position)}" @gv-flow-step:duplicate="${this._onDuplicateStep.bind(this, group, position)}"></gv-flow-step>`;
290
+ return html`<gv-flow-step
291
+ .step="${step}"
292
+ .policy="${this.findPolicy(step.policy)}"
293
+ .id="${step._id}"
294
+ .group="${group}"
295
+ .parent="${this.flow._id}"
296
+ ?disabled="${this.disabled}"
297
+ ?readonly="${this.readonly}"
298
+ .draggable="${!this.disabled && !this.readonly}"
299
+ ?editing="${this._isEditable(step)}"
300
+ @dragstart="${this._onDragStart.bind(this, group, step, position)}"
301
+ @dragend="${this._onDragEnd}"
302
+ @gv-flow-step:edit="${this._onEditStep}"
303
+ @gv-flow-step:change-state="${this._onChangeStepState.bind(this, group, position)}"
304
+ @gv-flow-step:delete="${this._onDeleteStep.bind(this, group, position)}"
305
+ @gv-flow-step:duplicate="${this._onDuplicateStep.bind(this, group, position)}"
306
+ ></gv-flow-step>`;
359
307
  } else {
360
308
  return html``;
361
309
  }
@@ -363,14 +311,13 @@ export class GvFlow extends LitElement {
363
311
 
364
312
  async getUpdateComplete() {
365
313
  await super.getUpdateComplete();
366
- await Promise.all(this.getFlowSteps().map(e => e.updateComplete));
314
+ await Promise.all(this.getFlowSteps().map((e) => e.updateComplete));
367
315
  }
368
316
 
369
317
  updated(properties) {
370
318
  if (properties.has('data')) {
371
319
  this.onDragEnd();
372
320
  }
373
-
374
321
  if (properties.has('dropPolicy') || properties.has('dragPolicy')) {
375
322
  if (this.dropPolicy == null && this.dragPolicy == null) {
376
323
  this.removeCandidate();
@@ -383,7 +330,6 @@ export class GvFlow extends LitElement {
383
330
  this.shadowRoot.querySelector('.drop-area-grid').classList.remove('dragging');
384
331
  this.removeCandidate();
385
332
  const draggingArea = this.draggingArea;
386
-
387
333
  if (draggingArea) {
388
334
  draggingArea.removeAttribute('dragging');
389
335
  }
@@ -392,13 +338,15 @@ export class GvFlow extends LitElement {
392
338
 
393
339
  _getLabel(flowKey) {
394
340
  if (this.flow.type) {
395
- return html` <div class="drop-box-type">${flowKey}</div> <div>${this.flow.type.toUpperCase() === 'ROOT' ? 'flow' : this.flow.type}</div> `;
341
+ return html`
342
+ <div class="drop-box-type">${flowKey}</div>
343
+ <div>${this.flow.type.toUpperCase() === 'ROOT' ? 'flow' : this.flow.type}</div>
344
+ `;
396
345
  } else if (flowKey === 'pre') {
397
346
  return 'request';
398
347
  } else if (flowKey === 'post') {
399
348
  return 'response';
400
349
  }
401
-
402
350
  return '';
403
351
  }
404
352
 
@@ -409,34 +357,265 @@ export class GvFlow extends LitElement {
409
357
  render() {
410
358
  const preTarget = this.dragPolicy && (this.hasPolicyFilter !== true || this.dragPolicy.policy.onRequest);
411
359
  const postTarget = this.dragPolicy && (this.hasPolicyFilter !== true || this.dragPolicy.policy.onResponse);
360
+
412
361
  const preForbidden = this.dragPolicy && this.hasPolicyFilter === true && !this.dragPolicy.policy.onRequest;
413
362
  const postForbidden = this.dragPolicy && this.hasPolicyFilter === true && !this.dragPolicy.policy.onResponse;
414
- const hasPost = this.flow.type == null || this.flow.type && this.flow.type.toLowerCase() !== 'root';
415
- return html`<div class="box"> <div class="container"> <div class="header"> <div class="title">${getFlowName(this.flow, this.collectionName)}</div> </div> <div class="content"> <div class="flow"> <div class="${classMap({
416
- pre: true,
417
- targeted: preTarget,
418
- forbidden: preForbidden
419
- })}"> <div class="arrow arrow-right"></div> <div class="drop-box" @drop="${this._onDrop.bind(this, 'pre')}" @dragend="${this.onDragEnd}" @dragover="${this._onDragOver.bind(this, 'pre')}"> <div class="drop-box-title">${preTarget ? 'drop here' : this._getLabel('pre')}</div> <div class="drop-area-grid">${this.flow.pre.map((flowStep, i) => this._renderDropStep('pre', flowStep, i))}</div> </div> </div> ${hasPost ? html` <div class="${classMap({
420
- post: true,
421
- targeted: postTarget,
422
- forbidden: postForbidden
423
- })}"> <div class="arrow arrow-left"> </div> <div class="drop-box" @drop="${this._onDrop.bind(this, 'post')}" @dragend="${this.onDragEnd}" @dragover="${this._onDragOver.bind(this, 'post')}"> <div class="drop-area-grid drop-area-grid-reverse"> ${this.flow.post.map((flowStep, i) => this._renderDropStep('post', flowStep, i))} </div> <div class="drop-box-title">${postTarget ? 'drop here' : this._getLabel('post')}</div> </div> </div> ` : ''} </div> </div> </div> </div>`;
363
+ const hasPost = this.flow.type == null || (this.flow.type && this.flow.type.toLowerCase() !== 'root');
364
+ return html`<div class="box">
365
+ <div class="container">
366
+ <div class="header">
367
+ <div class="title">${getFlowName(this.flow, this.collectionName)}</div>
368
+ </div>
369
+ <div class="content">
370
+ <div class="flow">
371
+ <div class="${classMap({ pre: true, targeted: preTarget, forbidden: preForbidden })}">
372
+ <div class="arrow arrow-right"></div>
373
+ <div
374
+ class="drop-box"
375
+ @drop="${this._onDrop.bind(this, 'pre')}"
376
+ @dragend="${this.onDragEnd}"
377
+ @dragover="${this._onDragOver.bind(this, 'pre')}"
378
+ >
379
+ <div class="drop-box-title">${preTarget ? 'drop here' : this._getLabel('pre')}</div>
380
+ <div class="drop-area-grid">${this.flow.pre.map((flowStep, i) => this._renderDropStep('pre', flowStep, i))}</div>
381
+ </div>
382
+ </div>
383
+
384
+ ${hasPost
385
+ ? html`
386
+ <div class="${classMap({ post: true, targeted: postTarget, forbidden: postForbidden })}">
387
+ <div class='arrow arrow-left'> </div>
388
+ <div class="drop-box"
389
+ @drop="${this._onDrop.bind(this, 'post')}"
390
+ @dragend="${this.onDragEnd}"
391
+ @dragover="${this._onDragOver.bind(this, 'post')}">
392
+ <div class="drop-area-grid drop-area-grid-reverse">
393
+ ${this.flow.post.map((flowStep, i) => this._renderDropStep('post', flowStep, i))}
394
+ </div>
395
+ <div class="drop-box-title">${postTarget ? 'drop here' : this._getLabel('post')}</div>
396
+ </div>
397
+ </div>
398
+ </div>`
399
+ : ''}
400
+ </div>
401
+ </div>
402
+ </div>
403
+ </div>`;
424
404
  }
425
405
 
426
406
  findPolicy(policyId) {
427
- const policy = this.policies.find(p => p.id === policyId);
428
-
429
- if (policy == null) {// throw new Error(`Policy ${policyId} not found`);
407
+ const policy = this.policies.find((p) => p.id === policyId);
408
+ if (policy == null) {
409
+ // throw new Error(`Policy ${policyId} not found`);
430
410
  }
431
-
432
411
  return policy;
433
412
  }
434
413
 
435
414
  static get styles() {
436
- return [methods, // language=CSS
437
- css`:host{box-sizing:border-box;position:relative;display:block;height:100%}.flow{padding-left:20px;display:flex;height:100%;flex-direction:column}.drop-area-grid{flex:1;border:1px dashed transparent;transition:all 350ms ease-in-out;position:relative;display:flex;flex-wrap:wrap;max-width:calc(100% - 40px);align-items:center;min-height:150px;box-sizing:border-box;padding:0 30px}.targeted .drop-area-grid{border:1px dashed #d9d9d9}.forbidden .drop-area-grid{background-color:#efefef;opacity:.2}gv-flow-step{flex:1}.message{text-transform:uppercase;color:#d9d9d9;opacity:0;transition:opacity 350ms ease-in-out;font-size:18px;text-align:center;align-self:center}.message{width:100%}.targeted .message{opacity:1}.targeted .drop-area-empty{opacity:0;transition:all 350ms ease-in-out}.post,.pre{position:relative;flex:1;display:flex}.arrow{background-color:#d9d9d9;width:calc(100% - 50px * 2 - 1px);text-align:center;position:absolute;margin:0 30px;color:#262626;top:calc(50% - 20px);height:40px}.arrow-right::after{width:0;height:0;border-top:40px solid transparent;border-bottom:40px solid transparent;border-left:40px solid #d9d9d9;content:' ';position:absolute;right:-20px;top:-20px}.drop-box-type{position:relative;writing-mode:horizontal-tb;margin-bottom:10px}.drop-box-title{position:relative;writing-mode:vertical-lr;text-orientation:upright;text-transform:uppercase;color:#bfbfbf;font-size:13px;font-weight:500;text-align:center;max-height:145px;line-height:13px;display:flex;align-items:center;min-width:30px}.pre .drop-box-title{position:absolute;left:-30px}.arrow-left::after{width:0;height:0;border-top:40px solid transparent;border-bottom:40px solid transparent;border-right:40px solid #d9d9d9;content:' ';position:absolute;left:-20px;top:-20px}.drop-box{display:flex;border:1px solid transparent;margin:0 30px;align-items:center;position:relative;width:100%}.drop-area-grid-reverse{flex-direction:row-reverse}.header{border-bottom:1px solid #d9d9d9;display:flex;min-height:45px;margin-bottom:.5rem}.header .title{color:#28444f;font-size:18px;display:flex;align-items:center;margin:0 .5rem;width:100%}.header .title .flow-path{flex:1}.box{position:absolute;display:flex;flex-direction:column;width:100%;top:0;bottom:0;left:0}.container{flex-grow:1;display:flex;flex-direction:column;min-height:0;height:100%}.content{background:#fff;flex-grow:1;overflow:auto;min-height:0;padding:.5rem}`];
438
- }
415
+ return [
416
+ methods,
417
+ // language=CSS
418
+ css`
419
+ :host {
420
+ box-sizing: border-box;
421
+ position: relative;
422
+ display: block;
423
+ height: 100%;
424
+ }
425
+
426
+ .flow {
427
+ padding-left: 20px;
428
+ display: flex;
429
+ height: 100%;
430
+ flex-direction: column;
431
+ }
432
+
433
+ .drop-area-grid {
434
+ flex: 1;
435
+ border: 1px dashed transparent;
436
+ transition: all 350ms ease-in-out;
437
+ position: relative;
438
+ display: flex;
439
+ flex-wrap: wrap;
440
+ max-width: calc(100% - 40px);
441
+ align-items: center;
442
+ min-height: 150px;
443
+ box-sizing: border-box;
444
+ padding: 0 30px;
445
+ }
446
+
447
+ .targeted .drop-area-grid {
448
+ border: 1px dashed #d9d9d9;
449
+ }
439
450
 
451
+ .forbidden .drop-area-grid {
452
+ background-color: #efefef;
453
+ opacity: 0.2;
454
+ }
455
+
456
+ gv-flow-step {
457
+ flex: 1;
458
+ }
459
+
460
+ .message {
461
+ text-transform: uppercase;
462
+ color: #d9d9d9;
463
+ opacity: 0;
464
+ transition: opacity 350ms ease-in-out;
465
+ font-size: 18px;
466
+ text-align: center;
467
+ align-self: center;
468
+ }
469
+
470
+ .message {
471
+ width: 100%;
472
+ }
473
+
474
+ .targeted .message {
475
+ opacity: 1;
476
+ }
477
+
478
+ .targeted .drop-area-empty {
479
+ opacity: 0;
480
+ transition: all 350ms ease-in-out;
481
+ }
482
+
483
+ .pre,
484
+ .post {
485
+ position: relative;
486
+ flex: 1;
487
+ display: flex;
488
+ }
489
+
490
+ .arrow {
491
+ background-color: #d9d9d9;
492
+ width: calc(100% - 50px * 2 - 1px);
493
+ text-align: center;
494
+ position: absolute;
495
+ margin: 0 30px;
496
+ color: #262626;
497
+ top: calc(50% - 20px);
498
+ height: 40px;
499
+ }
500
+
501
+ .arrow-right::after {
502
+ width: 0;
503
+ height: 0;
504
+ border-top: 40px solid transparent;
505
+ border-bottom: 40px solid transparent;
506
+ border-left: 40px solid #d9d9d9;
507
+ content: ' ';
508
+ position: absolute;
509
+ right: -20px;
510
+ top: -20px;
511
+ }
512
+
513
+ .drop-box-type {
514
+ position: relative;
515
+ writing-mode: horizontal-tb;
516
+ margin-bottom: 10px;
517
+ }
518
+
519
+ .drop-box-title {
520
+ position: relative;
521
+ writing-mode: vertical-lr;
522
+ text-orientation: upright;
523
+ text-transform: uppercase;
524
+ color: #bfbfbf;
525
+ font-size: 13px;
526
+ font-weight: 500;
527
+ text-align: center;
528
+ max-height: 145px;
529
+ line-height: 13px;
530
+ display: flex;
531
+ align-items: center;
532
+ min-width: 30px;
533
+ }
534
+
535
+ .pre .drop-box-title {
536
+ position: absolute;
537
+ left: -30px;
538
+ }
539
+
540
+ .arrow-left::after {
541
+ width: 0;
542
+ height: 0;
543
+ border-top: 40px solid transparent;
544
+ border-bottom: 40px solid transparent;
545
+ border-right: 40px solid #d9d9d9;
546
+ content: ' ';
547
+ position: absolute;
548
+ left: -20px;
549
+ top: -20px;
550
+ }
551
+
552
+ .drop-box {
553
+ display: flex;
554
+ border: 1px solid transparent;
555
+ margin: 0 30px;
556
+ align-items: center;
557
+ position: relative;
558
+ width: 100%;
559
+ }
560
+
561
+ .drop-area-grid-reverse {
562
+ flex-direction: row-reverse;
563
+ }
564
+
565
+ .header {
566
+ border-bottom: 1px solid #d9d9d9;
567
+ display: flex;
568
+ min-height: 45px;
569
+ margin-bottom: 0.5rem;
570
+ }
571
+
572
+ .header .title {
573
+ color: #28444f;
574
+ font-size: 18px;
575
+ display: flex;
576
+ align-items: center;
577
+ margin: 0 0.5rem;
578
+ width: 100%;
579
+ }
580
+
581
+ .header .title .flow-path {
582
+ flex: 1;
583
+ }
584
+
585
+ .box {
586
+ position: absolute;
587
+ display: flex;
588
+ flex-direction: column;
589
+ width: 100%;
590
+ top: 0;
591
+ bottom: 0;
592
+ left: 0;
593
+ }
594
+
595
+ .container {
596
+ flex-grow: 1;
597
+
598
+ display: flex;
599
+ flex-direction: column;
600
+
601
+ /* for Firefox */
602
+ min-height: 0;
603
+ height: 100%;
604
+ }
605
+
606
+ .content {
607
+ background: white;
608
+ flex-grow: 1;
609
+
610
+ overflow: auto;
611
+
612
+ /* for Firefox */
613
+ min-height: 0;
614
+ padding: 0.5rem;
615
+ }
616
+ `,
617
+ ];
618
+ }
440
619
  }
620
+
441
621
  window.customElements.define('gv-flow', GvFlow);
442
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4vbm9kZV9tb2R1bGVzL0BncmF2aXRlZS91aS1jb21wb25lbnRzL3BvbGljeS1zdHVkaW8vZ3YtZmxvdy5qcyJdLCJuYW1lcyI6WyJMaXRFbGVtZW50IiwiaHRtbCIsImNzcyIsImNsYXNzTWFwIiwiZGlzcGF0Y2hDdXN0b21FdmVudCIsImFwcGVuZERyYWdnYWJsZUltYWdlIiwidXVpZCIsIlBvbGljeURyYWdnYWJsZSIsImdldEZsb3dOYW1lIiwibWV0aG9kcyIsIkd2RmxvdyIsInByb3BlcnRpZXMiLCJmbG93IiwidHlwZSIsIk9iamVjdCIsInBsYW4iLCJwb2xpY2llcyIsInNlbGVjdGVkU3RlcElkIiwiU3RyaW5nIiwiZHJhZ1BvbGljeSIsImRyb3BQb2xpY3kiLCJkaXNhYmxlZCIsIkJvb2xlYW4iLCJyZWZsZWN0IiwiaGFzUG9saWN5RmlsdGVyIiwiYXR0cmlidXRlIiwiZmxvd3NUaXRsZSIsInJlYWRvbmx5IiwiY29uc3RydWN0b3IiLCJhZGRFdmVudExpc3RlbmVyIiwiX29uTW91c2VMZWF2ZSIsImdldENhbmRpZGF0ZSIsInNoYWRvd1Jvb3QiLCJxdWVyeVNlbGVjdG9yIiwiZ2V0Rmxvd1N0ZXBzIiwiQXJyYXkiLCJmcm9tIiwicXVlcnlTZWxlY3RvckFsbCIsImdldE9yQ3JlYXRlQ2FuZGlkYXRlIiwiY2FuZGlkYXRlIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50Iiwic2V0QXR0cmlidXRlIiwicmVtb3ZlQ2FuZGlkYXRlIiwicmVtb3ZlIiwiX2NhbkRyb3BQb2xpY3kiLCJmbG93S2V5IiwicG9saWN5Iiwib25SZXF1ZXN0Iiwib25SZXNwb25zZSIsIkVycm9yIiwiX29uRHJhZ092ZXIiLCJlIiwiZGF0YVRyYW5zZmVyIiwiaXRlbXMiLCJsZW5ndGgiLCJwcmV2ZW50RGVmYXVsdCIsInN0b3BQcm9wYWdhdGlvbiIsInRhcmdldCIsImNsYXNzTGlzdCIsImNvbnRhaW5zIiwiaGFzQXR0cmlidXRlIiwidGFnTmFtZSIsInRvTG93ZXJDYXNlIiwieCIsIndpZHRoIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwiY29uZGl0aW9uIiwiY2xpZW50WCIsIm5leHRFbGVtZW50U2libGluZyIsImluc2VydEFkamFjZW50RWxlbWVudCIsInByZXZpb3VzRWxlbWVudFNpYmxpbmciLCJkcm9wQXJlYXMiLCJwcmVwZW5kIiwiX29uRHJhZ0VuZCIsIl9kcmFnZ2FibGVQb2xpY3lJbWFnZSIsIl9vbkRyYWdTdGFydCIsInNvdXJjZUZsb3dLZXkiLCJmbG93U3RlcCIsInNvdXJjZVBvc2l0aW9uIiwiZmluZFBvbGljeSIsIndpbmRvd0NsaWNrIiwiY3JlYXRlRXZlbnQiLCJpbml0RXZlbnQiLCJ3aW5kb3ciLCJkaXNwYXRjaEV2ZW50IiwiYWRkIiwiX2lkIiwic2V0RGF0YSIsInRvU3RyaW5nIiwic2l6ZSIsImljb24iLCJzZXREcmFnSW1hZ2UiLCJwZXJmb3JtVXBkYXRlIiwiZm9yRWFjaCIsInMiLCJyZXF1ZXN0VXBkYXRlIiwiZHJhZ2dpbmdBcmVhIiwiX29uRHJvcCIsInN0ZXAiLCJyZXNldENvbmZpcm0iLCJib3giLCJjbG9zZXN0IiwicG9zaXRpb24iLCJzb21lIiwiYXJlYSIsInNvdXJjZUZsb3dJZCIsIm1vdmUiLCJyZW1vdmVBdHRyaWJ1dGUiLCJmbG93SWQiLCJjYW5jZWxFZGl0IiwiZ2V0Rmxvd1N0ZXAiLCJfb25FZGl0U3RlcCIsImRldGFpbCIsImdyb3VwIiwiX29uRHVwbGljYXRlU3RlcCIsImR1cGxpY2F0ZVBvc2l0aW9uIiwiZHVwbGljYXRlU3RlcCIsIl9pc0VkaXRhYmxlIiwiX29uRGVsZXRlU3RlcCIsIl9vbkNoYW5nZVN0ZXBTdGF0ZSIsIl9yZW5kZXJEcm9wU3RlcCIsImJpbmQiLCJnZXRVcGRhdGVDb21wbGV0ZSIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJ1cGRhdGVDb21wbGV0ZSIsInVwZGF0ZWQiLCJoYXMiLCJvbkRyYWdFbmQiLCJzZXRUaW1lb3V0IiwiX2dldExhYmVsIiwidG9VcHBlckNhc2UiLCJjb2xsZWN0aW9uTmFtZSIsIm5hbWUiLCJyZW5kZXIiLCJwcmVUYXJnZXQiLCJwb3N0VGFyZ2V0IiwicHJlRm9yYmlkZGVuIiwicG9zdEZvcmJpZGRlbiIsImhhc1Bvc3QiLCJwcmUiLCJ0YXJnZXRlZCIsImZvcmJpZGRlbiIsImkiLCJwb3N0IiwicG9saWN5SWQiLCJmaW5kIiwicCIsImlkIiwic3R5bGVzIiwiY3VzdG9tRWxlbWVudHMiLCJkZWZpbmUiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNBLFVBQVQsRUFBcUJDLElBQXJCLEVBQTJCQyxHQUEzQixRQUFzQyxLQUF0QztBQUNBLFNBQVNDLFFBQVQsUUFBeUIsMEJBQXpCO0FBQ0EsU0FBU0MsbUJBQVQsUUFBb0MsZUFBcEM7QUFDQSxPQUFPLG1CQUFQO0FBQ0EsU0FBU0Msb0JBQVQsRUFBK0JDLElBQS9CLFFBQTJDLGNBQTNDO0FBQ0EsU0FBU0MsZUFBVCxRQUFnQyxnQkFBaEM7QUFDQSxTQUFTQyxXQUFULEVBQXNCQyxPQUF0QixRQUFxQyxlQUFyQztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQSxPQUFPLE1BQU1DLE1BQU4sU0FBcUJWLFVBQXJCLENBQWdDO0FBQ2hCLGFBQVZXLFVBQVUsR0FBRztBQUN0QixXQUFPO0FBQ0xDLE1BQUFBLElBQUksRUFBRTtBQUFFQyxRQUFBQSxJQUFJLEVBQUVDO0FBQVIsT0FERDtBQUVMQyxNQUFBQSxJQUFJLEVBQUU7QUFBRUYsUUFBQUEsSUFBSSxFQUFFQztBQUFSLE9BRkQ7QUFHTEUsTUFBQUEsUUFBUSxFQUFFO0FBQUVILFFBQUFBLElBQUksRUFBRUM7QUFBUixPQUhMO0FBSUxHLE1BQUFBLGNBQWMsRUFBRTtBQUFFSixRQUFBQSxJQUFJLEVBQUVLO0FBQVIsT0FKWDtBQUtMQyxNQUFBQSxVQUFV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QVFrQixLQUFLOUcsSUFBTCxDQUFVc0ksSUFBVixDQUFlcEIsR0FBZixDQUFtQixDQUFDaEQsUUFBRCxFQUFXbUUsQ0FBWCxLQUFpQixLQUFLeEIsZUFBTCxDQUFxQixNQUFyQixFQUE2QjNDLFFBQTdCLEVBQXVDbUUsQ0FBdkMsQ0FBcEMsQ0FSbEIsdUNBVTJDUCxVQUFVLEdBQUcsV0FBSCxHQUFpQixLQUFLTixTQUFMLENBQWUsTUFBZixDQVZ0RSx1QkFEQyxHQWVMLEVBbkNELDhCQUFYO0FBd0NEOztBQUVEcEQsRUFBQUEsVUFBVSxDQUFDbUUsUUFBRCxFQUFXO0FBQ25CLFVBQU1wRyxNQUFNLEdBQUcsS0FBSy9CLFFBQUwsQ0FBY29JLElBQWQsQ0FBb0JDLENBQUQsSUFBT0EsQ0FBQyxDQUFDQyxFQUFGLEtBQVNILFFBQW5DLENBQWY7O0FBQ0EsUUFBSXBHLE1BQU0sSUFBSSxJQUFkLEVBQW9CLENBQ2xCO0FBQ0Q7O0FBQ0QsV0FBT0EsTUFBUDtBQUNEOztBQUVnQixhQUFOd0csTUFBTSxHQUFHO0FBQ2xCLFdBQU8sQ0FDTDlJLE9BREssRUFFTDtBQUNBUCxJQUFBQSxHQUFHLDAxRUFIRSxDQUFQO0FBMk1EOztBQW5rQm9DO0FBc2tCdkNrRixNQUFNLENBQUNvRSxjQUFQLENBQXNCQyxNQUF0QixDQUE2QixTQUE3QixFQUF3Qy9JLE1BQXhDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgR3Jhdml0ZWUgdGVhbSAoaHR0cDovL2dyYXZpdGVlLmlvKVxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IExpdEVsZW1lbnQsIGh0bWwsIGNzcyB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBjbGFzc01hcCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL2NsYXNzLW1hcCc7XG5pbXBvcnQgeyBkaXNwYXRjaEN1c3RvbUV2ZW50IH0gZnJvbSAnLi4vbGliL2V2ZW50cyc7XG5pbXBvcnQgJy4uL2F0b21zL2d2LWltYWdlJztcbmltcG9ydCB7IGFwcGVuZERyYWdnYWJsZUltYWdlLCB1dWlkIH0gZnJvbSAnLi4vbGliL3V0aWxzJztcbmltcG9ydCB7IFBvbGljeURyYWdnYWJsZSB9IGZyb20gJy4vZ3YtZmxvdy1zdGVwJztcbmltcG9ydCB7IGdldEZsb3dOYW1lLCBtZXRob2RzIH0gZnJvbSAnLi4vbGliL3N0dWRpbyc7XG5cbi8qKlxuICogRmxvdyBjb21wb25lbnRcbiAqXG4gKiBAZmlyZXMgZ3YtZmxvdzpkcm9wIC0gRHJvcCBldmVudFxuICogQGZpcmVzIGd2LWZsb3c6ZWRpdCAtIEVkaXQgZXZlbnRcbiAqIEBmaXJlcyBndi1mbG93OmRlbGV0ZSAtIERlbGV0ZSBldmVudFxuICpcbiAqIEBhdHRyIHtPYmplY3R9IGZsb3cgLSB0aGUgZmxvdyB0byBkaXNwbGF5XG4gKiBAYXR0ciB7U3RyaW5nfSBzZWxlY3RlZFN0ZXBJZCAtIHRoZSBzZWxlY3RlZCBzdGVwIGlkXG4gKiBAYXR0ciB7T2JqZWN0fSB0YXJnZXRlZFBvbGljeSAtIHRydWUsIGlmIGZsb3cgaXMgdGFyZ2V0ZWQgZm9yIGRyb3AgYWN0aW9uXG4gKiBAYXR0ciB7Qm9vbGVhbn0gaGFzLXBvbGljeS1maWx0ZXIgLSB0cnVlIGlmIHBvbGljaWVzIGhhdmUgb25SZXF1ZXN0L29uUmVzcG9uc2UgcHJvcGVydGllc1xuICogQGF0dHIge1N0cmluZ30gZmxvd3NUaXRsZSAtIGZsb3dzIG1lbnUgdGl0bGVcbiAqIEBhdHRyIHtCb29sZWFufSBkaXNhYmxlZCAtIHRydWUgZm9yIGRpc2FibGVkXG4gKiBAYXR0ciB7Qm9vbGVhbn0gcmVhZG9ubHkgLSB0cnVlIGlmIHJlYWRvbmx5XG4gKi9cbmV4cG9ydCBjbGFzcyBHdkZsb3cgZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBmbG93OiB7IHR5cGU6IE9iamVjdCB9LFxuICAgICAgcGxhbjogeyB0eXBlOiBPYmplY3QgfSxcbiAgICAgIHBvbGljaWVzOiB7IHR5cGU6IE9iamVjdCB9LFxuICAgICAgc2VsZWN0ZWRTdGVwSWQ6IHsgdHlwZTogU3RyaW5nIH0sXG4gICAgICBkcmFnUG9saWN5OiB7IHR5cGU6IE9iamVjdCB9LFxuICAgICAgZHJvcFBvbGljeTogeyB0eXBlOiBPYmplY3QgfSxcbiAgICAgIGRpc2FibGVkOiB7IHR5cGU6IEJvb2xlYW4sIHJlZmxlY3Q6IHRydWUgfSxcbiAgICAgIGhhc1BvbGljeUZpbHRlcjogeyB0eXBlOiBCb29sZWFuLCBhdHRyaWJ1dGU6ICdoYXMtcG9saWN5LWZpbHRlcicgfSxcbiAgICAgIGZsb3dzVGl0bGU6IHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdmbG93cy10aXRsZScgfSxcbiAgICAgIHJlYWRvbmx5OiB7IHR5cGU6IEJvb2xlYW4sIHJlZmxlY3Q6IHRydWUgfSxcbiAgICB9O1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmZsb3dzVGl0bGUgPSAnRmxvd3MnO1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIHRoaXMuX29uTW91c2VMZWF2ZSk7XG4gIH1cblxuICBfb25Nb3VzZUxlYXZlKCkge1xuICAgIHRoaXMuZHJhZ1BvbGljeSA9IG51bGw7XG4gICAgdGhpcy5kcm9wUG9saWN5ID0gbnVsbDtcbiAgfVxuXG4gIGdldENhbmRpZGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ2d2LWZsb3ctc3RlcFtlbXB0eV0nKTtcbiAgfVxuXG4gIGdldEZsb3dTdGVwcygpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbCgnZ3YtZmxvdy1zdGVwJykpO1xuICB9XG5cbiAgZ2V0T3JDcmVhdGVDYW5kaWRhdGUoKSB7XG4gICAgbGV0IGNhbmRpZGF0ZSA9IHRoaXMuZ2V0Q2FuZGlkYXRlKCk7XG4gICAgaWYgKCFjYW5kaWRhdGUpIHtcbiAgICAgIGNhbmRpZGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2d2LWZsb3ctc3RlcCcpO1xuICAgICAgY2FuZGlkYXRlLnNldEF0dHJpYnV0ZSgnZW1wdHknLCB0cnVlKTtcbiAgICB9XG4gICAgcmV0dXJuIGNhbmRpZGF0ZTtcbiAgfVxuXG4gIHJlbW92ZUNhbmRpZGF0ZSgpIHtcbiAgICBjb25zdCBjYW5kaWRhdGUgPSB0aGlzLmdldENhbmRpZGF0ZSgpO1xuICAgIGlmIChjYW5kaWRhdGUpIHtcbiAgICAgIGNhbmRpZGF0ZS5yZW1vdmUoKTtcbiAgICB9XG4gIH1cblxuICBfY2FuRHJvcFBvbGljeShmbG93S2V5LCBwb2xpY3kpIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChwb2xpY3kgIT0gbnVsbCkge1xuICAgICAgaWYgKGZsb3dLZXkgPT09ICdwcmUnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc1BvbGljeUZpbHRlciAhPT0gdHJ1ZSB8fCBwb2xpY3kub25SZXF1ZXN0ID09PSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChmbG93S2V5ID09PSAncG9zdCcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzUG9saWN5RmlsdGVyICE9PSB0cnVlIHx8IHBvbGljeS5vblJlc3BvbnNlID09PSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgZmxvd2tleSBbJHtmbG93S2V5fV0gcGFyYW1ldGVyIG11c3QgYmUgXCJwcmVcIiBvciBcInBvc3RcImApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBfb25EcmFnT3ZlcihmbG93S2V5LCBlKSB7XG4gICAgaWYgKCF0aGlzLmRpc2FibGVkICYmICF0aGlzLnJlYWRvbmx5KSB7XG4gICAgICBpZiAoZS5kYXRhVHJhbnNmZXIuaXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGlmICh0aGlzLmRyb3BQb2xpY3kgPT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuZHJvcFBvbGljeSA9IHRoaXMuZHJhZ1BvbGljeTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmRyYWdQb2xpY3kgPSB0aGlzLmRyb3BQb2xpY3k7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5kcm9wUG9saWN5ICE9IG51bGwgJiZcbiAgICAgICAgICB0aGlzLl9jYW5Ecm9wUG9saWN5KGZsb3dLZXksIHRoaXMuZHJvcFBvbGljeS5wb2xpY3kpICYmXG4gICAgICAgICAgIWUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnY2FuZGlkYXRlJykgJiZcbiAgICAgICAgICAhZS50YXJnZXQuaGFzQXR0cmlidXRlKCdkcmFnZ2luZycpXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChlLnRhcmdldC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdndi1mbG93LXN0ZXAnKSB7XG4gICAgICAgICAgICBjb25zdCB7IHgsIHdpZHRoIH0gPSBlLnRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvbiA9IGZsb3dLZXkgPT09ICdwb3N0JyA/IGUuY2xpZW50WCAtIHggPD0gd2lkdGggLyAyIDogZS5jbGllbnRYIC0geCA+PSB3aWR0aCAvIDI7XG4gICAgICAgICAgICBpZiAoY29uZGl0aW9uICYmICEoZS50YXJnZXQubmV4dEVsZW1lbnRTaWJsaW5nICYmIGUudGFyZ2V0Lm5leHRFbGVtZW50U2libGluZy5oYXNBdHRyaWJ1dGUoJ2RyYWdnaW5nJykpKSB7XG4gICAgICAgICAgICAgIGUudGFyZ2V0Lmluc2VydEFkamFjZW50RWxlbWVudCgnYWZ0ZXJlbmQnLCB0aGlzLmdldE9yQ3JlYXRlQ2FuZGlkYXRlKCkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghKGUudGFyZ2V0LnByZXZpb3VzRWxlbWVudFNpYmxpbmcgJiYgZS50YXJnZXQucHJldmlvdXNFbGVtZW50U2libGluZy5oYXNBdHRyaWJ1dGUoJ2RyYWdnaW5nJykpKSB7XG4gICAgICAgICAgICAgIGUudGFyZ2V0Lmluc2VydEFkamFjZW50RWxlbWVudCgnYmVmb3JlYmVnaW4nLCB0aGlzLmdldE9yQ3JlYXRlQ2FuZGlkYXRlKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoZS50YXJnZXQuY2xhc3NMaXN0ICYmIGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnZHJvcC1hcmVhLWdyaWQnKSkge1xuICAgICAgICAgICAgY29uc3QgZHJvcEFyZWFzID0gZS50YXJnZXQucXVlcnlTZWxlY3RvckFsbCgnZ3YtZmxvdy1zdGVwJyk7XG4gICAgICAgICAgICBpZiAoZHJvcEFyZWFzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICBlLnRhcmdldC5wcmVwZW5kKHRoaXMuZ2V0T3JDcmVhdGVDYW5kaWRhdGUoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVtb3ZlQ2FuZGlkYXRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX29uRHJhZ0VuZCgpIHtcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQgJiYgIXRoaXMucmVhZG9ubHkpIHtcbiAgICAgIGlmICh0aGlzLl9kcmFnZ2FibGVQb2xpY3lJbWFnZSkge1xuICAgICAgICB0aGlzLl9kcmFnZ2FibGVQb2xpY3lJbWFnZS5yZW1vdmUoKTtcbiAgICAgICAgdGhpcy5fZHJhZ2dhYmxlUG9saWN5SW1hZ2UgPSBudWxsO1xuICAgICAgfVxuICAgICAgdGhpcy5kcmFnUG9saWN5ID0gbnVsbDtcbiAgICAgIHRoaXMuZHJvcFBvbGljeSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgX29uRHJhZ1N0YXJ0KHNvdXJjZUZsb3dLZXksIGZsb3dTdGVwLCBzb3VyY2VQb3NpdGlvbiwgZSkge1xuICAgIGlmICghdGhpcy5kaXNhYmxlZCAmJiAhdGhpcy5yZWFkb25seSkge1xuICAgICAgY29uc3QgcG9saWN5ID0gdGhpcy5maW5kUG9saWN5KGZsb3dTdGVwLnBvbGljeSk7XG4gICAgICBpZiAocG9saWN5ICE9IG51bGwpIHtcbiAgICAgICAgLy8gU2ltdWxhdGUgY2xpY2sgb24gd2luZG93IGZvciBjbG9zZSBhbGwgZHJvcGRvd24gbWVudVxuICAgICAgICBjb25zdCB3aW5kb3dDbGljayA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudHMnKTtcbiAgICAgICAgd2luZG93Q2xpY2suaW5pdEV2ZW50KCdjbGljaycsIHRydWUsIGZhbHNlKTtcbiAgICAgICAgd2luZG93LmRpc3BhdGNoRXZlbnQod2luZG93Q2xpY2spO1xuICAgICAgICBlLnRhcmdldC5zZXRBdHRyaWJ1dGUoJ2RyYWdnaW5nJywgdHJ1ZSk7XG4gICAgICAgIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCcuZHJvcC1hcmVhLWdyaWQnKS5jbGFzc0xpc3QuYWRkKCdkcmFnZ2luZycpO1xuXG4gICAgICAgIHRoaXMuZHJvcFBvbGljeSA9IG5ldyBQb2xpY3lEcmFnZ2FibGUocG9saWN5LCBzb3VyY2VQb3NpdGlvbiwgc291cmNlRmxvd0tleSwgdGhpcy5mbG93Ll9pZCwgZmxvd1N0ZXApO1xuICAgICAgICBlLmRhdGFUcmFuc2Zlci5zZXREYXRhKCd0ZXh0L3BsYWluJywgdGhpcy5kcm9wUG9saWN5LnRvU3RyaW5nKCkpO1xuICAgICAgICBpZiAocG9saWN5KSB7XG4gICAgICAgICAgY29uc3Qgc2l6ZSA9IDEwMDtcbiAgICAgICAgICB0aGlzLl9kcmFnZ2FibGVQb2xpY3lJbWFnZSA9IGFwcGVuZERyYWdnYWJsZUltYWdlKHBvbGljeS5pY29uLCBzaXplKTtcbiAgICAgICAgICBlLmRhdGFUcmFuc2Zlci5zZXREcmFnSW1hZ2UodGhpcy5fZHJhZ2dhYmxlUG9saWN5SW1hZ2UsIHNpemUgLyAyLCBzaXplIC8gMik7XG4gICAgICAgIH1cbiAgICAgICAgZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLCAnZHJhZy1zdGFydCcsIHRoaXMuZHJvcFBvbGljeSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcGVyZm9ybVVwZGF0ZSgpIHtcbiAgICB0aGlzLmdldEZsb3dTdGVwcygpLmZvckVhY2goKHMpID0+IHtcbiAgICAgIHMucmVxdWVzdFVwZGF0ZSgpO1xuICAgIH0pO1xuICAgIHN1cGVyLnBlcmZvcm1VcGRhdGUoKTtcbiAgfVxuXG4gIGdldCBkcmFnZ2luZ0FyZWEoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdndi1mbG93LXN0ZXBbZHJhZ2dpbmddJyk7XG4gIH1cblxuICBfb25Ecm9wKGZsb3dLZXksIGUpIHtcbiAgICB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbCgnZ3YtZmxvdy1zdGVwJykuZm9yRWFjaCgoc3RlcCkgPT4gc3RlcC5yZXNldENvbmZpcm0oKSk7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3QgYm94ID0gZS50YXJnZXQuY2xvc2VzdCgnLmRyb3AtYXJlYS1ncmlkJyk7XG4gICAgY29uc3QgY2FuZGlkYXRlID0gdGhpcy5nZXRDYW5kaWRhdGUoKTtcbiAgICBjb25zdCBkcmFnZ2luZ0FyZWEgPSB0aGlzLmRyYWdnaW5nQXJlYTtcbiAgICBpZiAoY2FuZGlkYXRlKSB7XG4gICAgICBsZXQgcG9zaXRpb24gPSAwO1xuICAgICAgWy4uLmJveC5xdWVyeVNlbGVjdG9yQWxsKCdndi1mbG93LXN0ZXAnKV0uc29tZSgoYXJlYSkgPT4ge1xuICAgICAgICBpZiAoIWFyZWEuaGFzQXR0cmlidXRlKCdlbXB0eScpKSB7XG4gICAgICAgICAgcG9zaXRpb24rKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXJlYS5oYXNBdHRyaWJ1dGUoJ2VtcHR5Jyk7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHsgcG9saWN5LCBzb3VyY2VGbG93S2V5LCBzb3VyY2VGbG93SWQsIHNvdXJjZVBvc2l0aW9uLCBmbG93U3RlcCB9ID0gdGhpcy5kcm9wUG9saWN5O1xuICAgICAgY29uc3QgbW92ZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKGRyYWdnaW5nQXJlYSkge1xuICAgICAgICAgIGRyYWdnaW5nQXJlYS5yZW1vdmVBdHRyaWJ1dGUoJ2RyYWdnaW5nJyk7XG4gICAgICAgIH1cbiAgICAgICAgY2FuZGlkYXRlLnJlbW92ZSgpO1xuICAgICAgICBkaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMsICdkcm9wJywge1xuICAgICAgICAgIGZsb3dJZDogdGhpcy5mbG93Ll9pZCxcbiAgICAgICAgICBmbG93S2V5LFxuICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgIGZsb3dTdGVwLFxuICAgICAgICAgIHBvbGljeSxcbiAgICAgICAgICBzb3VyY2VQb3NpdGlvbixcbiAgICAgICAgICBzb3VyY2VGbG93S2V5LFxuICAgICAgICAgIHNvdXJjZUZsb3dJZCxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZHJhZ1BvbGljeSA9IG51bGw7XG4gICAgICAgIHRoaXMuZHJvcFBvbGljeSA9IG51bGw7XG4gICAgICB9O1xuXG4gICAgICBpZiAoc291cmNlRmxvd0lkICE9IG51bGwgJiYgdGhpcy5mbG93Ll9pZCAhPT0gc291cmNlRmxvd0lkKSB7XG4gICAgICAgIGNhbmRpZGF0ZS5zZXRBdHRyaWJ1dGUoJ2NvbmZpcm0nLCB0cnVlKTtcbiAgICAgICAgY2FuZGlkYXRlLmFkZEV2ZW50TGlzdGVuZXIoJ2d2LWZsb3ctc3RlcDpjb3B5JywgKCkgPT4ge1xuICAgICAgICAgIGNhbmRpZGF0ZS5yZW1vdmUoKTtcbiAgICAgICAgICB0aGlzLmRyYWdQb2xpY3kgPSBudWxsO1xuICAgICAgICAgIHRoaXMuZHJvcFBvbGljeSA9IG51bGw7XG4gICAgICAgICAgZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLCAnZHJvcCcsIHtcbiAgICAgICAgICAgIGZsb3dJZDogdGhpcy5mbG93Ll9pZCxcbiAgICAgICAgICAgIGZsb3dLZXksXG4gICAgICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgICAgIHBvbGljeSxcbiAgICAgICAgICAgIGZsb3dTdGVwLFxuICAgICAgICAgICAgY2FuY2VsRWRpdDogdHJ1ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY2FuZGlkYXRlLmFkZEV2ZW50TGlzdGVuZXIoJ2d2LWZsb3ctc3RlcDptb3ZlJywgKCkgPT4ge1xuICAgICAgICAgIGNhbmRpZGF0ZS5yZW1vdmUoKTtcbiAgICAgICAgICBtb3ZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbW92ZSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZHJhZ2dpbmdBcmVhKSB7XG4gICAgICBkcmFnZ2luZ0FyZWEucmVtb3ZlQXR0cmlidXRlKCdkcmFnZ2luZycpO1xuICAgICAgdGhpcy5kcmFnUG9saWN5ID0gbnVsbDtcbiAgICAgIHRoaXMuZHJvcFBvbGljeSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgZ2V0Rmxvd1N0ZXAoZmxvd0tleSwgcG9zaXRpb24pIHtcbiAgICByZXR1cm4gdGhpcy5mbG93W2Zsb3dLZXldW3Bvc2l0aW9uXTtcbiAgfVxuXG4gIF9vbkVkaXRTdGVwKHsgZGV0YWlsOiB7IHN0ZXAsIHBvbGljeSwgZ3JvdXAgfSB9KSB7XG4gICAgZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLCAnZWRpdCcsIHsgZmxvdzogdGhpcy5mbG93LCBzdGVwLCBwb2xpY3ksIGdyb3VwIH0pO1xuICB9XG5cbiAgX29uRHVwbGljYXRlU3RlcChmbG93S2V5LCBwb3NpdGlvbikge1xuICAgIGNvbnN0IHN0ZXAgPSB0aGlzLmdldEZsb3dTdGVwKGZsb3dLZXksIHBvc2l0aW9uKTtcbiAgICBjb25zdCBkdXBsaWNhdGVQb3NpdGlvbiA9IHBvc2l0aW9uICsgMTtcbiAgICBjb25zdCBwb2xpY3kgPSB0aGlzLmZpbmRQb2xpY3koc3RlcC5wb2xpY3kpO1xuICAgIGNvbnN0IGR1cGxpY2F0ZVN0ZXAgPSB7IC4uLnN0ZXAsIF9pZDogdXVpZCgpIH07XG4gICAgZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLCAnZHJvcCcsIHtcbiAgICAgIGZsb3dJZDogdGhpcy5mbG93Ll9pZCxcbiAgICAgIGZsb3dLZXksXG4gICAgICBwb3NpdGlvbjogZHVwbGljYXRlUG9zaXRpb24sXG4gICAgICBmbG93U3RlcDogZHVwbGljYXRlU3RlcCxcbiAgICAgIHBvbGljeSxcbiAgICB9KTtcbiAgfVxuXG4gIF9pc0VkaXRhYmxlKHN0ZXApIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFN0ZXBJZCAmJiB0aGlzLnNlbGVjdGVkU3RlcElkID09PSBzdGVwLl9pZDtcbiAgfVxuXG4gIF9vbkRlbGV0ZVN0ZXAoZmxvd0tleSwgcG9zaXRpb24sIGUpIHtcbiAgICBkaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMsICdkZWxldGUnLCB7IGZsb3dLZXksIHBvc2l0aW9uLCBmbG93SWQ6IHRoaXMuZmxvdy5faWQsIHRhcmdldDogZS50YXJnZXQgfSk7XG4gIH1cblxuICBfb25DaGFuZ2VTdGVwU3RhdGUoZmxvd0tleSwgcG9zaXRpb24sIHsgZGV0YWlsIH0pIHtcbiAgICBkaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMsICdjaGFuZ2Utc3RhdGUnLCB7IGZsb3dLZXksIHBvc2l0aW9uLCBmbG93SWQ6IHRoaXMuZmxvdy5faWQsIC4uLmRldGFpbCB9KTtcbiAgfVxuXG4gIF9yZW5kZXJEcm9wU3RlcChncm91cCwgc3RlcCwgcG9zaXRpb24pIHtcbiAgICBpZiAoc3RlcCkge1xuICAgICAgcmV0dXJuIGh0bWxgPGd2LWZsb3ctc3RlcFxuICAgICAgICAuc3RlcD1cIiR7c3RlcH1cIlxuICAgICAgICAucG9saWN5PVwiJHt0aGlzLmZpbmRQb2xpY3koc3RlcC5wb2xpY3kpfVwiXG4gICAgICAgIC5pZD1cIiR7c3RlcC5faWR9XCJcbiAgICAgICAgLmdyb3VwPVwiJHtncm91cH1cIlxuICAgICAgICAucGFyZW50PVwiJHt0aGlzLmZsb3cuX2lkfVwiXG4gICAgICAgID9kaXNhYmxlZD1cIiR7dGhpcy5kaXNhYmxlZH1cIlxuICAgICAgICA/cmVhZG9ubHk9XCIke3RoaXMucmVhZG9ubHl9XCJcbiAgICAgICAgLmRyYWdnYWJsZT1cIiR7IXRoaXMuZGlzYWJsZWQgJiYgIXRoaXMucmVhZG9ubHl9XCJcbiAgICAgICAgP2VkaXRpbmc9XCIke3RoaXMuX2lzRWRpdGFibGUoc3RlcCl9XCJcbiAgICAgICAgQGRyYWdzdGFydD1cIiR7dGhpcy5fb25EcmFnU3RhcnQuYmluZCh0aGlzLCBncm91cCwgc3RlcCwgcG9zaXRpb24pfVwiXG4gICAgICAgIEBkcmFnZW5kPVwiJHt0aGlzLl9vbkRyYWdFbmR9XCJcbiAgICAgICAgQGd2LWZsb3ctc3RlcDplZGl0PVwiJHt0aGlzLl9vbkVkaXRTdGVwfVwiXG4gICAgICAgIEBndi1mbG93LXN0ZXA6Y2hhbmdlLXN0YXRlPVwiJHt0aGlzLl9vbkNoYW5nZVN0ZXBTdGF0ZS5iaW5kKHRoaXMsIGdyb3VwLCBwb3NpdGlvbil9XCJcbiAgICAgICAgQGd2LWZsb3ctc3RlcDpkZWxldGU9XCIke3RoaXMuX29uRGVsZXRlU3RlcC5iaW5kKHRoaXMsIGdyb3VwLCBwb3NpdGlvbil9XCJcbiAgICAgICAgQGd2LWZsb3ctc3RlcDpkdXBsaWNhdGU9XCIke3RoaXMuX29uRHVwbGljYXRlU3RlcC5iaW5kKHRoaXMsIGdyb3VwLCBwb3NpdGlvbil9XCJcbiAgICAgID48L2d2LWZsb3ctc3RlcD5gO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaHRtbGBgO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldFVwZGF0ZUNvbXBsZXRlKCkge1xuICAgIGF3YWl0IHN1cGVyLmdldFVwZGF0ZUNvbXBsZXRlKCk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5nZXRGbG93U3RlcHMoKS5tYXAoKGUpID0+IGUudXBkYXRlQ29tcGxldGUpKTtcbiAgfVxuXG4gIHVwZGF0ZWQocHJvcGVydGllcykge1xuICAgIGlmIChwcm9wZXJ0aWVzLmhhcygnZGF0YScpKSB7XG4gICAgICB0aGlzLm9uRHJhZ0VuZCgpO1xuICAgIH1cbiAgICBpZiAocHJvcGVydGllcy5oYXMoJ2Ryb3BQb2xpY3knKSB8fCBwcm9wZXJ0aWVzLmhhcygnZHJhZ1BvbGljeScpKSB7XG4gICAgICBpZiAodGhpcy5kcm9wUG9saWN5ID09IG51bGwgJiYgdGhpcy5kcmFnUG9saWN5ID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVDYW5kaWRhdGUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbkRyYWdFbmQoKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignLmRyb3AtYXJlYS1ncmlkJykuY2xhc3NMaXN0LnJlbW92ZSgnZHJhZ2dpbmcnKTtcbiAgICAgIHRoaXMucmVtb3ZlQ2FuZGlkYXRlKCk7XG4gICAgICBjb25zdCBkcmFnZ2luZ0FyZWEgPSB0aGlzLmRyYWdnaW5nQXJlYTtcbiAgICAgIGlmIChkcmFnZ2luZ0FyZWEpIHtcbiAgICAgICAgZHJhZ2dpbmdBcmVhLnJlbW92ZUF0dHJpYnV0ZSgnZHJhZ2dpbmcnKTtcbiAgICAgIH1cbiAgICB9LCAwKTtcbiAgfVxuXG4gIF9nZXRMYWJlbChmbG93S2V5KSB7XG4gICAgaWYgKHRoaXMuZmxvdy50eXBlKSB7XG4gICAgICByZXR1cm4gaHRtbGBcbiAgICAgICAgPGRpdiBjbGFzcz1cImRyb3AtYm94LXR5cGVcIj4ke2Zsb3dLZXl9PC9kaXY+XG4gICAgICAgIDxkaXY+JHt0aGlzLmZsb3cudHlwZS50b1VwcGVyQ2FzZSgpID09PSAnUk9PVCcgPyAnZmxvdycgOiB0aGlzLmZsb3cudHlwZX08L2Rpdj5cbiAgICAgIGA7XG4gICAgfSBlbHNlIGlmIChmbG93S2V5ID09PSAncHJlJykge1xuICAgICAgcmV0dXJuICdyZXF1ZXN0JztcbiAgICB9IGVsc2UgaWYgKGZsb3dLZXkgPT09ICdwb3N0Jykge1xuICAgICAgcmV0dXJuICdyZXNwb25zZSc7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGdldCBjb2xsZWN0aW9uTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5wbGFuICE9IG51bGwgPyB0aGlzLnBsYW4ubmFtZSA6IHRoaXMuZmxvd3NUaXRsZTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCBwcmVUYXJnZXQgPSB0aGlzLmRyYWdQb2xpY3kgJiYgKHRoaXMuaGFzUG9saWN5RmlsdGVyICE9PSB0cnVlIHx8IHRoaXMuZHJhZ1BvbGljeS5wb2xpY3kub25SZXF1ZXN0KTtcbiAgICBjb25zdCBwb3N0VGFyZ2V0ID0gdGhpcy5kcmFnUG9saWN5ICYmICh0aGlzLmhhc1BvbGljeUZpbHRlciAhPT0gdHJ1ZSB8fCB0aGlzLmRyYWdQb2xpY3kucG9saWN5Lm9uUmVzcG9uc2UpO1xuXG4gICAgY29uc3QgcHJlRm9yYmlkZGVuID0gdGhpcy5kcmFnUG9saWN5ICYmIHRoaXMuaGFzUG9saWN5RmlsdGVyID09PSB0cnVlICYmICF0aGlzLmRyYWdQb2xpY3kucG9saWN5Lm9uUmVxdWVzdDtcbiAgICBjb25zdCBwb3N0Rm9yYmlkZGVuID0gdGhpcy5kcmFnUG9saWN5ICYmIHRoaXMuaGFzUG9saWN5RmlsdGVyID09PSB0cnVlICYmICF0aGlzLmRyYWdQb2xpY3kucG9saWN5Lm9uUmVzcG9uc2U7XG4gICAgY29uc3QgaGFzUG9zdCA9IHRoaXMuZmxvdy50eXBlID09IG51bGwgfHwgKHRoaXMuZmxvdy50eXBlICYmIHRoaXMuZmxvdy50eXBlLnRvTG93ZXJDYXNlKCkgIT09ICdyb290Jyk7XG4gICAgcmV0dXJuIGh0bWxgPGRpdiBjbGFzcz1cImJveFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+JHtnZXRGbG93TmFtZSh0aGlzLmZsb3csIHRoaXMuY29sbGVjdGlvbk5hbWUpfTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxvd1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIiR7Y2xhc3NNYXAoeyBwcmU6IHRydWUsIHRhcmdldGVkOiBwcmVUYXJnZXQsIGZvcmJpZGRlbjogcHJlRm9yYmlkZGVuIH0pfVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJyb3cgYXJyb3ctcmlnaHRcIj48L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZHJvcC1ib3hcIlxuICAgICAgICAgICAgICAgIEBkcm9wPVwiJHt0aGlzLl9vbkRyb3AuYmluZCh0aGlzLCAncHJlJyl9XCJcbiAgICAgICAgICAgICAgICBAZHJhZ2VuZD1cIiR7dGhpcy5vbkRyYWdFbmR9XCJcbiAgICAgICAgICAgICAgICBAZHJhZ292ZXI9XCIke3RoaXMuX29uRHJhZ092ZXIuYmluZCh0aGlzLCAncHJlJyl9XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wLWJveC10aXRsZVwiPiR7cHJlVGFyZ2V0ID8gJ2Ryb3AgaGVyZScgOiB0aGlzLl9nZXRMYWJlbCgncHJlJyl9PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3AtYXJlYS1ncmlkXCI+JHt0aGlzLmZsb3cucHJlLm1hcCgoZmxvd1N0ZXAsIGkpID0+IHRoaXMuX3JlbmRlckRyb3BTdGVwKCdwcmUnLCBmbG93U3RlcCwgaSkpfTwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAke2hhc1Bvc3RcbiAgICAgICAgICAgICAgPyBodG1sYFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIiR7Y2xhc3NNYXAoeyBwb3N0OiB0cnVlLCB0YXJnZXRlZDogcG9zdFRhcmdldCwgZm9yYmlkZGVuOiBwb3N0Rm9yYmlkZGVuIH0pfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdhcnJvdyBhcnJvdy1sZWZ0Jz4gPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3AtYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBkcm9wPVwiJHt0aGlzLl9vbkRyb3AuYmluZCh0aGlzLCAncG9zdCcpfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZHJhZ2VuZD1cIiR7dGhpcy5vbkRyYWdFbmR9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBkcmFnb3Zlcj1cIiR7dGhpcy5fb25EcmFnT3Zlci5iaW5kKHRoaXMsICdwb3N0Jyl9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcC1hcmVhLWdyaWQgZHJvcC1hcmVhLWdyaWQtcmV2ZXJzZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHt0aGlzLmZsb3cucG9zdC5tYXAoKGZsb3dTdGVwLCBpKSA9PiB0aGlzLl9yZW5kZXJEcm9wU3RlcCgncG9zdCcsIGZsb3dTdGVwLCBpKSl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wLWJveC10aXRsZVwiPiR7cG9zdFRhcmdldCA/ICdkcm9wIGhlcmUnIDogdGhpcy5fZ2V0TGFiZWwoJ3Bvc3QnKX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+YFxuICAgICAgICAgICAgICA6ICcnfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PmA7XG4gIH1cblxuICBmaW5kUG9saWN5KHBvbGljeUlkKSB7XG4gICAgY29uc3QgcG9saWN5ID0gdGhpcy5wb2xpY2llcy5maW5kKChwKSA9PiBwLmlkID09PSBwb2xpY3lJZCk7XG4gICAgaWYgKHBvbGljeSA9PSBudWxsKSB7XG4gICAgICAvLyB0aHJvdyBuZXcgRXJyb3IoYFBvbGljeSAke3BvbGljeUlkfSBub3QgZm91bmRgKTtcbiAgICB9XG4gICAgcmV0dXJuIHBvbGljeTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgc3R5bGVzKCkge1xuICAgIHJldHVybiBbXG4gICAgICBtZXRob2RzLFxuICAgICAgLy8gbGFuZ3VhZ2U9Q1NTXG4gICAgICBjc3NgXG4gICAgICAgIDpob3N0IHtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIH1cblxuICAgICAgICAuZmxvdyB7XG4gICAgICAgICAgcGFkZGluZy1sZWZ0OiAyMHB4O1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIH1cblxuICAgICAgICAuZHJvcC1hcmVhLWdyaWQge1xuICAgICAgICAgIGZsZXg6IDE7XG4gICAgICAgICAgYm9yZGVyOiAxcHggZGFzaGVkIHRyYW5zcGFyZW50O1xuICAgICAgICAgIHRyYW5zaXRpb246IGFsbCAzNTBtcyBlYXNlLWluLW91dDtcbiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgICAgICAgbWF4LXdpZHRoOiBjYWxjKDEwMCUgLSA0MHB4KTtcbiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICAgIG1pbi1oZWlnaHQ6IDE1MHB4O1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgcGFkZGluZzogMCAzMHB4O1xuICAgICAgICB9XG5cbiAgICAgICAgLnRhcmdldGVkIC5kcm9wLWFyZWEtZ3JpZCB7XG4gICAgICAgICAgYm9yZGVyOiAxcHggZGFzaGVkICNkOWQ5ZDk7XG4gICAgICAgIH1cblxuICAgICAgICAuZm9yYmlkZGVuIC5kcm9wLWFyZWEtZ3JpZCB7XG4gICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2VmZWZlZjtcbiAgICAgICAgICBvcGFjaXR5OiAwLjI7XG4gICAgICAgIH1cblxuICAgICAgICBndi1mbG93LXN0ZXAge1xuICAgICAgICAgIGZsZXg6IDE7XG4gICAgICAgIH1cblxuICAgICAgICAubWVzc2FnZSB7XG4gICAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgICAgICAgICBjb2xvcjogI2Q5ZDlkOTtcbiAgICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMzUwbXMgZWFzZS1pbi1vdXQ7XG4gICAgICAgICAgZm9udC1zaXplOiAxOHB4O1xuICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgICAgICBhbGlnbi1zZWxmOiBjZW50ZXI7XG4gICAgICAgIH1cblxuICAgICAgICAubWVzc2FnZSB7XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIH1cblxuICAgICAgICAudGFyZ2V0ZWQgLm1lc3NhZ2Uge1xuICAgICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgIH1cblxuICAgICAgICAudGFyZ2V0ZWQgLmRyb3AtYXJlYS1lbXB0eSB7XG4gICAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMzUwbXMgZWFzZS1pbi1vdXQ7XG4gICAgICAgIH1cblxuICAgICAgICAucHJlLFxuICAgICAgICAucG9zdCB7XG4gICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICAgIGZsZXg6IDE7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5hcnJvdyB7XG4gICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZDlkOTtcbiAgICAgICAgICB3aWR0aDogY2FsYygxMDAlIC0gNTBweCAqIDIgLSAxcHgpO1xuICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgbWFyZ2luOiAwIDMwcHg7XG4gICAgICAgICAgY29sb3I6ICMyNjI2MjY7XG4gICAgICAgICAgdG9wOiBjYWxjKDUwJSAtIDIwcHgpO1xuICAgICAgICAgIGhlaWdodDogNDBweDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5hcnJvdy1yaWdodDo6YWZ0ZXIge1xuICAgICAgICAgIHdpZHRoOiAwO1xuICAgICAgICAgIGhlaWdodDogMDtcbiAgICAgICAgICBib3JkZXItdG9wOiA0MHB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICAgICAgICAgIGJvcmRlci1ib3R0b206IDQwcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgICAgICAgYm9yZGVyLWxlZnQ6IDQwcHggc29saWQgI2Q5ZDlkOTtcbiAgICAgICAgICBjb250ZW50OiAnICc7XG4gICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgIHJpZ2h0OiAtMjBweDtcbiAgICAgICAgICB0b3A6IC0yMHB4O1xuICAgICAgICB9XG5cbiAgICAgICAgLmRyb3AtYm94LXR5cGUge1xuICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgICB3cml0aW5nLW1vZGU6IGhvcml6b250YWwtdGI7XG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5kcm9wLWJveC10aXRsZSB7XG4gICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICAgIHdyaXRpbmctbW9kZTogdmVydGljYWwtbHI7XG4gICAgICAgICAgdGV4dC1vcmllbnRhdGlvbjogdXByaWdodDtcbiAgICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgICAgICAgIGNvbG9yOiAjYmZiZmJmO1xuICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDtcbiAgICAgICAgICBmb250LXdlaWdodDogNTAwO1xuICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgICAgICBtYXgtaGVpZ2h0OiAxNDVweDtcbiAgICAgICAgICBsaW5lLWhlaWdodDogMTNweDtcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgICAgbWluLXdpZHRoOiAzMHB4O1xuICAgICAgICB9XG5cbiAgICAgICAgLnByZSAuZHJvcC1ib3gtdGl0bGUge1xuICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICBsZWZ0OiAtMzBweDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5hcnJvdy1sZWZ0OjphZnRlciB7XG4gICAgICAgICAgd2lkdGg6IDA7XG4gICAgICAgICAgaGVpZ2h0OiAwO1xuICAgICAgICAgIGJvcmRlci10b3A6IDQwcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgICAgICAgYm9yZGVyLWJvdHRvbTogNDBweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgICAgICAgICBib3JkZXItcmlnaHQ6IDQwcHggc29saWQgI2Q5ZDlkOTtcbiAgICAgICAgICBjb250ZW50OiAnICc7XG4gICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgIGxlZnQ6IC0yMHB4O1xuICAgICAgICAgIHRvcDogLTIwcHg7XG4gICAgICAgIH1cblxuICAgICAgICAuZHJvcC1ib3gge1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgICAgICAgbWFyZ2luOiAwIDMwcHg7XG4gICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIH1cblxuICAgICAgICAuZHJvcC1hcmVhLWdyaWQtcmV2ZXJzZSB7XG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLmhlYWRlciB7XG4gICAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkOWQ5ZDk7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBtaW4taGVpZ2h0OiA0NXB4O1xuICAgICAgICAgIG1hcmdpbi1ib3R0b206IDAuNXJlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5oZWFkZXIgLnRpdGxlIHtcbiAgICAgICAgICBjb2xvcjogIzI4NDQ0ZjtcbiAgICAgICAgICBmb250LXNpemU6IDE4cHg7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICAgIG1hcmdpbjogMCAwLjVyZW07XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIH1cblxuICAgICAgICAuaGVhZGVyIC50aXRsZSAuZmxvdy1wYXRoIHtcbiAgICAgICAgICBmbGV4OiAxO1xuICAgICAgICB9XG5cbiAgICAgICAgLmJveCB7XG4gICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICB0b3A6IDA7XG4gICAgICAgICAgYm90dG9tOiAwO1xuICAgICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIH1cblxuICAgICAgICAuY29udGFpbmVyIHtcbiAgICAgICAgICBmbGV4LWdyb3c6IDE7XG5cbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cbiAgICAgICAgICAvKiBmb3IgRmlyZWZveCAqL1xuICAgICAgICAgIG1pbi1oZWlnaHQ6IDA7XG4gICAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICB9XG5cbiAgICAgICAgLmNvbnRlbnQge1xuICAgICAgICAgIGJhY2tncm91bmQ6IHdoaXRlO1xuICAgICAgICAgIGZsZXgtZ3JvdzogMTtcblxuICAgICAgICAgIG92ZXJmbG93OiBhdXRvO1xuXG4gICAgICAgICAgLyogZm9yIEZpcmVmb3ggKi9cbiAgICAgICAgICBtaW4taGVpZ2h0OiAwO1xuICAgICAgICAgIHBhZGRpbmc6IDAuNXJlbTtcbiAgICAgICAgfVxuICAgICAgYCxcbiAgICBdO1xuICB9XG59XG5cbndpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ2d2LWZsb3cnLCBHdkZsb3cpO1xuIl19