@gravitee/ui-components 3.25.2 → 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
@@ -33,7 +33,9 @@ import { empty } from '../styles/empty';
33
33
  import { cache } from 'lit/directives/cache';
34
34
  import { deepClone, deepEqual } from '../lib/utils';
35
35
  import { KeyboardElement, KEYS } from '../mixins/keyboard-element';
36
+
36
37
  const FLOW_STEP_FORM_ID = 'flow-step-form';
38
+
37
39
  /**
38
40
  * Studio Policy component
39
41
  *
@@ -68,171 +70,274 @@ const FLOW_STEP_FORM_ID = 'flow-step-form';
68
70
  * @attr {Object} debugResponse - true if debug tab should be displayed
69
71
  * @attr {Boolean} has-conditional-steps - true if steps can be conditioned
70
72
  */
71
-
72
73
  export class GvPolicyStudio extends KeyboardElement(LitElement) {
73
74
  static get properties() {
74
75
  return {
75
- policies: {
76
- type: Array
77
- },
78
- services: {
79
- type: Object
80
- },
81
- resourceTypes: {
82
- type: Array,
83
- attribute: 'resource-types'
84
- },
85
- propertyProviders: {
86
- type: Array,
87
- attribute: 'property-providers'
88
- },
89
- dynamicPropertySchema: {
90
- type: Object,
91
- attribute: 'dynamic-property-schema'
92
- },
93
- tabId: {
94
- type: String,
95
- attribute: 'tab-id'
96
- },
97
- _tabId: {
98
- type: String,
99
- attribute: false
100
- },
101
- definition: {
102
- type: Object
103
- },
104
- _definition: {
105
- type: Object,
106
- attribute: false
107
- },
108
- documentation: {
109
- type: Object
110
- },
111
- flowSchema: {
112
- type: Object,
113
- attribute: 'flow-schema'
114
- },
115
- configurationSchema: {
116
- type: Object,
117
- attribute: 'configuration-schema'
118
- },
119
- _configurationSchema: {
120
- type: Object,
121
- attribute: false
122
- },
123
- configurationInformation: {
124
- type: String,
125
- attribute: 'configuration-information'
126
- },
127
- isDirty: {
128
- type: Boolean,
129
- attribute: 'dirty',
130
- reflect: true
131
- },
132
- _dragPolicy: {
133
- type: Object,
134
- attribute: false
135
- },
136
- _dropPolicy: {
137
- type: Object,
138
- attribute: false
139
- },
140
- selectedFlowsId: {
141
- type: Array,
142
- attribute: 'selected-flows-id'
143
- },
144
- _selectedFlowsId: {
145
- type: Array,
146
- attribute: false
147
- },
148
- _currentPolicyId: {
149
- type: String,
150
- attribute: false
151
- },
152
- _searchPolicyQuery: {
153
- type: String,
154
- attribute: false
155
- },
156
- _searchFlowQuery: {
157
- type: String,
158
- attribute: false
159
- },
160
- _flowStepSchema: {
161
- type: Object,
162
- attribute: false
163
- },
164
- _currentFlowStep: {
165
- type: Object,
166
- attribute: false
167
- },
168
- _policyFilter: {
169
- type: Array,
170
- attribute: false
171
- },
172
- _flowFilter: {
173
- type: Array,
174
- attribute: false
175
- },
176
- _currentAskConfirmation: {
177
- type: Boolean,
178
- attribute: false
179
- },
180
- hasProperties: {
181
- type: Boolean,
182
- attribute: 'has-properties'
183
- },
184
- _hasProperties: {
185
- type: Boolean,
186
- attribute: false
187
- },
188
- hasResources: {
189
- type: Boolean,
190
- attribute: 'has-resources'
191
- },
192
- hasPolicyFilter: {
193
- type: Boolean,
194
- attribute: 'has-policy-filter'
195
- },
196
- flowsTitle: {
197
- type: String,
198
- attribute: 'flows-title'
199
- },
200
- sortable: {
201
- type: Boolean
202
- },
203
- canAdd: {
204
- type: Boolean,
205
- attribute: 'can-add'
206
- },
207
- readonly: {
208
- type: Boolean
209
- },
210
- readonlyPlans: {
211
- type: Boolean,
212
- attribute: 'readonly-plans'
213
- },
214
- canDebug: {
215
- type: Boolean,
216
- attribute: 'can-debug'
217
- },
218
- _canDebug: {
219
- type: Boolean,
220
- attribute: false
221
- },
222
- debugResponse: {
223
- type: Object,
224
- attribute: 'debug-response'
225
- },
226
- hasConditionalSteps: {
227
- type: Boolean,
228
- attribute: 'has-conditional-steps'
229
- }
76
+ policies: { type: Array },
77
+ services: { type: Object },
78
+ resourceTypes: { type: Array, attribute: 'resource-types' },
79
+ propertyProviders: { type: Array, attribute: 'property-providers' },
80
+ dynamicPropertySchema: { type: Object, attribute: 'dynamic-property-schema' },
81
+ tabId: { type: String, attribute: 'tab-id' },
82
+ _tabId: { type: String, attribute: false },
83
+ definition: { type: Object },
84
+ _definition: { type: Object, attribute: false },
85
+ documentation: { type: Object },
86
+ flowSchema: { type: Object, attribute: 'flow-schema' },
87
+ configurationSchema: { type: Object, attribute: 'configuration-schema' },
88
+ _configurationSchema: { type: Object, attribute: false },
89
+ configurationInformation: { type: String, attribute: 'configuration-information' },
90
+ isDirty: { type: Boolean, attribute: 'dirty', reflect: true },
91
+ _dragPolicy: { type: Object, attribute: false },
92
+ _dropPolicy: { type: Object, attribute: false },
93
+ selectedFlowsId: { type: Array, attribute: 'selected-flows-id' },
94
+ _selectedFlowsId: { type: Array, attribute: false },
95
+ _currentPolicyId: { type: String, attribute: false },
96
+ _searchPolicyQuery: { type: String, attribute: false },
97
+ _searchFlowQuery: { type: String, attribute: false },
98
+ _flowStepSchema: { type: Object, attribute: false },
99
+ _currentFlowStep: { type: Object, attribute: false },
100
+ _policyFilter: { type: Array, attribute: false },
101
+ _flowFilter: { type: Array, attribute: false },
102
+ _currentAskConfirmation: { type: Boolean, attribute: false },
103
+ hasProperties: { type: Boolean, attribute: 'has-properties' },
104
+ _hasProperties: { type: Boolean, attribute: false },
105
+ hasResources: { type: Boolean, attribute: 'has-resources' },
106
+ hasPolicyFilter: { type: Boolean, attribute: 'has-policy-filter' },
107
+ flowsTitle: { type: String, attribute: 'flows-title' },
108
+ sortable: { type: Boolean },
109
+ canAdd: { type: Boolean, attribute: 'can-add' },
110
+ readonly: { type: Boolean },
111
+ readonlyPlans: { type: Boolean, attribute: 'readonly-plans' },
112
+ canDebug: { type: Boolean, attribute: 'can-debug' },
113
+ _canDebug: { type: Boolean, attribute: false },
114
+ debugResponse: { type: Object, attribute: 'debug-response' },
115
+ hasConditionalSteps: { type: Boolean, attribute: 'has-conditional-steps' },
230
116
  };
231
117
  }
232
118
 
233
119
  static get styles() {
234
- return [empty, methods, // language=CSS
235
- css`:host{box-sizing:border-box;--height:var(--gv-policy-studio--h, calc(100vh - 32px));height:var(--height);--height-in-tabs:calc(var(--height) - 25px)}.box{height:var(--height);display:flex}.design,.properties{display:flex}gv-resizable-views{width:100%}.editable-name{padding:.5rem 1rem;font-size:16px}.editable-name span{color:#bfbfbf;font-size:12px}.form__control{margin:.5rem}gv-input{width:100%}.flow-name{display:flex;align-items:center}.flow-name.dirty{font-style:italic;opacity:.8}.flow-name gv-icon{--gv-icon--s:24px;margin-right:.2rem}.flow-path{margin-left:.2rem}.title_methods{margin-left:.5rem}.two-cols{display:flex;width:100%;height:100%}.two-cols>*{flex:1}.left-menu{border-left:1px solid #d9d9d9;height:var(--height-in-tabs)}.right-menu{border-right:1px solid #d9d9d9;height:var(--height-in-tabs)}.two-cols>:first-child{border-right:1px solid #d9d9d9}.flow-step__container{overflow:hidden;position:relative;overflow:hidden;height:99%}.flow-step__form{padding:0 .5rem;overflow:auto}.flow-step__form-title{text-transform:uppercase;letter-spacing:.2rem}gv-tabs{width:100%;height:100%;display:inline-block}gv-properties,gv-resizable-views,gv-resources{height:var(--height-in-tabs)}gv-properties,gv-resources{width:100%}gv-properties.properties{--gv-properties-table--colmg:10px}.api-settings{display:flex;flex-direction:column;border-left:1px solid #bfbfbf;height:var(--height-in-tabs)}.debug{display:flex;flex-direction:column;border-left:1px solid #bfbfbf;height:var(--height-in-tabs)}.api-settings-information{display:flex;align-items:center}.api-settings-information__icon{--gv-icon--c:var(--gv-theme-color, #5a7684);--gv-icon-opacity--c:var(--gv-theme-color-info-light, #64b5f6)}.api-settings-information__blockquote,.debug-information__blockquote{border-left:1px solid var(--gv-theme-color,#5a7684);margin:15px;padding-left:15px;font-size:14px}.flow-settings gv-schema-form{flex:1;padding:.5rem}.search{display:flex;justify-content:stretch}gv-input{margin:.2rem 0;width:100%}.header-actions,.search-policies{display:flex;flex-direction:column;align-items:center;margin:.5rem}.search-policies{margin:1.5rem .5rem .5rem}.footer-actions>gv-button.btn-large,.footer-actions>gv-option{width:100%}.footer-actions{display:flex;flex-direction:column;align-items:center;padding:.5rem 0;margin:.5rem 15px;border-top:1px solid #bfbfbf}.header-actions .title{text-transform:uppercase;text-align:center;letter-spacing:.3rem;color:#bfbfbf;font-size:18px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:240px;min-height:25px}.header-actions>*,.search-policies>*{margin-bottom:1rem}`];
120
+ return [
121
+ empty,
122
+ methods,
123
+ // language=CSS
124
+ css`
125
+ :host {
126
+ box-sizing: border-box;
127
+ --height: var(--gv-policy-studio--h, calc(100vh - 32px));
128
+ height: var(--height);
129
+ --height-in-tabs: calc(var(--height) - 25px);
130
+ }
131
+
132
+ .box {
133
+ height: var(--height);
134
+ display: flex;
135
+ }
136
+
137
+ .design,
138
+ .properties {
139
+ display: flex;
140
+ }
141
+
142
+ gv-resizable-views {
143
+ width: 100%;
144
+ }
145
+
146
+ .editable-name {
147
+ padding: 0.5rem 1rem;
148
+ font-size: 16px;
149
+ }
150
+
151
+ .editable-name span {
152
+ color: #bfbfbf;
153
+ font-size: 12px;
154
+ }
155
+
156
+ .form__control {
157
+ margin: 0.5rem;
158
+ }
159
+
160
+ gv-input {
161
+ width: 100%;
162
+ }
163
+
164
+ .flow-name {
165
+ display: flex;
166
+ align-items: center;
167
+ }
168
+
169
+ .flow-name.dirty {
170
+ font-style: italic;
171
+ opacity: 0.8;
172
+ }
173
+
174
+ .flow-name gv-icon {
175
+ --gv-icon--s: 24px;
176
+ margin-right: 0.2rem;
177
+ }
178
+
179
+ .flow-path {
180
+ margin-left: 0.2rem;
181
+ }
182
+
183
+ .title_methods {
184
+ margin-left: 0.5rem;
185
+ }
186
+
187
+ .two-cols {
188
+ display: flex;
189
+ width: 100%;
190
+ height: 100%;
191
+ }
192
+
193
+ .two-cols > * {
194
+ flex: 1;
195
+ }
196
+
197
+ .left-menu {
198
+ border-left: 1px solid #d9d9d9;
199
+ height: var(--height-in-tabs);
200
+ }
201
+
202
+ .right-menu {
203
+ border-right: 1px solid #d9d9d9;
204
+ height: var(--height-in-tabs);
205
+ }
206
+
207
+ .two-cols > *:first-child {
208
+ border-right: 1px solid #d9d9d9;
209
+ }
210
+
211
+ .flow-step__container {
212
+ overflow: hidden;
213
+ position: relative;
214
+ overflow: hidden;
215
+ height: 99%;
216
+ }
217
+
218
+ .flow-step__form {
219
+ padding: 0 0.5rem;
220
+ overflow: auto;
221
+ }
222
+
223
+ .flow-step__form-title {
224
+ text-transform: uppercase;
225
+ letter-spacing: 0.2rem;
226
+ }
227
+
228
+ gv-tabs {
229
+ width: 100%;
230
+ height: 100%;
231
+ display: inline-block;
232
+ }
233
+
234
+ gv-resizable-views,
235
+ gv-properties,
236
+ gv-resources {
237
+ height: var(--height-in-tabs);
238
+ }
239
+
240
+ gv-properties,
241
+ gv-resources {
242
+ width: 100%;
243
+ }
244
+
245
+ gv-properties.properties {
246
+ --gv-properties-table--colmg: 10px;
247
+ }
248
+
249
+ .api-settings {
250
+ display: flex;
251
+ flex-direction: column;
252
+ border-left: 1px solid #bfbfbf;
253
+ height: var(--height-in-tabs);
254
+ }
255
+
256
+ .debug {
257
+ display: flex;
258
+ flex-direction: column;
259
+ border-left: 1px solid #bfbfbf;
260
+ height: var(--height-in-tabs);
261
+ }
262
+
263
+ .api-settings-information {
264
+ display: flex;
265
+ align-items: center;
266
+ }
267
+
268
+ .api-settings-information__icon {
269
+ --gv-icon--c: var(--gv-theme-color, #5a7684);
270
+ --gv-icon-opacity--c: var(--gv-theme-color-info-light, #64b5f6);
271
+ }
272
+
273
+ .api-settings-information__blockquote,
274
+ .debug-information__blockquote {
275
+ border-left: 1px solid var(--gv-theme-color, #5a7684);
276
+ margin: 15px;
277
+ padding-left: 15px;
278
+ font-size: 14px;
279
+ }
280
+
281
+ .flow-settings gv-schema-form {
282
+ flex: 1;
283
+ padding: 0.5rem;
284
+ }
285
+
286
+ .search {
287
+ display: flex;
288
+ justify-content: stretch;
289
+ }
290
+
291
+ gv-input {
292
+ margin: 0.2rem 0;
293
+ width: 100%;
294
+ }
295
+
296
+ .header-actions,
297
+ .search-policies {
298
+ display: flex;
299
+ flex-direction: column;
300
+ align-items: center;
301
+ margin: 0.5rem;
302
+ }
303
+
304
+ .search-policies {
305
+ margin: 1.5rem 0.5rem 0.5rem;
306
+ }
307
+
308
+ .footer-actions > gv-button.btn-large,
309
+ .footer-actions > gv-option {
310
+ width: 100%;
311
+ }
312
+
313
+ .footer-actions {
314
+ display: flex;
315
+ flex-direction: column;
316
+ align-items: center;
317
+ padding: 0.5rem 0;
318
+ margin: 0.5rem 15px;
319
+ border-top: 1px solid #bfbfbf;
320
+ }
321
+
322
+ .header-actions .title {
323
+ text-transform: uppercase;
324
+ text-align: center;
325
+ letter-spacing: 0.3rem;
326
+ color: #bfbfbf;
327
+ font-size: 18px;
328
+ white-space: nowrap;
329
+ overflow: hidden;
330
+ text-overflow: ellipsis;
331
+ width: 240px;
332
+ min-height: 25px;
333
+ }
334
+
335
+ .header-actions > *,
336
+ .search-policies > * {
337
+ margin-bottom: 1rem;
338
+ }
339
+ `,
340
+ ];
236
341
  }
237
342
 
238
343
  constructor() {
@@ -246,13 +351,9 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
246
351
  this.sortable = false;
247
352
  this.services = {};
248
353
  this._definition = {
249
- flows: []
354
+ flows: [],
250
355
  };
251
- this._tabs = [{
252
- id: 'design',
253
- title: 'Design',
254
- icon: 'navigation:exchange'
255
- }];
356
+ this._tabs = [{ id: 'design', title: 'Design', icon: 'navigation:exchange' }];
256
357
  this._policyFilter = [];
257
358
  this._flowFilter = [];
258
359
  }
@@ -260,15 +361,10 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
260
361
  set hasProperties(value) {
261
362
  if (value) {
262
363
  import('../organisms/gv-properties').then(() => {
263
- this._tabs = [...this._tabs, {
264
- id: 'properties',
265
- title: 'Properties',
266
- icon: 'general:settings#1'
267
- }];
364
+ this._tabs = [...this._tabs, { id: 'properties', title: 'Properties', icon: 'general:settings#1' }];
268
365
  this.requestUpdate();
269
366
  });
270
367
  }
271
-
272
368
  this._hasProperties = value;
273
369
  }
274
370
 
@@ -279,11 +375,7 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
279
375
  set hasResources(value) {
280
376
  if (value) {
281
377
  import('../organisms/gv-resources').then(() => {
282
- this._tabs = [...this._tabs, {
283
- id: 'resources',
284
- title: 'Resources',
285
- icon: 'general:settings#5'
286
- }];
378
+ this._tabs = [...this._tabs, { id: 'resources', title: 'Resources', icon: 'general:settings#5' }];
287
379
  this.requestUpdate();
288
380
  });
289
381
  }
@@ -291,49 +383,31 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
291
383
 
292
384
  set canDebug(value) {
293
385
  if (value) {
294
- this._tabs = [...this._tabs, {
295
- id: 'debug',
296
- title: 'Try it',
297
- icon: 'content:send'
298
- }];
386
+ this._tabs = [...this._tabs, { id: 'debug', title: 'Try it', icon: 'content:send' }];
299
387
  }
300
388
  }
301
389
 
302
390
  get _flowFilterOptions() {
303
391
  if (this.definedPlans.length > 0) {
304
- return [{
305
- id: 'api',
306
- title: 'Api',
307
- icon: 'shopping:box#3'
308
- }, {
309
- id: 'plan',
310
- title: 'Plans',
311
- icon: 'shopping:sale#2'
312
- }];
392
+ return [
393
+ { id: 'api', title: 'Api', icon: 'shopping:box#3' },
394
+ { id: 'plan', title: 'Plans', icon: 'shopping:sale#2' },
395
+ ];
313
396
  }
314
397
  }
315
398
 
316
399
  set hasPolicyFilter(value) {
317
400
  if (value) {
318
- this._policyFilterOptions = [{
319
- id: 'onRequest',
320
- title: 'Request',
321
- icon: 'navigation:arrow-from-left'
322
- }, {
323
- id: 'onResponse',
324
- title: 'Response',
325
- icon: 'navigation:arrow-from-right'
326
- }];
401
+ this._policyFilterOptions = [
402
+ { id: 'onRequest', title: 'Request', icon: 'navigation:arrow-from-left' },
403
+ { id: 'onResponse', title: 'Response', icon: 'navigation:arrow-from-right' },
404
+ ];
327
405
  }
328
406
  }
329
407
 
330
408
  set configurationSchema(value) {
331
409
  if (value) {
332
- this._tabs.splice(1, 0, {
333
- id: 'settings',
334
- title: 'Configuration',
335
- icon: 'general:settings#2'
336
- });
410
+ this._tabs.splice(1, 0, { id: 'settings', title: 'Configuration', icon: 'general:settings#2' });
337
411
  }
338
412
 
339
413
  this._configurationSchema = value;
@@ -347,13 +421,11 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
347
421
  if (this._currentAskConfirmation == null) {
348
422
  if (this.isPressed(KEYS.Shift, KEYS.Ctrl, KEYS.Space)) {
349
423
  const search = this.shadowRoot.querySelector('#search-policy');
350
-
351
424
  if (search) {
352
425
  search.focus();
353
426
  }
354
427
  } else if (this.isPressed(KEYS.Ctrl, KEYS.Space)) {
355
428
  const search = this.shadowRoot.querySelector('#search-flow');
356
-
357
429
  if (search) {
358
430
  search.focus();
359
431
  }
@@ -376,22 +448,16 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
376
448
  set definition(definition) {
377
449
  if (definition) {
378
450
  const flows = this._generateFlowsId(definition.flows);
379
-
380
451
  const resources = this._generateId('resource-', definition.resources);
381
-
382
- const plans = definition.plans == null ? [] : definition.plans.map(plan => {
383
- return { ...plan,
384
- flows: this._generatePlanFlowsId(plan)
385
- };
386
- });
387
- this._initialDefinition = { ...definition,
388
- flows,
389
- resources,
390
- plans
391
- };
452
+ const plans =
453
+ definition.plans == null
454
+ ? []
455
+ : definition.plans.map((plan) => {
456
+ return { ...plan, flows: this._generatePlanFlowsId(plan) };
457
+ });
458
+ this._initialDefinition = { ...definition, flows, resources, plans };
392
459
  this._definition = deepClone(this._initialDefinition);
393
460
  this.isDirty = false;
394
-
395
461
  this._selectFirstFlow();
396
462
  }
397
463
  }
@@ -402,8 +468,7 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
402
468
 
403
469
  set selectedFlowsId(selectedFlowsId) {
404
470
  if (selectedFlowsId != null && Array.isArray(selectedFlowsId)) {
405
- this._selectedFlowsId = selectedFlowsId.filter(id => this._findFlowById(id) != null);
406
-
471
+ this._selectedFlowsId = selectedFlowsId.filter((id) => this._findFlowById(id) != null);
407
472
  if (selectedFlowsId.length !== this._selectedFlowsId.length) {
408
473
  this._selectFirstFlow(true);
409
474
  }
@@ -411,30 +476,25 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
411
476
  }
412
477
 
413
478
  get selectedFlowsId() {
414
- return this._selectedFlowsId.filter(id => this._findFlowById(id) != null);
479
+ return this._selectedFlowsId.filter((id) => this._findFlowById(id) != null);
415
480
  }
416
481
 
417
482
  _updateSelectedFlows(selectedFlowsId) {
418
483
  this.selectedFlowsId = selectedFlowsId;
419
- dispatchCustomEvent(this, 'select-flows', {
420
- flows: this.selectedFlowsId
421
- });
484
+ dispatchCustomEvent(this, 'select-flows', { flows: this.selectedFlowsId });
422
485
  }
423
486
 
424
487
  _selectFirstFlow(dispatch = false) {
425
488
  if (this.selectedFlowsId.length === 0) {
426
489
  let candidate = null;
427
-
428
490
  if (this.definedFlows.length > 0 && this.definedFlows[0]._id != null) {
429
491
  candidate = this.definedFlows[0];
430
492
  } else if (this.definedPlans.length > 0) {
431
- const plan = this.definedPlans.find(plan => plan.flows != null && plan.flows.length > 0 && plan.flows[0]._id != null);
432
-
493
+ const plan = this.definedPlans.find((plan) => plan.flows != null && plan.flows.length > 0 && plan.flows[0]._id != null);
433
494
  if (plan) {
434
495
  candidate = plan.flows[0];
435
496
  }
436
497
  }
437
-
438
498
  if (candidate != null) {
439
499
  if (dispatch) {
440
500
  this._updateSelectedFlows([candidate._id]);
@@ -450,58 +510,45 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
450
510
  }
451
511
 
452
512
  _onDragEndPolicy() {
453
- this.shadowRoot.querySelectorAll('gv-flow').forEach(e => e.onDragEnd());
513
+ this.shadowRoot.querySelectorAll('gv-flow').forEach((e) => e.onDragEnd());
454
514
  }
455
515
 
456
- async _onDropPolicy({
457
- detail
458
- }) {
516
+ async _onDropPolicy({ detail }) {
459
517
  try {
460
518
  await this._askToValidateForms();
461
- const policy = detail.policy;
462
519
 
520
+ const policy = detail.policy;
463
521
  const targetFlow = this._findFlowById(detail.flowId);
464
522
 
465
523
  let name = policy.name;
466
524
  let description = '';
525
+ let condition = '';
467
526
  let configuration = {};
468
-
469
527
  let _id;
470
-
471
528
  let _new = false;
472
-
473
529
  if (detail.flowStep) {
474
530
  _id = detail.flowStep._id;
475
531
  name = detail.flowStep.name;
476
532
  description = detail.flowStep.description || '';
533
+ condition = detail.flowStep.condition || '';
477
534
  configuration = detail.flowStep.configuration;
478
535
  } else {
479
536
  _id = this._generateFlowStepId(targetFlow._id, detail.flowKey, detail.position);
480
537
  _new = true;
481
538
  }
482
539
 
483
- const flowStep = {
484
- _id,
485
- _new,
486
- name,
487
- policy: policy.id,
488
- description,
489
- enabled: true,
490
- configuration
491
- };
540
+ const flowStep = { _id, _new, name, policy: policy.id, description, condition, enabled: true, configuration };
492
541
  const sourceFlow = detail.sourceFlowId != null ? this._findFlowById(detail.sourceFlowId) : targetFlow;
493
542
 
494
543
  if (detail.sourcePosition != null) {
495
544
  if (detail.sourceFlowKey && detail.sourceFlowKey !== detail.flowKey) {
496
545
  sourceFlow[detail.sourceFlowKey].splice(detail.sourcePosition, 1);
497
546
  targetFlow[detail.flowKey].splice(detail.position, 0, flowStep);
498
-
499
547
  if (this._currentFlowStep != null && this._currentFlowStep.step._id === _id) {
500
- this._currentFlowStep.group = detail.flowKey; // Special case for update schema after change request to response or inverse
501
-
548
+ this._currentFlowStep.group = detail.flowKey;
549
+ // Special case for update schema after change request to response or inverse
502
550
  const schema = this.buildSchema(this._currentFlowStep.policy);
503
551
  await this._setCurrentFlowStep(this._currentFlowStep, schema, true);
504
-
505
552
  this._getFlowElement(targetFlow._id).requestUpdate();
506
553
  }
507
554
  } else {
@@ -512,20 +559,16 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
512
559
  sourceFlow[detail.flowKey].splice(detail.sourcePosition, 1);
513
560
  targetFlow[detail.flowKey].splice(detail.position, 0, flowStep);
514
561
  }
515
- } // Force Refresh source flow element when move to other flow
516
-
517
-
562
+ }
563
+ // Force Refresh source flow element when move to other flow
518
564
  if (targetFlow._id !== sourceFlow._id) {
519
565
  this._getFlowElement(targetFlow._id).requestUpdate();
520
566
  }
521
567
  } else {
522
568
  targetFlow[detail.flowKey].splice(detail.position, 0, flowStep);
523
-
524
569
  const currentFlowForm = this._getFlowStepForm();
525
-
526
570
  if (currentFlowForm == null || currentFlowForm.dirty !== true) {
527
571
  let step = targetFlow[detail.flowKey][detail.position];
528
-
529
572
  if (step == null) {
530
573
  // When confirm lose change after drop policy
531
574
  step = targetFlow[detail.flowKey][detail.position - 1];
@@ -533,15 +576,9 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
533
576
 
534
577
  if (detail.cancelEdit !== true) {
535
578
  setTimeout(async () => {
536
- await this._editFlowStep({
537
- step,
538
- policy,
539
- flow: targetFlow,
540
- group: detail.flowKey
541
- });
579
+ await this._editFlowStep({ step, policy, flow: targetFlow, group: detail.flowKey });
542
580
  this.updateComplete.then(() => {
543
581
  const flowElement = this._getFlowElement(targetFlow._id);
544
-
545
582
  flowElement.selectedStepId = step._id;
546
583
  flowElement.requestUpdate();
547
584
  });
@@ -549,11 +586,10 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
549
586
  }
550
587
  }
551
588
  }
552
-
553
589
  targetFlow._dirty = true;
554
590
  sourceFlow._dirty = true;
555
591
  this.isDirty = true;
556
- this.shadowRoot.querySelectorAll('gv-flow').forEach(gvFlow => gvFlow.removeCandidate());
592
+ this.shadowRoot.querySelectorAll('gv-flow').forEach((gvFlow) => gvFlow.removeCandidate());
557
593
  setTimeout(() => {
558
594
  this._dragPolicy = null;
559
595
  this._dropPolicy = null;
@@ -563,92 +599,53 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
563
599
  }
564
600
  }
565
601
 
566
- _onDeletePolicy({
567
- detail
568
- }) {
602
+ _onDeletePolicy({ detail }) {
569
603
  const targetFlow = this._findFlowById(detail.flowId);
570
-
571
604
  targetFlow[detail.flowKey].splice(detail.position, 1);
572
605
  targetFlow._dirty = true;
573
606
  this.isDirty = true;
574
-
575
607
  if (detail.target.editing) {
576
608
  this._closeFlowStepForm(true);
577
609
  }
578
-
579
610
  this._getFlowElement(detail.flowId).requestUpdate();
580
611
  }
581
612
 
582
613
  _onDesign() {
583
614
  this._changeTab('design');
584
-
585
615
  this._splitMainViews();
586
616
  }
587
617
 
588
- buildSchema({
589
- schema
590
- }) {
591
- const description = {
618
+ buildSchema({ schema }) {
619
+ const commonDescription = {
592
620
  title: 'Description',
593
621
  description: 'Description of flow step',
594
- type: 'string'
622
+ type: 'string',
595
623
  };
596
- const condition = {
624
+ const commonCondition = {
597
625
  title: 'Condition',
598
626
  description: 'Condition the execution of the flow step (support EL)',
599
627
  type: 'string',
600
628
  'x-schema-form': {
601
- 'expression-language': true
602
- }
629
+ 'expression-language': true,
630
+ },
603
631
  };
604
-
605
632
  if (schema) {
606
633
  const jsonSchema = typeof schema === 'string' ? JSON.parse(schema) : schema;
607
- const properties = {
608
- description,
609
- ...(this.hasConditionalSteps ? {
610
- condition
611
- } : {}),
612
- ...jsonSchema.properties
613
- };
614
- return { ...jsonSchema,
615
- properties
616
- };
634
+ const properties = { commonDescription, ...(this.hasConditionalSteps ? { commonCondition } : {}), ...jsonSchema.properties };
635
+ return { ...jsonSchema, properties };
617
636
  }
618
-
619
- return {
620
- properties: {
621
- description,
622
- ...(this.hasConditionalSteps ? {
623
- condition
624
- } : {})
625
- }
626
- };
637
+ return { properties: { commonDescription, ...(this.hasConditionalSteps ? { commonCondition } : {}) } };
627
638
  }
628
639
 
629
- async _editFlowStep({
630
- step,
631
- flow,
632
- policy,
633
- group
634
- }) {
640
+ async _editFlowStep({ step, flow, policy, group }) {
635
641
  if (step) {
636
642
  this._currentPolicyId = policy.id;
637
- const currentFlowStep = {
638
- flow,
639
- step,
640
- policy,
641
- group
642
- };
643
+ const currentFlowStep = { flow, step, policy, group };
643
644
  const schema = this.buildSchema(policy);
644
-
645
645
  try {
646
646
  await this._setCurrentFlowStep(currentFlowStep, schema);
647
-
648
647
  this._updateSelectedFlows([flow._id]);
649
-
650
648
  this._splitMainViews();
651
-
652
649
  if (localStorage.getItem('gv-policy-studio:keep-documentation-close') == null) {
653
650
  this._onOpenDocumentation();
654
651
  }
@@ -657,25 +654,12 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
657
654
  }
658
655
  } else {
659
656
  await this._closeFlowStepForm();
660
-
661
657
  this._maximizeTopView();
662
658
  }
663
659
  }
664
660
 
665
- async _onEditFlowStep({
666
- detail: {
667
- step,
668
- flow,
669
- policy,
670
- group
671
- }
672
- }) {
673
- return this._editFlowStep({
674
- step,
675
- flow,
676
- policy,
677
- group
678
- });
661
+ async _onEditFlowStep({ detail: { step, flow, policy, group } }) {
662
+ return this._editFlowStep({ step, flow, policy, group });
679
663
  }
680
664
 
681
665
  _getResizableViews() {
@@ -696,11 +680,8 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
696
680
  this._getResizableViews().split();
697
681
  }
698
682
 
699
- _onChangeFlowStepState({
700
- detail
701
- }) {
683
+ _onChangeFlowStepState({ detail }) {
702
684
  const targetFlow = this._findFlowById(detail.flowId);
703
-
704
685
  const step = targetFlow[detail.flowKey][detail.position];
705
686
  step.enabled = detail.enabled;
706
687
  targetFlow._dirty = true;
@@ -722,13 +703,13 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
722
703
  async _askToValidateForms() {
723
704
  if (this._currentAskConfirmation == null) {
724
705
  this._currentAskConfirmation = true;
725
- return Promise.all(this._submitOrConfirmForms()).then(forms => {
726
- if (forms.filter(r => r != null).length > 0) {
706
+ return Promise.all(this._submitOrConfirmForms()).then((forms) => {
707
+ if (forms.filter((r) => r != null).length > 0) {
727
708
  this._definition = this._buildDefinitionToSave();
728
- this.getChildren().forEach(e => e.requestUpdate()); // Refresh if lose changes lost current step selection
729
-
709
+ this.getChildren().forEach((e) => e.requestUpdate());
710
+ // Refresh if lose changes lost current step selection
730
711
  return this._checkCurrentFlowStep().then(() => {
731
- this.getChildren().forEach(e => e.requestUpdate());
712
+ this.getChildren().forEach((e) => e.requestUpdate());
732
713
  return this.updateComplete.then(() => {
733
714
  this._currentAskConfirmation = null;
734
715
  return forms;
@@ -740,7 +721,6 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
740
721
  }
741
722
  });
742
723
  }
743
-
744
724
  throw new Error('ask already waiting');
745
725
  }
746
726
 
@@ -750,34 +730,26 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
750
730
  }
751
731
 
752
732
  const schema = deepClone(flowStepSchema);
753
-
754
733
  if (currentFlowStep != null) {
755
- const configuration = typeof currentFlowStep.step.configuration === 'string' ? JSON.parse(currentFlowStep.step.configuration) : currentFlowStep.step.configuration;
756
- const step = { ...currentFlowStep.step,
757
- configuration
758
- };
759
- const _initialValues = { ...step.configuration,
760
- description: step.description,
761
- condition: step.condition
762
- };
763
- this._currentFlowStep = { ...currentFlowStep,
764
- step,
765
- _initialValues
766
- };
734
+ const configuration =
735
+ typeof currentFlowStep.step.configuration === 'string'
736
+ ? JSON.parse(currentFlowStep.step.configuration)
737
+ : currentFlowStep.step.configuration;
738
+ const step = { ...currentFlowStep.step, configuration };
739
+
740
+ const _initialValues = { ...step.configuration, commonDescription: step.description, commonCondition: step.condition };
741
+ this._currentFlowStep = { ...currentFlowStep, step, _initialValues };
767
742
 
768
743
  if (flowStepSchema && flowStepSchema.properties.scope) {
769
744
  const _enum = schema.properties.scope.enum;
770
-
771
- if (_enum.find(scope => ['REQUEST', 'REQUEST_CONTENT', 'RESPONSE', 'RESPONSE_CONTENT'].includes(scope)) != null) {
745
+ if (_enum.find((scope) => ['REQUEST', 'REQUEST_CONTENT', 'RESPONSE', 'RESPONSE_CONTENT'].includes(scope)) != null) {
772
746
  const filtered = this._currentFlowStep.group === 'pre' ? ['REQUEST', 'REQUEST_CONTENT'] : ['RESPONSE', 'RESPONSE_CONTENT'];
773
- schema.properties.scope.enum = _enum.filter(scope => filtered.includes(scope));
747
+ schema.properties.scope.enum = _enum.filter((scope) => filtered.includes(scope));
774
748
  const scope = this._currentFlowStep.step.configuration.scope;
775
-
776
749
  if (scope == null || !schema.properties.scope.enum.includes(scope)) {
777
750
  schema.properties.scope.default = schema.properties.scope.enum[0];
778
751
  this._currentFlowStep.step.configuration.scope = schema.properties.scope.enum[0];
779
752
  this._currentFlowStep._initialValues.scope = schema.properties.scope.enum[0];
780
-
781
753
  if (this._currentFlowStep._values) {
782
754
  this._currentFlowStep._values.scope = schema.properties.scope.enum[0];
783
755
  }
@@ -795,54 +767,38 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
795
767
  if (closeStepForm) {
796
768
  this._closeFlowStepForm(true);
797
769
  }
798
-
799
770
  this._definition = deepClone(this._definition);
800
771
  }
801
772
 
802
- async _onSelectFlows({
803
- detail
804
- }) {
773
+ async _onSelectFlows({ detail }) {
805
774
  try {
806
775
  await this._closeFlowStepForm();
807
-
808
776
  this._onCloseDocumentation();
809
-
810
777
  this._updateSelectedFlows(detail.flows);
811
-
812
778
  this._onDesign();
813
779
  } catch (e) {
814
780
  this._currentAskConfirmation = null;
815
781
  }
816
782
  }
817
783
 
818
- async _onOpenDocumentationFromMenu({
819
- detail: {
820
- policy
821
- }
822
- }) {
784
+ async _onOpenDocumentationFromMenu({ detail: { policy } }) {
823
785
  try {
824
786
  if (this.documentation == null || this.documentation.id !== policy.id) {
825
787
  await this._closeFlowStepForm();
826
788
  this._currentPolicyId = policy.id;
827
-
828
789
  if (this.getSelectedFlow()) {
829
790
  this._splitMainViews();
830
791
  } else {
831
792
  this._maximizeBottomView();
832
793
  }
833
-
834
- dispatchCustomEvent(this, 'fetch-documentation', {
835
- policy
836
- });
794
+ dispatchCustomEvent(this, 'fetch-documentation', { policy });
837
795
  }
838
796
  } catch (e) {}
839
797
  }
840
798
 
841
799
  _fetchDocumentation(policy) {
842
800
  if (this.documentation == null || this.documentation.id !== policy.id) {
843
- dispatchCustomEvent(this, 'fetch-documentation', {
844
- policy
845
- });
801
+ dispatchCustomEvent(this, 'fetch-documentation', { policy });
846
802
  }
847
803
  }
848
804
 
@@ -854,26 +810,20 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
854
810
 
855
811
  _onOpenDocumentationFromForm() {
856
812
  localStorage.removeItem('gv-policy-studio:keep-documentation-close');
857
-
858
813
  this._onOpenDocumentation();
859
814
  }
860
815
 
861
816
  _findFlowCollection(flowId) {
862
- const plan = this.definedPlans.find(plan => plan.flows.find(flow => flow._id === flowId) != null);
863
- return {
864
- plan,
865
- flows: plan != null ? plan.flows : this.definedFlows
866
- };
817
+ const plan = this.definedPlans.find((plan) => plan.flows.find((flow) => flow._id === flowId) != null);
818
+ return { plan, flows: plan != null ? plan.flows : this.definedFlows };
867
819
  }
868
820
 
869
821
  _findFlowById(flowId) {
870
- let flow = this.definedFlows.find(flow => flow._id === flowId);
871
-
822
+ let flow = this.definedFlows.find((flow) => flow._id === flowId);
872
823
  if (flow == null) {
873
- const plansFlows = this.definedPlans.map(plan => plan.flows).reduce((acc, val) => acc.concat(val), []);
874
- flow = plansFlows.find(flow => flow._id === flowId);
824
+ const plansFlows = this.definedPlans.map((plan) => plan.flows).reduce((acc, val) => acc.concat(val), []);
825
+ flow = plansFlows.find((flow) => flow._id === flowId);
875
826
  }
876
-
877
827
  return flow;
878
828
  }
879
829
 
@@ -882,34 +832,29 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
882
832
  return this._findFlowById(selectedFlowId);
883
833
  }
884
834
 
885
- _onTargetPolicy({
886
- detail
887
- }) {
835
+ _onTargetPolicy({ detail }) {
888
836
  if (this._currentAskConfirmation == null) {
889
837
  this._dragPolicy = detail;
890
838
  }
891
839
  }
892
840
 
893
- _onChangeFlowStep({
894
- detail
895
- }) {
841
+ _onChangeFlowStep({ detail }) {
896
842
  this._currentFlowStep._values = detail.values;
897
843
  }
898
844
 
899
845
  _writeFlowStep(values) {
900
- const {
901
- description,
902
- condition,
903
- ...configuration
904
- } = values;
905
-
906
- if (this._currentFlowStep.step._new || this._currentFlowStep.step.description !== description || this._currentFlowStep.step.condition !== condition || !deepEqual(this._currentFlowStep.step.configuration, configuration)) {
846
+ const { commonDescription, commonCondition, ...configuration } = values;
847
+ if (
848
+ this._currentFlowStep.step._new ||
849
+ this._currentFlowStep.step.description !== commonDescription ||
850
+ this._currentFlowStep.step.condition !== commonCondition ||
851
+ !deepEqual(this._currentFlowStep.step.configuration, configuration)
852
+ ) {
907
853
  const flow = this._findFlowById(this._currentFlowStep.flow._id);
854
+ const position = flow[this._currentFlowStep.group].findIndex((step) => step._id === this._currentFlowStep.step._id);
908
855
 
909
- const position = flow[this._currentFlowStep.group].findIndex(step => step._id === this._currentFlowStep.step._id);
910
-
911
- flow[this._currentFlowStep.group][position].description = description;
912
- flow[this._currentFlowStep.group][position].condition = condition;
856
+ flow[this._currentFlowStep.group][position].description = commonDescription;
857
+ flow[this._currentFlowStep.group][position].condition = commonCondition;
913
858
  flow[this._currentFlowStep.group][position].configuration = deepClone(configuration);
914
859
  delete flow[this._currentFlowStep.group][position]._new;
915
860
  flow[this._currentFlowStep.group][position]._dirty = true;
@@ -920,36 +865,23 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
920
865
  }
921
866
  }
922
867
 
923
- async _onSubmitFlowStep({
924
- detail
925
- }) {
868
+ async _onSubmitFlowStep({ detail }) {
926
869
  this._writeFlowStep(detail.values);
927
-
928
870
  await this.requestUpdate('_definition');
929
- this.getChildren().forEach(c => c.requestUpdate());
871
+ this.getChildren().forEach((c) => c.requestUpdate());
930
872
  }
931
873
 
932
874
  _onCancelFlow() {
933
875
  this._onDesign();
934
876
  }
935
877
 
936
- _onSubmitFlow({
937
- detail: {
938
- values
939
- }
940
- }) {
878
+ _onSubmitFlow({ detail: { values } }) {
941
879
  const selectedFlow = this.getSelectedFlow();
942
-
943
880
  const _values = Object.assign({}, this._createFlowFromSchema(), values);
944
-
945
881
  const selectedFlowUpdated = Object.assign({}, selectedFlow, _values);
946
-
947
882
  if (!deepEqual(selectedFlow, selectedFlowUpdated)) {
948
- Object.assign(selectedFlow, selectedFlowUpdated, {
949
- _dirty: true
950
- });
883
+ Object.assign(selectedFlow, selectedFlowUpdated, { _dirty: true });
951
884
  this.isDirty = true;
952
-
953
885
  this._refresh();
954
886
  }
955
887
  }
@@ -958,36 +890,24 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
958
890
  this._onDesign();
959
891
  }
960
892
 
961
- _onSubmitFlowMode({
962
- detail: {
963
- values
964
- }
965
- }) {
893
+ _onSubmitFlowMode({ detail: { values } }) {
966
894
  this._definition['flow-mode'] = values['flow-mode'] || 'DEFAULT';
967
895
  this.isDirty = true;
968
-
969
896
  this._refresh();
970
897
  }
971
898
 
972
- _onChangeTab({
973
- detail
974
- }) {
899
+ _onChangeTab({ detail }) {
975
900
  this._changeTab(detail.value);
976
901
  }
977
902
 
978
- async _changeTabValidator({
979
- from,
980
- to
981
- }) {
903
+ async _changeTabValidator({ from, to }) {
982
904
  if (from === 'properties') {
983
905
  const component = this.shadowRoot.querySelector('gv-properties');
984
-
985
906
  if (component.dirty) {
986
907
  return component.confirm();
987
908
  }
988
909
  } else if (from === 'resources') {
989
910
  const component = this.shadowRoot.querySelector('gv-resources');
990
-
991
911
  if (component.dirty) {
992
912
  return component.confirm();
993
913
  }
@@ -999,7 +919,6 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
999
919
  throw e;
1000
920
  }
1001
921
  }
1002
-
1003
922
  return Promise.resolve();
1004
923
  }
1005
924
 
@@ -1010,9 +929,7 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1010
929
  }
1011
930
  }
1012
931
 
1013
- _onDragStartFlowStep(flow, {
1014
- detail
1015
- }) {
932
+ _onDragStartFlowStep(flow, { detail }) {
1016
933
  if (this._currentAskConfirmation == null) {
1017
934
  this._dropPolicy = detail;
1018
935
  this._dragPolicy = detail;
@@ -1020,57 +937,88 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1020
937
  }
1021
938
 
1022
939
  _renderFlowEmptyState(readonlyMode) {
1023
- return html`<div slot="content" class="empty"> <div> Select a flow ${readonlyMode !== true ? html`or <gv-button @gv-button:click="${this._onAddFlow}" outlined icon="code:plus" large>design new one</gv-button>` : ''} </div> </div>`;
940
+ return html`<div slot="content" class="empty">
941
+ <div>
942
+ Select a flow
943
+ ${readonlyMode !== true
944
+ ? html`or <gv-button @gv-button:click="${this._onAddFlow}" outlined icon="code:plus" large>design new one</gv-button>`
945
+ : ''}
946
+ </div>
947
+ </div>`;
1024
948
  }
1025
949
 
1026
950
  _renderFlow(index = 0, hasEmptyState = true, readonlyMode) {
1027
951
  const flow = this.getSelectedFlow(index);
1028
-
1029
952
  if (flow) {
1030
- const {
1031
- plan
1032
- } = this._findFlowCollection(flow._id);
1033
-
953
+ const { plan } = this._findFlowCollection(flow._id);
1034
954
  const selectedStepId = this._currentFlowStep ? this._currentFlowStep.step._id : null;
1035
- return html` <gv-flow style="height:100%" .id="${flow._id}" .flow="${flow}" .plan="${plan}" .policies="${this.policies}" slot="content" ?disabled="${this._currentAskConfirmation}" .dragPolicy="${this._dragPolicy}" .dropPolicy="${this._dropPolicy}" .selectedStepId="${selectedStepId}" ?readonly="${readonlyMode}" ?has-policy-filter="${this._policyFilterOptions != null}" flows-title="${this.flowsTitle}" @gv-flow:drag-start="${this._onDragStartFlowStep.bind(this, flow)}" @gv-flow:edit="${this._onEditFlowStep}" @gv-flow:change-state="${this._onChangeFlowStepState}" @gv-flow:drop="${this._onDropPolicy}" @gv-flow:delete="${this._onDeletePolicy}"></gv-flow>`;
955
+ return html` <gv-flow
956
+ style="height: 100%"
957
+ .id="${flow._id}"
958
+ .flow="${flow}"
959
+ .plan="${plan}"
960
+ .policies="${this.policies}"
961
+ slot="content"
962
+ ?disabled="${this._currentAskConfirmation}"
963
+ .dragPolicy="${this._dragPolicy}"
964
+ .dropPolicy="${this._dropPolicy}"
965
+ .selectedStepId="${selectedStepId}"
966
+ ?readonly="${readonlyMode}"
967
+ ?has-policy-filter="${this._policyFilterOptions != null}"
968
+ flows-title="${this.flowsTitle}"
969
+ @gv-flow:drag-start="${this._onDragStartFlowStep.bind(this, flow)}"
970
+ @gv-flow:edit="${this._onEditFlowStep}"
971
+ @gv-flow:change-state="${this._onChangeFlowStepState}"
972
+ @gv-flow:drop="${this._onDropPolicy}"
973
+ @gv-flow:delete="${this._onDeletePolicy}"
974
+ ></gv-flow>`;
1036
975
  } else if (hasEmptyState) {
1037
976
  return this._renderFlowEmptyState(readonlyMode);
1038
977
  }
1039
-
1040
978
  return html``;
1041
979
  }
1042
980
 
1043
981
  _onFetchResources(event) {
1044
- const {
1045
- currentTarget,
1046
- regexTypes
1047
- } = event.detail;
1048
- const options = this.definedResources.filter(resource => regexTypes == null || new RegExp(regexTypes).test(resource.type)).map((resource, index) => {
1049
- const resourceType = this.resourceTypes.find(type => type.id === resource.type);
1050
- const row = document.createElement('gv-row');
1051
- const picture = resourceType.icon ? resourceType.icon : null;
1052
- row.item = {
1053
- picture,
1054
- name: resource.name
1055
- };
1056
- return {
1057
- element: row,
1058
- value: resource.name,
1059
- id: resource.type
1060
- };
1061
- });
982
+ const { currentTarget, regexTypes } = event.detail;
983
+ const options = this.definedResources
984
+ .filter((resource) => regexTypes == null || new RegExp(regexTypes).test(resource.type))
985
+ .map((resource, index) => {
986
+ const resourceType = this.resourceTypes.find((type) => type.id === resource.type);
987
+ const row = document.createElement('gv-row');
988
+ const picture = resourceType.icon ? resourceType.icon : null;
989
+ row.item = { picture, name: resource.name };
990
+ return {
991
+ element: row,
992
+ value: resource.name,
993
+ id: resource.type,
994
+ };
995
+ });
1062
996
  currentTarget.options = options;
1063
997
  }
1064
998
 
1065
999
  _renderPolicy(readonlyMode) {
1066
1000
  if (this._flowStepSchema && this.documentation) {
1067
- return html`<gv-resizable-views direction="horizontal" no-overflow> <div slot="top">${this._renderFlowStepForm(readonlyMode)}</div> <div slot="bottom"> <gv-documentation .text="${this.documentation.content}" .image="${this.documentation.image}" ?disabled="${this._currentAskConfirmation}" @gv-documentation:close="${this._onCloseDocumentation}"></gv-documentation> </div> </gv-resizable-views>`;
1001
+ return html`<gv-resizable-views direction="horizontal" no-overflow>
1002
+ <div slot="top">${this._renderFlowStepForm(readonlyMode)}</div>
1003
+ <div slot="bottom">
1004
+ <gv-documentation
1005
+ .text="${this.documentation.content}"
1006
+ .image="${this.documentation.image}"
1007
+ ?disabled="${this._currentAskConfirmation}"
1008
+ @gv-documentation:close="${this._onCloseDocumentation}"
1009
+ ></gv-documentation>
1010
+ </div>
1011
+ </gv-resizable-views>`;
1068
1012
  } else if (this.documentation) {
1069
- return html`<gv-documentation .text="${this.documentation.content}" .image="${this.documentation.image}" ?disabled="${this._currentAskConfirmation}" @gv-documentation:close="${this._onCloseDocumentation}"></gv-documentation>`;
1013
+ return html`<gv-documentation
1014
+ .text="${this.documentation.content}"
1015
+ .image="${this.documentation.image}"
1016
+ ?disabled="${this._currentAskConfirmation}"
1017
+ @gv-documentation:close="${this._onCloseDocumentation}"
1018
+ ></gv-documentation>`;
1070
1019
  } else if (this._flowStepSchema) {
1071
1020
  return this._renderFlowStepForm(readonlyMode);
1072
1021
  }
1073
-
1074
1022
  return html``;
1075
1023
  }
1076
1024
 
@@ -1081,7 +1029,6 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1081
1029
  _onResetFlowStep() {
1082
1030
  if (this._currentFlowStep) {
1083
1031
  delete this._currentFlowStep._values;
1084
-
1085
1032
  this._getFlowStepForm().reset();
1086
1033
  }
1087
1034
  }
@@ -1102,51 +1049,45 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1102
1049
  if (list) {
1103
1050
  return list.map((e, index) => {
1104
1051
  const _id = `${prefix}_${index}`;
1105
-
1106
1052
  if (isFlow) {
1107
1053
  if (e.pre) {
1108
- e.pre.forEach((step, stepIndex) => step._id = this._generateFlowStepId(_id, 'pre', stepIndex));
1054
+ e.pre.forEach((step, stepIndex) => (step._id = this._generateFlowStepId(_id, 'pre', stepIndex)));
1109
1055
  }
1110
-
1111
1056
  if (e.post) {
1112
- e.post.forEach((step, stepIndex) => step._id = this._generateFlowStepId(_id, 'post', stepIndex));
1057
+ e.post.forEach((step, stepIndex) => (step._id = this._generateFlowStepId(_id, 'post', stepIndex)));
1113
1058
  }
1114
1059
  }
1115
-
1116
1060
  if (force || e._id == null) {
1117
- return { ...e,
1118
- _id
1119
- };
1061
+ return { ...e, _id };
1120
1062
  }
1121
-
1122
1063
  return e;
1123
1064
  });
1124
1065
  }
1125
-
1126
1066
  return list;
1127
1067
  }
1128
1068
 
1129
1069
  getChildren() {
1130
- return [...Array.from(this.shadowRoot.querySelectorAll('gv-flow')), ...Array.from(this.shadowRoot.querySelectorAll('gv-resizable-views'))];
1070
+ return [
1071
+ ...Array.from(this.shadowRoot.querySelectorAll('gv-flow')),
1072
+ ...Array.from(this.shadowRoot.querySelectorAll('gv-resizable-views')),
1073
+ ];
1131
1074
  }
1132
1075
 
1133
1076
  async getUpdateComplete() {
1134
1077
  await super.getUpdateComplete();
1135
- await Promise.all(this.getChildren().map(e => e.updateComplete));
1078
+ await Promise.all(this.getChildren().map((e) => e.updateComplete));
1136
1079
  }
1137
1080
 
1138
1081
  shouldUpdate(changedProperties) {
1139
1082
  // Just refresh gv-flow components
1140
1083
  if (changedProperties.has('_dragPolicy')) {
1141
- this.shadowRoot.querySelectorAll('gv-flow').forEach(flow => flow.dragPolicy = this._dragPolicy);
1084
+ this.shadowRoot.querySelectorAll('gv-flow').forEach((flow) => (flow.dragPolicy = this._dragPolicy));
1142
1085
  return false;
1143
1086
  }
1144
-
1145
1087
  if (changedProperties.has('_dropPolicy')) {
1146
- this.shadowRoot.querySelectorAll('gv-flow').forEach(flow => flow.dropPolicy = this._dropPolicy);
1088
+ this.shadowRoot.querySelectorAll('gv-flow').forEach((flow) => (flow.dropPolicy = this._dropPolicy));
1147
1089
  return false;
1148
1090
  }
1149
-
1150
1091
  return super.shouldUpdate(changedProperties);
1151
1092
  }
1152
1093
 
@@ -1158,18 +1099,55 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1158
1099
 
1159
1100
  _renderFlowStepForm(readonlyMode) {
1160
1101
  const values = this._currentFlowStep._values || this._currentFlowStep._initialValues;
1161
- const groups = [{
1162
- items: ['description', 'condition']
1163
- }, {
1164
- name: i18n('gv-policy-studio.policy-settings'),
1165
- default: true
1166
- }];
1167
- return html`${cache(this._flowStepSchema && this._currentFlowStep ? html`<div class="flow-step__container"> <div class="flow-step__form"> <gv-schema-form .id="${FLOW_STEP_FORM_ID}" .schema="${this._flowStepSchema}" .icon="design:edit" has-header validate-on-render .values="${values}" .dirty="${this._currentFlowStep._values != null}" ?readonly="${readonlyMode}" scrollable .groups="${groups}" @gv-schema-form:change="${this._onChangeFlowStep}" @gv-schema-form:reset="${this._onResetFlowStep}" @gv-schema-form:fetch-resources="${this._onFetchResources}" @gv-schema-form:submit="${this._onSubmitFlowStep}"> <div slot="title" class="flow-step__form-title">${this._currentFlowStep.step.name}</div> <gv-button slot="header-left" icon="general:close" outlined small @gv-button:click="${this._onCloseFlowStepForm}" title="Close"></gv-button> <gv-button slot="header-left" icon="home:book" ?disabled="${this.documentation != null}" outlined small @gv-button:click="${this._onOpenDocumentationFromForm}" title="Open documentation"></gv-button> </gv-schema-form> </div> </div>` : '')}`;
1102
+
1103
+ const groups = [{ items: ['commonDescription', 'commonCondition'] }, { name: i18n('gv-policy-studio.policy-settings'), default: true }];
1104
+ return html`${cache(
1105
+ this._flowStepSchema && this._currentFlowStep
1106
+ ? html`<div class="flow-step__container">
1107
+ <div class="flow-step__form">
1108
+ <gv-schema-form
1109
+ .id="${FLOW_STEP_FORM_ID}"
1110
+ .schema="${this._flowStepSchema}"
1111
+ .icon="design:edit"
1112
+ has-header
1113
+ validate-on-render
1114
+ .values="${values}"
1115
+ .dirty="${this._currentFlowStep._values != null}"
1116
+ ?readonly="${readonlyMode}"
1117
+ scrollable
1118
+ .groups="${groups}"
1119
+ @gv-schema-form:change="${this._onChangeFlowStep}"
1120
+ @gv-schema-form:reset="${this._onResetFlowStep}"
1121
+ @gv-schema-form:fetch-resources="${this._onFetchResources}"
1122
+ @gv-schema-form:submit="${this._onSubmitFlowStep}"
1123
+ >
1124
+ <div slot="title" class="flow-step__form-title">${this._currentFlowStep.step.name}</div>
1125
+ <gv-button
1126
+ slot="header-left"
1127
+ icon="general:close"
1128
+ outlined
1129
+ small
1130
+ @gv-button:click="${this._onCloseFlowStepForm}"
1131
+ title="Close"
1132
+ ></gv-button>
1133
+ <gv-button
1134
+ slot="header-left"
1135
+ icon="home:book"
1136
+ ?disabled="${this.documentation != null}"
1137
+ outlined
1138
+ small
1139
+ @gv-button:click="${this._onOpenDocumentationFromForm}"
1140
+ title="Open documentation"
1141
+ ></gv-button>
1142
+ </gv-schema-form>
1143
+ </div>
1144
+ </div>`
1145
+ : '',
1146
+ )}`;
1168
1147
  }
1169
1148
 
1170
1149
  _onCloseDocumentation() {
1171
1150
  this.documentation = null;
1172
-
1173
1151
  if (this._currentFlowStep == null) {
1174
1152
  this._maximizeTopView();
1175
1153
  } else {
@@ -1177,17 +1155,10 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1177
1155
  }
1178
1156
  }
1179
1157
 
1180
- _onDeleteFlow({
1181
- detail
1182
- }) {
1158
+ _onDeleteFlow({ detail }) {
1183
1159
  const flowId = detail.content._id;
1184
-
1185
- const {
1186
- flows
1187
- } = this._findFlowCollection(flowId);
1188
-
1189
- const flow = flows.find(flow => flow._id === flowId);
1190
-
1160
+ const { flows } = this._findFlowCollection(flowId);
1161
+ const flow = flows.find((flow) => flow._id === flowId);
1191
1162
  this._deleteFlow(flows, flow);
1192
1163
  }
1193
1164
 
@@ -1207,20 +1178,13 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1207
1178
  return this._definition && this._definition.properties ? this._definition.properties : [];
1208
1179
  }
1209
1180
 
1210
- async _onDuplicateFlow({
1211
- detail
1212
- }) {
1181
+ async _onDuplicateFlow({ detail }) {
1213
1182
  try {
1214
1183
  await this._askToValidateForms();
1215
- const flowId = detail.content._id;
1216
-
1217
- const {
1218
- plan,
1219
- flows
1220
- } = this._findFlowCollection(flowId);
1221
1184
 
1185
+ const flowId = detail.content._id;
1186
+ const { plan, flows } = this._findFlowCollection(flowId);
1222
1187
  this._addFlow(flows, this._findFlowById(flowId));
1223
-
1224
1188
  if (plan != null) {
1225
1189
  let planIndex = null;
1226
1190
  this.definedPlans.find((p, i) => {
@@ -1228,16 +1192,13 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1228
1192
  planIndex = i;
1229
1193
  return true;
1230
1194
  }
1231
-
1232
1195
  return false;
1233
1196
  });
1234
1197
  plan.flows = flows;
1235
1198
  this.definedPlans[planIndex].flows = this._generatePlanFlowsId(plan, true);
1236
-
1237
1199
  this._updateSelectedFlows([this.definedPlans[planIndex].flows[flows.length - 1]._id]);
1238
1200
  } else {
1239
1201
  this._definition.flows = this._generateFlowsId(this._definition.flows);
1240
-
1241
1202
  this._updateSelectedFlows([this._definition.flows[this._definition.flows.length - 1]._id]);
1242
1203
  }
1243
1204
  } catch (err) {
@@ -1245,26 +1206,18 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1245
1206
  }
1246
1207
  }
1247
1208
 
1248
- _onChangeFlowState({
1249
- detail
1250
- }) {
1209
+ _onChangeFlowState({ detail }) {
1251
1210
  const flow = this._findFlowById(detail.content._id);
1252
-
1253
1211
  flow.enabled = detail.enabled;
1254
1212
  flow._dirty = true;
1255
1213
  this.isDirty = true;
1256
1214
  }
1257
1215
 
1258
- async _onAddFlowPlan({
1259
- detail
1260
- }) {
1216
+ async _onAddFlowPlan({ detail }) {
1261
1217
  try {
1262
1218
  await this._askToValidateForms();
1263
-
1264
1219
  this._addFlow(this.definedPlans[detail.planIndex].flows);
1265
-
1266
1220
  this.definedPlans[detail.planIndex].flows = this._generatePlanFlowsId(this.definedPlans[detail.planIndex]);
1267
-
1268
1221
  this._updateSelectedFlows([this.definedPlans[detail.planIndex].flows[this.definedPlans[detail.planIndex].flows.length - 1]._id]);
1269
1222
  } catch (err) {
1270
1223
  this._currentAskConfirmation = null;
@@ -1276,9 +1229,7 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1276
1229
  await this._askToValidateForms();
1277
1230
 
1278
1231
  this._addFlow(this._definition.flows);
1279
-
1280
1232
  this._definition.flows = this._generateFlowsId(this._definition.flows);
1281
-
1282
1233
  this._updateSelectedFlows([this._definition.flows[this._definition.flows.length - 1]._id]);
1283
1234
  } catch (err) {
1284
1235
  this._currentAskConfirmation = null;
@@ -1286,12 +1237,17 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1286
1237
  }
1287
1238
 
1288
1239
  _addFlow(collection, duplicate = null) {
1289
- const flow = duplicate == null ? this._createFlowFromSchema() : { ...duplicate,
1290
- _id: null,
1291
- // reset the id to avoid issue with AM that persists the ID
1292
- id: null,
1293
- _dirty: true
1294
- };
1240
+ const flow =
1241
+ duplicate == null
1242
+ ? this._createFlowFromSchema()
1243
+ : {
1244
+ ...duplicate,
1245
+ _id: null,
1246
+ // reset the id to avoid issue with AM that persists the ID
1247
+ id: null,
1248
+ _dirty: true,
1249
+ };
1250
+
1295
1251
  collection.push(flow);
1296
1252
  this.isDirty = true;
1297
1253
  return collection;
@@ -1302,23 +1258,22 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1302
1258
  name: '',
1303
1259
  pre: [],
1304
1260
  post: [],
1305
- _dirty: true
1261
+ _dirty: true,
1306
1262
  };
1263
+
1307
1264
  return this._instantiate(this.flowSchema.properties, newFlow);
1308
1265
  }
1309
1266
 
1310
1267
  _instantiate(propertiesDefinition, initiator = {}) {
1311
- const property = { ...initiator
1312
- };
1268
+ const property = { ...initiator };
1313
1269
 
1314
1270
  if (propertiesDefinition) {
1315
1271
  for (const key of Object.keys(propertiesDefinition)) {
1316
1272
  const entry = propertiesDefinition[key];
1317
1273
 
1318
1274
  if (entry.type === 'object') {
1319
- property[key] = this._instantiate(entry.properties, initiator = {});
1275
+ property[key] = this._instantiate(entry.properties, (initiator = {}));
1320
1276
  }
1321
-
1322
1277
  if (entry.default !== undefined) {
1323
1278
  property[key] = entry.default;
1324
1279
  } else if (entry.type === 'string') {
@@ -1333,18 +1288,14 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1333
1288
  _deleteFlow(collection, flow) {
1334
1289
  const index = collection.indexOf(flow);
1335
1290
  collection.splice(index, 1);
1336
- const selectedFlows = this.selectedFlowsId.filter(flowId => flowId !== flow._id);
1337
-
1291
+ const selectedFlows = this.selectedFlowsId.filter((flowId) => flowId !== flow._id);
1338
1292
  if (selectedFlows.length === 1) {
1339
1293
  this._updateSelectedFlows(selectedFlows);
1340
1294
  } else {
1341
1295
  this._selectFirstFlow(true);
1342
1296
  }
1343
-
1344
1297
  this._changeTab('design');
1345
-
1346
1298
  this._refresh();
1347
-
1348
1299
  this.isDirty = true;
1349
1300
  }
1350
1301
 
@@ -1355,44 +1306,36 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1355
1306
  index = i;
1356
1307
  return true;
1357
1308
  }
1358
-
1359
1309
  return false;
1360
1310
  });
1361
1311
  return index;
1362
1312
  }
1363
1313
 
1364
- async _onReorderFlows({
1365
- detail: {
1366
- plan
1367
- }
1368
- }) {
1314
+ async _onReorderFlows({ detail: { plan } }) {
1369
1315
  try {
1370
1316
  await this._askToValidateForms();
1371
1317
  this.isDirty = true;
1372
-
1373
1318
  if (plan != null) {
1374
1319
  const newOrder = this._generatePlanFlowsId(plan, true);
1375
-
1376
1320
  if (this.selectedFlowsId) {
1377
- this._updateSelectedFlows(this.selectedFlowsId.map(flowId => {
1378
- const index = this._findFlowIndex(plan.flows, flowId);
1379
-
1380
- return index != null ? newOrder[index]._id : flowId;
1381
- }));
1321
+ this._updateSelectedFlows(
1322
+ this.selectedFlowsId.map((flowId) => {
1323
+ const index = this._findFlowIndex(plan.flows, flowId);
1324
+ return index != null ? newOrder[index]._id : flowId;
1325
+ }),
1326
+ );
1382
1327
  }
1383
-
1384
1328
  plan.flows = newOrder;
1385
1329
  } else {
1386
1330
  const newOrder = this._generateFlowsId(this._definition.flows, true);
1387
-
1388
1331
  if (this.selectedFlowsId) {
1389
- this._updateSelectedFlows(this.selectedFlowsId.map(flowId => {
1390
- const index = this._findFlowIndex(this._definition.flows, flowId);
1391
-
1392
- return index != null ? newOrder[index]._id : flowId;
1393
- }));
1332
+ this._updateSelectedFlows(
1333
+ this.selectedFlowsId.map((flowId) => {
1334
+ const index = this._findFlowIndex(this._definition.flows, flowId);
1335
+ return index != null ? newOrder[index]._id : flowId;
1336
+ }),
1337
+ );
1394
1338
  }
1395
-
1396
1339
  this._definition.flows = newOrder;
1397
1340
  }
1398
1341
  } catch (err) {
@@ -1400,9 +1343,7 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1400
1343
  }
1401
1344
  }
1402
1345
 
1403
- _onSearchPolicy({
1404
- detail
1405
- }) {
1346
+ _onSearchPolicy({ detail }) {
1406
1347
  this._searchPolicyQuery = detail;
1407
1348
  }
1408
1349
 
@@ -1410,9 +1351,7 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1410
1351
  this._searchPolicyQuery = null;
1411
1352
  }
1412
1353
 
1413
- _onSearchFlows({
1414
- detail
1415
- }) {
1354
+ _onSearchFlows({ detail }) {
1416
1355
  this._searchFlowQuery = detail;
1417
1356
  }
1418
1357
 
@@ -1434,26 +1373,27 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1434
1373
  }
1435
1374
 
1436
1375
  _removePrivateProperties(o) {
1437
- const copy = { ...o
1438
- };
1439
- Object.keys(o).filter(key => key.startsWith('_')).forEach(key => {
1440
- delete copy[key];
1441
- });
1376
+ const copy = { ...o };
1377
+ Object.keys(o)
1378
+ .filter((key) => key.startsWith('_'))
1379
+ .forEach((key) => {
1380
+ delete copy[key];
1381
+ });
1442
1382
  return copy;
1443
1383
  }
1444
1384
 
1445
1385
  _submitOrConfirmForms() {
1446
- return [...this.shadowRoot.querySelectorAll('gv-schema-form')].filter(form => {
1447
- const isValid = form.isValid();
1448
-
1449
- if (isValid) {
1450
- form.submit();
1451
- } else {
1452
- form.dirty = true;
1453
- }
1454
-
1455
- return !isValid;
1456
- }).map(form => form.confirm());
1386
+ return [...this.shadowRoot.querySelectorAll('gv-schema-form')]
1387
+ .filter((form) => {
1388
+ const isValid = form.isValid();
1389
+ if (isValid) {
1390
+ form.submit();
1391
+ } else {
1392
+ form.dirty = true;
1393
+ }
1394
+ return !isValid;
1395
+ })
1396
+ .map((form) => form.confirm());
1457
1397
  }
1458
1398
 
1459
1399
  getPropertiesElement() {
@@ -1462,20 +1402,18 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1462
1402
 
1463
1403
  async _checkCurrentFlowStep() {
1464
1404
  if (this._currentFlowStep && this.selectedFlowsId) {
1465
- const closePromises = this.selectedFlowsId.map(flowId => {
1466
- const flow = this._findFlowById(flowId);
1467
-
1468
- const currentStep = [...flow.pre, ...flow.post].find(step => step._id === this._currentFlowStep.step._id);
1469
-
1470
- if (currentStep == null) {
1471
- return this._closeFlowStepForm(true);
1472
- }
1473
-
1474
- return null;
1475
- }).filter(p => p !== null);
1405
+ const closePromises = this.selectedFlowsId
1406
+ .map((flowId) => {
1407
+ const flow = this._findFlowById(flowId);
1408
+ const currentStep = [...flow.pre, ...flow.post].find((step) => step._id === this._currentFlowStep.step._id);
1409
+ if (currentStep == null) {
1410
+ return this._closeFlowStepForm(true);
1411
+ }
1412
+ return null;
1413
+ })
1414
+ .filter((p) => p !== null);
1476
1415
  return Promise.all(closePromises);
1477
1416
  }
1478
-
1479
1417
  return Promise.resolve();
1480
1418
  }
1481
1419
 
@@ -1485,95 +1423,71 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1485
1423
  this._definition = deepClone(this._definitionSaved);
1486
1424
  this._definitionSaved = null;
1487
1425
  this.isDirty = false;
1488
-
1489
1426
  this._checkCurrentFlowStep();
1490
-
1491
- this.definedPlans.forEach(plan => {
1492
- plan.flows.forEach(flow => flow._dirty = false);
1427
+ this.definedPlans.forEach((plan) => {
1428
+ plan.flows.forEach((flow) => (flow._dirty = false));
1493
1429
  });
1494
- this.definedFlows.forEach(flow => flow._dirty = false);
1495
- this.getChildren().forEach(e => e.requestUpdate());
1430
+ this.definedFlows.forEach((flow) => (flow._dirty = false));
1431
+ this.getChildren().forEach((e) => e.requestUpdate());
1496
1432
  }
1497
1433
  }
1498
1434
 
1499
1435
  _buildDefinitionToSave() {
1500
1436
  // Copy definition and remove invalid step
1501
1437
  // Keep private properties like _id and others stuff useful for render
1502
- const flows = this._definition.flows.map(flow => {
1438
+ const flows = this._definition.flows.map((flow) => {
1503
1439
  flow.pre = flow.pre.filter(this._filterNotValidStep);
1504
1440
  flow.post = flow.post.filter(this._filterNotValidStep);
1505
1441
  return flow;
1506
1442
  });
1507
1443
 
1508
- let definition = { ...this._definition,
1509
- flows
1510
- };
1444
+ let definition = { ...this._definition, flows };
1511
1445
 
1512
1446
  if (this._definition.plans != null) {
1513
- const plans = this._definition.plans.map(plan => {
1514
- const flows = plan.flows.map(flow => {
1447
+ const plans = this._definition.plans.map((plan) => {
1448
+ const flows = plan.flows.map((flow) => {
1515
1449
  flow.pre = flow.pre.filter(this._filterNotValidStep);
1516
1450
  flow.post = flow.post.filter(this._filterNotValidStep);
1517
1451
  return flow;
1518
1452
  });
1519
- return { ...plan,
1520
- flows
1521
- };
1453
+ return { ...plan, flows };
1522
1454
  });
1523
-
1524
- definition = { ...definition,
1525
- plans
1526
- };
1455
+ definition = { ...definition, plans };
1527
1456
  }
1528
-
1529
1457
  return definition;
1530
1458
  }
1531
1459
 
1532
1460
  _buildDefinitionToSend(definitionToSave) {
1533
1461
  // Copy definition and remove all private properties
1534
- const flows = definitionToSave.flows.map(f => {
1462
+ const flows = definitionToSave.flows.map((f) => {
1535
1463
  const flow = this._removePrivateProperties(f);
1536
-
1537
1464
  flow.pre = flow.pre.map(this._removePrivateProperties);
1538
1465
  flow.post = flow.post.map(this._removePrivateProperties);
1539
1466
  return flow;
1540
1467
  });
1541
- let definition = { ...this._definition,
1542
- flows
1543
- };
1544
1468
 
1469
+ let definition = { ...this._definition, flows };
1545
1470
  if (this._definition.plans != null) {
1546
- const plans = definitionToSave.plans.map(plan => {
1547
- const flows = plan.flows.map(f => {
1471
+ const plans = definitionToSave.plans.map((plan) => {
1472
+ const flows = plan.flows.map((f) => {
1548
1473
  const flow = this._removePrivateProperties(f);
1549
-
1550
1474
  flow.pre = flow.pre.map(this._removePrivateProperties);
1551
1475
  flow.post = flow.post.map(this._removePrivateProperties);
1552
1476
  return flow;
1553
1477
  });
1554
- return { ...plan,
1555
- flows
1556
- };
1478
+ return { ...plan, flows };
1557
1479
  });
1558
- definition = { ...definition,
1559
- plans
1560
- };
1480
+ definition = { ...definition, plans };
1561
1481
  }
1562
1482
 
1563
1483
  if (this._definition.properties != null) {
1564
1484
  const properties = this._definition.properties.map(this._removePrivateProperties);
1565
-
1566
- definition = { ...definition,
1567
- properties
1568
- };
1485
+ definition = { ...definition, properties };
1569
1486
  }
1570
1487
 
1571
1488
  if (this._definition.resources != null) {
1572
1489
  const resources = this._definition.resources.map(this._removePrivateProperties);
1573
-
1574
- definition = { ...definition,
1575
- resources
1576
- };
1490
+ definition = { ...definition, resources };
1577
1491
  }
1578
1492
 
1579
1493
  return definition;
@@ -1584,18 +1498,15 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1584
1498
  this.getPropertiesElement().submit();
1585
1499
  }
1586
1500
 
1587
- Promise.all(this._submitOrConfirmForms()).then(() => {
1588
- this._definitionSaved = this._buildDefinitionToSave();
1589
-
1590
- const definition = this._buildDefinitionToSend(this._definitionSaved);
1591
-
1592
- dispatchCustomEvent(this, 'save', {
1593
- definition,
1594
- services: this.services
1501
+ Promise.all(this._submitOrConfirmForms())
1502
+ .then(() => {
1503
+ this._definitionSaved = this._buildDefinitionToSave();
1504
+ const definition = this._buildDefinitionToSend(this._definitionSaved);
1505
+ dispatchCustomEvent(this, 'save', { definition, services: this.services });
1506
+ })
1507
+ .catch((err) => {
1508
+ console.error(`[policy-studio] Error on save`, err);
1595
1509
  });
1596
- }).catch(err => {
1597
- console.error(`[policy-studio] Error on save`, err);
1598
- });
1599
1510
  }
1600
1511
 
1601
1512
  _onDebug(requestEvent) {
@@ -1603,24 +1514,20 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1603
1514
  this.getPropertiesElement().submit();
1604
1515
  }
1605
1516
 
1606
- Promise.all(this._submitOrConfirmForms()).then(() => {
1607
- const definition = this._buildDefinitionToSend(this._buildDefinitionToSave());
1608
-
1609
- dispatchCustomEvent(this, 'debug', {
1610
- definition,
1611
- services: this.services,
1612
- request: requestEvent.detail.request
1517
+ Promise.all(this._submitOrConfirmForms())
1518
+ .then(() => {
1519
+ const definition = this._buildDefinitionToSend(this._buildDefinitionToSave());
1520
+ dispatchCustomEvent(this, 'debug', { definition, services: this.services, request: requestEvent.detail.request });
1521
+ })
1522
+ .catch((err) => {
1523
+ console.error(`[policy-studio] Error on debug`, err);
1613
1524
  });
1614
- }).catch(err => {
1615
- console.error(`[policy-studio] Error on debug`, err);
1616
- });
1617
1525
  }
1618
1526
 
1619
1527
  get filteredFlows() {
1620
1528
  if (this._flowFilter.length === 0 || this._flowFilter.includes('api')) {
1621
1529
  return this.definedFlows;
1622
1530
  }
1623
-
1624
1531
  return null;
1625
1532
  }
1626
1533
 
@@ -1628,13 +1535,10 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1628
1535
  if (this._flowFilter.length === 0 || this._flowFilter.includes('plan')) {
1629
1536
  return this.definedPlans;
1630
1537
  }
1631
-
1632
1538
  return null;
1633
1539
  }
1634
1540
 
1635
- _onFilterFlows({
1636
- detail
1637
- }) {
1541
+ _onFilterFlows({ detail }) {
1638
1542
  if (this._flowFilter.includes(detail.id)) {
1639
1543
  this._flowFilter = [];
1640
1544
  } else {
@@ -1644,17 +1548,16 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1644
1548
 
1645
1549
  _getFilteredPolicies() {
1646
1550
  if (this._policyFilter.length > 0) {
1647
- return this.policies.filter(policy => {
1648
- return policy.onRequest && this._policyFilter.includes('onRequest') || policy.onResponse && this._policyFilter.includes('onResponse');
1551
+ return this.policies.filter((policy) => {
1552
+ return (
1553
+ (policy.onRequest && this._policyFilter.includes('onRequest')) || (policy.onResponse && this._policyFilter.includes('onResponse'))
1554
+ );
1649
1555
  });
1650
1556
  }
1651
-
1652
1557
  return this.policies;
1653
1558
  }
1654
1559
 
1655
- _onFilterPolicies({
1656
- detail
1657
- }) {
1560
+ _onFilterPolicies({ detail }) {
1658
1561
  if (this._policyFilter.includes(detail.id)) {
1659
1562
  this._policyFilter = [];
1660
1563
  } else {
@@ -1663,7 +1566,52 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1663
1566
  }
1664
1567
 
1665
1568
  _renderDesign(readonlyMode) {
1666
- return html` <div id="design" slot="content" class="design"> <gv-resizable-views no-overflow> <div slot="top">${this._renderFlow(0, true, readonlyMode)}</div> <div slot="bottom"> ${this._renderFlow(1, false, readonlyMode)} ${this._renderPolicy(readonlyMode)} ${this._renderFlowForm(readonlyMode)} </div> </gv-resizable-views> ${readonlyMode !== true ? html`<gv-policy-studio-menu class="right-menu" ?disabled="${this._currentAskConfirmation}" .policies="${this._getFilteredPolicies()}" .selectedIds="${[this._currentPolicyId]}" .query="${this._searchPolicyQuery}" ?has-policy-filter="${this._policyFilterOptions != null}" ?readonly="${readonlyMode}" @gv-policy-studio-menu:target-policy="${this._onTargetPolicy}" @gv-policy-studio-menu:fetch-documentation="${this._onOpenDocumentationFromMenu}" @gv-policy-studio-menu:dragend-policy="${this._onDragEndPolicy}"> <div slot="header" class="search-policies"> ${this._policyFilterOptions != null ? html`<gv-option ?disabled="${this._currentAskConfirmation}" .options="${this._policyFilterOptions}" multiple="multiple" outlined .value="${this._policyFilter}" small @gv-option:select="${this._onFilterPolicies}"></gv-option>` : ''} <gv-input id="search-policy" ?disabled="${this._currentAskConfirmation}" placeholder="Filter policies (Shift + Ctrl + Space)" type="search" small @gv-input:input="${this._onSearchPolicy}" @gv-input:clear="${this._onClearPolicy}"></gv-input> </div> </gv-policy-studio-menu>` : ''} </div>`;
1569
+ return html` <div id="design" slot="content" class="design">
1570
+ <gv-resizable-views no-overflow>
1571
+ <div slot="top">${this._renderFlow(0, true, readonlyMode)}</div>
1572
+
1573
+ <div slot="bottom">
1574
+ ${this._renderFlow(1, false, readonlyMode)} ${this._renderPolicy(readonlyMode)} ${this._renderFlowForm(readonlyMode)}
1575
+ </div>
1576
+ </gv-resizable-views>
1577
+ ${readonlyMode !== true
1578
+ ? html`<gv-policy-studio-menu
1579
+ class="right-menu"
1580
+ ?disabled="${this._currentAskConfirmation}"
1581
+ .policies="${this._getFilteredPolicies()}"
1582
+ .selectedIds="${[this._currentPolicyId]}"
1583
+ .query="${this._searchPolicyQuery}"
1584
+ ?has-policy-filter="${this._policyFilterOptions != null}"
1585
+ ?readonly="${readonlyMode}"
1586
+ @gv-policy-studio-menu:target-policy="${this._onTargetPolicy}"
1587
+ @gv-policy-studio-menu:fetch-documentation="${this._onOpenDocumentationFromMenu}"
1588
+ @gv-policy-studio-menu:dragend-policy="${this._onDragEndPolicy}"
1589
+ >
1590
+ <div slot="header" class="search-policies">
1591
+ ${this._policyFilterOptions != null
1592
+ ? html`<gv-option
1593
+ ?disabled="${this._currentAskConfirmation}"
1594
+ .options="${this._policyFilterOptions}"
1595
+ multiple
1596
+ outlined
1597
+ .value="${this._policyFilter}"
1598
+ small
1599
+ @gv-option:select="${this._onFilterPolicies}"
1600
+ ></gv-option>`
1601
+ : ''}
1602
+ <gv-input
1603
+ id="search-policy"
1604
+ ?disabled="${this._currentAskConfirmation}"
1605
+ placeholder="Filter policies (Shift + Ctrl + Space)"
1606
+ type="search"
1607
+ small
1608
+ @gv-input:input="${this._onSearchPolicy}"
1609
+ @gv-input:clear="${this._onClearPolicy}"
1610
+ ></gv-input>
1611
+ </div>
1612
+ </gv-policy-studio-menu>`
1613
+ : ''}
1614
+ </div>`;
1667
1615
  }
1668
1616
 
1669
1617
  _renderDebug() {
@@ -1671,61 +1619,189 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1671
1619
  const isLoading = this.debugResponse ? this.debugResponse.isLoading : undefined;
1672
1620
  const path = this.debugResponse && this.debugResponse.request ? this.debugResponse.request.path : undefined;
1673
1621
  const method = this.debugResponse && this.debugResponse.request ? this.debugResponse.request.method : undefined;
1674
- return html`<gv-http-client id="debug" slot="content" class="debug" @gv-http-client:send="${this._onDebug}" .response="${response}" .path="${path}" .method="${method}" ?loading="${isLoading}"> </gv-http-client>`;
1622
+ return html`<gv-http-client
1623
+ id="debug"
1624
+ slot="content"
1625
+ class="debug"
1626
+ @gv-http-client:send="${this._onDebug}"
1627
+ .response="${response}"
1628
+ .path="${path}"
1629
+ .method="${method}"
1630
+ ?loading="${isLoading}"
1631
+ >
1632
+ </gv-http-client>`;
1675
1633
  }
1676
1634
 
1677
1635
  _renderConfigurationForm(readonlyMode) {
1678
1636
  if (this.configurationSchema) {
1679
1637
  const values = deepClone(this._definition);
1680
- return html` <div id="settings" slot="content" class="api-settings" @dragover="${this._onDesign}"> <gv-schema-form .schema="${this.configurationSchema}" id="api-settings-form" .values="${values}" has-header has-footer scrollable ?readonly="${readonlyMode}" @gv-schema-form:cancel="${this._onCancelFlowMode}" @gv-schema-form:submit="${this._onSubmitFlowMode}"> ${!this.configurationInformation ? '' : html` <div class="api-settings-information" slot="title"> <gv-icon class="api-settings-information__icon" title="Info" shape="code:info"></gv-icon> <blockquote class="api-settings-information__blockquote">${this.configurationInformation}</blockquote> </div> `} </gv-schema-form> </div>`;
1638
+ return html` <div id="settings" slot="content" class="api-settings" @dragover="${this._onDesign}">
1639
+ <gv-schema-form
1640
+ .schema="${this.configurationSchema}"
1641
+ id="api-settings-form"
1642
+ .values="${values}"
1643
+ has-header
1644
+ has-footer
1645
+ scrollable
1646
+ ?readonly="${readonlyMode}"
1647
+ @gv-schema-form:cancel="${this._onCancelFlowMode}"
1648
+ @gv-schema-form:submit="${this._onSubmitFlowMode}"
1649
+ >
1650
+ ${!this.configurationInformation
1651
+ ? ''
1652
+ : html`
1653
+ <div class="api-settings-information" slot="title">
1654
+ <gv-icon class="api-settings-information__icon" title="Info" shape="code:info"></gv-icon>
1655
+ <blockquote class="api-settings-information__blockquote">${this.configurationInformation}</blockquote>
1656
+ </div>
1657
+ `}
1658
+ </gv-schema-form>
1659
+ </div>`;
1681
1660
  }
1682
-
1683
1661
  return html``;
1684
1662
  }
1685
1663
 
1686
1664
  _renderFlowForm(readonlyMode) {
1687
1665
  if (this.flowSchema && this._flowStepSchema == null && this.documentation == null && this.selectedFlowsId.length === 1) {
1688
1666
  const flow = this.getSelectedFlow();
1689
-
1690
1667
  if (flow) {
1691
1668
  const values = deepClone(flow);
1692
- return html`<div slot="content" class="flow-settings"> <gv-schema-form .schema="${this.flowSchema}" id="settings-form" .values="${values}" has-header scrollable ?readonly="${readonlyMode}" @gv-schema-form:cancel="${this._onCancelFlow}" @gv-schema-form:submit="${this._onSubmitFlow}"> <div slot="title" class="flow-step__form-title">Flow configuration</div> </gv-schema-form> </div>`;
1669
+ return html`<div slot="content" class="flow-settings">
1670
+ <gv-schema-form
1671
+ .schema="${this.flowSchema}"
1672
+ id="settings-form"
1673
+ .values="${values}"
1674
+ has-header
1675
+ scrollable
1676
+ ?readonly="${readonlyMode}"
1677
+ @gv-schema-form:cancel="${this._onCancelFlow}"
1678
+ @gv-schema-form:submit="${this._onSubmitFlow}"
1679
+ >
1680
+ <div slot="title" class="flow-step__form-title">Flow configuration</div>
1681
+ </gv-schema-form>
1682
+ </div>`;
1693
1683
  }
1694
1684
  }
1695
1685
  }
1696
1686
 
1697
- _onResourcesChange({
1698
- detail
1699
- }) {
1687
+ _onResourcesChange({ detail }) {
1700
1688
  this.definition.resources = detail.resources;
1701
1689
  this.isDirty = true;
1702
1690
  }
1703
1691
 
1704
- _onPropertiesChange({
1705
- detail
1706
- }) {
1692
+ _onPropertiesChange({ detail }) {
1707
1693
  this.definition.properties = detail.properties;
1708
1694
  this.isDirty = true;
1709
1695
  }
1710
1696
 
1711
- _onSaveProvider({
1712
- detail
1713
- }) {
1697
+ _onSaveProvider({ detail }) {
1714
1698
  this.services['dynamic-property'] = detail.provider;
1715
1699
  this.isDirty = true;
1716
1700
  }
1717
1701
 
1718
- _onSwitchEncryptedProperty({
1719
- detail
1720
- }) {
1702
+ _onSwitchEncryptedProperty({ detail }) {
1721
1703
  this.isDirty = true;
1722
1704
  }
1723
1705
 
1724
1706
  render() {
1725
1707
  const readonlyMode = this._getReadonlyModeForDesign();
1726
1708
 
1727
- return html`<div class="box"> <gv-policy-studio-menu class="left-menu" .api-name="${this._definition.name}" .flows="${this.filteredFlows}" .plans="${this.filteredPlans}" .selectedIds="${this.selectedFlowsId}" ?disabled="${this._currentAskConfirmation}" ?sortable="${this.sortable && this.readonly !== true}" ?readonly="${this.readonly}" ?readonlyPlans="${this.readonlyPlans}" flows-title="${this.flowsTitle}" .query="${this._searchFlowQuery}" ?can-add="${this.canAdd && !this.readonly}" @gv-policy-studio-menu:reorder-flows="${this._onReorderFlows}" @gv-policy-studio-menu:change-flow-state="${this._onChangeFlowState}" @gv-policy-studio-menu:add-flow="${this._onAddFlow}" @gv-policy-studio-menu:add-flow-plan="${this._onAddFlowPlan}" @gv-policy-studio-menu:delete-flow="${this._onDeleteFlow}" @gv-policy-studio-menu:duplicate-flow="${this._onDuplicateFlow}" @gv-policy-studio-menu:select-flows="${this._onSelectFlows}"> <div slot="header" class="header-actions"> <div class="title">${this._definition.name}</div> ${this._flowFilterOptions != null ? html`<gv-option ?disabled="${this._currentAskConfirmation}" .options="${this._flowFilterOptions}" multiple="multiple" outlined .value="${this._flowFilter}" small @gv-option:select="${this._onFilterFlows}"></gv-option>` : ''} <gv-input ?disabled="${this._currentAskConfirmation}" id="search-flow" placeholder="Filter flows (Ctrl + Space)" type="search" small @gv-input:input="${this._onSearchFlows}" @gv-input:clear="${this._onClearFlows}"></gv-input> </div> ${this.readonly !== true ? html` <div slot="footer" class="footer-actions"> <gv-button class="btn-large" .disabled="${!this.isDirty || this._currentAskConfirmation}" @gv-button:click="${this._onSaveAll}">Save</gv-button> <gv-button link .disabled="${!this.isDirty || this._currentAskConfirmation}" @gv-button:click="${this._onResetAll}">Reset</gv-button> </div>` : ''} </gv-policy-studio-menu> <gv-tabs .value="${this.tabId}" .options="${this._tabs}" .disabled="${this._currentAskConfirmation}" @gv-tabs:change="${this._onChangeTab}" .validator="${this._changeTabValidator.bind(this)}"> ${this._renderDesign(readonlyMode)} ${this._renderConfigurationForm(readonlyMode)} ${this._renderDebug()} <gv-properties id="properties" slot="content" class="properties" .provider="${this.services['dynamic-property']}" @gv-properties:change="${this._onPropertiesChange}" @gv-properties:save-provider="${this._onSaveProvider}" @gv-properties:switch-encrypted="${this._onSwitchEncryptedProperty}" ?readonly="${readonlyMode}" encryptable="true" .properties="${this.definedProperties}" .providers="${this.propertyProviders}" .dynamicPropertySchema="${this.dynamicPropertySchema}"></gv-properties> <gv-resources id="resources" slot="content" class="resources" @gv-resources:change="${this._onResourcesChange}" ?readonly="${readonlyMode}" .resources="${this.definedResources}" .types="${this.resourceTypes}"></gv-resources> </gv-tabs> </div>`;
1709
+ return html`<div class="box">
1710
+ <gv-policy-studio-menu
1711
+ class="left-menu"
1712
+ .api-name="${this._definition.name}"
1713
+ .flows="${this.filteredFlows}"
1714
+ .plans="${this.filteredPlans}"
1715
+ .selectedIds="${this.selectedFlowsId}"
1716
+ ?disabled="${this._currentAskConfirmation}"
1717
+ ?sortable="${this.sortable && this.readonly !== true}"
1718
+ ?readonly="${this.readonly}"
1719
+ ?readonlyPlans="${this.readonlyPlans}"
1720
+ flows-title="${this.flowsTitle}"
1721
+ .query="${this._searchFlowQuery}"
1722
+ ?can-add="${this.canAdd && !this.readonly}"
1723
+ @gv-policy-studio-menu:reorder-flows="${this._onReorderFlows}"
1724
+ @gv-policy-studio-menu:change-flow-state="${this._onChangeFlowState}"
1725
+ @gv-policy-studio-menu:add-flow="${this._onAddFlow}"
1726
+ @gv-policy-studio-menu:add-flow-plan="${this._onAddFlowPlan}"
1727
+ @gv-policy-studio-menu:delete-flow="${this._onDeleteFlow}"
1728
+ @gv-policy-studio-menu:duplicate-flow="${this._onDuplicateFlow}"
1729
+ @gv-policy-studio-menu:select-flows="${this._onSelectFlows}"
1730
+ >
1731
+ <div slot="header" class="header-actions">
1732
+ <div class="title">${this._definition.name}</div>
1733
+ ${this._flowFilterOptions != null
1734
+ ? html`<gv-option
1735
+ ?disabled="${this._currentAskConfirmation}"
1736
+ .options="${this._flowFilterOptions}"
1737
+ multiple
1738
+ outlined
1739
+ .value="${this._flowFilter}"
1740
+ small
1741
+ @gv-option:select="${this._onFilterFlows}"
1742
+ ></gv-option>`
1743
+ : ''}
1744
+ <gv-input
1745
+ ?disabled="${this._currentAskConfirmation}"
1746
+ id="search-flow"
1747
+ placeholder="Filter flows (Ctrl + Space)"
1748
+ type="search"
1749
+ small
1750
+ @gv-input:input="${this._onSearchFlows}"
1751
+ @gv-input:clear="${this._onClearFlows}"
1752
+ ></gv-input>
1753
+ </div>
1754
+
1755
+ ${this.readonly !== true
1756
+ ? html` <div slot="footer" class="footer-actions">
1757
+ <gv-button
1758
+ class="btn-large"
1759
+ .disabled="${!this.isDirty || this._currentAskConfirmation}"
1760
+ @gv-button:click="${this._onSaveAll}"
1761
+ >Save</gv-button
1762
+ >
1763
+ <gv-button link .disabled="${!this.isDirty || this._currentAskConfirmation}" @gv-button:click="${this._onResetAll}"
1764
+ >Reset</gv-button
1765
+ >
1766
+ </div>`
1767
+ : ''}
1768
+ </gv-policy-studio-menu>
1769
+
1770
+ <gv-tabs
1771
+ .value="${this.tabId}"
1772
+ .options="${this._tabs}"
1773
+ .disabled="${this._currentAskConfirmation}"
1774
+ @gv-tabs:change="${this._onChangeTab}"
1775
+ .validator="${this._changeTabValidator.bind(this)}"
1776
+ >
1777
+ ${this._renderDesign(readonlyMode)} ${this._renderConfigurationForm(readonlyMode)} ${this._renderDebug()}
1778
+ <gv-properties
1779
+ id="properties"
1780
+ slot="content"
1781
+ class="properties"
1782
+ .provider="${this.services['dynamic-property']}"
1783
+ @gv-properties:change="${this._onPropertiesChange}"
1784
+ @gv-properties:save-provider="${this._onSaveProvider}"
1785
+ @gv-properties:switch-encrypted="${this._onSwitchEncryptedProperty}"
1786
+ ?readonly="${readonlyMode}"
1787
+ encryptable="true"
1788
+ .properties="${this.definedProperties}"
1789
+ .providers="${this.propertyProviders}"
1790
+ .dynamicPropertySchema="${this.dynamicPropertySchema}"
1791
+ ></gv-properties>
1792
+ <gv-resources
1793
+ id="resources"
1794
+ slot="content"
1795
+ class="resources"
1796
+ @gv-resources:change="${this._onResourcesChange}"
1797
+ ?readonly="${readonlyMode}"
1798
+ .resources="${this.definedResources}"
1799
+ .types="${this.resourceTypes}"
1800
+ ></gv-resources>
1801
+ </gv-tabs>
1802
+ </div>`;
1728
1803
  }
1804
+
1729
1805
  /**
1730
1806
  * Determine if the design view should be in readonly mode or not
1731
1807
  * It is in readonly mode if:
@@ -1737,42 +1813,30 @@ export class GvPolicyStudio extends KeyboardElement(LitElement) {
1737
1813
  * @returns {boolean|*|{type: BooleanConstructor}|{attribute: string, type: BooleanConstructor}|{type: *}|{attribute: string, type: *}}
1738
1814
  * @private
1739
1815
  */
1740
-
1741
-
1742
1816
  _getReadonlyModeForDesign() {
1743
1817
  if (this.readonly) {
1744
1818
  return true;
1745
1819
  }
1746
1820
 
1747
1821
  const flow = this.getSelectedFlow(0);
1748
-
1749
1822
  if (!flow) {
1750
1823
  return false;
1751
1824
  }
1752
1825
 
1753
- const {
1754
- plan: flowPlan
1755
- } = this._findFlowCollection(flow._id);
1756
-
1826
+ const { plan: flowPlan } = this._findFlowCollection(flow._id);
1757
1827
  const readonlyMode = flowPlan && this.readonlyPlans;
1758
-
1759
1828
  if (readonlyMode) {
1760
1829
  return true;
1761
1830
  }
1762
1831
 
1763
1832
  const comparedFlow = this.getSelectedFlow(1);
1764
-
1765
1833
  if (!comparedFlow) {
1766
1834
  return false;
1767
1835
  }
1768
1836
 
1769
- const {
1770
- plan: comparedFlowPlan
1771
- } = this._findFlowCollection(comparedFlow._id);
1772
-
1837
+ const { plan: comparedFlowPlan } = this._findFlowCollection(comparedFlow._id);
1773
1838
  return comparedFlowPlan && this.readonlyPlans;
1774
1839
  }
1775
-
1776
1840
  }
1841
+
1777
1842
  window.customElements.define('gv-policy-studio', GvPolicyStudio);
1778
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4vbm9kZV9tb2R1bGVzL0BncmF2aXRlZS91aS1jb21wb25lbnRzL3BvbGljeS1zdHVkaW8vZ3YtcG9saWN5LXN0dWRpby5qcyJdLCJuYW1lcyI6WyJjc3MiLCJodG1sIiwiTGl0RWxlbWVudCIsIm1ldGhvZHMiLCJkaXNwYXRjaEN1c3RvbUV2ZW50IiwiaTE4biIsImVtcHR5IiwiY2FjaGUiLCJkZWVwQ2xvbmUiLCJkZWVwRXF1YWwiLCJLZXlib2FyZEVsZW1lbnQiLCJLRVlTIiwiRkxPV19TVEVQX0ZPUk1fSUQiLCJHdlBvbGljeVN0dWRpbyIsInByb3BlcnRpZXMiLCJwb2xpY2llcyIsInR5cGUiLCJBcnJheSIsInNlcnZpY2VzIiwiT2JqZWN0IiwicmVzb3VyY2VUeXBlcyIsImF0dHJpYnV0ZSIsInByb3BlcnR5UHJvdmlkZXJzIiwiZHluYW1pY1Byb3BlcnR5U2NoZW1hIiwidGFiSWQiLCJTdHJpbmciLCJfdGFiSWQiLCJkZWZpbml0aW9uIiwiX2RlZmluaXRpb24iLCJkb2N1bWVudGF0aW9uIiwiZmxvd1NjaGVtYSIsImNvbmZpZ3VyYXRpb25TY2hlbWEiLCJfY29uZmlndXJhdGlvblNjaGVtYSIsImNvbmZpZ3VyYXRpb25JbmZvcm1hdGlvbiIsImlzRGlydHkiLCJCb29sZWFuIiwicmVmbGVjdCIsIl9kcmFnUG9saWN5IiwiX2Ryb3BQb2xpY3kiLCJzZWxlY3RlZEZsb3dzSWQiLCJfc2VsZWN0ZWRGbG93c0lkIiwiX2N1cnJlbnRQb2xpY3lJZCIsIl9zZWFyY2hQb2xpY3lRdWVyeSIsIl9zZWFyY2hGbG93UXVlcnkiLCJfZmxvd1N0ZXBTY2hlbWEiLCJfY3VycmVudEZsb3dTdGVwIiwiX3BvbGljeUZpbHRlciIsIl9mbG93RmlsdGVyIiwiX2N1cnJlbnRBc2tDb25maXJtYXRpb24iLCJoYXNQcm9wZXJ0aWVzIiwiX2hhc1Byb3BlcnRpZXMiLCJoYXNSZXNvdXJjZXMiLCJoYXNQb2xpY3lGaWx0ZXIiLCJmbG93c1RpdGxlIiwic29ydGFibGUiLCJjYW5BZGQiLCJyZWFkb25seSIsInJlYWRvbmx5UGxhbnMiLCJjYW5EZWJ1ZyIsIl9jYW5EZWJ1ZyIsImRlYnVnUmVzcG9uc2UiLCJoYXNDb25kaXRpb25hbFN0ZXBzIiwic3R5bGVzIiwiY29uc3RydWN0b3IiLCJmbG93cyIsIl90YWJzIiwiaWQiLCJ0aXRsZSIsImljb24iLCJ2YWx1ZSIsInRoZW4iLCJyZXF1ZXN0VXBkYXRlIiwiX2Zsb3dGaWx0ZXJPcHRpb25zIiwiZGVmaW5lZFBsYW5zIiwibGVuZ3RoIiwiX3BvbGljeUZpbHRlck9wdGlvbnMiLCJzcGxpY2UiLCJvbktleWJvYXJkIiwiaXNQcmVzc2VkIiwiU2hpZnQiLCJDdHJsIiwiU3BhY2UiLCJzZWFyY2giLCJzaGFkb3dSb290IiwicXVlcnlTZWxlY3RvciIsImZvY3VzIiwiaW5jbHVkZXMiLCJfZ2VuZXJhdGVGbG93c0lkIiwicmVzb3VyY2VzIiwiX2dlbmVyYXRlSWQiLCJwbGFucyIsIm1hcCIsInBsYW4iLCJfZ2VuZXJhdGVQbGFuRmxvd3NJZCIsIl9pbml0aWFsRGVmaW5pdGlvbiIsIl9zZWxlY3RGaXJzdEZsb3ciLCJpc0FycmF5IiwiZmlsdGVyIiwiX2ZpbmRGbG93QnlJZCIsIl91cGRhdGVTZWxlY3RlZEZsb3dzIiwiZGlzcGF0Y2giLCJjYW5kaWRhdGUiLCJkZWZpbmVkRmxvd3MiLCJfaWQiLCJmaW5kIiwiX2dldEZsb3dFbGVtZW50IiwiZmxvd0lkIiwiX29uRHJhZ0VuZFBvbGljeSIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJmb3JFYWNoIiwiZSIsIm9uRHJhZ0VuZCIsIl9vbkRyb3BQb2xpY3kiLCJkZXRhaWwiLCJfYXNrVG9WYWxpZGF0ZUZvcm1zIiwicG9saWN5IiwidGFyZ2V0RmxvdyIsIm5hbWUiLCJkZXNjcmlwdGlvbiIsImNvbmZpZ3VyYXRpb24iLCJfbmV3IiwiZmxvd1N0ZXAiLCJfZ2VuZXJhdGVGbG93U3RlcElkIiwiZmxvd0tleSIsInBvc2l0aW9uIiwiZW5hYmxlZCIsInNvdXJjZUZsb3ciLCJzb3VyY2VGbG93SWQiLCJzb3VyY2VQb3NpdGlvbiIsInNvdXJjZUZsb3dLZXkiLCJzdGVwIiwiZ3JvdXAiLCJzY2hlbWEiLCJidWlsZFNjaGVtYSIsIl9zZXRDdXJyZW50Rmxvd1N0ZXAiLCJjdXJyZW50Rmxvd0Zvcm0iLCJfZ2V0Rmxvd1N0ZXBGb3JtIiwiZGlydHkiLCJjYW5jZWxFZGl0Iiwic2V0VGltZW91dCIsIl9lZGl0Rmxvd1N0ZXAiLCJmbG93IiwidXBkYXRlQ29tcGxldGUiLCJmbG93RWxlbWVudCIsInNlbGVjdGVkU3RlcElkIiwiX2RpcnR5IiwiZ3ZGbG93IiwicmVtb3ZlQ2FuZGlkYXRlIiwiX29uRGVsZXRlUG9saWN5IiwidGFyZ2V0IiwiZWRpdGluZyIsIl9jbG9zZUZsb3dTdGVwRm9ybSIsIl9vbkRlc2lnbiIsIl9jaGFuZ2VUYWIiLCJfc3BsaXRNYWluVmlld3MiLCJjb25kaXRpb24iLCJqc29uU2NoZW1hIiwiSlNPTiIsInBhcnNlIiwiY3VycmVudEZsb3dTdGVwIiwibG9jYWxTdG9yYWdlIiwiZ2V0SXRlbSIsIl9vbk9wZW5Eb2N1bWVudGF0aW9uIiwiX21heGltaXplVG9wVmlldyIsIl9vbkVkaXRGbG93U3RlcCIsIl9nZXRSZXNpemFibGVWaWV3cyIsIm1heGltaXplVG9wIiwiX21heGltaXplQm90dG9tVmlldyIsIm1heGltaXplQm90dG9tIiwic3BsaXQiLCJfb25DaGFuZ2VGbG93U3RlcFN0YXRlIiwiX29uQ2xvc2VGbG93U3RlcEZvcm0iLCJlcnIiLCJmb3JjZSIsIlByb21pc2UiLCJhbGwiLCJfc3VibWl0T3JDb25maXJtRm9ybXMiLCJmb3JtcyIsInIiLCJfYnVpbGREZWZpbml0aW9uVG9TYXZlIiwiZ2V0Q2hpbGRyZW4iLCJfY2hlY2tDdXJyZW50Rmxvd1N0ZXAiLCJFcnJvciIsImZsb3dTdGVwU2NoZW1hIiwiX2luaXRpYWxWYWx1ZXMiLCJzY29wZSIsIl9lbnVtIiwiZW51bSIsImZpbHRlcmVkIiwiZGVmYXVsdCIsIl92YWx1ZXMiLCJfcmVmcmVzaCIsImNsb3NlU3RlcEZvcm0iLCJfb25TZWxlY3RGbG93cyIsIl9vbkNsb3NlRG9jdW1lbnRhdGlvbiIsIl9vbk9wZW5Eb2N1bWVudGF0aW9uRnJvbU1lbnUiLCJnZXRTZWxlY3RlZEZsb3ciLCJfZmV0Y2hEb2N1bWVudGF0aW9uIiwiX29uT3BlbkRvY3VtZW50YXRpb25Gcm9tRm9ybSIsInJlbW92ZUl0ZW0iLCJfZmluZEZsb3dDb2xsZWN0aW9uIiwicGxhbnNGbG93cyIsInJlZHVjZSIsImFjYyIsInZhbCIsImNvbmNhdCIsImluZGV4Iiwic2VsZWN0ZWRGbG93SWQiLCJfb25UYXJnZXRQb2xpY3kiLCJfb25DaGFuZ2VGbG93U3RlcCIsInZhbHVlcyIsIl93cml0ZUZsb3dTdGVwIiwiZmluZEluZGV4IiwiX29uU3VibWl0Rmxvd1N0ZXAiLCJjIiwiX29uQ2FuY2VsRmxvdyIsIl9vblN1Ym1pdEZsb3ciLCJzZWxlY3RlZEZsb3ciLCJhc3NpZ24iLCJfY3JlYXRlRmxvd0Zyb21TY2hlbWEiLCJzZWxlY3RlZEZsb3dVcGRhdGVkIiwiX29uQ2FuY2VsRmxvd01vZGUiLCJfb25TdWJtaXRGbG93TW9kZSIsIl9vbkNoYW5nZVRhYiIsIl9jaGFuZ2VUYWJWYWxpZGF0b3IiLCJmcm9tIiwidG8iLCJjb21wb25lbnQiLCJjb25maXJtIiwicmVzb2x2ZSIsIl9vbkRyYWdTdGFydEZsb3dTdGVwIiwiX3JlbmRlckZsb3dFbXB0eVN0YXRlIiwicmVhZG9ubHlNb2RlIiwiX29uQWRkRmxvdyIsIl9yZW5kZXJGbG93IiwiaGFzRW1wdHlTdGF0ZSIsImJpbmQiLCJfb25GZXRjaFJlc291cmNlcyIsImV2ZW50IiwiY3VycmVudFRhcmdldCIsInJlZ2V4VHlwZXMiLCJvcHRpb25zIiwiZGVmaW5lZFJlc291cmNlcyIsInJlc291cmNlIiwiUmVnRXhwIiwidGVzdCIsInJlc291cmNlVHlwZSIsInJvdyIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsInBpY3R1cmUiLCJpdGVtIiwiZWxlbWVudCIsIl9yZW5kZXJQb2xpY3kiLCJfcmVuZGVyRmxvd1N0ZXBGb3JtIiwiY29udGVudCIsImltYWdlIiwiX29uUmVzZXRGbG93U3RlcCIsInJlc2V0IiwibGlzdCIsInByZWZpeCIsImlzRmxvdyIsInByZSIsInN0ZXBJbmRleCIsInBvc3QiLCJnZXRVcGRhdGVDb21wbGV0ZSIsInNob3VsZFVwZGF0ZSIsImNoYW5nZWRQcm9wZXJ0aWVzIiwiaGFzIiwiZHJhZ1BvbGljeSIsImRyb3BQb2xpY3kiLCJ1cGRhdGVkIiwicHJvcHMiLCJncm91cHMiLCJpdGVtcyIsInNldEl0ZW0iLCJfb25EZWxldGVGbG93IiwiX2RlbGV0ZUZsb3ciLCJkZWZpbmVkUHJvcGVydGllcyIsIl9vbkR1cGxpY2F0ZUZsb3ciLCJfYWRkRmxvdyIsInBsYW5JbmRleCIsInAiLCJpIiwiX29uQ2hhbmdlRmxvd1N0YXRlIiwiX29uQWRkRmxvd1BsYW4iLCJjb2xsZWN0aW9uIiwiZHVwbGljYXRlIiwicHVzaCIsIm5ld0Zsb3ciLCJfaW5zdGFudGlhdGUiLCJwcm9wZXJ0aWVzRGVmaW5pdGlvbiIsImluaXRpYXRvciIsInByb3BlcnR5Iiwia2V5Iiwia2V5cyIsImVudHJ5IiwidW5kZWZpbmVkIiwiaW5kZXhPZiIsInNlbGVjdGVkRmxvd3MiLCJfZmluZEZsb3dJbmRleCIsImYiLCJfb25SZW9yZGVyRmxvd3MiLCJuZXdPcmRlciIsIl9vblNlYXJjaFBvbGljeSIsIl9vbkNsZWFyUG9saWN5IiwiX29uU2VhcmNoRmxvd3MiLCJfb25DbGVhckZsb3dzIiwiX29uUmVzZXRBbGwiLCJfZmlsdGVyTm90VmFsaWRTdGVwIiwiX3JlbW92ZVByaXZhdGVQcm9wZXJ0aWVzIiwibyIsImNvcHkiLCJzdGFydHNXaXRoIiwiZm9ybSIsImlzVmFsaWQiLCJzdWJtaXQiLCJnZXRQcm9wZXJ0aWVzRWxlbWVudCIsImNsb3NlUHJvbWlzZXMiLCJjdXJyZW50U3RlcCIsInNhdmVkIiwiX2RlZmluaXRpb25TYXZlZCIsIl9idWlsZERlZmluaXRpb25Ub1NlbmQiLCJkZWZpbml0aW9uVG9TYXZlIiwiX29uU2F2ZUFsbCIsImNhdGNoIiwiY29uc29sZSIsImVycm9yIiwiX29uRGVidWciLCJyZXF1ZXN0RXZlbnQiLCJyZXF1ZXN0IiwiZmlsdGVyZWRGbG93cyIsImZpbHRlcmVkUGxhbnMiLCJfb25GaWx0ZXJGbG93cyIsIl9nZXRGaWx0ZXJlZFBvbGljaWVzIiwib25SZXF1ZXN0Iiwib25SZXNwb25zZSIsIl9vbkZpbHRlclBvbGljaWVzIiwiX3JlbmRlckRlc2lnbiIsIl9yZW5kZXJGbG93Rm9ybSIsIl9yZW5kZXJEZWJ1ZyIsInJlc3BvbnNlIiwiaXNMb2FkaW5nIiwicGF0aCIsIm1ldGhvZCIsIl9yZW5kZXJDb25maWd1cmF0aW9uRm9ybSIsIl9vblJlc291cmNlc0NoYW5nZSIsIl9vblByb3BlcnRpZXNDaGFuZ2UiLCJfb25TYXZlUHJvdmlkZXIiLCJwcm92aWRlciIsIl9vblN3aXRjaEVuY3J5cHRlZFByb3BlcnR5IiwicmVuZGVyIiwiX2dldFJlYWRvbmx5TW9kZUZvckRlc2lnbiIsImZsb3dQbGFuIiwiY29tcGFyZWRGbG93IiwiY29tcGFyZWRGbG93UGxhbiIsIndpbmRvdyIsImN1c3RvbUVsZW1lbnRzIiwiZGVmaW5lIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTQSxHQUFULEVBQWNDLElBQWQsRUFBb0JDLFVBQXBCLFFBQXNDLEtBQXRDO0FBQ0EsU0FBU0MsT0FBVCxRQUF3QixlQUF4QjtBQUNBLFNBQVNDLG1CQUFULFFBQW9DLGVBQXBDO0FBQ0EsU0FBU0MsSUFBVCxRQUFxQixhQUFyQjtBQUNBLE9BQU8sb0JBQVA7QUFDQSxPQUFPLGtCQUFQO0FBQ0EsT0FBTyx3QkFBUDtBQUNBLE9BQU8sK0JBQVA7QUFDQSxPQUFPLGlDQUFQO0FBQ0EsT0FBTyw2QkFBUDtBQUNBLE9BQU8sNkJBQVA7QUFDQSxPQUFPLHNCQUFQO0FBQ0EsT0FBTyxxQkFBUDtBQUNBLE9BQU8sV0FBUDtBQUNB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LEVBQW1CO0FBQ2pCLGFBQU8sS0FBUDtBQUNEOztBQUVELFVBQU07QUFBRXRRLE1BQUFBLElBQUksRUFBRXVRO0FBQVIsUUFBNkIsS0FBSzNKLG1CQUFMLENBQXlCMEosWUFBWSxDQUFDM1AsR0FBdEMsQ0FBbkM7O0FBQ0EsV0FBTzRQLGdCQUFnQixJQUFJLEtBQUsxUyxhQUFoQztBQUNEOztBQXB1RDZEO0FBdXVEaEUyUyxNQUFNLENBQUNDLGNBQVAsQ0FBc0JDLE1BQXRCLENBQTZCLGtCQUE3QixFQUFpRHpWLGNBQWpEIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgR3Jhdml0ZWUgdGVhbSAoaHR0cDovL2dyYXZpdGVlLmlvKVxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IGNzcywgaHRtbCwgTGl0RWxlbWVudCB9IGZyb20gJ2xpdCc7XG5pbXBvcnQgeyBtZXRob2RzIH0gZnJvbSAnLi4vbGliL3N0dWRpbyc7XG5pbXBvcnQgeyBkaXNwYXRjaEN1c3RvbUV2ZW50IH0gZnJvbSAnLi4vbGliL2V2ZW50cyc7XG5pbXBvcnQgeyBpMThuIH0gZnJvbSAnLi4vbGliL2kxOG4nO1xuaW1wb3J0ICcuLi9hdG9tcy9ndi1idXR0b24nO1xuaW1wb3J0ICcuLi9hdG9tcy9ndi1pY29uJztcbmltcG9ydCAnLi4vbW9sZWN1bGVzL2d2LW9wdGlvbic7XG5pbXBvcnQgJy4uL29yZ2FuaXNtcy9ndi1kb2N1bWVudGF0aW9uJztcbmltcG9ydCAnLi4vb3JnYW5pc21zL2d2LXJlc2l6YWJsZS12aWV3cyc7XG5pbXBvcnQgJy4uL29yZ2FuaXNtcy9ndi1zY2hlbWEtZm9ybSc7XG5pbXBvcnQgJy4uL29yZ2FuaXNtcy9ndi1odHRwLWNsaWVudCc7XG5pbXBvcnQgJy4uL29yZ2FuaXNtcy9ndi10YWJzJztcbmltcG9ydCAnLi4vbW9sZWN1bGVzL2d2LXJvdyc7XG5pbXBvcnQgJy4vZ3YtZmxvdyc7XG5pbXBvcnQgJy4vZ3YtZmxvdy1zdGVwJztcbmltcG9ydCAnLi9ndi1wb2xpY3ktc3R1ZGlvLW1lbnUnO1xuaW1wb3J0IHsgZW1wdHkgfSBmcm9tICcuLi9zdHlsZXMvZW1wdHknO1xuaW1wb3J0IHsgY2FjaGUgfSBmcm9tICdsaXQvZGlyZWN0aXZlcy9jYWNoZSc7XG5pbXBvcnQgeyBkZWVwQ2xvbmUsIGRlZXBFcXVhbCB9IGZyb20gJy4uL2xpYi91dGlscyc7XG5pbXBvcnQgeyBLZXlib2FyZEVsZW1lbnQsIEtFWVMgfSBmcm9tICcuLi9taXhpbnMva2V5Ym9hcmQtZWxlbWVudCc7XG5cbmNvbnN0IEZMT1dfU1RFUF9GT1JNX0lEID0gJ2Zsb3ctc3RlcC1mb3JtJztcblxuLyoqXG4gKiAgU3R1ZGlvIFBvbGljeSBjb21wb25lbnRcbiAqXG4gKiDimqDvuI8gVGhpcyBjb21wb25lbnQgaXMgYmFzZWQgb24gYGFzY2lpZG9jdG9yYCwgYGhpZ2hsaWdodC5qc2AgYW5kIGBhc2NpaWRvY3Rvci1oaWdobGlnaHQuanNgLlxuICogVG8gdXNlIHRoaXMgY29tcG9uZW50IGluIHlvdXIgcHJvamVjdCBiZSBzdXJlIHRoZSBkZXBlbmRlbmNpZXMgYXJlIGluc3RhbGxlZCBvclxuICogaW5zdGFsbCB0aGVtIHdpdGg6IGBucG0gaW5zdGFsbCBhc2NpaWRvY3RvciBoaWdobGlnaHQuanMgYXNjaWlkb2N0b3ItaGlnaGxpZ2h0LmpzIC0tc2F2ZWBcbiAqXG4gKiBAZmlyZXMgZ3YtcG9saWN5LXN0dWRpbzpzZWxlY3QtcG9saWN5IC0gU2VsZWN0IHBvbGljeSBldmVudFxuICogQGZpcmVzIGd2LXBvbGljeS1zdHVkaW86c2F2ZSAtIEV2ZW50IHNlbnQgd2hlbiBcIlNhdmVcIiBidXR0b24gaXMgY2xpY2tlZCwgaXQgY29udGFpbnMgdGhlIHdob2xlIGRlZmluaXRpb24gb2YgdGhlIEFQSVxuICogQGZpcmVzIGd2LXBvbGljeS1zdHVkaW86ZGVidWcgLSBFdmVudCBzZW50IHdoZW4gdmFsaWRhdGlvbiBidXR0b24gb2YgdGhlICdUcnkgaXQnIHRhYiBpcyBjbGlja2VkLCBpdCBjb250YWlucyB0aGUgd2hvbGUgZGVmaW5pdGlvbiBvZiB0aGUgQVBJIGFuZCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRyeSBpdCByZXF1ZXN0LlxuICpcbiAqIEBhdHRyIHtBcnJheX0gcG9saWNpZXMgLSBQb2xpY2llcyBhdmFpbGFibGVcbiAqIEBhdHRyIHtBcnJheX0gc2VydmljZXMgLSBTZXJ2aWNlcyBhdmFpbGFibGVcbiAqIEBhdHRyIHtBcnJheX0gcmVzb3VyY2VUeXBlcyAtIFJlc291cmNlcyB0eXBlcyBhdmFpbGFibGVcbiAqIEBhdHRyIHtBcnJheX0gcHJvcGVydHlQcm92aWRlcnMgLSBQcm92aWRlcnMgb2YgcHJvcGVydGllc1xuICogQGF0dHIge0FycmF5fSBkeW5hbWljUHJvcGVydHlTY2hlbWEgLSBTY2hlbWEgZm9yIHRoZSBkeW5hbWljIHByb3BlcnR5IGZvcm1cbiAqIEBhdHRyIHtTdHJpbmd9IHRhYklkIC0gQ3VycmVudCB0YWJJZCB0byBkaXNwbGF5IChkZXNpZ24sIHNldHRpbmdzLCBwcm9wZXJ0aWVzIG9yIHJlc291cmNlcylcbiAqIEBhdHRyIHtPYmplY3R9IGRlZmluaXRpb24gLSBUaGUgZGVmaW5pdGlvbiBvZiBmbG93c1xuICogQGF0dHIge09iamVjdH0gZG9jdW1lbnRhdGlvbiAtIFRoZSBkb2N1bWVudGF0aW9uIHRvIGRpc3BsYXlcbiAqIEBhdHRyIHtPYmplY3R9IGZsb3dTY2hlbWEgLSBUaGUgZmxvdyBmb3JtIGNvbmZpZ3VyYXRpb24gdG8gZGlzcGxheSBpbiBndi1zY2hlbWEtZm9ybSBjb21wb25lbnRcbiAqIEBhdHRyIHtPYmplY3R9IGNvbmZpZ3VyYXRpb25TY2hlbWEgLSBUaGUgZm9ybSBjb25maWd1cmF0aW9uIHRvIGRpc3BsYXkgaW4gZ3Ytc2NoZW1hLWZvcm0gY29tcG9uZW50XG4gKiBAYXR0ciB7T2JqZWN0fSBjb25maWd1cmF0aW9uSW5mb3JtYXRpb24gLSBUaGUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBhcGkgY29uZmlndXJhdGlvbiB0YWJcbiAqIEBhdHRyIHtCb29sZWFufSBpc0RpcnR5IC0gdHJ1ZSBpZiBjb21wb25lbnQgaXMgZGlydHlcbiAqIEBhdHRyIHtBcnJheX0gc2VsZWN0ZWRGbG93c0lkIC0gVGhlIHNlbGVjdGVkIGZsb3dzIGlkXG4gKiBAYXR0ciB7Qm9vbGVhbn0gc29ydGFibGUgLSB0cnVlIGlmIGZsb3dzIGFyZSBzb3J0YWJsZVxuICogQGF0dHIge0Jvb2xlYW59IHJlYWRvbmx5IC0gdHJ1ZSBpZiByZWFkb25seVxuICogQGF0dHIge0Jvb2xlYW59IHJlYWRvbmx5LXBsYW5zIC0gdHJ1ZSBpZiBwbGFucycgZmxvd3MgY2FuJ3QgYmUgbW9kaWZpZWRcbiAqIEBhdHRyIHtCb29sZWFufSBjYW4tYWRkIC0gdHJ1ZSBpZiB1c2VyIGNhbiBhZGQgZmxvd1xuICogQGF0dHIge1N0cmluZ30gZmxvd3NUaXRsZSAtIGZsb3dzIG1lbnUgdGl0bGVcbiAqIEBhdHRyIHtCb29sZWFufSBoYXMtcG9saWN5LWZpbHRlciAtIHRydWUgaWYgcG9saWNpZXMgaGF2ZSBvblJlcXVlc3Qvb25SZXNwb25zZSBwcm9wZXJ0aWVzXG4gKiBAYXR0ciB7Qm9vbGVhbn0gY2FuLWRlYnVnIC0gdHJ1ZSBpZiBkZWJ1ZyB0YWIgc2hvdWxkIGJlIGRpc3BsYXllZFxuICogQGF0dHIge09iamVjdH0gZGVidWdSZXNwb25zZSAtIHRydWUgaWYgZGVidWcgdGFiIHNob3VsZCBiZSBkaXNwbGF5ZWRcbiAqIEBhdHRyIHtCb29sZWFufSBoYXMtY29uZGl0aW9uYWwtc3RlcHMgLSB0cnVlIGlmIHN0ZXBzIGNhbiBiZSBjb25kaXRpb25lZFxuICovXG5leHBvcnQgY2xhc3MgR3ZQb2xpY3lTdHVkaW8gZXh0ZW5kcyBLZXlib2FyZEVsZW1lbnQoTGl0RWxlbWVudCkge1xuICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBvbGljaWVzOiB7IHR5cGU6IEFycmF5IH0sXG4gICAgICBzZXJ2aWNlczogeyB0eXBlOiBPYmplY3QgfSxcbiAgICAgIHJlc291cmNlVHlwZXM6IHsgdHlwZTogQXJyYXksIGF0dHJpYnV0ZTogJ3Jlc291cmNlLXR5cGVzJyB9LFxuICAgICAgcHJvcGVydHlQcm92aWRlcnM6IHsgdHlwZTogQXJyYXksIGF0dHJpYnV0ZTogJ3Byb3BlcnR5LXByb3ZpZGVycycgfSxcbiAgICAgIGR5bmFtaWNQcm9wZXJ0eVNjaGVtYTogeyB0eXBlOiBPYmplY3QsIGF0dHJpYnV0ZTogJ2R5bmFtaWMtcHJvcGVydHktc2NoZW1hJyB9LFxuICAgICAgdGFiSWQ6IHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICd0YWItaWQnIH0sXG4gICAgICBfdGFiSWQ6IHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6IGZhbHNlIH0sXG4gICAgICBkZWZpbml0aW9uOiB7IHR5cGU6IE9iamVjdCB9LFxuICAgICAgX2RlZmluaXRpb246IHsgdHlwZTogT2JqZWN0LCBhdHRyaWJ1dGU6IGZhbHNlIH0sXG4gICAgICBkb2N1bWVudGF0aW9uOiB7IHR5cGU6IE9iamVjdCB9LFxuICAgICAgZmxvd1NjaGVtYTogeyB0eXBlOiBPYmplY3QsIGF0dHJpYnV0ZTogJ2Zsb3ctc2NoZW1hJyB9LFxuICAgICAgY29uZmlndXJhdGlvblNjaGVtYTogeyB0eXBlOiBPYmplY3QsIGF0dHJpYnV0ZTogJ2NvbmZpZ3VyYXRpb24tc2NoZW1hJyB9LFxuICAgICAgX2NvbmZpZ3VyYXRpb25TY2hlbWE6IHsgdHlwZTogT2JqZWN0LCBhdHRyaWJ1dGU6IGZhbHNlIH0sXG4gICAgICBjb25maWd1cmF0aW9uSW5mb3JtYXRpb246IHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdjb25maWd1cmF0aW9uLWluZm9ybWF0aW9uJyB9LFxuICAgICAgaXNEaXJ0eTogeyB0eXBlOiBCb29sZWFuLCBhdHRyaWJ1dGU6ICdkaXJ0eScsIHJlZmxlY3Q6IHRydWUgfSxcbiAgICAgIF9kcmFnUG9saWN5OiB7IHR5cGU6IE9iamVjdCwgYXR0cmlidXRlOiBmYWxzZSB9LFxuICAgICAgX2Ryb3BQb2xpY3k6IHsgdHlwZTogT2JqZWN0LCBhdHRyaWJ1dGU6IGZhbHNlIH0sXG4gICAgICBzZWxlY3RlZEZsb3dzSWQ6IHsgdHlwZTogQXJyYXksIGF0dHJpYnV0ZTogJ3NlbGVjdGVkLWZsb3dzLWlkJyB9LFxuICAgICAgX3NlbGVjdGVkRmxvd3NJZDogeyB0eXBlOiBBcnJheSwgYXR0cmlidXRlOiBmYWxzZSB9LFxuICAgICAgX2N1cnJlbnRQb2xpY3lJZDogeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogZmFsc2UgfSxcbiAgICAgIF9zZWFyY2hQb2xpY3lRdWVyeTogeyB0eXBlOiBTdHJpbmcsIGF0dHJpYnV0ZTogZmFsc2UgfSxcbiAgICAgIF9zZWFyY2hGbG93UXVlcnk6IHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6IGZhbHNlIH0sXG4gICAgICBfZmxvd1N0ZXBTY2hlbWE6IHsgdHlwZTogT2JqZWN0LCBhdHRyaWJ1dGU6IGZhbHNlIH0sXG4gICAgICBfY3VycmVudEZsb3dTdGVwOiB7IHR5cGU6IE9iamVjdCwgYXR0cmlidXRlOiBmYWxzZSB9LFxuICAgICAgX3BvbGljeUZpbHRlcjogeyB0eXBlOiBBcnJheSwgYXR0cmlidXRlOiBmYWxzZSB9LFxuICAgICAgX2Zsb3dGaWx0ZXI6IHsgdHlwZTogQXJyYXksIGF0dHJpYnV0ZTogZmFsc2UgfSxcbiAgICAgIF9jdXJyZW50QXNrQ29uZmlybWF0aW9uOiB7IHR5cGU6IEJvb2xlYW4sIGF0dHJpYnV0ZTogZmFsc2UgfSxcbiAgICAgIGhhc1Byb3BlcnRpZXM6IHsgdHlwZTogQm9vbGVhbiwgYXR0cmlidXRlOiAnaGFzLXByb3BlcnRpZXMnIH0sXG4gICAgICBfaGFzUHJvcGVydGllczogeyB0eXBlOiBCb29sZWFuLCBhdHRyaWJ1dGU6IGZhbHNlIH0sXG4gICAgICBoYXNSZXNvdXJjZXM6IHsgdHlwZTogQm9vbGVhbiwgYXR0cmlidXRlOiAnaGFzLXJlc291cmNlcycgfSxcbiAgICAgIGhhc1BvbGljeUZpbHRlcjogeyB0eXBlOiBCb29sZWFuLCBhdHRyaWJ1dGU6ICdoYXMtcG9saWN5LWZpbHRlcicgfSxcbiAgICAgIGZsb3dzVGl0bGU6IHsgdHlwZTogU3RyaW5nLCBhdHRyaWJ1dGU6ICdmbG93cy10aXRsZScgfSxcbiAgICAgIHNvcnRhYmxlOiB7IHR5cGU6IEJvb2xlYW4gfSxcbiAgICAgIGNhbkFkZDogeyB0eXBlOiBCb29sZWFuLCBhdHRyaWJ1dGU6ICdjYW4tYWRkJyB9LFxuICAgICAgcmVhZG9ubHk6IHsgdHlwZTogQm9vbGVhbiB9LFxuICAgICAgcmVhZG9ubHlQbGFuczogeyB0eXBlOiBCb29sZWFuLCBhdHRyaWJ1dGU6ICdyZWFkb25seS1wbGFucycgfSxcbiAgICAgIGNhbkRlYnVnOiB7IHR5cGU6IEJvb2xlYW4sIGF0dHJpYnV0ZTogJ2Nhbi1kZWJ1ZycgfSxcbiAgICAgIF9jYW5EZWJ1ZzogeyB0eXBlOiBCb29sZWFuLCBhdHRyaWJ1dGU6IGZhbHNlIH0sXG4gICAgICBkZWJ1Z1Jlc3BvbnNlOiB7IHR5cGU6IE9iamVjdCwgYXR0cmlidXRlOiAnZGVidWctcmVzcG9uc2UnIH0sXG4gICAgICBoYXNDb25kaXRpb25hbFN0ZXBzOiB7IHR5cGU6IEJvb2xlYW4sIGF0dHJpYnV0ZTogJ2hhcy1jb25kaXRpb25hbC1zdGVwcycgfSxcbiAgICB9O1xuICB9XG5cbiAgc3RhdGljIGdldCBzdHlsZXMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGVtcHR5LFxuICAgICAgbWV0aG9kcyxcbiAgICAgIC8vIGxhbmd1YWdlPUNTU1xuICAgICAgY3NzYFxuICAgICAgICA6aG9zdCB7XG4gICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgICAtLWhlaWdodDogdmFyKC0tZ3YtcG9saWN5LXN0dWRpby0taCwgY2FsYygxMDB2aCAtIDMycHgpKTtcbiAgICAgICAgICBoZWlnaHQ6IHZhcigtLWhlaWdodCk7XG4gICAgICAgICAgLS1oZWlnaHQtaW4tdGFiczogY2FsYyh2YXIoLS1oZWlnaHQpIC0gMjVweCk7XG4gICAgICAgIH1cblxuICAgICAgICAuYm94IHtcbiAgICAgICAgICBoZWlnaHQ6IHZhcigtLWhlaWdodCk7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5kZXNpZ24sXG4gICAgICAgIC5wcm9wZXJ0aWVzIHtcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICB9XG5cbiAgICAgICAgZ3YtcmVzaXphYmxlLXZpZXdzIHtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5lZGl0YWJsZS1uYW1lIHtcbiAgICAgICAgICBwYWRkaW5nOiAwLjVyZW0gMXJlbTtcbiAgICAgICAgICBmb250LXNpemU6IDE2cHg7XG4gICAgICAgIH1cblxuICAgICAgICAuZWRpdGFibGUtbmFtZSBzcGFuIHtcbiAgICAgICAgICBjb2xvcjogI2JmYmZiZjtcbiAgICAgICAgICBmb250LXNpemU6IDEycHg7XG4gICAgICAgIH1cblxuICAgICAgICAuZm9ybV9fY29udHJvbCB7XG4gICAgICAgICAgbWFyZ2luOiAwLjVyZW07XG4gICAgICAgIH1cblxuICAgICAgICBndi1pbnB1dCB7XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIH1cblxuICAgICAgICAuZmxvdy1uYW1lIHtcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIH1cblxuICAgICAgICAuZmxvdy1uYW1lLmRpcnR5IHtcbiAgICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7XG4gICAgICAgICAgb3BhY2l0eTogMC44O1xuICAgICAgICB9XG5cbiAgICAgICAgLmZsb3ctbmFtZSBndi1pY29uIHtcbiAgICAgICAgICAtLWd2LWljb24tLXM6IDI0cHg7XG4gICAgICAgICAgbWFyZ2luLXJpZ2h0OiAwLjJyZW07XG4gICAgICAgIH1cblxuICAgICAgICAuZmxvdy1wYXRoIHtcbiAgICAgICAgICBtYXJnaW4tbGVmdDogMC4ycmVtO1xuICAgICAgICB9XG5cbiAgICAgICAgLnRpdGxlX21ldGhvZHMge1xuICAgICAgICAgIG1hcmdpbi1sZWZ0OiAwLjVyZW07XG4gICAgICAgIH1cblxuICAgICAgICAudHdvLWNvbHMge1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICB9XG5cbiAgICAgICAgLnR3by1jb2xzID4gKiB7XG4gICAgICAgICAgZmxleDogMTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5sZWZ0LW1lbnUge1xuICAgICAgICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2Q5ZDlkOTtcbiAgICAgICAgICBoZWlnaHQ6IHZhcigtLWhlaWdodC1pbi10YWJzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5yaWdodC1tZW51IHtcbiAgICAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZDlkOWQ5O1xuICAgICAgICAgIGhlaWdodDogdmFyKC0taGVpZ2h0LWluLXRhYnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLnR3by1jb2xzID4gKjpmaXJzdC1jaGlsZCB7XG4gICAgICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2Q5ZDlkOTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5mbG93LXN0ZXBfX2NvbnRhaW5lciB7XG4gICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgICBoZWlnaHQ6IDk5JTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5mbG93LXN0ZXBfX2Zvcm0ge1xuICAgICAgICAgIHBhZGRpbmc6IDAgMC41cmVtO1xuICAgICAgICAgIG92ZXJmbG93OiBhdXRvO1xuICAgICAgICB9XG5cbiAgICAgICAgLmZsb3ctc3RlcF9fZm9ybS10aXRsZSB7XG4gICAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgICAgICAgICBsZXR0ZXItc3BhY2luZzogMC4ycmVtO1xuICAgICAgICB9XG5cbiAgICAgICAgZ3YtdGFicyB7XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgfVxuXG4gICAgICAgIGd2LXJlc2l6YWJsZS12aWV3cyxcbiAgICAgICAgZ3YtcHJvcGVydGllcyxcbiAgICAgICAgZ3YtcmVzb3VyY2VzIHtcbiAgICAgICAgICBoZWlnaHQ6IHZhcigtLWhlaWdodC1pbi10YWJzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGd2LXByb3BlcnRpZXMsXG4gICAgICAgIGd2LXJlc291cmNlcyB7XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIH1cblxuICAgICAgICBndi1wcm9wZXJ0aWVzLnByb3BlcnRpZXMge1xuICAgICAgICAgIC0tZ3YtcHJvcGVydGllcy10YWJsZS0tY29sbWc6IDEwcHg7XG4gICAgICAgIH1cblxuICAgICAgICAuYXBpLXNldHRpbmdzIHtcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjYmZiZmJmO1xuICAgICAgICAgIGhlaWdodDogdmFyKC0taGVpZ2h0LWluLXRhYnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLmRlYnVnIHtcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjYmZiZmJmO1xuICAgICAgICAgIGhlaWdodDogdmFyKC0taGVpZ2h0LWluLXRhYnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLmFwaS1zZXR0aW5ncy1pbmZvcm1hdGlvbiB7XG4gICAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgLmFwaS1zZXR0aW5ncy1pbmZvcm1hdGlvbl9faWNvbiB7XG4gICAgICAgICAgLS1ndi1pY29uLS1jOiB2YXIoLS1ndi10aGVtZS1jb2xvciwgIzVhNzY4NCk7XG4gICAgICAgICAgLS1ndi1pY29uLW9wYWNpdHktLWM6IHZhcigtLWd2LXRoZW1lLWNvbG9yLWluZm8tbGlnaHQsICM2NGI1ZjYpO1xuICAgICAgICB9XG5cbiAgICAgICAgLmFwaS1zZXR0aW5ncy1pbmZvcm1hdGlvbl9fYmxvY2txdW90ZSxcbiAgICAgICAgLmRlYnVnLWluZm9ybWF0aW9uX19ibG9ja3F1b3RlIHtcbiAgICAgICAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIHZhcigtLWd2LXRoZW1lLWNvbG9yLCAjNWE3Njg0KTtcbiAgICAgICAgICBtYXJnaW46IDE1cHg7XG4gICAgICAgICAgcGFkZGluZy1sZWZ0OiAxNXB4O1xuICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgICAgfVxuXG4gICAgICAgIC5mbG93LXNldHRpbmdzIGd2LXNjaGVtYS1mb3JtIHtcbiAgICAgICAgICBmbGV4OiAxO1xuICAgICAgICAgIHBhZGRpbmc6IDAuNXJlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5zZWFyY2gge1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAganVzdGlmeS1jb250ZW50OiBzdHJldGNoO1xuICAgICAgICB9XG5cbiAgICAgICAgZ3YtaW5wdXQge1xuICAgICAgICAgIG1hcmdpbjogMC4ycmVtIDA7XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIH1cblxuICAgICAgICAuaGVhZGVyLWFjdGlvbnMsXG4gICAgICAgIC5zZWFyY2gtcG9saWNpZXMge1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICAgIG1hcmdpbjogMC41cmVtO1xuICAgICAgICB9XG5cbiAgICAgICAgLnNlYXJjaC1wb2xpY2llcyB7XG4gICAgICAgICAgbWFyZ2luOiAxLjVyZW0gMC41cmVtIDAuNXJlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIC5mb290ZXItYWN0aW9ucyA+IGd2LWJ1dHRvbi5idG4tbGFyZ2UsXG4gICAgICAgIC5mb290ZXItYWN0aW9ucyA+IGd2LW9wdGlvbiB7XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIH1cblxuICAgICAgICAuZm9vdGVyLWFjdGlvbnMge1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICAgIHBhZGRpbmc6IDAuNXJlbSAwO1xuICAgICAgICAgIG1hcmdpbjogMC41cmVtIDE1cHg7XG4gICAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNiZmJmYmY7XG4gICAgICAgIH1cblxuICAgICAgICAuaGVhZGVyLWFjdGlvbnMgLnRpdGxlIHtcbiAgICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgICAgICBsZXR0ZXItc3BhY2luZzogMC4zcmVtO1xuICAgICAgICAgIGNvbG9yOiAjYmZiZmJmO1xuICAgICAgICAgIGZvbnQtc2l6ZTogMThweDtcbiAgICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgICAgICAgd2lkdGg6IDI0MHB4O1xuICAgICAgICAgIG1pbi1oZWlnaHQ6IDI1cHg7XG4gICAgICAgIH1cblxuICAgICAgICAuaGVhZGVyLWFjdGlvbnMgPiAqLFxuICAgICAgICAuc2VhcmNoLXBvbGljaWVzID4gKiB7XG4gICAgICAgICAgbWFyZ2luLWJvdHRvbTogMXJlbTtcbiAgICAgICAgfVxuICAgICAgYCxcbiAgICBdO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmlzRGlydHkgPSBmYWxzZTtcbiAgICB0aGlzLnBvbGljaWVzID0gW107XG4gICAgdGhpcy5yZXNvdXJjZVR5cGVzID0gW107XG4gICAgdGhpcy50YWJJZCA9ICdkZXNpZ24nO1xuICAgIHRoaXMuc2VsZWN0ZWRGbG93c0lkID0gW107XG4gICAgdGhpcy5mbG93c1RpdGxlID0gJ0Zsb3dzJztcbiAgICB0aGlzLnNvcnRhYmxlID0gZmFsc2U7XG4gICAgdGhpcy5zZXJ2aWNlcyA9IHt9O1xuICAgIHRoaXMuX2RlZmluaXRpb24gPSB7XG4gICAgICBmbG93czogW10sXG4gICAgfTtcbiAgICB0aGlzLl90YWJzID0gW3sgaWQ6ICdkZXNpZ24nLCB0aXRsZTogJ0Rlc2lnbicsIGljb246ICduYXZpZ2F0aW9uOmV4Y2hhbmdlJyB9XTtcbiAgICB0aGlzLl9wb2xpY3lGaWx0ZXIgPSBbXTtcbiAgICB0aGlzLl9mbG93RmlsdGVyID0gW107XG4gIH1cblxuICBzZXQgaGFzUHJvcGVydGllcyh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgaW1wb3J0KCcuLi9vcmdhbmlzbXMvZ3YtcHJvcGVydGllcycpLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLl90YWJzID0gWy4uLnRoaXMuX3RhYnMsIHsgaWQ6ICdwcm9wZXJ0aWVzJywgdGl0bGU6ICdQcm9wZXJ0aWVzJywgaWNvbjogJ2dlbmVyYWw6c2V0dGluZ3MjMScgfV07XG4gICAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuX2hhc1Byb3BlcnRpZXMgPSB2YWx1ZTtcbiAgfVxuXG4gIGdldCBoYXNQcm9wZXJ0aWVzKCkge1xuICAgIHJldHVybiB0aGlzLl9oYXNQcm9wZXJ0aWVzO1xuICB9XG5cbiAgc2V0IGhhc1Jlc291cmNlcyh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgaW1wb3J0KCcuLi9vcmdhbmlzbXMvZ3YtcmVzb3VyY2VzJykudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuX3RhYnMgPSBbLi4udGhpcy5fdGFicywgeyBpZDogJ3Jlc291cmNlcycsIHRpdGxlOiAnUmVzb3VyY2VzJywgaWNvbjogJ2dlbmVyYWw6c2V0dGluZ3MjNScgfV07XG4gICAgICAgIHRoaXMucmVxdWVzdFVwZGF0ZSgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgc2V0IGNhbkRlYnVnKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLl90YWJzID0gWy4uLnRoaXMuX3RhYnMsIHsgaWQ6ICdkZWJ1ZycsIHRpdGxlOiAnVHJ5IGl0JywgaWNvbjogJ2NvbnRlbnQ6c2VuZCcgfV07XG4gICAgfVxuICB9XG5cbiAgZ2V0IF9mbG93RmlsdGVyT3B0aW9ucygpIHtcbiAgICBpZiAodGhpcy5kZWZpbmVkUGxhbnMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgeyBpZDogJ2FwaScsIHRpdGxlOiAnQXBpJywgaWNvbjogJ3Nob3BwaW5nOmJveCMzJyB9LFxuICAgICAgICB7IGlkOiAncGxhbicsIHRpdGxlOiAnUGxhbnMnLCBpY29uOiAnc2hvcHBpbmc6c2FsZSMyJyB9LFxuICAgICAgXTtcbiAgICB9XG4gIH1cblxuICBzZXQgaGFzUG9saWN5RmlsdGVyKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLl9wb2xpY3lGaWx0ZXJPcHRpb25zID0gW1xuICAgICAgICB7IGlkOiAnb25SZXF1ZXN0JywgdGl0bGU6ICdSZXF1ZXN0JywgaWNvbjogJ25hdmlnYXRpb246YXJyb3ctZnJvbS1sZWZ0JyB9LFxuICAgICAgICB7IGlkOiAnb25SZXNwb25zZScsIHRpdGxlOiAnUmVzcG9uc2UnLCBpY29uOiAnbmF2aWdhdGlvbjphcnJvdy1mcm9tLXJpZ2h0JyB9LFxuICAgICAgXTtcbiAgICB9XG4gIH1cblxuICBzZXQgY29uZmlndXJhdGlvblNjaGVtYSh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5fdGFicy5zcGxpY2UoMSwgMCwgeyBpZDogJ3NldHRpbmdzJywgdGl0bGU6ICdDb25maWd1cmF0aW9uJywgaWNvbjogJ2dlbmVyYWw6c2V0dGluZ3MjMicgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5fY29uZmlndXJhdGlvblNjaGVtYSA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0IGNvbmZpZ3VyYXRpb25TY2hlbWEoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZ3VyYXRpb25TY2hlbWE7XG4gIH1cblxuICBvbktleWJvYXJkKCkge1xuICAgIGlmICh0aGlzLl9jdXJyZW50QXNrQ29uZmlybWF0aW9uID09IG51bGwpIHtcbiAgICAgIGlmICh0aGlzLmlzUHJlc3NlZChLRVlTLlNoaWZ0LCBLRVlTLkN0cmwsIEtFWVMuU3BhY2UpKSB7XG4gICAgICAgIGNvbnN0IHNlYXJjaCA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCcjc2VhcmNoLXBvbGljeScpO1xuICAgICAgICBpZiAoc2VhcmNoKSB7XG4gICAgICAgICAgc2VhcmNoLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1ByZXNzZWQoS0VZUy5DdHJsLCBLRVlTLlNwYWNlKSkge1xuICAgICAgICBjb25zdCBzZWFyY2ggPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignI3NlYXJjaC1mbG93Jyk7XG4gICAgICAgIGlmIChzZWFyY2gpIHtcbiAgICAgICAgICBzZWFyY2guZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNldCB0YWJJZCh0YWJJZCkge1xuICAgIGlmICh0YWJJZCAhPSBudWxsICYmIFsnZGVzaWduJywgJ3NldHRpbmdzJywgJ3Byb3BlcnRpZXMnLCAncmVzb3VyY2VzJywgJ2RlYnVnJ10uaW5jbHVkZXModGFiSWQpKSB7XG4gICAgICB0aGlzLl90YWJJZCA9IHRhYklkO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl90YWJJZCA9ICdkZXNpZ24nO1xuICAgIH1cbiAgfVxuXG4gIGdldCB0YWJJZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGFiSWQ7XG4gIH1cblxuICBzZXQgZGVmaW5pdGlvbihkZWZpbml0aW9uKSB7XG4gICAgaWYgKGRlZmluaXRpb24pIHtcbiAgICAgIGNvbnN0IGZsb3dzID0gdGhpcy5fZ2VuZXJhdGVGbG93c0lkKGRlZmluaXRpb24uZmxvd3MpO1xuICAgICAgY29uc3QgcmVzb3VyY2VzID0gdGhpcy5fZ2VuZXJhdGVJZCgncmVzb3VyY2UtJywgZGVmaW5pdGlvbi5yZXNvdXJjZXMpO1xuICAgICAgY29uc3QgcGxhbnMgPVxuICAgICAgICBkZWZpbml0aW9uLnBsYW5zID09IG51bGxcbiAgICAgICAgICA/IFtdXG4gICAgICAgICAgOiBkZWZpbml0aW9uLnBsYW5zLm1hcCgocGxhbikgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4geyAuLi5wbGFuLCBmbG93czogdGhpcy5fZ2VuZXJhdGVQbGFuRmxvd3NJZChwbGFuKSB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICB0aGlzLl9pbml0aWFsRGVmaW5pdGlvbiA9IHsgLi4uZGVmaW5pdGlvbiwgZmxvd3MsIHJlc291cmNlcywgcGxhbnMgfTtcbiAgICAgIHRoaXMuX2RlZmluaXRpb24gPSBkZWVwQ2xvbmUodGhpcy5faW5pdGlhbERlZmluaXRpb24pO1xuICAgICAgdGhpcy5pc0RpcnR5ID0gZmFsc2U7XG4gICAgICB0aGlzLl9zZWxlY3RGaXJzdEZsb3coKTtcbiAgICB9XG4gIH1cblxuICBnZXQgZGVmaW5pdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVmaW5pdGlvbjtcbiAgfVxuXG4gIHNldCBzZWxlY3RlZEZsb3dzSWQoc2VsZWN0ZWRGbG93c0lkKSB7XG4gICAgaWYgKHNlbGVjdGVkRmxvd3NJZCAhPSBudWxsICYmIEFycmF5LmlzQXJyYXkoc2VsZWN0ZWRGbG93c0lkKSkge1xuICAgICAgdGhpcy5fc2VsZWN0ZWRGbG93c0lkID0gc2VsZWN0ZWRGbG93c0lkLmZpbHRlcigoaWQpID0+IHRoaXMuX2ZpbmRGbG93QnlJZChpZCkgIT0gbnVsbCk7XG4gICAgICBpZiAoc2VsZWN0ZWRGbG93c0lkLmxlbmd0aCAhPT0gdGhpcy5fc2VsZWN0ZWRGbG93c0lkLmxlbmd0aCkge1xuICAgICAgICB0aGlzLl9zZWxlY3RGaXJzdEZsb3codHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0IHNlbGVjdGVkRmxvd3NJZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRGbG93c0lkLmZpbHRlcigoaWQpID0+IHRoaXMuX2ZpbmRGbG93QnlJZChpZCkgIT0gbnVsbCk7XG4gIH1cblxuICBfdXBkYXRlU2VsZWN0ZWRGbG93cyhzZWxlY3RlZEZsb3dzSWQpIHtcbiAgICB0aGlzLnNlbGVjdGVkRmxvd3NJZCA9IHNlbGVjdGVkRmxvd3NJZDtcbiAgICBkaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMsICdzZWxlY3QtZmxvd3MnLCB7IGZsb3dzOiB0aGlzLnNlbGVjdGVkRmxvd3NJZCB9KTtcbiAgfVxuXG4gIF9zZWxlY3RGaXJzdEZsb3coZGlzcGF0Y2ggPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkRmxvd3NJZC5sZW5ndGggPT09IDApIHtcbiAgICAgIGxldCBjYW5kaWRhdGUgPSBudWxsO1xuICAgICAgaWYgKHRoaXMuZGVmaW5lZEZsb3dzLmxlbmd0aCA+IDAgJiYgdGhpcy5kZWZpbmVkRmxvd3NbMF0uX2lkICE9IG51bGwpIHtcbiAgICAgICAgY2FuZGlkYXRlID0gdGhpcy5kZWZpbmVkRmxvd3NbMF07XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZGVmaW5lZFBsYW5zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgcGxhbiA9IHRoaXMuZGVmaW5lZFBsYW5zLmZpbmQoKHBsYW4pID0+IHBsYW4uZmxvd3MgIT0gbnVsbCAmJiBwbGFuLmZsb3dzLmxlbmd0aCA+IDAgJiYgcGxhbi5mbG93c1swXS5faWQgIT0gbnVsbCk7XG4gICAgICAgIGlmIChwbGFuKSB7XG4gICAgICAgICAgY2FuZGlkYXRlID0gcGxhbi5mbG93c1swXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGNhbmRpZGF0ZSAhPSBudWxsKSB7XG4gICAgICAgIGlmIChkaXNwYXRjaCkge1xuICAgICAgICAgIHRoaXMuX3VwZGF0ZVNlbGVjdGVkRmxvd3MoW2NhbmRpZGF0ZS5faWRdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRmxvd3NJZCA9IFtjYW5kaWRhdGUuX2lkXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9nZXRGbG93RWxlbWVudChmbG93SWQpIHtcbiAgICByZXR1cm4gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoYFtpZD1cIiR7Zmxvd0lkfVwiXWApO1xuICB9XG5cbiAgX29uRHJhZ0VuZFBvbGljeSgpIHtcbiAgICB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbCgnZ3YtZmxvdycpLmZvckVhY2goKGUpID0+IGUub25EcmFnRW5kKCkpO1xuICB9XG5cbiAgYXN5bmMgX29uRHJvcFBvbGljeSh7IGRldGFpbCB9KSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX2Fza1RvVmFsaWRhdGVGb3JtcygpO1xuXG4gICAgICBjb25zdCBwb2xpY3kgPSBkZXRhaWwucG9saWN5O1xuICAgICAgY29uc3QgdGFyZ2V0RmxvdyA9IHRoaXMuX2ZpbmRGbG93QnlJZChkZXRhaWwuZmxvd0lkKTtcblxuICAgICAgbGV0IG5hbWUgPSBwb2xpY3kubmFtZTtcbiAgICAgIGxldCBkZXNjcmlwdGlvbiA9ICcnO1xuICAgICAgbGV0IGNvbmZpZ3VyYXRpb24gPSB7fTtcbiAgICAgIGxldCBfaWQ7XG4gICAgICBsZXQgX25ldyA9IGZhbHNlO1xuICAgICAgaWYgKGRldGFpbC5mbG93U3RlcCkge1xuICAgICAgICBfaWQgPSBkZXRhaWwuZmxvd1N0ZXAuX2lkO1xuICAgICAgICBuYW1lID0gZGV0YWlsLmZsb3dTdGVwLm5hbWU7XG4gICAgICAgIGRlc2NyaXB0aW9uID0gZGV0YWlsLmZsb3dTdGVwLmRlc2NyaXB0aW9uIHx8ICcnO1xuICAgICAgICBjb25maWd1cmF0aW9uID0gZGV0YWlsLmZsb3dTdGVwLmNvbmZpZ3VyYXRpb247XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfaWQgPSB0aGlzLl9nZW5lcmF0ZUZsb3dTdGVwSWQodGFyZ2V0Rmxvdy5faWQsIGRldGFpbC5mbG93S2V5LCBkZXRhaWwucG9zaXRpb24pO1xuICAgICAgICBfbmV3ID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZmxvd1N0ZXAgPSB7IF9pZCwgX25ldywgbmFtZSwgcG9saWN5OiBwb2xpY3kuaWQsIGRlc2NyaXB0aW9uLCBlbmFibGVkOiB0cnVlLCBjb25maWd1cmF0aW9uIH07XG4gICAgICBjb25zdCBzb3VyY2VGbG93ID0gZGV0YWlsLnNvdXJjZUZsb3dJZCAhPSBudWxsID8gdGhpcy5fZmluZEZsb3dCeUlkKGRldGFpbC5zb3VyY2VGbG93SWQpIDogdGFyZ2V0RmxvdztcblxuICAgICAgaWYgKGRldGFpbC5zb3VyY2VQb3NpdGlvbiAhPSBudWxsKSB7XG4gICAgICAgIGlmIChkZXRhaWwuc291cmNlRmxvd0tleSAmJiBkZXRhaWwuc291cmNlRmxvd0tleSAhPT0gZGV0YWlsLmZsb3dLZXkpIHtcbiAgICAgICAgICBzb3VyY2VGbG93W2RldGFpbC5zb3VyY2VGbG93S2V5XS5zcGxpY2UoZGV0YWlsLnNvdXJjZVBvc2l0aW9uLCAxKTtcbiAgICAgICAgICB0YXJnZXRGbG93W2RldGFpbC5mbG93S2V5XS5zcGxpY2UoZGV0YWlsLnBvc2l0aW9uLCAwLCBmbG93U3RlcCk7XG4gICAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRGbG93U3RlcCAhPSBudWxsICYmIHRoaXMuX2N1cnJlbnRGbG93U3RlcC5zdGVwLl9pZCA9PT0gX2lkKSB7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50Rmxvd1N0ZXAuZ3JvdXAgPSBkZXRhaWwuZmxvd0tleTtcbiAgICAgICAgICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgdXBkYXRlIHNjaGVtYSBhZnRlciBjaGFuZ2UgcmVxdWVzdCB0byByZXNwb25zZSBvciBpbnZlcnNlXG4gICAgICAgICAgICBjb25zdCBzY2hlbWEgPSB0aGlzLmJ1aWxkU2NoZW1hKHRoaXMuX2N1cnJlbnRGbG93U3RlcC5wb2xpY3kpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fc2V0Q3VycmVudEZsb3dTdGVwKHRoaXMuX2N1cnJlbnRGbG93U3RlcCwgc2NoZW1hLCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuX2dldEZsb3dFbGVtZW50KHRhcmdldEZsb3cuX2lkKS5yZXF1ZXN0VXBkYXRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChkZXRhaWwucG9zaXRpb24gPiBkZXRhaWwuc291cmNlUG9zaXRpb24pIHtcbiAgICAgICAgICAgIHRhcmdldEZsb3dbZGV0YWlsLmZsb3dLZXldLnNwbGljZShkZXRhaWwucG9zaXRpb24sIDAsIGZsb3dTdGVwKTtcbiAgICAgICAgICAgIHNvdXJjZUZsb3dbZGV0YWlsLmZsb3dLZXldLnNwbGljZShkZXRhaWwuc291cmNlUG9zaXRpb24sIDEpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzb3VyY2VGbG93W2RldGFpbC5mbG93S2V5XS5zcGxpY2UoZGV0YWlsLnNvdXJjZVBvc2l0aW9uLCAxKTtcbiAgICAgICAgICAgIHRhcmdldEZsb3dbZGV0YWlsLmZsb3dLZXldLnNwbGljZShkZXRhaWwucG9zaXRpb24sIDAsIGZsb3dTdGVwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gRm9yY2UgUmVmcmVzaCBzb3VyY2UgZmxvdyBlbGVtZW50IHdoZW4gbW92ZSB0byBvdGhlciBmbG93XG4gICAgICAgIGlmICh0YXJnZXRGbG93Ll9pZCAhPT0gc291cmNlRmxvdy5faWQpIHtcbiAgICAgICAgICB0aGlzLl9nZXRGbG93RWxlbWVudCh0YXJnZXRGbG93Ll9pZCkucmVxdWVzdFVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXRGbG93W2RldGFpbC5mbG93S2V5XS5zcGxpY2UoZGV0YWlsLnBvc2l0aW9uLCAwLCBmbG93U3RlcCk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRGbG93Rm9ybSA9IHRoaXMuX2dldEZsb3dTdGVwRm9ybSgpO1xuICAgICAgICBpZiAoY3VycmVudEZsb3dGb3JtID09IG51bGwgfHwgY3VycmVudEZsb3dGb3JtLmRpcnR5ICE9PSB0cnVlKSB7XG4gICAgICAgICAgbGV0IHN0ZXAgPSB0YXJnZXRGbG93W2RldGFpbC5mbG93S2V5XVtkZXRhaWwucG9zaXRpb25dO1xuICAgICAgICAgIGlmIChzdGVwID09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIFdoZW4gY29uZmlybSBsb3NlIGNoYW5nZSBhZnRlciBkcm9wIHBvbGljeVxuICAgICAgICAgICAgc3RlcCA9IHRhcmdldEZsb3dbZGV0YWlsLmZsb3dLZXldW2RldGFpbC5wb3NpdGlvbiAtIDFdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChkZXRhaWwuY2FuY2VsRWRpdCAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2VkaXRGbG93U3RlcCh7IHN0ZXAsIHBvbGljeSwgZmxvdzogdGFyZ2V0RmxvdywgZ3JvdXA6IGRldGFpbC5mbG93S2V5IH0pO1xuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbXBsZXRlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZsb3dFbGVtZW50ID0gdGhpcy5fZ2V0Rmxvd0VsZW1lbnQodGFyZ2V0Rmxvdy5faWQpO1xuICAgICAgICAgICAgICAgIGZsb3dFbGVtZW50LnNlbGVjdGVkU3RlcElkID0gc3RlcC5faWQ7XG4gICAgICAgICAgICAgICAgZmxvd0VsZW1lbnQucmVxdWVzdFVwZGF0ZSgpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGFyZ2V0Rmxvdy5fZGlydHkgPSB0cnVlO1xuICAgICAgc291cmNlRmxvdy5fZGlydHkgPSB0cnVlO1xuICAgICAgdGhpcy5pc0RpcnR5ID0gdHJ1ZTtcbiAgICAgIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCdndi1mbG93JykuZm9yRWFjaCgoZ3ZGbG93KSA9PiBndkZsb3cucmVtb3ZlQ2FuZGlkYXRlKCkpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuX2RyYWdQb2xpY3kgPSBudWxsO1xuICAgICAgICB0aGlzLl9kcm9wUG9saWN5ID0gbnVsbDtcbiAgICAgIH0sIDApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuX2N1cnJlbnRBc2tDb25maXJtYXRpb24gPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIF9vbkRlbGV0ZVBvbGljeSh7IGRldGFpbCB9KSB7XG4gICAgY29uc3QgdGFyZ2V0RmxvdyA9IHRoaXMuX2ZpbmRGbG93QnlJZChkZXRhaWwuZmxvd0lkKTtcbiAgICB0YXJnZXRGbG93W2RldGFpbC5mbG93S2V5XS5zcGxpY2UoZGV0YWlsLnBvc2l0aW9uLCAxKTtcbiAgICB0YXJnZXRGbG93Ll9kaXJ0eSA9IHRydWU7XG4gICAgdGhpcy5pc0RpcnR5ID0gdHJ1ZTtcbiAgICBpZiAoZGV0YWlsLnRhcmdldC5lZGl0aW5nKSB7XG4gICAgICB0aGlzLl9jbG9zZUZsb3dTdGVwRm9ybSh0cnVlKTtcbiAgICB9XG4gICAgdGhpcy5fZ2V0Rmxvd0VsZW1lbnQoZGV0YWlsLmZsb3dJZCkucmVxdWVzdFVwZGF0ZSgpO1xuICB9XG5cbiAgX29uRGVzaWduKCkge1xuICAgIHRoaXMuX2NoYW5nZVRhYignZGVzaWduJyk7XG4gICAgdGhpcy5fc3BsaXRNYWluVmlld3MoKTtcbiAgfVxuXG4gIGJ1aWxkU2NoZW1hKHsgc2NoZW1hIH0pIHtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IHtcbiAgICAgIHRpdGxlOiAnRGVzY3JpcHRpb24nLFxuICAgICAgZGVzY3JpcHRpb246ICdEZXNjcmlwdGlvbiBvZiBmbG93IHN0ZXAnLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgfTtcbiAgICBjb25zdCBjb25kaXRpb24gPSB7XG4gICAgICB0aXRsZTogJ0NvbmRpdGlvbicsXG4gICAgICBkZXNjcmlwdGlvbjogJ0NvbmRpdGlvbiB0aGUgZXhlY3V0aW9uIG9mIHRoZSBmbG93IHN0ZXAgKHN1cHBvcnQgRUwpJyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgJ3gtc2NoZW1hLWZvcm0nOiB7XG4gICAgICAgICdleHByZXNzaW9uLWxhbmd1YWdlJzogdHJ1ZSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBpZiAoc2NoZW1hKSB7XG4gICAgICBjb25zdCBqc29uU2NoZW1hID0gdHlwZW9mIHNjaGVtYSA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKHNjaGVtYSkgOiBzY2hlbWE7XG4gICAgICBjb25zdCBwcm9wZXJ0aWVzID0geyBkZXNjcmlwdGlvbiwgLi4uKHRoaXMuaGFzQ29uZGl0aW9uYWxTdGVwcyA/IHsgY29uZGl0aW9uIH0gOiB7fSksIC4uLmpzb25TY2hlbWEucHJvcGVydGllcyB9O1xuICAgICAgcmV0dXJuIHsgLi4uanNvblNjaGVtYSwgcHJvcGVydGllcyB9O1xuICAgIH1cbiAgICByZXR1cm4geyBwcm9wZXJ0aWVzOiB7IGRlc2NyaXB0aW9uLCAuLi4odGhpcy5oYXNDb25kaXRpb25hbFN0ZXBzID8geyBjb25kaXRpb24gfSA6IHt9KSB9IH07XG4gIH1cblxuICBhc3luYyBfZWRpdEZsb3dTdGVwKHsgc3RlcCwgZmxvdywgcG9saWN5LCBncm91cCB9KSB7XG4gICAgaWYgKHN0ZXApIHtcbiAgICAgIHRoaXMuX2N1cnJlbnRQb2xpY3lJZCA9IHBvbGljeS5pZDtcbiAgICAgIGNvbnN0IGN1cnJlbnRGbG93U3RlcCA9IHsgZmxvdywgc3RlcCwgcG9saWN5LCBncm91cCB9O1xuICAgICAgY29uc3Qgc2NoZW1hID0gdGhpcy5idWlsZFNjaGVtYShwb2xpY3kpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgdGhpcy5fc2V0Q3VycmVudEZsb3dTdGVwKGN1cnJlbnRGbG93U3RlcCwgc2NoZW1hKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlU2VsZWN0ZWRGbG93cyhbZmxvdy5faWRdKTtcbiAgICAgICAgdGhpcy5fc3BsaXRNYWluVmlld3MoKTtcbiAgICAgICAgaWYgKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdndi1wb2xpY3ktc3R1ZGlvOmtlZXAtZG9jdW1lbnRhdGlvbi1jbG9zZScpID09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLl9vbk9wZW5Eb2N1bWVudGF0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5fY3VycmVudEFza0NvbmZpcm1hdGlvbiA9IG51bGw7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuX2Nsb3NlRmxvd1N0ZXBGb3JtKCk7XG4gICAgICB0aGlzLl9tYXhpbWl6ZVRvcFZpZXcoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBfb25FZGl0Rmxvd1N0ZXAoeyBkZXRhaWw6IHsgc3RlcCwgZmxvdywgcG9saWN5LCBncm91cCB9IH0pIHtcbiAgICByZXR1cm4gdGhpcy5fZWRpdEZsb3dTdGVwKHsgc3RlcCwgZmxvdywgcG9saWN5LCBncm91cCB9KTtcbiAgfVxuXG4gIF9nZXRSZXNpemFibGVWaWV3cygpIHtcbiAgICByZXR1cm4gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ2d2LXJlc2l6YWJsZS12aWV3cycpO1xuICB9XG5cbiAgX21heGltaXplVG9wVmlldygpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZEZsb3dzSWQubGVuZ3RoIDw9IDEpIHtcbiAgICAgIHRoaXMuX2dldFJlc2l6YWJsZVZpZXdzKCkubWF4aW1pemVUb3AoKTtcbiAgICB9XG4gIH1cblxuICBfbWF4aW1pemVCb3R0b21WaWV3KCkge1xuICAgIHRoaXMuX2dldFJlc2l6YWJsZVZpZXdzKCkubWF4aW1pemVCb3R0b20oKTtcbiAgfVxuXG4gIF9zcGxpdE1haW5WaWV3cygpIHtcbiAgICB0aGlzLl9nZXRSZXNpemFibGVWaWV3cygpLnNwbGl0KCk7XG4gIH1cblxuICBfb25DaGFuZ2VGbG93U3RlcFN0YXRlKHsgZGV0YWlsIH0pIHtcbiAgICBjb25zdCB0YXJnZXRGbG93ID0gdGhpcy5fZmluZEZsb3dCeUlkKGRldGFpbC5mbG93SWQpO1xuICAgIGNvbnN0IHN0ZXAgPSB0YXJnZXRGbG93W2RldGFpbC5mbG93S2V5XVtkZXRhaWwucG9zaXRpb25dO1xuICAgIHN0ZXAuZW5hYmxlZCA9IGRldGFpbC5lbmFibGVkO1xuICAgIHRhcmdldEZsb3cuX2RpcnR5ID0gdHJ1ZTtcbiAgICB0aGlzLmlzRGlydHkgPSB0cnVlO1xuICB9XG5cbiAgYXN5bmMgX29uQ2xvc2VGbG93U3RlcEZvcm0oKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX2Nsb3NlRmxvd1N0ZXBGb3JtKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLl9jdXJyZW50QXNrQ29uZmlybWF0aW9uID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBfY2xvc2VGbG93U3RlcEZvcm0oZm9yY2UgPSBmYWxzZSkge1xuICAgIGF3YWl0IHRoaXMuX3NldEN1cnJlbnRGbG93U3RlcChudWxsLCBudWxsLCBmb3JjZSk7XG4gIH1cblxuICBhc3luYyBfYXNrVG9WYWxpZGF0ZUZvcm1zKCkge1xuICAgIGlmICh0aGlzLl9jdXJyZW50QXNrQ29uZmlybWF0aW9uID09IG51bGwpIHtcbiAgICAgIHRoaXMuX2N1cnJlbnRBc2tDb25maXJtYXRpb24gPSB0cnVlO1xuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHRoaXMuX3N1Ym1pdE9yQ29uZmlybUZvcm1zKCkpLnRoZW4oKGZvcm1zKSA9PiB7XG4gICAgICAgIGlmIChmb3Jtcy5maWx0ZXIoKHIpID0+IHIgIT0gbnVsbCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuX2RlZmluaXRpb24gPSB0aGlzLl9idWlsZERlZmluaXRpb25Ub1NhdmUoKTtcbiAgICAgICAgICB0aGlzLmdldENoaWxkcmVuKCkuZm9yRWFjaCgoZSkgPT4gZS5yZXF1ZXN0VXBkYXRlKCkpO1xuICAgICAgICAgIC8vIFJlZnJlc2ggaWYgbG9zZSBjaGFuZ2VzIGxvc3QgY3VycmVudCBzdGVwIHNlbGVjdGlvblxuICAgICAgICAgIHJldHVybiB0aGlzLl9jaGVja0N1cnJlbnRGbG93U3RlcCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5nZXRDaGlsZHJlbigpLmZvckVhY2goKGUpID0+IGUucmVxdWVzdFVwZGF0ZSgpKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZUNvbXBsZXRlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50QXNrQ29uZmlybWF0aW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgcmV0dXJuIGZvcm1zO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fY3VycmVudEFza0NvbmZpcm1hdGlvbiA9IG51bGw7XG4gICAgICAgICAgcmV0dXJuIGZvcm1zO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdhc2sgYWxyZWFkeSB3YWl0aW5nJyk7XG4gIH1cblxuICBhc3luYyBfc2V0Q3VycmVudEZsb3dTdGVwKGN1cnJlbnRGbG93U3RlcCwgZmxvd1N0ZXBTY2hlbWEsIGZvcmNlID0gZmFsc2UpIHtcbiAgICBpZiAoIWZvcmNlKSB7XG4gICAgICBhd2FpdCB0aGlzLl9hc2tUb1ZhbGlkYXRlRm9ybXMoKTtcbiAgICB9XG5cbiAgICBjb25zdCBzY2hlbWEgPSBkZWVwQ2xvbmUoZmxvd1N0ZXBTY2hlbWEpO1xuICAgIGlmIChjdXJyZW50Rmxvd1N0ZXAgIT0gbnVsbCkge1xuICAgICAgY29uc3QgY29uZmlndXJhdGlvbiA9XG4gICAgICAgIHR5cGVvZiBjdXJyZW50Rmxvd1N0ZXAuc3RlcC5jb25maWd1cmF0aW9uID09PSAnc3RyaW5nJ1xuICAgICAgICAgID8gSlNPTi5wYXJzZShjdXJyZW50Rmxvd1N0ZXAuc3RlcC5jb25maWd1cmF0aW9uKVxuICAgICAgICAgIDogY3VycmVudEZsb3dTdGVwLnN0ZXAuY29uZmlndXJhdGlvbjtcbiAgICAgIGNvbnN0IHN0ZXAgPSB7IC4uLmN1cnJlbnRGbG93U3RlcC5zdGVwLCBjb25maWd1cmF0aW9uIH07XG5cbiAgICAgIGNvbnN0IF9pbml0aWFsVmFsdWVzID0geyAuLi5zdGVwLmNvbmZpZ3VyYXRpb24sIGRlc2NyaXB0aW9uOiBzdGVwLmRlc2NyaXB0aW9uLCBjb25kaXRpb246IHN0ZXAuY29uZGl0aW9uIH07XG4gICAgICB0aGlzLl9jdXJyZW50Rmxvd1N0ZXAgPSB7IC4uLmN1cnJlbnRGbG93U3RlcCwgc3RlcCwgX2luaXRpYWxWYWx1ZXMgfTtcblxuICAgICAgaWYgKGZsb3dTdGVwU2NoZW1hICYmIGZsb3dTdGVwU2NoZW1hLnByb3BlcnRpZXMuc2NvcGUpIHtcbiAgICAgICAgY29uc3QgX2VudW0gPSBzY2hlbWEucHJvcGVydGllcy5zY29wZS5lbnVtO1xuICAgICAgICBpZiAoX2VudW0uZmluZCgoc2NvcGUpID0+IFsnUkVRVUVTVCcsICdSRVFVRVNUX0NPTlRFTlQnLCAnUkVTUE9OU0UnLCAnUkVTUE9OU0VfQ09OVEVOVCddLmluY2x1ZGVzKHNjb3BlKSkgIT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IGZpbHRlcmVkID0gdGhpcy5fY3VycmVudEZsb3dTdGVwLmdyb3VwID09PSAncHJlJyA/IFsnUkVRVUVTVCcsICdSRVFVRVNUX0NPTlRFTlQnXSA6IFsnUkVTUE9OU0UnLCAnUkVTUE9OU0VfQ09OVEVOVCddO1xuICAgICAgICAgIHNjaGVtYS5wcm9wZXJ0aWVzLnNjb3BlLmVudW0gPSBfZW51bS5maWx0ZXIoKHNjb3BlKSA9PiBmaWx0ZXJlZC5pbmNsdWRlcyhzY29wZSkpO1xuICAgICAgICAgIGNvbnN0IHNjb3BlID0gdGhpcy5fY3VycmVudEZsb3dTdGVwLnN0ZXAuY29uZmlndXJhdGlvbi5zY29wZTtcbiAgICAgICAgICBpZiAoc2NvcGUgPT0gbnVsbCB8fCAhc2NoZW1hLnByb3BlcnRpZXMuc2NvcGUuZW51bS5pbmNsdWRlcyhzY29wZSkpIHtcbiAgICAgICAgICAgIHNjaGVtYS5wcm9wZXJ0aWVzLnNjb3BlLmRlZmF1bHQgPSBzY2hlbWEucHJvcGVydGllcy5zY29wZS5lbnVtWzBdO1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudEZsb3dTdGVwLnN0ZXAuY29uZmlndXJhdGlvbi5zY29wZSA9IHNjaGVtYS5wcm9wZXJ0aWVzLnNjb3BlLmVudW1bMF07XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50Rmxvd1N0ZXAuX2luaXRpYWxWYWx1ZXMuc2NvcGUgPSBzY2hlbWEucHJvcGVydGllcy5zY29wZS5lbnVtWzBdO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRGbG93U3RlcC5fdmFsdWVzKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRGbG93U3RlcC5fdmFsdWVzLnNjb3BlID0gc2NoZW1hLnByb3BlcnRpZXMuc2NvcGUuZW51bVswXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fY3VycmVudEZsb3dTdGVwID0gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLl9mbG93U3RlcFNjaGVtYSA9IHNjaGVtYTtcbiAgfVxuXG4gIF9yZWZyZXNoKGNsb3NlU3RlcEZvcm0gPSB0cnVlKSB7XG4gICAgaWYgKGNsb3NlU3RlcEZvcm0pIHtcbiAgICAgIHRoaXMuX2Nsb3NlRmxvd1N0ZXBGb3JtKHRydWUpO1xuICAgIH1cbiAgICB0aGlzLl9kZWZpbml0aW9uID0gZGVlcENsb25lKHRoaXMuX2RlZmluaXRpb24pO1xuICB9XG5cbiAgYXN5bmMgX29uU2VsZWN0Rmxvd3MoeyBkZXRhaWwgfSkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl9jbG9zZUZsb3dTdGVwRm9ybSgpO1xuICAgICAgdGhpcy5fb25DbG9zZURvY3VtZW50YXRpb24oKTtcbiAgICAgIHRoaXMuX3VwZGF0ZVNlbGVjdGVkRmxvd3MoZGV0YWlsLmZsb3dzKTtcbiAgICAgIHRoaXMuX29uRGVzaWduKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5fY3VycmVudEFza0NvbmZpcm1hdGlvbiA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgX29uT3BlbkRvY3VtZW50YXRpb25Gcm9tTWVudSh7IGRldGFpbDogeyBwb2xpY3kgfSB9KSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLmRvY3VtZW50YXRpb24gPT0gbnVsbCB8fCB0aGlzLmRvY3VtZW50YXRpb24uaWQgIT09IHBvbGljeS5pZCkge1xuICAgICAgICBhd2FpdCB0aGlzLl9jbG9zZUZsb3dTdGVwRm9ybSgpO1xuICAgICAgICB0aGlzLl9jdXJyZW50UG9saWN5SWQgPSBwb2xpY3kuaWQ7XG4gICAgICAgIGlmICh0aGlzLmdldFNlbGVjdGVkRmxvdygpKSB7XG4gICAgICAgICAgdGhpcy5fc3BsaXRNYWluVmlld3MoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9tYXhpbWl6ZUJvdHRvbVZpZXcoKTtcbiAgICAgICAgfVxuICAgICAgICBkaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMsICdmZXRjaC1kb2N1bWVudGF0aW9uJywgeyBwb2xpY3kgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfVxuXG4gIF9mZXRjaERvY3VtZW50YXRpb24ocG9saWN5KSB7XG4gICAgaWYgKHRoaXMuZG9jdW1lbnRhdGlvbiA9PSBudWxsIHx8IHRoaXMuZG9jdW1lbnRhdGlvbi5pZCAhPT0gcG9saWN5LmlkKSB7XG4gICAgICBkaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMsICdmZXRjaC1kb2N1bWVudGF0aW9uJywgeyBwb2xpY3kgfSk7XG4gICAgfVxuICB9XG5cbiAgX29uT3BlbkRvY3VtZW50YXRpb24oKSB7XG4gICAgaWYgKHRoaXMuX2N1cnJlbnRGbG93U3RlcCAmJiB0aGlzLl9jdXJyZW50Rmxvd1N0ZXAucG9saWN5KSB7XG4gICAgICB0aGlzLl9mZXRjaERvY3VtZW50YXRpb24odGhpcy5fY3VycmVudEZsb3dTdGVwLnBvbGljeSk7XG4gICAgfVxuICB9XG5cbiAgX29uT3BlbkRvY3VtZW50YXRpb25Gcm9tRm9ybSgpIHtcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnZ3YtcG9saWN5LXN0dWRpbzprZWVwLWRvY3VtZW50YXRpb24tY2xvc2UnKTtcbiAgICB0aGlzLl9vbk9wZW5Eb2N1bWVudGF0aW9uKCk7XG4gIH1cblxuICBfZmluZEZsb3dDb2xsZWN0aW9uKGZsb3dJZCkge1xuICAgIGNvbnN0IHBsYW4gPSB0aGlzLmRlZmluZWRQbGFucy5maW5kKChwbGFuKSA9PiBwbGFuLmZsb3dzLmZpbmQoKGZsb3cpID0+IGZsb3cuX2lkID09PSBmbG93SWQpICE9IG51bGwpO1xuICAgIHJldHVybiB7IHBsYW4sIGZsb3dzOiBwbGFuICE9IG51bGwgPyBwbGFuLmZsb3dzIDogdGhpcy5kZWZpbmVkRmxvd3MgfTtcbiAgfVxuXG4gIF9maW5kRmxvd0J5SWQoZmxvd0lkKSB7XG4gICAgbGV0IGZsb3cgPSB0aGlzLmRlZmluZWRGbG93cy5maW5kKChmbG93KSA9PiBmbG93Ll9pZCA9PT0gZmxvd0lkKTtcbiAgICBpZiAoZmxvdyA9PSBudWxsKSB7XG4gICAgICBjb25zdCBwbGFuc0Zsb3dzID0gdGhpcy5kZWZpbmVkUGxhbnMubWFwKChwbGFuKSA9PiBwbGFuLmZsb3dzKS5yZWR1Y2UoKGFjYywgdmFsKSA9PiBhY2MuY29uY2F0KHZhbCksIFtdKTtcbiAgICAgIGZsb3cgPSBwbGFuc0Zsb3dzLmZpbmQoKGZsb3cpID0+IGZsb3cuX2lkID09PSBmbG93SWQpO1xuICAgIH1cbiAgICByZXR1cm4gZmxvdztcbiAgfVxuXG4gIGdldFNlbGVjdGVkRmxvdyhpbmRleCA9IDApIHtcbiAgICBjb25zdCBzZWxlY3RlZEZsb3dJZCA9IHRoaXMuc2VsZWN0ZWRGbG93c0lkW2luZGV4XTtcbiAgICByZXR1cm4gdGhpcy5fZmluZEZsb3dCeUlkKHNlbGVjdGVkRmxvd0lkKTtcbiAgfVxuXG4gIF9vblRhcmdldFBvbGljeSh7IGRldGFpbCB9KSB7XG4gICAgaWYgKHRoaXMuX2N1cnJlbnRBc2tDb25maXJtYXRpb24gPT0gbnVsbCkge1xuICAgICAgdGhpcy5fZHJhZ1BvbGljeSA9IGRldGFpbDtcbiAgICB9XG4gIH1cblxuICBfb25DaGFuZ2VGbG93U3RlcCh7IGRldGFpbCB9KSB7XG4gICAgdGhpcy5fY3VycmVudEZsb3dTdGVwLl92YWx1ZXMgPSBkZXRhaWwudmFsdWVzO1xuICB9XG5cbiAgX3dyaXRlRmxvd1N0ZXAodmFsdWVzKSB7XG4gICAgY29uc3QgeyBkZXNjcmlwdGlvbiwgY29uZGl0aW9uLCAuLi5jb25maWd1cmF0aW9uIH0gPSB2YWx1ZXM7XG4gICAgaWYgKFxuICAgICAgdGhpcy5fY3VycmVudEZsb3dTdGVwLnN0ZXAuX25ldyB8fFxuICAgICAgdGhpcy5fY3VycmVudEZsb3dTdGVwLnN0ZXAuZGVzY3JpcHRpb24gIT09IGRlc2NyaXB0aW9uIHx8XG4gICAgICB0aGlzLl9jdXJyZW50Rmxvd1N0ZXAuc3RlcC5jb25kaXRpb24gIT09IGNvbmRpdGlvbiB8fFxuICAgICAgIWRlZXBFcXVhbCh0aGlzLl9jdXJyZW50Rmxvd1N0ZXAuc3RlcC5jb25maWd1cmF0aW9uLCBjb25maWd1cmF0aW9uKVxuICAgICkge1xuICAgICAgY29uc3QgZmxvdyA9IHRoaXMuX2ZpbmRGbG93QnlJZCh0aGlzLl9jdXJyZW50Rmxvd1N0ZXAuZmxvdy5faWQpO1xuICAgICAgY29uc3QgcG9zaXRpb24gPSBmbG93W3RoaXMuX2N1cnJlbnRGbG93U3RlcC5ncm91cF0uZmluZEluZGV4KChzdGVwKSA9PiBzdGVwLl9pZCA9PT0gdGhpcy5fY3VycmVudEZsb3dTdGVwLnN0ZXAuX2lkKTtcblxuICAgICAgZmxvd1t0aGlzLl9jdXJyZW50Rmxvd1N0ZXAuZ3JvdXBdW3Bvc2l0aW9uXS5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgICAgZmxvd1t0aGlzLl9jdXJyZW50Rmxvd1N0ZXAuZ3JvdXBdW3Bvc2l0aW9uXS5jb25kaXRpb24gPSBjb25kaXRpb247XG4gICAgICBmbG93W3RoaXMuX2N1cnJlbnRGbG93U3RlcC5ncm91cF1bcG9zaXRpb25dLmNvbmZpZ3VyYXRpb24gPSBkZWVwQ2xvbmUoY29uZmlndXJhdGlvbik7XG4gICAgICBkZWxldGUgZmxvd1t0aGlzLl9jdXJyZW50Rmxvd1N0ZXAuZ3JvdXBdW3Bvc2l0aW9uXS5fbmV3O1xuICAgICAgZmxvd1t0aGlzLl9jdXJyZW50Rmxvd1N0ZXAuZ3JvdXBdW3Bvc2l0aW9uXS5fZGlydHkgPSB0cnVlO1xuICAgICAgZmxvdy5fZGlydHkgPSB0cnVlO1xuICAgICAgdGhpcy5pc0RpcnR5ID0gdHJ1ZTtcbiAgICAgIHRoaXMuX2N1cnJlbnRGbG93U3RlcC5mbG93ID0gZmxvdztcbiAgICAgIHRoaXMuX2N1cnJlbnRGbG93U3RlcC5zdGVwID0gZmxvd1t0aGlzLl9jdXJyZW50Rmxvd1N0ZXAuZ3JvdXBdW3Bvc2l0aW9uXTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBfb25TdWJtaXRGbG93U3RlcCh7IGRldGFpbCB9KSB7XG4gICAgdGhpcy5fd3JpdGVGbG93U3RlcChkZXRhaWwudmFsdWVzKTtcbiAgICBhd2FpdCB0aGlzLnJlcXVlc3RVcGRhdGUoJ19kZWZpbml0aW9uJyk7XG4gICAgdGhpcy5nZXRDaGlsZHJlbigpLmZvckVhY2goKGMpID0+IGMucmVxdWVzdFVwZGF0ZSgpKTtcbiAgfVxuXG4gIF9vbkNhbmNlbEZsb3coKSB7XG4gICAgdGhpcy5fb25EZXNpZ24oKTtcbiAgfVxuXG4gIF9vblN1Ym1pdEZsb3coeyBkZXRhaWw6IHsgdmFsdWVzIH0gfSkge1xuICAgIGNvbnN0IHNlbGVjdGVkRmxvdyA9IHRoaXMuZ2V0U2VsZWN0ZWRGbG93KCk7XG4gICAgY29uc3QgX3ZhbHVlcyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX2NyZWF0ZUZsb3dGcm9tU2NoZW1hKCksIHZhbHVlcyk7XG4gICAgY29uc3Qgc2VsZWN0ZWRGbG93VXBkYXRlZCA9IE9iamVjdC5hc3NpZ24oe30sIHNlbGVjdGVkRmxvdywgX3ZhbHVlcyk7XG4gICAgaWYgKCFkZWVwRXF1YWwoc2VsZWN0ZWRGbG93LCBzZWxlY3RlZEZsb3dVcGRhdGVkKSkge1xuICAgICAgT2JqZWN0LmFzc2lnbihzZWxlY3RlZEZsb3csIHNlbGVjdGVkRmxvd1VwZGF0ZWQsIHsgX2RpcnR5OiB0cnVlIH0pO1xuICAgICAgdGhpcy5pc0RpcnR5ID0gdHJ1ZTtcbiAgICAgIHRoaXMuX3JlZnJlc2goKTtcbiAgICB9XG4gIH1cblxuICBfb25DYW5jZWxGbG93TW9kZSgpIHtcbiAgICB0aGlzLl9vbkRlc2lnbigpO1xuICB9XG5cbiAgX29uU3VibWl0Rmxvd01vZGUoeyBkZXRhaWw6IHsgdmFsdWVzIH0gfSkge1xuICAgIHRoaXMuX2RlZmluaXRpb25bJ2Zsb3ctbW9kZSddID0gdmFsdWVzWydmbG93LW1vZGUnXSB8fCAnREVGQVVMVCc7XG4gICAgdGhpcy5pc0RpcnR5ID0gdHJ1ZTtcbiAgICB0aGlzLl9yZWZyZXNoKCk7XG4gIH1cblxuICBfb25DaGFuZ2VUYWIoeyBkZXRhaWwgfSkge1xuICAgIHRoaXMuX2NoYW5nZVRhYihkZXRhaWwudmFsdWUpO1xuICB9XG5cbiAgYXN5bmMgX2NoYW5nZVRhYlZhbGlkYXRvcih7IGZyb20sIHRvIH0pIHtcbiAgICBpZiAoZnJvbSA9PT0gJ3Byb3BlcnRpZXMnKSB7XG4gICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignZ3YtcHJvcGVydGllcycpO1xuICAgICAgaWYgKGNvbXBvbmVudC5kaXJ0eSkge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50LmNvbmZpcm0oKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZyb20gPT09ICdyZXNvdXJjZXMnKSB7XG4gICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignZ3YtcmVzb3VyY2VzJyk7XG4gICAgICBpZiAoY29tcG9uZW50LmRpcnR5KSB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQuY29uZmlybSgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fYXNrVG9WYWxpZGF0ZUZvcm1zKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRBc2tDb25maXJtYXRpb24gPSBudWxsO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICBfY2hhbmdlVGFiKHRhYklkKSB7XG4gICAgaWYgKHRoaXMuX2N1cnJlbnRBc2tDb25maXJtYXRpb24gPT0gbnVsbCkge1xuICAgICAgdGhpcy50YWJJZCA9IHRhYklkO1xuICAgICAgZGlzcGF0Y2hDdXN0b21FdmVudCh0aGlzLCAnY2hhbmdlLXRhYicsIHRoaXMudGFiSWQpO1xuICAgIH1cbiAgfVxuXG4gIF9vbkRyYWdTdGFydEZsb3dTdGVwKGZsb3csIHsgZGV0YWlsIH0pIHtcbiAgICBpZiAodGhpcy5fY3VycmVudEFza0NvbmZpcm1hdGlvbiA9PSBudWxsKSB7XG4gICAgICB0aGlzLl9kcm9wUG9saWN5ID0gZGV0YWlsO1xuICAgICAgdGhpcy5fZHJhZ1BvbGljeSA9IGRldGFpbDtcbiAgICB9XG4gIH1cblxuICBfcmVuZGVyRmxvd0VtcHR5U3RhdGUocmVhZG9ubHlNb2RlKSB7XG4gICAgcmV0dXJuIGh0bWxgPGRpdiBzbG90PVwiY29udGVudFwiIGNsYXNzPVwiZW1wdHlcIj5cbiAgICAgIDxkaXY+XG4gICAgICAgIFNlbGVjdCBhIGZsb3dcbiAgICAgICAgJHtyZWFkb25seU1vZGUgIT09IHRydWVcbiAgICAgICAgICA/IGh0bWxgb3IgPGd2LWJ1dHRvbiBAZ3YtYnV0dG9uOmNsaWNrPVwiJHt0aGlzLl9vbkFkZEZsb3d9XCIgb3V0bGluZWQgaWNvbj1cImNvZGU6cGx1c1wiIGxhcmdlPmRlc2lnbiBuZXcgb25lPC9ndi1idXR0b24+YFxuICAgICAgICAgIDogJyd9XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgX3JlbmRlckZsb3coaW5kZXggPSAwLCBoYXNFbXB0eVN0YXRlID0gdHJ1ZSwgcmVhZG9ubHlNb2RlKSB7XG4gICAgY29uc3QgZmxvdyA9IHRoaXMuZ2V0U2VsZWN0ZWRGbG93KGluZGV4KTtcbiAgICBpZiAoZmxvdykge1xuICAgICAgY29uc3QgeyBwbGFuIH0gPSB0aGlzLl9maW5kRmxvd0NvbGxlY3Rpb24oZmxvdy5faWQpO1xuICAgICAgY29uc3Qgc2VsZWN0ZWRTdGVwSWQgPSB0aGlzLl9jdXJyZW50Rmxvd1N0ZXAgPyB0aGlzLl9jdXJyZW50Rmxvd1N0ZXAuc3RlcC5faWQgOiBudWxsO1xuICAgICAgcmV0dXJuIGh0bWxgIDxndi1mbG93XG4gICAgICAgIHN0eWxlPVwiaGVpZ2h0OiAxMDAlXCJcbiAgICAgICAgLmlkPVwiJHtmbG93Ll9pZH1cIlxuICAgICAgICAuZmxvdz1cIiR7Zmxvd31cIlxuICAgICAgICAucGxhbj1cIiR7cGxhbn1cIlxuICAgICAgICAucG9saWNpZXM9XCIke3RoaXMucG9saWNpZXN9XCJcbiAgICAgICAgc2xvdD1cImNvbnRlbnRcIlxuICAgICAgICA/ZGlzYWJsZWQ9XCIke3RoaXMuX2N1cnJlbnRBc2tDb25maXJtYXRpb259XCJcbiAgICAgICAgLmRyYWdQb2xpY3k9XCIke3RoaXMuX2RyYWdQb2xpY3l9XCJcbiAgICAgICAgLmRyb3BQb2xpY3k9XCIke3RoaXMuX2Ryb3BQb2xpY3l9XCJcbiAgICAgICAgLnNlbGVjdGVkU3RlcElkPVwiJHtzZWxlY3RlZFN0ZXBJZH1cIlxuICAgICAgICA/cmVhZG9ubHk9XCIke3JlYWRvbmx5TW9kZX1cIlxuICAgICAgICA/aGFzLXBvbGljeS1maWx0ZXI9XCIke3RoaXMuX3BvbGljeUZpbHRlck9wdGlvbnMgIT0gbnVsbH1cIlxuICAgICAgICBmbG93cy10aXRsZT1cIiR7dGhpcy5mbG93c1RpdGxlfVwiXG4gICAgICAgIEBndi1mbG93OmRyYWctc3RhcnQ9XCIke3RoaXMuX29uRHJhZ1N0YXJ0Rmxvd1N0ZXAuYmluZCh0aGlzLCBmbG93KX1cIlxuICAgICAgICBAZ3YtZmxvdzplZGl0PVwiJHt0aGlzLl9vbkVkaXRGbG93U3RlcH1cIlxuICAgICAgICBAZ3YtZmxvdzpjaGFuZ2Utc3RhdGU9XCIke3RoaXMuX29uQ2hhbmdlRmxvd1N0ZXBTdGF0ZX1cIlxuICAgICAgICBAZ3YtZmxvdzpkcm9wPVwiJHt0aGlzLl9vbkRyb3BQb2xpY3l9XCJcbiAgICAgICAgQGd2LWZsb3c6ZGVsZXRlPVwiJHt0aGlzLl9vbkRlbGV0ZVBvbGljeX1cIlxuICAgICAgPjwvZ3YtZmxvdz5gO1xuICAgIH0gZWxzZSBpZiAoaGFzRW1wdHlTdGF0ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3JlbmRlckZsb3dFbXB0eVN0YXRlKHJlYWRvbmx5TW9kZSk7XG4gICAgfVxuICAgIHJldHVybiBodG1sYGA7XG4gIH1cblxuICBfb25GZXRjaFJlc291cmNlcyhldmVudCkge1xuICAgIGNvbnN0IHsgY3VycmVudFRhcmdldCwgcmVnZXhUeXBlcyB9ID0gZXZlbnQuZGV0YWlsO1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmRlZmluZWRSZXNvdXJjZXNcbiAgICAgIC5maWx0ZXIoKHJlc291cmNlKSA9PiByZWdleFR5cGVzID09IG51bGwgfHwgbmV3IFJlZ0V4cChyZWdleFR5cGVzKS50ZXN0KHJlc291cmNlLnR5cGUpKVxuICAgICAgLm1hcCgocmVzb3VyY2UsIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc291cmNlVHlwZSA9IHRoaXMucmVzb3VyY2VUeXBlcy5maW5kKCh0eXBlKSA9PiB0eXBlLmlkID09PSByZXNvdXJjZS50eXBlKTtcbiAgICAgICAgY29uc3Qgcm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZ3Ytcm93Jyk7XG4gICAgICAgIGNvbnN0IHBpY3R1cmUgPSByZXNvdXJjZVR5cGUuaWNvbiA/IHJlc291cmNlVHlwZS5pY29uIDogbnVsbDtcbiAgICAgICAgcm93Lml0ZW0gPSB7IHBpY3R1cmUsIG5hbWU6IHJlc291cmNlLm5hbWUgfTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlbGVtZW50OiByb3csXG4gICAgICAgICAgdmFsdWU6IHJlc291cmNlLm5hbWUsXG4gICAgICAgICAgaWQ6IHJlc291cmNlLnR5cGUsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICBjdXJyZW50VGFyZ2V0Lm9wdGlvbnMgPSBvcHRpb25zO1xuICB9XG5cbiAgX3JlbmRlclBvbGljeShyZWFkb25seU1vZGUpIHtcbiAgICBpZiAodGhpcy5fZmxvd1N0ZXBTY2hlbWEgJiYgdGhpcy5kb2N1bWVudGF0aW9uKSB7XG4gICAgICByZXR1cm4gaHRtbGA8Z3YtcmVzaXphYmxlLXZpZXdzIGRpcmVjdGlvbj1cImhvcml6b250YWxcIiBuby1vdmVyZmxvdz5cbiAgICAgICAgPGRpdiBzbG90PVwidG9wXCI+JHt0aGlzLl9yZW5kZXJGbG93U3RlcEZvcm0ocmVhZG9ubHlNb2RlKX08L2Rpdj5cbiAgICAgICAgPGRpdiBzbG90PVwiYm90dG9tXCI+XG4gICAgICAgICAgPGd2LWRvY3VtZW50YXRpb25cbiAgICAgICAgICAgIC50ZXh0PVwiJHt0aGlzLmRvY3VtZW50YXRpb24uY29udGVudH1cIlxuICAgICAgICAgICAgLmltYWdlPVwiJHt0aGlzLmRvY3VtZW50YXRpb24uaW1hZ2V9XCJcbiAgICAgICAgICAgID9kaXNhYmxlZD1cIiR7dGhpcy5fY3VycmVudEFza0NvbmZpcm1hdGlvbn1cIlxuICAgICAgICAgICAgQGd2LWRvY3VtZW50YXRpb246Y2xvc2U9XCIke3RoaXMuX29uQ2xvc2VEb2N1bWVudGF0aW9ufVwiXG4gICAgICAgICAgPjwvZ3YtZG9jdW1lbnRhdGlvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2d2LXJlc2l6YWJsZS12aWV3cz5gO1xuICAgIH0gZWxzZSBpZiAodGhpcy5kb2N1bWVudGF0aW9uKSB7XG4gICAgICByZXR1cm4gaHRtbGA8Z3YtZG9jdW1lbnRhdGlvblxuICAgICAgICAudGV4dD1cIiR7dGhpcy5kb2N1bWVudGF0aW9uLmNvbnRlbnR9XCJcbiAgICAgICAgLmltYWdlPVwiJHt0aGlzLmRvY3VtZW50YXRpb24uaW1hZ2V9XCJcbiAgICAgICAgP2Rpc2FibGVkPVwiJHt0aGlzLl9jdXJyZW50QXNrQ29uZmlybWF0aW9ufVwiXG4gICAgICAgIEBndi1kb2N1bWVudGF0aW9uOmNsb3NlPVwiJHt0aGlzLl9vbkNsb3NlRG9jdW1lbnRhdGlvbn1cIlxuICAgICAgPjwvZ3YtZG9jdW1lbnRhdGlvbj5gO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fZmxvd1N0ZXBTY2hlbWEpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJGbG93U3RlcEZvcm0ocmVhZG9ubHlNb2RlKTtcbiAgICB9XG4gICAgcmV0dXJuIGh0bWxgYDtcbiAgfVxuXG4gIF9nZXRGbG93U3RlcEZvcm0oKSB7XG4gICAgcmV0dXJuIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKGAjJHtGTE9XX1NURVBfRk9STV9JRH1gKTtcbiAgfVxuXG4gIF9vblJlc2V0Rmxvd1N0ZXAoKSB7XG4gICAgaWYgKHRoaXMuX2N1cnJlbnRGbG93U3RlcCkge1xuICAgICAgZGVsZXRlIHRoaXMuX2N1cnJlbnRGbG93U3RlcC5fdmFsdWVzO1xuICAgICAgdGhpcy5fZ2V0Rmxvd1N0ZXBGb3JtKCkucmVzZXQoKTtcbiAgICB9XG4gIH1cblxuICBfZ2VuZXJhdGVGbG93c0lkKGxpc3QsIGZvcmNlID0gZmFsc2UpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2VuZXJhdGVJZCgnZicsIGxpc3QsIGZvcmNlLCB0cnVlKTtcbiAgfVxuXG4gIF9nZW5lcmF0ZVBsYW5GbG93c0lkKHBsYW4sIGZvcmNlID0gZmFsc2UpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2VuZXJhdGVJZChwbGFuLmlkLCBwbGFuLmZsb3dzLCBmb3JjZSwgdHJ1ZSk7XG4gIH1cblxuICBfZ2VuZXJhdGVGbG93U3RlcElkKGZsb3dJZCwgZmxvd0tleSwgcG9zaXRpb24pIHtcbiAgICByZXR1cm4gYCR7Zmxvd0lkfV8ke2Zsb3dLZXl9XyR7cG9zaXRpb259YDtcbiAgfVxuXG4gIF9nZW5lcmF0ZUlkKHByZWZpeCwgbGlzdCwgZm9yY2UgPSBmYWxzZSwgaXNGbG93ID0gZmFsc2UpIHtcbiAgICBpZiAobGlzdCkge1xuICAgICAgcmV0dXJuIGxpc3QubWFwKChlLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBfaWQgPSBgJHtwcmVmaXh9XyR7aW5kZXh9YDtcbiAgICAgICAgaWYgKGlzRmxvdykge1xuICAgICAgICAgIGlmIChlLnByZSkge1xuICAgICAgICAgICAgZS5wcmUuZm9yRWFjaCgoc3RlcCwgc3RlcEluZGV4KSA9PiAoc3RlcC5faWQgPSB0aGlzLl9nZW5lcmF0ZUZsb3dTdGVwSWQoX2lkLCAncHJlJywgc3RlcEluZGV4KSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZS5wb3N0KSB7XG4gICAgICAgICAgICBlLnBvc3QuZm9yRWFjaCgoc3RlcCwgc3RlcEluZGV4KSA9PiAoc3RlcC5faWQgPSB0aGlzLl9nZW5lcmF0ZUZsb3dTdGVwSWQoX2lkLCAncG9zdCcsIHN0ZXBJbmRleCkpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvcmNlIHx8IGUuX2lkID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4geyAuLi5lLCBfaWQgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gbGlzdDtcbiAgfVxuXG4gIGdldENoaWxkcmVuKCkge1xuICAgIHJldHVybiBbXG4gICAgICAuLi5BcnJheS5mcm9tKHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCdndi1mbG93JykpLFxuICAgICAgLi4uQXJyYXkuZnJvbSh0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbCgnZ3YtcmVzaXphYmxlLXZpZXdzJykpLFxuICAgIF07XG4gIH1cblxuICBhc3luYyBnZXRVcGRhdGVDb21wbGV0ZSgpIHtcbiAgICBhd2FpdCBzdXBlci5nZXRVcGRhdGVDb21wbGV0ZSgpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMuZ2V0Q2hpbGRyZW4oKS5tYXAoKGUpID0+IGUudXBkYXRlQ29tcGxldGUpKTtcbiAgfVxuXG4gIHNob3VsZFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcykge1xuICAgIC8vIEp1c3QgcmVmcmVzaCBndi1mbG93IGNvbXBvbmVudHNcbiAgICBpZiAoY2hhbmdlZFByb3BlcnRpZXMuaGFzKCdfZHJhZ1BvbGljeScpKSB7XG4gICAgICB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbCgnZ3YtZmxvdycpLmZvckVhY2goKGZsb3cpID0+IChmbG93LmRyYWdQb2xpY3kgPSB0aGlzLl9kcmFnUG9saWN5KSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChjaGFuZ2VkUHJvcGVydGllcy5oYXMoJ19kcm9wUG9saWN5JykpIHtcbiAgICAgIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCdndi1mbG93JykuZm9yRWFjaCgoZmxvdykgPT4gKGZsb3cuZHJvcFBvbGljeSA9IHRoaXMuX2Ryb3BQb2xpY3kpKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHN1cGVyLnNob3VsZFVwZGF0ZShjaGFuZ2VkUHJvcGVydGllcyk7XG4gIH1cblxuICB1cGRhdGVkKHByb3BzKSB7XG4gICAgaWYgKHByb3BzLmhhcygnZG9jdW1lbnRhdGlvbicpICYmIHRoaXMuZG9jdW1lbnRhdGlvbiAhPSBudWxsICYmIHRoaXMuc2VsZWN0ZWRGbG93c0lkLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRoaXMuX3VwZGF0ZVNlbGVjdGVkRmxvd3MoW3RoaXMuc2VsZWN0ZWRGbG93c0lkWzBdXSk7XG4gICAgfVxuICB9XG5cbiAgX3JlbmRlckZsb3dTdGVwRm9ybShyZWFkb25seU1vZGUpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLl9jdXJyZW50Rmxvd1N0ZXAuX3ZhbHVlcyB8fCB0aGlzLl9jdXJyZW50Rmxvd1N0ZXAuX2luaXRpYWxWYWx1ZXM7XG5cbiAgICBjb25zdCBncm91cHMgPSBbeyBpdGVtczogWydkZXNjcmlwdGlvbicsICdjb25kaXRpb24nXSB9LCB7IG5hbWU6IGkxOG4oJ2d2LXBvbGljeS1zdHVkaW8ucG9saWN5LXNldHRpbmdzJyksIGRlZmF1bHQ6IHRydWUgfV07XG4gICAgcmV0dXJuIGh0bWxgJHtjYWNoZShcbiAgICAgIHRoaXMuX2Zsb3dTdGVwU2NoZW1hICYmIHRoaXMuX2N1cnJlbnRGbG93U3RlcFxuICAgICAgICA/IGh0bWxgPGRpdiBjbGFzcz1cImZsb3ctc3RlcF9fY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxvdy1zdGVwX19mb3JtXCI+XG4gICAgICAgICAgICAgIDxndi1zY2hlbWEtZm9ybVxuICAgICAgICAgICAgICAgIC5pZD1cIiR7RkxPV19TVEVQX0ZPUk1fSUR9XCJcbiAgICAgICAgICAgICAgICAuc2NoZW1hPVwiJHt0aGlzLl9mbG93U3RlcFNjaGVtYX1cIlxuICAgICAgICAgICAgICAgIC5pY29uPVwiZGVzaWduOmVkaXRcIlxuICAgICAgICAgICAgICAgIGhhcy1oZWFkZXJcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZS1vbi1yZW5kZXJcbiAgICAgICAgICAgICAgICAudmFsdWVzPVwiJHt2YWx1ZXN9XCJcbiAgICAgICAgICAgICAgICAuZGlydHk9XCIke3RoaXMuX2N1cnJlbnRGbG93U3RlcC5fdmFsdWVzICE9IG51bGx9XCJcbiAgICAgICAgICAgICAgICA/cmVhZG9ubHk9XCIke3JlYWRvbmx5TW9kZX1cIlxuICAgICAgICAgICAgICAgIHNjcm9sbGFibGVcbiAgICAgICAgICAgICAgICAuZ3JvdXBzPVwiJHtncm91cHN9XCJcbiAgICAgICAgICAgICAgICBAZ3Ytc2NoZW1hLWZvcm06Y2hhbmdlPVwiJHt0aGlzLl9vbkNoYW5nZUZsb3dTdGVwfVwiXG4gICAgICAgICAgICAgICAgQGd2LXNjaGVtYS1mb3JtOnJlc2V0PVwiJHt0aGlzLl9vblJlc2V0Rmxvd1N0ZXB9XCJcbiAgICAgICAgICAgICAgICBAZ3Ytc2NoZW1hLWZvcm06ZmV0Y2gtcmVzb3VyY2VzPVwiJHt0aGlzLl9vbkZldGNoUmVzb3VyY2VzfVwiXG4gICAgICAgICAgICAgICAgQGd2LXNjaGVtYS1mb3JtOnN1Ym1pdD1cIiR7dGhpcy5fb25TdWJtaXRGbG93U3RlcH1cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdiBzbG90PVwidGl0bGVcIiBjbGFzcz1cImZsb3ctc3RlcF9fZm9ybS10aXRsZVwiPiR7dGhpcy5fY3VycmVudEZsb3dTdGVwLnN0ZXAubmFtZX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8Z3YtYnV0dG9uXG4gICAgICAgICAgICAgICAgICBzbG90PVwiaGVhZGVyLWxlZnRcIlxuICAgICAgICAgICAgICAgICAgaWNvbj1cImdlbmVyYWw6Y2xvc2VcIlxuICAgICAgICAgICAgICAgICAgb3V0bGluZWRcbiAgICAgICAgICAgICAgICAgIHNtYWxsXG4gICAgICAgICAgICAgICAgICBAZ3YtYnV0dG9uOmNsaWNrPVwiJHt0aGlzLl9vbkNsb3NlRmxvd1N0ZXBGb3JtfVwiXG4gICAgICAgICAgICAgICAgICB0aXRsZT1cIkNsb3NlXCJcbiAgICAgICAgICAgICAgICA+PC9ndi1idXR0b24+XG4gICAgICAgICAgICAgICAgPGd2LWJ1dHRvblxuICAgICAgICAgICAgICAgICAgc2xvdD1cImhlYWRlci1sZWZ0XCJcbiAgICAgICAgICAgICAgICAgIGljb249XCJob21lOmJvb2tcIlxuICAgICAgICAgICAgICAgICAgP2Rpc2FibGVkPVwiJHt0aGlzLmRvY3VtZW50YXRpb24gIT0gbnVsbH1cIlxuICAgICAgICAgICAgICAgICAgb3V0bGluZWRcbiAgICAgICAgICAgICAgICAgIHNtYWxsXG4gICAgICAgICAgICAgICAgICBAZ3YtYnV0dG9uOmNsaWNrPVwiJHt0aGlzLl9vbk9wZW5Eb2N1bWVudGF0aW9uRnJvbUZvcm19XCJcbiAgICAgICAgICAgICAgICAgIHRpdGxlPVwiT3BlbiBkb2N1bWVudGF0aW9uXCJcbiAgICAgICAgICAgICAgICA+PC9ndi1idXR0b24+XG4gICAgICAgICAgICAgIDwvZ3Ytc2NoZW1hLWZvcm0+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5gXG4gICAgICAgIDogJycsXG4gICAgKX1gO1xuICB9XG5cbiAgX29uQ2xvc2VEb2N1bWVudGF0aW9uKCkge1xuICAgIHRoaXMuZG9jdW1lbnRhdGlvbiA9IG51bGw7XG4gICAgaWYgKHRoaXMuX2N1cnJlbnRGbG93U3RlcCA9PSBudWxsKSB7XG4gICAgICB0aGlzLl9tYXhpbWl6ZVRvcFZpZXcoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2d2LXBvbGljeS1zdHVkaW86a2VlcC1kb2N1bWVudGF0aW9uLWNsb3NlJywgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgX29uRGVsZXRlRmxvdyh7IGRldGFpbCB9KSB7XG4gICAgY29uc3QgZmxvd0lkID0gZGV0YWlsLmNvbnRlbnQuX2lkO1xuICAgIGNvbnN0IHsgZmxvd3MgfSA9IHRoaXMuX2ZpbmRGbG93Q29sbGVjdGlvbihmbG93SWQpO1xuICAgIGNvbnN0IGZsb3cgPSBmbG93cy5maW5kKChmbG93KSA9PiBmbG93Ll9pZCA9PT0gZmxvd0lkKTtcbiAgICB0aGlzLl9kZWxldGVGbG93KGZsb3dzLCBmbG93KTtcbiAgfVxuXG4gIGdldCBkZWZpbmVkRmxvd3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RlZmluaXRpb24gJiYgdGhpcy5fZGVmaW5pdGlvbi5mbG93cyA/IHRoaXMuX2RlZmluaXRpb24uZmxvd3MgOiBbXTtcbiAgfVxuXG4gIGdldCBkZWZpbmVkUGxhbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RlZmluaXRpb24gJiYgdGhpcy5fZGVmaW5pdGlvbi5wbGFucyA/IHRoaXMuX2RlZmluaXRpb24ucGxhbnMgOiBbXTtcbiAgfVxuXG4gIGdldCBkZWZpbmVkUmVzb3VyY2VzKCkge1xuICAgIHJldHVybiB0aGlzLl9kZWZpbml0aW9uICYmIHRoaXMuX2RlZmluaXRpb24ucmVzb3VyY2VzID8gdGhpcy5fZGVmaW5pdGlvbi5yZXNvdXJjZXMgOiBbXTtcbiAgfVxuXG4gIGdldCBkZWZpbmVkUHJvcGVydGllcygpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVmaW5pdGlvbiAmJiB0aGlzLl9kZWZpbml0aW9uLnByb3BlcnRpZXMgPyB0aGlzLl9kZWZpbml0aW9uLnByb3BlcnRpZXMgOiBbXTtcbiAgfVxuXG4gIGFzeW5jIF9vbkR1cGxpY2F0ZUZsb3coeyBkZXRhaWwgfSkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl9hc2tUb1ZhbGlkYXRlRm9ybXMoKTtcblxuICAgICAgY29uc3QgZmxvd0lkID0gZGV0YWlsLmNvbnRlbnQuX2lkO1xuICAgICAgY29uc3QgeyBwbGFuLCBmbG93cyB9ID0gdGhpcy5fZmluZEZsb3dDb2xsZWN0aW9uKGZsb3dJZCk7XG4gICAgICB0aGlzLl9hZGRGbG93KGZsb3dzLCB0aGlzLl9maW5kRmxvd0J5SWQoZmxvd0lkKSk7XG4gICAgICBpZiAocGxhbiAhPSBudWxsKSB7XG4gICAgICAgIGxldCBwbGFuSW5kZXggPSBudWxsO1xuICAgICAgICB0aGlzLmRlZmluZWRQbGFucy5maW5kKChwLCBpKSA9PiB7XG4gICAgICAgICAgaWYgKHAuaWQgPT09IHBsYW4uaWQpIHtcbiAgICAgICAgICAgIHBsYW5JbmRleCA9IGk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9KTtcbiAgICAgICAgcGxhbi5mbG93cyA9IGZsb3dzO1xuICAgICAgICB0aGlzLmRlZmluZWRQbGFuc1twbGFuSW5kZXhdLmZsb3dzID0gdGhpcy5fZ2VuZXJhdGVQbGFuRmxvd3NJZChwbGFuLCB0cnVlKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlU2VsZWN0ZWRGbG93cyhbdGhpcy5kZWZpbmVkUGxhbnNbcGxhbkluZGV4XS5mbG93c1tmbG93cy5sZW5ndGggLSAxXS5faWRdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2RlZmluaXRpb24uZmxvd3MgPSB0aGlzLl9nZW5lcmF0ZUZsb3dzSWQodGhpcy5fZGVmaW5pdGlvbi5mbG93cyk7XG4gICAgICAgIHRoaXMuX3VwZGF0ZVNlbGVjdGVkRmxvd3MoW3RoaXMuX2RlZmluaXRpb24uZmxvd3NbdGhpcy5fZGVmaW5pdGlvbi5mbG93cy5sZW5ndGggLSAxXS5faWRdKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuX2N1cnJlbnRBc2tDb25maXJtYXRpb24gPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIF9vbkNoYW5nZUZsb3dTdGF0ZSh7IGRldGFpbCB9KSB7XG4gICAgY29uc3QgZmxvdyA9IHRoaXMuX2ZpbmRGbG93QnlJZChkZXRhaWwuY29udGVudC5faWQpO1xuICAgIGZsb3cuZW5hYmxlZCA9IGRldGFpbC5lbmFibGVkO1xuICAgIGZsb3cuX2RpcnR5ID0gdHJ1ZTtcbiAgICB0aGlzLmlzRGlydHkgPSB0cnVlO1xuICB9XG5cbiAgYXN5bmMgX29uQWRkRmxvd1BsYW4oeyBkZXRhaWwgfSkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLl9hc2tUb1ZhbGlkYXRlRm9ybXMoKTtcbiAgICAgIHRoaXMuX2FkZEZsb3codGhpcy5kZWZpbmVkUGxhbnNbZGV0YWlsLnBsYW5JbmRleF0uZmxvd3MpO1xuICAgICAgdGhpcy5kZWZpbmVkUGxhbnNbZGV0YWlsLnBsYW5JbmRleF0uZmxvd3MgPSB0aGlzLl9nZW5lcmF0ZVBsYW5GbG93c0lkKHRoaXMuZGVmaW5lZFBsYW5zW2RldGFpbC5wbGFuSW5kZXhdKTtcbiAgICAgIHRoaXMuX3VwZGF0ZVNlbGVjdGVkRmxvd3MoW3RoaXMuZGVmaW5lZFBsYW5zW2RldGFpbC5wbGFuSW5kZXhdLmZsb3dzW3RoaXMuZGVmaW5lZFBsYW5zW2RldGFpbC5wbGFuSW5kZXhdLmZsb3dzLmxlbmd0aCAtIDFdLl9pZF0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5fY3VycmVudEFza0NvbmZpcm1hdGlvbiA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgX29uQWRkRmxvdygpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fYXNrVG9WYWxpZGF0ZUZvcm1zKCk7XG5cbiAgICAgIHRoaXMuX2FkZEZsb3codGhpcy5fZGVmaW5pdGlvbi5mbG93cyk7XG4gICAgICB0aGlzLl9kZWZpbml0aW9uLmZsb3dzID0gdGhpcy5fZ2VuZXJhdGVGbG93c0lkKHRoaXMuX2RlZmluaXRpb24uZmxvd3MpO1xuICAgICAgdGhpcy5fdXBkYXRlU2VsZWN0ZWRGbG93cyhbdGhpcy5fZGVmaW5pdGlvbi5mbG93c1t0aGlzLl9kZWZpbml0aW9uLmZsb3dzLmxlbmd0aCAtIDFdLl9pZF0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5fY3VycmVudEFza0NvbmZpcm1hdGlvbiA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgX2FkZEZsb3coY29sbGVjdGlvbiwgZHVwbGljYXRlID0gbnVsbCkge1xuICAgIGNvbnN0IGZsb3cgPVxuICAgICAgZHVwbGljYXRlID09IG51bGxcbiAgICAgICAgPyB0aGlzLl9jcmVhdGVGbG93RnJvbVNjaGVtYSgpXG4gICAgICAgIDoge1xuICAgICAgICAgICAgLi4uZHVwbGljYXRlLFxuICAgICAgICAgICAgX2lkOiBudWxsLFxuICAgICAgICAgICAgLy8gcmVzZXQgdGhlIGlkIHRvIGF2b2lkIGlzc3VlIHdpdGggQU0gdGhhdCBwZXJzaXN0cyB0aGUgSURcbiAgICAgICAgICAgIGlkOiBudWxsLFxuICAgICAgICAgICAgX2RpcnR5OiB0cnVlLFxuICAgICAgICAgIH07XG5cbiAgICBjb2xsZWN0aW9uLnB1c2goZmxvdyk7XG4gICAgdGhpcy5pc0RpcnR5ID0gdHJ1ZTtcbiAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgfVxuXG4gIF9jcmVhdGVGbG93RnJvbVNjaGVtYSgpIHtcbiAgICBjb25zdCBuZXdGbG93ID0ge1xuICAgICAgbmFtZTogJycsXG4gICAgICBwcmU6IFtdLFxuICAgICAgcG9zdDogW10sXG4gICAgICBfZGlydHk6IHRydWUsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLl9pbnN0YW50aWF0ZSh0aGlzLmZsb3dTY2hlbWEucHJvcGVydGllcywgbmV3Rmxvdyk7XG4gIH1cblxuICBfaW5zdGFudGlhdGUocHJvcGVydGllc0RlZmluaXRpb24sIGluaXRpYXRvciA9IHt9KSB7XG4gICAgY29uc3QgcHJvcGVydHkgPSB7IC4uLmluaXRpYXRvciB9O1xuXG4gICAgaWYgKHByb3BlcnRpZXNEZWZpbml0aW9uKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhwcm9wZXJ0aWVzRGVmaW5pdGlvbikpIHtcbiAgICAgICAgY29uc3QgZW50cnkgPSBwcm9wZXJ0aWVzRGVmaW5pdGlvbltrZXldO1xuXG4gICAgICAgIGlmIChlbnRyeS50eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIHByb3BlcnR5W2tleV0gPSB0aGlzLl9pbnN0YW50aWF0ZShlbnRyeS5wcm9wZXJ0aWVzLCAoaW5pdGlhdG9yID0ge30pKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW50cnkuZGVmYXVsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcHJvcGVydHlba2V5XSA9IGVudHJ5LmRlZmF1bHQ7XG4gICAgICAgIH0gZWxzZSBpZiAoZW50cnkudHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBwcm9wZXJ0eVtrZXldID0gJyc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcHJvcGVydHk7XG4gIH1cblxuICBfZGVsZXRlRmxvdyhjb2xsZWN0aW9uLCBmbG93KSB7XG4gICAgY29uc3QgaW5kZXggPSBjb2xsZWN0aW9uLmluZGV4T2YoZmxvdyk7XG4gICAgY29sbGVjdGlvbi5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIGNvbnN0IHNlbGVjdGVkRmxvd3MgPSB0aGlzLnNlbGVjdGVkRmxvd3NJZC5maWx0ZXIoKGZsb3dJZCkgPT4gZmxvd0lkICE9PSBmbG93Ll9pZCk7XG4gICAgaWYgKHNlbGVjdGVkRmxvd3MubGVuZ3RoID09PSAxKSB7XG4gICAgICB0aGlzLl91cGRhdGVTZWxlY3RlZEZsb3dzKHNlbGVjdGVkRmxvd3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZWxlY3RGaXJzdEZsb3codHJ1ZSk7XG4gICAgfVxuICAgIHRoaXMuX2NoYW5nZVRhYignZGVzaWduJyk7XG4gICAgdGhpcy5fcmVmcmVzaCgpO1xuICAgIHRoaXMuaXNEaXJ0eSA9IHRydWU7XG4gIH1cblxuICBfZmluZEZsb3dJbmRleChsaXN0LCBpZCkge1xuICAgIGxldCBpbmRleCA9IG51bGw7XG4gICAgbGlzdC5maW5kKChmLCBpKSA9PiB7XG4gICAgICBpZiAoZi5faWQgPT09IGlkKSB7XG4gICAgICAgIGluZGV4ID0gaTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG5cbiAgYXN5bmMgX29uUmVvcmRlckZsb3dzKHsgZGV0YWlsOiB7IHBsYW4gfSB9KSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX2Fza1RvVmFsaWRhdGVGb3JtcygpO1xuICAgICAgdGhpcy5pc0RpcnR5ID0gdHJ1ZTtcbiAgICAgIGlmIChwbGFuICE9IG51bGwpIHtcbiAgICAgICAgY29uc3QgbmV3T3JkZXIgPSB0aGlzLl9nZW5lcmF0ZVBsYW5GbG93c0lkKHBsYW4sIHRydWUpO1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEZsb3dzSWQpIHtcbiAgICAgICAgICB0aGlzLl91cGRhdGVTZWxlY3RlZEZsb3dzKFxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEZsb3dzSWQubWFwKChmbG93SWQpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9maW5kRmxvd0luZGV4KHBsYW4uZmxvd3MsIGZsb3dJZCk7XG4gICAgICAgICAgICAgIHJldHVybiBpbmRleCAhPSBudWxsID8gbmV3T3JkZXJbaW5kZXhdLl9pZCA6IGZsb3dJZDtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcGxhbi5mbG93cyA9IG5ld09yZGVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbmV3T3JkZXIgPSB0aGlzLl9nZW5lcmF0ZUZsb3dzSWQodGhpcy5fZGVmaW5pdGlvbi5mbG93cywgdHJ1ZSk7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkRmxvd3NJZCkge1xuICAgICAgICAgIHRoaXMuX3VwZGF0ZVNlbGVjdGVkRmxvd3MoXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkRmxvd3NJZC5tYXAoKGZsb3dJZCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX2ZpbmRGbG93SW5kZXgodGhpcy5fZGVmaW5pdGlvbi5mbG93cywgZmxvd0lkKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGluZGV4ICE9IG51bGwgPyBuZXdPcmRlcltpbmRleF0uX2lkIDogZmxvd0lkO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9kZWZpbml0aW9uLmZsb3dzID0gbmV3T3JkZXI7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLl9jdXJyZW50QXNrQ29uZmlybWF0aW9uID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgX29uU2VhcmNoUG9saWN5KHsgZGV0YWlsIH0pIHtcbiAgICB0aGlzLl9zZWFyY2hQb2xpY3lRdWVyeSA9IGRldGFpbDtcbiAgfVxuXG4gIF9vbkNsZWFyUG9saWN5KCkge1xuICAgIHRoaXMuX3NlYXJjaFBvbGljeVF1ZXJ5ID0gbnVsbDtcbiAgfVxuXG4gIF9vblNlYXJjaEZsb3dzKHsgZGV0YWlsIH0pIHtcbiAgICB0aGlzLl9zZWFyY2hGbG93UXVlcnkgPSBkZXRhaWw7XG4gIH1cblxuICBfb25DbGVhckZsb3dzKCkge1xuICAgIHRoaXMuX3NlYXJjaEZsb3dRdWVyeSA9IG51bGw7XG4gIH1cblxuICBhc3luYyBfb25SZXNldEFsbCgpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fY2xvc2VGbG93U3RlcEZvcm0oKTtcbiAgICAgIHRoaXMuZGVmaW5pdGlvbiA9IGRlZXBDbG9uZSh0aGlzLl9pbml0aWFsRGVmaW5pdGlvbik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5fY3VycmVudEFza0NvbmZpcm1hdGlvbiA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgX2ZpbHRlck5vdFZhbGlkU3RlcChzdGVwKSB7XG4gICAgcmV0dXJuIHN0ZXAuX25ldyAhPT0gdHJ1ZTtcbiAgfVxuXG4gIF9yZW1vdmVQcml2YXRlUHJvcGVydGllcyhvKSB7XG4gICAgY29uc3QgY29weSA9IHsgLi4ubyB9O1xuICAgIE9iamVjdC5rZXlzKG8pXG4gICAgICAuZmlsdGVyKChrZXkpID0+IGtleS5zdGFydHNXaXRoKCdfJykpXG4gICAgICAuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIGRlbGV0ZSBjb3B5W2tleV07XG4gICAgICB9KTtcbiAgICByZXR1cm4gY29weTtcbiAgfVxuXG4gIF9zdWJtaXRPckNvbmZpcm1Gb3JtcygpIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCdndi1zY2hlbWEtZm9ybScpXVxuICAgICAgLmZpbHRlcigoZm9ybSkgPT4ge1xuICAgICAgICBjb25zdCBpc1ZhbGlkID0gZm9ybS5pc1ZhbGlkKCk7XG4gICAgICAgIGlmIChpc1ZhbGlkKSB7XG4gICAgICAgICAgZm9ybS5zdWJtaXQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3JtLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIWlzVmFsaWQ7XG4gICAgICB9KVxuICAgICAgLm1hcCgoZm9ybSkgPT4gZm9ybS5jb25maXJtKCkpO1xuICB9XG5cbiAgZ2V0UHJvcGVydGllc0VsZW1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdndi1wcm9wZXJ0aWVzJyk7XG4gIH1cblxuICBhc3luYyBfY2hlY2tDdXJyZW50Rmxvd1N0ZXAoKSB7XG4gICAgaWYgKHRoaXMuX2N1cnJlbnRGbG93U3RlcCAmJiB0aGlzLnNlbGVjdGVkRmxvd3NJZCkge1xuICAgICAgY29uc3QgY2xvc2VQcm9taXNlcyA9IHRoaXMuc2VsZWN0ZWRGbG93c0lkXG4gICAgICAgIC5tYXAoKGZsb3dJZCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGZsb3cgPSB0aGlzLl9maW5kRmxvd0J5SWQoZmxvd0lkKTtcbiAgICAgICAgICBjb25zdCBjdXJyZW50U3RlcCA9IFsuLi5mbG93LnByZSwgLi4uZmxvdy5wb3N0XS5maW5kKChzdGVwKSA9PiBzdGVwLl9pZCA9PT0gdGhpcy5fY3VycmVudEZsb3dTdGVwLnN0ZXAuX2lkKTtcbiAgICAgICAgICBpZiAoY3VycmVudFN0ZXAgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Nsb3NlRmxvd1N0ZXBGb3JtKHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSlcbiAgICAgICAgLmZpbHRlcigocCkgPT4gcCAhPT0gbnVsbCk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwoY2xvc2VQcm9taXNlcyk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuXG4gIHNhdmVkKCkge1xuICAgIGlmICh0aGlzLmlzRGlydHkpIHtcbiAgICAgIHRoaXMuX2luaXRpYWxEZWZpbml0aW9uID0gZGVlcENsb25lKHRoaXMuX2RlZmluaXRpb25TYXZlZCk7XG4gICAgICB0aGlzLl9kZWZpbml0aW9uID0gZGVlcENsb25lKHRoaXMuX2RlZmluaXRpb25TYXZlZCk7XG4gICAgICB0aGlzLl9kZWZpbml0aW9uU2F2ZWQgPSBudWxsO1xuICAgICAgdGhpcy5pc0RpcnR5ID0gZmFsc2U7XG4gICAgICB0aGlzLl9jaGVja0N1cnJlbnRGbG93U3RlcCgpO1xuICAgICAgdGhpcy5kZWZpbmVkUGxhbnMuZm9yRWFjaCgocGxhbikgPT4ge1xuICAgICAgICBwbGFuLmZsb3dzLmZvckVhY2goKGZsb3cpID0+IChmbG93Ll9kaXJ0eSA9IGZhbHNlKSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuZGVmaW5lZEZsb3dzLmZvckVhY2goKGZsb3cpID0+IChmbG93Ll9kaXJ0eSA9IGZhbHNlKSk7XG4gICAgICB0aGlzLmdldENoaWxkcmVuKCkuZm9yRWFjaCgoZSkgPT4gZS5yZXF1ZXN0VXBkYXRlKCkpO1xuICAgIH1cbiAgfVxuXG4gIF9idWlsZERlZmluaXRpb25Ub1NhdmUoKSB7XG4gICAgLy8gQ29weSBkZWZpbml0aW9uIGFuZCByZW1vdmUgaW52YWxpZCBzdGVwXG4gICAgLy8gS2VlcCBwcml2YXRlIHByb3BlcnRpZXMgbGlrZSBfaWQgYW5kIG90aGVycyBzdHVmZiB1c2VmdWwgZm9yIHJlbmRlclxuICAgIGNvbnN0IGZsb3dzID0gdGhpcy5fZGVmaW5pdGlvbi5mbG93cy5tYXAoKGZsb3cpID0+IHtcbiAgICAgIGZsb3cucHJlID0gZmxvdy5wcmUuZmlsdGVyKHRoaXMuX2ZpbHRlck5vdFZhbGlkU3RlcCk7XG4gICAgICBmbG93LnBvc3QgPSBmbG93LnBvc3QuZmlsdGVyKHRoaXMuX2ZpbHRlck5vdFZhbGlkU3RlcCk7XG4gICAgICByZXR1cm4gZmxvdztcbiAgICB9KTtcblxuICAgIGxldCBkZWZpbml0aW9uID0geyAuLi50aGlzLl9kZWZpbml0aW9uLCBmbG93cyB9O1xuXG4gICAgaWYgKHRoaXMuX2RlZmluaXRpb24ucGxhbnMgIT0gbnVsbCkge1xuICAgICAgY29uc3QgcGxhbnMgPSB0aGlzLl9kZWZpbml0aW9uLnBsYW5zLm1hcCgocGxhbikgPT4ge1xuICAgICAgICBjb25zdCBmbG93cyA9IHBsYW4uZmxvd3MubWFwKChmbG93KSA9PiB7XG4gICAgICAgICAgZmxvdy5wcmUgPSBmbG93LnByZS5maWx0ZXIodGhpcy5fZmlsdGVyTm90VmFsaWRTdGVwKTtcbiAgICAgICAgICBmbG93LnBvc3QgPSBmbG93LnBvc3QuZmlsdGVyKHRoaXMuX2ZpbHRlck5vdFZhbGlkU3RlcCk7XG4gICAgICAgICAgcmV0dXJuIGZsb3c7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyAuLi5wbGFuLCBmbG93cyB9O1xuICAgICAgfSk7XG4gICAgICBkZWZpbml0aW9uID0geyAuLi5kZWZpbml0aW9uLCBwbGFucyB9O1xuICAgIH1cbiAgICByZXR1cm4gZGVmaW5pdGlvbjtcbiAgfVxuXG4gIF9idWlsZERlZmluaXRpb25Ub1NlbmQoZGVmaW5pdGlvblRvU2F2ZSkge1xuICAgIC8vIENvcHkgZGVmaW5pdGlvbiBhbmQgcmVtb3ZlIGFsbCBwcml2YXRlIHByb3BlcnRpZXNcbiAgICBjb25zdCBmbG93cyA9IGRlZmluaXRpb25Ub1NhdmUuZmxvd3MubWFwKChmKSA9PiB7XG4gICAgICBjb25zdCBmbG93ID0gdGhpcy5fcmVtb3ZlUHJpdmF0ZVByb3BlcnRpZXMoZik7XG4gICAgICBmbG93LnByZSA9IGZsb3cucHJlLm1hcCh0aGlzLl9yZW1vdmVQcml2YXRlUHJvcGVydGllcyk7XG4gICAgICBmbG93LnBvc3QgPSBmbG93LnBvc3QubWFwKHRoaXMuX3JlbW92ZVByaXZhdGVQcm9wZXJ0aWVzKTtcbiAgICAgIHJldHVybiBmbG93O1xuICAgIH0pO1xuXG4gICAgbGV0IGRlZmluaXRpb24gPSB7IC4uLnRoaXMuX2RlZmluaXRpb24sIGZsb3dzIH07XG4gICAgaWYgKHRoaXMuX2RlZmluaXRpb24ucGxhbnMgIT0gbnVsbCkge1xuICAgICAgY29uc3QgcGxhbnMgPSBkZWZpbml0aW9uVG9TYXZlLnBsYW5zLm1hcCgocGxhbikgPT4ge1xuICAgICAgICBjb25zdCBmbG93cyA9IHBsYW4uZmxvd3MubWFwKChmKSA9PiB7XG4gICAgICAgICAgY29uc3QgZmxvdyA9IHRoaXMuX3JlbW92ZVByaXZhdGVQcm9wZXJ0aWVzKGYpO1xuICAgICAgICAgIGZsb3cucHJlID0gZmxvdy5wcmUubWFwKHRoaXMuX3JlbW92ZVByaXZhdGVQcm9wZXJ0aWVzKTtcbiAgICAgICAgICBmbG93LnBvc3QgPSBmbG93LnBvc3QubWFwKHRoaXMuX3JlbW92ZVByaXZhdGVQcm9wZXJ0aWVzKTtcbiAgICAgICAgICByZXR1cm4gZmxvdztcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7IC4uLnBsYW4sIGZsb3dzIH07XG4gICAgICB9KTtcbiAgICAgIGRlZmluaXRpb24gPSB7IC4uLmRlZmluaXRpb24sIHBsYW5zIH07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2RlZmluaXRpb24ucHJvcGVydGllcyAhPSBudWxsKSB7XG4gICAgICBjb25zdCBwcm9wZXJ0aWVzID0gdGhpcy5fZGVmaW5pdGlvbi5wcm9wZXJ0aWVzLm1hcCh0aGlzLl9yZW1vdmVQcml2YXRlUHJvcGVydGllcyk7XG4gICAgICBkZWZpbml0aW9uID0geyAuLi5kZWZpbml0aW9uLCBwcm9wZXJ0aWVzIH07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2RlZmluaXRpb24ucmVzb3VyY2VzICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHJlc291cmNlcyA9IHRoaXMuX2RlZmluaXRpb24ucmVzb3VyY2VzLm1hcCh0aGlzLl9yZW1vdmVQcml2YXRlUHJvcGVydGllcyk7XG4gICAgICBkZWZpbml0aW9uID0geyAuLi5kZWZpbml0aW9uLCByZXNvdXJjZXMgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5pdGlvbjtcbiAgfVxuXG4gIF9vblNhdmVBbGwoKSB7XG4gICAgaWYgKHRoaXMuaGFzUHJvcGVydGllcykge1xuICAgICAgdGhpcy5nZXRQcm9wZXJ0aWVzRWxlbWVudCgpLnN1Ym1pdCgpO1xuICAgIH1cblxuICAgIFByb21pc2UuYWxsKHRoaXMuX3N1Ym1pdE9yQ29uZmlybUZvcm1zKCkpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuX2RlZmluaXRpb25TYXZlZCA9IHRoaXMuX2J1aWxkRGVmaW5pdGlvblRvU2F2ZSgpO1xuICAgICAgICBjb25zdCBkZWZpbml0aW9uID0gdGhpcy5fYnVpbGREZWZpbml0aW9uVG9TZW5kKHRoaXMuX2RlZmluaXRpb25TYXZlZCk7XG4gICAgICAgIGRpc3BhdGNoQ3VzdG9tRXZlbnQodGhpcywgJ3NhdmUnLCB7IGRlZmluaXRpb24sIHNlcnZpY2VzOiB0aGlzLnNlcnZpY2VzIH0pO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFtwb2xpY3ktc3R1ZGlvXSBFcnJvciBvbiBzYXZlYCwgZXJyKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgX29uRGVidWcocmVxdWVzdEV2ZW50KSB7XG4gICAgaWYgKHRoaXMuaGFzUHJvcGVydGllcykge1xuICAgICAgdGhpcy5nZXRQcm9wZXJ0aWVzRWxlbWVudCgpLnN1Ym1pdCgpO1xuICAgIH1cblxuICAgIFByb21pc2UuYWxsKHRoaXMuX3N1Ym1pdE9yQ29uZmlybUZvcm1zKCkpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIGNvbnN0IGRlZmluaXRpb24gPSB0aGlzLl9idWlsZERlZmluaXRpb25Ub1NlbmQodGhpcy5fYnVpbGREZWZpbml0aW9uVG9TYXZlKCkpO1xuICAgICAgICBkaXNwYXRjaEN1c3RvbUV2ZW50KHRoaXMsICdkZWJ1ZycsIHsgZGVmaW5pdGlvbiwgc2VydmljZXM6IHRoaXMuc2VydmljZXMsIHJlcXVlc3Q6IHJlcXVlc3RFdmVudC5kZXRhaWwucmVxdWVzdCB9KTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBbcG9saWN5LXN0dWRpb10gRXJyb3Igb24gZGVidWdgLCBlcnIpO1xuICAgICAgfSk7XG4gIH1cblxuICBnZXQgZmlsdGVyZWRGbG93cygpIHtcbiAgICBpZiAodGhpcy5fZmxvd0ZpbHRlci5sZW5ndGggPT09IDAgfHwgdGhpcy5fZmxvd0ZpbHRlci5pbmNsdWRlcygnYXBpJykpIHtcbiAgICAgIHJldHVybiB0aGlzLmRlZmluZWRGbG93cztcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXQgZmlsdGVyZWRQbGFucygpIHtcbiAgICBpZiAodGhpcy5fZmxvd0ZpbHRlci5sZW5ndGggPT09IDAgfHwgdGhpcy5fZmxvd0ZpbHRlci5pbmNsdWRlcygncGxhbicpKSB7XG4gICAgICByZXR1cm4gdGhpcy5kZWZpbmVkUGxhbnM7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgX29uRmlsdGVyRmxvd3MoeyBkZXRhaWwgfSkge1xuICAgIGlmICh0aGlzLl9mbG93RmlsdGVyLmluY2x1ZGVzKGRldGFpbC5pZCkpIHtcbiAgICAgIHRoaXMuX2Zsb3dGaWx0ZXIgPSBbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZmxvd0ZpbHRlciA9IFtkZXRhaWwuaWRdO1xuICAgIH1cbiAgfVxuXG4gIF9nZXRGaWx0ZXJlZFBvbGljaWVzKCkge1xuICAgIGlmICh0aGlzLl9wb2xpY3lGaWx0ZXIubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHRoaXMucG9saWNpZXMuZmlsdGVyKChwb2xpY3kpID0+IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAocG9saWN5Lm9uUmVxdWVzdCAmJiB0aGlzLl9wb2xpY3lGaWx0ZXIuaW5jbHVkZXMoJ29uUmVxdWVzdCcpKSB8fCAocG9saWN5Lm9uUmVzcG9uc2UgJiYgdGhpcy5fcG9saWN5RmlsdGVyLmluY2x1ZGVzKCdvblJlc3BvbnNlJykpXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucG9saWNpZXM7XG4gIH1cblxuICBfb25GaWx0ZXJQb2xpY2llcyh7IGRldGFpbCB9KSB7XG4gICAgaWYgKHRoaXMuX3BvbGljeUZpbHRlci5pbmNsdWRlcyhkZXRhaWwuaWQpKSB7XG4gICAgICB0aGlzLl9wb2xpY3lGaWx0ZXIgPSBbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcG9saWN5RmlsdGVyID0gW2RldGFpbC5pZF07XG4gICAgfVxuICB9XG5cbiAgX3JlbmRlckRlc2lnbihyZWFkb25seU1vZGUpIHtcbiAgICByZXR1cm4gaHRtbGAgPGRpdiBpZD1cImRlc2lnblwiIHNsb3Q9XCJjb250ZW50XCIgY2xhc3M9XCJkZXNpZ25cIj5cbiAgICAgIDxndi1yZXNpemFibGUtdmlld3Mgbm8tb3ZlcmZsb3c+XG4gICAgICAgIDxkaXYgc2xvdD1cInRvcFwiPiR7dGhpcy5fcmVuZGVyRmxvdygwLCB0cnVlLCByZWFkb25seU1vZGUpfTwvZGl2PlxuXG4gICAgICAgIDxkaXYgc2xvdD1cImJvdHRvbVwiPlxuICAgICAgICAgICR7dGhpcy5fcmVuZGVyRmxvdygxLCBmYWxzZSwgcmVhZG9ubHlNb2RlKX0gJHt0aGlzLl9yZW5kZXJQb2xpY3kocmVhZG9ubHlNb2RlKX0gJHt0aGlzLl9yZW5kZXJGbG93Rm9ybShyZWFkb25seU1vZGUpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZ3YtcmVzaXphYmxlLXZpZXdzPlxuICAgICAgJHtyZWFkb25seU1vZGUgIT09IHRydWVcbiAgICAgICAgPyBodG1sYDxndi1wb2xpY3ktc3R1ZGlvLW1lbnVcbiAgICAgICAgICAgIGNsYXNzPVwicmlnaHQtbWVudVwiXG4gICAgICAgICAgICA/ZGlzYWJsZWQ9XCIke3RoaXMuX2N1cnJlbnRBc2tDb25maXJtYXRpb259XCJcbiAgICAgICAgICAgIC5wb2xpY2llcz1cIiR7dGhpcy5fZ2V0RmlsdGVyZWRQb2xpY2llcygpfVwiXG4gICAgICAgICAgICAuc2VsZWN0ZWRJZHM9XCIke1t0aGlzLl9jdXJyZW50UG9saWN5SWRdfVwiXG4gICAgICAgICAgICAucXVlcnk9XCIke3RoaXMuX3NlYXJjaFBvbGljeVF1ZXJ5fVwiXG4gICAgICAgICAgICA/aGFzLXBvbGljeS1maWx0ZXI9XCIke3RoaXMuX3BvbGljeUZpbHRlck9wdGlvbnMgIT0gbnVsbH1cIlxuICAgICAgICAgICAgP3JlYWRvbmx5PVwiJHtyZWFkb25seU1vZGV9XCJcbiAgICAgICAgICAgIEBndi1wb2xpY3ktc3R1ZGlvLW1lbnU6dGFyZ2V0LXBvbGljeT1cIiR7dGhpcy5fb25UYXJnZXRQb2xpY3l9XCJcbiAgICAgICAgICAgIEBndi1wb2xpY3ktc3R1ZGlvLW1lbnU6ZmV0Y2gtZG9jdW1lbnRhdGlvbj1cIiR7dGhpcy5fb25PcGVuRG9jdW1lbnRhdGlvbkZyb21NZW51fVwiXG4gICAgICAgICAgICBAZ3YtcG9saWN5LXN0dWRpby1tZW51OmRyYWdlbmQtcG9saWN5PVwiJHt0aGlzLl9vbkRyYWdFbmRQb2xpY3l9XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2IHNsb3Q9XCJoZWFkZXJcIiBjbGFzcz1cInNlYXJjaC1wb2xpY2llc1wiPlxuICAgICAgICAgICAgICAke3RoaXMuX3BvbGljeUZpbHRlck9wdGlvbnMgIT0gbnVsbFxuICAgICAgICAgICAgICAgID8gaHRtbGA8Z3Ytb3B0aW9uXG4gICAgICAgICAgICAgICAgICAgID9kaXNhYmxlZD1cIiR7dGhpcy5fY3VycmVudEFza0NvbmZpcm1hdGlvbn1cIlxuICAgICAgICAgICAgICAgICAgICAub3B0aW9ucz1cIiR7dGhpcy5fcG9saWN5RmlsdGVyT3B0aW9uc31cIlxuICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZVxuICAgICAgICAgICAgICAgICAgICBvdXRsaW5lZFxuICAgICAgICAgICAgICAgICAgICAudmFsdWU9XCIke3RoaXMuX3BvbGljeUZpbHRlcn1cIlxuICAgICAgICAgICAgICAgICAgICBzbWFsbFxuICAgICAgICAgICAgICAgICAgICBAZ3Ytb3B0aW9uOnNlbGVjdD1cIiR7dGhpcy5fb25GaWx0ZXJQb2xpY2llc31cIlxuICAgICAgICAgICAgICAgICAgPjwvZ3Ytb3B0aW9uPmBcbiAgICAgICAgICAgICAgICA6ICcnfVxuICAgICAgICAgICAgICA8Z3YtaW5wdXRcbiAgICAgICAgICAgICAgICBpZD1cInNlYXJjaC1wb2xpY3lcIlxuICAgICAgICAgICAgICAgID9kaXNhYmxlZD1cIiR7dGhpcy5fY3VycmVudEFza0NvbmZpcm1hdGlvbn1cIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRmlsdGVyIHBvbGljaWVzIChTaGlmdCArIEN0cmwgKyBTcGFjZSlcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJzZWFyY2hcIlxuICAgICAgICAgICAgICAgIHNtYWxsXG4gICAgICAgICAgICAgICAgQGd2LWlucHV0OmlucHV0PVwiJHt0aGlzLl9vblNlYXJjaFBvbGljeX1cIlxuICAgICAgICAgICAgICAgIEBndi1pbnB1dDpjbGVhcj1cIiR7dGhpcy5fb25DbGVhclBvbGljeX1cIlxuICAgICAgICAgICAgICA+PC9ndi1pbnB1dD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZ3YtcG9saWN5LXN0dWRpby1tZW51PmBcbiAgICAgICAgOiAnJ31cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgX3JlbmRlckRlYnVnKCkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gdGhpcy5kZWJ1Z1Jlc3BvbnNlID8gdGhpcy5kZWJ1Z1Jlc3BvbnNlLnJlc3BvbnNlIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGlzTG9hZGluZyA9IHRoaXMuZGVidWdSZXNwb25zZSA/IHRoaXMuZGVidWdSZXNwb25zZS5pc0xvYWRpbmcgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgcGF0aCA9IHRoaXMuZGVidWdSZXNwb25zZSAmJiB0aGlzLmRlYnVnUmVzcG9uc2UucmVxdWVzdCA/IHRoaXMuZGVidWdSZXNwb25zZS5yZXF1ZXN0LnBhdGggOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbWV0aG9kID0gdGhpcy5kZWJ1Z1Jlc3BvbnNlICYmIHRoaXMuZGVidWdSZXNwb25zZS5yZXF1ZXN0ID8gdGhpcy5kZWJ1Z1Jlc3BvbnNlLnJlcXVlc3QubWV0aG9kIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiBodG1sYDxndi1odHRwLWNsaWVudFxuICAgICAgaWQ9XCJkZWJ1Z1wiXG4gICAgICBzbG90PVwiY29udGVudFwiXG4gICAgICBjbGFzcz1cImRlYnVnXCJcbiAgICAgIEBndi1odHRwLWNsaWVudDpzZW5kPVwiJHt0aGlzLl9vbkRlYnVnfVwiXG4gICAgICAucmVzcG9uc2U9XCIke3Jlc3BvbnNlfVwiXG4gICAgICAucGF0aD1cIiR7cGF0aH1cIlxuICAgICAgLm1ldGhvZD1cIiR7bWV0aG9kfVwiXG4gICAgICA/bG9hZGluZz1cIiR7aXNMb2FkaW5nfVwiXG4gICAgPlxuICAgIDwvZ3YtaHR0cC1jbGllbnQ+YDtcbiAgfVxuXG4gIF9yZW5kZXJDb25maWd1cmF0aW9uRm9ybShyZWFkb25seU1vZGUpIHtcbiAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uU2NoZW1hKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSBkZWVwQ2xvbmUodGhpcy5fZGVmaW5pdGlvbik7XG4gICAgICByZXR1cm4gaHRtbGAgPGRpdiBpZD1cInNldHRpbmdzXCIgc2xvdD1cImNvbnRlbnRcIiBjbGFzcz1cImFwaS1zZXR0aW5nc1wiIEBkcmFnb3Zlcj1cIiR7dGhpcy5fb25EZXNpZ259XCI+XG4gICAgICAgIDxndi1zY2hlbWEtZm9ybVxuICAgICAgICAgIC5zY2hlbWE9XCIke3RoaXMuY29uZmlndXJhdGlvblNjaGVtYX1cIlxuICAgICAgICAgIGlkPVwiYXBpLXNldHRpbmdzLWZvcm1cIlxuICAgICAgICAgIC52YWx1ZXM9XCIke3ZhbHVlc31cIlxuICAgICAgICAgIGhhcy1oZWFkZXJcbiAgICAgICAgICBoYXMtZm9vdGVyXG4gICAgICAgICAgc2Nyb2xsYWJsZVxuICAgICAgICAgID9yZWFkb25seT1cIiR7cmVhZG9ubHlNb2RlfVwiXG4gICAgICAgICAgQGd2LXNjaGVtYS1mb3JtOmNhbmNlbD1cIiR7dGhpcy5fb25DYW5jZWxGbG93TW9kZX1cIlxuICAgICAgICAgIEBndi1zY2hlbWEtZm9ybTpzdWJtaXQ9XCIke3RoaXMuX29uU3VibWl0Rmxvd01vZGV9XCJcbiAgICAgICAgPlxuICAgICAgICAgICR7IXRoaXMuY29uZmlndXJhdGlvbkluZm9ybWF0aW9uXG4gICAgICAgICAgICA/ICcnXG4gICAgICAgICAgICA6IGh0bWxgXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFwaS1zZXR0aW5ncy1pbmZvcm1hdGlvblwiIHNsb3Q9XCJ0aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgPGd2LWljb24gY2xhc3M9XCJhcGktc2V0dGluZ3MtaW5mb3JtYXRpb25fX2ljb25cIiB0aXRsZT1cIkluZm9cIiBzaGFwZT1cImNvZGU6aW5mb1wiPjwvZ3YtaWNvbj5cbiAgICAgICAgICAgICAgICAgIDxibG9ja3F1b3RlIGNsYXNzPVwiYXBpLXNldHRpbmdzLWluZm9ybWF0aW9uX19ibG9ja3F1b3RlXCI+JHt0aGlzLmNvbmZpZ3VyYXRpb25JbmZvcm1hdGlvbn08L2Jsb2NrcXVvdGU+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIGB9XG4gICAgICAgIDwvZ3Ytc2NoZW1hLWZvcm0+XG4gICAgICA8L2Rpdj5gO1xuICAgIH1cbiAgICByZXR1cm4gaHRtbGBgO1xuICB9XG5cbiAgX3JlbmRlckZsb3dGb3JtKHJlYWRvbmx5TW9kZSkge1xuICAgIGlmICh0aGlzLmZsb3dTY2hlbWEgJiYgdGhpcy5fZmxvd1N0ZXBTY2hlbWEgPT0gbnVsbCAmJiB0aGlzLmRvY3VtZW50YXRpb24gPT0gbnVsbCAmJiB0aGlzLnNlbGVjdGVkRmxvd3NJZC5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IGZsb3cgPSB0aGlzLmdldFNlbGVjdGVkRmxvdygpO1xuICAgICAgaWYgKGZsb3cpIHtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gZGVlcENsb25lKGZsb3cpO1xuICAgICAgICByZXR1cm4gaHRtbGA8ZGl2IHNsb3Q9XCJjb250ZW50XCIgY2xhc3M9XCJmbG93LXNldHRpbmdzXCI+XG4gICAgICAgICAgPGd2LXNjaGVtYS1mb3JtXG4gICAgICAgICAgICAuc2NoZW1hPVwiJHt0aGlzLmZsb3dTY2hlbWF9XCJcbiAgICAgICAgICAgIGlkPVwic2V0dGluZ3MtZm9ybVwiXG4gICAgICAgICAgICAudmFsdWVzPVwiJHt2YWx1ZXN9XCJcbiAgICAgICAgICAgIGhhcy1oZWFkZXJcbiAgICAgICAgICAgIHNjcm9sbGFibGVcbiAgICAgICAgICAgID9yZWFkb25seT1cIiR7cmVhZG9ubHlNb2RlfVwiXG4gICAgICAgICAgICBAZ3Ytc2NoZW1hLWZvcm06Y2FuY2VsPVwiJHt0aGlzLl9vbkNhbmNlbEZsb3d9XCJcbiAgICAgICAgICAgIEBndi1zY2hlbWEtZm9ybTpzdWJtaXQ9XCIke3RoaXMuX29uU3VibWl0Rmxvd31cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgc2xvdD1cInRpdGxlXCIgY2xhc3M9XCJmbG93LXN0ZXBfX2Zvcm0tdGl0bGVcIj5GbG93IGNvbmZpZ3VyYXRpb248L2Rpdj5cbiAgICAgICAgICA8L2d2LXNjaGVtYS1mb3JtPlxuICAgICAgICA8L2Rpdj5gO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9vblJlc291cmNlc0NoYW5nZSh7IGRldGFpbCB9KSB7XG4gICAgdGhpcy5kZWZpbml0aW9uLnJlc291cmNlcyA9IGRldGFpbC5yZXNvdXJjZXM7XG4gICAgdGhpcy5pc0RpcnR5ID0gdHJ1ZTtcbiAgfVxuXG4gIF9vblByb3BlcnRpZXNDaGFuZ2UoeyBkZXRhaWwgfSkge1xuICAgIHRoaXMuZGVmaW5pdGlvbi5wcm9wZXJ0aWVzID0gZGV0YWlsLnByb3BlcnRpZXM7XG4gICAgdGhpcy5pc0RpcnR5ID0gdHJ1ZTtcbiAgfVxuXG4gIF9vblNhdmVQcm92aWRlcih7IGRldGFpbCB9KSB7XG4gICAgdGhpcy5zZXJ2aWNlc1snZHluYW1pYy1wcm9wZXJ0eSddID0gZGV0YWlsLnByb3ZpZGVyO1xuICAgIHRoaXMuaXNEaXJ0eSA9IHRydWU7XG4gIH1cblxuICBfb25Td2l0Y2hFbmNyeXB0ZWRQcm9wZXJ0eSh7IGRldGFpbCB9KSB7XG4gICAgdGhpcy5pc0RpcnR5ID0gdHJ1ZTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCByZWFkb25seU1vZGUgPSB0aGlzLl9nZXRSZWFkb25seU1vZGVGb3JEZXNpZ24oKTtcblxuICAgIHJldHVybiBodG1sYDxkaXYgY2xhc3M9XCJib3hcIj5cbiAgICAgIDxndi1wb2xpY3ktc3R1ZGlvLW1lbnVcbiAgICAgICAgY2xhc3M9XCJsZWZ0LW1lbnVcIlxuICAgICAgICAuYXBpLW5hbWU9XCIke3RoaXMuX2RlZmluaXRpb24ubmFtZX1cIlxuICAgICAgICAuZmxvd3M9XCIke3RoaXMuZmlsdGVyZWRGbG93c31cIlxuICAgICAgICAucGxhbnM9XCIke3RoaXMuZmlsdGVyZWRQbGFuc31cIlxuICAgICAgICAuc2VsZWN0ZWRJZHM9XCIke3RoaXMuc2VsZWN0ZWRGbG93c0lkfVwiXG4gICAgICAgID9kaXNhYmxlZD1cIiR7dGhpcy5fY3VycmVudEFza0NvbmZpcm1hdGlvbn1cIlxuICAgICAgICA/c29ydGFibGU9XCIke3RoaXMuc29ydGFibGUgJiYgdGhpcy5yZWFkb25seSAhPT0gdHJ1ZX1cIlxuICAgICAgICA/cmVhZG9ubHk9XCIke3RoaXMucmVhZG9ubHl9XCJcbiAgICAgICAgP3JlYWRvbmx5UGxhbnM9XCIke3RoaXMucmVhZG9ubHlQbGFuc31cIlxuICAgICAgICBmbG93cy10aXRsZT1cIiR7dGhpcy5mbG93c1RpdGxlfVwiXG4gICAgICAgIC5xdWVyeT1cIiR7dGhpcy5fc2VhcmNoRmxvd1F1ZXJ5fVwiXG4gICAgICAgID9jYW4tYWRkPVwiJHt0aGlzLmNhbkFkZCAmJiAhdGhpcy5yZWFkb25seX1cIlxuICAgICAgICBAZ3YtcG9saWN5LXN0dWRpby1tZW51OnJlb3JkZXItZmxvd3M9XCIke3RoaXMuX29uUmVvcmRlckZsb3dzfVwiXG4gICAgICAgIEBndi1wb2xpY3ktc3R1ZGlvLW1lbnU6Y2hhbmdlLWZsb3ctc3RhdGU9XCIke3RoaXMuX29uQ2hhbmdlRmxvd1N0YXRlfVwiXG4gICAgICAgIEBndi1wb2xpY3ktc3R1ZGlvLW1lbnU6YWRkLWZsb3c9XCIke3RoaXMuX29uQWRkRmxvd31cIlxuICAgICAgICBAZ3YtcG9saWN5LXN0dWRpby1tZW51OmFkZC1mbG93LXBsYW49XCIke3RoaXMuX29uQWRkRmxvd1BsYW59XCJcbiAgICAgICAgQGd2LXBvbGljeS1zdHVkaW8tbWVudTpkZWxldGUtZmxvdz1cIiR7dGhpcy5fb25EZWxldGVGbG93fVwiXG4gICAgICAgIEBndi1wb2xpY3ktc3R1ZGlvLW1lbnU6ZHVwbGljYXRlLWZsb3c9XCIke3RoaXMuX29uRHVwbGljYXRlRmxvd31cIlxuICAgICAgICBAZ3YtcG9saWN5LXN0dWRpby1tZW51OnNlbGVjdC1mbG93cz1cIiR7dGhpcy5fb25TZWxlY3RGbG93c31cIlxuICAgICAgPlxuICAgICAgICA8ZGl2IHNsb3Q9XCJoZWFkZXJcIiBjbGFzcz1cImhlYWRlci1hY3Rpb25zXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+JHt0aGlzLl9kZWZpbml0aW9uLm5hbWV9PC9kaXY+XG4gICAgICAgICAgJHt0aGlzLl9mbG93RmlsdGVyT3B0aW9ucyAhPSBudWxsXG4gICAgICAgICAgICA/IGh0bWxgPGd2LW9wdGlvblxuICAgICAgICAgICAgICAgID9kaXNhYmxlZD1cIiR7dGhpcy5fY3VycmVudEFza0NvbmZpcm1hdGlvbn1cIlxuICAgICAgICAgICAgICAgIC5vcHRpb25zPVwiJHt0aGlzLl9mbG93RmlsdGVyT3B0aW9uc31cIlxuICAgICAgICAgICAgICAgIG11bHRpcGxlXG4gICAgICAgICAgICAgICAgb3V0bGluZWRcbiAgICAgICAgICAgICAgICAudmFsdWU9XCIke3RoaXMuX2Zsb3dGaWx0ZXJ9XCJcbiAgICAgICAgICAgICAgICBzbWFsbFxuICAgICAgICAgICAgICAgIEBndi1vcHRpb246c2VsZWN0PVwiJHt0aGlzLl9vbkZpbHRlckZsb3dzfVwiXG4gICAgICAgICAgICAgID48L2d2LW9wdGlvbj5gXG4gICAgICAgICAgICA6ICcnfVxuICAgICAgICAgIDxndi1pbnB1dFxuICAgICAgICAgICAgP2Rpc2FibGVkPVwiJHt0aGlzLl9jdXJyZW50QXNrQ29uZmlybWF0aW9ufVwiXG4gICAgICAgICAgICBpZD1cInNlYXJjaC1mbG93XCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRmlsdGVyIGZsb3dzIChDdHJsICsgU3BhY2UpXCJcbiAgICAgICAgICAgIHR5cGU9XCJzZWFyY2hcIlxuICAgICAgICAgICAgc21hbGxcbiAgICAgICAgICAgIEBndi1pbnB1dDppbnB1dD1cIiR7dGhpcy5fb25TZWFyY2hGbG93c31cIlxuICAgICAgICAgICAgQGd2LWlucHV0OmNsZWFyPVwiJHt0aGlzLl9vbkNsZWFyRmxvd3N9XCJcbiAgICAgICAgICA+PC9ndi1pbnB1dD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgJHt0aGlzLnJlYWRvbmx5ICE9PSB0cnVlXG4gICAgICAgICAgPyBodG1sYCA8ZGl2IHNsb3Q9XCJmb290ZXJcIiBjbGFzcz1cImZvb3Rlci1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgIDxndi1idXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1sYXJnZVwiXG4gICAgICAgICAgICAgICAgLmRpc2FibGVkPVwiJHshdGhpcy5pc0RpcnR5IHx8IHRoaXMuX2N1cnJlbnRBc2tDb25maXJtYXRpb259XCJcbiAgICAgICAgICAgICAgICBAZ3YtYnV0dG9uOmNsaWNrPVwiJHt0aGlzLl9vblNhdmVBbGx9XCJcbiAgICAgICAgICAgICAgICA+U2F2ZTwvZ3YtYnV0dG9uXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGd2LWJ1dHRvbiBsaW5rIC5kaXNhYmxlZD1cIiR7IXRoaXMuaXNEaXJ0eSB8fCB0aGlzLl9jdXJyZW50QXNrQ29uZmlybWF0aW9ufVwiIEBndi1idXR0b246Y2xpY2s9XCIke3RoaXMuX29uUmVzZXRBbGx9XCJcbiAgICAgICAgICAgICAgICA+UmVzZXQ8L2d2LWJ1dHRvblxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICA8L2Rpdj5gXG4gICAgICAgICAgOiAnJ31cbiAgICAgIDwvZ3YtcG9saWN5LXN0dWRpby1tZW51PlxuXG4gICAgICA8Z3YtdGFic1xuICAgICAgICAudmFsdWU9XCIke3RoaXMudGFiSWR9XCJcbiAgICAgICAgLm9wdGlvbnM9XCIke3RoaXMuX3RhYnN9XCJcbiAgICAgICAgLmRpc2FibGVkPVwiJHt0aGlzLl9jdXJyZW50QXNrQ29uZmlybWF0aW9ufVwiXG4gICAgICAgIEBndi10YWJzOmNoYW5nZT1cIiR7dGhpcy5fb25DaGFuZ2VUYWJ9XCJcbiAgICAgICAgLnZhbGlkYXRvcj1cIiR7dGhpcy5fY2hhbmdlVGFiVmFsaWRhdG9yLmJpbmQodGhpcyl9XCJcbiAgICAgID5cbiAgICAgICAgJHt0aGlzLl9yZW5kZXJEZXNpZ24ocmVhZG9ubHlNb2RlKX0gJHt0aGlzLl9yZW5kZXJDb25maWd1cmF0aW9uRm9ybShyZWFkb25seU1vZGUpfSAke3RoaXMuX3JlbmRlckRlYnVnKCl9XG4gICAgICAgIDxndi1wcm9wZXJ0aWVzXG4gICAgICAgICAgaWQ9XCJwcm9wZXJ0aWVzXCJcbiAgICAgICAgICBzbG90PVwiY29udGVudFwiXG4gICAgICAgICAgY2xhc3M9XCJwcm9wZXJ0aWVzXCJcbiAgICAgICAgICAucHJvdmlkZXI9XCIke3RoaXMuc2VydmljZXNbJ2R5bmFtaWMtcHJvcGVydHknXX1cIlxuICAgICAgICAgIEBndi1wcm9wZXJ0aWVzOmNoYW5nZT1cIiR7dGhpcy5fb25Qcm9wZXJ0aWVzQ2hhbmdlfVwiXG4gICAgICAgICAgQGd2LXByb3BlcnRpZXM6c2F2ZS1wcm92aWRlcj1cIiR7dGhpcy5fb25TYXZlUHJvdmlkZXJ9XCJcbiAgICAgICAgICBAZ3YtcHJvcGVydGllczpzd2l0Y2gtZW5jcnlwdGVkPVwiJHt0aGlzLl9vblN3aXRjaEVuY3J5cHRlZFByb3BlcnR5fVwiXG4gICAgICAgICAgP3JlYWRvbmx5PVwiJHtyZWFkb25seU1vZGV9XCJcbiAgICAgICAgICBlbmNyeXB0YWJsZT1cInRydWVcIlxuICAgICAgICAgIC5wcm9wZXJ0aWVzPVwiJHt0aGlzLmRlZmluZWRQcm9wZXJ0aWVzfVwiXG4gICAgICAgICAgLnByb3ZpZGVycz1cIiR7dGhpcy5wcm9wZXJ0eVByb3ZpZGVyc31cIlxuICAgICAgICAgIC5keW5hbWljUHJvcGVydHlTY2hlbWE9XCIke3RoaXMuZHluYW1pY1Byb3BlcnR5U2NoZW1hfVwiXG4gICAgICAgID48L2d2LXByb3BlcnRpZXM+XG4gICAgICAgIDxndi1yZXNvdXJjZXNcbiAgICAgICAgICBpZD1cInJlc291cmNlc1wiXG4gICAgICAgICAgc2xvdD1cImNvbnRlbnRcIlxuICAgICAgICAgIGNsYXNzPVwicmVzb3VyY2VzXCJcbiAgICAgICAgICBAZ3YtcmVzb3VyY2VzOmNoYW5nZT1cIiR7dGhpcy5fb25SZXNvdXJjZXNDaGFuZ2V9XCJcbiAgICAgICAgICA/cmVhZG9ubHk9XCIke3JlYWRvbmx5TW9kZX1cIlxuICAgICAgICAgIC5yZXNvdXJjZXM9XCIke3RoaXMuZGVmaW5lZFJlc291cmNlc31cIlxuICAgICAgICAgIC50eXBlcz1cIiR7dGhpcy5yZXNvdXJjZVR5cGVzfVwiXG4gICAgICAgID48L2d2LXJlc291cmNlcz5cbiAgICAgIDwvZ3YtdGFicz5cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZSBpZiB0aGUgZGVzaWduIHZpZXcgc2hvdWxkIGJlIGluIHJlYWRvbmx5IG1vZGUgb3Igbm90XG4gICAqIEl0IGlzIGluIHJlYWRvbmx5IG1vZGUgaWY6XG4gICAqICB0aGUgcmVhZG9ubHkgYXR0cmlidXRlIGlzIHNldCB0byB0cnVlXG4gICAqICBPUlxuICAgKiAgdGhlIG1haW4gc2VsZWN0ZWQgZmxvdyBiZWxvbmdzIHRvIGEgcGxhbiBhbmQgdGhlIHJlYWRvbmx5LXBsYW5zIGF0dHJpYnV0ZSBpcyBzZXQgdG8gdHJ1ZVxuICAgKiAgT1JcbiAgICogIHRoZSBzZWNvbmQgZmxvdyBmb3IgY29tcGFyaXNvbiBiZWxvbmdzIHRvIGEgcGxhbiBhbmQgdGhlIHJlYWRvbmx5LXBsYW5zIGF0dHJpYnV0ZSBpcyBzZXQgdG8gdHJ1ZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbnwqfHt0eXBlOiBCb29sZWFuQ29uc3RydWN0b3J9fHthdHRyaWJ1dGU6IHN0cmluZywgdHlwZTogQm9vbGVhbkNvbnN0cnVjdG9yfXx7dHlwZTogKn18e2F0dHJpYnV0ZTogc3RyaW5nLCB0eXBlOiAqfX1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9nZXRSZWFkb25seU1vZGVGb3JEZXNpZ24oKSB7XG4gICAgaWYgKHRoaXMucmVhZG9ubHkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGZsb3cgPSB0aGlzLmdldFNlbGVjdGVkRmxvdygwKTtcbiAgICBpZiAoIWZsb3cpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHBsYW46IGZsb3dQbGFuIH0gPSB0aGlzLl9maW5kRmxvd0NvbGxlY3Rpb24oZmxvdy5faWQpO1xuICAgIGNvbnN0IHJlYWRvbmx5TW9kZSA9IGZsb3dQbGFuICYmIHRoaXMucmVhZG9ubHlQbGFucztcbiAgICBpZiAocmVhZG9ubHlNb2RlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wYXJlZEZsb3cgPSB0aGlzLmdldFNlbGVjdGVkRmxvdygxKTtcbiAgICBpZiAoIWNvbXBhcmVkRmxvdykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHsgcGxhbjogY29tcGFyZWRGbG93UGxhbiB9ID0gdGhpcy5fZmluZEZsb3dDb2xsZWN0aW9uKGNvbXBhcmVkRmxvdy5faWQpO1xuICAgIHJldHVybiBjb21wYXJlZEZsb3dQbGFuICYmIHRoaXMucmVhZG9ubHlQbGFucztcbiAgfVxufVxuXG53aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdndi1wb2xpY3ktc3R1ZGlvJywgR3ZQb2xpY3lTdHVkaW8pO1xuIl19