@gravitee/ui-components 3.24.5 → 3.25.0-fix-gvcode-15ce1d2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/CHANGELOG.md +1270 -0
  2. package/LICENSE.txt +202 -0
  3. package/README.md +195 -0
  4. package/assets/i18n/en.json +3 -0
  5. package/assets/i18n/fr.json +3 -0
  6. package/assets/icons/design.svg +1 -1
  7. package/package.json +1 -1
  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 +148 -117
  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 -1
  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 +47 -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 +143 -81
  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 +138 -176
  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 +128 -45
  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 +324 -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 +266 -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 +777 -686
  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
@@ -19,6 +19,7 @@ import { pickedCompletion, startCompletion } from '@codemirror/autocomplete';
19
19
  import { keymap } from '@codemirror/view';
20
20
  import { EditorSelection, Prec } from '@codemirror/state';
21
21
  import { get } from 'object-path';
22
+
22
23
  /**
23
24
  * Expression Language component
24
25
  *
@@ -40,21 +41,17 @@ import { get } from 'object-path';
40
41
  * @attr {Boolean} [autofocus=false] - true to put the focus on the input
41
42
  * @attr {Boolean} [readonly=false] - true if field is readonly mode
42
43
  */
43
-
44
44
  export class GvExpressionLanguage extends GvCode {
45
45
  static get properties() {
46
- return { ...super.properties,
47
- grammar: {
48
- type: Object
49
- }
46
+ return {
47
+ ...super.properties,
48
+ grammar: { type: Object },
50
49
  };
51
50
  }
52
51
 
53
52
  firstUpdated() {
54
53
  super.firstUpdated();
55
- dispatchCustomEvent(this, 'ready', {
56
- currentTarget: this
57
- });
54
+ dispatchCustomEvent(this, 'ready', { currentTarget: this });
58
55
  }
59
56
 
60
57
  getExtensions() {
@@ -62,35 +59,29 @@ export class GvExpressionLanguage extends GvCode {
62
59
  }
63
60
 
64
61
  insertELKeymap() {
65
- return keymap.of([{
66
- key: 'Ctrl-Shift-e',
67
- mac: 'Cmd-Shift-e',
68
-
69
- run(view) {
70
- view.dispatch(view.state.changeByRange(range => ({
71
- changes: [{
72
- from: range.from,
73
- to: range.to,
74
- insert: '{#}'
75
- }],
76
- range: EditorSelection.range(range.from + 2, range.from + 2)
77
- })));
78
- startCompletion(view);
79
- return true;
80
- }
81
-
82
- }]);
62
+ return keymap.of([
63
+ {
64
+ key: 'Ctrl-Shift-e',
65
+ mac: 'Cmd-Shift-e',
66
+ run(view) {
67
+ view.dispatch(
68
+ view.state.changeByRange((range) => ({
69
+ changes: [{ from: range.from, to: range.to, insert: '{#}' }],
70
+ range: EditorSelection.range(range.from + 2, range.from + 2),
71
+ })),
72
+ );
73
+ startCompletion(view);
74
+ return true;
75
+ },
76
+ },
77
+ ]);
83
78
  }
84
79
 
85
80
  buildMethods(type) {
86
81
  const modelType = this.getModelType(type);
87
- return modelType.methods.map(({
88
- name,
89
- params = [],
90
- returnType
91
- }) => {
82
+ return modelType.methods.map(({ name, params = [], returnType }) => {
92
83
  const command = `${name}()`;
93
- const displayParams = params.map(p => `${p.type} ${p.name}`);
84
+ const displayParams = params.map((p) => `${p.type} ${p.name}`);
94
85
  const label = `${name}(${displayParams.join(', ')})`;
95
86
  const detail = `return ${returnType}`;
96
87
  return {
@@ -99,42 +90,32 @@ export class GvExpressionLanguage extends GvCode {
99
90
  apply: (view, completion, from, to) => {
100
91
  const anchor = from + name.length + 1;
101
92
  view.dispatch({
102
- changes: {
103
- from,
104
- to,
105
- insert: completion.command
106
- },
107
- selection: {
108
- anchor
109
- },
93
+ changes: { from, to, insert: completion.command },
94
+ selection: { anchor },
110
95
  userEvent: 'input.complete',
111
- annotations: pickedCompletion.of(view)
96
+ annotations: pickedCompletion.of(view),
112
97
  });
113
98
  },
114
99
  label,
115
- detail
100
+ detail,
116
101
  };
117
102
  });
118
103
  }
119
104
 
120
105
  findBestAutocompleteHandler(completionContext) {
121
- return this.expressionLanguageCompletionHandlers.filter(handler => this.grammar != null && handler.supportEL === true || handler.supportEL !== true).map(handler => {
122
- const match = handler.expr ? completionContext.matchBefore(handler.expr) : true;
123
- return {
124
- handler,
125
- match
126
- };
127
- }).find(({
128
- match,
129
- expr
130
- }) => match);
106
+ return this.expressionLanguageCompletionHandlers
107
+ .filter((handler) => (this.grammar != null && handler.supportEL === true) || handler.supportEL !== true)
108
+ .map((handler) => {
109
+ const match = handler.expr ? completionContext.matchBefore(handler.expr) : true;
110
+ return { handler, match };
111
+ })
112
+ .find(({ match, expr }) => match);
131
113
  }
132
114
 
133
115
  getModelType(typeId) {
134
116
  if (this.grammar != null) {
135
117
  return get(this.grammar, `_types.${typeId}`);
136
118
  }
137
-
138
119
  return null;
139
120
  }
140
121
 
@@ -146,14 +127,12 @@ export class GvExpressionLanguage extends GvCode {
146
127
  if (this.grammar != null) {
147
128
  return get(this.grammar, `_enums.${typeId}`);
148
129
  }
149
-
150
130
  return [''];
151
131
  }
152
132
 
153
133
  convertType(type) {
154
134
  if (type) {
155
135
  const lowerType = type.toLowerCase();
156
-
157
136
  if (lowerType === 'string') {
158
137
  return 'text';
159
138
  } else if (lowerType === 'httpheaders' || lowerType === 'multivaluemap') {
@@ -164,145 +143,128 @@ export class GvExpressionLanguage extends GvCode {
164
143
  return 'enum';
165
144
  }
166
145
  }
167
-
168
146
  return 'variable';
169
147
  }
170
148
 
171
149
  get expressionLanguageCompletionHandlers() {
172
- return [{
173
- expr: /{#[a-z]*/,
174
- supportEL: true,
175
-
176
- run(completionContext, match) {
177
- const prefix = match.text.replaceAll('{#', '');
178
- const from = completionContext.pos - prefix.length;
179
- const options = Object.keys(this.grammar).filter(command => !command.startsWith('_') && command.startsWith(prefix)).map(command => {
180
- return {
181
- type: 'variable',
182
- command,
183
- apply: command,
184
- label: command
185
- };
186
- });
187
- return {
188
- from,
189
- options
190
- };
191
- }
192
-
193
- }, {
194
- expr: /{#[a-z]*.[a-zA-Z]*/,
195
- supportEL: true,
196
-
197
- run(completionContext, match) {
198
- const tokens = match.text.split('.');
199
- const key = tokens[0].replaceAll('{#', '');
200
- const prefix = tokens[1];
201
- let candidate = this.grammar[key][prefix];
202
- let options = [];
203
- let from = completionContext.pos;
204
-
205
- if (candidate) {
206
- if (this.isMap(candidate._type)) {
207
- options = this.getEnum(candidate._type).map(value => {
208
- const type = this.convertType(candidate._type);
209
- const command = `['${value}'][0]`;
150
+ return [
151
+ {
152
+ expr: /{#[a-z]*/,
153
+ supportEL: true,
154
+ run(completionContext, match) {
155
+ const prefix = match.text.replaceAll('{#', '');
156
+ const from = completionContext.pos - prefix.length;
157
+ const options = Object.keys(this.grammar)
158
+ .filter((command) => !command.startsWith('_') && command.startsWith(prefix))
159
+ .map((command) => {
210
160
  return {
211
- type,
161
+ type: 'variable',
212
162
  command,
213
163
  apply: command,
214
- label: value
215
- };
216
- });
217
- }
218
- } else {
219
- from -= prefix.length;
220
- candidate = this.grammar[key];
221
-
222
- if (candidate._type) {
223
- options = this.buildMethods(candidate._type);
224
- } else {
225
- options = Object.keys(candidate).filter(command => !command.startsWith('_') && command.startsWith(prefix)).map(command => ({
226
- type: this.convertType(candidate[command]._type),
227
- command,
228
- apply: command,
229
- label: command
230
- }));
231
- }
232
- }
233
-
234
- return {
235
- from,
236
- options
237
- };
238
- }
239
-
240
- }, {
241
- expr: /{#[a-z]*.[a-zA-Z]*.[a-zA-Z]*/,
242
- supportEL: true,
243
-
244
- run(completionContext, match) {
245
- const tokens = match.text.split('.');
246
- const key = tokens[0].replaceAll('{#', '');
247
- const word = tokens[1];
248
- const prefix = tokens[2];
249
- const candidate = this.grammar[key][word];
250
- let options = [];
251
- let from = completionContext.pos;
252
-
253
- if (candidate) {
254
- if (this.isMap(candidate._type)) {
255
- options = this.getEnum(candidate._type).filter(command => !command.startsWith('_') && command.startsWith(prefix)).map(label => {
256
- const type = this.convertType(candidate._type);
257
- return {
258
- type,
259
- command: `['${label}'][0]`,
260
-
261
- apply(view, completion, _from, to) {
262
- from = _from - prefix.length - 1;
263
- view.dispatch({
264
- changes: {
265
- from,
266
- to,
267
- insert: completion.command
268
- },
269
- selection: {
270
- anchor: from + completion.command.length
271
- },
272
- userEvent: 'input.complete',
273
- annotations: pickedCompletion.of(view)
274
- });
275
- },
276
-
277
- label
164
+ label: command,
278
165
  };
279
166
  });
167
+ return { from, options };
168
+ },
169
+ },
170
+ {
171
+ expr: /{#[a-z]*.[a-zA-Z]*/,
172
+ supportEL: true,
173
+ run(completionContext, match) {
174
+ const tokens = match.text.split('.');
175
+ const key = tokens[0].replaceAll('{#', '');
176
+ const prefix = tokens[1];
177
+ let candidate = this.grammar[key][prefix];
178
+ let options = [];
179
+ let from = completionContext.pos;
180
+ if (candidate) {
181
+ if (this.isMap(candidate._type)) {
182
+ options = this.getEnum(candidate._type).map((value) => {
183
+ const type = this.convertType(candidate._type);
184
+ const command = `['${value}'][0]`;
185
+ return {
186
+ type,
187
+ command,
188
+ apply: command,
189
+ label: value,
190
+ };
191
+ });
192
+ }
280
193
  } else {
194
+ from -= prefix.length;
195
+ candidate = this.grammar[key];
281
196
  if (candidate._type) {
282
197
  options = this.buildMethods(candidate._type);
283
198
  } else {
284
- from -= prefix.length;
285
- options = Object.keys(candidate).filter(command => command.startsWith(prefix)).map(command => {
286
- return {
199
+ options = Object.keys(candidate)
200
+ .filter((command) => !command.startsWith('_') && command.startsWith(prefix))
201
+ .map((command) => ({
287
202
  type: this.convertType(candidate[command]._type),
288
203
  command,
289
204
  apply: command,
290
- label: command
291
- };
292
- });
205
+ label: command,
206
+ }));
293
207
  }
294
208
  }
295
- }
296
-
297
- return {
298
- from,
299
- options
300
- };
301
- }
302
-
303
- }, this.defaultCompletionHandler];
209
+ return { from, options };
210
+ },
211
+ },
212
+ {
213
+ expr: /{#[a-z]*.[a-zA-Z]*.[a-zA-Z]*/,
214
+ supportEL: true,
215
+ run(completionContext, match) {
216
+ const tokens = match.text.split('.');
217
+ const key = tokens[0].replaceAll('{#', '');
218
+ const word = tokens[1];
219
+ const prefix = tokens[2];
220
+ const candidate = this.grammar[key][word];
221
+ let options = [];
222
+ let from = completionContext.pos;
223
+ if (candidate) {
224
+ if (this.isMap(candidate._type)) {
225
+ options = this.getEnum(candidate._type)
226
+ .filter((command) => !command.startsWith('_') && command.startsWith(prefix))
227
+ .map((label) => {
228
+ const type = this.convertType(candidate._type);
229
+ return {
230
+ type,
231
+ command: `['${label}'][0]`,
232
+ apply(view, completion, _from, to) {
233
+ from = _from - prefix.length - 1;
234
+ view.dispatch({
235
+ changes: { from, to, insert: completion.command },
236
+ selection: { anchor: from + completion.command.length },
237
+ userEvent: 'input.complete',
238
+ annotations: pickedCompletion.of(view),
239
+ });
240
+ },
241
+ label,
242
+ };
243
+ });
244
+ } else {
245
+ if (candidate._type) {
246
+ options = this.buildMethods(candidate._type);
247
+ } else {
248
+ from -= prefix.length;
249
+ options = Object.keys(candidate)
250
+ .filter((command) => command.startsWith(prefix))
251
+ .map((command) => {
252
+ return {
253
+ type: this.convertType(candidate[command]._type),
254
+ command,
255
+ apply: command,
256
+ label: command,
257
+ };
258
+ });
259
+ }
260
+ }
261
+ }
262
+ return { from, options };
263
+ },
264
+ },
265
+ this.defaultCompletionHandler,
266
+ ];
304
267
  }
305
-
306
268
  }
269
+
307
270
  window.customElements.define('gv-expression-language', GvExpressionLanguage);
308
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4vbm9kZV9tb2R1bGVzL0BncmF2aXRlZS91aS1jb21wb25lbnRzL21vbGVjdWxlcy9ndi1leHByZXNzaW9uLWxhbmd1YWdlLmpzIl0sIm5hbWVzIjpbIkd2Q29kZSIsImRpc3BhdGNoQ3VzdG9tRXZlbnQiLCJwaWNrZWRDb21wbGV0aW9uIiwic3RhcnRDb21wbGV0aW9uIiwia2V5bWFwIiwiRWRpdG9yU2VsZWN0aW9uIiwiUHJlYyIsImdldCIsIkd2RXhwcmVzc2lvbkxhbmd1YWdlIiwicHJvcGVydGllcyIsImdyYW1tYXIiLCJ0eXBlIiwiT2JqZWN0IiwiZmlyc3RVcGRhdGVkIiwiY3VycmVudFRhcmdldCIsImdldEV4dGVuc2lvbnMiLCJoaWdoIiwiaW5zZXJ0RUxLZXltYXAiLCJvZiIsImtleSIsIm1hYyIsInJ1biIsInZpZXciLCJkaXNwYXRjaCIsInN0YXRlIiwiY2hhbmdlQnlSYW5nZSIsInJhbmdlIiwiY2hhbmdlcyIsImZyb20iLCJ0byIsImluc2VydCIsImJ1aWxkTWV0aG9kcyIsIm1vZGVsVHlwZSIsImdldE1vZGVsVHlwZSIsIm1ldGhvZHMiLCJtYXAiLCJuYW1lIiwicGFyYW1zIiwicmV0dXJuVHlwZSIsImNvbW1hbmQiLCJkaXNwbGF5UGFyYW1zIiwicCIsImxhYmVsIiwiam9pbiIsImRldGFpbCIsImFwcGx5IiwiY29tcGxldGlvbiIsImFuY2hvciIsImxlbmd0aCIsInNlbGVjdGlvbiIsInVzZXJFdmVudCIsImFubm90YXRpb25zIiwiZmluZEJlc3RBdXRvY29tcGxldGVIYW5kbGVyIiwiY29tcGxldGlvbkNvbnRleHQiLCJleHByZXNzaW9uTGFuZ3VhZ2VDb21wbGV0aW9uSGFuZGxlcnMiLCJmaWx0ZXIiLCJoYW5kbGVyIiwic3VwcG9ydEVMIiwibWF0Y2giLCJleHByIiwibWF0Y2hCZWZvcmUiLCJmaW5kIiwidHlwZUlkIiwiaXNNYXAiLCJpbmNsdWRlcyIsImdldEVudW0iLCJjb252ZXJ0VHlwZSIsImxvd2VyVHlwZSIsInRvTG93ZXJDYXNlIiwicHJlZml4IiwidGV4dCIsInJlcGxhY2VBbGwiLCJwb3MiLCJvcHRpb25zIiwia2V5cyIsInN0YXJ0c1dpdGgiLCJ0b2tlbnMiLCJzcGxpdCIsImNhbmRpZGF0ZSIsIl90eXBlIiwidmFsdWUiLCJ3b3JkIiwiX2Zyb20iLCJkZWZhdWx0Q29tcGxldGlvbkhhbmRsZXIiLCJ3aW5kb3ciLCJjdXN0b21FbGVtZW50cyIsImRlZmluZSJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0EsTUFBVCxRQUF1QixzQkFBdkI7QUFDQSxTQUFTQyxtQkFBVCxRQUFvQyxlQUFwQztBQUNBLFNBQVNDLGdCQUFULEVBQTJCQyxlQUEzQixRQUFrRCwwQkFBbEQ7QUFDQSxTQUFTQyxNQUFULFFBQXVCLGtCQUF2QjtBQUNBLFNBQVNDLGVBQVQsRUFBMEJDLElBQTFCLFFBQXNDLG1CQUF0QztBQUNBLFNBQVNDLEdBQVQsUUFBb0IsYUFBcEI7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsT0FBTyxNQUFNQyxvQkFBTixTQUFtQ1IsTUFBbkMsQ0FBMEM7QUFDMUIsYUFBVlMsVUFBVSxHQUFHO0FBQ3RCLFdBQU8sRUFDTCxHQUFHLE1BQU1BLFVBREo7QUFFTEMsTUFBQUEsT0FBTyxFQUFFO0FBQUVDLFFBQUFBLElBQUksRUFBRUM7QUFBUjtBQUZKLEtBQVA7QUFJRDs7QUFFREMsRUFBQUEsWUFBWSxHQUFHO0FBQ2IsVUFBTUEsWUFBTjtBQUNBWixJQUFBQSxtQkFBbUIsQ0FBQyxJQUFELEVBQU8sT0FBUCxFQUFnQjtBQUFFYSxNQUFBQSxhQUFhLEVBQUU7QUFBakIsS0FBaEIsQ0FBbkI7QUFDRDs7QUFFREMsRUFBQUEsYUFBYSxHQUFH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QUFBRVgsVUFBQUEsSUFBRjtBQUFRNkMsVUFBQUE7QUFBUixTQUFQO0FBQ0Q7O0FBbkRILEtBOURLLEVBbUhMLEtBQUtVLHdCQW5IQSxDQUFQO0FBcUhEOztBQS9OOEM7QUFrT2pEQyxNQUFNLENBQUNDLGNBQVAsQ0FBc0JDLE1BQXRCLENBQTZCLHdCQUE3QixFQUF1RDlFLG9CQUF2RCIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEdyYXZpdGVlIHRlYW0gKGh0dHA6Ly9ncmF2aXRlZS5pbylcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyBHdkNvZGUgfSBmcm9tICcuLi9tb2xlY3VsZXMvZ3YtY29kZSc7XG5pbXBvcnQgeyBkaXNwYXRjaEN1c3RvbUV2ZW50IH0gZnJvbSAnLi4vbGliL2V2ZW50cyc7XG5pbXBvcnQgeyBwaWNrZWRDb21wbGV0aW9uLCBzdGFydENvbXBsZXRpb24gfSBmcm9tICdAY29kZW1pcnJvci9hdXRvY29tcGxldGUnO1xuaW1wb3J0IHsga2V5bWFwIH0gZnJvbSAnQGNvZGVtaXJyb3Ivdmlldyc7XG5pbXBvcnQgeyBFZGl0b3JTZWxlY3Rpb24sIFByZWMgfSBmcm9tICdAY29kZW1pcnJvci9zdGF0ZSc7XG5pbXBvcnQgeyBnZXQgfSBmcm9tICdvYmplY3QtcGF0aCc7XG5cbi8qKlxuICogRXhwcmVzc2lvbiBMYW5ndWFnZSBjb21wb25lbnRcbiAqXG4gKiBAZmlyZXMgZ3YtZXhwcmVzc2lvbi1sYW5ndWFnZTppbnB1dCAtIGlucHV0IGV2ZW50cyB3aXRoIHRoZSBgdmFsdWVgIG9uIGBkZXRhaWxgXG4gKiBAZmlyZXMgZ3YtZXhwcmVzc2lvbi1sYW5ndWFnZTpyZWFkeSAtIGV2ZW50IGRpc3BhdGNoIHdoZW4gY29tcG9uZW50IGlzIHJlYWR5XG4gKiBAZmlyZXMgZ3YtZXhwcmVzc2lvbi1sYW5ndWFnZTpjbGlwYm9hcmQtY29weSAtIGV2ZW50IGRpc3BhdGNoIHdoZW4gY29tcG9uZW50IHRoZSBgdmFsdWVgIGhhcyBiZWVuIGNvcGllZCB0byBjbGlwYm9hcmRcbiAqXG4gKiBAYXR0ciB7U3RyaW5nfSBsYWJlbCAtIGNvZGUgbGFuZ3VhZ2VcbiAqIEBhdHRyIHtTdHJpbmd9IHZhbHVlIC0gY29kZSBjb250ZW50IHRvIGJlIGhpZ2hsaWdodGVkXG4gKiBAYXR0ciB7b3B0aW9uc30gT2JqZWN0IC0gb3B0aW9ucyBiYXNlZCBvbiBjb2RlbWlycm9yXG4gKiBAYXR0ciB7U3RyaW5nfSBwbGFjZWhvbGRlciAtIGFuIGV4YW1wbGUgdmFsdWUgdG8gZGlzcGxheSBpbiB0aGUgaW5wdXQgd2hlbiBlbXB0eVxuICogQGF0dHIge051bWJlcn0gcm93cyAtIG51bWJlciBvZiByb3dzIG9mIHRoZSB0ZXh0IGVsZW1lbnRcbiAqIEBhdHRyIHtCb29sZWFufSBsYXJnZSAtIGZvciBhIGxhcmdlIGlucHV0IChvbmx5IGlmIHRoZSBmaWVsZCBoYXMgb25lIHJvdylcbiAqIEBhdHRyIHtCb29sZWFufSBtZWRpdW0gLSBmb3IgYSBtZWRpdW0gaW5wdXQgKG9ubHkgaWYgdGhlIGZpZWxkIGhhcyBvbmUgcm93KSAoRGVmYXVsdClcbiAqIEBhdHRyIHtCb29sZWFufSBzbWFsbCAtIGZvciBhIHNtYWxsIGlucHV0IChvbmx5IGlmIHRoZSBmaWVsZCBoYXMgb25lIHJvdylcbiAqIEBhdHRyIHtPYmplY3R9IGdyYW1tYXIgLSBUaGUgZ3JhbW1hciBmb3IgRXhwcmVzc2lvbiBMYW5ndWFnZSBzdXBwb3J0XG4gKlxuICogQGF0dHIge0Jvb2xlYW59IFtjbGlwYm9hcmQ9ZmFsc2VdLSB0cnVlIGlmIGZpZWxkIGhhcyBjbGlwYm9hcmQgYnV0dG9uXG4gKiBAYXR0ciB7Qm9vbGVhbn0gW2F1dG9mb2N1cz1mYWxzZV0gLSB0cnVlIHRvIHB1dCB0aGUgZm9jdXMgb24gdGhlIGlucHV0XG4gKiBAYXR0ciB7Qm9vbGVhbn0gW3JlYWRvbmx5PWZhbHNlXSAtIHRydWUgaWYgZmllbGQgaXMgcmVhZG9ubHkgbW9kZVxuICovXG5leHBvcnQgY2xhc3MgR3ZFeHByZXNzaW9uTGFuZ3VhZ2UgZXh0ZW5kcyBHdkNvZGUge1xuICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN1cGVyLnByb3BlcnRpZXMsXG4gICAgICBncmFtbWFyOiB7IHR5cGU6IE9iamVjdCB9LFxuICAgIH07XG4gIH1cblxuICBmaXJzdFVwZGF0ZWQoKSB7XG4gICAgc3VwZXIuZmlyc3RVcGRhdGVkKCk7XG4gICAgZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLCAncmVhZHknLCB7IGN1cnJlbnRUYXJnZXQ6IHRoaXMgfSk7XG4gIH1cblxuICBnZXRFeHRlbnNpb25zKCkge1xuICAgIHJldHVybiBbUHJlYy5oaWdoKHRoaXMuaW5zZXJ0RUxLZXltYXAoKSldO1xuICB9XG5cbiAgaW5zZXJ0RUxLZXltYXAoKSB7XG4gICAgcmV0dXJuIGtleW1hcC5vZihbXG4gICAgICB7XG4gICAgICAgIGtleTogJ0N0cmwtU2hpZnQtZScsXG4gICAgICAgIG1hYzogJ0NtZC1TaGlmdC1lJyxcbiAgICAgICAgcnVuKHZpZXcpIHtcbiAgICAgICAgICB2aWV3LmRpc3BhdGNoKFxuICAgICAgICAgICAgdmlldy5zdGF0ZS5jaGFuZ2VCeVJhbmdlKChyYW5nZSkgPT4gKHtcbiAgICAgICAgICAgICAgY2hhbmdlczogW3sgZnJvbTogcmFuZ2UuZnJvbSwgdG86IHJhbmdlLnRvLCBpbnNlcnQ6ICd7I30nIH1dLFxuICAgICAgICAgICAgICByYW5nZTogRWRpdG9yU2VsZWN0aW9uLnJhbmdlKHJhbmdlLmZyb20gKyAyLCByYW5nZS5mcm9tICsgMiksXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBzdGFydENvbXBsZXRpb24odmlldyk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF0pO1xuICB9XG5cbiAgYnVpbGRNZXRob2RzKHR5cGUpIHtcbiAgICBjb25zdCBtb2RlbFR5cGUgPSB0aGlzLmdldE1vZGVsVHlwZSh0eXBlKTtcbiAgICByZXR1cm4gbW9kZWxUeXBlLm1ldGhvZHMubWFwKCh7IG5hbWUsIHBhcmFtcyA9IFtdLCByZXR1cm5UeXBlIH0pID0+IHtcbiAgICAgIGNvbnN0IGNvbW1hbmQgPSBgJHtuYW1lfSgpYDtcbiAgICAgIGNvbnN0IGRpc3BsYXlQYXJhbXMgPSBwYXJhbXMubWFwKChwKSA9PiBgJHtwLnR5cGV9ICR7cC5uYW1lfWApO1xuICAgICAgY29uc3QgbGFiZWwgPSBgJHtuYW1lfSgke2Rpc3BsYXlQYXJhbXMuam9pbignLCAnKX0pYDtcbiAgICAgIGNvbnN0IGRldGFpbCA9IGByZXR1cm4gJHtyZXR1cm5UeXBlfWA7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiAnbWV0aG9kJyxcbiAgICAgICAgY29tbWFuZCxcbiAgICAgICAgYXBwbHk6ICh2aWV3LCBjb21wbGV0aW9uLCBmcm9tLCB0bykgPT4ge1xuICAgICAgICAgIGNvbnN0IGFuY2hvciA9IGZyb20gKyBuYW1lLmxlbmd0aCArIDE7XG4gICAgICAgICAgdmlldy5kaXNwYXRjaCh7XG4gICAgICAgICAgICBjaGFuZ2VzOiB7IGZyb20sIHRvLCBpbnNlcnQ6IGNvbXBsZXRpb24uY29tbWFuZCB9LFxuICAgICAgICAgICAgc2VsZWN0aW9uOiB7IGFuY2hvciB9LFxuICAgICAgICAgICAgdXNlckV2ZW50OiAnaW5wdXQuY29tcGxldGUnLFxuICAgICAgICAgICAgYW5ub3RhdGlvbnM6IHBpY2tlZENvbXBsZXRpb24ub2YodmlldyksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGxhYmVsLFxuICAgICAgICBkZXRhaWwsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgZmluZEJlc3RBdXRvY29tcGxldGVIYW5kbGVyKGNvbXBsZXRpb25Db250ZXh0KSB7XG4gICAgcmV0dXJuIHRoaXMuZXhwcmVzc2lvbkxhbmd1YWdlQ29tcGxldGlvbkhhbmRsZXJzXG4gICAgICAuZmlsdGVyKChoYW5kbGVyKSA9PiAodGhpcy5ncmFtbWFyICE9IG51bGwgJiYgaGFuZGxlci5zdXBwb3J0RUwgPT09IHRydWUpIHx8IGhhbmRsZXIuc3VwcG9ydEVMICE9PSB0cnVlKVxuICAgICAgLm1hcCgoaGFuZGxlcikgPT4ge1xuICAgICAgICBjb25zdCBtYXRjaCA9IGhhbmRsZXIuZXhwciA/IGNvbXBsZXRpb25Db250ZXh0Lm1hdGNoQmVmb3JlKGhhbmRsZXIuZXhwcikgOiB0cnVlO1xuICAgICAgICByZXR1cm4geyBoYW5kbGVyLCBtYXRjaCB9O1xuICAgICAgfSlcbiAgICAgIC5maW5kKCh7IG1hdGNoLCBleHByIH0pID0+IG1hdGNoKTtcbiAgfVxuXG4gIGdldE1vZGVsVHlwZSh0eXBlSWQpIHtcbiAgICBpZiAodGhpcy5ncmFtbWFyICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBnZXQodGhpcy5ncmFtbWFyLCBgX3R5cGVzLiR7dHlwZUlkfWApO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlzTWFwKHR5cGVJZCkge1xuICAgIHJldHVybiBbJ01hcCcsICdIdHRwSGVhZGVycycsICdNdWx0aVZhbHVlTWFwJ10uaW5jbHVkZXModHlwZUlkKTtcbiAgfVxuXG4gIGdldEVudW0odHlwZUlkKSB7XG4gICAgaWYgKHRoaXMuZ3JhbW1hciAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gZ2V0KHRoaXMuZ3JhbW1hciwgYF9lbnVtcy4ke3R5cGVJZH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIFsnJ107XG4gIH1cblxuICBjb252ZXJ0VHlwZSh0eXBlKSB7XG4gICAgaWYgKHR5cGUpIHtcbiAgICAgIGNvbnN0IGxvd2VyVHlwZSA9IHR5cGUudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChsb3dlclR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiAndGV4dCc7XG4gICAgICB9IGVsc2UgaWYgKGxvd2VyVHlwZSA9PT0gJ2h0dHBoZWFkZXJzJyB8fCBsb3dlclR5cGUgPT09ICdtdWx0aXZhbHVlbWFwJykge1xuICAgICAgICByZXR1cm4gJ3R5cGUnO1xuICAgICAgfSBlbHNlIGlmIChsb3dlclR5cGUgPT09ICdpbnQnIHx8IGxvd2VyVHlwZSA9PT0gJ2xvbmcnKSB7XG4gICAgICAgIHJldHVybiAndmFyaWFibGUnO1xuICAgICAgfSBlbHNlIGlmIChsb3dlclR5cGUuaW5jbHVkZXMoJ1tdJykpIHtcbiAgICAgICAgcmV0dXJuICdlbnVtJztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICd2YXJpYWJsZSc7XG4gIH1cblxuICBnZXQgZXhwcmVzc2lvbkxhbmd1YWdlQ29tcGxldGlvbkhhbmRsZXJzKCkge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIGV4cHI6IC97I1thLXpdKi8sXG4gICAgICAgIHN1cHBvcnRFTDogdHJ1ZSxcbiAgICAgICAgcnVuKGNvbXBsZXRpb25Db250ZXh0LCBtYXRjaCkge1xuICAgICAgICAgIGNvbnN0IHByZWZpeCA9IG1hdGNoLnRleHQucmVwbGFjZUFsbCgneyMnLCAnJyk7XG4gICAgICAgICAgY29uc3QgZnJvbSA9IGNvbXBsZXRpb25Db250ZXh0LnBvcyAtIHByZWZpeC5sZW5ndGg7XG4gICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IE9iamVjdC5rZXlzKHRoaXMuZ3JhbW1hcilcbiAgICAgICAgICAgIC5maWx0ZXIoKGNvbW1hbmQpID0+ICFjb21tYW5kLnN0YXJ0c1dpdGgoJ18nKSAmJiBjb21tYW5kLnN0YXJ0c1dpdGgocHJlZml4KSlcbiAgICAgICAgICAgIC5tYXAoKGNvbW1hbmQpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAndmFyaWFibGUnLFxuICAgICAgICAgICAgICAgIGNvbW1hbmQsXG4gICAgICAgICAgICAgICAgYXBwbHk6IGNvbW1hbmQsXG4gICAgICAgICAgICAgICAgbGFiZWw6IGNvbW1hbmQsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4geyBmcm9tLCBvcHRpb25zIH07XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBleHByOiAveyNbYS16XSouW2EtekEtWl0qLyxcbiAgICAgICAgc3VwcG9ydEVMOiB0cnVlLFxuICAgICAgICBydW4oY29tcGxldGlvbkNvbnRleHQsIG1hdGNoKSB7XG4gICAgICAgICAgY29uc3QgdG9rZW5zID0gbWF0Y2gudGV4dC5zcGxpdCgnLicpO1xuICAgICAgICAgIGNvbnN0IGtleSA9IHRva2Vuc1swXS5yZXBsYWNlQWxsKCd7IycsICcnKTtcbiAgICAgICAgICBjb25zdCBwcmVmaXggPSB0b2tlbnNbMV07XG4gICAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHRoaXMuZ3JhbW1hcltrZXldW3ByZWZpeF07XG4gICAgICAgICAgbGV0IG9wdGlvbnMgPSBbXTtcbiAgICAgICAgICBsZXQgZnJvbSA9IGNvbXBsZXRpb25Db250ZXh0LnBvcztcbiAgICAgICAgICBpZiAoY2FuZGlkYXRlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc01hcChjYW5kaWRhdGUuX3R5cGUpKSB7XG4gICAgICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLmdldEVudW0oY2FuZGlkYXRlLl90eXBlKS5tYXAoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IHRoaXMuY29udmVydFR5cGUoY2FuZGlkYXRlLl90eXBlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21tYW5kID0gYFsnJHt2YWx1ZX0nXVswXWA7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgICAgICBjb21tYW5kLFxuICAgICAgICAgICAgICAgICAgYXBwbHk6IGNvbW1hbmQsXG4gICAgICAgICAgICAgICAgICBsYWJlbDogdmFsdWUsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZyb20gLT0gcHJlZml4Lmxlbmd0aDtcbiAgICAgICAgICAgIGNhbmRpZGF0ZSA9IHRoaXMuZ3JhbW1hcltrZXldO1xuICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZS5fdHlwZSkge1xuICAgICAgICAgICAgICBvcHRpb25zID0gdGhpcy5idWlsZE1ldGhvZHMoY2FuZGlkYXRlLl90eXBlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG9wdGlvbnMgPSBPYmplY3Qua2V5cyhjYW5kaWRhdGUpXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoY29tbWFuZCkgPT4gIWNvbW1hbmQuc3RhcnRzV2l0aCgnXycpICYmIGNvbW1hbmQuc3RhcnRzV2l0aChwcmVmaXgpKVxuICAgICAgICAgICAgICAgIC5tYXAoKGNvbW1hbmQpID0+ICh7XG4gICAgICAgICAgICAgICAgICB0eXBlOiB0aGlzLmNvbnZlcnRUeXBlKGNhbmRpZGF0ZVtjb21tYW5kXS5fdHlwZSksXG4gICAgICAgICAgICAgICAgICBjb21tYW5kLFxuICAgICAgICAgICAgICAgICAgYXBwbHk6IGNvbW1hbmQsXG4gICAgICAgICAgICAgICAgICBsYWJlbDogY29tbWFuZCxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7IGZyb20sIG9wdGlvbnMgfTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGV4cHI6IC97I1thLXpdKi5bYS16QS1aXSouW2EtekEtWl0qLyxcbiAgICAgICAgc3VwcG9ydEVMOiB0cnVlLFxuICAgICAgICBydW4oY29tcGxldGlvbkNvbnRleHQsIG1hdGNoKSB7XG4gICAgICAgICAgY29uc3QgdG9rZW5zID0gbWF0Y2gudGV4dC5zcGxpdCgnLicpO1xuICAgICAgICAgIGNvbnN0IGtleSA9IHRva2Vuc1swXS5yZXBsYWNlQWxsKCd7IycsICcnKTtcbiAgICAgICAgICBjb25zdCB3b3JkID0gdG9rZW5zWzFdO1xuICAgICAgICAgIGNvbnN0IHByZWZpeCA9IHRva2Vuc1syXTtcbiAgICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB0aGlzLmdyYW1tYXJba2V5XVt3b3JkXTtcbiAgICAgICAgICBsZXQgb3B0aW9ucyA9IFtdO1xuICAgICAgICAgIGxldCBmcm9tID0gY29tcGxldGlvbkNvbnRleHQucG9zO1xuICAgICAgICAgIGlmIChjYW5kaWRhdGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzTWFwKGNhbmRpZGF0ZS5fdHlwZSkpIHtcbiAgICAgICAgICAgICAgb3B0aW9ucyA9IHRoaXMuZ2V0RW51bShjYW5kaWRhdGUuX3R5cGUpXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoY29tbWFuZCkgPT4gIWNvbW1hbmQuc3RhcnRzV2l0aCgnXycpICYmIGNvbW1hbmQuc3RhcnRzV2l0aChwcmVmaXgpKVxuICAgICAgICAgICAgICAgIC5tYXAoKGxhYmVsKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCB0eXBlID0gdGhpcy5jb252ZXJ0VHlwZShjYW5kaWRhdGUuX3R5cGUpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogYFsnJHtsYWJlbH0nXVswXWAsXG4gICAgICAgICAgICAgICAgICAgIGFwcGx5KHZpZXcsIGNvbXBsZXRpb24sIF9mcm9tLCB0bykge1xuICAgICAgICAgICAgICAgICAgICAgIGZyb20gPSBfZnJvbSAtIHByZWZpeC5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgICAgICAgIHZpZXcuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlczogeyBmcm9tLCB0bywgaW5zZXJ0OiBjb21wbGV0aW9uLmNvbW1hbmQgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogeyBhbmNob3I6IGZyb20gKyBjb21wbGV0aW9uLmNvbW1hbmQubGVuZ3RoIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyRXZlbnQ6ICdpbnB1dC5jb21wbGV0ZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uczogcGlja2VkQ29tcGxldGlvbi5vZih2aWV3KSxcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZS5fdHlwZSkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLmJ1aWxkTWV0aG9kcyhjYW5kaWRhdGUuX3R5cGUpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZyb20gLT0gcHJlZml4Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICBvcHRpb25zID0gT2JqZWN0LmtleXMoY2FuZGlkYXRlKVxuICAgICAgICAgICAgICAgICAgLmZpbHRlcigoY29tbWFuZCkgPT4gY29tbWFuZC5zdGFydHNXaXRoKHByZWZpeCkpXG4gICAgICAgICAgICAgICAgICAubWFwKChjb21tYW5kKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogdGhpcy5jb252ZXJ0VHlwZShjYW5kaWRhdGVbY29tbWFuZF0uX3R5cGUpLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQsXG4gICAgICAgICAgICAgICAgICAgICAgYXBwbHk6IGNvbW1hbmQsXG4gICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGNvbW1hbmQsXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4geyBmcm9tLCBvcHRpb25zIH07XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdGhpcy5kZWZhdWx0Q29tcGxldGlvbkhhbmRsZXIsXG4gICAgXTtcbiAgfVxufVxuXG53aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdndi1leHByZXNzaW9uLWxhbmd1YWdlJywgR3ZFeHByZXNzaW9uTGFuZ3VhZ2UpO1xuIl19
@@ -18,6 +18,7 @@ import { toSvg } from 'jdenticon';
18
18
  import { skeleton } from '../styles/skeleton';
19
19
  import { styleMap } from 'lit/directives/style-map';
20
20
  import '../atoms/gv-image';
21
+
21
22
  /**
22
23
  * Identity picture component
23
24
  *
@@ -31,36 +32,64 @@ import '../atoms/gv-image';
31
32
  *
32
33
  * @cssprop {Color} [--gv-identity-picture-notification--bgc=var(--gv-theme-color-light, #86c3d0)] - Notification background color
33
34
  */
34
-
35
35
  export class GvIdentityPicture extends LitElement {
36
36
  static get properties() {
37
37
  return {
38
- picture: {
39
- type: String
40
- },
41
- display_name: {
42
- type: String
43
- },
44
- _error: {
45
- type: Boolean,
46
- attribute: false
47
- },
48
- notification: {
49
- type: Boolean
50
- },
51
- rounded: {
52
- type: Boolean,
53
- reflect: true
54
- },
55
- skeleton: {
56
- type: Boolean
57
- }
38
+ picture: { type: String },
39
+ display_name: { type: String },
40
+ _error: { type: Boolean, attribute: false },
41
+ notification: { type: Boolean },
42
+ rounded: { type: Boolean, reflect: true },
43
+ skeleton: { type: Boolean },
58
44
  };
59
45
  }
60
46
 
61
47
  static get styles() {
62
- return [skeleton, // language=CSS
63
- css`:host{display:block;position:relative}div{text-align:center}.skeleton,svg{width:auto;height:auto;max-width:100%;max-height:100%}gv-image{width:100%;height:100%;--gv-image--of:contain}:host([rounded]) gv-image,:host([rounded]) svg{border:2px solid var(--gv-theme-neutral-color-lighter,#fafafa);border-radius:50%;box-sizing:border-box;--gv-image--of:cover}.notification{position:absolute;width:8px;height:8px;background-clip:padding-box;border-radius:50%;background-color:var(--gv-identity-picture-notification--bgc,var(--gv-theme-color-light,#86c3d0))}`];
48
+ return [
49
+ skeleton,
50
+ // language=CSS
51
+ css`
52
+ :host {
53
+ display: block;
54
+ position: relative;
55
+ }
56
+
57
+ div {
58
+ text-align: center;
59
+ }
60
+
61
+ svg,
62
+ .skeleton {
63
+ width: auto;
64
+ height: auto;
65
+ max-width: 100%;
66
+ max-height: 100%;
67
+ }
68
+
69
+ gv-image {
70
+ width: 100%;
71
+ height: 100%;
72
+ --gv-image--of: contain;
73
+ }
74
+
75
+ :host([rounded]) gv-image,
76
+ :host([rounded]) svg {
77
+ border: 2px solid var(--gv-theme-neutral-color-lighter, #fafafa);
78
+ border-radius: 50%;
79
+ box-sizing: border-box;
80
+ --gv-image--of: cover;
81
+ }
82
+
83
+ .notification {
84
+ position: absolute;
85
+ width: 8px;
86
+ height: 8px;
87
+ background-clip: padding-box;
88
+ border-radius: 50%;
89
+ background-color: var(--gv-identity-picture-notification--bgc, var(--gv-theme-color-light, #86c3d0));
90
+ }
91
+ `,
92
+ ];
64
93
  }
65
94
 
66
95
  _onError() {
@@ -86,40 +115,34 @@ export class GvIdentityPicture extends LitElement {
86
115
  }
87
116
 
88
117
  render() {
89
- const {
90
- width,
91
- height
92
- } = window.getComputedStyle(this);
93
-
118
+ const { width, height } = window.getComputedStyle(this);
94
119
  if ((!this.picture || this._error) && width && height) {
95
120
  const size = this._getMaxSize(width, height);
96
-
97
121
  const container = document.createElement('div');
98
-
99
122
  if (this.skeleton) {
100
123
  container.classList.add('skeleton');
101
124
  }
102
-
103
125
  container.title = this.display_name;
104
- container.innerHTML = toSvg(this.display_name, size, {
105
- backColor: '#FFF'
106
- });
107
-
126
+ container.innerHTML = toSvg(this.display_name, size, { backColor: '#FFF' });
108
127
  if (this.notification) {
109
128
  const notification = document.createElement('span');
110
129
  notification.className = 'notification';
111
130
  notification.style.left = width;
112
131
  container.appendChild(notification);
113
132
  }
114
-
115
133
  return html`${container}`;
116
134
  }
117
-
118
- return html` <gv-image src="${this.picture}" alt="${this.display_name}" title="${this.display_name}" @error="${this._onError}" @gv-image:loaded="${this._onLoaded}"></gv-image> ${this.notification ? html`<span class="notification" style="${styleMap({
119
- left: width
120
- })}"></span>` : ''} `;
135
+ return html`
136
+ <gv-image
137
+ src="${this.picture}"
138
+ alt="${this.display_name}"
139
+ title="${this.display_name}"
140
+ @error="${this._onError}"
141
+ @gv-image:loaded="${this._onLoaded}"
142
+ ></gv-image>
143
+ ${this.notification ? html`<span class="notification" style="${styleMap({ left: width })}"></span>` : ''}
144
+ `;
121
145
  }
122
-
123
146
  }
147
+
124
148
  window.customElements.define('gv-identity-picture', GvIdentityPicture);
125
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4vbm9kZV9tb2R1bGVzL0BncmF2aXRlZS91aS1jb21wb25lbnRzL21vbGVjdWxlcy9ndi1pZGVudGl0eS1waWN0dXJlLmpzIl0sIm5hbWVzIjpbImNzcyIsIkxpdEVsZW1lbnQiLCJodG1sIiwidG9TdmciLCJza2VsZXRvbiIsInN0eWxlTWFwIiwiR3ZJZGVudGl0eVBpY3R1cmUiLCJwcm9wZXJ0aWVzIiwicGljdHVyZSIsInR5cGUiLCJTdHJpbmciLCJkaXNwbGF5X25hbWUiLCJfZXJyb3IiLCJCb29sZWFuIiwiYXR0cmlidXRlIiwibm90aWZpY2F0aW9uIiwicm91bmRlZCIsInJlZmxlY3QiLCJzdHlsZXMiLCJfb25FcnJvciIsIl90b051bWJlciIsInNpemUiLCJwYXJzZUludCIsInJlcGxhY2UiLCJfb25Mb2FkZWQiLCJfZ2V0TWF4U2l6ZSIsIndpZHRoIiwiaGVpZ2h0IiwiTWF0aCIsIm1pbiIsInVwZGF0ZWQiLCJoYXMiLCJyZW5kZXIiLCJ3aW5kb3ciLCJnZXRDb21wdXRlZFN0eWxlIiwiY29udGFpbmVyIiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NMaXN0IiwiYWRkIiwidGl0bGUiLCJpbm5lckhUTUwiLCJiYWNrQ29sb3IiLCJjbGFzc05hbWUiLCJzdHlsZSIsImxlZnQiLCJhcHBlbmRDaGlsZCIsImN1c3RvbUVsZW1lbnRzIiwiZGVmaW5lIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTQSxHQUFULEVBQWNDLFVBQWQsRUFBMEJDLElBQTFCLFFBQXNDLEtBQXRDO0FBQ0EsU0FBU0MsS0FBVCxRQUFzQixXQUF0QjtBQUNBLFNBQVNDLFFBQVQsUUFBeUIsb0JBQXpCO0FBQ0EsU0FBU0MsUUFBVCxRQUF5QiwwQkFBekI7QUFDQSxPQUFPLG1CQUFQO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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LFFBQUFBLFlBQVksQ0FBQzZCLEtBQWIsQ0FBbUJDLElBQW5CLEdBQTBCbkIsS0FBMUI7QUFDQVMsUUFBQUEsU0FBUyxDQUFDVyxXQUFWLENBQXNCL0IsWUFBdEI7QUFDRDs7QUFDRCxhQUFPYixJQUFJLEdBQUdpQyxTQUFILEVBQVg7QUFDRDs7QUFDRCxXQUFPakMsSUFBSSxtQkFFQSxLQUFLTSxPQUZMLFVBR0EsS0FBS0csWUFITCxZQUlFLEtBQUtBLFlBSlAsYUFLRyxLQUFLUSxRQUxSLHVCQU1hLEtBQUtLLFNBTmxCLGlCQVFQLEtBQUtULFlBQUwsR0FBb0JiLElBQUkscUNBQXFDRyxRQUFRLENBQUM7QUFBRXdDLE1BQUFBLElBQUksRUFBRW5CO0FBQVIsS0FBRCxDQUE3QyxXQUF4QixHQUFvRyxFQVI3RixHQUFYO0FBVUQ7O0FBOUcrQztBQWlIbERPLE1BQU0sQ0FBQ2MsY0FBUCxDQUFzQkMsTUFBdEIsQ0FBNkIscUJBQTdCLEVBQW9EMUMsaUJBQXBEIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgR3Jhdml0ZWUgdGVhbSAoaHR0cDovL2dyYXZpdGVlLmlvKVxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IGNzcywgTGl0RWxlbWVudCwgaHRtbCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyB0b1N2ZyB9IGZyb20gJ2pkZW50aWNvbic7XG5pbXBvcnQgeyBza2VsZXRvbiB9IGZyb20gJy4uL3N0eWxlcy9za2VsZXRvbic7XG5pbXBvcnQgeyBzdHlsZU1hcCB9IGZyb20gJ2xpdC9kaXJlY3RpdmVzL3N0eWxlLW1hcCc7XG5pbXBvcnQgJy4uL2F0b21zL2d2LWltYWdlJztcblxuLyoqXG4gKiBJZGVudGl0eSBwaWN0dXJlIGNvbXBvbmVudFxuICpcbiAqICMjIERldGFpbHNcbiAqICogaGFzIEB0aGVtZSBmYWNldFxuICpcbiAqIEBhdHRyIHtTdHJpbmd9IHBpY3R1cmUgLSB0aGUgcGljdHVyZVxuICogQGF0dHIge1N0cmluZ30gZGlzcGxheV9uYW1lIC0gdGhlIGRpc3BsYXlfbmFtZSBvZiB0aGUgcGljdHVyZVxuICogQGF0dHIge0Jvb2xlYW59IG5vdGlmaWNhdGlvbiAtIHRydWUgdG8gZGlzcGxheSBhIG5vdGlmaWNhdGlvbiBpbmZvXG4gKiBAYXR0ciB7Qm9vbGVhbn0gcm91bmRlZCAtIHRydWUgZm9yIHJvdW5kZWQgaW1hZ2UvaWNvblxuICpcbiAqIEBjc3Nwcm9wIHtDb2xvcn0gWy0tZ3YtaWRlbnRpdHktcGljdHVyZS1ub3RpZmljYXRpb24tLWJnYz12YXIoLS1ndi10aGVtZS1jb2xvci1saWdodCwgIzg2YzNkMCldIC0gTm90aWZpY2F0aW9uIGJhY2tncm91bmQgY29sb3JcbiAqL1xuZXhwb3J0IGNsYXNzIEd2SWRlbnRpdHlQaWN0dXJlIGV4dGVuZHMgTGl0RWxlbWVudCB7XG4gIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGljdHVyZTogeyB0eXBlOiBTdHJpbmcgfSxcbiAgICAgIGRpc3BsYXlfbmFtZTogeyB0eXBlOiBTdHJpbmcgfSxcbiAgICAgIF9lcnJvcjogeyB0eXBlOiBCb29sZWFuLCBhdHRyaWJ1dGU6IGZhbHNlIH0sXG4gICAgICBub3RpZmljYXRpb246IHsgdHlwZTogQm9vbGVhbiB9LFxuICAgICAgcm91bmRlZDogeyB0eXBlOiBCb29sZWFuLCByZWZsZWN0OiB0cnVlIH0sXG4gICAgICBza2VsZXRvbjogeyB0eXBlOiBCb29sZWFuIH0sXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQgc3R5bGVzKCkge1xuICAgIHJldHVybiBbXG4gICAgICBza2VsZXRvbixcbiAgICAgIC8vIGxhbmd1YWdlPUNTU1xuICAgICAgY3NzYFxuICAgICAgICA6aG9zdCB7XG4gICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICB9XG5cbiAgICAgICAgZGl2IHtcbiAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICAgIH1cblxuICAgICAgICBzdmcsXG4gICAgICAgIC5za2VsZXRvbiB7XG4gICAgICAgICAgd2lkdGg6IGF1dG87XG4gICAgICAgICAgaGVpZ2h0OiBhdXRvO1xuICAgICAgICAgIG1heC13aWR0aDogMTAwJTtcbiAgICAgICAgICBtYXgtaGVpZ2h0OiAxMDAlO1xuICAgICAgICB9XG5cbiAgICAgICAgZ3YtaW1hZ2Uge1xuICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgICAtLWd2LWltYWdlLS1vZjogY29udGFpbjtcbiAgICAgICAgfVxuXG4gICAgICAgIDpob3N0KFtyb3VuZGVkXSkgZ3YtaW1hZ2UsXG4gICAgICAgIDpob3N0KFtyb3VuZGVkXSkgc3ZnIHtcbiAgICAgICAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1ndi10aGVtZS1uZXV0cmFsLWNvbG9yLWxpZ2h0ZXIsICNmYWZhZmEpO1xuICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIC0tZ3YtaW1hZ2UtLW9mOiBjb3ZlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIC5ub3RpZmljYXRpb24ge1xuICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICB3aWR0aDogOHB4O1xuICAgICAgICAgIGhlaWdodDogOHB4O1xuICAgICAgICAgIGJhY2tncm91bmQtY2xpcDogcGFkZGluZy1ib3g7XG4gICAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWd2LWlkZW50aXR5LXBpY3R1cmUtbm90aWZpY2F0aW9uLS1iZ2MsIHZhcigtLWd2LXRoZW1lLWNvbG9yLWxpZ2h0LCAjODZjM2QwKSk7XG4gICAgICAgIH1cbiAgICAgIGAsXG4gICAgXTtcbiAgfVxuXG4gIF9vbkVycm9yKCkge1xuICAgIHRoaXMuX2Vycm9yID0gdHJ1ZTtcbiAgfVxuXG4gIF90b051bWJlcihzaXplKSB7XG4gICAgcmV0dXJuIHBhcnNlSW50KHNpemUucmVwbGFjZSgncHgnLCAnJyksIDEwKTtcbiAgfVxuXG4gIF9vbkxvYWRlZCgpIHtcbiAgICB0aGlzLl9lcnJvciA9IGZhbHNlO1xuICB9XG5cbiAgX2dldE1heFNpemUod2lkdGgsIGhlaWdodCkge1xuICAgIHJldHVybiBNYXRoLm1pbih0aGlzLl90b051bWJlcih3aWR0aCksIHRoaXMuX3RvTnVtYmVyKGhlaWdodCkpO1xuICB9XG5cbiAgdXBkYXRlZChwcm9wZXJ0aWVzKSB7XG4gICAgaWYgKHByb3BlcnRpZXMuaGFzKCdwaWN0dXJlJykpIHtcbiAgICAgIHRoaXMuX2Vycm9yID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyKCkge1xuICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcyk7XG4gICAgaWYgKCghdGhpcy5waWN0dXJlIHx8IHRoaXMuX2Vycm9yKSAmJiB3aWR0aCAmJiBoZWlnaHQpIHtcbiAgICAgIGNvbnN0IHNpemUgPSB0aGlzLl9nZXRNYXhTaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBpZiAodGhpcy5za2VsZXRvbikge1xuICAgICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgnc2tlbGV0b24nKTtcbiAgICAgIH1cbiAgICAgIGNvbnRhaW5lci50aXRsZSA9IHRoaXMuZGlzcGxheV9uYW1lO1xuICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IHRvU3ZnKHRoaXMuZGlzcGxheV9uYW1lLCBzaXplLCB7IGJhY2tDb2xvcjogJyNGRkYnIH0pO1xuICAgICAgaWYgKHRoaXMubm90aWZpY2F0aW9uKSB7XG4gICAgICAgIGNvbnN0IG5vdGlmaWNhdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgbm90aWZpY2F0aW9uLmNsYXNzTmFtZSA9ICdub3RpZmljYXRpb24nO1xuICAgICAgICBub3RpZmljYXRpb24uc3R5bGUubGVmdCA9IHdpZHRoO1xuICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQobm90aWZpY2F0aW9uKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBodG1sYCR7Y29udGFpbmVyfWA7XG4gICAgfVxuICAgIHJldHVybiBodG1sYFxuICAgICAgPGd2LWltYWdlXG4gICAgICAgIHNyYz1cIiR7dGhpcy5waWN0dXJlfVwiXG4gICAgICAgIGFsdD1cIiR7dGhpcy5kaXNwbGF5X25hbWV9XCJcbiAgICAgICAgdGl0bGU9XCIke3RoaXMuZGlzcGxheV9uYW1lfVwiXG4gICAgICAgIEBlcnJvcj1cIiR7dGhpcy5fb25FcnJvcn1cIlxuICAgICAgICBAZ3YtaW1hZ2U6bG9hZGVkPVwiJHt0aGlzLl9vbkxvYWRlZH1cIlxuICAgICAgPjwvZ3YtaW1hZ2U+XG4gICAgICAke3RoaXMubm90aWZpY2F0aW9uID8gaHRtbGA8c3BhbiBjbGFzcz1cIm5vdGlmaWNhdGlvblwiIHN0eWxlPVwiJHtzdHlsZU1hcCh7IGxlZnQ6IHdpZHRoIH0pfVwiPjwvc3Bhbj5gIDogJyd9XG4gICAgYDtcbiAgfVxufVxuXG53aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdndi1pZGVudGl0eS1waWN0dXJlJywgR3ZJZGVudGl0eVBpY3R1cmUpO1xuIl19