@yibozhang/pro-table 0.1.4 → 11.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/yibozhang-pro-table.umd.js +3592 -3588
- package/bundles/yibozhang-pro-table.umd.js.map +1 -1
- package/bundles/yibozhang-pro-table.umd.min.js +1 -1
- package/bundles/yibozhang-pro-table.umd.min.js.map +1 -1
- package/esm2015/lib/components/colmuns-setting/colmuns-setting.component.js +2 -2
- package/esm2015/lib/components/dynamic-search-field/dynamic-search-field.component.js +1 -1
- package/esm2015/lib/constants.js +1 -1
- package/esm2015/lib/directives/trim-input.directive.js +1 -1
- package/esm2015/lib/directives/trim-input.module.js +1 -1
- package/esm2015/lib/page-container/page-container.component.js +2 -2
- package/esm2015/lib/page-container/page-container.module.js +1 -1
- package/esm2015/lib/page-public/antd-form.js +1 -1
- package/esm2015/lib/page-public/array-form.js +1 -1
- package/esm2015/lib/plate-input/plate-input.component.js +2 -2
- package/esm2015/lib/plate-input/plate-input.module.js +1 -1
- package/esm2015/lib/plate-input/plate-prefix-load.service.js +1 -1
- package/esm2015/lib/pro-table.component.js +98 -93
- package/esm2015/lib/pro-table.module.js +1 -1
- package/esm2015/lib/table-search-bar/table-search-bar-module.js +1 -1
- package/esm2015/lib/table-search-bar/table-search-bar.component.js +2 -2
- package/esm2015/lib/tokens.js +1 -1
- package/esm2015/lib/type.js +1 -1
- package/esm2015/lib/utils/modal-width-detector.js +3 -3
- package/esm2015/public-api.js +7 -3
- package/esm2015/yibozhang-pro-table.js +3 -7
- package/fesm2015/yibozhang-pro-table.js +107 -102
- package/fesm2015/yibozhang-pro-table.js.map +1 -1
- package/lib/components/colmuns-setting/colmuns-setting.component.d.ts.map +1 -1
- package/lib/components/colmuns-setting/colmuns-setting.component.less.shim.ngstyle.d.ts.map +1 -1
- package/lib/components/colmuns-setting/colmuns-setting.component.ngfactory.d.ts.map +1 -1
- package/lib/components/dynamic-search-field/dynamic-search-field.component.d.ts.map +1 -1
- package/lib/components/dynamic-search-field/dynamic-search-field.component.ngfactory.d.ts.map +1 -1
- package/lib/constants.d.ts.map +1 -1
- package/lib/directives/trim-input.directive.d.ts.map +1 -1
- package/lib/directives/trim-input.directive.ngfactory.d.ts.map +1 -1
- package/lib/directives/trim-input.module.d.ts.map +1 -1
- package/lib/directives/trim-input.module.ngfactory.d.ts.map +1 -1
- package/lib/page-container/page-container.component.d.ts.map +1 -1
- package/lib/page-container/page-container.component.less.shim.ngstyle.d.ts.map +1 -1
- package/lib/page-container/page-container.component.ngfactory.d.ts.map +1 -1
- package/lib/page-container/page-container.module.d.ts.map +1 -1
- package/lib/page-container/page-container.module.ngfactory.d.ts.map +1 -1
- package/lib/page-public/antd-form.d.ts.map +1 -1
- package/lib/page-public/antd-form.ngfactory.d.ts.map +1 -1
- package/lib/page-public/array-form.d.ts.map +1 -1
- package/lib/page-public/array-form.ngfactory.d.ts.map +1 -1
- package/lib/plate-input/plate-input.component.d.ts.map +1 -1
- package/lib/plate-input/plate-input.component.less.shim.ngstyle.d.ts.map +1 -1
- package/lib/plate-input/plate-input.component.ngfactory.d.ts.map +1 -1
- package/lib/plate-input/plate-input.module.d.ts.map +1 -1
- package/lib/plate-input/plate-input.module.ngfactory.d.ts.map +1 -1
- package/lib/plate-input/plate-prefix-load.service.d.ts.map +1 -1
- package/lib/plate-input/plate-prefix-load.service.ngfactory.d.ts.map +1 -1
- package/lib/pro-table.component.d.ts +1 -4
- package/lib/pro-table.component.d.ts.map +1 -1
- package/lib/pro-table.component.less.shim.ngstyle.d.ts.map +1 -1
- package/lib/pro-table.component.ngfactory.d.ts.map +1 -1
- package/lib/pro-table.module.d.ts.map +1 -1
- package/lib/pro-table.module.ngfactory.d.ts.map +1 -1
- package/lib/table-search-bar/table-search-bar-module.d.ts.map +1 -1
- package/lib/table-search-bar/table-search-bar-module.ngfactory.d.ts.map +1 -1
- package/lib/table-search-bar/table-search-bar.component.d.ts.map +1 -1
- package/lib/table-search-bar/table-search-bar.component.less.shim.ngstyle.d.ts.map +1 -1
- package/lib/table-search-bar/table-search-bar.component.ngfactory.d.ts.map +1 -1
- package/lib/tokens.d.ts.map +1 -1
- package/lib/type.d.ts.map +1 -1
- package/lib/utils/modal-width-detector.d.ts +5 -0
- package/lib/utils/modal-width-detector.d.ts.map +1 -1
- package/package.json +10 -10
- package/public-api.d.ts +5 -1
- package/public-api.d.ts.map +1 -1
- package/src/lib/styles/custom-antd.less +4 -4
- package/yibozhang-pro-table.d.ts +2 -6
- package/yibozhang-pro-table.d.ts.map +1 -1
- package/yibozhang-pro-table.metadata.json +1 -1
|
@@ -42,8 +42,6 @@ export class ProTableComponent {
|
|
|
42
42
|
this.onValuesChange = new EventEmitter();
|
|
43
43
|
this.onResetFormBeforeReload = new EventEmitter();
|
|
44
44
|
this._savedSearchParams = {};
|
|
45
|
-
// 存储模板映射关系 - 通过字符串名称映射到模板引用
|
|
46
|
-
this.templateMap = new Map();
|
|
47
45
|
// 存储所有自定义模板的引用
|
|
48
46
|
this.customTemplates = new Map();
|
|
49
47
|
// 记录各列排序状态:'ascend' | 'descend' | null
|
|
@@ -128,6 +126,7 @@ export class ProTableComponent {
|
|
|
128
126
|
}
|
|
129
127
|
ngAfterContentInit() {
|
|
130
128
|
// 自动注册所有自定义模板
|
|
129
|
+
// 注意:此时所有 ContentChild 和 ContentChildren 都已初始化完成
|
|
131
130
|
this.autoRegisterTemplates();
|
|
132
131
|
}
|
|
133
132
|
preCheckServerColumns() {
|
|
@@ -217,73 +216,109 @@ export class ProTableComponent {
|
|
|
217
216
|
}
|
|
218
217
|
// 自动注册模板的方法
|
|
219
218
|
autoRegisterTemplates() {
|
|
219
|
+
// 获取所有模板
|
|
220
|
+
const allTemplatesArray = this.allTemplates.toArray();
|
|
220
221
|
// 获取所有需要自定义模板的列
|
|
221
222
|
const columnsWithCustomRender = this._columns.filter((col) => col.customRender);
|
|
222
|
-
if (columnsWithCustomRender.length > 0) {
|
|
223
|
-
// 尝试从ContentChildren中查找对应的模板
|
|
224
|
-
columnsWithCustomRender.forEach((column) => {
|
|
225
|
-
const templateName = column.customRender;
|
|
226
|
-
const template = this.findTemplateByName(templateName);
|
|
227
|
-
if (template) {
|
|
228
|
-
this.customTemplates.set(templateName, template);
|
|
229
|
-
}
|
|
230
|
-
else {
|
|
231
|
-
}
|
|
232
|
-
});
|
|
233
|
-
}
|
|
234
223
|
// 获取所有需要自定义label模板的列(使用原始columns,确保顺序正确)
|
|
235
224
|
const columnsWithCustomLabel = this.columns.filter((col) => col.customLabelRender);
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
}
|
|
225
|
+
// 计算需要的模板总数
|
|
226
|
+
const customRenderCount = columnsWithCustomRender.length;
|
|
227
|
+
const totalNeededTemplates = customRenderCount + columnsWithCustomLabel.length;
|
|
228
|
+
// 识别并排除特殊模板(actionBar 和 imgActionBar)
|
|
229
|
+
const specialTemplateIndices = new Set();
|
|
230
|
+
// 尝试找到 actionBarTpl 在 allTemplatesArray 中的位置
|
|
231
|
+
if (this.actionBarTpl) {
|
|
232
|
+
const actionBarIndex = this.findTemplateIndex(allTemplatesArray, this.actionBarTpl);
|
|
233
|
+
if (actionBarIndex !== -1) {
|
|
234
|
+
specialTemplateIndices.add(actionBarIndex);
|
|
235
|
+
}
|
|
247
236
|
}
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
// 从ContentChildren中查找指定名称的模板
|
|
254
|
-
getTemplateFromContent(templateName) {
|
|
255
|
-
const customRenderColumns = this._columns.filter((col) => col.customRender);
|
|
256
|
-
const templateIndex = customRenderColumns.findIndex((col) => col.customRender === templateName);
|
|
257
|
-
if (templateIndex >= 0) {
|
|
258
|
-
// 获取所有模板,并过滤掉特殊模板(actionBar和ImgActionBar)
|
|
259
|
-
// 这样可以避免因为特殊模板的位置导致索引计算错误
|
|
260
|
-
const templates = this.allTemplates.toArray();
|
|
261
|
-
const customTemplates = templates.filter((tpl) => tpl !== this.actionBarTpl && tpl !== this.imgActionBarTpl);
|
|
262
|
-
if (templateIndex < customTemplates.length) {
|
|
263
|
-
const template = customTemplates[templateIndex];
|
|
264
|
-
return template;
|
|
237
|
+
// 尝试找到 imgActionBarTpl 在 allTemplatesArray 中的位置
|
|
238
|
+
if (this.imgActionBarTpl) {
|
|
239
|
+
const imgActionBarIndex = this.findTemplateIndex(allTemplatesArray, this.imgActionBarTpl);
|
|
240
|
+
if (imgActionBarIndex !== -1) {
|
|
241
|
+
specialTemplateIndices.add(imgActionBarIndex);
|
|
265
242
|
}
|
|
266
243
|
}
|
|
267
|
-
|
|
268
|
-
|
|
244
|
+
// 如果无法通过引用找到特殊模板,使用备用策略
|
|
245
|
+
// 备用策略:假设最后的模板是特殊模板
|
|
246
|
+
const specialTemplateCount = (this.actionBarTpl ? 1 : 0) + (this.imgActionBarTpl ? 1 : 0);
|
|
247
|
+
if (specialTemplateIndices.size === 0 && specialTemplateCount > 0) {
|
|
248
|
+
for (let i = allTemplatesArray.length - specialTemplateCount; i < allTemplatesArray.length; i++) {
|
|
249
|
+
specialTemplateIndices.add(i);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
// 提取列模板(排除特殊模板)
|
|
253
|
+
const columnTemplates = [];
|
|
254
|
+
allTemplatesArray.forEach((tpl, index) => {
|
|
255
|
+
if (!specialTemplateIndices.has(index)) {
|
|
256
|
+
columnTemplates.push(tpl);
|
|
257
|
+
}
|
|
258
|
+
});
|
|
259
|
+
// 验证模板数量
|
|
260
|
+
if (columnTemplates.length !== totalNeededTemplates) {
|
|
261
|
+
console.warn(`ProTable: 模板数量不匹配!需要 ${totalNeededTemplates} 个列模板,实际有 ${columnTemplates.length} 个。请检查 customRender 和 customLabelRender 配置。`);
|
|
262
|
+
}
|
|
263
|
+
// 注册自定义渲染模板
|
|
264
|
+
columnsWithCustomRender.forEach((column, index) => {
|
|
265
|
+
const templateName = column.customRender;
|
|
266
|
+
if (index < columnTemplates.length) {
|
|
267
|
+
this.customTemplates.set(templateName, columnTemplates[index]);
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
console.error(`ProTable: 未找到模板 "${templateName}",索引 ${index} 超出范围`);
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
// 注册自定义label模板(从 customRenderCount 之后开始)
|
|
274
|
+
columnsWithCustomLabel.forEach((column, index) => {
|
|
275
|
+
const templateName = column.customLabelRender;
|
|
276
|
+
const templateIndex = customRenderCount + index;
|
|
277
|
+
if (templateIndex < columnTemplates.length) {
|
|
278
|
+
this.customTemplates.set(templateName, columnTemplates[templateIndex]);
|
|
279
|
+
}
|
|
280
|
+
else {
|
|
281
|
+
console.error(`ProTable: 未找到label模板 "${templateName}",索引 ${templateIndex} 超出范围`);
|
|
282
|
+
}
|
|
283
|
+
});
|
|
269
284
|
}
|
|
270
|
-
//
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
const
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
285
|
+
// 尝试在数组中找到模板的索引(使用多种比较方式)
|
|
286
|
+
findTemplateIndex(templates, target) {
|
|
287
|
+
// 方法1:引用相等性
|
|
288
|
+
let index = templates.indexOf(target);
|
|
289
|
+
if (index !== -1)
|
|
290
|
+
return index;
|
|
291
|
+
// 方法2:通过 elementRef 比较
|
|
292
|
+
try {
|
|
293
|
+
const targetElementRef = target.elementRef;
|
|
294
|
+
if (targetElementRef) {
|
|
295
|
+
for (let i = 0; i < templates.length; i++) {
|
|
296
|
+
const tplElementRef = templates[i].elementRef;
|
|
297
|
+
if (tplElementRef === targetElementRef) {
|
|
298
|
+
return i;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
catch (e) {
|
|
304
|
+
// 忽略错误
|
|
305
|
+
}
|
|
306
|
+
// 方法3:通过 Angular 内部属性比较
|
|
307
|
+
try {
|
|
308
|
+
const targetContainer = target._declarationTContainer;
|
|
309
|
+
if (targetContainer) {
|
|
310
|
+
for (let i = 0; i < templates.length; i++) {
|
|
311
|
+
const tplContainer = templates[i]._declarationTContainer;
|
|
312
|
+
if (tplContainer === targetContainer) {
|
|
313
|
+
return i;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
283
316
|
}
|
|
284
317
|
}
|
|
285
|
-
|
|
286
|
-
|
|
318
|
+
catch (e) {
|
|
319
|
+
// 忽略错误
|
|
320
|
+
}
|
|
321
|
+
return -1;
|
|
287
322
|
}
|
|
288
323
|
// 设置筛选表单默认属性
|
|
289
324
|
setSearchFormDefaultProp(columns) {
|
|
@@ -604,22 +639,7 @@ export class ProTableComponent {
|
|
|
604
639
|
getTemplate(name) {
|
|
605
640
|
if (!name)
|
|
606
641
|
return null;
|
|
607
|
-
|
|
608
|
-
// 首先从自定义模板中查找
|
|
609
|
-
const customTemplate = this.customTemplates.get(name);
|
|
610
|
-
if (customTemplate) {
|
|
611
|
-
return customTemplate;
|
|
612
|
-
}
|
|
613
|
-
// 然后从通用模板映射中查找
|
|
614
|
-
const template = this.templateMap.get(name);
|
|
615
|
-
if (template) {
|
|
616
|
-
return template;
|
|
617
|
-
}
|
|
618
|
-
return null;
|
|
619
|
-
}
|
|
620
|
-
catch (error) {
|
|
621
|
-
return null;
|
|
622
|
-
}
|
|
642
|
+
return this.customTemplates.get(name) || null;
|
|
623
643
|
}
|
|
624
644
|
getToolTipTextValue(column, data) {
|
|
625
645
|
const key = column.customRender && this.getTemplate(column.customRender)
|
|
@@ -1043,22 +1063,7 @@ export class ProTableComponent {
|
|
|
1043
1063
|
getLabelTemplate(name) {
|
|
1044
1064
|
if (!name)
|
|
1045
1065
|
return null;
|
|
1046
|
-
|
|
1047
|
-
// 首先从自定义模板中查找
|
|
1048
|
-
const customTemplate = this.customTemplates.get(name);
|
|
1049
|
-
if (customTemplate) {
|
|
1050
|
-
return customTemplate;
|
|
1051
|
-
}
|
|
1052
|
-
// 然后从通用模板映射中查找
|
|
1053
|
-
const template = this.templateMap.get(name);
|
|
1054
|
-
if (template) {
|
|
1055
|
-
return template;
|
|
1056
|
-
}
|
|
1057
|
-
return null;
|
|
1058
|
-
}
|
|
1059
|
-
catch (error) {
|
|
1060
|
-
return null;
|
|
1061
|
-
}
|
|
1066
|
+
return this.customTemplates.get(name) || null;
|
|
1062
1067
|
}
|
|
1063
1068
|
// 获取 form-item 的动态类名
|
|
1064
1069
|
getFormItemClassName(column) {
|
|
@@ -1070,7 +1075,7 @@ ProTableComponent.decorators = [
|
|
|
1070
1075
|
{ type: Component, args: [{
|
|
1071
1076
|
selector: "app-pro-table",
|
|
1072
1077
|
template: "<app-page-container\r\n [title]=\"title\"\r\n [showHeader]=\"showSearchBar\"\r\n ngClass=\"pro-table-container\"\r\n>\r\n <ng-template #header>\r\n <app-table-search-bar\r\n *ngIf=\"showSearchBar\"\r\n [labelWidth]=\"labelWidth\"\r\n [labelAlign]=\"labelAlign\"\r\n [formItemWidth]=\"formItemWidth\"\r\n >\r\n <ng-template #leftContent>\r\n <nz-form-item\r\n *ngFor=\"let column of _searchFiledColumns\"\r\n [ngClass]=\"getFormItemClassName(column)\"\r\n >\r\n <nz-form-label *ngIf=\"!getFieldProps(column).hideLabel\" nzNoColon>\r\n <!-- \u68C0\u67E5\u662F\u5426\u6709\u81EA\u5B9A\u4E49label\u6A21\u677F -->\r\n <ng-container\r\n *ngIf=\"\r\n column.customLabelRender &&\r\n getLabelTemplate(column.customLabelRender);\r\n else defaultLabel\r\n \"\r\n >\r\n <ng-container\r\n [ngTemplateOutlet]=\"getLabelTemplate(column.customLabelRender)\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: column,\r\n column: column,\r\n fieldProps: getFieldProps(column)\r\n }\"\r\n >\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #defaultLabel>\r\n {{ getFieldProps(column).label || column.title }}\r\n </ng-template>\r\n </nz-form-label>\r\n <nz-form-control *ngIf=\"column.valueType === 'input'\">\r\n <input\r\n nz-input\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [placeholder]=\"getFieldProps(column).placeHolder\"\r\n [disabled]=\"getFieldProps(column).disabled\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n />\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'inputPlate'\">\r\n <app-plate-input\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n ></app-plate-input>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'select'\">\r\n <nz-select\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzAllowClear]=\"getFieldProps(column).allowClear\"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [nzOptions]=\"getFieldProps(column).options\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n >\r\n </nz-select>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'selectMultiple'\">\r\n <nz-select\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzAllowClear]=\"getFieldProps(column).allowClear\"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [name]=\"getFieldProps(column).name || column.prop\"\r\n [nzOptions]=\"getFieldProps(column).options\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n nzMode=\"multiple\"\r\n >\r\n </nz-select>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'date'\">\r\n <nz-date-picker\r\n [nzShowTime]=\"getFieldProps(column).showTime\"\r\n [nzFormat]=\"getFieldProps(column).format\"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [nzAllowClear]=\"getFieldProps(column).allowClear\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzMode]=\"getFieldProps(column).mode\"\r\n ></nz-date-picker>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'checkbox'\">\r\n <nz-checkbox-group\r\n [class]=\"\r\n getFieldProps(column).noStyle\r\n ? 'pro-table-checkboxgroup-nostyle'\r\n : ''\r\n \"\r\n [(ngModel)]=\"getFieldProps(column).options\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n (ngModelChange)=\"\r\n handleFieldCheckBoxChange(\r\n $event,\r\n getFieldProps(column).name || column.prop\r\n )\r\n \"\r\n ></nz-checkbox-group>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'autoComplete'\">\r\n <input\r\n nz-input\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column)?.name || column.prop]\r\n \"\r\n (input)=\"handleAutoCompleteInput($event, column)\"\r\n [nzAutocomplete]=\"auto\"\r\n [disabled]=\"getFieldProps(column)?.disabled\"\r\n [placeholder]=\"getFieldProps(column)?.placeHolder\"\r\n />\r\n <nz-autocomplete\r\n [nzBackfill]=\"getFieldProps(column).backFill\"\r\n [nzDefaultActiveFirstOption]=\"\r\n getFieldProps(column).defaultActiveFirstOption\r\n \"\r\n [nzWidth]=\"getFieldProps(column).width\"\r\n #auto\r\n >\r\n <nz-auto-option\r\n *ngFor=\"let option of getAutoCompleteDataSource(column)\"\r\n [nzValue]=\"\r\n getFieldProps(column).returnFullData ? option : option.value\r\n \"\r\n [nzLabel]=\"option.label\"\r\n [nzDisabled]=\"option.disabled\"\r\n >\r\n {{ option.label }}\r\n </nz-auto-option>\r\n </nz-autocomplete>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'custom'\">\r\n <app-dynamic-search-field\r\n [component]=\"getFieldProps(column).component\"\r\n [value]=\"_searchParams[getFieldProps(column).name || column.prop]\"\r\n [props]=\"getFieldProps(column)\"\r\n (valueChange)=\"\r\n setFieldValue(getFieldProps(column).name || column.prop, $event)\r\n \"\r\n ></app-dynamic-search-field>\r\n </nz-form-control>\r\n <nz-form-control *ngIf=\"column.valueType === 'inputNumber'\">\r\n <nz-input-number\r\n [style.width]=\"'100%'\"\r\n [(ngModel)]=\"\r\n _searchParams[getFieldProps(column).name || column.prop]\r\n \"\r\n [nzPlaceHolder]=\"getFieldProps(column).placeHolder\"\r\n [nzDisabled]=\"getFieldProps(column).disabled\"\r\n [nzFormatter]=\"getFieldProps(column).formatterPercent\"\r\n [nzParser]=\"getFieldProps(column).parserPercent\"\r\n ></nz-input-number>\r\n </nz-form-control>\r\n </nz-form-item>\r\n </ng-template>\r\n <ng-template #actionTextBtn>\r\n <nz-space [nzSize]=\"4\">\r\n <nz-space-item *ngIf=\"showSearchBtn\">\r\n <button nz-button nzType=\"primary\" (click)=\"handleSearch()\">\r\n {{ confirmBtnText }}\r\n </button>\r\n </nz-space-item>\r\n <nz-space-item *ngIf=\"showClearBtn\">\r\n <button nz-button (click)=\"handleResetForm()\">\r\n {{ clearBtnText }}\r\n </button>\r\n </nz-space-item>\r\n </nz-space>\r\n </ng-template>\r\n <ng-template #actionImgBtn>\r\n <nz-space>\r\n <ng-container *ngTemplateOutlet=\"imgActionBarTpl\"></ng-container>\r\n <nz-space-item class=\"setting-space-item\" *ngIf=\"showColumnSetting\">\r\n <span nz-tooltip nzTooltipTitle=\"\u8BBE\u7F6E\u5B57\u6BB5\">\r\n <app-colmuns-setting\r\n [columns]=\"columns\"\r\n [selectedColumns]=\"_serverColumns\"\r\n [tableName]=\"tableName\"\r\n (afterConfirm)=\"handleColumnsSettingConfirm()\"\r\n ></app-colmuns-setting>\r\n </span>\r\n </nz-space-item>\r\n </nz-space>\r\n </ng-template>\r\n </app-table-search-bar>\r\n </ng-template>\r\n\r\n <ng-template #body>\r\n <div class=\"mb-4\">\r\n <ng-container *ngIf=\"showActionBar\">\r\n <ng-container *ngTemplateOutlet=\"actionBarTpl\"></ng-container>\r\n </ng-container>\r\n </div>\r\n <ng-container *ngIf=\"customTableRender\">\r\n <ng-container *ngTemplateOutlet=\"customTableRender\"></ng-container>\r\n </ng-container>\r\n <nz-table\r\n *ngIf=\"!customTableRender\"\r\n #dynamicTable\r\n nzSize=\"small\"\r\n nzShowSizeChanger\r\n [nzBordered]=\"bordered\"\r\n [nzOuterBordered]=\"outerBordered\"\r\n [nzData]=\"dataSource\"\r\n [nzPageIndex]=\"_pageInfo.pageIndex\"\r\n [nzPageSize]=\"_pageInfo.pageSize\"\r\n [nzTotal]=\"_pageInfo.total\"\r\n [nzPageSizeOptions]=\"_pageInfo.pageSizeOptions\"\r\n [nzShowPagination]=\"showPagination\"\r\n [nzShowTotal]=\"totalTemplate\"\r\n [nzLoading]=\"_loading\"\r\n [nzFrontPagination]=\"frontPagination\"\r\n [nzScroll]=\"scroll\"\r\n (nzPageIndexChange)=\"handlePageIndexChange($event)\"\r\n (nzPageSizeChange)=\"handlePageSizeChange($event)\"\r\n >\r\n <thead>\r\n <tr>\r\n <!-- \u590D\u9009\u6846\u5217\uFF08\u5F53 showCheckbox=true \u65F6\u663E\u793A\uFF09 -->\r\n <th\r\n *ngIf=\"showCheckbox\"\r\n [nzWidth]=\"'50px'\"\r\n [nzAlign]=\"'center'\"\r\n style=\"text-align: center\"\r\n [(nzChecked)]=\"_checkedAll\"\r\n [nzIndeterminate]=\"_indeterminate\"\r\n (nzCheckedChange)=\"toggleCheckAll($event)\"\r\n (click)=\"$event.stopPropagation()\"\r\n ></th>\r\n <th\r\n *ngFor=\"let column of _columns\"\r\n [nzWidth]=\"column.width\"\r\n [nzAlign]=\"column.align\"\r\n [nzLeft]=\"column.fixedLeft\"\r\n [nzRight]=\"column.fixedRight\"\r\n [nzShowSort]=\"!!column.sorter\"\r\n [nzSortOrder]=\"getSortOrder(column.prop)\"\r\n (nzSortOrderChange)=\"onSortChange(column.prop, $event)\"\r\n >\r\n {{ column.title }}\r\n </th>\r\n </tr>\r\n </thead>\r\n\r\n <tbody>\r\n <tr\r\n style=\"cursor: pointer\"\r\n *ngFor=\"let data; let i = index; of: dynamicTable.data\"\r\n [ngClass]=\"{\r\n 'ant-table-custom-row-selected': !!getTableRowChecked(data),\r\n 'ant-table-custom-row-even': i % 2 === 0,\r\n 'ant-table-custom-row-odd': i % 2 !== 0\r\n }\"\r\n (click)=\"handleTableRowClick(data)\"\r\n (dblclick)=\"handleTableRowDbClick(data)\"\r\n >\r\n <!-- \u590D\u9009\u6846\u5217\uFF08\u5F53 showCheckbox=true \u65F6\u663E\u793A\uFF09 -->\r\n <td\r\n *ngIf=\"showCheckbox\"\r\n [nzAlign]=\"'center'\"\r\n style=\"text-align: center; width: 50px\"\r\n [(nzChecked)]=\"data.checked\"\r\n [nzDisabled]=\"isRowDisabled(data)\"\r\n (nzCheckedChange)=\"handleRowCheckedChange(data, $event)\"\r\n (click)=\"$event.stopPropagation()\"\r\n ></td>\r\n <td\r\n *ngFor=\"let column of _columns\"\r\n [nzLeft]=\"column.fixedLeft\"\r\n [nzRight]=\"column.fixedRight\"\r\n [nzAlign]=\"column.align\"\r\n [ngClass]=\"{\r\n 'pro-nowrap': true\r\n }\"\r\n >\r\n <!-- \u68C0\u67E5\u662F\u5426\u6709\u81EA\u5B9A\u4E49\u6A21\u677F -->\r\n <ng-container\r\n *ngIf=\"\r\n column.customRender && getTemplate(column.customRender);\r\n let template\r\n \"\r\n >\r\n <ng-template\r\n [ngTemplateOutlet]=\"template\"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: data,\r\n data: data,\r\n column: column,\r\n index: i,\r\n pageInfo: _pageInfo\r\n }\"\r\n >\r\n </ng-template>\r\n </ng-container>\r\n\r\n <!-- \u9ED8\u8BA4\u6E32\u67D3\u903B\u8F91 -->\r\n <ng-container\r\n *ngIf=\"!column.customRender || !getTemplate(column.customRender)\"\r\n >\r\n <ng-container *ngIf=\"column.ellipsis\">\r\n <div\r\n class=\"pro-ellipsis\"\r\n [title]=\"data[column.prop]\"\r\n [ngStyle]=\"{\r\n width: 'calc(' + column.width + ' - 25px)'\r\n }\"\r\n >\r\n {{ data[column.prop] }}\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!column.ellipsis\">\r\n {{ data[column.prop] }}\r\n </ng-container>\r\n </ng-container>\r\n </td>\r\n </tr>\r\n <tr *ngIf=\"summaryData && _pageInfo.total > 0\">\r\n <!-- \u6C47\u603B\u884C\u7684\u590D\u9009\u6846\u5217\uFF08\u5F53 showCheckbox=true \u65F6\u663E\u793A\uFF0C\u4F46\u4E3A\u7A7A\uFF09 -->\r\n <td\r\n *ngIf=\"showCheckbox\"\r\n style=\"font-weight: bold; border-right: 1px solid #e8e8e8\"\r\n ></td>\r\n <td\r\n *ngFor=\"let column; let i = index; of: _columns\"\r\n [nzLeft]=\"column.fixedLeft\"\r\n [nzRight]=\"column.fixedRight\"\r\n style=\"font-weight: bold; border-right: 1px solid #e8e8e8\"\r\n [nzAlign]=\"column.align\"\r\n >\r\n <span *ngIf=\"i === 0\">\u603B\u8BA1</span>\r\n <ng-container *ngIf=\"i !== 0 && column.summary\">\r\n {{\r\n column.summary?.format\r\n ? column.summary?.format(\r\n summaryData[column.summary?.name || column.prop]\r\n )\r\n : summaryData[column.summary?.name || column.prop]\r\n }}\r\n </ng-container>\r\n </td>\r\n </tr>\r\n </tbody>\r\n <ng-template #totalTemplate let-total\r\n >\u5171 {{ _pageInfo.total }} \u6761\u8BB0\u5F55</ng-template\r\n >\r\n </nz-table>\r\n </ng-template>\r\n</app-page-container>\r\n",
|
|
1073
|
-
styles: [".pro-ellipsis{overflow:hidden;text-overflow:ellipsis}.pro-nowrap{white-space:nowrap}::ng-deep .setting-space-item{margin-right:0!important}::ng-deep .pro-table-checkboxgroup-nostyle{white-space:nowrap}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body table{border-collapse:separate;border-spacing:0}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr>td{border-right:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-thead>tr>th{border-
|
|
1078
|
+
styles: [".pro-ellipsis{overflow:hidden;text-overflow:ellipsis}.pro-nowrap{white-space:nowrap}::ng-deep .setting-space-item{margin-right:0!important}::ng-deep .pro-table-checkboxgroup-nostyle{white-space:nowrap}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body table{border-collapse:separate;border-spacing:0}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr>td{border-right:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-thead>tr>th{border-right:1px solid #e8e8e8!important;border-bottom:1px solid #e8e8e8!important;white-space:nowrap}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr>td:first-child,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-thead>tr>th:first-child{border-left:none!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-cell-fix-left,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-cell-fix-right,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-header .ant-table-thead>tr>th.ant-table-cell-fix-left,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-header .ant-table-thead>tr>th.ant-table-cell-fix-right{border-right:1px solid #e8e8e8!important;border-bottom:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-header .ant-table-thead>tr>th{border-top:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr>td:last-child,::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-thead>tr>th:last-child{border-right:1px solid #e8e8e8!important}::ng-deep .ant-table-bordered .ant-table-container .ant-table-content .ant-table-body .ant-table-tbody>tr:last-child>td{border-bottom:1px solid #e8e8e8!important}::ng-deep .table-search-bar-left .ant-form-item{margin-bottom:4px}::ng-deep .table-search-bar-left .ant-form-item .ant-form-item-label>label{color:#5a5a5a}::ng-deep .pro-table-container .page-container-body{padding:8px 0 0!important}"]
|
|
1074
1079
|
},] }
|
|
1075
1080
|
];
|
|
1076
1081
|
ProTableComponent.ctorParameters = () => [
|
|
@@ -1113,4 +1118,4 @@ ProTableComponent.propDecorators = {
|
|
|
1113
1118
|
imgActionBarTpl: [{ type: ContentChild, args: ["ImgActionBar",] }],
|
|
1114
1119
|
allTemplates: [{ type: ContentChildren, args: [TemplateRef,] }]
|
|
1115
1120
|
};
|
|
1116
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvLXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJEOi9wcm9qZWN0cy92cHMtZnJvbnQvRnJvbnQvRGFzUE1TV2ViL2xpYi9wcm8tdGFibGUvc3JjLyIsInNvdXJjZXMiOlsibGliL3Byby10YWJsZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLGVBQWUsRUFDZixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFFTCxRQUFRLEVBQ1IsTUFBTSxFQUVOLFdBQVcsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN2RSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFXaEYsT0FBTyxFQUFFLHVCQUF1QixFQUErQixNQUFNLFVBQVUsQ0FBQztBQUNoRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBT3BDLE1BQU0sT0FBTyxpQkFBaUI7SUFzSTVCLFlBR1UsWUFBZ0Q7UUFBaEQsaUJBQVksR0FBWixZQUFZLENBQW9DO1FBeElqRCxrQkFBYSxHQUFZLElBQUksQ0FBQztRQUU5QixpQkFBWSxHQUFZLElBQUksQ0FBQztRQUU3QixVQUFLLEdBQWtCLElBQUksQ0FBQztRQUU1QixjQUFTLEdBQVcsRUFBRSxDQUFDO1FBRXZCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFFMUIsWUFBTyxHQUFxQixFQUFFLENBQUM7UUFFL0Isa0JBQWEsR0FBWSxJQUFJLENBQUM7UUFFOUIsa0JBQWEsR0FBWSxJQUFJLENBQUM7UUFFOUIsbUJBQWMsR0FBVyxJQUFJLENBQUM7UUFFOUIsaUJBQVksR0FBVyxJQUFJLENBQUM7UUFFNUIsZUFBVSxHQUFXLE1BQU0sQ0FBQztRQUU1QixlQUFVLEdB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biAgQWZ0ZXJDb250ZW50SW5pdCxcclxuICBDb21wb25lbnQsXHJcbiAgQ29udGVudENoaWxkLFxyXG4gIENvbnRlbnRDaGlsZHJlbixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5qZWN0LFxyXG4gIElucHV0LFxyXG4gIE9uSW5pdCxcclxuICBPcHRpb25hbCxcclxuICBPdXRwdXQsXHJcbiAgUXVlcnlMaXN0LFxyXG4gIFRlbXBsYXRlUmVmLFxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IGNsb25lRGVlcCwgaGFzSW4sIGlzTmlsLCBkZWJvdW5jZSwgaXNFcXVhbCB9IGZyb20gXCJsb2Rhc2gtZXNcIjtcclxuaW1wb3J0IHsgUFJPX1RBQkxFX0RFRkFVTFRfQ09MVU1OLCBQUk9fVEFCTEVfREVGQVVMVF9QUk9QUyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xyXG5pbXBvcnQge1xyXG4gIEF1dG9Db21wbGV0ZUZpZWxkUHJvcHMsXHJcbiAgQ2hlY2tib3hGaWVsZFByb3BzLFxyXG4gIE9wdGlvbnNUeXBlLFxyXG4gIFByb1RhYmxlQ29sdW1uLFxyXG4gIFByb1RhYmxlUGFnZUluZm8sXHJcbiAgUHJvVGFibGVSZXF1ZXN0UmVzdWx0LFxyXG4gIFByb1RhYmxlVmFsdWVzQ2hhbmdlLFxyXG4gIFNlbGVjdEZpZWxkUHJvcHMsXHJcbn0gZnJvbSBcIi4vdHlwZVwiO1xyXG5pbXBvcnQgeyBQUk9fVEFCTEVfQ09MVU1OX1JFTU9URSwgUHJvVGFibGVSZW1vdGVDb2x1bW5TZXJ2aWNlIH0gZnJvbSBcIi4vdG9rZW5zXCI7XHJcbmltcG9ydCB7IGlzT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJhcHAtcHJvLXRhYmxlXCIsXHJcbiAgdGVtcGxhdGVVcmw6IFwiLi9wcm8tdGFibGUuY29tcG9uZW50Lmh0bWxcIixcclxuICBzdHlsZVVybHM6IFtcIi4vcHJvLXRhYmxlLmNvbXBvbmVudC5sZXNzXCJdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgUHJvVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyQ29udGVudEluaXQge1xyXG4gIEBJbnB1dCgpIHNob3dTZWFyY2hCdG46IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKSBzaG93Q2xlYXJCdG46IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIEBJbnB1dCgpIHRhYmxlTmFtZTogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgQElucHV0KCkgbXVsdGlSb3c6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgY29sdW1uczogUHJvVGFibGVDb2x1bW5bXSA9IFtdO1xyXG5cclxuICBASW5wdXQoKSBzaG93U2VhcmNoQmFyOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KCkgc2hvd0FjdGlvbkJhcjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpIGNvbmZpcm1CdG5UZXh0OiBzdHJpbmcgPSBcIuafpeivolwiO1xyXG5cclxuICBASW5wdXQoKSBjbGVhckJ0blRleHQ6IHN0cmluZyA9IFwi5riF56m6XCI7XHJcblxyXG4gIEBJbnB1dCgpIGxhYmVsV2lkdGg6IHN0cmluZyA9IFwiOTBweFwiO1xyXG5cclxuICBASW5wdXQoKSBsYWJlbEFsaWduOiBzdHJpbmcgPSBcInJpZ2h0XCI7XHJcblxyXG4gIEBJbnB1dCgpIGZvcm1JdGVtV2lkdGg6IHN0cmluZyA9IFwiMjcwcHhcIjtcclxuXHJcbiAgQElucHV0KCkgZGF0YVNvdXJjZTogYW55W10gPSBbXTtcclxuXHJcbiAgQElucHV0KCkgYm9yZGVyZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKSBvdXRlckJvcmRlcmVkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KCkgc2hvd1BhZ2luYXRpb246IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKSBmcm9udFBhZ2luYXRpb246IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgc2Nyb2xsOiB7IHg/OiBzdHJpbmcgfCBudW1iZXI7IHk/OiBzdHJpbmcgfCBudW1iZXIgfSB8IG51bGwgPSBudWxsO1xyXG5cclxuICBASW5wdXQoKSByZXF1ZXN0OiAocGFyYW1zOiBhbnkpID0+IFByb21pc2U8UHJvVGFibGVSZXF1ZXN0UmVzdWx0PjtcclxuXHJcbiAgQElucHV0KCkgc3VtbWFyeURhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgLy8g5o6S5bqP5qih5byP77yabG9jYWwg5pys5Zyw5o6S5bqP77ybc2VydmVyIOWcqOe6v+aOkuW6j++8iOaPkOS6pOe7meaOpeWPo++8iVxyXG4gIEBJbnB1dCgpIHNvcnRNb2RlOiBcImxvY2FsXCIgfCBcInNlcnZlclwiID0gXCJsb2NhbFwiO1xyXG5cclxuICBASW5wdXQoKSBzaG93Q29sdW1uU2V0dGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvLyDmmK/lkKblvIDlkK/lpJrliJfmjpLluo/vvIjpu5jorqTljZXliJfvvIlcclxuICBASW5wdXQoKSBtdWx0aXBsZVNvcnQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgc2hvd0NoZWNrYm94OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vIOWIpOaWreihjOaYr+WQpuemgeeUqOeahOWHveaVsFxyXG4gIEBJbnB1dCgpIHJvd0Rpc2FibGVkOiAoZGF0YTogYW55KSA9PiBib29sZWFuID0gKCkgPT4gZmFsc2U7XHJcblxyXG4gIC8vIOaYr+WQpuiHquWKqOinpuWPkeivt+axglxyXG4gIEBJbnB1dCgpIGF1dG9UcmlnZ2VyUmVxdWVzdDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpIGN1c3RvbVRhYmxlUmVuZGVyPzogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgQE91dHB1dCgpIG9uUm93Q2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgQE91dHB1dCgpIG9uUm93RGJDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBAT3V0cHV0KCkgb25WYWx1ZXNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFByb1RhYmxlVmFsdWVzQ2hhbmdlPigpO1xyXG5cclxuICBAT3V0cHV0KCkgb25SZXNldEZvcm1CZWZvcmVSZWxvYWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgQENvbnRlbnRDaGlsZChcImFjdGlvbkJhclwiKSBhY3Rpb25CYXJUcGwhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICBAQ29udGVudENoaWxkKFwiSW1nQWN0aW9uQmFyXCIpIGltZ0FjdGlvbkJhclRwbCE6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gIEBDb250ZW50Q2hpbGRyZW4oVGVtcGxhdGVSZWYpIGFsbFRlbXBsYXRlcyE6IFF1ZXJ5TGlzdDxUZW1wbGF0ZVJlZjxhbnk+PjtcclxuXHJcbiAgcHJpdmF0ZSBfc2F2ZWRTZWFyY2hQYXJhbXM6IGFueSA9IHt9O1xyXG5cclxuICAvLyDlrZjlgqjmqKHmnb/mmKDlsITlhbPns7sgLSDpgJrov4flrZfnrKbkuLLlkI3np7DmmKDlsITliLDmqKHmnb/lvJXnlKhcclxuICBwcml2YXRlIHRlbXBsYXRlTWFwID0gbmV3IE1hcDxzdHJpbmcsIFRlbXBsYXRlUmVmPGFueT4+KCk7XHJcblxyXG4gIC8vIOWtmOWCqOaJgOacieiHquWumuS5ieaooeadv+eahOW8leeUqFxyXG4gIHByaXZhdGUgY3VzdG9tVGVtcGxhdGVzID0gbmV3IE1hcDxzdHJpbmcsIFRlbXBsYXRlUmVmPGFueT4+KCk7XHJcblxyXG4gIC8vIOiusOW9leWQhOWIl+aOkuW6j+eKtuaAge+8midhc2NlbmQnIHwgJ2Rlc2NlbmQnIHwgbnVsbFxyXG5cclxuICBwcml2YXRlIF9zb3J0TWFwOiBSZWNvcmQ8c3RyaW5nLCBcImFzY2VuZFwiIHwgXCJkZXNjZW5kXCIgfCBudWxsPiA9IHt9O1xyXG5cclxuICAvLyDorrDlvZXlpJrliJfmjpLluo/nmoTkvJjlhYjnuqfvvIjlkI7orr7nva7nmoTkvJjlhYjvvIlcclxuICBwcml2YXRlIF9zb3J0UHJpb3JpdHk6IHN0cmluZ1tdID0gW107XHJcblxyXG4gIC8vIOWtmOWCqOavj+S4qiBhdXRvQ29tcGxldGUg5a2X5q6155qE6Ziy5oqW5Ye95pWwXHJcbiAgcHJpdmF0ZSBfYXV0b0NvbXBsZXRlRGVib3VuY2VNYXA6IE1hcDxzdHJpbmcsIChldmVudDogRXZlbnQpID0+IHZvaWQ+ID1cclxuICAgIG5ldyBNYXAoKTtcclxuXHJcbiAgLy8g5LuF5Zyo5Yid5aeL5YyW5pe26L+Q6KGM5YiX6YWN572u6aKE5qOA5p+l77yM6YG/5YWN5ZCO57ut6LCD55So6YeN5aSN6Kem5Y+RXHJcbiAgcHJpdmF0ZSBfcHJlQ2hlY2tEb25lOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIF9jb2x1bW5zOiBQcm9UYWJsZUNvbHVtbltdID0gW107XHJcblxyXG4gIC8vIOetm+mAieihqOWNleaVsOaNruWtmOWCqFxyXG4gIF9zZWFyY2hQYXJhbXM6IGFueSA9IHt9O1xyXG5cclxuICAvLyDnrZvpgInooajljZVsaXN05riy5p+T5pWw5o2uXHJcbiAgX3NlYXJjaEZpbGVkQ29sdW1uczogUHJvVGFibGVDb2x1bW5bXSA9IFtdO1xyXG5cclxuICBfcGFnZUluZm86IFByb1RhYmxlUGFnZUluZm8gPSB7XHJcbiAgICBwYWdlSW5kZXg6IDEsXHJcbiAgICBwYWdlU2l6ZTogMTUsXHJcbiAgICB0b3RhbDogMTAwLFxyXG4gICAgcGFnZVNpemVPcHRpb25zOiBbMTAsIDE1LCAyMCwgNTAsIDEwMCwgNTAwLCAxMDAwXSxcclxuICB9O1xyXG5cclxuICBfbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBfc2VsZWN0ZWRUYWJsZVJvdzogYW55ID0gbnVsbDtcclxuXHJcbiAgLy8g6YCJ5Lit55qE6KGM5pWw5o2u77yI55So5LqO5aSN6YCJ5qGG6YCJ5oup77yJLSDkv53nlZnnlKjkuo7lhbzlrrnmgKdcclxuICBfc2VsZWN0ZWRSb3dzOiBhbnlbXSA9IFtdO1xyXG5cclxuICAvLyDkvb/nlKggU2V0IOWtmOWCqOmAieS4remhueeahCBJRO+8jOaUr+aMgei3qOmhtemAieS4rVxyXG4gIHByaXZhdGUgX3NlbGVjdGVkUm93SWRzID0gbmV3IFNldDxzdHJpbmcgfCBudW1iZXI+KCk7XHJcblxyXG4gIC8vIOWFqOmAieeKtuaAgVxyXG4gIF9jaGVja2VkQWxsOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vIOWNiumAieeKtuaAge+8iOmDqOWIhumAieS4re+8iVxyXG4gIF9pbmRldGVybWluYXRlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vIOi/nOeoi2NvbHVtbnNcclxuICBfc2VydmVyQ29sdW1uczogUHJvVGFibGVDb2x1bW5bXSA9IFtdO1xyXG5cclxuICAvLyDlrZjlgqggYXV0b0NvbXBsZXRlIOWtl+auteeahOaVsOaNrua6kFxyXG4gIF9hdXRvQ29tcGxldGVEYXRhU291cmNlczogUmVjb3JkPHN0cmluZywgYW55W10+ID0ge307XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQE9wdGlvbmFsKClcclxuICAgIEBJbmplY3QoUFJPX1RBQkxFX0NPTFVNTl9SRU1PVEUpXHJcbiAgICBwcml2YXRlIGNvbHVtblJlbW90ZTogUHJvVGFibGVSZW1vdGVDb2x1bW5TZXJ2aWNlIHwgbnVsbFxyXG4gICkge31cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBmZXRjaFJlbW90ZUNvbHVtbnMoKSB7XHJcbiAgICBpZiAoIXRoaXMuY29sdW1uUmVtb3RlPy5nZXRDb2wgfHwgIXRoaXMudGFibGVOYW1lKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5jb2x1bW5SZW1vdGUuZ2V0Q29sKHRoaXMudGFibGVOYW1lLCB0aGlzLm11bHRpUm93KTtcclxuICAgICAgcmV0dXJuIHJlcztcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBwZXJzaXN0UmVtb3RlQ29sdW1ucyhjb2x1bW5zOiBhbnlbXSkge1xyXG4gICAgaWYgKCF0aGlzLmNvbHVtblJlbW90ZT8uc2V0Q29sIHx8ICF0aGlzLnRhYmxlTmFtZSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuY29sdW1uUmVtb3RlLnNldENvbChcclxuICAgICAgICB0aGlzLnRhYmxlTmFtZSxcclxuICAgICAgICBjb2x1bW5zLFxyXG4gICAgICAgIHRoaXMubXVsdGlSb3dcclxuICAgICAgKTtcclxuICAgICAgaWYgKHJlc3VsdCAmJiBpc09ic2VydmFibGUocmVzdWx0KSkge1xyXG4gICAgICAgIHJldHVybiBhd2FpdCByZXN1bHQudG9Qcm9taXNlKCk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgbmdPbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLl9zZWFyY2hQYXJhbXMgPSB7fTtcclxuICAgIHRoaXMuZm9ybWF0ZUlubmVyQ29sdW1ucyh0aGlzLmNvbHVtbnMpO1xyXG4gICAgYXdhaXQgdGhpcy5zZXRTZWFyY2hQYXJhbXModGhpcy5jb2x1bW5zKTtcclxuXHJcbiAgICAvLyDkvb/nlKggUHJveHkg5YyF6KOFIF9zZWFyY2hQYXJhbXPvvIzmi6bmiKrooajljZXpobnlgLzlj5jljJblubblkJHlpJblj5Hlh7rkuovku7ZcclxuICAgIHRoaXMuX3NlYXJjaFBhcmFtcyA9IHRoaXMuY3JlYXRlU2VhcmNoUGFyYW1zUHJveHkodGhpcy5fc2VhcmNoUGFyYW1zKTtcclxuICAgIGlmICh0aGlzLmF1dG9UcmlnZ2VyUmVxdWVzdCkge1xyXG4gICAgICB0aGlzLmhhbmRsZVF1ZXJ5KCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnF1ZXJ5RHluYW1pY0NvbHVtbnMoKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcclxuICAgIC8vIOiHquWKqOazqOWGjOaJgOacieiHquWumuS5ieaooeadv1xyXG4gICAgdGhpcy5hdXRvUmVnaXN0ZXJUZW1wbGF0ZXMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgcHJlQ2hlY2tTZXJ2ZXJDb2x1bW5zKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5mZXRjaFJlbW90ZUNvbHVtbnMoKTtcclxuICAgIGlmICghcmVzKSByZXR1cm4gZmFsc2U7XHJcbiAgICBjb25zdCBpbml0Q29sdW1ucyA9IHRoaXMuY29sdW1uc1xyXG4gICAgICAuZmlsdGVyKChjb2wpID0+ICFjb2wuYXV4aWxpYXJ5Q29sdW1uKVxyXG4gICAgICAubWFwKChjb2x1bW4pID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgZmllbGQ6IGNvbHVtbi5wcm9wLFxyXG4gICAgICAgICAgaXNTaG93OiAhY29sdW1uLmhpZGVJblRhYmxlLCAvLyDpu5jorqTlhajpg6jmmL7npLpcclxuICAgICAgICAgIGhlYWRlcjogY29sdW1uLnRpdGxlLFxyXG4gICAgICAgICAgc29ydE5hbWU6IGNvbHVtbi5zb3J0TmFtZSB8fCBudWxsLFxyXG4gICAgICAgIH07XHJcbiAgICAgIH0pO1xyXG4gICAgaWYgKHJlcy5jb2RlID09PSAwKSB7XHJcbiAgICAgIGlmICghaXNFcXVhbChyZXMuZGF0YS50YWJDb2x1bW4sIGluaXRDb2x1bW5zKSkge1xyXG4gICAgICAgIGNvbnN0IGluaXRSZXMgPSBhd2FpdCB0aGlzLnBlcnNpc3RSZW1vdGVDb2x1bW5zKGluaXRDb2x1bW5zKTtcclxuICAgICAgICBpZiAoaW5pdFJlcykge1xyXG4gICAgICAgICAgdGhpcy5xdWVyeUR5bmFtaWNDb2x1bW5zKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCLkuIDoh7RcIik7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgcXVlcnlEeW5hbWljQ29sdW1ucygpIHtcclxuICAgIGlmICghdGhpcy50YWJsZU5hbWUgfHwgIXRoaXMuY29sdW1uUmVtb3RlKSByZXR1cm47XHJcbiAgICBpZiAoIXRoaXMuX3ByZUNoZWNrRG9uZSkge1xyXG4gICAgICBjb25zdCBjaGVja1Jlc3VsdCA9IGF3YWl0IHRoaXMucHJlQ2hlY2tTZXJ2ZXJDb2x1bW5zKCk7XHJcbiAgICAgIHRoaXMuX3ByZUNoZWNrRG9uZSA9IHRydWU7XHJcbiAgICAgIGlmICghY2hlY2tSZXN1bHQpIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMuZmV0Y2hSZW1vdGVDb2x1bW5zKCk7XHJcbiAgICBpZiAoIXJlcykgcmV0dXJuO1xyXG4gICAgaWYgKHJlcy5jb2RlID09PSAwKSB7XHJcbiAgICAgIGNvbnN0IF90YWJDb2x1bW4gPSByZXMuZGF0YS50YWJDb2x1bW4ubWFwKChpdGVtKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIHRpdGxlOiBpdGVtLmhlYWRlcixcclxuICAgICAgICAgIHByb3A6IGl0ZW0uZmllbGQsXHJcbiAgICAgICAgICBzb3J0TmFtZTogaXRlbS5zb3J0TmFtZSxcclxuICAgICAgICAgIGhpZGVJblRhYmxlOiAhaXRlbS5pc1Nob3csXHJcbiAgICAgICAgfTtcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuX3NlcnZlckNvbHVtbnMgPSBfdGFiQ29sdW1uO1xyXG4gICAgICB0aGlzLnVwZGF0ZVRhYmxlQ29sdW1ucyhfdGFiQ29sdW1uKTtcclxuICAgIH0gZWxzZSBpZiAocmVzLmNvZGUgPT09IDEwKSB7XHJcbiAgICAgIC8vIOWmguaenOacquiuvue9ruaOpeWPo+i/lOWbnu+8jOmcgOimgem7mOiupOiwg+eUqOS4gOasoeS/ruaUueWHveaVsOWIneWni+WMluaVsOaNrlxyXG4gICAgICBjb25zdCBpbml0Q29sdW1ucyA9IHRoaXMuY29sdW1uc1xyXG4gICAgICAgIC5maWx0ZXIoKGNvbCkgPT4gIWNvbC5hdXhpbGlhcnlDb2x1bW4pXHJcbiAgICAgICAgLm1hcCgoY29sdW1uKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBmaWVsZDogY29sdW1uLnByb3AsXHJcbiAgICAgICAgICAgIGlzU2hvdzogdHJ1ZSwgLy8g6buY6K6k5YWo6YOo5pi+56S6XHJcbiAgICAgICAgICAgIGhlYWRlcjogY29sdW1uLnRpdGxlLFxyXG4gICAgICAgICAgICBzb3J0TmFtZTogY29sdW1uLnNvcnROYW1lIHx8IG51bGwsXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgLy8g6LCD55So5L+u5pS55o6l5Y+j5Yid5aeL5YyW5pWw5o2uXHJcbiAgICAgIGNvbnN0IGluaXRSZXMgPSBhd2FpdCB0aGlzLnBlcnNpc3RSZW1vdGVDb2x1bW5zKGluaXRDb2x1bW5zKTtcclxuICAgICAgaWYgKGluaXRSZXMpIHtcclxuICAgICAgICB0aGlzLnF1ZXJ5RHluYW1pY0NvbHVtbnMoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmb3JtYXRlSW5uZXJDb2x1bW5zKGNvbHVtbnM6IFByb1RhYmxlQ29sdW1uW10pIHtcclxuICAgIHRoaXMuX2NvbHVtbnMgPSBjb2x1bW5zXHJcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+ICFpdGVtLmhpZGVJblRhYmxlKVxyXG4gICAgICAubWFwKChpdGVtKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHsgLi4uUFJPX1RBQkxFX0RFRkFVTFRfQ09MVU1OLCAuLi5pdGVtIH0gYXMgUHJvVGFibGVDb2x1bW47XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8g6Ieq5Yqo5rOo5YaM5qih5p2/55qE5pa55rOVXHJcbiAgcHJpdmF0ZSBhdXRvUmVnaXN0ZXJUZW1wbGF0ZXMoKSB7XHJcbiAgICAvLyDojrflj5bmiYDmnInpnIDopoHoh6rlrprkuYnmqKHmnb/nmoTliJdcclxuICAgIGNvbnN0IGNvbHVtbnNXaXRoQ3VzdG9tUmVuZGVyID0gdGhpcy5fY29sdW1ucy5maWx0ZXIoXHJcbiAgICAgIChjb2wpID0+IGNvbC5jdXN0b21SZW5kZXJcclxuICAgICk7XHJcblxyXG4gICAgaWYgKGNvbHVtbnNXaXRoQ3VzdG9tUmVuZGVyLmxlbmd0aCA+IDApIHtcclxuICAgICAgLy8g5bCd6K+V5LuOQ29udGVudENoaWxkcmVu5Lit5p+l5om+5a+55bqU55qE5qih5p2/XHJcbiAgICAgIGNvbHVtbnNXaXRoQ3VzdG9tUmVuZGVyLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICAgIGNvbnN0IHRlbXBsYXRlTmFtZSA9IGNvbHVtbi5jdXN0b21SZW5kZXIhO1xyXG4gICAgICAgIGNvbnN0IHRlbXBsYXRlID0gdGhpcy5maW5kVGVtcGxhdGVCeU5hbWUodGVtcGxhdGVOYW1lKTtcclxuXHJcbiAgICAgICAgaWYgKHRlbXBsYXRlKSB7XHJcbiAgICAgICAgICB0aGlzLmN1c3RvbVRlbXBsYXRlcy5zZXQodGVtcGxhdGVOYW1lLCB0ZW1wbGF0ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOiOt+WPluaJgOaciemcgOimgeiHquWumuS5iWxhYmVs5qih5p2/55qE5YiX77yI5L2/55So5Y6f5aeLY29sdW1uc++8jOehruS/nemhuuW6j+ato+ehru+8iVxyXG4gICAgY29uc3QgY29sdW1uc1dpdGhDdXN0b21MYWJlbCA9IHRoaXMuY29sdW1ucy5maWx0ZXIoXHJcbiAgICAgIChjb2wpID0+IGNvbC5jdXN0b21MYWJlbFJlbmRlclxyXG4gICAgKTtcclxuXHJcbiAgICBpZiAoY29sdW1uc1dpdGhDdXN0b21MYWJlbC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIC8vIOWwneivleS7jkNvbnRlbnRDaGlsZHJlbuS4reafpeaJvuWvueW6lOeahGxhYmVs5qih5p2/XHJcbiAgICAgIGNvbHVtbnNXaXRoQ3VzdG9tTGFiZWwuZm9yRWFjaCgoY29sdW1uKSA9PiB7XHJcbiAgICAgICAgY29uc3QgdGVtcGxhdGVOYW1lID0gY29sdW1uLmN1c3RvbUxhYmVsUmVuZGVyITtcclxuICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IHRoaXMuZmluZExhYmVsVGVtcGxhdGVCeU5hbWUoXHJcbiAgICAgICAgICB0ZW1wbGF0ZU5hbWUsXHJcbiAgICAgICAgICBjb2x1bW5zV2l0aEN1c3RvbUxhYmVsXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgaWYgKHRlbXBsYXRlKSB7XHJcbiAgICAgICAgICB0aGlzLmN1c3RvbVRlbXBsYXRlcy5zZXQodGVtcGxhdGVOYW1lLCB0ZW1wbGF0ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g5qC55o2u5ZCN56ew5p+l5om+5qih5p2/XHJcbiAgcHJpdmF0ZSBmaW5kVGVtcGxhdGVCeU5hbWUodGVtcGxhdGVOYW1lOiBzdHJpbmcpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRUZW1wbGF0ZUZyb21Db250ZW50KHRlbXBsYXRlTmFtZSk7XHJcbiAgfVxyXG5cclxuICAvLyDku45Db250ZW50Q2hpbGRyZW7kuK3mn6Xmib7mjIflrprlkI3np7DnmoTmqKHmnb9cclxuICBwcml2YXRlIGdldFRlbXBsYXRlRnJvbUNvbnRlbnQoXHJcbiAgICB0ZW1wbGF0ZU5hbWU6IHN0cmluZ1xyXG4gICk6IFRlbXBsYXRlUmVmPGFueT4gfCBudWxsIHtcclxuICAgIGNvbnN0IGN1c3RvbVJlbmRlckNvbHVtbnMgPSB0aGlzLl9jb2x1bW5zLmZpbHRlcigoY29sKSA9PiBjb2wuY3VzdG9tUmVuZGVyKTtcclxuICAgIGNvbnN0IHRlbXBsYXRlSW5kZXggPSBjdXN0b21SZW5kZXJDb2x1bW5zLmZpbmRJbmRleChcclxuICAgICAgKGNvbCkgPT4gY29sLmN1c3RvbVJlbmRlciA9PT0gdGVtcGxhdGVOYW1lXHJcbiAgICApO1xyXG5cclxuICAgIGlmICh0ZW1wbGF0ZUluZGV4ID49IDApIHtcclxuICAgICAgLy8g6I635Y+W5omA5pyJ5qih5p2/77yM5bm26L+H5ruk5o6J54m55q6K5qih5p2/77yIYWN0aW9uQmFy5ZKMSW1nQWN0aW9uQmFy77yJXHJcbiAgICAgIC8vIOi/meagt+WPr+S7pemBv+WFjeWboOS4uueJueauiuaooeadv+eahOS9jee9ruWvvOiHtOe0ouW8leiuoeeul+mUmeivr1xyXG4gICAgICBjb25zdCB0ZW1wbGF0ZXMgPSB0aGlzLmFsbFRlbXBsYXRlcy50b0FycmF5KCk7XHJcbiAgICAgIGNvbnN0IGN1c3RvbVRlbXBsYXRlcyA9IHRlbXBsYXRlcy5maWx0ZXIoXHJcbiAgICAgICAgKHRwbCkgPT4gdHBsICE9PSB0aGlzLmFjdGlvbkJhclRwbCAmJiB0cGwgIT09IHRoaXMuaW1nQWN0aW9uQmFyVHBsXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBpZiAodGVtcGxhdGVJbmRleCA8IGN1c3RvbVRlbXBsYXRlcy5sZW5ndGgpIHtcclxuICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IGN1c3RvbVRlbXBsYXRlc1t0ZW1wbGF0ZUluZGV4XTtcclxuICAgICAgICByZXR1cm4gdGVtcGxhdGU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zb2xlLndhcm4oYOacquaJvuWIsOaooeadvyAke3RlbXBsYXRlTmFtZX1gKTtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8g5qC55o2u5ZCN56ew5p+l5om+bGFiZWzmqKHmnb9cclxuICBwcml2YXRlIGZpbmRMYWJlbFRlbXBsYXRlQnlOYW1lKFxyXG4gICAgdGVtcGxhdGVOYW1lOiBzdHJpbmcsXHJcbiAgICBjdXN0b21MYWJlbENvbHVtbnM6IFByb1RhYmxlQ29sdW1uW11cclxuICApOiBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbCB7XHJcbiAgICBjb25zdCB0ZW1wbGF0ZUluZGV4ID0gY3VzdG9tTGFiZWxDb2x1bW5zLmZpbmRJbmRleChcclxuICAgICAgKGNvbCkgPT4gY29sLmN1c3RvbUxhYmVsUmVuZGVyID09PSB0ZW1wbGF0ZU5hbWVcclxuICAgICk7XHJcblxyXG4gICAgaWYgKHRlbXBsYXRlSW5kZXggPj0gMCkge1xyXG4gICAgICAvLyDojrflj5bmiYDmnInmqKHmnb/vvIzlubbov4fmu6TmjonnibnmrormqKHmnb/vvIhhY3Rpb25CYXLlkoxJbWdBY3Rpb25CYXLvvIlcclxuICAgICAgY29uc3QgdGVtcGxhdGVzID0gdGhpcy5hbGxUZW1wbGF0ZXMudG9BcnJheSgpO1xyXG4gICAgICBjb25zdCBjdXN0b21UZW1wbGF0ZXMgPSB0ZW1wbGF0ZXMuZmlsdGVyKFxyXG4gICAgICAgICh0cGwpID0+IHRwbCAhPT0gdGhpcy5hY3Rpb25CYXJUcGwgJiYgdHBsICE9PSB0aGlzLmltZ0FjdGlvbkJhclRwbFxyXG4gICAgICApO1xyXG5cclxuICAgICAgLy8g6K6h566XbGFiZWzmqKHmnb/nmoTntKLlvJXvvJrpnIDopoHot7Pov4fmiYDmnInnmoRjdXN0b21SZW5kZXLmqKHmnb9cclxuICAgICAgY29uc3QgY3VzdG9tUmVuZGVyQ29sdW1ucyA9IHRoaXMuX2NvbHVtbnMuZmlsdGVyKFxyXG4gICAgICAgIChjb2wpID0+IGNvbC5jdXN0b21SZW5kZXJcclxuICAgICAgKTtcclxuICAgICAgY29uc3QgbGFiZWxUZW1wbGF0ZUluZGV4ID0gY3VzdG9tUmVuZGVyQ29sdW1ucy5sZW5ndGggKyB0ZW1wbGF0ZUluZGV4O1xyXG5cclxuICAgICAgaWYgKGxhYmVsVGVtcGxhdGVJbmRleCA8IGN1c3RvbVRlbXBsYXRlcy5sZW5ndGgpIHtcclxuICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IGN1c3RvbVRlbXBsYXRlc1tsYWJlbFRlbXBsYXRlSW5kZXhdO1xyXG4gICAgICAgIHJldHVybiB0ZW1wbGF0ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnNvbGUud2Fybihg5pyq5om+5YiwbGFiZWzmqKHmnb8gJHt0ZW1wbGF0ZU5hbWV9YCk7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vIOiuvue9ruetm+mAieihqOWNlem7mOiupOWxnuaAp1xyXG4gIHByaXZhdGUgc2V0U2VhcmNoRm9ybURlZmF1bHRQcm9wKGNvbHVtbnM6IFByb1RhYmxlQ29sdW1uW10pIHtcclxuICAgIGNvbHVtbnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpZiAoaXRlbS52YWx1ZVR5cGUpIHtcclxuICAgICAgICBpZiAoaXRlbS5maWVsZFByb3BzKSB7XHJcbiAgICAgICAgICBpdGVtLmZpZWxkUHJvcHMgPSB7XHJcbiAgICAgICAgICAgIC4uLlBST19UQUJMRV9ERUZBVUxUX1BST1BTW2l0ZW0udmFsdWVUeXBlXSxcclxuICAgICAgICAgICAgLi4uaXRlbS5maWVsZFByb3BzLFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaXRlbS5maWVsZFByb3BzID0geyAuLi5QUk9fVEFCTEVfREVGQVVMVF9QUk9QU1tpdGVtLnZhbHVlVHlwZV0gfTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8g5Yqo5oCB6K6+572uT3B0aW9uc1xyXG4gIHByaXZhdGUgc2V0U2VsZWN0UmVxdWVzdChjb2x1bW5zOiBQcm9UYWJsZUNvbHVtbltdKSB7XHJcbiAgICBjb2x1bW5zLm1hcChhc3luYyAoaXRlbSkgPT4ge1xyXG4gICAgICBpZiAoaXRlbS5maWVsZFByb3BzICYmIGhhc0luKGl0ZW0uZmllbGRQcm9wcywgXCJyZXF1ZXN0XCIpKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSBhd2FpdCAoXHJcbiAgICAgICAgICAgIGl0ZW0uZmllbGRQcm9wcyBhcyBTZWxlY3RGaWVsZFByb3BzXHJcbiAgICAgICAgICApLnJlcXVlc3Q/LigpO1xyXG4gICAgICAgICAgKGl0ZW0uZmllbGRQcm9wcyBhcyBTZWxlY3RGaWVsZFByb3BzKS5vcHRpb25zID0gb3B0aW9ucztcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgKGl0ZW0uZmllbGRQcm9wcyBhcyBTZWxlY3RGaWVsZFByb3BzKS5vcHRpb25zID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgc2V0U2VhcmNoUGFyYW1zKGNvbHVtbnM6IFByb1RhYmxlQ29sdW1uW10pIHtcclxuICAgIHRoaXMuX3NlYXJjaEZpbGVkQ29sdW1ucyA9IFtdO1xyXG4gICAgY29sdW1uc1xyXG4gICAgICAuZmlsdGVyKChpdGVtKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZmxhZyA9ICFpdGVtLmhpZGVJblNlYXJjaCAmJiBpdGVtLnZhbHVlVHlwZTtcclxuICAgICAgICBpZiAoZmxhZykge1xyXG4gICAgICAgICAgdGhpcy5fc2VhcmNoRmlsZWRDb2x1bW5zLnB1c2goY2xvbmVEZWVwKGl0ZW0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZsYWc7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5mb3JFYWNoKChjb2x1bW4pID0+IHtcclxuICAgICAgICBjb25zdCBrZXkgPSBjb2x1bW4uZmllbGRQcm9wcz8ubmFtZSB8fCBjb2x1bW4ucHJvcDtcclxuICAgICAgICBsZXQgZGVmYXVsdFZhbHVlID0gUFJPX1RBQkxFX0RFRkFVTFRfUFJPUFNbY29sdW1uLnZhbHVlVHlwZV0udmFsdWU7XHJcblxyXG4gICAgICAgIC8vIOWvueS6jmNoZWNrYm9457G75Z6L77yM5LuOb3B0aW9uc+S4reaJvuWHumNoZWNrZWTkuLp0cnVl55qE6aG55L2c5Li66buY6K6k5YC8XHJcbiAgICAgICAgaWYgKGNvbHVtbi52YWx1ZVR5cGUgPT09IFwiY2hlY2tib3hcIikge1xyXG4gICAgICAgICAgY29uc3QgY2hlY2tlZFZhbHVlcyA9IChjb2x1bW4uZmllbGRQcm9wcz8ub3B0aW9ucyB8fCBbXSlcclxuICAgICAgICAgICAgLmZpbHRlcigob3B0OiBPcHRpb25zVHlwZSkgPT4gb3B0LmNoZWNrZWQpXHJcbiAgICAgICAgICAgIC5tYXAoKG9wdDogT3B0aW9uc1R5cGUpID0+IG9wdC52YWx1ZSk7XHJcbiAgICAgICAgICB0aGlzLl9zZWFyY2hQYXJhbXNba2V5XSA9XHJcbiAgICAgICAgICAgIGNoZWNrZWRWYWx1ZXMubGVuZ3RoID4gMCA/IGNoZWNrZWRWYWx1ZXMgOiBkZWZhdWx0VmFsdWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuX3NlYXJjaFBhcmFtc1trZXldID0gY29sdW1uLmZpZWxkUHJvcHM/LnZhbHVlIHx8IGRlZmF1bHRWYWx1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIOWIneWni+WMliBhdXRvQ29tcGxldGUg5pWw5o2u5rqQXHJcbiAgICAgICAgaWYgKGNvbHVtbi52YWx1ZVR5cGUgPT09IFwiYXV0b0NvbXBsZXRlXCIpIHtcclxuICAgICAgICAgIHRoaXMuX2F1dG9Db21wbGV0ZURhdGFTb3VyY2VzW2tleV0gPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIC8vIOagueaNruWIl+eahCBvcmRlciDlrZfmrrXov5vooYzmjpLluo/vvIzmnKrorr7nva4gb3JkZXIg55qE5pS+5Zyo5pyA5ZCOXHJcbiAgICB0aGlzLl9zZWFyY2hGaWxlZENvbHVtbnMuc29ydCgoYTogYW55LCBiOiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgYU9yZGVyID0gaXNOaWwoYT8ub3JkZXIpID8gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgOiBhLm9yZGVyO1xyXG4gICAgICBjb25zdCBiT3JkZXIgPSBpc05pbChiPy5vcmRlcikgPyBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiA6IGIub3JkZXI7XHJcbiAgICAgIGlmIChhT3JkZXIgPT09IGJPcmRlcikgcmV0dXJuIDA7XHJcbiAgICAgIHJldHVybiBhT3JkZXIgLSBiT3JkZXI7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNldFNlYXJjaEZvcm1EZWZhdWx0UHJvcCh0aGlzLl9zZWFyY2hGaWxlZENvbHVtbnMpO1xyXG5cclxuICAgIC8vIOW5tuWPkeWKoOi9veaJgOaciemcgOimgeW8guatpeiOt+WPlueahOmAiemhuVxyXG4gICAgdGhpcy5zZXRTZWxlY3RSZXF1ZXN0KHRoaXMuX3NlYXJjaEZpbGVkQ29sdW1ucyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVRhYmxlQ29sdW1ucyhpbmplY3RDb2x1bW5zOiBQcm9UYWJsZUNvbHVtbltdKSB7XHJcbiAgICAvLyAxLiDkvb/nlKjmnIDljp/lp4vnmoRjb2x1bW5z5L2c5Li65pWw5o2u5rqQ77yM56Gu5L+d6L6F5Yqp5YiX5a6M5YWo5LiN5Y+X5b2x5ZONXHJcbiAgICBjb25zdCBvcmlnaW5hbENvbHVtbnMgPSBjbG9uZURlZXAodGhpcy5jb2x1bW5zKTtcclxuXHJcbiAgICAvLyAyLiDlpITnkIblrZfmrrXmmKDlsITvvIjlpoLmnpzmj5DkvpvkuoZmaWVsZHPlj4LmlbDvvIlcclxuICAgIGxldCBwcm9jZXNzZWRJbmplY3RDb2x1bW5zID0gaW5qZWN0Q29sdW1ucztcclxuXHJcbiAgICAvLyAzLiDliIbnprvovoXliqnliJflkozpnZ7ovoXliqnliJfvvIjkvb/nlKjljp/lp4vmlbDmja7vvIlcclxuICAgIGNvbnN0IG5vbkF1eGlsaWFyeUNvbHVtbnMgPSBvcmlnaW5hbENvbHVtbnMuZmlsdGVyKFxyXG4gICAgICAoY29sKSA9PiAhY29sLmF1eGlsaWFyeUNvbHVtblxyXG4gICAgKTtcclxuXHJcbiAgICAvLyA0LiDmjInnhadpbmplY3RDb2x1bW5z55qE6aG65bqP6YeN5paw5o6S5YiX6Z2e6L6F5Yqp5YiXXHJcbiAgICBjb25zdCByZW9yZGVyZWROb25BdXhpbGlhcnlDb2x1bW5zOiBQcm9UYWJsZUNvbHVtbltdID0gW107XHJcbiAgICBjb25zdCByZW1haW5pbmdOb25BdXhpbGlhcnlDb2x1bW5zID0gWy4uLm5vbkF1eGlsaWFyeUNvbHVtbnNdOyAvLyDlpI3liLbkuIDku73nlKjkuo7mn6Xmib7lkoznp7vpmaRcclxuXHJcbiAgICBwcm9jZXNzZWRJbmplY3RDb2x1bW5zLmZvckVhY2goKGluamVjdENvbCkgPT4ge1xyXG4gICAgICAvLyDmn6Xmib7pnZ7ovoXliqnliJfkuK3lr7nlupTnmoTkuIvmoIdcclxuICAgICAgY29uc3QgZXhpc3RpbmdDb2xJbmRleCA9IHJlbWFpbmluZ05vbkF1eGlsaWFyeUNvbHVtbnMuZmluZEluZGV4KFxyXG4gICAgICAgIChjb2wpID0+IGNvbC5wcm9wID09PSBpbmplY3RDb2wucHJvcFxyXG4gICAgICApO1xyXG4gICAgICBpZiAoZXhpc3RpbmdDb2xJbmRleCAhPT0gLTEpIHtcclxuICAgICAgICAvLyDlpoLmnpzmib7liLDnm7jlkIzliJfvvIznlKhpbmplY3RDb2x1bW5z5Lit55qE5bGe5oCn6KaG55uW5Y6f5aeLY29sdW1uc+S4reeahOWxnuaAp1xyXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nQ29sID0gcmVtYWluaW5nTm9uQXV4aWxpYXJ5Q29sdW1uc1tleGlzdGluZ0NvbEluZGV4XTtcclxuXHJcbiAgICAgICAgY29uc3QgdXBkYXRlZENvbCA9IHsgLi4uZXhpc3RpbmdDb2wsIC4uLmluamVjdENvbCB9O1xyXG4gICAgICAgIHJlb3JkZXJlZE5vbkF1eGlsaWFyeUNvbHVtbnMucHVzaCh1cGRhdGVkQ29sKTtcclxuICAgICAgICAvLyDku47liankvZnmlbDnu4TkuK3np7vpmaTvvIzpgb/lhY3ph43lpI1cclxuICAgICAgICByZW1haW5pbmdOb25BdXhpbGlhcnlDb2x1bW5zLnNwbGljZShleGlzdGluZ0NvbEluZGV4LCAxKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyDlpoLmnpzmsqHmib7liLDlr7nlupTnmoTliJfvvIznm7TmjqXmt7vliqBpbmplY3RDb2x1bW5z5Lit55qE5YiXXHJcbiAgICAgICAgcmVvcmRlcmVkTm9uQXV4aWxpYXJ5Q29sdW1ucy5wdXNoKGluamVjdENvbCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIC8vIDUuIOWkhOeQhuWJqeS9meeahOWOn+Wni2NvbHVtbnPkuK3nmoTpnZ7ovoXliqnliJfvvIjlnKhpbmplY3RDb2x1bW5z5Lit5pyq5Ye6546w55qE5YiX77yJXHJcbiAgICAvLyDov5nkupvliJflupTor6XooqvpmpDol4/vvIjorr7nva5oaWRlSW5UYWJsZeS4unRydWXvvIlcclxuICAgIHJlbWFpbmluZ05vbkF1eGlsaWFyeUNvbHVtbnMuZm9yRWFjaCgocmVtYWluaW5nQ29sKSA9PiB7XHJcbiAgICAgIGNvbnN0IGhpZGRlbkNvbCA9IHsgLi4ucmVtYWluaW5nQ29sLCBoaWRlSW5UYWJsZTogdHJ1ZSB9O1xyXG4gICAgICByZW9yZGVyZWROb25BdXhpbGlhcnlDb2x1bW5zLnB1c2goaGlkZGVuQ29sKTtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIDYuIOaMieeFp+WOn+Wni2NvbHVtbnPnmoTpobrluo/ph43mlrDnu4TlkIjvvJrkv53mjIHovoXliqnliJfnmoTljp/lp4vkvY3nva7lkozlsZ7mgKdcclxuICAgIGNvbnN0IGZpbmFsQ29sdW1uczogUHJvVGFibGVDb2x1bW5bXSA9IFtdO1xyXG4gICAgbGV0IG5vbkF1eGlsaWFyeUluZGV4ID0gMDtcclxuICAgIGxldCBhdXhpbGlhcnlJbmRleCA9IDA7XHJcblxyXG4gICAgb3JpZ2luYWxDb2x1bW5zLmZvckVhY2goKG9yaWdpbmFsQ29sKSA9PiB7XHJcbiAgICAgIGlmIChvcmlnaW5hbENvbC5hdXhpbGlhcnlDb2x1bW4pIHtcclxuICAgICAgICAvLyDlpoLmnpzmmK/ovoXliqnliJfvvIzkvb/nlKjljp/lp4vliJfmlbDmja7vvIzlrozlhajkuI3ov5vooYzku7vkvZXkv67mlLlcclxuICAgICAgICBmaW5hbENvbHVtbnMucHVzaChvcmlnaW5hbENvbCk7XHJcbiAgICAgICAgYXV4aWxpYXJ5SW5kZXgrKztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyDlpoLmnpzmmK/pnZ7ovoXliqnliJfvvIzkvb/nlKjph43mlrDmjpLluo/lkI7nmoTliJfvvIzkvYbkv53nlZnljp/lp4vliJfnmoTmiYDmnInlsZ7mgKdcclxuICAgICAgICBjb25zdCByZW9yZGVyZWRDb2wgPSByZW9yZGVyZWROb25BdXhpbGlhcnlDb2x1bW5zW25vbkF1eGlsaWFyeUluZGV4XTtcclxuICAgICAgICBpZiAocmVvcmRlcmVkQ29sKSB7XHJcbiAgICAgICAgICAvLyDlkIjlubbljp/lp4vliJflkozph43mlrDmjpLluo/lkI7nmoTliJfvvIznoa7kv53kv53nlZnmiYDmnInljp/lp4vlsZ7mgKdcclxuICAgICAgICAgIGNvbnN0IG1lcmdlZENvbCA9IHsgLi4ub3JpZ2luYWxDb2wsIC4uLnJlb3JkZXJlZENvbCB9O1xyXG4gICAgICAgICAgZmluYWxDb2x1bW5zLnB1c2gobWVyZ2VkQ29sKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgLy8g5aaC5p6c6YeN5paw5o6S5bqP5ZCO55qE5YiX5LiN5a2Y5Zyo77yM5L2/55So5Y6f5aeL5YiXXHJcbiAgICAgICAgICBmaW5hbENvbHVtbnMucHVzaChvcmlnaW5hbENvbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG5vbkF1eGlsaWFyeUluZGV4Kys7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5mb3JtYXRlSW5uZXJDb2x1bW5zKGZpbmFsQ29sdW1ucyk7XHJcbiAgfVxyXG5cclxuICAvLyDpgJrov4cgUHJveHkg55uR5ZCsIF9zZWFyY2hQYXJhbXMg55qE5bGe5oCn5Y+Y5pu0XHJcbiAgcHJpdmF0ZSBjcmVhdGVTZWFyY2hQYXJhbXNQcm94eSh0YXJnZXQ6IGFueSkge1xyXG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICBjb25zdCBoYW5kbGVyOiBQcm94eUhhbmRsZXI8YW55PiA9IHtcclxuICAgICAgc2V0KG9iajogYW55LCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wsIHZhbHVlOiBhbnkpIHtcclxuICAgICAgICBjb25zdCBrZXkgPSBTdHJpbmcocHJvcCk7XHJcbiAgICAgICAgY29uc3Qgb2xkVmFsID0gb2JqW2tleV07XHJcbiAgICAgICAgaWYgKG9sZFZhbCA9PT0gdmFsdWUpIHtcclxuICAgICAgICAgIG9ialtrZXldID0gdmFsdWU7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgb2JqW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgc2VsZi5vblZhbHVlc0NoYW5nZS5lbWl0KHtcclxuICAgICAgICAgICAga2V5LFxyXG4gICAgICAgICAgICB2YWx1ZSxcclxuICAgICAgICAgICAgcGFyYW1zOiBzZWxmLmdldFNlYXJjaFBhcmFtcygpLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge31cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfSxcclxuICAgIH07XHJcbiAgICByZXR1cm4gbmV3IFByb3h5KHRhcmdldCwgaGFuZGxlcik7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsZWFyRW1wdHlTZWFyY2hQYXJhbXMoKSB7XHJcbiAgICBjb25zdCBjbG9uZVNlYXJjaFBhcmFtcyA9IGNsb25lRGVlcCh0aGlzLl9zZWFyY2hQYXJhbXMpO1xyXG4gICAgcmV0dXJuIGNsb25lU2VhcmNoUGFyYW1zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBidWlsZFNlcnZlclNvcnRQYXlsb2FkKCkge1xyXG4gICAgLy8g5p6E5bu65r+A5rS75o6S5bqP6ZuG5ZCI77yI5oyJ5LyY5YWI57qn5LuO5L2O5Yiw6auY77yM5pyr5bC+5LyY5YWI77yJXHJcbiAgICBjb25zdCBhY3RpdmVLZXlzID0gdGhpcy5fc29ydFByaW9yaXR5LmZpbHRlcigoaykgPT4gISF0aGlzLl9zb3J0TWFwW2tdKTtcclxuICAgIGlmIChhY3RpdmVLZXlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XHJcbiAgICBjb25zdCBzb3J0cyA9IGFjdGl2ZUtleXMubWFwKChmaWVsZCkgPT4ge1xyXG4gICAgICAvLyDmn6Xmib7lr7nlupTnmoTliJfphY3nva7vvIzkvJjlhYjkvb/nlKhzb3J0TmFtZeWtl+autVxyXG4gICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLl9jb2x1bW5zLmZpbmQoKGNvbCkgPT4gY29sLnByb3AgPT09IGZpZWxkKTtcclxuICAgICAgY29uc3Qgc29ydEZpZWxkID0gY29sdW1uPy5zb3J0TmFtZSB8fCBmaWVsZDtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBmaWVsZDogc29ydEZpZWxkLFxyXG4gICAgICAgIG9yZGVyOiB0aGlzLl9zb3J0TWFwW2ZpZWxkXSEsXHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuICAgIGlmICh0aGlzLm11bHRpcGxlU29ydCkge1xyXG4gICAgICByZXR1cm4gc29ydHM7IC8vIOS7peaVsOe7hOW9ouW8j+aPkOS6pOWkmuWIl+aOkuW6j1xyXG4gICAgfVxyXG4gICAgY29uc3QgW2ZpcnN0XSA9IHNvcnRzO1xyXG4gICAgcmV0dXJuIGZpcnN0OyAvLyDlhbzlrrnljZXliJfnu5PmnoQgeyBmaWVsZCwgb3JkZXIgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzb3J0RGF0YVNvdXJjZUluUGxhY2UoKSB7XHJcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodGhpcy5kYXRhU291cmNlKSB8fCB0aGlzLmRhdGFTb3VyY2UubGVuZ3RoID09PSAwKSByZXR1cm47XHJcbiAgICBjb25zdCBhY3RpdmVLZXlzID0gdGhpcy5fc29ydFByaW9yaXR5LmZpbHRlcigoaykgPT4gISF0aGlzLl9zb3J0TWFwW2tdKTtcclxuICAgIGlmIChhY3RpdmVLZXlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xyXG5cclxuICAgIC8vIOWkjeWItuS4gOS7veS8mOWFiOe6p++8jOS7juWJjeWIsOWQjuS8mOWFiOe6p+S7juS9juWIsOmrmO+8iOacgOWQjuiuvue9rueahOWtl+auteS8mOWFiO+8iVxyXG4gICAgY29uc3Qga2V5c0luUHJpb3JpdHkgPSBbLi4uYWN0aXZlS2V5c107XHJcbiAgICB0aGlzLmRhdGFTb3VyY2Uuc29ydCgoYTogYW55LCBiOiBhbnkpID0+IHtcclxuICAgICAgZm9yIChsZXQgaSA9IGtleXNJblByaW9yaXR5Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgY29uc3QgZmllbGQgPSBrZXlzSW5Qcmlvcml0eVtpXTtcclxuICAgICAgICBjb25zdCBvcmRlciA9IHRoaXMuX3NvcnRNYXBbZmllbGRdITtcclxuICAgICAgICBjb25zdCBhdiA9IGE/LltmaWVsZF07XHJcbiAgICAgICAgY29uc3QgYnYgPSBiPy5bZmllbGRdO1xyXG4gICAgICAgIGNvbnN0IGNtcCA9IHRoaXMuY29tcGFyZVZhbHVlcyhhdiwgYnYpO1xyXG4gICAgICAgIGlmIChjbXAgIT09IDApIHJldHVybiBvcmRlciA9PT0gXCJhc2NlbmRcIiA/IGNtcCA6IC1jbXA7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY29tcGFyZVZhbHVlcyhhVmFsOiBhbnksIGJWYWw6IGFueSk6IG51bWJlciB7XHJcbiAgICBpZiAoYVZhbCA9PSBudWxsICYmIGJWYWwgPT0gbnVsbCkgcmV0dXJuIDA7XHJcbiAgICBpZiAoYVZhbCA9PSBudWxsKSByZXR1cm4gLTE7XHJcbiAgICBpZiAoYlZhbCA9PSBudWxsKSByZXR1cm4gMTtcclxuICAgIGlmIChhVmFsIGluc3RhbmNlb2YgRGF0ZSAmJiBiVmFsIGluc3RhbmNlb2YgRGF0ZSkge1xyXG4gICAgICByZXR1cm4gYVZhbC5nZXRUaW1lKCkgLSBiVmFsLmdldFRpbWUoKTtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgYVZhbCA9PT0gXCJib29sZWFuXCIgJiYgdHlwZW9mIGJWYWwgPT09IFwiYm9vbGVhblwiKSB7XHJcbiAgICAgIHJldHVybiBhVmFsID09PSBiVmFsID8gMCA6IGFWYWwgPyAxIDogLTE7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIGFWYWwgPT09IFwibnVtYmVyXCIgJiYgdHlwZW9mIGJWYWwgPT09IFwibnVtYmVyXCIpIHtcclxuICAgICAgcmV0dXJuIGFWYWwgLSBiVmFsO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBhVmFsID09PSBcInN0cmluZ1wiICYmIHR5cGVvZiBiVmFsID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgIHJldHVybiBhVmFsLmxvY2FsZUNvbXBhcmUoYlZhbCk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBhTnVtID0gTnVtYmVyKGFWYWwpO1xyXG4gICAgY29uc3QgYk51bSA9IE51bWJlcihiVmFsKTtcclxuICAgIGlmICghaXNOYU4oYU51bSkgJiYgIWlzTmFOKGJOdW0pKSByZXR1cm4gYU51bSAtIGJOdW07XHJcbiAgICByZXR1cm4gU3RyaW5nKGFWYWwpLmxvY2FsZUNvbXBhcmUoU3RyaW5nKGJWYWwpKTtcclxuICB9XHJcblxyXG4gIC8vIOaJp+ihjCBhdXRvQ29tcGxldGUg5pWw5o2u5rqQ5p+l6K+i77yI5a6e6ZmF5omn6KGM6YC76L6R77yJXHJcbiAgcHJpdmF0ZSBleGVjdXRlQXV0b0NvbXBsZXRlRGF0YVNvdXJjZShldmVudDogRXZlbnQsIGNvbHVtbjogUHJvVGFibGVDb2x1bW4pIHtcclxuICAgIGNvbnN0IGZpZWxkS2V5ID0gY29sdW1uLmZpZWxkUHJvcHM/Lm5hbWUgfHwgY29sdW1uLnByb3A7XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICAoY29sdW1uLmZpZWxkUHJvcHMgYXMgQXV0b0NvbXBsZXRlRmllbGRQcm9wcykuZGF0YVNvdXJjZSAmJlxyXG4gICAgICB0eXBlb2YgKGNvbHVtbi5maWVsZFByb3BzIGFzIEF1dG9Db21wbGV0ZUZpZWxkUHJvcHMpLmRhdGFTb3VyY2UgPT09XHJcbiAgICAgICAgXCJmdW5jdGlvblwiXHJcbiAgICApIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSAoY29sdW1uLmZpZWxkUHJvcHMgYXMgQXV0b0NvbXBsZXRlRmllbGRQcm9wcykuZGF0YVNvdXJjZShcclxuICAgICAgICAgIGV2ZW50XHJcbiAgICAgICAgKTtcclxuICAgICAgICAvLyDlpoLmnpzov5Tlm57nmoTmmK8gUHJvbWlzZe+8jOWkhOeQhuW8guatpee7k+aenFxyXG4gICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XHJcbiAgICAgICAgICByZXN1bHRcclxuICAgICAgICAgICAgLnRoZW4oKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLl9hdXRvQ29tcGxldGVEYXRhU291cmNlc1tmaWVsZEtleV0gPSBkYXRhIHx8IFtdO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkF1dG9Db21wbGV0ZSBkYXRhU291cmNlIGVycm9yOlwiLCBlcnJvcik7XHJcbiAgICAgICAgICAgICAgdGhpcy5fYXV0b0NvbXBsZXRlRGF0YVNvdXJjZXNbZmllbGRLZXldID0gW107XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyDlkIzmraXov5Tlm57nu5PmnpxcclxuICAgICAgICAgIHRoaXMuX2F1dG9Db21wbGV0ZURhdGFTb3VyY2VzW2ZpZWxkS2V5XSA9IHJlc3VsdCB8fCBbXTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkF1dG9Db21wbGV0ZSBkYXRhU291cmNlIGVycm9yOlwiLCBlcnJvcik7XHJcbiAgICAgICAgdGhpcy5fYXV0b0NvbXBsZXRlRGF0YVNvdXJjZXNbZmllbGRLZXldID0gW107XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRTZWFyY2hQYXJhbXMob3B0aW9ucz86IHtcclxuICAgIHVzZVNhdmVkPzogYm9vbGVhbjsgLy8g5L2/55So5pyA6L+R5LiA5qyh5p+l6K+i5o+Q5Lqk55qE5Y+C5pWw77yM6buY6K6k5Li6IGZhbHNl77ybZmFsc2Ug5Li65b2T5YmN6KGo5Y2V5YC8XHJcbiAgfSk6IGFueSB7XHJcbiAgICBjb25zdCB7IHVzZVNhdmVkID0gZmFsc2UgfSA9IG9wdGlvbnMgfHwge307XHJcbiAgICBjb25zdCByYXdQYXJhbXMgPSB1c2VTYXZlZCA/IHRoaXMuX3NhdmVkU2VhcmNoUGFyYW1zIDogdGhpcy5fc2VhcmNoUGFyYW1zO1xyXG4gICAgY29uc3QgcGFyYW1zID0gY2xvbmVEZWVwKHJhd1BhcmFtcyB8fCB7fSk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgcGFyYW1zLFxyXG4gICAgICBwYWdlSW5mbzoge1xyXG4gICAgICAgIHBhZ2VJbmRleDogdGhpcy5fcGFnZUluZm8ucGFnZUluZGV4LFxyXG4gICAgICAgIHBhZ2VTaXplOiB0aGlzLl9wYWdlSW5mby5wYWdlU2l6ZSxcclxuICAgICAgfSxcclxuICAgICAgLy8g5Zyo57q/5o6S5bqP5qih5byP77ya5oqK5o6S5bqP5a+56LGh5o+Q5Lqk57uZ5o6l5Y+jXHJcbiAgICAgIC4uLih0aGlzLnNvcnRNb2RlID09PSBcInNlcnZlclwiXHJcbiAgICAgICAgPyB7IHNvcnQ6IHRoaXMuYnVpbGRTZXJ2ZXJTb3J0UGF5bG9hZCgpIH1cclxuICAgICAgICA6IHt9KSxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVsb2FkKGFmdGVyRGVsZXRlPzogYm9vbGVhbikge1xyXG4gICAgdGhpcy5oYW5kbGVRdWVyeShhZnRlckRlbGV0ZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0RmllbGRzVmFsdWUoZmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XHJcbiAgICBPYmplY3Qua2V5cyhmaWVsZHMpLmZvckVhY2goKGspID0+IHtcclxuICAgICAgdGhpcy5fc2VhcmNoUGFyYW1zW2tdID0gZmllbGRzW2tdOyAvLyDkv53nlZkgUHJveHnvvIzpgJDpobnotYvlgLzop6blj5Hmi6bmiKpcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEZpZWxkVmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcclxuICAgIHRoaXMuX3NlYXJjaFBhcmFtc1trZXldID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xlYXJTZWxlY3RlZFJvdygpIHtcclxuICAgIHRoaXMuX3NlbGVjdGVkVGFibGVSb3cgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHNldENvbHVtbnMoXHJcbiAgICBjb2x1bW5zOiBQcm9UYWJsZUNvbHVtbltdLFxyXG4gICAgb3B0aW9ucz86IHtcclxuICAgICAgcmVsb2FkPzogYm9vbGVhbjsgLy8g5piv5ZCm6YeN5paw5Yqg6L295pWw5o2u77yM6buY6K6k5Li6IGZhbHNlXHJcbiAgICB9XHJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyDmm7TmlrAgY29sdW1ucyDovpPlhaXlsZ7mgKdcclxuICAgIHRoaXMuY29sdW1ucyA9IGNsb25lRGVlcChjb2x1bW5zKTtcclxuXHJcbiAgICAvLyDph43mlrDmoLzlvI/ljJblhoXpg6jliJdcclxuICAgIHRoaXMuZm9ybWF0ZUlubmVyQ29sdW1ucyh0aGlzLmNvbHVtbnMpO1xyXG5cclxuICAgIC8vIOmHjeaWsOiuvue9ruaQnOe0ouWPguaVsO+8iOW8guatpeaTjeS9nO+8iVxyXG4gICAgLy8g5YWI5riF56m65pen55qE5pCc57Si5Y+C5pWw77yM6YG/5YWN5pen5pWw5o2u5q6L55WZXHJcbiAgICB0aGlzLl9zZWFyY2hQYXJhbXMgPSB7fTtcclxuICAgIGF3YWl0IHRoaXMuc2V0U2VhcmNoUGFyYW1zKHRoaXMuY29sdW1ucyk7XHJcblxyXG4gICAgLy8g6YeN5paw5Yib5bu6IFByb3h577yM56Gu5L+d6KGo5Y2V6aG55YC85Y+Y5YyW6IO95q2j5bi46Kem5Y+R5LqL5Lu2XHJcbiAgICB0aGlzLl9zZWFyY2hQYXJhbXMgPSB0aGlzLmNyZWF0ZVNlYXJjaFBhcmFtc1Byb3h5KHRoaXMuX3NlYXJjaFBhcmFtcyk7XHJcblxyXG4gICAgLy8g6YeN5paw5rOo5YaM5qih5p2/77yI5aaC5p6c57uE5Lu25bey57uP5Yid5aeL5YyW5a6M5oiQ77yJXHJcbiAgICBpZiAodGhpcy5hbGxUZW1wbGF0ZXMpIHtcclxuICAgICAgdGhpcy5hdXRvUmVnaXN0ZXJUZW1wbGF0ZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDlpoLmnpzorr7nva7kuoYgcmVsb2FkIOmAiemhueS4uiB0cnVl77yM5YiZ6YeN5paw5p+l6K+i5pWw5o2uXHJcbiAgICBpZiAob3B0aW9ucz8ucmVsb2FkID09PSB0cnVlKSB7XHJcbiAgICAgIHRoaXMuaGFuZGxlUXVlcnkoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRTZWxlY3RlZFJvd0RhdGE8VCA9IGFueT4oKTogVCB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRDaGVja2VkUm93czxUID0gYW55PigpOiBUW10ge1xyXG4gICAgaWYgKCF0aGlzLnNob3dDaGVja2JveCkge1xyXG4gICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcbiAgICAvLyDov5Tlm57lvZPliY3mlbDmja7mupDkuK3miYDmnIkgY2hlY2tlZCDkuLogdHJ1ZSDnmoTpoblcclxuICAgIC8vIOazqOaEj++8muWmguaenOmcgOimgeiOt+WPluaJgOaciemhteeahOmAieS4remhue+8jOmcgOimgemBjeWOhuaJgOacieaVsOaNrua6kOaIluS9v+eUqCBfc2VsZWN0ZWRSb3dJZHNcclxuICAgIHJldHVybiB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyKChyb3cpID0+IHJvdy5jaGVja2VkID09PSB0cnVlKSBhcyBUW107XHJcbiAgfVxyXG5cclxuICAvLyDojrflj5bmjIflrprlkI3np7DnmoTmqKHmnb9cclxuICBnZXRUZW1wbGF0ZShuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbCB7XHJcbiAgICBpZiAoIW5hbWUpIHJldHVybiBudWxsO1xyXG4gICAgdHJ5IHtcclxuICAgICAgLy8g6aaW5YWI5LuO6Ieq5a6a5LmJ5qih5p2/5Lit5p+l5om+XHJcbiAgICAgIGNvbnN0IGN1c3RvbVRlbXBsYXRlID0gdGhpcy5jdXN0b21UZW1wbGF0ZXMuZ2V0KG5hbWUpO1xyXG4gICAgICBpZiAoY3VzdG9tVGVtcGxhdGUpIHtcclxuICAgICAgICByZXR1cm4gY3VzdG9tVGVtcGxhdGU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIOeEtuWQjuS7jumAmueUqOaooeadv+aYoOWwhOS4reafpeaJvlxyXG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGVNYXAuZ2V0KG5hbWUpO1xyXG4gICAgICBpZiAodGVtcGxhdGUpIHtcclxuICAgICAgICByZXR1cm4gdGVtcGxhdGU7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFRvb2xUaXBUZXh0VmFsdWUoY29sdW1uOiBQcm9UYWJsZUNvbHVtbiwgZGF0YTogYW55KTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGtleSA9XHJcbiAgICAgIGNvbHVtbi5jdXN0b21SZW5kZXIgJiYgdGhpcy5nZXRUZW1wbGF0ZShjb2x1bW4uY3VzdG9tUmVuZGVyKVxyXG4gICAgICAgID8gXCJcIlxyXG4gICAgICAgIDogY29sdW1uLmVsbGlwc2lzXHJcbiAgICAgICAgPyBjb2x1bW4ucHJvcFxyXG4gICAgICAgIDogXCJcIjtcclxuICAgIHJldHVybiAha2V5ID8gXCJcIiA6IGRhdGFba2V5XTtcclxuICB9XHJcblxyXG4gIGdldFRhYmxlUm93Q2hlY2tlZChkYXRhOiBhbnkpIHtcclxuICAgIC8vIOWQr+eUqOWkjemAieahhuaXtu+8muihjOmrmOS6ruW6lOS4juWkjemAieahhumAieS4reeKtuaAgeS4gOiHtO+8iOaUr+aMgeWkmumAie+8iVxyXG4gICAgaWYgKHRoaXMuc2hvd0NoZWNrYm94KSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmlzUm93Q2hlY2tlZChkYXRhKTtcclxuICAgIH1cclxuICAgIC8vIOacquWQr+eUqOWkjemAieahhuaXtu+8muS7jeeEtuS9v+eUqOWNlemAieihjOmrmOS6rlxyXG4gICAgaWYgKCF0aGlzLl9zZWxlY3RlZFRhYmxlUm93KSByZXR1cm4gZmFsc2U7XHJcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy5fc2VsZWN0ZWRUYWJsZVJvdykgPT09IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xyXG4gIH1cclxuXHJcbiAgLy8g5qOA5p+l6KGM5piv5ZCm6KKr56aB55SoXHJcbiAgaXNSb3dEaXNhYmxlZChkYXRhOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5zaG93Q2hlY2tib3gpIHJldHVybiBmYWxzZTtcclxuICAgIHJldHVybiB0aGlzLnJvd0Rpc2FibGVkID8gdGhpcy5yb3dEaXNhYmxlZChkYXRhKSA6IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLy8g5qOA5p+l6KGM5piv5ZCm6KKr5aSN6YCJ5qGG6YCJ5Lit77yI5pWw5o2u6amx5Yqo5qih5byP77yJXHJcbiAgaXNSb3dDaGVja2VkKGRhdGE6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCF0aGlzLnNob3dDaGVja2JveCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgLy8g55u05o6l6K+75Y+W5pWw5o2u5a+56LGh55qEIGNoZWNrZWQg5bGe5oCnXHJcbiAgICByZXR1cm4gZGF0YS5jaGVja2VkID09PSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8g5YiH5o2i6KGM55qE6YCJ5Lit54q25oCB77yI5pWw5o2u6amx5Yqo5qih5byP77yM5L+d55WZ55So5LqO5YW85a6577yJXHJcbiAgdG9nZ2xlUm93Q2hlY2tlZChkYXRhOiBhbnksIGNoZWNrZWQ6IGJvb2xlYW4sIGV2ZW50PzogRXZlbnQpIHtcclxuICAgIGlmIChldmVudCkge1xyXG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgLy8g6Zi75q2i5LqL5Lu25YaS5rOh77yM6YG/5YWN6Kem5Y+R6KGM54K55Ye7XHJcbiAgICB9XHJcbiAgICAvLyDlpoLmnpzooYzooqvnpoHnlKjvvIzkuI3lhYHorrjliIfmjaLpgInkuK3nirbmgIFcclxuICAgIGlmICh0aGlzLmlzUm93RGlzYWJsZWQoZGF0YSkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOebtOaOpeiuvue9ruaVsOaNruWvueixoeeahCBjaGVja2VkIOWxnuaAp1xyXG4gICAgZGF0YS5jaGVja2VkID0gY2hlY2tlZDtcclxuXHJcbiAgICAvLyDlkIzmraXmm7TmlrAgX3NlbGVjdGVkUm93SWRz77yI55So5LqO6Leo6aG16YCJ5Lit77yJXHJcbiAgICBjb25zdCBpZCA9IHRoaXMuZ2V0Um93SWQoZGF0YSk7XHJcbiAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBpZiAoY2hlY2tlZCkge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkUm93SWRzLmFkZChpZCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRSb3dJZHMuZGVsZXRlKGlkKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIOWQjOatpeabtOaWsCBfc2VsZWN0ZWRSb3dz77yI55So5LqO5YW85a655oCn77yJXHJcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuX3NlbGVjdGVkUm93cy5maW5kSW5kZXgoKHJvdykgPT5cclxuICAgICAgdGhpcy5pc1NhbWVSb3cocm93LCBkYXRhKVxyXG4gICAgKTtcclxuICAgIGlmIChjaGVja2VkKSB7XHJcbiAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZFJvd3MucHVzaChkYXRhKTtcclxuICAgICAgfVxyXG4gICAgICAvLyDli77pgInlpI3pgInmoYbml7blkIzmraXorr7nva7pq5jkuq7pgInkuK3ooYxcclxuICAgICAgdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyA9IGRhdGE7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkUm93cy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIOiLpeW9k+WJjemrmOS6ruihjOS4uuivpeihjO+8jOWImeWPlua2iOmrmOS6rlxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyAmJlxyXG4gICAgICAgIHRoaXMuaXNTYW1lUm93KHRoaXMuX3NlbGVjdGVkVGFibGVSb3csIGRhdGEpXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkVGFibGVSb3cgPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy51cGRhdGVDaGVja0FsbFN0YXR1cygpO1xyXG4gIH1cclxuXHJcbiAgLy8g5pu05paw5YWo6YCJ54q25oCB77yI5pWw5o2u6amx5Yqo5qih5byP77yJXHJcbiAgdXBkYXRlQ2hlY2tBbGxTdGF0dXMoKSB7XHJcbiAgICBpZiAoIXRoaXMuc2hvd0NoZWNrYm94IHx8ICFBcnJheS5pc0FycmF5KHRoaXMuZGF0YVNvdXJjZSkpIHtcclxuICAgICAgdGhpcy5fY2hlY2tlZEFsbCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLl9pbmRldGVybWluYXRlID0gZmFsc2U7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIOWPquiuoeeul+WPr+eUqOeahOihjO+8iOacquemgeeUqOeahOihjO+8iVxyXG4gICAgY29uc3QgYXZhaWxhYmxlUm93cyA9IHRoaXMuZGF0YVNvdXJjZS5maWx0ZXIoXHJcbiAgICAgIChyb3cpID0+ICF0aGlzLmlzUm93RGlzYWJsZWQocm93KVxyXG4gICAgKTtcclxuICAgIC8vIOWfuuS6juaVsOaNruWvueixoeeahCBjaGVja2VkIOWxnuaAp+iuoeeul1xyXG4gICAgY29uc3QgY2hlY2tlZENvdW50ID0gYXZhaWxhYmxlUm93cy5maWx0ZXIoXHJcbiAgICAgIChyb3cpID0+IHJvdy5jaGVja2VkID09PSB0cnVlXHJcbiAgICApLmxlbmd0aDtcclxuICAgIGNvbnN0IHRvdGFsQ291bnQgPSBhdmFpbGFibGVSb3dzLmxlbmd0aDtcclxuICAgIHRoaXMuX2NoZWNrZWRBbGwgPVxyXG4gICAgICB0b3RhbENvdW50ID4gMCAmJiBjaGVja2VkQ291bnQgPiAwICYmIGNoZWNrZWRDb3VudCA9PT0gdG90YWxDb3VudDtcclxuICAgIHRoaXMuX2luZGV0ZXJtaW5hdGUgPSBjaGVja2VkQ291bnQgPiAwICYmIGNoZWNrZWRDb3VudCA8IHRvdGFsQ291bnQ7XHJcbiAgfVxyXG5cclxuICAvLyDlhajpgIkv5Y+W5raI5YWo6YCJ77yI5pWw5o2u6amx5Yqo5qih5byP77yJXHJcbiAgdG9nZ2xlQ2hlY2tBbGwoY2hlY2tlZDogYm9vbGVhbiwgZXZlbnQ/OiBFdmVudCkge1xyXG4gICAgaWYgKGV2ZW50KSB7XHJcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOWPquWkhOeQhuWPr+eUqOeahOihjO+8iOacquemgeeUqOeahOihjO+8iVxyXG4gICAgY29uc3QgYXZhaWxhYmxlUm93cyA9IHRoaXMuZGF0YVNvdXJjZS5maWx0ZXIoXHJcbiAgICAgIChyb3cpID0+ICF0aGlzLmlzUm93RGlzYWJsZWQocm93KVxyXG4gICAgKTtcclxuXHJcbiAgICAvLyDmibnph4/orr7nva4gY2hlY2tlZCDlsZ7mgKdcclxuICAgIGF2YWlsYWJsZVJvd3MuZm9yRWFjaCgocm93KSA9PiB7XHJcbiAgICAgIHJvdy5jaGVja2VkID0gY2hlY2tlZDtcclxuXHJcbiAgICAgIC8vIOWQjOatpeabtOaWsCBfc2VsZWN0ZWRSb3dJZHPvvIjnlKjkuo7ot6jpobXpgInkuK3vvIlcclxuICAgICAgY29uc3QgaWQgPSB0aGlzLmdldFJvd0lkKHJvdyk7XHJcbiAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgaWYgKGNoZWNrZWQpIHtcclxuICAgICAgICAgIHRoaXMuX3NlbGVjdGVkUm93SWRzLmFkZChpZCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuX3NlbGVjdGVkUm93SWRzLmRlbGV0ZShpZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyDlkIzmraXmm7TmlrAgX3NlbGVjdGVkUm93c++8iOeUqOS6juWFvOWuueaAp++8iVxyXG4gICAgaWYgKGNoZWNrZWQpIHtcclxuICAgICAgdGhpcy5fc2VsZWN0ZWRSb3dzID0gWy4uLmF2YWlsYWJsZVJvd3NdO1xyXG4gICAgICAvLyDlkIzmraXorr7nva7pq5jkuq7pgInkuK3ooYzkuLrnrKzkuIDmnaHlj6/pgInmlbDmja5cclxuICAgICAgdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyA9XHJcbiAgICAgICAgYXZhaWxhYmxlUm93cy5sZW5ndGggPiAwID8gYXZhaWxhYmxlUm93c1swXSA6IG51bGw7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9zZWxlY3RlZFJvd3MgPSBbXTtcclxuICAgICAgLy8g5Y+W5raI6auY5LquXHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkVGFibGVSb3cgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXBkYXRlQ2hlY2tBbGxTdGF0dXMoKTtcclxuICB9XHJcblxyXG4gIC8vIOiOt+WPlumAieS4reeahOihjOaVsOaNru+8iOS/neeVmeeUqOS6juWFvOWuueaAp++8iVxyXG4gIGdldFNlbGVjdGVkUm93cygpOiBhbnlbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRDaGVja2VkUm93cygpO1xyXG4gIH1cclxuXHJcbiAgLy8g5aSE55CG6KGMIGNoZWNrYm94IOWPmOWMluS6i+S7tu+8iOaVsOaNrumpseWKqOaooeW8j++8iVxyXG4gIGhhbmRsZVJvd0NoZWNrZWRDaGFuZ2UoZGF0YTogYW55LCBjaGVja2VkOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5pc1Jvd0Rpc2FibGVkKGRhdGEpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyDmlbDmja7lr7nosaHnmoQgY2hlY2tlZCDlsZ7mgKflt7Lnu4/pgJrov4flj4zlkJHnu5Hlrproh6rliqjmm7TmlrBcclxuICAgIC8vIOi/memHjOWPqumcgOimgeWQjOatpeabtOaWsCBfc2VsZWN0ZWRSb3dJZHMg5ZKMIF9zZWxlY3RlZFJvd3NcclxuXHJcbiAgICAvLyDlkIzmraXmm7TmlrAgX3NlbGVjdGVkUm93SWRz77yI55So5LqO6Leo6aG16YCJ5Lit77yJXHJcbiAgICBjb25zdCBpZCA9IHRoaXMuZ2V0Um93SWQoZGF0YSk7XHJcbiAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBpZiAoY2hlY2tlZCkge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkUm93SWRzLmFkZChpZCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRSb3dJZHMuZGVsZXRlKGlkKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIOWQjOatpeabtOaWsCBfc2VsZWN0ZWRSb3dz77yI55So5LqO5YW85a655oCn77yJXHJcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuX3NlbGVjdGVkUm93cy5maW5kSW5kZXgoKHJvdykgPT5cclxuICAgICAgdGhpcy5pc1NhbWVSb3cocm93LCBkYXRhKVxyXG4gICAgKTtcclxuICAgIGlmIChjaGVja2VkKSB7XHJcbiAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZFJvd3MucHVzaChkYXRhKTtcclxuICAgICAgfVxyXG4gICAgICAvLyDli77pgInlpI3pgInmoYbml7blkIzmraXorr7nva7pq5jkuq7pgInkuK3ooYxcclxuICAgICAgdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyA9IGRhdGE7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkUm93cy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIOiLpeW9k+WJjemrmOS6ruihjOS4uuivpeihjO+8jOWImeWPlua2iOmrmOS6rlxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyAmJlxyXG4gICAgICAgIHRoaXMuaXNTYW1lUm93KHRoaXMuX3NlbGVjdGVkVGFibGVSb3csIGRhdGEpXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkVGFibGVSb3cgPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5pu05paw5YWo6YCJ54q25oCBXHJcbiAgICB0aGlzLnVwZGF0ZUNoZWNrQWxsU3RhdHVzKCk7XHJcbiAgfVxyXG5cclxuICAvLyDliLfmlrDlhajpgInnirbmgIHvvIjnlKjkuo7lhbbku5blnLrmma/vvIlcclxuICByZWZyZXNoQ2hlY2tBbGxTdGF0dXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLnVwZGF0ZUNoZWNrQWxsU3RhdHVzKCk7XHJcbiAgfVxyXG5cclxuICAvLyDojrflj5booYznmoTllK/kuIDmoIfor4bvvIjnlKjkuo7ot6jpobXpgInkuK3vvIlcclxuICBwcml2YXRlIGdldFJvd0lkKGRhdGE6IGFueSk6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gZGF0YS5pZCA/PyBkYXRhLmtleSA/PyB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICAvLyDliKTmlq3kuKTooYzmmK/lkKbkuLrlkIzkuIDooYxcclxuICBwcml2YXRlIGlzU2FtZVJvdyhyb3cxOiBhbnksIHJvdzI6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgaWQxID0gdGhpcy5nZXRSb3dJZChyb3cxKTtcclxuICAgIGNvbnN0IGlkMiA9IHRoaXMuZ2V0Um93SWQocm93Mik7XHJcblxyXG4gICAgaWYgKGlkMSAhPT0gdW5kZWZpbmVkICYmIGlkMiAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHJldHVybiBpZDEgPT09IGlkMjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBmYWxsYmFjayDliLAgSlNPTiDmr5TovoNcclxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShyb3cxKSA9PT0gSlNPTi5zdHJpbmdpZnkocm93Mik7XHJcbiAgfVxyXG5cclxuICAvLyDmuIXnqbrpgInkuK3nmoTooYzvvIjmlbDmja7pqbHliqjmqKHlvI/vvIlcclxuICBjbGVhclNlbGVjdGVkUm93cygpIHtcclxuICAgIC8vIOa4heepuuW9k+WJjeaVsOaNrua6kOS4reaJgOaciemhueeahCBjaGVja2VkIOeKtuaAgVxyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5kYXRhU291cmNlKSkge1xyXG4gICAgICB0aGlzLmRhdGFTb3VyY2UuZm9yRWFjaCgocm93KSA9PiB7XHJcbiAgICAgICAgcm93LmNoZWNrZWQgPSBmYWxzZTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5riF56m66YCJ5Lit6ZuG5ZCIXHJcbiAgICB0aGlzLl9zZWxlY3RlZFJvd0lkcy5jbGVhcigpO1xyXG4gICAgdGhpcy5fc2VsZWN0ZWRSb3dzID0gW107XHJcbiAgICB0aGlzLl9jaGVja2VkQWxsID0gZmFsc2U7XHJcbiAgICB0aGlzLl9pbmRldGVybWluYXRlID0gZmFsc2U7XHJcbiAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ID0gbnVsbDtcclxuICB9XHJcblxyXG4gIGhhbmRsZUZpZWxkQ2hlY2tCb3hDaGFuZ2UoY2hlY2tCb3hPcHRpb25zOiBPcHRpb25zVHlwZVtdLCBrZXk6IHN0cmluZykge1xyXG4gICAgdGhpcy5zZXRGaWVsZHNWYWx1ZSh7XHJcbiAgICAgIFtrZXldOiBjaGVja0JveE9wdGlvbnNcclxuICAgICAgICAuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmNoZWNrZWQpXHJcbiAgICAgICAgLm1hcCgoaXRlbSkgPT4gaXRlbS52YWx1ZSksXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGhhbmRsZVNlYXJjaCgpIHtcclxuICAgIHRoaXMuX3NhdmVkU2VhcmNoUGFyYW1zID0gdGhpcy5jbGVhckVtcHR5U2VhcmNoUGFyYW1zKCk7XHJcbiAgICB0aGlzLl9wYWdlSW5mby5wYWdlSW5kZXggPSAxO1xyXG4gICAgdGhpcy5oYW5kbGVRdWVyeSgpO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlUmVzZXRGb3JtKCkge1xyXG4gICAgT2JqZWN0LmtleXModGhpcy5fc2VhcmNoUGFyYW1zKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgY29uc3QgdGFyZ2V0Q29sdW1uID0gdGhpcy5fc2VhcmNoRmlsZWRDb2x1bW5zLmZpbmQoKGl0ZW0pID0+IHtcclxuICAgICAgICByZXR1cm4gKGl0ZW0uZmllbGRQcm9wcz8ubmFtZSB8fCBpdGVtLnByb3ApID09PSBrZXk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8g5a+55LqOY2hlY2tib3jnsbvlnovvvIzpnIDopoHnibnmrorlpITnkIbpu5jorqTlgLxcclxuICAgICAgaWYgKHRhcmdldENvbHVtbj8udmFsdWVUeXBlID09PSBcImNoZWNrYm94XCIpIHtcclxuICAgICAgICAvLyDku47ljp/lp4tjb2x1bW5z6YWN572u5Lit6I635Y+W5Yid5aeL6YWN572u77yM5Lul56Gu5L+d5L2/55So5q2j56Gu55qE6buY6K6k5YC8XHJcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxDb2x1bW4gPSB0aGlzLmNvbHVtbnMuZmluZCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIChpdGVtLmZpZWxkUHJvcHM/Lm5hbWUgfHwgaXRlbS5wcm9wKSA9PT0ga2V5O1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyDku47ljp/lp4tvcHRpb25z5Lit5om+5Ye6Y2hlY2tlZOS4unRydWXnmoTpobnkvZzkuLrpu5jorqTlgLxcclxuICAgICAgICBjb25zdCBvcmlnaW5hbEZpZWxkUHJvcHMgPSBvcmlnaW5hbENvbHVtbj8uZmllbGRQcm9wcyBhc1xyXG4gICAgICAgICAgfCBDaGVja2JveEZpZWxkUHJvcHNcclxuICAgICAgICAgIHwgdW5kZWZpbmVkO1xyXG4gICAgICAgIGNvbnN0IGNoZWNrZWRWYWx1ZXMgPSAob3JpZ2luYWxGaWVsZFByb3BzPy5vcHRpb25zIHx8IFtdKVxyXG4gICAgICAgICAgLmZpbHRlcigob3B0OiBPcHRpb25zVHlwZSkgPT4gb3B0LmNoZWNrZWQpXHJcbiAgICAgICAgICAubWFwKChvcHQ6IE9wdGlvbnNUeXBlKSA9PiBvcHQudmFsdWUpO1xyXG4gICAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9XHJcbiAgICAgICAgICBjaGVja2VkVmFsdWVzLmxlbmd0aCA+IDBcclxuICAgICAgICAgICAgPyBjaGVja2VkVmFsdWVzXHJcbiAgICAgICAgICAgIDogUFJPX1RBQkxFX0RFRkFVTFRfUFJPUFNbdGFyZ2V0Q29sdW1uLnZhbHVlVHlwZV0udmFsdWU7XHJcblxyXG4gICAgICAgIHRoaXMuX3NlYXJjaFBhcmFtc1trZXldID0gZGVmYXVsdFZhbHVlO1xyXG5cclxuICAgICAgICAvLyDmoLnmja7pu5jorqTlgLzmgaLlpI1vcHRpb25z55qEY2hlY2tlZOeKtuaAge+8jOS9v+eUqOWOn+Wni29wdGlvbnPnmoTnu5PmnoRcclxuICAgICAgICBjb25zdCBkZWZhdWx0VmFsdWVzID0gQXJyYXkuaXNBcnJheShkZWZhdWx0VmFsdWUpID8gZGVmYXVsdFZhbHVlIDogW107XHJcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxPcHRpb25zID0gb3JpZ2luYWxGaWVsZFByb3BzPy5vcHRpb25zIHx8IFtdO1xyXG4gICAgICAgIGNvbnN0IHRhcmdldEZpZWxkUHJvcHMgPSB0YXJnZXRDb2x1bW4uZmllbGRQcm9wcyBhcyBDaGVja2JveEZpZWxkUHJvcHM7XHJcbiAgICAgICAgdGFyZ2V0RmllbGRQcm9wcy5vcHRpb25zID0gb3JpZ2luYWxPcHRpb25zLm1hcCgoaXRlbTogT3B0aW9uc1R5cGUpID0+IHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIC4uLml0ZW0sXHJcbiAgICAgICAgICAgIGNoZWNrZWQ6IGRlZmF1bHRWYWx1ZXMuaW5jbHVkZXMoaXRlbS52YWx1ZSksXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX3NlYXJjaFBhcmFtc1trZXldID0gdGFyZ2V0Q29sdW1uPy5maWVsZFByb3BzXHJcbiAgICAgICAgICA/IHRhcmdldENvbHVtbj8uZmllbGRQcm9wcy52YWx1ZSB8fFxyXG4gICAgICAgICAgICBQUk9fVEFCTEVfREVGQVVMVF9QUk9QU1t0YXJnZXRDb2x1bW4udmFsdWVUeXBlXS52YWx1ZVxyXG4gICAgICAgICAgOiBQUk9fVEFCTEVfREVGQVVMVF9QUk9QU1t0YXJnZXRDb2x1bW4udmFsdWVUeXBlXS52YWx1ZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5fc2F2ZWRTZWFyY2hQYXJhbXMgPSB7fTtcclxuICAgIHRoaXMuX3BhZ2VJbmZvLnBhZ2VJbmRleCA9IDE7XHJcbiAgICB0aGlzLm9uUmVzZXRGb3JtQmVmb3JlUmVsb2FkLmVtaXQoKTtcclxuICAgIHRoaXMuaGFuZGxlUXVlcnkoKTtcclxuICB9XHJcblxyXG4gIGhhbmRsZVBhZ2VJbmRleENoYW5nZShwYWdlSW5kZXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5fcGFnZUluZm8ucGFnZUluZGV4ID0gcGFnZUluZGV4O1xyXG4gICAgdGhpcy5oYW5kbGVRdWVyeSgpO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlUGFnZVNpemVDaGFuZ2UocGFnZVNpemU6IGFueSkge1xyXG4gICAgdGhpcy5fcGFnZUluZm8ucGFnZVNpemUgPSBwYWdlU2l6ZTtcclxuICAgIHRoaXMuX3BhZ2VJbmZvLnBhZ2VJbmRleCA9IDE7XHJcbiAgICB0aGlzLmhhbmRsZVF1ZXJ5KCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBoYW5kbGVRdWVyeShhZnRlckRlbGV0ZT86IGJvb2xlYW4pIHtcclxuICAgIC8vIOWIoOmZpOWQjuWIt+aWsOS4lOW9k+WJjemhteS7heWJqeS4gOadoeiusOW9leaXtu+8jOiLpeS4jeWcqOesrOS4gOmhteWImeWFiOWbnumAgOS4gOmhtVxyXG4gICAgaWYgKFxyXG4gICAgICBhZnRlckRlbGV0ZSAmJlxyXG4gICAgICBBcnJheS5pc0FycmF5KHRoaXMuZGF0YVNvdXJjZSkgJiZcclxuICAgICAgdGhpcy5kYXRhU291cmNlLmxlbmd0aCA9PT0gMSAmJlxyXG4gICAgICB0aGlzLl9wYWdlSW5mby5wYWdlSW5kZXggPiAxXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5fcGFnZUluZm8ucGFnZUluZGV4ID0gdGhpcy5fcGFnZUluZm8ucGFnZUluZGV4IC0gMTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDkv53lrZjliKDpmaTliY3nmoTmlbDmja7mupDvvIjnlKjkuo7liKDpmaTlkI7mn6Xor6Lml7bnp7vpmaTooqvliKDpmaTpobnnmoTpgInkuK3nirbmgIHvvIlcclxuICAgIGNvbnN0IHByZXZpb3VzRGF0YVNvdXJjZSA9XHJcbiAgICAgIGFmdGVyRGVsZXRlICYmIHRoaXMuc2hvd0NoZWNrYm94ID8gWy4uLnRoaXMuZGF0YVNvdXJjZV0gOiBbXTtcclxuXHJcbiAgICB0aGlzLl9sb2FkaW5nID0gdHJ1ZTtcclxuICAgIGlmICh0aGlzLnJlcXVlc3QpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJlcXVlc3Qoe1xyXG4gICAgICAgICAgcGFyYW1zOiB0aGlzLmNsZWFyRW1wdHlTZWFyY2hQYXJhbXMoKSxcclxuICAgICAgICAgIHBhZ2VJbmZvOiB7XHJcbiAgICAgICAgICAgIHBhZ2VJbmRleDogdGhpcy5fcGFnZUluZm8ucGFnZUluZGV4LFxyXG4gICAgICAgICAgICBwYWdlU2l6ZTogdGhpcy5fcGFnZUluZm8ucGFnZVNpemUsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgLy8g5Zyo57q/5o6S5bqP5qih5byP77ya5oqK5o6S5bqP5a+56LGh5o+Q5Lqk57uZ5o6l5Y+jXHJcbiAgICAgICAgICAuLi4odGhpcy5zb3J0TW9kZSA9PT0gXCJzZXJ2ZXJcIlxyXG4gICAgICAgICAgICA/IHsgc29ydDogdGhpcy5idWlsZFNlcnZlclNvcnRQYXlsb2FkKCkgfVxyXG4gICAgICAgICAgICA6IHt9KSxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8g6Ieq5Yqo5rOo5YWlIGNoZWNrZWQg5a2X5q6177yM5pSv5oyB6Leo6aG16YCJ5LitXHJcbiAgICAgICAgaWYgKHRoaXMuc2hvd0NoZWNrYm94KSB7XHJcbiAgICAgICAgICB0aGlzLmRhdGFTb3VyY2UgPSAocmVzdWx0LmRhdGEgfHwgW10pLm1hcCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBpZCA9IHRoaXMuZ2V0Um93SWQoaXRlbSk7XHJcbiAgICAgICAgICAgIC8vIOWmguaenOaVsOaNruW3suaciSBjaGVja2VkIOWxnuaAp++8jOS/neeVme+8m+WQpuWImeagueaNriBfc2VsZWN0ZWRSb3dJZHMg5Yik5patXHJcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrZWQgPVxyXG4gICAgICAgICAgICAgIGl0ZW0uY2hlY2tlZCAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgICAgICA/IGl0ZW0uY2hlY2tlZFxyXG4gICAgICAgICAgICAgICAgOiBpZCAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgICAgICA/IHRoaXMuX3NlbGVjdGVkUm93SWRzLmhhcyhpZClcclxuICAgICAgICAgICAgICAgIDogZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgLi4uaXRlbSxcclxuICAgICAgICAgICAgICBjaGVja2VkOiBjaGVja2VkLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgLy8g5Yig6Zmk5ZCO5p+l6K+i77ya56e76Zmk6KKr5Yig6Zmk6aG555qE6YCJ5Lit54q25oCBXHJcbiAgICAgICAgICBpZiAoYWZ0ZXJEZWxldGUgJiYgcHJldmlvdXNEYXRhU291cmNlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgY29uc3QgbmV3RGF0YUlkcyA9IG5ldyBTZXQoXHJcbiAgICAgICAgICAgICAgdGhpcy5kYXRhU291cmNlLm1hcCgoaXRlbSkgPT4gdGhpcy5nZXRSb3dJZChpdGVtKSlcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIC8vIOmBjeWOhuS5i+WJjeeahOaVsOaNrua6kO+8jOWmguaenOS4jeWcqOaWsOaVsOaNrua6kOS4re+8jOivtOaYjuiiq+WIoOmZpOS6hu+8jOmcgOimgea4hemZpOWFtumAieS4reeKtuaAgVxyXG4gICAgICAgICAgICBwcmV2aW91c0RhdGFTb3VyY2UuZm9yRWFjaCgob2xkSXRlbSkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IG9sZElkID0gdGhpcy5nZXRSb3dJZChvbGRJdGVtKTtcclxuICAgICAgICAgICAgICBpZiAob2xkSWQgIT09IHVuZGVmaW5lZCAmJiAhbmV3RGF0YUlkcy5oYXMob2xkSWQpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyDooqvliKDpmaTnmoTpobnvvIzku47pgInkuK3pm4blkIjkuK3np7vpmaRcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkUm93SWRzLmRlbGV0ZShvbGRJZCk7XHJcbiAgICAgICAgICAgICAgICAvLyDlpoLmnpzmlbDmja7lr7nosaHov5jlnKjlhbbku5blnLDmlrnlvJXnlKjvvIzmuIXpmaTlhbbpgInkuK3nirbmgIFcclxuICAgICAgICAgICAgICAgIGlmIChvbGRJdGVtLmNoZWNrZWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICBvbGRJdGVtLmNoZWNrZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLmRhdGFTb3VyY2UgPSByZXN1bHQuZGF0YSB8fCBbXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc3VtbWFyeURhdGEgPSByZXN1bHQuc3VtbWFyeURhdGEgfHwgbnVsbDtcclxuICAgICAgICAvLyDmnKzlnLDmjpLluo/mqKHlvI/vvJrmi7/liLDmlbDmja7lkI7lnKjliY3nq6/mjpLluo9cclxuICAgICAgICBpZiAodGhpcy5zb3J0TW9kZSA9PT0gXCJsb2NhbFwiKSB7XHJcbiAgICAgICAgICB0aGlzLnNvcnREYXRhU291cmNlSW5QbGFjZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9wYWdlSW5mby50b3RhbCA9IHJlc3VsdC50b3RhbCB8fCAwO1xyXG4gICAgICAgIC8vIOabtOaWsOWFqOmAieeKtuaAgVxyXG4gICAgICAgIGlmICh0aGlzLnNob3dDaGVja2JveCkge1xyXG4gICAgICAgICAgdGhpcy51cGRhdGVDaGVja0FsbFN0YXR1cygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFwi5p+l6K+i5aSx6LSlOlwiLCBlcnJvcik7XHJcbiAgICAgICAgdGhpcy5kYXRhU291cmNlID0gW107XHJcbiAgICAgICAgdGhpcy5fcGFnZUluZm8udG90YWwgPSAwO1xyXG4gICAgICAgIHRoaXMuc3VtbWFyeURhdGEgPSBudWxsO1xyXG4gICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgIHRoaXMuX2xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS53YXJuKFwi5pyq5o+Q5L6bIF9yZXF1ZXN0IOWbnuiwg+WHveaVsFwiKTtcclxuICAgICAgdGhpcy5fbG9hZGluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLy8g5LiN5YaN6LCD55SoIGNsZWFyU2VsZWN0ZWRSb3dzKCnvvIzkv53nlZnot6jpobXpgInkuK3nirbmgIFcclxuICB9XHJcblxyXG4gIC8vIOinpuWPkeWIl+aOkuW6j+WPmOabtFxyXG4gIG9uU29ydENoYW5nZShzb3J0S2V5OiBzdHJpbmcsIHNvcnRPcmRlcjogXCJhc2NlbmRcIiB8IFwiZGVzY2VuZFwiIHwgbnVsbCkge1xyXG4gICAgLy8g5Y2V5YiX5o6S5bqP77ya6YeN572u5YW25a6D5YiX77yb5aSa5YiX5o6S5bqP77ya5L+d55WZ5YW25a6D5YiXXHJcbiAgICBpZiAoIXRoaXMubXVsdGlwbGVTb3J0KSB7XHJcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuX3NvcnRNYXApLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICAgIGlmIChrZXkgIT09IHNvcnRLZXkpIHRoaXMuX3NvcnRNYXBba2V5XSA9IG51bGw7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fc29ydE1hcFtzb3J0S2V5XSA9IHNvcnRPcmRlcjtcclxuXHJcbiAgICAvLyDnu7TmiqTkvJjlhYjnuqfpmJ/liJfvvJrmnInluo/liJfkuJTpnZ7nqbogLT4g572u5LqO5pyr5bC+77yb5Li656m6IC0+IOenu+mZpFxyXG4gICAgdGhpcy5fc29ydFByaW9yaXR5ID0gdGhpcy5fc29ydFByaW9yaXR5LmZpbHRlcigoaykgPT4gayAhPT0gc29ydEtleSk7XHJcbiAgICBpZiAoc29ydE9yZGVyKSB7XHJcbiAgICAgIHRoaXMuX3NvcnRQcmlvcml0eS5wdXNoKHNvcnRLZXkpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnNvcnRNb2RlID09PSBcImxvY2FsXCIpIHtcclxuICAgICAgdGhpcy5zb3J0RGF0YVNvdXJjZUluUGxhY2UoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIOWcqOe6v+aOkuW6j++8mumHjeaWsOivt+axglxyXG4gICAgICB0aGlzLmhhbmRsZVF1ZXJ5KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRTb3J0T3JkZXIoc29ydEtleTogc3RyaW5nKTogXCJhc2NlbmRcIiB8IFwiZGVzY2VuZFwiIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5fc29ydE1hcFtzb3J0S2V5XSB8fCBudWxsO1xyXG4gIH1cclxuXHJcbiAgaGFuZGxlVGFibGVSb3dDbGljayhkYXRhOiBhbnkpIHtcclxuICAgIHRoaXMuX3NlbGVjdGVkVGFibGVSb3cgPSBkYXRhO1xyXG4gICAgLy8g5aaC5p6c5byA5ZCv5LqG5aSN6YCJ5qGG77yM54K55Ye76KGM5pe25Y+q6YCJ5Lit54K55Ye76KGM77yI5aaC5p6c6KGM5pyq6KKr56aB55So77yJXHJcbiAgICBpZiAodGhpcy5zaG93Q2hlY2tib3ggJiYgIXRoaXMuaXNSb3dEaXNhYmxlZChkYXRhKSkge1xyXG4gICAgICAvLyDlhYjmuIXnqbrmiYDmnInpgInkuK3ooYxcclxuICAgICAgdGhpcy5fc2VsZWN0ZWRSb3dzID0gW107XHJcbiAgICAgIC8vIOWPqumAieS4reW9k+WJjeeCueWHu+eahOihjFxyXG4gICAgICB0aGlzLnRvZ2dsZVJvd0NoZWNrZWQoZGF0YSwgdHJ1ZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLm9uUm93Q2xpY2suZW1pdCh0aGlzLl9zZWxlY3RlZFRhYmxlUm93KTtcclxuICB9XHJcblxyXG4gIGhhbmRsZVRhYmxlUm93RGJDbGljayhkYXRhOiBhbnkpIHtcclxuICAgIHRoaXMuX3NlbGVjdGVkVGFibGVSb3cgPSBkYXRhO1xyXG4gICAgdGhpcy5vblJvd0RiQ2xpY2suZW1pdCh0aGlzLl9zZWxlY3RlZFRhYmxlUm93KTtcclxuICB9XHJcblxyXG4gIGhhbmRsZUNvbHVtbnNTZXR0aW5nQ29uZmlybSgpIHtcclxuICAgIHRoaXMucXVlcnlEeW5hbWljQ29sdW1ucygpO1xyXG4gIH1cclxuXHJcbiAgLy8g5aSE55CGIGF1dG9Db21wbGV0ZSDovpPlhaXkuovku7bvvIjluKbpmLLmipbvvIlcclxuICBoYW5kbGVBdXRvQ29tcGxldGVJbnB1dChldmVudDogRXZlbnQsIGNvbHVtbjogUHJvVGFibGVDb2x1bW4pIHtcclxuICAgIGNvbnN0IGZpZWxkS2V5ID0gY29sdW1uLmZpZWxkUHJvcHM/Lm5hbWUgfHwgY29sdW1uLnByb3A7XHJcblxyXG4gICAgLy8g5aaC5p6c6K+l5a2X5q616L+Y5rKh5pyJ6Ziy5oqW5Ye95pWw77yM5Yib5bu65LiA5LiqXHJcbiAgICBpZiAoIXRoaXMuX2F1dG9Db21wbGV0ZURlYm91bmNlTWFwLmhhcyhmaWVsZEtleSkpIHtcclxuICAgICAgY29uc3QgZGVib3VuY2VkRm4gPSBkZWJvdW5jZSgoZXZ0OiBFdmVudCkgPT4ge1xyXG4gICAgICAgIC8vIOmHjeaWsOafpeaJvuWvueW6lOeahCBjb2x1bW7vvIznoa7kv53kvb/nlKjmnIDmlrDnmoTphY3nva5cclxuICAgICAgICBjb25zdCBjdXJyZW50Q29sdW1uID0gdGhpcy5fc2VhcmNoRmlsZWRDb2x1bW5zLmZpbmQoXHJcbiAgICAgICAgICAoY29sKSA9PiAoY29sLmZpZWxkUHJvcHM/Lm5hbWUgfHwgY29sLnByb3ApID09PSBmaWVsZEtleVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKGN1cnJlbnRDb2x1bW4pIHtcclxuICAgICAgICAgIHRoaXMuZXhlY3V0ZUF1dG9Db21wbGV0ZURhdGFTb3VyY2UoZXZ0LCBjdXJyZW50Q29sdW1uKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sIDMwMCk7IC8vIDMwMG1zIOmYsuaKluW7tui/n1xyXG4gICAgICB0aGlzLl9hdXRvQ29tcGxldGVEZWJvdW5jZU1hcC5zZXQoZmllbGRLZXksIGRlYm91bmNlZEZuKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDosIPnlKjpmLLmipblh73mlbBcclxuICAgIGNvbnN0IGRlYm91bmNlZEZuID0gdGhpcy5fYXV0b0NvbXBsZXRlRGVib3VuY2VNYXAuZ2V0KGZpZWxkS2V5KTtcclxuICAgIGlmIChkZWJvdW5jZWRGbikge1xyXG4gICAgICBkZWJvdW5jZWRGbihldmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyDojrflj5YgYXV0b0NvbXBsZXRlIOeahOaVsOaNrua6kFxyXG4gIGdldEF1dG9Db21wbGV0ZURhdGFTb3VyY2UoY29sdW1uOiBQcm9UYWJsZUNvbHVtbik6IGFueVtdIHtcclxuICAgIGNvbnN0IGZpZWxkS2V5ID0gY29sdW1uLmZpZWxkUHJvcHM/Lm5hbWUgfHwgY29sdW1uLnByb3A7XHJcbiAgICByZXR1cm4gdGhpcy5fYXV0b0NvbXBsZXRlRGF0YVNvdXJjZXNbZmllbGRLZXldIHx8IFtdO1xyXG4gIH1cclxuXHJcbiAgZ2V0RmllbGRQcm9wcyhjb2x1bW46IFByb1RhYmxlQ29sdW1uKTogYW55IHtcclxuICAgIHJldHVybiBjb2x1bW4uZmllbGRQcm9wcztcclxuICB9XHJcblxyXG4gIC8vIOiOt+WPluaMh+WumuWQjeensOeahGxhYmVs5qih5p2/XHJcbiAgZ2V0TGFiZWxUZW1wbGF0ZShuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBUZW1wbGF0ZVJlZjxhbnk+IHwgbnVsbCB7XHJcbiAgICBpZiAoIW5hbWUpIHJldHVybiBudWxsO1xyXG4gICAgdHJ5IHtcclxuICAgICAgLy8g6aaW5YWI5LuO6Ieq5a6a5LmJ5qih5p2/5Lit5p+l5om+XHJcbiAgICAgIGNvbnN0IGN1c3RvbVRlbXBsYXRlID0gdGhpcy5jdXN0b21UZW1wbGF0ZXMuZ2V0KG5hbWUpO1xyXG4gICAgICBpZiAoY3VzdG9tVGVtcGxhdGUpIHtcclxuICAgICAgICByZXR1cm4gY3VzdG9tVGVtcGxhdGU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIOeEtuWQjuS7jumAmueUqOaooeadv+aYoOWwhOS4reafpeaJvlxyXG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGVNYXAuZ2V0KG5hbWUpO1xyXG4gICAgICBpZiAodGVtcGxhdGUpIHtcclxuICAgICAgICByZXR1cm4gdGVtcGxhdGU7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOiOt+WPliBmb3JtLWl0ZW0g55qE5Yqo5oCB57G75ZCNXHJcbiAgZ2V0Rm9ybUl0ZW1DbGFzc05hbWUoY29sdW1uOiBQcm9UYWJsZUNvbHVtbik6IHN0cmluZyB7XHJcbiAgICBjb25zdCBmaWVsZE5hbWUgPSB0aGlzLmdldEZpZWxkUHJvcHMoY29sdW1uKS5uYW1lIHx8IGNvbHVtbi5wcm9wO1xyXG4gICAgcmV0dXJuIGBwcm8tdGFibGUtJHtmaWVsZE5hbWV9LWZvcm0taXRlbWA7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
1121
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvLXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byby10YWJsZS9zcmMvbGliL3Byby10YWJsZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLGVBQWUsRUFDZixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFFTCxRQUFRLEVBQ1IsTUFBTSxFQUVOLFdBQVcsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN2RSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFXaEYsT0FBTyxFQUFFLHVCQUF1QixFQUErQixNQUFNLFVBQVUsQ0FBQztBQUNoRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBT3BDLE1BQU0sT0FBTyxpQkFBaUI7SUFtSTVCLFlBR1UsWUFBZ0Q7UUFBaEQsaUJBQVksR0FBWixZQUFZLENBQW9DO1FBcklqRCxrQkFBYSxHQUFZLElBQUksQ0FBQztRQUU5QixpQkFBWSxHQUFZLElBQUksQ0FBQztRQUU3QixVQUFLLEdBQWtCLElBQUksQ0FBQztRQUU1QixjQUFTLEdBQVcsRUFBRSxDQUFDO1FBRXZCLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFFMUIsWUFBTyxHQUFxQixFQUFFLENBQUM7UUFFL0Isa0JBQWEsR0FBWSxJQUFJLENBQUM7UUFFOUIsa0JBQWEsR0FBWSxJQUFJLENBQUM7UUFFOUIsbUJBQWMsR0FBVyxJQUFJLENBQUM7UUFFOUIsaUJBQVksR0FBVyxJQUFJLENBQUM7UUFFNUIsZUFBVSxHQUFXLE1BQU0sQ0FBQztRQUU1QixlQUFVLEdBQVcsT0FBTyxDQUFDO1FBRTdCLGtCQUFhLEdBQVcs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SztnQ0FFTCxLQUFLOzJCQUdMLEtBQUs7MkJBRUwsS0FBSzswQkFHTCxLQUFLO2lDQUdMLEtBQUs7Z0NBRUwsS0FBSzt5QkFFTCxNQUFNOzJCQUVOLE1BQU07NkJBRU4sTUFBTTtzQ0FFTixNQUFNOzJCQUVOLFlBQVksU0FBQyxXQUFXOzhCQUV4QixZQUFZLFNBQUMsY0FBYzsyQkFFM0IsZUFBZSxTQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEFmdGVyQ29udGVudEluaXQsXHJcbiAgQ29tcG9uZW50LFxyXG4gIENvbnRlbnRDaGlsZCxcclxuICBDb250ZW50Q2hpbGRyZW4sXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEluamVjdCxcclxuICBJbnB1dCxcclxuICBPbkluaXQsXHJcbiAgT3B0aW9uYWwsXHJcbiAgT3V0cHV0LFxyXG4gIFF1ZXJ5TGlzdCxcclxuICBUZW1wbGF0ZVJlZixcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBjbG9uZURlZXAsIGhhc0luLCBpc05pbCwgZGVib3VuY2UsIGlzRXF1YWwgfSBmcm9tIFwibG9kYXNoLWVzXCI7XHJcbmltcG9ydCB7IFBST19UQUJMRV9ERUZBVUxUX0NPTFVNTiwgUFJPX1RBQkxFX0RFRkFVTFRfUFJPUFMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcclxuaW1wb3J0IHtcclxuICBBdXRvQ29tcGxldGVGaWVsZFByb3BzLFxyXG4gIENoZWNrYm94RmllbGRQcm9wcyxcclxuICBPcHRpb25zVHlwZSxcclxuICBQcm9UYWJsZUNvbHVtbixcclxuICBQcm9UYWJsZVBhZ2VJbmZvLFxyXG4gIFByb1RhYmxlUmVxdWVzdFJlc3VsdCxcclxuICBQcm9UYWJsZVZhbHVlc0NoYW5nZSxcclxuICBTZWxlY3RGaWVsZFByb3BzLFxyXG59IGZyb20gXCIuL3R5cGVcIjtcclxuaW1wb3J0IHsgUFJPX1RBQkxFX0NPTFVNTl9SRU1PVEUsIFByb1RhYmxlUmVtb3RlQ29sdW1uU2VydmljZSB9IGZyb20gXCIuL3Rva2Vuc1wiO1xyXG5pbXBvcnQgeyBpc09ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwiYXBwLXByby10YWJsZVwiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vcHJvLXRhYmxlLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmxzOiBbXCIuL3Byby10YWJsZS5jb21wb25lbnQubGVzc1wiXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFByb1RhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRJbml0IHtcclxuICBASW5wdXQoKSBzaG93U2VhcmNoQnRuOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KCkgc2hvd0NsZWFyQnRuOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KCkgdGl0bGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG5cclxuICBASW5wdXQoKSB0YWJsZU5hbWU6IHN0cmluZyA9IFwiXCI7XHJcblxyXG4gIEBJbnB1dCgpIG11bHRpUm93OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIGNvbHVtbnM6IFByb1RhYmxlQ29sdW1uW10gPSBbXTtcclxuXHJcbiAgQElucHV0KCkgc2hvd1NlYXJjaEJhcjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpIHNob3dBY3Rpb25CYXI6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKSBjb25maXJtQnRuVGV4dDogc3RyaW5nID0gXCLmn6Xor6JcIjtcclxuXHJcbiAgQElucHV0KCkgY2xlYXJCdG5UZXh0OiBzdHJpbmcgPSBcIua4heepulwiO1xyXG5cclxuICBASW5wdXQoKSBsYWJlbFdpZHRoOiBzdHJpbmcgPSBcIjkwcHhcIjtcclxuXHJcbiAgQElucHV0KCkgbGFiZWxBbGlnbjogc3RyaW5nID0gXCJyaWdodFwiO1xyXG5cclxuICBASW5wdXQoKSBmb3JtSXRlbVdpZHRoOiBzdHJpbmcgPSBcIjI3MHB4XCI7XHJcblxyXG4gIEBJbnB1dCgpIGRhdGFTb3VyY2U6IGFueVtdID0gW107XHJcblxyXG4gIEBJbnB1dCgpIGJvcmRlcmVkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KCkgb3V0ZXJCb3JkZXJlZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpIHNob3dQYWdpbmF0aW9uOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KCkgZnJvbnRQYWdpbmF0aW9uOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIHNjcm9sbDogeyB4Pzogc3RyaW5nIHwgbnVtYmVyOyB5Pzogc3RyaW5nIHwgbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgQElucHV0KCkgcmVxdWVzdDogKHBhcmFtczogYW55KSA9PiBQcm9taXNlPFByb1RhYmxlUmVxdWVzdFJlc3VsdD47XHJcblxyXG4gIEBJbnB1dCgpIHN1bW1hcnlEYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8vIOaOkuW6j+aooeW8j++8mmxvY2FsIOacrOWcsOaOkuW6j++8m3NlcnZlciDlnKjnur/mjpLluo/vvIjmj5DkuqTnu5nmjqXlj6PvvIlcclxuICBASW5wdXQoKSBzb3J0TW9kZTogXCJsb2NhbFwiIHwgXCJzZXJ2ZXJcIiA9IFwibG9jYWxcIjtcclxuXHJcbiAgQElucHV0KCkgc2hvd0NvbHVtblNldHRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8g5piv5ZCm5byA5ZCv5aSa5YiX5o6S5bqP77yI6buY6K6k5Y2V5YiX77yJXHJcbiAgQElucHV0KCkgbXVsdGlwbGVTb3J0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIHNob3dDaGVja2JveDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvLyDliKTmlq3ooYzmmK/lkKbnpoHnlKjnmoTlh73mlbBcclxuICBASW5wdXQoKSByb3dEaXNhYmxlZDogKGRhdGE6IGFueSkgPT4gYm9vbGVhbiA9ICgpID0+IGZhbHNlO1xyXG5cclxuICAvLyDmmK/lkKboh6rliqjop6blj5Hor7fmsYJcclxuICBASW5wdXQoKSBhdXRvVHJpZ2dlclJlcXVlc3Q6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBASW5wdXQoKSBjdXN0b21UYWJsZVJlbmRlcj86IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gIEBPdXRwdXQoKSBvblJvd0NsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIEBPdXRwdXQoKSBvblJvd0RiQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgQE91dHB1dCgpIG9uVmFsdWVzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxQcm9UYWJsZVZhbHVlc0NoYW5nZT4oKTtcclxuXHJcbiAgQE91dHB1dCgpIG9uUmVzZXRGb3JtQmVmb3JlUmVsb2FkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoXCJhY3Rpb25CYXJcIikgYWN0aW9uQmFyVHBsITogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgQENvbnRlbnRDaGlsZChcIkltZ0FjdGlvbkJhclwiKSBpbWdBY3Rpb25CYXJUcGwhOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICBAQ29udGVudENoaWxkcmVuKFRlbXBsYXRlUmVmKSBhbGxUZW1wbGF0ZXMhOiBRdWVyeUxpc3Q8VGVtcGxhdGVSZWY8YW55Pj47XHJcblxyXG4gIHByaXZhdGUgX3NhdmVkU2VhcmNoUGFyYW1zOiBhbnkgPSB7fTtcclxuXHJcbiAgLy8g5a2Y5YKo5omA5pyJ6Ieq5a6a5LmJ5qih5p2/55qE5byV55SoXHJcbiAgcHJpdmF0ZSBjdXN0b21UZW1wbGF0ZXMgPSBuZXcgTWFwPHN0cmluZywgVGVtcGxhdGVSZWY8YW55Pj4oKTtcclxuXHJcbiAgLy8g6K6w5b2V5ZCE5YiX5o6S5bqP54q25oCB77yaJ2FzY2VuZCcgfCAnZGVzY2VuZCcgfCBudWxsXHJcblxyXG4gIHByaXZhdGUgX3NvcnRNYXA6IFJlY29yZDxzdHJpbmcsIFwiYXNjZW5kXCIgfCBcImRlc2NlbmRcIiB8IG51bGw+ID0ge307XHJcblxyXG4gIC8vIOiusOW9leWkmuWIl+aOkuW6j+eahOS8mOWFiOe6p++8iOWQjuiuvue9rueahOS8mOWFiO+8iVxyXG4gIHByaXZhdGUgX3NvcnRQcmlvcml0eTogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgLy8g5a2Y5YKo5q+P5LiqIGF1dG9Db21wbGV0ZSDlrZfmrrXnmoTpmLLmipblh73mlbBcclxuICBwcml2YXRlIF9hdXRvQ29tcGxldGVEZWJvdW5jZU1hcDogTWFwPHN0cmluZywgKGV2ZW50OiBFdmVudCkgPT4gdm9pZD4gPVxyXG4gICAgbmV3IE1hcCgpO1xyXG5cclxuICAvLyDku4XlnKjliJ3lp4vljJbml7bov5DooYzliJfphY3nva7pooTmo4Dmn6XvvIzpgb/lhY3lkI7nu63osIPnlKjph43lpI3op6blj5FcclxuICBwcml2YXRlIF9wcmVDaGVja0RvbmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgX2NvbHVtbnM6IFByb1RhYmxlQ29sdW1uW10gPSBbXTtcclxuXHJcbiAgLy8g562b6YCJ6KGo5Y2V5pWw5o2u5a2Y5YKoXHJcbiAgX3NlYXJjaFBhcmFtczogYW55ID0ge307XHJcblxyXG4gIC8vIOetm+mAieihqOWNlWxpc3TmuLLmn5PmlbDmja5cclxuICBfc2VhcmNoRmlsZWRDb2x1bW5zOiBQcm9UYWJsZUNvbHVtbltdID0gW107XHJcblxyXG4gIF9wYWdlSW5mbzogUHJvVGFibGVQYWdlSW5mbyA9IHtcclxuICAgIHBhZ2VJbmRleDogMSxcclxuICAgIHBhZ2VTaXplOiAxNSxcclxuICAgIHRvdGFsOiAxMDAsXHJcbiAgICBwYWdlU2l6ZU9wdGlvbnM6IFsxMCwgMTUsIDIwLCA1MCwgMTAwLCA1MDAsIDEwMDBdLFxyXG4gIH07XHJcblxyXG4gIF9sb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIF9zZWxlY3RlZFRhYmxlUm93OiBhbnkgPSBudWxsO1xyXG5cclxuICAvLyDpgInkuK3nmoTooYzmlbDmja7vvIjnlKjkuo7lpI3pgInmoYbpgInmi6nvvIktIOS/neeVmeeUqOS6juWFvOWuueaAp1xyXG4gIF9zZWxlY3RlZFJvd3M6IGFueVtdID0gW107XHJcblxyXG4gIC8vIOS9v+eUqCBTZXQg5a2Y5YKo6YCJ5Lit6aG555qEIElE77yM5pSv5oyB6Leo6aG16YCJ5LitXHJcbiAgcHJpdmF0ZSBfc2VsZWN0ZWRSb3dJZHMgPSBuZXcgU2V0PHN0cmluZyB8IG51bWJlcj4oKTtcclxuXHJcbiAgLy8g5YWo6YCJ54q25oCBXHJcbiAgX2NoZWNrZWRBbGw6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8g5Y2K6YCJ54q25oCB77yI6YOo5YiG6YCJ5Lit77yJXHJcbiAgX2luZGV0ZXJtaW5hdGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLy8g6L+c56iLY29sdW1uc1xyXG4gIF9zZXJ2ZXJDb2x1bW5zOiBQcm9UYWJsZUNvbHVtbltdID0gW107XHJcblxyXG4gIC8vIOWtmOWCqCBhdXRvQ29tcGxldGUg5a2X5q6155qE5pWw5o2u5rqQXHJcbiAgX2F1dG9Db21wbGV0ZURhdGFTb3VyY2VzOiBSZWNvcmQ8c3RyaW5nLCBhbnlbXT4gPSB7fTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBAT3B0aW9uYWwoKVxyXG4gICAgQEluamVjdChQUk9fVEFCTEVfQ09MVU1OX1JFTU9URSlcclxuICAgIHByaXZhdGUgY29sdW1uUmVtb3RlOiBQcm9UYWJsZVJlbW90ZUNvbHVtblNlcnZpY2UgfCBudWxsXHJcbiAgKSB7fVxyXG5cclxuICBwcml2YXRlIGFzeW5jIGZldGNoUmVtb3RlQ29sdW1ucygpIHtcclxuICAgIGlmICghdGhpcy5jb2x1bW5SZW1vdGU/LmdldENvbCB8fCAhdGhpcy50YWJsZU5hbWUpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNvbHVtblJlbW90ZS5nZXRDb2wodGhpcy50YWJsZU5hbWUsIHRoaXMubXVsdGlSb3cpO1xyXG4gICAgICByZXR1cm4gcmVzO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHBlcnNpc3RSZW1vdGVDb2x1bW5zKGNvbHVtbnM6IGFueVtdKSB7XHJcbiAgICBpZiAoIXRoaXMuY29sdW1uUmVtb3RlPy5zZXRDb2wgfHwgIXRoaXMudGFibGVOYW1lKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5jb2x1bW5SZW1vdGUuc2V0Q29sKFxyXG4gICAgICAgIHRoaXMudGFibGVOYW1lLFxyXG4gICAgICAgIGNvbHVtbnMsXHJcbiAgICAgICAgdGhpcy5tdWx0aVJvd1xyXG4gICAgICApO1xyXG4gICAgICBpZiAocmVzdWx0ICYmIGlzT2JzZXJ2YWJsZShyZXN1bHQpKSB7XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3VsdC50b1Byb21pc2UoKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBuZ09uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX3NlYXJjaFBhcmFtcyA9IHt9O1xyXG4gICAgdGhpcy5mb3JtYXRlSW5uZXJDb2x1bW5zKHRoaXMuY29sdW1ucyk7XHJcbiAgICBhd2FpdCB0aGlzLnNldFNlYXJjaFBhcmFtcyh0aGlzLmNvbHVtbnMpO1xyXG5cclxuICAgIC8vIOS9v+eUqCBQcm94eSDljIXoo4UgX3NlYXJjaFBhcmFtc++8jOaLpuaIquihqOWNlemhueWAvOWPmOWMluW5tuWQkeWkluWPkeWHuuS6i+S7tlxyXG4gICAgdGhpcy5fc2VhcmNoUGFyYW1zID0gdGhpcy5jcmVhdGVTZWFyY2hQYXJhbXNQcm94eSh0aGlzLl9zZWFyY2hQYXJhbXMpO1xyXG4gICAgaWYgKHRoaXMuYXV0b1RyaWdnZXJSZXF1ZXN0KSB7XHJcbiAgICAgIHRoaXMuaGFuZGxlUXVlcnkoKTtcclxuICAgIH1cclxuICAgIHRoaXMucXVlcnlEeW5hbWljQ29sdW1ucygpO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xyXG4gICAgLy8g6Ieq5Yqo5rOo5YaM5omA5pyJ6Ieq5a6a5LmJ5qih5p2/XHJcbiAgICAvLyDms6jmhI/vvJrmraTml7bmiYDmnIkgQ29udGVudENoaWxkIOWSjCBDb250ZW50Q2hpbGRyZW4g6YO95bey5Yid5aeL5YyW5a6M5oiQXHJcbiAgICB0aGlzLmF1dG9SZWdpc3RlclRlbXBsYXRlcygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBwcmVDaGVja1NlcnZlckNvbHVtbnMoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmZldGNoUmVtb3RlQ29sdW1ucygpO1xyXG4gICAgaWYgKCFyZXMpIHJldHVybiBmYWxzZTtcclxuICAgIGNvbnN0IGluaXRDb2x1bW5zID0gdGhpcy5jb2x1bW5zXHJcbiAgICAgIC5maWx0ZXIoKGNvbCkgPT4gIWNvbC5hdXhpbGlhcnlDb2x1bW4pXHJcbiAgICAgIC5tYXAoKGNvbHVtbikgPT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBmaWVsZDogY29sdW1uLnByb3AsXHJcbiAgICAgICAgICBpc1Nob3c6ICFjb2x1bW4uaGlkZUluVGFibGUsIC8vIOm7mOiupOWFqOmDqOaYvuekulxyXG4gICAgICAgICAgaGVhZGVyOiBjb2x1bW4udGl0bGUsXHJcbiAgICAgICAgICBzb3J0TmFtZTogY29sdW1uLnNvcnROYW1lIHx8IG51bGwsXHJcbiAgICAgICAgfTtcclxuICAgICAgfSk7XHJcbiAgICBpZiAocmVzLmNvZGUgPT09IDApIHtcclxuICAgICAgaWYgKCFpc0VxdWFsKHJlcy5kYXRhLnRhYkNvbHVtbiwgaW5pdENvbHVtbnMpKSB7XHJcbiAgICAgICAgY29uc3QgaW5pdFJlcyA9IGF3YWl0IHRoaXMucGVyc2lzdFJlbW90ZUNvbHVtbnMoaW5pdENvbHVtbnMpO1xyXG4gICAgICAgIGlmIChpbml0UmVzKSB7XHJcbiAgICAgICAgICB0aGlzLnF1ZXJ5RHluYW1pY0NvbHVtbnMoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIuS4gOiHtFwiKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBxdWVyeUR5bmFtaWNDb2x1bW5zKCkge1xyXG4gICAgaWYgKCF0aGlzLnRhYmxlTmFtZSB8fCAhdGhpcy5jb2x1bW5SZW1vdGUpIHJldHVybjtcclxuICAgIGlmICghdGhpcy5fcHJlQ2hlY2tEb25lKSB7XHJcbiAgICAgIGNvbnN0IGNoZWNrUmVzdWx0ID0gYXdhaXQgdGhpcy5wcmVDaGVja1NlcnZlckNvbHVtbnMoKTtcclxuICAgICAgdGhpcy5fcHJlQ2hlY2tEb25lID0gdHJ1ZTtcclxuICAgICAgaWYgKCFjaGVja1Jlc3VsdCkgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5mZXRjaFJlbW90ZUNvbHVtbnMoKTtcclxuICAgIGlmICghcmVzKSByZXR1cm47XHJcbiAgICBpZiAocmVzLmNvZGUgPT09IDApIHtcclxuICAgICAgY29uc3QgX3RhYkNvbHVtbiA9IHJlcy5kYXRhLnRhYkNvbHVtbi5tYXAoKGl0ZW0pID0+IHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgdGl0bGU6IGl0ZW0uaGVhZGVyLFxyXG4gICAgICAgICAgcHJvcDogaXRlbS5maWVsZCxcclxuICAgICAgICAgIHNvcnROYW1lOiBpdGVtLnNvcnROYW1lLFxyXG4gICAgICAgICAgaGlkZUluVGFibGU6ICFpdGVtLmlzU2hvdyxcclxuICAgICAgICB9O1xyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5fc2VydmVyQ29sdW1ucyA9IF90YWJDb2x1bW47XHJcbiAgICAgIHRoaXMudXBkYXRlVGFibGVDb2x1bW5zKF90YWJDb2x1bW4pO1xyXG4gICAgfSBlbHNlIGlmIChyZXMuY29kZSA9PT0gMTApIHtcclxuICAgICAgLy8g5aaC5p6c5pyq6K6+572u5o6l5Y+j6L+U5Zue77yM6ZyA6KaB6buY6K6k6LCD55So5LiA5qyh5L+u5pS55Ye95pWw5Yid5aeL5YyW5pWw5o2uXHJcbiAgICAgIGNvbnN0IGluaXRDb2x1bW5zID0gdGhpcy5jb2x1bW5zXHJcbiAgICAgICAgLmZpbHRlcigoY29sKSA9PiAhY29sLmF1eGlsaWFyeUNvbHVtbilcclxuICAgICAgICAubWFwKChjb2x1bW4pID0+IHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGZpZWxkOiBjb2x1bW4ucHJvcCxcclxuICAgICAgICAgICAgaXNTaG93OiB0cnVlLCAvLyDpu5jorqTlhajpg6jmmL7npLpcclxuICAgICAgICAgICAgaGVhZGVyOiBjb2x1bW4udGl0bGUsXHJcbiAgICAgICAgICAgIHNvcnROYW1lOiBjb2x1bW4uc29ydE5hbWUgfHwgbnVsbCxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAvLyDosIPnlKjkv67mlLnmjqXlj6PliJ3lp4vljJbmlbDmja5cclxuICAgICAgY29uc3QgaW5pdFJlcyA9IGF3YWl0IHRoaXMucGVyc2lzdFJlbW90ZUNvbHVtbnMoaW5pdENvbHVtbnMpO1xyXG4gICAgICBpZiAoaW5pdFJlcykge1xyXG4gICAgICAgIHRoaXMucXVlcnlEeW5hbWljQ29sdW1ucygpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZvcm1hdGVJbm5lckNvbHVtbnMoY29sdW1uczogUHJvVGFibGVDb2x1bW5bXSkge1xyXG4gICAgdGhpcy5fY29sdW1ucyA9IGNvbHVtbnNcclxuICAgICAgLmZpbHRlcigoaXRlbSkgPT4gIWl0ZW0uaGlkZUluVGFibGUpXHJcbiAgICAgIC5tYXAoKGl0ZW0pID0+IHtcclxuICAgICAgICByZXR1cm4geyAuLi5QUk9fVEFCTEVfREVGQVVMVF9DT0xVTU4sIC4uLml0ZW0gfSBhcyBQcm9UYWJsZUNvbHVtbjtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyDoh6rliqjms6jlhozmqKHmnb/nmoTmlrnms5VcclxuICBwcml2YXRlIGF1dG9SZWdpc3RlclRlbXBsYXRlcygpIHtcclxuICAgIC8vIOiOt+WPluaJgOacieaooeadv1xyXG4gICAgY29uc3QgYWxsVGVtcGxhdGVzQXJyYXkgPSB0aGlzLmFsbFRlbXBsYXRlcy50b0FycmF5KCk7XHJcblxyXG4gICAgLy8g6I635Y+W5omA5pyJ6ZyA6KaB6Ieq5a6a5LmJ5qih5p2/55qE5YiXXHJcbiAgICBjb25zdCBjb2x1bW5zV2l0aEN1c3RvbVJlbmRlciA9IHRoaXMuX2NvbHVtbnMuZmlsdGVyKFxyXG4gICAgICAoY29sKSA9PiBjb2wuY3VzdG9tUmVuZGVyXHJcbiAgICApO1xyXG5cclxuICAgIC8vIOiOt+WPluaJgOaciemcgOimgeiHquWumuS5iWxhYmVs5qih5p2/55qE5YiX77yI5L2/55So5Y6f5aeLY29sdW1uc++8jOehruS/nemhuuW6j+ato+ehru+8iVxyXG4gICAgY29uc3QgY29sdW1uc1dpdGhDdXN0b21MYWJlbCA9IHRoaXMuY29sdW1ucy5maWx0ZXIoXHJcbiAgICAgIChjb2wpID0+IGNvbC5jdXN0b21MYWJlbFJlbmRlclxyXG4gICAgKTtcclxuXHJcbiAgICAvLyDorqHnrpfpnIDopoHnmoTmqKHmnb/mgLvmlbBcclxuICAgIGNvbnN0IGN1c3RvbVJlbmRlckNvdW50ID0gY29sdW1uc1dpdGhDdXN0b21SZW5kZXIubGVuZ3RoO1xyXG4gICAgY29uc3QgdG90YWxOZWVkZWRUZW1wbGF0ZXMgPSBjdXN0b21SZW5kZXJDb3VudCArIGNvbHVtbnNXaXRoQ3VzdG9tTGFiZWwubGVuZ3RoO1xyXG5cclxuICAgIC8vIOivhuWIq+W5tuaOkumZpOeJueauiuaooeadv++8iGFjdGlvbkJhciDlkowgaW1nQWN0aW9uQmFy77yJXHJcbiAgICBjb25zdCBzcGVjaWFsVGVtcGxhdGVJbmRpY2VzID0gbmV3IFNldDxudW1iZXI+KCk7XHJcbiAgICBcclxuICAgIC8vIOWwneivleaJvuWIsCBhY3Rpb25CYXJUcGwg5ZyoIGFsbFRlbXBsYXRlc0FycmF5IOS4reeahOS9jee9rlxyXG4gICAgaWYgKHRoaXMuYWN0aW9uQmFyVHBsKSB7XHJcbiAgICAgIGNvbnN0IGFjdGlvbkJhckluZGV4ID0gdGhpcy5maW5kVGVtcGxhdGVJbmRleChhbGxUZW1wbGF0ZXNBcnJheSwgdGhpcy5hY3Rpb25CYXJUcGwpO1xyXG4gICAgICBpZiAoYWN0aW9uQmFySW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgc3BlY2lhbFRlbXBsYXRlSW5kaWNlcy5hZGQoYWN0aW9uQmFySW5kZXgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vIOWwneivleaJvuWIsCBpbWdBY3Rpb25CYXJUcGwg5ZyoIGFsbFRlbXBsYXRlc0FycmF5IOS4reeahOS9jee9rlxyXG4gICAgaWYgKHRoaXMuaW1nQWN0aW9uQmFyVHBsKSB7XHJcbiAgICAgIGNvbnN0IGltZ0FjdGlvbkJhckluZGV4ID0gdGhpcy5maW5kVGVtcGxhdGVJbmRleChhbGxUZW1wbGF0ZXNBcnJheSwgdGhpcy5pbWdBY3Rpb25CYXJUcGwpO1xyXG4gICAgICBpZiAoaW1nQWN0aW9uQmFySW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgc3BlY2lhbFRlbXBsYXRlSW5kaWNlcy5hZGQoaW1nQWN0aW9uQmFySW5kZXgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5aaC5p6c5peg5rOV6YCa6L+H5byV55So5om+5Yiw54m55q6K5qih5p2/77yM5L2/55So5aSH55So562W55WlXHJcbiAgICAvLyDlpIfnlKjnrZbnlaXvvJrlgYforr7mnIDlkI7nmoTmqKHmnb/mmK/nibnmrormqKHmnb9cclxuICAgIGNvbnN0IHNwZWNpYWxUZW1wbGF0ZUNvdW50ID0gKHRoaXMuYWN0aW9uQmFyVHBsID8gMSA6IDApICsgKHRoaXMuaW1nQWN0aW9uQmFyVHBsID8gMSA6IDApO1xyXG4gICAgaWYgKHNwZWNpYWxUZW1wbGF0ZUluZGljZXMuc2l6ZSA9PT0gMCAmJiBzcGVjaWFsVGVtcGxhdGVDb3VudCA+IDApIHtcclxuICAgICAgZm9yIChsZXQgaSA9IGFsbFRlbXBsYXRlc0FycmF5Lmxlbmd0aCAtIHNwZWNpYWxUZW1wbGF0ZUNvdW50OyBpIDwgYWxsVGVtcGxhdGVzQXJyYXkubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBzcGVjaWFsVGVtcGxhdGVJbmRpY2VzLmFkZChpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIOaPkOWPluWIl+aooeadv++8iOaOkumZpOeJueauiuaooeadv++8iVxyXG4gICAgY29uc3QgY29sdW1uVGVtcGxhdGVzOiBUZW1wbGF0ZVJlZjxhbnk+W10gPSBbXTtcclxuICAgIGFsbFRlbXBsYXRlc0FycmF5LmZvckVhY2goKHRwbCwgaW5kZXgpID0+IHtcclxuICAgICAgaWYgKCFzcGVjaWFsVGVtcGxhdGVJbmRpY2VzLmhhcyhpbmRleCkpIHtcclxuICAgICAgICBjb2x1bW5UZW1wbGF0ZXMucHVzaCh0cGwpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyDpqozor4HmqKHmnb/mlbDph49cclxuICAgIGlmIChjb2x1bW5UZW1wbGF0ZXMubGVuZ3RoICE9PSB0b3RhbE5lZWRlZFRlbXBsYXRlcykge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgYFByb1RhYmxlOiDmqKHmnb/mlbDph4/kuI3ljLnphY3vvIHpnIDopoEgJHt0b3RhbE5lZWRlZFRlbXBsYXRlc30g5Liq5YiX5qih5p2/77yM5a6e6ZmF5pyJICR7Y29sdW1uVGVtcGxhdGVzLmxlbmd0aH0g5Liq44CC6K+35qOA5p+lIGN1c3RvbVJlbmRlciDlkowgY3VzdG9tTGFiZWxSZW5kZXIg6YWN572u44CCYFxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOazqOWGjOiHquWumuS5iea4suafk+aooeadv1xyXG4gICAgY29sdW1uc1dpdGhDdXN0b21SZW5kZXIuZm9yRWFjaCgoY29sdW1uLCBpbmRleCkgPT4ge1xyXG4gICAgICBjb25zdCB0ZW1wbGF0ZU5hbWUgPSBjb2x1bW4uY3VzdG9tUmVuZGVyITtcclxuICAgICAgaWYgKGluZGV4IDwgY29sdW1uVGVtcGxhdGVzLmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuY3VzdG9tVGVtcGxhdGVzLnNldCh0ZW1wbGF0ZU5hbWUsIGNvbHVtblRlbXBsYXRlc1tpbmRleF0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFByb1RhYmxlOiDmnKrmib7liLDmqKHmnb8gXCIke3RlbXBsYXRlTmFtZX1cIu+8jOe0ouW8lSAke2luZGV4fSDotoXlh7rojIPlm7RgKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8g5rOo5YaM6Ieq5a6a5LmJbGFiZWzmqKHmnb/vvIjku44gY3VzdG9tUmVuZGVyQ291bnQg5LmL5ZCO5byA5aeL77yJXHJcbiAgICBjb2x1bW5zV2l0aEN1c3RvbUxhYmVsLmZvckVhY2goKGNvbHVtbiwgaW5kZXgpID0+IHtcclxuICAgICAgY29uc3QgdGVtcGxhdGVOYW1lID0gY29sdW1uLmN1c3RvbUxhYmVsUmVuZGVyITtcclxuICAgICAgY29uc3QgdGVtcGxhdGVJbmRleCA9IGN1c3RvbVJlbmRlckNvdW50ICsgaW5kZXg7XHJcbiAgICAgIGlmICh0ZW1wbGF0ZUluZGV4IDwgY29sdW1uVGVtcGxhdGVzLmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuY3VzdG9tVGVtcGxhdGVzLnNldCh0ZW1wbGF0ZU5hbWUsIGNvbHVtblRlbXBsYXRlc1t0ZW1wbGF0ZUluZGV4XSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihgUHJvVGFibGU6IOacquaJvuWIsGxhYmVs5qih5p2/IFwiJHt0ZW1wbGF0ZU5hbWV9XCLvvIzntKLlvJUgJHt0ZW1wbGF0ZUluZGV4fSDotoXlh7rojIPlm7RgKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyDlsJ3or5XlnKjmlbDnu4TkuK3mib7liLDmqKHmnb/nmoTntKLlvJXvvIjkvb/nlKjlpJrnp43mr5TovoPmlrnlvI/vvIlcclxuICBwcml2YXRlIGZpbmRUZW1wbGF0ZUluZGV4KHRlbXBsYXRlczogVGVtcGxhdGVSZWY8YW55PltdLCB0YXJnZXQ6IFRlbXBsYXRlUmVmPGFueT4pOiBudW1iZXIge1xyXG4gICAgLy8g5pa55rOVMe+8muW8leeUqOebuOetieaAp1xyXG4gICAgbGV0IGluZGV4ID0gdGVtcGxhdGVzLmluZGV4T2YodGFyZ2V0KTtcclxuICAgIGlmIChpbmRleCAhPT0gLTEpIHJldHVybiBpbmRleDtcclxuXHJcbiAgICAvLyDmlrnms5Uy77ya6YCa6L+HIGVsZW1lbnRSZWYg5q+U6L6DXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCB0YXJnZXRFbGVtZW50UmVmID0gKHRhcmdldCBhcyBhbnkpLmVsZW1lbnRSZWY7XHJcbiAgICAgIGlmICh0YXJnZXRFbGVtZW50UmVmKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZW1wbGF0ZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGNvbnN0IHRwbEVsZW1lbnRSZWYgPSAodGVtcGxhdGVzW2ldIGFzIGFueSkuZWxlbWVudFJlZjtcclxuICAgICAgICAgIGlmICh0cGxFbGVtZW50UmVmID09PSB0YXJnZXRFbGVtZW50UmVmKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAvLyDlv73nlaXplJnor69cclxuICAgIH1cclxuXHJcbiAgICAvLyDmlrnms5Uz77ya6YCa6L+HIEFuZ3VsYXIg5YaF6YOo5bGe5oCn5q+U6L6DXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCB0YXJnZXRDb250YWluZXIgPSAodGFyZ2V0IGFzIGFueSkuX2RlY2xhcmF0aW9uVENvbnRhaW5lcjtcclxuICAgICAgaWYgKHRhcmdldENvbnRhaW5lcikge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGVtcGxhdGVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBjb25zdCB0cGxDb250YWluZXIgPSAodGVtcGxhdGVzW2ldIGFzIGFueSkuX2RlY2xhcmF0aW9uVENvbnRhaW5lcjtcclxuICAgICAgICAgIGlmICh0cGxDb250YWluZXIgPT09IHRhcmdldENvbnRhaW5lcikge1xyXG4gICAgICAgICAgICByZXR1cm4gaTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgLy8g5b+955Wl6ZSZ6K+vXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIC0xO1xyXG4gIH1cclxuXHJcbiAgLy8g6K6+572u562b6YCJ6KGo5Y2V6buY6K6k5bGe5oCnXHJcbiAgcHJpdmF0ZSBzZXRTZWFyY2hGb3JtRGVmYXVsdFByb3AoY29sdW1uczogUHJvVGFibGVDb2x1bW5bXSkge1xyXG4gICAgY29sdW1ucy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGlmIChpdGVtLnZhbHVlVHlwZSkge1xyXG4gICAgICAgIGlmIChpdGVtLmZpZWxkUHJvcHMpIHtcclxuICAgICAgICAgIGl0ZW0uZmllbGRQcm9wcyA9IHtcclxuICAgICAgICAgICAgLi4uUFJPX1RBQkxFX0RFRkFVTFRfUFJPUFNbaXRlbS52YWx1ZVR5cGVdLFxyXG4gICAgICAgICAgICAuLi5pdGVtLmZpZWxkUHJvcHMsXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpdGVtLmZpZWxkUHJvcHMgPSB7IC4uLlBST19UQUJMRV9ERUZBVUxUX1BST1BTW2l0ZW0udmFsdWVUeXBlXSB9O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvLyDliqjmgIHorr7nva5PcHRpb25zXHJcbiAgcHJpdmF0ZSBzZXRTZWxlY3RSZXF1ZXN0KGNvbHVtbnM6IFByb1RhYmxlQ29sdW1uW10pIHtcclxuICAgIGNvbHVtbnMubWFwKGFzeW5jIChpdGVtKSA9PiB7XHJcbiAgICAgIGlmIChpdGVtLmZpZWxkUHJvcHMgJiYgaGFzSW4oaXRlbS5maWVsZFByb3BzLCBcInJlcXVlc3RcIikpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGF3YWl0IChcclxuICAgICAgICAgICAgaXRlbS5maWVsZFByb3BzIGFzIFNlbGVjdEZpZWxkUHJvcHNcclxuICAgICAgICAgICkucmVxdWVzdD8uKCk7XHJcbiAgICAgICAgICAoaXRlbS5maWVsZFByb3BzIGFzIFNlbGVjdEZpZWxkUHJvcHMpLm9wdGlvbnMgPSBvcHRpb25zO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAoaXRlbS5maWVsZFByb3BzIGFzIFNlbGVjdEZpZWxkUHJvcHMpLm9wdGlvbnMgPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBzZXRTZWFyY2hQYXJhbXMoY29sdW1uczogUHJvVGFibGVDb2x1bW5bXSkge1xyXG4gICAgdGhpcy5fc2VhcmNoRmlsZWRDb2x1bW5zID0gW107XHJcbiAgICBjb2x1bW5zXHJcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IHtcclxuICAgICAgICBjb25zdCBmbGFnID0gIWl0ZW0uaGlkZUluU2VhcmNoICYmIGl0ZW0udmFsdWVUeXBlO1xyXG4gICAgICAgIGlmIChmbGFnKSB7XHJcbiAgICAgICAgICB0aGlzLl9zZWFyY2hGaWxlZENvbHVtbnMucHVzaChjbG9uZURlZXAoaXRlbSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmxhZztcclxuICAgICAgfSlcclxuICAgICAgLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IGNvbHVtbi5maWVsZFByb3BzPy5uYW1lIHx8IGNvbHVtbi5wcm9wO1xyXG4gICAgICAgIGxldCBkZWZhdWx0VmFsdWUgPSBQUk9fVEFCTEVfREVGQVVMVF9QUk9QU1tjb2x1bW4udmFsdWVUeXBlXS52YWx1ZTtcclxuXHJcbiAgICAgICAgLy8g5a+55LqOY2hlY2tib3jnsbvlnovvvIzku45vcHRpb25z5Lit5om+5Ye6Y2hlY2tlZOS4unRydWXnmoTpobnkvZzkuLrpu5jorqTlgLxcclxuICAgICAgICBpZiAoY29sdW1uLnZhbHVlVHlwZSA9PT0gXCJjaGVja2JveFwiKSB7XHJcbiAgICAgICAgICBjb25zdCBjaGVja2VkVmFsdWVzID0gKGNvbHVtbi5maWVsZFByb3BzPy5vcHRpb25zIHx8IFtdKVxyXG4gICAgICAgICAgICAuZmlsdGVyKChvcHQ6IE9wdGlvbnNUeXBlKSA9PiBvcHQuY2hlY2tlZClcclxuICAgICAgICAgICAgLm1hcCgob3B0OiBPcHRpb25zVHlwZSkgPT4gb3B0LnZhbHVlKTtcclxuICAgICAgICAgIHRoaXMuX3NlYXJjaFBhcmFtc1trZXldID1cclxuICAgICAgICAgICAgY2hlY2tlZFZhbHVlcy5sZW5ndGggPiAwID8gY2hlY2tlZFZhbHVlcyA6IGRlZmF1bHRWYWx1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5fc2VhcmNoUGFyYW1zW2tleV0gPSBjb2x1bW4uZmllbGRQcm9wcz8udmFsdWUgfHwgZGVmYXVsdFZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8g5Yid5aeL5YyWIGF1dG9Db21wbGV0ZSDmlbDmja7mupBcclxuICAgICAgICBpZiAoY29sdW1uLnZhbHVlVHlwZSA9PT0gXCJhdXRvQ29tcGxldGVcIikge1xyXG4gICAgICAgICAgdGhpcy5fYXV0b0NvbXBsZXRlRGF0YVNvdXJjZXNba2V5XSA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgLy8g5qC55o2u5YiX55qEIG9yZGVyIOWtl+autei/m+ihjOaOkuW6j++8jOacquiuvue9riBvcmRlciDnmoTmlL7lnKjmnIDlkI5cclxuICAgIHRoaXMuX3NlYXJjaEZpbGVkQ29sdW1ucy5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBhT3JkZXIgPSBpc05pbChhPy5vcmRlcikgPyBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiA6IGEub3JkZXI7XHJcbiAgICAgIGNvbnN0IGJPcmRlciA9IGlzTmlsKGI/Lm9yZGVyKSA/IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSIDogYi5vcmRlcjtcclxuICAgICAgaWYgKGFPcmRlciA9PT0gYk9yZGVyKSByZXR1cm4gMDtcclxuICAgICAgcmV0dXJuIGFPcmRlciAtIGJPcmRlcjtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuc2V0U2VhcmNoRm9ybURlZmF1bHRQcm9wKHRoaXMuX3NlYXJjaEZpbGVkQ29sdW1ucyk7XHJcblxyXG4gICAgLy8g5bm25Y+R5Yqg6L295omA5pyJ6ZyA6KaB5byC5q2l6I635Y+W55qE6YCJ6aG5XHJcbiAgICB0aGlzLnNldFNlbGVjdFJlcXVlc3QodGhpcy5fc2VhcmNoRmlsZWRDb2x1bW5zKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlVGFibGVDb2x1bW5zKGluamVjdENvbHVtbnM6IFByb1RhYmxlQ29sdW1uW10pIHtcclxuICAgIC8vIDEuIOS9v+eUqOacgOWOn+Wni+eahGNvbHVtbnPkvZzkuLrmlbDmja7mupDvvIznoa7kv53ovoXliqnliJflrozlhajkuI3lj5flvbHlk41cclxuICAgIGNvbnN0IG9yaWdpbmFsQ29sdW1ucyA9IGNsb25lRGVlcCh0aGlzLmNvbHVtbnMpO1xyXG5cclxuICAgIC8vIDIuIOWkhOeQhuWtl+auteaYoOWwhO+8iOWmguaenOaPkOS+m+S6hmZpZWxkc+WPguaVsO+8iVxyXG4gICAgbGV0IHByb2Nlc3NlZEluamVjdENvbHVtbnMgPSBpbmplY3RDb2x1bW5zO1xyXG5cclxuICAgIC8vIDMuIOWIhuemu+i+heWKqeWIl+WSjOmdnui+heWKqeWIl++8iOS9v+eUqOWOn+Wni+aVsOaNru+8iVxyXG4gICAgY29uc3Qgbm9uQXV4aWxpYXJ5Q29sdW1ucyA9IG9yaWdpbmFsQ29sdW1ucy5maWx0ZXIoXHJcbiAgICAgIChjb2wpID0+ICFjb2wuYXV4aWxpYXJ5Q29sdW1uXHJcbiAgICApO1xyXG5cclxuICAgIC8vIDQuIOaMieeFp2luamVjdENvbHVtbnPnmoTpobrluo/ph43mlrDmjpLliJfpnZ7ovoXliqnliJdcclxuICAgIGNvbnN0IHJlb3JkZXJlZE5vbkF1eGlsaWFyeUNvbHVtbnM6IFByb1RhYmxlQ29sdW1uW10gPSBbXTtcclxuICAgIGNvbnN0IHJlbWFpbmluZ05vbkF1eGlsaWFyeUNvbHVtbnMgPSBbLi4ubm9uQXV4aWxpYXJ5Q29sdW1uc107IC8vIOWkjeWItuS4gOS7veeUqOS6juafpeaJvuWSjOenu+mZpFxyXG5cclxuICAgIHByb2Nlc3NlZEluamVjdENvbHVtbnMuZm9yRWFjaCgoaW5qZWN0Q29sKSA9PiB7XHJcbiAgICAgIC8vIOafpeaJvumdnui+heWKqeWIl+S4reWvueW6lOeahOS4i+agh1xyXG4gICAgICBjb25zdCBleGlzdGluZ0NvbEluZGV4ID0gcmVtYWluaW5nTm9uQXV4aWxpYXJ5Q29sdW1ucy5maW5kSW5kZXgoXHJcbiAgICAgICAgKGNvbCkgPT4gY29sLnByb3AgPT09IGluamVjdENvbC5wcm9wXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChleGlzdGluZ0NvbEluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgIC8vIOWmguaenOaJvuWIsOebuOWQjOWIl++8jOeUqGluamVjdENvbHVtbnPkuK3nmoTlsZ7mgKfopobnm5bljp/lp4tjb2x1bW5z5Lit55qE5bGe5oCnXHJcbiAgICAgICAgY29uc3QgZXhpc3RpbmdDb2wgPSByZW1haW5pbmdOb25BdXhpbGlhcnlDb2x1bW5zW2V4aXN0aW5nQ29sSW5kZXhdO1xyXG5cclxuICAgICAgICBjb25zdCB1cGRhdGVkQ29sID0geyAuLi5leGlzdGluZ0NvbCwgLi4uaW5qZWN0Q29sIH07XHJcbiAgICAgICAgcmVvcmRlcmVkTm9uQXV4aWxpYXJ5Q29sdW1ucy5wdXNoKHVwZGF0ZWRDb2wpO1xyXG4gICAgICAgIC8vIOS7juWJqeS9meaVsOe7hOS4reenu+mZpO+8jOmBv+WFjemHjeWkjVxyXG4gICAgICAgIHJlbWFpbmluZ05vbkF1eGlsaWFyeUNvbHVtbnMuc3BsaWNlKGV4aXN0aW5nQ29sSW5kZXgsIDEpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIOWmguaenOayoeaJvuWIsOWvueW6lOeahOWIl++8jOebtOaOpea3u+WKoGluamVjdENvbHVtbnPkuK3nmoTliJdcclxuICAgICAgICByZW9yZGVyZWROb25BdXhpbGlhcnlDb2x1bW5zLnB1c2goaW5qZWN0Q29sKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gNS4g5aSE55CG5Ymp5L2Z55qE5Y6f5aeLY29sdW1uc+S4reeahOmdnui+heWKqeWIl++8iOWcqGluamVjdENvbHVtbnPkuK3mnKrlh7rnjrDnmoTliJfvvIlcclxuICAgIC8vIOi/meS6m+WIl+W6lOivpeiiq+makOiXj++8iOiuvue9rmhpZGVJblRhYmxl5Li6dHJ1Ze+8iVxyXG4gICAgcmVtYWluaW5nTm9uQXV4aWxpYXJ5Q29sdW1ucy5mb3JFYWNoKChyZW1haW5pbmdDb2wpID0+IHtcclxuICAgICAgY29uc3QgaGlkZGVuQ29sID0geyAuLi5yZW1haW5pbmdDb2wsIGhpZGVJblRhYmxlOiB0cnVlIH07XHJcbiAgICAgIHJlb3JkZXJlZE5vbkF1eGlsaWFyeUNvbHVtbnMucHVzaChoaWRkZW5Db2wpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gNi4g5oyJ54Wn5Y6f5aeLY29sdW1uc+eahOmhuuW6j+mHjeaWsOe7hOWQiO+8muS/neaMgei+heWKqeWIl+eahOWOn+Wni+S9jee9ruWSjOWxnuaAp1xyXG4gICAgY29uc3QgZmluYWxDb2x1bW5zOiBQcm9UYWJsZUNvbHVtbltdID0gW107XHJcbiAgICBsZXQgbm9uQXV4aWxpYXJ5SW5kZXggPSAwO1xyXG4gICAgbGV0IGF1eGlsaWFyeUluZGV4ID0gMDtcclxuXHJcbiAgICBvcmlnaW5hbENvbHVtbnMuZm9yRWFjaCgob3JpZ2luYWxDb2wpID0+IHtcclxuICAgICAgaWYgKG9yaWdpbmFsQ29sLmF1eGlsaWFyeUNvbHVtbikge1xyXG4gICAgICAgIC8vIOWmguaenOaYr+i+heWKqeWIl++8jOS9v+eUqOWOn+Wni+WIl+aVsOaNru+8jOWujOWFqOS4jei/m+ihjOS7u+S9leS/ruaUuVxyXG4gICAgICAgIGZpbmFsQ29sdW1ucy5wdXNoKG9yaWdpbmFsQ29sKTtcclxuICAgICAgICBhdXhpbGlhcnlJbmRleCsrO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIOWmguaenOaYr+mdnui+heWKqeWIl++8jOS9v+eUqOmHjeaWsOaOkuW6j+WQjueahOWIl++8jOS9huS/neeVmeWOn+Wni+WIl+eahOaJgOacieWxnuaAp1xyXG4gICAgICAgIGNvbnN0IHJlb3JkZXJlZENvbCA9IHJlb3JkZXJlZE5vbkF1eGlsaWFyeUNvbHVtbnNbbm9uQXV4aWxpYXJ5SW5kZXhdO1xyXG4gICAgICAgIGlmIChyZW9yZGVyZWRDb2wpIHtcclxuICAgICAgICAgIC8vIOWQiOW5tuWOn+Wni+WIl+WSjOmHjeaWsOaOkuW6j+WQjueahOWIl++8jOehruS/neS/neeVmeaJgOacieWOn+Wni+WxnuaAp1xyXG4gICAgICAgICAgY29uc3QgbWVyZ2VkQ29sID0geyAuLi5vcmlnaW5hbENvbCwgLi4ucmVvcmRlcmVkQ29sIH07XHJcbiAgICAgICAgICBmaW5hbENvbHVtbnMucHVzaChtZXJnZWRDb2wpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyDlpoLmnpzph43mlrDmjpLluo/lkI7nmoTliJfkuI3lrZjlnKjvvIzkvb/nlKjljp/lp4vliJdcclxuICAgICAgICAgIGZpbmFsQ29sdW1ucy5wdXNoKG9yaWdpbmFsQ29sKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbm9uQXV4aWxpYXJ5SW5kZXgrKztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmZvcm1hdGVJbm5lckNvbHVtbnMoZmluYWxDb2x1bW5zKTtcclxuICB9XHJcblxyXG4gIC8vIOmAmui/hyBQcm94eSDnm5HlkKwgX3NlYXJjaFBhcmFtcyDnmoTlsZ7mgKflj5jmm7RcclxuICBwcml2YXRlIGNyZWF0ZVNlYXJjaFBhcmFtc1Byb3h5KHRhcmdldDogYW55KSB7XHJcbiAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgIGNvbnN0IGhhbmRsZXI6IFByb3h5SGFuZGxlcjxhbnk+ID0ge1xyXG4gICAgICBzZXQob2JqOiBhbnksIHByb3A6IHN0cmluZyB8IHN5bWJvbCwgdmFsdWU6IGFueSkge1xyXG4gICAgICAgIGNvbnN0IGtleSA9IFN0cmluZyhwcm9wKTtcclxuICAgICAgICBjb25zdCBvbGRWYWwgPSBvYmpba2V5XTtcclxuICAgICAgICBpZiAob2xkVmFsID09PSB2YWx1ZSkge1xyXG4gICAgICAgICAgb2JqW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBvYmpba2V5XSA9IHZhbHVlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBzZWxmLm9uVmFsdWVzQ2hhbmdlLmVtaXQoe1xyXG4gICAgICAgICAgICBrZXksXHJcbiAgICAgICAgICAgIHZhbHVlLFxyXG4gICAgICAgICAgICBwYXJhbXM6IHNlbGYuZ2V0U2VhcmNoUGFyYW1zKCksXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7fVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9LFxyXG4gICAgfTtcclxuICAgIHJldHVybiBuZXcgUHJveHkodGFyZ2V0LCBoYW5kbGVyKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xlYXJFbXB0eVNlYXJjaFBhcmFtcygpIHtcclxuICAgIGNvbnN0IGNsb25lU2VhcmNoUGFyYW1zID0gY2xvbmVEZWVwKHRoaXMuX3NlYXJjaFBhcmFtcyk7XHJcbiAgICByZXR1cm4gY2xvbmVTZWFyY2hQYXJhbXM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJ1aWxkU2VydmVyU29ydFBheWxvYWQoKSB7XHJcbiAgICAvLyDmnoTlu7rmv4DmtLvmjpLluo/pm4blkIjvvIjmjInkvJjlhYjnuqfku47kvY7liLDpq5jvvIzmnKvlsL7kvJjlhYjvvIlcclxuICAgIGNvbnN0IGFjdGl2ZUtleXMgPSB0aGlzLl9zb3J0UHJpb3JpdHkuZmlsdGVyKChrKSA9PiAhIXRoaXMuX3NvcnRNYXBba10pO1xyXG4gICAgaWYgKGFjdGl2ZUtleXMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcclxuICAgIGNvbnN0IHNvcnRzID0gYWN0aXZlS2V5cy5tYXAoKGZpZWxkKSA9PiB7XHJcbiAgICAgIC8vIOafpeaJvuWvueW6lOeahOWIl+mFjee9ru+8jOS8mOWFiOS9v+eUqHNvcnROYW1l5a2X5q61XHJcbiAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuX2NvbHVtbnMuZmluZCgoY29sKSA9PiBjb2wucHJvcCA9PT0gZmllbGQpO1xyXG4gICAgICBjb25zdCBzb3J0RmllbGQgPSBjb2x1bW4/LnNvcnROYW1lIHx8IGZpZWxkO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGZpZWxkOiBzb3J0RmllbGQsXHJcbiAgICAgICAgb3JkZXI6IHRoaXMuX3NvcnRNYXBbZmllbGRdISxcclxuICAgICAgfTtcclxuICAgIH0pO1xyXG4gICAgaWYgKHRoaXMubXVsdGlwbGVTb3J0KSB7XHJcbiAgICAgIHJldHVybiBzb3J0czsgLy8g5Lul5pWw57uE5b2i5byP5o+Q5Lqk5aSa5YiX5o6S5bqPXHJcbiAgICB9XHJcbiAgICBjb25zdCBbZmlyc3RdID0gc29ydHM7XHJcbiAgICByZXR1cm4gZmlyc3Q7IC8vIOWFvOWuueWNleWIl+e7k+aehCB7IGZpZWxkLCBvcmRlciB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNvcnREYXRhU291cmNlSW5QbGFjZSgpIHtcclxuICAgIGlmICghQXJyYXkuaXNBcnJheSh0aGlzLmRhdGFTb3VyY2UpIHx8IHRoaXMuZGF0YVNvdXJjZS5sZW5ndGggPT09IDApIHJldHVybjtcclxuICAgIGNvbnN0IGFjdGl2ZUtleXMgPSB0aGlzLl9zb3J0UHJpb3JpdHkuZmlsdGVyKChrKSA9PiAhIXRoaXMuX3NvcnRNYXBba10pO1xyXG4gICAgaWYgKGFjdGl2ZUtleXMubGVuZ3RoID09PSAwKSByZXR1cm47XHJcblxyXG4gICAgLy8g5aSN5Yi25LiA5Lu95LyY5YWI57qn77yM5LuO5YmN5Yiw5ZCO5LyY5YWI57qn5LuO5L2O5Yiw6auY77yI5pyA5ZCO6K6+572u55qE5a2X5q615LyY5YWI77yJXHJcbiAgICBjb25zdCBrZXlzSW5Qcmlvcml0eSA9IFsuLi5hY3RpdmVLZXlzXTtcclxuICAgIHRoaXMuZGF0YVNvdXJjZS5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4ge1xyXG4gICAgICBmb3IgKGxldCBpID0ga2V5c0luUHJpb3JpdHkubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICBjb25zdCBmaWVsZCA9IGtleXNJblByaW9yaXR5W2ldO1xyXG4gICAgICAgIGNvbnN0IG9yZGVyID0gdGhpcy5fc29ydE1hcFtmaWVsZF0hO1xyXG4gICAgICAgIGNvbnN0IGF2ID0gYT8uW2ZpZWxkXTtcclxuICAgICAgICBjb25zdCBidiA9IGI/LltmaWVsZF07XHJcbiAgICAgICAgY29uc3QgY21wID0gdGhpcy5jb21wYXJlVmFsdWVzKGF2LCBidik7XHJcbiAgICAgICAgaWYgKGNtcCAhPT0gMCkgcmV0dXJuIG9yZGVyID09PSBcImFzY2VuZFwiID8gY21wIDogLWNtcDtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjb21wYXJlVmFsdWVzKGFWYWw6IGFueSwgYlZhbDogYW55KTogbnVtYmVyIHtcclxuICAgIGlmIChhVmFsID09IG51bGwgJiYgYlZhbCA9PSBudWxsKSByZXR1cm4gMDtcclxuICAgIGlmIChhVmFsID09IG51bGwpIHJldHVybiAtMTtcclxuICAgIGlmIChiVmFsID09IG51bGwpIHJldHVybiAxO1xyXG4gICAgaWYgKGFWYWwgaW5zdGFuY2VvZiBEYXRlICYmIGJWYWwgaW5zdGFuY2VvZiBEYXRlKSB7XHJcbiAgICAgIHJldHVybiBhVmFsLmdldFRpbWUoKSAtIGJWYWwuZ2V0VGltZSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBhVmFsID09PSBcImJvb2xlYW5cIiAmJiB0eXBlb2YgYlZhbCA9PT0gXCJib29sZWFuXCIpIHtcclxuICAgICAgcmV0dXJuIGFWYWwgPT09IGJWYWwgPyAwIDogYVZhbCA/IDEgOiAtMTtcclxuICAgIH1cclxuICAgIGlmICh0eXBlb2YgYVZhbCA9PT0gXCJudW1iZXJcIiAmJiB0eXBlb2YgYlZhbCA9PT0gXCJudW1iZXJcIikge1xyXG4gICAgICByZXR1cm4gYVZhbCAtIGJWYWw7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIGFWYWwgPT09IFwic3RyaW5nXCIgJiYgdHlwZW9mIGJWYWwgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgcmV0dXJuIGFWYWwubG9jYWxlQ29tcGFyZShiVmFsKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGFOdW0gPSBOdW1iZXIoYVZhbCk7XHJcbiAgICBjb25zdCBiTnVtID0gTnVtYmVyKGJWYWwpO1xyXG4gICAgaWYgKCFpc05hTihhTnVtKSAmJiAhaXNOYU4oYk51bSkpIHJldHVybiBhTnVtIC0gYk51bTtcclxuICAgIHJldHVybiBTdHJpbmcoYVZhbCkubG9jYWxlQ29tcGFyZShTdHJpbmcoYlZhbCkpO1xyXG4gIH1cclxuXHJcbiAgLy8g5omn6KGMIGF1dG9Db21wbGV0ZSDmlbDmja7mupDmn6Xor6LvvIjlrp7pmYXmiafooYzpgLvovpHvvIlcclxuICBwcml2YXRlIGV4ZWN1dGVBdXRvQ29tcGxldGVEYXRhU291cmNlKGV2ZW50OiBFdmVudCwgY29sdW1uOiBQcm9UYWJsZUNvbHVtbikge1xyXG4gICAgY29uc3QgZmllbGRLZXkgPSBjb2x1bW4uZmllbGRQcm9wcz8ubmFtZSB8fCBjb2x1bW4ucHJvcDtcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIChjb2x1bW4uZmllbGRQcm9wcyBhcyBBdXRvQ29tcGxldGVGaWVsZFByb3BzKS5kYXRhU291cmNlICYmXHJcbiAgICAgIHR5cGVvZiAoY29sdW1uLmZpZWxkUHJvcHMgYXMgQXV0b0NvbXBsZXRlRmllbGRQcm9wcykuZGF0YVNvdXJjZSA9PT1cclxuICAgICAgICBcImZ1bmN0aW9uXCJcclxuICAgICkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IChjb2x1bW4uZmllbGRQcm9wcyBhcyBBdXRvQ29tcGxldGVGaWVsZFByb3BzKS5kYXRhU291cmNlKFxyXG4gICAgICAgICAgZXZlbnRcclxuICAgICAgICApO1xyXG4gICAgICAgIC8vIOWmguaenOi/lOWbnueahOaYryBQcm9taXNl77yM5aSE55CG5byC5q2l57uT5p6cXHJcbiAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcclxuICAgICAgICAgIHJlc3VsdFxyXG4gICAgICAgICAgICAudGhlbigoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuX2F1dG9Db21wbGV0ZURhdGFTb3VyY2VzW2ZpZWxkS2V5XSA9IGRhdGEgfHwgW107XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiQXV0b0NvbXBsZXRlIGRhdGFTb3VyY2UgZXJyb3I6XCIsIGVycm9yKTtcclxuICAgICAgICAgICAgICB0aGlzLl9hdXRvQ29tcGxldGVEYXRhU291cmNlc1tmaWVsZEtleV0gPSBbXTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIOWQjOatpei/lOWbnue7k+aenFxyXG4gICAgICAgICAgdGhpcy5fYXV0b0NvbXBsZXRlRGF0YVNvdXJjZXNbZmllbGRLZXldID0gcmVzdWx0IHx8IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFwiQXV0b0NvbXBsZXRlIGRhdGFTb3VyY2UgZXJyb3I6XCIsIGVycm9yKTtcclxuICAgICAgICB0aGlzLl9hdXRvQ29tcGxldGVEYXRhU291cmNlc1tmaWVsZEtleV0gPSBbXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFNlYXJjaFBhcmFtcyhvcHRpb25zPzoge1xyXG4gICAgdXNlU2F2ZWQ/OiBib29sZWFuOyAvLyDkvb/nlKjmnIDov5HkuIDmrKHmn6Xor6Lmj5DkuqTnmoTlj4LmlbDvvIzpu5jorqTkuLogZmFsc2XvvJtmYWxzZSDkuLrlvZPliY3ooajljZXlgLxcclxuICB9KTogYW55IHtcclxuICAgIGNvbnN0IHsgdXNlU2F2ZWQgPSBmYWxzZSB9ID0gb3B0aW9ucyB8fCB7fTtcclxuICAgIGNvbnN0IHJhd1BhcmFtcyA9IHVzZVNhdmVkID8gdGhpcy5fc2F2ZWRTZWFyY2hQYXJhbXMgOiB0aGlzLl9zZWFyY2hQYXJhbXM7XHJcbiAgICBjb25zdCBwYXJhbXMgPSBjbG9uZURlZXAocmF3UGFyYW1zIHx8IHt9KTtcclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBwYXJhbXMsXHJcbiAgICAgIHBhZ2VJbmZvOiB7XHJcbiAgICAgICAgcGFnZUluZGV4OiB0aGlzLl9wYWdlSW5mby5wYWdlSW5kZXgsXHJcbiAgICAgICAgcGFnZVNpemU6IHRoaXMuX3BhZ2VJbmZvLnBhZ2VTaXplLFxyXG4gICAgICB9LFxyXG4gICAgICAvLyDlnKjnur/mjpLluo/mqKHlvI/vvJrmiormjpLluo/lr7nosaHmj5DkuqTnu5nmjqXlj6NcclxuICAgICAgLi4uKHRoaXMuc29ydE1vZGUgPT09IFwic2VydmVyXCJcclxuICAgICAgICA/IHsgc29ydDogdGhpcy5idWlsZFNlcnZlclNvcnRQYXlsb2FkKCkgfVxyXG4gICAgICAgIDoge30pLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyByZWxvYWQoYWZ0ZXJEZWxldGU/OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLmhhbmRsZVF1ZXJ5KGFmdGVyRGVsZXRlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRGaWVsZHNWYWx1ZShmaWVsZHM6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcclxuICAgIE9iamVjdC5rZXlzKGZpZWxkcykuZm9yRWFjaCgoaykgPT4ge1xyXG4gICAgICB0aGlzLl9zZWFyY2hQYXJhbXNba10gPSBmaWVsZHNba107IC8vIOS/neeVmSBQcm94ee+8jOmAkOmhuei1i+WAvOinpuWPkeaLpuaIqlxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0RmllbGRWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xyXG4gICAgdGhpcy5fc2VhcmNoUGFyYW1zW2tleV0gPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbGVhclNlbGVjdGVkUm93KCkge1xyXG4gICAgdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgc2V0Q29sdW1ucyhcclxuICAgIGNvbHVtbnM6IFByb1RhYmxlQ29sdW1uW10sXHJcbiAgICBvcHRpb25zPzoge1xyXG4gICAgICByZWxvYWQ/OiBib29sZWFuOyAvLyDmmK/lkKbph43mlrDliqDovb3mlbDmja7vvIzpu5jorqTkuLogZmFsc2VcclxuICAgIH1cclxuICApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIOabtOaWsCBjb2x1bW5zIOi+k+WFpeWxnuaAp1xyXG4gICAgdGhpcy5jb2x1bW5zID0gY2xvbmVEZWVwKGNvbHVtbnMpO1xyXG5cclxuICAgIC8vIOmHjeaWsOagvOW8j+WMluWGhemDqOWIl1xyXG4gICAgdGhpcy5mb3JtYXRlSW5uZXJDb2x1bW5zKHRoaXMuY29sdW1ucyk7XHJcblxyXG4gICAgLy8g6YeN5paw6K6+572u5pCc57Si5Y+C5pWw77yI5byC5q2l5pON5L2c77yJXHJcbiAgICAvLyDlhYjmuIXnqbrml6fnmoTmkJzntKLlj4LmlbDvvIzpgb/lhY3ml6fmlbDmja7mrovnlZlcclxuICAgIHRoaXMuX3NlYXJjaFBhcmFtcyA9IHt9O1xyXG4gICAgYXdhaXQgdGhpcy5zZXRTZWFyY2hQYXJhbXModGhpcy5jb2x1bW5zKTtcclxuXHJcbiAgICAvLyDph43mlrDliJvlu7ogUHJveHnvvIznoa7kv53ooajljZXpobnlgLzlj5jljJbog73mraPluLjop6blj5Hkuovku7ZcclxuICAgIHRoaXMuX3NlYXJjaFBhcmFtcyA9IHRoaXMuY3JlYXRlU2VhcmNoUGFyYW1zUHJveHkodGhpcy5fc2VhcmNoUGFyYW1zKTtcclxuXHJcbiAgICAvLyDph43mlrDms6jlhozmqKHmnb/vvIjlpoLmnpznu4Tku7blt7Lnu4/liJ3lp4vljJblrozmiJDvvIlcclxuICAgIGlmICh0aGlzLmFsbFRlbXBsYXRlcykge1xyXG4gICAgICB0aGlzLmF1dG9SZWdpc3RlclRlbXBsYXRlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOWmguaenOiuvue9ruS6hiByZWxvYWQg6YCJ6aG55Li6IHRydWXvvIzliJnph43mlrDmn6Xor6LmlbDmja5cclxuICAgIGlmIChvcHRpb25zPy5yZWxvYWQgPT09IHRydWUpIHtcclxuICAgICAgdGhpcy5oYW5kbGVRdWVyeSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFNlbGVjdGVkUm93RGF0YTxUID0gYW55PigpOiBUIHtcclxuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZFRhYmxlUm93O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldENoZWNrZWRSb3dzPFQgPSBhbnk+KCk6IFRbXSB7XHJcbiAgICBpZiAoIXRoaXMuc2hvd0NoZWNrYm94KSB7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuICAgIC8vIOi/lOWbnuW9k+WJjeaVsOaNrua6kOS4reaJgOaciSBjaGVja2VkIOS4uiB0cnVlIOeahOmhuVxyXG4gICAgLy8g5rOo5oSP77ya5aaC5p6c6ZyA6KaB6I635Y+W5omA5pyJ6aG155qE6YCJ5Lit6aG577yM6ZyA6KaB6YGN5Y6G5omA5pyJ5pWw5o2u5rqQ5oiW5L2/55SoIF9zZWxlY3RlZFJvd0lkc1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZS5maWx0ZXIoKHJvdykgPT4gcm93LmNoZWNrZWQgPT09IHRydWUpIGFzIFRbXTtcclxuICB9XHJcblxyXG4gIC8vIOiOt+WPluaMh+WumuWQjeensOeahOaooeadv1xyXG4gIGdldFRlbXBsYXRlKG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFRlbXBsYXRlUmVmPGFueT4gfCBudWxsIHtcclxuICAgIGlmICghbmFtZSkgcmV0dXJuIG51bGw7XHJcbiAgICByZXR1cm4gdGhpcy5jdXN0b21UZW1wbGF0ZXMuZ2V0KG5hbWUpIHx8IG51bGw7XHJcbiAgfVxyXG5cclxuICBnZXRUb29sVGlwVGV4dFZhbHVlKGNvbHVtbjogUHJvVGFibGVDb2x1bW4sIGRhdGE6IGFueSk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBrZXkgPVxyXG4gICAgICBjb2x1bW4uY3VzdG9tUmVuZGVyICYmIHRoaXMuZ2V0VGVtcGxhdGUoY29sdW1uLmN1c3RvbVJlbmRlcilcclxuICAgICAgICA/IFwiXCJcclxuICAgICAgICA6IGNvbHVtbi5lbGxpcHNpc1xyXG4gICAgICAgID8gY29sdW1uLnByb3BcclxuICAgICAgICA6IFwiXCI7XHJcbiAgICByZXR1cm4gIWtleSA/IFwiXCIgOiBkYXRhW2tleV07XHJcbiAgfVxyXG5cclxuICBnZXRUYWJsZVJvd0NoZWNrZWQoZGF0YTogYW55KSB7XHJcbiAgICAvLyDlkK/nlKjlpI3pgInmoYbml7bvvJrooYzpq5jkuq7lupTkuI7lpI3pgInmoYbpgInkuK3nirbmgIHkuIDoh7TvvIjmlK/mjIHlpJrpgInvvIlcclxuICAgIGlmICh0aGlzLnNob3dDaGVja2JveCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5pc1Jvd0NoZWNrZWQoZGF0YSk7XHJcbiAgICB9XHJcbiAgICAvLyDmnKrlkK/nlKjlpI3pgInmoYbml7bvvJrku43nhLbkvb/nlKjljZXpgInooYzpq5jkuq5cclxuICAgIGlmICghdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdykgcmV0dXJuIGZhbHNlO1xyXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuX3NlbGVjdGVkVGFibGVSb3cpID09PSBKU09OLnN0cmluZ2lmeShkYXRhKTtcclxuICB9XHJcblxyXG4gIC8vIOajgOafpeihjOaYr+WQpuiiq+emgeeUqFxyXG4gIGlzUm93RGlzYWJsZWQoZGF0YTogYW55KTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRoaXMuc2hvd0NoZWNrYm94KSByZXR1cm4gZmFsc2U7XHJcbiAgICByZXR1cm4gdGhpcy5yb3dEaXNhYmxlZCA/IHRoaXMucm93RGlzYWJsZWQoZGF0YSkgOiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8vIOajgOafpeihjOaYr+WQpuiiq+WkjemAieahhumAieS4re+8iOaVsOaNrumpseWKqOaooeW8j++8iVxyXG4gIGlzUm93Q2hlY2tlZChkYXRhOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5zaG93Q2hlY2tib3gpIHJldHVybiBmYWxzZTtcclxuICAgIC8vIOebtOaOpeivu+WPluaVsOaNruWvueixoeeahCBjaGVja2VkIOWxnuaAp1xyXG4gICAgcmV0dXJuIGRhdGEuY2hlY2tlZCA9PT0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8vIOWIh+aNouihjOeahOmAieS4reeKtuaAge+8iOaVsOaNrumpseWKqOaooeW8j++8jOS/neeVmeeUqOS6juWFvOWuue+8iVxyXG4gIHRvZ2dsZVJvd0NoZWNrZWQoZGF0YTogYW55LCBjaGVja2VkOiBib29sZWFuLCBldmVudD86IEV2ZW50KSB7XHJcbiAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IC8vIOmYu+atouS6i+S7tuWGkuazoe+8jOmBv+WFjeinpuWPkeihjOeCueWHu1xyXG4gICAgfVxyXG4gICAgLy8g5aaC5p6c6KGM6KKr56aB55So77yM5LiN5YWB6K645YiH5o2i6YCJ5Lit54q25oCBXHJcbiAgICBpZiAodGhpcy5pc1Jvd0Rpc2FibGVkKGRhdGEpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyDnm7TmjqXorr7nva7mlbDmja7lr7nosaHnmoQgY2hlY2tlZCDlsZ7mgKdcclxuICAgIGRhdGEuY2hlY2tlZCA9IGNoZWNrZWQ7XHJcblxyXG4gICAgLy8g5ZCM5q2l5pu05pawIF9zZWxlY3RlZFJvd0lkc++8iOeUqOS6jui3qOmhtemAieS4re+8iVxyXG4gICAgY29uc3QgaWQgPSB0aGlzLmdldFJvd0lkKGRhdGEpO1xyXG4gICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgaWYgKGNoZWNrZWQpIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZFJvd0lkcy5hZGQoaWQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkUm93SWRzLmRlbGV0ZShpZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyDlkIzmraXmm7TmlrAgX3NlbGVjdGVkUm93c++8iOeUqOS6juWFvOWuueaAp++8iVxyXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9zZWxlY3RlZFJvd3MuZmluZEluZGV4KChyb3cpID0+XHJcbiAgICAgIHRoaXMuaXNTYW1lUm93KHJvdywgZGF0YSlcclxuICAgICk7XHJcbiAgICBpZiAoY2hlY2tlZCkge1xyXG4gICAgICBpZiAoaW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRSb3dzLnB1c2goZGF0YSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8g5Yu+6YCJ5aSN6YCJ5qGG5pe25ZCM5q2l6K6+572u6auY5Lqu6YCJ5Lit6KGMXHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkVGFibGVSb3cgPSBkYXRhO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZFJvd3Muc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgfVxyXG4gICAgICAvLyDoi6XlvZPliY3pq5jkuq7ooYzkuLror6XooYzvvIzliJnlj5bmtojpq5jkuq5cclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkVGFibGVSb3cgJiZcclxuICAgICAgICB0aGlzLmlzU2FtZVJvdyh0aGlzLl9zZWxlY3RlZFRhYmxlUm93LCBkYXRhKVxyXG4gICAgICApIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXBkYXRlQ2hlY2tBbGxTdGF0dXMoKTtcclxuICB9XHJcblxyXG4gIC8vIOabtOaWsOWFqOmAieeKtuaAge+8iOaVsOaNrumpseWKqOaooeW8j++8iVxyXG4gIHVwZGF0ZUNoZWNrQWxsU3RhdHVzKCkge1xyXG4gICAgaWYgKCF0aGlzLnNob3dDaGVja2JveCB8fCAhQXJyYXkuaXNBcnJheSh0aGlzLmRhdGFTb3VyY2UpKSB7XHJcbiAgICAgIHRoaXMuX2NoZWNrZWRBbGwgPSBmYWxzZTtcclxuICAgICAgdGhpcy5faW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvLyDlj6rorqHnrpflj6/nlKjnmoTooYzvvIjmnKrnpoHnlKjnmoTooYzvvIlcclxuICAgIGNvbnN0IGF2YWlsYWJsZVJvd3MgPSB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyKFxyXG4gICAgICAocm93KSA9PiAhdGhpcy5pc1Jvd0Rpc2FibGVkKHJvdylcclxuICAgICk7XHJcbiAgICAvLyDln7rkuo7mlbDmja7lr7nosaHnmoQgY2hlY2tlZCDlsZ7mgKforqHnrpdcclxuICAgIGNvbnN0IGNoZWNrZWRDb3VudCA9IGF2YWlsYWJsZVJvd3MuZmlsdGVyKFxyXG4gICAgICAocm93KSA9PiByb3cuY2hlY2tlZCA9PT0gdHJ1ZVxyXG4gICAgKS5sZW5ndGg7XHJcbiAgICBjb25zdCB0b3RhbENvdW50ID0gYXZhaWxhYmxlUm93cy5sZW5ndGg7XHJcbiAgICB0aGlzLl9jaGVja2VkQWxsID1cclxuICAgICAgdG90YWxDb3VudCA+IDAgJiYgY2hlY2tlZENvdW50ID4gMCAmJiBjaGVja2VkQ291bnQgPT09IHRvdGFsQ291bnQ7XHJcbiAgICB0aGlzLl9pbmRldGVybWluYXRlID0gY2hlY2tlZENvdW50ID4gMCAmJiBjaGVja2VkQ291bnQgPCB0b3RhbENvdW50O1xyXG4gIH1cclxuXHJcbiAgLy8g5YWo6YCJL+WPlua2iOWFqOmAie+8iOaVsOaNrumpseWKqOaooeW8j++8iVxyXG4gIHRvZ2dsZUNoZWNrQWxsKGNoZWNrZWQ6IGJvb2xlYW4sIGV2ZW50PzogRXZlbnQpIHtcclxuICAgIGlmIChldmVudCkge1xyXG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDlj6rlpITnkIblj6/nlKjnmoTooYzvvIjmnKrnpoHnlKjnmoTooYzvvIlcclxuICAgIGNvbnN0IGF2YWlsYWJsZVJvd3MgPSB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyKFxyXG4gICAgICAocm93KSA9PiAhdGhpcy5pc1Jvd0Rpc2FibGVkKHJvdylcclxuICAgICk7XHJcblxyXG4gICAgLy8g5om56YeP6K6+572uIGNoZWNrZWQg5bGe5oCnXHJcbiAgICBhdmFpbGFibGVSb3dzLmZvckVhY2goKHJvdykgPT4ge1xyXG4gICAgICByb3cuY2hlY2tlZCA9IGNoZWNrZWQ7XHJcblxyXG4gICAgICAvLyDlkIzmraXmm7TmlrAgX3NlbGVjdGVkUm93SWRz77yI55So5LqO6Leo6aG16YCJ5Lit77yJXHJcbiAgICAgIGNvbnN0IGlkID0gdGhpcy5nZXRSb3dJZChyb3cpO1xyXG4gICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGlmIChjaGVja2VkKSB7XHJcbiAgICAgICAgICB0aGlzLl9zZWxlY3RlZFJvd0lkcy5hZGQoaWQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLl9zZWxlY3RlZFJvd0lkcy5kZWxldGUoaWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8g5ZCM5q2l5pu05pawIF9zZWxlY3RlZFJvd3PvvIjnlKjkuo7lhbzlrrnmgKfvvIlcclxuICAgIGlmIChjaGVja2VkKSB7XHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkUm93cyA9IFsuLi5hdmFpbGFibGVSb3dzXTtcclxuICAgICAgLy8g5ZCM5q2l6K6+572u6auY5Lqu6YCJ5Lit6KGM5Li656ys5LiA5p2h5Y+v6YCJ5pWw5o2uXHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkVGFibGVSb3cgPVxyXG4gICAgICAgIGF2YWlsYWJsZVJvd3MubGVuZ3RoID4gMCA/IGF2YWlsYWJsZVJvd3NbMF0gOiBudWxsO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fc2VsZWN0ZWRSb3dzID0gW107XHJcbiAgICAgIC8vIOWPlua2iOmrmOS6rlxyXG4gICAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnVwZGF0ZUNoZWNrQWxsU3RhdHVzKCk7XHJcbiAgfVxyXG5cclxuICAvLyDojrflj5bpgInkuK3nmoTooYzmlbDmja7vvIjkv53nlZnnlKjkuo7lhbzlrrnmgKfvvIlcclxuICBnZXRTZWxlY3RlZFJvd3MoKTogYW55W10ge1xyXG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2hlY2tlZFJvd3MoKTtcclxuICB9XHJcblxyXG4gIC8vIOWkhOeQhuihjCBjaGVja2JveCDlj5jljJbkuovku7bvvIjmlbDmja7pqbHliqjmqKHlvI/vvIlcclxuICBoYW5kbGVSb3dDaGVja2VkQ2hhbmdlKGRhdGE6IGFueSwgY2hlY2tlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaXNSb3dEaXNhYmxlZChkYXRhKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5pWw5o2u5a+56LGh55qEIGNoZWNrZWQg5bGe5oCn5bey57uP6YCa6L+H5Y+M5ZCR57uR5a6a6Ieq5Yqo5pu05pawXHJcbiAgICAvLyDov5nph4zlj6rpnIDopoHlkIzmraXmm7TmlrAgX3NlbGVjdGVkUm93SWRzIOWSjCBfc2VsZWN0ZWRSb3dzXHJcblxyXG4gICAgLy8g5ZCM5q2l5pu05pawIF9zZWxlY3RlZFJvd0lkc++8iOeUqOS6jui3qOmhtemAieS4re+8iVxyXG4gICAgY29uc3QgaWQgPSB0aGlzLmdldFJvd0lkKGRhdGEpO1xyXG4gICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgaWYgKGNoZWNrZWQpIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZFJvd0lkcy5hZGQoaWQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkUm93SWRzLmRlbGV0ZShpZCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyDlkIzmraXmm7TmlrAgX3NlbGVjdGVkUm93c++8iOeUqOS6juWFvOWuueaAp++8iVxyXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLl9zZWxlY3RlZFJvd3MuZmluZEluZGV4KChyb3cpID0+XHJcbiAgICAgIHRoaXMuaXNTYW1lUm93KHJvdywgZGF0YSlcclxuICAgICk7XHJcbiAgICBpZiAoY2hlY2tlZCkge1xyXG4gICAgICBpZiAoaW5kZXggPT09IC0xKSB7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRSb3dzLnB1c2goZGF0YSk7XHJcbiAgICAgIH1cclxuICAgICAgLy8g5Yu+6YCJ5aSN6YCJ5qGG5pe25ZCM5q2l6K6+572u6auY5Lqu6YCJ5Lit6KGMXHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkVGFibGVSb3cgPSBkYXRhO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZFJvd3Muc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgfVxyXG4gICAgICAvLyDoi6XlvZPliY3pq5jkuq7ooYzkuLror6XooYzvvIzliJnlj5bmtojpq5jkuq5cclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkVGFibGVSb3cgJiZcclxuICAgICAgICB0aGlzLmlzU2FtZVJvdyh0aGlzLl9zZWxlY3RlZFRhYmxlUm93LCBkYXRhKVxyXG4gICAgICApIHtcclxuICAgICAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIOabtOaWsOWFqOmAieeKtuaAgVxyXG4gICAgdGhpcy51cGRhdGVDaGVja0FsbFN0YXR1cygpO1xyXG4gIH1cclxuXHJcbiAgLy8g5Yi35paw5YWo6YCJ54q25oCB77yI55So5LqO5YW25LuW5Zy65pmv77yJXHJcbiAgcmVmcmVzaENoZWNrQWxsU3RhdHVzKCk6IHZvaWQge1xyXG4gICAgdGhpcy51cGRhdGVDaGVja0FsbFN0YXR1cygpO1xyXG4gIH1cclxuXHJcbiAgLy8g6I635Y+W6KGM55qE5ZSv5LiA5qCH6K+G77yI55So5LqO6Leo6aG16YCJ5Lit77yJXHJcbiAgcHJpdmF0ZSBnZXRSb3dJZChkYXRhOiBhbnkpOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIGRhdGEuaWQgPz8gZGF0YS5rZXkgPz8gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgLy8g5Yik5pat5Lik6KGM5piv5ZCm5Li65ZCM5LiA6KGMXHJcbiAgcHJpdmF0ZSBpc1NhbWVSb3cocm93MTogYW55LCByb3cyOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGlkMSA9IHRoaXMuZ2V0Um93SWQocm93MSk7XHJcbiAgICBjb25zdCBpZDIgPSB0aGlzLmdldFJvd0lkKHJvdzIpO1xyXG5cclxuICAgIGlmIChpZDEgIT09IHVuZGVmaW5lZCAmJiBpZDIgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gaWQxID09PSBpZDI7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZmFsbGJhY2sg5YiwIEpTT04g5q+U6L6DXHJcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocm93MSkgPT09IEpTT04uc3RyaW5naWZ5KHJvdzIpO1xyXG4gIH1cclxuXHJcbiAgLy8g5riF56m66YCJ5Lit55qE6KGM77yI5pWw5o2u6amx5Yqo5qih5byP77yJXHJcbiAgY2xlYXJTZWxlY3RlZFJvd3MoKSB7XHJcbiAgICAvLyDmuIXnqbrlvZPliY3mlbDmja7mupDkuK3miYDmnInpobnnmoQgY2hlY2tlZCDnirbmgIFcclxuICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuZGF0YVNvdXJjZSkpIHtcclxuICAgICAgdGhpcy5kYXRhU291cmNlLmZvckVhY2goKHJvdykgPT4ge1xyXG4gICAgICAgIHJvdy5jaGVja2VkID0gZmFsc2U7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOa4heepuumAieS4rembhuWQiFxyXG4gICAgdGhpcy5fc2VsZWN0ZWRSb3dJZHMuY2xlYXIoKTtcclxuICAgIHRoaXMuX3NlbGVjdGVkUm93cyA9IFtdO1xyXG4gICAgdGhpcy5fY2hlY2tlZEFsbCA9IGZhbHNlO1xyXG4gICAgdGhpcy5faW5kZXRlcm1pbmF0ZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVGaWVsZENoZWNrQm94Q2hhbmdlKGNoZWNrQm94T3B0aW9uczogT3B0aW9uc1R5cGVbXSwga2V5OiBzdHJpbmcpIHtcclxuICAgIHRoaXMuc2V0RmllbGRzVmFsdWUoe1xyXG4gICAgICBba2V5XTogY2hlY2tCb3hPcHRpb25zXHJcbiAgICAgICAgLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5jaGVja2VkKVxyXG4gICAgICAgIC5tYXAoKGl0ZW0pID0+IGl0ZW0udmFsdWUpLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVTZWFyY2goKSB7XHJcbiAgICB0aGlzLl9zYXZlZFNlYXJjaFBhcmFtcyA9IHRoaXMuY2xlYXJFbXB0eVNlYXJjaFBhcmFtcygpO1xyXG4gICAgdGhpcy5fcGFnZUluZm8ucGFnZUluZGV4ID0gMTtcclxuICAgIHRoaXMuaGFuZGxlUXVlcnkoKTtcclxuICB9XHJcblxyXG4gIGhhbmRsZVJlc2V0Rm9ybSgpIHtcclxuICAgIE9iamVjdC5rZXlzKHRoaXMuX3NlYXJjaFBhcmFtcykuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgIGNvbnN0IHRhcmdldENvbHVtbiA9IHRoaXMuX3NlYXJjaEZpbGVkQ29sdW1ucy5maW5kKChpdGVtKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIChpdGVtLmZpZWxkUHJvcHM/Lm5hbWUgfHwgaXRlbS5wcm9wKSA9PT0ga2V5O1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIC8vIOWvueS6jmNoZWNrYm9457G75Z6L77yM6ZyA6KaB54m55q6K5aSE55CG6buY6K6k5YC8XHJcbiAgICAgIGlmICh0YXJnZXRDb2x1bW4/LnZhbHVlVHlwZSA9PT0gXCJjaGVja2JveFwiKSB7XHJcbiAgICAgICAgLy8g5LuO5Y6f5aeLY29sdW1uc+mFjee9ruS4reiOt+WPluWIneWni+mFjee9ru+8jOS7peehruS/neS9v+eUqOato+ehrueahOm7mOiupOWAvFxyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsQ29sdW1uID0gdGhpcy5jb2x1bW5zLmZpbmQoKGl0ZW0pID0+IHtcclxuICAgICAgICAgIHJldHVybiAoaXRlbS5maWVsZFByb3BzPy5uYW1lIHx8IGl0ZW0ucHJvcCkgPT09IGtleTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8g5LuO5Y6f5aeLb3B0aW9uc+S4reaJvuWHumNoZWNrZWTkuLp0cnVl55qE6aG55L2c5Li66buY6K6k5YC8XHJcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxGaWVsZFByb3BzID0gb3JpZ2luYWxDb2x1bW4/LmZpZWxkUHJvcHMgYXNcclxuICAgICAgICAgIHwgQ2hlY2tib3hGaWVsZFByb3BzXHJcbiAgICAgICAgICB8IHVuZGVmaW5lZDtcclxuICAgICAgICBjb25zdCBjaGVja2VkVmFsdWVzID0gKG9yaWdpbmFsRmllbGRQcm9wcz8ub3B0aW9ucyB8fCBbXSlcclxuICAgICAgICAgIC5maWx0ZXIoKG9wdDogT3B0aW9uc1R5cGUpID0+IG9wdC5jaGVja2VkKVxyXG4gICAgICAgICAgLm1hcCgob3B0OiBPcHRpb25zVHlwZSkgPT4gb3B0LnZhbHVlKTtcclxuICAgICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPVxyXG4gICAgICAgICAgY2hlY2tlZFZhbHVlcy5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgID8gY2hlY2tlZFZhbHVlc1xyXG4gICAgICAgICAgICA6IFBST19UQUJMRV9ERUZBVUxUX1BST1BTW3RhcmdldENvbHVtbi52YWx1ZVR5cGVdLnZhbHVlO1xyXG5cclxuICAgICAgICB0aGlzLl9zZWFyY2hQYXJhbXNba2V5XSA9IGRlZmF1bHRWYWx1ZTtcclxuXHJcbiAgICAgICAgLy8g5qC55o2u6buY6K6k5YC85oGi5aSNb3B0aW9uc+eahGNoZWNrZWTnirbmgIHvvIzkvb/nlKjljp/lp4tvcHRpb25z55qE57uT5p6EXHJcbiAgICAgICAgY29uc3QgZGVmYXVsdFZhbHVlcyA9IEFycmF5LmlzQXJyYXkoZGVmYXVsdFZhbHVlKSA/IGRlZmF1bHRWYWx1ZSA6IFtdO1xyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsT3B0aW9ucyA9IG9yaWdpbmFsRmllbGRQcm9wcz8ub3B0aW9ucyB8fCBbXTtcclxuICAgICAgICBjb25zdCB0YXJnZXRGaWVsZFByb3BzID0gdGFyZ2V0Q29sdW1uLmZpZWxkUHJvcHMgYXMgQ2hlY2tib3hGaWVsZFByb3BzO1xyXG4gICAgICAgIHRhcmdldEZpZWxkUHJvcHMub3B0aW9ucyA9IG9yaWdpbmFsT3B0aW9ucy5tYXAoKGl0ZW06IE9wdGlvbnNUeXBlKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAuLi5pdGVtLFxyXG4gICAgICAgICAgICBjaGVja2VkOiBkZWZhdWx0VmFsdWVzLmluY2x1ZGVzKGl0ZW0udmFsdWUpLFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLl9zZWFyY2hQYXJhbXNba2V5XSA9IHRhcmdldENvbHVtbj8uZmllbGRQcm9wc1xyXG4gICAgICAgICAgPyB0YXJnZXRDb2x1bW4/LmZpZWxkUHJvcHMudmFsdWUgfHxcclxuICAgICAgICAgICAgUFJPX1RBQkxFX0RFRkFVTFRfUFJPUFNbdGFyZ2V0Q29sdW1uLnZhbHVlVHlwZV0udmFsdWVcclxuICAgICAgICAgIDogUFJPX1RBQkxFX0RFRkFVTFRfUFJPUFNbdGFyZ2V0Q29sdW1uLnZhbHVlVHlwZV0udmFsdWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuX3NhdmVkU2VhcmNoUGFyYW1zID0ge307XHJcbiAgICB0aGlzLl9wYWdlSW5mby5wYWdlSW5kZXggPSAxO1xyXG4gICAgdGhpcy5vblJlc2V0Rm9ybUJlZm9yZVJlbG9hZC5lbWl0KCk7XHJcbiAgICB0aGlzLmhhbmRsZVF1ZXJ5KCk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVQYWdlSW5kZXhDaGFuZ2UocGFnZUluZGV4OiBudW1iZXIpIHtcclxuICAgIHRoaXMuX3BhZ2VJbmZvLnBhZ2VJbmRleCA9IHBhZ2VJbmRleDtcclxuICAgIHRoaXMuaGFuZGxlUXVlcnkoKTtcclxuICB9XHJcblxyXG4gIGhhbmRsZVBhZ2VTaXplQ2hhbmdlKHBhZ2VTaXplOiBhbnkpIHtcclxuICAgIHRoaXMuX3BhZ2VJbmZvLnBhZ2VTaXplID0gcGFnZVNpemU7XHJcbiAgICB0aGlzLl9wYWdlSW5mby5wYWdlSW5kZXggPSAxO1xyXG4gICAgdGhpcy5oYW5kbGVRdWVyeSgpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgaGFuZGxlUXVlcnkoYWZ0ZXJEZWxldGU/OiBib29sZWFuKSB7XHJcbiAgICAvLyDliKDpmaTlkI7liLfmlrDkuJTlvZPliY3pobXku4XliankuIDmnaHorrDlvZXml7bvvIzoi6XkuI3lnKjnrKzkuIDpobXliJnlhYjlm57pgIDkuIDpobVcclxuICAgIGlmIChcclxuICAgICAgYWZ0ZXJEZWxldGUgJiZcclxuICAgICAgQXJyYXkuaXNBcnJheSh0aGlzLmRhdGFTb3VyY2UpICYmXHJcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5sZW5ndGggPT09IDEgJiZcclxuICAgICAgdGhpcy5fcGFnZUluZm8ucGFnZUluZGV4ID4gMVxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuX3BhZ2VJbmZvLnBhZ2VJbmRleCA9IHRoaXMuX3BhZ2VJbmZvLnBhZ2VJbmRleCAtIDE7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g5L+d5a2Y5Yig6Zmk5YmN55qE5pWw5o2u5rqQ77yI55So5LqO5Yig6Zmk5ZCO5p+l6K+i5pe256e76Zmk6KKr5Yig6Zmk6aG555qE6YCJ5Lit54q25oCB77yJXHJcbiAgICBjb25zdCBwcmV2aW91c0RhdGFTb3VyY2UgPVxyXG4gICAgICBhZnRlckRlbGV0ZSAmJiB0aGlzLnNob3dDaGVja2JveCA/IFsuLi50aGlzLmRhdGFTb3VyY2VdIDogW107XHJcblxyXG4gICAgdGhpcy5fbG9hZGluZyA9IHRydWU7XHJcbiAgICBpZiAodGhpcy5yZXF1ZXN0KSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZXF1ZXN0KHtcclxuICAgICAgICAgIHBhcmFtczogdGhpcy5jbGVhckVtcHR5U2VhcmNoUGFyYW1zKCksXHJcbiAgICAgICAgICBwYWdlSW5mbzoge1xyXG4gICAgICAgICAgICBwYWdlSW5kZXg6IHRoaXMuX3BhZ2VJbmZvLnBhZ2VJbmRleCxcclxuICAgICAgICAgICAgcGFnZVNpemU6IHRoaXMuX3BhZ2VJbmZvLnBhZ2VTaXplLFxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIC8vIOWcqOe6v+aOkuW6j+aooeW8j++8muaKiuaOkuW6j+WvueixoeaPkOS6pOe7meaOpeWPo1xyXG4gICAgICAgICAgLi4uKHRoaXMuc29ydE1vZGUgPT09IFwic2VydmVyXCJcclxuICAgICAgICAgICAgPyB7IHNvcnQ6IHRoaXMuYnVpbGRTZXJ2ZXJTb3J0UGF5bG9hZCgpIH1cclxuICAgICAgICAgICAgOiB7fSksXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIOiHquWKqOazqOWFpSBjaGVja2VkIOWtl+aute+8jOaUr+aMgei3qOmhtemAieS4rVxyXG4gICAgICAgIGlmICh0aGlzLnNob3dDaGVja2JveCkge1xyXG4gICAgICAgICAgdGhpcy5kYXRhU291cmNlID0gKHJlc3VsdC5kYXRhIHx8IFtdKS5tYXAoKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaWQgPSB0aGlzLmdldFJvd0lkKGl0ZW0pO1xyXG4gICAgICAgICAgICAvLyDlpoLmnpzmlbDmja7lt7LmnIkgY2hlY2tlZCDlsZ7mgKfvvIzkv53nlZnvvJvlkKbliJnmoLnmja4gX3NlbGVjdGVkUm93SWRzIOWIpOaWrVxyXG4gICAgICAgICAgICBjb25zdCBjaGVja2VkID1cclxuICAgICAgICAgICAgICBpdGVtLmNoZWNrZWQgIT09IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgPyBpdGVtLmNoZWNrZWRcclxuICAgICAgICAgICAgICAgIDogaWQgIT09IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgPyB0aGlzLl9zZWxlY3RlZFJvd0lkcy5oYXMoaWQpXHJcbiAgICAgICAgICAgICAgICA6IGZhbHNlO1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgIC4uLml0ZW0sXHJcbiAgICAgICAgICAgICAgY2hlY2tlZDogY2hlY2tlZCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIC8vIOWIoOmZpOWQjuafpeivou+8muenu+mZpOiiq+WIoOmZpOmhueeahOmAieS4reeKtuaAgVxyXG4gICAgICAgICAgaWYgKGFmdGVyRGVsZXRlICYmIHByZXZpb3VzRGF0YVNvdXJjZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld0RhdGFJZHMgPSBuZXcgU2V0KFxyXG4gICAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZS5tYXAoKGl0ZW0pID0+IHRoaXMuZ2V0Um93SWQoaXRlbSkpXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICAvLyDpgY3ljobkuYvliY3nmoTmlbDmja7mupDvvIzlpoLmnpzkuI3lnKjmlrDmlbDmja7mupDkuK3vvIzor7TmmI7ooqvliKDpmaTkuobvvIzpnIDopoHmuIXpmaTlhbbpgInkuK3nirbmgIFcclxuICAgICAgICAgICAgcHJldmlvdXNEYXRhU291cmNlLmZvckVhY2goKG9sZEl0ZW0pID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCBvbGRJZCA9IHRoaXMuZ2V0Um93SWQob2xkSXRlbSk7XHJcbiAgICAgICAgICAgICAgaWYgKG9sZElkICE9PSB1bmRlZmluZWQgJiYgIW5ld0RhdGFJZHMuaGFzKG9sZElkKSkge1xyXG4gICAgICAgICAgICAgICAgLy8g6KKr5Yig6Zmk55qE6aG577yM5LuO6YCJ5Lit6ZuG5ZCI5Lit56e76ZmkXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZFJvd0lkcy5kZWxldGUob2xkSWQpO1xyXG4gICAgICAgICAgICAgICAgLy8g5aaC5p6c5pWw5o2u5a+56LGh6L+Y5Zyo5YW25LuW5Zyw5pa55byV55So77yM5riF6Zmk5YW26YCJ5Lit54q25oCBXHJcbiAgICAgICAgICAgICAgICBpZiAob2xkSXRlbS5jaGVja2VkICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgICAgb2xkSXRlbS5jaGVja2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5kYXRhU291cmNlID0gcmVzdWx0LmRhdGEgfHwgW107XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnN1bW1hcnlEYXRhID0gcmVzdWx0LnN1bW1hcnlEYXRhIHx8IG51bGw7XHJcbiAgICAgICAgLy8g5pys5Zyw5o6S5bqP5qih5byP77ya5ou/5Yiw5pWw5o2u5ZCO5Zyo5YmN56uv5o6S5bqPXHJcbiAgICAgICAgaWYgKHRoaXMuc29ydE1vZGUgPT09IFwibG9jYWxcIikge1xyXG4gICAgICAgICAgdGhpcy5zb3J0RGF0YVNvdXJjZUluUGxhY2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fcGFnZUluZm8udG90YWwgPSByZXN1bHQudG90YWwgfHwgMDtcclxuICAgICAgICAvLyDmm7TmlrDlhajpgInnirbmgIFcclxuICAgICAgICBpZiAodGhpcy5zaG93Q2hlY2tib3gpIHtcclxuICAgICAgICAgIHRoaXMudXBkYXRlQ2hlY2tBbGxTdGF0dXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihcIuafpeivouWksei0pTpcIiwgZXJyb3IpO1xyXG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IFtdO1xyXG4gICAgICAgIHRoaXMuX3BhZ2VJbmZvLnRvdGFsID0gMDtcclxuICAgICAgICB0aGlzLnN1bW1hcnlEYXRhID0gbnVsbDtcclxuICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICB0aGlzLl9sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcIuacquaPkOS+myBfcmVxdWVzdCDlm57osIPlh73mlbBcIik7XHJcbiAgICAgIHRoaXMuX2xvYWRpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIC8vIOS4jeWGjeiwg+eUqCBjbGVhclNlbGVjdGVkUm93cygp77yM5L+d55WZ6Leo6aG16YCJ5Lit54q25oCBXHJcbiAgfVxyXG5cclxuICAvLyDop6blj5HliJfmjpLluo/lj5jmm7RcclxuICBvblNvcnRDaGFuZ2Uoc29ydEtleTogc3RyaW5nLCBzb3J0T3JkZXI6IFwiYXNjZW5kXCIgfCBcImRlc2NlbmRcIiB8IG51bGwpIHtcclxuICAgIC8vIOWNleWIl+aOkuW6j++8mumHjee9ruWFtuWug+WIl++8m+WkmuWIl+aOkuW6j++8muS/neeVmeWFtuWug+WIl1xyXG4gICAgaWYgKCF0aGlzLm11bHRpcGxlU29ydCkge1xyXG4gICAgICBPYmplY3Qua2V5cyh0aGlzLl9zb3J0TWFwKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICBpZiAoa2V5ICE9PSBzb3J0S2V5KSB0aGlzLl9zb3J0TWFwW2tleV0gPSBudWxsO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHRoaXMuX3NvcnRNYXBbc29ydEtleV0gPSBzb3J0T3JkZXI7XHJcblxyXG4gICAgLy8g57u05oqk5LyY5YWI57qn6Zif5YiX77ya5pyJ5bqP5YiX5LiU6Z2e56m6IC0+IOe9ruS6juacq+Wwvu+8m+S4uuepuiAtPiDnp7vpmaRcclxuICAgIHRoaXMuX3NvcnRQcmlvcml0eSA9IHRoaXMuX3NvcnRQcmlvcml0eS5maWx0ZXIoKGspID0+IGsgIT09IHNvcnRLZXkpO1xyXG4gICAgaWYgKHNvcnRPcmRlcikge1xyXG4gICAgICB0aGlzLl9zb3J0UHJpb3JpdHkucHVzaChzb3J0S2V5KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zb3J0TW9kZSA9PT0gXCJsb2NhbFwiKSB7XHJcbiAgICAgIHRoaXMuc29ydERhdGFTb3VyY2VJblBsYWNlKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyDlnKjnur/mjpLluo/vvJrph43mlrDor7fmsYJcclxuICAgICAgdGhpcy5oYW5kbGVRdWVyeSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0U29ydE9yZGVyKHNvcnRLZXk6IHN0cmluZyk6IFwiYXNjZW5kXCIgfCBcImRlc2NlbmRcIiB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NvcnRNYXBbc29ydEtleV0gfHwgbnVsbDtcclxuICB9XHJcblxyXG4gIGhhbmRsZVRhYmxlUm93Q2xpY2soZGF0YTogYW55KSB7XHJcbiAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ID0gZGF0YTtcclxuICAgIC8vIOWmguaenOW8gOWQr+S6huWkjemAieahhu+8jOeCueWHu+ihjOaXtuWPqumAieS4reeCueWHu+ihjO+8iOWmguaenOihjOacquiiq+emgeeUqO+8iVxyXG4gICAgaWYgKHRoaXMuc2hvd0NoZWNrYm94ICYmICF0aGlzLmlzUm93RGlzYWJsZWQoZGF0YSkpIHtcclxuICAgICAgLy8g5YWI5riF56m65omA5pyJ6YCJ5Lit6KGMXHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkUm93cyA9IFtdO1xyXG4gICAgICAvLyDlj6rpgInkuK3lvZPliY3ngrnlh7vnmoTooYxcclxuICAgICAgdGhpcy50b2dnbGVSb3dDaGVja2VkKGRhdGEsIHRydWUpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5vblJvd0NsaWNrLmVtaXQodGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVUYWJsZVJvd0RiQ2xpY2soZGF0YTogYW55KSB7XHJcbiAgICB0aGlzLl9zZWxlY3RlZFRhYmxlUm93ID0gZGF0YTtcclxuICAgIHRoaXMub25Sb3dEYkNsaWNrLmVtaXQodGhpcy5fc2VsZWN0ZWRUYWJsZVJvdyk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVDb2x1bW5zU2V0dGluZ0NvbmZpcm0oKSB7XHJcbiAgICB0aGlzLnF1ZXJ5RHluYW1pY0NvbHVtbnMoKTtcclxuICB9XHJcblxyXG4gIC8vIOWkhOeQhiBhdXRvQ29tcGxldGUg6L6T5YWl5LqL5Lu277yI5bim6Ziy5oqW77yJXHJcbiAgaGFuZGxlQXV0b0NvbXBsZXRlSW5wdXQoZXZlbnQ6IEV2ZW50LCBjb2x1bW46IFByb1RhYmxlQ29sdW1uKSB7XHJcbiAgICBjb25zdCBmaWVsZEtleSA9IGNvbHVtbi5maWVsZFByb3BzPy5uYW1lIHx8IGNvbHVtbi5wcm9wO1xyXG5cclxuICAgIC8vIOWmguaenOivpeWtl+autei/mOayoeaciemYsuaKluWHveaVsO+8jOWIm+W7uuS4gOS4qlxyXG4gICAgaWYgKCF0aGlzLl9hdXRvQ29tcGxldGVEZWJvdW5jZU1hcC5oYXMoZmllbGRLZXkpKSB7XHJcbiAgICAgIGNvbnN0IGRlYm91bmNlZEZuID0gZGVib3VuY2UoKGV2dDogRXZlbnQpID0+IHtcclxuICAgICAgICAvLyDph43mlrDmn6Xmib7lr7nlupTnmoQgY29sdW1u77yM56Gu5L+d5L2/55So5pyA5paw55qE6YWN572uXHJcbiAgICAgICAgY29uc3QgY3VycmVudENvbHVtbiA9IHRoaXMuX3NlYXJjaEZpbGVkQ29sdW1ucy5maW5kKFxyXG4gICAgICAgICAgKGNvbCkgPT4gKGNvbC5maWVsZFByb3BzPy5uYW1lIHx8IGNvbC5wcm9wKSA9PT0gZmllbGRLZXlcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChjdXJyZW50Q29sdW1uKSB7XHJcbiAgICAgICAgICB0aGlzLmV4ZWN1dGVBdXRvQ29tcGxldGVEYXRhU291cmNlKGV2dCwgY3VycmVudENvbHVtbik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LCAzMDApOyAvLyAzMDBtcyDpmLLmipblu7bov59cclxuICAgICAgdGhpcy5fYXV0b0NvbXBsZXRlRGVib3VuY2VNYXAuc2V0KGZpZWxkS2V5LCBkZWJvdW5jZWRGbik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8g6LCD55So6Ziy5oqW5Ye95pWwXHJcbiAgICBjb25zdCBkZWJvdW5jZWRGbiA9IHRoaXMuX2F1dG9Db21wbGV0ZURlYm91bmNlTWFwLmdldChmaWVsZEtleSk7XHJcbiAgICBpZiAoZGVib3VuY2VkRm4pIHtcclxuICAgICAgZGVib3VuY2VkRm4oZXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g6I635Y+WIGF1dG9Db21wbGV0ZSDnmoTmlbDmja7mupBcclxuICBnZXRBdXRvQ29tcGxldGVEYXRhU291cmNlKGNvbHVtbjogUHJvVGFibGVDb2x1bW4pOiBhbnlbXSB7XHJcbiAgICBjb25zdCBmaWVsZEtleSA9IGNvbHVtbi5maWVsZFByb3BzPy5uYW1lIHx8IGNvbHVtbi5wcm9wO1xyXG4gICAgcmV0dXJuIHRoaXMuX2F1dG9Db21wbGV0ZURhdGFTb3VyY2VzW2ZpZWxkS2V5XSB8fCBbXTtcclxuICB9XHJcblxyXG4gIGdldEZpZWxkUHJvcHMoY29sdW1uOiBQcm9UYWJsZUNvbHVtbik6IGFueSB7XHJcbiAgICByZXR1cm4gY29sdW1uLmZpZWxkUHJvcHM7XHJcbiAgfVxyXG5cclxuICAvLyDojrflj5bmjIflrprlkI3np7DnmoRsYWJlbOaooeadv1xyXG4gIGdldExhYmVsVGVtcGxhdGUobmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogVGVtcGxhdGVSZWY8YW55PiB8IG51bGwge1xyXG4gICAgaWYgKCFuYW1lKSByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiB0aGlzLmN1c3RvbVRlbXBsYXRlcy5nZXQobmFtZSkgfHwgbnVsbDtcclxuICB9XHJcblxyXG4gIC8vIOiOt+WPliBmb3JtLWl0ZW0g55qE5Yqo5oCB57G75ZCNXHJcbiAgZ2V0Rm9ybUl0ZW1DbGFzc05hbWUoY29sdW1uOiBQcm9UYWJsZUNvbHVtbik6IHN0cmluZyB7XHJcbiAgICBjb25zdCBmaWVsZE5hbWUgPSB0aGlzLmdldEZpZWxkUHJvcHMoY29sdW1uKS5uYW1lIHx8IGNvbHVtbi5wcm9wO1xyXG4gICAgcmV0dXJuIGBwcm8tdGFibGUtJHtmaWVsZE5hbWV9LWZvcm0taXRlbWA7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|