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