@gravitee/ui-components 3.25.1 → 3.25.3-typescript-ad6021f

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 (111) hide show
  1. package/CHANGELOG.md +1292 -0
  2. package/LICENSE.txt +202 -0
  3. package/README.md +195 -0
  4. package/package.json +17 -4
  5. package/src/.eslintrc.js +19 -0
  6. package/src/atoms/gv-autocomplete.js +156 -132
  7. package/src/atoms/gv-button.js +248 -73
  8. package/src/atoms/gv-checkbox.js +103 -45
  9. package/src/atoms/gv-date-picker-calendar.js +393 -312
  10. package/src/atoms/gv-date-picker-cell.js +81 -57
  11. package/src/atoms/gv-date-picker.js +319 -180
  12. package/src/atoms/gv-file-upload.js +195 -85
  13. package/src/atoms/gv-icon.js +34 -13
  14. package/src/atoms/gv-image.js +66 -31
  15. package/src/atoms/gv-input-message.js +37 -12
  16. package/src/atoms/gv-input.js +148 -117
  17. package/src/atoms/gv-link.js +125 -47
  18. package/src/atoms/gv-message.js +69 -18
  19. package/src/atoms/gv-metric.js +68 -19
  20. package/src/atoms/gv-relative-time.js +38 -67
  21. package/src/atoms/gv-select-native.js +215 -96
  22. package/src/atoms/gv-select.js +230 -110
  23. package/src/atoms/gv-spinner.js +26 -5
  24. package/src/atoms/gv-state.js +66 -25
  25. package/src/atoms/gv-switch.js +160 -40
  26. package/src/atoms/gv-tag.js +78 -26
  27. package/src/atoms/gv-text.js +83 -22
  28. package/src/charts/gv-chart-bar.js +18 -22
  29. package/src/charts/gv-chart-gauge.js +31 -28
  30. package/src/charts/gv-chart-histogram.js +10 -18
  31. package/src/charts/gv-chart-line.js +59 -70
  32. package/src/charts/gv-chart-map.js +42 -44
  33. package/src/charts/gv-chart-pie.js +14 -18
  34. package/src/index.js +0 -1
  35. package/src/lib/cron-expression.js +35 -40
  36. package/src/lib/date.js +1 -10
  37. package/src/lib/events.js +1 -3
  38. package/src/lib/http-client-schema-form.js +12 -13
  39. package/src/lib/http.js +56 -57
  40. package/src/lib/i18n.js +22 -30
  41. package/src/lib/item.js +12 -13
  42. package/src/lib/properties.js +42 -77
  43. package/src/lib/schema-form.js +5 -4
  44. package/src/lib/studio.js +60 -13
  45. package/src/lib/style.js +8 -8
  46. package/src/lib/text-format.js +7 -14
  47. package/src/lib/theme.js +5 -8
  48. package/src/lib/utils.js +18 -17
  49. package/src/mixins/chart-element.js +54 -31
  50. package/src/mixins/input-element.js +47 -60
  51. package/src/mixins/item-resource.js +32 -34
  52. package/src/mixins/keyboard-element.js +5 -6
  53. package/src/mixins/update-after-browser.js +1 -4
  54. package/src/mixins/with-resize-observer.js +13 -23
  55. package/src/mixins/with-skeleton-attribute.js +48 -54
  56. package/src/molecules/gv-card-full.js +147 -26
  57. package/src/molecules/gv-card-list.js +42 -13
  58. package/src/molecules/gv-card.js +91 -17
  59. package/src/molecules/gv-category-list.js +17 -6
  60. package/src/molecules/gv-category.js +103 -23
  61. package/src/molecules/gv-code.js +142 -80
  62. package/src/molecules/gv-confirm.js +71 -41
  63. package/src/molecules/gv-cron-editor.js +389 -143
  64. package/src/molecules/gv-dropdown-menu.js +46 -14
  65. package/src/molecules/gv-expandable.js +59 -31
  66. package/src/molecules/gv-expression-language.js +138 -176
  67. package/src/molecules/gv-identity-picture.js +66 -43
  68. package/src/molecules/gv-list.js +134 -42
  69. package/src/molecules/gv-metrics.js +49 -37
  70. package/src/molecules/gv-modal.js +95 -28
  71. package/src/molecules/gv-nav.js +75 -49
  72. package/src/molecules/gv-option.js +130 -57
  73. package/src/molecules/gv-plans.js +209 -86
  74. package/src/molecules/gv-popover.js +177 -57
  75. package/src/molecules/gv-promote.js +146 -28
  76. package/src/molecules/gv-rating-list.js +195 -69
  77. package/src/molecules/gv-rating.js +105 -52
  78. package/src/molecules/gv-row-expandable.js +11 -5
  79. package/src/molecules/gv-row.js +147 -21
  80. package/src/molecules/gv-stats.js +48 -23
  81. package/src/molecules/gv-stepper.js +187 -43
  82. package/src/molecules/gv-table.js +309 -199
  83. package/src/molecules/gv-tree.js +156 -33
  84. package/src/organisms/gv-documentation.js +127 -44
  85. package/src/organisms/gv-header.js +195 -37
  86. package/src/organisms/gv-http-client.js +168 -32
  87. package/src/organisms/gv-menu.js +158 -37
  88. package/src/organisms/gv-newsletter-subscription.js +189 -48
  89. package/src/organisms/gv-pagination.js +77 -49
  90. package/src/organisms/gv-properties.js +492 -271
  91. package/src/organisms/gv-resizable-views.js +259 -41
  92. package/src/organisms/gv-resources.js +275 -168
  93. package/src/organisms/gv-schema-form-array.js +159 -49
  94. package/src/organisms/gv-schema-form-control-object.js +73 -59
  95. package/src/organisms/gv-schema-form-control.js +134 -107
  96. package/src/organisms/gv-schema-form.js +313 -208
  97. package/src/organisms/gv-tabs.js +98 -66
  98. package/src/organisms/gv-user-menu.js +201 -36
  99. package/src/organisms/gv-vertical-menu.js +61 -20
  100. package/src/policy-studio/gv-flow-step.js +265 -105
  101. package/src/policy-studio/gv-flow.js +304 -125
  102. package/src/policy-studio/gv-policy-studio-menu.js +471 -157
  103. package/src/policy-studio/gv-policy-studio.js +774 -710
  104. package/src/styles/empty.js +20 -3
  105. package/src/styles/input.js +247 -3
  106. package/src/styles/link.js +16 -3
  107. package/src/styles/shapes.js +0 -1
  108. package/src/styles/skeleton.js +37 -3
  109. package/src/styles/zoom.js +24 -3
  110. package/src/theme/definition.json +1762 -0
  111. package/src/theme/gv-theme.js +60 -21
@@ -19,6 +19,7 @@ import { dispatchCustomEvent } from '../lib/events';
19
19
  import { ifDefined } from 'lit/directives/if-defined';
20
20
  import { i18n } from '../lib/i18n';
21
21
  import { classMap } from 'lit/directives/class-map';
22
+
22
23
  /**
23
24
  * File upload
24
25
  *
@@ -33,44 +34,132 @@ import { classMap } from 'lit/directives/class-map';
33
34
  * @attr {Number} limit - Max size limit in bytes.
34
35
  * @attr {String} value - Reflected value of uploaded file
35
36
  **/
