dotnetreport-ng 6.2.1 → 6.2.2-beta

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.
@@ -1,3246 +0,0 @@
1
- import { Component, Inject } from '@angular/core';
2
- import { BASE_URL_TOKEN } from './../dotnetreport-lib.di';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "@angular/platform-browser";
5
- import * as i2 from "@angular/common/http";
6
- import * as i3 from "@angular/router";
7
- export class DotnetdashboardComponent {
8
- sanitizer;
9
- cdref;
10
- baseUrl;
11
- http;
12
- route;
13
- baseServiceUrl;
14
- reportTemplates;
15
- queryParams;
16
- constructor(injector, sanitizer, cdref, baseUrl, http, route) {
17
- this.sanitizer = sanitizer;
18
- this.cdref = cdref;
19
- this.baseUrl = baseUrl;
20
- this.http = http;
21
- this.route = route;
22
- this.baseServiceUrl = this.baseUrl + '/api'; // "http://localhost:39378"; \
23
- this.reportTemplates = "";
24
- }
25
- ngOnInit() {
26
- var reports = [];
27
- var dashboards = [];
28
- var adminMode = localStorage.getItem('reportAdminMode') ?? false;
29
- let getDashboardsUrl = this.baseServiceUrl + "/DotNetReportApi/GetDashboards?adminMode=" + adminMode;
30
- let loadSavedDashboard = this.baseServiceUrl + "/DotNetReportApi/LoadSavedDashboard";
31
- let getUsersAndRolesUrl = this.baseServiceUrl + "/DotNetReportApi/GetUsersAndRoles";
32
- getUsersAndRolesUrl = getUsersAndRolesUrl.replace(/[?&]$/, "");
33
- this.http.get(getDashboardsUrl).subscribe((dashboardData) => {
34
- dashboardData.forEach((d) => {
35
- dashboards.push({ id: d.Id, name: d.Name, description: d.Description, selectedReports: d.SelectedReports, schedule: d.Schedule, userId: d.UserId, userRoles: d.UserRoles, viewOnlyUserId: d.ViewOnlyUserId, viewOnlyUserRoles: d.ViewOnlyUserRoles, clientId: d.ClientId, canManage: d.CanManage });
36
- });
37
- this.queryParams = this.route.snapshot.queryParams;
38
- var dashboardId = parseInt(this.queryParams['id'] || '0');
39
- if (!dashboardId && dashboards.length > 0) {
40
- dashboardId = dashboards[0].id;
41
- }
42
- this.http.get(loadSavedDashboard + "?id=" + dashboardId).subscribe((reportsData) => {
43
- reportsData.forEach((r) => {
44
- reports.push({ reportSql: r.ReportSql, reportId: r.ReportId, reportFilter: r.ReportFilter, connectKey: r.ConnectKey, x: r.X, y: r.Y, width: r.Width, height: r.Height });
45
- });
46
- this.http.get(getUsersAndRolesUrl).subscribe((response) => {
47
- let result = response;
48
- let vm = new dashboardViewModel({
49
- runReportUrl: this.baseServiceUrl + '/DotNetReport/Report',
50
- execReportUrl: this.baseServiceUrl + '/DotNetReportApi/RunReport',
51
- runLinkReportUrl: this.baseServiceUrl + '/DotNetReportApi/RunReportLink',
52
- reportWizard: $("#modal-reportbuilder"),
53
- lookupListUrl: this.baseServiceUrl + '/DotNetReportApi/GetLookupList',
54
- apiUrl: this.baseServiceUrl + '/DotNetReportApi/CallReportApi',
55
- runReportApiUrl: this.baseServiceUrl + '/DotNetReportApi/RunReportApi',
56
- getSchemaFromSql: this.baseServiceUrl + '/DotNetReportApi/GetSchemaFromSql',
57
- reportMode: "execute",
58
- linkModal: $("#linkModal"),
59
- fieldOptionsModal: $("#fieldOptionsModal"),
60
- reports: reports,
61
- dashboards: dashboards,
62
- userSettings: result,
63
- users: result.users,
64
- userRoles: result.userRoles,
65
- allowAdmin: result.allowAdminMode,
66
- dataFilters: result.dataFilters,
67
- dashboardId: dashboardId,
68
- runExportUrl: this.baseServiceUrl + '/DotNetReportApi/',
69
- printReportUrl: this.baseUrl + '/DotNetReport/ReportPrint',
70
- loadSavedDashbordUrl: this.baseServiceUrl + '/DotNetReportApi/LoadSavedDashboard',
71
- getDashbordsUrl: this.baseServiceUrl + '/DotNetReportApi/GetDashboards',
72
- getTimeZonesUrl: this.baseServiceUrl + '/DotNetReportApi/GetAllTimezones',
73
- getUsersAndRolesUrl: getUsersAndRolesUrl,
74
- samePageOnRun: true,
75
- });
76
- vm.init(0, result.noAccount).done(() => {
77
- this.renderKOTemplates();
78
- ko.applyBindings(vm, document.getElementById('dot-net-report'));
79
- this.bindGridInit(vm);
80
- this.bindWindowResize(vm);
81
- });
82
- });
83
- });
84
- });
85
- }
86
- ngOnDestroy() {
87
- ko.cleanNode(document.getElementById('dot-net-report'));
88
- }
89
- init() {
90
- this.ngOnInit();
91
- }
92
- renderKOTemplates() {
93
- this.reportTemplates = this.sanitizer.bypassSecurityTrustHtml(`<!-- Dotnet Report HTML Templates -->
94
- <script type="text/html" id="report-filter">
95
- <div class="form-group" data-bind="attr: {id: 'filter-'+uiId }">
96
- <!-- ko if: !hasForeignKey-->
97
- <!-- ko if: ['DateTime','Date','Time'].indexOf(fieldType) != -1 -->
98
- <div style="display: flex; align-items: center; gap: 8px;">
99
- <!-- ko if: ['=','>','<','>=','<=', 'not equal'].indexOf($parent.Operator()) != -1 -->
100
- <input class="form-control" data-bind="datepicker: $parent.fmtValue, datepickerOptions: {value: $parent.Value, dateFormat: dateFormat() === 'Custom' ? customDateFormat().replace(/yyyy/g, 'yy') : $root.dateFormatMappings[dateFormat()]}" required />
101
- <!-- ko if: fieldType=='Time' || fieldFormat()=='Time' || fieldFormat()=='Date and Time'-->
102
- <input class="form-control" type="time" data-bind="value:$parent.Valuetime" required>
103
- <!-- /ko -->
104
- <!-- /ko -->
105
- </div>
106
- <!-- ko if: ['between'].indexOf($parent.Operator()) != -1 -->
107
- From
108
- <div style="display: flex; align-items: center; gap: 8px;">
109
- <input required class="form-control from-date" data-bind="datepicker: $parent.fmtValue, datepickerOptions: {value: $parent.Value, dateFormat: dateFormat() === 'Custom' ? customDateFormat().replace(/yyyy/g, 'yy') : $root.dateFormatMappings[dateFormat()]}" />
110
- <!-- ko if:fieldType=='Time' || fieldFormat()=='Time' || fieldFormat()=='Date and Time'-->
111
- <input class="form-control" type="time" data-bind="value:$parent.Valuetime" required>
112
- <!-- /ko -->
113
- </div>
114
- to
115
- <div style="display: flex; align-items: center; gap: 8px;">
116
- <input data-bind="datepicker: $parent.fmtValue2, datepickerOptions: {value: $parent.Value2, dateFormat: dateFormat() === 'Custom' ? customDateFormat().replace(/yyyy/g, 'yy') : $root.dateFormatMappings[dateFormat()]}" class="form-control to-date" required />
117
- <!-- ko if:fieldType=='Time' || fieldFormat()=='Time' || fieldFormat()=='Date and Time'-->
118
- <input class="form-control" type="time" data-bind="value:$parent.Valuetime2" required>
119
- <!-- /ko -->
120
- </div>
121
- <!-- /ko -->
122
- <!-- ko if: ['range'].indexOf($parent.Operator()) != -1 -->
123
- <select data-bind="value: $parent.Value" class="form-select" required>
124
- <option value=""></option>
125
- <option>Today</option>
126
- <option>Today +</option>
127
- <option>Today -</option>
128
- <option>Yesterday</option>
129
- <option>This Week</option>
130
- <option>Last Week</option>
131
- <option>This Month</option>
132
- <option>Last Month</option>
133
- <option>This Year</option>
134
- <option>Last Year</option>
135
- <option>This Week To Date</option>
136
- <option>This Month To Date</option>
137
- <option>This Year To Date</option>
138
- <option>Last 30 Days</option>
139
- <!--<option>This Month Last Year</option>
140
- <option>Last Month Last Year</option>
141
- <option>This Quarter</option>
142
- <option>Last Quarter</option>
143
- <option>First Quarter</option>
144
- <option>Second Quarter</option>
145
- <option>Third Quarter</option>
146
- <option>Fourth Quarter</option>
147
- <option>Next 6 Months</option>
148
- <option>Last 6 Months</option>
149
- <option>2 Years ago</option>
150
- <option>3 Years ago</option>
151
- <option>4 Years ago</option>
152
- <option>5 Years ago</option>-->
153
- <optgroup label="Comparison Options">
154
- <option>>= Today</option>
155
- <option><= Today</option>
156
- <option>>= Today +</option>
157
- <option><= Today +</option>
158
- <option>>= Today -</option>
159
- <option><= Today -</option>
160
- </optgroup>
161
- </select>
162
- <div data-bind="if: $parent.Value().indexOf('Today +') >= 0 || $parent.Value().indexOf('Today -') >= 0" class="form-group pull-left" style="padding-top: 5px;">
163
- <input type="number" class="form-control input-sm pull-left" style="width: 80px;" data-bind="value: $parent.Value2" required /><span style="padding: 5px 5px;" class="pull-left"> days</span>
164
- </div>
165
- <!-- /ko -->
166
- <!-- /ko -->
167
- <!-- ko if: ['Int','Money','Float','Double'].indexOf(fieldType) != -1 -->
168
- <!-- ko if: ['=','>','<','>=','<=', 'not equal'].indexOf($parent.Operator()) != -1 && ['is blank', 'is not blank', 'is null', 'is not null'].indexOf($parent.Operator()) == -1 -->
169
- <input class="form-control" type="number" data-bind="value: $parent.Value, disable: $parent.Operator() == 'is default'" required />
170
- <!-- /ko -->
171
- <!-- ko if: ['in', 'not in'].indexOf($parent.Operator()) != -1 -->
172
- <input class="form-control" type="text" data-bind="value: $parent.Value" required />
173
- <!-- /ko -->
174
- <!-- ko if: ['between'].indexOf($parent.Operator()) != -1 -->
175
- From
176
- <input class="form-control" type="number" data-bind="value: $parent.Value" required />
177
- To
178
- <input class="form-control" type="number" data-bind="value: $parent.Value2" required />
179
- <!-- /ko -->
180
- <!-- /ko -->
181
- <!-- ko if: fieldType=='Boolean' && ['is blank', 'is not blank', 'is null', 'is not null'].indexOf($parent.Operator()) == -1 -->
182
- <select required class="form-select" data-bind="value: $parent.Value, disable: $parent.Operator() == 'is default'">
183
- <option value="1">Yes</option>
184
- <option value="0">No</option>
185
- </select>
186
- <!-- /ko -->
187
- <!-- ko if: ['Int','Money','Float','Double','Date','DateTime','Time','Boolean'].indexOf(fieldType) == -1 && ['is blank', 'is not blank', 'is null', 'is not null'].indexOf($parent.Operator()) == -1 -->
188
- <input class="form-control" type="text" data-bind="value: $parent.Value, disable: $parent.Operator() == 'is default',attr: {id: 'ctl-' + $element.closest('[data-parentprefix]').getAttribute('data-parentprefix') + '-' + uiId}" required />
189
- <!-- /ko -->
190
- <!-- /ko -->
191
- <!-- ko if: hasForeignKey && $parent.Operator() != 'all' -->
192
- <!-- ko if: hasForeignParentKey && $parent.showParentFilter() -->
193
- <select multiple class="form-control" data-bind="select2: { dropdownParent: '#filter-'+uiId, placeholder: 'Please Choose', allowClear: true }, options: $parent.ParentList, optionsText: 'text', optionsValue: $parent.IsConditionalFilter ? 'text': 'id', selectedOptions: $parent.ParentIn"></select>
194
- <!-- /ko -->
195
- <!-- ko if: $parent.Operator()=='='-->
196
- <select required class="form-control" data-bind="select2: { dropdownParent: '#filter-'+uiId, placeholder: 'Please Choose', allowClear: true }, options: $parent.LookupList, optionsText: 'text', optionsValue: $parent.IsConditionalFilter ? 'text': 'id', value: $parent.Value, optionsCaption: 'Please Choose'"></select>
197
- <!-- /ko -->
198
- <!-- ko if: $parent.Operator()=='in' || $parent.Operator()=='not in'-->
199
- <select required multiple class="form-control" data-bind="select2: { dropdownParent: '#filter-'+uiId, placeholder: 'Please Choose', allowClear: true }, options: $parent.LookupList, optionsText: 'text', optionsValue: $parent.IsConditionalFilter ? 'text': 'id', selectedOptions: $parent.ValueIn"></select>
200
- <!-- /ko -->
201
- <!-- /ko -->
202
- </div>
203
- </script>
204
-
205
- <script type="text/html" id="pager-template">
206
- <div class="pager-container d-flex align-items-center flex-wrap gap-2">
207
-
208
- <!-- Rows per page -->
209
- <div class="d-flex align-items-center gap-1 ms-1">
210
- <span class="text-muted small">Page size:</span>
211
- <select class="form-select form-select-sm w-auto"
212
- data-bind="options: pageSizeOptions, value: pageSize">
213
- </select>
214
- </div>
215
-
216
- <!-- Inner border block for page navigation controls -->
217
- <div class="d-flex align-items-center gap-1 ms-3">
218
- <a href="#" title="First" data-bind="click: first, enable: !isFirstPage()"
219
- class="btn btn-outline-secondary btn-sm pager-btn ms-1" aria-label="First Page">
220
- <i class="fa fa-angle-double-left"></i>
221
- </a>
222
-
223
- <a href="#" title="Previous" data-bind="click: previous, enable: !isFirstPage()"
224
- class="btn btn-outline-secondary btn-sm pager-btn" aria-label="Previous Page">
225
- <i class="fa fa-angle-left"></i>
226
- </a>
227
-
228
- <div class="d-flex align-items-center gap-1">
229
- <span class="text-muted small">Page</span>
230
- <input type="number" min="1" pattern="[0-9]*"
231
- class="form-control form-control-sm text-center pager-input"
232
- style="width: 60px;"
233
- data-bind="value: currentPage, attr: { max: pages() }">
234
- <span class="text-muted small">of</span>
235
- <span class="text-muted small" data-bind="text: pages"></span>
236
- </div>
237
-
238
- <a href="#" title="Next" data-bind="click: next, enable: !isLastPage()"
239
- class="btn btn-outline-secondary btn-sm pager-btn" aria-label="Next Page">
240
- <i class="fa fa-angle-right"></i>
241
- </a>
242
-
243
- <a href="#" title="Last" data-bind="click: last, enable: !isLastPage()"
244
- class="btn btn-outline-secondary btn-sm pager-btn" aria-label="Last Page">
245
- <i class="fa fa-angle-double-right"></i>
246
- </a>
247
- </div>
248
- </div>
249
- </script>
250
-
251
-
252
-
253
- <script type="text/html" id="report-column-header">
254
- <!-- ko foreach: Columns -->
255
- <th data-bind="attr: { id: !IsPivotField ? fieldId : 'pivot--' + fieldName }, style: {'text-align': fieldAlign() ? fieldAlign() : (IsNumeric ? 'right' : 'left'), 'background-color': headerBackColor }, hidden: outerGroup" style="border-right: 1px solid;">
256
-
257
- <div class="pull-left" data-bind="if: !$parent.IsDrillDown()" style="padding-right: 5px;">
258
- <div class="dropup">
259
- <a href="#" data-bs-toggle="dropdown" aria-haspopup="false" aria-expanded="false">
260
- <span class="fa fa-ellipsis-v sortable" title="Drag to reorder"></span>
261
- </a>
262
- <ul data-bind="visible: !IsPivotField" class="dropdown-menu" style="z-index: 1001;">
263
- <li class="dropdown-item small" data-bind="visible: !IsNumeric">
264
- <a href="#" data-bind="click: toggleOuterGroup">
265
- <span class="fa fa-clone"></span> Outer Group
266
- </a>
267
- </li>
268
- <li class="dropdown-item small">
269
- <a href="#" data-bind="click: setupFieldOptions">
270
- <span class="fa fa-gear"></span> Field Settings
271
- </a>
272
- </li>
273
- </ul>
274
- </div>
275
- </div>
276
- <div data-bind="style: {'width': fieldWidth}">
277
- <!-- ko if: $parents[3].useStoredProc ? $parents[3].useStoredProc() : ($parents[5].useStoredProc ? $parents[5].useStoredProc() : false) -->
278
- <span data-bind="text: fieldLabel() ? fieldLabel() : fieldName, style: {'color': headerFontColor, 'font-weight': headerFontBold() ? 'bold' : 'normal'}"></span>
279
- <!-- /ko -->
280
- <!-- ko ifnot: $parents[3].useStoredProc ? $parents[3].useStoredProc() : ($parents[5].useStoredProc ? $parents[5].useStoredProc() : false) -->
281
- <a href="" data-bind="click: function(){ if (!IsPivotField) { $parents[pagerIndex($parents)].changeSort(SqlField); } }, style: {'color': headerFontColor, 'font-weight': headerFontBold() ? 'bold' : 'normal'}">
282
- <span data-bind="text: $parent.IsDrillDown() && fieldLabel2() ? fieldLabel2() : (fieldLabel() ? fieldLabel() : fieldName)"></span>
283
- <span data-bind="text: $parents[pagerIndex($parents)].pager.sortColumn() === SqlField ? ($parents[pagerIndex($parents)].pager.sortDescending() ? '&#9660;' : '&#9650;') : ''"></span>
284
- </a>
285
- <!-- /ko -->
286
- </div>
287
- </th>
288
- <!-- /ko -->
289
- </script>
290
-
291
- <script type="text/html" id="report-widget">
292
- <div style="text-align: center; width: 100%;font-size: 48px">
293
- <span data-bind="visible: Rows.length < 1" title="No data found">/</span>
294
-
295
- <div data-bind="if: Rows.length > 0">
296
- <div data-bind="with: $parent.rows[0].Items[0]">
297
- <span data-bind="html: formattedVal"></span>
298
-
299
- <!-- ko if: $parent.Rows.length > 1 ? ($parents[$parents.length-2].showPriorInKpi != undefined ? $parents[$parents.length-2].showPriorInKpi() : $parents[$parents.length-1].showPriorInKpi()) : false -->
300
- <span data-bind="style: {'color': $parent.calculateRate() > 0 ? 'green' : 'red', 'font-size': '24px'}">
301
- <span data-bind="html: $parent.calculateRate() + '%'"></span>
302
- </span>
303
-
304
- <div data-bind="style: {'font-size': '24px', 'color': 'gray'}, css: {'text-muted': true}">
305
- Prior Period: <span data-bind="html: $parent.Rows[1].Items[0].formattedVal"></span>
306
- </div>
307
- <!-- /ko -->
308
-
309
- </div>
310
- </div>
311
- </div>
312
-
313
- </script>
314
-
315
- <script type="text/html" id="report-column">
316
- <!-- ko foreach: Items -->
317
- <td data-bind="hidden: outerGroup, style: {'background-color': _backColor ?? backColor(), 'color': _fontColor ?? fontColor(), 'font-weight': fontBold() || _fontBold ? 'bold' : 'normal', 'text-align': fieldAlign() ? fieldAlign() : (Column.IsNumeric ? 'right' : 'left')}">
318
- <div data-bind="style: {'width': fieldWidth }, css: { 'text-wrap': fieldWidth }">
319
- <!-- ko if: LinkTo-->
320
- <a data-bind="attr: {href: LinkTo}" target="_blank"><span data-bind="html: formattedVal"></span></a>
321
- <!-- /ko-->
322
- <!-- ko ifnot: LinkTo-->
323
- <span data-bind="html: formattedVal"></span>
324
- <!-- /ko-->
325
- </div>
326
- </td>
327
- </script>
328
-
329
- <script type="text/html" id="report-pivot">
330
- <div class="table-responsive" data-bind="with: ReportData">
331
- <table class="table table-striped table-hover table-condensed">
332
- <thead style="position: sticky; top: -1px; z-index: 2;">
333
- <tr>
334
- <th></th>
335
- <!-- ko foreach: Rows -->
336
- <th>
337
- <span data-bind="text: Items[0].FormattedValue"></span>
338
- </th>
339
- <!-- /ko -->
340
- </tr>
341
- </thead>
342
- <tbody data-bind="foreach: Columns">
343
- <tr>
344
- <!-- ko if: $index() > 0 -->
345
- <td>
346
- <span data-bind="text: fieldLabel || ColumnName"></span>
347
- </td>
348
- <!-- ko foreach: $parent.Rows -->
349
- <td data-bind="style: {'background-color': $parent.backColor, 'color': $parent.fontColor, 'font-weight': $parent.fontBold() ? 'bold' : 'normal', 'text-align': $parent.fieldAlign ? $parent.fieldAlign : ($parent.IsNumeric ? 'right' : 'left') }">
350
- <span data-bind="text: Items[$parentContext.$index()].FormattedValue"></span>
351
- </td>
352
- <!-- /ko -->
353
- <!-- /ko -->
354
- </tr>
355
- </tbody>
356
- </table>
357
-
358
- </div>
359
-
360
- </script>
361
-
362
- <script type="text/html" id="report-table">
363
- <div class="table-responsive">
364
- <table class="table table-hover table-condensed" data-bind="attr: {class: 'table table-striped table-hover table-condensed ' + $parents[2].selectedStyle()}">
365
- <thead style="position: sticky; top: -1px; z-index: 2;" data-bind="if: !$parents[2].noHeaderRow()">
366
- <tr class="no-highlight" data-bind="sortableColumns: { handle: '.sortable', cursor: 'move', placeholder: 'drop-highlight',selectedFields: $parents[2].SelectedFields }">
367
- <!-- ko if: $parentContext.$parentContext.$parent.canDrilldown() && !IsDrillDown() && !CanExpandOption() && (!$parents[2].hasPivotColumn() || ($parents[2].hasPivotColumn() && $parents[2].appSettings.useAltPivot)) -->
368
- <th style="width: 30px; border-left: 1px solid;" data-bind="style: {'background-color': Columns[0].headerBackColor}"></th>
369
- <!-- /ko -->
370
- <!-- ko template: 'report-column-header', data: $data -->
371
- <!-- /ko-->
372
- </tr>
373
- </thead>
374
- <tbody data-bind="attr: {id: 'report-table-body' + $parents[2].ReportID()}">
375
- <tr style="display: none;" data-bind="visible: Rows.length < 1">
376
- <td data-bind="attr:{colspan: Columns.length + 1}">
377
- No records found
378
- </td>
379
- </tr>
380
-
381
- <!-- ko if: !$parents[2].useRenderTable() -->
382
- <!-- ko foreach: $parent.rows -->
383
- <tr>
384
- <!-- ko if: $parentContext.$parentContext.$parentContext.$parent.canDrilldown() && !$parent.IsDrillDown() && !$parent.CanExpandOption() && $parentContext.$parentContext.$parentContext.$parent.ReportType() != 'Single' -->
385
- <td style="width: 30px; vertical-align: middle;" data-bind="style: {'background-color': Items[0]._backColor ?? Items[0].backColor(), 'color': Items[0]._fontColor ?? Items[0].fontColor()}">
386
- <a href="#" data-bind="click: function(){ toggle(); }"><span class="fa" data-bind="css: {'fa-plus': !isExpanded(), 'fa-minus': isExpanded()}"></span></a>
387
- </td>
388
- <!-- /ko -->
389
- <!-- ko template: 'report-column', data: $data -->
390
- <!-- /ko-->
391
- </tr>
392
- <!-- ko if: isExpanded -->
393
- <tr>
394
- <td style="width: 30px;"></td>
395
- <td data-bind="attr:{colspan: $parent.Columns.length }" style="padding-left: 0px;">
396
- <div data-bind="visible: !DrillDownData()">
397
- <div class="report-spinner"></div>
398
- </div>
399
- <!-- ko if: DrillDownData -->
400
- <table class="table table-striped table-hover table-condensed" data-bind="with: DrillDownData">
401
- <thead>
402
- <tr class="no-highlight">
403
- <!-- ko template: 'report-column-header', data: $data -->
404
- <!-- /ko-->
405
- </tr>
406
- </thead>
407
- <tbody>
408
- <tr style="display: none;" data-bind="visible: Rows && Rows.length < 1">
409
- <td data-bind="attr: {colspan: Columns.length}">
410
- No records found
411
- </td>
412
- </tr>
413
- <!-- ko foreach: Rows -->
414
- <tr>
415
- <!-- ko template: 'report-column', data: $data -->
416
- <!-- /ko-->
417
- </tr>
418
- <!-- /ko -->
419
- </tbody>
420
- </table>
421
- <div class="col-xs-12 col-centered" data-bind="with: pager">
422
- <div class="form-inline small text-muted">
423
- <div class="pull-left total-records" data-bind="visible: pages()">
424
- <span data-bind="text: 'Total Records: ' + totalRecords()"></span>
425
- </div>
426
- <div class="pull-left total-records">
427
- &nbsp;
428
- <a href="#" title="Download Excel" data-bind="click: $parent.exportExcel"><span class="fa fa-file-excel-o"></span></a>
429
- &nbsp;
430
- <a href="#" title="View Code" data-bs-toggle="modal" data-bs-target="#sqlDrillDownModal" data-bind="visible: $root.adminMode">
431
- <span class="fa fa-code"></span>
432
- </a>
433
- </div>
434
- <div class="form-group pull-right" data-bind="visible: pages()">
435
- <div data-bind="template: 'pager-template', data: $data"></div>
436
- </div>
437
- </div>
438
- </div>
439
- <!-- /ko -->
440
- </td>
441
- </tr>
442
- <!-- /ko -->
443
- <!-- ko if: subReportsRan().length > 0 -->
444
- <tr>
445
- <td data-bind="attr:{colspan: $parent.Columns.length }" style="padding-left: 0px;">
446
- <div data-bind="foreach: subReportsRan">
447
- <div class="">
448
- <div class="" style="padding-bottom: 20px;" >
449
- <h2 class="pull-left" data-bind="text: ReportName"></h2>
450
-
451
- <div class="clearfix"></div>
452
- <div class="list-overflow-auto" style="padding-top: 0; margin-top: 0;">
453
- <p data-bind="html: ReportDescription, visible: ReportDescription"></p>
454
-
455
- <div data-bind="with: ReportResult" class="small">
456
- <div data-bind="visible: !ReportData()">
457
- <div class="report-spinner"></div>
458
- </div>
459
- <div data-bind="template: 'report-template', data: $data"></div>
460
- </div>
461
- </div>
462
- <div class="form-inline">
463
- <div class="small" data-bind="with: pager">
464
- <div class="form-group pull-left total-records" data-bind="if: totalRecords()>1 && $parent.ReportType() != 'Single'">
465
- <span data-bind="text: 'Total Records: ' + totalRecords()"></span><br />
466
- </div>
467
- <div class="form-group pull-right" data-bind="if: pages()>1 && $parent.ReportType() != 'Single'">
468
- <div data-bind="template: 'pager-template', data: $data"></div>
469
- </div>
470
- </div>
471
- </div>
472
- </div>
473
-
474
- </div>
475
- </div>
476
- </td>
477
- </tr>
478
- <!-- /ko -->
479
- <!-- /ko -->
480
- <!-- /ko-->
481
- </tbody>
482
- <!-- ko if: $parentContext.$parent.SubTotals().length == 1 && $parentContext.$parentContext.$parent.OuterGroupColumns().length == 0 -->
483
- <tfoot data-bind="foreach: $parentContext.$parent.SubTotals">
484
- <tr class="sub-total">
485
- <!-- ko if: $parentContext.$parentContext.$parentContext.$parent.canDrilldown() && !$parent.IsDrillDown() && !$parent.CanExpandOption() -->
486
- <td></td>
487
- <!-- /ko -->
488
- <!-- ko foreach: Items -->
489
- <!-- ko if: Value != 'NA' && Value != 'NaN' && !outerGroup() -->
490
- <td data-bind="style: {'background-color': _backColor ?? backColor(), 'color': _fontColor ?? fontColor(), 'font-weight': fontBold() || _fontBold ? 'bold' : 'normal', 'text-align': fieldAlign() ? fieldAlign() : 'right'}">
491
- <div data-bind="style: {'width': fieldWidth }">
492
- <span data-bind="html: formattedVal"></span>
493
- </div>
494
- </td>
495
- <!-- /ko -->
496
- <!-- /ko -->
497
- </tr>
498
- </tfoot>
499
- <!-- /ko -->
500
- </table>
501
- </div>
502
- </script>
503
-
504
- <script type="text/html" id="report-render">
505
- <div data-bind="with: ReportData">
506
- <div data-bind="foreach: Rows">
507
- <div data-bind="html: renderedHtml, css: { 'card-view': $parents[$parents.length-1].cardView }"></div>
508
-
509
- <div data-bind="foreach: subReportsRan">
510
- <div class="">
511
- <div class="" style="padding-bottom: 20px;" >
512
- <h2 class="pull-left" data-bind="text: ReportName"></h2>
513
-
514
- <div class="clearfix"></div>
515
- <div class="list-overflow-auto" style="padding-top: 0; margin-top: 0;">
516
- <p data-bind="html: ReportDescription, visible: ReportDescription"></p>
517
-
518
- <div data-bind="with: ReportResult" class="small">
519
- <div data-bind="visible: !ReportData()">
520
- <div class="report-spinner"></div>
521
- </div>
522
- <div data-bind="template: 'report-template', data: $data"></div>
523
- </div>
524
- </div>
525
- <div class="form-inline">
526
- <div class="small" data-bind="with: pager">
527
- <div class="form-group pull-left total-records" data-bind="if: totalRecords()>1 && $parent.ReportType() != 'Single'">
528
- <span data-bind="text: 'Total Records: ' + totalRecords()"></span><br />
529
- </div>
530
- <div class="form-group pull-right" data-bind="if: pages()>1 && $parent.ReportType() != 'Single'">
531
- <div data-bind="template: 'pager-template', data: $data"></div>
532
- </div>
533
- </div>
534
- </div>
535
- </div>
536
-
537
- </div>
538
- </div>
539
- </div>
540
- </div>
541
- <div class="clearfix"></div>
542
- </script>
543
-
544
-
545
- <script type="text/html" id="report-template">
546
- <div class="report-chart" data-bind="attr: {id: 'chart_div_' + $parent.ReportID()}, visible: $parent.isChart"></div>
547
- <!-- ko if: $parent.ReportType() == 'Pivot' -->
548
- <div data-bind="template: {name: 'report-pivot', data: $data }"></div>
549
- <!-- /ko -->
550
-
551
- <!-- ko if: $parent.ReportType() == 'Html' -->
552
- <div data-bind="template: {name: 'report-render', data: $data }"></div>
553
- <!-- /ko -->
554
-
555
- <!-- ko if: $parent.ReportType() != 'Pivot' && $parent.ReportType() != 'Html' && (!$parent.isChart() || $parent.ShowDataWithGraph()) -->
556
- <div class="pull-right" data-bind="if: $parent.OuterGroupColumns().length > 0">
557
- <a href="#" data-bs-toggle="dropdown" aria-haspopup="false" aria-expanded="false">
558
- Manage Groups <span class="fa fa-ellipsis-v"></span>
559
- </a>
560
- <ul class="dropdown-menu" style="z-index: 1001;" data-bind="foreach: $parent.OuterGroupColumns">
561
- <li class="dropdown-item small">
562
- <a href="#" data-bind="click: remove" title="Remove from Group">
563
- <span class="fa fa-close"></span> <span data-bind="text: fieldName"></span>
564
- </a>
565
- </li>
566
- </ul>
567
- </div>
568
- <div class="clear-fix"></div>
569
-
570
- <div data-bind="foreach: outerGroupData">
571
- <!-- ko if: rows.length > 0 || ($parent.outerGroupData && $parent.outerGroupData().length == 1) -->
572
- <h6 data-bind="html: display"></h6>
573
- <div class="" style="padding-top: 5px;"></div>
574
-
575
- <!-- ko if: $parents[1].ReportType() != 'Single'-->
576
- <div data-bind="template: {name: 'report-table', data: $parent.ReportData }"></div>
577
- <!-- /ko -->
578
- <!-- ko if: $parents[1].ReportType() == 'Single'-->
579
- <div data-bind="template: {name: 'report-widget', data: $parent.ReportData }"></div>
580
- <!-- /ko -->
581
- <!-- /ko -->
582
- </div>
583
- <!-- /ko -->
584
- </script>
585
- <script type="text/html" id="admin-mode-template">
586
- <div class="row">
587
- <div class="d-flex justify-content-end align-items-center" style="gap: 10px;">
588
- <div data-bind="visible: adminMode">
589
- <div class="alert alert-info d-inline-block" style="font-size: 10pt; padding: 5px; max-width: 350px; white-space: normal; margin-bottom: 0;">
590
- <i class="fa fa-user-circle"></i> You can manage Reports/Dashboards for all users
591
- </div>
592
- </div>
593
- <div class="d-flex align-items-center">
594
- <div class="bubble-badge">
595
- Admin Mode
596
- <div class="form-check form-switch ms-2">
597
- <input class="form-check-input" type="checkbox" data-bind="checked: adminMode">
598
- </div>
599
- </div>
600
- </div>
601
- </div>
602
- </div>
603
- </script>
604
- <script type="text/html" id="manage-access-template">
605
- <h5><span class="fa fa-key"></span>Manage Access</h5>
606
- <div class="panel panel-default panel-body" style="margin-left: 20px;">
607
-
608
- <div class="form-group row">
609
- <label class="col-md-3 col-sm-3 control-label">Client Id to Restrict Access</label>
610
- <div class="col-md-3 col-sm-3">
611
- <input class="form-control text-box single-line" type="text" data-bind="value: clientId">
612
- </div>
613
- <div class="col-md-1 col-sm-1">
614
- <span data-bs-toggle="tooltip" data-placement="right" class="fa fa-question-circle helptip" title="Leave blank to give all clients access (Global Reports)"></span>
615
- </div>
616
- </div>
617
- <div class="alert alert-info">
618
- <span class="fa fa-lightbulb-o fa-2x"></span>&nbsp;User level rights override Role level rights. No selection for a rule implies report is available to all.
619
- </div>
620
-
621
- <div class="row small">
622
- <div class="col-md-6">
623
- <i class="toggle-icon fa" data-bind="click: toggleManageUsers,css: { 'fa-chevron-down': showManageUsers(), 'fa-chevron-right': !showManageUsers() }"></i> <b>Manage by User</b> (allow edit)
624
- <div class="row container-fluid" data-bind="visible: showManageUsers">
625
- <!-- ko if: groupedUsers().length > 0 -->
626
- <!-- ko foreach: groupedUsers -->
627
- <div class="col-md-12">
628
- <div class="category-header" style="cursor: pointer;" data-bind="click: function() { show(!show()); }">
629
- <i class="fa toggle-icon" data-bind="css: { 'fa-chevron-down': show(), 'fa-chevron-right': !show() }"></i>
630
- <strong data-bind="text: category"></strong>
631
- </div>
632
- <div class="row container-fluid" data-bind="visible: show">
633
- <!-- ko foreach: users -->
634
- <div class="pull-left">
635
- <div class="checkbox">
636
- <label class="label label-info">
637
- <input type="checkbox" data-bind="checked: selected"> &nbsp; <span data-bind="text: text"></span>&nbsp; </label>
638
- </div>
639
- </div>
640
- <!-- /ko -->
641
- </div>
642
- </div>
643
- <!-- /ko -->
644
- <!-- /ko -->
645
- <!-- ko if: groupedUsers().length == 0 && users.length > 0 -->
646
- <!-- ko foreach: users -->
647
- <div class="pull-left">
648
- <div class="checkbox">
649
- <label class="label label-info">
650
- <input type="checkbox" data-bind="checked: selected">&nbsp;<span data-bind="text: text"></span>&nbsp;
651
- </label>
652
- </div>
653
- </div>
654
- <!-- /ko -->
655
- <!-- /ko -->
656
- <div data-bind="if: groupedUsers().length == 0 && users.length == 0">
657
- Users list not populated or not applicable
658
- </div>
659
- </div>
660
- <br />
661
- <i class="toggle-icon fa" data-bind="click: toggleViewUsers,css: { 'fa-chevron-down': showViewUsers(), 'fa-chevron-right': !showViewUsers() }"></i> <b>View only by User</b> (no edit/delete)
662
- <div class="row container-fluid" data-bind="visible: showViewUsers">
663
- <!-- ko if: groupedViewOnlyUsers().length > 0 -->
664
- <!-- ko foreach: groupedViewOnlyUsers -->
665
- <div class="col-md-12">
666
- <div class="category-header" style="cursor: pointer;" data-bind="click: function() { show(!show()); }">
667
- <i class="fa toggle-icon" data-bind="css: { 'fa-chevron-down': show(), 'fa-chevron-right': !show() }"></i>
668
- <strong data-bind="text: category"></strong>
669
- </div>
670
- <div class="row container-fluid" data-bind="visible: show">
671
- <!-- ko foreach: viewOnlyUsers -->
672
- <div class="pull-left">
673
- <div class="checkbox">
674
- <label class="label label-info">
675
- <input type="checkbox" data-bind="checked: selected"> &nbsp; <span data-bind="text: text"></span>&nbsp; </label>
676
- </div>
677
- </div>
678
- <!-- /ko -->
679
- </div>
680
- </div>
681
- <!-- /ko -->
682
- <!-- /ko -->
683
- <!-- ko if: groupedViewOnlyUsers().length == 0 && viewOnlyUsers.length > 0 -->
684
- <!-- ko foreach: viewOnlyUsers -->
685
- <div class="pull-left">
686
- <div class="checkbox">
687
- <label class="label label-info">
688
- <input type="checkbox" data-bind="checked: selected">&nbsp;<span data-bind="text: text"></span>&nbsp;
689
- </label>
690
- </div>
691
- </div>
692
- <!-- /ko -->
693
- <!-- /ko -->
694
- <div data-bind="if: groupedViewOnlyUsers().length == 0 && users.length == 0">
695
- Users list not populated or not applicable
696
- </div>
697
- </div>
698
- <br />
699
- <div data-bind="ifnot: isDashboard">
700
- <i class="toggle-icon fa" data-bind="click: toggleDeleteUsers,css: { 'fa-chevron-down': showDeleteUsers(), 'fa-chevron-right': !showDeleteUsers() }"></i><b>Delete by User</b> (allow delete)
701
- <div class="row container-fluid" data-bind="visible: showDeleteUsers">
702
- <!-- ko if: groupedDeleteOnlyUsers().length > 0 -->
703
- <!-- ko foreach: groupedDeleteOnlyUsers -->
704
- <div class="col-md-12">
705
- <div class="category-header" style="cursor: pointer;" data-bind="click: function() { show(!show()); }">
706
- <i class="fa toggle-icon" data-bind="css: { 'fa-chevron-down': show(), 'fa-chevron-right': !show() }"></i>
707
- <strong data-bind="text: category"></strong>
708
- </div>
709
- <div class="row container-fluid" data-bind="visible: show">
710
- <!-- ko foreach: deleteOnlyUsers -->
711
- <div class="pull-left">
712
- <div class="checkbox">
713
- <label class="label label-info">
714
- <input type="checkbox" data-bind="checked: selected"> &nbsp; <span data-bind="text: text"></span>&nbsp; </label>
715
- </div>
716
- </div>
717
- <!-- /ko -->
718
- </div>
719
- </div>
720
- <!-- /ko -->
721
- <!-- /ko -->
722
- <!-- ko if: groupedDeleteOnlyUsers().length == 0 && deleteOnlyUsers.length > 0 -->
723
- <!-- ko foreach: deleteOnlyUsers -->
724
- <div class="pull-left">
725
- <div class="checkbox">
726
- <label class="label label-info">
727
- <input type="checkbox" data-bind="checked: selected">&nbsp;<span data-bind="text: text"></span>&nbsp;
728
- </label>
729
- </div>
730
- </div>
731
- <!-- /ko -->
732
- <!-- /ko -->
733
- <div data-bind="if: groupedDeleteOnlyUsers().length == 0 && users.length == 0">
734
- Users list not populated or not applicable
735
- </div>
736
- </div>
737
- <br />
738
- </div>
739
- </div>
740
- <div class="col-md-6">
741
- <i class="toggle-icon fa" data-bind="click: toggleManageRoles,css: { 'fa-chevron-down': showManageRoles(), 'fa-chevron-right': !showManageRoles() }"></i><b>Manage by User Role</b> (allow edit)
742
- <div class="row container-fluid" data-bind="visible: showManageRoles">
743
- <!-- ko foreach: userRoles -->
744
- <div class="pull-left">
745
- <div class="checkbox">
746
- <label class="label label-info">
747
- <input type="checkbox" data-bind="checked: selected">&nbsp;<span data-bind="text: text"></span>&nbsp;
748
- </label>
749
- </div>
750
- </div>
751
- <!-- /ko -->
752
- <div data-bind="if: userRoles.length == 0">
753
- User Roles list not populated or not applicable
754
- </div>
755
- </div>
756
- <br />
757
- <i class="toggle-icon fa" data-bind="click: toggleViewRoles,css: { 'fa-chevron-down': showViewRoles(), 'fa-chevron-right': !showViewRoles() }"></i><b>View only by User Role</b> (no edit/delete)
758
- <div class="row container-fluid" data-bind="visible: showViewRoles">
759
- <!-- ko foreach: viewOnlyUserRoles -->
760
- <div class="pull-left">
761
- <div class="checkbox">
762
- <label class="label label-info">
763
- <input type="checkbox" data-bind="checked: selected">&nbsp;<span data-bind="text: text"></span>&nbsp;
764
- </label>
765
- </div>
766
- </div>
767
- <!-- /ko -->
768
- <div data-bind="if: userRoles.length == 0">
769
- User Roles list not populated or not applicable
770
- </div>
771
- </div>
772
- <div data-bind="ifnot: isDashboard">
773
- <i class="toggle-icon fa" data-bind="click: toggleDeleteRoles,css: { 'fa-chevron-down': showDeleteRoles(), 'fa-chevron-right': !showDeleteRoles() }"></i><b>Delete by User Role</b> (allow delete)
774
- <div class="row container-fluid" data-bind="visible: showDeleteRoles">
775
- <!-- ko foreach: deleteOnlyUserRoles -->
776
- <div class="pull-left">
777
- <div class="checkbox">
778
- <label class="label label-info">
779
- <input type="checkbox" data-bind="checked: selected">&nbsp;<span data-bind="text: text"></span>&nbsp;
780
- </label>
781
- </div>
782
- </div>
783
- <!-- /ko -->
784
- <div data-bind="if: userRoles.length == 0">
785
- User Roles list not populated or not applicable
786
- </div>
787
- </div>
788
- </div>
789
- </div>
790
- </div>
791
- </div>
792
- </script>
793
- <script type="text/html" id="filter-group">
794
- <div class="query-builder form-inline" data-bind="foreach: FilterGroups">
795
- <div class="rules-group-container">
796
- <div class="rules-group-header" data-bind="attr: {parentdivid: generateUniqueId()}">
797
- <div data-bind="visible: !isRoot">
798
- <div class="pull-left">
799
- <div class="btn-group btn-group-toggle btn-group-sm" data-bs-toggle="buttons" role="group">
800
- <label class="btn btn-light active" style="margin-right: 0px;">
801
- <input type="radio" data-bind="attr: { name: 'andOrGroup-' + $element.closest('.rules-group-header').getAttribute('parentdivid') }, checked: AndOr" value="And" /> And
802
- </label>
803
- <label class="btn btn-light active">
804
- <input type="radio" data-bind="attr: { name: 'andOrGroup-' + $element.closest('.rules-group-header').getAttribute('parentdivid') }, checked: AndOr" value="Or" /> Or
805
- </label>
806
- </div>
807
- </div>
808
- <div class="pull-right">
809
- <button class="btn btn-sm btn-secondary" data-bind="click: $parent.RemoveFilterGroup, visible: !isRoot">Remove Group</button>&nbsp;
810
- </div>
811
- </div>
812
- <div data-bind="visible: isRoot">
813
- <div class="pull-left padded-div">
814
- <label> &nbsp;Filter Conditions</label>
815
- </div>
816
- </div>
817
- <div class="clearfix"></div>
818
- </div>
819
-
820
- <div class="rules-group-body" data-bind="template: {name: 'filter-inner'}"></div>
821
- </div>
822
- </div>
823
- </script>
824
- <script type="text/html" id="fly-filter-template">
825
- <div class="card" data-bind="visible: FlyFilters().length>0 || DontExecuteOnRun">
826
- <div class="card-header">
827
- <a data-bs-toggle="collapse" data-bind="attr: {'data-bs-target': '#filter-panel-' + ReportID() }" href="#">
828
- <i class="fa fa-filter"></i> Choose Filters
829
- </a>
830
- </div>
831
- <div data-bind="attr: {id: 'filter-panel-' + ReportID() }, css: {collpased: !DontExecuteOnRun(), collapse: !DontExecuteOnRun()}" class="card-body">
832
- <div>
833
- <!-- ko foreach: FlyFilters -->
834
- <div class="row">
835
- <div class="col-sm-5 col-xs-4">
836
- <div data-bind="with: Field" class="checkbox">
837
- <div class="checkbox">
838
- <label>
839
- <input type="checkbox" title="Apply this filter" data-bind="checked: $parent.Apply, disabled: forced" /> <span data-bind="text: selectedFilterName"></span>
840
- </label>
841
- </div>
842
- </div>
843
- </div>
844
- <div data-bind="with: Field" class="col-sm-2 col-xs-3">
845
- <div class="form-group" data-bind="if: $parent.Apply">
846
- <select class="form-select" data-bind="options: fieldFilter, value: $parent.Operator" required></select>
847
- </div>
848
- </div>
849
- <div data-bind="with: Field" class="col-sm-5 col-xs-5">
850
- <div data-bind="if: $parent.Apply" data-parentprefix="F" >
851
- <div data-bind="template: 'report-filter', data: $data"></div>
852
- </div>
853
- </div>
854
- </div>
855
- <!-- /ko -->
856
- <button class="btn btn-primary" data-bind="click: ExecuteReport">Run</button>
857
- </div>
858
- </div>
859
- </div>
860
- </script>
861
-
862
- <script type="text/html" id="filter-inner">
863
- <div class="rules-list">
864
- <div class="rule-container" data-bind="visible: Filters().length>0">
865
- <table class="table table-striped table-hover table-borderless">
866
- <thead>
867
- <tr>
868
- <th class="row">
869
- <div class="col-md-1"></div>
870
- <div class="col-md-4">Field</div>
871
- <div class="col-md-2"></div>
872
- <div class="col-md-4">Filter</div>
873
- <div class="col-md-1"></div>
874
- </th>
875
- </tr>
876
- </thead>
877
- <tbody data-bind="foreach: Filters">
878
- <tr class="rule-container">
879
- <td class="row">
880
- <div class="col-md-1">
881
- <select data-bind="value: AndOr, visible: $index()>0" class="form-select">
882
- <option>And</option>
883
- <option>Or</option>
884
- </select>
885
- </div>
886
- <div class="col-md-3">
887
- <div class="form-group">
888
- <select class="form-select" style="width: 100%;" data-bind="
889
- options: $parents[$parents.length-2].selectedFieldsCanFilter != undefined
890
- ? $parents[$parents.length-2].selectedFieldsCanFilter
891
- : $parents[$parents.length-1].selectedFieldsCanFilter,
892
- optionsText: 'selectedFieldName',
893
- optionsCaption: 'Please Choose',
894
- value: Field,
895
- attr: {required: Field()==null?'required':false},
896
- disable: Field() && Field().forced"></select>
897
- </div>
898
- </div>
899
- <div class="col-md-2">
900
- <div data-bind="with: Field">
901
- <div class="form-group">
902
- <select class="form-select" style="width: 100%;" data-bind="options: fieldFilter, value: $parent.Operator" required></select>
903
- </div>
904
- </div>
905
- </div>
906
- <div class="col-md-5">
907
- <div data-bind="with: Field" data-parentprefix="M">
908
- <div data-bind="template: 'report-filter', data: $data"></div>
909
- </div>
910
- <!-- ko if: Field() && Field().fieldType == 'DateTime' && Operator() == 'range' && $index()==0 -->
911
- <!-- ko if: $parents[$parents.length-2].canAddSeries != undefined && $parents[$parents.length-2].canAddSeries() -->
912
- <button class="btn btn-sm btn-secondary" data-bind="click: $parents[$parents.length-2].AddSeries.bind($data)">Add Comparison</button>
913
- <!--/ko -->
914
- <!-- ko if: $parents[$parents.length-2].canAddSeries == undefined && $parentContext.$parent.canAddSeries != undefined && $parentContext.$parent.canAddSeries()-->
915
- <button class="btn btn-sm btn-secondary" data-bind="click: $parentContext.$parent.AddSeries.bind($data)">Add Comparison</button>
916
- <!--/ko -->
917
- <!--/ko -->
918
- <span data-bind="visible: Field() && Field().forced" class="badge bg-info">Required Filter</span>
919
- </div>
920
- <div class="col-md-1">
921
- <div style="display: flex; align-items: center;">
922
- <div class="form-group" style="flex-grow: 1;">
923
- <button class="btn btn-sm btn-secondary" data-bind="click: $parent.RemoveFilter, hidden: Field() && Field().forced" title="Remove">
924
- <i class="fa fa-trash"></i>
925
- </button>
926
- </div>
927
- <div class="form-group" style="flex-grow: 1;" data-bind="with: Field, hidden: document.querySelector('#filter-panel.card-body.collapse')">
928
- <span class="btn btn-sm" tabindex="0" data-bind="click: function(){ filterOnFly(!filterOnFly()); }, css: {'btn-success': filterOnFly()==true, 'btn-secondary': filterOnFly()==false}">
929
- <span class="fa fa-filter" aria-hidden="true" title="Filter on Report"></span>
930
- </span>
931
- </div>
932
- </div>
933
-
934
- </div>
935
- </td>
936
- </tr>
937
- <!-- ko foreach: compareTo -->
938
- <tr>
939
- <td class="row">
940
- <div class="col-md-6">&nbsp;</div>
941
- <div class="col-md-2">
942
- <span style="text-align: right"><button class="btn btn-sm" data-bind="click: $parents[2].RemoveSeries"><span class="fa fa-trash-o"></span></button></span>
943
- <span class="muted">Compare to</span>
944
- </div>
945
- <div class="col-md-4">
946
- <select class="form-select" data-bind="options: Range, value: Value" required></select>
947
- </div>
948
- </td>
949
- </tr>
950
- <!-- /ko -->
951
- </tbody>
952
- </table>
953
- </div>
954
-
955
- <div class="rule-container">
956
- <div data-bind="template: {name: 'filter-group'}"></div>
957
- <div>
958
- <button class="btn btn-sm btn-outline-secondary" data-bind="click: AddFilter">Add Filter</button>
959
- <button class="btn btn-sm btn-outline-secondary" data-bind="click: AddFilterGroup">Add Filter Group</button>
960
- </div>
961
- </div>
962
- </div>
963
-
964
- </script>
965
-
966
- <script type="text/html" id="filter-parameters">
967
- <div class="table-responsive">
968
- <span data-bind="hidden: showParameters">No filters available to choose</span>
969
- <table class="table table-striped table-hover table-borderless" data-bind="visible: showParameters">
970
- <thead>
971
- <tr>
972
- <th style="width: 30%">Filter</th>
973
- <th style="width: 20%"></th>
974
- <th style="width: 30%">Value</th>
975
- <th></th>
976
- </tr>
977
- </thead>
978
- <tbody data-bind="foreach: Parameters">
979
- <tr data-bind="ifnot: Hidden">
980
- <td data-bind="text: DisplayName">
981
- </td>
982
- <td>
983
- <div class="form-group">
984
- <select class="form-select" style="width: 100%;" data-bind="options: operators, value: Operator" required></select>
985
- </div>
986
- </td>
987
- <td data-bind="with: Field" data-parentprefix="P">
988
- <div data-bind="template: 'report-filter', data: $data"></div>
989
- </td>
990
- <td></td>
991
- </tr>
992
-
993
- </tbody>
994
- </table>
995
- </div>
996
- </script>
997
-
998
- <script type="text/html" id="report-schedule">
999
- <div data-bind="with: scheduleBuilder" id="schedule-builder-div">
1000
- <div class="form-check">
1001
- <input class="form-check-input" type="checkbox" data-bind="checked: hasSchedule" id="scheduleReportCheckbox">
1002
- <label class="form-check-label" for="scheduleReportCheckbox">
1003
- Set Schedule to send by Email
1004
- </label>
1005
- </div>
1006
- <div data-bind="if: hasSchedule">
1007
- <div class="d-flex align-items-center">
1008
- <div class="me-3 d-flex align-items-center">
1009
- <span data-bind="text: selectedOption() != 'once' ? 'Every ' : ''"></span>&nbsp;
1010
- <select class="form-select" required data-bind="options: options, value: selectedOption" style="min-width: 80px;"></select>
1011
- </div>
1012
- <div data-bind="if: selectedOption() == 'once'" class="me-3 d-flex align-items-center">
1013
- &nbsp;on&nbsp;<input data-bind="datepicker: selectedDate, datepickerOptions: {value: selectedDate}" class="form-control" required />
1014
- </div>
1015
- <div class="d-flex align-items-center">
1016
- <div data-bind="if: showDays" class="d-flex align-items-center">
1017
- &nbsp;on&nbsp;
1018
- <select multiple class="form-select ms-2" required data-bind="select2: { placeholder: 'Choose Days', allowClear: true }, options: days, selectedOptions: selectedDays"></select>
1019
- </div>
1020
- <div data-bind="if: showDates" class="d-flex align-items-center">
1021
- &nbsp;on&nbsp;
1022
- <select multiple class="form-select" required data-bind="select2: { placeholder: 'Choose Dates', allowClear: true }, options: dates, selectedOptions: selectedDates"></select>
1023
- </div>
1024
- <div data-bind="if: showMonths" class="d-flex align-items-center">
1025
- &nbsp;on&nbsp;
1026
- <select multiple class="form-select" required data-bind="select2: { placeholder: 'Choose Months', allowClear: true }, options: months, selectedOptions: selectedMonths"></select>
1027
- </div>
1028
- <div data-bind="if: showAtTime" class="d-flex align-items-center ms-3">
1029
- &nbsp;at&nbsp;
1030
- <select class="form-select me-2" style="min-width: 60px;" data-bind="options: hours, value: selectedHour"></select>
1031
- <select class="form-select me-2" style="min-width: 60px;" data-bind="options: minutes, value: selectedMinute"></select>
1032
- <select class="form-select" style="min-width: 80px;" data-bind="value: selectedAmPm">
1033
- <option>AM</option>
1034
- <option>PM</option>
1035
- </select>
1036
- </div>
1037
- </div>
1038
- </div>
1039
-
1040
- <div class="alert alert-info">
1041
- Report will be run and emailed <span data-bind="text: selectedOption() != 'once' ? 'every' : ''"></span> <span data-bind="text: selectedOption"></span>
1042
- <span data-bind="if: selectedOption() == 'once'">
1043
- on <span class="error" data-bind="visible: !selectedDate()">Please pick a Date</span> <span data-bind="text: selectedDate"></span>
1044
- </span>
1045
- <span data-bind="if: showDays">
1046
- on <span class="error" data-bind="visible: selectedDays().length == 0">Please pick Day(s)</span> <span data-bind="text: selectedDays"></span>
1047
- </span>
1048
- <span data-bind="if: showDates">
1049
- on <span class="error" data-bind="visible: selectedDates().length == 0">Please pick Date(s)</span>
1050
- <span data-bind="foreach: selectedDates"><span data-bind="visible: $index()>0">, </span><span data-bind="text: $data == 1 ? '1st': ($data == 2 ? '2nd' : ($data == 3 ? '3rd' : ($data == 31 ? '31st' : $data+'th')))"></span></span>
1051
- </span>
1052
- <span data-bind="if: showMonths">
1053
- of <span class="error" data-bind="visible: selectedMonths().length == 0">Please pick Month(s)</span> <span data-bind="text: selectedMonths"></span>
1054
- </span>
1055
- <span data-bind="if: showAtTime">
1056
- at <span data-bind="text: selectedHour"></span>:<span data-bind="text: selectedMinute"></span> <span data-bind="text: selectedAmPm"></span>
1057
- </span>
1058
- </div>
1059
- <div class="mb-3">
1060
- <div class="row g-3">
1061
- <label class="col-sm-3 col-form-label">Email to</label>
1062
- <div class="col-sm-6">
1063
- <input type="text" class="form-control" data-bind="value: emailTo" placeholder="Enter Email Addresses separated by comma to send the Report to" required />
1064
- </div>
1065
- <label class="col-sm-1 col-form-label">Format</label>
1066
- <div class="col-sm-2">
1067
- <select class="form-select" data-bind="value: format,event: { change: onFormatChange }">
1068
- <option value="EXCEL">Excel</option>
1069
- <option data-bind="visible: $parent.canDrilldown && $parent.canDrilldown()" value="EXCEL-SUB">Excel (Expanded)</option>
1070
- <option value="CSV">CSV</option>
1071
- <option value="PDF">PDF</option>
1072
- <option value="WORD">Word</option>
1073
- <option value="LINK">Link</option>
1074
- </select>
1075
- </div>
1076
- </div>
1077
- </div>
1078
- <div class="mb-3">
1079
- <div class="row g-3">
1080
- <label class="col-sm-3 col-form-label">Pick Time Zone</label>
1081
- <div class="col-sm-9">
1082
- <select class="form-select" data-bind="options: timezonOption,
1083
- optionsText: 'displayName',
1084
- optionsValue: 'timeZoneId',
1085
- value: selectedTimezone,
1086
- select2: {dropdownParent: $('#schedule-builder-div'), allowClear: true, placeholder: 'Set a time zone to send report'}">
1087
- </select>
1088
- </div>
1089
- </div>
1090
- </div>
1091
- <div class="mb-3">
1092
- <div class="row g-3">
1093
- <div class="col-sm-3">
1094
- <div class="form-check" title="Set a date to start sending scheduled report">
1095
- <input class="form-check-input" type="checkbox" data-bind="checked: hasScheduleStart" id="scheduleStartCheckbox">
1096
- <label class="form-check-label" for="scheduleStartCheckbox">
1097
- Schedule Start Date
1098
- </label>
1099
- </div>
1100
- </div>
1101
- <div class="col-sm-4" data-bind="if: hasScheduleStart">
1102
- <input type="text" class="form-control" data-bind="datepicker: scheduleStart, datepickerOptions: {value: scheduleStart}" title="Scheduled Report will not be sent before this date" required />
1103
- </div>
1104
- </div>
1105
- </div>
1106
- <div class="mb-3">
1107
- <div class="row g-3">
1108
- <div class="col-sm-3">
1109
- <div class="form-check" title="Set a date to stop sending scheduled report">
1110
- <input class="form-check-input" type="checkbox" data-bind="checked: hasScheduleEnd" id="scheduleEndCheckbox">
1111
- <label class="form-check-label" for="scheduleEndCheckbox">
1112
- Schedule End Date
1113
- </label>
1114
- </div>
1115
- </div>
1116
- <div class="col-sm-4" data-bind="if: hasScheduleEnd">
1117
- <input type="text" class="form-control" data-bind="datepicker: scheduleEnd, datepickerOptions: {value: scheduleEnd}" title="Scheduled Report will not be sent after this date" required />
1118
- </div>
1119
- </div>
1120
- </div>
1121
- </div>
1122
- </div>
1123
-
1124
-
1125
- </script>
1126
-
1127
- <script type="text/html" id="report-field-options">
1128
- <div class="modal-dialog" style="max-width: 750px;">
1129
- <div class="modal-content" data-bind="with: editFieldOptions">
1130
- <div class="modal-header">
1131
- <h5 class="modal-title"><span data-bind="text: fieldName"></span> - Setup Additional Field Options</h5>
1132
- </div>
1133
- <div class="modal-body needs-validation">
1134
- <div class="card card-body">
1135
- <b>Column Format Settings</b>
1136
- <div class="form-group row">
1137
- <label class="col-sm-5 col-md-5 control-label">Pick Data Format</label>
1138
- <div class="col-sm-7 col-md-7">
1139
- <select class="form-select" data-bind="options: ['Days', 'Hours', 'Minutes', 'Seconds'].indexOf(fieldFormat()) >= 0 ? ['Days', 'Hours', 'Minutes', 'Seconds'] : $parents[1].fieldFormatTypes, value: fieldFormat"></select>
1140
- </div>
1141
- </div>
1142
- <div class="form-group row" data-bind="visible: $parents[1].decimalFormatTypes.indexOf($data.fieldFormat())>=0">
1143
- <label class="col-sm-5 col-md-5 control-label">Pick Decimal Places</label>
1144
- <div class="col-sm-7 col-md-7">
1145
- <input type="number" class="form-control" data-bind="value: decimalPlaces" placeholder="" />
1146
- </div>
1147
- </div>
1148
- <div class="form-group row" data-bind="visible: fieldFormat()=='Currency'">
1149
- <label class="col-sm-5 col-md-5 control-label">Pick Currency Format</label>
1150
- <div class="col-sm-7 col-md-7">
1151
- <select class="form-select" required data-bind="options: $parents[1].currencyFormats, optionsText: 'display',optionsValue: 'value', value: currencyFormat"></select>
1152
- </div>
1153
- </div>
1154
- <div class="form-group row" data-bind="visible: fieldFormat()=='Date'">
1155
- <label class="col-sm-5 col-md-5 control-label">Pick Date Format</label>
1156
- <div class="col-sm-7 col-md-7">
1157
- <select class="form-select" data-bind="options: $parents[1].dateFormats, value: dateFormat"></select>
1158
- </div>
1159
- </div>
1160
- <div class="form-group row" data-bind="visible:selectedAggregate()=='Pivot' && fieldFormat()=='Date'">
1161
- <label class="col-sm-5 col-md-5 control-label">Pivot Drilldown Date Format</label>
1162
- <div class="col-sm-7 col-md-7">
1163
- <select class="form-select" data-bind="options: ['', 'Day', 'Month', 'Year', 'Month/Year'], value: drillDataFormat"></select>
1164
- </div>
1165
- </div>
1166
-
1167
- <div class="form-group row" data-bind="visible: fieldFormat()=='Date' && dateFormat()==='Custom'">
1168
- <label class="col-sm-5 col-md-5 control-label">Enter Custom Date Format</label>
1169
- <div class="col-sm-7 col-md-7">
1170
- <input type="text" class="form-control" data-bind="value: customDateFormat" placeholder="dd/mm/yyyy" />
1171
- </div>
1172
- </div>
1173
- <div class="form-group row">
1174
- <label class="col-sm-5 col-md-5 control-label">Choose Column Label</label>
1175
- <div class="col-sm-7 col-md-7">
1176
- <input type="text" class="form-control" data-bind="value: fieldLabel" />
1177
- </div>
1178
- </div>
1179
- <div class="form-group row">
1180
- <label class="col-sm-5 col-md-5 control-label">Inner Column Label</label>
1181
- <div class="col-sm-7 col-md-7">
1182
- <input type="text" class="form-control" data-bind="value: fieldLabel2" />
1183
- </div>
1184
- </div>
1185
- <div class="form-group row">
1186
- <label class="col-sm-5 col-md-5 control-label">Choose Text Alignment</label>
1187
- <div class="col-sm-7 col-md-7">
1188
- <select class="form-select" data-bind="options: $parents[1].fieldAlignments, value: fieldAlign"></select>
1189
- </div>
1190
- </div>
1191
- <div class="form-group row">
1192
- <label class="col-sm-5 col-md-5 control-label">Choose Width (leave blank for auto)</label>
1193
- <div class="col-sm-7 col-md-7">
1194
- <input type="text" class="form-control" data-bind="value: fieldWidth" />
1195
- </div>
1196
- </div>
1197
- </div>
1198
- <br />
1199
- <div class="card card-body">
1200
- <div class="form-row align-items-center">
1201
- <div class="col-auto">
1202
- <b>Header Settings</b>
1203
- </div>
1204
- </div>
1205
- <div class="row mb-3">
1206
- <div class="col">
1207
- <div class="mb-3">
1208
- <label class="form-label">Pick Text Color</label>
1209
- <div class="d-flex">
1210
- <input type="color" style="width: 50px; height: 38px;" class="form-control me-2" data-bind="value: headerFontColor" />
1211
- <input type="text" style="width: 100px" class="form-control me-2" data-bind="value: headerFontColor" />
1212
- <button class="btn btn-sm btn-secondary" title="Apply to all columns" data-bind="click: function(){applyAllHeaderFontColor(!applyAllHeaderFontColor()); }">
1213
- <span class="fa" data-bind="css: applyAllHeaderFontColor() ? 'fa-check' : 'fa-paste'"></span>
1214
- </button>
1215
- </div>
1216
- </div>
1217
- </div>
1218
- <div class="col">
1219
- <div class="mb-3">
1220
- <label class="form-label">Pick Background Color</label>
1221
- <div class="d-flex">
1222
- <input type="color" style="width: 50px; height: 38px;" class="form-control me-2" data-bind="value: headerBackColor" />
1223
- <input type="text" style="width: 100px" class="form-control me-2" data-bind="value: headerBackColor" />
1224
- <button class="btn btn-sm btn-secondary" title="Apply to all columns" data-bind="click: function(){applyAllHeaderBackColor(!applyAllHeaderBackColor()); }">
1225
- <span class="fa" data-bind="css: applyAllHeaderBackColor() ? 'fa-check' : 'fa-paste'"></span>
1226
- </button>
1227
- </div>
1228
- </div>
1229
- </div>
1230
- <div class="col d-flex align-items-center">
1231
- <div class="form-check me-3">
1232
- <input class="form-check-input" type="checkbox" data-bind="checked: headerFontBold" id="headerFontBoldCheckbox">
1233
- <label class="form-check-label" for="headerFontBoldCheckbox">
1234
- Bold Text
1235
- </label>
1236
- </div>
1237
- <button class="btn btn-sm btn-secondary" title="Apply to all columns" data-bind="click: function(){applyAllHeaderBold(!applyAllHeaderBold()); }">
1238
- <span class="fa" data-bind="css: applyAllHeaderBold() ? 'fa-check' : 'fa-paste'"></span>
1239
- </button>
1240
- </div>
1241
- </div>
1242
- </div>
1243
- <br />
1244
- <div class="card card-body">
1245
- <div class="form-row align-items-center">
1246
- <div class="col-auto">
1247
- <b>Text Settings</b>
1248
- </div>
1249
- </div>
1250
- <div class="row mb-3">
1251
- <div class="col">
1252
- <div class="mb-3">
1253
- <label class="form-label">Pick Text Color</label>
1254
- <div class="d-flex">
1255
- <input type="color" style="width: 50px; height: 38px;" class="form-control me-2" data-bind="value: fontColor" />
1256
- <input type="text" style="width: 100px;" class="form-control me-2" data-bind="value: fontColor" />
1257
- <button class="btn btn-sm btn-secondary" title="Apply to all columns" data-bind="click: function(){applyAllFontColor(!applyAllFontColor()); }">
1258
- <span class="fa" data-bind="css: applyAllFontColor() ? 'fa-check' : 'fa-paste'"></span>
1259
- </button>
1260
- </div>
1261
- </div>
1262
- </div>
1263
- <div class="col">
1264
- <div class="mb-3">
1265
- <label class="form-label">Pick Background Color</label>
1266
- <div class="d-flex">
1267
- <input type="color" style="width: 50px; height: 38px;" class="form-control me-2" data-bind="value: backColor" />
1268
- <input type="text" style="width: 100px;" class="form-control me-2" data-bind="value: backColor" />
1269
- <button class="btn btn-sm btn-secondary" title="Apply to all columns" data-bind="click: function(){applyAllBackColor(!applyAllBackColor()); }">
1270
- <span class="fa" data-bind="css: applyAllBackColor() ? 'fa-check' : 'fa-paste'"></span>
1271
- </button>
1272
- </div>
1273
- </div>
1274
- </div>
1275
- <div class="col d-flex align-items-center">
1276
- <div class="form-check me-3">
1277
- <input class="form-check-input" type="checkbox" data-bind="checked: fontBold" id="fontBoldCheckbox">
1278
- <label class="form-check-label" for="fontBoldCheckbox">
1279
- Bold Text
1280
- </label>
1281
- </div>
1282
- <button class="btn btn-sm btn-secondary" title="Apply to all columns" data-bind="click: function(){applyAllBold(!applyAllBold()); }">
1283
- <span class="fa" data-bind="css: applyAllBold() ? 'fa-check' : 'fa-paste'"></span>
1284
- </button>
1285
- </div>
1286
- </div>
1287
- </div>
1288
- <div class="padded-div">
1289
- <button class="btn btn-sm btn-primary" data-bind="click: function() {addConditionalFormatSetting(null)}">Add Conditional Formatting</button>
1290
- </div>
1291
- <div data-bind="foreach: fieldCondtionalFormats" style="padding-left: 40px;">
1292
- <div class="card card-body">
1293
- <div class="row m-2">
1294
- <div class="col d-flex justify-content-start">
1295
- <b>Conditional Format #<span data-bind="text: $index()+1"></span></b>
1296
- </div>
1297
- <div class="col d-flex justify-content-end">
1298
- <button class="btn btn-sm btn-secondary" data-bind="click: $parent.removeSetting">Remove</button>
1299
- </div>
1300
- </div>
1301
- <div class="row mb-3">
1302
- <div class="col">
1303
- <div class="mb-3">
1304
- <label class="form-label">Pick Text Color</label>
1305
- <div class="d-flex">
1306
- <input type="color" style="width: 50px; height: 38px;" class="form-control me-2" data-bind="value: fontColor" />
1307
- <input type="text" style="width: 100px;" class="form-control me-2" data-bind="value: fontColor" />
1308
- </div>
1309
- </div>
1310
- </div>
1311
- <div class="col">
1312
- <div class="mb-3">
1313
- <label class="form-label">Pick Background Color</label>
1314
- <div class="d-flex">
1315
- <input type="color" style="width: 50px; height: 38px;" class="form-control me-2" data-bind="value: backColor" />
1316
- <input type="text" style="width: 100px;" class="form-control me-2" data-bind="value: backColor" />
1317
- </div>
1318
- </div>
1319
- </div>
1320
- <div class="col d-flex align-items-center">
1321
- <div class="form-check me-3">
1322
- <input class="form-check-input" type="checkbox" data-bind="checked: fontBold" id="fontBoldCheckbox">
1323
- <label class="form-check-label" for="fontBoldCheckbox">
1324
- Bold Text
1325
- </label>
1326
- </div>
1327
- </div>
1328
- </div>
1329
-
1330
- <div class="row m-2" data-bind="foreach: filter.Filters">
1331
- <div class="col-md-2">
1332
- Value
1333
- </div>
1334
- <div class="col-md-4">
1335
- <div data-bind="with: Field">
1336
- <div class="form-group">
1337
- <select class="form-select" style="width: 100%;" data-bind="options: fieldFilter, value: $parent.Operator" required></select>
1338
- </div>
1339
- </div>
1340
- </div>
1341
- <div class="col-md-4">
1342
- <div data-bind="with: Field" data-parentprefix="C">
1343
- <div data-bind="template: 'report-filter', data: $data"></div>
1344
- </div>
1345
- </div>
1346
- </div>
1347
- </div>
1348
- </div>
1349
- <br />
1350
- <div class="form-group row" data-bind="if: $parents[1].useStoredProc()">
1351
- <div class="col-sm-12">
1352
- <div class="checkbox pull-left" style="padding-top: 5px;">
1353
- <label>
1354
- <input type="checkbox" data-bind="checked: checkOuterGroup" />
1355
- Outer Group
1356
- </label>
1357
- </div>
1358
- </div>
1359
- </div>
1360
- </div>
1361
- <div class="modal-footer">
1362
- <button type="button" class="btn btn-danger" data-bind="click: cancelFieldOptions">Cancel</button>
1363
- <button type="button" class="btn btn-primary" data-bind="click: saveFieldOptions">Save Changes</button>
1364
- </div>
1365
- </div>
1366
- </div>
1367
- </script>
1368
-
1369
- <script type="text/html" id="report-link-edit">
1370
- <div class="modal-dialog" style="max-width: 750px;">
1371
- <div class="modal-content" data-bind="with: editLinkField">
1372
- <div class="modal-header">
1373
- <h5 class="modal-title">Setup Link Field</h5>
1374
- </div>
1375
- <div class="modal-body needs-validation" data-bind="with: linkFieldItem">
1376
- <div class="form-group row">
1377
- <label class="col-sm-5 col-md-5 control-label">This field will link to</label>
1378
- <div class="col-sm-7 col-md-7">
1379
- <select class="form-select" required data-bind="options: linkTypes, value: selectedLinkType"></select>
1380
- </div>
1381
- </div>
1382
- <div data-bind="if: LinksToReport">
1383
- <div class="form-group row">
1384
- <label class="col-sm-5 col-md-5 control-label">Link to this Report</label>
1385
- <div class="col-sm-7 col-md-7">
1386
- <select class="form-select" required data-bind="options: $parentContext.$parent.SavedReports, optionsText: 'reportName', optionsValue: 'reportId', value: LinkedToReportId, optionsCaption: 'Choose the Report to link to'"></select>
1387
- </div>
1388
- </div>
1389
- <div class="checkbox" data-bind="if: LinkedToReportId">
1390
- <label>
1391
- <input type="checkbox" data-bind="checked: SendAsFilterParameter" />
1392
- Send field value as Report Filter Parameter
1393
- </label>
1394
- </div>
1395
- <div class="form-group row" data-bind="if: SendAsFilterParameter">
1396
- <label class="col-sm-5 col-md-5 control-label">Link to this Report Filter</label>
1397
- <div class="col-sm-7 col-md-7">
1398
- <select class="form-select" required data-bind="options: allFields, optionsText: 'fieldName', optionsValue: 'fieldId', value: SelectedFilterId, optionsCaption: 'Choose the Field to Filter by value'"></select>
1399
- </div>
1400
- </div>
1401
- </div>
1402
- <div data-bind="ifnot: LinksToReport">
1403
- <div class="form-group row">
1404
- <label class="col-sm-5 col-md-5 control-label">Link to this URL</label>
1405
- <div class="col-sm-7 col-md-7">
1406
- <input type="text" class="form-control" required placeholder="Enter a url to open" data-bind="value: LinkToUrl" title="Valid URL needs to start with http:// or https://">
1407
- </div>
1408
- </div>
1409
- <div class="checkbox">
1410
- <label>
1411
- <input type="checkbox" data-bind="checked: SendAsQueryParameter" />
1412
- Send field value as Query Parameter
1413
- </label>
1414
- </div>
1415
- <div class="form-group row" data-bind="if: SendAsQueryParameter">
1416
- <label class="col-sm-5 col-md-5 control-label">Parameter Name to use</label>
1417
- <div class="col-sm-7 col-md-7">
1418
- <input type="text" class="form-control" required placeholder="Enter parameter name to send value as" data-bind="value: QueryParameterName">
1419
- </div>
1420
- </div>
1421
- <br />
1422
- </div>
1423
- </div>
1424
- <div class="modal-footer">
1425
- <button type="button" class="btn btn-danger" data-bind="click: removeLinkField">Remove Link</button>
1426
- <button type="button" class="btn btn-primary" data-bind="click: saveLinkField">Save Changes</button>
1427
- </div>
1428
- </div>
1429
- </div>
1430
- </script>
1431
-
1432
- <script type="text/html" id="designer-choose-visual">
1433
- <div class="btn-group" role="group" aria-label="Visualization Options">
1434
- <button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('List'); }, css: { active: ReportType()=='List' }">
1435
- <span class="fa fa-2x fa-list-alt"></span>
1436
- <p>List</p>
1437
- </button>
1438
- <button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('Summary'); }, css: { active: ReportType()=='Summary' }">
1439
- <span class="fa fa-2x fa-table"></span>
1440
- <p>Summary</p>
1441
- </button>
1442
- <button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('Bar'); }, css: { active: ReportType()=='Bar' }">
1443
- <span class="fa fa-2x fa-bar-chart"></span>
1444
- <p>Bar</p>
1445
- </button>
1446
- <button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('Pie'); }, css: { active: ReportType()=='Pie' }">
1447
- <span class="fa fa-2x fa-pie-chart"></span>
1448
- <p>Pie</p>
1449
- </button>
1450
- <button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('Line'); }, css: { active: ReportType()=='Line' }">
1451
- <span class="fa fa-2x fa-line-chart"></span>
1452
- <p>Line</p>
1453
- </button>
1454
- <button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('Combo'); }, css: { active: ReportType()=='Combo' }">
1455
- <span class="fa fa-2x fa-signal"></span>
1456
- <p>Combo</p>
1457
- </button>
1458
- <button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('Html'); }, css: { active: ReportType()=='Html' }">
1459
- <span class="fa fa-2x fa-code"></span>
1460
- <p>Custom</p>
1461
- </button>
1462
- <button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('Map'); }, css: { active: ReportType().indexOf('Map')==0 }">
1463
- <span class="fa fa-2x fa-globe"></span>
1464
- <p>Map</p>
1465
- </button>
1466
- <button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('HeatMap'); }, css: { active: ReportType().indexOf('HeatMap')==0 }">
1467
- <span class="fa fa-2x fa-map"></span>
1468
- <p>HeatMap</p>
1469
- </button>
1470
- <button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('Single'); }, css: { active: ReportType()=='Single' }">
1471
- <span class="fa fa-2x fa-window-maximize"></span>
1472
- <p>KPI</p>
1473
- </button>
1474
- <button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('Treemap'); }, css: { active: ReportType()=='Treemap' }">
1475
- <span class="fa fa-2x fa-window-restore"></span>
1476
- <p>Treemap</p>
1477
- </button>
1478
- <button class="btn btn-outline-secondary" data-bind="click: function(){ setReportType('Pivot'); }, css: { active: ReportType()=='Pivot' }">
1479
- <span class="fa fa-2x fa-random"></span>
1480
- <p>Transpose</p>
1481
- </button>
1482
- </div>
1483
- </script>
1484
-
1485
- <script type="text/html" id="designer-choose-data">
1486
- <div>
1487
- <div class="pull-left btn-group btn-group-toggle" role="group" data-bind="if: ReportID() <= 0">
1488
- <label class="btn btn-sm btn-light active" style="margin-right: 0px;" title="You can change the Data source only when creating a new report, changing this will clear all selections">
1489
- <input type="radio" name="dataoption" id="table" checked data-bind="checked: useStoredProc, checkedValue: false"> Dynamic
1490
- </label>
1491
- <label class="btn btn-sm btn-light active">
1492
- <input type="radio" name="dataoption" id="proc" value="1" data-bind="checked: useStoredProc, checkedValue: true"> Predefined
1493
- </label>
1494
- </div>
1495
- <div class="pull-right">
1496
- <a href="#" class="btn btn-secondary btn-sm" title="Add Custom Field using Formula" data-bind="hidden: isFunctionField() || useStoredProc(), click: cancelFormulaField, text: isFormulaField()? 'Cancel': 'Custom Field', css: {'btn-primary': !isFormulaField(), 'btn-danger': isFormulaField}"></a>
1497
- <a href="#" class="btn btn-secondary btn-sm" title="Add Custom Field using Function" data-bind="hidden: true || isFormulaField() || useStoredProc(), click: function(){designFunctionField()}, text: isFunctionField()? 'Cancel': 'Function Field', css: {'btn-primary': !isFunctionField(), 'btn-danger': isFunctionField}"></a>
1498
- </div>
1499
- </div>
1500
- <div class="clearfix"></div>
1501
- <div class="row">
1502
- <div class="col-md-12" data-bind="disable: isFormulaField, hidden: useStoredProc">
1503
- <div data-bind="with: textQuery.searchFields">
1504
- <select id="search-field" class="form-control" data-bind="select2: {dropdownParent: $root.activeDesign() ? $('#choose-data-design') : $('#choose-data-card'), placeholder: 'Search for a Data Field...', ajax: { url: url, dataType: 'json', data: query, processResults: processResults, headers: headers }, minimumInputLength: 2, allowClear: true }, value: selectedOption"></select>
1505
- </div>
1506
- </div>
1507
-
1508
- <div class="col-md-12" data-bind="visible: useStoredProc">
1509
- <div>
1510
- <select class="form-control" data-bind="select2Value: {dropdownParent: $root.activeDesign() ? $('#choose-data-design') : $('#choose-data-card')}, options: Procs, optionsCaption: 'Choose Section...', optionsText: 'DisplayName', value: SelectedProc, visible: useStoredProc"></select>
1511
- </div>
1512
- </div>
1513
- <div class="col-md-12" data-bind="hidden: useStoredProc">
1514
- <div class="d-flex justify-content-between align-items-center mb-2" style="padding-top: 15px;">
1515
- <span>
1516
- Select Data to use in Report
1517
- <i class="fa fa-info-circle text-muted" data-toggle="tooltip" title="Choose a table to show fields to select."></i>
1518
- </span>
1519
- </div>
1520
-
1521
- <div class="data-select-tree">
1522
- <!-- ko foreach: CategorizedTables -->
1523
- <div class="mb-3">
1524
- <div data-bind="click: function() { isExpanded(!isExpanded()); }, visible: categoryName" style="cursor: pointer;">
1525
- <i class="fa" data-bind="css: isExpanded() ? 'fa-chevron-down text-secondary' : 'fa-chevron-right text-secondary'"></i>
1526
- <i class="fa" data-bind="css: isExpanded() ? 'fa-folder-open' : 'fa-folder'"></i>
1527
- <span data-bind="text: categoryName" class="ml-2"></span>
1528
- </div>
1529
- <div class="report-list" data-bind="visible: isExpanded(), foreach: tables" style="padding-left: 15px;">
1530
- <div class="row border-bottom py-2 w-100">
1531
- <div class="col-md-12">
1532
- <div class="pull-left" data-bind="click: function() { selectTable($data); }, css: {'text-muted': !isEnabled()}, style: {cursor: isEnabled() ? 'pointer' : ''}, attr: {title: !isEnabled() ? 'Cannot use table as joins do not exist': ''}">
1533
- <span class="text-secondary fa" data-bind="css: isEnabled() ? ($data === $parents[1].SelectedTable() ? 'fa-chevron-down' : 'fa-chevron-right') : 'fa-ban'"></span>&nbsp;
1534
- <span class="fa fa-table"></span>&nbsp;<span data-bind="text: tableName" class=""></span>
1535
- </div>
1536
- <div class="pull-right" data-bind="visible: $data === $parents[1].SelectedTable() && !$parents[1].isFormulaField() && !$parents[1].SelectedTable().dynamicColumns">
1537
- <a href="#" class="small text-muted" data-bind="click: $parents[1].MoveAllFields">Select all</a> |
1538
- <a href="#" class="small text-muted" data-bind="click: $parents[1].RemoveSelectedFields">Remove all</a>
1539
- </div>
1540
- </div>
1541
-
1542
- <!-- Fields Expand Here -->
1543
- <div data-bind="visible: $data === $parents[1].SelectedTable()" style="padding-left: 30px;">
1544
- <!-- ko foreach: $parents[1].ChooseFields -->
1545
- <div class="row border-bottom py-2 align-items-center w-100">
1546
- <div class="checkbox">
1547
- <label>
1548
- <input type="checkbox" data-bind="checkedInArray: {array: $parents[2].isFormulaField() ? $parents[2].formulaFields : $parents[2].SelectedFields, value: $data}">
1549
- <span data-bind="text: fieldName"></span>
1550
- </label>
1551
- </div>
1552
- </div>
1553
- <!--/ko-->
1554
- </div>
1555
- </div>
1556
- </div>
1557
- </div>
1558
- <!-- /ko -->
1559
- </div>
1560
- </div>
1561
- </div>
1562
- </script>
1563
-
1564
- <script type="text/html" id="designer-selected-data">
1565
- <div data-bind="visible: SelectedFields().length == 0">
1566
- Please choose data
1567
- </div>
1568
- <div data-bind="if: SelectedFields().length > 0">
1569
- <div data-bind="visible: ReportType()=='Bar'" class="card card-body">
1570
- <div class="alert alert-info small py-1 mb-2">
1571
- <span class="fa fa-lightbulb-o"></span>&nbsp;For Bar Graph, the first field below will show on the x-axis. All other numeric fields will show on y-axis.
1572
- </div>
1573
- <div class="form-group row small">
1574
- <div class="checkbox col-6">
1575
- <label>
1576
- <input type="checkbox" data-bind="checked: barChartHorizontal" />
1577
- Horizontal Bar Chart
1578
- </label>
1579
- </div>
1580
- <div class="checkbox col-6">
1581
- <label>
1582
- <input type="checkbox" data-bind="checked: barChartStacked" />
1583
- Stacked Bar Chart
1584
- </label>
1585
- </div>
1586
- </div>
1587
- </div>
1588
-
1589
- <div data-bind="visible: ReportType()=='Pie'" class="card card-body">
1590
- <div class="alert alert-info small py-1 mb-2">
1591
- <span class="fa fa-lightbulb-o"></span>&nbsp;For Pie Graph, the first field below will be grouped, and the first numeric field will show as the ratio.
1592
- </div>
1593
- <div class="form-group row small">
1594
- <div class="checkbox col-6">
1595
- <label>
1596
- <input type="checkbox" data-bind="checked: pieChartDonut" />
1597
- Donut Chart
1598
- </label>
1599
- </div>
1600
- </div>
1601
- </div>
1602
-
1603
- <div data-bind="visible: ReportType()=='Treemap'" class="card card-body">
1604
- <div class="alert alert-info small py-1 mb-0">
1605
- <span class="fa fa-lightbulb-o"></span>&nbsp;For Treemap, the data must be in a hierarchical format with 2nd column having parent and third column having a numeric value. The data must have a single root node having null as its parent as well.
1606
- </div>
1607
- </div>
1608
- <div data-bind="visible: ReportType()=='HeatMap'" class="card card-body">
1609
- <div class="alert alert-info mb-3">
1610
- <span class="fa fa-lightbulb-o fa-2x"></span>&nbsp;For HeatMap, the first two columns must be numeric values representing
1611
- <strong>Latitude</strong> and <strong>Longitude</strong>. At least one additional numeric column is required to provide the
1612
- <strong>intensity</strong> of each point.
1613
- </div>
1614
-
1615
- <div class="form-group row mb-2">
1616
- <div class="checkbox col-6">
1617
- <label>
1618
- <input type="checkbox" data-bind="checked: heatMapOptions.showMarker" />
1619
- Show Marker
1620
- </label>
1621
- </div>
1622
- </div>
1623
-
1624
- <div class="form-group row mb-3">
1625
- <label class="col-12 fw-bold">Heatmap Colors</label>
1626
-
1627
- <div class="col-4 mb-2">
1628
- <input type="color" class="color-picker"
1629
- data-bind="value: heatMapOptions.gradient1" title="Gradient 1" />
1630
- </div>
1631
- <div class="col-4 mb-2">
1632
- <input type="color" class="color-picker"
1633
- data-bind="value: heatMapOptions.gradient2" title="Gradient 2" />
1634
- </div>
1635
- <div class="col-4 mb-2">
1636
- <input type="color" class="color-picker"
1637
- data-bind="value: heatMapOptions.gradient3" title="Gradient 3" />
1638
- </div>
1639
- </div>
1640
- </div>
1641
-
1642
- <div data-bind="visible: ReportType()=='Line'" class="card card-body">
1643
- <div class="alert alert-info small py-1 mb-2">
1644
- <span class="fa fa-lightbulb-o"></span>&nbsp;For Line Graph, the first field below will show on the x-axis. All other fields will numeric fields will show on y-axis.
1645
- </div>
1646
- <div class="form-group row small">
1647
- <div class="checkbox col-6">
1648
- <label>
1649
- <input type="checkbox" data-bind="checked: lineChartArea" />
1650
- Area Chart
1651
- </label>
1652
- </div>
1653
- </div>
1654
- </div>
1655
-
1656
- <div data-bind="visible: ReportType()=='Combo'" class="card card-body">
1657
- <div class="alert alert-info small py-1 mb-2">
1658
- <span class="fa fa-lightbulb-o"></span>&nbsp;For Combo Graph, the first field below will show on the x-axis. All other numeric fields will show on y-axis, and you can choose display each series as line, bar or area.
1659
- </div>
1660
- <div class="form-group row small">
1661
- <div class="col-6">
1662
- <label>Default Series Type</label>
1663
- <select class="form-select form-select-sm" data-bind="options: seriesTypes, value: comboChartType"></select>
1664
- </div>
1665
- </div>
1666
- </div>
1667
-
1668
- <div data-bind="visible: ReportType()=='Pivot'" class="card card-body">
1669
- <div class="alert alert-info small py-1 mb-0">
1670
- <span class="fa fa-lightbulb-o"></span>&nbsp;For Transpose, the first field below will be used to Pivot/Transpose the rows as columns, and it must be grouped.
1671
- </div>
1672
- </div>
1673
-
1674
- <div data-bind="visible: ReportType()=='Single'" class="card card-body">
1675
- <div class="alert alert-info small py-1 mb-0">
1676
- <span class="fa fa-lightbulb-o"></span>&nbsp;KPI is a single value report that is ideal for placing on a Dashboard. All fields except one must be hidden for Widgets.
1677
- </div>
1678
- </div>
1679
-
1680
- <div data-bind="visible: ReportType()=='Html'" class="card card-body">
1681
- <div class="form-group row small">
1682
- <div class="checkbox col-6">
1683
- <label>
1684
- <input type="checkbox" data-bind="checked: dontGroupCustom" />
1685
- List (Don't Summarize)
1686
- </label>
1687
- </div>
1688
- </div>
1689
- </div>
1690
-
1691
- <div data-bind="visible: ReportType()=='Map'" class="card card-body">
1692
- <div class="alert alert-info small py-1 mb-2">
1693
- <span class="fa fa-lightbulb-o"></span>&nbsp;For Map Graph, the first field below has to be a Region, like a Country.
1694
- </div>
1695
- <div class="form-group row small">
1696
- <label class="col-sm-3 control-label">Map Display</label>
1697
- <div class="col-sm-5">
1698
- <select class="form-select form-select-sm" data-bind="options: mapRegions, value: mapRegion"></select>
1699
- </div>
1700
- </div>
1701
- </div>
1702
- </div>
1703
- <ul class="list-group" data-bind="sortable: { data: SelectedFields, options: { handle: '.sortable', cursor: 'move', placeholder: 'drop-highlight' }, strategyMove: true }">
1704
- <li class="list-group-item">
1705
- <div class="row">
1706
- <div class="col-5">
1707
- <span class="sortable pull-left" style="padding-right: 15px;" data-bind="ifnot: $parent.useStoredProc">
1708
- <span class="fa fa-ellipsis-v" aria-hidden="true" title="Drag to reorder"></span>
1709
- </span>
1710
- <span class="fa fa-columns"></span>
1711
- <span data-bind="text: selectedFieldName"></span>
1712
- <span data-bind="text: isFormulaField() ? '(' + fieldFormat() + ')' : ''"></span>
1713
- <span data-bind="visible: !$parent.isFieldValidForYAxis($index(), fieldType || fieldFormat(), selectedAggregate()) && $parent.ReportType() !='Treemap' && $parent.isChart()">
1714
- <span class="badge bg-danger" data-bind="visible: !groupInGraph()">Will not show in <span data-bind="text: $parent.ReportType"></span>Chart</span>
1715
- </span>
1716
- <span data-bind="visible: $parent.IsPivotFieldLastColumn($index(),selectedAggregate())">
1717
- <span class="badge bg-danger" >Pivot field cannot be the last column.</span>
1718
- </span>
1719
- <span data-bind="visible: $parent.IsDynamicFieldFirstColumn($index())">
1720
- <span class="badge bg-danger" >Dynamic cannot be first column.</span>
1721
- </span>
1722
- </div>
1723
- <div class="col-7">
1724
- <div class="pull-right" style="margin-top: -5px;" data-bind="if: $parent.AggregateReport() && !$parent.useStoredProc()">
1725
- <select class="form-select form-control-sm" data-bind="options: $parent.canDrilldown() && $index()>0 ? fieldAggregateWithDrilldown : fieldAggregate, value: selectedAggregate"></select>
1726
- </div>
1727
-
1728
- <div class="pull-right" style="padding-right: 10px;" data-bind="ifnot: $parent.useStoredProc">
1729
- <span class="fa fa-trash-o" title="Cannot Delete Required Filter" data-bind="visible: forceFilterForTable"></span>
1730
- <span class="fa fa-trash" style="cursor: pointer;" aria-hidden="true" title="Delete this Field" data-bind="click: $parent.RemoveField, hidden: forceFilterForTable"></span>
1731
- </div>
1732
- <!--<div class="pull-right" style="padding-right: 10px;" data-bind="ifnot: $parent.useStoredProc">
1733
- <span class="button-box no-padding" tabindex="0" data-bind="click: function(){ filterOnFly(!filterOnFly()); }, css: {active: filterOnFly()==true}">
1734
- <span class="fa fa-filter" aria-hidden="true" title="Filter by this field on the Report"></span>
1735
- </span>
1736
- </div>-->
1737
- <div class="pull-right" style="padding-right: 10px;" data-bind="visible: $parent.ReportType()!='Pivot'">
1738
- <span class="button-box no-padding" tabindex="0" data-bind="click: toggleDisable, css: {active: disabled()==true}">
1739
- <span class="fa fa-close" aria-hidden="true" title="Do not include in Report"></span>
1740
- </span>
1741
- </div>
1742
- <div class="pull-right" style="padding-right: 10px;" data-bind="visible: $parent.ReportType()!='Pivot' && $parent.ReportType()!='List' && !$parent.useStoredProc()">
1743
- <span class="button-box no-padding" tabindex="0" data-bind="click: function(){ hideInDetail(!hideInDetail()); }, css: {active: hideInDetail()==true}">
1744
- <span class="fa fa-eye-slash" aria-hidden="true" title="Hide in Details"></span>
1745
- </span>
1746
- </div>
1747
- <div class="pull-right" style="padding-right: 10px;" data-bind="visible: $parent.isFieldValidForYAxis($index(), fieldType || fieldFormat(), selectedAggregate()) && $parent.isChart() && $index()>0">
1748
- <span class="button-box no-padding" tabindex="0" data-bind="click: function(){ groupInGraph(!groupInGraph()); }, css: {active: groupInGraph()==false}">
1749
- <span class="fa fa-signal" aria-hidden="true" title="Include in series"></span>
1750
- </span>
1751
- </div>
1752
- <div class="pull-right" style="padding-right: 10px;" data-bind="visible: $parent.IncludeSubTotal() && (['Int', 'Double', 'Money', 'Decimal', 'Currency'].indexOf(fieldType) >= 0 || ['Int', 'Double', 'Money', 'Decimal', 'Currency'].indexOf(fieldFormat()) >= 0)">
1753
- <span class="button-box no-padding" tabindex="0" data-bind="click: function(){ dontSubTotal(!dontSubTotal()); }, css: {active: dontSubTotal()==true}">
1754
- <span class="fa fa-plus-circle" aria-hidden="true" title="Don't add to Total row"></span>
1755
- </span>
1756
- </div>
1757
- <div class="pull-right" style="padding-right: 10px;" data-bind="visible: $parent.ReportType()!='Pivot'">
1758
- <span class="button-box no-padding" tabindex="0" data-bind="click: setupLinkField, css: {active: linkField()==true}">
1759
- <span class="fa fa-link" aria-hidden="true" title="Link to another Report or Url"></span>
1760
- </span>
1761
- </div>
1762
- <div class="pull-right" style="padding-right: 10px;" data-bind="visible: $parent.ReportType()=='Combo' && $parent.isFieldValidForYAxis($index(), fieldType || fieldFormat(), selectedAggregate()) && $parent.isChart() && $index()>0">
1763
- <span class="button-box no-padding" tabindex="0" data-bind="click: function(){ seriesType(seriesType() == 'line' ? 'area' : (seriesType()=='bars' ? 'line' : 'bars')); }">
1764
- <span class="fa" aria-hidden="true" data-bind="css: {'fa-line-chart': seriesType() == 'line', 'fa-bar-chart': seriesType() == 'bars', 'fa-area-chart': seriesType()=='area' }, attr: {title: seriesType}"></span>
1765
- </span>
1766
- </div>
1767
- <div class="pull-right" style="padding-right: 10px;">
1768
- <span class="button-box no-padding" tabindex="0" data-bind="click: setupFieldOptions">
1769
- <span class="fa fa-gear" aria-hidden="true" title="More Options"></span>
1770
- </span>
1771
- </div>
1772
- <div class="pull-right" style="padding-right: 10px;" data-bind="if: isFormulaField">
1773
- <span class="button-box no-padding" tabindex="0" data-bind="click: editFormulaField">
1774
- <span class="fa fa-pencil" aria-hidden="true" title="Edit Formula Field"></span>
1775
- </span>
1776
- </div>
1777
- </div>
1778
- </div>
1779
- </li>
1780
- </ul>
1781
- </script>
1782
-
1783
- <script type="text/html" id="designer-sub-report">
1784
- <p class="text-muted mb-3">
1785
- Linked reports are available to add as sub reports.
1786
- Selecting sub reports will restrict the report to <strong>one record per page</strong>.
1787
- </p>
1788
-
1789
- <div class="mb-3">
1790
- <select class="form-select"
1791
- data-bind="options: linkedReportFields,
1792
- optionsText: 'name',
1793
- value: selectedSubReport,
1794
- optionsCaption: 'Select a linked report...'">
1795
- </select>
1796
- </div>
1797
- <ul class="list-group"
1798
- data-bind="sortable: {
1799
- data: subReports,
1800
- options: { handle: '.sortable', cursor: 'move', placeholder: 'drop-highlight' }
1801
- }">
1802
- <li class="list-group-item d-flex justify-content-between align-items-center">
1803
- <span>
1804
- <i class="fa fa-bars sortable me-2" style="cursor:move;"></i>
1805
- <span data-bind="text: name"></span>
1806
- </span>
1807
- <button type="button" class="btn btn-sm btn-outline-danger"
1808
- data-bind="click: $parent.removeSubReport">
1809
- Delete
1810
- </button>
1811
- </li>
1812
- </ul>
1813
- </script>
1814
-
1815
- <script type="text/html" id="designer-html">
1816
- <div class="row align-items-center mb-1">
1817
- <div class="col-md-4">
1818
- <select class="form-select" data-bind="options: SelectedFields, value: SelectFieldToInsert, optionsCaption: 'Select a field...', optionsText: 'selectedFieldName'"></select>
1819
- </div>
1820
- <div class="col-auto dropdown">
1821
- <button class="btn btn-outline-secondary btn-sm dropdown-toggle" type="button" data-bs-toggle="dropdown">
1822
- <i class="fa fa-table"></i> Insert as Table
1823
- </button>
1824
- <ul class="dropdown-menu">
1825
- <li><a class="dropdown-item" href="#" data-bind="click: insertFieldTableTransposed">Transposed</a></li>
1826
- <li><a class="dropdown-item" href="#" data-bind="click: insertFieldTableStandard">Standard</a></li>
1827
- <li><hr class="dropdown-divider"></li>
1828
- <li><a class="dropdown-item" href="#" data-bind="click: insertHeaderBreak">Add Header Break</a></li>
1829
- <li><a class="dropdown-item" href="#" data-bind="click: insertFooterBreak">Add Footer Break</a></li>
1830
- </ul>
1831
- </div>
1832
-
1833
- <div class="col-md-auto ms-2">
1834
- <label class="form-check-label">
1835
- <input class="form-check-input me-2" type="checkbox" data-bind="checked: cardView">
1836
- Card Layout
1837
- </label>
1838
- </div>
1839
- </div>
1840
- <div class="mb-3">
1841
- <textarea data-bind="summernote: reportHtml"></textarea>
1842
- </div>
1843
- </script>
1844
-
1845
- <script type="text/html" id="designer-sort">
1846
- <div data-bind="ifnot: useStoredProc">
1847
- <div class="form-group row align-items-center flex-nowrap">
1848
- <label class="col-auto control-label">Sort By</label>
1849
- <div class="col">
1850
- <select class="form-select form-select-sm"
1851
- data-bind="options: FilteredFields, optionsText: 'selectedFieldName', optionsValue: 'fieldId', value: SortByField, optionsCaption: 'Select field to sort...', allowClear: true">
1852
- </select>
1853
- </div>
1854
- <div class="col-auto d-flex gap-1">
1855
- <button class="btn btn-sm btn-secondary"
1856
- data-bind="text: !SortDesc() ? '▲ Ascending' : 'Descending ▼', click: function() { SortDesc(!SortDesc()); return false; }">
1857
- </button>
1858
- <button class="btn btn-sm btn-secondary"
1859
- data-bind="click: addSortField">
1860
- Add Sort
1861
- </button>
1862
- </div>
1863
- </div>
1864
-
1865
- <div data-bind="foreach: SortFields">
1866
- <div class="form-group row align-items-center flex-nowrap">
1867
- <label class="col-auto control-label">&nbsp;&nbsp;Then Sort By</label>
1868
- <div class="col">
1869
- <select class="form-select form-select-sm" required
1870
- data-bind="options: $parent.FilteredFields, optionsText: 'selectedFieldName', optionsValue: 'fieldId', value: sortByFieldId">
1871
- </select>
1872
- </div>
1873
- <div class="col-auto d-flex gap-1">
1874
- <button class="btn btn-sm btn-secondary"
1875
- data-bind="click: remove">
1876
- Remove Sort
1877
- </button>
1878
- <button class="btn btn-sm btn-secondary"
1879
- data-bind="text: !sortDesc() ? '▲ Ascending' : 'Descending ▼', click: function() { sortDesc(!sortDesc()); return false; }">
1880
- </button>
1881
- <button class="btn btn-sm btn-secondary"
1882
- data-bind="click: $parent.addSortField">
1883
- Add Sort
1884
- </button>
1885
- </div>
1886
- </div>
1887
- </div>
1888
- </div>
1889
- </script>
1890
-
1891
- <script type="text/html" id="designer-options">
1892
- <div class="row">
1893
- <div class="col-md-5">
1894
- <div class="checkbox" data-bind="visible: ReportType()!='Pivot'">
1895
- <label>
1896
- <input type="checkbox" data-bind="checked: IncludeSubTotal" />
1897
- Include Total Row
1898
- </label>
1899
- </div>
1900
- <div class="checkbox" data-bind="hidden: AggregateReport">
1901
- <label>
1902
- <input type="checkbox" data-bind="checked: ShowUniqueRecords" />
1903
- Show only Unique Records
1904
- </label>
1905
- </div>
1906
- <div class="checkbox" data-bind="visible: ReportType()!='List'">
1907
- <label>
1908
- <input type="checkbox" data-bind="checked: ShowExpandOption" />
1909
- Don't Show Expand Option
1910
- </label>
1911
- </div>
1912
- <div class="checkbox" data-bind="visible: isChart">
1913
- <label>
1914
- <input type="checkbox" data-bind="checked: ShowDataWithGraph" />
1915
- Show Data along with Graph
1916
- </label>
1917
- </div>
1918
- <div class="checkbox">
1919
- <label>
1920
- <input type="checkbox" data-bind="checked: DontExecuteOnRun" />
1921
- Wait to Select Filters before Running Report
1922
- </label>
1923
- </div>
1924
- <div class="form-group row">
1925
- <div class="checkbox col-md-5">
1926
- <label>
1927
- <input type="checkbox" data-bind="checked: maxRecords" />
1928
- Max Records
1929
- </label>
1930
- </div>
1931
- <div class="col-md-5" data-bind="if: maxRecords">
1932
- <input type="number" style="width: 150px;" class="form-control" required placeholder="Only top n..." data-bind="value: OnlyTop, visible: maxRecords">
1933
- </div>
1934
- </div>
1935
- <div class="form-group row">
1936
- <div class="checkbox col-md-5">
1937
- <label>
1938
- <input type="checkbox" data-bind="checked: changePageSize, disable: subReports().length > 0" />
1939
- Change Page Size
1940
- </label>
1941
- </div>
1942
- <div class="col-md-5"
1943
- data-bind="visible: changePageSize,
1944
- css: { 'text-muted': subReports().length > 0 }">
1945
- <select style="width: 150px;" class="form-select"
1946
- data-bind="options: [1,10,30,50,100,150,200,500,1000],
1947
- value: DefaultPageSize,
1948
- disable: subReports().length > 0">
1949
- </select>
1950
- <!-- Force default to 1 if sub reports selected -->
1951
- <small class="text-danger" data-bind="visible: subReports().length > 0">
1952
- Page size is restricted to 1 when sub reports are selected.
1953
- </small>
1954
- </div>
1955
- </div>
1956
- </div>
1957
- <div class="col-md-7">
1958
- <p><span class="fa fa-paint-brush"></span> Pick Report Format</p>
1959
- <div>
1960
- <!-- ko foreach: tableStyles -->
1961
- <div class="dropdown-option" data-bind="title: $data.name, click: $parent.selectStyle, css: {'dropdown-option-selected': $parent.selectedStyle() == $data.colorscheme}">
1962
- <div class="mini-table-preview" data-bind="foreach: new Array(5)">
1963
- <div class="mini-table-row" data-bind="foreach: new Array(5)">
1964
- <div class="mini-table-cell" data-bind="style: { backgroundColor: $parentContext.$index() === 0 ? $parents[1].headerBg : ($parentContext.$index() % 2 === 0 ? $parents[1].altRowBg : $parents[1].rowBg), color: $parents[1].textColor }"></div>
1965
-
1966
- </div>
1967
- </div>
1968
- </div>
1969
- <!-- /ko -->
1970
- </div>
1971
- <div class="checkbox">
1972
- <label>
1973
- <input type="checkbox" data-bind="checked: noHeaderRow" />
1974
- No Header Row
1975
- </label>
1976
- </div>
1977
- <div class="checkbox">
1978
- <label>
1979
- <input type="checkbox" data-bind="checked: noDashboardBorders" />
1980
- Borderless on Dashboard
1981
- </label>
1982
- </div>
1983
- <div class="checkbox" data-bind="if: ReportType() == 'Single'">
1984
- <label>
1985
- <input type="checkbox" data-bind="checked: showPriorInKpi" />
1986
- Show previous comparision in KPI if applicable
1987
- </label>
1988
- </div>
1989
- </div>
1990
- </div>
1991
- </script>
1992
-
1993
- <script type="text/html" id="custom-field-designer">
1994
- <div>
1995
- <div class="row">
1996
- <div class="col-md-12" data-bind="visible: isFormulaField()">
1997
- <div class="alert alert-info">
1998
- You are now creating a Customized Field. Please select the fields you want to use in the calculation, then choose the operations you want to perform, and click "Save" to add your Custom field.
1999
- </div>
2000
- </div>
2001
- </div>
2002
- <div class="row">
2003
- <div class="col-sm-6 small">
2004
- Setup your Formula for calculating this Field
2005
- </div>
2006
- <div class="col-sm-6 right-align" data-bind="visible: formulaType()=='build'">
2007
- <a href="#" class="btn btn-secondary btn-sm" data-bind="click: addFormulaParentheses">Add ( )</a>
2008
- <a href="#" class="btn btn-secondary btn-sm" title="Add Today" data-bind="visible: formulaOnlyHasDateFields() || formulaFields().length == 0, click: addFormulaDateToday">Add Today</a>
2009
- <a href="#" class="btn btn-secondary btn-sm" title="Add a Constant Value" data-bind="click: addFormulaConstantValue">Add Value</a>
2010
- <a href="#" class="btn btn-secondary btn-sm" data-bind="click: clearFormulaField">Clear</a>
2011
- </div>
2012
- </div>
2013
- <div class="form-group-row" data-bind="if: formulaOnlyHasDateFields">
2014
- <div class="col-sm-12">
2015
- <div class="alert alert-info">
2016
- For Dates Field calculation, you can only substract date fields and display the result as days, hours, minutes or seconds.
2017
- </div>
2018
- </div>
2019
- </div>
2020
- <div class="form-group row">
2021
- <label class="col-sm-2 control-label">Field Label</label>
2022
- <div class="col-sm-10">
2023
- <input type="text" class="form-control form-control-sm" data-bind="value: formulaFieldLabel" required placeholder="Custom Field Label" />
2024
- </div>
2025
- </div>
2026
- <div class="form-group row">
2027
- <label class="col-sm-2 control-label">Data Format</label>
2028
- <div class="col-sm-10">
2029
- <select class="form-select form-select-sm" data-bind="value: formulaDataFormat" required>
2030
- <!-- ko ifnot: formulaOnlyHasDateFields -->
2031
- <option>String</option>
2032
- <option>Integer</option>
2033
- <option>Decimal</option>
2034
- <option>Currency</option>
2035
- <!-- /ko -->
2036
- <!-- ko if: formulaOnlyHasDateFields -->
2037
- <option>Days</option>
2038
- <option>Hours</option>
2039
- <option>Minutes</option>
2040
- <option>Seconds</option>
2041
- <!-- /ko -->
2042
- </select>
2043
- </div>
2044
- </div>
2045
- <div class="form-group row" data-bind="visible: formulaDataFormat() == 'Decimal' || formulaDataFormat() == 'Currency'">
2046
- <label class="col-sm-2 control-label">Round to Decimal Places</label>
2047
- <div class="col-sm-10">
2048
- <input type="number" class="form-control" data-bind="value: formulaDecimalPlaces" placeholder="Choose Decimal places (leave blank to not use rounding)" title="Choose Decimal places (leave blank to not use rounding)" />
2049
- </div>
2050
- </div>
2051
- <div class="form-group row" data-bind="visible: appSettings.useSqlCustomField">
2052
- <label class="col-sm-2 control-label">Field Builder Type</label>
2053
- <div class="col-sm-10">
2054
- <select class="form-select form-select-sm" data-bind="value: formulaType" required>
2055
- <option value="build">Simple Calculation</option>
2056
- <option value="sql">Advanced Expression</option>
2057
- </select>
2058
- </div>
2059
- </div>
2060
-
2061
- <div class="form-group row" data-bind="if: formulaType()=='build'">
2062
- <label class="col-sm-2 control-label">Field Formula</label>
2063
- <div class="col-sm-10">
2064
- <div class="text-muted small" data-bind="visible: formulaFields().length == 0">Pick fields to build calculation</div>
2065
- <div class="d-flex align-items-center flex-wrap" data-bind="foreach: formulaFields">
2066
- <h3 class="me-3" data-bind="visible: setupFormula.isParenthesesStart" style="margin-top: 0;">(</h3>
2067
- <div data-bind="if: !setupFormula.isParenthesesStart() && !setupFormula.isParenthesesEnd()" class="list-group me-3">
2068
- <div class="list-group-item d-flex align-items-center formula-field-item" style="margin-left: 15px; padding: 5px 15px">
2069
- <span data-bind="text: fieldName, visible: !setupFormula.isConstantValue()"></span>
2070
- <div data-bind="if: setupFormula.isConstantValue" class="d-flex align-items-center">
2071
- <input data-bind="value: setupFormula.constantValue, visible: setupFormula.constantValue()!='|Today|'" class="form-control form-control-sm me-2" required />
2072
- <span data-bind="visible: setupFormula.constantValue() == '|Today|'"><b>Today</b></span>
2073
- </div>
2074
- <button class="btn btn-danger btn-sm ms-2" data-bind="click: $parent.removeField">
2075
- <i class="fa fa-trash"></i>
2076
- </button>
2077
- </div>
2078
- </div>
2079
- <h3 class="me-3" data-bind="visible: setupFormula.isParenthesesEnd" style="margin-top: 0;">)</h3>
2080
- <div class="me-3" style="margin-left: 15px;" data-bind="visible: $parent.showFormulaOperation($index())">
2081
- <select class="form-control form-control-sm" style="max-width: 50px;" data-bind="value: setupFormula.formulaOperation">
2082
- <!-- ko if: !$parent.formulaOnlyHasDateFields() || ($parent.formulaOnlyHasDateFields() && $parent.isConstantOperation($index())) -->
2083
- <option>+</option>
2084
- <!-- /ko -->
2085
- <option>-</option>
2086
- <!-- ko if: ['Integer','Money','Float','Double','Decimal','Currency'].indexOf($parent.formulaDataFormat()) != -1 -->
2087
- <option>*</option>
2088
- <option>/</option>
2089
- <!-- /ko -->
2090
- </select>
2091
- </div>
2092
- </div>
2093
-
2094
- </div>
2095
- </div>
2096
-
2097
- <div data-bind="with: customSqlField, visible: formulaType()=='sql'">
2098
- <div class="row">
2099
- <div class="col-md-12">
2100
-
2101
- <div class="mb-3">
2102
- <label class="form-label">Select Data Operation:</label>
2103
- <select class="form-select" data-bind="select2: {
2104
- dropdownParent: $root.activeDesign() ? $('#choose-data-design') : $('#choose-data-card'),
2105
- placeholder: 'Select Function...',
2106
- data: availableFunctionsGrouped(),
2107
- templateResult: templateResult
2108
- }, value: selectedSqlFunction"></select>
2109
- </div>
2110
-
2111
- <div class="mb-3" data-bind="hidden: isConditionalFunction() || selectedSqlFunction() == 'Other'">
2112
- <label class="form-label">Select the Data Field to use:</label>
2113
- <select class="form-select"
2114
- data-bind="select2: {
2115
- dropdownParent: $root.activeDesign() ? $('#choose-data-design') : $('#choose-data-card'),
2116
- placeholder: 'Search Field...',
2117
- ajax: {
2118
- url: $parent.textQuery.searchFields.url,
2119
- dataType: 'json',
2120
- data: $parent.textQuery.searchFields.query,
2121
- processResults: $parent.textQuery.searchFields.processResults,
2122
- headers: $parent.textQuery.searchFields.headers
2123
- },
2124
- minimumInputLength: 2,
2125
- allowClear: true
2126
- }, select2Text: selectedField,select2TableId:selectedFieldTableId"></select>
2127
- <div data-bind="with: selectedField" class="small">
2128
- Selected: <span class="highlight" data-bind="text: $data"></span>
2129
- </div>
2130
- </div>
2131
-
2132
- <div class="mb-3" data-bind="if: requiresValue">
2133
- <label for="inputValue" class="form-label">Provide the relevant value to use:</label>
2134
- <input type="text" id="inputValue" class="form-control" data-bind="value: inputValue" required />
2135
- </div>
2136
-
2137
- <div class="mb-3" data-bind="visible: selectedSqlFunction() == 'Other'">
2138
- <label for="custom-sql" class="form-label">Custom SQL Expression:</label>
2139
- <p class="text-muted">
2140
- Build your custom SQL Expression below by selecting data fields, adding calculations or using SQL keywords as needed. For string values, remember to enclose them in single quotes ('')
2141
- </p>
2142
- <p id="custom-sql" class="hint-input" contenteditable="true" placeholder="Write your custom SQL"></p>
2143
- </div>
2144
- <div data-bind="visible: isConditionalFunction">
2145
- <p class="text-muted">
2146
- Build your conditional logic below by selecting data fields, adding calculations and defining conditions as needed, and provide corresponding results. For string values, remember to enclose them in single quotes ('')
2147
- </p>
2148
- <div class="input-group mb-3">
2149
- <div class="flex-grow-1">
2150
- <p class="hint-input" id="condition-field" contenteditable="true" placeholder="Field to compare" title="Field to compare"></p>
2151
- </div>
2152
-
2153
- <div class="mx-2" style="width: 120px;">
2154
- <select class="form-select form-select-sm" data-bind="options: availableOperators, value: selectedOperator"></select>
2155
- </div>
2156
-
2157
- <div class="flex-grow-1">
2158
- <p class="hint-input" id="condition-value" contenteditable="true" placeholder="Value to compare" title="Value to compare"></p>
2159
- </div>
2160
-
2161
- <span class="input-group-text" style="max-height: 32px;">THEN</span>
2162
-
2163
- <div class="flex-grow-1">
2164
- <p class="hint-input" id="condition-result" contenteditable="true" placeholder="Condition Result" title="Condition Result"></p>
2165
- </div>
2166
- </div>
2167
-
2168
- <button class="btn btn-outline-primary" data-bind="click: addCondition">Add Condition</button>
2169
- <ul class="list-group mt-3" data-bind="foreach: conditions">
2170
- <li class="list-group-item d-flex justify-content-between align-items-center">
2171
- <span data-bind="text: conditionDisplay"></span>
2172
- <button class="btn btn-sm btn-danger" data-bind="click: $parent.removeCondition">Remove</button>
2173
- </li>
2174
- </ul>
2175
-
2176
- <div class="input-group mb-3" style="padding-top: 5px;">
2177
- <span class="input-group-text" style="max-height: 32px;">ELSE</span>
2178
- <div class="flex-grow-1">
2179
- <p class="hint-input" id="condition-else" contenteditable="true" placeholder="Default Result" title="Default Result"></p>
2180
- </div>
2181
- </div>
2182
- </div>
2183
-
2184
- </div>
2185
- </div>
2186
- </div>
2187
-
2188
- <div class="col-md-12">
2189
- <hr />
2190
- <a href="#" class="btn btn-primary btn-sm" title="Save Custom Formula Field" data-bind="click: saveFormulaField, visible: isFormulaField">Save</a>
2191
- <a href="#" class="btn btn-sm" title="Custom Field using Formula" data-bind="click: cancelFormulaField, text: isFormulaField()? 'Cancel': 'Customize', css: {'btn-primary': !isFormulaField(), 'btn-danger': isFormulaField}"></a>
2192
- </div>
2193
- </div>
2194
- </script>
2195
-
2196
- <script type="text/html" id="report-designer-compact">
2197
- <div class="designer-container compact-designer" id="choose-data-design" style="font-size:12px;">
2198
-
2199
- <!-- Visualization Toolbar -->
2200
- <div class="card p-1 mb-2">
2201
- <div class="card-header p-1 d-flex justify-content-between align-items-center">
2202
- <span><i class="fa fa-file"></i> Visualization</span>
2203
- <button type="button" class="btn btn-sm btn-light" data-bind="visible: ReportID(), click: function() {activeDesign(false);}" title="Close">
2204
- <i class="fa fa-times"></i> Close Designer
2205
- </button>
2206
- </div>
2207
- <div class="card-body p-1">
2208
- <div data-bind="template: 'designer-choose-visual'"></div>
2209
- </div>
2210
- </div>
2211
-
2212
- <!-- Main Grid -->
2213
- <div class="d-flex flex-row flex-wrap gap-2 compact-filters needs-validation">
2214
-
2215
- <!-- Data -->
2216
- <div class="card flex-fill expandable-panel" id="dataPanel" style="max-width: 300px"
2217
- data-bind="css:{'collapsed-vertical': panels.isCollapsed('dataPanel')}">
2218
- <div class="card-header p-1" data-bind="click:function(){panels.togglePanel('dataPanel')}">
2219
- <i class="fa fa-database"></i> Data
2220
- </div>
2221
-
2222
- <div class="card-body p-1">
2223
- <div data-bind="template: 'designer-choose-data'"></div>
2224
- </div>
2225
- </div>
2226
-
2227
- <!-- Selected -->
2228
- <div class="card flex-fill expandable-panel" id="selectedPanel" style="max-width: 400px"
2229
- data-bind="css:{'collapsed-vertical': panels.isCollapsed('selectedPanel')}">
2230
- <div class="card-header p-1" data-bind="click:function(){panels.togglePanel('selectedPanel')}">
2231
- <i class="fa fa-table"></i> Selected data for the Report
2232
- <a href="#" class="small text-muted float-end"
2233
- data-bind="visible: SelectedFields().length, click:function(){SelectedFields([]);}">Clear all</a>
2234
- </div>
2235
-
2236
- <div class="card-body designer-auto-update p-1">
2237
- <div style="max-height: 300px; overflow-y: auto;">
2238
- <div data-bind="template: 'designer-selected-data'"></div>
2239
- </div>
2240
- </div>
2241
- </div>
2242
-
2243
- <div class="card flex-fill expandable-panel" id="subReportsPanel"
2244
- data-bind="css:{'collapsed-vertical': panels.isCollapsed('subReportsPanel')}, visible: linkedReportFields().length > 0">
2245
- <div class="card-header p-1" data-bind="click:function(){panels.togglePanel('subReportsPanel')}">
2246
- <i class="fa fa-bookmark"></i> Sub Reports
2247
- </div>
2248
- <div class="card-body p-1">
2249
- <div data-bind="template: 'designer-sub-report', data: $data"></div>
2250
- </div>
2251
- </div>
2252
-
2253
- <div class="card flex-fill expandable-panel" id="htmlReportPanel"
2254
- data-bind="css:{'collapsed-vertical': panels.isCollapsed('htmlReportPanel')}, visible: ReportType()=='Html'">
2255
- <div class="card-header p-1" data-bind="click:function(){panels.togglePanel('htmlReportPanel')}">
2256
- <i class="fa fa-pencil"></i> Custom Design
2257
- </div>
2258
- <div class="card-body p-1">
2259
- <div data-bind="template: 'designer-html', data: $data"></div>
2260
- </div>
2261
- </div>
2262
-
2263
- <!-- Custom Field -->
2264
- <div class="card flex-fill expandable-panel" id="customFieldPanel" data-bind="visible: isFormulaField">
2265
- <div class="card-header p-1">
2266
- <i class="fa fa-magic"></i> Custom Field
2267
- </div>
2268
- <div class="card-body p-1 custom-field-design" style="max-height: 400px; overflow-y: auto; overflow-x: hidden;">
2269
- <div data-bind="template: 'custom-field-designer', data: $data"></div>
2270
- </div>
2271
- </div>
2272
- <!-- Field Options Panel -->
2273
- <div id="fieldOptionsPanel" class="card p-2 mt-2 collapse">
2274
- <!-- dynamic field settings load here -->
2275
- </div>
2276
- <!-- Filters -->
2277
- <div class="card flex-fill expandable-panel" id="filtersPanel"
2278
- data-bind="css:{'collapsed-vertical': panels.isCollapsed('filtersPanel')}, hidden: isFormulaField">
2279
- <div class="card-header p-1" data-bind="click:function(){panels.togglePanel('filtersPanel')}">
2280
- <i class="fa fa-filter"></i> Filters
2281
- </div>
2282
- <div class="card-body p-1 designer-auto-update" style="max-height:300px; overflow-y:auto;">
2283
- <div data-bind="if:useStoredProc"><div data-bind="template:{name:'filter-parameters'}"></div></div>
2284
- <div data-bind="ifnot:useStoredProc"><div data-bind="template:{name:'filter-group'}"></div></div>
2285
- </div>
2286
- </div>
2287
-
2288
- <!-- Sort -->
2289
- <div class="card flex-fill expandable-panel" id="sortPanel"
2290
- data-bind="css:{'collapsed-vertical': panels.isCollapsed('sortPanel')}, hidden: useStoredProc() || isFormulaField()">
2291
- <div class="card-header p-1" data-bind="click:function(){panels.togglePanel('sortPanel')}">
2292
- <i class="fa fa-sort"></i> Sort
2293
- </div>
2294
- <div class="card-body p-1 designer-auto-update row">
2295
- <div data-bind="template: 'designer-sort'"></div>
2296
- </div>
2297
- </div>
2298
-
2299
- <!-- Settings -->
2300
- <div class="card flex-fill expandable-panel" id="settingsPanel"
2301
- data-bind="css:{'collapsed-vertical': panels.isCollapsed('settingsPanel')}, hidden: isFormulaField">
2302
- <div class="card-header p-1" data-bind="click:function(){panels.togglePanel('settingsPanel')}">
2303
- <i class="fa fa-gear"></i>Options
2304
- </div>
2305
- <div class="card-body">
2306
- <div class="form-group row">
2307
- <label class="col-form-label h6">
2308
- <i class="fa fa-file"></i> Report Name
2309
- </label>
2310
- <div>
2311
- <input type="text" class="form-control" required placeholder="Report Name" data-bind="value: ReportName">
2312
- </div>
2313
- </div>
2314
- <div class="form-group row">
2315
- <label class="control-label h6">
2316
- <i class="fa fa-info-circle"></i> Report Description
2317
- </label>
2318
- <div>
2319
- <textarea class="form-control" style="width: 100%;" rows="3" placeholder="Additional details (optional)" data-bind="value: ReportDescription"></textarea>
2320
- </div>
2321
- </div>
2322
- <div class="checkbox" data-bind="visible: CanSaveReports()">
2323
- <label>
2324
- <input type="checkbox" data-bind="checked: SaveReport">
2325
- Save Report
2326
- </label>
2327
- </div>
2328
- <div class="form-group row" data-bind="visible: SaveReport">
2329
- <label class="control-label h6">
2330
- <i class="fa fa-folder-open"></i> Choose Folder
2331
- </label>
2332
- <div>
2333
- <select class="form-select" style="width: 100%;" data-bind="options: Folders, optionsText: 'FolderName', optionsValue: 'Id', value: FolderID"></select>
2334
- </div>
2335
- </div>
2336
- <hr />
2337
- <div data-bind="template: 'designer-options'"></div>
2338
- </div>
2339
- </div>
2340
-
2341
- <!-- Schedule -->
2342
- <div class="card flex-fill expandable-panel" id="schedulePanel"
2343
- data-bind="css:{'collapsed-vertical': panels.isCollapsed('schedulePanel')}">
2344
- <div class="card-header p-1" data-bind="click:function(){panels.togglePanel('schedulePanel')}">
2345
- <i class="fa fa-hourglass"></i> Schedule
2346
- </div>
2347
- <div class="card-body p-1 designer-auto-update row">
2348
- <div data-bind="template: {name: 'report-schedule'}"></div>
2349
- </div>
2350
- </div>
2351
-
2352
- <!-- Access -->
2353
- <div class="card flex-fill expandable-panel" id="accessPanel"
2354
- data-bind="css:{'collapsed-vertical': panels.isCollapsed('accessPanel')}, visible: adminMode() && !isFormulaField()">
2355
- <div class="card-header p-1" data-bind="click:function(){panels.togglePanel('accessPanel')}">
2356
- <i class="fa fa-key"></i>Security
2357
- </div>
2358
-
2359
- <div data-bind="" class="card card-body">
2360
- <div data-bind="template: {name: 'manage-access-template', data: manageAccess}"></div>
2361
- </div>
2362
- </div>
2363
-
2364
- </div>
2365
- </div>
2366
- <hr />
2367
- </script>
2368
-
2369
- <script type="text/html" id="report-designer">
2370
- <div class="modal-dialog modal-dialog-scrollable" style="height: 100vh;" id="report-designer-modal">
2371
- <div class="modal-content" style="display: flex; flex-direction: column; height: 100%;">
2372
- <div class="modal-header">
2373
- <h5 class="modal-title" id="myModalLabel">
2374
- <a title="Need help setting up a report?" target="_blank" href="https://dotnetreport.com/blogs/docs/designing-reports"><span class="fa fa-question-circle"></span></a> Design your Report
2375
- </h5>
2376
- <button type="button" class="btn-close" data-bs-dismiss="modal" data-bind="click: onModalCloseClicked" aria-label="Close"></button>
2377
- </div>
2378
- <div class="modal-body needs-validation" style="overflow-y: auto; flex-grow: 1;">
2379
- <div class="row">
2380
- <div class="col-md-4">
2381
- <div class="card card-body" id="choose-data-card" style="min-height: calc(100vh - 200px);">
2382
- <div class="form-group row align-items-center">
2383
- <label class="col-sm-4 col-form-label h6">
2384
- <i class="fa fa-file"></i> Report Name
2385
- </label>
2386
- <div class="col-sm-8">
2387
- <input type="text" class="form-control" required placeholder="Report Name" data-bind="value: ReportName">
2388
- </div>
2389
- </div>
2390
- <hr />
2391
- <h5><span class="fa fa-database"></span>&nbsp;Choose Data for Report</h5>
2392
- <div data-bind="template: 'designer-choose-data'"></div>
2393
- </div>
2394
- <br />
2395
-
2396
- <div class="card card-body">
2397
-
2398
- <div class="form-group row">
2399
- <label class="control-label h6">
2400
- <i class="fa fa-info-circle"></i> Report Description
2401
- </label>
2402
- <div>
2403
- <textarea class="form-control" style="width: 100%;" rows="3" placeholder="Additional details (optional)" data-bind="value: ReportDescription"></textarea>
2404
- </div>
2405
- </div>
2406
- <div class="checkbox" data-bind="visible: CanSaveReports()">
2407
- <label>
2408
- <input type="checkbox" data-bind="checked: SaveReport">
2409
- Save Report
2410
- </label>
2411
- </div>
2412
- <div class="form-group row" data-bind="visible: SaveReport">
2413
- <label class="control-label h6">
2414
- <i class="fa fa-folder-open"></i> Choose Folder
2415
- </label>
2416
- <div>
2417
- <select class="form-select" style="width: 100%;" data-bind="options: Folders, optionsText: 'FolderName', optionsValue: 'Id', value: FolderID"></select>
2418
- </div>
2419
- </div>
2420
- </div>
2421
- </div>
2422
- <div class="col-md-8">
2423
- <div class="card card-body">
2424
- <h5><span class="fa fa-file"></span>&nbsp;Choose Visualization</h5>
2425
- <div style="overflow-x: auto; white-space: nowrap;">
2426
- <div data-bind="template: 'designer-choose-visual'"></div>
2427
- </div>
2428
- </div>
2429
- <div>
2430
- <div data-bind="if: isFunctionField" class="custom-field-design">
2431
- <br />
2432
- <br />
2433
- <div class="card">
2434
- <div class="card-body">
2435
- <div class="row">
2436
- <div class="col-md-12 pull-right">
2437
- <a href="#" class="btn btn-primary btn-sm" title="Save Custom Function Field" data-bind="click: saveFunctionField, visible: isFunctionField">Save</a>
2438
- <a href="#" class="btn btn-sm" title="Custom Field using Function" data-bind="click: function(){isFunctionField(!isFunctionField())}, text: isFunctionField()? 'Cancel': 'Function', css: {'btn-primary': !isFunctionField(), 'btn-danger': isFunctionField}"></a>
2439
- </div>
2440
- <div class="col-md-12 padded-div" data-bind="visible: isFunctionField()">
2441
- <div class="alert alert-info">
2442
- You are now creating a Customized Field using Functions available.
2443
- </div>
2444
- </div>
2445
- </div>
2446
-
2447
- <div class="form-group row">
2448
- <label class="col-sm-2 control-label">Field Label</label>
2449
- <div class="col-sm-10">
2450
- <input type="text" class="form-control form-control-sm" data-bind="value: formulaFieldLabel" required placeholder="Custom Field Label" />
2451
- </div>
2452
- </div>
2453
- <div class="form-group row">
2454
- <label class="col-sm-2 control-label">Data Format</label>
2455
- <div class="col-sm-10">
2456
- <select class="form-select form-control-sm" data-bind="value: formulaDataFormat" required>
2457
- <option>String</option>
2458
- <option>Integer</option>
2459
- <option>Decimal</option>
2460
- <option>Currency</option>
2461
- <option>Date</option>
2462
- <option value="DateTime">Date and Time</option>
2463
- </select>
2464
- </div>
2465
- </div>
2466
- <div class="form-group row" data-bind="visible: formulaDataFormat() == 'Decimal' || formulaDataFormat() == 'Currency'">
2467
- <label class="col-sm-2 control-label">Round to Decimal Places</label>
2468
- <div class="col-sm-10">
2469
- <input type="number" class="form-control" data-bind="value: formulaDecimalPlaces" placeholder="Choose Decimal places (leave blank to not use rounding)" title="Choose Decimal places (leave blank to not use rounding)" />
2470
- </div>
2471
- </div>
2472
-
2473
- <div>
2474
- Define your Function:
2475
- <textarea id="function-code"></textarea>
2476
- </div>
2477
- </div>
2478
- </div>
2479
- <div class="clearfix"></div>
2480
- </div>
2481
-
2482
- <div data-bind="if: lastPickedField() && lastPickedField().fieldType == 'Json'">
2483
- <br />
2484
- <div class="card">
2485
- <div class="card-header">
2486
- <h6>Select Data Fields from <span data-bind="text: lastPickedField().fieldName"></span></h6>
2487
- </div>
2488
- <div class="card-body">
2489
- <div class="row container-fluid" data-bind="foreach: jsonFields">
2490
- <div class="col-md-3 col-sm-4 col-xs-6 list-group">
2491
- <div class="list-group-item">
2492
- <div class="checkbox">
2493
- <label>
2494
- <input type="checkbox" data-bind="checkedInArray: {array: $parent.SelectedFields, value: $data}">
2495
- <span data-bind="text: jsonColumnName"></span>
2496
- </label>
2497
- </div>
2498
- </div>
2499
- </div>
2500
- </div>
2501
- </div>
2502
- </div>
2503
- </div>
2504
-
2505
- <div id="customFieldSection" data-bind="if: isFormulaField" class="custom-field-design">
2506
- <br />
2507
- <br />
2508
- <div class="card">
2509
- <div class="card-header">
2510
- <b>Build Custom Field</b>
2511
- </div>
2512
- <div class="card-body" data-bind="template: 'custom-field-designer'">
2513
-
2514
- </div>
2515
- </div>
2516
- <div class="clearfix"></div>
2517
- </div>
2518
- </div>
2519
- <br />
2520
- <div class="card card-body">
2521
- <div class="row">
2522
- <h5 class="col-8 pull-left"><span class="fa fa-table"></span>&nbsp;Selected data for the Report</h5>
2523
- <div class="col-4 pull-right right-align">
2524
- <a href="#" class="small text-muted" data-bind="visible: SelectedFields().length, click: function() {SelectedFields([]);}">Clear all</a>
2525
- </div>
2526
- </div>
2527
-
2528
- <div data-bind="template: 'designer-selected-data'"></div>
2529
- </div>
2530
- <div data-bind="if: linkedReportFields().length > 0">
2531
- <br />
2532
- <div class="card mb-4">
2533
- <div class="card-header bg-light">
2534
- <h5 class="mb-0">
2535
- <i class="fa fa-bookmark"></i> Include Sub Reports
2536
- </h5>
2537
- </div>
2538
- <div class="card-body">
2539
- <div data-bind="template: 'designer-sub-report'"></div>
2540
- </div>
2541
- </div>
2542
- </div>
2543
- <div data-bind="visible: ReportType()=='Html'">
2544
- <br />
2545
- <div class="card mb-4">
2546
- <div class="card-header bg-light">
2547
- <h5 class="mb-0">
2548
- <i class="fa fa-pencil"></i> Design your Report
2549
- </h5>
2550
- </div>
2551
- <div class="card-body">
2552
- <div data-bind="template: 'designer-html'"></div>
2553
- </div>
2554
- </div>
2555
- </div>
2556
- <br />
2557
- <div class="card card-body">
2558
- <h5><span class="fa fa-filter"></span>&nbsp;Choose Filters</h5>
2559
-
2560
- <div class="row" style="padding: 10px 10px; overflow-x: auto;">
2561
- <div data-bind="if: useStoredProc" class="col-md-12">
2562
- <div data-bind="template: {name: 'filter-parameters'}"></div>
2563
- </div>
2564
- <div data-bind="ifnot: useStoredProc" class="col-md-12">
2565
- <div data-bind="template: {name: 'filter-group'}"></div>
2566
- </div>
2567
-
2568
- <div class="checkbox col-12">
2569
- <label>
2570
- <input type="checkbox" data-bind="checked: EditFiltersOnReport" />
2571
- Allow setting up and saving filters on Report
2572
- </label>
2573
- </div>
2574
- <br />
2575
- </div>
2576
- </div>
2577
- <br />
2578
- <div data-bind="hidden: useStoredProc" class="card card-body">
2579
- <h5><span class="fa fa-sort"></span>&nbsp;Choose Sorting</h5>
2580
- <div data-bind="template: 'designer-sort'"></div>
2581
- </div>
2582
- <br />
2583
- <div data-bind="visible: SaveReport" class="card card-body">
2584
- <h5><span class="fa fa-hourglass"></span>&nbsp;Choose Schedule</h5>
2585
-
2586
- <div style="padding: 10px 10px" data-bind="if: SaveReport">
2587
- <div data-bind="template: {name: 'report-schedule'}"></div>
2588
- </div>
2589
- </div>
2590
- <br />
2591
- <div data-bind="ifnot: useStoredProc">
2592
- <div class="card card-body">
2593
- <div data-bind="template: 'designer-options'"></div>
2594
- </div>
2595
- </div>
2596
- <br />
2597
- <div data-bind="visible: adminMode" class="card card-body">
2598
- <div data-bind="template: {name: 'manage-access-template', data: manageAccess}"></div>
2599
- </div>
2600
-
2601
- </div>
2602
- </div>
2603
- </div>
2604
- <div class="modal-footer">
2605
- <button class="btn btn-primary" data-bind="visible: adminMode, click: RunReportSqlPreview">
2606
- <i class="fa fa-code"></i> Preview Report Code
2607
- </button>
2608
- <a href="#" class="btn btn-danger" data-bind="click: cancelCreateReport">Cancel editing Report</a>
2609
- <button class="btn btn-primary" type="button" data-bind="visible: SaveReport() && CanSaveReports(), click: SaveWithoutRun" style="padding-right: 10px;">Save Report</button>
2610
- <button class="btn btn-primary" type="button" data-bind="text: SaveReport() && CanSaveReports()? 'Save & Run Report': 'Run Report', click: RunReport">Run Report</button>
2611
- </div>
2612
-
2613
- </div>
2614
- </div>
2615
- </script>
2616
-
2617
- <script type="text/html" id="chart-settings">
2618
- <div class="chart-container pull-right">
2619
- <button class="btn btn-light btn-sm d-flex align-items-center mt-2 chart-settings-btn"
2620
- data-bind="click: toggleChartSettings" title="Report settings">
2621
- <i class="fa fa-cog"></i>
2622
- </button>
2623
-
2624
- <div class="chart-settings-panel border p-2 shadow-sm bg-light" data-bind="visible: showSettings">
2625
- <div class="d-flex justify-content-between align-items-center mb-2">
2626
- <button class="btn btn-sm btn-close" data-bind="click: toggleChartSettings"></button>
2627
- <h6 class="mb-0">Report Settings</h6>
2628
- </div>
2629
- <ul class="nav nav-tabs nav-sm mb-2 small" data-bind="visible: ReportType() === 'Bar' || ReportType() === 'Pie' || ReportType() === 'Line'">
2630
- <li class="nav-item">
2631
- <a class="nav-link"
2632
- data-bs-toggle="tab"
2633
- data-bind="attr: { href: '#chartTab-' + ReportID() }, css: { active: ReportType() === 'Bar' || ReportType() === 'Pie' || ReportType() === 'Line' }">
2634
- Chart
2635
- </a>
2636
- </li>
2637
- <li class="nav-item">
2638
- <a class="nav-link"
2639
- data-bs-toggle="tab"
2640
- data-bind="attr: { href: '#tableTab-' + ReportID() }, css: { active: !(ReportType() === 'Bar' || ReportType() === 'Pie' || ReportType() === 'Line') }">
2641
- Table
2642
- </a>
2643
- </li>
2644
- </ul>
2645
- <div class="tab-content small">
2646
- <div class="tab-pane fade"
2647
- data-bind="attr: { id: 'chartTab-' + ReportID() }, css: { 'show active': ReportType() === 'Bar' || ReportType() === 'Pie' || ReportType() === 'Line' }">
2648
- <div class="mb-2">
2649
- <div class="btn-group" role="group" data-bind="visible: ReportType() === 'Bar' || ReportType() === 'Pie' || ReportType() === 'Line'">
2650
- <button type="button" class="btn btn-light" data-bs-toggle="tooltip" title="Bar Chart"
2651
- data-bind="css: { 'active': ReportType() === 'Bar' }, click: function() { ReportType('Bar'); }">
2652
- <span class="fa fa-bar-chart"></span>
2653
- </button>
2654
- <button type="button" class="btn btn-light" data-bs-toggle="tooltip" title="Pie Chart"
2655
- data-bind="css: { 'active': ReportType() === 'Pie' }, click: function() { ReportType('Pie'); }">
2656
- <span class="fa fa-pie-chart"></span>
2657
- </button>
2658
- <button type="button" class="btn btn-light" data-bs-toggle="tooltip" title="Line Chart"
2659
- data-bind="css: { 'active': ReportType() === 'Line' }, click: function() { ReportType('Line'); }">
2660
- <span class="fa fa-line-chart"></span>
2661
- </button>
2662
- </div>
2663
- </div>
2664
- <div data-bind="visible: ReportType()=='Bar'">
2665
- <div class="form-group row">
2666
- <div class="checkbox col-6">
2667
- <label><input type="checkbox" data-bind="checked: barChartHorizontal" /> Horizontal</label>
2668
- </div>
2669
- <div class="checkbox col-6">
2670
- <label><input type="checkbox" data-bind="checked: barChartStacked" /> Stacked</label>
2671
- </div>
2672
- </div>
2673
- </div>
2674
- <div data-bind="visible: ReportType()=='Pie'">
2675
- <div class="form-group row">
2676
- <div class="checkbox col-6">
2677
- <label><input type="checkbox" data-bind="checked: pieChartDonut" /> Donut</label>
2678
- </div>
2679
- </div>
2680
- </div>
2681
- <div data-bind="visible: ReportType()=='Line'">
2682
- <div class="form-group row">
2683
- <div class="checkbox col-6">
2684
- <label><input type="checkbox" data-bind="checked: lineChartArea" /> Area</label>
2685
- </div>
2686
- </div>
2687
- </div>
2688
- <div class="mb-2">
2689
- <label class="form-label small">Background Color</label>
2690
- <div class="d-flex align-items-center flex-wrap">
2691
- <input type="color" class="color-picker" data-bind="value: chartOptions().backgroundColor, attr: { placeholder: 'Select' }, event: { change: updateChart }">
2692
- </div>
2693
- </div>
2694
- <div class="mb-2">
2695
- <label class="form-label small">Font Color</label>
2696
- <div class="d-flex align-items-center flex-wrap">
2697
- <input type="color" class="color-picker" data-bind="value: chartOptions().fontColor, attr: { placeholder: 'Select' }, event: { change: updateChart }">
2698
- </div>
2699
- </div>
2700
- <div class="mb-2">
2701
- <label class="form-label small">Series Colors</label>
2702
- <div class="d-flex flex-wrap" data-bind="foreach: chartOptions().seriesColors">
2703
- <div class="color-box me-2">
2704
- <input type="color" class="color-picker"
2705
- data-bind="value: $data, event: { input: function(data, event) { $parent.updateSeriesColor($index(), event.target.value); } }">
2706
- <button class="btn btn-sm btn-danger remove-color" data-bind="click: $parent.removeSeriesColor">&times;</button>
2707
- </div>
2708
- </div>
2709
- <button class="color-box btn btn-sm btn-secondary" data-bind="click: addSeriesColor" title="Add Series Color" style="margin-top: -7px;">
2710
- <i class="fa fa-plus"></i>
2711
- </button>
2712
- </div>
2713
- <div class="d-flex justify-content-between mb-1">
2714
- <div>
2715
- <label class="form-label small">Legend Position</label>
2716
- <select class="form-select form-select-sm" data-bind="value: chartOptions().legendPosition, event: { change: updateChart }">
2717
- <option value="right">Right</option>
2718
- <option value="top">Top</option>
2719
- <option value="bottom">Bottom</option>
2720
- <option value="none">None</option>
2721
- </select>
2722
- </div>
2723
- <div>
2724
- <label class="form-label small">Font Size</label>
2725
- <input type="number" class="form-control form-control-sm font-size-input" data-bind="value: chartOptions().fontSize, event: { change: updateChart }">
2726
- </div>
2727
- </div>
2728
- <div data-bind="visible: ReportType()!='Pie'">
2729
- <div class="form-check form-switch small mb-1">
2730
- <input class="form-check-input" type="checkbox" data-bind="checked: chartOptions().showXAxisLabel, event: { change: updateChart }">
2731
- <label class="form-check-label">X-Axis Label</label>
2732
- </div>
2733
- <div class="form-check form-switch small mb-1">
2734
- <input class="form-check-input" type="checkbox" data-bind="checked: chartOptions().showYAxisLabel, event: { change: updateChart }">
2735
- <label class="form-check-label">Y-Axis Label</label>
2736
- </div>
2737
- <div class="form-check form-switch small mb-1" data-bind="visible: ReportType() !== 'Pie'">
2738
- <input class="form-check-input" type="checkbox" data-bind="checked: chartOptions().showGridlines, event: { change: updateChart }">
2739
- <label class="form-check-label">Gridlines</label>
2740
- </div>
2741
- <div class="form-check form-switch small mb-1">
2742
- <input class="form-check-input" type="checkbox" data-bind="checked: chartOptions().showSmallValuesOnLabel, event: { change: updateChart }">
2743
- <label class="form-check-label">Show Small Values On Label</label>
2744
- </div>
2745
- <div class="form-group small mb-1">
2746
- <label class="form-label">Y-Axis Format</label>
2747
- <input type="text" class="form-control form-control-sm" placeholder="#,##0.00" data-bind="value: chartOptions().yAxisFormat, event: { change: updateChart }" />
2748
- </div>
2749
- <div class="form-group small mb-1 d-flex gap-2">
2750
- <div class="w-50">
2751
- <label class="form-label">Y-Axis Min</label>
2752
- <input type="number" class="form-control form-control-sm" data-bind="value: chartOptions().yMin, event: { change: updateChart }" />
2753
- </div>
2754
- <div class="w-50">
2755
- <label class="form-label">Y-Axis Max</label>
2756
- <input type="number" class="form-control form-control-sm" data-bind="value: chartOptions().yMax, event: { change: updateChart }" />
2757
- </div>
2758
- </div>
2759
- </div>
2760
- </div>
2761
-
2762
- <div class="tab-pane fade"
2763
- data-bind="attr: { id: 'tableTab-' + ReportID() }, css: { 'show active': !(ReportType() === 'Bar' || ReportType() === 'Pie' || ReportType() === 'Line') }">
2764
- <div class="form-group row">
2765
- <div class="mb-2 col-6">
2766
- <label class="form-label small">Header Back Color</label><br />
2767
- <input type="color" class="color-picker"
2768
- data-bind="attr: { id: 'tbl-color-picker-' + ReportID()} , value: tableSettings().headerBackColor, event: { change: updateTable }"/>
2769
- </div>
2770
- <div class="mb-2 col-6">
2771
- <label class="form-label small">Header Font Color</label><br />
2772
- <input type="color" class="color-picker"
2773
- data-bind="attr: { id: 'tbl-color-picker-' + ReportID()} ,value: tableSettings().headerFontColor, event: { change: updateTable }"/>
2774
- </div>
2775
- </div>
2776
- <div class="form-group row">
2777
- <div class="mb-2 col-6">
2778
- <label class="form-label small">Row Back Color</label><br />
2779
- <input type="color" class="color-picker"
2780
- data-bind="attr: { id: 'tbl-color-picker-' + ReportID()} ,value: tableSettings().rowBackColor, event: { change: updateTable }"/>
2781
- </div>
2782
- <div class="mb-2 col-6">
2783
- <label class="form-label small">Row Font Color</label><br />
2784
- <input type="color" class="color-picker"
2785
- data-bind="attr: { id: 'tbl-color-picker-' + ReportID()} ,value: tableSettings().rowFontColor, event: { change: updateTable }"/>
2786
- </div>
2787
- </div>
2788
- <div class="form-group row" style="display: none;">
2789
- <div class="mb-2 col-6">
2790
- <label class="form-label small">Alt Row Back Color</label><br />
2791
- <input type="color" class="color-picker"
2792
- data-bind="value: tableSettings().altRowBackColor, event: { change: updateTable }"/>
2793
- </div>
2794
- <div class="mb-2 col-6">
2795
- <label class="form-label small">Alt Row Font Color</label>
2796
- <input type="color" class="color-picker"
2797
- data-bind="value: tableSettings().altRowFontColor, event: { change: updateTable }"/>
2798
- </div>
2799
- </div>
2800
- <div class="form-group mb-2" style="display: none;">
2801
- <label class="form-label small">Borders</label>
2802
- <div class="btn-group d-flex flex-wrap">
2803
- <button type="button" class="btn btn-light btn-sm flex-fill"
2804
- data-bind="click: function(){ tableSettings().border('none'); updateTable(); }, css: { active: tableSettings().border === 'none' }">None</button>
2805
- <button type="button" class="btn btn-light btn-sm flex-fill"
2806
- data-bind="click: function(){ tableSettings().border('all'); updateTable(); }, css: { active: tableSettings().border === 'all' }">All</button>
2807
- <button type="button" class="btn btn-light btn-sm flex-fill"
2808
- data-bind="click: function(){ tableSettings().border('outer'); updateTable(); }, css: { active: tableSettings().border === 'outer' }">Outside</button>
2809
- <button type="button" class="btn btn-light btn-sm flex-fill"
2810
- data-bind="click: function(){ tableSettings().border('inner'); updateTable(); }, css: { active: tableSettings().border === 'inner' }">Inside</button>
2811
- </div>
2812
- </div>
2813
- <div class="form-group row">
2814
- <div class="mb-2 col-6" style="display: none;">
2815
- <label class="form-label small">Border Color</label>
2816
- <input type="color" class="color-picker"
2817
- data-bind="value: tableSettings().borderColor, event: { change: updateTable }"/>
2818
- </div>
2819
- <div class="mb-2 col-6 d-flex align-items-end">
2820
- <button class="btn btn-sm small btn-outline-secondary" data-bind="click: clearTableSettings">
2821
- Clear
2822
- </button>
2823
- </div>
2824
- </div>
2825
- </div>
2826
- </div>
2827
- </div>
2828
- </div>
2829
- </script>
2830
-
2831
- <div class="modal" id="drilldownModal" tabindex="-1" role="dialog" aria-hidden="true">
2832
- <div class="modal-dialog modal-lg">
2833
- <div class="modal-content" data-bind="with: ChartDrillDownData">
2834
- <div class="modal-header">
2835
- <h4 class="modal-title">Drilldown Data</h4>
2836
- <button type="button" class="btn-close pull-right" data-bs-dismiss="modal" aria-label="Close"></button>
2837
- </div>
2838
- <!-- ko if: DrillDownData -->
2839
- <div class="modal-body">
2840
- <div style="overflow-x: auto; max-height: 500px; overflow-y: auto;">
2841
- <table class="table table-striped table-hover table-condensed" data-bind="with: DrillDownData, attr: {class: 'table table-striped table-hover table-condensed ' + $parent.selectedStyle()}">
2842
- <thead style="position: sticky; top: -1px; z-index: 2;">
2843
- <tr class="no-highlight">
2844
- <!-- ko foreach: Columns -->
2845
- <th data-bind="attr: { id: fieldId }, css: {'right-align': IsNumeric}, style: {'width': fieldWidth, 'background-color': headerBackColor }, hidden: outerGroup" style="border-right: 1px solid;">
2846
- <span data-bind="text: fieldLabel2() ? fieldLabel2() : (fieldLabel() ? fieldLabel() : fieldName), style: {'color': headerFontColor, 'font-weight': headerFontBold() ? 'bold' : 'normal'}"></span>
2847
- </th>
2848
- <!-- /ko -->
2849
- </tr>
2850
- </thead>
2851
- <tbody>
2852
- <tr style="display: none;" data-bind="visible: Rows && Rows.length < 1">
2853
- <td data-bind="attr:{colspan: Columns.length}">
2854
- No records found
2855
- </td>
2856
- </tr>
2857
- <!-- ko foreach: Rows -->
2858
- <tr>
2859
- <!-- ko foreach: Items -->
2860
- <td data-bind="hidden: outerGroup, style: {'background-color': backColor, 'color': fontColor, 'font-weight': fontBold() ? 'bold' : 'normal' }">
2861
- <div data-bind="style: {'width': fieldWidth }">
2862
- <!-- ko if: LinkTo-->
2863
- <a data-bind="attr: {href: LinkTo}" target="_blank"><span data-bind="html: formattedVal"></span></a>
2864
- <!-- /ko-->
2865
- <!-- ko ifnot: LinkTo-->
2866
- <span data-bind="html: formattedVal"></span>
2867
- <!-- /ko-->
2868
- </div>
2869
- </td>
2870
- <!-- /ko-->
2871
- </tr>
2872
- <!-- /ko -->
2873
- </tbody>
2874
- </table>
2875
- </div>
2876
- </div>
2877
- <div class="modal-footer">
2878
- <div class="col-xs-12 col-centered" data-bind="with: pager">
2879
- <div class="form-inline small text-muted">
2880
- <div class="pull-left total-records" data-bind="visible: pages()">
2881
- <span data-bind="text: 'Total Records: ' + totalRecords()"></span>
2882
- </div>
2883
- <div class="pull-left">
2884
- <button class="btn btn-xs" title="Download Excel" data-bind="click: $parent.exportExcel"><span class="fa fa-file-excel-o"></span></button>
2885
- <button class="btn btn-secondary btn-sm" data-bs-toggle="modal" data-bs-target="#sqlDrillDownModal" data-bind="visible: $root.adminMode">
2886
- <span class="fa fa-code"></span> View Code
2887
- </button>
2888
- </div>
2889
- <div class="form-group pull-right" data-bind="visible: pages()">
2890
- <div data-bind="template: 'pager-template', data: $data"></div>
2891
- </div>
2892
- </div>
2893
- </div>
2894
- </div>
2895
- <!-- /ko -->
2896
- </div>
2897
- </div>
2898
- </div>
2899
-
2900
- <div class="modal" id="sqlModal" tabindex="-1" role="dialog" aria-hidden="true">
2901
- <div class="modal-dialog modal-lg">
2902
- <div class="modal-content">
2903
- <div class="modal-header d-flex justify-content-between align-items-center">
2904
- <h4 class="modal-title">Report Code</h4>
2905
- <button class="btn btn-outline-secondary btn-sm d-flex align-items-center"
2906
- data-bind="click: function(data, event) { copySqlToClipboard(event.target); }">
2907
- <i class="fa fa-clipboard"></i>&nbsp;Copy
2908
- </button>
2909
- <button type="button" class="btn-close pull-right" data-bs-dismiss="modal" aria-label="Close"></button>
2910
- </div>
2911
- <div class="modal-body" data-bind="with: ReportResult">
2912
- <div id="reportSqlCode" style="overflow-x: auto; max-height: 500px; overflow-y: scroll; border: 1px solid; padding: 10px;" class="bg-dark text-light">
2913
- <pre><code data-bind="html: ReportSql" style="white-space: pre-wrap;"></code></pre>
2914
- </div>
2915
- </div>
2916
- </div>
2917
- </div>
2918
- </div>
2919
-
2920
- <div class="modal" id="sqlDrillDownModal" tabindex="-1" role="dialog" aria-hidden="true">
2921
- <div class="modal-dialog modal-lg">
2922
- <div class="modal-content" data-bind="with:ChartDrillDownData">
2923
- <div class="modal-header d-flex justify-content-between align-items-center">
2924
- <h4 class="modal-title">Drill Down Report Code</h4>
2925
- <button class="btn btn-outline-secondary btn-sm d-flex align-items-center"
2926
- data-bind="click: function(data, event) { copySqlToClipboard(event.target); }">
2927
- <i class="fa fa-clipboard"></i>&nbsp;Copy
2928
- </button>
2929
- <button type="button" class="btn-close pull-right" data-bs-dismiss="modal" aria-label="Close"></button>
2930
- </div>
2931
- <div class="modal-body" data-bind="with:DrillDownData">
2932
- <div id="reportSqlCode" style="overflow-x: auto; max-height: 500px; overflow-y: scroll; border: 1px solid; padding: 10px;" class="bg-dark text-light">
2933
- <pre><code data-bind="html: ReportSql" style="white-space: pre-wrap;"></code></pre>
2934
- </div>
2935
- </div>
2936
- </div>
2937
- </div>
2938
- </div>
2939
- <div class="modal" id="noaccountModal" tabindex="-1" role="dialog" aria-hidden="true">
2940
- <div class="modal-dialog">
2941
- <div class="modal-content">
2942
- <div class="modal-header">
2943
- <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
2944
- <h4 class="modal-title">Account not Setup</h4>
2945
- </div>
2946
- <div class="modal-body">
2947
- <p class="alert alert-danger">dotnet Report Account Configuration missing!</p>
2948
- <p>You do not have the neccessary initial configuration completed to use dotnet Report.</p>
2949
- <p>Please view the <a href="https://dotnetreport.com/blogs/getting-started-with-dotnet-report/" target="_blank">Getting Started Guide</a> to correctly configure dotnet Report.</p>
2950
- </div>
2951
- <div class="modal-footer">
2952
- <button type="button" class="btn btn-default" data-bs-dismiss="modal">Close</button>
2953
- </div>
2954
- </div>
2955
- </div>
2956
- </div>
2957
- <script type="text/html" id="pdf-options-schedule-template">
2958
- <div class="modal-dialog modal-dialog-centered">
2959
- <div class="modal-content" data-bind="with: PdfPage">
2960
- <div class="modal-header">
2961
- <h5 class="modal-title" id="pdfOptionsScheduleModalLabel">
2962
- <i class="fa fa-file-pdf-o me-2"></i> Set PDF Page Size
2963
- </h5>
2964
- <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
2965
- </div>
2966
- <div class="modal-body row g-0">
2967
- <div class="col-md-5 d-flex justify-content-center align-items-center">
2968
- <div id="pagePreviewBox" class="text-center">
2969
- <div data-bind="style: {
2970
- width: selectedWidth(),
2971
- height: selectedHeight(),
2972
- backgroundColor: selectedBackgroundStyle(),
2973
- transition: 'all 0.3s ease'
2974
- }"
2975
- class="shadow rounded mx-auto mb-2 border position-relative">
2976
- <span class="position-absolute top-50 start-50 translate-middle text-muted small">Preview</span>
2977
- </div>
2978
- <div data-bind="text: selectedPageLabel" class="fw-bold"></div>
2979
- <div data-bind="text: selectedPageDimension" class="text-muted small"></div>
2980
- </div>
2981
- </div>
2982
- <div class="col-md-7">
2983
- <div class="mb-3">
2984
- <label for="pageSizeSelect" class="form-label fw-bold">Page Size:</label>
2985
- <select class="form-select" id="pageSizeSelect"
2986
- data-bind="options: availablePageSizes,
2987
- optionsText: 'label',
2988
- optionsValue: 'value',
2989
- value: selectedPageSize">
2990
- </select>
2991
- </div>
2992
- <div class="mb-3">
2993
- <label for="pageOrientationSelect" class="form-label fw-bold">Page Orientation:</label>
2994
- <select class="form-select" id="pageOrientationSelect"
2995
- data-bind="options: availablePageOrientation,
2996
- optionsText: 'label',
2997
- optionsValue: 'value',
2998
- value: selectedPageOrientation">
2999
- </select>
3000
- </div>
3001
- <div class="alert alert-info p-2 small mt-2">
3002
- This PDF will be exported using the selected page size. Ensure your content fits well.
3003
- If the content width exceeds the selected size, it will default to Letter.
3004
- </div>
3005
- </div>
3006
- </div>
3007
- <div class="modal-footer">
3008
- <button type="button" class="btn btn-light" data-bs-dismiss="modal">Cancel</button>
3009
- <button type="button" class="btn btn-success" data-bs-dismiss="modal" data-bind="click: save">
3010
- Save
3011
- </button>
3012
- </div>
3013
- </div>
3014
- </div>
3015
- </script>
3016
- <script type="text/html" id="word-options-schedule-template">
3017
- <div class="modal-dialog modal-dialog-centered">
3018
- <div class="modal-content" data-bind="with: WordPage">
3019
- <div class="modal-header">
3020
- <h5 class="modal-title" id="pdfOptionsScheduleModalLabel">
3021
- <i class="fa fa-file-pdf-o me-2"></i> Set WORD Page Size
3022
- </h5>
3023
- <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
3024
- </div>
3025
- <div class="modal-body row g-0">
3026
- <div class="col-md-5 d-flex justify-content-center align-items-center">
3027
- <div id="pagePreviewBox" class="text-center">
3028
- <div data-bind="style: {
3029
- width: selectedWidth(),
3030
- height: selectedHeight(),
3031
- backgroundColor: selectedBackgroundStyle(),
3032
- transition: 'all 0.3s ease'
3033
- }"
3034
- class="shadow rounded mx-auto mb-2 border position-relative">
3035
- <span class="position-absolute top-50 start-50 translate-middle text-muted small">Preview</span>
3036
- </div>
3037
- <div data-bind="text: selectedPageLabel" class="fw-bold"></div>
3038
- <div data-bind="text: selectedPageDimension" class="text-muted small"></div>
3039
- </div>
3040
- </div>
3041
- <div class="col-md-7">
3042
- <div class="mb-3">
3043
- <label for="pageSizeSelect" class="form-label fw-bold">Page Size:</label>
3044
- <select class="form-select" id="pageSizeSelect"
3045
- data-bind="options: availablePageSizes,
3046
- optionsText: 'label',
3047
- optionsValue: 'value',
3048
- value: selectedPageSize">
3049
- </select>
3050
- </div>
3051
- <div class="mb-3">
3052
- <label for="pageOrientationSelect" class="form-label fw-bold">Page Orientation:</label>
3053
- <select class="form-select" id="pageOrientationSelect"
3054
- data-bind="options: availablePageOrientation,
3055
- optionsText: 'label',
3056
- optionsValue: 'value',
3057
- value: selectedPageOrientation">
3058
- </select>
3059
- </div>
3060
- <div class="alert alert-info p-2 small mt-2">
3061
- This WORD will be exported using the selected page size. Ensure your content fits well.
3062
- If the content width exceeds the selected size, it will default to Letter.
3063
- </div>
3064
- </div>
3065
- </div>
3066
- <div class="modal-footer">
3067
- <button type="button" class="btn btn-light" data-bs-dismiss="modal">Cancel</button>
3068
- <button type="button" class="btn btn-success" data-bs-dismiss="modal" data-bind="click: save">
3069
- Save
3070
- </button>
3071
- </div>
3072
- </div>
3073
- </div>
3074
- </script>
3075
- <script type="text/html" id="word-options-template">
3076
- <div class="modal-dialog modal-dialog-centered">
3077
- <div class="modal-content" data-bind="with: WordPage">
3078
- <div class="modal-header">
3079
- <h5 class="modal-title" id="wordOptionsModalLabel"><i class="fa fa-file-pdf-o me-2"></i> Export to WORD</h5>
3080
- <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
3081
- </div>
3082
- <div class="modal-body row g-0">
3083
- <!-- Left Side: Page Preview SVG -->
3084
- <div class="col-md-5 d-flex justify-content-center align-items-center">
3085
- <div id="pagePreviewBox" class="text-center">
3086
- <div data-bind="style: {
3087
- width: selectedWidth(),
3088
- height: selectedHeight(),
3089
- backgroundColor: selectedBackgroundStyle(),
3090
- transition: 'all 0.3s ease'
3091
- }"
3092
- class="shadow rounded mx-auto mb-2 border position-relative">
3093
- <span class="position-absolute top-50 start-50 translate-middle text-muted small">Preview</span>
3094
- </div>
3095
- <div data-bind="text: selectedPageLabel" class="fw-bold"></div>
3096
- <div data-bind="text: selectedPageDimension" class="text-muted small"></div>
3097
- </div>
3098
- </div>
3099
-
3100
- <!-- Right Side: Form Options -->
3101
- <div class="col-md-7">
3102
- <div class="mb-3">
3103
- <label for="pageSizeSelect" class="form-label fw-bold">Page Size:</label>
3104
- <select class="form-select" id="pageSizeSelect"
3105
- data-bind="options: availablePageSizes,
3106
- optionsText: 'label',
3107
- optionsValue: 'value',
3108
- value: selectedPageSize">
3109
- </select>
3110
- </div>
3111
- <div class="mb-3">
3112
- <label for="pageOrientationSelect" class="form-label fw-bold">Page Orientation:</label>
3113
- <select class="form-select" id="pageOrientationSelect"
3114
- data-bind="options: availablePageOrientation,
3115
- optionsText: 'label',
3116
- optionsValue: 'value',
3117
- value: selectedPageOrientation">
3118
- </select>
3119
- </div>
3120
- <div class="alert alert-info p-2 small mt-2">
3121
- This Word will be exported using the selected page size. Ensure your content fits well.
3122
- If the content width exceeds the selected size, it will default to Letter.
3123
- </div>
3124
- </div>
3125
- </div>
3126
- <div class="modal-footer">
3127
- <button type="button" class="btn btn-light" data-bs-dismiss="modal">Cancel</button>
3128
- <button type="button" class="btn btn-success" data-bs-dismiss="modal" data-bind="click: download">
3129
- <i class="fa fa-download me-1"></i> Download WORD
3130
- </button>
3131
- </div>
3132
- </div>
3133
- </div>
3134
- </script>
3135
- <script type="text/html" id="pdf-options-template">
3136
- <div class="modal-dialog modal-dialog-centered">
3137
- <div class="modal-content" data-bind="with: PdfPage">
3138
- <div class="modal-header">
3139
- <h5 class="modal-title" id="pdfOptionsModalLabel"><i class="fa fa-file-pdf-o me-2"></i> Export to PDF</h5>
3140
- <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
3141
- </div>
3142
- <div class="modal-body row g-0">
3143
- <!-- Left Side: Page Preview SVG -->
3144
- <div class="col-md-5 d-flex justify-content-center align-items-center">
3145
- <div id="pagePreviewBox" class="text-center">
3146
- <div data-bind="style: {
3147
- width: selectedWidth(),
3148
- height: selectedHeight(),
3149
- backgroundColor: selectedBackgroundStyle(),
3150
- transition: 'all 0.3s ease'
3151
- }"
3152
- class="shadow rounded mx-auto mb-2 border position-relative">
3153
- <span class="position-absolute top-50 start-50 translate-middle text-muted small">Preview</span>
3154
- </div>
3155
- <div data-bind="text: selectedPageLabel" class="fw-bold"></div>
3156
- <div data-bind="text: selectedPageDimension" class="text-muted small"></div>
3157
- </div>
3158
- </div>
3159
-
3160
- <!-- Right Side: Form Options -->
3161
- <div class="col-md-7">
3162
- <div class="mb-3">
3163
- <label for="pageSizeSelect" class="form-label fw-bold">Page Size:</label>
3164
- <select class="form-select" id="pageSizeSelect"
3165
- data-bind="options: availablePageSizes,
3166
- optionsText: 'label',
3167
- optionsValue: 'value',
3168
- value: selectedPageSize">
3169
- </select>
3170
- </div>
3171
- <div class="mb-3">
3172
- <label for="pageOrientationSelect" class="form-label fw-bold">Page Orientation:</label>
3173
- <select class="form-select" id="pageOrientationSelect"
3174
- data-bind="options: availablePageOrientation,
3175
- optionsText: 'label',
3176
- optionsValue: 'value',
3177
- value: selectedPageOrientation">
3178
- </select>
3179
- </div>
3180
- <div class="alert alert-info p-2 small mt-2">
3181
- This PDF will be exported using the selected page size. Ensure your content fits well.
3182
- If the content width exceeds the selected size, it will default to Letter.
3183
- </div>
3184
- </div>
3185
- </div>
3186
- <div class="modal-footer">
3187
- <button type="button" class="btn btn-light" data-bs-dismiss="modal">Cancel</button>
3188
- <button type="button" class="btn btn-success" data-bs-dismiss="modal" data-bind="click: download">
3189
- <i class="fa fa-download me-1"></i> Download PDF
3190
- </button>
3191
- </div>
3192
- </div>
3193
- </div>
3194
- </script>
3195
- `);
3196
- this.cdref.detectChanges();
3197
- }
3198
- bindWindowResize(vm) {
3199
- let _vm = vm;
3200
- $(window).resize(function () {
3201
- _vm.drawChart();
3202
- });
3203
- }
3204
- bindGridInit(vm) {
3205
- let _vm = vm;
3206
- $(function () {
3207
- $('.grid-stack').show();
3208
- var grid = GridStack.init({
3209
- cellHeight: 60,
3210
- verticalMargin: 10,
3211
- resizable: {
3212
- handles: 'se, sw, ne, nw, n, e, s, w'
3213
- }
3214
- });
3215
- grid.on('change', function (event, items) {
3216
- if (items) {
3217
- _.forEach(items, function (x) {
3218
- _vm.updatePosition(x);
3219
- });
3220
- }
3221
- });
3222
- grid.on('resizestop', function (event, item) {
3223
- var e = $(event.target).find('.report-chart');
3224
- var d = $(event.target).find('table');
3225
- if (e && !d) {
3226
- _vm.drawChart();
3227
- }
3228
- });
3229
- setTimeout(function () {
3230
- _vm.drawChart();
3231
- grid.enableMove(false);
3232
- grid.enableResize(false);
3233
- }, 1000);
3234
- });
3235
- }
3236
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DotnetdashboardComponent, deps: [{ token: i0.Injector }, { token: i1.DomSanitizer }, { token: i0.ChangeDetectorRef }, { token: BASE_URL_TOKEN }, { token: i2.HttpClient }, { token: i3.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component });
3237
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: DotnetdashboardComponent, selector: "app-dotnetdashboard", ngImport: i0, template: "<div id=\"dot-net-report\" class=\"body-content\">\r\n\r\n<div data-bind=\"template: {name: 'admin-mode-template'}, visible: allowAdmin\" style=\"display: none;\"></div>\r\n\r\n<div class=\"row\" style=\"display: none\" data-bind=\"visible: currentDashboard\">\r\n <div class=\"col-12 d-flex flex-wrap justify-content-between align-items-center\">\r\n <ul class=\"nav nav-tabs flex-grow-1\" data-bind=\"foreach: dashboards\">\r\n <li class=\"nav-item\">\r\n <h2>\r\n <a class=\"nav-link\" href=\"#\" data-bind=\"text: name, click: function() { $parent.selectDashboard(id);}, css: { 'active': $parent.currentDashboard().id === id, 'selected-tab': $parent.currentDashboard().id === id }\"></a>\r\n </h2>\r\n </li>\r\n </ul>\r\n <div class=\"d-flex flex-wrap align-items-end gap-2 mt-2 mt-md-0 border-bottom\" style=\"padding-top: 21px;\"> \r\n <div class=\"dropdown\">\r\n <button class=\"btn btn-light btn-sm dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\r\n <i class=\"fa fa-pencil-square\"></i>\r\n <span>Manage</span>\r\n </button>\r\n <ul class=\"dropdown-menu\">\r\n <li class=\"dropdown dropdown-hover\">\r\n <a href=\"#\" class=\"dropdown-toggle dropdown-item\" data-bs-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\" data-bind=\"click: function() { newReport(true) }, visible: currentDashboard().canManage || adminMode()\">\r\n <span class=\"fa fa-plus\"></span> Add New Report\r\n </a>\r\n <ul class=\"dropdown-menu\">\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function() { newReport(false) }\">\r\n <span class=\"fa fa-pencil\"></span> Add using Standard Designer\r\n </a>\r\n </li>\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function() { newReport(true) }\">\r\n <span class=\"fa fa-bolt\"></span> Add using Smarter Designer\r\n </a>\r\n </li>\r\n </ul>\r\n </li>\r\n <li>\r\n <button class=\"dropdown-item\" data-bs-toggle=\"modal\" data-bs-target=\"#add-dashboard-modal\" data-bind=\"click: editDashboard, visible: currentDashboard().canManage || adminMode()\">\r\n <i class=\"fa fa-pencil\"></i>\r\n <span>Edit Dashboard</span>\r\n </button>\r\n </li>\r\n <li>\r\n <button class=\"dropdown-item\" data-bs-toggle=\"modal\" data-bs-target=\"#add-dashboard-modal\" data-bind=\"click: newDashboard\">\r\n <i class=\"fa fa-dashboard\"></i>\r\n <span>Add a New Dashboard</span>\r\n </button>\r\n </li>\r\n <li>\r\n <button class=\"dropdown-item\" data-bind=\"click: RefreshAllReports\">\r\n <i class=\"fa fa-refresh\"></i>\r\n <span>Refresh</span>\r\n </button>\r\n </li>\r\n </ul>\r\n </div>\r\n <div class=\"dropdown\">\r\n <button class=\"btn btn-light btn-sm dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\r\n <i class=\"fa fa-download\"></i>\r\n <span>Export</span>\r\n </button>\r\n <ul class=\"dropdown-menu\">\r\n <li><a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function() { return appSettings.showPageSize ? ExportAllPdfReportsWithPageOption() : ExportAllPdfReports('',''); }, hidden: appSettings.useAltPdf\"><i class=\"fa fa-file-pdf-o\"></i> Pdf</a></li>\r\n <li><a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function() { return appSettings.showPageSize ? ExportAllPdfAltReportsWithPageOption() : ExportAllPdfAltReports('',''); }, visible: appSettings.useAltPdf\"><i class=\"fa fa-file-pdf-o\"></i> Pdf</a></li>\r\n <li><a class=\"dropdown-item\" href=\"#\" data-bind=\"click: ExportAllExcelReports\"><i class=\"fa fa-file-excel-o\"></i> Excel</a></li>\r\n <li data-bind=\"visible: canDrilldown\"><a class=\"dropdown-item\" href=\"#\" data-bind=\"click: ExportAllExcelExpandedReports\"><i class=\"fa fa-file-excel-o\"></i> Excel (Expanded)</a></li>\r\n <li><a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function() { return appSettings.showPageSize ? ExportAllWordReportsWithPageOption() : ExportAllWordReports('','');}\"><i class=\"fa fa-file-word-o\"></i> Word</a></li>\r\n <li><a class=\"dropdown-item\" href=\"#\" data-bind=\"click: PrintDashboard\"><i class=\"fa fa-print\"></i> Print</a></li>\r\n </ul>\r\n </div>\r\n <div data-bind=\"if: currentDashboard().canManage || adminMode()\">\r\n <div class=\"btn btn-light btn-sm d-flex align-items-center gap-2\">\r\n <div class=\"form-check form-switch m-0\">\r\n <input class=\"form-check-input\" id=\"arrange-mode\" type=\"checkbox\" data-bind=\"checked: arrangeDashboard\">\r\n </div>\r\n <span>Arrange</span>\r\n </div>\r\n </div>\r\n <div class=\"btn-group btn-group-sm\" role=\"group\">\r\n <button class=\"btn btn-light\" data-bind=\"click: zoomOutDashboard\" data-bs-toggle=\"tooltip\" title=\"Zoom Out\">\r\n <i class=\"fa fa-search-minus\"></i>\r\n </button>\r\n\r\n <button class=\"btn btn-light\" data-bind=\"click: resetZoomDashboard\" data-bs-toggle=\"tooltip\" title=\"Reset Zoom\">\r\n <i class=\"fa fa-compress\"></i>\r\n </button>\r\n\r\n <button class=\"btn btn-light\" data-bind=\"click: zoomInDashboard\" data-bs-toggle=\"tooltip\" title=\"Zoom In\">\r\n <i class=\"fa fa-search-plus\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"d-flex justify-content-between\">\r\n <div class=\"row\" style=\"display: none\" data-bind=\"visible: currentDashboard\">\r\n <div data-bind=\"with: currentDashboard\">\r\n <p data-bind=\"text: description\"></p>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"padded-top\"></div>\r\n\r\n<div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div data-bind=\"template: {name: 'fly-filter-template'}\"></div>\r\n <br />\r\n </div>\r\n</div>\r\n\r\n<div class=\"centered\" style=\"display: none;\" data-bind=\"visible: dashboards().length == 0 \">\r\n No Dashboards yet. Click below to Start<br />\r\n <button class=\"btn btn-lg btn-primary\" data-bs-toggle=\"modal\" data-bs-target=\"#add-dashboard-modal\"><i class=\"fa fa-dashboard\"></i> Create a New Dashboard</button>\r\n</div>\r\n\r\n<div class=\"modal modal-fullscreen\" id=\"add-dashboard-modal\" tabindex=\"-1\" aria-labelledby=\"add-dashboard-modal-label\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog\" role=\"document\">\r\n <div class=\"modal-content\" data-bind=\"with: dashboard\">\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\" id=\"add-dashboard-modal-label\"><span data-bind=\"text: Id() ? 'Edit' : 'Add'\"></span> Dashboard</h4>\r\n <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" data-bind=\"click: $root.onModalCloseClicked\" aria-label=\"Close\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"mb-4 card card-body\">\r\n <div class=\"row mb-3\">\r\n <label class=\"col-md-3 col-form-label\">Name</label>\r\n <div class=\"col-md-6\">\r\n <input class=\"form-control\" data-val=\"true\" data-val-required=\"Dashboard Name is required.\" type=\"text\" data-bind=\"value: Name\" placeholder=\"Dashboard Name, e.g., Sales, Accounting\" id=\"add-dash-name\" required />\r\n </div>\r\n </div>\r\n <div class=\"row mb-3\">\r\n <label class=\"col-md-3 col-form-label\">Description</label>\r\n <div class=\"col-md-6\">\r\n <textarea class=\"form-control\" data-bind=\"value: Description\" placeholder=\"Optional Description for the Dashboard\"></textarea>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-4 card card-body\">\r\n <div class=\"row align-items-center mb-3\">\r\n <div class=\"col-md-6\">\r\n <h5><i class=\"fa fa-paperclip\"></i> Choose Reports for the Dashboard</h5>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <input type=\"text\" class=\"form-control\" placeholder=\"Search Report by Name or Description...\" data-bind=\"textInput: $parent.searchReports\" />\r\n </div>\r\n </div>\r\n\r\n <div data-bind=\"if: $parent.searchReports() && $parent.reportsInSearch().length==0\">\r\n <div class=\"card card-body\">\r\n No reports found matching your search.\r\n </div>\r\n </div>\r\n <div data-bind=\"if: $parent.searchReports() && $parent.reportsInSearch().length>0\">\r\n <ul class=\"list-group\" data-bind=\"foreach: $parent.reportsInSearch\">\r\n <li class=\"list-group-item\">\r\n <div class=\"checkbox\">\r\n <label class=\"list-group-item-heading\">\r\n <input type=\"checkbox\" data-bind=\"checked: selected\">\r\n <span class=\"fa\" data-bind=\"css: {'fa-file': reportType=='List', 'fa-th-list': reportType=='Summary', 'fa-bar-chart': reportType=='Bar', 'fa-pie-chart': reportType=='Pie', 'fa-line-chart': reportType=='Line', 'fa-globe': reportType =='Map', 'fa-window-restore': reportType=='Treemap', 'fa-code': reportType=='Html'}\" style=\"font-size: 14pt; color: #808080\"></span>\r\n <span data-bind=\"highlightedText: { text: reportName, highlight: $parent.searchReports, css: 'highlight' }\"></span>\r\n </label>\r\n </div>\r\n <p class=\"list-group-item-text small\" data-bind=\"text: reportDescription\"></p>\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n <div data-bind=\"if: !$parent.searchReports()\" class=\"list-group mb-3\">\r\n <div data-bind=\"foreach: $parent.reportsAndFolders\">\r\n <div class=\"list-group-item\">\r\n <a role=\"button\" class=\"d-flex justify-content-between align-items-center\" data-bs-toggle=\"collapse\" data-bind=\"attr: {href: '#folder-' + folderId }\" style=\"text-decoration: none; font-weight: normal;\">\r\n <div class=\"d-flex align-items-center\">\r\n <i class=\"fa fa-folder me-2 text-secondary\"></i>\r\n <span data-bind=\"text: folder\"></span>\r\n </div>\r\n <i class=\"fa fa-chevron-down\"></i>\r\n </a>\r\n <div class=\"collapse mt-2\" data-bind=\"attr: {id: 'folder-' + folderId }\">\r\n <ul class=\"list-group list-group-flush\" data-bind=\"foreach: reports\">\r\n <li class=\"list-group-item\">\r\n <div class=\"form-check\">\r\n <input class=\"form-check-input\" type=\"checkbox\" data-bind=\"checked: selected\">\r\n <label class=\"form-check-label\">\r\n <i class=\"fa\" data-bind=\"css: {'fa-file': reportType=='List', 'fa-th-list': reportType=='Summary', 'fa-bar-chart': reportType=='Bar', 'fa-pie-chart': reportType=='Pie', 'fa-line-chart': reportType=='Line', 'fa-globe': reportType =='Map', 'fa-window-restore': reportType=='Treemap', 'fa-code': reportType=='Html'}\" style=\"font-size: 14pt; color: #808080\"></i>\r\n <span data-bind=\"text: reportName\"></span>\r\n </label>\r\n </div>\r\n <small class=\"text-muted\" data-bind=\"text: reportDescription\"></small>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"card card-body mb-3\">\r\n <h5><i class=\"fa fa-hourglass\"></i>&nbsp;Choose Schedule</h5>\r\n <div data-bind=\"template: {name: 'report-schedule'}\"></div>\r\n </div>\r\n\r\n <div data-bind=\"visible: $parent.adminMode\" class=\"card card-body mb-3\">\r\n <div data-bind=\"template: {name: 'manage-access-template', data: manageAccess}\"></div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-danger\" data-bind=\"click: $root.deleteDashboard, visible: Id\">Delete Dashboard</button>\r\n <button type=\"button\" class=\"btn btn-primary\" data-bind=\"click: $root.saveDashboard\">Save Dashboard</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n\r\n<div class=\"grid-stack\" data-bind=\"foreach: reports\" style=\"display: none;\">\r\n <div class=\"grid-stack-item\" data-bind=\"attr: {'gs-x': x, 'gs-y': y, 'gs-w': width, 'gs-h': height, 'gs-auto-position': true, 'gs-id': ReportID}\">\r\n <div class=\"card\" data-bind=\"attr: {class: 'card ' + panelStyle + ' grid-stack-item-content'}, css: { expanded: isExpanded }, style: { border: noDashboardBorders() ? 'none' : '', 'box-shadow': noDashboardBorders() ? 'none' : '' }\" style=\"overflow-y: hidden;\">\r\n <div class=\"padded-div\" style=\"padding-bottom: 0; margin-bottom: 0;\">\r\n <div class=\"pull-left\">\r\n <button type=\"button\" class=\"btn\" data-bs-toggle=\"dropdown\" aria-haspopup=\"false\" aria-expanded=\"false\">\r\n <span class=\"fa fa-ellipsis-v\"></span>\r\n </button>\r\n <ul class=\"dropdown-menu small\" style=\"z-index: 1001;\">\r\n <li data-bind=\"visible: FlyFilters().length > 0\">\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: toggleFlyFilters\">\r\n <span class=\"fa fa-filter\"></span> Filter\r\n </a>\r\n </li>\r\n <li class=\"dropdown dropdown-hover\">\r\n <a href=\"#\" class=\"dropdown-toggle dropdown-item\" data-bs-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\" data-bind=\"click: editReportAi\">\r\n <span class=\"fa fa-pencil\"></span> Edit\r\n </a>\r\n <ul class=\"dropdown-menu small\">\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: openReport\">\r\n <span class=\"fa fa-pencil\"></span> Edit Standard\r\n </a>\r\n </li>\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: editReportAi\">\r\n <span class=\"fa fa-bolt\"></span> Edit Smarter\r\n </a>\r\n </li>\r\n </ul>\r\n </li>\r\n <li class=\"dropdown dropdown-hover\" data-bind=\"visible: ReportType()!='Single'\">\r\n <a href=\"#\" class=\"dropdown-toggle dropdown-item\">\r\n <span class=\"fa fa-download\"></span> Export\r\n </a>\r\n <ul class=\"dropdown-menu small\">\r\n <li>\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: downloadExcel\">\r\n <span class=\"fa fa-file-excel-o\"></span> Excel\r\n </a>\r\n </li>\r\n <li data-bind=\"visible: canDrilldown\">\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: downloadExcelWithDrilldown\">\r\n <span class=\"fa fa-file-excel-o\"></span> Excel (Expanded)\r\n </a>\r\n </li>\r\n <li>\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: $parent.appSettings.showPageSize ? function() { loadPdfModel() } : function() { $parent.appSettings.useAltPdf ? downloadPdfAlt('','') : downloadPdf('','') }\">\r\n <span class=\"fa fa-file-pdf-o\"></span> PDF\r\n </a>\r\n </li>\r\n <li>\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: $parent.appSettings.showPageSize ? function() { loadWordModel()} : function() { downloadWord('',''); }\">\r\n <span class=\"fa fa-file-word-o\"></span> Word\r\n </a>\r\n </li>\r\n </ul>\r\n </li>\r\n <li data-bind=\"visible: ReportType()!='Single'\">\r\n <a class=\"dropdown-item\" data-bind=\"attr: {href: '/DotNetReport?linkedreport=true&noparent=true&reportId=' + ReportID() }\" target=\"_blank\">\r\n <span class=\"fa fa-folder-open\"></span> Open Report\r\n </a>\r\n </li>\r\n <li data-bind=\"visible: CanEdit() && CanSaveReports()\">\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: SaveWithoutRun\">\r\n <span class=\"fa fa-save\"></span> Save\r\n </a>\r\n </li>\r\n <li data-bind=\"visible: $parent.currentDashboard().canManage || $parent.adminMode()\">\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: function() { $parent.removeReportFromDashboard(ReportID()); }\">\r\n <span class=\"fa fa-close\"></span> Remove\r\n </a>\r\n </li>\r\n <li>\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: function() { RefreshReport(ReportID()); }\">\r\n <span class=\"fa fa-refresh\"></span> Refresh\r\n </a>\r\n </li>\r\n <li>\r\n <a href=\"#\" class=\"dropdown-item\" data-bs-toggle=\"modal\" data-bs-target=\"#sqlModal\" data-bind=\"visible: $parent.adminMode, click: getCode\">\r\n <span class=\"fa fa-code\"></span> Report Code\r\n </a>\r\n </li>\r\n </ul>\r\n\r\n </div>\r\n\r\n <h2 class=\"pull-left\" data-bind=\"text: ReportName\"></h2>\r\n <div class=\"pull-right\">\r\n <span data-bind=\"visible: isDirty\" class=\"text-warning small\" title=\"You have unsaved changes\">\r\n <i class=\"fa fa-exclamation-triangle\"></i>\r\n </span>\r\n <a class=\"btn btn-link\" data-bind=\"visible: CanEdit() && CanSaveReports() && isDirty(), click: SaveWithoutRun\">\r\n <span class=\"fa fa-save\"></span>\r\n </a>\r\n <a class=\"btn btn-link\" data-bind=\"click: toggleExpand\"><span class=\"fa\" data-bind=\"css: {'fa-expand': !isExpanded(), 'fa-minus': isExpanded() }, visible: ReportType() != 'Single' && !noDashboardBorders()\"></span></a>\r\n </div>\r\n </div>\r\n <div data-bind=\"if: activeDesign()\">\r\n <div data-bind=\"template: 'report-designer-compact'\"></div>\r\n </div>\r\n <div class=\"card-body list-overflow-auto\" style=\"padding-top: 0; margin-top: 0;\">\r\n <div data-bind=\"if: ReportType()!='Single' && ReportType()!='Html' && CanEdit()\">\r\n <div data-bind=\"template: 'chart-settings', data: $data\"></div>\r\n </div>\r\n <p data-bind=\"html: ReportDescription, visible: ReportDescription\"></p>\r\n <div data-bind=\"template: {name: 'fly-filter-template'}, visible: showFlyFilters\"></div>\r\n <div data-bind=\"with: ReportResult\" class=\"small\">\r\n <div data-bind=\"visible: !ReportData()\">\r\n <div class=\"report-spinner\"></div>\r\n </div>\r\n <div data-bind=\"template: 'report-template', data: $data\"></div>\r\n </div>\r\n </div>\r\n <div class=\"form-inline\" data-bind=\"ifnot: noDashboardBorders\">\r\n <div class=\"small\" data-bind=\"with: pager\">\r\n <div class=\"form-group pull-left total-records\" data-bind=\"if: totalRecords()>1 && $parent.ReportType() != 'Single'\">\r\n <span data-bind=\"text: 'Total Records: ' + totalRecords()\"></span><br />\r\n </div>\r\n <div class=\"form-group pull-right\" data-bind=\"if: pages()>1 && $parent.ReportType() != 'Single'\">\r\n <div data-bind=\"template: 'pager-template', data: $data\"></div>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</div>\r\n\r\n<!-- Report Builder -->\r\n<div class=\"modal modal-fullscreen\" id=\"modal-reportbuilder\" role=\"dialog\" aria-labelledby=\"myModalLabel\" aria-hidden=\"true\" style=\"padding-right: 0px !important;\" data-bind=\"with: selectedReport\">\r\n <div data-bind=\"template: {name: 'report-designer', data: $data}\"></div>\r\n</div>\r\n\r\n<!-- Field Options Modal -->\r\n<div class=\"modal\" id=\"fieldOptionsModal\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\" data-bind=\"with: selectedReport\">\r\n <div data-bind=\"template: {name: 'report-field-options', data: $data}\"></div>\r\n</div>\r\n\r\n<!-- Link Edit Modal -->\r\n<div class=\"modal\" id=\"linkModal\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\" data-bind=\"with: selectedReport\">\r\n <div data-bind=\"template: {name: 'report-link-edit', data: $data}\"></div>\r\n</div>\r\n\r\n<!-- This renders the template -->\r\n<div class=\"modal\" id=\"pdfOptionsScheduleModal\" tabindex=\"-1\" aria-labelledby=\"pdfOptionsScheduleModalLabel\" aria-hidden=\"true\" data-bind=\"with: dashboard\">\r\n <div data-bind=\"template: { name: 'pdf-options-schedule-template', data: $data }\"></div>\r\n</div>\r\n<!-- This renders the template -->\r\n<div class=\"modal\" id=\"wordOptionsScheduleModal\" tabindex=\"-1\" aria-labelledby=\"wordOptionsScheduleModalLabel\" aria-hidden=\"true\" data-bind=\"with: dashboard\">\r\n <div data-bind=\"template: { name: 'word-options-schedule-template', data: $data }\"></div>\r\n</div>\r\n\r\n<div class=\"modal\" id=\"wordOptionsModal\" tabindex=\"-1\" aria-labelledby=\"wordOptionsModalLabel\" aria-hidden=\"true\" data-bind=\"with: selectedReport\">\r\n <div data-bind=\"template: { name: 'word-options-template', data: $data }\"></div>\r\n</div>\r\n<div class=\"modal\" id=\"pdfOptionsModal\" tabindex=\"-1\" aria-labelledby=\"pdfOptionsModalLabel\" aria-hidden=\"true\" data-bind=\"with: selectedReport\">\r\n <div data-bind=\"template: { name: 'pdf-options-template', data: $data }\"></div>\r\n</div>\r\n<div class=\"modal\" id=\"exportAllWordOptionsModal\" tabindex=\"-1\" aria-labelledby=\"exportAllWordOptionsModalLabel\" aria-hidden=\"true\" data-bind=\"with: dashboard\">\r\n <div data-bind=\"template: { name: 'word-options-template', data: $data }\"></div>\r\n</div>\r\n<div class=\"modal\" id=\"exportAllPdfOptionsModal\" tabindex=\"-1\" aria-labelledby=\"exportAllPdfOptionsModalLabel\" aria-hidden=\"true\" data-bind=\"with: dashboard\">\r\n <div data-bind=\"template: { name: 'pdf-options-template', data: $data }\"></div>\r\n</div>\r\n\r\n<!-- Templates -->\r\n<div [innerHtml]=\"reportTemplates\"></div>\r\n<!-- Templates -->\r\n\r\n</div>", styles: [".report-chart{min-height:auto!important}.expanded{position:fixed!important;padding:0!important;margin:0!important;top:0!important;left:0!important;width:100%!important;height:100%!important;z-index:1050!important}\n"] });
3238
- }
3239
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DotnetdashboardComponent, decorators: [{
3240
- type: Component,
3241
- args: [{ selector: 'app-dotnetdashboard', template: "<div id=\"dot-net-report\" class=\"body-content\">\r\n\r\n<div data-bind=\"template: {name: 'admin-mode-template'}, visible: allowAdmin\" style=\"display: none;\"></div>\r\n\r\n<div class=\"row\" style=\"display: none\" data-bind=\"visible: currentDashboard\">\r\n <div class=\"col-12 d-flex flex-wrap justify-content-between align-items-center\">\r\n <ul class=\"nav nav-tabs flex-grow-1\" data-bind=\"foreach: dashboards\">\r\n <li class=\"nav-item\">\r\n <h2>\r\n <a class=\"nav-link\" href=\"#\" data-bind=\"text: name, click: function() { $parent.selectDashboard(id);}, css: { 'active': $parent.currentDashboard().id === id, 'selected-tab': $parent.currentDashboard().id === id }\"></a>\r\n </h2>\r\n </li>\r\n </ul>\r\n <div class=\"d-flex flex-wrap align-items-end gap-2 mt-2 mt-md-0 border-bottom\" style=\"padding-top: 21px;\"> \r\n <div class=\"dropdown\">\r\n <button class=\"btn btn-light btn-sm dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\r\n <i class=\"fa fa-pencil-square\"></i>\r\n <span>Manage</span>\r\n </button>\r\n <ul class=\"dropdown-menu\">\r\n <li class=\"dropdown dropdown-hover\">\r\n <a href=\"#\" class=\"dropdown-toggle dropdown-item\" data-bs-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\" data-bind=\"click: function() { newReport(true) }, visible: currentDashboard().canManage || adminMode()\">\r\n <span class=\"fa fa-plus\"></span> Add New Report\r\n </a>\r\n <ul class=\"dropdown-menu\">\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function() { newReport(false) }\">\r\n <span class=\"fa fa-pencil\"></span> Add using Standard Designer\r\n </a>\r\n </li>\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function() { newReport(true) }\">\r\n <span class=\"fa fa-bolt\"></span> Add using Smarter Designer\r\n </a>\r\n </li>\r\n </ul>\r\n </li>\r\n <li>\r\n <button class=\"dropdown-item\" data-bs-toggle=\"modal\" data-bs-target=\"#add-dashboard-modal\" data-bind=\"click: editDashboard, visible: currentDashboard().canManage || adminMode()\">\r\n <i class=\"fa fa-pencil\"></i>\r\n <span>Edit Dashboard</span>\r\n </button>\r\n </li>\r\n <li>\r\n <button class=\"dropdown-item\" data-bs-toggle=\"modal\" data-bs-target=\"#add-dashboard-modal\" data-bind=\"click: newDashboard\">\r\n <i class=\"fa fa-dashboard\"></i>\r\n <span>Add a New Dashboard</span>\r\n </button>\r\n </li>\r\n <li>\r\n <button class=\"dropdown-item\" data-bind=\"click: RefreshAllReports\">\r\n <i class=\"fa fa-refresh\"></i>\r\n <span>Refresh</span>\r\n </button>\r\n </li>\r\n </ul>\r\n </div>\r\n <div class=\"dropdown\">\r\n <button class=\"btn btn-light btn-sm dropdown-toggle\" data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\r\n <i class=\"fa fa-download\"></i>\r\n <span>Export</span>\r\n </button>\r\n <ul class=\"dropdown-menu\">\r\n <li><a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function() { return appSettings.showPageSize ? ExportAllPdfReportsWithPageOption() : ExportAllPdfReports('',''); }, hidden: appSettings.useAltPdf\"><i class=\"fa fa-file-pdf-o\"></i> Pdf</a></li>\r\n <li><a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function() { return appSettings.showPageSize ? ExportAllPdfAltReportsWithPageOption() : ExportAllPdfAltReports('',''); }, visible: appSettings.useAltPdf\"><i class=\"fa fa-file-pdf-o\"></i> Pdf</a></li>\r\n <li><a class=\"dropdown-item\" href=\"#\" data-bind=\"click: ExportAllExcelReports\"><i class=\"fa fa-file-excel-o\"></i> Excel</a></li>\r\n <li data-bind=\"visible: canDrilldown\"><a class=\"dropdown-item\" href=\"#\" data-bind=\"click: ExportAllExcelExpandedReports\"><i class=\"fa fa-file-excel-o\"></i> Excel (Expanded)</a></li>\r\n <li><a class=\"dropdown-item\" href=\"#\" data-bind=\"click: function() { return appSettings.showPageSize ? ExportAllWordReportsWithPageOption() : ExportAllWordReports('','');}\"><i class=\"fa fa-file-word-o\"></i> Word</a></li>\r\n <li><a class=\"dropdown-item\" href=\"#\" data-bind=\"click: PrintDashboard\"><i class=\"fa fa-print\"></i> Print</a></li>\r\n </ul>\r\n </div>\r\n <div data-bind=\"if: currentDashboard().canManage || adminMode()\">\r\n <div class=\"btn btn-light btn-sm d-flex align-items-center gap-2\">\r\n <div class=\"form-check form-switch m-0\">\r\n <input class=\"form-check-input\" id=\"arrange-mode\" type=\"checkbox\" data-bind=\"checked: arrangeDashboard\">\r\n </div>\r\n <span>Arrange</span>\r\n </div>\r\n </div>\r\n <div class=\"btn-group btn-group-sm\" role=\"group\">\r\n <button class=\"btn btn-light\" data-bind=\"click: zoomOutDashboard\" data-bs-toggle=\"tooltip\" title=\"Zoom Out\">\r\n <i class=\"fa fa-search-minus\"></i>\r\n </button>\r\n\r\n <button class=\"btn btn-light\" data-bind=\"click: resetZoomDashboard\" data-bs-toggle=\"tooltip\" title=\"Reset Zoom\">\r\n <i class=\"fa fa-compress\"></i>\r\n </button>\r\n\r\n <button class=\"btn btn-light\" data-bind=\"click: zoomInDashboard\" data-bs-toggle=\"tooltip\" title=\"Zoom In\">\r\n <i class=\"fa fa-search-plus\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"d-flex justify-content-between\">\r\n <div class=\"row\" style=\"display: none\" data-bind=\"visible: currentDashboard\">\r\n <div data-bind=\"with: currentDashboard\">\r\n <p data-bind=\"text: description\"></p>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class=\"padded-top\"></div>\r\n\r\n<div class=\"row\">\r\n <div class=\"col-md-12\">\r\n <div data-bind=\"template: {name: 'fly-filter-template'}\"></div>\r\n <br />\r\n </div>\r\n</div>\r\n\r\n<div class=\"centered\" style=\"display: none;\" data-bind=\"visible: dashboards().length == 0 \">\r\n No Dashboards yet. Click below to Start<br />\r\n <button class=\"btn btn-lg btn-primary\" data-bs-toggle=\"modal\" data-bs-target=\"#add-dashboard-modal\"><i class=\"fa fa-dashboard\"></i> Create a New Dashboard</button>\r\n</div>\r\n\r\n<div class=\"modal modal-fullscreen\" id=\"add-dashboard-modal\" tabindex=\"-1\" aria-labelledby=\"add-dashboard-modal-label\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog\" role=\"document\">\r\n <div class=\"modal-content\" data-bind=\"with: dashboard\">\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\" id=\"add-dashboard-modal-label\"><span data-bind=\"text: Id() ? 'Edit' : 'Add'\"></span> Dashboard</h4>\r\n <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" data-bind=\"click: $root.onModalCloseClicked\" aria-label=\"Close\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"mb-4 card card-body\">\r\n <div class=\"row mb-3\">\r\n <label class=\"col-md-3 col-form-label\">Name</label>\r\n <div class=\"col-md-6\">\r\n <input class=\"form-control\" data-val=\"true\" data-val-required=\"Dashboard Name is required.\" type=\"text\" data-bind=\"value: Name\" placeholder=\"Dashboard Name, e.g., Sales, Accounting\" id=\"add-dash-name\" required />\r\n </div>\r\n </div>\r\n <div class=\"row mb-3\">\r\n <label class=\"col-md-3 col-form-label\">Description</label>\r\n <div class=\"col-md-6\">\r\n <textarea class=\"form-control\" data-bind=\"value: Description\" placeholder=\"Optional Description for the Dashboard\"></textarea>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-4 card card-body\">\r\n <div class=\"row align-items-center mb-3\">\r\n <div class=\"col-md-6\">\r\n <h5><i class=\"fa fa-paperclip\"></i> Choose Reports for the Dashboard</h5>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <input type=\"text\" class=\"form-control\" placeholder=\"Search Report by Name or Description...\" data-bind=\"textInput: $parent.searchReports\" />\r\n </div>\r\n </div>\r\n\r\n <div data-bind=\"if: $parent.searchReports() && $parent.reportsInSearch().length==0\">\r\n <div class=\"card card-body\">\r\n No reports found matching your search.\r\n </div>\r\n </div>\r\n <div data-bind=\"if: $parent.searchReports() && $parent.reportsInSearch().length>0\">\r\n <ul class=\"list-group\" data-bind=\"foreach: $parent.reportsInSearch\">\r\n <li class=\"list-group-item\">\r\n <div class=\"checkbox\">\r\n <label class=\"list-group-item-heading\">\r\n <input type=\"checkbox\" data-bind=\"checked: selected\">\r\n <span class=\"fa\" data-bind=\"css: {'fa-file': reportType=='List', 'fa-th-list': reportType=='Summary', 'fa-bar-chart': reportType=='Bar', 'fa-pie-chart': reportType=='Pie', 'fa-line-chart': reportType=='Line', 'fa-globe': reportType =='Map', 'fa-window-restore': reportType=='Treemap', 'fa-code': reportType=='Html'}\" style=\"font-size: 14pt; color: #808080\"></span>\r\n <span data-bind=\"highlightedText: { text: reportName, highlight: $parent.searchReports, css: 'highlight' }\"></span>\r\n </label>\r\n </div>\r\n <p class=\"list-group-item-text small\" data-bind=\"text: reportDescription\"></p>\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n <div data-bind=\"if: !$parent.searchReports()\" class=\"list-group mb-3\">\r\n <div data-bind=\"foreach: $parent.reportsAndFolders\">\r\n <div class=\"list-group-item\">\r\n <a role=\"button\" class=\"d-flex justify-content-between align-items-center\" data-bs-toggle=\"collapse\" data-bind=\"attr: {href: '#folder-' + folderId }\" style=\"text-decoration: none; font-weight: normal;\">\r\n <div class=\"d-flex align-items-center\">\r\n <i class=\"fa fa-folder me-2 text-secondary\"></i>\r\n <span data-bind=\"text: folder\"></span>\r\n </div>\r\n <i class=\"fa fa-chevron-down\"></i>\r\n </a>\r\n <div class=\"collapse mt-2\" data-bind=\"attr: {id: 'folder-' + folderId }\">\r\n <ul class=\"list-group list-group-flush\" data-bind=\"foreach: reports\">\r\n <li class=\"list-group-item\">\r\n <div class=\"form-check\">\r\n <input class=\"form-check-input\" type=\"checkbox\" data-bind=\"checked: selected\">\r\n <label class=\"form-check-label\">\r\n <i class=\"fa\" data-bind=\"css: {'fa-file': reportType=='List', 'fa-th-list': reportType=='Summary', 'fa-bar-chart': reportType=='Bar', 'fa-pie-chart': reportType=='Pie', 'fa-line-chart': reportType=='Line', 'fa-globe': reportType =='Map', 'fa-window-restore': reportType=='Treemap', 'fa-code': reportType=='Html'}\" style=\"font-size: 14pt; color: #808080\"></i>\r\n <span data-bind=\"text: reportName\"></span>\r\n </label>\r\n </div>\r\n <small class=\"text-muted\" data-bind=\"text: reportDescription\"></small>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"card card-body mb-3\">\r\n <h5><i class=\"fa fa-hourglass\"></i>&nbsp;Choose Schedule</h5>\r\n <div data-bind=\"template: {name: 'report-schedule'}\"></div>\r\n </div>\r\n\r\n <div data-bind=\"visible: $parent.adminMode\" class=\"card card-body mb-3\">\r\n <div data-bind=\"template: {name: 'manage-access-template', data: manageAccess}\"></div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-danger\" data-bind=\"click: $root.deleteDashboard, visible: Id\">Delete Dashboard</button>\r\n <button type=\"button\" class=\"btn btn-primary\" data-bind=\"click: $root.saveDashboard\">Save Dashboard</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n\r\n<div class=\"grid-stack\" data-bind=\"foreach: reports\" style=\"display: none;\">\r\n <div class=\"grid-stack-item\" data-bind=\"attr: {'gs-x': x, 'gs-y': y, 'gs-w': width, 'gs-h': height, 'gs-auto-position': true, 'gs-id': ReportID}\">\r\n <div class=\"card\" data-bind=\"attr: {class: 'card ' + panelStyle + ' grid-stack-item-content'}, css: { expanded: isExpanded }, style: { border: noDashboardBorders() ? 'none' : '', 'box-shadow': noDashboardBorders() ? 'none' : '' }\" style=\"overflow-y: hidden;\">\r\n <div class=\"padded-div\" style=\"padding-bottom: 0; margin-bottom: 0;\">\r\n <div class=\"pull-left\">\r\n <button type=\"button\" class=\"btn\" data-bs-toggle=\"dropdown\" aria-haspopup=\"false\" aria-expanded=\"false\">\r\n <span class=\"fa fa-ellipsis-v\"></span>\r\n </button>\r\n <ul class=\"dropdown-menu small\" style=\"z-index: 1001;\">\r\n <li data-bind=\"visible: FlyFilters().length > 0\">\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: toggleFlyFilters\">\r\n <span class=\"fa fa-filter\"></span> Filter\r\n </a>\r\n </li>\r\n <li class=\"dropdown dropdown-hover\">\r\n <a href=\"#\" class=\"dropdown-toggle dropdown-item\" data-bs-toggle=\"dropdown\" role=\"button\" aria-expanded=\"false\" data-bind=\"click: editReportAi\">\r\n <span class=\"fa fa-pencil\"></span> Edit\r\n </a>\r\n <ul class=\"dropdown-menu small\">\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: openReport\">\r\n <span class=\"fa fa-pencil\"></span> Edit Standard\r\n </a>\r\n </li>\r\n <li>\r\n <a class=\"dropdown-item\" href=\"#\" data-bind=\"click: editReportAi\">\r\n <span class=\"fa fa-bolt\"></span> Edit Smarter\r\n </a>\r\n </li>\r\n </ul>\r\n </li>\r\n <li class=\"dropdown dropdown-hover\" data-bind=\"visible: ReportType()!='Single'\">\r\n <a href=\"#\" class=\"dropdown-toggle dropdown-item\">\r\n <span class=\"fa fa-download\"></span> Export\r\n </a>\r\n <ul class=\"dropdown-menu small\">\r\n <li>\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: downloadExcel\">\r\n <span class=\"fa fa-file-excel-o\"></span> Excel\r\n </a>\r\n </li>\r\n <li data-bind=\"visible: canDrilldown\">\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: downloadExcelWithDrilldown\">\r\n <span class=\"fa fa-file-excel-o\"></span> Excel (Expanded)\r\n </a>\r\n </li>\r\n <li>\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: $parent.appSettings.showPageSize ? function() { loadPdfModel() } : function() { $parent.appSettings.useAltPdf ? downloadPdfAlt('','') : downloadPdf('','') }\">\r\n <span class=\"fa fa-file-pdf-o\"></span> PDF\r\n </a>\r\n </li>\r\n <li>\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: $parent.appSettings.showPageSize ? function() { loadWordModel()} : function() { downloadWord('',''); }\">\r\n <span class=\"fa fa-file-word-o\"></span> Word\r\n </a>\r\n </li>\r\n </ul>\r\n </li>\r\n <li data-bind=\"visible: ReportType()!='Single'\">\r\n <a class=\"dropdown-item\" data-bind=\"attr: {href: '/DotNetReport?linkedreport=true&noparent=true&reportId=' + ReportID() }\" target=\"_blank\">\r\n <span class=\"fa fa-folder-open\"></span> Open Report\r\n </a>\r\n </li>\r\n <li data-bind=\"visible: CanEdit() && CanSaveReports()\">\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: SaveWithoutRun\">\r\n <span class=\"fa fa-save\"></span> Save\r\n </a>\r\n </li>\r\n <li data-bind=\"visible: $parent.currentDashboard().canManage || $parent.adminMode()\">\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: function() { $parent.removeReportFromDashboard(ReportID()); }\">\r\n <span class=\"fa fa-close\"></span> Remove\r\n </a>\r\n </li>\r\n <li>\r\n <a href=\"#\" class=\"dropdown-item\" data-bind=\"click: function() { RefreshReport(ReportID()); }\">\r\n <span class=\"fa fa-refresh\"></span> Refresh\r\n </a>\r\n </li>\r\n <li>\r\n <a href=\"#\" class=\"dropdown-item\" data-bs-toggle=\"modal\" data-bs-target=\"#sqlModal\" data-bind=\"visible: $parent.adminMode, click: getCode\">\r\n <span class=\"fa fa-code\"></span> Report Code\r\n </a>\r\n </li>\r\n </ul>\r\n\r\n </div>\r\n\r\n <h2 class=\"pull-left\" data-bind=\"text: ReportName\"></h2>\r\n <div class=\"pull-right\">\r\n <span data-bind=\"visible: isDirty\" class=\"text-warning small\" title=\"You have unsaved changes\">\r\n <i class=\"fa fa-exclamation-triangle\"></i>\r\n </span>\r\n <a class=\"btn btn-link\" data-bind=\"visible: CanEdit() && CanSaveReports() && isDirty(), click: SaveWithoutRun\">\r\n <span class=\"fa fa-save\"></span>\r\n </a>\r\n <a class=\"btn btn-link\" data-bind=\"click: toggleExpand\"><span class=\"fa\" data-bind=\"css: {'fa-expand': !isExpanded(), 'fa-minus': isExpanded() }, visible: ReportType() != 'Single' && !noDashboardBorders()\"></span></a>\r\n </div>\r\n </div>\r\n <div data-bind=\"if: activeDesign()\">\r\n <div data-bind=\"template: 'report-designer-compact'\"></div>\r\n </div>\r\n <div class=\"card-body list-overflow-auto\" style=\"padding-top: 0; margin-top: 0;\">\r\n <div data-bind=\"if: ReportType()!='Single' && ReportType()!='Html' && CanEdit()\">\r\n <div data-bind=\"template: 'chart-settings', data: $data\"></div>\r\n </div>\r\n <p data-bind=\"html: ReportDescription, visible: ReportDescription\"></p>\r\n <div data-bind=\"template: {name: 'fly-filter-template'}, visible: showFlyFilters\"></div>\r\n <div data-bind=\"with: ReportResult\" class=\"small\">\r\n <div data-bind=\"visible: !ReportData()\">\r\n <div class=\"report-spinner\"></div>\r\n </div>\r\n <div data-bind=\"template: 'report-template', data: $data\"></div>\r\n </div>\r\n </div>\r\n <div class=\"form-inline\" data-bind=\"ifnot: noDashboardBorders\">\r\n <div class=\"small\" data-bind=\"with: pager\">\r\n <div class=\"form-group pull-left total-records\" data-bind=\"if: totalRecords()>1 && $parent.ReportType() != 'Single'\">\r\n <span data-bind=\"text: 'Total Records: ' + totalRecords()\"></span><br />\r\n </div>\r\n <div class=\"form-group pull-right\" data-bind=\"if: pages()>1 && $parent.ReportType() != 'Single'\">\r\n <div data-bind=\"template: 'pager-template', data: $data\"></div>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n</div>\r\n\r\n<!-- Report Builder -->\r\n<div class=\"modal modal-fullscreen\" id=\"modal-reportbuilder\" role=\"dialog\" aria-labelledby=\"myModalLabel\" aria-hidden=\"true\" style=\"padding-right: 0px !important;\" data-bind=\"with: selectedReport\">\r\n <div data-bind=\"template: {name: 'report-designer', data: $data}\"></div>\r\n</div>\r\n\r\n<!-- Field Options Modal -->\r\n<div class=\"modal\" id=\"fieldOptionsModal\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\" data-bind=\"with: selectedReport\">\r\n <div data-bind=\"template: {name: 'report-field-options', data: $data}\"></div>\r\n</div>\r\n\r\n<!-- Link Edit Modal -->\r\n<div class=\"modal\" id=\"linkModal\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\" data-bind=\"with: selectedReport\">\r\n <div data-bind=\"template: {name: 'report-link-edit', data: $data}\"></div>\r\n</div>\r\n\r\n<!-- This renders the template -->\r\n<div class=\"modal\" id=\"pdfOptionsScheduleModal\" tabindex=\"-1\" aria-labelledby=\"pdfOptionsScheduleModalLabel\" aria-hidden=\"true\" data-bind=\"with: dashboard\">\r\n <div data-bind=\"template: { name: 'pdf-options-schedule-template', data: $data }\"></div>\r\n</div>\r\n<!-- This renders the template -->\r\n<div class=\"modal\" id=\"wordOptionsScheduleModal\" tabindex=\"-1\" aria-labelledby=\"wordOptionsScheduleModalLabel\" aria-hidden=\"true\" data-bind=\"with: dashboard\">\r\n <div data-bind=\"template: { name: 'word-options-schedule-template', data: $data }\"></div>\r\n</div>\r\n\r\n<div class=\"modal\" id=\"wordOptionsModal\" tabindex=\"-1\" aria-labelledby=\"wordOptionsModalLabel\" aria-hidden=\"true\" data-bind=\"with: selectedReport\">\r\n <div data-bind=\"template: { name: 'word-options-template', data: $data }\"></div>\r\n</div>\r\n<div class=\"modal\" id=\"pdfOptionsModal\" tabindex=\"-1\" aria-labelledby=\"pdfOptionsModalLabel\" aria-hidden=\"true\" data-bind=\"with: selectedReport\">\r\n <div data-bind=\"template: { name: 'pdf-options-template', data: $data }\"></div>\r\n</div>\r\n<div class=\"modal\" id=\"exportAllWordOptionsModal\" tabindex=\"-1\" aria-labelledby=\"exportAllWordOptionsModalLabel\" aria-hidden=\"true\" data-bind=\"with: dashboard\">\r\n <div data-bind=\"template: { name: 'word-options-template', data: $data }\"></div>\r\n</div>\r\n<div class=\"modal\" id=\"exportAllPdfOptionsModal\" tabindex=\"-1\" aria-labelledby=\"exportAllPdfOptionsModalLabel\" aria-hidden=\"true\" data-bind=\"with: dashboard\">\r\n <div data-bind=\"template: { name: 'pdf-options-template', data: $data }\"></div>\r\n</div>\r\n\r\n<!-- Templates -->\r\n<div [innerHtml]=\"reportTemplates\"></div>\r\n<!-- Templates -->\r\n\r\n</div>", styles: [".report-chart{min-height:auto!important}.expanded{position:fixed!important;padding:0!important;margin:0!important;top:0!important;left:0!important;width:100%!important;height:100%!important;z-index:1050!important}\n"] }]
3242
- }], ctorParameters: () => [{ type: i0.Injector }, { type: i1.DomSanitizer }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{
3243
- type: Inject,
3244
- args: [BASE_URL_TOKEN]
3245
- }] }, { type: i2.HttpClient }, { type: i3.ActivatedRoute }] });
3246
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG90bmV0ZGFzaGJvYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RvdG5ldHJlcG9ydC1saWIvc3JjL2xpYi9kb3RuZXRkYXNoYm9hcmQvZG90bmV0ZGFzaGJvYXJkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RvdG5ldHJlcG9ydC1saWIvc3JjL2xpYi9kb3RuZXRkYXNoYm9hcmQvZG90bmV0ZGFzaGJvYXJkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBcUIsU0FBUyxFQUFFLE1BQU0sRUFBK0IsTUFBTSxlQUFlLENBQUM7QUFFbEcsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7OztBQWdCMUQsTUFBTSxPQUFPLHdCQUF3QjtJQU12QjtJQUNBO0lBQ3dCO0lBQ3hCO0lBQ0E7SUFURixjQUFjLENBQVM7SUFDeEIsZUFBZSxDQUFXO0lBQ3pCLFdBQVcsQ0FBNEI7SUFFL0MsWUFBWSxRQUFrQixFQUNwQixTQUF1QixFQUN2QixLQUF3QixFQUNBLE9BQWUsRUFDdkMsSUFBZ0IsRUFDaEIsS0FBcUI7UUFKckIsY0FBUyxHQUFULFNBQVMsQ0FBYztRQUN2QixVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQUNBLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFDdkMsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNoQixVQUFLLEdBQUwsS0FBSyxDQUFnQjtRQUUzQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUMsOEJBQThCO1FBQzNFLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFSCxRQUFRO1FBQ0osSUFBSSxPQUFPLEdBQXNILEVBQUUsQ0FBQztRQUNwSSxJQUFJLFVBQVUsR0FBNE0sRUFBRSxDQUFDO1FBQzdOLElBQUksU0FBUyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsSUFBSSxLQUFLLENBQUM7UUFDakUsSUFBSSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsY0FBYyxHQUFHLDJDQUEyQyxHQUFHLFNBQVMsQ0FBQztRQUNyRyxJQUFJLGtCQUFrQixHQUFHLElBQUksQ0FBQyxjQUFjLEdBQUcscUNBQXFDLENBQUM7UUFDckYsSUFBSSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsY0FBYyxHQUFHLG1DQUFtQyxDQUFDO1FBQ3BGLG1CQUFtQixHQUFHLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFHL0QsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxhQUFrQixFQUFFLEVBQUU7WUFDN0QsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUssRUFBQyxFQUFFO2dCQUMzQixVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsZUFBZSxFQUFFLENBQUMsQ0FBQyxlQUFlLEVBQUMsUUFBUSxFQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxTQUFTLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQyxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLGlCQUFpQixFQUFDLFFBQVEsRUFBQyxDQUFDLENBQUMsUUFBUSxFQUFDLFNBQVMsRUFBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUNsUyxDQUFDLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO1lBQ25ELElBQUksV0FBVyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1lBQzFELElBQUksQ0FBQyxXQUFXLElBQUksVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFBQyxXQUFXLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUFDLENBQUM7WUFFOUUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEdBQUcsTUFBTSxHQUFHLFdBQVcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFdBQWdCLEVBQUUsRUFBRTtnQkFDcEYsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUssRUFBRSxFQUFFO29CQUMxQixPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO2dCQUM3SyxDQUFDLENBQUMsQ0FBQztnQkFFSCxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQWEsRUFBRSxFQUFFO29CQUUzRCxJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUM7b0JBQ3RCLElBQUksRUFBRSxHQUFHLElBQUksa0JBQWtCLENBQUM7d0JBQzVCLFlBQVksRUFBRSxJQUFJLENBQUMsY0FBYyxHQUFHLHNCQUFzQjt3QkFDMUQsYUFBYSxFQUFFLElBQUksQ0FBQyxjQUFjLEdBQUcsNEJBQTRCO3dCQUNqRSxnQkFBZ0IsRUFBQyxJQUFJLENBQUMsY0FBYyxHQUFFLGdDQUFnQzt3QkFDdEUsWUFBWSxFQUFFLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQzt3QkFDdkMsYUFBYSxFQUFFLElBQUksQ0FBQyxjQUFjLEdBQUcsZ0NBQWdDO3dCQUNyRSxNQUFNLEVBQUUsSUFBSSxDQUFDLGNBQWMsR0FBRyxnQ0FBZ0M7d0JBQzlELGVBQWUsRUFBRSxJQUFJLENBQUMsY0FBYyxHQUFHLCtCQUErQjt3QkFDdEUsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGNBQWMsR0FBRyxtQ0FBbUM7d0JBQzNFLFVBQVUsRUFBRSxTQUFTO3dCQUNyQixTQUFTLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQzt3QkFDMUIsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLG9CQUFvQixDQUFDO3dCQUMxQyxPQUFPLEVBQUUsT0FBTzt3QkFDaEIsVUFBVSxFQUFFLFVBQVU7d0JBQ3RCLFlBQVksRUFBRSxNQUFNO3dCQUNwQixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUs7d0JBQ25CLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUzt3QkFDM0IsVUFBVSxFQUFFLE1BQU0sQ0FBQyxjQUFjO3dCQUNqQyxXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVc7d0JBQy9CLFdBQVcsRUFBRSxXQUFXO3dCQUN4QixZQUFZLEVBQUUsSUFBSSxDQUFDLGNBQWMsR0FBRyxtQkFBbUI7d0JBQ3ZELGNBQWMsRUFBRSxJQUFJLENBQUMsT0FBTyxHQUFHLDJCQUEyQjt3QkFDMUQsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLGNBQWMsR0FBRyxxQ0FBcUM7d0JBQ2pGLGVBQWUsRUFBRSxJQUFJLENBQUMsY0FBYyxHQUFFLGdDQUFnQzt3QkFDdEUsZUFBZSxFQUFFLElBQUksQ0FBQyxjQUFjLEdBQUcsa0NBQWtDO3dCQUN6RSxtQkFBbUIsRUFBRSxtQkFBbUI7d0JBQ3hDLGFBQWEsRUFBRSxJQUFJO3FCQUN0QixDQUFDLENBQUM7b0JBRUgsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFFLEVBQUU7d0JBRWxDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO3dCQUN6QixFQUFFLENBQUMsYUFBYSxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQzt3QkFFaEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQzt3QkFDdEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUM5QixDQUFDLENBQUMsQ0FBQztnQkFDUCxDQUFDLENBQUMsQ0FBQztZQUNQLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUgsV0FBVztRQUNQLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVNLElBQUk7UUFDVCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUVPLGlCQUFpQjtRQUV2QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsdUJBQXVCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQThoR2pFLENBQUMsQ0FBQztRQUNDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVPLGdCQUFnQixDQUFDLEVBQU87UUFDOUIsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUNiLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQTtRQUNuQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxZQUFZLENBQUMsRUFBTTtRQUN6QixJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFFYixDQUFDLENBQUM7WUFDRSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDeEIsSUFBSSxJQUFJLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQztnQkFDdEIsVUFBVSxFQUFFLEVBQUU7Z0JBQ2QsY0FBYyxFQUFFLEVBQUU7Z0JBQ2xCLFNBQVMsRUFBRTtvQkFDUCxPQUFPLEVBQUUsNEJBQTRCO2lCQUN4QzthQUNKLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLFVBQVMsS0FBVSxFQUFFLEtBQVk7Z0JBQ2pELElBQUksS0FBSyxFQUFFLENBQUM7b0JBQ1YsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsVUFBUyxDQUFNO3dCQUM5QixHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN4QixDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxVQUFTLEtBQXVCLEVBQUUsSUFBb0M7Z0JBQ3hGLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUM5QyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDWCxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ25CLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUNILFVBQVUsQ0FBQztnQkFDWCxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ2hCLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0IsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQUM7SUFHTCxDQUFDO3dHQTFxR1Usd0JBQXdCLHVHQVF2QixjQUFjOzRGQVJmLHdCQUF3QiwyRENuQnJDLDIwMEJBcVlNOzs0RkRsWE8sd0JBQXdCO2tCQVBwQyxTQUFTOytCQUNFLHFCQUFxQjs7MEJBYzFCLE1BQU07MkJBQUMsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEluamVjdCwgSW5qZWN0b3IsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZUh0bWwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuaW1wb3J0IHsgQkFTRV9VUkxfVE9LRU4gfSBmcm9tICcuLy4uL2RvdG5ldHJlcG9ydC1saWIuZGknO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcblxyXG5kZWNsYXJlIHZhciBrbzogYW55O1xyXG5kZWNsYXJlIHZhciBkYXNoYm9hcmRWaWV3TW9kZWw6IGFueTtcclxuZGVjbGFyZSB2YXIgJDogYW55O1xyXG5kZWNsYXJlIHZhciBHcmlkU3RhY2s6IGFueTtcclxuZGVjbGFyZSB2YXIgXzogYW55O1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtZG90bmV0ZGFzaGJvYXJkJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZG90bmV0ZGFzaGJvYXJkLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9kb3RuZXRkYXNoYm9hcmQuY29tcG9uZW50LmNzcyddXHJcbn0pXHJcbiBcclxuXHJcbmV4cG9ydCBjbGFzcyBEb3RuZXRkYXNoYm9hcmRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgICBwcml2YXRlIGJhc2VTZXJ2aWNlVXJsOiBzdHJpbmc7XHJcbiAgICBwdWJsaWMgcmVwb3J0VGVtcGxhdGVzOiBTYWZlSHRtbDtcclxuICAgIHByaXZhdGUgcXVlcnlQYXJhbXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XHJcbiAgXHJcbiAgICBjb25zdHJ1Y3RvcihpbmplY3RvcjogSW5qZWN0b3IsXHJcbiAgICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXHJcbiAgICAgIHByaXZhdGUgY2RyZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgICBASW5qZWN0KEJBU0VfVVJMX1RPS0VOKSBwcml2YXRlIGJhc2VVcmw6IHN0cmluZyxcclxuICAgICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSkgeyBcclxuICBcclxuICAgICAgICB0aGlzLmJhc2VTZXJ2aWNlVXJsID0gdGhpcy5iYXNlVXJsICsgJy9hcGknOyAvLyBcImh0dHA6Ly9sb2NhbGhvc3Q6MzkzNzhcIjsgXFxcclxuICAgICAgICB0aGlzLnJlcG9ydFRlbXBsYXRlcyA9IFwiXCI7XHJcbiAgICAgIH1cclxuICBcclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIHZhciByZXBvcnRzOiB7IHJlcG9ydFNxbDogYW55OyByZXBvcnRJZDogYW55OyByZXBvcnRGaWx0ZXI6IGFueTsgY29ubmVjdEtleTogYW55OyB4OiBhbnk7IHk6IGFueTsgd2lkdGg6IGFueTsgaGVpZ2h0OiBhbnk7IH1bXSA9IFtdO1xyXG4gICAgICAgIHZhciBkYXNoYm9hcmRzOiB7IGlkOiBhbnk7IG5hbWU6IGFueTsgZGVzY3JpcHRpb246IGFueTsgc2VsZWN0ZWRSZXBvcnRzOiBhbnk7IHNjaGVkdWxlOmFueTsgdXNlcklkOiBhbnk7IHVzZXJSb2xlczogYW55OyB2aWV3T25seVVzZXJJZDogYW55OyB2aWV3T25seVVzZXJSb2xlczogYW55O2NsaWVudElkOmFueTtjYW5NYW5hZ2U6YW55IH1bXSB8IHsgaWQ6IG51bWJlcjsgfVtdID0gW107XHJcbiAgICAgICAgdmFyIGFkbWluTW9kZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdyZXBvcnRBZG1pbk1vZGUnKSA/PyBmYWxzZTsgICAgIFxyXG4gICAgICAgIGxldCBnZXREYXNoYm9hcmRzVXJsID0gdGhpcy5iYXNlU2VydmljZVVybCArIFwiL0RvdE5ldFJlcG9ydEFwaS9HZXREYXNoYm9hcmRzP2FkbWluTW9kZT1cIiArIGFkbWluTW9kZTtcclxuICAgICAgICBsZXQgbG9hZFNhdmVkRGFzaGJvYXJkID0gdGhpcy5iYXNlU2VydmljZVVybCArIFwiL0RvdE5ldFJlcG9ydEFwaS9Mb2FkU2F2ZWREYXNoYm9hcmRcIjtcclxuICAgICAgICBsZXQgZ2V0VXNlcnNBbmRSb2xlc1VybCA9IHRoaXMuYmFzZVNlcnZpY2VVcmwgKyBcIi9Eb3ROZXRSZXBvcnRBcGkvR2V0VXNlcnNBbmRSb2xlc1wiO1xyXG4gICAgICAgIGdldFVzZXJzQW5kUm9sZXNVcmwgPSBnZXRVc2Vyc0FuZFJvbGVzVXJsLnJlcGxhY2UoL1s/Jl0kLywgXCJcIik7XHJcblxyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuaHR0cC5nZXQoZ2V0RGFzaGJvYXJkc1VybCkuc3Vic2NyaWJlKChkYXNoYm9hcmREYXRhOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgZGFzaGJvYXJkRGF0YS5mb3JFYWNoKChkOmFueSk9PiB7XHJcbiAgICAgICAgICAgICAgICBkYXNoYm9hcmRzLnB1c2goeyBpZDogZC5JZCwgbmFtZTogZC5OYW1lLCBkZXNjcmlwdGlvbjogZC5EZXNjcmlwdGlvbiwgc2VsZWN0ZWRSZXBvcnRzOiBkLlNlbGVjdGVkUmVwb3J0cyxzY2hlZHVsZTpkLlNjaGVkdWxlLCB1c2VySWQ6IGQuVXNlcklkLCB1c2VyUm9sZXM6IGQuVXNlclJvbGVzLCB2aWV3T25seVVzZXJJZDogZC5WaWV3T25seVVzZXJJZCwgdmlld09ubHlVc2VyUm9sZXM6IGQuVmlld09ubHlVc2VyUm9sZXMsY2xpZW50SWQ6ZC5DbGllbnRJZCxjYW5NYW5hZ2U6ZC5DYW5NYW5hZ2UgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5xdWVyeVBhcmFtcyA9IHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXM7XHJcbiAgICAgICAgICAgIHZhciBkYXNoYm9hcmRJZCA9IHBhcnNlSW50KHRoaXMucXVlcnlQYXJhbXNbJ2lkJ10gfHwgJzAnKTtcclxuICAgICAgICAgICAgaWYgKCFkYXNoYm9hcmRJZCAmJiBkYXNoYm9hcmRzLmxlbmd0aCA+IDApIHsgZGFzaGJvYXJkSWQgPSBkYXNoYm9hcmRzWzBdLmlkOyB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLmh0dHAuZ2V0KGxvYWRTYXZlZERhc2hib2FyZCArIFwiP2lkPVwiICsgZGFzaGJvYXJkSWQpLnN1YnNjcmliZSgocmVwb3J0c0RhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVwb3J0c0RhdGEuZm9yRWFjaCgocjphbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXBvcnRzLnB1c2goeyByZXBvcnRTcWw6IHIuUmVwb3J0U3FsLCByZXBvcnRJZDogci5SZXBvcnRJZCwgcmVwb3J0RmlsdGVyOiByLlJlcG9ydEZpbHRlciwgY29ubmVjdEtleTogci5Db25uZWN0S2V5LCB4OiByLlgsIHk6IHIuWSwgd2lkdGg6IHIuV2lkdGgsIGhlaWdodDogci5IZWlnaHQgfSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmh0dHAuZ2V0KGdldFVzZXJzQW5kUm9sZXNVcmwpLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSkgPT4ge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gcmVzcG9uc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZtID0gbmV3IGRhc2hib2FyZFZpZXdNb2RlbCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1blJlcG9ydFVybDogdGhpcy5iYXNlU2VydmljZVVybCArICcvRG90TmV0UmVwb3J0L1JlcG9ydCcsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWNSZXBvcnRVcmw6IHRoaXMuYmFzZVNlcnZpY2VVcmwgKyAnL0RvdE5ldFJlcG9ydEFwaS9SdW5SZXBvcnQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBydW5MaW5rUmVwb3J0VXJsOnRoaXMuYmFzZVNlcnZpY2VVcmwgKycvRG90TmV0UmVwb3J0QXBpL1J1blJlcG9ydExpbmsnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRXaXphcmQ6ICQoXCIjbW9kYWwtcmVwb3J0YnVpbGRlclwiKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwTGlzdFVybDogdGhpcy5iYXNlU2VydmljZVVybCArICcvRG90TmV0UmVwb3J0QXBpL0dldExvb2t1cExpc3QnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcGlVcmw6IHRoaXMuYmFzZVNlcnZpY2VVcmwgKyAnL0RvdE5ldFJlcG9ydEFwaS9DYWxsUmVwb3J0QXBpJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuUmVwb3J0QXBpVXJsOiB0aGlzLmJhc2VTZXJ2aWNlVXJsICsgJy9Eb3ROZXRSZXBvcnRBcGkvUnVuUmVwb3J0QXBpJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2NoZW1hRnJvbVNxbDogdGhpcy5iYXNlU2VydmljZVVybCArICcvRG90TmV0UmVwb3J0QXBpL0dldFNjaGVtYUZyb21TcWwnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRNb2RlOiBcImV4ZWN1dGVcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGlua01vZGFsOiAkKFwiI2xpbmtNb2RhbFwiKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRPcHRpb25zTW9kYWw6ICQoXCIjZmllbGRPcHRpb25zTW9kYWxcIiksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydHM6IHJlcG9ydHMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhc2hib2FyZHM6IGRhc2hib2FyZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJTZXR0aW5nczogcmVzdWx0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyczogcmVzdWx0LnVzZXJzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyUm9sZXM6IHJlc3VsdC51c2VyUm9sZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93QWRtaW46IHJlc3VsdC5hbGxvd0FkbWluTW9kZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUZpbHRlcnM6IHJlc3VsdC5kYXRhRmlsdGVycyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGFzaGJvYXJkSWQ6IGRhc2hib2FyZElkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgcnVuRXhwb3J0VXJsOiB0aGlzLmJhc2VTZXJ2aWNlVXJsICsgJy9Eb3ROZXRSZXBvcnRBcGkvJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRSZXBvcnRVcmw6IHRoaXMuYmFzZVVybCArICcvRG90TmV0UmVwb3J0L1JlcG9ydFByaW50JyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbG9hZFNhdmVkRGFzaGJvcmRVcmw6IHRoaXMuYmFzZVNlcnZpY2VVcmwgKyAnL0RvdE5ldFJlcG9ydEFwaS9Mb2FkU2F2ZWREYXNoYm9hcmQnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBnZXREYXNoYm9yZHNVcmw6IHRoaXMuYmFzZVNlcnZpY2VVcmwgKycvRG90TmV0UmVwb3J0QXBpL0dldERhc2hib2FyZHMnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRUaW1lWm9uZXNVcmw6IHRoaXMuYmFzZVNlcnZpY2VVcmwgKyAnL0RvdE5ldFJlcG9ydEFwaS9HZXRBbGxUaW1lem9uZXMnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRVc2Vyc0FuZFJvbGVzVXJsOiBnZXRVc2Vyc0FuZFJvbGVzVXJsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzYW1lUGFnZU9uUnVuOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIHZtLmluaXQoMCwgcmVzdWx0Lm5vQWNjb3VudCkuZG9uZSgoKT0+e1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJLT1RlbXBsYXRlcygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBrby5hcHBseUJpbmRpbmdzKHZtLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG90LW5ldC1yZXBvcnQnKSk7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iaW5kR3JpZEluaXQodm0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJpbmRXaW5kb3dSZXNpemUodm0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gIFxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgICBrby5jbGVhbk5vZGUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvdC1uZXQtcmVwb3J0JykpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGluaXQoKSB7XHJcbiAgICB0aGlzLm5nT25Jbml0KCk7XHJcbiAgfVxyXG4gIFxyXG4gIHByaXZhdGUgcmVuZGVyS09UZW1wbGF0ZXMoKSB7XHJcbiAgXHJcbiAgICB0aGlzLnJlcG9ydFRlbXBsYXRlcyA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKGA8IS0tIERvdG5ldCBSZXBvcnQgSFRNTCBUZW1wbGF0ZXMgLS0+XHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwicmVwb3J0LWZpbHRlclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIiBkYXRhLWJpbmQ9XCJhdHRyOiB7aWQ6ICdmaWx0ZXItJyt1aUlkIH1cIj5cclxuICAgICAgICA8IS0tIGtvIGlmOiAhaGFzRm9yZWlnbktleS0tPlxyXG4gICAgICAgIDwhLS0ga28gaWY6IFsnRGF0ZVRpbWUnLCdEYXRlJywnVGltZSddLmluZGV4T2YoZmllbGRUeXBlKSAhPSAtMSAtLT5cclxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7XCI+XHJcbiAgICAgICAgICAgIDwhLS0ga28gaWY6IFsnPScsJz4nLCc8JywnPj0nLCc8PScsICdub3QgZXF1YWwnXS5pbmRleE9mKCRwYXJlbnQuT3BlcmF0b3IoKSkgIT0gLTEgLS0+XHJcbiAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbFwiIGRhdGEtYmluZD1cImRhdGVwaWNrZXI6ICRwYXJlbnQuZm10VmFsdWUsIGRhdGVwaWNrZXJPcHRpb25zOiB7dmFsdWU6ICRwYXJlbnQuVmFsdWUsIGRhdGVGb3JtYXQ6IGRhdGVGb3JtYXQoKSA9PT0gJ0N1c3RvbScgPyBjdXN0b21EYXRlRm9ybWF0KCkucmVwbGFjZSgveXl5eS9nLCAneXknKSA6ICRyb290LmRhdGVGb3JtYXRNYXBwaW5nc1tkYXRlRm9ybWF0KCldfVwiIHJlcXVpcmVkIC8+XHJcbiAgICAgICAgICAgIDwhLS0ga28gaWY6IGZpZWxkVHlwZT09J1RpbWUnIHx8IGZpZWxkRm9ybWF0KCk9PSdUaW1lJyB8fCBmaWVsZEZvcm1hdCgpPT0nRGF0ZSBhbmQgVGltZSctLT5cclxuICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdHlwZT1cInRpbWVcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTokcGFyZW50LlZhbHVldGltZVwiIHJlcXVpcmVkPlxyXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPCEtLSBrbyBpZjogWydiZXR3ZWVuJ10uaW5kZXhPZigkcGFyZW50Lk9wZXJhdG9yKCkpICE9IC0xIC0tPlxyXG4gICAgICAgIEZyb21cclxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7XCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCByZXF1aXJlZCBjbGFzcz1cImZvcm0tY29udHJvbCBmcm9tLWRhdGVcIiBkYXRhLWJpbmQ9XCJkYXRlcGlja2VyOiAkcGFyZW50LmZtdFZhbHVlLCBkYXRlcGlja2VyT3B0aW9uczoge3ZhbHVlOiAkcGFyZW50LlZhbHVlLCBkYXRlRm9ybWF0OiBkYXRlRm9ybWF0KCkgPT09ICdDdXN0b20nID8gY3VzdG9tRGF0ZUZvcm1hdCgpLnJlcGxhY2UoL3l5eXkvZywgJ3l5JykgOiAkcm9vdC5kYXRlRm9ybWF0TWFwcGluZ3NbZGF0ZUZvcm1hdCgpXX1cIiAvPlxyXG4gICAgICAgICAgICA8IS0tIGtvIGlmOmZpZWxkVHlwZT09J1RpbWUnIHx8IGZpZWxkRm9ybWF0KCk9PSdUaW1lJyB8fCBmaWVsZEZvcm1hdCgpPT0nRGF0ZSBhbmQgVGltZSctLT5cclxuICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdHlwZT1cInRpbWVcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTokcGFyZW50LlZhbHVldGltZVwiIHJlcXVpcmVkPlxyXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICB0b1xyXG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDtcIj5cclxuICAgICAgICAgICAgPGlucHV0IGRhdGEtYmluZD1cImRhdGVwaWNrZXI6ICRwYXJlbnQuZm10VmFsdWUyLCBkYXRlcGlja2VyT3B0aW9uczoge3ZhbHVlOiAkcGFyZW50LlZhbHVlMiwgZGF0ZUZvcm1hdDogZGF0ZUZvcm1hdCgpID09PSAnQ3VzdG9tJyA/IGN1c3RvbURhdGVGb3JtYXQoKS5yZXBsYWNlKC95eXl5L2csICd5eScpIDogJHJvb3QuZGF0ZUZvcm1hdE1hcHBpbmdzW2RhdGVGb3JtYXQoKV19XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgdG8tZGF0ZVwiIHJlcXVpcmVkIC8+XHJcbiAgICAgICAgICAgIDwhLS0ga28gaWY6ZmllbGRUeXBlPT0nVGltZScgfHwgZmllbGRGb3JtYXQoKT09J1RpbWUnIHx8IGZpZWxkRm9ybWF0KCk9PSdEYXRlIGFuZCBUaW1lJy0tPlxyXG4gICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwidGltZVwiIGRhdGEtYmluZD1cInZhbHVlOiRwYXJlbnQuVmFsdWV0aW1lMlwiIHJlcXVpcmVkPlxyXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICA8IS0tIGtvIGlmOiBbJ3JhbmdlJ10uaW5kZXhPZigkcGFyZW50Lk9wZXJhdG9yKCkpICE9IC0xIC0tPlxyXG4gICAgICAgIDxzZWxlY3QgZGF0YS1iaW5kPVwidmFsdWU6ICRwYXJlbnQuVmFsdWVcIiBjbGFzcz1cImZvcm0tc2VsZWN0XCIgcmVxdWlyZWQ+XHJcbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj48L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbj5Ub2RheTwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uPlRvZGF5ICs8L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbj5Ub2RheSAtPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24+WWVzdGVyZGF5PC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24+VGhpcyBXZWVrPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24+TGFzdCBXZWVrPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24+VGhpcyBNb250aDwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uPkxhc3QgTW9udGg8L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbj5UaGlzIFllYXI8L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbj5MYXN0IFllYXI8L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbj5UaGlzIFdlZWsgVG8gRGF0ZTwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uPlRoaXMgTW9udGggVG8gRGF0ZTwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uPlRoaXMgWWVhciBUbyBEYXRlPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24+TGFzdCAzMCBEYXlzPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDwhLS08b3B0aW9uPlRoaXMgTW9udGggTGFzdCBZZWFyPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24+TGFzdCBNb250aCBMYXN0IFllYXI8L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbj5UaGlzIFF1YXJ0ZXI8L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbj5MYXN0IFF1YXJ0ZXI8L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbj5GaXJzdCBRdWFydGVyPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24+U2Vjb25kIFF1YXJ0ZXI8L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbj5UaGlyZCBRdWFydGVyPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24+Rm91cnRoIFF1YXJ0ZXI8L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbj5OZXh0IDYgTW9udGhzPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24+TGFzdCA2IE1vbnRoczwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uPjIgWWVhcnMgYWdvPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24+MyBZZWFycyBhZ288L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbj40IFllYXJzIGFnbzwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uPjUgWWVhcnMgYWdvPC9vcHRpb24+LS0+XHJcbiAgICAgICAgICAgIDxvcHRncm91cCBsYWJlbD1cIkNvbXBhcmlzb24gT3B0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgPG9wdGlvbj4+PSBUb2RheTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPG9wdGlvbj48PSBUb2RheTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPG9wdGlvbj4+PSBUb2RheSArPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8b3B0aW9uPjw9IFRvZGF5ICs8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgIDxvcHRpb24+Pj0gVG9kYXkgLTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPG9wdGlvbj48PSBUb2RheSAtPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDwvb3B0Z3JvdXA+XHJcbiAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZjogJHBhcmVudC5WYWx1ZSgpLmluZGV4T2YoJ1RvZGF5ICsnKSA+PSAwIHx8ICRwYXJlbnQuVmFsdWUoKS5pbmRleE9mKCdUb2RheSAtJykgPj0gMFwiIGNsYXNzPVwiZm9ybS1ncm91cCBwdWxsLWxlZnRcIiBzdHlsZT1cInBhZGRpbmctdG9wOiA1cHg7XCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgaW5wdXQtc20gcHVsbC1sZWZ0XCIgc3R5bGU9XCJ3aWR0aDogODBweDtcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogJHBhcmVudC5WYWx1ZTJcIiByZXF1aXJlZCAvPjxzcGFuIHN0eWxlPVwicGFkZGluZzogNXB4IDVweDtcIiBjbGFzcz1cInB1bGwtbGVmdFwiPiBkYXlzPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgIDwhLS0ga28gaWY6IFsnSW50JywnTW9uZXknLCdGbG9hdCcsJ0RvdWJsZSddLmluZGV4T2YoZmllbGRUeXBlKSAhPSAtMSAtLT5cclxuICAgICAgICAgICAgPCEtLSBrbyBpZjogWyc9JywnPicsJzwnLCc+PScsJzw9JywgJ25vdCBlcXVhbCddLmluZGV4T2YoJHBhcmVudC5PcGVyYXRvcigpKSAhPSAtMSAmJiBbJ2lzIGJsYW5rJywgJ2lzIG5vdCBibGFuaycsICdpcyBudWxsJywgJ2lzIG5vdCBudWxsJ10uaW5kZXhPZigkcGFyZW50Lk9wZXJhdG9yKCkpID09IC0xIC0tPlxyXG4gICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwibnVtYmVyXCIgZGF0YS1iaW5kPVwidmFsdWU6ICRwYXJlbnQuVmFsdWUsIGRpc2FibGU6ICRwYXJlbnQuT3BlcmF0b3IoKSA9PSAnaXMgZGVmYXVsdCdcIiByZXF1aXJlZCAvPlxyXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgIDwhLS0ga28gaWY6IFsnaW4nLCAnbm90IGluJ10uaW5kZXhPZigkcGFyZW50Lk9wZXJhdG9yKCkpICE9IC0xIC0tPlxyXG4gICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwidGV4dFwiIGRhdGEtYmluZD1cInZhbHVlOiAkcGFyZW50LlZhbHVlXCIgcmVxdWlyZWQgLz5cclxuICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgIDwhLS0ga28gaWY6IFsnYmV0d2VlbiddLmluZGV4T2YoJHBhcmVudC5PcGVyYXRvcigpKSAhPSAtMSAtLT5cclxuICAgICAgICAgICAgRnJvbVxyXG4gICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwibnVtYmVyXCIgZGF0YS1iaW5kPVwidmFsdWU6ICRwYXJlbnQuVmFsdWVcIiByZXF1aXJlZCAvPlxyXG4gICAgICAgICAgICBUb1xyXG4gICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwibnVtYmVyXCIgZGF0YS1iaW5kPVwidmFsdWU6ICRwYXJlbnQuVmFsdWUyXCIgcmVxdWlyZWQgLz5cclxuICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICA8IS0tIGtvIGlmOiBmaWVsZFR5cGU9PSdCb29sZWFuJyAmJiBbJ2lzIGJsYW5rJywgJ2lzIG5vdCBibGFuaycsICdpcyBudWxsJywgJ2lzIG5vdCBudWxsJ10uaW5kZXhPZigkcGFyZW50Lk9wZXJhdG9yKCkpID09IC0xIC0tPlxyXG4gICAgICAgIDxzZWxlY3QgcmVxdWlyZWQgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIGRhdGEtYmluZD1cInZhbHVlOiAkcGFyZW50LlZhbHVlLCBkaXNhYmxlOiAkcGFyZW50Lk9wZXJhdG9yKCkgPT0gJ2lzIGRlZmF1bHQnXCI+XHJcbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIxXCI+WWVzPC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIwXCI+Tm88L29wdGlvbj5cclxuICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICA8IS0tIGtvIGlmOiBbJ0ludCcsJ01vbmV5JywnRmxvYXQnLCdEb3VibGUnLCdEYXRlJywnRGF0ZVRpbWUnLCdUaW1lJywnQm9vbGVhbiddLmluZGV4T2YoZmllbGRUeXBlKSA9PSAtMSAmJiBbJ2lzIGJsYW5rJywgJ2lzIG5vdCBibGFuaycsICdpcyBudWxsJywgJ2lzIG5vdCBudWxsJ10uaW5kZXhPZigkcGFyZW50Lk9wZXJhdG9yKCkpID09IC0xIC0tPlxyXG4gICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbFwiIHR5cGU9XCJ0ZXh0XCIgZGF0YS1iaW5kPVwidmFsdWU6ICRwYXJlbnQuVmFsdWUsIGRpc2FibGU6ICRwYXJlbnQuT3BlcmF0b3IoKSA9PSAnaXMgZGVmYXVsdCcsYXR0cjoge2lkOiAnY3RsLScgKyAkZWxlbWVudC5jbG9zZXN0KCdbZGF0YS1wYXJlbnRwcmVmaXhdJykuZ2V0QXR0cmlidXRlKCdkYXRhLXBhcmVudHByZWZpeCcpICsgJy0nICsgdWlJZH1cIiByZXF1aXJlZCAvPlxyXG4gICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgIDwhLS0ga28gaWY6IGhhc0ZvcmVpZ25LZXkgJiYgJHBhcmVudC5PcGVyYXRvcigpICE9ICdhbGwnIC0tPlxyXG4gICAgICAgIDwhLS0ga28gaWY6IGhhc0ZvcmVpZ25QYXJlbnRLZXkgJiYgJHBhcmVudC5zaG93UGFyZW50RmlsdGVyKCkgLS0+XHJcbiAgICAgICAgPHNlbGVjdCBtdWx0aXBsZSBjbGFzcz1cImZvcm0tY29udHJvbFwiIGRhdGEtYmluZD1cInNlbGVjdDI6IHsgZHJvcGRvd25QYXJlbnQ6ICcjZmlsdGVyLScrdWlJZCwgcGxhY2Vob2xkZXI6ICdQbGVhc2UgQ2hvb3NlJywgYWxsb3dDbGVhcjogdHJ1ZSB9LCBvcHRpb25zOiAkcGFyZW50LlBhcmVudExpc3QsIG9wdGlvbnNUZXh0OiAndGV4dCcsIG9wdGlvbnNWYWx1ZTogJHBhcmVudC5Jc0NvbmRpdGlvbmFsRmlsdGVyID8gJ3RleHQnOiAnaWQnLCBzZWxlY3RlZE9wdGlvbnM6ICRwYXJlbnQuUGFyZW50SW5cIj48L3NlbGVjdD5cclxuICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICA8IS0tIGtvIGlmOiAkcGFyZW50Lk9wZXJhdG9yKCk9PSc9Jy0tPlxyXG4gICAgICAgIDxzZWxlY3QgcmVxdWlyZWQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBkYXRhLWJpbmQ9XCJzZWxlY3QyOiB7IGRyb3Bkb3duUGFyZW50OiAnI2ZpbHRlci0nK3VpSWQsIHBsYWNlaG9sZGVyOiAnUGxlYXNlIENob29zZScsIGFsbG93Q2xlYXI6IHRydWUgfSwgb3B0aW9uczogJHBhcmVudC5Mb29rdXBMaXN0LCBvcHRpb25zVGV4dDogJ3RleHQnLCBvcHRpb25zVmFsdWU6ICAgJHBhcmVudC5Jc0NvbmRpdGlvbmFsRmlsdGVyID8gJ3RleHQnOiAnaWQnLCB2YWx1ZTogJHBhcmVudC5WYWx1ZSwgb3B0aW9uc0NhcHRpb246ICdQbGVhc2UgQ2hvb3NlJ1wiPjwvc2VsZWN0PlxyXG4gICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgIDwhLS0ga28gaWY6ICRwYXJlbnQuT3BlcmF0b3IoKT09J2luJyB8fCAkcGFyZW50Lk9wZXJhdG9yKCk9PSdub3QgaW4nLS0+XHJcbiAgICAgICAgPHNlbGVjdCByZXF1aXJlZCBtdWx0aXBsZSBjbGFzcz1cImZvcm0tY29udHJvbFwiIGRhdGEtYmluZD1cInNlbGVjdDI6IHsgZHJvcGRvd25QYXJlbnQ6ICcjZmlsdGVyLScrdWlJZCwgcGxhY2Vob2xkZXI6ICdQbGVhc2UgQ2hvb3NlJywgYWxsb3dDbGVhcjogdHJ1ZSB9LCBvcHRpb25zOiAkcGFyZW50Lkxvb2t1cExpc3QsIG9wdGlvbnNUZXh0OiAndGV4dCcsIG9wdGlvbnNWYWx1ZTogJHBhcmVudC5Jc0NvbmRpdGlvbmFsRmlsdGVyID8gJ3RleHQnOiAnaWQnLCBzZWxlY3RlZE9wdGlvbnM6ICRwYXJlbnQuVmFsdWVJblwiPjwvc2VsZWN0PlxyXG4gICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgPC9kaXY+XHJcbjwvc2NyaXB0PlxyXG5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJwYWdlci10ZW1wbGF0ZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInBhZ2VyLWNvbnRhaW5lciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtd3JhcCBnYXAtMlwiPlxyXG5cclxuICAgICAgICA8IS0tIFJvd3MgcGVyIHBhZ2UgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTEgbXMtMVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGxcIj5QYWdlIHNpemU6PC9zcGFuPlxyXG4gICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3QgZm9ybS1zZWxlY3Qtc20gdy1hdXRvXCJcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJvcHRpb25zOiBwYWdlU2l6ZU9wdGlvbnMsIHZhbHVlOiBwYWdlU2l6ZVwiPlxyXG4gICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBJbm5lciBib3JkZXIgYmxvY2sgZm9yIHBhZ2UgbmF2aWdhdGlvbiBjb250cm9scyAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMSBtcy0zXCI+XHJcbiAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgdGl0bGU9XCJGaXJzdFwiIGRhdGEtYmluZD1cImNsaWNrOiBmaXJzdCwgZW5hYmxlOiAhaXNGaXJzdFBhZ2UoKVwiXHJcbiAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSBidG4tc20gcGFnZXItYnRuIG1zLTFcIiBhcmlhLWxhYmVsPVwiRmlyc3QgUGFnZVwiPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1hbmdsZS1kb3VibGUtbGVmdFwiPjwvaT5cclxuICAgICAgICAgICAgPC9hPlxyXG5cclxuICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiB0aXRsZT1cIlByZXZpb3VzXCIgZGF0YS1iaW5kPVwiY2xpY2s6IHByZXZpb3VzLCBlbmFibGU6ICFpc0ZpcnN0UGFnZSgpXCJcclxuICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5IGJ0bi1zbSBwYWdlci1idG5cIiBhcmlhLWxhYmVsPVwiUHJldmlvdXMgUGFnZVwiPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1hbmdsZS1sZWZ0XCI+PC9pPlxyXG4gICAgICAgICAgICA8L2E+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsXCI+UGFnZTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgbWluPVwiMVwiIHBhdHRlcm49XCJbMC05XSpcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbSB0ZXh0LWNlbnRlciBwYWdlci1pbnB1dFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogNjBweDtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cInZhbHVlOiBjdXJyZW50UGFnZSwgYXR0cjogeyBtYXg6IHBhZ2VzKCkgfVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LW11dGVkIHNtYWxsXCI+b2Y8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGxcIiBkYXRhLWJpbmQ9XCJ0ZXh0OiBwYWdlc1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8YSBocmVmPVwiI1wiIHRpdGxlPVwiTmV4dFwiIGRhdGEtYmluZD1cImNsaWNrOiBuZXh0LCBlbmFibGU6ICFpc0xhc3RQYWdlKClcIlxyXG4gICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1zZWNvbmRhcnkgYnRuLXNtIHBhZ2VyLWJ0blwiIGFyaWEtbGFiZWw9XCJOZXh0IFBhZ2VcIj5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYW5nbGUtcmlnaHRcIj48L2k+XHJcbiAgICAgICAgICAgIDwvYT5cclxuXHJcbiAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgdGl0bGU9XCJMYXN0XCIgZGF0YS1iaW5kPVwiY2xpY2s6IGxhc3QsIGVuYWJsZTogIWlzTGFzdFBhZ2UoKVwiXHJcbiAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSBidG4tc20gcGFnZXItYnRuXCIgYXJpYS1sYWJlbD1cIkxhc3QgUGFnZVwiPlxyXG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1hbmdsZS1kb3VibGUtcmlnaHRcIj48L2k+XHJcbiAgICAgICAgICAgIDwvYT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L3NjcmlwdD5cclxuXHJcblxyXG5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJyZXBvcnQtY29sdW1uLWhlYWRlclwiPlxyXG4gICAgPCEtLSBrbyBmb3JlYWNoOiBDb2x1bW5zIC0tPlxyXG4gICAgPHRoIGRhdGEtYmluZD1cImF0dHI6IHsgaWQ6ICFJc1Bpdm90RmllbGQgPyBmaWVsZElkIDogJ3Bpdm90LS0nICsgZmllbGROYW1lIH0sIHN0eWxlOiB7J3RleHQtYWxpZ24nOiBmaWVsZEFsaWduKCkgPyBmaWVsZEFsaWduKCkgOiAoSXNOdW1lcmljID8gJ3JpZ2h0JyA6ICdsZWZ0JyksICdiYWNrZ3JvdW5kLWNvbG9yJzogaGVhZGVyQmFja0NvbG9yIH0sIGhpZGRlbjogb3V0ZXJHcm91cFwiIHN0eWxlPVwiYm9yZGVyLXJpZ2h0OiAxcHggc29saWQ7XCI+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIiBkYXRhLWJpbmQ9XCJpZjogISRwYXJlbnQuSXNEcmlsbERvd24oKVwiIHN0eWxlPVwicGFkZGluZy1yaWdodDogNXB4O1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcHVwXCI+XHJcbiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGRhdGEtYnMtdG9nZ2xlPVwiZHJvcGRvd25cIiBhcmlhLWhhc3BvcHVwPVwiZmFsc2VcIiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWVsbGlwc2lzLXYgc29ydGFibGVcIiB0aXRsZT1cIkRyYWcgdG8gcmVvcmRlclwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgIDx1bCBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAhSXNQaXZvdEZpZWxkXCIgY2xhc3M9XCJkcm9wZG93bi1tZW51XCIgc3R5bGU9XCJ6LWluZGV4OiAxMDAxO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gc21hbGxcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAhSXNOdW1lcmljXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgZGF0YS1iaW5kPVwiY2xpY2s6IHRvZ2dsZU91dGVyR3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtY2xvbmVcIj48L3NwYW4+IE91dGVyIEdyb3VwXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImRyb3Bkb3duLWl0ZW0gc21hbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBkYXRhLWJpbmQ9XCJjbGljazogc2V0dXBGaWVsZE9wdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtZ2VhclwiPjwvc3Bhbj4gRmllbGQgU2V0dGluZ3NcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInN0eWxlOiB7J3dpZHRoJzogZmllbGRXaWR0aH1cIj5cclxuICAgICAgICAgICAgPCEtLSBrbyBpZjogJHBhcmVudHNbM10udXNlU3RvcmVkUHJvYyA/ICRwYXJlbnRzWzNdLnVzZVN0b3JlZFByb2MoKSA6ICgkcGFyZW50c1s1XS51c2VTdG9yZWRQcm9jID8gJHBhcmVudHNbNV0udXNlU3RvcmVkUHJvYygpIDogZmFsc2UpIC0tPlxyXG4gICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBmaWVsZExhYmVsKCkgPyBmaWVsZExhYmVsKCkgOiBmaWVsZE5hbWUsIHN0eWxlOiB7J2NvbG9yJzogaGVhZGVyRm9udENvbG9yLCAnZm9udC13ZWlnaHQnOiBoZWFkZXJGb250Qm9sZCgpID8gJ2JvbGQnIDogJ25vcm1hbCd9XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgPCEtLSBrbyBpZm5vdDogJHBhcmVudHNbM10udXNlU3RvcmVkUHJvYyA/ICRwYXJlbnRzWzNdLnVzZVN0b3JlZFByb2MoKSA6ICgkcGFyZW50c1s1XS51c2VTdG9yZWRQcm9jID8gJHBhcmVudHNbNV0udXNlU3RvcmVkUHJvYygpIDogZmFsc2UpICAtLT5cclxuICAgICAgICAgICAgPGEgaHJlZj1cIlwiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpeyBpZiAoIUlzUGl2b3RGaWVsZCkgeyAkcGFyZW50c1twYWdlckluZGV4KCRwYXJlbnRzKV0uY2hhbmdlU29ydChTcWxGaWVsZCk7IH0gfSwgc3R5bGU6IHsnY29sb3InOiBoZWFkZXJGb250Q29sb3IsICdmb250LXdlaWdodCc6IGhlYWRlckZvbnRCb2xkKCkgPyAnYm9sZCcgOiAnbm9ybWFsJ31cIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cInRleHQ6ICRwYXJlbnQuSXNEcmlsbERvd24oKSAmJiBmaWVsZExhYmVsMigpID8gZmllbGRMYWJlbDIoKSA6IChmaWVsZExhYmVsKCkgPyBmaWVsZExhYmVsKCkgOiBmaWVsZE5hbWUpXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogJHBhcmVudHNbcGFnZXJJbmRleCgkcGFyZW50cyldLnBhZ2VyLnNvcnRDb2x1bW4oKSA9PT0gU3FsRmllbGQgPyAoJHBhcmVudHNbcGFnZXJJbmRleCgkcGFyZW50cyldLnBhZ2VyLnNvcnREZXNjZW5kaW5nKCkgPyAnJiM5NjYwOycgOiAnJiM5NjUwOycpIDogJydcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L3RoPlxyXG4gICAgPCEtLSAva28gLS0+XHJcbjwvc2NyaXB0PlxyXG5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJyZXBvcnQtd2lkZ2V0XCI+XHJcbiAgICA8ZGl2IHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyOyB3aWR0aDogMTAwJTtmb250LXNpemU6IDQ4cHhcIj5cclxuICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBSb3dzLmxlbmd0aCA8IDFcIiB0aXRsZT1cIk5vIGRhdGEgZm91bmRcIj4vPC9zcGFuPlxyXG5cclxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiBSb3dzLmxlbmd0aCA+IDBcIj5cclxuICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ3aXRoOiAkcGFyZW50LnJvd3NbMF0uSXRlbXNbMF1cIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cImh0bWw6IGZvcm1hdHRlZFZhbFwiPjwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiAkcGFyZW50LlJvd3MubGVuZ3RoID4gMSA/ICgkcGFyZW50c1skcGFyZW50cy5sZW5ndGgtMl0uc2hvd1ByaW9ySW5LcGkgIT0gdW5kZWZpbmVkID8gJHBhcmVudHNbJHBhcmVudHMubGVuZ3RoLTJdLnNob3dQcmlvckluS3BpKCkgOiAkcGFyZW50c1skcGFyZW50cy5sZW5ndGgtMV0uc2hvd1ByaW9ySW5LcGkoKSkgOiBmYWxzZSAtLT5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cInN0eWxlOiB7J2NvbG9yJzogJHBhcmVudC5jYWxjdWxhdGVSYXRlKCkgPiAwID8gJ2dyZWVuJyA6ICdyZWQnLCAnZm9udC1zaXplJzogJzI0cHgnfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cImh0bWw6ICRwYXJlbnQuY2FsY3VsYXRlUmF0ZSgpICsgJyUnXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwic3R5bGU6IHsnZm9udC1zaXplJzogJzI0cHgnLCAnY29sb3InOiAnZ3JheSd9LCBjc3M6IHsndGV4dC1tdXRlZCc6IHRydWV9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgUHJpb3IgUGVyaW9kOiA8c3BhbiBkYXRhLWJpbmQ9XCJodG1sOiAkcGFyZW50LlJvd3NbMV0uSXRlbXNbMF0uZm9ybWF0dGVkVmFsXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG48L3NjcmlwdD5cclxuXHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwicmVwb3J0LWNvbHVtblwiPlxyXG4gICAgPCEtLSBrbyBmb3JlYWNoOiBJdGVtcyAtLT5cclxuICAgIDx0ZCBkYXRhLWJpbmQ9XCJoaWRkZW46IG91dGVyR3JvdXAsIHN0eWxlOiB7J2JhY2tncm91bmQtY29sb3InOiBfYmFja0NvbG9yID8/IGJhY2tDb2xvcigpLCAnY29sb3InOiBfZm9udENvbG9yID8/IGZvbnRDb2xvcigpLCAnZm9udC13ZWlnaHQnOiBmb250Qm9sZCgpIHx8IF9mb250Qm9sZCA/ICdib2xkJyA6ICdub3JtYWwnLCAndGV4dC1hbGlnbic6IGZpZWxkQWxpZ24oKSA/IGZpZWxkQWxpZ24oKSA6IChDb2x1bW4uSXNOdW1lcmljID8gJ3JpZ2h0JyA6ICdsZWZ0Jyl9XCI+XHJcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJzdHlsZTogeyd3aWR0aCc6IGZpZWxkV2lkdGggfSwgY3NzOiB7ICd0ZXh0LXdyYXAnOiBmaWVsZFdpZHRoIH1cIj5cclxuICAgICAgICAgICAgPCEtLSBrbyBpZjogTGlua1RvLS0+XHJcbiAgICAgICAgICAgIDxhIGRhdGEtYmluZD1cImF0dHI6IHtocmVmOiBMaW5rVG99XCIgdGFyZ2V0PVwiX2JsYW5rXCI+PHNwYW4gZGF0YS1iaW5kPVwiaHRtbDogZm9ybWF0dGVkVmFsXCI+PC9zcGFuPjwvYT5cclxuICAgICAgICAgICAgPCEtLSAva28tLT5cclxuICAgICAgICAgICAgPCEtLSBrbyBpZm5vdDogTGlua1RvLS0+XHJcbiAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cImh0bWw6IGZvcm1hdHRlZFZhbFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPCEtLSAva28tLT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvdGQ+XHJcbjwvc2NyaXB0PlxyXG5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJyZXBvcnQtcGl2b3RcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlXCIgZGF0YS1iaW5kPVwid2l0aDogUmVwb3J0RGF0YVwiPlxyXG4gICAgICAgIDx0YWJsZSBjbGFzcz1cInRhYmxlIHRhYmxlLXN0cmlwZWQgdGFibGUtaG92ZXIgdGFibGUtY29uZGVuc2VkXCI+XHJcbiAgICAgICAgICAgIDx0aGVhZCBzdHlsZT1cInBvc2l0aW9uOiBzdGlja3k7IHRvcDogLTFweDsgei1pbmRleDogMjtcIj5cclxuICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICA8dGg+PC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IFJvd3MgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBJdGVtc1swXS5Gb3JtYXR0ZWRWYWx1ZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPC90aGVhZD5cclxuICAgICAgICAgICAgPHRib2R5IGRhdGEtYmluZD1cImZvcmVhY2g6IENvbHVtbnNcIj5cclxuICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiAkaW5kZXgoKSA+IDAgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBmaWVsZExhYmVsIHx8IENvbHVtbk5hbWVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6ICRwYXJlbnQuUm93cyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgZGF0YS1iaW5kPVwic3R5bGU6IHsnYmFja2dyb3VuZC1jb2xvcic6ICRwYXJlbnQuYmFja0NvbG9yLCAnY29sb3InOiAkcGFyZW50LmZvbnRDb2xvciwgJ2ZvbnQtd2VpZ2h0JzogJHBhcmVudC5mb250Qm9sZCgpID8gJ2JvbGQnIDogJ25vcm1hbCcsICd0ZXh0LWFsaWduJzogJHBhcmVudC5maWVsZEFsaWduID8gJHBhcmVudC5maWVsZEFsaWduIDogKCRwYXJlbnQuSXNOdW1lcmljID8gJ3JpZ2h0JyA6ICdsZWZ0JykgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBJdGVtc1skcGFyZW50Q29udGV4dC4kaW5kZXgoKV0uRm9ybWF0dGVkVmFsdWVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgPC90YWJsZT5cclxuXHJcbiAgICA8L2Rpdj5cclxuXHJcbjwvc2NyaXB0PlxyXG5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJyZXBvcnQtdGFibGVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlXCI+XHJcbiAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgdGFibGUtaG92ZXIgdGFibGUtY29uZGVuc2VkXCIgZGF0YS1iaW5kPVwiYXR0cjoge2NsYXNzOiAndGFibGUgdGFibGUtc3RyaXBlZCB0YWJsZS1ob3ZlciB0YWJsZS1jb25kZW5zZWQgJyArICRwYXJlbnRzWzJdLnNlbGVjdGVkU3R5bGUoKX1cIj5cclxuICAgICAgICAgICAgPHRoZWFkIHN0eWxlPVwicG9zaXRpb246IHN0aWNreTsgdG9wOiAtMXB4OyB6LWluZGV4OiAyO1wiIGRhdGEtYmluZD1cImlmOiAhJHBhcmVudHNbMl0ubm9IZWFkZXJSb3coKVwiPlxyXG4gICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwibm8taGlnaGxpZ2h0XCIgZGF0YS1iaW5kPVwic29ydGFibGVDb2x1bW5zOiB7IGhhbmRsZTogJy5zb3J0YWJsZScsIGN1cnNvcjogJ21vdmUnLCBwbGFjZWhvbGRlcjogJ2Ryb3AtaGlnaGxpZ2h0JyxzZWxlY3RlZEZpZWxkczogJHBhcmVudHNbMl0uU2VsZWN0ZWRGaWVsZHMgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gaWY6ICRwYXJlbnRDb250ZXh0LiRwYXJlbnRDb250ZXh0LiRwYXJlbnQuY2FuRHJpbGxkb3duKCkgJiYgIUlzRHJpbGxEb3duKCkgJiYgIUNhbkV4cGFuZE9wdGlvbigpICYmICghJHBhcmVudHNbMl0uaGFzUGl2b3RDb2x1bW4oKSB8fCAoJHBhcmVudHNbMl0uaGFzUGl2b3RDb2x1bW4oKSAmJiAkcGFyZW50c1syXS5hcHBTZXR0aW5ncy51c2VBbHRQaXZvdCkpIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiAzMHB4OyBib3JkZXItbGVmdDogMXB4IHNvbGlkO1wiIGRhdGEtYmluZD1cInN0eWxlOiB7J2JhY2tncm91bmQtY29sb3InOiBDb2x1bW5zWzBdLmhlYWRlckJhY2tDb2xvcn1cIj48L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6ICdyZXBvcnQtY29sdW1uLWhlYWRlcicsIGRhdGE6ICRkYXRhIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvLS0+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgICAgICA8dGJvZHkgZGF0YS1iaW5kPVwiYXR0cjoge2lkOiAncmVwb3J0LXRhYmxlLWJvZHknICsgJHBhcmVudHNbMl0uUmVwb3J0SUQoKX1cIj5cclxuICAgICAgICAgICAgICAgIDx0ciBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogUm93cy5sZW5ndGggPCAxXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIGRhdGEtYmluZD1cImF0dHI6e2NvbHNwYW46IENvbHVtbnMubGVuZ3RoICsgMX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgTm8gcmVjb3JkcyBmb3VuZFxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0ga28gaWY6ICEkcGFyZW50c1syXS51c2VSZW5kZXJUYWJsZSgpIC0tPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiAkcGFyZW50LnJvd3MgIC0tPlxyXG4gICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gaWY6ICRwYXJlbnRDb250ZXh0LiRwYXJlbnRDb250ZXh0LiRwYXJlbnRDb250ZXh0LiRwYXJlbnQuY2FuRHJpbGxkb3duKCkgJiYgISRwYXJlbnQuSXNEcmlsbERvd24oKSAmJiAhJHBhcmVudC5DYW5FeHBhbmRPcHRpb24oKSAmJiAkcGFyZW50Q29udGV4dC4kcGFyZW50Q29udGV4dC4kcGFyZW50Q29udGV4dC4kcGFyZW50LlJlcG9ydFR5cGUoKSAhPSAnU2luZ2xlJyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ3aWR0aDogMzBweDsgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcIiBkYXRhLWJpbmQ9XCJzdHlsZTogeydiYWNrZ3JvdW5kLWNvbG9yJzogSXRlbXNbMF0uX2JhY2tDb2xvciA/PyBJdGVtc1swXS5iYWNrQ29sb3IoKSwgJ2NvbG9yJzogSXRlbXNbMF0uX2ZvbnRDb2xvciA/PyBJdGVtc1swXS5mb250Q29sb3IoKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXsgdG9nZ2xlKCk7IH1cIj48c3BhbiBjbGFzcz1cImZhXCIgZGF0YS1iaW5kPVwiY3NzOiB7J2ZhLXBsdXMnOiAhaXNFeHBhbmRlZCgpLCAnZmEtbWludXMnOiBpc0V4cGFuZGVkKCl9XCI+PC9zcGFuPjwvYT5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6ICdyZXBvcnQtY29sdW1uJywgZGF0YTogJGRhdGEgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAva28tLT5cclxuICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBpc0V4cGFuZGVkIC0tPlxyXG4gICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOiAzMHB4O1wiPjwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIGRhdGEtYmluZD1cImF0dHI6e2NvbHNwYW46ICRwYXJlbnQuQ29sdW1ucy5sZW5ndGggfVwiIHN0eWxlPVwicGFkZGluZy1sZWZ0OiAwcHg7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogIURyaWxsRG93bkRhdGEoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlcG9ydC1zcGlubmVyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBEcmlsbERvd25EYXRhIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1zdHJpcGVkIHRhYmxlLWhvdmVyIHRhYmxlLWNvbmRlbnNlZFwiIGRhdGEtYmluZD1cIndpdGg6IERyaWxsRG93bkRhdGFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJuby1oaWdobGlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyB0ZW1wbGF0ZTogJ3JlcG9ydC1jb2x1bW4taGVhZGVyJywgZGF0YTogJGRhdGEgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBSb3dzICYmIFJvd3MubGVuZ3RoIDwgMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgZGF0YS1iaW5kPVwiYXR0cjoge2NvbHNwYW46IENvbHVtbnMubGVuZ3RofVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gcmVjb3JkcyBmb3VuZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiBSb3dzICAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0ga28gdGVtcGxhdGU6ICdyZXBvcnQtY29sdW1uJywgZGF0YTogJGRhdGEgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wteHMtMTIgY29sLWNlbnRlcmVkXCIgZGF0YS1iaW5kPVwid2l0aDogcGFnZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWlubGluZSBzbWFsbCB0ZXh0LW11dGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtbGVmdCB0b3RhbC1yZWNvcmRzXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogcGFnZXMoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiAnVG90YWwgUmVjb3JkczogJyArIHRvdGFsUmVjb3JkcygpXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnQgdG90YWwtcmVjb3Jkc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiB0aXRsZT1cIkRvd25sb2FkIEV4Y2VsXCIgZGF0YS1iaW5kPVwiY2xpY2s6ICRwYXJlbnQuZXhwb3J0RXhjZWxcIj48c3BhbiBjbGFzcz1cImZhIGZhLWZpbGUtZXhjZWwtb1wiPjwvc3Bhbj48L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIHRpdGxlPVwiVmlldyBDb2RlXCIgZGF0YS1icy10b2dnbGU9XCJtb2RhbFwiIGRhdGEtYnMtdGFyZ2V0PVwiI3NxbERyaWxsRG93bk1vZGFsXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogJHJvb3QuYWRtaW5Nb2RlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWNvZGVcIj48L3NwYW4+IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+ICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHB1bGwtcmlnaHRcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBwYWdlcygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdwYWdlci10ZW1wbGF0ZScsIGRhdGE6ICRkYXRhXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBzdWJSZXBvcnRzUmFuKCkubGVuZ3RoID4gMCAtLT5cclxuICAgICAgICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgZGF0YS1iaW5kPVwiYXR0cjp7Y29sc3BhbjogJHBhcmVudC5Db2x1bW5zLmxlbmd0aCB9XCIgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6IDBweDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJmb3JlYWNoOiBzdWJSZXBvcnRzUmFuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiIHN0eWxlPVwicGFkZGluZy1ib3R0b206IDIwcHg7XCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3M9XCJwdWxsLWxlZnRcIiBkYXRhLWJpbmQ9XCJ0ZXh0OiBSZXBvcnROYW1lXCI+PC9oMj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbGVhcmZpeFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdC1vdmVyZmxvdy1hdXRvXCIgc3R5bGU9XCJwYWRkaW5nLXRvcDogMDsgbWFyZ2luLXRvcDogMDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGRhdGEtYmluZD1cImh0bWw6IFJlcG9ydERlc2NyaXB0aW9uLCB2aXNpYmxlOiBSZXBvcnREZXNjcmlwdGlvblwiPjwvcD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cIndpdGg6IFJlcG9ydFJlc3VsdFwiIGNsYXNzPVwic21hbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInZpc2libGU6ICFSZXBvcnREYXRhKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlcG9ydC1zcGlubmVyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogJ3JlcG9ydC10ZW1wbGF0ZScsIGRhdGE6ICRkYXRhXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWlubGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNtYWxsXCIgZGF0YS1iaW5kPVwid2l0aDogcGFnZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBwdWxsLWxlZnQgdG90YWwtcmVjb3Jkc1wiIGRhdGEtYmluZD1cImlmOiB0b3RhbFJlY29yZHMoKT4xICYmICRwYXJlbnQuUmVwb3J0VHlwZSgpICE9ICdTaW5nbGUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cInRleHQ6ICdUb3RhbCBSZWNvcmRzOiAnICsgdG90YWxSZWNvcmRzKClcIj48L3NwYW4+PGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcHVsbC1yaWdodFwiIGRhdGEtYmluZD1cImlmOiBwYWdlcygpPjEgJiYgJHBhcmVudC5SZXBvcnRUeXBlKCkgIT0gJ1NpbmdsZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogJ3BhZ2VyLXRlbXBsYXRlJywgZGF0YTogJGRhdGFcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgPCEtLSAva28tLT5cclxuICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgICAgPCEtLSBrbyBpZjogJHBhcmVudENvbnRleHQuJHBhcmVudC5TdWJUb3RhbHMoKS5sZW5ndGggPT0gMSAmJiAkcGFyZW50Q29udGV4dC4kcGFyZW50Q29udGV4dC4kcGFyZW50Lk91dGVyR3JvdXBDb2x1bW5zKCkubGVuZ3RoID09IDAgLS0+XHJcbiAgICAgICAgICAgIDx0Zm9vdCBkYXRhLWJpbmQ9XCJmb3JlYWNoOiAkcGFyZW50Q29udGV4dC4kcGFyZW50LlN1YlRvdGFsc1wiPlxyXG4gICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwic3ViLXRvdGFsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogJHBhcmVudENvbnRleHQuJHBhcmVudENvbnRleHQuJHBhcmVudENvbnRleHQuJHBhcmVudC5jYW5EcmlsbGRvd24oKSAmJiAhJHBhcmVudC5Jc0RyaWxsRG93bigpICYmICEkcGFyZW50LkNhbkV4cGFuZE9wdGlvbigpIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogSXRlbXMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogVmFsdWUgIT0gJ05BJyAmJiBWYWx1ZSAhPSAnTmFOJyAmJiAhb3V0ZXJHcm91cCgpIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCBkYXRhLWJpbmQ9XCJzdHlsZTogeydiYWNrZ3JvdW5kLWNvbG9yJzogX2JhY2tDb2xvciA/PyBiYWNrQ29sb3IoKSwgJ2NvbG9yJzogX2ZvbnRDb2xvciA/PyBmb250Q29sb3IoKSwgJ2ZvbnQtd2VpZ2h0JzogZm9udEJvbGQoKSB8fCBfZm9udEJvbGQgPyAnYm9sZCcgOiAnbm9ybWFsJywgJ3RleHQtYWxpZ24nOiBmaWVsZEFsaWduKCkgPyBmaWVsZEFsaWduKCkgOiAncmlnaHQnfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInN0eWxlOiB7J3dpZHRoJzogZmllbGRXaWR0aCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cImh0bWw6IGZvcm1hdHRlZFZhbFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDwvdGZvb3Q+XHJcbiAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgIDwvdGFibGU+XHJcbiAgICA8L2Rpdj5cclxuPC9zY3JpcHQ+XHJcblxyXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2h0bWxcIiBpZD1cInJlcG9ydC1yZW5kZXJcIj5cclxuICAgIDxkaXYgZGF0YS1iaW5kPVwid2l0aDogUmVwb3J0RGF0YVwiPlxyXG4gICAgICA8ZGl2IGRhdGEtYmluZD1cImZvcmVhY2g6IFJvd3NcIj5cclxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImh0bWw6IHJlbmRlcmVkSHRtbCwgY3NzOiB7ICdjYXJkLXZpZXcnOiAkcGFyZW50c1skcGFyZW50cy5sZW5ndGgtMV0uY2FyZFZpZXcgfVwiPjwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImZvcmVhY2g6IHN1YlJlcG9ydHNSYW5cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiIHN0eWxlPVwicGFkZGluZy1ib3R0b206IDIwcHg7XCIgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxoMiBjbGFzcz1cInB1bGwtbGVmdFwiIGRhdGEtYmluZD1cInRleHQ6IFJlcG9ydE5hbWVcIj48L2gyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2xlYXJmaXhcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdC1vdmVyZmxvdy1hdXRvXCIgc3R5bGU9XCJwYWRkaW5nLXRvcDogMDsgbWFyZ2luLXRvcDogMDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgZGF0YS1iaW5kPVwiaHRtbDogUmVwb3J0RGVzY3JpcHRpb24sIHZpc2libGU6IFJlcG9ydERlc2NyaXB0aW9uXCI+PC9wPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ3aXRoOiBSZXBvcnRSZXN1bHRcIiBjbGFzcz1cInNtYWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInZpc2libGU6ICFSZXBvcnREYXRhKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVwb3J0LXNwaW5uZXJcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogJ3JlcG9ydC10ZW1wbGF0ZScsIGRhdGE6ICRkYXRhXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWlubGluZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic21hbGxcIiBkYXRhLWJpbmQ9XCJ3aXRoOiBwYWdlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcHVsbC1sZWZ0IHRvdGFsLXJlY29yZHNcIiBkYXRhLWJpbmQ9XCJpZjogdG90YWxSZWNvcmRzKCk+MSAmJiAkcGFyZW50LlJlcG9ydFR5cGUoKSAhPSAnU2luZ2xlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cInRleHQ6ICdUb3RhbCBSZWNvcmRzOiAnICsgdG90YWxSZWNvcmRzKClcIj48L3NwYW4+PGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHB1bGwtcmlnaHRcIiBkYXRhLWJpbmQ9XCJpZjogcGFnZXMoKT4xICYmICRwYXJlbnQuUmVwb3J0VHlwZSgpICE9ICdTaW5nbGUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogJ3BhZ2VyLXRlbXBsYXRlJywgZGF0YTogJGRhdGFcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2xlYXJmaXhcIj48L2Rpdj5cclxuPC9zY3JpcHQ+XHJcblxyXG5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJyZXBvcnQtdGVtcGxhdGVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJyZXBvcnQtY2hhcnRcIiBkYXRhLWJpbmQ9XCJhdHRyOiB7aWQ6ICdjaGFydF9kaXZfJyArICRwYXJlbnQuUmVwb3J0SUQoKX0sIHZpc2libGU6ICRwYXJlbnQuaXNDaGFydFwiPjwvZGl2PlxyXG4gICAgPCEtLSBrbyBpZjogJHBhcmVudC5SZXBvcnRUeXBlKCkgPT0gJ1Bpdm90JyAtLT5cclxuICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6IHtuYW1lOiAncmVwb3J0LXBpdm90JywgZGF0YTogJGRhdGEgfVwiPjwvZGl2PlxyXG4gICAgPCEtLSAva28gLS0+XHJcblxyXG4gICAgPCEtLSBrbyBpZjogJHBhcmVudC5SZXBvcnRUeXBlKCkgPT0gJ0h0bWwnIC0tPlxyXG4gICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZToge25hbWU6ICdyZXBvcnQtcmVuZGVyJywgZGF0YTogJGRhdGEgfVwiPjwvZGl2PlxyXG4gICAgPCEtLSAva28gLS0+XHJcblxyXG4gICAgPCEtLSBrbyBpZjogJHBhcmVudC5SZXBvcnRUeXBlKCkgIT0gJ1Bpdm90JyAmJiAkcGFyZW50LlJlcG9ydFR5cGUoKSAhPSAnSHRtbCcgJiYgKCEkcGFyZW50LmlzQ2hhcnQoKSB8fCAkcGFyZW50LlNob3dEYXRhV2l0aEdyYXBoKCkpIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cInB1bGwtcmlnaHRcIiBkYXRhLWJpbmQ9XCJpZjogJHBhcmVudC5PdXRlckdyb3VwQ29sdW1ucygpLmxlbmd0aCA+IDBcIj5cclxuICAgICAgICA8YSBocmVmPVwiI1wiIGRhdGEtYnMtdG9nZ2xlPVwiZHJvcGRvd25cIiBhcmlhLWhhc3BvcHVwPVwiZmFsc2VcIiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIj5cclxuICAgICAgICAgICAgTWFuYWdlIEdyb3VwcyA8c3BhbiBjbGFzcz1cImZhIGZhLWVsbGlwc2lzLXZcIj48L3NwYW4+XHJcbiAgICAgICAgPC9hPlxyXG4gICAgICAgIDx1bCBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIiBzdHlsZT1cInotaW5kZXg6IDEwMDE7XCIgZGF0YS1iaW5kPVwiZm9yZWFjaDogJHBhcmVudC5PdXRlckdyb3VwQ29sdW1uc1wiPlxyXG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJkcm9wZG93bi1pdGVtIHNtYWxsXCI+XHJcbiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGRhdGEtYmluZD1cImNsaWNrOiByZW1vdmVcIiB0aXRsZT1cIlJlbW92ZSBmcm9tIEdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1jbG9zZVwiPjwvc3Bhbj4gPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogZmllbGROYW1lXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgIDwvdWw+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJjbGVhci1maXhcIj48L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGRhdGEtYmluZD1cImZvcmVhY2g6IG91dGVyR3JvdXBEYXRhXCI+XHJcbiAgICAgICAgPCEtLSBrbyBpZjogcm93cy5sZW5ndGggPiAwIHx8ICgkcGFyZW50Lm91dGVyR3JvdXBEYXRhICYmICRwYXJlbnQub3V0ZXJHcm91cERhdGEoKS5sZW5ndGggPT0gMSkgLS0+XHJcbiAgICAgICAgPGg2IGRhdGEtYmluZD1cImh0bWw6IGRpc3BsYXlcIj48L2g2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJcIiBzdHlsZT1cInBhZGRpbmctdG9wOiA1cHg7XCI+PC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0ga28gaWY6ICRwYXJlbnRzWzFdLlJlcG9ydFR5cGUoKSAhPSAnU2luZ2xlJy0tPlxyXG4gICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6IHtuYW1lOiAncmVwb3J0LXRhYmxlJywgZGF0YTogJHBhcmVudC5SZXBvcnREYXRhIH1cIj48L2Rpdj5cclxuICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICA8IS0tIGtvIGlmOiAkcGFyZW50c1sxXS5SZXBvcnRUeXBlKCkgPT0gJ1NpbmdsZSctLT5cclxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiB7bmFtZTogJ3JlcG9ydC13aWRnZXQnLCBkYXRhOiAkcGFyZW50LlJlcG9ydERhdGEgfVwiPjwvZGl2PlxyXG4gICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8IS0tIC9rbyAtLT5cclxuPC9zY3JpcHQ+XHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwiYWRtaW4tbW9kZS10ZW1wbGF0ZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBhbGlnbi1pdGVtcy1jZW50ZXJcIiBzdHlsZT1cImdhcDogMTBweDtcIj5cclxuICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBhZG1pbk1vZGVcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvIGQtaW5saW5lLWJsb2NrXCIgc3R5bGU9XCJmb250LXNpemU6IDEwcHQ7IHBhZGRpbmc6IDVweDsgbWF4LXdpZHRoOiAzNTBweDsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgbWFyZ2luLWJvdHRvbTogMDtcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXVzZXItY2lyY2xlXCI+PC9pPiBZb3UgY2FuIG1hbmFnZSBSZXBvcnRzL0Rhc2hib2FyZHMgZm9yIGFsbCB1c2Vyc1xyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ1YmJsZS1iYWRnZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIEFkbWluIE1vZGVcclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVjayBmb3JtLXN3aXRjaCBtcy0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBhZG1pbk1vZGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L3NjcmlwdD5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJtYW5hZ2UtYWNjZXNzLXRlbXBsYXRlXCI+XHJcbiAgICA8aDU+PHNwYW4gY2xhc3M9XCJmYSBmYS1rZXlcIj48L3NwYW4+TWFuYWdlIEFjY2VzczwvaDU+XHJcbiAgICA8ZGl2IGNsYXNzPVwicGFuZWwgcGFuZWwtZGVmYXVsdCBwYW5lbC1ib2R5XCIgc3R5bGU9XCJtYXJnaW4tbGVmdDogMjBweDtcIj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1tZC0zIGNvbC1zbS0zIGNvbnRyb2wtbGFiZWxcIj5DbGllbnQgSWQgdG8gUmVzdHJpY3QgQWNjZXNzPC9sYWJlbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0zIGNvbC1zbS0zXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2wgdGV4dC1ib3ggc2luZ2xlLWxpbmVcIiB0eXBlPVwidGV4dFwiIGRhdGEtYmluZD1cInZhbHVlOiBjbGllbnRJZFwiPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xIGNvbC1zbS0xXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJzLXRvZ2dsZT1cInRvb2x0aXBcIiBkYXRhLXBsYWNlbWVudD1cInJpZ2h0XCIgY2xhc3M9XCJmYSBmYS1xdWVzdGlvbi1jaXJjbGUgaGVscHRpcFwiIHRpdGxlPVwiTGVhdmUgYmxhbmsgdG8gZ2l2ZSBhbGwgY2xpZW50cyBhY2Nlc3MgKEdsb2JhbCBSZXBvcnRzKVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWluZm9cIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1saWdodGJ1bGItbyBmYS0yeFwiPjwvc3Bhbj4mbmJzcDtVc2VyIGxldmVsIHJpZ2h0cyBvdmVycmlkZSBSb2xlIGxldmVsIHJpZ2h0cy4gTm8gc2VsZWN0aW9uIGZvciBhIHJ1bGUgaW1wbGllcyByZXBvcnQgaXMgYXZhaWxhYmxlIHRvIGFsbC5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBzbWFsbFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwidG9nZ2xlLWljb24gZmFcIiBkYXRhLWJpbmQ9XCJjbGljazogdG9nZ2xlTWFuYWdlVXNlcnMsY3NzOiB7ICdmYS1jaGV2cm9uLWRvd24nOiBzaG93TWFuYWdlVXNlcnMoKSwgJ2ZhLWNoZXZyb24tcmlnaHQnOiAhc2hvd01hbmFnZVVzZXJzKCkgfVwiPjwvaT4gPGI+TWFuYWdlIGJ5IFVzZXI8L2I+IChhbGxvdyBlZGl0KVxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBjb250YWluZXItZmx1aWRcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBzaG93TWFuYWdlVXNlcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBncm91cGVkVXNlcnMoKS5sZW5ndGggPiAwIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogZ3JvdXBlZFVzZXJzIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yeS1oZWFkZXJcIiBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjtcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKSB7IHNob3coIXNob3coKSk7IH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSB0b2dnbGUtaWNvblwiIGRhdGEtYmluZD1cImNzczogeyAnZmEtY2hldnJvbi1kb3duJzogc2hvdygpLCAnZmEtY2hldnJvbi1yaWdodCc6ICFzaG93KCkgfVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZyBkYXRhLWJpbmQ9XCJ0ZXh0OiBjYXRlZ29yeVwiPjwvc3Ryb25nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGNvbnRhaW5lci1mbHVpZFwiIGRhdGEtYmluZD1cInZpc2libGU6IHNob3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiB1c2VycyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtbGVmdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWwgbGFiZWwtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogc2VsZWN0ZWRcIj4gJm5ic3A7IDxzcGFuIGRhdGEtYmluZD1cInRleHQ6IHRleHRcIj48L3NwYW4+Jm5ic3A7IDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gaWY6IGdyb3VwZWRVc2VycygpLmxlbmd0aCA9PSAwICYmIHVzZXJzLmxlbmd0aCA+IDAgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiB1c2VycyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWwgbGFiZWwtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBzZWxlY3RlZFwiPiZuYnNwOzxzcGFuIGRhdGEtYmluZD1cInRleHQ6IHRleHRcIj48L3NwYW4+Jm5ic3A7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiBncm91cGVkVXNlcnMoKS5sZW5ndGggPT0gMCAmJiB1c2Vycy5sZW5ndGggPT0gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBVc2VycyBsaXN0IG5vdCBwb3B1bGF0ZWQgb3Igbm90IGFwcGxpY2FibGVcclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInRvZ2dsZS1pY29uIGZhXCIgZGF0YS1iaW5kPVwiY2xpY2s6IHRvZ2dsZVZpZXdVc2Vycyxjc3M6IHsgJ2ZhLWNoZXZyb24tZG93bic6IHNob3dWaWV3VXNlcnMoKSwgJ2ZhLWNoZXZyb24tcmlnaHQnOiAhc2hvd1ZpZXdVc2VycygpIH1cIj48L2k+IDxiPlZpZXcgb25seSBieSBVc2VyPC9iPiAobm8gZWRpdC9kZWxldGUpXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGNvbnRhaW5lci1mbHVpZFwiIGRhdGEtYmluZD1cInZpc2libGU6IHNob3dWaWV3VXNlcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBncm91cGVkVmlld09ubHlVc2VycygpLmxlbmd0aCA+IDAgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiBncm91cGVkVmlld09ubHlVc2VycyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcnktaGVhZGVyXCIgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXI7XCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCkgeyBzaG93KCFzaG93KCkpOyB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgdG9nZ2xlLWljb25cIiBkYXRhLWJpbmQ9XCJjc3M6IHsgJ2ZhLWNoZXZyb24tZG93bic6IHNob3coKSwgJ2ZhLWNoZXZyb24tcmlnaHQnOiAhc2hvdygpIH1cIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmcgZGF0YS1iaW5kPVwidGV4dDogY2F0ZWdvcnlcIj48L3N0cm9uZz5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBjb250YWluZXItZmx1aWRcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBzaG93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogdmlld09ubHlVc2VycyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtbGVmdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWwgbGFiZWwtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogc2VsZWN0ZWRcIj4gJm5ic3A7IDxzcGFuIGRhdGEtYmluZD1cInRleHQ6IHRleHRcIj48L3NwYW4+Jm5ic3A7IDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gaWY6IGdyb3VwZWRWaWV3T25seVVzZXJzKCkubGVuZ3RoID09IDAgJiYgdmlld09ubHlVc2Vycy5sZW5ndGggPiAwIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogdmlld09ubHlVc2VycyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWwgbGFiZWwtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBzZWxlY3RlZFwiPiZuYnNwOzxzcGFuIGRhdGEtYmluZD1cInRleHQ6IHRleHRcIj48L3NwYW4+Jm5ic3A7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiBncm91cGVkVmlld09ubHlVc2VycygpLmxlbmd0aCA9PSAwICYmIHVzZXJzLmxlbmd0aCA9PSAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJzIGxpc3Qgbm90IHBvcHVsYXRlZCBvciBub3QgYXBwbGljYWJsZVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWZub3Q6IGlzRGFzaGJvYXJkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJ0b2dnbGUtaWNvbiBmYVwiIGRhdGEtYmluZD1cImNsaWNrOiB0b2dnbGVEZWxldGVVc2Vycyxjc3M6IHsgJ2ZhLWNoZXZyb24tZG93bic6IHNob3dEZWxldGVVc2VycygpLCAnZmEtY2hldnJvbi1yaWdodCc6ICFzaG93RGVsZXRlVXNlcnMoKSB9XCI+PC9pPjxiPkRlbGV0ZSBieSBVc2VyPC9iPiAoYWxsb3cgZGVsZXRlKVxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgY29udGFpbmVyLWZsdWlkXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogc2hvd0RlbGV0ZVVzZXJzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogZ3JvdXBlZERlbGV0ZU9ubHlVc2VycygpLmxlbmd0aCA+IDAgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiBncm91cGVkRGVsZXRlT25seVVzZXJzIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXRlZ29yeS1oZWFkZXJcIiBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjtcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKSB7IHNob3coIXNob3coKSk7IH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSB0b2dnbGUtaWNvblwiIGRhdGEtYmluZD1cImNzczogeyAnZmEtY2hldnJvbi1kb3duJzogc2hvdygpLCAnZmEtY2hldnJvbi1yaWdodCc6ICFzaG93KCkgfVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN0cm9uZyBkYXRhLWJpbmQ9XCJ0ZXh0OiBjYXRlZ29yeVwiPjwvc3Ryb25nPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGNvbnRhaW5lci1mbHVpZFwiIGRhdGEtYmluZD1cInZpc2libGU6IHNob3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiBkZWxldGVPbmx5VXNlcnMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsIGxhYmVsLWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IHNlbGVjdGVkXCI+ICZuYnNwOyA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiB0ZXh0XCI+PC9zcGFuPiZuYnNwOyA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBncm91cGVkRGVsZXRlT25seVVzZXJzKCkubGVuZ3RoID09IDAgJiYgZGVsZXRlT25seVVzZXJzLmxlbmd0aCA+IDAgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiBkZWxldGVPbmx5VXNlcnMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsIGxhYmVsLWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IHNlbGVjdGVkXCI+Jm5ic3A7PHNwYW4gZGF0YS1iaW5kPVwidGV4dDogdGV4dFwiPjwvc3Bhbj4mbmJzcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6IGdyb3VwZWREZWxldGVPbmx5VXNlcnMoKS5sZW5ndGggPT0gMCAmJiAgdXNlcnMubGVuZ3RoID09IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJzIGxpc3Qgbm90IHBvcHVsYXRlZCBvciBub3QgYXBwbGljYWJsZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInRvZ2dsZS1pY29uIGZhXCIgZGF0YS1iaW5kPVwiY2xpY2s6IHRvZ2dsZU1hbmFnZVJvbGVzLGNzczogeyAnZmEtY2hldnJvbi1kb3duJzogc2hvd01hbmFnZVJvbGVzKCksICdmYS1jaGV2cm9uLXJpZ2h0JzogIXNob3dNYW5hZ2VSb2xlcygpIH1cIj48L2k+PGI+TWFuYWdlIGJ5IFVzZXIgUm9sZTwvYj4gKGFsbG93IGVkaXQpXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGNvbnRhaW5lci1mbHVpZFwiIGRhdGEtYmluZD1cInZpc2libGU6IHNob3dNYW5hZ2VSb2xlc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogdXNlclJvbGVzIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbCBsYWJlbC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IHNlbGVjdGVkXCI+Jm5ic3A7PHNwYW4gZGF0YS1iaW5kPVwidGV4dDogdGV4dFwiPjwvc3Bhbj4mbmJzcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6IHVzZXJSb2xlcy5sZW5ndGggPT0gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBVc2VyIFJvbGVzIGxpc3Qgbm90IHBvcHVsYXRlZCBvciBub3QgYXBwbGljYWJsZVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwidG9nZ2xlLWljb24gZmFcIiBkYXRhLWJpbmQ9XCJjbGljazogdG9nZ2xlVmlld1JvbGVzLGNzczogeyAnZmEtY2hldnJvbi1kb3duJzogc2hvd1ZpZXdSb2xlcygpLCAnZmEtY2hldnJvbi1yaWdodCc6ICFzaG93Vmlld1JvbGVzKCkgfVwiPjwvaT48Yj5WaWV3IG9ubHkgYnkgVXNlciBSb2xlPC9iPiAobm8gZWRpdC9kZWxldGUpXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGNvbnRhaW5lci1mbHVpZFwiIGRhdGEtYmluZD1cInZpc2libGU6IHNob3dWaWV3Um9sZXNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IHZpZXdPbmx5VXNlclJvbGVzIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbCBsYWJlbC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IHNlbGVjdGVkXCI+Jm5ic3A7PHNwYW4gZGF0YS1iaW5kPVwidGV4dDogdGV4dFwiPjwvc3Bhbj4mbmJzcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6IHVzZXJSb2xlcy5sZW5ndGggPT0gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBVc2VyIFJvbGVzIGxpc3Qgbm90IHBvcHVsYXRlZCBvciBub3QgYXBwbGljYWJsZVxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmbm90OiBpc0Rhc2hib2FyZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwidG9nZ2xlLWljb24gZmFcIiBkYXRhLWJpbmQ9XCJjbGljazogdG9nZ2xlRGVsZXRlUm9sZXMsY3NzOiB7ICdmYS1jaGV2cm9uLWRvd24nOiBzaG93RGVsZXRlUm9sZXMoKSwgJ2ZhLWNoZXZyb24tcmlnaHQnOiAhc2hvd0RlbGV0ZVJvbGVzKCkgfVwiPjwvaT48Yj5EZWxldGUgYnkgVXNlciBSb2xlPC9iPiAoYWxsb3cgZGVsZXRlKVxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgY29udGFpbmVyLWZsdWlkXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogc2hvd0RlbGV0ZVJvbGVzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogZGVsZXRlT25seVVzZXJSb2xlcyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtbGVmdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwibGFiZWwgbGFiZWwtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogc2VsZWN0ZWRcIj4mbmJzcDs8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiB0ZXh0XCI+PC9zcGFuPiZuYnNwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiB1c2VyUm9sZXMubGVuZ3RoID09IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXIgUm9sZXMgbGlzdCBub3QgcG9wdWxhdGVkIG9yIG5vdCBhcHBsaWNhYmxlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvc2NyaXB0PlxyXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2h0bWxcIiBpZD1cImZpbHRlci1ncm91cFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInF1ZXJ5LWJ1aWxkZXIgZm9ybS1pbmxpbmVcIiBkYXRhLWJpbmQ9XCJmb3JlYWNoOiBGaWx0ZXJHcm91cHNcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicnVsZXMtZ3JvdXAtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJydWxlcy1ncm91cC1oZWFkZXJcIiBkYXRhLWJpbmQ9XCJhdHRyOiB7cGFyZW50ZGl2aWQ6IGdlbmVyYXRlVW5pcXVlSWQoKX1cIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogIWlzUm9vdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBidG4tZ3JvdXAtdG9nZ2xlIGJ0bi1ncm91cC1zbVwiIGRhdGEtYnMtdG9nZ2xlPVwiYnV0dG9uc1wiIHJvbGU9XCJncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYnRuIGJ0bi1saWdodCBhY3RpdmVcIiBzdHlsZT1cIm1hcmdpbi1yaWdodDogMHB4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBkYXRhLWJpbmQ9XCJhdHRyOiB7IG5hbWU6ICdhbmRPckdyb3VwLScgKyAkZWxlbWVudC5jbG9zZXN0KCcucnVsZXMtZ3JvdXAtaGVhZGVyJykuZ2V0QXR0cmlidXRlKCdwYXJlbnRkaXZpZCcpIH0sIGNoZWNrZWQ6IEFuZE9yXCIgdmFsdWU9XCJBbmRcIiAvPiBBbmRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJidG4gYnRuLWxpZ2h0IGFjdGl2ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBkYXRhLWJpbmQ9XCJhdHRyOiB7IG5hbWU6ICdhbmRPckdyb3VwLScgKyAkZWxlbWVudC5jbG9zZXN0KCcucnVsZXMtZ3JvdXAtaGVhZGVyJykuZ2V0QXR0cmlidXRlKCdwYXJlbnRkaXZpZCcpIH0sIGNoZWNrZWQ6IEFuZE9yXCIgdmFsdWU9XCJPclwiIC8+IE9yXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1yaWdodFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tc2Vjb25kYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6ICRwYXJlbnQuUmVtb3ZlRmlsdGVyR3JvdXAsIHZpc2libGU6ICFpc1Jvb3RcIj5SZW1vdmUgR3JvdXA8L2J1dHRvbj4mbmJzcDtcclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBpc1Jvb3RcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1sZWZ0IHBhZGRlZC1kaXZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiAmbmJzcDtGaWx0ZXIgQ29uZGl0aW9uczwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbGVhcmZpeFwiPjwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJydWxlcy1ncm91cC1ib2R5XCIgZGF0YS1iaW5kPVwidGVtcGxhdGU6IHtuYW1lOiAnZmlsdGVyLWlubmVyJ31cIj48L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L3NjcmlwdD5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJmbHktZmlsdGVyLXRlbXBsYXRlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FyZFwiIGRhdGEtYmluZD1cInZpc2libGU6IEZseUZpbHRlcnMoKS5sZW5ndGg+MCB8fCBEb250RXhlY3V0ZU9uUnVuXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgIDxhIGRhdGEtYnMtdG9nZ2xlPVwiY29sbGFwc2VcIiBkYXRhLWJpbmQ9XCJhdHRyOiB7J2RhdGEtYnMtdGFyZ2V0JzogJyNmaWx0ZXItcGFuZWwtJyArIFJlcG9ydElEKCkgfVwiIGhyZWY9XCIjXCI+XHJcbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWZpbHRlclwiPjwvaT4gQ2hvb3NlIEZpbHRlcnNcclxuICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiYXR0cjoge2lkOiAnZmlsdGVyLXBhbmVsLScgKyBSZXBvcnRJRCgpIH0sIGNzczoge2NvbGxwYXNlZDogIURvbnRFeGVjdXRlT25SdW4oKSwgY29sbGFwc2U6ICFEb250RXhlY3V0ZU9uUnVuKCl9XCIgY2xhc3M9XCJjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogRmx5RmlsdGVycyAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTUgY29sLXhzLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ3aXRoOiBGaWVsZFwiIGNsYXNzPVwiY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIHRpdGxlPVwiQXBwbHkgdGhpcyBmaWx0ZXJcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiAkcGFyZW50LkFwcGx5LCBkaXNhYmxlZDogZm9yY2VkXCIgLz4gPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogc2VsZWN0ZWRGaWx0ZXJOYW1lXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ3aXRoOiBGaWVsZFwiIGNsYXNzPVwiY29sLXNtLTIgY29sLXhzLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIiBkYXRhLWJpbmQ9XCJpZjogJHBhcmVudC5BcHBseVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgZGF0YS1iaW5kPVwib3B0aW9uczogZmllbGRGaWx0ZXIsIHZhbHVlOiAkcGFyZW50Lk9wZXJhdG9yXCIgcmVxdWlyZWQ+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwid2l0aDogRmllbGRcIiBjbGFzcz1cImNvbC1zbS01IGNvbC14cy01XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6ICRwYXJlbnQuQXBwbHlcIiBkYXRhLXBhcmVudHByZWZpeD1cIkZcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiAncmVwb3J0LWZpbHRlcicsIGRhdGE6ICRkYXRhXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiBkYXRhLWJpbmQ9XCJjbGljazogRXhlY3V0ZVJlcG9ydFwiPlJ1bjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L3NjcmlwdD5cclxuXHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwiZmlsdGVyLWlubmVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwicnVsZXMtbGlzdFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJydWxlLWNvbnRhaW5lclwiIGRhdGEtYmluZD1cInZpc2libGU6IEZpbHRlcnMoKS5sZW5ndGg+MFwiPlxyXG4gICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJ0YWJsZSB0YWJsZS1zdHJpcGVkIHRhYmxlLWhvdmVyIHRhYmxlLWJvcmRlcmxlc3NcIj5cclxuICAgICAgICAgICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5GaWVsZDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5GaWx0ZXI8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgICAgICAgICAgPHRib2R5IGRhdGEtYmluZD1cImZvcmVhY2g6IEZpbHRlcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJydWxlLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgZGF0YS1iaW5kPVwidmFsdWU6IEFuZE9yLCB2aXNpYmxlOiAkaW5kZXgoKT4wXCIgY2xhc3M9XCJmb3JtLXNlbGVjdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPkFuZDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPk9yPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCIgZGF0YS1iaW5kPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiAkcGFyZW50c1skcGFyZW50cy5sZW5ndGgtMl0uc2VsZWN0ZWRGaWVsZHNDYW5GaWx0ZXIgIT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICRwYXJlbnRzWyRwYXJlbnRzLmxlbmd0aC0yXS5zZWxlY3RlZEZpZWxkc0NhbkZpbHRlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAkcGFyZW50c1skcGFyZW50cy5sZW5ndGgtMV0uc2VsZWN0ZWRGaWVsZHNDYW5GaWx0ZXIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zVGV4dDogJ3NlbGVjdGVkRmllbGROYW1lJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNDYXB0aW9uOiAnUGxlYXNlIENob29zZScsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogRmllbGQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyOiB7cmVxdWlyZWQ6IEZpZWxkKCk9PW51bGw/J3JlcXVpcmVkJzpmYWxzZX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlOiBGaWVsZCgpICYmIEZpZWxkKCkuZm9yY2VkXCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwid2l0aDogRmllbGRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCIgZGF0YS1iaW5kPVwib3B0aW9uczogZmllbGRGaWx0ZXIsIHZhbHVlOiAkcGFyZW50Lk9wZXJhdG9yXCIgcmVxdWlyZWQ+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cIndpdGg6IEZpZWxkXCIgZGF0YS1wYXJlbnRwcmVmaXg9XCJNXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdyZXBvcnQtZmlsdGVyJywgZGF0YTogJGRhdGFcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBGaWVsZCgpICYmIEZpZWxkKCkuZmllbGRUeXBlID09ICdEYXRlVGltZScgJiYgT3BlcmF0b3IoKSA9PSAncmFuZ2UnICYmICRpbmRleCgpPT0wIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0ga28gaWY6ICRwYXJlbnRzWyRwYXJlbnRzLmxlbmd0aC0yXS5jYW5BZGRTZXJpZXMgIT0gdW5kZWZpbmVkICYmICRwYXJlbnRzWyRwYXJlbnRzLmxlbmd0aC0yXS5jYW5BZGRTZXJpZXMoKSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tc2Vjb25kYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6ICRwYXJlbnRzWyRwYXJlbnRzLmxlbmd0aC0yXS5BZGRTZXJpZXMuYmluZCgkZGF0YSlcIj5BZGQgQ29tcGFyaXNvbjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0va28gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBrbyBpZjogJHBhcmVudHNbJHBhcmVudHMubGVuZ3RoLTJdLmNhbkFkZFNlcmllcyA9PSB1bmRlZmluZWQgJiYgJHBhcmVudENvbnRleHQuJHBhcmVudC5jYW5BZGRTZXJpZXMgIT0gdW5kZWZpbmVkICYmICRwYXJlbnRDb250ZXh0LiRwYXJlbnQuY2FuQWRkU2VyaWVzKCktLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tc2Vjb25kYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6ICRwYXJlbnRDb250ZXh0LiRwYXJlbnQuQWRkU2VyaWVzLmJpbmQoJGRhdGEpXCI+QWRkIENvbXBhcmlzb248L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0va28gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidmlzaWJsZTogRmllbGQoKSAmJiBGaWVsZCgpLmZvcmNlZFwiIGNsYXNzPVwiYmFkZ2UgYmctaW5mb1wiPlJlcXVpcmVkIEZpbHRlcjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCIgc3R5bGU9XCJmbGV4LWdyb3c6IDE7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tc2Vjb25kYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6ICRwYXJlbnQuUmVtb3ZlRmlsdGVyLCBoaWRkZW46IEZpZWxkKCkgJiYgRmllbGQoKS5mb3JjZWRcIiB0aXRsZT1cIlJlbW92ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtdHJhc2hcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCIgc3R5bGU9XCJmbGV4LWdyb3c6IDE7XCIgZGF0YS1iaW5kPVwid2l0aDogRmllbGQsIGhpZGRlbjogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2ZpbHRlci1wYW5lbC5jYXJkLWJvZHkuY29sbGFwc2UnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJidG4gYnRuLXNtXCIgdGFiaW5kZXg9XCIwXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7IGZpbHRlck9uRmx5KCFmaWx0ZXJPbkZseSgpKTsgfSwgY3NzOiB7J2J0bi1zdWNjZXNzJzogZmlsdGVyT25GbHkoKT09dHJ1ZSwgJ2J0bi1zZWNvbmRhcnknOiBmaWx0ZXJPbkZseSgpPT1mYWxzZX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWZpbHRlclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIHRpdGxlPVwiRmlsdGVyIG9uIFJlcG9ydFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IGNvbXBhcmVUbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+Jm5ic3A7PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cInRleHQtYWxpZ246IHJpZ2h0XCI+PGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc21cIiBkYXRhLWJpbmQ9XCJjbGljazogJHBhcmVudHNbMl0uUmVtb3ZlU2VyaWVzXCI+PHNwYW4gY2xhc3M9XCJmYSBmYS10cmFzaC1vXCI+PC9zcGFuPjwvYnV0dG9uPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm11dGVkXCI+Q29tcGFyZSB0bzwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgZGF0YS1iaW5kPVwib3B0aW9uczogUmFuZ2UsIHZhbHVlOiBWYWx1ZVwiIHJlcXVpcmVkPjwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJydWxlLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiB7bmFtZTogJ2ZpbHRlci1ncm91cCd9XCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1zZWNvbmRhcnlcIiBkYXRhLWJpbmQ9XCJjbGljazogQWRkRmlsdGVyXCI+QWRkIEZpbHRlcjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6IEFkZEZpbHRlckdyb3VwXCI+QWRkIEZpbHRlciBHcm91cDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuPC9zY3JpcHQ+XHJcblxyXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2h0bWxcIiBpZD1cImZpbHRlci1wYXJhbWV0ZXJzXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiPlxyXG4gICAgICAgIDxzcGFuIGRhdGEtYmluZD1cImhpZGRlbjogc2hvd1BhcmFtZXRlcnNcIj5ObyBmaWx0ZXJzIGF2YWlsYWJsZSB0byBjaG9vc2U8L3NwYW4+XHJcbiAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgdGFibGUtc3RyaXBlZCB0YWJsZS1ob3ZlciB0YWJsZS1ib3JkZXJsZXNzXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogc2hvd1BhcmFtZXRlcnNcIj5cclxuICAgICAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiAzMCVcIj5GaWx0ZXI8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiAyMCVcIj48L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cIndpZHRoOiAzMCVcIj5WYWx1ZTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoPjwvdGg+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgICAgICA8dGJvZHkgZGF0YS1iaW5kPVwiZm9yZWFjaDogUGFyYW1ldGVyc1wiPlxyXG4gICAgICAgICAgICAgICAgPHRyIGRhdGEtYmluZD1cImlmbm90OiBIaWRkZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgZGF0YS1iaW5kPVwidGV4dDogRGlzcGxheU5hbWVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCIgZGF0YS1iaW5kPVwib3B0aW9uczogb3BlcmF0b3JzLCB2YWx1ZTogT3BlcmF0b3JcIiByZXF1aXJlZD48L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgZGF0YS1iaW5kPVwid2l0aDogRmllbGRcIiBkYXRhLXBhcmVudHByZWZpeD1cIlBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogJ3JlcG9ydC1maWx0ZXInLCBkYXRhOiAkZGF0YVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkPjwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG5cclxuICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICA8L3RhYmxlPlxyXG4gICAgPC9kaXY+XHJcbjwvc2NyaXB0PlxyXG5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJyZXBvcnQtc2NoZWR1bGVcIj5cclxuICAgIDxkaXYgZGF0YS1iaW5kPVwid2l0aDogc2NoZWR1bGVCdWlsZGVyXCIgaWQ9XCJzY2hlZHVsZS1idWlsZGVyLWRpdlwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrXCI+XHJcbiAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBoYXNTY2hlZHVsZVwiIGlkPVwic2NoZWR1bGVSZXBvcnRDaGVja2JveFwiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgZm9yPVwic2NoZWR1bGVSZXBvcnRDaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgU2V0IFNjaGVkdWxlIHRvIHNlbmQgYnkgRW1haWxcclxuICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiBoYXNTY2hlZHVsZVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lLTMgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cInRleHQ6IHNlbGVjdGVkT3B0aW9uKCkgIT0gJ29uY2UnID8gJ0V2ZXJ5ICcgOiAnJ1wiPjwvc3Bhbj4mbmJzcDtcclxuICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiByZXF1aXJlZCBkYXRhLWJpbmQ9XCJvcHRpb25zOiBvcHRpb25zLCB2YWx1ZTogc2VsZWN0ZWRPcHRpb25cIiBzdHlsZT1cIm1pbi13aWR0aDogODBweDtcIj48L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZjogc2VsZWN0ZWRPcHRpb24oKSA9PSAnb25jZSdcIiBjbGFzcz1cIm1lLTMgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICZuYnNwO29uJm5ic3A7PGlucHV0IGRhdGEtYmluZD1cImRhdGVwaWNrZXI6IHNlbGVjdGVkRGF0ZSwgZGF0ZXBpY2tlck9wdGlvbnM6IHt2YWx1ZTogc2VsZWN0ZWREYXRlfVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcmVxdWlyZWQgLz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiBzaG93RGF5c1wiIGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDtvbiZuYnNwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IG11bHRpcGxlIGNsYXNzPVwiZm9ybS1zZWxlY3QgbXMtMlwiIHJlcXVpcmVkIGRhdGEtYmluZD1cInNlbGVjdDI6IHsgcGxhY2Vob2xkZXI6ICdDaG9vc2UgRGF5cycsIGFsbG93Q2xlYXI6IHRydWUgfSwgb3B0aW9uczogZGF5cywgc2VsZWN0ZWRPcHRpb25zOiBzZWxlY3RlZERheXNcIj48L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiBzaG93RGF0ZXNcIiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7b24mbmJzcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBtdWx0aXBsZSBjbGFzcz1cImZvcm0tc2VsZWN0XCIgcmVxdWlyZWQgZGF0YS1iaW5kPVwic2VsZWN0MjogeyBwbGFjZWhvbGRlcjogJ0Nob29zZSBEYXRlcycsIGFsbG93Q2xlYXI6IHRydWUgfSwgb3B0aW9uczogZGF0ZXMsIHNlbGVjdGVkT3B0aW9uczogc2VsZWN0ZWREYXRlc1wiPjwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6IHNob3dNb250aHNcIiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7b24mbmJzcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBtdWx0aXBsZSBjbGFzcz1cImZvcm0tc2VsZWN0XCIgcmVxdWlyZWQgZGF0YS1iaW5kPVwic2VsZWN0MjogeyBwbGFjZWhvbGRlcjogJ0Nob29zZSBNb250aHMnLCBhbGxvd0NsZWFyOiB0cnVlIH0sIG9wdGlvbnM6IG1vbnRocywgc2VsZWN0ZWRPcHRpb25zOiBzZWxlY3RlZE1vbnRoc1wiPjwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6IHNob3dBdFRpbWVcIiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgbXMtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDthdCZuYnNwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3QgbWUtMlwiIHN0eWxlPVwibWluLXdpZHRoOiA2MHB4O1wiIGRhdGEtYmluZD1cIm9wdGlvbnM6IGhvdXJzLCB2YWx1ZTogc2VsZWN0ZWRIb3VyXCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdCBtZS0yXCIgc3R5bGU9XCJtaW4td2lkdGg6IDYwcHg7XCIgZGF0YS1iaW5kPVwib3B0aW9uczogbWludXRlcywgdmFsdWU6IHNlbGVjdGVkTWludXRlXCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIHN0eWxlPVwibWluLXdpZHRoOiA4MHB4O1wiIGRhdGEtYmluZD1cInZhbHVlOiBzZWxlY3RlZEFtUG1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24+QU08L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24+UE08L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgUmVwb3J0IHdpbGwgYmUgcnVuIGFuZCBlbWFpbGVkIDxzcGFuIGRhdGEtYmluZD1cInRleHQ6IHNlbGVjdGVkT3B0aW9uKCkgIT0gJ29uY2UnID8gJ2V2ZXJ5JyA6ICcnXCI+PC9zcGFuPiA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBzZWxlY3RlZE9wdGlvblwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cImlmOiBzZWxlY3RlZE9wdGlvbigpID09ICdvbmNlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIG9uIDxzcGFuIGNsYXNzPVwiZXJyb3JcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAhc2VsZWN0ZWREYXRlKClcIj5QbGVhc2UgcGljayBhIERhdGU8L3NwYW4+IDxzcGFuIGRhdGEtYmluZD1cInRleHQ6IHNlbGVjdGVkRGF0ZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cImlmOiBzaG93RGF5c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIG9uIDxzcGFuIGNsYXNzPVwiZXJyb3JcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBzZWxlY3RlZERheXMoKS5sZW5ndGggPT0gMFwiPlBsZWFzZSBwaWNrIERheShzKTwvc3Bhbj4gPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogc2VsZWN0ZWREYXlzXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwiaWY6IHNob3dEYXRlc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIG9uIDxzcGFuIGNsYXNzPVwiZXJyb3JcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBzZWxlY3RlZERhdGVzKCkubGVuZ3RoID09IDBcIj5QbGVhc2UgcGljayBEYXRlKHMpPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cImZvcmVhY2g6IHNlbGVjdGVkRGF0ZXNcIj48c3BhbiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAkaW5kZXgoKT4wXCI+LCA8L3NwYW4+PHNwYW4gZGF0YS1iaW5kPVwidGV4dDogJGRhdGEgPT0gMSA/ICcxc3QnOiAoJGRhdGEgPT0gMiA/ICcybmQnIDogKCRkYXRhID09IDMgPyAnM3JkJyA6ICgkZGF0YSA9PSAzMSA/ICczMXN0JyA6ICRkYXRhKyd0aCcpKSlcIj48L3NwYW4+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwiaWY6IHNob3dNb250aHNcIj5cclxuICAgICAgICAgICAgICAgICAgICBvZiA8c3BhbiBjbGFzcz1cImVycm9yXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogc2VsZWN0ZWRNb250aHMoKS5sZW5ndGggPT0gMFwiPlBsZWFzZSBwaWNrIE1vbnRoKHMpPC9zcGFuPiA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBzZWxlY3RlZE1vbnRoc1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cImlmOiBzaG93QXRUaW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgYXQgPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogc2VsZWN0ZWRIb3VyXCI+PC9zcGFuPjo8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBzZWxlY3RlZE1pbnV0ZVwiPjwvc3Bhbj4gPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogc2VsZWN0ZWRBbVBtXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgZy0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTMgY29sLWZvcm0tbGFiZWxcIj5FbWFpbCB0bzwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZGF0YS1iaW5kPVwidmFsdWU6IGVtYWlsVG9cIiBwbGFjZWhvbGRlcj1cIkVudGVyIEVtYWlsIEFkZHJlc3NlcyBzZXBhcmF0ZWQgYnkgY29tbWEgdG8gc2VuZCB0aGUgUmVwb3J0IHRvXCIgcmVxdWlyZWQgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMSBjb2wtZm9ybS1sYWJlbFwiPkZvcm1hdDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIGRhdGEtYmluZD1cInZhbHVlOiBmb3JtYXQsZXZlbnQ6IHsgY2hhbmdlOiBvbkZvcm1hdENoYW5nZSB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiRVhDRUxcIj5FeGNlbDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAkcGFyZW50LmNhbkRyaWxsZG93biAmJiAkcGFyZW50LmNhbkRyaWxsZG93bigpXCIgdmFsdWU9XCJFWENFTC1TVUJcIj5FeGNlbCAoRXhwYW5kZWQpPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiQ1NWXCI+Q1NWPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiUERGXCI+UERGPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiV09SRFwiPldvcmQ8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJMSU5LXCI+TGluazwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgZy0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTMgY29sLWZvcm0tbGFiZWxcIj5QaWNrIFRpbWUgWm9uZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS05XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIGRhdGEtYmluZD1cIm9wdGlvbnM6IHRpbWV6b25PcHRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNUZXh0OiAnZGlzcGxheU5hbWUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zVmFsdWU6ICd0aW1lWm9uZUlkJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHNlbGVjdGVkVGltZXpvbmUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdDI6IHtkcm9wZG93blBhcmVudDogJCgnI3NjaGVkdWxlLWJ1aWxkZXItZGl2JyksIGFsbG93Q2xlYXI6IHRydWUsIHBsYWNlaG9sZGVyOiAnU2V0IGEgdGltZSB6b25lIHRvIHNlbmQgcmVwb3J0J31cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGctM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVja1wiIHRpdGxlPVwiU2V0IGEgZGF0ZSB0byBzdGFydCBzZW5kaW5nIHNjaGVkdWxlZCByZXBvcnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBoYXNTY2hlZHVsZVN0YXJ0XCIgaWQ9XCJzY2hlZHVsZVN0YXJ0Q2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJzY2hlZHVsZVN0YXJ0Q2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlZHVsZSBTdGFydCBEYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTRcIiBkYXRhLWJpbmQ9XCJpZjogaGFzU2NoZWR1bGVTdGFydFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGRhdGEtYmluZD1cImRhdGVwaWNrZXI6IHNjaGVkdWxlU3RhcnQsIGRhdGVwaWNrZXJPcHRpb25zOiB7dmFsdWU6IHNjaGVkdWxlU3RhcnR9XCIgdGl0bGU9XCJTY2hlZHVsZWQgUmVwb3J0IHdpbGwgbm90IGJlIHNlbnQgYmVmb3JlIHRoaXMgZGF0ZVwiIHJlcXVpcmVkIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGctM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVja1wiIHRpdGxlPVwiU2V0IGEgZGF0ZSB0byBzdG9wIHNlbmRpbmcgc2NoZWR1bGVkIHJlcG9ydFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dFwiIHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IGhhc1NjaGVkdWxlRW5kXCIgaWQ9XCJzY2hlZHVsZUVuZENoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCIgZm9yPVwic2NoZWR1bGVFbmRDaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVkdWxlIEVuZCBEYXRlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTRcIiBkYXRhLWJpbmQ9XCJpZjogaGFzU2NoZWR1bGVFbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBkYXRhLWJpbmQ9XCJkYXRlcGlja2VyOiBzY2hlZHVsZUVuZCwgZGF0ZXBpY2tlck9wdGlvbnM6IHt2YWx1ZTogc2NoZWR1bGVFbmR9XCIgdGl0bGU9XCJTY2hlZHVsZWQgUmVwb3J0IHdpbGwgbm90IGJlIHNlbnQgYWZ0ZXIgdGhpcyBkYXRlXCIgcmVxdWlyZWQgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuXHJcbjwvc2NyaXB0PlxyXG5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJyZXBvcnQtZmllbGQtb3B0aW9uc1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZ1wiIHN0eWxlPVwibWF4LXdpZHRoOiA3NTBweDtcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiIGRhdGEtYmluZD1cIndpdGg6IGVkaXRGaWVsZE9wdGlvbnNcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGVcIj48c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBmaWVsZE5hbWVcIj48L3NwYW4+IC0gU2V0dXAgQWRkaXRpb25hbCBGaWVsZCBPcHRpb25zPC9oNT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IG5lZWRzLXZhbGlkYXRpb25cIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxiPkNvbHVtbiBGb3JtYXQgU2V0dGluZ3M8L2I+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS01IGNvbC1tZC01IGNvbnRyb2wtbGFiZWxcIj5QaWNrIERhdGEgRm9ybWF0PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS03IGNvbC1tZC03XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBkYXRhLWJpbmQ9XCJvcHRpb25zOiBbJ0RheXMnLCAnSG91cnMnLCAnTWludXRlcycsICdTZWNvbmRzJ10uaW5kZXhPZihmaWVsZEZvcm1hdCgpKSA+PSAwID8gWydEYXlzJywgJ0hvdXJzJywgJ01pbnV0ZXMnLCAnU2Vjb25kcyddIDogJHBhcmVudHNbMV0uZmllbGRGb3JtYXRUeXBlcywgdmFsdWU6IGZpZWxkRm9ybWF0XCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiIGRhdGEtYmluZD1cInZpc2libGU6ICRwYXJlbnRzWzFdLmRlY2ltYWxGb3JtYXRUeXBlcy5pbmRleE9mKCRkYXRhLmZpZWxkRm9ybWF0KCkpPj0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS01IGNvbC1tZC01IGNvbnRyb2wtbGFiZWxcIj5QaWNrIERlY2ltYWwgUGxhY2VzPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS03IGNvbC1tZC03XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZGF0YS1iaW5kPVwidmFsdWU6IGRlY2ltYWxQbGFjZXNcIiBwbGFjZWhvbGRlcj1cIlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiIGRhdGEtYmluZD1cInZpc2libGU6IGZpZWxkRm9ybWF0KCk9PSdDdXJyZW5jeSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTUgY29sLW1kLTUgY29udHJvbC1sYWJlbFwiPlBpY2sgQ3VycmVuY3kgRm9ybWF0PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS03IGNvbC1tZC03XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiByZXF1aXJlZCBkYXRhLWJpbmQ9XCJvcHRpb25zOiAkcGFyZW50c1sxXS5jdXJyZW5jeUZvcm1hdHMsIG9wdGlvbnNUZXh0OiAnZGlzcGxheScsb3B0aW9uc1ZhbHVlOiAndmFsdWUnLCB2YWx1ZTogY3VycmVuY3lGb3JtYXRcIj48L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogZmllbGRGb3JtYXQoKT09J0RhdGUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS01IGNvbC1tZC01IGNvbnRyb2wtbGFiZWxcIj5QaWNrIERhdGUgRm9ybWF0PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS03IGNvbC1tZC03XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBkYXRhLWJpbmQ9XCJvcHRpb25zOiAkcGFyZW50c1sxXS5kYXRlRm9ybWF0cywgdmFsdWU6IGRhdGVGb3JtYXRcIj48L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCIgZGF0YS1iaW5kPVwidmlzaWJsZTpzZWxlY3RlZEFnZ3JlZ2F0ZSgpPT0nUGl2b3QnICYmIGZpZWxkRm9ybWF0KCk9PSdEYXRlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNSBjb2wtbWQtNSBjb250cm9sLWxhYmVsXCI+UGl2b3QgRHJpbGxkb3duIERhdGUgRm9ybWF0PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS03IGNvbC1tZC03XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBkYXRhLWJpbmQ9XCJvcHRpb25zOiBbJycsICdEYXknLCAnTW9udGgnLCAnWWVhcicsICdNb250aC9ZZWFyJ10sIHZhbHVlOiBkcmlsbERhdGFGb3JtYXRcIj48L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiIGRhdGEtYmluZD1cInZpc2libGU6IGZpZWxkRm9ybWF0KCk9PSdEYXRlJyAmJiBkYXRlRm9ybWF0KCk9PT0nQ3VzdG9tJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNSBjb2wtbWQtNSBjb250cm9sLWxhYmVsXCI+RW50ZXIgQ3VzdG9tIERhdGUgRm9ybWF0PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS03IGNvbC1tZC03XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGRhdGEtYmluZD1cInZhbHVlOiBjdXN0b21EYXRlRm9ybWF0XCIgcGxhY2Vob2xkZXI9XCJkZC9tbS95eXl5XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS01IGNvbC1tZC01IGNvbnRyb2wtbGFiZWxcIj5DaG9vc2UgQ29sdW1uIExhYmVsPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS03IGNvbC1tZC03XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGRhdGEtYmluZD1cInZhbHVlOiBmaWVsZExhYmVsXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS01IGNvbC1tZC01IGNvbnRyb2wtbGFiZWxcIj5Jbm5lciBDb2x1bW4gTGFiZWw8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTcgY29sLW1kLTdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZGF0YS1iaW5kPVwidmFsdWU6IGZpZWxkTGFiZWwyXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS01IGNvbC1tZC01IGNvbnRyb2wtbGFiZWxcIj5DaG9vc2UgVGV4dCBBbGlnbm1lbnQ8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTcgY29sLW1kLTdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIGRhdGEtYmluZD1cIm9wdGlvbnM6ICRwYXJlbnRzWzFdLmZpZWxkQWxpZ25tZW50cywgdmFsdWU6IGZpZWxkQWxpZ25cIj48L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS01IGNvbC1tZC01IGNvbnRyb2wtbGFiZWxcIj5DaG9vc2UgV2lkdGggKGxlYXZlIGJsYW5rIGZvciBhdXRvKTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNyBjb2wtbWQtN1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogZmllbGRXaWR0aFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXJvdyBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1hdXRvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Yj5IZWFkZXIgU2V0dGluZ3M8L2I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj5QaWNrIFRleHQgQ29sb3I8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiIHN0eWxlPVwid2lkdGg6IDUwcHg7IGhlaWdodDogMzhweDtcIiBjbGFzcz1cImZvcm0tY29udHJvbCBtZS0yXCIgZGF0YS1iaW5kPVwidmFsdWU6IGhlYWRlckZvbnRDb2xvclwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHN0eWxlPVwid2lkdGg6IDEwMHB4XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbWUtMlwiIGRhdGEtYmluZD1cInZhbHVlOiBoZWFkZXJGb250Q29sb3JcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tc2Vjb25kYXJ5XCIgdGl0bGU9XCJBcHBseSB0byBhbGwgY29sdW1uc1wiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpe2FwcGx5QWxsSGVhZGVyRm9udENvbG9yKCFhcHBseUFsbEhlYWRlckZvbnRDb2xvcigpKTsgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYVwiIGRhdGEtYmluZD1cImNzczogYXBwbHlBbGxIZWFkZXJGb250Q29sb3IoKSA/ICdmYS1jaGVjaycgOiAnZmEtcGFzdGUnXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+UGljayBCYWNrZ3JvdW5kIENvbG9yPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBzdHlsZT1cIndpZHRoOiA1MHB4OyBoZWlnaHQ6IDM4cHg7XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbWUtMlwiIGRhdGEtYmluZD1cInZhbHVlOiBoZWFkZXJCYWNrQ29sb3JcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBzdHlsZT1cIndpZHRoOiAxMDBweFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIG1lLTJcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogaGVhZGVyQmFja0NvbG9yXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXNlY29uZGFyeVwiIHRpdGxlPVwiQXBwbHkgdG8gYWxsIGNvbHVtbnNcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXthcHBseUFsbEhlYWRlckJhY2tDb2xvcighYXBwbHlBbGxIZWFkZXJCYWNrQ29sb3IoKSk7IH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmFcIiBkYXRhLWJpbmQ9XCJjc3M6IGFwcGx5QWxsSGVhZGVyQmFja0NvbG9yKCkgPyAnZmEtY2hlY2snIDogJ2ZhLXBhc3RlJ1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgbWUtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBoZWFkZXJGb250Qm9sZFwiIGlkPVwiaGVhZGVyRm9udEJvbGRDaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJoZWFkZXJGb250Qm9sZENoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvbGQgVGV4dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1zZWNvbmRhcnlcIiB0aXRsZT1cIkFwcGx5IHRvIGFsbCBjb2x1bW5zXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7YXBwbHlBbGxIZWFkZXJCb2xkKCFhcHBseUFsbEhlYWRlckJvbGQoKSk7IH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhXCIgZGF0YS1iaW5kPVwiY3NzOiBhcHBseUFsbEhlYWRlckJvbGQoKSA/ICdmYS1jaGVjaycgOiAnZmEtcGFzdGUnXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXJvdyBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1hdXRvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Yj5UZXh0IFNldHRpbmdzPC9iPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+UGljayBUZXh0IENvbG9yPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBzdHlsZT1cIndpZHRoOiA1MHB4OyBoZWlnaHQ6IDM4cHg7XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbWUtMlwiIGRhdGEtYmluZD1cInZhbHVlOiBmb250Q29sb3JcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBzdHlsZT1cIndpZHRoOiAxMDBweDtcIiBjbGFzcz1cImZvcm0tY29udHJvbCBtZS0yXCIgZGF0YS1iaW5kPVwidmFsdWU6IGZvbnRDb2xvclwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1zZWNvbmRhcnlcIiB0aXRsZT1cIkFwcGx5IHRvIGFsbCBjb2x1bW5zXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7YXBwbHlBbGxGb250Q29sb3IoIWFwcGx5QWxsRm9udENvbG9yKCkpOyB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhXCIgZGF0YS1iaW5kPVwiY3NzOiBhcHBseUFsbEZvbnRDb2xvcigpID8gJ2ZhLWNoZWNrJyA6ICdmYS1wYXN0ZSdcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj5QaWNrIEJhY2tncm91bmQgQ29sb3I8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiIHN0eWxlPVwid2lkdGg6IDUwcHg7IGhlaWdodDogMzhweDtcIiBjbGFzcz1cImZvcm0tY29udHJvbCBtZS0yXCIgZGF0YS1iaW5kPVwidmFsdWU6IGJhY2tDb2xvclwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHN0eWxlPVwid2lkdGg6IDEwMHB4O1wiIGNsYXNzPVwiZm9ybS1jb250cm9sIG1lLTJcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogYmFja0NvbG9yXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXNlY29uZGFyeVwiIHRpdGxlPVwiQXBwbHkgdG8gYWxsIGNvbHVtbnNcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXthcHBseUFsbEJhY2tDb2xvcighYXBwbHlBbGxCYWNrQ29sb3IoKSk7IH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmFcIiBkYXRhLWJpbmQ9XCJjc3M6IGFwcGx5QWxsQmFja0NvbG9yKCkgPyAnZmEtY2hlY2snIDogJ2ZhLXBhc3RlJ1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgbWUtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBmb250Qm9sZFwiIGlkPVwiZm9udEJvbGRDaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIiBmb3I9XCJmb250Qm9sZENoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvbGQgVGV4dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1zZWNvbmRhcnlcIiB0aXRsZT1cIkFwcGx5IHRvIGFsbCBjb2x1bW5zXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7YXBwbHlBbGxCb2xkKCFhcHBseUFsbEJvbGQoKSk7IH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhXCIgZGF0YS1iaW5kPVwiY3NzOiBhcHBseUFsbEJvbGQoKSA/ICdmYS1jaGVjaycgOiAnZmEtcGFzdGUnXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFkZGVkLWRpdlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1wcmltYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCkge2FkZENvbmRpdGlvbmFsRm9ybWF0U2V0dGluZyhudWxsKX1cIj5BZGQgQ29uZGl0aW9uYWwgRm9ybWF0dGluZzwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImZvcmVhY2g6IGZpZWxkQ29uZHRpb25hbEZvcm1hdHNcIiBzdHlsZT1cInBhZGRpbmctbGVmdDogNDBweDtcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgZC1mbGV4IGp1c3RpZnktY29udGVudC1zdGFydFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiPkNvbmRpdGlvbmFsIEZvcm1hdCAjPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogJGluZGV4KCkrMVwiPjwvc3Bhbj48L2I+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wgZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tc2Vjb25kYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6ICRwYXJlbnQucmVtb3ZlU2V0dGluZ1wiPlJlbW92ZTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+UGljayBUZXh0IENvbG9yPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiIHN0eWxlPVwid2lkdGg6IDUwcHg7IGhlaWdodDogMzhweDtcIiBjbGFzcz1cImZvcm0tY29udHJvbCBtZS0yXCIgZGF0YS1iaW5kPVwidmFsdWU6IGZvbnRDb2xvclwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBzdHlsZT1cIndpZHRoOiAxMDBweDtcIiBjbGFzcz1cImZvcm0tY29udHJvbCBtZS0yXCIgZGF0YS1iaW5kPVwidmFsdWU6IGZvbnRDb2xvclwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlBpY2sgQmFja2dyb3VuZCBDb2xvcjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBzdHlsZT1cIndpZHRoOiA1MHB4OyBoZWlnaHQ6IDM4cHg7XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbWUtMlwiIGRhdGEtYmluZD1cInZhbHVlOiBiYWNrQ29sb3JcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgc3R5bGU9XCJ3aWR0aDogMTAwcHg7XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbWUtMlwiIGRhdGEtYmluZD1cInZhbHVlOiBiYWNrQ29sb3JcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgbWUtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogZm9udEJvbGRcIiBpZD1cImZvbnRCb2xkQ2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiIGZvcj1cImZvbnRCb2xkQ2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvbGQgVGV4dFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtLTJcIiBkYXRhLWJpbmQ9XCJmb3JlYWNoOiBmaWx0ZXIuRmlsdGVyc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ3aXRoOiBGaWVsZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIiBkYXRhLWJpbmQ9XCJvcHRpb25zOiBmaWVsZEZpbHRlciwgdmFsdWU6ICRwYXJlbnQuT3BlcmF0b3JcIiByZXF1aXJlZD48L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwid2l0aDogRmllbGRcIiBkYXRhLXBhcmVudHByZWZpeD1cIkNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogJ3JlcG9ydC1maWx0ZXInLCBkYXRhOiAkZGF0YVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiIGRhdGEtYmluZD1cImlmOiAkcGFyZW50c1sxXS51c2VTdG9yZWRQcm9jKClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveCBwdWxsLWxlZnRcIiBzdHlsZT1cInBhZGRpbmctdG9wOiA1cHg7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IGNoZWNrT3V0ZXJHcm91cFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0ZXIgR3JvdXBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tZGFuZ2VyXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGNhbmNlbEZpZWxkT3B0aW9uc1wiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiBkYXRhLWJpbmQ9XCJjbGljazogc2F2ZUZpZWxkT3B0aW9uc1wiPlNhdmUgQ2hhbmdlczwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L3NjcmlwdD5cclxuXHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwicmVwb3J0LWxpbmstZWRpdFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZ1wiIHN0eWxlPVwibWF4LXdpZHRoOiA3NTBweDtcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiIGRhdGEtYmluZD1cIndpdGg6IGVkaXRMaW5rRmllbGRcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGVcIj5TZXR1cCBMaW5rIEZpZWxkPC9oNT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IG5lZWRzLXZhbGlkYXRpb25cIiBkYXRhLWJpbmQ9XCJ3aXRoOiBsaW5rRmllbGRJdGVtXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNSBjb2wtbWQtNSBjb250cm9sLWxhYmVsXCI+VGhpcyBmaWVsZCB3aWxsIGxpbmsgdG88L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNyBjb2wtbWQtN1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiByZXF1aXJlZCBkYXRhLWJpbmQ9XCJvcHRpb25zOiBsaW5rVHlwZXMsIHZhbHVlOiBzZWxlY3RlZExpbmtUeXBlXCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6IExpbmtzVG9SZXBvcnRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTUgY29sLW1kLTUgY29udHJvbC1sYWJlbFwiPkxpbmsgdG8gdGhpcyBSZXBvcnQ8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTcgY29sLW1kLTdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIHJlcXVpcmVkIGRhdGEtYmluZD1cIm9wdGlvbnM6ICRwYXJlbnRDb250ZXh0LiRwYXJlbnQuU2F2ZWRSZXBvcnRzLCBvcHRpb25zVGV4dDogJ3JlcG9ydE5hbWUnLCBvcHRpb25zVmFsdWU6ICdyZXBvcnRJZCcsIHZhbHVlOiBMaW5rZWRUb1JlcG9ydElkLCBvcHRpb25zQ2FwdGlvbjogJ0Nob29zZSB0aGUgUmVwb3J0IHRvIGxpbmsgdG8nXCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImlmOiBMaW5rZWRUb1JlcG9ydElkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBTZW5kQXNGaWx0ZXJQYXJhbWV0ZXJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VuZCBmaWVsZCB2YWx1ZSBhcyBSZXBvcnQgRmlsdGVyIFBhcmFtZXRlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiIGRhdGEtYmluZD1cImlmOiBTZW5kQXNGaWx0ZXJQYXJhbWV0ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTUgY29sLW1kLTUgY29udHJvbC1sYWJlbFwiPkxpbmsgdG8gdGhpcyBSZXBvcnQgRmlsdGVyPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS03IGNvbC1tZC03XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiByZXF1aXJlZCBkYXRhLWJpbmQ9XCJvcHRpb25zOiBhbGxGaWVsZHMsIG9wdGlvbnNUZXh0OiAnZmllbGROYW1lJywgb3B0aW9uc1ZhbHVlOiAnZmllbGRJZCcsIHZhbHVlOiBTZWxlY3RlZEZpbHRlcklkLCBvcHRpb25zQ2FwdGlvbjogJ0Nob29zZSB0aGUgRmllbGQgdG8gRmlsdGVyIGJ5IHZhbHVlJ1wiPjwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZm5vdDogTGlua3NUb1JlcG9ydFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNSBjb2wtbWQtNSBjb250cm9sLWxhYmVsXCI+TGluayB0byB0aGlzIFVSTDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNyBjb2wtbWQtN1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiByZXF1aXJlZCBwbGFjZWhvbGRlcj1cIkVudGVyIGEgdXJsIHRvIG9wZW5cIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogTGlua1RvVXJsXCIgdGl0bGU9XCJWYWxpZCBVUkwgbmVlZHMgdG8gc3RhcnQgd2l0aCBodHRwOi8vIG9yIGh0dHBzOi8vXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogU2VuZEFzUXVlcnlQYXJhbWV0ZXJcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VuZCBmaWVsZCB2YWx1ZSBhcyBRdWVyeSBQYXJhbWV0ZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIiBkYXRhLWJpbmQ9XCJpZjogU2VuZEFzUXVlcnlQYXJhbWV0ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTUgY29sLW1kLTUgY29udHJvbC1sYWJlbFwiPlBhcmFtZXRlciBOYW1lIHRvIHVzZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNyBjb2wtbWQtN1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiByZXF1aXJlZCBwbGFjZWhvbGRlcj1cIkVudGVyIHBhcmFtZXRlciBuYW1lIHRvIHNlbmQgdmFsdWUgYXNcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogUXVlcnlQYXJhbWV0ZXJOYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tZGFuZ2VyXCIgZGF0YS1iaW5kPVwiY2xpY2s6IHJlbW92ZUxpbmtGaWVsZFwiPlJlbW92ZSBMaW5rPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIGRhdGEtYmluZD1cImNsaWNrOiBzYXZlTGlua0ZpZWxkXCI+U2F2ZSBDaGFuZ2VzPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvc2NyaXB0PlxyXG5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJkZXNpZ25lci1jaG9vc2UtdmlzdWFsXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCIgcm9sZT1cImdyb3VwXCIgYXJpYS1sYWJlbD1cIlZpc3VhbGl6YXRpb24gT3B0aW9uc1wiPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7IHNldFJlcG9ydFR5cGUoJ0xpc3QnKTsgfSwgY3NzOiB7IGFjdGl2ZTogUmVwb3J0VHlwZSgpPT0nTGlzdCcgfVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLTJ4IGZhLWxpc3QtYWx0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8cD5MaXN0PC9wPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7IHNldFJlcG9ydFR5cGUoJ1N1bW1hcnknKTsgfSwgY3NzOiB7IGFjdGl2ZTogUmVwb3J0VHlwZSgpPT0nU3VtbWFyeScgfVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLTJ4IGZhLXRhYmxlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8cD5TdW1tYXJ5PC9wPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7IHNldFJlcG9ydFR5cGUoJ0JhcicpOyB9LCBjc3M6IHsgYWN0aXZlOiBSZXBvcnRUeXBlKCk9PSdCYXInIH1cIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS0yeCBmYS1iYXItY2hhcnRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxwPkJhcjwvcD5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpeyBzZXRSZXBvcnRUeXBlKCdQaWUnKTsgfSwgY3NzOiB7IGFjdGl2ZTogUmVwb3J0VHlwZSgpPT0nUGllJyB9XCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtMnggZmEtcGllLWNoYXJ0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8cD5QaWU8L3A+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1zZWNvbmRhcnlcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXsgc2V0UmVwb3J0VHlwZSgnTGluZScpOyB9LCBjc3M6IHsgYWN0aXZlOiBSZXBvcnRUeXBlKCk9PSdMaW5lJyB9XCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtMnggZmEtbGluZS1jaGFydFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHA+TGluZTwvcD5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpeyBzZXRSZXBvcnRUeXBlKCdDb21ibycpOyB9LCBjc3M6IHsgYWN0aXZlOiBSZXBvcnRUeXBlKCk9PSdDb21ibycgfVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLTJ4IGZhLXNpZ25hbFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHA+Q29tYm88L3A+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1zZWNvbmRhcnlcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXsgc2V0UmVwb3J0VHlwZSgnSHRtbCcpOyB9LCBjc3M6IHsgYWN0aXZlOiBSZXBvcnRUeXBlKCk9PSdIdG1sJyB9XCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtMnggZmEtY29kZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHA+Q3VzdG9tPC9wPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7IHNldFJlcG9ydFR5cGUoJ01hcCcpOyB9LCBjc3M6IHsgYWN0aXZlOiBSZXBvcnRUeXBlKCkuaW5kZXhPZignTWFwJyk9PTAgfVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLTJ4IGZhLWdsb2JlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8cD5NYXA8L3A+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1zZWNvbmRhcnlcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXsgc2V0UmVwb3J0VHlwZSgnSGVhdE1hcCcpOyB9LCBjc3M6IHsgYWN0aXZlOiBSZXBvcnRUeXBlKCkuaW5kZXhPZignSGVhdE1hcCcpPT0wIH1cIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS0yeCBmYS1tYXBcIj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxwPkhlYXRNYXA8L3A+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1zZWNvbmRhcnlcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXsgc2V0UmVwb3J0VHlwZSgnU2luZ2xlJyk7IH0sIGNzczogeyBhY3RpdmU6IFJlcG9ydFR5cGUoKT09J1NpbmdsZScgfVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLTJ4IGZhLXdpbmRvdy1tYXhpbWl6ZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHA+S1BJPC9wPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7IHNldFJlcG9ydFR5cGUoJ1RyZWVtYXAnKTsgfSwgY3NzOiB7IGFjdGl2ZTogUmVwb3J0VHlwZSgpPT0nVHJlZW1hcCcgfVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLTJ4IGZhLXdpbmRvdy1yZXN0b3JlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8cD5UcmVlbWFwPC9wPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5XCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7IHNldFJlcG9ydFR5cGUoJ1Bpdm90Jyk7IH0sIGNzczogeyBhY3RpdmU6IFJlcG9ydFR5cGUoKT09J1Bpdm90JyB9XCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtMnggZmEtcmFuZG9tXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8cD5UcmFuc3Bvc2U8L3A+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuPC9zY3JpcHQ+XHJcblxyXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2h0bWxcIiBpZD1cImRlc2lnbmVyLWNob29zZS1kYXRhXCI+XHJcbiAgICA8ZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnQgYnRuLWdyb3VwIGJ0bi1ncm91cC10b2dnbGVcIiByb2xlPVwiZ3JvdXBcIiBkYXRhLWJpbmQ9XCJpZjogUmVwb3J0SUQoKSA8PSAwXCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImJ0biBidG4tc20gYnRuLWxpZ2h0IGFjdGl2ZVwiIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiAwcHg7XCIgdGl0bGU9XCJZb3UgY2FuIGNoYW5nZSB0aGUgRGF0YSBzb3VyY2Ugb25seSB3aGVuIGNyZWF0aW5nIGEgbmV3IHJlcG9ydCwgY2hhbmdpbmcgdGhpcyB3aWxsIGNsZWFyIGFsbCBzZWxlY3Rpb25zXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cImRhdGFvcHRpb25cIiBpZD1cInRhYmxlXCIgY2hlY2tlZCBkYXRhLWJpbmQ9XCJjaGVja2VkOiB1c2VTdG9yZWRQcm9jLCBjaGVja2VkVmFsdWU6IGZhbHNlXCI+IER5bmFtaWNcclxuICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tbGlnaHQgYWN0aXZlXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cImRhdGFvcHRpb25cIiBpZD1cInByb2NcIiB2YWx1ZT1cIjFcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiB1c2VTdG9yZWRQcm9jLCBjaGVja2VkVmFsdWU6IHRydWVcIj4gUHJlZGVmaW5lZFxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLXJpZ2h0XCI+XHJcbiAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeSBidG4tc21cIiB0aXRsZT1cIkFkZCBDdXN0b20gRmllbGQgdXNpbmcgRm9ybXVsYVwiIGRhdGEtYmluZD1cImhpZGRlbjogaXNGdW5jdGlvbkZpZWxkKCkgfHwgdXNlU3RvcmVkUHJvYygpLCBjbGljazogY2FuY2VsRm9ybXVsYUZpZWxkLCB0ZXh0OiBpc0Zvcm11bGFGaWVsZCgpPyAnQ2FuY2VsJzogJ0N1c3RvbSBGaWVsZCcsIGNzczogeydidG4tcHJpbWFyeSc6ICFpc0Zvcm11bGFGaWVsZCgpLCAnYnRuLWRhbmdlcic6IGlzRm9ybXVsYUZpZWxkfVwiPjwvYT5cclxuICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5IGJ0bi1zbVwiIHRpdGxlPVwiQWRkIEN1c3RvbSBGaWVsZCB1c2luZyBGdW5jdGlvblwiIGRhdGEtYmluZD1cImhpZGRlbjogdHJ1ZSB8fCBpc0Zvcm11bGFGaWVsZCgpIHx8IHVzZVN0b3JlZFByb2MoKSwgY2xpY2s6IGZ1bmN0aW9uKCl7ZGVzaWduRnVuY3Rpb25GaWVsZCgpfSwgdGV4dDogaXNGdW5jdGlvbkZpZWxkKCk/ICdDYW5jZWwnOiAnRnVuY3Rpb24gRmllbGQnLCBjc3M6IHsnYnRuLXByaW1hcnknOiAhaXNGdW5jdGlvbkZpZWxkKCksICdidG4tZGFuZ2VyJzogaXNGdW5jdGlvbkZpZWxkfVwiPjwvYT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImNsZWFyZml4XCI+PC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiIGRhdGEtYmluZD1cImRpc2FibGU6IGlzRm9ybXVsYUZpZWxkLCBoaWRkZW46IHVzZVN0b3JlZFByb2NcIj5cclxuICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ3aXRoOiB0ZXh0UXVlcnkuc2VhcmNoRmllbGRzXCI+XHJcbiAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPVwic2VhcmNoLWZpZWxkXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBkYXRhLWJpbmQ9XCJzZWxlY3QyOiB7ZHJvcGRvd25QYXJlbnQ6ICRyb290LmFjdGl2ZURlc2lnbigpID8gJCgnI2Nob29zZS1kYXRhLWRlc2lnbicpIDogJCgnI2Nob29zZS1kYXRhLWNhcmQnKSwgcGxhY2Vob2xkZXI6ICdTZWFyY2ggZm9yIGEgRGF0YSBGaWVsZC4uLicsIGFqYXg6IHsgdXJsOiB1cmwsIGRhdGFUeXBlOiAnanNvbicsIGRhdGE6IHF1ZXJ5LCBwcm9jZXNzUmVzdWx0czogcHJvY2Vzc1Jlc3VsdHMsIGhlYWRlcnM6IGhlYWRlcnMgfSwgbWluaW11bUlucHV0TGVuZ3RoOiAyLCBhbGxvd0NsZWFyOiB0cnVlIH0sIHZhbHVlOiBzZWxlY3RlZE9wdGlvblwiPjwvc2VsZWN0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiIGRhdGEtYmluZD1cInZpc2libGU6IHVzZVN0b3JlZFByb2NcIj5cclxuICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBkYXRhLWJpbmQ9XCJzZWxlY3QyVmFsdWU6IHtkcm9wZG93blBhcmVudDogJHJvb3QuYWN0aXZlRGVzaWduKCkgPyAkKCcjY2hvb3NlLWRhdGEtZGVzaWduJykgOiAkKCcjY2hvb3NlLWRhdGEtY2FyZCcpfSwgb3B0aW9uczogUHJvY3MsIG9wdGlvbnNDYXB0aW9uOiAnQ2hvb3NlIFNlY3Rpb24uLi4nLCBvcHRpb25zVGV4dDogJ0Rpc3BsYXlOYW1lJywgdmFsdWU6IFNlbGVjdGVkUHJvYywgdmlzaWJsZTogdXNlU3RvcmVkUHJvY1wiPjwvc2VsZWN0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCIgZGF0YS1iaW5kPVwiaGlkZGVuOiB1c2VTdG9yZWRQcm9jXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG1iLTJcIiBzdHlsZT1cInBhZGRpbmctdG9wOiAxNXB4O1wiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgU2VsZWN0IERhdGEgdG8gdXNlIGluIFJlcG9ydFxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtaW5mby1jaXJjbGUgdGV4dC1tdXRlZFwiIGRhdGEtdG9nZ2xlPVwidG9vbHRpcFwiIHRpdGxlPVwiQ2hvb3NlIGEgdGFibGUgdG8gc2hvdyBmaWVsZHMgdG8gc2VsZWN0LlwiPjwvaT5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0YS1zZWxlY3QtdHJlZVwiPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiBDYXRlZ29yaXplZFRhYmxlcyAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKSB7IGlzRXhwYW5kZWQoIWlzRXhwYW5kZWQoKSk7IH0sIHZpc2libGU6IGNhdGVnb3J5TmFtZVwiIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhXCIgZGF0YS1iaW5kPVwiY3NzOiBpc0V4cGFuZGVkKCkgPyAnZmEtY2hldnJvbi1kb3duIHRleHQtc2Vjb25kYXJ5JyA6ICdmYS1jaGV2cm9uLXJpZ2h0IHRleHQtc2Vjb25kYXJ5J1wiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYVwiIGRhdGEtYmluZD1cImNzczogaXNFeHBhbmRlZCgpID8gJ2ZhLWZvbGRlci1vcGVuJyA6ICdmYS1mb2xkZXInXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBjYXRlZ29yeU5hbWVcIiBjbGFzcz1cIm1sLTJcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlcG9ydC1saXN0XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogaXNFeHBhbmRlZCgpLCBmb3JlYWNoOiB0YWJsZXNcIiBzdHlsZT1cInBhZGRpbmctbGVmdDogMTVweDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBib3JkZXItYm90dG9tIHB5LTIgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1sZWZ0XCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCkgeyBzZWxlY3RUYWJsZSgkZGF0YSk7IH0sIGNzczogeyd0ZXh0LW11dGVkJzogIWlzRW5hYmxlZCgpfSwgc3R5bGU6IHtjdXJzb3I6IGlzRW5hYmxlZCgpID8gJ3BvaW50ZXInIDogJyd9LCBhdHRyOiB7dGl0bGU6ICFpc0VuYWJsZWQoKSA/ICdDYW5ub3QgdXNlIHRhYmxlIGFzIGpvaW5zIGRvIG5vdCBleGlzdCc6ICcnfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtc2Vjb25kYXJ5IGZhXCIgZGF0YS1iaW5kPVwiY3NzOiBpc0VuYWJsZWQoKSA/ICgkZGF0YSA9PT0gJHBhcmVudHNbMV0uU2VsZWN0ZWRUYWJsZSgpID8gJ2ZhLWNoZXZyb24tZG93bicgOiAnZmEtY2hldnJvbi1yaWdodCcpIDogJ2ZhLWJhbidcIj48L3NwYW4+Jm5ic3A7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtdGFibGVcIj48L3NwYW4+Jm5ic3A7PHNwYW4gZGF0YS1iaW5kPVwidGV4dDogdGFibGVOYW1lXCIgY2xhc3M9XCJcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtcmlnaHRcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAkZGF0YSA9PT0gJHBhcmVudHNbMV0uU2VsZWN0ZWRUYWJsZSgpICYmICEkcGFyZW50c1sxXS5pc0Zvcm11bGFGaWVsZCgpICYmICEkcGFyZW50c1sxXS5TZWxlY3RlZFRhYmxlKCkuZHluYW1pY0NvbHVtbnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cInNtYWxsIHRleHQtbXV0ZWRcIiBkYXRhLWJpbmQ9XCJjbGljazogJHBhcmVudHNbMV0uTW92ZUFsbEZpZWxkc1wiPlNlbGVjdCBhbGw8L2E+IHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cInNtYWxsIHRleHQtbXV0ZWRcIiBkYXRhLWJpbmQ9XCJjbGljazogJHBhcmVudHNbMV0uUmVtb3ZlU2VsZWN0ZWRGaWVsZHNcIj5SZW1vdmUgYWxsPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBGaWVsZHMgRXhwYW5kIEhlcmUgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInZpc2libGU6ICRkYXRhID09PSAkcGFyZW50c1sxXS5TZWxlY3RlZFRhYmxlKClcIiBzdHlsZT1cInBhZGRpbmctbGVmdDogMzBweDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6ICRwYXJlbnRzWzFdLkNob29zZUZpZWxkcyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGJvcmRlci1ib3R0b20gcHktMiBhbGlnbi1pdGVtcy1jZW50ZXIgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWRJbkFycmF5OiB7YXJyYXk6ICRwYXJlbnRzWzJdLmlzRm9ybXVsYUZpZWxkKCkgPyAkcGFyZW50c1syXS5mb3JtdWxhRmllbGRzIDogJHBhcmVudHNbMl0uU2VsZWN0ZWRGaWVsZHMsIHZhbHVlOiAkZGF0YX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBmaWVsZE5hbWVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tL2tvLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L3NjcmlwdD5cclxuXHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwiZGVzaWduZXItc2VsZWN0ZWQtZGF0YVwiPlxyXG4gICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBTZWxlY3RlZEZpZWxkcygpLmxlbmd0aCA9PSAwXCI+XHJcbiAgICAgICAgUGxlYXNlIGNob29zZSBkYXRhXHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6IFNlbGVjdGVkRmllbGRzKCkubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogUmVwb3J0VHlwZSgpPT0nQmFyJ1wiIGNsYXNzPVwiY2FyZCBjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWluZm8gc21hbGwgcHktMSBtYi0yXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtbGlnaHRidWxiLW9cIj48L3NwYW4+Jm5ic3A7Rm9yIEJhciBHcmFwaCwgdGhlIGZpcnN0IGZpZWxkIGJlbG93IHdpbGwgc2hvdyBvbiB0aGUgeC1heGlzLiBBbGwgb3RoZXIgbnVtZXJpYyBmaWVsZHMgd2lsbCBzaG93IG9uIHktYXhpcy5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvdyBzbWFsbFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3ggY29sLTZcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBiYXJDaGFydEhvcml6b250YWxcIiAvPlxyXG4gICAgICAgICAgICAgICAgSG9yaXpvbnRhbCBCYXIgQ2hhcnRcclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3ggY29sLTZcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBiYXJDaGFydFN0YWNrZWRcIiAvPlxyXG4gICAgICAgICAgICAgICAgU3RhY2tlZCBCYXIgQ2hhcnRcclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBSZXBvcnRUeXBlKCk9PSdQaWUnXCIgY2xhc3M9XCJjYXJkIGNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mbyBzbWFsbCBweS0xIG1iLTJcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1saWdodGJ1bGItb1wiPjwvc3Bhbj4mbmJzcDtGb3IgUGllIEdyYXBoLCB0aGUgZmlyc3QgZmllbGQgYmVsb3cgd2lsbCBiZSBncm91cGVkLCBhbmQgdGhlIGZpcnN0IG51bWVyaWMgZmllbGQgd2lsbCBzaG93IGFzIHRoZSByYXRpby5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvdyBzbWFsbFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3ggY29sLTZcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBwaWVDaGFydERvbnV0XCIgLz5cclxuICAgICAgICAgICAgICAgIERvbnV0IENoYXJ0XHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogUmVwb3J0VHlwZSgpPT0nVHJlZW1hcCdcIiBjbGFzcz1cImNhcmQgY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvIHNtYWxsIHB5LTEgbWItMFwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWxpZ2h0YnVsYi1vXCI+PC9zcGFuPiZuYnNwO0ZvciBUcmVlbWFwLCB0aGUgZGF0YSBtdXN0IGJlIGluIGEgaGllcmFyY2hpY2FsIGZvcm1hdCB3aXRoIDJuZCBjb2x1bW4gaGF2aW5nIHBhcmVudCBhbmQgdGhpcmQgY29sdW1uIGhhdmluZyBhIG51bWVyaWMgdmFsdWUuIFRoZSBkYXRhIG11c3QgaGF2ZSBhIHNpbmdsZSByb290IG5vZGUgaGF2aW5nIG51bGwgYXMgaXRzIHBhcmVudCBhcyB3ZWxsLlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInZpc2libGU6IFJlcG9ydFR5cGUoKT09J0hlYXRNYXAnXCIgY2xhc3M9XCJjYXJkIGNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mbyBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWxpZ2h0YnVsYi1vIGZhLTJ4XCI+PC9zcGFuPiZuYnNwO0ZvciBIZWF0TWFwLCB0aGUgZmlyc3QgdHdvIGNvbHVtbnMgbXVzdCBiZSBudW1lcmljIHZhbHVlcyByZXByZXNlbnRpbmdcclxuICAgICAgICAgICAgICAgIDxzdHJvbmc+TGF0aXR1ZGU8L3N0cm9uZz4gYW5kIDxzdHJvbmc+TG9uZ2l0dWRlPC9zdHJvbmc+LiBBdCBsZWFzdCBvbmUgYWRkaXRpb25hbCBudW1lcmljIGNvbHVtbiBpcyByZXF1aXJlZCB0byBwcm92aWRlIHRoZVxyXG4gICAgICAgICAgICAgICAgPHN0cm9uZz5pbnRlbnNpdHk8L3N0cm9uZz4gb2YgZWFjaCBwb2ludC5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3cgbWItMlwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94IGNvbC02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogaGVhdE1hcE9wdGlvbnMuc2hvd01hcmtlclwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFNob3cgTWFya2VyXHJcbiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvdyBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtMTIgZnctYm9sZFwiPkhlYXRtYXAgQ29sb3JzPC9sYWJlbD5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTQgbWItMlwiPiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiIGNsYXNzPVwiY29sb3ItcGlja2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cInZhbHVlOiBoZWF0TWFwT3B0aW9ucy5ncmFkaWVudDFcIiB0aXRsZT1cIkdyYWRpZW50IDFcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTQgbWItMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBjbGFzcz1cImNvbG9yLXBpY2tlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJ2YWx1ZTogaGVhdE1hcE9wdGlvbnMuZ3JhZGllbnQyXCIgdGl0bGU9XCJHcmFkaWVudCAyXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC00IG1iLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNvbG9yXCIgY2xhc3M9XCJjb2xvci1waWNrZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwidmFsdWU6IGhlYXRNYXBPcHRpb25zLmdyYWRpZW50M1wiIHRpdGxlPVwiR3JhZGllbnQgM1wiIC8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogUmVwb3J0VHlwZSgpPT0nTGluZSdcIiBjbGFzcz1cImNhcmQgY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvIHNtYWxsIHB5LTEgbWItMlwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWxpZ2h0YnVsYi1vXCI+PC9zcGFuPiZuYnNwO0ZvciBMaW5lIEdyYXBoLCB0aGUgZmlyc3QgZmllbGQgYmVsb3cgd2lsbCBzaG93IG9uIHRoZSB4LWF4aXMuIEFsbCBvdGhlciBmaWVsZHMgd2lsbCBudW1lcmljIGZpZWxkcyB3aWxsIHNob3cgb24geS1heGlzLlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93IHNtYWxsXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveCBjb2wtNlwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IGxpbmVDaGFydEFyZWFcIiAvPlxyXG4gICAgICAgICAgICAgICAgQXJlYSBDaGFydFxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInZpc2libGU6IFJlcG9ydFR5cGUoKT09J0NvbWJvJ1wiIGNsYXNzPVwiY2FyZCBjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWluZm8gc21hbGwgcHktMSBtYi0yXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtbGlnaHRidWxiLW9cIj48L3NwYW4+Jm5ic3A7Rm9yIENvbWJvIEdyYXBoLCB0aGUgZmlyc3QgZmllbGQgYmVsb3cgd2lsbCBzaG93IG9uIHRoZSB4LWF4aXMuIEFsbCBvdGhlciBudW1lcmljIGZpZWxkcyB3aWxsIHNob3cgb24geS1heGlzLCBhbmQgeW91IGNhbiBjaG9vc2UgZGlzcGxheSBlYWNoIHNlcmllcyBhcyBsaW5lLCBiYXIgb3IgYXJlYS5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvdyBzbWFsbFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbD5EZWZhdWx0IFNlcmllcyBUeXBlPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdCBmb3JtLXNlbGVjdC1zbVwiIGRhdGEtYmluZD1cIm9wdGlvbnM6IHNlcmllc1R5cGVzLCB2YWx1ZTogY29tYm9DaGFydFR5cGVcIj48L3NlbGVjdD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInZpc2libGU6IFJlcG9ydFR5cGUoKT09J1Bpdm90J1wiIGNsYXNzPVwiY2FyZCBjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWluZm8gc21hbGwgcHktMSBtYi0wXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtbGlnaHRidWxiLW9cIj48L3NwYW4+Jm5ic3A7Rm9yIFRyYW5zcG9zZSwgdGhlIGZpcnN0IGZpZWxkIGJlbG93IHdpbGwgYmUgdXNlZCB0byBQaXZvdC9UcmFuc3Bvc2UgdGhlIHJvd3MgYXMgY29sdW1ucywgYW5kIGl0IG11c3QgYmUgZ3JvdXBlZC5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogUmVwb3J0VHlwZSgpPT0nU2luZ2xlJ1wiIGNsYXNzPVwiY2FyZCBjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWluZm8gc21hbGwgcHktMSBtYi0wXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtbGlnaHRidWxiLW9cIj48L3NwYW4+Jm5ic3A7S1BJIGlzIGEgc2luZ2xlIHZhbHVlIHJlcG9ydCB0aGF0IGlzIGlkZWFsIGZvciBwbGFjaW5nIG9uIGEgRGFzaGJvYXJkLiBBbGwgZmllbGRzIGV4Y2VwdCBvbmUgbXVzdCBiZSBoaWRkZW4gZm9yIFdpZGdldHMuXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInZpc2libGU6IFJlcG9ydFR5cGUoKT09J0h0bWwnXCIgY2xhc3M9XCJjYXJkIGNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3cgc21hbGxcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94IGNvbC02XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogZG9udEdyb3VwQ3VzdG9tXCIgLz5cclxuICAgICAgICAgICAgICAgIExpc3QgKERvbid0IFN1bW1hcml6ZSlcclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBSZXBvcnRUeXBlKCk9PSdNYXAnXCIgY2xhc3M9XCJjYXJkIGNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mbyBzbWFsbCBweS0xIG1iLTJcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1saWdodGJ1bGItb1wiPjwvc3Bhbj4mbmJzcDtGb3IgTWFwIEdyYXBoLCB0aGUgZmlyc3QgZmllbGQgYmVsb3cgaGFzIHRvIGJlIGEgUmVnaW9uLCBsaWtlIGEgQ291bnRyeS5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvdyBzbWFsbFwiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMyBjb250cm9sLWxhYmVsXCI+TWFwIERpc3BsYXk8L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTVcIj5cclxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdCBmb3JtLXNlbGVjdC1zbVwiIGRhdGEtYmluZD1cIm9wdGlvbnM6IG1hcFJlZ2lvbnMsIHZhbHVlOiBtYXBSZWdpb25cIj48L3NlbGVjdD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8dWwgY2xhc3M9XCJsaXN0LWdyb3VwXCIgZGF0YS1iaW5kPVwic29ydGFibGU6IHsgZGF0YTogU2VsZWN0ZWRGaWVsZHMsIG9wdGlvbnM6IHsgaGFuZGxlOiAnLnNvcnRhYmxlJywgY3Vyc29yOiAnbW92ZScsIHBsYWNlaG9sZGVyOiAnZHJvcC1oaWdobGlnaHQnIH0sIHN0cmF0ZWd5TW92ZTogdHJ1ZSB9XCI+XHJcbiAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic29ydGFibGUgcHVsbC1sZWZ0XCIgc3R5bGU9XCJwYWRkaW5nLXJpZ2h0OiAxNXB4O1wiIGRhdGEtYmluZD1cImlmbm90OiAkcGFyZW50LnVzZVN0b3JlZFByb2NcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1lbGxpcHNpcy12XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgdGl0bGU9XCJEcmFnIHRvIHJlb3JkZXJcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtY29sdW1uc1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBzZWxlY3RlZEZpZWxkTmFtZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBpc0Zvcm11bGFGaWVsZCgpID8gJygnICsgZmllbGRGb3JtYXQoKSArICcpJyA6ICcnXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cInZpc2libGU6ICEkcGFyZW50LmlzRmllbGRWYWxpZEZvcllBeGlzKCRpbmRleCgpLCBmaWVsZFR5cGUgfHwgZmllbGRGb3JtYXQoKSwgc2VsZWN0ZWRBZ2dyZWdhdGUoKSkgJiYgJHBhcmVudC5SZXBvcnRUeXBlKCkgIT0nVHJlZW1hcCcgJiYgJHBhcmVudC5pc0NoYXJ0KClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZSBiZy1kYW5nZXJcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAhZ3JvdXBJbkdyYXBoKClcIj5XaWxsIG5vdCBzaG93IGluIDxzcGFuIGRhdGEtYmluZD1cInRleHQ6ICRwYXJlbnQuUmVwb3J0VHlwZVwiPjwvc3Bhbj5DaGFydDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidmlzaWJsZTogJHBhcmVudC5Jc1Bpdm90RmllbGRMYXN0Q29sdW1uKCRpbmRleCgpLHNlbGVjdGVkQWdncmVnYXRlKCkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctZGFuZ2VyXCIgPlBpdm90IGZpZWxkIGNhbm5vdCBiZSB0aGUgbGFzdCBjb2x1bW4uPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAkcGFyZW50LklzRHluYW1pY0ZpZWxkRmlyc3RDb2x1bW4oJGluZGV4KCkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFkZ2UgYmctZGFuZ2VyXCIgPkR5bmFtaWMgY2Fubm90IGJlIGZpcnN0IGNvbHVtbi48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1yaWdodFwiIHN0eWxlPVwibWFyZ2luLXRvcDogLTVweDtcIiBkYXRhLWJpbmQ9XCJpZjogJHBhcmVudC5BZ2dyZWdhdGVSZXBvcnQoKSAmJiAhJHBhcmVudC51c2VTdG9yZWRQcm9jKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0IGZvcm0tY29udHJvbC1zbVwiIGRhdGEtYmluZD1cIm9wdGlvbnM6ICRwYXJlbnQuY2FuRHJpbGxkb3duKCkgJiYgJGluZGV4KCk+MCA/IGZpZWxkQWdncmVnYXRlV2l0aERyaWxsZG93biA6IGZpZWxkQWdncmVnYXRlLCB2YWx1ZTogc2VsZWN0ZWRBZ2dyZWdhdGVcIj48L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtcmlnaHRcIiBzdHlsZT1cInBhZGRpbmctcmlnaHQ6IDEwcHg7XCIgZGF0YS1iaW5kPVwiaWZub3Q6ICRwYXJlbnQudXNlU3RvcmVkUHJvY1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLXRyYXNoLW9cIiB0aXRsZT1cIkNhbm5vdCBEZWxldGUgUmVxdWlyZWQgRmlsdGVyXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogZm9yY2VGaWx0ZXJGb3JUYWJsZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS10cmFzaFwiIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyO1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIHRpdGxlPVwiRGVsZXRlIHRoaXMgRmllbGRcIiBkYXRhLWJpbmQ9XCJjbGljazogJHBhcmVudC5SZW1vdmVGaWVsZCwgaGlkZGVuOiBmb3JjZUZpbHRlckZvclRhYmxlXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS08ZGl2IGNsYXNzPVwicHVsbC1yaWdodFwiIHN0eWxlPVwicGFkZGluZy1yaWdodDogMTBweDtcIiBkYXRhLWJpbmQ9XCJpZm5vdDogJHBhcmVudC51c2VTdG9yZWRQcm9jXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnV0dG9uLWJveCBuby1wYWRkaW5nXCIgdGFiaW5kZXg9XCIwXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7IGZpbHRlck9uRmx5KCFmaWx0ZXJPbkZseSgpKTsgfSwgY3NzOiB7YWN0aXZlOiBmaWx0ZXJPbkZseSgpPT10cnVlfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1maWx0ZXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIiB0aXRsZT1cIkZpbHRlciBieSB0aGlzIGZpZWxkIG9uIHRoZSBSZXBvcnRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj4tLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1yaWdodFwiIHN0eWxlPVwicGFkZGluZy1yaWdodDogMTBweDtcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAkcGFyZW50LlJlcG9ydFR5cGUoKSE9J1Bpdm90J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJ1dHRvbi1ib3ggbm8tcGFkZGluZ1wiIHRhYmluZGV4PVwiMFwiIGRhdGEtYmluZD1cImNsaWNrOiB0b2dnbGVEaXNhYmxlLCBjc3M6IHthY3RpdmU6IGRpc2FibGVkKCk9PXRydWV9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWNsb3NlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgdGl0bGU9XCJEbyBub3QgaW5jbHVkZSBpbiBSZXBvcnRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1yaWdodFwiIHN0eWxlPVwicGFkZGluZy1yaWdodDogMTBweDtcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAkcGFyZW50LlJlcG9ydFR5cGUoKSE9J1Bpdm90JyAmJiAkcGFyZW50LlJlcG9ydFR5cGUoKSE9J0xpc3QnICYmICEkcGFyZW50LnVzZVN0b3JlZFByb2MoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJ1dHRvbi1ib3ggbm8tcGFkZGluZ1wiIHRhYmluZGV4PVwiMFwiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpeyBoaWRlSW5EZXRhaWwoIWhpZGVJbkRldGFpbCgpKTsgfSwgY3NzOiB7YWN0aXZlOiBoaWRlSW5EZXRhaWwoKT09dHJ1ZX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtZXllLXNsYXNoXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgdGl0bGU9XCJIaWRlIGluIERldGFpbHNcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1yaWdodFwiIHN0eWxlPVwicGFkZGluZy1yaWdodDogMTBweDtcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAkcGFyZW50LmlzRmllbGRWYWxpZEZvcllBeGlzKCRpbmRleCgpLCBmaWVsZFR5cGUgfHwgZmllbGRGb3JtYXQoKSwgc2VsZWN0ZWRBZ2dyZWdhdGUoKSkgICYmICRwYXJlbnQuaXNDaGFydCgpICYmICRpbmRleCgpPjBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJidXR0b24tYm94IG5vLXBhZGRpbmdcIiB0YWJpbmRleD1cIjBcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXsgZ3JvdXBJbkdyYXBoKCFncm91cEluR3JhcGgoKSk7IH0sIGNzczoge2FjdGl2ZTogZ3JvdXBJbkdyYXBoKCk9PWZhbHNlfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1zaWduYWxcIiBhcmlhLWhpZGRlbj1cInRydWVcIiB0aXRsZT1cIkluY2x1ZGUgaW4gc2VyaWVzXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtcmlnaHRcIiBzdHlsZT1cInBhZGRpbmctcmlnaHQ6IDEwcHg7XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogJHBhcmVudC5JbmNsdWRlU3ViVG90YWwoKSAgJiYgIChbJ0ludCcsICdEb3VibGUnLCAnTW9uZXknLCAnRGVjaW1hbCcsICdDdXJyZW5jeSddLmluZGV4T2YoZmllbGRUeXBlKSA+PSAwIHx8IFsnSW50JywgJ0RvdWJsZScsICdNb25leScsICdEZWNpbWFsJywgJ0N1cnJlbmN5J10uaW5kZXhPZihmaWVsZEZvcm1hdCgpKSA+PSAwKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJ1dHRvbi1ib3ggbm8tcGFkZGluZ1wiIHRhYmluZGV4PVwiMFwiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpeyBkb250U3ViVG90YWwoIWRvbnRTdWJUb3RhbCgpKTsgfSwgY3NzOiB7YWN0aXZlOiBkb250U3ViVG90YWwoKT09dHJ1ZX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtcGx1cy1jaXJjbGVcIiBhcmlhLWhpZGRlbj1cInRydWVcIiB0aXRsZT1cIkRvbid0IGFkZCB0byBUb3RhbCByb3dcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1yaWdodFwiIHN0eWxlPVwicGFkZGluZy1yaWdodDogMTBweDtcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAkcGFyZW50LlJlcG9ydFR5cGUoKSE9J1Bpdm90J1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJ1dHRvbi1ib3ggbm8tcGFkZGluZ1wiIHRhYmluZGV4PVwiMFwiIGRhdGEtYmluZD1cImNsaWNrOiBzZXR1cExpbmtGaWVsZCwgY3NzOiB7YWN0aXZlOiBsaW5rRmllbGQoKT09dHJ1ZX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtbGlua1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIHRpdGxlPVwiTGluayB0byBhbm90aGVyIFJlcG9ydCBvciBVcmxcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1yaWdodFwiIHN0eWxlPVwicGFkZGluZy1yaWdodDogMTBweDtcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAkcGFyZW50LlJlcG9ydFR5cGUoKT09J0NvbWJvJyAmJiAkcGFyZW50LmlzRmllbGRWYWxpZEZvcllBeGlzKCRpbmRleCgpLCBmaWVsZFR5cGUgfHwgZmllbGRGb3JtYXQoKSwgc2VsZWN0ZWRBZ2dyZWdhdGUoKSkgICYmICRwYXJlbnQuaXNDaGFydCgpICYmICRpbmRleCgpPjBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJidXR0b24tYm94IG5vLXBhZGRpbmdcIiB0YWJpbmRleD1cIjBcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXsgc2VyaWVzVHlwZShzZXJpZXNUeXBlKCkgPT0gJ2xpbmUnID8gJ2FyZWEnIDogKHNlcmllc1R5cGUoKT09J2JhcnMnID8gJ2xpbmUnIDogJ2JhcnMnKSk7IH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmFcIiBhcmlhLWhpZGRlbj1cInRydWVcIiBkYXRhLWJpbmQ9XCJjc3M6IHsnZmEtbGluZS1jaGFydCc6IHNlcmllc1R5cGUoKSA9PSAnbGluZScsICdmYS1iYXItY2hhcnQnOiBzZXJpZXNUeXBlKCkgPT0gJ2JhcnMnLCAnZmEtYXJlYS1jaGFydCc6IHNlcmllc1R5cGUoKT09J2FyZWEnIH0sIGF0dHI6IHt0aXRsZTogc2VyaWVzVHlwZX1cIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1yaWdodFwiIHN0eWxlPVwicGFkZGluZy1yaWdodDogMTBweDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJidXR0b24tYm94IG5vLXBhZGRpbmdcIiB0YWJpbmRleD1cIjBcIiBkYXRhLWJpbmQ9XCJjbGljazogc2V0dXBGaWVsZE9wdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtZ2VhclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIHRpdGxlPVwiTW9yZSBPcHRpb25zXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtcmlnaHRcIiBzdHlsZT1cInBhZGRpbmctcmlnaHQ6IDEwcHg7XCIgZGF0YS1iaW5kPVwiaWY6IGlzRm9ybXVsYUZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnV0dG9uLWJveCBuby1wYWRkaW5nXCIgdGFiaW5kZXg9XCIwXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGVkaXRGb3JtdWxhRmllbGRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtcGVuY2lsXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgdGl0bGU9XCJFZGl0IEZvcm11bGEgRmllbGRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2xpPlxyXG4gICAgPC91bD5cclxuPC9zY3JpcHQ+XHJcblxyXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2h0bWxcIiBpZD1cImRlc2lnbmVyLXN1Yi1yZXBvcnRcIj5cclxuICAgIDxwIGNsYXNzPVwidGV4dC1tdXRlZCBtYi0zXCI+XHJcbiAgICAgICAgTGlua2VkIHJlcG9ydHMgYXJlIGF2YWlsYWJsZSB0byBhZGQgYXMgc3ViIHJlcG9ydHMuXHJcbiAgICAgICAgU2VsZWN0aW5nIHN1YiByZXBvcnRzIHdpbGwgcmVzdHJpY3QgdGhlIHJlcG9ydCB0byA8c3Ryb25nPm9uZSByZWNvcmQgcGVyIHBhZ2U8L3N0cm9uZz4uXHJcbiAgICA8L3A+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIlxyXG4gICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwib3B0aW9uczogbGlua2VkUmVwb3J0RmllbGRzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1RleHQ6ICduYW1lJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzZWxlY3RlZFN1YlJlcG9ydCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNDYXB0aW9uOiAnU2VsZWN0IGEgbGlua2VkIHJlcG9ydC4uLidcIj5cclxuICAgICAgICA8L3NlbGVjdD5cclxuICAgIDwvZGl2PlxyXG4gICAgPHVsIGNsYXNzPVwibGlzdC1ncm91cFwiXHJcbiAgICAgICAgZGF0YS1iaW5kPVwic29ydGFibGU6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogc3ViUmVwb3J0cyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogeyBoYW5kbGU6ICcuc29ydGFibGUnLCBjdXJzb3I6ICdtb3ZlJywgcGxhY2Vob2xkZXI6ICdkcm9wLWhpZ2hsaWdodCcgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cIj5cclxuICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICA8c3Bhbj5cclxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYmFycyBzb3J0YWJsZSBtZS0yXCIgc3R5bGU9XCJjdXJzb3I6bW92ZTtcIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBuYW1lXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1kYW5nZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cImNsaWNrOiAkcGFyZW50LnJlbW92ZVN1YlJlcG9ydFwiPlxyXG4gICAgICAgICAgICAgICAgRGVsZXRlXHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvbGk+XHJcbiAgICA8L3VsPlxyXG48L3NjcmlwdD5cclxuXHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwiZGVzaWduZXItaHRtbFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInJvdyBhbGlnbi1pdGVtcy1jZW50ZXIgbWItMVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxyXG4gICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIGRhdGEtYmluZD1cIm9wdGlvbnM6IFNlbGVjdGVkRmllbGRzLCB2YWx1ZTogU2VsZWN0RmllbGRUb0luc2VydCwgb3B0aW9uc0NhcHRpb246ICdTZWxlY3QgYSBmaWVsZC4uLicsIG9wdGlvbnNUZXh0OiAnc2VsZWN0ZWRGaWVsZE5hbWUnXCI+PC9zZWxlY3Q+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1hdXRvIGRyb3Bkb3duXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5IGJ0bi1zbSBkcm9wZG93bi10b2dnbGVcIiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1icy10b2dnbGU9XCJkcm9wZG93blwiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXRhYmxlXCI+PC9pPiBJbnNlcnQgYXMgVGFibGVcclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDx1bCBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIj5cclxuICAgICAgICAgICAgICAgIDxsaT48YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBocmVmPVwiI1wiIGRhdGEtYmluZD1cImNsaWNrOiBpbnNlcnRGaWVsZFRhYmxlVHJhbnNwb3NlZFwiPlRyYW5zcG9zZWQ8L2E+PC9saT5cclxuICAgICAgICAgICAgICAgIDxsaT48YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBocmVmPVwiI1wiIGRhdGEtYmluZD1cImNsaWNrOiBpbnNlcnRGaWVsZFRhYmxlU3RhbmRhcmRcIj5TdGFuZGFyZDwvYT48L2xpPlxyXG4gICAgICAgICAgICAgICAgPGxpPjxociBjbGFzcz1cImRyb3Bkb3duLWRpdmlkZXJcIj48L2xpPlxyXG4gICAgICAgICAgICAgICAgPGxpPjxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGhyZWY9XCIjXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGluc2VydEhlYWRlckJyZWFrXCI+QWRkIEhlYWRlciBCcmVhazwvYT48L2xpPlxyXG4gICAgICAgICAgICAgICAgPGxpPjxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGhyZWY9XCIjXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGluc2VydEZvb3RlckJyZWFrXCI+QWRkIEZvb3RlciBCcmVhazwvYT48L2xpPlxyXG4gICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLWF1dG8gbXMtMlwiPlxyXG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIj5cclxuICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtZS0yXCIgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogY2FyZFZpZXdcIj5cclxuICAgICAgICAgICAgQ2FyZCBMYXlvdXRcclxuICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgIDx0ZXh0YXJlYSBkYXRhLWJpbmQ9XCJzdW1tZXJub3RlOiByZXBvcnRIdG1sXCI+PC90ZXh0YXJlYT5cclxuICAgIDwvZGl2PlxyXG48L3NjcmlwdD5cclxuXHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwiZGVzaWduZXItc29ydFwiPlxyXG4gICAgPGRpdiBkYXRhLWJpbmQ9XCJpZm5vdDogdXNlU3RvcmVkUHJvY1wiPlxyXG4gICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3cgYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtbm93cmFwXCI+XHJcbiAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtYXV0byBjb250cm9sLWxhYmVsXCI+U29ydCBCeTwvbGFiZWw+XHJcbiAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XHJcbiAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0IGZvcm0tc2VsZWN0LXNtXCJcclxuICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwib3B0aW9uczogRmlsdGVyZWRGaWVsZHMsIG9wdGlvbnNUZXh0OiAnc2VsZWN0ZWRGaWVsZE5hbWUnLCBvcHRpb25zVmFsdWU6ICdmaWVsZElkJywgdmFsdWU6IFNvcnRCeUZpZWxkLCBvcHRpb25zQ2FwdGlvbjogJ1NlbGVjdCBmaWVsZCB0byBzb3J0Li4uJywgYWxsb3dDbGVhcjogdHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLWF1dG8gZC1mbGV4IGdhcC0xXCI+XHJcbiAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cInRleHQ6ICFTb3J0RGVzYygpID8gJ+KWsiBBc2NlbmRpbmcnIDogJ0Rlc2NlbmRpbmcg4pa8JywgY2xpY2s6IGZ1bmN0aW9uKCkgeyBTb3J0RGVzYyghU29ydERlc2MoKSk7IHJldHVybiBmYWxzZTsgfVwiPlxyXG4gICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1zZWNvbmRhcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJjbGljazogYWRkU29ydEZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgIEFkZCBTb3J0XHJcbiAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImZvcmVhY2g6IFNvcnRGaWVsZHNcIj5cclxuICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvdyBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC1ub3dyYXBcIj5cclxuICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtYXV0byBjb250cm9sLWxhYmVsXCI+Jm5ic3A7Jm5ic3A7VGhlbiBTb3J0IEJ5PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdCBmb3JtLXNlbGVjdC1zbVwiIHJlcXVpcmVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJvcHRpb25zOiAkcGFyZW50LkZpbHRlcmVkRmllbGRzLCBvcHRpb25zVGV4dDogJ3NlbGVjdGVkRmllbGROYW1lJywgb3B0aW9uc1ZhbHVlOiAnZmllbGRJZCcsIHZhbHVlOiBzb3J0QnlGaWVsZElkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtYXV0byBkLWZsZXggZ2FwLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJjbGljazogcmVtb3ZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmUgU29ydFxyXG4gICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLXNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJ0ZXh0OiAhc29ydERlc2MoKSA/ICfilrIgQXNjZW5kaW5nJyA6ICdEZXNjZW5kaW5nIOKWvCcsIGNsaWNrOiBmdW5jdGlvbigpIHsgc29ydERlc2MoIXNvcnREZXNjKCkpOyByZXR1cm4gZmFsc2U7IH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1zZWNvbmRhcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwiY2xpY2s6ICRwYXJlbnQuYWRkU29ydEZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICBBZGQgU29ydFxyXG4gICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICA8L2Rpdj5cclxuICAgICA8L2Rpdj5cclxuPC9zY3JpcHQ+XHJcblxyXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2h0bWxcIiBpZD1cImRlc2lnbmVyLW9wdGlvbnNcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTVcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogUmVwb3J0VHlwZSgpIT0nUGl2b3QnXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IEluY2x1ZGVTdWJUb3RhbFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgSW5jbHVkZSBUb3RhbCBSb3dcclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJoaWRkZW46IEFnZ3JlZ2F0ZVJlcG9ydFwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBTaG93VW5pcXVlUmVjb3Jkc1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgU2hvdyBvbmx5IFVuaXF1ZSBSZWNvcmRzXHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogUmVwb3J0VHlwZSgpIT0nTGlzdCdcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogU2hvd0V4cGFuZE9wdGlvblwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgRG9uJ3QgU2hvdyBFeHBhbmQgT3B0aW9uXHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cInZpc2libGU6IGlzQ2hhcnRcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogU2hvd0RhdGFXaXRoR3JhcGhcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIFNob3cgRGF0YSBhbG9uZyB3aXRoIEdyYXBoXHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IERvbnRFeGVjdXRlT25SdW5cIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIFdhaXQgdG8gU2VsZWN0IEZpbHRlcnMgYmVmb3JlIFJ1bm5pbmcgUmVwb3J0XHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3ggY29sLW1kLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBtYXhSZWNvcmRzXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgTWF4IFJlY29yZHNcclxuICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTVcIiBkYXRhLWJpbmQ9XCJpZjogbWF4UmVjb3Jkc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgc3R5bGU9XCJ3aWR0aDogMTUwcHg7XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiByZXF1aXJlZCBwbGFjZWhvbGRlcj1cIk9ubHkgdG9wIG4uLi5cIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogT25seVRvcCwgdmlzaWJsZTogbWF4UmVjb3Jkc1wiPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveCBjb2wtbWQtNVwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBjaGFuZ2VQYWdlU2l6ZSwgZGlzYWJsZTogc3ViUmVwb3J0cygpLmxlbmd0aCA+IDBcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIENoYW5nZSBQYWdlIFNpemVcclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNVwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwidmlzaWJsZTogY2hhbmdlUGFnZVNpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NzOiB7ICd0ZXh0LW11dGVkJzogc3ViUmVwb3J0cygpLmxlbmd0aCA+IDAgfVwiPlxyXG4gICAgICAgICAgICAgICAgPHNlbGVjdCBzdHlsZT1cIndpZHRoOiAxNTBweDtcIiBjbGFzcz1cImZvcm0tc2VsZWN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwib3B0aW9uczogWzEsMTAsMzAsNTAsMTAwLDE1MCwyMDAsNTAwLDEwMDBdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogRGVmYXVsdFBhZ2VTaXplLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlOiBzdWJSZXBvcnRzKCkubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICA8IS0tIEZvcmNlIGRlZmF1bHQgdG8gMSBpZiBzdWIgcmVwb3J0cyBzZWxlY3RlZCAtLT5cclxuICAgICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogc3ViUmVwb3J0cygpLmxlbmd0aCA+IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICBQYWdlIHNpemUgaXMgcmVzdHJpY3RlZCB0byAxIHdoZW4gc3ViIHJlcG9ydHMgYXJlIHNlbGVjdGVkLlxyXG4gICAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTdcIj5cclxuICAgICAgICAgICAgPHA+PHNwYW4gY2xhc3M9XCJmYSBmYS1wYWludC1icnVzaFwiPjwvc3Bhbj4gUGljayBSZXBvcnQgRm9ybWF0PC9wPlxyXG4gICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgPCEtLSBrbyBmb3JlYWNoOiB0YWJsZVN0eWxlcyAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93bi1vcHRpb25cIiBkYXRhLWJpbmQ9XCJ0aXRsZTogJGRhdGEubmFtZSwgY2xpY2s6ICRwYXJlbnQuc2VsZWN0U3R5bGUsIGNzczogeydkcm9wZG93bi1vcHRpb24tc2VsZWN0ZWQnOiAkcGFyZW50LnNlbGVjdGVkU3R5bGUoKSA9PSAkZGF0YS5jb2xvcnNjaGVtZX1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWluaS10YWJsZS1wcmV2aWV3XCIgZGF0YS1iaW5kPVwiZm9yZWFjaDogbmV3IEFycmF5KDUpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtaW5pLXRhYmxlLXJvd1wiIGRhdGEtYmluZD1cImZvcmVhY2g6IG5ldyBBcnJheSg1KVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1pbmktdGFibGUtY2VsbFwiIGRhdGEtYmluZD1cInN0eWxlOiB7IGJhY2tncm91bmRDb2xvcjogJHBhcmVudENvbnRleHQuJGluZGV4KCkgPT09IDAgPyAkcGFyZW50c1sxXS5oZWFkZXJCZyA6ICgkcGFyZW50Q29udGV4dC4kaW5kZXgoKSAlIDIgPT09IDAgPyAkcGFyZW50c1sxXS5hbHRSb3dCZyA6ICRwYXJlbnRzWzFdLnJvd0JnKSwgY29sb3I6ICRwYXJlbnRzWzFdLnRleHRDb2xvciB9XCI+PC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogbm9IZWFkZXJSb3dcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIE5vIEhlYWRlciBSb3dcclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogbm9EYXNoYm9hcmRCb3JkZXJzXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICBCb3JkZXJsZXNzIG9uIERhc2hib2FyZFxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImlmOiBSZXBvcnRUeXBlKCkgPT0gJ1NpbmdsZSdcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogc2hvd1ByaW9ySW5LcGlcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIFNob3cgcHJldmlvdXMgY29tcGFyaXNpb24gaW4gS1BJIGlmIGFwcGxpY2FibGVcclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvc2NyaXB0PlxyXG5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJjdXN0b20tZmllbGQtZGVzaWduZXJcIj5cclxuICAgIDxkaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogaXNGb3JtdWxhRmllbGQoKVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICBZb3UgYXJlIG5vdyBjcmVhdGluZyBhIEN1c3RvbWl6ZWQgRmllbGQuIFBsZWFzZSBzZWxlY3QgdGhlIGZpZWxkcyB5b3Ugd2FudCB0byB1c2UgaW4gdGhlIGNhbGN1bGF0aW9uLCB0aGVuIGNob29zZSB0aGUgb3BlcmF0aW9ucyB5b3Ugd2FudCB0byBwZXJmb3JtLCBhbmQgY2xpY2sgXCJTYXZlXCIgdG8gYWRkIHlvdXIgQ3VzdG9tIGZpZWxkLlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS02IHNtYWxsXCI+XHJcbiAgICAgICAgICAgICAgICBTZXR1cCB5b3VyIEZvcm11bGEgZm9yIGNhbGN1bGF0aW5nIHRoaXMgRmllbGRcclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tNiByaWdodC1hbGlnblwiIGRhdGEtYmluZD1cInZpc2libGU6IGZvcm11bGFUeXBlKCk9PSdidWlsZCdcIj5cclxuICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeSBidG4tc21cIiBkYXRhLWJpbmQ9XCJjbGljazogYWRkRm9ybXVsYVBhcmVudGhlc2VzXCI+QWRkICggKTwvYT5cclxuICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeSBidG4tc21cIiB0aXRsZT1cIkFkZCBUb2RheVwiIGRhdGEtYmluZD1cInZpc2libGU6IGZvcm11bGFPbmx5SGFzRGF0ZUZpZWxkcygpIHx8IGZvcm11bGFGaWVsZHMoKS5sZW5ndGggPT0gMCwgY2xpY2s6IGFkZEZvcm11bGFEYXRlVG9kYXlcIj5BZGQgVG9kYXk8L2E+XHJcbiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnkgYnRuLXNtXCIgdGl0bGU9XCJBZGQgYSBDb25zdGFudCBWYWx1ZVwiIGRhdGEtYmluZD1cImNsaWNrOiBhZGRGb3JtdWxhQ29uc3RhbnRWYWx1ZVwiPkFkZCBWYWx1ZTwvYT5cclxuICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeSBidG4tc21cIiBkYXRhLWJpbmQ9XCJjbGljazogY2xlYXJGb3JtdWxhRmllbGRcIj5DbGVhcjwvYT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAtcm93XCIgZGF0YS1iaW5kPVwiaWY6IGZvcm11bGFPbmx5SGFzRGF0ZUZpZWxkc1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTEyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIEZvciBEYXRlcyBGaWVsZCBjYWxjdWxhdGlvbiwgeW91IGNhbiBvbmx5IHN1YnN0cmFjdCBkYXRlIGZpZWxkcyBhbmQgZGlzcGxheSB0aGUgcmVzdWx0IGFzIGRheXMsIGhvdXJzLCBtaW51dGVzIG9yIHNlY29uZHMuXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0yIGNvbnRyb2wtbGFiZWxcIj5GaWVsZCBMYWJlbDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMTBcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tY29udHJvbC1zbVwiIGRhdGEtYmluZD1cInZhbHVlOiBmb3JtdWxhRmllbGRMYWJlbFwiIHJlcXVpcmVkIHBsYWNlaG9sZGVyPVwiQ3VzdG9tIEZpZWxkIExhYmVsXCIgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0yIGNvbnRyb2wtbGFiZWxcIj5EYXRhIEZvcm1hdDwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMTBcIj5cclxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdCBmb3JtLXNlbGVjdC1zbVwiIGRhdGEtYmluZD1cInZhbHVlOiBmb3JtdWxhRGF0YUZvcm1hdFwiIHJlcXVpcmVkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0ga28gaWZub3Q6IGZvcm11bGFPbmx5SGFzRGF0ZUZpZWxkcyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPlN0cmluZzwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24+SW50ZWdlcjwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24+RGVjaW1hbDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24+Q3VycmVuY3k8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBmb3JtdWxhT25seUhhc0RhdGVGaWVsZHMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbj5EYXlzPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbj5Ib3Vyczwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24+TWludXRlczwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24+U2Vjb25kczwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvIC0tPlxyXG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiIGRhdGEtYmluZD1cInZpc2libGU6IGZvcm11bGFEYXRhRm9ybWF0KCkgPT0gJ0RlY2ltYWwnIHx8IGZvcm11bGFEYXRhRm9ybWF0KCkgPT0gJ0N1cnJlbmN5J1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMiBjb250cm9sLWxhYmVsXCI+Um91bmQgdG8gRGVjaW1hbCBQbGFjZXM8L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTEwXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZGF0YS1iaW5kPVwidmFsdWU6IGZvcm11bGFEZWNpbWFsUGxhY2VzXCIgcGxhY2Vob2xkZXI9XCJDaG9vc2UgRGVjaW1hbCBwbGFjZXMgKGxlYXZlIGJsYW5rIHRvIG5vdCB1c2Ugcm91bmRpbmcpXCIgdGl0bGU9XCJDaG9vc2UgRGVjaW1hbCBwbGFjZXMgKGxlYXZlIGJsYW5rIHRvIG5vdCB1c2Ugcm91bmRpbmcpXCIgLz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogYXBwU2V0dGluZ3MudXNlU3FsQ3VzdG9tRmllbGRcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTIgY29udHJvbC1sYWJlbFwiPkZpZWxkIEJ1aWxkZXIgVHlwZTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMTBcIj5cclxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdCBmb3JtLXNlbGVjdC1zbVwiIGRhdGEtYmluZD1cInZhbHVlOiBmb3JtdWxhVHlwZVwiIHJlcXVpcmVkPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJidWlsZFwiPlNpbXBsZSBDYWxjdWxhdGlvbjwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJzcWxcIj5BZHZhbmNlZCBFeHByZXNzaW9uPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiIGRhdGEtYmluZD1cImlmOiBmb3JtdWxhVHlwZSgpPT0nYnVpbGQnXCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0yIGNvbnRyb2wtbGFiZWxcIj5GaWVsZCBGb3JtdWxhPC9sYWJlbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0xMFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbXV0ZWQgc21hbGxcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBmb3JtdWxhRmllbGRzKCkubGVuZ3RoID09IDBcIj5QaWNrIGZpZWxkcyB0byBidWlsZCBjYWxjdWxhdGlvbjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC13cmFwXCIgZGF0YS1iaW5kPVwiZm9yZWFjaDogZm9ybXVsYUZpZWxkc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cIm1lLTNcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBzZXR1cEZvcm11bGEuaXNQYXJlbnRoZXNlc1N0YXJ0XCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAwO1wiPig8L2gzPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6ICFzZXR1cEZvcm11bGEuaXNQYXJlbnRoZXNlc1N0YXJ0KCkgJiYgIXNldHVwRm9ybXVsYS5pc1BhcmVudGhlc2VzRW5kKClcIiBjbGFzcz1cImxpc3QtZ3JvdXAgbWUtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZm9ybXVsYS1maWVsZC1pdGVtXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDogMTVweDsgcGFkZGluZzogNXB4IDE1cHhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cInRleHQ6IGZpZWxkTmFtZSwgdmlzaWJsZTogIXNldHVwRm9ybXVsYS5pc0NvbnN0YW50VmFsdWUoKVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6IHNldHVwRm9ybXVsYS5pc0NvbnN0YW50VmFsdWVcIiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgZGF0YS1iaW5kPVwidmFsdWU6IHNldHVwRm9ybXVsYS5jb25zdGFudFZhbHVlLCB2aXNpYmxlOiBzZXR1cEZvcm11bGEuY29uc3RhbnRWYWx1ZSgpIT0nfFRvZGF5fCdcIiBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc20gbWUtMlwiIHJlcXVpcmVkIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidmlzaWJsZTogc2V0dXBGb3JtdWxhLmNvbnN0YW50VmFsdWUoKSA9PSAnfFRvZGF5fCdcIj48Yj5Ub2RheTwvYj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWRhbmdlciBidG4tc20gbXMtMlwiIGRhdGEtYmluZD1cImNsaWNrOiAkcGFyZW50LnJlbW92ZUZpZWxkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS10cmFzaFwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJtZS0zXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogc2V0dXBGb3JtdWxhLmlzUGFyZW50aGVzZXNFbmRcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDA7XCI+KTwvaDM+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lLTNcIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiAxNXB4O1wiIGRhdGEtYmluZD1cInZpc2libGU6ICRwYXJlbnQuc2hvd0Zvcm11bGFPcGVyYXRpb24oJGluZGV4KCkpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtXCIgc3R5bGU9XCJtYXgtd2lkdGg6IDUwcHg7XCIgZGF0YS1iaW5kPVwidmFsdWU6IHNldHVwRm9ybXVsYS5mb3JtdWxhT3BlcmF0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiAhJHBhcmVudC5mb3JtdWxhT25seUhhc0RhdGVGaWVsZHMoKSB8fCAoJHBhcmVudC5mb3JtdWxhT25seUhhc0RhdGVGaWVsZHMoKSAmJiAkcGFyZW50LmlzQ29uc3RhbnRPcGVyYXRpb24oJGluZGV4KCkpKSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24+Kzwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPi08L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0ga28gaWY6IFsnSW50ZWdlcicsJ01vbmV5JywnRmxvYXQnLCdEb3VibGUnLCdEZWNpbWFsJywnQ3VycmVuY3knXS5pbmRleE9mKCRwYXJlbnQuZm9ybXVsYURhdGFGb3JtYXQoKSkgIT0gLTEgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPio8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24+Lzwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ3aXRoOiBjdXN0b21TcWxGaWVsZCwgdmlzaWJsZTogZm9ybXVsYVR5cGUoKT09J3NxbCdcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+U2VsZWN0IERhdGEgT3BlcmF0aW9uOjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIGRhdGEtYmluZD1cInNlbGVjdDI6IHtcclxuICAgICAgICAgICAgICAgIGRyb3Bkb3duUGFyZW50OiAkcm9vdC5hY3RpdmVEZXNpZ24oKSA/ICQoJyNjaG9vc2UtZGF0YS1kZXNpZ24nKSA6ICQoJyNjaG9vc2UtZGF0YS1jYXJkJyksXHJcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBGdW5jdGlvbi4uLicsXHJcbiAgICAgICAgICAgICAgICBkYXRhOiBhdmFpbGFibGVGdW5jdGlvbnNHcm91cGVkKCksXHJcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVJlc3VsdDogdGVtcGxhdGVSZXN1bHRcclxuICAgICAgICAgICAgfSwgdmFsdWU6IHNlbGVjdGVkU3FsRnVuY3Rpb25cIj48L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIiBkYXRhLWJpbmQ9XCJoaWRkZW46IGlzQ29uZGl0aW9uYWxGdW5jdGlvbigpIHx8IHNlbGVjdGVkU3FsRnVuY3Rpb24oKSA9PSAnT3RoZXInXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj5TZWxlY3QgdGhlIERhdGEgRmllbGQgdG8gdXNlOjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwic2VsZWN0Mjoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm9wZG93blBhcmVudDogJHJvb3QuYWN0aXZlRGVzaWduKCkgPyAkKCcjY2hvb3NlLWRhdGEtZGVzaWduJykgOiAkKCcjY2hvb3NlLWRhdGEtY2FyZCcpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogJ1NlYXJjaCBGaWVsZC4uLicsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFqYXg6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogJHBhcmVudC50ZXh0UXVlcnkuc2VhcmNoRmllbGRzLnVybCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAnanNvbicsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiAkcGFyZW50LnRleHRRdWVyeS5zZWFyY2hGaWVsZHMucXVlcnksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzUmVzdWx0czogJHBhcmVudC50ZXh0UXVlcnkuc2VhcmNoRmllbGRzLnByb2Nlc3NSZXN1bHRzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogJHBhcmVudC50ZXh0UXVlcnkuc2VhcmNoRmllbGRzLmhlYWRlcnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bUlucHV0TGVuZ3RoOiAyLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd0NsZWFyOiB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgc2VsZWN0MlRleHQ6IHNlbGVjdGVkRmllbGQsc2VsZWN0MlRhYmxlSWQ6c2VsZWN0ZWRGaWVsZFRhYmxlSWRcIj48L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ3aXRoOiBzZWxlY3RlZEZpZWxkXCIgY2xhc3M9XCJzbWFsbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkOiA8c3BhbiBjbGFzcz1cImhpZ2hsaWdodFwiIGRhdGEtYmluZD1cInRleHQ6ICRkYXRhXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIiBkYXRhLWJpbmQ9XCJpZjogcmVxdWlyZXNWYWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiaW5wdXRWYWx1ZVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlByb3ZpZGUgdGhlIHJlbGV2YW50IHZhbHVlIHRvIHVzZTo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImlucHV0VmFsdWVcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGRhdGEtYmluZD1cInZhbHVlOiBpbnB1dFZhbHVlXCIgcmVxdWlyZWQgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBzZWxlY3RlZFNxbEZ1bmN0aW9uKCkgPT0gJ090aGVyJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY3VzdG9tLXNxbFwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkN1c3RvbSBTUUwgRXhwcmVzc2lvbjo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtbXV0ZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWxkIHlvdXIgY3VzdG9tIFNRTCBFeHByZXNzaW9uIGJlbG93IGJ5IHNlbGVjdGluZyBkYXRhIGZpZWxkcywgYWRkaW5nIGNhbGN1bGF0aW9ucyBvciB1c2luZyBTUUwga2V5d29yZHMgYXMgbmVlZGVkLiBGb3Igc3RyaW5nIHZhbHVlcywgcmVtZW1iZXIgdG8gZW5jbG9zZSB0aGVtIGluIHNpbmdsZSBxdW90ZXMgKCcnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGlkPVwiY3VzdG9tLXNxbFwiIGNsYXNzPVwiaGludC1pbnB1dFwiIGNvbnRlbnRlZGl0YWJsZT1cInRydWVcIiBwbGFjZWhvbGRlcj1cIldyaXRlIHlvdXIgY3VzdG9tIFNRTFwiPjwvcD5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInZpc2libGU6IGlzQ29uZGl0aW9uYWxGdW5jdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtbXV0ZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWxkIHlvdXIgY29uZGl0aW9uYWwgbG9naWMgYmVsb3cgYnkgc2VsZWN0aW5nIGRhdGEgZmllbGRzLCBhZGRpbmcgY2FsY3VsYXRpb25zIGFuZCBkZWZpbmluZyBjb25kaXRpb25zIGFzIG5lZWRlZCwgYW5kIHByb3ZpZGUgY29ycmVzcG9uZGluZyByZXN1bHRzLiBGb3Igc3RyaW5nIHZhbHVlcywgcmVtZW1iZXIgdG8gZW5jbG9zZSB0aGVtIGluIHNpbmdsZSBxdW90ZXMgKCcnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1ncm93LTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImhpbnQtaW5wdXRcIiBpZD1cImNvbmRpdGlvbi1maWVsZFwiIGNvbnRlbnRlZGl0YWJsZT1cInRydWVcIiBwbGFjZWhvbGRlcj1cIkZpZWxkIHRvIGNvbXBhcmVcIiB0aXRsZT1cIkZpZWxkIHRvIGNvbXBhcmVcIj48L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMlwiIHN0eWxlPVwid2lkdGg6IDEyMHB4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdCBmb3JtLXNlbGVjdC1zbVwiIGRhdGEtYmluZD1cIm9wdGlvbnM6IGF2YWlsYWJsZU9wZXJhdG9ycywgdmFsdWU6IHNlbGVjdGVkT3BlcmF0b3JcIj48L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWdyb3ctMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiaGludC1pbnB1dFwiIGlkPVwiY29uZGl0aW9uLXZhbHVlXCIgY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiIHBsYWNlaG9sZGVyPVwiVmFsdWUgdG8gY29tcGFyZVwiIHRpdGxlPVwiVmFsdWUgdG8gY29tcGFyZVwiPjwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5wdXQtZ3JvdXAtdGV4dFwiIHN0eWxlPVwibWF4LWhlaWdodDogMzJweDtcIj5USEVOPC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWdyb3ctMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiaGludC1pbnB1dFwiIGlkPVwiY29uZGl0aW9uLXJlc3VsdFwiIGNvbnRlbnRlZGl0YWJsZT1cInRydWVcIiBwbGFjZWhvbGRlcj1cIkNvbmRpdGlvbiBSZXN1bHRcIiB0aXRsZT1cIkNvbmRpdGlvbiBSZXN1bHRcIj48L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnlcIiBkYXRhLWJpbmQ9XCJjbGljazogYWRkQ29uZGl0aW9uXCI+QWRkIENvbmRpdGlvbjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJsaXN0LWdyb3VwIG10LTNcIiBkYXRhLWJpbmQ9XCJmb3JlYWNoOiBjb25kaXRpb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cInRleHQ6IGNvbmRpdGlvbkRpc3BsYXlcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWRhbmdlclwiIGRhdGEtYmluZD1cImNsaWNrOiAkcGFyZW50LnJlbW92ZUNvbmRpdGlvblwiPlJlbW92ZTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBtYi0zXCIgc3R5bGU9XCJwYWRkaW5nLXRvcDogNXB4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnB1dC1ncm91cC10ZXh0XCIgc3R5bGU9XCJtYXgtaGVpZ2h0OiAzMnB4O1wiPkVMU0U8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1ncm93LTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImhpbnQtaW5wdXRcIiBpZD1cImNvbmRpdGlvbi1lbHNlXCIgY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiIHBsYWNlaG9sZGVyPVwiRGVmYXVsdCBSZXN1bHRcIiB0aXRsZT1cIkRlZmF1bHQgUmVzdWx0XCI+PC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICA8aHIgLz5cclxuICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc21cIiB0aXRsZT1cIlNhdmUgQ3VzdG9tIEZvcm11bGEgRmllbGRcIiBkYXRhLWJpbmQ9XCJjbGljazogc2F2ZUZvcm11bGFGaWVsZCwgdmlzaWJsZTogaXNGb3JtdWxhRmllbGRcIj5TYXZlPC9hPlxyXG4gICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYnRuIGJ0bi1zbVwiIHRpdGxlPVwiQ3VzdG9tIEZpZWxkIHVzaW5nIEZvcm11bGFcIiBkYXRhLWJpbmQ9XCJjbGljazogY2FuY2VsRm9ybXVsYUZpZWxkLCB0ZXh0OiBpc0Zvcm11bGFGaWVsZCgpPyAnQ2FuY2VsJzogJ0N1c3RvbWl6ZScsIGNzczogeydidG4tcHJpbWFyeSc6ICFpc0Zvcm11bGFGaWVsZCgpLCAnYnRuLWRhbmdlcic6IGlzRm9ybXVsYUZpZWxkfVwiPjwvYT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L3NjcmlwdD5cclxuXHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwicmVwb3J0LWRlc2lnbmVyLWNvbXBhY3RcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJkZXNpZ25lci1jb250YWluZXIgY29tcGFjdC1kZXNpZ25lclwiIGlkPVwiY2hvb3NlLWRhdGEtZGVzaWduXCIgc3R5bGU9XCJmb250LXNpemU6MTJweDtcIj5cclxuXHJcbiAgICAgIDwhLS0gVmlzdWFsaXphdGlvbiBUb29sYmFyIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBwLTEgbWItMlwiPlxyXG4gICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgcC0xIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgIDxzcGFuPjxpIGNsYXNzPVwiZmEgZmEtZmlsZVwiPjwvaT4gVmlzdWFsaXphdGlvbjwvc3Bhbj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tbGlnaHRcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBSZXBvcnRJRCgpLCBjbGljazogZnVuY3Rpb24oKSB7YWN0aXZlRGVzaWduKGZhbHNlKTt9XCIgdGl0bGU9XCJDbG9zZVwiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXRpbWVzXCI+PC9pPiBDbG9zZSBEZXNpZ25lclxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBwLTFcIj5cclxuICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdkZXNpZ25lci1jaG9vc2UtdmlzdWFsJ1wiPjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwhLS0gTWFpbiBHcmlkIC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtcm93IGZsZXgtd3JhcCBnYXAtMiBjb21wYWN0LWZpbHRlcnMgbmVlZHMtdmFsaWRhdGlvblwiPlxyXG5cclxuICAgICAgICA8IS0tIERhdGEgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgZmxleC1maWxsIGV4cGFuZGFibGUtcGFuZWxcIiBpZD1cImRhdGFQYW5lbFwiIHN0eWxlPVwibWF4LXdpZHRoOiAzMDBweFwiXHJcbiAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJjc3M6eydjb2xsYXBzZWQtdmVydGljYWwnOiBwYW5lbHMuaXNDb2xsYXBzZWQoJ2RhdGFQYW5lbCcpfVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIHAtMVwiIGRhdGEtYmluZD1cImNsaWNrOmZ1bmN0aW9uKCl7cGFuZWxzLnRvZ2dsZVBhbmVsKCdkYXRhUGFuZWwnKX1cIj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1kYXRhYmFzZVwiPjwvaT4gRGF0YVxyXG4gICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBwLTFcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiAnZGVzaWduZXItY2hvb3NlLWRhdGEnXCI+PC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBTZWxlY3RlZCAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBmbGV4LWZpbGwgZXhwYW5kYWJsZS1wYW5lbFwiIGlkPVwic2VsZWN0ZWRQYW5lbFwiIHN0eWxlPVwibWF4LXdpZHRoOiA0MDBweFwiXHJcbiAgICAgICAgIGRhdGEtYmluZD1cImNzczp7J2NvbGxhcHNlZC12ZXJ0aWNhbCc6IHBhbmVscy5pc0NvbGxhcHNlZCgnc2VsZWN0ZWRQYW5lbCcpfVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIHAtMVwiIGRhdGEtYmluZD1cImNsaWNrOmZ1bmN0aW9uKCl7cGFuZWxzLnRvZ2dsZVBhbmVsKCdzZWxlY3RlZFBhbmVsJyl9XCI+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtdGFibGVcIj48L2k+IFNlbGVjdGVkIGRhdGEgZm9yIHRoZSBSZXBvcnRcclxuICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cInNtYWxsIHRleHQtbXV0ZWQgZmxvYXQtZW5kXCJcclxuICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwidmlzaWJsZTogU2VsZWN0ZWRGaWVsZHMoKS5sZW5ndGgsIGNsaWNrOmZ1bmN0aW9uKCl7U2VsZWN0ZWRGaWVsZHMoW10pO31cIj5DbGVhciBhbGw8L2E+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IGRlc2lnbmVyLWF1dG8tdXBkYXRlIHAtMVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cIm1heC1oZWlnaHQ6IDMwMHB4OyBvdmVyZmxvdy15OiBhdXRvO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdkZXNpZ25lci1zZWxlY3RlZC1kYXRhJ1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBmbGV4LWZpbGwgZXhwYW5kYWJsZS1wYW5lbFwiIGlkPVwic3ViUmVwb3J0c1BhbmVsXCJcclxuICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cImNzczp7J2NvbGxhcHNlZC12ZXJ0aWNhbCc6IHBhbmVscy5pc0NvbGxhcHNlZCgnc3ViUmVwb3J0c1BhbmVsJyl9LCB2aXNpYmxlOiBsaW5rZWRSZXBvcnRGaWVsZHMoKS5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBwLTFcIiBkYXRhLWJpbmQ9XCJjbGljazpmdW5jdGlvbigpe3BhbmVscy50b2dnbGVQYW5lbCgnc3ViUmVwb3J0c1BhbmVsJyl9XCI+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYm9va21hcmtcIj48L2k+IFN1YiBSZXBvcnRzXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IHAtMVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiAnZGVzaWduZXItc3ViLXJlcG9ydCcsIGRhdGE6ICRkYXRhXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBmbGV4LWZpbGwgZXhwYW5kYWJsZS1wYW5lbFwiIGlkPVwiaHRtbFJlcG9ydFBhbmVsXCJcclxuICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cImNzczp7J2NvbGxhcHNlZC12ZXJ0aWNhbCc6IHBhbmVscy5pc0NvbGxhcHNlZCgnaHRtbFJlcG9ydFBhbmVsJyl9LCB2aXNpYmxlOiBSZXBvcnRUeXBlKCk9PSdIdG1sJ1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgcC0xXCIgZGF0YS1iaW5kPVwiY2xpY2s6ZnVuY3Rpb24oKXtwYW5lbHMudG9nZ2xlUGFuZWwoJ2h0bWxSZXBvcnRQYW5lbCcpfVwiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXBlbmNpbFwiPjwvaT4gQ3VzdG9tIERlc2lnblxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBwLTFcIj5cclxuICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogJ2Rlc2lnbmVyLWh0bWwnLCBkYXRhOiAkZGF0YVwiPjwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBDdXN0b20gRmllbGQgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgZmxleC1maWxsIGV4cGFuZGFibGUtcGFuZWxcIiBpZD1cImN1c3RvbUZpZWxkUGFuZWxcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBpc0Zvcm11bGFGaWVsZFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgcC0xXCI+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtbWFnaWNcIj48L2k+IEN1c3RvbSBGaWVsZFxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBwLTEgY3VzdG9tLWZpZWxkLWRlc2lnblwiIHN0eWxlPVwibWF4LWhlaWdodDogNDAwcHg7IG92ZXJmbG93LXk6IGF1dG87IG92ZXJmbG93LXg6IGhpZGRlbjtcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdjdXN0b20tZmllbGQtZGVzaWduZXInLCBkYXRhOiAkZGF0YVwiPjwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8IS0tIEZpZWxkIE9wdGlvbnMgUGFuZWwgLS0+XHJcbiAgICAgICAgPGRpdiBpZD1cImZpZWxkT3B0aW9uc1BhbmVsXCIgY2xhc3M9XCJjYXJkIHAtMiBtdC0yIGNvbGxhcHNlXCI+XHJcbiAgICAgICAgPCEtLSBkeW5hbWljIGZpZWxkIHNldHRpbmdzIGxvYWQgaGVyZSAtLT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8IS0tIEZpbHRlcnMgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgZmxleC1maWxsIGV4cGFuZGFibGUtcGFuZWxcIiBpZD1cImZpbHRlcnNQYW5lbFwiXHJcbiAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJjc3M6eydjb2xsYXBzZWQtdmVydGljYWwnOiBwYW5lbHMuaXNDb2xsYXBzZWQoJ2ZpbHRlcnNQYW5lbCcpfSwgaGlkZGVuOiBpc0Zvcm11bGFGaWVsZFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIHAtMVwiIGRhdGEtYmluZD1cImNsaWNrOmZ1bmN0aW9uKCl7cGFuZWxzLnRvZ2dsZVBhbmVsKCdmaWx0ZXJzUGFuZWwnKX1cIj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1maWx0ZXJcIj48L2k+IEZpbHRlcnNcclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBwLTEgZGVzaWduZXItYXV0by11cGRhdGVcIiBzdHlsZT1cIm1heC1oZWlnaHQ6MzAwcHg7IG92ZXJmbG93LXk6YXV0bztcIj5cclxuICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZjp1c2VTdG9yZWRQcm9jXCI+PGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTp7bmFtZTonZmlsdGVyLXBhcmFtZXRlcnMnfVwiPjwvZGl2PjwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmbm90OnVzZVN0b3JlZFByb2NcIj48ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOntuYW1lOidmaWx0ZXItZ3JvdXAnfVwiPjwvZGl2PjwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gU29ydCAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBmbGV4LWZpbGwgZXhwYW5kYWJsZS1wYW5lbFwiIGlkPVwic29ydFBhbmVsXCJcclxuICAgICAgICAgICAgIGRhdGEtYmluZD1cImNzczp7J2NvbGxhcHNlZC12ZXJ0aWNhbCc6IHBhbmVscy5pc0NvbGxhcHNlZCgnc29ydFBhbmVsJyl9LCBoaWRkZW46IHVzZVN0b3JlZFByb2MoKSB8fCBpc0Zvcm11bGFGaWVsZCgpXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgcC0xXCIgZGF0YS1iaW5kPVwiY2xpY2s6ZnVuY3Rpb24oKXtwYW5lbHMudG9nZ2xlUGFuZWwoJ3NvcnRQYW5lbCcpfVwiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNvcnRcIj48L2k+IFNvcnRcclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBwLTEgZGVzaWduZXItYXV0by11cGRhdGUgcm93XCI+XHJcbiAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdkZXNpZ25lci1zb3J0J1wiPjwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gU2V0dGluZ3MgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgZmxleC1maWxsIGV4cGFuZGFibGUtcGFuZWxcIiBpZD1cInNldHRpbmdzUGFuZWxcIlxyXG4gICAgICAgICAgICAgZGF0YS1iaW5kPVwiY3NzOnsnY29sbGFwc2VkLXZlcnRpY2FsJzogcGFuZWxzLmlzQ29sbGFwc2VkKCdzZXR0aW5nc1BhbmVsJyl9LCBoaWRkZW46IGlzRm9ybXVsYUZpZWxkXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgcC0xXCIgZGF0YS1iaW5kPVwiY2xpY2s6ZnVuY3Rpb24oKXtwYW5lbHMudG9nZ2xlUGFuZWwoJ3NldHRpbmdzUGFuZWwnKX1cIj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1nZWFyXCI+PC9pPk9wdGlvbnNcclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1mb3JtLWxhYmVsIGg2XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1maWxlXCI+PC9pPiBSZXBvcnQgTmFtZVxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiByZXF1aXJlZCBwbGFjZWhvbGRlcj1cIlJlcG9ydCBOYW1lXCIgZGF0YS1iaW5kPVwidmFsdWU6IFJlcG9ydE5hbWVcIj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb250cm9sLWxhYmVsIGg2XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1pbmZvLWNpcmNsZVwiPjwvaT4gUmVwb3J0IERlc2NyaXB0aW9uXHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBzdHlsZT1cIndpZHRoOiAxMDAlO1wiIHJvd3M9XCIzXCIgcGxhY2Vob2xkZXI9XCJBZGRpdGlvbmFsIGRldGFpbHMgKG9wdGlvbmFsKVwiIGRhdGEtYmluZD1cInZhbHVlOiBSZXBvcnREZXNjcmlwdGlvblwiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cInZpc2libGU6IENhblNhdmVSZXBvcnRzKClcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogU2F2ZVJlcG9ydFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIFNhdmUgUmVwb3J0XHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogU2F2ZVJlcG9ydFwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29udHJvbC1sYWJlbCBoNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZm9sZGVyLW9wZW5cIj48L2k+IENob29zZSBGb2xkZXJcclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCIgZGF0YS1iaW5kPVwib3B0aW9uczogRm9sZGVycywgb3B0aW9uc1RleHQ6ICdGb2xkZXJOYW1lJywgb3B0aW9uc1ZhbHVlOiAnSWQnLCB2YWx1ZTogRm9sZGVySURcIj48L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGhyIC8+XHJcbiAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdkZXNpZ25lci1vcHRpb25zJ1wiPjwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwhLS0gU2NoZWR1bGUgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgZmxleC1maWxsIGV4cGFuZGFibGUtcGFuZWxcIiBpZD1cInNjaGVkdWxlUGFuZWxcIlxyXG4gICAgICAgICAgICAgZGF0YS1iaW5kPVwiY3NzOnsnY29sbGFwc2VkLXZlcnRpY2FsJzogcGFuZWxzLmlzQ29sbGFwc2VkKCdzY2hlZHVsZVBhbmVsJyl9XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgcC0xXCIgZGF0YS1iaW5kPVwiY2xpY2s6ZnVuY3Rpb24oKXtwYW5lbHMudG9nZ2xlUGFuZWwoJ3NjaGVkdWxlUGFuZWwnKX1cIj5cclxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1ob3VyZ2xhc3NcIj48L2k+IFNjaGVkdWxlXHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHkgcC0xIGRlc2lnbmVyLWF1dG8tdXBkYXRlIHJvd1wiPlxyXG4gICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiB7bmFtZTogJ3JlcG9ydC1zY2hlZHVsZSd9XCI+PC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSBBY2Nlc3MgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgZmxleC1maWxsIGV4cGFuZGFibGUtcGFuZWxcIiBpZD1cImFjY2Vzc1BhbmVsXCJcclxuICAgICAgICAgICAgIGRhdGEtYmluZD1cImNzczp7J2NvbGxhcHNlZC12ZXJ0aWNhbCc6IHBhbmVscy5pc0NvbGxhcHNlZCgnYWNjZXNzUGFuZWwnKX0sIHZpc2libGU6IGFkbWluTW9kZSgpICYmICFpc0Zvcm11bGFGaWVsZCgpXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgcC0xXCIgZGF0YS1iaW5kPVwiY2xpY2s6ZnVuY3Rpb24oKXtwYW5lbHMudG9nZ2xlUGFuZWwoJ2FjY2Vzc1BhbmVsJyl9XCI+XHJcbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEta2V5XCI+PC9pPlNlY3VyaXR5XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cIlwiIGNsYXNzPVwiY2FyZCBjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZToge25hbWU6ICdtYW5hZ2UtYWNjZXNzLXRlbXBsYXRlJywgZGF0YTogbWFuYWdlQWNjZXNzfVwiPjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxociAvPlxyXG48L3NjcmlwdD5cclxuXHJcbjxzY3JpcHQgdHlwZT1cInRleHQvaHRtbFwiIGlkPVwicmVwb3J0LWRlc2lnbmVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIG1vZGFsLWRpYWxvZy1zY3JvbGxhYmxlXCIgc3R5bGU9XCJoZWlnaHQ6IDEwMHZoO1wiIGlkPVwicmVwb3J0LWRlc2lnbmVyLW1vZGFsXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGhlaWdodDogMTAwJTtcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGVcIiBpZD1cIm15TW9kYWxMYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxhIHRpdGxlPVwiTmVlZCBoZWxwIHNldHRpbmcgdXAgYSByZXBvcnQ/XCIgdGFyZ2V0PVwiX2JsYW5rXCIgaHJlZj1cImh0dHBzOi8vZG90bmV0cmVwb3J0LmNvbS9ibG9ncy9kb2NzL2Rlc2lnbmluZy1yZXBvcnRzXCI+PHNwYW4gY2xhc3M9XCJmYSBmYS1xdWVzdGlvbi1jaXJjbGVcIj48L3NwYW4+PC9hPiBEZXNpZ24geW91ciBSZXBvcnRcclxuICAgICAgICAgICAgICAgIDwvaDU+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZVwiIGRhdGEtYnMtZGlzbWlzcz1cIm1vZGFsXCIgZGF0YS1iaW5kPVwiY2xpY2s6IG9uTW9kYWxDbG9zZUNsaWNrZWRcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IG5lZWRzLXZhbGlkYXRpb25cIiBzdHlsZT1cIm92ZXJmbG93LXk6IGF1dG87IGZsZXgtZ3JvdzogMTtcIj5cclxuICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBjYXJkLWJvZHlcIiBpZD1cImNob29zZS1kYXRhLWNhcmRcIiAgc3R5bGU9XCJtaW4taGVpZ2h0OiBjYWxjKDEwMHZoIC0gMjAwcHgpO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsIGg2XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZmlsZVwiPjwvaT4gUmVwb3J0IE5hbWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIHJlcXVpcmVkIHBsYWNlaG9sZGVyPVwiUmVwb3J0IE5hbWVcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogUmVwb3J0TmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aHIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNT48c3BhbiBjbGFzcz1cImZhIGZhLWRhdGFiYXNlXCI+PC9zcGFuPiZuYnNwO0Nob29zZSBEYXRhIGZvciBSZXBvcnQ8L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogJ2Rlc2lnbmVyLWNob29zZS1kYXRhJ1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBjYXJkLWJvZHlcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb250cm9sLWxhYmVsIGg2XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtaW5mby1jaXJjbGVcIj48L2k+IFJlcG9ydCBEZXNjcmlwdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIiByb3dzPVwiM1wiIHBsYWNlaG9sZGVyPVwiQWRkaXRpb25hbCBkZXRhaWxzIChvcHRpb25hbClcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogUmVwb3J0RGVzY3JpcHRpb25cIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBDYW5TYXZlUmVwb3J0cygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogU2F2ZVJlcG9ydFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlIFJlcG9ydFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiIGRhdGEtYmluZD1cInZpc2libGU6IFNhdmVSZXBvcnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb250cm9sLWxhYmVsIGg2XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZm9sZGVyLW9wZW5cIj48L2k+IENob29zZSBGb2xkZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCIgZGF0YS1iaW5kPVwib3B0aW9uczogRm9sZGVycywgb3B0aW9uc1RleHQ6ICdGb2xkZXJOYW1lJywgb3B0aW9uc1ZhbHVlOiAnSWQnLCB2YWx1ZTogRm9sZGVySURcIj48L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLThcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDU+PHNwYW4gY2xhc3M9XCJmYSBmYS1maWxlXCI+PC9zcGFuPiZuYnNwO0Nob29zZSBWaXN1YWxpemF0aW9uPC9oNT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJvdmVyZmxvdy14OiBhdXRvOyB3aGl0ZS1zcGFjZTogbm93cmFwO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdkZXNpZ25lci1jaG9vc2UtdmlzdWFsJ1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZjogaXNGdW5jdGlvbkZpZWxkXCIgY2xhc3M9XCJjdXN0b20tZmllbGQtZGVzaWduXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTIgcHVsbC1yaWdodFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IGJ0bi1zbVwiIHRpdGxlPVwiU2F2ZSBDdXN0b20gRnVuY3Rpb24gRmllbGRcIiBkYXRhLWJpbmQ9XCJjbGljazogc2F2ZUZ1bmN0aW9uRmllbGQsIHZpc2libGU6IGlzRnVuY3Rpb25GaWVsZFwiPlNhdmU8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJidG4gYnRuLXNtXCIgdGl0bGU9XCJDdXN0b20gRmllbGQgdXNpbmcgRnVuY3Rpb25cIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXtpc0Z1bmN0aW9uRmllbGQoIWlzRnVuY3Rpb25GaWVsZCgpKX0sIHRleHQ6IGlzRnVuY3Rpb25GaWVsZCgpPyAnQ2FuY2VsJzogJ0Z1bmN0aW9uJywgY3NzOiB7J2J0bi1wcmltYXJ5JzogIWlzRnVuY3Rpb25GaWVsZCgpLCAnYnRuLWRhbmdlcic6IGlzRnVuY3Rpb25GaWVsZH1cIj48L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBwYWRkZWQtZGl2XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogaXNGdW5jdGlvbkZpZWxkKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlvdSBhcmUgbm93IGNyZWF0aW5nIGEgQ3VzdG9taXplZCBGaWVsZCB1c2luZyBGdW5jdGlvbnMgYXZhaWxhYmxlLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0yIGNvbnRyb2wtbGFiZWxcIj5GaWVsZCBMYWJlbDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc21cIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogZm9ybXVsYUZpZWxkTGFiZWxcIiByZXF1aXJlZCBwbGFjZWhvbGRlcj1cIkN1c3RvbSBGaWVsZCBMYWJlbFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS0yIGNvbnRyb2wtbGFiZWxcIj5EYXRhIEZvcm1hdDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3QgZm9ybS1jb250cm9sLXNtXCIgZGF0YS1iaW5kPVwidmFsdWU6IGZvcm11bGFEYXRhRm9ybWF0XCIgcmVxdWlyZWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPlN0cmluZzwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbj5JbnRlZ2VyPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPkRlY2ltYWw8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24+Q3VycmVuY3k8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24+RGF0ZTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIkRhdGVUaW1lXCI+RGF0ZSBhbmQgVGltZTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogZm9ybXVsYURhdGFGb3JtYXQoKSA9PSAnRGVjaW1hbCcgfHwgZm9ybXVsYURhdGFGb3JtYXQoKSA9PSAnQ3VycmVuY3knXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTIgY29udHJvbC1sYWJlbFwiPlJvdW5kIHRvIERlY2ltYWwgUGxhY2VzPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTEwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogZm9ybXVsYURlY2ltYWxQbGFjZXNcIiBwbGFjZWhvbGRlcj1cIkNob29zZSBEZWNpbWFsIHBsYWNlcyAobGVhdmUgYmxhbmsgdG8gbm90IHVzZSByb3VuZGluZylcIiB0aXRsZT1cIkNob29zZSBEZWNpbWFsIHBsYWNlcyAobGVhdmUgYmxhbmsgdG8gbm90IHVzZSByb3VuZGluZylcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgeW91ciBGdW5jdGlvbjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgaWQ9XCJmdW5jdGlvbi1jb2RlXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2xlYXJmaXhcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6IGxhc3RQaWNrZWRGaWVsZCgpICYmIGxhc3RQaWNrZWRGaWVsZCgpLmZpZWxkVHlwZSA9PSAnSnNvbidcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNj5TZWxlY3QgRGF0YSBGaWVsZHMgZnJvbSA8c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBsYXN0UGlja2VkRmllbGQoKS5maWVsZE5hbWVcIj48L3NwYW4+PC9oNj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgY29udGFpbmVyLWZsdWlkXCIgZGF0YS1iaW5kPVwiZm9yZWFjaDoganNvbkZpZWxkc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMyBjb2wtc20tNCBjb2wteHMtNiBsaXN0LWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWRJbkFycmF5OiB7YXJyYXk6ICRwYXJlbnQuU2VsZWN0ZWRGaWVsZHMsIHZhbHVlOiAkZGF0YX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidGV4dDoganNvbkNvbHVtbk5hbWVcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJjdXN0b21GaWVsZFNlY3Rpb25cIiBkYXRhLWJpbmQ9XCJpZjogaXNGb3JtdWxhRmllbGRcIiBjbGFzcz1cImN1c3RvbS1maWVsZC1kZXNpZ25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiPkJ1aWxkIEN1c3RvbSBGaWVsZDwvYj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogJ2N1c3RvbS1maWVsZC1kZXNpZ25lcidcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbGVhcmZpeFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwiY29sLTggcHVsbC1sZWZ0XCI+PHNwYW4gY2xhc3M9XCJmYSBmYS10YWJsZVwiPjwvc3Bhbj4mbmJzcDtTZWxlY3RlZCBkYXRhIGZvciB0aGUgUmVwb3J0PC9oNT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTQgcHVsbC1yaWdodCByaWdodC1hbGlnblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwic21hbGwgdGV4dC1tdXRlZFwiIGRhdGEtYmluZD1cInZpc2libGU6IFNlbGVjdGVkRmllbGRzKCkubGVuZ3RoLCBjbGljazogZnVuY3Rpb24oKSB7U2VsZWN0ZWRGaWVsZHMoW10pO31cIj5DbGVhciBhbGw8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiAnZGVzaWduZXItc2VsZWN0ZWQtZGF0YSdcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6IGxpbmtlZFJlcG9ydEZpZWxkcygpLmxlbmd0aCA+IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgbWItNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBiZy1saWdodFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cIm1iLTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1ib29rbWFya1wiPjwvaT4gSW5jbHVkZSBTdWIgUmVwb3J0c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiAnZGVzaWduZXItc3ViLXJlcG9ydCdcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBSZXBvcnRUeXBlKCk9PSdIdG1sJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBtYi00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIGJnLWxpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibWItMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXBlbmNpbFwiPjwvaT4gRGVzaWduIHlvdXIgUmVwb3J0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdkZXNpZ25lci1odG1sJ1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDU+PHNwYW4gY2xhc3M9XCJmYSBmYS1maWx0ZXJcIj48L3NwYW4+Jm5ic3A7Q2hvb3NlIEZpbHRlcnM8L2g1PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIiBzdHlsZT1cInBhZGRpbmc6IDEwcHggMTBweDsgb3ZlcmZsb3cteDogYXV0bztcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiB1c2VTdG9yZWRQcm9jXCIgY2xhc3M9XCJjb2wtbWQtMTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZToge25hbWU6ICdmaWx0ZXItcGFyYW1ldGVycyd9XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZm5vdDogdXNlU3RvcmVkUHJvY1wiIGNsYXNzPVwiY29sLW1kLTEyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6IHtuYW1lOiAnZmlsdGVyLWdyb3VwJ31cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94IGNvbC0xMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogRWRpdEZpbHRlcnNPblJlcG9ydFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvdyBzZXR0aW5nIHVwIGFuZCBzYXZpbmcgZmlsdGVycyBvbiBSZXBvcnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaGlkZGVuOiB1c2VTdG9yZWRQcm9jXCIgY2xhc3M9XCJjYXJkIGNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1PjxzcGFuIGNsYXNzPVwiZmEgZmEtc29ydFwiPjwvc3Bhbj4mbmJzcDtDaG9vc2UgU29ydGluZzwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiAnZGVzaWduZXItc29ydCdcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInZpc2libGU6IFNhdmVSZXBvcnRcIiBjbGFzcz1cImNhcmQgY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDU+PHNwYW4gY2xhc3M9XCJmYSBmYS1ob3VyZ2xhc3NcIj48L3NwYW4+Jm5ic3A7Q2hvb3NlIFNjaGVkdWxlPC9oNT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzogMTBweCAxMHB4XCIgZGF0YS1iaW5kPVwiaWY6IFNhdmVSZXBvcnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiB7bmFtZTogJ3JlcG9ydC1zY2hlZHVsZSd9XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmbm90OiB1c2VTdG9yZWRQcm9jXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBjYXJkLWJvZHlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiAnZGVzaWduZXItb3B0aW9ucydcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogYWRtaW5Nb2RlXCIgY2xhc3M9XCJjYXJkIGNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZToge25hbWU6ICdtYW5hZ2UtYWNjZXNzLXRlbXBsYXRlJywgZGF0YTogbWFuYWdlQWNjZXNzfVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBhZG1pbk1vZGUsIGNsaWNrOiBSdW5SZXBvcnRTcWxQcmV2aWV3XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jb2RlXCI+PC9pPiBQcmV2aWV3IFJlcG9ydCBDb2RlXHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJidG4gYnRuLWRhbmdlclwiIGRhdGEtYmluZD1cImNsaWNrOiBjYW5jZWxDcmVhdGVSZXBvcnRcIj5DYW5jZWwgZWRpdGluZyBSZXBvcnQ8L2E+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgdHlwZT1cImJ1dHRvblwiIGRhdGEtYmluZD1cInZpc2libGU6IFNhdmVSZXBvcnQoKSAmJiBDYW5TYXZlUmVwb3J0cygpLCBjbGljazogU2F2ZVdpdGhvdXRSdW5cIiBzdHlsZT1cInBhZGRpbmctcmlnaHQ6IDEwcHg7XCI+U2F2ZSBSZXBvcnQ8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1iaW5kPVwidGV4dDogU2F2ZVJlcG9ydCgpICYmIENhblNhdmVSZXBvcnRzKCk/ICdTYXZlICYgUnVuIFJlcG9ydCc6ICdSdW4gUmVwb3J0JywgY2xpY2s6IFJ1blJlcG9ydFwiPlJ1biBSZXBvcnQ8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvc2NyaXB0PlxyXG5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJjaGFydC1zZXR0aW5nc1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNoYXJ0LWNvbnRhaW5lciBwdWxsLXJpZ2h0XCI+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tbGlnaHQgYnRuLXNtIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtMiBjaGFydC1zZXR0aW5ncy1idG5cIlxyXG4gICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwiY2xpY2s6IHRvZ2dsZUNoYXJ0U2V0dGluZ3NcIiB0aXRsZT1cIlJlcG9ydCBzZXR0aW5nc1wiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWNvZ1wiPjwvaT5cclxuICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNoYXJ0LXNldHRpbmdzLXBhbmVsIGJvcmRlciBwLTIgc2hhZG93LXNtIGJnLWxpZ2h0XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogc2hvd1NldHRpbmdzXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG1iLTJcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1jbG9zZVwiIGRhdGEtYmluZD1cImNsaWNrOiB0b2dnbGVDaGFydFNldHRpbmdzXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8aDYgY2xhc3M9XCJtYi0wXCI+UmVwb3J0IFNldHRpbmdzPC9oNj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICA8dWwgY2xhc3M9XCJuYXYgbmF2LXRhYnMgbmF2LXNtIG1iLTIgc21hbGxcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBSZXBvcnRUeXBlKCkgPT09ICdCYXInIHx8IFJlcG9ydFR5cGUoKSA9PT0gJ1BpZScgfHwgUmVwb3J0VHlwZSgpID09PSAnTGluZSdcIj5cclxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cIm5hdi1pdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJuYXYtbGlua1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1icy10b2dnbGU9XCJ0YWJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cImF0dHI6IHsgaHJlZjogJyNjaGFydFRhYi0nICsgUmVwb3J0SUQoKSB9LCBjc3M6IHsgYWN0aXZlOiBSZXBvcnRUeXBlKCkgPT09ICdCYXInIHx8IFJlcG9ydFR5cGUoKSA9PT0gJ1BpZScgfHwgUmVwb3J0VHlwZSgpID09PSAnTGluZScgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBDaGFydFxyXG4gICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwibmF2LWxpbmtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYnMtdG9nZ2xlPVwidGFiXCJcclxuICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJhdHRyOiB7IGhyZWY6ICcjdGFibGVUYWItJyArIFJlcG9ydElEKCkgfSwgY3NzOiB7IGFjdGl2ZTogIShSZXBvcnRUeXBlKCkgPT09ICdCYXInIHx8IFJlcG9ydFR5cGUoKSA9PT0gJ1BpZScgfHwgUmVwb3J0VHlwZSgpID09PSAnTGluZScpIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVcclxuICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLWNvbnRlbnQgc21hbGxcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWItcGFuZSBmYWRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwiYXR0cjogeyBpZDogJ2NoYXJ0VGFiLScgKyBSZXBvcnRJRCgpIH0sIGNzczogeyAnc2hvdyBhY3RpdmUnOiBSZXBvcnRUeXBlKCkgPT09ICdCYXInIHx8IFJlcG9ydFR5cGUoKSA9PT0gJ1BpZScgfHwgUmVwb3J0VHlwZSgpID09PSAnTGluZScgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIiByb2xlPVwiZ3JvdXBcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBSZXBvcnRUeXBlKCkgPT09ICdCYXInIHx8IFJlcG9ydFR5cGUoKSA9PT0gJ1BpZScgfHwgUmVwb3J0VHlwZSgpID09PSAnTGluZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1saWdodFwiIGRhdGEtYnMtdG9nZ2xlPVwidG9vbHRpcFwiIHRpdGxlPVwiQmFyIENoYXJ0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwiY3NzOiB7ICdhY3RpdmUnOiBSZXBvcnRUeXBlKCkgPT09ICdCYXInIH0sIGNsaWNrOiBmdW5jdGlvbigpIHsgUmVwb3J0VHlwZSgnQmFyJyk7IH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWJhci1jaGFydFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWxpZ2h0XCIgZGF0YS1icy10b2dnbGU9XCJ0b29sdGlwXCIgdGl0bGU9XCJQaWUgQ2hhcnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJjc3M6IHsgJ2FjdGl2ZSc6IFJlcG9ydFR5cGUoKSA9PT0gJ1BpZScgfSwgY2xpY2s6IGZ1bmN0aW9uKCkgeyBSZXBvcnRUeXBlKCdQaWUnKTsgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtcGllLWNoYXJ0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tbGlnaHRcIiBkYXRhLWJzLXRvZ2dsZT1cInRvb2x0aXBcIiB0aXRsZT1cIkxpbmUgQ2hhcnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJjc3M6IHsgJ2FjdGl2ZSc6IFJlcG9ydFR5cGUoKSA9PT0gJ0xpbmUnIH0sIGNsaWNrOiBmdW5jdGlvbigpIHsgUmVwb3J0VHlwZSgnTGluZScpOyB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1saW5lLWNoYXJ0XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogUmVwb3J0VHlwZSgpPT0nQmFyJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveCBjb2wtNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogYmFyQ2hhcnRIb3Jpem9udGFsXCIgLz4gSG9yaXpvbnRhbDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveCBjb2wtNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogYmFyQ2hhcnRTdGFja2VkXCIgLz4gU3RhY2tlZDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBSZXBvcnRUeXBlKCk9PSdQaWUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94IGNvbC02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBwaWVDaGFydERvbnV0XCIgLz4gRG9udXQ8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidmlzaWJsZTogUmVwb3J0VHlwZSgpPT0nTGluZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3ggY29sLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IGxpbmVDaGFydEFyZWFcIiAvPiBBcmVhPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIHNtYWxsXCI+QmFja2dyb3VuZCBDb2xvcjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtd3JhcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiIGNsYXNzPVwiY29sb3ItcGlja2VyXCIgZGF0YS1iaW5kPVwidmFsdWU6IGNoYXJ0T3B0aW9ucygpLmJhY2tncm91bmRDb2xvciwgYXR0cjogeyBwbGFjZWhvbGRlcjogJ1NlbGVjdCcgfSwgZXZlbnQ6IHsgY2hhbmdlOiB1cGRhdGVDaGFydCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgc21hbGxcIj5Gb250IENvbG9yPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC13cmFwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNvbG9yXCIgY2xhc3M9XCJjb2xvci1waWNrZXJcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogY2hhcnRPcHRpb25zKCkuZm9udENvbG9yLCBhdHRyOiB7IHBsYWNlaG9sZGVyOiAnU2VsZWN0JyB9LCBldmVudDogeyBjaGFuZ2U6IHVwZGF0ZUNoYXJ0IH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBzbWFsbFwiPlNlcmllcyBDb2xvcnM8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtd3JhcFwiIGRhdGEtYmluZD1cImZvcmVhY2g6IGNoYXJ0T3B0aW9ucygpLnNlcmllc0NvbG9yc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbG9yLWJveCBtZS0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiIGNsYXNzPVwiY29sb3ItcGlja2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwidmFsdWU6ICRkYXRhLCBldmVudDogeyBpbnB1dDogZnVuY3Rpb24oZGF0YSwgZXZlbnQpIHsgJHBhcmVudC51cGRhdGVTZXJpZXNDb2xvcigkaW5kZXgoKSwgZXZlbnQudGFyZ2V0LnZhbHVlKTsgfSB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWRhbmdlciByZW1vdmUtY29sb3JcIiBkYXRhLWJpbmQ9XCJjbGljazogJHBhcmVudC5yZW1vdmVTZXJpZXNDb2xvclwiPiZ0aW1lczs8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbG9yLWJveCBidG4gYnRuLXNtIGJ0bi1zZWNvbmRhcnlcIiBkYXRhLWJpbmQ9XCJjbGljazogYWRkU2VyaWVzQ29sb3JcIiB0aXRsZT1cIkFkZCBTZXJpZXMgQ29sb3JcIiBzdHlsZT1cIm1hcmdpbi10b3A6IC03cHg7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXBsdXNcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gbWItMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBzbWFsbFwiPkxlZ2VuZCBQb3NpdGlvbjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3QgZm9ybS1zZWxlY3Qtc21cIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogY2hhcnRPcHRpb25zKCkubGVnZW5kUG9zaXRpb24sIGV2ZW50OiB7IGNoYW5nZTogdXBkYXRlQ2hhcnQgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJyaWdodFwiPlJpZ2h0PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInRvcFwiPlRvcDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJib3R0b21cIj5Cb3R0b208L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibm9uZVwiPk5vbmU8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgc21hbGxcIj5Gb250IFNpemU8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc20gZm9udC1zaXplLWlucHV0XCIgZGF0YS1iaW5kPVwidmFsdWU6IGNoYXJ0T3B0aW9ucygpLmZvbnRTaXplLCBldmVudDogeyBjaGFuZ2U6IHVwZGF0ZUNoYXJ0IH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBSZXBvcnRUeXBlKCkhPSdQaWUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGZvcm0tc3dpdGNoIHNtYWxsIG1iLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBjaGFydE9wdGlvbnMoKS5zaG93WEF4aXNMYWJlbCwgZXZlbnQ6IHsgY2hhbmdlOiB1cGRhdGVDaGFydCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCI+WC1BeGlzIExhYmVsPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGZvcm0tc3dpdGNoIHNtYWxsIG1iLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBjaGFydE9wdGlvbnMoKS5zaG93WUF4aXNMYWJlbCwgZXZlbnQ6IHsgY2hhbmdlOiB1cGRhdGVDaGFydCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCI+WS1BeGlzIExhYmVsPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGZvcm0tc3dpdGNoIHNtYWxsIG1iLTFcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBSZXBvcnRUeXBlKCkgIT09ICdQaWUnXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogY2hhcnRPcHRpb25zKCkuc2hvd0dyaWRsaW5lcywgZXZlbnQ6IHsgY2hhbmdlOiB1cGRhdGVDaGFydCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWNoZWNrLWxhYmVsXCI+R3JpZGxpbmVzPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWNoZWNrIGZvcm0tc3dpdGNoIHNtYWxsIG1iLTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiB0eXBlPVwiY2hlY2tib3hcIiBkYXRhLWJpbmQ9XCJjaGVja2VkOiBjaGFydE9wdGlvbnMoKS5zaG93U21hbGxWYWx1ZXNPbkxhYmVsLCBldmVudDogeyBjaGFuZ2U6IHVwZGF0ZUNoYXJ0IH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tY2hlY2stbGFiZWxcIj5TaG93IFNtYWxsIFZhbHVlcyBPbiBMYWJlbDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBzbWFsbCBtYi0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+WS1BeGlzIEZvcm1hdDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc21cIiBwbGFjZWhvbGRlcj1cIiMsIyMwLjAwXCIgZGF0YS1iaW5kPVwidmFsdWU6IGNoYXJ0T3B0aW9ucygpLnlBeGlzRm9ybWF0LCBldmVudDogeyBjaGFuZ2U6IHVwZGF0ZUNoYXJ0IH1cIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgc21hbGwgbWItMSBkLWZsZXggZ2FwLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTUwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlktQXhpcyBNaW48L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtXCIgZGF0YS1iaW5kPVwidmFsdWU6IGNoYXJ0T3B0aW9ucygpLnlNaW4sIGV2ZW50OiB7IGNoYW5nZTogdXBkYXRlQ2hhcnQgfVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTUwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlktQXhpcyBNYXg8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1jb250cm9sLXNtXCIgZGF0YS1iaW5kPVwidmFsdWU6IGNoYXJ0T3B0aW9ucygpLnlNYXgsIGV2ZW50OiB7IGNoYW5nZTogdXBkYXRlQ2hhcnQgfVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLXBhbmUgZmFkZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cImF0dHI6IHsgaWQ6ICd0YWJsZVRhYi0nICsgUmVwb3J0SUQoKSB9LCBjc3M6IHsgJ3Nob3cgYWN0aXZlJzogIShSZXBvcnRUeXBlKCkgPT09ICdCYXInIHx8IFJlcG9ydFR5cGUoKSA9PT0gJ1BpZScgfHwgUmVwb3J0VHlwZSgpID09PSAnTGluZScpIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTIgY29sLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgc21hbGxcIj5IZWFkZXIgQmFjayBDb2xvcjwvbGFiZWw+PGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNvbG9yXCIgY2xhc3M9XCJjb2xvci1waWNrZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cImF0dHI6IHsgaWQ6ICd0YmwtY29sb3ItcGlja2VyLScgKyBSZXBvcnRJRCgpfSAsIHZhbHVlOiB0YWJsZVNldHRpbmdzKCkuaGVhZGVyQmFja0NvbG9yLCBldmVudDogeyBjaGFuZ2U6IHVwZGF0ZVRhYmxlIH1cIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMiBjb2wtNlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBzbWFsbFwiPkhlYWRlciBGb250IENvbG9yPC9sYWJlbD48YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY29sb3JcIiBjbGFzcz1cImNvbG9yLXBpY2tlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwiYXR0cjogeyBpZDogJ3RibC1jb2xvci1waWNrZXItJyArIFJlcG9ydElEKCl9ICx2YWx1ZTogdGFibGVTZXR0aW5ncygpLmhlYWRlckZvbnRDb2xvciwgZXZlbnQ6IHsgY2hhbmdlOiB1cGRhdGVUYWJsZSB9XCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTIgY29sLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgc21hbGxcIj5Sb3cgQmFjayBDb2xvcjwvbGFiZWw+PGJyIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNvbG9yXCIgY2xhc3M9XCJjb2xvci1waWNrZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cImF0dHI6IHsgaWQ6ICd0YmwtY29sb3ItcGlja2VyLScgKyBSZXBvcnRJRCgpfSAsdmFsdWU6IHRhYmxlU2V0dGluZ3MoKS5yb3dCYWNrQ29sb3IsIGV2ZW50OiB7IGNoYW5nZTogdXBkYXRlVGFibGUgfVwiLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yIGNvbC02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIHNtYWxsXCI+Um93IEZvbnQgQ29sb3I8L2xhYmVsPjxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiIGNsYXNzPVwiY29sb3ItcGlja2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJhdHRyOiB7IGlkOiAndGJsLWNvbG9yLXBpY2tlci0nICsgUmVwb3J0SUQoKX0gLHZhbHVlOiB0YWJsZVNldHRpbmdzKCkucm93Rm9udENvbG9yLCBldmVudDogeyBjaGFuZ2U6IHVwZGF0ZVRhYmxlIH1cIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTIgY29sLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgc21hbGxcIj5BbHQgUm93IEJhY2sgQ29sb3I8L2xhYmVsPjxiciAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiIGNsYXNzPVwiY29sb3ItcGlja2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJ2YWx1ZTogdGFibGVTZXR0aW5ncygpLmFsdFJvd0JhY2tDb2xvciwgZXZlbnQ6IHsgY2hhbmdlOiB1cGRhdGVUYWJsZSB9XCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTIgY29sLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgc21hbGxcIj5BbHQgUm93IEZvbnQgQ29sb3I8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjb2xvclwiIGNsYXNzPVwiY29sb3ItcGlja2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJ2YWx1ZTogdGFibGVTZXR0aW5ncygpLmFsdFJvd0ZvbnRDb2xvciwgZXZlbnQ6IHsgY2hhbmdlOiB1cGRhdGVUYWJsZSB9XCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBtYi0yXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIHNtYWxsXCI+Qm9yZGVyczwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgZC1mbGV4IGZsZXgtd3JhcFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWxpZ2h0IGJ0bi1zbSBmbGV4LWZpbGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKXsgdGFibGVTZXR0aW5ncygpLmJvcmRlcignbm9uZScpOyB1cGRhdGVUYWJsZSgpOyB9LCBjc3M6IHsgYWN0aXZlOiB0YWJsZVNldHRpbmdzKCkuYm9yZGVyID09PSAnbm9uZScgfVwiPk5vbmU8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1saWdodCBidG4tc20gZmxleC1maWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCl7IHRhYmxlU2V0dGluZ3MoKS5ib3JkZXIoJ2FsbCcpOyB1cGRhdGVUYWJsZSgpOyB9LCBjc3M6IHsgYWN0aXZlOiB0YWJsZVNldHRpbmdzKCkuYm9yZGVyID09PSAnYWxsJyB9XCI+QWxsPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tbGlnaHQgYnRuLXNtIGZsZXgtZmlsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpeyB0YWJsZVNldHRpbmdzKCkuYm9yZGVyKCdvdXRlcicpOyB1cGRhdGVUYWJsZSgpOyB9LCBjc3M6IHsgYWN0aXZlOiB0YWJsZVNldHRpbmdzKCkuYm9yZGVyID09PSAnb3V0ZXInIH1cIj5PdXRzaWRlPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tbGlnaHQgYnRuLXNtIGZsZXgtZmlsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpeyB0YWJsZVNldHRpbmdzKCkuYm9yZGVyKCdpbm5lcicpOyB1cGRhdGVUYWJsZSgpOyB9LCBjc3M6IHsgYWN0aXZlOiB0YWJsZVNldHRpbmdzKCkuYm9yZGVyID09PSAnaW5uZXInIH1cIj5JbnNpZGU8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0yIGNvbC02XCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBzbWFsbFwiPkJvcmRlciBDb2xvcjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNvbG9yXCIgY2xhc3M9XCJjb2xvci1waWNrZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwidmFsdWU6IHRhYmxlU2V0dGluZ3MoKS5ib3JkZXJDb2xvciwgZXZlbnQ6IHsgY2hhbmdlOiB1cGRhdGVUYWJsZSB9XCIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTIgY29sLTYgZC1mbGV4IGFsaWduLWl0ZW1zLWVuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIHNtYWxsIGJ0bi1vdXRsaW5lLXNlY29uZGFyeVwiIGRhdGEtYmluZD1cImNsaWNrOiBjbGVhclRhYmxlU2V0dGluZ3NcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGVhclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvc2NyaXB0PlxyXG5cclxuPGRpdiBjbGFzcz1cIm1vZGFsXCIgaWQ9XCJkcmlsbGRvd25Nb2RhbFwiIHRhYmluZGV4PVwiLTFcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIG1vZGFsLWxnXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIiBkYXRhLWJpbmQ9XCJ3aXRoOiBDaGFydERyaWxsRG93bkRhdGFcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGg0IGNsYXNzPVwibW9kYWwtdGl0bGVcIj5EcmlsbGRvd24gRGF0YTwvaDQ+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZSBwdWxsLXJpZ2h0XCIgZGF0YS1icy1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwhLS0ga28gaWY6IERyaWxsRG93bkRhdGEgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwib3ZlcmZsb3cteDogYXV0bzsgbWF4LWhlaWdodDogNTAwcHg7IG92ZXJmbG93LXk6IGF1dG87XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgdGFibGUtc3RyaXBlZCB0YWJsZS1ob3ZlciB0YWJsZS1jb25kZW5zZWRcIiBkYXRhLWJpbmQ9XCJ3aXRoOiBEcmlsbERvd25EYXRhLCBhdHRyOiB7Y2xhc3M6ICd0YWJsZSB0YWJsZS1zdHJpcGVkIHRhYmxlLWhvdmVyIHRhYmxlLWNvbmRlbnNlZCAnICsgJHBhcmVudC5zZWxlY3RlZFN0eWxlKCl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZCBzdHlsZT1cInBvc2l0aW9uOiBzdGlja3k7IHRvcDogLTFweDsgei1pbmRleDogMjtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cIm5vLWhpZ2hsaWdodFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogQ29sdW1ucyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggZGF0YS1iaW5kPVwiYXR0cjogeyBpZDogZmllbGRJZCB9LCBjc3M6IHsncmlnaHQtYWxpZ24nOiBJc051bWVyaWN9LCBzdHlsZTogeyd3aWR0aCc6IGZpZWxkV2lkdGgsICdiYWNrZ3JvdW5kLWNvbG9yJzogaGVhZGVyQmFja0NvbG9yIH0sIGhpZGRlbjogb3V0ZXJHcm91cFwiIHN0eWxlPVwiYm9yZGVyLXJpZ2h0OiAxcHggc29saWQ7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cInRleHQ6IGZpZWxkTGFiZWwyKCkgPyBmaWVsZExhYmVsMigpIDogKGZpZWxkTGFiZWwoKSA/IGZpZWxkTGFiZWwoKSA6IGZpZWxkTmFtZSksIHN0eWxlOiB7J2NvbG9yJzogaGVhZGVyRm9udENvbG9yLCAnZm9udC13ZWlnaHQnOiBoZWFkZXJGb250Qm9sZCgpID8gJ2JvbGQnIDogJ25vcm1hbCd9XCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAva28gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIGRhdGEtYmluZD1cInZpc2libGU6IFJvd3MgJiYgUm93cy5sZW5ndGggPCAxXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGRhdGEtYmluZD1cImF0dHI6e2NvbHNwYW46IENvbHVtbnMubGVuZ3RofVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBObyByZWNvcmRzIGZvdW5kXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGZvcmVhY2g6IFJvd3MgIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0ga28gZm9yZWFjaDogSXRlbXMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGRhdGEtYmluZD1cImhpZGRlbjogb3V0ZXJHcm91cCwgc3R5bGU6IHsnYmFja2dyb3VuZC1jb2xvcic6IGJhY2tDb2xvciwgJ2NvbG9yJzogZm9udENvbG9yLCAnZm9udC13ZWlnaHQnOiBmb250Qm9sZCgpID8gJ2JvbGQnIDogJ25vcm1hbCcgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInN0eWxlOiB7J3dpZHRoJzogZmllbGRXaWR0aCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmOiBMaW5rVG8tLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGRhdGEtYmluZD1cImF0dHI6IHtocmVmOiBMaW5rVG99XCIgdGFyZ2V0PVwiX2JsYW5rXCI+PHNwYW4gZGF0YS1iaW5kPVwiaHRtbDogZm9ybWF0dGVkVmFsXCI+PC9zcGFuPjwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGtvIGlmbm90OiBMaW5rVG8tLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cImh0bWw6IGZvcm1hdHRlZFZhbFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gL2tvLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAva28tLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXhzLTEyIGNvbC1jZW50ZXJlZFwiIGRhdGEtYmluZD1cIndpdGg6IHBhZ2VyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0taW5saW5lIHNtYWxsIHRleHQtbXV0ZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtbGVmdCB0b3RhbC1yZWNvcmRzXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogcGFnZXMoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogJ1RvdGFsIFJlY29yZHM6ICcgKyB0b3RhbFJlY29yZHMoKVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXhzXCIgdGl0bGU9XCJEb3dubG9hZCBFeGNlbFwiIGRhdGEtYmluZD1cImNsaWNrOiAkcGFyZW50LmV4cG9ydEV4Y2VsXCI+PHNwYW4gY2xhc3M9XCJmYSBmYS1maWxlLWV4Y2VsLW9cIj48L3NwYW4+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnkgYnRuLXNtXCIgZGF0YS1icy10b2dnbGU9XCJtb2RhbFwiIGRhdGEtYnMtdGFyZ2V0PVwiI3NxbERyaWxsRG93bk1vZGFsXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogJHJvb3QuYWRtaW5Nb2RlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1jb2RlXCI+PC9zcGFuPiBWaWV3IENvZGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcHVsbC1yaWdodFwiIGRhdGEtYmluZD1cInZpc2libGU6IHBhZ2VzKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdwYWdlci10ZW1wbGF0ZScsIGRhdGE6ICRkYXRhXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8IS0tIC9rbyAtLT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgY2xhc3M9XCJtb2RhbFwiIGlkPVwic3FsTW9kYWxcIiB0YWJpbmRleD1cIi0xXCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBtb2RhbC1sZ1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGg0IGNsYXNzPVwibW9kYWwtdGl0bGVcIj5SZXBvcnQgQ29kZTwvaDQ+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSBidG4tc20gZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbihkYXRhLCBldmVudCkgeyBjb3B5U3FsVG9DbGlwYm9hcmQoZXZlbnQudGFyZ2V0KTsgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2xpcGJvYXJkXCI+PC9pPiZuYnNwO0NvcHlcclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2UgcHVsbC1yaWdodFwiIGRhdGEtYnMtZGlzbWlzcz1cIm1vZGFsXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiIGRhdGEtYmluZD1cIndpdGg6IFJlcG9ydFJlc3VsdFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBpZD1cInJlcG9ydFNxbENvZGVcIiBzdHlsZT1cIm92ZXJmbG93LXg6IGF1dG87IG1heC1oZWlnaHQ6IDUwMHB4OyBvdmVyZmxvdy15OiBzY3JvbGw7IGJvcmRlcjogMXB4IHNvbGlkOyBwYWRkaW5nOiAxMHB4O1wiIGNsYXNzPVwiYmctZGFyayB0ZXh0LWxpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHByZT48Y29kZSBkYXRhLWJpbmQ9XCJodG1sOiBSZXBvcnRTcWxcIiBzdHlsZT1cIndoaXRlLXNwYWNlOiBwcmUtd3JhcDtcIj48L2NvZGU+PC9wcmU+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48ZGl2IGNsYXNzPVwibW9kYWxcIiBpZD1cInNxbERyaWxsRG93bk1vZGFsXCIgdGFiaW5kZXg9XCItMVwiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2cgbW9kYWwtbGdcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiIGRhdGEtYmluZD1cIndpdGg6Q2hhcnREcmlsbERvd25EYXRhXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGg0IGNsYXNzPVwibW9kYWwtdGl0bGVcIj5EcmlsbCBEb3duIFJlcG9ydCBDb2RlPC9oND5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5IGJ0bi1zbSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKGRhdGEsIGV2ZW50KSB7IGNvcHlTcWxUb0NsaXBib2FyZChldmVudC50YXJnZXQpOyB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1jbGlwYm9hcmRcIj48L2k+Jm5ic3A7Q29weVxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZSBwdWxsLXJpZ2h0XCIgZGF0YS1icy1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCIgZGF0YS1iaW5kPVwid2l0aDpEcmlsbERvd25EYXRhXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGlkPVwicmVwb3J0U3FsQ29kZVwiIHN0eWxlPVwib3ZlcmZsb3cteDogYXV0bzsgbWF4LWhlaWdodDogNTAwcHg7IG92ZXJmbG93LXk6IHNjcm9sbDsgYm9yZGVyOiAxcHggc29saWQ7IHBhZGRpbmc6IDEwcHg7XCIgY2xhc3M9XCJiZy1kYXJrIHRleHQtbGlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cHJlPjxjb2RlIGRhdGEtYmluZD1cImh0bWw6IFJlcG9ydFNxbFwiIHN0eWxlPVwid2hpdGUtc3BhY2U6IHByZS13cmFwO1wiPjwvY29kZT48L3ByZT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuPGRpdiBjbGFzcz1cIm1vZGFsXCIgaWQ9XCJub2FjY291bnRNb2RhbFwiIHRhYmluZGV4PVwiLTFcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2VcIiBkYXRhLWJzLWRpc21pc3M9XCJtb2RhbFwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGg0IGNsYXNzPVwibW9kYWwtdGl0bGVcIj5BY2NvdW50IG5vdCBTZXR1cDwvaDQ+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXJcIj5kb3RuZXQgUmVwb3J0IEFjY291bnQgQ29uZmlndXJhdGlvbiBtaXNzaW5nITwvcD5cclxuICAgICAgICAgICAgICAgIDxwPllvdSBkbyBub3QgaGF2ZSB0aGUgbmVjY2Vzc2FyeSBpbml0aWFsIGNvbmZpZ3VyYXRpb24gY29tcGxldGVkIHRvIHVzZSBkb3RuZXQgUmVwb3J0LjwvcD5cclxuICAgICAgICAgICAgICAgIDxwPlBsZWFzZSB2aWV3IHRoZSA8YSBocmVmPVwiaHR0cHM6Ly9kb3RuZXRyZXBvcnQuY29tL2Jsb2dzL2dldHRpbmctc3RhcnRlZC13aXRoLWRvdG5ldC1yZXBvcnQvXCIgdGFyZ2V0PVwiX2JsYW5rXCI+R2V0dGluZyBTdGFydGVkIEd1aWRlPC9hPiB0byBjb3JyZWN0bHkgY29uZmlndXJlIGRvdG5ldCBSZXBvcnQuPC9wPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIiBkYXRhLWJzLWRpc21pc3M9XCJtb2RhbFwiPkNsb3NlPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2h0bWxcIiBpZD1cInBkZi1vcHRpb25zLXNjaGVkdWxlLXRlbXBsYXRlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIG1vZGFsLWRpYWxvZy1jZW50ZXJlZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCIgZGF0YS1iaW5kPVwid2l0aDogUGRmUGFnZVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJtb2RhbC10aXRsZVwiIGlkPVwicGRmT3B0aW9uc1NjaGVkdWxlTW9kYWxMYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZmlsZS1wZGYtbyBtZS0yXCI+PC9pPiBTZXQgUERGIFBhZ2UgU2l6ZVxyXG4gICAgICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlXCIgZGF0YS1icy1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IHJvdyBnLTBcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNSBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwicGFnZVByZXZpZXdCb3hcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwic3R5bGU6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBzZWxlY3RlZFdpZHRoKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHNlbGVjdGVkSGVpZ2h0KCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHNlbGVjdGVkQmFja2dyb3VuZFN0eWxlKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOiAnYWxsIDAuM3MgZWFzZSdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzaGFkb3cgcm91bmRlZCBteC1hdXRvIG1iLTIgYm9yZGVyIHBvc2l0aW9uLXJlbGF0aXZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBvc2l0aW9uLWFic29sdXRlIHRvcC01MCBzdGFydC01MCB0cmFuc2xhdGUtbWlkZGxlIHRleHQtbXV0ZWQgc21hbGxcIj5QcmV2aWV3PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZXh0OiBzZWxlY3RlZFBhZ2VMYWJlbFwiIGNsYXNzPVwiZnctYm9sZFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRleHQ6IHNlbGVjdGVkUGFnZURpbWVuc2lvblwiIGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicGFnZVNpemVTZWxlY3RcIiBjbGFzcz1cImZvcm0tbGFiZWwgZnctYm9sZFwiPlBhZ2UgU2l6ZTo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBpZD1cInBhZ2VTaXplU2VsZWN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJvcHRpb25zOiBhdmFpbGFibGVQYWdlU2l6ZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zVGV4dDogJ2xhYmVsJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNWYWx1ZTogJ3ZhbHVlJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzZWxlY3RlZFBhZ2VTaXplXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwYWdlT3JpZW50YXRpb25TZWxlY3RcIiBjbGFzcz1cImZvcm0tbGFiZWwgZnctYm9sZFwiPlBhZ2UgT3JpZW50YXRpb246PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgaWQ9XCJwYWdlT3JpZW50YXRpb25TZWxlY3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cIm9wdGlvbnM6IGF2YWlsYWJsZVBhZ2VPcmllbnRhdGlvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNUZXh0OiAnbGFiZWwnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1ZhbHVlOiAndmFsdWUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHNlbGVjdGVkUGFnZU9yaWVudGF0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvIHAtMiBzbWFsbCBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgUERGIHdpbGwgYmUgZXhwb3J0ZWQgdXNpbmcgdGhlIHNlbGVjdGVkIHBhZ2Ugc2l6ZS4gRW5zdXJlIHlvdXIgY29udGVudCBmaXRzIHdlbGwuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBjb250ZW50IHdpZHRoIGV4Y2VlZHMgdGhlIHNlbGVjdGVkIHNpemUsIGl0IHdpbGwgZGVmYXVsdCB0byBMZXR0ZXIuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1saWdodFwiIGRhdGEtYnMtZGlzbWlzcz1cIm1vZGFsXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc3VjY2Vzc1wiIGRhdGEtYnMtZGlzbWlzcz1cIm1vZGFsXCIgZGF0YS1iaW5kPVwiY2xpY2s6IHNhdmVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgU2F2ZVxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvc2NyaXB0PlxyXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2h0bWxcIiBpZD1cIndvcmQtb3B0aW9ucy1zY2hlZHVsZS10ZW1wbGF0ZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBtb2RhbC1kaWFsb2ctY2VudGVyZWRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiIGRhdGEtYmluZD1cIndpdGg6IFdvcmRQYWdlXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgIDxoNSBjbGFzcz1cIm1vZGFsLXRpdGxlXCIgaWQ9XCJwZGZPcHRpb25zU2NoZWR1bGVNb2RhbExhYmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1maWxlLXBkZi1vIG1lLTJcIj48L2k+IFNldCBXT1JEIFBhZ2UgU2l6ZVxyXG4gICAgICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlXCIgZGF0YS1icy1kaXNtaXNzPVwibW9kYWxcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5IHJvdyBnLTBcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNSBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwicGFnZVByZXZpZXdCb3hcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwic3R5bGU6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBzZWxlY3RlZFdpZHRoKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHNlbGVjdGVkSGVpZ2h0KCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHNlbGVjdGVkQmFja2dyb3VuZFN0eWxlKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOiAnYWxsIDAuM3MgZWFzZSdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzaGFkb3cgcm91bmRlZCBteC1hdXRvIG1iLTIgYm9yZGVyIHBvc2l0aW9uLXJlbGF0aXZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBvc2l0aW9uLWFic29sdXRlIHRvcC01MCBzdGFydC01MCB0cmFuc2xhdGUtbWlkZGxlIHRleHQtbXV0ZWQgc21hbGxcIj5QcmV2aWV3PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZXh0OiBzZWxlY3RlZFBhZ2VMYWJlbFwiIGNsYXNzPVwiZnctYm9sZFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRleHQ6IHNlbGVjdGVkUGFnZURpbWVuc2lvblwiIGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicGFnZVNpemVTZWxlY3RcIiBjbGFzcz1cImZvcm0tbGFiZWwgZnctYm9sZFwiPlBhZ2UgU2l6ZTo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBpZD1cInBhZ2VTaXplU2VsZWN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJvcHRpb25zOiBhdmFpbGFibGVQYWdlU2l6ZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zVGV4dDogJ2xhYmVsJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNWYWx1ZTogJ3ZhbHVlJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzZWxlY3RlZFBhZ2VTaXplXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwYWdlT3JpZW50YXRpb25TZWxlY3RcIiBjbGFzcz1cImZvcm0tbGFiZWwgZnctYm9sZFwiPlBhZ2UgT3JpZW50YXRpb246PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgaWQ9XCJwYWdlT3JpZW50YXRpb25TZWxlY3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cIm9wdGlvbnM6IGF2YWlsYWJsZVBhZ2VPcmllbnRhdGlvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNUZXh0OiAnbGFiZWwnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1ZhbHVlOiAndmFsdWUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHNlbGVjdGVkUGFnZU9yaWVudGF0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvIHAtMiBzbWFsbCBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgV09SRCB3aWxsIGJlIGV4cG9ydGVkIHVzaW5nIHRoZSBzZWxlY3RlZCBwYWdlIHNpemUuIEVuc3VyZSB5b3VyIGNvbnRlbnQgZml0cyB3ZWxsLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgY29udGVudCB3aWR0aCBleGNlZWRzIHRoZSBzZWxlY3RlZCBzaXplLCBpdCB3aWxsIGRlZmF1bHQgdG8gTGV0dGVyLlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tbGlnaHRcIiBkYXRhLWJzLWRpc21pc3M9XCJtb2RhbFwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXN1Y2Nlc3NcIiBkYXRhLWJzLWRpc21pc3M9XCJtb2RhbFwiIGRhdGEtYmluZD1cImNsaWNrOiBzYXZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgIFNhdmVcclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L3NjcmlwdD5cclxuPHNjcmlwdCB0eXBlPVwidGV4dC9odG1sXCIgaWQ9XCJ3b3JkLW9wdGlvbnMtdGVtcGxhdGVcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIG1vZGFsLWRpYWxvZy1jZW50ZXJlZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCIgZGF0YS1iaW5kPVwid2l0aDogV29yZFBhZ2VcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGVcIiBpZD1cIndvcmRPcHRpb25zTW9kYWxMYWJlbFwiPjxpIGNsYXNzPVwiZmEgZmEtZmlsZS1wZGYtbyBtZS0yXCI+PC9pPiBFeHBvcnQgdG8gV09SRDwvaDU+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZVwiIGRhdGEtYnMtZGlzbWlzcz1cIm1vZGFsXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSByb3cgZy0wXCI+XHJcbiAgICAgICAgICAgICAgICA8IS0tIExlZnQgU2lkZTogUGFnZSBQcmV2aWV3IFNWRyAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNSBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwicGFnZVByZXZpZXdCb3hcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwic3R5bGU6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBzZWxlY3RlZFdpZHRoKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHNlbGVjdGVkSGVpZ2h0KCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHNlbGVjdGVkQmFja2dyb3VuZFN0eWxlKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOiAnYWxsIDAuM3MgZWFzZSdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzaGFkb3cgcm91bmRlZCBteC1hdXRvIG1iLTIgYm9yZGVyIHBvc2l0aW9uLXJlbGF0aXZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBvc2l0aW9uLWFic29sdXRlIHRvcC01MCBzdGFydC01MCB0cmFuc2xhdGUtbWlkZGxlIHRleHQtbXV0ZWQgc21hbGxcIj5QcmV2aWV3PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZXh0OiBzZWxlY3RlZFBhZ2VMYWJlbFwiIGNsYXNzPVwiZnctYm9sZFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRleHQ6IHNlbGVjdGVkUGFnZURpbWVuc2lvblwiIGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBSaWdodCBTaWRlOiBGb3JtIE9wdGlvbnMgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicGFnZVNpemVTZWxlY3RcIiBjbGFzcz1cImZvcm0tbGFiZWwgZnctYm9sZFwiPlBhZ2UgU2l6ZTo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBpZD1cInBhZ2VTaXplU2VsZWN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJvcHRpb25zOiBhdmFpbGFibGVQYWdlU2l6ZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zVGV4dDogJ2xhYmVsJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNWYWx1ZTogJ3ZhbHVlJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzZWxlY3RlZFBhZ2VTaXplXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwYWdlT3JpZW50YXRpb25TZWxlY3RcIiBjbGFzcz1cImZvcm0tbGFiZWwgZnctYm9sZFwiPlBhZ2UgT3JpZW50YXRpb246PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgaWQ9XCJwYWdlT3JpZW50YXRpb25TZWxlY3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cIm9wdGlvbnM6IGF2YWlsYWJsZVBhZ2VPcmllbnRhdGlvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNUZXh0OiAnbGFiZWwnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1ZhbHVlOiAndmFsdWUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHNlbGVjdGVkUGFnZU9yaWVudGF0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvIHAtMiBzbWFsbCBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgV29yZCB3aWxsIGJlIGV4cG9ydGVkIHVzaW5nIHRoZSBzZWxlY3RlZCBwYWdlIHNpemUuIEVuc3VyZSB5b3VyIGNvbnRlbnQgZml0cyB3ZWxsLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgY29udGVudCB3aWR0aCBleGNlZWRzIHRoZSBzZWxlY3RlZCBzaXplLCBpdCB3aWxsIGRlZmF1bHQgdG8gTGV0dGVyLlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tbGlnaHRcIiBkYXRhLWJzLWRpc21pc3M9XCJtb2RhbFwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXN1Y2Nlc3NcIiBkYXRhLWJzLWRpc21pc3M9XCJtb2RhbFwiIGRhdGEtYmluZD1cImNsaWNrOiBkb3dubG9hZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtZG93bmxvYWQgbWUtMVwiPjwvaT4gRG93bmxvYWQgV09SRFxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvc2NyaXB0PlxyXG48c2NyaXB0IHR5cGU9XCJ0ZXh0L2h0bWxcIiBpZD1cInBkZi1vcHRpb25zLXRlbXBsYXRlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIG1vZGFsLWRpYWxvZy1jZW50ZXJlZFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCIgZGF0YS1iaW5kPVwid2l0aDogUGRmUGFnZVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJtb2RhbC10aXRsZVwiIGlkPVwicGRmT3B0aW9uc01vZGFsTGFiZWxcIj48aSBjbGFzcz1cImZhIGZhLWZpbGUtcGRmLW8gbWUtMlwiPjwvaT4gRXhwb3J0IHRvIFBERjwvaDU+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZVwiIGRhdGEtYnMtZGlzbWlzcz1cIm1vZGFsXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keSByb3cgZy0wXCI+XHJcbiAgICAgICAgICAgICAgICA8IS0tIExlZnQgU2lkZTogUGFnZSBQcmV2aWV3IFNWRyAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNSBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwicGFnZVByZXZpZXdCb3hcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwic3R5bGU6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBzZWxlY3RlZFdpZHRoKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHNlbGVjdGVkSGVpZ2h0KCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHNlbGVjdGVkQmFja2dyb3VuZFN0eWxlKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uOiAnYWxsIDAuM3MgZWFzZSdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzaGFkb3cgcm91bmRlZCBteC1hdXRvIG1iLTIgYm9yZGVyIHBvc2l0aW9uLXJlbGF0aXZlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBvc2l0aW9uLWFic29sdXRlIHRvcC01MCBzdGFydC01MCB0cmFuc2xhdGUtbWlkZGxlIHRleHQtbXV0ZWQgc21hbGxcIj5QcmV2aWV3PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZXh0OiBzZWxlY3RlZFBhZ2VMYWJlbFwiIGNsYXNzPVwiZnctYm9sZFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRleHQ6IHNlbGVjdGVkUGFnZURpbWVuc2lvblwiIGNsYXNzPVwidGV4dC1tdXRlZCBzbWFsbFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBSaWdodCBTaWRlOiBGb3JtIE9wdGlvbnMgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicGFnZVNpemVTZWxlY3RcIiBjbGFzcz1cImZvcm0tbGFiZWwgZnctYm9sZFwiPlBhZ2UgU2l6ZTo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1zZWxlY3RcIiBpZD1cInBhZ2VTaXplU2VsZWN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLWJpbmQ9XCJvcHRpb25zOiBhdmFpbGFibGVQYWdlU2l6ZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zVGV4dDogJ2xhYmVsJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNWYWx1ZTogJ3ZhbHVlJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBzZWxlY3RlZFBhZ2VTaXplXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJwYWdlT3JpZW50YXRpb25TZWxlY3RcIiBjbGFzcz1cImZvcm0tbGFiZWwgZnctYm9sZFwiPlBhZ2UgT3JpZW50YXRpb246PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgaWQ9XCJwYWdlT3JpZW50YXRpb25TZWxlY3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtYmluZD1cIm9wdGlvbnM6IGF2YWlsYWJsZVBhZ2VPcmllbnRhdGlvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNUZXh0OiAnbGFiZWwnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1ZhbHVlOiAndmFsdWUnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHNlbGVjdGVkUGFnZU9yaWVudGF0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvIHAtMiBzbWFsbCBtdC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgUERGIHdpbGwgYmUgZXhwb3J0ZWQgdXNpbmcgdGhlIHNlbGVjdGVkIHBhZ2Ugc2l6ZS4gRW5zdXJlIHlvdXIgY29udGVudCBmaXRzIHdlbGwuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBjb250ZW50IHdpZHRoIGV4Y2VlZHMgdGhlIHNlbGVjdGVkIHNpemUsIGl0IHdpbGwgZGVmYXVsdCB0byBMZXR0ZXIuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1saWdodFwiIGRhdGEtYnMtZGlzbWlzcz1cIm1vZGFsXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc3VjY2Vzc1wiIGRhdGEtYnMtZGlzbWlzcz1cIm1vZGFsXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGRvd25sb2FkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1kb3dubG9hZCBtZS0xXCI+PC9pPiBEb3dubG9hZCBQREZcclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L3NjcmlwdD5cclxuYCk7XHJcbiAgICB0aGlzLmNkcmVmLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcbiAgXHJcbiAgcHJpdmF0ZSBiaW5kV2luZG93UmVzaXplKHZtOiBhbnkpOiB2b2lkIHtcclxuICAgIGxldCBfdm0gPSB2bTtcclxuICAgICQod2luZG93KS5yZXNpemUoZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIF92bS5kcmF3Q2hhcnQoKVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJpbmRHcmlkSW5pdCh2bTphbnkpOiB2b2lkIHtcclxuICAgIGxldCBfdm0gPSB2bTtcclxuXHJcbiAgICAkKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAkKCcuZ3JpZC1zdGFjaycpLnNob3coKTtcclxuICAgICAgICB2YXIgZ3JpZCA9IEdyaWRTdGFjay5pbml0KHtcclxuICAgICAgICAgICAgY2VsbEhlaWdodDogNjAsXHJcbiAgICAgICAgICAgIHZlcnRpY2FsTWFyZ2luOiAxMCxcclxuICAgICAgICAgICAgcmVzaXphYmxlOiB7XHJcbiAgICAgICAgICAgICAgICBoYW5kbGVzOiAnc2UsIHN3LCBuZSwgbncsIG4sIGUsIHMsIHcnIFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgZ3JpZC5vbignY2hhbmdlJywgZnVuY3Rpb24oZXZlbnQ6IGFueSwgaXRlbXM6IGFueVtdKSB7XHJcbiAgICAgICAgICBpZiAoaXRlbXMpIHtcclxuICAgICAgICAgICAgXy5mb3JFYWNoKGl0ZW1zLCBmdW5jdGlvbih4OiBhbnkpIHtcclxuICAgICAgICAgICAgICBfdm0udXBkYXRlUG9zaXRpb24oeCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGdyaWQub24oJ3Jlc2l6ZXN0b3AnLCBmdW5jdGlvbihldmVudDogeyB0YXJnZXQ6IGFueTsgfSwgaXRlbTogeyBzaXplOiB7IGhlaWdodDogbnVtYmVyOyB9OyB9KSB7XHJcbiAgICAgICAgICAgIHZhciBlID0gJChldmVudC50YXJnZXQpLmZpbmQoJy5yZXBvcnQtY2hhcnQnKTtcclxuICAgICAgICAgICAgdmFyIGQgPSAkKGV2ZW50LnRhcmdldCkuZmluZCgndGFibGUnKTtcclxuICAgICAgICAgICAgaWYgKGUgJiYgIWQpIHtcclxuICAgICAgICAgICAgICAgX3ZtLmRyYXdDaGFydCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7ICBcclxuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBfdm0uZHJhd0NoYXJ0KCk7XHJcbiAgICAgICAgZ3JpZC5lbmFibGVNb3ZlKGZhbHNlKTtcclxuICAgICAgICBncmlkLmVuYWJsZVJlc2l6ZShmYWxzZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICB9LCAxMDAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgfSk7XHJcbiAgICBcclxuICAgIFxyXG4gIH1cclxuICBcclxuICBcclxuICB9XHJcbiIsIjxkaXYgaWQ9XCJkb3QtbmV0LXJlcG9ydFwiIGNsYXNzPVwiYm9keS1jb250ZW50XCI+XHJcblxyXG48ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiB7bmFtZTogJ2FkbWluLW1vZGUtdGVtcGxhdGUnfSwgdmlzaWJsZTogYWxsb3dBZG1pblwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj48L2Rpdj5cclxuXHJcbjxkaXYgY2xhc3M9XCJyb3dcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmVcIiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBjdXJyZW50RGFzaGJvYXJkXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGQtZmxleCBmbGV4LXdyYXAganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgPHVsIGNsYXNzPVwibmF2IG5hdi10YWJzIGZsZXgtZ3Jvdy0xXCIgZGF0YS1iaW5kPVwiZm9yZWFjaDogZGFzaGJvYXJkc1wiPlxyXG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJuYXYtaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgPGgyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwibmF2LWxpbmtcIiBocmVmPVwiI1wiIGRhdGEtYmluZD1cInRleHQ6IG5hbWUsIGNsaWNrOiBmdW5jdGlvbigpIHsgJHBhcmVudC5zZWxlY3REYXNoYm9hcmQoaWQpO30sIGNzczogeyAnYWN0aXZlJzogJHBhcmVudC5jdXJyZW50RGFzaGJvYXJkKCkuaWQgPT09IGlkLCAnc2VsZWN0ZWQtdGFiJzogJHBhcmVudC5jdXJyZW50RGFzaGJvYXJkKCkuaWQgPT09IGlkIH1cIj48L2E+XHJcbiAgICAgICAgICAgICAgICA8L2gyPlxyXG4gICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgIDwvdWw+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LXdyYXAgYWxpZ24taXRlbXMtZW5kIGdhcC0yIG10LTIgbXQtbWQtMCBib3JkZXItYm90dG9tXCIgc3R5bGU9XCJwYWRkaW5nLXRvcDogMjFweDtcIj4gICAgICAgICAgICBcclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1saWdodCBidG4tc20gZHJvcGRvd24tdG9nZ2xlXCIgZGF0YS1icy10b2dnbGU9XCJkcm9wZG93blwiIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtcGVuY2lsLXNxdWFyZVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5NYW5hZ2U8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJkcm9wZG93biBkcm9wZG93bi1ob3ZlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiZHJvcGRvd24tdG9nZ2xlIGRyb3Bkb3duLWl0ZW1cIiBkYXRhLWJzLXRvZ2dsZT1cImRyb3Bkb3duXCIgcm9sZT1cImJ1dHRvblwiIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpIHsgbmV3UmVwb3J0KHRydWUpIH0sIHZpc2libGU6IGN1cnJlbnREYXNoYm9hcmQoKS5jYW5NYW5hZ2UgfHwgYWRtaW5Nb2RlKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtcGx1c1wiPjwvc3Bhbj4gQWRkIE5ldyBSZXBvcnRcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJkcm9wZG93bi1tZW51XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaHJlZj1cIiNcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKSB7IG5ld1JlcG9ydChmYWxzZSkgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLXBlbmNpbFwiPjwvc3Bhbj4gQWRkIHVzaW5nIFN0YW5kYXJkIERlc2lnbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBocmVmPVwiI1wiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpIHsgbmV3UmVwb3J0KHRydWUpIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1ib2x0XCI+PC9zcGFuPiBBZGQgdXNpbmcgU21hcnRlciBEZXNpZ25lclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICA8bGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgZGF0YS1icy10b2dnbGU9XCJtb2RhbFwiIGRhdGEtYnMtdGFyZ2V0PVwiI2FkZC1kYXNoYm9hcmQtbW9kYWxcIiBkYXRhLWJpbmQ9XCJjbGljazogZWRpdERhc2hib2FyZCwgdmlzaWJsZTogY3VycmVudERhc2hib2FyZCgpLmNhbk1hbmFnZSB8fCBhZG1pbk1vZGUoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1wZW5jaWxcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5FZGl0IERhc2hib2FyZDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICA8bGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgZGF0YS1icy10b2dnbGU9XCJtb2RhbFwiIGRhdGEtYnMtdGFyZ2V0PVwiI2FkZC1kYXNoYm9hcmQtbW9kYWxcIiBkYXRhLWJpbmQ9XCJjbGljazogbmV3RGFzaGJvYXJkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWRhc2hib2FyZFwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPkFkZCBhIE5ldyBEYXNoYm9hcmQ8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGRhdGEtYmluZD1cImNsaWNrOiBSZWZyZXNoQWxsUmVwb3J0c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1yZWZyZXNoXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+UmVmcmVzaDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJvcGRvd25cIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWxpZ2h0IGJ0bi1zbSBkcm9wZG93bi10b2dnbGVcIiBkYXRhLWJzLXRvZ2dsZT1cImRyb3Bkb3duXCIgYXJpYS1leHBhbmRlZD1cImZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1kb3dubG9hZFwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5FeHBvcnQ8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGk+PGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaHJlZj1cIiNcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKSB7IHJldHVybiBhcHBTZXR0aW5ncy5zaG93UGFnZVNpemUgPyBFeHBvcnRBbGxQZGZSZXBvcnRzV2l0aFBhZ2VPcHRpb24oKSA6IEV4cG9ydEFsbFBkZlJlcG9ydHMoJycsJycpOyB9LCBoaWRkZW46IGFwcFNldHRpbmdzLnVzZUFsdFBkZlwiPjxpIGNsYXNzPVwiZmEgZmEtZmlsZS1wZGYtb1wiPjwvaT4gUGRmPC9hPjwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGhyZWY9XCIjXCIgZGF0YS1iaW5kPVwiY2xpY2s6IGZ1bmN0aW9uKCkgeyByZXR1cm4gYXBwU2V0dGluZ3Muc2hvd1BhZ2VTaXplID8gRXhwb3J0QWxsUGRmQWx0UmVwb3J0c1dpdGhQYWdlT3B0aW9uKCkgOiBFeHBvcnRBbGxQZGZBbHRSZXBvcnRzKCcnLCcnKTsgfSwgdmlzaWJsZTogYXBwU2V0dGluZ3MudXNlQWx0UGRmXCI+PGkgY2xhc3M9XCJmYSBmYS1maWxlLXBkZi1vXCI+PC9pPiBQZGY8L2E+PC9saT5cclxuICAgICAgICAgICAgICAgICAgICA8bGk+PGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaHJlZj1cIiNcIiBkYXRhLWJpbmQ9XCJjbGljazogRXhwb3J0QWxsRXhjZWxSZXBvcnRzXCI+PGkgY2xhc3M9XCJmYSBmYS1maWxlLWV4Y2VsLW9cIj48L2k+IEV4Y2VsPC9hPjwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxpIGRhdGEtYmluZD1cInZpc2libGU6IGNhbkRyaWxsZG93blwiPjxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGhyZWY9XCIjXCIgZGF0YS1iaW5kPVwiY2xpY2s6IEV4cG9ydEFsbEV4Y2VsRXhwYW5kZWRSZXBvcnRzXCI+PGkgY2xhc3M9XCJmYSBmYS1maWxlLWV4Y2VsLW9cIj48L2k+IEV4Y2VsIChFeHBhbmRlZCk8L2E+PC9saT5cclxuICAgICAgICAgICAgICAgICAgICA8bGk+PGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaHJlZj1cIiNcIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKSB7IHJldHVybiBhcHBTZXR0aW5ncy5zaG93UGFnZVNpemUgPyBFeHBvcnRBbGxXb3JkUmVwb3J0c1dpdGhQYWdlT3B0aW9uKCkgOiBFeHBvcnRBbGxXb3JkUmVwb3J0cygnJywnJyk7fVwiPjxpIGNsYXNzPVwiZmEgZmEtZmlsZS13b3JkLW9cIj48L2k+IFdvcmQ8L2E+PC9saT5cclxuICAgICAgICAgICAgICAgICAgICA8bGk+PGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaHJlZj1cIiNcIiBkYXRhLWJpbmQ9XCJjbGljazogUHJpbnREYXNoYm9hcmRcIj48aSBjbGFzcz1cImZhIGZhLXByaW50XCI+PC9pPiBQcmludDwvYT48L2xpPlxyXG4gICAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6IGN1cnJlbnREYXNoYm9hcmQoKS5jYW5NYW5hZ2UgfHwgYWRtaW5Nb2RlKClcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4gYnRuLWxpZ2h0IGJ0bi1zbSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tY2hlY2sgZm9ybS1zd2l0Y2ggbS0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY2hlY2staW5wdXRcIiBpZD1cImFycmFuZ2UtbW9kZVwiIHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IGFycmFuZ2VEYXNoYm9hcmRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5BcnJhbmdlPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGJ0bi1ncm91cC1zbVwiIHJvbGU9XCJncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tbGlnaHRcIiBkYXRhLWJpbmQ9XCJjbGljazogem9vbU91dERhc2hib2FyZFwiIGRhdGEtYnMtdG9nZ2xlPVwidG9vbHRpcFwiIHRpdGxlPVwiWm9vbSBPdXRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNlYXJjaC1taW51c1wiPjwvaT5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWxpZ2h0XCIgZGF0YS1iaW5kPVwiY2xpY2s6IHJlc2V0Wm9vbURhc2hib2FyZFwiIGRhdGEtYnMtdG9nZ2xlPVwidG9vbHRpcFwiIHRpdGxlPVwiUmVzZXQgWm9vbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY29tcHJlc3NcIj48L2k+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1saWdodFwiIGRhdGEtYmluZD1cImNsaWNrOiB6b29tSW5EYXNoYm9hcmRcIiBkYXRhLWJzLXRvZ2dsZT1cInRvb2x0aXBcIiB0aXRsZT1cIlpvb20gSW5cIj5cclxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNlYXJjaC1wbHVzXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInJvd1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZVwiIGRhdGEtYmluZD1cInZpc2libGU6IGN1cnJlbnREYXNoYm9hcmRcIj5cclxuICAgICAgICA8ZGl2IGRhdGEtYmluZD1cIndpdGg6IGN1cnJlbnREYXNoYm9hcmRcIj5cclxuICAgICAgICAgICAgPHAgZGF0YS1iaW5kPVwidGV4dDogZGVzY3JpcHRpb25cIj48L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48ZGl2IGNsYXNzPVwicGFkZGVkLXRvcFwiPjwvZGl2PlxyXG5cclxuPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6IHtuYW1lOiAnZmx5LWZpbHRlci10ZW1wbGF0ZSd9XCI+PC9kaXY+XHJcbiAgICAgICAgPGJyIC8+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48ZGl2IGNsYXNzPVwiY2VudGVyZWRcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCIgZGF0YS1iaW5kPVwidmlzaWJsZTogZGFzaGJvYXJkcygpLmxlbmd0aCA9PSAwIFwiPlxyXG4gICAgTm8gRGFzaGJvYXJkcyB5ZXQuIENsaWNrIGJlbG93IHRvIFN0YXJ0PGJyIC8+XHJcbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1sZyBidG4tcHJpbWFyeVwiIGRhdGEtYnMtdG9nZ2xlPVwibW9kYWxcIiBkYXRhLWJzLXRhcmdldD1cIiNhZGQtZGFzaGJvYXJkLW1vZGFsXCI+PGkgY2xhc3M9XCJmYSBmYS1kYXNoYm9hcmRcIj48L2k+IENyZWF0ZSBhIE5ldyBEYXNoYm9hcmQ8L2J1dHRvbj5cclxuPC9kaXY+XHJcblxyXG48ZGl2IGNsYXNzPVwibW9kYWwgbW9kYWwtZnVsbHNjcmVlblwiIGlkPVwiYWRkLWRhc2hib2FyZC1tb2RhbFwiIHRhYmluZGV4PVwiLTFcIiBhcmlhLWxhYmVsbGVkYnk9XCJhZGQtZGFzaGJvYXJkLW1vZGFsLWxhYmVsXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nXCIgcm9sZT1cImRvY3VtZW50XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIiBkYXRhLWJpbmQ9XCJ3aXRoOiBkYXNoYm9hcmRcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGg0IGNsYXNzPVwibW9kYWwtdGl0bGVcIiBpZD1cImFkZC1kYXNoYm9hcmQtbW9kYWwtbGFiZWxcIj48c3BhbiBkYXRhLWJpbmQ9XCJ0ZXh0OiBJZCgpID8gJ0VkaXQnIDogJ0FkZCdcIj48L3NwYW4+IERhc2hib2FyZDwvaDQ+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZVwiIGRhdGEtYnMtZGlzbWlzcz1cIm1vZGFsXCIgZGF0YS1iaW5kPVwiY2xpY2s6ICRyb290Lm9uTW9kYWxDbG9zZUNsaWNrZWRcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItNCBjYXJkIGNhcmQtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbWQtMyBjb2wtZm9ybS1sYWJlbFwiPk5hbWU8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbFwiIGRhdGEtdmFsPVwidHJ1ZVwiIGRhdGEtdmFsLXJlcXVpcmVkPVwiRGFzaGJvYXJkIE5hbWUgaXMgcmVxdWlyZWQuXCIgdHlwZT1cInRleHRcIiBkYXRhLWJpbmQ9XCJ2YWx1ZTogTmFtZVwiIHBsYWNlaG9sZGVyPVwiRGFzaGJvYXJkIE5hbWUsIGUuZy4sIFNhbGVzLCBBY2NvdW50aW5nXCIgaWQ9XCJhZGQtZGFzaC1uYW1lXCIgcmVxdWlyZWQgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1tZC0zIGNvbC1mb3JtLWxhYmVsXCI+RGVzY3JpcHRpb248L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cImZvcm0tY29udHJvbFwiIGRhdGEtYmluZD1cInZhbHVlOiBEZXNjcmlwdGlvblwiIHBsYWNlaG9sZGVyPVwiT3B0aW9uYWwgRGVzY3JpcHRpb24gZm9yIHRoZSBEYXNoYm9hcmRcIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi00IGNhcmQgY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBhbGlnbi1pdGVtcy1jZW50ZXIgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNT48aSBjbGFzcz1cImZhIGZhLXBhcGVyY2xpcFwiPjwvaT4gQ2hvb3NlIFJlcG9ydHMgZm9yIHRoZSBEYXNoYm9hcmQ8L2g1PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoIFJlcG9ydCBieSBOYW1lIG9yIERlc2NyaXB0aW9uLi4uXCIgZGF0YS1iaW5kPVwidGV4dElucHV0OiAkcGFyZW50LnNlYXJjaFJlcG9ydHNcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJpZjogJHBhcmVudC5zZWFyY2hSZXBvcnRzKCkgJiYgJHBhcmVudC5yZXBvcnRzSW5TZWFyY2goKS5sZW5ndGg9PTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgY2FyZC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBObyByZXBvcnRzIGZvdW5kIG1hdGNoaW5nIHlvdXIgc2VhcmNoLlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiAkcGFyZW50LnNlYXJjaFJlcG9ydHMoKSAmJiAgJHBhcmVudC5yZXBvcnRzSW5TZWFyY2goKS5sZW5ndGg+MFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJsaXN0LWdyb3VwXCIgZGF0YS1iaW5kPVwiZm9yZWFjaDogJHBhcmVudC5yZXBvcnRzSW5TZWFyY2hcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0taGVhZGluZ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGRhdGEtYmluZD1cImNoZWNrZWQ6IHNlbGVjdGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhXCIgZGF0YS1iaW5kPVwiY3NzOiB7J2ZhLWZpbGUnOiByZXBvcnRUeXBlPT0nTGlzdCcsICdmYS10aC1saXN0JzogcmVwb3J0VHlwZT09J1N1bW1hcnknLCAnZmEtYmFyLWNoYXJ0JzogcmVwb3J0VHlwZT09J0JhcicsICdmYS1waWUtY2hhcnQnOiByZXBvcnRUeXBlPT0nUGllJywgJ2ZhLWxpbmUtY2hhcnQnOiByZXBvcnRUeXBlPT0nTGluZScsICdmYS1nbG9iZSc6IHJlcG9ydFR5cGUgPT0nTWFwJywgJ2ZhLXdpbmRvdy1yZXN0b3JlJzogcmVwb3J0VHlwZT09J1RyZWVtYXAnLCAnZmEtY29kZSc6IHJlcG9ydFR5cGU9PSdIdG1sJ31cIiBzdHlsZT1cImZvbnQtc2l6ZTogMTRwdDsgY29sb3I6ICM4MDgwODBcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJoaWdobGlnaHRlZFRleHQ6IHsgdGV4dDogcmVwb3J0TmFtZSwgaGlnaGxpZ2h0OiAkcGFyZW50LnNlYXJjaFJlcG9ydHMsIGNzczogJ2hpZ2hsaWdodCcgfVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbS10ZXh0IHNtYWxsXCIgZGF0YS1iaW5kPVwidGV4dDogcmVwb3J0RGVzY3JpcHRpb25cIj48L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiAhJHBhcmVudC5zZWFyY2hSZXBvcnRzKClcIiBjbGFzcz1cImxpc3QtZ3JvdXAgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImZvcmVhY2g6ICRwYXJlbnQucmVwb3J0c0FuZEZvbGRlcnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSByb2xlPVwiYnV0dG9uXCIgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCIgZGF0YS1icy10b2dnbGU9XCJjb2xsYXBzZVwiIGRhdGEtYmluZD1cImF0dHI6IHtocmVmOiAnI2ZvbGRlci0nICsgZm9sZGVySWQgfVwiIHN0eWxlPVwidGV4dC1kZWNvcmF0aW9uOiBub25lOyBmb250LXdlaWdodDogbm9ybWFsO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1mb2xkZXIgbWUtMiB0ZXh0LXNlY29uZGFyeVwiPjwvaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtYmluZD1cInRleHQ6IGZvbGRlclwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2hldnJvbi1kb3duXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sbGFwc2UgbXQtMlwiIGRhdGEtYmluZD1cImF0dHI6IHtpZDogJ2ZvbGRlci0nICsgZm9sZGVySWQgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJsaXN0LWdyb3VwIGxpc3QtZ3JvdXAtZmx1c2hcIiBkYXRhLWJpbmQ9XCJmb3JlYWNoOiByZXBvcnRzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1jaGVja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0XCIgdHlwZT1cImNoZWNrYm94XCIgZGF0YS1iaW5kPVwiY2hlY2tlZDogc2VsZWN0ZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1jaGVjay1sYWJlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYVwiIGRhdGEtYmluZD1cImNzczogeydmYS1maWxlJzogcmVwb3J0VHlwZT09J0xpc3QnLCAnZmEtdGgtbGlzdCc6IHJlcG9ydFR5cGU9PSdTdW1tYXJ5JywgJ2ZhLWJhci1jaGFydCc6IHJlcG9ydFR5cGU9PSdCYXInLCAnZmEtcGllLWNoYXJ0JzogcmVwb3J0VHlwZT09J1BpZScsICdmYS1saW5lLWNoYXJ0JzogcmVwb3J0VHlwZT09J0xpbmUnLCAnZmEtZ2xvYmUnOiByZXBvcnRUeXBlID09J01hcCcsICdmYS13aW5kb3ctcmVzdG9yZSc6IHJlcG9ydFR5cGU9PSdUcmVlbWFwJywgJ2ZhLWNvZGUnOiByZXBvcnRUeXBlPT0nSHRtbCd9XCIgc3R5bGU9XCJmb250LXNpemU6IDE0cHQ7IGNvbG9yOiAjODA4MDgwXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogcmVwb3J0TmFtZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LW11dGVkXCIgZGF0YS1iaW5kPVwidGV4dDogcmVwb3J0RGVzY3JpcHRpb25cIj48L3NtYWxsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIGNhcmQtYm9keSBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGg1PjxpIGNsYXNzPVwiZmEgZmEtaG91cmdsYXNzXCI+PC9pPiZuYnNwO0Nob29zZSBTY2hlZHVsZTwvaDU+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZToge25hbWU6ICdyZXBvcnQtc2NoZWR1bGUnfVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAkcGFyZW50LmFkbWluTW9kZVwiIGNsYXNzPVwiY2FyZCBjYXJkLWJvZHkgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6IHtuYW1lOiAnbWFuYWdlLWFjY2Vzcy10ZW1wbGF0ZScsIGRhdGE6IG1hbmFnZUFjY2Vzc31cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWRhbmdlclwiIGRhdGEtYmluZD1cImNsaWNrOiAkcm9vdC5kZWxldGVEYXNoYm9hcmQsIHZpc2libGU6IElkXCI+RGVsZXRlIERhc2hib2FyZDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiBkYXRhLWJpbmQ9XCJjbGljazogJHJvb3Quc2F2ZURhc2hib2FyZFwiPlNhdmUgRGFzaGJvYXJkPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuXHJcbjxkaXYgY2xhc3M9XCJncmlkLXN0YWNrXCIgZGF0YS1iaW5kPVwiZm9yZWFjaDogcmVwb3J0c1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJncmlkLXN0YWNrLWl0ZW1cIiBkYXRhLWJpbmQ9XCJhdHRyOiB7J2dzLXgnOiB4LCAnZ3MteSc6IHksICdncy13Jzogd2lkdGgsICdncy1oJzogaGVpZ2h0LCAnZ3MtYXV0by1wb3NpdGlvbic6IHRydWUsICdncy1pZCc6IFJlcG9ydElEfVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkXCIgZGF0YS1iaW5kPVwiYXR0cjoge2NsYXNzOiAnY2FyZCAnICsgcGFuZWxTdHlsZSArICcgZ3JpZC1zdGFjay1pdGVtLWNvbnRlbnQnfSwgY3NzOiB7IGV4cGFuZGVkOiBpc0V4cGFuZGVkIH0sIHN0eWxlOiB7IGJvcmRlcjogbm9EYXNoYm9hcmRCb3JkZXJzKCkgPyAnbm9uZScgOiAnJywgJ2JveC1zaGFkb3cnOiBub0Rhc2hib2FyZEJvcmRlcnMoKSA/ICdub25lJyA6ICcnIH1cIiBzdHlsZT1cIm92ZXJmbG93LXk6IGhpZGRlbjtcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBhZGRlZC1kaXZcIiBzdHlsZT1cInBhZGRpbmctYm90dG9tOiAwOyBtYXJnaW4tYm90dG9tOiAwO1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtbGVmdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuXCIgZGF0YS1icy10b2dnbGU9XCJkcm9wZG93blwiIGFyaWEtaGFzcG9wdXA9XCJmYWxzZVwiIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWVsbGlwc2lzLXZcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwiZHJvcGRvd24tbWVudSBzbWFsbFwiIHN0eWxlPVwiei1pbmRleDogMTAwMTtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGRhdGEtYmluZD1cInZpc2libGU6IEZseUZpbHRlcnMoKS5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGRhdGEtYmluZD1cImNsaWNrOiB0b2dnbGVGbHlGaWx0ZXJzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1maWx0ZXJcIj48L3NwYW4+IEZpbHRlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJkcm9wZG93biBkcm9wZG93bi1ob3ZlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cImRyb3Bkb3duLXRvZ2dsZSBkcm9wZG93bi1pdGVtXCIgZGF0YS1icy10b2dnbGU9XCJkcm9wZG93blwiIHJvbGU9XCJidXR0b25cIiBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIiBkYXRhLWJpbmQ9XCJjbGljazogZWRpdFJlcG9ydEFpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1wZW5jaWxcIj48L3NwYW4+IEVkaXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImRyb3Bkb3duLW1lbnUgc21hbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGhyZWY9XCIjXCIgZGF0YS1iaW5kPVwiY2xpY2s6IG9wZW5SZXBvcnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtcGVuY2lsXCI+PC9zcGFuPiBFZGl0IFN0YW5kYXJkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgaHJlZj1cIiNcIiBkYXRhLWJpbmQ9XCJjbGljazogZWRpdFJlcG9ydEFpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWJvbHRcIj48L3NwYW4+IEVkaXQgU21hcnRlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImRyb3Bkb3duIGRyb3Bkb3duLWhvdmVyXCIgZGF0YS1iaW5kPVwidmlzaWJsZTogUmVwb3J0VHlwZSgpIT0nU2luZ2xlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cImRyb3Bkb3duLXRvZ2dsZSBkcm9wZG93bi1pdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1kb3dubG9hZFwiPjwvc3Bhbj4gRXhwb3J0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJkcm9wZG93bi1tZW51IHNtYWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGRhdGEtYmluZD1cImNsaWNrOiBkb3dubG9hZEV4Y2VsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWZpbGUtZXhjZWwtb1wiPjwvc3Bhbj4gRXhjZWxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGRhdGEtYmluZD1cInZpc2libGU6IGNhbkRyaWxsZG93blwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGRhdGEtYmluZD1cImNsaWNrOiBkb3dubG9hZEV4Y2VsV2l0aERyaWxsZG93blwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1maWxlLWV4Y2VsLW9cIj48L3NwYW4+IEV4Y2VsIChFeHBhbmRlZClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGRhdGEtYmluZD1cImNsaWNrOiAkcGFyZW50LmFwcFNldHRpbmdzLnNob3dQYWdlU2l6ZSA/IGZ1bmN0aW9uKCkgeyBsb2FkUGRmTW9kZWwoKSB9IDogZnVuY3Rpb24oKSB7ICRwYXJlbnQuYXBwU2V0dGluZ3MudXNlQWx0UGRmID8gZG93bmxvYWRQZGZBbHQoJycsJycpIDogZG93bmxvYWRQZGYoJycsJycpIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtZmlsZS1wZGYtb1wiPjwvc3Bhbj4gUERGXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBkYXRhLWJpbmQ9XCJjbGljazogJHBhcmVudC5hcHBTZXR0aW5ncy5zaG93UGFnZVNpemUgPyBmdW5jdGlvbigpIHsgbG9hZFdvcmRNb2RlbCgpfSA6IGZ1bmN0aW9uKCkgeyBkb3dubG9hZFdvcmQoJycsJycpOyB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWZpbGUtd29yZC1vXCI+PC9zcGFuPiBXb3JkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGRhdGEtYmluZD1cInZpc2libGU6IFJlcG9ydFR5cGUoKSE9J1NpbmdsZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGRhdGEtYmluZD1cImF0dHI6IHtocmVmOiAnL0RvdE5ldFJlcG9ydD9saW5rZWRyZXBvcnQ9dHJ1ZSZub3BhcmVudD10cnVlJnJlcG9ydElkPScgKyBSZXBvcnRJRCgpIH1cIiB0YXJnZXQ9XCJfYmxhbmtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWZvbGRlci1vcGVuXCI+PC9zcGFuPiBPcGVuIFJlcG9ydFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGkgZGF0YS1iaW5kPVwidmlzaWJsZTogQ2FuRWRpdCgpICYmIENhblNhdmVSZXBvcnRzKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJkcm9wZG93bi1pdGVtXCIgZGF0YS1iaW5kPVwiY2xpY2s6IFNhdmVXaXRob3V0UnVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1zYXZlXCI+PC9zcGFuPiBTYXZlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAkcGFyZW50LmN1cnJlbnREYXNoYm9hcmQoKS5jYW5NYW5hZ2UgfHwgJHBhcmVudC5hZG1pbk1vZGUoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cImRyb3Bkb3duLWl0ZW1cIiBkYXRhLWJpbmQ9XCJjbGljazogZnVuY3Rpb24oKSB7ICRwYXJlbnQucmVtb3ZlUmVwb3J0RnJvbURhc2hib2FyZChSZXBvcnRJRCgpKTsgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtY2xvc2VcIj48L3NwYW4+IFJlbW92ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGRhdGEtYmluZD1cImNsaWNrOiBmdW5jdGlvbigpIHsgUmVmcmVzaFJlcG9ydChSZXBvcnRJRCgpKTsgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtcmVmcmVzaFwiPjwvc3Bhbj4gUmVmcmVzaFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiIGRhdGEtYnMtdG9nZ2xlPVwibW9kYWxcIiBkYXRhLWJzLXRhcmdldD1cIiNzcWxNb2RhbFwiIGRhdGEtYmluZD1cInZpc2libGU6ICRwYXJlbnQuYWRtaW5Nb2RlLCBjbGljazogZ2V0Q29kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtY29kZVwiPjwvc3Bhbj4gUmVwb3J0IENvZGVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxoMiBjbGFzcz1cInB1bGwtbGVmdFwiIGRhdGEtYmluZD1cInRleHQ6IFJlcG9ydE5hbWVcIj48L2gyPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtcmlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiBpc0RpcnR5XCIgY2xhc3M9XCJ0ZXh0LXdhcm5pbmcgc21hbGxcIiB0aXRsZT1cIllvdSBoYXZlIHVuc2F2ZWQgY2hhbmdlc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlXCI+PC9pPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImJ0biBidG4tbGlua1wiIGRhdGEtYmluZD1cInZpc2libGU6IENhbkVkaXQoKSAmJiBDYW5TYXZlUmVwb3J0cygpICYmIGlzRGlydHkoKSwgY2xpY2s6IFNhdmVXaXRob3V0UnVuXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtc2F2ZVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJidG4gYnRuLWxpbmtcIiBkYXRhLWJpbmQ9XCJjbGljazogdG9nZ2xlRXhwYW5kXCI+PHNwYW4gY2xhc3M9XCJmYVwiIGRhdGEtYmluZD1cImNzczogeydmYS1leHBhbmQnOiAhaXNFeHBhbmRlZCgpLCAnZmEtbWludXMnOiBpc0V4cGFuZGVkKCkgfSwgdmlzaWJsZTogUmVwb3J0VHlwZSgpICE9ICdTaW5nbGUnICYmICFub0Rhc2hib2FyZEJvcmRlcnMoKVwiPjwvc3Bhbj48L2E+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwiaWY6IGFjdGl2ZURlc2lnbigpXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiAncmVwb3J0LWRlc2lnbmVyLWNvbXBhY3QnXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IGxpc3Qtb3ZlcmZsb3ctYXV0b1wiIHN0eWxlPVwicGFkZGluZy10b3A6IDA7IG1hcmdpbi10b3A6IDA7XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cImlmOiBSZXBvcnRUeXBlKCkhPSdTaW5nbGUnICYmIFJlcG9ydFR5cGUoKSE9J0h0bWwnICYmIENhbkVkaXQoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdjaGFydC1zZXR0aW5ncycsIGRhdGE6ICRkYXRhXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxwIGRhdGEtYmluZD1cImh0bWw6IFJlcG9ydERlc2NyaXB0aW9uLCB2aXNpYmxlOiBSZXBvcnREZXNjcmlwdGlvblwiPjwvcD5cclxuICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6IHtuYW1lOiAnZmx5LWZpbHRlci10ZW1wbGF0ZSd9LCB2aXNpYmxlOiBzaG93Rmx5RmlsdGVyc1wiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ3aXRoOiBSZXBvcnRSZXN1bHRcIiBjbGFzcz1cInNtYWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBkYXRhLWJpbmQ9XCJ2aXNpYmxlOiAhUmVwb3J0RGF0YSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXBvcnQtc3Bpbm5lclwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6ICdyZXBvcnQtdGVtcGxhdGUnLCBkYXRhOiAkZGF0YVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1pbmxpbmVcIiBkYXRhLWJpbmQ9XCJpZm5vdDogbm9EYXNoYm9hcmRCb3JkZXJzXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic21hbGxcIiBkYXRhLWJpbmQ9XCJ3aXRoOiBwYWdlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHB1bGwtbGVmdCB0b3RhbC1yZWNvcmRzXCIgZGF0YS1iaW5kPVwiaWY6IHRvdGFsUmVjb3JkcygpPjEgJiYgJHBhcmVudC5SZXBvcnRUeXBlKCkgIT0gJ1NpbmdsZSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS1iaW5kPVwidGV4dDogJ1RvdGFsIFJlY29yZHM6ICcgKyB0b3RhbFJlY29yZHMoKVwiPjwvc3Bhbj48YnIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBwdWxsLXJpZ2h0XCIgZGF0YS1iaW5kPVwiaWY6IHBhZ2VzKCk+MSAmJiAkcGFyZW50LlJlcG9ydFR5cGUoKSAhPSAnU2luZ2xlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiAncGFnZXItdGVtcGxhdGUnLCBkYXRhOiAkZGF0YVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjbGVhcmZpeFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjwhLS0gUmVwb3J0IEJ1aWxkZXIgLS0+XHJcbjxkaXYgY2xhc3M9XCJtb2RhbCBtb2RhbC1mdWxsc2NyZWVuXCIgaWQ9XCJtb2RhbC1yZXBvcnRidWlsZGVyXCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbGFiZWxsZWRieT1cIm15TW9kYWxMYWJlbFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIHN0eWxlPVwicGFkZGluZy1yaWdodDogMHB4ICFpbXBvcnRhbnQ7XCIgZGF0YS1iaW5kPVwid2l0aDogc2VsZWN0ZWRSZXBvcnRcIj5cclxuICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6IHtuYW1lOiAncmVwb3J0LWRlc2lnbmVyJywgZGF0YTogJGRhdGF9XCI+PC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPCEtLSBGaWVsZCBPcHRpb25zIE1vZGFsIC0tPlxyXG48ZGl2IGNsYXNzPVwibW9kYWxcIiBpZD1cImZpZWxkT3B0aW9uc01vZGFsXCIgdGFiaW5kZXg9XCItMVwiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLWhpZGRlbj1cInRydWVcIiBkYXRhLWJpbmQ9XCJ3aXRoOiBzZWxlY3RlZFJlcG9ydFwiPlxyXG4gICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZToge25hbWU6ICdyZXBvcnQtZmllbGQtb3B0aW9ucycsIGRhdGE6ICRkYXRhfVwiPjwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjwhLS0gTGluayBFZGl0IE1vZGFsIC0tPlxyXG48ZGl2IGNsYXNzPVwibW9kYWxcIiBpZD1cImxpbmtNb2RhbFwiIHRhYmluZGV4PVwiLTFcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgZGF0YS1iaW5kPVwid2l0aDogc2VsZWN0ZWRSZXBvcnRcIj5cclxuICAgIDxkaXYgZGF0YS1iaW5kPVwidGVtcGxhdGU6IHtuYW1lOiAncmVwb3J0LWxpbmstZWRpdCcsIGRhdGE6ICRkYXRhfVwiPjwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjwhLS0gVGhpcyByZW5kZXJzIHRoZSB0ZW1wbGF0ZSAtLT5cclxuPGRpdiBjbGFzcz1cIm1vZGFsXCIgaWQ9XCJwZGZPcHRpb25zU2NoZWR1bGVNb2RhbFwiIHRhYmluZGV4PVwiLTFcIiBhcmlhLWxhYmVsbGVkYnk9XCJwZGZPcHRpb25zU2NoZWR1bGVNb2RhbExhYmVsXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgZGF0YS1iaW5kPVwid2l0aDogZGFzaGJvYXJkXCI+XHJcbiAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiB7IG5hbWU6ICdwZGYtb3B0aW9ucy1zY2hlZHVsZS10ZW1wbGF0ZScsIGRhdGE6ICRkYXRhICB9XCI+PC9kaXY+XHJcbjwvZGl2PlxyXG48IS0tIFRoaXMgcmVuZGVycyB0aGUgdGVtcGxhdGUgLS0+XHJcbjxkaXYgY2xhc3M9XCJtb2RhbFwiIGlkPVwid29yZE9wdGlvbnNTY2hlZHVsZU1vZGFsXCIgdGFiaW5kZXg9XCItMVwiIGFyaWEtbGFiZWxsZWRieT1cIndvcmRPcHRpb25zU2NoZWR1bGVNb2RhbExhYmVsXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgZGF0YS1iaW5kPVwid2l0aDogZGFzaGJvYXJkXCI+XHJcbiAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiB7IG5hbWU6ICd3b3JkLW9wdGlvbnMtc2NoZWR1bGUtdGVtcGxhdGUnLCBkYXRhOiAkZGF0YSB9XCI+PC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPGRpdiBjbGFzcz1cIm1vZGFsXCIgaWQ9XCJ3b3JkT3B0aW9uc01vZGFsXCIgdGFiaW5kZXg9XCItMVwiIGFyaWEtbGFiZWxsZWRieT1cIndvcmRPcHRpb25zTW9kYWxMYWJlbFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGRhdGEtYmluZD1cIndpdGg6IHNlbGVjdGVkUmVwb3J0XCI+XHJcbiAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiB7IG5hbWU6ICd3b3JkLW9wdGlvbnMtdGVtcGxhdGUnLCBkYXRhOiAkZGF0YSAgfVwiPjwvZGl2PlxyXG48L2Rpdj5cclxuPGRpdiBjbGFzcz1cIm1vZGFsXCIgaWQ9XCJwZGZPcHRpb25zTW9kYWxcIiB0YWJpbmRleD1cIi0xXCIgYXJpYS1sYWJlbGxlZGJ5PVwicGRmT3B0aW9uc01vZGFsTGFiZWxcIiBhcmlhLWhpZGRlbj1cInRydWVcIiBkYXRhLWJpbmQ9XCJ3aXRoOiBzZWxlY3RlZFJlcG9ydFwiPlxyXG4gICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogeyBuYW1lOiAncGRmLW9wdGlvbnMtdGVtcGxhdGUnLCBkYXRhOiAkZGF0YSAgfVwiPjwvZGl2PlxyXG48L2Rpdj5cclxuPGRpdiBjbGFzcz1cIm1vZGFsXCIgaWQ9XCJleHBvcnRBbGxXb3JkT3B0aW9uc01vZGFsXCIgdGFiaW5kZXg9XCItMVwiIGFyaWEtbGFiZWxsZWRieT1cImV4cG9ydEFsbFdvcmRPcHRpb25zTW9kYWxMYWJlbFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGRhdGEtYmluZD1cIndpdGg6IGRhc2hib2FyZFwiPlxyXG4gICAgPGRpdiBkYXRhLWJpbmQ9XCJ0ZW1wbGF0ZTogeyBuYW1lOiAnd29yZC1vcHRpb25zLXRlbXBsYXRlJywgZGF0YTogJGRhdGEgIH1cIj48L2Rpdj5cclxuPC9kaXY+XHJcbjxkaXYgY2xhc3M9XCJtb2RhbFwiIGlkPVwiZXhwb3J0QWxsUGRmT3B0aW9uc01vZGFsXCIgdGFiaW5kZXg9XCItMVwiIGFyaWEtbGFiZWxsZWRieT1cImV4cG9ydEFsbFBkZk9wdGlvbnNNb2RhbExhYmVsXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgZGF0YS1iaW5kPVwid2l0aDogZGFzaGJvYXJkXCI+XHJcbiAgICA8ZGl2IGRhdGEtYmluZD1cInRlbXBsYXRlOiB7IG5hbWU6ICdwZGYtb3B0aW9ucy10ZW1wbGF0ZScsIGRhdGE6ICRkYXRhICB9XCI+PC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPCEtLSBUZW1wbGF0ZXMgLS0+XHJcbjxkaXYgW2lubmVySHRtbF09XCJyZXBvcnRUZW1wbGF0ZXNcIj48L2Rpdj5cclxuPCEtLSBUZW1wbGF0ZXMgLS0+XHJcblxyXG48L2Rpdj4iXX0=