36
-
37
37
  export class GvFileUpload extends LitElement {
38
38
  static get properties() {
39
39
  return {
40
- label: {
41
- type: String
42
- },
43
- accept: {
44
- type: String
45
- },
46
- except: {
47
- type: String
48
- },
49
- limit: {
50
- type: Number
51
- },
52
- value: {
53
- type: Array,
54
- reflect: true
55
- },
56
- _preview: {
57
- type: String,
58
- attribute: false
59
- },
60
- _files: {
61
- type: Array,
62
- attribute: false
63
- },
64
- _errors: {
65
- type: Array,
66
- attribute: false
67
- }
40
+ label: { type: String },
41
+ accept: { type: String },
42
+ except: { type: String },
43
+ limit: { type: Number },
44
+ value: { type: Array, reflect: true },
45
+ _preview: { type: String, attribute: false },
46
+ _files: { type: Array, attribute: false },
47
+ _errors: { type: Array, attribute: false },
68
48
  };
69
49
  }
70
50
 
71
51
  static get styles() {
72
- return [link, // language=CSS
73
- css`:host{box-sizing:border-box;display:block;width:100%;color:var(--gv-theme-color-dark,#28444f)}.box{font-size:1.25rem;background-color:var(--gv-theme-neutral-color-lighter,#fafafa);position:relative;padding:2rem;text-align:center;display:block;border:1px dashed #28444f;border-radius:4px;transition:outline-offset .15s ease-in-out,background-color .15s linear;height:100%}.box .box__icon{width:100%;height:80px;display:block;margin-bottom:40px;--gv-icon--s:5rem;--gv-icon--c:var(--gv-theme-color-dark, #28444f)}.box__file{width:.1px;height:.1px;opacity:0;overflow:hidden;position:absolute;z-index:-1}.box__file+label{max-width:80%;text-overflow:ellipsis;white-space:nowrap;cursor:pointer;display:inline-block;overflow:hidden}.box.is-dragover{background-color:var(--gv-theme-color-light,#28444f);border:none;outline:1px dashed #28444f;outline-offset:-10px}.box .box__dragndrop{display:inline}.files{box-sizing:border-box;display:flex;align-items:center;--gv-icon--s:16px;padding:1rem .5rem 0}.filename{flex:1;padding:.2rem;word-break:break-all}.error{font-style:italic;--gv-icon--c:red}gv-image{position:absolute}.preview{transition:all .3s ease-in-out}.box__input{position:relative;display:flex;flex-direction:column;justify-content:center;height:100%;z-index:10}.preview .box__input{visibility:hidden}.preview:hover .box__input{visibility:visible}.preview:hover gv-image{opacity:.3}`];
52
+ return [
53
+ link,
54
+ // language=CSS
55
+ css`
56
+ :host {
57
+ box-sizing: border-box;
58
+ display: block;
59
+ width: 100%;
60
+ color: var(--gv-theme-color-dark, #28444f);
61
+ }
62
+
63
+ .box {
64
+ font-size: 1.25rem;
65
+ background-color: var(--gv-theme-neutral-color-lighter, #fafafa);
66
+ position: relative;
67
+ padding: 2rem;
68
+ text-align: center;
69
+ display: block;
70
+ border: 1px dashed #28444f;
71
+ border-radius: 4px;
72
+ transition: outline-offset 0.15s ease-in-out, background-color 0.15s linear;
73
+ height: 100%;
74
+ }
75
+
76
+ .box .box__icon {
77
+ width: 100%;
78
+ height: 80px;
79
+ display: block;
80
+ margin-bottom: 40px;
81
+ --gv-icon--s: 5rem;
82
+ --gv-icon--c: var(--gv-theme-color-dark, #28444f);
83
+ }
84
+
85
+ .box__file {
86
+ width: 0.1px;
87
+ height: 0.1px;
88
+ opacity: 0;
89
+ overflow: hidden;
90
+ position: absolute;
91
+ z-index: -1;
92
+ }
93
+
94
+ .box__file + label {
95
+ max-width: 80%;
96
+ text-overflow: ellipsis;
97
+ white-space: nowrap;
98
+ cursor: pointer;
99
+ display: inline-block;
100
+ overflow: hidden;
101
+ }
102
+
103
+ .box.is-dragover {
104
+ background-color: var(--gv-theme-color-light, #28444f);
105
+ border: none;
106
+ outline: 1px dashed #28444f;
107
+ outline-offset: -10px;
108
+ }
109
+
110
+ .box .box__dragndrop {
111
+ display: inline;
112
+ }
113
+
114
+ .files {
115
+ box-sizing: border-box;
116
+ display: flex;
117
+ align-items: center;
118
+ --gv-icon--s: 16px;
119
+ padding: 1rem 0.5rem 0;
120
+ }
121
+
122
+ .filename {
123
+ flex: 1;
124
+ padding: 0.2rem;
125
+ word-break: break-all;
126
+ }
127
+
128
+ .error {
129
+ font-style: italic;
130
+ --gv-icon--c: red;
131
+ }
132
+
133
+ gv-image {
134
+ position: absolute;
135
+ }
136
+
137
+ .preview {
138
+ transition: all 300ms ease-in-out;
139
+ }
140
+
141
+ .box__input {
142
+ position: relative;
143
+ display: flex;
144
+ flex-direction: column;
145
+ justify-content: center;
146
+ height: 100%;
147
+ z-index: 10;
148
+ }
149
+
150
+ .preview .box__input {
151
+ visibility: hidden;
152
+ }
153
+
154
+ .preview:hover .box__input {
155
+ visibility: visible;
156
+ }
157
+
158
+ .preview:hover gv-image {
159
+ opacity: 0.3;
160
+ }
161
+ `,
162
+ ];
74
163
  }
75
164
 
76
165
  constructor() {
@@ -92,7 +181,6 @@ export class GvFileUpload extends LitElement {
92
181
  _onDragEnd(e) {
93
182
  e.preventDefault();
94
183
  e.stopPropagation();
95
-
96
184
  if (--this._counter === 0) {
97
185
  const box = this.shadowRoot.querySelector('.box');
98
186
  box.classList.remove('is-dragover');
@@ -111,66 +199,40 @@ export class GvFileUpload extends LitElement {
111
199
 
112
200
  setFiles(files) {
113
201
  const errors = [];
114
- this._files = [...files].filter(file => {
202
+ this._files = [...files].filter((file) => {
115
203
  if (this.accept && file.type.match(this._getRegex(this.accept)) == null) {
116
- errors.push({
117
- file,
118
- error: i18n('gv-file-upload.error.typeNotAllowed')
119
- });
204
+ errors.push({ file, error: i18n('gv-file-upload.error.typeNotAllowed') });
120
205
  return false;
121
206
  }
122
207
 
123
208
  if (this.except && file.type.match(this._getRegex(this.except)) != null) {
124
- errors.push({
125
- file,
126
- error: i18n('gv-file-upload.error.typeNotAllowed')
127
- });
209
+ errors.push({ file, error: i18n('gv-file-upload.error.typeNotAllowed') });
128
210
  return false;
129
211
  }
130
-
131
212
  if (this.limit && file.size > parseInt(this.limit, 10)) {
132
- errors.push({
133
- file,
134
- error: i18n('gv-file-upload.error.maxSize')
135
- });
213
+ errors.push({ file, error: i18n('gv-file-upload.error.maxSize') });
136
214
  return false;
137
215
  }
138
-
139
216
  return true;
140
217
  });
141
218
  this._errors = errors;
142
-
143
219
  if (this._errors.length > 0) {
144
- dispatchCustomEvent(this, 'error', {
145
- errors: this._errors
146
- });
147
- this.dispatchEvent(new Event('invalid', {
148
- bubbles: true,
149
- cancelable: true
150
- }));
220
+ dispatchCustomEvent(this, 'error', { errors: this._errors });
221
+ this.dispatchEvent(new Event('invalid', { bubbles: true, cancelable: true }));
151
222
  }
152
-
153
223
  const box = this.shadowRoot.querySelector('.box');
154
224
  box.classList.remove('is-dragover');
155
-
156
225
  if (this._files.length > 0) {
157
226
  this.reader.readAsDataURL(this._files[0]);
158
-
159
- this.reader.onload = event => {
227
+ this.reader.onload = (event) => {
160
228
  if (this._files[0].type.match(this._getRegex('image/*'))) {
161
229
  this._preview = event.target.result;
162
230
  } else {
163
231
  this._preview = null;
164
232
  }
165
-
166
233
  this.value = event.target.result;
167
- this.dispatchEvent(new Event('input', {
168
- bubbles: true,
169
- cancelable: true
170
- }));
171
- dispatchCustomEvent(this, 'drop', {
172
- files: [this.value]
173
- });
234
+ this.dispatchEvent(new Event('input', { bubbles: true, cancelable: true }));
235
+ dispatchCustomEvent(this, 'drop', { files: [this.value] });
174
236
  };
175
237
  }
176
238
  }
@@ -186,10 +248,7 @@ export class GvFileUpload extends LitElement {
186
248
  this._preview = null;
187
249
  this.value = null;
188
250
  this.shadowRoot.querySelector('#file').value = null;
189
- this.dispatchEvent(new Event('input', {
190
- bubbles: true,
191
- cancelable: true
192
- }));
251
+ this.dispatchEvent(new Event('input', { bubbles: true, cancelable: true }));
193
252
  }
194
253
 
195
254
  _onChange(e) {
@@ -200,17 +259,75 @@ export class GvFileUpload extends LitElement {
200
259
  if (this._files.length > 0) {
201
260
  return 'general:clip';
202
261
  }
203
-
204
262
  return 'general:upload';
205
263
  }
206
264
 
207
265
  render() {
208
- const label = this._errors.length > 0 || this._files.length > 0 ? i18n('gv-file-upload.chooseAnotherFile') : i18n('gv-file-upload.chooseFile');
266
+ const label =
267
+ this._errors.length > 0 || this._files.length > 0 ? i18n('gv-file-upload.chooseAnotherFile') : i18n('gv-file-upload.chooseFile');
268
+
209
269
  const classes = {
210
270
  box: true,
211
- preview: this._preview != null
271
+ preview: this._preview != null,
212
272
  };
213
- return html` <label for="file">${this.label}</label> <div class="${classMap(classes)}" @drop="${this._onDrop}" @ondrop="${this._onDrop}" @drag="${this._cancelEvent}" @dragstart="${this._cancelEvent}" @dragover="${this._onDragOver}" @dragenter="${this._onDragOver}" @dragleave="${this._onDragEnd}" @dragend="${this._onDragEnd}"> ${this._preview != null ? html`<gv-image .src="${this._preview}" @error="${this._onPreviewError}"></gv-image>` : ''} <div class="box__input"> <gv-icon class="box__icon" shape="${this.icon}"></gv-icon> <label for="file" class="link"> <strong>${label}</strong> <span class="box__dragndrop">${i18n('gv-file-upload.orDragIt')}</span> </label> <input class="box__file" type="file" name="files[]" id="file" files="${this.files}" accept="${ifDefined(this.accept)}" @change="${this._onChange}"> </div> </div> ${this._files.length > 0 ? html` <div class="files"> <gv-icon shape="general:clip"></gv-icon> <div class="filename">${this._files[0].name}</div> <gv-icon class="link" @click="${this._removeFile.bind(this, 0)}" shape="general:trash"></gv-icon> </div> ` : ''} ${this._errors.length > 0 ? html` <div class="files"> <gv-icon class="error" shape="code:stop"></gv-icon> <div class="filename">${this._errors[0].file.name} <span class="error">(${this._errors[0].error})</span></div> </div> ` : ''} ${this.value && this._files.length === 0 && this._errors.length === 0 ? html` <div class="files"> <div class="filename"></div> <gv-button link @click="${this._removeFile.bind(this, 0)}">${i18n('gv-file-upload.removePicture')}</gv-button> </div> ` : ''} `;
273
+
274
+ return html`
275
+ <label for="file">${this.label}</label>
276
+ <div
277
+ class="${classMap(classes)}"
278
+ @drop="${this._onDrop}"
279
+ @ondrop="${this._onDrop}"
280
+ @drag="${this._cancelEvent}"
281
+ @dragstart="${this._cancelEvent}"
282
+ @dragover="${this._onDragOver}"
283
+ @dragenter="${this._onDragOver}"
284
+ @dragleave="${this._onDragEnd}"
285
+ @dragend="${this._onDragEnd}"
286
+ >
287
+ ${this._preview != null ? html`<gv-image .src="${this._preview}" @error="${this._onPreviewError}"></gv-image>` : ''}
288
+ <div class="box__input">
289
+ <gv-icon class="box__icon" shape="${this.icon}"></gv-icon>
290
+ <label for="file" class="link">
291
+ <strong>${label}</strong>
292
+ <span class="box__dragndrop">${i18n('gv-file-upload.orDragIt')}</span>
293
+ </label>
294
+ <input
295
+ class="box__file"
296
+ type="file"
297
+ name="files[]"
298
+ id="file"
299
+ files="${this.files}"
300
+ accept="${ifDefined(this.accept)}"
301
+ @change="${this._onChange}"
302
+ />
303
+ </div>
304
+ </div>
305
+ ${this._files.length > 0
306
+ ? html`
307
+ <div class="files">
308
+ <gv-icon shape="general:clip"></gv-icon>
309
+ <div class="filename">${this._files[0].name}</div>
310
+ <gv-icon class="link" @click="${this._removeFile.bind(this, 0)}" shape="general:trash"></gv-icon>
311
+ </div>
312
+ `
313
+ : ''}
314
+ ${this._errors.length > 0
315
+ ? html`
316
+ <div class="files">
317
+ <gv-icon class="error" shape="code:stop"></gv-icon>
318
+ <div class="filename">${this._errors[0].file.name} <span class="error">(${this._errors[0].error})</span></div>
319
+ </div>
320
+ `
321
+ : ''}
322
+ ${this.value && this._files.length === 0 && this._errors.length === 0
323
+ ? html`
324
+ <div class="files">
325
+ <div class="filename"></div>
326
+ <gv-button link @click="${this._removeFile.bind(this, 0)}">${i18n('gv-file-upload.removePicture')}</gv-button>
327
+ </div>
328
+ `
329
+ : ''}
330
+ `;
214
331
  }
215
332
 
216
333
  _onPreviewError() {
@@ -221,11 +338,9 @@ export class GvFileUpload extends LitElement {
221
338
  if (changedProperties.has('value')) {
222
339
  if (this.value) {
223
340
  this._preview = this.value;
224
-
225
341
  if (this._files && this._files[0]) {
226
342
  this.reader.readAsDataURL(this._files[0]);
227
-
228
- this.reader.onload = event => {
343
+ this.reader.onload = (event) => {
229
344
  if (this.value !== event.target.result) {
230
345
  this._files = [];
231
346
  }
@@ -238,12 +353,8 @@ export class GvFileUpload extends LitElement {
238
353
  }
239
354
 
240
355
  const preview = this.shadowRoot.querySelector('.preview');
241
-
242
356
  if (preview) {
243
- const {
244
- width,
245
- height
246
- } = preview.getBoundingClientRect();
357
+ const { width, height } = preview.getBoundingClientRect();
247
358
  const img = this.shadowRoot.querySelector('gv-image');
248
359
  img.style.width = width - 20 + 'px';
249
360
  img.style.height = height - 20 + 'px';
@@ -251,7 +362,6 @@ export class GvFileUpload extends LitElement {
251
362
  img.style.top = '10px';
252
363
  }
253
364
  }
254
-
255
365
  }
366
+
256
367
  window.customElements.define('gv-file-upload', GvFileUpload);
257
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4vbm9kZV9tb2R1bGVzL0BncmF2aXRlZS91aS1jb21wb25lbnRzL2F0b21zL2d2LWZpbGUtdXBsb2FkLmpzIl0sIm5hbWVzIjpbImNzcyIsIkxpdEVsZW1lbnQiLCJodG1sIiwibGluayIsImRpc3BhdGNoQ3VzdG9tRXZlbnQiLCJpZkRlZmluZWQiLCJpMThuIiwiY2xhc3NNYXAiLCJHdkZpbGVVcGxvYWQiLCJwcm9wZXJ0aWVzIiwibGFiZWwiLCJ0eXBlIiwiU3RyaW5nIiwiYWNjZXB0IiwiZXhjZXB0IiwibGltaXQiLCJOdW1iZXIiLCJ2YWx1ZSIsIkFycmF5IiwicmVmbGVjdCIsIl9wcmV2aWV3IiwiYXR0cmlidXRlIiwiX2ZpbGVzIiwiX2Vycm9ycyIsInN0eWxlcyIsImNvbnN0cnVjdG9yIiwicmVhZGVyIiwiRmlsZVJlYWRlciIsIl9jb3VudGVyIiwiX29uRHJhZ092ZXIiLCJlIiwicHJldmVudERlZmF1bHQiLCJzdG9wUHJvcGFnYXRpb24iLCJib3giLCJzaGFkb3dSb290IiwicXVlcnlTZWxlY3RvciIsImNsYXNzTGlzdCIsImFkZCIsIl9vbkRyYWdFbmQiLCJyZW1vdmUiLCJfb25Ecm9wIiwic2V0RmlsZXMiLCJkYXRhVHJhbnNmZXIiLCJmaWxlcyIsIl9nZXRSZWdleCIsIm1pbWVUeXBlcyIsInRvU3RyaW5nIiwicmVwbGFjZSIsImVycm9ycyIsImZpbHRlciIsImZpbGUiLCJtYXRjaCIsInB1c2giLCJlcnJvciIsInNpemUiLCJwYXJzZUludCIsImxlbmd0aCIsImRpc3BhdGNoRXZlbnQiLCJFdmVudCIsImJ1YmJsZXMiLCJjYW5jZWxhYmxlIiwicmVhZEFzRGF0YVVSTCIsIm9ubG9hZCIsImV2ZW50IiwidGFyZ2V0IiwicmVzdWx0IiwiX2NhbmNlbEV2ZW50IiwiX3JlbW92ZUZpbGUiLCJfb25DaGFuZ2UiLCJpY29uIiwicmVuZGVyIiwiY2xhc3NlcyIsInByZXZpZXciLCJfb25QcmV2aWV3RXJyb3IiLCJuYW1lIiwiYmluZCIsInVwZGF0ZWQiLCJjaGFuZ2VkUHJvcGVydGllcyIsImhhcyIsIndpZHRoIiwiaGVpZ2h0IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwiaW1nIiwic3R5bGUiLCJsZWZ0IiwidG9wIiwid2luZG93IiwiY3VzdG9tRWxlbWVudHMiLCJkZWZpbmUiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVNBLEdBQVQsRUFBY0MsVUFBZCxFQUEwQkMsSUFBMUIsUUFBc0MsS0FBdEM7QUFDQSxTQUFTQyxJQUFULFFBQXFCLGdCQUFyQjtBQUNBLFNBQVNDLG1CQUFULFFBQW9DLGVBQXBDO0FBQ0EsU0FBU0MsU0FBVCxRQUEwQiwyQkFBMUI7QUFDQSxTQUFTQyxJQUFULFFBQXFCLGFBQXJCO0FBQ0EsU0FBU0MsUUFBVCxRQUF5QiwwQkFBekI7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBLE9BQU8sTUFBTUMsWUFBTixTQUEyQlAsVUFBM0IsQ0FBc0M7QUFDdEIsYUFBVlEsVUFBVSxHQUFHO0FBQ3RCLFdBQU87QUFDTEMsTUFBQUEsS0FBSyxFQUFFO0FBQUVDLFFBQUFBLElBQUksRUFBRUM7QUFBUixPQURGO0FBRUxDLE1BQUFBLE1BQU0sRUFBRTtBQUFFRixRQUFBQSxJQUFJLEVBQUVDO0FBQVIsT0FGSDtBQUdMRSxNQUFBQSxNQUFNLEVBQUU7QUFBRUgsUUFBQUEsSUFBSSxFQUFFQztBQUFSLE9BSEg7QUFJTEcsTUFBQUEsS0FBSyxFQUFFO0FBQUVKLFFBQUFBLElBQUksRUFBRUs7QUFBUixPQUpGO0FBS0xDLE1BQUFBLEtBQUssRUFBRTtBQUFFTixRQUFBQSxJQUFJLEVBQUVPLEtBQVI7QUFBZUMsUUFBQUEsT0FBTyxFQUFFO0FBQXhCLE9BTEY7QUFNTEMsTUFBQUEsUUFBUSxFQUFFO0FBQUVULFFBQUFBLElB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RixZQUEvQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEdyYXZpdGVlIHRlYW0gKGh0dHA6Ly9ncmF2aXRlZS5pbylcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyBjc3MsIExpdEVsZW1lbnQsIGh0bWwgfSBmcm9tICdsaXQnO1xuaW1wb3J0IHsgbGluayB9IGZyb20gJy4uL3N0eWxlcy9saW5rJztcbmltcG9ydCB7IGRpc3BhdGNoQ3VzdG9tRXZlbnQgfSBmcm9tICcuLi9saWIvZXZlbnRzJztcbmltcG9ydCB7IGlmRGVmaW5lZCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL2lmLWRlZmluZWQnO1xuaW1wb3J0IHsgaTE4biB9IGZyb20gJy4uL2xpYi9pMThuJztcbmltcG9ydCB7IGNsYXNzTWFwIH0gZnJvbSAnbGl0L2RpcmVjdGl2ZXMvY2xhc3MtbWFwJztcblxuLyoqXG4gKiBGaWxlIHVwbG9hZFxuICpcbiAqICMjIERldGFpbHNcbiAqICogaGFzIEB0aGVtZSBmYWNldFxuICpcbiAqIEBmaXJlcyBndi1maWxlLXVwbG9hZDpkcm9wIC0gQ3VzdG9tIGV2ZW50IHdoZW4gdXNlciBkcm9wIGZpbGVcbiAqXG4gKiBAYXR0ciB7U3RyaW5nfSBsYWJlbCAtIExhYmVsXG4gKiBAYXR0ciB7U3RyaW5nfSBhY2NlcHQgLSBPbmUgb3IgbW9yZSBmaWxlIHR5cGUgaWRlbnRpZmllcnMgZGVzY3JpYmluZyB0aGUgYXV0aG9yaXplZCBmaWxlIHR5cGVzLlxuICogQGF0dHIge1N0cmluZ30gZXhjZXB0IC0gT25lIG9yIG1vcmUgZmlsZSB0eXBlIGlkZW50aWZpZXJzIGRlc2NyaWJpbmcgdW5hdXRob3JpemVkIGZpbGUgdHlwZXMuXG4gKiBAYXR0ciB7TnVtYmVyfSBsaW1pdCAtIE1heCBzaXplIGxpbWl0IGluIGJ5dGVzLlxuICogQGF0dHIge1N0cmluZ30gdmFsdWUgLSBSZWZsZWN0ZWQgdmFsdWUgb2YgdXBsb2FkZWQgZmlsZVxuICoqL1xuZXhwb3J0IGNsYXNzIEd2RmlsZVVwbG9hZCBleHRlbmRzIExpdEVsZW1lbnQge1xuICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhYmVsOiB7IHR5cGU6IFN0cmluZyB9LFxuICAgICAgYWNjZXB0OiB7IHR5cGU6IFN0cmluZyB9LFxuICAgICAgZXhjZXB0OiB7IHR5cGU6IFN0cmluZyB9LFxuICAgICAgbGltaXQ6IHsgdHlwZTogTnVtYmVyIH0sXG4gICAgICB2YWx1ZTogeyB0eXBlOiBBcnJheSwgcmVmbGVjdDogdHJ1ZSB9LFxuICAgICAgX3ByZXZpZXc6IHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6IGZhbHNlIH0sXG4gICAgICBfZmlsZXM6IHsgdHlwZTogQXJyYXksIGF0dHJpYnV0ZTogZmFsc2UgfSxcbiAgICAgIF9lcnJvcnM6IHsgdHlwZTogQXJyYXksIGF0dHJpYnV0ZTogZmFsc2UgfSxcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIGdldCBzdHlsZXMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGxpbmssXG4gICAgICAvLyBsYW5ndWFnZT1DU1NcbiAgICAgIGNzc2BcbiAgICAgICAgOmhvc3Qge1xuICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgY29sb3I6IHZhcigtLWd2LXRoZW1lLWNvbG9yLWRhcmssICMyODQ0NGYpO1xuICAgICAgICB9XG5cbiAgICAgICAgLmJveCB7XG4gICAgICAgICAgZm9udC1zaXplOiAxLjI1cmVtO1xuICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWd2LXRoZW1lLW5ldXRyYWwtY29sb3ItbGlnaHRlciwgI2ZhZmFmYSk7XG4gICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICAgIHBhZGRpbmc6IDJyZW07XG4gICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICAgIGJvcmRlcjogMXB4IGRhc2hlZCAjMjg0NDRmO1xuICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgICAgICB0cmFuc2l0aW9uOiBvdXRsaW5lLW9mZnNldCAwLjE1cyBlYXNlLWluLW91dCwgYmFja2dyb3VuZC1jb2xvciAwLjE1cyBsaW5lYXI7XG4gICAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICB9XG5cbiAgICAgICAgLmJveCAuYm94X19pY29uIHtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICBoZWlnaHQ6IDgwcHg7XG4gICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogNDBweDtcbiAgICAgICAgICAtLWd2LWljb24tLXM6IDVyZW07XG4gICAgICAgICAgLS1ndi1pY29uLS1jOiB2YXIoLS1ndi10aGVtZS1jb2xvci1kYXJrLCAjMjg0NDRmKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5ib3hfX2ZpbGUge1xuICAgICAgICAgIHdpZHRoOiAwLjFweDtcbiAgICAgICAgICBoZWlnaHQ6IDAuMXB4O1xuICAgICAgICAgIG9wYWNpdHk6IDA7XG4gICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgei1pbmRleDogLTE7XG4gICAgICAgIH1cblxuICAgICAgICAuYm94X19maWxlICsgbGFiZWwge1xuICAgICAgICAgIG1heC13aWR0aDogODAlO1xuICAgICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICB9XG5cbiAgICAgICAgLmJveC5pcy1kcmFnb3ZlciB7XG4gICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZ3YtdGhlbWUtY29sb3ItbGlnaHQsICMyODQ0NGYpO1xuICAgICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgICBvdXRsaW5lOiAxcHggZGFzaGVkICMyODQ0NGY7XG4gICAgICAgICAgb3V0bGluZS1vZmZzZXQ6IC0xMHB4O1xuICAgICAgICB9XG5cbiAgICAgICAgLmJveCAuYm94X19kcmFnbmRyb3Age1xuICAgICAgICAgIGRpc3BsYXk6IGlubGluZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5maWxlcyB7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgICAgLS1ndi1pY29uLS1zOiAxNnB4O1xuICAgICAgICAgIHBhZGRpbmc6IDFyZW0gMC41cmVtIDA7XG4gICAgICAgIH1cblxuICAgICAgICAuZmlsZW5hbWUge1xuICAgICAgICAgIGZsZXg6IDE7XG4gICAgICAgICAgcGFkZGluZzogMC4ycmVtO1xuICAgICAgICAgIHdvcmQtYnJlYWs6IGJyZWFrLWFsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5lcnJvciB7XG4gICAgICAgICAgZm9udC1zdHlsZTogaXRhbGljO1xuICAgICAgICAgIC0tZ3YtaWNvbi0tYzogcmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgZ3YtaW1hZ2Uge1xuICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5wcmV2aWV3IHtcbiAgICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMzAwbXMgZWFzZS1pbi1vdXQ7XG4gICAgICAgIH1cblxuICAgICAgICAuYm94X19pbnB1dCB7XG4gICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgICAgei1pbmRleDogMTA7XG4gICAgICAgIH1cblxuICAgICAgICAucHJldmlldyAuYm94X19pbnB1dCB7XG4gICAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgICAgICB9XG5cbiAgICAgICAgLnByZXZpZXc6aG92ZXIgLmJveF9faW5wdXQge1xuICAgICAgICAgIHZpc2liaWxpdHk6IHZpc2libGU7XG4gICAgICAgIH1cblxuICAgICAgICAucHJldmlldzpob3ZlciBndi1pbWFnZSB7XG4gICAgICAgICAgb3BhY2l0eTogMC4zO1xuICAgICAgICB9XG4gICAgICBgLFxuICAgIF07XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMucmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICB0aGlzLl9maWxlcyA9IFtdO1xuICAgIHRoaXMuX2Vycm9ycyA9IFtdO1xuICAgIHRoaXMuX2NvdW50ZXIgPSAwO1xuICB9XG5cbiAgX29uRHJhZ092ZXIoZSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuX2NvdW50ZXIrKztcbiAgICBjb25zdCBib3ggPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignLmJveCcpO1xuICAgIGJveC5jbGFzc0xpc3QuYWRkKCdpcy1kcmFnb3ZlcicpO1xuICB9XG5cbiAgX29uRHJhZ0VuZChlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKC0tdGhpcy5fY291bnRlciA9PT0gMCkge1xuICAgICAgY29uc3QgYm94ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJy5ib3gnKTtcbiAgICAgIGJveC5jbGFzc0xpc3QucmVtb3ZlKCdpcy1kcmFnb3ZlcicpO1xuICAgIH1cbiAgfVxuXG4gIF9vbkRyb3AoZSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuc2V0RmlsZXMoZS5kYXRhVHJhbnNmZXIuZmlsZXMpO1xuICB9XG5cbiAgX2dldFJlZ2V4KG1pbWVUeXBlcykge1xuICAgIHJldHVybiBgKCR7bWltZVR5cGVzLnRvU3RyaW5nKCkucmVwbGFjZSgnICcsICcnKS5yZXBsYWNlKC8sL2csICcuK3wnKS5yZXBsYWNlKC9cXCovZywgJy4rJykucmVwbGFjZSgnLisuKycsICcuKycpfSlgO1xuICB9XG5cbiAgc2V0RmlsZXMoZmlsZXMpIHtcbiAgICBjb25zdCBlcnJvcnMgPSBbXTtcbiAgICB0aGlzLl9maWxlcyA9IFsuLi5maWxlc10uZmlsdGVyKChmaWxlKSA9PiB7XG4gICAgICBpZiAodGhpcy5hY2NlcHQgJiYgZmlsZS50eXBlLm1hdGNoKHRoaXMuX2dldFJlZ2V4KHRoaXMuYWNjZXB0KSkgPT0gbnVsbCkge1xuICAgICAgICBlcnJvcnMucHVzaCh7IGZpbGUsIGVycm9yOiBpMThuKCdndi1maWxlLXVwbG9hZC5lcnJvci50eXBlTm90QWxsb3dlZCcpIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmV4Y2VwdCAmJiBmaWxlLnR5cGUubWF0Y2godGhpcy5fZ2V0UmVnZXgodGhpcy5leGNlcHQpKSAhPSBudWxsKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKHsgZmlsZSwgZXJyb3I6IGkxOG4oJ2d2LWZpbGUtdXBsb2FkLmVycm9yLnR5cGVOb3RBbGxvd2VkJykgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmxpbWl0ICYmIGZpbGUuc2l6ZSA+IHBhcnNlSW50KHRoaXMubGltaXQsIDEwKSkge1xuICAgICAgICBlcnJvcnMucHVzaCh7IGZpbGUsIGVycm9yOiBpMThuKCdndi1maWxlLXVwbG9hZC5lcnJvci5tYXhTaXplJykgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICAgIHRoaXMuX2Vycm9ycyA9IGVycm9ycztcbiAgICBpZiAodGhpcy5fZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIGRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcywgJ2Vycm9yJywgeyBlcnJvcnM6IHRoaXMuX2Vycm9ycyB9KTtcbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2ludmFsaWQnLCB7IGJ1YmJsZXM6IHRydWUsIGNhbmNlbGFibGU6IHRydWUgfSkpO1xuICAgIH1cbiAgICBjb25zdCBib3ggPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignLmJveCcpO1xuICAgIGJveC5jbGFzc0xpc3QucmVtb3ZlKCdpcy1kcmFnb3ZlcicpO1xuICAgIGlmICh0aGlzLl9maWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnJlYWRlci5yZWFkQXNEYXRhVVJMKHRoaXMuX2ZpbGVzWzBdKTtcbiAgICAgIHRoaXMucmVhZGVyLm9ubG9hZCA9IChldmVudCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fZmlsZXNbMF0udHlwZS5tYXRjaCh0aGlzLl9nZXRSZWdleCgnaW1hZ2UvKicpKSkge1xuICAgICAgICAgIHRoaXMuX3ByZXZpZXcgPSBldmVudC50YXJnZXQucmVzdWx0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX3ByZXZpZXcgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmFsdWUgPSBldmVudC50YXJnZXQucmVzdWx0O1xuICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdpbnB1dCcsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KSk7XG4gICAgICAgIGRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcywgJ2Ryb3AnLCB7IGZpbGVzOiBbdGhpcy52YWx1ZV0gfSk7XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIF9jYW5jZWxFdmVudChlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICBfcmVtb3ZlRmlsZSgpIHtcbiAgICB0aGlzLl9lcnJvcnMgPSBbXTtcbiAgICB0aGlzLl9maWxlcyA9IFtdO1xuICAgIHRoaXMuX3ByZXZpZXcgPSBudWxsO1xuICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCcjZmlsZScpLnZhbHVlID0gbnVsbDtcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdpbnB1dCcsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KSk7XG4gIH1cblxuICBfb25DaGFuZ2UoZSkge1xuICAgIHRoaXMuc2V0RmlsZXMoZS50YXJnZXQuZmlsZXMpO1xuICB9XG5cbiAgZ2V0IGljb24oKSB7XG4gICAgaWYgKHRoaXMuX2ZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiAnZ2VuZXJhbDpjbGlwJztcbiAgICB9XG4gICAgcmV0dXJuICdnZW5lcmFsOnVwbG9hZCc7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgbGFiZWwgPVxuICAgICAgdGhpcy5fZXJyb3JzLmxlbmd0aCA+IDAgfHwgdGhpcy5fZmlsZXMubGVuZ3RoID4gMCA/IGkxOG4oJ2d2LWZpbGUtdXBsb2FkLmNob29zZUFub3RoZXJGaWxlJykgOiBpMThuKCdndi1maWxlLXVwbG9hZC5jaG9vc2VGaWxlJyk7XG5cbiAgICBjb25zdCBjbGFzc2VzID0ge1xuICAgICAgYm94OiB0cnVlLFxuICAgICAgcHJldmlldzogdGhpcy5fcHJldmlldyAhPSBudWxsLFxuICAgIH07XG5cbiAgICByZXR1cm4gaHRtbGBcbiAgICAgIDxsYWJlbCBmb3I9XCJmaWxlXCI+JHt0aGlzLmxhYmVsfTwvbGFiZWw+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiJHtjbGFzc01hcChjbGFzc2VzKX1cIlxuICAgICAgICBAZHJvcD1cIiR7dGhpcy5fb25Ecm9wfVwiXG4gICAgICAgIEBvbmRyb3A9XCIke3RoaXMuX29uRHJvcH1cIlxuICAgICAgICBAZHJhZz1cIiR7dGhpcy5fY2FuY2VsRXZlbnR9XCJcbiAgICAgICAgQGRyYWdzdGFydD1cIiR7dGhpcy5fY2FuY2VsRXZlbnR9XCJcbiAgICAgICAgQGRyYWdvdmVyPVwiJHt0aGlzLl9vbkRyYWdPdmVyfVwiXG4gICAgICAgIEBkcmFnZW50ZXI9XCIke3RoaXMuX29uRHJhZ092ZXJ9XCJcbiAgICAgICAgQGRyYWdsZWF2ZT1cIiR7dGhpcy5fb25EcmFnRW5kfVwiXG4gICAgICAgIEBkcmFnZW5kPVwiJHt0aGlzLl9vbkRyYWdFbmR9XCJcbiAgICAgID5cbiAgICAgICAgJHt0aGlzLl9wcmV2aWV3ICE9IG51bGwgPyBodG1sYDxndi1pbWFnZSAuc3JjPVwiJHt0aGlzLl9wcmV2aWV3fVwiIEBlcnJvcj1cIiR7dGhpcy5fb25QcmV2aWV3RXJyb3J9XCI+PC9ndi1pbWFnZT5gIDogJyd9XG4gICAgICAgIDxkaXYgY2xhc3M9XCJib3hfX2lucHV0XCI+XG4gICAgICAgICAgPGd2LWljb24gY2xhc3M9XCJib3hfX2ljb25cIiBzaGFwZT1cIiR7dGhpcy5pY29ufVwiPjwvZ3YtaWNvbj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwiZmlsZVwiIGNsYXNzPVwibGlua1wiPlxuICAgICAgICAgICAgPHN0cm9uZz4ke2xhYmVsfTwvc3Ryb25nPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJib3hfX2RyYWduZHJvcFwiPiR7aTE4bignZ3YtZmlsZS11cGxvYWQub3JEcmFnSXQnKX08L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIGNsYXNzPVwiYm94X19maWxlXCJcbiAgICAgICAgICAgIHR5cGU9XCJmaWxlXCJcbiAgICAgICAgICAgIG5hbWU9XCJmaWxlc1tdXCJcbiAgICAgICAgICAgIGlkPVwiZmlsZVwiXG4gICAgICAgICAgICBmaWxlcz1cIiR7dGhpcy5maWxlc31cIlxuICAgICAgICAgICAgYWNjZXB0PVwiJHtpZkRlZmluZWQodGhpcy5hY2NlcHQpfVwiXG4gICAgICAgICAgICBAY2hhbmdlPVwiJHt0aGlzLl9vbkNoYW5nZX1cIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICAke3RoaXMuX2ZpbGVzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBodG1sYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbGVzXCI+XG4gICAgICAgICAgICAgIDxndi1pY29uIHNoYXBlPVwiZ2VuZXJhbDpjbGlwXCI+PC9ndi1pY29uPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsZW5hbWVcIj4ke3RoaXMuX2ZpbGVzWzBdLm5hbWV9PC9kaXY+XG4gICAgICAgICAgICAgIDxndi1pY29uIGNsYXNzPVwibGlua1wiIEBjbGljaz1cIiR7dGhpcy5fcmVtb3ZlRmlsZS5iaW5kKHRoaXMsIDApfVwiIHNoYXBlPVwiZ2VuZXJhbDp0cmFzaFwiPjwvZ3YtaWNvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIGBcbiAgICAgICAgOiAnJ31cbiAgICAgICR7dGhpcy5fZXJyb3JzLmxlbmd0aCA+IDBcbiAgICAgICAgPyBodG1sYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbGVzXCI+XG4gICAgICAgICAgICAgIDxndi1pY29uIGNsYXNzPVwiZXJyb3JcIiBzaGFwZT1cImNvZGU6c3RvcFwiPjwvZ3YtaWNvbj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbGVuYW1lXCI+JHt0aGlzLl9lcnJvcnNbMF0uZmlsZS5uYW1lfSA8c3BhbiBjbGFzcz1cImVycm9yXCI+KCR7dGhpcy5fZXJyb3JzWzBdLmVycm9yfSk8L3NwYW4+PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBgXG4gICAgICAgIDogJyd9XG4gICAgICAke3RoaXMudmFsdWUgJiYgdGhpcy5fZmlsZXMubGVuZ3RoID09PSAwICYmIHRoaXMuX2Vycm9ycy5sZW5ndGggPT09IDBcbiAgICAgICAgPyBodG1sYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbGVzXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWxlbmFtZVwiPjwvZGl2PlxuICAgICAgICAgICAgICA8Z3YtYnV0dG9uIGxpbmsgQGNsaWNrPVwiJHt0aGlzLl9yZW1vdmVGaWxlLmJpbmQodGhpcywgMCl9XCI+JHtpMThuKCdndi1maWxlLXVwbG9hZC5yZW1vdmVQaWN0dXJlJyl9PC9ndi1idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBgXG4gICAgICAgIDogJyd9XG4gICAgYDtcbiAgfVxuXG4gIF9vblByZXZpZXdFcnJvcigpIHtcbiAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgfVxuXG4gIHVwZGF0ZWQoY2hhbmdlZFByb3BlcnRpZXMpIHtcbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCd2YWx1ZScpKSB7XG4gICAgICBpZiAodGhpcy52YWx1ZSkge1xuICAgICAgICB0aGlzLl9wcmV2aWV3ID0gdGhpcy52YWx1ZTtcbiAgICAgICAgaWYgKHRoaXMuX2ZpbGVzICYmIHRoaXMuX2ZpbGVzWzBdKSB7XG4gICAgICAgICAgdGhpcy5yZWFkZXIucmVhZEFzRGF0YVVSTCh0aGlzLl9maWxlc1swXSk7XG4gICAgICAgICAgdGhpcy5yZWFkZXIub25sb2FkID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy52YWx1ZSAhPT0gZXZlbnQudGFyZ2V0LnJlc3VsdCkge1xuICAgICAgICAgICAgICB0aGlzLl9maWxlcyA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3ByZXZpZXcgPSBudWxsO1xuICAgICAgICB0aGlzLl9maWxlcyA9IFtdO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHByZXZpZXcgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignLnByZXZpZXcnKTtcbiAgICBpZiAocHJldmlldykge1xuICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBwcmV2aWV3LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgaW1nID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ2d2LWltYWdlJyk7XG4gICAgICBpbWcuc3R5bGUud2lkdGggPSB3aWR0aCAtIDIwICsgJ3B4JztcbiAgICAgIGltZy5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgLSAyMCArICdweCc7XG4gICAgICBpbWcuc3R5bGUubGVmdCA9ICcxMHB4JztcbiAgICAgIGltZy5zdHlsZS50b3AgPSAnMTBweCc7XG4gICAgfVxuICB9XG59XG5cbndpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoJ2d2LWZpbGUtdXBsb2FkJywgR3ZGaWxlVXBsb2FkKTtcbiJdfQ==
@@ -15,6 +15,7 @@
15
15
  */
16
16
  import { css, LitElement, html, noChange } from 'lit';
17
17
  import { Directive, directive } from 'lit/directive';
18
+
18
19
  import { classMap } from 'lit/directives/class-map';
19
20
 
20
21
  class Namespaced extends Directive {
@@ -22,10 +23,10 @@ class Namespaced extends Directive {
22
23
  part.element.setAttributeNS(namespace, part.name, value);
23
24
  return noChange;
24
25
  }
25
-
26
26
  }
27
27
 
28
28
  const namespaced = directive(Namespaced);
29
+
29
30
  /**
30
31
  * An icon
31
32
  *
@@ -36,7 +37,6 @@ const namespaced = directive(Namespaced);
36
37
  * @cssprop {Color} [--gv-icon-opacity--c=var(--gv-theme-font-color-dark, #262626)] - Opacity color
37
38
  * @cssprop {Length} [--gv-icon--s=32px] - Height and width
38
39
  */
39
-
40
40
  export class GvIcon extends LitElement {
41
41
  static get properties() {
42
42
  return {
@@ -46,9 +46,7 @@ export class GvIcon extends LitElement {
46
46
  * @attr
47
47
  * @required
48
48
  */
49
- shape: {
50
- type: String
51
- }
49
+ shape: { type: String },
52
50
  };
53
51
  }
54
52
 
@@ -57,12 +55,36 @@ export class GvIcon extends LitElement {
57
55
  }
58
56
 
59
57
  canCustomize() {
60
- return !['thirdparty:google', 'thirdparty:graviteeio_am', 'thirdparty:http', 'thirdparty:jdbc', 'thirdparty:microsoft', 'thirdparty:mongodb'].includes(this.shape);
58
+ return ![
59
+ 'thirdparty:google',
60
+ 'thirdparty:graviteeio_am',
61
+ 'thirdparty:http',
62
+ 'thirdparty:jdbc',
63
+ 'thirdparty:microsoft',
64
+ 'thirdparty:mongodb',
65
+ ].includes(this.shape);
61
66
  }
62
67
 
63
68
  static get styles() {
64
- return [// language=CSS
65
- css`:host{box-sizing:border-box;display:inline-flex;vertical-align:middle;--color:var(--gv-icon--c, var(--gv-theme-font-color-dark, #262626));--opacity:var(--gv-icon-opacity--c, var(--gv-theme-font-color-dark, #262626));--size:var(--gv-icon--s, 32px)}svg{height:var(--size);width:var(--size);fill:var(--color)}`];
69
+ return [
70
+ // language=CSS
71
+ css`
72
+ :host {
73
+ box-sizing: border-box;
74
+ display: inline-flex;
75
+ vertical-align: middle;
76
+ --color: var(--gv-icon--c, var(--gv-theme-font-color-dark, #262626));
77
+ --opacity: var(--gv-icon-opacity--c, var(--gv-theme-font-color-dark, #262626));
78
+ --size: var(--gv-icon--s, 32px);
79
+ }
80
+
81
+ svg {
82
+ height: var(--size);
83
+ width: var(--size);
84
+ fill: var(--color);
85
+ }
86
+ `,
87
+ ];
66
88
  }
67
89
 
68
90
  static getHref(shape) {
@@ -72,11 +94,10 @@ export class GvIcon extends LitElement {
72
94
 
73
95
  render() {
74
96
  const xlinkNamespace = 'http://www.w3.org/1999/xlink';
75
- return html`<svg class="${classMap({
76
- 'no-color': !this.canCustomize()
77
- })}"> <use xlink:href="${namespaced(xlinkNamespace, GvIcon.getHref(this.shape))}"/> </svg>`;
97
+ return html`<svg class="${classMap({ 'no-color': !this.canCustomize() })}">
98
+ <use xlink:href="${namespaced(xlinkNamespace, GvIcon.getHref(this.shape))}" />
99
+ </svg>`;
78
100
  }
79
-
80
101
  }
102
+
81
103
  window.customElements.define('gv-icon', GvIcon);
82
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4vbm9kZV9tb2R1bGVzL0BncmF2aXRlZS91aS1jb21wb25lbnRzL2F0b21zL2d2LWljb24uanMiXSwibmFtZXMiOlsiY3NzIiwiTGl0RWxlbWVudCIsImh0bWwiLCJub0NoYW5nZSIsIkRpcmVjdGl2ZSIsImRpcmVjdGl2ZSIsImNsYXNzTWFwIiwiTmFtZXNwYWNlZCIsInVwZGF0ZSIsInBhcnQiLCJuYW1lc3BhY2UiLCJ2YWx1ZSIsImVsZW1lbnQiLCJzZXRBdHRyaWJ1dGVOUyIsIm5hbWUiLCJuYW1lc3BhY2VkIiwiR3ZJY29uIiwicHJvcGVydGllcyIsInNoYXBlIiwidHlwZSIsIlN0cmluZyIsImV4Y2x1ZGVkU2hhcGVzIiwiY2FuQ3VzdG9taXplIiwiaW5jbHVkZXMiLCJzdHlsZXMiLCJnZXRIcmVmIiwiY2F0ZWdvcnkiLCJpY29uIiwic3BsaXQiLCJyZW5kZXIiLCJ4bGlua05hbWVzcGFjZSIsIndpbmRvdyIsImN1c3RvbUVsZW1lbnRzIiwiZGVmaW5lIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTQSxHQUFULEVBQWNDLFVBQWQsRUFBMEJDLElBQTFCLEVBQWdDQyxRQUFoQyxRQUFnRCxLQUFoRDtBQUNBLFNBQVNDLFNBQVQsRUFBb0JDLFNBQXBCLFFBQXFDLGVBQXJDO0FBRUEsU0FBU0MsUUFBVCxRQUF5QiwwQkFBekI7O0FBRUEsTUFBTUMsVUFBTixTQUF5QkgsU0FBekIsQ0FBbUM7QUFDakNJLEVBQUFBLE1BQU0sQ0FBQ0MsSUFBRCxFQUFPLENBQUNDLFNBQUQsRUFBWUMsS0FBWixDQUFQLEVBQTJCO0FBQy9CRixJQUFBQSxJQUFJLENBQUNHLE9BQUwsQ0FBYUMsY0FBYixDQUE0QkgsU0FBNUIsRUFBdUNELElBQUksQ0FBQ0ssSUFBNUMsRUFBa0RILEtBQWxEO0FBQ0EsV0FBT1IsUUFBUDtBQUNEOztBQUpnQzs7QUFPbkMsTUFBTVksVUFBVSxHQUFHVixTQUFTLENBQUNFLFVBQUQsQ0FBNUI7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQSxPQUFPLE1BQU1TLE1BQU4sU0FBcUJmLFVBQXJCLENBQWdDO0FBQ2hCLGFBQVZnQixVQUFVLEdBQUc7QUFDdEIsV0FBTztBQUNMO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNNQyxNQUFBQSxLQUFLLEVBQUU7QUFBRUMsUUFBQUEsSUFBSSxFQUFFQztBQUFSO0FBUEYsS0FBUDtBQVNEOztBQUV3QixhQUFkQyxjQUFjLEdBQUc7QUFDMUIsV0FBTyxDQUFDLG1CQUFELEVBQXNCLDBCQUF0QixDQUFQO0FBQ0Q7O0FBRURDLEVBQUFBLFlBQVksR0FBRztBQUNiLFdBQU8sQ0FBQyxDQUNOLG1CQURNLEVBRU4sMEJBRk0sRUFHTixpQkFITSxFQUlOLGlCQUpNLEVBS04sc0JBTE0sRUFNTixvQkFOTSxFQU9OQyxRQVBNLENBT0csS0FBS0wsS0FQUixDQUFSO0FBUUQ7O0FBRWdCLGFBQU5NLE1BQU0sR0FBRztBQUNsQixXQUFPLENBQ0w7QUFDQXhCLElBQUFBLEdBQUcsb1RBRkUsQ0FBUDtBQW1CRDs7QUFFYSxTQUFQeUIsT0FBTyxDQUFDUCxLQUFELEVBQVE7QUFDcEIsVUFBTSxDQUFDUSxRQUFELEVBQVdDLElBQVgsSUFBbUJULEtBQUssQ0FBQ1UsS0FBTixDQUFZLEdBQVosQ0FBekI7QUFDQSxXQUFRLFdBQVVGLFFBQVMsUUFBT0MsSUFBSyxFQUF2QztBQUNEOztBQUVERSxFQUFBQSxNQUFNLEdBQUc7QUFDUCxVQUFNQyxjQUFjLEdBQUcsOEJBQXZCO0FBQ0EsV0FBTzVCLElBQUksZUFBZUksUUFBUSxDQUFDO0FBQUUsa0JBQVksQ0FBQyxLQUFLZ0IsWUFBTDtBQUFmLEtBQUQsQ0FBdkIsdUJBQ1VQLFVBQVUsQ0FBQ2UsY0FBRCxFQUFpQmQsTUFBTSxDQUFDUyxPQUFQLENBQWUsS0FBS1AsS0FBcEIsQ0FBakIsQ0FEcEIsWUFBWDtBQUdEOztBQTVEb0M7QUErRHZDYSxNQUFNLENBQUNDLGNBQVAsQ0FBc0JDLE1BQXRCLENBQTZCLFNBQTdCLEVBQXdDakIsTUFBeEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBHcmF2aXRlZSB0ZWFtIChodHRwOi8vZ3Jhdml0ZWUuaW8pXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgY3NzLCBMaXRFbGVtZW50LCBodG1sLCBub0NoYW5nZSB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBEaXJlY3RpdmUsIGRpcmVjdGl2ZSB9IGZyb20gJ2xpdC9kaXJlY3RpdmUnO1xuXG5pbXBvcnQgeyBjbGFzc01hcCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL2NsYXNzLW1hcCc7XG5cbmNsYXNzIE5hbWVzcGFjZWQgZXh0ZW5kcyBEaXJlY3RpdmUge1xuICB1cGRhdGUocGFydCwgW25hbWVzcGFjZSwgdmFsdWVdKSB7XG4gICAgcGFydC5lbGVtZW50LnNldEF0dHJpYnV0ZU5TKG5hbWVzcGFjZSwgcGFydC5uYW1lLCB2YWx1ZSk7XG4gICAgcmV0dXJuIG5vQ2hhbmdlO1xuICB9XG59XG5cbmNvbnN0IG5hbWVzcGFjZWQgPSBkaXJlY3RpdmUoTmFtZXNwYWNlZCk7XG5cbi8qKlxuICogQW4gaWNvblxuICpcbiAqICMjIERldGFpbHNcbiAqICogaGFzIEB0aGVtZSBmYWNldFxuICpcbiAqIEBjc3Nwcm9wIHtDb2xvcn0gWy0tZ3YtaWNvbi0tYz12YXIoLS1ndi10aGVtZS1mb250LWNvbG9yLWRhcmssICMyNjI2MjYpXSAtIENvbG9yXG4gKiBAY3NzcHJvcCB7Q29sb3J9IFstLWd2LWljb24tb3BhY2l0eS0tYz12YXIoLS1ndi10aGVtZS1mb250LWNvbG9yLWRhcmssICMyNjI2MjYpXSAtIE9wYWNpdHkgY29sb3JcbiAqIEBjc3Nwcm9wIHtMZW5ndGh9IFstLWd2LWljb24tLXM9MzJweF0gLSBIZWlnaHQgYW5kIHdpZHRoXG4gKi9cbmV4cG9ydCBjbGFzcyBHdkljb24gZXh0ZW5kcyBMaXRFbGVtZW50IHtcbiAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAvKipcbiAgICAgICAqIFRoaXMgaXMgYSBzaGFwZSwgYW4gY29uY2F0ZW5hdGlvbiBvZiBjYXRlZ29yeSBuYW1lIGFuZCBpY29uIG5hbWUuXG4gICAgICAgKiBAdHlwZSB7XCJ7Y2F0ZWdvcnl9OntpY29uTmFtZX1cIn1cbiAgICAgICAqIEBhdHRyXG4gICAgICAgKiBAcmVxdWlyZWRcbiAgICAgICAqL1xuICAgICAgc2hhcGU6IHsgdHlwZTogU3RyaW5nIH0sXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgZXhjbHVkZWRTaGFwZXMoKSB7XG4gICAgcmV0dXJuIFsndGhpcmRwYXJ0eTpnb29nbGUnLCAndGhpcmRwYXJ0eTpncmF2aXRlZWlvX2FtJ107XG4gIH1cblxuICBjYW5DdXN0b21pemUoKSB7XG4gICAgcmV0dXJuICFbXG4gICAgICAndGhpcmRwYXJ0eTpnb29nbGUnLFxuICAgICAgJ3RoaXJkcGFydHk6Z3Jhdml0ZWVpb19hbScsXG4gICAgICAndGhpcmRwYXJ0eTpodHRwJyxcbiAgICAgICd0aGlyZHBhcnR5OmpkYmMnLFxuICAgICAgJ3RoaXJkcGFydHk6bWljcm9zb2Z0JyxcbiAgICAgICd0aGlyZHBhcnR5Om1vbmdvZGInLFxuICAgIF0uaW5jbHVkZXModGhpcy5zaGFwZSk7XG4gIH1cblxuICBzdGF0aWMgZ2V0IHN0eWxlcygpIHtcbiAgICByZXR1cm4gW1xuICAgICAgLy8gbGFuZ3VhZ2U9Q1NTXG4gICAgICBjc3NgXG4gICAgICAgIDpob3N0IHtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgICAgICAgLS1jb2xvcjogdmFyKC0tZ3YtaWNvbi0tYywgdmFyKC0tZ3YtdGhlbWUtZm9udC1jb2xvci1kYXJrLCAjMjYyNjI2KSk7XG4gICAgICAgICAgLS1vcGFjaXR5OiB2YXIoLS1ndi1pY29uLW9wYWNpdHktLWMsIHZhcigtLWd2LXRoZW1lLWZvbnQtY29sb3ItZGFyaywgIzI2MjYyNikpO1xuICAgICAgICAgIC0tc2l6ZTogdmFyKC0tZ3YtaWNvbi0tcywgMzJweCk7XG4gICAgICAgIH1cblxuICAgICAgICBzdmcge1xuICAgICAgICAgIGhlaWdodDogdmFyKC0tc2l6ZSk7XG4gICAgICAgICAgd2lkdGg6IHZhcigtLXNpemUpO1xuICAgICAgICAgIGZpbGw6IHZhcigtLWNvbG9yKTtcbiAgICAgICAgfVxuICAgICAgYCxcbiAgICBdO1xuICB9XG5cbiAgc3RhdGljIGdldEhyZWYoc2hhcGUpIHtcbiAgICBjb25zdCBbY2F0ZWdvcnksIGljb25dID0gc2hhcGUuc3BsaXQoJzonKTtcbiAgICByZXR1cm4gYC4vaWNvbnMvJHtjYXRlZ29yeX0uc3ZnIyR7aWNvbn1gO1xuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHhsaW5rTmFtZXNwYWNlID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsnO1xuICAgIHJldHVybiBodG1sYDxzdmcgY2xhc3M9XCIke2NsYXNzTWFwKHsgJ25vLWNvbG9yJzogIXRoaXMuY2FuQ3VzdG9taXplKCkgfSl9XCI+XG4gICAgICA8dXNlIHhsaW5rOmhyZWY9XCIke25hbWVzcGFjZWQoeGxpbmtOYW1lc3BhY2UsIEd2SWNvbi5nZXRIcmVmKHRoaXMuc2hhcGUpKX1cIiAvPlxuICAgIDwvc3ZnPmA7XG4gIH1cbn1cblxud2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnZ3YtaWNvbicsIEd2SWNvbik7XG4iXX0=